@datarailsshared/datarailsshared 1.4.201-rocket → 1.4.202

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 (359) hide show
  1. package/_datarailsshared.styles.css +4 -4
  2. package/assets/styles/_styles.scss +2 -2
  3. package/assets/styles/mixins.scss +7 -0
  4. package/bundles/datarailsshared-datarailsshared.umd.js +8041 -0
  5. package/bundles/datarailsshared-datarailsshared.umd.js.map +1 -0
  6. package/datarailsshared-datarailsshared-1.4.202.tgz +0 -0
  7. package/datarailsshared-datarailsshared.d.ts +34 -0
  8. package/datarailsshared-datarailsshared.metadata.json +1 -0
  9. package/esm2015/datarailsshared-datarailsshared.js +35 -0
  10. package/esm2015/lib/date-tags/date-tag.component.js +73 -0
  11. package/esm2015/lib/date-tags/date-tag.module.js +36 -0
  12. package/esm2015/lib/date-tags/day-tag/day-tag.component.js +77 -0
  13. package/esm2015/lib/date-tags/forecast-tag/forecast-tag.component.js +153 -0
  14. package/esm2015/lib/date-tags/month-tag/month-tag.component.js +80 -0
  15. package/esm2015/lib/date-tags/quarter-tag/quarter-tag.component.js +105 -0
  16. package/esm2015/lib/date-tags/week-tag/week-tag.component.js +84 -0
  17. package/esm2015/lib/date-tags/year-tag/year-tag.component.js +78 -0
  18. package/esm2015/lib/dr-accordion/accordion-item-body.component.js +55 -0
  19. package/esm2015/lib/dr-accordion/accordion-item-header.component.js +77 -0
  20. package/esm2015/lib/dr-accordion/accordion-item.component.js +123 -0
  21. package/esm2015/lib/dr-accordion/accordion.component.js +43 -0
  22. package/esm2015/lib/dr-accordion/accordion.module.js +23 -0
  23. package/esm2015/lib/dr-avatar/dr-avatar.component.js +44 -0
  24. package/esm2015/lib/dr-avatar/dr-avatar.module.js +26 -0
  25. package/esm2015/lib/dr-avatar/dr-avatar.pipe.js +16 -0
  26. package/esm2015/lib/dr-badge-status/dr-badge-status.component.js +25 -0
  27. package/esm2015/lib/dr-badge-status/dr-badge-status.module.js +20 -0
  28. package/esm2015/lib/dr-chat/chat.component.js +119 -0
  29. package/esm2015/lib/dr-chat/chat.module.js +41 -0
  30. package/esm2015/lib/dr-chat/dr-chat-form/chat-form.component.js +155 -0
  31. package/esm2015/lib/dr-chat/dr-chat-message/chat-message.component.js +71 -0
  32. package/esm2015/lib/dr-chat/dr-chat-message/dr-chat-message-custom/chat-custom-message.directive.js +49 -0
  33. package/esm2015/lib/dr-chat/dr-chat-message/dr-chat-message-custom/chat-custom-message.service.js +23 -0
  34. package/esm2015/lib/dr-chat/dr-chat-message/dr-chat-message-file/chat-message-file.component.js +47 -0
  35. package/esm2015/lib/dr-chat/dr-chat-message/dr-chat-message-text/chat-message-text.component.js +18 -0
  36. package/esm2015/lib/dr-chat/dr-chat-suggestions/chat-suggestions.component.js +87 -0
  37. package/esm2015/lib/dr-chat/dr-dot-flashing/dr-dot-flashing.component.js +15 -0
  38. package/esm2015/lib/dr-details-list/dr-details-list.component.js +65 -0
  39. package/esm2015/lib/dr-details-list/dr-details-list.module.js +16 -0
  40. package/esm2015/lib/dr-dialog/components/dialog-modal-wrapper/dialog-modal-wrapper.component.js +70 -0
  41. package/esm2015/lib/dr-dialog/components/dialog-wrapper/dialog-wrapper.component.js +92 -0
  42. package/esm2015/lib/dr-dialog/dialog.module.js +34 -0
  43. package/esm2015/lib/dr-dialog/interfaces/dialog-data.js +25 -0
  44. package/esm2015/lib/dr-dialog/services/dialog.service.js +78 -0
  45. package/esm2015/lib/dr-dropdown/dr-dropdown-item-show.pipe.js +12 -0
  46. package/esm2015/lib/dr-dropdown/dr-dropdown-position.directive.js +104 -0
  47. package/esm2015/lib/dr-dropdown/dr-dropdown.component.js +114 -0
  48. package/esm2015/lib/dr-dropdown/dr-dropdown.directive.js +104 -0
  49. package/esm2015/lib/dr-dropdown/dr-dropdown.module.js +34 -0
  50. package/esm2015/lib/dr-dropdown/dr-dropdown.service.js +24 -0
  51. package/esm2015/lib/dr-dynamic-tag/dr-dynamic-tag.component.js +103 -0
  52. package/esm2015/lib/dr-dynamic-tag/dr-dynamic-tag.module.js +19 -0
  53. package/esm2015/lib/dr-error/dr-error.component.js +64 -0
  54. package/esm2015/lib/dr-error/dr-error.module.js +22 -0
  55. package/esm2015/lib/dr-inputs/button/button.component.js +39 -0
  56. package/esm2015/lib/dr-inputs/checkbox/checkbox.component.js +65 -0
  57. package/esm2015/lib/dr-inputs/date-pickers/directives/dr-date-picker-format.directive.js +47 -0
  58. package/esm2015/lib/dr-inputs/date-pickers/dr-date-picker/dr-date-picker.component.js +216 -0
  59. package/esm2015/lib/dr-inputs/date-pickers/dr-date-picker-with-timeframe/dr-date-picker-with-timeframe.component.js +180 -0
  60. package/esm2015/lib/dr-inputs/date-pickers/dr-date-picker_custom-header/dr-date-picker_custom-header.component.js +183 -0
  61. package/esm2015/lib/dr-inputs/date-pickers/dr-show-timeframe.pipe.js +12 -0
  62. package/esm2015/lib/dr-inputs/date-pickers/services/dr-date-picker.service.js +194 -0
  63. package/esm2015/lib/dr-inputs/dr-input/dr-input.component.js +194 -0
  64. package/esm2015/lib/dr-inputs/dr-inputs.module.js +66 -0
  65. package/esm2015/lib/dr-inputs/dr-model-debounce-change.directive.js +29 -0
  66. package/esm2015/lib/dr-inputs/dr-select/dr-select.component.js +119 -0
  67. package/esm2015/lib/dr-inputs/dr-select-add-item/dr-select-add-item.component.js +74 -0
  68. package/esm2015/lib/dr-inputs/dr-toggle/dr-toggle.component.js +68 -0
  69. package/esm2015/lib/dr-inputs/dr-toggle-button/dr-toggle-button.component.js +63 -0
  70. package/esm2015/lib/dr-inputs/radio-button/radio-button.component.js +73 -0
  71. package/esm2015/lib/dr-inputs/radio-button/radio-group.component.js +157 -0
  72. package/esm2015/lib/dr-layout/dr-layout-body.component.js +13 -0
  73. package/esm2015/lib/dr-layout/dr-layout-header.component.js +17 -0
  74. package/esm2015/lib/dr-layout/dr-layout.component.js +14 -0
  75. package/esm2015/lib/dr-layout/dr-layout.module.js +20 -0
  76. package/esm2015/lib/dr-popover/dr-popover.component.js +106 -0
  77. package/esm2015/lib/dr-popover/dr-popover.directive.js +84 -0
  78. package/esm2015/lib/dr-popover/dr-popover.module.js +23 -0
  79. package/esm2015/lib/dr-popover/dr-popover.service.js +106 -0
  80. package/esm2015/lib/dr-scenario/components/dr-scenario-configuration/dr-scenario-configuration.component.js +102 -0
  81. package/esm2015/lib/dr-scenario/components/dr-scenario-tag-configuration/dr-scenario-tag-configuration.component.js +74 -0
  82. package/esm2015/lib/dr-scenario/consts/scenario-tags-config.js +73 -0
  83. package/esm2015/lib/dr-scenario/dr-scenario.module.js +28 -0
  84. package/esm2015/lib/dr-scenario/services/scenario.service.js +167 -0
  85. package/esm2015/lib/dr-spinner/dr-spinner.component.js +18 -0
  86. package/esm2015/lib/dr-spinner/dr-spinner.directive.js +56 -0
  87. package/esm2015/lib/dr-spinner/dr-spinner.module.js +18 -0
  88. package/esm2015/lib/dr-tabs/dr-tab.component.js +26 -0
  89. package/esm2015/lib/dr-tabs/dr-tabs.component.js +35 -0
  90. package/esm2015/lib/dr-tabs/dr-tabs.module.js +32 -0
  91. package/esm2015/lib/dr-tags/dr-tag.component.js +177 -0
  92. package/esm2015/lib/dr-tags/dr-tag.module.js +24 -0
  93. package/esm2015/lib/dr-tooltip/components/tooltip-info/tooltip-info.component.js +19 -0
  94. package/esm2015/lib/dr-tooltip/components/tooltip-info-simple/tooltip-info-simple.component.js +18 -0
  95. package/esm2015/lib/dr-tooltip/components/tooltip-no-body/tooltip-no-body.component.js +20 -0
  96. package/esm2015/lib/dr-tooltip/components/tooltip-process-default/tooltip-process-default.component.js +34 -0
  97. package/esm2015/lib/dr-tooltip/dr-tooltip.component.js +40 -0
  98. package/esm2015/lib/dr-tooltip/dr-tooltip.directive.js +147 -0
  99. package/esm2015/lib/dr-tooltip/dr-tooltip.module.js +35 -0
  100. package/esm2015/lib/dr-treeview/components/treeview/treeview.component.js +210 -0
  101. package/esm2015/lib/dr-treeview/components/treeview-item/treeview-item.component.js +58 -0
  102. package/esm2015/lib/dr-treeview/dr-tree-view.module.js +38 -0
  103. package/esm2015/lib/dr-treeview/helpers/treeview-event-parser.js +97 -0
  104. package/esm2015/lib/dr-treeview/models/treeview-config.js +22 -0
  105. package/esm2015/lib/dr-treeview/models/treeview-i18n.js +42 -0
  106. package/esm2015/lib/dr-treeview/pipes/treeview.pipe.js +17 -0
  107. package/esm2015/lib/list-tags/list-tag.component.js +37 -0
  108. package/esm2015/lib/list-tags/list-tag.module.js +23 -0
  109. package/esm2015/lib/models/chat.js +36 -0
  110. package/{esm2022/lib/models/datePicker.mjs → esm2015/lib/models/datePicker.js} +1 -1
  111. package/esm2015/lib/models/popover.js +27 -0
  112. package/esm2015/lib/stepper/stepper.component.js +55 -0
  113. package/esm2015/lib/stepper/stepper.module.js +17 -0
  114. package/esm2015/lib/utils/dr-shared-utils.js +47 -0
  115. package/esm2015/public-api.js +93 -0
  116. package/fesm2015/datarailsshared-datarailsshared.js +6885 -0
  117. package/fesm2015/datarailsshared-datarailsshared.js.map +1 -0
  118. package/lib/date-tags/date-tag.component.d.ts +16 -4
  119. package/lib/date-tags/date-tag.module.d.ts +2 -19
  120. package/lib/date-tags/day-tag/day-tag.component.d.ts +1 -4
  121. package/lib/date-tags/forecast-tag/forecast-tag.component.d.ts +2 -5
  122. package/lib/date-tags/month-tag/month-tag.component.d.ts +1 -4
  123. package/lib/date-tags/quarter-tag/quarter-tag.component.d.ts +1 -4
  124. package/lib/date-tags/week-tag/week-tag.component.d.ts +1 -4
  125. package/lib/date-tags/year-tag/year-tag.component.d.ts +1 -4
  126. package/lib/dr-accordion/accordion-item-body.component.d.ts +0 -3
  127. package/lib/dr-accordion/accordion-item-header.component.d.ts +0 -3
  128. package/lib/dr-accordion/accordion-item.component.d.ts +0 -3
  129. package/lib/dr-accordion/accordion.component.d.ts +0 -3
  130. package/lib/dr-accordion/accordion.module.d.ts +0 -9
  131. package/lib/dr-avatar/dr-avatar.component.d.ts +0 -3
  132. package/lib/dr-avatar/dr-avatar.module.d.ts +0 -9
  133. package/lib/dr-avatar/dr-avatar.pipe.d.ts +0 -3
  134. package/lib/dr-badge-status/dr-badge-status.component.d.ts +0 -3
  135. package/lib/dr-badge-status/dr-badge-status.module.d.ts +0 -7
  136. package/lib/dr-chat/chat.component.d.ts +0 -3
  137. package/lib/dr-chat/chat.module.d.ts +0 -17
  138. package/lib/dr-chat/dr-chat-form/chat-form.component.d.ts +0 -3
  139. package/lib/dr-chat/dr-chat-message/chat-message.component.d.ts +0 -3
  140. package/lib/dr-chat/dr-chat-message/dr-chat-message-custom/chat-custom-message.directive.d.ts +0 -3
  141. package/lib/dr-chat/dr-chat-message/dr-chat-message-custom/chat-custom-message.service.d.ts +0 -3
  142. package/lib/dr-chat/dr-chat-message/dr-chat-message-file/chat-message-file.component.d.ts +0 -3
  143. package/lib/dr-chat/dr-chat-message/dr-chat-message-text/chat-message-text.component.d.ts +0 -3
  144. package/lib/dr-chat/dr-chat-suggestions/chat-suggestions.component.d.ts +0 -3
  145. package/lib/dr-chat/dr-dot-flashing/dr-dot-flashing.component.d.ts +0 -3
  146. package/lib/dr-details-list/dr-details-list.component.d.ts +0 -3
  147. package/lib/dr-details-list/dr-details-list.module.d.ts +0 -6
  148. package/lib/dr-dialog/components/dialog-modal-wrapper/dialog-modal-wrapper.component.d.ts +1 -4
  149. package/lib/dr-dialog/components/dialog-wrapper/dialog-wrapper.component.d.ts +2 -5
  150. package/lib/dr-dialog/dialog.module.d.ts +0 -12
  151. package/lib/dr-dialog/interfaces/dialog-data.d.ts +7 -7
  152. package/lib/dr-dialog/services/dialog.service.d.ts +1 -4
  153. package/lib/dr-dropdown/dr-dropdown-item-show.pipe.d.ts +0 -3
  154. package/lib/dr-dropdown/dr-dropdown-position.directive.d.ts +0 -3
  155. package/lib/dr-dropdown/dr-dropdown.component.d.ts +0 -3
  156. package/lib/dr-dropdown/dr-dropdown.directive.d.ts +0 -3
  157. package/lib/dr-dropdown/dr-dropdown.module.d.ts +0 -10
  158. package/lib/dr-dropdown/dr-dropdown.service.d.ts +0 -3
  159. package/lib/dr-dynamic-tag/dr-dynamic-tag.component.d.ts +0 -3
  160. package/lib/dr-dynamic-tag/dr-dynamic-tag.module.d.ts +0 -8
  161. package/lib/dr-error/dr-error.component.d.ts +0 -3
  162. package/lib/dr-error/dr-error.module.d.ts +0 -8
  163. package/lib/dr-inputs/button/button.component.d.ts +1 -4
  164. package/lib/dr-inputs/checkbox/checkbox.component.d.ts +0 -3
  165. package/lib/dr-inputs/date-pickers/directives/dr-date-picker-format.directive.d.ts +0 -3
  166. package/lib/dr-inputs/date-pickers/dr-date-picker/dr-date-picker.component.d.ts +0 -3
  167. package/lib/dr-inputs/date-pickers/dr-date-picker-with-timeframe/dr-date-picker-with-timeframe.component.d.ts +0 -3
  168. package/lib/dr-inputs/date-pickers/dr-date-picker_custom-header/dr-date-picker_custom-header.component.d.ts +8 -4
  169. package/lib/dr-inputs/date-pickers/dr-show-timeframe.pipe.d.ts +2 -4
  170. package/lib/dr-inputs/date-pickers/services/dr-date-picker.service.d.ts +0 -3
  171. package/lib/dr-inputs/dr-input/dr-input.component.d.ts +0 -3
  172. package/lib/dr-inputs/dr-inputs.module.d.ts +0 -25
  173. package/lib/dr-inputs/dr-model-debounce-change.directive.d.ts +0 -3
  174. package/lib/dr-inputs/dr-select/dr-select.component.d.ts +0 -3
  175. package/lib/dr-inputs/dr-select-add-item/dr-select-add-item.component.d.ts +0 -3
  176. package/lib/dr-inputs/dr-toggle/dr-toggle.component.d.ts +0 -3
  177. package/lib/dr-inputs/dr-toggle-button/dr-toggle-button.component.d.ts +0 -3
  178. package/lib/dr-inputs/radio-button/radio-button.component.d.ts +0 -3
  179. package/lib/dr-inputs/radio-button/radio-group.component.d.ts +0 -3
  180. package/lib/dr-layout/dr-layout-body.component.d.ts +0 -3
  181. package/lib/dr-layout/dr-layout-header.component.d.ts +0 -3
  182. package/lib/dr-layout/dr-layout.component.d.ts +0 -3
  183. package/lib/dr-layout/dr-layout.module.d.ts +0 -8
  184. package/lib/dr-popover/dr-popover.component.d.ts +4 -8
  185. package/lib/dr-popover/dr-popover.directive.d.ts +0 -3
  186. package/lib/dr-popover/dr-popover.module.d.ts +0 -7
  187. package/lib/dr-popover/dr-popover.service.d.ts +0 -3
  188. package/lib/dr-scenario/components/dr-scenario-configuration/dr-scenario-configuration.component.d.ts +0 -3
  189. package/lib/dr-scenario/components/dr-scenario-tag-configuration/dr-scenario-tag-configuration.component.d.ts +0 -3
  190. package/lib/dr-scenario/dr-scenario.module.d.ts +0 -10
  191. package/lib/dr-scenario/interfaces/scenario.d.ts +3 -3
  192. package/lib/dr-scenario/services/scenario.service.d.ts +0 -3
  193. package/lib/dr-spinner/dr-spinner.component.d.ts +0 -3
  194. package/lib/dr-spinner/dr-spinner.directive.d.ts +0 -3
  195. package/lib/dr-spinner/dr-spinner.module.d.ts +0 -7
  196. package/lib/dr-tabs/dr-tab.component.d.ts +0 -3
  197. package/lib/dr-tabs/dr-tabs.component.d.ts +0 -3
  198. package/lib/dr-tabs/dr-tabs.module.d.ts +0 -11
  199. package/lib/dr-tags/dr-tag.component.d.ts +0 -3
  200. package/lib/dr-tags/dr-tag.module.d.ts +0 -9
  201. package/lib/dr-tooltip/components/tooltip-info/tooltip-info.component.d.ts +0 -3
  202. package/lib/dr-tooltip/components/tooltip-info-simple/tooltip-info-simple.component.d.ts +0 -3
  203. package/lib/dr-tooltip/components/tooltip-no-body/tooltip-no-body.component.d.ts +0 -3
  204. package/lib/dr-tooltip/components/tooltip-process-default/tooltip-process-default.component.d.ts +0 -3
  205. package/lib/dr-tooltip/dr-tooltip.component.d.ts +1 -4
  206. package/lib/dr-tooltip/dr-tooltip.directive.d.ts +0 -3
  207. package/lib/dr-tooltip/dr-tooltip.module.d.ts +0 -11
  208. package/lib/dr-tooltip/interfaces/tooltip-component-context.d.ts +1 -1
  209. package/lib/dr-treeview/components/treeview/treeview.component.d.ts +0 -3
  210. package/lib/dr-treeview/components/treeview-item/treeview-item.component.d.ts +0 -3
  211. package/lib/dr-treeview/dr-tree-view.module.d.ts +0 -9
  212. package/lib/dr-treeview/helpers/treeview-event-parser.d.ts +0 -9
  213. package/lib/dr-treeview/models/treeview-config.d.ts +0 -3
  214. package/lib/dr-treeview/models/treeview-i18n.d.ts +0 -5
  215. package/lib/dr-treeview/pipes/treeview.pipe.d.ts +0 -3
  216. package/lib/list-tags/list-tag.component.d.ts +0 -3
  217. package/lib/list-tags/list-tag.module.d.ts +0 -8
  218. package/lib/models/chat.d.ts +2 -2
  219. package/lib/models/datePicker.d.ts +3 -10
  220. package/lib/models/dropdown.d.ts +1 -1
  221. package/lib/models/popover.d.ts +1 -1
  222. package/lib/models/serverTags.d.ts +4 -4
  223. package/lib/stepper/interfaces/stepper.d.ts +1 -1
  224. package/lib/stepper/stepper.component.d.ts +0 -3
  225. package/lib/stepper/stepper.module.d.ts +0 -7
  226. package/package.json +15 -27
  227. package/public-api.d.ts +0 -27
  228. package/datarailsshared-datarailsshared-1.4.201-rocket.tgz +0 -0
  229. package/esm2022/datarailsshared-datarailsshared.mjs +0 -5
  230. package/esm2022/lib/date-tags/any-tag.component.mjs +0 -44
  231. package/esm2022/lib/date-tags/date-tag.component.mjs +0 -47
  232. package/esm2022/lib/date-tags/date-tag.module.mjs +0 -66
  233. package/esm2022/lib/date-tags/day-tag/day-tag.component.mjs +0 -82
  234. package/esm2022/lib/date-tags/forecast-tag/forecast-tag.component.mjs +0 -159
  235. package/esm2022/lib/date-tags/month-tag/month-tag.component.mjs +0 -87
  236. package/esm2022/lib/date-tags/quarter-tag/quarter-tag.component.mjs +0 -106
  237. package/esm2022/lib/date-tags/week-tag/week-tag.component.mjs +0 -89
  238. package/esm2022/lib/date-tags/year-tag/year-tag.component.mjs +0 -83
  239. package/esm2022/lib/directives/click-outside/click-outside.directive.mjs +0 -92
  240. package/esm2022/lib/directives/click-outside/click-outside.module.mjs +0 -18
  241. package/esm2022/lib/dr-accordion/accordion-item-body.component.mjs +0 -58
  242. package/esm2022/lib/dr-accordion/accordion-item-header.component.mjs +0 -108
  243. package/esm2022/lib/dr-accordion/accordion-item.component.mjs +0 -138
  244. package/esm2022/lib/dr-accordion/accordion.component.mjs +0 -42
  245. package/esm2022/lib/dr-accordion/accordion.module.mjs +0 -34
  246. package/esm2022/lib/dr-avatar/dr-avatar.component.mjs +0 -48
  247. package/esm2022/lib/dr-avatar/dr-avatar.module.mjs +0 -37
  248. package/esm2022/lib/dr-avatar/dr-avatar.pipe.mjs +0 -20
  249. package/esm2022/lib/dr-badge-status/dr-badge-status.component.mjs +0 -27
  250. package/esm2022/lib/dr-badge-status/dr-badge-status.module.mjs +0 -27
  251. package/esm2022/lib/dr-chat/chat.component.mjs +0 -138
  252. package/esm2022/lib/dr-chat/chat.module.mjs +0 -68
  253. package/esm2022/lib/dr-chat/dr-chat-form/chat-form.component.mjs +0 -168
  254. package/esm2022/lib/dr-chat/dr-chat-message/chat-message.component.mjs +0 -89
  255. package/esm2022/lib/dr-chat/dr-chat-message/dr-chat-message-custom/chat-custom-message.directive.mjs +0 -47
  256. package/esm2022/lib/dr-chat/dr-chat-message/dr-chat-message-custom/chat-custom-message.service.mjs +0 -26
  257. package/esm2022/lib/dr-chat/dr-chat-message/dr-chat-message-file/chat-message-file.component.mjs +0 -49
  258. package/esm2022/lib/dr-chat/dr-chat-message/dr-chat-message-text/chat-message-text.component.mjs +0 -17
  259. package/esm2022/lib/dr-chat/dr-chat-suggestions/chat-suggestions.component.mjs +0 -88
  260. package/esm2022/lib/dr-chat/dr-dot-flashing/dr-dot-flashing.component.mjs +0 -13
  261. package/esm2022/lib/dr-details-list/dr-details-list.component.mjs +0 -79
  262. package/esm2022/lib/dr-details-list/dr-details-list.module.mjs +0 -21
  263. package/esm2022/lib/dr-dialog/components/dialog-modal-wrapper/dialog-modal-wrapper.component.mjs +0 -76
  264. package/esm2022/lib/dr-dialog/components/dialog-wrapper/dialog-wrapper.component.mjs +0 -97
  265. package/esm2022/lib/dr-dialog/dialog.module.mjs +0 -51
  266. package/esm2022/lib/dr-dialog/interfaces/dialog-data.mjs +0 -25
  267. package/esm2022/lib/dr-dialog/services/dialog.service.mjs +0 -77
  268. package/esm2022/lib/dr-dropdown/dr-dropdown-item-show.pipe.mjs +0 -16
  269. package/esm2022/lib/dr-dropdown/dr-dropdown-position.directive.mjs +0 -104
  270. package/esm2022/lib/dr-dropdown/dr-dropdown.component.mjs +0 -116
  271. package/esm2022/lib/dr-dropdown/dr-dropdown.directive.mjs +0 -117
  272. package/esm2022/lib/dr-dropdown/dr-dropdown.module.mjs +0 -49
  273. package/esm2022/lib/dr-dropdown/dr-dropdown.service.mjs +0 -25
  274. package/esm2022/lib/dr-dynamic-tag/dr-dynamic-tag.component.mjs +0 -112
  275. package/esm2022/lib/dr-dynamic-tag/dr-dynamic-tag.module.mjs +0 -28
  276. package/esm2022/lib/dr-error/dr-error.component.mjs +0 -67
  277. package/esm2022/lib/dr-error/dr-error.module.mjs +0 -31
  278. package/esm2022/lib/dr-inputs/button/button.component.mjs +0 -66
  279. package/esm2022/lib/dr-inputs/checkbox/checkbox.component.mjs +0 -65
  280. package/esm2022/lib/dr-inputs/date-pickers/directives/dr-date-picker-format.directive.mjs +0 -64
  281. package/esm2022/lib/dr-inputs/date-pickers/dr-date-picker/dr-date-picker.component.mjs +0 -226
  282. package/esm2022/lib/dr-inputs/date-pickers/dr-date-picker-with-timeframe/dr-date-picker-with-timeframe.component.mjs +0 -190
  283. package/esm2022/lib/dr-inputs/date-pickers/dr-date-picker_custom-header/dr-date-picker_custom-header.component.mjs +0 -186
  284. package/esm2022/lib/dr-inputs/date-pickers/dr-show-timeframe.pipe.mjs +0 -16
  285. package/esm2022/lib/dr-inputs/date-pickers/services/dr-date-picker.service.mjs +0 -195
  286. package/esm2022/lib/dr-inputs/dr-input/dr-input.component.mjs +0 -218
  287. package/esm2022/lib/dr-inputs/dr-inputs.module.mjs +0 -108
  288. package/esm2022/lib/dr-inputs/dr-model-debounce-change.directive.mjs +0 -31
  289. package/esm2022/lib/dr-inputs/dr-select/dr-select.component.mjs +0 -159
  290. package/esm2022/lib/dr-inputs/dr-select-add-item/dr-select-add-item.component.mjs +0 -79
  291. package/esm2022/lib/dr-inputs/dr-toggle/dr-toggle.component.mjs +0 -72
  292. package/esm2022/lib/dr-inputs/dr-toggle-button/dr-toggle-button.component.mjs +0 -66
  293. package/esm2022/lib/dr-inputs/radio-button/radio-button.component.mjs +0 -78
  294. package/esm2022/lib/dr-inputs/radio-button/radio-group.component.mjs +0 -173
  295. package/esm2022/lib/dr-layout/dr-layout-body.component.mjs +0 -16
  296. package/esm2022/lib/dr-layout/dr-layout-header.component.mjs +0 -24
  297. package/esm2022/lib/dr-layout/dr-layout.component.mjs +0 -13
  298. package/esm2022/lib/dr-layout/dr-layout.module.mjs +0 -29
  299. package/esm2022/lib/dr-popover/dr-popover.component.mjs +0 -126
  300. package/esm2022/lib/dr-popover/dr-popover.directive.mjs +0 -110
  301. package/esm2022/lib/dr-popover/dr-popover.module.mjs +0 -30
  302. package/esm2022/lib/dr-popover/dr-popover.service.mjs +0 -107
  303. package/esm2022/lib/dr-scenario/components/dr-scenario-configuration/dr-scenario-configuration.component.mjs +0 -105
  304. package/esm2022/lib/dr-scenario/components/dr-scenario-tag-configuration/dr-scenario-tag-configuration.component.mjs +0 -83
  305. package/esm2022/lib/dr-scenario/consts/scenario-tags-config.mjs +0 -81
  306. package/esm2022/lib/dr-scenario/dr-scenario.module.mjs +0 -41
  307. package/esm2022/lib/dr-scenario/services/scenario.service.mjs +0 -165
  308. package/esm2022/lib/dr-spinner/dr-spinner.component.mjs +0 -17
  309. package/esm2022/lib/dr-spinner/dr-spinner.directive.mjs +0 -59
  310. package/esm2022/lib/dr-spinner/dr-spinner.module.mjs +0 -23
  311. package/esm2022/lib/dr-tabs/dr-tab.component.mjs +0 -37
  312. package/esm2022/lib/dr-tabs/dr-tabs.component.mjs +0 -47
  313. package/esm2022/lib/dr-tabs/dr-tabs.module.mjs +0 -49
  314. package/esm2022/lib/dr-tags/dr-tag.component.mjs +0 -188
  315. package/esm2022/lib/dr-tags/dr-tag.module.mjs +0 -35
  316. package/esm2022/lib/dr-tooltip/components/tooltip-info/tooltip-info.component.mjs +0 -18
  317. package/esm2022/lib/dr-tooltip/components/tooltip-info-simple/tooltip-info-simple.component.mjs +0 -16
  318. package/esm2022/lib/dr-tooltip/components/tooltip-no-body/tooltip-no-body.component.mjs +0 -18
  319. package/esm2022/lib/dr-tooltip/components/tooltip-process-default/tooltip-process-default.component.mjs +0 -19
  320. package/esm2022/lib/dr-tooltip/dr-tooltip.component.mjs +0 -48
  321. package/esm2022/lib/dr-tooltip/dr-tooltip.directive.mjs +0 -156
  322. package/esm2022/lib/dr-tooltip/dr-tooltip.module.mjs +0 -48
  323. package/esm2022/lib/dr-treeview/components/treeview/treeview.component.mjs +0 -215
  324. package/esm2022/lib/dr-treeview/components/treeview-item/treeview-item.component.mjs +0 -60
  325. package/esm2022/lib/dr-treeview/dr-tree-view.module.mjs +0 -48
  326. package/esm2022/lib/dr-treeview/helpers/treeview-event-parser.mjs +0 -106
  327. package/esm2022/lib/dr-treeview/models/treeview-config.mjs +0 -25
  328. package/esm2022/lib/dr-treeview/models/treeview-i18n.mjs +0 -47
  329. package/esm2022/lib/dr-treeview/pipes/treeview.pipe.mjs +0 -21
  330. package/esm2022/lib/list-tags/list-tag.component.mjs +0 -42
  331. package/esm2022/lib/list-tags/list-tag.module.mjs +0 -34
  332. package/esm2022/lib/models/chat.mjs +0 -36
  333. package/esm2022/lib/models/popover.mjs +0 -27
  334. package/esm2022/lib/stepper/stepper.component.mjs +0 -63
  335. package/esm2022/lib/stepper/stepper.module.mjs +0 -24
  336. package/esm2022/lib/utils/dr-shared-utils.mjs +0 -47
  337. package/esm2022/public-api.mjs +0 -120
  338. package/fesm2022/datarailsshared-datarailsshared.mjs +0 -7551
  339. package/fesm2022/datarailsshared-datarailsshared.mjs.map +0 -1
  340. package/index.d.ts +0 -5
  341. package/lib/date-tags/any-tag.component.d.ts +0 -20
  342. package/lib/directives/click-outside/click-outside.directive.d.ts +0 -23
  343. package/lib/directives/click-outside/click-outside.module.d.ts +0 -8
  344. /package/{esm2022/lib/dr-inputs/dr-toggle-button/toggle-button-mode.mjs → esm2015/lib/dr-inputs/dr-toggle-button/toggle-button-mode.js} +0 -0
  345. /package/{esm2022/lib/dr-popover/dr-popover-ref.mjs → esm2015/lib/dr-popover/dr-popover-ref.js} +0 -0
  346. /package/{esm2022/lib/dr-scenario/interfaces/scenario.mjs → esm2015/lib/dr-scenario/interfaces/scenario.js} +0 -0
  347. /package/{esm2022/lib/dr-tooltip/enums/tooltip-position.enum.mjs → esm2015/lib/dr-tooltip/enums/tooltip-position.enum.js} +0 -0
  348. /package/{esm2022/lib/dr-tooltip/interfaces/tooltip-component-context.mjs → esm2015/lib/dr-tooltip/interfaces/tooltip-component-context.js} +0 -0
  349. /package/{esm2022/lib/dr-treeview/helpers/treeview-helper.mjs → esm2015/lib/dr-treeview/helpers/treeview-helper.js} +0 -0
  350. /package/{esm2022/lib/dr-treeview/models/treeview-header-template-context.mjs → esm2015/lib/dr-treeview/models/treeview-header-template-context.js} +0 -0
  351. /package/{esm2022/lib/dr-treeview/models/treeview-item-template-context.mjs → esm2015/lib/dr-treeview/models/treeview-item-template-context.js} +0 -0
  352. /package/{esm2022/lib/dr-treeview/models/treeview-item.mjs → esm2015/lib/dr-treeview/models/treeview-item.js} +0 -0
  353. /package/{esm2022/lib/models/badgeStatus.mjs → esm2015/lib/models/badgeStatus.js} +0 -0
  354. /package/{esm2022/lib/models/constants.mjs → esm2015/lib/models/constants.js} +0 -0
  355. /package/{esm2022/lib/models/dropdown.mjs → esm2015/lib/models/dropdown.js} +0 -0
  356. /package/{esm2022/lib/models/serverTags.mjs → esm2015/lib/models/serverTags.js} +0 -0
  357. /package/{esm2022/lib/models/spinnerOptions.mjs → esm2015/lib/models/spinnerOptions.js} +0 -0
  358. /package/{esm2022/lib/models/validationError.mjs → esm2015/lib/models/validationError.js} +0 -0
  359. /package/{esm2022/lib/stepper/interfaces/stepper.mjs → esm2015/lib/stepper/interfaces/stepper.js} +0 -0
@@ -0,0 +1,183 @@
1
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject } from "@angular/core";
2
+ import { Subject } from 'rxjs';
3
+ import { takeUntil } from 'rxjs/operators';
4
+ import { MatCalendar } from '@angular/material/datepicker';
5
+ import { DateAdapter, MAT_DATE_FORMATS } from '@angular/material/core';
6
+ import { CalendarView, CustomDateFormat, TimeframeOption } from '../../../models/datePicker';
7
+ import { DrDatePickerService } from '../services/dr-date-picker.service';
8
+ import { PRESET_TAGS_LIST } from "../../../models/constants";
9
+ // @ts-ignore
10
+ const moment = require('moment');
11
+ export class DrDatePickerCustomHeaderComponent {
12
+ constructor(_calendar, _dateAdapter, _dateFormats, cdr, datePickerService) {
13
+ this._calendar = _calendar;
14
+ this._dateAdapter = _dateAdapter;
15
+ this._dateFormats = _dateFormats;
16
+ this.cdr = cdr;
17
+ this.datePickerService = datePickerService;
18
+ this._destroyed = new Subject();
19
+ this.quarters = [1, 2, 3, 4];
20
+ this.selectedQuarter = 1;
21
+ this.timeframeOptions = [{
22
+ timeframe: TimeframeOption.DAY,
23
+ title: 'Day',
24
+ value: CalendarView.FOR_DAYS,
25
+ format: this.datePickerService.formatConfig.day,
26
+ periodLabel: () => this._dateAdapter.format(this._calendar.activeDate, this._dateFormats.display.monthYearLabel).toLocaleUpperCase()
27
+ }, {
28
+ timeframe: TimeframeOption.WEEK,
29
+ title: 'Week',
30
+ value: CalendarView.FOR_DAYS,
31
+ format: this.datePickerService.formatConfig.week,
32
+ periodLabel: () => this._dateAdapter.format(this._calendar.activeDate, this._dateFormats.display.monthYearLabel).toLocaleUpperCase()
33
+ }, {
34
+ timeframe: TimeframeOption.MONTH,
35
+ title: 'Month',
36
+ value: CalendarView.FOR_MONTHS,
37
+ format: this.datePickerService.formatConfig.month,
38
+ periodLabel: () => String(moment(this._calendar.activeDate).utc().year())
39
+ }, {
40
+ timeframe: TimeframeOption.QUARTER,
41
+ title: 'Quarter',
42
+ value: CalendarView.FOR_QUARTERS,
43
+ format: this.datePickerService.formatConfig.quarter,
44
+ periodLabel: () => String(moment(this.datePickerService.subtractFiscalYearMonthsFromDate(this._calendar.activeDate)).utc().year())
45
+ }, {
46
+ timeframe: TimeframeOption.YEAR,
47
+ title: 'Year',
48
+ value: CalendarView.FOR_YEARS,
49
+ format: this.datePickerService.formatConfig.year,
50
+ periodLabel: () => {
51
+ const currentYear = moment(this.datePickerService.subtractFiscalYearMonthsFromDate(this._calendar.activeDate)).utc().year();
52
+ const startPeriod = Math.floor(currentYear / 24) * 24;
53
+ return startPeriod + '-' + (startPeriod + 23);
54
+ }
55
+ }];
56
+ this.pagingSetup = {
57
+ [CalendarView.FOR_MONTHS]: (forward) => this.pagingDateChange('addCalendarYears', 1, forward),
58
+ [CalendarView.FOR_QUARTERS]: (forward) => this.pagingDateChange('addCalendarYears', 1, forward),
59
+ [CalendarView.FOR_DAYS]: (forward) => this.pagingDateChange('addCalendarMonths', 1, forward),
60
+ [CalendarView.FOR_YEARS]: (forward) => this.pagingDateChange('addCalendarYears', 24, forward)
61
+ };
62
+ this.selectedTimeframe = CalendarView.FOR_DAYS;
63
+ this.timeframeSelection = false;
64
+ this.periodMonthLabel = '';
65
+ this.periodYearLabel = '';
66
+ this.presetTagList = PRESET_TAGS_LIST;
67
+ this.calendarView = CalendarView;
68
+ _calendar.stateChanges.pipe(takeUntil(this._destroyed)).subscribe(() => this.setPeriodLabels());
69
+ this.datePickerService.format$.pipe(takeUntil(this._destroyed)).subscribe(value => {
70
+ this.selectedTimeframe = this.timeframeOptions.filter(option => option.format === value)[0].value;
71
+ _calendar.currentView = this.selectedTimeframe;
72
+ this.setPeriodLabels();
73
+ if (this.selectedTimeframe === CalendarView.FOR_QUARTERS) {
74
+ this.selectedQuarter = this.datePickerService.getQuarterAccordingToFiscalYear(this._calendar.activeDate);
75
+ }
76
+ });
77
+ _calendar.viewChanged.pipe(takeUntil(this._destroyed)).subscribe(() => {
78
+ this.setPeriodLabels();
79
+ if (_calendar.multiYearView) {
80
+ this.transformDateInMultiyearViewAccordingToFY();
81
+ }
82
+ });
83
+ _calendar._userSelection.subscribe(date => {
84
+ if (!this.datePickerService.isValueUpdating) {
85
+ this.datePickerService.onSameDaySelectedInCalendar$.next(date.value);
86
+ }
87
+ });
88
+ this.datePickerService.calendarInstance = _calendar;
89
+ }
90
+ get selectedPresetTag() {
91
+ return this.datePickerService.presetTag$.getValue();
92
+ }
93
+ ;
94
+ ngOnInit() {
95
+ setTimeout(() => {
96
+ if (this._calendar.multiYearView) {
97
+ this.transformDateInMultiyearViewAccordingToFY();
98
+ }
99
+ });
100
+ }
101
+ ngOnDestroy() {
102
+ this._destroyed.next();
103
+ this._destroyed.complete();
104
+ }
105
+ setPeriodLabels() {
106
+ const currentTimeframeOption = this.timeframeOptions.filter(option => option.value === this._calendar.currentView)[0];
107
+ const fullPeriodLabel = currentTimeframeOption.periodLabel();
108
+ if (this._calendar.currentView === CalendarView.FOR_DAYS) {
109
+ this.periodMonthLabel = fullPeriodLabel.slice(0, 3);
110
+ this.periodYearLabel = fullPeriodLabel.slice(4);
111
+ }
112
+ else {
113
+ this.periodMonthLabel = '';
114
+ this.periodYearLabel = fullPeriodLabel;
115
+ }
116
+ this.cdr.markForCheck();
117
+ }
118
+ setTimeframe(value) {
119
+ if (value !== this.selectedTimeframe) {
120
+ this.datePickerService.resetPresetTag();
121
+ }
122
+ this.selectedTimeframe = value;
123
+ this.timeframeSelection = false;
124
+ this._calendar.currentView = this.selectedTimeframe;
125
+ const chosenTimeframeOption = this.timeframeOptions.filter(option => option.value === this.selectedTimeframe)[0];
126
+ this.datePickerService.updateTimeframeAndFormat(chosenTimeframeOption.format);
127
+ if (this.selectedTimeframe === CalendarView.FOR_QUARTERS) {
128
+ this.selectedQuarter = this.datePickerService.getQuarterAccordingToFiscalYear(this._calendar.activeDate);
129
+ }
130
+ }
131
+ get currentViewIsQuarter() {
132
+ return ![CalendarView.FOR_DAYS, CalendarView.FOR_MONTHS, CalendarView.FOR_YEARS].includes(this._calendar.currentView);
133
+ }
134
+ switchViewOnClickOnPeriodLabel(view) {
135
+ this._calendar.currentView = view;
136
+ }
137
+ onSelectQuarter(quarterNumber) {
138
+ this.selectedQuarter = quarterNumber;
139
+ this.datePickerService.setEndOfQuarter(this._calendar.activeDate, quarterNumber);
140
+ this.datePickerService.updatedQuarter$.next(this._calendar.activeDate);
141
+ this.datePickerService.datePickerInstance.close();
142
+ }
143
+ pagingClicked(forward) {
144
+ if (this.pagingSetup[this._calendar.currentView]) {
145
+ this.pagingSetup[this._calendar.currentView](forward);
146
+ }
147
+ }
148
+ pagingDateChange(actionCall, amount, forward) {
149
+ this._calendar.activeDate = this._dateAdapter[actionCall](this._calendar.activeDate, forward ? amount : -amount);
150
+ this.setPeriodLabels();
151
+ }
152
+ transformDateInMultiyearViewAccordingToFY() {
153
+ const multuYearView = this._calendar.multiYearView;
154
+ multuYearView._activeDate = this.datePickerService.subtractFiscalYearMonthsFromDate(multuYearView._activeDate);
155
+ multuYearView._selectedYear = multuYearView._activeDate.year();
156
+ multuYearView._init();
157
+ }
158
+ onSelectPresetTag(tag) {
159
+ if (tag.key === this.selectedPresetTag) {
160
+ this.datePickerService.presetTag$.next(null);
161
+ }
162
+ else {
163
+ this.datePickerService.presetTag$.next(tag.key);
164
+ }
165
+ this.datePickerService.updateDatePickerByPreset(this.selectedPresetTag, this._calendar);
166
+ }
167
+ }
168
+ DrDatePickerCustomHeaderComponent.decorators = [
169
+ { type: Component, args: [{
170
+ selector: 'dr-date-picker_custom-header.component',
171
+ template: "<div *ngIf=\"datePickerService.isTimeframeSelectionEnabled\" class=\"dr-datepicker__timeframe-select__wrapper\">\n\n <div *ngIf=\"datePickerService.isUsingDateTagPresets\" class=\"dr-datepicker-preset-date\">\n <div class=\"dr-datepicker-preset-date__tags\">\n <div *ngFor=\"let tag of presetTagList\" \n id=\"preset_tag\" \n class=\"dr-datepicker-preset-date__tags__tag\" \n (click)=\"onSelectPresetTag(tag)\" \n [ngClass]=\"{'dr-datepicker-preset-date__tags__tag--selected': tag.key === selectedPresetTag}\"\n [drTooltip]=\"selectedPresetTag === tag.key? 'Unselect preset' : ''\"\n [drTooltipPosition]=\"'top'\">\n {{ tag.label }}\n </div>\n </div>\n </div>\n <dr-select\n class=\"dr-datepicker__timeframe-select\"\n [ngModel]=\"selectedTimeframe\"\n [items]=\"timeframeOptions | drShowTimeframePipe: datePickerService.availableTimeframes\"\n bindLabel=\"title\"\n bindValue=\"value\"\n (ngModelChange)=\"setTimeframe($event)\">\n </dr-select>\n</div>\n\n<div class=\"dr-date-paging\">\n <div class=\"dr-date-paging flip-page-button\"\n (click)=\"pagingClicked(false)\">\n <i class=\"dr-icon-arrow-left presentation_buttons-navigate_input\"></i>\n </div>\n <span class=\"example-header-label\">\n <span (click)=\"switchViewOnClickOnPeriodLabel(calendarView.FOR_MONTHS)\">{{ periodMonthLabel + ' ' }}</span>\n <span (click)=\"switchViewOnClickOnPeriodLabel(calendarView.FOR_YEARS)\">{{ periodYearLabel }}</span>\n </span>\n <div class=\"dr-date-paging flip-page-button\"\n (click)=\"pagingClicked(true)\">\n <i class=\"dr-icon-arrow-right presentation_buttons-navigate_input\"></i>\n </div>\n</div>\n<div #quarterlyDatePicker class=\"dr-quarterly-datepicker\" *ngIf=\"currentViewIsQuarter\">\n <div *ngFor=\"let quarter of quarters\"\n class=\"quarter-selector\" (click)=\"onSelectQuarter(quarter)\"\n [class]=\"quarter === selectedQuarter ? 'selected' : ''\"\n >Q{{quarter}}</div>\n</div>\n\n",
172
+ changeDetection: ChangeDetectionStrategy.OnPush,
173
+ styles: [":host{height:54px;align-items:center;font-family:\"Poppins\";font-style:normal;font-weight:600;font-size:14px;line-height:22px}.dr-datepicker__timeframe-select__wrapper{background-color:#f9faff;padding:16px 32px;border-radius:18px 18px 0 0}.dr-datepicker-preset-date{display:flex;flex-direction:column}.dr-datepicker-preset-date__tags{display:flex;padding-bottom:21px;padding-top:10px;font-size:12px}.dr-datepicker-preset-date__tags__tag{cursor:pointer;font-weight:400;line-height:20px!important;padding:2px 8px;border:1px solid #9EA1AA;border-radius:18px;background:#FFFFFF;margin-right:4px}.dr-datepicker-preset-date__tags__tag--selected{color:#4646ce;background:#F2F2FB;border:1px solid #4646CE}.dr-date-paging{display:flex;flex-direction:row;justify-content:space-between;align-items:center;padding:16px 32px;grid-gap:4px;gap:4px}.dr-date-paging.flip-page-button{width:20px;height:20px;padding:0;color:#4e566c}.dr-date-paging.flip-page-button:hover{border-radius:50%;background:#f2f2fb;color:#4646ce}.example-header-label{cursor:pointer}.dr-quarterly-datepicker{display:flex;justify-content:space-between;padding:10px}.dr-quarterly-datepicker .quarter-selector{display:block;width:74px;height:40px;text-align:center;border-radius:40px;font-weight:400;padding-top:9px}.dr-quarterly-datepicker .quarter-selector:hover{background:#f2f2fb;color:#4646ce;font-weight:600;cursor:pointer}.dr-quarterly-datepicker .quarter-selector.selected{background-color:#4646ce;color:#f3f7ff;font-weight:600}\n"]
174
+ },] }
175
+ ];
176
+ DrDatePickerCustomHeaderComponent.ctorParameters = () => [
177
+ { type: MatCalendar },
178
+ { type: DateAdapter },
179
+ { type: CustomDateFormat, decorators: [{ type: Inject, args: [MAT_DATE_FORMATS,] }] },
180
+ { type: ChangeDetectorRef },
181
+ { type: DrDatePickerService }
182
+ ];
183
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHItZGF0ZS1waWNrZXJfY3VzdG9tLWhlYWRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kYXRhcmFpbHNzaGFyZWQvc3JjL2xpYi9kci1pbnB1dHMvZGF0ZS1waWNrZXJzL2RyLWRhdGUtcGlja2VyX2N1c3RvbS1oZWFkZXIvZHItZGF0ZS1waWNrZXJfY3VzdG9tLWhlYWRlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFhLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDakgsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFdBQVcsRUFBbUIsTUFBTSw4QkFBOEIsQ0FBQztBQUM1RSxPQUFPLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkUsT0FBTyxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBOEIsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDekgsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFekUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFN0QsYUFBYTtBQUNiLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQWlCakMsTUFBTSxPQUFPLGlDQUFpQztJQTBEMUMsWUFBb0IsU0FBMkIsRUFDM0IsWUFBaUMsRUFDUCxZQUE4QixFQUN4RCxHQUFzQixFQUN2QixpQkFBc0M7UUFKckMsY0FBUyxHQUFULFNBQVMsQ0FBa0I7UUFDM0IsaUJBQVksR0FBWixZQUFZLENBQXFCO1FBQ1AsaUJBQVksR0FBWixZQUFZ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QWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsaUJBQWlCLENBQUMsR0FBUTtRQUN0QixJQUFJLEdBQUcsQ0FBQyxHQUFHLEtBQUssSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQ25DLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2pEO2FBQU07WUFDSCxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDbkQ7UUFDRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM1RixDQUFDOzs7WUFsTEosU0FBUyxTQUFDO2dCQUNQLFFBQVEsRUFBRSx3Q0FBd0M7Z0JBQ2xELGlxRUFBMEQ7Z0JBRTFELGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNOzthQUNsRDs7O1lBdkJRLFdBQVc7WUFDWCxXQUFXO1lBQ0csZ0JBQWdCLHVCQW1GdEIsTUFBTSxTQUFDLGdCQUFnQjtZQXhGSyxpQkFBaUI7WUFNckQsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIE9uRGVzdHJveSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgSW5qZWN0LCBPbkluaXQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTWF0Q2FsZW5kYXIsIE1hdENhbGVuZGFyVmlldyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RhdGVwaWNrZXInO1xuaW1wb3J0IHsgRGF0ZUFkYXB0ZXIsIE1BVF9EQVRFX0ZPUk1BVFMgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcbmltcG9ydCB7IENhbGVuZGFyVmlldywgQ3VzdG9tRGF0ZUZvcm1hdCwgRGF0ZUZyb21hdHMsIFRDYWxlbmRhclZpZXcsIFRpbWVmcmFtZU9wdGlvbiB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9kYXRlUGlja2VyJztcbmltcG9ydCB7IERyRGF0ZVBpY2tlclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9kci1kYXRlLXBpY2tlci5zZXJ2aWNlJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IFBSRVNFVF9UQUdTX0xJU1QgfSBmcm9tIFwiLi4vLi4vLi4vbW9kZWxzL2NvbnN0YW50c1wiO1xuXG4vLyBAdHMtaWdub3JlXG5jb25zdCBtb21lbnQgPSByZXF1aXJlKCdtb21lbnQnKTtcblxuZXhwb3J0IGludGVyZmFjZSBJVGltZWZyYW1lT3B0aW9uIHtcbiAgICB0aW1lZnJhbWU6IFRpbWVmcmFtZU9wdGlvbjtcbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIHZhbHVlOiBUQ2FsZW5kYXJWaWV3O1xuICAgIGZvcm1hdDogc3RyaW5nO1xuICAgIHBlcmlvZExhYmVsOiAoKSA9PiBzdHJpbmc7XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZHItZGF0ZS1waWNrZXJfY3VzdG9tLWhlYWRlci5jb21wb25lbnQnLFxuICAgIHRlbXBsYXRlVXJsOiAnZHItZGF0ZS1waWNrZXJfY3VzdG9tLWhlYWRlci5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vZHItZGF0ZS1waWNrZXJfY3VzdG9tLWhlYWRlci5jb21wb25lbnQuc2NzcyddLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuXG5leHBvcnQgY2xhc3MgRHJEYXRlUGlja2VyQ3VzdG9tSGVhZGVyQ29tcG9uZW50PE1vbWVudD4gaW1wbGVtZW50cyBPbkRlc3Ryb3ksIE9uSW5pdCB7XG4gICAgcHJpdmF0ZSBfZGVzdHJveWVkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICBxdWFydGVycyA9IFsxLCAyLCAzLCA0XTtcbiAgICBzZWxlY3RlZFF1YXJ0ZXIgPSAxO1xuICAgIHRpbWVmcmFtZU9wdGlvbnM6IElUaW1lZnJhbWVPcHRpb25bXSA9IFt7XG4gICAgICAgIHRpbWVmcmFtZTogVGltZWZyYW1lT3B0aW9uLkRBWSxcbiAgICAgICAgdGl0bGU6ICdEYXknLFxuICAgICAgICB2YWx1ZTogQ2FsZW5kYXJWaWV3LkZPUl9EQVlTLFxuICAgICAgICBmb3JtYXQ6IHRoaXMuZGF0ZVBpY2tlclNlcnZpY2UuZm9ybWF0Q29uZmlnLmRheSxcbiAgICAgICAgcGVyaW9kTGFiZWw6ICgpID0+IHRoaXMuX2RhdGVBZGFwdGVyLmZvcm1hdCh0aGlzLl9jYWxlbmRhci5hY3RpdmVEYXRlLCB0aGlzLl9kYXRlRm9ybWF0cy5kaXNwbGF5Lm1vbnRoWWVhckxhYmVsKS50b0xvY2FsZVVwcGVyQ2FzZSgpXG4gICAgfSwge1xuICAgICAgICB0aW1lZnJhbWU6IFRpbWVmcmFtZU9wdGlvbi5XRUVLLFxuICAgICAgICB0aXRsZTogJ1dlZWsnLFxuICAgICAgICB2YWx1ZTogQ2FsZW5kYXJWaWV3LkZPUl9EQVlTLFxuICAgICAgICBmb3JtYXQ6IHRoaXMuZGF0ZVBpY2tlclNlcnZpY2UuZm9ybWF0Q29uZmlnLndlZWssXG4gICAgICAgIHBlcmlvZExhYmVsOiAoKSA9PiB0aGlzLl9kYXRlQWRhcHRlci5mb3JtYXQodGhpcy5fY2FsZW5kYXIuYWN0aXZlRGF0ZSwgdGhpcy5fZGF0ZUZvcm1hdHMuZGlzcGxheS5tb250aFllYXJMYWJlbCkudG9Mb2NhbGVVcHBlckNhc2UoKVxuICAgIH0sIHtcbiAgICAgICAgdGltZWZyYW1lOiBUaW1lZnJhbWVPcHRpb24uTU9OVEgsXG4gICAgICAgIHRpdGxlOiAnTW9udGgnLFxuICAgICAgICB2YWx1ZTogQ2FsZW5kYXJWaWV3LkZPUl9NT05USFMsXG4gICAgICAgIGZvcm1hdDogdGhpcy5kYXRlUGlja2VyU2VydmljZS5mb3JtYXRDb25maWcubW9udGgsXG4gICAgICAgIHBlcmlvZExhYmVsOiAoKSA9PiBTdHJpbmcobW9tZW50KHRoaXMuX2NhbGVuZGFyLmFjdGl2ZURhdGUpLnV0YygpLnllYXIoKSlcbiAgICB9LCB7XG4gICAgICAgIHRpbWVmcmFtZTogVGltZWZyYW1lT3B0aW9uLlFVQVJURVIsXG4gICAgICAgIHRpdGxlOiAnUXVhcnRlcicsXG4gICAgICAgIHZhbHVlOiBDYWxlbmRhclZpZXcuRk9SX1FVQVJURVJTLFxuICAgICAgICBmb3JtYXQ6IHRoaXMuZGF0ZVBpY2tlclNlcnZpY2UuZm9ybWF0Q29uZmlnLnF1YXJ0ZXIsXG4gICAgICAgIHBlcmlvZExhYmVsOiAoKSA9PiBTdHJpbmcobW9tZW50KHRoaXMuZGF0ZVBpY2tlclNlcnZpY2Uuc3VidHJhY3RGaXNjYWxZZWFyTW9udGhzRnJvbURhdGUodGhpcy5fY2FsZW5kYXIuYWN0aXZlRGF0ZSkpLnV0YygpLnllYXIoKSlcbiAgICB9LCB7XG4gICAgICAgIHRpbWVmcmFtZTogVGltZWZyYW1lT3B0aW9uLllFQVIsXG4gICAgICAgIHRpdGxlOiAnWWVhcicsXG4gICAgICAgIHZhbHVlOiBDYWxlbmRhclZpZXcuRk9SX1lFQVJTLFxuICAgICAgICBmb3JtYXQ6IHRoaXMuZGF0ZVBpY2tlclNlcnZpY2UuZm9ybWF0Q29uZmlnLnllYXIsXG4gICAgICAgIHBlcmlvZExhYmVsOiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50WWVhciA9IG1vbWVudCh0aGlzLmRhdGVQaWNrZXJTZXJ2aWNlLnN1YnRyYWN0RmlzY2FsWWVhck1vbnRoc0Zyb21EYXRlKHRoaXMuX2NhbGVuZGFyLmFjdGl2ZURhdGUpKS51dGMoKS55ZWFyKCk7XG4gICAgICAgICAgICBjb25zdCBzdGFydFBlcmlvZCA9IE1hdGguZmxvb3IoY3VycmVudFllYXIgLyAyNCkgKiAyNDtcbiAgICAgICAgICAgIHJldHVybiBzdGFydFBlcmlvZCArICctJyArIChzdGFydFBlcmlvZCArIDIzKTtcbiAgICAgICAgfVxuICAgIH1dO1xuXG4gICAgcGFnaW5nU2V0dXAgPSB7XG4gICAgICAgIFtDYWxlbmRhclZpZXcuRk9SX01PTlRIU106IChmb3J3YXJkKSA9PiB0aGlzLnBhZ2luZ0RhdGVDaGFuZ2UoJ2FkZENhbGVuZGFyWWVhcnMnLCAxLCBmb3J3YXJkKSxcbiAgICAgICAgW0NhbGVuZGFyVmlldy5GT1JfUVVBUlRFUlNdOiAoZm9yd2FyZCkgPT4gdGhpcy5wYWdpbmdEYXRlQ2hhbmdlKCdhZGRDYWxlbmRhclllYXJzJywgMSwgZm9yd2FyZCksXG4gICAgICAgIFtDYWxlbmRhclZpZXcuRk9SX0RBWVNdOiAoZm9yd2FyZCkgPT4gdGhpcy5wYWdpbmdEYXRlQ2hhbmdlKCdhZGRDYWxlbmRhck1vbnRocycsIDEsIGZvcndhcmQpLFxuICAgICAgICBbQ2FsZW5kYXJWaWV3LkZPUl9ZRUFSU106IChmb3J3YXJkKSA9PiB0aGlzLnBhZ2luZ0RhdGVDaGFuZ2UoJ2FkZENhbGVuZGFyWWVhcnMnLCAyNCwgZm9yd2FyZClcbiAgICB9O1xuXG4gICAgc2VsZWN0ZWRUaW1lZnJhbWU6IFRDYWxlbmRhclZpZXcgPSBDYWxlbmRhclZpZXcuRk9SX0RBWVM7XG4gICAgdGltZWZyYW1lU2VsZWN0aW9uID0gZmFsc2U7XG4gICAgcGVyaW9kTW9udGhMYWJlbCA9ICcnO1xuICAgIHBlcmlvZFllYXJMYWJlbCA9ICcnO1xuICAgIHByZXNldFRhZ0xpc3QgPSBQUkVTRVRfVEFHU19MSVNUO1xuICAgIGdldCBzZWxlY3RlZFByZXNldFRhZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZVBpY2tlclNlcnZpY2UucHJlc2V0VGFnJC5nZXRWYWx1ZSgpO1xuICAgIH07XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgY2FsZW5kYXJWaWV3ID0gQ2FsZW5kYXJWaWV3O1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBfY2FsZW5kYXI6IE1hdENhbGVuZGFyPGFueT4sXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBfZGF0ZUFkYXB0ZXI6IERhdGVBZGFwdGVyPE1vbWVudD4sXG4gICAgICAgICAgICAgICAgQEluamVjdChNQVRfREFURV9GT1JNQVRTKSBwcml2YXRlIF9kYXRlRm9ybWF0czogQ3VzdG9tRGF0ZUZvcm1hdCxcbiAgICAgICAgICAgICAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgICAgICAgICAgcHVibGljIGRhdGVQaWNrZXJTZXJ2aWNlOiBEckRhdGVQaWNrZXJTZXJ2aWNlKSB7XG5cbiAgICAgICAgX2NhbGVuZGFyLnN0YXRlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95ZWQpKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5zZXRQZXJpb2RMYWJlbHMoKSk7XG4gICAgICAgIHRoaXMuZGF0ZVBpY2tlclNlcnZpY2UuZm9ybWF0JC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95ZWQpKS5zdWJzY3JpYmUodmFsdWUgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFRpbWVmcmFtZSA9IHRoaXMudGltZWZyYW1lT3B0aW9ucy5maWx0ZXIob3B0aW9uID0+IG9wdGlvbi5mb3JtYXQgPT09IHZhbHVlKVswXS52YWx1ZTtcbiAgICAgICAgICAgIF9jYWxlbmRhci5jdXJyZW50VmlldyA9IHRoaXMuc2VsZWN0ZWRUaW1lZnJhbWUgYXMgTWF0Q2FsZW5kYXJWaWV3O1xuICAgICAgICAgICAgdGhpcy5zZXRQZXJpb2RMYWJlbHMoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkVGltZWZyYW1lID09PSBDYWxlbmRhclZpZXcuRk9SX1FVQVJURVJTKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFF1YXJ0ZXIgPSB0aGlzLmRhdGVQaWNrZXJTZXJ2aWNlLmdldFF1YXJ0ZXJBY2NvcmRpbmdUb0Zpc2NhbFllYXIodGhpcy5fY2FsZW5kYXIuYWN0aXZlRGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIF9jYWxlbmRhci52aWV3Q2hhbmdlZC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95ZWQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRQZXJpb2RMYWJlbHMoKTtcbiAgICAgICAgICAgIGlmIChfY2FsZW5kYXIubXVsdGlZZWFyVmlldykge1xuICAgICAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtRGF0ZUluTXVsdGl5ZWFyVmlld0FjY29yZGluZ1RvRlkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgX2NhbGVuZGFyLl91c2VyU2VsZWN0aW9uLnN1YnNjcmliZShkYXRlID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5kYXRlUGlja2VyU2VydmljZS5pc1ZhbHVlVXBkYXRpbmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGVQaWNrZXJTZXJ2aWNlLm9uU2FtZURheVNlbGVjdGVkSW5DYWxlbmRhciQubmV4dChkYXRlLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5kYXRlUGlja2VyU2VydmljZS5jYWxlbmRhckluc3RhbmNlID0gX2NhbGVuZGFyO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jYWxlbmRhci5tdWx0aVllYXJWaWV3KSB7XG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1EYXRlSW5NdWx0aXllYXJWaWV3QWNjb3JkaW5nVG9GWSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5fZGVzdHJveWVkLm5leHQoKTtcbiAgICAgICAgdGhpcy5fZGVzdHJveWVkLmNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgc2V0UGVyaW9kTGFiZWxzKCkge1xuICAgICAgICBjb25zdCBjdXJyZW50VGltZWZyYW1lT3B0aW9uID0gdGhpcy50aW1lZnJhbWVPcHRpb25zLmZpbHRlcihvcHRpb24gPT4gb3B0aW9uLnZhbHVlID09PSB0aGlzLl9jYWxlbmRhci5jdXJyZW50VmlldylbMF07XG4gICAgICAgIGNvbnN0IGZ1bGxQZXJpb2RMYWJlbCA9IGN1cnJlbnRUaW1lZnJhbWVPcHRpb24ucGVyaW9kTGFiZWwoKTtcbiAgICAgICAgaWYgKHRoaXMuX2NhbGVuZGFyLmN1cnJlbnRWaWV3ID09PSBDYWxlbmRhclZpZXcuRk9SX0RBWVMpIHtcbiAgICAgICAgICAgIHRoaXMucGVyaW9kTW9udGhMYWJlbCA9IGZ1bGxQZXJpb2RMYWJlbC5zbGljZSgwLCAzKTtcbiAgICAgICAgICAgIHRoaXMucGVyaW9kWWVhckxhYmVsID0gZnVsbFBlcmlvZExhYmVsLnNsaWNlKDQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wZXJpb2RNb250aExhYmVsID0gJyc7XG4gICAgICAgICAgICB0aGlzLnBlcmlvZFllYXJMYWJlbCA9IGZ1bGxQZXJpb2RMYWJlbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICBzZXRUaW1lZnJhbWUodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB0aGlzLnNlbGVjdGVkVGltZWZyYW1lKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGVQaWNrZXJTZXJ2aWNlLnJlc2V0UHJlc2V0VGFnKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3RlZFRpbWVmcmFtZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLnRpbWVmcmFtZVNlbGVjdGlvbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9jYWxlbmRhci5jdXJyZW50VmlldyA9IHRoaXMuc2VsZWN0ZWRUaW1lZnJhbWUgYXMgTWF0Q2FsZW5kYXJWaWV3O1xuICAgICAgICBjb25zdCBjaG9zZW5UaW1lZnJhbWVPcHRpb24gPSB0aGlzLnRpbWVmcmFtZU9wdGlvbnMuZmlsdGVyKG9wdGlvbiA9PiBvcHRpb24udmFsdWUgPT09IHRoaXMuc2VsZWN0ZWRUaW1lZnJhbWUpWzBdO1xuICAgICAgICB0aGlzLmRhdGVQaWNrZXJTZXJ2aWNlLnVwZGF0ZVRpbWVmcmFtZUFuZEZvcm1hdChjaG9zZW5UaW1lZnJhbWVPcHRpb24uZm9ybWF0KTtcblxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFRpbWVmcmFtZSA9PT0gQ2FsZW5kYXJWaWV3LkZPUl9RVUFSVEVSUykge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFF1YXJ0ZXIgPSB0aGlzLmRhdGVQaWNrZXJTZXJ2aWNlLmdldFF1YXJ0ZXJBY2NvcmRpbmdUb0Zpc2NhbFllYXIodGhpcy5fY2FsZW5kYXIuYWN0aXZlRGF0ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgY3VycmVudFZpZXdJc1F1YXJ0ZXIoKSB7XG4gICAgICAgIHJldHVybiAhW0NhbGVuZGFyVmlldy5GT1JfREFZUywgQ2FsZW5kYXJWaWV3LkZPUl9NT05USFMsIENhbGVuZGFyVmlldy5GT1JfWUVBUlNdLmluY2x1ZGVzKHRoaXMuX2NhbGVuZGFyLmN1cnJlbnRWaWV3IGFzIENhbGVuZGFyVmlldyk7XG4gICAgfVxuXG4gICAgc3dpdGNoVmlld09uQ2xpY2tPblBlcmlvZExhYmVsKHZpZXc6IENhbGVuZGFyVmlldy5GT1JfTU9OVEhTIHwgQ2FsZW5kYXJWaWV3LkZPUl9ZRUFSUykge1xuICAgICAgICB0aGlzLl9jYWxlbmRhci5jdXJyZW50VmlldyA9IHZpZXc7XG4gICAgfVxuXG4gICAgb25TZWxlY3RRdWFydGVyKHF1YXJ0ZXJOdW1iZXI6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNlbGVjdGVkUXVhcnRlciA9IHF1YXJ0ZXJOdW1iZXI7XG4gICAgICAgIHRoaXMuZGF0ZVBpY2tlclNlcnZpY2Uuc2V0RW5kT2ZRdWFydGVyKHRoaXMuX2NhbGVuZGFyLmFjdGl2ZURhdGUsIHF1YXJ0ZXJOdW1iZXIpO1xuICAgICAgICB0aGlzLmRhdGVQaWNrZXJTZXJ2aWNlLnVwZGF0ZWRRdWFydGVyJC5uZXh0KHRoaXMuX2NhbGVuZGFyLmFjdGl2ZURhdGUpO1xuICAgICAgICB0aGlzLmRhdGVQaWNrZXJTZXJ2aWNlLmRhdGVQaWNrZXJJbnN0YW5jZS5jbG9zZSgpO1xuICAgIH1cblxuICAgIHBhZ2luZ0NsaWNrZWQoZm9yd2FyZCkge1xuICAgICAgICBpZiAodGhpcy5wYWdpbmdTZXR1cFt0aGlzLl9jYWxlbmRhci5jdXJyZW50Vmlld10pIHtcbiAgICAgICAgICAgIHRoaXMucGFnaW5nU2V0dXBbdGhpcy5fY2FsZW5kYXIuY3VycmVudFZpZXddKGZvcndhcmQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcGFnaW5nRGF0ZUNoYW5nZShhY3Rpb25DYWxsOiBzdHJpbmcsIGFtb3VudDogbnVtYmVyLCBmb3J3YXJkOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX2NhbGVuZGFyLmFjdGl2ZURhdGUgPSB0aGlzLl9kYXRlQWRhcHRlclthY3Rpb25DYWxsXSh0aGlzLl9jYWxlbmRhci5hY3RpdmVEYXRlLCBmb3J3YXJkID8gYW1vdW50IDogLWFtb3VudCk7XG4gICAgICAgIHRoaXMuc2V0UGVyaW9kTGFiZWxzKCk7XG4gICAgfVxuXG4gICAgdHJhbnNmb3JtRGF0ZUluTXVsdGl5ZWFyVmlld0FjY29yZGluZ1RvRlkoKSB7XG4gICAgICAgIGNvbnN0IG11bHR1WWVhclZpZXcgPSB0aGlzLl9jYWxlbmRhci5tdWx0aVllYXJWaWV3IGFzIGFueTtcbiAgICAgICAgbXVsdHVZZWFyVmlldy5fYWN0aXZlRGF0ZSA9IHRoaXMuZGF0ZVBpY2tlclNlcnZpY2Uuc3VidHJhY3RGaXNjYWxZZWFyTW9udGhzRnJvbURhdGUobXVsdHVZZWFyVmlldy5fYWN0aXZlRGF0ZSk7XG4gICAgICAgIG11bHR1WWVhclZpZXcuX3NlbGVjdGVkWWVhciA9IG11bHR1WWVhclZpZXcuX2FjdGl2ZURhdGUueWVhcigpO1xuICAgICAgICBtdWx0dVllYXJWaWV3Ll9pbml0KCk7XG4gICAgfVxuXG4gICAgb25TZWxlY3RQcmVzZXRUYWcodGFnOiBhbnkpIHtcbiAgICAgICAgaWYgKHRhZy5rZXkgPT09IHRoaXMuc2VsZWN0ZWRQcmVzZXRUYWcpIHtcbiAgICAgICAgICAgICB0aGlzLmRhdGVQaWNrZXJTZXJ2aWNlLnByZXNldFRhZyQubmV4dChudWxsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGF0ZVBpY2tlclNlcnZpY2UucHJlc2V0VGFnJC5uZXh0KHRhZy5rZXkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGF0ZVBpY2tlclNlcnZpY2UudXBkYXRlRGF0ZVBpY2tlckJ5UHJlc2V0KHRoaXMuc2VsZWN0ZWRQcmVzZXRUYWcsIHRoaXMuX2NhbGVuZGFyKTtcbiAgICB9XG59XG4iXX0=
@@ -0,0 +1,12 @@
1
+ import { Pipe } from '@angular/core';
2
+ export class DrShowTimeframePipe {
3
+ transform(arr, showOptions) {
4
+ return arr.filter(item => showOptions.includes(item.timeframe));
5
+ }
6
+ }
7
+ DrShowTimeframePipe.decorators = [
8
+ { type: Pipe, args: [{
9
+ name: 'drShowTimeframePipe'
10
+ },] }
11
+ ];
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHItc2hvdy10aW1lZnJhbWUucGlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2RhdGFyYWlsc3NoYXJlZC9zcmMvbGliL2RyLWlucHV0cy9kYXRlLXBpY2tlcnMvZHItc2hvdy10aW1lZnJhbWUucGlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQU9wRCxNQUFNLE9BQU8sbUJBQW1CO0lBQzVCLFNBQVMsQ0FBQyxHQUF1QixFQUFFLFdBQThCO1FBQzdELE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDcEUsQ0FBQzs7O1lBTkosSUFBSSxTQUFDO2dCQUNGLElBQUksRUFBRSxxQkFBcUI7YUFDOUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQaXBlLCBQaXBlVHJhbnNmb3JtIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUaW1lZnJhbWVPcHRpb24gfSBmcm9tICcuLi8uLi9tb2RlbHMvZGF0ZVBpY2tlcic7XG5pbXBvcnQgeyBJVGltZWZyYW1lT3B0aW9uIH0gZnJvbSAnLi9kci1kYXRlLXBpY2tlcl9jdXN0b20taGVhZGVyL2RyLWRhdGUtcGlja2VyX2N1c3RvbS1oZWFkZXIuY29tcG9uZW50JztcblxuQFBpcGUoe1xuICAgIG5hbWU6ICdkclNob3dUaW1lZnJhbWVQaXBlJ1xufSlcbmV4cG9ydCBjbGFzcyBEclNob3dUaW1lZnJhbWVQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XG4gICAgdHJhbnNmb3JtKGFycjogSVRpbWVmcmFtZU9wdGlvbltdLCBzaG93T3B0aW9uczogVGltZWZyYW1lT3B0aW9uW10pOiBJVGltZWZyYW1lT3B0aW9uW10ge1xuICAgICAgICByZXR1cm4gYXJyLmZpbHRlcihpdGVtID0+IHNob3dPcHRpb25zLmluY2x1ZGVzKGl0ZW0udGltZWZyYW1lKSk7XG4gICAgfVxufVxuIl19
@@ -0,0 +1,194 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { BehaviorSubject, Subject } from 'rxjs';
3
+ import { DateFromats, DateTags, TimeframeOption } from '../../../models/datePicker';
4
+ import { DrSharedUtils } from '../../../utils/dr-shared-utils';
5
+ import * as _ from 'lodash';
6
+ // @ts-ignore
7
+ const moment = require('moment');
8
+ export class DrDatePickerService {
9
+ constructor() {
10
+ this.isTimeframeSelectionEnabled = false;
11
+ this.timeframe = TimeframeOption.DAY;
12
+ this.format$ = new BehaviorSubject(DateFromats.MAT_DEFAULT_DATE_FORMAT);
13
+ this.updatedQuarter$ = new Subject();
14
+ this.updatedDateAndClose$ = new Subject();
15
+ this.presetTag$ = new BehaviorSubject('');
16
+ this.onSameDaySelectedInCalendar$ = new Subject();
17
+ this.keepPresetTag = false;
18
+ this.isValueUpdating = false;
19
+ this.availableTimeframes = [
20
+ TimeframeOption.DAY,
21
+ TimeframeOption.WEEK,
22
+ TimeframeOption.MONTH,
23
+ TimeframeOption.QUARTER,
24
+ TimeframeOption.YEAR
25
+ ];
26
+ this.formatConfig = {
27
+ day: DateFromats.MAT_DEFAULT_DATE_FORMAT,
28
+ month: DateFromats.MONTH_YEAR_FORMAT,
29
+ year: DateFromats.YEAR_FORMAT,
30
+ quarter: DateFromats.QUARTER_FORMAT,
31
+ week: DateFromats.WEEK_FORMAT
32
+ };
33
+ this.fiscalYearMonthsModifier = 0;
34
+ }
35
+ getDisplayPrefix() {
36
+ const formatCached = this.format$.getValue();
37
+ switch (true) {
38
+ case formatCached === null || formatCached === void 0 ? void 0 : formatCached.includes('Q'):
39
+ return 'Q';
40
+ case formatCached === null || formatCached === void 0 ? void 0 : formatCached.includes('W'):
41
+ return 'W';
42
+ default:
43
+ return '';
44
+ }
45
+ }
46
+ getTimeframe(format) {
47
+ return DrSharedUtils.getTimeframeByDateFormat(format);
48
+ }
49
+ getConfiguredFormat(timeframe) {
50
+ return this.formatConfig[timeframe];
51
+ }
52
+ updateTimeframeAndFormat(format) {
53
+ const normalizedFormat = this.normalizeValue(format || this.format$.getValue());
54
+ this.timeframe = this.getTimeframe(normalizedFormat);
55
+ this.format$.next(this.getConfiguredFormat(this.timeframe));
56
+ }
57
+ normalizeValue(value) {
58
+ return value.replace(/d/g, 'D');
59
+ }
60
+ /**
61
+ * Get quarter number for date according to fiscal year
62
+ *
63
+ * @param date
64
+ */
65
+ getQuarterAccordingToFiscalYear(date) {
66
+ let fiscalMonth = this.fiscalYearMonthsModifier;
67
+ const dateMonth = date.month();
68
+ if (dateMonth < fiscalMonth) {
69
+ fiscalMonth -= 12;
70
+ }
71
+ return Math.trunc((date.month() - fiscalMonth) / 3) + 1;
72
+ }
73
+ /**
74
+ * Sets date to end of quarter in FY by passed quarter number
75
+ *
76
+ * @param date
77
+ * @param quarterNumber
78
+ */
79
+ setEndOfQuarter(date, quarterNumber) {
80
+ date
81
+ .subtract(this.fiscalYearMonthsModifier, 'M')
82
+ .startOf('year')
83
+ .add(this.fiscalYearMonthsModifier + quarterNumber * 3 - 1, 'M')
84
+ .endOf('month');
85
+ }
86
+ /**
87
+ * Sets date to start of quarter in FY by passed quarter number
88
+ *
89
+ * @param date
90
+ * @param quarterNumber
91
+ */
92
+ setStartOfQuarter(date, quarterNumber) {
93
+ date
94
+ .subtract(this.fiscalYearMonthsModifier, 'M')
95
+ .startOf('year')
96
+ .add(this.fiscalYearMonthsModifier + (quarterNumber - 1) * 3, 'M');
97
+ }
98
+ /**
99
+ * Sets date to end of current quarter (in which date is located) according to FY
100
+ *
101
+ * @param date
102
+ */
103
+ setEndOfCurrentQuarter(date) {
104
+ this.setEndOfQuarter(date, this.getQuarterAccordingToFiscalYear(date));
105
+ }
106
+ /**
107
+ * Sets date to start of current quarter (in which date is located) according to FY
108
+ *
109
+ * @param date
110
+ */
111
+ setStartOfCurrentQuarter(date) {
112
+ this.setStartOfQuarter(date, this.getQuarterAccordingToFiscalYear(date));
113
+ }
114
+ /**
115
+ * If date selection on this timeframe depends on Fiscal Year
116
+ *
117
+ * @param timeframe
118
+ */
119
+ isTimeframeDependingOnFY(timeframe) {
120
+ return _.includes([TimeframeOption.QUARTER, TimeframeOption.YEAR], timeframe);
121
+ }
122
+ /**
123
+ * Subtract from date fiscal year shift months count
124
+ *
125
+ * @param date
126
+ */
127
+ subtractFiscalYearMonthsFromDate(date) {
128
+ return this.getDateModifiedByFiscalMonths(date, true);
129
+ }
130
+ /**
131
+ * Add to date fiscal year shift months count
132
+ *
133
+ * @param date
134
+ */
135
+ addFiscalYearMonthsToDate(date) {
136
+ return this.getDateModifiedByFiscalMonths(date);
137
+ }
138
+ /**
139
+ * Add or subtract depending on isRevert paremeter Fiscal year month shift
140
+ *
141
+ * @param date
142
+ * @param isSubtract
143
+ */
144
+ getDateModifiedByFiscalMonths(date, isSubtract = false) {
145
+ return date ? _.cloneDeep(date)[isSubtract ? 'subtract' : 'add'](this.fiscalYearMonthsModifier, 'month') : date;
146
+ }
147
+ updateDatePickerByPreset(tag, calender) {
148
+ this.keepPresetTag = true;
149
+ let date = null;
150
+ if (tag) {
151
+ date = DrSharedUtils.getDateByTag(tag);
152
+ switch (tag) {
153
+ case DateTags.TODAY:
154
+ this.updateTimeframeAndFormat(DateFromats.MAT_DEFAULT_DATE_FORMAT);
155
+ break;
156
+ case DateTags.YESTERDAY:
157
+ this.updateTimeframeAndFormat(DateFromats.MAT_DEFAULT_DATE_FORMAT);
158
+ break;
159
+ case DateTags.THIS_MONTH:
160
+ this.updateTimeframeAndFormat(DateFromats.MONTH_YEAR_FORMAT);
161
+ this.selectDateInCalendarMonthView(date, calender);
162
+ break;
163
+ case DateTags.PREV_MONTH:
164
+ this.updateTimeframeAndFormat(DateFromats.MONTH_YEAR_FORMAT);
165
+ this.selectDateInCalendarMonthView(date, calender);
166
+ break;
167
+ }
168
+ }
169
+ this.presetTag$.next(tag);
170
+ this.updatedDateAndClose$.next(date);
171
+ }
172
+ selectDateInCalendarMonthView(date, calender) {
173
+ setTimeout(() => {
174
+ const monthView = calender.monthView;
175
+ if (monthView) {
176
+ monthView._activeDate = date;
177
+ monthView._selected = date;
178
+ monthView._init();
179
+ }
180
+ });
181
+ }
182
+ resetPresetTag() {
183
+ if (!this.keepPresetTag) {
184
+ this.presetTag$.next(null);
185
+ }
186
+ else {
187
+ this.keepPresetTag = false;
188
+ }
189
+ }
190
+ }
191
+ DrDatePickerService.decorators = [
192
+ { type: Injectable }
193
+ ];
194
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHItZGF0ZS1waWNrZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2RhdGFyYWlsc3NoYXJlZC9zcmMvbGliL2RyLWlucHV0cy9kYXRlLXBpY2tlcnMvc2VydmljZXMvZHItZGF0ZS1waWNrZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzNDLE9BQU8sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUEyQixlQUFlLEVBQW9CLE1BQU0sNEJBQTRCLENBQUM7QUFDL0gsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQy9ELE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBRTVCLGFBQWE7QUFDYixNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7QUFHakMsTUFBTSxPQUFPLG1CQUFtQjtJQURoQztRQUVJLGdDQUEyQixHQUFHLEtBQUssQ0FBQztRQUNwQyxjQUFTLEdBQXFCLGVBQWUsQ0FBQyxHQUFHLENBQUM7UUFDbEQsWUFBTyxHQUFHLElBQUksZUFBZSxDQUFTLFdBQVcsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQzNFLG9CQUFlLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztRQUN4Qyx5QkFBb0IsR0FBRyxJQUFJLE9BQU8sRUFBVSxDQUFDO1FBRzdDLGVBQVUsR0FBRyxJQUFJLGVBQWUsQ0FBUyxFQUFFLENBQUMsQ0FBQztRQUM3QyxpQ0FBNEIsR0FBRyxJQUFJLE9BQU8sRUFBVSxDQUFDO1FBQ3JELGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLG9CQUFlLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLHdCQUFtQixHQUFHO1lBQ2xCLGVBQWUsQ0FB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VUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNaLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxTQUFnQixDQUFDO1lBQzVDLElBQUksU0FBUyxFQUFFO2dCQUNYLFNBQVMsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO2dCQUM3QixTQUFTLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztnQkFDM0IsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO2FBQ3JCO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU0sY0FBYztRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNyQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUM5QjthQUFNO1lBQ0gsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7U0FDOUI7SUFDTCxDQUFDOzs7WUF6TUosVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdENhbGVuZGFyLCBNYXREYXRlcGlja2VyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGF0ZXBpY2tlcic7XG5pbXBvcnQgeyBNb21lbnQgfSBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBEYXRlRnJvbWF0cywgRGF0ZVRhZ3MsIElEYXRlUGlja2VyRm9ybWF0Q29uZmlnLCBUaW1lZnJhbWVPcHRpb24sIFRUaW1lZnJhbWVPcHRpb24gfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZGF0ZVBpY2tlcic7XG5pbXBvcnQgeyBEclNoYXJlZFV0aWxzIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvZHItc2hhcmVkLXV0aWxzJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcblxuLy8gQHRzLWlnbm9yZVxuY29uc3QgbW9tZW50ID0gcmVxdWlyZSgnbW9tZW50Jyk7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBEckRhdGVQaWNrZXJTZXJ2aWNlIHtcbiAgICBpc1RpbWVmcmFtZVNlbGVjdGlvbkVuYWJsZWQgPSBmYWxzZTtcbiAgICB0aW1lZnJhbWU6IFRUaW1lZnJhbWVPcHRpb24gPSBUaW1lZnJhbWVPcHRpb24uREFZO1xuICAgIGZvcm1hdCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oRGF0ZUZyb21hdHMuTUFUX0RFRkFVTFRfREFURV9GT1JNQVQpO1xuICAgIHVwZGF0ZWRRdWFydGVyJCA9IG5ldyBTdWJqZWN0PE1vbWVudD4oKTtcbiAgICB1cGRhdGVkRGF0ZUFuZENsb3NlJCA9IG5ldyBTdWJqZWN0PE1vbWVudD4oKTtcbiAgICBkYXRlUGlja2VySW5zdGFuY2U6IE1hdERhdGVwaWNrZXI8YW55PjtcbiAgICBpc1VzaW5nRGF0ZVRhZ1ByZXNldHM6IGJvb2xlYW47XG4gICAgcHJlc2V0VGFnJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPignJyk7XG4gICAgb25TYW1lRGF5U2VsZWN0ZWRJbkNhbGVuZGFyJCA9IG5ldyBTdWJqZWN0PE1vbWVudD4oKTtcbiAgICBrZWVwUHJlc2V0VGFnID0gZmFsc2U7XG4gICAgaXNWYWx1ZVVwZGF0aW5nID0gZmFsc2U7XG4gICAgYXZhaWxhYmxlVGltZWZyYW1lcyA9IFtcbiAgICAgICAgVGltZWZyYW1lT3B0aW9uLkRBWSxcbiAgICAgICAgVGltZWZyYW1lT3B0aW9uLldFRUssXG4gICAgICAgIFRpbWVmcmFtZU9wdGlvbi5NT05USCxcbiAgICAgICAgVGltZWZyYW1lT3B0aW9uLlFVQVJURVIsXG4gICAgICAgIFRpbWVmcmFtZU9wdGlvbi5ZRUFSXG4gICAgXTtcblxuICAgIHB1YmxpYyBmb3JtYXRDb25maWc6IElEYXRlUGlja2VyRm9ybWF0Q29uZmlnID0ge1xuICAgICAgICBkYXk6IERhdGVGcm9tYXRzLk1BVF9ERUZBVUxUX0RBVEVfRk9STUFULFxuICAgICAgICBtb250aDogRGF0ZUZyb21hdHMuTU9OVEhfWUVBUl9GT1JNQVQsXG4gICAgICAgIHllYXI6IERhdGVGcm9tYXRzLllFQVJfRk9STUFULFxuICAgICAgICBxdWFydGVyOiBEYXRlRnJvbWF0cy5RVUFSVEVSX0ZPUk1BVCxcbiAgICAgICAgd2VlazogRGF0ZUZyb21hdHMuV0VFS19GT1JNQVRcbiAgICB9O1xuICAgIHB1YmxpYyBjYWxlbmRhckluc3RhbmNlOiBNYXRDYWxlbmRhcjxhbnk+O1xuXG4gICAgcHVibGljIGZpc2NhbFllYXJNb250aHNNb2RpZmllciA9IDA7XG5cbiAgICBnZXREaXNwbGF5UHJlZml4KCkge1xuICAgICAgICBjb25zdCBmb3JtYXRDYWNoZWQgPSB0aGlzLmZvcm1hdCQuZ2V0VmFsdWUoKTtcbiAgICAgICAgc3dpdGNoICh0cnVlKSB7XG4gICAgICAgICAgICBjYXNlIGZvcm1hdENhY2hlZD8uaW5jbHVkZXMoJ1EnKTpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1EnO1xuICAgICAgICAgICAgY2FzZSBmb3JtYXRDYWNoZWQ/LmluY2x1ZGVzKCdXJyk6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdXJztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0VGltZWZyYW1lKGZvcm1hdDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBEclNoYXJlZFV0aWxzLmdldFRpbWVmcmFtZUJ5RGF0ZUZvcm1hdChmb3JtYXQpO1xuICAgIH1cblxuICAgIGdldENvbmZpZ3VyZWRGb3JtYXQodGltZWZyYW1lOiBUVGltZWZyYW1lT3B0aW9uKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1hdENvbmZpZ1t0aW1lZnJhbWVdO1xuICAgIH1cblxuICAgIHVwZGF0ZVRpbWVmcmFtZUFuZEZvcm1hdChmb3JtYXQ6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkRm9ybWF0ID0gdGhpcy5ub3JtYWxpemVWYWx1ZShmb3JtYXQgfHwgdGhpcy5mb3JtYXQkLmdldFZhbHVlKCkpO1xuICAgICAgICB0aGlzLnRpbWVmcmFtZSA9IHRoaXMuZ2V0VGltZWZyYW1lKG5vcm1hbGl6ZWRGb3JtYXQpO1xuICAgICAgICB0aGlzLmZvcm1hdCQubmV4dCh0aGlzLmdldENvbmZpZ3VyZWRGb3JtYXQodGhpcy50aW1lZnJhbWUpKTtcbiAgICB9XG5cbiAgICBub3JtYWxpemVWYWx1ZSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvZC9nLCAnRCcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBxdWFydGVyIG51bWJlciBmb3IgZGF0ZSBhY2NvcmRpbmcgdG8gZmlzY2FsIHllYXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSBkYXRlXG4gICAgICovXG4gICAgcHVibGljIGdldFF1YXJ0ZXJBY2NvcmRpbmdUb0Zpc2NhbFllYXIoZGF0ZTogTW9tZW50KTogbnVtYmVyIHtcbiAgICAgICAgbGV0IGZpc2NhbE1vbnRoID0gdGhpcy5maXNjYWxZZWFyTW9udGhzTW9kaWZpZXI7XG4gICAgICAgIGNvbnN0IGRhdGVNb250aCA9IGRhdGUubW9udGgoKTtcbiAgICAgICAgaWYgKGRhdGVNb250aCA8IGZpc2NhbE1vbnRoKSB7XG4gICAgICAgICAgICBmaXNjYWxNb250aCAtPSAxMjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTWF0aC50cnVuYygoZGF0ZS5tb250aCgpIC0gZmlzY2FsTW9udGgpIC8gMykgKyAxO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgZGF0ZSB0byBlbmQgb2YgcXVhcnRlciBpbiBGWSBieSBwYXNzZWQgcXVhcnRlciBudW1iZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSBkYXRlXG4gICAgICogQHBhcmFtIHF1YXJ0ZXJOdW1iZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0RW5kT2ZRdWFydGVyKGRhdGU6IE1vbWVudCwgcXVhcnRlck51bWJlcjogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGRhdGVcbiAgICAgICAgICAgIC5zdWJ0cmFjdCh0aGlzLmZpc2NhbFllYXJNb250aHNNb2RpZmllciwgJ00nKVxuICAgICAgICAgICAgLnN0YXJ0T2YoJ3llYXInKVxuICAgICAgICAgICAgLmFkZCh0aGlzLmZpc2NhbFllYXJNb250aHNNb2RpZmllciArIHF1YXJ0ZXJOdW1iZXIgKiAzIC0gMSwgJ00nKVxuICAgICAgICAgICAgLmVuZE9mKCdtb250aCcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgZGF0ZSB0byBzdGFydCBvZiBxdWFydGVyIGluIEZZIGJ5IHBhc3NlZCBxdWFydGVyIG51bWJlclxuICAgICAqXG4gICAgICogQHBhcmFtIGRhdGVcbiAgICAgKiBAcGFyYW0gcXVhcnRlck51bWJlclxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRTdGFydE9mUXVhcnRlcihkYXRlOiBNb21lbnQsIHF1YXJ0ZXJOdW1iZXI6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBkYXRlXG4gICAgICAgICAgICAuc3VidHJhY3QodGhpcy5maXNjYWxZZWFyTW9udGhzTW9kaWZpZXIsICdNJylcbiAgICAgICAgICAgIC5zdGFydE9mKCd5ZWFyJylcbiAgICAgICAgICAgIC5hZGQodGhpcy5maXNjYWxZZWFyTW9udGhzTW9kaWZpZXIgKyAocXVhcnRlck51bWJlciAtIDEpICogMywgJ00nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGRhdGUgdG8gZW5kIG9mIGN1cnJlbnQgcXVhcnRlciAoaW4gd2hpY2ggZGF0ZSBpcyBsb2NhdGVkKSBhY2NvcmRpbmcgdG8gRllcbiAgICAgKlxuICAgICAqIEBwYXJhbSBkYXRlXG4gICAgICovXG4gICAgcHVibGljIHNldEVuZE9mQ3VycmVudFF1YXJ0ZXIoZGF0ZTogTW9tZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2V0RW5kT2ZRdWFydGVyKGRhdGUsIHRoaXMuZ2V0UXVhcnRlckFjY29yZGluZ1RvRmlzY2FsWWVhcihkYXRlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBkYXRlIHRvIHN0YXJ0IG9mIGN1cnJlbnQgcXVhcnRlciAoaW4gd2hpY2ggZGF0ZSBpcyBsb2NhdGVkKSBhY2NvcmRpbmcgdG8gRllcbiAgICAgKlxuICAgICAqIEBwYXJhbSBkYXRlXG4gICAgICovXG4gICAgcHVibGljIHNldFN0YXJ0T2ZDdXJyZW50UXVhcnRlcihkYXRlOiBNb21lbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXRTdGFydE9mUXVhcnRlcihkYXRlLCB0aGlzLmdldFF1YXJ0ZXJBY2NvcmRpbmdUb0Zpc2NhbFllYXIoZGF0ZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIGRhdGUgc2VsZWN0aW9uIG9uIHRoaXMgdGltZWZyYW1lIGRlcGVuZHMgb24gRmlzY2FsIFllYXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSB0aW1lZnJhbWVcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNUaW1lZnJhbWVEZXBlbmRpbmdPbkZZKHRpbWVmcmFtZTogVGltZWZyYW1lT3B0aW9uKSB7XG4gICAgICAgIHJldHVybiBfLmluY2x1ZGVzKFtUaW1lZnJhbWVPcHRpb24uUVVBUlRFUiwgVGltZWZyYW1lT3B0aW9uLllFQVJdLCB0aW1lZnJhbWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN1YnRyYWN0IGZyb20gZGF0ZSBmaXNjYWwgeWVhciBzaGlmdCBtb250aHMgY291bnRcbiAgICAgKlxuICAgICAqIEBwYXJhbSBkYXRlXG4gICAgICovXG4gICAgcHVibGljIHN1YnRyYWN0RmlzY2FsWWVhck1vbnRoc0Zyb21EYXRlKGRhdGU6IE1vbWVudCk6IE1vbWVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldERhdGVNb2RpZmllZEJ5RmlzY2FsTW9udGhzKGRhdGUsIHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCB0byBkYXRlIGZpc2NhbCB5ZWFyIHNoaWZ0IG1vbnRocyBjb3VudFxuICAgICAqXG4gICAgICogQHBhcmFtIGRhdGVcbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkRmlzY2FsWWVhck1vbnRoc1RvRGF0ZShkYXRlOiBNb21lbnQpOiBNb21lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXREYXRlTW9kaWZpZWRCeUZpc2NhbE1vbnRocyhkYXRlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgb3Igc3VidHJhY3QgZGVwZW5kaW5nIG9uIGlzUmV2ZXJ0IHBhcmVtZXRlciBGaXNjYWwgeWVhciBtb250aCBzaGlmdFxuICAgICAqXG4gICAgICogQHBhcmFtIGRhdGVcbiAgICAgKiBAcGFyYW0gaXNTdWJ0cmFjdFxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0RGF0ZU1vZGlmaWVkQnlGaXNjYWxNb250aHMoZGF0ZTogTW9tZW50LCBpc1N1YnRyYWN0ID0gZmFsc2UpOiBNb21lbnQge1xuICAgICAgICByZXR1cm4gZGF0ZSA/IF8uY2xvbmVEZWVwKGRhdGUpW2lzU3VidHJhY3QgPyAnc3VidHJhY3QnIDogJ2FkZCddKHRoaXMuZmlzY2FsWWVhck1vbnRoc01vZGlmaWVyLCAnbW9udGgnKSA6IGRhdGU7XG4gICAgfVxuXG4gICAgcHVibGljIHVwZGF0ZURhdGVQaWNrZXJCeVByZXNldCh0YWc6IHN0cmluZywgY2FsZW5kZXI6IGFueSkge1xuICAgICAgICB0aGlzLmtlZXBQcmVzZXRUYWcgPSB0cnVlO1xuICAgICAgICBsZXQgZGF0ZSA9IG51bGw7XG4gICAgICAgIGlmICh0YWcpIHtcbiAgICAgICAgZGF0ZSA9IERyU2hhcmVkVXRpbHMuZ2V0RGF0ZUJ5VGFnKHRhZyk7XG4gICAgICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICAgICAgICBjYXNlIERhdGVUYWdzLlRPREFZOlxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVGltZWZyYW1lQW5kRm9ybWF0KERhdGVGcm9tYXRzLk1BVF9ERUZBVUxUX0RBVEVfRk9STUFUKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRGF0ZVRhZ3MuWUVTVEVSREFZOlxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVGltZWZyYW1lQW5kRm9ybWF0KERhdGVGcm9tYXRzLk1BVF9ERUZBVUxUX0RBVEVfRk9STUFUKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRGF0ZVRhZ3MuVEhJU19NT05USDpcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVRpbWVmcmFtZUFuZEZvcm1hdChEYXRlRnJvbWF0cy5NT05USF9ZRUFSX0ZPUk1BVCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3REYXRlSW5DYWxlbmRhck1vbnRoVmlldyhkYXRlLCBjYWxlbmRlcik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIERhdGVUYWdzLlBSRVZfTU9OVEg6XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVUaW1lZnJhbWVBbmRGb3JtYXQoRGF0ZUZyb21hdHMuTU9OVEhfWUVBUl9GT1JNQVQpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0RGF0ZUluQ2FsZW5kYXJNb250aFZpZXcoZGF0ZSwgY2FsZW5kZXIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJlc2V0VGFnJC5uZXh0KHRhZyk7XG4gICAgICAgIHRoaXMudXBkYXRlZERhdGVBbmRDbG9zZSQubmV4dChkYXRlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VsZWN0RGF0ZUluQ2FsZW5kYXJNb250aFZpZXcoZGF0ZTogTW9tZW50LCBjYWxlbmRlcjogYW55KTogdm9pZCB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbW9udGhWaWV3ID0gY2FsZW5kZXIubW9udGhWaWV3IGFzIGFueTtcbiAgICAgICAgICAgIGlmIChtb250aFZpZXcpIHtcbiAgICAgICAgICAgICAgICBtb250aFZpZXcuX2FjdGl2ZURhdGUgPSBkYXRlO1xuICAgICAgICAgICAgICAgIG1vbnRoVmlldy5fc2VsZWN0ZWQgPSBkYXRlO1xuICAgICAgICAgICAgICAgIG1vbnRoVmlldy5faW5pdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVzZXRQcmVzZXRUYWcoKSB7XG4gICAgICAgIGlmICghdGhpcy5rZWVwUHJlc2V0VGFnKSB7XG4gICAgICAgICAgICB0aGlzLnByZXNldFRhZyQubmV4dChudWxsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMua2VlcFByZXNldFRhZyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19