ngx-hana-nameserver-history-viewer 1.1.3 → 1.1.9-1.beta

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 (417) hide show
  1. package/README.md +5 -4
  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/{dist/fesm2015/ngx-hana-nameserver-history-viewer.js → fesm2015/ngx-hana-nameserver-history-viewer.mjs} +829 -2561
  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 +5 -0
  76. package/package.json +66 -88
  77. package/{dist/public-api.d.ts → public-api.d.ts} +0 -0
  78. package/{dist/src → src}/nameserver-history-viewer/components/alert/alert.component.d.ts +4 -1
  79. package/src/nameserver-history-viewer/components/alert/alert.module.d.ts +8 -0
  80. package/{dist/src → src}/nameserver-history-viewer/components/alert/index.d.ts +0 -0
  81. package/{dist/src → src}/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.d.ts +3 -0
  82. package/{dist/src → src}/nameserver-history-viewer/components/file-drop-input/index.d.ts +0 -0
  83. package/{dist/src → src}/nameserver-history-viewer/components/index.d.ts +0 -0
  84. package/{dist/src → src}/nameserver-history-viewer/components/instruction/index.d.ts +0 -0
  85. package/src/nameserver-history-viewer/components/instruction/instruction.component.d.ts +17 -0
  86. package/{dist/src → src}/nameserver-history-viewer/components/nameserver-history.component.d.ts +33 -14
  87. package/{dist/src → src}/nameserver-history-viewer/components/port-selector/index.d.ts +0 -0
  88. package/{dist/src → src}/nameserver-history-viewer/components/port-selector/port-selector.component.d.ts +4 -1
  89. package/{dist/src → src}/nameserver-history-viewer/components/port-selector/port-selector.service.d.ts +3 -0
  90. package/{dist/src → src}/nameserver-history-viewer/components/progress-bar/index.d.ts +0 -0
  91. package/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.d.ts +6 -0
  92. package/{dist/src → src}/nameserver-history-viewer/components/time-range-selector/index.d.ts +0 -0
  93. package/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.d.ts +19 -0
  94. package/{dist/src → src}/nameserver-history-viewer/components/timezone-selector/index.d.ts +0 -0
  95. package/{dist/src → src}/nameserver-history-viewer/components/timezone-selector/timezone-selector.component.d.ts +3 -0
  96. package/{dist/src → src}/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.d.ts +3 -0
  97. package/src/nameserver-history-viewer/index.d.ts +2 -0
  98. package/src/nameserver-history-viewer/nameserver-history.module.d.ts +19 -0
  99. package/{dist/src → src}/nameserver-history-viewer/services/chart.service.d.ts +4 -1
  100. package/{dist/src → src}/nameserver-history-viewer/services/file.service.d.ts +3 -0
  101. package/{dist/src → src}/nameserver-history-viewer/services/index.d.ts +0 -0
  102. package/{dist/src → src}/nameserver-history-viewer/services/ui.service.d.ts +5 -2
  103. package/{dist/src → src}/nameserver-history-viewer/types/abort.types.d.ts +0 -0
  104. package/{dist/src → src}/nameserver-history-viewer/types/alert.types.d.ts +0 -0
  105. package/{dist/src → src}/nameserver-history-viewer/types/chart-content-data-item.types.d.ts +0 -0
  106. package/{dist/src → src}/nameserver-history-viewer/types/chart-content-data.types.d.ts +0 -0
  107. package/{dist/src → src}/nameserver-history-viewer/types/chart-content-header.types.d.ts +0 -0
  108. package/{dist/src → src}/nameserver-history-viewer/types/chart-content-time.types.d.ts +0 -0
  109. package/{dist/src → src}/nameserver-history-viewer/types/chart-content.types.d.ts +0 -0
  110. package/{dist/src → src}/nameserver-history-viewer/types/color-rgba.types.d.ts +0 -0
  111. package/{dist/src → src}/nameserver-history-viewer/types/html-element.type.d.ts +0 -0
  112. package/{dist/src → src}/nameserver-history-viewer/types/index.d.ts +0 -0
  113. package/{dist/src → src}/nameserver-history-viewer/types/item.types.d.ts +0 -0
  114. package/{dist/src → src}/nameserver-history-viewer/types/legend-color.types.d.ts +0 -0
  115. package/{dist/src → src}/nameserver-history-viewer/types/load-history-info-backup.types.d.ts +0 -0
  116. package/{dist/src → src}/nameserver-history-viewer/types/load-history-info-columnstore.types.d.ts +0 -0
  117. package/{dist/src → src}/nameserver-history-viewer/types/load-history-info-host.types.d.ts +0 -0
  118. package/{dist/src → src}/nameserver-history-viewer/types/load-history-info-item.types.d.ts +0 -0
  119. package/{dist/src → src}/nameserver-history-viewer/types/load-history-info-persistence.types.d.ts +0 -0
  120. package/{dist/src → src}/nameserver-history-viewer/types/load-history-info-rowstore.types.d.ts +0 -0
  121. package/{dist/src → src}/nameserver-history-viewer/types/load-history-info-server.types.d.ts +0 -0
  122. package/{dist/src → src}/nameserver-history-viewer/types/load-history-info-session-admission-control.types.d.ts +0 -0
  123. package/{dist/src → src}/nameserver-history-viewer/types/load-history-info-sql.types.d.ts +0 -0
  124. package/{dist/src → src}/nameserver-history-viewer/types/load-history-info-sync-primitives.types.d.ts +0 -0
  125. package/{dist/src → src}/nameserver-history-viewer/types/load-history-info-threads.types.d.ts +0 -0
  126. package/{dist/src → src}/nameserver-history-viewer/types/load-history-info.types.d.ts +0 -0
  127. package/{dist/src → src}/nameserver-history-viewer/types/port.types.d.ts +0 -0
  128. package/{dist/src → src}/nameserver-history-viewer/types/scale-group.types.d.ts +0 -0
  129. package/{dist/src → src}/nameserver-history-viewer/types/unit-category.types.d.ts +0 -0
  130. package/{dist/src → src}/nameserver-history-viewer/types/unit.types.d.ts +0 -0
  131. package/{dist/src → src}/nameserver-history-viewer/utils/chart-util.d.ts +0 -0
  132. package/{dist/src → src}/nameserver-history-viewer/utils/chartjs-downsample/chartjs_ext.d.ts +0 -0
  133. package/{dist/src → src}/nameserver-history-viewer/utils/chartjs-downsample/data_culling.d.ts +0 -0
  134. package/{dist/src → src}/nameserver-history-viewer/utils/chartjs-downsample/data_mipmap.d.ts +0 -0
  135. package/{dist/src → src}/nameserver-history-viewer/utils/chartjs-downsample/index.d.ts +0 -0
  136. package/{dist/src → src}/nameserver-history-viewer/utils/chartjs-downsample/lttb_data_mipmap.d.ts +1 -1
  137. package/{dist/src → src}/nameserver-history-viewer/utils/chartjs-downsample/responsive_downsample_plugin.d.ts +0 -0
  138. package/{dist/src → src}/nameserver-history-viewer/utils/chartjs-downsample/utils.d.ts +0 -0
  139. package/{dist/src → src}/nameserver-history-viewer/utils/chartjs-zoom/chart.zoom.d.ts +0 -0
  140. package/{dist/src → src}/nameserver-history-viewer/utils/chartjs-zoom/index.d.ts +0 -0
  141. package/{dist/src → src}/nameserver-history-viewer/utils/file-util.d.ts +6 -0
  142. package/{dist/src → src}/nameserver-history-viewer/utils/index.d.ts +0 -0
  143. package/{dist/src → src}/nameserver-history-viewer/utils/time-util.d.ts +0 -0
  144. package/{dist/src → src}/nameserver-history-viewer/utils/ui-util.d.ts +0 -0
  145. package/.idea/codeStyles/Project.xml +0 -17
  146. package/.idea/codeStyles/codeStyleConfig.xml +0 -5
  147. package/.idea/inspectionProfiles/Project_Default.xml +0 -6
  148. package/.idea/modules.xml +0 -8
  149. package/.idea/ngx-hana-nameserver-history-viewer.iml +0 -13
  150. package/.idea/vcs.xml +0 -6
  151. package/.travis.yml +0 -35
  152. package/angular.json +0 -125
  153. package/dist/LICENSE +0 -21
  154. package/dist/README.md +0 -93
  155. package/dist/bundles/ngx-hana-nameserver-history-viewer.umd.js +0 -6761
  156. package/dist/bundles/ngx-hana-nameserver-history-viewer.umd.js.map +0 -1
  157. package/dist/bundles/ngx-hana-nameserver-history-viewer.umd.min.js +0 -2
  158. package/dist/bundles/ngx-hana-nameserver-history-viewer.umd.min.js.map +0 -1
  159. package/dist/esm2015/ngx-hana-nameserver-history-viewer.js +0 -10
  160. package/dist/esm2015/public-api.js +0 -6
  161. package/dist/esm2015/src/nameserver-history-viewer/components/alert/alert.component.js +0 -114
  162. package/dist/esm2015/src/nameserver-history-viewer/components/alert/alert.module.js +0 -21
  163. package/dist/esm2015/src/nameserver-history-viewer/components/alert/index.js +0 -7
  164. package/dist/esm2015/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.js +0 -141
  165. package/dist/esm2015/src/nameserver-history-viewer/components/file-drop-input/index.js +0 -6
  166. package/dist/esm2015/src/nameserver-history-viewer/components/index.js +0 -13
  167. package/dist/esm2015/src/nameserver-history-viewer/components/instruction/index.js +0 -6
  168. package/dist/esm2015/src/nameserver-history-viewer/components/instruction/instruction.component.js +0 -62
  169. package/dist/esm2015/src/nameserver-history-viewer/components/nameserver-history.component.js +0 -868
  170. package/dist/esm2015/src/nameserver-history-viewer/components/port-selector/index.js +0 -6
  171. package/dist/esm2015/src/nameserver-history-viewer/components/port-selector/port-selector.component.js +0 -93
  172. package/dist/esm2015/src/nameserver-history-viewer/components/port-selector/port-selector.service.js +0 -60
  173. package/dist/esm2015/src/nameserver-history-viewer/components/progress-bar/index.js +0 -6
  174. package/dist/esm2015/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.js +0 -35
  175. package/dist/esm2015/src/nameserver-history-viewer/components/time-range-selector/index.js +0 -6
  176. package/dist/esm2015/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.js +0 -68
  177. package/dist/esm2015/src/nameserver-history-viewer/components/timezone-selector/index.js +0 -6
  178. package/dist/esm2015/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.component.js +0 -151
  179. package/dist/esm2015/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.js +0 -80
  180. package/dist/esm2015/src/nameserver-history-viewer/index.js +0 -6
  181. package/dist/esm2015/src/nameserver-history-viewer/nameserver-history.module.js +0 -42
  182. package/dist/esm2015/src/nameserver-history-viewer/services/chart.service.js +0 -504
  183. package/dist/esm2015/src/nameserver-history-viewer/services/file.service.js +0 -488
  184. package/dist/esm2015/src/nameserver-history-viewer/services/index.js +0 -8
  185. package/dist/esm2015/src/nameserver-history-viewer/services/ui.service.js +0 -922
  186. package/dist/esm2015/src/nameserver-history-viewer/types/abort.types.js +0 -13
  187. package/dist/esm2015/src/nameserver-history-viewer/types/alert.types.js +0 -13
  188. package/dist/esm2015/src/nameserver-history-viewer/types/chart-content-data-item.types.js +0 -15
  189. package/dist/esm2015/src/nameserver-history-viewer/types/chart-content-data.types.js +0 -9
  190. package/dist/esm2015/src/nameserver-history-viewer/types/chart-content-header.types.js +0 -15
  191. package/dist/esm2015/src/nameserver-history-viewer/types/chart-content-time.types.js +0 -9
  192. package/dist/esm2015/src/nameserver-history-viewer/types/chart-content.types.js +0 -21
  193. package/dist/esm2015/src/nameserver-history-viewer/types/color-rgba.types.js +0 -19
  194. package/dist/esm2015/src/nameserver-history-viewer/types/html-element.type.js +0 -19
  195. package/dist/esm2015/src/nameserver-history-viewer/types/index.js +0 -32
  196. package/dist/esm2015/src/nameserver-history-viewer/types/item.types.js +0 -19
  197. package/dist/esm2015/src/nameserver-history-viewer/types/legend-color.types.js +0 -9
  198. package/dist/esm2015/src/nameserver-history-viewer/types/load-history-info-backup.types.js +0 -19
  199. package/dist/esm2015/src/nameserver-history-viewer/types/load-history-info-columnstore.types.js +0 -19
  200. package/dist/esm2015/src/nameserver-history-viewer/types/load-history-info-host.types.js +0 -35
  201. package/dist/esm2015/src/nameserver-history-viewer/types/load-history-info-item.types.js +0 -31
  202. package/dist/esm2015/src/nameserver-history-viewer/types/load-history-info-persistence.types.js +0 -27
  203. package/dist/esm2015/src/nameserver-history-viewer/types/load-history-info-rowstore.types.js +0 -15
  204. package/dist/esm2015/src/nameserver-history-viewer/types/load-history-info-server.types.js +0 -25
  205. package/dist/esm2015/src/nameserver-history-viewer/types/load-history-info-session-admission-control.types.js +0 -25
  206. package/dist/esm2015/src/nameserver-history-viewer/types/load-history-info-sql.types.js +0 -37
  207. package/dist/esm2015/src/nameserver-history-viewer/types/load-history-info-sync-primitives.types.js +0 -15
  208. package/dist/esm2015/src/nameserver-history-viewer/types/load-history-info-threads.types.js +0 -23
  209. package/dist/esm2015/src/nameserver-history-viewer/types/load-history-info.types.js +0 -31
  210. package/dist/esm2015/src/nameserver-history-viewer/types/port.types.js +0 -17
  211. package/dist/esm2015/src/nameserver-history-viewer/types/scale-group.types.js +0 -35
  212. package/dist/esm2015/src/nameserver-history-viewer/types/unit-category.types.js +0 -21
  213. package/dist/esm2015/src/nameserver-history-viewer/types/unit.types.js +0 -19
  214. package/dist/esm2015/src/nameserver-history-viewer/utils/chart-util.js +0 -38
  215. package/dist/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/chartjs_ext.js +0 -100
  216. package/dist/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/data_culling.js +0 -88
  217. package/dist/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/data_mipmap.js +0 -222
  218. package/dist/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/index.js +0 -46
  219. package/dist/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/lttb_data_mipmap.js +0 -166
  220. package/dist/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/responsive_downsample_plugin.js +0 -311
  221. package/dist/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/utils.js +0 -130
  222. package/dist/esm2015/src/nameserver-history-viewer/utils/chartjs-zoom/chart.zoom.js +0 -827
  223. package/dist/esm2015/src/nameserver-history-viewer/utils/chartjs-zoom/index.js +0 -6
  224. package/dist/esm2015/src/nameserver-history-viewer/utils/file-util.js +0 -186
  225. package/dist/esm2015/src/nameserver-history-viewer/utils/index.js +0 -9
  226. package/dist/esm2015/src/nameserver-history-viewer/utils/time-util.js +0 -139
  227. package/dist/esm2015/src/nameserver-history-viewer/utils/ui-util.js +0 -239
  228. package/dist/esm5/ngx-hana-nameserver-history-viewer.js +0 -10
  229. package/dist/esm5/public-api.js +0 -6
  230. package/dist/esm5/src/nameserver-history-viewer/components/alert/alert.component.js +0 -146
  231. package/dist/esm5/src/nameserver-history-viewer/components/alert/alert.module.js +0 -25
  232. package/dist/esm5/src/nameserver-history-viewer/components/alert/index.js +0 -7
  233. package/dist/esm5/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.js +0 -155
  234. package/dist/esm5/src/nameserver-history-viewer/components/file-drop-input/index.js +0 -6
  235. package/dist/esm5/src/nameserver-history-viewer/components/index.js +0 -13
  236. package/dist/esm5/src/nameserver-history-viewer/components/instruction/index.js +0 -6
  237. package/dist/esm5/src/nameserver-history-viewer/components/instruction/instruction.component.js +0 -67
  238. package/dist/esm5/src/nameserver-history-viewer/components/nameserver-history.component.js +0 -1116
  239. package/dist/esm5/src/nameserver-history-viewer/components/port-selector/index.js +0 -6
  240. package/dist/esm5/src/nameserver-history-viewer/components/port-selector/port-selector.component.js +0 -93
  241. package/dist/esm5/src/nameserver-history-viewer/components/port-selector/port-selector.service.js +0 -85
  242. package/dist/esm5/src/nameserver-history-viewer/components/progress-bar/index.js +0 -6
  243. package/dist/esm5/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.js +0 -26
  244. package/dist/esm5/src/nameserver-history-viewer/components/time-range-selector/index.js +0 -6
  245. package/dist/esm5/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.js +0 -58
  246. package/dist/esm5/src/nameserver-history-viewer/components/timezone-selector/index.js +0 -6
  247. package/dist/esm5/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.component.js +0 -180
  248. package/dist/esm5/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.js +0 -110
  249. package/dist/esm5/src/nameserver-history-viewer/index.js +0 -6
  250. package/dist/esm5/src/nameserver-history-viewer/nameserver-history.module.js +0 -46
  251. package/dist/esm5/src/nameserver-history-viewer/services/chart.service.js +0 -659
  252. package/dist/esm5/src/nameserver-history-viewer/services/file.service.js +0 -609
  253. package/dist/esm5/src/nameserver-history-viewer/services/index.js +0 -8
  254. package/dist/esm5/src/nameserver-history-viewer/services/ui.service.js +0 -1141
  255. package/dist/esm5/src/nameserver-history-viewer/types/abort.types.js +0 -13
  256. package/dist/esm5/src/nameserver-history-viewer/types/alert.types.js +0 -13
  257. package/dist/esm5/src/nameserver-history-viewer/types/chart-content-data-item.types.js +0 -15
  258. package/dist/esm5/src/nameserver-history-viewer/types/chart-content-data.types.js +0 -9
  259. package/dist/esm5/src/nameserver-history-viewer/types/chart-content-header.types.js +0 -15
  260. package/dist/esm5/src/nameserver-history-viewer/types/chart-content-time.types.js +0 -9
  261. package/dist/esm5/src/nameserver-history-viewer/types/chart-content.types.js +0 -21
  262. package/dist/esm5/src/nameserver-history-viewer/types/color-rgba.types.js +0 -19
  263. package/dist/esm5/src/nameserver-history-viewer/types/html-element.type.js +0 -19
  264. package/dist/esm5/src/nameserver-history-viewer/types/index.js +0 -32
  265. package/dist/esm5/src/nameserver-history-viewer/types/item.types.js +0 -19
  266. package/dist/esm5/src/nameserver-history-viewer/types/legend-color.types.js +0 -9
  267. package/dist/esm5/src/nameserver-history-viewer/types/load-history-info-backup.types.js +0 -19
  268. package/dist/esm5/src/nameserver-history-viewer/types/load-history-info-columnstore.types.js +0 -19
  269. package/dist/esm5/src/nameserver-history-viewer/types/load-history-info-host.types.js +0 -35
  270. package/dist/esm5/src/nameserver-history-viewer/types/load-history-info-item.types.js +0 -31
  271. package/dist/esm5/src/nameserver-history-viewer/types/load-history-info-persistence.types.js +0 -27
  272. package/dist/esm5/src/nameserver-history-viewer/types/load-history-info-rowstore.types.js +0 -15
  273. package/dist/esm5/src/nameserver-history-viewer/types/load-history-info-server.types.js +0 -25
  274. package/dist/esm5/src/nameserver-history-viewer/types/load-history-info-session-admission-control.types.js +0 -25
  275. package/dist/esm5/src/nameserver-history-viewer/types/load-history-info-sql.types.js +0 -37
  276. package/dist/esm5/src/nameserver-history-viewer/types/load-history-info-sync-primitives.types.js +0 -15
  277. package/dist/esm5/src/nameserver-history-viewer/types/load-history-info-threads.types.js +0 -23
  278. package/dist/esm5/src/nameserver-history-viewer/types/load-history-info.types.js +0 -31
  279. package/dist/esm5/src/nameserver-history-viewer/types/port.types.js +0 -17
  280. package/dist/esm5/src/nameserver-history-viewer/types/scale-group.types.js +0 -35
  281. package/dist/esm5/src/nameserver-history-viewer/types/unit-category.types.js +0 -21
  282. package/dist/esm5/src/nameserver-history-viewer/types/unit.types.js +0 -19
  283. package/dist/esm5/src/nameserver-history-viewer/utils/chart-util.js +0 -39
  284. package/dist/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/chartjs_ext.js +0 -100
  285. package/dist/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/data_culling.js +0 -88
  286. package/dist/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/data_mipmap.js +0 -316
  287. package/dist/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/index.js +0 -46
  288. package/dist/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/lttb_data_mipmap.js +0 -240
  289. package/dist/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/responsive_downsample_plugin.js +0 -366
  290. package/dist/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/utils.js +0 -142
  291. package/dist/esm5/src/nameserver-history-viewer/utils/chartjs-zoom/chart.zoom.js +0 -827
  292. package/dist/esm5/src/nameserver-history-viewer/utils/chartjs-zoom/index.js +0 -6
  293. package/dist/esm5/src/nameserver-history-viewer/utils/file-util.js +0 -187
  294. package/dist/esm5/src/nameserver-history-viewer/utils/index.js +0 -9
  295. package/dist/esm5/src/nameserver-history-viewer/utils/time-util.js +0 -139
  296. package/dist/esm5/src/nameserver-history-viewer/utils/ui-util.js +0 -241
  297. package/dist/fesm2015/ngx-hana-nameserver-history-viewer.js.map +0 -1
  298. package/dist/fesm5/ngx-hana-nameserver-history-viewer.js +0 -6887
  299. package/dist/fesm5/ngx-hana-nameserver-history-viewer.js.map +0 -1
  300. package/dist/ngx-hana-nameserver-history-viewer.d.ts +0 -5
  301. package/dist/ngx-hana-nameserver-history-viewer.metadata.json +0 -1
  302. package/dist/package.json +0 -90
  303. package/dist/src/nameserver-history-viewer/components/alert/alert.module.d.ts +0 -2
  304. package/dist/src/nameserver-history-viewer/components/instruction/instruction.component.d.ts +0 -14
  305. package/dist/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.d.ts +0 -3
  306. package/dist/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.d.ts +0 -16
  307. package/dist/src/nameserver-history-viewer/index.d.ts +0 -1
  308. package/dist/src/nameserver-history-viewer/nameserver-history.module.d.ts +0 -2
  309. package/ng-package.json +0 -7
  310. package/public-api.ts +0 -1
  311. package/src/assets/GitHub-Mark-32px.png +0 -0
  312. package/src/demo/app.component.html +0 -42
  313. package/src/demo/app.component.scss +0 -155
  314. package/src/demo/app.component.ts +0 -157
  315. package/src/demo/app.module.ts +0 -30
  316. package/src/demo/demo-service.ts +0 -479
  317. package/src/demo/demo-util.spec.ts +0 -112
  318. package/src/demo/demo-util.ts +0 -121
  319. package/src/demo/index.html +0 -13
  320. package/src/demo/main.ts +0 -12
  321. package/src/demo/small-demo.gif +0 -0
  322. package/src/demo/styles.css +0 -5
  323. package/src/environments/environment.prod.ts +0 -3
  324. package/src/environments/environment.ts +0 -15
  325. package/src/karma.conf.js +0 -31
  326. package/src/nameserver-history-viewer/components/alert/alert.component.html +0 -10
  327. package/src/nameserver-history-viewer/components/alert/alert.component.scss +0 -78
  328. package/src/nameserver-history-viewer/components/alert/alert.component.ts +0 -67
  329. package/src/nameserver-history-viewer/components/alert/alert.module.ts +0 -14
  330. package/src/nameserver-history-viewer/components/alert/index.ts +0 -6
  331. package/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.scss +0 -37
  332. package/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.spec.ts +0 -47
  333. package/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.ts +0 -101
  334. package/src/nameserver-history-viewer/components/file-drop-input/index.ts +0 -1
  335. package/src/nameserver-history-viewer/components/index.ts +0 -8
  336. package/src/nameserver-history-viewer/components/instruction/index.ts +0 -1
  337. package/src/nameserver-history-viewer/components/instruction/instruction.component.html +0 -33
  338. package/src/nameserver-history-viewer/components/instruction/instruction.component.scss +0 -49
  339. package/src/nameserver-history-viewer/components/instruction/instruction.component.ts +0 -30
  340. package/src/nameserver-history-viewer/components/nameserver-history.component.html +0 -70
  341. package/src/nameserver-history-viewer/components/nameserver-history.component.scss +0 -191
  342. package/src/nameserver-history-viewer/components/nameserver-history.component.spec.ts +0 -193
  343. package/src/nameserver-history-viewer/components/nameserver-history.component.ts +0 -666
  344. package/src/nameserver-history-viewer/components/port-selector/index.ts +0 -1
  345. package/src/nameserver-history-viewer/components/port-selector/port-selector.component.ts +0 -55
  346. package/src/nameserver-history-viewer/components/port-selector/port-selector.service.spec.ts +0 -16
  347. package/src/nameserver-history-viewer/components/port-selector/port-selector.service.ts +0 -40
  348. package/src/nameserver-history-viewer/components/progress-bar/index.ts +0 -1
  349. package/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.scss +0 -47
  350. package/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.ts +0 -27
  351. package/src/nameserver-history-viewer/components/time-range-selector/index.ts +0 -1
  352. package/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.scss +0 -31
  353. package/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.ts +0 -46
  354. package/src/nameserver-history-viewer/components/timezone-selector/index.ts +0 -1
  355. package/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.component.ts +0 -82
  356. package/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.spec.ts +0 -12
  357. package/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.ts +0 -53
  358. package/src/nameserver-history-viewer/index.ts +0 -1
  359. package/src/nameserver-history-viewer/nameserver-history.module.ts +0 -45
  360. package/src/nameserver-history-viewer/services/chart.service.ts +0 -343
  361. package/src/nameserver-history-viewer/services/file.service.spec.ts +0 -3364
  362. package/src/nameserver-history-viewer/services/file.service.ts +0 -450
  363. package/src/nameserver-history-viewer/services/index.ts +0 -3
  364. package/src/nameserver-history-viewer/services/ui.service.spec.ts +0 -43
  365. package/src/nameserver-history-viewer/services/ui.service.ts +0 -601
  366. package/src/nameserver-history-viewer/types/abort.types.ts +0 -4
  367. package/src/nameserver-history-viewer/types/alert.types.ts +0 -6
  368. package/src/nameserver-history-viewer/types/chart-content-data-item.types.ts +0 -4
  369. package/src/nameserver-history-viewer/types/chart-content-data.types.ts +0 -6
  370. package/src/nameserver-history-viewer/types/chart-content-header.types.ts +0 -4
  371. package/src/nameserver-history-viewer/types/chart-content-time.types.ts +0 -3
  372. package/src/nameserver-history-viewer/types/chart-content.types.ts +0 -10
  373. package/src/nameserver-history-viewer/types/color-rgba.types.ts +0 -6
  374. package/src/nameserver-history-viewer/types/html-element.type.ts +0 -7
  375. package/src/nameserver-history-viewer/types/index.ts +0 -27
  376. package/src/nameserver-history-viewer/types/item.types.ts +0 -12
  377. package/src/nameserver-history-viewer/types/legend-color.types.ts +0 -5
  378. package/src/nameserver-history-viewer/types/load-history-info-backup.types.ts +0 -8
  379. package/src/nameserver-history-viewer/types/load-history-info-columnstore.types.ts +0 -9
  380. package/src/nameserver-history-viewer/types/load-history-info-host.types.ts +0 -17
  381. package/src/nameserver-history-viewer/types/load-history-info-item.types.ts +0 -14
  382. package/src/nameserver-history-viewer/types/load-history-info-persistence.types.ts +0 -12
  383. package/src/nameserver-history-viewer/types/load-history-info-rowstore.types.ts +0 -7
  384. package/src/nameserver-history-viewer/types/load-history-info-server.types.ts +0 -11
  385. package/src/nameserver-history-viewer/types/load-history-info-session-admission-control.types.ts +0 -11
  386. package/src/nameserver-history-viewer/types/load-history-info-sql.types.ts +0 -17
  387. package/src/nameserver-history-viewer/types/load-history-info-sync-primitives.types.ts +0 -6
  388. package/src/nameserver-history-viewer/types/load-history-info-threads.types.ts +0 -10
  389. package/src/nameserver-history-viewer/types/load-history-info.types.ts +0 -24
  390. package/src/nameserver-history-viewer/types/port.types.ts +0 -5
  391. package/src/nameserver-history-viewer/types/scale-group.types.ts +0 -15
  392. package/src/nameserver-history-viewer/types/unit-category.types.ts +0 -8
  393. package/src/nameserver-history-viewer/types/unit.types.ts +0 -12
  394. package/src/nameserver-history-viewer/utils/chart-util.spec.ts +0 -22
  395. package/src/nameserver-history-viewer/utils/chart-util.ts +0 -30
  396. package/src/nameserver-history-viewer/utils/chartjs-downsample/chartjs_ext.ts +0 -104
  397. package/src/nameserver-history-viewer/utils/chartjs-downsample/data_culling.ts +0 -95
  398. package/src/nameserver-history-viewer/utils/chartjs-downsample/data_mipmap.ts +0 -196
  399. package/src/nameserver-history-viewer/utils/chartjs-downsample/index.ts +0 -44
  400. package/src/nameserver-history-viewer/utils/chartjs-downsample/lttb_data_mipmap.ts +0 -158
  401. package/src/nameserver-history-viewer/utils/chartjs-downsample/responsive_downsample_plugin.ts +0 -249
  402. package/src/nameserver-history-viewer/utils/chartjs-downsample/utils.ts +0 -122
  403. package/src/nameserver-history-viewer/utils/chartjs-zoom/chart.zoom.ts +0 -602
  404. package/src/nameserver-history-viewer/utils/chartjs-zoom/index.ts +0 -1
  405. package/src/nameserver-history-viewer/utils/file-util.spec.ts +0 -108
  406. package/src/nameserver-history-viewer/utils/file-util.ts +0 -149
  407. package/src/nameserver-history-viewer/utils/index.ts +0 -4
  408. package/src/nameserver-history-viewer/utils/time-util.spec.ts +0 -21
  409. package/src/nameserver-history-viewer/utils/time-util.ts +0 -113
  410. package/src/nameserver-history-viewer/utils/ui-util.spec.ts +0 -87
  411. package/src/nameserver-history-viewer/utils/ui-util.ts +0 -171
  412. package/src/polyfills.ts +0 -80
  413. package/src/test.ts +0 -20
  414. package/src/tsconfig.app.json +0 -12
  415. package/src/tsconfig.spec.json +0 -19
  416. package/tsconfig.json +0 -22
  417. package/tslint.json +0 -130
@@ -1,827 +0,0 @@
1
- /**
2
- * @fileoverview added by tsickle
3
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
- */
5
- /**
6
- * this plugin is adapted from: https://github.com/chartjs/chartjs-plugin-zoom
7
- * for following two open issues:
8
- * https://github.com/chartjs/chartjs-plugin-zoom/pull/155
9
- * https://github.com/chartjs/chartjs-plugin-zoom/pull/150
10
- *
11
- * The MIT License (MIT) Copyright (c) 2013-2016 Nick Downie
12
- * Permission is hereby granted, free of charge, to any person obtaining a copy of this
13
- * software and associated documentation files (the "Software"), to deal in the Software
14
- * without restriction, including without limitation the rights to use, copy, modify, merge,
15
- * publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
16
- * to whom the Software is furnished to do so, subject to the following conditions:
17
- *
18
- * The above copyright notice and this permission notice shall be included in all copies or
19
- * substantial portions of the Software.
20
- *
21
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
22
- * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
23
- * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
24
- * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
25
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
26
- * THE SOFTWARE.
27
- */
28
- /*jslint browser:true, devel:true, white:true, vars:true */
29
- /*global require*/
30
- // hammer JS for touch support
31
- import * as hammerjs from 'hammerjs';
32
- /** @type {?} */
33
- const Hammer = window && ((/** @type {?} */ (window))).Hammer ? ((/** @type {?} */ (window))).Hammer : hammerjs.Hammer;
34
- // Get the chart variable
35
- import * as chartjs from 'chart.js';
36
- /** @type {?} */
37
- const Chart = window && ((/** @type {?} */ (window))).Chart ? ((/** @type {?} */ (window))).Chart : chartjs.Chart;
38
- /** @type {?} */
39
- const helpers = Chart.helpers;
40
- // Take the zoom namespace of Chart
41
- /** @type {?} */
42
- const zoomNS = Chart.Zoom = Chart.Zoom || {};
43
- // Where we store functions to handle different scale types
44
- /** @type {?} */
45
- const zoomFunctions = zoomNS.zoomFunctions = zoomNS.zoomFunctions || {};
46
- /** @type {?} */
47
- const panFunctions = zoomNS.panFunctions = zoomNS.panFunctions || {};
48
- // Default options if none are provided
49
- /** @type {?} */
50
- const defaultOptions = zoomNS.defaults = {
51
- pan: {
52
- enabled: true,
53
- mode: 'xy',
54
- speed: 20,
55
- threshold: 10
56
- },
57
- zoom: {
58
- enabled: true,
59
- mode: 'xy',
60
- sensitivity: 3
61
- }
62
- };
63
- /**
64
- * @param {?} mode
65
- * @param {?} dir
66
- * @return {?}
67
- */
68
- function directionEnabled(mode, dir) {
69
- if (mode === undefined) {
70
- return true;
71
- }
72
- else if (typeof mode === 'string') {
73
- return mode.indexOf(dir) !== -1;
74
- }
75
- return false;
76
- }
77
- /**
78
- * @param {?} zoomPanOptions
79
- * @param {?} newMax
80
- * @return {?}
81
- */
82
- function rangeMaxLimiter(zoomPanOptions, newMax) {
83
- if (zoomPanOptions.scaleAxes && zoomPanOptions.rangeMax &&
84
- !helpers.isNullOrUndef(zoomPanOptions.rangeMax[zoomPanOptions.scaleAxes])) {
85
- /** @type {?} */
86
- const rangeMax = zoomPanOptions.rangeMax[zoomPanOptions.scaleAxes];
87
- if (newMax > rangeMax) {
88
- newMax = rangeMax;
89
- }
90
- }
91
- return newMax;
92
- }
93
- /**
94
- * @param {?} zoomPanOptions
95
- * @param {?} newMin
96
- * @return {?}
97
- */
98
- function rangeMinLimiter(zoomPanOptions, newMin) {
99
- if (zoomPanOptions.scaleAxes && zoomPanOptions.rangeMin &&
100
- !helpers.isNullOrUndef(zoomPanOptions.rangeMin[zoomPanOptions.scaleAxes])) {
101
- /** @type {?} */
102
- const rangeMin = zoomPanOptions.rangeMin[zoomPanOptions.scaleAxes];
103
- if (newMin < rangeMin) {
104
- newMin = rangeMin;
105
- }
106
- }
107
- return newMin;
108
- }
109
- /**
110
- * @param {?} scale
111
- * @param {?} zoom
112
- * @param {?} center
113
- * @param {?} zoomOptions
114
- * @return {?}
115
- */
116
- function zoomIndexScale(scale, zoom, center, zoomOptions) {
117
- /** @type {?} */
118
- const labels = scale.chart.data.labels;
119
- /** @type {?} */
120
- let minIndex = scale.minIndex;
121
- /** @type {?} */
122
- const lastLabelIndex = labels.length - 1;
123
- /** @type {?} */
124
- let maxIndex = scale.maxIndex;
125
- /** @type {?} */
126
- const sensitivity = zoomOptions.sensitivity;
127
- /** @type {?} */
128
- const chartCenter = scale.isHorizontal() ? scale.left + (scale.width / 2) : scale.top + (scale.height / 2);
129
- /** @type {?} */
130
- const centerPointer = scale.isHorizontal() ? center.x : center.y;
131
- zoomNS.zoomCumulativeDelta = zoom > 1 ? zoomNS.zoomCumulativeDelta + 1 : zoomNS.zoomCumulativeDelta - 1;
132
- if (Math.abs(zoomNS.zoomCumulativeDelta) > sensitivity) {
133
- if (zoomNS.zoomCumulativeDelta < 0) {
134
- if (centerPointer >= chartCenter) {
135
- if (minIndex <= 0) {
136
- maxIndex = Math.min(lastLabelIndex, maxIndex + 1);
137
- }
138
- else {
139
- minIndex = Math.max(0, minIndex - 1);
140
- }
141
- }
142
- else if (centerPointer < chartCenter) {
143
- if (maxIndex >= lastLabelIndex) {
144
- minIndex = Math.max(0, minIndex - 1);
145
- }
146
- else {
147
- maxIndex = Math.min(lastLabelIndex, maxIndex + 1);
148
- }
149
- }
150
- zoomNS.zoomCumulativeDelta = 0;
151
- }
152
- else if (zoomNS.zoomCumulativeDelta > 0) {
153
- if (centerPointer >= chartCenter) {
154
- minIndex = minIndex < maxIndex ? minIndex = Math.min(maxIndex, minIndex + 1) : minIndex;
155
- }
156
- else if (centerPointer < chartCenter) {
157
- maxIndex = maxIndex > minIndex ? maxIndex = Math.max(minIndex, maxIndex - 1) : maxIndex;
158
- }
159
- zoomNS.zoomCumulativeDelta = 0;
160
- }
161
- scale.options.ticks.min = rangeMinLimiter(zoomOptions, labels[minIndex]);
162
- scale.options.ticks.max = rangeMaxLimiter(zoomOptions, labels[maxIndex]);
163
- }
164
- }
165
- /**
166
- * @param {?} scale
167
- * @param {?} zoom
168
- * @param {?} center
169
- * @param {?} zoomOptions
170
- * @return {?}
171
- */
172
- function zoomTimeScale(scale, zoom, center, zoomOptions) {
173
- /** @type {?} */
174
- const options = scale.options;
175
- // var range;
176
- // var min_percent;
177
- // if (scale.isHorizontal()) {
178
- // range = scale.right - scale.left;
179
- // min_percent = (center.x - scale.left) / range;
180
- // } else {
181
- // range = scale.bottom - scale.top;
182
- // min_percent = (center.y - scale.top) / range;
183
- // }
184
- //
185
- // var max_percent = 1 - min_percent;
186
- /** @type {?} */
187
- const range = scale.max - scale.min;
188
- /** @type {?} */
189
- const newDiff = range * (zoom - 1);
190
- /** @type {?} */
191
- const cursorPixel = scale.isHorizontal() ? center.x : center.y;
192
- /** @type {?} */
193
- const min_percent = (scale.getValueForPixel(cursorPixel) - scale.min) / range;
194
- /** @type {?} */
195
- const max_percent = 1 - min_percent;
196
- /** @type {?} */
197
- const minDelta = newDiff * min_percent;
198
- /** @type {?} */
199
- const maxDelta = newDiff * max_percent;
200
- /** @type {?} */
201
- const newMin = scale.min + minDelta;
202
- /** @type {?} */
203
- const newMax = scale.max - maxDelta;
204
- /** @type {?} */
205
- const diffMinMax = newMax - newMin;
206
- /** @type {?} */
207
- const minLimitExceeded = rangeMinLimiter(zoomOptions, diffMinMax) !== diffMinMax;
208
- /** @type {?} */
209
- const maxLimitExceeded = rangeMaxLimiter(zoomOptions, diffMinMax) !== diffMinMax;
210
- if (!minLimitExceeded && !maxLimitExceeded) {
211
- options.time.min = newMin;
212
- options.time.max = newMax;
213
- }
214
- }
215
- /**
216
- * @param {?} scale
217
- * @param {?} zoom
218
- * @param {?} center
219
- * @param {?} zoomOptions
220
- * @return {?}
221
- */
222
- function zoomNumericalScale(scale, zoom, center, zoomOptions) {
223
- /** @type {?} */
224
- const range = scale.max - scale.min;
225
- /** @type {?} */
226
- const newDiff = range * (zoom - 1);
227
- /** @type {?} */
228
- const cursorPixel = scale.isHorizontal() ? center.x : center.y;
229
- /** @type {?} */
230
- const min_percent = (scale.getValueForPixel(cursorPixel) - scale.min) / range;
231
- /** @type {?} */
232
- const max_percent = 1 - min_percent;
233
- /** @type {?} */
234
- const minDelta = newDiff * min_percent;
235
- /** @type {?} */
236
- const maxDelta = newDiff * max_percent;
237
- scale.options.ticks.min = rangeMinLimiter(zoomOptions, scale.min + minDelta);
238
- scale.options.ticks.max = rangeMaxLimiter(zoomOptions, scale.max - maxDelta);
239
- }
240
- /**
241
- * @param {?} scale
242
- * @param {?} zoom
243
- * @param {?} center
244
- * @param {?} zoomOptions
245
- * @return {?}
246
- */
247
- function zoomScale(scale, zoom, center, zoomOptions) {
248
- /** @type {?} */
249
- const fn = zoomFunctions[scale.options.type];
250
- if (fn) {
251
- fn(scale, zoom, center, zoomOptions);
252
- }
253
- }
254
- /**
255
- * @param {?} chartInstance
256
- * @param {?} zoom
257
- * @param {?} center
258
- * @param {?=} whichAxes
259
- * @return {?}
260
- */
261
- function doZoom(chartInstance, zoom, center, whichAxes) {
262
- /** @type {?} */
263
- const ca = chartInstance.chartArea;
264
- if (!center) {
265
- center = {
266
- x: (ca.left + ca.right) / 2,
267
- y: (ca.top + ca.bottom) / 2,
268
- };
269
- }
270
- /** @type {?} */
271
- const zoomOptions = chartInstance.options.zoom;
272
- if (zoomOptions && helpers.getValueOrDefault(zoomOptions.enabled, defaultOptions.zoom.enabled)) {
273
- // Do the zoom here
274
- /** @type {?} */
275
- const zoomMode = helpers.getValueOrDefault(chartInstance.options.zoom.mode, defaultOptions.zoom.mode);
276
- zoomOptions.sensitivity = helpers.getValueOrDefault(chartInstance.options.zoom.sensitivity, defaultOptions.zoom.sensitivity);
277
- // Which axe should be modified when figers were used.
278
- /** @type {?} */
279
- let _whichAxes;
280
- if (zoomMode === 'xy' && whichAxes !== undefined) {
281
- // based on fingers positions
282
- _whichAxes = whichAxes;
283
- }
284
- else {
285
- // no effect
286
- _whichAxes = 'xy';
287
- }
288
- helpers.each(chartInstance.scales, (/**
289
- * @param {?} scale
290
- * @param {?} id
291
- * @return {?}
292
- */
293
- function (scale, id) {
294
- if (scale.isHorizontal() && directionEnabled(zoomMode, 'x') && directionEnabled(_whichAxes, 'x')) {
295
- zoomOptions.scaleAxes = 'x';
296
- zoomScale(scale, zoom, center, zoomOptions);
297
- }
298
- else if (!scale.isHorizontal() && directionEnabled(zoomMode, 'y') && directionEnabled(_whichAxes, 'y')) {
299
- // Do Y zoom
300
- zoomOptions.scaleAxes = 'y';
301
- zoomScale(scale, zoom, center, zoomOptions);
302
- }
303
- }));
304
- chartInstance.update(0);
305
- if (typeof zoomOptions.onZoom === 'function') {
306
- zoomOptions.onZoom();
307
- }
308
- }
309
- }
310
- /**
311
- * @param {?} scale
312
- * @param {?} delta
313
- * @param {?} panOptions
314
- * @return {?}
315
- */
316
- function panIndexScale(scale, delta, panOptions) {
317
- /** @type {?} */
318
- const labels = scale.chart.data.labels;
319
- /** @type {?} */
320
- const lastLabelIndex = labels.length - 1;
321
- /** @type {?} */
322
- const offsetAmt = Math.max((scale.ticks.length - ((scale.options.gridLines.offsetGridLines) ? 0 : 1)), 1);
323
- /** @type {?} */
324
- const panSpeed = panOptions.speed;
325
- /** @type {?} */
326
- let minIndex = scale.minIndex;
327
- /** @type {?} */
328
- const step = Math.round(scale.width / (offsetAmt * panSpeed));
329
- /** @type {?} */
330
- let maxIndex;
331
- zoomNS.panCumulativeDelta += delta;
332
- minIndex = zoomNS.panCumulativeDelta > step ? Math.max(0, minIndex - 1) : zoomNS.panCumulativeDelta < -step ? Math.min(lastLabelIndex - offsetAmt + 1, minIndex + 1) : minIndex;
333
- zoomNS.panCumulativeDelta = minIndex !== scale.minIndex ? 0 : zoomNS.panCumulativeDelta;
334
- maxIndex = Math.min(lastLabelIndex, minIndex + offsetAmt - 1);
335
- scale.options.ticks.min = rangeMinLimiter(panOptions, labels[minIndex]);
336
- scale.options.ticks.max = rangeMaxLimiter(panOptions, labels[maxIndex]);
337
- }
338
- /**
339
- * @param {?} scale
340
- * @param {?} delta
341
- * @param {?} panOptions
342
- * @return {?}
343
- */
344
- function panTimeScale(scale, delta, panOptions) {
345
- /** @type {?} */
346
- const options = scale.options;
347
- /** @type {?} */
348
- const limitedMax = rangeMaxLimiter(panOptions, scale.getValueForPixel(scale.getPixelForValue(scale.max) - delta));
349
- /** @type {?} */
350
- const limitedMin = rangeMinLimiter(panOptions, scale.getValueForPixel(scale.getPixelForValue(scale.min) - delta));
351
- /** @type {?} */
352
- const limitedTimeDelta = delta < 0 ? limitedMax - scale.max : limitedMin - scale.min;
353
- options.time.max = scale.max + limitedTimeDelta;
354
- options.time.min = scale.min + limitedTimeDelta;
355
- }
356
- /**
357
- * @param {?} scale
358
- * @param {?} delta
359
- * @param {?} panOptions
360
- * @return {?}
361
- */
362
- function panNumericalScale(scale, delta, panOptions) {
363
- /** @type {?} */
364
- const tickOpts = scale.options.ticks;
365
- /** @type {?} */
366
- const start = scale.start;
367
- /** @type {?} */
368
- const end = scale.end;
369
- if (tickOpts.reverse) {
370
- tickOpts.max = scale.getValueForPixel(scale.getPixelForValue(start) - delta);
371
- tickOpts.min = scale.getValueForPixel(scale.getPixelForValue(end) - delta);
372
- }
373
- else {
374
- tickOpts.min = scale.getValueForPixel(scale.getPixelForValue(start) - delta);
375
- tickOpts.max = scale.getValueForPixel(scale.getPixelForValue(end) - delta);
376
- }
377
- tickOpts.min = rangeMinLimiter(panOptions, tickOpts.min);
378
- tickOpts.max = rangeMaxLimiter(panOptions, tickOpts.max);
379
- }
380
- /**
381
- * @param {?} scale
382
- * @param {?} delta
383
- * @param {?} panOptions
384
- * @return {?}
385
- */
386
- function panScale(scale, delta, panOptions) {
387
- /** @type {?} */
388
- const fn = panFunctions[scale.options.type];
389
- if (fn) {
390
- fn(scale, delta, panOptions);
391
- }
392
- }
393
- /**
394
- * @param {?} chartInstance
395
- * @param {?} deltaX
396
- * @param {?} deltaY
397
- * @return {?}
398
- */
399
- function doPan(chartInstance, deltaX, deltaY) {
400
- /** @type {?} */
401
- const panOptions = chartInstance.options.pan;
402
- if (panOptions && helpers.getValueOrDefault(panOptions.enabled, defaultOptions.pan.enabled)) {
403
- /** @type {?} */
404
- const panMode = helpers.getValueOrDefault(chartInstance.options.pan.mode, defaultOptions.pan.mode);
405
- panOptions.speed = helpers.getValueOrDefault(chartInstance.options.pan.speed, defaultOptions.pan.speed);
406
- helpers.each(chartInstance.scales, (/**
407
- * @param {?} scale
408
- * @param {?} id
409
- * @return {?}
410
- */
411
- function (scale, id) {
412
- if (scale.isHorizontal() && directionEnabled(panMode, 'x') && deltaX !== 0) {
413
- panOptions.scaleAxes = 'x';
414
- panScale(scale, deltaX, panOptions);
415
- }
416
- else if (!scale.isHorizontal() && directionEnabled(panMode, 'y') && deltaY !== 0) {
417
- panOptions.scaleAxes = 'y';
418
- panScale(scale, deltaY, panOptions);
419
- }
420
- }));
421
- chartInstance.update(0);
422
- if (typeof panOptions.onPan === 'function') {
423
- panOptions.onPan();
424
- }
425
- }
426
- }
427
- /**
428
- * @param {?} chartInstance
429
- * @param {?} position
430
- * @return {?}
431
- */
432
- function positionInChartArea(chartInstance, position) {
433
- return (position.x >= chartInstance.chartArea.left && position.x <= chartInstance.chartArea.right) &&
434
- (position.y >= chartInstance.chartArea.top && position.y <= chartInstance.chartArea.bottom);
435
- }
436
- /**
437
- * @param {?} chartInstance
438
- * @return {?}
439
- */
440
- function getYAxis(chartInstance) {
441
- /** @type {?} */
442
- const scales = chartInstance.scales;
443
- for (const scaleId in scales) {
444
- if (scales.hasOwnProperty(scaleId)) {
445
- /** @type {?} */
446
- const scale = scales[scaleId];
447
- if (!scale.isHorizontal()) {
448
- return scale;
449
- }
450
- }
451
- }
452
- }
453
- // Store these for later
454
- zoomNS.zoomFunctions.category = zoomIndexScale;
455
- zoomNS.zoomFunctions.time = zoomTimeScale;
456
- zoomNS.zoomFunctions.linear = zoomNumericalScale;
457
- zoomNS.zoomFunctions.logarithmic = zoomNumericalScale;
458
- zoomNS.panFunctions.category = panIndexScale;
459
- zoomNS.panFunctions.time = panTimeScale;
460
- zoomNS.panFunctions.linear = panNumericalScale;
461
- zoomNS.panFunctions.logarithmic = panNumericalScale;
462
- // Globals for catergory pan and zoom
463
- zoomNS.panCumulativeDelta = 0;
464
- zoomNS.zoomCumulativeDelta = 0;
465
- // Chartjs Zoom Plugin
466
- /** @type {?} */
467
- export const zoomPlugin = {
468
- afterInit: (/**
469
- * @param {?} chartInstance
470
- * @return {?}
471
- */
472
- function (chartInstance) {
473
- helpers.each(chartInstance.scales, (/**
474
- * @param {?} scale
475
- * @return {?}
476
- */
477
- function (scale) {
478
- scale.originalOptions = helpers.clone(scale.options);
479
- }));
480
- chartInstance.resetZoom = (/**
481
- * @return {?}
482
- */
483
- function () {
484
- helpers.each(chartInstance.scales, (/**
485
- * @param {?} scale
486
- * @param {?} id
487
- * @return {?}
488
- */
489
- function (scale, id) {
490
- /** @type {?} */
491
- const timeOptions = scale.options.time;
492
- /** @type {?} */
493
- const tickOptions = scale.options.ticks;
494
- if (timeOptions) {
495
- timeOptions.min = scale.originalOptions.time.min;
496
- timeOptions.max = scale.originalOptions.time.max;
497
- }
498
- if (tickOptions) {
499
- tickOptions.min = scale.originalOptions.ticks.min;
500
- tickOptions.max = scale.originalOptions.ticks.max;
501
- }
502
- }));
503
- helpers.each(chartInstance.data.datasets, (/**
504
- * @param {?} dataset
505
- * @param {?} id
506
- * @return {?}
507
- */
508
- function (dataset, id) {
509
- dataset._meta = null;
510
- }));
511
- chartInstance.update();
512
- });
513
- }),
514
- beforeInit: (/**
515
- * @param {?} chartInstance
516
- * @return {?}
517
- */
518
- function (chartInstance) {
519
- chartInstance.zoom = {};
520
- /** @type {?} */
521
- const node = chartInstance.zoom.node = chartInstance.chart.ctx.canvas;
522
- /** @type {?} */
523
- const options = chartInstance.options;
524
- /** @type {?} */
525
- const panThreshold = helpers.getValueOrDefault(options.pan ? options.pan.threshold : undefined, zoomNS.defaults.pan.threshold);
526
- if (!options.zoom || !options.zoom.enabled) {
527
- return;
528
- }
529
- if (options.zoom.drag) {
530
- // Only want to zoom horizontal axis
531
- options.zoom.mode = 'x';
532
- chartInstance.zoom._mouseDownHandler = (/**
533
- * @param {?} event
534
- * @return {?}
535
- */
536
- function (event) {
537
- chartInstance.zoom._dragZoomStart = event;
538
- });
539
- node.addEventListener('mousedown', chartInstance.zoom._mouseDownHandler);
540
- chartInstance.zoom._mouseMoveHandler = (/**
541
- * @param {?} event
542
- * @return {?}
543
- */
544
- function (event) {
545
- if (chartInstance.zoom._dragZoomStart) {
546
- chartInstance.zoom._dragZoomEnd = event;
547
- chartInstance.update(0);
548
- }
549
- });
550
- node.addEventListener('mousemove', chartInstance.zoom._mouseMoveHandler);
551
- chartInstance.zoom._mouseUpHandler = (/**
552
- * @param {?} event
553
- * @return {?}
554
- */
555
- function (event) {
556
- if (chartInstance.zoom._dragZoomStart) {
557
- /** @type {?} */
558
- const chartArea = chartInstance.chartArea;
559
- /** @type {?} */
560
- const yAxis = getYAxis(chartInstance);
561
- /** @type {?} */
562
- const beginPoint = chartInstance.zoom._dragZoomStart;
563
- /** @type {?} */
564
- const offsetX = beginPoint.target.getBoundingClientRect().left;
565
- /** @type {?} */
566
- const startX = Math.max(Math.min(beginPoint.clientX, event.clientX) - offsetX, chartArea.left);
567
- /** @type {?} */
568
- const endX = Math.min(Math.max(beginPoint.clientX, event.clientX) - offsetX, chartArea.right);
569
- /** @type {?} */
570
- const dragDistance = endX - startX;
571
- /** @type {?} */
572
- const chartDistance = chartArea.right - chartArea.left;
573
- /** @type {?} */
574
- const zoom = 1 + (chartDistance - dragDistance) / chartDistance;
575
- /** @type {?} */
576
- const centerX = chartArea.left + (startX - chartArea.left) / (zoom - 1);
577
- // Remove drag start and end before chart update to stop drawing selected area
578
- chartInstance.zoom._dragZoomStart = null;
579
- chartInstance.zoom._dragZoomEnd = null;
580
- if (dragDistance > 0) {
581
- doZoom(chartInstance, zoom, {
582
- x: centerX,
583
- y: (yAxis.bottom - yAxis.top) / 2,
584
- });
585
- }
586
- }
587
- });
588
- // node.addEventListener('mouseup', chartInstance.zoom._mouseUpHandler);
589
- node.ownerDocument.addEventListener('mouseup', chartInstance.zoom._mouseUpHandler);
590
- }
591
- else {
592
- chartInstance.zoom._wheelHandler = (/**
593
- * @param {?} event
594
- * @return {?}
595
- */
596
- function (event) {
597
- /** @type {?} */
598
- const rect = event.target.getBoundingClientRect();
599
- /** @type {?} */
600
- const offsetX = event.clientX - rect.left;
601
- /** @type {?} */
602
- const offsetY = event.clientY - rect.top;
603
- /** @type {?} */
604
- const center = {
605
- x: offsetX,
606
- y: offsetY
607
- };
608
- if (event.deltaY < 0) {
609
- doZoom(chartInstance, 1.1, center);
610
- }
611
- else {
612
- doZoom(chartInstance, 0.909, center);
613
- }
614
- // Prevent the event from triggering the default behavior (eg. Content scrolling).
615
- event.preventDefault();
616
- });
617
- node.addEventListener('wheel', chartInstance.zoom._wheelHandler);
618
- }
619
- if (Hammer) {
620
- /** @type {?} */
621
- const mc = new Hammer.Manager(node);
622
- mc.add(new Hammer.Pinch());
623
- mc.add(new Hammer.Pan({
624
- threshold: panThreshold
625
- }));
626
- // Hammer reports the total scaling. We need the incremental amount
627
- /** @type {?} */
628
- let currentPinchScaling;
629
- /** @type {?} */
630
- const handlePinch = (/**
631
- * @param {?} e
632
- * @return {?}
633
- */
634
- function (e) {
635
- /** @type {?} */
636
- const diff = 1 / (currentPinchScaling) * e.scale;
637
- /** @type {?} */
638
- const rect = e.target.getBoundingClientRect();
639
- /** @type {?} */
640
- const offsetX = e.center.x - rect.left;
641
- /** @type {?} */
642
- const offsetY = e.center.y - rect.top;
643
- /** @type {?} */
644
- const center = {
645
- x: offsetX,
646
- y: offsetY
647
- };
648
- // fingers position difference
649
- /** @type {?} */
650
- const x = Math.abs(e.pointers[0].clientX - e.pointers[1].clientX);
651
- /** @type {?} */
652
- const y = Math.abs(e.pointers[0].clientY - e.pointers[1].clientY);
653
- // diagonal fingers will change both (xy) axes
654
- /** @type {?} */
655
- const p = x / y;
656
- /** @type {?} */
657
- let xy;
658
- if (p > 0.3 && p < 1.7) {
659
- xy = 'xy';
660
- }
661
- else if (x > y) {
662
- // x axis
663
- xy = 'x';
664
- }
665
- else {
666
- // y axis
667
- xy = 'y';
668
- }
669
- doZoom(chartInstance, diff, center, xy);
670
- // Keep track of overall scale
671
- currentPinchScaling = e.scale;
672
- });
673
- mc.on('pinchstart', (/**
674
- * @param {?} e
675
- * @return {?}
676
- */
677
- function (e) {
678
- currentPinchScaling = 1; // reset tracker
679
- }));
680
- mc.on('pinch', handlePinch);
681
- mc.on('pinchend', (/**
682
- * @param {?} e
683
- * @return {?}
684
- */
685
- function (e) {
686
- handlePinch(e);
687
- currentPinchScaling = null; // reset
688
- zoomNS.zoomCumulativeDelta = 0;
689
- }));
690
- /** @type {?} */
691
- let currentDeltaX = null;
692
- /** @type {?} */
693
- let currentDeltaY = null;
694
- /** @type {?} */
695
- let panning = false;
696
- /** @type {?} */
697
- const handlePan = (/**
698
- * @param {?} e
699
- * @return {?}
700
- */
701
- function (e) {
702
- if (currentDeltaX !== null && currentDeltaY !== null) {
703
- panning = true;
704
- /** @type {?} */
705
- const deltaX = e.deltaX - currentDeltaX;
706
- /** @type {?} */
707
- const deltaY = e.deltaY - currentDeltaY;
708
- currentDeltaX = e.deltaX;
709
- currentDeltaY = e.deltaY;
710
- doPan(chartInstance, deltaX, deltaY);
711
- }
712
- });
713
- mc.on('panstart', (/**
714
- * @param {?} e
715
- * @return {?}
716
- */
717
- function (e) {
718
- currentDeltaX = 0;
719
- currentDeltaY = 0;
720
- handlePan(e);
721
- }));
722
- mc.on('panmove', handlePan);
723
- mc.on('panend', (/**
724
- * @param {?} e
725
- * @return {?}
726
- */
727
- function (e) {
728
- currentDeltaX = null;
729
- currentDeltaY = null;
730
- zoomNS.panCumulativeDelta = 0;
731
- setTimeout((/**
732
- * @return {?}
733
- */
734
- function () { panning = false; }), 500);
735
- }));
736
- chartInstance.zoom._ghostClickHandler = (/**
737
- * @param {?} e
738
- * @return {?}
739
- */
740
- function (e) {
741
- if (panning) {
742
- e.stopImmediatePropagation();
743
- e.preventDefault();
744
- }
745
- });
746
- node.addEventListener('click', chartInstance.zoom._ghostClickHandler);
747
- chartInstance._mc = mc;
748
- }
749
- }),
750
- beforeDatasetsDraw: (/**
751
- * @param {?} chartInstance
752
- * @return {?}
753
- */
754
- function (chartInstance) {
755
- /** @type {?} */
756
- const ctx = chartInstance.chart.ctx;
757
- /** @type {?} */
758
- const chartArea = chartInstance.chartArea;
759
- ctx.save();
760
- ctx.beginPath();
761
- if (chartInstance.zoom._dragZoomEnd) {
762
- /** @type {?} */
763
- const yAxis = getYAxis(chartInstance);
764
- /** @type {?} */
765
- const beginPoint = chartInstance.zoom._dragZoomStart;
766
- /** @type {?} */
767
- const endPoint = chartInstance.zoom._dragZoomEnd;
768
- /** @type {?} */
769
- const offsetX = beginPoint.target.getBoundingClientRect().left;
770
- /** @type {?} */
771
- const startX = Math.min(beginPoint.clientX, endPoint.clientX) - offsetX;
772
- /** @type {?} */
773
- const endX = Math.max(beginPoint.clientX, endPoint.clientX) - offsetX;
774
- /** @type {?} */
775
- const rectWidth = endX - startX;
776
- ctx.fillStyle = 'rgba(225,225,225,0.5)';
777
- ctx.lineWidth = 5;
778
- ctx.fillRect(startX, yAxis.top, rectWidth, yAxis.bottom - yAxis.top);
779
- }
780
- ctx.rect(chartArea.left, chartArea.top, chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);
781
- ctx.clip();
782
- }),
783
- afterDatasetsDraw: (/**
784
- * @param {?} chartInstance
785
- * @return {?}
786
- */
787
- function (chartInstance) {
788
- chartInstance.chart.ctx.restore();
789
- }),
790
- destroy: (/**
791
- * @param {?} chartInstance
792
- * @return {?}
793
- */
794
- function (chartInstance) {
795
- if (chartInstance.zoom) {
796
- /** @type {?} */
797
- const options = chartInstance.options;
798
- /** @type {?} */
799
- const node = chartInstance.zoom.node;
800
- if (options.zoom && options.zoom.drag) {
801
- node.removeEventListener('mousedown', chartInstance.zoom._mouseDownHandler);
802
- node.removeEventListener('mousemove', chartInstance.zoom._mouseMoveHandler);
803
- // node.removeEventListener('mouseup', chartInstance.zoom._mouseUpHandler);
804
- node.ownerDocument.removeEventListener('mouseup', chartInstance.zoom._mouseUpHandler);
805
- }
806
- else {
807
- node.removeEventListener('wheel', chartInstance.zoom._wheelHandler);
808
- }
809
- if (Hammer) {
810
- node.removeEventListener('click', chartInstance.zoom._ghostClickHandler);
811
- }
812
- delete chartInstance.zoom;
813
- /** @type {?} */
814
- const mc = chartInstance._mc;
815
- if (mc) {
816
- mc.remove('pinchstart');
817
- mc.remove('pinch');
818
- mc.remove('pinchend');
819
- mc.remove('panstart');
820
- mc.remove('pan');
821
- mc.remove('panend');
822
- }
823
- }
824
- })
825
- };
826
- Chart.pluginService.register(zoomPlugin);
827
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuem9vbS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1oYW5hLW5hbWVzZXJ2ZXItaGlzdG9yeS12aWV3ZXIvIiwic291cmNlcyI6WyJzcmMvbmFtZXNlcnZlci1oaXN0b3J5LXZpZXdlci91dGlscy9jaGFydGpzLXpvb20vY2hhcnQuem9vbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE0QkEsT0FBTyxLQUFLLFFBQVEsTUFBTSxVQUFVLENBQUM7O01BQy9CLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxtQkFBQSxNQUFNLEVBQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBQSxNQUFNLEVBQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU07O0FBRzFGLE9BQU8sS0FBSyxPQUFPLE1BQU0sVUFBVSxDQUFDOztNQUM5QixLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQUEsTUFBTSxFQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQUEsTUFBTSxFQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLOztNQUUvRSxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU87OztNQUd2QixNQUFNLEdBQUcsS0FBSyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxJQUFJLEVBQUU7OztNQUd0QyxhQUFhLEdBQUcsTUFBTSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxJQUFJLEVBQUU7O01BQ2pFLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLElBQUksRUFBRTs7O01BRzlELGNBQWMsR0FBRyxNQUFNLENBQUMsUUFBUSxHQUFHO0lBQ3ZDLEdBQUcsRUFBRTtRQUNILE9BQU8sRUFBRSxJQUFJO1FBQ2IsSUFBSSxFQUFFLElBQUk7UUFD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QUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDckU7WUFFRCxJQUFJLE1BQU0sRUFBRTtnQkFDVixJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQzthQUMxRTtZQUVELE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQzs7a0JBRXBCLEVBQUUsR0FBRyxhQUFhLENBQUMsR0FBRztZQUM1QixJQUFJLEVBQUUsRUFBRTtnQkFDTixFQUFFLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUN4QixFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNuQixFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUN0QixFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUN0QixFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNqQixFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ3JCO1NBQ0Y7SUFDSCxDQUFDLENBQUE7Q0FDRjtBQUVELEtBQUssQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIHRoaXMgcGx1Z2luIGlzIGFkYXB0ZWQgZnJvbTogaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvY2hhcnRqcy1wbHVnaW4tem9vbVxyXG4gKiBmb3IgZm9sbG93aW5nIHR3byBvcGVuIGlzc3VlczpcclxuICogaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvY2hhcnRqcy1wbHVnaW4tem9vbS9wdWxsLzE1NVxyXG4gKiBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9jaGFydGpzLXBsdWdpbi16b29tL3B1bGwvMTUwXHJcbiAqXHJcbiAqIFRoZSBNSVQgTGljZW5zZSAoTUlUKSBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNiBOaWNrIERvd25pZVxyXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXNcclxuICogc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlXHJcbiAqIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsXHJcbiAqIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29uc1xyXG4gKiB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxyXG4gKlxyXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yXHJcbiAqIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cclxuICpcclxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkdcclxuICogQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VcclxuICogQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTllcclxuICogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsXHJcbiAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxyXG4gKiBUSEUgU09GVFdBUkUuXHJcbiAqL1xyXG5cclxuLypqc2xpbnQgYnJvd3Nlcjp0cnVlLCBkZXZlbDp0cnVlLCB3aGl0ZTp0cnVlLCB2YXJzOnRydWUgKi9cclxuLypnbG9iYWwgcmVxdWlyZSovXHJcblxyXG4vLyBoYW1tZXIgSlMgZm9yIHRvdWNoIHN1cHBvcnRcclxuaW1wb3J0ICogYXMgaGFtbWVyanMgZnJvbSAnaGFtbWVyanMnO1xyXG5jb25zdCBIYW1tZXIgPSB3aW5kb3cgJiYgKHdpbmRvdyBhcyBhbnkpLkhhbW1lciA/ICh3aW5kb3cgYXMgYW55KS5IYW1tZXIgOiBoYW1tZXJqcy5IYW1tZXI7XHJcblxyXG4vLyBHZXQgdGhlIGNoYXJ0IHZhcmlhYmxlXHJcbmltcG9ydCAqIGFzIGNoYXJ0anMgZnJvbSAnY2hhcnQuanMnO1xyXG5jb25zdCBDaGFydCA9IHdpbmRvdyAmJiAod2luZG93IGFzIGFueSkuQ2hhcnQgPyAod2luZG93IGFzIGFueSkuQ2hhcnQgOiBjaGFydGpzLkNoYXJ0O1xyXG5cclxuY29uc3QgaGVscGVycyA9IENoYXJ0LmhlbHBlcnM7XHJcblxyXG4vLyBUYWtlIHRoZSB6b29tIG5hbWVzcGFjZSBvZiBDaGFydFxyXG5jb25zdCB6b29tTlMgPSBDaGFydC5ab29tID0gQ2hhcnQuWm9vbSB8fCB7fTtcclxuXHJcbi8vIFdoZXJlIHdlIHN0b3JlIGZ1bmN0aW9ucyB0byBoYW5kbGUgZGlmZmVyZW50IHNjYWxlIHR5cGVzXHJcbmNvbnN0IHpvb21GdW5jdGlvbnMgPSB6b29tTlMuem9vbUZ1bmN0aW9ucyA9IHpvb21OUy56b29tRnVuY3Rpb25zIHx8IHt9O1xyXG5jb25zdCBwYW5GdW5jdGlvbnMgPSB6b29tTlMucGFuRnVuY3Rpb25zID0gem9vbU5TLnBhbkZ1bmN0aW9ucyB8fCB7fTtcclxuXHJcbi8vIERlZmF1bHQgb3B0aW9ucyBpZiBub25lIGFyZSBwcm92aWRlZFxyXG5jb25zdCBkZWZhdWx0T3B0aW9ucyA9IHpvb21OUy5kZWZhdWx0cyA9IHtcclxuICBwYW46IHtcclxuICAgIGVuYWJsZWQ6IHRydWUsXHJcbiAgICBtb2RlOiAneHknLFxyXG4gICAgc3BlZWQ6IDIwLFxyXG4gICAgdGhyZXNob2xkOiAxMFxyXG4gIH0sXHJcbiAgem9vbToge1xyXG4gICAgZW5hYmxlZDogdHJ1ZSxcclxuICAgIG1vZGU6ICd4eScsXHJcbiAgICBzZW5zaXRpdml0eTogM1xyXG4gIH1cclxufTtcclxuXHJcbmZ1bmN0aW9uIGRpcmVjdGlvbkVuYWJsZWQobW9kZSwgZGlyKSB7XHJcbiAgaWYgKG1vZGUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfSBlbHNlIGlmICh0eXBlb2YgbW9kZSA9PT0gJ3N0cmluZycpIHtcclxuICAgIHJldHVybiBtb2RlLmluZGV4T2YoZGlyKSAhPT0gLTE7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gZmFsc2U7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJhbmdlTWF4TGltaXRlcih6b29tUGFuT3B0aW9ucywgbmV3TWF4KSB7XHJcbiAgaWYgKHpvb21QYW5PcHRpb25zLnNjYWxlQXhlcyAmJiB6b29tUGFuT3B0aW9ucy5yYW5nZU1heCAmJlxyXG4gICAgIWhlbHBlcnMuaXNOdWxsT3JVbmRlZih6b29tUGFuT3B0aW9ucy5yYW5nZU1heFt6b29tUGFuT3B0aW9ucy5zY2FsZUF4ZXNdKSkge1xyXG4gICAgY29uc3QgcmFuZ2VNYXggPSB6b29tUGFuT3B0aW9ucy5yYW5nZU1heFt6b29tUGFuT3B0aW9ucy5zY2FsZUF4ZXNdO1xyXG4gICAgaWYgKG5ld01heCA+IHJhbmdlTWF4KSB7XHJcbiAgICAgIG5ld01heCA9IHJhbmdlTWF4O1xyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gbmV3TWF4O1xyXG59XHJcblxyXG5mdW5jdGlvbiByYW5nZU1pbkxpbWl0ZXIoem9vbVBhbk9wdGlvbnMsIG5ld01pbikge1xyXG4gIGlmICh6b29tUGFuT3B0aW9ucy5zY2FsZUF4ZXMgJiYgem9vbVBhbk9wdGlvbnMucmFuZ2VNaW4gJiZcclxuICAgICFoZWxwZXJzLmlzTnVsbE9yVW5kZWYoem9vbVBhbk9wdGlvbnMucmFuZ2VNaW5bem9vbVBhbk9wdGlvbnMuc2NhbGVBeGVzXSkpIHtcclxuICAgIGNvbnN0IHJhbmdlTWluID0gem9vbVBhbk9wdGlvbnMucmFuZ2VNaW5bem9vbVBhbk9wdGlvbnMuc2NhbGVBeGVzXTtcclxuICAgIGlmIChuZXdNaW4gPCByYW5nZU1pbikge1xyXG4gICAgICBuZXdNaW4gPSByYW5nZU1pbjtcclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIG5ld01pbjtcclxufVxyXG5cclxuZnVuY3Rpb24gem9vbUluZGV4U2NhbGUoc2NhbGUsIHpvb20sIGNlbnRlciwgem9vbU9wdGlvbnMpIHtcclxuICBjb25zdCBsYWJlbHMgPSBzY2FsZS5jaGFydC5kYXRhLmxhYmVscztcclxuICBsZXQgbWluSW5kZXggPSBzY2FsZS5taW5JbmRleDtcclxuICBjb25zdCBsYXN0TGFiZWxJbmRleCA9IGxhYmVscy5sZW5ndGggLSAxO1xyXG4gIGxldCBtYXhJbmRleCA9IHNjYWxlLm1heEluZGV4O1xyXG4gIGNvbnN0IHNlbnNpdGl2aXR5ID0gem9vbU9wdGlvbnMuc2Vuc2l0aXZpdHk7XHJcbiAgY29uc3QgY2hhcnRDZW50ZXIgPSAgc2NhbGUuaXNIb3Jpem9udGFsKCkgPyBzY2FsZS5sZWZ0ICsgKHNjYWxlLndpZHRoIC8gMikgOiBzY2FsZS50b3AgKyAoc2NhbGUuaGVpZ2h0IC8gMik7XHJcbiAgY29uc3QgY2VudGVyUG9pbnRlciA9IHNjYWxlLmlzSG9yaXpvbnRhbCgpID8gY2VudGVyLnggOiBjZW50ZXIueTtcclxuXHJcbiAgem9vbU5TLnpvb21DdW11bGF0aXZlRGVsdGEgPSB6b29tID4gMSA/IHpvb21OUy56b29tQ3VtdWxhdGl2ZURlbHRhICsgMSA6IHpvb21OUy56b29tQ3VtdWxhdGl2ZURlbHRhIC0gMTtcclxuXHJcbiAgaWYgKE1hdGguYWJzKHpvb21OUy56b29tQ3VtdWxhdGl2ZURlbHRhKSA+IHNlbnNpdGl2aXR5KSB7XHJcbiAgICBpZiAoem9vbU5TLnpvb21DdW11bGF0aXZlRGVsdGEgPCAwKSB7XHJcbiAgICAgIGlmIChjZW50ZXJQb2ludGVyID49IGNoYXJ0Q2VudGVyKSB7XHJcbiAgICAgICAgaWYgKG1pbkluZGV4IDw9IDApIHtcclxuICAgICAgICAgIG1heEluZGV4ID0gTWF0aC5taW4obGFzdExhYmVsSW5kZXgsIG1heEluZGV4ICsgMSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIG1pbkluZGV4ID0gTWF0aC5tYXgoMCwgbWluSW5kZXggLSAxKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoY2VudGVyUG9pbnRlciA8IGNoYXJ0Q2VudGVyKSB7XHJcbiAgICAgICAgaWYgKG1heEluZGV4ID49IGxhc3RMYWJlbEluZGV4KSB7XHJcbiAgICAgICAgICBtaW5JbmRleCA9IE1hdGgubWF4KDAsIG1pbkluZGV4IC0gMSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIG1heEluZGV4ID0gTWF0aC5taW4obGFzdExhYmVsSW5kZXgsIG1heEluZGV4ICsgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHpvb21OUy56b29tQ3VtdWxhdGl2ZURlbHRhID0gMDtcclxuICAgIH0gZWxzZSBpZiAoem9vbU5TLnpvb21DdW11bGF0aXZlRGVsdGEgPiAwKSB7XHJcbiAgICAgIGlmIChjZW50ZXJQb2ludGVyID49IGNoYXJ0Q2VudGVyKSB7XHJcbiAgICAgICAgbWluSW5kZXggPSBtaW5JbmRleCA8IG1heEluZGV4ID8gbWluSW5kZXggPSBNYXRoLm1pbihtYXhJbmRleCwgbWluSW5kZXggKyAxKSA6IG1pbkluZGV4O1xyXG4gICAgICB9IGVsc2UgaWYgKGNlbnRlclBvaW50ZXIgPCBjaGFydENlbnRlcikge1xyXG4gICAgICAgIG1heEluZGV4ID0gbWF4SW5kZXggPiBtaW5JbmRleCA/IG1heEluZGV4ID0gTWF0aC5tYXgobWluSW5kZXgsIG1heEluZGV4IC0gMSkgOiBtYXhJbmRleDtcclxuICAgICAgfVxyXG4gICAgICB6b29tTlMuem9vbUN1bXVsYXRpdmVEZWx0YSA9IDA7XHJcbiAgICB9XHJcbiAgICBzY2FsZS5vcHRpb25zLnRpY2tzLm1pbiA9IHJhbmdlTWluTGltaXRlcih6b29tT3B0aW9ucywgbGFiZWxzW21pbkluZGV4XSk7XHJcbiAgICBzY2FsZS5vcHRpb25zLnRpY2tzLm1heCA9IHJhbmdlTWF4TGltaXRlcih6b29tT3B0aW9ucywgbGFiZWxzW21heEluZGV4XSk7XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiB6b29tVGltZVNjYWxlKHNjYWxlLCB6b29tLCBjZW50ZXIsIHpvb21PcHRpb25zKSB7XHJcbiAgY29uc3Qgb3B0aW9ucyA9IHNjYWxlLm9wdGlvbnM7XHJcblxyXG4gIC8vIHZhciByYW5nZTtcclxuICAvLyB2YXIgbWluX3BlcmNlbnQ7XHJcbiAgLy8gaWYgKHNjYWxlLmlzSG9yaXpvbnRhbCgpKSB7XHJcbiAgLy8gICByYW5nZSA9IHNjYWxlLnJpZ2h0IC0gc2NhbGUubGVmdDtcclxuICAvLyAgIG1pbl9wZXJjZW50ID0gKGNlbnRlci54IC0gc2NhbGUubGVmdCkgLyByYW5nZTtcclxuICAvLyB9IGVsc2Uge1xyXG4gIC8vICAgcmFuZ2UgPSBzY2FsZS5ib3R0b20gLSBzY2FsZS50b3A7XHJcbiAgLy8gICBtaW5fcGVyY2VudCA9IChjZW50ZXIueSAtIHNjYWxlLnRvcCkgLyByYW5nZTtcclxuICAvLyB9XHJcbiAgLy9cclxuICAvLyB2YXIgbWF4X3BlcmNlbnQgPSAxIC0gbWluX3BlcmNlbnQ7XHJcbiAgY29uc3QgcmFuZ2UgPSBzY2FsZS5tYXggLSBzY2FsZS5taW47XHJcbiAgY29uc3QgbmV3RGlmZiA9IHJhbmdlICogKHpvb20gLSAxKTtcclxuXHJcbiAgY29uc3QgY3Vyc29yUGl4ZWwgPSBzY2FsZS5pc0hvcml6b250YWwoKSA/IGNlbnRlci54IDogY2VudGVyLnk7XHJcbiAgY29uc3QgbWluX3BlcmNlbnQgPSAoc2NhbGUuZ2V0VmFsdWVGb3JQaXhlbChjdXJzb3JQaXhlbCkgLSBzY2FsZS5taW4pIC8gcmFuZ2U7XHJcbiAgY29uc3QgbWF4X3BlcmNlbnQgPSAxIC0gbWluX3BlcmNlbnQ7XHJcblxyXG4gIGNvbnN0IG1pbkRlbHRhID0gbmV3RGlmZiAqIG1pbl9wZXJjZW50O1xyXG4gIGNvbnN0IG1heERlbHRhID0gbmV3RGlmZiAqIG1heF9wZXJjZW50O1xyXG5cclxuICBjb25zdCBuZXdNaW4gPSBzY2FsZS5taW4gKyBtaW5EZWx0YTtcclxuICBjb25zdCBuZXdNYXggPSBzY2FsZS5tYXggLSBtYXhEZWx0YTtcclxuXHJcbiAgY29uc3QgZGlmZk1pbk1heCA9IG5ld01heCAtIG5ld01pbjtcclxuICBjb25zdCBtaW5MaW1pdEV4Y2VlZGVkID0gcmFuZ2VNaW5MaW1pdGVyKHpvb21PcHRpb25zLCBkaWZmTWluTWF4KSAhPT0gZGlmZk1pbk1heDtcclxuICBjb25zdCBtYXhMaW1pdEV4Y2VlZGVkID0gcmFuZ2VNYXhMaW1pdGVyKHpvb21PcHRpb25zLCBkaWZmTWluTWF4KSAhPT0gZGlmZk1pbk1heDtcclxuXHJcbiAgaWYgKCFtaW5MaW1pdEV4Y2VlZGVkICYmICFtYXhMaW1pdEV4Y2VlZGVkKSB7XHJcbiAgICBvcHRpb25zLnRpbWUubWluID0gbmV3TWluO1xyXG4gICAgb3B0aW9ucy50aW1lLm1heCA9IG5ld01heDtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHpvb21OdW1lcmljYWxTY2FsZShzY2FsZSwgem9vbSwgY2VudGVyLCB6b29tT3B0aW9ucykge1xyXG4gIGNvbnN0IHJhbmdlID0gc2NhbGUubWF4IC0gc2NhbGUubWluO1xyXG4gIGNvbnN0IG5ld0RpZmYgPSByYW5nZSAqICh6b29tIC0gMSk7XHJcblxyXG4gIGNvbnN0IGN1cnNvclBpeGVsID0gc2NhbGUuaXNIb3Jpem9udGFsKCkgPyBjZW50ZXIueCA6IGNlbnRlci55O1xyXG4gIGNvbnN0IG1pbl9wZXJjZW50ID0gKHNjYWxlLmdldFZhbHVlRm9yUGl4ZWwoY3Vyc29yUGl4ZWwpIC0gc2NhbGUubWluKSAvIHJhbmdlO1xyXG4gIGNvbnN0IG1heF9wZXJjZW50ID0gMSAtIG1pbl9wZXJjZW50O1xyXG5cclxuICBjb25zdCBtaW5EZWx0YSA9IG5ld0RpZmYgKiBtaW5fcGVyY2VudDtcclxuICBjb25zdCBtYXhEZWx0YSA9IG5ld0RpZmYgKiBtYXhfcGVyY2VudDtcclxuXHJcbiAgc2NhbGUub3B0aW9ucy50aWNrcy5taW4gPSByYW5nZU1pbkxpbWl0ZXIoem9vbU9wdGlvbnMsIHNjYWxlLm1pbiArIG1pbkRlbHRhKTtcclxuICBzY2FsZS5vcHRpb25zLnRpY2tzLm1heCA9IHJhbmdlTWF4TGltaXRlcih6b29tT3B0aW9ucywgc2NhbGUubWF4IC0gbWF4RGVsdGEpO1xyXG59XHJcblxyXG5mdW5jdGlvbiB6b29tU2NhbGUoc2NhbGUsIHpvb20sIGNlbnRlciwgem9vbU9wdGlvbnMpIHtcclxuICBjb25zdCBmbiA9IHpvb21GdW5jdGlvbnNbc2NhbGUub3B0aW9ucy50eXBlXTtcclxuICBpZiAoZm4pIHtcclxuICAgIGZuKHNjYWxlLCB6b29tLCBjZW50ZXIsIHpvb21PcHRpb25zKTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGRvWm9vbShjaGFydEluc3RhbmNlLCB6b29tLCBjZW50ZXIsIHdoaWNoQXhlcz8pIHtcclxuICBjb25zdCBjYSA9IGNoYXJ0SW5zdGFuY2UuY2hhcnRBcmVhO1xyXG4gIGlmICghY2VudGVyKSB7XHJcbiAgICBjZW50ZXIgPSB7XHJcbiAgICAgIHg6IChjYS5sZWZ0ICsgY2EucmlnaHQpIC8gMixcclxuICAgICAgeTogKGNhLnRvcCArIGNhLmJvdHRvbSkgLyAyLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGNvbnN0IHpvb21PcHRpb25zID0gY2hhcnRJbnN0YW5jZS5vcHRpb25zLnpvb207XHJcblxyXG4gIGlmICh6b29tT3B0aW9ucyAmJiBoZWxwZXJzLmdldFZhbHVlT3JEZWZhdWx0KHpvb21PcHRpb25zLmVuYWJsZWQsIGRlZmF1bHRPcHRpb25zLnpvb20uZW5hYmxlZCkpIHtcclxuICAgIC8vIERvIHRoZSB6b29tIGhlcmVcclxuICAgIGNvbnN0IHpvb21Nb2RlID0gaGVscGVycy5nZXRWYWx1ZU9yRGVmYXVsdChjaGFydEluc3RhbmNlLm9wdGlvbnMuem9vbS5tb2RlLCBkZWZhdWx0T3B0aW9ucy56b29tLm1vZGUpO1xyXG4gICAgem9vbU9wdGlvbnMuc2Vuc2l0aXZpdHkgPSBoZWxwZXJzLmdldFZhbHVlT3JEZWZhdWx0KGNoYXJ0SW5zdGFuY2Uub3B0aW9ucy56b29tLnNlbnNpdGl2aXR5LCBkZWZhdWx0T3B0aW9ucy56b29tLnNlbnNpdGl2aXR5KTtcclxuXHJcbiAgICAvLyBXaGljaCBheGUgc2hvdWxkIGJlIG1vZGlmaWVkIHdoZW4gZmlnZXJzIHdlcmUgdXNlZC5cclxuICAgIGxldCBfd2hpY2hBeGVzO1xyXG4gICAgaWYgKHpvb21Nb2RlID09PSAneHknICYmIHdoaWNoQXhlcyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIC8vIGJhc2VkIG9uIGZpbmdlcnMgcG9zaXRpb25zXHJcbiAgICAgIF93aGljaEF4ZXMgPSB3aGljaEF4ZXM7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBubyBlZmZlY3RcclxuICAgICAgX3doaWNoQXhlcyA9ICd4eSc7XHJcbiAgICB9XHJcblxyXG4gICAgaGVscGVycy5lYWNoKGNoYXJ0SW5zdGFuY2Uuc2NhbGVzLCBmdW5jdGlvbihzY2FsZSwgaWQpIHtcclxuICAgICAgaWYgKHNjYWxlLmlzSG9yaXpvbnRhbCgpICYmIGRpcmVjdGlvbkVuYWJsZWQoem9vbU1vZGUsICd4JykgJiYgZGlyZWN0aW9uRW5hYmxlZChfd2hpY2hBeGVzLCAneCcpKSB7XHJcbiAgICAgICAgem9vbU9wdGlvbnMuc2NhbGVBeGVzID0gJ3gnO1xyXG4gICAgICAgIHpvb21TY2FsZShzY2FsZSwgem9vbSwgY2VudGVyLCB6b29tT3B0aW9ucyk7XHJcbiAgICAgIH0gZWxzZSBpZiAoIXNjYWxlLmlzSG9yaXpvbnRhbCgpICYmIGRpcmVjdGlvbkVuYWJsZWQoem9vbU1vZGUsICd5JykgJiYgZGlyZWN0aW9uRW5hYmxlZChfd2hpY2hBeGVzLCAneScpKSB7XHJcbiAgICAgICAgLy8gRG8gWSB6b29tXHJcbiAgICAgICAgem9vbU9wdGlvbnMuc2NhbGVBeGVzID0gJ3knO1xyXG4gICAgICAgIHpvb21TY2FsZShzY2FsZSwgem9vbSwgY2VudGVyLCB6b29tT3B0aW9ucyk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGNoYXJ0SW5zdGFuY2UudXBkYXRlKDApO1xyXG4gICAgaWYgKHR5cGVvZiB6b29tT3B0aW9ucy5vblpvb20gPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgem9vbU9wdGlvbnMub25ab29tKCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBwYW5JbmRleFNjYWxlKHNjYWxlLCBkZWx0YSwgcGFuT3B0aW9ucykge1xyXG4gIGNvbnN0IGxhYmVscyA9IHNjYWxlLmNoYXJ0LmRhdGEubGFiZWxzO1xyXG4gIGNvbnN0IGxhc3RMYWJlbEluZGV4ID0gbGFiZWxzLmxlbmd0aCAtIDE7XHJcbiAgY29uc3Qgb2Zmc2V0QW10ID0gTWF0aC5tYXgoKHNjYWxlLnRpY2tzLmxlbmd0aCAtICgoc2NhbGUub3B0aW9ucy5ncmlkTGluZXMub2Zmc2V0R3JpZExpbmVzKSA/IDAgOiAxKSksIDEpO1xyXG4gIGNvbnN0IHBhblNwZWVkID0gcGFuT3B0aW9ucy5zcGVlZDtcclxuICBsZXQgbWluSW5kZXggPSBzY2FsZS5taW5JbmRleDtcclxuICBjb25zdCBzdGVwID0gTWF0aC5yb3VuZChzY2FsZS53aWR0aCAvIChvZmZzZXRBbXQgKiBwYW5TcGVlZCkpO1xyXG4gIGxldCBtYXhJbmRleDtcclxuXHJcbiAgem9vbU5TLnBhbkN1bXVsYXRpdmVEZWx0YSArPSBkZWx0YTtcclxuXHJcbiAgbWluSW5kZXggPSB6b29tTlMucGFuQ3VtdWxhdGl2ZURlbHRhID4gc3RlcCA/IE1hdGgubWF4KDAsIG1pbkluZGV4IC0gMSkgOiB6b29tTlMucGFuQ3VtdWxhdGl2ZURlbHRhIDwgLXN0ZXAgPyBNYXRoLm1pbihsYXN0TGFiZWxJbmRleCAtIG9mZnNldEFtdCArIDEsIG1pbkluZGV4ICsgMSkgOiBtaW5JbmRleDtcclxuICB6b29tTlMucGFuQ3VtdWxhdGl2ZURlbHRhID0gbWluSW5kZXggIT09IHNjYWxlLm1pbkluZGV4ID8gMCA6IHpvb21OUy5wYW5DdW11bGF0aXZlRGVsdGE7XHJcblxyXG4gIG1heEluZGV4ID0gTWF0aC5taW4obGFzdExhYmVsSW5kZXgsIG1pbkluZGV4ICsgb2Zmc2V0QW10IC0gMSk7XHJcblxyXG4gIHNjYWxlLm9wdGlvbnMudGlja3MubWluID0gcmFuZ2VNaW5MaW1pdGVyKHBhbk9wdGlvbnMsIGxhYmVsc1ttaW5JbmRleF0pO1xyXG4gIHNjYWxlLm9wdGlvbnMudGlja3MubWF4ID0gcmFuZ2VNYXhMaW1pdGVyKHBhbk9wdGlvbnMsIGxhYmVsc1ttYXhJbmRleF0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBwYW5UaW1lU2NhbGUoc2NhbGUsIGRlbHRhLCBwYW5PcHRpb25zKSB7XHJcbiAgY29uc3Qgb3B0aW9ucyA9IHNjYWxlLm9wdGlvbnM7XHJcbiAgY29uc3QgbGltaXRlZE1heCA9IHJhbmdlTWF4TGltaXRlcihwYW5PcHRpb25zLCBzY2FsZS5nZXRWYWx1ZUZvclBpeGVsKHNjYWxlLmdldFBpeGVsRm9yVmFsdWUoc2NhbGUubWF4KSAtIGRlbHRhKSk7XHJcbiAgY29uc3QgbGltaXRlZE1pbiA9IHJhbmdlTWluTGltaXRlcihwYW5PcHRpb25zLCBzY2FsZS5nZXRWYWx1ZUZvclBpeGVsKHNjYWxlLmdldFBpeGVsRm9yVmFsdWUoc2NhbGUubWluKSAtIGRlbHRhKSk7XHJcblxyXG4gIGNvbnN0IGxpbWl0ZWRUaW1lRGVsdGEgPSBkZWx0YSA8IDAgPyBsaW1pdGVkTWF4IC0gc2NhbGUubWF4IDogbGltaXRlZE1pbiAtIHNjYWxlLm1pbjtcclxuXHJcbiAgb3B0aW9ucy50aW1lLm1heCA9IHNjYWxlLm1heCArIGxpbWl0ZWRUaW1lRGVsdGE7XHJcbiAgb3B0aW9ucy50aW1lLm1pbiA9IHNjYWxlLm1pbiArIGxpbWl0ZWRUaW1lRGVsdGE7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHBhbk51bWVyaWNhbFNjYWxlKHNjYWxlLCBkZWx0YSwgcGFuT3B0aW9ucykge1xyXG4gIGNvbnN0IHRpY2tPcHRzID0gc2NhbGUub3B0aW9ucy50aWNrcztcclxuICBjb25zdCBzdGFydCA9IHNjYWxlLnN0YXJ0LFxyXG4gICAgZW5kID0gc2NhbGUuZW5kO1xyXG5cclxuICBpZiAodGlja09wdHMucmV2ZXJzZSkge1xyXG4gICAgdGlja09wdHMubWF4ID0gc2NhbGUuZ2V0VmFsdWVGb3JQaXhlbChzY2FsZS5nZXRQaXhlbEZvclZhbHVlKHN0YXJ0KSAtIGRlbHRhKTtcclxuICAgIHRpY2tPcHRzLm1pbiA9IHNjYWxlLmdldFZhbHVlRm9yUGl4ZWwoc2NhbGUuZ2V0UGl4ZWxGb3JWYWx1ZShlbmQpIC0gZGVsdGEpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICB0aWNrT3B0cy5taW4gPSBzY2FsZS5nZXRWYWx1ZUZvclBpeGVsKHNjYWxlLmdldFBpeGVsRm9yVmFsdWUoc3RhcnQpIC0gZGVsdGEpO1xyXG4gICAgdGlja09wdHMubWF4ID0gc2NhbGUuZ2V0VmFsdWVGb3JQaXhlbChzY2FsZS5nZXRQaXhlbEZvclZhbHVlKGVuZCkgLSBkZWx0YSk7XHJcbiAgfVxyXG4gIHRpY2tPcHRzLm1pbiA9IHJhbmdlTWluTGltaXRlcihwYW5PcHRpb25zLCB0aWNrT3B0cy5taW4pO1xyXG4gIHRpY2tPcHRzLm1heCA9IHJhbmdlTWF4TGltaXRlcihwYW5PcHRpb25zLCB0aWNrT3B0cy5tYXgpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBwYW5TY2FsZShzY2FsZSwgZGVsdGEsIHBhbk9wdGlvbnMpIHtcclxuICBjb25zdCBmbiA9IHBhbkZ1bmN0aW9uc1tzY2FsZS5vcHRpb25zLnR5cGVdO1xyXG4gIGlmIChmbikge1xyXG4gICAgZm4oc2NhbGUsIGRlbHRhLCBwYW5PcHRpb25zKTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGRvUGFuKGNoYXJ0SW5zdGFuY2UsIGRlbHRhWCwgZGVsdGFZKSB7XHJcbiAgY29uc3QgcGFuT3B0aW9ucyA9IGNoYXJ0SW5zdGFuY2Uub3B0aW9ucy5wYW47XHJcbiAgaWYgKHBhbk9wdGlvbnMgJiYgaGVscGVycy5nZXRWYWx1ZU9yRGVmYXVsdChwYW5PcHRpb25zLmVuYWJsZWQsIGRlZmF1bHRPcHRpb25zLnBhbi5lbmFibGVkKSkge1xyXG4gICAgY29uc3QgcGFuTW9kZSA9IGhlbHBlcnMuZ2V0VmFsdWVPckRlZmF1bHQoY2hhcnRJbnN0YW5jZS5vcHRpb25zLnBhbi5tb2RlLCBkZWZhdWx0T3B0aW9ucy5wYW4ubW9kZSk7XHJcbiAgICBwYW5PcHRpb25zLnNwZWVkID0gaGVscGVycy5nZXRWYWx1ZU9yRGVmYXVsdChjaGFydEluc3RhbmNlLm9wdGlvbnMucGFuLnNwZWVkLCBkZWZhdWx0T3B0aW9ucy5wYW4uc3BlZWQpO1xyXG5cclxuICAgIGhlbHBlcnMuZWFjaChjaGFydEluc3RhbmNlLnNjYWxlcywgZnVuY3Rpb24oc2NhbGUsIGlkKSB7XHJcbiAgICAgIGlmIChzY2FsZS5pc0hvcml6b250YWwoKSAmJiBkaXJlY3Rpb25FbmFibGVkKHBhbk1vZGUsICd4JykgJiYgZGVsdGFYICE9PSAwKSB7XHJcbiAgICAgICAgcGFuT3B0aW9ucy5zY2FsZUF4ZXMgPSAneCc7XHJcbiAgICAgICAgcGFuU2NhbGUoc2NhbGUsIGRlbHRhWCwgcGFuT3B0aW9ucyk7XHJcbiAgICAgIH0gZWxzZSBpZiAoIXNjYWxlLmlzSG9yaXpvbnRhbCgpICYmIGRpcmVjdGlvbkVuYWJsZWQocGFuTW9kZSwgJ3knKSAmJiBkZWx0YVkgIT09IDApIHtcclxuICAgICAgICBwYW5PcHRpb25zLnNjYWxlQXhlcyA9ICd5JztcclxuICAgICAgICBwYW5TY2FsZShzY2FsZSwgZGVsdGFZLCBwYW5PcHRpb25zKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgY2hhcnRJbnN0YW5jZS51cGRhdGUoMCk7XHJcbiAgICBpZiAodHlwZW9mIHBhbk9wdGlvbnMub25QYW4gPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgcGFuT3B0aW9ucy5vblBhbigpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gcG9zaXRpb25JbkNoYXJ0QXJlYShjaGFydEluc3RhbmNlLCBwb3NpdGlvbikge1xyXG4gIHJldHVybiAgIChwb3NpdGlvbi54ID49IGNoYXJ0SW5zdGFuY2UuY2hhcnRBcmVhLmxlZnQgJiYgcG9zaXRpb24ueCA8PSBjaGFydEluc3RhbmNlLmNoYXJ0QXJlYS5yaWdodCkgJiZcclxuICAgIChwb3NpdGlvbi55ID49IGNoYXJ0SW5zdGFuY2UuY2hhcnRBcmVhLnRvcCAmJiBwb3NpdGlvbi55IDw9IGNoYXJ0SW5zdGFuY2UuY2hhcnRBcmVhLmJvdHRvbSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldFlBeGlzKGNoYXJ0SW5zdGFuY2UpIHtcclxuICBjb25zdCBzY2FsZXMgPSBjaGFydEluc3RhbmNlLnNjYWxlcztcclxuXHJcbiAgZm9yIChjb25zdCBzY2FsZUlkIGluIHNjYWxlcykge1xyXG4gICAgaWYgKHNjYWxlcy5oYXNPd25Qcm9wZXJ0eShzY2FsZUlkKSkge1xyXG4gICAgICBjb25zdCBzY2FsZSA9IHNjYWxlc1tzY2FsZUlkXTtcclxuICAgICAgaWYgKCFzY2FsZS5pc0hvcml6b250YWwoKSkge1xyXG4gICAgICAgIHJldHVybiBzY2FsZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuLy8gU3RvcmUgdGhlc2UgZm9yIGxhdGVyXHJcbnpvb21OUy56b29tRnVuY3Rpb25zLmNhdGVnb3J5ID0gem9vbUluZGV4U2NhbGU7XHJcbnpvb21OUy56b29tRnVuY3Rpb25zLnRpbWUgPSB6b29tVGltZVNjYWxlO1xyXG56b29tTlMuem9vbUZ1bmN0aW9ucy5saW5lYXIgPSB6b29tTnVtZXJpY2FsU2NhbGU7XHJcbnpvb21OUy56b29tRnVuY3Rpb25zLmxvZ2FyaXRobWljID0gem9vbU51bWVyaWNhbFNjYWxlO1xyXG56b29tTlMucGFuRnVuY3Rpb25zLmNhdGVnb3J5ID0gcGFuSW5kZXhTY2FsZTtcclxuem9vbU5TLnBhbkZ1bmN0aW9ucy50aW1lID0gcGFuVGltZVNjYWxlO1xyXG56b29tTlMucGFuRnVuY3Rpb25zLmxpbmVhciA9IHBhbk51bWVyaWNhbFNjYWxlO1xyXG56b29tTlMucGFuRnVuY3Rpb25zLmxvZ2FyaXRobWljID0gcGFuTnVtZXJpY2FsU2NhbGU7XHJcbi8vIEdsb2JhbHMgZm9yIGNhdGVyZ29yeSBwYW4gYW5kIHpvb21cclxuem9vbU5TLnBhbkN1bXVsYXRpdmVEZWx0YSA9IDA7XHJcbnpvb21OUy56b29tQ3VtdWxhdGl2ZURlbHRhID0gMDtcclxuXHJcbi8vIENoYXJ0anMgWm9vbSBQbHVnaW5cclxuZXhwb3J0IGNvbnN0IHpvb21QbHVnaW4gPSB7XHJcbiAgYWZ0ZXJJbml0OiBmdW5jdGlvbihjaGFydEluc3RhbmNlKSB7XHJcbiAgICBoZWxwZXJzLmVhY2goY2hhcnRJbnN0YW5jZS5zY2FsZXMsIGZ1bmN0aW9uKHNjYWxlKSB7XHJcbiAgICAgIHNjYWxlLm9yaWdpbmFsT3B0aW9ucyA9IGhlbHBlcnMuY2xvbmUoc2NhbGUub3B0aW9ucyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjaGFydEluc3RhbmNlLnJlc2V0Wm9vbSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICBoZWxwZXJzLmVhY2goY2hhcnRJbnN0YW5jZS5zY2FsZXMsIGZ1bmN0aW9uKHNjYWxlLCBpZCkge1xyXG4gICAgICAgIGNvbnN0IHRpbWVPcHRpb25zID0gc2NhbGUub3B0aW9ucy50aW1lO1xyXG4gICAgICAgIGNvbnN0IHRpY2tPcHRpb25zID0gc2NhbGUub3B0aW9ucy50aWNrcztcclxuXHJcbiAgICAgICAgaWYgKHRpbWVPcHRpb25zKSB7XHJcbiAgICAgICAgICB0aW1lT3B0aW9ucy5taW4gPSBzY2FsZS5vcmlnaW5hbE9wdGlvbnMudGltZS5taW47XHJcbiAgICAgICAgICB0aW1lT3B0aW9ucy5tYXggPSBzY2FsZS5vcmlnaW5hbE9wdGlvbnMudGltZS5tYXg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGlja09wdGlvbnMpIHtcclxuICAgICAgICAgIHRpY2tPcHRpb25zLm1pbiA9IHNjYWxlLm9yaWdpbmFsT3B0aW9ucy50aWNrcy5taW47XHJcbiAgICAgICAgICB0aWNrT3B0aW9ucy5tYXggPSBzY2FsZS5vcmlnaW5hbE9wdGlvbnMudGlja3MubWF4O1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICBoZWxwZXJzLmVhY2goY2hhcnRJbnN0YW5jZS5kYXRhLmRhdGFzZXRzLCBmdW5jdGlvbihkYXRhc2V0LCBpZCkge1xyXG4gICAgICAgIGRhdGFzZXQuX21ldGEgPSBudWxsO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGNoYXJ0SW5zdGFuY2UudXBkYXRlKCk7XHJcbiAgICB9O1xyXG5cclxuICB9LFxyXG4gIGJlZm9yZUluaXQ6IGZ1bmN0aW9uKGNoYXJ0SW5zdGFuY2UpIHtcclxuICAgIGNoYXJ0SW5zdGFuY2Uuem9vbSA9IHt9O1xyXG5cclxuICAgIGNvbnN0IG5vZGUgPSBjaGFydEluc3RhbmNlLnpvb20ubm9kZSA9IGNoYXJ0SW5zdGFuY2UuY2hhcnQuY3R4LmNhbnZhcztcclxuXHJcbiAgICBjb25zdCBvcHRpb25zID0gY2hhcnRJbnN0YW5jZS5vcHRpb25zO1xyXG4gICAgY29uc3QgcGFuVGhyZXNob2xkID0gaGVscGVycy5nZXRWYWx1ZU9yRGVmYXVsdChvcHRpb25zLnBhbiA/IG9wdGlvbnMucGFuLnRocmVzaG9sZCA6IHVuZGVmaW5lZCwgem9vbU5TLmRlZmF1bHRzLnBhbi50aHJlc2hvbGQpO1xyXG4gICAgaWYgKCFvcHRpb25zLnpvb20gfHwgIW9wdGlvbnMuem9vbS5lbmFibGVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChvcHRpb25zLnpvb20uZHJhZykge1xyXG4gICAgICAvLyBPbmx5IHdhbnQgdG8gem9vbSBob3Jpem9udGFsIGF4aXNcclxuICAgICAgb3B0aW9ucy56b29tLm1vZGUgPSAneCc7XHJcblxyXG4gICAgICBjaGFydEluc3RhbmNlLnpvb20uX21vdXNlRG93bkhhbmRsZXIgPSBmdW5jdGlvbihldmVudCkge1xyXG4gICAgICAgIGNoYXJ0SW5zdGFuY2Uuem9vbS5fZHJhZ1pvb21TdGFydCA9IGV2ZW50O1xyXG4gICAgICB9O1xyXG4gICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIGNoYXJ0SW5zdGFuY2Uuem9vbS5fbW91c2VEb3duSGFuZGxlcik7XHJcblxyXG4gICAgICBjaGFydEluc3RhbmNlLnpvb20uX21vdXNlTW92ZUhhbmRsZXIgPSBmdW5jdGlvbihldmVudCkge1xyXG4gICAgICAgIGlmIChjaGFydEluc3RhbmNlLnpvb20uX2RyYWdab29tU3RhcnQpIHtcclxuICAgICAgICAgIGNoYXJ0SW5zdGFuY2Uuem9vbS5fZHJhZ1pvb21FbmQgPSBldmVudDtcclxuICAgICAgICAgIGNoYXJ0SW5zdGFuY2UudXBkYXRlKDApO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBjaGFydEluc3RhbmNlLnpvb20uX21vdXNlTW92ZUhhbmRsZXIpO1xyXG5cclxuICAgICAgY2hhcnRJbnN0YW5jZS56b29tLl9tb3VzZVVwSGFuZGxlciA9IGZ1bmN0aW9uKGV2ZW50KSB7XHJcbiAgICAgICAgaWYgKGNoYXJ0SW5zdGFuY2Uuem9vbS5fZHJhZ1pvb21TdGFydCkge1xyXG4gICAgICAgICAgY29uc3QgY2hhcnRBcmVhID0gY2hhcnRJbnN0YW5jZS5jaGFydEFyZWE7XHJcbiAgICAgICAgICBjb25zdCB5QXhpcyA9IGdldFlBeGlzKGNoYXJ0SW5zdGFuY2UpO1xyXG4gICAgICAgICAgY29uc3QgYmVnaW5Qb2ludCA9IGNoYXJ0SW5zdGFuY2Uuem9vbS5fZHJhZ1pvb21TdGFydDtcclxuICAgICAgICAgIGNvbnN0IG9mZnNldFggPSBiZWdpblBvaW50LnRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0O1xyXG4gICAgICAgICAgY29uc3Qgc3RhcnRYID0gTWF0aC5tYXgoTWF0aC5taW4oYmVnaW5Qb2ludC5jbGllbnRYLCBldmVudC5jbGllbnRYKSAtIG9mZnNldFgsIGNoYXJ0QXJlYS5sZWZ0KTtcclxuICAgICAgICAgIGNvbnN0IGVuZFggPSBNYXRoLm1pbihNYXRoLm1heChiZWdpblBvaW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFgpIC0gb2Zmc2V0WCwgY2hhcnRBcmVhLnJpZ2h0KTtcclxuICAgICAgICAgIGNvbnN0IGRyYWdEaXN0YW5jZSA9IGVuZFggLSBzdGFydFg7XHJcbiAgICAgICAgICBjb25zdCBjaGFydERpc3RhbmNlID0gY2hhcnRBcmVhLnJpZ2h0IC0gY2hhcnRBcmVhLmxlZnQ7XHJcbiAgICAgICAgICBjb25zdCB6b29tID0gMSArIChjaGFydERpc3RhbmNlIC0gZHJhZ0Rpc3RhbmNlKSAvIGNoYXJ0RGlzdGFuY2U7XHJcbiAgICAgICAgICBjb25zdCBjZW50ZXJYID0gY2hhcnRBcmVhLmxlZnQgKyAoc3RhcnRYIC0gY2hhcnRBcmVhLmxlZnQpIC8gKHpvb20gLSAxKTtcclxuXHJcbiAgICAgICAgICAvLyBSZW1vdmUgZHJhZyBzdGFydCBhbmQgZW5kIGJlZm9yZSBjaGFydCB1cGRhdGUgdG8gc3RvcCBkcmF3aW5nIHNlbGVjdGVkIGFyZWFcclxuICAgICAgICAgIGNoYXJ0SW5zdGFuY2Uuem9vbS5fZHJhZ1pvb21TdGFydCA9IG51bGw7XHJcbiAgICAgICAgICBjaGFydEluc3RhbmNlLnpvb20uX2RyYWdab29tRW5kID0gbnVsbDtcclxuXHJcbiAgICAgICAgICBpZiAoZHJhZ0Rpc3RhbmNlID4gMCkge1xyXG4gICAgICAgICAgICBkb1pvb20oY2hhcnRJbnN0YW5jZSwgem9vbSwge1xyXG4gICAgICAgICAgICAgIHg6IGNlbnRlclgsXHJcbiAgICAgICAgICAgICAgeTogKHlBeGlzLmJvdHRvbSAtIHlBeGlzLnRvcCkgLyAyLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICAgIC8vIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIGNoYXJ0SW5zdGFuY2Uuem9vbS5fbW91c2VVcEhhbmRsZXIpO1xyXG4gICAgICBub2RlLm93bmVyRG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIGNoYXJ0SW5zdGFuY2Uuem9vbS5fbW91c2VVcEhhbmRsZXIpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY2hhcnRJbnN0YW5jZS56b29tLl93aGVlbEhhbmRsZXIgPSBmdW5jdGlvbihldmVudCkge1xyXG4gICAgICAgIGNvbnN0IHJlY3QgPSBldmVudC50YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgY29uc3Qgb2Zmc2V0WCA9IGV2ZW50LmNsaWVudFggLSByZWN0LmxlZnQ7XHJcbiAgICAgICAgY29uc3Qgb2Zmc2V0WSA9IGV2ZW50LmNsaWVudFkgLSByZWN0LnRvcDtcclxuXHJcbiAgICAgICAgY29uc3QgY2VudGVyID0ge1xyXG4gICAgICAgICAgeCA6IG9mZnNldFgsXHJcbiAgICAgICAgICB5IDogb2Zmc2V0WVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGlmIChldmVudC5kZWx0YVkgPCAwKSB7XHJcbiAgICAgICAgICBkb1pvb20oY2hhcnRJbnN0YW5jZSwgMS4xLCBjZW50ZXIpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBkb1pvb20oY2hhcnRJbnN0YW5jZSwgMC45MDksIGNlbnRlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFByZXZlbnQgdGhlIGV2ZW50IGZyb20gdHJpZ2dlcmluZyB0aGUgZGVmYXVsdCBiZWhhdmlvciAoZWcuIENvbnRlbnQgc2Nyb2xsaW5nKS5cclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCd3aGVlbCcsIGNoYXJ0SW5zdGFuY2Uuem9vbS5fd2hlZWxIYW5kbGVyKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoSGFtbWVyKSB7XHJcbiAgICAgIGNvbnN0IG1jID0gbmV3IEhhbW1lci5NYW5hZ2VyKG5vZGUpO1xyXG4gICAgICBtYy5hZGQobmV3IEhhbW1lci5QaW5jaCgpKTtcclxuICAgICAgbWMuYWRkKG5ldyBIYW1tZXIuUGFuKHtcclxuICAgICAgICB0aHJlc2hvbGQ6IHBhblRocmVzaG9sZFxyXG4gICAgICB9KSk7XHJcblxyXG4gICAgICAvLyBIYW1tZXIgcmVwb3J0cyB0aGUgdG90YWwgc2NhbGluZy4gV2UgbmVlZCB0aGUgaW5jcmVtZW50YWwgYW1vdW50XHJcbiAgICAgIGxldCBjdXJyZW50UGluY2hTY2FsaW5nO1xyXG4gICAgICBjb25zdCBoYW5kbGVQaW5jaCA9IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgY29uc3QgZGlmZiA9IDEgLyAoY3VycmVudFBpbmNoU2NhbGluZykgKiBlLnNjYWxlO1xyXG4gICAgICAgIGNvbnN0IHJlY3QgPSBlLnRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICBjb25zdCBvZmZzZXRYID0gZS5jZW50ZXIueCAtIHJlY3QubGVmdDtcclxuICAgICAgICBjb25zdCBvZmZzZXRZID0gZS5jZW50ZXIueSAtIHJlY3QudG9wO1xyXG4gICAgICAgIGNvbnN0IGNlbnRlciA9IHtcclxuICAgICAgICAgIHggOiBvZmZzZXRYLFxyXG4gICAgICAgICAgeSA6IG9mZnNldFlcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvLyBmaW5nZXJzIHBvc2l0aW9uIGRpZmZlcmVuY2VcclxuICAgICAgICBjb25zdCB4ID0gTWF0aC5hYnMoZS5wb2ludGVyc1swXS5jbGllbnRYIC0gZS5wb2ludGVyc1sxXS5jbGllbnRYKTtcclxuICAgICAgICBjb25zdCB5ID0gTWF0aC5hYnMoZS5wb2ludGVyc1swXS5jbGllbnRZIC0gZS5wb2ludGVyc1sxXS5jbGllbnRZKTtcclxuXHJcbiAgICAgICAgLy8gZGlhZ29uYWwgZmluZ2VycyB3aWxsIGNoYW5nZSBib3RoICh4eSkgYXhlc1xyXG4gICAgICAgIGNvbnN0IHAgPSB4IC8geTtcclxuICAgICAgICBsZXQgeHk7XHJcbiAgICAgICAgaWYgKHAgPiAwLjMgJiYgcCA8IDEuNykge1xyXG4gICAgICAgICAgeHkgPSAneHknO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoeCA+IHkpIHtcclxuICAgICAgICAgIC8vIHggYXhpc1xyXG4gICAgICAgICAgeHkgPSAneCc7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIHkgYXhpc1xyXG4gICAgICAgICAgeHkgPSAneSc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkb1pvb20oY2hhcnRJbnN0YW5jZSwgZGlmZiwgY2VudGVyLCB4eSk7XHJcblxyXG4gICAgICAgIC8vIEtlZXAgdHJhY2sgb2Ygb3ZlcmFsbCBzY2FsZVxyXG4gICAgICAgIGN1cnJlbnRQaW5jaFNjYWxpbmcgPSBlLnNjYWxlO1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgbWMub24oJ3BpbmNoc3RhcnQnLCBmdW5jdGlvbihlKSB7XHJcbiAgICAgICAgY3VycmVudFBpbmNoU2NhbGluZyA9IDE7IC8vIHJlc2V0IHRyYWNrZXJcclxuICAgICAgfSk7XHJcbiAgICAgIG1jLm9uKCdwaW5jaCcsIGhhbmRsZVBpbmNoKTtcclxuICAgICAgbWMub24oJ3BpbmNoZW5kJywgZnVuY3Rpb24oZSkge1xyXG4gICAgICAgIGhhbmRsZVBpbmNoKGUpO1xyXG4gICAgICAgIGN1cnJlbnRQaW5jaFNjYWxpbmcgPSBudWxsOyAvLyByZXNldFxyXG4gICAgICAgIHpvb21OUy56b29tQ3VtdWxhdGl2ZURlbHRhID0gMDtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBsZXQgY3VycmVudERlbHRhWCA9IG51bGwsIGN1cnJlbnREZWx0YVkgPSBudWxsLCBwYW5uaW5nID0gZmFsc2U7XHJcbiAgICAgIGNvbnN0IGhhbmRsZVBhbiA9IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgaWYgKGN1cnJlbnREZWx0YVggIT09IG51bGwgJiYgY3VycmVudERlbHRhWSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgcGFubmluZyA9IHRydWU7XHJcbiAgICAgICAgICBjb25zdCBkZWx0YVggPSBlLmRlbHRhWCAtIGN1cnJlbnREZWx0YVg7XHJcbiAgICAgICAgICBjb25zdCBkZWx0YVkgPSBlLmRlbHRhWSAtIGN1cnJlbnREZWx0YVk7XHJcbiAgICAgICAgICBjdXJyZW50RGVsdGFYID0gZS5kZWx0YVg7XHJcbiAgICAgICAgICBjdXJyZW50RGVsdGFZID0gZS5kZWx0YVk7XHJcbiAgICAgICAgICBkb1BhbihjaGFydEluc3RhbmNlLCBkZWx0YVgsIGRlbHRhWSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgbWMub24oJ3BhbnN0YXJ0JywgZnVuY3Rpb24oZSkge1xyXG4gICAgICAgIGN1cnJlbnREZWx0YVggPSAwO1xyXG4gICAgICAgIGN1cnJlbnREZWx0YVkgPSAwO1xyXG4gICAgICAgIGhhbmRsZVBhbihlKTtcclxuICAgICAgfSk7XHJcbiAgICAgIG1jLm9uKCdwYW5tb3ZlJywgaGFuZGxlUGFuKTtcclxuICAgICAgbWMub24oJ3BhbmVuZCcsIGZ1bmN0aW9uKGUpIHtcclxuICAgICAgICBjdXJyZW50RGVsdGFYID0gbnVsbDtcclxuICAgICAgICBjdXJyZW50RGVsdGFZID0gbnVsbDtcclxuICAgICAgICB6b29tTlMucGFuQ3VtdWxhdGl2ZURlbHRhID0gMDtcclxuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBwYW5uaW5nID0gZmFsc2U7IH0sIDUwMCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgY2hhcnRJbnN0YW5jZS56b29tLl9naG9zdENsaWNrSGFuZGxlciA9IGZ1bmN0aW9uKGUpIHtcclxuICAgICAgICBpZiAocGFubmluZykge1xyXG4gICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjaGFydEluc3RhbmNlLnpvb20uX2dob3N0Q2xpY2tIYW5kbGVyKTtcclxuXHJcbiAgICAgIGNoYXJ0SW5zdGFuY2UuX21jID0gbWM7XHJcbiAgICB9XHJcbiAgfSxcclxuXHJcbiAgYmVmb3JlRGF0YXNldHNEcmF3OiBmdW5jdGlvbihjaGFydEluc3RhbmNlKSB7XHJcbiAgICBjb25zdCBjdHggPSBjaGFydEluc3RhbmNlLmNoYXJ0LmN0eDtcclxuICAgIGNvbnN0IGNoYXJ0QXJlYSA9IGNoYXJ0SW5zdGFuY2UuY2hhcnRBcmVhO1xyXG4gICAgY3R4LnNhdmUoKTtcclxuICAgIGN0eC5iZWdpblBhdGgoKTtcclxuXHJcbiAgICBpZiAoY2hhcnRJbnN0YW5jZS56b29tLl9kcmFnWm9vbUVuZCkge1xyXG4gICAgICBjb25zdCB5QXhpcyA9IGdldFlBeGlzKGNoYXJ0SW5zdGFuY2UpO1xyXG4gICAgICBjb25zdCBiZWdpblBvaW50ID0gY2hhcnRJbnN0YW5jZS56b29tLl9kcmFnWm9vbVN0YXJ0O1xyXG4gICAgICBjb25zdCBlbmRQb2ludCA9IGNoYXJ0SW5zdGFuY2Uuem9vbS5fZHJhZ1pvb21FbmQ7XHJcbiAgICAgIGNvbnN0IG9mZnNldFggPSBiZWdpblBvaW50LnRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0O1xyXG4gICAgICBjb25zdCBzdGFydFggPSBNYXRoLm1pbihiZWdpblBvaW50LmNsaWVudFgsIGVuZFBvaW50LmNsaWVudFgpIC0gb2Zmc2V0WDtcclxuICAgICAgY29uc3QgZW5kWCA9IE1hdGgubWF4KGJlZ2luUG9pbnQuY2xpZW50WCwgZW5kUG9pbnQuY2xpZW50WCkgLSBvZmZzZXRYO1xyXG4gICAgICBjb25zdCByZWN0V2lkdGggPSBlbmRYIC0gc3RhcnRYO1xyXG5cclxuXHJcbiAgICAgIGN0eC5maWxsU3R5bGUgPSAncmdiYSgyMjUsMjI1LDIyNSwwLjUpJztcclxuICAgICAgY3R4LmxpbmVXaWR0aCA9IDU7XHJcbiAgICAgIGN0eC5maWxsUmVjdChzdGFydFgsIHlBeGlzLnRvcCwgcmVjdFdpZHRoLCB5QXhpcy5ib3R0b20gLSB5QXhpcy50b3ApO1xyXG4gICAgfVxyXG5cclxuICAgIGN0eC5yZWN0KGNoYXJ0QXJlYS5sZWZ0LCBjaGFydEFyZWEudG9wLCBjaGFydEFyZWEucmlnaHQgLSBjaGFydEFyZWEubGVmdCwgY2hhcnRBcmVhLmJvdHRvbSAtIGNoYXJ0QXJlYS50b3ApO1xyXG4gICAgY3R4LmNsaXAoKTtcclxuICB9LFxyXG5cclxuICBhZnRlckRhdGFzZXRzRHJhdzogZnVuY3Rpb24oY2hhcnRJbnN0YW5jZSkge1xyXG4gICAgY2hhcnRJbnN0YW5jZS5jaGFydC5jdHgucmVzdG9yZSgpO1xyXG4gIH0sXHJcblxyXG4gIGRlc3Ryb3k6IGZ1bmN0aW9uKGNoYXJ0SW5zdGFuY2UpIHtcclxuICAgIGlmIChjaGFydEluc3RhbmNlLnpvb20pIHtcclxuICAgICAgY29uc3Qgb3B0aW9ucyA9IGNoYXJ0SW5zdGFuY2Uub3B0aW9ucztcclxuICAgICAgY29uc3Qgbm9kZSA9IGNoYXJ0SW5zdGFuY2Uuem9vbS5ub2RlO1xyXG5cclxuICAgICAgaWYgKG9wdGlvbnMuem9vbSAmJiBvcHRpb25zLnpvb20uZHJhZykge1xyXG4gICAgICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgY2hhcnRJbnN0YW5jZS56b29tLl9tb3VzZURvd25IYW5kbGVyKTtcclxuICAgICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIGNoYXJ0SW5zdGFuY2Uuem9vbS5fbW91c2VNb3ZlSGFuZGxlcik7XHJcbiAgICAgICAgLy8gbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgY2hhcnRJbnN0YW5jZS56b29tLl9tb3VzZVVwSGFuZGxlcik7XHJcbiAgICAgICAgbm9kZS5vd25lckRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBjaGFydEluc3RhbmNlLnpvb20uX21vdXNlVXBIYW5kbGVyKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3doZWVsJywgY2hhcnRJbnN0YW5jZS56b29tLl93aGVlbEhhbmRsZXIpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoSGFtbWVyKSB7XHJcbiAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGNoYXJ0SW5zdGFuY2Uuem9vbS5fZ2hvc3RDbGlja0hhbmRsZXIpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBkZWxldGUgY2hhcnRJbnN0YW5jZS56b29tO1xyXG5cclxuICAgICAgY29uc3QgbWMgPSBjaGFydEluc3RhbmNlLl9tYztcclxuICAgICAgaWYgKG1jKSB7XHJcbiAgICAgICAgbWMucmVtb3ZlKCdwaW5jaHN0YXJ0Jyk7XHJcbiAgICAgICAgbWMucmVtb3ZlKCdwaW5jaCcpO1xyXG4gICAgICAgIG1jLnJlbW92ZSgncGluY2hlbmQnKTtcclxuICAgICAgICBtYy5yZW1vdmUoJ3BhbnN0YXJ0Jyk7XHJcbiAgICAgICAgbWMucmVtb3ZlKCdwYW4nKTtcclxuICAgICAgICBtYy5yZW1vdmUoJ3BhbmVuZCcpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59O1xyXG5cclxuQ2hhcnQucGx1Z2luU2VydmljZS5yZWdpc3Rlcih6b29tUGx1Z2luKTtcclxuIl19