@tuki-io/tuki-widgets 0.0.78 → 0.0.79

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 (319) hide show
  1. package/di2mt/api/api.endpoints.d.ts +31 -0
  2. package/di2mt/index.d.ts +5 -0
  3. package/di2mt/public-api.d.ts +13 -0
  4. package/di2mt/shared/components/card/card.component.d.ts +6 -0
  5. package/di2mt/shared/components/chart-card/chart-card.component.d.ts +22 -0
  6. package/di2mt/shared/components/stat-card/stat-card.component.d.ts +14 -0
  7. package/di2mt/shared/components/status-list-card/status-list-card.component.d.ts +7 -0
  8. package/di2mt/shared/components/summary-card/summary-card.component.d.ts +9 -0
  9. package/di2mt/shared/components/table-filters/table-filters.component.d.ts +14 -0
  10. package/di2mt/shared/constants/app.constants.d.ts +74 -0
  11. package/di2mt/shared/material.module.d.ts +15 -0
  12. package/di2mt/shared/services/api.service.d.ts +20 -0
  13. package/di2mt/shared/shared.module.d.ts +16 -0
  14. package/di2mt/shared/types/constants.d.ts +15 -0
  15. package/di2mt/shared/types/data-table.d.ts +5 -0
  16. package/di2mt/shared/types/table/filter.d.ts +16 -0
  17. package/di2mt/widgets/site-upgrade/progress-bar/progress-bar.component.d.ts +11 -0
  18. package/di2mt/widgets/site-upgrade/site-upgrade-data-table/site-upgrade-data-table.component.d.ts +69 -0
  19. package/di2mt/widgets/site-upgrade/site-upgrade.module.d.ts +15 -0
  20. package/di2mt/widgets/site-upgrade/site-upgrade.service.d.ts +84 -0
  21. package/di2mt/widgets/site-upgrade/types/user-upgrade.d.ts +26 -0
  22. package/di2mt/widgets/upgrade-overview/cards/already-upgraded-sites/already-upgraded-sites-card.component.d.ts +19 -0
  23. package/di2mt/widgets/upgrade-overview/cards/already-upgraded-users/already-upgraded-users-card.component.d.ts +19 -0
  24. package/di2mt/widgets/upgrade-overview/cards/preconditions-status-list/preconditions-status-list-card.component.d.ts +18 -0
  25. package/di2mt/widgets/upgrade-overview/cards/ready-to-upgrade-sites/ready-to-upgrade-sites-card.component.d.ts +19 -0
  26. package/di2mt/widgets/upgrade-overview/cards/ready-to-upgrade-users/ready-to-upgrade-users-card.component.d.ts +19 -0
  27. package/di2mt/widgets/upgrade-overview/cards/site-infrastructure-status-list/site-infrastructure-status-list-card.component.d.ts +15 -0
  28. package/di2mt/widgets/upgrade-overview/cards/upgrade-state-comparison-chart/upgrade-state-comparison-chart-card.component.d.ts +18 -0
  29. package/di2mt/widgets/upgrade-overview/types/upgrade-overview.d.ts +56 -0
  30. package/di2mt/widgets/upgrade-overview/upgrade-overview.module.d.ts +15 -0
  31. package/di2mt/widgets/upgrade-overview/upgrade-overview.service.d.ts +17 -0
  32. package/di2mt/widgets/user-upgrade/types/user-upgrade.d.ts +18 -0
  33. package/di2mt/widgets/user-upgrade/user-upgrade-data-table/user-upgrade-data-table.component.d.ts +75 -0
  34. package/di2mt/widgets/user-upgrade/user-upgrade.module.d.ts +16 -0
  35. package/di2mt/widgets/user-upgrade/user-upgrade.service.d.ts +33 -0
  36. package/esm2020/di2mt/api/api.endpoints.mjs +32 -0
  37. package/esm2020/di2mt/public-api.mjs +24 -0
  38. package/esm2020/di2mt/shared/components/card/card.component.mjs +13 -0
  39. package/esm2020/di2mt/shared/components/chart-card/chart-card.component.mjs +62 -0
  40. package/esm2020/di2mt/shared/components/stat-card/stat-card.component.mjs +47 -0
  41. package/esm2020/di2mt/shared/components/status-list-card/status-list-card.component.mjs +17 -0
  42. package/esm2020/di2mt/shared/components/summary-card/summary-card.component.mjs +36 -0
  43. package/esm2020/di2mt/shared/components/table-filters/table-filters.component.mjs +37 -0
  44. package/esm2020/di2mt/shared/constants/app.constants.mjs +95 -0
  45. package/esm2020/di2mt/shared/material.module.mjs +76 -0
  46. package/esm2020/di2mt/shared/services/api.service.mjs +86 -0
  47. package/esm2020/di2mt/shared/shared.module.mjs +61 -0
  48. package/esm2020/di2mt/shared/types/constants.mjs +20 -0
  49. package/esm2020/di2mt/shared/types/data-table.mjs +2 -0
  50. package/esm2020/di2mt/shared/types/table/filter.mjs +2 -0
  51. package/esm2020/di2mt/tuki-io-tuki-widgets-di2mt.mjs +5 -0
  52. package/esm2020/di2mt/widgets/site-upgrade/progress-bar/progress-bar.component.mjs +38 -0
  53. package/esm2020/di2mt/widgets/site-upgrade/site-upgrade-data-table/site-upgrade-data-table.component.mjs +418 -0
  54. package/esm2020/di2mt/widgets/site-upgrade/site-upgrade.module.mjs +53 -0
  55. package/esm2020/di2mt/widgets/site-upgrade/site-upgrade.service.mjs +92 -0
  56. package/esm2020/di2mt/widgets/site-upgrade/types/user-upgrade.mjs +3 -0
  57. package/esm2020/di2mt/widgets/upgrade-overview/cards/already-upgraded-sites/already-upgraded-sites-card.component.mjs +64 -0
  58. package/esm2020/di2mt/widgets/upgrade-overview/cards/already-upgraded-users/already-upgraded-users-card.component.mjs +64 -0
  59. package/esm2020/di2mt/widgets/upgrade-overview/cards/preconditions-status-list/preconditions-status-list-card.component.mjs +68 -0
  60. package/esm2020/di2mt/widgets/upgrade-overview/cards/ready-to-upgrade-sites/ready-to-upgrade-sites-card.component.mjs +45 -0
  61. package/esm2020/di2mt/widgets/upgrade-overview/cards/ready-to-upgrade-users/ready-to-upgrade-users-card.component.mjs +45 -0
  62. package/esm2020/di2mt/widgets/upgrade-overview/cards/site-infrastructure-status-list/site-infrastructure-status-list-card.component.mjs +64 -0
  63. package/esm2020/di2mt/widgets/upgrade-overview/cards/upgrade-state-comparison-chart/upgrade-state-comparison-chart-card.component.mjs +74 -0
  64. package/esm2020/di2mt/widgets/upgrade-overview/types/upgrade-overview.mjs +2 -0
  65. package/esm2020/di2mt/widgets/upgrade-overview/upgrade-overview.module.mjs +59 -0
  66. package/esm2020/di2mt/widgets/upgrade-overview/upgrade-overview.service.mjs +82 -0
  67. package/esm2020/di2mt/widgets/user-upgrade/types/user-upgrade.mjs +3 -0
  68. package/esm2020/di2mt/widgets/user-upgrade/user-upgrade-data-table/user-upgrade-data-table.component.mjs +303 -0
  69. package/esm2020/di2mt/widgets/user-upgrade/user-upgrade.module.mjs +59 -0
  70. package/esm2020/di2mt/widgets/user-upgrade/user-upgrade.service.mjs +62 -0
  71. package/esm2020/user-device-manage/public-api.mjs +9 -0
  72. package/esm2020/user-device-manage/src/app.constants.mjs +95 -0
  73. package/esm2020/user-device-manage/src/classes/device.mjs +85 -0
  74. package/esm2020/user-device-manage/src/classes/line-association-interface.mjs +2 -0
  75. package/esm2020/user-device-manage/src/classes/line-association.mjs +121 -0
  76. package/esm2020/user-device-manage/src/classes/line-call-info-display.mjs +10 -0
  77. package/esm2020/user-device-manage/src/classes/line-directory.mjs +27 -0
  78. package/esm2020/user-device-manage/src/classes/line.mjs +18 -0
  79. package/esm2020/user-device-manage/src/classes/notification.mjs +32 -0
  80. package/esm2020/user-device-manage/src/classes/recording-options.mjs +7 -0
  81. package/esm2020/user-device-manage/src/classes/simplified-user.mjs +111 -0
  82. package/esm2020/user-device-manage/src/classes/site-defaults.mjs +21 -0
  83. package/esm2020/user-device-manage/src/classes/translation-pattern.mjs +32 -0
  84. package/esm2020/user-device-manage/src/classes/types.mjs +24 -0
  85. package/esm2020/user-device-manage/src/common-functions.mjs +19 -0
  86. package/esm2020/user-device-manage/src/confirm-dialog/info-dialog.component.mjs +34 -0
  87. package/esm2020/user-device-manage/src/device-associated-line/associated-line-row/associated-line-row.component.mjs +31 -0
  88. package/esm2020/user-device-manage/src/device-associated-line/device-associated-line-details-box/device-associated-line-details-box.component.mjs +16 -0
  89. package/esm2020/user-device-manage/src/device-associated-line/device-associated-line-extension/device-associated-line-extension.component.mjs +64 -0
  90. package/esm2020/user-device-manage/src/device-associated-line/device-associated-line.component.mjs +179 -0
  91. package/esm2020/user-device-manage/src/device-list/device-list.component.mjs +24 -0
  92. package/esm2020/user-device-manage/src/device-manage-widget.component.mjs +335 -0
  93. package/esm2020/user-device-manage/src/environments/environment.mjs +11 -0
  94. package/esm2020/user-device-manage/src/interseptors/auth.interceptor.mjs +36 -0
  95. package/esm2020/user-device-manage/src/lazy-loading-select/lazy-loading-select.component.mjs +74 -0
  96. package/esm2020/user-device-manage/src/material.module.mjs +192 -0
  97. package/esm2020/user-device-manage/src/notifications/notification.component.mjs +35 -0
  98. package/esm2020/user-device-manage/src/services/api.service.mjs +79 -0
  99. package/esm2020/user-device-manage/src/services/device.service.mjs +83 -0
  100. package/esm2020/user-device-manage/src/services/dns.service.mjs +104 -0
  101. package/esm2020/user-device-manage/src/services/line.service.mjs +76 -0
  102. package/esm2020/user-device-manage/src/services/notification.service.mjs +62 -0
  103. package/esm2020/user-device-manage/src/services/removeKynFromIBM.service.mjs +25 -0
  104. package/esm2020/user-device-manage/src/services/site-settings.service.mjs +70 -0
  105. package/esm2020/user-device-manage/src/services/sorting-utils.service.mjs +197 -0
  106. package/esm2020/user-device-manage/src/services/user.service.mjs +243 -0
  107. package/esm2020/user-device-manage/src/services/utils.service.mjs +87 -0
  108. package/esm2020/user-device-manage/src/services/validation.service.mjs +760 -0
  109. package/esm2020/user-device-manage/src/user-device-manage.module.mjs +107 -0
  110. package/esm2020/user-device-manage/src/utils/app-loader/app-loader.mjs +14 -0
  111. package/esm2020/user-device-manage/tuki-io-tuki-widgets-user-device-manage.mjs +5 -0
  112. package/esm2020/user-manage/public-api.mjs +7 -0
  113. package/esm2020/user-manage/src/app.constants.mjs +50 -0
  114. package/esm2020/user-manage/src/classes/device.mjs +37 -0
  115. package/esm2020/user-manage/src/classes/line-association-interface.mjs +2 -0
  116. package/esm2020/user-manage/src/classes/line-association.mjs +110 -0
  117. package/esm2020/user-manage/src/classes/line-call-info-display.mjs +10 -0
  118. package/esm2020/user-manage/src/classes/line-directory.mjs +27 -0
  119. package/esm2020/user-manage/src/classes/line.mjs +18 -0
  120. package/esm2020/user-manage/src/classes/notification.mjs +32 -0
  121. package/esm2020/user-manage/src/classes/pagination.mjs +8 -0
  122. package/esm2020/user-manage/src/classes/recording-options.mjs +7 -0
  123. package/esm2020/user-manage/src/classes/simplified-user.mjs +109 -0
  124. package/esm2020/user-manage/src/classes/table-data.mjs +2 -0
  125. package/esm2020/user-manage/src/classes/translation-pattern.mjs +32 -0
  126. package/esm2020/user-manage/src/classes/user-list.mjs +10 -0
  127. package/esm2020/user-manage/src/common-functions.mjs +19 -0
  128. package/esm2020/user-manage/src/device-list/device-list.component.mjs +24 -0
  129. package/esm2020/user-manage/src/environments/environment.mjs +11 -0
  130. package/esm2020/user-manage/src/interseptors/auth.interceptor.mjs +36 -0
  131. package/esm2020/user-manage/src/lazy-loading-select/lazy-loading-select.component.mjs +74 -0
  132. package/esm2020/user-manage/src/material.module.mjs +188 -0
  133. package/esm2020/user-manage/src/notifications/notification.component.mjs +35 -0
  134. package/esm2020/user-manage/src/removeKynFromIBM.service.mjs +25 -0
  135. package/esm2020/user-manage/src/services/api.service.mjs +79 -0
  136. package/esm2020/user-manage/src/services/dns.service.mjs +110 -0
  137. package/esm2020/user-manage/src/services/line.service.mjs +34 -0
  138. package/esm2020/user-manage/src/services/notification.service.mjs +62 -0
  139. package/esm2020/user-manage/src/services/removeKynFromIBM.service.mjs +25 -0
  140. package/esm2020/user-manage/src/services/site-settings.service.mjs +36 -0
  141. package/esm2020/user-manage/src/services/sorting-utils.service.mjs +197 -0
  142. package/esm2020/user-manage/src/services/user.service.mjs +207 -0
  143. package/esm2020/user-manage/src/services/users-search.service.mjs +50 -0
  144. package/esm2020/user-manage/src/services/utils.service.mjs +73 -0
  145. package/esm2020/user-manage/src/user-calling/user-calling-extension/user-calling-extension.component.mjs +65 -0
  146. package/esm2020/user-manage/src/user-calling/user-calling.component.mjs +78 -0
  147. package/esm2020/user-manage/src/user-info/user-info.component.mjs +20 -0
  148. package/esm2020/user-manage/src/user-manage-widget.component.mjs +208 -0
  149. package/esm2020/user-manage/src/user-manage.module.mjs +99 -0
  150. package/esm2020/user-manage/src/utils/app-loader/app-loader.mjs +14 -0
  151. package/esm2020/user-manage/src/utils/pagination/pagination.component.mjs +43 -0
  152. package/esm2020/user-manage/tuki-io-tuki-widgets-user-manage.mjs +5 -0
  153. package/esm2020/users-list/public-api.mjs +9 -0
  154. package/esm2020/users-list/src/app.constants.mjs +54 -0
  155. package/esm2020/users-list/src/classes/app-location.mjs +32 -0
  156. package/esm2020/users-list/src/classes/device.mjs +7 -0
  157. package/esm2020/users-list/src/classes/line.mjs +18 -0
  158. package/esm2020/users-list/src/classes/move-user.mjs +178 -0
  159. package/esm2020/users-list/src/classes/notification.mjs +31 -0
  160. package/esm2020/users-list/src/classes/pagination.mjs +8 -0
  161. package/esm2020/users-list/src/classes/simlified-user.mjs +50 -0
  162. package/esm2020/users-list/src/classes/table-data.mjs +2 -0
  163. package/esm2020/users-list/src/classes/user-list.mjs +14 -0
  164. package/esm2020/users-list/src/material.module.mjs +209 -0
  165. package/esm2020/users-list/src/move-user-wizard/move-user-stepper/device-move-user/device-move-user-wizard.component.mjs +38 -0
  166. package/esm2020/users-list/src/move-user-wizard/move-user-stepper/device-move-user-tab/devices-move-user-wizard-tab.component.mjs +23 -0
  167. package/esm2020/users-list/src/move-user-wizard/move-user-stepper/move-user-stepper.component.mjs +189 -0
  168. package/esm2020/users-list/src/move-user-wizard/move-user-wizard.component.mjs +38 -0
  169. package/esm2020/users-list/src/services/api-webex.service.mjs +18 -0
  170. package/esm2020/users-list/src/services/api.service.mjs +78 -0
  171. package/esm2020/users-list/src/services/dns.service.mjs +120 -0
  172. package/esm2020/users-list/src/services/events-communication.service.mjs +14 -0
  173. package/esm2020/users-list/src/services/move-user.service.mjs +53 -0
  174. package/esm2020/users-list/src/services/notification.service.mjs +62 -0
  175. package/esm2020/users-list/src/services/removeKynFromIBM.service.mjs +25 -0
  176. package/esm2020/users-list/src/services/site-settings.service.mjs +27 -0
  177. package/esm2020/users-list/src/services/user.service.mjs +142 -0
  178. package/esm2020/users-list/src/services/users-search.service.mjs +124 -0
  179. package/esm2020/users-list/src/user-list-confirm-dialog/user-list-confirm-dialog.component.mjs +34 -0
  180. package/esm2020/users-list/src/users-list.component.mjs +287 -0
  181. package/esm2020/users-list/src/users-list.module.mjs +92 -0
  182. package/esm2020/users-list/src/utils/app-loader/app-loader.mjs +14 -0
  183. package/esm2020/users-list/src/utils/common-functions.mjs +32 -0
  184. package/esm2020/users-list/src/utils/pagination/pagination.component.mjs +43 -0
  185. package/esm2020/users-list/src/utils/utils.service.mjs +73 -0
  186. package/esm2020/users-list/tuki-io-tuki-widgets-users-list.mjs +5 -0
  187. package/fesm2015/tuki-io-tuki-widgets-di2mt.mjs +2044 -0
  188. package/fesm2015/tuki-io-tuki-widgets-di2mt.mjs.map +1 -0
  189. package/fesm2015/tuki-io-tuki-widgets-user-device-manage.mjs +3402 -0
  190. package/fesm2015/tuki-io-tuki-widgets-user-device-manage.mjs.map +1 -0
  191. package/fesm2015/tuki-io-tuki-widgets-user-manage.mjs +2124 -0
  192. package/fesm2015/tuki-io-tuki-widgets-user-manage.mjs.map +1 -0
  193. package/fesm2015/tuki-io-tuki-widgets-users-list.mjs +1996 -0
  194. package/fesm2015/tuki-io-tuki-widgets-users-list.mjs.map +1 -0
  195. package/fesm2020/tuki-io-tuki-widgets-di2mt.mjs +2030 -0
  196. package/fesm2020/tuki-io-tuki-widgets-di2mt.mjs.map +1 -0
  197. package/fesm2020/tuki-io-tuki-widgets-user-device-manage.mjs +3364 -0
  198. package/fesm2020/tuki-io-tuki-widgets-user-device-manage.mjs.map +1 -0
  199. package/fesm2020/tuki-io-tuki-widgets-user-manage.mjs +2107 -0
  200. package/fesm2020/tuki-io-tuki-widgets-user-manage.mjs.map +1 -0
  201. package/fesm2020/tuki-io-tuki-widgets-users-list.mjs +1975 -0
  202. package/fesm2020/tuki-io-tuki-widgets-users-list.mjs.map +1 -0
  203. package/package.json +1 -1
  204. package/user-device-manage/index.d.ts +5 -0
  205. package/user-device-manage/public-api.d.ts +8 -0
  206. package/user-device-manage/src/app.constants.d.ts +74 -0
  207. package/user-device-manage/src/classes/device.d.ts +233 -0
  208. package/user-device-manage/src/classes/line-association-interface.d.ts +45 -0
  209. package/user-device-manage/src/classes/line-association.d.ts +62 -0
  210. package/user-device-manage/src/classes/line-call-info-display.d.ts +11 -0
  211. package/user-device-manage/src/classes/line-directory.d.ts +15 -0
  212. package/user-device-manage/src/classes/line.d.ts +140 -0
  213. package/user-device-manage/src/classes/notification.d.ts +18 -0
  214. package/user-device-manage/src/classes/recording-options.d.ts +5 -0
  215. package/user-device-manage/src/classes/simplified-user.d.ts +52 -0
  216. package/user-device-manage/src/classes/site-defaults.d.ts +146 -0
  217. package/user-device-manage/src/classes/translation-pattern.d.ts +19 -0
  218. package/user-device-manage/src/classes/types.d.ts +19 -0
  219. package/user-device-manage/src/common-functions.d.ts +1 -0
  220. package/user-device-manage/src/confirm-dialog/info-dialog.component.d.ts +20 -0
  221. package/user-device-manage/src/device-associated-line/associated-line-row/associated-line-row.component.d.ts +15 -0
  222. package/user-device-manage/src/device-associated-line/device-associated-line-details-box/device-associated-line-details-box.component.d.ts +7 -0
  223. package/user-device-manage/src/device-associated-line/device-associated-line-extension/device-associated-line-extension.component.d.ts +24 -0
  224. package/user-device-manage/src/device-associated-line/device-associated-line.component.d.ts +89 -0
  225. package/user-device-manage/src/device-list/device-list.component.d.ts +11 -0
  226. package/user-device-manage/src/device-manage-widget.component.d.ts +71 -0
  227. package/user-device-manage/src/environments/environment.d.ts +9 -0
  228. package/user-device-manage/src/interseptors/auth.interceptor.d.ts +9 -0
  229. package/user-device-manage/src/lazy-loading-select/lazy-loading-select.component.d.ts +35 -0
  230. package/user-device-manage/src/material.module.d.ts +29 -0
  231. package/user-device-manage/src/notifications/notification.component.d.ts +19 -0
  232. package/user-device-manage/src/services/api.service.d.ts +20 -0
  233. package/user-device-manage/src/services/device.service.d.ts +21 -0
  234. package/user-device-manage/src/services/dns.service.d.ts +14 -0
  235. package/user-device-manage/src/services/line.service.d.ts +33 -0
  236. package/user-device-manage/src/services/notification.service.d.ts +18 -0
  237. package/user-device-manage/src/services/removeKynFromIBM.service.d.ts +8 -0
  238. package/user-device-manage/src/services/site-settings.service.d.ts +25 -0
  239. package/user-device-manage/src/services/sorting-utils.service.d.ts +26 -0
  240. package/user-device-manage/src/services/user.service.d.ts +51 -0
  241. package/user-device-manage/src/services/utils.service.d.ts +10 -0
  242. package/user-device-manage/src/services/validation.service.d.ts +165 -0
  243. package/user-device-manage/src/user-device-manage.module.d.ts +22 -0
  244. package/user-device-manage/src/utils/app-loader/app-loader.d.ts +6 -0
  245. package/user-manage/index.d.ts +5 -0
  246. package/user-manage/public-api.d.ts +6 -0
  247. package/user-manage/src/app.constants.d.ts +29 -0
  248. package/user-manage/src/classes/device.d.ts +203 -0
  249. package/user-manage/src/classes/line-association-interface.d.ts +40 -0
  250. package/user-manage/src/classes/line-association.d.ts +55 -0
  251. package/user-manage/src/classes/line-call-info-display.d.ts +11 -0
  252. package/user-manage/src/classes/line-directory.d.ts +16 -0
  253. package/user-manage/src/classes/line.d.ts +140 -0
  254. package/user-manage/src/classes/notification.d.ts +18 -0
  255. package/user-manage/src/classes/pagination.d.ts +13 -0
  256. package/user-manage/src/classes/recording-options.d.ts +5 -0
  257. package/user-manage/src/classes/simplified-user.d.ts +50 -0
  258. package/user-manage/src/classes/table-data.d.ts +5 -0
  259. package/user-manage/src/classes/translation-pattern.d.ts +18 -0
  260. package/user-manage/src/classes/user-list.d.ts +34 -0
  261. package/user-manage/src/common-functions.d.ts +1 -0
  262. package/user-manage/src/device-list/device-list.component.d.ts +11 -0
  263. package/user-manage/src/environments/environment.d.ts +9 -0
  264. package/user-manage/src/interseptors/auth.interceptor.d.ts +9 -0
  265. package/user-manage/src/lazy-loading-select/lazy-loading-select.component.d.ts +35 -0
  266. package/user-manage/src/material.module.d.ts +28 -0
  267. package/user-manage/src/notifications/notification.component.d.ts +19 -0
  268. package/user-manage/src/removeKynFromIBM.service.d.ts +8 -0
  269. package/user-manage/src/services/api.service.d.ts +21 -0
  270. package/user-manage/src/services/dns.service.d.ts +14 -0
  271. package/user-manage/src/services/line.service.d.ts +17 -0
  272. package/user-manage/src/services/notification.service.d.ts +18 -0
  273. package/user-manage/src/services/removeKynFromIBM.service.d.ts +8 -0
  274. package/user-manage/src/services/site-settings.service.d.ts +9 -0
  275. package/user-manage/src/services/sorting-utils.service.d.ts +26 -0
  276. package/user-manage/src/services/user.service.d.ts +43 -0
  277. package/user-manage/src/services/users-search.service.d.ts +25 -0
  278. package/user-manage/src/services/utils.service.d.ts +9 -0
  279. package/user-manage/src/user-calling/user-calling-extension/user-calling-extension.component.d.ts +24 -0
  280. package/user-manage/src/user-calling/user-calling.component.d.ts +30 -0
  281. package/user-manage/src/user-info/user-info.component.d.ts +9 -0
  282. package/user-manage/src/user-manage-widget.component.d.ts +44 -0
  283. package/user-manage/src/user-manage.module.d.ts +21 -0
  284. package/user-manage/src/utils/app-loader/app-loader.d.ts +6 -0
  285. package/user-manage/src/utils/pagination/pagination.component.d.ts +18 -0
  286. package/users-list/index.d.ts +5 -0
  287. package/users-list/public-api.d.ts +8 -0
  288. package/users-list/src/app.constants.d.ts +36 -0
  289. package/users-list/src/classes/app-location.d.ts +17 -0
  290. package/users-list/src/classes/device.d.ts +224 -0
  291. package/users-list/src/classes/line.d.ts +140 -0
  292. package/users-list/src/classes/move-user.d.ts +85 -0
  293. package/users-list/src/classes/notification.d.ts +18 -0
  294. package/users-list/src/classes/pagination.d.ts +13 -0
  295. package/users-list/src/classes/simlified-user.d.ts +25 -0
  296. package/users-list/src/classes/table-data.d.ts +5 -0
  297. package/users-list/src/classes/user-list.d.ts +36 -0
  298. package/users-list/src/material.module.d.ts +31 -0
  299. package/users-list/src/move-user-wizard/move-user-stepper/device-move-user/device-move-user-wizard.component.d.ts +21 -0
  300. package/users-list/src/move-user-wizard/move-user-stepper/device-move-user-tab/devices-move-user-wizard-tab.component.d.ts +12 -0
  301. package/users-list/src/move-user-wizard/move-user-stepper/move-user-stepper.component.d.ts +55 -0
  302. package/users-list/src/move-user-wizard/move-user-wizard.component.d.ts +17 -0
  303. package/users-list/src/services/api-webex.service.d.ts +8 -0
  304. package/users-list/src/services/api.service.d.ts +21 -0
  305. package/users-list/src/services/dns.service.d.ts +18 -0
  306. package/users-list/src/services/events-communication.service.d.ts +8 -0
  307. package/users-list/src/services/move-user.service.d.ts +17 -0
  308. package/users-list/src/services/notification.service.d.ts +18 -0
  309. package/users-list/src/services/removeKynFromIBM.service.d.ts +8 -0
  310. package/users-list/src/services/site-settings.service.d.ts +11 -0
  311. package/users-list/src/services/user.service.d.ts +35 -0
  312. package/users-list/src/services/users-search.service.d.ts +34 -0
  313. package/users-list/src/user-list-confirm-dialog/user-list-confirm-dialog.component.d.ts +20 -0
  314. package/users-list/src/users-list.component.d.ts +60 -0
  315. package/users-list/src/users-list.module.d.ts +18 -0
  316. package/users-list/src/utils/app-loader/app-loader.d.ts +6 -0
  317. package/users-list/src/utils/common-functions.d.ts +2 -0
  318. package/users-list/src/utils/pagination/pagination.component.d.ts +18 -0
  319. package/users-list/src/utils/utils.service.d.ts +9 -0
@@ -0,0 +1,303 @@
1
+ import { SelectionModel } from "@angular/cdk/collections";
2
+ import { Component, inject, Input } from "@angular/core";
3
+ import { MatTableDataSource } from "@angular/material/table";
4
+ import { Subject, Subscription } from "rxjs";
5
+ import { takeUntil } from "rxjs";
6
+ import { UserUpgradeService } from "../user-upgrade.service";
7
+ import { DEPENDENCIES_STATUS, STATUS_ENTRIES } from "../../../shared/types/constants";
8
+ import { APIService } from "../../../shared/services/api.service";
9
+ import { PAGINATION_SIZE_OPTIONS } from "../../../shared/constants/app.constants";
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "@angular/common";
12
+ import * as i2 from "../../../shared/components/summary-card/summary-card.component";
13
+ import * as i3 from "../../../shared/components/table-filters/table-filters.component";
14
+ import * as i4 from "@angular/material/table";
15
+ import * as i5 from "@angular/material/button";
16
+ import * as i6 from "@angular/material/checkbox";
17
+ import * as i7 from "@angular/material/progress-spinner";
18
+ import * as i8 from "@angular/material/paginator";
19
+ export class UserUpgradeDataTableComponent {
20
+ constructor() {
21
+ this.destroy$ = new Subject();
22
+ this.userUpgradeService = inject(UserUpgradeService);
23
+ this.apiService = inject(APIService);
24
+ this.STATUS_ENTRIES = STATUS_ENTRIES;
25
+ this.DEPENDENCIES_STATUS = DEPENDENCIES_STATUS;
26
+ this.dataPending = false;
27
+ this.displayedColumns = ['select', 'user', 'site', 'device', 'dialPlanStatus', 'dependencies', 'userUpgradeStatus', 'userUpgradeLoader'];
28
+ this.selection = new SelectionModel(true, []);
29
+ this.filters = [];
30
+ this.pagination = new PaginationDataDto();
31
+ this.users = [];
32
+ this.subscriptions = new Subscription();
33
+ this.statusCounts = {};
34
+ this.activeFilters = {};
35
+ this.pageSizeOptions = PAGINATION_SIZE_OPTIONS;
36
+ }
37
+ ngOnInit() {
38
+ this.dataPending = true;
39
+ this.apiService.token = this.token;
40
+ this.userUpgradeService.customerId = this.customerId;
41
+ const subsc1 = this.userUpgradeService.getUserUpgradeRecords(this.pagination.pageSize, this.pagination.pageIndex)
42
+ .pipe(takeUntil(this.destroy$))
43
+ .subscribe((results) => {
44
+ const records = results.content;
45
+ this.data = new MatTableDataSource(records);
46
+ this.pagination.total = results.totalElements;
47
+ this.dataPending = false;
48
+ this.setupCustomFilter();
49
+ this.initializeFilters(records);
50
+ });
51
+ this.subscriptions.add(subsc1);
52
+ const subsc2 = this.userUpgradeService.getUserUpgradeStatusCounts()
53
+ .pipe(takeUntil(this.destroy$))
54
+ .subscribe((statusCounts) => {
55
+ this.statusCounts['Ready'] = statusCounts['READY'] || 0;
56
+ this.statusCounts['Not Ready'] = statusCounts['NOT_READY'] || 0;
57
+ this.statusCounts['Completed'] = statusCounts['COMPLETED'] || 0;
58
+ this.statusCounts['Failed'] = statusCounts['FAILED'] || 0;
59
+ });
60
+ this.subscriptions.add(subsc2);
61
+ }
62
+ ngOnDestroy() {
63
+ this.destroy$.next();
64
+ this.destroy$.complete();
65
+ this.dataPending = false;
66
+ if (this.subscriptions) {
67
+ this.subscriptions.unsubscribe();
68
+ }
69
+ }
70
+ onMultipleDevices(user) {
71
+ user.showDevices = !user.showDevices;
72
+ }
73
+ pageEvent(event) {
74
+ this.pagination.pageIndex = event.pageIndex;
75
+ this.pagination.pageSize = event.pageSize;
76
+ this.getData();
77
+ }
78
+ changePerPageNumber(pageSizeEvent) {
79
+ this.pagination.pageSize = pageSizeEvent.value;
80
+ this.pagination.pageIndex = 0;
81
+ this.getData();
82
+ }
83
+ getData() {
84
+ this.dataPending = true;
85
+ const subsc1 = this.userUpgradeService.getUserUpgradeRecords(this.pagination.pageSize, this.pagination.pageIndex)
86
+ .pipe(takeUntil(this.destroy$))
87
+ .subscribe((result) => {
88
+ this.data = new MatTableDataSource(result.content);
89
+ this.pagination.total = result.totalElements;
90
+ this.dataPending = false;
91
+ });
92
+ this.subscriptions.add(subsc1);
93
+ }
94
+ initializeFilters(records) {
95
+ if (records?.length) {
96
+ // Extract unique sites from actual data
97
+ const uniqueSites = [...new Set(records.map(record => record.siteName))];
98
+ const siteOptions = uniqueSites.map(site => ({
99
+ label: site,
100
+ value: site.toLowerCase().replace(/\s+/g, '-')
101
+ }));
102
+ // Extract unique statuses from actual data
103
+ const uniqueStatuses = [...new Set(records.map(record => record.upgradeStatus))];
104
+ const statusOptions = uniqueStatuses.map(status => ({
105
+ label: STATUS_ENTRIES[status],
106
+ value: status.toLowerCase().replace(/\s+/g, '-')
107
+ }));
108
+ this.filters = [
109
+ {
110
+ id: 'userName',
111
+ type: 'search',
112
+ columnKey: 'User',
113
+ placeholder: 'Search users...',
114
+ options: []
115
+ },
116
+ {
117
+ id: 'sites',
118
+ type: 'select',
119
+ columnKey: 'Site',
120
+ placeholder: 'Sites',
121
+ options: siteOptions
122
+ },
123
+ {
124
+ id: 'status',
125
+ type: 'select',
126
+ columnKey: 'User Upgrade Status',
127
+ placeholder: 'Upgrade Status',
128
+ options: statusOptions
129
+ }
130
+ ];
131
+ }
132
+ }
133
+ /** Whether the number of selected elements matches the total number of rows. */
134
+ isAllSelected() {
135
+ const numSelected = this.selection.selected.length;
136
+ const numRows = this.data?.data.length ?? 0;
137
+ return numSelected === numRows;
138
+ }
139
+ /** Selects all rows if they are not all selected; otherwise clear selection. */
140
+ masterToggle() {
141
+ // this.isAllSelected() ?
142
+ // this.selection.clear() :
143
+ // this.data?.data.forEach(row => this.selection.select(row));
144
+ if (this.isAllSelected()) {
145
+ this.selection.clear();
146
+ }
147
+ else {
148
+ this.data?.data.forEach(row => {
149
+ if (row.upgradeStatus === 'READY') {
150
+ this.selection.select(row);
151
+ }
152
+ });
153
+ }
154
+ }
155
+ upgradeUser(user) {
156
+ if (user?.upgradeStatus === 'READY')
157
+ user.pending = true;
158
+ this.userUpgradeService.collectUsers([user])
159
+ .pipe(takeUntil(this.destroy$))
160
+ .subscribe(() => {
161
+ this.userUpgradeService.bulkUpgrade([user])
162
+ .pipe(takeUntil(this.destroy$))
163
+ .subscribe(() => {
164
+ this.updateUsersStatusAfterUpgrade([user]);
165
+ });
166
+ });
167
+ }
168
+ updateUsersStatusAfterUpgrade(users) {
169
+ this.userUpgradeService.getUsersUpgradeStatuses(users)
170
+ .pipe(takeUntil(this.destroy$))
171
+ .subscribe((upgradedStatuses) => {
172
+ upgradedStatuses.forEach(statusItem => {
173
+ const ind = this.getUserIndex(statusItem.userId);
174
+ if (ind > -1) {
175
+ this.data.data[ind].upgradeStatus = statusItem.upgradeStatus;
176
+ this.data.data[ind].pending = false;
177
+ }
178
+ });
179
+ this.dataPending = false;
180
+ });
181
+ }
182
+ getUserIndex(userId) {
183
+ return this.data.data.findIndex((record) => record.userId === userId);
184
+ }
185
+ upgradeSelectedUsers() {
186
+ if (this.selection.selected && this.selection.selected.length) {
187
+ this.dataPending = true;
188
+ this.userUpgradeService.collectUsers(this.selection.selected)
189
+ .pipe(takeUntil(this.destroy$))
190
+ .subscribe(() => {
191
+ this.userUpgradeService.bulkUpgrade(this.selection.selected)
192
+ .pipe(takeUntil(this.destroy$))
193
+ .subscribe(() => {
194
+ this.updateUsersStatusAfterUpgrade(this.selection.selected);
195
+ });
196
+ });
197
+ }
198
+ this.userUpgradeService.bulkUpgrade(this.selection.selected);
199
+ }
200
+ onFilter(filterEvent) {
201
+ const { key, value } = filterEvent;
202
+ let filterValue;
203
+ if (value && value.value !== undefined) {
204
+ filterValue = value.value;
205
+ }
206
+ else if (value && value.target) {
207
+ filterValue = value.target.value;
208
+ }
209
+ else {
210
+ filterValue = value;
211
+ }
212
+ // Handle "All" option or empty values - remove the filter
213
+ if (filterValue === 'all' || !filterValue || filterValue === '') {
214
+ delete this.activeFilters[key];
215
+ }
216
+ else {
217
+ this.activeFilters[key] = filterValue;
218
+ }
219
+ this.applyFilters();
220
+ }
221
+ setupCustomFilter() {
222
+ this.data.filterPredicate = (data, filter) => {
223
+ const filters = JSON.parse(filter || '{}');
224
+ for (const [key, value] of Object.entries(filters)) {
225
+ if (!value)
226
+ continue;
227
+ switch (key) {
228
+ case 'User':
229
+ const searchTerm = value.toLowerCase();
230
+ if (!data.userName.toLowerCase().includes(searchTerm)) {
231
+ return false;
232
+ }
233
+ break;
234
+ case 'Site':
235
+ if (data.siteName !== this.getSiteNameFromValue(value)) {
236
+ return false;
237
+ }
238
+ break;
239
+ case 'User Upgrade Status':
240
+ if (!this.matchesUpgradeStatus(data.upgradeStatus, value)) {
241
+ return false;
242
+ }
243
+ break;
244
+ }
245
+ }
246
+ return true;
247
+ };
248
+ }
249
+ applyFilters() {
250
+ this.data.filter = JSON.stringify(this.activeFilters);
251
+ }
252
+ get filteredDataCount() {
253
+ return this.data?.filteredData?.length || 0;
254
+ }
255
+ getSiteNameFromValue(value) {
256
+ // Since we're now using actual site names, just convert back from slug format
257
+ return value.split('-').map(word => word.charAt(0).toUpperCase() + word.slice(1)).join(' ');
258
+ }
259
+ matchesUpgradeStatus(status, filterValue) {
260
+ // Handle direct status matching for cleaner implementation
261
+ return status.toLowerCase().replace(/\s+/g, '-') === filterValue.toLowerCase();
262
+ }
263
+ getStatusClass(status) {
264
+ switch (status.toLowerCase()) {
265
+ case 'ready':
266
+ return 'ready';
267
+ case 'not ready':
268
+ return 'not-ready';
269
+ case 'partial ready':
270
+ return 'partial-ready';
271
+ case 'completed':
272
+ return 'completed';
273
+ case 'failed':
274
+ return 'failed';
275
+ default:
276
+ return 'not-ready';
277
+ }
278
+ }
279
+ }
280
+ UserUpgradeDataTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UserUpgradeDataTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
281
+ UserUpgradeDataTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: UserUpgradeDataTableComponent, selector: "tk-user-upgrade-data-table", inputs: { token: "token", customerId: "customerId" }, ngImport: i0, template: "<div *ngIf=\"dataPending\" class=\"overlay\">\r\n <mat-progress-spinner\r\n class=\"page-spinner\"\r\n mode=\"indeterminate\"\r\n [diameter]=\"120\"></mat-progress-spinner>\r\n</div>\r\n\r\n<div id=\"userUpgradeDataTable\" class=\"wrapper\">\r\n <div class=\"user-upgrade-status-wrapper\">\r\n <tk-summary-card [description]=\"'Users are ready to upgrade'\" [value]=\"statusCounts['Ready']\"></tk-summary-card>\r\n <tk-summary-card [description]=\"'Users are not ready'\" [value]=\"statusCounts['Not Ready']\" [status]=\"'Not Ready'\"></tk-summary-card>\r\n <tk-summary-card [description]=\"'Users failed to upgrade'\" [value]=\"statusCounts['Failed']\" [status]=\"'Failed'\"></tk-summary-card>\r\n <tk-summary-card [description]=\"'Successfully upgraded'\" [value]=\"statusCounts['Completed']\" [status]=\"'Completed'\"></tk-summary-card>\r\n </div>\r\n <div class=\"table-action-panel\">\r\n <tk-table-filters *ngIf=\"filters.length > 0\" [filters]=\"filters\" (filter)=\"onFilter($event)\"></tk-table-filters>\r\n <div class=\"action-wrapper\">\r\n <span>{{filteredDataCount}} Users</span>\r\n <button\r\n mat-button\r\n class=\"upgrade-bulk-button\"\r\n color=\"primary\"\r\n [disabled]=\"selection.selected.length === 0\"\r\n (click)=\"upgradeSelectedUsers()\">\r\n Upgrade {{ selection.selected.length === 0 ? '' : '(' + selection.selected.length + ')' }}\r\n </button>\r\n </div>\r\n </div>\r\n <table mat-table [dataSource]=\"data\" class=\"user-upgrade-table\">\r\n\r\n <!-- Checkbox Column -->\r\n <ng-container matColumnDef=\"select\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n <mat-checkbox\r\n (change)=\"$event ? masterToggle() : null\"\r\n [checked]=\"selection.hasValue() && isAllSelected()\"\r\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\"\r\n class=\"custom-checkbox\">\r\n </mat-checkbox>\r\n </th>\r\n <td mat-cell *matCellDef=\"let row\">\r\n <mat-checkbox\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? selection.toggle(row) : null\"\r\n [checked]=\"selection.isSelected(row)\"\r\n [disabled]=\"STATUS_ENTRIES[row.upgradeStatus] !== 'Ready' || row.pending\"\r\n class=\"custom-checkbox\">\r\n </mat-checkbox>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- User Column -->\r\n <ng-container matColumnDef=\"user\">\r\n <th mat-header-cell *matHeaderCellDef>User</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <div class=\"user-info\">\r\n <div class=\"user-name\">{{element.userName}}</div>\r\n <div class=\"user-email\">{{element.userName}}</div>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Site Column -->\r\n <ng-container matColumnDef=\"site\">\r\n <th mat-header-cell *matHeaderCellDef>Site</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <div class=\"site-info\">\r\n <span class=\"site-indicator\"></span>\r\n <span [ngClass]=\"{'status-ready': element.dialPlanStatus === 'READY'}\">{{element.siteName}}</span>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Device Column -->\r\n <ng-container matColumnDef=\"device\">\r\n <th mat-header-cell *matHeaderCellDef>Device</th>\r\n <td mat-cell *matCellDef=\"let element\" class=\"multi-dev-box\">\r\n <div *ngIf=\"element.showDevices\" class=\"device-list show-dev-list\">\r\n <div *ngFor=\"let device of element.devices; let last = last\"\r\n class=\"device-item\"\r\n [class.no-border]=\"last\">\r\n <span class=\"device-indicator\" [ngClass]=\"{'device-indicator-ready': element.deviceStatus === 'READY'}\"></span>\r\n <span class=\"device-name\">{{ device.name || device }}</span>\r\n <span class=\"device-model\">{{ element.primaryExtension || 'No Extension' }}</span>\r\n </div>\r\n </div>\r\n <div class=\"device-info\">\r\n <div *ngIf=\"element.devices.length > 1\">\r\n <div class=\"device-name-wrapper clickable\"\r\n (mouseenter)=\"onMultipleDevices(element)\"\r\n (mouseleave)=\"onMultipleDevices(element)\">\r\n\r\n <span class=\"device-name\">Multiple devices ></span>\r\n </div>\r\n </div>\r\n <div *ngIf=\"element.devices.length === 1\">\r\n <div class=\"device-name-wrapper\">\r\n <span class=\"device-indicator\"></span>\r\n <span class=\"device-name\">{{element.devices[0]}}</span>\r\n </div>\r\n <span class=\"device-model\">{{ element.primaryExtension || 'No Extension' }}</span>\r\n </div>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Dial Plan Status Column -->\r\n <ng-container matColumnDef=\"dialPlanStatus\">\r\n <th mat-header-cell *matHeaderCellDef>Dial Plan Status</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <div class=\"status-info\">\r\n <span class=\"status-indicator\" [ngClass]=\"getStatusClass(element.dialPlanStatus)\"></span>\r\n <span [ngClass]=\"{'status-ready': element.dialPlanStatus === 'READY'}\">{{STATUS_ENTRIES[element.dialPlanStatus]}}</span>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Dependencies Column -->\r\n <ng-container matColumnDef=\"dependencies\">\r\n <th mat-header-cell *matHeaderCellDef>Dependencies</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <span *ngIf=\"DEPENDENCIES_STATUS[element.dependenciesStatus] === 'Dependencies found'\" class=\"dependencies-text\">{{DEPENDENCIES_STATUS[element.dependenciesStatus]}}</span>\r\n <span *ngIf=\"DEPENDENCIES_STATUS[element.dependenciesStatus] === 'No dependencies'\">\u2014</span>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- User Upgrade Status Column -->\r\n <ng-container matColumnDef=\"userUpgradeStatus\">\r\n <th mat-header-cell *matHeaderCellDef>User Upgrade Status</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <div class=\"upgrade-status-cell\">\r\n <ng-container *ngIf=\"STATUS_ENTRIES[element.upgradeStatus] === 'Ready'; else statusBlock\">\r\n <button mat-button color=\"primary\" class=\"upgrade-button\" (click)=\"upgradeUser(element)\">Upgrade</button>\r\n </ng-container>\r\n <ng-template #statusBlock>\r\n <div class=\"status-info\">\r\n <span class=\"status-indicator\" [ngClass]=\"getStatusClass(element.upgradeStatus)\"></span>\r\n <span>{{STATUS_ENTRIES[element.upgradeStatus]}}</span>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"userUpgradeLoader\">\r\n <th mat-header-cell *matHeaderCellDef></th>\r\n <td class=\"mat-progress-spinner-td\" mat-cell *matCellDef=\"let element\">\r\n\r\n <mat-progress-spinner\r\n *ngIf=\"element.pending\"\r\n class=\"field-spinner\"\r\n [diameter]=\"20\"\r\n mode=\"indeterminate\">\r\n </mat-progress-spinner>\r\n </td>\r\n </ng-container>\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"\r\n [class.selected-row]=\"selection.isSelected(row)\"></tr>\r\n </table>\r\n</div>\r\n\r\n<div class=\"app-pagination\">\r\n <mat-paginator\r\n [length]=\"pagination.total\"\r\n [pageSize]=\"pagination.pageSize\"\r\n [pageSizeOptions]=\"pagination.pageSizeOptions\"\r\n [pageIndex]=\"pagination.pageIndex\"\r\n (page)=\"pageEvent($event)\"\r\n showFirstLastButtons>\r\n </mat-paginator>\r\n\r\n <!--<div class=\"page-indexes-box\">\r\n <mat-paginator\r\n [id]=\"'commonPagination'\"\r\n [hidePageSize]=\"true\"\r\n [length]=\"pagination.total\"\r\n [pageIndex]=\"pagination.pageIndex\"\r\n [pageSize]=\"pagination.pageSize\"\r\n [pageSizeOptions]=\"pagination.pageSizeOptions\"\r\n (page)=\"pageEvent($event)\">\r\n </mat-paginator>\r\n </div>\r\n\r\n <div class=\"per-page-block\">\r\n <div class=\"item_per_page\">Items per page:</div>\r\n <div class=\"select-box select-page-size\">\r\n <mat-select (selectionChange)=\"changePerPageNumber($event)\" #page\r\n [id]=\"'commonPaginationSelect'\">\r\n <mat-option *ngFor=\"let option of pageSizeOptions; let i = index;\" [id]=\"'paginationSelectOpt_' + i\" [value]=\"option\">{{option}}</mat-option>\r\n </mat-select>\r\n </div>\r\n\r\n </div>-->\r\n</div>\r\n", styles: ["@import\"https://fonts.googleapis.com/css?family=Poppins:400,100,200,300,500,600,800,700,900\";@import\"https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap\";.app-pagination{display:flex;flex-direction:column;align-items:stretch}.app-pagination .page-indexes-box,.app-pagination .per-page-block{justify-self:center}.app-pagination mat-select{width:100px}.overlay{position:fixed;width:100%;height:100%;inset:0;background-color:#fff6;z-index:200}.mat-progress-spinner{position:absolute;top:50%;left:50%;margin-top:-20px;margin-left:-25px;width:50px;height:40px;text-align:center;font-size:10px}.mat-progress-spinner-td{position:relative}.status-ready{color:#1170cf}::ng-deep .mat-cell{border-bottom:1px solid #d6d6d6;font-family:Inter,sans-serif!important}::ng-deep .mat-header-cell{border-bottom:1px solid #afafaf;font-family:Inter,sans-serif!important}::ng-deep .progress-spinner-td{position:relative}::ng-deep #userUpgradeDataTable .mat-progress-spinner-td .mat-progress-spinner{top:28%;left:0;margin:0}.wrapper{display:flex;flex-direction:column;gap:1rem}.user-upgrade-status-wrapper{display:flex;align-items:center;gap:1rem;flex-wrap:wrap;margin-bottom:1rem}.user-upgrade-table{width:100%;background:white;border-radius:8px;overflow:hidden;font-size:14px}.user-upgrade-table .mat-header-row{font-size:12px;height:35px}.user-upgrade-table .mat-cell{border-bottom:1px solid #d6d6d6}.user-upgrade-table .mat-header-cell{border-bottom:1px solid #afafaf}.user-upgrade-table .mat-row{transition:background-color .2s ease}.user-upgrade-table .mat-row:hover{background-color:#f8f9fa}.user-upgrade-table .mat-row.selected-row{background-color:#08599c1a}.user-upgrade-table .user-info .user-name{font-weight:500;color:#212121}.user-upgrade-table .user-info .user-email{font-size:12px;color:#757575}.user-upgrade-table .site-info{display:flex;align-items:center;gap:8px}.user-upgrade-table .site-info .site-indicator{width:8px;height:8px;border-radius:50%;background-color:#1170cf}.user-upgrade-table .device-info{display:flex;align-items:center;gap:12px}.user-upgrade-table .device-info .device-name-wrapper{display:flex;align-items:center;gap:8px}.user-upgrade-table .device-info .device-name-wrapper .device-name{font-weight:500;color:#212121}.user-upgrade-table .device-model{font-size:12px;color:#757575;display:block}.user-upgrade-table .device-indicator{width:8px;height:8px;border-radius:50%;background-color:#f8cd00}.user-upgrade-table .device-indicator-ready{background-color:#1d805f}.user-upgrade-table .status-info{display:flex;align-items:center;gap:8px}.user-upgrade-table .status-info .status-indicator{width:8px;height:8px;border-radius:50%}.user-upgrade-table .status-info .status-indicator.ready{background-color:#1d805f}.user-upgrade-table .status-info .status-indicator.partial-ready{background-color:#f8cd00}.user-upgrade-table .status-info .status-indicator.not-ready{background-color:#9e9e9e}.user-upgrade-table .status-info .status-indicator.completed{background-color:#1d805f}.user-upgrade-table .status-info .status-indicator.failed{background-color:#f23933}.user-upgrade-table .dependencies-text{font-size:12px;background-color:#ffe9e9;padding:.25rem .5rem;border-radius:3px;color:#000}.user-upgrade-table .upgrade-status-cell{display:flex;align-items:center;justify-content:flex-start}.user-upgrade-table .upgrade-button{border:1px solid #08599c!important;color:#08599c!important;background:white!important;border-radius:20px!important;font-size:14px!important;font-style:normal!important;font-weight:500!important;height:32px!important;display:flex!important;align-items:center!important;justify-content:center!important}.user-upgrade-table .upgrade-button:hover{background-color:#e3f2fd!important}.user-upgrade-table .custom-checkbox .mdc-checkbox{padding:8px}.mat-checkbox-disabled{opacity:.5}.multi-dev-box{position:relative}.device-list{position:absolute;top:65%;left:0;min-width:200px;background:white;box-shadow:0 2px 8px #0000001a;z-index:1000;padding:8px 0;margin-top:4px;border-radius:2px;opacity:0;transform:translateY(-10px);visibility:hidden;transition:all .3s ease}.device-list.show-dev-list{opacity:1;transform:translateY(0);visibility:visible;pointer-events:auto}.clickable{cursor:pointer}.device-item{padding:12px 16px;border-bottom:1px solid #f5f5f5;cursor:pointer;transition:background-color .2s ease}.device-item:hover{background-color:#f9f9f9}.device-item.no-border{border-bottom:none}.device-item .device-name{font-size:14px;color:#333}.table-action-panel{width:100%;display:flex;justify-content:flex-start;gap:1rem}::ng-deep .action-wrapper{display:flex;flex:1;align-items:center;justify-content:space-between;gap:1rem;color:#555}.upgrade-bulk-button{border:1px solid #000!important;color:#fff!important;background:#000!important;border-radius:20px!important;padding:0 1rem!important;font-size:14px!important;font-style:normal!important;font-weight:400!important;height:36px!important;display:flex!important;align-items:center!important;justify-content:center!important}.upgrade-bulk-button:hover{background-color:#212121!important}.upgrade-bulk-button:disabled{background-color:#888!important;color:#fff!important;cursor:not-allowed!important;border-color:#888!important;opacity:.25!important}:host ::ng-deep .user-upgrade-table .mat-checkbox-checked.mat-accent .mat-checkbox-background{background-color:#08599c!important;border-color:#08599c!important}:host ::ng-deep .user-upgrade-table .mat-checkbox-indeterminate.mat-accent .mat-checkbox-background{background-color:#08599c!important;border-color:#08599c!important}:host ::ng-deep .user-upgrade-table .mat-checkbox.mat-accent .mat-checkbox-background{border-color:#08599c99!important}:host ::ng-deep .user-upgrade-table .mat-checkbox.mat-accent .mat-ripple-element{background-color:#08599c1a!important}:host ::ng-deep .user-upgrade-table .mat-checkbox.mat-accent:focus .mat-checkbox-background{background-color:#08599c1a!important}:host ::ng-deep .user-upgrade-table .mat-checkbox.mat-accent .mat-checkbox-frame{border-color:#08599c99!important}:host ::ng-deep .user-upgrade-table .mat-checkbox-checkmark{color:#fff!important}:host ::ng-deep .user-upgrade-table .mat-checkbox-checkmark-path{stroke:#fff!important}:host ::ng-deep .user-upgrade-table .mat-checkbox-mixedmark{border-color:#fff!important}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.SummaryCardComponent, selector: "tk-summary-card", inputs: ["value", "status", "description"] }, { kind: "component", type: i3.TableFiltersComponent, selector: "tk-table-filters", inputs: ["filters"], outputs: ["filter"] }, { kind: "component", type: i4.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i4.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i4.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i4.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i4.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i4.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i4.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i4.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i4.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i4.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i6.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i7.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i8.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }] });
282
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UserUpgradeDataTableComponent, decorators: [{
283
+ type: Component,
284
+ args: [{ selector: 'tk-user-upgrade-data-table', template: "<div *ngIf=\"dataPending\" class=\"overlay\">\r\n <mat-progress-spinner\r\n class=\"page-spinner\"\r\n mode=\"indeterminate\"\r\n [diameter]=\"120\"></mat-progress-spinner>\r\n</div>\r\n\r\n<div id=\"userUpgradeDataTable\" class=\"wrapper\">\r\n <div class=\"user-upgrade-status-wrapper\">\r\n <tk-summary-card [description]=\"'Users are ready to upgrade'\" [value]=\"statusCounts['Ready']\"></tk-summary-card>\r\n <tk-summary-card [description]=\"'Users are not ready'\" [value]=\"statusCounts['Not Ready']\" [status]=\"'Not Ready'\"></tk-summary-card>\r\n <tk-summary-card [description]=\"'Users failed to upgrade'\" [value]=\"statusCounts['Failed']\" [status]=\"'Failed'\"></tk-summary-card>\r\n <tk-summary-card [description]=\"'Successfully upgraded'\" [value]=\"statusCounts['Completed']\" [status]=\"'Completed'\"></tk-summary-card>\r\n </div>\r\n <div class=\"table-action-panel\">\r\n <tk-table-filters *ngIf=\"filters.length > 0\" [filters]=\"filters\" (filter)=\"onFilter($event)\"></tk-table-filters>\r\n <div class=\"action-wrapper\">\r\n <span>{{filteredDataCount}} Users</span>\r\n <button\r\n mat-button\r\n class=\"upgrade-bulk-button\"\r\n color=\"primary\"\r\n [disabled]=\"selection.selected.length === 0\"\r\n (click)=\"upgradeSelectedUsers()\">\r\n Upgrade {{ selection.selected.length === 0 ? '' : '(' + selection.selected.length + ')' }}\r\n </button>\r\n </div>\r\n </div>\r\n <table mat-table [dataSource]=\"data\" class=\"user-upgrade-table\">\r\n\r\n <!-- Checkbox Column -->\r\n <ng-container matColumnDef=\"select\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n <mat-checkbox\r\n (change)=\"$event ? masterToggle() : null\"\r\n [checked]=\"selection.hasValue() && isAllSelected()\"\r\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\"\r\n class=\"custom-checkbox\">\r\n </mat-checkbox>\r\n </th>\r\n <td mat-cell *matCellDef=\"let row\">\r\n <mat-checkbox\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"$event ? selection.toggle(row) : null\"\r\n [checked]=\"selection.isSelected(row)\"\r\n [disabled]=\"STATUS_ENTRIES[row.upgradeStatus] !== 'Ready' || row.pending\"\r\n class=\"custom-checkbox\">\r\n </mat-checkbox>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- User Column -->\r\n <ng-container matColumnDef=\"user\">\r\n <th mat-header-cell *matHeaderCellDef>User</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <div class=\"user-info\">\r\n <div class=\"user-name\">{{element.userName}}</div>\r\n <div class=\"user-email\">{{element.userName}}</div>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Site Column -->\r\n <ng-container matColumnDef=\"site\">\r\n <th mat-header-cell *matHeaderCellDef>Site</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <div class=\"site-info\">\r\n <span class=\"site-indicator\"></span>\r\n <span [ngClass]=\"{'status-ready': element.dialPlanStatus === 'READY'}\">{{element.siteName}}</span>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Device Column -->\r\n <ng-container matColumnDef=\"device\">\r\n <th mat-header-cell *matHeaderCellDef>Device</th>\r\n <td mat-cell *matCellDef=\"let element\" class=\"multi-dev-box\">\r\n <div *ngIf=\"element.showDevices\" class=\"device-list show-dev-list\">\r\n <div *ngFor=\"let device of element.devices; let last = last\"\r\n class=\"device-item\"\r\n [class.no-border]=\"last\">\r\n <span class=\"device-indicator\" [ngClass]=\"{'device-indicator-ready': element.deviceStatus === 'READY'}\"></span>\r\n <span class=\"device-name\">{{ device.name || device }}</span>\r\n <span class=\"device-model\">{{ element.primaryExtension || 'No Extension' }}</span>\r\n </div>\r\n </div>\r\n <div class=\"device-info\">\r\n <div *ngIf=\"element.devices.length > 1\">\r\n <div class=\"device-name-wrapper clickable\"\r\n (mouseenter)=\"onMultipleDevices(element)\"\r\n (mouseleave)=\"onMultipleDevices(element)\">\r\n\r\n <span class=\"device-name\">Multiple devices ></span>\r\n </div>\r\n </div>\r\n <div *ngIf=\"element.devices.length === 1\">\r\n <div class=\"device-name-wrapper\">\r\n <span class=\"device-indicator\"></span>\r\n <span class=\"device-name\">{{element.devices[0]}}</span>\r\n </div>\r\n <span class=\"device-model\">{{ element.primaryExtension || 'No Extension' }}</span>\r\n </div>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Dial Plan Status Column -->\r\n <ng-container matColumnDef=\"dialPlanStatus\">\r\n <th mat-header-cell *matHeaderCellDef>Dial Plan Status</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <div class=\"status-info\">\r\n <span class=\"status-indicator\" [ngClass]=\"getStatusClass(element.dialPlanStatus)\"></span>\r\n <span [ngClass]=\"{'status-ready': element.dialPlanStatus === 'READY'}\">{{STATUS_ENTRIES[element.dialPlanStatus]}}</span>\r\n </div>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Dependencies Column -->\r\n <ng-container matColumnDef=\"dependencies\">\r\n <th mat-header-cell *matHeaderCellDef>Dependencies</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <span *ngIf=\"DEPENDENCIES_STATUS[element.dependenciesStatus] === 'Dependencies found'\" class=\"dependencies-text\">{{DEPENDENCIES_STATUS[element.dependenciesStatus]}}</span>\r\n <span *ngIf=\"DEPENDENCIES_STATUS[element.dependenciesStatus] === 'No dependencies'\">\u2014</span>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- User Upgrade Status Column -->\r\n <ng-container matColumnDef=\"userUpgradeStatus\">\r\n <th mat-header-cell *matHeaderCellDef>User Upgrade Status</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <div class=\"upgrade-status-cell\">\r\n <ng-container *ngIf=\"STATUS_ENTRIES[element.upgradeStatus] === 'Ready'; else statusBlock\">\r\n <button mat-button color=\"primary\" class=\"upgrade-button\" (click)=\"upgradeUser(element)\">Upgrade</button>\r\n </ng-container>\r\n <ng-template #statusBlock>\r\n <div class=\"status-info\">\r\n <span class=\"status-indicator\" [ngClass]=\"getStatusClass(element.upgradeStatus)\"></span>\r\n <span>{{STATUS_ENTRIES[element.upgradeStatus]}}</span>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"userUpgradeLoader\">\r\n <th mat-header-cell *matHeaderCellDef></th>\r\n <td class=\"mat-progress-spinner-td\" mat-cell *matCellDef=\"let element\">\r\n\r\n <mat-progress-spinner\r\n *ngIf=\"element.pending\"\r\n class=\"field-spinner\"\r\n [diameter]=\"20\"\r\n mode=\"indeterminate\">\r\n </mat-progress-spinner>\r\n </td>\r\n </ng-container>\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"\r\n [class.selected-row]=\"selection.isSelected(row)\"></tr>\r\n </table>\r\n</div>\r\n\r\n<div class=\"app-pagination\">\r\n <mat-paginator\r\n [length]=\"pagination.total\"\r\n [pageSize]=\"pagination.pageSize\"\r\n [pageSizeOptions]=\"pagination.pageSizeOptions\"\r\n [pageIndex]=\"pagination.pageIndex\"\r\n (page)=\"pageEvent($event)\"\r\n showFirstLastButtons>\r\n </mat-paginator>\r\n\r\n <!--<div class=\"page-indexes-box\">\r\n <mat-paginator\r\n [id]=\"'commonPagination'\"\r\n [hidePageSize]=\"true\"\r\n [length]=\"pagination.total\"\r\n [pageIndex]=\"pagination.pageIndex\"\r\n [pageSize]=\"pagination.pageSize\"\r\n [pageSizeOptions]=\"pagination.pageSizeOptions\"\r\n (page)=\"pageEvent($event)\">\r\n </mat-paginator>\r\n </div>\r\n\r\n <div class=\"per-page-block\">\r\n <div class=\"item_per_page\">Items per page:</div>\r\n <div class=\"select-box select-page-size\">\r\n <mat-select (selectionChange)=\"changePerPageNumber($event)\" #page\r\n [id]=\"'commonPaginationSelect'\">\r\n <mat-option *ngFor=\"let option of pageSizeOptions; let i = index;\" [id]=\"'paginationSelectOpt_' + i\" [value]=\"option\">{{option}}</mat-option>\r\n </mat-select>\r\n </div>\r\n\r\n </div>-->\r\n</div>\r\n", styles: ["@import\"https://fonts.googleapis.com/css?family=Poppins:400,100,200,300,500,600,800,700,900\";@import\"https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap\";.app-pagination{display:flex;flex-direction:column;align-items:stretch}.app-pagination .page-indexes-box,.app-pagination .per-page-block{justify-self:center}.app-pagination mat-select{width:100px}.overlay{position:fixed;width:100%;height:100%;inset:0;background-color:#fff6;z-index:200}.mat-progress-spinner{position:absolute;top:50%;left:50%;margin-top:-20px;margin-left:-25px;width:50px;height:40px;text-align:center;font-size:10px}.mat-progress-spinner-td{position:relative}.status-ready{color:#1170cf}::ng-deep .mat-cell{border-bottom:1px solid #d6d6d6;font-family:Inter,sans-serif!important}::ng-deep .mat-header-cell{border-bottom:1px solid #afafaf;font-family:Inter,sans-serif!important}::ng-deep .progress-spinner-td{position:relative}::ng-deep #userUpgradeDataTable .mat-progress-spinner-td .mat-progress-spinner{top:28%;left:0;margin:0}.wrapper{display:flex;flex-direction:column;gap:1rem}.user-upgrade-status-wrapper{display:flex;align-items:center;gap:1rem;flex-wrap:wrap;margin-bottom:1rem}.user-upgrade-table{width:100%;background:white;border-radius:8px;overflow:hidden;font-size:14px}.user-upgrade-table .mat-header-row{font-size:12px;height:35px}.user-upgrade-table .mat-cell{border-bottom:1px solid #d6d6d6}.user-upgrade-table .mat-header-cell{border-bottom:1px solid #afafaf}.user-upgrade-table .mat-row{transition:background-color .2s ease}.user-upgrade-table .mat-row:hover{background-color:#f8f9fa}.user-upgrade-table .mat-row.selected-row{background-color:#08599c1a}.user-upgrade-table .user-info .user-name{font-weight:500;color:#212121}.user-upgrade-table .user-info .user-email{font-size:12px;color:#757575}.user-upgrade-table .site-info{display:flex;align-items:center;gap:8px}.user-upgrade-table .site-info .site-indicator{width:8px;height:8px;border-radius:50%;background-color:#1170cf}.user-upgrade-table .device-info{display:flex;align-items:center;gap:12px}.user-upgrade-table .device-info .device-name-wrapper{display:flex;align-items:center;gap:8px}.user-upgrade-table .device-info .device-name-wrapper .device-name{font-weight:500;color:#212121}.user-upgrade-table .device-model{font-size:12px;color:#757575;display:block}.user-upgrade-table .device-indicator{width:8px;height:8px;border-radius:50%;background-color:#f8cd00}.user-upgrade-table .device-indicator-ready{background-color:#1d805f}.user-upgrade-table .status-info{display:flex;align-items:center;gap:8px}.user-upgrade-table .status-info .status-indicator{width:8px;height:8px;border-radius:50%}.user-upgrade-table .status-info .status-indicator.ready{background-color:#1d805f}.user-upgrade-table .status-info .status-indicator.partial-ready{background-color:#f8cd00}.user-upgrade-table .status-info .status-indicator.not-ready{background-color:#9e9e9e}.user-upgrade-table .status-info .status-indicator.completed{background-color:#1d805f}.user-upgrade-table .status-info .status-indicator.failed{background-color:#f23933}.user-upgrade-table .dependencies-text{font-size:12px;background-color:#ffe9e9;padding:.25rem .5rem;border-radius:3px;color:#000}.user-upgrade-table .upgrade-status-cell{display:flex;align-items:center;justify-content:flex-start}.user-upgrade-table .upgrade-button{border:1px solid #08599c!important;color:#08599c!important;background:white!important;border-radius:20px!important;font-size:14px!important;font-style:normal!important;font-weight:500!important;height:32px!important;display:flex!important;align-items:center!important;justify-content:center!important}.user-upgrade-table .upgrade-button:hover{background-color:#e3f2fd!important}.user-upgrade-table .custom-checkbox .mdc-checkbox{padding:8px}.mat-checkbox-disabled{opacity:.5}.multi-dev-box{position:relative}.device-list{position:absolute;top:65%;left:0;min-width:200px;background:white;box-shadow:0 2px 8px #0000001a;z-index:1000;padding:8px 0;margin-top:4px;border-radius:2px;opacity:0;transform:translateY(-10px);visibility:hidden;transition:all .3s ease}.device-list.show-dev-list{opacity:1;transform:translateY(0);visibility:visible;pointer-events:auto}.clickable{cursor:pointer}.device-item{padding:12px 16px;border-bottom:1px solid #f5f5f5;cursor:pointer;transition:background-color .2s ease}.device-item:hover{background-color:#f9f9f9}.device-item.no-border{border-bottom:none}.device-item .device-name{font-size:14px;color:#333}.table-action-panel{width:100%;display:flex;justify-content:flex-start;gap:1rem}::ng-deep .action-wrapper{display:flex;flex:1;align-items:center;justify-content:space-between;gap:1rem;color:#555}.upgrade-bulk-button{border:1px solid #000!important;color:#fff!important;background:#000!important;border-radius:20px!important;padding:0 1rem!important;font-size:14px!important;font-style:normal!important;font-weight:400!important;height:36px!important;display:flex!important;align-items:center!important;justify-content:center!important}.upgrade-bulk-button:hover{background-color:#212121!important}.upgrade-bulk-button:disabled{background-color:#888!important;color:#fff!important;cursor:not-allowed!important;border-color:#888!important;opacity:.25!important}:host ::ng-deep .user-upgrade-table .mat-checkbox-checked.mat-accent .mat-checkbox-background{background-color:#08599c!important;border-color:#08599c!important}:host ::ng-deep .user-upgrade-table .mat-checkbox-indeterminate.mat-accent .mat-checkbox-background{background-color:#08599c!important;border-color:#08599c!important}:host ::ng-deep .user-upgrade-table .mat-checkbox.mat-accent .mat-checkbox-background{border-color:#08599c99!important}:host ::ng-deep .user-upgrade-table .mat-checkbox.mat-accent .mat-ripple-element{background-color:#08599c1a!important}:host ::ng-deep .user-upgrade-table .mat-checkbox.mat-accent:focus .mat-checkbox-background{background-color:#08599c1a!important}:host ::ng-deep .user-upgrade-table .mat-checkbox.mat-accent .mat-checkbox-frame{border-color:#08599c99!important}:host ::ng-deep .user-upgrade-table .mat-checkbox-checkmark{color:#fff!important}:host ::ng-deep .user-upgrade-table .mat-checkbox-checkmark-path{stroke:#fff!important}:host ::ng-deep .user-upgrade-table .mat-checkbox-mixedmark{border-color:#fff!important}\n"] }]
285
+ }], propDecorators: { token: [{
286
+ type: Input
287
+ }], customerId: [{
288
+ type: Input
289
+ }] } });
290
+ class PaginationDataDto {
291
+ constructor(data) {
292
+ this.pageSizeOptions = data?.pageSizeOptions || PAGINATION_DATA_DEFAULTS.OPTIONS;
293
+ this.pageSize = data?.pageSize || PAGINATION_DATA_DEFAULTS.SIZE;
294
+ this.pageIndex = data?.pageIndex || PAGINATION_DATA_DEFAULTS.PAGE_INDEX;
295
+ this.total = data?.total || 0;
296
+ }
297
+ }
298
+ const PAGINATION_DATA_DEFAULTS = {
299
+ OPTIONS: [10, 20, 50, 100],
300
+ SIZE: 10,
301
+ PAGE_INDEX: 0
302
+ };
303
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci11cGdyYWRlLWRhdGEtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHVraS93aWRnZXRzL2RpMm10L3dpZGdldHMvdXNlci11cGdyYWRlL3VzZXItdXBncmFkZS1kYXRhLXRhYmxlL3VzZXItdXBncmFkZS1kYXRhLXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R1a2kvd2lkZ2V0cy9kaTJtdC93aWRnZXRzL3VzZXItdXBncmFkZS91c2VyLXVwZ3JhZGUtZGF0YS10YWJsZS91c2VyLXVwZ3JhZGUtZGF0YS10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFNBQVMsRUFBcUIsTUFBTSxFQUFFLEtBQUssRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDL0YsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHN0QsT0FBTyxFQUFrQixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakMsT0FBTyxFQUF5QixrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3BGLE9BQU8sRUFBRSxtQkFBbUIsRUFBVSxjQUFjLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUU5RixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDbEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0seUNBQXlDLENBQUM7Ozs7Ozs7Ozs7QUFTbEYsTUFBTSxPQUFPLDZCQUE2QjtJQU4xQztRQU9VLGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQy9CLHVCQUFr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LEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUM7SUFDMUIsSUFBSSxFQUFFLEVBQUU7SUFDUixVQUFVLEVBQUUsQ0FBQztDQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTZWxlY3Rpb25Nb2RlbCB9IGZyb20gXCJAYW5ndWxhci9jZGsvY29sbGVjdGlvbnNcIjtcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIE9uRGVzdHJveSwgaW5qZWN0LCBJbnB1dCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBNYXRUYWJsZURhdGFTb3VyY2UgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGVcIjtcclxuaW1wb3J0IHsgVGFibGVDb2x1bW4gfSBmcm9tIFwiLi4vLi4vLi4vc2hhcmVkL3R5cGVzL2RhdGEtdGFibGVcIjtcclxuaW1wb3J0IHsgVGFibGVGaWx0ZXIgfSBmcm9tIFwiLi4vLi4vLi4vc2hhcmVkL3R5cGVzL3RhYmxlL2ZpbHRlclwiO1xyXG5pbXBvcnQgeyBjYXRjaEVycm9yLCBvZiwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgVXNlcjJVcGdyYWRlU3RhdHVzRFRPLCBVc2VyVXBncmFkZVNlcnZpY2UgfSBmcm9tIFwiLi4vdXNlci11cGdyYWRlLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgREVQRU5ERU5DSUVTX1NUQVRVUywgU3RhdHVzLCBTVEFUVVNfRU5UUklFUyB9IGZyb20gXCIuLi8uLi8uLi9zaGFyZWQvdHlwZXMvY29uc3RhbnRzXCI7XHJcbmltcG9ydCB7IFVzZXJVcGdyYWRlUmVjb3JkIH0gZnJvbSBcIi4uL3R5cGVzL3VzZXItdXBncmFkZVwiO1xyXG5pbXBvcnQgeyBBUElTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uLy4uL3NoYXJlZC9zZXJ2aWNlcy9hcGkuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBQQUdJTkFUSU9OX1NJWkVfT1BUSU9OUyB9IGZyb20gXCIuLi8uLi8uLi9zaGFyZWQvY29uc3RhbnRzL2FwcC5jb25zdGFudHNcIjtcclxuaW1wb3J0IHsgUGFnZUV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndGstdXNlci11cGdyYWRlLWRhdGEtdGFibGUnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi91c2VyLXVwZ3JhZGUtZGF0YS10YWJsZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdXNlci11cGdyYWRlLWRhdGEtdGFibGUuY29tcG9uZW50LnNjc3MnXSxcclxuICAvLyBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5TaGFkb3dEb21cclxufSlcclxuZXhwb3J0IGNsYXNzIFVzZXJVcGdyYWRlRGF0YVRhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gIHByaXZhdGUgdXNlclVwZ3JhZGVTZXJ2aWNlID0gaW5qZWN0KFVzZXJVcGdyYWRlU2VydmljZSk7XHJcbiAgcHJpdmF0ZSBhcGlTZXJ2aWNlID0gaW5qZWN0KEFQSVNlcnZpY2UpO1xyXG4gIHJlYWRvbmx5IFNUQVRVU19FTlRSSUVTID0gU1RBVFVTX0VOVFJJRVM7XHJcbiAgcmVhZG9ubHkgREVQRU5ERU5DSUVTX1NUQVRVUyA9IERFUEVOREVOQ0lFU19TVEFUVVM7XHJcblxyXG4gIEBJbnB1dCgpIHRva2VuITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGN1c3RvbWVySWQhOiBzdHJpbmc7XHJcblxyXG4gIGNvbHVtbnMhOiBUYWJsZUNvbHVtbltdO1xyXG4gIGRhdGFQZW5kaW5nID0gZmFsc2U7XHJcbiAgZGF0YSE6IE1hdFRhYmxlRGF0YVNvdXJjZTxVc2VyVXBncmFkZVJlY29yZD47XHJcbiAgZGlzcGxheWVkQ29sdW1uczogc3RyaW5nW10gPSBbJ3NlbGVjdCcsICd1c2VyJywgJ3NpdGUnLCAnZGV2aWNlJywgJ2RpYWxQbGFuU3RhdHVzJywgJ2RlcGVuZGVuY2llcycsICd1c2VyVXBncmFkZVN0YXR1cycsICd1c2VyVXBncmFkZUxvYWRlciddO1xyXG4gIHNlbGVjdGlvbiA9IG5ldyBTZWxlY3Rpb25Nb2RlbDxVc2VyVXBncmFkZVJlY29yZD4odHJ1ZSwgW10pO1xyXG4gIGZpbHRlcnM6IFRhYmxlRmlsdGVyW10gPSBbXTtcclxuICBwYWdpbmF0aW9uID0gbmV3IFBhZ2luYXRpb25EYXRhRHRvKCk7XHJcbiAgdXNlcnM6IFVzZXJVcGdyYWRlUmVjb3JkW10gPSBbXTtcclxuICBwcml2YXRlIHN1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XHJcblxyXG4gIHN0YXR1c0NvdW50czogYW55ID0ge307XHJcblxyXG4gIHByaXZhdGUgYWN0aXZlRmlsdGVyczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGF0YVBlbmRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5hcGlTZXJ2aWNlLnRva2VuID0gdGhpcy50b2tlbjtcclxuICAgIHRoaXMudXNlclVwZ3JhZGVTZXJ2aWNlLmN1c3RvbWVySWQgPSB0aGlzLmN1c3RvbWVySWQ7XHJcblxyXG4gICAgY29uc3Qgc3Vic2MxID0gdGhpcy51c2VyVXBncmFkZVNlcnZpY2UuZ2V0VXNlclVwZ3JhZGVSZWNvcmRzKHRoaXMucGFnaW5hdGlvbi5wYWdlU2l6ZSwgdGhpcy5wYWdpbmF0aW9uLnBhZ2VJbmRleClcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKChyZXN1bHRzOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCByZWNvcmRzID0gcmVzdWx0cy5jb250ZW50IGFzIFVzZXJVcGdyYWRlUmVjb3JkW11cclxuICAgICAgICB0aGlzLmRhdGEgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKHJlY29yZHMpO1xyXG4gICAgICAgIHRoaXMucGFnaW5hdGlvbi50b3RhbCA9IHJlc3VsdHMudG90YWxFbGVtZW50cztcclxuICAgICAgICB0aGlzLmRhdGFQZW5kaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5zZXR1cEN1c3RvbUZpbHRlcigpO1xyXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZUZpbHRlcnMocmVjb3Jkcyk7XHJcbiAgICAgIH0pO1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChzdWJzYzEpO1xyXG5cclxuICAgIGNvbnN0IHN1YnNjMiA9IHRoaXMudXNlclVwZ3JhZGVTZXJ2aWNlLmdldFVzZXJVcGdyYWRlU3RhdHVzQ291bnRzKClcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKChzdGF0dXNDb3VudHMpID0+IHtcclxuICAgICAgICB0aGlzLnN0YXR1c0NvdW50c1snUmVhZHknXSA9IHN0YXR1c0NvdW50c1snUkVBRFknXSB8fCAwO1xyXG4gICAgICAgIHRoaXMuc3RhdHVzQ291bnRzWydOb3QgUmVhZHknXSA9IHN0YXR1c0NvdW50c1snTk9UX1JFQURZJ10gfHwgMDtcclxuICAgICAgICB0aGlzLnN0YXR1c0NvdW50c1snQ29tcGxldGVkJ10gPSBzdGF0dXNDb3VudHNbJ0NPTVBMRVRFRCddIHx8IDA7XHJcbiAgICAgICAgdGhpcy5zdGF0dXNDb3VudHNbJ0ZhaWxlZCddID0gc3RhdHVzQ291bnRzWydGQUlMRUQnXSB8fCAwO1xyXG4gICAgICB9KTtcclxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoc3Vic2MyKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgICB0aGlzLmRhdGFQZW5kaW5nID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9ucykge1xyXG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uTXVsdGlwbGVEZXZpY2VzKHVzZXI6IFVzZXJVcGdyYWRlUmVjb3JkKTogdm9pZCB7XHJcbiAgICB1c2VyLnNob3dEZXZpY2VzID0gIXVzZXIuc2hvd0RldmljZXM7XHJcbiAgfVxyXG5cclxuICBwYWdlRXZlbnQgKGV2ZW50OiBQYWdlRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMucGFnaW5hdGlvbi5wYWdlSW5kZXggPSBldmVudC5wYWdlSW5kZXg7XHJcbiAgICB0aGlzLnBhZ2luYXRpb24ucGFnZVNpemUgPSBldmVudC5wYWdlU2l6ZTtcclxuICAgIHRoaXMuZ2V0RGF0YSgpO1xyXG4gIH1cclxuXHJcbiAgY2hhbmdlUGVyUGFnZU51bWJlcihwYWdlU2l6ZUV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMucGFnaW5hdGlvbi5wYWdlU2l6ZSA9IHBhZ2VTaXplRXZlbnQudmFsdWU7XHJcbiAgICB0aGlzLnBhZ2luYXRpb24ucGFnZUluZGV4ID0gMDtcclxuICAgIHRoaXMuZ2V0RGF0YSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXREYXRhKCk6IHZvaWQge1xyXG4gICAgdGhpcy5kYXRhUGVuZGluZyA9IHRydWU7XHJcbiAgICBjb25zdCBzdWJzYzEgPSB0aGlzLnVzZXJVcGdyYWRlU2VydmljZS5nZXRVc2VyVXBncmFkZVJlY29yZHModGhpcy5wYWdpbmF0aW9uLnBhZ2VTaXplLCB0aGlzLnBhZ2luYXRpb24ucGFnZUluZGV4KVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xyXG5cclxuICAgICAgICB0aGlzLmRhdGEgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKHJlc3VsdC5jb250ZW50KTtcclxuICAgICAgICB0aGlzLnBhZ2luYXRpb24udG90YWwgPSByZXN1bHQudG90YWxFbGVtZW50cztcclxuICAgICAgICB0aGlzLmRhdGFQZW5kaW5nID0gZmFsc2U7XHJcbiAgICAgIH0pO1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChzdWJzYzEpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0aWFsaXplRmlsdGVycyhyZWNvcmRzOiBhbnlbXSk6IHZvaWQge1xyXG4gICAgaWYgKHJlY29yZHM/Lmxlbmd0aCkge1xyXG4gICAgICAvLyBFeHRyYWN0IHVuaXF1ZSBzaXRlcyBmcm9tIGFjdHVhbCBkYXRhXHJcbiAgICAgIGNvbnN0IHVuaXF1ZVNpdGVzID0gWy4uLm5ldyBTZXQocmVjb3Jkcy5tYXAocmVjb3JkID0+IHJlY29yZC5zaXRlTmFtZSkpXTtcclxuICAgICAgY29uc3Qgc2l0ZU9wdGlvbnMgPSB1bmlxdWVTaXRlcy5tYXAoc2l0ZSA9PiAoe1xyXG4gICAgICAgIGxhYmVsOiBzaXRlLFxyXG4gICAgICAgIHZhbHVlOiBzaXRlLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxzKy9nLCAnLScpXHJcbiAgICAgIH0pKTtcclxuXHJcbiAgICAgIC8vIEV4dHJhY3QgdW5pcXVlIHN0YXR1c2VzIGZyb20gYWN0dWFsIGRhdGFcclxuICAgICAgY29uc3QgdW5pcXVlU3RhdHVzZXMgPSBbLi4ubmV3IFNldChyZWNvcmRzLm1hcChyZWNvcmQgPT4gcmVjb3JkLnVwZ3JhZGVTdGF0dXMpKV07XHJcbiAgICAgIGNvbnN0IHN0YXR1c09wdGlvbnMgPSB1bmlxdWVTdGF0dXNlcy5tYXAoc3RhdHVzID0+ICh7XHJcbiAgICAgICAgbGFiZWw6IFNUQVRVU19FTlRSSUVTW3N0YXR1c10sXHJcbiAgICAgICAgdmFsdWU6IHN0YXR1cy50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccysvZywgJy0nKVxyXG4gICAgICB9KSk7XHJcblxyXG4gICAgICB0aGlzLmZpbHRlcnMgPSBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaWQ6ICd1c2VyTmFtZScsXHJcbiAgICAgICAgICB0eXBlOiAnc2VhcmNoJyxcclxuICAgICAgICAgIGNvbHVtbktleTogJ1VzZXInLFxyXG4gICAgICAgICAgcGxhY2Vob2xkZXI6ICdTZWFyY2ggdXNlcnMuLi4nLFxyXG4gICAgICAgICAgb3B0aW9uczogW11cclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGlkOiAnc2l0ZXMnLFxyXG4gICAgICAgICAgdHlwZTogJ3NlbGVjdCcsXHJcbiAgICAgICAgICBjb2x1bW5LZXk6ICdTaXRlJyxcclxuICAgICAgICAgIHBsYWNlaG9sZGVyOiAnU2l0ZXMnLFxyXG4gICAgICAgICAgb3B0aW9uczogc2l0ZU9wdGlvbnNcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGlkOiAnc3RhdHVzJyxcclxuICAgICAgICAgIHR5cGU6ICdzZWxlY3QnLFxyXG4gICAgICAgICAgY29sdW1uS2V5OiAnVXNlciBVcGdyYWRlIFN0YXR1cycsXHJcbiAgICAgICAgICBwbGFjZWhvbGRlcjogJ1VwZ3JhZGUgU3RhdHVzJyxcclxuICAgICAgICAgIG9wdGlvbnM6IHN0YXR1c09wdGlvbnNcclxuICAgICAgICB9XHJcbiAgICAgIF07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogV2hldGhlciB0aGUgbnVtYmVyIG9mIHNlbGVjdGVkIGVsZW1lbnRzIG1hdGNoZXMgdGhlIHRvdGFsIG51bWJlciBvZiByb3dzLiAqL1xyXG4gIGlzQWxsU2VsZWN0ZWQoKSB7XHJcbiAgICBjb25zdCBudW1TZWxlY3RlZCA9IHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aDtcclxuICAgIGNvbnN0IG51bVJvd3MgPSB0aGlzLmRhdGE/LmRhdGEubGVuZ3RoID8/IDA7XHJcbiAgICByZXR1cm4gbnVtU2VsZWN0ZWQgPT09IG51bVJvd3M7XHJcbiAgfVxyXG5cclxuICAvKiogU2VsZWN0cyBhbGwgcm93cyBpZiB0aGV5IGFyZSBub3QgYWxsIHNlbGVjdGVkOyBvdGhlcndpc2UgY2xlYXIgc2VsZWN0aW9uLiAqL1xyXG4gIG1hc3RlclRvZ2dsZSgpIHtcclxuICAgIC8vIHRoaXMuaXNBbGxTZWxlY3RlZCgpID9cclxuICAgIC8vICAgdGhpcy5zZWxlY3Rpb24uY2xlYXIoKSA6XHJcbiAgICAvLyAgIHRoaXMuZGF0YT8uZGF0YS5mb3JFYWNoKHJvdyA9PiB0aGlzLnNlbGVjdGlvbi5zZWxlY3Qocm93KSk7XHJcbiAgICBpZiAodGhpcy5pc0FsbFNlbGVjdGVkKCkpIHtcclxuICAgICAgdGhpcy5zZWxlY3Rpb24uY2xlYXIoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZGF0YT8uZGF0YS5mb3JFYWNoKHJvdyA9PiB7XHJcbiAgICAgICAgaWYgKHJvdy51cGdyYWRlU3RhdHVzID09PSAnUkVBRFknKSB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3Qocm93KVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1cGdyYWRlVXNlcih1c2VyOiBVc2VyVXBncmFkZVJlY29yZCk6IHZvaWQge1xyXG4gICAgaWYgKHVzZXI/LnVwZ3JhZGVTdGF0dXMgPT09ICdSRUFEWScpXHJcbiAgICAgIHVzZXIucGVuZGluZyA9IHRydWU7XHJcblxyXG4gICAgICB0aGlzLnVzZXJVcGdyYWRlU2VydmljZS5jb2xsZWN0VXNlcnMoW3VzZXJdKVxyXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgIHRoaXMudXNlclVwZ3JhZGVTZXJ2aWNlLmJ1bGtVcGdyYWRlKFt1c2VyXSlcclxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVVzZXJzU3RhdHVzQWZ0ZXJVcGdyYWRlKFt1c2VyXSk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVVc2Vyc1N0YXR1c0FmdGVyVXBncmFkZSh1c2VyczogVXNlclVwZ3JhZGVSZWNvcmRbXSk6IHZvaWQge1xyXG4gICAgdGhpcy51c2VyVXBncmFkZVNlcnZpY2UuZ2V0VXNlcnNVcGdyYWRlU3RhdHVzZXModXNlcnMpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgodXBncmFkZWRTdGF0dXNlczogVXNlcjJVcGdyYWRlU3RhdHVzRFRPW10pID0+IHtcclxuICAgICAgICB1cGdyYWRlZFN0YXR1c2VzLmZvckVhY2goc3RhdHVzSXRlbSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBpbmQgPSB0aGlzLmdldFVzZXJJbmRleChzdGF0dXNJdGVtLnVzZXJJZCk7XHJcbiAgICAgICAgICBpZiAoaW5kID4gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5kYXRhLmRhdGFbaW5kXS51cGdyYWRlU3RhdHVzID0gc3RhdHVzSXRlbS51cGdyYWRlU3RhdHVzO1xyXG4gICAgICAgICAgICB0aGlzLmRhdGEuZGF0YVtpbmRdLnBlbmRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmRhdGFQZW5kaW5nID0gZmFsc2U7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0VXNlckluZGV4KHVzZXJJZDogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmRhdGEuZGF0YS5maW5kSW5kZXgoKHJlY29yZDogVXNlclVwZ3JhZGVSZWNvcmQpID0+IHJlY29yZC51c2VySWQgPT09IHVzZXJJZCk7XHJcbiAgfVxyXG5cclxuICB1cGdyYWRlU2VsZWN0ZWRVc2VycygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZCAmJiB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5kYXRhUGVuZGluZyA9IHRydWU7XHJcblxyXG4gICAgICB0aGlzLnVzZXJVcGdyYWRlU2VydmljZS5jb2xsZWN0VXNlcnModGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQpXHJcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy51c2VyVXBncmFkZVNlcnZpY2UuYnVsa1VwZ3JhZGUodGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQpXHJcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy51cGRhdGVVc2Vyc1N0YXR1c0FmdGVyVXBncmFkZSh0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZCk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgfVxyXG4gICAgdGhpcy51c2VyVXBncmFkZVNlcnZpY2UuYnVsa1VwZ3JhZGUodGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQpO1xyXG4gIH1cclxuXHJcbiAgb25GaWx0ZXIoZmlsdGVyRXZlbnQ6IHsga2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkgfSkge1xyXG4gICAgY29uc3Qge2tleSwgdmFsdWV9ID0gZmlsdGVyRXZlbnQ7XHJcblxyXG4gICAgbGV0IGZpbHRlclZhbHVlOiBhbnk7XHJcbiAgICBpZiAodmFsdWUgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBmaWx0ZXJWYWx1ZSA9IHZhbHVlLnZhbHVlO1xyXG4gICAgfSBlbHNlIGlmICh2YWx1ZSAmJiB2YWx1ZS50YXJnZXQpIHtcclxuICAgICAgZmlsdGVyVmFsdWUgPSB2YWx1ZS50YXJnZXQudmFsdWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmaWx0ZXJWYWx1ZSA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEhhbmRsZSBcIkFsbFwiIG9wdGlvbiBvciBlbXB0eSB2YWx1ZXMgLSByZW1vdmUgdGhlIGZpbHRlclxyXG4gICAgaWYgKGZpbHRlclZhbHVlID09PSAnYWxsJyB8fCAhZmlsdGVyVmFsdWUgfHwgZmlsdGVyVmFsdWUgPT09ICcnKSB7XHJcbiAgICAgIGRlbGV0ZSB0aGlzLmFjdGl2ZUZpbHRlcnNba2V5XTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYWN0aXZlRmlsdGVyc1trZXldID0gZmlsdGVyVmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5hcHBseUZpbHRlcnMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0dXBDdXN0b21GaWx0ZXIoKSB7XHJcbiAgICB0aGlzLmRhdGEuZmlsdGVyUHJlZGljYXRlID0gKGRhdGE6IGFueSwgZmlsdGVyOiBzdHJpbmcpID0+IHtcclxuICAgICAgY29uc3QgZmlsdGVycyA9IEpTT04ucGFyc2UoZmlsdGVyIHx8ICd7fScpO1xyXG5cclxuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZmlsdGVycykpIHtcclxuICAgICAgICBpZiAoIXZhbHVlKSBjb250aW51ZTtcclxuXHJcbiAgICAgICAgc3dpdGNoIChrZXkpIHtcclxuICAgICAgICAgIGNhc2UgJ1VzZXInOlxyXG4gICAgICAgICAgICBjb25zdCBzZWFyY2hUZXJtID0gKHZhbHVlIGFzIHN0cmluZykudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgaWYgKCFkYXRhLnVzZXJOYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoVGVybSkpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlICdTaXRlJzpcclxuICAgICAgICAgICAgaWYgKGRhdGEuc2l0ZU5hbWUgIT09IHRoaXMuZ2V0U2l0ZU5hbWVGcm9tVmFsdWUodmFsdWUgYXMgc3RyaW5nKSkge1xyXG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgJ1VzZXIgVXBncmFkZSBTdGF0dXMnOlxyXG4gICAgICAgICAgICBpZiAoIXRoaXMubWF0Y2hlc1VwZ3JhZGVTdGF0dXMoZGF0YS51cGdyYWRlU3RhdHVzLCB2YWx1ZSBhcyBzdHJpbmcpKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhcHBseUZpbHRlcnMoKSB7XHJcbiAgICB0aGlzLmRhdGEuZmlsdGVyID0gSlNPTi5zdHJpbmdpZnkodGhpcy5hY3RpdmVGaWx0ZXJzKTtcclxuICB9XHJcblxyXG4gIGdldCBmaWx0ZXJlZERhdGFDb3VudCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YT8uZmlsdGVyZWREYXRhPy5sZW5ndGggfHwgMDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0U2l0ZU5hbWVGcm9tVmFsdWUodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAvLyBTaW5jZSB3ZSdyZSBub3cgdXNpbmcgYWN0dWFsIHNpdGUgbmFtZXMsIGp1c3QgY29udmVydCBiYWNrIGZyb20gc2x1ZyBmb3JtYXRcclxuICAgIHJldHVybiB2YWx1ZS5zcGxpdCgnLScpLm1hcCh3b3JkID0+XHJcbiAgICAgIHdvcmQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB3b3JkLnNsaWNlKDEpXHJcbiAgICApLmpvaW4oJyAnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWF0Y2hlc1VwZ3JhZGVTdGF0dXMoc3RhdHVzOiBzdHJpbmcsIGZpbHRlclZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIC8vIEhhbmRsZSBkaXJlY3Qgc3RhdHVzIG1hdGNoaW5nIGZvciBjbGVhbmVyIGltcGxlbWVudGF0aW9uXHJcbiAgICByZXR1cm4gc3RhdHVzLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxzKy9nLCAnLScpID09PSBmaWx0ZXJWYWx1ZS50b0xvd2VyQ2FzZSgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0U3RhdHVzQ2xhc3Moc3RhdHVzOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgc3dpdGNoIChzdGF0dXMudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICBjYXNlICdyZWFkeSc6XHJcbiAgICAgICAgcmV0dXJuICdyZWFkeSc7XHJcbiAgICAgIGNhc2UgJ25vdCByZWFkeSc6XHJcbiAgICAgICAgcmV0dXJuICdub3QtcmVhZHknO1xyXG4gICAgICBjYXNlICdwYXJ0aWFsIHJlYWR5JzpcclxuICAgICAgICByZXR1cm4gJ3BhcnRpYWwtcmVhZHknO1xyXG4gICAgICBjYXNlICdjb21wbGV0ZWQnOlxyXG4gICAgICAgIHJldHVybiAnY29tcGxldGVkJztcclxuICAgICAgY2FzZSAnZmFpbGVkJzpcclxuICAgICAgICByZXR1cm4gJ2ZhaWxlZCc7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuICdub3QtcmVhZHknO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBhZ2VTaXplT3B0aW9ucyA9IFBBR0lOQVRJT05fU0laRV9PUFRJT05TO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgUGFnaW5hdGlvbkRhdGFEdG9JbnRlcmZhY2Uge1xyXG4gIHRvdGFsOiBudW1iZXI7XHJcbiAgcGFnZVNpemVPcHRpb25zOiBudW1iZXJbXTtcclxuICBwYWdlU2l6ZTogbnVtYmVyO1xyXG4gIHBhZ2VJbmRleDogbnVtYmVyO1xyXG59XHJcbmNsYXNzIFBhZ2luYXRpb25EYXRhRHRvIHtcclxuICB0b3RhbCE6IG51bWJlcjtcclxuICBwYWdlU2l6ZU9wdGlvbnMhOiBudW1iZXJbXTtcclxuICBwYWdlU2l6ZSE6IG51bWJlcjtcclxuICBwYWdlSW5kZXghOiBudW1iZXI7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGRhdGE/OiBQYWdpbmF0aW9uRGF0YUR0b0ludGVyZmFjZSkge1xyXG4gICAgdGhpcy5wYWdlU2l6ZU9wdGlvbnMgPSBkYXRhPy5wYWdlU2l6ZU9wdGlvbnMgfHwgUEFHSU5BVElPTl9EQVRBX0RFRkFVTFRTLk9QVElPTlM7XHJcbiAgICB0aGlzLnBhZ2VTaXplID0gZGF0YT8ucGFnZVNpemUgfHwgUEFHSU5BVElPTl9EQVRBX0RFRkFVTFRTLlNJWkU7XHJcbiAgICB0aGlzLnBhZ2VJbmRleCA9IGRhdGE/LnBhZ2VJbmRleCB8fCBQQUdJTkFUSU9OX0RBVEFfREVGQVVMVFMuUEFHRV9JTkRFWDtcclxuICAgIHRoaXMudG90YWwgPSBkYXRhPy50b3RhbCB8fCAwO1xyXG4gIH1cclxufVxyXG5cclxuY29uc3QgUEFHSU5BVElPTl9EQVRBX0RFRkFVTFRTID0ge1xyXG4gIE9QVElPTlM6IFsxMCwgMjAsIDUwLCAxMDBdLFxyXG4gIFNJWkU6IDEwLFxyXG4gIFBBR0VfSU5ERVg6IDBcclxufTtcclxuIiwiPGRpdiAqbmdJZj1cImRhdGFQZW5kaW5nXCIgY2xhc3M9XCJvdmVybGF5XCI+XHJcbiAgPG1hdC1wcm9ncmVzcy1zcGlubmVyXHJcbiAgICBjbGFzcz1cInBhZ2Utc3Bpbm5lclwiXHJcbiAgICBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiXHJcbiAgICBbZGlhbWV0ZXJdPVwiMTIwXCI+PC9tYXQtcHJvZ3Jlc3Mtc3Bpbm5lcj5cclxuPC9kaXY+XHJcblxyXG48ZGl2IGlkPVwidXNlclVwZ3JhZGVEYXRhVGFibGVcIiBjbGFzcz1cIndyYXBwZXJcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJ1c2VyLXVwZ3JhZGUtc3RhdHVzLXdyYXBwZXJcIj5cclxuICAgICAgICA8dGstc3VtbWFyeS1jYXJkIFtkZXNjcmlwdGlvbl09XCInVXNlcnMgYXJlIHJlYWR5IHRvIHVwZ3JhZGUnXCIgW3ZhbHVlXT1cInN0YXR1c0NvdW50c1snUmVhZHknXVwiPjwvdGstc3VtbWFyeS1jYXJkPlxyXG4gICAgICAgIDx0ay1zdW1tYXJ5LWNhcmQgW2Rlc2NyaXB0aW9uXT1cIidVc2VycyBhcmUgbm90IHJlYWR5J1wiIFt2YWx1ZV09XCJzdGF0dXNDb3VudHNbJ05vdCBSZWFkeSddXCIgW3N0YXR1c109XCInTm90IFJlYWR5J1wiPjwvdGstc3VtbWFyeS1jYXJkPlxyXG4gICAgICAgIDx0ay1zdW1tYXJ5LWNhcmQgW2Rlc2NyaXB0aW9uXT1cIidVc2VycyBmYWlsZWQgdG8gdXBncmFkZSdcIiBbdmFsdWVdPVwic3RhdHVzQ291bnRzWydGYWlsZWQnXVwiIFtzdGF0dXNdPVwiJ0ZhaWxlZCdcIj48L3RrLXN1bW1hcnktY2FyZD5cclxuICAgICAgICA8dGstc3VtbWFyeS1jYXJkIFtkZXNjcmlwdGlvbl09XCInU3VjY2Vzc2Z1bGx5IHVwZ3JhZGVkJ1wiIFt2YWx1ZV09XCJzdGF0dXNDb3VudHNbJ0NvbXBsZXRlZCddXCIgW3N0YXR1c109XCInQ29tcGxldGVkJ1wiPjwvdGstc3VtbWFyeS1jYXJkPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwidGFibGUtYWN0aW9uLXBhbmVsXCI+XHJcbiAgICAgICAgPHRrLXRhYmxlLWZpbHRlcnMgKm5nSWY9XCJmaWx0ZXJzLmxlbmd0aCA+IDBcIiBbZmlsdGVyc109XCJmaWx0ZXJzXCIgKGZpbHRlcik9XCJvbkZpbHRlcigkZXZlbnQpXCI+PC90ay10YWJsZS1maWx0ZXJzPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24td3JhcHBlclwiPlxyXG4gICAgICAgICAgICA8c3Bhbj57e2ZpbHRlcmVkRGF0YUNvdW50fX0gVXNlcnM8L3NwYW4+XHJcbiAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgIG1hdC1idXR0b25cclxuICAgICAgICAgICAgICAgIGNsYXNzPVwidXBncmFkZS1idWxrLWJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGggPT09IDBcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInVwZ3JhZGVTZWxlY3RlZFVzZXJzKClcIj5cclxuICAgICAgICAgICAgICAgIFVwZ3JhZGUge3sgc2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aCA9PT0gMCA/ICcnIDogJygnICsgc2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aCArICcpJyB9fVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPHRhYmxlIG1hdC10YWJsZSBbZGF0YVNvdXJjZV09XCJkYXRhXCIgY2xhc3M9XCJ1c2VyLXVwZ3JhZGUtdGFibGVcIj5cclxuXHJcbiAgICAgICAgPCEtLSBDaGVja2JveCBDb2x1bW4gLS0+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJzZWxlY3RcIj5cclxuICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5cclxuICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3hcclxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIiRldmVudCA/IG1hc3RlclRvZ2dsZSgpIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwic2VsZWN0aW9uLmhhc1ZhbHVlKCkgJiYgaXNBbGxTZWxlY3RlZCgpXCJcclxuICAgICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJzZWxlY3Rpb24uaGFzVmFsdWUoKSAmJiAhaXNBbGxTZWxlY3RlZCgpXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImN1c3RvbS1jaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XHJcbiAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3hcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIiRldmVudCA/IHNlbGVjdGlvbi50b2dnbGUocm93KSA6IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInNlbGVjdGlvbi5pc1NlbGVjdGVkKHJvdylcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJTVEFUVVNfRU5UUklFU1tyb3cudXBncmFkZVN0YXR1c10gIT09ICdSZWFkeScgfHwgcm93LnBlbmRpbmdcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3VzdG9tLWNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1jaGVja2JveD5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPCEtLSBVc2VyIENvbHVtbiAtLT5cclxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInVzZXJcIj5cclxuICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5Vc2VyPC90aD5cclxuICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1c2VyLWluZm9cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidXNlci1uYW1lXCI+e3tlbGVtZW50LnVzZXJOYW1lfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidXNlci1lbWFpbFwiPnt7ZWxlbWVudC51c2VyTmFtZX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPCEtLSBTaXRlIENvbHVtbiAtLT5cclxuICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInNpdGVcIj5cclxuICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5TaXRlPC90aD5cclxuICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaXRlLWluZm9cIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNpdGUtaW5kaWNhdG9yXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIFtuZ0NsYXNzXT1cInsnc3RhdHVzLXJlYWR5JzogZWxlbWVudC5kaWFsUGxhblN0YXR1cyA9PT0gJ1JFQURZJ31cIj57e2VsZW1lbnQuc2l0ZU5hbWV9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8IS0tIERldmljZSBDb2x1bW4gLS0+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJkZXZpY2VcIj5cclxuICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5EZXZpY2U8L3RoPlxyXG4gICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIGNsYXNzPVwibXVsdGktZGV2LWJveFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJlbGVtZW50LnNob3dEZXZpY2VzXCIgY2xhc3M9XCJkZXZpY2UtbGlzdCBzaG93LWRldi1saXN0XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBkZXZpY2Ugb2YgZWxlbWVudC5kZXZpY2VzOyBsZXQgbGFzdCA9IGxhc3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRldmljZS1pdGVtXCJcclxuICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm5vLWJvcmRlcl09XCJsYXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV2aWNlLWluZGljYXRvclwiIFtuZ0NsYXNzXT1cInsnZGV2aWNlLWluZGljYXRvci1yZWFkeSc6IGVsZW1lbnQuZGV2aWNlU3RhdHVzID09PSAnUkVBRFknfVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXZpY2UtbmFtZVwiPnt7IGRldmljZS5uYW1lIHx8IGRldmljZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXZpY2UtbW9kZWxcIj57eyBlbGVtZW50LnByaW1hcnlFeHRlbnNpb24gfHwgJ05vIEV4dGVuc2lvbicgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXZpY2UtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJlbGVtZW50LmRldmljZXMubGVuZ3RoID4gMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV2aWNlLW5hbWUtd3JhcHBlciBjbGlja2FibGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cIm9uTXVsdGlwbGVEZXZpY2VzKGVsZW1lbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJvbk11bHRpcGxlRGV2aWNlcyhlbGVtZW50KVwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV2aWNlLW5hbWVcIj5NdWx0aXBsZSBkZXZpY2VzID48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJlbGVtZW50LmRldmljZXMubGVuZ3RoID09PSAxXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXZpY2UtbmFtZS13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldmljZS1pbmRpY2F0b3JcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldmljZS1uYW1lXCI+e3tlbGVtZW50LmRldmljZXNbMF19fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV2aWNlLW1vZGVsXCI+e3sgZWxlbWVudC5wcmltYXJ5RXh0ZW5zaW9uIHx8ICdObyBFeHRlbnNpb24nIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDwhLS0gRGlhbCBQbGFuIFN0YXR1cyBDb2x1bW4gLS0+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJkaWFsUGxhblN0YXR1c1wiPlxyXG4gICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPkRpYWwgUGxhbiBTdGF0dXM8L3RoPlxyXG4gICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0YXR1cy1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0dXMtaW5kaWNhdG9yXCIgW25nQ2xhc3NdPVwiZ2V0U3RhdHVzQ2xhc3MoZWxlbWVudC5kaWFsUGxhblN0YXR1cylcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIFtuZ0NsYXNzXT1cInsnc3RhdHVzLXJlYWR5JzogZWxlbWVudC5kaWFsUGxhblN0YXR1cyA9PT0gJ1JFQURZJ31cIj57e1NUQVRVU19FTlRSSUVTW2VsZW1lbnQuZGlhbFBsYW5TdGF0dXNdfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPCEtLSBEZXBlbmRlbmNpZXMgQ29sdW1uIC0tPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiZGVwZW5kZW5jaWVzXCI+XHJcbiAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+RGVwZW5kZW5jaWVzPC90aD5cclxuICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiREVQRU5ERU5DSUVTX1NUQVRVU1tlbGVtZW50LmRlcGVuZGVuY2llc1N0YXR1c10gPT09ICdEZXBlbmRlbmNpZXMgZm91bmQnXCIgY2xhc3M9XCJkZXBlbmRlbmNpZXMtdGV4dFwiPnt7REVQRU5ERU5DSUVTX1NUQVRVU1tlbGVtZW50LmRlcGVuZGVuY2llc1N0YXR1c119fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiREVQRU5ERU5DSUVTX1NUQVRVU1tlbGVtZW50LmRlcGVuZGVuY2llc1N0YXR1c10gPT09ICdObyBkZXBlbmRlbmNpZXMnXCI+4oCUPC9zcGFuPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8IS0tIFVzZXIgVXBncmFkZSBTdGF0dXMgQ29sdW1uIC0tPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwidXNlclVwZ3JhZGVTdGF0dXNcIj5cclxuICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5Vc2VyIFVwZ3JhZGUgU3RhdHVzPC90aD5cclxuICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1cGdyYWRlLXN0YXR1cy1jZWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlNUQVRVU19FTlRSSUVTW2VsZW1lbnQudXBncmFkZVN0YXR1c10gPT09ICdSZWFkeSc7IGVsc2Ugc3RhdHVzQmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIGNsYXNzPVwidXBncmFkZS1idXR0b25cIiAoY2xpY2spPVwidXBncmFkZVVzZXIoZWxlbWVudClcIj5VcGdyYWRlPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNzdGF0dXNCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0YXR1cy1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cy1pbmRpY2F0b3JcIiBbbmdDbGFzc109XCJnZXRTdGF0dXNDbGFzcyhlbGVtZW50LnVwZ3JhZGVTdGF0dXMpXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3tTVEFUVVNfRU5UUklFU1tlbGVtZW50LnVwZ3JhZGVTdGF0dXNdfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInVzZXJVcGdyYWRlTG9hZGVyXCI+XHJcbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj48L3RoPlxyXG4gICAgICAgIDx0ZCBjbGFzcz1cIm1hdC1wcm9ncmVzcy1zcGlubmVyLXRkXCIgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxyXG5cclxuICAgICAgICAgIDxtYXQtcHJvZ3Jlc3Mtc3Bpbm5lclxyXG4gICAgICAgICAgICAqbmdJZj1cImVsZW1lbnQucGVuZGluZ1wiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiZmllbGQtc3Bpbm5lclwiXHJcbiAgICAgICAgICAgIFtkaWFtZXRlcl09XCIyMFwiXHJcbiAgICAgICAgICAgIG1vZGU9XCJpbmRldGVybWluYXRlXCI+XHJcbiAgICAgICAgICA8L21hdC1wcm9ncmVzcy1zcGlubmVyPlxyXG4gICAgICAgIDwvdGQ+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImRpc3BsYXllZENvbHVtbnNcIj48L3RyPlxyXG4gICAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBkaXNwbGF5ZWRDb2x1bW5zO1wiXHJcbiAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZC1yb3ddPVwic2VsZWN0aW9uLmlzU2VsZWN0ZWQocm93KVwiPjwvdHI+XHJcbiAgICA8L3RhYmxlPlxyXG48L2Rpdj5cclxuXHJcbjxkaXYgY2xhc3M9XCJhcHAtcGFnaW5hdGlvblwiPlxyXG4gIDxtYXQtcGFnaW5hdG9yXHJcbiAgICBbbGVuZ3RoXT1cInBhZ2luYXRpb24udG90YWxcIlxyXG4gICAgW3BhZ2VTaXplXT1cInBhZ2luYXRpb24ucGFnZVNpemVcIlxyXG4gICAgW3BhZ2VTaXplT3B0aW9uc109XCJwYWdpbmF0aW9uLnBhZ2VTaXplT3B0aW9uc1wiXHJcbiAgICBbcGFnZUluZGV4XT1cInBhZ2luYXRpb24ucGFnZUluZGV4XCJcclxuICAgIChwYWdlKT1cInBhZ2VFdmVudCgkZXZlbnQpXCJcclxuICAgIHNob3dGaXJzdExhc3RCdXR0b25zPlxyXG4gIDwvbWF0LXBhZ2luYXRvcj5cclxuXHJcbiAgPCEtLTxkaXYgY2xhc3M9XCJwYWdlLWluZGV4ZXMtYm94XCI+XHJcbiAgICA8bWF0LXBhZ2luYXRvclxyXG4gICAgICBbaWRdPVwiJ2NvbW1vblBhZ2luYXRpb24nXCJcclxuICAgICAgW2hpZGVQYWdlU2l6ZV09XCJ0cnVlXCJcclxuICAgICAgW2xlbmd0aF09XCJwYWdpbmF0aW9uLnRvdGFsXCJcclxuICAgICAgW3BhZ2VJbmRleF09XCJwYWdpbmF0aW9uLnBhZ2VJbmRleFwiXHJcbiAgICAgIFtwYWdlU2l6ZV09XCJwYWdpbmF0aW9uLnBhZ2VTaXplXCJcclxuICAgICAgW3BhZ2VTaXplT3B0aW9uc109XCJwYWdpbmF0aW9uLnBhZ2VTaXplT3B0aW9uc1wiXHJcbiAgICAgIChwYWdlKT1cInBhZ2VFdmVudCgkZXZlbnQpXCI+XHJcbiAgICA8L21hdC1wYWdpbmF0b3I+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJwZXItcGFnZS1ibG9ja1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cIml0ZW1fcGVyX3BhZ2VcIj5JdGVtcyBwZXIgcGFnZTo8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJzZWxlY3QtYm94IHNlbGVjdC1wYWdlLXNpemVcIj5cclxuICAgICAgPG1hdC1zZWxlY3QgKHNlbGVjdGlvbkNoYW5nZSk9XCJjaGFuZ2VQZXJQYWdlTnVtYmVyKCRldmVudClcIiAjcGFnZVxyXG4gICAgICAgICAgICAgICAgICBbaWRdPVwiJ2NvbW1vblBhZ2luYXRpb25TZWxlY3QnXCI+XHJcbiAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBwYWdlU2l6ZU9wdGlvbnM7IGxldCBpID0gaW5kZXg7XCIgW2lkXT1cIidwYWdpbmF0aW9uU2VsZWN0T3B0XycgKyBpXCIgW3ZhbHVlXT1cIm9wdGlvblwiPnt7b3B0aW9ufX08L21hdC1vcHRpb24+XHJcbiAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgIDwvZGl2PlxyXG5cclxuICA8L2Rpdj4tLT5cclxuPC9kaXY+XHJcbiJdfQ==
@@ -0,0 +1,59 @@
1
+ import { NgModule } from "@angular/core";
2
+ import { UserUpgradeDataTableComponent } from "./user-upgrade-data-table/user-upgrade-data-table.component";
3
+ import { CommonModule } from "@angular/common";
4
+ import { MatButtonModule } from "@angular/material/button";
5
+ import { MatTableModule } from "@angular/material/table";
6
+ import { SharedModule } from "../../shared/shared.module";
7
+ import { MatCheckboxModule } from "@angular/material/checkbox";
8
+ import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
9
+ import { MatOptionModule } from '@angular/material/core';
10
+ import { MatPaginatorModule } from '@angular/material/paginator';
11
+ import { MatSelectModule } from '@angular/material/select';
12
+ import * as i0 from "@angular/core";
13
+ export class UserUpgradeModule {
14
+ }
15
+ UserUpgradeModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UserUpgradeModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
16
+ UserUpgradeModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: UserUpgradeModule, declarations: [UserUpgradeDataTableComponent], imports: [CommonModule,
17
+ SharedModule,
18
+ MatTableModule,
19
+ MatButtonModule,
20
+ MatCheckboxModule,
21
+ MatSelectModule,
22
+ MatProgressSpinnerModule,
23
+ MatOptionModule,
24
+ MatPaginatorModule,
25
+ MatSelectModule], exports: [UserUpgradeDataTableComponent] });
26
+ UserUpgradeModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UserUpgradeModule, imports: [CommonModule,
27
+ SharedModule,
28
+ MatTableModule,
29
+ MatButtonModule,
30
+ MatCheckboxModule,
31
+ MatSelectModule,
32
+ MatProgressSpinnerModule,
33
+ MatOptionModule,
34
+ MatPaginatorModule,
35
+ MatSelectModule] });
36
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UserUpgradeModule, decorators: [{
37
+ type: NgModule,
38
+ args: [{
39
+ declarations: [
40
+ UserUpgradeDataTableComponent
41
+ ],
42
+ imports: [
43
+ CommonModule,
44
+ SharedModule,
45
+ MatTableModule,
46
+ MatButtonModule,
47
+ MatCheckboxModule,
48
+ MatSelectModule,
49
+ MatProgressSpinnerModule,
50
+ MatOptionModule,
51
+ MatPaginatorModule,
52
+ MatSelectModule
53
+ ],
54
+ exports: [
55
+ UserUpgradeDataTableComponent
56
+ ]
57
+ }]
58
+ }] });
59
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci11cGdyYWRlLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R1a2kvd2lkZ2V0cy9kaTJtdC93aWRnZXRzL3VzZXItdXBncmFkZS91c2VyLXVwZ3JhZGUubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sNkRBQTZELENBQUM7QUFDNUcsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzFELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7O0FBc0IzRCxNQUFNLE9BQU8saUJBQWlCOzsrR0FBakIsaUJBQWlCO2dIQUFqQixpQkFBaUIsaUJBbEIxQiw2QkFBNkIsYUFHN0IsWUFBWTtRQUNaLFlBQVk7UUFDWixjQUFjO1FBQ2QsZUFBZTtRQUNmLGlCQUFpQjtRQUNqQixlQUFlO1FBQ2Ysd0JBQXdCO1FBQ3hCLGVBQWU7UUFDZixrQkFBa0I7UUFDbEIsZUFBZSxhQUdmLDZCQUE2QjtnSEFHcEIsaUJBQWlCLFlBZjFCLFlBQVk7UUFDWixZQUFZO1FBQ1osY0FBYztRQUNkLGVBQWU7UUFDZixpQkFBaUI7UUFDakIsZUFBZTtRQUNmLHdCQUF3QjtRQUN4QixlQUFlO1FBQ2Ysa0JBQWtCO1FBQ2xCLGVBQWU7NEZBTU4saUJBQWlCO2tCQXBCN0IsUUFBUTttQkFBQztvQkFDUixZQUFZLEVBQUU7d0JBQ1osNkJBQTZCO3FCQUM5QjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1AsWUFBWTt3QkFDWixZQUFZO3dCQUNaLGNBQWM7d0JBQ2QsZUFBZTt3QkFDZixpQkFBaUI7d0JBQ2pCLGVBQWU7d0JBQ2Ysd0JBQXdCO3dCQUN4QixlQUFlO3dCQUNmLGtCQUFrQjt3QkFDbEIsZUFBZTtxQkFDaEI7b0JBQ0QsT0FBTyxFQUFFO3dCQUNQLDZCQUE2QjtxQkFDOUI7aUJBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IFVzZXJVcGdyYWRlRGF0YVRhYmxlQ29tcG9uZW50IH0gZnJvbSBcIi4vdXNlci11cGdyYWRlLWRhdGEtdGFibGUvdXNlci11cGdyYWRlLWRhdGEtdGFibGUuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcclxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2J1dHRvblwiO1xyXG5pbXBvcnQgeyBNYXRUYWJsZU1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC90YWJsZVwiO1xyXG5pbXBvcnQgeyBTaGFyZWRNb2R1bGUgfSBmcm9tIFwiLi4vLi4vc2hhcmVkL3NoYXJlZC5tb2R1bGVcIjtcclxuaW1wb3J0IHsgTWF0Q2hlY2tib3hNb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvY2hlY2tib3hcIjtcclxuaW1wb3J0IHsgTWF0UHJvZ3Jlc3NTcGlubmVyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcHJvZ3Jlc3Mtc3Bpbm5lcic7XHJcbmltcG9ydCB7IE1hdE9wdGlvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXRQYWdpbmF0b3JNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xyXG5pbXBvcnQgeyBNYXRTZWxlY3RNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnO1xyXG5cclxuQE5nTW9kdWxlKHtcclxuICBkZWNsYXJhdGlvbnM6IFtcclxuICAgIFVzZXJVcGdyYWRlRGF0YVRhYmxlQ29tcG9uZW50XHJcbiAgXSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb21tb25Nb2R1bGUsXHJcbiAgICBTaGFyZWRNb2R1bGUsXHJcbiAgICBNYXRUYWJsZU1vZHVsZSxcclxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcclxuICAgIE1hdENoZWNrYm94TW9kdWxlLFxyXG4gICAgTWF0U2VsZWN0TW9kdWxlLFxyXG4gICAgTWF0UHJvZ3Jlc3NTcGlubmVyTW9kdWxlLFxyXG4gICAgTWF0T3B0aW9uTW9kdWxlLFxyXG4gICAgTWF0UGFnaW5hdG9yTW9kdWxlLFxyXG4gICAgTWF0U2VsZWN0TW9kdWxlXHJcbiAgXSxcclxuICBleHBvcnRzOiBbXHJcbiAgICBVc2VyVXBncmFkZURhdGFUYWJsZUNvbXBvbmVudFxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIFVzZXJVcGdyYWRlTW9kdWxlIHtcclxufVxyXG4iXX0=
@@ -0,0 +1,62 @@
1
+ import { inject, Injectable } from "@angular/core";
2
+ import { catchError, of } from "rxjs";
3
+ import { API } from "../../api/api.endpoints";
4
+ import { APIService } from "../../shared/services/api.service";
5
+ import * as i0 from "@angular/core";
6
+ export class UserUpgradeService {
7
+ constructor() {
8
+ this.apiService = inject(APIService);
9
+ }
10
+ // TODO: Impl the user upgrade logic here
11
+ bulkUpgrade(users) {
12
+ const body = this.generateUserUpgradeBody(users);
13
+ console.log('bulkUpgrade', users);
14
+ console.log(body);
15
+ // This is not done yet...
16
+ return this.apiService.post(API.USER_UPGRADE.SINGLE_MIGRATION.replace(':featureName', "PERSON"), body, {}).pipe(catchError((err) => of(err)));
17
+ }
18
+ collectUsers(users) {
19
+ const body = this.generateUserUpgradeBody(users);
20
+ console.log('collectUsers', body);
21
+ // This is not done yet...
22
+ return this.apiService.post(API.USER_UPGRADE.SINGLE_COLLECT.replace(':featureName', 'PERSON'), body, {}).pipe(catchError((err) => of(err)));
23
+ }
24
+ getUsersUpgradeStatuses(users) {
25
+ const body = this.generateUserUpgradeStatusBody(users);
26
+ console.log('getUsersUpgradeStatuses', body);
27
+ // This is not done yet...
28
+ return this.apiService.post(API.USER_UPGRADE.UPGRADE_STATUS.replace(':customerId', this.customerId), body, {}).pipe(catchError((err) => of(err)));
29
+ }
30
+ generateUserUpgradeBody(users) {
31
+ const entities = users.map(record => ({ cucmId: record.cucmId, entityId: record.userId }));
32
+ const customerId = users[0].customerId;
33
+ return {
34
+ customerId,
35
+ entities: {
36
+ PERSON: entities
37
+ }
38
+ };
39
+ }
40
+ generateUserUpgradeStatusBody(users) {
41
+ const body = {};
42
+ body[String(users[0].cucmId)] = users.map(user => String(user.userId));
43
+ return body;
44
+ }
45
+ getUserUpgradeStatusCounts() {
46
+ return this.apiService.fetch(API.USER_UPGRADE.GET_USERS_UPGRADE_STATUS_COUNTS.replace(':customerId', this.customerId));
47
+ }
48
+ getUserUpgradeRecords(pageSize, pageIndex) {
49
+ return this.apiService.fetchPagination(API.USER_UPGRADE.GET_USERS_UPGRADE_DATA.replace(':customerId', this.customerId), pageSize, pageIndex);
50
+ }
51
+ }
52
+ UserUpgradeService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UserUpgradeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
53
+ UserUpgradeService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UserUpgradeService, providedIn: 'root' });
54
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UserUpgradeService, decorators: [{
55
+ type: Injectable,
56
+ args: [{
57
+ providedIn: 'root'
58
+ }]
59
+ }] });
60
+ export class User2UpgradeStatusDTO {
61
+ }
62
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci11cGdyYWRlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90dWtpL3dpZGdldHMvZGkybXQvd2lkZ2V0cy91c2VyLXVwZ3JhZGUvdXNlci11cGdyYWRlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHbkQsT0FBTyxFQUFFLFVBQVUsRUFBbUIsRUFBRSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ25FLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7O0FBTS9ELE1BQU0sT0FBTyxrQkFBa0I7SUFIL0I7UUFJVSxlQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0tBZ0Z6QztJQXpFQyx5Q0FBeUM7SUFDekMsV0FBVyxDQUFDLEtBQTBCO1FBQ3BDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqRCxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUVsQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWxCLDBCQUEwQjtRQUMxQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUN6QixHQUFHLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLEVBQ25FLElBQUksRUFDSixFQUFFLENBQ0gsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxZQUFZLENBQUMsS0FB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Z3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBNYXRUYWJsZURhdGFTb3VyY2UgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGVcIjtcclxuaW1wb3J0IHsgVXNlclVwZ3JhZGVSZWNvcmQgfSBmcm9tIFwiLi90eXBlcy91c2VyLXVwZ3JhZGVcIjtcclxuaW1wb3J0IHsgY2F0Y2hFcnJvciwgbWFwLCBPYnNlcnZhYmxlLCBvZiwgdGhyb3dFcnJvciB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IEFQSSB9IGZyb20gXCIuLi8uLi9hcGkvYXBpLmVuZHBvaW50c1wiO1xyXG5pbXBvcnQgeyBBUElTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NoYXJlZC9zZXJ2aWNlcy9hcGkuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBTdGF0dXMsIFVwZ3JhZGVTdGF0dXMgfSBmcm9tICcuLi8uLi9zaGFyZWQvdHlwZXMvY29uc3RhbnRzJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFVzZXJVcGdyYWRlU2VydmljZSB7XHJcbiAgcHJpdmF0ZSBhcGlTZXJ2aWNlID0gaW5qZWN0KEFQSVNlcnZpY2UpO1xyXG5cclxuICBjdXN0b21lcklkITogc3RyaW5nO1xyXG5cclxuICB1c2Vyc0RhdGFTb3VyY2UhOiBVc2VyVXBncmFkZVJlY29yZFtdO1xyXG4gIGZpbHRlcmVkVXNlcnNEYXRhU291cmNlITogVXNlclVwZ3JhZGVSZWNvcmRbXTtcclxuXHJcbiAgLy8gVE9ETzogSW1wbCB0aGUgdXNlciB1cGdyYWRlIGxvZ2ljIGhlcmVcclxuICBidWxrVXBncmFkZSh1c2VyczogVXNlclVwZ3JhZGVSZWNvcmRbXSk6IE9ic2VydmFibGU8dW5rbm93bj4ge1xyXG4gICAgY29uc3QgYm9keSA9IHRoaXMuZ2VuZXJhdGVVc2VyVXBncmFkZUJvZHkodXNlcnMpO1xyXG4gICAgY29uc29sZS5sb2coJ2J1bGtVcGdyYWRlJywgdXNlcnMpO1xyXG5cclxuICAgIGNvbnNvbGUubG9nKGJvZHkpO1xyXG5cclxuICAgIC8vIFRoaXMgaXMgbm90IGRvbmUgeWV0Li4uXHJcbiAgICByZXR1cm4gdGhpcy5hcGlTZXJ2aWNlLnBvc3QoXHJcbiAgICAgIEFQSS5VU0VSX1VQR1JBREUuU0lOR0xFX01JR1JBVElPTi5yZXBsYWNlKCc6ZmVhdHVyZU5hbWUnLCBcIlBFUlNPTlwiKSxcclxuICAgICAgYm9keSxcclxuICAgICAge31cclxuICAgICkucGlwZShjYXRjaEVycm9yKChlcnIpID0+IG9mKGVycikpKTtcclxuICB9XHJcblxyXG4gIGNvbGxlY3RVc2Vycyh1c2VyczogVXNlclVwZ3JhZGVSZWNvcmRbXSk6IE9ic2VydmFibGU8dW5rbm93bj4ge1xyXG4gICAgY29uc3QgYm9keSA9IHRoaXMuZ2VuZXJhdGVVc2VyVXBncmFkZUJvZHkodXNlcnMpO1xyXG5cclxuICAgIGNvbnNvbGUubG9nKCdjb2xsZWN0VXNlcnMnLCBib2R5KTtcclxuXHJcbiAgICAvLyBUaGlzIGlzIG5vdCBkb25lIHlldC4uLlxyXG4gICAgcmV0dXJuIHRoaXMuYXBpU2VydmljZS5wb3N0KFxyXG4gICAgICBBUEkuVVNFUl9VUEdSQURFLlNJTkdMRV9DT0xMRUNULnJlcGxhY2UoJzpmZWF0dXJlTmFtZScsICdQRVJTT04nKSxcclxuICAgICAgYm9keSxcclxuICAgICAge31cclxuICAgICkucGlwZShjYXRjaEVycm9yKChlcnIpID0+IG9mKGVycikpKTtcclxuICB9XHJcblxyXG4gIGdldFVzZXJzVXBncmFkZVN0YXR1c2VzKHVzZXJzOiBVc2VyVXBncmFkZVJlY29yZFtdKTogT2JzZXJ2YWJsZTxVc2VyMlVwZ3JhZGVTdGF0dXNEVE9bXT4ge1xyXG4gICAgY29uc3QgYm9keSA9IHRoaXMuZ2VuZXJhdGVVc2VyVXBncmFkZVN0YXR1c0JvZHkodXNlcnMpO1xyXG5cclxuICAgIGNvbnNvbGUubG9nKCdnZXRVc2Vyc1VwZ3JhZGVTdGF0dXNlcycsIGJvZHkpO1xyXG5cclxuICAgIC8vIFRoaXMgaXMgbm90IGRvbmUgeWV0Li4uXHJcbiAgICByZXR1cm4gdGhpcy5hcGlTZXJ2aWNlLnBvc3QoXHJcbiAgICAgIEFQSS5VU0VSX1VQR1JBREUuVVBHUkFERV9TVEFUVVMucmVwbGFjZSgnOmN1c3RvbWVySWQnLCB0aGlzLmN1c3RvbWVySWQpLFxyXG4gICAgICBib2R5LFxyXG4gICAgICB7fVxyXG4gICAgKS5waXBlKGNhdGNoRXJyb3IoKGVycikgPT4gb2YoZXJyKSkpO1xyXG4gIH1cclxuXHJcblxyXG4gIGdlbmVyYXRlVXNlclVwZ3JhZGVCb2R5KHVzZXJzOiBVc2VyVXBncmFkZVJlY29yZFtdKTogVXNlclVwZ3JhZGVCb2R5IHtcclxuICAgIGNvbnN0IGVudGl0aWVzID0gdXNlcnMubWFwKHJlY29yZCA9PiAoe2N1Y21JZDogcmVjb3JkLmN1Y21JZCwgZW50aXR5SWQ6IHJlY29yZC51c2VySWR9KSk7XHJcbiAgICBjb25zdCBjdXN0b21lcklkID0gdXNlcnNbMF0uY3VzdG9tZXJJZDtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBjdXN0b21lcklkLFxyXG4gICAgICBlbnRpdGllczoge1xyXG4gICAgICAgIFBFUlNPTjogZW50aXRpZXNcclxuICAgICAgfVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGdlbmVyYXRlVXNlclVwZ3JhZGVTdGF0dXNCb2R5KHVzZXJzOiBVc2VyVXBncmFkZVJlY29yZFtdKTogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+IHtcclxuICAgIGNvbnN0IGJvZHk6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xyXG4gICAgYm9keVtTdHJpbmcodXNlcnNbMF0uY3VjbUlkKV0gPSB1c2Vycy5tYXAodXNlciA9PiBTdHJpbmcodXNlci51c2VySWQpKTtcclxuICAgIHJldHVybiBib2R5O1xyXG4gIH1cclxuXHJcbiAgZ2V0VXNlclVwZ3JhZGVTdGF0dXNDb3VudHMoKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLmFwaVNlcnZpY2UuZmV0Y2goXHJcbiAgICAgIEFQSS5VU0VSX1VQR1JBREUuR0VUX1VTRVJTX1VQR1JBREVfU1RBVFVTX0NPVU5UUy5yZXBsYWNlKCc6Y3VzdG9tZXJJZCcsIHRoaXMuY3VzdG9tZXJJZClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBnZXRVc2VyVXBncmFkZVJlY29yZHMocGFnZVNpemU6IG51bWJlciwgcGFnZUluZGV4OiBudW1iZXIpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYXBpU2VydmljZS5mZXRjaFBhZ2luYXRpb24oXHJcbiAgICAgIEFQSS5VU0VSX1VQR1JBREUuR0VUX1VTRVJTX1VQR1JBREVfREFUQS5yZXBsYWNlKCc6Y3VzdG9tZXJJZCcsIHRoaXMuY3VzdG9tZXJJZCksXHJcbiAgICAgIHBhZ2VTaXplLFxyXG4gICAgICBwYWdlSW5kZXhcclxuICAgICk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgdHlwZSBVc2VyVXBncmFkZUJvZHkgPSB7XHJcbiAgY3VzdG9tZXJJZDogc3RyaW5nO1xyXG4gIGVudGl0aWVzOiB7XHJcbiAgICBQRVJTT046IHsgY3VjbUlkOiBudW1iZXI7IGVudGl0eUlkOiBzdHJpbmcgfVtdO1xyXG4gIH07XHJcbn07XHJcblxyXG5leHBvcnQgY2xhc3MgVXNlcjJVcGdyYWRlU3RhdHVzRFRPIHtcclxuICB1c2VySWQhOiBzdHJpbmc7XHJcbiAgY3VjbUlkITogc3RyaW5nO1xyXG4gIHVwZ3JhZGVTdGF0dXMhOiBTdGF0dXMgfCBVcGdyYWRlU3RhdHVzO1xyXG5cclxufVxyXG4iXX0=