ngx-hana-nameserver-history-viewer 1.1.1 → 1.1.90

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 (242) hide show
  1. package/README.md +7 -6
  2. package/esm2020/ngx-hana-nameserver-history-viewer.mjs +5 -0
  3. package/esm2020/public-api.mjs +2 -0
  4. package/esm2020/src/nameserver-history-viewer/components/alert/alert.component.mjs +68 -0
  5. package/esm2020/src/nameserver-history-viewer/components/alert/alert.module.mjs +22 -0
  6. package/esm2020/src/nameserver-history-viewer/components/alert/index.mjs +3 -0
  7. package/esm2020/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.mjs +112 -0
  8. package/esm2020/src/nameserver-history-viewer/components/file-drop-input/index.mjs +2 -0
  9. package/esm2020/src/nameserver-history-viewer/components/index.mjs +9 -0
  10. package/esm2020/src/nameserver-history-viewer/components/instruction/index.mjs +2 -0
  11. package/esm2020/src/nameserver-history-viewer/components/instruction/instruction.component.mjs +42 -0
  12. package/esm2020/src/nameserver-history-viewer/components/nameserver-history.component.mjs +550 -0
  13. package/esm2020/src/nameserver-history-viewer/components/port-selector/index.mjs +2 -0
  14. package/esm2020/src/nameserver-history-viewer/components/port-selector/port-selector.component.mjs +69 -0
  15. package/esm2020/src/nameserver-history-viewer/components/port-selector/port-selector.service.mjs +41 -0
  16. package/esm2020/src/nameserver-history-viewer/components/progress-bar/index.mjs +2 -0
  17. package/esm2020/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.mjs +40 -0
  18. package/esm2020/src/nameserver-history-viewer/components/time-range-selector/index.mjs +2 -0
  19. package/esm2020/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.mjs +70 -0
  20. package/esm2020/src/nameserver-history-viewer/components/timezone-selector/index.mjs +2 -0
  21. package/esm2020/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.component.mjs +90 -0
  22. package/esm2020/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.mjs +49 -0
  23. package/esm2020/src/nameserver-history-viewer/index.mjs +3 -0
  24. package/esm2020/src/nameserver-history-viewer/nameserver-history.module.mjs +63 -0
  25. package/esm2020/src/nameserver-history-viewer/services/chart.service.mjs +323 -0
  26. package/esm2020/src/nameserver-history-viewer/services/file.service.mjs +390 -0
  27. package/esm2020/src/nameserver-history-viewer/services/index.mjs +4 -0
  28. package/esm2020/src/nameserver-history-viewer/services/ui.service.mjs +557 -0
  29. package/esm2020/src/nameserver-history-viewer/types/abort.types.mjs +6 -0
  30. package/esm2020/src/nameserver-history-viewer/types/alert.types.mjs +8 -0
  31. package/esm2020/src/nameserver-history-viewer/types/chart-content-data-item.types.mjs +2 -0
  32. package/esm2020/src/nameserver-history-viewer/types/chart-content-data.types.mjs +2 -0
  33. package/esm2020/src/nameserver-history-viewer/types/chart-content-header.types.mjs +2 -0
  34. package/esm2020/src/nameserver-history-viewer/types/chart-content-time.types.mjs +2 -0
  35. package/esm2020/src/nameserver-history-viewer/types/chart-content.types.mjs +2 -0
  36. package/esm2020/src/nameserver-history-viewer/types/color-rgba.types.mjs +2 -0
  37. package/esm2020/src/nameserver-history-viewer/types/html-element.type.mjs +9 -0
  38. package/esm2020/src/nameserver-history-viewer/types/index.mjs +28 -0
  39. package/esm2020/src/nameserver-history-viewer/types/item.types.mjs +14 -0
  40. package/esm2020/src/nameserver-history-viewer/types/legend-color.types.mjs +2 -0
  41. package/esm2020/src/nameserver-history-viewer/types/load-history-info-backup.types.mjs +2 -0
  42. package/esm2020/src/nameserver-history-viewer/types/load-history-info-columnstore.types.mjs +2 -0
  43. package/esm2020/src/nameserver-history-viewer/types/load-history-info-host.types.mjs +2 -0
  44. package/esm2020/src/nameserver-history-viewer/types/load-history-info-item.types.mjs +2 -0
  45. package/esm2020/src/nameserver-history-viewer/types/load-history-info-persistence.types.mjs +2 -0
  46. package/esm2020/src/nameserver-history-viewer/types/load-history-info-rowstore.types.mjs +2 -0
  47. package/esm2020/src/nameserver-history-viewer/types/load-history-info-server.types.mjs +2 -0
  48. package/esm2020/src/nameserver-history-viewer/types/load-history-info-session-admission-control.types.mjs +2 -0
  49. package/esm2020/src/nameserver-history-viewer/types/load-history-info-sql.types.mjs +2 -0
  50. package/esm2020/src/nameserver-history-viewer/types/load-history-info-sync-primitives.types.mjs +2 -0
  51. package/esm2020/src/nameserver-history-viewer/types/load-history-info-threads.types.mjs +2 -0
  52. package/esm2020/src/nameserver-history-viewer/types/load-history-info.types.mjs +2 -0
  53. package/esm2020/src/nameserver-history-viewer/types/port.types.mjs +2 -0
  54. package/esm2020/src/nameserver-history-viewer/types/scale-group.types.mjs +17 -0
  55. package/esm2020/src/nameserver-history-viewer/types/unit-category.types.mjs +10 -0
  56. package/esm2020/src/nameserver-history-viewer/types/unit.types.mjs +14 -0
  57. package/esm2020/src/nameserver-history-viewer/utils/chart-util.mjs +25 -0
  58. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/chartjs_ext.mjs +2 -0
  59. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/data_culling.mjs +57 -0
  60. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/data_mipmap.mjs +139 -0
  61. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/index.mjs +41 -0
  62. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/lttb_data_mipmap.mjs +106 -0
  63. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/responsive_downsample_plugin.mjs +168 -0
  64. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/utils.mjs +114 -0
  65. package/esm2020/src/nameserver-history-viewer/utils/chartjs-zoom/chart.zoom.mjs +527 -0
  66. package/esm2020/src/nameserver-history-viewer/utils/chartjs-zoom/index.mjs +2 -0
  67. package/esm2020/src/nameserver-history-viewer/utils/file-util.mjs +154 -0
  68. package/esm2020/src/nameserver-history-viewer/utils/index.mjs +5 -0
  69. package/esm2020/src/nameserver-history-viewer/utils/time-util.mjs +101 -0
  70. package/esm2020/src/nameserver-history-viewer/utils/ui-util.mjs +162 -0
  71. package/fesm2015/ngx-hana-nameserver-history-viewer.mjs +4081 -0
  72. package/fesm2015/ngx-hana-nameserver-history-viewer.mjs.map +1 -0
  73. package/fesm2020/ngx-hana-nameserver-history-viewer.mjs +4081 -0
  74. package/fesm2020/ngx-hana-nameserver-history-viewer.mjs.map +1 -0
  75. package/ngx-hana-nameserver-history-viewer.d.ts +1 -1
  76. package/package.json +36 -61
  77. package/src/nameserver-history-viewer/components/alert/alert.component.d.ts +4 -1
  78. package/src/nameserver-history-viewer/components/alert/alert.module.d.ts +6 -0
  79. package/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.d.ts +3 -0
  80. package/src/nameserver-history-viewer/components/instruction/instruction.component.d.ts +3 -0
  81. package/src/nameserver-history-viewer/components/nameserver-history.component.d.ts +33 -14
  82. package/src/nameserver-history-viewer/components/port-selector/port-selector.component.d.ts +4 -1
  83. package/src/nameserver-history-viewer/components/port-selector/port-selector.service.d.ts +3 -0
  84. package/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.d.ts +3 -0
  85. package/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.d.ts +3 -0
  86. package/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.component.d.ts +3 -0
  87. package/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.d.ts +3 -0
  88. package/src/nameserver-history-viewer/index.d.ts +1 -0
  89. package/src/nameserver-history-viewer/nameserver-history.module.d.ts +17 -0
  90. package/src/nameserver-history-viewer/services/chart.service.d.ts +4 -1
  91. package/src/nameserver-history-viewer/services/file.service.d.ts +4 -0
  92. package/src/nameserver-history-viewer/services/ui.service.d.ts +5 -2
  93. package/src/nameserver-history-viewer/types/load-history-info-session-admission-control.types.d.ts +3 -0
  94. package/src/nameserver-history-viewer/utils/chartjs-downsample/lttb_data_mipmap.d.ts +1 -1
  95. package/src/nameserver-history-viewer/utils/file-util.d.ts +11 -0
  96. package/bundles/ngx-hana-nameserver-history-viewer.umd.js +0 -6298
  97. package/bundles/ngx-hana-nameserver-history-viewer.umd.js.map +0 -1
  98. package/bundles/ngx-hana-nameserver-history-viewer.umd.min.js +0 -2
  99. package/bundles/ngx-hana-nameserver-history-viewer.umd.min.js.map +0 -1
  100. package/esm2015/ngx-hana-nameserver-history-viewer.js +0 -10
  101. package/esm2015/public-api.js +0 -6
  102. package/esm2015/src/nameserver-history-viewer/components/alert/alert.component.js +0 -108
  103. package/esm2015/src/nameserver-history-viewer/components/alert/alert.module.js +0 -21
  104. package/esm2015/src/nameserver-history-viewer/components/alert/index.js +0 -7
  105. package/esm2015/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.js +0 -141
  106. package/esm2015/src/nameserver-history-viewer/components/file-drop-input/index.js +0 -6
  107. package/esm2015/src/nameserver-history-viewer/components/index.js +0 -13
  108. package/esm2015/src/nameserver-history-viewer/components/instruction/index.js +0 -6
  109. package/esm2015/src/nameserver-history-viewer/components/instruction/instruction.component.js +0 -62
  110. package/esm2015/src/nameserver-history-viewer/components/nameserver-history.component.js +0 -742
  111. package/esm2015/src/nameserver-history-viewer/components/port-selector/index.js +0 -6
  112. package/esm2015/src/nameserver-history-viewer/components/port-selector/port-selector.component.js +0 -93
  113. package/esm2015/src/nameserver-history-viewer/components/port-selector/port-selector.service.js +0 -56
  114. package/esm2015/src/nameserver-history-viewer/components/progress-bar/index.js +0 -6
  115. package/esm2015/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.js +0 -35
  116. package/esm2015/src/nameserver-history-viewer/components/time-range-selector/index.js +0 -6
  117. package/esm2015/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.js +0 -68
  118. package/esm2015/src/nameserver-history-viewer/components/timezone-selector/index.js +0 -6
  119. package/esm2015/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.component.js +0 -135
  120. package/esm2015/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.js +0 -72
  121. package/esm2015/src/nameserver-history-viewer/index.js +0 -6
  122. package/esm2015/src/nameserver-history-viewer/nameserver-history.module.js +0 -42
  123. package/esm2015/src/nameserver-history-viewer/services/chart.service.js +0 -423
  124. package/esm2015/src/nameserver-history-viewer/services/file.service.js +0 -447
  125. package/esm2015/src/nameserver-history-viewer/services/index.js +0 -8
  126. package/esm2015/src/nameserver-history-viewer/services/ui.service.js +0 -817
  127. package/esm2015/src/nameserver-history-viewer/types/abort.types.js +0 -13
  128. package/esm2015/src/nameserver-history-viewer/types/alert.types.js +0 -13
  129. package/esm2015/src/nameserver-history-viewer/types/chart-content-data-item.types.js +0 -15
  130. package/esm2015/src/nameserver-history-viewer/types/chart-content-data.types.js +0 -9
  131. package/esm2015/src/nameserver-history-viewer/types/chart-content-header.types.js +0 -15
  132. package/esm2015/src/nameserver-history-viewer/types/chart-content-time.types.js +0 -9
  133. package/esm2015/src/nameserver-history-viewer/types/chart-content.types.js +0 -21
  134. package/esm2015/src/nameserver-history-viewer/types/color-rgba.types.js +0 -19
  135. package/esm2015/src/nameserver-history-viewer/types/html-element.type.js +0 -19
  136. package/esm2015/src/nameserver-history-viewer/types/index.js +0 -32
  137. package/esm2015/src/nameserver-history-viewer/types/item.types.js +0 -19
  138. package/esm2015/src/nameserver-history-viewer/types/legend-color.types.js +0 -9
  139. package/esm2015/src/nameserver-history-viewer/types/load-history-info-backup.types.js +0 -19
  140. package/esm2015/src/nameserver-history-viewer/types/load-history-info-columnstore.types.js +0 -19
  141. package/esm2015/src/nameserver-history-viewer/types/load-history-info-host.types.js +0 -35
  142. package/esm2015/src/nameserver-history-viewer/types/load-history-info-item.types.js +0 -31
  143. package/esm2015/src/nameserver-history-viewer/types/load-history-info-persistence.types.js +0 -27
  144. package/esm2015/src/nameserver-history-viewer/types/load-history-info-rowstore.types.js +0 -15
  145. package/esm2015/src/nameserver-history-viewer/types/load-history-info-server.types.js +0 -25
  146. package/esm2015/src/nameserver-history-viewer/types/load-history-info-session-admission-control.types.js +0 -19
  147. package/esm2015/src/nameserver-history-viewer/types/load-history-info-sql.types.js +0 -37
  148. package/esm2015/src/nameserver-history-viewer/types/load-history-info-sync-primitives.types.js +0 -15
  149. package/esm2015/src/nameserver-history-viewer/types/load-history-info-threads.types.js +0 -23
  150. package/esm2015/src/nameserver-history-viewer/types/load-history-info.types.js +0 -31
  151. package/esm2015/src/nameserver-history-viewer/types/port.types.js +0 -17
  152. package/esm2015/src/nameserver-history-viewer/types/scale-group.types.js +0 -35
  153. package/esm2015/src/nameserver-history-viewer/types/unit-category.types.js +0 -21
  154. package/esm2015/src/nameserver-history-viewer/types/unit.types.js +0 -19
  155. package/esm2015/src/nameserver-history-viewer/utils/chart-util.js +0 -38
  156. package/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/chartjs_ext.js +0 -100
  157. package/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/data_culling.js +0 -88
  158. package/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/data_mipmap.js +0 -213
  159. package/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/index.js +0 -46
  160. package/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/lttb_data_mipmap.js +0 -158
  161. package/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/responsive_downsample_plugin.js +0 -295
  162. package/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/utils.js +0 -130
  163. package/esm2015/src/nameserver-history-viewer/utils/chartjs-zoom/chart.zoom.js +0 -733
  164. package/esm2015/src/nameserver-history-viewer/utils/chartjs-zoom/index.js +0 -6
  165. package/esm2015/src/nameserver-history-viewer/utils/file-util.js +0 -149
  166. package/esm2015/src/nameserver-history-viewer/utils/index.js +0 -9
  167. package/esm2015/src/nameserver-history-viewer/utils/time-util.js +0 -135
  168. package/esm2015/src/nameserver-history-viewer/utils/ui-util.js +0 -203
  169. package/esm5/ngx-hana-nameserver-history-viewer.js +0 -10
  170. package/esm5/public-api.js +0 -6
  171. package/esm5/src/nameserver-history-viewer/components/alert/alert.component.js +0 -140
  172. package/esm5/src/nameserver-history-viewer/components/alert/alert.module.js +0 -25
  173. package/esm5/src/nameserver-history-viewer/components/alert/index.js +0 -7
  174. package/esm5/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.js +0 -155
  175. package/esm5/src/nameserver-history-viewer/components/file-drop-input/index.js +0 -6
  176. package/esm5/src/nameserver-history-viewer/components/index.js +0 -13
  177. package/esm5/src/nameserver-history-viewer/components/instruction/index.js +0 -6
  178. package/esm5/src/nameserver-history-viewer/components/instruction/instruction.component.js +0 -67
  179. package/esm5/src/nameserver-history-viewer/components/nameserver-history.component.js +0 -990
  180. package/esm5/src/nameserver-history-viewer/components/port-selector/index.js +0 -6
  181. package/esm5/src/nameserver-history-viewer/components/port-selector/port-selector.component.js +0 -93
  182. package/esm5/src/nameserver-history-viewer/components/port-selector/port-selector.service.js +0 -81
  183. package/esm5/src/nameserver-history-viewer/components/progress-bar/index.js +0 -6
  184. package/esm5/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.js +0 -26
  185. package/esm5/src/nameserver-history-viewer/components/time-range-selector/index.js +0 -6
  186. package/esm5/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.js +0 -58
  187. package/esm5/src/nameserver-history-viewer/components/timezone-selector/index.js +0 -6
  188. package/esm5/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.component.js +0 -164
  189. package/esm5/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.js +0 -102
  190. package/esm5/src/nameserver-history-viewer/index.js +0 -6
  191. package/esm5/src/nameserver-history-viewer/nameserver-history.module.js +0 -46
  192. package/esm5/src/nameserver-history-viewer/services/chart.service.js +0 -578
  193. package/esm5/src/nameserver-history-viewer/services/file.service.js +0 -566
  194. package/esm5/src/nameserver-history-viewer/services/index.js +0 -8
  195. package/esm5/src/nameserver-history-viewer/services/ui.service.js +0 -1036
  196. package/esm5/src/nameserver-history-viewer/types/abort.types.js +0 -13
  197. package/esm5/src/nameserver-history-viewer/types/alert.types.js +0 -13
  198. package/esm5/src/nameserver-history-viewer/types/chart-content-data-item.types.js +0 -15
  199. package/esm5/src/nameserver-history-viewer/types/chart-content-data.types.js +0 -9
  200. package/esm5/src/nameserver-history-viewer/types/chart-content-header.types.js +0 -15
  201. package/esm5/src/nameserver-history-viewer/types/chart-content-time.types.js +0 -9
  202. package/esm5/src/nameserver-history-viewer/types/chart-content.types.js +0 -21
  203. package/esm5/src/nameserver-history-viewer/types/color-rgba.types.js +0 -19
  204. package/esm5/src/nameserver-history-viewer/types/html-element.type.js +0 -19
  205. package/esm5/src/nameserver-history-viewer/types/index.js +0 -32
  206. package/esm5/src/nameserver-history-viewer/types/item.types.js +0 -19
  207. package/esm5/src/nameserver-history-viewer/types/legend-color.types.js +0 -9
  208. package/esm5/src/nameserver-history-viewer/types/load-history-info-backup.types.js +0 -19
  209. package/esm5/src/nameserver-history-viewer/types/load-history-info-columnstore.types.js +0 -19
  210. package/esm5/src/nameserver-history-viewer/types/load-history-info-host.types.js +0 -35
  211. package/esm5/src/nameserver-history-viewer/types/load-history-info-item.types.js +0 -31
  212. package/esm5/src/nameserver-history-viewer/types/load-history-info-persistence.types.js +0 -27
  213. package/esm5/src/nameserver-history-viewer/types/load-history-info-rowstore.types.js +0 -15
  214. package/esm5/src/nameserver-history-viewer/types/load-history-info-server.types.js +0 -25
  215. package/esm5/src/nameserver-history-viewer/types/load-history-info-session-admission-control.types.js +0 -19
  216. package/esm5/src/nameserver-history-viewer/types/load-history-info-sql.types.js +0 -37
  217. package/esm5/src/nameserver-history-viewer/types/load-history-info-sync-primitives.types.js +0 -15
  218. package/esm5/src/nameserver-history-viewer/types/load-history-info-threads.types.js +0 -23
  219. package/esm5/src/nameserver-history-viewer/types/load-history-info.types.js +0 -31
  220. package/esm5/src/nameserver-history-viewer/types/port.types.js +0 -17
  221. package/esm5/src/nameserver-history-viewer/types/scale-group.types.js +0 -35
  222. package/esm5/src/nameserver-history-viewer/types/unit-category.types.js +0 -21
  223. package/esm5/src/nameserver-history-viewer/types/unit.types.js +0 -19
  224. package/esm5/src/nameserver-history-viewer/utils/chart-util.js +0 -39
  225. package/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/chartjs_ext.js +0 -100
  226. package/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/data_culling.js +0 -88
  227. package/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/data_mipmap.js +0 -307
  228. package/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/index.js +0 -46
  229. package/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/lttb_data_mipmap.js +0 -232
  230. package/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/responsive_downsample_plugin.js +0 -350
  231. package/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/utils.js +0 -142
  232. package/esm5/src/nameserver-history-viewer/utils/chartjs-zoom/chart.zoom.js +0 -733
  233. package/esm5/src/nameserver-history-viewer/utils/chartjs-zoom/index.js +0 -6
  234. package/esm5/src/nameserver-history-viewer/utils/file-util.js +0 -150
  235. package/esm5/src/nameserver-history-viewer/utils/index.js +0 -9
  236. package/esm5/src/nameserver-history-viewer/utils/time-util.js +0 -135
  237. package/esm5/src/nameserver-history-viewer/utils/ui-util.js +0 -205
  238. package/fesm2015/ngx-hana-nameserver-history-viewer.js +0 -5223
  239. package/fesm2015/ngx-hana-nameserver-history-viewer.js.map +0 -1
  240. package/fesm5/ngx-hana-nameserver-history-viewer.js +0 -6295
  241. package/fesm5/ngx-hana-nameserver-history-viewer.js.map +0 -1
  242. package/ngx-hana-nameserver-history-viewer.metadata.json +0 -1
@@ -0,0 +1,527 @@
1
+ /**
2
+ * this plugin is adapted from: https://github.com/chartjs/chartjs-plugin-zoom
3
+ * for following two open issues:
4
+ * https://github.com/chartjs/chartjs-plugin-zoom/pull/155
5
+ * https://github.com/chartjs/chartjs-plugin-zoom/pull/150
6
+ *
7
+ * The MIT License (MIT) Copyright (c) 2013-2016 Nick Downie
8
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of this
9
+ * software and associated documentation files (the "Software"), to deal in the Software
10
+ * without restriction, including without limitation the rights to use, copy, modify, merge,
11
+ * publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
12
+ * to whom the Software is furnished to do so, subject to the following conditions:
13
+ *
14
+ * The above copyright notice and this permission notice shall be included in all copies or
15
+ * substantial portions of the Software.
16
+ *
17
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
18
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
19
+ * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
20
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
+ * THE SOFTWARE.
23
+ */
24
+ /*jslint browser:true, devel:true, white:true, vars:true */
25
+ /*global require*/
26
+ // hammer JS for touch support
27
+ import * as hammerjs from 'hammerjs';
28
+ const Hammer = window && window.Hammer ? window.Hammer : hammerjs.Hammer;
29
+ // Get the chart variable
30
+ import * as chartjs from 'chart.js';
31
+ const Chart = window && window.Chart ? window.Chart : chartjs.Chart;
32
+ const helpers = Chart.helpers;
33
+ // Take the zoom namespace of Chart
34
+ const zoomNS = Chart.Zoom = Chart.Zoom || {};
35
+ // Where we store functions to handle different scale types
36
+ const zoomFunctions = zoomNS.zoomFunctions = zoomNS.zoomFunctions || {};
37
+ const panFunctions = zoomNS.panFunctions = zoomNS.panFunctions || {};
38
+ // Default options if none are provided
39
+ const defaultOptions = zoomNS.defaults = {
40
+ pan: {
41
+ enabled: true,
42
+ mode: 'xy',
43
+ speed: 20,
44
+ threshold: 10
45
+ },
46
+ zoom: {
47
+ enabled: true,
48
+ mode: 'xy',
49
+ sensitivity: 3
50
+ }
51
+ };
52
+ function directionEnabled(mode, dir) {
53
+ if (mode === undefined) {
54
+ return true;
55
+ }
56
+ else if (typeof mode === 'string') {
57
+ return mode.indexOf(dir) !== -1;
58
+ }
59
+ return false;
60
+ }
61
+ function rangeMaxLimiter(zoomPanOptions, newMax) {
62
+ if (zoomPanOptions.scaleAxes && zoomPanOptions.rangeMax &&
63
+ !helpers.isNullOrUndef(zoomPanOptions.rangeMax[zoomPanOptions.scaleAxes])) {
64
+ const rangeMax = zoomPanOptions.rangeMax[zoomPanOptions.scaleAxes];
65
+ if (newMax > rangeMax) {
66
+ newMax = rangeMax;
67
+ }
68
+ }
69
+ return newMax;
70
+ }
71
+ function rangeMinLimiter(zoomPanOptions, newMin) {
72
+ if (zoomPanOptions.scaleAxes && zoomPanOptions.rangeMin &&
73
+ !helpers.isNullOrUndef(zoomPanOptions.rangeMin[zoomPanOptions.scaleAxes])) {
74
+ const rangeMin = zoomPanOptions.rangeMin[zoomPanOptions.scaleAxes];
75
+ if (newMin < rangeMin) {
76
+ newMin = rangeMin;
77
+ }
78
+ }
79
+ return newMin;
80
+ }
81
+ function zoomIndexScale(scale, zoom, center, zoomOptions) {
82
+ const labels = scale.chart.data.labels;
83
+ let minIndex = scale.minIndex;
84
+ const lastLabelIndex = labels.length - 1;
85
+ let maxIndex = scale.maxIndex;
86
+ const sensitivity = zoomOptions.sensitivity;
87
+ const chartCenter = scale.isHorizontal() ? scale.left + (scale.width / 2) : scale.top + (scale.height / 2);
88
+ const centerPointer = scale.isHorizontal() ? center.x : center.y;
89
+ zoomNS.zoomCumulativeDelta = zoom > 1 ? zoomNS.zoomCumulativeDelta + 1 : zoomNS.zoomCumulativeDelta - 1;
90
+ if (Math.abs(zoomNS.zoomCumulativeDelta) > sensitivity) {
91
+ if (zoomNS.zoomCumulativeDelta < 0) {
92
+ if (centerPointer >= chartCenter) {
93
+ if (minIndex <= 0) {
94
+ maxIndex = Math.min(lastLabelIndex, maxIndex + 1);
95
+ }
96
+ else {
97
+ minIndex = Math.max(0, minIndex - 1);
98
+ }
99
+ }
100
+ else if (centerPointer < chartCenter) {
101
+ if (maxIndex >= lastLabelIndex) {
102
+ minIndex = Math.max(0, minIndex - 1);
103
+ }
104
+ else {
105
+ maxIndex = Math.min(lastLabelIndex, maxIndex + 1);
106
+ }
107
+ }
108
+ zoomNS.zoomCumulativeDelta = 0;
109
+ }
110
+ else if (zoomNS.zoomCumulativeDelta > 0) {
111
+ if (centerPointer >= chartCenter) {
112
+ minIndex = minIndex < maxIndex ? minIndex = Math.min(maxIndex, minIndex + 1) : minIndex;
113
+ }
114
+ else if (centerPointer < chartCenter) {
115
+ maxIndex = maxIndex > minIndex ? maxIndex = Math.max(minIndex, maxIndex - 1) : maxIndex;
116
+ }
117
+ zoomNS.zoomCumulativeDelta = 0;
118
+ }
119
+ scale.options.ticks.min = rangeMinLimiter(zoomOptions, labels[minIndex]);
120
+ scale.options.ticks.max = rangeMaxLimiter(zoomOptions, labels[maxIndex]);
121
+ }
122
+ }
123
+ function zoomTimeScale(scale, zoom, center, zoomOptions) {
124
+ const options = scale.options;
125
+ // var range;
126
+ // var min_percent;
127
+ // if (scale.isHorizontal()) {
128
+ // range = scale.right - scale.left;
129
+ // min_percent = (center.x - scale.left) / range;
130
+ // } else {
131
+ // range = scale.bottom - scale.top;
132
+ // min_percent = (center.y - scale.top) / range;
133
+ // }
134
+ //
135
+ // var max_percent = 1 - min_percent;
136
+ const range = scale.max - scale.min;
137
+ const newDiff = range * (zoom - 1);
138
+ const cursorPixel = scale.isHorizontal() ? center.x : center.y;
139
+ const min_percent = (scale.getValueForPixel(cursorPixel) - scale.min) / range;
140
+ const max_percent = 1 - min_percent;
141
+ const minDelta = newDiff * min_percent;
142
+ const maxDelta = newDiff * max_percent;
143
+ const newMin = scale.min + minDelta;
144
+ const newMax = scale.max - maxDelta;
145
+ const diffMinMax = newMax - newMin;
146
+ const minLimitExceeded = rangeMinLimiter(zoomOptions, diffMinMax) !== diffMinMax;
147
+ const maxLimitExceeded = rangeMaxLimiter(zoomOptions, diffMinMax) !== diffMinMax;
148
+ if (!minLimitExceeded && !maxLimitExceeded) {
149
+ options.time.min = newMin;
150
+ options.time.max = newMax;
151
+ }
152
+ }
153
+ function zoomNumericalScale(scale, zoom, center, zoomOptions) {
154
+ const range = scale.max - scale.min;
155
+ const newDiff = range * (zoom - 1);
156
+ const cursorPixel = scale.isHorizontal() ? center.x : center.y;
157
+ const min_percent = (scale.getValueForPixel(cursorPixel) - scale.min) / range;
158
+ const max_percent = 1 - min_percent;
159
+ const minDelta = newDiff * min_percent;
160
+ const maxDelta = newDiff * max_percent;
161
+ scale.options.ticks.min = rangeMinLimiter(zoomOptions, scale.min + minDelta);
162
+ scale.options.ticks.max = rangeMaxLimiter(zoomOptions, scale.max - maxDelta);
163
+ }
164
+ function zoomScale(scale, zoom, center, zoomOptions) {
165
+ const fn = zoomFunctions[scale.options.type];
166
+ if (fn) {
167
+ fn(scale, zoom, center, zoomOptions);
168
+ }
169
+ }
170
+ function doZoom(chartInstance, zoom, center, whichAxes) {
171
+ const ca = chartInstance.chartArea;
172
+ if (!center) {
173
+ center = {
174
+ x: (ca.left + ca.right) / 2,
175
+ y: (ca.top + ca.bottom) / 2,
176
+ };
177
+ }
178
+ const zoomOptions = chartInstance.options.zoom;
179
+ if (zoomOptions && helpers.getValueOrDefault(zoomOptions.enabled, defaultOptions.zoom.enabled)) {
180
+ // Do the zoom here
181
+ const zoomMode = helpers.getValueOrDefault(chartInstance.options.zoom.mode, defaultOptions.zoom.mode);
182
+ zoomOptions.sensitivity = helpers.getValueOrDefault(chartInstance.options.zoom.sensitivity, defaultOptions.zoom.sensitivity);
183
+ // Which axe should be modified when figers were used.
184
+ let _whichAxes;
185
+ if (zoomMode === 'xy' && whichAxes !== undefined) {
186
+ // based on fingers positions
187
+ _whichAxes = whichAxes;
188
+ }
189
+ else {
190
+ // no effect
191
+ _whichAxes = 'xy';
192
+ }
193
+ helpers.each(chartInstance.scales, function (scale, id) {
194
+ if (scale.isHorizontal() && directionEnabled(zoomMode, 'x') && directionEnabled(_whichAxes, 'x')) {
195
+ zoomOptions.scaleAxes = 'x';
196
+ zoomScale(scale, zoom, center, zoomOptions);
197
+ }
198
+ else if (!scale.isHorizontal() && directionEnabled(zoomMode, 'y') && directionEnabled(_whichAxes, 'y')) {
199
+ // Do Y zoom
200
+ zoomOptions.scaleAxes = 'y';
201
+ zoomScale(scale, zoom, center, zoomOptions);
202
+ }
203
+ });
204
+ chartInstance.update(0);
205
+ if (typeof zoomOptions.onZoom === 'function') {
206
+ zoomOptions.onZoom();
207
+ }
208
+ }
209
+ }
210
+ function panIndexScale(scale, delta, panOptions) {
211
+ const labels = scale.chart.data.labels;
212
+ const lastLabelIndex = labels.length - 1;
213
+ const offsetAmt = Math.max((scale.ticks.length - ((scale.options.gridLines.offsetGridLines) ? 0 : 1)), 1);
214
+ const panSpeed = panOptions.speed;
215
+ let minIndex = scale.minIndex;
216
+ const step = Math.round(scale.width / (offsetAmt * panSpeed));
217
+ let maxIndex;
218
+ zoomNS.panCumulativeDelta += delta;
219
+ minIndex = zoomNS.panCumulativeDelta > step ? Math.max(0, minIndex - 1) : zoomNS.panCumulativeDelta < -step ? Math.min(lastLabelIndex - offsetAmt + 1, minIndex + 1) : minIndex;
220
+ zoomNS.panCumulativeDelta = minIndex !== scale.minIndex ? 0 : zoomNS.panCumulativeDelta;
221
+ maxIndex = Math.min(lastLabelIndex, minIndex + offsetAmt - 1);
222
+ scale.options.ticks.min = rangeMinLimiter(panOptions, labels[minIndex]);
223
+ scale.options.ticks.max = rangeMaxLimiter(panOptions, labels[maxIndex]);
224
+ }
225
+ function panTimeScale(scale, delta, panOptions) {
226
+ const options = scale.options;
227
+ const limitedMax = rangeMaxLimiter(panOptions, scale.getValueForPixel(scale.getPixelForValue(scale.max) - delta));
228
+ const limitedMin = rangeMinLimiter(panOptions, scale.getValueForPixel(scale.getPixelForValue(scale.min) - delta));
229
+ const limitedTimeDelta = delta < 0 ? limitedMax - scale.max : limitedMin - scale.min;
230
+ options.time.max = scale.max + limitedTimeDelta;
231
+ options.time.min = scale.min + limitedTimeDelta;
232
+ }
233
+ function panNumericalScale(scale, delta, panOptions) {
234
+ const tickOpts = scale.options.ticks;
235
+ const start = scale.start, end = scale.end;
236
+ if (tickOpts.reverse) {
237
+ tickOpts.max = scale.getValueForPixel(scale.getPixelForValue(start) - delta);
238
+ tickOpts.min = scale.getValueForPixel(scale.getPixelForValue(end) - delta);
239
+ }
240
+ else {
241
+ tickOpts.min = scale.getValueForPixel(scale.getPixelForValue(start) - delta);
242
+ tickOpts.max = scale.getValueForPixel(scale.getPixelForValue(end) - delta);
243
+ }
244
+ tickOpts.min = rangeMinLimiter(panOptions, tickOpts.min);
245
+ tickOpts.max = rangeMaxLimiter(panOptions, tickOpts.max);
246
+ }
247
+ function panScale(scale, delta, panOptions) {
248
+ const fn = panFunctions[scale.options.type];
249
+ if (fn) {
250
+ fn(scale, delta, panOptions);
251
+ }
252
+ }
253
+ function doPan(chartInstance, deltaX, deltaY) {
254
+ const panOptions = chartInstance.options.pan;
255
+ if (panOptions && helpers.getValueOrDefault(panOptions.enabled, defaultOptions.pan.enabled)) {
256
+ const panMode = helpers.getValueOrDefault(chartInstance.options.pan.mode, defaultOptions.pan.mode);
257
+ panOptions.speed = helpers.getValueOrDefault(chartInstance.options.pan.speed, defaultOptions.pan.speed);
258
+ helpers.each(chartInstance.scales, function (scale, id) {
259
+ if (scale.isHorizontal() && directionEnabled(panMode, 'x') && deltaX !== 0) {
260
+ panOptions.scaleAxes = 'x';
261
+ panScale(scale, deltaX, panOptions);
262
+ }
263
+ else if (!scale.isHorizontal() && directionEnabled(panMode, 'y') && deltaY !== 0) {
264
+ panOptions.scaleAxes = 'y';
265
+ panScale(scale, deltaY, panOptions);
266
+ }
267
+ });
268
+ chartInstance.update(0);
269
+ if (typeof panOptions.onPan === 'function') {
270
+ panOptions.onPan();
271
+ }
272
+ }
273
+ }
274
+ function positionInChartArea(chartInstance, position) {
275
+ return (position.x >= chartInstance.chartArea.left && position.x <= chartInstance.chartArea.right) &&
276
+ (position.y >= chartInstance.chartArea.top && position.y <= chartInstance.chartArea.bottom);
277
+ }
278
+ function getYAxis(chartInstance) {
279
+ const scales = chartInstance.scales;
280
+ for (const scaleId in scales) {
281
+ if (scales.hasOwnProperty(scaleId)) {
282
+ const scale = scales[scaleId];
283
+ if (!scale.isHorizontal()) {
284
+ return scale;
285
+ }
286
+ }
287
+ }
288
+ }
289
+ // Store these for later
290
+ zoomNS.zoomFunctions.category = zoomIndexScale;
291
+ zoomNS.zoomFunctions.time = zoomTimeScale;
292
+ zoomNS.zoomFunctions.linear = zoomNumericalScale;
293
+ zoomNS.zoomFunctions.logarithmic = zoomNumericalScale;
294
+ zoomNS.panFunctions.category = panIndexScale;
295
+ zoomNS.panFunctions.time = panTimeScale;
296
+ zoomNS.panFunctions.linear = panNumericalScale;
297
+ zoomNS.panFunctions.logarithmic = panNumericalScale;
298
+ // Globals for catergory pan and zoom
299
+ zoomNS.panCumulativeDelta = 0;
300
+ zoomNS.zoomCumulativeDelta = 0;
301
+ // Chartjs Zoom Plugin
302
+ export const zoomPlugin = {
303
+ afterInit: function (chartInstance) {
304
+ helpers.each(chartInstance.scales, function (scale) {
305
+ scale.originalOptions = helpers.clone(scale.options);
306
+ });
307
+ chartInstance.resetZoom = function () {
308
+ helpers.each(chartInstance.scales, function (scale, id) {
309
+ const timeOptions = scale.options.time;
310
+ const tickOptions = scale.options.ticks;
311
+ if (timeOptions) {
312
+ timeOptions.min = scale.originalOptions.time.min;
313
+ timeOptions.max = scale.originalOptions.time.max;
314
+ }
315
+ if (tickOptions) {
316
+ tickOptions.min = scale.originalOptions.ticks.min;
317
+ tickOptions.max = scale.originalOptions.ticks.max;
318
+ }
319
+ });
320
+ helpers.each(chartInstance.data.datasets, function (dataset, id) {
321
+ dataset._meta = null;
322
+ });
323
+ chartInstance.update();
324
+ };
325
+ },
326
+ beforeInit: function (chartInstance) {
327
+ chartInstance.zoom = {};
328
+ const node = chartInstance.zoom.node = chartInstance.chart.ctx.canvas;
329
+ const options = chartInstance.options;
330
+ const panThreshold = helpers.getValueOrDefault(options.pan ? options.pan.threshold : undefined, zoomNS.defaults.pan.threshold);
331
+ if (!options.zoom || !options.zoom.enabled) {
332
+ return;
333
+ }
334
+ if (options.zoom.drag) {
335
+ // Only want to zoom horizontal axis
336
+ options.zoom.mode = 'x';
337
+ chartInstance.zoom._mouseDownHandler = function (event) {
338
+ chartInstance.zoom._dragZoomStart = event;
339
+ };
340
+ node.addEventListener('mousedown', chartInstance.zoom._mouseDownHandler);
341
+ chartInstance.zoom._mouseMoveHandler = function (event) {
342
+ if (chartInstance.zoom._dragZoomStart) {
343
+ chartInstance.zoom._dragZoomEnd = event;
344
+ chartInstance.update(0);
345
+ }
346
+ };
347
+ node.addEventListener('mousemove', chartInstance.zoom._mouseMoveHandler);
348
+ chartInstance.zoom._mouseUpHandler = function (event) {
349
+ if (chartInstance.zoom._dragZoomStart) {
350
+ const chartArea = chartInstance.chartArea;
351
+ const yAxis = getYAxis(chartInstance);
352
+ const beginPoint = chartInstance.zoom._dragZoomStart;
353
+ const offsetX = beginPoint.target.getBoundingClientRect().left;
354
+ const startX = Math.max(Math.min(beginPoint.clientX, event.clientX) - offsetX, chartArea.left);
355
+ const endX = Math.min(Math.max(beginPoint.clientX, event.clientX) - offsetX, chartArea.right);
356
+ const dragDistance = endX - startX;
357
+ const chartDistance = chartArea.right - chartArea.left;
358
+ const zoom = 1 + (chartDistance - dragDistance) / chartDistance;
359
+ const centerX = chartArea.left + (startX - chartArea.left) / (zoom - 1);
360
+ // Remove drag start and end before chart update to stop drawing selected area
361
+ chartInstance.zoom._dragZoomStart = null;
362
+ chartInstance.zoom._dragZoomEnd = null;
363
+ if (dragDistance > 0) {
364
+ doZoom(chartInstance, zoom, {
365
+ x: centerX,
366
+ y: (yAxis.bottom - yAxis.top) / 2,
367
+ });
368
+ }
369
+ }
370
+ };
371
+ // node.addEventListener('mouseup', chartInstance.zoom._mouseUpHandler);
372
+ node.ownerDocument.addEventListener('mouseup', chartInstance.zoom._mouseUpHandler);
373
+ }
374
+ else {
375
+ chartInstance.zoom._wheelHandler = function (event) {
376
+ const rect = event.target.getBoundingClientRect();
377
+ const offsetX = event.clientX - rect.left;
378
+ const offsetY = event.clientY - rect.top;
379
+ const center = {
380
+ x: offsetX,
381
+ y: offsetY
382
+ };
383
+ if (event.deltaY < 0) {
384
+ doZoom(chartInstance, 1.1, center);
385
+ }
386
+ else {
387
+ doZoom(chartInstance, 0.909, center);
388
+ }
389
+ // Prevent the event from triggering the default behavior (eg. Content scrolling).
390
+ event.preventDefault();
391
+ };
392
+ node.addEventListener('wheel', chartInstance.zoom._wheelHandler);
393
+ }
394
+ if (Hammer) {
395
+ const mc = new Hammer.Manager(node);
396
+ mc.add(new Hammer.Pinch());
397
+ mc.add(new Hammer.Pan({
398
+ threshold: panThreshold
399
+ }));
400
+ // Hammer reports the total scaling. We need the incremental amount
401
+ let currentPinchScaling;
402
+ const handlePinch = function (e) {
403
+ const diff = 1 / (currentPinchScaling) * e.scale;
404
+ const rect = e.target.getBoundingClientRect();
405
+ const offsetX = e.center.x - rect.left;
406
+ const offsetY = e.center.y - rect.top;
407
+ const center = {
408
+ x: offsetX,
409
+ y: offsetY
410
+ };
411
+ // fingers position difference
412
+ const x = Math.abs(e.pointers[0].clientX - e.pointers[1].clientX);
413
+ const y = Math.abs(e.pointers[0].clientY - e.pointers[1].clientY);
414
+ // diagonal fingers will change both (xy) axes
415
+ const p = x / y;
416
+ let xy;
417
+ if (p > 0.3 && p < 1.7) {
418
+ xy = 'xy';
419
+ }
420
+ else if (x > y) {
421
+ // x axis
422
+ xy = 'x';
423
+ }
424
+ else {
425
+ // y axis
426
+ xy = 'y';
427
+ }
428
+ doZoom(chartInstance, diff, center, xy);
429
+ // Keep track of overall scale
430
+ currentPinchScaling = e.scale;
431
+ };
432
+ mc.on('pinchstart', function (e) {
433
+ currentPinchScaling = 1; // reset tracker
434
+ });
435
+ mc.on('pinch', handlePinch);
436
+ mc.on('pinchend', function (e) {
437
+ handlePinch(e);
438
+ currentPinchScaling = null; // reset
439
+ zoomNS.zoomCumulativeDelta = 0;
440
+ });
441
+ let currentDeltaX = null, currentDeltaY = null, panning = false;
442
+ const handlePan = function (e) {
443
+ if (currentDeltaX !== null && currentDeltaY !== null) {
444
+ panning = true;
445
+ const deltaX = e.deltaX - currentDeltaX;
446
+ const deltaY = e.deltaY - currentDeltaY;
447
+ currentDeltaX = e.deltaX;
448
+ currentDeltaY = e.deltaY;
449
+ doPan(chartInstance, deltaX, deltaY);
450
+ }
451
+ };
452
+ mc.on('panstart', function (e) {
453
+ currentDeltaX = 0;
454
+ currentDeltaY = 0;
455
+ handlePan(e);
456
+ });
457
+ mc.on('panmove', handlePan);
458
+ mc.on('panend', function (e) {
459
+ currentDeltaX = null;
460
+ currentDeltaY = null;
461
+ zoomNS.panCumulativeDelta = 0;
462
+ setTimeout(function () { panning = false; }, 500);
463
+ });
464
+ chartInstance.zoom._ghostClickHandler = function (e) {
465
+ if (panning) {
466
+ e.stopImmediatePropagation();
467
+ e.preventDefault();
468
+ }
469
+ };
470
+ node.addEventListener('click', chartInstance.zoom._ghostClickHandler);
471
+ chartInstance._mc = mc;
472
+ }
473
+ },
474
+ beforeDatasetsDraw: function (chartInstance) {
475
+ const ctx = chartInstance.chart.ctx;
476
+ const chartArea = chartInstance.chartArea;
477
+ ctx.save();
478
+ ctx.beginPath();
479
+ if (chartInstance.zoom._dragZoomEnd) {
480
+ const yAxis = getYAxis(chartInstance);
481
+ const beginPoint = chartInstance.zoom._dragZoomStart;
482
+ const endPoint = chartInstance.zoom._dragZoomEnd;
483
+ const offsetX = beginPoint.target.getBoundingClientRect().left;
484
+ const startX = Math.min(beginPoint.clientX, endPoint.clientX) - offsetX;
485
+ const endX = Math.max(beginPoint.clientX, endPoint.clientX) - offsetX;
486
+ const rectWidth = endX - startX;
487
+ ctx.fillStyle = 'rgba(225,225,225,0.5)';
488
+ ctx.lineWidth = 5;
489
+ ctx.fillRect(startX, yAxis.top, rectWidth, yAxis.bottom - yAxis.top);
490
+ }
491
+ ctx.rect(chartArea.left, chartArea.top, chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);
492
+ ctx.clip();
493
+ },
494
+ afterDatasetsDraw: function (chartInstance) {
495
+ chartInstance.chart.ctx.restore();
496
+ },
497
+ destroy: function (chartInstance) {
498
+ if (chartInstance.zoom) {
499
+ const options = chartInstance.options;
500
+ const node = chartInstance.zoom.node;
501
+ if (options.zoom && options.zoom.drag) {
502
+ node.removeEventListener('mousedown', chartInstance.zoom._mouseDownHandler);
503
+ node.removeEventListener('mousemove', chartInstance.zoom._mouseMoveHandler);
504
+ // node.removeEventListener('mouseup', chartInstance.zoom._mouseUpHandler);
505
+ node.ownerDocument.removeEventListener('mouseup', chartInstance.zoom._mouseUpHandler);
506
+ }
507
+ else {
508
+ node.removeEventListener('wheel', chartInstance.zoom._wheelHandler);
509
+ }
510
+ if (Hammer) {
511
+ node.removeEventListener('click', chartInstance.zoom._ghostClickHandler);
512
+ }
513
+ delete chartInstance.zoom;
514
+ const mc = chartInstance._mc;
515
+ if (mc) {
516
+ mc.remove('pinchstart');
517
+ mc.remove('pinch');
518
+ mc.remove('pinchend');
519
+ mc.remove('panstart');
520
+ mc.remove('pan');
521
+ mc.remove('panend');
522
+ }
523
+ }
524
+ }
525
+ };
526
+ Chart.pluginService.register(zoomPlugin);
527
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuem9vbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9uYW1lc2VydmVyLWhpc3Rvcnktdmlld2VyL3V0aWxzL2NoYXJ0anMtem9vbS9jaGFydC56b29tLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBRUgsMkRBQTJEO0FBQzNELGtCQUFrQjtBQUVsQiw4QkFBOEI7QUFDOUIsT0FBTyxLQUFLLFFBQVEsTUFBTSxVQUFVLENBQUM7QUFDckMsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFLLE1BQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFFLE1BQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7QUFFM0YseUJBQXlCO0FBQ3pCLE9BQU8sS0FBSyxPQUFPLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSyxNQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBRSxNQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO0FBRXRGLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7QUFFOUIsbUNBQW1DO0FBQ25DLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7QUFFN0MsMkRBQTJEO0FBQzNELE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLGFBQWEsSUFBSSxFQUFFLENBQUM7QUFDeEUsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQztBQUVyRSx1Q0FBdUM7QUFDdkMsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLFFBQVEsR0FBRztJQUN2QyxHQUFHLEVBQUU7UUFD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TTtnQkFDTCxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDckU7WUFFRCxJQUFJLE1BQU0sRUFBRTtnQkFDVixJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQzthQUMxRTtZQUVELE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQztZQUUxQixNQUFNLEVBQUUsR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDO1lBQzdCLElBQUksRUFBRSxFQUFFO2dCQUNOLEVBQUUsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ3hCLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ25CLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3RCLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3RCLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2pCLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDckI7U0FDRjtJQUNILENBQUM7Q0FDRixDQUFDO0FBRUYsS0FBSyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogdGhpcyBwbHVnaW4gaXMgYWRhcHRlZCBmcm9tOiBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9jaGFydGpzLXBsdWdpbi16b29tXHJcbiAqIGZvciBmb2xsb3dpbmcgdHdvIG9wZW4gaXNzdWVzOlxyXG4gKiBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9jaGFydGpzLXBsdWdpbi16b29tL3B1bGwvMTU1XHJcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL2NoYXJ0anMtcGx1Z2luLXpvb20vcHVsbC8xNTBcclxuICpcclxuICogVGhlIE1JVCBMaWNlbnNlIChNSVQpIENvcHlyaWdodCAoYykgMjAxMy0yMDE2IE5pY2sgRG93bmllXHJcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpc1xyXG4gKiBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmVcclxuICogd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSxcclxuICogcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zXHJcbiAqIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XHJcbiAqXHJcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3JcclxuICogc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxyXG4gKlxyXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElOR1xyXG4gKiBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxyXG4gKiBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWVxyXG4gKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSxcclxuICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXHJcbiAqIFRIRSBTT0ZUV0FSRS5cclxuICovXHJcblxyXG4vKmpzbGludCBicm93c2VyOnRydWUsIGRldmVsOnRydWUsIHdoaXRlOnRydWUsIHZhcnM6dHJ1ZSAqL1xyXG4vKmdsb2JhbCByZXF1aXJlKi9cclxuXHJcbi8vIGhhbW1lciBKUyBmb3IgdG91Y2ggc3VwcG9ydFxyXG5pbXBvcnQgKiBhcyBoYW1tZXJqcyBmcm9tICdoYW1tZXJqcyc7XHJcbmNvbnN0IEhhbW1lciA9IHdpbmRvdyAmJiAod2luZG93IGFzIGFueSkuSGFtbWVyID8gKHdpbmRvdyBhcyBhbnkpLkhhbW1lciA6IGhhbW1lcmpzLkhhbW1lcjtcclxuXHJcbi8vIEdldCB0aGUgY2hhcnQgdmFyaWFibGVcclxuaW1wb3J0ICogYXMgY2hhcnRqcyBmcm9tICdjaGFydC5qcyc7XHJcbmNvbnN0IENoYXJ0ID0gd2luZG93ICYmICh3aW5kb3cgYXMgYW55KS5DaGFydCA/ICh3aW5kb3cgYXMgYW55KS5DaGFydCA6IGNoYXJ0anMuQ2hhcnQ7XHJcblxyXG5jb25zdCBoZWxwZXJzID0gQ2hhcnQuaGVscGVycztcclxuXHJcbi8vIFRha2UgdGhlIHpvb20gbmFtZXNwYWNlIG9mIENoYXJ0XHJcbmNvbnN0IHpvb21OUyA9IENoYXJ0Llpvb20gPSBDaGFydC5ab29tIHx8IHt9O1xyXG5cclxuLy8gV2hlcmUgd2Ugc3RvcmUgZnVuY3Rpb25zIHRvIGhhbmRsZSBkaWZmZXJlbnQgc2NhbGUgdHlwZXNcclxuY29uc3Qgem9vbUZ1bmN0aW9ucyA9IHpvb21OUy56b29tRnVuY3Rpb25zID0gem9vbU5TLnpvb21GdW5jdGlvbnMgfHwge307XHJcbmNvbnN0IHBhbkZ1bmN0aW9ucyA9IHpvb21OUy5wYW5GdW5jdGlvbnMgPSB6b29tTlMucGFuRnVuY3Rpb25zIHx8IHt9O1xyXG5cclxuLy8gRGVmYXVsdCBvcHRpb25zIGlmIG5vbmUgYXJlIHByb3ZpZGVkXHJcbmNvbnN0IGRlZmF1bHRPcHRpb25zID0gem9vbU5TLmRlZmF1bHRzID0ge1xyXG4gIHBhbjoge1xyXG4gICAgZW5hYmxlZDogdHJ1ZSxcclxuICAgIG1vZGU6ICd4eScsXHJcbiAgICBzcGVlZDogMjAsXHJcbiAgICB0aHJlc2hvbGQ6IDEwXHJcbiAgfSxcclxuICB6b29tOiB7XHJcbiAgICBlbmFibGVkOiB0cnVlLFxyXG4gICAgbW9kZTogJ3h5JyxcclxuICAgIHNlbnNpdGl2aXR5OiAzXHJcbiAgfVxyXG59O1xyXG5cclxuZnVuY3Rpb24gZGlyZWN0aW9uRW5hYmxlZChtb2RlLCBkaXIpIHtcclxuICBpZiAobW9kZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9IGVsc2UgaWYgKHR5cGVvZiBtb2RlID09PSAnc3RyaW5nJykge1xyXG4gICAgcmV0dXJuIG1vZGUuaW5kZXhPZihkaXIpICE9PSAtMTtcclxuICB9XHJcblxyXG4gIHJldHVybiBmYWxzZTtcclxufVxyXG5cclxuZnVuY3Rpb24gcmFuZ2VNYXhMaW1pdGVyKHpvb21QYW5PcHRpb25zLCBuZXdNYXgpIHtcclxuICBpZiAoem9vbVBhbk9wdGlvbnMuc2NhbGVBeGVzICYmIHpvb21QYW5PcHRpb25zLnJhbmdlTWF4ICYmXHJcbiAgICAhaGVscGVycy5pc051bGxPclVuZGVmKHpvb21QYW5PcHRpb25zLnJhbmdlTWF4W3pvb21QYW5PcHRpb25zLnNjYWxlQXhlc10pKSB7XHJcbiAgICBjb25zdCByYW5nZU1heCA9IHpvb21QYW5PcHRpb25zLnJhbmdlTWF4W3pvb21QYW5PcHRpb25zLnNjYWxlQXhlc107XHJcbiAgICBpZiAobmV3TWF4ID4gcmFuZ2VNYXgpIHtcclxuICAgICAgbmV3TWF4ID0gcmFuZ2VNYXg7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiBuZXdNYXg7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJhbmdlTWluTGltaXRlcih6b29tUGFuT3B0aW9ucywgbmV3TWluKSB7XHJcbiAgaWYgKHpvb21QYW5PcHRpb25zLnNjYWxlQXhlcyAmJiB6b29tUGFuT3B0aW9ucy5yYW5nZU1pbiAmJlxyXG4gICAgIWhlbHBlcnMuaXNOdWxsT3JVbmRlZih6b29tUGFuT3B0aW9ucy5yYW5nZU1pblt6b29tUGFuT3B0aW9ucy5zY2FsZUF4ZXNdKSkge1xyXG4gICAgY29uc3QgcmFuZ2VNaW4gPSB6b29tUGFuT3B0aW9ucy5yYW5nZU1pblt6b29tUGFuT3B0aW9ucy5zY2FsZUF4ZXNdO1xyXG4gICAgaWYgKG5ld01pbiA8IHJhbmdlTWluKSB7XHJcbiAgICAgIG5ld01pbiA9IHJhbmdlTWluO1xyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gbmV3TWluO1xyXG59XHJcblxyXG5mdW5jdGlvbiB6b29tSW5kZXhTY2FsZShzY2FsZSwgem9vbSwgY2VudGVyLCB6b29tT3B0aW9ucykge1xyXG4gIGNvbnN0IGxhYmVscyA9IHNjYWxlLmNoYXJ0LmRhdGEubGFiZWxzO1xyXG4gIGxldCBtaW5JbmRleCA9IHNjYWxlLm1pbkluZGV4O1xyXG4gIGNvbnN0IGxhc3RMYWJlbEluZGV4ID0gbGFiZWxzLmxlbmd0aCAtIDE7XHJcbiAgbGV0IG1heEluZGV4ID0gc2NhbGUubWF4SW5kZXg7XHJcbiAgY29uc3Qgc2Vuc2l0aXZpdHkgPSB6b29tT3B0aW9ucy5zZW5zaXRpdml0eTtcclxuICBjb25zdCBjaGFydENlbnRlciA9ICBzY2FsZS5pc0hvcml6b250YWwoKSA/IHNjYWxlLmxlZnQgKyAoc2NhbGUud2lkdGggLyAyKSA6IHNjYWxlLnRvcCArIChzY2FsZS5oZWlnaHQgLyAyKTtcclxuICBjb25zdCBjZW50ZXJQb2ludGVyID0gc2NhbGUuaXNIb3Jpem9udGFsKCkgPyBjZW50ZXIueCA6IGNlbnRlci55O1xyXG5cclxuICB6b29tTlMuem9vbUN1bXVsYXRpdmVEZWx0YSA9IHpvb20gPiAxID8gem9vbU5TLnpvb21DdW11bGF0aXZlRGVsdGEgKyAxIDogem9vbU5TLnpvb21DdW11bGF0aXZlRGVsdGEgLSAxO1xyXG5cclxuICBpZiAoTWF0aC5hYnMoem9vbU5TLnpvb21DdW11bGF0aXZlRGVsdGEpID4gc2Vuc2l0aXZpdHkpIHtcclxuICAgIGlmICh6b29tTlMuem9vbUN1bXVsYXRpdmVEZWx0YSA8IDApIHtcclxuICAgICAgaWYgKGNlbnRlclBvaW50ZXIgPj0gY2hhcnRDZW50ZXIpIHtcclxuICAgICAgICBpZiAobWluSW5kZXggPD0gMCkge1xyXG4gICAgICAgICAgbWF4SW5kZXggPSBNYXRoLm1pbihsYXN0TGFiZWxJbmRleCwgbWF4SW5kZXggKyAxKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbWluSW5kZXggPSBNYXRoLm1heCgwLCBtaW5JbmRleCAtIDEpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmIChjZW50ZXJQb2ludGVyIDwgY2hhcnRDZW50ZXIpIHtcclxuICAgICAgICBpZiAobWF4SW5kZXggPj0gbGFzdExhYmVsSW5kZXgpIHtcclxuICAgICAgICAgIG1pbkluZGV4ID0gTWF0aC5tYXgoMCwgbWluSW5kZXggLSAxKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbWF4SW5kZXggPSBNYXRoLm1pbihsYXN0TGFiZWxJbmRleCwgbWF4SW5kZXggKyAxKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgem9vbU5TLnpvb21DdW11bGF0aXZlRGVsdGEgPSAwO1xyXG4gICAgfSBlbHNlIGlmICh6b29tTlMuem9vbUN1bXVsYXRpdmVEZWx0YSA+IDApIHtcclxuICAgICAgaWYgKGNlbnRlclBvaW50ZXIgPj0gY2hhcnRDZW50ZXIpIHtcclxuICAgICAgICBtaW5JbmRleCA9IG1pbkluZGV4IDwgbWF4SW5kZXggPyBtaW5JbmRleCA9IE1hdGgubWluKG1heEluZGV4LCBtaW5JbmRleCArIDEpIDogbWluSW5kZXg7XHJcbiAgICAgIH0gZWxzZSBpZiAoY2VudGVyUG9pbnRlciA8IGNoYXJ0Q2VudGVyKSB7XHJcbiAgICAgICAgbWF4SW5kZXggPSBtYXhJbmRleCA+IG1pbkluZGV4ID8gbWF4SW5kZXggPSBNYXRoLm1heChtaW5JbmRleCwgbWF4SW5kZXggLSAxKSA6IG1heEluZGV4O1xyXG4gICAgICB9XHJcbiAgICAgIHpvb21OUy56b29tQ3VtdWxhdGl2ZURlbHRhID0gMDtcclxuICAgIH1cclxuICAgIHNjYWxlLm9wdGlvbnMudGlja3MubWluID0gcmFuZ2VNaW5MaW1pdGVyKHpvb21PcHRpb25zLCBsYWJlbHNbbWluSW5kZXhdKTtcclxuICAgIHNjYWxlLm9wdGlvbnMudGlja3MubWF4ID0gcmFuZ2VNYXhMaW1pdGVyKHpvb21PcHRpb25zLCBsYWJlbHNbbWF4SW5kZXhdKTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHpvb21UaW1lU2NhbGUoc2NhbGUsIHpvb20sIGNlbnRlciwgem9vbU9wdGlvbnMpIHtcclxuICBjb25zdCBvcHRpb25zID0gc2NhbGUub3B0aW9ucztcclxuXHJcbiAgLy8gdmFyIHJhbmdlO1xyXG4gIC8vIHZhciBtaW5fcGVyY2VudDtcclxuICAvLyBpZiAoc2NhbGUuaXNIb3Jpem9udGFsKCkpIHtcclxuICAvLyAgIHJhbmdlID0gc2NhbGUucmlnaHQgLSBzY2FsZS5sZWZ0O1xyXG4gIC8vICAgbWluX3BlcmNlbnQgPSAoY2VudGVyLnggLSBzY2FsZS5sZWZ0KSAvIHJhbmdlO1xyXG4gIC8vIH0gZWxzZSB7XHJcbiAgLy8gICByYW5nZSA9IHNjYWxlLmJvdHRvbSAtIHNjYWxlLnRvcDtcclxuICAvLyAgIG1pbl9wZXJjZW50ID0gKGNlbnRlci55IC0gc2NhbGUudG9wKSAvIHJhbmdlO1xyXG4gIC8vIH1cclxuICAvL1xyXG4gIC8vIHZhciBtYXhfcGVyY2VudCA9IDEgLSBtaW5fcGVyY2VudDtcclxuICBjb25zdCByYW5nZSA9IHNjYWxlLm1heCAtIHNjYWxlLm1pbjtcclxuICBjb25zdCBuZXdEaWZmID0gcmFuZ2UgKiAoem9vbSAtIDEpO1xyXG5cclxuICBjb25zdCBjdXJzb3JQaXhlbCA9IHNjYWxlLmlzSG9yaXpvbnRhbCgpID8gY2VudGVyLnggOiBjZW50ZXIueTtcclxuICBjb25zdCBtaW5fcGVyY2VudCA9IChzY2FsZS5nZXRWYWx1ZUZvclBpeGVsKGN1cnNvclBpeGVsKSAtIHNjYWxlLm1pbikgLyByYW5nZTtcclxuICBjb25zdCBtYXhfcGVyY2VudCA9IDEgLSBtaW5fcGVyY2VudDtcclxuXHJcbiAgY29uc3QgbWluRGVsdGEgPSBuZXdEaWZmICogbWluX3BlcmNlbnQ7XHJcbiAgY29uc3QgbWF4RGVsdGEgPSBuZXdEaWZmICogbWF4X3BlcmNlbnQ7XHJcblxyXG4gIGNvbnN0IG5ld01pbiA9IHNjYWxlLm1pbiArIG1pbkRlbHRhO1xyXG4gIGNvbnN0IG5ld01heCA9IHNjYWxlLm1heCAtIG1heERlbHRhO1xyXG5cclxuICBjb25zdCBkaWZmTWluTWF4ID0gbmV3TWF4IC0gbmV3TWluO1xyXG4gIGNvbnN0IG1pbkxpbWl0RXhjZWVkZWQgPSByYW5nZU1pbkxpbWl0ZXIoem9vbU9wdGlvbnMsIGRpZmZNaW5NYXgpICE9PSBkaWZmTWluTWF4O1xyXG4gIGNvbnN0IG1heExpbWl0RXhjZWVkZWQgPSByYW5nZU1heExpbWl0ZXIoem9vbU9wdGlvbnMsIGRpZmZNaW5NYXgpICE9PSBkaWZmTWluTWF4O1xyXG5cclxuICBpZiAoIW1pbkxpbWl0RXhjZWVkZWQgJiYgIW1heExpbWl0RXhjZWVkZWQpIHtcclxuICAgIG9wdGlvbnMudGltZS5taW4gPSBuZXdNaW47XHJcbiAgICBvcHRpb25zLnRpbWUubWF4ID0gbmV3TWF4O1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gem9vbU51bWVyaWNhbFNjYWxlKHNjYWxlLCB6b29tLCBjZW50ZXIsIHpvb21PcHRpb25zKSB7XHJcbiAgY29uc3QgcmFuZ2UgPSBzY2FsZS5tYXggLSBzY2FsZS5taW47XHJcbiAgY29uc3QgbmV3RGlmZiA9IHJhbmdlICogKHpvb20gLSAxKTtcclxuXHJcbiAgY29uc3QgY3Vyc29yUGl4ZWwgPSBzY2FsZS5pc0hvcml6b250YWwoKSA/IGNlbnRlci54IDogY2VudGVyLnk7XHJcbiAgY29uc3QgbWluX3BlcmNlbnQgPSAoc2NhbGUuZ2V0VmFsdWVGb3JQaXhlbChjdXJzb3JQaXhlbCkgLSBzY2FsZS5taW4pIC8gcmFuZ2U7XHJcbiAgY29uc3QgbWF4X3BlcmNlbnQgPSAxIC0gbWluX3BlcmNlbnQ7XHJcblxyXG4gIGNvbnN0IG1pbkRlbHRhID0gbmV3RGlmZiAqIG1pbl9wZXJjZW50O1xyXG4gIGNvbnN0IG1heERlbHRhID0gbmV3RGlmZiAqIG1heF9wZXJjZW50O1xyXG5cclxuICBzY2FsZS5vcHRpb25zLnRpY2tzLm1pbiA9IHJhbmdlTWluTGltaXRlcih6b29tT3B0aW9ucywgc2NhbGUubWluICsgbWluRGVsdGEpO1xyXG4gIHNjYWxlLm9wdGlvbnMudGlja3MubWF4ID0gcmFuZ2VNYXhMaW1pdGVyKHpvb21PcHRpb25zLCBzY2FsZS5tYXggLSBtYXhEZWx0YSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHpvb21TY2FsZShzY2FsZSwgem9vbSwgY2VudGVyLCB6b29tT3B0aW9ucykge1xyXG4gIGNvbnN0IGZuID0gem9vbUZ1bmN0aW9uc1tzY2FsZS5vcHRpb25zLnR5cGVdO1xyXG4gIGlmIChmbikge1xyXG4gICAgZm4oc2NhbGUsIHpvb20sIGNlbnRlciwgem9vbU9wdGlvbnMpO1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gZG9ab29tKGNoYXJ0SW5zdGFuY2UsIHpvb20sIGNlbnRlciwgd2hpY2hBeGVzPykge1xyXG4gIGNvbnN0IGNhID0gY2hhcnRJbnN0YW5jZS5jaGFydEFyZWE7XHJcbiAgaWYgKCFjZW50ZXIpIHtcclxuICAgIGNlbnRlciA9IHtcclxuICAgICAgeDogKGNhLmxlZnQgKyBjYS5yaWdodCkgLyAyLFxyXG4gICAgICB5OiAoY2EudG9wICsgY2EuYm90dG9tKSAvIDIsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgY29uc3Qgem9vbU9wdGlvbnMgPSBjaGFydEluc3RhbmNlLm9wdGlvbnMuem9vbTtcclxuXHJcbiAgaWYgKHpvb21PcHRpb25zICYmIGhlbHBlcnMuZ2V0VmFsdWVPckRlZmF1bHQoem9vbU9wdGlvbnMuZW5hYmxlZCwgZGVmYXVsdE9wdGlvbnMuem9vbS5lbmFibGVkKSkge1xyXG4gICAgLy8gRG8gdGhlIHpvb20gaGVyZVxyXG4gICAgY29uc3Qgem9vbU1vZGUgPSBoZWxwZXJzLmdldFZhbHVlT3JEZWZhdWx0KGNoYXJ0SW5zdGFuY2Uub3B0aW9ucy56b29tLm1vZGUsIGRlZmF1bHRPcHRpb25zLnpvb20ubW9kZSk7XHJcbiAgICB6b29tT3B0aW9ucy5zZW5zaXRpdml0eSA9IGhlbHBlcnMuZ2V0VmFsdWVPckRlZmF1bHQoY2hhcnRJbnN0YW5jZS5vcHRpb25zLnpvb20uc2Vuc2l0aXZpdHksIGRlZmF1bHRPcHRpb25zLnpvb20uc2Vuc2l0aXZpdHkpO1xyXG5cclxuICAgIC8vIFdoaWNoIGF4ZSBzaG91bGQgYmUgbW9kaWZpZWQgd2hlbiBmaWdlcnMgd2VyZSB1c2VkLlxyXG4gICAgbGV0IF93aGljaEF4ZXM7XHJcbiAgICBpZiAoem9vbU1vZGUgPT09ICd4eScgJiYgd2hpY2hBeGVzICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgLy8gYmFzZWQgb24gZmluZ2VycyBwb3NpdGlvbnNcclxuICAgICAgX3doaWNoQXhlcyA9IHdoaWNoQXhlcztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIG5vIGVmZmVjdFxyXG4gICAgICBfd2hpY2hBeGVzID0gJ3h5JztcclxuICAgIH1cclxuXHJcbiAgICBoZWxwZXJzLmVhY2goY2hhcnRJbnN0YW5jZS5zY2FsZXMsIGZ1bmN0aW9uKHNjYWxlLCBpZCkge1xyXG4gICAgICBpZiAoc2NhbGUuaXNIb3Jpem9udGFsKCkgJiYgZGlyZWN0aW9uRW5hYmxlZCh6b29tTW9kZSwgJ3gnKSAmJiBkaXJlY3Rpb25FbmFibGVkKF93aGljaEF4ZXMsICd4JykpIHtcclxuICAgICAgICB6b29tT3B0aW9ucy5zY2FsZUF4ZXMgPSAneCc7XHJcbiAgICAgICAgem9vbVNjYWxlKHNjYWxlLCB6b29tLCBjZW50ZXIsIHpvb21PcHRpb25zKTtcclxuICAgICAgfSBlbHNlIGlmICghc2NhbGUuaXNIb3Jpem9udGFsKCkgJiYgZGlyZWN0aW9uRW5hYmxlZCh6b29tTW9kZSwgJ3knKSAmJiBkaXJlY3Rpb25FbmFibGVkKF93aGljaEF4ZXMsICd5JykpIHtcclxuICAgICAgICAvLyBEbyBZIHpvb21cclxuICAgICAgICB6b29tT3B0aW9ucy5zY2FsZUF4ZXMgPSAneSc7XHJcbiAgICAgICAgem9vbVNjYWxlKHNjYWxlLCB6b29tLCBjZW50ZXIsIHpvb21PcHRpb25zKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgY2hhcnRJbnN0YW5jZS51cGRhdGUoMCk7XHJcbiAgICBpZiAodHlwZW9mIHpvb21PcHRpb25zLm9uWm9vbSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICB6b29tT3B0aW9ucy5vblpvb20oKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHBhbkluZGV4U2NhbGUoc2NhbGUsIGRlbHRhLCBwYW5PcHRpb25zKSB7XHJcbiAgY29uc3QgbGFiZWxzID0gc2NhbGUuY2hhcnQuZGF0YS5sYWJlbHM7XHJcbiAgY29uc3QgbGFzdExhYmVsSW5kZXggPSBsYWJlbHMubGVuZ3RoIC0gMTtcclxuICBjb25zdCBvZmZzZXRBbXQgPSBNYXRoLm1heCgoc2NhbGUudGlja3MubGVuZ3RoIC0gKChzY2FsZS5vcHRpb25zLmdyaWRMaW5lcy5vZmZzZXRHcmlkTGluZXMpID8gMCA6IDEpKSwgMSk7XHJcbiAgY29uc3QgcGFuU3BlZWQgPSBwYW5PcHRpb25zLnNwZWVkO1xyXG4gIGxldCBtaW5JbmRleCA9IHNjYWxlLm1pbkluZGV4O1xyXG4gIGNvbnN0IHN0ZXAgPSBNYXRoLnJvdW5kKHNjYWxlLndpZHRoIC8gKG9mZnNldEFtdCAqIHBhblNwZWVkKSk7XHJcbiAgbGV0IG1heEluZGV4O1xyXG5cclxuICB6b29tTlMucGFuQ3VtdWxhdGl2ZURlbHRhICs9IGRlbHRhO1xyXG5cclxuICBtaW5JbmRleCA9IHpvb21OUy5wYW5DdW11bGF0aXZlRGVsdGEgPiBzdGVwID8gTWF0aC5tYXgoMCwgbWluSW5kZXggLSAxKSA6IHpvb21OUy5wYW5DdW11bGF0aXZlRGVsdGEgPCAtc3RlcCA/IE1hdGgubWluKGxhc3RMYWJlbEluZGV4IC0gb2Zmc2V0QW10ICsgMSwgbWluSW5kZXggKyAxKSA6IG1pbkluZGV4O1xyXG4gIHpvb21OUy5wYW5DdW11bGF0aXZlRGVsdGEgPSBtaW5JbmRleCAhPT0gc2NhbGUubWluSW5kZXggPyAwIDogem9vbU5TLnBhbkN1bXVsYXRpdmVEZWx0YTtcclxuXHJcbiAgbWF4SW5kZXggPSBNYXRoLm1pbihsYXN0TGFiZWxJbmRleCwgbWluSW5kZXggKyBvZmZzZXRBbXQgLSAxKTtcclxuXHJcbiAgc2NhbGUub3B0aW9ucy50aWNrcy5taW4gPSByYW5nZU1pbkxpbWl0ZXIocGFuT3B0aW9ucywgbGFiZWxzW21pbkluZGV4XSk7XHJcbiAgc2NhbGUub3B0aW9ucy50aWNrcy5tYXggPSByYW5nZU1heExpbWl0ZXIocGFuT3B0aW9ucywgbGFiZWxzW21heEluZGV4XSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHBhblRpbWVTY2FsZShzY2FsZSwgZGVsdGEsIHBhbk9wdGlvbnMpIHtcclxuICBjb25zdCBvcHRpb25zID0gc2NhbGUub3B0aW9ucztcclxuICBjb25zdCBsaW1pdGVkTWF4ID0gcmFuZ2VNYXhMaW1pdGVyKHBhbk9wdGlvbnMsIHNjYWxlLmdldFZhbHVlRm9yUGl4ZWwoc2NhbGUuZ2V0UGl4ZWxGb3JWYWx1ZShzY2FsZS5tYXgpIC0gZGVsdGEpKTtcclxuICBjb25zdCBsaW1pdGVkTWluID0gcmFuZ2VNaW5MaW1pdGVyKHBhbk9wdGlvbnMsIHNjYWxlLmdldFZhbHVlRm9yUGl4ZWwoc2NhbGUuZ2V0UGl4ZWxGb3JWYWx1ZShzY2FsZS5taW4pIC0gZGVsdGEpKTtcclxuXHJcbiAgY29uc3QgbGltaXRlZFRpbWVEZWx0YSA9IGRlbHRhIDwgMCA/IGxpbWl0ZWRNYXggLSBzY2FsZS5tYXggOiBsaW1pdGVkTWluIC0gc2NhbGUubWluO1xyXG5cclxuICBvcHRpb25zLnRpbWUubWF4ID0gc2NhbGUubWF4ICsgbGltaXRlZFRpbWVEZWx0YTtcclxuICBvcHRpb25zLnRpbWUubWluID0gc2NhbGUubWluICsgbGltaXRlZFRpbWVEZWx0YTtcclxufVxyXG5cclxuZnVuY3Rpb24gcGFuTnVtZXJpY2FsU2NhbGUoc2NhbGUsIGRlbHRhLCBwYW5PcHRpb25zKSB7XHJcbiAgY29uc3QgdGlja09wdHMgPSBzY2FsZS5vcHRpb25zLnRpY2tzO1xyXG4gIGNvbnN0IHN0YXJ0ID0gc2NhbGUuc3RhcnQsXHJcbiAgICBlbmQgPSBzY2FsZS5lbmQ7XHJcblxyXG4gIGlmICh0aWNrT3B0cy5yZXZlcnNlKSB7XHJcbiAgICB0aWNrT3B0cy5tYXggPSBzY2FsZS5nZXRWYWx1ZUZvclBpeGVsKHNjYWxlLmdldFBpeGVsRm9yVmFsdWUoc3RhcnQpIC0gZGVsdGEpO1xyXG4gICAgdGlja09wdHMubWluID0gc2NhbGUuZ2V0VmFsdWVGb3JQaXhlbChzY2FsZS5nZXRQaXhlbEZvclZhbHVlKGVuZCkgLSBkZWx0YSk7XHJcbiAgfSBlbHNlIHtcclxuICAgIHRpY2tPcHRzLm1pbiA9IHNjYWxlLmdldFZhbHVlRm9yUGl4ZWwoc2NhbGUuZ2V0UGl4ZWxGb3JWYWx1ZShzdGFydCkgLSBkZWx0YSk7XHJcbiAgICB0aWNrT3B0cy5tYXggPSBzY2FsZS5nZXRWYWx1ZUZvclBpeGVsKHNjYWxlLmdldFBpeGVsRm9yVmFsdWUoZW5kKSAtIGRlbHRhKTtcclxuICB9XHJcbiAgdGlja09wdHMubWluID0gcmFuZ2VNaW5MaW1pdGVyKHBhbk9wdGlvbnMsIHRpY2tPcHRzLm1pbik7XHJcbiAgdGlja09wdHMubWF4ID0gcmFuZ2VNYXhMaW1pdGVyKHBhbk9wdGlvbnMsIHRpY2tPcHRzLm1heCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHBhblNjYWxlKHNjYWxlLCBkZWx0YSwgcGFuT3B0aW9ucykge1xyXG4gIGNvbnN0IGZuID0gcGFuRnVuY3Rpb25zW3NjYWxlLm9wdGlvbnMudHlwZV07XHJcbiAgaWYgKGZuKSB7XHJcbiAgICBmbihzY2FsZSwgZGVsdGEsIHBhbk9wdGlvbnMpO1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gZG9QYW4oY2hhcnRJbnN0YW5jZSwgZGVsdGFYLCBkZWx0YVkpIHtcclxuICBjb25zdCBwYW5PcHRpb25zID0gY2hhcnRJbnN0YW5jZS5vcHRpb25zLnBhbjtcclxuICBpZiAocGFuT3B0aW9ucyAmJiBoZWxwZXJzLmdldFZhbHVlT3JEZWZhdWx0KHBhbk9wdGlvbnMuZW5hYmxlZCwgZGVmYXVsdE9wdGlvbnMucGFuLmVuYWJsZWQpKSB7XHJcbiAgICBjb25zdCBwYW5Nb2RlID0gaGVscGVycy5nZXRWYWx1ZU9yRGVmYXVsdChjaGFydEluc3RhbmNlLm9wdGlvbnMucGFuLm1vZGUsIGRlZmF1bHRPcHRpb25zLnBhbi5tb2RlKTtcclxuICAgIHBhbk9wdGlvbnMuc3BlZWQgPSBoZWxwZXJzLmdldFZhbHVlT3JEZWZhdWx0KGNoYXJ0SW5zdGFuY2Uub3B0aW9ucy5wYW4uc3BlZWQsIGRlZmF1bHRPcHRpb25zLnBhbi5zcGVlZCk7XHJcblxyXG4gICAgaGVscGVycy5lYWNoKGNoYXJ0SW5zdGFuY2Uuc2NhbGVzLCBmdW5jdGlvbihzY2FsZSwgaWQpIHtcclxuICAgICAgaWYgKHNjYWxlLmlzSG9yaXpvbnRhbCgpICYmIGRpcmVjdGlvbkVuYWJsZWQocGFuTW9kZSwgJ3gnKSAmJiBkZWx0YVggIT09IDApIHtcclxuICAgICAgICBwYW5PcHRpb25zLnNjYWxlQXhlcyA9ICd4JztcclxuICAgICAgICBwYW5TY2FsZShzY2FsZSwgZGVsdGFYLCBwYW5PcHRpb25zKTtcclxuICAgICAgfSBlbHNlIGlmICghc2NhbGUuaXNIb3Jpem9udGFsKCkgJiYgZGlyZWN0aW9uRW5hYmxlZChwYW5Nb2RlLCAneScpICYmIGRlbHRhWSAhPT0gMCkge1xyXG4gICAgICAgIHBhbk9wdGlvbnMuc2NhbGVBeGVzID0gJ3knO1xyXG4gICAgICAgIHBhblNjYWxlKHNjYWxlLCBkZWx0YVksIHBhbk9wdGlvbnMpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBjaGFydEluc3RhbmNlLnVwZGF0ZSgwKTtcclxuICAgIGlmICh0eXBlb2YgcGFuT3B0aW9ucy5vblBhbiA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICBwYW5PcHRpb25zLm9uUGFuKCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBwb3NpdGlvbkluQ2hhcnRBcmVhKGNoYXJ0SW5zdGFuY2UsIHBvc2l0aW9uKSB7XHJcbiAgcmV0dXJuICAgKHBvc2l0aW9uLnggPj0gY2hhcnRJbnN0YW5jZS5jaGFydEFyZWEubGVmdCAmJiBwb3NpdGlvbi54IDw9IGNoYXJ0SW5zdGFuY2UuY2hhcnRBcmVhLnJpZ2h0KSAmJlxyXG4gICAgKHBvc2l0aW9uLnkgPj0gY2hhcnRJbnN0YW5jZS5jaGFydEFyZWEudG9wICYmIHBvc2l0aW9uLnkgPD0gY2hhcnRJbnN0YW5jZS5jaGFydEFyZWEuYm90dG9tKTtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0WUF4aXMoY2hhcnRJbnN0YW5jZSkge1xyXG4gIGNvbnN0IHNjYWxlcyA9IGNoYXJ0SW5zdGFuY2Uuc2NhbGVzO1xyXG5cclxuICBmb3IgKGNvbnN0IHNjYWxlSWQgaW4gc2NhbGVzKSB7XHJcbiAgICBpZiAoc2NhbGVzLmhhc093blByb3BlcnR5KHNjYWxlSWQpKSB7XHJcbiAgICAgIGNvbnN0IHNjYWxlID0gc2NhbGVzW3NjYWxlSWRdO1xyXG4gICAgICBpZiAoIXNjYWxlLmlzSG9yaXpvbnRhbCgpKSB7XHJcbiAgICAgICAgcmV0dXJuIHNjYWxlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4vLyBTdG9yZSB0aGVzZSBmb3IgbGF0ZXJcclxuem9vbU5TLnpvb21GdW5jdGlvbnMuY2F0ZWdvcnkgPSB6b29tSW5kZXhTY2FsZTtcclxuem9vbU5TLnpvb21GdW5jdGlvbnMudGltZSA9IHpvb21UaW1lU2NhbGU7XHJcbnpvb21OUy56b29tRnVuY3Rpb25zLmxpbmVhciA9IHpvb21OdW1lcmljYWxTY2FsZTtcclxuem9vbU5TLnpvb21GdW5jdGlvbnMubG9nYXJpdGhtaWMgPSB6b29tTnVtZXJpY2FsU2NhbGU7XHJcbnpvb21OUy5wYW5GdW5jdGlvbnMuY2F0ZWdvcnkgPSBwYW5JbmRleFNjYWxlO1xyXG56b29tTlMucGFuRnVuY3Rpb25zLnRpbWUgPSBwYW5UaW1lU2NhbGU7XHJcbnpvb21OUy5wYW5GdW5jdGlvbnMubGluZWFyID0gcGFuTnVtZXJpY2FsU2NhbGU7XHJcbnpvb21OUy5wYW5GdW5jdGlvbnMubG9nYXJpdGhtaWMgPSBwYW5OdW1lcmljYWxTY2FsZTtcclxuLy8gR2xvYmFscyBmb3IgY2F0ZXJnb3J5IHBhbiBhbmQgem9vbVxyXG56b29tTlMucGFuQ3VtdWxhdGl2ZURlbHRhID0gMDtcclxuem9vbU5TLnpvb21DdW11bGF0aXZlRGVsdGEgPSAwO1xyXG5cclxuLy8gQ2hhcnRqcyBab29tIFBsdWdpblxyXG5leHBvcnQgY29uc3Qgem9vbVBsdWdpbiA9IHtcclxuICBhZnRlckluaXQ6IGZ1bmN0aW9uKGNoYXJ0SW5zdGFuY2UpIHtcclxuICAgIGhlbHBlcnMuZWFjaChjaGFydEluc3RhbmNlLnNjYWxlcywgZnVuY3Rpb24oc2NhbGUpIHtcclxuICAgICAgc2NhbGUub3JpZ2luYWxPcHRpb25zID0gaGVscGVycy5jbG9uZShzY2FsZS5vcHRpb25zKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGNoYXJ0SW5zdGFuY2UucmVzZXRab29tID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgIGhlbHBlcnMuZWFjaChjaGFydEluc3RhbmNlLnNjYWxlcywgZnVuY3Rpb24oc2NhbGUsIGlkKSB7XHJcbiAgICAgICAgY29uc3QgdGltZU9wdGlvbnMgPSBzY2FsZS5vcHRpb25zLnRpbWU7XHJcbiAgICAgICAgY29uc3QgdGlja09wdGlvbnMgPSBzY2FsZS5vcHRpb25zLnRpY2tzO1xyXG5cclxuICAgICAgICBpZiAodGltZU9wdGlvbnMpIHtcclxuICAgICAgICAgIHRpbWVPcHRpb25zLm1pbiA9IHNjYWxlLm9yaWdpbmFsT3B0aW9ucy50aW1lLm1pbjtcclxuICAgICAgICAgIHRpbWVPcHRpb25zLm1heCA9IHNjYWxlLm9yaWdpbmFsT3B0aW9ucy50aW1lLm1heDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aWNrT3B0aW9ucykge1xyXG4gICAgICAgICAgdGlja09wdGlvbnMubWluID0gc2NhbGUub3JpZ2luYWxPcHRpb25zLnRpY2tzLm1pbjtcclxuICAgICAgICAgIHRpY2tPcHRpb25zLm1heCA9IHNjYWxlLm9yaWdpbmFsT3B0aW9ucy50aWNrcy5tYXg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGhlbHBlcnMuZWFjaChjaGFydEluc3RhbmNlLmRhdGEuZGF0YXNldHMsIGZ1bmN0aW9uKGRhdGFzZXQsIGlkKSB7XHJcbiAgICAgICAgZGF0YXNldC5fbWV0YSA9IG51bGw7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgY2hhcnRJbnN0YW5jZS51cGRhdGUoKTtcclxuICAgIH07XHJcblxyXG4gIH0sXHJcbiAgYmVmb3JlSW5pdDogZnVuY3Rpb24oY2hhcnRJbnN0YW5jZSkge1xyXG4gICAgY2hhcnRJbnN0YW5jZS56b29tID0ge307XHJcblxyXG4gICAgY29uc3Qgbm9kZSA9IGNoYXJ0SW5zdGFuY2Uuem9vbS5ub2RlID0gY2hhcnRJbnN0YW5jZS5jaGFydC5jdHguY2FudmFzO1xyXG5cclxuICAgIGNvbnN0IG9wdGlvbnMgPSBjaGFydEluc3RhbmNlLm9wdGlvbnM7XHJcbiAgICBjb25zdCBwYW5UaHJlc2hvbGQgPSBoZWxwZXJzLmdldFZhbHVlT3JEZWZhdWx0KG9wdGlvbnMucGFuID8gb3B0aW9ucy5wYW4udGhyZXNob2xkIDogdW5kZWZpbmVkLCB6b29tTlMuZGVmYXVsdHMucGFuLnRocmVzaG9sZCk7XHJcbiAgICBpZiAoIW9wdGlvbnMuem9vbSB8fCAhb3B0aW9ucy56b29tLmVuYWJsZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKG9wdGlvbnMuem9vbS5kcmFnKSB7XHJcbiAgICAgIC8vIE9ubHkgd2FudCB0byB6b29tIGhvcml6b250YWwgYXhpc1xyXG4gICAgICBvcHRpb25zLnpvb20ubW9kZSA9ICd4JztcclxuXHJcbiAgICAgIGNoYXJ0SW5zdGFuY2Uuem9vbS5fbW91c2VEb3duSGFuZGxlciA9IGZ1bmN0aW9uKGV2ZW50KSB7XHJcbiAgICAgICAgY2hhcnRJbnN0YW5jZS56b29tLl9kcmFnWm9vbVN0YXJ0ID0gZXZlbnQ7XHJcbiAgICAgIH07XHJcbiAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgY2hhcnRJbnN0YW5jZS56b29tLl9tb3VzZURvd25IYW5kbGVyKTtcclxuXHJcbiAgICAgIGNoYXJ0SW5zdGFuY2Uuem9vbS5fbW91c2VNb3ZlSGFuZGxlciA9IGZ1bmN0aW9uKGV2ZW50KSB7XHJcbiAgICAgICAgaWYgKGNoYXJ0SW5zdGFuY2Uuem9vbS5fZHJhZ1pvb21TdGFydCkge1xyXG4gICAgICAgICAgY2hhcnRJbnN0YW5jZS56b29tLl9kcmFnWm9vbUVuZCA9IGV2ZW50O1xyXG4gICAgICAgICAgY2hhcnRJbnN0YW5jZS51cGRhdGUoMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIGNoYXJ0SW5zdGFuY2Uuem9vbS5fbW91c2VNb3ZlSGFuZGxlcik7XHJcblxyXG4gICAgICBjaGFydEluc3RhbmNlLnpvb20uX21vdXNlVXBIYW5kbGVyID0gZnVuY3Rpb24oZXZlbnQpIHtcclxuICAgICAgICBpZiAoY2hhcnRJbnN0YW5jZS56b29tLl9kcmFnWm9vbVN0YXJ0KSB7XHJcbiAgICAgICAgICBjb25zdCBjaGFydEFyZWEgPSBjaGFydEluc3RhbmNlLmNoYXJ0QXJlYTtcclxuICAgICAgICAgIGNvbnN0IHlBeGlzID0gZ2V0WUF4aXMoY2hhcnRJbnN0YW5jZSk7XHJcbiAgICAgICAgICBjb25zdCBiZWdpblBvaW50ID0gY2hhcnRJbnN0YW5jZS56b29tLl9kcmFnWm9vbVN0YXJ0O1xyXG4gICAgICAgICAgY29uc3Qgb2Zmc2V0WCA9IGJlZ2luUG9pbnQudGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7XHJcbiAgICAgICAgICBjb25zdCBzdGFydFggPSBNYXRoLm1heChNYXRoLm1pbihiZWdpblBvaW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFgpIC0gb2Zmc2V0WCwgY2hhcnRBcmVhLmxlZnQpO1xyXG4gICAgICAgICAgY29uc3QgZW5kWCA9IE1hdGgubWluKE1hdGgubWF4KGJlZ2luUG9pbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WCkgLSBvZmZzZXRYLCBjaGFydEFyZWEucmlnaHQpO1xyXG4gICAgICAgICAgY29uc3QgZHJhZ0Rpc3RhbmNlID0gZW5kWCAtIHN0YXJ0WDtcclxuICAgICAgICAgIGNvbnN0IGNoYXJ0RGlzdGFuY2UgPSBjaGFydEFyZWEucmlnaHQgLSBjaGFydEFyZWEubGVmdDtcclxuICAgICAgICAgIGNvbnN0IHpvb20gPSAxICsgKGNoYXJ0RGlzdGFuY2UgLSBkcmFnRGlzdGFuY2UpIC8gY2hhcnREaXN0YW5jZTtcclxuICAgICAgICAgIGNvbnN0IGNlbnRlclggPSBjaGFydEFyZWEubGVmdCArIChzdGFydFggLSBjaGFydEFyZWEubGVmdCkgLyAoem9vbSAtIDEpO1xyXG5cclxuICAgICAgICAgIC8vIFJlbW92ZSBkcmFnIHN0YXJ0IGFuZCBlbmQgYmVmb3JlIGNoYXJ0IHVwZGF0ZSB0byBzdG9wIGRyYXdpbmcgc2VsZWN0ZWQgYXJlYVxyXG4gICAgICAgICAgY2hhcnRJbnN0YW5jZS56b29tLl9kcmFnWm9vbVN0YXJ0ID0gbnVsbDtcclxuICAgICAgICAgIGNoYXJ0SW5zdGFuY2Uuem9vbS5fZHJhZ1pvb21FbmQgPSBudWxsO1xyXG5cclxuICAgICAgICAgIGlmIChkcmFnRGlzdGFuY2UgPiAwKSB7XHJcbiAgICAgICAgICAgIGRvWm9vbShjaGFydEluc3RhbmNlLCB6b29tLCB7XHJcbiAgICAgICAgICAgICAgeDogY2VudGVyWCxcclxuICAgICAgICAgICAgICB5OiAoeUF4aXMuYm90dG9tIC0geUF4aXMudG9wKSAvIDIsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgICAgLy8gbm9kZS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgY2hhcnRJbnN0YW5jZS56b29tLl9tb3VzZVVwSGFuZGxlcik7XHJcbiAgICAgIG5vZGUub3duZXJEb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgY2hhcnRJbnN0YW5jZS56b29tLl9tb3VzZVVwSGFuZGxlcik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjaGFydEluc3RhbmNlLnpvb20uX3doZWVsSGFuZGxlciA9IGZ1bmN0aW9uKGV2ZW50KSB7XHJcbiAgICAgICAgY29uc3QgcmVjdCA9IGV2ZW50LnRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICBjb25zdCBvZmZzZXRYID0gZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdDtcclxuICAgICAgICBjb25zdCBvZmZzZXRZID0gZXZlbnQuY2xpZW50WSAtIHJlY3QudG9wO1xyXG5cclxuICAgICAgICBjb25zdCBjZW50ZXIgPSB7XHJcbiAgICAgICAgICB4IDogb2Zmc2V0WCxcclxuICAgICAgICAgIHkgOiBvZmZzZXRZXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKGV2ZW50LmRlbHRhWSA8IDApIHtcclxuICAgICAgICAgIGRvWm9vbShjaGFydEluc3RhbmNlLCAxLjEsIGNlbnRlcik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGRvWm9vbShjaGFydEluc3RhbmNlLCAwLjkwOSwgY2VudGVyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gUHJldmVudCB0aGUgZXZlbnQgZnJvbSB0cmlnZ2VyaW5nIHRoZSBkZWZhdWx0IGJlaGF2aW9yIChlZy4gQ29udGVudCBzY3JvbGxpbmcpLlxyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJywgY2hhcnRJbnN0YW5jZS56b29tLl93aGVlbEhhbmRsZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChIYW1tZXIpIHtcclxuICAgICAgY29uc3QgbWMgPSBuZXcgSGFtbWVyLk1hbmFnZXIobm9kZSk7XHJcbiAgICAgIG1jLmFkZChuZXcgSGFtbWVyLlBpbmNoKCkpO1xyXG4gICAgICBtYy5hZGQobmV3IEhhbW1lci5QYW4oe1xyXG4gICAgICAgIHRocmVzaG9sZDogcGFuVGhyZXNob2xkXHJcbiAgICAgIH0pKTtcclxuXHJcbiAgICAgIC8vIEhhbW1lciByZXBvcnRzIHRoZSB0b3RhbCBzY2FsaW5nLiBXZSBuZWVkIHRoZSBpbmNyZW1lbnRhbCBhbW91bnRcclxuICAgICAgbGV0IGN1cnJlbnRQaW5jaFNjYWxpbmc7XHJcbiAgICAgIGNvbnN0IGhhbmRsZVBpbmNoID0gZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICBjb25zdCBkaWZmID0gMSAvIChjdXJyZW50UGluY2hTY2FsaW5nKSAqIGUuc2NhbGU7XHJcbiAgICAgICAgY29uc3QgcmVjdCA9IGUudGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgIGNvbnN0IG9mZnNldFggPSBlLmNlbnRlci54IC0gcmVjdC5sZWZ0O1xyXG4gICAgICAgIGNvbnN0IG9mZnNldFkgPSBlLmNlbnRlci55IC0gcmVjdC50b3A7XHJcbiAgICAgICAgY29uc3QgY2VudGVyID0ge1xyXG4gICAgICAgICAgeCA6IG9mZnNldFgsXHJcbiAgICAgICAgICB5IDogb2Zmc2V0WVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8vIGZpbmdlcnMgcG9zaXRpb24gZGlmZmVyZW5jZVxyXG4gICAgICAgIGNvbnN0IHggPSBNYXRoLmFicyhlLnBvaW50ZXJzWzBdLmNsaWVudFggLSBlLnBvaW50ZXJzWzFdLmNsaWVudFgpO1xyXG4gICAgICAgIGNvbnN0IHkgPSBNYXRoLmFicyhlLnBvaW50ZXJzWzBdLmNsaWVudFkgLSBlLnBvaW50ZXJzWzFdLmNsaWVudFkpO1xyXG5cclxuICAgICAgICAvLyBkaWFnb25hbCBmaW5nZXJzIHdpbGwgY2hhbmdlIGJvdGggKHh5KSBheGVzXHJcbiAgICAgICAgY29uc3QgcCA9IHggLyB5O1xyXG4gICAgICAgIGxldCB4eTtcclxuICAgICAgICBpZiAocCA+IDAuMyAmJiBwIDwgMS43KSB7XHJcbiAgICAgICAgICB4eSA9ICd4eSc7XHJcbiAgICAgICAgfSBlbHNlIGlmICh4ID4geSkge1xyXG4gICAgICAgICAgLy8geCBheGlzXHJcbiAgICAgICAgICB4eSA9ICd4JztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8geSBheGlzXHJcbiAgICAgICAgICB4eSA9ICd5JztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGRvWm9vbShjaGFydEluc3RhbmNlLCBkaWZmLCBjZW50ZXIsIHh5KTtcclxuXHJcbiAgICAgICAgLy8gS2VlcCB0cmFjayBvZiBvdmVyYWxsIHNjYWxlXHJcbiAgICAgICAgY3VycmVudFBpbmNoU2NhbGluZyA9IGUuc2NhbGU7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBtYy5vbigncGluY2hzdGFydCcsIGZ1bmN0aW9uKGUpIHtcclxuICAgICAgICBjdXJyZW50UGluY2hTY2FsaW5nID0gMTsgLy8gcmVzZXQgdHJhY2tlclxyXG4gICAgICB9KTtcclxuICAgICAgbWMub24oJ3BpbmNoJywgaGFuZGxlUGluY2gpO1xyXG4gICAgICBtYy5vbigncGluY2hlbmQnLCBmdW5jdGlvbihlKSB7XHJcbiAgICAgICAgaGFuZGxlUGluY2goZSk7XHJcbiAgICAgICAgY3VycmVudFBpbmNoU2NhbGluZyA9IG51bGw7IC8vIHJlc2V0XHJcbiAgICAgICAgem9vbU5TLnpvb21DdW11bGF0aXZlRGVsdGEgPSAwO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGxldCBjdXJyZW50RGVsdGFYID0gbnVsbCwgY3VycmVudERlbHRhWSA9IG51bGwsIHBhbm5pbmcgPSBmYWxzZTtcclxuICAgICAgY29uc3QgaGFuZGxlUGFuID0gZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICBpZiAoY3VycmVudERlbHRhWCAhPT0gbnVsbCAmJiBjdXJyZW50RGVsdGFZICE9PSBudWxsKSB7XHJcbiAgICAgICAgICBwYW5uaW5nID0gdHJ1ZTtcclxuICAgICAgICAgIGNvbnN0IGRlbHRhWCA9IGUuZGVsdGFYIC0gY3VycmVudERlbHRhWDtcclxuICAgICAgICAgIGNvbnN0IGRlbHRhWSA9IGUuZGVsdGFZIC0gY3VycmVudERlbHRhWTtcclxuICAgICAgICAgIGN1cnJlbnREZWx0YVggPSBlLmRlbHRhWDtcclxuICAgICAgICAgIGN1cnJlbnREZWx0YVkgPSBlLmRlbHRhWTtcclxuICAgICAgICAgIGRvUGFuKGNoYXJ0SW5zdGFuY2UsIGRlbHRhWCwgZGVsdGFZKTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBtYy5vbigncGFuc3RhcnQnLCBmdW5jdGlvbihlKSB7XHJcbiAgICAgICAgY3VycmVudERlbHRhWCA9IDA7XHJcbiAgICAgICAgY3VycmVudERlbHRhWSA9IDA7XHJcbiAgICAgICAgaGFuZGxlUGFuKGUpO1xyXG4gICAgICB9KTtcclxuICAgICAgbWMub24oJ3Bhbm1vdmUnLCBoYW5kbGVQYW4pO1xyXG4gICAgICBtYy5vbigncGFuZW5kJywgZnVuY3Rpb24oZSkge1xyXG4gICAgICAgIGN1cnJlbnREZWx0YVggPSBudWxsO1xyXG4gICAgICAgIGN1cnJlbnREZWx0YVkgPSBudWxsO1xyXG4gICAgICAgIHpvb21OUy5wYW5DdW11bGF0aXZlRGVsdGEgPSAwO1xyXG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IHBhbm5pbmcgPSBmYWxzZTsgfSwgNTAwKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBjaGFydEluc3RhbmNlLnpvb20uX2dob3N0Q2xpY2tIYW5kbGVyID0gZnVuY3Rpb24oZSkge1xyXG4gICAgICAgIGlmIChwYW5uaW5nKSB7XHJcbiAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNoYXJ0SW5zdGFuY2Uuem9vbS5fZ2hvc3RDbGlja0hhbmRsZXIpO1xyXG5cclxuICAgICAgY2hhcnRJbnN0YW5jZS5fbWMgPSBtYztcclxuICAgIH1cclxuICB9LFxyXG5cclxuICBiZWZvcmVEYXRhc2V0c0RyYXc6IGZ1bmN0aW9uKGNoYXJ0SW5zdGFuY2UpIHtcclxuICAgIGNvbnN0IGN0eCA9IGNoYXJ0SW5zdGFuY2UuY2hhcnQuY3R4O1xyXG4gICAgY29uc3QgY2hhcnRBcmVhID0gY2hhcnRJbnN0YW5jZS5jaGFydEFyZWE7XHJcbiAgICBjdHguc2F2ZSgpO1xyXG4gICAgY3R4LmJlZ2luUGF0aCgpO1xyXG5cclxuICAgIGlmIChjaGFydEluc3RhbmNlLnpvb20uX2RyYWdab29tRW5kKSB7XHJcbiAgICAgIGNvbnN0IHlBeGlzID0gZ2V0WUF4aXMoY2hhcnRJbnN0YW5jZSk7XHJcbiAgICAgIGNvbnN0IGJlZ2luUG9pbnQgPSBjaGFydEluc3RhbmNlLnpvb20uX2RyYWdab29tU3RhcnQ7XHJcbiAgICAgIGNvbnN0IGVuZFBvaW50ID0gY2hhcnRJbnN0YW5jZS56b29tLl9kcmFnWm9vbUVuZDtcclxuICAgICAgY29uc3Qgb2Zmc2V0WCA9IGJlZ2luUG9pbnQudGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7XHJcbiAgICAgIGNvbnN0IHN0YXJ0WCA9IE1hdGgubWluKGJlZ2luUG9pbnQuY2xpZW50WCwgZW5kUG9pbnQuY2xpZW50WCkgLSBvZmZzZXRYO1xyXG4gICAgICBjb25zdCBlbmRYID0gTWF0aC5tYXgoYmVnaW5Qb2ludC5jbGllbnRYLCBlbmRQb2ludC5jbGllbnRYKSAtIG9mZnNldFg7XHJcbiAgICAgIGNvbnN0IHJlY3RXaWR0aCA9IGVuZFggLSBzdGFydFg7XHJcblxyXG5cclxuICAgICAgY3R4LmZpbGxTdHlsZSA9ICdyZ2JhKDIyNSwyMjUsMjI1LDAuNSknO1xyXG4gICAgICBjdHgubGluZVdpZHRoID0gNTtcclxuICAgICAgY3R4LmZpbGxSZWN0KHN0YXJ0WCwgeUF4aXMudG9wLCByZWN0V2lkdGgsIHlBeGlzLmJvdHRvbSAtIHlBeGlzLnRvcCk7XHJcbiAgICB9XHJcblxyXG4gICAgY3R4LnJlY3QoY2hhcnRBcmVhLmxlZnQsIGNoYXJ0QXJlYS50b3AsIGNoYXJ0QXJlYS5yaWdodCAtIGNoYXJ0QXJlYS5sZWZ0LCBjaGFydEFyZWEuYm90dG9tIC0gY2hhcnRBcmVhLnRvcCk7XHJcbiAgICBjdHguY2xpcCgpO1xyXG4gIH0sXHJcblxyXG4gIGFmdGVyRGF0YXNldHNEcmF3OiBmdW5jdGlvbihjaGFydEluc3RhbmNlKSB7XHJcbiAgICBjaGFydEluc3RhbmNlLmNoYXJ0LmN0eC5yZXN0b3JlKCk7XHJcbiAgfSxcclxuXHJcbiAgZGVzdHJveTogZnVuY3Rpb24oY2hhcnRJbnN0YW5jZSkge1xyXG4gICAgaWYgKGNoYXJ0SW5zdGFuY2Uuem9vbSkge1xyXG4gICAgICBjb25zdCBvcHRpb25zID0gY2hhcnRJbnN0YW5jZS5vcHRpb25zO1xyXG4gICAgICBjb25zdCBub2RlID0gY2hhcnRJbnN0YW5jZS56b29tLm5vZGU7XHJcblxyXG4gICAgICBpZiAob3B0aW9ucy56b29tICYmIG9wdGlvbnMuem9vbS5kcmFnKSB7XHJcbiAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBjaGFydEluc3RhbmNlLnpvb20uX21vdXNlRG93bkhhbmRsZXIpO1xyXG4gICAgICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgY2hhcnRJbnN0YW5jZS56b29tLl9tb3VzZU1vdmVIYW5kbGVyKTtcclxuICAgICAgICAvLyBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBjaGFydEluc3RhbmNlLnpvb20uX21vdXNlVXBIYW5kbGVyKTtcclxuICAgICAgICBub2RlLm93bmVyRG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIGNoYXJ0SW5zdGFuY2Uuem9vbS5fbW91c2VVcEhhbmRsZXIpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2hlZWwnLCBjaGFydEluc3RhbmNlLnpvb20uX3doZWVsSGFuZGxlcik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChIYW1tZXIpIHtcclxuICAgICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2hhcnRJbnN0YW5jZS56b29tLl9naG9zdENsaWNrSGFuZGxlcik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGRlbGV0ZSBjaGFydEluc3RhbmNlLnpvb207XHJcblxyXG4gICAgICBjb25zdCBtYyA9IGNoYXJ0SW5zdGFuY2UuX21jO1xyXG4gICAgICBpZiAobWMpIHtcclxuICAgICAgICBtYy5yZW1vdmUoJ3BpbmNoc3RhcnQnKTtcclxuICAgICAgICBtYy5yZW1vdmUoJ3BpbmNoJyk7XHJcbiAgICAgICAgbWMucmVtb3ZlKCdwaW5jaGVuZCcpO1xyXG4gICAgICAgIG1jLnJlbW92ZSgncGFuc3RhcnQnKTtcclxuICAgICAgICBtYy5yZW1vdmUoJ3BhbicpO1xyXG4gICAgICAgIG1jLnJlbW92ZSgncGFuZW5kJyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn07XHJcblxyXG5DaGFydC5wbHVnaW5TZXJ2aWNlLnJlZ2lzdGVyKHpvb21QbHVnaW4pO1xyXG4iXX0=
@@ -0,0 +1,2 @@
1
+ export * from './chart.zoom';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbmFtZXNlcnZlci1oaXN0b3J5LXZpZXdlci91dGlscy9jaGFydGpzLXpvb20vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2NoYXJ0Lnpvb20nO1xyXG4iXX0=