@kirbydesign/designsystem 10.1.3 → 10.2.1

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 (385) hide show
  1. package/avatar/avatar.component.d.ts +2 -1
  2. package/button/button.component.d.ts +1 -0
  3. package/calendar/calendar.component.d.ts +28 -18
  4. package/calendar/interfaces/calendar-day.d.ts +17 -0
  5. package/calendar/public_api.d.ts +1 -1
  6. package/empty-state/empty-state.component.d.ts +10 -3
  7. package/esm2022/accordion/accordion-item.component.mjs +4 -4
  8. package/esm2022/accordion/accordion.directive.mjs +4 -4
  9. package/esm2022/accordion/accordion.module.mjs +5 -5
  10. package/esm2022/action-group/action-group.component.mjs +4 -4
  11. package/esm2022/avatar/avatar.component.mjs +7 -5
  12. package/esm2022/badge/badge.component.mjs +4 -4
  13. package/esm2022/button/button.component.mjs +18 -6
  14. package/esm2022/calendar/calendar.component.mjs +163 -96
  15. package/esm2022/calendar/interfaces/calendar-day.mjs +2 -0
  16. package/esm2022/calendar/interfaces/calendar-year-navigator-config.mjs +2 -0
  17. package/esm2022/calendar/public_api.mjs +1 -1
  18. package/esm2022/card/card-as-button/card-as-button.directive.mjs +4 -4
  19. package/esm2022/card/card-footer/card-footer.component.mjs +4 -4
  20. package/esm2022/card/card-header/card-header.component.mjs +4 -4
  21. package/esm2022/card/card.component.mjs +4 -4
  22. package/esm2022/card/card.module.mjs +5 -5
  23. package/esm2022/chart/chart/chart.component.mjs +4 -4
  24. package/esm2022/chart/charts.module.mjs +5 -5
  25. package/esm2022/chart/shared/base-chart/base-chart.component.mjs +4 -4
  26. package/esm2022/chart/shared/chart-config-service/chart-config.service.mjs +4 -4
  27. package/esm2022/chart/shared/chart-js-service/chart-js.service.mjs +4 -4
  28. package/esm2022/chart/stock-chart/stock-chart-js.service.mjs +4 -4
  29. package/esm2022/chart/stock-chart/stock-chart.component.mjs +4 -4
  30. package/esm2022/checkbox/checkbox.component.mjs +4 -4
  31. package/esm2022/data-table/data-table.module.mjs +5 -5
  32. package/esm2022/data-table/sortable/sortable.component.mjs +4 -4
  33. package/esm2022/divider/divider.component.mjs +4 -4
  34. package/esm2022/dropdown/dropdown.component.mjs +6 -6
  35. package/esm2022/dropdown/dropdown.module.mjs +5 -5
  36. package/esm2022/dropdown/keyboard-handler.service.mjs +4 -4
  37. package/esm2022/empty-state/empty-state.component.mjs +31 -7
  38. package/esm2022/empty-state/empty-state.module.mjs +5 -5
  39. package/esm2022/fab-sheet/fab-sheet.component.mjs +4 -4
  40. package/esm2022/flag/flag.component.mjs +4 -4
  41. package/esm2022/form-field/directives/affix/affix.directive.mjs +4 -4
  42. package/esm2022/form-field/directives/date/date-input.directive.mjs +4 -4
  43. package/esm2022/form-field/directives/decimal-mask/decimal-mask.directive.mjs +4 -4
  44. package/esm2022/form-field/form-field-message/form-field-message.component.mjs +4 -4
  45. package/esm2022/form-field/form-field.component.mjs +4 -4
  46. package/esm2022/form-field/form-field.module.mjs +8 -7
  47. package/esm2022/form-field/input/input.component.mjs +4 -4
  48. package/esm2022/form-field/input-counter/input-counter.component.mjs +4 -4
  49. package/esm2022/form-field/textarea/textarea.component.mjs +4 -4
  50. package/esm2022/header/header.component.mjs +16 -16
  51. package/esm2022/header/header.module.mjs +5 -5
  52. package/esm2022/helpers/content-mutation-observer.mjs +50 -0
  53. package/esm2022/helpers/element-ancestor-utils.mjs +33 -0
  54. package/esm2022/helpers/ionic-element-part-helper.mjs +4 -4
  55. package/esm2022/helpers/line-clamp-helper.mjs +4 -4
  56. package/esm2022/helpers/platform.service.mjs +4 -4
  57. package/esm2022/helpers/public_api.mjs +3 -2
  58. package/esm2022/icon/icon-registry.service.mjs +4 -4
  59. package/esm2022/icon/icon.component.mjs +4 -4
  60. package/esm2022/icon/icon.module.mjs +5 -5
  61. package/esm2022/item/item.component.mjs +13 -9
  62. package/esm2022/item/item.module.mjs +5 -5
  63. package/esm2022/item/label/label.component.mjs +5 -5
  64. package/esm2022/item-group/item-group.component.mjs +4 -4
  65. package/esm2022/item-sliding/item-sliding.component.mjs +4 -4
  66. package/esm2022/kirby-app/kirby-app.component.mjs +4 -4
  67. package/esm2022/kirby-app/kirby-app.module.mjs +5 -5
  68. package/esm2022/kirby-ionic-module/kirby-ionic.module.mjs +5 -5
  69. package/esm2022/lib/components/segmented-control/segmented-control.component.mjs +34 -7
  70. package/esm2022/lib/directives/key-handler/key-handler.directive.mjs +4 -4
  71. package/esm2022/lib/directives/modal-router-link/modal-router-link.directive.mjs +4 -4
  72. package/esm2022/lib/kirby.module.mjs +5 -5
  73. package/esm2022/list/directives/infinite-scroll.directive.mjs +4 -4
  74. package/esm2022/list/directives/list-item-color.directive.mjs +4 -4
  75. package/esm2022/list/helpers/list-helper.mjs +4 -4
  76. package/esm2022/list/list-experimental/list-experimental.component.mjs +4 -4
  77. package/esm2022/list/list-header/list-header.component.mjs +4 -4
  78. package/esm2022/list/list-item/list-item.component.mjs +5 -5
  79. package/esm2022/list/list-section-header/list-section-header.component.mjs +4 -4
  80. package/esm2022/list/list.component.mjs +5 -5
  81. package/esm2022/list/list.directive.mjs +13 -13
  82. package/esm2022/list/list.module.mjs +5 -5
  83. package/esm2022/loading-overlay/loading-overlay.component.mjs +4 -4
  84. package/esm2022/loading-overlay/loading-overlay.service.mjs +4 -4
  85. package/esm2022/menu/menu.component.mjs +215 -12
  86. package/esm2022/modal/modal/action-sheet/action-sheet.component.mjs +4 -4
  87. package/esm2022/modal/modal/alert/alert.component.mjs +4 -4
  88. package/esm2022/modal/modal/footer/modal-footer.component.mjs +4 -4
  89. package/esm2022/modal/modal/modal-component/modal.component.mjs +18 -8
  90. package/esm2022/modal/modal/services/action-sheet.helper.mjs +4 -4
  91. package/esm2022/modal/modal/services/alert.helper.mjs +4 -4
  92. package/esm2022/modal/modal/services/can-dismiss.helper.mjs +4 -4
  93. package/esm2022/modal/modal/services/modal-animation-builder.service.mjs +4 -4
  94. package/esm2022/modal/modal/services/modal.controller.mjs +4 -4
  95. package/esm2022/modal/modal/services/modal.helper.mjs +5 -4
  96. package/esm2022/modal/modal-navigation.service.mjs +4 -4
  97. package/esm2022/modal/modal-wrapper/compact/modal-compact-wrapper.component.mjs +19 -10
  98. package/esm2022/modal/modal-wrapper/config/modal-config.mjs +1 -1
  99. package/esm2022/modal/modal-wrapper/modal-elements-mover.delegate.mjs +1 -1
  100. package/esm2022/modal/modal-wrapper/modal-wrapper.component.mjs +35 -12
  101. package/esm2022/modal/modal.interfaces.mjs +4 -4
  102. package/esm2022/page/page-footer/page-footer.component.mjs +4 -4
  103. package/esm2022/page/page.component.mjs +39 -38
  104. package/esm2022/page/page.module.mjs +5 -5
  105. package/esm2022/popover/popover.component.mjs +4 -4
  106. package/esm2022/progress-circle/progress-circle-ring.component.mjs +4 -4
  107. package/esm2022/progress-circle/progress-circle.component.mjs +4 -4
  108. package/esm2022/radio/radio-group/radio-group.component.mjs +4 -4
  109. package/esm2022/radio/radio-module.mjs +5 -5
  110. package/esm2022/radio/radio.component.mjs +4 -4
  111. package/esm2022/range/range.component.mjs +4 -4
  112. package/esm2022/reorder-list/reorder-list.component.mjs +5 -5
  113. package/esm2022/router-outlet/router-outlet.component.mjs +4 -4
  114. package/esm2022/router-outlet/router-outlet.module.mjs +5 -5
  115. package/esm2022/section-header/section-header.component.mjs +4 -4
  116. package/esm2022/shared/component-loader.directive.mjs +4 -4
  117. package/esm2022/shared/fit-heading/fit-heading.directive.mjs +4 -4
  118. package/esm2022/shared/floating/floating.directive.mjs +4 -4
  119. package/esm2022/shared/portal/portal.directive.mjs +4 -4
  120. package/esm2022/shared/public_api.mjs +2 -1
  121. package/esm2022/shared/resize-observer/resize-observer.factory.mjs +4 -4
  122. package/esm2022/shared/resize-observer/resize-observer.service.mjs +4 -4
  123. package/esm2022/shared/theme-color/theme-color.directive.mjs +4 -4
  124. package/esm2022/shared/translation/translation.interface.mjs +2 -0
  125. package/esm2022/shared/translation/translation.service.mjs +37 -0
  126. package/esm2022/shared/translation/translations/da.mjs +11 -0
  127. package/esm2022/shared/translation/translations/en.mjs +11 -0
  128. package/esm2022/slide/slide-stretch-height.directive.mjs +4 -4
  129. package/esm2022/slide/slide.directive.mjs +4 -4
  130. package/esm2022/slide/slide.module.mjs +5 -5
  131. package/esm2022/slide/slides.component.mjs +16 -9
  132. package/esm2022/slide-button/slide-button.component.mjs +4 -4
  133. package/esm2022/spinner/spinner.component.mjs +4 -4
  134. package/esm2022/spinner/spinner.module.mjs +5 -5
  135. package/esm2022/tab-navigation/tab-navigation/tab-navigation.component.mjs +4 -4
  136. package/esm2022/tab-navigation/tab-navigation-item/tab-navigation-item.component.mjs +4 -4
  137. package/esm2022/tab-navigation/tab-navigation.module.mjs +5 -5
  138. package/esm2022/tabs/tab-button/tab-button.component.mjs +4 -4
  139. package/esm2022/tabs/tabs.component.mjs +4 -4
  140. package/esm2022/tabs/tabs.module.mjs +5 -5
  141. package/esm2022/tabs/tabs.service.mjs +4 -4
  142. package/esm2022/testing/test-helper.mjs +8 -5
  143. package/esm2022/testing-base/lib/components/mock.accordion-item.component.mjs +4 -4
  144. package/esm2022/testing-base/lib/components/mock.action-group.component.mjs +4 -4
  145. package/esm2022/testing-base/lib/components/mock.action-sheet.component.mjs +4 -4
  146. package/esm2022/testing-base/lib/components/mock.alert.component.mjs +4 -4
  147. package/esm2022/testing-base/lib/components/mock.avatar.component.mjs +4 -4
  148. package/esm2022/testing-base/lib/components/mock.badge.component.mjs +4 -4
  149. package/esm2022/testing-base/lib/components/mock.base-chart.component.mjs +4 -4
  150. package/esm2022/testing-base/lib/components/mock.button.component.mjs +4 -4
  151. package/esm2022/testing-base/lib/components/mock.calendar.component.mjs +4 -4
  152. package/esm2022/testing-base/lib/components/mock.card-footer.component.mjs +4 -4
  153. package/esm2022/testing-base/lib/components/mock.card-header.component.mjs +4 -4
  154. package/esm2022/testing-base/lib/components/mock.card.component.mjs +4 -4
  155. package/esm2022/testing-base/lib/components/mock.chart.component.mjs +4 -4
  156. package/esm2022/testing-base/lib/components/mock.checkbox.component.mjs +4 -4
  157. package/esm2022/testing-base/lib/components/mock.divider.component.mjs +4 -4
  158. package/esm2022/testing-base/lib/components/mock.dropdown.component.mjs +4 -4
  159. package/esm2022/testing-base/lib/components/mock.empty-state.component.mjs +4 -4
  160. package/esm2022/testing-base/lib/components/mock.fab-sheet.component.mjs +4 -4
  161. package/esm2022/testing-base/lib/components/mock.flag.component.mjs +4 -4
  162. package/esm2022/testing-base/lib/components/mock.form-field-message.component.mjs +4 -4
  163. package/esm2022/testing-base/lib/components/mock.form-field.component.mjs +4 -4
  164. package/esm2022/testing-base/lib/components/mock.header.component.mjs +10 -10
  165. package/esm2022/testing-base/lib/components/mock.icon.component.mjs +4 -4
  166. package/esm2022/testing-base/lib/components/mock.input-counter.component.mjs +4 -4
  167. package/esm2022/testing-base/lib/components/mock.input.component.mjs +4 -4
  168. package/esm2022/testing-base/lib/components/mock.item-group.component.mjs +4 -4
  169. package/esm2022/testing-base/lib/components/mock.item-sliding.component.mjs +4 -4
  170. package/esm2022/testing-base/lib/components/mock.item.component.mjs +4 -4
  171. package/esm2022/testing-base/lib/components/mock.kirby-app.component.mjs +4 -4
  172. package/esm2022/testing-base/lib/components/mock.label.component.mjs +4 -4
  173. package/esm2022/testing-base/lib/components/mock.list-experimental.component.mjs +4 -4
  174. package/esm2022/testing-base/lib/components/mock.list-header.component.mjs +4 -4
  175. package/esm2022/testing-base/lib/components/mock.list-item.component.mjs +4 -4
  176. package/esm2022/testing-base/lib/components/mock.list-section-header.component.mjs +4 -4
  177. package/esm2022/testing-base/lib/components/mock.list.component.mjs +4 -4
  178. package/esm2022/testing-base/lib/components/mock.loading-overlay.component.mjs +4 -4
  179. package/esm2022/testing-base/lib/components/mock.menu.component.mjs +4 -4
  180. package/esm2022/testing-base/lib/components/mock.modal-compact-wrapper.component.mjs +4 -4
  181. package/esm2022/testing-base/lib/components/mock.modal-footer.component.mjs +4 -4
  182. package/esm2022/testing-base/lib/components/mock.modal-wrapper.component.mjs +4 -4
  183. package/esm2022/testing-base/lib/components/mock.page-footer.component.mjs +4 -4
  184. package/esm2022/testing-base/lib/components/mock.page.component.mjs +34 -34
  185. package/esm2022/testing-base/lib/components/mock.popover.component.mjs +4 -4
  186. package/esm2022/testing-base/lib/components/mock.progress-circle-ring.component.mjs +4 -4
  187. package/esm2022/testing-base/lib/components/mock.progress-circle.component.mjs +4 -4
  188. package/esm2022/testing-base/lib/components/mock.radio-group.component.mjs +4 -4
  189. package/esm2022/testing-base/lib/components/mock.radio.component.mjs +4 -4
  190. package/esm2022/testing-base/lib/components/mock.range.component.mjs +4 -4
  191. package/esm2022/testing-base/lib/components/mock.reorder-list.component.mjs +4 -4
  192. package/esm2022/testing-base/lib/components/mock.router-outlet.component.mjs +4 -4
  193. package/esm2022/testing-base/lib/components/mock.section-header.component.mjs +4 -4
  194. package/esm2022/testing-base/lib/components/mock.segmented-control.component.mjs +4 -4
  195. package/esm2022/testing-base/lib/components/mock.slide-button.component.mjs +4 -4
  196. package/esm2022/testing-base/lib/components/mock.slides.component.mjs +4 -4
  197. package/esm2022/testing-base/lib/components/mock.spinner.component.mjs +4 -4
  198. package/esm2022/testing-base/lib/components/mock.stock-chart.component.mjs +4 -4
  199. package/esm2022/testing-base/lib/components/mock.tab-button.component.mjs +4 -4
  200. package/esm2022/testing-base/lib/components/mock.tab-navigation-item.component.mjs +4 -4
  201. package/esm2022/testing-base/lib/components/mock.tab-navigation.component.mjs +4 -4
  202. package/esm2022/testing-base/lib/components/mock.tabs.component.mjs +4 -4
  203. package/esm2022/testing-base/lib/components/mock.textarea.component.mjs +4 -4
  204. package/esm2022/testing-base/lib/components/mock.toggle-button.component.mjs +4 -4
  205. package/esm2022/testing-base/lib/components/mock.toggle.component.mjs +4 -4
  206. package/esm2022/testing-base/lib/directives/mock.accordion.directive.mjs +4 -4
  207. package/esm2022/testing-base/lib/directives/mock.affix.directive.mjs +4 -4
  208. package/esm2022/testing-base/lib/directives/mock.card-as-button.directive.mjs +4 -4
  209. package/esm2022/testing-base/lib/directives/mock.component-loader.directive.mjs +4 -4
  210. package/esm2022/testing-base/lib/directives/mock.date-input.directive.mjs +4 -4
  211. package/esm2022/testing-base/lib/directives/mock.decimal-mask.directive.mjs +4 -4
  212. package/esm2022/testing-base/lib/directives/mock.fit-heading.directive.mjs +4 -4
  213. package/esm2022/testing-base/lib/directives/mock.floating.directive.mjs +4 -4
  214. package/esm2022/testing-base/lib/directives/mock.infinite-scroll.directive.mjs +4 -4
  215. package/esm2022/testing-base/lib/directives/mock.key-handler.directive.mjs +4 -4
  216. package/esm2022/testing-base/lib/directives/mock.list-item-color.directive.mjs +4 -4
  217. package/esm2022/testing-base/lib/directives/mock.list.directive.mjs +13 -13
  218. package/esm2022/testing-base/lib/directives/mock.modal-router-link.directive.mjs +4 -4
  219. package/esm2022/testing-base/lib/directives/mock.portal.directive.mjs +4 -4
  220. package/esm2022/testing-base/lib/directives/mock.slide.directive.mjs +4 -4
  221. package/esm2022/testing-base/lib/directives/mock.theme-color.directive.mjs +4 -4
  222. package/esm2022/testing-base/lib/kirby-testing-base.module.mjs +5 -5
  223. package/esm2022/testing-jasmine/lib/kirby-testing.module.mjs +5 -5
  224. package/esm2022/testing-jest/lib/kirby-testing.module.mjs +5 -5
  225. package/esm2022/toast/services/toast.controller.mjs +4 -4
  226. package/esm2022/toast/services/toast.helper.mjs +4 -4
  227. package/esm2022/toggle/toggle.component.mjs +4 -4
  228. package/esm2022/toggle-button/toggle-button.component.mjs +4 -4
  229. package/esm2022/toggle-button/toggle-button.module.mjs +5 -5
  230. package/esm2022/types/public_api.mjs +2 -1
  231. package/esm2022/types/unobserve-fn.mjs +2 -0
  232. package/esm2022/types/window-ref.mjs +4 -4
  233. package/fesm2022/kirbydesign-designsystem-accordion.mjs +10 -10
  234. package/fesm2022/kirbydesign-designsystem-accordion.mjs.map +1 -1
  235. package/fesm2022/kirbydesign-designsystem-action-group.mjs +3 -3
  236. package/fesm2022/kirbydesign-designsystem-action-group.mjs.map +1 -1
  237. package/fesm2022/kirbydesign-designsystem-avatar.mjs +6 -4
  238. package/fesm2022/kirbydesign-designsystem-avatar.mjs.map +1 -1
  239. package/fesm2022/kirbydesign-designsystem-badge.mjs +3 -3
  240. package/fesm2022/kirbydesign-designsystem-badge.mjs.map +1 -1
  241. package/fesm2022/kirbydesign-designsystem-button.mjs +17 -5
  242. package/fesm2022/kirbydesign-designsystem-button.mjs.map +1 -1
  243. package/fesm2022/kirbydesign-designsystem-calendar.mjs +163 -172
  244. package/fesm2022/kirbydesign-designsystem-calendar.mjs.map +1 -1
  245. package/fesm2022/kirbydesign-designsystem-card.mjs +16 -16
  246. package/fesm2022/kirbydesign-designsystem-card.mjs.map +1 -1
  247. package/fesm2022/kirbydesign-designsystem-chart.mjs +22 -22
  248. package/fesm2022/kirbydesign-designsystem-chart.mjs.map +1 -1
  249. package/fesm2022/kirbydesign-designsystem-checkbox.mjs +3 -3
  250. package/fesm2022/kirbydesign-designsystem-checkbox.mjs.map +1 -1
  251. package/fesm2022/kirbydesign-designsystem-data-table.mjs +7 -7
  252. package/fesm2022/kirbydesign-designsystem-data-table.mjs.map +1 -1
  253. package/fesm2022/kirbydesign-designsystem-divider.mjs +3 -3
  254. package/fesm2022/kirbydesign-designsystem-divider.mjs.map +1 -1
  255. package/fesm2022/kirbydesign-designsystem-dropdown.mjs +12 -12
  256. package/fesm2022/kirbydesign-designsystem-dropdown.mjs.map +1 -1
  257. package/fesm2022/kirbydesign-designsystem-empty-state.mjs +33 -9
  258. package/fesm2022/kirbydesign-designsystem-empty-state.mjs.map +1 -1
  259. package/fesm2022/kirbydesign-designsystem-fab-sheet.mjs +3 -3
  260. package/fesm2022/kirbydesign-designsystem-fab-sheet.mjs.map +1 -1
  261. package/fesm2022/kirbydesign-designsystem-flag.mjs +3 -3
  262. package/fesm2022/kirbydesign-designsystem-flag.mjs.map +1 -1
  263. package/fesm2022/kirbydesign-designsystem-form-field.mjs +30 -30
  264. package/fesm2022/kirbydesign-designsystem-form-field.mjs.map +1 -1
  265. package/fesm2022/kirbydesign-designsystem-header.mjs +19 -19
  266. package/fesm2022/kirbydesign-designsystem-header.mjs.map +1 -1
  267. package/fesm2022/kirbydesign-designsystem-helpers.mjs +69 -10
  268. package/fesm2022/kirbydesign-designsystem-helpers.mjs.map +1 -1
  269. package/fesm2022/kirbydesign-designsystem-icon.mjs +10 -10
  270. package/fesm2022/kirbydesign-designsystem-icon.mjs.map +1 -1
  271. package/fesm2022/kirbydesign-designsystem-item-group.mjs +3 -3
  272. package/fesm2022/kirbydesign-designsystem-item-group.mjs.map +1 -1
  273. package/fesm2022/kirbydesign-designsystem-item-sliding.mjs +3 -3
  274. package/fesm2022/kirbydesign-designsystem-item-sliding.mjs.map +1 -1
  275. package/fesm2022/kirbydesign-designsystem-item.mjs +20 -16
  276. package/fesm2022/kirbydesign-designsystem-item.mjs.map +1 -1
  277. package/fesm2022/kirbydesign-designsystem-kirby-app.mjs +7 -7
  278. package/fesm2022/kirbydesign-designsystem-kirby-app.mjs.map +1 -1
  279. package/fesm2022/kirbydesign-designsystem-kirby-ionic-module.mjs +4 -4
  280. package/fesm2022/kirbydesign-designsystem-kirby-ionic-module.mjs.map +1 -1
  281. package/fesm2022/kirbydesign-designsystem-list.mjs +42 -42
  282. package/fesm2022/kirbydesign-designsystem-list.mjs.map +1 -1
  283. package/fesm2022/kirbydesign-designsystem-loading-overlay.mjs +6 -6
  284. package/fesm2022/kirbydesign-designsystem-loading-overlay.mjs.map +1 -1
  285. package/fesm2022/kirbydesign-designsystem-menu.mjs +214 -11
  286. package/fesm2022/kirbydesign-designsystem-menu.mjs.map +1 -1
  287. package/fesm2022/kirbydesign-designsystem-modal.mjs +99 -57
  288. package/fesm2022/kirbydesign-designsystem-modal.mjs.map +1 -1
  289. package/fesm2022/kirbydesign-designsystem-page.mjs +44 -43
  290. package/fesm2022/kirbydesign-designsystem-page.mjs.map +1 -1
  291. package/fesm2022/kirbydesign-designsystem-popover.mjs +3 -3
  292. package/fesm2022/kirbydesign-designsystem-popover.mjs.map +1 -1
  293. package/fesm2022/kirbydesign-designsystem-progress-circle.mjs +6 -6
  294. package/fesm2022/kirbydesign-designsystem-progress-circle.mjs.map +1 -1
  295. package/fesm2022/kirbydesign-designsystem-radio.mjs +10 -10
  296. package/fesm2022/kirbydesign-designsystem-radio.mjs.map +1 -1
  297. package/fesm2022/kirbydesign-designsystem-range.mjs +3 -3
  298. package/fesm2022/kirbydesign-designsystem-range.mjs.map +1 -1
  299. package/fesm2022/kirbydesign-designsystem-reorder-list.mjs +4 -4
  300. package/fesm2022/kirbydesign-designsystem-reorder-list.mjs.map +1 -1
  301. package/fesm2022/kirbydesign-designsystem-router-outlet.mjs +7 -7
  302. package/fesm2022/kirbydesign-designsystem-router-outlet.mjs.map +1 -1
  303. package/fesm2022/kirbydesign-designsystem-section-header.mjs +3 -3
  304. package/fesm2022/kirbydesign-designsystem-section-header.mjs.map +1 -1
  305. package/fesm2022/kirbydesign-designsystem-shared-floating.mjs +3 -3
  306. package/fesm2022/kirbydesign-designsystem-shared-floating.mjs.map +1 -1
  307. package/fesm2022/kirbydesign-designsystem-shared-portal.mjs +3 -3
  308. package/fesm2022/kirbydesign-designsystem-shared-portal.mjs.map +1 -1
  309. package/fesm2022/kirbydesign-designsystem-shared.mjs +71 -17
  310. package/fesm2022/kirbydesign-designsystem-shared.mjs.map +1 -1
  311. package/fesm2022/kirbydesign-designsystem-slide-button.mjs +3 -3
  312. package/fesm2022/kirbydesign-designsystem-slide-button.mjs.map +1 -1
  313. package/fesm2022/kirbydesign-designsystem-slide.mjs +24 -18
  314. package/fesm2022/kirbydesign-designsystem-slide.mjs.map +1 -1
  315. package/fesm2022/kirbydesign-designsystem-spinner.mjs +7 -7
  316. package/fesm2022/kirbydesign-designsystem-spinner.mjs.map +1 -1
  317. package/fesm2022/kirbydesign-designsystem-tab-navigation.mjs +10 -10
  318. package/fesm2022/kirbydesign-designsystem-tab-navigation.mjs.map +1 -1
  319. package/fesm2022/kirbydesign-designsystem-tabs.mjs +13 -13
  320. package/fesm2022/kirbydesign-designsystem-tabs.mjs.map +1 -1
  321. package/fesm2022/kirbydesign-designsystem-testing-base.mjs +286 -286
  322. package/fesm2022/kirbydesign-designsystem-testing-base.mjs.map +1 -1
  323. package/fesm2022/kirbydesign-designsystem-testing-jasmine.mjs +4 -4
  324. package/fesm2022/kirbydesign-designsystem-testing-jasmine.mjs.map +1 -1
  325. package/fesm2022/kirbydesign-designsystem-testing-jest.mjs +4 -4
  326. package/fesm2022/kirbydesign-designsystem-testing-jest.mjs.map +1 -1
  327. package/fesm2022/kirbydesign-designsystem-testing.mjs +7 -4
  328. package/fesm2022/kirbydesign-designsystem-testing.mjs.map +1 -1
  329. package/fesm2022/kirbydesign-designsystem-toast.mjs +6 -6
  330. package/fesm2022/kirbydesign-designsystem-toast.mjs.map +1 -1
  331. package/fesm2022/kirbydesign-designsystem-toggle-button.mjs +7 -7
  332. package/fesm2022/kirbydesign-designsystem-toggle-button.mjs.map +1 -1
  333. package/fesm2022/kirbydesign-designsystem-toggle.mjs +3 -3
  334. package/fesm2022/kirbydesign-designsystem-toggle.mjs.map +1 -1
  335. package/fesm2022/kirbydesign-designsystem-types.mjs +3 -3
  336. package/fesm2022/kirbydesign-designsystem-types.mjs.map +1 -1
  337. package/fesm2022/kirbydesign-designsystem.mjs +43 -16
  338. package/fesm2022/kirbydesign-designsystem.mjs.map +1 -1
  339. package/form-field/form-field.module.d.ts +2 -1
  340. package/helpers/content-mutation-observer.d.ts +8 -0
  341. package/helpers/{element-has-ancestor.d.ts → element-ancestor-utils.d.ts} +1 -0
  342. package/helpers/public_api.d.ts +2 -1
  343. package/icons/svg/accounts-outline.svg +0 -2
  344. package/icons/svg/accounts.svg +0 -2
  345. package/icons/svg/backspace.svg +0 -2
  346. package/icons/svg/camera.svg +0 -2
  347. package/icons/svg/copy.svg +0 -2
  348. package/icons/svg/flag.svg +0 -2
  349. package/icons/svg/inbox-outline.svg +0 -2
  350. package/icons/svg/inbox.svg +0 -2
  351. package/icons/svg/information.svg +0 -2
  352. package/icons/svg/menu-outline.svg +0 -2
  353. package/icons/svg/menu.svg +0 -2
  354. package/icons/svg/person-outline.svg +0 -2
  355. package/icons/svg/person.svg +0 -2
  356. package/icons/svg/reorder.svg +0 -2
  357. package/icons/svg/support.svg +0 -2
  358. package/item/item.component.d.ts +3 -2
  359. package/lib/components/segmented-control/segmented-control.component.d.ts +4 -0
  360. package/menu/menu.component.d.ts +32 -8
  361. package/modal/modal/modal-component/modal.component.d.ts +6 -3
  362. package/modal/modal-wrapper/compact/modal-compact-wrapper.component.d.ts +4 -2
  363. package/modal/modal-wrapper/config/modal-config.d.ts +3 -0
  364. package/modal/modal-wrapper/modal-wrapper.component.d.ts +8 -3
  365. package/package.json +2 -2
  366. package/page/page.component.d.ts +4 -3
  367. package/scss/base/_item-typography.scss +1 -0
  368. package/shared/public_api.d.ts +1 -0
  369. package/shared/translation/translation.interface.d.ts +10 -0
  370. package/shared/translation/translation.service.d.ts +12 -0
  371. package/shared/translation/translations/da.d.ts +2 -0
  372. package/shared/translation/translations/en.d.ts +2 -0
  373. package/slide/slides.component.d.ts +3 -1
  374. package/testing/test-helper.d.ts +1 -0
  375. package/types/public_api.d.ts +1 -0
  376. package/types/unobserve-fn.d.ts +1 -0
  377. package/calendar/helpers/calendar-cell.model.d.ts +0 -9
  378. package/calendar/helpers/calendar-options.model.d.ts +0 -9
  379. package/calendar/helpers/calendar.helper.d.ts +0 -24
  380. package/esm2022/calendar/helpers/calendar-cell.model.mjs +0 -2
  381. package/esm2022/calendar/helpers/calendar-options.model.mjs +0 -2
  382. package/esm2022/calendar/helpers/calendar.helper.mjs +0 -80
  383. package/esm2022/calendar/options/calendar-year-navigator-config.mjs +0 -2
  384. package/esm2022/helpers/element-has-ancestor.mjs +0 -24
  385. /package/calendar/{options → interfaces}/calendar-year-navigator-config.d.ts +0 -0
@@ -1,15 +1,16 @@
1
- import { Component, ElementRef, EventEmitter, HostBinding, Inject, Input, LOCALE_ID, Output, ViewChild, } from '@angular/core';
2
- import { add, eachDayOfInterval, endOfWeek, format, getYear, isAfter, isBefore, isSameDay, isSameMonth, isWeekend, startOfDay, startOfMonth, startOfWeek, } from 'date-fns';
1
+ import { CommonModule } from '@angular/common';
2
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, HostBinding, Inject, Input, LOCALE_ID, Output, } from '@angular/core';
3
+ import { add, eachDayOfInterval, endOfWeek, format, getYear, isAfter, isBefore, isSameDay, isSameMonth, isWeekend, lastDayOfWeek, startOfDay, startOfMonth, startOfWeek, } from 'date-fns';
3
4
  import { utcToZonedTime, zonedTimeToUtc } from 'date-fns-tz';
4
5
  import { da, enGB, enUS } from 'date-fns/locale';
5
6
  import { capitalizeFirstLetter } from '@kirbydesign/core';
6
- import { CommonModule } from '@angular/common';
7
- import { IconModule } from '@kirbydesign/designsystem/icon';
8
- import { DropdownModule } from '@kirbydesign/designsystem/dropdown';
9
7
  import { ButtonComponent } from '@kirbydesign/designsystem/button';
10
- import { CalendarHelper } from './helpers/calendar.helper';
8
+ import { DropdownModule } from '@kirbydesign/designsystem/dropdown';
9
+ import { UniqueIdGenerator } from '@kirbydesign/designsystem/helpers';
10
+ import { IconModule } from '@kirbydesign/designsystem/icon';
11
+ import { TranslationService } from '@kirbydesign/designsystem/shared';
11
12
  import * as i0 from "@angular/core";
12
- import * as i1 from "./helpers/calendar.helper";
13
+ import * as i1 from "@kirbydesign/designsystem/shared";
13
14
  import * as i2 from "@kirbydesign/designsystem/dropdown";
14
15
  import * as i3 from "@kirbydesign/designsystem/icon";
15
16
  import * as i4 from "@angular/common";
@@ -39,6 +40,7 @@ export class CalendarComponent {
39
40
  }
40
41
  if (this.hasDateChanged(value, this._selectedDate)) {
41
42
  this.onSelectedDateChange(value);
43
+ this.focusDate(value);
42
44
  this._selectedDate = value;
43
45
  }
44
46
  }
@@ -98,8 +100,13 @@ export class CalendarComponent {
98
100
  get _hasYearNavigator() {
99
101
  return !!this.yearNavigatorOptions;
100
102
  }
101
- constructor(calendarHelper, locale) {
102
- this.calendarHelper = calendarHelper;
103
+ getTodayDate() {
104
+ return startOfDay(this.todayDate ?? new Date());
105
+ }
106
+ constructor(locale, elementRef, cdr, translations) {
107
+ this.elementRef = elementRef;
108
+ this.cdr = cdr;
109
+ this.translations = translations;
103
110
  this.dateChange = new EventEmitter();
104
111
  this.dateSelect = new EventEmitter();
105
112
  this.yearSelect = new EventEmitter();
@@ -116,6 +123,7 @@ export class CalendarComponent {
116
123
  For context see: https://github.com/kirbydesign/designsystem/issues/2087
117
124
  */
118
125
  this.usePopover = false;
126
+ this._tableMonthId = UniqueIdGenerator.scopedTo('kirby-calendar-month').next();
119
127
  this._disabledDates = [];
120
128
  this._enabledDates = [];
121
129
  this.includedLocales = { da, enGB, enUS };
@@ -135,13 +143,21 @@ export class CalendarComponent {
135
143
  const availableLocales = { ...this.includedLocales, ...this.locales, ...this.customLocales };
136
144
  return availableLocales[locale] || this.includedLocales.enGB; // Default to enGB if injected locale doesnt exist
137
145
  }
146
+ formatDateLabel() {
147
+ const localeDateFormats = {
148
+ da: 'd. MMMM',
149
+ 'en-GB': 'd MMMM',
150
+ 'en-US': 'MMMM d',
151
+ };
152
+ const defaultDateFormat = localeDateFormats['en-US'];
153
+ const dateFormat = localeDateFormats[this.locale.code] || defaultDateFormat;
154
+ return dateFormat;
155
+ }
138
156
  ngOnInit() {
157
+ this.focussedDate = this.getTodayDate();
139
158
  this._weekDays = this.getWeekDays();
140
159
  this.setActiveMonth(this.selectedDate);
141
160
  }
142
- ngAfterViewInit() {
143
- this.calendarHelper.init(this.calendarContainer, this.getHelperOptions(), this._onDateSelected.bind(this), this.onChangeMonth.bind(this));
144
- }
145
161
  ngOnChanges(changes) {
146
162
  if (!this.activeMonth)
147
163
  return;
@@ -155,14 +171,12 @@ export class CalendarComponent {
155
171
  changes.todayDate ||
156
172
  changes.timezone) {
157
173
  this.refreshActiveMonth();
158
- this.calendarHelper.update(this.getHelperOptions());
159
174
  }
160
175
  }
161
176
  setActiveMonth(date = new Date()) {
162
177
  if (!this.activeMonth || !isSameMonth(this.activeMonth, date)) {
163
178
  this.activeMonth = startOfMonth(date);
164
179
  this.refreshActiveMonth();
165
- this.calendarHelper.update(this.getHelperOptions());
166
180
  }
167
181
  }
168
182
  // For leniency, the component will accept any Date that points to either UTC midnight
@@ -192,10 +206,12 @@ export class CalendarComponent {
192
206
  start: startOfWeek(now, { locale: this.locale }),
193
207
  end: endOfWeek(now, { locale: this.locale }),
194
208
  });
195
- return week.map((date) => this.getFirstLetterOfWeekDayCapitalized(date));
196
- }
197
- getFirstLetterOfWeekDayCapitalized(date) {
198
- return this.formatWithLocale(date, 'EEEEE');
209
+ const weekdayNarrowFormat = 'EEEEE';
210
+ const weekdayWideFormat = 'EEEE';
211
+ return week.map((date) => ({
212
+ firstLetterCapitalized: this.formatWithLocale(date, weekdayNarrowFormat),
213
+ fullName: this.formatWithLocale(date, weekdayWideFormat),
214
+ }));
199
215
  }
200
216
  hasDateChanged(newDate, previousDate) {
201
217
  if (!newDate && !previousDate) {
@@ -218,66 +234,64 @@ export class CalendarComponent {
218
234
  return;
219
235
  const monthStart = startOfMonth(this.activeMonth);
220
236
  const startOfFirstWeek = startOfWeek(monthStart, { locale: this.locale });
221
- const today = this.todayDate ? startOfDay(this.todayDate) : startOfDay(new Date());
222
237
  const totalNumberOfDays = 42; // Always show 42 days (6 weeks) in calendar
223
238
  const daysArray = Array.from(Array(totalNumberOfDays).keys());
224
- const days = daysArray.map((number) => {
225
- const cellDate = add(startOfFirstWeek, { [TimeUnit.days]: number });
226
- const day = this.getCalendarDay(cellDate, today, monthStart);
227
- const isSelectable = this.isSelectable(day, cellDate);
228
- const isSelected = isSameDay(this.selectedDate, cellDate);
229
- const cell = {
230
- date: cellDate.getDate(),
231
- monthIndex: cellDate.getMonth(),
232
- year: cellDate.getFullYear(),
233
- isCurrentMonth: day.isCurrentMonth,
234
- isSelectable,
235
- isSelected,
236
- cssClasses: this.getCssClasses(day, isSelectable, isSelected),
239
+ const today = this.getTodayDate();
240
+ const calendarDays = daysArray.map((number) => {
241
+ const dateOfCalendarDay = add(startOfFirstWeek, { [TimeUnit.days]: number });
242
+ const calendarDay = {
243
+ date: dateOfCalendarDay.getDate(),
244
+ monthIndex: dateOfCalendarDay.getMonth(),
245
+ year: dateOfCalendarDay.getFullYear(),
246
+ ariaLabel: this.formatWithLocale(dateOfCalendarDay, this.formatDateLabel()),
247
+ ...this.getCalendarDayMetadata(dateOfCalendarDay, today, monthStart),
237
248
  };
238
- if (isSelected) {
239
- this.selectedDay = cell;
249
+ if (calendarDay.isSelected) {
250
+ this.selectedDay = calendarDay;
240
251
  }
241
- return cell;
252
+ if (calendarDay.isFocussed) {
253
+ this.focussedDay = calendarDay;
254
+ }
255
+ return calendarDay;
242
256
  });
243
- this._month = this.chunk(days, 7);
257
+ this._month = this.chunk(calendarDays, 7);
244
258
  }
245
- getCalendarDay(date, today, monthStart) {
259
+ getCalendarDayMetadata(date, today, monthStart) {
246
260
  return {
247
261
  isToday: isSameDay(today, date),
248
262
  isPast: isBefore(date, today),
249
263
  isFuture: isAfter(date, today),
250
264
  isWeekend: isWeekend(date),
251
265
  isCurrentMonth: isSameMonth(date, monthStart),
252
- isDisabled: this.isDisabledDate(date) || !this.isEnabledDate(date),
266
+ isSelectable: this.isSelectable(date, today),
267
+ isFocusable: this.isWithinAllowedRange(date, today),
268
+ isSelected: isSameDay(this.selectedDate, date),
269
+ isFocussed: isSameDay(this.focussedDate, date),
253
270
  };
254
271
  }
255
- isSelectable(day, date) {
256
- return ((this.alwaysEnableToday && day.isToday) ||
257
- (!day.isDisabled &&
258
- !(this.disableWeekends && day.isWeekend) &&
259
- !(this.disablePastDates && day.isPast) &&
260
- !(this.disableFutureDates && day.isFuture) &&
261
- !(this.minDate && isBefore(date, this.minDate)) &&
262
- !(this.maxDate && isAfter(date, this.maxDate))));
263
- }
264
- getCssClasses(day, isSelectable, isSelected) {
265
- const cssClasses = {
266
- 'current-month': day.isCurrentMonth,
267
- weekend: day.isWeekend,
268
- today: day.isToday,
269
- selectable: isSelectable,
270
- selected: isSelected,
271
- past: day.isPast,
272
- disabled: day.isDisabled,
273
- };
274
- let cssClassString = 'day';
275
- for (const key in cssClasses) {
276
- if (cssClasses[key]) {
277
- cssClassString += ' ' + key;
278
- }
279
- }
280
- return cssClassString;
272
+ isSelectable(date, today) {
273
+ if (this.alwaysEnableToday && isSameDay(today, date))
274
+ return true;
275
+ if (!this.isWithinAllowedRange(date, today))
276
+ return false;
277
+ if (this.isDisabledDate(date))
278
+ return false;
279
+ if (!this.isEnabledDate(date))
280
+ return false;
281
+ if (this.disableWeekends && isWeekend(date))
282
+ return false;
283
+ return true;
284
+ }
285
+ isWithinAllowedRange(date, today) {
286
+ if (this.disablePastDates && isBefore(date, today))
287
+ return false;
288
+ if (this.disableFutureDates && isAfter(date, today))
289
+ return false;
290
+ if (this.minDate && isBefore(date, this.minDate))
291
+ return false;
292
+ if (this.maxDate && isAfter(date, this.maxDate))
293
+ return false;
294
+ return true;
281
295
  }
282
296
  chunk(array, size) {
283
297
  const results = [];
@@ -290,14 +304,11 @@ export class CalendarComponent {
290
304
  if (this.selectedDay) {
291
305
  this.selectedDay.isSelected = false;
292
306
  }
293
- const newDay = this.getCell(newDate);
307
+ const newDay = this.getDay(newDate);
294
308
  if (newDay) {
295
309
  newDay.isSelected = true;
296
310
  this.selectedDay = newDay;
297
311
  }
298
- if (newDate) {
299
- this.calendarHelper.setSelectedDay(newDate.getDate());
300
- }
301
312
  }
302
313
  _onDateSelected(newDay) {
303
314
  if (!newDay.isSelectable)
@@ -310,16 +321,16 @@ export class CalendarComponent {
310
321
  if (this.hasDateChanged(newDate, this._selectedDate)) {
311
322
  this.setActiveMonth(newDate);
312
323
  this.onSelectedDateChange(newDate);
313
- this._selectedDate = newDate;
324
+ this.selectedDate = newDate;
314
325
  this.dateChange.emit(dateToEmit);
315
326
  }
316
327
  this.dateSelect.emit(dateToEmit);
317
328
  }
318
- onChangeMonth(direction) {
319
- this._changeMonth(direction);
320
- this.calendarHelper.update(this.getHelperOptions());
321
- }
322
329
  _changeMonth(index) {
330
+ if (index > 0 && !this._canNavigateForward)
331
+ return;
332
+ if (index < 0 && !this._canNavigateBack)
333
+ return;
323
334
  this.changeActiveView(index, TimeUnit.months);
324
335
  index > 0
325
336
  ? this.nextMonthClicked.emit(this.activeMonth)
@@ -334,21 +345,24 @@ export class CalendarComponent {
334
345
  if (index === 0)
335
346
  return;
336
347
  this.activeMonth = add(this.activeMonth, { [unit]: index });
348
+ this.focussedDate = add(this.focussedDate, { [unit]: index });
337
349
  this.refreshActiveMonth();
338
350
  }
339
351
  get _canNavigateBack() {
340
- const reachedPastDatesLimit = this.disablePastDates && isSameMonth(this.activeMonth, this.todayDate);
352
+ const today = this.getTodayDate();
353
+ const reachedPastDatesLimit = this.disablePastDates && isSameMonth(this.activeMonth, today);
341
354
  const reachedOrExceededMinDate = this.minDate &&
342
355
  (isSameMonth(this.activeMonth, this.minDate) || isBefore(this.activeMonth, this.minDate));
343
356
  return !reachedPastDatesLimit && !reachedOrExceededMinDate;
344
357
  }
345
358
  get _canNavigateForward() {
346
- const reachedFutureDatesLimit = this.disableFutureDates && isSameMonth(this.activeMonth, this.todayDate);
359
+ const today = this.getTodayDate();
360
+ const reachedFutureDatesLimit = this.disableFutureDates && isSameMonth(this.activeMonth, today);
347
361
  const reachedOrExceededMaxDate = this.maxDate &&
348
362
  (isSameMonth(this.activeMonth, this.maxDate) || isAfter(this.activeMonth, this.maxDate));
349
363
  return !reachedFutureDatesLimit && !reachedOrExceededMaxDate;
350
364
  }
351
- getCell(date) {
365
+ getDay(date) {
352
366
  let foundDay = null;
353
367
  if (date) {
354
368
  for (const week of this._month) {
@@ -362,16 +376,6 @@ export class CalendarComponent {
362
376
  }
363
377
  return foundDay;
364
378
  }
365
- getHelperOptions() {
366
- return {
367
- canNavigateBack: this._canNavigateBack,
368
- canNavigateForward: this._canNavigateForward,
369
- year: this.activeYear,
370
- monthName: this.activeMonthName,
371
- weekDays: this._weekDays,
372
- month: this._month,
373
- };
374
- }
375
379
  subtractTimezoneOffset(date) {
376
380
  const timezoneOffsetInMs = date.getTimezoneOffset() * 60 * 1000;
377
381
  return new Date(date.getTime() - timezoneOffsetInMs);
@@ -388,19 +392,82 @@ export class CalendarComponent {
388
392
  const numberOfYears = endYear - startYear;
389
393
  return Array.from({ length: numberOfYears + 1 }, (_, i) => (startYear + i).toString());
390
394
  }
391
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: CalendarComponent, deps: [{ token: i1.CalendarHelper }, { token: LOCALE_ID }], target: i0.ɵɵFactoryTarget.Component }); }
392
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.8", type: CalendarComponent, isStandalone: true, selector: "kirby-calendar", inputs: { timezone: "timezone", disableWeekends: "disableWeekends", disablePastDates: "disablePastDates", disableFutureDates: "disableFutureDates", alwaysEnableToday: "alwaysEnableToday", locales: "locales", customLocales: "customLocales", usePopover: "usePopover", yearNavigatorOptions: "yearNavigatorOptions", selectedDate: "selectedDate", disabledDates: "disabledDates", enabledDates: "enabledDates", todayDate: "todayDate", minDate: "minDate", maxDate: "maxDate" }, outputs: { dateChange: "dateChange", dateSelect: "dateSelect", yearSelect: "yearSelect", previousMonthClicked: "previousMonthClicked", nextMonthClicked: "nextMonthClicked" }, host: { properties: { "class.has-year-navigator": "this._hasYearNavigator" } }, providers: [CalendarHelper], viewQueries: [{ propertyName: "calendarContainer", first: true, predicate: ["calendarContainer"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"header\">\n <div class=\"month-navigator\">\n <button\n type=\"button\"\n [disabled]=\"!_canNavigateBack\"\n (click)=\"_changeMonth(-1)\"\n kirby-button\n [noDecoration]=\"true\"\n class=\"no-margin\"\n >\n <kirby-icon name=\"arrow-back\"></kirby-icon>\n </button>\n\n <div class=\"month-and-year\">\n <span class=\"month\">{{ activeMonthName }}</span>\n <span *ngIf=\"!_hasYearNavigator\" class=\"year\">{{ activeYear }}</span>\n </div>\n\n <button\n type=\"button\"\n [disabled]=\"!_canNavigateForward\"\n (click)=\"_changeMonth(1)\"\n kirby-button\n [noDecoration]=\"true\"\n class=\"no-margin\"\n >\n <kirby-icon name=\"arrow-more\"></kirby-icon>\n </button>\n </div>\n <kirby-dropdown\n *ngIf=\"_hasYearNavigator\"\n [usePopover]=\"usePopover\"\n [selectedIndex]=\"navigatedYear\"\n [items]=\"navigableYears\"\n popout=\"left\"\n (change)=\"_changeYear($event)\"\n ></kirby-dropdown>\n</div>\n\n<table>\n <thead>\n <tr>\n <th *ngFor=\"let weekDay of _weekDays\">{{ weekDay }}</th>\n </tr>\n </thead>\n\n <tbody>\n <tr *ngFor=\"let week of _month\">\n <td *ngFor=\"let day of week\">\n <div\n (click)=\"_onDateSelected(day)\"\n class=\"{{ day.cssClasses }} contain-state-layer\"\n [class.selected]=\"day.isSelected\"\n >\n <span class=\"state-layer\" aria-hidden=\"true\"></span>\n <span class=\"content-layer\">{{ day.date }}</span>\n </div>\n </td>\n </tr>\n </tbody>\n</table>\n\n<!-- <iframe src=\"kirby/components/calendar/calendar.webview.html\" #calendarContainer style=\"width: 320px; height: 304px; border: 0\"> -->\n", styles: ["table{width:100%;border-collapse:collapse;-webkit-user-select:none;user-select:none;margin-bottom:8px}th,td{text-align:center;padding:0}th:first-child,td:first-child{padding-left:8px}th:last-child,td:last-child{padding-right:8px}th{height:50px;border-bottom:1px solid var(--kirby-background-color)}.header,th,td{background-color:transparent}.header{display:flex;justify-content:space-between;margin:8px 8px 0}.month-navigator{display:flex;flex-grow:1;align-items:center;justify-content:space-between}.month-navigator button:disabled{opacity:.5;pointer-events:none}.month-and-year{-webkit-user-select:none;user-select:none}.month-and-year .month{font-weight:700;margin-right:8px}:host(.has-year-navigator) .month-navigator{flex-grow:0}:host(.has-year-navigator) .month-and-year{width:80px;margin:0 8px;text-align:center}:host(.has-year-navigator) .month{margin-right:0}.day{display:inline-flex;align-items:center;justify-content:center;border-radius:20px;width:40px;height:40px;margin:4px 0;color:var(--color, var(--kirby-black));background-color:var(--background-color, transparent)}.day.disabled,.day:not(.selectable){--color: #b4b4b4;pointer-events:none}.day.selectable:not(.current-month){--color: var(--kirby-text-color-semi-dark)}@media (hover: hover){.day.today:hover{--state-layer-opacity: .08;--state-layer-background-color: var(--kirby-black);cursor:pointer}}.day.today:active,.day.today.interaction-state-active{--state-layer-opacity: .16;--state-layer-background-color: var(--kirby-black)}.day.today{color:var(--kirby-medium-contrast);background-color:var(--kirby-medium)}@media (hover: hover){.day.selected:hover{--state-layer-opacity: .24;--state-layer-background-color: var(--kirby-black-contrast);cursor:pointer}}.day.selected:active,.day.selected.interaction-state-active{--state-layer-opacity: .36;--state-layer-background-color: var(--kirby-black-contrast)}.day.selected{color:var(--kirby-black-contrast);background-color:var(--kirby-black)}.contain-state-layer{--state-layer-opacity: 0;--state-layer-background-color: var(--kirby-black);position:relative}.contain-state-layer .content-layer{position:relative;z-index:var(--content-layer-z-index, 1)}.contain-state-layer .state-layer{position:absolute;inset:0;overflow:hidden;pointer-events:none;border-radius:inherit;z-index:2}.contain-state-layer .state-layer:before{transition:all 80ms linear 0ms;content:\"\";position:absolute;pointer-events:none;inset:-50%;opacity:var(--state-layer-opacity, 0);background-color:var(--state-layer-background-color, var(--kirby-black))}@media (hover: hover){.contain-state-layer:hover{--state-layer-opacity: .08;--state-layer-background-color: var(--kirby-black);cursor:pointer}}.contain-state-layer:active,.contain-state-layer.interaction-state-active{--state-layer-opacity: .16;--state-layer-background-color: var(--kirby-black)}\n"], dependencies: [{ kind: "ngmodule", type: DropdownModule }, { kind: "component", type: i2.DropdownComponent, selector: "kirby-dropdown", inputs: ["items", "selectedIndex", "focusedIndex", "itemTextProperty", "placeholder", "popout", "attentionLevel", "expand", "disabled", "hasError", "size", "tabindex", "usePopover"], outputs: ["change"] }, { kind: "component", type: ButtonComponent, selector: "button[kirby-button],Button[kirby-button],a[kirby-button]", inputs: ["attentionLevel", "noDecoration", "themeColor", "expand", "isFloating", "size", "showIconOnly"] }, { kind: "ngmodule", type: IconModule }, { kind: "component", type: i3.IconComponent, selector: "kirby-icon", inputs: ["size", "name"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
395
+ setFocussedDay(newDate) {
396
+ const newDay = this.getDay(newDate);
397
+ if (!newDay)
398
+ return;
399
+ if (this.focussedDay) {
400
+ this.focussedDay.isFocussed = false;
401
+ }
402
+ newDay.isFocussed = true;
403
+ this.focussedDay = newDay;
404
+ }
405
+ focusDate(newDate) {
406
+ if (!newDate)
407
+ return;
408
+ if (this.timezone === 'UTC') {
409
+ newDate = zonedTimeToUtc(this.subtractTimezoneOffset(newDate), this.timeZoneName);
410
+ }
411
+ const today = this.getTodayDate();
412
+ if (!this.isWithinAllowedRange(newDate, today))
413
+ return;
414
+ if (!this.hasDateChanged(newDate, this.focussedDate))
415
+ return;
416
+ this.setActiveMonth(newDate);
417
+ this.setFocussedDay(newDate);
418
+ this.focussedDate = newDate;
419
+ this.cdr.detectChanges(); //sync focussed class to template before setting focus
420
+ const elementMarkedForFocus = this.elementRef.nativeElement.querySelector('.focussed');
421
+ elementMarkedForFocus.focus();
422
+ }
423
+ _onDateKeydown(event) {
424
+ const { key, shiftKey } = event;
425
+ let newDate;
426
+ switch (key) {
427
+ case 'ArrowUp':
428
+ newDate = add(this.focussedDate, { days: -7 });
429
+ break;
430
+ case 'ArrowDown':
431
+ newDate = add(this.focussedDate, { days: 7 });
432
+ break;
433
+ case 'ArrowRight':
434
+ newDate = add(this.focussedDate, { days: 1 });
435
+ break;
436
+ case 'ArrowLeft':
437
+ newDate = add(this.focussedDate, { days: -1 });
438
+ break;
439
+ case 'Home':
440
+ newDate = startOfWeek(this.focussedDate, { locale: this.locale });
441
+ break;
442
+ case 'End':
443
+ newDate = lastDayOfWeek(this.focussedDate, { locale: this.locale });
444
+ break;
445
+ case 'PageUp':
446
+ newDate = shiftKey
447
+ ? add(this.focussedDate, { years: -1 })
448
+ : add(this.focussedDate, { months: -1 });
449
+ break;
450
+ case 'PageDown':
451
+ newDate = shiftKey
452
+ ? add(this.focussedDate, { years: 1 })
453
+ : add(this.focussedDate, { months: 1 });
454
+ break;
455
+ default:
456
+ return;
457
+ }
458
+ event.preventDefault();
459
+ this.focusDate(newDate);
460
+ }
461
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CalendarComponent, deps: [{ token: LOCALE_ID }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1.TranslationService }], target: i0.ɵɵFactoryTarget.Component }); }
462
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CalendarComponent, isStandalone: true, selector: "kirby-calendar", inputs: { timezone: "timezone", disableWeekends: "disableWeekends", disablePastDates: "disablePastDates", disableFutureDates: "disableFutureDates", alwaysEnableToday: "alwaysEnableToday", locales: "locales", customLocales: "customLocales", usePopover: "usePopover", yearNavigatorOptions: "yearNavigatorOptions", selectedDate: "selectedDate", disabledDates: "disabledDates", enabledDates: "enabledDates", todayDate: "todayDate", minDate: "minDate", maxDate: "maxDate" }, outputs: { dateChange: "dateChange", dateSelect: "dateSelect", yearSelect: "yearSelect", previousMonthClicked: "previousMonthClicked", nextMonthClicked: "nextMonthClicked" }, host: { properties: { "class.has-year-navigator": "this._hasYearNavigator" } }, usesOnChanges: true, ngImport: i0, template: "<div class=\"header\">\n <div class=\"month-navigator\">\n <button\n kirby-button\n type=\"button\"\n class=\"no-margin\"\n [attr.aria-label]=\"translations.get('previousMonth')\"\n [attr.aria-disabled]=\"_canNavigateBack ? null : true\"\n [noDecoration]=\"true\"\n (click)=\"_changeMonth(-1)\"\n >\n <kirby-icon name=\"arrow-back\" aria-hidden=\"true\"></kirby-icon>\n </button>\n\n <div class=\"month-and-year\" [id]=\"_tableMonthId\" aria-live=\"polite\" aria-atomic=\"true\">\n <span class=\"month\">{{ activeMonthName }}</span>\n <span *ngIf=\"!_hasYearNavigator\" class=\"year\">{{ activeYear }}</span>\n </div>\n\n <button\n kirby-button\n type=\"button\"\n class=\"no-margin\"\n [attr.aria-label]=\"translations.get('nextMonth')\"\n [attr.aria-disabled]=\"_canNavigateForward ? null : true\"\n [noDecoration]=\"true\"\n (click)=\"_changeMonth(1)\"\n >\n <kirby-icon name=\"arrow-more\" aria-hidden=\"true\"></kirby-icon>\n </button>\n </div>\n <kirby-dropdown\n *ngIf=\"_hasYearNavigator\"\n [usePopover]=\"usePopover\"\n [selectedIndex]=\"navigatedYear\"\n [items]=\"navigableYears\"\n [attr.aria-label]=\"translations.get('selectYear')\"\n popout=\"left\"\n (change)=\"_changeYear($event)\"\n ></kirby-dropdown>\n</div>\n\n<table [attr.aria-labelledby]=\"_tableMonthId\" role=\"grid\">\n <thead>\n <tr>\n <th *ngFor=\"let weekDay of _weekDays\" scope=\"col\">\n <span aria-hidden=\"true\">{{ weekDay.firstLetterCapitalized }}</span>\n <span class=\"visually-hidden\">{{ weekDay.fullName }}</span>\n </th>\n </tr>\n </thead>\n\n <tbody>\n <tr *ngFor=\"let week of _month\">\n <td *ngFor=\"let day of week\" [attr.aria-selected]=\"day.isSelected ? true : false\">\n <button\n kirby-button\n type=\"button\"\n (click)=\"_onDateSelected(day)\"\n (keydown)=\"_onDateKeydown($event)\"\n class=\"day\"\n [class.current-month]=\"day.isCurrentMonth\"\n [class.weekend]=\"day.isWeekend\"\n [class.today]=\"day.isToday\"\n [class.selectable]=\"day.isSelectable\"\n [class.selected]=\"day.isSelected\"\n [class.focussed]=\"day.isFocussed\"\n [class.past]=\"day.isPast\"\n [attr.aria-label]=\"day.ariaLabel\"\n [attr.aria-disabled]=\"day.isSelectable ? null : true\"\n [noDecoration]=\"true\"\n [disabled]=\"day.isFocusable ? null : true\"\n [tabIndex]=\"day.isFocussed ? 0 : -1\"\n >\n {{ day.date }}\n </button>\n </td>\n </tr>\n </tbody>\n</table>\n", styles: [":host{font-size:16px}table{width:100%;border-collapse:collapse;-webkit-user-select:none;user-select:none;margin-bottom:8px}th,td{text-align:center;padding:0}th:first-child,td:first-child{padding-left:8px}th:last-child,td:last-child{padding-right:8px}th{height:50px;border-bottom:1px solid var(--kirby-background-color)}.header,th,td{background-color:transparent}.header{display:flex;justify-content:space-between;margin:8px 8px 0}.month-navigator{display:flex;flex-grow:1;align-items:center;justify-content:space-between}.month-and-year{-webkit-user-select:none;user-select:none;font-weight:700}.month-and-year .month{margin-right:8px}:host(.has-year-navigator) .month-navigator{flex-grow:0}:host(.has-year-navigator) .month-and-year{width:80px;margin:0 8px;text-align:center}:host(.has-year-navigator) .month{margin-right:0}.day{display:inline-flex;align-items:center;justify-content:center;border-radius:20px;min-width:40px;min-height:40px;width:40px;height:40px;margin:4px 0;font-size:16px}.day:focus{z-index:1}button[aria-disabled=true]{color:#b4b4b4}.day.selectable:not(.current-month,.selected){color:var(--kirby-text-color-semi-dark)}.day.today{color:var(--kirby-medium-contrast);background-color:var(--kirby-medium)}.day.selected{color:var(--kirby-black-contrast);background-color:var(--kirby-black)}.visually-hidden{position:absolute;scale:0}\n"], dependencies: [{ kind: "ngmodule", type: DropdownModule }, { kind: "component", type: i2.DropdownComponent, selector: "kirby-dropdown", inputs: ["items", "selectedIndex", "focusedIndex", "itemTextProperty", "placeholder", "popout", "attentionLevel", "expand", "disabled", "hasError", "size", "tabindex", "usePopover"], outputs: ["change"] }, { kind: "component", type: ButtonComponent, selector: "button[kirby-button],Button[kirby-button],a[kirby-button]", inputs: ["attentionLevel", "noDecoration", "themeColor", "expand", "isFloating", "size", "showIconOnly"] }, { kind: "ngmodule", type: IconModule }, { kind: "component", type: i3.IconComponent, selector: "kirby-icon", inputs: ["size", "name"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
393
463
  }
394
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: CalendarComponent, decorators: [{
464
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CalendarComponent, decorators: [{
395
465
  type: Component,
396
- args: [{ standalone: true, imports: [DropdownModule, ButtonComponent, IconModule, CommonModule], selector: 'kirby-calendar', providers: [CalendarHelper], template: "<div class=\"header\">\n <div class=\"month-navigator\">\n <button\n type=\"button\"\n [disabled]=\"!_canNavigateBack\"\n (click)=\"_changeMonth(-1)\"\n kirby-button\n [noDecoration]=\"true\"\n class=\"no-margin\"\n >\n <kirby-icon name=\"arrow-back\"></kirby-icon>\n </button>\n\n <div class=\"month-and-year\">\n <span class=\"month\">{{ activeMonthName }}</span>\n <span *ngIf=\"!_hasYearNavigator\" class=\"year\">{{ activeYear }}</span>\n </div>\n\n <button\n type=\"button\"\n [disabled]=\"!_canNavigateForward\"\n (click)=\"_changeMonth(1)\"\n kirby-button\n [noDecoration]=\"true\"\n class=\"no-margin\"\n >\n <kirby-icon name=\"arrow-more\"></kirby-icon>\n </button>\n </div>\n <kirby-dropdown\n *ngIf=\"_hasYearNavigator\"\n [usePopover]=\"usePopover\"\n [selectedIndex]=\"navigatedYear\"\n [items]=\"navigableYears\"\n popout=\"left\"\n (change)=\"_changeYear($event)\"\n ></kirby-dropdown>\n</div>\n\n<table>\n <thead>\n <tr>\n <th *ngFor=\"let weekDay of _weekDays\">{{ weekDay }}</th>\n </tr>\n </thead>\n\n <tbody>\n <tr *ngFor=\"let week of _month\">\n <td *ngFor=\"let day of week\">\n <div\n (click)=\"_onDateSelected(day)\"\n class=\"{{ day.cssClasses }} contain-state-layer\"\n [class.selected]=\"day.isSelected\"\n >\n <span class=\"state-layer\" aria-hidden=\"true\"></span>\n <span class=\"content-layer\">{{ day.date }}</span>\n </div>\n </td>\n </tr>\n </tbody>\n</table>\n\n<!-- <iframe src=\"kirby/components/calendar/calendar.webview.html\" #calendarContainer style=\"width: 320px; height: 304px; border: 0\"> -->\n", styles: ["table{width:100%;border-collapse:collapse;-webkit-user-select:none;user-select:none;margin-bottom:8px}th,td{text-align:center;padding:0}th:first-child,td:first-child{padding-left:8px}th:last-child,td:last-child{padding-right:8px}th{height:50px;border-bottom:1px solid var(--kirby-background-color)}.header,th,td{background-color:transparent}.header{display:flex;justify-content:space-between;margin:8px 8px 0}.month-navigator{display:flex;flex-grow:1;align-items:center;justify-content:space-between}.month-navigator button:disabled{opacity:.5;pointer-events:none}.month-and-year{-webkit-user-select:none;user-select:none}.month-and-year .month{font-weight:700;margin-right:8px}:host(.has-year-navigator) .month-navigator{flex-grow:0}:host(.has-year-navigator) .month-and-year{width:80px;margin:0 8px;text-align:center}:host(.has-year-navigator) .month{margin-right:0}.day{display:inline-flex;align-items:center;justify-content:center;border-radius:20px;width:40px;height:40px;margin:4px 0;color:var(--color, var(--kirby-black));background-color:var(--background-color, transparent)}.day.disabled,.day:not(.selectable){--color: #b4b4b4;pointer-events:none}.day.selectable:not(.current-month){--color: var(--kirby-text-color-semi-dark)}@media (hover: hover){.day.today:hover{--state-layer-opacity: .08;--state-layer-background-color: var(--kirby-black);cursor:pointer}}.day.today:active,.day.today.interaction-state-active{--state-layer-opacity: .16;--state-layer-background-color: var(--kirby-black)}.day.today{color:var(--kirby-medium-contrast);background-color:var(--kirby-medium)}@media (hover: hover){.day.selected:hover{--state-layer-opacity: .24;--state-layer-background-color: var(--kirby-black-contrast);cursor:pointer}}.day.selected:active,.day.selected.interaction-state-active{--state-layer-opacity: .36;--state-layer-background-color: var(--kirby-black-contrast)}.day.selected{color:var(--kirby-black-contrast);background-color:var(--kirby-black)}.contain-state-layer{--state-layer-opacity: 0;--state-layer-background-color: var(--kirby-black);position:relative}.contain-state-layer .content-layer{position:relative;z-index:var(--content-layer-z-index, 1)}.contain-state-layer .state-layer{position:absolute;inset:0;overflow:hidden;pointer-events:none;border-radius:inherit;z-index:2}.contain-state-layer .state-layer:before{transition:all 80ms linear 0ms;content:\"\";position:absolute;pointer-events:none;inset:-50%;opacity:var(--state-layer-opacity, 0);background-color:var(--state-layer-background-color, var(--kirby-black))}@media (hover: hover){.contain-state-layer:hover{--state-layer-opacity: .08;--state-layer-background-color: var(--kirby-black);cursor:pointer}}.contain-state-layer:active,.contain-state-layer.interaction-state-active{--state-layer-opacity: .16;--state-layer-background-color: var(--kirby-black)}\n"] }]
397
- }], ctorParameters: () => [{ type: i1.CalendarHelper }, { type: undefined, decorators: [{
466
+ args: [{ standalone: true, imports: [DropdownModule, ButtonComponent, IconModule, CommonModule], selector: 'kirby-calendar', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"header\">\n <div class=\"month-navigator\">\n <button\n kirby-button\n type=\"button\"\n class=\"no-margin\"\n [attr.aria-label]=\"translations.get('previousMonth')\"\n [attr.aria-disabled]=\"_canNavigateBack ? null : true\"\n [noDecoration]=\"true\"\n (click)=\"_changeMonth(-1)\"\n >\n <kirby-icon name=\"arrow-back\" aria-hidden=\"true\"></kirby-icon>\n </button>\n\n <div class=\"month-and-year\" [id]=\"_tableMonthId\" aria-live=\"polite\" aria-atomic=\"true\">\n <span class=\"month\">{{ activeMonthName }}</span>\n <span *ngIf=\"!_hasYearNavigator\" class=\"year\">{{ activeYear }}</span>\n </div>\n\n <button\n kirby-button\n type=\"button\"\n class=\"no-margin\"\n [attr.aria-label]=\"translations.get('nextMonth')\"\n [attr.aria-disabled]=\"_canNavigateForward ? null : true\"\n [noDecoration]=\"true\"\n (click)=\"_changeMonth(1)\"\n >\n <kirby-icon name=\"arrow-more\" aria-hidden=\"true\"></kirby-icon>\n </button>\n </div>\n <kirby-dropdown\n *ngIf=\"_hasYearNavigator\"\n [usePopover]=\"usePopover\"\n [selectedIndex]=\"navigatedYear\"\n [items]=\"navigableYears\"\n [attr.aria-label]=\"translations.get('selectYear')\"\n popout=\"left\"\n (change)=\"_changeYear($event)\"\n ></kirby-dropdown>\n</div>\n\n<table [attr.aria-labelledby]=\"_tableMonthId\" role=\"grid\">\n <thead>\n <tr>\n <th *ngFor=\"let weekDay of _weekDays\" scope=\"col\">\n <span aria-hidden=\"true\">{{ weekDay.firstLetterCapitalized }}</span>\n <span class=\"visually-hidden\">{{ weekDay.fullName }}</span>\n </th>\n </tr>\n </thead>\n\n <tbody>\n <tr *ngFor=\"let week of _month\">\n <td *ngFor=\"let day of week\" [attr.aria-selected]=\"day.isSelected ? true : false\">\n <button\n kirby-button\n type=\"button\"\n (click)=\"_onDateSelected(day)\"\n (keydown)=\"_onDateKeydown($event)\"\n class=\"day\"\n [class.current-month]=\"day.isCurrentMonth\"\n [class.weekend]=\"day.isWeekend\"\n [class.today]=\"day.isToday\"\n [class.selectable]=\"day.isSelectable\"\n [class.selected]=\"day.isSelected\"\n [class.focussed]=\"day.isFocussed\"\n [class.past]=\"day.isPast\"\n [attr.aria-label]=\"day.ariaLabel\"\n [attr.aria-disabled]=\"day.isSelectable ? null : true\"\n [noDecoration]=\"true\"\n [disabled]=\"day.isFocusable ? null : true\"\n [tabIndex]=\"day.isFocussed ? 0 : -1\"\n >\n {{ day.date }}\n </button>\n </td>\n </tr>\n </tbody>\n</table>\n", styles: [":host{font-size:16px}table{width:100%;border-collapse:collapse;-webkit-user-select:none;user-select:none;margin-bottom:8px}th,td{text-align:center;padding:0}th:first-child,td:first-child{padding-left:8px}th:last-child,td:last-child{padding-right:8px}th{height:50px;border-bottom:1px solid var(--kirby-background-color)}.header,th,td{background-color:transparent}.header{display:flex;justify-content:space-between;margin:8px 8px 0}.month-navigator{display:flex;flex-grow:1;align-items:center;justify-content:space-between}.month-and-year{-webkit-user-select:none;user-select:none;font-weight:700}.month-and-year .month{margin-right:8px}:host(.has-year-navigator) .month-navigator{flex-grow:0}:host(.has-year-navigator) .month-and-year{width:80px;margin:0 8px;text-align:center}:host(.has-year-navigator) .month{margin-right:0}.day{display:inline-flex;align-items:center;justify-content:center;border-radius:20px;min-width:40px;min-height:40px;width:40px;height:40px;margin:4px 0;font-size:16px}.day:focus{z-index:1}button[aria-disabled=true]{color:#b4b4b4}.day.selectable:not(.current-month,.selected){color:var(--kirby-text-color-semi-dark)}.day.today{color:var(--kirby-medium-contrast);background-color:var(--kirby-medium)}.day.selected{color:var(--kirby-black-contrast);background-color:var(--kirby-black)}.visually-hidden{position:absolute;scale:0}\n"] }]
467
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
398
468
  type: Inject,
399
469
  args: [LOCALE_ID]
400
- }] }], propDecorators: { calendarContainer: [{
401
- type: ViewChild,
402
- args: ['calendarContainer', { static: false }]
403
- }], dateChange: [{
470
+ }] }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1.TranslationService }], propDecorators: { dateChange: [{
404
471
  type: Output
405
472
  }], dateSelect: [{
406
473
  type: Output
@@ -444,4 +511,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImpor
444
511
  type: HostBinding,
445
512
  args: ['class.has-year-navigator']
446
513
  }] } });
447
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vY2FsZW5kYXIvc3JjL2NhbGVuZGFyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uL2NhbGVuZGFyL3NyYy9jYWxlbmRhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osV0FBVyxFQUNYLE1BQU0sRUFDTixLQUFLLEVBQ0wsU0FBUyxFQUdULE1BQU0sRUFFTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLEdBQUcsRUFDSCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULE1BQU0sRUFDTixPQUFPLEVBQ1AsT0FBTyxFQUNQLFFBQVEsRUFDUixTQUFTLEVBQ1QsV0FBVyxFQUNYLFNBQVMsRUFFVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFdBQVcsR0FDWixNQUFNLFVBQVUsQ0FBQztBQUNsQixPQUFPLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM3RCxPQUFPLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVqRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUUxRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRTVELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFHbkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7Ozs7QUFhM0QsSUFBSyxRQVNKO0FBVEQsV0FBSyxRQUFRO0lBQ1gsMkJBQWUsQ0FBQTtJ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TUFBTTtnQkFDRyxvQkFBb0I7c0JBQTdCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNFLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFFTyxPQUFPO3NCQUFuQixLQUFLO2dCQU1HLGFBQWE7c0JBQXJCLEtBQUs7Z0JBS0csVUFBVTtzQkFBbEIsS0FBSztnQkFRRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBdUJPLFlBQVk7c0JBQXhCLEtBQUs7Z0JBaUJPLGFBQWE7c0JBQXpCLEtBQUs7Z0JBUU8sWUFBWTtzQkFBeEIsS0FBSztnQkFRTyxTQUFTO3NCQUFyQixLQUFLO2dCQVFPLE9BQU87c0JBQW5CLEtBQUs7Z0JBV08sT0FBTztzQkFBbkIsS0FBSztnQkFpQ0YsaUJBQWlCO3NCQURwQixXQUFXO3VCQUFDLDBCQUEwQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0QmluZGluZyxcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgTE9DQUxFX0lELFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgYWRkLFxuICBlYWNoRGF5T2ZJbnRlcnZhbCxcbiAgZW5kT2ZXZWVrLFxuICBmb3JtYXQsXG4gIGdldFllYXIsXG4gIGlzQWZ0ZXIsXG4gIGlzQmVmb3JlLFxuICBpc1NhbWVEYXksXG4gIGlzU2FtZU1vbnRoLFxuICBpc1dlZWtlbmQsXG4gIExvY2FsZSBhcyBMb2NhbGVEYXRlRm5zLFxuICBzdGFydE9mRGF5LFxuICBzdGFydE9mTW9udGgsXG4gIHN0YXJ0T2ZXZWVrLFxufSBmcm9tICdkYXRlLWZucyc7XG5pbXBvcnQgeyB1dGNUb1pvbmVkVGltZSwgem9uZWRUaW1lVG9VdGMgfSBmcm9tICdkYXRlLWZucy10eic7XG5pbXBvcnQgeyBkYSwgZW5HQiwgZW5VUyB9IGZyb20gJ2RhdGUtZm5zL2xvY2FsZSc7XG5cbmltcG9ydCB7IGNhcGl0YWxpemVGaXJzdExldHRlciB9IGZyb20gJ0BraXJieWRlc2lnbi9jb3JlJztcblxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEljb25Nb2R1bGUgfSBmcm9tICdAa2lyYnlkZXNpZ24vZGVzaWduc3lzdGVtL2ljb24nO1xuXG5pbXBvcnQgeyBEcm9wZG93bk1vZHVsZSB9IGZyb20gJ0BraXJieWRlc2lnbi9kZXNpZ25zeXN0ZW0vZHJvcGRvd24nO1xuaW1wb3J0IHsgQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnQGtpcmJ5ZGVzaWduL2Rlc2lnbnN5c3RlbS9idXR0b24nO1xuaW1wb3J0IHsgQ2FsZW5kYXJDZWxsIH0gZnJvbSAnLi9oZWxwZXJzL2NhbGVuZGFyLWNlbGwubW9kZWwnO1xuaW1wb3J0IHsgQ2FsZW5kYXJPcHRpb25zIH0gZnJvbSAnLi9oZWxwZXJzL2NhbGVuZGFyLW9wdGlvbnMubW9kZWwnO1xuaW1wb3J0IHsgQ2FsZW5kYXJIZWxwZXIgfSBmcm9tICcuL2hlbHBlcnMvY2FsZW5kYXIuaGVscGVyJztcbmltcG9ydCB7IENhbGVuZGFyWWVhck5hdmlnYXRvckNvbmZpZyB9IGZyb20gJy4vb3B0aW9ucy9jYWxlbmRhci15ZWFyLW5hdmlnYXRvci1jb25maWcnO1xuXG5leHBvcnQgdHlwZSBMb2NhbGUgPSBMb2NhbGVEYXRlRm5zO1xuaW50ZXJmYWNlIENhbGVuZGFyRGF5IHtcbiAgaXNDdXJyZW50TW9udGg6IGJvb2xlYW47XG4gIGlzVG9kYXk6IGJvb2xlYW47XG4gIGlzV2Vla2VuZDogYm9vbGVhbjtcbiAgaXNQYXN0OiBib29sZWFuO1xuICBpc0Z1dHVyZTogYm9vbGVhbjtcbiAgaXNEaXNhYmxlZDogYm9vbGVhbjtcbn1cblxuZW51bSBUaW1lVW5pdCB7XG4gIHllYXJzID0gJ3llYXJzJyxcbiAgbW9udGhzID0gJ21vbnRocycsXG4gIHdlZWtzID0gJ3dlZWtzJyxcbiAgZGF5cyA9ICdkYXlzJyxcbiAgaG91cnMgPSAnaG91cnMnLFxuICBtaW51dGVzID0gJ21pbnV0ZXMnLFxuICBzZWNvbmRzID0gJ3NlY29uZHMnLFxuICBtaWxsaXNlY29uZHMgPSAnbWlsbGlzZWNvbmRzJyxcbn1cblxuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtEcm9wZG93bk1vZHVsZSwgQnV0dG9uQ29tcG9uZW50LCBJY29uTW9kdWxlLCBDb21tb25Nb2R1bGVdLFxuICBzZWxlY3RvcjogJ2tpcmJ5LWNhbGVuZGFyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NhbGVuZGFyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY2FsZW5kYXIuY29tcG9uZW50LnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbQ2FsZW5kYXJIZWxwZXJdLFxufSlcbmV4cG9ydCBjbGFzcyBDYWxlbmRhckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzIHtcbiAgQFZpZXdDaGlsZCgnY2FsZW5kYXJDb250YWluZXInLCB7IHN0YXRpYzogZmFsc2UgfSkgY2FsZW5kYXJDb250YWluZXI6IEVsZW1lbnRSZWY7XG4gIEBPdXRwdXQoKSBkYXRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlPigpO1xuICBAT3V0cHV0KCkgZGF0ZVNlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZT4oKTtcbiAgQE91dHB1dCgpIHllYXJTZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQE91dHB1dCgpIHByZXZpb3VzTW9udGhDbGlja2VkID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlPigpO1xuICBAT3V0cHV0KCkgbmV4dE1vbnRoQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZT4oKTtcbiAgQElucHV0KCkgdGltZXpvbmU6ICdsb2NhbCcgfCAnVVRDJyA9ICdsb2NhbCc7XG4gIEBJbnB1dCgpIGRpc2FibGVXZWVrZW5kcyA9IGZhbHNlO1xuICBASW5wdXQoKSBkaXNhYmxlUGFzdERhdGVzID0gZmFsc2U7XG4gIEBJbnB1dCgpIGRpc2FibGVGdXR1cmVEYXRlcyA9IGZhbHNlO1xuICBASW5wdXQoKSBhbHdheXNFbmFibGVUb2RheSA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIHNldCBsb2NhbGVzKGxvY2FsZXM6IHsgW2tleTogc3RyaW5nXTogTG9jYWxlIH0pIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgU3VwcGx5aW5nIGFkZGl0aW9uYWwgbG9jYWxlcyB0byB0aGUgS2lyYnkgQ2FsZW5kYXIgQ29tcG9uZW50IHZpYSBhbiBpbnB1dCBwcm9wZXJ0eSBpcyBkZXByZWNhdGVkIGFuZCBzaG91bGQgbm90IGJlIHVzZWQuIFxuICAgICAgICBBIGZ1dHVyZSB1cGRhdGUgd2lsbCBhbGxvdyBpbmplY3RpbmcgYWRkaXRpb25hbCBsb2NhbGVzIHZpYSBhIHByb3ZpZGVyIGluc3RlYWQuYFxuICAgICk7XG4gIH1cbiAgQElucHV0KCkgY3VzdG9tTG9jYWxlczogeyBba2V5OiBzdHJpbmddOiBMb2NhbGUgfSA9IHt9O1xuICAvKiBcbiAgICBFeHBlcmltZW50YWw6IElucHV0IHByb3BlcnR5IG5vdCBkb2N1bWVudGVkIG9uIHB1cnBvc2UuIFxuICAgIEZvciBjb250ZXh0IHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2tpcmJ5ZGVzaWduL2Rlc2lnbnN5c3RlbS9pc3N1ZXMvMjA4N1xuICAqL1xuICBASW5wdXQoKSB1c2VQb3BvdmVyID0gZmFsc2U7XG4gIC8qKlxuICAgKiBDb25maWd1cmF0aW9uIGZvciB0aGUgeWVhciBuYXZpZ2F0b3IuXG4gICAqXG4gICAqIEludGVybmFsbHksIGNhbGVuZGFyIGNvbXBvbmVudDpcbiAgICogLSBiYXNlcyB5ZWFyTmF2aWdhdG9yT3B0aW9ucy5mcm9tIGFuZCB5ZWFyTmF2aWdhdG9yT3B0aW9ucy50byBvbiB0b2RheURhdGUgaWYgYSBudW1iZXIgaXMgcHJvdmlkZWRcbiAgICogLSBwcmlvcml0aXplcyBtaW5EYXRlIGFuZCBtYXhEYXRlIG92ZXIgeWVhck5hdmlnYXRvck9wdGlvbnMuZnJvbSBhbmQgeWVhck5hdmlnYXRvck9wdGlvbnMudG9cbiAgICovXG4gIEBJbnB1dCgpIHllYXJOYXZpZ2F0b3JPcHRpb25zOiBDYWxlbmRhclllYXJOYXZpZ2F0b3JDb25maWc7XG5cbiAgX21vbnRoOiBDYWxlbmRhckNlbGxbXVtdO1xuICBfd2Vla0RheXM6IHN0cmluZ1tdO1xuICBwcml2YXRlIHNlbGVjdGVkRGF5OiBDYWxlbmRhckNlbGw7XG4gIC8vIE5PVEU6IEludGVybmFsbHksIGFsbCBEYXRlc1xuICAvLyBhcmUgbm9ybWFsaXplZCB0byBwb2ludCB0byBsb2NhbCB0aW1lem9uZSBtaWRuaWdodCwgcmVnYXJkbGVzcyBvZiB0aGUgdGltZXpvbmVcbiAgLy8gc2V0dGluZy5cbiAgcHJpdmF0ZSBhY3RpdmVNb250aDogRGF0ZTtcbiAgcHJpdmF0ZSBfc2VsZWN0ZWREYXRlOiBEYXRlO1xuICBwcml2YXRlIF9kaXNhYmxlZERhdGVzOiBEYXRlW10gPSBbXTtcbiAgcHJpdmF0ZSBfZW5hYmxlZERhdGVzOiBEYXRlW10gPSBbXTtcbiAgcHJpdmF0ZSBfdG9kYXlEYXRlOiBEYXRlO1xuICBwcml2YXRlIF9taW5EYXRlOiBEYXRlO1xuICBwcml2YXRlIF9tYXhEYXRlOiBEYXRlO1xuICBwcml2YXRlIGxvY2FsZTogTG9jYWxlO1xuICBwcml2YXRlIHRpbWVab25lTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIGluY2x1ZGVkTG9jYWxlcyA9IHsgZGEsIGVuR0IsIGVuVVMgfTtcblxuICBnZXQgc2VsZWN0ZWREYXRlKCk6IERhdGUge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZERhdGU7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgc2VsZWN0ZWREYXRlKHZhbHVlTG9jYWxPclVUQzogRGF0ZSB8IG51bGwpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMubm9ybWFsaXplRGF0ZSh2YWx1ZUxvY2FsT3JVVEMpO1xuXG4gICAgaWYgKHZhbHVlTG9jYWxPclVUQykge1xuICAgICAgdGhpcy5zZXRBY3RpdmVNb250aCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGFzRGF0ZUNoYW5nZWQodmFsdWUsIHRoaXMuX3NlbGVjdGVkRGF0ZSkpIHtcbiAgICAgIHRoaXMub25TZWxlY3RlZERhdGVDaGFuZ2UodmFsdWUpO1xuICAgICAgdGhpcy5fc2VsZWN0ZWREYXRlID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGRpc2FibGVkRGF0ZXMoKTogRGF0ZVtdIHtcbiAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWREYXRlcztcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBkaXNhYmxlZERhdGVzKHZhbHVlOiBEYXRlW10pIHtcbiAgICB0aGlzLl9kaXNhYmxlZERhdGVzID0gKHZhbHVlIHx8IFtdKS5tYXAoKGRhdGUpID0+IHRoaXMubm9ybWFsaXplRGF0ZShkYXRlKSk7XG4gIH1cblxuICBnZXQgZW5hYmxlZERhdGVzKCk6IERhdGVbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2VuYWJsZWREYXRlcztcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBlbmFibGVkRGF0ZXModmFsdWU6IERhdGVbXSkge1xuICAgIHRoaXMuX2VuYWJsZWREYXRlcyA9ICh2YWx1ZSB8fCBbXSkubWFwKChkYXRlKSA9PiB0aGlzLm5vcm1hbGl6ZURhdGUoZGF0ZSkpO1xuICB9XG5cbiAgZ2V0IHRvZGF5RGF0ZSgpOiBEYXRlIHtcbiAgICByZXR1cm4gdGhpcy5fdG9kYXlEYXRlO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IHRvZGF5RGF0ZSh2YWx1ZTogRGF0ZSkge1xuICAgIHRoaXMuX3RvZGF5RGF0ZSA9IHRoaXMubm9ybWFsaXplRGF0ZSh2YWx1ZSk7XG4gIH1cblxuICBnZXQgbWluRGF0ZSgpOiBEYXRlIHtcbiAgICByZXR1cm4gdGhpcy5fbWluRGF0ZTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBtaW5EYXRlKHZhbHVlOiBEYXRlKSB7XG4gICAgaWYgKHZhbHVlICYmIHRoaXMuYWN0aXZlTW9udGggJiYgaXNCZWZvcmUodGhpcy5hY3RpdmVNb250aCwgdmFsdWUpKSB7XG4gICAgICB0aGlzLnNldEFjdGl2ZU1vbnRoKHZhbHVlKTtcbiAgICB9XG4gICAgdGhpcy5fbWluRGF0ZSA9IHRoaXMubm9ybWFsaXplRGF0ZSh2YWx1ZSk7XG4gIH1cblxuICBnZXQgbWF4RGF0ZSgpOiBEYXRlIHtcbiAgICByZXR1cm4gdGhpcy5fbWF4RGF0ZTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBtYXhEYXRlKHZhbHVlOiBEYXRlKSB7XG4gICAgaWYgKHZhbHVlICYmIHRoaXMuYWN0aXZlTW9udGggJiYgaXNBZnRlcih0aGlzLmFjdGl2ZU1vbnRoLCB2YWx1ZSkpIHtcbiAgICAgIHRoaXMuc2V0QWN0aXZlTW9udGgodmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLl9tYXhEYXRlID0gdGhpcy5ub3JtYWxpemVEYXRlKHZhbHVlKTtcbiAgfVxuXG4gIGdldCBhY3RpdmVNb250aE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKHRoaXMuZm9ybWF0V2l0aExvY2FsZSh0aGlzLmFjdGl2ZU1vbnRoLCAnTU1NTScpKTtcbiAgfVxuXG4gIGdldCBhY3RpdmVZZWFyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0V2l0aExvY2FsZSh0aGlzLmFjdGl2ZU1vbnRoLCAneXl5eScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgbmF2aWdhYmxlIHllYXJzIGZvciB5ZWFyIG5hdmlnYXRvciBiYXNlZCBvbiB5ZWFyTmF2aWdhdG9yT3B0aW9ucy5cbiAgICovXG4gIGdldCBuYXZpZ2FibGVZZWFycygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgZGF0ZU9mRmlyc3ROYXZpZ2FibGVZZWFyID1cbiAgICAgIHRoaXMubWluRGF0ZSB8fCB0aGlzLmdldERhdGVGcm9tTmF2aWdhYmxlWWVhcih0aGlzLnllYXJOYXZpZ2F0b3JPcHRpb25zLmZyb20pO1xuXG4gICAgY29uc3QgZGF0ZU9mTGFzdE5hdmlnYWJsZVllYXIgPVxuICAgICAgdGhpcy5tYXhEYXRlIHx8IHRoaXMuZ2V0RGF0ZUZyb21OYXZpZ2FibGVZZWFyKHRoaXMueWVhck5hdmlnYXRvck9wdGlvbnMudG8pO1xuXG4gICAgcmV0dXJuIHRoaXMuZ2V0WWVhcnNCZXR3ZWVuRGF0ZXMoZGF0ZU9mRmlyc3ROYXZpZ2FibGVZZWFyLCBkYXRlT2ZMYXN0TmF2aWdhYmxlWWVhcik7XG4gIH1cblxuICBnZXQgbmF2aWdhdGVkWWVhcigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLm5hdmlnYWJsZVllYXJzLmluZGV4T2YodGhpcy5hY3RpdmVZZWFyKTtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuaGFzLXllYXItbmF2aWdhdG9yJylcbiAgZ2V0IF9oYXNZZWFyTmF2aWdhdG9yKCkge1xuICAgIHJldHVybiAhIXRoaXMueWVhck5hdmlnYXRvck9wdGlvbnM7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNhbGVuZGFySGVscGVyOiBDYWxlbmRhckhlbHBlciwgQEluamVjdChMT0NBTEVfSUQpIGxvY2FsZTogc3RyaW5nKSB7XG4gICAgdGhpcy5sb2NhbGUgPSB0aGlzLm1hcExvY2FsZShsb2NhbGUpO1xuICAgIHRoaXMudGltZVpvbmVOYW1lID0gSW50bC5EYXRlVGltZUZvcm1hdCgpLnJlc29sdmVkT3B0aW9ucygpLnRpbWVab25lO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRXaXRoTG9jYWxlKGRhdGU6IERhdGUsIGZvcm1hdFN0cmluZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZm9ybWF0KGRhdGUsIGZvcm1hdFN0cmluZywge1xuICAgICAgbG9jYWxlOiB0aGlzLmxvY2FsZSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbWFwTG9jYWxlKGxvY2FsZTogc3RyaW5nKTogTG9jYWxlIHtcbiAgICBpZiAobG9jYWxlID09PSAnZW4nKSB7XG4gICAgICBsb2NhbGUgPSAnZW5HQic7IC8vIGlmIGVuZ2xpc2ggbG9jYWxlIGlzIHByb3ZpZGVkIHdpdGhvdXQgcmVnaW9uLCB3ZSBkZWZhdWx0IHRvIEdCXG4gICAgfVxuICAgIGxvY2FsZSA9IGxvY2FsZS5yZXBsYWNlKCctJywgJycpO1xuICAgIGNvbnN0IGF2YWlsYWJsZUxvY2FsZXMgPSB7IC4uLnRoaXMuaW5jbHVkZWRMb2NhbGVzLCAuLi50aGlzLmxvY2FsZXMsIC4uLnRoaXMuY3VzdG9tTG9jYWxlcyB9O1xuICAgIHJldHVybiBhdmFpbGFibGVMb2NhbGVzW2xvY2FsZV0gfHwgdGhpcy5pbmNsdWRlZExvY2FsZXMuZW5HQjsgLy8gRGVmYXVsdCB0byBlbkdCIGlmIGluamVjdGVkIGxvY2FsZSBkb2VzbnQgZXhpc3RcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuX3dlZWtEYXlzID0gdGhpcy5nZXRXZWVrRGF5cygpO1xuICAgIHRoaXMuc2V0QWN0aXZlTW9udGgodGhpcy5zZWxlY3RlZERhdGUpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuY2FsZW5kYXJIZWxwZXIuaW5pdChcbiAgICAgIHRoaXMuY2FsZW5kYXJDb250YWluZXIsXG4gICAgICB0aGlzLmdldEhlbHBlck9wdGlvbnMoKSxcbiAgICAgIHRoaXMuX29uRGF0ZVNlbGVjdGVkLmJpbmQodGhpcyksXG4gICAgICB0aGlzLm9uQ2hhbmdlTW9udGguYmluZCh0aGlzKVxuICAgICk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmFjdGl2ZU1vbnRoKSByZXR1cm47XG4gICAgaWYgKFxuICAgICAgY2hhbmdlcy5kaXNhYmxlV2Vla2VuZHMgfHxcbiAgICAgIGNoYW5nZXMuZGlzYWJsZVBhc3REYXRlcyB8fFxuICAgICAgY2hhbmdlcy5kaXNhYmxlRnV0dXJlRGF0ZXMgfHxcbiAgICAgIGNoYW5nZXMuZGlzYWJsZWREYXRlcyB8fFxuICAgICAgY2hhbmdlcy5lbmFibGVkRGF0ZXMgfHxcbiAgICAgIGNoYW5nZXMubWluRGF0ZSB8fFxuICAgICAgY2hhbmdlcy5tYXhEYXRlIHx8XG4gICAgICBjaGFuZ2VzLnRvZGF5RGF0ZSB8fFxuICAgICAgY2hhbmdlcy50aW1lem9uZVxuICAgICkge1xuICAgICAgdGhpcy5yZWZyZXNoQWN0aXZlTW9udGgoKTtcbiAgICAgIHRoaXMuY2FsZW5kYXJIZWxwZXIudXBkYXRlKHRoaXMuZ2V0SGVscGVyT3B0aW9ucygpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldEFjdGl2ZU1vbnRoKGRhdGU6IERhdGUgPSBuZXcgRGF0ZSgpKSB7XG4gICAgaWYgKCF0aGlzLmFjdGl2ZU1vbnRoIHx8ICFpc1NhbWVNb250aCh0aGlzLmFjdGl2ZU1vbnRoLCBkYXRlKSkge1xuICAgICAgdGhpcy5hY3RpdmVNb250aCA9IHN0YXJ0T2ZNb250aChkYXRlKTtcbiAgICAgIHRoaXMucmVmcmVzaEFjdGl2ZU1vbnRoKCk7XG4gICAgICB0aGlzLmNhbGVuZGFySGVscGVyLnVwZGF0ZSh0aGlzLmdldEhlbHBlck9wdGlvbnMoKSk7XG4gICAgfVxuICB9XG5cbiAgLy8gRm9yIGxlbmllbmN5LCB0aGUgY29tcG9uZW50IHdpbGwgYWNjZXB0IGFueSBEYXRlIHRoYXQgcG9pbnRzIHRvIGVpdGhlciBVVEMgbWlkbmlnaHRcbiAgLy8gb3IgdG8gbG9jYWwgdGltZXpvbmUgbWlkbmlnaHQgYWx0aG91Z2ggd2Ugd2lsbCBpbnRlcm5hbGx5IG5vcm1hbGl6ZSB0aGUgcmVwcmVzZW50YXRpb25cbiAgLy8gb2YgYWxsIHJlY2VpdmVkIGRhdGVzIHRvIHBvaW50IHRvIGxvY2FsIHRpbWV6b25lIG1pZG5pZ2h0LlxuICAvLyBXZSBjdXJyZW50bHkgbG9nIG5vIHdhcm5pbmdzIGlmIHRoZSBkYXRlIGRvZXNuJ3QgbWF0Y2ggdGhlIHRpbWV6b25lIHNldHRpbmcgb3JcbiAgLy8gaWYgaXQgZG9lc24ndCBwb2ludCB0byBtaWRuaWdodC5cbiAgcHJpdmF0ZSBub3JtYWxpemVEYXRlKGRhdGVMb2NhbE9yVVRDOiBEYXRlKSB7XG4gICAgaWYgKCFkYXRlTG9jYWxPclVUQykgcmV0dXJuO1xuXG4gICAgaWYgKHN0YXJ0T2ZEYXkoZGF0ZUxvY2FsT3JVVEMpLmdldFRpbWUoKSA9PT0gZGF0ZUxvY2FsT3JVVEMuZ2V0VGltZSgpKSB7XG4gICAgICAvLyBkYXRlIGlzIGxvY2FsIHRpbWV6b25lIG1pZG5pZ2h0XG4gICAgICByZXR1cm4gZGF0ZUxvY2FsT3JVVEM7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHN0YXJ0T2ZEYXkodXRjVG9ab25lZFRpbWUoZGF0ZUxvY2FsT3JVVEMsIHRoaXMudGltZVpvbmVOYW1lKSkuZ2V0VGltZSgpID09PVxuICAgICAgdXRjVG9ab25lZFRpbWUoZGF0ZUxvY2FsT3JVVEMsIHRoaXMudGltZVpvbmVOYW1lKS5nZXRUaW1lKClcbiAgICApIHtcbiAgICAgIC8vIHRoZSBkYXRlIGlzIGEgVVRDIG1pZG5pZ2h0OyBjcmVhdGUgdGhlIGVxdWl2YWxlbnQgbG9jYWwgdGltZXpvbmUgbWlkbmlnaHQgZGF0ZVxuICAgICAgY29uc3Qgbm9ybWFsaXplZFVUQ2RhdGUgPSB1dGNUb1pvbmVkVGltZShkYXRlTG9jYWxPclVUQywgdGhpcy50aW1lWm9uZU5hbWUpO1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRVVENkYXRlO1xuICAgIH1cbiAgICAvLyBkb2VzIG5vdCBwb2ludCB0byBtaWRuaWdodCBzbyB3ZSBtYWtlIGl0XG4gICAgcmV0dXJuIHN0YXJ0T2ZEYXkoZGF0ZUxvY2FsT3JVVEMpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRXZWVrRGF5cygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICBjb25zdCB3ZWVrID0gZWFjaERheU9mSW50ZXJ2YWwoe1xuICAgICAgc3RhcnQ6IHN0YXJ0T2ZXZWVrKG5vdywgeyBsb2NhbGU6IHRoaXMubG9jYWxlIH0pLFxuICAgICAgZW5kOiBlbmRPZldlZWsobm93LCB7IGxvY2FsZTogdGhpcy5sb2NhbGUgfSksXG4gICAgfSk7XG5cbiAgICByZXR1cm4gd2Vlay5tYXAoKGRhdGUpID0+IHRoaXMuZ2V0Rmlyc3RMZXR0ZXJPZldlZWtEYXlDYXBpdGFsaXplZChkYXRlKSk7XG4gIH1cblxuICBwcml2YXRlIGdldEZpcnN0TGV0dGVyT2ZXZWVrRGF5Q2FwaXRhbGl6ZWQoZGF0ZTogRGF0ZSkge1xuICAgIHJldHVybiB0aGlzLmZvcm1hdFdpdGhMb2NhbGUoZGF0ZSwgJ0VFRUVFJyk7XG4gIH1cblxuICBwcml2YXRlIGhhc0RhdGVDaGFuZ2VkKG5ld0RhdGU6IERhdGUsIHByZXZpb3VzRGF0ZTogRGF0ZSk6IGJvb2xlYW4ge1xuICAgIGlmICghbmV3RGF0ZSAmJiAhcHJldmlvdXNEYXRlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChuZXdEYXRlIGluc3RhbmNlb2YgRGF0ZSAmJiAhcHJldmlvdXNEYXRlKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuICFpc1NhbWVEYXkobmV3RGF0ZSwgcHJldmlvdXNEYXRlKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNEaXNhYmxlZERhdGUoZGF0ZTogRGF0ZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRpc2FibGVkRGF0ZXMuc29tZSgoZGlzYWJsZWREYXRlKSA9PiBpc1NhbWVEYXkoZGlzYWJsZWREYXRlLCBkYXRlKSk7XG4gIH1cblxuICBwcml2YXRlIGlzRW5hYmxlZERhdGUoZGF0ZTogRGF0ZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLl9lbmFibGVkRGF0ZXMubGVuZ3RoID09PSAwIHx8XG4gICAgICB0aGlzLmVuYWJsZWREYXRlcy5zb21lKChlbmFibGVkRGF0ZSkgPT4gaXNTYW1lRGF5KGVuYWJsZWREYXRlLCBkYXRlKSlcbiAgICApO1xuICB9XG5cbiAgcmVmcmVzaEFjdGl2ZU1vbnRoKCkge1xuICAgIGlmICghdGhpcy5hY3RpdmVNb250aCkgcmV0dXJuO1xuXG4gICAgY29uc3QgbW9udGhTdGFydCA9IHN0YXJ0T2ZNb250aCh0aGlzLmFjdGl2ZU1vbnRoKTtcbiAgICBjb25zdCBzdGFydE9mRmlyc3RXZWVrID0gc3RhcnRPZldlZWsobW9udGhTdGFydCwgeyBsb2NhbGU6IHRoaXMubG9jYWxlIH0pO1xuICAgIGNvbnN0IHRvZGF5ID0gdGhpcy50b2RheURhdGUgPyBzdGFydE9mRGF5KHRoaXMudG9kYXlEYXRlKSA6IHN0YXJ0T2ZEYXkobmV3IERhdGUoKSk7XG5cbiAgICBjb25zdCB0b3RhbE51bWJlck9mRGF5cyA9IDQyOyAvLyBBbHdheXMgc2hvdyA0MiBkYXlzICg2IHdlZWtzKSBpbiBjYWxlbmRhclxuICAgIGNvbnN0IGRheXNBcnJheSA9IEFycmF5LmZyb20oQXJyYXkodG90YWxOdW1iZXJPZkRheXMpLmtleXMoKSk7XG5cbiAgICBjb25zdCBkYXlzOiBDYWxlbmRhckNlbGxbXSA9IGRheXNBcnJheS5tYXAoKG51bWJlcikgPT4ge1xuICAgICAgY29uc3QgY2VsbERhdGUgPSBhZGQoc3RhcnRPZkZpcnN0V2VlaywgeyBbVGltZVVuaXQuZGF5c106IG51bWJlciB9KTtcbiAgICAgIGNvbnN0IGRheSA9IHRoaXMuZ2V0Q2FsZW5kYXJEYXkoY2VsbERhdGUsIHRvZGF5LCBtb250aFN0YXJ0KTtcblxuICAgICAgY29uc3QgaXNTZWxlY3RhYmxlID0gdGhpcy5pc1NlbGVjdGFibGUoZGF5LCBjZWxsRGF0ZSk7XG4gICAgICBjb25zdCBpc1NlbGVjdGVkID0gaXNTYW1lRGF5KHRoaXMuc2VsZWN0ZWREYXRlLCBjZWxsRGF0ZSk7XG4gICAgICBjb25zdCBjZWxsOiBDYWxlbmRhckNlbGwgPSB7XG4gICAgICAgIGRhdGU6IGNlbGxEYXRlLmdldERhdGUoKSxcbiAgICAgICAgbW9udGhJbmRleDogY2VsbERhdGUuZ2V0TW9udGgoKSxcbiAgICAgICAgeWVhcjogY2VsbERhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgaXNDdXJyZW50TW9udGg6IGRheS5pc0N1cnJlbnRNb250aCxcbiAgICAgICAgaXNTZWxlY3RhYmxlLFxuICAgICAgICBpc1NlbGVjdGVkLFxuICAgICAgICBjc3NDbGFzc2VzOiB0aGlzLmdldENzc0NsYXNzZXMoZGF5LCBpc1NlbGVjdGFibGUsIGlzU2VsZWN0ZWQpLFxuICAgICAgfTtcbiAgICAgIGlmIChpc1NlbGVjdGVkKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXkgPSBjZWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNlbGw7XG4gICAgfSk7XG4gICAgdGhpcy5fbW9udGggPSB0aGlzLmNodW5rKGRheXMsIDcpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDYWxlbmRhckRheShkYXRlOiBEYXRlLCB0b2RheTogRGF0ZSwgbW9udGhTdGFydDogRGF0ZSk6IENhbGVuZGFyRGF5IHtcbiAgICByZXR1cm4ge1xuICAgICAgaXNUb2RheTogaXNTYW1lRGF5KHRvZGF5LCBkYXRlKSxcbiAgICAgIGlzUGFzdDogaXNCZWZvcmUoZGF0ZSwgdG9kYXkpLFxuICAgICAgaXNGdXR1cmU6IGlzQWZ0ZXIoZGF0ZSwgdG9kYXkpLFxuICAgICAgaXNXZWVrZW5kOiBpc1dlZWtlbmQoZGF0ZSksXG4gICAgICBpc0N1cnJlbnRNb250aDogaXNTYW1lTW9udGgoZGF0ZSwgbW9udGhTdGFydCksXG4gICAgICBpc0Rpc2FibGVkOiB0aGlzLmlzRGlzYWJsZWREYXRlKGRhdGUpIHx8ICF0aGlzLmlzRW5hYmxlZERhdGUoZGF0ZSksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgaXNTZWxlY3RhYmxlKGRheTogQ2FsZW5kYXJEYXksIGRhdGU6IERhdGUpIHtcbiAgICByZXR1cm4gKFxuICAgICAgKHRoaXMuYWx3YXlzRW5hYmxlVG9kYXkgJiYgZGF5LmlzVG9kYXkpIHx8XG4gICAgICAoIWRheS5pc0Rpc2FibGVkICYmXG4gICAgICAgICEodGhpcy5kaXNhYmxlV2Vla2VuZHMgJiYgZGF5LmlzV2Vla2VuZCkgJiZcbiAgICAgICAgISh0aGlzLmRpc2FibGVQYXN0RGF0ZXMgJiYgZGF5LmlzUGFzdCkgJiZcbiAgICAgICAgISh0aGlzLmRpc2FibGVGdXR1cmVEYXRlcyAmJiBkYXkuaXNGdXR1cmUpICYmXG4gICAgICAgICEodGhpcy5taW5EYXRlICYmIGlzQmVmb3JlKGRhdGUsIHRoaXMubWluRGF0ZSkpICYmXG4gICAgICAgICEodGhpcy5tYXhEYXRlICYmIGlzQWZ0ZXIoZGF0ZSwgdGhpcy5tYXhEYXRlKSkpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q3NzQ2xhc3NlcyhkYXk6IENhbGVuZGFyRGF5LCBpc1NlbGVjdGFibGU6IGJvb2xlYW4sIGlzU2VsZWN0ZWQ6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBjc3NDbGFzc2VzID0ge1xuICAgICAgJ2N1cnJlbnQtbW9udGgnOiBkYXkuaXNDdXJyZW50TW9udGgsXG4gICAgICB3ZWVrZW5kOiBkYXkuaXNXZWVrZW5kLFxuICAgICAgdG9kYXk6IGRheS5pc1RvZGF5LFxuICAgICAgc2VsZWN0YWJsZTogaXNTZWxlY3RhYmxlLFxuICAgICAgc2VsZWN0ZWQ6IGlzU2VsZWN0ZWQsXG4gICAgICBwYXN0OiBkYXkuaXNQYXN0LFxuICAgICAgZGlzYWJsZWQ6IGRheS5pc0Rpc2FibGVkLFxuICAgIH07XG4gICAgbGV0IGNzc0NsYXNzU3RyaW5nID0gJ2RheSc7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gY3NzQ2xhc3Nlcykge1xuICAgICAgaWYgKGNzc0NsYXNzZXNba2V5XSkge1xuICAgICAgICBjc3NDbGFzc1N0cmluZyArPSAnICcgKyBrZXk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjc3NDbGFzc1N0cmluZztcbiAgfVxuXG4gIHByaXZhdGUgY2h1bmsoYXJyYXk6IGFueVtdLCBzaXplOiBudW1iZXIpIHtcbiAgICBjb25zdCByZXN1bHRzID0gW107XG4gICAgd2hpbGUgKGFycmF5Lmxlbmd0aCkge1xuICAgICAgcmVzdWx0cy5wdXNoKGFycmF5LnNwbGljZSgwLCBzaXplKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgcHJpdmF0ZSBvblNlbGVjdGVkRGF0ZUNoYW5nZShuZXdEYXRlOiBEYXRlKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWREYXkpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXkuaXNTZWxlY3RlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld0RheSA9IHRoaXMuZ2V0Q2VsbChuZXdEYXRlKTtcbiAgICBpZiAobmV3RGF5KSB7XG4gICAgICBuZXdEYXkuaXNTZWxlY3RlZCA9IHRydWU7XG4gICAgICB0aGlzLnNlbGVjdGVkRGF5ID0gbmV3RGF5O1xuICAgIH1cblxuICAgIGlmIChuZXdEYXRlKSB7XG4gICAgICB0aGlzLmNhbGVuZGFySGVscGVyLnNldFNlbGVjdGVkRGF5KG5ld0RhdGUuZ2V0RGF0ZSgpKTtcbiAgICB9XG4gIH1cblxuICBfb25EYXRlU2VsZWN0ZWQobmV3RGF5OiBDYWxlbmRhckNlbGwpIHtcbiAgICBpZiAoIW5ld0RheS5pc1NlbGVjdGFibGUpIHJldHVybjtcblxuICAgIGxldCBuZXdEYXRlID0gbmV3IERhdGUobmV3RGF5LnllYXIsIG5ld0RheS5tb250aEluZGV4LCBuZXdEYXkuZGF0ZSk7XG5cbiAgICBpZiAodGhpcy50aW1lem9uZSA9PT0gJ1VUQycpIHtcbiAgICAgIG5ld0RhdGUgPSB6b25lZFRpbWVUb1V0Yyh0aGlzLnN1YnRyYWN0VGltZXpvbmVPZmZzZXQobmV3RGF0ZSksIHRoaXMudGltZVpvbmVOYW1lKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRlVG9FbWl0ID0gbmV3RGF0ZTtcblxuICAgIGlmICh0aGlzLmhhc0RhdGVDaGFuZ2VkKG5ld0RhdGUsIHRoaXMuX3NlbGVjdGVkRGF0ZSkpIHtcbiAgICAgIHRoaXMuc2V0QWN0aXZlTW9udGgobmV3RGF0ZSk7XG4gICAgICB0aGlzLm9uU2VsZWN0ZWREYXRlQ2hhbmdlKG5ld0RhdGUpO1xuICAgICAgdGhpcy5fc2VsZWN0ZWREYXRlID0gbmV3RGF0ZTtcbiAgICAgIHRoaXMuZGF0ZUNoYW5nZS5lbWl0KGRhdGVUb0VtaXQpO1xuICAgIH1cbiAgICB0aGlzLmRhdGVTZWxlY3QuZW1pdChkYXRlVG9FbWl0KTtcbiAgfVxuXG4gIHByaXZhdGUgb25DaGFuZ2VNb250aChkaXJlY3Rpb246IG51bWJlcikge1xuICAgIHRoaXMuX2NoYW5nZU1vbnRoKGRpcmVjdGlvbik7XG4gICAgdGhpcy5jYWxlbmRhckhlbHBlci51cGRhdGUodGhpcy5nZXRIZWxwZXJPcHRpb25zKCkpO1xuICB9XG5cbiAgX2NoYW5nZU1vbnRoKGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLmNoYW5nZUFjdGl2ZVZpZXcoaW5kZXgsIFRpbWVVbml0Lm1vbnRocyk7XG4gICAgaW5kZXggPiAwXG4gICAgICA/IHRoaXMubmV4dE1vbnRoQ2xpY2tlZC5lbWl0KHRoaXMuYWN0aXZlTW9udGgpXG4gICAgICA6IHRoaXMucHJldmlvdXNNb250aENsaWNrZWQuZW1pdCh0aGlzLmFjdGl2ZU1vbnRoKTtcbiAgfVxuXG4gIF9jaGFuZ2VZZWFyKHllYXI6IHN0cmluZykge1xuICAgIGNvbnN0IHllYXJOdW1lcmljID0gTnVtYmVyKHllYXIpO1xuICAgIHRoaXMuY2hhbmdlQWN0aXZlVmlldyh5ZWFyTnVtZXJpYyAtIGdldFllYXIodGhpcy5hY3RpdmVNb250aCksIFRpbWVVbml0LnllYXJzKTtcbiAgICB0aGlzLnllYXJTZWxlY3QuZW1pdCh5ZWFyTnVtZXJpYyk7XG4gIH1cblxuICBwcml2YXRlIGNoYW5nZUFjdGl2ZVZpZXcoaW5kZXg6IG51bWJlciwgdW5pdDogVGltZVVuaXQpIHtcbiAgICBpZiAoaW5kZXggPT09IDApIHJldHVybjtcbiAgICB0aGlzLmFjdGl2ZU1vbnRoID0gYWRkKHRoaXMuYWN0aXZlTW9udGgsIHsgW3VuaXRdOiBpbmRleCB9KTtcblxuICAgIHRoaXMucmVmcmVzaEFjdGl2ZU1vbnRoKCk7XG4gIH1cblxuICBnZXQgX2Nhbk5hdmlnYXRlQmFjaygpOiBib29sZWFuIHtcbiAgICBjb25zdCByZWFjaGVkUGFzdERhdGVzTGltaXQgPVxuICAgICAgdGhpcy5kaXNhYmxlUGFzdERhdGVzICYmIGlzU2FtZU1vbnRoKHRoaXMuYWN0aXZlTW9udGgsIHRoaXMudG9kYXlEYXRlKTtcblxuICAgIGNvbnN0IHJlYWNoZWRPckV4Y2VlZGVkTWluRGF0ZSA9XG4gICAgICB0aGlzLm1pbkRhdGUgJiZcbiAgICAgIChpc1NhbWVNb250aCh0aGlzLmFjdGl2ZU1vbnRoLCB0aGlzLm1pbkRhdGUpIHx8IGlzQmVmb3JlKHRoaXMuYWN0aXZlTW9udGgsIHRoaXMubWluRGF0ZSkpO1xuXG4gICAgcmV0dXJuICFyZWFjaGVkUGFzdERhdGVzTGltaXQgJiYgIXJlYWNoZWRPckV4Y2VlZGVkTWluRGF0ZTtcbiAgfVxuXG4gIGdldCBfY2FuTmF2aWdhdGVGb3J3YXJkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJlYWNoZWRGdXR1cmVEYXRlc0xpbWl0ID1cbiAgICAgIHRoaXMuZGlzYWJsZUZ1dHVyZURhdGVzICYmIGlzU2FtZU1vbnRoKHRoaXMuYWN0aXZlTW9udGgsIHRoaXMudG9kYXlEYXRlKTtcblxuICAgIGNvbnN0IHJlYWNoZWRPckV4Y2VlZGVkTWF4RGF0ZSA9XG4gICAgICB0aGlzLm1heERhdGUgJiZcbiAgICAgIChpc1NhbWVNb250aCh0aGlzLmFjdGl2ZU1vbnRoLCB0aGlzLm1heERhdGUpIHx8IGlzQWZ0ZXIodGhpcy5hY3RpdmVNb250aCwgdGhpcy5tYXhEYXRlKSk7XG5cbiAgICByZXR1cm4gIXJlYWNoZWRGdXR1cmVEYXRlc0xpbWl0ICYmICFyZWFjaGVkT3JFeGNlZWRlZE1heERhdGU7XG4gIH1cblxuICBwcml2YXRlIGdldENlbGwoZGF0ZTogRGF0ZSkge1xuICAgIGxldCBmb3VuZERheTogQ2FsZW5kYXJDZWxsID0gbnVsbDtcbiAgICBpZiAoZGF0ZSkge1xuICAgICAgZm9yIChjb25zdCB3ZWVrIG9mIHRoaXMuX21vbnRoKSB7XG4gICAgICAgIGZvdW5kRGF5ID0gd2Vlay5maW5kKChkYXkpID0+IHtcbiAgICAgICAgICByZXR1cm4gZGF5LmlzQ3VycmVudE1vbnRoICYmIGRheS5kYXRlID09PSBkYXRlLmdldERhdGUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChmb3VuZERheSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3VuZERheTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0SGVscGVyT3B0aW9ucygpOiBDYWxlbmRhck9wdGlvbnMge1xuICAgIHJldHVybiB7XG4gICAgICBjYW5OYXZpZ2F0ZUJhY2s6IHRoaXMuX2Nhbk5hdmlnYXRlQmFjayxcbiAgICAgIGNhbk5hdmlnYXRlRm9yd2FyZDogdGhpcy5fY2FuTmF2aWdhdGVGb3J3YXJkLFxuICAgICAgeWVhcjogdGhpcy5hY3RpdmVZZWFyLFxuICAgICAgbW9udGhOYW1lOiB0aGlzLmFjdGl2ZU1vbnRoTmFtZSxcbiAgICAgIHdlZWtEYXlzOiB0aGlzLl93ZWVrRGF5cyxcbiAgICAgIG1vbnRoOiB0aGlzLl9tb250aCxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdWJ0cmFjdFRpbWV6b25lT2Zmc2V0KGRhdGU6IERhdGUpOiBEYXRlIHtcbiAgICBjb25zdCB0aW1lem9uZU9mZnNldEluTXMgPSBkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCkgKiA2MCAqIDEwMDA7XG4gICAgcmV0dXJuIG5ldyBEYXRlKGRhdGUuZ2V0VGltZSgpIC0gdGltZXpvbmVPZmZzZXRJbk1zKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGF0ZUZyb21OYXZpZ2FibGVZZWFyKG5hdmlnYWJsZVllYXI6IG51bWJlciB8IERhdGUpOiBEYXRlIHtcbiAgICBpZiAobmF2aWdhYmxlWWVhciBpbnN0YW5jZW9mIERhdGUpIHJldHVybiBuYXZpZ2FibGVZZWFyO1xuICAgIGNvbnN0IHRvZGF5ID0gdGhpcy50b2RheURhdGUgfHwgbmV3IERhdGUoKTtcbiAgICByZXR1cm4gbmV3IERhdGUodG9kYXkuZ2V0RnVsbFllYXIoKSArIG5hdmlnYWJsZVllYXIsIDAsIDEpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRZZWFyc0JldHdlZW5EYXRlcyhzdGFydERhdGU6IERhdGUsIGVuZERhdGU6IERhdGUpOiBzdHJpbmdbXSB7XG4gICAgLy8gRW5zdXJlIHllYXJzIGFyZSBvcmRlcmVkIGNvcnJlY3RseSBpZiBwYXJhbWV0ZXJzIGFyZSBzd2l0Y2hlZDpcbiAgICBjb25zdCBbc3RhcnRZZWFyLCBlbmRZZWFyXSA9IFtzdGFydERhdGUuZ2V0RnVsbFllYXIoKSwgZW5kRGF0ZS5nZXRGdWxsWWVhcigpXS5zb3J0KCk7XG4gICAgY29uc3QgbnVtYmVyT2ZZZWFycyA9IGVuZFllYXIgLSBzdGFydFllYXI7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IG51bWJlck9mWWVhcnMgKyAxIH0sIChfLCBpKSA9PiAoc3RhcnRZZWFyICsgaSkudG9TdHJpbmcoKSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJoZWFkZXJcIj5cbiAgPGRpdiBjbGFzcz1cIm1vbnRoLW5hdmlnYXRvclwiPlxuICAgIDxidXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgW2Rpc2FibGVkXT1cIiFfY2FuTmF2aWdhdGVCYWNrXCJcbiAgICAgIChjbGljayk9XCJfY2hhbmdlTW9udGgoLTEpXCJcbiAgICAgIGtpcmJ5LWJ1dHRvblxuICAgICAgW25vRGVjb3JhdGlvbl09XCJ0cnVlXCJcbiAgICAgIGNsYXNzPVwibm8tbWFyZ2luXCJcbiAgICA+XG4gICAgICA8a2lyYnktaWNvbiBuYW1lPVwiYXJyb3ctYmFja1wiPjwva2lyYnktaWNvbj5cbiAgICA8L2J1dHRvbj5cblxuICAgIDxkaXYgY2xhc3M9XCJtb250aC1hbmQteWVhclwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJtb250aFwiPnt7IGFjdGl2ZU1vbnRoTmFtZSB9fTwvc3Bhbj5cbiAgICAgIDxzcGFuICpuZ0lmPVwiIV9oYXNZZWFyTmF2aWdhdG9yXCIgY2xhc3M9XCJ5ZWFyXCI+e3sgYWN0aXZlWWVhciB9fTwvc3Bhbj5cbiAgICA8L2Rpdj5cblxuICAgIDxidXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgW2Rpc2FibGVkXT1cIiFfY2FuTmF2aWdhdGVGb3J3YXJkXCJcbiAgICAgIChjbGljayk9XCJfY2hhbmdlTW9udGgoMSlcIlxuICAgICAga2lyYnktYnV0dG9uXG4gICAgICBbbm9EZWNvcmF0aW9uXT1cInRydWVcIlxuICAgICAgY2xhc3M9XCJuby1tYXJnaW5cIlxuICAgID5cbiAgICAgIDxraXJieS1pY29uIG5hbWU9XCJhcnJvdy1tb3JlXCI+PC9raXJieS1pY29uPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbiAgPGtpcmJ5LWRyb3Bkb3duXG4gICAgKm5nSWY9XCJfaGFzWWVhck5hdmlnYXRvclwiXG4gICAgW3VzZVBvcG92ZXJdPVwidXNlUG9wb3ZlclwiXG4gICAgW3NlbGVjdGVkSW5kZXhdPVwibmF2aWdhdGVkWWVhclwiXG4gICAgW2l0ZW1zXT1cIm5hdmlnYWJsZVllYXJzXCJcbiAgICBwb3BvdXQ9XCJsZWZ0XCJcbiAgICAoY2hhbmdlKT1cIl9jaGFuZ2VZZWFyKCRldmVudClcIlxuICA+PC9raXJieS1kcm9wZG93bj5cbjwvZGl2PlxuXG48dGFibGU+XG4gIDx0aGVhZD5cbiAgICA8dHI+XG4gICAgICA8dGggKm5nRm9yPVwibGV0IHdlZWtEYXkgb2YgX3dlZWtEYXlzXCI+e3sgd2Vla0RheSB9fTwvdGg+XG4gICAgPC90cj5cbiAgPC90aGVhZD5cblxuICA8dGJvZHk+XG4gICAgPHRyICpuZ0Zvcj1cImxldCB3ZWVrIG9mIF9tb250aFwiPlxuICAgICAgPHRkICpuZ0Zvcj1cImxldCBkYXkgb2Ygd2Vla1wiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgKGNsaWNrKT1cIl9vbkRhdGVTZWxlY3RlZChkYXkpXCJcbiAgICAgICAgICBjbGFzcz1cInt7IGRheS5jc3NDbGFzc2VzIH19IGNvbnRhaW4tc3RhdGUtbGF5ZXJcIlxuICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJkYXkuaXNTZWxlY3RlZFwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXRlLWxheWVyXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29udGVudC1sYXllclwiPnt7IGRheS5kYXRlIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvdGQ+XG4gICAgPC90cj5cbiAgPC90Ym9keT5cbjwvdGFibGU+XG5cbjwhLS0gPGlmcmFtZSBzcmM9XCJraXJieS9jb21wb25lbnRzL2NhbGVuZGFyL2NhbGVuZGFyLndlYnZpZXcuaHRtbFwiICNjYWxlbmRhckNvbnRhaW5lciBzdHlsZT1cIndpZHRoOiAzMjBweDsgaGVpZ2h0OiAzMDRweDsgYm9yZGVyOiAwXCI+IC0tPlxuIl19
514
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vY2FsZW5kYXIvc3JjL2NhbGVuZGFyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uL2NhbGVuZGFyL3NyYy9jYWxlbmRhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osV0FBVyxFQUNYLE1BQU0sRUFDTixLQUFLLEVBQ0wsU0FBUyxFQUdULE1BQU0sR0FFUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsR0FBRyxFQUNILGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsTUFBTSxFQUNOLE9BQU8sRUFDUCxPQUFPLEVBQ1AsUUFBUSxFQUNSLFNBQVMsRUFDVCxXQUFXLEVBQ1gsU0FBUyxFQUNULGFBQWEsRUFFYixVQUFVLEVBQ1YsWUFBWSxFQUNaLFdBQVcsR0FDWixNQUFNLFVBQVUsQ0FBQztBQUNsQixPQUFPLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM3RCxPQUFPLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVqRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDbkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUU1RCxPQUFPLEVBQUUsa0JBQWtCLEVB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QUFXO3VCQUFDLDBCQUEwQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0QmluZGluZyxcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgTE9DQUxFX0lELFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIGFkZCxcbiAgZWFjaERheU9mSW50ZXJ2YWwsXG4gIGVuZE9mV2VlayxcbiAgZm9ybWF0LFxuICBnZXRZZWFyLFxuICBpc0FmdGVyLFxuICBpc0JlZm9yZSxcbiAgaXNTYW1lRGF5LFxuICBpc1NhbWVNb250aCxcbiAgaXNXZWVrZW5kLFxuICBsYXN0RGF5T2ZXZWVrLFxuICBMb2NhbGUgYXMgTG9jYWxlRGF0ZUZucyxcbiAgc3RhcnRPZkRheSxcbiAgc3RhcnRPZk1vbnRoLFxuICBzdGFydE9mV2Vlayxcbn0gZnJvbSAnZGF0ZS1mbnMnO1xuaW1wb3J0IHsgdXRjVG9ab25lZFRpbWUsIHpvbmVkVGltZVRvVXRjIH0gZnJvbSAnZGF0ZS1mbnMtdHonO1xuaW1wb3J0IHsgZGEsIGVuR0IsIGVuVVMgfSBmcm9tICdkYXRlLWZucy9sb2NhbGUnO1xuXG5pbXBvcnQgeyBjYXBpdGFsaXplRmlyc3RMZXR0ZXIgfSBmcm9tICdAa2lyYnlkZXNpZ24vY29yZSc7XG5pbXBvcnQgeyBCdXR0b25Db21wb25lbnQgfSBmcm9tICdAa2lyYnlkZXNpZ24vZGVzaWduc3lzdGVtL2J1dHRvbic7XG5pbXBvcnQgeyBEcm9wZG93bk1vZHVsZSB9IGZyb20gJ0BraXJieWRlc2lnbi9kZXNpZ25zeXN0ZW0vZHJvcGRvd24nO1xuaW1wb3J0IHsgVW5pcXVlSWRHZW5lcmF0b3IgfSBmcm9tICdAa2lyYnlkZXNpZ24vZGVzaWduc3lzdGVtL2hlbHBlcnMnO1xuaW1wb3J0IHsgSWNvbk1vZHVsZSB9IGZyb20gJ0BraXJieWRlc2lnbi9kZXNpZ25zeXN0ZW0vaWNvbic7XG5cbmltcG9ydCB7IFRyYW5zbGF0aW9uU2VydmljZSB9IGZyb20gJ0BraXJieWRlc2lnbi9kZXNpZ25zeXN0ZW0vc2hhcmVkJztcbmltcG9ydCB7IENhbGVuZGFyRGF5LCBDYWxlbmRhckRheU1ldGFkYXRhIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2NhbGVuZGFyLWRheSc7XG5pbXBvcnQgeyBDYWxlbmRhclllYXJOYXZpZ2F0b3JDb25maWcgfSBmcm9tICcuL2ludGVyZmFjZXMvY2FsZW5kYXIteWVhci1uYXZpZ2F0b3ItY29uZmlnJztcblxuZXhwb3J0IHR5cGUgTG9jYWxlID0gTG9jYWxlRGF0ZUZucztcblxuaW50ZXJmYWNlIFdlZWtEYXkge1xuICBmaXJzdExldHRlckNhcGl0YWxpemVkOiBzdHJpbmc7XG4gIGZ1bGxOYW1lOiBzdHJpbmc7XG59XG5cbmVudW0gVGltZVVuaXQge1xuICB5ZWFycyA9ICd5ZWFycycsXG4gIG1vbnRocyA9ICdtb250aHMnLFxuICB3ZWVrcyA9ICd3ZWVrcycsXG4gIGRheXMgPSAnZGF5cycsXG4gIGhvdXJzID0gJ2hvdXJzJyxcbiAgbWludXRlcyA9ICdtaW51dGVzJyxcbiAgc2Vjb25kcyA9ICdzZWNvbmRzJyxcbiAgbWlsbGlzZWNvbmRzID0gJ21pbGxpc2Vjb25kcycsXG59XG5cbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbRHJvcGRvd25Nb2R1bGUsIEJ1dHRvbkNvbXBvbmVudCwgSWNvbk1vZHVsZSwgQ29tbW9uTW9kdWxlXSxcbiAgc2VsZWN0b3I6ICdraXJieS1jYWxlbmRhcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9jYWxlbmRhci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NhbGVuZGFyLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBDYWxlbmRhckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgQE91dHB1dCgpIGRhdGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGU+KCk7XG4gIEBPdXRwdXQoKSBkYXRlU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlPigpO1xuICBAT3V0cHV0KCkgeWVhclNlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICBAT3V0cHV0KCkgcHJldmlvdXNNb250aENsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGU+KCk7XG4gIEBPdXRwdXQoKSBuZXh0TW9udGhDbGlja2VkID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlPigpO1xuICBASW5wdXQoKSB0aW1lem9uZTogJ2xvY2FsJyB8ICdVVEMnID0gJ2xvY2FsJztcbiAgQElucHV0KCkgZGlzYWJsZVdlZWtlbmRzID0gZmFsc2U7XG4gIEBJbnB1dCgpIGRpc2FibGVQYXN0RGF0ZXMgPSBmYWxzZTtcbiAgQElucHV0KCkgZGlzYWJsZUZ1dHVyZURhdGVzID0gZmFsc2U7XG4gIEBJbnB1dCgpIGFsd2F5c0VuYWJsZVRvZGF5ID0gZmFsc2U7XG5cbiAgQElucHV0KCkgc2V0IGxvY2FsZXMobG9jYWxlczogeyBba2V5OiBzdHJpbmddOiBMb2NhbGUgfSkge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGBTdXBwbHlpbmcgYWRkaXRpb25hbCBsb2NhbGVzIHRvIHRoZSBLaXJieSBDYWxlbmRhciBDb21wb25lbnQgdmlhIGFuIGlucHV0IHByb3BlcnR5IGlzIGRlcHJlY2F0ZWQgYW5kIHNob3VsZCBub3QgYmUgdXNlZC4gXG4gICAgICAgIEEgZnV0dXJlIHVwZGF0ZSB3aWxsIGFsbG93IGluamVjdGluZyBhZGRpdGlvbmFsIGxvY2FsZXMgdmlhIGEgcHJvdmlkZXIgaW5zdGVhZC5gXG4gICAgKTtcbiAgfVxuICBASW5wdXQoKSBjdXN0b21Mb2NhbGVzOiB7IFtrZXk6IHN0cmluZ106IExvY2FsZSB9ID0ge307XG4gIC8qIFxuICAgIEV4cGVyaW1lbnRhbDogSW5wdXQgcHJvcGVydHkgbm90IGRvY3VtZW50ZWQgb24gcHVycG9zZS4gXG4gICAgRm9yIGNvbnRleHQgc2VlOiBodHRwczovL2dpdGh1Yi5jb20va2lyYnlkZXNpZ24vZGVzaWduc3lzdGVtL2lzc3Vlcy8yMDg3XG4gICovXG4gIEBJbnB1dCgpIHVzZVBvcG92ZXIgPSBmYWxzZTtcbiAgLyoqXG4gICAqIENvbmZpZ3VyYXRpb24gZm9yIHRoZSB5ZWFyIG5hdmlnYXRvci5cbiAgICpcbiAgICogSW50ZXJuYWxseSwgY2FsZW5kYXIgY29tcG9uZW50OlxuICAgKiAtIGJhc2VzIHllYXJOYXZpZ2F0b3JPcHRpb25zLmZyb20gYW5kIHllYXJOYXZpZ2F0b3JPcHRpb25zLnRvIG9uIHRvZGF5RGF0ZSBpZiBhIG51bWJlciBpcyBwcm92aWRlZFxuICAgKiAtIHByaW9yaXRpemVzIG1pbkRhdGUgYW5kIG1heERhdGUgb3ZlciB5ZWFyTmF2aWdhdG9yT3B0aW9ucy5mcm9tIGFuZCB5ZWFyTmF2aWdhdG9yT3B0aW9ucy50b1xuICAgKi9cbiAgQElucHV0KCkgeWVhck5hdmlnYXRvck9wdGlvbnM6IENhbGVuZGFyWWVhck5hdmlnYXRvckNvbmZpZztcblxuICBfdGFibGVNb250aElkID0gVW5pcXVlSWRHZW5lcmF0b3Iuc2NvcGVkVG8oJ2tpcmJ5LWNhbGVuZGFyLW1vbnRoJykubmV4dCgpO1xuICBfbW9udGg6IENhbGVuZGFyRGF5W11bXTtcbiAgX3dlZWtEYXlzOiBXZWVrRGF5W107XG4gIHByaXZhdGUgc2VsZWN0ZWREYXk6IENhbGVuZGFyRGF5O1xuICBwcml2YXRlIGZvY3Vzc2VkRGF5OiBDYWxlbmRhckRheTtcbiAgLy8gTk9URTogSW50ZXJuYWxseSwgYWxsIERhdGVzXG4gIC8vIGFyZSBub3JtYWxpemVkIHRvIHBvaW50IHRvIGxvY2FsIHRpbWV6b25lIG1pZG5pZ2h0LCByZWdhcmRsZXNzIG9mIHRoZSB0aW1lem9uZVxuICAvLyBzZXR0aW5nLlxuICBwcml2YXRlIGFjdGl2ZU1vbnRoOiBEYXRlO1xuICBwcml2YXRlIF9zZWxlY3RlZERhdGU6IERhdGU7XG4gIHByaXZhdGUgX2Rpc2FibGVkRGF0ZXM6IERhdGVbXSA9IFtdO1xuICBwcml2YXRlIF9lbmFibGVkRGF0ZXM6IERhdGVbXSA9IFtdO1xuICBwcml2YXRlIF90b2RheURhdGU6IERhdGU7XG4gIHByaXZhdGUgX21pbkRhdGU6IERhdGU7XG4gIHByaXZhdGUgX21heERhdGU6IERhdGU7XG4gIHByaXZhdGUgZm9jdXNzZWREYXRlOiBEYXRlO1xuICBwcml2YXRlIGxvY2FsZTogTG9jYWxlO1xuICBwcml2YXRlIHRpbWVab25lTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIGluY2x1ZGVkTG9jYWxlcyA9IHsgZGEsIGVuR0IsIGVuVVMgfTtcblxuICBnZXQgc2VsZWN0ZWREYXRlKCk6IERhdGUge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZERhdGU7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgc2VsZWN0ZWREYXRlKHZhbHVlTG9jYWxPclVUQzogRGF0ZSB8IG51bGwpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMubm9ybWFsaXplRGF0ZSh2YWx1ZUxvY2FsT3JVVEMpO1xuXG4gICAgaWYgKHZhbHVlTG9jYWxPclVUQykge1xuICAgICAgdGhpcy5zZXRBY3RpdmVNb250aCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGFzRGF0ZUNoYW5nZWQodmFsdWUsIHRoaXMuX3NlbGVjdGVkRGF0ZSkpIHtcbiAgICAgIHRoaXMub25TZWxlY3RlZERhdGVDaGFuZ2UodmFsdWUpO1xuICAgICAgdGhpcy5mb2N1c0RhdGUodmFsdWUpO1xuICAgICAgdGhpcy5fc2VsZWN0ZWREYXRlID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGRpc2FibGVkRGF0ZXMoKTogRGF0ZVtdIHtcbiAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWREYXRlcztcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBkaXNhYmxlZERhdGVzKHZhbHVlOiBEYXRlW10pIHtcbiAgICB0aGlzLl9kaXNhYmxlZERhdGVzID0gKHZhbHVlIHx8IFtdKS5tYXAoKGRhdGUpID0+IHRoaXMubm9ybWFsaXplRGF0ZShkYXRlKSk7XG4gIH1cblxuICBnZXQgZW5hYmxlZERhdGVzKCk6IERhdGVbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2VuYWJsZWREYXRlcztcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBlbmFibGVkRGF0ZXModmFsdWU6IERhdGVbXSkge1xuICAgIHRoaXMuX2VuYWJsZWREYXRlcyA9ICh2YWx1ZSB8fCBbXSkubWFwKChkYXRlKSA9PiB0aGlzLm5vcm1hbGl6ZURhdGUoZGF0ZSkpO1xuICB9XG5cbiAgZ2V0IHRvZGF5RGF0ZSgpOiBEYXRlIHtcbiAgICByZXR1cm4gdGhpcy5fdG9kYXlEYXRlO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IHRvZGF5RGF0ZSh2YWx1ZTogRGF0ZSkge1xuICAgIHRoaXMuX3RvZGF5RGF0ZSA9IHRoaXMubm9ybWFsaXplRGF0ZSh2YWx1ZSk7XG4gIH1cblxuICBnZXQgbWluRGF0ZSgpOiBEYXRlIHtcbiAgICByZXR1cm4gdGhpcy5fbWluRGF0ZTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBtaW5EYXRlKHZhbHVlOiBEYXRlKSB7XG4gICAgaWYgKHZhbHVlICYmIHRoaXMuYWN0aXZlTW9udGggJiYgaXNCZWZvcmUodGhpcy5hY3RpdmVNb250aCwgdmFsdWUpKSB7XG4gICAgICB0aGlzLnNldEFjdGl2ZU1vbnRoKHZhbHVlKTtcbiAgICB9XG4gICAgdGhpcy5fbWluRGF0ZSA9IHRoaXMubm9ybWFsaXplRGF0ZSh2YWx1ZSk7XG4gIH1cblxuICBnZXQgbWF4RGF0ZSgpOiBEYXRlIHtcbiAgICByZXR1cm4gdGhpcy5fbWF4RGF0ZTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBtYXhEYXRlKHZhbHVlOiBEYXRlKSB7XG4gICAgaWYgKHZhbHVlICYmIHRoaXMuYWN0aXZlTW9udGggJiYgaXNBZnRlcih0aGlzLmFjdGl2ZU1vbnRoLCB2YWx1ZSkpIHtcbiAgICAgIHRoaXMuc2V0QWN0aXZlTW9udGgodmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLl9tYXhEYXRlID0gdGhpcy5ub3JtYWxpemVEYXRlKHZhbHVlKTtcbiAgfVxuXG4gIGdldCBhY3RpdmVNb250aE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKHRoaXMuZm9ybWF0V2l0aExvY2FsZSh0aGlzLmFjdGl2ZU1vbnRoLCAnTU1NTScpKTtcbiAgfVxuXG4gIGdldCBhY3RpdmVZZWFyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0V2l0aExvY2FsZSh0aGlzLmFjdGl2ZU1vbnRoLCAneXl5eScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgbmF2aWdhYmxlIHllYXJzIGZvciB5ZWFyIG5hdmlnYXRvciBiYXNlZCBvbiB5ZWFyTmF2aWdhdG9yT3B0aW9ucy5cbiAgICovXG4gIGdldCBuYXZpZ2FibGVZZWFycygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgZGF0ZU9mRmlyc3ROYXZpZ2FibGVZZWFyID1cbiAgICAgIHRoaXMubWluRGF0ZSB8fCB0aGlzLmdldERhdGVGcm9tTmF2aWdhYmxlWWVhcih0aGlzLnllYXJOYXZpZ2F0b3JPcHRpb25zLmZyb20pO1xuXG4gICAgY29uc3QgZGF0ZU9mTGFzdE5hdmlnYWJsZVllYXIgPVxuICAgICAgdGhpcy5tYXhEYXRlIHx8IHRoaXMuZ2V0RGF0ZUZyb21OYXZpZ2FibGVZZWFyKHRoaXMueWVhck5hdmlnYXRvck9wdGlvbnMudG8pO1xuXG4gICAgcmV0dXJuIHRoaXMuZ2V0WWVhcnNCZXR3ZWVuRGF0ZXMoZGF0ZU9mRmlyc3ROYXZpZ2FibGVZZWFyLCBkYXRlT2ZMYXN0TmF2aWdhYmxlWWVhcik7XG4gIH1cblxuICBnZXQgbmF2aWdhdGVkWWVhcigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLm5hdmlnYWJsZVllYXJzLmluZGV4T2YodGhpcy5hY3RpdmVZZWFyKTtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuaGFzLXllYXItbmF2aWdhdG9yJylcbiAgZ2V0IF9oYXNZZWFyTmF2aWdhdG9yKCkge1xuICAgIHJldHVybiAhIXRoaXMueWVhck5hdmlnYXRvck9wdGlvbnM7XG4gIH1cblxuICBwcml2YXRlIGdldFRvZGF5RGF0ZSgpIHtcbiAgICByZXR1cm4gc3RhcnRPZkRheSh0aGlzLnRvZGF5RGF0ZSA/PyBuZXcgRGF0ZSgpKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoTE9DQUxFX0lEKSBsb2NhbGU6IHN0cmluZyxcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHB1YmxpYyB0cmFuc2xhdGlvbnM6IFRyYW5zbGF0aW9uU2VydmljZVxuICApIHtcbiAgICB0aGlzLmxvY2FsZSA9IHRoaXMubWFwTG9jYWxlKGxvY2FsZSk7XG4gICAgdGhpcy50aW1lWm9uZU5hbWUgPSBJbnRsLkRhdGVUaW1lRm9ybWF0KCkucmVzb2x2ZWRPcHRpb25zKCkudGltZVpvbmU7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdFdpdGhMb2NhbGUoZGF0ZTogRGF0ZSwgZm9ybWF0U3RyaW5nOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBmb3JtYXQoZGF0ZSwgZm9ybWF0U3RyaW5nLCB7XG4gICAgICBsb2NhbGU6IHRoaXMubG9jYWxlLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXBMb2NhbGUobG9jYWxlOiBzdHJpbmcpOiBMb2NhbGUge1xuICAgIGlmIChsb2NhbGUgPT09ICdlbicpIHtcbiAgICAgIGxvY2FsZSA9ICdlbkdCJzsgLy8gaWYgZW5nbGlzaCBsb2NhbGUgaXMgcHJvdmlkZWQgd2l0aG91dCByZWdpb24sIHdlIGRlZmF1bHQgdG8gR0JcbiAgICB9XG4gICAgbG9jYWxlID0gbG9jYWxlLnJlcGxhY2UoJy0nLCAnJyk7XG4gICAgY29uc3QgYXZhaWxhYmxlTG9jYWxlcyA9IHsgLi4udGhpcy5pbmNsdWRlZExvY2FsZXMsIC4uLnRoaXMubG9jYWxlcywgLi4udGhpcy5jdXN0b21Mb2NhbGVzIH07XG4gICAgcmV0dXJuIGF2YWlsYWJsZUxvY2FsZXNbbG9jYWxlXSB8fCB0aGlzLmluY2x1ZGVkTG9jYWxlcy5lbkdCOyAvLyBEZWZhdWx0IHRvIGVuR0IgaWYgaW5qZWN0ZWQgbG9jYWxlIGRvZXNudCBleGlzdFxuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXREYXRlTGFiZWwoKTogc3RyaW5nIHtcbiAgICBjb25zdCBsb2NhbGVEYXRlRm9ybWF0cyA9IHtcbiAgICAgIGRhOiAnZC4gTU1NTScsXG4gICAgICAnZW4tR0InOiAnZCBNTU1NJyxcbiAgICAgICdlbi1VUyc6ICdNTU1NIGQnLFxuICAgIH07XG5cbiAgICBjb25zdCBkZWZhdWx0RGF0ZUZvcm1hdCA9IGxvY2FsZURhdGVGb3JtYXRzWydlbi1VUyddO1xuICAgIGNvbnN0IGRhdGVGb3JtYXQgPSBsb2NhbGVEYXRlRm9ybWF0c1t0aGlzLmxvY2FsZS5jb2RlXSB8fCBkZWZhdWx0RGF0ZUZvcm1hdDtcbiAgICByZXR1cm4gZGF0ZUZvcm1hdDtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuZm9jdXNzZWREYXRlID0gdGhpcy5nZXRUb2RheURhdGUoKTtcbiAgICB0aGlzLl93ZWVrRGF5cyA9IHRoaXMuZ2V0V2Vla0RheXMoKTtcbiAgICB0aGlzLnNldEFjdGl2ZU1vbnRoKHRoaXMuc2VsZWN0ZWREYXRlKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYWN0aXZlTW9udGgpIHJldHVybjtcbiAgICBpZiAoXG4gICAgICBjaGFuZ2VzLmRpc2FibGVXZWVrZW5kcyB8fFxuICAgICAgY2hhbmdlcy5kaXNhYmxlUGFzdERhdGVzIHx8XG4gICAgICBjaGFuZ2VzLmRpc2FibGVGdXR1cmVEYXRlcyB8fFxuICAgICAgY2hhbmdlcy5kaXNhYmxlZERhdGVzIHx8XG4gICAgICBjaGFuZ2VzLmVuYWJsZWREYXRlcyB8fFxuICAgICAgY2hhbmdlcy5taW5EYXRlIHx8XG4gICAgICBjaGFuZ2VzLm1heERhdGUgfHxcbiAgICAgIGNoYW5nZXMudG9kYXlEYXRlIHx8XG4gICAgICBjaGFuZ2VzLnRpbWV6b25lXG4gICAgKSB7XG4gICAgICB0aGlzLnJlZnJlc2hBY3RpdmVNb250aCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0QWN0aXZlTW9udGgoZGF0ZTogRGF0ZSA9IG5ldyBEYXRlKCkpIHtcbiAgICBpZiAoIXRoaXMuYWN0aXZlTW9udGggfHwgIWlzU2FtZU1vbnRoKHRoaXMuYWN0aXZlTW9udGgsIGRhdGUpKSB7XG4gICAgICB0aGlzLmFjdGl2ZU1vbnRoID0gc3RhcnRPZk1vbnRoKGRhdGUpO1xuICAgICAgdGhpcy5yZWZyZXNoQWN0aXZlTW9udGgoKTtcbiAgICB9XG4gIH1cblxuICAvLyBGb3IgbGVuaWVuY3ksIHRoZSBjb21wb25lbnQgd2lsbCBhY2NlcHQgYW55IERhdGUgdGhhdCBwb2ludHMgdG8gZWl0aGVyIFVUQyBtaWRuaWdodFxuICAvLyBvciB0byBsb2NhbCB0aW1lem9uZSBtaWRuaWdodCBhbHRob3VnaCB3ZSB3aWxsIGludGVybmFsbHkgbm9ybWFsaXplIHRoZSByZXByZXNlbnRhdGlvblxuICAvLyBvZiBhbGwgcmVjZWl2ZWQgZGF0ZXMgdG8gcG9pbnQgdG8gbG9jYWwgdGltZXpvbmUgbWlkbmlnaHQuXG4gIC8vIFdlIGN1cnJlbnRseSBsb2cgbm8gd2FybmluZ3MgaWYgdGhlIGRhdGUgZG9lc24ndCBtYXRjaCB0aGUgdGltZXpvbmUgc2V0dGluZyBvclxuICAvLyBpZiBpdCBkb2Vzbid0IHBvaW50IHRvIG1pZG5pZ2h0LlxuICBwcml2YXRlIG5vcm1hbGl6ZURhdGUoZGF0ZUxvY2FsT3JVVEM6IERhdGUpIHtcbiAgICBpZiAoIWRhdGVMb2NhbE9yVVRDKSByZXR1cm47XG5cbiAgICBpZiAoc3RhcnRPZkRheShkYXRlTG9jYWxPclVUQykuZ2V0VGltZSgpID09PSBkYXRlTG9jYWxPclVUQy5nZXRUaW1lKCkpIHtcbiAgICAgIC8vIGRhdGUgaXMgbG9jYWwgdGltZXpvbmUgbWlkbmlnaHRcbiAgICAgIHJldHVybiBkYXRlTG9jYWxPclVUQztcbiAgICB9XG4gICAgaWYgKFxuICAgICAgc3RhcnRPZkRheSh1dGNUb1pvbmVkVGltZShkYXRlTG9jYWxPclVUQywgdGhpcy50aW1lWm9uZU5hbWUpKS5nZXRUaW1lKCkgPT09XG4gICAgICB1dGNUb1pvbmVkVGltZShkYXRlTG9jYWxPclVUQywgdGhpcy50aW1lWm9uZU5hbWUpLmdldFRpbWUoKVxuICAgICkge1xuICAgICAgLy8gdGhlIGRhdGUgaXMgYSBVVEMgbWlkbmlnaHQ7IGNyZWF0ZSB0aGUgZXF1aXZhbGVudCBsb2NhbCB0aW1lem9uZSBtaWRuaWdodCBkYXRlXG4gICAgICBjb25zdCBub3JtYWxpemVkVVRDZGF0ZSA9IHV0Y1RvWm9uZWRUaW1lKGRhdGVMb2NhbE9yVVRDLCB0aGlzLnRpbWVab25lTmFtZSk7XG4gICAgICByZXR1cm4gbm9ybWFsaXplZFVUQ2RhdGU7XG4gICAgfVxuICAgIC8vIGRvZXMgbm90IHBvaW50IHRvIG1pZG5pZ2h0IHNvIHdlIG1ha2UgaXRcbiAgICByZXR1cm4gc3RhcnRPZkRheShkYXRlTG9jYWxPclVUQyk7XG4gIH1cblxuICBwcml2YXRlIGdldFdlZWtEYXlzKCk6IFdlZWtEYXlbXSB7XG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICBjb25zdCB3ZWVrID0gZWFjaERheU9mSW50ZXJ2YWwoe1xuICAgICAgc3RhcnQ6IHN0YXJ0T2ZXZWVrKG5vdywgeyBsb2NhbGU6IHRoaXMubG9jYWxlIH0pLFxuICAgICAgZW5kOiBlbmRPZldlZWsobm93LCB7IGxvY2FsZTogdGhpcy5sb2NhbGUgfSksXG4gICAgfSk7XG5cbiAgICBjb25zdCB3ZWVrZGF5TmFycm93Rm9ybWF0ID0gJ0VFRUVFJztcbiAgICBjb25zdCB3ZWVrZGF5V2lkZUZvcm1hdCA9ICdFRUVFJztcblxuICAgIHJldHVybiB3ZWVrLm1hcCgoZGF0ZSkgPT4gKHtcbiAgICAgIGZpcnN0TGV0dGVyQ2FwaXRhbGl6ZWQ6IHRoaXMuZm9ybWF0V2l0aExvY2FsZShkYXRlLCB3ZWVrZGF5TmFycm93Rm9ybWF0KSxcbiAgICAgIGZ1bGxOYW1lOiB0aGlzLmZvcm1hdFdpdGhMb2NhbGUoZGF0ZSwgd2Vla2RheVdpZGVGb3JtYXQpLFxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFzRGF0ZUNoYW5nZWQobmV3RGF0ZTogRGF0ZSwgcHJldmlvdXNEYXRlOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgaWYgKCFuZXdEYXRlICYmICFwcmV2aW91c0RhdGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKG5ld0RhdGUgaW5zdGFuY2VvZiBEYXRlICYmICFwcmV2aW91c0RhdGUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gIWlzU2FtZURheShuZXdEYXRlLCBwcmV2aW91c0RhdGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0Rpc2FibGVkRGF0ZShkYXRlOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGlzYWJsZWREYXRlcy5zb21lKChkaXNhYmxlZERhdGUpID0+IGlzU2FtZURheShkaXNhYmxlZERhdGUsIGRhdGUpKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNFbmFibGVkRGF0ZShkYXRlOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuX2VuYWJsZWREYXRlcy5sZW5ndGggPT09IDAgfHxcbiAgICAgIHRoaXMuZW5hYmxlZERhdGVzLnNvbWUoKGVuYWJsZWREYXRlKSA9PiBpc1NhbWVEYXkoZW5hYmxlZERhdGUsIGRhdGUpKVxuICAgICk7XG4gIH1cblxuICByZWZyZXNoQWN0aXZlTW9udGgoKSB7XG4gICAgaWYgKCF0aGlzLmFjdGl2ZU1vbnRoKSByZXR1cm47XG5cbiAgICBjb25zdCBtb250aFN0YXJ0ID0gc3RhcnRPZk1vbnRoKHRoaXMuYWN0aXZlTW9udGgpO1xuICAgIGNvbnN0IHN0YXJ0T2ZGaXJzdFdlZWsgPSBzdGFydE9mV2Vlayhtb250aFN0YXJ0LCB7IGxvY2FsZTogdGhpcy5sb2NhbGUgfSk7XG5cbiAgICBjb25zdCB0b3RhbE51bWJlck9mRGF5cyA9IDQyOyAvLyBBbHdheXMgc2hvdyA0MiBkYXlzICg2IHdlZWtzKSBpbiBjYWxlbmRhclxuICAgIGNvbnN0IGRheXNBcnJheSA9IEFycmF5LmZyb20oQXJyYXkodG90YWxOdW1iZXJPZkRheXMpLmtleXMoKSk7XG4gICAgY29uc3QgdG9kYXkgPSB0aGlzLmdldFRvZGF5RGF0ZSgpO1xuXG4gICAgY29uc3QgY2FsZW5kYXJEYXlzOiBDYWxlbmRhckRheVtdID0gZGF5c0FycmF5Lm1hcCgobnVtYmVyKSA9PiB7XG4gICAgICBjb25zdCBkYXRlT2ZDYWxlbmRhckRheSA9IGFkZChzdGFydE9mRmlyc3RXZWVrLCB7IFtUaW1lVW5pdC5kYXlzXTogbnVtYmVyIH0pO1xuXG4gICAgICBjb25zdCBjYWxlbmRhckRheTogQ2FsZW5kYXJEYXkgPSB7XG4gICAgICAgIGRhdGU6IGRhdGVPZkNhbGVuZGFyRGF5LmdldERhdGUoKSxcbiAgICAgICAgbW9udGhJbmRleDogZGF0ZU9mQ2FsZW5kYXJEYXkuZ2V0TW9udGgoKSxcbiAgICAgICAgeWVhcjogZGF0ZU9mQ2FsZW5kYXJEYXkuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgYXJpYUxhYmVsOiB0aGlzLmZvcm1hdFdpdGhMb2NhbGUoZGF0ZU9mQ2FsZW5kYXJEYXksIHRoaXMuZm9ybWF0RGF0ZUxhYmVsKCkpLFxuICAgICAgICAuLi50aGlzLmdldENhbGVuZGFyRGF5TWV0YWRhdGEoZGF0ZU9mQ2FsZW5kYXJEYXksIHRvZGF5LCBtb250aFN0YXJ0KSxcbiAgICAgIH07XG4gICAgICBpZiAoY2FsZW5kYXJEYXkuaXNTZWxlY3RlZCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkRGF5ID0gY2FsZW5kYXJEYXk7XG4gICAgICB9XG4gICAgICBpZiAoY2FsZW5kYXJEYXkuaXNGb2N1c3NlZCkge1xuICAgICAgICB0aGlzLmZvY3Vzc2VkRGF5ID0gY2FsZW5kYXJEYXk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2FsZW5kYXJEYXk7XG4gICAgfSk7XG4gICAgdGhpcy5fbW9udGggPSB0aGlzLmNodW5rKGNhbGVuZGFyRGF5cywgNyk7XG4gIH1cblxuICBwcml2YXRlIGdldENhbGVuZGFyRGF5TWV0YWRhdGEoZGF0ZTogRGF0ZSwgdG9kYXk6IERhdGUsIG1vbnRoU3RhcnQ6IERhdGUpOiBDYWxlbmRhckRheU1ldGFkYXRhIHtcbiAgICByZXR1cm4ge1xuICAgICAgaXNUb2RheTogaXNTYW1lRGF5KHRvZGF5LCBkYXRlKSxcbiAgICAgIGlzUGFzdDogaXNCZWZvcmUoZGF0ZSwgdG9kYXkpLFxuICAgICAgaXNGdXR1cmU6IGlzQWZ0ZXIoZGF0ZSwgdG9kYXkpLFxuICAgICAgaXNXZWVrZW5kOiBpc1dlZWtlbmQoZGF0ZSksXG4gICAgICBpc0N1cnJlbnRNb250aDogaXNTYW1lTW9udGgoZGF0ZSwgbW9udGhTdGFydCksXG4gICAgICBpc1NlbGVjdGFibGU6IHRoaXMuaXNTZWxlY3RhYmxlKGRhdGUsIHRvZGF5KSxcbiAgICAgIGlzRm9jdXNhYmxlOiB0aGlzLmlzV2l0aGluQWxsb3dlZFJhbmdlKGRhdGUsIHRvZGF5KSxcbiAgICAgIGlzU2VsZWN0ZWQ6IGlzU2FtZURheSh0aGlzLnNlbGVjdGVkRGF0ZSwgZGF0ZSksXG4gICAgICBpc0ZvY3Vzc2VkOiBpc1NhbWVEYXkodGhpcy5mb2N1c3NlZERhdGUsIGRhdGUpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGlzU2VsZWN0YWJsZShkYXRlOiBEYXRlLCB0b2RheTogRGF0ZSk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmFsd2F5c0VuYWJsZVRvZGF5ICYmIGlzU2FtZURheSh0b2RheSwgZGF0ZSkpIHJldHVybiB0cnVlO1xuXG4gICAgaWYgKCF0aGlzLmlzV2l0aGluQWxsb3dlZFJhbmdlKGRhdGUsIHRvZGF5KSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLmlzRGlzYWJsZWREYXRlKGRhdGUpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCF0aGlzLmlzRW5hYmxlZERhdGUoZGF0ZSkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAodGhpcy5kaXNhYmxlV2Vla2VuZHMgJiYgaXNXZWVrZW5kKGRhdGUpKSByZXR1cm4gZmFsc2U7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgaXNXaXRoaW5BbGxvd2VkUmFuZ2UoZGF0ZTogRGF0ZSwgdG9kYXk6IERhdGUpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlUGFzdERhdGVzICYmIGlzQmVmb3JlKGRhdGUsIHRvZGF5KSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLmRpc2FibGVGdXR1cmVEYXRlcyAmJiBpc0FmdGVyKGRhdGUsIHRvZGF5KSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLm1pbkRhdGUgJiYgaXNCZWZvcmUoZGF0ZSwgdGhpcy5taW5EYXRlKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLm1heERhdGUgJiYgaXNBZnRlcihkYXRlLCB0aGlzLm1heERhdGUpKSByZXR1cm4gZmFsc2U7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgY2h1bmsoYXJyYXk6IGFueVtdLCBzaXplOiBudW1iZXIpIHtcbiAgICBjb25zdCByZXN1bHRzID0gW107XG4gICAgd2hpbGUgKGFycmF5Lmxlbmd0aCkge1xuICAgICAgcmVzdWx0cy5wdXNoKGFycmF5LnNwbGljZSgwLCBzaXplKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgcHJpdmF0ZSBvblNlbGVjdGVkRGF0ZUNoYW5nZShuZXdEYXRlOiBEYXRlKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWREYXkpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXkuaXNTZWxlY3RlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld0RheSA9IHRoaXMuZ2V0RGF5KG5ld0RhdGUpO1xuICAgIGlmIChuZXdEYXkpIHtcbiAgICAgIG5ld0RheS5pc1NlbGVjdGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXkgPSBuZXdEYXk7XG4gICAgfVxuICB9XG5cbiAgX29uRGF0ZVNlbGVjdGVkKG5ld0RheTogQ2FsZW5kYXJEYXkpIHtcbiAgICBpZiAoIW5ld0RheS5pc1NlbGVjdGFibGUpIHJldHVybjtcblxuICAgIGxldCBuZXdEYXRlID0gbmV3IERhdGUobmV3RGF5LnllYXIsIG5ld0RheS5tb250aEluZGV4LCBuZXdEYXkuZGF0ZSk7XG5cbiAgICBpZiAodGhpcy50aW1lem9uZSA9PT0gJ1VUQycpIHtcbiAgICAgIG5ld0RhdGUgPSB6b25lZFRpbWVUb1V0Yyh0aGlzLnN1YnRyYWN0VGltZXpvbmVPZmZzZXQobmV3RGF0ZSksIHRoaXMudGltZVpvbmVOYW1lKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRlVG9FbWl0ID0gbmV3RGF0ZTtcblxuICAgIGlmICh0aGlzLmhhc0RhdGVDaGFuZ2VkKG5ld0RhdGUsIHRoaXMuX3NlbGVjdGVkRGF0ZSkpIHtcbiAgICAgIHRoaXMuc2V0QWN0aXZlTW9udGgobmV3RGF0ZSk7XG4gICAgICB0aGlzLm9uU2VsZWN0ZWREYXRlQ2hhbmdlKG5ld0RhdGUpO1xuICAgICAgdGhpcy5zZWxlY3RlZERhdGUgPSBuZXdEYXRlO1xuICAgICAgdGhpcy5kYXRlQ2hhbmdlLmVtaXQoZGF0ZVRvRW1pdCk7XG4gICAgfVxuICAgIHRoaXMuZGF0ZVNlbGVjdC5lbWl0KGRhdGVUb0VtaXQpO1xuICB9XG5cbiAgX2NoYW5nZU1vbnRoKGluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAoaW5kZXggPiAwICYmICF0aGlzLl9jYW5OYXZpZ2F0ZUZvcndhcmQpIHJldHVybjtcbiAgICBpZiAoaW5kZXggPCAwICYmICF0aGlzLl9jYW5OYXZpZ2F0ZUJhY2spIHJldHVybjtcblxuICAgIHRoaXMuY2hhbmdlQWN0aXZlVmlldyhpbmRleCwgVGltZVVuaXQubW9udGhzKTtcbiAgICBpbmRleCA+IDBcbiAgICAgID8gdGhpcy5uZXh0TW9udGhDbGlja2VkLmVtaXQodGhpcy5hY3RpdmVNb250aClcbiAgICAgIDogdGhpcy5wcmV2aW91c01vbnRoQ2xpY2tlZC5lbWl0KHRoaXMuYWN0aXZlTW9udGgpO1xuICB9XG5cbiAgX2NoYW5nZVllYXIoeWVhcjogc3RyaW5nKSB7XG4gICAgY29uc3QgeWVhck51bWVyaWMgPSBOdW1iZXIoeWVhcik7XG4gICAgdGhpcy5jaGFuZ2VBY3RpdmVWaWV3KHllYXJOdW1lcmljIC0gZ2V0WWVhcih0aGlzLmFjdGl2ZU1vbnRoKSwgVGltZVVuaXQueWVhcnMpO1xuICAgIHRoaXMueWVhclNlbGVjdC5lbWl0KHllYXJOdW1lcmljKTtcbiAgfVxuXG4gIHByaXZhdGUgY2hhbmdlQWN0aXZlVmlldyhpbmRleDogbnVtYmVyLCB1bml0OiBUaW1lVW5pdCkge1xuICAgIGlmIChpbmRleCA9PT0gMCkgcmV0dXJuO1xuICAgIHRoaXMuYWN0aXZlTW9udGggPSBhZGQodGhpcy5hY3RpdmVNb250aCwgeyBbdW5pdF06IGluZGV4IH0pO1xuICAgIHRoaXMuZm9jdXNzZWREYXRlID0gYWRkKHRoaXMuZm9jdXNzZWREYXRlLCB7IFt1bml0XTogaW5kZXggfSk7XG5cbiAgICB0aGlzLnJlZnJlc2hBY3RpdmVNb250aCgpO1xuICB9XG5cbiAgZ2V0IF9jYW5OYXZpZ2F0ZUJhY2soKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdG9kYXkgPSB0aGlzLmdldFRvZGF5RGF0ZSgpO1xuICAgIGNvbnN0IHJlYWNoZWRQYXN0RGF0ZXNMaW1pdCA9IHRoaXMuZGlzYWJsZVBhc3REYXRlcyAmJiBpc1NhbWVNb250aCh0aGlzLmFjdGl2ZU1vbnRoLCB0b2RheSk7XG5cbiAgICBjb25zdCByZWFjaGVkT3JFeGNlZWRlZE1pbkRhdGUgPVxuICAgICAgdGhpcy5taW5EYXRlICYmXG4gICAgICAoaXNTYW1lTW9udGgodGhpcy5hY3RpdmVNb250aCwgdGhpcy5taW5EYXRlKSB8fCBpc0JlZm9yZSh0aGlzLmFjdGl2ZU1vbnRoLCB0aGlzLm1pbkRhdGUpKTtcblxuICAgIHJldHVybiAhcmVhY2hlZFBhc3REYXRlc0xpbWl0ICYmICFyZWFjaGVkT3JFeGNlZWRlZE1pbkRhdGU7XG4gIH1cblxuICBnZXQgX2Nhbk5hdmlnYXRlRm9yd2FyZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCB0b2RheSA9IHRoaXMuZ2V0VG9kYXlEYXRlKCk7XG4gICAgY29uc3QgcmVhY2hlZEZ1dHVyZURhdGVzTGltaXQgPSB0aGlzLmRpc2FibGVGdXR1cmVEYXRlcyAmJiBpc1NhbWVNb250aCh0aGlzLmFjdGl2ZU1vbnRoLCB0b2RheSk7XG5cbiAgICBjb25zdCByZWFjaGVkT3JFeGNlZWRlZE1heERhdGUgPVxuICAgICAgdGhpcy5tYXhEYXRlICYmXG4gICAgICAoaXNTYW1lTW9udGgodGhpcy5hY3RpdmVNb250aCwgdGhpcy5tYXhEYXRlKSB8fCBpc0FmdGVyKHRoaXMuYWN0aXZlTW9udGgsIHRoaXMubWF4RGF0ZSkpO1xuXG4gICAgcmV0dXJuICFyZWFjaGVkRnV0dXJlRGF0ZXNMaW1pdCAmJiAhcmVhY2hlZE9yRXhjZWVkZWRNYXhEYXRlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREYXkoZGF0ZTogRGF0ZSkge1xuICAgIGxldCBmb3VuZERheTogQ2FsZW5kYXJEYXkgPSBudWxsO1xuICAgIGlmIChkYXRlKSB7XG4gICAgICBmb3IgKGNvbnN0IHdlZWsgb2YgdGhpcy5fbW9udGgpIHtcbiAgICAgICAgZm91bmREYXkgPSB3ZWVrLmZpbmQoKGRheSkgPT4ge1xuICAgICAgICAgIHJldHVybiBkYXkuaXNDdXJyZW50TW9udGggJiYgZGF5LmRhdGUgPT09IGRhdGUuZ2V0RGF0ZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGZvdW5kRGF5KSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZvdW5kRGF5O1xuICB9XG5cbiAgcHJpdmF0ZSBzdWJ0cmFjdFRpbWV6b25lT2Zmc2V0KGRhdGU6IERhdGUpOiBEYXRlIHtcbiAgICBjb25zdCB0aW1lem9uZU9mZnNldEluTXMgPSBkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCkgKiA2MCAqIDEwMDA7XG4gICAgcmV0dXJuIG5ldyBEYXRlKGRhdGUuZ2V0VGltZSgpIC0gdGltZXpvbmVPZmZzZXRJbk1zKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGF0ZUZyb21OYXZpZ2FibGVZZWFyKG5hdmlnYWJsZVllYXI6IG51bWJlciB8IERhdGUpOiBEYXRlIHtcbiAgICBpZiAobmF2aWdhYmxlWWVhciBpbnN0YW5jZW9mIERhdGUpIHJldHVybiBuYXZpZ2FibGVZZWFyO1xuICAgIGNvbnN0IHRvZGF5ID0gdGhpcy50b2RheURhdGUgfHwgbmV3IERhdGUoKTtcbiAgICByZXR1cm4gbmV3IERhdGUodG9kYXkuZ2V0RnVsbFllYXIoKSArIG5hdmlnYWJsZVllYXIsIDAsIDEpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRZZWFyc0JldHdlZW5EYXRlcyhzdGFydERhdGU6IERhdGUsIGVuZERhdGU6IERhdGUpOiBzdHJpbmdbXSB7XG4gICAgLy8gRW5zdXJlIHllYXJzIGFyZSBvcmRlcmVkIGNvcnJlY3RseSBpZiBwYXJhbWV0ZXJzIGFyZSBzd2l0Y2hlZDpcbiAgICBjb25zdCBbc3RhcnRZZWFyLCBlbmRZZWFyXSA9IFtzdGFydERhdGUuZ2V0RnVsbFllYXIoKSwgZW5kRGF0ZS5nZXRGdWxsWWVhcigpXS5zb3J0KCk7XG4gICAgY29uc3QgbnVtYmVyT2ZZZWFycyA9IGVuZFllYXIgLSBzdGFydFllYXI7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IG51bWJlck9mWWVhcnMgKyAxIH0sIChfLCBpKSA9PiAoc3RhcnRZZWFyICsgaSkudG9TdHJpbmcoKSk7XG4gIH1cblxuICBwcml2YXRlIHNldEZvY3Vzc2VkRGF5KG5ld0RhdGU6IERhdGUpIHtcbiAgICBjb25zdCBuZXdEYXkgPSB0aGlzLmdldERheShuZXdEYXRlKTtcbiAgICBpZiAoIW5ld0RheSkgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMuZm9jdXNzZWREYXkpIHtcbiAgICAgIHRoaXMuZm9jdXNzZWREYXkuaXNGb2N1c3NlZCA9IGZhbHNlO1xuICAgIH1cbiAgICBuZXdEYXkuaXNGb2N1c3NlZCA9IHRydWU7XG4gICAgdGhpcy5mb2N1c3NlZERheSA9IG5ld0RheTtcbiAgfVxuXG4gIHByaXZhdGUgZm9jdXNEYXRlKG5ld0RhdGU6IERhdGUgfCBudWxsKSB7XG4gICAgaWYgKCFuZXdEYXRlKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy50aW1lem9uZSA9PT0gJ1VUQycpIHtcbiAgICAgIG5ld0RhdGUgPSB6b25lZFRpbWVUb1V0Yyh0aGlzLnN1YnRyYWN0VGltZXpvbmVPZmZzZXQobmV3RGF0ZSksIHRoaXMudGltZVpvbmVOYW1lKTtcbiAgICB9XG5cbiAgICBjb25zdCB0b2RheSA9IHRoaXMuZ2V0VG9kYXlEYXRlKCk7XG4gICAgaWYgKCF0aGlzLmlzV2l0aGluQWxsb3dlZFJhbmdlKG5ld0RhdGUsIHRvZGF5KSkgcmV0dXJuO1xuXG4gICAgaWYgKCF0aGlzLmhhc0RhdGVDaGFuZ2VkKG5ld0RhdGUsIHRoaXMuZm9jdXNzZWREYXRlKSkgcmV0dXJuO1xuXG4gICAgdGhpcy5zZXRBY3RpdmVNb250aChuZXdEYXRlKTtcbiAgICB0aGlzLnNldEZvY3Vzc2VkRGF5KG5ld0RhdGUpO1xuICAgIHRoaXMuZm9jdXNzZWREYXRlID0gbmV3RGF0ZTtcblxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTsgLy9zeW5jIGZvY3Vzc2VkIGNsYXNzIHRvIHRlbXBsYXRlIGJlZm9yZSBzZXR0aW5nIGZvY3VzXG4gICAgY29uc3QgZWxlbWVudE1hcmtlZEZvckZvY3VzID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmZvY3Vzc2VkJyk7XG4gICAgZWxlbWVudE1hcmtlZEZvckZvY3VzLmZvY3VzKCk7XG4gIH1cblxuICBfb25EYXRlS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIGNvbnN0IHsga2V5LCBzaGlmdEtleSB9ID0gZXZlbnQ7XG4gICAgbGV0IG5ld0RhdGU7XG5cbiAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgY2FzZSAnQXJyb3dVcCc6XG4gICAgICAgIG5ld0RhdGUgPSBhZGQodGhpcy5mb2N1c3NlZERhdGUsIHsgZGF5czogLTcgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgbmV3RGF0ZSA9IGFkZCh0aGlzLmZvY3Vzc2VkRGF0ZSwgeyBkYXlzOiA3IH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0Fycm93UmlnaHQnOlxuICAgICAgICBuZXdEYXRlID0gYWRkKHRoaXMuZm9jdXNzZWREYXRlLCB7IGRheXM6IDEgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnQXJyb3dMZWZ0JzpcbiAgICAgICAgbmV3RGF0ZSA9IGFkZCh0aGlzLmZvY3Vzc2VkRGF0ZSwgeyBkYXlzOiAtMSB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdIb21lJzpcbiAgICAgICAgbmV3RGF0ZSA9IHN0YXJ0T2ZXZWVrKHRoaXMuZm9jdXNzZWREYXRlLCB7IGxvY2FsZTogdGhpcy5sb2NhbGUgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnRW5kJzpcbiAgICAgICAgbmV3RGF0ZSA9IGxhc3REYXlPZldlZWsodGhpcy5mb2N1c3NlZERhdGUsIHsgbG9jYWxlOiB0aGlzLmxvY2FsZSB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdQYWdlVXAnOlxuICAgICAgICBuZXdEYXRlID0gc2hpZnRLZXlcbiAgICAgICAgICA/IGFkZCh0aGlzLmZvY3Vzc2VkRGF0ZSwgeyB5ZWFyczogLTEgfSlcbiAgICAgICAgICA6IGFkZCh0aGlzLmZvY3Vzc2VkRGF0ZSwgeyBtb250aHM6IC0xIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1BhZ2VEb3duJzpcbiAgICAgICAgbmV3RGF0ZSA9IHNoaWZ0S2V5XG4gICAgICAgICAgPyBhZGQodGhpcy5mb2N1c3NlZERhdGUsIHsgeWVhcnM6IDEgfSlcbiAgICAgICAgICA6IGFkZCh0aGlzLmZvY3Vzc2VkRGF0ZSwgeyBtb250aHM6IDEgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5mb2N1c0RhdGUobmV3RGF0ZSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJoZWFkZXJcIj5cbiAgPGRpdiBjbGFzcz1cIm1vbnRoLW5hdmlnYXRvclwiPlxuICAgIDxidXR0b25cbiAgICAgIGtpcmJ5LWJ1dHRvblxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBjbGFzcz1cIm5vLW1hcmdpblwiXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInRyYW5zbGF0aW9ucy5nZXQoJ3ByZXZpb3VzTW9udGgnKVwiXG4gICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cIl9jYW5OYXZpZ2F0ZUJhY2sgPyBudWxsIDogdHJ1ZVwiXG4gICAgICBbbm9EZWNvcmF0aW9uXT1cInRydWVcIlxuICAgICAgKGNsaWNrKT1cIl9jaGFuZ2VNb250aCgtMSlcIlxuICAgID5cbiAgICAgIDxraXJieS1pY29uIG5hbWU9XCJhcnJvdy1iYWNrXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9raXJieS1pY29uPlxuICAgIDwvYnV0dG9uPlxuXG4gICAgPGRpdiBjbGFzcz1cIm1vbnRoLWFuZC15ZWFyXCIgW2lkXT1cIl90YWJsZU1vbnRoSWRcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIiBhcmlhLWF0b21pYz1cInRydWVcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwibW9udGhcIj57eyBhY3RpdmVNb250aE5hbWUgfX08L3NwYW4+XG4gICAgICA8c3BhbiAqbmdJZj1cIiFfaGFzWWVhck5hdmlnYXRvclwiIGNsYXNzPVwieWVhclwiPnt7IGFjdGl2ZVllYXIgfX08L3NwYW4+XG4gICAgPC9kaXY+XG5cbiAgICA8YnV0dG9uXG4gICAgICBraXJieS1idXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgY2xhc3M9XCJuby1tYXJnaW5cIlxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ0cmFuc2xhdGlvbnMuZ2V0KCduZXh0TW9udGgnKVwiXG4gICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cIl9jYW5OYXZpZ2F0ZUZvcndhcmQgPyBudWxsIDogdHJ1ZVwiXG4gICAgICBbbm9EZWNvcmF0aW9uXT1cInRydWVcIlxuICAgICAgKGNsaWNrKT1cIl9jaGFuZ2VNb250aCgxKVwiXG4gICAgPlxuICAgICAgPGtpcmJ5LWljb24gbmFtZT1cImFycm93LW1vcmVcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2tpcmJ5LWljb24+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuICA8a2lyYnktZHJvcGRvd25cbiAgICAqbmdJZj1cIl9oYXNZZWFyTmF2aWdhdG9yXCJcbiAgICBbdXNlUG9wb3Zlcl09XCJ1c2VQb3BvdmVyXCJcbiAgICBbc2VsZWN0ZWRJbmRleF09XCJuYXZpZ2F0ZWRZZWFyXCJcbiAgICBbaXRlbXNdPVwibmF2aWdhYmxlWWVhcnNcIlxuICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidHJhbnNsYXRpb25zLmdldCgnc2VsZWN0WWVhcicpXCJcbiAgICBwb3BvdXQ9XCJsZWZ0XCJcbiAgICAoY2hhbmdlKT1cIl9jaGFuZ2VZZWFyKCRldmVudClcIlxuICA+PC9raXJieS1kcm9wZG93bj5cbjwvZGl2PlxuXG48dGFibGUgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cIl90YWJsZU1vbnRoSWRcIiByb2xlPVwiZ3JpZFwiPlxuICA8dGhlYWQ+XG4gICAgPHRyPlxuICAgICAgPHRoICpuZ0Zvcj1cImxldCB3ZWVrRGF5IG9mIF93ZWVrRGF5c1wiIHNjb3BlPVwiY29sXCI+XG4gICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPnt7IHdlZWtEYXkuZmlyc3RMZXR0ZXJDYXBpdGFsaXplZCB9fTwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ2aXN1YWxseS1oaWRkZW5cIj57eyB3ZWVrRGF5LmZ1bGxOYW1lIH19PC9zcGFuPlxuICAgICAgPC90aD5cbiAgICA8L3RyPlxuICA8L3RoZWFkPlxuXG4gIDx0Ym9keT5cbiAgICA8dHIgKm5nRm9yPVwibGV0IHdlZWsgb2YgX21vbnRoXCI+XG4gICAgICA8dGQgKm5nRm9yPVwibGV0IGRheSBvZiB3ZWVrXCIgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJkYXkuaXNTZWxlY3RlZCA/IHRydWUgOiBmYWxzZVwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAga2lyYnktYnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgKGNsaWNrKT1cIl9vbkRhdGVTZWxlY3RlZChkYXkpXCJcbiAgICAgICAgICAoa2V5ZG93bik9XCJfb25EYXRlS2V5ZG93bigkZXZlbnQpXCJcbiAgICAgICAgICBjbGFzcz1cImRheVwiXG4gICAgICAgICAgW2NsYXNzLmN1cnJlbnQtbW9udGhdPVwiZGF5LmlzQ3VycmVudE1vbnRoXCJcbiAgICAgICAgICBbY2xhc3Mud2Vla2VuZF09XCJkYXkuaXNXZWVrZW5kXCJcbiAgICAgICAgICBbY2xhc3MudG9kYXldPVwiZGF5LmlzVG9kYXlcIlxuICAgICAgICAgIFtjbGFzcy5zZWxlY3RhYmxlXT1cImRheS5pc1NlbGVjdGFibGVcIlxuICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJkYXkuaXNTZWxlY3RlZFwiXG4gICAgICAgICAgW2NsYXNzLmZvY3Vzc2VkXT1cImRheS5pc0ZvY3Vzc2VkXCJcbiAgICAgICAgICBbY2xhc3MucGFzdF09XCJkYXkuaXNQYXN0XCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImRheS5hcmlhTGFiZWxcIlxuICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiZGF5LmlzU2VsZWN0YWJsZSA/IG51bGwgOiB0cnVlXCJcbiAgICAgICAgICBbbm9EZWNvcmF0aW9uXT1cInRydWVcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJkYXkuaXNGb2N1c2FibGUgPyBudWxsIDogdHJ1ZVwiXG4gICAgICAgICAgW3RhYkluZGV4XT1cImRheS5pc0ZvY3Vzc2VkID8gMCA6IC0xXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGRheS5kYXRlIH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC90ZD5cbiAgICA8L3RyPlxuICA8L3Rib2R5PlxuPC90YWJsZT5cbiJdfQ==