ngx-hana-nameserver-history-viewer 1.2.1 → 21.1.0

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 (147) hide show
  1. package/README.md +2 -1
  2. package/{fesm2020 → fesm2022}/ngx-hana-nameserver-history-viewer.mjs +2898 -3983
  3. package/fesm2022/ngx-hana-nameserver-history-viewer.mjs.map +1 -0
  4. package/ngx-hana-nameserver-history-viewer-21.1.0.tgz +0 -0
  5. package/package.json +20 -27
  6. package/types/ngx-hana-nameserver-history-viewer.d.ts +545 -0
  7. package/esm2020/ngx-hana-nameserver-history-viewer.mjs +0 -5
  8. package/esm2020/public-api.mjs +0 -2
  9. package/esm2020/src/nameserver-history-viewer/components/alert/alert.component.mjs +0 -68
  10. package/esm2020/src/nameserver-history-viewer/components/alert/alert.module.mjs +0 -22
  11. package/esm2020/src/nameserver-history-viewer/components/alert/index.mjs +0 -3
  12. package/esm2020/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.mjs +0 -112
  13. package/esm2020/src/nameserver-history-viewer/components/file-drop-input/index.mjs +0 -2
  14. package/esm2020/src/nameserver-history-viewer/components/index.mjs +0 -9
  15. package/esm2020/src/nameserver-history-viewer/components/instruction/index.mjs +0 -2
  16. package/esm2020/src/nameserver-history-viewer/components/instruction/instruction.component.mjs +0 -42
  17. package/esm2020/src/nameserver-history-viewer/components/nameserver-history.component.mjs +0 -557
  18. package/esm2020/src/nameserver-history-viewer/components/port-selector/index.mjs +0 -2
  19. package/esm2020/src/nameserver-history-viewer/components/port-selector/port-selector.component.mjs +0 -69
  20. package/esm2020/src/nameserver-history-viewer/components/port-selector/port-selector.service.mjs +0 -41
  21. package/esm2020/src/nameserver-history-viewer/components/progress-bar/index.mjs +0 -2
  22. package/esm2020/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.mjs +0 -40
  23. package/esm2020/src/nameserver-history-viewer/components/time-range-selector/index.mjs +0 -2
  24. package/esm2020/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.mjs +0 -70
  25. package/esm2020/src/nameserver-history-viewer/components/timezone-selector/index.mjs +0 -2
  26. package/esm2020/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.component.mjs +0 -88
  27. package/esm2020/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.mjs +0 -47
  28. package/esm2020/src/nameserver-history-viewer/index.mjs +0 -3
  29. package/esm2020/src/nameserver-history-viewer/nameserver-history.module.mjs +0 -63
  30. package/esm2020/src/nameserver-history-viewer/services/chart.service.mjs +0 -328
  31. package/esm2020/src/nameserver-history-viewer/services/file.service.mjs +0 -390
  32. package/esm2020/src/nameserver-history-viewer/services/index.mjs +0 -4
  33. package/esm2020/src/nameserver-history-viewer/services/ui.service.mjs +0 -557
  34. package/esm2020/src/nameserver-history-viewer/types/abort.types.mjs +0 -6
  35. package/esm2020/src/nameserver-history-viewer/types/alert.types.mjs +0 -8
  36. package/esm2020/src/nameserver-history-viewer/types/chart-content-data-item.types.mjs +0 -2
  37. package/esm2020/src/nameserver-history-viewer/types/chart-content-data.types.mjs +0 -2
  38. package/esm2020/src/nameserver-history-viewer/types/chart-content-header.types.mjs +0 -2
  39. package/esm2020/src/nameserver-history-viewer/types/chart-content-time.types.mjs +0 -2
  40. package/esm2020/src/nameserver-history-viewer/types/chart-content.types.mjs +0 -2
  41. package/esm2020/src/nameserver-history-viewer/types/color-rgba.types.mjs +0 -2
  42. package/esm2020/src/nameserver-history-viewer/types/html-element.type.mjs +0 -9
  43. package/esm2020/src/nameserver-history-viewer/types/index.mjs +0 -28
  44. package/esm2020/src/nameserver-history-viewer/types/item.types.mjs +0 -14
  45. package/esm2020/src/nameserver-history-viewer/types/legend-color.types.mjs +0 -2
  46. package/esm2020/src/nameserver-history-viewer/types/load-history-info-backup.types.mjs +0 -2
  47. package/esm2020/src/nameserver-history-viewer/types/load-history-info-columnstore.types.mjs +0 -2
  48. package/esm2020/src/nameserver-history-viewer/types/load-history-info-host.types.mjs +0 -2
  49. package/esm2020/src/nameserver-history-viewer/types/load-history-info-item.types.mjs +0 -2
  50. package/esm2020/src/nameserver-history-viewer/types/load-history-info-persistence.types.mjs +0 -2
  51. package/esm2020/src/nameserver-history-viewer/types/load-history-info-rowstore.types.mjs +0 -2
  52. package/esm2020/src/nameserver-history-viewer/types/load-history-info-server.types.mjs +0 -2
  53. package/esm2020/src/nameserver-history-viewer/types/load-history-info-session-admission-control.types.mjs +0 -2
  54. package/esm2020/src/nameserver-history-viewer/types/load-history-info-sql.types.mjs +0 -2
  55. package/esm2020/src/nameserver-history-viewer/types/load-history-info-sync-primitives.types.mjs +0 -2
  56. package/esm2020/src/nameserver-history-viewer/types/load-history-info-threads.types.mjs +0 -2
  57. package/esm2020/src/nameserver-history-viewer/types/load-history-info.types.mjs +0 -2
  58. package/esm2020/src/nameserver-history-viewer/types/port.types.mjs +0 -2
  59. package/esm2020/src/nameserver-history-viewer/types/scale-group.types.mjs +0 -17
  60. package/esm2020/src/nameserver-history-viewer/types/unit-category.types.mjs +0 -10
  61. package/esm2020/src/nameserver-history-viewer/types/unit.types.mjs +0 -14
  62. package/esm2020/src/nameserver-history-viewer/utils/chart-util.mjs +0 -25
  63. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/chartjs_ext.mjs +0 -2
  64. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/data_culling.mjs +0 -56
  65. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/data_mipmap.mjs +0 -139
  66. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/index.mjs +0 -41
  67. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/lttb_data_mipmap.mjs +0 -106
  68. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/responsive_downsample_plugin.mjs +0 -167
  69. package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/utils.mjs +0 -114
  70. package/esm2020/src/nameserver-history-viewer/utils/chartjs-zoom/chart.zoom.mjs +0 -527
  71. package/esm2020/src/nameserver-history-viewer/utils/chartjs-zoom/index.mjs +0 -2
  72. package/esm2020/src/nameserver-history-viewer/utils/file-util.mjs +0 -161
  73. package/esm2020/src/nameserver-history-viewer/utils/index.mjs +0 -5
  74. package/esm2020/src/nameserver-history-viewer/utils/time-util.mjs +0 -99
  75. package/esm2020/src/nameserver-history-viewer/utils/ui-util.mjs +0 -162
  76. package/fesm2015/ngx-hana-nameserver-history-viewer.mjs +0 -4098
  77. package/fesm2015/ngx-hana-nameserver-history-viewer.mjs.map +0 -1
  78. package/fesm2020/ngx-hana-nameserver-history-viewer.mjs.map +0 -1
  79. package/ngx-hana-nameserver-history-viewer.d.ts +0 -5
  80. package/public-api.d.ts +0 -1
  81. package/src/nameserver-history-viewer/components/alert/alert.component.d.ts +0 -21
  82. package/src/nameserver-history-viewer/components/alert/alert.module.d.ts +0 -8
  83. package/src/nameserver-history-viewer/components/alert/index.d.ts +0 -2
  84. package/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.d.ts +0 -16
  85. package/src/nameserver-history-viewer/components/file-drop-input/index.d.ts +0 -1
  86. package/src/nameserver-history-viewer/components/index.d.ts +0 -8
  87. package/src/nameserver-history-viewer/components/instruction/index.d.ts +0 -1
  88. package/src/nameserver-history-viewer/components/instruction/instruction.component.d.ts +0 -17
  89. package/src/nameserver-history-viewer/components/nameserver-history.component.d.ts +0 -262
  90. package/src/nameserver-history-viewer/components/port-selector/index.d.ts +0 -1
  91. package/src/nameserver-history-viewer/components/port-selector/port-selector.component.d.ts +0 -31
  92. package/src/nameserver-history-viewer/components/port-selector/port-selector.service.d.ts +0 -14
  93. package/src/nameserver-history-viewer/components/progress-bar/index.d.ts +0 -1
  94. package/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.d.ts +0 -6
  95. package/src/nameserver-history-viewer/components/time-range-selector/index.d.ts +0 -1
  96. package/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.d.ts +0 -19
  97. package/src/nameserver-history-viewer/components/timezone-selector/index.d.ts +0 -1
  98. package/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.component.d.ts +0 -26
  99. package/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.d.ts +0 -21
  100. package/src/nameserver-history-viewer/index.d.ts +0 -2
  101. package/src/nameserver-history-viewer/nameserver-history.module.d.ts +0 -19
  102. package/src/nameserver-history-viewer/services/chart.service.d.ts +0 -59
  103. package/src/nameserver-history-viewer/services/file.service.d.ts +0 -63
  104. package/src/nameserver-history-viewer/services/index.d.ts +0 -3
  105. package/src/nameserver-history-viewer/services/ui.service.d.ts +0 -88
  106. package/src/nameserver-history-viewer/types/abort.types.d.ts +0 -4
  107. package/src/nameserver-history-viewer/types/alert.types.d.ts +0 -6
  108. package/src/nameserver-history-viewer/types/chart-content-data-item.types.d.ts +0 -4
  109. package/src/nameserver-history-viewer/types/chart-content-data.types.d.ts +0 -4
  110. package/src/nameserver-history-viewer/types/chart-content-header.types.d.ts +0 -4
  111. package/src/nameserver-history-viewer/types/chart-content-time.types.d.ts +0 -3
  112. package/src/nameserver-history-viewer/types/chart-content.types.d.ts +0 -10
  113. package/src/nameserver-history-viewer/types/color-rgba.types.d.ts +0 -6
  114. package/src/nameserver-history-viewer/types/html-element.type.d.ts +0 -7
  115. package/src/nameserver-history-viewer/types/index.d.ts +0 -27
  116. package/src/nameserver-history-viewer/types/item.types.d.ts +0 -12
  117. package/src/nameserver-history-viewer/types/legend-color.types.d.ts +0 -4
  118. package/src/nameserver-history-viewer/types/load-history-info-backup.types.d.ts +0 -7
  119. package/src/nameserver-history-viewer/types/load-history-info-columnstore.types.d.ts +0 -7
  120. package/src/nameserver-history-viewer/types/load-history-info-host.types.d.ts +0 -15
  121. package/src/nameserver-history-viewer/types/load-history-info-item.types.d.ts +0 -13
  122. package/src/nameserver-history-viewer/types/load-history-info-persistence.types.d.ts +0 -11
  123. package/src/nameserver-history-viewer/types/load-history-info-rowstore.types.d.ts +0 -5
  124. package/src/nameserver-history-viewer/types/load-history-info-server.types.d.ts +0 -10
  125. package/src/nameserver-history-viewer/types/load-history-info-session-admission-control.types.d.ts +0 -10
  126. package/src/nameserver-history-viewer/types/load-history-info-sql.types.d.ts +0 -16
  127. package/src/nameserver-history-viewer/types/load-history-info-sync-primitives.types.d.ts +0 -5
  128. package/src/nameserver-history-viewer/types/load-history-info-threads.types.d.ts +0 -9
  129. package/src/nameserver-history-viewer/types/load-history-info.types.d.ts +0 -22
  130. package/src/nameserver-history-viewer/types/port.types.d.ts +0 -5
  131. package/src/nameserver-history-viewer/types/scale-group.types.d.ts +0 -15
  132. package/src/nameserver-history-viewer/types/unit-category.types.d.ts +0 -8
  133. package/src/nameserver-history-viewer/types/unit.types.d.ts +0 -12
  134. package/src/nameserver-history-viewer/utils/chart-util.d.ts +0 -14
  135. package/src/nameserver-history-viewer/utils/chartjs-downsample/chartjs_ext.d.ts +0 -89
  136. package/src/nameserver-history-viewer/utils/chartjs-downsample/data_culling.d.ts +0 -32
  137. package/src/nameserver-history-viewer/utils/chartjs-downsample/data_mipmap.d.ts +0 -78
  138. package/src/nameserver-history-viewer/utils/chartjs-downsample/index.d.ts +0 -1
  139. package/src/nameserver-history-viewer/utils/chartjs-downsample/lttb_data_mipmap.d.ts +0 -57
  140. package/src/nameserver-history-viewer/utils/chartjs-downsample/responsive_downsample_plugin.d.ts +0 -55
  141. package/src/nameserver-history-viewer/utils/chartjs-downsample/utils.d.ts +0 -64
  142. package/src/nameserver-history-viewer/utils/chartjs-zoom/chart.zoom.d.ts +0 -30
  143. package/src/nameserver-history-viewer/utils/chartjs-zoom/index.d.ts +0 -1
  144. package/src/nameserver-history-viewer/utils/file-util.d.ts +0 -68
  145. package/src/nameserver-history-viewer/utils/index.d.ts +0 -4
  146. package/src/nameserver-history-viewer/utils/time-util.d.ts +0 -23
  147. package/src/nameserver-history-viewer/utils/ui-util.d.ts +0 -41
@@ -1,106 +0,0 @@
1
- import * as utils from './utils';
2
- import { DataMipmap } from './data_mipmap';
3
- /**
4
- * A mipmap data structure that uses Largest-Triangle-Three-Buckets algorithm to downsample data
5
- */
6
- export class LTTBDataMipmap extends DataMipmap {
7
- getMipMapIndexForResolution(resolution) {
8
- if (utils.isNil(resolution)) {
9
- return 0;
10
- }
11
- let index = utils.findIndexInArray(this.resolutions, (levelResolution) => levelResolution >= resolution);
12
- if (index === -1) {
13
- // use smallest mipmap as fallback
14
- index = this.resolutions.length - 1;
15
- }
16
- return index;
17
- }
18
- createMipMap() {
19
- super.createMipMap();
20
- this.resolutions = this.mipMaps.map((level) => this.computeAverageResolution(level));
21
- }
22
- /**
23
- * This method is adapted from: https://github.com/sveinn-steinarsson/flot-downsample
24
- *
25
- * The MIT License
26
- * Copyright (c) 2013 by Sveinn Steinarsson
27
- * Permission is hereby granted, free of charge, to any person obtaining a copy
28
- * of this software and associated documentation files (the "Software"), to deal
29
- * in the Software without restriction, including without limitation the rights
30
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
31
- * copies of the Software, and to permit persons to whom the Software is
32
- * furnished to do so, subject to the following conditions:
33
- * The above copyright notice and this permission notice shall be included in
34
- * all copies or substantial portions of the Software.
35
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
36
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
37
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
38
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
39
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
40
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
41
- * THE SOFTWARE.
42
- */
43
- downsampleToResolution(data, targetResolution, targetLength) {
44
- const dataLength = data.length;
45
- if (targetLength >= dataLength || targetLength === 0) {
46
- return data; // data has target size
47
- }
48
- const output = [];
49
- // bucket size, leave room for start and end data points
50
- const bucksetSize = (dataLength - 2) / (targetLength - 2);
51
- let a = 0; // initially a is the first point in the triangle
52
- let maxAreaPoint;
53
- let maxArea;
54
- let area;
55
- let nextA;
56
- // always add the first point
57
- output.push(data[a]);
58
- for (let i = 0; i < targetLength - 2; ++i) {
59
- // Calculate point average for next bucket (containing c)
60
- let avgX = 0;
61
- let avgY = 0;
62
- let avgRangeStart = Math.floor((i + 1) * bucksetSize) + 1;
63
- let avgRangeEnd = Math.floor((i + 2) * bucksetSize) + 1;
64
- avgRangeEnd = avgRangeEnd < dataLength ? avgRangeEnd : dataLength;
65
- const avgRangeLength = avgRangeEnd - avgRangeStart;
66
- for (; avgRangeStart < avgRangeEnd; avgRangeStart++) {
67
- avgX += this.getTime(data[avgRangeStart]);
68
- avgY += data[avgRangeStart].y * 1;
69
- }
70
- avgX /= avgRangeLength;
71
- avgY /= avgRangeLength;
72
- // Get the range for this bucket
73
- let rangeOffs = Math.floor((i + 0) * bucksetSize) + 1;
74
- const rangeTo = Math.floor((i + 1) * bucksetSize) + 1;
75
- // Point a
76
- const pointA = data[a];
77
- const pointAX = this.getTime(pointA);
78
- const pointAY = pointA.y * 1;
79
- maxArea = area = -1;
80
- for (; rangeOffs < rangeTo; rangeOffs++) {
81
- // Calculate triangle area over three buckets
82
- area = Math.abs((pointAX - avgX) * (data[rangeOffs].y - pointAY) -
83
- (pointAX - this.getTime(data[rangeOffs])) * (avgY - pointAY)) * 0.5;
84
- if (area > maxArea) {
85
- maxArea = area;
86
- maxAreaPoint = data[rangeOffs];
87
- nextA = rangeOffs; // Next a is this b
88
- }
89
- }
90
- output.push(maxAreaPoint); // Pick this point from the bucket
91
- a = nextA; // This a is the next a (chosen b)
92
- }
93
- output.push(data[dataLength - 1]); // Always add last
94
- return output;
95
- }
96
- computeAverageResolution(data) {
97
- let timeDistances = 0;
98
- for (let i = 0, end = this.originalData.length - 1; i < end; ++i) {
99
- const current = this.originalData[i];
100
- const next = this.originalData[i + 1];
101
- timeDistances += Math.abs(this.getTime(current) - this.getTime(next));
102
- }
103
- return timeDistances / (data.length - 1);
104
- }
105
- }
106
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibHR0Yl9kYXRhX21pcG1hcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9uYW1lc2VydmVyLWhpc3Rvcnktdmlld2VyL3V0aWxzL2NoYXJ0anMtZG93bnNhbXBsZS9sdHRiX2RhdGFfbWlwbWFwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQXlCQSxPQUFPLEtBQUssS0FBSyxNQUFNLFNBQVMsQ0FBQztBQUNqQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGNBQWUsU0FBUSxVQUFVO0lBRzFDLDJCQUEyQixDQUFDLFVBQWtCO1FBQzFDLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUFFLE9BQU8sQ0FBQyxDQUFDO1NBQUU7UUFFMUMsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDLGVBQWUsSUFBSSxVQUFVLENBQUMsQ0FBQztRQUN6RyxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRTtZQUNkLGtDQUFrQztZQUNsQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1NBQ3ZDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVTLFlBQVk7UUFDbEIsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3pGLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FvQkc7SUFDTyxzQkFBc0IsQ0FDNUIsSUFBa0IsRUFDbEIsZ0JBQXdCLEVB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QyxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogVGhpcyBwbHVnaW4gaXMgYWRhcHRlZCBmcm9tOiBodHRwczovL2dpdGh1Yi5jb20vM2RjbC9jaGFydGpzLXBsdWdpbi1yZXNwb25zaXZlLWRvd25zYW1wbGVcclxuICogZm9yIGNvbnRyb2xsaW5nIHRoZSByYWRpdXMgb2YgcG9pbnQuXHJcbiAqXHJcbiAqIE1JVCBMaWNlbnNlXHJcbiAqIENvcHlyaWdodCAoYykgMjAxOCAzRCBDb250ZW50IExvZ2lzdGljc1xyXG4gKlxyXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XHJcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcclxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xyXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXHJcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xyXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxyXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcclxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cclxuICpcclxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxyXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcclxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXHJcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcclxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcclxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcclxuICogU09GVFdBUkUuXHJcbiAqL1xyXG5pbXBvcnQgeyBDaGFydFBvaW50IH0gZnJvbSAnY2hhcnQuanMnO1xyXG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICcuL3V0aWxzJztcclxuaW1wb3J0IHsgRGF0YU1pcG1hcCB9IGZyb20gJy4vZGF0YV9taXBtYXAnO1xyXG5cclxuLyoqXHJcbiAqIEEgbWlwbWFwIGRhdGEgc3RydWN0dXJlIHRoYXQgdXNlcyBMYXJnZXN0LVRyaWFuZ2xlLVRocmVlLUJ1Y2tldHMgYWxnb3JpdGhtIHRvIGRvd25zYW1wbGUgZGF0YVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIExUVEJEYXRhTWlwbWFwIGV4dGVuZHMgRGF0YU1pcG1hcCB7XHJcbiAgICBwcm90ZWN0ZWQgcmVzb2x1dGlvbnM6IG51bWJlcltdO1xyXG5cclxuICAgIGdldE1pcE1hcEluZGV4Rm9yUmVzb2x1dGlvbihyZXNvbHV0aW9uOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICAgIGlmICh1dGlscy5pc05pbChyZXNvbHV0aW9uKSkgeyByZXR1cm4gMDsgfVxyXG5cclxuICAgICAgICBsZXQgaW5kZXggPSB1dGlscy5maW5kSW5kZXhJbkFycmF5KHRoaXMucmVzb2x1dGlvbnMsIChsZXZlbFJlc29sdXRpb24pID0+IGxldmVsUmVzb2x1dGlvbiA+PSByZXNvbHV0aW9uKTtcclxuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgICAgIC8vIHVzZSBzbWFsbGVzdCBtaXBtYXAgYXMgZmFsbGJhY2tcclxuICAgICAgICAgICAgaW5kZXggPSB0aGlzLnJlc29sdXRpb25zLmxlbmd0aCAtIDE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gaW5kZXg7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGNyZWF0ZU1pcE1hcCgpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5jcmVhdGVNaXBNYXAoKTtcclxuICAgICAgICB0aGlzLnJlc29sdXRpb25zID0gdGhpcy5taXBNYXBzLm1hcCgobGV2ZWwpID0+IHRoaXMuY29tcHV0ZUF2ZXJhZ2VSZXNvbHV0aW9uKGxldmVsKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBhZGFwdGVkIGZyb206IGh0dHBzOi8vZ2l0aHViLmNvbS9zdmVpbm4tc3RlaW5hcnNzb24vZmxvdC1kb3duc2FtcGxlXHJcbiAgICAgKlxyXG4gICAgICogVGhlIE1JVCBMaWNlbnNlXHJcbiAgICAgKiBDb3B5cmlnaHQgKGMpIDIwMTMgYnkgU3ZlaW5uIFN0ZWluYXJzc29uXHJcbiAgICAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XHJcbiAgICAgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXHJcbiAgICAgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXHJcbiAgICAgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXHJcbiAgICAgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcclxuICAgICAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XHJcbiAgICAgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxyXG4gICAgICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXHJcbiAgICAgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXHJcbiAgICAgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcclxuICAgICAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxyXG4gICAgICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxyXG4gICAgICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcclxuICAgICAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cclxuICAgICAqIFRIRSBTT0ZUV0FSRS5cclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGRvd25zYW1wbGVUb1Jlc29sdXRpb24oXHJcbiAgICAgICAgZGF0YTogQ2hhcnRQb2ludFtdLFxyXG4gICAgICAgIHRhcmdldFJlc29sdXRpb246IG51bWJlcixcclxuICAgICAgICB0YXJnZXRMZW5ndGg6IG51bWJlclxyXG4gICAgKSB7XHJcbiAgICAgICAgY29uc3QgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoO1xyXG4gICAgICAgIGlmICh0YXJnZXRMZW5ndGggPj0gZGF0YUxlbmd0aCB8fCB0YXJnZXRMZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGRhdGE7IC8vIGRhdGEgaGFzIHRhcmdldCBzaXplXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBvdXRwdXQ6IENoYXJ0UG9pbnRbXSA9IFtdO1xyXG5cclxuICAgICAgICAvLyBidWNrZXQgc2l6ZSwgbGVhdmUgcm9vbSBmb3Igc3RhcnQgYW5kIGVuZCBkYXRhIHBvaW50c1xyXG4gICAgICAgIGNvbnN0IGJ1Y2tzZXRTaXplID0gKGRhdGFMZW5ndGggLSAyKSAvICh0YXJnZXRMZW5ndGggLSAyKTtcclxuXHJcbiAgICAgICAgbGV0IGEgPSAwOyAgLy8gaW5pdGlhbGx5IGEgaXMgdGhlIGZpcnN0IHBvaW50IGluIHRoZSB0cmlhbmdsZVxyXG4gICAgICAgIGxldCBtYXhBcmVhUG9pbnQ6IENoYXJ0UG9pbnQ7XHJcbiAgICAgICAgbGV0IG1heEFyZWE6IG51bWJlcjtcclxuICAgICAgICBsZXQgYXJlYTogbnVtYmVyO1xyXG4gICAgICAgIGxldCBuZXh0QTogbnVtYmVyO1xyXG5cclxuICAgICAgICAvLyBhbHdheXMgYWRkIHRoZSBmaXJzdCBwb2ludFxyXG4gICAgICAgIG91dHB1dC5wdXNoKGRhdGFbYV0pO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhcmdldExlbmd0aCAtIDI7ICsraSkge1xyXG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgcG9pbnQgYXZlcmFnZSBmb3IgbmV4dCBidWNrZXQgKGNvbnRhaW5pbmcgYylcclxuICAgICAgICAgICAgbGV0IGF2Z1ggPSAwO1xyXG4gICAgICAgICAgICBsZXQgYXZnWSA9IDA7XHJcbiAgICAgICAgICAgIGxldCBhdmdSYW5nZVN0YXJ0ID0gTWF0aC5mbG9vcigoaSArIDEpICogYnVja3NldFNpemUpICsgMTtcclxuICAgICAgICAgICAgbGV0IGF2Z1JhbmdlRW5kID0gTWF0aC5mbG9vcigoaSArIDIpICogYnVja3NldFNpemUpICsgMTtcclxuICAgICAgICAgICAgYXZnUmFuZ2VFbmQgPSBhdmdSYW5nZUVuZCA8IGRhdGFMZW5ndGggPyBhdmdSYW5nZUVuZCA6IGRhdGFMZW5ndGg7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBhdmdSYW5nZUxlbmd0aCA9IGF2Z1JhbmdlRW5kIC0gYXZnUmFuZ2VTdGFydDtcclxuXHJcbiAgICAgICAgICAgIGZvciAoOyBhdmdSYW5nZVN0YXJ0IDwgYXZnUmFuZ2VFbmQ7IGF2Z1JhbmdlU3RhcnQrKykge1xyXG4gICAgICAgICAgICAgICAgYXZnWCArPSB0aGlzLmdldFRpbWUoZGF0YVthdmdSYW5nZVN0YXJ0XSk7XHJcbiAgICAgICAgICAgICAgICBhdmdZICs9IGRhdGFbYXZnUmFuZ2VTdGFydF0ueSBhcyBudW1iZXIgKiAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGF2Z1ggLz0gYXZnUmFuZ2VMZW5ndGg7XHJcbiAgICAgICAgICAgIGF2Z1kgLz0gYXZnUmFuZ2VMZW5ndGg7XHJcblxyXG4gICAgICAgICAgICAvLyBHZXQgdGhlIHJhbmdlIGZvciB0aGlzIGJ1Y2tldFxyXG4gICAgICAgICAgICBsZXQgcmFuZ2VPZmZzID0gTWF0aC5mbG9vcigoaSArIDApICogYnVja3NldFNpemUpICsgMTtcclxuICAgICAgICAgICAgY29uc3QgcmFuZ2VUbyA9IE1hdGguZmxvb3IoKGkgKyAxKSAqIGJ1Y2tzZXRTaXplKSArIDE7XHJcblxyXG4gICAgICAgICAgICAvLyBQb2ludCBhXHJcbiAgICAgICAgICAgIGNvbnN0IHBvaW50QSA9IGRhdGFbYV07XHJcbiAgICAgICAgICAgIGNvbnN0IHBvaW50QVggPSB0aGlzLmdldFRpbWUocG9pbnRBKTtcclxuICAgICAgICAgICAgY29uc3QgcG9pbnRBWSA9IHBvaW50QS55IGFzIG51bWJlciAqIDE7XHJcblxyXG4gICAgICAgICAgICBtYXhBcmVhID0gYXJlYSA9IC0xO1xyXG5cclxuICAgICAgICAgICAgZm9yICg7IHJhbmdlT2ZmcyA8IHJhbmdlVG87IHJhbmdlT2ZmcysrKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgdHJpYW5nbGUgYXJlYSBvdmVyIHRocmVlIGJ1Y2tldHNcclxuICAgICAgICAgICAgICAgIGFyZWEgPSBNYXRoLmFicygocG9pbnRBWCAtIGF2Z1gpICogKGRhdGFbcmFuZ2VPZmZzXS55IGFzIG51bWJlciAtIHBvaW50QVkpIC1cclxuICAgICAgICAgICAgICAgICAgICAocG9pbnRBWCAtIHRoaXMuZ2V0VGltZShkYXRhW3JhbmdlT2Zmc10pKSAqIChhdmdZIC0gcG9pbnRBWSlcclxuICAgICAgICAgICAgICAgICkgKiAwLjU7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGFyZWEgPiBtYXhBcmVhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWF4QXJlYSA9IGFyZWE7XHJcbiAgICAgICAgICAgICAgICAgICAgbWF4QXJlYVBvaW50ID0gZGF0YVtyYW5nZU9mZnNdO1xyXG4gICAgICAgICAgICAgICAgICAgIG5leHRBID0gcmFuZ2VPZmZzOyAvLyBOZXh0IGEgaXMgdGhpcyBiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIG91dHB1dC5wdXNoKG1heEFyZWFQb2ludCk7IC8vIFBpY2sgdGhpcyBwb2ludCBmcm9tIHRoZSBidWNrZXRcclxuICAgICAgICAgICAgYSA9IG5leHRBOyAvLyBUaGlzIGEgaXMgdGhlIG5leHQgYSAoY2hvc2VuIGIpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBvdXRwdXQucHVzaChkYXRhW2RhdGFMZW5ndGggLSAxXSk7IC8vIEFsd2F5cyBhZGQgbGFzdFxyXG5cclxuICAgICAgICByZXR1cm4gb3V0cHV0O1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBjb21wdXRlQXZlcmFnZVJlc29sdXRpb24oZGF0YTogQ2hhcnRQb2ludFtdKTogbnVtYmVyIHtcclxuICAgICAgICBsZXQgdGltZURpc3RhbmNlcyA9IDA7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBlbmQgPSB0aGlzLm9yaWdpbmFsRGF0YS5sZW5ndGggLSAxOyBpIDwgZW5kOyArK2kpIHtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMub3JpZ2luYWxEYXRhW2ldO1xyXG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5vcmlnaW5hbERhdGFbaSArIDFdO1xyXG5cclxuICAgICAgICAgICAgdGltZURpc3RhbmNlcyArPSBNYXRoLmFicyh0aGlzLmdldFRpbWUoY3VycmVudCkgLSB0aGlzLmdldFRpbWUobmV4dCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGltZURpc3RhbmNlcyAvIChkYXRhLmxlbmd0aCAtIDEpO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
@@ -1,167 +0,0 @@
1
- /**
2
- * This plugin is adapted from: https://github.com/3dcl/chartjs-plugin-responsive-downsample
3
- * for controlling the radius of point.
4
- *
5
- * MIT License
6
- * Copyright (c) 2018 3D Content Logistics
7
- *
8
- * Permission is hereby granted, free of charge, to any person obtaining a copy
9
- * of this software and associated documentation files (the "Software"), to deal
10
- * in the Software without restriction, including without limitation the rights
11
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
- * copies of the Software, and to permit persons to whom the Software is
13
- * furnished to do so, subject to the following conditions:
14
- * The above copyright notice and this permission notice shall be included in all
15
- * copies or substantial portions of the Software.
16
- *
17
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23
- * SOFTWARE.
24
- */
25
- import moment from 'moment';
26
- import * as utils from './utils';
27
- import { DataMipmap } from './data_mipmap';
28
- import { LTTBDataMipmap } from './lttb_data_mipmap';
29
- import * as data_culling from './data_culling';
30
- // Using dynamic flag to fix the issue of ng-packagr #696: Lambda not supported
31
- // @dynamic
32
- /**
33
- * Chart js Plugin for downsampling data
34
- */
35
- export class ResponsiveDownsamplePlugin {
36
- static getPluginOptions(chart) {
37
- const options = chart.options.responsiveDownsample || {};
38
- utils.defaultsDeep(options, {
39
- enabled: false,
40
- aggregationAlgorithm: 'LTTB',
41
- desiredDataPointDistance: 1,
42
- minNumPoints: 100,
43
- maxNumPointsToDraw: 100,
44
- cullData: true
45
- });
46
- if (options.enabled) {
47
- chart.options.responsiveDownsample = options;
48
- }
49
- return options;
50
- }
51
- static hasDataChanged(chart) {
52
- return !utils.isNil(utils.findInArray(chart.data.datasets, (dataset) => {
53
- return utils.isNil(dataset.mipMap);
54
- }));
55
- }
56
- static createDataMipMap(chart, options) {
57
- chart.data.datasets.forEach((dataset) => {
58
- // @ts-ignore
59
- const data = !utils.isNil(dataset.originalData) ? dataset.originalData : dataset.data;
60
- const mipMap = (options.aggregationAlgorithm === 'LTTB')
61
- ? new LTTBDataMipmap(data, options.minNumPoints)
62
- : new DataMipmap(data, options.minNumPoints);
63
- dataset.originalData = data;
64
- dataset.mipMap = mipMap;
65
- // @ts-ignore
66
- dataset.data = mipMap.getMipMapLevel(mipMap.getNumLevel() - 1); // set last level for first render pass
67
- });
68
- }
69
- static restoreOriginalData(chart) {
70
- let updated = false;
71
- chart.data.datasets.forEach((dataset) => {
72
- // @ts-ignore
73
- if (!utils.isNil(dataset.originalData) && dataset.data !== dataset.originalData) {
74
- // @ts-ignore
75
- dataset.data = dataset.originalData;
76
- updated = true;
77
- }
78
- });
79
- return updated;
80
- }
81
- static getTargetResolution(chart, options) {
82
- const xScale = chart.scales['x-axis-0'];
83
- if (utils.isNil(xScale)) {
84
- return null;
85
- }
86
- const start = moment(xScale.getValueForPixel(xScale.left));
87
- const end = moment(xScale.getValueForPixel(xScale.left + 1));
88
- const targetResolution = end.diff(start);
89
- return targetResolution * options.desiredDataPointDistance;
90
- }
91
- static updateMipMap(chart, options, rangeChanged) {
92
- let updated = false;
93
- chart.data.datasets.forEach((dataset) => {
94
- const mipMap = dataset.mipMap;
95
- if (utils.isNil(mipMap)) {
96
- return;
97
- }
98
- const mipMalLevel = mipMap.getMipMapIndexForResolution(options.targetResolution);
99
- if (mipMalLevel === dataset.currentMipMapLevel && !rangeChanged) {
100
- // skip update if mip map level and data range did not change
101
- return;
102
- }
103
- updated = true;
104
- dataset.currentMipMapLevel = mipMalLevel;
105
- let newData = mipMap.getMipMapLevel(mipMalLevel);
106
- if (options.cullData) {
107
- newData = data_culling.cullData(newData, options.scaleRange);
108
- }
109
- // @ts-ignore
110
- dataset.data = newData;
111
- });
112
- return updated;
113
- }
114
- beforeInit(chart) {
115
- const options = ResponsiveDownsamplePlugin.getPluginOptions(chart);
116
- if (!options.enabled) {
117
- return;
118
- }
119
- ResponsiveDownsamplePlugin.createDataMipMap(chart, options);
120
- options.needsUpdate = true;
121
- }
122
- beforeDatasetsUpdate(chart) {
123
- const options = ResponsiveDownsamplePlugin.getPluginOptions(chart);
124
- if (!options.enabled) {
125
- // restore original data and remove state from options
126
- options.needsUpdate = ResponsiveDownsamplePlugin.restoreOriginalData(chart);
127
- delete options.targetResolution;
128
- delete options.scaleRange;
129
- return;
130
- }
131
- // only update mip map if data set was reloaded externally
132
- if (ResponsiveDownsamplePlugin.hasDataChanged(chart)) {
133
- ResponsiveDownsamplePlugin.createDataMipMap(chart, options);
134
- options.needsUpdate = true;
135
- }
136
- }
137
- beforeRender(chart) {
138
- const options = ResponsiveDownsamplePlugin.getPluginOptions(chart);
139
- if (!options.enabled) {
140
- // update chart if data was restored from original data
141
- if (options.needsUpdate) {
142
- options.needsUpdate = false;
143
- chart.update(0);
144
- return false;
145
- }
146
- return;
147
- }
148
- const targetResolution = ResponsiveDownsamplePlugin.getTargetResolution(chart, options);
149
- const xScale = chart.scales['x-axis-0'];
150
- const scaleRange = data_culling.getScaleRange(xScale);
151
- const rangeChanged = !data_culling.rangeIsEqual(options.scaleRange, scaleRange);
152
- if (options.needsUpdate ||
153
- options.targetResolution !== targetResolution ||
154
- rangeChanged) {
155
- options.targetResolution = targetResolution;
156
- options.scaleRange = scaleRange;
157
- options.needsUpdate = false;
158
- if (ResponsiveDownsamplePlugin.updateMipMap(chart, options, rangeChanged)) {
159
- utils.changePointRadius(chart, options);
160
- // update chart and cancel current render
161
- chart.update(0);
162
- return false;
163
- }
164
- }
165
- }
166
- }
167
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzcG9uc2l2ZV9kb3duc2FtcGxlX3BsdWdpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9uYW1lc2VydmVyLWhpc3Rvcnktdmlld2VyL3V0aWxzL2NoYXJ0anMtZG93bnNhbXBsZS9yZXNwb25zaXZlX2Rvd25zYW1wbGVfcGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVCRztBQUNILE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUc1QixPQUFPLEtBQUssS0FBSyxNQUFNLFNBQVMsQ0FBQztBQUVqQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNwRCxPQUFPLEtBQUssWUFBWSxNQUFNLGdCQUFnQixDQUFDO0FBK0MvQywrRUFBK0U7QUFDL0UsV0FBVztBQUNYOztHQUVHO0FBQ0gsTUFBTSxPQUFPLDBCQUEwQjtJQUNyQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsS0FBVTtRQUNoQyxNQUFNLE9BQU8sR0FBc0MsS0FBSyxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsSUFBSSxFQUFFLENBQUM7UUFDNUYsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUU7WUFDMUIsT0FBTyxFQUFFLEtBQUs7WUFDZCxvQkFBb0IsRUFBRSxNQUFNO1lBQzVCLHdCQUF3QixFQUFFLENBQUM7WUFDM0IsWUFBWSxFQUFFLEdBQUc7WUFDakIsa0JBQWtCLEVBQUUsR0FBRztZQUN2QixRQUFRLEVBQUUsSUFBSTtTQUNmLENBQUMsQ0FBQztRQUVILElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRTtZQUNuQixLQUFLLENBQUMsT0FBTyxDQUFDLG9CQUFvQixHQUFHLE9BQU8sQ0FBQztTQUM5QztRQUVELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxNQUFNLENBQUMs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R0FBRyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUVoRixJQUFJLE9BQU8sQ0FBQyxXQUFXO1lBQ3JCLE9BQU8sQ0FBQyxnQkFBZ0IsS0FBSyxnQkFBZ0I7WUFDN0MsWUFBWSxFQUNaO1lBQ0EsT0FBTyxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO1lBQzVDLE9BQU8sQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1lBQ2hDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1lBRTVCLElBQUksMEJBQTBCLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsWUFBWSxDQUFDLEVBQUU7Z0JBQ3pFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ3hDLHlDQUF5QztnQkFDekMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFFaEIsT0FBTyxLQUFLLENBQUM7YUFDZDtTQUNGO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIFRoaXMgcGx1Z2luIGlzIGFkYXB0ZWQgZnJvbTogaHR0cHM6Ly9naXRodWIuY29tLzNkY2wvY2hhcnRqcy1wbHVnaW4tcmVzcG9uc2l2ZS1kb3duc2FtcGxlXHJcbiAqIGZvciBjb250cm9sbGluZyB0aGUgcmFkaXVzIG9mIHBvaW50LlxyXG4gKlxyXG4gKiBNSVQgTGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTggM0QgQ29udGVudCBMb2dpc3RpY3NcclxuICpcclxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxyXG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXHJcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcclxuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxyXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcclxuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcclxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXHJcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXHJcbiAqXHJcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcclxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXHJcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxyXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXHJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXHJcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXHJcbiAqIFNPRlRXQVJFLlxyXG4gKi9cclxuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xyXG5pbXBvcnQgeyBDaGFydCwgQ2hhcnREYXRhU2V0cywgQ2hhcnRQb2ludCB9IGZyb20gJ2NoYXJ0LmpzJztcclxuaW1wb3J0IHsgSUNoYXJ0UGx1Z2luLCBUaW1lU2NhbGUgfSBmcm9tICcuL2NoYXJ0anNfZXh0JztcclxuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi91dGlscyc7XHJcblxyXG5pbXBvcnQgeyBEYXRhTWlwbWFwIH0gZnJvbSAnLi9kYXRhX21pcG1hcCc7XHJcbmltcG9ydCB7IExUVEJEYXRhTWlwbWFwIH0gZnJvbSAnLi9sdHRiX2RhdGFfbWlwbWFwJztcclxuaW1wb3J0ICogYXMgZGF0YV9jdWxsaW5nIGZyb20gJy4vZGF0YV9jdWxsaW5nJztcclxuXHJcbmludGVyZmFjZSBNaXBNYXBEYXRhU2V0cyBleHRlbmRzIENoYXJ0RGF0YVNldHMge1xyXG4gIG9yaWdpbmFsRGF0YT86IENoYXJ0UG9pbnRbXTtcclxuICBjdXJyZW50TWlwTWFwTGV2ZWw/OiBudW1iZXI7XHJcbiAgbWlwTWFwPzogRGF0YU1pcG1hcDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBSZXNwb25zaXZlRG93bnNhbXBsZVBsdWdpbk9wdGlvbnMge1xyXG4gIC8qKlxyXG4gICAqIEVuYWJsZS9kaXNhYmxlIHBsdWdpblxyXG4gICAqL1xyXG4gIGVuYWJsZWQ/OiBib29sZWFuO1xyXG4gIC8qKlxyXG4gICAqIFRoZSBhZ2dyZWdhdGlvbiBhbGdvcml0aG0gdG8gdGhpbiBvdXQgZGF0YS4gRGVmYXVsdDogTFRUQlxyXG4gICAqL1xyXG4gIGFnZ3JlZ2F0aW9uQWxnb3JpdGhtPzogJ0FWRycgfCAnTFRUQic7XHJcbiAgLyoqXHJcbiAgICogRGVzaXJlZCBtaW5pbWFsIGRpc3RhbmNlIGJldHdlZW4gZGF0YSBwb2ludHMgaW4gcGl4ZWxzLiBEZWZhdWx0OiAxIHBpeGVsXHJcbiAgICovXHJcbiAgZGVzaXJlZERhdGFQb2ludERpc3RhbmNlPzogbnVtYmVyO1xyXG4gIC8qKlxyXG4gICAqIE1pbmltYWwgbnVtYmVyIG9mIGRhdGEgcG9pbnRzLiBMaW1pdHNcclxuICAgKi9cclxuICBtaW5OdW1Qb2ludHM/OiBudW1iZXI7XHJcbiAgLyoqXHJcbiAgICogQ3VsbCBkYXRhIHRvIGRpc3BsYXllZCByYW5nZSBvZiB4IHNjYWxlXHJcbiAgICovXHJcbiAgY3VsbERhdGE/OiBib29sZWFuO1xyXG4gIC8qKlxyXG4gICAqIEZsYWcgaXMgc2V0IGJ5IHBsdWdpbiB0byB0cmlnZ2VyIHJlbG9hZCBvZiBkYXRhXHJcbiAgICovXHJcbiAgbmVlZHNVcGRhdGU/OiBib29sZWFuO1xyXG4gIC8qKlxyXG4gICAqIEN1cnJlbnQgdGFyZ2V0IHJlc29sdXRpb24oU2V0IGJ5IHBsdWdpbilcclxuICAgKi9cclxuICB0YXJnZXRSZXNvbHV0aW9uPzogbnVtYmVyO1xyXG4gIC8qKlxyXG4gICAqIFNjYWxlIHJhbmdlIG9mIHggYXhpc1xyXG4gICAqL1xyXG4gIHNjYWxlUmFuZ2U/OiBkYXRhX2N1bGxpbmcuUmFuZ2U7XHJcbiAgLyoqXHJcbiAgICogRHJhdyBwb2ludHMgb25seSBpZiB0aGUgcG9pbnRzIG51bWJlciBsZXNzIHRoYW4gdGhlIGxpbWl0YXRpb25cclxuICAgKi9cclxuICBtYXhOdW1Qb2ludHNUb0RyYXc/OiBudW1iZXI7XHJcbn1cclxuXHJcbi8vIFVzaW5nIGR5bmFtaWMgZmxhZyB0byBmaXggdGhlIGlzc3VlIG9mIG5nLXBhY2thZ3IgIzY5NjogTGFtYmRhIG5vdCBzdXBwb3J0ZWRcclxuLy8gQGR5bmFtaWNcclxuLyoqXHJcbiAqIENoYXJ0IGpzIFBsdWdpbiBmb3IgZG93bnNhbXBsaW5nIGRhdGFcclxuICovXHJcbmV4cG9ydCBjbGFzcyBSZXNwb25zaXZlRG93bnNhbXBsZVBsdWdpbiBpbXBsZW1lbnRzIElDaGFydFBsdWdpbiB7XHJcbiAgc3RhdGljIGdldFBsdWdpbk9wdGlvbnMoY2hhcnQ6IGFueSk6IFJlc3BvbnNpdmVEb3duc2FtcGxlUGx1Z2luT3B0aW9ucyB7XHJcbiAgICBjb25zdCBvcHRpb25zOiBSZXNwb25zaXZlRG93bnNhbXBsZVBsdWdpbk9wdGlvbnMgPSBjaGFydC5vcHRpb25zLnJlc3BvbnNpdmVEb3duc2FtcGxlIHx8IHt9O1xyXG4gICAgdXRpbHMuZGVmYXVsdHNEZWVwKG9wdGlvbnMsIHtcclxuICAgICAgZW5hYmxlZDogZmFsc2UsXHJcbiAgICAgIGFnZ3JlZ2F0aW9uQWxnb3JpdGhtOiAnTFRUQicsXHJcbiAgICAgIGRlc2lyZWREYXRhUG9pbnREaXN0YW5jZTogMSxcclxuICAgICAgbWluTnVtUG9pbnRzOiAxMDAsXHJcbiAgICAgIG1heE51bVBvaW50c1RvRHJhdzogMTAwLFxyXG4gICAgICBjdWxsRGF0YTogdHJ1ZVxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKG9wdGlvbnMuZW5hYmxlZCkge1xyXG4gICAgICBjaGFydC5vcHRpb25zLnJlc3BvbnNpdmVEb3duc2FtcGxlID0gb3B0aW9ucztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gb3B0aW9ucztcclxuICB9XHJcblxyXG4gIHN0YXRpYyBoYXNEYXRhQ2hhbmdlZChjaGFydDogQ2hhcnQpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhdXRpbHMuaXNOaWwoXHJcbiAgICAgIHV0aWxzLmZpbmRJbkFycmF5KFxyXG4gICAgICAgIGNoYXJ0LmRhdGEuZGF0YXNldHMgYXMgTWlwTWFwRGF0YVNldHNbXSxcclxuICAgICAgICAoZGF0YXNldCkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHV0aWxzLmlzTmlsKGRhdGFzZXQubWlwTWFwKTtcclxuICAgICAgICB9XHJcbiAgICAgIClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgY3JlYXRlRGF0YU1pcE1hcChjaGFydDogQ2hhcnQsIG9wdGlvbnM6IFJlc3BvbnNpdmVEb3duc2FtcGxlUGx1Z2luT3B0aW9ucyk6IHZvaWQge1xyXG4gICAgY2hhcnQuZGF0YS5kYXRhc2V0cy5mb3JFYWNoKChkYXRhc2V0OiBNaXBNYXBEYXRhU2V0cykgPT4ge1xyXG4gICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgIGNvbnN0IGRhdGEgPSAhdXRpbHMuaXNOaWwoZGF0YXNldC5vcmlnaW5hbERhdGEpID8gZGF0YXNldC5vcmlnaW5hbERhdGEgOiBkYXRhc2V0LmRhdGEgYXMgQ2hhcnRQb2ludFtdO1xyXG5cclxuICAgICAgY29uc3QgbWlwTWFwID0gKG9wdGlvbnMuYWdncmVnYXRpb25BbGdvcml0aG0gPT09ICdMVFRCJylcclxuICAgICAgICA/IG5ldyBMVFRCRGF0YU1pcG1hcChkYXRhLCBvcHRpb25zLm1pbk51bVBvaW50cylcclxuICAgICAgICA6IG5ldyBEYXRhTWlwbWFwKGRhdGEsIG9wdGlvbnMubWluTnVtUG9pbnRzKTtcclxuXHJcbiAgICAgIGRhdGFzZXQub3JpZ2luYWxEYXRhID0gZGF0YTtcclxuICAgICAgZGF0YXNldC5taXBNYXAgPSBtaXBNYXA7XHJcbiAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgZGF0YXNldC5kYXRhID0gbWlwTWFwLmdldE1pcE1hcExldmVsKG1pcE1hcC5nZXROdW1MZXZlbCgpIC0gMSk7IC8vIHNldCBsYXN0IGxldmVsIGZvciBmaXJzdCByZW5kZXIgcGFzc1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgcmVzdG9yZU9yaWdpbmFsRGF0YShjaGFydDogQ2hhcnQpOiBib29sZWFuIHtcclxuICAgIGxldCB1cGRhdGVkID0gZmFsc2U7XHJcblxyXG4gICAgY2hhcnQuZGF0YS5kYXRhc2V0cy5mb3JFYWNoKChkYXRhc2V0OiBNaXBNYXBEYXRhU2V0cykgPT4ge1xyXG4gICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgIGlmICghdXRpbHMuaXNOaWwoZGF0YXNldC5vcmlnaW5hbERhdGEpICYmIGRhdGFzZXQuZGF0YSAhPT0gZGF0YXNldC5vcmlnaW5hbERhdGEpIHtcclxuICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgZGF0YXNldC5kYXRhID0gZGF0YXNldC5vcmlnaW5hbERhdGE7XHJcbiAgICAgICAgdXBkYXRlZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB1cGRhdGVkO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGdldFRhcmdldFJlc29sdXRpb24oY2hhcnQ6IENoYXJ0LCBvcHRpb25zOiBSZXNwb25zaXZlRG93bnNhbXBsZVBsdWdpbk9wdGlvbnMpOiBudW1iZXIge1xyXG4gICAgY29uc3QgeFNjYWxlOiBUaW1lU2NhbGUgPSAoY2hhcnQgYXMgYW55KS5zY2FsZXNbJ3gtYXhpcy0wJ107XHJcblxyXG4gICAgaWYgKHV0aWxzLmlzTmlsKHhTY2FsZSkpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc3RhcnQgPSBtb21lbnQoeFNjYWxlLmdldFZhbHVlRm9yUGl4ZWwoeFNjYWxlLmxlZnQpIGFzIGFueSk7XHJcbiAgICBjb25zdCBlbmQgPSBtb21lbnQoeFNjYWxlLmdldFZhbHVlRm9yUGl4ZWwoeFNjYWxlLmxlZnQgKyAxKSBhcyBhbnkpO1xyXG4gICAgY29uc3QgdGFyZ2V0UmVzb2x1dGlvbiA9IGVuZC5kaWZmKHN0YXJ0KTtcclxuXHJcbiAgICByZXR1cm4gdGFyZ2V0UmVzb2x1dGlvbiAqIG9wdGlvbnMuZGVzaXJlZERhdGFQb2ludERpc3RhbmNlO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIHVwZGF0ZU1pcE1hcChjaGFydDogQ2hhcnQsIG9wdGlvbnM6IFJlc3BvbnNpdmVEb3duc2FtcGxlUGx1Z2luT3B0aW9ucywgcmFuZ2VDaGFuZ2VkOiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgdXBkYXRlZCA9IGZhbHNlO1xyXG5cclxuICAgIGNoYXJ0LmRhdGEuZGF0YXNldHMuZm9yRWFjaCgoZGF0YXNldDogTWlwTWFwRGF0YVNldHMpID0+IHtcclxuICAgICAgY29uc3QgbWlwTWFwID0gZGF0YXNldC5taXBNYXA7XHJcbiAgICAgIGlmICh1dGlscy5pc05pbChtaXBNYXApKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBtaXBNYWxMZXZlbCA9IG1pcE1hcC5nZXRNaXBNYXBJbmRleEZvclJlc29sdXRpb24ob3B0aW9ucy50YXJnZXRSZXNvbHV0aW9uKTtcclxuICAgICAgaWYgKG1pcE1hbExldmVsID09PSBkYXRhc2V0LmN1cnJlbnRNaXBNYXBMZXZlbCAmJiAhcmFuZ2VDaGFuZ2VkKSB7XHJcbiAgICAgICAgLy8gc2tpcCB1cGRhdGUgaWYgbWlwIG1hcCBsZXZlbCBhbmQgZGF0YSByYW5nZSBkaWQgbm90IGNoYW5nZVxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICB1cGRhdGVkID0gdHJ1ZTtcclxuICAgICAgZGF0YXNldC5jdXJyZW50TWlwTWFwTGV2ZWwgPSBtaXBNYWxMZXZlbDtcclxuXHJcbiAgICAgIGxldCBuZXdEYXRhID0gbWlwTWFwLmdldE1pcE1hcExldmVsKG1pcE1hbExldmVsKTtcclxuICAgICAgaWYgKG9wdGlvbnMuY3VsbERhdGEpIHtcclxuICAgICAgICBuZXdEYXRhID0gZGF0YV9jdWxsaW5nLmN1bGxEYXRhKG5ld0RhdGEsIG9wdGlvbnMuc2NhbGVSYW5nZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgZGF0YXNldC5kYXRhID0gbmV3RGF0YTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB1cGRhdGVkO1xyXG4gIH1cclxuXHJcbiAgYmVmb3JlSW5pdChjaGFydDogQ2hhcnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IG9wdGlvbnMgPSBSZXNwb25zaXZlRG93bnNhbXBsZVBsdWdpbi5nZXRQbHVnaW5PcHRpb25zKGNoYXJ0KTtcclxuICAgIGlmICghb3B0aW9ucy5lbmFibGVkKSB7IHJldHVybjsgfVxyXG5cclxuICAgIFJlc3BvbnNpdmVEb3duc2FtcGxlUGx1Z2luLmNyZWF0ZURhdGFNaXBNYXAoY2hhcnQsIG9wdGlvbnMpO1xyXG4gICAgb3B0aW9ucy5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBiZWZvcmVEYXRhc2V0c1VwZGF0ZShjaGFydDogQ2hhcnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IG9wdGlvbnMgPSBSZXNwb25zaXZlRG93bnNhbXBsZVBsdWdpbi5nZXRQbHVnaW5PcHRpb25zKGNoYXJ0KTtcclxuICAgIGlmICghb3B0aW9ucy5lbmFibGVkKSB7XHJcbiAgICAgIC8vIHJlc3RvcmUgb3JpZ2luYWwgZGF0YSBhbmQgcmVtb3ZlIHN0YXRlIGZyb20gb3B0aW9uc1xyXG4gICAgICBvcHRpb25zLm5lZWRzVXBkYXRlID0gUmVzcG9uc2l2ZURvd25zYW1wbGVQbHVnaW4ucmVzdG9yZU9yaWdpbmFsRGF0YShjaGFydCk7XHJcbiAgICAgIGRlbGV0ZSBvcHRpb25zLnRhcmdldFJlc29sdXRpb247XHJcbiAgICAgIGRlbGV0ZSBvcHRpb25zLnNjYWxlUmFuZ2U7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBvbmx5IHVwZGF0ZSBtaXAgbWFwIGlmIGRhdGEgc2V0IHdhcyByZWxvYWRlZCBleHRlcm5hbGx5XHJcbiAgICBpZiAoUmVzcG9uc2l2ZURvd25zYW1wbGVQbHVnaW4uaGFzRGF0YUNoYW5nZWQoY2hhcnQpKSB7XHJcbiAgICAgIFJlc3BvbnNpdmVEb3duc2FtcGxlUGx1Z2luLmNyZWF0ZURhdGFNaXBNYXAoY2hhcnQsIG9wdGlvbnMpO1xyXG4gICAgICBvcHRpb25zLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGJlZm9yZVJlbmRlcihjaGFydDogQ2hhcnQpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IG9wdGlvbnMgPSBSZXNwb25zaXZlRG93bnNhbXBsZVBsdWdpbi5nZXRQbHVnaW5PcHRpb25zKGNoYXJ0KTtcclxuICAgIGlmICghb3B0aW9ucy5lbmFibGVkKSB7XHJcbiAgICAgIC8vIHVwZGF0ZSBjaGFydCBpZiBkYXRhIHdhcyByZXN0b3JlZCBmcm9tIG9yaWdpbmFsIGRhdGFcclxuICAgICAgaWYgKG9wdGlvbnMubmVlZHNVcGRhdGUpIHtcclxuICAgICAgICBvcHRpb25zLm5lZWRzVXBkYXRlID0gZmFsc2U7XHJcbiAgICAgICAgY2hhcnQudXBkYXRlKDApO1xyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRhcmdldFJlc29sdXRpb24gPSBSZXNwb25zaXZlRG93bnNhbXBsZVBsdWdpbi5nZXRUYXJnZXRSZXNvbHV0aW9uKGNoYXJ0LCBvcHRpb25zKTtcclxuICAgIGNvbnN0IHhTY2FsZTogVGltZVNjYWxlID0gKGNoYXJ0IGFzIGFueSkuc2NhbGVzWyd4LWF4aXMtMCddO1xyXG4gICAgY29uc3Qgc2NhbGVSYW5nZSA9IGRhdGFfY3VsbGluZy5nZXRTY2FsZVJhbmdlKHhTY2FsZSk7XHJcbiAgICBjb25zdCByYW5nZUNoYW5nZWQgPSAhZGF0YV9jdWxsaW5nLnJhbmdlSXNFcXVhbChvcHRpb25zLnNjYWxlUmFuZ2UsIHNjYWxlUmFuZ2UpO1xyXG5cclxuICAgIGlmIChvcHRpb25zLm5lZWRzVXBkYXRlIHx8XHJcbiAgICAgIG9wdGlvbnMudGFyZ2V0UmVzb2x1dGlvbiAhPT0gdGFyZ2V0UmVzb2x1dGlvbiB8fFxyXG4gICAgICByYW5nZUNoYW5nZWRcclxuICAgICkge1xyXG4gICAgICBvcHRpb25zLnRhcmdldFJlc29sdXRpb24gPSB0YXJnZXRSZXNvbHV0aW9uO1xyXG4gICAgICBvcHRpb25zLnNjYWxlUmFuZ2UgPSBzY2FsZVJhbmdlO1xyXG4gICAgICBvcHRpb25zLm5lZWRzVXBkYXRlID0gZmFsc2U7XHJcblxyXG4gICAgICBpZiAoUmVzcG9uc2l2ZURvd25zYW1wbGVQbHVnaW4udXBkYXRlTWlwTWFwKGNoYXJ0LCBvcHRpb25zLCByYW5nZUNoYW5nZWQpKSB7XHJcbiAgICAgICAgdXRpbHMuY2hhbmdlUG9pbnRSYWRpdXMoY2hhcnQsIG9wdGlvbnMpO1xyXG4gICAgICAgIC8vIHVwZGF0ZSBjaGFydCBhbmQgY2FuY2VsIGN1cnJlbnQgcmVuZGVyXHJcbiAgICAgICAgY2hhcnQudXBkYXRlKDApO1xyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19
@@ -1,114 +0,0 @@
1
- /**
2
- * This plugin is adapted from: https://github.com/3dcl/chartjs-plugin-responsive-downsample
3
- * for controlling the radius of point.
4
- *
5
- * MIT License
6
- * Copyright (c) 2018 3D Content Logistics
7
- *
8
- * Permission is hereby granted, free of charge, to any person obtaining a copy
9
- * of this software and associated documentation files (the "Software"), to deal
10
- * in the Software without restriction, including without limitation the rights
11
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
- * copies of the Software, and to permit persons to whom the Software is
13
- * furnished to do so, subject to the following conditions:
14
- * The above copyright notice and this permission notice shall be included in all
15
- * copies or substantial portions of the Software.
16
- *
17
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23
- * SOFTWARE.
24
- */
25
- /**
26
- * Check if a value is null or undefined
27
- */
28
- export function isNil(value) {
29
- return (typeof value === 'undefined') || value === null;
30
- }
31
- /**
32
- * Clamp a number to a range
33
- * @param value
34
- * @param min
35
- * @param max
36
- */
37
- export function clamp(value, min, max) {
38
- return Math.min(Math.max(value, min), max);
39
- }
40
- /**
41
- * Recursively assign default values to an object if object is missing the keys.
42
- * @param object The destination object to assign default values to
43
- * @param defaults The default values for the object
44
- * @return The destination object
45
- */
46
- export function defaultsDeep(object, defaults) {
47
- for (const key in defaults) {
48
- if (defaults.hasOwnProperty(key)) {
49
- const value = object[key];
50
- if (typeof value === 'undefined') {
51
- object[key] = defaults[key];
52
- }
53
- else if (value !== null && typeof value === 'object') {
54
- object[key] = defaultsDeep(value, defaults[key]);
55
- }
56
- }
57
- }
58
- return object;
59
- }
60
- /**
61
- * Finds the first element in an array for that the comaperator functions returns true
62
- *
63
- * @export
64
- * @param array An array
65
- * @param compareFunction Comperator function returning true for the element seeked
66
- * @returns The found element or undefined
67
- */
68
- export function findInArray(array, compareFunction) {
69
- if (isNil(array)) {
70
- return undefined;
71
- }
72
- for (let i = 0; i < array.length; i++) {
73
- if (compareFunction(array[i]) === true) {
74
- return array[i];
75
- }
76
- }
77
- return undefined;
78
- }
79
- /**
80
- * Finds the first index in an array for that the comaperator function for an element returns true
81
- *
82
- * @export
83
- * @param array An array of elements
84
- * @param compareFunction Comperator function returning true for the element seeked
85
- * @returns Index of the matched element or -1 if no element was found
86
- */
87
- export function findIndexInArray(array, compareFunction) {
88
- if (isNil(array)) {
89
- return undefined;
90
- }
91
- for (let i = 0; i < array.length; i++) {
92
- if (compareFunction(array[i]) === true) {
93
- return i;
94
- }
95
- }
96
- return -1;
97
- }
98
- /**
99
- * If points number is less than minNumPoints, show radius for all points.
100
- */
101
- export function changePointRadius(chart, options) {
102
- if (chart && chart.data && chart.data.datasets && options) {
103
- let pointRadiusChangeFlag = false;
104
- const maxNumPointsToDraw = options.maxNumPointsToDraw == null ? 100 : options.maxNumPointsToDraw;
105
- for (const dataset of chart.data.datasets) {
106
- if (dataset.data.length < maxNumPointsToDraw) {
107
- pointRadiusChangeFlag = true;
108
- break;
109
- }
110
- }
111
- chart.options.elements.point.radius = pointRadiusChangeFlag ? 2 : 0;
112
- }
113
- }
114
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbmFtZXNlcnZlci1oaXN0b3J5LXZpZXdlci91dGlscy9jaGFydGpzLWRvd25zYW1wbGUvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBRUg7O0dBRUc7QUFDSCxNQUFNLFVBQVUsS0FBSyxDQUFDLEtBQVU7SUFDNUIsT0FBTyxDQUFDLE9BQU8sS0FBSyxLQUFLLFdBQVcsQ0FBQyxJQUFJLEtBQUssS0FBSyxJQUFJLENBQUM7QUFDNUQsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLEtBQUssQ0FBQyxLQUFhLEVBQUUsR0FBVyxFQUFFLEdBQVc7SUFDekQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQy9DLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQUksTUFBUyxFQUFFLFFBQW9CO0lBQzNELEtBQUssTUFBTSxHQUFHLElBQUksUUFBUSxFQUFFO1FBQzFCLElBQUksUUFBUSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNoQyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFMUIsSUFBSSxPQUFPLEtBQUssS0FBSyxXQUFXLEVBQUU7Z0JBQ2hDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDN0I7aUJBQU0sSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtnQkFDdEQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFlBQVksQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDbEQ7U0FDRjtLQUNGO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDbEIsQ0FBQztBQUdEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUFJLEtBQWUsRUFBRSxlQUF3QztJQUNwRixJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUNoQixPQUFPLFNBQVMsQ0FBQztLQUNsQjtJQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ25DLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRTtZQUNwQyxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNuQjtLQUNKO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDckIsQ0FBQztBQUdEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUksS0FBZSxFQUFFLGVBQXdDO0lBQ3pGLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ2hCLE9BQU8sU0FBUyxDQUFDO0tBQ2xCO0lBQ0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDbkMsSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ3BDLE9BQU8sQ0FBQyxDQUFDO1NBQ1o7S0FDSjtJQUNELE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDZCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsS0FBSyxFQUFFLE9BQU87SUFDOUMsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxPQUFPLEVBQUU7UUFDekQsSUFBSSxxQkFBcUIsR0FBRyxLQUFLLENBQUM7UUFDbEMsTUFBTSxrQkFBa0IsR0FBRyxPQUFPLENBQUMsa0JBQWtCLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQztRQUNqRyxLQUFLLE1BQU0sT0FBTyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ3pDLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsa0JBQWtCLEVBQUU7Z0JBQzVDLHFCQUFxQixHQUFHLElBQUksQ0FBQztnQkFDN0IsTUFBTTthQUNQO1NBQ0Y7UUFDRCxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNyRTtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogVGhpcyBwbHVnaW4gaXMgYWRhcHRlZCBmcm9tOiBodHRwczovL2dpdGh1Yi5jb20vM2RjbC9jaGFydGpzLXBsdWdpbi1yZXNwb25zaXZlLWRvd25zYW1wbGVcclxuICogZm9yIGNvbnRyb2xsaW5nIHRoZSByYWRpdXMgb2YgcG9pbnQuXHJcbiAqXHJcbiAqIE1JVCBMaWNlbnNlXHJcbiAqIENvcHlyaWdodCAoYykgMjAxOCAzRCBDb250ZW50IExvZ2lzdGljc1xyXG4gKlxyXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XHJcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcclxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xyXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXHJcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xyXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxyXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcclxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cclxuICpcclxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxyXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcclxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXHJcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcclxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcclxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcclxuICogU09GVFdBUkUuXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIENoZWNrIGlmIGEgdmFsdWUgaXMgbnVsbCBvciB1bmRlZmluZWRcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpc05pbCh2YWx1ZTogYW55KTogdmFsdWUgaXMgbnVsbCB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHx8IHZhbHVlID09PSBudWxsO1xyXG59XHJcblxyXG4vKipcclxuICogQ2xhbXAgYSBudW1iZXIgdG8gYSByYW5nZVxyXG4gKiBAcGFyYW0gdmFsdWVcclxuICogQHBhcmFtIG1pblxyXG4gKiBAcGFyYW0gbWF4XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gY2xhbXAodmFsdWU6IG51bWJlciwgbWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBNYXRoLm1pbihNYXRoLm1heCh2YWx1ZSwgbWluKSwgbWF4KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJlY3Vyc2l2ZWx5IGFzc2lnbiBkZWZhdWx0IHZhbHVlcyB0byBhbiBvYmplY3QgaWYgb2JqZWN0IGlzIG1pc3NpbmcgdGhlIGtleXMuXHJcbiAqIEBwYXJhbSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdCB0byBhc3NpZ24gZGVmYXVsdCB2YWx1ZXMgdG9cclxuICogQHBhcmFtIGRlZmF1bHRzIFRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIG9iamVjdFxyXG4gKiBAcmV0dXJuIFRoZSBkZXN0aW5hdGlvbiBvYmplY3RcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0c0RlZXA8VD4ob2JqZWN0OiBULCBkZWZhdWx0czogUGFydGlhbDxUPik6IFQge1xyXG4gICAgZm9yIChjb25zdCBrZXkgaW4gZGVmYXVsdHMpIHtcclxuICAgICAgaWYgKGRlZmF1bHRzLmhhc093blByb3BlcnR5KGtleSkpIHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IG9iamVjdFtrZXldO1xyXG5cclxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgb2JqZWN0W2tleV0gPSBkZWZhdWx0c1trZXldO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgICAgb2JqZWN0W2tleV0gPSBkZWZhdWx0c0RlZXAodmFsdWUsIGRlZmF1bHRzW2tleV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBvYmplY3Q7XHJcbn1cclxuXHJcblxyXG4vKipcclxuICogRmluZHMgdGhlIGZpcnN0IGVsZW1lbnQgaW4gYW4gYXJyYXkgZm9yIHRoYXQgdGhlIGNvbWFwZXJhdG9yIGZ1bmN0aW9ucyByZXR1cm5zIHRydWVcclxuICpcclxuICogQGV4cG9ydFxyXG4gKiBAcGFyYW0gYXJyYXkgQW4gYXJyYXlcclxuICogQHBhcmFtIGNvbXBhcmVGdW5jdGlvbiBDb21wZXJhdG9yIGZ1bmN0aW9uIHJldHVybmluZyB0cnVlIGZvciB0aGUgZWxlbWVudCBzZWVrZWRcclxuICogQHJldHVybnMgVGhlIGZvdW5kIGVsZW1lbnQgb3IgdW5kZWZpbmVkXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZmluZEluQXJyYXk8VD4oYXJyYXk6IEFycmF5PFQ+LCBjb21wYXJlRnVuY3Rpb246IChlbGVtZW50OiBUKSA9PiBib29sZWFuKTogVCB7XHJcbiAgICBpZiAoaXNOaWwoYXJyYXkpKSB7XHJcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKGNvbXBhcmVGdW5jdGlvbihhcnJheVtpXSkgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGFycmF5W2ldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbn1cclxuXHJcblxyXG4vKipcclxuICogRmluZHMgdGhlIGZpcnN0IGluZGV4IGluIGFuIGFycmF5IGZvciB0aGF0IHRoZSBjb21hcGVyYXRvciBmdW5jdGlvbiBmb3IgYW4gZWxlbWVudCByZXR1cm5zIHRydWVcclxuICpcclxuICogQGV4cG9ydFxyXG4gKiBAcGFyYW0gYXJyYXkgQW4gYXJyYXkgb2YgZWxlbWVudHNcclxuICogQHBhcmFtIGNvbXBhcmVGdW5jdGlvbiBDb21wZXJhdG9yIGZ1bmN0aW9uIHJldHVybmluZyB0cnVlIGZvciB0aGUgZWxlbWVudCBzZWVrZWRcclxuICogQHJldHVybnMgSW5kZXggb2YgdGhlIG1hdGNoZWQgZWxlbWVudCBvciAtMSBpZiBubyBlbGVtZW50IHdhcyBmb3VuZFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRJbmRleEluQXJyYXk8VD4oYXJyYXk6IEFycmF5PFQ+LCBjb21wYXJlRnVuY3Rpb246IChlbGVtZW50OiBUKSA9PiBib29sZWFuKTogbnVtYmVyIHtcclxuICAgIGlmIChpc05pbChhcnJheSkpIHtcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBpZiAoY29tcGFyZUZ1bmN0aW9uKGFycmF5W2ldKSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gaTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gLTE7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBJZiBwb2ludHMgbnVtYmVyIGlzIGxlc3MgdGhhbiBtaW5OdW1Qb2ludHMsIHNob3cgcmFkaXVzIGZvciBhbGwgcG9pbnRzLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGNoYW5nZVBvaW50UmFkaXVzKGNoYXJ0LCBvcHRpb25zKTogdm9pZCB7XHJcbiAgaWYgKGNoYXJ0ICYmIGNoYXJ0LmRhdGEgJiYgY2hhcnQuZGF0YS5kYXRhc2V0cyAmJiBvcHRpb25zKSB7XHJcbiAgICBsZXQgcG9pbnRSYWRpdXNDaGFuZ2VGbGFnID0gZmFsc2U7XHJcbiAgICBjb25zdCBtYXhOdW1Qb2ludHNUb0RyYXcgPSBvcHRpb25zLm1heE51bVBvaW50c1RvRHJhdyA9PSBudWxsID8gMTAwIDogb3B0aW9ucy5tYXhOdW1Qb2ludHNUb0RyYXc7XHJcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgY2hhcnQuZGF0YS5kYXRhc2V0cykge1xyXG4gICAgICBpZiAoZGF0YXNldC5kYXRhLmxlbmd0aCA8IG1heE51bVBvaW50c1RvRHJhdykge1xyXG4gICAgICAgIHBvaW50UmFkaXVzQ2hhbmdlRmxhZyA9IHRydWU7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNoYXJ0Lm9wdGlvbnMuZWxlbWVudHMucG9pbnQucmFkaXVzID0gcG9pbnRSYWRpdXNDaGFuZ2VGbGFnID8gMiA6IDA7XHJcbiAgfVxyXG59XHJcbiJdfQ==