@c8y/ngx-components 1021.67.0 → 1021.71.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (268) hide show
  1. package/branding/shared/lazy/branding-import-modal/branding-import-modal.component.d.ts.map +1 -1
  2. package/core/beta-feature/beta-feature-show-notification.service.d.ts +10 -0
  3. package/core/beta-feature/beta-feature-show-notification.service.d.ts.map +1 -0
  4. package/core/beta-feature/beta-feature.providers.d.ts +3 -0
  5. package/core/beta-feature/beta-feature.providers.d.ts.map +1 -0
  6. package/core/beta-feature/beta-preview-button.component.d.ts +17 -0
  7. package/core/beta-feature/beta-preview-button.component.d.ts.map +1 -0
  8. package/core/beta-feature/beta-preview-drawer.factory.d.ts +19 -0
  9. package/core/beta-feature/beta-preview-drawer.factory.d.ts.map +1 -0
  10. package/core/beta-feature/beta-preview.component.d.ts +25 -0
  11. package/core/beta-feature/beta-preview.component.d.ts.map +1 -0
  12. package/core/beta-feature/beta-preview.model.d.ts +24 -0
  13. package/core/beta-feature/beta-preview.model.d.ts.map +1 -0
  14. package/core/beta-feature/beta-preview.service.d.ts +47 -0
  15. package/core/beta-feature/beta-preview.service.d.ts.map +1 -0
  16. package/core/beta-feature/feature-cache.service.d.ts +26 -0
  17. package/core/beta-feature/feature-cache.service.d.ts.map +1 -0
  18. package/core/beta-feature/feature-state.pipe.d.ts +12 -0
  19. package/core/beta-feature/feature-state.pipe.d.ts.map +1 -0
  20. package/core/beta-feature/index.d.ts +7 -0
  21. package/core/beta-feature/index.d.ts.map +1 -0
  22. package/core/bottom-drawer/bottom-drawer-ref.d.ts.map +1 -1
  23. package/core/bottom-drawer/bottom-drawer.component.d.ts +1 -0
  24. package/core/bottom-drawer/bottom-drawer.component.d.ts.map +1 -1
  25. package/core/bottom-drawer/bottom-drawer.model.d.ts +4 -0
  26. package/core/bottom-drawer/bottom-drawer.model.d.ts.map +1 -1
  27. package/core/common/ApplicationOptions.d.ts +8 -0
  28. package/core/common/ApplicationOptions.d.ts.map +1 -1
  29. package/core/common/bytes.pipe.d.ts +26 -10
  30. package/core/common/bytes.pipe.d.ts.map +1 -1
  31. package/core/common/index.d.ts +1 -0
  32. package/core/common/index.d.ts.map +1 -1
  33. package/core/common/notification-display.service.d.ts +19 -0
  34. package/core/common/notification-display.service.d.ts.map +1 -0
  35. package/core/core.module.d.ts.map +1 -1
  36. package/core/header/header-bar/header-bar.component.d.ts +1 -0
  37. package/core/header/header-bar/header-bar.component.d.ts.map +1 -1
  38. package/core/header/header.service.d.ts +4 -1
  39. package/core/header/header.service.d.ts.map +1 -1
  40. package/core/index.d.ts +1 -0
  41. package/core/index.d.ts.map +1 -1
  42. package/datapoint-explorer/datapoint-explorer-navigation-factory.d.ts +10 -0
  43. package/datapoint-explorer/datapoint-explorer-navigation-factory.d.ts.map +1 -0
  44. package/datapoint-explorer/datapoint-explorer-route-factory.d.ts +10 -0
  45. package/datapoint-explorer/datapoint-explorer-route-factory.d.ts.map +1 -0
  46. package/datapoint-explorer/datapoint-explorer.module.d.ts.map +1 -1
  47. package/echart/charts.component.d.ts +14 -3
  48. package/echart/charts.component.d.ts.map +1 -1
  49. package/esm2022/branding/shared/lazy/branding-import-modal/branding-import-modal.component.mjs +4 -7
  50. package/esm2022/core/beta-feature/beta-feature-show-notification.service.mjs +17 -0
  51. package/esm2022/core/beta-feature/beta-feature.providers.mjs +9 -0
  52. package/esm2022/core/beta-feature/beta-preview-button.component.mjs +53 -0
  53. package/esm2022/core/beta-feature/beta-preview-drawer.factory.mjs +52 -0
  54. package/esm2022/core/beta-feature/beta-preview.component.mjs +64 -0
  55. package/esm2022/core/beta-feature/beta-preview.model.mjs +2 -0
  56. package/esm2022/core/beta-feature/beta-preview.service.mjs +114 -0
  57. package/esm2022/core/beta-feature/feature-cache.service.mjs +48 -0
  58. package/esm2022/core/beta-feature/feature-state.pipe.mjs +22 -0
  59. package/esm2022/core/beta-feature/index.mjs +7 -0
  60. package/esm2022/core/bottom-drawer/bottom-drawer-ref.mjs +4 -1
  61. package/esm2022/core/bottom-drawer/bottom-drawer.component.mjs +4 -3
  62. package/esm2022/core/bottom-drawer/bottom-drawer.model.mjs +1 -1
  63. package/esm2022/core/common/ApplicationOptions.mjs +1 -1
  64. package/esm2022/core/common/bytes.pipe.mjs +47 -18
  65. package/esm2022/core/common/index.mjs +2 -1
  66. package/esm2022/core/common/notification-display.service.mjs +2 -0
  67. package/esm2022/core/core.module.mjs +4 -2
  68. package/esm2022/core/data-grid/data-grid.component.mjs +3 -3
  69. package/esm2022/core/docs/legal-notices-outlet/legal-notices-outlet.component.mjs +3 -3
  70. package/esm2022/core/header/header-bar/header-bar.component.mjs +4 -3
  71. package/esm2022/core/header/header.service.mjs +12 -6
  72. package/esm2022/core/index.mjs +2 -1
  73. package/esm2022/core/user/user-details-drawer/user-details-drawer.component.mjs +3 -3
  74. package/esm2022/core/version/version-list/version-list.component.mjs +3 -3
  75. package/esm2022/datapoint-explorer/datapoint-explorer-navigation-factory.mjs +31 -0
  76. package/esm2022/datapoint-explorer/datapoint-explorer-route-factory.mjs +37 -0
  77. package/esm2022/datapoint-explorer/datapoint-explorer.module.mjs +22 -48
  78. package/esm2022/echart/charts.component.mjs +50 -3
  79. package/esm2022/messaging-management/api/model/backlogQuota.mjs +2 -0
  80. package/esm2022/messaging-management/api/model/namespace.mjs +2 -0
  81. package/esm2022/messaging-management/api/model/namespaceDetails.mjs +2 -0
  82. package/esm2022/messaging-management/api/model/namespaceList.mjs +2 -0
  83. package/esm2022/messaging-management/api/model/namespacePolicies.mjs +2 -0
  84. package/esm2022/messaging-management/api/model/namespacePublishers.mjs +2 -0
  85. package/esm2022/messaging-management/api/model/namespaceSubscribers.mjs +2 -0
  86. package/esm2022/messaging-management/api/model/namespaceTopics.mjs +2 -0
  87. package/esm2022/messaging-management/api/model/pageStatistics.mjs +2 -0
  88. package/esm2022/messaging-management/api/model/pageable.mjs +2 -0
  89. package/esm2022/messaging-management/api/model/sortable.mjs +2 -0
  90. package/esm2022/messaging-management/api/model/subscriber.mjs +2 -0
  91. package/esm2022/messaging-management/api/model/subscriberFilters.mjs +2 -0
  92. package/esm2022/messaging-management/api/model/subscriberList.mjs +2 -0
  93. package/esm2022/messaging-management/api/model/subscriberToDelete.mjs +2 -0
  94. package/esm2022/messaging-management/api/model/topic.mjs +2 -0
  95. package/esm2022/messaging-management/api/model/topicDetailFilters.mjs +2 -0
  96. package/esm2022/messaging-management/api/model/topicList.mjs +2 -0
  97. package/esm2022/messaging-management/api/model/topicListFilters.mjs +2 -0
  98. package/esm2022/messaging-management/api/model/topicType.mjs +9 -0
  99. package/esm2022/messaging-management/api/services/messaging-namespaces.service.mjs +83 -0
  100. package/esm2022/messaging-management/api/services/messaging-subscribers.service.mjs +55 -0
  101. package/esm2022/messaging-management/api/services/messaging-topics.service.mjs +48 -0
  102. package/esm2022/messaging-management/c8y-ngx-components-messaging-management.mjs +5 -0
  103. package/esm2022/messaging-management/constants.mjs +4 -0
  104. package/esm2022/messaging-management/index.mjs +2 -0
  105. package/esm2022/messaging-management/messaging/namespace-list/namespace-item/namespace-item-card/namespace-item-card.component.mjs +43 -0
  106. package/esm2022/messaging-management/messaging/namespace-list/namespace-item/namespace-item.component.mjs +36 -0
  107. package/esm2022/messaging-management/messaging/namespace-list/namespace-list.component.mjs +51 -0
  108. package/esm2022/messaging-management/messaging/shared/usage/usage.component.mjs +68 -0
  109. package/esm2022/messaging-management/messaging/topic/topic-list-view.component.mjs +81 -0
  110. package/esm2022/messaging-management/messaging/topic/topic-subscribers-view/topic-subscribers-data-grid.service.mjs +220 -0
  111. package/esm2022/messaging-management/messaging/topic/topic-subscribers-view/topic-subscribers-view.component.mjs +137 -0
  112. package/esm2022/messaging-management/messaging/topic/topics-data-grid.service.mjs +113 -0
  113. package/esm2022/messaging-management/messaging-management.guard.mjs +40 -0
  114. package/esm2022/messaging-management/messaging-management.module.mjs +72 -0
  115. package/esm2022/messaging-management/navigator/messaging-navigator-factory.mjs +55 -0
  116. package/esm2022/messaging-management/navigator/topic-details-tab.factory.mjs +33 -0
  117. package/esm2022/messaging-management/utils/backlog-quota-limit.pipe.mjs +32 -0
  118. package/esm2022/messaging-management/utils/namespace-props.mjs +23 -0
  119. package/esm2022/messaging-management/utils/time-to-live.pipe.mjs +122 -0
  120. package/esm2022/operations/device-selector/device-selector.component.mjs +5 -1
  121. package/esm2022/register-device/bulk/bulk-device-registration-modal.component.mjs +8 -10
  122. package/esm2022/register-device/general/general-device-registration.component.mjs +8 -10
  123. package/esm2022/trusted-certificates/list/trusted-certificate-list.component.mjs +10 -12
  124. package/esm2022/upgrade/ng1/downgraded.services.mjs +3 -2
  125. package/esm2022/upgrade/ng1/index.mjs +3 -2
  126. package/esm2022/widgets/cockpit-exports/index.mjs +2 -2
  127. package/esm2022/widgets/definitions/datapoints-graph/datapoint-graph-widget-factory.mjs +56 -0
  128. package/esm2022/widgets/definitions/datapoints-graph/index.mjs +12 -29
  129. package/esm2022/widgets/definitions/index.mjs +3 -2
  130. package/esm2022/widgets/implementations/datapoints-graph/datapoints-graph-view/datapoints-graph-widget-view.component.mjs +18 -3
  131. package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs +3 -6
  132. package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs.map +1 -1
  133. package/fesm2022/c8y-ngx-components-datapoint-explorer.mjs +81 -48
  134. package/fesm2022/c8y-ngx-components-datapoint-explorer.mjs.map +1 -1
  135. package/fesm2022/c8y-ngx-components-echart.mjs +49 -2
  136. package/fesm2022/c8y-ngx-components-echart.mjs.map +1 -1
  137. package/fesm2022/c8y-ngx-components-messaging-management.mjs +1225 -0
  138. package/fesm2022/c8y-ngx-components-messaging-management.mjs.map +1 -0
  139. package/fesm2022/c8y-ngx-components-operations-device-selector.mjs +4 -0
  140. package/fesm2022/c8y-ngx-components-operations-device-selector.mjs.map +1 -1
  141. package/fesm2022/c8y-ngx-components-register-device.mjs +10 -14
  142. package/fesm2022/c8y-ngx-components-register-device.mjs.map +1 -1
  143. package/fesm2022/c8y-ngx-components-trusted-certificates.mjs +18 -20
  144. package/fesm2022/c8y-ngx-components-trusted-certificates.mjs.map +1 -1
  145. package/fesm2022/c8y-ngx-components-upgrade.mjs +3 -1
  146. package/fesm2022/c8y-ngx-components-upgrade.mjs.map +1 -1
  147. package/fesm2022/c8y-ngx-components-widgets-cockpit-exports.mjs +1 -1
  148. package/fesm2022/c8y-ngx-components-widgets-cockpit-exports.mjs.map +1 -1
  149. package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-graph.mjs +65 -28
  150. package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-graph.mjs.map +1 -1
  151. package/fesm2022/c8y-ngx-components-widgets-definitions.mjs +2 -1
  152. package/fesm2022/c8y-ngx-components-widgets-definitions.mjs.map +1 -1
  153. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs +17 -2
  154. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs.map +1 -1
  155. package/fesm2022/c8y-ngx-components.mjs +396 -39
  156. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  157. package/locales/de.po +272 -5
  158. package/locales/es.po +271 -4
  159. package/locales/fr.po +272 -5
  160. package/locales/ja_JP.po +272 -5
  161. package/locales/ko.po +271 -4
  162. package/locales/locales.pot +271 -8
  163. package/locales/nl.po +271 -4
  164. package/locales/pl.po +271 -4
  165. package/locales/pt_BR.po +272 -5
  166. package/locales/zh_CN.po +271 -4
  167. package/locales/zh_TW.po +272 -5
  168. package/messaging-management/api/model/backlogQuota.d.ts +14 -0
  169. package/messaging-management/api/model/backlogQuota.d.ts.map +1 -0
  170. package/messaging-management/api/model/namespace.d.ts +13 -0
  171. package/messaging-management/api/model/namespace.d.ts.map +1 -0
  172. package/messaging-management/api/model/namespaceDetails.d.ts +8 -0
  173. package/messaging-management/api/model/namespaceDetails.d.ts.map +1 -0
  174. package/messaging-management/api/model/namespaceList.d.ts +5 -0
  175. package/messaging-management/api/model/namespaceList.d.ts.map +1 -0
  176. package/messaging-management/api/model/namespacePolicies.d.ts +10 -0
  177. package/messaging-management/api/model/namespacePolicies.d.ts.map +1 -0
  178. package/messaging-management/api/model/namespacePublishers.d.ts +4 -0
  179. package/messaging-management/api/model/namespacePublishers.d.ts.map +1 -0
  180. package/messaging-management/api/model/namespaceSubscribers.d.ts +4 -0
  181. package/messaging-management/api/model/namespaceSubscribers.d.ts.map +1 -0
  182. package/messaging-management/api/model/namespaceTopics.d.ts +5 -0
  183. package/messaging-management/api/model/namespaceTopics.d.ts.map +1 -0
  184. package/messaging-management/api/model/pageStatistics.d.ts +12 -0
  185. package/messaging-management/api/model/pageStatistics.d.ts.map +1 -0
  186. package/messaging-management/api/model/pageable.d.ts +8 -0
  187. package/messaging-management/api/model/pageable.d.ts.map +1 -0
  188. package/messaging-management/api/model/sortable.d.ts +6 -0
  189. package/messaging-management/api/model/sortable.d.ts.map +1 -0
  190. package/messaging-management/api/model/subscriber.d.ts +28 -0
  191. package/messaging-management/api/model/subscriber.d.ts.map +1 -0
  192. package/messaging-management/api/model/subscriberFilters.d.ts +13 -0
  193. package/messaging-management/api/model/subscriberFilters.d.ts.map +1 -0
  194. package/messaging-management/api/model/subscriberList.d.ts +7 -0
  195. package/messaging-management/api/model/subscriberList.d.ts.map +1 -0
  196. package/messaging-management/api/model/subscriberToDelete.d.ts +12 -0
  197. package/messaging-management/api/model/subscriberToDelete.d.ts.map +1 -0
  198. package/messaging-management/api/model/topic.d.ts +52 -0
  199. package/messaging-management/api/model/topic.d.ts.map +1 -0
  200. package/messaging-management/api/model/topicDetailFilters.d.ts +9 -0
  201. package/messaging-management/api/model/topicDetailFilters.d.ts.map +1 -0
  202. package/messaging-management/api/model/topicList.d.ts +7 -0
  203. package/messaging-management/api/model/topicList.d.ts.map +1 -0
  204. package/messaging-management/api/model/topicListFilters.d.ts +12 -0
  205. package/messaging-management/api/model/topicListFilters.d.ts.map +1 -0
  206. package/messaging-management/api/model/topicType.d.ts +8 -0
  207. package/messaging-management/api/model/topicType.d.ts.map +1 -0
  208. package/messaging-management/api/services/messaging-namespaces.service.d.ts +52 -0
  209. package/messaging-management/api/services/messaging-namespaces.service.d.ts.map +1 -0
  210. package/messaging-management/api/services/messaging-subscribers.service.d.ts +30 -0
  211. package/messaging-management/api/services/messaging-subscribers.service.d.ts.map +1 -0
  212. package/messaging-management/api/services/messaging-topics.service.d.ts +21 -0
  213. package/messaging-management/api/services/messaging-topics.service.d.ts.map +1 -0
  214. package/messaging-management/c8y-ngx-components-messaging-management.d.ts.map +1 -0
  215. package/messaging-management/constants.d.ts +4 -0
  216. package/messaging-management/constants.d.ts.map +1 -0
  217. package/messaging-management/index.d.ts +2 -0
  218. package/messaging-management/index.d.ts.map +1 -0
  219. package/messaging-management/messaging/namespace-list/namespace-item/namespace-item-card/namespace-item-card.component.d.ts +29 -0
  220. package/messaging-management/messaging/namespace-list/namespace-item/namespace-item-card/namespace-item-card.component.d.ts.map +1 -0
  221. package/messaging-management/messaging/namespace-list/namespace-item/namespace-item.component.d.ts +15 -0
  222. package/messaging-management/messaging/namespace-list/namespace-item/namespace-item.component.d.ts.map +1 -0
  223. package/messaging-management/messaging/namespace-list/namespace-list.component.d.ts +17 -0
  224. package/messaging-management/messaging/namespace-list/namespace-list.component.d.ts.map +1 -0
  225. package/messaging-management/messaging/shared/usage/usage.component.d.ts +40 -0
  226. package/messaging-management/messaging/shared/usage/usage.component.d.ts.map +1 -0
  227. package/messaging-management/messaging/topic/topic-list-view.component.d.ts +38 -0
  228. package/messaging-management/messaging/topic/topic-list-view.component.d.ts.map +1 -0
  229. package/messaging-management/messaging/topic/topic-subscribers-view/topic-subscribers-data-grid.service.d.ts +21 -0
  230. package/messaging-management/messaging/topic/topic-subscribers-view/topic-subscribers-data-grid.service.d.ts.map +1 -0
  231. package/messaging-management/messaging/topic/topic-subscribers-view/topic-subscribers-view.component.d.ts +52 -0
  232. package/messaging-management/messaging/topic/topic-subscribers-view/topic-subscribers-view.component.d.ts.map +1 -0
  233. package/messaging-management/messaging/topic/topics-data-grid.service.d.ts +13 -0
  234. package/messaging-management/messaging/topic/topics-data-grid.service.d.ts.map +1 -0
  235. package/messaging-management/messaging-management.guard.d.ts +12 -0
  236. package/messaging-management/messaging-management.guard.d.ts.map +1 -0
  237. package/messaging-management/messaging-management.module.d.ts +7 -0
  238. package/messaging-management/messaging-management.module.d.ts.map +1 -0
  239. package/messaging-management/navigator/messaging-navigator-factory.d.ts +18 -0
  240. package/messaging-management/navigator/messaging-navigator-factory.d.ts.map +1 -0
  241. package/messaging-management/navigator/topic-details-tab.factory.d.ts +15 -0
  242. package/messaging-management/navigator/topic-details-tab.factory.d.ts.map +1 -0
  243. package/messaging-management/utils/backlog-quota-limit.pipe.d.ts +13 -0
  244. package/messaging-management/utils/backlog-quota-limit.pipe.d.ts.map +1 -0
  245. package/messaging-management/utils/namespace-props.d.ts +10 -0
  246. package/messaging-management/utils/namespace-props.d.ts.map +1 -0
  247. package/messaging-management/utils/time-to-live.pipe.d.ts +16 -0
  248. package/messaging-management/utils/time-to-live.pipe.d.ts.map +1 -0
  249. package/operations/device-selector/device-selector.component.d.ts.map +1 -1
  250. package/package.json +1 -1
  251. package/register-device/bulk/bulk-device-registration-modal.component.d.ts +5 -5
  252. package/register-device/bulk/bulk-device-registration-modal.component.d.ts.map +1 -1
  253. package/register-device/general/general-device-registration.component.d.ts +5 -5
  254. package/register-device/general/general-device-registration.component.d.ts.map +1 -1
  255. package/trusted-certificates/list/trusted-certificate-list.component.d.ts +4 -4
  256. package/trusted-certificates/list/trusted-certificate-list.component.d.ts.map +1 -1
  257. package/upgrade/ng1/downgraded.services.d.ts +1 -0
  258. package/upgrade/ng1/downgraded.services.d.ts.map +1 -1
  259. package/upgrade/ng1/index.d.ts.map +1 -1
  260. package/widgets/cockpit-exports/index.d.ts +1 -1
  261. package/widgets/definitions/datapoints-graph/datapoint-graph-widget-factory.d.ts +11 -0
  262. package/widgets/definitions/datapoints-graph/datapoint-graph-widget-factory.d.ts.map +1 -0
  263. package/widgets/definitions/datapoints-graph/index.d.ts +0 -28
  264. package/widgets/definitions/datapoints-graph/index.d.ts.map +1 -1
  265. package/widgets/definitions/index.d.ts +2 -1
  266. package/widgets/definitions/index.d.ts.map +1 -1
  267. package/widgets/implementations/datapoints-graph/datapoints-graph-view/datapoints-graph-widget-view.component.d.ts +2 -0
  268. package/widgets/implementations/datapoints-graph/datapoints-graph-view/datapoints-graph-widget-view.component.d.ts.map +1 -1
@@ -0,0 +1,81 @@
1
+ import { Component, DestroyRef, EventEmitter, inject } from '@angular/core';
2
+ import { ActivatedRoute, RouterLink } from '@angular/router';
3
+ import { ActionBarItemComponent, AppStateService, BreadcrumbModule, BytesPipe, C8yTranslatePipe, DataGridModule, EmptyStateComponent, EmptyStateContextDirective, gettext, HeaderModule, IconDirective, LoadingComponent } from '@c8y/ngx-components';
4
+ import { AsyncPipe, DecimalPipe, NgClass, NgIf, PercentPipe } from '@angular/common';
5
+ import { MessagingNamespacesService } from '../../api/services/messaging-namespaces.service';
6
+ import { BacklogQuotaLimitPipe } from '../../utils/backlog-quota-limit.pipe';
7
+ import { UsageComponent } from '../shared/usage/usage.component';
8
+ import { TimeToLivePipe } from '../../utils/time-to-live.pipe';
9
+ import { NAMESPACE_PROPS } from '../../utils/namespace-props';
10
+ import { TranslateService } from '@ngx-translate/core';
11
+ import { TopicsDataGridService } from './topics-data-grid.service';
12
+ import { map, shareReplay, switchMap, tap } from 'rxjs/operators';
13
+ import { BehaviorSubject, combineLatest, firstValueFrom } from 'rxjs';
14
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
15
+ import * as i0 from "@angular/core";
16
+ import * as i1 from "@c8y/ngx-components";
17
+ export class TopicListViewComponent {
18
+ constructor() {
19
+ this.route = inject(ActivatedRoute);
20
+ this.appState = inject(AppStateService);
21
+ this.namespacesService = inject(MessagingNamespacesService);
22
+ this.topicsDataGridService = inject(TopicsDataGridService);
23
+ this.translateService = inject(TranslateService);
24
+ this.destroyRef = inject(DestroyRef);
25
+ this.loading$ = new BehaviorSubject(false);
26
+ this.refresh = new EventEmitter();
27
+ this.tenantId$ = this.appState.currentTenant.pipe(map(tenant => tenant.name));
28
+ this.namespaceId$ = this.route.params.pipe(map(params => params['namespace']));
29
+ this.namespaceLabel$ = this.namespaceId$.pipe(map(namespaceId => this.translateService.instant(NAMESPACE_PROPS[namespaceId].label)));
30
+ this.icon$ = this.namespaceId$.pipe(map(namespaceId => NAMESPACE_PROPS[namespaceId].icon));
31
+ this.namespaceDetails$ = combineLatest([this.tenantId$, this.namespaceId$, this.refresh]).pipe(tap(() => this.loading$.next(true)), switchMap(([tenantId, namespaceId]) => this.namespacesService.getNamespaceDetails(tenantId, namespaceId)), tap(() => this.loading$.next(false)), shareReplay(1));
32
+ this.tableTitle = gettext('Topics');
33
+ this.loadingItemsLabel = gettext('Loading topics...');
34
+ this.loadMoreItemsLabel = gettext('Load more topics');
35
+ this.noResultsMessage = gettext('No matching topics found.');
36
+ this.noResultsSubtitle = gettext('Refine your search terms or check your spelling.');
37
+ this.noDataMessage = gettext('No topics to display.');
38
+ this.noDataSubtitle = gettext('Create new topics to monitor them here.');
39
+ this.columns = this.topicsDataGridService.getColumns();
40
+ this.pagination = {
41
+ pageSize: 20,
42
+ currentPage: 1
43
+ };
44
+ this.serverSideDataCallback = this.onDataSourceModifier.bind(this);
45
+ }
46
+ async onDataSourceModifier(dataSourceModifier) {
47
+ return firstValueFrom(combineLatest([this.tenantId$, this.namespaceId$]).pipe(switchMap(([tenantId, namespaceId]) => this.topicsDataGridService.getServerSideData(tenantId, namespaceId, dataSourceModifier))));
48
+ }
49
+ ngAfterViewInit() {
50
+ this.route.params
51
+ .pipe(takeUntilDestroyed(this.destroyRef))
52
+ .subscribe(() => this.refresh.emit());
53
+ }
54
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TopicListViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
55
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TopicListViewComponent, isStandalone: true, selector: "app-topic-list-view", ngImport: i0, template: "<c8y-title>{{ namespaceLabel$ | async }}</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n [icon]=\"'monitoring'\"\n [label]=\"'Monitoring' | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [label]=\"'Messaging service' | translate\"\n [path]=\"'/monitoring/messaging-service'\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item [label]=\"namespaceLabel$ | async\"></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <a\n class=\"btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n (click)=\"refresh.emit()\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': loading$ | async }\"\n ></i>\n {{ 'Reload' | translate }}\n </a>\n</c8y-action-bar-item>\n\n<div class=\"card content-fullpage d-flex d-col\">\n <div class=\"bg-level-1 separator-bottom flex-no-shrink\">\n <div\n class=\"card-block\"\n style=\"min-height: 172px\"\n >\n <div\n class=\"col-md-4 m-b-24 col-xs-12 d-flex p-t-24 gap-16 text-default a-i-center a-s-stretch\"\n >\n <div class=\"text-center d-col\">\n <i\n class=\"m-b-8 icon-40 c8y-icon-duocolor\"\n [c8yIcon]=\"icon$ | async\"\n ></i>\n <span class=\"tag tag--info\">{{ 'Service' | translate }}</span>\n </div>\n <span class=\"h4 text-break-all\">{{ namespaceLabel$ | async }}</span>\n </div>\n <div class=\"col-md-4\">\n <fieldset class=\"c8y-fieldset c8y-fieldset--lg\">\n <legend>\n {{ 'Service usage/limits' | translate }}\n </legend>\n\n <ng-container *ngIf=\"loading$ | async; else serviceUsageLimits\">\n <c8y-loading></c8y-loading>\n </ng-container>\n\n <ng-template #serviceUsageLimits>\n <ng-container *ngIf=\"(namespaceDetails$ | async)?.namespace as namespace\">\n <ul class=\"list-unstyled small animated fadeIn\">\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\n <label class=\"small m-b-0 m-r-auto\">{{ 'Topics' | translate }}</label>\n <ng-container *ngIf=\"namespace?.topics?.limit !== 0\">\n <app-usage\n [count]=\"namespace?.topics?.count\"\n [limit]=\"namespace?.topics?.limit\"\n ></app-usage>\n <span class=\"m-l-16\">\n {{ namespace?.topics?.count | number }} /\n {{ namespace?.topics?.limit | backlogQuotaLimit }}\n </span>\n </ng-container>\n <ng-container *ngIf=\"namespace?.topics?.limit === 0\">\n <span class=\"m-l-16\">{{ namespace?.topics?.count | number }}</span>\n </ng-container>\n </li>\n\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\n <label class=\"small m-b-0 m-r-auto\">{{ 'Subscribers' | translate }}</label>\n <span class=\"m-l-16\">\n {{ namespace?.subscribers?.count | number }}\n </span>\n </li>\n\n <li class=\"p-t-4 p-b-4 d-flex text-nowrap\">\n <label class=\"small m-b-0 m-r-auto\">{{ 'Publishers' | translate }}</label>\n <span class=\"m-l-16\">\n {{ namespace?.publishers?.count | number }}\n </span>\n </li>\n </ul>\n </ng-container>\n </ng-template>\n </fieldset>\n </div>\n <div class=\"col-md-4\">\n <fieldset class=\"c8y-fieldset c8y-fieldset--lg\">\n <legend>{{ 'Service message backlog limits' | translate }}</legend>\n\n <ng-container *ngIf=\"loading$ | async; else serviceMessageBacklogLimits\">\n <c8y-loading></c8y-loading>\n </ng-container>\n\n <ng-template #serviceMessageBacklogLimits>\n <ng-container *ngIf=\"(namespaceDetails$ | async)?.policies as policies\">\n <ul class=\"list-unstyled small animated fadeIn\">\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\n <label class=\"small m-b-0 m-r-auto\">\n {{ 'Backlog quota (per topic)' | translate }}\n </label>\n <span\n title=\"{{\n policies?.backlogQuota?.limit > 0\n ? (policies.backlogQuota.limit | bytes: 0 : true)\n : '-'\n }}\"\n >\n {{\n policies?.backlogQuota?.limit > 0\n ? (policies.backlogQuota.limit | bytes: 0)\n : '-'\n }}\n </span>\n </li>\n\n <li class=\"p-t-4 p-b-4 d-flex text-nowrap\">\n <label class=\"small m-b-0 m-r-auto\">\n {{ 'Backlog time to live (TTL)' | translate }}\n </label>\n <span>{{ policies?.messageTTL | timeToLive }}</span>\n </li>\n </ul>\n </ng-container>\n </ng-template>\n </fieldset>\n </div>\n </div>\n </div>\n\n <c8y-data-grid\n class=\"d-contents\"\n [title]=\"tableTitle | translate\"\n [loadingItemsLabel]=\"loadingItemsLabel | translate\"\n [loadMoreItemsLabel]=\"loadMoreItemsLabel | translate\"\n [columns]=\"columns\"\n [pagination]=\"pagination\"\n [serverSideDataCallback]=\"serverSideDataCallback\"\n [refresh]=\"refresh\"\n [hideReload]=\"true\"\n >\n <c8y-ui-empty-state\n [icon]=\"stats?.size > 0 ? 'search' : 'day-view'\"\n [title]=\"stats?.size > 0 ? (noResultsMessage | translate) : (noDataMessage | translate)\"\n [subtitle]=\"stats?.size > 0 ? (noResultsSubtitle | translate) : (noDataSubtitle | translate)\"\n *emptyStateContext=\"let stats\"\n [horizontal]=\"stats?.size > 0\"\n ></c8y-ui-empty-state>\n\n <c8y-column name=\"name\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <a\n title=\"{{ context.value }}\"\n [routerLink]=\"['topic', context.item.id]\"\n >\n {{ context.value }}\n </a>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"msgRateIn\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value | number }}\">\n {{ context.value | number }}\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"msgRateOut\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value | number }}\">\n {{ context.value | number }}\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"subscribers\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <a\n title=\"{{ context.value | number }}\"\n [routerLink]=\"['topic', context.item.id, 'subscribers']\"\n >\n {{ context.value | number }}\n </a>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"backlogSize\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value | bytes: 2 : true }}\">\n {{ context.value | bytes: 2 }}\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"backlogUsagePercentage\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value / 100 | percent: '1.0-2' }}\">\n {{ context.value / 100 | percent: '1.0-2' }}\n </span>\n </ng-container>\n </c8y-column>\n </c8y-data-grid>\n</div>\n", dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: HeaderModule }, { kind: "component", type: i1.TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "ngmodule", type: DataGridModule }, { kind: "directive", type: i1.CellRendererDefDirective, selector: "[c8yCellRendererDef]" }, { kind: "directive", type: i1.ColumnDirective, selector: "c8y-column", inputs: ["name"] }, { kind: "component", type: i1.DataGridComponent, selector: "c8y-data-grid", inputs: ["title", "loadMoreItemsLabel", "loadingItemsLabel", "showSearch", "refresh", "columns", "rows", "pagination", "infiniteScroll", "serverSideDataCallback", "selectable", "singleSelection", "selectionPrimaryKey", "displayOptions", "actionControls", "bulkActionControls", "headerActionControls", "searchText", "configureColumnsEnabled", "showCounterWarning", "activeClassName", "expandableRows", "hideReload"], outputs: ["rowMouseOver", "rowMouseLeave", "rowClick", "onConfigChange", "onBeforeFilter", "onBeforeSearch", "onFilter", "itemsSelect", "onReload", "onAddCustomColumn", "onRemoveCustomColumn", "onColumnFilterReset", "onSort", "onPageSizeChange", "onColumnReordered", "onColumnVisibilityChange"] }, { kind: "pipe", type: DecimalPipe, name: "number" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: BacklogQuotaLimitPipe, name: "backlogQuotaLimit" }, { kind: "component", type: UsageComponent, selector: "app-usage", inputs: ["count", "limit", "percentage"] }, { kind: "pipe", type: BytesPipe, name: "bytes" }, { kind: "pipe", type: TimeToLivePipe, name: "timeToLive" }, { kind: "ngmodule", type: BreadcrumbModule }, { kind: "component", type: i1.BreadcrumbComponent, selector: "c8y-breadcrumb" }, { kind: "component", type: i1.BreadcrumbItemComponent, selector: "c8y-breadcrumb-item", inputs: ["icon", "translate", "label", "path", "injector"] }, { kind: "component", type: LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "message"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "pipe", type: PercentPipe, name: "percent" }, { kind: "component", type: EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: EmptyStateContextDirective, selector: "[emptyStateContext]" }, { kind: "pipe", type: AsyncPipe, name: "async" }] }); }
56
+ }
57
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TopicListViewComponent, decorators: [{
58
+ type: Component,
59
+ args: [{ imports: [
60
+ RouterLink,
61
+ HeaderModule,
62
+ DataGridModule,
63
+ DecimalPipe,
64
+ C8yTranslatePipe,
65
+ BacklogQuotaLimitPipe,
66
+ UsageComponent,
67
+ BytesPipe,
68
+ TimeToLivePipe,
69
+ BreadcrumbModule,
70
+ LoadingComponent,
71
+ NgIf,
72
+ ActionBarItemComponent,
73
+ NgClass,
74
+ IconDirective,
75
+ PercentPipe,
76
+ EmptyStateComponent,
77
+ EmptyStateContextDirective,
78
+ AsyncPipe
79
+ ], selector: 'app-topic-list-view', standalone: true, template: "<c8y-title>{{ namespaceLabel$ | async }}</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n [icon]=\"'monitoring'\"\n [label]=\"'Monitoring' | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [label]=\"'Messaging service' | translate\"\n [path]=\"'/monitoring/messaging-service'\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item [label]=\"namespaceLabel$ | async\"></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <a\n class=\"btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n (click)=\"refresh.emit()\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': loading$ | async }\"\n ></i>\n {{ 'Reload' | translate }}\n </a>\n</c8y-action-bar-item>\n\n<div class=\"card content-fullpage d-flex d-col\">\n <div class=\"bg-level-1 separator-bottom flex-no-shrink\">\n <div\n class=\"card-block\"\n style=\"min-height: 172px\"\n >\n <div\n class=\"col-md-4 m-b-24 col-xs-12 d-flex p-t-24 gap-16 text-default a-i-center a-s-stretch\"\n >\n <div class=\"text-center d-col\">\n <i\n class=\"m-b-8 icon-40 c8y-icon-duocolor\"\n [c8yIcon]=\"icon$ | async\"\n ></i>\n <span class=\"tag tag--info\">{{ 'Service' | translate }}</span>\n </div>\n <span class=\"h4 text-break-all\">{{ namespaceLabel$ | async }}</span>\n </div>\n <div class=\"col-md-4\">\n <fieldset class=\"c8y-fieldset c8y-fieldset--lg\">\n <legend>\n {{ 'Service usage/limits' | translate }}\n </legend>\n\n <ng-container *ngIf=\"loading$ | async; else serviceUsageLimits\">\n <c8y-loading></c8y-loading>\n </ng-container>\n\n <ng-template #serviceUsageLimits>\n <ng-container *ngIf=\"(namespaceDetails$ | async)?.namespace as namespace\">\n <ul class=\"list-unstyled small animated fadeIn\">\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\n <label class=\"small m-b-0 m-r-auto\">{{ 'Topics' | translate }}</label>\n <ng-container *ngIf=\"namespace?.topics?.limit !== 0\">\n <app-usage\n [count]=\"namespace?.topics?.count\"\n [limit]=\"namespace?.topics?.limit\"\n ></app-usage>\n <span class=\"m-l-16\">\n {{ namespace?.topics?.count | number }} /\n {{ namespace?.topics?.limit | backlogQuotaLimit }}\n </span>\n </ng-container>\n <ng-container *ngIf=\"namespace?.topics?.limit === 0\">\n <span class=\"m-l-16\">{{ namespace?.topics?.count | number }}</span>\n </ng-container>\n </li>\n\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\n <label class=\"small m-b-0 m-r-auto\">{{ 'Subscribers' | translate }}</label>\n <span class=\"m-l-16\">\n {{ namespace?.subscribers?.count | number }}\n </span>\n </li>\n\n <li class=\"p-t-4 p-b-4 d-flex text-nowrap\">\n <label class=\"small m-b-0 m-r-auto\">{{ 'Publishers' | translate }}</label>\n <span class=\"m-l-16\">\n {{ namespace?.publishers?.count | number }}\n </span>\n </li>\n </ul>\n </ng-container>\n </ng-template>\n </fieldset>\n </div>\n <div class=\"col-md-4\">\n <fieldset class=\"c8y-fieldset c8y-fieldset--lg\">\n <legend>{{ 'Service message backlog limits' | translate }}</legend>\n\n <ng-container *ngIf=\"loading$ | async; else serviceMessageBacklogLimits\">\n <c8y-loading></c8y-loading>\n </ng-container>\n\n <ng-template #serviceMessageBacklogLimits>\n <ng-container *ngIf=\"(namespaceDetails$ | async)?.policies as policies\">\n <ul class=\"list-unstyled small animated fadeIn\">\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom text-nowrap\">\n <label class=\"small m-b-0 m-r-auto\">\n {{ 'Backlog quota (per topic)' | translate }}\n </label>\n <span\n title=\"{{\n policies?.backlogQuota?.limit > 0\n ? (policies.backlogQuota.limit | bytes: 0 : true)\n : '-'\n }}\"\n >\n {{\n policies?.backlogQuota?.limit > 0\n ? (policies.backlogQuota.limit | bytes: 0)\n : '-'\n }}\n </span>\n </li>\n\n <li class=\"p-t-4 p-b-4 d-flex text-nowrap\">\n <label class=\"small m-b-0 m-r-auto\">\n {{ 'Backlog time to live (TTL)' | translate }}\n </label>\n <span>{{ policies?.messageTTL | timeToLive }}</span>\n </li>\n </ul>\n </ng-container>\n </ng-template>\n </fieldset>\n </div>\n </div>\n </div>\n\n <c8y-data-grid\n class=\"d-contents\"\n [title]=\"tableTitle | translate\"\n [loadingItemsLabel]=\"loadingItemsLabel | translate\"\n [loadMoreItemsLabel]=\"loadMoreItemsLabel | translate\"\n [columns]=\"columns\"\n [pagination]=\"pagination\"\n [serverSideDataCallback]=\"serverSideDataCallback\"\n [refresh]=\"refresh\"\n [hideReload]=\"true\"\n >\n <c8y-ui-empty-state\n [icon]=\"stats?.size > 0 ? 'search' : 'day-view'\"\n [title]=\"stats?.size > 0 ? (noResultsMessage | translate) : (noDataMessage | translate)\"\n [subtitle]=\"stats?.size > 0 ? (noResultsSubtitle | translate) : (noDataSubtitle | translate)\"\n *emptyStateContext=\"let stats\"\n [horizontal]=\"stats?.size > 0\"\n ></c8y-ui-empty-state>\n\n <c8y-column name=\"name\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <a\n title=\"{{ context.value }}\"\n [routerLink]=\"['topic', context.item.id]\"\n >\n {{ context.value }}\n </a>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"msgRateIn\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value | number }}\">\n {{ context.value | number }}\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"msgRateOut\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value | number }}\">\n {{ context.value | number }}\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"subscribers\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <a\n title=\"{{ context.value | number }}\"\n [routerLink]=\"['topic', context.item.id, 'subscribers']\"\n >\n {{ context.value | number }}\n </a>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"backlogSize\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value | bytes: 2 : true }}\">\n {{ context.value | bytes: 2 }}\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"backlogUsagePercentage\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span title=\"{{ context.value / 100 | percent: '1.0-2' }}\">\n {{ context.value / 100 | percent: '1.0-2' }}\n </span>\n </ng-container>\n </c8y-column>\n </c8y-data-grid>\n</div>\n" }]
80
+ }] });
81
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9waWMtbGlzdC12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL21lc3NhZ2luZy1tYW5hZ2VtZW50L21lc3NhZ2luZy90b3BpYy90b3BpYy1saXN0LXZpZXcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vbWVzc2FnaW5nLW1hbmFnZW1lbnQvbWVzc2FnaW5nL3RvcGljL3RvcGljLWxpc3Qtdmlldy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRixPQUFPLEVBQUUsY0FBYyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzdELE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsZUFBZSxFQUNmLGdCQUFnQixFQUNoQixTQUFTLEVBQ1QsZ0JBQWdCLEVBRWhCLGNBQWMsRUFFZCxtQkFBbUIsRUFDbkIsMEJBQTBCLEVBQzFCLE9BQU8sRUFDUCxZQUFZLEVBQ1osYUFBYSxFQUNiLGdCQUFnQixFQUlqQixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDckYsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDN0YsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDN0UsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0s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SixzQkFBc0IsMEpBQ3RCLE9BQU8sb0ZBQ1AsYUFBYSxzRUFDYixXQUFXLGdEQUNYLG1CQUFtQixvSEFDbkIsMEJBQTBCLDJEQUMxQixTQUFTOzs0RkFNQSxzQkFBc0I7a0JBMUJsQyxTQUFTOzhCQUNDO3dCQUNQLFVBQVU7d0JBQ1YsWUFBWTt3QkFDWixjQUFjO3dCQUNkLFdBQVc7d0JBQ1gsZ0JBQWdCO3dCQUNoQixxQkFBcUI7d0JBQ3JCLGNBQWM7d0JBQ2QsU0FBUzt3QkFDVCxjQUFjO3dCQUNkLGdCQUFnQjt3QkFDaEIsZ0JBQWdCO3dCQUNoQixJQUFJO3dCQUNKLHNCQUFzQjt3QkFDdEIsT0FBTzt3QkFDUCxhQUFhO3dCQUNiLFdBQVc7d0JBQ1gsbUJBQW1CO3dCQUNuQiwwQkFBMEI7d0JBQzFCLFNBQVM7cUJBQ1YsWUFDUyxxQkFBcUIsY0FDbkIsSUFBSSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRGVzdHJveVJlZiwgRXZlbnRFbWl0dGVyLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXJMaW5rIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7XG4gIEFjdGlvbkJhckl0ZW1Db21wb25lbnQsXG4gIEFwcFN0YXRlU2VydmljZSxcbiAgQnJlYWRjcnVtYk1vZHVsZSxcbiAgQnl0ZXNQaXBlLFxuICBDOHlUcmFuc2xhdGVQaXBlLFxuICBDb2x1bW4sXG4gIERhdGFHcmlkTW9kdWxlLFxuICBEYXRhU291cmNlTW9kaWZpZXIsXG4gIEVtcHR5U3RhdGVDb21wb25lbnQsXG4gIEVtcHR5U3RhdGVDb250ZXh0RGlyZWN0aXZlLFxuICBnZXR0ZXh0LFxuICBIZWFkZXJNb2R1bGUsXG4gIEljb25EaXJlY3RpdmUsXG4gIExvYWRpbmdDb21wb25lbnQsXG4gIFBhZ2luYXRpb24sXG4gIFNlcnZlclNpZGVEYXRhQ2FsbGJhY2ssXG4gIFNlcnZlclNpZGVEYXRhUmVzdWx0XG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgQXN5bmNQaXBlLCBEZWNpbWFsUGlwZSwgTmdDbGFzcywgTmdJZiwgUGVyY2VudFBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTWVzc2FnaW5nTmFtZXNwYWNlc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9hcGkvc2VydmljZXMvbWVzc2FnaW5nLW5hbWVzcGFjZXMuc2VydmljZSc7XG5pbXBvcnQgeyBCYWNrbG9nUXVvdGFMaW1pdFBpcGUgfSBmcm9tICcuLi8uLi91dGlscy9iYWNrbG9nLXF1b3RhLWxpbWl0LnBpcGUnO1xuaW1wb3J0IHsgVXNhZ2VDb21wb25lbnQgfSBmcm9tICcuLi9zaGFyZWQvdXNhZ2UvdXNhZ2UuY29tcG9uZW50JztcbmltcG9ydCB7IFRpbWVUb0xpdmVQaXBlIH0gZnJvbSAnLi4vLi4vdXRpbHMvdGltZS10by1saXZlLnBpcGUnO1xuaW1wb3J0IHsgTkFNRVNQQUNFX1BST1BTIH0gZnJvbSAnLi4vLi4vdXRpbHMvbmFtZXNwYWNlLXByb3BzJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IFRvcGljc0RhdGFHcmlkU2VydmljZSB9IGZyb20gJy4vdG9waWNzLWRhdGEtZ3JpZC5zZXJ2aWNlJztcbmltcG9ydCB7IG1hcCwgc2hhcmVSZXBsYXksIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBmaXJzdFZhbHVlRnJvbSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuXG5AQ29tcG9uZW50KHtcbiAgaW1wb3J0czogW1xuICAgIFJvdXRlckxpbmssXG4gICAgSGVhZGVyTW9kdWxlLFxuICAgIERhdGFHcmlkTW9kdWxlLFxuICAgIERlY2ltYWxQaXBlLFxuICAgIEM4eVRyYW5zbGF0ZVBpcGUsXG4gICAgQmFja2xvZ1F1b3RhTGltaXRQaXBlLFxuICAgIFVzYWdlQ29tcG9uZW50LFxuICAgIEJ5dGVzUGlwZSxcbiAgICBUaW1lVG9MaXZlUGlwZSxcbiAgICBCcmVhZGNydW1iTW9kdWxlLFxuICAgIExvYWRpbmdDb21wb25lbnQsXG4gICAgTmdJZixcbiAgICBBY3Rpb25CYXJJdGVtQ29tcG9uZW50LFxuICAgIE5nQ2xhc3MsXG4gICAgSWNvbkRpcmVjdGl2ZSxcbiAgICBQZXJjZW50UGlwZSxcbiAgICBFbXB0eVN0YXRlQ29tcG9uZW50LFxuICAgIEVtcHR5U3RhdGVDb250ZXh0RGlyZWN0aXZlLFxuICAgIEFzeW5jUGlwZVxuICBdLFxuICBzZWxlY3RvcjogJ2FwcC10b3BpYy1saXN0LXZpZXcnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICB0ZW1wbGF0ZVVybDogJy4vdG9waWMtbGlzdC12aWV3LmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBUb3BpY0xpc3RWaWV3Q29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG4gIHJvdXRlID0gaW5qZWN0KEFjdGl2YXRlZFJvdXRlKTtcbiAgYXBwU3RhdGUgPSBpbmplY3QoQXBwU3RhdGVTZXJ2aWNlKTtcbiAgbmFtZXNwYWNlc1NlcnZpY2UgPSBpbmplY3QoTWVzc2FnaW5nTmFtZXNwYWNlc1NlcnZpY2UpO1xuICB0b3BpY3NEYXRhR3JpZFNlcnZpY2UgPSBpbmplY3QoVG9waWNzRGF0YUdyaWRTZXJ2aWNlKTtcbiAgdHJhbnNsYXRlU2VydmljZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcbiAgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcblxuICBsb2FkaW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWZyZXNoID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIHRlbmFudElkJCA9IHRoaXMuYXBwU3RhdGUuY3VycmVudFRlbmFudC5waXBlKG1hcCh0ZW5hbnQgPT4gdGVuYW50Lm5hbWUpKTtcbiAgbmFtZXNwYWNlSWQkID0gdGhpcy5yb3V0ZS5wYXJhbXMucGlwZShtYXAocGFyYW1zID0+IHBhcmFtc1snbmFtZXNwYWNlJ10gYXMgc3RyaW5nKSk7XG4gIG5hbWVzcGFjZUxhYmVsJCA9IHRoaXMubmFtZXNwYWNlSWQkLnBpcGUoXG4gICAgbWFwKG5hbWVzcGFjZUlkID0+IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KE5BTUVTUEFDRV9QUk9QU1tuYW1lc3BhY2VJZF0ubGFiZWwpKVxuICApO1xuICBpY29uJCA9IHRoaXMubmFtZXNwYWNlSWQkLnBpcGUobWFwKG5hbWVzcGFjZUlkID0+IE5BTUVTUEFDRV9QUk9QU1tuYW1lc3BhY2VJZF0uaWNvbikpO1xuXG4gIG5hbWVzcGFjZURldGFpbHMkID0gY29tYmluZUxhdGVzdChbdGhpcy50ZW5hbnRJZCQsIHRoaXMubmFtZXNwYWNlSWQkLCB0aGlzLnJlZnJlc2hdKS5waXBlKFxuICAgIHRhcCgoKSA9PiB0aGlzLmxvYWRpbmckLm5leHQodHJ1ZSkpLFxuICAgIHN3aXRjaE1hcCgoW3RlbmFudElkLCBuYW1lc3BhY2VJZF0pID0+XG4gICAgICB0aGlzLm5hbWVzcGFjZXNTZXJ2aWNlLmdldE5hbWVzcGFjZURldGFpbHModGVuYW50SWQsIG5hbWVzcGFjZUlkKVxuICAgICksXG4gICAgdGFwKCgpID0+IHRoaXMubG9hZGluZyQubmV4dChmYWxzZSkpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgdGFibGVUaXRsZSA9IGdldHRleHQoJ1RvcGljcycpO1xuICBsb2FkaW5nSXRlbXNMYWJlbCA9IGdldHRleHQoJ0xvYWRpbmcgdG9waWNzLi4uJyk7XG4gIGxvYWRNb3JlSXRlbXNMYWJlbCA9IGdldHRleHQoJ0xvYWQgbW9yZSB0b3BpY3MnKTtcbiAgbm9SZXN1bHRzTWVzc2FnZSA9IGdldHRleHQoJ05vIG1hdGNoaW5nIHRvcGljcyBmb3VuZC4nKTtcbiAgbm9SZXN1bHRzU3VidGl0bGUgPSBnZXR0ZXh0KCdSZWZpbmUgeW91ciBzZWFyY2ggdGVybXMgb3IgY2hlY2sgeW91ciBzcGVsbGluZy4nKTtcbiAgbm9EYXRhTWVzc2FnZSA9IGdldHRleHQoJ05vIHRvcGljcyB0byBkaXNwbGF5LicpO1xuICBub0RhdGFTdWJ0aXRsZSA9IGdldHRleHQoJ0NyZWF0ZSBuZXcgdG9waWNzIHRvIG1vbml0b3IgdGhlbSBoZXJlLicpO1xuXG4gIGNvbHVtbnM6IENvbHVtbltdID0gdGhpcy50b3BpY3NEYXRhR3JpZFNlcnZpY2UuZ2V0Q29sdW1ucygpO1xuICBwYWdpbmF0aW9uOiBQYWdpbmF0aW9uID0ge1xuICAgIHBhZ2VTaXplOiAyMCxcbiAgICBjdXJyZW50UGFnZTogMVxuICB9O1xuXG4gIHNlcnZlclNpZGVEYXRhQ2FsbGJhY2s6IFNlcnZlclNpZGVEYXRhQ2FsbGJhY2sgPSB0aGlzLm9uRGF0YVNvdXJjZU1vZGlmaWVyLmJpbmQodGhpcyk7XG4gIGFzeW5jIG9uRGF0YVNvdXJjZU1vZGlmaWVyKFxuICAgIGRhdGFTb3VyY2VNb2RpZmllcjogRGF0YVNvdXJjZU1vZGlmaWVyXG4gICk6IFByb21pc2U8U2VydmVyU2lkZURhdGFSZXN1bHQ+IHtcbiAgICByZXR1cm4gZmlyc3RWYWx1ZUZyb20oXG4gICAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLnRlbmFudElkJCwgdGhpcy5uYW1lc3BhY2VJZCRdKS5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKFt0ZW5hbnRJZCwgbmFtZXNwYWNlSWRdKSA9PlxuICAgICAgICAgIHRoaXMudG9waWNzRGF0YUdyaWRTZXJ2aWNlLmdldFNlcnZlclNpZGVEYXRhKHRlbmFudElkLCBuYW1lc3BhY2VJZCwgZGF0YVNvdXJjZU1vZGlmaWVyKVxuICAgICAgICApXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLnJvdXRlLnBhcmFtc1xuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMucmVmcmVzaC5lbWl0KCkpO1xuICB9XG59XG4iLCI8Yzh5LXRpdGxlPnt7IG5hbWVzcGFjZUxhYmVsJCB8IGFzeW5jIH19PC9jOHktdGl0bGU+XG5cbjxjOHktYnJlYWRjcnVtYj5cbiAgPGM4eS1icmVhZGNydW1iLWl0ZW1cbiAgICBbaWNvbl09XCInbW9uaXRvcmluZydcIlxuICAgIFtsYWJlbF09XCInTW9uaXRvcmluZycgfCB0cmFuc2xhdGVcIlxuICA+PC9jOHktYnJlYWRjcnVtYi1pdGVtPlxuICA8Yzh5LWJyZWFkY3J1bWItaXRlbVxuICAgIFtsYWJlbF09XCInTWVzc2FnaW5nIHNlcnZpY2UnIHwgdHJhbnNsYXRlXCJcbiAgICBbcGF0aF09XCInL21vbml0b3JpbmcvbWVzc2FnaW5nLXNlcnZpY2UnXCJcbiAgPjwvYzh5LWJyZWFkY3J1bWItaXRlbT5cbiAgPGM4eS1icmVhZGNydW1iLWl0ZW0gW2xhYmVsXT1cIm5hbWVzcGFjZUxhYmVsJCB8IGFzeW5jXCI+PC9jOHktYnJlYWRjcnVtYi1pdGVtPlxuPC9jOHktYnJlYWRjcnVtYj5cblxuPGM4eS1hY3Rpb24tYmFyLWl0ZW0gW3BsYWNlbWVudF09XCIncmlnaHQnXCI+XG4gIDxhXG4gICAgY2xhc3M9XCJidG4gYnRuLWxpbmtcIlxuICAgIHRpdGxlPVwie3sgJ1JlbG9hZCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgIChjbGljayk9XCJyZWZyZXNoLmVtaXQoKVwiXG4gID5cbiAgICA8aVxuICAgICAgYzh5SWNvbj1cInJlZnJlc2hcIlxuICAgICAgW25nQ2xhc3NdPVwieyAnaWNvbi1zcGluJzogbG9hZGluZyQgfCBhc3luYyB9XCJcbiAgICA+PC9pPlxuICAgIHt7ICdSZWxvYWQnIHwgdHJhbnNsYXRlIH19XG4gIDwvYT5cbjwvYzh5LWFjdGlvbi1iYXItaXRlbT5cblxuPGRpdiBjbGFzcz1cImNhcmQgY29udGVudC1mdWxscGFnZSBkLWZsZXggZC1jb2xcIj5cbiAgPGRpdiBjbGFzcz1cImJnLWxldmVsLTEgc2VwYXJhdG9yLWJvdHRvbSBmbGV4LW5vLXNocmlua1wiPlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiY2FyZC1ibG9ja1wiXG4gICAgICBzdHlsZT1cIm1pbi1oZWlnaHQ6IDE3MnB4XCJcbiAgICA+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiY29sLW1kLTQgbS1iLTI0IGNvbC14cy0xMiBkLWZsZXggcC10LTI0IGdhcC0xNiB0ZXh0LWRlZmF1bHQgYS1pLWNlbnRlciBhLXMtc3RyZXRjaFwiXG4gICAgICA+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlciBkLWNvbFwiPlxuICAgICAgICAgIDxpXG4gICAgICAgICAgICBjbGFzcz1cIm0tYi04IGljb24tNDAgYzh5LWljb24tZHVvY29sb3JcIlxuICAgICAgICAgICAgW2M4eUljb25dPVwiaWNvbiQgfCBhc3luY1wiXG4gICAgICAgICAgPjwvaT5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRhZyB0YWctLWluZm9cIj57eyAnU2VydmljZScgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8c3BhbiBjbGFzcz1cImg0IHRleHQtYnJlYWstYWxsXCI+e3sgbmFtZXNwYWNlTGFiZWwkIHwgYXN5bmMgfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPlxuICAgICAgICA8ZmllbGRzZXQgY2xhc3M9XCJjOHktZmllbGRzZXQgYzh5LWZpZWxkc2V0LS1sZ1wiPlxuICAgICAgICAgIDxsZWdlbmQ+XG4gICAgICAgICAgICB7eyAnU2VydmljZSB1c2FnZS9saW1pdHMnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9sZWdlbmQ+XG5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibG9hZGluZyQgfCBhc3luYzsgZWxzZSBzZXJ2aWNlVXNhZ2VMaW1pdHNcIj5cbiAgICAgICAgICAgIDxjOHktbG9hZGluZz48L2M4eS1sb2FkaW5nPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNzZXJ2aWNlVXNhZ2VMaW1pdHM+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKG5hbWVzcGFjZURldGFpbHMkIHwgYXN5bmMpPy5uYW1lc3BhY2UgYXMgbmFtZXNwYWNlXCI+XG4gICAgICAgICAgICAgIDx1bCBjbGFzcz1cImxpc3QtdW5zdHlsZWQgc21hbGwgYW5pbWF0ZWQgZmFkZUluXCI+XG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwicC10LTQgcC1iLTQgZC1mbGV4IHNlcGFyYXRvci1ib3R0b20gdGV4dC1ub3dyYXBcIj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInNtYWxsIG0tYi0wIG0tci1hdXRvXCI+e3sgJ1RvcGljcycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5hbWVzcGFjZT8udG9waWNzPy5saW1pdCAhPT0gMFwiPlxuICAgICAgICAgICAgICAgICAgICA8YXBwLXVzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgW2NvdW50XT1cIm5hbWVzcGFjZT8udG9waWNzPy5jb3VudFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2xpbWl0XT1cIm5hbWVzcGFjZT8udG9waWNzPy5saW1pdFwiXG4gICAgICAgICAgICAgICAgICAgID48L2FwcC11c2FnZT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtLWwtMTZcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBuYW1lc3BhY2U/LnRvcGljcz8uY291bnQgfCBudW1iZXIgfX0gL1xuICAgICAgICAgICAgICAgICAgICAgIHt7IG5hbWVzcGFjZT8udG9waWNzPy5saW1pdCB8IGJhY2tsb2dRdW90YUxpbWl0IH19XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5hbWVzcGFjZT8udG9waWNzPy5saW1pdCA9PT0gMFwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm0tbC0xNlwiPnt7IG5hbWVzcGFjZT8udG9waWNzPy5jb3VudCB8IG51bWJlciB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbGk+XG5cbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJwLXQtNCBwLWItNCBkLWZsZXggc2VwYXJhdG9yLWJvdHRvbSB0ZXh0LW5vd3JhcFwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic21hbGwgbS1iLTAgbS1yLWF1dG9cIj57eyAnU3Vic2NyaWJlcnMnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibS1sLTE2XCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IG5hbWVzcGFjZT8uc3Vic2NyaWJlcnM/LmNvdW50IHwgbnVtYmVyIH19XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9saT5cblxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cInAtdC00IHAtYi00IGQtZmxleCB0ZXh0LW5vd3JhcFwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic21hbGwgbS1iLTAgbS1yLWF1dG9cIj57eyAnUHVibGlzaGVycycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtLWwtMTZcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgbmFtZXNwYWNlPy5wdWJsaXNoZXJzPy5jb3VudCB8IG51bWJlciB9fVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2ZpZWxkc2V0PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj5cbiAgICAgICAgPGZpZWxkc2V0IGNsYXNzPVwiYzh5LWZpZWxkc2V0IGM4eS1maWVsZHNldC0tbGdcIj5cbiAgICAgICAgICA8bGVnZW5kPnt7ICdTZXJ2aWNlIG1lc3NhZ2UgYmFja2xvZyBsaW1pdHMnIHwgdHJhbnNsYXRlIH19PC9sZWdlbmQ+XG5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibG9hZGluZyQgfCBhc3luYzsgZWxzZSBzZXJ2aWNlTWVzc2FnZUJhY2tsb2dMaW1pdHNcIj5cbiAgICAgICAgICAgIDxjOHktbG9hZGluZz48L2M4eS1sb2FkaW5nPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNzZXJ2aWNlTWVzc2FnZUJhY2tsb2dMaW1pdHM+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKG5hbWVzcGFjZURldGFpbHMkIHwgYXN5bmMpPy5wb2xpY2llcyBhcyBwb2xpY2llc1wiPlxuICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJsaXN0LXVuc3R5bGVkIHNtYWxsIGFuaW1hdGVkIGZhZGVJblwiPlxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cInAtdC00IHAtYi00IGQtZmxleCBzZXBhcmF0b3ItYm90dG9tIHRleHQtbm93cmFwXCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJzbWFsbCBtLWItMCBtLXItYXV0b1wiPlxuICAgICAgICAgICAgICAgICAgICB7eyAnQmFja2xvZyBxdW90YSAocGVyIHRvcGljKScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7XG4gICAgICAgICAgICAgICAgICAgICAgcG9saWNpZXM/LmJhY2tsb2dRdW90YT8ubGltaXQgPiAwXG4gICAgICAgICAgICAgICAgICAgICAgICA/IChwb2xpY2llcy5iYWNrbG9nUXVvdGEubGltaXQgfCBieXRlczogMCA6IHRydWUpXG4gICAgICAgICAgICAgICAgICAgICAgICA6ICctJ1xuICAgICAgICAgICAgICAgICAgICB9fVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgcG9saWNpZXM/LmJhY2tsb2dRdW90YT8ubGltaXQgPiAwXG4gICAgICAgICAgICAgICAgICAgICAgICA/IChwb2xpY2llcy5iYWNrbG9nUXVvdGEubGltaXQgfCBieXRlczogMClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogJy0nXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9saT5cblxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cInAtdC00IHAtYi00IGQtZmxleCB0ZXh0LW5vd3JhcFwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic21hbGwgbS1iLTAgbS1yLWF1dG9cIj5cbiAgICAgICAgICAgICAgICAgICAge3sgJ0JhY2tsb2cgdGltZSB0byBsaXZlIChUVEwpJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IHBvbGljaWVzPy5tZXNzYWdlVFRMIHwgdGltZVRvTGl2ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9maWVsZHNldD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8Yzh5LWRhdGEtZ3JpZFxuICAgIGNsYXNzPVwiZC1jb250ZW50c1wiXG4gICAgW3RpdGxlXT1cInRhYmxlVGl0bGUgfCB0cmFuc2xhdGVcIlxuICAgIFtsb2FkaW5nSXRlbXNMYWJlbF09XCJsb2FkaW5nSXRlbXNMYWJlbCB8IHRyYW5zbGF0ZVwiXG4gICAgW2xvYWRNb3JlSXRlbXNMYWJlbF09XCJsb2FkTW9yZUl0ZW1zTGFiZWwgfCB0cmFuc2xhdGVcIlxuICAgIFtjb2x1bW5zXT1cImNvbHVtbnNcIlxuICAgIFtwYWdpbmF0aW9uXT1cInBhZ2luYXRpb25cIlxuICAgIFtzZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrXT1cInNlcnZlclNpZGVEYXRhQ2FsbGJhY2tcIlxuICAgIFtyZWZyZXNoXT1cInJlZnJlc2hcIlxuICAgIFtoaWRlUmVsb2FkXT1cInRydWVcIlxuICA+XG4gICAgPGM4eS11aS1lbXB0eS1zdGF0ZVxuICAgICAgW2ljb25dPVwic3RhdHM/LnNpemUgPiAwID8gJ3NlYXJjaCcgOiAnZGF5LXZpZXcnXCJcbiAgICAgIFt0aXRsZV09XCJzdGF0cz8uc2l6ZSA+IDAgPyAobm9SZXN1bHRzTWVzc2FnZSB8IHRyYW5zbGF0ZSkgOiAobm9EYXRhTWVzc2FnZSB8IHRyYW5zbGF0ZSlcIlxuICAgICAgW3N1YnRpdGxlXT1cInN0YXRzPy5zaXplID4gMCA/IChub1Jlc3VsdHNTdWJ0aXRsZSB8IHRyYW5zbGF0ZSkgOiAobm9EYXRhU3VidGl0bGUgfCB0cmFuc2xhdGUpXCJcbiAgICAgICplbXB0eVN0YXRlQ29udGV4dD1cImxldCBzdGF0c1wiXG4gICAgICBbaG9yaXpvbnRhbF09XCJzdGF0cz8uc2l6ZSA+IDBcIlxuICAgID48L2M4eS11aS1lbXB0eS1zdGF0ZT5cblxuICAgIDxjOHktY29sdW1uIG5hbWU9XCJuYW1lXCI+XG4gICAgICA8bmctY29udGFpbmVyICpjOHlDZWxsUmVuZGVyZXJEZWY9XCJsZXQgY29udGV4dFwiPlxuICAgICAgICA8YVxuICAgICAgICAgIHRpdGxlPVwie3sgY29udGV4dC52YWx1ZSB9fVwiXG4gICAgICAgICAgW3JvdXRlckxpbmtdPVwiWyd0b3BpYycsIGNvbnRleHQuaXRlbS5pZF1cIlxuICAgICAgICA+XG4gICAgICAgICAge3sgY29udGV4dC52YWx1ZSB9fVxuICAgICAgICA8L2E+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2M4eS1jb2x1bW4+XG5cbiAgICA8Yzh5LWNvbHVtbiBuYW1lPVwibXNnUmF0ZUluXCI+XG4gICAgICA8bmctY29udGFpbmVyICpjOHlDZWxsUmVuZGVyZXJEZWY9XCJsZXQgY29udGV4dFwiPlxuICAgICAgICA8c3BhbiB0aXRsZT1cInt7IGNvbnRleHQudmFsdWUgfCBudW1iZXIgfX1cIj5cbiAgICAgICAgICB7eyBjb250ZXh0LnZhbHVlIHwgbnVtYmVyIH19XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvYzh5LWNvbHVtbj5cblxuICAgIDxjOHktY29sdW1uIG5hbWU9XCJtc2dSYXRlT3V0XCI+XG4gICAgICA8bmctY29udGFpbmVyICpjOHlDZWxsUmVuZGVyZXJEZWY9XCJsZXQgY29udGV4dFwiPlxuICAgICAgICA8c3BhbiB0aXRsZT1cInt7IGNvbnRleHQudmFsdWUgfCBudW1iZXIgfX1cIj5cbiAgICAgICAgICB7eyBjb250ZXh0LnZhbHVlIHwgbnVtYmVyIH19XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvYzh5LWNvbHVtbj5cblxuICAgIDxjOHktY29sdW1uIG5hbWU9XCJzdWJzY3JpYmVyc1wiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqYzh5Q2VsbFJlbmRlcmVyRGVmPVwibGV0IGNvbnRleHRcIj5cbiAgICAgICAgPGFcbiAgICAgICAgICB0aXRsZT1cInt7IGNvbnRleHQudmFsdWUgfCBudW1iZXIgfX1cIlxuICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cIlsndG9waWMnLCBjb250ZXh0Lml0ZW0uaWQsICdzdWJzY3JpYmVycyddXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGNvbnRleHQudmFsdWUgfCBudW1iZXIgfX1cbiAgICAgICAgPC9hPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9jOHktY29sdW1uPlxuXG4gICAgPGM4eS1jb2x1bW4gbmFtZT1cImJhY2tsb2dTaXplXCI+XG4gICAgICA8bmctY29udGFpbmVyICpjOHlDZWxsUmVuZGVyZXJEZWY9XCJsZXQgY29udGV4dFwiPlxuICAgICAgICA8c3BhbiB0aXRsZT1cInt7IGNvbnRleHQudmFsdWUgfCBieXRlczogMiA6IHRydWUgfX1cIj5cbiAgICAgICAgICB7eyBjb250ZXh0LnZhbHVlIHwgYnl0ZXM6IDIgfX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9jOHktY29sdW1uPlxuXG4gICAgPGM4eS1jb2x1bW4gbmFtZT1cImJhY2tsb2dVc2FnZVBlcmNlbnRhZ2VcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKmM4eUNlbGxSZW5kZXJlckRlZj1cImxldCBjb250ZXh0XCI+XG4gICAgICAgIDxzcGFuIHRpdGxlPVwie3sgY29udGV4dC52YWx1ZSAvIDEwMCB8IHBlcmNlbnQ6ICcxLjAtMicgfX1cIj5cbiAgICAgICAgICB7eyBjb250ZXh0LnZhbHVlIC8gMTAwIHwgcGVyY2VudDogJzEuMC0yJyB9fVxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2M4eS1jb2x1bW4+XG4gIDwvYzh5LWRhdGEtZ3JpZD5cbjwvZGl2PlxuIl19
@@ -0,0 +1,220 @@
1
+ import { inject, Injectable } from '@angular/core';
2
+ import { AlertService, BaseColumn, gettext, ModalService, Status } from '@c8y/ngx-components';
3
+ import { MessagingSubscribersService } from '../../../api/services/messaging-subscribers.service';
4
+ import { TranslateService } from '@ngx-translate/core';
5
+ import * as i0 from "@angular/core";
6
+ export class TopicSubscribersDataGridService {
7
+ constructor() {
8
+ this.subscribersService = inject(MessagingSubscribersService);
9
+ this.alertService = inject(AlertService);
10
+ this.modalService = inject(ModalService);
11
+ this.translateService = inject(TranslateService);
12
+ }
13
+ getColumns() {
14
+ return [
15
+ this.createColumn({
16
+ name: 'name',
17
+ header: gettext('Name'),
18
+ path: 'name',
19
+ filterable: true,
20
+ filteringConfig: {
21
+ fields: [
22
+ {
23
+ key: 'name',
24
+ type: 'input',
25
+ props: {
26
+ label: gettext('Filter subscribers by partial name'),
27
+ placeholder: 'mySubscriber',
28
+ required: true
29
+ }
30
+ }
31
+ ],
32
+ getFilter(model) {
33
+ return model.name;
34
+ }
35
+ }
36
+ }),
37
+ this.createColumn({
38
+ name: 'activeClients',
39
+ header: gettext('Connected clients'),
40
+ path: 'activeClients'
41
+ }),
42
+ this.createColumn({
43
+ name: 'messageAckRate',
44
+ header: gettext('Acknowledgment rate (msg/s)'),
45
+ path: 'messageAckRate'
46
+ }),
47
+ this.createColumn({
48
+ name: 'lastAcknowledgeDate',
49
+ header: gettext('Last acknowledged'),
50
+ path: 'lastAcknowledgeDate',
51
+ sortingConfig: {
52
+ pathSortingConfigs: [
53
+ {
54
+ path: 'lastAcknowledgeTimestamp'
55
+ }
56
+ ]
57
+ }
58
+ }),
59
+ this.createColumn({
60
+ name: 'unackMsgBacklog',
61
+ header: gettext('Unacknowledged messages'),
62
+ path: 'unackMsgBacklog'
63
+ }),
64
+ this.createColumn({
65
+ name: 'backlogUsagePercentage',
66
+ header: gettext('Used backlog'),
67
+ path: 'backlogUsagePercentage',
68
+ sortOrder: 'desc'
69
+ })
70
+ ];
71
+ }
72
+ async getServerSideData(tenantId, namespaceId, topicId, topicType, dataSourceModifier) {
73
+ const subscriberFilters = this.getSubscriberFilters(tenantId, namespaceId, topicId, topicType, dataSourceModifier);
74
+ const { res, data, paging } = await this.subscribersService.list(subscriberFilters);
75
+ const filteredSize = paging.totalElements;
76
+ const size = (await this.subscribersService.list({
77
+ ...subscriberFilters,
78
+ currentPage: 1,
79
+ pageSize: 1
80
+ })).paging.totalPages;
81
+ return {
82
+ res,
83
+ data: data.map(subscriber => ({
84
+ ...subscriber,
85
+ lastAcknowledgeDate: this.getLastAcknowledgeDate(subscriber),
86
+ id: subscriber.name
87
+ })),
88
+ paging,
89
+ size,
90
+ filteredSize
91
+ };
92
+ }
93
+ async unsubscribeSubscriber(subscriber, refreshCallback) {
94
+ const confirmationTitle = gettext('Unsubscribe "{{ subscriberName }}"?');
95
+ const confirmationMessage = subscriber.activeClients > 0
96
+ ? gettext('You are about to unsubscribe "{{ subscriberName }}" which has active clients. Do you want to proceed?')
97
+ : gettext('You are about to unsubscribe "{{ subscriberName }}". Do you want to proceed?');
98
+ try {
99
+ const subscriberName = subscriber.name;
100
+ await this.modalService.confirm(this.translateService.instant(confirmationTitle, {
101
+ subscriberName
102
+ }), this.translateService.instant(confirmationMessage, {
103
+ subscriberName
104
+ }), Status.DANGER, {
105
+ ok: gettext('Unsubscribe')
106
+ });
107
+ }
108
+ catch (e) {
109
+ // cancel
110
+ return;
111
+ }
112
+ try {
113
+ await this.subscribersService.delete(subscriber);
114
+ this.alertService.success(this.translateService.instant(gettext('Subscriber "{{ subscriberName }}" unsubscribed.'), {
115
+ subscriberName: subscriber.name
116
+ }));
117
+ }
118
+ catch (error) {
119
+ this.alertService.addServerFailure(error);
120
+ }
121
+ refreshCallback();
122
+ }
123
+ async bulkUnsubscribeSubscribers(subscribers, refreshCallback) {
124
+ const anySubscriberHasActiveClients = subscribers.some(subscriber => subscriber.activeClients > 0);
125
+ const confirmationTitle = gettext('Unsubscribe {{ numberOfSubscribers }} subscribers?');
126
+ const confirmationMessage = anySubscriberHasActiveClients
127
+ ? gettext('You are about to unsubscribe {{ numberOfSubscribers }} subscribers. Some of them have active clients. Do you want to proceed?')
128
+ : gettext('You are about to unsubscribe {{ numberOfSubscribers }} subscribers. Do you want to proceed?');
129
+ try {
130
+ const numberOfSubscribers = subscribers.length;
131
+ await this.modalService.confirm(this.translateService.instant(confirmationTitle, {
132
+ numberOfSubscribers
133
+ }), this.translateService.instant(confirmationMessage, {
134
+ numberOfSubscribers
135
+ }), Status.DANGER, {
136
+ ok: gettext('Unsubscribe')
137
+ });
138
+ }
139
+ catch (e) {
140
+ // cancel
141
+ return;
142
+ }
143
+ const results = await Promise.allSettled(subscribers.map(sub => this.subscribersService
144
+ .delete(sub)
145
+ .then(() => ({
146
+ success: true,
147
+ name: sub.name
148
+ }))
149
+ .catch(error => ({
150
+ success: false,
151
+ name: sub.name,
152
+ error
153
+ }))));
154
+ const failed = results
155
+ .filter(result => result.status === 'fulfilled' && result.value.success === false)
156
+ .map(result => result.value);
157
+ const succeeded = results
158
+ .filter(result => result.status === 'fulfilled' && result.value.success === true)
159
+ .map(result => result.value);
160
+ if (failed.length === 0) {
161
+ this.alertService.success(this.translateService.instant(gettext('{{ numberOfSubscribers }} subscribers unsubscribed.'), { numberOfSubscribers: succeeded.length }));
162
+ }
163
+ else if (succeeded.length === 0) {
164
+ const errorMessage = this.translateService.instant(gettext('Failed to unsubscribe {{ numberOfSubscribers }} subscribers.'), {
165
+ numberOfSubscribers: failed.length
166
+ });
167
+ const details = `${failed.map(f => `'${f.name}': ${f.error.data.message}`).join('\n')}`;
168
+ this.alertService.danger(errorMessage, details);
169
+ }
170
+ else {
171
+ // Some succeeded, some failed
172
+ const nonUnsubscribedSubscribers = failed.map(s => s.name).join(', ');
173
+ const message = this.translateService.instant(gettext(`Successfully unsubscribed {{ count }} subscribers.<br/>Failed to unsubscribe: {{ nonUnsubscribedSubscribers }}.`), { count: succeeded.length, nonUnsubscribedSubscribers });
174
+ const details = `${failed.map(f => `'${f.name}': ${f.error.data.message}`).join('\n')}`;
175
+ this.alertService.warning(message, details);
176
+ }
177
+ refreshCallback();
178
+ }
179
+ createColumn(columnProps) {
180
+ const column = new BaseColumn();
181
+ Object.assign(column, columnProps);
182
+ return column;
183
+ }
184
+ getSubscriberFilters(tenantId, namespaceId, topicId, topicType, dataSourceModifier) {
185
+ const subscriberFilters = {
186
+ tenant: tenantId,
187
+ namespace: namespaceId,
188
+ topic: topicId,
189
+ type: topicType,
190
+ currentPage: dataSourceModifier.pagination.currentPage,
191
+ pageSize: dataSourceModifier.pagination.pageSize
192
+ };
193
+ return dataSourceModifier.columns.reduce((subscriberFilters, column) => {
194
+ if (column.filterable) {
195
+ if (column.filterPredicate) {
196
+ subscriberFilters[column.path] = column.filterPredicate;
197
+ }
198
+ if (column.externalFilterQuery) {
199
+ subscriberFilters[column.path] = column.filteringConfig.getFilter(column.externalFilterQuery);
200
+ }
201
+ }
202
+ if (column.sortable && column.sortOrder) {
203
+ const sortPath = column.sortingConfig?.pathSortingConfigs?.[0]?.path || column.path;
204
+ subscriberFilters.sort = `${sortPath},${column.sortOrder}`;
205
+ }
206
+ return subscriberFilters;
207
+ }, subscriberFilters);
208
+ }
209
+ getLastAcknowledgeDate(subscriber) {
210
+ const lastAcknowledgeDate = new Date(subscriber.lastAcknowledgeTimestamp);
211
+ return lastAcknowledgeDate.getTime() > 0 ? lastAcknowledgeDate : null;
212
+ }
213
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TopicSubscribersDataGridService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
214
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TopicSubscribersDataGridService, providedIn: 'root' }); }
215
+ }
216
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TopicSubscribersDataGridService, decorators: [{
217
+ type: Injectable,
218
+ args: [{ providedIn: 'root' }]
219
+ }] });
220
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9waWMtc3Vic2NyaWJlcnMtZGF0YS1ncmlkLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9tZXNzYWdpbmctbWFuYWdlbWVudC9tZXNzYWdpbmcvdG9waWMvdG9waWMtc3Vic2NyaWJlcnMtdmlldy90b3BpYy1zdWJzY3JpYmVycy1kYXRhLWdyaWQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQ0wsWUFBWSxFQUNaLFVBQVUsRUFHVixPQUFPLEVBQ1AsWUFBWSxFQUVaLE1BQU0sRUFDUCxNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBSWxHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDOztBQUl2RCxNQUFNLE9BQU8sK0JBQStCO0lBRDVDO1FBRVksdUJBQWtCLEdBQUcsTUFBTSxDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDM0QsaUJBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDcEMsaUJBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDcEMscUJBQWdCLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7S0EwUnJEO0lBeFJDLFVBQVU7UUFDUixPQUFPO1lBQ0wsSUFBSSxDQUFDLFlBQVksQ0FBQztnQkFDaEIsSUFBSSxFQUFFLE1BQU07Z0JBQ1osTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUM7Z0JBQ3ZCLElBQUksRUFBRSxNQUFNO2dCQUNaLFVBQVUsRUFBRSxJQUFJO2dCQUNoQixlQUFlLEVBQUU7b0JBQ2YsTUFBTSxFQUFFO3dCQUNOOzRCQUNFLEdBQUcsRUFBRSxNQUFNOzRCQUNYLElBQUksRUFBRSxPQUFPOzRCQUNiLEtBQUssRUFBRTtnQ0FDTCxLQUFLLEVBQUUsT0FBTyxDQUFDLG9DQUFvQyxDQUFDO2dDQUNwRCxXQUFXLEVBQUUsY0FBYztnQ0FDM0IsUUFBUSxFQUFFLElBQUk7NkJBQ2Y7eUJBQ0Y7cUJBQ0Y7b0JBQ0QsU0FBUyxDQUFDLEtBQXVCO3dCQUMvQixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUM7b0JBQ3BCLENBQUM7aUJBQ0Y7YUFDRixDQUFDO1lBQ0YsSUFBSSxDQUFDLFlBQVksQ0FBQztnQkFDaEIsSUFBSSxFQUFFLGVBQWU7Z0JBQ3JCLE1BQU0sRUFBRSxPQUFPLENBQUMsbUJBQW1CLENBQUM7Z0JBQ3BDLElBQUksRUFBRSxlQUFlO2FBQ3RCLENBQUM7WUFDRixJQUFJLENBQUMsWUFBWSxDQUFDO2dCQUNoQixJQUFJLEVBQUUsZ0JBQWdCO2dCQUN0QixNQUFNLEVBQUUsT0FBTyxDQUFDLDZCQUE2QixDQUFDO2dCQUM5QyxJQUFJLEVBQUUsZ0JBQWdCO2FBQ3ZCLENBQUM7WUFDRixJQUFJLENBQUMsWUFBWSxDQUFDO2dCQUNoQixJQUFJLEVBQUUscUJBQXFCO2dCQUMzQixNQUFNLEVBQUUsT0FBTyxDQUFDLG1CQUFtQixDQUFDO2dCQUNwQyxJQUFJLEVBQUUscUJBQXFCO2dCQUMzQixhQUFhLEVBQUU7b0JBQ2Isa0JBQWtCLEVBQUU7d0JBQ2xCOzRCQUNFLElBQUksRUFBRSwwQkFBMEI7eUJBQ2pDO3FCQUNGO2lCQUNGO2FBQ0YsQ0FBQztZQUNGLElBQUksQ0FBQyxZQUFZLENBQUM7Z0JBQ2hCLElBQUksRUFBRSxpQkFBaUI7Z0JBQ3ZCLE1BQU0sRUFBRSxPQUFPLENBQUMseUJBQXlCLENBQUM7Z0JBQzFDLElBQUksRUFBRSxpQkFBaUI7YUFDeEIsQ0FBQztZQUNGLElBQUksQ0FBQyxZQUFZLENBQUM7Z0JBQ2hCLElBQUksRUFBRSx3QkFBd0I7Z0JBQzlCLE1BQU0sRUFBRSxPQUFPLENBQUMsY0FBYyxDQUFDO2dCQUMvQixJQUFJLEVBQUUsd0JBQXdCO2dCQUM5QixTQUFTLEVBQUUsTUFBTTthQUNsQixDQUFDO1NBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMsaUJBQWlCLENBQ3JCLFFBQWdCLEVBQ2hCLFdBQW1CLEVBQ25CLE9BQWUsRUFDZixTQUE2QixFQUM3QixrQkFBc0M7UUFFdEMsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQ2pELFFBQVEsRUFDUixXQUFXLEVBQ1gsT0FBTyxFQUNQLFNBQVMsRUFDVCxrQkFBa0IsQ0FDbkIsQ0FBQztRQUNGLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3BGLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUM7UUFDMUMsTUFBTSxJQUFJLEdBQUcsQ0FDWCxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUM7WUFDakMsR0FBRyxpQkFBaUI7WUFDcEIsV0FBVyxFQUFFLENBQUM7WUFDZCxRQUFRLEVBQUUsQ0FBQztTQUNaLENBQUMsQ0FDSCxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUM7UUFFcEIsT0FBTztZQUNMLEdBQUc7WUFDSCxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzVCLEdBQUcsVUFBVTtnQkFDYixtQkFBbUIsRUFBRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsVUFBVSxDQUFDO2dCQUM1RCxFQUFFLEVBQUUsVUFBVSxDQUFDLElBQUk7YUFDcEIsQ0FBQyxDQUFDO1lBQ0gsTUFBTTtZQUNOLElBQUk7WUFDSixZQUFZO1NBQ2IsQ0FBQztJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMscUJBQXFCLENBQ3pCLFVBQXVDLEVBQ3ZDLGVBQTJCO1FBRTNCLE1BQU0saUJBQWlCLEdBQUcsT0FBTyxDQUFDLHFDQUFxQyxDQUFDLENBQUM7UUFDekUsTUFBTSxtQkFBbUIsR0FDdkIsVUFBVSxDQUFDLGFBQWEsR0FBRyxDQUFDO1lBQzFCLENBQUMsQ0FBQyxPQUFPLENBQ0wsdUdBQXVHLENBQ3hHO1lBQ0gsQ0FBQyxDQUFDLE9BQU8sQ0FBQyw4RUFBOEUsQ0FBQyxDQUFDO1FBQzlGLElBQUksQ0FBQztZQUNILE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUM7WUFDdkMsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FDN0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRTtnQkFDL0MsY0FBYzthQUNmLENBQUMsRUFDRixJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLG1CQUFtQixFQUFFO2dCQUNqRCxjQUFjO2FBQ2YsQ0FBQyxFQUNGLE1BQU0sQ0FBQyxNQUFNLEVBQ2I7Z0JBQ0UsRUFBRSxFQUFFLE9BQU8sQ0FBQyxhQUFhLENBQUM7YUFDM0IsQ0FDRixDQUFDO1FBQ0osQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxTQUFTO1lBQ1QsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUM7WUFDSCxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDakQsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQ3ZCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGlEQUFpRCxDQUFDLEVBQUU7Z0JBQ3hGLGNBQWMsRUFBRSxVQUFVLENBQUMsSUFBSTthQUNoQyxDQUFDLENBQ0gsQ0FBQztRQUNKLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QyxDQUFDO1FBQ0QsZUFBZSxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVELEtBQUssQ0FBQywwQkFBMEIsQ0FDOUIsV0FBMEMsRUFDMUMsZUFBMkI7UUFFM0IsTUFBTSw2QkFBNkIsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUNwRCxVQUFVLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUMzQyxDQUFDO1FBRUYsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsb0RBQW9ELENBQUMsQ0FBQztRQUN4RixNQUFNLG1CQUFtQixHQUFHLDZCQUE2QjtZQUN2RCxDQUFDLENBQUMsT0FBTyxDQUNMLCtIQUErSCxDQUNoSTtZQUNILENBQUMsQ0FBQyxPQUFPLENBQ0wsNkZBQTZGLENBQzlGLENBQUM7UUFFTixJQUFJLENBQUM7WUFDSCxNQUFNLG1CQUFtQixHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUM7WUFDL0MsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FDN0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRTtnQkFDL0MsbUJBQW1CO2FBQ3BCLENBQUMsRUFDRixJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLG1CQUFtQixFQUFFO2dCQUNqRCxtQkFBbUI7YUFDcEIsQ0FBQyxFQUNGLE1BQU0sQ0FBQyxNQUFNLEVBQ2I7Z0JBQ0UsRUFBRSxFQUFFLE9BQU8sQ0FBQyxhQUFhLENBQUM7YUFDM0IsQ0FDRixDQUFDO1FBQ0osQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxTQUFTO1lBQ1QsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQyxVQUFVLENBQ3RDLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FDcEIsSUFBSSxDQUFDLGtCQUFrQjthQUNwQixNQUFNLENBQUMsR0FBRyxDQUFDO2FBQ1gsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDWCxPQUFPLEVBQUUsSUFBSTtZQUNiLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSTtTQUNmLENBQUMsQ0FBQzthQUNGLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDZixPQUFPLEVBQUUsS0FBSztZQUNkLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSTtZQUNkLEtBQUs7U0FDTixDQUFDLENBQUMsQ0FDTixDQUNGLENBQUM7UUFFRixNQUFNLE1BQU0sR0FBRyxPQUFPO2FBQ25CLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssV0FBVyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxLQUFLLEtBQUssQ0FBQzthQUNqRixHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBRSxNQUFzQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWhFLE1BQU0sU0FBUyxHQUFHLE9BQU87YUFDdEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxXQUFXLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDO2FBQ2hGLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFFLE1BQXNDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFaEUsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUN2QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUMzQixPQUFPLENBQUMscURBQXFELENBQUMsRUFDOUQsRUFBRSxtQkFBbUIsRUFBRSxTQUFTLENBQUMsTUFBTSxFQUFFLENBQzFDLENBQ0YsQ0FBQztRQUNKLENBQUM7YUFBTSxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FDaEQsT0FBTyxDQUFDLDhEQUE4RCxDQUFDLEVBQ3ZFO2dCQUNFLG1CQUFtQixFQUFFLE1BQU0sQ0FBQyxNQUFNO2FBQ25DLENBQ0YsQ0FBQztZQUNGLE1BQU0sT0FBTyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3hGLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNsRCxDQUFDO2FBQU0sQ0FBQztZQUNOLDhCQUE4QjtZQUM5QixNQUFNLDBCQUEwQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3RFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQzNDLE9BQU8sQ0FDTCxpSEFBaUgsQ0FDbEgsRUFDRCxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsTUFBTSxFQUFFLDBCQUEwQixFQUFFLENBQ3hELENBQUM7WUFDRixNQUFNLE9BQU8sR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN4RixJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUVELGVBQWUsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFFTyxZQUFZLENBQUMsV0FBZ0M7UUFDbkQsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUNoQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztRQUNuQyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRU8sb0JBQW9CLENBQzFCLFFBQWdCLEVBQ2hCLFdBQW1CLEVBQ25CLE9BQWUsRUFDZixTQUE2QixFQUM3QixrQkFBc0M7UUFFdEMsTUFBTSxpQkFBaUIsR0FBK0I7WUFDcEQsTUFBTSxFQUFFLFFBQVE7WUFDaEIsU0FBUyxFQUFFLFdBQVc7WUFDdEIsS0FBSyxFQUFFLE9BQU87WUFDZCxJQUFJLEVBQUUsU0FBUztZQUNmLFdBQVcsRUFBRSxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsV0FBVztZQUN0RCxRQUFRLEVBQUUsa0JBQWtCLENBQUMsVUFBVSxDQUFDLFFBQVE7U0FDakQsQ0FBQztRQUVGLE9BQU8sa0JBQWtCLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3JFLElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUN0QixJQUFJLE1BQU0sQ0FBQyxlQUFlLEVBQUUsQ0FBQztvQkFDM0IsaUJBQWlCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUM7Z0JBQzFELENBQUM7Z0JBRUQsSUFBSSxNQUFNLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztvQkFDL0IsaUJBQWlCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUMvRCxNQUFNLENBQUMsbUJBQW1CLENBQzNCLENBQUM7Z0JBQ0osQ0FBQztZQUNILENBQUM7WUFFRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUN4QyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsYUFBYSxFQUFFLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUM7Z0JBQ3BGLGlCQUFpQixDQUFDLElBQUksR0FBRyxHQUFHLFFBQVEsSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDN0QsQ0FBQztZQUVELE9BQU8saUJBQWlCLENBQUM7UUFDM0IsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVPLHNCQUFzQixDQUFDLFVBQStCO1FBQzVELE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDMUUsT0FBTyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDeEUsQ0FBQzsrR0E3UlUsK0JBQStCO21IQUEvQiwrQkFBK0IsY0FEbEIsTUFBTTs7NEZBQ25CLCtCQUErQjtrQkFEM0MsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFsZXJ0U2VydmljZSxcbiAgQmFzZUNvbHVtbixcbiAgQ29sdW1uLFxuICBEYXRhU291cmNlTW9kaWZpZXIsXG4gIGdldHRleHQsXG4gIE1vZGFsU2VydmljZSxcbiAgU2VydmVyU2lkZURhdGFSZXN1bHQsXG4gIFN0YXR1c1xufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IE1lc3NhZ2luZ1N1YnNjcmliZXJzU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2FwaS9zZXJ2aWNlcy9tZXNzYWdpbmctc3Vic2NyaWJlcnMuc2VydmljZSc7XG5pbXBvcnQgeyBNZXNzYWdpbmdUb3BpY1R5cGUgfSBmcm9tICcuLi8uLi8uLi9hcGkvbW9kZWwvdG9waWNUeXBlJztcbmltcG9ydCB7IE1lc3NhZ2luZ1N1YnNjcmliZXJGaWx0ZXJzIH0gZnJvbSAnLi4vLi4vLi4vYXBpL21vZGVsL3N1YnNjcmliZXJGaWx0ZXJzJztcbmltcG9ydCB7IE1lc3NhZ2luZ1N1YnNjcmliZXIgfSBmcm9tICcuLi8uLi8uLi9hcGkvbW9kZWwvc3Vic2NyaWJlcic7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBNZXNzYWdpbmdTdWJzY3JpYmVyVG9EZWxldGUgfSBmcm9tICcuLi8uLi8uLi9hcGkvbW9kZWwvc3Vic2NyaWJlclRvRGVsZXRlJztcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBUb3BpY1N1YnNjcmliZXJzRGF0YUdyaWRTZXJ2aWNlIHtcbiAgcHJvdGVjdGVkIHN1YnNjcmliZXJzU2VydmljZSA9IGluamVjdChNZXNzYWdpbmdTdWJzY3JpYmVyc1NlcnZpY2UpO1xuICBwcml2YXRlIGFsZXJ0U2VydmljZSA9IGluamVjdChBbGVydFNlcnZpY2UpO1xuICBwcml2YXRlIG1vZGFsU2VydmljZSA9IGluamVjdChNb2RhbFNlcnZpY2UpO1xuICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2UgPSBpbmplY3QoVHJhbnNsYXRlU2VydmljZSk7XG5cbiAgZ2V0Q29sdW1ucygpOiBDb2x1bW5bXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHRoaXMuY3JlYXRlQ29sdW1uKHtcbiAgICAgICAgbmFtZTogJ25hbWUnLFxuICAgICAgICBoZWFkZXI6IGdldHRleHQoJ05hbWUnKSxcbiAgICAgICAgcGF0aDogJ25hbWUnLFxuICAgICAgICBmaWx0ZXJhYmxlOiB0cnVlLFxuICAgICAgICBmaWx0ZXJpbmdDb25maWc6IHtcbiAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2V5OiAnbmFtZScsXG4gICAgICAgICAgICAgIHR5cGU6ICdpbnB1dCcsXG4gICAgICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICAgICAgbGFiZWw6IGdldHRleHQoJ0ZpbHRlciBzdWJzY3JpYmVycyBieSBwYXJ0aWFsIG5hbWUnKSxcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogJ215U3Vic2NyaWJlcicsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIF0sXG4gICAgICAgICAgZ2V0RmlsdGVyKG1vZGVsOiB7IG5hbWU6IHN0cmluZyB9KTogc3RyaW5nIHtcbiAgICAgICAgICAgIHJldHVybiBtb2RlbC5uYW1lO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICB0aGlzLmNyZWF0ZUNvbHVtbih7XG4gICAgICAgIG5hbWU6ICdhY3RpdmVDbGllbnRzJyxcbiAgICAgICAgaGVhZGVyOiBnZXR0ZXh0KCdDb25uZWN0ZWQgY2xpZW50cycpLFxuICAgICAgICBwYXRoOiAnYWN0aXZlQ2xpZW50cydcbiAgICAgIH0pLFxuICAgICAgdGhpcy5jcmVhdGVDb2x1bW4oe1xuICAgICAgICBuYW1lOiAnbWVzc2FnZUFja1JhdGUnLFxuICAgICAgICBoZWFkZXI6IGdldHRleHQoJ0Fja25vd2xlZGdtZW50IHJhdGUgKG1zZy9zKScpLFxuICAgICAgICBwYXRoOiAnbWVzc2FnZUFja1JhdGUnXG4gICAgICB9KSxcbiAgICAgIHRoaXMuY3JlYXRlQ29sdW1uKHtcbiAgICAgICAgbmFtZTogJ2xhc3RBY2tub3dsZWRnZURhdGUnLFxuICAgICAgICBoZWFkZXI6IGdldHRleHQoJ0xhc3QgYWNrbm93bGVkZ2VkJyksXG4gICAgICAgIHBhdGg6ICdsYXN0QWNrbm93bGVkZ2VEYXRlJyxcbiAgICAgICAgc29ydGluZ0NvbmZpZzoge1xuICAgICAgICAgIHBhdGhTb3J0aW5nQ29uZmlnczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBwYXRoOiAnbGFzdEFja25vd2xlZGdlVGltZXN0YW1wJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICB0aGlzLmNyZWF0ZUNvbHVtbih7XG4gICAgICAgIG5hbWU6ICd1bmFja01zZ0JhY2tsb2cnLFxuICAgICAgICBoZWFkZXI6IGdldHRleHQoJ1VuYWNrbm93bGVkZ2VkIG1lc3NhZ2VzJyksXG4gICAgICAgIHBhdGg6ICd1bmFja01zZ0JhY2tsb2cnXG4gICAgICB9KSxcbiAgICAgIHRoaXMuY3JlYXRlQ29sdW1uKHtcbiAgICAgICAgbmFtZTogJ2JhY2tsb2dVc2FnZVBlcmNlbnRhZ2UnLFxuICAgICAgICBoZWFkZXI6IGdldHRleHQoJ1VzZWQgYmFja2xvZycpLFxuICAgICAgICBwYXRoOiAnYmFja2xvZ1VzYWdlUGVyY2VudGFnZScsXG4gICAgICAgIHNvcnRPcmRlcjogJ2Rlc2MnXG4gICAgICB9KVxuICAgIF07XG4gIH1cblxuICBhc3luYyBnZXRTZXJ2ZXJTaWRlRGF0YShcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIG5hbWVzcGFjZUlkOiBzdHJpbmcsXG4gICAgdG9waWNJZDogc3RyaW5nLFxuICAgIHRvcGljVHlwZTogTWVzc2FnaW5nVG9waWNUeXBlLFxuICAgIGRhdGFTb3VyY2VNb2RpZmllcjogRGF0YVNvdXJjZU1vZGlmaWVyXG4gICk6IFByb21pc2U8U2VydmVyU2lkZURhdGFSZXN1bHQ+IHtcbiAgICBjb25zdCBzdWJzY3JpYmVyRmlsdGVycyA9IHRoaXMuZ2V0U3Vic2NyaWJlckZpbHRlcnMoXG4gICAgICB0ZW5hbnRJZCxcbiAgICAgIG5hbWVzcGFjZUlkLFxuICAgICAgdG9waWNJZCxcbiAgICAgIHRvcGljVHlwZSxcbiAgICAgIGRhdGFTb3VyY2VNb2RpZmllclxuICAgICk7XG4gICAgY29uc3QgeyByZXMsIGRhdGEsIHBhZ2luZyB9ID0gYXdhaXQgdGhpcy5zdWJzY3JpYmVyc1NlcnZpY2UubGlzdChzdWJzY3JpYmVyRmlsdGVycyk7XG4gICAgY29uc3QgZmlsdGVyZWRTaXplID0gcGFnaW5nLnRvdGFsRWxlbWVudHM7XG4gICAgY29uc3Qgc2l6ZSA9IChcbiAgICAgIGF3YWl0IHRoaXMuc3Vic2NyaWJlcnNTZXJ2aWNlLmxpc3Qoe1xuICAgICAgICAuLi5zdWJzY3JpYmVyRmlsdGVycyxcbiAgICAgICAgY3VycmVudFBhZ2U6IDEsXG4gICAgICAgIHBhZ2VTaXplOiAxXG4gICAgICB9KVxuICAgICkucGFnaW5nLnRvdGFsUGFnZXM7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcmVzLFxuICAgICAgZGF0YTogZGF0YS5tYXAoc3Vic2NyaWJlciA9PiAoe1xuICAgICAgICAuLi5zdWJzY3JpYmVyLFxuICAgICAgICBsYXN0QWNrbm93bGVkZ2VEYXRlOiB0aGlzLmdldExhc3RBY2tub3dsZWRnZURhdGUoc3Vic2NyaWJlciksXG4gICAgICAgIGlkOiBzdWJzY3JpYmVyLm5hbWVcbiAgICAgIH0pKSxcbiAgICAgIHBhZ2luZyxcbiAgICAgIHNpemUsXG4gICAgICBmaWx0ZXJlZFNpemVcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgdW5zdWJzY3JpYmVTdWJzY3JpYmVyKFxuICAgIHN1YnNjcmliZXI6IE1lc3NhZ2luZ1N1YnNjcmliZXJUb0RlbGV0ZSxcbiAgICByZWZyZXNoQ2FsbGJhY2s6ICgpID0+IHZvaWRcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29uZmlybWF0aW9uVGl0bGUgPSBnZXR0ZXh0KCdVbnN1YnNjcmliZSBcInt7IHN1YnNjcmliZXJOYW1lIH19XCI/Jyk7XG4gICAgY29uc3QgY29uZmlybWF0aW9uTWVzc2FnZSA9XG4gICAgICBzdWJzY3JpYmVyLmFjdGl2ZUNsaWVudHMgPiAwXG4gICAgICAgID8gZ2V0dGV4dChcbiAgICAgICAgICAgICdZb3UgYXJlIGFib3V0IHRvIHVuc3Vic2NyaWJlIFwie3sgc3Vic2NyaWJlck5hbWUgfX1cIiB3aGljaCBoYXMgYWN0aXZlIGNsaWVudHMuIERvIHlvdSB3YW50IHRvIHByb2NlZWQ/J1xuICAgICAgICAgIClcbiAgICAgICAgOiBnZXR0ZXh0KCdZb3UgYXJlIGFib3V0IHRvIHVuc3Vic2NyaWJlIFwie3sgc3Vic2NyaWJlck5hbWUgfX1cIi4gRG8geW91IHdhbnQgdG8gcHJvY2VlZD8nKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3Vic2NyaWJlck5hbWUgPSBzdWJzY3JpYmVyLm5hbWU7XG4gICAgICBhd2FpdCB0aGlzLm1vZGFsU2VydmljZS5jb25maXJtKFxuICAgICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChjb25maXJtYXRpb25UaXRsZSwge1xuICAgICAgICAgIHN1YnNjcmliZXJOYW1lXG4gICAgICAgIH0pLFxuICAgICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChjb25maXJtYXRpb25NZXNzYWdlLCB7XG4gICAgICAgICAgc3Vic2NyaWJlck5hbWVcbiAgICAgICAgfSksXG4gICAgICAgIFN0YXR1cy5EQU5HRVIsXG4gICAgICAgIHtcbiAgICAgICAgICBvazogZ2V0dGV4dCgnVW5zdWJzY3JpYmUnKVxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGNhbmNlbFxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnN1YnNjcmliZXJzU2VydmljZS5kZWxldGUoc3Vic2NyaWJlcik7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5zdWNjZXNzKFxuICAgICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChnZXR0ZXh0KCdTdWJzY3JpYmVyIFwie3sgc3Vic2NyaWJlck5hbWUgfX1cIiB1bnN1YnNjcmliZWQuJyksIHtcbiAgICAgICAgICBzdWJzY3JpYmVyTmFtZTogc3Vic2NyaWJlci5uYW1lXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRTZXJ2ZXJGYWlsdXJlKGVycm9yKTtcbiAgICB9XG4gICAgcmVmcmVzaENhbGxiYWNrKCk7XG4gIH1cblxuICBhc3luYyBidWxrVW5zdWJzY3JpYmVTdWJzY3JpYmVycyhcbiAgICBzdWJzY3JpYmVyczogTWVzc2FnaW5nU3Vic2NyaWJlclRvRGVsZXRlW10sXG4gICAgcmVmcmVzaENhbGxiYWNrOiAoKSA9PiB2b2lkXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFueVN1YnNjcmliZXJIYXNBY3RpdmVDbGllbnRzID0gc3Vic2NyaWJlcnMuc29tZShcbiAgICAgIHN1YnNjcmliZXIgPT4gc3Vic2NyaWJlci5hY3RpdmVDbGllbnRzID4gMFxuICAgICk7XG5cbiAgICBjb25zdCBjb25maXJtYXRpb25UaXRsZSA9IGdldHRleHQoJ1Vuc3Vic2NyaWJlIHt7IG51bWJlck9mU3Vic2NyaWJlcnMgfX0gc3Vic2NyaWJlcnM/Jyk7XG4gICAgY29uc3QgY29uZmlybWF0aW9uTWVzc2FnZSA9IGFueVN1YnNjcmliZXJIYXNBY3RpdmVDbGllbnRzXG4gICAgICA/IGdldHRleHQoXG4gICAgICAgICAgJ1lvdSBhcmUgYWJvdXQgdG8gdW5zdWJzY3JpYmUge3sgbnVtYmVyT2ZTdWJzY3JpYmVycyB9fSBzdWJzY3JpYmVycy4gU29tZSBvZiB0aGVtIGhhdmUgYWN0aXZlIGNsaWVudHMuIERvIHlvdSB3YW50IHRvIHByb2NlZWQ/J1xuICAgICAgICApXG4gICAgICA6IGdldHRleHQoXG4gICAgICAgICAgJ1lvdSBhcmUgYWJvdXQgdG8gdW5zdWJzY3JpYmUge3sgbnVtYmVyT2ZTdWJzY3JpYmVycyB9fSBzdWJzY3JpYmVycy4gRG8geW91IHdhbnQgdG8gcHJvY2VlZD8nXG4gICAgICAgICk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgbnVtYmVyT2ZTdWJzY3JpYmVycyA9IHN1YnNjcmliZXJzLmxlbmd0aDtcbiAgICAgIGF3YWl0IHRoaXMubW9kYWxTZXJ2aWNlLmNvbmZpcm0oXG4gICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGNvbmZpcm1hdGlvblRpdGxlLCB7XG4gICAgICAgICAgbnVtYmVyT2ZTdWJzY3JpYmVyc1xuICAgICAgICB9KSxcbiAgICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoY29uZmlybWF0aW9uTWVzc2FnZSwge1xuICAgICAgICAgIG51bWJlck9mU3Vic2NyaWJlcnNcbiAgICAgICAgfSksXG4gICAgICAgIFN0YXR1cy5EQU5HRVIsXG4gICAgICAgIHtcbiAgICAgICAgICBvazogZ2V0dGV4dCgnVW5zdWJzY3JpYmUnKVxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGNhbmNlbFxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICBzdWJzY3JpYmVycy5tYXAoc3ViID0+XG4gICAgICAgIHRoaXMuc3Vic2NyaWJlcnNTZXJ2aWNlXG4gICAgICAgICAgLmRlbGV0ZShzdWIpXG4gICAgICAgICAgLnRoZW4oKCkgPT4gKHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICBuYW1lOiBzdWIubmFtZVxuICAgICAgICAgIH0pKVxuICAgICAgICAgIC5jYXRjaChlcnJvciA9PiAoe1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBuYW1lOiBzdWIubmFtZSxcbiAgICAgICAgICAgIGVycm9yXG4gICAgICAgICAgfSkpXG4gICAgICApXG4gICAgKTtcblxuICAgIGNvbnN0IGZhaWxlZCA9IHJlc3VsdHNcbiAgICAgIC5maWx0ZXIocmVzdWx0ID0+IHJlc3VsdC5zdGF0dXMgPT09ICdmdWxmaWxsZWQnICYmIHJlc3VsdC52YWx1ZS5zdWNjZXNzID09PSBmYWxzZSlcbiAgICAgIC5tYXAocmVzdWx0ID0+IChyZXN1bHQgYXMgUHJvbWlzZUZ1bGZpbGxlZFJlc3VsdDxhbnk+KS52YWx1ZSk7XG5cbiAgICBjb25zdCBzdWNjZWVkZWQgPSByZXN1bHRzXG4gICAgICAuZmlsdGVyKHJlc3VsdCA9PiByZXN1bHQuc3RhdHVzID09PSAnZnVsZmlsbGVkJyAmJiByZXN1bHQudmFsdWUuc3VjY2VzcyA9PT0gdHJ1ZSlcbiAgICAgIC5tYXAocmVzdWx0ID0+IChyZXN1bHQgYXMgUHJvbWlzZUZ1bGZpbGxlZFJlc3VsdDxhbnk+KS52YWx1ZSk7XG5cbiAgICBpZiAoZmFpbGVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2Uuc3VjY2VzcyhcbiAgICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoXG4gICAgICAgICAgZ2V0dGV4dCgne3sgbnVtYmVyT2ZTdWJzY3JpYmVycyB9fSBzdWJzY3JpYmVycyB1bnN1YnNjcmliZWQuJyksXG4gICAgICAgICAgeyBudW1iZXJPZlN1YnNjcmliZXJzOiBzdWNjZWVkZWQubGVuZ3RoIH1cbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKHN1Y2NlZWRlZC5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KFxuICAgICAgICBnZXR0ZXh0KCdGYWlsZWQgdG8gdW5zdWJzY3JpYmUge3sgbnVtYmVyT2ZTdWJzY3JpYmVycyB9fSBzdWJzY3JpYmVycy4nKSxcbiAgICAgICAge1xuICAgICAgICAgIG51bWJlck9mU3Vic2NyaWJlcnM6IGZhaWxlZC5sZW5ndGhcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGRldGFpbHMgPSBgJHtmYWlsZWQubWFwKGYgPT4gYCcke2YubmFtZX0nOiAke2YuZXJyb3IuZGF0YS5tZXNzYWdlfWApLmpvaW4oJ1xcbicpfWA7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5kYW5nZXIoZXJyb3JNZXNzYWdlLCBkZXRhaWxzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU29tZSBzdWNjZWVkZWQsIHNvbWUgZmFpbGVkXG4gICAgICBjb25zdCBub25VbnN1YnNjcmliZWRTdWJzY3JpYmVycyA9IGZhaWxlZC5tYXAocyA9PiBzLm5hbWUpLmpvaW4oJywgJyk7XG4gICAgICBjb25zdCBtZXNzYWdlID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoXG4gICAgICAgIGdldHRleHQoXG4gICAgICAgICAgYFN1Y2Nlc3NmdWxseSB1bnN1YnNjcmliZWQge3sgY291bnQgfX0gc3Vic2NyaWJlcnMuPGJyLz5GYWlsZWQgdG8gdW5zdWJzY3JpYmU6IHt7IG5vblVuc3Vic2NyaWJlZFN1YnNjcmliZXJzIH19LmBcbiAgICAgICAgKSxcbiAgICAgICAgeyBjb3VudDogc3VjY2VlZGVkLmxlbmd0aCwgbm9uVW5zdWJzY3JpYmVkU3Vic2NyaWJlcnMgfVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGRldGFpbHMgPSBgJHtmYWlsZWQubWFwKGYgPT4gYCcke2YubmFtZX0nOiAke2YuZXJyb3IuZGF0YS5tZXNzYWdlfWApLmpvaW4oJ1xcbicpfWA7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS53YXJuaW5nKG1lc3NhZ2UsIGRldGFpbHMpO1xuICAgIH1cblxuICAgIHJlZnJlc2hDYWxsYmFjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDb2x1bW4oY29sdW1uUHJvcHM6IFBhcnRpYWw8QmFzZUNvbHVtbj4pOiBCYXNlQ29sdW1uIHtcbiAgICBjb25zdCBjb2x1bW4gPSBuZXcgQmFzZUNvbHVtbigpO1xuICAgIE9iamVjdC5hc3NpZ24oY29sdW1uLCBjb2x1bW5Qcm9wcyk7XG4gICAgcmV0dXJuIGNvbHVtbjtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U3Vic2NyaWJlckZpbHRlcnMoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBuYW1lc3BhY2VJZDogc3RyaW5nLFxuICAgIHRvcGljSWQ6IHN0cmluZyxcbiAgICB0b3BpY1R5cGU6IE1lc3NhZ2luZ1RvcGljVHlwZSxcbiAgICBkYXRhU291cmNlTW9kaWZpZXI6IERhdGFTb3VyY2VNb2RpZmllclxuICApOiBNZXNzYWdpbmdTdWJzY3JpYmVyRmlsdGVycyB7XG4gICAgY29uc3Qgc3Vic2NyaWJlckZpbHRlcnM6IE1lc3NhZ2luZ1N1YnNjcmliZXJGaWx0ZXJzID0ge1xuICAgICAgdGVuYW50OiB0ZW5hbnRJZCxcbiAgICAgIG5hbWVzcGFjZTogbmFtZXNwYWNlSWQsXG4gICAgICB0b3BpYzogdG9waWNJZCxcbiAgICAgIHR5cGU6IHRvcGljVHlwZSxcbiAgICAgIGN1cnJlbnRQYWdlOiBkYXRhU291cmNlTW9kaWZpZXIucGFnaW5hdGlvbi5jdXJyZW50UGFnZSxcbiAgICAgIHBhZ2VTaXplOiBkYXRhU291cmNlTW9kaWZpZXIucGFnaW5hdGlvbi5wYWdlU2l6ZVxuICAgIH07XG5cbiAgICByZXR1cm4gZGF0YVNvdXJjZU1vZGlmaWVyLmNvbHVtbnMucmVkdWNlKChzdWJzY3JpYmVyRmlsdGVycywgY29sdW1uKSA9PiB7XG4gICAgICBpZiAoY29sdW1uLmZpbHRlcmFibGUpIHtcbiAgICAgICAgaWYgKGNvbHVtbi5maWx0ZXJQcmVkaWNhdGUpIHtcbiAgICAgICAgICBzdWJzY3JpYmVyRmlsdGVyc1tjb2x1bW4ucGF0aF0gPSBjb2x1bW4uZmlsdGVyUHJlZGljYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbHVtbi5leHRlcm5hbEZpbHRlclF1ZXJ5KSB7XG4gICAgICAgICAgc3Vic2NyaWJlckZpbHRlcnNbY29sdW1uLnBhdGhdID0gY29sdW1uLmZpbHRlcmluZ0NvbmZpZy5nZXRGaWx0ZXIoXG4gICAgICAgICAgICBjb2x1bW4uZXh0ZXJuYWxGaWx0ZXJRdWVyeVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNvbHVtbi5zb3J0YWJsZSAmJiBjb2x1bW4uc29ydE9yZGVyKSB7XG4gICAgICAgIGNvbnN0IHNvcnRQYXRoID0gY29sdW1uLnNvcnRpbmdDb25maWc/LnBhdGhTb3J0aW5nQ29uZmlncz8uWzBdPy5wYXRoIHx8IGNvbHVtbi5wYXRoO1xuICAgICAgICBzdWJzY3JpYmVyRmlsdGVycy5zb3J0ID0gYCR7c29ydFBhdGh9LCR7Y29sdW1uLnNvcnRPcmRlcn1gO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3Vic2NyaWJlckZpbHRlcnM7XG4gICAgfSwgc3Vic2NyaWJlckZpbHRlcnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRMYXN0QWNrbm93bGVkZ2VEYXRlKHN1YnNjcmliZXI6IE1lc3NhZ2luZ1N1YnNjcmliZXIpOiBEYXRlIHtcbiAgICBjb25zdCBsYXN0QWNrbm93bGVkZ2VEYXRlID0gbmV3IERhdGUoc3Vic2NyaWJlci5sYXN0QWNrbm93bGVkZ2VUaW1lc3RhbXApO1xuICAgIHJldHVybiBsYXN0QWNrbm93bGVkZ2VEYXRlLmdldFRpbWUoKSA+IDAgPyBsYXN0QWNrbm93bGVkZ2VEYXRlIDogbnVsbDtcbiAgfVxufVxuIl19