primekit 1.0.11 → 1.0.12

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 (244) hide show
  1. package/esm2022/lib/lib/atomix-alert/atomix-alert.component.mjs +76 -0
  2. package/esm2022/lib/lib/atomix-autocomplete/atomix-autocomplete.component.mjs +108 -0
  3. package/esm2022/lib/lib/atomix-button/atomix-button.component.mjs +49 -0
  4. package/esm2022/lib/lib/atomix-button/atomix-button.models.mjs +2 -0
  5. package/esm2022/lib/lib/atomix-calendar/atomix-calendar.component.mjs +90 -0
  6. package/esm2022/lib/lib/atomix-card/atomix-card.component.mjs +24 -0
  7. package/esm2022/lib/lib/atomix-confirmation-dialog/atomix-confirmation-dialog.component.mjs +28 -0
  8. package/esm2022/lib/lib/atomix-daterange-calendar/atomix-daterange-calendar.component.mjs +674 -0
  9. package/esm2022/lib/lib/atomix-divider/atomix-divider.component.mjs +27 -0
  10. package/esm2022/lib/lib/atomix-dropdown/atomix-dropdown.component.mjs +105 -0
  11. package/esm2022/lib/lib/atomix-dynamic-dialog/atomix-dynamic-dialog.component.mjs +38 -0
  12. package/esm2022/lib/lib/atomix-dynamic-dialog/atomix-dynamic-dialog.models.mjs +2 -0
  13. package/esm2022/lib/lib/atomix-form/atomix-form-autocomplete/atomix-form-autocomplete.component.mjs +67 -0
  14. package/esm2022/lib/lib/atomix-form/atomix-form-calendar/atomix-form-calendar.component.mjs +59 -0
  15. package/esm2022/lib/lib/atomix-form/atomix-form-checkbox/atomix-form-checkbox.component.mjs +48 -0
  16. package/esm2022/lib/lib/atomix-form/atomix-form-chips/atomix-form-chips.component.mjs +54 -0
  17. package/esm2022/lib/lib/atomix-form/atomix-form-chips/form.chips.models.mjs +2 -0
  18. package/esm2022/lib/lib/atomix-form/atomix-form-dropdown/atomix-form-dropdown.component.mjs +70 -0
  19. package/esm2022/lib/lib/atomix-form/atomix-form-input-component/atomix-form-input-component.component.mjs +80 -0
  20. package/esm2022/lib/lib/atomix-form/atomix-form-inputmask-component/atomix-form-inputmask-component.component.mjs +48 -0
  21. package/esm2022/lib/lib/atomix-form/atomix-form-password-component/atomix-form-password-component.component.mjs +48 -0
  22. package/esm2022/lib/lib/atomix-form/atomix-form-radio-button/atomix-radio-button.component.mjs +46 -0
  23. package/esm2022/lib/lib/atomix-form/atomix-form-textarea/atomix-form-textarea.component.mjs +46 -0
  24. package/esm2022/lib/lib/atomix-input/atomix-input.component.mjs +94 -0
  25. package/esm2022/lib/lib/atomix-input-switch/atomix-input-switch.component.mjs +85 -0
  26. package/esm2022/lib/lib/atomix-loading-overlay/atomix-loading-overlay.component.mjs +44 -0
  27. package/esm2022/lib/lib/atomix-messages/messages.component.mjs +33 -0
  28. package/esm2022/lib/lib/atomix-pagination/atomix-pagination.component.mjs +48 -0
  29. package/esm2022/lib/lib/atomix-radio-button/atomix-radio-button.component.mjs +50 -0
  30. package/esm2022/lib/lib/atomix-search-dropdown/atomix-search-dropdown.component.mjs +149 -0
  31. package/esm2022/lib/lib/atomix-select-button/atomix-select-button-models.mjs +2 -0
  32. package/esm2022/lib/lib/atomix-select-button/atomix-select-button.component.mjs +25 -0
  33. package/esm2022/lib/lib/atomix-snackbar/atomix-snackbar.component.mjs +29 -0
  34. package/esm2022/lib/lib/atomix-spinner/atomix-spinner.component.mjs +24 -0
  35. package/esm2022/lib/lib/atomix-steps/atomix-steps.component.mjs +41 -0
  36. package/esm2022/lib/lib/atomix-tabMenu/atomix-tabMenu.component.mjs +51 -0
  37. package/esm2022/lib/lib/atomix-table/atomix-table.component.mjs +454 -0
  38. package/esm2022/lib/lib/atomix-table/atomix-table.models.mjs +2 -0
  39. package/esm2022/lib/lib/atomix-tag/atomix-tag.component.mjs +24 -0
  40. package/esm2022/lib/lib/utils/prime-icons.util.mjs +10 -0
  41. package/esm2022/lib/primekit.component.mjs +11 -0
  42. package/esm2022/lib/primekit.module.mjs +322 -0
  43. package/esm2022/lib/primekit.service.mjs +14 -0
  44. package/esm2022/primekit.mjs +5 -0
  45. package/esm2022/public-api.mjs +44 -0
  46. package/fesm2022/primekit.mjs +3115 -0
  47. package/fesm2022/primekit.mjs.map +1 -0
  48. package/index.d.ts +5 -0
  49. package/lib/lib/atomix-alert/atomix-alert.component.d.ts +22 -0
  50. package/lib/lib/atomix-autocomplete/atomix-autocomplete.component.d.ts +34 -0
  51. package/lib/lib/atomix-button/atomix-button.component.d.ts +19 -0
  52. package/{src/lib/lib/atomix-button/atomix-button.models.ts → lib/lib/atomix-button/atomix-button.models.d.ts} +2 -2
  53. package/lib/lib/atomix-calendar/atomix-calendar.component.d.ts +27 -0
  54. package/lib/lib/atomix-card/atomix-card.component.d.ts +9 -0
  55. package/lib/lib/atomix-confirmation-dialog/atomix-confirmation-dialog.component.d.ts +12 -0
  56. package/lib/lib/atomix-daterange-calendar/atomix-daterange-calendar.component.d.ts +72 -0
  57. package/lib/lib/atomix-divider/atomix-divider.component.d.ts +12 -0
  58. package/lib/lib/atomix-dropdown/atomix-dropdown.component.d.ts +50 -0
  59. package/lib/lib/atomix-dynamic-dialog/atomix-dynamic-dialog.component.d.ts +15 -0
  60. package/lib/lib/atomix-dynamic-dialog/atomix-dynamic-dialog.models.d.ts +11 -0
  61. package/lib/lib/atomix-form/atomix-form-autocomplete/atomix-form-autocomplete.component.d.ts +25 -0
  62. package/lib/lib/atomix-form/atomix-form-calendar/atomix-form-calendar.component.d.ts +23 -0
  63. package/lib/lib/atomix-form/atomix-form-checkbox/atomix-form-checkbox.component.d.ts +18 -0
  64. package/lib/lib/atomix-form/atomix-form-chips/atomix-form-chips.component.d.ts +19 -0
  65. package/lib/lib/atomix-form/atomix-form-chips/form.chips.models.d.ts +5 -0
  66. package/lib/lib/atomix-form/atomix-form-dropdown/atomix-form-dropdown.component.d.ts +25 -0
  67. package/lib/lib/atomix-form/atomix-form-input-component/atomix-form-input-component.component.d.ts +28 -0
  68. package/lib/lib/atomix-form/atomix-form-inputmask-component/atomix-form-inputmask-component.component.d.ts +17 -0
  69. package/lib/lib/atomix-form/atomix-form-password-component/atomix-form-password-component.component.d.ts +17 -0
  70. package/lib/lib/atomix-form/atomix-form-radio-button/atomix-radio-button.component.d.ts +19 -0
  71. package/lib/lib/atomix-form/atomix-form-textarea/atomix-form-textarea.component.d.ts +17 -0
  72. package/lib/lib/atomix-input/atomix-input.component.d.ts +29 -0
  73. package/lib/lib/atomix-input-switch/atomix-input-switch.component.d.ts +30 -0
  74. package/lib/lib/atomix-loading-overlay/atomix-loading-overlay.component.d.ts +16 -0
  75. package/lib/lib/atomix-messages/messages.component.d.ts +13 -0
  76. package/lib/lib/atomix-pagination/atomix-pagination.component.d.ts +19 -0
  77. package/lib/lib/atomix-radio-button/atomix-radio-button.component.d.ts +15 -0
  78. package/lib/lib/atomix-search-dropdown/atomix-search-dropdown.component.d.ts +60 -0
  79. package/{src/lib/lib/atomix-select-button/atomix-select-button-models.ts → lib/lib/atomix-select-button/atomix-select-button-models.d.ts} +4 -4
  80. package/lib/lib/atomix-select-button/atomix-select-button.component.d.ts +12 -0
  81. package/lib/lib/atomix-snackbar/atomix-snackbar.component.d.ts +12 -0
  82. package/lib/lib/atomix-spinner/atomix-spinner.component.d.ts +9 -0
  83. package/lib/lib/atomix-steps/atomix-steps.component.d.ts +19 -0
  84. package/lib/lib/atomix-tabMenu/atomix-tabMenu.component.d.ts +19 -0
  85. package/lib/lib/atomix-table/atomix-table.component.d.ts +119 -0
  86. package/lib/lib/atomix-table/atomix-table.models.d.ts +43 -0
  87. package/lib/lib/atomix-tag/atomix-tag.component.d.ts +9 -0
  88. package/lib/lib/utils/prime-icons.util.d.ts +3 -0
  89. package/lib/primekit.component.d.ts +5 -0
  90. package/lib/primekit.module.d.ts +72 -0
  91. package/lib/primekit.service.d.ts +6 -0
  92. package/package.json +28 -15
  93. package/{src/public-api.ts → public-api.d.ts} +38 -47
  94. package/ng-package.json +0 -8
  95. package/src/lib/lib/atomix-alert/atomix-alert.component.css +0 -67
  96. package/src/lib/lib/atomix-alert/atomix-alert.component.html +0 -7
  97. package/src/lib/lib/atomix-alert/atomix-alert.component.spec.ts +0 -154
  98. package/src/lib/lib/atomix-alert/atomix-alert.component.ts +0 -75
  99. package/src/lib/lib/atomix-autocomplete/atomix-autocomplete.component.html +0 -35
  100. package/src/lib/lib/atomix-autocomplete/atomix-autocomplete.component.scss +0 -72
  101. package/src/lib/lib/atomix-autocomplete/atomix-autocomplete.component.spec.ts +0 -210
  102. package/src/lib/lib/atomix-autocomplete/atomix-autocomplete.component.ts +0 -70
  103. package/src/lib/lib/atomix-button/atomix-button.component.css +0 -70
  104. package/src/lib/lib/atomix-button/atomix-button.component.html +0 -20
  105. package/src/lib/lib/atomix-button/atomix-button.component.spec.ts +0 -135
  106. package/src/lib/lib/atomix-button/atomix-button.component.ts +0 -28
  107. package/src/lib/lib/atomix-calendar/atomix-calendar.component.css +0 -5
  108. package/src/lib/lib/atomix-calendar/atomix-calendar.component.html +0 -20
  109. package/src/lib/lib/atomix-calendar/atomix-calendar.component.spec.ts +0 -145
  110. package/src/lib/lib/atomix-calendar/atomix-calendar.component.ts +0 -71
  111. package/src/lib/lib/atomix-card/atomix-card.component.css +0 -4
  112. package/src/lib/lib/atomix-card/atomix-card.component.html +0 -3
  113. package/src/lib/lib/atomix-card/atomix-card.component.spec.ts +0 -63
  114. package/src/lib/lib/atomix-card/atomix-card.component.ts +0 -13
  115. package/src/lib/lib/atomix-confirmation-dialog/atomix-confirmation-dialog.component.css +0 -12
  116. package/src/lib/lib/atomix-confirmation-dialog/atomix-confirmation-dialog.component.html +0 -9
  117. package/src/lib/lib/atomix-confirmation-dialog/atomix-confirmation-dialog.component.spec.ts +0 -63
  118. package/src/lib/lib/atomix-confirmation-dialog/atomix-confirmation-dialog.component.ts +0 -22
  119. package/src/lib/lib/atomix-daterange-calendar/atomix-daterange-calendar.component.html +0 -233
  120. package/src/lib/lib/atomix-daterange-calendar/atomix-daterange-calendar.component.scss +0 -266
  121. package/src/lib/lib/atomix-daterange-calendar/atomix-daterange-calendar.component.spec.ts +0 -1465
  122. package/src/lib/lib/atomix-daterange-calendar/atomix-daterange-calendar.component.ts +0 -717
  123. package/src/lib/lib/atomix-divider/atomix-divider.component.css +0 -0
  124. package/src/lib/lib/atomix-divider/atomix-divider.component.html +0 -7
  125. package/src/lib/lib/atomix-divider/atomix-divider.component.spec.ts +0 -91
  126. package/src/lib/lib/atomix-divider/atomix-divider.component.ts +0 -17
  127. package/src/lib/lib/atomix-dropdown/atomix-dropdown.component.css +0 -25
  128. package/src/lib/lib/atomix-dropdown/atomix-dropdown.component.html +0 -37
  129. package/src/lib/lib/atomix-dropdown/atomix-dropdown.component.spec.ts +0 -178
  130. package/src/lib/lib/atomix-dropdown/atomix-dropdown.component.ts +0 -89
  131. package/src/lib/lib/atomix-dynamic-dialog/atomix-dynamic-dialog.component.css +0 -0
  132. package/src/lib/lib/atomix-dynamic-dialog/atomix-dynamic-dialog.component.html +0 -0
  133. package/src/lib/lib/atomix-dynamic-dialog/atomix-dynamic-dialog.component.spec.ts +0 -128
  134. package/src/lib/lib/atomix-dynamic-dialog/atomix-dynamic-dialog.component.ts +0 -42
  135. package/src/lib/lib/atomix-dynamic-dialog/atomix-dynamic-dialog.models.ts +0 -12
  136. package/src/lib/lib/atomix-form/atomix-form-autocomplete/atomix-form-autocomplete.component.html +0 -20
  137. package/src/lib/lib/atomix-form/atomix-form-autocomplete/atomix-form-autocomplete.component.scss +0 -7
  138. package/src/lib/lib/atomix-form/atomix-form-autocomplete/atomix-form-autocomplete.component.spec.ts +0 -169
  139. package/src/lib/lib/atomix-form/atomix-form-autocomplete/atomix-form-autocomplete.component.ts +0 -41
  140. package/src/lib/lib/atomix-form/atomix-form-calendar/atomix-form-calendar.component.html +0 -21
  141. package/src/lib/lib/atomix-form/atomix-form-calendar/atomix-form-calendar.component.scss +0 -7
  142. package/src/lib/lib/atomix-form/atomix-form-calendar/atomix-form-calendar.component.spec.ts +0 -142
  143. package/src/lib/lib/atomix-form/atomix-form-calendar/atomix-form-calendar.component.ts +0 -32
  144. package/src/lib/lib/atomix-form/atomix-form-checkbox/atomix-form-checkbox.component.html +0 -13
  145. package/src/lib/lib/atomix-form/atomix-form-checkbox/atomix-form-checkbox.component.scss +0 -14
  146. package/src/lib/lib/atomix-form/atomix-form-checkbox/atomix-form-checkbox.component.spec.ts +0 -112
  147. package/src/lib/lib/atomix-form/atomix-form-checkbox/atomix-form-checkbox.component.ts +0 -28
  148. package/src/lib/lib/atomix-form/atomix-form-chips/atomix-form-chips.component.html +0 -20
  149. package/src/lib/lib/atomix-form/atomix-form-chips/atomix-form-chips.component.scss +0 -3
  150. package/src/lib/lib/atomix-form/atomix-form-chips/atomix-form-chips.component.spec.ts +0 -153
  151. package/src/lib/lib/atomix-form/atomix-form-chips/atomix-form-chips.component.ts +0 -28
  152. package/src/lib/lib/atomix-form/atomix-form-chips/form.chips.models.ts +0 -5
  153. package/src/lib/lib/atomix-form/atomix-form-dropdown/atomix-form-dropdown.component.html +0 -24
  154. package/src/lib/lib/atomix-form/atomix-form-dropdown/atomix-form-dropdown.component.scss +0 -15
  155. package/src/lib/lib/atomix-form/atomix-form-dropdown/atomix-form-dropdown.component.spec.ts +0 -156
  156. package/src/lib/lib/atomix-form/atomix-form-dropdown/atomix-form-dropdown.component.ts +0 -36
  157. package/src/lib/lib/atomix-form/atomix-form-input-component/atomix-form-input-component.component.html +0 -33
  158. package/src/lib/lib/atomix-form/atomix-form-input-component/atomix-form-input-component.component.scss +0 -32
  159. package/src/lib/lib/atomix-form/atomix-form-input-component/atomix-form-input-component.component.spec.ts +0 -156
  160. package/src/lib/lib/atomix-form/atomix-form-input-component/atomix-form-input-component.component.ts +0 -42
  161. package/src/lib/lib/atomix-form/atomix-form-inputmask-component/atomix-form-inputmask-component.component.html +0 -14
  162. package/src/lib/lib/atomix-form/atomix-form-inputmask-component/atomix-form-inputmask-component.component.scss +0 -0
  163. package/src/lib/lib/atomix-form/atomix-form-inputmask-component/atomix-form-inputmask-component.component.spec.ts +0 -104
  164. package/src/lib/lib/atomix-form/atomix-form-inputmask-component/atomix-form-inputmask-component.component.ts +0 -24
  165. package/src/lib/lib/atomix-form/atomix-form-password-component/atomix-form-password-component.component.html +0 -16
  166. package/src/lib/lib/atomix-form/atomix-form-password-component/atomix-form-password-component.component.scss +0 -0
  167. package/src/lib/lib/atomix-form/atomix-form-password-component/atomix-form-password-component.component.spec.ts +0 -92
  168. package/src/lib/lib/atomix-form/atomix-form-password-component/atomix-form-password-component.component.ts +0 -24
  169. package/src/lib/lib/atomix-form/atomix-form-radio-button/atomix-radio-button.component.html +0 -23
  170. package/src/lib/lib/atomix-form/atomix-form-radio-button/atomix-radio-button.component.scss +0 -3
  171. package/src/lib/lib/atomix-form/atomix-form-radio-button/atomix-radio-button.component.spec.ts +0 -126
  172. package/src/lib/lib/atomix-form/atomix-form-radio-button/atomix-radio-button.component.ts +0 -26
  173. package/src/lib/lib/atomix-form/atomix-form-textarea/atomix-form-textarea.component.html +0 -17
  174. package/src/lib/lib/atomix-form/atomix-form-textarea/atomix-form-textarea.component.scss +0 -6
  175. package/src/lib/lib/atomix-form/atomix-form-textarea/atomix-form-textarea.component.spec.ts +0 -120
  176. package/src/lib/lib/atomix-form/atomix-form-textarea/atomix-form-textarea.component.ts +0 -24
  177. package/src/lib/lib/atomix-input/atomix-input.component.css +0 -52
  178. package/src/lib/lib/atomix-input/atomix-input.component.html +0 -45
  179. package/src/lib/lib/atomix-input/atomix-input.component.spec.ts +0 -229
  180. package/src/lib/lib/atomix-input/atomix-input.component.ts +0 -64
  181. package/src/lib/lib/atomix-input-switch/atomix-input-switch.component.css +0 -12
  182. package/src/lib/lib/atomix-input-switch/atomix-input-switch.component.html +0 -17
  183. package/src/lib/lib/atomix-input-switch/atomix-input-switch.component.spec.ts +0 -173
  184. package/src/lib/lib/atomix-input-switch/atomix-input-switch.component.ts +0 -62
  185. package/src/lib/lib/atomix-loading-overlay/atomix-loading-overlay.component.html +0 -47
  186. package/src/lib/lib/atomix-loading-overlay/atomix-loading-overlay.component.scss +0 -14
  187. package/src/lib/lib/atomix-loading-overlay/atomix-loading-overlay.component.spec.ts +0 -21
  188. package/src/lib/lib/atomix-loading-overlay/atomix-loading-overlay.component.ts +0 -25
  189. package/src/lib/lib/atomix-messages/messages.component.css +0 -0
  190. package/src/lib/lib/atomix-messages/messages.component.html +0 -9
  191. package/src/lib/lib/atomix-messages/messages.component.spec.ts +0 -115
  192. package/src/lib/lib/atomix-messages/messages.component.ts +0 -17
  193. package/src/lib/lib/atomix-pagination/atomix-pagination.component.css +0 -19
  194. package/src/lib/lib/atomix-pagination/atomix-pagination.component.html +0 -24
  195. package/src/lib/lib/atomix-pagination/atomix-pagination.component.spec.ts +0 -98
  196. package/src/lib/lib/atomix-pagination/atomix-pagination.component.ts +0 -36
  197. package/src/lib/lib/atomix-radio-button/atomix-radio-button.component.css +0 -0
  198. package/src/lib/lib/atomix-radio-button/atomix-radio-button.component.html +0 -7
  199. package/src/lib/lib/atomix-radio-button/atomix-radio-button.component.spec.ts +0 -116
  200. package/src/lib/lib/atomix-radio-button/atomix-radio-button.component.ts +0 -37
  201. package/src/lib/lib/atomix-search-dropdown/atomix-search-dropdown.component.css +0 -49
  202. package/src/lib/lib/atomix-search-dropdown/atomix-search-dropdown.component.html +0 -68
  203. package/src/lib/lib/atomix-search-dropdown/atomix-search-dropdown.component.spec.ts +0 -282
  204. package/src/lib/lib/atomix-search-dropdown/atomix-search-dropdown.component.ts +0 -119
  205. package/src/lib/lib/atomix-select-button/atomix-select-button.component.css +0 -5
  206. package/src/lib/lib/atomix-select-button/atomix-select-button.component.html +0 -7
  207. package/src/lib/lib/atomix-select-button/atomix-select-button.component.spec.ts +0 -73
  208. package/src/lib/lib/atomix-select-button/atomix-select-button.component.ts +0 -19
  209. package/src/lib/lib/atomix-snackbar/atomix-snackbar.component.css +0 -30
  210. package/src/lib/lib/atomix-snackbar/atomix-snackbar.component.html +0 -4
  211. package/src/lib/lib/atomix-snackbar/atomix-snackbar.component.spec.ts +0 -60
  212. package/src/lib/lib/atomix-snackbar/atomix-snackbar.component.ts +0 -27
  213. package/src/lib/lib/atomix-spinner/atomix-spinner.component.css +0 -0
  214. package/src/lib/lib/atomix-spinner/atomix-spinner.component.html +0 -7
  215. package/src/lib/lib/atomix-spinner/atomix-spinner.component.spec.ts +0 -70
  216. package/src/lib/lib/atomix-spinner/atomix-spinner.component.ts +0 -13
  217. package/src/lib/lib/atomix-steps/atomix-steps.component.html +0 -9
  218. package/src/lib/lib/atomix-steps/atomix-steps.component.scss +0 -0
  219. package/src/lib/lib/atomix-steps/atomix-steps.component.spec.ts +0 -120
  220. package/src/lib/lib/atomix-steps/atomix-steps.component.ts +0 -32
  221. package/src/lib/lib/atomix-tabMenu/atomix-tabMenu.component.css +0 -0
  222. package/src/lib/lib/atomix-tabMenu/atomix-tabMenu.component.html +0 -26
  223. package/src/lib/lib/atomix-tabMenu/atomix-tabMenu.component.spec.ts +0 -106
  224. package/src/lib/lib/atomix-tabMenu/atomix-tabMenu.component.ts +0 -36
  225. package/src/lib/lib/atomix-table/atomix-table.component.css +0 -152
  226. package/src/lib/lib/atomix-table/atomix-table.component.html +0 -647
  227. package/src/lib/lib/atomix-table/atomix-table.component.spec.ts +0 -1648
  228. package/src/lib/lib/atomix-table/atomix-table.component.ts +0 -422
  229. package/src/lib/lib/atomix-table/atomix-table.models.ts +0 -39
  230. package/src/lib/lib/atomix-tag/atomix-tag.component.css +0 -0
  231. package/src/lib/lib/atomix-tag/atomix-tag.component.html +0 -6
  232. package/src/lib/lib/atomix-tag/atomix-tag.component.spec.ts +0 -47
  233. package/src/lib/lib/atomix-tag/atomix-tag.component.ts +0 -13
  234. package/src/lib/lib/utils/prime-icons.util.spec.ts +0 -21
  235. package/src/lib/lib/utils/prime-icons.util.ts +0 -11
  236. package/src/lib/primekit.component.spec.ts +0 -19
  237. package/src/lib/primekit.component.ts +0 -10
  238. package/src/lib/primekit.module.spec.ts +0 -155
  239. package/src/lib/primekit.module.ts +0 -183
  240. package/src/lib/primekit.service.spec.ts +0 -17
  241. package/src/lib/primekit.service.ts +0 -8
  242. package/tsconfig.lib.json +0 -13
  243. package/tsconfig.lib.prod.json +0 -11
  244. package/tsconfig.spec.json +0 -10
@@ -0,0 +1,674 @@
1
+ import { Component, EventEmitter, Input, Output, ViewChild, } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/common";
4
+ import * as i2 from "primeng/button";
5
+ import * as i3 from "primeng/inputtext";
6
+ import * as i4 from "primeng/calendar";
7
+ import * as i5 from "primeng/overlaypanel";
8
+ import * as i6 from "@angular/forms";
9
+ export class AtomixDaterangeCalendarComponent {
10
+ datePipe;
11
+ renderer;
12
+ placeholder = '';
13
+ styleClass = '';
14
+ selectionMode = 'range';
15
+ inputStyleClass = '';
16
+ inline = false;
17
+ disabled = false;
18
+ selectedDate = null;
19
+ maxDate;
20
+ minDate;
21
+ defaultPreset = null;
22
+ preservePreset = false;
23
+ customRangeMode = false;
24
+ selectedPreset = null; // 'today' | 'yesterday' | 'last7days' | 'last30days' | 'last3months' | 'last6months' | 'last1year' | 'custom' | null
25
+ overlayPanel;
26
+ dateRangeChange = new EventEmitter();
27
+ // internal model bound to p-calendar to avoid changing external selection during first-click selection
28
+ modelDate = null;
29
+ enLocale = {
30
+ firstDayOfWeek: 0,
31
+ dayNames: [
32
+ 'Sunday',
33
+ 'Monday',
34
+ 'Tuesday',
35
+ 'Wednesday',
36
+ 'Thursday',
37
+ 'Friday',
38
+ 'Saturday',
39
+ ],
40
+ dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
41
+ dayNamesMin: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],
42
+ monthNames: [
43
+ 'January',
44
+ 'February',
45
+ 'March',
46
+ 'April',
47
+ 'May',
48
+ 'June',
49
+ 'July',
50
+ 'August',
51
+ 'September',
52
+ 'October',
53
+ 'November',
54
+ 'December',
55
+ ],
56
+ monthNamesShort: [
57
+ 'Jan',
58
+ 'Feb',
59
+ 'Mar',
60
+ 'Apr',
61
+ 'May',
62
+ 'Jun',
63
+ 'Jul',
64
+ 'Aug',
65
+ 'Sep',
66
+ 'Oct',
67
+ 'Nov',
68
+ 'Dec',
69
+ ],
70
+ today: 'Today',
71
+ clear: 'Clear',
72
+ };
73
+ // temporary storage for overlay session
74
+ _overlayInitialDate = null;
75
+ _overlayInitialPreset = null;
76
+ _calendarObservers = [];
77
+ _observedElements = [];
78
+ _parentObservers = [];
79
+ _observedParentElements = [];
80
+ _updateRafId = null; // requestAnimationFrame id
81
+ constructor(datePipe, renderer) {
82
+ this.datePipe = datePipe;
83
+ this.renderer = renderer;
84
+ }
85
+ ngOnInit() {
86
+ if (!this.selectedDate && this.defaultPreset) {
87
+ this.applyPreset(this.defaultPreset);
88
+ }
89
+ // initialize internal model
90
+ this.modelDate = this.selectedDate ? [...this.selectedDate] : null;
91
+ // initial class update if there is a pre-selected range
92
+ this._scheduleUpdate();
93
+ // start observers if inline calendar is used
94
+ if (this.inline) {
95
+ this._startCalendarObservers();
96
+ }
97
+ }
98
+ ngOnChanges(changes) {
99
+ if (changes['selectedDate']) {
100
+ const sel = changes['selectedDate'].currentValue;
101
+ if (sel && Array.isArray(sel) && sel.length === 2 && sel[0] && sel[1]) {
102
+ const preset = this.detectPreset(sel[0], sel[1]);
103
+ this.selectedPreset = preset ?? 'custom';
104
+ // sync internal model when external value changes
105
+ this.modelDate = [...sel];
106
+ }
107
+ else if (sel == null) {
108
+ this.selectedPreset = null;
109
+ this.modelDate = null;
110
+ }
111
+ }
112
+ }
113
+ onInputKeyDown(event) {
114
+ if (event.key === 'Enter' || event.key === ' ') {
115
+ try {
116
+ this.overlayPanel?.toggle(event);
117
+ }
118
+ catch (e) { }
119
+ event.preventDefault();
120
+ }
121
+ }
122
+ onOverlayShow() {
123
+ // store a deep copy of current selection/preset when overlay opens
124
+ if (this.selectedDate && Array.isArray(this.selectedDate)) {
125
+ this._overlayInitialDate = this.selectedDate.map((d) => d ? new Date(d.getFullYear(), d.getMonth(), d.getDate()) : d);
126
+ }
127
+ else {
128
+ this._overlayInitialDate = null;
129
+ }
130
+ this._overlayInitialPreset = this.selectedPreset;
131
+ // ensure calendar model shows the currently committed selection when opening
132
+ this.modelDate = this.selectedDate ? [...this.selectedDate] : null;
133
+ // ensure preset buttons reflect current selection when overlay opens
134
+ if (this.selectedDate &&
135
+ Array.isArray(this.selectedDate) &&
136
+ this.selectedDate.length === 2) {
137
+ const preset = this.detectPreset(this.selectedDate[0], this.selectedDate[1]);
138
+ this.selectedPreset = preset ?? 'custom';
139
+ }
140
+ else if (!this.selectedDate) {
141
+ this.selectedPreset = null;
142
+ }
143
+ // add start/end classes to range cells for styling
144
+ this._scheduleUpdate();
145
+ // observe DOM changes (PrimeNG may re-render inside overlay)
146
+ this._startCalendarObservers();
147
+ }
148
+ onOverlayHide() {
149
+ // if internal calendar model has an incomplete selection (partial range) revert to initial
150
+ const model = this.modelDate;
151
+ const isPartialModel = Boolean(model && Array.isArray(model) && model.length > 0 && model[0] && !model[1]);
152
+ if (isPartialModel) {
153
+ this.selectedDate = this._overlayInitialDate;
154
+ this.selectedPreset = this._overlayInitialPreset;
155
+ // reset internal model to synced value
156
+ this.modelDate = this.selectedDate ? [...this.selectedDate] : null;
157
+ }
158
+ this._overlayInitialDate = null;
159
+ this._overlayInitialPreset = null;
160
+ this.customRangeMode = false;
161
+ // cleanup any start/end classes to avoid stale classes
162
+ this._scheduleUpdate();
163
+ // stop observing
164
+ this._stopCalendarObservers();
165
+ }
166
+ onModelChange(dateRange) {
167
+ // When user clicks a first date, PrimeNG may emit an array with 1 value. We don't want to
168
+ // update the external selectedDate until the range is completed (two dates) so that
169
+ // the calendar does not jump back to a previously selected end date's month.
170
+ this.modelDate = dateRange ? [...dateRange] : null;
171
+ if (dateRange &&
172
+ Array.isArray(dateRange) &&
173
+ dateRange.length === 2 &&
174
+ dateRange[0] &&
175
+ dateRange[1]) {
176
+ this.selectedPreset = this.detectPreset(dateRange[0], dateRange[1]);
177
+ this.customRangeMode = false;
178
+ this.selectedDate = [...dateRange];
179
+ this.dateRangeChange.emit(this.selectedDate);
180
+ // close overlay like when applying a preset
181
+ try {
182
+ this.overlayPanel?.hide();
183
+ }
184
+ catch (e) { }
185
+ }
186
+ else if (!dateRange) {
187
+ // cleared selection
188
+ this.selectedPreset = null;
189
+ this.customRangeMode = false;
190
+ this.selectedDate = null;
191
+ this.dateRangeChange.emit(null);
192
+ }
193
+ else {
194
+ // single date selecting (partial range) - do not emit change yet; just keep internal model
195
+ // so the calendar's view remains where the user navigated to.
196
+ this.selectedPreset = null;
197
+ this.customRangeMode = false;
198
+ }
199
+ // update start/end classes while user is selecting or when range completes
200
+ this._scheduleUpdate();
201
+ }
202
+ // Called when the calendar's visible month/year changes
203
+ onCalendarViewChanged(event) {
204
+ // Reapply classes after PrimeNG re-render
205
+ this._scheduleUpdate();
206
+ // Reattach observers after a small delay since PrimeNG will likely replace DOM nodes
207
+ setTimeout(() => {
208
+ try {
209
+ this._stopCalendarObservers();
210
+ this._startCalendarObservers();
211
+ }
212
+ catch (e) { }
213
+ }, 40);
214
+ }
215
+ get hasSelection() {
216
+ return Boolean(this.selectedDate &&
217
+ Array.isArray(this.selectedDate) &&
218
+ this.selectedDate.length === 2 &&
219
+ !!this.selectedDate[0] &&
220
+ !!this.selectedDate[1]);
221
+ }
222
+ normalizeDate(d) {
223
+ return new Date(d.getFullYear(), d.getMonth(), d.getDate());
224
+ }
225
+ isSameDate(a, b) {
226
+ return (a.getFullYear() === b.getFullYear() &&
227
+ a.getMonth() === b.getMonth() &&
228
+ a.getDate() === b.getDate());
229
+ }
230
+ detectPreset(startRaw, endRaw) {
231
+ const start = this.normalizeDate(startRaw);
232
+ const end = this.normalizeDate(endRaw);
233
+ const today = this.normalizeDate(new Date());
234
+ // today
235
+ if (this.isSameDate(start, today) && this.isSameDate(end, today))
236
+ return 'today';
237
+ // yesterday
238
+ const y = new Date(today);
239
+ y.setDate(y.getDate() - 1);
240
+ if (this.isSameDate(start, y) && this.isSameDate(end, y))
241
+ return 'yesterday';
242
+ // last7days (last 7 days including today: start = today - 6, end = today)
243
+ const l7End = new Date(today);
244
+ const l7Start = new Date(today);
245
+ l7Start.setDate(today.getDate() - 6);
246
+ if (this.isSameDate(start, l7Start) && this.isSameDate(end, l7End))
247
+ return 'last7days';
248
+ // last30days (last 30 days including today: start = today - 29, end = today)
249
+ const l30End = new Date(today);
250
+ const l30Start = new Date(today);
251
+ l30Start.setDate(today.getDate() - 29);
252
+ if (this.isSameDate(start, l30Start) && this.isSameDate(end, l30End))
253
+ return 'last30days';
254
+ // last3months (last 3 months including today: start = today - 3 months, end = today)
255
+ const l3mEnd = new Date(today);
256
+ const l3mStart = new Date(today);
257
+ l3mStart.setMonth(today.getMonth() - 3);
258
+ if (this.isSameDate(start, l3mStart) && this.isSameDate(end, l3mEnd))
259
+ return 'last3months';
260
+ // last6months (last 6 months including today: start = today - 6 months, end = today)
261
+ const l6mEnd = new Date(today);
262
+ const l6mStart = new Date(today);
263
+ l6mStart.setMonth(today.getMonth() - 6);
264
+ if (this.isSameDate(start, l6mStart) && this.isSameDate(end, l6mEnd))
265
+ return 'last6months';
266
+ // last1year (last 1 year including today: start = today - 1 year, end = today)
267
+ const l1yEnd = new Date(today);
268
+ const l1yStart = new Date(today);
269
+ l1yStart.setFullYear(today.getFullYear() - 1);
270
+ if (this.isSameDate(start, l1yStart) && this.isSameDate(end, l1yEnd))
271
+ return 'last1year';
272
+ return null;
273
+ }
274
+ clearDateRange() {
275
+ this.selectedDate = null;
276
+ this.dateRangeChange.emit(this.selectedDate);
277
+ this.selectedPreset = null;
278
+ this.customRangeMode = false;
279
+ this.modelDate = null;
280
+ }
281
+ resetAndClose() {
282
+ this.clearDateRange();
283
+ if (this.overlayPanel) {
284
+ try {
285
+ this.overlayPanel.hide();
286
+ }
287
+ catch (e) { }
288
+ }
289
+ }
290
+ clearAndStop(event) {
291
+ this.clearDateRange();
292
+ try {
293
+ this.overlayPanel?.hide();
294
+ }
295
+ catch (e) { }
296
+ event.stopPropagation();
297
+ }
298
+ toggleCustomRange() {
299
+ this.customRangeMode = !this.customRangeMode;
300
+ if (this.customRangeMode)
301
+ this.selectedPreset = 'custom';
302
+ }
303
+ applyCustomRange() {
304
+ // ensure external selectedDate is in sync with internal model
305
+ this.selectedDate = this.modelDate ? [...this.modelDate] : null;
306
+ this.dateRangeChange.emit(this.selectedDate);
307
+ if (this.overlayPanel) {
308
+ try {
309
+ this.overlayPanel.hide();
310
+ }
311
+ catch (e) { }
312
+ }
313
+ this.customRangeMode = false;
314
+ this.selectedPreset = 'custom';
315
+ }
316
+ getDateRangeLabel() {
317
+ // Check the internal model first to show real-time updates while selecting
318
+ const dateArray = this.modelDate || this.selectedDate;
319
+ if (!dateArray || !Array.isArray(dateArray))
320
+ return '';
321
+ const [start, end] = dateArray;
322
+ const arrow = '\u2794';
323
+ // Show just the first date with an arrow if only first date is selected
324
+ if (start && !end) {
325
+ const startStr = this.datePipe.transform(start, 'MM/dd/yyyy');
326
+ return `${startStr} ${arrow} `;
327
+ }
328
+ // Show the complete range if both dates are selected
329
+ if (start && end) {
330
+ const startStr = this.datePipe.transform(start, 'MM/dd/yyyy');
331
+ const endStr = this.datePipe.transform(end, 'MM/dd/yyyy');
332
+ return `${startStr} ${arrow} ${endStr}`;
333
+ }
334
+ return '';
335
+ }
336
+ applyPreset(preset) {
337
+ const today = new Date();
338
+ let start = null;
339
+ let end = null;
340
+ switch (preset) {
341
+ case 'today':
342
+ start = end = new Date(today.getFullYear(), today.getMonth(), today.getDate());
343
+ break;
344
+ case 'yesterday':
345
+ const y = new Date(today);
346
+ y.setDate(y.getDate() - 1);
347
+ start = end = new Date(y.getFullYear(), y.getMonth(), y.getDate());
348
+ break;
349
+ case 'last7days': {
350
+ end = new Date(today.getFullYear(), today.getMonth(), today.getDate());
351
+ start = new Date(end);
352
+ start.setDate(end.getDate() - 6);
353
+ break;
354
+ }
355
+ case 'last30days': {
356
+ end = new Date(today.getFullYear(), today.getMonth(), today.getDate());
357
+ start = new Date(end);
358
+ start.setDate(end.getDate() - 29);
359
+ break;
360
+ }
361
+ case 'last3months': {
362
+ end = new Date(today.getFullYear(), today.getMonth(), today.getDate());
363
+ start = new Date(end);
364
+ start.setMonth(end.getMonth() - 3);
365
+ break;
366
+ }
367
+ case 'last6months': {
368
+ end = new Date(today.getFullYear(), today.getMonth(), today.getDate());
369
+ start = new Date(end);
370
+ start.setMonth(end.getMonth() - 6);
371
+ break;
372
+ }
373
+ case 'last1year': {
374
+ end = new Date(today.getFullYear(), today.getMonth(), today.getDate());
375
+ start = new Date(end);
376
+ start.setFullYear(end.getFullYear() - 1);
377
+ break;
378
+ }
379
+ default:
380
+ break;
381
+ }
382
+ if (start && end) {
383
+ this.selectedDate = [start, end];
384
+ this.modelDate = [start, end];
385
+ if (this.preservePreset) {
386
+ this.selectedDate = [start, end, { presets: preset }];
387
+ }
388
+ this.dateRangeChange.emit(this.selectedDate);
389
+ this.selectedPreset = preset;
390
+ this.customRangeMode = false;
391
+ }
392
+ try {
393
+ this.overlayPanel?.hide();
394
+ }
395
+ catch (e) { }
396
+ // ensure we update start/end classes after applying a preset
397
+ this._scheduleUpdate();
398
+ }
399
+ onDateRangeChange(dateRange) {
400
+ this.dateRangeChange.emit(dateRange);
401
+ if (dateRange && Array.isArray(dateRange)) {
402
+ this.selectedPreset = this.detectPreset(dateRange[0], dateRange[1]);
403
+ this.customRangeMode = false;
404
+ }
405
+ else if (!dateRange) {
406
+ this.selectedPreset = null;
407
+ this.customRangeMode = false;
408
+ }
409
+ this._scheduleUpdate();
410
+ }
411
+ ngOnDestroy() {
412
+ this._stopCalendarObservers();
413
+ this._cancelScheduledUpdate();
414
+ }
415
+ // Walk the rendered calendar DOM(s) (overlay + inline) and add start-range/end-range classes
416
+ _updateStartEndRangeClasses() {
417
+ try {
418
+ const calendarElements = this._getCalendarElements();
419
+ calendarElements.forEach((calEl) => {
420
+ // Remove existing classes from spans first
421
+ const allSpans = calEl.querySelectorAll('td > span');
422
+ allSpans.forEach((span) => {
423
+ this.renderer.removeClass(span, 'start-range');
424
+ this.renderer.removeClass(span, 'end-range');
425
+ this.renderer.removeClass(span, 'between-range');
426
+ });
427
+ // Collect span/date pairs, prefer data-date attribute
428
+ // Cache header month/year for this calendar to avoid querying per-span
429
+ const panelNode = calEl.closest('.p-datepicker') || calEl;
430
+ const headerMonthNode = panelNode.querySelector('.p-datepicker-header .p-datepicker-title .p-datepicker-month');
431
+ const headerYearNode = panelNode.querySelector('.p-datepicker-header .p-datepicker-title .p-datepicker-year');
432
+ const headerMonthIdx = headerMonthNode && headerMonthNode.textContent
433
+ ? (this.enLocale.monthNames || []).indexOf(headerMonthNode.textContent.trim())
434
+ : NaN;
435
+ const headerYearVal = headerYearNode && headerYearNode.textContent
436
+ ? parseInt(headerYearNode.textContent.trim(), 10)
437
+ : NaN;
438
+ const items = [];
439
+ const spans = calEl.querySelectorAll('td > span.p-highlight');
440
+ spans.forEach((span) => {
441
+ const td = span.closest('td');
442
+ // Try to read data-date attribute, which some PrimeNG versions render on span/td
443
+ let dataDate = span.getAttribute('data-date');
444
+ if (!dataDate && td)
445
+ dataDate = td.getAttribute('data-date');
446
+ if (dataDate) {
447
+ const parts = dataDate.split('-').map((p) => parseInt(p, 10));
448
+ if (parts.length >= 3 && parts.every((n) => !isNaN(n))) {
449
+ const [y, m, d] = parts;
450
+ const dt = new Date(y, m - 1, d);
451
+ items.push({ dt, td, span });
452
+ return;
453
+ }
454
+ }
455
+ // Fallback: parse day number and infer month/year from nearby header in the same .p-datepicker
456
+ const dayText = (span.textContent || '').trim();
457
+ const day = parseInt(dayText, 10);
458
+ if (!isNaN(day) && td) {
459
+ // Use cached header month/year when available
460
+ if (!isNaN(headerMonthIdx) && !isNaN(headerYearVal)) {
461
+ const dt = new Date(headerYearVal, headerMonthIdx, day);
462
+ items.push({ dt, td, span });
463
+ return;
464
+ }
465
+ }
466
+ // last resort: ignore span if date cannot be determined
467
+ });
468
+ if (items.length === 0)
469
+ return;
470
+ // Sort items to find min/max (start & end)
471
+ items.sort((a, b) => a.dt.getTime() - b.dt.getTime());
472
+ const detectedStart = items[0].dt;
473
+ const detectedEnd = items[items.length - 1].dt;
474
+ // Preferred range is modelDate/selectedDate if present
475
+ const range = this.selectedDate && this.selectedDate.length === 2
476
+ ? this.selectedDate
477
+ : this.modelDate && this.modelDate.length === 2
478
+ ? this.modelDate
479
+ : [detectedStart, detectedEnd];
480
+ const startDate = range && range[0]
481
+ ? this.normalizeDate(range[0])
482
+ : detectedStart;
483
+ const endDate = range && range[1]
484
+ ? this.normalizeDate(range[1])
485
+ : detectedEnd;
486
+ // For each item, add start-range,end-range, or between-range based on date
487
+ const sTime = startDate.getTime();
488
+ const eTime = endDate.getTime();
489
+ for (const it of items) {
490
+ const t = it.dt.getTime();
491
+ if (sTime === eTime && t === sTime) {
492
+ // single-day range, mark both start & end
493
+ this.renderer.addClass(it.span, 'start-range');
494
+ this.renderer.addClass(it.span, 'end-range');
495
+ }
496
+ else if (t === sTime) {
497
+ this.renderer.addClass(it.span, 'start-range');
498
+ }
499
+ else if (t === eTime) {
500
+ this.renderer.addClass(it.span, 'end-range');
501
+ }
502
+ else if (t > sTime && t < eTime) {
503
+ this.renderer.addClass(it.span, 'between-range');
504
+ }
505
+ }
506
+ });
507
+ }
508
+ catch (e) {
509
+ // ignore DOM errors (e.g., server-side rendering / missing elements)
510
+ }
511
+ }
512
+ isoDate(d) {
513
+ const y = d.getFullYear();
514
+ const m = String(d.getMonth() + 1).padStart(2, '0');
515
+ const day = String(d.getDate()).padStart(2, '0');
516
+ return `${y}-${m}-${day}`;
517
+ }
518
+ _findElementByDate(date) {
519
+ if (!date)
520
+ return undefined;
521
+ const y = date.getFullYear();
522
+ const m = date.getMonth() + 1; // 1..12
523
+ const d = date.getDate();
524
+ const isoUnpadded = `${y}-${m}-${d}`; // e.g. 2025-11-1
525
+ const isoPadded = `${y}-${String(m).padStart(2, '0')}-${String(d).padStart(2, '0')}`; // 2025-11-01
526
+ const selectors = [
527
+ `[data-date="${isoUnpadded}"]`,
528
+ `[data-date="${isoPadded}"]`,
529
+ ];
530
+ for (const sel of selectors) {
531
+ const foundInOverlay = document.querySelector(`.atomix-overlay-calendar ${sel}`);
532
+ if (foundInOverlay)
533
+ return (foundInOverlay.closest('td') || foundInOverlay);
534
+ }
535
+ for (const sel of selectors) {
536
+ const found = document.querySelector(sel);
537
+ if (found)
538
+ return found.closest('td') || found;
539
+ }
540
+ return undefined;
541
+ }
542
+ _startCalendarObservers() {
543
+ // stop first to avoid duplicates
544
+ this._stopCalendarObservers();
545
+ try {
546
+ const calEls = this._getCalendarElements();
547
+ try {
548
+ const panel = this.overlayPanel;
549
+ if (panel && panel.el && panel.el.nativeElement) {
550
+ const el = panel.el.nativeElement.querySelector('.p-datepicker');
551
+ if (el)
552
+ calEls.push(el);
553
+ }
554
+ }
555
+ catch (e) { }
556
+ calEls.forEach((el) => {
557
+ const obs = new MutationObserver(() => {
558
+ // Reapply classes after DOM changes (debounced)
559
+ this._scheduleUpdate();
560
+ });
561
+ // Watch childList, subtree and class attribute changes (span class toggles are common)
562
+ obs.observe(el, {
563
+ childList: true,
564
+ subtree: true,
565
+ attributes: true,
566
+ attributeFilter: ['class'],
567
+ });
568
+ this._calendarObservers.push(obs);
569
+ this._observedElements.push(el);
570
+ // Also observe parent - if PrimeNG replaces the .p-datepicker element, parent childList changes will fire
571
+ const parent = el.parentElement;
572
+ if (parent && this._observedParentElements.indexOf(parent) === -1) {
573
+ const parentObs = new MutationObserver(() => {
574
+ // reattach observers since the calEl may have been replaced
575
+ this._scheduleUpdate();
576
+ // detach and re-attach observers after DOM settles
577
+ setTimeout(() => {
578
+ try {
579
+ this._stopCalendarObservers();
580
+ this._startCalendarObservers();
581
+ }
582
+ catch (e) { }
583
+ }, 100); // slightly larger delay to let PrimeNG finish the month rendering
584
+ });
585
+ parentObs.observe(parent, { childList: true, subtree: false });
586
+ this._parentObservers.push(parentObs);
587
+ this._observedParentElements.push(parent);
588
+ }
589
+ });
590
+ }
591
+ catch (e) {
592
+ // ignore
593
+ }
594
+ }
595
+ _stopCalendarObservers() {
596
+ try {
597
+ this._calendarObservers.forEach((obs) => obs.disconnect());
598
+ this._parentObservers.forEach((obs) => obs.disconnect());
599
+ }
600
+ catch (e) { }
601
+ this._calendarObservers = [];
602
+ this._observedElements = [];
603
+ this._parentObservers = [];
604
+ this._observedParentElements = [];
605
+ }
606
+ _scheduleUpdate() {
607
+ if (this._updateRafId != null)
608
+ return; // already scheduled
609
+ this._updateRafId = window.requestAnimationFrame(() => {
610
+ this._updateRafId = null;
611
+ this._updateStartEndRangeClasses();
612
+ });
613
+ }
614
+ _cancelScheduledUpdate() {
615
+ if (this._updateRafId != null) {
616
+ window.cancelAnimationFrame(this._updateRafId);
617
+ this._updateRafId = null;
618
+ }
619
+ }
620
+ _getCalendarElements() {
621
+ const calEls = [];
622
+ const overlayCal = document.querySelector('.atomix-overlay-calendar .p-datepicker');
623
+ const inlineCal = document.querySelector('.inline-calendar .p-datepicker');
624
+ if (overlayCal)
625
+ calEls.push(overlayCal);
626
+ if (inlineCal)
627
+ calEls.push(inlineCal);
628
+ try {
629
+ const panel = this.overlayPanel;
630
+ if (panel && panel.el && panel.el.nativeElement) {
631
+ const el = panel.el.nativeElement.querySelector('.p-datepicker');
632
+ if (el)
633
+ calEls.push(el);
634
+ }
635
+ }
636
+ catch (e) { }
637
+ // remove duplicates
638
+ return Array.from(new Set(calEls));
639
+ }
640
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AtomixDaterangeCalendarComponent, deps: [{ token: i1.DatePipe }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
641
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AtomixDaterangeCalendarComponent, selector: "atomix-daterange-calendar", inputs: { placeholder: "placeholder", styleClass: "styleClass", selectionMode: "selectionMode", inputStyleClass: "inputStyleClass", inline: "inline", disabled: "disabled", selectedDate: "selectedDate", maxDate: "maxDate", minDate: "minDate", defaultPreset: "defaultPreset", preservePreset: "preservePreset" }, outputs: { dateRangeChange: "dateRangeChange" }, viewQueries: [{ propertyName: "overlayPanel", first: true, predicate: ["overlayPanel"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div>\r\n <ng-container *ngIf=\"!inline; else inlineBlock\">\r\n <div [ngClass]=\"styleClass\" class=\"input-wrapper\">\r\n <input\r\n pInputText\r\n type=\"text\"\r\n [ngClass]=\"inputStyleClass\"\r\n [placeholder]=\"placeholder\"\r\n [value]=\"getDateRangeLabel()\"\r\n readonly\r\n [disabled]=\"disabled\"\r\n (click)=\"overlayPanel?.toggle($event)\"\r\n (keydown)=\"onInputKeyDown($event)\"\r\n />\r\n <i\r\n class=\"pi pi-calendar input-icon\"\r\n title=\"Open calendar\"\r\n (click)=\"!disabled && overlayPanel?.toggle($event)\"\r\n ></i>\r\n <i\r\n *ngIf=\"hasSelection\"\r\n class=\"pi pi-times input-clear-icon\"\r\n title=\"Clear\"\r\n tabindex=\"0\"\r\n (click)=\"!disabled && clearAndStop($event)\"\r\n (keydown.enter)=\"!disabled && clearAndStop($event)\"\r\n (keydown.space)=\"!disabled && clearAndStop($event)\"\r\n ></i>\r\n </div>\r\n\r\n <p-overlayPanel\r\n #overlayPanel\r\n [dismissable]=\"true\"\r\n appendTo=\"body\"\r\n styleClass=\"atomix-date-range-overlay\"\r\n (onShow)=\"onOverlayShow()\"\r\n (onHide)=\"onOverlayHide()\"\r\n >\r\n <div class=\"overlay-inner\">\r\n <div class=\"overlay-left\">\r\n <div class=\"preset-list\">\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('today')\"\r\n [ngClass]=\"{ active: selectedPreset === 'today' }\"\r\n label=\"Today\"\r\n ></button>\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('yesterday')\"\r\n [ngClass]=\"{ active: selectedPreset === 'yesterday' }\"\r\n label=\"Yesterday\"\r\n ></button>\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('last7days')\"\r\n [ngClass]=\"{ active: selectedPreset === 'last7days' }\"\r\n label=\"Last 7 days\"\r\n ></button>\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('last30days')\"\r\n [ngClass]=\"{ active: selectedPreset === 'last30days' }\"\r\n label=\"Last 30 days\"\r\n ></button>\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('last3months')\"\r\n [ngClass]=\"{ active: selectedPreset === 'last3months' }\"\r\n label=\"Last 3 months\"\r\n ></button>\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('last6months')\"\r\n [ngClass]=\"{ active: selectedPreset === 'last6months' }\"\r\n label=\"Last 6 months\"\r\n ></button>\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('last1year')\"\r\n [ngClass]=\"{ active: selectedPreset === 'last1year' }\"\r\n label=\"Last 1 year\"\r\n ></button>\r\n <a class=\"reset-link\" (click)=\"resetAndClose()\">Reset</a>\r\n </div>\r\n </div>\r\n <div class=\"overlay-right\">\r\n <p-calendar\r\n [(ngModel)]=\"modelDate\"\r\n [selectionMode]=\"'range'\"\r\n [inline]=\"true\"\r\n [dateFormat]=\"'mm/dd/yyyy'\"\r\n [showOtherMonths]=\"true\"\r\n [locale]=\"enLocale\"\r\n [showIcon]=\"false\"\r\n [styleClass]=\"'atomix-overlay-calendar'\"\r\n (ngModelChange)=\"onModelChange($event)\"\r\n (onMonthChange)=\"onCalendarViewChanged($event)\"\r\n (onYearChange)=\"onCalendarViewChanged($event)\"\r\n [disabled]=\"disabled\"\r\n [maxDate]=\"maxDate\"\r\n [minDate]=\"minDate\"\r\n ></p-calendar>\r\n </div>\r\n </div>\r\n </p-overlayPanel>\r\n </ng-container>\r\n\r\n <ng-template #inlineBlock>\r\n <div [ngClass]=\"styleClass\" class=\"input-wrapper\">\r\n <input\r\n pInputText\r\n type=\"text\"\r\n [ngClass]=\"inputStyleClass\"\r\n [placeholder]=\"placeholder\"\r\n [value]=\"getDateRangeLabel()\"\r\n readonly\r\n [disabled]=\"disabled\"\r\n (keydown)=\"onInputKeyDown($event)\"\r\n />\r\n <i class=\"pi pi-calendar input-icon\" title=\"Open calendar\"></i>\r\n <i\r\n *ngIf=\"hasSelection\"\r\n class=\"pi pi-times input-clear-icon\"\r\n title=\"Clear\"\r\n tabindex=\"0\"\r\n (click)=\"clearAndStop($event)\"\r\n (keydown.enter)=\"clearAndStop($event)\"\r\n (keydown.space)=\"clearAndStop($event)\"\r\n ></i>\r\n </div>\r\n <div class=\"overlay-inner inline-calendar flex\">\r\n <div class=\"overlay-left\">\r\n <div class=\"preset-list\">\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('today')\"\r\n [ngClass]=\"{ active: selectedPreset === 'today' }\"\r\n label=\"Today\"\r\n ></button>\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('yesterday')\"\r\n [ngClass]=\"{ active: selectedPreset === 'yesterday' }\"\r\n label=\"Yesterday\"\r\n ></button>\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('last7days')\"\r\n [ngClass]=\"{ active: selectedPreset === 'last7days' }\"\r\n label=\"Last 7 days\"\r\n ></button>\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('last30days')\"\r\n [ngClass]=\"{ active: selectedPreset === 'last30days' }\"\r\n label=\"Last 30 days\"\r\n ></button>\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('last3months')\"\r\n [ngClass]=\"{ active: selectedPreset === 'last3months' }\"\r\n label=\"Last 3 months\"\r\n ></button>\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('last1year')\"\r\n [ngClass]=\"{ active: selectedPreset === 'last1year' }\"\r\n label=\"Last 1 year\"\r\n ></button>\r\n <a class=\"reset-link\" (click)=\"resetAndClose()\">Reset</a>\r\n </div>\r\n </div>\r\n <div class=\"overlay-right\">\r\n <p-calendar\r\n [(ngModel)]=\"modelDate\"\r\n [selectionMode]=\"'range'\"\r\n [inline]=\"true\"\r\n [dateFormat]=\"'mm/dd/yyyy'\"\r\n [showOtherMonths]=\"true\"\r\n [locale]=\"enLocale\"\r\n [showIcon]=\"false\"\r\n [styleClass]=\"'atomix-overlay-calendar'\"\r\n (ngModelChange)=\"onModelChange($event)\"\r\n (onMonthChange)=\"onCalendarViewChanged($event)\"\r\n (onYearChange)=\"onCalendarViewChanged($event)\"\r\n [disabled]=\"disabled\"\r\n [maxDate]=\"maxDate\"\r\n [minDate]=\"minDate\"\r\n ></p-calendar>\r\n </div>\r\n </div>\r\n </ng-template>\r\n</div>\r\n", styles: ["::ng-deep .p-calendar button{background-color:transparent!important}::ng-deep .p-overlaypanel .p-overlaypanel-content{margin-top:0!important}::ng-deep .p-datepicker{border:none!important;border-radius:var(--global-border-radius)}::ng-deep .p-datepicker .p-datepicker-header .p-datepicker-title .p-datepicker-month{color:#63b77e;transition:background-color .2s,color .2s,box-shadow .2s;font-weight:600;padding:.5rem}::ng-deep .p-datepicker .p-datepicker-header .p-datepicker-title .p-datepicker-year,::ng-deep .p-datepicker .p-datepicker-header .p-datepicker-title .p-datepicker-month{color:#63b77e;transition:background-color .2s,color .2s,box-shadow .2s;font-weight:600;padding:.5rem}::ng-deep .p-datepicker .p-monthpicker .p-monthpicker-month.p-highlight{color:#fff;background:#63c984;padding:1rem!important}::ng-deep .p-datepicker .p-monthpicker .p-monthpicker-month{padding:1rem!important}::ng-deep .p-datepicker .p-yearpicker .p-yearpicker-year.p-highlight{color:#fff;background:#63b77e;padding:1rem!important}::ng-deep .p-datepicker .p-yearpicker .p-yearpicker-year{padding:1rem!important}::ng-deep .p-datepicker table th{border-bottom:1px solid rgba(0,0,0,.12);color:var(--text-gray-700);font-weight:400;font-size:.875rem}::ng-deep .p-datepicker table td>span.p-highlight{color:#fff;background:#63c984}::ng-deep .p-datepicker table td{padding:.2rem 0}::ng-deep .p-datepicker table td>span{width:2.8rem;height:2.8rem;border-radius:0%;transition:none}::ng-deep .p-datepicker table td.p-datepicker-today>span{box-shadow:inset 0 0 0 2px #00000061}::ng-deep .p-datepicker table td>span.p-highlight.start-range{border-top-left-radius:10px;border-bottom-left-radius:10px}::ng-deep .p-datepicker table td>span.p-highlight.end-range{border-top-right-radius:10px;border-bottom-right-radius:10px}::ng-deep .p-datepicker table td>span.p-highlight.between-range{background:#00c37dad!important}::ng-deep .p-monthpicker-month{width:50%!important}::ng-deep .p-yearpicker-year{width:50%!important}::ng-deep .inline-calendar .p-datepicker table td>span{width:2.4rem;height:2.4rem}::ng-deep .inline-calendar{border-bottom:1px solid #e5e5e5}::ng-deep .atomix-date-range-overlay{border-radius:var(--global-border-radius)}.overlay-inner{display:flex;gap:1rem;align-items:flex-start;flex-wrap:nowrap}.overlay-left{padding:.75rem .75rem 2rem;text-align:center;border-right:1px solid #e5e5e5}.inline-calendar .overlay-left{padding-bottom:2rem}.input-wrapper{display:flex;align-items:center;gap:.5rem;position:relative}.input-wrapper input[readonly]{cursor:pointer;padding-right:40px!important;border-radius:var(--global-border-radius)}.input-wrapper input{color:#000000de}.input-wrapper input::placeholder{color:#0009}.input-icon{cursor:pointer;color:var(--primary-text-color)!important;position:absolute;right:10px}.input-clear-icon{cursor:pointer;color:var(--primary-text-color)!important;position:absolute;right:27px}.preset-list{display:flex;flex-direction:column;gap:0}.preset-btn{justify-content:flex-start;text-align:left;padding-left:8px}.inline-calendar .preset-btn{padding:.3rem .8rem!important}.inline-calendar{gap:0}.preset-btn .p-button-label{display:inline-block}.preset-btn:not(.p-button-outlined){background-color:transparent;color:var(--text-gray-700);border-radius:var(--global-border-radius)}.preset-btn:hover{background-color:#63b77e}.preset-btn.active,.preset-btn.p-button.active,.preset-btn.custom-active,.preset-btn.p-button.custom-active{background-color:#63b77e!important;color:#fff!important;font-weight:700;line-height:17px;border-radius:var(--global-border-radius)}.reset-link{text-align:left;cursor:pointer;margin-top:10px;padding:.3rem 1.4rem!important;color:#63b77e;font-weight:600}.atomix-date-range-overlay .overlay-left .reset-link{display:inline-block;margin-top:1rem;color:#2196f3;cursor:pointer}.overlay-right{flex:1;width:230px;max-width:230px}.overlay-inner.inline{flex-direction:row}:host ::ng-deep .p-column-filter-menu .overlay-inner.inline{display:flex!important;flex-direction:row!important;flex-wrap:nowrap!important}:host ::ng-deep .p-overlaypanel .overlay-inner.inline{display:flex!important;flex-direction:row!important}.overlay-actions{display:flex;gap:.5rem;justify-content:flex-end;margin-top:.5rem}.atomix-overlay-calendar ::ng-deep .p-datepicker{width:100%}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "directive", type: i3.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "component", type: i4.Calendar, selector: "p-calendar", inputs: ["iconDisplay", "style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "ariaLabel", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepYearPicker", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "startWeekFromFirstDayOfYear", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autofocus", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "variant", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale", "view", "defaultDate"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "component", type: i5.OverlayPanel, selector: "p-overlayPanel", inputs: ["ariaLabel", "ariaLabelledBy", "dismissable", "showCloseIcon", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "focusOnShow", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide"] }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
642
+ }
643
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AtomixDaterangeCalendarComponent, decorators: [{
644
+ type: Component,
645
+ args: [{ selector: 'atomix-daterange-calendar', template: "<div>\r\n <ng-container *ngIf=\"!inline; else inlineBlock\">\r\n <div [ngClass]=\"styleClass\" class=\"input-wrapper\">\r\n <input\r\n pInputText\r\n type=\"text\"\r\n [ngClass]=\"inputStyleClass\"\r\n [placeholder]=\"placeholder\"\r\n [value]=\"getDateRangeLabel()\"\r\n readonly\r\n [disabled]=\"disabled\"\r\n (click)=\"overlayPanel?.toggle($event)\"\r\n (keydown)=\"onInputKeyDown($event)\"\r\n />\r\n <i\r\n class=\"pi pi-calendar input-icon\"\r\n title=\"Open calendar\"\r\n (click)=\"!disabled && overlayPanel?.toggle($event)\"\r\n ></i>\r\n <i\r\n *ngIf=\"hasSelection\"\r\n class=\"pi pi-times input-clear-icon\"\r\n title=\"Clear\"\r\n tabindex=\"0\"\r\n (click)=\"!disabled && clearAndStop($event)\"\r\n (keydown.enter)=\"!disabled && clearAndStop($event)\"\r\n (keydown.space)=\"!disabled && clearAndStop($event)\"\r\n ></i>\r\n </div>\r\n\r\n <p-overlayPanel\r\n #overlayPanel\r\n [dismissable]=\"true\"\r\n appendTo=\"body\"\r\n styleClass=\"atomix-date-range-overlay\"\r\n (onShow)=\"onOverlayShow()\"\r\n (onHide)=\"onOverlayHide()\"\r\n >\r\n <div class=\"overlay-inner\">\r\n <div class=\"overlay-left\">\r\n <div class=\"preset-list\">\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('today')\"\r\n [ngClass]=\"{ active: selectedPreset === 'today' }\"\r\n label=\"Today\"\r\n ></button>\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('yesterday')\"\r\n [ngClass]=\"{ active: selectedPreset === 'yesterday' }\"\r\n label=\"Yesterday\"\r\n ></button>\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('last7days')\"\r\n [ngClass]=\"{ active: selectedPreset === 'last7days' }\"\r\n label=\"Last 7 days\"\r\n ></button>\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('last30days')\"\r\n [ngClass]=\"{ active: selectedPreset === 'last30days' }\"\r\n label=\"Last 30 days\"\r\n ></button>\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('last3months')\"\r\n [ngClass]=\"{ active: selectedPreset === 'last3months' }\"\r\n label=\"Last 3 months\"\r\n ></button>\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('last6months')\"\r\n [ngClass]=\"{ active: selectedPreset === 'last6months' }\"\r\n label=\"Last 6 months\"\r\n ></button>\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('last1year')\"\r\n [ngClass]=\"{ active: selectedPreset === 'last1year' }\"\r\n label=\"Last 1 year\"\r\n ></button>\r\n <a class=\"reset-link\" (click)=\"resetAndClose()\">Reset</a>\r\n </div>\r\n </div>\r\n <div class=\"overlay-right\">\r\n <p-calendar\r\n [(ngModel)]=\"modelDate\"\r\n [selectionMode]=\"'range'\"\r\n [inline]=\"true\"\r\n [dateFormat]=\"'mm/dd/yyyy'\"\r\n [showOtherMonths]=\"true\"\r\n [locale]=\"enLocale\"\r\n [showIcon]=\"false\"\r\n [styleClass]=\"'atomix-overlay-calendar'\"\r\n (ngModelChange)=\"onModelChange($event)\"\r\n (onMonthChange)=\"onCalendarViewChanged($event)\"\r\n (onYearChange)=\"onCalendarViewChanged($event)\"\r\n [disabled]=\"disabled\"\r\n [maxDate]=\"maxDate\"\r\n [minDate]=\"minDate\"\r\n ></p-calendar>\r\n </div>\r\n </div>\r\n </p-overlayPanel>\r\n </ng-container>\r\n\r\n <ng-template #inlineBlock>\r\n <div [ngClass]=\"styleClass\" class=\"input-wrapper\">\r\n <input\r\n pInputText\r\n type=\"text\"\r\n [ngClass]=\"inputStyleClass\"\r\n [placeholder]=\"placeholder\"\r\n [value]=\"getDateRangeLabel()\"\r\n readonly\r\n [disabled]=\"disabled\"\r\n (keydown)=\"onInputKeyDown($event)\"\r\n />\r\n <i class=\"pi pi-calendar input-icon\" title=\"Open calendar\"></i>\r\n <i\r\n *ngIf=\"hasSelection\"\r\n class=\"pi pi-times input-clear-icon\"\r\n title=\"Clear\"\r\n tabindex=\"0\"\r\n (click)=\"clearAndStop($event)\"\r\n (keydown.enter)=\"clearAndStop($event)\"\r\n (keydown.space)=\"clearAndStop($event)\"\r\n ></i>\r\n </div>\r\n <div class=\"overlay-inner inline-calendar flex\">\r\n <div class=\"overlay-left\">\r\n <div class=\"preset-list\">\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('today')\"\r\n [ngClass]=\"{ active: selectedPreset === 'today' }\"\r\n label=\"Today\"\r\n ></button>\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('yesterday')\"\r\n [ngClass]=\"{ active: selectedPreset === 'yesterday' }\"\r\n label=\"Yesterday\"\r\n ></button>\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('last7days')\"\r\n [ngClass]=\"{ active: selectedPreset === 'last7days' }\"\r\n label=\"Last 7 days\"\r\n ></button>\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('last30days')\"\r\n [ngClass]=\"{ active: selectedPreset === 'last30days' }\"\r\n label=\"Last 30 days\"\r\n ></button>\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('last3months')\"\r\n [ngClass]=\"{ active: selectedPreset === 'last3months' }\"\r\n label=\"Last 3 months\"\r\n ></button>\r\n <button\r\n pButton\r\n pRipple\r\n type=\"button\"\r\n class=\"preset-btn\"\r\n (click)=\"applyPreset('last1year')\"\r\n [ngClass]=\"{ active: selectedPreset === 'last1year' }\"\r\n label=\"Last 1 year\"\r\n ></button>\r\n <a class=\"reset-link\" (click)=\"resetAndClose()\">Reset</a>\r\n </div>\r\n </div>\r\n <div class=\"overlay-right\">\r\n <p-calendar\r\n [(ngModel)]=\"modelDate\"\r\n [selectionMode]=\"'range'\"\r\n [inline]=\"true\"\r\n [dateFormat]=\"'mm/dd/yyyy'\"\r\n [showOtherMonths]=\"true\"\r\n [locale]=\"enLocale\"\r\n [showIcon]=\"false\"\r\n [styleClass]=\"'atomix-overlay-calendar'\"\r\n (ngModelChange)=\"onModelChange($event)\"\r\n (onMonthChange)=\"onCalendarViewChanged($event)\"\r\n (onYearChange)=\"onCalendarViewChanged($event)\"\r\n [disabled]=\"disabled\"\r\n [maxDate]=\"maxDate\"\r\n [minDate]=\"minDate\"\r\n ></p-calendar>\r\n </div>\r\n </div>\r\n </ng-template>\r\n</div>\r\n", styles: ["::ng-deep .p-calendar button{background-color:transparent!important}::ng-deep .p-overlaypanel .p-overlaypanel-content{margin-top:0!important}::ng-deep .p-datepicker{border:none!important;border-radius:var(--global-border-radius)}::ng-deep .p-datepicker .p-datepicker-header .p-datepicker-title .p-datepicker-month{color:#63b77e;transition:background-color .2s,color .2s,box-shadow .2s;font-weight:600;padding:.5rem}::ng-deep .p-datepicker .p-datepicker-header .p-datepicker-title .p-datepicker-year,::ng-deep .p-datepicker .p-datepicker-header .p-datepicker-title .p-datepicker-month{color:#63b77e;transition:background-color .2s,color .2s,box-shadow .2s;font-weight:600;padding:.5rem}::ng-deep .p-datepicker .p-monthpicker .p-monthpicker-month.p-highlight{color:#fff;background:#63c984;padding:1rem!important}::ng-deep .p-datepicker .p-monthpicker .p-monthpicker-month{padding:1rem!important}::ng-deep .p-datepicker .p-yearpicker .p-yearpicker-year.p-highlight{color:#fff;background:#63b77e;padding:1rem!important}::ng-deep .p-datepicker .p-yearpicker .p-yearpicker-year{padding:1rem!important}::ng-deep .p-datepicker table th{border-bottom:1px solid rgba(0,0,0,.12);color:var(--text-gray-700);font-weight:400;font-size:.875rem}::ng-deep .p-datepicker table td>span.p-highlight{color:#fff;background:#63c984}::ng-deep .p-datepicker table td{padding:.2rem 0}::ng-deep .p-datepicker table td>span{width:2.8rem;height:2.8rem;border-radius:0%;transition:none}::ng-deep .p-datepicker table td.p-datepicker-today>span{box-shadow:inset 0 0 0 2px #00000061}::ng-deep .p-datepicker table td>span.p-highlight.start-range{border-top-left-radius:10px;border-bottom-left-radius:10px}::ng-deep .p-datepicker table td>span.p-highlight.end-range{border-top-right-radius:10px;border-bottom-right-radius:10px}::ng-deep .p-datepicker table td>span.p-highlight.between-range{background:#00c37dad!important}::ng-deep .p-monthpicker-month{width:50%!important}::ng-deep .p-yearpicker-year{width:50%!important}::ng-deep .inline-calendar .p-datepicker table td>span{width:2.4rem;height:2.4rem}::ng-deep .inline-calendar{border-bottom:1px solid #e5e5e5}::ng-deep .atomix-date-range-overlay{border-radius:var(--global-border-radius)}.overlay-inner{display:flex;gap:1rem;align-items:flex-start;flex-wrap:nowrap}.overlay-left{padding:.75rem .75rem 2rem;text-align:center;border-right:1px solid #e5e5e5}.inline-calendar .overlay-left{padding-bottom:2rem}.input-wrapper{display:flex;align-items:center;gap:.5rem;position:relative}.input-wrapper input[readonly]{cursor:pointer;padding-right:40px!important;border-radius:var(--global-border-radius)}.input-wrapper input{color:#000000de}.input-wrapper input::placeholder{color:#0009}.input-icon{cursor:pointer;color:var(--primary-text-color)!important;position:absolute;right:10px}.input-clear-icon{cursor:pointer;color:var(--primary-text-color)!important;position:absolute;right:27px}.preset-list{display:flex;flex-direction:column;gap:0}.preset-btn{justify-content:flex-start;text-align:left;padding-left:8px}.inline-calendar .preset-btn{padding:.3rem .8rem!important}.inline-calendar{gap:0}.preset-btn .p-button-label{display:inline-block}.preset-btn:not(.p-button-outlined){background-color:transparent;color:var(--text-gray-700);border-radius:var(--global-border-radius)}.preset-btn:hover{background-color:#63b77e}.preset-btn.active,.preset-btn.p-button.active,.preset-btn.custom-active,.preset-btn.p-button.custom-active{background-color:#63b77e!important;color:#fff!important;font-weight:700;line-height:17px;border-radius:var(--global-border-radius)}.reset-link{text-align:left;cursor:pointer;margin-top:10px;padding:.3rem 1.4rem!important;color:#63b77e;font-weight:600}.atomix-date-range-overlay .overlay-left .reset-link{display:inline-block;margin-top:1rem;color:#2196f3;cursor:pointer}.overlay-right{flex:1;width:230px;max-width:230px}.overlay-inner.inline{flex-direction:row}:host ::ng-deep .p-column-filter-menu .overlay-inner.inline{display:flex!important;flex-direction:row!important;flex-wrap:nowrap!important}:host ::ng-deep .p-overlaypanel .overlay-inner.inline{display:flex!important;flex-direction:row!important}.overlay-actions{display:flex;gap:.5rem;justify-content:flex-end;margin-top:.5rem}.atomix-overlay-calendar ::ng-deep .p-datepicker{width:100%}\n"] }]
646
+ }], ctorParameters: () => [{ type: i1.DatePipe }, { type: i0.Renderer2 }], propDecorators: { placeholder: [{
647
+ type: Input
648
+ }], styleClass: [{
649
+ type: Input
650
+ }], selectionMode: [{
651
+ type: Input
652
+ }], inputStyleClass: [{
653
+ type: Input
654
+ }], inline: [{
655
+ type: Input
656
+ }], disabled: [{
657
+ type: Input
658
+ }], selectedDate: [{
659
+ type: Input
660
+ }], maxDate: [{
661
+ type: Input
662
+ }], minDate: [{
663
+ type: Input
664
+ }], defaultPreset: [{
665
+ type: Input
666
+ }], preservePreset: [{
667
+ type: Input
668
+ }], overlayPanel: [{
669
+ type: ViewChild,
670
+ args: ['overlayPanel']
671
+ }], dateRangeChange: [{
672
+ type: Output
673
+ }] } });
674
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRvbWl4LWRhdGVyYW5nZS1jYWxlbmRhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wcmltZWtpdC9zcmMvbGliL2xpYi9hdG9taXgtZGF0ZXJhbmdlLWNhbGVuZGFyL2F0b21peC1kYXRlcmFuZ2UtY2FsZW5kYXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcHJpbWVraXQvc3JjL2xpYi9saWIvYXRvbWl4LWRhdGVyYW5nZS1jYWxlbmRhci9hdG9taXgtZGF0ZXJhbmdlLWNhbGVuZGFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBQ04sU0FBUyxHQU1WLE1BQU0sZUFBZSxDQUFDOzs7Ozs7OztBQVN2QixNQUFNLE9BQU8sZ0NBQWdDO0lBc0ZqQztJQUNBO0lBcEZELFdBQVcsR0FBVyxFQUFFLENBQUM7SUFDekIsVUFBVSxHQUFXLEVBQUUsQ0FBQztJQUN4QixhQUFhLEdBQVksT0FBTyxDQUFDO0lBQ2pDLGVBQWUsR0FBVyxFQUFFLENBQUM7SUFDN0IsTUFBTSxHQUFZLEtBQUssQ0FBQztJQUN4QixRQUFRLEdBQVksS0FBSyxDQUFDO0lBQzFCLFlBQVksR0FBUSxJQUFJLENBQUM7SUFDekIsT0FBTyxDQUFRO0lBQ2YsT0FBTyxDQUFRO0lBQ2YsYUFBYSxHQVFYLElBQUksQ0FBQztJQUNQLGNBQWMsR0FBWSxLQUFLLENBQUM7SUFFekMsZUFBZSxHQUFZLEtBQUssQ0FBQztJQUNqQyxjQUFjLEdBQWtCLElBQUksQ0FBQyxDQUFDLHFIQUFxSDtJQUNoSSxZQUFZLENBQWdCO0lBQzdDLGVBQWUsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBRXBELHVHQUF1RztJQUN2RyxTQUFTLEdBQWtCLElBQUksQ0FBQztJQUVoQyxRQUFRLEdB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T0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDckMsQ0FBQzt3R0F2ckJVLGdDQUFnQzs0RkFBaEMsZ0NBQWdDLDJpQkNwQjdDLHlyUUF5T0E7OzRGRHJOYSxnQ0FBZ0M7a0JBTDVDLFNBQVM7K0JBQ0UsMkJBQTJCO3FHQU81QixXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQVNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBSXFCLFlBQVk7c0JBQXRDLFNBQVM7dUJBQUMsY0FBYztnQkFDZixlQUFlO3NCQUF4QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIElucHV0LFxyXG4gIE91dHB1dCxcclxuICBWaWV3Q2hpbGQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgT25Jbml0LFxyXG4gIE9uRGVzdHJveSxcclxuICBSZW5kZXJlcjIsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE92ZXJsYXlQYW5lbCB9IGZyb20gJ3ByaW1lbmcvb3ZlcmxheXBhbmVsJztcclxuaW1wb3J0IHsgRGF0ZVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhdG9taXgtZGF0ZXJhbmdlLWNhbGVuZGFyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vYXRvbWl4LWRhdGVyYW5nZS1jYWxlbmRhci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vYXRvbWl4LWRhdGVyYW5nZS1jYWxlbmRhci5jb21wb25lbnQuc2NzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQXRvbWl4RGF0ZXJhbmdlQ2FsZW5kYXJDb21wb25lbnRcclxuICBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25Jbml0LCBPbkRlc3Ryb3lcclxue1xyXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnJztcclxuICBASW5wdXQoKSBzdHlsZUNsYXNzOiBzdHJpbmcgPSAnJztcclxuICBASW5wdXQoKSBzZWxlY3Rpb25Nb2RlOiAncmFuZ2UnID0gJ3JhbmdlJztcclxuICBASW5wdXQoKSBpbnB1dFN0eWxlQ2xhc3M6IHN0cmluZyA9ICcnO1xyXG4gIEBJbnB1dCgpIGlubGluZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc2VsZWN0ZWREYXRlOiBhbnkgPSBudWxsO1xyXG4gIEBJbnB1dCgpIG1heERhdGUhOiBEYXRlO1xyXG4gIEBJbnB1dCgpIG1pbkRhdGUhOiBEYXRlO1xyXG4gIEBJbnB1dCgpIGRlZmF1bHRQcmVzZXQ6XHJcbiAgICB8ICd0b2RheSdcclxuICAgIHwgJ3llc3RlcmRheSdcclxuICAgIHwgJ2xhc3Q3ZGF5cydcclxuICAgIHwgJ2xhc3QzMGRheXMnXHJcbiAgICB8ICdsYXN0M21vbnRocydcclxuICAgIHwgJ2xhc3Q2bW9udGhzJ1xyXG4gICAgfCAnbGFzdDF5ZWFyJ1xyXG4gICAgfCBudWxsID0gbnVsbDtcclxuICBASW5wdXQoKSBwcmVzZXJ2ZVByZXNldDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBjdXN0b21SYW5nZU1vZGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBzZWxlY3RlZFByZXNldDogc3RyaW5nIHwgbnVsbCA9IG51bGw7IC8vICd0b2RheScgfCAneWVzdGVyZGF5JyB8ICdsYXN0N2RheXMnIHwgJ2xhc3QzMGRheXMnIHwgJ2xhc3QzbW9udGhzJyB8ICdsYXN0Nm1vbnRocycgfCAnbGFzdDF5ZWFyJyB8ICdjdXN0b20nIHwgbnVsbFxyXG4gIEBWaWV3Q2hpbGQoJ292ZXJsYXlQYW5lbCcpIG92ZXJsYXlQYW5lbD86IE92ZXJsYXlQYW5lbDtcclxuICBAT3V0cHV0KCkgZGF0ZVJhbmdlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIC8vIGludGVybmFsIG1vZGVsIGJvdW5kIHRvIHAtY2FsZW5kYXIgdG8gYXZvaWQgY2hhbmdpbmcgZXh0ZXJuYWwgc2VsZWN0aW9uIGR1cmluZyBmaXJzdC1jbGljayBzZWxlY3Rpb25cclxuICBtb2RlbERhdGU6IERhdGVbXSB8IG51bGwgPSBudWxsO1xyXG5cclxuICBlbkxvY2FsZSA9IHtcclxuICAgIGZpcnN0RGF5T2ZXZWVrOiAwLFxyXG4gICAgZGF5TmFtZXM6IFtcclxuICAgICAgJ1N1bmRheScsXHJcbiAgICAgICdNb25kYXknLFxyXG4gICAgICAnVHVlc2RheScsXHJcbiAgICAgICdXZWRuZXNkYXknLFxyXG4gICAgICAnVGh1cnNkYXknLFxyXG4gICAgICAnRnJpZGF5JyxcclxuICAgICAgJ1NhdHVyZGF5JyxcclxuICAgIF0sXHJcbiAgICBkYXlOYW1lc1Nob3J0OiBbJ1N1bicsICdNb24nLCAnVHVlJywgJ1dlZCcsICdUaHUnLCAnRnJpJywgJ1NhdCddLFxyXG4gICAgZGF5TmFtZXNNaW46IFsnU3UnLCAnTW8nLCAnVHUnLCAnV2UnLCAnVGgnLCAnRnInLCAnU2EnXSxcclxuICAgIG1vbnRoTmFtZXM6IFtcclxuICAgICAgJ0phbnVhcnknLFxyXG4gICAgICAnRmVicnVhcnknLFxyXG4gICAgICAnTWFyY2gnLFxyXG4gICAgICAnQXByaWwnLFxyXG4gICAgICAnTWF5JyxcclxuICAgICAgJ0p1bmUnLFxyXG4gICAgICAnSnVseScsXHJcbiAgICAgICdBdWd1c3QnLFxyXG4gICAgICAnU2VwdGVtYmVyJyxcclxuICAgICAgJ09jdG9iZXInLFxyXG4gICAgICAnTm92ZW1iZXInLFxyXG4gICAgICAnRGVjZW1iZXInLFxyXG4gICAgXSxcclxuICAgIG1vbnRoTmFtZXNTaG9ydDogW1xyXG4gICAgICAnSmFuJyxcclxuICAgICAgJ0ZlYicsXHJcbiAgICAgICdNYXInLFxyXG4gICAgICAnQXByJyxcclxuICAgICAgJ01heScsXHJcbiAgICAgICdKdW4nLFxyXG4gICAgICAnSnVsJyxcclxuICAgICAgJ0F1ZycsXHJcbiAgICAgICdTZXAnLFxyXG4gICAgICAnT2N0JyxcclxuICAgICAgJ05vdicsXHJcbiAgICAgICdEZWMnLFxyXG4gICAgXSxcclxuICAgIHRvZGF5OiAnVG9kYXknLFxyXG4gICAgY2xlYXI6ICdDbGVhcicsXHJcbiAgfTtcclxuXHJcbiAgLy8gdGVtcG9yYXJ5IHN0b3JhZ2UgZm9yIG92ZXJsYXkgc2Vzc2lvblxyXG4gIHByaXZhdGUgX292ZXJsYXlJbml0aWFsRGF0ZTogRGF0ZVtdIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfb3ZlcmxheUluaXRpYWxQcmVzZXQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgX2NhbGVuZGFyT2JzZXJ2ZXJzOiBNdXRhdGlvbk9ic2VydmVyW10gPSBbXTtcclxuICBwcml2YXRlIF9vYnNlcnZlZEVsZW1lbnRzOiBFbGVtZW50W10gPSBbXTtcclxuICBwcml2YXRlIF9wYXJlbnRPYnNlcnZlcnM6IE11dGF0aW9uT2JzZXJ2ZXJbXSA9IFtdO1xyXG4gIHByaXZhdGUgX29ic2VydmVkUGFyZW50RWxlbWVudHM6IEVsZW1lbnRbXSA9IFtdO1xyXG4gIHByaXZhdGUgX3VwZGF0ZVJhZklkOiBudW1iZXIgfCBudWxsID0gbnVsbDsgLy8gcmVxdWVzdEFuaW1hdGlvbkZyYW1lIGlkXHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBkYXRlUGlwZTogRGF0ZVBpcGUsXHJcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjJcclxuICApIHt9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkRGF0ZSAmJiB0aGlzLmRlZmF1bHRQcmVzZXQpIHtcclxuICAgICAgdGhpcy5hcHBseVByZXNldCh0aGlzLmRlZmF1bHRQcmVzZXQpO1xyXG4gICAgfVxyXG4gICAgLy8gaW5pdGlhbGl6ZSBpbnRlcm5hbCBtb2RlbFxyXG4gICAgdGhpcy5tb2RlbERhdGUgPSB0aGlzLnNlbGVjdGVkRGF0ZSA/IFsuLi50aGlzLnNlbGVjdGVkRGF0ZV0gOiBudWxsO1xyXG4gICAgLy8gaW5pdGlhbCBjbGFzcyB1cGRhdGUgaWYgdGhlcmUgaXMgYSBwcmUtc2VsZWN0ZWQgcmFuZ2VcclxuICAgIHRoaXMuX3NjaGVkdWxlVXBkYXRlKCk7XHJcbiAgICAvLyBzdGFydCBvYnNlcnZlcnMgaWYgaW5saW5lIGNhbGVuZGFyIGlzIHVzZWRcclxuICAgIGlmICh0aGlzLmlubGluZSkge1xyXG4gICAgICB0aGlzLl9zdGFydENhbGVuZGFyT2JzZXJ2ZXJzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlc1snc2VsZWN0ZWREYXRlJ10pIHtcclxuICAgICAgY29uc3Qgc2VsID0gY2hhbmdlc1snc2VsZWN0ZWREYXRlJ10uY3VycmVudFZhbHVlIGFzIERhdGVbXSB8IG51bGw7XHJcbiAgICAgIGlmIChzZWwgJiYgQXJyYXkuaXNBcnJheShzZWwpICYmIHNlbC5sZW5ndGggPT09IDIgJiYgc2VsWzBdICYmIHNlbFsxXSkge1xyXG4gICAgICAgIGNvbnN0IHByZXNldCA9IHRoaXMuZGV0ZWN0UHJlc2V0KHNlbFswXSwgc2VsWzFdKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkUHJlc2V0ID0gcHJlc2V0ID8/ICdjdXN0b20nO1xyXG4gICAgICAgIC8vIHN5bmMgaW50ZXJuYWwgbW9kZWwgd2hlbiBleHRlcm5hbCB2YWx1ZSBjaGFuZ2VzXHJcbiAgICAgICAgdGhpcy5tb2RlbERhdGUgPSBbLi4uc2VsXTtcclxuICAgICAgfSBlbHNlIGlmIChzZWwgPT0gbnVsbCkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRQcmVzZXQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMubW9kZWxEYXRlID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25JbnB1dEtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicgfHwgZXZlbnQua2V5ID09PSAnICcpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICB0aGlzLm92ZXJsYXlQYW5lbD8udG9nZ2xlKGV2ZW50IGFzIGFueSk7XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHt9XHJcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbk92ZXJsYXlTaG93KCk6IHZvaWQge1xyXG4gICAgLy8gc3RvcmUgYSBkZWVwIGNvcHkgb2YgY3VycmVudCBzZWxlY3Rpb24vcHJlc2V0IHdoZW4gb3ZlcmxheSBvcGVuc1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWREYXRlICYmIEFycmF5LmlzQXJyYXkodGhpcy5zZWxlY3RlZERhdGUpKSB7XHJcbiAgICAgIHRoaXMuX292ZXJsYXlJbml0aWFsRGF0ZSA9ICh0aGlzLnNlbGVjdGVkRGF0ZSBhcyBEYXRlW10pLm1hcCgoZCkgPT5cclxuICAgICAgICBkID8gbmV3IERhdGUoZC5nZXRGdWxsWWVhcigpLCBkLmdldE1vbnRoKCksIGQuZ2V0RGF0ZSgpKSA6IGRcclxuICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX292ZXJsYXlJbml0aWFsRGF0ZSA9IG51bGw7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9vdmVybGF5SW5pdGlhbFByZXNldCA9IHRoaXMuc2VsZWN0ZWRQcmVzZXQ7XHJcbiAgICAvLyBlbnN1cmUgY2FsZW5kYXIgbW9kZWwgc2hvd3MgdGhlIGN1cnJlbnRseSBjb21taXR0ZWQgc2VsZWN0aW9uIHdoZW4gb3BlbmluZ1xyXG4gICAgdGhpcy5tb2RlbERhdGUgPSB0aGlzLnNlbGVjdGVkRGF0ZSA/IFsuLi50aGlzLnNlbGVjdGVkRGF0ZV0gOiBudWxsO1xyXG4gICAgLy8gZW5zdXJlIHByZXNldCBidXR0b25zIHJlZmxlY3QgY3VycmVudCBzZWxlY3Rpb24gd2hlbiBvdmVybGF5IG9wZW5zXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRlICYmXHJcbiAgICAgIEFycmF5LmlzQXJyYXkodGhpcy5zZWxlY3RlZERhdGUpICYmXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRlLmxlbmd0aCA9PT0gMlxyXG4gICAgKSB7XHJcbiAgICAgIGNvbnN0IHByZXNldCA9IHRoaXMuZGV0ZWN0UHJlc2V0KFxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlWzBdLFxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlWzFdXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRQcmVzZXQgPSBwcmVzZXQgPz8gJ2N1c3RvbSc7XHJcbiAgICB9IGVsc2UgaWYgKCF0aGlzLnNlbGVjdGVkRGF0ZSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkUHJlc2V0ID0gbnVsbDtcclxuICAgIH1cclxuICAgIC8vIGFkZCBzdGFydC9lbmQgY2xhc3NlcyB0byByYW5nZSBjZWxscyBmb3Igc3R5bGluZ1xyXG4gICAgdGhpcy5fc2NoZWR1bGVVcGRhdGUoKTtcclxuICAgIC8vIG9ic2VydmUgRE9NIGNoYW5nZXMgKFByaW1lTkcgbWF5IHJlLXJlbmRlciBpbnNpZGUgb3ZlcmxheSlcclxuICAgIHRoaXMuX3N0YXJ0Q2FsZW5kYXJPYnNlcnZlcnMoKTtcclxuICB9XHJcblxyXG4gIG9uT3ZlcmxheUhpZGUoKTogdm9pZCB7XHJcbiAgICAvLyBpZiBpbnRlcm5hbCBjYWxlbmRhciBtb2RlbCBoYXMgYW4gaW5jb21wbGV0ZSBzZWxlY3Rpb24gKHBhcnRpYWwgcmFuZ2UpIHJldmVydCB0byBpbml0aWFsXHJcbiAgICBjb25zdCBtb2RlbCA9IHRoaXMubW9kZWxEYXRlO1xyXG4gICAgY29uc3QgaXNQYXJ0aWFsTW9kZWwgPSBCb29sZWFuKFxyXG4gICAgICBtb2RlbCAmJiBBcnJheS5pc0FycmF5KG1vZGVsKSAmJiBtb2RlbC5sZW5ndGggPiAwICYmIG1vZGVsWzBdICYmICFtb2RlbFsxXVxyXG4gICAgKTtcclxuICAgIGlmIChpc1BhcnRpYWxNb2RlbCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IHRoaXMuX292ZXJsYXlJbml0aWFsRGF0ZTtcclxuICAgICAgdGhpcy5zZWxlY3RlZFByZXNldCA9IHRoaXMuX292ZXJsYXlJbml0aWFsUHJlc2V0O1xyXG4gICAgICAvLyByZXNldCBpbnRlcm5hbCBtb2RlbCB0byBzeW5jZWQgdmFsdWVcclxuICAgICAgdGhpcy5tb2RlbERhdGUgPSB0aGlzLnNlbGVjdGVkRGF0ZSA/IFsuLi50aGlzLnNlbGVjdGVkRGF0ZV0gOiBudWxsO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fb3ZlcmxheUluaXRpYWxEYXRlID0gbnVsbDtcclxuICAgIHRoaXMuX292ZXJsYXlJbml0aWFsUHJlc2V0ID0gbnVsbDtcclxuICAgIHRoaXMuY3VzdG9tUmFuZ2VNb2RlID0gZmFsc2U7XHJcbiAgICAvLyBjbGVhbnVwIGFueSBzdGFydC9lbmQgY2xhc3NlcyB0byBhdm9pZCBzdGFsZSBjbGFzc2VzXHJcbiAgICB0aGlzLl9zY2hlZHVsZVVwZGF0ZSgpO1xyXG4gICAgLy8gc3RvcCBvYnNlcnZpbmdcclxuICAgIHRoaXMuX3N0b3BDYWxlbmRhck9ic2VydmVycygpO1xyXG4gIH1cclxuXHJcbiAgb25Nb2RlbENoYW5nZShkYXRlUmFuZ2U6IERhdGVbXSB8IG51bGwpIHtcclxuICAgIC8vIFdoZW4gdXNlciBjbGlja3MgYSBmaXJzdCBkYXRlLCBQcmltZU5HIG1heSBlbWl0IGFuIGFycmF5IHdpdGggMSB2YWx1ZS4gV2UgZG9uJ3Qgd2FudCB0b1xyXG4gICAgLy8gdXBkYXRlIHRoZSBleHRlcm5hbCBzZWxlY3RlZERhdGUgdW50aWwgdGhlIHJhbmdlIGlzIGNvbXBsZXRlZCAodHdvIGRhdGVzKSBzbyB0aGF0XHJcbiAgICAvLyB0aGUgY2FsZW5kYXIgZG9lcyBub3QganVtcCBiYWNrIHRvIGEgcHJldmlvdXNseSBzZWxlY3RlZCBlbmQgZGF0ZSdzIG1vbnRoLlxyXG4gICAgdGhpcy5tb2RlbERhdGUgPSBkYXRlUmFuZ2UgPyBbLi4uZGF0ZVJhbmdlXSA6IG51bGw7XHJcbiAgICBpZiAoXHJcbiAgICAgIGRhdGVSYW5nZSAmJlxyXG4gICAgICBBcnJheS5pc0FycmF5KGRhdGVSYW5nZSkgJiZcclxuICAgICAgZGF0ZVJhbmdlLmxlbmd0aCA9PT0gMiAmJlxyXG4gICAgICBkYXRlUmFuZ2VbMF0gJiZcclxuICAgICAgZGF0ZVJhbmdlWzFdXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZFByZXNldCA9IHRoaXMuZGV0ZWN0UHJlc2V0KGRhdGVSYW5nZVswXSwgZGF0ZVJhbmdlWzFdKTtcclxuICAgICAgdGhpcy5jdXN0b21SYW5nZU1vZGUgPSBmYWxzZTtcclxuICAgICAgdGhpcy5zZWxlY3RlZERhdGUgPSBbLi4uZGF0ZVJhbmdlXTtcclxuICAgICAgdGhpcy5kYXRlUmFuZ2VDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkRGF0ZSk7XHJcbiAgICAgIC8vIGNsb3NlIG92ZXJsYXkgbGlrZSB3aGVuIGFwcGx5aW5nIGEgcHJlc2V0XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdGhpcy5vdmVybGF5UGFuZWw/LmhpZGUoKTtcclxuICAgICAgfSBjYXRjaCAoZSkge31cclxuICAgIH0gZWxzZSBpZiAoIWRhdGVSYW5nZSkge1xyXG4gICAgICAvLyBjbGVhcmVkIHNlbGVjdGlvblxyXG4gICAgICB0aGlzLnNlbGVjdGVkUHJlc2V0ID0gbnVsbDtcclxuICAgICAgdGhpcy5jdXN0b21SYW5nZU1vZGUgPSBmYWxzZTtcclxuICAgICAgdGhpcy5zZWxlY3RlZERhdGUgPSBudWxsO1xyXG4gICAgICB0aGlzLmRhdGVSYW5nZUNoYW5nZS5lbWl0KG51bGwpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gc2luZ2xlIGRhdGUgc2VsZWN0aW5nIChwYXJ0aWFsIHJhbmdlKSAtIGRvIG5vdCBlbWl0IGNoYW5nZSB5ZXQ7IGp1c3Qga2VlcCBpbnRlcm5hbCBtb2RlbFxyXG4gICAgICAvLyBzbyB0aGUgY2FsZW5kYXIncyB2aWV3IHJlbWFpbnMgd2hlcmUgdGhlIHVzZXIgbmF2aWdhdGVkIHRvLlxyXG4gICAgICB0aGlzLnNlbGVjdGVkUHJlc2V0ID0gbnVsbDtcclxuICAgICAgdGhpcy5jdXN0b21SYW5nZU1vZGUgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIC8vIHVwZGF0ZSBzdGFydC9lbmQgY2xhc3NlcyB3aGlsZSB1c2VyIGlzIHNlbGVjdGluZyBvciB3aGVuIHJhbmdlIGNvbXBsZXRlc1xyXG4gICAgdGhpcy5fc2NoZWR1bGVVcGRhdGUoKTtcclxuICB9XHJcblxyXG4gIC8vIENhbGxlZCB3aGVuIHRoZSBjYWxlbmRhcidzIHZpc2libGUgbW9udGgveWVhciBjaGFuZ2VzXHJcbiAgb25DYWxlbmRhclZpZXdDaGFuZ2VkKGV2ZW50PzogYW55KTogdm9pZCB7XHJcbiAgICAvLyBSZWFwcGx5IGNsYXNzZXMgYWZ0ZXIgUHJpbWVORyByZS1yZW5kZXJcclxuICAgIHRoaXMuX3NjaGVkdWxlVXBkYXRlKCk7XHJcbiAgICAvLyBSZWF0dGFjaCBvYnNlcnZlcnMgYWZ0ZXIgYSBzbWFsbCBkZWxheSBzaW5jZSBQcmltZU5HIHdpbGwgbGlrZWx5IHJlcGxhY2UgRE9NIG5vZGVzXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICB0aGlzLl9zdG9wQ2FsZW5kYXJPYnNlcnZlcnMoKTtcclxuICAgICAgICB0aGlzLl9zdGFydENhbGVuZGFyT2JzZXJ2ZXJzKCk7XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHt9XHJcbiAgICB9LCA0MCk7XHJcbiAgfVxyXG5cclxuICBnZXQgaGFzU2VsZWN0aW9uKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIEJvb2xlYW4oXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRlICYmXHJcbiAgICAgICAgQXJyYXkuaXNBcnJheSh0aGlzLnNlbGVjdGVkRGF0ZSkgJiZcclxuICAgICAgICAodGhpcy5zZWxlY3RlZERhdGUgYXMgRGF0ZVtdKS5sZW5ndGggPT09IDIgJiZcclxuICAgICAgICAhISh0aGlzLnNlbGVjdGVkRGF0ZSBhcyBEYXRlW10pWzBdICYmXHJcbiAgICAgICAgISEodGhpcy5zZWxlY3RlZERhdGUgYXMgRGF0ZVtdKVsxXVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbm9ybWFsaXplRGF0ZShkOiBEYXRlKTogRGF0ZSB7XHJcbiAgICByZXR1cm4gbmV3IERhdGUoZC5nZXRGdWxsWWVhcigpLCBkLmdldE1vbnRoKCksIGQuZ2V0RGF0ZSgpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNTYW1lRGF0ZShhOiBEYXRlLCBiOiBEYXRlKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICBhLmdldEZ1bGxZZWFyKCkgPT09IGIuZ2V0RnVsbFllYXIoKSAmJlxyXG4gICAgICBhLmdldE1vbnRoKCkgPT09IGIuZ2V0TW9udGgoKSAmJlxyXG4gICAgICBhLmdldERhdGUoKSA9PT0gYi5nZXREYXRlKClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRldGVjdFByZXNldChzdGFydFJhdzogRGF0ZSwgZW5kUmF3OiBEYXRlKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICBjb25zdCBzdGFydCA9IHRoaXMubm9ybWFsaXplRGF0ZShzdGFydFJhdyk7XHJcbiAgICBjb25zdCBlbmQgPSB0aGlzLm5vcm1hbGl6ZURhdGUoZW5kUmF3KTtcclxuICAgIGNvbnN0IHRvZGF5ID0gdGhpcy5ub3JtYWxpemVEYXRlKG5ldyBEYXRlKCkpO1xyXG4gICAgLy8gdG9kYXlcclxuICAgIGlmICh0aGlzLmlzU2FtZURhdGUoc3RhcnQsIHRvZGF5KSAmJiB0aGlzLmlzU2FtZURhdGUoZW5kLCB0b2RheSkpXHJcbiAgICAgIHJldHVybiAndG9kYXknO1xyXG4gICAgLy8geWVzdGVyZGF5XHJcbiAgICBjb25zdCB5ID0gbmV3IERhdGUodG9kYXkpO1xyXG4gICAgeS5zZXREYXRlKHkuZ2V0RGF0ZSgpIC0gMSk7XHJcbiAgICBpZiAodGhpcy5pc1NhbWVEYXRlKHN0YXJ0LCB5KSAmJiB0aGlzLmlzU2FtZURhdGUoZW5kLCB5KSlcclxuICAgICAgcmV0dXJuICd5ZXN0ZXJkYXknO1xyXG4gICAgLy8gbGFzdDdkYXlzIChsYXN0IDcgZGF5cyBpbmNsdWRpbmcgdG9kYXk6IHN0YXJ0ID0gdG9kYXkgLSA2LCBlbmQgPSB0b2RheSlcclxuICAgIGNvbnN0IGw3RW5kID0gbmV3IERhdGUodG9kYXkpO1xyXG4gICAgY29uc3QgbDdTdGFydCA9IG5ldyBEYXRlKHRvZGF5KTtcclxuICAgIGw3U3RhcnQuc2V0RGF0ZSh0b2RheS5nZXREYXRlKCkgLSA2KTtcclxuICAgIGlmICh0aGlzLmlzU2FtZURhdGUoc3RhcnQsIGw3U3RhcnQpICYmIHRoaXMuaXNTYW1lRGF0ZShlbmQsIGw3RW5kKSlcclxuICAgICAgcmV0dXJuICdsYXN0N2RheXMnO1xyXG4gICAgLy8gbGFzdDMwZGF5cyAobGFzdCAzMCBkYXlzIGluY2x1ZGluZyB0b2RheTogc3RhcnQgPSB0b2RheSAtIDI5LCBlbmQgPSB0b2RheSlcclxuICAgIGNvbnN0IGwzMEVuZCA9IG5ldyBEYXRlKHRvZGF5KTtcclxuICAgIGNvbnN0IGwzMFN0YXJ0ID0gbmV3IERhdGUodG9kYXkpO1xyXG4gICAgbDMwU3RhcnQuc2V0RGF0ZSh0b2RheS5nZXREYXRlKCkgLSAyOSk7XHJcbiAgICBpZiAodGhpcy5pc1NhbWVEYXRlKHN0YXJ0LCBsMzBTdGFydCkgJiYgdGhpcy5pc1NhbWVEYXRlKGVuZCwgbDMwRW5kKSlcclxuICAgICAgcmV0dXJuICdsYXN0MzBkYXlzJztcclxuICAgIC8vIGxhc3QzbW9udGhzIChsYXN0IDMgbW9udGhzIGluY2x1ZGluZyB0b2RheTogc3RhcnQgPSB0b2RheSAtIDMgbW9udGhzLCBlbmQgPSB0b2RheSlcclxuICAgIGNvbnN0IGwzbUVuZCA9IG5ldyBEYXRlKHRvZGF5KTtcclxuICAgIGNvbnN0IGwzbVN0YXJ0ID0gbmV3IERhdGUodG9kYXkpO1xyXG4gICAgbDNtU3RhcnQuc2V0TW9udGgodG9kYXkuZ2V0TW9udGgoKSAtIDMpO1xyXG4gICAgaWYgKHRoaXMuaXNTYW1lRGF0ZShzdGFydCwgbDNtU3RhcnQpICYmIHRoaXMuaXNTYW1lRGF0ZShlbmQsIGwzbUVuZCkpXHJcbiAgICAgIHJldHVybiAnbGFzdDNtb250aHMnO1xyXG4gICAgLy8gbGFzdDZtb250aHMgKGxhc3QgNiBtb250aHMgaW5jbHVkaW5nIHRvZGF5OiBzdGFydCA9IHRvZGF5IC0gNiBtb250aHMsIGVuZCA9IHRvZGF5KVxyXG4gICAgY29uc3QgbDZtRW5kID0gbmV3IERhdGUodG9kYXkpO1xyXG4gICAgY29uc3QgbDZtU3RhcnQgPSBuZXcgRGF0ZSh0b2RheSk7XHJcbiAgICBsNm1TdGFydC5zZXRNb250aCh0b2RheS5nZXRNb250aCgpIC0gNik7XHJcbiAgICBpZiAodGhpcy5pc1NhbWVEYXRlKHN0YXJ0LCBsNm1TdGFydCkgJiYgdGhpcy5pc1NhbWVEYXRlKGVuZCwgbDZtRW5kKSlcclxuICAgICAgcmV0dXJuICdsYXN0Nm1vbnRocyc7XHJcbiAgICAvLyBsYXN0MXllYXIgKGxhc3QgMSB5ZWFyIGluY2x1ZGluZyB0b2RheTogc3RhcnQgPSB0b2RheSAtIDEgeWVhciwgZW5kID0gdG9kYXkpXHJcbiAgICBjb25zdCBsMXlFbmQgPSBuZXcgRGF0ZSh0b2RheSk7XHJcbiAgICBjb25zdCBsMXlTdGFydCA9IG5ldyBEYXRlKHRvZGF5KTtcclxuICAgIGwxeVN0YXJ0LnNldEZ1bGxZZWFyKHRvZGF5LmdldEZ1bGxZZWFyKCkgLSAxKTtcclxuICAgIGlmICh0aGlzLmlzU2FtZURhdGUoc3RhcnQsIGwxeVN0YXJ0KSAmJiB0aGlzLmlzU2FtZURhdGUoZW5kLCBsMXlFbmQpKVxyXG4gICAgICByZXR1cm4gJ2xhc3QxeWVhcic7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIGNsZWFyRGF0ZVJhbmdlKCkge1xyXG4gICAgdGhpcy5zZWxlY3RlZERhdGUgPSBudWxsO1xyXG4gICAgdGhpcy5kYXRlUmFuZ2VDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkRGF0ZSk7XHJcbiAgICB0aGlzLnNlbGVjdGVkUHJlc2V0ID0gbnVsbDtcclxuICAgIHRoaXMuY3VzdG9tUmFuZ2VNb2RlID0gZmFsc2U7XHJcbiAgICB0aGlzLm1vZGVsRGF0ZSA9IG51bGw7XHJcbiAgfVxyXG5cclxuICByZXNldEFuZENsb3NlKCkge1xyXG4gICAgdGhpcy5jbGVhckRhdGVSYW5nZSgpO1xyXG4gICAgaWYgKHRoaXMub3ZlcmxheVBhbmVsKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdGhpcy5vdmVybGF5UGFuZWwuaGlkZSgpO1xyXG4gICAgICB9IGNhdGNoIChlKSB7fVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2xlYXJBbmRTdG9wKGV2ZW50OiBFdmVudCkge1xyXG4gICAgdGhpcy5jbGVhckRhdGVSYW5nZSgpO1xyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5vdmVybGF5UGFuZWw/LmhpZGUoKTtcclxuICAgIH0gY2F0Y2ggKGUpIHt9XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZUN1c3RvbVJhbmdlKCkge1xyXG4gICAgdGhpcy5jdXN0b21SYW5nZU1vZGUgPSAhdGhpcy5jdXN0b21SYW5nZU1vZGU7XHJcbiAgICBpZiAodGhpcy5jdXN0b21SYW5nZU1vZGUpIHRoaXMuc2VsZWN0ZWRQcmVzZXQgPSAnY3VzdG9tJztcclxuICB9XHJcblxyXG4gIGFwcGx5Q3VzdG9tUmFuZ2UoKSB7XHJcbiAgICAvLyBlbnN1cmUgZXh0ZXJuYWwgc2VsZWN0ZWREYXRlIGlzIGluIHN5bmMgd2l0aCBpbnRlcm5hbCBtb2RlbFxyXG4gICAgdGhpcy5zZWxlY3RlZERhdGUgPSB0aGlzLm1vZGVsRGF0ZSA/IFsuLi50aGlzLm1vZGVsRGF0ZV0gOiBudWxsO1xyXG4gICAgdGhpcy5kYXRlUmFuZ2VDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkRGF0ZSk7XHJcbiAgICBpZiAodGhpcy5vdmVybGF5UGFuZWwpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICB0aGlzLm92ZXJsYXlQYW5lbC5oaWRlKCk7XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHt9XHJcbiAgICB9XHJcbiAgICB0aGlzLmN1c3RvbVJhbmdlTW9kZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5zZWxlY3RlZFByZXNldCA9ICdjdXN0b20nO1xyXG4gIH1cclxuXHJcbiAgZ2V0RGF0ZVJhbmdlTGFiZWwoKSB7XHJcbiAgICAvLyBDaGVjayB0aGUgaW50ZXJuYWwgbW9kZWwgZmlyc3QgdG8gc2hvdyByZWFsLXRpbWUgdXBkYXRlcyB3aGlsZSBzZWxlY3RpbmdcclxuICAgIGNvbnN0IGRhdGVBcnJheSA9IHRoaXMubW9kZWxEYXRlIHx8IHRoaXMuc2VsZWN0ZWREYXRlO1xyXG4gICAgaWYgKCFkYXRlQXJyYXkgfHwgIUFycmF5LmlzQXJyYXkoZGF0ZUFycmF5KSkgcmV0dXJuICcnO1xyXG5cclxuICAgIGNvbnN0IFtzdGFydCwgZW5kXSA9IGRhdGVBcnJheSBhcyAoRGF0ZSB8IG51bGwpW107XHJcbiAgICBjb25zdCBhcnJvdyA9ICdcXHUyNzk0JztcclxuXHJcbiAgICAvLyBTaG93IGp1c3QgdGhlIGZpcnN0IGRhdGUgd2l0aCBhbiBhcnJvdyBpZiBvbmx5IGZpcnN0IGRhdGUgaXMgc2VsZWN0ZWRcclxuICAgIGlmIChzdGFydCAmJiAhZW5kKSB7XHJcbiAgICAgIGNvbnN0IHN0YXJ0U3RyID0gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0oc3RhcnQsICdNTS9kZC95eXl5Jyk7XHJcbiAgICAgIHJldHVybiBgJHtzdGFydFN0cn0gJHthcnJvd30gYDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTaG93IHRoZSBjb21wbGV0ZSByYW5nZSBpZiBib3RoIGRhdGVzIGFyZSBzZWxlY3RlZFxyXG4gICAgaWYgKHN0YXJ0ICYmIGVuZCkge1xyXG4gICAgICBjb25zdCBzdGFydFN0ciA9IHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKHN0YXJ0LCAnTU0vZGQveXl5eScpO1xyXG4gICAgICBjb25zdCBlbmRTdHIgPSB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShlbmQsICdNTS9kZC95eXl5Jyk7XHJcbiAgICAgIHJldHVybiBgJHtzdGFydFN0cn0gJHthcnJvd30gJHtlbmRTdHJ9YDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gJyc7XHJcbiAgfVxyXG5cclxuICBhcHBseVByZXNldChcclxuICAgIHByZXNldDpcclxuICAgICAgfCAndG9kYXknXHJcbiAgICAgIHwgJ3llc3RlcmRheSdcclxuICAgICAgfCAnbGFzdDdkYXlzJ1xyXG4gICAgICB8ICdsYXN0MzBkYXlzJ1xyXG4gICAgICB8ICdsYXN0M21vbnRocydcclxuICAgICAgfCAnbGFzdDZtb250aHMnXHJcbiAgICAgIHwgJ2xhc3QxeWVhcidcclxuICApIHtcclxuICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcclxuICAgIGxldCBzdGFydDogRGF0ZSB8IG51bGwgPSBudWxsO1xyXG4gICAgbGV0IGVuZDogRGF0ZSB8IG51bGwgPSBudWxsO1xyXG4gICAgc3dpdGNoIChwcmVzZXQpIHtcclxuICAgICAgY2FzZSAndG9kYXknOlxyXG4gICAgICAgIHN0YXJ0ID0gZW5kID0gbmV3IERhdGUoXHJcbiAgICAgICAgICB0b2RheS5nZXRGdWxsWWVhcigpLFxyXG4gICAgICAgICAgdG9kYXkuZ2V0TW9udGgoKSxcclxuICAgICAgICAgIHRvZGF5LmdldERhdGUoKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ3llc3RlcmRheSc6XHJcbiAgICAgICAgY29uc3QgeSA9IG5ldyBEYXRlKHRvZGF5KTtcclxuICAgICAgICB5LnNldERhdGUoeS5nZXREYXRlKCkgLSAxKTtcclxuICAgICAgICBzdGFydCA9IGVuZCA9IG5ldyBEYXRlKHkuZ2V0RnVsbFllYXIoKSwgeS5nZXRNb250aCgpLCB5LmdldERhdGUoKSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2xhc3Q3ZGF5cyc6IHtcclxuICAgICAgICBlbmQgPSBuZXcgRGF0ZSh0b2RheS5nZXRGdWxsWWVhcigpLCB0b2RheS5nZXRNb250aCgpLCB0b2RheS5nZXREYXRlKCkpO1xyXG4gICAgICAgIHN0YXJ0ID0gbmV3IERhdGUoZW5kKTtcclxuICAgICAgICBzdGFydC5zZXREYXRlKGVuZC5nZXREYXRlKCkgLSA2KTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBjYXNlICdsYXN0MzBkYXlzJzoge1xyXG4gICAgICAgIGVuZCA9IG5ldyBEYXRlKHRvZGF5LmdldEZ1bGxZZWFyKCksIHRvZGF5LmdldE1vbnRoKCksIHRvZGF5LmdldERhdGUoKSk7XHJcbiAgICAgICAgc3RhcnQgPSBuZXcgRGF0ZShlbmQpO1xyXG4gICAgICAgIHN0YXJ0LnNldERhdGUoZW5kLmdldERhdGUoKSAtIDI5KTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBjYXNlICdsYXN0M21vbnRocyc6IHtcclxuICAgICAgICBlbmQgPSBuZXcgRGF0ZSh0b2RheS5nZXRGdWxsWWVhcigpLCB0b2RheS5nZXRNb250aCgpLCB0b2RheS5nZXREYXRlKCkpO1xyXG4gICAgICAgIHN0YXJ0ID0gbmV3IERhdGUoZW5kKTtcclxuICAgICAgICBzdGFydC5zZXRNb250aChlbmQuZ2V0TW9udGgoKSAtIDMpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGNhc2UgJ2xhc3Q2bW9udGhzJzoge1xyXG4gICAgICAgIGVuZCA9IG5ldyBEYXRlKHRvZGF5LmdldEZ1bGxZZWFyKCksIHRvZGF5LmdldE1vbnRoKCksIHRvZGF5LmdldERhdGUoKSk7XHJcbiAgICAgICAgc3RhcnQgPSBuZXcgRGF0ZShlbmQpO1xyXG4gICAgICAgIHN0YXJ0LnNldE1vbnRoKGVuZC5nZXRNb250aCgpIC0gNik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgY2FzZSAnbGFzdDF5ZWFyJzoge1xyXG4gICAgICAgIGVuZCA9IG5ldyBEYXRlKHRvZGF5LmdldEZ1bGxZZWFyKCksIHRvZGF5LmdldE1vbnRoKCksIHRvZGF5LmdldERhdGUoKSk7XHJcbiAgICAgICAgc3RhcnQgPSBuZXcgRGF0ZShlbmQpO1xyXG4gICAgICAgIHN0YXJ0LnNldEZ1bGxZZWFyKGVuZC5nZXRGdWxsWWVhcigpIC0gMSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIGlmIChzdGFydCAmJiBlbmQpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZERhdGUgPSBbc3RhcnQsIGVuZF07XHJcbiAgICAgIHRoaXMubW9kZWxEYXRlID0gW3N0YXJ0LCBlbmRdO1xyXG4gICAgICBpZiAodGhpcy5wcmVzZXJ2ZVByZXNldCkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gW3N0YXJ0LCBlbmQsIHsgcHJlc2V0czogcHJlc2V0IH1dO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZGF0ZVJhbmdlQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZERhdGUpO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkUHJlc2V0ID0gcHJlc2V0O1xyXG4gICAgICB0aGlzLmN1c3RvbVJhbmdlTW9kZSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5vdmVybGF5UGFuZWw/LmhpZGUoKTtcclxuICAgIH0gY2F0Y2ggKGUpIHt9XHJcbiAgICAvLyBlbnN1cmUgd2UgdXBkYXRlIHN0YXJ0L2VuZCBjbGFzc2VzIGFmdGVyIGFwcGx5aW5nIGEgcHJlc2V0XHJcbiAgICB0aGlzLl9zY2hlZHVsZVVwZGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgb25EYXRlUmFuZ2VDaGFuZ2UoZGF0ZVJhbmdlOiBEYXRlW10gfCBudWxsKTogdm9pZCB7XHJcbiAgICB0aGlzLmRhdGVSYW5nZUNoYW5nZS5lbWl0KGRhdGVSYW5nZSk7XHJcbiAgICBpZiAoZGF0ZVJhbmdlICYmIEFycmF5LmlzQXJyYXkoZGF0ZVJhbmdlKSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkUHJlc2V0ID0gdGhpcy5kZXRlY3RQcmVzZXQoZGF0ZVJhbmdlWzBdLCBkYXRlUmFuZ2VbMV0pO1xyXG4gICAgICB0aGlzLmN1c3RvbVJhbmdlTW9kZSA9IGZhbHNlO1xyXG4gICAgfSBlbHNlIGlmICghZGF0ZVJhbmdlKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRQcmVzZXQgPSBudWxsO1xyXG4gICAgICB0aGlzLmN1c3RvbVJhbmdlTW9kZSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fc2NoZWR1bGVVcGRhdGUoKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fc3RvcENhbGVuZGFyT2JzZXJ2ZXJzKCk7XHJcbiAgICB0aGlzLl9jYW5jZWxTY2hlZHVsZWRVcGRhdGUoKTtcclxuICB9XHJcblxyXG4gIC8vIFdhbGsgdGhlIHJlbmRlcmVkIGNhbGVuZGFyIERPTShzKSAob3ZlcmxheSArIGlubGluZSkgYW5kIGFkZCBzdGFydC1yYW5nZS9lbmQtcmFuZ2UgY2xhc3Nlc1xyXG4gIHByaXZhdGUgX3VwZGF0ZVN0YXJ0RW5kUmFuZ2VDbGFzc2VzKCk6IHZvaWQge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgY2FsZW5kYXJFbGVtZW50cyA9IHRoaXMuX2dldENhbGVuZGFyRWxlbWVudHMoKTtcclxuXHJcbiAgICAgIGNhbGVuZGFyRWxlbWVudHMuZm9yRWFjaCgoY2FsRWw6IEVsZW1lbnQpID0+IHtcclxuICAgICAgICAvLyBSZW1vdmUgZXhpc3RpbmcgY2xhc3NlcyBmcm9tIHNwYW5zIGZpcnN0XHJcbiAgICAgICAgY29uc3QgYWxsU3BhbnMgPSBjYWxFbC5xdWVyeVNlbGVjdG9yQWxsKCd0ZCA+IHNwYW4nKTtcclxuICAgICAgICBhbGxTcGFucy5mb3JFYWNoKChzcGFuKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHNwYW4sICdzdGFydC1yYW5nZScpO1xyXG4gICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyhzcGFuLCAnZW5kLXJhbmdlJyk7XHJcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHNwYW4sICdiZXR3ZWVuLXJhbmdlJyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIENvbGxlY3Qgc3Bhbi9kYXRlIHBhaXJzLCBwcmVmZXIgZGF0YS1kYXRlIGF0dHJpYnV0ZVxyXG4gICAgICAgIC8vIENhY2hlIGhlYWRlciBtb250aC95ZWFyIGZvciB0aGlzIGNhbGVuZGFyIHRvIGF2b2lkIHF1ZXJ5aW5nIHBlci1zcGFuXHJcbiAgICAgICAgY29uc3QgcGFuZWxOb2RlID0gY2FsRWwuY2xvc2VzdCgnLnAtZGF0ZXBpY2tlcicpIHx8IGNhbEVsO1xyXG4gICAgICAgIGNvbnN0IGhlYWRlck1vbnRoTm9kZSA9IChwYW5lbE5vZGUgYXMgRWxlbWVudCkucXVlcnlTZWxlY3RvcihcclxuICAgICAgICAgICcucC1kYXRlcGlja2VyLWhlYWRlciAucC1kYXRlcGlja2VyLXRpdGxlIC5wLWRhdGVwaWNrZXItbW9udGgnXHJcbiAgICAgICAgKTtcclxuICAgICAgICBjb25zdCBoZWFkZXJZZWFyTm9kZSA9IChwYW5lbE5vZGUgYXMgRWxlbWVudCkucXVlcnlTZWxlY3RvcihcclxuICAgICAgICAgICcucC1kYXRlcGlja2VyLWhlYWRlciAucC1kYXRlcGlja2VyLXRpdGxlIC5wLWRhdGVwaWNrZXIteWVhcidcclxuICAgICAgICApO1xyXG4gICAgICAgIGNvbnN0IGhlYWRlck1vbnRoSWR4ID1cclxuICAgICAgICAgIGhlYWRlck1vbnRoTm9kZSAmJiBoZWFkZXJNb250aE5vZGUudGV4dENvbnRlbnRcclxuICAgICAgICAgICAgPyAodGhpcy5lbkxvY2FsZS5tb250aE5hbWVzIHx8IFtdKS5pbmRleE9mKFxyXG4gICAgICAgICAgICAgICAgaGVhZGVyTW9udGhOb2RlLnRleHRDb250ZW50LnRyaW0oKVxyXG4gICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgOiBOYU47XHJcbiAgICAgICAgY29uc3QgaGVhZGVyWWVhclZhbCA9XHJcbiAgICAgICAgICBoZWFkZXJZZWFyTm9kZSAmJiBoZWFkZXJZZWFyTm9kZS50ZXh0Q29udGVudFxyXG4gICAgICAgICAgICA/IHBhcnNlSW50KGhlYWRlclllYXJOb2RlLnRleHRDb250ZW50LnRyaW0oKSwgMTApXHJcbiAgICAgICAgICAgIDogTmFOO1xyXG4gICAgICAgIGNvbnN0IGl0ZW1zOiB7IGR0OiBEYXRlOyBzcGFuOiBFbGVtZW50OyB0ZD86IEhUTUxFbGVtZW50IHwgbnVsbCB9W10gPVxyXG4gICAgICAgICAgW107XHJcbiAgICAgICAgY29uc3Qgc3BhbnMgPSBjYWxFbC5xdWVyeVNlbGVjdG9yQWxsKCd0ZCA+IHNwYW4ucC1oaWdobGlnaHQnKTtcclxuICAgICAgICBzcGFucy5mb3JFYWNoKChzcGFuKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCB0ZCA9IHNwYW4uY2xvc2VzdCgndGQnKSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XHJcbiAgICAgICAgICAvLyBUcnkgdG8gcmVhZCBkYXRhLWRhdGUgYXR0cmlidXRlLCB3aGljaCBzb21lIFByaW1lTkcgdmVyc2lvbnMgcmVuZGVyIG9uIHNwYW4vdGRcclxuICAgICAgICAgIGxldCBkYXRhRGF0ZSA9IHNwYW4uZ2V0QXR0cmlidXRlKCdkYXRhLWRhdGUnKTtcclxuICAgICAgICAgIGlmICghZGF0YURhdGUgJiYgdGQpIGRhdGFEYXRlID0gdGQuZ2V0QXR0cmlidXRlKCdkYXRhLWRhdGUnKTtcclxuICAgICAgICAgIGlmIChkYXRhRGF0ZSkge1xyXG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IGRhdGFEYXRlLnNwbGl0KCctJykubWFwKChwKSA9PiBwYXJzZUludChwLCAxMCkpO1xyXG4gICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoID49IDMgJiYgcGFydHMuZXZlcnkoKG4pID0+ICFpc05hTihuKSkpIHtcclxuICAgICAgICAgICAgICBjb25zdCBbeSwgbSwgZF0gPSBwYXJ0cztcclxuICAgICAgICAgICAgICBjb25zdCBkdCA9IG5ldyBEYXRlKHksIG0gLSAxLCBkKTtcclxuICAgICAgICAgICAgICBpdGVtcy5wdXNoKHsgZHQsIHRkLCBzcGFuIH0pO1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gRmFsbGJhY2s6IHBhcnNlIGRheSBudW1iZXIgYW5kIGluZmVyIG1vbnRoL3llYXIgZnJvbSBuZWFyYnkgaGVhZGVyIGluIHRoZSBzYW1lIC5wLWRhdGVwaWNrZXJcclxuICAgICAgICAgIGNvbnN0IGRheVRleHQgPSAoc3Bhbi50ZXh0Q29udGVudCB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgY29uc3QgZGF5ID0gcGFyc2VJbnQoZGF5VGV4dCwgMTApO1xyXG4gICAgICAgICAgaWYgKCFpc05hTihkYXkpICYmIHRkKSB7XHJcbiAgICAgICAgICAgIC8vIFVzZSBjYWNoZWQgaGVhZGVyIG1vbnRoL3llYXIgd2hlbiBhdmFpbGFibGVcclxuICAgICAgICAgICAgaWYgKCFpc05hTihoZWFkZXJNb250aElkeCkgJiYgIWlzTmFOKGhlYWRlclllYXJWYWwpKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgZHQgPSBuZXcgRGF0ZShoZWFkZXJZZWFyVmFsLCBoZWFkZXJNb250aElkeCwgZGF5KTtcclxuICAgICAgICAgICAgICBpdGVtcy5wdXNoKHsgZHQsIHRkLCBzcGFuIH0pO1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gbGFzdCByZXNvcnQ6IGlnbm9yZSBzcGFuIGlmIGRhdGUgY2Fubm90IGJlIGRldGVybWluZWRcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xyXG5cclxuICAgICAgICAvLyBTb3J0IGl0ZW1zIHRvIGZpbmQgbWluL21heCAoc3RhcnQgJiBlbmQpXHJcbiAgICAgICAgaXRlbXMuc29ydCgoYSwgYikgPT4gYS5kdC5nZXRUaW1lKCkgLSBiLmR0LmdldFRpbWUoKSk7XHJcbiAgICAgICAgY29uc3QgZGV0ZWN0ZWRTdGFydCA9IGl0ZW1zWzBdLmR0O1xyXG4gICAgICAgIGNvbnN0IGRldGVjdGVkRW5kID0gaXRlbXNbaXRlbXMubGVuZ3RoIC0gMV0uZHQ7XHJcblxyXG4gICAgICAgIC8vIFByZWZlcnJlZCByYW5nZSBpcyBtb2RlbERhdGUvc2VsZWN0ZWREYXRlIGlmIHByZXNlbnRcclxuICAgICAgICBjb25zdCByYW5nZSA9XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZSAmJiB0aGlzLnNlbGVjdGVkRGF0ZS5sZW5ndGggPT09IDJcclxuICAgICAgICAgICAgPyB0aGlzLnNlbGVjdGVkRGF0ZVxyXG4gICAgICAgICAgICA6IHRoaXMubW9kZWxEYXRlICYmIHRoaXMubW9kZWxEYXRlLmxlbmd0aCA9PT0gMlxyXG4gICAgICAgICAgICAgID8gdGhpcy5tb2RlbERhdGVcclxuICAgICAgICAgICAgICA6IFtkZXRlY3RlZFN0YXJ0LCBkZXRlY3RlZEVuZF07XHJcbiAgICAgICAgY29uc3Qgc3RhcnREYXRlID1cclxuICAgICAgICAgIHJhbmdlICYmIHJhbmdlWzBdXHJcbiAgICAgICAgICAgID8gdGhpcy5ub3JtYWxpemVEYXRlKHJhbmdlWzBdIGFzIERhdGUpXHJcbiAgICAgICAgICAgIDogZGV0ZWN0ZWRTdGFydDtcclxuICAgICAgICBjb25zdCBlbmREYXRlID1cclxuICAgICAgICAgIHJhbmdlICYmIHJhbmdlWzFdXHJcbiAgICAgICAgICAgID8gdGhpcy5ub3JtYWxpemVEYXRlKHJhbmdlWzFdIGFzIERhdGUpXHJcbiAgICAgICAgICAgIDogZGV0ZWN0ZWRFbmQ7XHJcblxyXG4gICAgICAgIC8vIEZvciBlYWNoIGl0ZW0sIGFkZCBzdGFydC1yYW5nZSxlbmQtcmFuZ2UsIG9yIGJldHdlZW4tcmFuZ2UgYmFzZWQgb24gZGF0ZVxyXG4gICAgICAgIGNvbnN0IHNUaW1lID0gc3RhcnREYXRlLmdldFRpbWUoKTtcclxuICAgICAgICBjb25zdCBlVGltZSA9IGVuZERhdGUuZ2V0VGltZSgpO1xyXG4gICAgICAgIGZvciAoY29uc3QgaXQgb2YgaXRlbXMpIHtcclxuICAgICAgICAgIGNvbnN0IHQgPSBpdC5kdC5nZXRUaW1lKCk7XHJcbiAgICAgICAgICBpZiAoc1RpbWUgPT09IGVUaW1lICYmIHQgPT09IHNUaW1lKSB7XHJcbiAgICAgICAgICAgIC8vIHNpbmdsZS1kYXkgcmFuZ2UsIG1hcmsgYm90aCBzdGFydCAmIGVuZFxyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGl0LnNwYW4sICdzdGFydC1yYW5nZScpO1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGl0LnNwYW4sICdlbmQtcmFuZ2UnKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAodCA9PT0gc1RpbWUpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhpdC5zcGFuLCAnc3RhcnQtcmFuZ2UnKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAodCA9PT0gZVRpbWUpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhpdC5zcGFuLCAnZW5kLXJhbmdlJyk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHQgPiBzVGltZSAmJiB0IDwgZVRpbWUpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhpdC5zcGFuLCAnYmV0d2Vlbi1yYW5nZScpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIC8vIGlnbm9yZSBET00gZXJyb3JzIChlLmcuLCBzZXJ2ZXItc2lkZSByZW5kZXJpbmcgLyBtaXNzaW5nIGVsZW1lbnRzKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc29EYXRlKGQ6IERhdGUpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgeSA9IGQuZ2V0RnVsbFllYXIoKTtcclxuICAgIGNvbnN0IG0gPSBTdHJpbmcoZC5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgIGNvbnN0IGRheSA9IFN0cmluZyhkLmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgIHJldHVybiBgJHt5fS0ke219LSR7ZGF5fWA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9maW5kRWxlbWVudEJ5RGF0ZShkYXRlPzogRGF0ZSk6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkIHtcclxuICAgIGlmICghZGF0ZSkgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIGNvbnN0IHkgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XHJcbiAgICBjb25zdCBtID0gZGF0ZS5nZXRNb250aCgpICsgMTsgLy8gMS4uMTJcclxuICAgIGNvbnN0IGQgPSBkYXRlLmdldERhdGUoKTtcclxuICAgIGNvbnN0IGlzb1VucGFkZGVkID0gYCR7eX0tJHttfS0ke2R9YDsgLy8gZS5nLiAyMDI1LTExLTFcclxuICAgIGNvbnN0IGlzb1BhZGRlZCA9IGAke3l9LSR7U3RyaW5nKG0pLnBhZFN0YXJ0KDIsICcwJyl9LSR7U3RyaW5nKGQpLnBhZFN0YXJ0KDIsICcwJyl9YDsgLy8gMjAyNS0xMS0wMVxyXG4gICAgY29uc3Qgc2VsZWN0b3JzID0gW1xyXG4gICAgICBgW2RhdGEtZGF0ZT1cIiR7aXNvVW5wYWRkZWR9XCJdYCxcclxuICAgICAgYFtkYXRhLWRhdGU9XCIke2lzb1BhZGRlZH1cIl1gLFxyXG4gICAgXTtcclxuICAgIGZvciAoY29uc3Qgc2VsIG9mIHNlbGVjdG9ycykge1xyXG4gICAgICBjb25zdCBmb3VuZEluT3ZlcmxheSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXHJcbiAgICAgICAgYC5hdG9taXgtb3ZlcmxheS1jYWxlbmRhciAke3NlbH1gXHJcbiAgICAgICkgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xyXG4gICAgICBpZiAoZm91bmRJbk92ZXJsYXkpXHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgIChmb3VuZEluT3ZlcmxheS5jbG9zZXN0KCd0ZCcpIGFzIEhUTUxFbGVtZW50IHwgbnVsbCkgfHwgZm91bmRJbk92ZXJsYXlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG4gICAgZm9yIChjb25zdCBzZWwgb2Ygc2VsZWN0b3JzKSB7XHJcbiAgICAgIGNvbnN0IGZvdW5kID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWwpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcclxuICAgICAgaWYgKGZvdW5kKSByZXR1cm4gKGZvdW5kLmNsb3Nlc3QoJ3RkJykgYXMgSFRNTEVsZW1lbnQgfCBudWxsKSB8fCBmb3VuZDtcclxuICAgIH1cclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zdGFydENhbGVuZGFyT2JzZXJ2ZXJzKCk6IHZvaWQge1xyXG4gICAgLy8gc3RvcCBmaXJzdCB0byBhdm9pZCBkdXBsaWNhdGVzXHJcbiAgICB0aGlzLl9zdG9wQ2FsZW5kYXJPYnNlcnZlcnMoKTtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGNhbEVscyA9IHRoaXMuX2dldENhbGVuZGFyRWxlbWVudHMoKTtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBwYW5lbCA9IHRoaXMub3ZlcmxheVBhbmVsIGFzIGFueTtcclxuICAgICAgICBpZiAocGFuZWwgJiYgcGFuZWwuZWwgJiYgcGFuZWwuZWwubmF0aXZlRWxlbWVudCkge1xyXG4gICAgICAgICAgY29uc3QgZWwgPSBwYW5lbC5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wLWRhdGVwaWNrZXInKTtcclxuICAgICAgICAgIGlmIChlbCkgY2FsRWxzLnB1c2goZWwgYXMgRWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGNhdGNoIChlKSB7fVxyXG5cclxuICAgICAgY2FsRWxzLmZvckVhY2goKGVsKSA9PiB7XHJcbiAgICAgICAgY29uc3Qgb2JzID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4ge1xyXG4gICAgICAgICAgLy8gUmVhcHBseSBjbGFzc2VzIGFmdGVyIERPTSBjaGFuZ2VzIChkZWJvdW5jZWQpXHJcbiAgICAgICAgICB0aGlzLl9zY2hlZHVsZVVwZGF0ZSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIFdhdGNoIGNoaWxkTGlzdCwgc3VidHJlZSBhbmQgY2xhc3MgYXR0cmlidXRlIGNoYW5nZXMgKHNwYW4gY2xhc3MgdG9nZ2xlcyBhcmUgY29tbW9uKVxyXG4gICAgICAgIG9icy5vYnNlcnZlKGVsLCB7XHJcbiAgICAgICAgICBjaGlsZExpc3Q6IHRydWUsXHJcbiAgICAgICAgICBzdWJ0cmVlOiB0cnVlLFxyXG4gICAgICAgICAgYXR0cmlidXRlczogdHJ1ZSxcclxuICAgICAgICAgIGF0dHJpYnV0ZUZpbHRlcjogWydjbGFzcyddLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuX2NhbGVuZGFyT2JzZXJ2ZXJzLnB1c2gob2JzKTtcclxuICAgICAgICB0aGlzLl9vYnNlcnZlZEVsZW1lbnRzLnB1c2goZWwpO1xyXG4gICAgICAgIC8vIEFsc28gb2JzZXJ2ZSBwYXJlbnQgLSBpZiBQcmltZU5HIHJlcGxhY2VzIHRoZSAucC1kYXRlcGlja2VyIGVsZW1lbnQsIHBhcmVudCBjaGlsZExpc3QgY2hhbmdlcyB3aWxsIGZpcmVcclxuICAgICAgICBjb25zdCBwYXJlbnQgPSBlbC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgIGlmIChwYXJlbnQgJiYgdGhpcy5fb2JzZXJ2ZWRQYXJlbnRFbGVtZW50cy5pbmRleE9mKHBhcmVudCkgPT09IC0xKSB7XHJcbiAgICAgICAgICBjb25zdCBwYXJlbnRPYnMgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIHJlYXR0YWNoIG9ic2VydmVycyBzaW5jZSB0aGUgY2FsRWwgbWF5IGhhdmUgYmVlbiByZXBsYWNlZFxyXG4gICAgICAgICAgICB0aGlzLl9zY2hlZHVsZVVwZGF0ZSgpO1xyXG4gICAgICAgICAgICAvLyBkZXRhY2ggYW5kIHJlLWF0dGFjaCBvYnNlcnZlcnMgYWZ0ZXIgRE9NIHNldHRsZXNcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3N0b3BDYWxlbmRhck9ic2VydmVycygpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhcnRDYWxlbmRhck9ic2VydmVycygpO1xyXG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XHJcbiAgICAgICAgICAgIH0sIDEwMCk7IC8vIHNsaWdodGx5IGxhcmdlciBkZWxheSB0byBsZXQgUHJpbWVORyBmaW5pc2ggdGhlIG1vbnRoIHJlbmRlcmluZ1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBwYXJlbnRPYnMub2JzZXJ2ZShwYXJlbnQsIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiBmYWxzZSB9KTtcclxuICAgICAgICAgIHRoaXMuX3BhcmVudE9ic2VydmVycy5wdXNoKHBhcmVudE9icyk7XHJcbiAgICAgICAgICB0aGlzLl9vYnNlcnZlZFBhcmVudEVsZW1lbnRzLnB1c2gocGFyZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAvLyBpZ25vcmVcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3N0b3BDYWxlbmRhck9ic2VydmVycygpOiB2b2lkIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMuX2NhbGVuZGFyT2JzZXJ2ZXJzLmZvckVhY2goKG9icykgPT4gb2JzLmRpc2Nvbm5lY3QoKSk7XHJcbiAgICAgIHRoaXMuX3BhcmVudE9ic2VydmVycy5mb3JFYWNoKChvYnMpID0+IG9icy5kaXNjb25uZWN0KCkpO1xyXG4gICAgfSBjYXRjaCAoZSkge31cclxuICAgIHRoaXMuX2NhbGVuZGFyT2JzZXJ2ZXJzID0gW107XHJcbiAgICB0aGlzLl9vYnNlcnZlZEVsZW1lbnRzID0gW107XHJcbiAgICB0aGlzLl9wYXJlbnRPYnNlcnZlcnMgPSBbXTtcclxuICAgIHRoaXMuX29ic2VydmVkUGFyZW50RWxlbWVudHMgPSBbXTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3NjaGVkdWxlVXBkYXRlKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3VwZGF0ZVJhZklkICE9IG51bGwpIHJldHVybjsgLy8gYWxyZWFkeSBzY2hlZHVsZWRcclxuICAgIHRoaXMuX3VwZGF0ZVJhZklkID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgIHRoaXMuX3VwZGF0ZVJhZklkID0gbnVsbDtcclxuICAgICAgdGhpcy5fdXBkYXRlU3RhcnRFbmRSYW5nZUNsYXNzZXMoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY2FuY2VsU2NoZWR1bGVkVXBkYXRlKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3VwZGF0ZVJhZklkICE9IG51bGwpIHtcclxuICAgICAgd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX3VwZGF0ZVJhZklkKTtcclxuICAgICAgdGhpcy5fdXBkYXRlUmFmSWQgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0Q2FsZW5kYXJFbGVtZW50cygpOiBFbGVtZW50W10ge1xyXG4gICAgY29uc3QgY2FsRWxzOiBFbGVtZW50W10gPSBbXTtcclxuICAgIGNvbnN0IG92ZXJsYXlDYWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxyXG4gICAgICAnLmF0b21peC1vdmVybGF5LWNhbGVuZGFyIC5wLWRhdGVwaWNrZXInXHJcbiAgICApO1xyXG4gICAgY29uc3QgaW5saW5lQ2FsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmlubGluZS1jYWxlbmRhciAucC1kYXRlcGlja2VyJyk7XHJcbiAgICBpZiAob3ZlcmxheUNhbCkgY2FsRWxzLnB1c2gob3ZlcmxheUNhbCk7XHJcbiAgICBpZiAoaW5saW5lQ2FsKSBjYWxFbHMucHVzaChpbmxpbmVDYWwpO1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcGFuZWwgPSB0aGlzLm92ZXJsYXlQYW5lbCBhcyBhbnk7XHJcbiAgICAgIGlmIChwYW5lbCAmJiBwYW5lbC5lbCAmJiBwYW5lbC5lbC5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgICAgY29uc3QgZWwgPSBwYW5lbC5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wLWRhdGVwaWNrZXInKTtcclxuICAgICAgICBpZiAoZWwpIGNhbEVscy5wdXNoKGVsIGFzIEVsZW1lbnQpO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlKSB7fVxyXG4gICAgLy8gcmVtb3ZlIGR1cGxpY2F0ZXNcclxuICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoY2FsRWxzKSk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXY+XHJcbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpbmxpbmU7IGVsc2UgaW5saW5lQmxvY2tcIj5cclxuICAgIDxkaXYgW25nQ2xhc3NdPVwic3R5bGVDbGFzc1wiIGNsYXNzPVwiaW5wdXQtd3JhcHBlclwiPlxyXG4gICAgICA8aW5wdXRcclxuICAgICAgICBwSW5wdXRUZXh0XHJcbiAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cImlucHV0U3R5bGVDbGFzc1wiXHJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcclxuICAgICAgICBbdmFsdWVdPVwiZ2V0RGF0ZVJhbmdlTGFiZWwoKVwiXHJcbiAgICAgICAgcmVhZG9ubHlcclxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgIChjbGljayk9XCJvdmVybGF5UGFuZWw/LnRvZ2dsZSgkZXZlbnQpXCJcclxuICAgICAgICAoa2V5ZG93bik9XCJvbklucHV0S2V5RG93bigkZXZlbnQpXCJcclxuICAgICAgLz5cclxuICAgICAgPGlcclxuICAgICAgICBjbGFzcz1cInBpIHBpLWNhbGVuZGFyIGlucHV0LWljb25cIlxyXG4gICAgICAgIHRpdGxlPVwiT3BlbiBjYWxlbmRhclwiXHJcbiAgICAgICAgKGNsaWNrKT1cIiFkaXNhYmxlZCAmJiBvdmVybGF5UGFuZWw/LnRvZ2dsZSgkZXZlbnQpXCJcclxuICAgICAgPjwvaT5cclxuICAgICAgPGlcclxuICAgICAgICAqbmdJZj1cImhhc1NlbGVjdGlvblwiXHJcbiAgICAgICAgY2xhc3M9XCJwaSBwaS10aW1lcyBpbnB1dC1jbGVhci1pY29uXCJcclxuICAgICAgICB0aXRsZT1cIkNsZWFyXCJcclxuICAgICAgICB0YWJpbmRleD1cIjBcIlxyXG4gICAgICAgIChjbGljayk9XCIhZGlzYWJsZWQgJiYgY2xlYXJBbmRTdG9wKCRldmVudClcIlxyXG4gICAgICAgIChrZXlkb3duLmVudGVyKT1cIiFkaXNhYmxlZCAmJiBjbGVhckFuZFN0b3AoJGV2ZW50KVwiXHJcbiAgICAgICAgKGtleWRvd24uc3BhY2UpPVwiIWRpc2FibGVkICYmIGNsZWFyQW5kU3RvcCgkZXZlbnQpXCJcclxuICAgICAgPjwvaT5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxwLW92ZXJsYXlQYW5lbFxyXG4gICAgICAjb3ZlcmxheVBhbmVsXHJcbiAgICAgIFtkaXNtaXNzYWJsZV09XCJ0cnVlXCJcclxuICAgICAgYXBwZW5kVG89XCJib2R5XCJcclxuICAgICAgc3R5bGVDbGFzcz1cImF0b21peC1kYXRlLXJhbmdlLW92ZXJsYXlcIlxyXG4gICAgICAob25TaG93KT1cIm9uT3ZlcmxheVNob3coKVwiXHJcbiAgICAgIChvbkhpZGUpPVwib25PdmVybGF5SGlkZSgpXCJcclxuICAgID5cclxuICAgICAgPGRpdiBjbGFzcz1cIm92ZXJsYXktaW5uZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwib3ZlcmxheS1sZWZ0XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJlc2V0LWxpc3RcIj5cclxuICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgIHBCdXR0b25cclxuICAgICAgICAgICAgICBwUmlwcGxlXHJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJwcmVzZXQtYnRuXCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwiYXBwbHlQcmVzZXQoJ3RvZGF5JylcIlxyXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgYWN0aXZlOiBzZWxlY3RlZFByZXNldCA9PT0gJ3RvZGF5JyB9XCJcclxuICAgICAgICAgICAgICBsYWJlbD1cIlRvZGF5XCJcclxuICAgICAgICAgICAgPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgcEJ1dHRvblxyXG4gICAgICAgICAgICAgIHBSaXBwbGVcclxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInByZXNldC1idG5cIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJhcHBseVByZXNldCgneWVzdGVyZGF5JylcIlxyXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgYWN0aXZlOiBzZWxlY3RlZFByZXNldCA9PT0gJ3llc3RlcmRheScgfVwiXHJcbiAgICAgICAgICAgICAgbGFiZWw9XCJZZXN0ZXJkYXlcIlxyXG4gICAgICAgICAgICA+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICBwQnV0dG9uXHJcbiAgICAgICAgICAgICAgcFJpcHBsZVxyXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwicHJlc2V0LWJ0blwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImFwcGx5UHJlc2V0KCdsYXN0N2RheXMnKVwiXHJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyBhY3RpdmU6IHNlbGVjdGVkUHJlc2V0ID09PSAnbGFzdDdkYXlzJyB9XCJcclxuICAgICAgICAgICAgICBsYWJlbD1cIkxhc3QgNyBkYXlzXCJcclxuICAgICAgICAgICAgPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgcEJ1dHRvblxyXG4gICAgICAgICAgICAgIHBSaXBwbGVcclxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInByZXNldC1idG5cIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJhcHBseVByZXNldCgnbGFzdDMwZGF5cycpXCJcclxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7IGFjdGl2ZTogc2VsZWN0ZWRQcmVzZXQgPT09ICdsYXN0MzBkYXlzJyB9XCJcclxuICAgICAgICAgICAgICBsYWJlbD1cIkxhc3QgMzAgZGF5c1wiXHJcbiAgICAgICAgICAgID48L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgIHBCdXR0b25cclxuICAgICAgICAgICAgICBwUmlwcGxlXHJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJwcmVzZXQtYnRuXCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwiYXBwbHlQcmVzZXQoJ2xhc3QzbW9udGhzJylcIlxyXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgYWN0aXZlOiBzZWxlY3RlZFByZXNldCA9PT0gJ2xhc3QzbW9udGhzJyB9XCJcclxuICAgICAgICAgICAgICBsYWJlbD1cIkxhc3QgMyBtb250aHNcIlxyXG4gICAgICAgICAgICA+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICBwQnV0dG9uXHJcbiAgICAgICAgICAgICAgcFJpcHBsZVxyXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwicHJlc2V0LWJ0blwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImFwcGx5UHJlc2V0KCdsYXN0Nm1vbnRocycpXCJcclxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7IGFjdGl2ZTogc2VsZWN0ZWRQcmVzZXQgPT09ICdsYXN0Nm1vbnRocycgfVwiXHJcbiAgICAgICAgICAgICAgbGFiZWw9XCJMYXN0IDYgbW9udGhzXCJcclxuICAgICAgICAgICAgPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgcEJ1dHRvblxyXG4gICAgICAgICAgICAgIHBSaXBwbGVcclxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInByZXNldC1idG5cIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJhcHBseVByZXNldCgnbGFzdDF5ZWFyJylcIlxyXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgYWN0aXZlOiBzZWxlY3RlZFByZXNldCA9PT0gJ2xhc3QxeWVhcicgfVwiXHJcbiAgICAgICAgICAgICAgbGFiZWw9XCJMYXN0IDEgeWVhclwiXHJcbiAgICAgICAgICAgID48L2J1dHRvbj5cclxuICAgICAgICAgICAgPGEgY2xhc3M9XCJyZXNldC1saW5rXCIgKGNsaWNrKT1cInJlc2V0QW5kQ2xvc2UoKVwiPlJlc2V0PC9hPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm92ZXJsYXktcmlnaHRcIj5cclxuICAgICAgICAgIDxwLWNhbGVuZGFyXHJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwibW9kZWxEYXRlXCJcclxuICAgICAgICAgICAgW3NlbGVjdGlvbk1vZGVdPVwiJ3JhbmdlJ1wiXHJcbiAgICAgICAgICAgIFtpbmxpbmVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgIFtkYXRlRm9ybWF0XT1cIidtbS9kZC95eXl5J1wiXHJcbiAgICAgICAgICAgIFtzaG93T3RoZXJNb250aHNdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgIFtsb2NhbGVdPVwiZW5Mb2NhbGVcIlxyXG4gICAgICAgICAgICBbc2hvd0ljb25dPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICBbc3R5bGVDbGFzc109XCInYXRvbWl4LW92ZXJsYXktY2FsZW5kYXInXCJcclxuICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25Nb2RlbENoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgKG9uTW9udGhDaGFuZ2UpPVwib25DYWxlbmRhclZpZXdDaGFuZ2VkKCRldmVudClcIlxyXG4gICAgICAgICAgICAob25ZZWFyQ2hhbmdlKT1cIm9uQ2FsZW5kYXJWaWV3Q2hhbmdlZCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgICAgICAgICAgW21heERhdGVdPVwibWF4RGF0ZVwiXHJcbiAgICAgICAgICAgIFttaW5EYXRlXT1cIm1pbkRhdGVcIlxyXG4gICAgICAgICAgPjwvcC1jYWxlbmRhcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L3Atb3ZlcmxheVBhbmVsPlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG5cclxuICA8bmctdGVtcGxhdGUgI2lubGluZUJsb2NrPlxyXG4gICAgPGRpdiBbbmdDbGFzc109XCJzdHlsZUNsYXNzXCIgY2xhc3M9XCJpbnB1dC13cmFwcGVyXCI+XHJcbiAgICAgIDxpbnB1dFxyXG4gICAgICAgIHBJbnB1dFRleHRcclxuICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwiaW5wdXRTdHlsZUNsYXNzXCJcclxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxyXG4gICAgICAgIFt2YWx1ZV09XCJnZXREYXRlUmFuZ2VMYWJlbCgpXCJcclxuICAgICAgICByZWFkb25seVxyXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXHJcbiAgICAgICAgKGtleWRvd24pPVwib25JbnB1dEtleURvd24oJGV2ZW50KVwiXHJcbiAgICAgIC8+XHJcbiAgICAgIDxpIGNsYXNzPVwicGkgcGktY2FsZW5kYXIgaW5wdXQtaWNvblwiIHRpdGxlPVwiT3BlbiBjYWxlbmRhclwiPjwvaT5cclxuICAgICAgPGlcclxuICAgICAgICAqbmdJZj1cImhhc1NlbGVjdGlvblwiXHJcbiAgICAgICAgY2xhc3M9XCJwaSBwaS10aW1lcyBpbnB1dC1jbGVhci1pY29uXCJcclxuICAgICAgICB0aXRsZT1cIkNsZWFyXCJcclxuICAgICAgICB0YWJpbmRleD1cIjBcIlxyXG4gICAgICAgIChjbGljayk9XCJjbGVhckFuZFN0b3AoJGV2ZW50KVwiXHJcbiAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiY2xlYXJBbmRTdG9wKCRldmVudClcIlxyXG4gICAgICAgIChrZXlkb3duLnNwYWNlKT1cImNsZWFyQW5kU3RvcCgkZXZlbnQpXCJcclxuICAgICAgPjwvaT5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cIm92ZXJsYXktaW5uZXIgaW5saW5lLWNhbGVuZGFyIGZsZXhcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm92ZXJsYXktbGVmdFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwcmVzZXQtbGlzdFwiPlxyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICBwQnV0dG9uXHJcbiAgICAgICAgICAgIHBSaXBwbGVcclxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwicHJlc2V0LWJ0blwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJhcHBseVByZXNldCgndG9kYXknKVwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgYWN0aXZlOiBzZWxlY3RlZFByZXNldCA9PT0gJ3RvZGF5JyB9XCJcclxuICAgICAgICAgICAgbGFiZWw9XCJUb2RheVwiXHJcbiAgICAgICAgICA+PC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIHBCdXR0b25cclxuICAgICAgICAgICAgcFJpcHBsZVxyXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJwcmVzZXQtYnRuXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cImFwcGx5UHJlc2V0KCd5ZXN0ZXJkYXknKVwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgYWN0aXZlOiBzZWxlY3RlZFByZXNldCA9PT0gJ3llc3RlcmRheScgfVwiXHJcbiAgICAgICAgICAgIGxhYmVsPVwiWWVzdGVyZGF5XCJcclxuICAgICAgICAgID48L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgcEJ1dHRvblxyXG4gICAgICAgICAgICBwUmlwcGxlXHJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICBjbGFzcz1cInByZXNldC1idG5cIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiYXBwbHlQcmVzZXQoJ2xhc3Q3ZGF5cycpXCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieyBhY3RpdmU6IHNlbGVjdGVkUHJlc2V0ID09PSAnbGFzdDdkYXlzJyB9XCJcclxuICAgICAgICAgICAgbGFiZWw9XCJMYXN0IDcgZGF5c1wiXHJcbiAgICAgICAgICA+PC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIHBCdXR0b25cclxuICAgICAgICAgICAgcFJpcHBsZVxyXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJwcmVzZXQtYnRuXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cImFwcGx5UHJlc2V0KCdsYXN0MzBkYXlzJylcIlxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7IGFjdGl2ZTogc2VsZWN0ZWRQcmVzZXQgPT09ICdsYXN0MzBkYXlzJyB9XCJcclxuICAgICAgICAgICAgbGFiZWw9XCJMYXN0IDMwIGRheXNcIlxyXG4gICAgICAgICAgPjwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICBwQnV0dG9uXHJcbiAgICAgICAgICAgIHBSaXBwbGVcclxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwicHJlc2V0LWJ0blwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJhcHBseVByZXNldCgnbGFzdDNtb250aHMnKVwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgYWN0aXZlOiBzZWxlY3RlZFByZXNldCA9PT0gJ2xhc3QzbW9udGhzJyB9XCJcclxuICAgICAgICAgICAgbGFiZWw9XCJMYXN0IDMgbW9udGhzXCJcclxuICAgICAgICAgID48L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgcEJ1dHRvblxyXG4gICAgICAgICAgICBwUmlwcGxlXHJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICBjbGFzcz1cInByZXNldC1idG5cIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiYXBwbHlQcmVzZXQoJ2xhc3QxeWVhcicpXCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieyBhY3RpdmU6IHNlbGVjdGVkUHJlc2V0ID09PSAnbGFzdDF5ZWFyJyB9XCJcclxuICAgICAgICAgICAgbGFiZWw9XCJMYXN0IDEgeWVhclwiXHJcbiAgICAgICAgICA+PC9idXR0b24+XHJcbiAgICAgICAgICA8YSBjbGFzcz1cInJlc2V0LWxpbmtcIiAoY2xpY2spPVwicmVzZXRBbmRDbG9zZSgpXCI+UmVzZXQ8L2E+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwib3ZlcmxheS1yaWdodFwiPlxyXG4gICAgICAgIDxwLWNhbGVuZGFyXHJcbiAgICAgICAgICBbKG5nTW9kZWwpXT1cIm1vZGVsRGF0ZVwiXHJcbiAgICAgICAgICBbc2VsZWN0aW9uTW9kZV09XCIncmFuZ2UnXCJcclxuICAgICAgICAgIFtpbmxpbmVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICBbZGF0ZUZvcm1hdF09XCInbW0vZGQveXl5eSdcIlxyXG4gICAgICAgICAgW3Nob3dPdGhlck1vbnRoc109XCJ0cnVlXCJcclxuICAgICAgICAgIFtsb2NhbGVdPVwiZW5Mb2NhbGVcIlxyXG4gICAgICAgICAgW3Nob3dJY29uXT1cImZhbHNlXCJcclxuICAgICAgICAgIFtzdHlsZUNsYXNzXT1cIidhdG9taXgtb3ZlcmxheS1jYWxlbmRhcidcIlxyXG4gICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25Nb2RlbENoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgIChvbk1vbnRoQ2hhbmdlKT1cIm9uQ2FsZW5kYXJWaWV3Q2hhbmdlZCgkZXZlbnQpXCJcclxuICAgICAgICAgIChvblllYXJDaGFuZ2UpPVwib25DYWxlbmRhclZpZXdDaGFuZ2VkKCRldmVudClcIlxyXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgICAgICAgIFttYXhEYXRlXT1cIm1heERhdGVcIlxyXG4gICAgICAgICAgW21pbkRhdGVdPVwibWluRGF0ZVwiXHJcbiAgICAgICAgPjwvcC1jYWxlbmRhcj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L25nLXRlbXBsYXRlPlxyXG48L2Rpdj5cclxuIl19