@eui/core 17.0.0-next.2 → 17.0.0-next.21

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 (354) hide show
  1. package/assets/i18n-eui/bg.json +3 -1
  2. package/assets/i18n-eui/cs.json +3 -1
  3. package/assets/i18n-eui/da.json +3 -1
  4. package/assets/i18n-eui/de.json +3 -1
  5. package/assets/i18n-eui/el.json +3 -1
  6. package/assets/i18n-eui/en.json +3 -1
  7. package/assets/i18n-eui/es.json +3 -1
  8. package/assets/i18n-eui/et.json +3 -1
  9. package/assets/i18n-eui/fi.json +3 -1
  10. package/assets/i18n-eui/fr.json +3 -1
  11. package/assets/i18n-eui/ga.json +3 -1
  12. package/assets/i18n-eui/hr.json +3 -1
  13. package/assets/i18n-eui/hu.json +3 -2
  14. package/assets/i18n-eui/it.json +3 -1
  15. package/assets/i18n-eui/lt.json +3 -2
  16. package/assets/i18n-eui/lv.json +3 -1
  17. package/assets/i18n-eui/mt.json +3 -1
  18. package/assets/i18n-eui/nl.json +3 -1
  19. package/assets/i18n-eui/pl.json +3 -1
  20. package/assets/i18n-eui/pt.json +3 -1
  21. package/assets/i18n-eui/readme.md +8 -0
  22. package/assets/i18n-eui/ro.json +3 -2
  23. package/assets/i18n-eui/sk.json +3 -1
  24. package/assets/i18n-eui/sl.json +3 -1
  25. package/assets/i18n-eui/sv.json +3 -1
  26. package/docs/classes/ActivatedRouteAction.html +282 -0
  27. package/docs/classes/AddApiQueueItemAction.html +282 -0
  28. package/docs/classes/AddAppLoadedConfigModulesAction.html +282 -0
  29. package/docs/classes/ApiQueueServiceMock.html +545 -0
  30. package/docs/classes/AsyncStorageService.html +923 -0
  31. package/docs/classes/AsyncStorageServiceMock.html +427 -0
  32. package/docs/classes/EmptyApiQueueAction.html +282 -0
  33. package/docs/classes/ErrorSubClass.html +357 -0
  34. package/docs/classes/EuiCoreRootGuardClass.html +167 -0
  35. package/docs/classes/EuiError.html +363 -0
  36. package/docs/classes/I18nResourceImpl.html +506 -0
  37. package/docs/classes/InitStoreAction.html +282 -0
  38. package/docs/classes/LogServiceMock.html +223 -0
  39. package/docs/classes/OpenIdConnectServiceMock.html +223 -0
  40. package/docs/classes/RemoveApiQueueItemAction.html +282 -0
  41. package/docs/classes/RouterMock.html +482 -0
  42. package/docs/classes/StorageService.html +630 -0
  43. package/docs/classes/StorageServiceMock.html +316 -0
  44. package/docs/classes/StoreMock.html +391 -0
  45. package/docs/classes/TranslateServiceMock.html +907 -0
  46. package/docs/classes/UpdateAppConnectionAction.html +282 -0
  47. package/docs/classes/UpdateAppStatusAction.html +282 -0
  48. package/docs/classes/UpdateAppVersionAction.html +282 -0
  49. package/docs/classes/UpdateCurrentModuleAction.html +282 -0
  50. package/docs/classes/UpdateI18nStateAction.html +282 -0
  51. package/docs/classes/UpdateLocaleStateAction.html +282 -0
  52. package/docs/classes/UpdateNotificationsListAction.html +282 -0
  53. package/docs/classes/UpdateUserDashboardAction.html +282 -0
  54. package/docs/classes/UpdateUserDetailsAction.html +282 -0
  55. package/docs/classes/UpdateUserPreferencesAction.html +282 -0
  56. package/docs/classes/UpdateUserRightsAction.html +282 -0
  57. package/docs/classes/UpdateUserStateAction.html +282 -0
  58. package/docs/dependencies.html +335 -0
  59. package/docs/directives/TranslateMockDirective.html +266 -0
  60. package/docs/fonts/ionicons.eot +0 -0
  61. package/docs/fonts/ionicons.svg +2090 -0
  62. package/docs/fonts/ionicons.ttf +0 -0
  63. package/docs/fonts/ionicons.woff +0 -0
  64. package/docs/fonts/ionicons.woff2 +0 -0
  65. package/docs/fonts/roboto-v15-latin-300.eot +0 -0
  66. package/docs/fonts/roboto-v15-latin-300.svg +314 -0
  67. package/docs/fonts/roboto-v15-latin-300.ttf +0 -0
  68. package/docs/fonts/roboto-v15-latin-300.woff +0 -0
  69. package/docs/fonts/roboto-v15-latin-300.woff2 +0 -0
  70. package/docs/fonts/roboto-v15-latin-700.eot +0 -0
  71. package/docs/fonts/roboto-v15-latin-700.svg +310 -0
  72. package/docs/fonts/roboto-v15-latin-700.ttf +0 -0
  73. package/docs/fonts/roboto-v15-latin-700.woff +0 -0
  74. package/docs/fonts/roboto-v15-latin-700.woff2 +0 -0
  75. package/docs/fonts/roboto-v15-latin-italic.eot +0 -0
  76. package/docs/fonts/roboto-v15-latin-italic.svg +323 -0
  77. package/docs/fonts/roboto-v15-latin-italic.ttf +0 -0
  78. package/docs/fonts/roboto-v15-latin-italic.woff +0 -0
  79. package/docs/fonts/roboto-v15-latin-italic.woff2 +0 -0
  80. package/docs/fonts/roboto-v15-latin-regular.eot +0 -0
  81. package/docs/fonts/roboto-v15-latin-regular.svg +308 -0
  82. package/docs/fonts/roboto-v15-latin-regular.ttf +0 -0
  83. package/docs/fonts/roboto-v15-latin-regular.woff +0 -0
  84. package/docs/fonts/roboto-v15-latin-regular.woff2 +0 -0
  85. package/docs/images/compodoc-vectorise-inverted.png +0 -0
  86. package/docs/images/compodoc-vectorise-inverted.svg +201 -0
  87. package/docs/images/compodoc-vectorise.png +0 -0
  88. package/docs/images/compodoc-vectorise.svg +201 -0
  89. package/docs/images/favicon.ico +0 -0
  90. package/docs/index.html +171 -0
  91. package/docs/injectables/ApiQueueService.html +784 -0
  92. package/docs/injectables/CoreAppEffects.html +390 -0
  93. package/docs/injectables/EuiAppShellService.html +2822 -0
  94. package/docs/injectables/EuiDynamicComponentService.html +433 -0
  95. package/docs/injectables/EuiDynamicMenuService.html +377 -0
  96. package/docs/injectables/EuiGrowlService.html +821 -0
  97. package/docs/injectables/EuiPermissionService.html +642 -0
  98. package/docs/injectables/EuiTimezoneService.html +378 -0
  99. package/docs/injectables/GlobalErrorHandler.html +291 -0
  100. package/docs/injectables/I18nLoader.html +589 -0
  101. package/docs/injectables/I18nService.html +991 -0
  102. package/docs/injectables/I18nServiceMock.html +626 -0
  103. package/docs/injectables/LocalForageService.html +761 -0
  104. package/docs/injectables/LocalStorageService.html +548 -0
  105. package/docs/injectables/LocaleService.html +753 -0
  106. package/docs/injectables/LocaleServiceMock.html +453 -0
  107. package/docs/injectables/LogService.html +351 -0
  108. package/docs/injectables/OpenIdConnectService.html +225 -0
  109. package/docs/injectables/SessionStorageService.html +548 -0
  110. package/docs/injectables/StoreService.html +641 -0
  111. package/docs/injectables/StoreServiceMock.html +455 -0
  112. package/docs/injectables/UserService.html +738 -0
  113. package/docs/injectables/UserServiceMock.html +708 -0
  114. package/docs/interceptors/AddLangParamInterceptor.html +311 -0
  115. package/docs/interceptors/CachePreventionInterceptor.html +260 -0
  116. package/docs/interceptors/CorsSecurityInterceptor.html +260 -0
  117. package/docs/interceptors/CsrfPreventionInterceptor.html +260 -0
  118. package/docs/interceptors/EuLoginSessionTimeoutHandlingInterceptor.html +260 -0
  119. package/docs/interceptors/HttpErrorHandlerInterceptor.html +319 -0
  120. package/docs/interceptors/OpenIdConnectInterceptor.html +345 -0
  121. package/docs/interceptors/UxRequestErrorModelInterceptor.html +295 -0
  122. package/docs/interfaces/EuiTimeZone.html +247 -0
  123. package/docs/interfaces/LoadedResources.html +292 -0
  124. package/docs/interfaces/LoadedResourcesError.html +247 -0
  125. package/docs/interfaces/ModuleLoadEvent.html +292 -0
  126. package/docs/interfaces/OpenIdConnectUserDetails.html +439 -0
  127. package/docs/interfaces/ResourceError.html +298 -0
  128. package/docs/interfaces/UIState.html +1945 -0
  129. package/docs/js/compodoc.js +14 -0
  130. package/docs/js/lazy-load-graphs.js +44 -0
  131. package/docs/js/libs/EventDispatcher.js +5 -0
  132. package/docs/js/libs/bootstrap-native.js +1 -0
  133. package/docs/js/libs/clipboard.min.js +7 -0
  134. package/docs/js/libs/custom-elements-es5-adapter.js +15 -0
  135. package/docs/js/libs/custom-elements.min.js +38 -0
  136. package/docs/js/libs/d3.v3.min.js +2 -0
  137. package/docs/js/libs/deep-iterator.js +2 -0
  138. package/docs/js/libs/es6-shim.min.js +11 -0
  139. package/docs/js/libs/htmlparser.js +23 -0
  140. package/docs/js/libs/innersvg.js +9 -0
  141. package/docs/js/libs/lit-html.js +1 -0
  142. package/docs/js/libs/prism.js +46 -0
  143. package/docs/js/libs/promise.min.js +6 -0
  144. package/docs/js/libs/svg-pan-zoom.min.js +3 -0
  145. package/docs/js/libs/tablesort.min.js +6 -0
  146. package/docs/js/libs/tablesort.number.min.js +6 -0
  147. package/docs/js/libs/vis.min.js +47 -0
  148. package/docs/js/libs/zepto.min.js +2 -0
  149. package/docs/js/menu-wc.js +377 -0
  150. package/docs/js/menu-wc_es5.js +42 -0
  151. package/docs/js/menu.js +325 -0
  152. package/docs/js/routes.js +301 -0
  153. package/docs/js/search/lunr.min.js +6 -0
  154. package/docs/js/search/search-lunr.js +67 -0
  155. package/docs/js/search/search.js +268 -0
  156. package/docs/js/search/search_index.js +4 -0
  157. package/docs/js/sourceCode.js +58 -0
  158. package/docs/js/svg-pan-zoom.controls.js +53 -0
  159. package/docs/js/tabs.js +21 -0
  160. package/docs/js/tree.js +147 -0
  161. package/docs/license.html +379 -0
  162. package/docs/miscellaneous/enumerations.html +418 -0
  163. package/docs/miscellaneous/functions.html +1796 -0
  164. package/docs/miscellaneous/typealiases.html +258 -0
  165. package/docs/miscellaneous/variables.html +3969 -0
  166. package/docs/modules/CoreModule.html +254 -0
  167. package/docs/modules/I18nModule.html +198 -0
  168. package/docs/modules/LogModule.html +301 -0
  169. package/docs/modules/TranslateMockModule.html +176 -0
  170. package/docs/modules.html +168 -0
  171. package/docs/pipes/TranslateMockPipe.html +225 -0
  172. package/docs/properties.html +124 -0
  173. package/docs/styles/bootstrap-card.css +219 -0
  174. package/docs/styles/bootstrap.min.css +6 -0
  175. package/docs/styles/compodoc.css +1121 -0
  176. package/docs/styles/dark.css +121 -0
  177. package/docs/styles/ionicons.min.css +11 -0
  178. package/docs/styles/laravel.css +113 -0
  179. package/docs/styles/material.css +131 -0
  180. package/docs/styles/original.css +51 -0
  181. package/docs/styles/postmark.css +238 -0
  182. package/docs/styles/prism.css +301 -0
  183. package/docs/styles/readthedocs.css +117 -0
  184. package/docs/styles/reset.css +129 -0
  185. package/docs/styles/stripe.css +106 -0
  186. package/docs/styles/style.css +7 -0
  187. package/docs/styles/tablesort.css +33 -0
  188. package/docs/styles/vagrant.css +130 -0
  189. package/esm2022/lib/eui-core.module.mjs +9 -9
  190. package/esm2022/lib/helpers/date-helpers.mjs +1 -1
  191. package/esm2022/lib/helpers/dom-helpers.mjs +10 -8
  192. package/esm2022/lib/helpers/event-helpers.mjs +1 -1
  193. package/esm2022/lib/helpers/form-helpers.mjs +1 -1
  194. package/esm2022/lib/helpers/format-helpers.mjs +6 -5
  195. package/esm2022/lib/helpers/http-helpers.mjs +3 -5
  196. package/esm2022/lib/interceptors/add-lang-param.interceptor.mjs +5 -5
  197. package/esm2022/lib/interceptors/cache-prevention.interceptor.mjs +4 -4
  198. package/esm2022/lib/interceptors/cors-security.interceptor.mjs +4 -4
  199. package/esm2022/lib/interceptors/csrf-prevention.interceptor.mjs +4 -4
  200. package/esm2022/lib/interceptors/eu-login-session-timeout-handling.interceptor.mjs +13 -6
  201. package/esm2022/lib/interceptors/openid/openid-connect.interceptor.mjs +38 -9
  202. package/esm2022/lib/interceptors/openid/openid-connect.service.mjs +7 -5
  203. package/esm2022/lib/interceptors/ux-request-error-model.interceptor.mjs +12 -7
  204. package/esm2022/lib/services/app/eui-init-app.mjs +2 -2
  205. package/esm2022/lib/services/app/eui-pre-init-app.mjs +1 -1
  206. package/esm2022/lib/services/app/factories/log.mjs +1 -1
  207. package/esm2022/lib/services/config/tokens.mjs +3 -1
  208. package/esm2022/lib/services/dynamic-component/dynamic-component.service.mjs +68 -0
  209. package/esm2022/lib/services/dynamic-menu/dynamic-menu.service.mjs +15 -12
  210. package/esm2022/lib/services/errors/eui.error.mjs +7 -1
  211. package/esm2022/lib/services/errors/global-error-handler.mjs +8 -6
  212. package/esm2022/lib/services/errors/http-error-handler-callback-functions.mjs +5 -6
  213. package/esm2022/lib/services/errors/http-error-handler.interceptor.mjs +26 -19
  214. package/esm2022/lib/services/eui-app-shell.service.mjs +686 -0
  215. package/esm2022/lib/services/eui-timezone.service.mjs +4 -4
  216. package/esm2022/lib/services/growl/eui-growl.service.mjs +79 -0
  217. package/esm2022/lib/services/growl/index.mjs +2 -0
  218. package/esm2022/lib/services/i18n/i18n.loader.mjs +18 -7
  219. package/esm2022/lib/services/i18n/i18n.resource.mjs +8 -3
  220. package/esm2022/lib/services/i18n/i18n.service.mjs +19 -21
  221. package/esm2022/lib/services/i18n/index.mjs +2 -2
  222. package/esm2022/lib/services/index.mjs +4 -5
  223. package/esm2022/lib/services/locale/locale.service.mjs +9 -7
  224. package/esm2022/lib/services/locale/locale.service.mock.mjs +6 -6
  225. package/esm2022/lib/services/log/log.module.mjs +5 -5
  226. package/esm2022/lib/services/log/log.service.mjs +6 -6
  227. package/esm2022/lib/services/log/log.service.mock.mjs +1 -1
  228. package/esm2022/lib/services/permission/permission.service.mjs +7 -7
  229. package/esm2022/lib/services/queue/api-queue.service.mjs +21 -9
  230. package/esm2022/lib/services/queue/api-queue.service.mock.mjs +5 -1
  231. package/esm2022/lib/services/storage/async-storage.service.mjs +1 -1
  232. package/esm2022/lib/services/storage/async-storage.service.mock.mjs +9 -1
  233. package/esm2022/lib/services/storage/local-forage.service.mjs +45 -20
  234. package/esm2022/lib/services/storage/local-storage.service.mjs +10 -6
  235. package/esm2022/lib/services/storage/session-storage.service.mjs +10 -6
  236. package/esm2022/lib/services/storage/storage.service.mjs +1 -1
  237. package/esm2022/lib/services/storage/storage.service.mock.mjs +1 -1
  238. package/esm2022/lib/services/store/actions/app.actions.mjs +3 -1
  239. package/esm2022/lib/services/store/actions/notifications.actions.mjs +3 -1
  240. package/esm2022/lib/services/store/actions/user.actions.mjs +3 -1
  241. package/esm2022/lib/services/store/effects/app.effects.mjs +11 -21
  242. package/esm2022/lib/services/store/reducers/app.reducers.mjs +2 -3
  243. package/esm2022/lib/services/store/reducers/core.reducers.mjs +3 -1
  244. package/esm2022/lib/services/store/reducers/i18n.reducers.mjs +2 -2
  245. package/esm2022/lib/services/store/reducers/locale.reducers.mjs +1 -1
  246. package/esm2022/lib/services/store/reducers/meta.reducers.mjs +4 -2
  247. package/esm2022/lib/services/store/reducers/notifications.reducers.mjs +2 -2
  248. package/esm2022/lib/services/store/reducers/user.reducers.mjs +2 -2
  249. package/esm2022/lib/services/store/store.service.mjs +16 -8
  250. package/esm2022/lib/services/store/store.service.mock.mjs +5 -5
  251. package/esm2022/lib/services/user/user.service.mjs +14 -8
  252. package/esm2022/lib/services/user/user.service.mock.mjs +12 -18
  253. package/fesm2022/eui-core.mjs +2675 -2467
  254. package/fesm2022/eui-core.mjs.map +1 -1
  255. package/lib/eui-core.module.d.ts +1 -1
  256. package/lib/eui-core.module.d.ts.map +1 -1
  257. package/lib/helpers/date-helpers.d.ts.map +1 -1
  258. package/lib/helpers/dom-helpers.d.ts +9 -7
  259. package/lib/helpers/dom-helpers.d.ts.map +1 -1
  260. package/lib/helpers/event-helpers.d.ts.map +1 -1
  261. package/lib/helpers/form-helpers.d.ts.map +1 -1
  262. package/lib/helpers/format-helpers.d.ts.map +1 -1
  263. package/lib/helpers/http-helpers.d.ts +2 -1
  264. package/lib/helpers/http-helpers.d.ts.map +1 -1
  265. package/lib/interceptors/add-lang-param.interceptor.d.ts +1 -1
  266. package/lib/interceptors/add-lang-param.interceptor.d.ts.map +1 -1
  267. package/lib/interceptors/cache-prevention.interceptor.d.ts +1 -1
  268. package/lib/interceptors/cache-prevention.interceptor.d.ts.map +1 -1
  269. package/lib/interceptors/cors-security.interceptor.d.ts +1 -1
  270. package/lib/interceptors/cors-security.interceptor.d.ts.map +1 -1
  271. package/lib/interceptors/csrf-prevention.interceptor.d.ts +1 -1
  272. package/lib/interceptors/csrf-prevention.interceptor.d.ts.map +1 -1
  273. package/lib/interceptors/eu-login-session-timeout-handling.interceptor.d.ts +1 -1
  274. package/lib/interceptors/eu-login-session-timeout-handling.interceptor.d.ts.map +1 -1
  275. package/lib/interceptors/openid/openid-connect.interceptor.d.ts.map +1 -1
  276. package/lib/interceptors/openid/openid-connect.service.d.ts.map +1 -1
  277. package/lib/interceptors/ux-request-error-model.interceptor.d.ts.map +1 -1
  278. package/lib/services/app/eui-init-app.d.ts +1 -1
  279. package/lib/services/app/eui-init-app.d.ts.map +1 -1
  280. package/lib/services/config/tokens.d.ts +2 -2
  281. package/lib/services/config/tokens.d.ts.map +1 -1
  282. package/lib/services/{ux-dynamic-component/ux-dynamic-component.service.d.ts → dynamic-component/dynamic-component.service.d.ts} +7 -11
  283. package/lib/services/dynamic-component/dynamic-component.service.d.ts.map +1 -0
  284. package/lib/services/dynamic-menu/dynamic-menu.service.d.ts +8 -8
  285. package/lib/services/dynamic-menu/dynamic-menu.service.d.ts.map +1 -1
  286. package/lib/services/errors/eui.error.d.ts +0 -2
  287. package/lib/services/errors/eui.error.d.ts.map +1 -1
  288. package/lib/services/errors/global-error-handler.d.ts +1 -1
  289. package/lib/services/errors/global-error-handler.d.ts.map +1 -1
  290. package/lib/services/errors/http-error-handler-callback-functions.d.ts.map +1 -1
  291. package/lib/services/errors/http-error-handler.interceptor.d.ts.map +1 -1
  292. package/lib/services/{ux-app-shell.service.d.ts → eui-app-shell.service.d.ts} +52 -11
  293. package/lib/services/eui-app-shell.service.d.ts.map +1 -0
  294. package/lib/services/growl/eui-growl.service.d.ts +22 -0
  295. package/lib/services/growl/eui-growl.service.d.ts.map +1 -0
  296. package/lib/services/growl/index.d.ts +2 -0
  297. package/lib/services/growl/index.d.ts.map +1 -0
  298. package/lib/services/i18n/i18n.loader.d.ts.map +1 -1
  299. package/lib/services/i18n/i18n.resource.d.ts +1 -1
  300. package/lib/services/i18n/i18n.resource.d.ts.map +1 -1
  301. package/lib/services/i18n/i18n.service.d.ts +4 -4
  302. package/lib/services/i18n/i18n.service.d.ts.map +1 -1
  303. package/lib/services/i18n/index.d.ts +0 -1
  304. package/lib/services/i18n/index.d.ts.map +1 -1
  305. package/lib/services/index.d.ts +3 -4
  306. package/lib/services/index.d.ts.map +1 -1
  307. package/lib/services/locale/locale.service.d.ts.map +1 -1
  308. package/lib/services/log/log.service.d.ts.map +1 -1
  309. package/lib/services/log/log.service.mock.d.ts.map +1 -1
  310. package/lib/services/permission/permission.service.d.ts.map +1 -1
  311. package/lib/services/queue/api-queue.service.d.ts +2 -2
  312. package/lib/services/queue/api-queue.service.d.ts.map +1 -1
  313. package/lib/services/queue/api-queue.service.mock.d.ts.map +1 -1
  314. package/lib/services/storage/async-storage.service.d.ts.map +1 -1
  315. package/lib/services/storage/async-storage.service.mock.d.ts.map +1 -1
  316. package/lib/services/storage/local-forage.service.d.ts +1 -1
  317. package/lib/services/storage/local-forage.service.d.ts.map +1 -1
  318. package/lib/services/storage/local-storage.service.d.ts.map +1 -1
  319. package/lib/services/storage/session-storage.service.d.ts.map +1 -1
  320. package/lib/services/storage/storage.service.d.ts.map +1 -1
  321. package/lib/services/storage/storage.service.mock.d.ts +1 -1
  322. package/lib/services/storage/storage.service.mock.d.ts.map +1 -1
  323. package/lib/services/store/actions/app.actions.d.ts.map +1 -1
  324. package/lib/services/store/actions/notifications.actions.d.ts.map +1 -1
  325. package/lib/services/store/actions/user.actions.d.ts.map +1 -1
  326. package/lib/services/store/effects/app.effects.d.ts +3 -3
  327. package/lib/services/store/effects/app.effects.d.ts.map +1 -1
  328. package/lib/services/store/reducers/app.reducers.d.ts.map +1 -1
  329. package/lib/services/store/reducers/core.reducers.d.ts.map +1 -1
  330. package/lib/services/store/reducers/meta.reducers.d.ts +2 -2
  331. package/lib/services/store/reducers/meta.reducers.d.ts.map +1 -1
  332. package/lib/services/store/reducers/user.reducers.d.ts.map +1 -1
  333. package/lib/services/store/store.service.d.ts +8 -8
  334. package/lib/services/store/store.service.d.ts.map +1 -1
  335. package/lib/services/store/store.service.mock.d.ts +2 -1
  336. package/lib/services/store/store.service.mock.d.ts.map +1 -1
  337. package/lib/services/user/user.service.d.ts +3 -3
  338. package/lib/services/user/user.service.d.ts.map +1 -1
  339. package/lib/services/user/user.service.mock.d.ts +10 -12
  340. package/lib/services/user/user.service.mock.d.ts.map +1 -1
  341. package/package.json +2 -2
  342. package/esm2022/lib/services/i18n/i18n.service.mock.mjs +0 -38
  343. package/esm2022/lib/services/ux-app-shell.service.mjs +0 -556
  344. package/esm2022/lib/services/ux-dynamic-component/ux-dynamic-component.service.mjs +0 -63
  345. package/esm2022/lib/services/ux-error-feedback/ux-error-feedback.service.mjs +0 -108
  346. package/esm2022/lib/services/ux-error-feedback/ux-error-handler.operator.mjs +0 -16
  347. package/lib/services/i18n/i18n.service.mock.d.ts +0 -20
  348. package/lib/services/i18n/i18n.service.mock.d.ts.map +0 -1
  349. package/lib/services/ux-app-shell.service.d.ts.map +0 -1
  350. package/lib/services/ux-dynamic-component/ux-dynamic-component.service.d.ts.map +0 -1
  351. package/lib/services/ux-error-feedback/ux-error-feedback.service.d.ts +0 -36
  352. package/lib/services/ux-error-feedback/ux-error-feedback.service.d.ts.map +0 -1
  353. package/lib/services/ux-error-feedback/ux-error-handler.operator.d.ts +0 -4
  354. package/lib/services/ux-error-feedback/ux-error-handler.operator.d.ts.map +0 -1
@@ -0,0 +1,686 @@
1
+ import { Inject, Injectable, Optional, PLATFORM_ID } from '@angular/core';
2
+ import { isPlatformBrowser } from '@angular/common';
3
+ import { BehaviorSubject, defer, firstValueFrom } from 'rxjs';
4
+ import { EuiEuLanguages, getActiveLang } from '@eui/base';
5
+ import { GLOBAL_CONFIG_TOKEN } from './config/tokens';
6
+ import { NavigationEnd } from '@angular/router';
7
+ import { distinctUntilChanged, map } from 'rxjs/operators';
8
+ import isEqual from 'lodash-es/isEqual';
9
+ import get from 'lodash-es/get';
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "@angular/common/http";
12
+ import * as i2 from "@angular/router";
13
+ import * as i3 from "./store";
14
+ import * as i4 from "./i18n";
15
+ const initialState = {
16
+ appName: '',
17
+ appShortName: '',
18
+ appSubTitle: '',
19
+ appBaseFontSize: '',
20
+ userInfos: null,
21
+ userSubInfos: null,
22
+ impersonatedUserInfos: null,
23
+ isSidebarOpen: true,
24
+ isSidebarHover: false,
25
+ isSidebarActive: false,
26
+ isSidebarInnerActive: false,
27
+ isSidebarStateCloseWithIcons: false,
28
+ isSidebarExpandOnHover: true,
29
+ hasSidebar: false,
30
+ hasHeader: false,
31
+ hasBreadcrumb: false,
32
+ hasHeaderLogo: false,
33
+ hasHeaderEnvironment: false,
34
+ hasToolbar: false,
35
+ hasToolbarMenu: false,
36
+ environmentValue: '',
37
+ isSidebarHidden: false,
38
+ hasTopMessage: false,
39
+ windowWidth: 0,
40
+ windowHeight: 0,
41
+ mainContentHeight: 0,
42
+ pageHeaderHeight: 0,
43
+ wrapperClasses: '',
44
+ breakpoint: '',
45
+ breakpoints: {
46
+ isMobile: false,
47
+ isTablet: false,
48
+ isLtDesktop: false,
49
+ isDesktop: false,
50
+ isXL: false,
51
+ isXXL: false,
52
+ isFHD: false,
53
+ is2K: false,
54
+ is4K: false,
55
+ },
56
+ menuLinks: [],
57
+ sidebarLinks: [],
58
+ combinedLinks: [],
59
+ isBlockDocumentActive: false,
60
+ deviceInfo: null,
61
+ activeLanguage: 'en',
62
+ languages: EuiEuLanguages.getLanguages(),
63
+ appMetadata: null,
64
+ hasModalActive: false,
65
+ isDimmerActive: false,
66
+ };
67
+ export class EuiAppShellService {
68
+ // -------------------
69
+ get state$() {
70
+ return this._state$.asObservable();
71
+ }
72
+ // -------------------
73
+ // exposed observables
74
+ get breakpoint$() {
75
+ return this._breakpoint$.asObservable();
76
+ }
77
+ // TODO: find the correct type or turn into a generic, https://www.typescriptlang.org/docs/handbook/2/generics.html
78
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
79
+ get breakpoints$() {
80
+ return this._breakpoints$.asObservable();
81
+ }
82
+ // ----------------
83
+ // state operations
84
+ // ----------------
85
+ get state() {
86
+ return this._state$.getValue();
87
+ }
88
+ // ----------------------------
89
+ // public setters and functions
90
+ // ----------------------------
91
+ set isSidebarOpen(isOpen) {
92
+ this.setState({
93
+ ...this.state,
94
+ isSidebarOpen: isOpen,
95
+ });
96
+ }
97
+ get isSidebarOpen() {
98
+ return this.state.isSidebarOpen;
99
+ }
100
+ set isSidebarHover(isHover) {
101
+ if (this.state.isSidebarExpandOnHover) {
102
+ this.setState({
103
+ ...this.state,
104
+ isSidebarHover: isHover,
105
+ });
106
+ }
107
+ }
108
+ get isSidebarHover() {
109
+ return this.state.isSidebarHover;
110
+ }
111
+ set isSidebarActive(isActive) {
112
+ this.setState({
113
+ ...this.state,
114
+ isSidebarActive: isActive,
115
+ });
116
+ }
117
+ set isSidebarInnerActive(isOpen) {
118
+ this.setState({
119
+ ...this.state,
120
+ isSidebarInnerActive: isOpen,
121
+ });
122
+ }
123
+ set sidebarLinks(links) {
124
+ this.setState({
125
+ ...this.state,
126
+ sidebarLinks: links,
127
+ });
128
+ }
129
+ set menuLinks(links) {
130
+ this.setState({
131
+ ...this.state,
132
+ menuLinks: links,
133
+ });
134
+ }
135
+ set isBlockDocumentActive(isActive) {
136
+ this.setState({
137
+ ...this.state,
138
+ isBlockDocumentActive: isActive,
139
+ });
140
+ }
141
+ get hasHeader() {
142
+ return this.state.hasHeader;
143
+ }
144
+ // Edit mode
145
+ get isDimmerActive() {
146
+ return this.state.isDimmerActive;
147
+ }
148
+ set isDimmerActive(isActive) {
149
+ this.setState({
150
+ ...this.state,
151
+ isDimmerActive: isActive,
152
+ });
153
+ }
154
+ constructor(config, http, platformId, router, storeService, i18nService) {
155
+ this.config = config;
156
+ this.http = http;
157
+ this.platformId = platformId;
158
+ this.router = router;
159
+ this.storeService = storeService;
160
+ this.i18nService = i18nService;
161
+ /**
162
+ * @deprecated don't remove as it's used for external legacy project under v17 (csdr-eui-legacy) to support MWP transition
163
+ */
164
+ this.openModalId = new BehaviorSubject('');
165
+ /**
166
+ * @deprecated don't remove as it's used for external legacy project under v17 (csdr-eui-legacy) to support MWP transition
167
+ */
168
+ this.activeModals = [];
169
+ this.cssVars = [];
170
+ let stateWithConfig = initialState;
171
+ const languages = config?.i18n?.i18nService?.languages || initialState.languages;
172
+ const defaultLanguage = config?.i18n?.i18nService?.defaultLanguage || initialState.activeLanguage;
173
+ stateWithConfig = {
174
+ ...stateWithConfig,
175
+ ...{
176
+ languages,
177
+ activeLanguage: defaultLanguage,
178
+ },
179
+ };
180
+ this._state$ = new BehaviorSubject(stateWithConfig);
181
+ this._breakpoint$ = new BehaviorSubject('');
182
+ this._breakpoints$ = new BehaviorSubject({});
183
+ this.bindActiveLanguageToAppShellState();
184
+ if (isPlatformBrowser(this.platformId)) {
185
+ router.events.subscribe((event) => {
186
+ if (event instanceof NavigationEnd) {
187
+ window.scrollTo(0, 0);
188
+ }
189
+ });
190
+ }
191
+ }
192
+ setState(nextState, updateI18 = true) {
193
+ let breakpoint, breakpoints;
194
+ let combinedLinks;
195
+ const state = this.state;
196
+ // check if window width has been updated from previous state
197
+ if (this.state.windowWidth !== nextState.windowWidth) {
198
+ breakpoint = this.getBreakpoint(nextState.windowWidth);
199
+ breakpoints = this.getBreakpoints(breakpoint);
200
+ this._breakpoint$.next(breakpoint);
201
+ this._breakpoints$.next(breakpoints);
202
+ // if not propagate the old ones without doing any calculations
203
+ }
204
+ else {
205
+ breakpoint = state.breakpoint;
206
+ breakpoints = state.breakpoints;
207
+ }
208
+ // finally get the wrapper classes when both the state and breakpoint are known
209
+ const wrapperClasses = this.getWrapperClasses(nextState, breakpoint);
210
+ // check if the menuLinks or sidebarLinks have changed from previous state
211
+ if (this.state.menuLinks !== nextState.menuLinks || this.state.sidebarLinks !== nextState.sidebarLinks) {
212
+ combinedLinks = [...nextState.menuLinks, ...nextState.sidebarLinks];
213
+ }
214
+ else {
215
+ combinedLinks = this.state.combinedLinks;
216
+ }
217
+ const stateBeforeUpdate = { ...this.state };
218
+ // we put it all together with the calculated properties
219
+ this._state$.next({
220
+ ...nextState,
221
+ wrapperClasses,
222
+ breakpoint,
223
+ breakpoints,
224
+ combinedLinks,
225
+ });
226
+ // update the Store Language
227
+ if (updateI18 && nextState.activeLanguage !== stateBeforeUpdate.activeLanguage) {
228
+ this.i18nService.updateState({ activeLang: nextState.activeLanguage });
229
+ }
230
+ }
231
+ /**
232
+ * Emits a slice from the state whether that changes
233
+ *
234
+ * @param key can be 'key' or 'key.sub.sub'
235
+ */
236
+ // TODO: find the correct type or turn into a generic, https://www.typescriptlang.org/docs/handbook/2/generics.html
237
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
238
+ getState(key) {
239
+ return defer(() =>
240
+ // check if key exists
241
+ key
242
+ ? this.state$.pipe(map((state) => get(state, key)),
243
+ // filter((state) => state),
244
+ distinctUntilChanged((x, y) => isEqual(x, y)))
245
+ : this.state$);
246
+ }
247
+ sidebarToggle() {
248
+ this.isSidebarOpen = !this.state.isSidebarOpen;
249
+ }
250
+ // Edit mode
251
+ dimmerActiveToggle() {
252
+ const isActive = this.isDimmerActive;
253
+ this.setState({
254
+ ...this.state,
255
+ isDimmerActive: !isActive,
256
+ });
257
+ this.activateEditModeCssVars(!isActive);
258
+ }
259
+ setDimmerActiveState(activeState) {
260
+ this.setState({
261
+ ...this.state,
262
+ isDimmerActive: activeState,
263
+ });
264
+ this.activateEditModeCssVars(activeState);
265
+ }
266
+ activateEditModeCssVars(isActive) {
267
+ if (isActive) {
268
+ this._setCssVarValue('--eui-docpage-navigation-z-index', 'inherit'); // Reset doc-page-navigation-column z-index
269
+ this._setCssVarValue('--eui-z-index-sidebar', 'inherit'); // Reset eui-app-sidebar z-index
270
+ this._setCssVarValue('--eui-z-index-root', 'inherit'); // Reset eui-app-main-content z-index
271
+ }
272
+ else {
273
+ this._setCssVarValue('--eui-docpage-navigation-z-index', '2'); // Restore doc-page-navigation-column z-index
274
+ this._setCssVarValue('--eui-z-index-sidebar', '1044'); // Restore eui-app-sidebar z-index
275
+ this._setCssVarValue('--eui-z-index-root', '1'); // Restore eui-app-main-content z-index
276
+ }
277
+ }
278
+ // --------------
279
+ // public methods
280
+ // --------------
281
+ fetchAppMetadata(metadataFilePath = 'assets/app-metadata.json') {
282
+ this.getJson(metadataFilePath).then((data) => {
283
+ this.setState({
284
+ ...this.state,
285
+ appMetadata: data,
286
+ });
287
+ });
288
+ }
289
+ activateSidebar() {
290
+ this.setState({
291
+ ...this.state,
292
+ hasSidebar: true,
293
+ });
294
+ if (!this.state.isSidebarHidden) {
295
+ this.activateSidebarCssVars();
296
+ }
297
+ }
298
+ activateSidebarHeader() {
299
+ this.activateSidebarHeaderCssVars();
300
+ }
301
+ activateSidebarFooter() {
302
+ this.activateSidebarFooterCssVars();
303
+ }
304
+ activateHeader() {
305
+ this.setState({
306
+ ...this.state,
307
+ hasHeader: true,
308
+ });
309
+ this.activateHeaderCssVars();
310
+ }
311
+ activateBreadcrumb() {
312
+ this.setState({
313
+ ...this.state,
314
+ hasBreadcrumb: true,
315
+ });
316
+ this.activateBreadcrumbCssVars();
317
+ }
318
+ activateTopMessage(height) {
319
+ this.setState({
320
+ ...this.state,
321
+ hasTopMessage: true,
322
+ });
323
+ this.activateTopMessageCssVars(height);
324
+ }
325
+ activateToolbar() {
326
+ this.setState({
327
+ ...this.state,
328
+ hasToolbar: true,
329
+ });
330
+ this.activateToolbarCssVars();
331
+ }
332
+ activateToolbarMenu() {
333
+ this.setState({
334
+ ...this.state,
335
+ hasToolbarMenu: true,
336
+ });
337
+ }
338
+ fetchCssVars() {
339
+ const cssVarNames = [
340
+ '--eui-app-header-height-default',
341
+ '--eui-app-header-height-active',
342
+ '--eui-app-header-height-shrink',
343
+ '--eui-app-breadcrumb-height-default',
344
+ '--eui-app-breadcrumb-height-active',
345
+ '--eui-app-top-message-height-default',
346
+ '--eui-app-top-message-height-active',
347
+ '--eui-app-top-message-height-shrink',
348
+ '--eui-app-toolbar-height-default',
349
+ '--eui-app-toolbar-height-active',
350
+ '--eui-app-sidebar-width-default',
351
+ '--eui-app-sidebar-width-active',
352
+ '--eui-app-sidebar-width-close-default',
353
+ '--eui-app-sidebar-width-close-active',
354
+ '--eui-app-sidebar-header-height-default',
355
+ '--eui-app-sidebar-header-height-active',
356
+ '--eui-app-sidebar-footer-height-default',
357
+ '--eui-app-sidebar-footer-height-active',
358
+ ];
359
+ this.cssVars = cssVarNames.map((v) => ({ key: v, value: this.getCssVarValue(v) }));
360
+ }
361
+ initCssVars() {
362
+ this.setCssVar('--eui-app-header-height-default', '--eui-app-header-height');
363
+ this.setCssVar('--eui-app-breadcrumb-height-default', '--eui-app-breadcrumb-height');
364
+ this.setCssVar('--eui-app-top-message-height-default', '--eui-app-top-message-height');
365
+ this.setCssVar('--eui-app-toolbar-height-default', '--eui-app-toolbar-height');
366
+ this.setCssVar('--eui-app-sidebar-width-default', '--eui-app-sidebar-width');
367
+ this.setCssVar('--eui-app-sidebar-width-close-default', '--eui-app-sidebar-width-close');
368
+ this.setCssVar('--eui-app-sidebar-header-height-default', '--eui-app-sidebar-header-height');
369
+ this.setCssVar('--eui-app-sidebar-footer-height-default', '--eui-app-sidebar-footer-height');
370
+ }
371
+ activateHeaderCssVars() {
372
+ this.setCssVar('--eui-app-header-height-active', '--eui-app-header-height');
373
+ }
374
+ activateBreadcrumbCssVars() {
375
+ this.setCssVar('--eui-app-breadcrumb-height-active', '--eui-app-breadcrumb-height');
376
+ }
377
+ activateTopMessageCssVars(height) {
378
+ this._setCssVarValue('--eui-app-top-message-height', `${height}px`);
379
+ }
380
+ activateToolbarCssVars() {
381
+ this.setCssVar('--eui-app-toolbar-height-active', '--eui-app-toolbar-height');
382
+ }
383
+ activateFooterCssVars() {
384
+ this.setCssVar('--eui-app-footer-height-active', '--eui-app-footer-height');
385
+ }
386
+ setHeaderShrinkCssVar(active) {
387
+ if (active) {
388
+ this.setCssVar('--eui-app-header-height-shrink', '--eui-app-header-height');
389
+ }
390
+ else {
391
+ this.setCssVar('--eui-app-header-height-active', '--eui-app-header-height');
392
+ }
393
+ }
394
+ activateSidebarCssVars() {
395
+ this.setCssVar('--eui-app-sidebar-width-active', '--eui-app-sidebar-width');
396
+ this.setCssVar('--eui-app-sidebar-width-close-active', '--eui-app-sidebar-width-close');
397
+ }
398
+ removeSidebarCssVars() {
399
+ document.documentElement.style.removeProperty('--eui-app-sidebar-header-height');
400
+ document.documentElement.style.removeProperty('--eui-app-sidebar-footer-height');
401
+ document.documentElement.style.removeProperty('--eui-app-sidebar-width');
402
+ document.documentElement.style.removeProperty('--eui-app-sidebar-width-close');
403
+ }
404
+ activateSidebarHeaderCssVars() {
405
+ this.setCssVar('--eui-app-sidebar-header-height-active', '--eui-app-sidebar-header-height');
406
+ }
407
+ activateSidebarFooterCssVars() {
408
+ this.setCssVar('--eui-app-sidebar-footer-height-active', '--eui-app-sidebar-footer-height');
409
+ }
410
+ /**
411
+ * Gets the viewport height and width and multiple it by 1% to get a value for a vh/vw unit
412
+ * Sets the value in the --eui-app-vh custom property to the root of the document
413
+ * Sets the value in the --eui-app-vw custom property to the root of the document
414
+ * Example for 100% height: calc(var(--eui-app-vh, 1vh) * 100);
415
+ * Example for 50% height: calc(var(--eui-app-vh, 1vh) * 50);
416
+ * Example for 50% width: calc(var(--eui-app-vw, 1vw) * 50);
417
+ */
418
+ setAppViewportCssVars() {
419
+ const vh = window.innerHeight * 0.01;
420
+ const vw = window.innerWidth * 0.01;
421
+ this._setCssVarValue('--eui-app-vh', `${vh}px`);
422
+ this._setCssVarValue('--eui-app-vw', `${vw}px`);
423
+ }
424
+ /**
425
+ * Returns the current value of --eui-base-font-size CSS variable
426
+ */
427
+ getBaseFontSize() {
428
+ return this.state.appBaseFontSize || this.getCssVarValue('--eui-base-font-size');
429
+ }
430
+ /**
431
+ * Updates the current value of --eui-base-font-size CSS variable and the UIState appBaseFontSize
432
+ */
433
+ setBaseFontSize(newsize) {
434
+ this.setState({
435
+ ...this.state,
436
+ appBaseFontSize: newsize,
437
+ }, false);
438
+ this._setCssVarValue('--eui-base-font-size', newsize);
439
+ }
440
+ /**
441
+ * @deprecated don't remove as it's used for external legacy project under v17 (csdr-eui-legacy) to support MWP transition
442
+ */
443
+ openModal(modalId) {
444
+ document.body.classList.add('modal-open');
445
+ if (!modalId) {
446
+ modalId = 'single_modal';
447
+ }
448
+ this.activeModals.push({
449
+ id: modalId,
450
+ isOpen: true,
451
+ });
452
+ setTimeout(() => {
453
+ const el = document.getElementById(modalId + '-close-button');
454
+ if (el) {
455
+ el.focus();
456
+ }
457
+ }, 100);
458
+ }
459
+ /**
460
+ * @deprecated don't remove as it's used for external legacy project under v17 (csdr-eui-legacy) to support MWP transition
461
+ */
462
+ openMessageBox(messageBoxId) {
463
+ if (!messageBoxId) {
464
+ messageBoxId = 'messagebox_modal';
465
+ }
466
+ this.openModal(messageBoxId);
467
+ }
468
+ /**
469
+ * @deprecated don't remove as it's used for external legacy project under v17 (csdr-eui-legacy) to support MWP transition
470
+ */
471
+ closeMessageBox(messageBoxId) {
472
+ if (!messageBoxId) {
473
+ messageBoxId = 'messagebox_modal';
474
+ }
475
+ this.closeModal(messageBoxId);
476
+ }
477
+ /**
478
+ * @deprecated don't remove as it's used for external legacy project under v17 (csdr-eui-legacy) to support MWP transition
479
+ */
480
+ isModalOpen(modalId) {
481
+ if (!modalId) {
482
+ modalId = 'single_modal';
483
+ }
484
+ if (this.activeModals.length) {
485
+ const modalIndex = this.findModalIndex(modalId);
486
+ if (modalIndex !== -1) {
487
+ return this.activeModals[modalIndex].isOpen;
488
+ }
489
+ }
490
+ return false;
491
+ }
492
+ /**
493
+ * @deprecated don't remove as it's used for external legacy project under v17 (csdr-eui-legacy) to support MWP transition
494
+ */
495
+ closeModal(modalId) {
496
+ if (!modalId) {
497
+ modalId = 'single_modal';
498
+ }
499
+ /**
500
+ * Make sure we find the modal before splicing the activeModals array
501
+ */
502
+ const index = this.findModalIndex(modalId);
503
+ if (index >= 0) {
504
+ this.activeModals.splice(index, 1);
505
+ }
506
+ if (this.activeModals && this.activeModals.length <= 0) {
507
+ document.body.classList.remove('modal-open');
508
+ }
509
+ else {
510
+ // If there is still another (parent) modal dialog open, ensure it is focused upon to be able to close is with the ESC key:
511
+ const lastModalId = this.activeModals[this.activeModals.length - 1].id;
512
+ if (lastModalId) {
513
+ setTimeout(() => {
514
+ const el = document.getElementById(lastModalId + '-close-button');
515
+ if (el) {
516
+ el.focus();
517
+ }
518
+ }, 100);
519
+ }
520
+ }
521
+ }
522
+ /**
523
+ * @deprecated don't remove as it's used for external legacy project under v17 (csdr-eui-legacy) to support MWP transition
524
+ */
525
+ findModalIndex(modalId) {
526
+ let index = -1;
527
+ if (this.activeModals.length) {
528
+ for (let i = 0; i < this.activeModals.length; i++) {
529
+ if (this.activeModals[i].id === modalId) {
530
+ index = i;
531
+ break;
532
+ }
533
+ }
534
+ }
535
+ return index;
536
+ }
537
+ // ---------------
538
+ // private getters
539
+ // ---------------
540
+ getCssVarValue(inputProperty) {
541
+ return getComputedStyle(document.documentElement).getPropertyValue(inputProperty);
542
+ }
543
+ setCssVar(inputProperty, outputProperty) {
544
+ const cssVarValue = this.cssVars.filter((v) => v.key === inputProperty)[0].value;
545
+ this._setCssVarValue(outputProperty, cssVarValue);
546
+ // console.log(inputProperty, outputProperty, cssVarValue);
547
+ }
548
+ _setCssVarValue(varName, varValue) {
549
+ document.documentElement.style.setProperty(varName, varValue);
550
+ }
551
+ getWrapperClasses(state, breakpoint) {
552
+ const classes = [];
553
+ classes.push(breakpoint);
554
+ if (state.hasSidebar) {
555
+ if (state.isSidebarOpen && (state.isSidebarActive || state.isSidebarInnerActive)) {
556
+ classes.push('sidebar-state-open');
557
+ }
558
+ if (!state.isSidebarOpen && (state.isSidebarActive || state.isSidebarInnerActive)) {
559
+ classes.push('sidebar-state-close');
560
+ }
561
+ if (state.isSidebarActive) {
562
+ classes.push('sidebar-active');
563
+ }
564
+ if (state.isSidebarInnerActive) {
565
+ classes.push('sidebar-inner-active');
566
+ }
567
+ if (state.isSidebarStateCloseWithIcons) {
568
+ classes.push('sidebar-state-close-with-icons');
569
+ }
570
+ // NEW APP-SHELL props
571
+ if (state.isSidebarHidden) {
572
+ classes.push('sidebar--hidden');
573
+ }
574
+ if (state.isSidebarOpen) {
575
+ classes.push('sidebar--open');
576
+ }
577
+ else {
578
+ classes.push('sidebar--close');
579
+ }
580
+ if (state.isSidebarHover) {
581
+ classes.push('sidebar--hover');
582
+ }
583
+ }
584
+ if (state.deviceInfo && state.deviceInfo.isFF) {
585
+ classes.push('ff');
586
+ }
587
+ if (state.deviceInfo && state.deviceInfo.isIE) {
588
+ classes.push('ie');
589
+ }
590
+ if (state.deviceInfo && state.deviceInfo.isIE11) {
591
+ classes.push('ie11');
592
+ }
593
+ if (state.deviceInfo && state.deviceInfo.isChrome) {
594
+ classes.push('chrome');
595
+ }
596
+ return classes.join(' ');
597
+ }
598
+ getBreakpoint(windowWidth) {
599
+ let bkp = '';
600
+ switch (true) {
601
+ case windowWidth >= 0 && windowWidth < 576:
602
+ bkp = 'xs';
603
+ break;
604
+ case windowWidth >= 576 && windowWidth < 768:
605
+ bkp = 'sm';
606
+ break;
607
+ case windowWidth >= 768 && windowWidth < 992:
608
+ bkp = 'md';
609
+ break;
610
+ case windowWidth >= 992 && windowWidth < 1200:
611
+ bkp = 'lg';
612
+ break;
613
+ case windowWidth >= 1200 && windowWidth < 1400:
614
+ bkp = 'xl';
615
+ break;
616
+ case windowWidth >= 1400 && windowWidth < 1920:
617
+ bkp = 'xxl';
618
+ break;
619
+ case windowWidth >= 1920 && windowWidth < 2560:
620
+ bkp = 'fhd';
621
+ break;
622
+ case windowWidth >= 2560 && windowWidth < 3840:
623
+ bkp = '2k';
624
+ break;
625
+ case windowWidth >= 3840:
626
+ bkp = '4k';
627
+ break;
628
+ }
629
+ return bkp;
630
+ }
631
+ getBreakpoints(bkp) {
632
+ return {
633
+ isMobile: bkp === 'xs' || bkp === 'sm',
634
+ isTablet: bkp === 'md',
635
+ isLtDesktop: bkp === 'xs' || bkp === 'sm' || bkp === 'md',
636
+ isDesktop: bkp === 'lg',
637
+ isXL: bkp === 'xl',
638
+ isXXL: bkp === 'xxl',
639
+ isFHD: bkp === 'fhd',
640
+ is2K: bkp === '2k',
641
+ is4K: bkp === '4k',
642
+ };
643
+ }
644
+ getJson(url) {
645
+ return firstValueFrom(this.http.get(url)).then(this.extractData).catch(this.handleError);
646
+ }
647
+ extractData(res) {
648
+ const body = res;
649
+ return body || {};
650
+ }
651
+ // TODO: find the correct type or turn into a generic, https://www.typescriptlang.org/docs/handbook/2/generics.html
652
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
653
+ handleError(error) {
654
+ console.error('An error occurred', error);
655
+ return Promise.reject(error.message || error);
656
+ }
657
+ bindActiveLanguageToAppShellState() {
658
+ this.storeService.select(getActiveLang).subscribe((activeLang) => {
659
+ if (activeLang !== this.state.activeLanguage) {
660
+ this.setState({
661
+ ...this.state,
662
+ activeLanguage: activeLang,
663
+ }, false);
664
+ }
665
+ });
666
+ }
667
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.0-rc.1", ngImport: i0, type: EuiAppShellService, deps: [{ token: GLOBAL_CONFIG_TOKEN, optional: true }, { token: i1.HttpClient }, { token: PLATFORM_ID }, { token: i2.Router }, { token: i3.StoreService }, { token: i4.I18nService, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
668
+ /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.0-rc.1", ngImport: i0, type: EuiAppShellService, providedIn: 'root' }); }
669
+ }
670
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.0-rc.1", ngImport: i0, type: EuiAppShellService, decorators: [{
671
+ type: Injectable,
672
+ args: [{
673
+ providedIn: 'root',
674
+ }]
675
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
676
+ type: Optional
677
+ }, {
678
+ type: Inject,
679
+ args: [GLOBAL_CONFIG_TOKEN]
680
+ }] }, { type: i1.HttpClient }, { type: undefined, decorators: [{
681
+ type: Inject,
682
+ args: [PLATFORM_ID]
683
+ }] }, { type: i2.Router }, { type: i3.StoreService }, { type: i4.I18nService, decorators: [{
684
+ type: Optional
685
+ }] }] });
686
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXVpLWFwcC1zaGVsbC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy9ldWktYXBwLXNoZWxsLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUxRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDMUUsT0FBTyxFQUFFLGNBQWMsRUFBZ0IsYUFBYSxFQUEyQyxNQUFNLFdBQVcsQ0FBQztBQUNqSCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV0RCxPQUFPLEVBQVUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFeEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNELE9BQU8sT0FBTyxNQUFNLG1CQUFtQixDQUFDO0FBQ3hDLE9BQU8sR0FBRyxNQUFNLGVBQWUsQ0FBQzs7Ozs7O0FBa0VoQyxNQUFNLFlBQVksR0FBWTtJQUMxQixPQUFPLEVBQUUsRUFBRTtJQUNYLFlBQVksRUFBRSxFQUFFO0lBQ2hCLFdBQVcsRUFBRSxFQUFFO0lBQ2YsZUFBZSxFQUFFLEVBQUU7SUFDbkIsU0FBUyxFQUFFLElBQUk7SUFDZixZQUFZLEVBQUUsSUFBSTtJQUNsQixxQkFBcUIsRUFBRSxJQUFJO0lBQzNCLGFBQWEsRUFBRSxJQUFJO0lBQ25CLGNBQWMsRUFBRSxLQUFLO0lBQ3JCLGVBQWUsRUFBRSxLQUFLO0lBQ3RCLG9CQUFvQixFQUFFLEtBQUs7SUFDM0IsNEJBQTRCLEVBQUUsS0FBSztJQUNuQyxzQkFBc0IsRUFBRSxJQUFJO0lBQzVC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b3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsLCBQTEFURk9STV9JRCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgZGVmZXIsIGZpcnN0VmFsdWVGcm9tLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBFdWlFdUxhbmd1YWdlcywgR2xvYmFsQ29uZmlnLCBnZXRBY3RpdmVMYW5nLCBFdWlMYW5ndWFnZSwgRXVpTWVudUl0ZW0sIFV4TW9kYWxMZWdhY3kgfSBmcm9tICdAZXVpL2Jhc2UnO1xuaW1wb3J0IHsgR0xPQkFMX0NPTkZJR19UT0tFTiB9IGZyb20gJy4vY29uZmlnL3Rva2Vucyc7XG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJy4vaTE4bic7XG5pbXBvcnQgeyBSb3V0ZXIsIE5hdmlnYXRpb25FbmQgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgU3RvcmVTZXJ2aWNlIH0gZnJvbSAnLi9zdG9yZSc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IGlzRXF1YWwgZnJvbSAnbG9kYXNoLWVzL2lzRXF1YWwnO1xuaW1wb3J0IGdldCBmcm9tICdsb2Rhc2gtZXMvZ2V0JztcblxuLy8gVE9ETzogZmluZCB0aGUgY29ycmVjdCB0eXBlIG9yIHR1cm4gaW50byBhIGdlbmVyaWMsIGh0dHBzOi8vd3d3LnR5cGVzY3JpcHRsYW5nLm9yZy9kb2NzL2hhbmRib29rLzIvZ2VuZXJpY3MuaHRtbFxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBpbnRlcmZhY2UgVUlTdGF0ZTxCUCA9IGFueSwgREkgPSBhbnksIEFNRCA9YW55PiB7XG4gICAgLy8gYXBwIHN0YXRlXG4gICAgYXBwTmFtZT86IHN0cmluZztcbiAgICBhcHBTaG9ydE5hbWU/OiBzdHJpbmc7XG4gICAgYXBwU3ViVGl0bGU/OiBzdHJpbmc7XG4gICAgYXBwQmFzZUZvbnRTaXplPzogc3RyaW5nO1xuXG4gICAgLy8gdXNlciBzdGF0ZVxuICAgIHVzZXJJbmZvcz86IHN0cmluZztcbiAgICB1c2VyU3ViSW5mb3M/OiBzdHJpbmc7XG4gICAgaW1wZXJzb25hdGVkVXNlckluZm9zPzogc3RyaW5nO1xuXG4gICAgLy8gU2lkZWJhciBzdGF0ZVxuICAgIGlzU2lkZWJhck9wZW4/OiBib29sZWFuO1xuICAgIGlzU2lkZWJhckhvdmVyPzogYm9vbGVhbjtcbiAgICBpc1NpZGViYXJBY3RpdmU/OiBib29sZWFuO1xuICAgIGlzU2lkZWJhcklubmVyQWN0aXZlPzogYm9vbGVhbjtcbiAgICBpc1NpZGViYXJTdGF0ZUNsb3NlV2l0aEljb25zPzogYm9vbGVhbjtcbiAgICBpc1NpZGViYXJFeHBhbmRPbkhvdmVyPzogYm9vbGVhbjtcbiAgICBoYXNTaWRlYmFyPzogYm9vbGVhbjtcbiAgICBoYXNCcmVhZGNydW1iPzogYm9vbGVhbjtcbiAgICBoYXNIZWFkZXI/OiBib29sZWFuO1xuICAgIGhhc0hlYWRlckxvZ28/OiBib29sZWFuO1xuICAgIGhhc0hlYWRlckVudmlyb25tZW50PzogYm9vbGVhbjtcbiAgICBoYXNUb29sYmFyPzogYm9vbGVhbjtcbiAgICBoYXNUb29sYmFyTWVudT86IGJvb2xlYW47XG4gICAgZW52aXJvbm1lbnRWYWx1ZT86IHN0cmluZztcbiAgICBpc1NpZGViYXJIaWRkZW4/OiBib29sZWFuO1xuICAgIGhhc1RvcE1lc3NhZ2U/OiBib29sZWFuO1xuXG4gICAgLy8gd2luZG93IHN0YXRlXG4gICAgd2luZG93V2lkdGg/OiBudW1iZXI7XG4gICAgd2luZG93SGVpZ2h0PzogbnVtYmVyO1xuICAgIG1haW5Db250ZW50SGVpZ2h0PzogbnVtYmVyO1xuICAgIHBhZ2VIZWFkZXJIZWlnaHQ/OiBudW1iZXI7XG4gICAgYnJlYWtwb2ludD86IHN0cmluZztcbiAgICB3cmFwcGVyQ2xhc3Nlcz86IHN0cmluZztcbiAgICBicmVha3BvaW50cz86IEJQO1xuXG4gICAgLy8gbmF2aWdhdGlvbiBzdGF0ZVxuICAgIG1lbnVMaW5rcz86IEV1aU1lbnVJdGVtW107XG4gICAgc2lkZWJhckxpbmtzPzogRXVpTWVudUl0ZW1bXTtcbiAgICBjb21iaW5lZExpbmtzPzogRXVpTWVudUl0ZW1bXTtcblxuICAgIC8vIG90aGVyIHN0YXRlc1xuICAgIGlzQmxvY2tEb2N1bWVudEFjdGl2ZT86IGJvb2xlYW47XG5cbiAgICAvLyBkZXZpY2UgaW5mb1xuICAgIGRldmljZUluZm86IERJO1xuXG4gICAgLy8gbGFuZ3VhZ2UgaW5mb3NcbiAgICBhY3RpdmVMYW5ndWFnZTogc3RyaW5nO1xuICAgIGxhbmd1YWdlczogKHN0cmluZyB8IEV1aUxhbmd1YWdlKVtdO1xuXG4gICAgLy8gYXBwIG1ldGFkYXRhXG4gICAgYXBwTWV0YWRhdGE6IEFNRDtcblxuICAgIC8vIHZhcmlvdXMgZHluYW1pYyBzdGF0ZVxuICAgIGhhc01vZGFsQWN0aXZlPzogYm9vbGVhbjtcbiAgICBpc0RpbW1lckFjdGl2ZT86IGJvb2xlYW47IC8vIFVzYWdlOiBtYXAgdG8gZXVpIGJhc2UgZGlyZWN0aXZlIGlucHV0IGNvZXJjZSBldWlIaWdobGlnaHRlZFxufVxuXG5jb25zdCBpbml0aWFsU3RhdGU6IFVJU3RhdGUgPSB7XG4gICAgYXBwTmFtZTogJycsXG4gICAgYXBwU2hvcnROYW1lOiAnJyxcbiAgICBhcHBTdWJUaXRsZTogJycsXG4gICAgYXBwQmFzZUZvbnRTaXplOiAnJyxcbiAgICB1c2VySW5mb3M6IG51bGwsXG4gICAgdXNlclN1YkluZm9zOiBudWxsLFxuICAgIGltcGVyc29uYXRlZFVzZXJJbmZvczogbnVsbCxcbiAgICBpc1NpZGViYXJPcGVuOiB0cnVlLFxuICAgIGlzU2lkZWJhckhvdmVyOiBmYWxzZSxcbiAgICBpc1NpZGViYXJBY3RpdmU6IGZhbHNlLFxuICAgIGlzU2lkZWJhcklubmVyQWN0aXZlOiBmYWxzZSxcbiAgICBpc1NpZGViYXJTdGF0ZUNsb3NlV2l0aEljb25zOiBmYWxzZSxcbiAgICBpc1NpZGViYXJFeHBhbmRPbkhvdmVyOiB0cnVlLFxuICAgIGhhc1NpZGViYXI6IGZhbHNlLFxuICAgIGhhc0hlYWRlcjogZmFsc2UsXG4gICAgaGFzQnJlYWRjcnVtYjogZmFsc2UsXG4gICAgaGFzSGVhZGVyTG9nbzogZmFsc2UsXG4gICAgaGFzSGVhZGVyRW52aXJvbm1lbnQ6IGZhbHNlLFxuICAgIGhhc1Rvb2xiYXI6IGZhbHNlLFxuICAgIGhhc1Rvb2xiYXJNZW51OiBmYWxzZSxcbiAgICBlbnZpcm9ubWVudFZhbHVlOiAnJyxcbiAgICBpc1NpZGViYXJIaWRkZW46IGZhbHNlLFxuICAgIGhhc1RvcE1lc3NhZ2U6IGZhbHNlLFxuICAgIHdpbmRvd1dpZHRoOiAwLFxuICAgIHdpbmRvd0hlaWdodDogMCxcbiAgICBtYWluQ29udGVudEhlaWdodDogMCxcbiAgICBwYWdlSGVhZGVySGVpZ2h0OiAwLFxuICAgIHdyYXBwZXJDbGFzc2VzOiAnJyxcbiAgICBicmVha3BvaW50OiAnJyxcbiAgICBicmVha3BvaW50czoge1xuICAgICAgICBpc01vYmlsZTogZmFsc2UsXG4gICAgICAgIGlzVGFibGV0OiBmYWxzZSxcbiAgICAgICAgaXNMdERlc2t0b3A6IGZhbHNlLFxuICAgICAgICBpc0Rlc2t0b3A6IGZhbHNlLFxuICAgICAgICBpc1hMOiBmYWxzZSxcbiAgICAgICAgaXNYWEw6IGZhbHNlLFxuICAgICAgICBpc0ZIRDogZmFsc2UsXG4gICAgICAgIGlzMks6IGZhbHNlLFxuICAgICAgICBpczRLOiBmYWxzZSxcbiAgICB9LFxuICAgIG1lbnVMaW5rczogW10sXG4gICAgc2lkZWJhckxpbmtzOiBbXSxcbiAgICBjb21iaW5lZExpbmtzOiBbXSxcbiAgICBpc0Jsb2NrRG9jdW1lbnRBY3RpdmU6IGZhbHNlLFxuICAgIGRldmljZUluZm86IG51bGwsXG4gICAgYWN0aXZlTGFuZ3VhZ2U6ICdlbicsXG4gICAgbGFuZ3VhZ2VzOiBFdWlFdUxhbmd1YWdlcy5nZXRMYW5ndWFnZXMoKSxcbiAgICBhcHBNZXRhZGF0YTogbnVsbCxcbiAgICBoYXNNb2RhbEFjdGl2ZTogZmFsc2UsXG4gICAgaXNEaW1tZXJBY3RpdmU6IGZhbHNlLFxufTtcblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgRXVpQXBwU2hlbGxTZXJ2aWNlIHtcbiAgICBuYXZpZ2F0aW9uU3RhcnRDdXN0b21IYW5kbGVyOiAoKSA9PiB2b2lkO1xuICAgIG5hdmlnYXRpb25FbmRDdXN0b21IYW5kbGVyOiAoKSA9PiB2b2lkO1xuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgZG9uJ3QgcmVtb3ZlIGFzIGl0J3MgdXNlZCBmb3IgZXh0ZXJuYWwgbGVnYWN5IHByb2plY3QgdW5kZXIgdjE3IChjc2RyLWV1aS1sZWdhY3kpIHRvIHN1cHBvcnQgTVdQIHRyYW5zaXRpb25cbiAgICAgKi9cbiAgICBvcGVuTW9kYWxJZCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPignJyk7XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBkb24ndCByZW1vdmUgYXMgaXQncyB1c2VkIGZvciBleHRlcm5hbCBsZWdhY3kgcHJvamVjdCB1bmRlciB2MTcgKGNzZHItZXVpLWxlZ2FjeSkgdG8gc3VwcG9ydCBNV1AgdHJhbnNpdGlvblxuICAgICAqL1xuICAgIGFjdGl2ZU1vZGFsczogVXhNb2RhbExlZ2FjeVtdID0gW107XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZ2V0IHN0YXRlJCgpOiBPYnNlcnZhYmxlPFVJU3RhdGU+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXRlJC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gZXhwb3NlZCBvYnNlcnZhYmxlc1xuXG4gICAgZ2V0IGJyZWFrcG9pbnQkKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9icmVha3BvaW50JC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBmaW5kIHRoZSBjb3JyZWN0IHR5cGUgb3IgdHVybiBpbnRvIGEgZ2VuZXJpYywgaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL2RvY3MvaGFuZGJvb2svMi9nZW5lcmljcy5odG1sXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBnZXQgYnJlYWtwb2ludHMkKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9icmVha3BvaW50cyQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIHN0YXRlIG9wZXJhdGlvbnNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tXG4gICAgZ2V0IHN0YXRlKCk6IFVJU3RhdGUge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RhdGUkLmdldFZhbHVlKCk7XG4gICAgfVxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIHB1YmxpYyBzZXR0ZXJzIGFuZCBmdW5jdGlvbnNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgc2V0IGlzU2lkZWJhck9wZW4oaXNPcGVuOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIGlzU2lkZWJhck9wZW46IGlzT3BlbixcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0IGlzU2lkZWJhck9wZW4oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlLmlzU2lkZWJhck9wZW47XG4gICAgfVxuXG4gICAgc2V0IGlzU2lkZWJhckhvdmVyKGlzSG92ZXI6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuaXNTaWRlYmFyRXhwYW5kT25Ib3Zlcikge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgICAgICAgICAgICBpc1NpZGViYXJIb3ZlcjogaXNIb3ZlcixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IGlzU2lkZWJhckhvdmVyKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5pc1NpZGViYXJIb3ZlcjtcbiAgICB9XG5cbiAgICBzZXQgaXNTaWRlYmFyQWN0aXZlKGlzQWN0aXZlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIGlzU2lkZWJhckFjdGl2ZTogaXNBY3RpdmUsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldCBpc1NpZGViYXJJbm5lckFjdGl2ZShpc09wZW46IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAuLi50aGlzLnN0YXRlLFxuICAgICAgICAgICAgaXNTaWRlYmFySW5uZXJBY3RpdmU6IGlzT3BlbixcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0IHNpZGViYXJMaW5rcyhsaW5rczogRXVpTWVudUl0ZW1bXSkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIC4uLnRoaXMuc3RhdGUsXG4gICAgICAgICAgICBzaWRlYmFyTGlua3M6IGxpbmtzLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXQgbWVudUxpbmtzKGxpbmtzOiBFdWlNZW51SXRlbVtdKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIG1lbnVMaW5rczogbGlua3MsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldCBpc0Jsb2NrRG9jdW1lbnRBY3RpdmUoaXNBY3RpdmU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAuLi50aGlzLnN0YXRlLFxuICAgICAgICAgICAgaXNCbG9ja0RvY3VtZW50QWN0aXZlOiBpc0FjdGl2ZSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0IGhhc0hlYWRlcigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuaGFzSGVhZGVyO1xuICAgIH1cblxuICAgIC8vIEVkaXQgbW9kZVxuICAgIGdldCBpc0RpbW1lckFjdGl2ZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuaXNEaW1tZXJBY3RpdmU7XG4gICAgfVxuXG4gICAgc2V0IGlzRGltbWVyQWN0aXZlKGlzQWN0aXZlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIGlzRGltbWVyQWN0aXZlOiBpc0FjdGl2ZSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjc3NWYXJzID0gW107XG4gICAgcHJpdmF0ZSBfc3RhdGUkOiBCZWhhdmlvclN1YmplY3Q8VUlTdGF0ZT47XG4gICAgcHJpdmF0ZSBfYnJlYWtwb2ludCQ6IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+O1xuICAgIC8vIFRPRE86IGZpbmQgdGhlIGNvcnJlY3QgdHlwZSBvciB0dXJuIGludG8gYSBnZW5lcmljLCBodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay8yL2dlbmVyaWNzLmh0bWxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHByaXZhdGUgX2JyZWFrcG9pbnRzJDogQmVoYXZpb3JTdWJqZWN0PGFueT47XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChHTE9CQUxfQ09ORklHX1RPS0VOKSBwcm90ZWN0ZWQgY29uZmlnOiBHbG9iYWxDb25maWcsXG4gICAgICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcbiAgICAgICAgQEluamVjdChQTEFURk9STV9JRCkgcHJpdmF0ZSBwbGF0Zm9ybUlkOiBvYmplY3QsXG4gICAgICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgICAgIHByaXZhdGUgc3RvcmVTZXJ2aWNlOiBTdG9yZVNlcnZpY2UsXG4gICAgICAgIEBPcHRpb25hbCgpIHByaXZhdGUgaTE4blNlcnZpY2U6IEkxOG5TZXJ2aWNlLFxuICAgICkge1xuICAgICAgICBsZXQgc3RhdGVXaXRoQ29uZmlnID0gaW5pdGlhbFN0YXRlO1xuICAgICAgICBjb25zdCBsYW5ndWFnZXMgPSBjb25maWc/LmkxOG4/LmkxOG5TZXJ2aWNlPy5sYW5ndWFnZXMgfHwgaW5pdGlhbFN0YXRlLmxhbmd1YWdlcztcbiAgICAgICAgY29uc3QgZGVmYXVsdExhbmd1YWdlID0gY29uZmlnPy5pMThuPy5pMThuU2VydmljZT8uZGVmYXVsdExhbmd1YWdlIHx8IGluaXRpYWxTdGF0ZS5hY3RpdmVMYW5ndWFnZTtcbiAgICAgICAgc3RhdGVXaXRoQ29uZmlnID0ge1xuICAgICAgICAgICAgLi4uc3RhdGVXaXRoQ29uZmlnLFxuICAgICAgICAgICAgLi4ue1xuICAgICAgICAgICAgICAgIGxhbmd1YWdlcyxcbiAgICAgICAgICAgICAgICBhY3RpdmVMYW5ndWFnZTogZGVmYXVsdExhbmd1YWdlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fc3RhdGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdChzdGF0ZVdpdGhDb25maWcpO1xuICAgICAgICB0aGlzLl9icmVha3BvaW50JCA9IG5ldyBCZWhhdmlvclN1YmplY3QoJycpO1xuICAgICAgICB0aGlzLl9icmVha3BvaW50cyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHt9KTtcbiAgICAgICAgdGhpcy5iaW5kQWN0aXZlTGFuZ3VhZ2VUb0FwcFNoZWxsU3RhdGUoKTtcblxuICAgICAgICBpZiAoaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkge1xuICAgICAgICAgICAgcm91dGVyLmV2ZW50cy5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCkge1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oMCwgMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRTdGF0ZShuZXh0U3RhdGU6IFVJU3RhdGUsIHVwZGF0ZUkxOCA9IHRydWUpOiB2b2lkIHtcbiAgICAgICAgbGV0IGJyZWFrcG9pbnQsIGJyZWFrcG9pbnRzO1xuICAgICAgICBsZXQgY29tYmluZWRMaW5rcztcblxuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuc3RhdGU7XG5cbiAgICAgICAgLy8gY2hlY2sgaWYgd2luZG93IHdpZHRoIGhhcyBiZWVuIHVwZGF0ZWQgZnJvbSBwcmV2aW91cyBzdGF0ZVxuICAgICAgICBpZiAodGhpcy5zdGF0ZS53aW5kb3dXaWR0aCAhPT0gbmV4dFN0YXRlLndpbmRvd1dpZHRoKSB7XG4gICAgICAgICAgICBicmVha3BvaW50ID0gdGhpcy5nZXRCcmVha3BvaW50KG5leHRTdGF0ZS53aW5kb3dXaWR0aCk7XG4gICAgICAgICAgICBicmVha3BvaW50cyA9IHRoaXMuZ2V0QnJlYWtwb2ludHMoYnJlYWtwb2ludCk7XG5cbiAgICAgICAgICAgIHRoaXMuX2JyZWFrcG9pbnQkLm5leHQoYnJlYWtwb2ludCk7XG4gICAgICAgICAgICB0aGlzLl9icmVha3BvaW50cyQubmV4dChicmVha3BvaW50cyk7XG5cbiAgICAgICAgICAgIC8vIGlmIG5vdCBwcm9wYWdhdGUgdGhlIG9sZCBvbmVzIHdpdGhvdXQgZG9pbmcgYW55IGNhbGN1bGF0aW9uc1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYnJlYWtwb2ludCA9IHN0YXRlLmJyZWFrcG9pbnQ7XG4gICAgICAgICAgICBicmVha3BvaW50cyA9IHN0YXRlLmJyZWFrcG9pbnRzO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZmluYWxseSBnZXQgdGhlIHdyYXBwZXIgY2xhc3NlcyB3aGVuIGJvdGggdGhlIHN0YXRlIGFuZCBicmVha3BvaW50IGFyZSBrbm93blxuICAgICAgICBjb25zdCB3cmFwcGVyQ2xhc3NlcyA9IHRoaXMuZ2V0V3JhcHBlckNsYXNzZXMobmV4dFN0YXRlLCBicmVha3BvaW50KTtcblxuICAgICAgICAvLyBjaGVjayBpZiB0aGUgbWVudUxpbmtzIG9yIHNpZGViYXJMaW5rcyBoYXZlIGNoYW5nZWQgZnJvbSBwcmV2aW91cyBzdGF0ZVxuICAgICAgICBpZiAodGhpcy5zdGF0ZS5tZW51TGlua3MgIT09IG5leHRTdGF0ZS5tZW51TGlua3MgfHwgdGhpcy5zdGF0ZS5zaWRlYmFyTGlua3MgIT09IG5leHRTdGF0ZS5zaWRlYmFyTGlua3MpIHtcbiAgICAgICAgICAgIGNvbWJpbmVkTGlua3MgPSBbLi4ubmV4dFN0YXRlLm1lbnVMaW5rcywgLi4ubmV4dFN0YXRlLnNpZGViYXJMaW5rc107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb21iaW5lZExpbmtzID0gdGhpcy5zdGF0ZS5jb21iaW5lZExpbmtzO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3RhdGVCZWZvcmVVcGRhdGUgPSB7IC4uLnRoaXMuc3RhdGUgfTtcblxuICAgICAgICAvLyB3ZSBwdXQgaXQgYWxsIHRvZ2V0aGVyIHdpdGggdGhlIGNhbGN1bGF0ZWQgcHJvcGVydGllc1xuICAgICAgICB0aGlzLl9zdGF0ZSQubmV4dCh7XG4gICAgICAgICAgICAuLi5uZXh0U3RhdGUsXG4gICAgICAgICAgICB3cmFwcGVyQ2xhc3NlcyxcbiAgICAgICAgICAgIGJyZWFrcG9pbnQsXG4gICAgICAgICAgICBicmVha3BvaW50cyxcbiAgICAgICAgICAgIGNvbWJpbmVkTGlua3MsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIHVwZGF0ZSB0aGUgU3RvcmUgTGFuZ3VhZ2VcbiAgICAgICAgaWYgKHVwZGF0ZUkxOCAmJiBuZXh0U3RhdGUuYWN0aXZlTGFuZ3VhZ2UgIT09IHN0YXRlQmVmb3JlVXBkYXRlLmFjdGl2ZUxhbmd1YWdlKSB7XG4gICAgICAgICAgICB0aGlzLmkxOG5TZXJ2aWNlLnVwZGF0ZVN0YXRlKHsgYWN0aXZlTGFuZzogbmV4dFN0YXRlLmFjdGl2ZUxhbmd1YWdlIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW1pdHMgYSBzbGljZSBmcm9tIHRoZSBzdGF0ZSB3aGV0aGVyIHRoYXQgY2hhbmdlc1xuICAgICAqXG4gICAgICogQHBhcmFtIGtleSBjYW4gYmUgJ2tleScgb3IgJ2tleS5zdWIuc3ViJ1xuICAgICAqL1xuICAgIC8vIFRPRE86IGZpbmQgdGhlIGNvcnJlY3QgdHlwZSBvciB0dXJuIGludG8gYSBnZW5lcmljLCBodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay8yL2dlbmVyaWNzLmh0bWxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGdldFN0YXRlKGtleT86IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIHJldHVybiBkZWZlcigoKSA9PlxuICAgICAgICAgICAgLy8gY2hlY2sgaWYga2V5IGV4aXN0c1xuICAgICAgICAgICAga2V5XG4gICAgICAgICAgICAgICAgPyB0aGlzLnN0YXRlJC5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgIG1hcCgoc3RhdGUpID0+IGdldChzdGF0ZSwga2V5KSksXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZmlsdGVyKChzdGF0ZSkgPT4gc3RhdGUpLFxuICAgICAgICAgICAgICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCh4LCB5KSA9PiBpc0VxdWFsKHgsIHkpKSxcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICA6IHRoaXMuc3RhdGUkLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzaWRlYmFyVG9nZ2xlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlzU2lkZWJhck9wZW4gPSAhdGhpcy5zdGF0ZS5pc1NpZGViYXJPcGVuO1xuICAgIH1cblxuICAgIC8vIEVkaXQgbW9kZVxuICAgIHB1YmxpYyBkaW1tZXJBY3RpdmVUb2dnbGUoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGlzQWN0aXZlID0gdGhpcy5pc0RpbW1lckFjdGl2ZTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAuLi50aGlzLnN0YXRlLFxuICAgICAgICAgICAgaXNEaW1tZXJBY3RpdmU6ICFpc0FjdGl2ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYWN0aXZhdGVFZGl0TW9kZUNzc1ZhcnMoIWlzQWN0aXZlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0RGltbWVyQWN0aXZlU3RhdGUoYWN0aXZlU3RhdGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAuLi50aGlzLnN0YXRlLFxuICAgICAgICAgICAgaXNEaW1tZXJBY3RpdmU6IGFjdGl2ZVN0YXRlLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hY3RpdmF0ZUVkaXRNb2RlQ3NzVmFycyhhY3RpdmVTdGF0ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFjdGl2YXRlRWRpdE1vZGVDc3NWYXJzKGlzQWN0aXZlOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGlmIChpc0FjdGl2ZSkge1xuICAgICAgICAgICAgdGhpcy5fc2V0Q3NzVmFyVmFsdWUoJy0tZXVpLWRvY3BhZ2UtbmF2aWdhdGlvbi16LWluZGV4JywgJ2luaGVyaXQnKTsgLy8gUmVzZXQgZG9jLXBhZ2UtbmF2aWdhdGlvbi1jb2x1bW4gei1pbmRleFxuICAgICAgICAgICAgdGhpcy5fc2V0Q3NzVmFyVmFsdWUoJy0tZXVpLXotaW5kZXgtc2lkZWJhcicsICdpbmhlcml0Jyk7IC8vIFJlc2V0IGV1aS1hcHAtc2lkZWJhciB6LWluZGV4XG4gICAgICAgICAgICB0aGlzLl9zZXRDc3NWYXJWYWx1ZSgnLS1ldWktei1pbmRleC1yb290JywgJ2luaGVyaXQnKTsgLy8gUmVzZXQgZXVpLWFwcC1tYWluLWNvbnRlbnQgei1pbmRleFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fc2V0Q3NzVmFyVmFsdWUoJy0tZXVpLWRvY3BhZ2UtbmF2aWdhdGlvbi16LWluZGV4JywgJzInKTsgLy8gUmVzdG9yZSBkb2MtcGFnZS1uYXZpZ2F0aW9uLWNvbHVtbiB6LWluZGV4XG4gICAgICAgICAgICB0aGlzLl9zZXRDc3NWYXJWYWx1ZSgnLS1ldWktei1pbmRleC1zaWRlYmFyJywgJzEwNDQnKTsgLy8gUmVzdG9yZSBldWktYXBwLXNpZGViYXIgei1pbmRleFxuICAgICAgICAgICAgdGhpcy5fc2V0Q3NzVmFyVmFsdWUoJy0tZXVpLXotaW5kZXgtcm9vdCcsICcxJyk7IC8vIFJlc3RvcmUgZXVpLWFwcC1tYWluLWNvbnRlbnQgei1pbmRleFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBwdWJsaWMgbWV0aG9kc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tXG4gICAgcHVibGljIGZldGNoQXBwTWV0YWRhdGEobWV0YWRhdGFGaWxlUGF0aCA9ICdhc3NldHMvYXBwLW1ldGFkYXRhLmpzb24nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZ2V0SnNvbihtZXRhZGF0YUZpbGVQYXRoKS50aGVuKChkYXRhKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICAuLi50aGlzLnN0YXRlLFxuICAgICAgICAgICAgICAgIGFwcE1ldGFkYXRhOiBkYXRhLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhY3RpdmF0ZVNpZGViYXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIGhhc1NpZGViYXI6IHRydWUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghdGhpcy5zdGF0ZS5pc1NpZGViYXJIaWRkZW4pIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZhdGVTaWRlYmFyQ3NzVmFycygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFjdGl2YXRlU2lkZWJhckhlYWRlcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hY3RpdmF0ZVNpZGViYXJIZWFkZXJDc3NWYXJzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFjdGl2YXRlU2lkZWJhckZvb3RlcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hY3RpdmF0ZVNpZGViYXJGb290ZXJDc3NWYXJzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFjdGl2YXRlSGVhZGVyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIC4uLnRoaXMuc3RhdGUsXG4gICAgICAgICAgICBoYXNIZWFkZXI6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFjdGl2YXRlSGVhZGVyQ3NzVmFycygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhY3RpdmF0ZUJyZWFkY3J1bWIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIGhhc0JyZWFkY3J1bWI6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFjdGl2YXRlQnJlYWRjcnVtYkNzc1ZhcnMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWN0aXZhdGVUb3BNZXNzYWdlKGhlaWdodDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIGhhc1RvcE1lc3NhZ2U6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFjdGl2YXRlVG9wTWVzc2FnZUNzc1ZhcnMoaGVpZ2h0KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWN0aXZhdGVUb29sYmFyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIC4uLnRoaXMuc3RhdGUsXG4gICAgICAgICAgICBoYXNUb29sYmFyOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hY3RpdmF0ZVRvb2xiYXJDc3NWYXJzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFjdGl2YXRlVG9vbGJhck1lbnUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIGhhc1Rvb2xiYXJNZW51OiB0cnVlLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZmV0Y2hDc3NWYXJzKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBjc3NWYXJOYW1lcyA9IFtcbiAgICAgICAgICAgICctLWV1aS1hcHAtaGVhZGVyLWhlaWdodC1kZWZhdWx0JyxcbiAgICAgICAgICAgICctLWV1aS1hcHAtaGVhZGVyLWhlaWdodC1hY3RpdmUnLFxuICAgICAgICAgICAgJy0tZXVpLWFwcC1oZWFkZXItaGVpZ2h0LXNocmluaycsXG4gICAgICAgICAgICAnLS1ldWktYXBwLWJyZWFkY3J1bWItaGVpZ2h0LWRlZmF1bHQnLFxuICAgICAgICAgICAgJy0tZXVpLWFwcC1icmVhZGNydW1iLWhlaWdodC1hY3RpdmUnLFxuICAgICAgICAgICAgJy0tZXVpLWFwcC10b3AtbWVzc2FnZS1oZWlnaHQtZGVmYXVsdCcsXG4gICAgICAgICAgICAnLS1ldWktYXBwLXRvcC1tZXNzYWdlLWhlaWdodC1hY3RpdmUnLFxuICAgICAgICAgICAgJy0tZXVpLWFwcC10b3AtbWVzc2FnZS1oZWlnaHQtc2hyaW5rJyxcbiAgICAgICAgICAgICctLWV1aS1hcHAtdG9vbGJhci1oZWlnaHQtZGVmYXVsdCcsXG4gICAgICAgICAgICAnLS1ldWktYXBwLXRvb2xiYXItaGVpZ2h0LWFjdGl2ZScsXG4gICAgICAgICAgICAnLS1ldWktYXBwLXNpZGViYXItd2lkdGgtZGVmYXVsdCcsXG4gICAgICAgICAgICAnLS1ldWktYXBwLXNpZGViYXItd2lkdGgtYWN0aXZlJyxcbiAgICAgICAgICAgICctLWV1aS1hcHAtc2lkZWJhci13aWR0aC1jbG9zZS1kZWZhdWx0JyxcbiAgICAgICAgICAgICctLWV1aS1hcHAtc2lkZWJhci13aWR0aC1jbG9zZS1hY3RpdmUnLFxuICAgICAgICAgICAgJy0tZXVpLWFwcC1zaWRlYmFyLWhlYWRlci1oZWlnaHQtZGVmYXVsdCcsXG4gICAgICAgICAgICAnLS1ldWktYXBwLXNpZGViYXItaGVhZGVyLWhlaWdodC1hY3RpdmUnLFxuICAgICAgICAgICAgJy0tZXVpLWFwcC1zaWRlYmFyLWZvb3Rlci1oZWlnaHQtZGVmYXVsdCcsXG4gICAgICAgICAgICAnLS1ldWktYXBwLXNpZGViYXItZm9vdGVyLWhlaWdodC1hY3RpdmUnLFxuICAgICAgICBdO1xuXG4gICAgICAgIHRoaXMuY3NzVmFycyA9IGNzc1Zhck5hbWVzLm1hcCgodikgPT4gKHsga2V5OiB2LCB2YWx1ZTogdGhpcy5nZXRDc3NWYXJWYWx1ZSh2KSB9KSk7XG4gICAgfVxuXG4gICAgcHVibGljIGluaXRDc3NWYXJzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldENzc1ZhcignLS1ldWktYXBwLWhlYWRlci1oZWlnaHQtZGVmYXVsdCcsICctLWV1aS1hcHAtaGVhZGVyLWhlaWdodCcpO1xuICAgICAgICB0aGlzLnNldENzc1ZhcignLS1ldWktYXBwLWJyZWFkY3J1bWItaGVpZ2h0LWRlZmF1bHQnLCAnLS1ldWktYXBwLWJyZWFkY3J1bWItaGVpZ2h0Jyk7XG4gICAgICAgIHRoaXMuc2V0Q3NzVmFyKCctLWV1aS1hcHAtdG9wLW1lc3NhZ2UtaGVpZ2h0LWRlZmF1bHQnLCAnLS1ldWktYXBwLXRvcC1tZXNzYWdlLWhlaWdodCcpO1xuICAgICAgICB0aGlzLnNldENzc1ZhcignLS1ldWktYXBwLXRvb2xiYXItaGVpZ2h0LWRlZmF1bHQnLCAnLS1ldWktYXBwLXRvb2xiYXItaGVpZ2h0Jyk7XG4gICAgICAgIHRoaXMuc2V0Q3NzVmFyKCctLWV1aS1hcHAtc2lkZWJhci13aWR0aC1kZWZhdWx0JywgJy0tZXVpLWFwcC1zaWRlYmFyLXdpZHRoJyk7XG4gICAgICAgIHRoaXMuc2V0Q3NzVmFyKCctLWV1aS1hcHAtc2lkZWJhci13aWR0aC1jbG9zZS1kZWZhdWx0JywgJy0tZXVpLWFwcC1zaWRlYmFyLXdpZHRoLWNsb3NlJyk7XG4gICAgICAgIHRoaXMuc2V0Q3NzVmFyKCctLWV1aS1hcHAtc2lkZWJhci1oZWFkZXItaGVpZ2h0LWRlZmF1bHQnLCAnLS1ldWktYXBwLXNpZGViYXItaGVhZGVyLWhlaWdodCcpO1xuICAgICAgICB0aGlzLnNldENzc1ZhcignLS1ldWktYXBwLXNpZGViYXItZm9vdGVyLWhlaWdodC1kZWZhdWx0JywgJy0tZXVpLWFwcC1zaWRlYmFyLWZvb3Rlci1oZWlnaHQnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWN0aXZhdGVIZWFkZXJDc3NWYXJzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldENzc1ZhcignLS1ldWktYXBwLWhlYWRlci1oZWlnaHQtYWN0aXZlJywgJy0tZXVpLWFwcC1oZWFkZXItaGVpZ2h0Jyk7XG4gICAgfVxuICAgIHB1YmxpYyBhY3RpdmF0ZUJyZWFkY3J1bWJDc3NWYXJzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldENzc1ZhcignLS1ldWktYXBwLWJyZWFkY3J1bWItaGVpZ2h0LWFjdGl2ZScsICctLWV1aS1hcHAtYnJlYWRjcnVtYi1oZWlnaHQnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWN0aXZhdGVUb3BNZXNzYWdlQ3NzVmFycyhoZWlnaHQ6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLl9zZXRDc3NWYXJWYWx1ZSgnLS1ldWktYXBwLXRvcC1tZXNzYWdlLWhlaWdodCcsIGAke2hlaWdodH1weGApO1xuICAgIH1cblxuICAgIHB1YmxpYyBhY3RpdmF0ZVRvb2xiYXJDc3NWYXJzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldENzc1ZhcignLS1ldWktYXBwLXRvb2xiYXItaGVpZ2h0LWFjdGl2ZScsICctLWV1aS1hcHAtdG9vbGJhci1oZWlnaHQnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWN0aXZhdGVGb290ZXJDc3NWYXJzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldENzc1ZhcignLS1ldWktYXBwLWZvb3Rlci1oZWlnaHQtYWN0aXZlJywgJy0tZXVpLWFwcC1mb290ZXItaGVpZ2h0Jyk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldEhlYWRlclNocmlua0Nzc1ZhcihhY3RpdmU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgaWYgKGFjdGl2ZSkge1xuICAgICAgICAgICAgdGhpcy5zZXRDc3NWYXIoJy0tZXVpLWFwcC1oZWFkZXItaGVpZ2h0LXNocmluaycsICctLWV1aS1hcHAtaGVhZGVyLWhlaWdodCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXRDc3NWYXIoJy0tZXVpLWFwcC1oZWFkZXItaGVpZ2h0LWFjdGl2ZScsICctLWV1aS1hcHAtaGVhZGVyLWhlaWdodCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFjdGl2YXRlU2lkZWJhckNzc1ZhcnMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2V0Q3NzVmFyKCctLWV1aS1hcHAtc2lkZWJhci13aWR0aC1hY3RpdmUnLCAnLS1ldWktYXBwLXNpZGViYXItd2lkdGgnKTtcbiAgICAgICAgdGhpcy5zZXRDc3NWYXIoJy0tZXVpLWFwcC1zaWRlYmFyLXdpZHRoLWNsb3NlLWFjdGl2ZScsICctLWV1aS1hcHAtc2lkZWJhci13aWR0aC1jbG9zZScpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmVTaWRlYmFyQ3NzVmFycygpOiB2b2lkIHtcbiAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KCctLWV1aS1hcHAtc2lkZWJhci1oZWFkZXItaGVpZ2h0Jyk7XG4gICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnLS1ldWktYXBwLXNpZGViYXItZm9vdGVyLWhlaWdodCcpO1xuICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoJy0tZXVpLWFwcC1zaWRlYmFyLXdpZHRoJyk7XG4gICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnLS1ldWktYXBwLXNpZGViYXItd2lkdGgtY2xvc2UnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWN0aXZhdGVTaWRlYmFySGVhZGVyQ3NzVmFycygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXRDc3NWYXIoJy0tZXVpLWFwcC1zaWRlYmFyLWhlYWRlci1oZWlnaHQtYWN0aXZlJywgJy0tZXVpLWFwcC1zaWRlYmFyLWhlYWRlci1oZWlnaHQnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWN0aXZhdGVTaWRlYmFyRm9vdGVyQ3NzVmFycygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXRDc3NWYXIoJy0tZXVpLWFwcC1zaWRlYmFyLWZvb3Rlci1oZWlnaHQtYWN0aXZlJywgJy0tZXVpLWFwcC1zaWRlYmFyLWZvb3Rlci1oZWlnaHQnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB2aWV3cG9ydCBoZWlnaHQgYW5kIHdpZHRoIGFuZCBtdWx0aXBsZSBpdCBieSAxJSB0byBnZXQgYSB2YWx1ZSBmb3IgYSB2aC92dyB1bml0XG4gICAgICogU2V0cyB0aGUgdmFsdWUgaW4gdGhlIC0tZXVpLWFwcC12aCBjdXN0b20gcHJvcGVydHkgdG8gdGhlIHJvb3Qgb2YgdGhlIGRvY3VtZW50XG4gICAgICogU2V0cyB0aGUgdmFsdWUgaW4gdGhlIC0tZXVpLWFwcC12dyBjdXN0b20gcHJvcGVydHkgdG8gdGhlIHJvb3Qgb2YgdGhlIGRvY3VtZW50XG4gICAgICogRXhhbXBsZSBmb3IgMTAwJSBoZWlnaHQ6IGNhbGModmFyKC0tZXVpLWFwcC12aCwgMXZoKSAqIDEwMCk7XG4gICAgICogRXhhbXBsZSBmb3IgNTAlIGhlaWdodDogY2FsYyh2YXIoLS1ldWktYXBwLXZoLCAxdmgpICogNTApO1xuICAgICAqIEV4YW1wbGUgZm9yIDUwJSB3aWR0aDogY2FsYyh2YXIoLS1ldWktYXBwLXZ3LCAxdncpICogNTApO1xuICAgICAqL1xuICAgIHB1YmxpYyBzZXRBcHBWaWV3cG9ydENzc1ZhcnMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHZoID0gd2luZG93LmlubmVySGVpZ2h0ICogMC4wMTtcbiAgICAgICAgY29uc3QgdncgPSB3aW5kb3cuaW5uZXJXaWR0aCAqIDAuMDE7XG4gICAgICAgIHRoaXMuX3NldENzc1ZhclZhbHVlKCctLWV1aS1hcHAtdmgnLCBgJHt2aH1weGApO1xuICAgICAgICB0aGlzLl9zZXRDc3NWYXJWYWx1ZSgnLS1ldWktYXBwLXZ3JywgYCR7dnd9cHhgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIC0tZXVpLWJhc2UtZm9udC1zaXplIENTUyB2YXJpYWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRCYXNlRm9udFNpemUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuYXBwQmFzZUZvbnRTaXplIHx8IHRoaXMuZ2V0Q3NzVmFyVmFsdWUoJy0tZXVpLWJhc2UtZm9udC1zaXplJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgY3VycmVudCB2YWx1ZSBvZiAtLWV1aS1iYXNlLWZvbnQtc2l6ZSBDU1MgdmFyaWFibGUgYW5kIHRoZSBVSVN0YXRlIGFwcEJhc2VGb250U2l6ZVxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRCYXNlRm9udFNpemUobmV3c2l6ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgICAgICAgICAgICBhcHBCYXNlRm9udFNpemU6IG5ld3NpemUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuX3NldENzc1ZhclZhbHVlKCctLWV1aS1iYXNlLWZvbnQtc2l6ZScsIG5ld3NpemUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIGRvbid0IHJlbW92ZSBhcyBpdCdzIHVzZWQgZm9yIGV4dGVybmFsIGxlZ2FjeSBwcm9qZWN0IHVuZGVyIHYxNyAoY3Nkci1ldWktbGVnYWN5KSB0byBzdXBwb3J0IE1XUCB0cmFuc2l0aW9uXG4gICAgICovXG4gICAgb3Blbk1vZGFsKG1vZGFsSWQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdtb2RhbC1vcGVuJyk7XG4gICAgICAgIGlmICghbW9kYWxJZCkge1xuICAgICAgICAgICAgbW9kYWxJZCA9ICdzaW5nbGVfbW9kYWwnO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hY3RpdmVNb2RhbHMucHVzaCh7XG4gICAgICAgICAgICBpZDogbW9kYWxJZCxcbiAgICAgICAgICAgIGlzT3BlbjogdHJ1ZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG1vZGFsSWQgKyAnLWNsb3NlLWJ1dHRvbicpO1xuICAgICAgICAgICAgaWYgKGVsKSB7XG4gICAgICAgICAgICAgICAgZWwuZm9jdXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgMTAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBkb24ndCByZW1vdmUgYXMgaXQncyB1c2VkIGZvciBleHRlcm5hbCBsZWdhY3kgcHJvamVjdCB1bmRlciB2MTcgKGNzZHItZXVpLWxlZ2FjeSkgdG8gc3VwcG9ydCBNV1AgdHJhbnNpdGlvblxuICAgICAqL1xuICAgIG9wZW5NZXNzYWdlQm94KG1lc3NhZ2VCb3hJZD86IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAoIW1lc3NhZ2VCb3hJZCkge1xuICAgICAgICAgICAgbWVzc2FnZUJveElkID0gJ21lc3NhZ2Vib3hfbW9kYWwnO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3Blbk1vZGFsKG1lc3NhZ2VCb3hJZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgZG9uJ3QgcmVtb3ZlIGFzIGl0J3MgdXNlZCBmb3IgZXh0ZXJuYWwgbGVnYWN5IHByb2plY3QgdW5kZXIgdjE3IChjc2RyLWV1aS1sZWdhY3kpIHRvIHN1cHBvcnQgTVdQIHRyYW5zaXRpb25cbiAgICAgKi9cbiAgICBjbG9zZU1lc3NhZ2VCb3gobWVzc2FnZUJveElkPzogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICghbWVzc2FnZUJveElkKSB7XG4gICAgICAgICAgICBtZXNzYWdlQm94SWQgPSAnbWVzc2FnZWJveF9tb2RhbCc7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jbG9zZU1vZGFsKG1lc3NhZ2VCb3hJZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgZG9uJ3QgcmVtb3ZlIGFzIGl0J3MgdXNlZCBmb3IgZXh0ZXJuYWwgbGVnYWN5IHByb2plY3QgdW5kZXIgdjE3IChjc2RyLWV1aS1sZWdhY3kpIHRvIHN1cHBvcnQgTVdQIHRyYW5zaXRpb25cbiAgICAgKi9cbiAgICBpc01vZGFsT3Blbihtb2RhbElkPzogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghbW9kYWxJZCkge1xuICAgICAgICAgICAgbW9kYWxJZCA9ICdzaW5nbGVfbW9kYWwnO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZU1vZGFscy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IG1vZGFsSW5kZXg6IG51bWJlciA9IHRoaXMuZmluZE1vZGFsSW5kZXgobW9kYWxJZCk7XG4gICAgICAgICAgICBpZiAobW9kYWxJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVNb2RhbHNbbW9kYWxJbmRleF0uaXNPcGVuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBkb24ndCByZW1vdmUgYXMgaXQncyB1c2VkIGZvciBleHRlcm5hbCBsZWdhY3kgcHJvamVjdCB1bmRlciB2MTcgKGNzZHItZXVpLWxlZ2FjeSkgdG8gc3VwcG9ydCBNV1AgdHJhbnNpdGlvblxuICAgICAqL1xuICAgIGNsb3NlTW9kYWwobW9kYWxJZD86IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAoIW1vZGFsSWQpIHtcbiAgICAgICAgICAgIG1vZGFsSWQgPSAnc2luZ2xlX21vZGFsJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBNYWtlIHN1cmUgd2UgZmluZCB0aGUgbW9kYWwgYmVmb3JlIHNwbGljaW5nIHRoZSBhY3RpdmVNb2RhbHMgYXJyYXlcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5maW5kTW9kYWxJbmRleChtb2RhbElkKTtcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlTW9kYWxzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hY3RpdmVNb2RhbHMgJiYgdGhpcy5hY3RpdmVNb2RhbHMubGVuZ3RoIDw9IDApIHtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnbW9kYWwtb3BlbicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgc3RpbGwgYW5vdGhlciAocGFyZW50KSBtb2RhbCBkaWFsb2cgb3BlbiwgZW5zdXJlIGl0IGlzIGZvY3VzZWQgdXBvbiB0byBiZSBhYmxlIHRvIGNsb3NlIGlzIHdpdGggdGhlIEVTQyBrZXk6XG4gICAgICAgICAgICBjb25zdCBsYXN0TW9kYWxJZCA9IHRoaXMuYWN0aXZlTW9kYWxzW3RoaXMuYWN0aXZlTW9kYWxzLmxlbmd0aCAtIDFdLmlkO1xuICAgICAgICAgICAgaWYgKGxhc3RNb2RhbElkKSB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobGFzdE1vZGFsSWQgKyAnLWNsb3NlLWJ1dHRvbicpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCAxMDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgZG9uJ3QgcmVtb3ZlIGFzIGl0J3MgdXNlZCBmb3IgZXh0ZXJuYWwgbGVnYWN5IHByb2plY3QgdW5kZXIgdjE3IChjc2RyLWV1aS1sZWdhY3kpIHRvIHN1cHBvcnQgTVdQIHRyYW5zaXRpb25cbiAgICAgKi9cbiAgICBmaW5kTW9kYWxJbmRleChtb2RhbElkOiBzdHJpbmcpOiBudW1iZXIge1xuICAgICAgICBsZXQgaW5kZXggPSAtMTtcblxuICAgICAgICBpZiAodGhpcy5hY3RpdmVNb2RhbHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYWN0aXZlTW9kYWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYWN0aXZlTW9kYWxzW2ldLmlkID09PSBtb2RhbElkKSB7XG4gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIHByaXZhdGUgZ2V0dGVyc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLVxuICAgIHByaXZhdGUgZ2V0Q3NzVmFyVmFsdWUoaW5wdXRQcm9wZXJ0eSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBnZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZShpbnB1dFByb3BlcnR5KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldENzc1ZhcihpbnB1dFByb3BlcnR5LCBvdXRwdXRQcm9wZXJ0eSk6IHZvaWQge1xuICAgICAgICBjb25zdCBjc3NWYXJWYWx1ZSA9IHRoaXMuY3NzVmFycy5maWx0ZXIoKHYpID0+IHYua2V5ID09PSBpbnB1dFByb3BlcnR5KVswXS52YWx1ZTtcbiAgICAgICAgdGhpcy5fc2V0Q3NzVmFyVmFsdWUob3V0cHV0UHJvcGVydHksIGNzc1ZhclZhbHVlKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coaW5wdXRQcm9wZXJ0eSwgb3V0cHV0UHJvcGVydHksIGNzc1ZhclZhbHVlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zZXRDc3NWYXJWYWx1ZSh2YXJOYW1lLCB2YXJWYWx1ZSk6IHZvaWQge1xuICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkodmFyTmFtZSwgdmFyVmFsdWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0V3JhcHBlckNsYXNzZXMoc3RhdGU6IFVJU3RhdGUsIGJyZWFrcG9pbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGNsYXNzZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgY2xhc3Nlcy5wdXNoKGJyZWFrcG9pbnQpO1xuXG4gICAgICAgIGlmIChzdGF0ZS5oYXNTaWRlYmFyKSB7XG4gICAgICAgICAgICBpZiAoc3RhdGUuaXNTaWRlYmFyT3BlbiAmJiAoc3RhdGUuaXNTaWRlYmFyQWN0aXZlIHx8IHN0YXRlLmlzU2lkZWJhcklubmVyQWN0aXZlKSkge1xuICAgICAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnc2lkZWJhci1zdGF0ZS1vcGVuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXN0YXRlLmlzU2lkZWJhck9wZW4gJiYgKHN0YXRlLmlzU2lkZWJhckFjdGl2ZSB8fCBzdGF0ZS5pc1NpZGViYXJJbm5lckFjdGl2ZSkpIHtcbiAgICAgICAgICAgICAgICBjbGFzc2VzLnB1c2goJ3NpZGViYXItc3RhdGUtY2xvc2UnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdGF0ZS5pc1NpZGViYXJBY3RpdmUpIHtcbiAgICAgICAgICAgICAgICBjbGFzc2VzLnB1c2goJ3NpZGViYXItYWN0aXZlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3RhdGUuaXNTaWRlYmFySW5uZXJBY3RpdmUpIHtcbiAgICAgICAgICAgICAgICBjbGFzc2VzLnB1c2goJ3NpZGViYXItaW5uZXItYWN0aXZlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3RhdGUuaXNTaWRlYmFyU3RhdGVDbG9zZVdpdGhJY29ucykge1xuICAgICAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnc2lkZWJhci1zdGF0ZS1jbG9zZS13aXRoLWljb25zJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIE5FVyBBUFAtU0hFTEwgcHJvcHNcbiAgICAgICAgICAgIGlmIChzdGF0ZS5pc1NpZGViYXJIaWRkZW4pIHtcbiAgICAgICAgICAgICAgICBjbGFzc2VzLnB1c2goJ3NpZGViYXItLWhpZGRlbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0YXRlLmlzU2lkZWJhck9wZW4pIHtcbiAgICAgICAgICAgICAgICBjbGFzc2VzLnB1c2goJ3NpZGViYXItLW9wZW4nKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdzaWRlYmFyLS1jbG9zZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0YXRlLmlzU2lkZWJhckhvdmVyKSB7XG4gICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdzaWRlYmFyLS1ob3ZlcicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZS5kZXZpY2VJbmZvICYmIHN0YXRlLmRldmljZUluZm8uaXNGRikge1xuICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdmZicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZS5kZXZpY2VJbmZvICYmIHN0YXRlLmRldmljZUluZm8uaXNJRSkge1xuICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdpZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZS5kZXZpY2VJbmZvICYmIHN0YXRlLmRldmljZUluZm8uaXNJRTExKSB7XG4gICAgICAgICAgICBjbGFzc2VzLnB1c2goJ2llMTEnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuZGV2aWNlSW5mbyAmJiBzdGF0ZS5kZXZpY2VJbmZvLmlzQ2hyb21lKSB7XG4gICAgICAgICAgICBjbGFzc2VzLnB1c2goJ2Nocm9tZScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjbGFzc2VzLmpvaW4oJyAnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEJyZWFrcG9pbnQod2luZG93V2lkdGg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIGxldCBia3AgPSAnJztcblxuICAgICAgICBzd2l0Y2ggKHRydWUpIHtcbiAgICAgICAgICAgIGNhc2Ugd2luZG93V2lkdGggPj0gMCAmJiB3aW5kb3dXaWR0aCA8IDU3NjpcbiAgICAgICAgICAgICAgICBia3AgPSAneHMnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSB3aW5kb3dXaWR0aCA+PSA1NzYgJiYgd2luZG93V2lkdGggPCA3Njg6XG4gICAgICAgICAgICAgICAgYmtwID0gJ3NtJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2Ugd2luZG93V2lkdGggPj0gNzY4ICYmIHdpbmRvd1dpZHRoIDwgOTkyOlxuICAgICAgICAgICAgICAgIGJrcCA9ICdtZCc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIHdpbmRvd1dpZHRoID49IDk5MiAmJiB3aW5kb3dXaWR0aCA8IDEyMDA6XG4gICAgICAgICAgICAgICAgYmtwID0gJ2xnJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2Ugd2luZG93V2lkdGggPj0gMTIwMCAmJiB3aW5kb3dXaWR0aCA8IDE0MDA6XG4gICAgICAgICAgICAgICAgYmtwID0gJ3hsJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2Ugd2luZG93V2lkdGggPj0gMTQwMCAmJiB3aW5kb3dXaWR0aCA8IDE5MjA6XG4gICAgICAgICAgICAgICAgYmtwID0gJ3h4bCc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIHdpbmRvd1dpZHRoID49IDE5MjAgJiYgd2luZG93V2lkdGggPCAyNTYwOlxuICAgICAgICAgICAgICAgIGJrcCA9ICdmaGQnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSB3aW5kb3dXaWR0aCA+PSAyNTYwICYmIHdpbmRvd1dpZHRoIDwgMzg0MDpcbiAgICAgICAgICAgICAgICBia3AgPSAnMmsnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSB3aW5kb3dXaWR0aCA+PSAzODQwOlxuICAgICAgICAgICAgICAgIGJrcCA9ICc0ayc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJrcDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEJyZWFrcG9pbnRzKGJrcDogc3RyaW5nKTogb2JqZWN0IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlzTW9iaWxlOiBia3AgPT09ICd4cycgfHwgYmtwID09PSAnc20nLFxuICAgICAgICAgICAgaXNUYWJsZXQ6IGJrcCA9PT0gJ21kJyxcbiAgICAgICAgICAgIGlzTHREZXNrdG9wOiBia3AgPT09ICd4cycgfHwgYmtwID09PSAnc20nIHx8IGJrcCA9PT0gJ21kJyxcbiAgICAgICAgICAgIGlzRGVza3RvcDogYmtwID09PSAnbGcnLFxuICAgICAgICAgICAgaXNYTDogYmtwID09PSAneGwnLFxuICAgICAgICAgICAgaXNYWEw6IGJrcCA9PT0gJ3h4bCcsXG4gICAgICAgICAgICBpc0ZIRDogYmtwID09PSAnZmhkJyxcbiAgICAgICAgICAgIGlzMks6IGJrcCA9PT0gJzJrJyxcbiAgICAgICAgICAgIGlzNEs6IGJrcCA9PT0gJzRrJyxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEpzb24odXJsOiBzdHJpbmcpOiBQcm9taXNlPG9iamVjdD4ge1xuICAgICAgICByZXR1cm4gZmlyc3RWYWx1ZUZyb20odGhpcy5odHRwLmdldCh1cmwpKS50aGVuKHRoaXMuZXh0cmFjdERhdGEpLmNhdGNoKHRoaXMuaGFuZGxlRXJyb3IpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZXh0cmFjdERhdGEocmVzOiBSZXNwb25zZSk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IGJvZHkgPSByZXM7XG4gICAgICAgIHJldHVybiBib2R5IHx8IHt9O1xuICAgIH1cblxuICAgIC8vIFRPRE86IGZpbmQgdGhlIGNvcnJlY3QgdHlwZSBvciB0dXJuIGludG8gYSBnZW5lcmljLCBodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay8yL2dlbmVyaWNzLmh0bWxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHByaXZhdGUgaGFuZGxlRXJyb3IoZXJyb3I6IGFueSk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0FuIGVycm9yIG9jY3VycmVkJywgZXJyb3IpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IubWVzc2FnZSB8fCBlcnJvcik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBiaW5kQWN0aXZlTGFuZ3VhZ2VUb0FwcFNoZWxsU3RhdGUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3RvcmVTZXJ2aWNlLnNlbGVjdChnZXRBY3RpdmVMYW5nKS5zdWJzY3JpYmUoKGFjdGl2ZUxhbmcpID0+IHtcbiAgICAgICAgICAgIGlmIChhY3RpdmVMYW5nICE9PSB0aGlzLnN0YXRlLmFjdGl2ZUxhbmd1YWdlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZShcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZUxhbmd1YWdlOiBhY3RpdmVMYW5nLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=