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,609 +0,0 @@
1
- /**
2
- * @fileoverview added by tsickle
3
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
- */
5
- import { Injectable } from '@angular/core';
6
- import { calculateValue, calculateValue4Time, getDefaultPort, getPort, getTimeFromTimeZone, isSamePort, isValidPort, printProcessedTime, validateData } from '../utils';
7
- import { parse } from 'papaparse';
8
- import { Abort } from '../types';
9
- /**
10
- * prevent browser from crashing, set the max rows limitation.
11
- * This could be overwritten by the input:maxRowsLimitation of the component.
12
- * @type {?}
13
- */
14
- var _DEFAULT_MAX_ROWS_IN_MEMORY = 100000;
15
- var FileService = /** @class */ (function () {
16
- function FileService() {
17
- }
18
- /**
19
- * prevent browser from crashing, set the max rows limitation.
20
- * @param limitation if this parameter is not null, the default value will be overwritten by this one.
21
- */
22
- /**
23
- * prevent browser from crashing, set the max rows limitation.
24
- * @private
25
- * @param {?=} limitation if this parameter is not null, the default value will be overwritten by this one.
26
- * @return {?}
27
- */
28
- FileService._getMaxRowsLimitation = /**
29
- * prevent browser from crashing, set the max rows limitation.
30
- * @private
31
- * @param {?=} limitation if this parameter is not null, the default value will be overwritten by this one.
32
- * @return {?}
33
- */
34
- function (limitation) {
35
- if (limitation === void 0) { limitation = null; }
36
- if (limitation == null || isNaN(limitation) || limitation.length === 0) {
37
- return _DEFAULT_MAX_ROWS_IN_MEMORY;
38
- }
39
- return Number(limitation);
40
- };
41
- /**
42
- * get all available ports from data
43
- */
44
- /**
45
- * get all available ports from data
46
- * @private
47
- * @param {?} data
48
- * @param {?} firstChunk
49
- * @param {?} ports
50
- * @return {?}
51
- */
52
- FileService._getPorts = /**
53
- * get all available ports from data
54
- * @private
55
- * @param {?} data
56
- * @param {?} firstChunk
57
- * @param {?} ports
58
- * @return {?}
59
- */
60
- function (data, firstChunk, ports) {
61
- /** @type {?} */
62
- var line = 0;
63
- if (firstChunk) {
64
- // start from line 3
65
- line = 2;
66
- }
67
- for (; line < data.length; line++) {
68
- /** @type {?} */
69
- var dataItem = data[line][1];
70
- if (dataItem != null && dataItem.length > 0) {
71
- if (isValidPort(dataItem) && ports.indexOf(dataItem) === -1) {
72
- ports.push(dataItem);
73
- }
74
- }
75
- }
76
- };
77
- /**
78
- * get the time column from the analyzed data
79
- * @param data the analyzed data
80
- * @param firstChunk whether it's first chunk or not
81
- * @param startTime selected starting time. It's millisecond, need to be converted second.
82
- * @param endTime selected ending time. It's millisecond, need to be converted second.
83
- * @param lastProcessedTime last processed time form last chunk
84
- * @param time time object which contains the time data for all ports
85
- * @param selectedPort if the selected port is empty (did not select any port), all ports info are needed
86
- * @param isMDC flag for MDC system
87
- * @param timezone selected timezone
88
- * @param maxRowsLimitation prevent browser from crashing, set the max rows limitation.
89
- * This comes from the input: maxRowsLimitation of the component.
90
- */
91
- /**
92
- * get the time column from the analyzed data
93
- * @private
94
- * @param {?} data the analyzed data
95
- * @param {?} firstChunk whether it's first chunk or not
96
- * @param {?} startTime selected starting time. It's millisecond, need to be converted second.
97
- * @param {?} endTime selected ending time. It's millisecond, need to be converted second.
98
- * @param {?} lastProcessedTime last processed time form last chunk
99
- * @param {?} time time object which contains the time data for all ports
100
- * @param {?} selectedPort if the selected port is empty (did not select any port), all ports info are needed
101
- * @param {?} isMDC flag for MDC system
102
- * @param {?} timezone selected timezone
103
- * @param {?} maxRowsLimitation prevent browser from crashing, set the max rows limitation.
104
- * This comes from the input: maxRowsLimitation of the component.
105
- * @return {?}
106
- */
107
- FileService._getTimeColumn = /**
108
- * get the time column from the analyzed data
109
- * @private
110
- * @param {?} data the analyzed data
111
- * @param {?} firstChunk whether it's first chunk or not
112
- * @param {?} startTime selected starting time. It's millisecond, need to be converted second.
113
- * @param {?} endTime selected ending time. It's millisecond, need to be converted second.
114
- * @param {?} lastProcessedTime last processed time form last chunk
115
- * @param {?} time time object which contains the time data for all ports
116
- * @param {?} selectedPort if the selected port is empty (did not select any port), all ports info are needed
117
- * @param {?} isMDC flag for MDC system
118
- * @param {?} timezone selected timezone
119
- * @param {?} maxRowsLimitation prevent browser from crashing, set the max rows limitation.
120
- * This comes from the input: maxRowsLimitation of the component.
121
- * @return {?}
122
- */
123
- function (data, firstChunk, startTime, endTime, lastProcessedTime, time, selectedPort, isMDC, timezone, maxRowsLimitation) {
124
- // convert millisecond to second for startTime and endTime.
125
- startTime = startTime / 1000;
126
- endTime = endTime / 1000;
127
- /** @type {?} */
128
- var timeColumn = 2;
129
- /** @type {?} */
130
- var startLine = 0;
131
- /** @type {?} */
132
- var iStart = -1;
133
- /** @type {?} */
134
- var iEnd = -1;
135
- /** @type {?} */
136
- var curTime = lastProcessedTime;
137
- /** @type {?} */
138
- var lastProcessedTimeReturn;
139
- /** @type {?} */
140
- var totalNum = 0;
141
- /** @type {?} */
142
- var mdcFlag = isMDC;
143
- /** @type {?} */
144
- var defaultPort = getDefaultPort();
145
- /** @type {?} */
146
- var maxRowNum = this._getMaxRowsLimitation(maxRowsLimitation);
147
- if (firstChunk) {
148
- if (curTime >= startTime && curTime <= endTime) {
149
- iStart = 1; // start from first line
150
- // start from first line
151
- // get port for the line 1.
152
- /**
153
- * Modified at 2018/10/10,
154
- * in some case, eg: the nameserver history trace gets modified by Kook, Jin Young's python script,
155
- * the port show in the first line as well, and does not like the non-mdc system, this kind of file has
156
- * one port in it. The history for non-mdc system doesn't have port info in the port column.
157
- * @type {?}
158
- */
159
- var firstLinePort = getPort(data[1][1]);
160
- // init time array for the first line.
161
- if (!selectedPort || selectedPort.length === 0 || isSamePort(firstLinePort, selectedPort, mdcFlag)) {
162
- // does not select any port or
163
- // it's non-mdc (mdcFlag is false at the beginning) system and the selected port is the first line port
164
- time[firstLinePort] = [];
165
- time[firstLinePort][0] = curTime * 1000;
166
- }
167
- }
168
- lastProcessedTimeReturn = curTime;
169
- startLine = 2;
170
- }
171
- // get current total number
172
- Object.keys(time).forEach((/**
173
- * @param {?} key
174
- * @return {?}
175
- */
176
- function (key) {
177
- if (time[key]) {
178
- totalNum += time[key].length;
179
- }
180
- }));
181
- if (curTime == null) {
182
- console.error('getTimeColumn', 'Can not get the time from the file, internal error!');
183
- return { indexStart: null, indexEnd: null, lastProcessedTime: null, isMDC: null };
184
- }
185
- for (var i = startLine; i < data.length; i++) {
186
- // sometime the last line is empty, need to be skipped.
187
- if (data[i] == null || data[i].length === 0 || (data[i].length === 1 && data[i][0].length === 0)) {
188
- continue;
189
- }
190
- // get port number and initialize the relative port array in time
191
- /** @type {?} */
192
- var port = getPort(data[i][1]);
193
- if (!(port in time)) {
194
- // add undefined port to time, then we can find all ports in time
195
- time[port] = void 0;
196
- }
197
- if (time[port] == null && isSamePort(port, selectedPort, mdcFlag)) {
198
- time[port] = [];
199
- // if other ports exists in this file, default port will be set to undefined.
200
- if (!mdcFlag && port !== defaultPort && time[defaultPort]) {
201
- // update the total num;
202
- totalNum -= time[defaultPort].length;
203
- time[defaultPort].length = 0;
204
- time[defaultPort] = void 0;
205
- mdcFlag = true;
206
- }
207
- }
208
- curTime = calculateValue4Time(curTime, data[i][timeColumn], timezone);
209
- if (curTime > endTime) {
210
- if (iEnd < 0) {
211
- iEnd = i - 1;
212
- }
213
- break;
214
- }
215
- if (iStart >= 0) {
216
- if (time[port]) {
217
- // not null means it's the selected port
218
- time[port][time[port].length] = curTime * 1000;
219
- totalNum++;
220
- }
221
- }
222
- else {
223
- if (curTime >= startTime && curTime <= endTime) {
224
- if (time[port]) {
225
- // only selected port counted in
226
- if (iStart < 0) {
227
- iStart = i;
228
- }
229
- time[port][time[port].length] = curTime * 1000;
230
- totalNum++;
231
- }
232
- }
233
- }
234
- // last processed time need to be recorded anyway
235
- lastProcessedTimeReturn = curTime;
236
- if (totalNum >= maxRowNum) {
237
- iEnd = i;
238
- break;
239
- }
240
- }
241
- return { indexStart: iStart, indexEnd: iEnd, lastProcessedTime: lastProcessedTimeReturn, isMDC: mdcFlag };
242
- };
243
- /**
244
- * Get data for all columns
245
- * @param columnNum the total number of columns. For mdc system,
246
- * the length of each row is different. Host relative data does not exist in tenant line.
247
- * Needs to use column number from the first line.
248
- * @param data data parsed by papa
249
- * @param firstChunk the flag which identifies whether it's the first chunk or not.
250
- * @param time
251
- * @param indexStart
252
- * @param indexEnd
253
- * @param lastProcessedLine
254
- * @param resultData the result data after analyzed
255
- * @param selectedPort
256
- * @param isMDC
257
- */
258
- /**
259
- * Get data for all columns
260
- * @private
261
- * @param {?} columnNum the total number of columns. For mdc system,
262
- * the length of each row is different. Host relative data does not exist in tenant line.
263
- * Needs to use column number from the first line.
264
- * @param {?} data data parsed by papa
265
- * @param {?} firstChunk the flag which identifies whether it's the first chunk or not.
266
- * @param {?} time
267
- * @param {?} indexStart
268
- * @param {?} indexEnd
269
- * @param {?} lastProcessedLine
270
- * @param {?} resultData the result data after analyzed
271
- * @param {?} selectedPort
272
- * @param {?} isMDC
273
- * @return {?}
274
- */
275
- FileService._getDataColumns = /**
276
- * Get data for all columns
277
- * @private
278
- * @param {?} columnNum the total number of columns. For mdc system,
279
- * the length of each row is different. Host relative data does not exist in tenant line.
280
- * Needs to use column number from the first line.
281
- * @param {?} data data parsed by papa
282
- * @param {?} firstChunk the flag which identifies whether it's the first chunk or not.
283
- * @param {?} time
284
- * @param {?} indexStart
285
- * @param {?} indexEnd
286
- * @param {?} lastProcessedLine
287
- * @param {?} resultData the result data after analyzed
288
- * @param {?} selectedPort
289
- * @param {?} isMDC
290
- * @return {?}
291
- */
292
- function (columnNum, data, firstChunk, time, indexStart, indexEnd, lastProcessedLine, resultData, selectedPort, isMDC) {
293
- /** @type {?} */
294
- var startLine = 0;
295
- // for mdc system, the length is not correct (host relative data only exists in the "empty" port line).
296
- // Needs to use header from the first line.
297
- // const columnNum = data[0].length;
298
- if (firstChunk) {
299
- // get port for the line 1.
300
- /**
301
- * Modified at 2018/10/10,
302
- * in some case, eg: the nameserver history trace gets modified by Kook, Jin Young's python script,
303
- * the port show in the first line as well, and does not like the non-mdc system, this kind of file has
304
- * one port in it. The history for non-mdc system doesn't have port info in the port column.
305
- * @type {?}
306
- */
307
- var firstLinePort = getPort(data[1][1]);
308
- // Initialize data column with default 'DEFAULT' port if it's not MDC system. MDC system, 'DEFAULT' gets ignored
309
- if (!isMDC && time[firstLinePort]) {
310
- resultData[firstLinePort] = [];
311
- // removed below logic, because first line is the real number, do not need to do the convert.
312
- // curLine = data[1].slice(3).map(Number);
313
- for (var j = 3; j < columnNum; j++) {
314
- /** @type {?} */
315
- var index = j - 3;
316
- // initialize data array for all columns of the default '0000' port
317
- resultData[firstLinePort][index] = [];
318
- // get the first line data of the column if it's included
319
- if (indexStart === 1) {
320
- resultData[firstLinePort][index][0] = { x: time[firstLinePort][0], y: lastProcessedLine[index] };
321
- }
322
- }
323
- }
324
- startLine = 2;
325
- }
326
- for (var j = 3; j < columnNum; j++) {
327
- /** @type {?} */
328
- var index = j - 3;
329
- for (var i = startLine; i < data.length; i++) {
330
- // sometime the last line is empty, need to be skipped.
331
- if (data[i] == null || data[i].length === 0 || (data[i].length === 1 && data[i][0].length === 0)) {
332
- continue;
333
- }
334
- // get port number and initialize the relative port array in data
335
- /** @type {?} */
336
- var port = getPort(data[i][1]);
337
- if (resultData[port] == null && isSamePort(port, selectedPort, isMDC)) {
338
- resultData[port] = [];
339
- }
340
- if (resultData[port] && resultData[port][index] == null) {
341
- resultData[port][index] = [];
342
- }
343
- lastProcessedLine[index] = calculateValue(lastProcessedLine[index], data[i][j]);
344
- if (i >= indexStart && (i <= indexEnd || indexEnd < 0) && indexStart >= 0) {
345
- if (resultData[port]) {
346
- /** @type {?} */
347
- var length_1 = resultData[port][index].length;
348
- resultData[port][index][length_1] = { x: time[port][length_1], y: lastProcessedLine[index] };
349
- }
350
- }
351
- else if (indexEnd > 0 && i > indexEnd) {
352
- break;
353
- }
354
- }
355
- }
356
- };
357
- /**
358
- * Get Chart data from provided file.
359
- * @param file the nameserver history file
360
- * @param startTime
361
- * @param endTime
362
- * @param port
363
- * @param timezone
364
- * @param maxRowsLimitation prevent browser from crashing, set the max rows limitation.
365
- * @param progress call back function for updating progress
366
- */
367
- /**
368
- * Get Chart data from provided file.
369
- * @param {?} file the nameserver history file
370
- * @param {?} startTime
371
- * @param {?} endTime
372
- * @param {?} port
373
- * @param {?} timezone
374
- * @param {?} maxRowsLimitation prevent browser from crashing, set the max rows limitation.
375
- * @param {?} progress call back function for updating progress
376
- * @return {?}
377
- */
378
- FileService.prototype.getChartContentFromFile = /**
379
- * Get Chart data from provided file.
380
- * @param {?} file the nameserver history file
381
- * @param {?} startTime
382
- * @param {?} endTime
383
- * @param {?} port
384
- * @param {?} timezone
385
- * @param {?} maxRowsLimitation prevent browser from crashing, set the max rows limitation.
386
- * @param {?} progress call back function for updating progress
387
- * @return {?}
388
- */
389
- function (file, startTime, endTime, port, timezone, maxRowsLimitation, progress) {
390
- // load done, beginning parsing
391
- /** @type {?} */
392
- var beginTime = new Date();
393
- /** @type {?} */
394
- var firstChunk = true;
395
- // save last processed data just for the later calculation
396
- /** @type {?} */
397
- var lastProcessedData;
398
- // save last processed time just for the later calculation
399
- /** @type {?} */
400
- var lastProcessedTime;
401
- // save last processed cursor position for progress calculation.
402
- // let lastProcessedCursor = 0;
403
- /** @type {?} */
404
- var indexStart = -1;
405
- /** @type {?} */
406
- var indexEnd = -1;
407
- /** @type {?} */
408
- var time = {};
409
- /** @type {?} */
410
- var data = {};
411
- /** @type {?} */
412
- var header;
413
- /** @type {?} */
414
- var host;
415
- /** @type {?} */
416
- var isMDC = false;
417
- /** @type {?} */
418
- var columnNum;
419
- /** @type {?} */
420
- var abortType;
421
- /** @type {?} */
422
- var rejectAndAbort = (/**
423
- * @param {?} reject
424
- * @param {?} parser
425
- * @return {?}
426
- */
427
- function (reject, parser) {
428
- if (progress) {
429
- progress(100);
430
- }
431
- reject(file.name + " is empty or the format is not correct.");
432
- parser.abort();
433
- });
434
- return new Promise((/**
435
- * @param {?} resolve
436
- * @param {?} reject
437
- * @return {?}
438
- */
439
- function (resolve, reject) {
440
- parse(file, {
441
- chunk: (/**
442
- * @param {?} results
443
- * @param {?} parser
444
- * @return {?}
445
- */
446
- function (results, parser) {
447
- var _a;
448
- // the progress increment of this step
449
- // let analyzeStepProgress = (results.meta.cursor - lastProcessedCursor) / file.size * 100;
450
- printProcessedTime(beginTime, 'step1');
451
- if (indexEnd >= 0) {
452
- // already finished, quite.
453
- return;
454
- }
455
- else {
456
- // reset start point
457
- indexStart = -1;
458
- }
459
- // get time column
460
- if (firstChunk) {
461
- if (!validateData(results.data)) {
462
- return rejectAndAbort(reject, parser);
463
- }
464
- // initialize the header
465
- header = results.data[0].slice(3);
466
- // get column number
467
- columnNum = results.data[0].length;
468
- // get host name
469
- host = results.data[1][0];
470
- // get the first line time info from first line, it is a real number, do not need to do the convert with ">,<".
471
- lastProcessedTime = getTimeFromTimeZone(parseFloat(results.data[1][2]), timezone);
472
- // get the first line data info from first line, it is a real number, do not need to do the convert with ">,<".
473
- lastProcessedData = results.data[1].slice(3).map(Number);
474
- }
475
- printProcessedTime(beginTime, 'step2');
476
- if (!lastProcessedData) {
477
- return rejectAndAbort(reject, parser);
478
- }
479
- // get time column
480
- (_a = FileService._getTimeColumn(results.data, firstChunk, startTime, endTime, lastProcessedTime, time, port, isMDC, timezone, maxRowsLimitation), indexStart = _a.indexStart, indexEnd = _a.indexEnd, lastProcessedTime = _a.lastProcessedTime, isMDC = _a.isMDC);
481
- printProcessedTime(beginTime, 'step3');
482
- if (indexStart == null && indexEnd == null && lastProcessedTime == null && isMDC == null) {
483
- return rejectAndAbort(reject, parser);
484
- }
485
- // get all other data columns
486
- FileService._getDataColumns(columnNum, results.data, firstChunk, time, indexStart, indexEnd, lastProcessedData, data, port, isMDC);
487
- if (firstChunk) {
488
- firstChunk = false;
489
- }
490
- printProcessedTime(beginTime, 'step4');
491
- if (indexEnd >= 0) {
492
- // do not need to process the left parts, manually trigger complete
493
- /** @type {?} */
494
- var processedLines = Object.keys(time).reduce((/**
495
- * @param {?} total
496
- * @param {?} curKey
497
- * @return {?}
498
- */
499
- function (total, curKey) { return time[curKey] ? total + time[curKey].length : total; }), 0);
500
- if (processedLines >= FileService._getMaxRowsLimitation(maxRowsLimitation)) {
501
- abortType = Abort.maxLineNumReached;
502
- }
503
- else {
504
- abortType = Abort.maxTimeRangeReached;
505
- }
506
- if (progress) {
507
- progress(100);
508
- }
509
- parser.abort();
510
- return;
511
- }
512
- else {
513
- // the overall progress if this step is finished
514
- if (progress) {
515
- progress(Math.round(results.meta.cursor / file.size * 100));
516
- }
517
- // lastProcessedCursor = results.meta.cursor;
518
- }
519
- }),
520
- complete: (/**
521
- * @return {?}
522
- */
523
- function () {
524
- printProcessedTime(beginTime, 'step_complete');
525
- resolve({ header: header, host: host, time: time, data: data, aborted: abortType });
526
- })
527
- });
528
- }));
529
- };
530
- /**
531
- * Get all ports from the name server history file
532
- * @param file the name server history file
533
- * @param progress call back for updating the progress
534
- */
535
- /**
536
- * Get all ports from the name server history file
537
- * @param {?} file the name server history file
538
- * @param {?} progress call back for updating the progress
539
- * @return {?}
540
- */
541
- FileService.prototype.getPortsFromFile = /**
542
- * Get all ports from the name server history file
543
- * @param {?} file the name server history file
544
- * @param {?} progress call back for updating the progress
545
- * @return {?}
546
- */
547
- function (file, progress) {
548
- /** @type {?} */
549
- var beginTime = new Date();
550
- /** @type {?} */
551
- var firstChunk = true;
552
- /** @type {?} */
553
- var ports = [];
554
- /** @type {?} */
555
- var defaultPort = getDefaultPort();
556
- return new Promise((/**
557
- * @param {?} resolve
558
- * @param {?} reject
559
- * @return {?}
560
- */
561
- function (resolve, reject) {
562
- parse(file, {
563
- chunk: (/**
564
- * @param {?} results
565
- * @param {?} parser
566
- * @return {?}
567
- */
568
- function (results, parser) {
569
- // get time column
570
- if (firstChunk) {
571
- if (!validateData(results.data)) {
572
- if (progress) {
573
- progress(100);
574
- }
575
- reject(file.name + " is empty or the format is not correct.");
576
- parser.abort();
577
- return;
578
- }
579
- }
580
- printProcessedTime(beginTime, 'port.step1');
581
- FileService._getPorts(results.data, firstChunk, ports);
582
- if (firstChunk) {
583
- firstChunk = false;
584
- }
585
- if (progress) {
586
- progress(Math.round(results.meta.cursor / file.size * 100));
587
- }
588
- }),
589
- complete: (/**
590
- * @return {?}
591
- */
592
- function () {
593
- // parsing done
594
- printProcessedTime(beginTime, 'step_complete');
595
- if (ports.length === 0) {
596
- ports[0] = defaultPort;
597
- }
598
- resolve(ports);
599
- })
600
- });
601
- }));
602
- };
603
- FileService.decorators = [
604
- { type: Injectable }
605
- ];
606
- return FileService;
607
- }());
608
- export { FileService };
609
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LWhhbmEtbmFtZXNlcnZlci1oaXN0b3J5LXZpZXdlci8iLCJzb3VyY2VzIjpbInNyYy9uYW1lc2VydmVyLWhpc3Rvcnktdmlld2VyL3NlcnZpY2VzL2ZpbGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQ0wsY0FBYyxFQUNkLG1CQUFtQixFQUNuQixjQUFjLEVBQ2QsT0FBTyxFQUNQLG1CQUFtQixFQUNuQixVQUFVLEVBQ1YsV0FBVyxFQUNYLGtCQUFrQixFQUNsQixZQUFZLEVBQ2IsTUFBTSxVQUFVLENBQUM7QUFDbEIsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNoQyxPQUFPLEVBQUMsS0FBSyxFQUFtRCxNQUFNLFVBQVUsQ0FBQzs7Ozs7O0lBTTNFLDJCQUEyQixHQUFHLE1BQU07QUFFMUM7SUFBQTtJQTRhQSxDQUFDO0lBMWFDOzs7T0FHRzs7Ozs7OztJQUNZLGlDQUFxQjs7Ozs7O0lBQXBDLFVBQXFDLFVBQXNCO1FBQXRCLDJCQUFBLEVBQUEsaUJBQXNCO1FBQ3pELElBQUksVUFBVSxJQUFJLElBQUksSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDdEUsT0FBTywyQkFBMkIsQ0FBQztTQUNwQztRQUNELE9BQU8sTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRDs7T0FFRzs7Ozs7Ozs7O0lBQ1kscUJBQVM7Ozs7Ozs7O0lBQXhCLFVBQXlCLElBQWdCLEVBQUUsVUFBbUIsRUFBRSxLQUFlOztZQUN6RSxJQUFJLEdBQUcsQ0FBQztRQUNaLElBQUksVUFBVSxFQUFFO1lBQ2Qsb0JBQW9CO1lBQ3BCLElBQUksR0FBRyxDQUFDLENBQUM7U0FDVjtRQUVELE9B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Q1IsZUFBZTtvQkFDZixrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsZUFBZSxDQUFDLENBQUM7b0JBQy9DLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7d0JBQ3RCLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUM7cUJBQ3hCO29CQUNELE9BQU8sQ0FBRSxLQUFLLENBQUMsQ0FBQztnQkFDbEIsQ0FBQyxDQUFBO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxFQUFDLENBQUM7SUFDTCxDQUFDOztnQkEzYUYsVUFBVTs7SUE0YVgsa0JBQUM7Q0FBQSxBQTVhRCxJQTRhQztTQTNhWSxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtcclxuICBjYWxjdWxhdGVWYWx1ZSxcclxuICBjYWxjdWxhdGVWYWx1ZTRUaW1lLFxyXG4gIGdldERlZmF1bHRQb3J0LFxyXG4gIGdldFBvcnQsXHJcbiAgZ2V0VGltZUZyb21UaW1lWm9uZSxcclxuICBpc1NhbWVQb3J0LFxyXG4gIGlzVmFsaWRQb3J0LFxyXG4gIHByaW50UHJvY2Vzc2VkVGltZSxcclxuICB2YWxpZGF0ZURhdGFcclxufSBmcm9tICcuLi91dGlscyc7XHJcbmltcG9ydCB7cGFyc2V9IGZyb20gJ3BhcGFwYXJzZSc7XHJcbmltcG9ydCB7QWJvcnQsIENoYXJ0Q29udGVudCwgQ2hhcnRDb250ZW50RGF0YSwgQ2hhcnRDb250ZW50VGltZX0gZnJvbSAnLi4vdHlwZXMnO1xyXG5cclxuLyoqXHJcbiAqIHByZXZlbnQgYnJvd3NlciBmcm9tIGNyYXNoaW5nLCBzZXQgdGhlIG1heCByb3dzIGxpbWl0YXRpb24uXHJcbiAqIFRoaXMgY291bGQgYmUgb3ZlcndyaXR0ZW4gYnkgdGhlIGlucHV0Om1heFJvd3NMaW1pdGF0aW9uIG9mIHRoZSBjb21wb25lbnQuXHJcbiAqL1xyXG5jb25zdCBfREVGQVVMVF9NQVhfUk9XU19JTl9NRU1PUlkgPSAxMDAwMDA7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBGaWxlU2VydmljZSB7XHJcbiAgLyoqXHJcbiAgICogcHJldmVudCBicm93c2VyIGZyb20gY3Jhc2hpbmcsIHNldCB0aGUgbWF4IHJvd3MgbGltaXRhdGlvbi5cclxuICAgKiBAcGFyYW0gbGltaXRhdGlvbiBpZiB0aGlzIHBhcmFtZXRlciBpcyBub3QgbnVsbCwgdGhlIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSBvdmVyd3JpdHRlbiBieSB0aGlzIG9uZS5cclxuICAgKi9cclxuICBwcml2YXRlIHN0YXRpYyBfZ2V0TWF4Um93c0xpbWl0YXRpb24obGltaXRhdGlvbjogYW55ID0gbnVsbCkge1xyXG4gICAgaWYgKGxpbWl0YXRpb24gPT0gbnVsbCB8fCBpc05hTihsaW1pdGF0aW9uKSB8fCBsaW1pdGF0aW9uLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gX0RFRkFVTFRfTUFYX1JPV1NfSU5fTUVNT1JZO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIE51bWJlcihsaW1pdGF0aW9uKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGdldCBhbGwgYXZhaWxhYmxlIHBvcnRzIGZyb20gZGF0YVxyXG4gICAqL1xyXG4gIHByaXZhdGUgc3RhdGljIF9nZXRQb3J0cyhkYXRhOiBzdHJpbmdbXVtdLCBmaXJzdENodW5rOiBib29sZWFuLCBwb3J0czogc3RyaW5nW10pIHtcclxuICAgIGxldCBsaW5lID0gMDtcclxuICAgIGlmIChmaXJzdENodW5rKSB7XHJcbiAgICAgIC8vIHN0YXJ0IGZyb20gbGluZSAzXHJcbiAgICAgIGxpbmUgPSAyO1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAoOyBsaW5lIDwgZGF0YS5sZW5ndGg7IGxpbmUrKykge1xyXG4gICAgICBjb25zdCBkYXRhSXRlbSA9IGRhdGFbbGluZV1bMV07XHJcbiAgICAgIGlmIChkYXRhSXRlbSAhPSBudWxsICYmIGRhdGFJdGVtLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBpZiAoaXNWYWxpZFBvcnQoZGF0YUl0ZW0pICYmIHBvcnRzLmluZGV4T2YoZGF0YUl0ZW0pID09PSAtMSkge1xyXG4gICAgICAgICAgcG9ydHMucHVzaChkYXRhSXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBnZXQgdGhlIHRpbWUgY29sdW1uIGZyb20gdGhlIGFuYWx5emVkIGRhdGFcclxuICAgKiBAcGFyYW0gZGF0YSB0aGUgYW5hbHl6ZWQgZGF0YVxyXG4gICAqIEBwYXJhbSBmaXJzdENodW5rIHdoZXRoZXIgaXQncyBmaXJzdCBjaHVuayBvciBub3RcclxuICAgKiBAcGFyYW0gc3RhcnRUaW1lIHNlbGVjdGVkIHN0YXJ0aW5nIHRpbWUuIEl0J3MgbWlsbGlzZWNvbmQsIG5lZWQgdG8gYmUgY29udmVydGVkIHNlY29uZC5cclxuICAgKiBAcGFyYW0gZW5kVGltZSBzZWxlY3RlZCBlbmRpbmcgdGltZS4gSXQncyBtaWxsaXNlY29uZCwgbmVlZCB0byBiZSBjb252ZXJ0ZWQgc2Vjb25kLlxyXG4gICAqIEBwYXJhbSBsYXN0UHJvY2Vzc2VkVGltZSBsYXN0IHByb2Nlc3NlZCB0aW1lIGZvcm0gbGFzdCBjaHVua1xyXG4gICAqIEBwYXJhbSB0aW1lIHRpbWUgb2JqZWN0IHdoaWNoIGNvbnRhaW5zIHRoZSB0aW1lIGRhdGEgZm9yIGFsbCBwb3J0c1xyXG4gICAqIEBwYXJhbSBzZWxlY3RlZFBvcnQgaWYgdGhlIHNlbGVjdGVkIHBvcnQgaXMgZW1wdHkgKGRpZCBub3Qgc2VsZWN0IGFueSBwb3J0KSwgYWxsIHBvcnRzIGluZm8gYXJlIG5lZWRlZFxyXG4gICAqIEBwYXJhbSBpc01EQyBmbGFnIGZvciBNREMgc3lzdGVtXHJcbiAgICogQHBhcmFtIHRpbWV6b25lIHNlbGVjdGVkIHRpbWV6b25lXHJcbiAgICogQHBhcmFtIG1heFJvd3NMaW1pdGF0aW9uIHByZXZlbnQgYnJvd3NlciBmcm9tIGNyYXNoaW5nLCBzZXQgdGhlIG1heCByb3dzIGxpbWl0YXRpb24uXHJcbiAgICogVGhpcyBjb21lcyBmcm9tIHRoZSBpbnB1dDogbWF4Um93c0xpbWl0YXRpb24gb2YgdGhlIGNvbXBvbmVudC5cclxuICAgKi9cclxuICBwcml2YXRlIHN0YXRpYyBfZ2V0VGltZUNvbHVtbihkYXRhOiBzdHJpbmdbXVtdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q2h1bms6IGJvb2xlYW4sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lOiBudW1iZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kVGltZTogbnVtYmVyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RQcm9jZXNzZWRUaW1lOiBudW1iZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZTogQ2hhcnRDb250ZW50VGltZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFBvcnQ6IHN0cmluZyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc01EQzogYm9vbGVhbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lem9uZTogc3RyaW5nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFJvd3NMaW1pdGF0aW9uOiBhbnkpIHtcclxuICAgIC8vIGNvbnZlcnQgbWlsbGlzZWNvbmQgdG8gc2Vjb25kIGZvciBzdGFydFRpbWUgYW5kIGVuZFRpbWUuXHJcbiAgICBzdGFydFRpbWUgPSBzdGFydFRpbWUgLyAxMDAwO1xyXG4gICAgZW5kVGltZSA9IGVuZFRpbWUgLyAxMDAwO1xyXG4gICAgY29uc3QgdGltZUNvbHVtbiA9IDI7XHJcbiAgICBsZXQgc3RhcnRMaW5lID0gMDtcclxuICAgIGxldCBpU3RhcnQgPSAtMTtcclxuICAgIGxldCBpRW5kID0gLTE7XHJcblxyXG4gICAgbGV0IGN1clRpbWUgPSBsYXN0UHJvY2Vzc2VkVGltZTtcclxuICAgIGxldCBsYXN0UHJvY2Vzc2VkVGltZVJldHVybjtcclxuICAgIGxldCB0b3RhbE51bSA9IDA7XHJcbiAgICBsZXQgbWRjRmxhZyA9IGlzTURDO1xyXG4gICAgY29uc3QgZGVmYXVsdFBvcnQgPSBnZXREZWZhdWx0UG9ydCgpO1xyXG4gICAgY29uc3QgbWF4Um93TnVtID0gdGhpcy5fZ2V0TWF4Um93c0xpbWl0YXRpb24obWF4Um93c0xpbWl0YXRpb24pO1xyXG5cclxuICAgIGlmIChmaXJzdENodW5rKSB7XHJcbiAgICAgIGlmIChjdXJUaW1lID49IHN0YXJ0VGltZSAmJiBjdXJUaW1lIDw9IGVuZFRpbWUpIHtcclxuICAgICAgICBpU3RhcnQgPSAxOyAvLyBzdGFydCBmcm9tIGZpcnN0IGxpbmVcclxuXHJcbiAgICAgICAgLyoqIE1vZGlmaWVkIGF0IDIwMTgvMTAvMTAsXHJcbiAgICAgICAgICogaW4gc29tZSBjYXNlLCBlZzogdGhlIG5hbWVzZXJ2ZXIgaGlzdG9yeSB0cmFjZSBnZXRzIG1vZGlmaWVkIGJ5IEtvb2ssIEppbiBZb3VuZydzIHB5dGhvbiBzY3JpcHQsXHJcbiAgICAgICAgICogdGhlIHBvcnQgc2hvdyBpbiB0aGUgZmlyc3QgbGluZSBhcyB3ZWxsLCBhbmQgZG9lcyBub3QgbGlrZSB0aGUgbm9uLW1kYyBzeXN0ZW0sIHRoaXMga2luZCBvZiBmaWxlIGhhc1xyXG4gICAgICAgICAqIG9uZSBwb3J0IGluIGl0LiBUaGUgaGlzdG9yeSBmb3Igbm9uLW1kYyBzeXN0ZW0gZG9lc24ndCBoYXZlIHBvcnQgaW5mbyBpbiB0aGUgcG9ydCBjb2x1bW4uKi9cclxuXHJcbiAgICAgICAgICAvLyBnZXQgcG9ydCBmb3IgdGhlIGxpbmUgMS5cclxuICAgICAgICBjb25zdCBmaXJzdExpbmVQb3J0ID0gZ2V0UG9ydChkYXRhWzFdWzFdKTtcclxuICAgICAgICAvLyBpbml0IHRpbWUgYXJyYXkgZm9yIHRoZSBmaXJzdCBsaW5lLlxyXG4gICAgICAgIGlmICghc2VsZWN0ZWRQb3J0IHx8IHNlbGVjdGVkUG9ydC5sZW5ndGggPT09IDAgfHwgaXNTYW1lUG9ydChmaXJzdExpbmVQb3J0LCBzZWxlY3RlZFBvcnQsIG1kY0ZsYWcpKSB7XHJcbiAgICAgICAgICAvLyBkb2VzIG5vdCBzZWxlY3QgYW55IHBvcnQgb3JcclxuICAgICAgICAgIC8vIGl0J3Mgbm9uLW1kYyAobWRjRmxhZyBpcyBmYWxzZSBhdCB0aGUgYmVnaW5uaW5nKSBzeXN0ZW0gYW5kIHRoZSBzZWxlY3RlZCBwb3J0IGlzIHRoZSBmaXJzdCBsaW5lIHBvcnRcclxuICAgICAgICAgIHRpbWVbZmlyc3RMaW5lUG9ydF0gPSBbXTtcclxuICAgICAgICAgIHRpbWVbZmlyc3RMaW5lUG9ydF1bMF0gPSBjdXJUaW1lICogMTAwMDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgbGFzdFByb2Nlc3NlZFRpbWVSZXR1cm4gPSBjdXJUaW1lO1xyXG4gICAgICBzdGFydExpbmUgPSAyO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGdldCBjdXJyZW50IHRvdGFsIG51bWJlclxyXG4gICAgT2JqZWN0LmtleXModGltZSkuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICBpZiAodGltZVtrZXldKSB7XHJcbiAgICAgICAgdG90YWxOdW0gKz0gdGltZVtrZXldLmxlbmd0aDtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKGN1clRpbWUgPT0gbnVsbCkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdnZXRUaW1lQ29sdW1uJywgJ0NhbiBub3QgZ2V0IHRoZSB0aW1lIGZyb20gdGhlIGZpbGUsIGludGVybmFsIGVycm9yIScpO1xyXG4gICAgICByZXR1cm4ge2luZGV4U3RhcnQ6IG51bGwsIGluZGV4RW5kOiBudWxsLCBsYXN0UHJvY2Vzc2VkVGltZTogbnVsbCwgaXNNREM6IG51bGx9O1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAobGV0IGkgPSBzdGFydExpbmU7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIC8vIHNvbWV0aW1lIHRoZSBsYXN0IGxpbmUgaXMgZW1wdHksIG5lZWQgdG8gYmUgc2tpcHBlZC5cclxuICAgICAgaWYgKGRhdGFbaV0gPT0gbnVsbCB8fCBkYXRhW2ldLmxlbmd0aCA9PT0gMCB8fCAoZGF0YVtpXS5sZW5ndGggPT09IDEgJiYgZGF0YVtpXVswXS5sZW5ndGggPT09IDApKSB7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGdldCBwb3J0IG51bWJlciBhbmQgaW5pdGlhbGl6ZSB0aGUgcmVsYXRpdmUgcG9ydCBhcnJheSBpbiB0aW1lXHJcbiAgICAgIGNvbnN0IHBvcnQgPSBnZXRQb3J0KGRhdGFbaV1bMV0pOyAvLyBkYXRhW2ldWzFdID09IG51bGwgfHwgZGF0YVtpXVsxXS5sZW5ndGggPT0gMCA/IF9fREVGQVVMVF9QT1JUIDogZGF0YVtpXVsxXTtcclxuICAgICAgaWYgKCEocG9ydCBpbiB0aW1lKSkge1xyXG4gICAgICAgIC8vIGFkZCB1bmRlZmluZWQgcG9ydCB0byB0aW1lLCB0aGVuIHdlIGNhbiBmaW5kIGFsbCBwb3J0cyBpbiB0aW1lXHJcbiAgICAgICAgdGltZVtwb3J0XSA9IHZvaWQgMDtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGltZVtwb3J0XSA9PSBudWxsICYmIGlzU2FtZVBvcnQocG9ydCwgc2VsZWN0ZWRQb3J0LCBtZGNGbGFnKSkge1xyXG4gICAgICAgIHRpbWVbcG9ydF0gPSBbXTtcclxuICAgICAgICAvLyBpZiBvdGhlciBwb3J0cyBleGlzdHMgaW4gdGhpcyBmaWxlLCBkZWZhdWx0IHBvcnQgd2lsbCBiZSBzZXQgdG8gdW5kZWZpbmVkLlxyXG4gICAgICAgIGlmICghbWRjRmxhZyAmJiBwb3J0ICE9PSBkZWZhdWx0UG9ydCAmJiB0aW1lW2RlZmF1bHRQb3J0XSkge1xyXG4gICAgICAgICAgLy8gdXBkYXRlIHRoZSB0b3RhbCBudW07XHJcbiAgICAgICAgICB0b3RhbE51bSAtPSB0aW1lW2RlZmF1bHRQb3J0XS5sZW5ndGg7XHJcbiAgICAgICAgICB0aW1lW2RlZmF1bHRQb3J0XS5sZW5ndGggPSAwO1xyXG4gICAgICAgICAgdGltZVtkZWZhdWx0UG9ydF0gPSB2b2lkIDA7XHJcbiAgICAgICAgICBtZGNGbGFnID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgY3VyVGltZSA9IGNhbGN1bGF0ZVZhbHVlNFRpbWUoY3VyVGltZSwgZGF0YVtpXVt0aW1lQ29sdW1uXSwgdGltZXpvbmUpO1xyXG4gICAgICBpZiAoY3VyVGltZSA+IGVuZFRpbWUpIHtcclxuICAgICAgICBpZiAoaUVuZCA8IDApIHtcclxuICAgICAgICAgIGlFbmQgPSBpIC0gMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGlTdGFydCA+PSAwKSB7XHJcbiAgICAgICAgaWYgKHRpbWVbcG9ydF0pIHtcclxuICAgICAgICAgIC8vIG5vdCBudWxsIG1lYW5zIGl0J3MgdGhlIHNlbGVjdGVkIHBvcnRcclxuICAgICAgICAgIHRpbWVbcG9ydF1bdGltZVtwb3J0XS5sZW5ndGhdID0gY3VyVGltZSAqIDEwMDA7XHJcbiAgICAgICAgICB0b3RhbE51bSArKztcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKGN1clRpbWUgPj0gc3RhcnRUaW1lICYmIGN1clRpbWUgPD0gZW5kVGltZSkge1xyXG4gICAgICAgICAgaWYgKHRpbWVbcG9ydF0pIHtcclxuICAgICAgICAgICAgLy8gb25seSBzZWxlY3RlZCBwb3J0IGNvdW50ZWQgaW5cclxuICAgICAgICAgICAgaWYgKGlTdGFydCA8IDApIHtcclxuICAgICAgICAgICAgICBpU3RhcnQgPSBpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRpbWVbcG9ydF1bdGltZVtwb3J0XS5sZW5ndGhdID0gY3VyVGltZSAqIDEwMDA7XHJcbiAgICAgICAgICAgIHRvdGFsTnVtICsrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvLyBsYXN0IHByb2Nlc3NlZCB0aW1lIG5lZWQgdG8gYmUgcmVjb3JkZWQgYW55d2F5XHJcbiAgICAgIGxhc3RQcm9jZXNzZWRUaW1lUmV0dXJuID0gY3VyVGltZTtcclxuXHJcbiAgICAgIGlmICh0b3RhbE51bSA+PSBtYXhSb3dOdW0pIHtcclxuICAgICAgICBpRW5kID0gaTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHtpbmRleFN0YXJ0OiBpU3RhcnQsIGluZGV4RW5kOiBpRW5kLCBsYXN0UHJvY2Vzc2VkVGltZTogbGFzdFByb2Nlc3NlZFRpbWVSZXR1cm4sIGlzTURDOiBtZGNGbGFnfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBkYXRhIGZvciBhbGwgY29sdW1uc1xyXG4gICAqIEBwYXJhbSBjb2x1bW5OdW0gdGhlIHRvdGFsIG51bWJlciBvZiBjb2x1bW5zLiBGb3IgbWRjIHN5c3RlbSxcclxuICAgKiAgICAgICAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgZWFjaCByb3cgaXMgZGlmZmVyZW50LiBIb3N0IHJlbGF0aXZlIGRhdGEgZG9lcyBub3QgZXhpc3QgaW4gdGVuYW50IGxpbmUuXHJcbiAgICogICAgICAgICAgICAgICAgICBOZWVkcyB0byB1c2UgY29sdW1uIG51bWJlciBmcm9tIHRoZSBmaXJzdCBsaW5lLlxyXG4gICAqIEBwYXJhbSBkYXRhICAgICAgZGF0YSBwYXJzZWQgYnkgcGFwYVxyXG4gICAqIEBwYXJhbSBmaXJzdENodW5rIHRoZSBmbGFnIHdoaWNoIGlkZW50aWZpZXMgd2hldGhlciBpdCdzIHRoZSBmaXJzdCBjaHVuayBvciBub3QuXHJcbiAgICogQHBhcmFtIHRpbWVcclxuICAgKiBAcGFyYW0gaW5kZXhTdGFydFxyXG4gICAqIEBwYXJhbSBpbmRleEVuZFxyXG4gICAqIEBwYXJhbSBsYXN0UHJvY2Vzc2VkTGluZVxyXG4gICAqIEBwYXJhbSByZXN1bHREYXRhICAgdGhlIHJlc3VsdCBkYXRhIGFmdGVyIGFuYWx5emVkXHJcbiAgICogQHBhcmFtIHNlbGVjdGVkUG9ydFxyXG4gICAqIEBwYXJhbSBpc01EQ1xyXG4gICAqL1xyXG4gIHByaXZhdGUgc3RhdGljIF9nZXREYXRhQ29sdW1ucyhjb2x1bW5OdW06IG51bWJlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogc3RyaW5nW11bXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDaHVuazogYm9vbGVhbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZTogQ2hhcnRDb250ZW50VGltZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhTdGFydDogbnVtYmVyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleEVuZDogbnVtYmVyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0UHJvY2Vzc2VkTGluZTogbnVtYmVyW10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdERhdGE6IENoYXJ0Q29udGVudERhdGEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkUG9ydDogc3RyaW5nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc01EQzogYm9vbGVhbikge1xyXG4gICAgbGV0IHN0YXJ0TGluZSA9IDA7XHJcbiAgICAvLyBmb3IgbWRjIHN5c3RlbSwgdGhlIGxlbmd0aCBpcyBub3QgY29ycmVjdCAoaG9zdCByZWxhdGl2ZSBkYXRhIG9ubHkgZXhpc3RzIGluIHRoZSBcImVtcHR5XCIgcG9ydCBsaW5lKS5cclxuICAgIC8vIE5lZWRzIHRvIHVzZSBoZWFkZXIgZnJvbSB0aGUgZmlyc3QgbGluZS5cclxuICAgIC8vIGNvbnN0IGNvbHVtbk51bSA9IGRhdGFbMF0ubGVuZ3RoO1xyXG5cclxuICAgIGlmIChmaXJzdENodW5rKSB7XHJcbiAgICAgIC8qKlxyXG4gICAgICAgKiBNb2RpZmllZCBhdCAyMDE4LzEwLzEwLFxyXG4gICAgICAgKiBpbiBzb21lIGNhc2UsIGVnOiB0aGUgbmFtZXNlcnZlciBoaXN0b3J5IHRyYWNlIGdldHMgbW9kaWZpZWQgYnkgS29vaywgSmluIFlvdW5nJ3MgcHl0aG9uIHNjcmlwdCxcclxuICAgICAgICogdGhlIHBvcnQgc2hvdyBpbiB0aGUgZmlyc3QgbGluZSBhcyB3ZWxsLCBhbmQgZG9lcyBub3QgbGlrZSB0aGUgbm9uLW1kYyBzeXN0ZW0sIHRoaXMga2luZCBvZiBmaWxlIGhhc1xyXG4gICAgICAgKiBvbmUgcG9ydCBpbiBpdC4gVGhlIGhpc3RvcnkgZm9yIG5vbi1tZGMgc3lzdGVtIGRvZXNuJ3QgaGF2ZSBwb3J0IGluZm8gaW4gdGhlIHBvcnQgY29sdW1uLlxyXG4gICAgICAgKi9cclxuXHJcbiAgICAgIC8vIGdldCBwb3J0IGZvciB0aGUgbGluZSAxLlxyXG4gICAgICBjb25zdCBmaXJzdExpbmVQb3J0ID0gZ2V0UG9ydChkYXRhWzFdWzFdKTtcclxuICAgICAgLy8gSW5pdGlhbGl6ZSBkYXRhIGNvbHVtbiB3aXRoIGRlZmF1bHQgJ0RFRkFVTFQnIHBvcnQgaWYgaXQncyBub3QgTURDIHN5c3RlbS4gTURDIHN5c3RlbSwgJ0RFRkFVTFQnIGdldHMgaWdub3JlZFxyXG4gICAgICBpZiAoIWlzTURDICYmIHRpbWVbZmlyc3RMaW5lUG9ydF0pIHtcclxuICAgICAgICByZXN1bHREYXRhW2ZpcnN0TGluZVBvcnRdID0gW107XHJcbiAgICAgICAgLy8gcmVtb3ZlZCBiZWxvdyBsb2dpYywgYmVjYXVzZSBmaXJzdCBsaW5lIGlzIHRoZSByZWFsIG51bWJlciwgZG8gbm90IG5lZWQgdG8gZG8gdGhlIGNvbnZlcnQuXHJcbiAgICAgICAgLy8gY3VyTGluZSA9IGRhdGFbMV0uc2xpY2UoMykubWFwKE51bWJlcik7XHJcbiAgICAgICAgZm9yIChsZXQgaiA9IDM7IGogPCBjb2x1bW5OdW07IGorKykge1xyXG4gICAgICAgICAgY29uc3QgaW5kZXggPSBqIC0gMztcclxuXHJcbiAgICAgICAgICAvLyBpbml0aWFsaXplIGRhdGEgYXJyYXkgZm9yIGFsbCBjb2x1bW5zIG9mIHRoZSBkZWZhdWx0ICcwMDAwJyBwb3J0XHJcbiAgICAgICAgICByZXN1bHREYXRhW2ZpcnN0TGluZVBvcnRdW2luZGV4XSA9IFtdO1xyXG4gICAgICAgICAgLy8gZ2V0IHRoZSBmaXJzdCBsaW5lIGRhdGEgb2YgdGhlIGNvbHVtbiBpZiBpdCdzIGluY2x1ZGVkXHJcbiAgICAgICAgICBpZiAoaW5kZXhTdGFydCA9PT0gMSkge1xyXG4gICAgICAgICAgICByZXN1bHREYXRhW2ZpcnN0TGluZVBvcnRdW2luZGV4XVswXSA9IHt4OiB0aW1lW2ZpcnN0TGluZVBvcnRdWzBdLCB5OiBsYXN0UHJvY2Vzc2VkTGluZVtpbmRleF19O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBzdGFydExpbmUgPSAyO1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAobGV0IGogPSAzOyBqIDwgY29sdW1uTnVtOyBqKyspIHtcclxuICAgICAgY29uc3QgaW5kZXggPSBqIC0gMztcclxuICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0TGluZTsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAvLyBzb21ldGltZSB0aGUgbGFzdCBsaW5lIGlzIGVtcHR5LCBuZWVkIHRvIGJlIHNraXBwZWQuXHJcbiAgICAgICAgaWYgKGRhdGFbaV0gPT0gbnVsbCB8fCBkYXRhW2ldLmxlbmd0aCA9PT0gMCB8fCAoZGF0YVtpXS5sZW5ndGggPT09IDEgJiYgZGF0YVtpXVswXS5sZW5ndGggPT09IDApKSB7XHJcbiAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGdldCBwb3J0IG51bWJlciBhbmQgaW5pdGlhbGl6ZSB0aGUgcmVsYXRpdmUgcG9ydCBhcnJheSBpbiBkYXRhXHJcbiAgICAgICAgY29uc3QgcG9ydCA9IGdldFBvcnQoZGF0YVtpXVsxXSk7XHJcbiAgICAgICAgaWYgKHJlc3VsdERhdGFbcG9ydF0gPT0gbnVsbCAmJiBpc1NhbWVQb3J0KHBvcnQsIHNlbGVjdGVkUG9ydCwgaXNNREMpKSB7XHJcbiAgICAgICAgICByZXN1bHREYXRhW3BvcnRdID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXN1bHREYXRhW3BvcnRdICYmIHJlc3VsdERhdGFbcG9ydF1baW5kZXhdID09IG51bGwpIHtcclxuICAgICAgICAgIHJlc3VsdERhdGFbcG9ydF1baW5kZXhdID0gW107XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsYXN0UHJvY2Vzc2VkTGluZVtpbmRleF0gPSBjYWxjdWxhdGVWYWx1ZShsYXN0UHJvY2Vzc2VkTGluZVtpbmRleF0sIGRhdGFbaV1bal0pO1xyXG4gICAgICAgIGlmIChpID49IGluZGV4U3RhcnQgJiYgKGkgPD0gaW5kZXhFbmQgfHwgaW5kZXhFbmQgPCAwKSAmJiBpbmRleFN0YXJ0ID49IDApIHtcclxuICAgICAgICAgIGlmIChyZXN1bHREYXRhW3BvcnRdKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IHJlc3VsdERhdGFbcG9ydF1baW5kZXhdLmxlbmd0aDtcclxuICAgICAgICAgICAgcmVzdWx0RGF0YVtwb3J0XVtpbmRleF1bbGVuZ3RoXSA9IHt4OiB0aW1lW3BvcnRdW2xlbmd0aF0sIHk6IGxhc3RQcm9jZXNzZWRMaW5lW2luZGV4XX07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChpbmRleEVuZCA+IDAgJiYgaSA+IGluZGV4RW5kKSB7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBDaGFydCBkYXRhIGZyb20gcHJvdmlkZWQgZmlsZS5cclxuICAgKiBAcGFyYW0gZmlsZSB0aGUgbmFtZXNlcnZlciBoaXN0b3J5IGZpbGVcclxuICAgKiBAcGFyYW0gc3RhcnRUaW1lXHJcbiAgICogQHBhcmFtIGVuZFRpbWVcclxuICAgKiBAcGFyYW0gcG9ydFxyXG4gICAqIEBwYXJhbSB0aW1lem9uZVxyXG4gICAqIEBwYXJhbSBtYXhSb3dzTGltaXRhdGlvbiBwcmV2ZW50IGJyb3dzZXIgZnJvbSBjcmFzaGluZywgc2V0IHRoZSBtYXggcm93cyBsaW1pdGF0aW9uLlxyXG4gICAqIEBwYXJhbSBwcm9ncmVzcyBjYWxsIGJhY2sgZnVuY3Rpb24gZm9yIHVwZGF0aW5nIHByb2dyZXNzXHJcbiAgICovXHJcbiAgcHVibGljIGdldENoYXJ0Q29udGVudEZyb21GaWxlKGZpbGU6IEZpbGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZTogbnVtYmVyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRUaW1lOiBudW1iZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQ6IHN0cmluZyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXpvbmU6IHN0cmluZyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Um93c0xpbWl0YXRpb246IGFueSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3M6IGFueSk6IFByb21pc2U8Q2hhcnRDb250ZW50PiB7XHJcbiAgICAvLyBsb2FkIGRvbmUsIGJlZ2lubmluZyBwYXJzaW5nXHJcbiAgICBjb25zdCBiZWdpblRpbWUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgbGV0IGZpcnN0Q2h1bmsgPSB0cnVlO1xyXG4gICAgLy8gc2F2ZSBsYXN0IHByb2Nlc3NlZCBkYXRhIGp1c3QgZm9yIHRoZSBsYXRlciBjYWxjdWxhdGlvblxyXG4gICAgbGV0IGxhc3RQcm9jZXNzZWREYXRhO1xyXG4gICAgLy8gc2F2ZSBsYXN0IHByb2Nlc3NlZCB0aW1lIGp1c3QgZm9yIHRoZSBsYXRlciBjYWxjdWxhdGlvblxyXG4gICAgbGV0IGxhc3RQcm9jZXNzZWRUaW1lO1xyXG4gICAgLy8gc2F2ZSBsYXN0IHByb2Nlc3NlZCBjdXJzb3IgcG9zaXRpb24gZm9yIHByb2dyZXNzIGNhbGN1bGF0aW9uLlxyXG4gICAgLy8gbGV0IGxhc3RQcm9jZXNzZWRDdXJzb3IgPSAwO1xyXG4gICAgbGV0IGluZGV4U3RhcnQgPSAtMSwgaW5kZXhFbmQgPSAtMTtcclxuICAgIGNvbnN0IHRpbWU6IENoYXJ0Q29udGVudFRpbWUgPSB7fTtcclxuICAgIGNvbnN0IGRhdGE6IENoYXJ0Q29udGVudERhdGEgPSB7fTtcclxuICAgIGxldCBoZWFkZXI7XHJcbiAgICBsZXQgaG9zdDtcclxuICAgIGxldCBpc01EQyA9IGZhbHNlO1xyXG4gICAgbGV0IGNvbHVtbk51bTtcclxuICAgIGxldCBhYm9ydFR5cGU6IEFib3J0O1xyXG5cclxuICAgIGNvbnN0IHJlamVjdEFuZEFib3J0ID0gKHJlamVjdCwgcGFyc2VyKSA9PiB7XHJcbiAgICAgIGlmIChwcm9ncmVzcykge1xyXG4gICAgICAgIHByb2dyZXNzKDEwMCk7XHJcbiAgICAgIH1cclxuICAgICAgcmVqZWN0KGAke2ZpbGUubmFtZX0gaXMgZW1wdHkgb3IgdGhlIGZvcm1hdCBpcyBub3QgY29ycmVjdC5gKTtcclxuICAgICAgcGFyc2VyLmFib3J0KCk7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgcGFyc2UoZmlsZSwge1xyXG4gICAgICAgIGNodW5rOiAocmVzdWx0cywgcGFyc2VyKSA9PiB7XHJcbiAgICAgICAgICAvLyB0aGUgcHJvZ3Jlc3MgaW5jcmVtZW50IG9mIHRoaXMgc3RlcFxyXG4gICAgICAgICAgLy8gbGV0IGFuYWx5emVTdGVwUHJvZ3Jlc3MgPSAocmVzdWx0cy5tZXRhLmN1cnNvciAtIGxhc3RQcm9jZXNzZWRDdXJzb3IpIC8gZmlsZS5zaXplICogMTAwO1xyXG4gICAgICAgICAgcHJpbnRQcm9jZXNzZWRUaW1lKGJlZ2luVGltZSwgJ3N0ZXAxJyk7XHJcbiAgICAgICAgICBpZiAoaW5kZXhFbmQgPj0gMCkge1xyXG4gICAgICAgICAgICAvLyBhbHJlYWR5IGZpbmlzaGVkLCBxdWl0ZS5cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gcmVzZXQgc3RhcnQgcG9pbnRcclxuICAgICAgICAgICAgaW5kZXhTdGFydCA9IC0xO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIGdldCB0aW1lIGNvbHVtblxyXG4gICAgICAgICAgaWYgKGZpcnN0Q2h1bmspIHtcclxuICAgICAgICAgICAgaWYgKCF2YWxpZGF0ZURhdGEocmVzdWx0cy5kYXRhKSkge1xyXG4gICAgICAgICAgICAgIHJldHVybiByZWplY3RBbmRBYm9ydChyZWplY3QsIHBhcnNlcik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIGluaXRpYWxpemUgdGhlIGhlYWRlclxyXG4gICAgICAgICAgICBoZWFkZXIgPSByZXN1bHRzLmRhdGFbMF0uc2xpY2UoMyk7XHJcbiAgICAgICAgICAgIC8vIGdldCBjb2x1bW4gbnVtYmVyXHJcbiAgICAgICAgICAgIGNvbHVtbk51bSA9IHJlc3VsdHMuZGF0YVswXS5sZW5ndGg7XHJcbiAgICAgICAgICAgIC8vIGdldCBob3N0IG5hbWVcclxuICAgICAgICAgICAgaG9zdCA9IHJlc3VsdHMuZGF0YVsxXVswXTtcclxuICAgICAgICAgICAgLy8gZ2V0IHRoZSBmaXJzdCBsaW5lIHRpbWUgaW5mbyBmcm9tIGZpcnN0IGxpbmUsIGl0IGlzIGEgcmVhbCBudW1iZXIsIGRvIG5vdCBuZWVkIHRvIGRvIHRoZSBjb252ZXJ0IHdpdGggXCI+LDxcIi5cclxuICAgICAgICAgICAgbGFzdFByb2Nlc3NlZFRpbWUgPSBnZXRUaW1lRnJvbVRpbWVab25lKHBhcnNlRmxvYXQocmVzdWx0cy5kYXRhWzFdWzJdKSwgdGltZXpvbmUpO1xyXG4gICAgICAgICAgICAvLyBnZXQgdGhlIGZpcnN0IGxpbmUgZGF0YSBpbmZvIGZyb20gZmlyc3QgbGluZSwgaXQgaXMgYSByZWFsIG51bWJlciwgZG8gbm90IG5lZWQgdG8gZG8gdGhlIGNvbnZlcnQgd2l0aCBcIj4sPFwiLlxyXG4gICAgICAgICAgICBsYXN0UHJvY2Vzc2VkRGF0YSA9IHJlc3VsdHMuZGF0YVsxXS5zbGljZSgzKS5tYXAoTnVtYmVyKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBwcmludFByb2Nlc3NlZFRpbWUoYmVnaW5UaW1lLCAnc3RlcDInKTtcclxuXHJcbiAgICAgICAgICBpZiAoIWxhc3RQcm9jZXNzZWREYXRhKSB7XHJcbiAgICAgICAgICAgIHJldHVybiByZWplY3RBbmRBYm9ydChyZWplY3QsIHBhcnNlcik7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gZ2V0IHRpbWUgY29sdW1uXHJcbiAgICAgICAgICAoe2luZGV4U3RhcnQsIGluZGV4RW5kLCBsYXN0UHJvY2Vzc2VkVGltZSwgaXNNREN9ID0gRmlsZVNlcnZpY2UuX2dldFRpbWVDb2x1bW4oXHJcbiAgICAgICAgICAgIHJlc3VsdHMuZGF0YSwgZmlyc3RDaHVuaywgc3RhcnRUaW1lLCBlbmRUaW1lLCBsYXN0UHJvY2Vzc2VkVGltZSwgdGltZSwgcG9ydCwgaXNNREMsIHRpbWV6b25lLCBtYXhSb3dzTGltaXRhdGlvbikpO1xyXG4gICAgICAgICAgcHJpbnRQcm9jZXNzZWRUaW1lKGJlZ2luVGltZSwgJ3N0ZXAzJyk7XHJcblxyXG4gICAgICAgICAgaWYgKGluZGV4U3RhcnQgPT0gbnVsbCAmJiBpbmRleEVuZCA9PSBudWxsICYmIGxhc3RQcm9jZXNzZWRUaW1lID09IG51bGwgJiYgaXNNREMgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gcmVqZWN0QW5kQWJvcnQocmVqZWN0LCBwYXJzZXIpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIGdldCBhbGwgb3RoZXIgZGF0YSBjb2x1bW5zXHJcbiAgICAgICAgICBGaWxlU2VydmljZS5fZ2V0RGF0YUNvbHVtbnMoXHJcbiAgICAgICAgICAgIGNvbHVtbk51bSwgcmVzdWx0cy5kYXRhLCBmaXJzdENodW5rLCB0aW1lLCBpbmRleFN0YXJ0LCBpbmRleEVuZCwgbGFzdFByb2Nlc3NlZERhdGEsIGRhdGEsIHBvcnQsIGlzTURDKTtcclxuXHJcbiAgICAgICAgICBpZiAoZmlyc3RDaHVuaykge1xyXG4gICAgICAgICAgICBmaXJzdENodW5rID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgcHJpbnRQcm9jZXNzZWRUaW1lKGJlZ2luVGltZSwgJ3N0ZXA0Jyk7XHJcblxyXG4gICAgICAgICAgaWYgKGluZGV4RW5kID49IDApIHtcclxuICAgICAgICAgICAgLy8gZG8gbm90IG5lZWQgdG8gcHJvY2VzcyB0aGUgbGVmdCBwYXJ0cywgbWFudWFsbHkgdHJpZ2dlciBjb21wbGV0ZVxyXG4gICAgICAgICAgICBjb25zdCBwcm9jZXNzZWRMaW5lcyA9IE9iamVjdC5rZXlzKHRpbWUpLnJlZHVjZSgodG90YWwsIGN1cktleSkgPT4gdGltZVtjdXJLZXldID8gdG90YWwgKyB0aW1lW2N1cktleV0ubGVuZ3RoIDogdG90YWwsIDApO1xyXG4gICAgICAgICAgICBpZiAocHJvY2Vzc2VkTGluZXMgPj0gRmlsZVNlcnZpY2UuX2dldE1heFJvd3NMaW1pdGF0aW9uKG1heFJvd3NMaW1pdGF0aW9uKSkge1xyXG4gICAgICAgICAgICAgIGFib3J0VHlwZSA9IEFib3J0Lm1heExpbmVOdW1SZWFjaGVkO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGFib3J0VHlwZSA9IEFib3J0Lm1heFRpbWVSYW5nZVJlYWNoZWQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChwcm9ncmVzcykge1xyXG4gICAgICAgICAgICAgIHByb2dyZXNzKDEwMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcGFyc2VyLmFib3J0KCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIHRoZSBvdmVyYWxsIHByb2dyZXNzIGlmIHRoaXMgc3RlcCBpcyBmaW5pc2hlZFxyXG4gICAgICAgICAgICBpZiAocHJvZ3Jlc3MpIHtcclxuICAgICAgICAgICAgICBwcm9ncmVzcyhNYXRoLnJvdW5kKHJlc3VsdHMubWV0YS5jdXJzb3IgLyBmaWxlLnNpemUgKiAxMDApKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBsYXN0UHJvY2Vzc2VkQ3Vyc29yID0gcmVzdWx0cy5tZXRhLmN1cnNvcjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICBwcmludFByb2Nlc3NlZFRpbWUoYmVnaW5UaW1lLCAnc3RlcF9jb21wbGV0ZScpO1xyXG4gICAgICAgICAgcmVzb2x2ZSAoe2hlYWRlcjogaGVhZGVyLCBob3N0OiBob3N0LCB0aW1lOiB0aW1lLCBkYXRhOiBkYXRhLCBhYm9ydGVkOiBhYm9ydFR5cGV9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgYWxsIHBvcnRzIGZyb20gdGhlIG5hbWUgc2VydmVyIGhpc3RvcnkgZmlsZVxyXG4gICAqIEBwYXJhbSBmaWxlIHRoZSBuYW1lIHNlcnZlciBoaXN0b3J5IGZpbGVcclxuICAgKiBAcGFyYW0gcHJvZ3Jlc3MgY2FsbCBiYWNrIGZvciB1cGRhdGluZyB0aGUgcHJvZ3Jlc3NcclxuICAgKi9cclxuICBwdWJsaWMgZ2V0UG9ydHNGcm9tRmlsZShmaWxlOiBGaWxlLCBwcm9ncmVzczogYW55KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xyXG4gICAgY29uc3QgYmVnaW5UaW1lID0gbmV3IERhdGUoKTtcclxuICAgIGxldCBmaXJzdENodW5rID0gdHJ1ZTtcclxuICAgIGNvbnN0IHBvcnRzID0gW107XHJcbiAgICBjb25zdCBkZWZhdWx0UG9ydCA9IGdldERlZmF1bHRQb3J0KCk7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBwYXJzZShmaWxlLCB7XHJcbiAgICAgICAgY2h1bms6IChyZXN1bHRzLCBwYXJzZXIpID0+IHtcclxuICAgICAgICAgIC8vIGdldCB0aW1lIGNvbHVtblxyXG4gICAgICAgICAgaWYgKGZpcnN0Q2h1bmspIHtcclxuICAgICAgICAgICAgaWYgKCF2YWxpZGF0ZURhdGEocmVzdWx0cy5kYXRhKSkge1xyXG4gICAgICAgICAgICAgIGlmIChwcm9ncmVzcykge1xyXG4gICAgICAgICAgICAgICAgcHJvZ3Jlc3MoMTAwKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgcmVqZWN0KGAke2ZpbGUubmFtZX0gaXMgZW1wdHkgb3IgdGhlIGZvcm1hdCBpcyBub3QgY29ycmVjdC5gKTtcclxuICAgICAgICAgICAgICBwYXJzZXIuYWJvcnQoKTtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHByaW50UHJvY2Vzc2VkVGltZShiZWdpblRpbWUsICdwb3J0LnN0ZXAxJyk7XHJcbiAgICAgICAgICBGaWxlU2VydmljZS5fZ2V0UG9ydHMocmVzdWx0cy5kYXRhLCBmaXJzdENodW5rLCBwb3J0cyk7XHJcbiAgICAgICAgICBpZiAoZmlyc3RDaHVuaykge1xyXG4gICAgICAgICAgICBmaXJzdENodW5rID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAocHJvZ3Jlc3MpIHtcclxuICAgICAgICAgICAgcHJvZ3Jlc3MoTWF0aC5yb3VuZChyZXN1bHRzLm1ldGEuY3Vyc29yIC8gZmlsZS5zaXplICogMTAwKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBjb21wbGV0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgLy8gcGFyc2luZyBkb25lXHJcbiAgICAgICAgICBwcmludFByb2Nlc3NlZFRpbWUoYmVnaW5UaW1lLCAnc3RlcF9jb21wbGV0ZScpO1xyXG4gICAgICAgICAgaWYgKHBvcnRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICBwb3J0c1swXSA9IGRlZmF1bHRQb3J0O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmVzb2x2ZSAocG9ydHMpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIl19