@coreui/angular-pro 5.2.19 → 5.2.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (284) hide show
  1. package/esm2022/lib/accordion/accordion/accordion.component.mjs +21 -33
  2. package/esm2022/lib/accordion/accordion-button/accordion-button.directive.mjs +20 -30
  3. package/esm2022/lib/accordion/accordion-item/accordion-item.component.mjs +24 -23
  4. package/esm2022/lib/accordion/accordion.module.mjs +4 -4
  5. package/esm2022/lib/accordion/accordion.service.mjs +4 -4
  6. package/esm2022/lib/alert/alert-heading.directive.mjs +3 -3
  7. package/esm2022/lib/alert/alert-link.directive.mjs +3 -3
  8. package/esm2022/lib/alert/alert.component.mjs +3 -3
  9. package/esm2022/lib/alert/alert.module.mjs +4 -4
  10. package/esm2022/lib/avatar/avatar.component.mjs +3 -3
  11. package/esm2022/lib/avatar/avatar.module.mjs +4 -4
  12. package/esm2022/lib/backdrop/backdrop.service.mjs +3 -3
  13. package/esm2022/lib/badge/badge.component.mjs +3 -3
  14. package/esm2022/lib/badge/badge.module.mjs +4 -4
  15. package/esm2022/lib/breadcrumb/breadcrumb/breadcrumb.component.mjs +3 -3
  16. package/esm2022/lib/breadcrumb/breadcrumb-item/breadcrumb-item.component.mjs +3 -3
  17. package/esm2022/lib/breadcrumb/breadcrumb-router/breadcrumb-router.component.mjs +3 -3
  18. package/esm2022/lib/breadcrumb/breadcrumb-router/breadcrumb-router.service.mjs +3 -3
  19. package/esm2022/lib/breadcrumb/breadcrumb.module.mjs +4 -4
  20. package/esm2022/lib/button/button-close.directive.mjs +3 -3
  21. package/esm2022/lib/button/button.directive.mjs +3 -3
  22. package/esm2022/lib/button/button.module.mjs +4 -4
  23. package/esm2022/lib/button-group/button-group/button-group.component.mjs +3 -3
  24. package/esm2022/lib/button-group/button-group.module.mjs +4 -4
  25. package/esm2022/lib/button-group/button-toolbar/button-toolbar.component.mjs +3 -3
  26. package/esm2022/lib/calendar/calendar/calendar-class-view.pipe.mjs +3 -3
  27. package/esm2022/lib/calendar/calendar/calendar.component.mjs +313 -411
  28. package/esm2022/lib/calendar/calendar-month/calendar-class-day.pipe.mjs +3 -3
  29. package/esm2022/lib/calendar/calendar-month/calendar-class-month.pipe.mjs +6 -5
  30. package/esm2022/lib/calendar/calendar-month/calendar-class-row.pipe.mjs +5 -7
  31. package/esm2022/lib/calendar/calendar-month/calendar-class-year.pipe.mjs +3 -3
  32. package/esm2022/lib/calendar/calendar-month/calendar-day-title.pipe.mjs +3 -3
  33. package/esm2022/lib/calendar/calendar-month/calendar-day.directive.mjs +5 -5
  34. package/esm2022/lib/calendar/calendar-month/calendar-day.pipe.mjs +3 -3
  35. package/esm2022/lib/calendar/calendar-month/calendar-month.component.mjs +183 -263
  36. package/esm2022/lib/calendar/calendar-month/calendar-row.directive.mjs +35 -33
  37. package/esm2022/lib/calendar/calendar-month/calendar-weekday.pipe.mjs +3 -3
  38. package/esm2022/lib/calendar/calendar-navigation/calendar-navigation.component.mjs +42 -14
  39. package/esm2022/lib/calendar/calendar.module.mjs +4 -4
  40. package/esm2022/lib/calendar/calendar.service.mjs +16 -13
  41. package/esm2022/lib/calendar/calendar.utils.mjs +19 -12
  42. package/esm2022/lib/callout/callout.component.mjs +3 -3
  43. package/esm2022/lib/callout/callout.module.mjs +4 -4
  44. package/esm2022/lib/card/card-body.component.mjs +3 -3
  45. package/esm2022/lib/card/card-footer.component.mjs +3 -3
  46. package/esm2022/lib/card/card-group.component.mjs +3 -3
  47. package/esm2022/lib/card/card-header-actions.component.mjs +3 -3
  48. package/esm2022/lib/card/card-header.component.mjs +3 -3
  49. package/esm2022/lib/card/card-img-overlay/card-img-overlay.component.mjs +3 -3
  50. package/esm2022/lib/card/card-img.directive.mjs +3 -3
  51. package/esm2022/lib/card/card-link.directive.mjs +3 -3
  52. package/esm2022/lib/card/card-subtitle.directive.mjs +3 -3
  53. package/esm2022/lib/card/card-text.directive.mjs +3 -3
  54. package/esm2022/lib/card/card-title.directive.mjs +3 -3
  55. package/esm2022/lib/card/card.component.mjs +3 -3
  56. package/esm2022/lib/card/card.module.mjs +4 -4
  57. package/esm2022/lib/carousel/carousel/carousel.component.mjs +3 -3
  58. package/esm2022/lib/carousel/carousel-caption/carousel-caption.component.mjs +3 -3
  59. package/esm2022/lib/carousel/carousel-control/carousel-control.component.mjs +3 -3
  60. package/esm2022/lib/carousel/carousel-indicators/carousel-indicators.component.mjs +3 -3
  61. package/esm2022/lib/carousel/carousel-inner/carousel-inner.component.mjs +3 -3
  62. package/esm2022/lib/carousel/carousel-item/carousel-item.component.mjs +3 -3
  63. package/esm2022/lib/carousel/carousel-state.mjs +3 -3
  64. package/esm2022/lib/carousel/carousel.config.mjs +3 -3
  65. package/esm2022/lib/carousel/carousel.module.mjs +4 -4
  66. package/esm2022/lib/carousel/carousel.service.mjs +3 -3
  67. package/esm2022/lib/collapse/collapse.directive.mjs +3 -3
  68. package/esm2022/lib/collapse/collapse.module.mjs +4 -4
  69. package/esm2022/lib/date-picker/date-picker.component.mjs +24 -27
  70. package/esm2022/lib/date-picker/date-picker.module.mjs +4 -4
  71. package/esm2022/lib/date-range-picker/date-range-picker/custom-range-key.pipe.mjs +3 -3
  72. package/esm2022/lib/date-range-picker/date-range-picker/date-range-picker.component.mjs +194 -296
  73. package/esm2022/lib/date-range-picker/date-range-picker.module.mjs +4 -4
  74. package/esm2022/lib/dropdown/dropdown/dropdown.component.mjs +6 -6
  75. package/esm2022/lib/dropdown/dropdown-close/dropdown-close.directive.mjs +3 -3
  76. package/esm2022/lib/dropdown/dropdown-divider/dropdown-divider.directive.mjs +3 -3
  77. package/esm2022/lib/dropdown/dropdown-header/dropdown-header.directive.mjs +3 -3
  78. package/esm2022/lib/dropdown/dropdown-item/dropdown-item-plain.directive.mjs +3 -3
  79. package/esm2022/lib/dropdown/dropdown-item/dropdown-item.directive.mjs +3 -3
  80. package/esm2022/lib/dropdown/dropdown-menu/dropdown-menu.directive.mjs +3 -3
  81. package/esm2022/lib/dropdown/dropdown.module.mjs +4 -4
  82. package/esm2022/lib/dropdown/dropdown.service.mjs +3 -3
  83. package/esm2022/lib/element-cover/element-cover.component.mjs +3 -3
  84. package/esm2022/lib/element-cover/element-cover.module.mjs +4 -4
  85. package/esm2022/lib/footer/footer.component.mjs +3 -3
  86. package/esm2022/lib/footer/footer.module.mjs +4 -4
  87. package/esm2022/lib/form/form/form.directive.mjs +3 -3
  88. package/esm2022/lib/form/form-check/form-check-input.directive.mjs +3 -3
  89. package/esm2022/lib/form/form-check/form-check-label.directive.mjs +3 -3
  90. package/esm2022/lib/form/form-check/form-check.component.mjs +3 -3
  91. package/esm2022/lib/form/form-control/form-control.directive.mjs +3 -3
  92. package/esm2022/lib/form/form-feedback/form-feedback.component.mjs +3 -3
  93. package/esm2022/lib/form/form-floating/form-floating.directive.mjs +3 -3
  94. package/esm2022/lib/form/form-label/form-label.directive.mjs +3 -3
  95. package/esm2022/lib/form/form-select/form-select.directive.mjs +3 -3
  96. package/esm2022/lib/form/form-text/form-text.directive.mjs +3 -3
  97. package/esm2022/lib/form/form.module.mjs +4 -4
  98. package/esm2022/lib/form/input-group/input-group.component.mjs +3 -3
  99. package/esm2022/lib/form/input-group-text/input-group-text.directive.mjs +3 -3
  100. package/esm2022/lib/grid/col.component.mjs +3 -3
  101. package/esm2022/lib/grid/col.directive.mjs +3 -3
  102. package/esm2022/lib/grid/container.component.mjs +3 -3
  103. package/esm2022/lib/grid/grid.module.mjs +4 -4
  104. package/esm2022/lib/grid/gutter.directive.mjs +3 -3
  105. package/esm2022/lib/grid/row.component.mjs +3 -3
  106. package/esm2022/lib/grid/row.directive.mjs +3 -3
  107. package/esm2022/lib/header/header/header.component.mjs +3 -3
  108. package/esm2022/lib/header/header-brand/header-brand.component.mjs +3 -3
  109. package/esm2022/lib/header/header-divider/header-divider.component.mjs +3 -3
  110. package/esm2022/lib/header/header-nav/header-nav.component.mjs +3 -3
  111. package/esm2022/lib/header/header-text/header-text.component.mjs +3 -3
  112. package/esm2022/lib/header/header-toggler/header-toggler.directive.mjs +3 -3
  113. package/esm2022/lib/header/header.module.mjs +4 -4
  114. package/esm2022/lib/image/img.directive.mjs +3 -3
  115. package/esm2022/lib/image/img.module.mjs +4 -4
  116. package/esm2022/lib/list-group/list-group-item.directive.mjs +3 -3
  117. package/esm2022/lib/list-group/list-group.directive.mjs +3 -3
  118. package/esm2022/lib/list-group/list-group.module.mjs +4 -4
  119. package/esm2022/lib/loading-button/loading-button.component.mjs +3 -3
  120. package/esm2022/lib/loading-button/loading-button.module.mjs +4 -4
  121. package/esm2022/lib/modal/modal/modal.component.mjs +3 -3
  122. package/esm2022/lib/modal/modal-body/modal-body.component.mjs +3 -3
  123. package/esm2022/lib/modal/modal-content/modal-content.component.mjs +3 -3
  124. package/esm2022/lib/modal/modal-dialog/modal-dialog.component.mjs +3 -3
  125. package/esm2022/lib/modal/modal-dismiss/modal-toggle.directive.mjs +3 -3
  126. package/esm2022/lib/modal/modal-footer/modal-footer.component.mjs +3 -3
  127. package/esm2022/lib/modal/modal-header/modal-header.component.mjs +3 -3
  128. package/esm2022/lib/modal/modal-title/modal-title.directive.mjs +3 -3
  129. package/esm2022/lib/modal/modal.module.mjs +4 -4
  130. package/esm2022/lib/modal/modal.service.mjs +3 -3
  131. package/esm2022/lib/multi-select/multi-select/multi-select-search.directive.mjs +3 -3
  132. package/esm2022/lib/multi-select/multi-select/multi-select.component.mjs +156 -160
  133. package/esm2022/lib/multi-select/multi-select-native-select/multi-select-native-select.component.mjs +3 -3
  134. package/esm2022/lib/multi-select/multi-select-optgroup/multi-select-optgroup-label.component.mjs +3 -3
  135. package/esm2022/lib/multi-select/multi-select-optgroup/multi-select-optgroup.component.mjs +3 -3
  136. package/esm2022/lib/multi-select/multi-select-option/multi-select-option.component.mjs +3 -3
  137. package/esm2022/lib/multi-select/multi-select-tag/multi-select-tag.component.mjs +3 -3
  138. package/esm2022/lib/multi-select/multi-select.module.mjs +4 -4
  139. package/esm2022/lib/multi-select/multi-select.service.mjs +3 -3
  140. package/esm2022/lib/nav/nav-item.component.mjs +3 -3
  141. package/esm2022/lib/nav/nav-link.directive.mjs +3 -3
  142. package/esm2022/lib/nav/nav.component.mjs +3 -3
  143. package/esm2022/lib/nav/nav.module.mjs +4 -4
  144. package/esm2022/lib/navbar/navbar-brand/navbar-brand.directive.mjs +3 -3
  145. package/esm2022/lib/navbar/navbar-nav/navbar-nav.component.mjs +3 -3
  146. package/esm2022/lib/navbar/navbar-text/navbar-text.component.mjs +3 -3
  147. package/esm2022/lib/navbar/navbar-toggler/navbar-toggler.directive.mjs +3 -3
  148. package/esm2022/lib/navbar/navbar.component.mjs +3 -3
  149. package/esm2022/lib/navbar/navbar.module.mjs +4 -4
  150. package/esm2022/lib/offcanvas/offcanvas/offcanvas.component.mjs +3 -3
  151. package/esm2022/lib/offcanvas/offcanvas-body/offcanvas-body.component.mjs +3 -3
  152. package/esm2022/lib/offcanvas/offcanvas-header/offcanvas-header.component.mjs +3 -3
  153. package/esm2022/lib/offcanvas/offcanvas-title/offcanvas-title.directive.mjs +3 -3
  154. package/esm2022/lib/offcanvas/offcanvas-toggle/offcanvas-toggle.directive.mjs +3 -3
  155. package/esm2022/lib/offcanvas/offcanvas.module.mjs +4 -4
  156. package/esm2022/lib/offcanvas/offcanvas.service.mjs +3 -3
  157. package/esm2022/lib/pagination/page-item/page-item.component.mjs +3 -3
  158. package/esm2022/lib/pagination/page-item/page-item.directive.mjs +3 -3
  159. package/esm2022/lib/pagination/page-link/page-link.directive.mjs +3 -3
  160. package/esm2022/lib/pagination/pagination/pagination.component.mjs +3 -3
  161. package/esm2022/lib/pagination/pagination.module.mjs +4 -4
  162. package/esm2022/lib/placeholder/placeholder-animation.directive.mjs +3 -3
  163. package/esm2022/lib/placeholder/placeholder.directive.mjs +3 -3
  164. package/esm2022/lib/placeholder/placeholder.module.mjs +4 -4
  165. package/esm2022/lib/popover/popover/popover.component.mjs +3 -3
  166. package/esm2022/lib/popover/popover.directive.mjs +3 -3
  167. package/esm2022/lib/popover/popover.module.mjs +4 -4
  168. package/esm2022/lib/progress/progress-bar.component.mjs +3 -3
  169. package/esm2022/lib/progress/progress-bar.directive.mjs +3 -3
  170. package/esm2022/lib/progress/progress-stacked.component.mjs +3 -3
  171. package/esm2022/lib/progress/progress.component.mjs +3 -3
  172. package/esm2022/lib/progress/progress.module.mjs +4 -4
  173. package/esm2022/lib/rating/rating-item-label/rating-item-label.component.mjs +3 -3
  174. package/esm2022/lib/rating/rating.component.mjs +3 -3
  175. package/esm2022/lib/rating/rating.module.mjs +4 -4
  176. package/esm2022/lib/services/class-toggle.service.mjs +3 -3
  177. package/esm2022/lib/services/color-mode.service.mjs +3 -3
  178. package/esm2022/lib/services/in-memory-storage.service.mjs +3 -3
  179. package/esm2022/lib/services/intersection.service.mjs +3 -3
  180. package/esm2022/lib/services/listeners.service.mjs +3 -3
  181. package/esm2022/lib/services/local-storage.service.mjs +3 -3
  182. package/esm2022/lib/shared/element-ref.directive.mjs +3 -3
  183. package/esm2022/lib/shared/html-attr.directive.mjs +3 -3
  184. package/esm2022/lib/shared/shared.module.mjs +4 -4
  185. package/esm2022/lib/shared/template-id.directive.mjs +3 -3
  186. package/esm2022/lib/shared/theme.directive.mjs +3 -3
  187. package/esm2022/lib/sidebar/sidebar/sidebar.component.mjs +3 -3
  188. package/esm2022/lib/sidebar/sidebar-backdrop/sidebar-backdrop.service.mjs +3 -3
  189. package/esm2022/lib/sidebar/sidebar-brand/sidebar-brand.component.mjs +3 -3
  190. package/esm2022/lib/sidebar/sidebar-footer/sidebar-footer.component.mjs +3 -3
  191. package/esm2022/lib/sidebar/sidebar-header/sidebar-header.component.mjs +3 -3
  192. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-badge.pipe.mjs +3 -3
  193. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-divider.component.mjs +3 -3
  194. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-group.service.mjs +3 -3
  195. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-icon.pipe.mjs +3 -3
  196. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-item-class.pipe.mjs +3 -3
  197. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-label.component.mjs +3 -3
  198. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-link.component.mjs +6 -6
  199. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-link.pipe.mjs +3 -3
  200. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-title.component.mjs +3 -3
  201. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav.component.mjs +6 -6
  202. package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav.service.mjs +6 -6
  203. package/esm2022/lib/sidebar/sidebar-toggle/sidebar-toggle.directive.mjs +3 -3
  204. package/esm2022/lib/sidebar/sidebar-toggler/sidebar-toggler.directive.mjs +3 -3
  205. package/esm2022/lib/sidebar/sidebar.module.mjs +4 -4
  206. package/esm2022/lib/sidebar/sidebar.service.mjs +3 -3
  207. package/esm2022/lib/smart-pagination/smart-pagination.component.mjs +3 -3
  208. package/esm2022/lib/smart-pagination/smart-pagination.module.mjs +4 -4
  209. package/esm2022/lib/smart-table/smart-table/smart-table.component.mjs +21 -22
  210. package/esm2022/lib/smart-table/smart-table-column-filter/smart-table-column-filter.component.mjs +3 -3
  211. package/esm2022/lib/smart-table/smart-table-filter/filter-input.directive.mjs +3 -3
  212. package/esm2022/lib/smart-table/smart-table-filter/smart-table-filter.component.mjs +3 -3
  213. package/esm2022/lib/smart-table/smart-table-head/smart-table-column-label.pipe.mjs +3 -3
  214. package/esm2022/lib/smart-table/smart-table-head/smart-table-head.component.mjs +3 -3
  215. package/esm2022/lib/smart-table/smart-table-items-per-page-selector/smart-table-items-per-page-selector.component.mjs +3 -3
  216. package/esm2022/lib/smart-table/smart-table.module.mjs +4 -4
  217. package/esm2022/lib/smart-table/smart-table.type.mjs +1 -1
  218. package/esm2022/lib/spinner/spinner.component.mjs +3 -3
  219. package/esm2022/lib/spinner/spinner.module.mjs +4 -4
  220. package/esm2022/lib/table/table-active.directive.mjs +3 -3
  221. package/esm2022/lib/table/table-color.directive.mjs +3 -3
  222. package/esm2022/lib/table/table.directive.mjs +3 -3
  223. package/esm2022/lib/table/table.module.mjs +4 -4
  224. package/esm2022/lib/tabs/tab-content/tab-content.component.mjs +3 -3
  225. package/esm2022/lib/tabs/tab-content-ref.directive.mjs +3 -3
  226. package/esm2022/lib/tabs/tab-pane/tab-pane.component.mjs +3 -3
  227. package/esm2022/lib/tabs/tab.service.mjs +3 -3
  228. package/esm2022/lib/tabs/tabs.module.mjs +4 -4
  229. package/esm2022/lib/tabs-2/tab/tab.directive.mjs +3 -3
  230. package/esm2022/lib/tabs-2/tab-panel/tab-panel.component.mjs +3 -3
  231. package/esm2022/lib/tabs-2/tabs-content/tabs-content.component.mjs +3 -3
  232. package/esm2022/lib/tabs-2/tabs-list/tabs-list.component.mjs +3 -3
  233. package/esm2022/lib/tabs-2/tabs.component.mjs +3 -3
  234. package/esm2022/lib/tabs-2/tabs.service.mjs +3 -3
  235. package/esm2022/lib/tabs-2/tabs2.module.mjs +4 -4
  236. package/esm2022/lib/time-picker/time-picker-roll-col/time-picker-roll-am-pm.component.mjs +6 -6
  237. package/esm2022/lib/time-picker/time-picker-roll-col/time-picker-roll-col.component.mjs +6 -6
  238. package/esm2022/lib/time-picker/time-picker.component.mjs +3 -3
  239. package/esm2022/lib/time-picker/time-picker.module.mjs +4 -4
  240. package/esm2022/lib/toast/toast/toast.component.mjs +3 -3
  241. package/esm2022/lib/toast/toast-body/toast-body.component.mjs +3 -3
  242. package/esm2022/lib/toast/toast-close.directive.mjs +3 -3
  243. package/esm2022/lib/toast/toast-header/toast-header.component.mjs +3 -3
  244. package/esm2022/lib/toast/toast.module.mjs +4 -4
  245. package/esm2022/lib/toast/toaster/toaster-host.directive.mjs +3 -3
  246. package/esm2022/lib/toast/toaster/toaster.component.mjs +3 -3
  247. package/esm2022/lib/toast/toaster/toaster.service.mjs +8 -7
  248. package/esm2022/lib/tooltip/tooltip/tooltip.component.mjs +3 -3
  249. package/esm2022/lib/tooltip/tooltip.directive.mjs +3 -3
  250. package/esm2022/lib/tooltip/tooltip.module.mjs +4 -4
  251. package/esm2022/lib/utilities/align.directive.mjs +3 -3
  252. package/esm2022/lib/utilities/bg-color.directive.mjs +3 -3
  253. package/esm2022/lib/utilities/border.directive.mjs +3 -3
  254. package/esm2022/lib/utilities/rounded.directive.mjs +3 -3
  255. package/esm2022/lib/utilities/shadow-on-scroll.directive.mjs +3 -3
  256. package/esm2022/lib/utilities/text-bg-color.directive.mjs +3 -3
  257. package/esm2022/lib/utilities/text-color.directive.mjs +3 -3
  258. package/esm2022/lib/utilities/utilities.module.mjs +4 -4
  259. package/esm2022/lib/widget/widget-stat-a/widget-stat-a.component.mjs +3 -3
  260. package/esm2022/lib/widget/widget-stat-b/widget-stat-b.component.mjs +3 -3
  261. package/esm2022/lib/widget/widget-stat-c/widget-stat-c.component.mjs +3 -3
  262. package/esm2022/lib/widget/widget-stat-d/widget-stat-d.component.mjs +3 -3
  263. package/esm2022/lib/widget/widget-stat-e/widget-stat-e.component.mjs +3 -3
  264. package/esm2022/lib/widget/widget-stat-f/widget-stat-f.component.mjs +3 -3
  265. package/esm2022/lib/widget/widget.module.mjs +4 -4
  266. package/fesm2022/coreui-angular-pro.mjs +1909 -2175
  267. package/fesm2022/coreui-angular-pro.mjs.map +1 -1
  268. package/lib/accordion/accordion/accordion.component.d.ts +4 -7
  269. package/lib/accordion/accordion-button/accordion-button.directive.d.ts +8 -5
  270. package/lib/accordion/accordion-item/accordion-item.component.d.ts +7 -10
  271. package/lib/accordion/accordion.service.d.ts +1 -1
  272. package/lib/calendar/calendar/calendar.component.d.ts +60 -80
  273. package/lib/calendar/calendar-month/calendar-class-row.pipe.d.ts +2 -1
  274. package/lib/calendar/calendar-month/calendar-month.component.d.ts +33 -59
  275. package/lib/calendar/calendar-month/calendar-row.directive.d.ts +1 -1
  276. package/lib/calendar/calendar-navigation/calendar-navigation.component.d.ts +16 -6
  277. package/lib/calendar/calendar.service.d.ts +11 -3
  278. package/lib/calendar/calendar.utils.d.ts +4 -3
  279. package/lib/date-picker/date-picker.component.d.ts +9 -10
  280. package/lib/date-range-picker/date-range-picker/date-range-picker.component.d.ts +65 -94
  281. package/lib/smart-table/smart-table/smart-table.component.d.ts +2 -2
  282. package/lib/smart-table/smart-table.type.d.ts +2 -2
  283. package/lib/toast/toaster/toaster.service.d.ts +2 -2
  284. package/package.json +3 -3
@@ -1,8 +1,9 @@
1
- import { booleanAttribute, Component, computed, DestroyRef, inject, Input, numberAttribute, signal, ViewChildren } from '@angular/core';
1
+ import { Component, computed, DestroyRef, effect, inject, input, numberAttribute, signal, ViewChildren } from '@angular/core';
2
2
  import { AsyncPipe, NgClass } from '@angular/common';
3
3
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
4
4
  import { take } from 'rxjs/operators';
5
- import { convertToDateObject, createGroupsInArray, getMonthDetails, getMonthsNames, getYears, isDateBetweenMinMax, isDateDisabled, isDateInRangeDisabled, tryDate } from '../calendar.utils';
5
+ import { convertToDateObject, createGroupsInArray, equalDates, getMonthDetails, getMonthsNames, getYears, isDateDisabled, isDateInRangeDisabled } from '../calendar.utils';
6
+ import { CalendarService } from '../calendar.service';
6
7
  import { CalendarWeekdayPipe } from './calendar-weekday.pipe';
7
8
  import { CalendarClassYearPipe } from './calendar-class-year.pipe';
8
9
  import { CalendarClassMonthPipe } from './calendar-class-month.pipe';
@@ -13,16 +14,38 @@ import { CalendarClassDayPipe } from './calendar-class-day.pipe';
13
14
  import { CalendarClassRowPipe } from './calendar-class-row.pipe';
14
15
  import { CalendarRowDirective } from './calendar-row.directive';
15
16
  import * as i0 from "@angular/core";
16
- import * as i1 from "../calendar.service";
17
17
  export class CalendarMonthComponent {
18
18
  #destroyRef;
19
- constructor(calendarService) {
20
- this.calendarService = calendarService;
19
+ #calendarService;
20
+ constructor() {
21
21
  this.#destroyRef = inject(DestroyRef);
22
- this.addMonths = 0;
23
- this._startDate = null;
24
- this._endDate = null;
25
- this._disabledDates = [];
22
+ this.#calendarService = inject(CalendarService);
23
+ this.pageIndex = input(0, { transform: numberAttribute });
24
+ this.addMonths = computed(() => {
25
+ const view = this.view();
26
+ const pageIndex = this.pageIndex();
27
+ return pageIndex * (view === 'years' ? 144 : view === 'months' ? 12 : 1);
28
+ });
29
+ /**
30
+ * Initial selected date.
31
+ * @type (Date | null)
32
+ */
33
+ this.startDate = signal(null, { equal: equalDates });
34
+ /**
35
+ * Initial selected to date (range).
36
+ * @type Date | null
37
+ */
38
+ this.endDate = signal(null, { equal: equalDates });
39
+ this.datesEffect = effect(() => {
40
+ const startDate = this.startDate();
41
+ const endDate = startDate && this.range() ? this.endDate() : null;
42
+ this.#calendarService.update({ startDate: startDate, endDate: endDate });
43
+ }, { allowSignalWrites: true });
44
+ /**
45
+ * Specify the list of dates that cannot be selected.
46
+ * @type Date[] | Date[][]
47
+ */
48
+ this.disabledDates = signal([]);
26
49
  /**
27
50
  * Sets the day of start week.
28
51
  * - 0 - Sunday,
@@ -33,199 +56,120 @@ export class CalendarMonthComponent {
33
56
  * - 5 - Friday,
34
57
  * - 6 - Saturday,
35
58
  */
36
- this.firstDayOfWeek = 1;
37
- this.#locale = signal('default');
59
+ this.firstDayOfWeek = signal(1);
60
+ /**
61
+ * Sets the default locale for components. If not set, it is inherited from the browser.
62
+ * @default 'default'
63
+ */
64
+ this.locale = signal('default');
38
65
  /**
39
66
  * Allow range selection.
40
67
  * @type boolean
41
68
  * @default false
42
69
  */
43
- this.range = false;
70
+ this.range = signal(false);
44
71
  /**
45
72
  * Set length or format of day name.
46
73
  * @type number | 'long' | 'narrow' | 'short'
47
74
  * @default 'short'
48
75
  */
49
- this.weekdayFormat = 'short';
50
- this.#view = signal('days');
51
- this._maxDate = null;
52
- this._minDate = null;
76
+ this.weekdayFormat = signal('short');
77
+ /**
78
+ * Set calendar view.
79
+ * @type 'days' | 'months' | 'years'
80
+ * @default 'days'
81
+ */
82
+ this.view = signal('days');
83
+ /**
84
+ * Max selectable date.
85
+ */
86
+ this.maxDate = signal(null, { equal: equalDates });
87
+ /**
88
+ * Min selectable date.
89
+ */
90
+ this.minDate = signal(null, { equal: equalDates });
53
91
  this.listOfMonths = computed(() => {
54
- return createGroupsInArray(getMonthsNames(this.#locale(), this.calendarDate$$().getFullYear()), 4);
92
+ return createGroupsInArray(getMonthsNames(this.locale(), this.date().getFullYear()), 4);
93
+ });
94
+ this.listOfYears = computed(() => createGroupsInArray(getYears(this.date().getFullYear()), 4));
95
+ /**
96
+ * Default date of the component
97
+ * @type Date
98
+ */
99
+ this.calendarDate = signal(new Date(), { equal: equalDates });
100
+ this.date = computed(() => {
101
+ const date = this.calendarDate();
102
+ return new Date(date.getFullYear(), date.getMonth() + this.addMonths(), 1, 0, 0, 0, 0);
103
+ }, { equal: (a, b) => a.getTime() === b.getTime() });
104
+ this.calendarDateEffect = effect(() => {
105
+ this.#calendarService.update({ calendarDate: this.calendarDate() });
106
+ }, { allowSignalWrites: true });
107
+ this.dateFilter = signal(undefined);
108
+ this.dayFormat = signal('numeric');
109
+ this.selectAdjacentDays = signal(false);
110
+ this.showAdjacentDays = signal(true);
111
+ this.selectionType = signal('day');
112
+ this.showWeekNumber = signal(false);
113
+ this.weekNumbersLabel = signal('');
114
+ this.monthDetails = computed(() => {
115
+ const date = this.date();
116
+ return getMonthDetails(date.getFullYear(), date.getMonth(), this.firstDayOfWeek());
117
+ });
118
+ this.weekDays = computed(() => {
119
+ const monthDetails = this.monthDetails();
120
+ return monthDetails[0].days;
55
121
  });
56
- this.listOfYears = computed(() => createGroupsInArray(getYears(this.calendarDate$$().getFullYear()), 4));
57
- this.calendarDate$$ = signal(new Date());
58
- this.#selectionType = signal('month');
59
- this.showWeekNumber = true;
60
- this.isDateInRangeDisabled = isDateInRangeDisabled;
61
- this.isDateBetweenMinMax = isDateBetweenMinMax;
62
122
  this.calendarStateSubscribe();
63
123
  }
64
- /**
65
- * Initial selected date.
66
- * @type (Date | null)
67
- */
68
- set startDate(value) {
69
- const date = !!value ? tryDate(value, 'startDate') : null;
70
- if (this._startDate?.getTime() !== date?.getTime()) {
71
- this._startDate = date;
72
- this.calendarService.update({ startDate: this._startDate });
73
- }
74
- }
75
- get startDate() {
76
- return this._startDate;
77
- }
78
- /**
79
- * Initial selected to date (range).
80
- * @type Date | null
81
- */
82
- set endDate(value) {
83
- const date = !!value ? tryDate(value, 'endDate') : null;
84
- if (this._endDate?.getTime() !== date?.getTime()) {
85
- this._endDate = date;
86
- this.calendarService.update({ endDate: this._endDate });
87
- }
88
- }
89
- get endDate() {
90
- return this._endDate;
91
- }
92
- /**
93
- * Specify the list of dates that cannot be selected.
94
- * @type Date[] | Date[][]
95
- */
96
- set disabledDates(value) {
97
- this._disabledDates = value;
98
- }
99
- get disabledDates() {
100
- return this._disabledDates;
101
- }
102
- /**
103
- * Sets the default locale for components. If not set, it is inherited from the browser.
104
- * @default 'default'
105
- */
106
- set locale(value) {
107
- this.#locale.set(value);
108
- // this.listOfMonths = createGroupsInArray(getMonthsNames(value), 4);
109
- }
110
- get locale() {
111
- return this.#locale();
112
- }
113
- #locale;
114
- /**
115
- * Set calendar view.
116
- * @type 'days' | 'months' | 'years'
117
- * @default 'days'
118
- */
119
- set view(value) {
120
- this.#view.set(value);
121
- }
122
- get view() {
123
- return this.#view();
124
- }
125
- #view;
126
- /**
127
- * Max selectable date.
128
- */
129
- set maxDate(value) {
130
- this._maxDate = value ? tryDate(value, 'maxDate') : null;
131
- }
132
- get maxDate() {
133
- return this._maxDate;
134
- }
135
- /**
136
- * Min selectable date.
137
- */
138
- set minDate(value) {
139
- this._minDate = value ? tryDate(value, 'minDate') : null;
140
- }
141
- get minDate() {
142
- return this._minDate;
143
- }
144
- /**
145
- * Default date of the component
146
- * @type Date
147
- */
148
- set calendarDate(value) {
149
- const _value = new Date(tryDate(value ?? this.startDate, 'calendarDate'));
150
- if (!!_value && this.calendarDate$$().getTime() !== _value.getTime()) {
151
- this.calendarDate$$.set(new Date(new Date(_value.setDate(1)).setHours(0, 0, 0, 0)));
152
- this.setMonthDetails(this.date);
153
- this.calendarService.update({ calendarDate: this.calendarDate$$() });
154
- }
155
- }
156
- get calendarDate() {
157
- return this.calendarDate$$();
158
- }
159
- get date() {
160
- return new Date(this.calendarDate?.getFullYear(), this.calendarDate?.getMonth() + this.addMonths);
161
- }
162
- set selectionType(value) {
163
- this.#selectionType.set(value);
164
- }
165
- get selectionType() {
166
- return this.#selectionType();
167
- }
168
- #selectionType;
169
- get monthDetails() {
170
- return this._monthDetails;
171
- }
172
- get weekDays() {
173
- return this.monthDetails[0].days;
174
- }
175
- ngOnInit() {
176
- this.setMonthDetails(this.date);
177
- }
178
- setMonthDetails(date = this.date) {
179
- this._monthDetails = getMonthDetails(date.getFullYear(), date.getMonth(), this.firstDayOfWeek);
180
- }
181
124
  yearNumber(year) {
182
- return new Date(year, 0).toLocaleDateString(this.locale, { year: 'numeric' });
125
+ return new Date(year, 0).toLocaleDateString(this.locale(), { year: 'numeric' });
183
126
  }
184
127
  isDateDisabled(date) {
185
- if (this.selectionType === 'year') {
186
- const minDate = this.minDate ? new Date(this.minDate.getFullYear(), 0, 1, 0, 0, 0, 0) : null;
187
- const maxDate = this.maxDate ? new Date(this.maxDate.getFullYear(), 11, 31, 0, 0, 0, 0) : null;
188
- return (isDateDisabled(date, minDate, maxDate, this.disabledDates) || (this.dateFilter ? !this.dateFilter(date) : false));
128
+ const selectionType = this.selectionType();
129
+ const disabledDates = this.disabledDates();
130
+ const dateFilterFn = this.dateFilter();
131
+ const maxDate = this.maxDate();
132
+ const minDate = this.minDate();
133
+ if (selectionType === 'year') {
134
+ const min = minDate ? new Date(minDate.getFullYear(), 0, 1, 0, 0, 0, 0) : null;
135
+ const max = maxDate ? new Date(maxDate.getFullYear(), 11, 31, 0, 0, 0, 0) : null;
136
+ return isDateDisabled(date, min, max, disabledDates) || (dateFilterFn ? !dateFilterFn(date) : false);
189
137
  }
190
- if (this.selectionType === 'month') {
191
- const minDate = this.minDate
192
- ? new Date(this.minDate.getFullYear(), this.minDate.getMonth(), 1, 0, 0, 0, 0)
193
- : null;
194
- const maxDate = this.maxDate
195
- ? new Date(this.maxDate.getFullYear(), this.maxDate.getMonth() + 1, 1, 0, 0, -1, 0)
196
- : null;
197
- return (isDateDisabled(date, minDate, maxDate, this.disabledDates) || (this.dateFilter ? !this.dateFilter(date) : false));
138
+ if (selectionType === 'month') {
139
+ const min = minDate ? new Date(minDate.getFullYear(), minDate.getMonth(), 1, 0, 0, 0, 0) : null;
140
+ const max = maxDate ? new Date(maxDate.getFullYear(), maxDate.getMonth() + 1, 1, 0, 0, -1, 0) : null;
141
+ return isDateDisabled(date, min, max, disabledDates) || (dateFilterFn ? !dateFilterFn(date) : false);
198
142
  }
199
- return (isDateDisabled(date, this.minDate, this.maxDate, this.disabledDates) ||
200
- (this.dateFilter ? !this.dateFilter(date) : false));
143
+ return isDateDisabled(date, minDate, maxDate, disabledDates) || (dateFilterFn ? !dateFilterFn(date) : false);
201
144
  }
202
145
  calendarCellTitle(date) {
203
- return date.toLocaleDateString(this.locale);
146
+ return date.toLocaleDateString(this.locale());
204
147
  }
205
148
  handleCellMouseEnter(hoverDate) {
206
149
  if (!hoverDate) {
207
150
  return;
208
151
  }
209
- const updateHoverValue = (['day', 'week'].includes(this.selectionType) && this.view === 'days') ||
210
- (['month'].includes(this.selectionType) && this.view === 'months') ||
211
- (['year'].includes(this.selectionType) && this.view === 'years');
152
+ const selectionType = this.selectionType();
153
+ const updateHoverValue = (['day', 'week'].includes(selectionType) && this.view() === 'days') ||
154
+ (['month'].includes(selectionType) && this.view() === 'months') ||
155
+ (['year'].includes(selectionType) && this.view() === 'years');
212
156
  // if (updateHoverValue) {
213
157
  const hoverValue = this.isDateDisabled(hoverDate) || !updateHoverValue ? null : hoverDate;
214
- this.calendarService.update({ hoverDate: hoverValue });
158
+ this.#calendarService.update({ hoverDate: hoverValue });
215
159
  // }
216
160
  }
217
161
  handleYearCellClick(year) {
218
- if (this.selectionType === 'year') {
162
+ if (this.selectionType() === 'year') {
219
163
  let date = new Date(year, 0, 1, 0, 0, 0, 0);
220
- if (this.range && this.startDate && !this.endDate) {
164
+ if (this.range() && this.startDate() && !this.endDate()) {
221
165
  date = new Date(date.getFullYear(), 12, 1, 0, 0, -1, 0);
222
166
  }
223
167
  this.handleDayCellClick(date);
224
168
  return;
225
169
  }
226
170
  const calendarDate = new Date(year, 0, 1, 0, 0, 0, 0);
227
- this.view = 'months';
228
- this.calendarService.update({ view: this.view, calendarDate: calendarDate });
171
+ this.view.set('months');
172
+ this.#calendarService.update({ view: this.view(), calendarDate: calendarDate });
229
173
  }
230
174
  handleYearCellKeyUp($event, date) {
231
175
  if (!date) {
@@ -257,26 +201,28 @@ export class CalendarMonthComponent {
257
201
  if (!value) {
258
202
  return;
259
203
  }
260
- if (this.selectionType === 'month') {
204
+ if (this.selectionType() === 'month') {
261
205
  let date = new Date(value.getFullYear(), value.getMonth(), 1, 0, 0, 0, 0);
262
- if (this.range && this.startDate && !this.endDate) {
206
+ if (this.range() && this.startDate() && !this.endDate()) {
263
207
  date = new Date(date.getFullYear(), date.getMonth() + 1, 1, 0, 0, -1, 0);
264
208
  }
265
209
  this.handleDayCellClick(date);
266
210
  return;
267
211
  }
268
- this.setCalendarPage(0, 0, value.getMonth() - this.addMonths);
269
- this.view = 'days';
270
- this.calendarService.update({ view: this.view });
212
+ this.view.set('days');
213
+ this.#calendarService.update({ view: this.view() });
214
+ // this.setCalendarPage(0, 0, value.getMonth() - this.addMonths());
215
+ const calendarDate = new Date(value.getFullYear(), value.getMonth() - this.addMonths(), 1, 0, 0, 0, 0);
216
+ this.#calendarService.update({ calendarDate: calendarDate });
271
217
  }
272
218
  setCalendarPage(years, months = 0, setMonth) {
273
- const year = this.date.getFullYear();
274
- const month = this.date.getMonth();
219
+ const year = this.date().getFullYear();
220
+ const month = this.date().getMonth();
275
221
  const d = new Date(year, month, 1, 0, 0, 0, 0);
276
222
  years && d.setFullYear(d.getFullYear() + years);
277
223
  months && d.setMonth(d.getMonth() + months);
278
224
  typeof setMonth === 'number' && d.setMonth(setMonth);
279
- this.calendarService.update({ calendarDate: d });
225
+ this.#calendarService.update({ calendarDate: d });
280
226
  }
281
227
  handleDayCellKeyDown($event, date) {
282
228
  if (!date) {
@@ -288,22 +234,23 @@ export class CalendarMonthComponent {
288
234
  $event.preventDefault();
289
235
  this.handleCellMouseEnter(date);
290
236
  const eventKey = $event.key === 'Tab' ? ($event.shiftKey ? 'ArrowLeft' : 'ArrowRight') : $event.key;
291
- if (this.maxDate &&
292
- date >= convertToDateObject(this.maxDate, this.selectionType) &&
237
+ const selectionType = this.selectionType();
238
+ const view = this.view();
239
+ const maxDate = this.maxDate();
240
+ if (maxDate &&
241
+ date >= convertToDateObject(maxDate, selectionType) &&
293
242
  ['ArrowRight', 'ArrowDown'].includes(eventKey)) {
294
243
  return;
295
244
  }
296
- if (this.minDate &&
297
- date <= convertToDateObject(this.minDate, this.selectionType) &&
298
- ['ArrowLeft', 'ArrowUp'].includes(eventKey)) {
245
+ const minDate = this.minDate();
246
+ if (minDate && date <= convertToDateObject(minDate, selectionType) && ['ArrowLeft', 'ArrowUp'].includes(eventKey)) {
299
247
  return;
300
248
  }
301
249
  let element = $event.target;
302
- if (this.selectionType === 'week' && this.view === 'days' && element.tabIndex === -1) {
250
+ if (selectionType === 'week' && view === 'days' && element.tabIndex === -1) {
303
251
  element = element.closest('tr[tabindex="0"]');
304
252
  }
305
- const elements = ['week'].includes(this.selectionType) && this.view === 'days' ? this.calendarRows : this.calendarDays;
306
- // @ts-ignore
253
+ const elements = ['week'].includes(selectionType) && view === 'days' ? this.calendarRows : this.calendarDays;
307
254
  const list = elements
308
255
  .toArray()
309
256
  .map((calendarCell) => calendarCell.elementRef.nativeElement)
@@ -319,8 +266,8 @@ export class CalendarMonthComponent {
319
266
  const gap = {
320
267
  ArrowRight: 1,
321
268
  ArrowLeft: -1,
322
- ArrowUp: this.selectionType === 'week' && this.view === 'days' ? -1 : this.view === 'days' ? -7 : -3,
323
- ArrowDown: this.selectionType === 'week' && this.view === 'days' ? 1 : this.view === 'days' ? 7 : 3
269
+ ArrowUp: selectionType === 'week' && view === 'days' ? -1 : view === 'days' ? -7 : -3,
270
+ ArrowDown: selectionType === 'week' && view === 'days' ? 1 : view === 'days' ? 7 : 3
324
271
  };
325
272
  if ((eventKey === 'ArrowRight' && last) ||
326
273
  (eventKey === 'ArrowDown' && toBoundary.end < gap.ArrowDown) ||
@@ -332,7 +279,7 @@ export class CalendarMonthComponent {
332
279
  const _list = change
333
280
  .toArray()
334
281
  // .filter(element => this.selectionType === 'week' ? element?.elementRef.nativeElement.tabIndex === 0 : element?.elementRef.nativeElement.classList.contains('current'));
335
- .filter((element) => element?.elementRef.nativeElement.tabIndex === 0);
282
+ .filter((directive) => directive?.elementRef.nativeElement.tabIndex === 0);
336
283
  if (_list.length) {
337
284
  let dayToFocus;
338
285
  switch (eventKey) {
@@ -359,16 +306,16 @@ export class CalendarMonthComponent {
359
306
  }
360
307
  }
361
308
  });
362
- if (this.view === 'days') {
363
- this.setCalendarPage(0, ['ArrowRight', 'ArrowDown'].includes(eventKey) ? 1 : -1);
364
- }
365
- if (this.view === 'months') {
366
- this.setCalendarPage(['ArrowRight', 'ArrowDown'].includes(eventKey) ? 1 : -1);
367
- // this.calendarDays?.reset(this.calendarDays.toArray());
368
- // this.calendarDays?.notifyOnChanges();
369
- }
370
- if (this.view === 'years') {
371
- this.setCalendarPage(['ArrowRight', 'ArrowDown'].includes(eventKey) ? 12 : -12);
309
+ switch (view) {
310
+ case 'days':
311
+ this.setCalendarPage(0, ['ArrowRight', 'ArrowDown'].includes(eventKey) ? 1 : -1);
312
+ break;
313
+ case 'months':
314
+ this.setCalendarPage(['ArrowRight', 'ArrowDown'].includes(eventKey) ? 1 : -1);
315
+ break;
316
+ case 'years':
317
+ this.setCalendarPage(['ArrowRight', 'ArrowDown'].includes(eventKey) ? 12 : -12);
318
+ break;
372
319
  }
373
320
  return;
374
321
  }
@@ -393,7 +340,7 @@ export class CalendarMonthComponent {
393
340
  }
394
341
  }
395
342
  handleCellMouseLeave() {
396
- this.calendarService.update({ hoverDate: null });
343
+ this.#calendarService.update({ hoverDate: null });
397
344
  }
398
345
  handleDayCellKeyUp($event, date) {
399
346
  if (['Space', 'Enter'].includes($event.code)) {
@@ -406,67 +353,66 @@ export class CalendarMonthComponent {
406
353
  }
407
354
  }
408
355
  handleDayCellClick(date) {
409
- if (this.selectionType === 'day' && this.isDateDisabled(date)) {
356
+ if (this.selectionType() === 'day' && this.isDateDisabled(date)) {
410
357
  return;
411
358
  }
412
- if (!this.range) {
413
- this.endDate = null;
414
- this.startDate = date;
359
+ if (!this.range()) {
360
+ this.endDate.set(null);
361
+ this.startDate.set(date);
415
362
  return;
416
363
  }
417
- if (this.startDate && this.endDate) {
418
- this.calendarDate = new Date(date.getFullYear(), date.getMonth(), 1, 0, 0, 0, 0);
419
- this.endDate = null;
420
- this.startDate = null;
364
+ const startDate = this.startDate();
365
+ const endDate = this.endDate();
366
+ if (startDate && endDate) {
367
+ this.startDate.set(null);
368
+ this.endDate.set(null);
421
369
  return;
422
370
  }
423
- if (!!this.startDate && !this.endDate) {
424
- if (this.startDate && date < this.startDate) {
425
- this.endDate = null;
426
- this.startDate = date;
371
+ if (!!startDate && !endDate) {
372
+ if (startDate && date < startDate) {
373
+ this.endDate.set(null);
374
+ this.startDate.set(date);
427
375
  }
428
376
  else {
429
- this.endDate = date;
377
+ const addDays = this.selectionType() !== 'week' ? 1 : 7;
378
+ this.endDate.set(new Date(date.getFullYear(), date.getMonth(), date.getDate() + addDays, 0, 0, -1, 0));
430
379
  }
431
380
  }
432
381
  else {
433
- this.endDate = null;
434
- this.startDate = date;
382
+ this.endDate.set(null);
383
+ this.startDate.set(date);
435
384
  }
436
- if (this.startDate && this.endDate) {
437
- // @ts-ignore
438
- if (isDateInRangeDisabled(this.startDate, this.endDate, this.disabledDates)) {
439
- this.startDate = null;
440
- this.endDate = null;
441
- return;
385
+ {
386
+ const startDate = this.startDate();
387
+ const endDate = this.endDate();
388
+ if (startDate && endDate) {
389
+ const dateFilterFn = this.dateFilter();
390
+ if (isDateInRangeDisabled(startDate, endDate, this.disabledDates(), dateFilterFn)) {
391
+ this.startDate.set(null);
392
+ this.endDate.set(null);
393
+ return;
394
+ }
442
395
  }
443
- // let date = new Date(this.startDate);
444
- // while (date < this.endDate) {
445
- // date.setDate(date.getDate() + 1);
446
- // if (this.isDateDisabled(date)) {
447
- // this.startDate = null;
448
- // this.endDate = null;
449
- // break;
450
- // }
451
- // }
452
396
  }
453
397
  }
454
398
  calendarStateSubscribe() {
455
- this.calendarService.calendarState$.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe((state) => {
399
+ this.#calendarService.calendarState$.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe((state) => {
456
400
  const keys = Object.keys(state);
457
401
  for (const key of keys) {
458
- // if (key in this) {
459
- // @ts-ignore
460
- this[key] = state[key];
461
- // }
402
+ if (key in this) {
403
+ // @ts-ignore
404
+ const isWritableSignal = typeof this[key] === 'function' && typeof this[key].set === 'function';
405
+ // @ts-ignore
406
+ isWritableSignal ? this[key].set(state[key]) : (this[key] = state[key]);
407
+ }
462
408
  }
463
409
  });
464
410
  }
465
411
  getMonthStart(index) {
466
- return new Date(this.calendarDate.getFullYear(), index, 1, 0, 0, 0, 0);
412
+ return new Date(this.calendarDate().getFullYear(), index + this.addMonths(), 1, 0, 0, 0, 0);
467
413
  }
468
414
  getMonthEnd(index) {
469
- return new Date(this.calendarDate.getFullYear(), index + 1, 1, 0, 0, -1, 0);
415
+ return new Date(this.calendarDate().getFullYear(), index + 1 + this.addMonths(), 1, 0, 0, -1, 0);
470
416
  }
471
417
  getYearStart(year) {
472
418
  return new Date(year, 0, 1);
@@ -474,10 +420,10 @@ export class CalendarMonthComponent {
474
420
  getYearEnd(year) {
475
421
  return new Date(year, 11, 1, 0, 0, -1, 0);
476
422
  }
477
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: CalendarMonthComponent, deps: [{ token: i1.CalendarService }], target: i0.ɵɵFactoryTarget.Component }); }
478
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.6", type: CalendarMonthComponent, isStandalone: true, selector: "c-calendar-month", inputs: { addMonths: "addMonths", startDate: "startDate", endDate: "endDate", disabledDates: "disabledDates", firstDayOfWeek: ["firstDayOfWeek", "firstDayOfWeek", numberAttribute], locale: "locale", range: ["range", "range", booleanAttribute], weekdayFormat: "weekdayFormat", view: "view", maxDate: "maxDate", minDate: "minDate", calendarDate: "calendarDate" }, viewQueries: [{ propertyName: "calendarDays", predicate: CalendarDayDirective, descendants: true }, { propertyName: "calendarRows", predicate: CalendarRowDirective, descendants: true }], exportAs: ["cCalendarMonth"], ngImport: i0, template: "<table>\n @if (view === 'days') {\n <thead>\n <tr>\n @if (showWeekNumber) {\n <th class=\"calendar-cell\">\n <div class=\"calendar-header-cell-inner\">{{ weekNumbersLabel }}</div>\n </th>\n }\n @for (weekDay of weekDays; track weekDay.date; let i = $index) {\n @let date = weekDay.date ;\n <th class=\"calendar-cell\" abbr=\"{{date | calendarWeekday:'long':locale}}\">\n <div class=\"calendar-header-cell-inner\">\n {{ date | calendarWeekday:weekdayFormat:locale }}\n </div>\n </th>\n }\n </tr>\n </thead>\n }\n <tbody (mouseleave)=\"handleCellMouseLeave()\">\n @switch (view) {\n @case ('years') {\n @for (yearsRow of listOfYears(); track yearsRow; let rowIdx = $index) {\n <tr>\n @for (year of yearsRow; track year; let idx = $index) {\n <td\n #calendarYear=\"cCalendarDay\"\n (click)=\"!calendarYear.disabled$() && handleYearCellClick(year)\"\n (keydown)=\"calendarYear.date() && handleDayCellKeyDown($event, calendarYear.date())\"\n (keyup)=\"handleYearCellKeyUp($event, calendarYear.date())\"\n (mouseenter)=\"calendarYear.date() && handleCellMouseEnter(calendarYear.date())\"\n [attr.aria-label]=\"calendarYear.date()?.getFullYear()\"\n [date]=\"getYearStart(year)\"\n [ngClass]=\"year | calendarClassYear\"\n [tabindex]=\"calendarYear.disabled$() ? -1 : 0\"\n cCalendarDay\n >\n <div class=\"calendar-cell-inner\">\n {{ yearNumber(year) }}\n </div>\n </td>\n }\n </tr>\n }\n }\n @case ('months') {\n @for (monthsRow of listOfMonths(); track monthsRow; let rowIdx = $index) {\n <tr>\n @for (month of monthsRow; track month; let idx = $index) {\n <td\n #calendarMonth=\"cCalendarDay\"\n (click)=\"!calendarMonth.disabled$() && handleMonthCellClick(calendarMonth.date())\"\n (keydown)=\"calendarMonth.date() && handleDayCellKeyDown($event, calendarMonth.date())\"\n (keyup)=\"handleMonthCellKeyUp($event, calendarMonth.date())\"\n (mouseenter)=\"calendarMonth.date() && handleCellMouseEnter(calendarMonth.date())\"\n [attr.aria-label]=\"calendarMonth.date()?.getFullYear()+' '+month.month\"\n [date]=\"getMonthStart(rowIdx*3+idx)\"\n [ngClass]=\"calendarDate | calendarClassMonth:(rowIdx*3+idx)\"\n [tabindex]=\"calendarMonth.disabled$() ? -1 : 0\"\n cCalendarDay\n >\n <div class=\"calendar-cell-inner\">\n {{ month.month }}\n </div>\n </td>\n }\n </tr>\n }\n\n }\n @default {\n @for (week of monthDetails; track week; let i = $index) {\n <tr #calendarRow=\"cCalendarRow\"\n (click)=\"selectionType === 'week' && (calendarRow.current) && calendarRow.date && handleDayCellClick(calendarRow.date)\"\n (keydown)=\"selectionType === 'week' && (calendarRow.current) && calendarRow.date && handleDayCellKeyDown($event, calendarRow.date)\"\n (keyup)=\"selectionType === 'week' && (calendarRow.current) && calendarRow.date && handleDayCellKeyUp($event, calendarRow.date)\"\n (mouseenter)=\"selectionType === 'week' && calendarRow.date && handleCellMouseEnter(calendarRow.date)\"\n [cCalendarRow]=\"week\"\n >\n @if (showWeekNumber) {\n <th class=\"calendar-cell-week-number\">\n {{ week.weekNumber === 0 ? 53 : week.weekNumber }}\n </th>\n }\n @for (dateObj of week.days; track dateObj.date; let idx = $index) {\n @if (dateObj.month === 'current' || showAdjacentDays) {\n <td #calendarCell=\"cCalendarDay\"\n (click)=\"selectionType === 'day' && (dateObj.month === 'current' || selectAdjacentDays) && handleDayCellClick(dateObj.date)\"\n (keydown)=\"selectionType === 'day' && (dateObj.month === 'current' || selectAdjacentDays) && handleDayCellKeyDown($event, dateObj.date)\"\n (keyup)=\"selectionType === 'day' && (dateObj.month === 'current' || selectAdjacentDays) && handleDayCellKeyUp($event, dateObj.date)\"\n (mouseenter)=\"selectionType === 'day' && (dateObj.month === 'current' || selectAdjacentDays) && handleCellMouseEnter(dateObj.date)\"\n [attr.aria-label]=\"dateObj.date | calendarDayTitle:locale\"\n [date]=\"dateObj.date\"\n [month]=\"dateObj.month\"\n [ngClass]=\"dateObj | calendarClassDay:{minDate, maxDate, disabledDates, dateFilter}\"\n [tabindex]=\"selectionType === 'day' && (dateObj.month === 'current' || selectAdjacentDays) && !isDateDisabled(dateObj.date) ? 0 : -1\"\n cCalendarDay\n >\n <div class=\"calendar-cell-inner\">\n {{ dateObj.date | calendarDay:dayFormat:locale }}\n </div>\n </td>\n } @else {\n <td class=\"calendar-cell\"></td>\n }\n }\n </tr>\n }\n\n }\n }\n\n </tbody>\n</table>\n\n", styles: [".btn-transparent:focus-visible{outline:-webkit-focus-ring-color auto 1px}.calendar-row:focus-visible{box-shadow:var(--cui-calendar-cell-focus-box-shadow);border-radius:.375rem}.calendar-row:focus-within:not([tabindex=\"-1\"]){outline:0;box-shadow:var(--cui-calendar-cell-focus-box-shadow);border-radius:.375rem;outline-style:auto!important}.calendar-row:focus:not([tabindex=\"-1\"]){outline:0;box-shadow:var(--cui-calendar-cell-focus-box-shadow);border-radius:.375rem;outline-style:auto!important}.calendar-cell:focus:not(:focus-visible):not([tabindex=\"-1\"]){box-shadow:var(--cui-calendar-cell-focus-box-shadow);border-radius:.375rem}\n"], dependencies: [{ kind: "directive", type: CalendarDayDirective, selector: "[cCalendarDay]", inputs: ["date", "month"], exportAs: ["cCalendarDay"] }, { kind: "pipe", type: CalendarDayPipe, name: "calendarDay" }, { kind: "pipe", type: CalendarDayTitlePipe, name: "calendarDayTitle" }, { kind: "directive", type: CalendarRowDirective, selector: "[cCalendarRow]", inputs: ["cCalendarRow"], exportAs: ["cCalendarRow"] }, { kind: "pipe", type: CalendarClassDayPipe, name: "calendarClassDay" }, { kind: "pipe", type: CalendarClassMonthPipe, name: "calendarClassMonth" }, { kind: "pipe", type: CalendarClassYearPipe, name: "calendarClassYear" }, { kind: "pipe", type: CalendarWeekdayPipe, name: "calendarWeekday" }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
423
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: CalendarMonthComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
424
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.8", type: CalendarMonthComponent, isStandalone: true, selector: "c-calendar-month", inputs: { pageIndex: { classPropertyName: "pageIndex", publicName: "pageIndex", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "calendarDays", predicate: CalendarDayDirective, descendants: true }, { propertyName: "calendarRows", predicate: CalendarRowDirective, descendants: true }], exportAs: ["cCalendarMonth"], ngImport: i0, template: "<table>\n @if (view() === 'days') {\n <thead>\n <tr>\n @if (showWeekNumber()) {\n <th class=\"calendar-cell\">\n <div class=\"calendar-header-cell-inner\">{{ weekNumbersLabel() }}</div>\n </th>\n }\n @for (weekDay of weekDays(); track weekDay.date; let i = $index) {\n @let date = weekDay.date ;\n <th class=\"calendar-cell\" abbr=\"{{date | calendarWeekday:'long':locale()}}\">\n <div class=\"calendar-header-cell-inner\">\n {{ date | calendarWeekday:weekdayFormat():locale() }}\n </div>\n </th>\n }\n </tr>\n </thead>\n }\n <tbody (mouseleave)=\"handleCellMouseLeave()\">\n @switch (view()) {\n @case ('years') {\n @for (yearsRow of listOfYears(); track yearsRow[0]; let rowIdx = $index) {\n <tr>\n @for (year of yearsRow; track year; let idx = $index) {\n <td\n #calendarYear=\"cCalendarDay\"\n (click)=\"!calendarYear.disabled$() && handleYearCellClick(year)\"\n (keydown)=\"calendarYear.date() && handleDayCellKeyDown($event, calendarYear.date())\"\n (keyup)=\"handleYearCellKeyUp($event, calendarYear.date())\"\n (mouseenter)=\"calendarYear.date() && handleCellMouseEnter(calendarYear.date())\"\n [attr.aria-label]=\"calendarYear.date()?.getFullYear()\"\n [date]=\"getYearStart(year)\"\n [ngClass]=\"year | calendarClassYear\"\n [tabindex]=\"calendarYear.disabled$() ? -1 : 0\"\n cCalendarDay\n >\n <div class=\"calendar-cell-inner\">\n {{ yearNumber(year) }}\n </div>\n </td>\n }\n </tr>\n }\n }\n @case ('months') {\n @for (monthsRow of listOfMonths(); track monthsRow[0]; let rowIdx = $index) {\n <tr>\n @for (month of monthsRow; track month; let idx = $index) {\n @let monthStart = getMonthStart(rowIdx*3+idx);\n <td\n #calendarMonth=\"cCalendarDay\"\n (click)=\"!calendarMonth.disabled$() && handleMonthCellClick(calendarMonth.date())\"\n (keydown)=\"calendarMonth.date() && handleDayCellKeyDown($event, calendarMonth.date())\"\n (keyup)=\"handleMonthCellKeyUp($event, calendarMonth.date())\"\n (mouseenter)=\"calendarMonth.date() && handleCellMouseEnter(calendarMonth.date())\"\n [attr.aria-label]=\"calendarMonth.date()?.getFullYear()+' '+month.month\"\n [date]=\"monthStart\"\n [ngClass]=\"monthStart | calendarClassMonth:(rowIdx*3+idx)\"\n [tabindex]=\"calendarMonth.disabled$() ? -1 : 0\"\n cCalendarDay\n >\n <div class=\"calendar-cell-inner\">\n {{ month.month }}\n </div>\n </td>\n }\n </tr>\n }\n\n }\n @default {\n @let weekSelection = selectionType() === 'week';\n @let daySelection = selectionType() === 'day';\n @for (week of monthDetails(); track week.days[0]; let i = $index) {\n <tr #calendarRow=\"cCalendarRow\"\n (click)=\"weekSelection && (calendarRow.current) && calendarRow.date && handleDayCellClick(calendarRow.date)\"\n (keydown)=\"weekSelection && (calendarRow.current) && calendarRow.date && handleDayCellKeyDown($event, calendarRow.date)\"\n (keyup)=\"weekSelection && (calendarRow.current) && calendarRow.date && handleDayCellKeyUp($event, calendarRow.date)\"\n (mouseenter)=\"weekSelection && calendarRow.date && handleCellMouseEnter(calendarRow.date)\"\n [cCalendarRow]=\"week\"\n >\n @if (showWeekNumber()) {\n <th class=\"calendar-cell-week-number\">\n {{ week.weekNumber === 0 ? 53 : week.weekNumber }}\n </th>\n }\n @for (dateObj of week.days; track dateObj.date; let idx = $index) {\n @let currentMonth = dateObj.month === 'current';\n @if (currentMonth || showAdjacentDays()) {\n @let selectable = daySelection && (currentMonth || selectAdjacentDays());\n <td #calendarCell=\"cCalendarDay\"\n (click)=\"selectable && handleDayCellClick(dateObj.date)\"\n (keydown)=\"selectable && handleDayCellKeyDown($event, dateObj.date)\"\n (keyup)=\"selectable && handleDayCellKeyUp($event, dateObj.date)\"\n (mouseenter)=\"selectable && handleCellMouseEnter(dateObj.date)\"\n [attr.aria-label]=\"dateObj.date | calendarDayTitle:locale()\"\n [date]=\"dateObj.date\"\n [month]=\"dateObj.month\"\n [ngClass]=\"dateObj | calendarClassDay:{minDate: minDate(), maxDate: maxDate(), disabledDates: disabledDates(), dateFilter: dateFilter()}\"\n [tabindex]=\"selectable && !isDateDisabled(dateObj.date) ? 0 : -1\"\n cCalendarDay\n >\n <div class=\"calendar-cell-inner\">\n {{ dateObj.date | calendarDay:dayFormat():locale() }}\n </div>\n </td>\n } @else {\n <td class=\"calendar-cell\"></td>\n }\n }\n </tr>\n }\n }\n }\n </tbody>\n</table>\n\n", styles: [".btn-transparent:focus-visible{outline:-webkit-focus-ring-color auto 1px}.calendar-row:focus-visible{box-shadow:var(--cui-calendar-cell-focus-box-shadow);border-radius:.375rem}.calendar-row:focus-within:not([tabindex=\"-1\"]){outline:0;box-shadow:var(--cui-calendar-cell-focus-box-shadow);border-radius:.375rem;outline-style:auto!important}.calendar-row:focus:not([tabindex=\"-1\"]){outline:0;box-shadow:var(--cui-calendar-cell-focus-box-shadow);border-radius:.375rem;outline-style:auto!important}.calendar-cell:focus:not(:focus-visible):not([tabindex=\"-1\"]){box-shadow:var(--cui-calendar-cell-focus-box-shadow);border-radius:.375rem}.calendar-cell-inner{-webkit-user-select:none;user-select:none}\n"], dependencies: [{ kind: "directive", type: CalendarDayDirective, selector: "[cCalendarDay]", inputs: ["date", "month"], exportAs: ["cCalendarDay"] }, { kind: "pipe", type: CalendarDayPipe, name: "calendarDay" }, { kind: "pipe", type: CalendarDayTitlePipe, name: "calendarDayTitle" }, { kind: "directive", type: CalendarRowDirective, selector: "[cCalendarRow]", inputs: ["cCalendarRow"], exportAs: ["cCalendarRow"] }, { kind: "pipe", type: CalendarClassDayPipe, name: "calendarClassDay" }, { kind: "pipe", type: CalendarClassMonthPipe, name: "calendarClassMonth" }, { kind: "pipe", type: CalendarClassYearPipe, name: "calendarClassYear" }, { kind: "pipe", type: CalendarWeekdayPipe, name: "calendarWeekday" }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
479
425
  }
480
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: CalendarMonthComponent, decorators: [{
426
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: CalendarMonthComponent, decorators: [{
481
427
  type: Component,
482
428
  args: [{ selector: 'c-calendar-month', exportAs: 'cCalendarMonth', standalone: true, imports: [
483
429
  CalendarDayDirective,
@@ -491,38 +437,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.6", ngImpor
491
437
  CalendarWeekdayPipe,
492
438
  NgClass,
493
439
  AsyncPipe
494
- ], template: "<table>\n @if (view === 'days') {\n <thead>\n <tr>\n @if (showWeekNumber) {\n <th class=\"calendar-cell\">\n <div class=\"calendar-header-cell-inner\">{{ weekNumbersLabel }}</div>\n </th>\n }\n @for (weekDay of weekDays; track weekDay.date; let i = $index) {\n @let date = weekDay.date ;\n <th class=\"calendar-cell\" abbr=\"{{date | calendarWeekday:'long':locale}}\">\n <div class=\"calendar-header-cell-inner\">\n {{ date | calendarWeekday:weekdayFormat:locale }}\n </div>\n </th>\n }\n </tr>\n </thead>\n }\n <tbody (mouseleave)=\"handleCellMouseLeave()\">\n @switch (view) {\n @case ('years') {\n @for (yearsRow of listOfYears(); track yearsRow; let rowIdx = $index) {\n <tr>\n @for (year of yearsRow; track year; let idx = $index) {\n <td\n #calendarYear=\"cCalendarDay\"\n (click)=\"!calendarYear.disabled$() && handleYearCellClick(year)\"\n (keydown)=\"calendarYear.date() && handleDayCellKeyDown($event, calendarYear.date())\"\n (keyup)=\"handleYearCellKeyUp($event, calendarYear.date())\"\n (mouseenter)=\"calendarYear.date() && handleCellMouseEnter(calendarYear.date())\"\n [attr.aria-label]=\"calendarYear.date()?.getFullYear()\"\n [date]=\"getYearStart(year)\"\n [ngClass]=\"year | calendarClassYear\"\n [tabindex]=\"calendarYear.disabled$() ? -1 : 0\"\n cCalendarDay\n >\n <div class=\"calendar-cell-inner\">\n {{ yearNumber(year) }}\n </div>\n </td>\n }\n </tr>\n }\n }\n @case ('months') {\n @for (monthsRow of listOfMonths(); track monthsRow; let rowIdx = $index) {\n <tr>\n @for (month of monthsRow; track month; let idx = $index) {\n <td\n #calendarMonth=\"cCalendarDay\"\n (click)=\"!calendarMonth.disabled$() && handleMonthCellClick(calendarMonth.date())\"\n (keydown)=\"calendarMonth.date() && handleDayCellKeyDown($event, calendarMonth.date())\"\n (keyup)=\"handleMonthCellKeyUp($event, calendarMonth.date())\"\n (mouseenter)=\"calendarMonth.date() && handleCellMouseEnter(calendarMonth.date())\"\n [attr.aria-label]=\"calendarMonth.date()?.getFullYear()+' '+month.month\"\n [date]=\"getMonthStart(rowIdx*3+idx)\"\n [ngClass]=\"calendarDate | calendarClassMonth:(rowIdx*3+idx)\"\n [tabindex]=\"calendarMonth.disabled$() ? -1 : 0\"\n cCalendarDay\n >\n <div class=\"calendar-cell-inner\">\n {{ month.month }}\n </div>\n </td>\n }\n </tr>\n }\n\n }\n @default {\n @for (week of monthDetails; track week; let i = $index) {\n <tr #calendarRow=\"cCalendarRow\"\n (click)=\"selectionType === 'week' && (calendarRow.current) && calendarRow.date && handleDayCellClick(calendarRow.date)\"\n (keydown)=\"selectionType === 'week' && (calendarRow.current) && calendarRow.date && handleDayCellKeyDown($event, calendarRow.date)\"\n (keyup)=\"selectionType === 'week' && (calendarRow.current) && calendarRow.date && handleDayCellKeyUp($event, calendarRow.date)\"\n (mouseenter)=\"selectionType === 'week' && calendarRow.date && handleCellMouseEnter(calendarRow.date)\"\n [cCalendarRow]=\"week\"\n >\n @if (showWeekNumber) {\n <th class=\"calendar-cell-week-number\">\n {{ week.weekNumber === 0 ? 53 : week.weekNumber }}\n </th>\n }\n @for (dateObj of week.days; track dateObj.date; let idx = $index) {\n @if (dateObj.month === 'current' || showAdjacentDays) {\n <td #calendarCell=\"cCalendarDay\"\n (click)=\"selectionType === 'day' && (dateObj.month === 'current' || selectAdjacentDays) && handleDayCellClick(dateObj.date)\"\n (keydown)=\"selectionType === 'day' && (dateObj.month === 'current' || selectAdjacentDays) && handleDayCellKeyDown($event, dateObj.date)\"\n (keyup)=\"selectionType === 'day' && (dateObj.month === 'current' || selectAdjacentDays) && handleDayCellKeyUp($event, dateObj.date)\"\n (mouseenter)=\"selectionType === 'day' && (dateObj.month === 'current' || selectAdjacentDays) && handleCellMouseEnter(dateObj.date)\"\n [attr.aria-label]=\"dateObj.date | calendarDayTitle:locale\"\n [date]=\"dateObj.date\"\n [month]=\"dateObj.month\"\n [ngClass]=\"dateObj | calendarClassDay:{minDate, maxDate, disabledDates, dateFilter}\"\n [tabindex]=\"selectionType === 'day' && (dateObj.month === 'current' || selectAdjacentDays) && !isDateDisabled(dateObj.date) ? 0 : -1\"\n cCalendarDay\n >\n <div class=\"calendar-cell-inner\">\n {{ dateObj.date | calendarDay:dayFormat:locale }}\n </div>\n </td>\n } @else {\n <td class=\"calendar-cell\"></td>\n }\n }\n </tr>\n }\n\n }\n }\n\n </tbody>\n</table>\n\n", styles: [".btn-transparent:focus-visible{outline:-webkit-focus-ring-color auto 1px}.calendar-row:focus-visible{box-shadow:var(--cui-calendar-cell-focus-box-shadow);border-radius:.375rem}.calendar-row:focus-within:not([tabindex=\"-1\"]){outline:0;box-shadow:var(--cui-calendar-cell-focus-box-shadow);border-radius:.375rem;outline-style:auto!important}.calendar-row:focus:not([tabindex=\"-1\"]){outline:0;box-shadow:var(--cui-calendar-cell-focus-box-shadow);border-radius:.375rem;outline-style:auto!important}.calendar-cell:focus:not(:focus-visible):not([tabindex=\"-1\"]){box-shadow:var(--cui-calendar-cell-focus-box-shadow);border-radius:.375rem}\n"] }]
495
- }], ctorParameters: () => [{ type: i1.CalendarService }], propDecorators: { addMonths: [{
496
- type: Input
497
- }], startDate: [{
498
- type: Input
499
- }], endDate: [{
500
- type: Input
501
- }], disabledDates: [{
502
- type: Input
503
- }], firstDayOfWeek: [{
504
- type: Input,
505
- args: [{ transform: numberAttribute }]
506
- }], locale: [{
507
- type: Input
508
- }], range: [{
509
- type: Input,
510
- args: [{ transform: booleanAttribute }]
511
- }], weekdayFormat: [{
512
- type: Input
513
- }], view: [{
514
- type: Input
515
- }], maxDate: [{
516
- type: Input
517
- }], minDate: [{
518
- type: Input
519
- }], calendarDate: [{
520
- type: Input
521
- }], calendarDays: [{
440
+ ], template: "<table>\n @if (view() === 'days') {\n <thead>\n <tr>\n @if (showWeekNumber()) {\n <th class=\"calendar-cell\">\n <div class=\"calendar-header-cell-inner\">{{ weekNumbersLabel() }}</div>\n </th>\n }\n @for (weekDay of weekDays(); track weekDay.date; let i = $index) {\n @let date = weekDay.date ;\n <th class=\"calendar-cell\" abbr=\"{{date | calendarWeekday:'long':locale()}}\">\n <div class=\"calendar-header-cell-inner\">\n {{ date | calendarWeekday:weekdayFormat():locale() }}\n </div>\n </th>\n }\n </tr>\n </thead>\n }\n <tbody (mouseleave)=\"handleCellMouseLeave()\">\n @switch (view()) {\n @case ('years') {\n @for (yearsRow of listOfYears(); track yearsRow[0]; let rowIdx = $index) {\n <tr>\n @for (year of yearsRow; track year; let idx = $index) {\n <td\n #calendarYear=\"cCalendarDay\"\n (click)=\"!calendarYear.disabled$() && handleYearCellClick(year)\"\n (keydown)=\"calendarYear.date() && handleDayCellKeyDown($event, calendarYear.date())\"\n (keyup)=\"handleYearCellKeyUp($event, calendarYear.date())\"\n (mouseenter)=\"calendarYear.date() && handleCellMouseEnter(calendarYear.date())\"\n [attr.aria-label]=\"calendarYear.date()?.getFullYear()\"\n [date]=\"getYearStart(year)\"\n [ngClass]=\"year | calendarClassYear\"\n [tabindex]=\"calendarYear.disabled$() ? -1 : 0\"\n cCalendarDay\n >\n <div class=\"calendar-cell-inner\">\n {{ yearNumber(year) }}\n </div>\n </td>\n }\n </tr>\n }\n }\n @case ('months') {\n @for (monthsRow of listOfMonths(); track monthsRow[0]; let rowIdx = $index) {\n <tr>\n @for (month of monthsRow; track month; let idx = $index) {\n @let monthStart = getMonthStart(rowIdx*3+idx);\n <td\n #calendarMonth=\"cCalendarDay\"\n (click)=\"!calendarMonth.disabled$() && handleMonthCellClick(calendarMonth.date())\"\n (keydown)=\"calendarMonth.date() && handleDayCellKeyDown($event, calendarMonth.date())\"\n (keyup)=\"handleMonthCellKeyUp($event, calendarMonth.date())\"\n (mouseenter)=\"calendarMonth.date() && handleCellMouseEnter(calendarMonth.date())\"\n [attr.aria-label]=\"calendarMonth.date()?.getFullYear()+' '+month.month\"\n [date]=\"monthStart\"\n [ngClass]=\"monthStart | calendarClassMonth:(rowIdx*3+idx)\"\n [tabindex]=\"calendarMonth.disabled$() ? -1 : 0\"\n cCalendarDay\n >\n <div class=\"calendar-cell-inner\">\n {{ month.month }}\n </div>\n </td>\n }\n </tr>\n }\n\n }\n @default {\n @let weekSelection = selectionType() === 'week';\n @let daySelection = selectionType() === 'day';\n @for (week of monthDetails(); track week.days[0]; let i = $index) {\n <tr #calendarRow=\"cCalendarRow\"\n (click)=\"weekSelection && (calendarRow.current) && calendarRow.date && handleDayCellClick(calendarRow.date)\"\n (keydown)=\"weekSelection && (calendarRow.current) && calendarRow.date && handleDayCellKeyDown($event, calendarRow.date)\"\n (keyup)=\"weekSelection && (calendarRow.current) && calendarRow.date && handleDayCellKeyUp($event, calendarRow.date)\"\n (mouseenter)=\"weekSelection && calendarRow.date && handleCellMouseEnter(calendarRow.date)\"\n [cCalendarRow]=\"week\"\n >\n @if (showWeekNumber()) {\n <th class=\"calendar-cell-week-number\">\n {{ week.weekNumber === 0 ? 53 : week.weekNumber }}\n </th>\n }\n @for (dateObj of week.days; track dateObj.date; let idx = $index) {\n @let currentMonth = dateObj.month === 'current';\n @if (currentMonth || showAdjacentDays()) {\n @let selectable = daySelection && (currentMonth || selectAdjacentDays());\n <td #calendarCell=\"cCalendarDay\"\n (click)=\"selectable && handleDayCellClick(dateObj.date)\"\n (keydown)=\"selectable && handleDayCellKeyDown($event, dateObj.date)\"\n (keyup)=\"selectable && handleDayCellKeyUp($event, dateObj.date)\"\n (mouseenter)=\"selectable && handleCellMouseEnter(dateObj.date)\"\n [attr.aria-label]=\"dateObj.date | calendarDayTitle:locale()\"\n [date]=\"dateObj.date\"\n [month]=\"dateObj.month\"\n [ngClass]=\"dateObj | calendarClassDay:{minDate: minDate(), maxDate: maxDate(), disabledDates: disabledDates(), dateFilter: dateFilter()}\"\n [tabindex]=\"selectable && !isDateDisabled(dateObj.date) ? 0 : -1\"\n cCalendarDay\n >\n <div class=\"calendar-cell-inner\">\n {{ dateObj.date | calendarDay:dayFormat():locale() }}\n </div>\n </td>\n } @else {\n <td class=\"calendar-cell\"></td>\n }\n }\n </tr>\n }\n }\n }\n </tbody>\n</table>\n\n", styles: [".btn-transparent:focus-visible{outline:-webkit-focus-ring-color auto 1px}.calendar-row:focus-visible{box-shadow:var(--cui-calendar-cell-focus-box-shadow);border-radius:.375rem}.calendar-row:focus-within:not([tabindex=\"-1\"]){outline:0;box-shadow:var(--cui-calendar-cell-focus-box-shadow);border-radius:.375rem;outline-style:auto!important}.calendar-row:focus:not([tabindex=\"-1\"]){outline:0;box-shadow:var(--cui-calendar-cell-focus-box-shadow);border-radius:.375rem;outline-style:auto!important}.calendar-cell:focus:not(:focus-visible):not([tabindex=\"-1\"]){box-shadow:var(--cui-calendar-cell-focus-box-shadow);border-radius:.375rem}.calendar-cell-inner{-webkit-user-select:none;user-select:none}\n"] }]
441
+ }], ctorParameters: () => [], propDecorators: { calendarDays: [{
522
442
  type: ViewChildren,
523
443
  args: [CalendarDayDirective]
524
444
  }], calendarRows: [{
525
445
  type: ViewChildren,
526
446
  args: [CalendarRowDirective]
527
447
  }] } });
528
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItbW9udGguY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZXVpLWFuZ3VsYXIvc3JjL2xpYi9jYWxlbmRhci9jYWxlbmRhci1tb250aC9jYWxlbmRhci1tb250aC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JldWktYW5ndWxhci9zcmMvbGliL2NhbGVuZGFyL2NhbGVuZGFyLW1vbnRoL2NhbGVuZGFyLW1vbnRoLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsU0FBUyxFQUNULFFBQVEsRUFDUixVQUFVLEVBQ1YsTUFBTSxFQUNOLEtBQUssRUFDTCxlQUFlLEVBR2YsTUFBTSxFQUNOLFlBQVksRUFFYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0QyxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLG1CQUFtQixFQUNuQixlQUFlLEVBQ2YsY0FBYyxFQUNkLFFBQVEsRUFDUixtQkFBbUIsRUFDbkIsY0FBYyxFQUNkLHFCQUFxQixFQUNyQixPQUFPLEVBQ1IsTUFBTSxtQkFBbUIsQ0FBQztBQUczQixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM5RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxF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K0NBdUJmLGdCQUFnQixrTEE4RXRCLG9CQUFvQixrRUFDcEIsb0JBQW9CLDhFQzNPcEMsNjhLQW9IQSx3ckJEcEVJLG9CQUFvQiw2R0FDcEIsZUFBZSwrQ0FDZixvQkFBb0IseURBQ3BCLG9CQUFvQiw0R0FDcEIsb0JBQW9CLG9EQUNwQixzQkFBc0Isc0RBRXRCLHFCQUFxQixxREFDckIsbUJBQW1CLHdEQUNuQixPQUFPOzsyRkFJRSxzQkFBc0I7a0JBcEJsQyxTQUFTOytCQUNFLGtCQUFrQixZQUdsQixnQkFBZ0IsY0FDZCxJQUFJLFdBQ1A7d0JBQ1Asb0JBQW9CO3dCQUNwQixlQUFlO3dCQUNmLG9CQUFvQjt3QkFDcEIsb0JBQW9CO3dCQUNwQixvQkFBb0I7d0JBQ3BCLHNCQUFzQjt3QkFDdEIsb0JBQW9CO3dCQUNwQixxQkFBcUI7d0JBQ3JCLG1CQUFtQjt3QkFDbkIsT0FBTzt3QkFDUCxTQUFTO3FCQUNWO29GQVNRLFNBQVM7c0JBQWpCLEtBQUs7Z0JBT0YsU0FBUztzQkFEWixLQUFLO2dCQW9CRixPQUFPO3NCQURWLEtBQUs7Z0JBb0JGLGFBQWE7c0JBRGhCLEtBQUs7Z0JBcUJpQyxjQUFjO3NCQUFwRCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRTtnQkFPakMsTUFBTTtzQkFEVCxLQUFLO2dCQWlCa0MsS0FBSztzQkFBNUMsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFPN0IsYUFBYTtzQkFBckIsS0FBSztnQkFRRixJQUFJO3NCQURQLEtBQUs7Z0JBZUYsT0FBTztzQkFEVixLQUFLO2dCQWVGLE9BQU87c0JBRFYsS0FBSztnQkFxQkYsWUFBWTtzQkFEZixLQUFLO2dCQWdCOEIsWUFBWTtzQkFBL0MsWUFBWTt1QkFBQyxvQkFBb0I7Z0JBQ0UsWUFBWTtzQkFBL0MsWUFBWTt1QkFBQyxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBib29sZWFuQXR0cmlidXRlLFxuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBEZXN0cm95UmVmLFxuICBpbmplY3QsXG4gIElucHV0LFxuICBudW1iZXJBdHRyaWJ1dGUsXG4gIE9uSW5pdCxcbiAgUXVlcnlMaXN0LFxuICBzaWduYWwsXG4gIFZpZXdDaGlsZHJlbixcbiAgV3JpdGFibGVTaWduYWxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBc3luY1BpcGUsIE5nQ2xhc3MgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHtcbiAgY29udmVydFRvRGF0ZU9iamVjdCxcbiAgY3JlYXRlR3JvdXBzSW5BcnJheSxcbiAgZ2V0TW9udGhEZXRhaWxzLFxuICBnZXRNb250aHNOYW1lcyxcbiAgZ2V0WWVhcnMsXG4gIGlzRGF0ZUJldHdlZW5NaW5NYXgsXG4gIGlzRGF0ZURpc2FibGVkLFxuICBpc0RhdGVJblJhbmdlRGlzYWJsZWQsXG4gIHRyeURhdGVcbn0gZnJvbSAnLi4vY2FsZW5kYXIudXRpbHMnO1xuXG5pbXBvcnQgeyBDYWxlbmRhclNlcnZpY2UsIERhdGVGaWx0ZXJUeXBlLCBEYXlGb3JtYXRUeXBlLCBTZWxlY3Rpb25UeXBlLCBXZWVrZGF5Rm9ybWF0VHlwZSB9IGZyb20gJy4uL2NhbGVuZGFyLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2FsZW5kYXJXZWVrZGF5UGlwZSB9IGZyb20gJy4vY2FsZW5kYXItd2Vla2RheS5waXBlJztcbmltcG9ydCB7IENhbGVuZGFyQ2xhc3NZZWFyUGlwZSB9IGZyb20gJy4vY2FsZW5kYXItY2xhc3MteWVhci5waXBlJztcbmltcG9ydCB7IENhbGVuZGFyQ2xhc3NNb250aFBpcGUgfSBmcm9tICcuL2NhbGVuZGFyLWNsYXNzLW1vbnRoLnBpcGUnO1xuaW1wb3J0IHsgQ2FsZW5kYXJEYXlQaXBlIH0gZnJvbSAnLi9jYWxlbmRhci1kYXkucGlwZSc7XG5pbXBvcnQgeyBDYWxlbmRhckRheURpcmVjdGl2ZSB9IGZyb20gJy4vY2FsZW5kYXItZGF5LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBDYWxlbmRhckRheVRpdGxlUGlwZSB9IGZyb20gJy4vY2FsZW5kYXItZGF5LXRpdGxlLnBpcGUnO1xuaW1wb3J0IHsgQ2FsZW5kYXJDbGFzc0RheVBpcGUgfSBmcm9tICcuL2NhbGVuZGFyLWNsYXNzLWRheS5waXBlJztcbmltcG9ydCB7IENhbGVuZGFyQ2xhc3NSb3dQaXBlIH0gZnJvbSAnLi9jYWxlbmRhci1jbGFzcy1yb3cucGlwZSc7XG5pbXBvcnQgeyBDYWxlbmRhclJvd0RpcmVjdGl2ZSB9IGZyb20gJy4vY2FsZW5kYXItcm93LmRpcmVjdGl2ZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2MtY2FsZW5kYXItbW9udGgnLFxuICB0ZW1wbGF0ZVVybDogJy4vY2FsZW5kYXItbW9udGguY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jYWxlbmRhci1tb250aC5jb21wb25lbnQuc2NzcyddLFxuICBleHBvcnRBczogJ2NDYWxlbmRhck1vbnRoJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENhbGVuZGFyRGF5RGlyZWN0aXZlLFxuICAgIENhbGVuZGFyRGF5UGlwZSxcbiAgICBDYWxlbmRhckRheVRpdGxlUGlwZSxcbiAgICBDYWxlbmRhclJvd0RpcmVjdGl2ZSxcbiAgICBDYWxlbmRhckNsYXNzRGF5UGlwZSxcbiAgICBDYWxlbmRhckNsYXNzTW9udGhQaXBlLFxuICAgIENhbGVuZGFyQ2xhc3NSb3dQaXBlLFxuICAgIENhbGVuZGFyQ2xhc3NZZWFyUGlwZSxcbiAgICBDYWxlbmRhcldlZWtkYXlQaXBlLFxuICAgIE5nQ2xhc3MsXG4gICAgQXN5bmNQaXBlXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgQ2FsZW5kYXJNb250aENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICNkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2FsZW5kYXJTZXJ2aWNlOiBDYWxlbmRhclNlcnZpY2UpIHtcbiAgICB0aGlzLmNhbGVuZGFyU3RhdGVTdWJzY3JpYmUoKTtcbiAgfVxuXG4gIEBJbnB1dCgpIGFkZE1vbnRoczogbnVtYmVyID0gMDtcblxuICAvKipcbiAgICogSW5pdGlhbCBzZWxlY3RlZCBkYXRlLlxuICAgKiBAdHlwZSAgKERhdGUgfCBudWxsKVxuICAgKi9cbiAgQElucHV0KClcbiAgc2V0IHN0YXJ0RGF0ZSh2YWx1ZTogRGF0ZSB8IG51bWJlciB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBkYXRlID0gISF2YWx1ZSA/IHRyeURhdGUodmFsdWUsICdzdGFydERhdGUnKSA6IG51bGw7XG4gICAgaWYgKHRoaXMuX3N0YXJ0RGF0ZT8uZ2V0VGltZSgpICE9PSBkYXRlPy5nZXRUaW1lKCkpIHtcbiAgICAgIHRoaXMuX3N0YXJ0RGF0ZSA9IGRhdGU7XG4gICAgICB0aGlzLmNhbGVuZGFyU2VydmljZS51cGRhdGUoeyBzdGFydERhdGU6IHRoaXMuX3N0YXJ0RGF0ZSB9KTtcbiAgICB9XG4gIH1cblxuICBnZXQgc3RhcnREYXRlKCk6IERhdGUgfCBudWxsIHtcbiAgICByZXR1cm4gPERhdGUgfCBudWxsPnRoaXMuX3N0YXJ0RGF0ZTtcbiAgfVxuXG4gIF9zdGFydERhdGU6IERhdGUgfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogSW5pdGlhbCBzZWxlY3RlZCB0byBkYXRlIChyYW5nZSkuXG4gICAqIEB0eXBlICBEYXRlIHwgbnVsbFxuICAgKi9cbiAgQElucHV0KClcbiAgc2V0IGVuZERhdGUodmFsdWU6IERhdGUgfCBudW1iZXIgfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgZGF0ZSA9ICEhdmFsdWUgPyB0cnlEYXRlKHZhbHVlLCAnZW5kRGF0ZScpIDogbnVsbDtcbiAgICBpZiAodGhpcy5fZW5kRGF0ZT8uZ2V0VGltZSgpICE9PSBkYXRlPy5nZXRUaW1lKCkpIHtcbiAgICAgIHRoaXMuX2VuZERhdGUgPSBkYXRlO1xuICAgICAgdGhpcy5jYWxlbmRhclNlcnZpY2UudXBkYXRlKHsgZW5kRGF0ZTogdGhpcy5fZW5kRGF0ZSB9KTtcbiAgICB9XG4gIH1cblxuICBnZXQgZW5kRGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZW5kRGF0ZTtcbiAgfVxuXG4gIF9lbmREYXRlOiBEYXRlIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgdGhlIGxpc3Qgb2YgZGF0ZXMgdGhhdCBjYW5ub3QgYmUgc2VsZWN0ZWQuXG4gICAqIEB0eXBlICBEYXRlW10gfCBEYXRlW11bXVxuICAgKi9cbiAgQElucHV0KClcbiAgc2V0IGRpc2FibGVkRGF0ZXModmFsdWU6IChEYXRlW10gfCBEYXRlKVtdKSB7XG4gICAgdGhpcy5fZGlzYWJsZWREYXRlcyA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0IGRpc2FibGVkRGF0ZXMoKTogKERhdGVbXSB8IERhdGUpW10ge1xuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZERhdGVzO1xuICB9XG5cbiAgcHJpdmF0ZSBfZGlzYWJsZWREYXRlczogKERhdGVbXSB8IERhdGUpW10gPSBbXTtcblxuICAvKipcbiAgICogU2V0cyB0aGUgZGF5IG9mIHN0YXJ0IHdlZWsuXG4gICAqIC0gMCAtIFN1bmRheSxcbiAgICogLSAxIC0gTW9uZGF5LFxuICAgKiAtIDIgLSBUdWVzZGF5LFxuICAgKiAtIDMgLSBXZWRuZXNkYXksXG4gICAqIC0gNCAtIFRodXJzZGF5LFxuICAgKiAtIDUgLSBGcmlkYXksXG4gICAqIC0gNiAtIFNhdHVyZGF5LFxuICAgKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBudW1iZXJBdHRyaWJ1dGUgfSkgZmlyc3REYXlPZldlZWs6IG51bWJlciA9IDE7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGRlZmF1bHQgbG9jYWxlIGZvciBjb21wb25lbnRzLiBJZiBub3Qgc2V0LCBpdCBpcyBpbmhlcml0ZWQgZnJvbSB0aGUgYnJvd3Nlci5cbiAgICogQGRlZmF1bHQgJ2RlZmF1bHQnXG4gICAqL1xuICBASW5wdXQoKVxuICBzZXQgbG9jYWxlKHZhbHVlKSB7XG4gICAgdGhpcy4jbG9jYWxlLnNldCh2YWx1ZSk7XG4gICAgLy8gdGhpcy5saXN0T2ZNb250aHMgPSBjcmVhdGVHcm91cHNJbkFycmF5KGdldE1vbnRoc05hbWVzKHZhbHVlKSwgNCk7XG4gIH1cblxuICBnZXQgbG9jYWxlKCkge1xuICAgIHJldHVybiB0aGlzLiNsb2NhbGUoKTtcbiAgfVxuXG4gICNsb2NhbGUgPSBzaWduYWwoJ2RlZmF1bHQnKTtcblxuICAvKipcbiAgICogQWxsb3cgcmFuZ2Ugc2VsZWN0aW9uLlxuICAgKiBAdHlwZSBib29sZWFuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgcmFuZ2U6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogU2V0IGxlbmd0aCBvciBmb3JtYXQgb2YgZGF5IG5hbWUuXG4gICAqIEB0eXBlIG51bWJlciB8ICdsb25nJyB8ICduYXJyb3cnIHwgJ3Nob3J0J1xuICAgKiBAZGVmYXVsdCAnc2hvcnQnXG4gICAqL1xuICBASW5wdXQoKSB3ZWVrZGF5Rm9ybWF0OiBXZWVrZGF5Rm9ybWF0VHlwZSA9ICdzaG9ydCc7XG5cbiAgLyoqXG4gICAqIFNldCBjYWxlbmRhciB2aWV3LlxuICAgKiBAdHlwZSAnZGF5cycgfCAnbW9udGhzJyB8ICd5ZWFycydcbiAgICogQGRlZmF1bHQgJ2RheXMnXG4gICAqL1xuICBASW5wdXQoKVxuICBzZXQgdmlldyh2YWx1ZSkge1xuICAgIHRoaXMuI3ZpZXcuc2V0KHZhbHVlKTtcbiAgfVxuXG4gIGdldCB2aWV3KCkge1xuICAgIHJldHVybiB0aGlzLiN2aWV3KCk7XG4gIH1cblxuICAjdmlldyA9IHNpZ25hbDwnZGF5cycgfCAnbW9udGhzJyB8ICd5ZWFycyc+KCdkYXlzJyk7XG5cbiAgLyoqXG4gICAqIE1heCBzZWxlY3RhYmxlIGRhdGUuXG4gICAqL1xuICBASW5wdXQoKVxuICBzZXQgbWF4RGF0ZSh2YWx1ZTogRGF0ZSB8IG51bGwpIHtcbiAgICB0aGlzLl9tYXhEYXRlID0gdmFsdWUgPyB0cnlEYXRlKHZhbHVlLCAnbWF4RGF0ZScpIDogbnVsbDtcbiAgfVxuXG4gIGdldCBtYXhEYXRlKCkge1xuICAgIHJldHVybiB0aGlzLl9tYXhEYXRlO1xuICB9XG5cbiAgcHJpdmF0ZSBfbWF4RGF0ZTogRGF0ZSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBNaW4gc2VsZWN0YWJsZSBkYXRlLlxuICAgKi9cbiAgQElucHV0KClcbiAgc2V0IG1pbkRhdGUodmFsdWU6IERhdGUgfCBudWxsKSB7XG4gICAgdGhpcy5fbWluRGF0ZSA9IHZhbHVlID8gdHJ5RGF0ZSh2YWx1ZSwgJ21pbkRhdGUnKSA6IG51bGw7XG4gIH1cblxuICBnZXQgbWluRGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fbWluRGF0ZTtcbiAgfVxuXG4gIHByaXZhdGUgX21pbkRhdGU6IERhdGUgfCBudWxsID0gbnVsbDtcblxuICBsaXN0T2ZNb250aHMgPSBjb21wdXRlZDx7IHllYXI6IG51bWJlcjsgbW9udGg6IHN0cmluZyB9W11bXT4oKCkgPT4ge1xuICAgIHJldHVybiBjcmVhdGVHcm91cHNJbkFycmF5KGdldE1vbnRoc05hbWVzKHRoaXMuI2xvY2FsZSgpLCB0aGlzLmNhbGVuZGFyRGF0ZSQkKCkuZ2V0RnVsbFllYXIoKSksIDQpO1xuICB9KTtcbiAgbGlzdE9mWWVhcnMgPSBjb21wdXRlZDxudW1iZXJbXVtdPigoKSA9PiBjcmVhdGVHcm91cHNJbkFycmF5KGdldFllYXJzKHRoaXMuY2FsZW5kYXJEYXRlJCQoKS5nZXRGdWxsWWVhcigpKSwgNCkpO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IGRhdGUgb2YgdGhlIGNvbXBvbmVudFxuICAgKiBAdHlwZSBEYXRlXG4gICAqL1xuICBASW5wdXQoKVxuICBzZXQgY2FsZW5kYXJEYXRlKHZhbHVlOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyKSB7XG4gICAgY29uc3QgX3ZhbHVlID0gbmV3IERhdGUodHJ5RGF0ZSh2YWx1ZSA/PyB0aGlzLnN0YXJ0RGF0ZSwgJ2NhbGVuZGFyRGF0ZScpKTtcbiAgICBpZiAoISFfdmFsdWUgJiYgdGhpcy5jYWxlbmRhckRhdGUkJCgpLmdldFRpbWUoKSAhPT0gX3ZhbHVlLmdldFRpbWUoKSkge1xuICAgICAgdGhpcy5jYWxlbmRhckRhdGUkJC5zZXQobmV3IERhdGUobmV3IERhdGUoX3ZhbHVlLnNldERhdGUoMSkpLnNldEhvdXJzKDAsIDAsIDAsIDApKSk7XG4gICAgICB0aGlzLnNldE1vbnRoRGV0YWlscyh0aGlzLmRhdGUpO1xuICAgICAgdGhpcy5jYWxlbmRhclNlcnZpY2UudXBkYXRlKHsgY2FsZW5kYXJEYXRlOiB0aGlzLmNhbGVuZGFyRGF0ZSQkKCkgfSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGNhbGVuZGFyRGF0ZSgpOiBEYXRlIHtcbiAgICByZXR1cm4gKDxEYXRlPnRoaXMuY2FsZW5kYXJEYXRlJCQoKSkgYXMgRGF0ZTtcbiAgfVxuXG4gIGNhbGVuZGFyRGF0ZSQkID0gc2lnbmFsPERhdGU+KG5ldyBEYXRlKCkpO1xuXG4gIEBWaWV3Q2hpbGRyZW4oQ2FsZW5kYXJEYXlEaXJlY3RpdmUpIGNhbGVuZGFyRGF5cyE6IFF1ZXJ5TGlzdDxDYWxlbmRhckRheURpcmVjdGl2ZT47XG4gIEBWaWV3Q2hpbGRyZW4oQ2FsZW5kYXJSb3dEaXJlY3RpdmUpIGNhbGVuZGFyUm93cyE6IFF1ZXJ5TGlzdDxDYWxlbmRhclJvd0RpcmVjdGl2ZT47XG5cbiAgZGF0ZUZpbHRlciE6IERhdGVGaWx0ZXJUeXBlO1xuXG4gIGdldCBkYXRlKCkge1xuICAgIHJldHVybiBuZXcgRGF0ZSh0aGlzLmNhbGVuZGFyRGF0ZT8uZ2V0RnVsbFllYXIoKSwgdGhpcy5jYWxlbmRhckRhdGU/LmdldE1vbnRoKCkgKyB0aGlzLmFkZE1vbnRocyk7XG4gIH1cblxuICBkYXlGb3JtYXQhOiBEYXlGb3JtYXRUeXBlO1xuICBzZWxlY3RBZGphY2VudERheXMhOiBib29sZWFuO1xuICBzaG93QWRqYWNlbnREYXlzITogYm9vbGVhbjtcblxuICBzZXQgc2VsZWN0aW9uVHlwZSh2YWx1ZTogU2VsZWN0aW9uVHlwZSkge1xuICAgIHRoaXMuI3NlbGVjdGlvblR5cGUuc2V0KHZhbHVlKTtcbiAgfVxuXG4gIGdldCBzZWxlY3Rpb25UeXBlKCkge1xuICAgIHJldHVybiB0aGlzLiNzZWxlY3Rpb25UeXBlKCk7XG4gIH1cblxuICAjc2VsZWN0aW9uVHlwZTogV3JpdGFibGVTaWduYWw8U2VsZWN0aW9uVHlwZT4gPSBzaWduYWwoJ21vbnRoJyk7XG5cbiAgc2hvd1dlZWtOdW1iZXI6IGJvb2xlYW4gPSB0cnVlO1xuICAvLyBzZXQgc2hvd1dlZWtOdW1iZXIodmFsdWU6IGJvb2xlYW4pIHtcbiAgLy8gICB0aGlzLiNzaG93V2Vla051bWJlciQkLnNldCh2YWx1ZSk7XG4gIC8vIH1cbiAgLy9cbiAgLy8gZ2V0IHNob3dXZWVrTnVtYmVyKCkge1xuICAvLyAgIHJldHVybiB0aGlzLiNzaG93V2Vla051bWJlciQkKCk7XG4gIC8vIH1cbiAgLy9cbiAgLy8gI3Nob3dXZWVrTnVtYmVyJCQ6IFdyaXRhYmxlU2lnbmFsPGJvb2xlYW4+ID0gc2lnbmFsKGZhbHNlKTtcbiAgLy8gc2hvd1dlZWtOdW1iZXIkJCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuI3NlbGVjdGlvblR5cGUoKSA9PT0gJ3dlZWsnIHx8IHRoaXMuI3Nob3dXZWVrTnVtYmVyJCQoKSk7XG5cbiAgd2Vla051bWJlcnNMYWJlbCE6IHN0cmluZztcblxuICBwcml2YXRlIF9tb250aERldGFpbHMhOiB7IHdlZWtOdW1iZXI6IG51bWJlcjsgZGF5czogeyBkYXRlOiBEYXRlOyBtb250aDogc3RyaW5nIH1bXSB9W107XG5cbiAgZ2V0IG1vbnRoRGV0YWlscygpIHtcbiAgICByZXR1cm4gdGhpcy5fbW9udGhEZXRhaWxzO1xuICB9XG5cbiAgZ2V0IHdlZWtEYXlzKCkge1xuICAgIHJldHVybiB0aGlzLm1vbnRoRGV0YWlsc1swXS5kYXlzO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zZXRNb250aERldGFpbHModGhpcy5kYXRlKTtcbiAgfVxuXG4gIHNldE1vbnRoRGV0YWlscyhkYXRlOiBEYXRlID0gdGhpcy5kYXRlKSB7XG4gICAgdGhpcy5fbW9udGhEZXRhaWxzID0gZ2V0TW9udGhEZXRhaWxzKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCB0aGlzLmZpcnN0RGF5T2ZXZWVrKTtcbiAgfVxuXG4gIHllYXJOdW1iZXIoeWVhcjogYW55KSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHllYXIsIDApLnRvTG9jYWxlRGF0ZVN0cmluZyh0aGlzLmxvY2FsZSwgeyB5ZWFyOiAnbnVtZXJpYycgfSk7XG4gIH1cblxuICBpc0RhdGVEaXNhYmxlZChkYXRlOiBEYXRlKSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uVHlwZSA9PT0gJ3llYXInKSB7XG4gICAgICBjb25zdCBtaW5EYXRlID0gdGhpcy5taW5EYXRlID8gbmV3IERhdGUodGhpcy5taW5EYXRlLmdldEZ1bGxZZWFyKCksIDAsIDEsIDAsIDAsIDAsIDApIDogbnVsbDtcbiAgICAgIGNvbnN0IG1heERhdGUgPSB0aGlzLm1heERhdGUgPyBuZXcgRGF0ZSh0aGlzLm1heERhdGUuZ2V0RnVsbFllYXIoKSwgMTEsIDMxLCAwLCAwLCAwLCAwKSA6IG51bGw7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBpc0RhdGVEaXNhYmxlZChkYXRlLCBtaW5EYXRlLCBtYXhEYXRlLCB0aGlzLmRpc2FibGVkRGF0ZXMpIHx8ICh0aGlzLmRhdGVGaWx0ZXIgPyAhdGhpcy5kYXRlRmlsdGVyKGRhdGUpIDogZmFsc2UpXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodGhpcy5zZWxlY3Rpb25UeXBlID09PSAnbW9udGgnKSB7XG4gICAgICBjb25zdCBtaW5EYXRlID0gdGhpcy5taW5EYXRlXG4gICAgICAgID8gbmV3IERhdGUodGhpcy5taW5EYXRlLmdldEZ1bGxZZWFyKCksIHRoaXMubWluRGF0ZS5nZXRNb250aCgpLCAxLCAwLCAwLCAwLCAwKVxuICAgICAgICA6IG51bGw7XG4gICAgICBjb25zdCBtYXhEYXRlID0gdGhpcy5tYXhEYXRlXG4gICAgICAgID8gbmV3IERhdGUodGhpcy5tYXhEYXRlLmdldEZ1bGxZZWFyKCksIHRoaXMubWF4RGF0ZS5nZXRNb250aCgpICsgMSwgMSwgMCwgMCwgLTEsIDApXG4gICAgICAgIDogbnVsbDtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGlzRGF0ZURpc2FibGVkKGRhdGUsIG1pbkRhdGUsIG1heERhdGUsIHRoaXMuZGlzYWJsZWREYXRlcykgfHwgKHRoaXMuZGF0ZUZpbHRlciA/ICF0aGlzLmRhdGVGaWx0ZXIoZGF0ZSkgOiBmYWxzZSlcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICBpc0RhdGVEaXNhYmxlZChkYXRlLCB0aGlzLm1pbkRhdGUsIHRoaXMubWF4RGF0ZSwgdGhpcy5kaXNhYmxlZERhdGVzKSB8fFxuICAgICAgKHRoaXMuZGF0ZUZpbHRlciA/ICF0aGlzLmRhdGVGaWx0ZXIoZGF0ZSkgOiBmYWxzZSlcbiAgICApO1xuICB9XG5cbiAgY2FsZW5kYXJDZWxsVGl0bGUoZGF0ZTogRGF0ZSkge1xuICAgIHJldHVybiBkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZyh0aGlzLmxvY2FsZSk7XG4gIH1cblxuICBoYW5kbGVDZWxsTW91c2VFbnRlcihob3ZlckRhdGU6IERhdGUgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAoIWhvdmVyRGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB1cGRhdGVIb3ZlclZhbHVlID1cbiAgICAgIChbJ2RheScsICd3ZWVrJ10uaW5jbHVkZXModGhpcy5zZWxlY3Rpb25UeXBlKSAmJiB0aGlzLnZpZXcgPT09ICdkYXlzJykgfHxcbiAgICAgIChbJ21vbnRoJ10uaW5jbHVkZXModGhpcy5zZWxlY3Rpb25UeXBlKSAmJiB0aGlzLnZpZXcgPT09ICdtb250aHMnKSB8fFxuICAgICAgKFsneWVhciddLmluY2x1ZGVzKHRoaXMuc2VsZWN0aW9uVHlwZSkgJiYgdGhpcy52aWV3ID09PSAneWVhcnMnKTtcblxuICAgIC8vIGlmICh1cGRhdGVIb3ZlclZhbHVlKSB7XG4gICAgY29uc3QgaG92ZXJWYWx1ZSA9IHRoaXMuaXNEYXRlRGlzYWJsZWQoaG92ZXJEYXRlKSB8fCAhdXBkYXRlSG92ZXJWYWx1ZSA/IG51bGwgOiBob3ZlckRhdGU7XG4gICAgdGhpcy5jYWxlbmRhclNlcnZpY2UudXBkYXRlKHsgaG92ZXJEYXRlOiBob3ZlclZhbHVlIH0pO1xuICAgIC8vIH1cbiAgfVxuXG4gIGhhbmRsZVllYXJDZWxsQ2xpY2soeWVhcjogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uVHlwZSA9PT0gJ3llYXInKSB7XG4gICAgICBsZXQgZGF0ZSA9IG5ldyBEYXRlKHllYXIsIDAsIDEsIDAsIDAsIDAsIDApO1xuICAgICAgaWYgKHRoaXMucmFuZ2UgJiYgdGhpcy5zdGFydERhdGUgJiYgIXRoaXMuZW5kRGF0ZSkge1xuICAgICAgICBkYXRlID0gbmV3IERhdGUoZGF0ZS5nZXRGdWxsWWVhcigpLCAxMiwgMSwgMCwgMCwgLTEsIDApO1xuICAgICAgfVxuICAgICAgdGhpcy5oYW5kbGVEYXlDZWxsQ2xpY2soZGF0ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNhbGVuZGFyRGF0ZSA9IG5ldyBEYXRlKHllYXIsIDAsIDEsIDAsIDAsIDAsIDApO1xuICAgIHRoaXMudmlldyA9ICdtb250aHMnO1xuICAgIHRoaXMuY2FsZW5kYXJTZXJ2aWNlLnVwZGF0ZSh7IHZpZXc6IHRoaXMudmlldywgY2FsZW5kYXJEYXRlOiBjYWxlbmRhckRhdGUgfSk7XG4gIH1cblxuICBoYW5kbGVZZWFyQ2VsbEtleVVwKCRldmVudDogS2V5Ym9hcmRFdmVudCwgZGF0ZTogRGF0ZSB8IHVuZGVmaW5lZCkge1xuICAgIGlmICghZGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoWydTcGFjZScsICdFbnRlciddLmluY2x1ZGVzKCRldmVudC5jb2RlKSkge1xuICAgICAgdGhpcy5oYW5kbGVZZWFyQ2VsbENsaWNrKGRhdGUuZ2V0RnVsbFllYXIoKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChbJ1RhYicsICdBcnJvd1JpZ2h0JywgJ0Fycm93TGVmdCcsICdBcnJvd1VwJywgJ0Fycm93RG93biddLmluY2x1ZGVzKCRldmVudC5jb2RlKSkge1xuICAgICAgdGhpcy5oYW5kbGVDZWxsTW91c2VFbnRlcihuZXcgRGF0ZShkYXRlKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlTW9udGhDZWxsS2V5VXAoJGV2ZW50OiBLZXlib2FyZEV2ZW50LCBkYXRlOiBEYXRlIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFkYXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChbJ1NwYWNlJywgJ0VudGVyJ10uaW5jbHVkZXMoJGV2ZW50LmNvZGUpKSB7XG4gICAgICB0aGlzLmhhbmRsZU1vbnRoQ2VsbENsaWNrKGRhdGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoWydUYWInLCAnQXJyb3dSaWdodCcsICdBcnJvd0xlZnQnLCAnQXJyb3dVcCcsICdBcnJvd0Rvd24nXS5pbmNsdWRlcygkZXZlbnQuY29kZSkpIHtcbiAgICAgIHRoaXMuaGFuZGxlQ2VsbE1vdXNlRW50ZXIoZGF0ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlTW9udGhDZWxsQ2xpY2sodmFsdWU6IERhdGUgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnNlbGVjdGlvblR5cGUgPT09ICdtb250aCcpIHtcbiAgICAgIGxldCBkYXRlID0gbmV3IERhdGUodmFsdWUuZ2V0RnVsbFllYXIoKSwgdmFsdWUuZ2V0TW9udGgoKSwgMSwgMCwgMCwgMCwgMCk7XG4gICAgICBpZiAodGhpcy5yYW5nZSAmJiB0aGlzLnN0YXJ0RGF0ZSAmJiAhdGhpcy5lbmREYXRlKSB7XG4gICAgICAgIGRhdGUgPSBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSArIDEsIDEsIDAsIDAsIC0xLCAwKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuaGFuZGxlRGF5Q2VsbENsaWNrKGRhdGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2V0Q2FsZW5kYXJQYWdlKDAsIDAsIHZhbHVlLmdldE1vbnRoKCkgLSB0aGlzLmFkZE1vbnRocyk7XG4gICAgdGhpcy52aWV3ID0gJ2RheXMnO1xuICAgIHRoaXMuY2FsZW5kYXJTZXJ2aWNlLnVwZGF0ZSh7IHZpZXc6IHRoaXMudmlldyB9KTtcbiAgfVxuXG4gIHNldENhbGVuZGFyUGFnZSh5ZWFyczogbnVtYmVyLCBtb250aHMgPSAwLCBzZXRNb250aD86IG51bWJlcikge1xuICAgIGNvbnN0IHllYXIgPSB0aGlzLmRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICBjb25zdCBtb250aCA9IHRoaXMuZGF0ZS5nZXRNb250aCgpO1xuICAgIGNvbnN0IGQgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgMSwgMCwgMCwgMCwgMCk7XG5cbiAgICB5ZWFycyAmJiBkLnNldEZ1bGxZZWFyKGQuZ2V0RnVsbFllYXIoKSArIHllYXJzKTtcbiAgICBtb250aHMgJiYgZC5zZXRNb250aChkLmdldE1vbnRoKCkgKyBtb250aHMpO1xuICAgIHR5cGVvZiBzZXRNb250aCA9PT0gJ251bWJlcicgJiYgZC5zZXRNb250aChzZXRNb250aCk7XG5cbiAgICB0aGlzLmNhbGVuZGFyU2VydmljZS51cGRhdGUoeyBjYWxlbmRhckRhdGU6IGQgfSk7XG4gIH1cblxuICBoYW5kbGVEYXlDZWxsS2V5RG93bigkZXZlbnQ6IEtleWJvYXJkRXZlbnQsIGRhdGU6IERhdGUgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoIWRhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFbJ1RhYicsICdBcnJvd1JpZ2h0JywgJ0Fycm93TGVmdCcsICdBcnJvd1VwJywgJ0Fycm93RG93biddLmluY2x1ZGVzKCRldmVudC5jb2RlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLmhhbmRsZUNlbGxNb3VzZUVudGVyKGRhdGUpO1xuXG4gICAgY29uc3QgZXZlbnRLZXkgPSAkZXZlbnQua2V5ID09PSAnVGFiJyA/ICgkZXZlbnQuc2hpZnRLZXkgPyAnQXJyb3dMZWZ0JyA6ICdBcnJvd1JpZ2h0JykgOiAkZXZlbnQua2V5O1xuXG4gICAgaWYgKFxuICAgICAgdGhpcy5tYXhEYXRlICYmXG4gICAgICBkYXRlID49IGNvbnZlcnRUb0RhdGVPYmplY3QodGhpcy5tYXhEYXRlLCB0aGlzLnNlbGVjdGlvblR5cGUpICYmXG4gICAgICBbJ0Fycm93UmlnaHQnLCAnQXJyb3dEb3duJ10uaW5jbHVkZXMoZXZlbnRLZXkpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHRoaXMubWluRGF0ZSAmJlxuICAgICAgZGF0ZSA8PSBjb252ZXJ0VG9EYXRlT2JqZWN0KHRoaXMubWluRGF0ZSwgdGhpcy5zZWxlY3Rpb25UeXBlKSAmJlxuICAgICAgWydBcnJvd0xlZnQnLCAnQXJyb3dVcCddLmluY2x1ZGVzKGV2ZW50S2V5KVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBlbGVtZW50ID0gJGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcblxuICAgIGlmICh0aGlzLnNlbGVjdGlvblR5cGUgPT09ICd3ZWVrJyAmJiB0aGlzLnZpZXcgPT09ICdkYXlzJyAmJiBlbGVtZW50LnRhYkluZGV4ID09PSAtMSkge1xuICAgICAgZWxlbWVudCA9IGVsZW1lbnQuY2xvc2VzdCgndHJbdGFiaW5kZXg9XCIwXCJdJykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudHMgPVxuICAgICAgWyd3ZWVrJ10uaW5jbHVkZXModGhpcy5zZWxlY3Rpb25UeXBlKSAmJiB0aGlzLnZpZXcgPT09ICdkYXlzJyA/IHRoaXMuY2FsZW5kYXJSb3dzIDogdGhpcy5jYWxlbmRhckRheXM7XG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3QgbGlzdCA9IGVsZW1lbnRzXG4gICAgICAudG9BcnJheSgpXG4gICAgICAubWFwKChjYWxlbmRhckNlbGwpID0+IGNhbGVuZGFyQ2VsbC5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpXG4gICAgICAvLyAuZmlsdGVyKChlbGVtZW50KSA9PiB0aGlzLnNlbGVjdGlvblR5cGUgPT09ICd3ZWVrJyA/IGVsZW1lbnQ/LnRhYkluZGV4ID09PSAwIDogZWxlbWVudD8uY2xhc3NMaXN0LmNvbnRhaW5zKCdjdXJyZW50JykpXG4gICAgICAuZmlsdGVyKChlbGVtZW50KSA9PiBlbGVtZW50Py50YWJJbmRleCA9PT0gMCk7XG5cbiAgICBjb25zdCBpbmRleCA9IGxpc3QuaW5kZXhPZihlbGVtZW50KTtcbiAgICBjb25zdCBmaXJzdCA9IGluZGV4ID09PSAwO1xuICAgIGNvbnN0IGxhc3QgPSBpbmRleCA9PT0gbGlzdC5sZW5ndGggLSAxO1xuXG4gICAgY29uc3QgdG9Cb3VuZGFyeSA9IHtcbiAgICAgIHN0YXJ0OiBpbmRleCxcbiAgICAgIGVuZDogbGlzdC5sZW5ndGggLSAoaW5kZXggKyAxKVxuICAgIH07XG5cbiAgICBjb25zdCBnYXAgPSB7XG4gICAgICBBcnJvd1JpZ2h0OiAxLFxuICAgICAgQXJyb3dMZWZ0OiAtMSxcbiAgICAgIEFycm93VXA6IHRoaXMuc2VsZWN0aW9uVHlwZSA9PT0gJ3dlZWsnICYmIHRoaXMudmlldyA9PT0gJ2RheXMnID8gLTEgOiB0aGlzLnZpZXcgPT09ICdkYXlzJyA/IC03IDogLTMsXG4gICAgICBBcnJvd0Rvd246IHRoaXMuc2VsZWN0aW9uVHlwZSA9PT0gJ3dlZWsnICYmIHRoaXMudmlldyA9PT0gJ2RheXMnID8gMSA6IHRoaXMudmlldyA9PT0gJ2RheXMnID8gNyA6IDNcbiAgICB9O1xuXG4gICAgaWYgKFxuICAgICAgKGV2ZW50S2V5ID09PSAnQXJyb3dSaWdodCcgJiYgbGFzdCkgfHxcbiAgICAgIChldmVudEtleSA9PT0gJ0Fycm93RG93bicgJiYgdG9Cb3VuZGFyeS5lbmQgPCBnYXAuQXJyb3dEb3duKSB8fFxuICAgICAgKGV2ZW50S2V5ID09PSAnQXJyb3dMZWZ0JyAmJiBmaXJzdCkgfHxcbiAgICAgIChldmVudEtleSA9PT0gJ0Fycm93VXAnICYmIHRvQm91bmRhcnkuc3RhcnQgPCBNYXRoLmFicyhnYXAuQXJyb3dVcCkpXG4gICAgKSB7XG4gICAgICBlbGVtZW50cy5jaGFuZ2VzXG4gICAgICAgIC5waXBlKHRha2UoMSksIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLiNkZXN0cm95UmVmKSlcbiAgICAgICAgLnN1YnNjcmliZSgoY2hhbmdlOiBRdWVyeUxpc3Q8Q2FsZW5kYXJSb3dEaXJlY3RpdmUgfCBDYWxlbmRhckRheURpcmVjdGl2ZT4pID0+IHtcbiAgICAgICAgICBjb25zdCBfbGlzdCA9IGNoYW5nZVxuICAgICAgICAgICAgLnRvQXJyYXkoKVxuICAgICAgICAgICAgLy8gLmZpbHRlcihlbGVtZW50ID0+IHRoaXMuc2VsZWN0aW9uVHlwZSA9PT0gJ3dlZWsnID8gZWxlbWVudD8uZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnRhYkluZGV4ID09PSAwIDogZWxlbWVudD8uZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnY3VycmVudCcpKTtcbiAgICAgICAgICAgIC5maWx0ZXIoKGVsZW1lbnQpID0+IGVsZW1lbnQ/LmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC50YWJJbmRleCA9PT0gMCk7XG5cbiAgICAgICAgICBpZiAoX2xpc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgZGF5VG9Gb2N1czogQ2FsZW5kYXJEYXlEaXJlY3RpdmUgfCBDYWxlbmRhclJvd0RpcmVjdGl2ZSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHN3aXRjaCAoZXZlbnRLZXkpIHtcbiAgICAgICAgICAgICAgY2FzZSAnQXJyb3dSaWdodCc6IHtcbiAgICAgICAgICAgICAgICBkYXlUb0ZvY3VzID0gX2xpc3RbMF07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2FzZSAnQXJyb3dMZWZ0Jzoge1xuICAgICAgICAgICAgICAgIGRheVRvRm9jdXMgPSBfbGlzdFtfbGlzdC5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXNlICdBcnJvd0Rvd24nOiB7XG4gICAgICAgICAgICAgICAgZGF5VG9Gb2N1cyA9IF9saXN0W2dhcC5BcnJvd0Rvd24gLSAobGlzdC5sZW5ndGggLSBpbmRleCldO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhc2UgJ0Fycm93VXAnOiB7XG4gICAgICAgICAgICAgICAgZGF5VG9Gb2N1cyA9IF9saXN0W19saXN0Lmxlbmd0aCAtIChNYXRoLmFicyhnYXAuQXJyb3dVcCkgKyAxIC0gKGluZGV4ICsgMSkpXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFkYXlUb0ZvY3VzPy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnZGF5VG9Gb2N1cycsIGRheVRvRm9jdXM/LmRhdGUpO1xuICAgICAgICAgICAgICBkYXlUb0ZvY3VzPy5mb2N1cygna2V5Ym9hcmQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICBpZiAodGhpcy52aWV3ID09PSAnZGF5cycpIHtcbiAgICAgICAgdGhpcy5zZXRDYWxlbmRhclBhZ2UoMCwgWydBcnJvd1JpZ2h0JywgJ0Fycm93RG93biddLmluY2x1ZGVzKGV2ZW50S2V5KSA/IDEgOiAtMSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy52aWV3ID09PSAnbW9udGhzJykge1xuICAgICAgICB0aGlzLnNldENhbGVuZGFyUGFnZShbJ0Fycm93UmlnaHQnLCAnQXJyb3dEb3duJ10uaW5jbHVkZXMoZXZlbnRLZXkpID8gMSA6IC0xKTtcbiAgICAgICAgLy8gdGhpcy5jYWxlbmRhckRheXM/LnJlc2V0KHRoaXMuY2FsZW5kYXJEYXlzLnRvQXJyYXkoKSk7XG4gICAgICAgIC8vIHRoaXMuY2FsZW5kYXJEYXlzPy5ub3RpZnlPbkNoYW5nZXMoKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnZpZXcgPT09ICd5ZWFycycpIHtcbiAgICAgICAgdGhpcy5zZXRDYWxlbmRhclBhZ2UoWydBcnJvd1JpZ2h0JywgJ0Fycm93RG93biddLmluY2x1ZGVzKGV2ZW50S2V5KSA/IDEyIDogLTEyKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCBuZXh0RWxlbWVudCA9IGxpc3RbaW5kZXggKyBnYXBbZXZlbnRLZXldXTtcbiAgICBpZiAobmV4dEVsZW1lbnQ/LnRhYkluZGV4ID09PSAwKSB7XG4gICAgICBuZXh0RWxlbWVudC5mb2N1cygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSBpbmRleDsgaSA8IGxpc3QubGVuZ3RoOyBsaXN0Lmxlbmd0aCAmJiBbJ0Fycm93UmlnaHQnLCAnQXJyb3dEb3duJ10uaW5jbHVkZXMoZXZlbnRLZXkpID8gaSsrIDogaS0tKSB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBjb25zdCBuZXh0RWxlbWVudCA9IGxpc3RbaSArIGdhcFtldmVudEtleV1dO1xuICAgICAgaWYgKG5leHRFbGVtZW50Py50YWJJbmRleCA9PT0gMCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIG5leHRFbGVtZW50Py5mb2N1cygpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGlmICghbmV4dEVsZW1lbnQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlQ2VsbE1vdXNlTGVhdmUoKSB7XG4gICAgdGhpcy5jYWxlbmRhclNlcnZpY2UudXBkYXRlKHsgaG92ZXJEYXRlOiBudWxsIH0pO1xuICB9XG5cbiAgaGFuZGxlRGF5Q2VsbEtleVVwKCRldmVudDogS2V5Ym9hcmRFdmVudCwgZGF0ZTogRGF0ZSkge1xuICAgIGlmIChbJ1NwYWNlJywgJ0VudGVyJ10uaW5jbHVkZXMoJGV2ZW50LmNvZGUpKSB7XG4gICAgICB0aGlzLmhhbmRsZURheUNlbGxDbGljayhkYXRlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKFsnVGFiJywgJ0Fycm93UmlnaHQnLCAnQXJyb3dMZWZ0JywgJ0Fycm93VXAnLCAnQXJyb3dEb3duJ10uaW5jbHVkZXMoJGV2ZW50LmNvZGUpKSB7XG4gICAgICB0aGlzLmhhbmRsZUNlbGxNb3VzZUVudGVyKGRhdGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZURheUNlbGxDbGljayhkYXRlOiBEYXRlKSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uVHlwZSA9PT0gJ2RheScgJiYgdGhpcy5pc0RhdGVEaXNhYmxlZChkYXRlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5yYW5nZSkge1xuICAgICAgdGhpcy5lbmREYXRlID0gbnVsbDtcbiAgICAgIHRoaXMuc3RhcnREYXRlID0gZGF0ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdGFydERhdGUgJiYgdGhpcy5lbmREYXRlKSB7XG4gICAgICB0aGlzLmNhbGVuZGFyRGF0ZSA9IG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCAxLCAwLCAwLCAwLCAwKTtcbiAgICAgIHRoaXMuZW5kRGF0ZSA9IG51bGw7XG4gICAgICB0aGlzLnN0YXJ0RGF0ZSA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCEhdGhpcy5zdGFydERhdGUgJiYgIXRoaXMuZW5kRGF0ZSkge1xuICAgICAgaWYgKHRoaXMuc3RhcnREYXRlICYmIGRhdGUgPCB0aGlzLnN0YXJ0RGF0ZSkge1xuICAgICAgICB0aGlzLmVuZERhdGUgPSBudWxsO1xuICAgICAgICB0aGlzLnN0YXJ0RGF0ZSA9IGRhdGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVuZERhdGUgPSBkYXRlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVuZERhdGUgPSBudWxsO1xuICAgICAgdGhpcy5zdGFydERhdGUgPSBkYXRlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnN0YXJ0RGF0ZSAmJiB0aGlzLmVuZERhdGUpIHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGlmIChpc0RhdGVJblJhbmdlRGlzYWJsZWQodGhpcy5zdGFydERhdGUsIHRoaXMuZW5kRGF0ZSwgdGhpcy5kaXNhYmxlZERhdGVzKSkge1xuICAgICAgICB0aGlzLnN0YXJ0RGF0ZSA9IG51bGw7XG4gICAgICAgIHRoaXMuZW5kRGF0ZSA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gbGV0IGRhdGUgPSBuZXcgRGF0ZSh0aGlzLnN0YXJ0RGF0ZSk7XG4gICAgICAvLyB3aGlsZSAoZGF0ZSA8IHRoaXMuZW5kRGF0ZSkge1xuICAgICAgLy8gICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgKyAxKTtcbiAgICAgIC8vICAgaWYgKHRoaXMuaXNEYXRlRGlzYWJsZWQoZGF0ZSkpIHtcbiAgICAgIC8vICAgICB0aGlzLnN0YXJ0RGF0ZSA9IG51bGw7XG4gICAgICAvLyAgICAgdGhpcy5lbmREYXRlID0gbnVsbDtcbiAgICAgIC8vICAgICBicmVhaztcbiAgICAgIC8vICAgfVxuICAgICAgLy8gfVxuICAgIH1cbiAgfVxuXG4gIGNhbGVuZGFyU3RhdGVTdWJzY3JpYmUoKTogdm9pZCB7XG4gICAgdGhpcy5jYWxlbmRhclNlcnZpY2UuY2FsZW5kYXJTdGF0ZSQucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy4jZGVzdHJveVJlZikpLnN1YnNjcmliZSgoc3RhdGUpID0+IHtcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhzdGF0ZSk7XG5cbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgLy8gaWYgKGtleSBpbiB0aGlzKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhpc1trZXldID0gc3RhdGVba2V5XTtcbiAgICAgICAgLy8gfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZ2V0TW9udGhTdGFydChpbmRleDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHRoaXMuY2FsZW5kYXJEYXRlLmdldEZ1bGxZZWFyKCksIGluZGV4LCAxLCAwLCAwLCAwLCAwKTtcbiAgfVxuXG4gIGdldE1vbnRoRW5kKGluZGV4OiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IERhdGUodGhpcy5jYWxlbmRhckRhdGUuZ2V0RnVsbFllYXIoKSwgaW5kZXggKyAxLCAxLCAwLCAwLCAtMSwgMCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNEYXRlSW5SYW5nZURpc2FibGVkID0gaXNEYXRlSW5SYW5nZURpc2FibGVkO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNEYXRlQmV0d2Vlbk1pbk1heCA9IGlzRGF0ZUJldHdlZW5NaW5NYXg7XG5cbiAgZ2V0WWVhclN0YXJ0KHllYXI6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgRGF0ZSh5ZWFyLCAwLCAxKTtcbiAgfVxuXG4gIGdldFllYXJFbmQoeWVhcjogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHllYXIsIDExLCAxLCAwLCAwLCAtMSwgMCk7XG4gIH1cbn1cbiIsIjx0YWJsZT5cbiAgQGlmICh2aWV3ID09PSAnZGF5cycpIHtcbiAgICA8dGhlYWQ+XG4gICAgPHRyPlxuICAgICAgQGlmIChzaG93V2Vla051bWJlcikge1xuICAgICAgICA8dGggY2xhc3M9XCJjYWxlbmRhci1jZWxsXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLWhlYWRlci1jZWxsLWlubmVyXCI+e3sgd2Vla051bWJlcnNMYWJlbCB9fTwvZGl2PlxuICAgICAgICA8L3RoPlxuICAgICAgfVxuICAgICAgQGZvciAod2Vla0RheSBvZiB3ZWVrRGF5czsgdHJhY2sgd2Vla0RheS5kYXRlOyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgICBAbGV0IGRhdGUgPSB3ZWVrRGF5LmRhdGUgO1xuICAgICAgICA8dGggY2xhc3M9XCJjYWxlbmRhci1jZWxsXCIgYWJicj1cInt7ZGF0ZSB8IGNhbGVuZGFyV2Vla2RheTonbG9uZyc6bG9jYWxlfX1cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItaGVhZGVyLWNlbGwtaW5uZXJcIj5cbiAgICAgICAgICAgIHt7IGRhdGUgfCBjYWxlbmRhcldlZWtkYXk6d2Vla2RheUZvcm1hdDpsb2NhbGUgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC90aD5cbiAgICAgIH1cbiAgICA8L3RyPlxuICAgIDwvdGhlYWQ+XG4gIH1cbiAgPHRib2R5IChtb3VzZWxlYXZlKT1cImhhbmRsZUNlbGxNb3VzZUxlYXZlKClcIj5cbiAgICBAc3dpdGNoICh2aWV3KSB7XG4gICAgICBAY2FzZSAoJ3llYXJzJykge1xuICAgICAgICBAZm9yICh5ZWFyc1JvdyBvZiBsaXN0T2ZZZWFycygpOyB0cmFjayB5ZWFyc1JvdzsgbGV0IHJvd0lkeCA9ICRpbmRleCkge1xuICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgIEBmb3IgKHllYXIgb2YgeWVhcnNSb3c7IHRyYWNrIHllYXI7IGxldCBpZHggPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgI2NhbGVuZGFyWWVhcj1cImNDYWxlbmRhckRheVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIiFjYWxlbmRhclllYXIuZGlzYWJsZWQkKCkgJiYgaGFuZGxlWWVhckNlbGxDbGljayh5ZWFyKVwiXG4gICAgICAgICAgICAgICAgKGtleWRvd24pPVwiY2FsZW5kYXJZZWFyLmRhdGUoKSAmJiBoYW5kbGVEYXlDZWxsS2V5RG93bigkZXZlbnQsIGNhbGVuZGFyWWVhci5kYXRlKCkpXCJcbiAgICAgICAgICAgICAgICAoa2V5dXApPVwiaGFuZGxlWWVhckNlbGxLZXlVcCgkZXZlbnQsIGNhbGVuZGFyWWVhci5kYXRlKCkpXCJcbiAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJjYWxlbmRhclllYXIuZGF0ZSgpICYmIGhhbmRsZUNlbGxNb3VzZUVudGVyKGNhbGVuZGFyWWVhci5kYXRlKCkpXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImNhbGVuZGFyWWVhci5kYXRlKCk/LmdldEZ1bGxZZWFyKClcIlxuICAgICAgICAgICAgICAgIFtkYXRlXT1cImdldFllYXJTdGFydCh5ZWFyKVwiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieWVhciB8IGNhbGVuZGFyQ2xhc3NZZWFyXCJcbiAgICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwiY2FsZW5kYXJZZWFyLmRpc2FibGVkJCgpID8gLTEgOiAwXCJcbiAgICAgICAgICAgICAgICBjQ2FsZW5kYXJEYXlcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxlbmRhci1jZWxsLWlubmVyXCI+XG4gICAgICAgICAgICAgICAgICB7eyB5ZWFyTnVtYmVyKHllYXIpIH19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgQGNhc2UgKCdtb250aHMnKSB7XG4gICAgICAgIEBmb3IgKG1vbnRoc1JvdyBvZiBsaXN0T2ZNb250aHMoKTsgdHJhY2sgbW9udGhzUm93OyBsZXQgcm93SWR4ID0gJGluZGV4KSB7XG4gICAgICAgICAgPHRyPlxuICAgICAgICAgICAgQGZvciAobW9udGggb2YgbW9udGhzUm93OyB0cmFjayBtb250aDsgbGV0IGlkeCA9ICRpbmRleCkge1xuICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICAjY2FsZW5kYXJNb250aD1cImNDYWxlbmRhckRheVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIiFjYWxlbmRhck1vbnRoLmRpc2FibGVkJCgpICYmIGhhbmRsZU1vbnRoQ2VsbENsaWNrKGNhbGVuZGFyTW9udGguZGF0ZSgpKVwiXG4gICAgICAgICAgICAgICAgKGtleWRvd24pPVwiY2FsZW5kYXJNb250aC5kYXRlKCkgJiYgaGFuZGxlRGF5Q2VsbEtleURvd24oJGV2ZW50LCBjYWxlbmRhck1vbnRoLmRhdGUoKSlcIlxuICAgICAgICAgICAgICAgIChrZXl1cCk9XCJoYW5kbGVNb250aENlbGxLZXlVcCgkZXZlbnQsIGNhbGVuZGFyTW9udGguZGF0ZSgpKVwiXG4gICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwiY2FsZW5kYXJNb250aC5kYXRlKCkgJiYgaGFuZGxlQ2VsbE1vdXNlRW50ZXIoY2FsZW5kYXJNb250aC5kYXRlKCkpXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImNhbGVuZGFyTW9udGguZGF0ZSgpPy5nZXRGdWxsWWVhcigpKycgJyttb250aC5tb250aFwiXG4gICAgICAgICAgICAgICAgW2RhdGVdPVwiZ2V0TW9udGhTdGFydChyb3dJZHgqMytpZHgpXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjYWxlbmRhckRhdGUgfCBjYWxlbmRhckNsYXNzTW9udGg6KHJvd0lkeCozK2lkeClcIlxuICAgICAgICAgICAgICAgIFt0YWJpbmRleF09XCJjYWxlbmRhck1vbnRoLmRpc2FibGVkJCgpID8gLTEgOiAwXCJcbiAgICAgICAgICAgICAgICBjQ2FsZW5kYXJEYXlcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxlbmRhci1jZWxsLWlubmVyXCI+XG4gICAgICAgICAgICAgICAgICB7eyBtb250aC5tb250aCB9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIH1cblxuICAgICAgfVxuICAgICAgQGRlZmF1bHQge1xuICAgICAgICBAZm9yICh3ZWVrIG9mIG1vbnRoRGV0YWlsczsgdHJhY2sgd2VlazsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgICAgICA8dHIgI2NhbGVuZGFyUm93PVwiY0NhbGVuZGFyUm93XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdGlvblR5cGUgPT09ICd3ZWVrJyAmJiAoY2FsZW5kYXJSb3cuY3VycmVudCkgJiYgY2FsZW5kYXJSb3cuZGF0ZSAmJiBoYW5kbGVEYXlDZWxsQ2xpY2soY2FsZW5kYXJSb3cuZGF0ZSlcIlxuICAgICAgICAgICAgICAoa2V5ZG93bik9XCJzZWxlY3Rpb25UeXBlID09PSAnd2VlaycgJiYgKGNhbGVuZGFyUm93LmN1cnJlbnQpICYmIGNhbGVuZGFyUm93LmRhdGUgJiYgaGFuZGxlRGF5Q2VsbEtleURvd24oJGV2ZW50LCBjYWxlbmRhclJvdy5kYXRlKVwiXG4gICAgICAgICAgICAgIChrZXl1cCk9XCJzZWxlY3Rpb25UeXBlID09PSAnd2VlaycgJiYgKGNhbGVuZGFyUm93LmN1cnJlbnQpICYmIGNhbGVuZGFyUm93LmRhdGUgJiYgaGFuZGxlRGF5Q2VsbEtleVVwKCRldmVudCwgY2FsZW5kYXJSb3cuZGF0ZSlcIlxuICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJzZWxlY3Rpb25UeXBlID09PSAnd2VlaycgJiYgY2FsZW5kYXJSb3cuZGF0ZSAmJiBoYW5kbGVDZWxsTW91c2VFbnRlcihjYWxlbmRhclJvdy5kYXRlKVwiXG4gICAgICAgICAgICAgIFtjQ2FsZW5kYXJSb3ddPVwid2Vla1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgQGlmIChzaG93V2Vla051bWJlcikge1xuICAgICAgICAgICAgICA8dGggY2xhc3M9XCJjYWxlbmRhci1jZWxsLXdlZWstbnVtYmVyXCI+XG4gICAgICAgICAgICAgICAge3sgd2Vlay53ZWVrTnVtYmVyID09PSAwID8gNTMgOiB3ZWVrLndlZWtOdW1iZXIgfX1cbiAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBmb3IgKGRhdGVPYmogb2Ygd2Vlay5kYXlzOyB0cmFjayBkYXRlT2JqLmRhdGU7IGxldCBpZHggPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgQGlmIChkYXRlT2JqLm1vbnRoID09PSAnY3VycmVudCcgfHwgc2hvd0FkamFjZW50RGF5cykge1xuICAgICAgICAgICAgICAgIDx0ZCAjY2FsZW5kYXJDZWxsPVwiY0NhbGVuZGFyRGF5XCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdGlvblR5cGUgPT09ICdkYXknICYmIChkYXRlT2JqLm1vbnRoID09PSAnY3VycmVudCcgfHwgc2VsZWN0QWRqYWNlbnREYXlzKSAmJiBoYW5kbGVEYXlDZWxsQ2xpY2soZGF0ZU9iai5kYXRlKVwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cInNlbGVjdGlvblR5cGUgPT09ICdkYXknICYmIChkYXRlT2JqLm1vbnRoID09PSAnY3VycmVudCcgfHwgc2VsZWN0QWRqYWNlbnREYXlzKSAmJiBoYW5kbGVEYXlDZWxsS2V5RG93bigkZXZlbnQsIGRhdGVPYmouZGF0ZSlcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5dXApPVwic2VsZWN0aW9uVHlwZSA9PT0gJ2RheScgJiYgKGRhdGVPYmoubW9udGggPT09ICdjdXJyZW50JyB8fCBzZWxlY3RBZGphY2VudERheXMpICYmIGhhbmRsZURheUNlbGxLZXlVcCgkZXZlbnQsIGRhdGVPYmouZGF0ZSlcIlxuICAgICAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJzZWxlY3Rpb25UeXBlID09PSAnZGF5JyAmJiAoZGF0ZU9iai5tb250aCA9PT0gJ2N1cnJlbnQnIHx8IHNlbGVjdEFkamFjZW50RGF5cykgJiYgaGFuZGxlQ2VsbE1vdXNlRW50ZXIoZGF0ZU9iai5kYXRlKVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiZGF0ZU9iai5kYXRlIHwgY2FsZW5kYXJEYXlUaXRsZTpsb2NhbGVcIlxuICAgICAgICAgICAgICAgICAgICBbZGF0ZV09XCJkYXRlT2JqLmRhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbbW9udGhdPVwiZGF0ZU9iai5tb250aFwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImRhdGVPYmogfCBjYWxlbmRhckNsYXNzRGF5OnttaW5EYXRlLCBtYXhEYXRlLCBkaXNhYmxlZERhdGVzLCBkYXRlRmlsdGVyfVwiXG4gICAgICAgICAgICAgICAgICAgIFt0YWJpbmRleF09XCJzZWxlY3Rpb25UeXBlID09PSAnZGF5JyAmJiAoZGF0ZU9iai5tb250aCA9PT0gJ2N1cnJlbnQnIHx8IHNlbGVjdEFkamFjZW50RGF5cykgJiYgIWlzRGF0ZURpc2FibGVkKGRhdGVPYmouZGF0ZSkgPyAwIDogLTFcIlxuICAgICAgICAgICAgICAgICAgICBjQ2FsZW5kYXJEYXlcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItY2VsbC1pbm5lclwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBkYXRlT2JqLmRhdGUgfCBjYWxlbmRhckRheTpkYXlGb3JtYXQ6bG9jYWxlIH19XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJjYWxlbmRhci1jZWxsXCI+PC90ZD5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIH1cblxuICAgICAgfVxuICAgIH1cblxuICA8L3Rib2R5PlxuPC90YWJsZT5cblxuIl19
448
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItbW9udGguY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZXVpLWFuZ3VsYXIvc3JjL2xpYi9jYWxlbmRhci9jYWxlbmRhci1tb250aC9jYWxlbmRhci1tb250aC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JldWktYW5ndWxhci9zcmMvbGliL2NhbGVuZGFyL2NhbGVuZGFyLW1vbnRoL2NhbGVuZGFyLW1vbnRoLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsUUFBUSxFQUNSLFVBQVUsRUFDVixNQUFNLEVBQ04sTUFBTSxFQUNOLEtBQUssRUFDTCxlQUFlLEVBRWYsTUFBTSxFQUNOLFlBQVksRUFDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0QyxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLG1CQUFtQixFQUNuQixVQUFVLEVBQ1YsZUFBZSxFQUNmLGNBQWMsRUFDZCxRQUFRLEVBQ1IsY0FBYyxFQUNkLHFCQUFxQixFQUN0QixNQUFNLG1CQUFtQixDQUFDO0FBRTNCLE9BQU8sRUFBRSxlQUFlLEVBQThELE1BQU0scUJBQXFCLENBQUM7QUFDbEgsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDOUQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDbkUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDckUsT0FBTyxFQUFFLGVBQWUsRUFBRSxN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R0FDcEIsb0JBQW9CLG9EQUNwQixzQkFBc0Isc0RBRXRCLHFCQUFxQixxREFDckIsbUJBQW1CLHdEQUNuQixPQUFPOzsyRkFJRSxzQkFBc0I7a0JBcEJsQyxTQUFTOytCQUNFLGtCQUFrQixZQUdsQixnQkFBZ0IsY0FDZCxJQUFJLFdBQ1A7d0JBQ1Asb0JBQW9CO3dCQUNwQixlQUFlO3dCQUNmLG9CQUFvQjt3QkFDcEIsb0JBQW9CO3dCQUNwQixvQkFBb0I7d0JBQ3BCLHNCQUFzQjt3QkFDdEIsb0JBQW9CO3dCQUNwQixxQkFBcUI7d0JBQ3JCLG1CQUFtQjt3QkFDbkIsT0FBTzt3QkFDUCxTQUFTO3FCQUNWO3dEQWdJbUMsWUFBWTtzQkFBL0MsWUFBWTt1QkFBQyxvQkFBb0I7Z0JBQ0UsWUFBWTtzQkFBL0MsWUFBWTt1QkFBQyxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBEZXN0cm95UmVmLFxuICBlZmZlY3QsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIG51bWJlckF0dHJpYnV0ZSxcbiAgUXVlcnlMaXN0LFxuICBzaWduYWwsXG4gIFZpZXdDaGlsZHJlblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFzeW5jUGlwZSwgTmdDbGFzcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQge1xuICBjb252ZXJ0VG9EYXRlT2JqZWN0LFxuICBjcmVhdGVHcm91cHNJbkFycmF5LFxuICBlcXVhbERhdGVzLFxuICBnZXRNb250aERldGFpbHMsXG4gIGdldE1vbnRoc05hbWVzLFxuICBnZXRZZWFycyxcbiAgaXNEYXRlRGlzYWJsZWQsXG4gIGlzRGF0ZUluUmFuZ2VEaXNhYmxlZFxufSBmcm9tICcuLi9jYWxlbmRhci51dGlscyc7XG5cbmltcG9ydCB7IENhbGVuZGFyU2VydmljZSwgRGF0ZUZpbHRlclR5cGUsIERheUZvcm1hdFR5cGUsIE1vbnRoRGV0YWlscywgU2VsZWN0aW9uVHlwZSB9IGZyb20gJy4uL2NhbGVuZGFyLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2FsZW5kYXJXZWVrZGF5UGlwZSB9IGZyb20gJy4vY2FsZW5kYXItd2Vla2RheS5waXBlJztcbmltcG9ydCB7IENhbGVuZGFyQ2xhc3NZZWFyUGlwZSB9IGZyb20gJy4vY2FsZW5kYXItY2xhc3MteWVhci5waXBlJztcbmltcG9ydCB7IENhbGVuZGFyQ2xhc3NNb250aFBpcGUgfSBmcm9tICcuL2NhbGVuZGFyLWNsYXNzLW1vbnRoLnBpcGUnO1xuaW1wb3J0IHsgQ2FsZW5kYXJEYXlQaXBlIH0gZnJvbSAnLi9jYWxlbmRhci1kYXkucGlwZSc7XG5pbXBvcnQgeyBDYWxlbmRhckRheURpcmVjdGl2ZSB9IGZyb20gJy4vY2FsZW5kYXItZGF5LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBDYWxlbmRhckRheVRpdGxlUGlwZSB9IGZyb20gJy4vY2FsZW5kYXItZGF5LXRpdGxlLnBpcGUnO1xuaW1wb3J0IHsgQ2FsZW5kYXJDbGFzc0RheVBpcGUgfSBmcm9tICcuL2NhbGVuZGFyLWNsYXNzLWRheS5waXBlJztcbmltcG9ydCB7IENhbGVuZGFyQ2xhc3NSb3dQaXBlIH0gZnJvbSAnLi9jYWxlbmRhci1jbGFzcy1yb3cucGlwZSc7XG5pbXBvcnQgeyBDYWxlbmRhclJvd0RpcmVjdGl2ZSB9IGZyb20gJy4vY2FsZW5kYXItcm93LmRpcmVjdGl2ZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2MtY2FsZW5kYXItbW9udGgnLFxuICB0ZW1wbGF0ZVVybDogJy4vY2FsZW5kYXItbW9udGguY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jYWxlbmRhci1tb250aC5jb21wb25lbnQuc2NzcyddLFxuICBleHBvcnRBczogJ2NDYWxlbmRhck1vbnRoJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENhbGVuZGFyRGF5RGlyZWN0aXZlLFxuICAgIENhbGVuZGFyRGF5UGlwZSxcbiAgICBDYWxlbmRhckRheVRpdGxlUGlwZSxcbiAgICBDYWxlbmRhclJvd0RpcmVjdGl2ZSxcbiAgICBDYWxlbmRhckNsYXNzRGF5UGlwZSxcbiAgICBDYWxlbmRhckNsYXNzTW9udGhQaXBlLFxuICAgIENhbGVuZGFyQ2xhc3NSb3dQaXBlLFxuICAgIENhbGVuZGFyQ2xhc3NZZWFyUGlwZSxcbiAgICBDYWxlbmRhcldlZWtkYXlQaXBlLFxuICAgIE5nQ2xhc3MsXG4gICAgQXN5bmNQaXBlXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgQ2FsZW5kYXJNb250aENvbXBvbmVudCB7XG4gICNkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICAjY2FsZW5kYXJTZXJ2aWNlID0gaW5qZWN0KENhbGVuZGFyU2VydmljZSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5jYWxlbmRhclN0YXRlU3Vic2NyaWJlKCk7XG4gIH1cblxuICByZWFkb25seSBwYWdlSW5kZXggPSBpbnB1dCgwLCB7IHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0pO1xuXG4gIHJlYWRvbmx5IGFkZE1vbnRocyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCB2aWV3ID0gdGhpcy52aWV3KCk7XG4gICAgY29uc3QgcGFnZUluZGV4ID0gdGhpcy5wYWdlSW5kZXgoKTtcbiAgICByZXR1cm4gcGFnZUluZGV4ICogKHZpZXcgPT09ICd5ZWFycycgPyAxNDQgOiB2aWV3ID09PSAnbW9udGhzJyA/IDEyIDogMSk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBJbml0aWFsIHNlbGVjdGVkIGRhdGUuXG4gICAqIEB0eXBlICAoRGF0ZSB8IG51bGwpXG4gICAqL1xuICByZWFkb25seSBzdGFydERhdGUgPSBzaWduYWw8RGF0ZSB8IG51bGw+KG51bGwsIHsgZXF1YWw6IGVxdWFsRGF0ZXMgfSk7XG5cbiAgLyoqXG4gICAqIEluaXRpYWwgc2VsZWN0ZWQgdG8gZGF0ZSAocmFuZ2UpLlxuICAgKiBAdHlwZSAgRGF0ZSB8IG51bGxcbiAgICovXG4gIHJlYWRvbmx5IGVuZERhdGUgPSBzaWduYWw8RGF0ZSB8IG51bGw+KG51bGwsIHsgZXF1YWw6IGVxdWFsRGF0ZXMgfSk7XG5cbiAgcmVhZG9ubHkgZGF0ZXNFZmZlY3QgPSBlZmZlY3QoXG4gICAgKCkgPT4ge1xuICAgICAgY29uc3Qgc3RhcnREYXRlID0gdGhpcy5zdGFydERhdGUoKTtcbiAgICAgIGNvbnN0IGVuZERhdGUgPSBzdGFydERhdGUgJiYgdGhpcy5yYW5nZSgpID8gdGhpcy5lbmREYXRlKCkgOiBudWxsO1xuICAgICAgdGhpcy4jY2FsZW5kYXJTZXJ2aWNlLnVwZGF0ZSh7IHN0YXJ0RGF0ZTogc3RhcnREYXRlLCBlbmREYXRlOiBlbmREYXRlIH0pO1xuICAgIH0sXG4gICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9XG4gICk7XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgdGhlIGxpc3Qgb2YgZGF0ZXMgdGhhdCBjYW5ub3QgYmUgc2VsZWN0ZWQuXG4gICAqIEB0eXBlICBEYXRlW10gfCBEYXRlW11bXVxuICAgKi9cbiAgcmVhZG9ubHkgZGlzYWJsZWREYXRlcyA9IHNpZ25hbDwoRGF0ZVtdIHwgRGF0ZSlbXT4oW10pO1xuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBkYXkgb2Ygc3RhcnQgd2Vlay5cbiAgICogLSAwIC0gU3VuZGF5LFxuICAgKiAtIDEgLSBNb25kYXksXG4gICAqIC0gMiAtIFR1ZXNkYXksXG4gICAqIC0gMyAtIFdlZG5lc2RheSxcbiAgICogLSA0IC0gVGh1cnNkYXksXG4gICAqIC0gNSAtIEZyaWRheSxcbiAgICogLSA2IC0gU2F0dXJkYXksXG4gICAqL1xuICByZWFkb25seSBmaXJzdERheU9mV2VlayA9IHNpZ25hbCgxKTtcblxuICAvKipcbiAgICogU2V0cyB0aGUgZGVmYXVsdCBsb2NhbGUgZm9yIGNvbXBvbmVudHMuIElmIG5vdCBzZXQsIGl0IGlzIGluaGVyaXRlZCBmcm9tIHRoZSBicm93c2VyLlxuICAgKiBAZGVmYXVsdCAnZGVmYXVsdCdcbiAgICovXG4gIHJlYWRvbmx5IGxvY2FsZSA9IHNpZ25hbCgnZGVmYXVsdCcpO1xuXG4gIC8qKlxuICAgKiBBbGxvdyByYW5nZSBzZWxlY3Rpb24uXG4gICAqIEB0eXBlIGJvb2xlYW5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHJhbmdlID0gc2lnbmFsKGZhbHNlKTtcblxuICAvKipcbiAgICogU2V0IGxlbmd0aCBvciBmb3JtYXQgb2YgZGF5IG5hbWUuXG4gICAqIEB0eXBlIG51bWJlciB8ICdsb25nJyB8ICduYXJyb3cnIHwgJ3Nob3J0J1xuICAgKiBAZGVmYXVsdCAnc2hvcnQnXG4gICAqL1xuICByZWFkb25seSB3ZWVrZGF5Rm9ybWF0ID0gc2lnbmFsPG51bWJlciB8ICdsb25nJyB8ICduYXJyb3cnIHwgJ3Nob3J0Jz4oJ3Nob3J0Jyk7XG5cbiAgLyoqXG4gICAqIFNldCBjYWxlbmRhciB2aWV3LlxuICAgKiBAdHlwZSAnZGF5cycgfCAnbW9udGhzJyB8ICd5ZWFycydcbiAgICogQGRlZmF1bHQgJ2RheXMnXG4gICAqL1xuICByZWFkb25seSB2aWV3ID0gc2lnbmFsPCdkYXlzJyB8ICdtb250aHMnIHwgJ3llYXJzJz4oJ2RheXMnKTtcblxuICAvKipcbiAgICogTWF4IHNlbGVjdGFibGUgZGF0ZS5cbiAgICovXG4gIHJlYWRvbmx5IG1heERhdGUgPSBzaWduYWw8RGF0ZSB8IG51bGw+KG51bGwsIHsgZXF1YWw6IGVxdWFsRGF0ZXMgfSk7XG5cbiAgLyoqXG4gICAqIE1pbiBzZWxlY3RhYmxlIGRhdGUuXG4gICAqL1xuICByZWFkb25seSBtaW5EYXRlID0gc2lnbmFsPERhdGUgfCBudWxsPihudWxsLCB7IGVxdWFsOiBlcXVhbERhdGVzIH0pO1xuXG4gIHJlYWRvbmx5IGxpc3RPZk1vbnRocyA9IGNvbXB1dGVkPHsgeWVhcjogbnVtYmVyOyBtb250aDogc3RyaW5nIH1bXVtdPigoKSA9PiB7XG4gICAgcmV0dXJuIGNyZWF0ZUdyb3Vwc0luQXJyYXkoZ2V0TW9udGhzTmFtZXModGhpcy5sb2NhbGUoKSwgdGhpcy5kYXRlKCkuZ2V0RnVsbFllYXIoKSksIDQpO1xuICB9KTtcblxuICByZWFkb25seSBsaXN0T2ZZZWFycyA9IGNvbXB1dGVkPG51bWJlcltdW10+KCgpID0+IGNyZWF0ZUdyb3Vwc0luQXJyYXkoZ2V0WWVhcnModGhpcy5kYXRlKCkuZ2V0RnVsbFllYXIoKSksIDQpKTtcblxuICAvKipcbiAgICogRGVmYXVsdCBkYXRlIG9mIHRoZSBjb21wb25lbnRcbiAgICogQHR5cGUgRGF0ZVxuICAgKi9cblxuICByZWFkb25seSBjYWxlbmRhckRhdGUgPSBzaWduYWw8RGF0ZT4obmV3IERhdGUoKSwgeyBlcXVhbDogZXF1YWxEYXRlcyB9KTtcblxuICByZWFkb25seSBkYXRlID0gY29tcHV0ZWQoXG4gICAgKCkgPT4ge1xuICAgICAgY29uc3QgZGF0ZSA9IHRoaXMuY2FsZW5kYXJEYXRlKCk7XG4gICAgICByZXR1cm4gbmV3IERhdGUoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCkgKyB0aGlzLmFkZE1vbnRocygpLCAxLCAwLCAwLCAwLCAwKTtcbiAgICB9LFxuICAgIHsgZXF1YWw6IChhOiBEYXRlLCBiOiBEYXRlKSA9PiBhLmdldFRpbWUoKSA9PT0gYi5nZXRUaW1lKCkgfVxuICApO1xuXG4gIHJlYWRvbmx5IGNhbGVuZGFyRGF0ZUVmZmVjdCA9IGVmZmVjdChcbiAgICAoKSA9PiB7XG4gICAgICB0aGlzLiNjYWxlbmRhclNlcnZpY2UudXBkYXRlKHsgY2FsZW5kYXJEYXRlOiB0aGlzLmNhbGVuZGFyRGF0ZSgpIH0pO1xuICAgIH0sXG4gICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9XG4gICk7XG5cbiAgLy8gcmVhZG9ubHkgY2FsZW5kYXJEYXlzID0gdmlld0NoaWxkcmVuKENhbGVuZGFyRGF5RGlyZWN0aXZlKTtcbiAgLy8gcmVhZG9ubHkgY2FsZW5kYXJSb3dzID0gdmlld0NoaWxkcmVuKENhbGVuZGFyUm93RGlyZWN0aXZlKTtcbiAgLy9cbiAgLy8gcmVhZG9ubHkgY2FsZW5kYXJEYXlzJCA9IHRvT2JzZXJ2YWJsZSh0aGlzLmNhbGVuZGFyRGF5cyk7XG4gIC8vIHJlYWRvbmx5IGNhbGVuZGFyUm93cyQgPSB0b09ic2VydmFibGUodGhpcy5jYWxlbmRhclJvd3MpO1xuXG4gIEBWaWV3Q2hpbGRyZW4oQ2FsZW5kYXJEYXlEaXJlY3RpdmUpIGNhbGVuZGFyRGF5cyE6IFF1ZXJ5TGlzdDxDYWxlbmRhckRheURpcmVjdGl2ZT47XG4gIEBWaWV3Q2hpbGRyZW4oQ2FsZW5kYXJSb3dEaXJlY3RpdmUpIGNhbGVuZGFyUm93cyE6IFF1ZXJ5TGlzdDxDYWxlbmRhclJvd0RpcmVjdGl2ZT47XG5cbiAgcmVhZG9ubHkgZGF0ZUZpbHRlciA9IHNpZ25hbDxEYXRlRmlsdGVyVHlwZSB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcmVhZG9ubHkgZGF5Rm9ybWF0ID0gc2lnbmFsPERheUZvcm1hdFR5cGU+KCdudW1lcmljJyk7XG4gIHJlYWRvbmx5IHNlbGVjdEFkamFjZW50RGF5cyA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IHNob3dBZGphY2VudERheXMgPSBzaWduYWw8Ym9vbGVhbj4odHJ1ZSk7XG4gIHJlYWRvbmx5IHNlbGVjdGlvblR5cGUgPSBzaWduYWw8U2VsZWN0aW9uVHlwZT4oJ2RheScpO1xuICByZWFkb25seSBzaG93V2Vla051bWJlciA9IHNpZ25hbChmYWxzZSk7XG4gIHJlYWRvbmx5IHdlZWtOdW1iZXJzTGFiZWwgPSBzaWduYWw8c3RyaW5nPignJyk7XG5cbiAgcmVhZG9ubHkgbW9udGhEZXRhaWxzID0gY29tcHV0ZWQ8TW9udGhEZXRhaWxzPigoKSA9PiB7XG4gICAgY29uc3QgZGF0ZSA9IHRoaXMuZGF0ZSgpO1xuICAgIHJldHVybiBnZXRNb250aERldGFpbHMoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCksIHRoaXMuZmlyc3REYXlPZldlZWsoKSk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHdlZWtEYXlzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IG1vbnRoRGV0YWlscyA9IHRoaXMubW9udGhEZXRhaWxzKCk7XG4gICAgcmV0dXJuIG1vbnRoRGV0YWlsc1swXS5kYXlzO1xuICB9KTtcblxuICB5ZWFyTnVtYmVyKHllYXI6IGFueSkge1xuICAgIHJldHVybiBuZXcgRGF0ZSh5ZWFyLCAwKS50b0xvY2FsZURhdGVTdHJpbmcodGhpcy5sb2NhbGUoKSwgeyB5ZWFyOiAnbnVtZXJpYycgfSk7XG4gIH1cblxuICBpc0RhdGVEaXNhYmxlZChkYXRlOiBEYXRlKSB7XG4gICAgY29uc3Qgc2VsZWN0aW9uVHlwZSA9IHRoaXMuc2VsZWN0aW9uVHlwZSgpO1xuICAgIGNvbnN0IGRpc2FibGVkRGF0ZXMgPSB0aGlzLmRpc2FibGVkRGF0ZXMoKTtcbiAgICBjb25zdCBkYXRlRmlsdGVyRm4gPSB0aGlzLmRhdGVGaWx0ZXIoKTtcbiAgICBjb25zdCBtYXhEYXRlID0gdGhpcy5tYXhEYXRlKCk7XG4gICAgY29uc3QgbWluRGF0ZSA9IHRoaXMubWluRGF0ZSgpO1xuICAgIGlmIChzZWxlY3Rpb25UeXBlID09PSAneWVhcicpIHtcbiAgICAgIGNvbnN0IG1pbiA9IG1pbkRhdGUgPyBuZXcgRGF0ZShtaW5EYXRlLmdldEZ1bGxZZWFyKCksIDAsIDEsIDAsIDAsIDAsIDApIDogbnVsbDtcbiAgICAgIGNvbnN0IG1heCA9IG1heERhdGUgPyBuZXcgRGF0ZShtYXhEYXRlLmdldEZ1bGxZZWFyKCksIDExLCAzMSwgMCwgMCwgMCwgMCkgOiBudWxsO1xuICAgICAgcmV0dXJuIGlzRGF0ZURpc2FibGVkKGRhdGUsIG1pbiwgbWF4LCBkaXNhYmxlZERhdGVzKSB8fCAoZGF0ZUZpbHRlckZuID8gIWRhdGVGaWx0ZXJGbihkYXRlKSA6IGZhbHNlKTtcbiAgICB9XG4gICAgaWYgKHNlbGVjdGlvblR5cGUgPT09ICdtb250aCcpIHtcbiAgICAgIGNvbnN0IG1pbiA9IG1pbkRhdGUgPyBuZXcgRGF0ZShtaW5EYXRlLmdldEZ1bGxZZWFyKCksIG1pbkRhdGUuZ2V0TW9udGgoKSwgMSwgMCwgMCwgMCwgMCkgOiBudWxsO1xuICAgICAgY29uc3QgbWF4ID0gbWF4RGF0ZSA/IG5ldyBEYXRlKG1heERhdGUuZ2V0RnVsbFllYXIoKSwgbWF4RGF0ZS5nZXRNb250aCgpICsgMSwgMSwgMCwgMCwgLTEsIDApIDogbnVsbDtcbiAgICAgIHJldHVybiBpc0RhdGVEaXNhYmxlZChkYXRlLCBtaW4sIG1heCwgZGlzYWJsZWREYXRlcykgfHwgKGRhdGVGaWx0ZXJGbiA/ICFkYXRlRmlsdGVyRm4oZGF0ZSkgOiBmYWxzZSk7XG4gICAgfVxuICAgIHJldHVybiBpc0RhdGVEaXNhYmxlZChkYXRlLCBtaW5EYXRlLCBtYXhEYXRlLCBkaXNhYmxlZERhdGVzKSB8fCAoZGF0ZUZpbHRlckZuID8gIWRhdGVGaWx0ZXJGbihkYXRlKSA6IGZhbHNlKTtcbiAgfVxuXG4gIGNhbGVuZGFyQ2VsbFRpdGxlKGRhdGU6IERhdGUpIHtcbiAgICByZXR1cm4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcodGhpcy5sb2NhbGUoKSk7XG4gIH1cblxuICBoYW5kbGVDZWxsTW91c2VFbnRlcihob3ZlckRhdGU6IERhdGUgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAoIWhvdmVyRGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzZWxlY3Rpb25UeXBlID0gdGhpcy5zZWxlY3Rpb25UeXBlKCk7XG4gICAgY29uc3QgdXBkYXRlSG92ZXJWYWx1ZSA9XG4gICAgICAoWydkYXknLCAnd2VlayddLmluY2x1ZGVzKHNlbGVjdGlvblR5cGUpICYmIHRoaXMudmlldygpID09PSAnZGF5cycpIHx8XG4gICAgICAoWydtb250aCddLmluY2x1ZGVzKHNlbGVjdGlvblR5cGUpICYmIHRoaXMudmlldygpID09PSAnbW9udGhzJykgfHxcbiAgICAgIChbJ3llYXInXS5pbmNsdWRlcyhzZWxlY3Rpb25UeXBlKSAmJiB0aGlzLnZpZXcoKSA9PT0gJ3llYXJzJyk7XG5cbiAgICAvLyBpZiAodXBkYXRlSG92ZXJWYWx1ZSkge1xuICAgIGNvbnN0IGhvdmVyVmFsdWUgPSB0aGlzLmlzRGF0ZURpc2FibGVkKGhvdmVyRGF0ZSkgfHwgIXVwZGF0ZUhvdmVyVmFsdWUgPyBudWxsIDogaG92ZXJEYXRlO1xuICAgIHRoaXMuI2NhbGVuZGFyU2VydmljZS51cGRhdGUoeyBob3ZlckRhdGU6IGhvdmVyVmFsdWUgfSk7XG4gICAgLy8gfVxuICB9XG5cbiAgaGFuZGxlWWVhckNlbGxDbGljayh5ZWFyOiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25UeXBlKCkgPT09ICd5ZWFyJykge1xuICAgICAgbGV0IGRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCAwLCAxLCAwLCAwLCAwLCAwKTtcbiAgICAgIGlmICh0aGlzLnJhbmdlKCkgJiYgdGhpcy5zdGFydERhdGUoKSAmJiAhdGhpcy5lbmREYXRlKCkpIHtcbiAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgMTIsIDEsIDAsIDAsIC0xLCAwKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuaGFuZGxlRGF5Q2VsbENsaWNrKGRhdGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjYWxlbmRhckRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCAwLCAxLCAwLCAwLCAwLCAwKTtcbiAgICB0aGlzLnZpZXcuc2V0KCdtb250aHMnKTtcbiAgICB0aGlzLiNjYWxlbmRhclNlcnZpY2UudXBkYXRlKHsgdmlldzogdGhpcy52aWV3KCksIGNhbGVuZGFyRGF0ZTogY2FsZW5kYXJEYXRlIH0pO1xuICB9XG5cbiAgaGFuZGxlWWVhckNlbGxLZXlVcCgkZXZlbnQ6IEtleWJvYXJkRXZlbnQsIGRhdGU6IERhdGUgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoIWRhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKFsnU3BhY2UnLCAnRW50ZXInXS5pbmNsdWRlcygkZXZlbnQuY29kZSkpIHtcbiAgICAgIHRoaXMuaGFuZGxlWWVhckNlbGxDbGljayhkYXRlLmdldEZ1bGxZZWFyKCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoWydUYWInLCAnQXJyb3dSaWdodCcsICdBcnJvd0xlZnQnLCAnQXJyb3dVcCcsICdBcnJvd0Rvd24nXS5pbmNsdWRlcygkZXZlbnQuY29kZSkpIHtcbiAgICAgIHRoaXMuaGFuZGxlQ2VsbE1vdXNlRW50ZXIobmV3IERhdGUoZGF0ZSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZU1vbnRoQ2VsbEtleVVwKCRldmVudDogS2V5Ym9hcmRFdmVudCwgZGF0ZTogRGF0ZSB8IHVuZGVmaW5lZCkge1xuICAgIGlmICghZGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoWydTcGFjZScsICdFbnRlciddLmluY2x1ZGVzKCRldmVudC5jb2RlKSkge1xuICAgICAgdGhpcy5oYW5kbGVNb250aENlbGxDbGljayhkYXRlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKFsnVGFiJywgJ0Fycm93UmlnaHQnLCAnQXJyb3dMZWZ0JywgJ0Fycm93VXAnLCAnQXJyb3dEb3duJ10uaW5jbHVkZXMoJGV2ZW50LmNvZGUpKSB7XG4gICAgICB0aGlzLmhhbmRsZUNlbGxNb3VzZUVudGVyKGRhdGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZU1vbnRoQ2VsbENsaWNrKHZhbHVlOiBEYXRlIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5zZWxlY3Rpb25UeXBlKCkgPT09ICdtb250aCcpIHtcbiAgICAgIGxldCBkYXRlID0gbmV3IERhdGUodmFsdWUuZ2V0RnVsbFllYXIoKSwgdmFsdWUuZ2V0TW9udGgoKSwgMSwgMCwgMCwgMCwgMCk7XG4gICAgICBpZiAodGhpcy5yYW5nZSgpICYmIHRoaXMuc3RhcnREYXRlKCkgJiYgIXRoaXMuZW5kRGF0ZSgpKSB7XG4gICAgICAgIGRhdGUgPSBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSArIDEsIDEsIDAsIDAsIC0xLCAwKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuaGFuZGxlRGF5Q2VsbENsaWNrKGRhdGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnZpZXcuc2V0KCdkYXlzJyk7XG4gICAgdGhpcy4jY2FsZW5kYXJTZXJ2aWNlLnVwZGF0ZSh7IHZpZXc6IHRoaXMudmlldygpIH0pO1xuICAgIC8vIHRoaXMuc2V0Q2FsZW5kYXJQYWdlKDAsIDAsIHZhbHVlLmdldE1vbnRoKCkgLSB0aGlzLmFkZE1vbnRocygpKTtcbiAgICBjb25zdCBjYWxlbmRhckRhdGUgPSBuZXcgRGF0ZSh2YWx1ZS5nZXRGdWxsWWVhcigpLCB2YWx1ZS5nZXRNb250aCgpIC0gdGhpcy5hZGRNb250aHMoKSwgMSwgMCwgMCwgMCwgMCk7XG4gICAgdGhpcy4jY2FsZW5kYXJTZXJ2aWNlLnVwZGF0ZSh7IGNhbGVuZGFyRGF0ZTogY2FsZW5kYXJEYXRlIH0pO1xuICB9XG5cbiAgc2V0Q2FsZW5kYXJQYWdlKHllYXJzOiBudW1iZXIsIG1vbnRocyA9IDAsIHNldE1vbnRoPzogbnVtYmVyKSB7XG4gICAgY29uc3QgeWVhciA9IHRoaXMuZGF0ZSgpLmdldEZ1bGxZZWFyKCk7XG4gICAgY29uc3QgbW9udGggPSB0aGlzLmRhdGUoKS5nZXRNb250aCgpO1xuICAgIGNvbnN0IGQgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgMSwgMCwgMCwgMCwgMCk7XG5cbiAgICB5ZWFycyAmJiBkLnNldEZ1bGxZZWFyKGQuZ2V0RnVsbFllYXIoKSArIHllYXJzKTtcbiAgICBtb250aHMgJiYgZC5zZXRNb250aChkLmdldE1vbnRoKCkgKyBtb250aHMpO1xuICAgIHR5cGVvZiBzZXRNb250aCA9PT0gJ251bWJlcicgJiYgZC5zZXRNb250aChzZXRNb250aCk7XG5cbiAgICB0aGlzLiNjYWxlbmRhclNlcnZpY2UudXBkYXRlKHsgY2FsZW5kYXJEYXRlOiBkIH0pO1xuICB9XG5cbiAgaGFuZGxlRGF5Q2VsbEtleURvd24oJGV2ZW50OiBLZXlib2FyZEV2ZW50LCBkYXRlOiBEYXRlIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFkYXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghWydUYWInLCAnQXJyb3dSaWdodCcsICdBcnJvd0xlZnQnLCAnQXJyb3dVcCcsICdBcnJvd0Rvd24nXS5pbmNsdWRlcygkZXZlbnQuY29kZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5oYW5kbGVDZWxsTW91c2VFbnRlcihkYXRlKTtcblxuICAgIGNvbnN0IGV2ZW50S2V5ID0gJGV2ZW50LmtleSA9PT0gJ1RhYicgPyAoJGV2ZW50LnNoaWZ0S2V5ID8gJ0Fycm93TGVmdCcgOiAnQXJyb3dSaWdodCcpIDogJGV2ZW50LmtleTtcbiAgICBjb25zdCBzZWxlY3Rpb25UeXBlID0gdGhpcy5zZWxlY3Rpb25UeXBlKCk7XG4gICAgY29uc3QgdmlldyA9IHRoaXMudmlldygpO1xuICAgIGNvbnN0IG1heERhdGUgPSB0aGlzLm1heERhdGUoKTtcbiAgICBpZiAoXG4gICAgICBtYXhEYXRlICYmXG4gICAgICBkYXRlID49IGNvbnZlcnRUb0RhdGVPYmplY3QobWF4RGF0ZSwgc2VsZWN0aW9uVHlwZSkgJiZcbiAgICAgIFsnQXJyb3dSaWdodCcsICdBcnJvd0Rvd24nXS5pbmNsdWRlcyhldmVudEtleSlcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbWluRGF0ZSA9IHRoaXMubWluRGF0ZSgpO1xuICAgIGlmIChtaW5EYXRlICYmIGRhdGUgPD0gY29udmVydFRvRGF0ZU9iamVjdChtaW5EYXRlLCBzZWxlY3Rpb25UeXBlKSAmJiBbJ0Fycm93TGVmdCcsICdBcnJvd1VwJ10uaW5jbHVkZXMoZXZlbnRLZXkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGVsZW1lbnQgPSAkZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuXG4gICAgaWYgKHNlbGVjdGlvblR5cGUgPT09ICd3ZWVrJyAmJiB2aWV3ID09PSAnZGF5cycgJiYgZWxlbWVudC50YWJJbmRleCA9PT0gLTEpIHtcbiAgICAgIGVsZW1lbnQgPSBlbGVtZW50LmNsb3Nlc3QoJ3RyW3RhYmluZGV4PVwiMFwiXScpIGFzIEhUTUxFbGVtZW50O1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnRzID0gWyd3ZWVrJ10uaW5jbHVkZXMoc2VsZWN0aW9uVHlwZSkgJiYgdmlldyA9PT0gJ2RheXMnID8gdGhpcy5jYWxlbmRhclJvd3MgOiB0aGlzLmNhbGVuZGFyRGF5cztcblxuICAgIGNvbnN0IGxpc3QgPSBlbGVtZW50c1xuICAgICAgLnRvQXJyYXkoKVxuICAgICAgLm1hcCgoY2FsZW5kYXJDZWxsKSA9PiBjYWxlbmRhckNlbGwuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KVxuICAgICAgLy8gLmZpbHRlcigoZWxlbWVudCkgPT4gdGhpcy5zZWxlY3Rpb25UeXBlID09PSAnd2VlaycgPyBlbGVtZW50Py50YWJJbmRleCA9PT0gMCA6IGVsZW1lbnQ/LmNsYXNzTGlzdC5jb250YWlucygnY3VycmVudCcpKVxuICAgICAgLmZpbHRlcigoZWxlbWVudCkgPT4gZWxlbWVudD8udGFiSW5kZXggPT09IDApO1xuXG4gICAgY29uc3QgaW5kZXggPSBsaXN0LmluZGV4T2YoZWxlbWVudCk7XG4gICAgY29uc3QgZmlyc3QgPSBpbmRleCA9PT0gMDtcbiAgICBjb25zdCBsYXN0ID0gaW5kZXggPT09IGxpc3QubGVuZ3RoIC0gMTtcblxuICAgIGNvbnN0IHRvQm91bmRhcnkgPSB7XG4gICAgICBzdGFydDogaW5kZXgsXG4gICAgICBlbmQ6IGxpc3QubGVuZ3RoIC0gKGluZGV4ICsgMSlcbiAgICB9O1xuXG4gICAgY29uc3QgZ2FwID0ge1xuICAgICAgQXJyb3dSaWdodDogMSxcbiAgICAgIEFycm93TGVmdDogLTEsXG4gICAgICBBcnJvd1VwOiBzZWxlY3Rpb25UeXBlID09PSAnd2VlaycgJiYgdmlldyA9PT0gJ2RheXMnID8gLTEgOiB2aWV3ID09PSAnZGF5cycgPyAtNyA6IC0zLFxuICAgICAgQXJyb3dEb3duOiBzZWxlY3Rpb25UeXBlID09PSAnd2VlaycgJiYgdmlldyA9PT0gJ2RheXMnID8gMSA6IHZpZXcgPT09ICdkYXlzJyA/IDcgOiAzXG4gICAgfTtcblxuICAgIGlmIChcbiAgICAgIChldmVudEtleSA9PT0gJ0Fycm93UmlnaHQnICYmIGxhc3QpIHx8XG4gICAgICAoZXZlbnRLZXkgPT09ICdBcnJvd0Rvd24nICYmIHRvQm91bmRhcnkuZW5kIDwgZ2FwLkFycm93RG93bikgfHxcbiAgICAgIChldmVudEtleSA9PT0gJ0Fycm93TGVmdCcgJiYgZmlyc3QpIHx8XG4gICAgICAoZXZlbnRLZXkgPT09ICdBcnJvd1VwJyAmJiB0b0JvdW5kYXJ5LnN0YXJ0IDwgTWF0aC5hYnMoZ2FwLkFycm93VXApKVxuICAgICkge1xuICAgICAgZWxlbWVudHMuY2hhbmdlc1xuICAgICAgICAucGlwZSh0YWtlKDEpLCB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy4jZGVzdHJveVJlZikpXG4gICAgICAgIC5zdWJzY3JpYmUoKGNoYW5nZTogUXVlcnlMaXN0PENhbGVuZGFyUm93RGlyZWN0aXZlIHwgQ2FsZW5kYXJEYXlEaXJlY3RpdmU+KSA9PiB7XG4gICAgICAgICAgY29uc3QgX2xpc3QgPSBjaGFuZ2VcbiAgICAgICAgICAgIC50b0FycmF5KClcbiAgICAgICAgICAgIC8vIC5maWx0ZXIoZWxlbWVudCA9PiB0aGlzLnNlbGVjdGlvblR5cGUgPT09ICd3ZWVrJyA/IGVsZW1lbnQ/LmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC50YWJJbmRleCA9PT0gMCA6IGVsZW1lbnQ/LmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2N1cnJlbnQnKSk7XG4gICAgICAgICAgICAuZmlsdGVyKChkaXJlY3RpdmUpID0+IGRpcmVjdGl2ZT8uZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnRhYkluZGV4ID09PSAwKTtcblxuICAgICAgICAgIGlmIChfbGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBkYXlUb0ZvY3VzOiBDYWxlbmRhckRheURpcmVjdGl2ZSB8IENhbGVuZGFyUm93RGlyZWN0aXZlIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgc3dpdGNoIChldmVudEtleSkge1xuICAgICAgICAgICAgICBjYXNlICdBcnJvd1JpZ2h0Jzoge1xuICAgICAgICAgICAgICAgIGRheVRvRm9jdXMgPSBfbGlzdFswXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXNlICdBcnJvd0xlZnQnOiB7XG4gICAgICAgICAgICAgICAgZGF5VG9Gb2N1cyA9IF9saXN0W19saXN0Lmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhc2UgJ0Fycm93RG93bic6IHtcbiAgICAgICAgICAgICAgICBkYXlUb0ZvY3VzID0gX2xpc3RbZ2FwLkFycm93RG93biAtIChsaXN0Lmxlbmd0aCAtIGluZGV4KV07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2FzZSAnQXJyb3dVcCc6IHtcbiAgICAgICAgICAgICAgICBkYXlUb0ZvY3VzID0gX2xpc3RbX2xpc3QubGVuZ3RoIC0gKE1hdGguYWJzKGdhcC5BcnJvd1VwKSArIDEgLSAoaW5kZXggKyAxKSldO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWRheVRvRm9jdXM/LmRpc2FibGVkKSB7XG4gICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdkYXlUb0ZvY3VzJywgZGF5VG9Gb2N1cz8uZGF0ZSk7XG4gICAgICAgICAgICAgIGRheVRvRm9jdXM/LmZvY3VzKCdrZXlib2FyZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgIHN3aXRjaCAodmlldykge1xuICAgICAgICBjYXNlICdkYXlzJzpcbiAgICAgICAgICB0aGlzLnNldENhbGVuZGFyUGFnZSgwLCBbJ0Fycm93UmlnaHQnLCAnQXJyb3dEb3duJ10uaW5jbHVkZXMoZXZlbnRLZXkpID8gMSA6IC0xKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbW9udGhzJzpcbiAgICAgICAgICB0aGlzLnNldENhbGVuZGFyUGFnZShbJ0Fycm93UmlnaHQnLCAnQXJyb3dEb3duJ10uaW5jbHVkZXMoZXZlbnRLZXkpID8gMSA6IC0xKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAneWVhcnMnOlxuICAgICAgICAgIHRoaXMuc2V0Q2FsZW5kYXJQYWdlKFsnQXJyb3dSaWdodCcsICdBcnJvd0Rvd24nXS5pbmNsdWRlcyhldmVudEtleSkgPyAxMiA6IC0xMik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3QgbmV4dEVsZW1lbnQgPSBsaXN0W2luZGV4ICsgZ2FwW2V2ZW50S2V5XV07XG4gICAgaWYgKG5leHRFbGVtZW50Py50YWJJbmRleCA9PT0gMCkge1xuICAgICAgbmV4dEVsZW1lbnQuZm9jdXMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gaW5kZXg7IGkgPCBsaXN0Lmxlbmd0aDsgbGlzdC5sZW5ndGggJiYgWydBcnJvd1JpZ2h0JywgJ0Fycm93RG93biddLmluY2x1ZGVzKGV2ZW50S2V5KSA/IGkrKyA6IGktLSkge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgY29uc3QgbmV4dEVsZW1lbnQgPSBsaXN0W2kgKyBnYXBbZXZlbnRLZXldXTtcbiAgICAgIGlmIChuZXh0RWxlbWVudD8udGFiSW5kZXggPT09IDApIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBuZXh0RWxlbWVudD8uZm9jdXMoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBpZiAoIW5leHRFbGVtZW50KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGhhbmRsZUNlbGxNb3VzZUxlYXZlKCkge1xuICAgIHRoaXMuI2NhbGVuZGFyU2VydmljZS51cGRhdGUoeyBob3ZlckRhdGU6IG51bGwgfSk7XG4gIH1cblxuICBoYW5kbGVEYXlDZWxsS2V5VXAoJGV2ZW50OiBLZXlib2FyZEV2ZW50LCBkYXRlOiBEYXRlKSB7XG4gICAgaWYgKFsnU3BhY2UnLCAnRW50ZXInXS5pbmNsdWRlcygkZXZlbnQuY29kZSkpIHtcbiAgICAgIHRoaXMuaGFuZGxlRGF5Q2VsbENsaWNrKGRhdGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoWydUYWInLCAnQXJyb3dSaWdodCcsICdBcnJvd0xlZnQnLCAnQXJyb3dVcCcsICdBcnJvd0Rvd24nXS5pbmNsdWRlcygkZXZlbnQuY29kZSkpIHtcbiAgICAgIHRoaXMuaGFuZGxlQ2VsbE1vdXNlRW50ZXIoZGF0ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlRGF5Q2VsbENsaWNrKGRhdGU6IERhdGUpIHtcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25UeXBlKCkgPT09ICdkYXknICYmIHRoaXMuaXNEYXRlRGlzYWJsZWQoZGF0ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMucmFuZ2UoKSkge1xuICAgICAgdGhpcy5lbmREYXRlLnNldChudWxsKTtcbiAgICAgIHRoaXMuc3RhcnREYXRlLnNldChkYXRlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzdGFydERhdGUgPSB0aGlzLnN0YXJ0RGF0ZSgpO1xuICAgIGNvbnN0IGVuZERhdGUgPSB0aGlzLmVuZERhdGUoKTtcblxuICAgIGlmIChzdGFydERhdGUgJiYgZW5kRGF0ZSkge1xuICAgICAgdGhpcy5zdGFydERhdGUuc2V0KG51bGwpO1xuICAgICAgdGhpcy5lbmREYXRlLnNldChudWxsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoISFzdGFydERhdGUgJiYgIWVuZERhdGUpIHtcbiAgICAgIGlmIChzdGFydERhdGUgJiYgZGF0ZSA8IHN0YXJ0RGF0ZSkge1xuICAgICAgICB0aGlzLmVuZERhdGUuc2V0KG51bGwpO1xuICAgICAgICB0aGlzLnN0YXJ0RGF0ZS5zZXQoZGF0ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBhZGREYXlzID0gdGhpcy5zZWxlY3Rpb25UeXBlKCkgIT09ICd3ZWVrJyA/IDEgOiA3O1xuICAgICAgICB0aGlzLmVuZERhdGUuc2V0KG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCBkYXRlLmdldERhdGUoKSArIGFkZERheXMsIDAsIDAsIC0xLCAwKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW5kRGF0ZS5zZXQobnVsbCk7XG4gICAgICB0aGlzLnN0YXJ0RGF0ZS5zZXQoZGF0ZSk7XG4gICAgfVxuICAgIHtcbiAgICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IHRoaXMuc3RhcnREYXRlKCk7XG4gICAgICBjb25zdCBlbmREYXRlID0gdGhpcy5lbmREYXRlKCk7XG4gICAgICBpZiAoc3RhcnREYXRlICYmIGVuZERhdGUpIHtcbiAgICAgICAgY29uc3QgZGF0ZUZpbHRlckZuID0gdGhpcy5kYXRlRmlsdGVyKCk7XG4gICAgICAgIGlmIChpc0RhdGVJblJhbmdlRGlzYWJsZWQoc3RhcnREYXRlLCBlbmREYXRlLCB0aGlzLmRpc2FibGVkRGF0ZXMoKSwgZGF0ZUZpbHRlckZuKSkge1xuICAgICAgICAgIHRoaXMuc3RhcnREYXRlLnNldChudWxsKTtcbiAgICAgICAgICB0aGlzLmVuZERhdGUuc2V0KG51bGwpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNhbGVuZGFyU3RhdGVTdWJzY3JpYmUoKTogdm9pZCB7XG4gICAgdGhpcy4jY2FsZW5kYXJTZXJ2aWNlLmNhbGVuZGFyU3RhdGUkLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuI2Rlc3Ryb3lSZWYpKS5zdWJzY3JpYmUoKHN0YXRlKSA9PiB7XG4gICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoc3RhdGUpO1xuXG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgIGlmIChrZXkgaW4gdGhpcykge1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICBjb25zdCBpc1dyaXRhYmxlU2lnbmFsID0gdHlwZW9mIHRoaXNba2V5XSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdGhpc1trZXldLnNldCA9PT0gJ2Z1bmN0aW9uJztcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgaXNXcml0YWJsZVNpZ25hbCA/IHRoaXNba2V5XS5zZXQoc3RhdGVba2V5XSkgOiAodGhpc1trZXldID0gc3RhdGVba2V5XSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGdldE1vbnRoU3RhcnQoaW5kZXg6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgRGF0ZSh0aGlzLmNhbGVuZGFyRGF0ZSgpLmdldEZ1bGxZZWFyKCksIGluZGV4ICsgdGhpcy5hZGRNb250aHMoKSwgMSwgMCwgMCwgMCwgMCk7XG4gIH1cblxuICBnZXRNb250aEVuZChpbmRleDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHRoaXMuY2FsZW5kYXJEYXRlKCkuZ2V0RnVsbFllYXIoKSwgaW5kZXggKyAxICsgdGhpcy5hZGRNb250aHMoKSwgMSwgMCwgMCwgLTEsIDApO1xuICB9XG5cbiAgZ2V0WWVhclN0YXJ0KHllYXI6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgRGF0ZSh5ZWFyLCAwLCAxKTtcbiAgfVxuXG4gIGdldFllYXJFbmQoeWVhcjogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHllYXIsIDExLCAxLCAwLCAwLCAtMSwgMCk7XG4gIH1cbn1cbiIsIjx0YWJsZT5cbiAgQGlmICh2aWV3KCkgPT09ICdkYXlzJykge1xuICAgIDx0aGVhZD5cbiAgICA8dHI+XG4gICAgICBAaWYgKHNob3dXZWVrTnVtYmVyKCkpIHtcbiAgICAgICAgPHRoIGNsYXNzPVwiY2FsZW5kYXItY2VsbFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxlbmRhci1oZWFkZXItY2VsbC1pbm5lclwiPnt7IHdlZWtOdW1iZXJzTGFiZWwoKSB9fTwvZGl2PlxuICAgICAgICA8L3RoPlxuICAgICAgfVxuICAgICAgQGZvciAod2Vla0RheSBvZiB3ZWVrRGF5cygpOyB0cmFjayB3ZWVrRGF5LmRhdGU7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICAgIEBsZXQgZGF0ZSA9IHdlZWtEYXkuZGF0ZSA7XG4gICAgICAgIDx0aCBjbGFzcz1cImNhbGVuZGFyLWNlbGxcIiBhYmJyPVwie3tkYXRlIHwgY2FsZW5kYXJXZWVrZGF5Oidsb25nJzpsb2NhbGUoKX19XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLWhlYWRlci1jZWxsLWlubmVyXCI+XG4gICAgICAgICAgICB7eyBkYXRlIHwgY2FsZW5kYXJXZWVrZGF5OndlZWtkYXlGb3JtYXQoKTpsb2NhbGUoKSB9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3RoPlxuICAgICAgfVxuICAgIDwvdHI+XG4gICAgPC90aGVhZD5cbiAgfVxuICA8dGJvZHkgKG1vdXNlbGVhdmUpPVwiaGFuZGxlQ2VsbE1vdXNlTGVhdmUoKVwiPlxuICAgIEBzd2l0Y2ggKHZpZXcoKSkge1xuICAgICAgQGNhc2UgKCd5ZWFycycpIHtcbiAgICAgICAgQGZvciAoeWVhcnNSb3cgb2YgbGlzdE9mWWVhcnMoKTsgdHJhY2sgeWVhcnNSb3dbMF07IGxldCByb3dJZHggPSAkaW5kZXgpIHtcbiAgICAgICAgICA8dHI+XG4gICAgICAgICAgICBAZm9yICh5ZWFyIG9mIHllYXJzUm93OyB0cmFjayB5ZWFyOyBsZXQgaWR4ID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgICNjYWxlbmRhclllYXI9XCJjQ2FsZW5kYXJEYXlcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCIhY2FsZW5kYXJZZWFyLmRpc2FibGVkJCgpICYmIGhhbmRsZVllYXJDZWxsQ2xpY2soeWVhcilcIlxuICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImNhbGVuZGFyWWVhci5kYXRlKCkgJiYgaGFuZGxlRGF5Q2VsbEtleURvd24oJGV2ZW50LCBjYWxlbmRhclllYXIuZGF0ZSgpKVwiXG4gICAgICAgICAgICAgICAgKGtleXVwKT1cImhhbmRsZVllYXJDZWxsS2V5VXAoJGV2ZW50LCBjYWxlbmRhclllYXIuZGF0ZSgpKVwiXG4gICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwiY2FsZW5kYXJZZWFyLmRhdGUoKSAmJiBoYW5kbGVDZWxsTW91c2VFbnRlcihjYWxlbmRhclllYXIuZGF0ZSgpKVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJjYWxlbmRhclllYXIuZGF0ZSgpPy5nZXRGdWxsWWVhcigpXCJcbiAgICAgICAgICAgICAgICBbZGF0ZV09XCJnZXRZZWFyU3RhcnQoeWVhcilcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInllYXIgfCBjYWxlbmRhckNsYXNzWWVhclwiXG4gICAgICAgICAgICAgICAgW3RhYmluZGV4XT1cImNhbGVuZGFyWWVhci5kaXNhYmxlZCQoKSA/IC0xIDogMFwiXG4gICAgICAgICAgICAgICAgY0NhbGVuZGFyRGF5XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItY2VsbC1pbm5lclwiPlxuICAgICAgICAgICAgICAgICAge3sgeWVhck51bWJlcih5ZWFyKSB9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIEBjYXNlICgnbW9udGhzJykge1xuICAgICAgICBAZm9yIChtb250aHNSb3cgb2YgbGlzdE9mTW9udGhzKCk7IHRyYWNrIG1vbnRoc1Jvd1swXTsgbGV0IHJvd0lkeCA9ICRpbmRleCkge1xuICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgIEBmb3IgKG1vbnRoIG9mIG1vbnRoc1JvdzsgdHJhY2sgbW9udGg7IGxldCBpZHggPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgQGxldCBtb250aFN0YXJ0ID0gZ2V0TW9udGhTdGFydChyb3dJZHgqMytpZHgpO1xuICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICAjY2FsZW5kYXJNb250aD1cImNDYWxlbmRhckRheVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIiFjYWxlbmRhck1vbnRoLmRpc2FibGVkJCgpICYmIGhhbmRsZU1vbnRoQ2VsbENsaWNrKGNhbGVuZGFyTW9udGguZGF0ZSgpKVwiXG4gICAgICAgICAgICAgICAgKGtleWRvd24pPVwiY2FsZW5kYXJNb250aC5kYXRlKCkgJiYgaGFuZGxlRGF5Q2VsbEtleURvd24oJGV2ZW50LCBjYWxlbmRhck1vbnRoLmRhdGUoKSlcIlxuICAgICAgICAgICAgICAgIChrZXl1cCk9XCJoYW5kbGVNb250aENlbGxLZXlVcCgkZXZlbnQsIGNhbGVuZGFyTW9udGguZGF0ZSgpKVwiXG4gICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwiY2FsZW5kYXJNb250aC5kYXRlKCkgJiYgaGFuZGxlQ2VsbE1vdXNlRW50ZXIoY2FsZW5kYXJNb250aC5kYXRlKCkpXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImNhbGVuZGFyTW9udGguZGF0ZSgpPy5nZXRGdWxsWWVhcigpKycgJyttb250aC5tb250aFwiXG4gICAgICAgICAgICAgICAgW2RhdGVdPVwibW9udGhTdGFydFwiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwibW9udGhTdGFydCB8IGNhbGVuZGFyQ2xhc3NNb250aDoocm93SWR4KjMraWR4KVwiXG4gICAgICAgICAgICAgICAgW3RhYmluZGV4XT1cImNhbGVuZGFyTW9udGguZGlzYWJsZWQkKCkgPyAtMSA6IDBcIlxuICAgICAgICAgICAgICAgIGNDYWxlbmRhckRheVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLWNlbGwtaW5uZXJcIj5cbiAgICAgICAgICAgICAgICAgIHt7IG1vbnRoLm1vbnRoIH19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgfVxuXG4gICAgICB9XG4gICAgICBAZGVmYXVsdCB7XG4gICAgICAgIEBsZXQgd2Vla1NlbGVjdGlvbiA9IHNlbGVjdGlvblR5cGUoKSA9PT0gJ3dlZWsnO1xuICAgICAgICBAbGV0IGRheVNlbGVjdGlvbiA9IHNlbGVjdGlvblR5cGUoKSA9PT0gJ2RheSc7XG4gICAgICAgIEBmb3IgKHdlZWsgb2YgbW9udGhEZXRhaWxzKCk7IHRyYWNrIHdlZWsuZGF5c1swXTsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgICAgICA8dHIgI2NhbGVuZGFyUm93PVwiY0NhbGVuZGFyUm93XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIndlZWtTZWxlY3Rpb24gJiYgKGNhbGVuZGFyUm93LmN1cnJlbnQpICYmIGNhbGVuZGFyUm93LmRhdGUgJiYgaGFuZGxlRGF5Q2VsbENsaWNrKGNhbGVuZGFyUm93LmRhdGUpXCJcbiAgICAgICAgICAgICAgKGtleWRvd24pPVwid2Vla1NlbGVjdGlvbiAmJiAoY2FsZW5kYXJSb3cuY3VycmVudCkgJiYgY2FsZW5kYXJSb3cuZGF0ZSAmJiBoYW5kbGVEYXlDZWxsS2V5RG93bigkZXZlbnQsIGNhbGVuZGFyUm93LmRhdGUpXCJcbiAgICAgICAgICAgICAgKGtleXVwKT1cIndlZWtTZWxlY3Rpb24gJiYgKGNhbGVuZGFyUm93LmN1cnJlbnQpICYmIGNhbGVuZGFyUm93LmRhdGUgJiYgaGFuZGxlRGF5Q2VsbEtleVVwKCRldmVudCwgY2FsZW5kYXJSb3cuZGF0ZSlcIlxuICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJ3ZWVrU2VsZWN0aW9uICYmIGNhbGVuZGFyUm93LmRhdGUgJiYgaGFuZGxlQ2VsbE1vdXNlRW50ZXIoY2FsZW5kYXJSb3cuZGF0ZSlcIlxuICAgICAgICAgICAgICBbY0NhbGVuZGFyUm93XT1cIndlZWtcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIEBpZiAoc2hvd1dlZWtOdW1iZXIoKSkge1xuICAgICAgICAgICAgICA8dGggY2xhc3M9XCJjYWxlbmRhci1jZWxsLXdlZWstbnVtYmVyXCI+XG4gICAgICAgICAgICAgICAge3sgd2Vlay53ZWVrTnVtYmVyID09PSAwID8gNTMgOiB3ZWVrLndlZWtOdW1iZXIgfX1cbiAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBmb3IgKGRhdGVPYmogb2Ygd2Vlay5kYXlzOyB0cmFjayBkYXRlT2JqLmRhdGU7IGxldCBpZHggPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgQGxldCBjdXJyZW50TW9udGggPSBkYXRlT2JqLm1vbnRoID09PSAnY3VycmVudCc7XG4gICAgICAgICAgICAgIEBpZiAoY3VycmVudE1vbnRoIHx8IHNob3dBZGphY2VudERheXMoKSkge1xuICAgICAgICAgICAgICAgIEBsZXQgc2VsZWN0YWJsZSA9IGRheVNlbGVjdGlvbiAmJiAoY3VycmVudE1vbnRoIHx8IHNlbGVjdEFkamFjZW50RGF5cygpKTtcbiAgICAgICAgICAgICAgICA8dGQgI2NhbGVuZGFyQ2VsbD1cImNDYWxlbmRhckRheVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RhYmxlICYmIGhhbmRsZURheUNlbGxDbGljayhkYXRlT2JqLmRhdGUpXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwic2VsZWN0YWJsZSAmJiBoYW5kbGVEYXlDZWxsS2V5RG93bigkZXZlbnQsIGRhdGVPYmouZGF0ZSlcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5dXApPVwic2VsZWN0YWJsZSAmJiBoYW5kbGVEYXlDZWxsS2V5VXAoJGV2ZW50LCBkYXRlT2JqLmRhdGUpXCJcbiAgICAgICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwic2VsZWN0YWJsZSAmJiBoYW5kbGVDZWxsTW91c2VFbnRlcihkYXRlT2JqLmRhdGUpXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJkYXRlT2JqLmRhdGUgfCBjYWxlbmRhckRheVRpdGxlOmxvY2FsZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2RhdGVdPVwiZGF0ZU9iai5kYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgW21vbnRoXT1cImRhdGVPYmoubW9udGhcIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJkYXRlT2JqIHwgY2FsZW5kYXJDbGFzc0RheTp7bWluRGF0ZTogbWluRGF0ZSgpLCBtYXhEYXRlOiBtYXhEYXRlKCksIGRpc2FibGVkRGF0ZXM6IGRpc2FibGVkRGF0ZXMoKSwgZGF0ZUZpbHRlcjogZGF0ZUZpbHRlcigpfVwiXG4gICAgICAgICAgICAgICAgICAgIFt0YWJpbmRleF09XCJzZWxlY3RhYmxlICYmICFpc0RhdGVEaXNhYmxlZChkYXRlT2JqLmRhdGUpID8gMCA6IC0xXCJcbiAgICAgICAgICAgICAgICAgICAgY0NhbGVuZGFyRGF5XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLWNlbGwtaW5uZXJcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgZGF0ZU9iai5kYXRlIHwgY2FsZW5kYXJEYXk6ZGF5Rm9ybWF0KCk6bG9jYWxlKCkgfX1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImNhbGVuZGFyLWNlbGxcIj48L3RkPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgPC90Ym9keT5cbjwvdGFibGU+XG5cbiJdfQ==