@tetacom/svg-charts 1.1.3 → 1.1.4

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 (54) hide show
  1. package/chart/chart-container/series/area-series/area-series.component.d.ts +31 -0
  2. package/chart/chart-container/series/block-area-series/block-area-series.component.d.ts +31 -0
  3. package/chart/chart-container/series/block-series/block-series.component.d.ts +23 -0
  4. package/chart/chart-container/series/public-api.d.ts +6 -0
  5. package/chart/chart-container/series-host/series-host.component.d.ts +0 -1
  6. package/chart/chart-container/tooltip/tooltip.component.d.ts +4 -3
  7. package/chart/chart.module.d.ts +6 -3
  8. package/chart/default/defaultSeriesTypeMapping.d.ts +3 -0
  9. package/chart/directives/zoomable.directive.d.ts +2 -1
  10. package/chart/model/axis-options.d.ts +1 -0
  11. package/chart/model/base-point.d.ts +3 -1
  12. package/chart/model/enum/fill-type.d.ts +4 -0
  13. package/chart/model/enum/series-type.d.ts +4 -1
  14. package/chart/model/i-broadcast-message.d.ts +1 -0
  15. package/chart/model/i-chart-config.d.ts +3 -2
  16. package/chart/model/public-api.d.ts +1 -0
  17. package/chart/model/series.d.ts +2 -0
  18. package/chart/model/tooltip-options.d.ts +2 -1
  19. package/chart/service/zoom.service.d.ts +1 -1
  20. package/esm2020/chart/chart-container/chart-container.component.mjs +13 -8
  21. package/esm2020/chart/chart-container/series/area-series/area-series.component.mjs +174 -0
  22. package/esm2020/chart/chart-container/series/block-area-series/block-area-series.component.mjs +195 -0
  23. package/esm2020/chart/chart-container/series/block-series/block-series.component.mjs +47 -0
  24. package/esm2020/chart/chart-container/series/line/line-series.component.mjs +8 -5
  25. package/esm2020/chart/chart-container/series/public-api.mjs +7 -0
  26. package/esm2020/chart/chart-container/series/scatter-series/scatter-series.component.mjs +1 -74
  27. package/esm2020/chart/chart-container/series-host/series-host.component.mjs +3 -10
  28. package/esm2020/chart/chart-container/tooltip/tooltip.component.mjs +2 -2
  29. package/esm2020/chart/chart.module.mjs +26 -3
  30. package/esm2020/chart/default/default-axis-config.mjs +2 -1
  31. package/esm2020/chart/default/default-series-config.mjs +4 -1
  32. package/esm2020/chart/default/defaultSeriesTypeMapping.mjs +13 -0
  33. package/esm2020/chart/directives/zoomable.directive.mjs +5 -3
  34. package/esm2020/chart/legend/legend.component.mjs +5 -2
  35. package/esm2020/chart/model/axis-options.mjs +1 -1
  36. package/esm2020/chart/model/base-point.mjs +1 -1
  37. package/esm2020/chart/model/enum/fill-type.mjs +6 -0
  38. package/esm2020/chart/model/enum/series-type.mjs +5 -2
  39. package/esm2020/chart/model/i-broadcast-message.mjs +1 -1
  40. package/esm2020/chart/model/i-chart-config.mjs +1 -1
  41. package/esm2020/chart/model/public-api.mjs +2 -1
  42. package/esm2020/chart/model/series.mjs +1 -1
  43. package/esm2020/chart/model/tooltip-options.mjs +1 -1
  44. package/esm2020/chart/service/brush.service.mjs +18 -7
  45. package/esm2020/chart/service/chart.service.mjs +4 -2
  46. package/esm2020/chart/service/scale.service.mjs +8 -2
  47. package/esm2020/chart/service/zoom.service.mjs +47 -24
  48. package/esm2020/public-api.mjs +2 -2
  49. package/fesm2015/tetacom-svg-charts.mjs +537 -134
  50. package/fesm2015/tetacom-svg-charts.mjs.map +1 -1
  51. package/fesm2020/tetacom-svg-charts.mjs +524 -128
  52. package/fesm2020/tetacom-svg-charts.mjs.map +1 -1
  53. package/package.json +1 -1
  54. package/public-api.d.ts +1 -0
@@ -0,0 +1,174 @@
1
+ import { Component, } from '@angular/core';
2
+ import { SeriesBaseComponent } from '../../../base/series-base.component';
3
+ import { combineLatest, map, tap, withLatestFrom } from 'rxjs';
4
+ import * as d3 from 'd3';
5
+ import { DragPointType } from '../../../model/enum/drag-point-type';
6
+ import { TooltipTracking } from '../../../model/enum/tooltip-tracking';
7
+ import { FillType } from '../../../model/enum/fill-type';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "../../../service/chart.service";
10
+ import * as i2 from "../../../service/scale.service";
11
+ import * as i3 from "../../../service/zoom.service";
12
+ import * as i4 from "@angular/common";
13
+ export class AreaSeriesComponent extends SeriesBaseComponent {
14
+ constructor(svc, cdr, scaleService, zoomService, element) {
15
+ super(svc, cdr, scaleService, zoomService, element);
16
+ this.svc = svc;
17
+ this.cdr = cdr;
18
+ this.scaleService = scaleService;
19
+ this.zoomService = zoomService;
20
+ this.element = element;
21
+ this.fillType = FillType;
22
+ this.id = (Date.now() + Math.random()).toString(36);
23
+ }
24
+ ngOnInit() {
25
+ this.transform = this.svc.pointerMove.pipe(withLatestFrom(this.scaleService.xScaleMap, this.scaleService.yScaleMap), map((data) => {
26
+ const [event, x, y] = data;
27
+ return this.getTransform(event, x, y);
28
+ }), tap(() => this.cdr.detectChanges()));
29
+ this.path = combineLatest([
30
+ this.scaleService.xScaleMap,
31
+ this.scaleService.yScaleMap,
32
+ ]).pipe(withLatestFrom(this.scaleService.xAxisMap, this.scaleService.yAxisMap), map((data) => {
33
+ const [[x, y], xAxisMap, yAxisMap] = data;
34
+ this.x = x.get(this.series.xAxisIndex);
35
+ this.y = y.get(this.series.yAxisIndex);
36
+ const yAxis = yAxisMap.get(this.series.yAxisIndex);
37
+ const xAxis = xAxisMap.get(this.series.xAxisIndex);
38
+ const domain = this.config.inverted
39
+ ? this.x.domain()
40
+ : this.y.domain();
41
+ const area = d3
42
+ .area()
43
+ .defined((point) => point.x !== null &&
44
+ point.y !== null &&
45
+ !isNaN(point.x) &&
46
+ !isNaN(point.y));
47
+ if (this.config.inverted) {
48
+ area
49
+ .y((point) => this.y(point.y))
50
+ .x0((_) => this.x(xAxis.options?.inverted ? domain[1] : domain[0]))
51
+ .x1((point) => this.x(point.x));
52
+ }
53
+ else {
54
+ area
55
+ .x((point) => this.x(point.x))
56
+ .y0((_) => this.y(yAxis.options?.inverted ? domain[0] : domain[1]))
57
+ .y1((point) => this.y(point.y));
58
+ }
59
+ return area(this.series.data);
60
+ }));
61
+ }
62
+ ngAfterViewInit() {
63
+ const drag = (node, event, d) => {
64
+ if (d.marker?.dragType === DragPointType.x ||
65
+ d.marker?.dragType === DragPointType.xy) {
66
+ d.x = this.x.invert(event.x);
67
+ }
68
+ if (d.marker?.dragType === DragPointType.y ||
69
+ d.marker?.dragType === DragPointType.xy) {
70
+ d.y = this.y.invert(event.y);
71
+ }
72
+ this.svc.emitPoint({
73
+ target: {
74
+ series: this.series,
75
+ point: d,
76
+ },
77
+ event,
78
+ });
79
+ this.cdr.detectChanges();
80
+ };
81
+ const dragMarkers = d3
82
+ .drag()
83
+ .subject(function (event, d) {
84
+ const node = d3.select(this);
85
+ return { x: node.attr('cx'), y: node.attr('cy') };
86
+ })
87
+ .on('start drag end', function (event, d) {
88
+ const node = d3.select(this);
89
+ drag(node, event, d);
90
+ });
91
+ const draggableMarkers = this.series.data?.filter((_) => _?.marker && _?.marker?.draggable);
92
+ const element = d3
93
+ .select(this.element.nativeElement)
94
+ .selectAll('.draggable-marker')
95
+ .data(draggableMarkers);
96
+ element.call(dragMarkers);
97
+ this.svgElement = d3
98
+ .select(this.element.nativeElement)
99
+ .select('.line')
100
+ .node();
101
+ }
102
+ getMarkers() {
103
+ return this.series.data?.filter((_) => _?.marker);
104
+ }
105
+ getTransform(event, x, y) {
106
+ const mouse = [event?.offsetX, event?.offsetY];
107
+ const foundX = x.get(this.series.xAxisIndex);
108
+ const foundY = y.get(this.series.yAxisIndex);
109
+ const tooltipTracking = this.config?.tooltip?.tracking;
110
+ const lineIntersection = (p0_x, p0_y, p1_x, p1_y, p2_x, p2_y, p3_x, p3_y) => {
111
+ const rV = {};
112
+ let s1_x, s1_y, s2_x, s2_y;
113
+ s1_x = p1_x - p0_x;
114
+ s1_y = p1_y - p0_y;
115
+ s2_x = p3_x - p2_x;
116
+ s2_y = p3_y - p2_y;
117
+ let s, t;
118
+ s =
119
+ (-s1_y * (p0_x - p2_x) + s1_x * (p0_y - p2_y)) /
120
+ (-s2_x * s1_y + s1_x * s2_y);
121
+ t =
122
+ (s2_x * (p0_y - p2_y) - s2_y * (p0_x - p2_x)) /
123
+ (-s2_x * s1_y + s1_x * s2_y);
124
+ if (s >= 0 && s <= 1 && t >= 0 && t <= 1) {
125
+ // Collision detected
126
+ rV.x = p0_x + t * s1_x;
127
+ rV.y = p0_y + t * s1_y;
128
+ }
129
+ return rV;
130
+ };
131
+ if (tooltipTracking === TooltipTracking.x) {
132
+ const bisect = d3.bisector((_) => _.x).right;
133
+ const pointer = mouse[0];
134
+ const x0 = foundX.invert(pointer);
135
+ const filtered = this.series.data.filter((_) => _.y !== null && _.x !== null);
136
+ const rightId = bisect(filtered, x0);
137
+ const range = foundY.range();
138
+ const intersect = lineIntersection(pointer, range[0], pointer, range[1], foundX(filtered[rightId - 1]?.x), foundY(filtered[rightId - 1]?.y), foundX(filtered[rightId]?.x), foundY(filtered[rightId]?.y));
139
+ this.svc.setTooltip({
140
+ point: { x: foundX.invert(intersect.x), y: foundY.invert(intersect.y) },
141
+ series: this.series,
142
+ });
143
+ return {
144
+ x: intersect.x,
145
+ y: intersect.y,
146
+ };
147
+ }
148
+ if (tooltipTracking === TooltipTracking.y) {
149
+ const bisect = d3.bisector((_) => _.y).right;
150
+ const y0 = foundY.invert(mouse[1]);
151
+ const rightId = bisect(this.series.data, y0);
152
+ const range = foundX.range();
153
+ const intersect = lineIntersection(range[0], mouse[1], range[1], mouse[1], foundX(this.series.data[rightId - 1]?.x), foundY(this.series.data[rightId - 1]?.y), foundX(this.series.data[rightId]?.x), foundY(this.series.data[rightId]?.y));
154
+ this.svc.setTooltip({
155
+ point: {
156
+ x: foundX.invert(intersect.x),
157
+ y: foundY.invert(intersect.y),
158
+ },
159
+ series: this.series,
160
+ });
161
+ return {
162
+ x: intersect.x,
163
+ y: intersect.y,
164
+ };
165
+ }
166
+ }
167
+ }
168
+ AreaSeriesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.1", ngImport: i0, type: AreaSeriesComponent, deps: [{ token: i1.ChartService }, { token: i0.ChangeDetectorRef }, { token: i2.ScaleService }, { token: i3.ZoomService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
169
+ AreaSeriesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.1", type: AreaSeriesComponent, selector: "svg:svg[teta-area-series]", usesInheritance: true, ngImport: i0, template: "<svg:defs *ngIf=\"series?.fillType === fillType.gradient\">\n <svg:linearGradient [id]=\"'gradient-fill-' + id\" gradientUnits=\"userSpaceOnUse\"\n x1=\"0%\"\n [attr.y1]=\"config?.inverted ? '0%' : '100%'\"\n [attr.x2]=\"config?.inverted ? '100%' : '0%'\"\n y2=\"0%\">\n <svg:stop offset=\"0%\" [attr.stop-color]=\"series.color\" stop-opacity=\"0\"></svg:stop>\n <svg:stop offset=\"5%\" [attr.stop-color]=\"series.color\" stop-opacity=\"0.1\"></svg:stop>\n <svg:stop offset=\"20%\" [attr.stop-color]=\"series.color\" stop-opacity=\"0.2\"></svg:stop>\n <svg:stop offset=\"100%\" [attr.stop-color]=\"series.color\" stop-opacity=\"0.5\"></svg:stop>\n </svg:linearGradient>\n</svg:defs>\n\n<svg:path\n class=\"area\"\n [attr.d]=\"path | async\"\n [attr.stroke]=\"series.color\"\n [attr.stroke-dasharray]=\"series.style?.strokeDasharray\"\n [attr.stroke-width]=\"series.style?.strokeWidth\"\n [attr.stroke-width]=\"series.style?.strokeWidth\"\n [attr.fill-opacity]=\"series.style?.fillOpacity\"\n [attr.fill]=\"series.fillType === fillType.gradient ? 'url(#gradient-fill-'+id+')' : series.color\">\n</svg:path>\n\n<ng-container *ngIf=\"transform | async as t\">\n <svg:circle\n *ngIf=\"t.x !== undefined && t.y!== undefined\"\n r=\"3\"\n [attr.fill]=\"series.color\"\n [attr.transform]=\"'translate('+ t.x +', '+ t.y +')'\"\n >\n </svg:circle>\n</ng-container>\n\n<ng-container *ngIf=\"getMarkers() as markers\">\n <svg:circle\n class=\"marker\"\n *ngFor=\"let point of markers\"\n [class.draggable-marker]=\"point?.marker?.draggable\"\n [attr.r]=\"point.marker.style?.radius ?? 5\"\n [attr.fill]=\"point.marker.style?.fill ?? 'transparent'\"\n [attr.stroke]=\"point.marker.style?.stroke ?? 'none'\"\n [attr.stroke-width]=\"point.marker.style?.strokeWidth\"\n [attr.stroke-dasharray]=\"point.marker.style?.strokeDasharray\"\n [attr.cx]=\"x(point.x)\"\n [attr.cy]=\"y(point.y)\"\n >\n </svg:circle>\n</ng-container>\n\n\n\n", styles: [""], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "async": i4.AsyncPipe } });
170
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.1", ngImport: i0, type: AreaSeriesComponent, decorators: [{
171
+ type: Component,
172
+ args: [{ selector: 'svg:svg[teta-area-series]', template: "<svg:defs *ngIf=\"series?.fillType === fillType.gradient\">\n <svg:linearGradient [id]=\"'gradient-fill-' + id\" gradientUnits=\"userSpaceOnUse\"\n x1=\"0%\"\n [attr.y1]=\"config?.inverted ? '0%' : '100%'\"\n [attr.x2]=\"config?.inverted ? '100%' : '0%'\"\n y2=\"0%\">\n <svg:stop offset=\"0%\" [attr.stop-color]=\"series.color\" stop-opacity=\"0\"></svg:stop>\n <svg:stop offset=\"5%\" [attr.stop-color]=\"series.color\" stop-opacity=\"0.1\"></svg:stop>\n <svg:stop offset=\"20%\" [attr.stop-color]=\"series.color\" stop-opacity=\"0.2\"></svg:stop>\n <svg:stop offset=\"100%\" [attr.stop-color]=\"series.color\" stop-opacity=\"0.5\"></svg:stop>\n </svg:linearGradient>\n</svg:defs>\n\n<svg:path\n class=\"area\"\n [attr.d]=\"path | async\"\n [attr.stroke]=\"series.color\"\n [attr.stroke-dasharray]=\"series.style?.strokeDasharray\"\n [attr.stroke-width]=\"series.style?.strokeWidth\"\n [attr.stroke-width]=\"series.style?.strokeWidth\"\n [attr.fill-opacity]=\"series.style?.fillOpacity\"\n [attr.fill]=\"series.fillType === fillType.gradient ? 'url(#gradient-fill-'+id+')' : series.color\">\n</svg:path>\n\n<ng-container *ngIf=\"transform | async as t\">\n <svg:circle\n *ngIf=\"t.x !== undefined && t.y!== undefined\"\n r=\"3\"\n [attr.fill]=\"series.color\"\n [attr.transform]=\"'translate('+ t.x +', '+ t.y +')'\"\n >\n </svg:circle>\n</ng-container>\n\n<ng-container *ngIf=\"getMarkers() as markers\">\n <svg:circle\n class=\"marker\"\n *ngFor=\"let point of markers\"\n [class.draggable-marker]=\"point?.marker?.draggable\"\n [attr.r]=\"point.marker.style?.radius ?? 5\"\n [attr.fill]=\"point.marker.style?.fill ?? 'transparent'\"\n [attr.stroke]=\"point.marker.style?.stroke ?? 'none'\"\n [attr.stroke-width]=\"point.marker.style?.strokeWidth\"\n [attr.stroke-dasharray]=\"point.marker.style?.strokeDasharray\"\n [attr.cx]=\"x(point.x)\"\n [attr.cy]=\"y(point.y)\"\n >\n </svg:circle>\n</ng-container>\n\n\n\n", styles: [""] }]
173
+ }], ctorParameters: function () { return [{ type: i1.ChartService }, { type: i0.ChangeDetectorRef }, { type: i2.ScaleService }, { type: i3.ZoomService }, { type: i0.ElementRef }]; } });
174
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJlYS1zZXJpZXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2NoYXJ0L2NoYXJ0LWNvbnRhaW5lci9zZXJpZXMvYXJlYS1zZXJpZXMvYXJlYS1zZXJpZXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2NoYXJ0L2NoYXJ0LWNvbnRhaW5lci9zZXJpZXMvYXJlYS1zZXJpZXMvYXJlYS1zZXJpZXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsR0FHVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUsxRSxPQUFPLEVBQUUsYUFBYSxFQUFFLEdBQUcsRUFBYyxHQUFHLEVBQUUsY0FBYyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNFLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3pCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDdkUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLCtCQUErQixDQUFDOzs7Ozs7QUFRekQsTUFBTSxPQUFPLG1CQUNYLFNBQVEsbUJBQXNCO0lBYTlCLFlBQ3FCLEdBQWlCLEVBQ2pCLEdBQXNCLEVBQ3RCLFlBQTBCLEVBQzFCLFdBQXdCLEVBQ3hCLE9BQW1CO1FBRXRDLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFOakMsUUFBRyxHQUFILEdBQUcsQ0FBYztRQUNqQixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUN0QixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixZQUFPLEdBQVAs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RUFBRSxDQUFDLENBQUMsRUFDcEMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUNyQyxDQUFDO1lBRUYsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUM7Z0JBQ2xCLEtBQUssRUFBRTtvQkFDTCxDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO29CQUM3QixDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO2lCQUM5QjtnQkFDRCxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07YUFDcEIsQ0FBQyxDQUFDO1lBRUgsT0FBTztnQkFDTCxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7Z0JBQ2QsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO2FBQ2YsQ0FBQztTQUNIO0lBQ0gsQ0FBQzs7Z0hBL1FVLG1CQUFtQjtvR0FBbkIsbUJBQW1CLHdGQ3ZCaEMseWhFQW9EQTsyRkQ3QmEsbUJBQW1CO2tCQUwvQixTQUFTOytCQUNFLDJCQUEyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIE9uSW5pdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTZXJpZXNCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vYmFzZS9zZXJpZXMtYmFzZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQmFzZVBvaW50IH0gZnJvbSAnLi4vLi4vLi4vbW9kZWwvYmFzZS1wb2ludCc7XG5pbXBvcnQgeyBDaGFydFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlL2NoYXJ0LnNlcnZpY2UnO1xuaW1wb3J0IHsgU2NhbGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZS9zY2FsZS5zZXJ2aWNlJztcbmltcG9ydCB7IFpvb21TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZS96b29tLnNlcnZpY2UnO1xuaW1wb3J0IHsgY29tYmluZUxhdGVzdCwgbWFwLCBPYnNlcnZhYmxlLCB0YXAsIHdpdGhMYXRlc3RGcm9tIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgKiBhcyBkMyBmcm9tICdkMyc7XG5pbXBvcnQgeyBEcmFnUG9pbnRUeXBlIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWwvZW51bS9kcmFnLXBvaW50LXR5cGUnO1xuaW1wb3J0IHsgVG9vbHRpcFRyYWNraW5nIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWwvZW51bS90b29sdGlwLXRyYWNraW5nJztcbmltcG9ydCB7IEZpbGxUeXBlIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWwvZW51bS9maWxsLXR5cGUnO1xuaW1wb3J0IHsgQXhpcyB9IGZyb20gJy4uLy4uLy4uL2NvcmUvYXhpcy9heGlzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc3ZnOnN2Z1t0ZXRhLWFyZWEtc2VyaWVzXScsXG4gIHRlbXBsYXRlVXJsOiAnLi9hcmVhLXNlcmllcy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2FyZWEtc2VyaWVzLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIEFyZWFTZXJpZXNDb21wb25lbnQ8VCBleHRlbmRzIEJhc2VQb2ludD5cbiAgZXh0ZW5kcyBTZXJpZXNCYXNlQ29tcG9uZW50PFQ+XG4gIGltcGxlbWVudHMgT25Jbml0XG57XG4gIHRyYW5zZm9ybTogT2JzZXJ2YWJsZTxQaWNrPEJhc2VQb2ludCwgJ3gnIHwgJ3knPj47XG4gIGRpc3BsYXk6IE9ic2VydmFibGU8bnVtYmVyPjtcbiAgcGF0aDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICBzdmdFbGVtZW50OiBTVkdHZW9tZXRyeUVsZW1lbnQ7XG4gIHg6IGFueTtcbiAgeTogYW55O1xuICBpZDogc3RyaW5nO1xuXG4gIGZpbGxUeXBlID0gRmlsbFR5cGU7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIHN2YzogQ2hhcnRTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBzY2FsZVNlcnZpY2U6IFNjYWxlU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgem9vbVNlcnZpY2U6IFpvb21TZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBlbGVtZW50OiBFbGVtZW50UmVmXG4gICkge1xuICAgIHN1cGVyKHN2YywgY2RyLCBzY2FsZVNlcnZpY2UsIHpvb21TZXJ2aWNlLCBlbGVtZW50KTtcblxuICAgIHRoaXMuaWQgPSAoRGF0ZS5ub3coKSArIE1hdGgucmFuZG9tKCkpLnRvU3RyaW5nKDM2KTtcbiAgfVxuXG4gIG92ZXJyaWRlIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMudHJhbnNmb3JtID0gdGhpcy5zdmMucG9pbnRlck1vdmUucGlwZShcbiAgICAgIHdpdGhMYXRlc3RGcm9tKHRoaXMuc2NhbGVTZXJ2aWNlLnhTY2FsZU1hcCwgdGhpcy5zY2FsZVNlcnZpY2UueVNjYWxlTWFwKSxcbiAgICAgIG1hcCgoZGF0YTogW1BvaW50ZXJFdmVudCwgTWFwPG51bWJlciwgYW55PiwgTWFwPG51bWJlciwgYW55Pl0pID0+IHtcbiAgICAgICAgY29uc3QgW2V2ZW50LCB4LCB5XSA9IGRhdGE7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VHJhbnNmb3JtKGV2ZW50LCB4LCB5KTtcbiAgICAgIH0pLFxuICAgICAgdGFwKCgpID0+IHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKSlcbiAgICApO1xuXG4gICAgdGhpcy5wYXRoID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLnNjYWxlU2VydmljZS54U2NhbGVNYXAsXG4gICAgICB0aGlzLnNjYWxlU2VydmljZS55U2NhbGVNYXAsXG4gICAgXSkucGlwZShcbiAgICAgIHdpdGhMYXRlc3RGcm9tKHRoaXMuc2NhbGVTZXJ2aWNlLnhBeGlzTWFwLCB0aGlzLnNjYWxlU2VydmljZS55QXhpc01hcCksXG4gICAgICBtYXAoXG4gICAgICAgIChcbiAgICAgICAgICBkYXRhOiBbXG4gICAgICAgICAgICBbTWFwPG51bWJlciwgYW55PiwgTWFwPG51bWJlciwgYW55Pl0sXG4gICAgICAgICAgICBNYXA8bnVtYmVyLCBBeGlzPixcbiAgICAgICAgICAgIE1hcDxudW1iZXIsIEF4aXM+XG4gICAgICAgICAgXVxuICAgICAgICApID0+IHtcbiAgICAgICAgICBjb25zdCBbW3gsIHldLCB4QXhpc01hcCwgeUF4aXNNYXBdID0gZGF0YTtcblxuICAgICAgICAgIHRoaXMueCA9IHguZ2V0KHRoaXMuc2VyaWVzLnhBeGlzSW5kZXgpO1xuICAgICAgICAgIHRoaXMueSA9IHkuZ2V0KHRoaXMuc2VyaWVzLnlBeGlzSW5kZXgpO1xuXG4gICAgICAgICAgY29uc3QgeUF4aXMgPSB5QXhpc01hcC5nZXQodGhpcy5zZXJpZXMueUF4aXNJbmRleCk7XG4gICAgICAgICAgY29uc3QgeEF4aXMgPSB4QXhpc01hcC5nZXQodGhpcy5zZXJpZXMueEF4aXNJbmRleCk7XG5cbiAgICAgICAgICBjb25zdCBkb21haW4gPSB0aGlzLmNvbmZpZy5pbnZlcnRlZFxuICAgICAgICAgICAgPyB0aGlzLnguZG9tYWluKClcbiAgICAgICAgICAgIDogdGhpcy55LmRvbWFpbigpO1xuXG4gICAgICAgICAgY29uc3QgYXJlYSA9IGQzXG4gICAgICAgICAgICAuYXJlYTxCYXNlUG9pbnQ+KClcbiAgICAgICAgICAgIC5kZWZpbmVkKFxuICAgICAgICAgICAgICAocG9pbnQpID0+XG4gICAgICAgICAgICAgICAgcG9pbnQueCAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgIHBvaW50LnkgIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgICAhaXNOYU4ocG9pbnQueCkgJiZcbiAgICAgICAgICAgICAgICAhaXNOYU4ocG9pbnQueSlcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAodGhpcy5jb25maWcuaW52ZXJ0ZWQpIHtcbiAgICAgICAgICAgIGFyZWFcbiAgICAgICAgICAgICAgLnkoKHBvaW50KSA9PiB0aGlzLnkocG9pbnQueSkpXG4gICAgICAgICAgICAgIC54MCgoXykgPT5cbiAgICAgICAgICAgICAgICB0aGlzLngoeEF4aXMub3B0aW9ucz8uaW52ZXJ0ZWQgPyBkb21haW5bMV0gOiBkb21haW5bMF0pXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgLngxKChwb2ludCkgPT4gdGhpcy54KHBvaW50LngpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXJlYVxuICAgICAgICAgICAgICAueCgocG9pbnQpID0+IHRoaXMueChwb2ludC54KSlcbiAgICAgICAgICAgICAgLnkwKChfKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMueSh5QXhpcy5vcHRpb25zPy5pbnZlcnRlZCA/IGRvbWFpblswXSA6IGRvbWFpblsxXSlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAueTEoKHBvaW50KSA9PiB0aGlzLnkocG9pbnQueSkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBhcmVhKHRoaXMuc2VyaWVzLmRhdGEpO1xuICAgICAgICB9XG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBjb25zdCBkcmFnID0gKG5vZGUsIGV2ZW50OiBkMy5EM0RyYWdFdmVudDxhbnksIGFueSwgYW55PiwgZDogQmFzZVBvaW50KSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIGQubWFya2VyPy5kcmFnVHlwZSA9PT0gRHJhZ1BvaW50VHlwZS54IHx8XG4gICAgICAgIGQubWFya2VyPy5kcmFnVHlwZSA9PT0gRHJhZ1BvaW50VHlwZS54eVxuICAgICAgKSB7XG4gICAgICAgIGQueCA9IHRoaXMueC5pbnZlcnQoZXZlbnQueCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgZC5tYXJrZXI/LmRyYWdUeXBlID09PSBEcmFnUG9pbnRUeXBlLnkgfHxcbiAgICAgICAgZC5tYXJrZXI/LmRyYWdUeXBlID09PSBEcmFnUG9pbnRUeXBlLnh5XG4gICAgICApIHtcbiAgICAgICAgZC55ID0gdGhpcy55LmludmVydChldmVudC55KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zdmMuZW1pdFBvaW50KHtcbiAgICAgICAgdGFyZ2V0OiB7XG4gICAgICAgICAgc2VyaWVzOiB0aGlzLnNlcmllcyxcbiAgICAgICAgICBwb2ludDogZCxcbiAgICAgICAgfSxcbiAgICAgICAgZXZlbnQsXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH07XG5cbiAgICBjb25zdCBkcmFnTWFya2VycyA9IGQzXG4gICAgICAuZHJhZygpXG4gICAgICAuc3ViamVjdChmdW5jdGlvbiAoZXZlbnQsIGQ6IEJhc2VQb2ludCkge1xuICAgICAgICBjb25zdCBub2RlID0gZDMuc2VsZWN0KHRoaXMpO1xuICAgICAgICByZXR1cm4geyB4OiBub2RlLmF0dHIoJ2N4JyksIHk6IG5vZGUuYXR0cignY3knKSB9O1xuICAgICAgfSlcbiAgICAgIC5vbihcbiAgICAgICAgJ3N0YXJ0IGRyYWcgZW5kJyxcbiAgICAgICAgZnVuY3Rpb24gKGV2ZW50OiBkMy5EM0RyYWdFdmVudDxhbnksIGFueSwgYW55PiwgZDogQmFzZVBvaW50KSB7XG4gICAgICAgICAgY29uc3Qgbm9kZSA9IGQzLnNlbGVjdCh0aGlzKTtcblxuICAgICAgICAgIGRyYWcobm9kZSwgZXZlbnQsIGQpO1xuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgY29uc3QgZHJhZ2dhYmxlTWFya2VycyA9IHRoaXMuc2VyaWVzLmRhdGE/LmZpbHRlcihcbiAgICAgIChfKSA9PiBfPy5tYXJrZXIgJiYgXz8ubWFya2VyPy5kcmFnZ2FibGVcbiAgICApO1xuXG4gICAgY29uc3QgZWxlbWVudCA9IGQzXG4gICAgICAuc2VsZWN0KHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50KVxuICAgICAgLnNlbGVjdEFsbCgnLmRyYWdnYWJsZS1tYXJrZXInKVxuICAgICAgLmRhdGEoZHJhZ2dhYmxlTWFya2Vycyk7XG5cbiAgICBlbGVtZW50LmNhbGwoZHJhZ01hcmtlcnMgYXMgYW55KTtcblxuICAgIHRoaXMuc3ZnRWxlbWVudCA9IGQzXG4gICAgICAuc2VsZWN0KHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50KVxuICAgICAgLnNlbGVjdCgnLmxpbmUnKVxuICAgICAgLm5vZGUoKSBhcyBTVkdHZW9tZXRyeUVsZW1lbnQ7XG4gIH1cblxuICBnZXRNYXJrZXJzKCkge1xuICAgIHJldHVybiB0aGlzLnNlcmllcy5kYXRhPy5maWx0ZXIoKF8pID0+IF8/Lm1hcmtlcik7XG4gIH1cblxuICBnZXRUcmFuc2Zvcm0oXG4gICAgZXZlbnQ6IGFueSxcbiAgICB4OiBNYXA8bnVtYmVyLCBhbnk+LFxuICAgIHk6IE1hcDxudW1iZXIsIGFueT5cbiAgKTogUGljazxCYXNlUG9pbnQsICd4JyB8ICd5Jz4ge1xuICAgIGNvbnN0IG1vdXNlID0gW2V2ZW50Py5vZmZzZXRYLCBldmVudD8ub2Zmc2V0WV07XG5cbiAgICBjb25zdCBmb3VuZFggPSB4LmdldCh0aGlzLnNlcmllcy54QXhpc0luZGV4KTtcbiAgICBjb25zdCBmb3VuZFkgPSB5LmdldCh0aGlzLnNlcmllcy55QXhpc0luZGV4KTtcblxuICAgIGNvbnN0IHRvb2x0aXBUcmFja2luZyA9IHRoaXMuY29uZmlnPy50b29sdGlwPy50cmFja2luZztcblxuICAgIGNvbnN0IGxpbmVJbnRlcnNlY3Rpb24gPSAoXG4gICAgICBwMF94LFxuICAgICAgcDBfeSxcbiAgICAgIHAxX3gsXG4gICAgICBwMV95LFxuICAgICAgcDJfeCxcbiAgICAgIHAyX3ksXG4gICAgICBwM194LFxuICAgICAgcDNfeVxuICAgICkgPT4ge1xuICAgICAgY29uc3QgclYgPSB7fSBhcyBhbnk7XG4gICAgICBsZXQgczFfeCwgczFfeSwgczJfeCwgczJfeTtcbiAgICAgIHMxX3ggPSBwMV94IC0gcDBfeDtcbiAgICAgIHMxX3kgPSBwMV95IC0gcDBfeTtcbiAgICAgIHMyX3ggPSBwM194IC0gcDJfeDtcbiAgICAgIHMyX3kgPSBwM195IC0gcDJfeTtcblxuICAgICAgbGV0IHMsIHQ7XG4gICAgICBzID1cbiAgICAgICAgKC1zMV95ICogKHAwX3ggLSBwMl94KSArIHMxX3ggKiAocDBfeSAtIHAyX3kpKSAvXG4gICAgICAgICgtczJfeCAqIHMxX3kgKyBzMV94ICogczJfeSk7XG4gICAgICB0ID1cbiAgICAgICAgKHMyX3ggKiAocDBfeSAtIHAyX3kpIC0gczJfeSAqIChwMF94IC0gcDJfeCkpIC9cbiAgICAgICAgKC1zMl94ICogczFfeSArIHMxX3ggKiBzMl95KTtcblxuICAgICAgaWYgKHMgPj0gMCAmJiBzIDw9IDEgJiYgdCA+PSAwICYmIHQgPD0gMSkge1xuICAgICAgICAvLyBDb2xsaXNpb24gZGV0ZWN0ZWRcbiAgICAgICAgclYueCA9IHAwX3ggKyB0ICogczFfeDtcbiAgICAgICAgclYueSA9IHAwX3kgKyB0ICogczFfeTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJWO1xuICAgIH07XG5cbiAgICBpZiAodG9vbHRpcFRyYWNraW5nID09PSBUb29sdGlwVHJhY2tpbmcueCkge1xuICAgICAgY29uc3QgYmlzZWN0ID0gZDMuYmlzZWN0b3IoKF86IEJhc2VQb2ludCkgPT4gXy54KS5yaWdodDtcbiAgICAgIGNvbnN0IHBvaW50ZXIgPSBtb3VzZVswXTtcblxuICAgICAgY29uc3QgeDAgPSBmb3VuZFguaW52ZXJ0KHBvaW50ZXIpO1xuXG4gICAgICBjb25zdCBmaWx0ZXJlZCA9IHRoaXMuc2VyaWVzLmRhdGEuZmlsdGVyKFxuICAgICAgICAoXykgPT4gXy55ICE9PSBudWxsICYmIF8ueCAhPT0gbnVsbFxuICAgICAgKTtcblxuICAgICAgY29uc3QgcmlnaHRJZCA9IGJpc2VjdChmaWx0ZXJlZCwgeDApO1xuXG4gICAgICBjb25zdCByYW5nZSA9IGZvdW5kWS5yYW5nZSgpO1xuXG4gICAgICBjb25zdCBpbnRlcnNlY3QgPSBsaW5lSW50ZXJzZWN0aW9uKFxuICAgICAgICBwb2ludGVyLFxuICAgICAgICByYW5nZVswXSxcbiAgICAgICAgcG9pbnRlcixcbiAgICAgICAgcmFuZ2VbMV0sXG4gICAgICAgIGZvdW5kWChmaWx0ZXJlZFtyaWdodElkIC0gMV0/LngpLFxuICAgICAgICBmb3VuZFkoZmlsdGVyZWRbcmlnaHRJZCAtIDFdPy55KSxcbiAgICAgICAgZm91bmRYKGZpbHRlcmVkW3JpZ2h0SWRdPy54KSxcbiAgICAgICAgZm91bmRZKGZpbHRlcmVkW3JpZ2h0SWRdPy55KVxuICAgICAgKTtcblxuICAgICAgdGhpcy5zdmMuc2V0VG9vbHRpcCh7XG4gICAgICAgIHBvaW50OiB7IHg6IGZvdW5kWC5pbnZlcnQoaW50ZXJzZWN0LngpLCB5OiBmb3VuZFkuaW52ZXJ0KGludGVyc2VjdC55KSB9LFxuICAgICAgICBzZXJpZXM6IHRoaXMuc2VyaWVzLFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IGludGVyc2VjdC54LFxuICAgICAgICB5OiBpbnRlcnNlY3QueSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHRvb2x0aXBUcmFja2luZyA9PT0gVG9vbHRpcFRyYWNraW5nLnkpIHtcbiAgICAgIGNvbnN0IGJpc2VjdCA9IGQzLmJpc2VjdG9yKChfOiBCYXNlUG9pbnQpID0+IF8ueSkucmlnaHQ7XG5cbiAgICAgIGNvbnN0IHkwID0gZm91bmRZLmludmVydChtb3VzZVsxXSk7XG5cbiAgICAgIGNvbnN0IHJpZ2h0SWQgPSBiaXNlY3QodGhpcy5zZXJpZXMuZGF0YSwgeTApO1xuICAgICAgY29uc3QgcmFuZ2UgPSBmb3VuZFgucmFuZ2UoKTtcblxuICAgICAgY29uc3QgaW50ZXJzZWN0ID0gbGluZUludGVyc2VjdGlvbihcbiAgICAgICAgcmFuZ2VbMF0sXG4gICAgICAgIG1vdXNlWzFdLFxuICAgICAgICByYW5nZVsxXSxcbiAgICAgICAgbW91c2VbMV0sXG4gICAgICAgIGZvdW5kWCh0aGlzLnNlcmllcy5kYXRhW3JpZ2h0SWQgLSAxXT8ueCksXG4gICAgICAgIGZvdW5kWSh0aGlzLnNlcmllcy5kYXRhW3JpZ2h0SWQgLSAxXT8ueSksXG4gICAgICAgIGZvdW5kWCh0aGlzLnNlcmllcy5kYXRhW3JpZ2h0SWRdPy54KSxcbiAgICAgICAgZm91bmRZKHRoaXMuc2VyaWVzLmRhdGFbcmlnaHRJZF0/LnkpXG4gICAgICApO1xuXG4gICAgICB0aGlzLnN2Yy5zZXRUb29sdGlwKHtcbiAgICAgICAgcG9pbnQ6IHtcbiAgICAgICAgICB4OiBmb3VuZFguaW52ZXJ0KGludGVyc2VjdC54KSxcbiAgICAgICAgICB5OiBmb3VuZFkuaW52ZXJ0KGludGVyc2VjdC55KSxcbiAgICAgICAgfSxcbiAgICAgICAgc2VyaWVzOiB0aGlzLnNlcmllcyxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB4OiBpbnRlcnNlY3QueCxcbiAgICAgICAgeTogaW50ZXJzZWN0LnksXG4gICAgICB9O1xuICAgIH1cbiAgfVxufVxuIiwiPHN2ZzpkZWZzICpuZ0lmPVwic2VyaWVzPy5maWxsVHlwZSA9PT0gZmlsbFR5cGUuZ3JhZGllbnRcIj5cbiAgPHN2ZzpsaW5lYXJHcmFkaWVudCBbaWRdPVwiJ2dyYWRpZW50LWZpbGwtJyArIGlkXCIgZ3JhZGllbnRVbml0cz1cInVzZXJTcGFjZU9uVXNlXCJcbiAgICAgICAgICAgICAgICAgICAgICB4MT1cIjAlXCJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci55MV09XCJjb25maWc/LmludmVydGVkID8gJzAlJyA6ICcxMDAlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIueDJdPVwiY29uZmlnPy5pbnZlcnRlZCA/ICcxMDAlJyA6ICcwJSdcIlxuICAgICAgICAgICAgICAgICAgICAgIHkyPVwiMCVcIj5cbiAgICA8c3ZnOnN0b3Agb2Zmc2V0PVwiMCVcIiBbYXR0ci5zdG9wLWNvbG9yXT1cInNlcmllcy5jb2xvclwiIHN0b3Atb3BhY2l0eT1cIjBcIj48L3N2ZzpzdG9wPlxuICAgIDxzdmc6c3RvcCBvZmZzZXQ9XCI1JVwiIFthdHRyLnN0b3AtY29sb3JdPVwic2VyaWVzLmNvbG9yXCIgc3RvcC1vcGFjaXR5PVwiMC4xXCI+PC9zdmc6c3RvcD5cbiAgICA8c3ZnOnN0b3Agb2Zmc2V0PVwiMjAlXCIgW2F0dHIuc3RvcC1jb2xvcl09XCJzZXJpZXMuY29sb3JcIiBzdG9wLW9wYWNpdHk9XCIwLjJcIj48L3N2ZzpzdG9wPlxuICAgIDxzdmc6c3RvcCBvZmZzZXQ9XCIxMDAlXCIgW2F0dHIuc3RvcC1jb2xvcl09XCJzZXJpZXMuY29sb3JcIiBzdG9wLW9wYWNpdHk9XCIwLjVcIj48L3N2ZzpzdG9wPlxuICA8L3N2ZzpsaW5lYXJHcmFkaWVudD5cbjwvc3ZnOmRlZnM+XG5cbjxzdmc6cGF0aFxuICBjbGFzcz1cImFyZWFcIlxuICBbYXR0ci5kXT1cInBhdGggfCBhc3luY1wiXG4gIFthdHRyLnN0cm9rZV09XCJzZXJpZXMuY29sb3JcIlxuICBbYXR0ci5zdHJva2UtZGFzaGFycmF5XT1cInNlcmllcy5zdHlsZT8uc3Ryb2tlRGFzaGFycmF5XCJcbiAgW2F0dHIuc3Ryb2tlLXdpZHRoXT1cInNlcmllcy5zdHlsZT8uc3Ryb2tlV2lkdGhcIlxuICBbYXR0ci5zdHJva2Utd2lkdGhdPVwic2VyaWVzLnN0eWxlPy5zdHJva2VXaWR0aFwiXG4gIFthdHRyLmZpbGwtb3BhY2l0eV09XCJzZXJpZXMuc3R5bGU/LmZpbGxPcGFjaXR5XCJcbiAgW2F0dHIuZmlsbF09XCJzZXJpZXMuZmlsbFR5cGUgPT09IGZpbGxUeXBlLmdyYWRpZW50ID8gJ3VybCgjZ3JhZGllbnQtZmlsbC0nK2lkKycpJyA6IHNlcmllcy5jb2xvclwiPlxuPC9zdmc6cGF0aD5cblxuPG5nLWNvbnRhaW5lciAqbmdJZj1cInRyYW5zZm9ybSB8IGFzeW5jIGFzIHRcIj5cbiAgPHN2ZzpjaXJjbGVcbiAgICAqbmdJZj1cInQueCAhPT0gdW5kZWZpbmVkICYmIHQueSE9PSB1bmRlZmluZWRcIlxuICAgIHI9XCIzXCJcbiAgICBbYXR0ci5maWxsXT1cInNlcmllcy5jb2xvclwiXG4gICAgW2F0dHIudHJhbnNmb3JtXT1cIid0cmFuc2xhdGUoJysgdC54ICsnLCAnKyB0LnkgKycpJ1wiXG4gID5cbiAgPC9zdmc6Y2lyY2xlPlxuPC9uZy1jb250YWluZXI+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRNYXJrZXJzKCkgYXMgbWFya2Vyc1wiPlxuICA8c3ZnOmNpcmNsZVxuICAgIGNsYXNzPVwibWFya2VyXCJcbiAgICAqbmdGb3I9XCJsZXQgcG9pbnQgb2YgbWFya2Vyc1wiXG4gICAgW2NsYXNzLmRyYWdnYWJsZS1tYXJrZXJdPVwicG9pbnQ/Lm1hcmtlcj8uZHJhZ2dhYmxlXCJcbiAgICBbYXR0ci5yXT1cInBvaW50Lm1hcmtlci5zdHlsZT8ucmFkaXVzID8/IDVcIlxuICAgIFthdHRyLmZpbGxdPVwicG9pbnQubWFya2VyLnN0eWxlPy5maWxsID8/ICd0cmFuc3BhcmVudCdcIlxuICAgIFthdHRyLnN0cm9rZV09XCJwb2ludC5tYXJrZXIuc3R5bGU/LnN0cm9rZSA/PyAnbm9uZSdcIlxuICAgIFthdHRyLnN0cm9rZS13aWR0aF09XCJwb2ludC5tYXJrZXIuc3R5bGU/LnN0cm9rZVdpZHRoXCJcbiAgICBbYXR0ci5zdHJva2UtZGFzaGFycmF5XT1cInBvaW50Lm1hcmtlci5zdHlsZT8uc3Ryb2tlRGFzaGFycmF5XCJcbiAgICBbYXR0ci5jeF09XCJ4KHBvaW50LngpXCJcbiAgICBbYXR0ci5jeV09XCJ5KHBvaW50LnkpXCJcbiAgPlxuICA8L3N2ZzpjaXJjbGU+XG48L25nLWNvbnRhaW5lcj5cblxuXG5cbiJdfQ==
@@ -0,0 +1,195 @@
1
+ import { Component, } from '@angular/core';
2
+ import { SeriesBaseComponent } from '../../../base/series-base.component';
3
+ import { combineLatest, map, tap, withLatestFrom } from 'rxjs';
4
+ import * as d3 from 'd3';
5
+ import { DragPointType } from '../../../model/enum/drag-point-type';
6
+ import { TooltipTracking } from '../../../model/enum/tooltip-tracking';
7
+ import { FillType } from '../../../model/enum/fill-type';
8
+ import { curveStepBefore } from 'd3';
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "../../../service/chart.service";
11
+ import * as i2 from "../../../service/scale.service";
12
+ import * as i3 from "../../../service/zoom.service";
13
+ import * as i4 from "@angular/common";
14
+ export class BlockAreaSeriesComponent extends SeriesBaseComponent {
15
+ constructor(svc, cdr, scaleService, zoomService, element) {
16
+ super(svc, cdr, scaleService, zoomService, element);
17
+ this.svc = svc;
18
+ this.cdr = cdr;
19
+ this.scaleService = scaleService;
20
+ this.zoomService = zoomService;
21
+ this.element = element;
22
+ this.fillType = FillType;
23
+ this.id = (Date.now() + Math.random()).toString(36);
24
+ }
25
+ ngOnInit() {
26
+ this.transform = this.svc.pointerMove.pipe(withLatestFrom(this.scaleService.xScaleMap, this.scaleService.yScaleMap), map((data) => {
27
+ const [event, x, y] = data;
28
+ return this.getTransform(event, x, y);
29
+ }), tap(() => this.cdr.detectChanges()));
30
+ this.path = combineLatest([
31
+ this.scaleService.xScaleMap,
32
+ this.scaleService.yScaleMap,
33
+ ]).pipe(withLatestFrom(this.scaleService.xAxisMap, this.scaleService.yAxisMap), map((data) => {
34
+ const [[x, y], xAxisMap, yAxisMap] = data;
35
+ this.x = x.get(this.series.xAxisIndex);
36
+ this.y = y.get(this.series.yAxisIndex);
37
+ const yAxis = yAxisMap.get(this.series.yAxisIndex);
38
+ const xAxis = xAxisMap.get(this.series.xAxisIndex);
39
+ const domain = this.config.inverted
40
+ ? this.x.domain()
41
+ : this.y.domain();
42
+ const area = d3
43
+ .area()
44
+ .curve(curveStepBefore)
45
+ .defined((point) => point.x !== null &&
46
+ point.y !== null &&
47
+ !isNaN(point.x) &&
48
+ !isNaN(point.y));
49
+ const displayPoints = [];
50
+ if (this.config.inverted) {
51
+ const min = xAxis.options?.inverted ? domain[1] : domain[0];
52
+ area
53
+ .y((point) => this.y(point.y))
54
+ .x0((_) => this.x(min))
55
+ .x1((point) => this.x(point.x));
56
+ this.series.data.forEach((point) => {
57
+ displayPoints.push({
58
+ x: point.x,
59
+ y: point.y,
60
+ x1: point.x1,
61
+ y1: point.y1,
62
+ color: point.color,
63
+ text: point.text,
64
+ iconId: point.iconId,
65
+ });
66
+ displayPoints.push({
67
+ x: point.x,
68
+ y: min,
69
+ x1: point.x1,
70
+ y1: point.y1,
71
+ color: point.color,
72
+ text: point.text,
73
+ iconId: point.iconId,
74
+ });
75
+ });
76
+ }
77
+ else {
78
+ const min = yAxis.options?.inverted ? domain[0] : domain[1];
79
+ area
80
+ .x((point) => this.x(point.x))
81
+ .y0((_) => this.y(min))
82
+ .y1((point) => this.y(point.y));
83
+ this.series.data.forEach((point) => {
84
+ displayPoints.push({
85
+ x: point.x,
86
+ y: point.y,
87
+ x1: point.x1,
88
+ y1: point.y1,
89
+ color: point.color,
90
+ text: point.text,
91
+ iconId: point.iconId,
92
+ });
93
+ displayPoints.push({
94
+ x: point.x,
95
+ y: min,
96
+ x1: point.x1,
97
+ y1: point.y1,
98
+ color: point.color,
99
+ text: point.text,
100
+ iconId: point.iconId,
101
+ });
102
+ });
103
+ }
104
+ return area(this.series.data);
105
+ }));
106
+ }
107
+ ngAfterViewInit() {
108
+ const drag = (node, event, d) => {
109
+ if (d.marker?.dragType === DragPointType.x ||
110
+ d.marker?.dragType === DragPointType.xy) {
111
+ d.x = this.x.invert(event.x);
112
+ }
113
+ if (d.marker?.dragType === DragPointType.y ||
114
+ d.marker?.dragType === DragPointType.xy) {
115
+ d.y = this.y.invert(event.y);
116
+ }
117
+ this.svc.emitPoint({
118
+ target: {
119
+ series: this.series,
120
+ point: d,
121
+ },
122
+ event,
123
+ });
124
+ this.cdr.detectChanges();
125
+ };
126
+ const dragMarkers = d3
127
+ .drag()
128
+ .subject(function (event, d) {
129
+ const node = d3.select(this);
130
+ return { x: node.attr('cx'), y: node.attr('cy') };
131
+ })
132
+ .on('start drag end', function (event, d) {
133
+ const node = d3.select(this);
134
+ drag(node, event, d);
135
+ });
136
+ const draggableMarkers = this.series.data?.filter((_) => _?.marker && _?.marker?.draggable);
137
+ const element = d3
138
+ .select(this.element.nativeElement)
139
+ .selectAll('.draggable-marker')
140
+ .data(draggableMarkers);
141
+ element.call(dragMarkers);
142
+ this.svgElement = d3
143
+ .select(this.element.nativeElement)
144
+ .select('.line')
145
+ .node();
146
+ }
147
+ getMarkers() {
148
+ return this.series.data?.filter((_) => _?.marker);
149
+ }
150
+ getTransform(event, x, y) {
151
+ const mouse = [event?.offsetX, event?.offsetY];
152
+ const foundX = x.get(this.series.xAxisIndex);
153
+ const foundY = y.get(this.series.yAxisIndex);
154
+ const tooltipTracking = this.config?.tooltip?.tracking;
155
+ if (tooltipTracking === TooltipTracking.x) {
156
+ const bisect = d3.bisector((_) => _.x).right;
157
+ const pointer = mouse[0];
158
+ const x0 = foundX.invert(pointer);
159
+ const filtered = this.series.data.filter((_) => _.y !== null && _.x !== null);
160
+ const rightId = bisect(filtered, x0);
161
+ this.svc.setTooltip({
162
+ point: { x: filtered[rightId]?.x, y: filtered[rightId]?.y },
163
+ series: this.series,
164
+ });
165
+ return {
166
+ x: foundX(filtered[rightId]?.x),
167
+ y: foundY(filtered[rightId]?.y),
168
+ };
169
+ }
170
+ if (tooltipTracking === TooltipTracking.y) {
171
+ const bisect = d3.bisector((_) => _.y).right;
172
+ const y0 = foundY.invert(mouse[1]);
173
+ const filtered = this.series.data.filter((_) => _.y !== null && _.x !== null);
174
+ const rightId = bisect(filtered, y0);
175
+ this.svc.setTooltip({
176
+ point: {
177
+ x: filtered[rightId]?.x,
178
+ y: filtered[rightId]?.y,
179
+ },
180
+ series: this.series,
181
+ });
182
+ return {
183
+ x: foundX(filtered[rightId]?.x),
184
+ y: foundY(filtered[rightId]?.y),
185
+ };
186
+ }
187
+ }
188
+ }
189
+ BlockAreaSeriesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.1", ngImport: i0, type: BlockAreaSeriesComponent, deps: [{ token: i1.ChartService }, { token: i0.ChangeDetectorRef }, { token: i2.ScaleService }, { token: i3.ZoomService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
190
+ BlockAreaSeriesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.1", type: BlockAreaSeriesComponent, selector: "svg:svg[teta-block-area-series]", usesInheritance: true, ngImport: i0, template: "<svg:defs *ngIf=\"series?.fillType === fillType.gradient\">\n <svg:linearGradient [id]=\"'gradient-fill-' + id\" gradientUnits=\"userSpaceOnUse\"\n x1=\"0%\"\n [attr.y1]=\"config?.inverted ? '0%' : '100%'\"\n [attr.x2]=\"config?.inverted ? '100%' : '0%'\"\n y2=\"0%\">\n <svg:stop offset=\"0%\" [attr.stop-color]=\"series.color\" stop-opacity=\"0\"></svg:stop>\n <svg:stop offset=\"5%\" [attr.stop-color]=\"series.color\" stop-opacity=\"0.1\"></svg:stop>\n <svg:stop offset=\"20%\" [attr.stop-color]=\"series.color\" stop-opacity=\"0.2\"></svg:stop>\n <svg:stop offset=\"100%\" [attr.stop-color]=\"series.color\" stop-opacity=\"0.5\"></svg:stop>\n </svg:linearGradient>\n</svg:defs>\n\n<svg:path\n class=\"area\"\n [attr.d]=\"path | async\"\n [attr.stroke]=\"series.color\"\n [attr.stroke-dasharray]=\"series.style?.strokeDasharray\"\n [attr.stroke-width]=\"series.style?.strokeWidth\"\n [attr.stroke-width]=\"series.style?.strokeWidth\"\n [attr.fill-opacity]=\"series.style?.fillOpacity\"\n [attr.fill]=\"series.fillType === fillType.gradient ? 'url(#gradient-fill-'+id+')' : series.color\">\n</svg:path>\n\n<ng-container *ngIf=\"transform | async as t\">\n <svg:circle\n *ngIf=\"t.x !== undefined && t.y!== undefined\"\n r=\"3\"\n [attr.fill]=\"series.color\"\n [attr.transform]=\"'translate('+ t.x +', '+ t.y +')'\"\n >\n </svg:circle>\n</ng-container>\n\n<ng-container *ngIf=\"getMarkers() as markers\">\n <svg:circle\n class=\"marker\"\n *ngFor=\"let point of markers\"\n [class.draggable-marker]=\"point?.marker?.draggable\"\n [attr.r]=\"point.marker.style?.radius ?? 5\"\n [attr.fill]=\"point.marker.style?.fill ?? 'transparent'\"\n [attr.stroke]=\"point.marker.style?.stroke ?? 'none'\"\n [attr.stroke-width]=\"point.marker.style?.strokeWidth\"\n [attr.stroke-dasharray]=\"point.marker.style?.strokeDasharray\"\n [attr.cx]=\"x(point.x)\"\n [attr.cy]=\"y(point.y)\"\n >\n </svg:circle>\n</ng-container>\n\n\n\n", styles: [""], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "async": i4.AsyncPipe } });
191
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.1", ngImport: i0, type: BlockAreaSeriesComponent, decorators: [{
192
+ type: Component,
193
+ args: [{ selector: 'svg:svg[teta-block-area-series]', template: "<svg:defs *ngIf=\"series?.fillType === fillType.gradient\">\n <svg:linearGradient [id]=\"'gradient-fill-' + id\" gradientUnits=\"userSpaceOnUse\"\n x1=\"0%\"\n [attr.y1]=\"config?.inverted ? '0%' : '100%'\"\n [attr.x2]=\"config?.inverted ? '100%' : '0%'\"\n y2=\"0%\">\n <svg:stop offset=\"0%\" [attr.stop-color]=\"series.color\" stop-opacity=\"0\"></svg:stop>\n <svg:stop offset=\"5%\" [attr.stop-color]=\"series.color\" stop-opacity=\"0.1\"></svg:stop>\n <svg:stop offset=\"20%\" [attr.stop-color]=\"series.color\" stop-opacity=\"0.2\"></svg:stop>\n <svg:stop offset=\"100%\" [attr.stop-color]=\"series.color\" stop-opacity=\"0.5\"></svg:stop>\n </svg:linearGradient>\n</svg:defs>\n\n<svg:path\n class=\"area\"\n [attr.d]=\"path | async\"\n [attr.stroke]=\"series.color\"\n [attr.stroke-dasharray]=\"series.style?.strokeDasharray\"\n [attr.stroke-width]=\"series.style?.strokeWidth\"\n [attr.stroke-width]=\"series.style?.strokeWidth\"\n [attr.fill-opacity]=\"series.style?.fillOpacity\"\n [attr.fill]=\"series.fillType === fillType.gradient ? 'url(#gradient-fill-'+id+')' : series.color\">\n</svg:path>\n\n<ng-container *ngIf=\"transform | async as t\">\n <svg:circle\n *ngIf=\"t.x !== undefined && t.y!== undefined\"\n r=\"3\"\n [attr.fill]=\"series.color\"\n [attr.transform]=\"'translate('+ t.x +', '+ t.y +')'\"\n >\n </svg:circle>\n</ng-container>\n\n<ng-container *ngIf=\"getMarkers() as markers\">\n <svg:circle\n class=\"marker\"\n *ngFor=\"let point of markers\"\n [class.draggable-marker]=\"point?.marker?.draggable\"\n [attr.r]=\"point.marker.style?.radius ?? 5\"\n [attr.fill]=\"point.marker.style?.fill ?? 'transparent'\"\n [attr.stroke]=\"point.marker.style?.stroke ?? 'none'\"\n [attr.stroke-width]=\"point.marker.style?.strokeWidth\"\n [attr.stroke-dasharray]=\"point.marker.style?.strokeDasharray\"\n [attr.cx]=\"x(point.x)\"\n [attr.cy]=\"y(point.y)\"\n >\n </svg:circle>\n</ng-container>\n\n\n\n", styles: [""] }]
194
+ }], ctorParameters: function () { return [{ type: i1.ChartService }, { type: i0.ChangeDetectorRef }, { type: i2.ScaleService }, { type: i3.ZoomService }, { type: i0.ElementRef }]; } });
195
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvY2stYXJlYS1zZXJpZXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2NoYXJ0L2NoYXJ0LWNvbnRhaW5lci9zZXJpZXMvYmxvY2stYXJlYS1zZXJpZXMvYmxvY2stYXJlYS1zZXJpZXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2NoYXJ0L2NoYXJ0LWNvbnRhaW5lci9zZXJpZXMvYmxvY2stYXJlYS1zZXJpZXMvYmxvY2stYXJlYS1zZXJpZXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsR0FHVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUsxRSxPQUFPLEVBQUUsYUFBYSxFQUFFLEdBQUcsRUFBYyxHQUFHLEVBQUUsY0FBYyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNFLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3pCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDdkUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRXpELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxJQUFJLENBQUM7Ozs7OztBQU9yQyxNQUFNLE9BQU8sd0JBQ1gsU0FBUSxtQkFBc0I7SUFjOUIsWUFDcUIsR0FBaUIsRUFDakIsR0FBc0IsRUFDdEIsWUFBMEIsRUFDMUIsV0FBd0IsRUFDeEIsT0FBbUI7UUFFdEMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQztRQU5qQyxRQUFHLEdBQUgsR0FBRyxDQUFjO1FBQ2pCLFFBQUcsR0FBSCxHQUFHLENBQW1C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Z0JBQ0QsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO2FBQ3BCLENBQUMsQ0FBQztZQUVILE9BQU87Z0JBQ0wsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUMvQixDQUFDLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDaEMsQ0FBQztTQUNIO0lBQ0gsQ0FBQzs7cUhBdlFVLHdCQUF3Qjt5R0FBeEIsd0JBQXdCLDhGQ3hCckMseWhFQW9EQTsyRkQ1QmEsd0JBQXdCO2tCQUxwQyxTQUFTOytCQUNFLGlDQUFpQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIE9uSW5pdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTZXJpZXNCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vYmFzZS9zZXJpZXMtYmFzZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQmFzZVBvaW50IH0gZnJvbSAnLi4vLi4vLi4vbW9kZWwvYmFzZS1wb2ludCc7XG5pbXBvcnQgeyBDaGFydFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlL2NoYXJ0LnNlcnZpY2UnO1xuaW1wb3J0IHsgU2NhbGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZS9zY2FsZS5zZXJ2aWNlJztcbmltcG9ydCB7IFpvb21TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZS96b29tLnNlcnZpY2UnO1xuaW1wb3J0IHsgY29tYmluZUxhdGVzdCwgbWFwLCBPYnNlcnZhYmxlLCB0YXAsIHdpdGhMYXRlc3RGcm9tIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgKiBhcyBkMyBmcm9tICdkMyc7XG5pbXBvcnQgeyBEcmFnUG9pbnRUeXBlIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWwvZW51bS9kcmFnLXBvaW50LXR5cGUnO1xuaW1wb3J0IHsgVG9vbHRpcFRyYWNraW5nIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWwvZW51bS90b29sdGlwLXRyYWNraW5nJztcbmltcG9ydCB7IEZpbGxUeXBlIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWwvZW51bS9maWxsLXR5cGUnO1xuaW1wb3J0IHsgQXhpcyB9IGZyb20gJy4uLy4uLy4uL2NvcmUvYXhpcy9heGlzJztcbmltcG9ydCB7IGN1cnZlU3RlcEJlZm9yZSB9IGZyb20gJ2QzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc3ZnOnN2Z1t0ZXRhLWJsb2NrLWFyZWEtc2VyaWVzXScsXG4gIHRlbXBsYXRlVXJsOiAnLi9ibG9jay1hcmVhLXNlcmllcy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Jsb2NrLWFyZWEtc2VyaWVzLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIEJsb2NrQXJlYVNlcmllc0NvbXBvbmVudDxUIGV4dGVuZHMgQmFzZVBvaW50PlxuICBleHRlbmRzIFNlcmllc0Jhc2VDb21wb25lbnQ8VD5cbiAgaW1wbGVtZW50cyBPbkluaXRcbntcbiAgdHJhbnNmb3JtOiBPYnNlcnZhYmxlPFBpY2s8QmFzZVBvaW50LCAneCcgfCAneSc+PjtcbiAgZGlzcGxheTogT2JzZXJ2YWJsZTxudW1iZXI+O1xuICBwYXRoOiBPYnNlcnZhYmxlPHN0cmluZz47XG5cbiAgc3ZnRWxlbWVudDogU1ZHR2VvbWV0cnlFbGVtZW50O1xuICB4OiBhbnk7XG4gIHk6IGFueTtcbiAgaWQ6IHN0cmluZztcblxuICBmaWxsVHlwZSA9IEZpbGxUeXBlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBzdmM6IENoYXJ0U2VydmljZSxcbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc2NhbGVTZXJ2aWNlOiBTY2FsZVNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIHpvb21TZXJ2aWNlOiBab29tU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZWxlbWVudDogRWxlbWVudFJlZlxuICApIHtcbiAgICBzdXBlcihzdmMsIGNkciwgc2NhbGVTZXJ2aWNlLCB6b29tU2VydmljZSwgZWxlbWVudCk7XG5cbiAgICB0aGlzLmlkID0gKERhdGUubm93KCkgKyBNYXRoLnJhbmRvbSgpKS50b1N0cmluZygzNik7XG4gIH1cblxuICBvdmVycmlkZSBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnRyYW5zZm9ybSA9IHRoaXMuc3ZjLnBvaW50ZXJNb3ZlLnBpcGUoXG4gICAgICB3aXRoTGF0ZXN0RnJvbSh0aGlzLnNjYWxlU2VydmljZS54U2NhbGVNYXAsIHRoaXMuc2NhbGVTZXJ2aWNlLnlTY2FsZU1hcCksXG4gICAgICBtYXAoKGRhdGE6IFtQb2ludGVyRXZlbnQsIE1hcDxudW1iZXIsIGFueT4sIE1hcDxudW1iZXIsIGFueT5dKSA9PiB7XG4gICAgICAgIGNvbnN0IFtldmVudCwgeCwgeV0gPSBkYXRhO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmdldFRyYW5zZm9ybShldmVudCwgeCwgeSk7XG4gICAgICB9KSxcbiAgICAgIHRhcCgoKSA9PiB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCkpXG4gICAgKTtcblxuICAgIHRoaXMucGF0aCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5zY2FsZVNlcnZpY2UueFNjYWxlTWFwLFxuICAgICAgdGhpcy5zY2FsZVNlcnZpY2UueVNjYWxlTWFwLFxuICAgIF0pLnBpcGUoXG4gICAgICB3aXRoTGF0ZXN0RnJvbSh0aGlzLnNjYWxlU2VydmljZS54QXhpc01hcCwgdGhpcy5zY2FsZVNlcnZpY2UueUF4aXNNYXApLFxuICAgICAgbWFwKFxuICAgICAgICAoXG4gICAgICAgICAgZGF0YTogW1xuICAgICAgICAgICAgW01hcDxudW1iZXIsIGFueT4sIE1hcDxudW1iZXIsIGFueT5dLFxuICAgICAgICAgICAgTWFwPG51bWJlciwgQXhpcz4sXG4gICAgICAgICAgICBNYXA8bnVtYmVyLCBBeGlzPlxuICAgICAgICAgIF1cbiAgICAgICAgKSA9PiB7XG4gICAgICAgICAgY29uc3QgW1t4LCB5XSwgeEF4aXNNYXAsIHlBeGlzTWFwXSA9IGRhdGE7XG5cbiAgICAgICAgICB0aGlzLnggPSB4LmdldCh0aGlzLnNlcmllcy54QXhpc0luZGV4KTtcbiAgICAgICAgICB0aGlzLnkgPSB5LmdldCh0aGlzLnNlcmllcy55QXhpc0luZGV4KTtcblxuICAgICAgICAgIGNvbnN0IHlBeGlzID0geUF4aXNNYXAuZ2V0KHRoaXMuc2VyaWVzLnlBeGlzSW5kZXgpO1xuICAgICAgICAgIGNvbnN0IHhBeGlzID0geEF4aXNNYXAuZ2V0KHRoaXMuc2VyaWVzLnhBeGlzSW5kZXgpO1xuXG4gICAgICAgICAgY29uc3QgZG9tYWluID0gdGhpcy5jb25maWcuaW52ZXJ0ZWRcbiAgICAgICAgICAgID8gdGhpcy54LmRvbWFpbigpXG4gICAgICAgICAgICA6IHRoaXMueS5kb21haW4oKTtcblxuICAgICAgICAgIGNvbnN0IGFyZWEgPSBkM1xuICAgICAgICAgICAgLmFyZWE8QmFzZVBvaW50PigpXG4gICAgICAgICAgICAuY3VydmUoY3VydmVTdGVwQmVmb3JlKVxuICAgICAgICAgICAgLmRlZmluZWQoXG4gICAgICAgICAgICAgIChwb2ludCkgPT5cbiAgICAgICAgICAgICAgICBwb2ludC54ICE9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgcG9pbnQueSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICFpc05hTihwb2ludC54KSAmJlxuICAgICAgICAgICAgICAgICFpc05hTihwb2ludC55KVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgIGNvbnN0IGRpc3BsYXlQb2ludHM6IEJhc2VQb2ludFtdID0gW107XG5cbiAgICAgICAgICBpZiAodGhpcy5jb25maWcuaW52ZXJ0ZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IG1pbiA9IHhBeGlzLm9wdGlvbnM/LmludmVydGVkID8gZG9tYWluWzFdIDogZG9tYWluWzBdO1xuXG4gICAgICAgICAgICBhcmVhXG4gICAgICAgICAgICAgIC55KChwb2ludCkgPT4gdGhpcy55KHBvaW50LnkpKVxuICAgICAgICAgICAgICAueDAoKF8pID0+IHRoaXMueChtaW4pKVxuICAgICAgICAgICAgICAueDEoKHBvaW50KSA9PiB0aGlzLngocG9pbnQueCkpO1xuXG4gICAgICAgICAgICB0aGlzLnNlcmllcy5kYXRhLmZvckVhY2goKHBvaW50OiBCYXNlUG9pbnQpID0+IHtcbiAgICAgICAgICAgICAgZGlzcGxheVBvaW50cy5wdXNoKHtcbiAgICAgICAgICAgICAgICB4OiBwb2ludC54LFxuICAgICAgICAgICAgICAgIHk6IHBvaW50LnksXG4gICAgICAgICAgICAgICAgeDE6IHBvaW50LngxLFxuICAgICAgICAgICAgICAgIHkxOiBwb2ludC55MSxcbiAgICAgICAgICAgICAgICBjb2xvcjogcG9pbnQuY29sb3IsXG4gICAgICAgICAgICAgICAgdGV4dDogcG9pbnQudGV4dCxcbiAgICAgICAgICAgICAgICBpY29uSWQ6IHBvaW50Lmljb25JZCxcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgZGlzcGxheVBvaW50cy5wdXNoKHtcbiAgICAgICAgICAgICAgICB4OiBwb2ludC54LFxuICAgICAgICAgICAgICAgIHk6IG1pbixcbiAgICAgICAgICAgICAgICB4MTogcG9pbnQueDEsXG4gICAgICAgICAgICAgICAgeTE6IHBvaW50LnkxLFxuICAgICAgICAgICAgICAgIGNvbG9yOiBwb2ludC5jb2xvcixcbiAgICAgICAgICAgICAgICB0ZXh0OiBwb2ludC50ZXh0LFxuICAgICAgICAgICAgICAgIGljb25JZDogcG9pbnQuaWNvbklkLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBtaW4gPSB5QXhpcy5vcHRpb25zPy5pbnZlcnRlZCA/IGRvbWFpblswXSA6IGRvbWFpblsxXTtcbiAgICAgICAgICAgIGFyZWFcbiAgICAgICAgICAgICAgLngoKHBvaW50KSA9PiB0aGlzLngocG9pbnQueCkpXG4gICAgICAgICAgICAgIC55MCgoXykgPT4gdGhpcy55KG1pbikpXG4gICAgICAgICAgICAgIC55MSgocG9pbnQpID0+IHRoaXMueShwb2ludC55KSk7XG5cbiAgICAgICAgICAgIHRoaXMuc2VyaWVzLmRhdGEuZm9yRWFjaCgocG9pbnQ6IEJhc2VQb2ludCkgPT4ge1xuICAgICAgICAgICAgICBkaXNwbGF5UG9pbnRzLnB1c2goe1xuICAgICAgICAgICAgICAgIHg6IHBvaW50LngsXG4gICAgICAgICAgICAgICAgeTogcG9pbnQueSxcbiAgICAgICAgICAgICAgICB4MTogcG9pbnQueDEsXG4gICAgICAgICAgICAgICAgeTE6IHBvaW50LnkxLFxuICAgICAgICAgICAgICAgIGNvbG9yOiBwb2ludC5jb2xvcixcbiAgICAgICAgICAgICAgICB0ZXh0OiBwb2ludC50ZXh0LFxuICAgICAgICAgICAgICAgIGljb25JZDogcG9pbnQuaWNvbklkLFxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICBkaXNwbGF5UG9pbnRzLnB1c2goe1xuICAgICAgICAgICAgICAgIHg6IHBvaW50LngsXG4gICAgICAgICAgICAgICAgeTogbWluLFxuICAgICAgICAgICAgICAgIHgxOiBwb2ludC54MSxcbiAgICAgICAgICAgICAgICB5MTogcG9pbnQueTEsXG4gICAgICAgICAgICAgICAgY29sb3I6IHBvaW50LmNvbG9yLFxuICAgICAgICAgICAgICAgIHRleHQ6IHBvaW50LnRleHQsXG4gICAgICAgICAgICAgICAgaWNvbklkOiBwb2ludC5pY29uSWQsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGFyZWEodGhpcy5zZXJpZXMuZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIGNvbnN0IGRyYWcgPSAobm9kZSwgZXZlbnQ6IGQzLkQzRHJhZ0V2ZW50PGFueSwgYW55LCBhbnk+LCBkOiBCYXNlUG9pbnQpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgZC5tYXJrZXI/LmRyYWdUeXBlID09PSBEcmFnUG9pbnRUeXBlLnggfHxcbiAgICAgICAgZC5tYXJrZXI/LmRyYWdUeXBlID09PSBEcmFnUG9pbnRUeXBlLnh5XG4gICAgICApIHtcbiAgICAgICAgZC54ID0gdGhpcy54LmludmVydChldmVudC54KTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBkLm1hcmtlcj8uZHJhZ1R5cGUgPT09IERyYWdQb2ludFR5cGUueSB8fFxuICAgICAgICBkLm1hcmtlcj8uZHJhZ1R5cGUgPT09IERyYWdQb2ludFR5cGUueHlcbiAgICAgICkge1xuICAgICAgICBkLnkgPSB0aGlzLnkuaW52ZXJ0KGV2ZW50LnkpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnN2Yy5lbWl0UG9pbnQoe1xuICAgICAgICB0YXJnZXQ6IHtcbiAgICAgICAgICBzZXJpZXM6IHRoaXMuc2VyaWVzLFxuICAgICAgICAgIHBvaW50OiBkLFxuICAgICAgICB9LFxuICAgICAgICBldmVudCxcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGRyYWdNYXJrZXJzID0gZDNcbiAgICAgIC5kcmFnKClcbiAgICAgIC5zdWJqZWN0KGZ1bmN0aW9uIChldmVudCwgZDogQmFzZVBvaW50KSB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBkMy5zZWxlY3QodGhpcyk7XG4gICAgICAgIHJldHVybiB7IHg6IG5vZGUuYXR0cignY3gnKSwgeTogbm9kZS5hdHRyKCdjeScpIH07XG4gICAgICB9KVxuICAgICAgLm9uKFxuICAgICAgICAnc3RhcnQgZHJhZyBlbmQnLFxuICAgICAgICBmdW5jdGlvbiAoZXZlbnQ6IGQzLkQzRHJhZ0V2ZW50PGFueSwgYW55LCBhbnk+LCBkOiBCYXNlUG9pbnQpIHtcbiAgICAgICAgICBjb25zdCBub2RlID0gZDMuc2VsZWN0KHRoaXMpO1xuXG4gICAgICAgICAgZHJhZyhub2RlLCBldmVudCwgZCk7XG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICBjb25zdCBkcmFnZ2FibGVNYXJrZXJzID0gdGhpcy5zZXJpZXMuZGF0YT8uZmlsdGVyKFxuICAgICAgKF8pID0+IF8/Lm1hcmtlciAmJiBfPy5tYXJrZXI/LmRyYWdnYWJsZVxuICAgICk7XG5cbiAgICBjb25zdCBlbGVtZW50ID0gZDNcbiAgICAgIC5zZWxlY3QodGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpXG4gICAgICAuc2VsZWN0QWxsKCcuZHJhZ2dhYmxlLW1hcmtlcicpXG4gICAgICAuZGF0YShkcmFnZ2FibGVNYXJrZXJzKTtcblxuICAgIGVsZW1lbnQuY2FsbChkcmFnTWFya2VycyBhcyBhbnkpO1xuXG4gICAgdGhpcy5zdmdFbGVtZW50ID0gZDNcbiAgICAgIC5zZWxlY3QodGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpXG4gICAgICAuc2VsZWN0KCcubGluZScpXG4gICAgICAubm9kZSgpIGFzIFNWR0dlb21ldHJ5RWxlbWVudDtcbiAgfVxuXG4gIGdldE1hcmtlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2VyaWVzLmRhdGE/LmZpbHRlcigoXykgPT4gXz8ubWFya2VyKTtcbiAgfVxuXG4gIGdldFRyYW5zZm9ybShcbiAgICBldmVudDogYW55LFxuICAgIHg6IE1hcDxudW1iZXIsIGFueT4sXG4gICAgeTogTWFwPG51bWJlciwgYW55PlxuICApOiBQaWNrPEJhc2VQb2ludCwgJ3gnIHwgJ3knPiB7XG4gICAgY29uc3QgbW91c2UgPSBbZXZlbnQ/Lm9mZnNldFgsIGV2ZW50Py5vZmZzZXRZXTtcblxuICAgIGNvbnN0IGZvdW5kWCA9IHguZ2V0KHRoaXMuc2VyaWVzLnhBeGlzSW5kZXgpO1xuICAgIGNvbnN0IGZvdW5kWSA9IHkuZ2V0KHRoaXMuc2VyaWVzLnlBeGlzSW5kZXgpO1xuXG4gICAgY29uc3QgdG9vbHRpcFRyYWNraW5nID0gdGhpcy5jb25maWc/LnRvb2x0aXA/LnRyYWNraW5nO1xuXG4gICAgaWYgKHRvb2x0aXBUcmFja2luZyA9PT0gVG9vbHRpcFRyYWNraW5nLngpIHtcbiAgICAgIGNvbnN0IGJpc2VjdCA9IGQzLmJpc2VjdG9yKChfOiBCYXNlUG9pbnQpID0+IF8ueCkucmlnaHQ7XG4gICAgICBjb25zdCBwb2ludGVyID0gbW91c2VbMF07XG5cbiAgICAgIGNvbnN0IHgwID0gZm91bmRYLmludmVydChwb2ludGVyKTtcblxuICAgICAgY29uc3QgZmlsdGVyZWQgPSB0aGlzLnNlcmllcy5kYXRhLmZpbHRlcihcbiAgICAgICAgKF8pID0+IF8ueSAhPT0gbnVsbCAmJiBfLnggIT09IG51bGxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHJpZ2h0SWQgPSBiaXNlY3QoZmlsdGVyZWQsIHgwKTtcblxuICAgICAgdGhpcy5zdmMuc2V0VG9vbHRpcCh7XG4gICAgICAgIHBvaW50OiB7IHg6IGZpbHRlcmVkW3JpZ2h0SWRdPy54LCB5OiBmaWx0ZXJlZFtyaWdodElkXT8ueSB9LFxuICAgICAgICBzZXJpZXM6IHRoaXMuc2VyaWVzLFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IGZvdW5kWChmaWx0ZXJlZFtyaWdodElkXT8ueCksXG4gICAgICAgIHk6IGZvdW5kWShmaWx0ZXJlZFtyaWdodElkXT8ueSksXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICh0b29sdGlwVHJhY2tpbmcgPT09IFRvb2x0aXBUcmFja2luZy55KSB7XG4gICAgICBjb25zdCBiaXNlY3QgPSBkMy5iaXNlY3RvcigoXzogQmFzZVBvaW50KSA9PiBfLnkpLnJpZ2h0O1xuXG4gICAgICBjb25zdCB5MCA9IGZvdW5kWS5pbnZlcnQobW91c2VbMV0pO1xuXG4gICAgICBjb25zdCBmaWx0ZXJlZCA9IHRoaXMuc2VyaWVzLmRhdGEuZmlsdGVyKFxuICAgICAgICAoXykgPT4gXy55ICE9PSBudWxsICYmIF8ueCAhPT0gbnVsbFxuICAgICAgKTtcblxuICAgICAgY29uc3QgcmlnaHRJZCA9IGJpc2VjdChmaWx0ZXJlZCwgeTApO1xuXG4gICAgICB0aGlzLnN2Yy5zZXRUb29sdGlwKHtcbiAgICAgICAgcG9pbnQ6IHtcbiAgICAgICAgICB4OiBmaWx0ZXJlZFtyaWdodElkXT8ueCxcbiAgICAgICAgICB5OiBmaWx0ZXJlZFtyaWdodElkXT8ueSxcbiAgICAgICAgfSxcbiAgICAgICAgc2VyaWVzOiB0aGlzLnNlcmllcyxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB4OiBmb3VuZFgoZmlsdGVyZWRbcmlnaHRJZF0/LngpLFxuICAgICAgICB5OiBmb3VuZFkoZmlsdGVyZWRbcmlnaHRJZF0/LnkpLFxuICAgICAgfTtcbiAgICB9XG4gIH1cbn1cbiIsIjxzdmc6ZGVmcyAqbmdJZj1cInNlcmllcz8uZmlsbFR5cGUgPT09IGZpbGxUeXBlLmdyYWRpZW50XCI+XG4gIDxzdmc6bGluZWFyR3JhZGllbnQgW2lkXT1cIidncmFkaWVudC1maWxsLScgKyBpZFwiIGdyYWRpZW50VW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgeDE9XCIwJVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIueTFdPVwiY29uZmlnPy5pbnZlcnRlZCA/ICcwJScgOiAnMTAwJSdcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLngyXT1cImNvbmZpZz8uaW52ZXJ0ZWQgPyAnMTAwJScgOiAnMCUnXCJcbiAgICAgICAgICAgICAgICAgICAgICB5Mj1cIjAlXCI+XG4gICAgPHN2ZzpzdG9wIG9mZnNldD1cIjAlXCIgW2F0dHIuc3RvcC1jb2xvcl09XCJzZXJpZXMuY29sb3JcIiBzdG9wLW9wYWNpdHk9XCIwXCI+PC9zdmc6c3RvcD5cbiAgICA8c3ZnOnN0b3Agb2Zmc2V0PVwiNSVcIiBbYXR0ci5zdG9wLWNvbG9yXT1cInNlcmllcy5jb2xvclwiIHN0b3Atb3BhY2l0eT1cIjAuMVwiPjwvc3ZnOnN0b3A+XG4gICAgPHN2ZzpzdG9wIG9mZnNldD1cIjIwJVwiIFthdHRyLnN0b3AtY29sb3JdPVwic2VyaWVzLmNvbG9yXCIgc3RvcC1vcGFjaXR5PVwiMC4yXCI+PC9zdmc6c3RvcD5cbiAgICA8c3ZnOnN0b3Agb2Zmc2V0PVwiMTAwJVwiIFthdHRyLnN0b3AtY29sb3JdPVwic2VyaWVzLmNvbG9yXCIgc3RvcC1vcGFjaXR5PVwiMC41XCI+PC9zdmc6c3RvcD5cbiAgPC9zdmc6bGluZWFyR3JhZGllbnQ+XG48L3N2ZzpkZWZzPlxuXG48c3ZnOnBhdGhcbiAgY2xhc3M9XCJhcmVhXCJcbiAgW2F0dHIuZF09XCJwYXRoIHwgYXN5bmNcIlxuICBbYXR0ci5zdHJva2VdPVwic2VyaWVzLmNvbG9yXCJcbiAgW2F0dHIuc3Ryb2tlLWRhc2hhcnJheV09XCJzZXJpZXMuc3R5bGU/LnN0cm9rZURhc2hhcnJheVwiXG4gIFthdHRyLnN0cm9rZS13aWR0aF09XCJzZXJpZXMuc3R5bGU/LnN0cm9rZVdpZHRoXCJcbiAgW2F0dHIuc3Ryb2tlLXdpZHRoXT1cInNlcmllcy5zdHlsZT8uc3Ryb2tlV2lkdGhcIlxuICBbYXR0ci5maWxsLW9wYWNpdHldPVwic2VyaWVzLnN0eWxlPy5maWxsT3BhY2l0eVwiXG4gIFthdHRyLmZpbGxdPVwic2VyaWVzLmZpbGxUeXBlID09PSBmaWxsVHlwZS5ncmFkaWVudCA/ICd1cmwoI2dyYWRpZW50LWZpbGwtJytpZCsnKScgOiBzZXJpZXMuY29sb3JcIj5cbjwvc3ZnOnBhdGg+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJ0cmFuc2Zvcm0gfCBhc3luYyBhcyB0XCI+XG4gIDxzdmc6Y2lyY2xlXG4gICAgKm5nSWY9XCJ0LnggIT09IHVuZGVmaW5lZCAmJiB0LnkhPT0gdW5kZWZpbmVkXCJcbiAgICByPVwiM1wiXG4gICAgW2F0dHIuZmlsbF09XCJzZXJpZXMuY29sb3JcIlxuICAgIFthdHRyLnRyYW5zZm9ybV09XCIndHJhbnNsYXRlKCcrIHQueCArJywgJysgdC55ICsnKSdcIlxuICA+XG4gIDwvc3ZnOmNpcmNsZT5cbjwvbmctY29udGFpbmVyPlxuXG48bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0TWFya2VycygpIGFzIG1hcmtlcnNcIj5cbiAgPHN2ZzpjaXJjbGVcbiAgICBjbGFzcz1cIm1hcmtlclwiXG4gICAgKm5nRm9yPVwibGV0IHBvaW50IG9mIG1hcmtlcnNcIlxuICAgIFtjbGFzcy5kcmFnZ2FibGUtbWFya2VyXT1cInBvaW50Py5tYXJrZXI/LmRyYWdnYWJsZVwiXG4gICAgW2F0dHIucl09XCJwb2ludC5tYXJrZXIuc3R5bGU/LnJhZGl1cyA/PyA1XCJcbiAgICBbYXR0ci5maWxsXT1cInBvaW50Lm1hcmtlci5zdHlsZT8uZmlsbCA/PyAndHJhbnNwYXJlbnQnXCJcbiAgICBbYXR0ci5zdHJva2VdPVwicG9pbnQubWFya2VyLnN0eWxlPy5zdHJva2UgPz8gJ25vbmUnXCJcbiAgICBbYXR0ci5zdHJva2Utd2lkdGhdPVwicG9pbnQubWFya2VyLnN0eWxlPy5zdHJva2VXaWR0aFwiXG4gICAgW2F0dHIuc3Ryb2tlLWRhc2hhcnJheV09XCJwb2ludC5tYXJrZXIuc3R5bGU/LnN0cm9rZURhc2hhcnJheVwiXG4gICAgW2F0dHIuY3hdPVwieChwb2ludC54KVwiXG4gICAgW2F0dHIuY3ldPVwieShwb2ludC55KVwiXG4gID5cbiAgPC9zdmc6Y2lyY2xlPlxuPC9uZy1jb250YWluZXI+XG5cblxuXG4iXX0=
@@ -0,0 +1,47 @@
1
+ import { ChangeDetectionStrategy, Component, } from '@angular/core';
2
+ import { SeriesBaseComponent } from '../../../base/series-base.component';
3
+ import { map } from 'rxjs';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "../../../service/chart.service";
6
+ import * as i2 from "../../../service/scale.service";
7
+ import * as i3 from "../../../service/zoom.service";
8
+ import * as i4 from "@angular/common";
9
+ export class BlockSeriesComponent extends SeriesBaseComponent {
10
+ constructor(svc, cdr, scaleService, zoomService, element) {
11
+ super(svc, cdr, scaleService, zoomService, element);
12
+ this.svc = svc;
13
+ this.cdr = cdr;
14
+ this.scaleService = scaleService;
15
+ this.zoomService = zoomService;
16
+ this.element = element;
17
+ }
18
+ ngOnInit() {
19
+ const defaultVisiblePixels = 3;
20
+ this.x = this.scaleService.xScaleMap.pipe(map((_) => _.get(this.series.xAxisIndex)));
21
+ this.y = this.scaleService.yScaleMap.pipe(map((_) => _.get(this.series.yAxisIndex)));
22
+ this.displayPoints = this.y.pipe(map((y) => {
23
+ return this.series.data.filter((point, index, arr) => {
24
+ const height = Math.abs(y(point.y1) - y(point.y));
25
+ const [min, max] = y.domain();
26
+ const visibleCondition = height > defaultVisiblePixels &&
27
+ (point.y >= min ||
28
+ point.y1 >= min ||
29
+ arr[index + 1]?.y >= min ||
30
+ arr[index + 1]?.y1 >= min) &&
31
+ (point.y <= max ||
32
+ point.y1 <= max ||
33
+ arr[index - 1]?.y <= max ||
34
+ arr[index - 1]?.y1 <= max);
35
+ return visibleCondition;
36
+ });
37
+ }));
38
+ }
39
+ ngAfterViewInit() { }
40
+ }
41
+ BlockSeriesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.1", ngImport: i0, type: BlockSeriesComponent, deps: [{ token: i1.ChartService }, { token: i0.ChangeDetectorRef }, { token: i2.ScaleService }, { token: i3.ZoomService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
42
+ BlockSeriesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.1", type: BlockSeriesComponent, selector: "svg:svg[teta-block-series]", usesInheritance: true, ngImport: i0, template: "<ng-container *ngIf=\"{\n y: y | async,\n x: x | async,\n points: displayPoints | async\n} as data\">\n <ng-container *ngFor=\"let point of data.points\">\n <svg:g>\n <svg:rect\n x=\"0\"\n [attr.y]=\"data.y(point.y)\"\n [attr.height]=\"data.y(point.y1) - data.y(point.y)\"\n [attr.fill]=\"point.iconId ? 'url(#pattern'+point.iconId+')' : point.color ?? series.color\"\n [attr.fill-opacity]=\"series.style?.fillOpacity\"\n width=\"100%\">\n </svg:rect>\n <svg:text *ngIf=\"point.text\" x=\"50%\"\n [attr.y]=\"(data.y(point.y1) + data.y(point.y)) / 2\"\n alignment-baseline=\"middle\"\n text-anchor=\"middle\">{{ point.text }}\n </svg:text>\n\n <svg:line x1=\"0\" x2=\"100%\" [attr.y1]=\"data.y(point.y)\" [attr.y2]=\"data.y(point.y)\" [attr.stroke]=\"point.iconId ? 'var(--color-text-10)' : point.color ?? series.color\"></svg:line>\n <svg:line x1=\"0\" x2=\"100%\" [attr.y1]=\"data.y(point.y1)\" [attr.y2]=\"data.y(point.y1)\" [attr.stroke]=\"point.iconId ? 'var(--color-text-10)' : point.color ?? series.color\"></svg:line>\n\n </svg:g>\n </ng-container>\n\n\n</ng-container>\n", styles: [""], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "async": i4.AsyncPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
43
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.1", ngImport: i0, type: BlockSeriesComponent, decorators: [{
44
+ type: Component,
45
+ args: [{ selector: 'svg:svg[teta-block-series]', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"{\n y: y | async,\n x: x | async,\n points: displayPoints | async\n} as data\">\n <ng-container *ngFor=\"let point of data.points\">\n <svg:g>\n <svg:rect\n x=\"0\"\n [attr.y]=\"data.y(point.y)\"\n [attr.height]=\"data.y(point.y1) - data.y(point.y)\"\n [attr.fill]=\"point.iconId ? 'url(#pattern'+point.iconId+')' : point.color ?? series.color\"\n [attr.fill-opacity]=\"series.style?.fillOpacity\"\n width=\"100%\">\n </svg:rect>\n <svg:text *ngIf=\"point.text\" x=\"50%\"\n [attr.y]=\"(data.y(point.y1) + data.y(point.y)) / 2\"\n alignment-baseline=\"middle\"\n text-anchor=\"middle\">{{ point.text }}\n </svg:text>\n\n <svg:line x1=\"0\" x2=\"100%\" [attr.y1]=\"data.y(point.y)\" [attr.y2]=\"data.y(point.y)\" [attr.stroke]=\"point.iconId ? 'var(--color-text-10)' : point.color ?? series.color\"></svg:line>\n <svg:line x1=\"0\" x2=\"100%\" [attr.y1]=\"data.y(point.y1)\" [attr.y2]=\"data.y(point.y1)\" [attr.stroke]=\"point.iconId ? 'var(--color-text-10)' : point.color ?? series.color\"></svg:line>\n\n </svg:g>\n </ng-container>\n\n\n</ng-container>\n", styles: [""] }]
46
+ }], ctorParameters: function () { return [{ type: i1.ChartService }, { type: i0.ChangeDetectorRef }, { type: i2.ScaleService }, { type: i3.ZoomService }, { type: i0.ElementRef }]; } });
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvY2stc2VyaWVzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jaGFydC9jaGFydC1jb250YWluZXIvc2VyaWVzL2Jsb2NrLXNlcmllcy9ibG9jay1zZXJpZXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2NoYXJ0L2NoYXJ0LWNvbnRhaW5lci9zZXJpZXMvYmxvY2stc2VyaWVzL2Jsb2NrLXNlcmllcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBRXZCLFNBQVMsR0FHVixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsR0FBRyxFQUFjLE1BQU0sTUFBTSxDQUFDOzs7Ozs7QUFXdkMsTUFBTSxPQUFPLG9CQUNYLFNBQVEsbUJBQXNCO0lBTzlCLFlBQ3FCLEdBQWlCLEVBQ2pCLEdBQXNCLEVBQ3RCLFlBQTBCLEVBQzFCLFdBQXdCLEVBQ3hCLE9BQW1CO1FBRXRDLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFOakMsUUFBRyxHQUFILEdBQUcsQ0FBYztRQUNqQixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUN0QixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixZQUFPLEdBQVAsT0FBTyxDQUFZO0lBR3hDLENBQUM7SUFFUSxRQUFRO1FBQ2YsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLENBQUM7UUFFL0IsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQ3ZDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQzFDLENBQUM7UUFDRixJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLElBQUksQ0FDdkMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FDMUMsQ0FBQztRQUVGLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQzlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ1IsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO2dCQUNuRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNsRCxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFFOUIsTUFBTSxnQkFBZ0IsR0FDcEIsTUFBTSxHQUFHLG9CQUFvQjtvQkFDN0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEdBQUc7d0JBQ2IsS0FBSyxDQUFDLEVBQUUsSUFBSSxHQUFHO3dCQUNmLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEdBQUc7d0JBQ3hCLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxJQUFJLEdBQUcsQ0FBQztvQkFDNUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEdBQUc7d0JBQ2IsS0FBSyxDQUFDLEVBQUUsSUFBSSxHQUFHO3dCQUNmLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEdBQUc7d0JBQ3hCLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDO2dCQUUvQixPQUFPLGdCQUFnQixDQUFDO1lBQzFCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRCxlQUFlLEtBQUksQ0FBQzs7aUhBbkRULG9CQUFvQjtxR0FBcEIsb0JBQW9CLHlGQ3JCakMsd3JDQTZCQTsyRkRSYSxvQkFBb0I7a0JBTmhDLFNBQVM7K0JBQ0UsNEJBQTRCLG1CQUdyQix1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIE9uSW5pdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCYXNlUG9pbnQgfSBmcm9tICcuLi8uLi8uLi9tb2RlbC9iYXNlLXBvaW50JztcbmltcG9ydCB7IFNlcmllc0Jhc2VDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9iYXNlL3Nlcmllcy1iYXNlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBtYXAsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENoYXJ0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2UvY2hhcnQuc2VydmljZSc7XG5pbXBvcnQgeyBTY2FsZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlL3NjYWxlLnNlcnZpY2UnO1xuaW1wb3J0IHsgWm9vbVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlL3pvb20uc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N2ZzpzdmdbdGV0YS1ibG9jay1zZXJpZXNdJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Jsb2NrLXNlcmllcy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Jsb2NrLXNlcmllcy5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQmxvY2tTZXJpZXNDb21wb25lbnQ8VCBleHRlbmRzIEJhc2VQb2ludD5cbiAgZXh0ZW5kcyBTZXJpZXNCYXNlQ29tcG9uZW50PFQ+XG4gIGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0XG57XG4gIHg6IE9ic2VydmFibGU8YW55PjtcbiAgeTogT2JzZXJ2YWJsZTxhbnk+O1xuICBkaXNwbGF5UG9pbnRzOiBPYnNlcnZhYmxlPEJhc2VQb2ludFtdPjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3ZjOiBDaGFydFNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIHNjYWxlU2VydmljZTogU2NhbGVTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBvdmVycmlkZSB6b29tU2VydmljZTogWm9vbVNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIGVsZW1lbnQ6IEVsZW1lbnRSZWZcbiAgKSB7XG4gICAgc3VwZXIoc3ZjLCBjZHIsIHNjYWxlU2VydmljZSwgem9vbVNlcnZpY2UsIGVsZW1lbnQpO1xuICB9XG5cbiAgb3ZlcnJpZGUgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgY29uc3QgZGVmYXVsdFZpc2libGVQaXhlbHMgPSAzO1xuXG4gICAgdGhpcy54ID0gdGhpcy5zY2FsZVNlcnZpY2UueFNjYWxlTWFwLnBpcGUoXG4gICAgICBtYXAoKF8pID0+IF8uZ2V0KHRoaXMuc2VyaWVzLnhBeGlzSW5kZXgpKVxuICAgICk7XG4gICAgdGhpcy55ID0gdGhpcy5zY2FsZVNlcnZpY2UueVNjYWxlTWFwLnBpcGUoXG4gICAgICBtYXAoKF8pID0+IF8uZ2V0KHRoaXMuc2VyaWVzLnlBeGlzSW5kZXgpKVxuICAgICk7XG5cbiAgICB0aGlzLmRpc3BsYXlQb2ludHMgPSB0aGlzLnkucGlwZShcbiAgICAgIG1hcCgoeSkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXJpZXMuZGF0YS5maWx0ZXIoKHBvaW50LCBpbmRleCwgYXJyKSA9PiB7XG4gICAgICAgICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5hYnMoeShwb2ludC55MSkgLSB5KHBvaW50LnkpKTtcbiAgICAgICAgICBjb25zdCBbbWluLCBtYXhdID0geS5kb21haW4oKTtcblxuICAgICAgICAgIGNvbnN0IHZpc2libGVDb25kaXRpb24gPVxuICAgICAgICAgICAgaGVpZ2h0ID4gZGVmYXVsdFZpc2libGVQaXhlbHMgJiZcbiAgICAgICAgICAgIChwb2ludC55ID49IG1pbiB8fFxuICAgICAgICAgICAgICBwb2ludC55MSA+PSBtaW4gfHxcbiAgICAgICAgICAgICAgYXJyW2luZGV4ICsgMV0/LnkgPj0gbWluIHx8XG4gICAgICAgICAgICAgIGFycltpbmRleCArIDFdPy55MSA+PSBtaW4pICYmXG4gICAgICAgICAgICAocG9pbnQueSA8PSBtYXggfHxcbiAgICAgICAgICAgICAgcG9pbnQueTEgPD0gbWF4IHx8XG4gICAgICAgICAgICAgIGFycltpbmRleCAtIDFdPy55IDw9IG1heCB8fFxuICAgICAgICAgICAgICBhcnJbaW5kZXggLSAxXT8ueTEgPD0gbWF4KTtcblxuICAgICAgICAgIHJldHVybiB2aXNpYmxlQ29uZGl0aW9uO1xuICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHt9XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwie1xuICB5OiB5IHwgYXN5bmMsXG4gIHg6IHggfCBhc3luYyxcbiAgcG9pbnRzOiBkaXNwbGF5UG9pbnRzIHwgYXN5bmNcbn0gYXMgZGF0YVwiPlxuICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBwb2ludCBvZiBkYXRhLnBvaW50c1wiPlxuICAgIDxzdmc6Zz5cbiAgICAgIDxzdmc6cmVjdFxuICAgICAgICB4PVwiMFwiXG4gICAgICAgIFthdHRyLnldPVwiZGF0YS55KHBvaW50LnkpXCJcbiAgICAgICAgW2F0dHIuaGVpZ2h0XT1cImRhdGEueShwb2ludC55MSkgLSBkYXRhLnkocG9pbnQueSlcIlxuICAgICAgICBbYXR0ci5maWxsXT1cInBvaW50Lmljb25JZCA/ICd1cmwoI3BhdHRlcm4nK3BvaW50Lmljb25JZCsnKScgOiBwb2ludC5jb2xvciA/PyBzZXJpZXMuY29sb3JcIlxuICAgICAgICBbYXR0ci5maWxsLW9wYWNpdHldPVwic2VyaWVzLnN0eWxlPy5maWxsT3BhY2l0eVwiXG4gICAgICAgIHdpZHRoPVwiMTAwJVwiPlxuICAgICAgPC9zdmc6cmVjdD5cbiAgICAgIDxzdmc6dGV4dCAqbmdJZj1cInBvaW50LnRleHRcIiB4PVwiNTAlXCJcbiAgICAgICAgICAgICAgICBbYXR0ci55XT1cIihkYXRhLnkocG9pbnQueTEpICsgZGF0YS55KHBvaW50LnkpKSAvIDJcIlxuICAgICAgICAgICAgICAgIGFsaWdubWVudC1iYXNlbGluZT1cIm1pZGRsZVwiXG4gICAgICAgICAgICAgICAgdGV4dC1hbmNob3I9XCJtaWRkbGVcIj57eyBwb2ludC50ZXh0IH19XG4gICAgICA8L3N2Zzp0ZXh0PlxuXG4gICAgICA8c3ZnOmxpbmUgeDE9XCIwXCIgeDI9XCIxMDAlXCIgW2F0dHIueTFdPVwiZGF0YS55KHBvaW50LnkpXCIgW2F0dHIueTJdPVwiZGF0YS55KHBvaW50LnkpXCIgW2F0dHIuc3Ryb2tlXT1cInBvaW50Lmljb25JZCA/ICd2YXIoLS1jb2xvci10ZXh0LTEwKScgOiBwb2ludC5jb2xvciA/PyBzZXJpZXMuY29sb3JcIj48L3N2ZzpsaW5lPlxuICAgICAgPHN2ZzpsaW5lIHgxPVwiMFwiIHgyPVwiMTAwJVwiIFthdHRyLnkxXT1cImRhdGEueShwb2ludC55MSlcIiBbYXR0ci55Ml09XCJkYXRhLnkocG9pbnQueTEpXCIgW2F0dHIuc3Ryb2tlXT1cInBvaW50Lmljb25JZCA/ICd2YXIoLS1jb2xvci10ZXh0LTEwKScgOiBwb2ludC5jb2xvciA/PyBzZXJpZXMuY29sb3JcIj48L3N2ZzpsaW5lPlxuXG4gICAgPC9zdmc6Zz5cbiAgPC9uZy1jb250YWluZXI+XG5cblxuPC9uZy1jb250YWluZXI+XG4iXX0=