@net7/components 3.0.2-rc.2
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.
- package/README.md +24 -0
- package/esm2020/lib/components/advanced-autocomplete/advanced-autocomplete.mjs +25 -0
- package/esm2020/lib/components/advanced-autocomplete/advanced-autocomplete.mock.mjs +100 -0
- package/esm2020/lib/components/alert/alert.mjs +24 -0
- package/esm2020/lib/components/alert/alert.mock.mjs +11 -0
- package/esm2020/lib/components/anchor-wrapper/anchor-wrapper.mjs +35 -0
- package/esm2020/lib/components/breadcrumbs/breadcrumbs.mjs +25 -0
- package/esm2020/lib/components/breadcrumbs/breadcrumbs.mock.mjs +25 -0
- package/esm2020/lib/components/bubble-chart/bubble-chart.mjs +315 -0
- package/esm2020/lib/components/bubble-chart/bubble-chart.mock.mjs +4025 -0
- package/esm2020/lib/components/carousel/carousel.mjs +89 -0
- package/esm2020/lib/components/carousel/carousel.mock.mjs +135 -0
- package/esm2020/lib/components/chart/chart.mjs +37 -0
- package/esm2020/lib/components/chart/chart.mock.mjs +112 -0
- package/esm2020/lib/components/content-placeholder/content-placeholder.mjs +17 -0
- package/esm2020/lib/components/content-placeholder/content-placeholder.mock.mjs +13 -0
- package/esm2020/lib/components/data-widget/data-widget.mjs +29 -0
- package/esm2020/lib/components/data-widget/data-widget.mock.mjs +13 -0
- package/esm2020/lib/components/datepicker/datepicker.mjs +44 -0
- package/esm2020/lib/components/datepicker/datepicker.mock.mjs +8 -0
- package/esm2020/lib/components/facet/facet.mjs +24 -0
- package/esm2020/lib/components/facet/facet.mock.mjs +103 -0
- package/esm2020/lib/components/facet-header/facet-header.mjs +24 -0
- package/esm2020/lib/components/facet-header/facet-header.mock.mjs +9 -0
- package/esm2020/lib/components/facet-year-range/facet-year-range.mjs +53 -0
- package/esm2020/lib/components/facet-year-range/facet-year-range.mock.mjs +30 -0
- package/esm2020/lib/components/footer/footer.mjs +25 -0
- package/esm2020/lib/components/footer/footer.mock.mjs +48 -0
- package/esm2020/lib/components/header/header.mjs +51 -0
- package/esm2020/lib/components/header/header.mock.mjs +83 -0
- package/esm2020/lib/components/hero/hero.mjs +41 -0
- package/esm2020/lib/components/hero/hero.mock.mjs +25 -0
- package/esm2020/lib/components/histogram-range/histogram-range.mjs +376 -0
- package/esm2020/lib/components/histogram-range/histogram-range.mock.mjs +243 -0
- package/esm2020/lib/components/image-viewer/image-viewer.mjs +55 -0
- package/esm2020/lib/components/image-viewer/image-viewer.mock.mjs +25 -0
- package/esm2020/lib/components/image-viewer-tools/image-viewer-tools.mjs +28 -0
- package/esm2020/lib/components/image-viewer-tools/image-viewer-tools.mock.mjs +54 -0
- package/esm2020/lib/components/inner-title/inner-title.mjs +40 -0
- package/esm2020/lib/components/inner-title/inner-title.mock.mjs +52 -0
- package/esm2020/lib/components/input-checkbox/input-checkbox.mjs +24 -0
- package/esm2020/lib/components/input-checkbox/input-checkbox.mock.mjs +25 -0
- package/esm2020/lib/components/input-link/input-link.mjs +24 -0
- package/esm2020/lib/components/input-link/input-link.mock.mjs +38 -0
- package/esm2020/lib/components/input-select/input-select.mjs +24 -0
- package/esm2020/lib/components/input-select/input-select.mock.mjs +12 -0
- package/esm2020/lib/components/input-text/input-text.mjs +24 -0
- package/esm2020/lib/components/input-text/input-text.mock.mjs +13 -0
- package/esm2020/lib/components/item-preview/item-preview.mjs +25 -0
- package/esm2020/lib/components/item-preview/item-preview.mock.mjs +43 -0
- package/esm2020/lib/components/loader/loader.mjs +16 -0
- package/esm2020/lib/components/loader/loader.mock.mjs +4 -0
- package/esm2020/lib/components/map/map.mjs +64 -0
- package/esm2020/lib/components/map/map.mock.mjs +25 -0
- package/esm2020/lib/components/metadata-viewer/metadata-viewer.mjs +19 -0
- package/esm2020/lib/components/metadata-viewer/metadata-viewer.mock.mjs +74 -0
- package/esm2020/lib/components/nav/nav.mjs +22 -0
- package/esm2020/lib/components/nav/nav.mock.mjs +29 -0
- package/esm2020/lib/components/pagination/pagination.mjs +31 -0
- package/esm2020/lib/components/pagination/pagination.mock.mjs +23 -0
- package/esm2020/lib/components/progress-line/progress-line.mjs +19 -0
- package/esm2020/lib/components/progress-line/progress-line.mock.mjs +5 -0
- package/esm2020/lib/components/sidebar-header/sidebar-header.mjs +24 -0
- package/esm2020/lib/components/sidebar-header/sidebar-header.mock.mjs +9 -0
- package/esm2020/lib/components/signup/signup.mjs +44 -0
- package/esm2020/lib/components/signup/signup.mock.mjs +106 -0
- package/esm2020/lib/components/simple-autocomplete/simple-autocomplete.mjs +25 -0
- package/esm2020/lib/components/simple-autocomplete/simple-autocomplete.mock.mjs +15 -0
- package/esm2020/lib/components/table/table.mjs +35 -0
- package/esm2020/lib/components/table/table.mock.mjs +152 -0
- package/esm2020/lib/components/tag/tag.mjs +24 -0
- package/esm2020/lib/components/tag/tag.mock.mjs +8 -0
- package/esm2020/lib/components/text-viewer/text-viewer.mjs +37 -0
- package/esm2020/lib/components/text-viewer/text-viewer.mock.mjs +39 -0
- package/esm2020/lib/components/timeline/timeline.mjs +51 -0
- package/esm2020/lib/components/timeline/timeline.mock.mjs +137 -0
- package/esm2020/lib/components/toast/toast.mjs +24 -0
- package/esm2020/lib/components/toast/toast.mock.mjs +47 -0
- package/esm2020/lib/components/tooltip-content/tooltip-content.mjs +25 -0
- package/esm2020/lib/components/tooltip-content/tooltip-content.mock.mjs +19 -0
- package/esm2020/lib/components/tree/tree.mjs +25 -0
- package/esm2020/lib/components/tree/tree.mock.mjs +274 -0
- package/esm2020/lib/components/wizard/wizard.mjs +24 -0
- package/esm2020/lib/components/wizard/wizard.mock.mjs +29 -0
- package/esm2020/lib/dv-components-lib.module.mjs +191 -0
- package/esm2020/lib/shared-interfaces.mjs +2 -0
- package/esm2020/net7-components.mjs +5 -0
- package/esm2020/public-api.mjs +93 -0
- package/fesm2015/net7-components.mjs +8154 -0
- package/fesm2015/net7-components.mjs.map +1 -0
- package/fesm2020/net7-components.mjs +8168 -0
- package/fesm2020/net7-components.mjs.map +1 -0
- package/lib/components/advanced-autocomplete/advanced-autocomplete.d.ts +57 -0
- package/lib/components/advanced-autocomplete/advanced-autocomplete.mock.d.ts +2 -0
- package/lib/components/alert/alert.d.ts +46 -0
- package/lib/components/alert/alert.mock.d.ts +2 -0
- package/lib/components/anchor-wrapper/anchor-wrapper.d.ts +16 -0
- package/lib/components/breadcrumbs/breadcrumbs.d.ts +50 -0
- package/lib/components/breadcrumbs/breadcrumbs.mock.d.ts +2 -0
- package/lib/components/bubble-chart/bubble-chart.d.ts +108 -0
- package/lib/components/bubble-chart/bubble-chart.mock.d.ts +2 -0
- package/lib/components/carousel/carousel.d.ts +166 -0
- package/lib/components/carousel/carousel.mock.d.ts +2 -0
- package/lib/components/chart/chart.d.ts +46 -0
- package/lib/components/chart/chart.mock.d.ts +2 -0
- package/lib/components/content-placeholder/content-placeholder.d.ts +28 -0
- package/lib/components/content-placeholder/content-placeholder.mock.d.ts +2 -0
- package/lib/components/data-widget/data-widget.d.ts +50 -0
- package/lib/components/data-widget/data-widget.mock.d.ts +2 -0
- package/lib/components/datepicker/datepicker.d.ts +43 -0
- package/lib/components/datepicker/datepicker.mock.d.ts +2 -0
- package/lib/components/facet/facet.d.ts +129 -0
- package/lib/components/facet/facet.mock.d.ts +2 -0
- package/lib/components/facet-header/facet-header.d.ts +44 -0
- package/lib/components/facet-header/facet-header.mock.d.ts +2 -0
- package/lib/components/facet-year-range/facet-year-range.d.ts +83 -0
- package/lib/components/facet-year-range/facet-year-range.mock.d.ts +2 -0
- package/lib/components/footer/footer.d.ts +118 -0
- package/lib/components/footer/footer.mock.d.ts +2 -0
- package/lib/components/header/header.d.ts +281 -0
- package/lib/components/header/header.mock.d.ts +2 -0
- package/lib/components/hero/hero.d.ts +75 -0
- package/lib/components/hero/hero.mock.d.ts +2 -0
- package/lib/components/histogram-range/histogram-range.d.ts +113 -0
- package/lib/components/histogram-range/histogram-range.mock.d.ts +2 -0
- package/lib/components/image-viewer/image-viewer.d.ts +61 -0
- package/lib/components/image-viewer/image-viewer.mock.d.ts +2 -0
- package/lib/components/image-viewer-tools/image-viewer-tools.d.ts +116 -0
- package/lib/components/image-viewer-tools/image-viewer-tools.mock.d.ts +2 -0
- package/lib/components/inner-title/inner-title.d.ts +61 -0
- package/lib/components/inner-title/inner-title.mock.d.ts +2 -0
- package/lib/components/input-checkbox/input-checkbox.d.ts +67 -0
- package/lib/components/input-checkbox/input-checkbox.mock.d.ts +2 -0
- package/lib/components/input-link/input-link.d.ts +54 -0
- package/lib/components/input-link/input-link.mock.d.ts +2 -0
- package/lib/components/input-select/input-select.d.ts +67 -0
- package/lib/components/input-select/input-select.mock.d.ts +2 -0
- package/lib/components/input-text/input-text.d.ts +81 -0
- package/lib/components/input-text/input-text.mock.d.ts +2 -0
- package/lib/components/item-preview/item-preview.d.ts +93 -0
- package/lib/components/item-preview/item-preview.mock.d.ts +2 -0
- package/lib/components/loader/loader.d.ts +22 -0
- package/lib/components/loader/loader.mock.d.ts +2 -0
- package/lib/components/map/map.d.ts +69 -0
- package/lib/components/map/map.mock.d.ts +2 -0
- package/lib/components/metadata-viewer/metadata-viewer.d.ts +65 -0
- package/lib/components/metadata-viewer/metadata-viewer.mock.d.ts +8 -0
- package/lib/components/nav/nav.d.ts +66 -0
- package/lib/components/nav/nav.mock.d.ts +2 -0
- package/lib/components/pagination/pagination.d.ts +94 -0
- package/lib/components/pagination/pagination.mock.d.ts +2 -0
- package/lib/components/progress-line/progress-line.d.ts +23 -0
- package/lib/components/progress-line/progress-line.mock.d.ts +2 -0
- package/lib/components/sidebar-header/sidebar-header.d.ts +44 -0
- package/lib/components/sidebar-header/sidebar-header.mock.d.ts +2 -0
- package/lib/components/signup/signup.d.ts +109 -0
- package/lib/components/signup/signup.mock.d.ts +2 -0
- package/lib/components/simple-autocomplete/simple-autocomplete.d.ts +40 -0
- package/lib/components/simple-autocomplete/simple-autocomplete.mock.d.ts +2 -0
- package/lib/components/table/table.d.ts +89 -0
- package/lib/components/table/table.mock.d.ts +2 -0
- package/lib/components/tag/tag.d.ts +45 -0
- package/lib/components/tag/tag.mock.d.ts +2 -0
- package/lib/components/text-viewer/text-viewer.d.ts +34 -0
- package/lib/components/text-viewer/text-viewer.mock.d.ts +2 -0
- package/lib/components/timeline/timeline.d.ts +30 -0
- package/lib/components/timeline/timeline.mock.d.ts +2 -0
- package/lib/components/toast/toast.d.ts +84 -0
- package/lib/components/toast/toast.mock.d.ts +2 -0
- package/lib/components/tooltip-content/tooltip-content.d.ts +24 -0
- package/lib/components/tooltip-content/tooltip-content.mock.d.ts +2 -0
- package/lib/components/tree/tree.d.ts +79 -0
- package/lib/components/tree/tree.mock.d.ts +2 -0
- package/lib/components/wizard/wizard.d.ts +57 -0
- package/lib/components/wizard/wizard.mock.d.ts +2 -0
- package/lib/dv-components-lib.module.d.ts +50 -0
- package/lib/shared-interfaces.d.ts +60 -0
- package/net7-components.d.ts +5 -0
- package/package.json +44 -0
- package/public-api.d.ts +85 -0
- package/src/lib/styles/_imports.scss +77 -0
- package/src/lib/styles/atoms/_button.scss +205 -0
- package/src/lib/styles/components/_advanced-autocomplete.scss +190 -0
- package/src/lib/styles/components/_alert.scss +115 -0
- package/src/lib/styles/components/_anchor-wrapper.scss +29 -0
- package/src/lib/styles/components/_breadcrumbs.scss +99 -0
- package/src/lib/styles/components/_bubble-chart.scss +33 -0
- package/src/lib/styles/components/_carousel.scss +184 -0
- package/src/lib/styles/components/_chart.scss +28 -0
- package/src/lib/styles/components/_content-placeholder.scss +74 -0
- package/src/lib/styles/components/_data-widget.scss +93 -0
- package/src/lib/styles/components/_datepicker.scss +29 -0
- package/src/lib/styles/components/_facet-header.scss +58 -0
- package/src/lib/styles/components/_facet-year-range.scss +63 -0
- package/src/lib/styles/components/_facet.scss +164 -0
- package/src/lib/styles/components/_footer.scss +116 -0
- package/src/lib/styles/components/_header.scss +474 -0
- package/src/lib/styles/components/_hero.scss +207 -0
- package/src/lib/styles/components/_histogram-range.scss +36 -0
- package/src/lib/styles/components/_image-viewer-tools.scss +225 -0
- package/src/lib/styles/components/_image-viewer.scss +173 -0
- package/src/lib/styles/components/_inner-title.scss +161 -0
- package/src/lib/styles/components/_input-checkbox.scss +50 -0
- package/src/lib/styles/components/_input-link.scss +78 -0
- package/src/lib/styles/components/_input-select.scss +25 -0
- package/src/lib/styles/components/_input-text.scss +53 -0
- package/src/lib/styles/components/_item-preview.scss +218 -0
- package/src/lib/styles/components/_loader.scss +54 -0
- package/src/lib/styles/components/_map.scss +31 -0
- package/src/lib/styles/components/_metadata-viewer.scss +52 -0
- package/src/lib/styles/components/_nav.scss +57 -0
- package/src/lib/styles/components/_pagination.scss +170 -0
- package/src/lib/styles/components/_progress-line.scss +53 -0
- package/src/lib/styles/components/_sidebar-header.scss +69 -0
- package/src/lib/styles/components/_signup.scss +157 -0
- package/src/lib/styles/components/_simple-autocomplete.scss +60 -0
- package/src/lib/styles/components/_table.scss +129 -0
- package/src/lib/styles/components/_tag.scss +51 -0
- package/src/lib/styles/components/_text-viewer.scss +446 -0
- package/src/lib/styles/components/_timeline.scss +29 -0
- package/src/lib/styles/components/_toast.scss +99 -0
- package/src/lib/styles/components/_tooltip-content.scss +29 -0
- package/src/lib/styles/components/_tree.scss +208 -0
- package/src/lib/styles/components/_wizard.scss +150 -0
- package/src/lib/styles/generic/_color_scheme.scss +27 -0
- package/src/lib/styles/generic/_mixins.scss +81 -0
- package/src/lib/styles/generic/_variables.scss +385 -0
- package/src/lib/styles/global/_forms.scss +122 -0
- package/src/lib/styles/global/_global.scss +46 -0
- package/src/lib/styles/global/_normalize.scss +433 -0
- package/src/lib/styles/global/_typography.scss +88 -0
- package/src/lib/styles/utilities/_grids.scss +361 -0
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
/* eslint-disable no-use-before-define */
|
|
2
|
+
//---------------------------
|
|
3
|
+
// HISTOGRAM-RANGE.ts
|
|
4
|
+
//---------------------------
|
|
5
|
+
import { Component, Input } from '@angular/core';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "@angular/common";
|
|
8
|
+
export class HistogramRangeComponent {
|
|
9
|
+
constructor() {
|
|
10
|
+
this.sliders = [];
|
|
11
|
+
this._loaded = false;
|
|
12
|
+
this.draw = () => {
|
|
13
|
+
const { d3 } = this;
|
|
14
|
+
const { width, margin, height, items, colours, containerId, axis, setSliders } = this.data;
|
|
15
|
+
// data validation
|
|
16
|
+
const rangeMode = items.every((d) => d.range);
|
|
17
|
+
if (!rangeMode && items.some((d) => !d.range)) {
|
|
18
|
+
throw Error('All items must have the "range" property');
|
|
19
|
+
}
|
|
20
|
+
// Helpers - Start:
|
|
21
|
+
const LABELtoX = d3
|
|
22
|
+
.scaleBand()
|
|
23
|
+
.domain(items.map((d) => d.label))
|
|
24
|
+
.range([0, width])
|
|
25
|
+
.paddingInner(0.17)
|
|
26
|
+
.paddingOuter(1);
|
|
27
|
+
const XtoLABEL = (value) => {
|
|
28
|
+
const domain = LABELtoX.domain();
|
|
29
|
+
const paddingOuter = LABELtoX(domain[0]);
|
|
30
|
+
const eachBand = LABELtoX.step();
|
|
31
|
+
const index = Math.floor(((value - paddingOuter) / eachBand));
|
|
32
|
+
return domain[Math.max(0, Math.min(index, domain.length - 1))];
|
|
33
|
+
};
|
|
34
|
+
// YEAR SELECTION CIRCLES
|
|
35
|
+
// let sliders;
|
|
36
|
+
if (setSliders && this.sliders) {
|
|
37
|
+
this.sliders = setSliders
|
|
38
|
+
.map((d) => ({ x: LABELtoX(d) + LABELtoX.bandwidth() / 2, y: height }));
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
this.sliders = d3
|
|
42
|
+
.extent(items, (d) => d.label)
|
|
43
|
+
.map((d) => ({ x: LABELtoX(d) + LABELtoX.bandwidth() / 2, y: height }));
|
|
44
|
+
}
|
|
45
|
+
const isInRange = (y) => {
|
|
46
|
+
const allItems = this.sliders.map((d) => XtoLABEL(d.x));
|
|
47
|
+
if (y >= d3.min(allItems) && y <= d3.max(allItems))
|
|
48
|
+
return true;
|
|
49
|
+
return false;
|
|
50
|
+
};
|
|
51
|
+
function colourBars(d) {
|
|
52
|
+
if (isInRange(d.label))
|
|
53
|
+
return 'url(#gradient)';
|
|
54
|
+
return '#e3e3e3';
|
|
55
|
+
}
|
|
56
|
+
this.colourBars = colourBars;
|
|
57
|
+
this.getSelectedRange = () => {
|
|
58
|
+
const rangeStart = items.find((it) => it.label === XtoLABEL(this.sliders[0].x));
|
|
59
|
+
const rangeEnd = items.find((it) => it.label === XtoLABEL(this.sliders[1].x));
|
|
60
|
+
return [
|
|
61
|
+
rangeStart.payload,
|
|
62
|
+
rangeMode
|
|
63
|
+
? rangeEnd.range.payload
|
|
64
|
+
: rangeEnd.payload
|
|
65
|
+
];
|
|
66
|
+
};
|
|
67
|
+
// Helpers - End.
|
|
68
|
+
// clear HTML contents
|
|
69
|
+
document.getElementById(containerId).innerHTML = '';
|
|
70
|
+
const svg = d3
|
|
71
|
+
.select(`#${containerId}`)
|
|
72
|
+
.attr('viewBox', `0 0 ${width + margin.left + margin.right} ${height + margin.top + margin.bottom}`);
|
|
73
|
+
const scaleHeight = d3
|
|
74
|
+
.scaleSymlog() // most similar scale to the original
|
|
75
|
+
.domain([0, d3.max(items, (d) => d.value)])
|
|
76
|
+
.range([height, 0]);
|
|
77
|
+
// GRADIENT
|
|
78
|
+
const defs = svg.append('defs'); // definitions
|
|
79
|
+
const gradient = defs
|
|
80
|
+
.append('linearGradient')
|
|
81
|
+
.attr('id', 'gradient')
|
|
82
|
+
.attr('gradientUnits', 'userSpaceOnUse')
|
|
83
|
+
.attr('x1', 0)
|
|
84
|
+
.attr('y1', height)
|
|
85
|
+
.attr('x2', 0)
|
|
86
|
+
.attr('y2', margin.top);
|
|
87
|
+
gradient
|
|
88
|
+
.append('stop')
|
|
89
|
+
.attr('class', 'start')
|
|
90
|
+
.attr('offset', '0%')
|
|
91
|
+
.attr('stop-color', colours.bottom) // bottom gradient
|
|
92
|
+
.attr('stop-opacity', 1);
|
|
93
|
+
gradient
|
|
94
|
+
.append('stop')
|
|
95
|
+
.attr('class', 'end')
|
|
96
|
+
.attr('offset', '100%')
|
|
97
|
+
.attr('stop-color', colours.top) // top gradient
|
|
98
|
+
.attr('stop-opacity', 1);
|
|
99
|
+
// DRAW INSIDE MARGINS
|
|
100
|
+
const g = svg
|
|
101
|
+
.append('g')
|
|
102
|
+
.attr('class', 'chart')
|
|
103
|
+
.attr('transform', `translate(${margin.left},${margin.top})`);
|
|
104
|
+
const barsLayer = g.append('g').attr('class', 'bars');
|
|
105
|
+
const controlsLayer = g.append('g').attr('class', 'controls');
|
|
106
|
+
// BAR CHART
|
|
107
|
+
barsLayer // bars
|
|
108
|
+
.selectAll('rect.bars')
|
|
109
|
+
.data(items)
|
|
110
|
+
.join('rect')
|
|
111
|
+
.attr('class', 'bars')
|
|
112
|
+
.attr('width', LABELtoX.bandwidth)
|
|
113
|
+
.attr('height', (d) => height - scaleHeight(d.value))
|
|
114
|
+
.attr('y', (d) => scaleHeight(d.value))
|
|
115
|
+
.attr('x', (d) => LABELtoX(d.label))
|
|
116
|
+
.attr('data-start', (d) => d.payload) // make the data easily accessible
|
|
117
|
+
.attr('data-end', (d) => (d.range ? d.range.payload : d.payload))
|
|
118
|
+
.attr('fill', 'url(#gradient)');
|
|
119
|
+
barsLayer // catch bar events
|
|
120
|
+
.on('mousemove', (event) => {
|
|
121
|
+
const year = XtoLABEL(event.offsetX - margin.left);
|
|
122
|
+
d3.selectAll('rect.bars').attr('fill', (d) => {
|
|
123
|
+
if (year === d.label)
|
|
124
|
+
return '#B0CCF8';
|
|
125
|
+
return colourBars(d);
|
|
126
|
+
});
|
|
127
|
+
})
|
|
128
|
+
.on('mouseout', () => {
|
|
129
|
+
d3.selectAll('rect.bars').attr('fill', (d) => colourBars(d));
|
|
130
|
+
})
|
|
131
|
+
.on('click', (event) => {
|
|
132
|
+
const label = XtoLABEL(event.offsetX - margin.left);
|
|
133
|
+
const xAxisValue = LABELtoX(label) + LABELtoX.bandwidth() / 2;
|
|
134
|
+
const newValue = {
|
|
135
|
+
x: xAxisValue,
|
|
136
|
+
y: height
|
|
137
|
+
};
|
|
138
|
+
this.sliders = [
|
|
139
|
+
// avoid joining the two objects!
|
|
140
|
+
{ ...newValue },
|
|
141
|
+
{ ...newValue }
|
|
142
|
+
];
|
|
143
|
+
rangePicker
|
|
144
|
+
.data(this.sliders)
|
|
145
|
+
.select('circle')
|
|
146
|
+
.transition()
|
|
147
|
+
.ease(d3.easeQuadOut)
|
|
148
|
+
.duration(550)
|
|
149
|
+
.attr('cx', (d) => d.x);
|
|
150
|
+
controlsLayer
|
|
151
|
+
.select('path.blueline')
|
|
152
|
+
.transition()
|
|
153
|
+
.ease(d3.easeQuadOut)
|
|
154
|
+
.duration(550)
|
|
155
|
+
.attr('d', d3.line()(this.sliders.map((d) => [d.x, d.y])));
|
|
156
|
+
controlsLayer
|
|
157
|
+
.selectAll('text')
|
|
158
|
+
.transition()
|
|
159
|
+
.ease(d3.easeQuadOut)
|
|
160
|
+
.duration(550)
|
|
161
|
+
.attr('x', () => xAxisValue)
|
|
162
|
+
.text((d, i) => {
|
|
163
|
+
if (!rangeMode)
|
|
164
|
+
return label;
|
|
165
|
+
const item = items.find((it) => it.label === label);
|
|
166
|
+
if (i > 0)
|
|
167
|
+
return item.range.label;
|
|
168
|
+
return item.label;
|
|
169
|
+
});
|
|
170
|
+
g.selectAll('rect.bars').attr('fill', (d) => colourBars(d));
|
|
171
|
+
this.textCollision(this.sliders);
|
|
172
|
+
this.emit('rangeselected', this.getSelectedRange());
|
|
173
|
+
});
|
|
174
|
+
controlsLayer // gray line
|
|
175
|
+
.append('path')
|
|
176
|
+
.attr('class', 'grayline')
|
|
177
|
+
.attr('d', d3.line()([
|
|
178
|
+
[0, height],
|
|
179
|
+
[width, height]
|
|
180
|
+
]))
|
|
181
|
+
.attr('stroke-width', 2)
|
|
182
|
+
.attr('opacity', 1)
|
|
183
|
+
.attr('stroke', '#C1C5C7');
|
|
184
|
+
controlsLayer // blue line
|
|
185
|
+
.append('path')
|
|
186
|
+
.attr('class', 'blueline')
|
|
187
|
+
.attr('d', d3.line()(this.sliders.map((d) => [d.x, d.y])))
|
|
188
|
+
.attr('stroke-width', 2)
|
|
189
|
+
.attr('stroke', colours.accent);
|
|
190
|
+
const rangePicker = controlsLayer
|
|
191
|
+
.selectAll('g.rangepicker')
|
|
192
|
+
.data(this.sliders.sort((a, b) => d3.ascending(a.x, b.x)))
|
|
193
|
+
.join('g')
|
|
194
|
+
.attr('class', 'rangepicker');
|
|
195
|
+
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
196
|
+
const self = this; // FIXME: Allow use of class "this" inside dragging update;
|
|
197
|
+
/**
|
|
198
|
+
* Animate the elements while the user is dragging one of the range selectors
|
|
199
|
+
*/
|
|
200
|
+
function draggingUpdate(event, data) {
|
|
201
|
+
const label = XtoLABEL(event.x);
|
|
202
|
+
const xAxisValue = LABELtoX(label) + LABELtoX.bandwidth() / 2;
|
|
203
|
+
const yb = [];
|
|
204
|
+
g.selectAll('circle').each(function setBallPosition() {
|
|
205
|
+
yb.push({ x: +d3.select(this).attr('cx'), y: height });
|
|
206
|
+
});
|
|
207
|
+
self.sliders = yb.sort((a, b) => d3.ascending(a.x, b.x));
|
|
208
|
+
// move the circle
|
|
209
|
+
d3.select(this)
|
|
210
|
+
.select('circle')
|
|
211
|
+
.attr('cx', data.x = xAxisValue);
|
|
212
|
+
// move the blue line
|
|
213
|
+
controlsLayer
|
|
214
|
+
.select('path.blueline')
|
|
215
|
+
.attr('d', d3.line()(self.sliders.map((d) => [d.x, d.y])));
|
|
216
|
+
// change the text position
|
|
217
|
+
d3.select(this)
|
|
218
|
+
.select('text')
|
|
219
|
+
.attr('x', () => xAxisValue);
|
|
220
|
+
// change the text values
|
|
221
|
+
controlsLayer
|
|
222
|
+
.selectAll('text')
|
|
223
|
+
.text((d) => {
|
|
224
|
+
const l = XtoLABEL(d.x);
|
|
225
|
+
if (!rangeMode)
|
|
226
|
+
return l;
|
|
227
|
+
const position = self.sliders.findIndex((slider) => slider.x === d.x);
|
|
228
|
+
const range = self.getSelectedRange();
|
|
229
|
+
if (position === 1)
|
|
230
|
+
return range[1];
|
|
231
|
+
return range[0];
|
|
232
|
+
});
|
|
233
|
+
self.textCollision(self.sliders);
|
|
234
|
+
// colour the bars
|
|
235
|
+
g.selectAll('rect.bars').attr('fill', (d) => colourBars(d));
|
|
236
|
+
}
|
|
237
|
+
rangePicker // drag handler
|
|
238
|
+
.call(d3.drag()
|
|
239
|
+
.on('drag', draggingUpdate)
|
|
240
|
+
.on('end', (event, data) => {
|
|
241
|
+
// update one last time to prevent desyncing
|
|
242
|
+
draggingUpdate(event, data);
|
|
243
|
+
// emit the selected range
|
|
244
|
+
this.emit('rangeselected', this.getSelectedRange());
|
|
245
|
+
}));
|
|
246
|
+
rangePicker
|
|
247
|
+
.append('circle')
|
|
248
|
+
.attr('cx', (d) => d.x)
|
|
249
|
+
.attr('cy', (d) => d.y)
|
|
250
|
+
.attr('r', 9)
|
|
251
|
+
.attr('fill', 'white')
|
|
252
|
+
.attr('stroke-width', 2)
|
|
253
|
+
.attr('stroke', colours.accent)
|
|
254
|
+
.attr('style', 'cursor: pointer');
|
|
255
|
+
rangePicker
|
|
256
|
+
.attr('text-anchor', 'middle')
|
|
257
|
+
.attr('font-family', 'Roboto, Arial, sans-serif')
|
|
258
|
+
.attr('font-size', '12px')
|
|
259
|
+
.append('text')
|
|
260
|
+
.attr('y', (d) => d.y + margin.bottom / 2)
|
|
261
|
+
.attr('x', (d) => d.x)
|
|
262
|
+
.attr('fill', colours.accent)
|
|
263
|
+
.text((d, i) => {
|
|
264
|
+
const l = XtoLABEL(d.x);
|
|
265
|
+
if (rangeMode && i === 1) {
|
|
266
|
+
return items.find((item) => item.label === l).range.label;
|
|
267
|
+
}
|
|
268
|
+
return l;
|
|
269
|
+
});
|
|
270
|
+
if (axis?.yAxis?.show) {
|
|
271
|
+
const yAxis = d3.axisLeft(scaleHeight)
|
|
272
|
+
.ticks(axis.yAxis.tickAmount ?? 2)
|
|
273
|
+
.tickValues(axis.yAxis.values ? axis.yAxis.values : null);
|
|
274
|
+
const yAxisGroup = svg.append('g')
|
|
275
|
+
.attr('transform', `translate(${margin.left}, ${margin.top})`)
|
|
276
|
+
.call(yAxis);
|
|
277
|
+
yAxisGroup.selectAll('path, line').style('stroke', colours.accent);
|
|
278
|
+
yAxisGroup.selectAll('text').style('fill', colours.accent);
|
|
279
|
+
}
|
|
280
|
+
};
|
|
281
|
+
/** Avoid collision of the slider labels */
|
|
282
|
+
this.textCollision = (sliders) => {
|
|
283
|
+
// pre-requisites
|
|
284
|
+
const controlsLayer = this.d3.select('g.chart').select('g.controls');
|
|
285
|
+
const { items, margin } = this.data;
|
|
286
|
+
const rangeMode = items.every((d) => d.range);
|
|
287
|
+
// run collision detection
|
|
288
|
+
const isColliding = sliders[0].x === sliders[1].x;
|
|
289
|
+
if (rangeMode && isColliding) {
|
|
290
|
+
controlsLayer
|
|
291
|
+
.selectAll('text')
|
|
292
|
+
.attr('y', (d, i) => (i > 0 ? d.y + margin.bottom / 2 + 12 : d.y + margin.bottom / 2))
|
|
293
|
+
.text((d, i) => {
|
|
294
|
+
const range = this.getSelectedRange();
|
|
295
|
+
return range[i];
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
else {
|
|
299
|
+
controlsLayer
|
|
300
|
+
.selectAll('text')
|
|
301
|
+
.attr('y', (d) => d.y + margin.bottom / 2);
|
|
302
|
+
}
|
|
303
|
+
};
|
|
304
|
+
/** Public api that allows to dinamically change the bars */
|
|
305
|
+
this.setBars = (newBars) => {
|
|
306
|
+
this.data.items = newBars;
|
|
307
|
+
this.draw();
|
|
308
|
+
this.d3.selectAll('rect.bars').attr('fill', (d) => this.colourBars(d));
|
|
309
|
+
};
|
|
310
|
+
/** Public api that allows to dinamically change the slider position */
|
|
311
|
+
this.setSliders = ([startLabel, endLabel]) => {
|
|
312
|
+
this.data.setSliders = [`${startLabel}`, `${endLabel}`];
|
|
313
|
+
this.draw();
|
|
314
|
+
this.d3.selectAll('rect.bars').attr('fill', (d) => this.colourBars(d));
|
|
315
|
+
const range = this.getSelectedRange();
|
|
316
|
+
this.emit('rangeselected', range);
|
|
317
|
+
this.textCollision(this.sliders);
|
|
318
|
+
return range;
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
ngAfterContentChecked() {
|
|
322
|
+
/*
|
|
323
|
+
Waits for the dom to be loaded, then fires the draw function
|
|
324
|
+
that renders the chart.
|
|
325
|
+
*/
|
|
326
|
+
if (this.data) {
|
|
327
|
+
if (this._loaded)
|
|
328
|
+
return;
|
|
329
|
+
this._loaded = true;
|
|
330
|
+
setTimeout(() => {
|
|
331
|
+
import('d3').then((module) => {
|
|
332
|
+
this.d3 = module;
|
|
333
|
+
this.draw();
|
|
334
|
+
this.emitLoaded(true);
|
|
335
|
+
if (this.data && this.data.setDraw) {
|
|
336
|
+
this.data.setDraw(this.draw);
|
|
337
|
+
}
|
|
338
|
+
if (this.data.setApi) { // expose the component api
|
|
339
|
+
this.data.setApi({
|
|
340
|
+
setSliders: this.setSliders,
|
|
341
|
+
setBars: this.setBars,
|
|
342
|
+
});
|
|
343
|
+
}
|
|
344
|
+
// eslint-disable-next-line dot-notation
|
|
345
|
+
window['setSliders'] = this.setSliders;
|
|
346
|
+
});
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
/** Get x-axis position from label */
|
|
351
|
+
labelToX() {
|
|
352
|
+
return this.d3
|
|
353
|
+
.scaleBand()
|
|
354
|
+
.domain(this.data.items.map((d) => d.label))
|
|
355
|
+
.range([0, this.data.width])
|
|
356
|
+
.paddingInner(0.17)
|
|
357
|
+
.paddingOuter(1);
|
|
358
|
+
}
|
|
359
|
+
/** Emits an event when the component has loaded */
|
|
360
|
+
emitLoaded(payload) {
|
|
361
|
+
if (!this.emit)
|
|
362
|
+
return;
|
|
363
|
+
this.emit('loaded', payload);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
HistogramRangeComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: HistogramRangeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
367
|
+
HistogramRangeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.2", type: HistogramRangeComponent, selector: "n7-histogram-range", inputs: { data: "data", emit: "emit" }, ngImport: i0, template: "<div *ngIf=\"data\" class=\"n7-histogram-range\">\n <svg #histogramRange [id]=\"data.containerId\"></svg>\n</div>\n", directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
|
|
368
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: HistogramRangeComponent, decorators: [{
|
|
369
|
+
type: Component,
|
|
370
|
+
args: [{ selector: 'n7-histogram-range', template: "<div *ngIf=\"data\" class=\"n7-histogram-range\">\n <svg #histogramRange [id]=\"data.containerId\"></svg>\n</div>\n" }]
|
|
371
|
+
}], propDecorators: { data: [{
|
|
372
|
+
type: Input
|
|
373
|
+
}], emit: [{
|
|
374
|
+
type: Input
|
|
375
|
+
}] } });
|
|
376
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlzdG9ncmFtLXJhbmdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZHYtY29tcG9uZW50cy1saWIvc3JjL2xpYi9jb21wb25lbnRzL2hpc3RvZ3JhbS1yYW5nZS9oaXN0b2dyYW0tcmFuZ2UudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kdi1jb21wb25lbnRzLWxpYi9zcmMvbGliL2NvbXBvbmVudHMvaGlzdG9ncmFtLXJhbmdlL2hpc3RvZ3JhbS1yYW5nZS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlDQUF5QztBQUN6Qyw2QkFBNkI7QUFDN0IscUJBQXFCO0FBQ3JCLDZCQUE2QjtBQUU3QixPQUFPLEVBQXVCLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7OztBQTJGdEUsTUFBTSxPQUFPLHVCQUF1QjtJQUpwQztRQVdZLFlBQU8sR0FBWSxFQUFFLENBQUM7UUFFdEIsWUFBTyxHQUFHLEtBQUssQ0FBQztRQW1DeEIsU0FBSSxHQUFHLEdBQUcsRUFBRTtZQUNSLE1BQU0sRUFBRSxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUM7WUFDcEIsTUFBTSxFQUNGLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUNyQixLQUFLLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFDM0IsSUFBSSxFQUFFLFVBQVUsRUFDbkIsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBRWQsa0JBQWtCO1lBQ2xCLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM5QyxJQUFJLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUMzQyxNQUFNLEtBQUssQ0FBQyww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RCxtREFBbUQ7SUFDbkQsVUFBVSxDQUFDLE9BQU87UUFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2pDLENBQUM7O29IQXRZUSx1QkFBdUI7d0dBQXZCLHVCQUF1QixrR0NoR3BDLHdIQUdBOzJGRDZGYSx1QkFBdUI7a0JBSm5DLFNBQVM7K0JBQ0ksb0JBQW9COzhCQUlyQixJQUFJO3NCQUFaLEtBQUs7Z0JBRUcsSUFBSTtzQkFBWixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tdXNlLWJlZm9yZS1kZWZpbmUgKi9cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBISVNUT0dSQU0tUkFOR0UudHNcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmltcG9ydCB7IEFmdGVyQ29udGVudENoZWNrZWQsIENvbXBvbmVudCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbi8qKlxuICogSW50ZXJmYWNlIGZvciBIaXN0b2dyYW1SYW5nZUNvbXBvbmVudCdzIFwiZGF0YVwiXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGlzdG9ncmFtUmFuZ2VEYXRhIHtcbiAgICAvKipcbiAgICAgKiB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGhpc3RvZ3JhbS1yYW5nZSBzdmdcbiAgICAgKi9cbiAgICBjb250YWluZXJJZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIHRvdGFsIHdpZHRoIGZvciB0aGUgc3ZnIGVsZW1lbnRcbiAgICAgKi9cbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIHRvdGFsIGhlaWdodCBmb3IgdGhlIHN2ZyBlbGVtZW50XG4gICAgICovXG4gICAgaGVpZ2h0OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgbWFyZ2lucyBvZiB0aGUgc3ZnXG4gICAgICovXG4gICAgbWFyZ2luOiB7XG4gICAgICAgIGxlZnQ6IG51bWJlcjtcbiAgICAgICAgcmlnaHQ6IG51bWJlcjtcbiAgICAgICAgdG9wOiBudW1iZXI7XG4gICAgICAgIGJvdHRvbTogbnVtYmVyO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogVGhlbWUgb2YgdGhlIGhpc3RvZ3JhbVxuICAgICAqL1xuICAgIGNvbG91cnM6IHtcbiAgICAgICAgdG9wOiBzdHJpbmc7XG4gICAgICAgIGJvdHRvbTogc3RyaW5nO1xuICAgICAgICBhY2NlbnQ6IHN0cmluZztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERhdGEgZm9yIHRoZSBoaXN0b2dyYW0gYmFyc1xuICAgICAqL1xuICAgIGl0ZW1zOiB7XG4gICAgICAgIC8qKiBkZWZhdWx0IGxhYmVsIG9mIHRoZSBpdGVtICovXG4gICAgICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgICAgIC8qKiB5LWF4aXMgdmFsdWUgb2YgdGhlIGJhciAoaGVpZ2h0KSAqL1xuICAgICAgICB2YWx1ZTogbnVtYmVyO1xuICAgICAgICAvKiogcGF5bG9hZCB0aGF0IHRoZSBpdGVtIHNob3VsZCBlbWl0IHdoZW4gc2VsZWN0ZWQgKi9cbiAgICAgICAgcGF5bG9hZDogYW55O1xuICAgICAgICAvKipcbiAgICAgICAgICogJ3VwcGVyJyB2YWx1ZXMgb2YgdGhlIHJhbmdlLlxuICAgICAgICAgKiBvbmx5IHVzZWQgd2hlbiBlYWNoIGJhciByZXByZXNlbnRzIGEgcmFuZ2UuXG4gICAgICAgICAqL1xuICAgICAgICByYW5nZT86IHtcbiAgICAgICAgICAgIC8qKiBsYWJlbCBsb2FkZWQgd2hlbiBzZWxlY3RlZCBieSB0aGUgcmlnaHQtbW9zdCBwb2ludGVyICovXG4gICAgICAgICAgICBsYWJlbDogc3RyaW5nO1xuICAgICAgICAgICAgLyoqIHBheWxvYWQgZW1pdHRlZCB3aGVuIHNlbGVjdGVkIGJ5IHRoZSByaWdodC1tb3N0IHBvaW50ZXIgKi9cbiAgICAgICAgICAgIHBheWxvYWQ6IGFueTtcbiAgICAgICAgfTtcbiAgICB9W107XG4gICAgLyoqXG4gICAgICogQXhpcyBzZXR0aW5nc1xuICAgICAqL1xuICAgIGF4aXM/OiB7XG4gICAgICAgIC8qKiBZIEF4aXMgc2V0dGluZ3MgKi9cbiAgICAgICAgeUF4aXM/OiB7XG4gICAgICAgICAgICAvKiogVHVybiBvbiBhbmQgb2ZmIHRoZSBheGlzICovXG4gICAgICAgICAgICBzaG93PzogYm9vbGVhbjtcbiAgICAgICAgICAgIC8qKiBNYW51YWxseSBzZXQgdGhlIGF4aXMgdmFsdWVzIHRvIHNob3cgKi9cbiAgICAgICAgICAgIHZhbHVlcz86IG51bWJlcltdO1xuICAgICAgICAgICAgLyoqIEhvdyBtYW55IHRpY2tzIGRvIHlvdSB3YW50IHRvIHNlZSAqL1xuICAgICAgICAgICAgdGlja0Ftb3VudD86IG51bWJlcjtcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIGV4cG9zZSB0aGUgZHJhdyBmdW5jdGlvbiBvdXRzaWRlIG9mIG43LWZyb250ZW5kL2NvbXBvbmVudHMgbGlicmFyeVxuICAgICAqIHRoaXMgaXMgbmVlZGVkIHRvIHJlZHJhdyBidWJibGUtY2hhcnQtY29tcG9uZW50IG9uIGNvbW1hbmRcbiAgICAgKi9cbiAgICBzZXREcmF3PzogYW55O1xuICAgIC8qKlxuICAgICAqIHNldFNsaWRlcnNcbiAgICAgKi9cbiAgICBzZXRTbGlkZXJzPzogTGFiZWxDb3VwbGU7XG4gICAgLyoqXG4gICAgICogUHVibGljIGFwaVxuICAgICAqL1xuICAgIHNldEFwaT86IGFueTtcbn1cblxudHlwZSBTbGlkZXJzID0geyB4OiBudW1iZXI7IHk6IG51bWJlciB9W107XG50eXBlIExhYmVsQ291cGxlID0gW3N0cmluZywgc3RyaW5nXTtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICduNy1oaXN0b2dyYW0tcmFuZ2UnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9oaXN0b2dyYW0tcmFuZ2UuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgSGlzdG9ncmFtUmFuZ2VDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRDaGVja2VkIHtcbiAgICBASW5wdXQoKSBkYXRhOiBIaXN0b2dyYW1SYW5nZURhdGE7XG5cbiAgICBASW5wdXQoKSBlbWl0OiBhbnk7XG5cbiAgICBwcml2YXRlIGQzO1xuXG4gICAgcHJpdmF0ZSBzbGlkZXJzOiBTbGlkZXJzID0gW107XG5cbiAgICBwcml2YXRlIF9sb2FkZWQgPSBmYWxzZTtcblxuICAgIHByaXZhdGUgY29sb3VyQmFycztcblxuICAgIHByaXZhdGUgZ2V0U2VsZWN0ZWRSYW5nZTtcblxuICAgIG5nQWZ0ZXJDb250ZW50Q2hlY2tlZCgpIHtcbiAgICAgICAgLypcbiAgICAgICAgIFdhaXRzIGZvciB0aGUgZG9tIHRvIGJlIGxvYWRlZCwgdGhlbiBmaXJlcyB0aGUgZHJhdyBmdW5jdGlvblxuICAgICAgICAgdGhhdCByZW5kZXJzIHRoZSBjaGFydC5cbiAgICAgICAgKi9cbiAgICAgICAgaWYgKHRoaXMuZGF0YSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2xvYWRlZCkgcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy5fbG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGltcG9ydCgnZDMnKS50aGVuKChtb2R1bGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kMyA9IG1vZHVsZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmF3KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdExvYWRlZCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSAmJiB0aGlzLmRhdGEuc2V0RHJhdykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnNldERyYXcodGhpcy5kcmF3KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhLnNldEFwaSkgeyAvLyBleHBvc2UgdGhlIGNvbXBvbmVudCBhcGlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5zZXRBcGkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNsaWRlcnM6IHRoaXMuc2V0U2xpZGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRCYXJzOiB0aGlzLnNldEJhcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZG90LW5vdGF0aW9uXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvd1snc2V0U2xpZGVycyddID0gdGhpcy5zZXRTbGlkZXJzO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkcmF3ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCB7IGQzIH0gPSB0aGlzO1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICB3aWR0aCwgbWFyZ2luLCBoZWlnaHQsXG4gICAgICAgICAgICBpdGVtcywgY29sb3VycywgY29udGFpbmVySWQsXG4gICAgICAgICAgICBheGlzLCBzZXRTbGlkZXJzXG4gICAgICAgIH0gPSB0aGlzLmRhdGE7XG5cbiAgICAgICAgLy8gZGF0YSB2YWxpZGF0aW9uXG4gICAgICAgIGNvbnN0IHJhbmdlTW9kZSA9IGl0ZW1zLmV2ZXJ5KChkKSA9PiBkLnJhbmdlKTtcbiAgICAgICAgaWYgKCFyYW5nZU1vZGUgJiYgaXRlbXMuc29tZSgoZCkgPT4gIWQucmFuZ2UpKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignQWxsIGl0ZW1zIG11c3QgaGF2ZSB0aGUgXCJyYW5nZVwiIHByb3BlcnR5Jyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIZWxwZXJzIC0gU3RhcnQ6XG4gICAgICAgIGNvbnN0IExBQkVMdG9YID0gZDNcbiAgICAgICAgICAgIC5zY2FsZUJhbmQoKVxuICAgICAgICAgICAgLmRvbWFpbihpdGVtcy5tYXAoKGQpID0+IGQubGFiZWwpKVxuICAgICAgICAgICAgLnJhbmdlKFswLCB3aWR0aF0pXG4gICAgICAgICAgICAucGFkZGluZ0lubmVyKDAuMTcpXG4gICAgICAgICAgICAucGFkZGluZ091dGVyKDEpO1xuXG4gICAgICAgIGNvbnN0IFh0b0xBQkVMID0gKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkb21haW4gPSBMQUJFTHRvWC5kb21haW4oKTtcbiAgICAgICAgICAgIGNvbnN0IHBhZGRpbmdPdXRlciA9IExBQkVMdG9YKGRvbWFpblswXSk7XG4gICAgICAgICAgICBjb25zdCBlYWNoQmFuZCA9IExBQkVMdG9YLnN0ZXAoKTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gTWF0aC5mbG9vcigoKHZhbHVlIC0gcGFkZGluZ091dGVyKSAvIGVhY2hCYW5kKSk7XG4gICAgICAgICAgICByZXR1cm4gZG9tYWluW01hdGgubWF4KDAsIE1hdGgubWluKGluZGV4LCBkb21haW4ubGVuZ3RoIC0gMSkpXTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBZRUFSIFNFTEVDVElPTiBDSVJDTEVTXG4gICAgICAgIC8vIGxldCBzbGlkZXJzO1xuICAgICAgICBpZiAoc2V0U2xpZGVycyAmJiB0aGlzLnNsaWRlcnMpIHtcbiAgICAgICAgICAgIHRoaXMuc2xpZGVycyA9IHNldFNsaWRlcnNcbiAgICAgICAgICAgICAgICAubWFwKChkKSA9PiAoeyB4OiBMQUJFTHRvWChkKSArIExBQkVMdG9YLmJhbmR3aWR0aCgpIC8gMiwgeTogaGVpZ2h0IH0pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2xpZGVycyA9IGQzXG4gICAgICAgICAgICAgICAgLmV4dGVudChpdGVtcywgKGQpID0+IGQubGFiZWwpXG4gICAgICAgICAgICAgICAgLm1hcCgoZCkgPT4gKHsgeDogTEFCRUx0b1goZCkgKyBMQUJFTHRvWC5iYW5kd2lkdGgoKSAvIDIsIHk6IGhlaWdodCB9KSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc0luUmFuZ2UgPSAoeSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYWxsSXRlbXMgPSB0aGlzLnNsaWRlcnMubWFwKChkKSA9PiBYdG9MQUJFTChkLngpKTtcbiAgICAgICAgICAgIGlmICh5ID49IGQzLm1pbihhbGxJdGVtcykgJiYgeSA8PSBkMy5tYXgoYWxsSXRlbXMpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfTtcblxuICAgICAgICBmdW5jdGlvbiBjb2xvdXJCYXJzKGQpIHtcbiAgICAgICAgICAgIGlmIChpc0luUmFuZ2UoZC5sYWJlbCkpIHJldHVybiAndXJsKCNncmFkaWVudCknO1xuICAgICAgICAgICAgcmV0dXJuICcjZTNlM2UzJztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbG91ckJhcnMgPSBjb2xvdXJCYXJzO1xuXG4gICAgICAgIHRoaXMuZ2V0U2VsZWN0ZWRSYW5nZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlU3RhcnQgPSBpdGVtcy5maW5kKChpdCkgPT4gaXQubGFiZWwgPT09IFh0b0xBQkVMKHRoaXMuc2xpZGVyc1swXS54KSk7XG4gICAgICAgICAgICBjb25zdCByYW5nZUVuZCA9IGl0ZW1zLmZpbmQoKGl0KSA9PiBpdC5sYWJlbCA9PT0gWHRvTEFCRUwodGhpcy5zbGlkZXJzWzFdLngpKTtcbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgcmFuZ2VTdGFydC5wYXlsb2FkLFxuICAgICAgICAgICAgICAgIHJhbmdlTW9kZVxuICAgICAgICAgICAgICAgICAgICA/IHJhbmdlRW5kLnJhbmdlLnBheWxvYWRcbiAgICAgICAgICAgICAgICAgICAgOiByYW5nZUVuZC5wYXlsb2FkXG4gICAgICAgICAgICBdO1xuICAgICAgICB9O1xuICAgICAgICAvLyBIZWxwZXJzIC0gRW5kLlxuXG4gICAgICAgIC8vIGNsZWFyIEhUTUwgY29udGVudHNcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY29udGFpbmVySWQpLmlubmVySFRNTCA9ICcnO1xuICAgICAgICBjb25zdCBzdmcgPSBkM1xuICAgICAgICAgICAgLnNlbGVjdChgIyR7Y29udGFpbmVySWR9YClcbiAgICAgICAgICAgIC5hdHRyKCd2aWV3Qm94JywgYDAgMCAke3dpZHRoICsgbWFyZ2luLmxlZnQgKyBtYXJnaW4ucmlnaHR9ICR7aGVpZ2h0ICsgbWFyZ2luLnRvcCArIG1hcmdpbi5ib3R0b219YCk7XG5cbiAgICAgICAgY29uc3Qgc2NhbGVIZWlnaHQgPSBkM1xuICAgICAgICAgICAgLnNjYWxlU3ltbG9nKCkgLy8gbW9zdCBzaW1pbGFyIHNjYWxlIHRvIHRoZSBvcmlnaW5hbFxuICAgICAgICAgICAgLmRvbWFpbihbMCwgZDMubWF4KGl0ZW1zLCAoZCkgPT4gZC52YWx1ZSldKVxuICAgICAgICAgICAgLnJhbmdlKFtoZWlnaHQsIDBdKTtcblxuICAgICAgICAvLyBHUkFESUVOVFxuICAgICAgICBjb25zdCBkZWZzID0gc3ZnLmFwcGVuZCgnZGVmcycpOyAvLyBkZWZpbml0aW9uc1xuICAgICAgICBjb25zdCBncmFkaWVudCA9IGRlZnNcbiAgICAgICAgICAgIC5hcHBlbmQoJ2xpbmVhckdyYWRpZW50JylcbiAgICAgICAgICAgIC5hdHRyKCdpZCcsICdncmFkaWVudCcpXG4gICAgICAgICAgICAuYXR0cignZ3JhZGllbnRVbml0cycsICd1c2VyU3BhY2VPblVzZScpXG4gICAgICAgICAgICAuYXR0cigneDEnLCAwKVxuICAgICAgICAgICAgLmF0dHIoJ3kxJywgaGVpZ2h0KVxuICAgICAgICAgICAgLmF0dHIoJ3gyJywgMClcbiAgICAgICAgICAgIC5hdHRyKCd5MicsIG1hcmdpbi50b3ApO1xuICAgICAgICBncmFkaWVudFxuICAgICAgICAgICAgLmFwcGVuZCgnc3RvcCcpXG4gICAgICAgICAgICAuYXR0cignY2xhc3MnLCAnc3RhcnQnKVxuICAgICAgICAgICAgLmF0dHIoJ29mZnNldCcsICcwJScpXG4gICAgICAgICAgICAuYXR0cignc3RvcC1jb2xvcicsIGNvbG91cnMuYm90dG9tKSAvLyBib3R0b20gZ3JhZGllbnRcbiAgICAgICAgICAgIC5hdHRyKCdzdG9wLW9wYWNpdHknLCAxKTtcbiAgICAgICAgZ3JhZGllbnRcbiAgICAgICAgICAgIC5hcHBlbmQoJ3N0b3AnKVxuICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2VuZCcpXG4gICAgICAgICAgICAuYXR0cignb2Zmc2V0JywgJzEwMCUnKVxuICAgICAgICAgICAgLmF0dHIoJ3N0b3AtY29sb3InLCBjb2xvdXJzLnRvcCkgLy8gdG9wIGdyYWRpZW50XG4gICAgICAgICAgICAuYXR0cignc3RvcC1vcGFjaXR5JywgMSk7XG5cbiAgICAgICAgLy8gRFJBVyBJTlNJREUgTUFSR0lOU1xuICAgICAgICBjb25zdCBnID0gc3ZnXG4gICAgICAgICAgICAuYXBwZW5kKCdnJylcbiAgICAgICAgICAgIC5hdHRyKCdjbGFzcycsICdjaGFydCcpXG4gICAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgke21hcmdpbi5sZWZ0fSwke21hcmdpbi50b3B9KWApO1xuXG4gICAgICAgIGNvbnN0IGJhcnNMYXllciA9IGcuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCAnYmFycycpO1xuICAgICAgICBjb25zdCBjb250cm9sc0xheWVyID0gZy5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsICdjb250cm9scycpO1xuXG4gICAgICAgIC8vIEJBUiBDSEFSVFxuICAgICAgICBiYXJzTGF5ZXIgLy8gYmFyc1xuICAgICAgICAgICAgLnNlbGVjdEFsbCgncmVjdC5iYXJzJylcbiAgICAgICAgICAgIC5kYXRhKGl0ZW1zKVxuICAgICAgICAgICAgLmpvaW4oJ3JlY3QnKVxuICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2JhcnMnKVxuICAgICAgICAgICAgLmF0dHIoJ3dpZHRoJywgTEFCRUx0b1guYmFuZHdpZHRoKVxuICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIChkKSA9PiBoZWlnaHQgLSBzY2FsZUhlaWdodChkLnZhbHVlKSlcbiAgICAgICAgICAgIC5hdHRyKCd5JywgKGQpID0+IHNjYWxlSGVpZ2h0KGQudmFsdWUpKVxuICAgICAgICAgICAgLmF0dHIoJ3gnLCAoZCkgPT4gTEFCRUx0b1goZC5sYWJlbCkpXG4gICAgICAgICAgICAuYXR0cignZGF0YS1zdGFydCcsIChkKSA9PiBkLnBheWxvYWQpIC8vIG1ha2UgdGhlIGRhdGEgZWFzaWx5IGFjY2Vzc2libGVcbiAgICAgICAgICAgIC5hdHRyKCdkYXRhLWVuZCcsIChkKSA9PiAoZC5yYW5nZSA/IGQucmFuZ2UucGF5bG9hZCA6IGQucGF5bG9hZCkpXG4gICAgICAgICAgICAuYXR0cignZmlsbCcsICd1cmwoI2dyYWRpZW50KScpO1xuXG4gICAgICAgIGJhcnNMYXllciAvLyBjYXRjaCBiYXIgZXZlbnRzXG4gICAgICAgICAgICAub24oJ21vdXNlbW92ZScsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHllYXIgPSBYdG9MQUJFTChldmVudC5vZmZzZXRYIC0gbWFyZ2luLmxlZnQpO1xuICAgICAgICAgICAgICAgIGQzLnNlbGVjdEFsbCgncmVjdC5iYXJzJykuYXR0cignZmlsbCcsIChkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh5ZWFyID09PSBkLmxhYmVsKSByZXR1cm4gJyNCMENDRjgnO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29sb3VyQmFycyhkKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAub24oJ21vdXNlb3V0JywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGQzLnNlbGVjdEFsbCgncmVjdC5iYXJzJykuYXR0cignZmlsbCcsIChkKSA9PiBjb2xvdXJCYXJzKGQpKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAub24oJ2NsaWNrJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBYdG9MQUJFTChldmVudC5vZmZzZXRYIC0gbWFyZ2luLmxlZnQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHhBeGlzVmFsdWUgPSBMQUJFTHRvWChsYWJlbCkgKyBMQUJFTHRvWC5iYW5kd2lkdGgoKSAvIDI7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSB7XG4gICAgICAgICAgICAgICAgICAgIHg6IHhBeGlzVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHk6IGhlaWdodFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5zbGlkZXJzID0gW1xuICAgICAgICAgICAgICAgICAgICAvLyBhdm9pZCBqb2luaW5nIHRoZSB0d28gb2JqZWN0cyFcbiAgICAgICAgICAgICAgICAgICAgeyAuLi5uZXdWYWx1ZSB9LFxuICAgICAgICAgICAgICAgICAgICB7IC4uLm5ld1ZhbHVlIH1cbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIHJhbmdlUGlja2VyXG4gICAgICAgICAgICAgICAgICAgIC5kYXRhKHRoaXMuc2xpZGVycylcbiAgICAgICAgICAgICAgICAgICAgLnNlbGVjdCgnY2lyY2xlJylcbiAgICAgICAgICAgICAgICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgICAgICAgICAgICAgICAuZWFzZShkMy5lYXNlUXVhZE91dClcbiAgICAgICAgICAgICAgICAgICAgLmR1cmF0aW9uKDU1MClcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2N4JywgKGQpID0+IGQueCk7XG4gICAgICAgICAgICAgICAgY29udHJvbHNMYXllclxuICAgICAgICAgICAgICAgICAgICAuc2VsZWN0KCdwYXRoLmJsdWVsaW5lJylcbiAgICAgICAgICAgICAgICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgICAgICAgICAgICAgICAuZWFzZShkMy5lYXNlUXVhZE91dClcbiAgICAgICAgICAgICAgICAgICAgLmR1cmF0aW9uKDU1MClcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2QnLCBkMy5saW5lKCkodGhpcy5zbGlkZXJzLm1hcCgoZCkgPT4gW2QueCwgZC55XSkpKTtcbiAgICAgICAgICAgICAgICBjb250cm9sc0xheWVyXG4gICAgICAgICAgICAgICAgICAgIC5zZWxlY3RBbGwoJ3RleHQnKVxuICAgICAgICAgICAgICAgICAgICAudHJhbnNpdGlvbigpXG4gICAgICAgICAgICAgICAgICAgIC5lYXNlKGQzLmVhc2VRdWFkT3V0KVxuICAgICAgICAgICAgICAgICAgICAuZHVyYXRpb24oNTUwKVxuICAgICAgICAgICAgICAgICAgICAuYXR0cigneCcsICgpID0+IHhBeGlzVmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIC50ZXh0KChkLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJhbmdlTW9kZSkgcmV0dXJuIGxhYmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGl0ZW1zLmZpbmQoKGl0KSA9PiBpdC5sYWJlbCA9PT0gbGFiZWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSByZXR1cm4gaXRlbS5yYW5nZS5sYWJlbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmxhYmVsO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBnLnNlbGVjdEFsbCgncmVjdC5iYXJzJykuYXR0cignZmlsbCcsIChkKSA9PiBjb2xvdXJCYXJzKGQpKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRleHRDb2xsaXNpb24odGhpcy5zbGlkZXJzKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3Jhbmdlc2VsZWN0ZWQnLCB0aGlzLmdldFNlbGVjdGVkUmFuZ2UoKSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBjb250cm9sc0xheWVyIC8vIGdyYXkgbGluZVxuICAgICAgICAgICAgLmFwcGVuZCgncGF0aCcpXG4gICAgICAgICAgICAuYXR0cignY2xhc3MnLCAnZ3JheWxpbmUnKVxuICAgICAgICAgICAgLmF0dHIoXG4gICAgICAgICAgICAgICAgJ2QnLFxuICAgICAgICAgICAgICAgIGQzLmxpbmUoKShbXG4gICAgICAgICAgICAgICAgICAgIFswLCBoZWlnaHRdLFxuICAgICAgICAgICAgICAgICAgICBbd2lkdGgsIGhlaWdodF1cbiAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIDIpXG4gICAgICAgICAgICAuYXR0cignb3BhY2l0eScsIDEpXG4gICAgICAgICAgICAuYXR0cignc3Ryb2tlJywgJyNDMUM1QzcnKTtcblxuICAgICAgICBjb250cm9sc0xheWVyIC8vIGJsdWUgbGluZVxuICAgICAgICAgICAgLmFwcGVuZCgncGF0aCcpXG4gICAgICAgICAgICAuYXR0cignY2xhc3MnLCAnYmx1ZWxpbmUnKVxuICAgICAgICAgICAgLmF0dHIoJ2QnLCBkMy5saW5lKCkodGhpcy5zbGlkZXJzLm1hcCgoZCkgPT4gW2QueCwgZC55XSkpKVxuICAgICAgICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIDIpXG4gICAgICAgICAgICAuYXR0cignc3Ryb2tlJywgY29sb3Vycy5hY2NlbnQpO1xuXG4gICAgICAgIGNvbnN0IHJhbmdlUGlja2VyID0gY29udHJvbHNMYXllclxuICAgICAgICAgICAgLnNlbGVjdEFsbCgnZy5yYW5nZXBpY2tlcicpXG4gICAgICAgICAgICAuZGF0YSh0aGlzLnNsaWRlcnMuc29ydCgoYSwgYikgPT4gZDMuYXNjZW5kaW5nKGEueCwgYi54KSkpXG4gICAgICAgICAgICAuam9pbignZycpXG4gICAgICAgICAgICAuYXR0cignY2xhc3MnLCAncmFuZ2VwaWNrZXInKTtcblxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7IC8vIEZJWE1FOiBBbGxvdyB1c2Ugb2YgY2xhc3MgXCJ0aGlzXCIgaW5zaWRlIGRyYWdnaW5nIHVwZGF0ZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFuaW1hdGUgdGhlIGVsZW1lbnRzIHdoaWxlIHRoZSB1c2VyIGlzIGRyYWdnaW5nIG9uZSBvZiB0aGUgcmFuZ2Ugc2VsZWN0b3JzXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBkcmFnZ2luZ1VwZGF0ZShldmVudCwgZGF0YSkge1xuICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBYdG9MQUJFTChldmVudC54KTtcbiAgICAgICAgICAgIGNvbnN0IHhBeGlzVmFsdWUgPSBMQUJFTHRvWChsYWJlbCkgKyBMQUJFTHRvWC5iYW5kd2lkdGgoKSAvIDI7XG4gICAgICAgICAgICBjb25zdCB5YiA9IFtdO1xuICAgICAgICAgICAgZy5zZWxlY3RBbGwoJ2NpcmNsZScpLmVhY2goZnVuY3Rpb24gc2V0QmFsbFBvc2l0aW9uKCkge1xuICAgICAgICAgICAgICAgIHliLnB1c2goeyB4OiArZDMuc2VsZWN0KHRoaXMpLmF0dHIoJ2N4JyksIHk6IGhlaWdodCB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc2VsZi5zbGlkZXJzID0geWIuc29ydCgoYSwgYikgPT4gZDMuYXNjZW5kaW5nKGEueCwgYi54KSk7XG4gICAgICAgICAgICAvLyBtb3ZlIHRoZSBjaXJjbGVcbiAgICAgICAgICAgIGQzLnNlbGVjdCh0aGlzKVxuICAgICAgICAgICAgICAgIC5zZWxlY3QoJ2NpcmNsZScpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2N4JywgZGF0YS54ID0geEF4aXNWYWx1ZSk7XG4gICAgICAgICAgICAvLyBtb3ZlIHRoZSBibHVlIGxpbmVcbiAgICAgICAgICAgIGNvbnRyb2xzTGF5ZXJcbiAgICAgICAgICAgICAgICAuc2VsZWN0KCdwYXRoLmJsdWVsaW5lJylcbiAgICAgICAgICAgICAgICAuYXR0cignZCcsIGQzLmxpbmUoKShzZWxmLnNsaWRlcnMubWFwKChkKSA9PiBbZC54LCBkLnldKSkpO1xuICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSB0ZXh0IHBvc2l0aW9uXG4gICAgICAgICAgICBkMy5zZWxlY3QodGhpcylcbiAgICAgICAgICAgICAgICAuc2VsZWN0KCd0ZXh0JylcbiAgICAgICAgICAgICAgICAuYXR0cigneCcsICgpID0+IHhBeGlzVmFsdWUpO1xuICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSB0ZXh0IHZhbHVlc1xuICAgICAgICAgICAgY29udHJvbHNMYXllclxuICAgICAgICAgICAgICAgIC5zZWxlY3RBbGwoJ3RleHQnKVxuICAgICAgICAgICAgICAgIC50ZXh0KChkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGwgPSBYdG9MQUJFTChkLngpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXJhbmdlTW9kZSkgcmV0dXJuIGw7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uID0gc2VsZi5zbGlkZXJzLmZpbmRJbmRleCgoc2xpZGVyKSA9PiBzbGlkZXIueCA9PT0gZC54KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxmLmdldFNlbGVjdGVkUmFuZ2UoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uID09PSAxKSByZXR1cm4gcmFuZ2VbMV07XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByYW5nZVswXTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHNlbGYudGV4dENvbGxpc2lvbihzZWxmLnNsaWRlcnMpO1xuICAgICAgICAgICAgLy8gY29sb3VyIHRoZSBiYXJzXG4gICAgICAgICAgICBnLnNlbGVjdEFsbCgncmVjdC5iYXJzJykuYXR0cignZmlsbCcsIChkKSA9PiBjb2xvdXJCYXJzKGQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJhbmdlUGlja2VyIC8vIGRyYWcgaGFuZGxlclxuICAgICAgICAgICAgLmNhbGwoZDMuZHJhZygpXG4gICAgICAgICAgICAgICAgLm9uKCdkcmFnJywgZHJhZ2dpbmdVcGRhdGUpXG4gICAgICAgICAgICAgICAgLm9uKCdlbmQnLCAoZXZlbnQsIGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIG9uZSBsYXN0IHRpbWUgdG8gcHJldmVudCBkZXN5bmNpbmdcbiAgICAgICAgICAgICAgICAgICAgZHJhZ2dpbmdVcGRhdGUoZXZlbnQsIGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAvLyBlbWl0IHRoZSBzZWxlY3RlZCByYW5nZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3Jhbmdlc2VsZWN0ZWQnLCB0aGlzLmdldFNlbGVjdGVkUmFuZ2UoKSk7XG4gICAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgIHJhbmdlUGlja2VyXG4gICAgICAgICAgICAuYXBwZW5kKCdjaXJjbGUnKVxuICAgICAgICAgICAgLmF0dHIoJ2N4JywgKGQpID0+IGQueClcbiAgICAgICAgICAgIC5hdHRyKCdjeScsIChkKSA9PiBkLnkpXG4gICAgICAgICAgICAuYXR0cigncicsIDkpXG4gICAgICAgICAgICAuYXR0cignZmlsbCcsICd3aGl0ZScpXG4gICAgICAgICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgMilcbiAgICAgICAgICAgIC5hdHRyKCdzdHJva2UnLCBjb2xvdXJzLmFjY2VudClcbiAgICAgICAgICAgIC5hdHRyKCdzdHlsZScsICdjdXJzb3I6IHBvaW50ZXInKTtcblxuICAgICAgICByYW5nZVBpY2tlclxuICAgICAgICAgICAgLmF0dHIoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpXG4gICAgICAgICAgICAuYXR0cignZm9udC1mYW1pbHknLCAnUm9ib3RvLCBBcmlhbCwgc2Fucy1zZXJpZicpXG4gICAgICAgICAgICAuYXR0cignZm9udC1zaXplJywgJzEycHgnKVxuICAgICAgICAgICAgLmFwcGVuZCgndGV4dCcpXG4gICAgICAgICAgICAuYXR0cigneScsIChkKSA9PiBkLnkgKyBtYXJnaW4uYm90dG9tIC8gMilcbiAgICAgICAgICAgIC5hdHRyKCd4JywgKGQpID0+IGQueClcbiAgICAgICAgICAgIC5hdHRyKCdmaWxsJywgY29sb3Vycy5hY2NlbnQpXG4gICAgICAgICAgICAudGV4dCgoZCwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGwgPSBYdG9MQUJFTChkLngpO1xuICAgICAgICAgICAgICAgIGlmIChyYW5nZU1vZGUgJiYgaSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbS5sYWJlbCA9PT0gbCkucmFuZ2UubGFiZWw7XG4gICAgICAgICAgICAgICAgfSByZXR1cm4gbDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChheGlzPy55QXhpcz8uc2hvdykge1xuICAgICAgICAgICAgY29uc3QgeUF4aXMgPSBkMy5heGlzTGVmdChzY2FsZUhlaWdodClcbiAgICAgICAgICAgICAgICAudGlja3MoYXhpcy55QXhpcy50aWNrQW1vdW50ID8/IDIpXG4gICAgICAgICAgICAgICAgLnRpY2tWYWx1ZXMoYXhpcy55QXhpcy52YWx1ZXMgPyBheGlzLnlBeGlzLnZhbHVlcyA6IG51bGwpO1xuICAgICAgICAgICAgY29uc3QgeUF4aXNHcm91cCA9IHN2Zy5hcHBlbmQoJ2cnKVxuICAgICAgICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKCR7bWFyZ2luLmxlZnR9LCAke21hcmdpbi50b3B9KWApXG4gICAgICAgICAgICAgICAgLmNhbGwoeUF4aXMpO1xuXG4gICAgICAgICAgICB5QXhpc0dyb3VwLnNlbGVjdEFsbCgncGF0aCwgbGluZScpLnN0eWxlKCdzdHJva2UnLCBjb2xvdXJzLmFjY2VudCk7XG4gICAgICAgICAgICB5QXhpc0dyb3VwLnNlbGVjdEFsbCgndGV4dCcpLnN0eWxlKCdmaWxsJywgY29sb3Vycy5hY2NlbnQpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKiBBdm9pZCBjb2xsaXNpb24gb2YgdGhlIHNsaWRlciBsYWJlbHMgKi9cbiAgICB0ZXh0Q29sbGlzaW9uID0gKHNsaWRlcnM6IFNsaWRlcnMpID0+IHtcbiAgICAgICAgLy8gcHJlLXJlcXVpc2l0ZXNcbiAgICAgICAgY29uc3QgY29udHJvbHNMYXllciA9IHRoaXMuZDMuc2VsZWN0KCdnLmNoYXJ0Jykuc2VsZWN0KCdnLmNvbnRyb2xzJyk7XG4gICAgICAgIGNvbnN0IHsgaXRlbXMsIG1hcmdpbiB9ID0gdGhpcy5kYXRhO1xuICAgICAgICBjb25zdCByYW5nZU1vZGUgPSBpdGVtcy5ldmVyeSgoZCkgPT4gZC5yYW5nZSk7XG4gICAgICAgIC8vIHJ1biBjb2xsaXNpb24gZGV0ZWN0aW9uXG4gICAgICAgIGNvbnN0IGlzQ29sbGlkaW5nID0gc2xpZGVyc1swXS54ID09PSBzbGlkZXJzWzFdLng7XG4gICAgICAgIGlmIChyYW5nZU1vZGUgJiYgaXNDb2xsaWRpbmcpIHtcbiAgICAgICAgICAgIGNvbnRyb2xzTGF5ZXJcbiAgICAgICAgICAgICAgICAuc2VsZWN0QWxsKCd0ZXh0JylcbiAgICAgICAgICAgICAgICAuYXR0cigneScsIChkLCBpKSA9PiAoaSA+IDAgPyBkLnkgKyBtYXJnaW4uYm90dG9tIC8gMiArIDEyIDogZC55ICsgbWFyZ2luLmJvdHRvbSAvIDIpKVxuICAgICAgICAgICAgICAgIC50ZXh0KChkLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5nZXRTZWxlY3RlZFJhbmdlKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByYW5nZVtpXTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRyb2xzTGF5ZXJcbiAgICAgICAgICAgICAgICAuc2VsZWN0QWxsKCd0ZXh0JylcbiAgICAgICAgICAgICAgICAuYXR0cigneScsIChkKSA9PiBkLnkgKyBtYXJnaW4uYm90dG9tIC8gMik7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqIEdldCB4LWF4aXMgcG9zaXRpb24gZnJvbSBsYWJlbCAqL1xuICAgIGxhYmVsVG9YKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kM1xuICAgICAgICAgICAgLnNjYWxlQmFuZCgpXG4gICAgICAgICAgICAuZG9tYWluKHRoaXMuZGF0YS5pdGVtcy5tYXAoKGQpID0+IGQubGFiZWwpKVxuICAgICAgICAgICAgLnJhbmdlKFswLCB0aGlzLmRhdGEud2lkdGhdKVxuICAgICAgICAgICAgLnBhZGRpbmdJbm5lcigwLjE3KVxuICAgICAgICAgICAgLnBhZGRpbmdPdXRlcigxKTtcbiAgICB9XG5cbiAgICAvKiogUHVibGljIGFwaSB0aGF0IGFsbG93cyB0byBkaW5hbWljYWxseSBjaGFuZ2UgdGhlIGJhcnMgKi9cbiAgICBzZXRCYXJzID0gKG5ld0JhcnMpID0+IHtcbiAgICAgICAgdGhpcy5kYXRhLml0ZW1zID0gbmV3QmFycztcbiAgICAgICAgdGhpcy5kcmF3KCk7XG4gICAgICAgIHRoaXMuZDMuc2VsZWN0QWxsKCdyZWN0LmJhcnMnKS5hdHRyKCdmaWxsJywgKGQpID0+IHRoaXMuY29sb3VyQmFycyhkKSk7XG4gICAgfTtcblxuICAgIC8qKiBQdWJsaWMgYXBpIHRoYXQgYWxsb3dzIHRvIGRpbmFtaWNhbGx5IGNoYW5nZSB0aGUgc2xpZGVyIHBvc2l0aW9uICovXG4gICAgc2V0U2xpZGVycyA9IChbc3RhcnRMYWJlbCwgZW5kTGFiZWxdKSA9PiB7XG4gICAgICAgIHRoaXMuZGF0YS5zZXRTbGlkZXJzID0gW2Ake3N0YXJ0TGFiZWx9YCwgYCR7ZW5kTGFiZWx9YF07XG4gICAgICAgIHRoaXMuZHJhdygpO1xuICAgICAgICB0aGlzLmQzLnNlbGVjdEFsbCgncmVjdC5iYXJzJykuYXR0cignZmlsbCcsIChkKSA9PiB0aGlzLmNvbG91ckJhcnMoZCkpO1xuICAgICAgICBjb25zdCByYW5nZSA9IHRoaXMuZ2V0U2VsZWN0ZWRSYW5nZSgpO1xuICAgICAgICB0aGlzLmVtaXQoJ3Jhbmdlc2VsZWN0ZWQnLCByYW5nZSk7XG4gICAgICAgIHRoaXMudGV4dENvbGxpc2lvbih0aGlzLnNsaWRlcnMpO1xuICAgICAgICByZXR1cm4gcmFuZ2U7XG4gICAgfTtcblxuICAgIC8qKiBFbWl0cyBhbiBldmVudCB3aGVuIHRoZSBjb21wb25lbnQgaGFzIGxvYWRlZCAqL1xuICAgIGVtaXRMb2FkZWQocGF5bG9hZCkge1xuICAgICAgICBpZiAoIXRoaXMuZW1pdCkgcmV0dXJuO1xuICAgICAgICB0aGlzLmVtaXQoJ2xvYWRlZCcsIHBheWxvYWQpO1xuICAgIH1cbn1cbiIsIjxkaXYgKm5nSWY9XCJkYXRhXCIgY2xhc3M9XCJuNy1oaXN0b2dyYW0tcmFuZ2VcIj5cbiAgICA8c3ZnICNoaXN0b2dyYW1SYW5nZSBbaWRdPVwiZGF0YS5jb250YWluZXJJZFwiPjwvc3ZnPlxuPC9kaXY+XG4iXX0=
|