axidio-styleguide-library1-v2 0.2.7 → 0.2.9
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/esm2022/lib/guage-chart/guage-chart.component.mjs +191 -146
- package/esm2022/lib/plain-trend/plain-trend.component.mjs +4 -4
- package/fesm2022/axidio-styleguide-library1-v2.mjs +195 -150
- package/fesm2022/axidio-styleguide-library1-v2.mjs.map +1 -1
- package/lib/guage-chart/guage-chart.component.d.ts +29 -77
- package/package.json +1 -1
|
@@ -53,210 +53,255 @@ export class GuageChartComponent extends ComponentUniqueId {
|
|
|
53
53
|
}
|
|
54
54
|
ngOnInit() { }
|
|
55
55
|
ngOnChanges() {
|
|
56
|
-
this.
|
|
57
|
-
|
|
58
|
-
onResized(_event) {
|
|
59
|
-
this.redrawChart();
|
|
56
|
+
d3.select('#' + this.uniqueId).remove();
|
|
57
|
+
this.initializeLineChart();
|
|
60
58
|
}
|
|
61
|
-
|
|
62
|
-
* Clears the previous SVG and redraws chart
|
|
63
|
-
*/
|
|
64
|
-
redrawChart() {
|
|
59
|
+
onResized(event) {
|
|
65
60
|
d3.select('#' + this.uniqueId).remove();
|
|
66
61
|
this.initializeLineChart();
|
|
67
62
|
}
|
|
68
|
-
/**
|
|
69
|
-
*
|
|
70
|
-
|
|
63
|
+
/** -------------------------------
|
|
64
|
+
* Main Initialization Function
|
|
65
|
+
* ------------------------------*/
|
|
71
66
|
initializeLineChart() {
|
|
72
|
-
this
|
|
73
|
-
const { data, metaData
|
|
74
|
-
const
|
|
75
|
-
this.
|
|
76
|
-
this.
|
|
77
|
-
this.
|
|
78
|
-
this.
|
|
67
|
+
const self = this;
|
|
68
|
+
const { data, metaData } = this.chartData;
|
|
69
|
+
const isRia = this.customChartConfiguration.isRia;
|
|
70
|
+
this.setupChartConfiguration();
|
|
71
|
+
const { colorMaps } = this.getColorMap(metaData);
|
|
72
|
+
this.configureDataType(metaData);
|
|
73
|
+
const data_ready = this.calculateDataReady(data);
|
|
74
|
+
const { chartContainer, guagecontainer, width, height } = this.setupContainer();
|
|
75
|
+
this.isHeaderVisible =
|
|
76
|
+
this.chartConfiguration.isHeaderVisible ?? this.isHeaderVisible;
|
|
77
|
+
const svg = this.createSvg(chartContainer, width, height);
|
|
78
|
+
const radius = this.adjustDimensionsAndRadius(width, height);
|
|
79
|
+
const angleValue = this.computeAngles(data_ready, data);
|
|
80
|
+
const arc = this.createArc(radius, angleValue, data_ready);
|
|
81
|
+
this.drawGaugeArcs(svg, arc, data_ready, colorMaps, metaData, isRia, data);
|
|
82
|
+
this.drawPointer(svg, radius, metaData, data);
|
|
83
|
+
this.drawLabels(svg, radius, data_ready, data, metaData);
|
|
84
|
+
this.drawCenterTexts(svg, radius, metaData);
|
|
85
|
+
this.centerSvg(svg, chartContainer, width, height);
|
|
79
86
|
}
|
|
80
|
-
/**
|
|
81
|
-
*
|
|
82
|
-
|
|
83
|
-
|
|
87
|
+
/** -------------------------------
|
|
88
|
+
* Modular Helper Functions
|
|
89
|
+
* ------------------------------*/
|
|
90
|
+
setupChartConfiguration() {
|
|
84
91
|
for (const key in this.defaultConfiguration) {
|
|
85
92
|
this.chartConfiguration[key] = ChartHelper.getValueByConfigurationType(key, this.defaultConfiguration, this.customChartConfiguration);
|
|
86
93
|
}
|
|
87
|
-
if (this.chartConfiguration.isHeaderVisible !== undefined)
|
|
88
|
-
this.isHeaderVisible = this.chartConfiguration.isHeaderVisible;
|
|
89
94
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
*/
|
|
93
|
-
processChartData() {
|
|
94
|
-
const metaData = this.chartData.metaData;
|
|
95
|
-
const data = this.chartData.data;
|
|
96
|
-
const colorType = metaData.colorType || 'high';
|
|
95
|
+
getColorMap(metaData) {
|
|
96
|
+
const colorType = metaData.colorType;
|
|
97
97
|
const colorMaps = colorType === 'low'
|
|
98
98
|
? this.chartConfiguration.low_colorMap
|
|
99
99
|
: this.chartConfiguration.high_colorMap;
|
|
100
|
+
return { colorMaps };
|
|
101
|
+
}
|
|
102
|
+
configureDataType(metaData) {
|
|
100
103
|
if (metaData.dataType) {
|
|
101
|
-
this.dataType = metaData.dataType
|
|
102
|
-
this.
|
|
104
|
+
this.dataType = metaData.dataType;
|
|
105
|
+
if (this.dataType === 'USD') {
|
|
106
|
+
this.datatype_status = true;
|
|
107
|
+
this.dataType = '$ ';
|
|
108
|
+
}
|
|
103
109
|
}
|
|
104
|
-
const data_ready = data.slice(0, -1).map((v, i) => data[i + 1] - v);
|
|
105
|
-
const total = d3.sum(data_ready);
|
|
106
|
-
const angleValue = data_ready.reduce((acc, curr, i) => {
|
|
107
|
-
const prev = acc[i - 1] || 0;
|
|
108
|
-
acc.push(prev + (curr / total) * 180);
|
|
109
|
-
return acc;
|
|
110
|
-
}, []);
|
|
111
|
-
const width = parseInt(d3.select(this.containerElt.nativeElement).style('width')) -
|
|
112
|
-
this.chartConfiguration.margin.left -
|
|
113
|
-
this.chartConfiguration.margin.right;
|
|
114
|
-
const height = parseInt(d3.select(this.guagecontainerElt.nativeElement).style('height')) -
|
|
115
|
-
this.chartConfiguration.margin.top -
|
|
116
|
-
this.chartConfiguration.margin.bottom -
|
|
117
|
-
56;
|
|
118
|
-
const radius = Math.min(width, height) / 2;
|
|
119
|
-
return { data, metaData, colorMaps, data_ready, angleValue, radius };
|
|
120
110
|
}
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
111
|
+
calculateDataReady(data) {
|
|
112
|
+
const data_ready = [];
|
|
113
|
+
data.forEach((_, i) => {
|
|
114
|
+
if (i < data.length - 1) {
|
|
115
|
+
data_ready.push(data[i + 1] - data[i]);
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
return data_ready;
|
|
119
|
+
}
|
|
120
|
+
setupContainer() {
|
|
126
121
|
const chartContainer = d3.select(this.containerElt.nativeElement);
|
|
127
|
-
const
|
|
128
|
-
const
|
|
129
|
-
const
|
|
122
|
+
const guagecontainer = d3.select(this.guagecontainerElt.nativeElement);
|
|
123
|
+
const margin = this.chartConfiguration.margin;
|
|
124
|
+
const width = parseInt(chartContainer.style('width')) - margin.left - margin.right;
|
|
125
|
+
const height = parseInt(guagecontainer.style('height')) -
|
|
126
|
+
margin.top -
|
|
127
|
+
margin.bottom -
|
|
128
|
+
56; // chart header height
|
|
129
|
+
return { chartContainer, guagecontainer, width, height };
|
|
130
|
+
}
|
|
131
|
+
createSvg(chartContainer, width, height) {
|
|
132
|
+
const margin = this.chartConfiguration.margin;
|
|
133
|
+
return chartContainer
|
|
130
134
|
.append('svg')
|
|
131
135
|
.attr('id', this.uniqueId)
|
|
132
|
-
.attr('width', width)
|
|
133
|
-
.attr('height', height)
|
|
136
|
+
.attr('width', width + margin.left + margin.right)
|
|
137
|
+
.attr('height', height + margin.top + margin.bottom)
|
|
134
138
|
.call(ChartHelper.responsivefy)
|
|
135
|
-
.append('g')
|
|
136
|
-
|
|
137
|
-
|
|
139
|
+
.append('g');
|
|
140
|
+
}
|
|
141
|
+
adjustDimensionsAndRadius(width, height) {
|
|
142
|
+
const radius = Math.min(width, height) / 2;
|
|
143
|
+
if (this.chartConfiguration.isDrilldownChart) {
|
|
144
|
+
this.chartConfiguration.currentValueWidthScaleFactor += 40;
|
|
145
|
+
this.chartConfiguration.currentValueHeightScaleFactor += 20;
|
|
146
|
+
}
|
|
147
|
+
else if (window.innerWidth > 1400) {
|
|
148
|
+
this.chartConfiguration.currentValueHeightScaleFactor += 15;
|
|
149
|
+
this.chartConfiguration.currentValueWidthScaleFactor *= 2;
|
|
150
|
+
}
|
|
151
|
+
return radius;
|
|
152
|
+
}
|
|
153
|
+
computeAngles(data_ready, data) {
|
|
154
|
+
const total = data_ready.reduce((sum, val) => sum + val, 0);
|
|
155
|
+
const tempArray = [];
|
|
156
|
+
data_ready.forEach((unit, i) => {
|
|
157
|
+
const angle = (unit / total) * 180;
|
|
158
|
+
tempArray.push(i === 0 ? angle : tempArray[i - 1] + angle);
|
|
159
|
+
});
|
|
160
|
+
return tempArray;
|
|
138
161
|
}
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
const arc = d3
|
|
162
|
+
createArc(radius, angleValue, data_ready) {
|
|
163
|
+
const self = this;
|
|
164
|
+
const deg2rad = (deg) => (deg * Math.PI) / 180;
|
|
165
|
+
return d3
|
|
144
166
|
.arc()
|
|
145
|
-
.innerRadius(
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
.outerRadius(
|
|
149
|
-
.startAngle((_, i) =>
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
167
|
+
.innerRadius(radius -
|
|
168
|
+
self.chartConfiguration.ringWidth -
|
|
169
|
+
self.chartConfiguration.ringInset)
|
|
170
|
+
.outerRadius(radius)
|
|
171
|
+
.startAngle((_, i) => deg2rad(i === 0
|
|
172
|
+
? self.chartConfiguration.minAngle
|
|
173
|
+
: self.chartConfiguration.minAngle + angleValue[i - 1]))
|
|
174
|
+
.endAngle((_, i) => deg2rad(i === data_ready.length - 1
|
|
175
|
+
? self.chartConfiguration.maxAngle
|
|
176
|
+
: self.chartConfiguration.minAngle + angleValue[i]));
|
|
177
|
+
}
|
|
178
|
+
drawGaugeArcs(svg, arc, data_ready, colorMaps, metaData, isRia, data) {
|
|
179
|
+
const self = this;
|
|
180
|
+
const arcs = svg
|
|
153
181
|
.append('g')
|
|
154
182
|
.attr('class', 'arc')
|
|
183
|
+
.attr('transform', this.centerTranslation(arc.outerRadius()()));
|
|
184
|
+
arcs
|
|
155
185
|
.selectAll('path')
|
|
156
186
|
.data(data_ready)
|
|
157
187
|
.enter()
|
|
158
188
|
.append('path')
|
|
159
189
|
.attr('fill', (_, i) => colorMaps[i])
|
|
190
|
+
.style('cursor', () => metaData.currentValue > 0 && metaData.hasDrillDown && !isRia
|
|
191
|
+
? 'pointer'
|
|
192
|
+
: 'default')
|
|
160
193
|
.attr('d', arc)
|
|
161
|
-
.
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
194
|
+
.on('click', (d) => {
|
|
195
|
+
if (!metaData.hasDrillDown || metaData.currentValue === 0)
|
|
196
|
+
return;
|
|
197
|
+
const range = `${data[0]} and ${data[data.length - 1]}`;
|
|
198
|
+
self.handleClick(range);
|
|
165
199
|
});
|
|
166
200
|
}
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
drawPointer(svg, metaData, data_ready, radius) {
|
|
171
|
-
const pointerValue = metaData.currentValue - this.chartData.data[0];
|
|
172
|
-
const range = this.chartData.data[this.chartData.data.length - 1] -
|
|
173
|
-
this.chartData.data[0];
|
|
174
|
-
const pointerAngle = this.chartConfiguration.minAngle + (pointerValue / range) * 180;
|
|
175
|
-
const pointerHeadLength = Math.round(radius * this.chartConfiguration.pointerHeadLengthPercent);
|
|
201
|
+
drawPointer(svg, radius, metaData, data) {
|
|
202
|
+
const self = this;
|
|
203
|
+
const pointerHeadLength = Math.round(radius * self.chartConfiguration.pointerHeadLengthPercent);
|
|
176
204
|
const lineData = [
|
|
177
|
-
[
|
|
205
|
+
[self.chartConfiguration.pointerWidth / 2, 0],
|
|
178
206
|
[0, -pointerHeadLength],
|
|
179
|
-
[-
|
|
180
|
-
[0,
|
|
181
|
-
[
|
|
207
|
+
[-(self.chartConfiguration.pointerWidth / 2), 0],
|
|
208
|
+
[0, self.chartConfiguration.pointerTailLength],
|
|
209
|
+
[self.chartConfiguration.pointerWidth / 2, 0],
|
|
182
210
|
];
|
|
183
|
-
|
|
211
|
+
const pointerLine = d3.line();
|
|
212
|
+
const pg = svg
|
|
184
213
|
.append('g')
|
|
214
|
+
.data([lineData])
|
|
185
215
|
.attr('class', 'pointer')
|
|
186
|
-
.
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
216
|
+
.attr('transform', this.centerTranslation(radius));
|
|
217
|
+
const pointerValue = metaData.currentValue - data[0];
|
|
218
|
+
const range = data[data.length - 1] - data[0];
|
|
219
|
+
const pointerAngle = self.chartConfiguration.minAngle + (pointerValue / range) * 180;
|
|
220
|
+
pg.append('path')
|
|
221
|
+
.attr('d', pointerLine)
|
|
222
|
+
.attr('fill', self.chartConfiguration.pointerColor)
|
|
223
|
+
.attr('transform', `rotate(${pointerAngle}) translate(0,${-radius + self.chartConfiguration.ringWidth + pointerHeadLength})`);
|
|
192
224
|
}
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
*/
|
|
196
|
-
drawLabels(svg, data_ready, radius, metaData) {
|
|
197
|
-
const data = this.chartData.data;
|
|
225
|
+
drawLabels(svg, radius, data_ready, data, metaData) {
|
|
226
|
+
const self = this;
|
|
198
227
|
const range = data[data.length - 1] - data[0];
|
|
199
|
-
const labelArray =
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
const labelGroup = svg.append('g').attr('class', 'labels');
|
|
206
|
-
labelGroup
|
|
207
|
-
.selectAll('text')
|
|
228
|
+
const labelArray = this.buildLabelArray(data_ready, data);
|
|
229
|
+
const lg = svg
|
|
230
|
+
.append('g')
|
|
231
|
+
.attr('class', 'label')
|
|
232
|
+
.attr('transform', this.centerTranslation(radius));
|
|
233
|
+
lg.selectAll('.bubble')
|
|
208
234
|
.data(labelArray)
|
|
209
235
|
.enter()
|
|
210
|
-
.append('
|
|
236
|
+
.append('g')
|
|
211
237
|
.attr('transform', (d) => {
|
|
212
|
-
const newAngle =
|
|
213
|
-
return `rotate(${newAngle}) translate(0
|
|
238
|
+
const newAngle = self.chartConfiguration.minAngle + (d.value / range) * 180;
|
|
239
|
+
return `rotate(${newAngle}) translate(0,${self.chartConfiguration.labelInset - radius - 20})`;
|
|
214
240
|
})
|
|
241
|
+
.append('text')
|
|
215
242
|
.attr('fill', 'var(--chart-text-color)')
|
|
216
|
-
.style('font-size', '14px')
|
|
243
|
+
.style('font-size', window.innerWidth < 1400 ? '12px' : '14px')
|
|
217
244
|
.style('font-weight', '600')
|
|
218
|
-
.text((d) => metaData.dataType ?
|
|
245
|
+
.text((d) => (metaData.dataType ? d.name + metaData.dataType : d.name));
|
|
246
|
+
}
|
|
247
|
+
buildLabelArray(data_ready, data) {
|
|
248
|
+
const labelArray = [{ name: data[0], value: 0 }];
|
|
249
|
+
let count = 0;
|
|
250
|
+
data_ready.forEach((unit, i) => {
|
|
251
|
+
count += unit;
|
|
252
|
+
labelArray.push({ name: data[i + 1], value: count });
|
|
253
|
+
});
|
|
254
|
+
return labelArray;
|
|
219
255
|
}
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
const
|
|
225
|
-
|
|
226
|
-
const bottomY = midY + this.chartConfiguration.currentValueHeightScaleFactor;
|
|
256
|
+
drawCenterTexts(svg, radius, metaData) {
|
|
257
|
+
const self = this;
|
|
258
|
+
const top = radius / 2 - 10;
|
|
259
|
+
const mid = top + self.chartConfiguration.currentValueHeightScaleFactor;
|
|
260
|
+
const bottom = mid + self.chartConfiguration.currentValueHeightScaleFactor;
|
|
261
|
+
// current value
|
|
227
262
|
svg
|
|
228
263
|
.append('foreignObject')
|
|
229
|
-
.attr('transform', `translate(${radius -
|
|
230
|
-
.attr('width',
|
|
231
|
-
.attr('height',
|
|
264
|
+
.attr('transform', `translate(${radius - this.chartConfiguration.currentValueWidthScaleFactor / 2},${top})`)
|
|
265
|
+
.attr('width', this.chartConfiguration.currentValueWidthScaleFactor + 8)
|
|
266
|
+
.attr('height', this.chartConfiguration.currentValueHeightScaleFactor)
|
|
232
267
|
.append('xhtml:div')
|
|
233
268
|
.attr('class', 'value-display')
|
|
234
|
-
.html(
|
|
269
|
+
.html(metaData.currentValue + metaData.dataType);
|
|
270
|
+
// status
|
|
235
271
|
if (metaData.status) {
|
|
272
|
+
const widthTemp = metaData.status.length > 4 ? 210 : 120;
|
|
236
273
|
svg
|
|
237
274
|
.append('foreignObject')
|
|
238
|
-
.attr('transform', `translate(${radius -
|
|
239
|
-
.attr('width',
|
|
240
|
-
.attr('height', 40)
|
|
275
|
+
.attr('transform', `translate(${radius - widthTemp / 2},${mid})`)
|
|
276
|
+
.attr('width', widthTemp)
|
|
241
277
|
.append('xhtml:div')
|
|
242
278
|
.attr('class', 'status-display')
|
|
243
279
|
.html(metaData.status);
|
|
244
280
|
}
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
281
|
+
// date range
|
|
282
|
+
svg
|
|
283
|
+
.append('foreignObject')
|
|
284
|
+
.attr('transform', `translate(${radius - 105},${bottom})`)
|
|
285
|
+
.attr('width', 210)
|
|
286
|
+
.append('xhtml:div')
|
|
287
|
+
.attr('class', 'daterange-display')
|
|
288
|
+
.html(metaData.dateRange
|
|
289
|
+
? `<span class="marginright-3"><i class="fa fa-calendar"></i></span><span>${metaData.dateRange}</span>`
|
|
290
|
+
: '');
|
|
255
291
|
}
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
292
|
+
centerTranslation(radius) {
|
|
293
|
+
return `translate(${radius},${radius})`;
|
|
294
|
+
}
|
|
295
|
+
centerSvg(svg, chartContainer, width, height) {
|
|
296
|
+
const margin = this.chartConfiguration.margin;
|
|
297
|
+
const containerMidWidth = parseInt(chartContainer.style('width')) / 2;
|
|
298
|
+
const nodeHalfWidth = svg.node().getBoundingClientRect().width / 2;
|
|
299
|
+
const updatedStartingPoint = containerMidWidth - nodeHalfWidth;
|
|
300
|
+
svg.attr('transform', `translate(${updatedStartingPoint + margin.left},${margin.top})`);
|
|
259
301
|
}
|
|
302
|
+
/** -------------------------------
|
|
303
|
+
* Event Handlers
|
|
304
|
+
* ------------------------------*/
|
|
260
305
|
handleClick(d) {
|
|
261
306
|
this.clickEvent.emit(d);
|
|
262
307
|
}
|
|
@@ -284,4 +329,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
284
329
|
}], headerMenuclickEvent: [{
|
|
285
330
|
type: Output
|
|
286
331
|
}] } });
|
|
287
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VhZ2UtY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXhpZGlvLXN0eWxlZ3VpZGUtbGlicmFyeS9zcmMvbGliL2d1YWdlLWNoYXJ0L2d1YWdlLWNoYXJ0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2F4aWRpby1zdHlsZWd1aWRlLWxpYnJhcnkvc3JjL2xpYi9ndWFnZS1jaGFydC9ndWFnZS1jaGFydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFNBQVMsRUFFVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2pELE9BQU8sV0FBVyxNQUFNLGlCQUFpQixDQUFDO0FBRTFDLE9BQU8sa0JBQWtCLE1BQU0sa0JBQWtCLENBQUM7Ozs7OztBQVFsRCxNQUFNLE9BQU8sbUJBQW9CLFNBQVEsaUJBQWlCO0lBNkN4RDtRQUNFLEtBQUssRUFBRSxDQUFDO1FBeENBLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ3JDLHlCQUFvQixHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFFekQsdUJBQWtCLEdBQVEsRUFBRSxDQUFDO1FBQzdCLGFBQVEsR0FBRyxFQUFFLENBQUM7UUFDZCxvQkFBZSxHQUFHLEtBQUssQ0FBQztRQUN4QixhQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzlCLG9CQUFlLEdBQUcsSUFBSSxDQUFDO1FBRXZCLHlCQUFvQixHQUFHO1lBQ3JCLE1BQU0sRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFB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QUFDO1FBQ04sQ0FBQztJQUNILENBQUM7SUFFRCxpQ0FBaUM7SUFDekIsT0FBTyxDQUFDLEdBQVc7UUFDekIsT0FBTyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQy9CLENBQUM7SUFFRCxXQUFXLENBQUMsQ0FBTTtRQUNoQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQscUJBQXFCLENBQUMsRUFBVTtRQUM5QixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7K0dBdlVVLG1CQUFtQjttR0FBbkIsbUJBQW1CLHlnQkN0QmhDLHNnQ0FZTTs7NEZEVU8sbUJBQW1CO2tCQU4vQixTQUFTOytCQUNFLGlCQUFpQixpQkFHWixpQkFBaUIsQ0FBQyxJQUFJO3dEQUdlLFlBQVk7c0JBQS9ELFNBQVM7dUJBQUMscUJBQXFCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNILGlCQUFpQjtzQkFBL0QsU0FBUzt1QkFBQyxnQkFBZ0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBRXBDLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csd0JBQXdCO3NCQUFoQyxLQUFLO2dCQUNJLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csb0JBQW9CO3NCQUE3QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgT25Jbml0LFxyXG4gIFZpZXdDaGlsZCxcclxuICBFbGVtZW50UmVmLFxyXG4gIElucHV0LFxyXG4gIE91dHB1dCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgVmlld0VuY2Fwc3VsYXRpb24sXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCAqIGFzIGQzIGZyb20gJ2QzJztcclxuaW1wb3J0IHsgQ29tcG9uZW50VW5pcXVlSWQgfSBmcm9tICcuLi91bmlxdWUtaWQnO1xyXG5pbXBvcnQgQ2hhcnRIZWxwZXIgZnJvbSAnLi4vY2hhcnQtaGVscGVyJztcclxuaW1wb3J0IHsgUmVzaXplZEV2ZW50IH0gZnJvbSAnYW5ndWxhci1yZXNpemUtZXZlbnQnO1xyXG5pbXBvcnQgSGVhZGVyQ29uZmlnSGVscGVyIGZyb20gJy4uL2hlYWRlci1jb25maWcnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItZ3VhZ2UtY2hhcnQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9ndWFnZS1jaGFydC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZ3VhZ2UtY2hhcnQuY29tcG9uZW50Lmxlc3MnLCAnLi4vY29tbW9uLXN0eWxlcy5sZXNzJ10sXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxufSlcclxuZXhwb3J0IGNsYXNzIEd1YWdlQ2hhcnRDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRVbmlxdWVJZCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgQFZpZXdDaGlsZCgnZ3VhZ2VjaGFydGNvbnRhaW5lcicsIHsgc3RhdGljOiB0cnVlIH0pIGNvbnRhaW5lckVsdCE6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgnZ3VhZ2Vjb250YWluZXInLCB7IHN0YXRpYzogdHJ1ZSB9KSBndWFnZWNvbnRhaW5lckVsdCE6IEVsZW1lbnRSZWY7XHJcblxyXG4gIEBJbnB1dCgpIGNoYXJ0RGF0YTogYW55O1xyXG4gIEBJbnB1dCgpIGN1c3RvbUNoYXJ0Q29uZmlndXJhdGlvbjogYW55O1xyXG4gIEBPdXRwdXQoKSBjbGlja0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIGhlYWRlck1lbnVjbGlja0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIGNoYXJ0Q29uZmlndXJhdGlvbjogYW55ID0ge307XHJcbiAgZGF0YVR5cGUgPSAnJztcclxuICBkYXRhdHlwZV9zdGF0dXMgPSBmYWxzZTtcclxuICB1bmlxdWVJZCA9IHRoaXMuZ2V0VW5pcXVlSWQoKTtcclxuICBpc0hlYWRlclZpc2libGUgPSB0cnVlO1xyXG5cclxuICBkZWZhdWx0Q29uZmlndXJhdGlvbiA9IHtcclxuICAgIG1hcmdpbjogeyB0b3A6IDQwLCByaWdodDogMjAsIGJvdHRvbTogMjAsIGxlZnQ6IDIwIH0sXHJcbiAgICBtaW5BbmdsZTogLTkwLFxyXG4gICAgbWF4QW5nbGU6IDkwLFxyXG4gICAgcmluZ0luc2V0OiAyMCxcclxuICAgIHJpbmdXaWR0aDogMjAsXHJcbiAgICBtYWpvclRpY2tzOiAzLFxyXG4gICAgc3ZnSGVpZ2h0OiA4MCxcclxuICAgIGxvd19jb2xvck1hcDogWycjNDNDQzAwJywgJyNGRkVGMEMnLCAnI0ZGNEUwQyddLFxyXG4gICAgaGlnaF9jb2xvck1hcDogWycjRkY0RTBDJywgJyNGRkVGMEMnLCAnIzQzQ0MwMCddLFxyXG4gICAgaXNIZWFkZXJWaXNpYmxlOiB1bmRlZmluZWQsXHJcbiAgICBwb2ludGVyV2lkdGg6IDEwLFxyXG4gICAgcG9pbnRlclRhaWxMZW5ndGg6IDUsXHJcbiAgICBwb2ludGVySGVhZExlbmd0aFBlcmNlbnQ6IDAuNyxcclxuICAgIGxhYmVsSW5zZXQ6IDEwLFxyXG4gICAgbGVnZW5kSnVzdGlmaWVkOiBmYWxzZSxcclxuICAgIGJhY2tncm91bmRDb2xvcjogJyNGRkZGRkYnLFxyXG4gICAgaXNEcmlsbGRvd25DaGFydDogdW5kZWZpbmVkLFxyXG4gICAgcmluZ1NjYWxlRmFjdG9yOiAwLFxyXG4gICAgdGV4dHNBdENlbnRlclNjYWxlRmFjdG9yOiAwLFxyXG4gICAgY3VycmVudFZhbHVlV2lkdGhTY2FsZUZhY3RvcjogNjAsXHJcbiAgICBjdXJyZW50VmFsdWVIZWlnaHRTY2FsZUZhY3RvcjogMzAsXHJcbiAgICBwb2ludGVyQ29sb3I6ICcjNjg2ODY4JyxcclxuICAgIGlzVG9nZ2xlVmlzaWJsZTogdW5kZWZpbmVkLFxyXG4gICAgc2VsZWN0ZWRLcGlUb29sdG9wOiB1bmRlZmluZWQsXHJcbiAgICBpc1ZhbHVlTGFibGVBZGp1c3Q6IHVuZGVmaW5lZCxcclxuICAgIGlzVGl0bGVIaWRkZW46IHVuZGVmaW5lZCxcclxuICAgIGhlYWRlck1lbnVPcHRpb25zOiBIZWFkZXJDb25maWdIZWxwZXIuaGVhZGVyQ29uZmlnLmhlYWRlck1lbnVPcHRpb25zLFxyXG4gIH07XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgc3VwZXIoKTtcclxuICB9XHJcblxyXG4gIGdldCBpc0FsZXJ0RW5hYmxlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbj8uaGVhZGVyTWVudU9wdGlvbnM/LnNvbWUoXHJcbiAgICAgIChvcHRpb24pID0+IG9wdGlvbi5pZCA9PT0gJ2VkaXRBbGVydCdcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHt9XHJcblxyXG4gIG5nT25DaGFuZ2VzKCkge1xyXG4gICAgdGhpcy5yZWRyYXdDaGFydCgpO1xyXG4gIH1cclxuXHJcbiAgb25SZXNpemVkKF9ldmVudDogUmVzaXplZEV2ZW50KSB7XHJcbiAgICB0aGlzLnJlZHJhd0NoYXJ0KCk7XHJcbiAgfVxyXG5cclxuICAvKiogXHJcbiAgICogQ2xlYXJzIHRoZSBwcmV2aW91cyBTVkcgYW5kIHJlZHJhd3MgY2hhcnQgXHJcbiAgICovXHJcbiAgcHJpdmF0ZSByZWRyYXdDaGFydCgpOiB2b2lkIHtcclxuICAgIGQzLnNlbGVjdCgnIycgKyB0aGlzLnVuaXF1ZUlkKS5yZW1vdmUoKTtcclxuICAgIHRoaXMuaW5pdGlhbGl6ZUxpbmVDaGFydCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFxyXG4gICAqIE1haW4gZW50cnkgcG9pbnQgZm9yIGNoYXJ0IHJlbmRlcmluZyBcclxuICAgKi9cclxuICBwcml2YXRlIGluaXRpYWxpemVMaW5lQ2hhcnQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnByZXBhcmVDb25maWd1cmF0aW9uKCk7XHJcbiAgICBjb25zdCB7IGRhdGEsIG1ldGFEYXRhLCBjb2xvck1hcHMsIGRhdGFfcmVhZHksIGFuZ2xlVmFsdWUsIHJhZGl1cyB9ID1cclxuICAgICAgdGhpcy5wcm9jZXNzQ2hhcnREYXRhKCk7XHJcblxyXG4gICAgY29uc3Qgc3ZnID0gdGhpcy5jcmVhdGVTdmdDb250YWluZXIocmFkaXVzKTtcclxuICAgIHRoaXMuZHJhd0FyY3Moc3ZnLCBkYXRhX3JlYWR5LCBjb2xvck1hcHMsIG1ldGFEYXRhKTtcclxuICAgIHRoaXMuZHJhd1BvaW50ZXIoc3ZnLCBtZXRhRGF0YSwgZGF0YV9yZWFkeSwgcmFkaXVzKTtcclxuICAgIHRoaXMuZHJhd0xhYmVscyhzdmcsIGRhdGFfcmVhZHksIHJhZGl1cywgbWV0YURhdGEpO1xyXG4gICAgdGhpcy5kcmF3VGV4dHMoc3ZnLCBtZXRhRGF0YSwgcmFkaXVzKTtcclxuICB9XHJcblxyXG4gIC8qKiBcclxuICAgKiBQcmVwYXJlIGNoYXJ0IGNvbmZpZ3VyYXRpb24gXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBwcmVwYXJlQ29uZmlndXJhdGlvbigpOiB2b2lkIHtcclxuICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuZGVmYXVsdENvbmZpZ3VyYXRpb24pIHtcclxuICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb25ba2V5XSA9IENoYXJ0SGVscGVyLmdldFZhbHVlQnlDb25maWd1cmF0aW9uVHlwZShcclxuICAgICAgICBrZXksXHJcbiAgICAgICAgdGhpcy5kZWZhdWx0Q29uZmlndXJhdGlvbixcclxuICAgICAgICB0aGlzLmN1c3RvbUNoYXJ0Q29uZmlndXJhdGlvblxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0hlYWRlclZpc2libGUgIT09IHVuZGVmaW5lZClcclxuICAgICAgdGhpcy5pc0hlYWRlclZpc2libGUgPSB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0hlYWRlclZpc2libGU7XHJcbiAgfVxyXG5cclxuICAvKiogXHJcbiAgICogUHJvY2VzcyBkYXRhLCBjYWxjdWxhdGUgY29sb3JzIGFuZCBhbmdsZXMgXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBwcm9jZXNzQ2hhcnREYXRhKCkge1xyXG4gICAgY29uc3QgbWV0YURhdGEgPSB0aGlzLmNoYXJ0RGF0YS5tZXRhRGF0YTtcclxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmNoYXJ0RGF0YS5kYXRhO1xyXG4gICAgY29uc3QgY29sb3JUeXBlID0gbWV0YURhdGEuY29sb3JUeXBlIHx8ICdoaWdoJztcclxuICAgIGNvbnN0IGNvbG9yTWFwcyA9XHJcbiAgICAgIGNvbG9yVHlwZSA9PT0gJ2xvdydcclxuICAgICAgICA/IHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmxvd19jb2xvck1hcFxyXG4gICAgICAgIDogdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaGlnaF9jb2xvck1hcDtcclxuXHJcbiAgICBpZiAobWV0YURhdGEuZGF0YVR5cGUpIHtcclxuICAgICAgdGhpcy5kYXRhVHlwZSA9IG1ldGFEYXRhLmRhdGFUeXBlID09PSAnVVNEJyA/ICckICcgOiBtZXRhRGF0YS5kYXRhVHlwZTtcclxuICAgICAgdGhpcy5kYXRhdHlwZV9zdGF0dXMgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGRhdGFfcmVhZHkgPSBkYXRhLnNsaWNlKDAsIC0xKS5tYXAoKHYsIGkpID0+IGRhdGFbaSArIDFdIC0gdik7XHJcbiAgICBjb25zdCB0b3RhbCA9IGQzLnN1bShkYXRhX3JlYWR5KTtcclxuICAgIGNvbnN0IGFuZ2xlVmFsdWUgPSBkYXRhX3JlYWR5LnJlZHVjZSgoYWNjLCBjdXJyLCBpKSA9PiB7XHJcbiAgICAgIGNvbnN0IHByZXYgPSBhY2NbaSAtIDFdIHx8IDA7XHJcbiAgICAgIGFjYy5wdXNoKHByZXYgKyAoY3VyciAvIHRvdGFsKSAqIDE4MCk7XHJcbiAgICAgIHJldHVybiBhY2M7XHJcbiAgICB9LCBbXSBhcyBudW1iZXJbXSk7XHJcblxyXG4gICAgY29uc3Qgd2lkdGggPVxyXG4gICAgICBwYXJzZUludChkMy5zZWxlY3QodGhpcy5jb250YWluZXJFbHQubmF0aXZlRWxlbWVudCkuc3R5bGUoJ3dpZHRoJykpIC1cclxuICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubWFyZ2luLmxlZnQgLVxyXG4gICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5tYXJnaW4ucmlnaHQ7XHJcbiAgICBjb25zdCBoZWlnaHQgPVxyXG4gICAgICBwYXJzZUludChkMy5zZWxlY3QodGhpcy5ndWFnZWNvbnRhaW5lckVsdC5uYXRpdmVFbGVtZW50KS5zdHlsZSgnaGVpZ2h0JykpIC1cclxuICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubWFyZ2luLnRvcCAtXHJcbiAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLm1hcmdpbi5ib3R0b20gLVxyXG4gICAgICA1NjtcclxuXHJcbiAgICBjb25zdCByYWRpdXMgPSBNYXRoLm1pbih3aWR0aCwgaGVpZ2h0KSAvIDI7XHJcblxyXG4gICAgcmV0dXJuIHsgZGF0YSwgbWV0YURhdGEsIGNvbG9yTWFwcywgZGF0YV9yZWFkeSwgYW5nbGVWYWx1ZSwgcmFkaXVzIH07XHJcbiAgfVxyXG5cclxuICAvKiogXHJcbiAgICogQ3JlYXRlIFNWRyBiYXNlIGNvbnRhaW5lciBcclxuICAgKi9cclxuICBwcml2YXRlIGNyZWF0ZVN2Z0NvbnRhaW5lcihyYWRpdXM6IG51bWJlcikge1xyXG4gICAgY29uc3QgbWFyZ2luID0gdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubWFyZ2luO1xyXG4gICAgY29uc3QgY2hhcnRDb250YWluZXIgPSBkMy5zZWxlY3QodGhpcy5jb250YWluZXJFbHQubmF0aXZlRWxlbWVudCk7XHJcbiAgICBjb25zdCB3aWR0aCA9IHBhcnNlSW50KGNoYXJ0Q29udGFpbmVyLnN0eWxlKCd3aWR0aCcpKTtcclxuICAgIGNvbnN0IGhlaWdodCA9IHBhcnNlSW50KGNoYXJ0Q29udGFpbmVyLnN0eWxlKCdoZWlnaHQnKSk7XHJcblxyXG4gICAgY29uc3Qgc3ZnID0gY2hhcnRDb250YWluZXJcclxuICAgICAgLmFwcGVuZCgnc3ZnJylcclxuICAgICAgLmF0dHIoJ2lkJywgdGhpcy51bmlxdWVJZClcclxuICAgICAgLmF0dHIoJ3dpZHRoJywgd2lkdGgpXHJcbiAgICAgIC5hdHRyKCdoZWlnaHQnLCBoZWlnaHQpXHJcbiAgICAgIC5jYWxsKENoYXJ0SGVscGVyLnJlc3BvbnNpdmVmeSlcclxuICAgICAgLmFwcGVuZCgnZycpXHJcbiAgICAgIC5hdHRyKFxyXG4gICAgICAgICd0cmFuc2Zvcm0nLFxyXG4gICAgICAgIGB0cmFuc2xhdGUoJHttYXJnaW4ubGVmdCArIHJhZGl1c30sICR7bWFyZ2luLnRvcCArIHJhZGl1c30pYFxyXG4gICAgICApO1xyXG5cclxuICAgIHJldHVybiBzdmc7XHJcbiAgfVxyXG5cclxuICAvKiogXHJcbiAgICogRHJhdyBnYXVnZSBhcmNzIFxyXG4gICAqL1xyXG4gIHByaXZhdGUgZHJhd0FyY3Moc3ZnLCBkYXRhX3JlYWR5LCBjb2xvck1hcHMsIG1ldGFEYXRhKSB7XHJcbiAgICBjb25zdCBhcmMgPSBkM1xyXG4gICAgICAuYXJjKClcclxuICAgICAgLmlubmVyUmFkaXVzKFxyXG4gICAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnJpbmdXaWR0aCArXHJcbiAgICAgICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5yaW5nSW5zZXQgLVxyXG4gICAgICAgICAgMjBcclxuICAgICAgKVxyXG4gICAgICAub3V0ZXJSYWRpdXModGhpcy5jaGFydENvbmZpZ3VyYXRpb24ucmluZ1dpZHRoICsgNDApXHJcbiAgICAgIC5zdGFydEFuZ2xlKChfLCBpKSA9PiB0aGlzLmRlZzJyYWQodGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubWluQW5nbGUgKyAoaSA/IGkgKiA2MCA6IDApKSlcclxuICAgICAgLmVuZEFuZ2xlKChfLCBpKSA9PiB0aGlzLmRlZzJyYWQodGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubWluQW5nbGUgKyAoaSArIDEpICogNjApKTtcclxuXHJcbiAgICBjb25zdCBpc0NsaWNrYWJsZSA9IG1ldGFEYXRhLmhhc0RyaWxsRG93biAmJiBtZXRhRGF0YS5jdXJyZW50VmFsdWUgPiAwO1xyXG5cclxuICAgIHN2Z1xyXG4gICAgICAuYXBwZW5kKCdnJylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2FyYycpXHJcbiAgICAgIC5zZWxlY3RBbGwoJ3BhdGgnKVxyXG4gICAgICAuZGF0YShkYXRhX3JlYWR5KVxyXG4gICAgICAuZW50ZXIoKVxyXG4gICAgICAuYXBwZW5kKCdwYXRoJylcclxuICAgICAgLmF0dHIoJ2ZpbGwnLCAoXywgaSkgPT4gY29sb3JNYXBzW2ldKVxyXG4gICAgICAuYXR0cignZCcsIGFyYylcclxuICAgICAgLnN0eWxlKCdjdXJzb3InLCBpc0NsaWNrYWJsZSA/ICdwb2ludGVyJyA6ICdkZWZhdWx0JylcclxuICAgICAgLm9uKCdjbGljaycsIChldmVudCwgZCkgPT4ge1xyXG4gICAgICAgIGlmIChpc0NsaWNrYWJsZSkgdGhpcy5oYW5kbGVDbGljayhkKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogXHJcbiAgICogRHJhdyB0aGUgcG9pbnRlci9uZWVkbGUgXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBkcmF3UG9pbnRlcihzdmcsIG1ldGFEYXRhLCBkYXRhX3JlYWR5LCByYWRpdXMpIHtcclxuICAgIGNvbnN0IHBvaW50ZXJWYWx1ZSA9IG1ldGFEYXRhLmN1cnJlbnRWYWx1ZSAtIHRoaXMuY2hhcnREYXRhLmRhdGFbMF07XHJcbiAgICBjb25zdCByYW5nZSA9XHJcbiAgICAgIHRoaXMuY2hhcnREYXRhLmRhdGFbdGhpcy5jaGFydERhdGEuZGF0YS5sZW5ndGggLSAxXSAtXHJcbiAgICAgIHRoaXMuY2hhcnREYXRhLmRhdGFbMF07XHJcbiAgICBjb25zdCBwb2ludGVyQW5nbGUgPVxyXG4gICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5taW5BbmdsZSArIChwb2ludGVyVmFsdWUgLyByYW5nZSkgKiAxODA7XHJcblxyXG4gICAgY29uc3QgcG9pbnRlckhlYWRMZW5ndGggPSBNYXRoLnJvdW5kKFxyXG4gICAgICByYWRpdXMgKiB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5wb2ludGVySGVhZExlbmd0aFBlcmNlbnRcclxuICAgICk7XHJcblxyXG4gICAgY29uc3QgbGluZURhdGEgPSBbXHJcbiAgICAgIFt0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5wb2ludGVyV2lkdGggLyAyLCAwXSxcclxuICAgICAgWzAsIC1wb2ludGVySGVhZExlbmd0aF0sXHJcbiAgICAgIFstdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ucG9pbnRlcldpZHRoIC8gMiwgMF0sXHJcbiAgICAgIFswLCB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5wb2ludGVyVGFpbExlbmd0aF0sXHJcbiAgICAgIFt0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5wb2ludGVyV2lkdGggLyAyLCAwXSxcclxuICAgIF07XHJcblxyXG4gICAgc3ZnXHJcbiAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAncG9pbnRlcicpXHJcbiAgICAgIC5hcHBlbmQoJ3BhdGgnKVxyXG4gICAgICAuYXR0cignZCcsIGQzLmxpbmUoKShsaW5lRGF0YSkpXHJcbiAgICAgIC5hdHRyKCdmaWxsJywgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ucG9pbnRlckNvbG9yKVxyXG4gICAgICAuYXR0cihcclxuICAgICAgICAndHJhbnNmb3JtJyxcclxuICAgICAgICBgcm90YXRlKCR7cG9pbnRlckFuZ2xlfSkgdHJhbnNsYXRlKDAsICR7XHJcbiAgICAgICAgICAtcmFkaXVzICtcclxuICAgICAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnJpbmdXaWR0aCArXHJcbiAgICAgICAgICBwb2ludGVySGVhZExlbmd0aFxyXG4gICAgICAgIH0pYFxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqIFxyXG4gICAqIERyYXcgbnVtZXJpYyBsYWJlbHMgYXJvdW5kIGdhdWdlIFxyXG4gICAqL1xyXG4gIHByaXZhdGUgZHJhd0xhYmVscyhzdmcsIGRhdGFfcmVhZHksIHJhZGl1cywgbWV0YURhdGEpIHtcclxuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmNoYXJ0RGF0YS5kYXRhO1xyXG4gICAgY29uc3QgcmFuZ2UgPSBkYXRhW2RhdGEubGVuZ3RoIC0gMV0gLSBkYXRhWzBdO1xyXG4gICAgY29uc3QgbGFiZWxBcnJheSA9IFt7IG5hbWU6IGRhdGFbMF0sIHZhbHVlOiAwIH1dO1xyXG4gICAgZGF0YV9yZWFkeS5yZWR1Y2UoKHN1bSwgdmFsLCBpKSA9PiB7XHJcbiAgICAgIGNvbnN0IG5ld1N1bSA9IHN1bSArIHZhbDtcclxuICAgICAgbGFiZWxBcnJheS5wdXNoKHsgbmFtZTogZGF0YVtpICsgMV0sIHZhbHVlOiBuZXdTdW0gfSk7XHJcbiAgICAgIHJldHVybiBuZXdTdW07XHJcbiAgICB9LCAwKTtcclxuXHJcbiAgICBjb25zdCBsYWJlbEdyb3VwID0gc3ZnLmFwcGVuZCgnZycpLmF0dHIoJ2NsYXNzJywgJ2xhYmVscycpO1xyXG4gICAgbGFiZWxHcm91cFxyXG4gICAgICAuc2VsZWN0QWxsKCd0ZXh0JylcclxuICAgICAgLmRhdGEobGFiZWxBcnJheSlcclxuICAgICAgLmVudGVyKClcclxuICAgICAgLmFwcGVuZCgndGV4dCcpXHJcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAoZCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5ld0FuZ2xlID1cclxuICAgICAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLm1pbkFuZ2xlICsgKGQudmFsdWUgLyByYW5nZSkgKiAxODA7XHJcbiAgICAgICAgcmV0dXJuIGByb3RhdGUoJHtuZXdBbmdsZX0pIHRyYW5zbGF0ZSgwLCAke1xyXG4gICAgICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubGFiZWxJbnNldCAtIHJhZGl1cyAtIDIwXHJcbiAgICAgICAgfSlgO1xyXG4gICAgICB9KVxyXG4gICAgICAuYXR0cignZmlsbCcsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpXHJcbiAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgJzE0cHgnKVxyXG4gICAgICAuc3R5bGUoJ2ZvbnQtd2VpZ2h0JywgJzYwMCcpXHJcbiAgICAgIC50ZXh0KChkKSA9PlxyXG4gICAgICAgIG1ldGFEYXRhLmRhdGFUeXBlID8gYCR7ZC5uYW1lfSR7bWV0YURhdGEuZGF0YVR5cGV9YCA6IGQubmFtZVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqIFxyXG4gICAqIERyYXcgdGV4dHMgKHZhbHVlLCBzdGF0dXMsIGRhdGUpIFxyXG4gICAqL1xyXG4gIHByaXZhdGUgZHJhd1RleHRzKHN2ZywgbWV0YURhdGEsIHJhZGl1cykge1xyXG4gICAgY29uc3QgdG9wWSA9IHJhZGl1cyAvIDIgLSAxMDtcclxuICAgIGNvbnN0IG1pZFkgPSB0b3BZICsgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uY3VycmVudFZhbHVlSGVpZ2h0U2NhbGVGYWN0b3I7XHJcbiAgICBjb25zdCBib3R0b21ZID1cclxuICAgICAgbWlkWSArIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmN1cnJlbnRWYWx1ZUhlaWdodFNjYWxlRmFjdG9yO1xyXG5cclxuICAgIHN2Z1xyXG4gICAgICAuYXBwZW5kKCdmb3JlaWduT2JqZWN0JylcclxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoJHtyYWRpdXMgLSA1MH0sICR7dG9wWX0pYClcclxuICAgICAgLmF0dHIoJ3dpZHRoJywgMTAwKVxyXG4gICAgICAuYXR0cignaGVpZ2h0JywgNDApXHJcbiAgICAgIC5hcHBlbmQoJ3hodG1sOmRpdicpXHJcbiAgICAgIC5hdHRyKCdjbGFzcycsICd2YWx1ZS1kaXNwbGF5JylcclxuICAgICAgLmh0bWwoYCR7bWV0YURhdGEuY3VycmVudFZhbHVlfSR7bWV0YURhdGEuZGF0YVR5cGUgfHwgJyd9YCk7XHJcblxyXG4gICAgaWYgKG1ldGFEYXRhLnN0YXR1cykge1xyXG4gICAgICBzdmdcclxuICAgICAgICAuYXBwZW5kKCdmb3JlaWduT2JqZWN0JylcclxuICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgke3JhZGl1cyAtIDYwfSwgJHttaWRZfSlgKVxyXG4gICAgICAgIC5hdHRyKCd3aWR0aCcsIDEyMClcclxuICAgICAgICAuYXR0cignaGVpZ2h0JywgNDApXHJcbiAgICAgICAgLmFwcGVuZCgneGh0bWw6ZGl2JylcclxuICAgICAgICAuYXR0cignY2xhc3MnLCAnc3RhdHVzLWRpc3BsYXknKVxyXG4gICAgICAgIC5odG1sKG1ldGFEYXRhLnN0YXR1cyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG1ldGFEYXRhLmRhdGVSYW5nZSkge1xyXG4gICAgICBzdmdcclxuICAgICAgICAuYXBwZW5kKCdmb3JlaWduT2JqZWN0JylcclxuICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgke3JhZGl1cyAtIDEwNX0sICR7Ym90dG9tWX0pYClcclxuICAgICAgICAuYXR0cignd2lkdGgnLCAyMTApXHJcbiAgICAgICAgLmF0dHIoJ2hlaWdodCcsIDQwKVxyXG4gICAgICAgIC5hcHBlbmQoJ3hodG1sOmRpdicpXHJcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2RhdGVyYW5nZS1kaXNwbGF5JylcclxuICAgICAgICAuaHRtbChcclxuICAgICAgICAgIGA8c3BhbiBjbGFzcz1cIm1hcmdpbnJpZ2h0LTNcIj48aSBjbGFzcz1cImZhIGZhLWNhbGVuZGFyXCI+PC9pPjwvc3Bhbj4ke21ldGFEYXRhLmRhdGVSYW5nZX1gXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBDb252ZXJ0IGRlZ3JlZXMgdG8gcmFkaWFucyAqL1xyXG4gIHByaXZhdGUgZGVnMnJhZChkZWc6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gKGRlZyAqIE1hdGguUEkpIC8gMTgwO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlQ2xpY2soZDogYW55KSB7XHJcbiAgICB0aGlzLmNsaWNrRXZlbnQuZW1pdChkKTtcclxuICB9XHJcblxyXG4gIGhhbmRsZUhlYWRlck1lbnVDbGljayhpZDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmhlYWRlck1lbnVjbGlja0V2ZW50LmVtaXQoaWQpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2ICNndWFnZWNvbnRhaW5lciBjbGFzcz1cImxpYi1jaGFydC13cmFwcGVyXCIgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jYXJkLWJnKTtcIlxyXG4gIChyZXNpemVkKT1cIm9uUmVzaXplZCgkZXZlbnQpXCI+XHJcbiAgPGRpdiBjbGFzcz1cImhlYWRlci1hbHRcIiAqbmdJZj1cIiFpc0hlYWRlclZpc2libGVcIj5cclxuICAgIDxsaWItY2hhcnQtaGVhZGVyLXYyIFtjaGFydERhdGFdPVwiY2hhcnREYXRhXCIgW2NoYXJ0Q29uZmlndXJhdGlvbl09XCJjaGFydENvbmZpZ3VyYXRpb25cIlxyXG4gICAgICAoY2xpY2tFdmVudCk9XCJoYW5kbGVDbGljaygkZXZlbnQpXCI+PC9saWItY2hhcnQtaGVhZGVyLXYyPlxyXG4gIDwvZGl2PlxyXG4gIDxsaWItY2hhcnQtaGVhZGVyLXYxIFt0aXRsZV09XCJjaGFydERhdGEubWV0YURhdGEudGl0bGVcIiBbaGFzRHJpbGxEb3duXT1cImNoYXJ0RGF0YS5tZXRhRGF0YS5oYXNEcmlsbERvd25cIlxyXG4gICAgW2lzRWRpdEVuYWJsZWRdPVwiY2hhcnREYXRhLm1ldGFEYXRhLmlzRWRpdEVuYWJsZWRcIiBbaXNyaWFdPVwiY3VzdG9tQ2hhcnRDb25maWd1cmF0aW9uLmlzUmlhXCIgW21lbnVPcHRpb25zXT1cImNoYXJ0Q29uZmlndXJhdGlvbi5oZWFkZXJNZW51T3B0aW9uc1wiXHJcbiAgICBbc2VsZWN0ZWRLcGlUb29sdG9wXT1cImNoYXJ0Q29uZmlndXJhdGlvbi5zZWxlY3RlZEtwaVRvb2x0b3BcIiAobWVudU9wdGlvbkNsaWNrRXZlbnQpPVwiaGFuZGxlSGVhZGVyTWVudUNsaWNrKCRldmVudClcIlxyXG4gICAgW2lzQWxlcnRFbmFibGVkXT1cImlzQWxlcnRFbmFibGVkXCIgKm5nSWY9XCJpc0hlYWRlclZpc2libGVcIj48L2xpYi1jaGFydC1oZWFkZXItdjE+XHJcbiAgPGRpdiBbc3R5bGUuaGVpZ2h0XT1cImNoYXJ0Q29uZmlndXJhdGlvbi5zdmdIZWlnaHRcIiBpZD1cImd1YWdlY2hhcnRjb250YWluZXJcIiAjZ3VhZ2VjaGFydGNvbnRhaW5lclxyXG4gICAgY2xhc3M9XCJsaWItY2hhcnQtc3ZnIGd1YWdlY29udGFpbmVyXCI+PC9kaXY+XHJcbjwvZGl2PiJdfQ==
|
|
332
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VhZ2UtY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXhpZGlvLXN0eWxlZ3VpZGUtbGlicmFyeS9zcmMvbGliL2d1YWdlLWNoYXJ0L2d1YWdlLWNoYXJ0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2F4aWRpby1zdHlsZWd1aWRlLWxpYnJhcnkvc3JjL2xpYi9ndWFnZS1jaGFydC9ndWFnZS1jaGFydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFNBQVMsRUFFVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2pELE9BQU8sV0FBVyxNQUFNLGlCQUFpQixDQUFDO0FBRTFDLE9BQU8sa0JBQWtCLE1BQU0sa0JBQWtCLENBQUM7Ozs7OztBQVFsRCxNQUFNLE9BQU8sbUJBQW9CLFNBQVEsaUJBQWlCO0lBNkN4RDtRQUNFLEtBQUssRUFBRSxDQUFDO1FBeENBLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ3JDLHlCQUFvQixHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFFekQsdUJBQWtCLEdBQVEsRUFBRSxDQUFDO1FBQzdCLGFBQVEsR0FBUSxFQUFFLENBQUM7UUFDbkIsb0JBQWUsR0FBWSxLQUFLLENBQUM7UUFDakMsYUFBUSxHQUFRLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQyxvQkFBZSxHQUFZLElBQUksQ0FBQztRQUVoQyx5QkFBb0IsR0FBUTtZQUMxQixNQUFNLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVB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QixDQUFDO0lBRUQscUJBQXFCLENBQUMsRUFBRTtRQUN0QixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7K0dBNVlVLG1CQUFtQjttR0FBbkIsbUJBQW1CLHlnQkN0QmhDLHNnQ0FZTTs7NEZEVU8sbUJBQW1CO2tCQU4vQixTQUFTOytCQUNFLGlCQUFpQixpQkFHWixpQkFBaUIsQ0FBQyxJQUFJO3dEQUdlLFlBQVk7c0JBQS9ELFNBQVM7dUJBQUMscUJBQXFCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNILGlCQUFpQjtzQkFBL0QsU0FBUzt1QkFBQyxnQkFBZ0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBRXBDLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csd0JBQXdCO3NCQUFoQyxLQUFLO2dCQUNJLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csb0JBQW9CO3NCQUE3QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgT25Jbml0LFxyXG4gIFZpZXdDaGlsZCxcclxuICBFbGVtZW50UmVmLFxyXG4gIElucHV0LFxyXG4gIE91dHB1dCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgVmlld0VuY2Fwc3VsYXRpb24sXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCAqIGFzIGQzIGZyb20gJ2QzJztcclxuaW1wb3J0IHsgQ29tcG9uZW50VW5pcXVlSWQgfSBmcm9tICcuLi91bmlxdWUtaWQnO1xyXG5pbXBvcnQgQ2hhcnRIZWxwZXIgZnJvbSAnLi4vY2hhcnQtaGVscGVyJztcclxuaW1wb3J0IHsgUmVzaXplZEV2ZW50IH0gZnJvbSAnYW5ndWxhci1yZXNpemUtZXZlbnQnO1xyXG5pbXBvcnQgSGVhZGVyQ29uZmlnSGVscGVyIGZyb20gJy4uL2hlYWRlci1jb25maWcnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItZ3VhZ2UtY2hhcnQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9ndWFnZS1jaGFydC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZ3VhZ2UtY2hhcnQuY29tcG9uZW50Lmxlc3MnLCAnLi4vY29tbW9uLXN0eWxlcy5sZXNzJ10sXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxufSlcclxuZXhwb3J0IGNsYXNzIEd1YWdlQ2hhcnRDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRVbmlxdWVJZCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgQFZpZXdDaGlsZCgnZ3VhZ2VjaGFydGNvbnRhaW5lcicsIHsgc3RhdGljOiB0cnVlIH0pIGNvbnRhaW5lckVsdCE6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgnZ3VhZ2Vjb250YWluZXInLCB7IHN0YXRpYzogdHJ1ZSB9KSBndWFnZWNvbnRhaW5lckVsdCE6IEVsZW1lbnRSZWY7XHJcblxyXG4gIEBJbnB1dCgpIGNoYXJ0RGF0YTogYW55O1xyXG4gIEBJbnB1dCgpIGN1c3RvbUNoYXJ0Q29uZmlndXJhdGlvbjogYW55O1xyXG4gIEBPdXRwdXQoKSBjbGlja0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIGhlYWRlck1lbnVjbGlja0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIGNoYXJ0Q29uZmlndXJhdGlvbjogYW55ID0ge307XHJcbiAgZGF0YVR5cGU6IGFueSA9ICcnO1xyXG4gIGRhdGF0eXBlX3N0YXR1czogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHVuaXF1ZUlkOiBhbnkgPSB0aGlzLmdldFVuaXF1ZUlkKCk7XHJcbiAgaXNIZWFkZXJWaXNpYmxlOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgZGVmYXVsdENvbmZpZ3VyYXRpb246IGFueSA9IHtcclxuICAgIG1hcmdpbjogeyB0b3A6IDQwLCByaWdodDogMjAsIGJvdHRvbTogMjAsIGxlZnQ6IDIwIH0sXHJcbiAgICBtaW5BbmdsZTogLTkwLFxyXG4gICAgbWF4QW5nbGU6IDkwLFxyXG4gICAgcmluZ0luc2V0OiAyMCxcclxuICAgIHJpbmdXaWR0aDogMjAsXHJcbiAgICBtYWpvclRpY2tzOiAzLFxyXG4gICAgc3ZnSGVpZ2h0OiA4MCxcclxuICAgIGxvd19jb2xvck1hcDogWycjNDNDQzAwJywgJyNGRkVGMEMnLCAnI0ZGNEUwQyddLFxyXG4gICAgaGlnaF9jb2xvck1hcDogWycjRkY0RTBDJywgJyNGRkVGMEMnLCAnIzQzQ0MwMCddLFxyXG4gICAgaXNIZWFkZXJWaXNpYmxlOiB1bmRlZmluZWQsXHJcbiAgICBwb2ludGVyV2lkdGg6IDEwLFxyXG4gICAgcG9pbnRlclRhaWxMZW5ndGg6IDUsXHJcbiAgICBwb2ludGVySGVhZExlbmd0aFBlcmNlbnQ6IDAuNyxcclxuICAgIGxhYmVsSW5zZXQ6IDEwLFxyXG4gICAgbGVnZW5kSnVzdGlmaWVkOiBmYWxzZSxcclxuICAgIGJhY2tncm91bmRDb2xvcjogJyNGRkZGRkYnLFxyXG4gICAgaXNEcmlsbGRvd25DaGFydDogdW5kZWZpbmVkLFxyXG4gICAgcmluZ1NjYWxlRmFjdG9yOiAwLFxyXG4gICAgdGV4dHNBdENlbnRlclNjYWxlRmFjdG9yOiAwLFxyXG4gICAgY3VycmVudFZhbHVlV2lkdGhTY2FsZUZhY3RvcjogNjAsXHJcbiAgICBjdXJyZW50VmFsdWVIZWlnaHRTY2FsZUZhY3RvcjogMzAsXHJcbiAgICBwb2ludGVyQ29sb3I6ICcjNjg2ODY4JyxcclxuICAgIGlzVG9nZ2xlVmlzaWJsZTogdW5kZWZpbmVkLFxyXG4gICAgc2VsZWN0ZWRLcGlUb29sdG9wOiB1bmRlZmluZWQsXHJcbiAgICBpc1ZhbHVlTGFibGVBZGp1c3Q6IHVuZGVmaW5lZCxcclxuICAgIGlzVGl0bGVIaWRkZW46IHVuZGVmaW5lZCxcclxuICAgIGhlYWRlck1lbnVPcHRpb25zOiBIZWFkZXJDb25maWdIZWxwZXIuaGVhZGVyQ29uZmlnLmhlYWRlck1lbnVPcHRpb25zLFxyXG4gIH07XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgc3VwZXIoKTtcclxuICB9XHJcblxyXG4gIGdldCBpc0FsZXJ0RW5hYmxlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbj8uaGVhZGVyTWVudU9wdGlvbnM/LnNvbWUoXHJcbiAgICAgIChvcHRpb24pID0+IG9wdGlvbi5pZCA9PT0gJ2VkaXRBbGVydCdcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHt9XHJcblxyXG4gIG5nT25DaGFuZ2VzKCkge1xyXG4gICAgZDMuc2VsZWN0KCcjJyArIHRoaXMudW5pcXVlSWQpLnJlbW92ZSgpO1xyXG4gICAgdGhpcy5pbml0aWFsaXplTGluZUNoYXJ0KCk7XHJcbiAgfVxyXG5cclxuICBvblJlc2l6ZWQoZXZlbnQ6IFJlc2l6ZWRFdmVudCkge1xyXG4gICAgZDMuc2VsZWN0KCcjJyArIHRoaXMudW5pcXVlSWQpLnJlbW92ZSgpO1xyXG4gICAgdGhpcy5pbml0aWFsaXplTGluZUNoYXJ0KCk7XHJcbiAgfVxyXG5cclxuICAvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAqICBNYWluIEluaXRpYWxpemF0aW9uIEZ1bmN0aW9uXHJcbiAgICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXHJcbiAgaW5pdGlhbGl6ZUxpbmVDaGFydCgpIHtcclxuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgY29uc3QgeyBkYXRhLCBtZXRhRGF0YSB9ID0gdGhpcy5jaGFydERhdGE7XHJcbiAgICBjb25zdCBpc1JpYSA9IHRoaXMuY3VzdG9tQ2hhcnRDb25maWd1cmF0aW9uLmlzUmlhO1xyXG5cclxuICAgIHRoaXMuc2V0dXBDaGFydENvbmZpZ3VyYXRpb24oKTtcclxuICAgIGNvbnN0IHsgY29sb3JNYXBzIH0gPSB0aGlzLmdldENvbG9yTWFwKG1ldGFEYXRhKTtcclxuICAgIHRoaXMuY29uZmlndXJlRGF0YVR5cGUobWV0YURhdGEpO1xyXG5cclxuICAgIGNvbnN0IGRhdGFfcmVhZHkgPSB0aGlzLmNhbGN1bGF0ZURhdGFSZWFkeShkYXRhKTtcclxuICAgIGNvbnN0IHsgY2hhcnRDb250YWluZXIsIGd1YWdlY29udGFpbmVyLCB3aWR0aCwgaGVpZ2h0IH0gPVxyXG4gICAgICB0aGlzLnNldHVwQ29udGFpbmVyKCk7XHJcblxyXG4gICAgdGhpcy5pc0hlYWRlclZpc2libGUgPVxyXG4gICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0hlYWRlclZpc2libGUgPz8gdGhpcy5pc0hlYWRlclZpc2libGU7XHJcblxyXG4gICAgY29uc3Qgc3ZnID0gdGhpcy5jcmVhdGVTdmcoY2hhcnRDb250YWluZXIsIHdpZHRoLCBoZWlnaHQpO1xyXG4gICAgY29uc3QgcmFkaXVzID0gdGhpcy5hZGp1c3REaW1lbnNpb25zQW5kUmFkaXVzKHdpZHRoLCBoZWlnaHQpO1xyXG5cclxuICAgIGNvbnN0IGFuZ2xlVmFsdWUgPSB0aGlzLmNvbXB1dGVBbmdsZXMoZGF0YV9yZWFkeSwgZGF0YSk7XHJcbiAgICBjb25zdCBhcmMgPSB0aGlzLmNyZWF0ZUFyYyhyYWRpdXMsIGFuZ2xlVmFsdWUsIGRhdGFfcmVhZHkpO1xyXG5cclxuICAgIHRoaXMuZHJhd0dhdWdlQXJjcyhzdmcsIGFyYywgZGF0YV9yZWFkeSwgY29sb3JNYXBzLCBtZXRhRGF0YSwgaXNSaWEsIGRhdGEpO1xyXG4gICAgdGhpcy5kcmF3UG9pbnRlcihzdmcsIHJhZGl1cywgbWV0YURhdGEsIGRhdGEpO1xyXG4gICAgdGhpcy5kcmF3TGFiZWxzKHN2ZywgcmFkaXVzLCBkYXRhX3JlYWR5LCBkYXRhLCBtZXRhRGF0YSk7XHJcbiAgICB0aGlzLmRyYXdDZW50ZXJUZXh0cyhzdmcsIHJhZGl1cywgbWV0YURhdGEpO1xyXG5cclxuICAgIHRoaXMuY2VudGVyU3ZnKHN2ZywgY2hhcnRDb250YWluZXIsIHdpZHRoLCBoZWlnaHQpO1xyXG4gIH1cclxuXHJcbiAgLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgKiAgTW9kdWxhciBIZWxwZXIgRnVuY3Rpb25zXHJcbiAgICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXHJcblxyXG4gIHByaXZhdGUgc2V0dXBDaGFydENvbmZpZ3VyYXRpb24oKSB7XHJcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmRlZmF1bHRDb25maWd1cmF0aW9uKSB7XHJcbiAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uW2tleV0gPSBDaGFydEhlbHBlci5nZXRWYWx1ZUJ5Q29uZmlndXJhdGlvblR5cGUoXHJcbiAgICAgICAga2V5LFxyXG4gICAgICAgIHRoaXMuZGVmYXVsdENvbmZpZ3VyYXRpb24sXHJcbiAgICAgICAgdGhpcy5jdXN0b21DaGFydENvbmZpZ3VyYXRpb25cclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0Q29sb3JNYXAobWV0YURhdGE6IGFueSkge1xyXG4gICAgY29uc3QgY29sb3JUeXBlID0gbWV0YURhdGEuY29sb3JUeXBlO1xyXG4gICAgY29uc3QgY29sb3JNYXBzID1cclxuICAgICAgY29sb3JUeXBlID09PSAnbG93J1xyXG4gICAgICAgID8gdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubG93X2NvbG9yTWFwXHJcbiAgICAgICAgOiB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5oaWdoX2NvbG9yTWFwO1xyXG4gICAgcmV0dXJuIHsgY29sb3JNYXBzIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbmZpZ3VyZURhdGFUeXBlKG1ldGFEYXRhOiBhbnkpIHtcclxuICAgIGlmIChtZXRhRGF0YS5kYXRhVHlwZSkge1xyXG4gICAgICB0aGlzLmRhdGFUeXBlID0gbWV0YURhdGEuZGF0YVR5cGU7XHJcbiAgICAgIGlmICh0aGlzLmRhdGFUeXBlID09PSAnVVNEJykge1xyXG4gICAgICAgIHRoaXMuZGF0YXR5cGVfc3RhdHVzID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmRhdGFUeXBlID0gJyQgJztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjYWxjdWxhdGVEYXRhUmVhZHkoZGF0YTogYW55W10pOiBudW1iZXJbXSB7XHJcbiAgICBjb25zdCBkYXRhX3JlYWR5OiBudW1iZXJbXSA9IFtdO1xyXG4gICAgZGF0YS5mb3JFYWNoKChfLCBpKSA9PiB7XHJcbiAgICAgIGlmIChpIDwgZGF0YS5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgZGF0YV9yZWFkeS5wdXNoKGRhdGFbaSArIDFdIC0gZGF0YVtpXSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGRhdGFfcmVhZHk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldHVwQ29udGFpbmVyKCkge1xyXG4gICAgY29uc3QgY2hhcnRDb250YWluZXIgPSBkMy5zZWxlY3QodGhpcy5jb250YWluZXJFbHQubmF0aXZlRWxlbWVudCk7XHJcbiAgICBjb25zdCBndWFnZWNvbnRhaW5lciA9IGQzLnNlbGVjdCh0aGlzLmd1YWdlY29udGFpbmVyRWx0Lm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgY29uc3QgbWFyZ2luID0gdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubWFyZ2luO1xyXG5cclxuICAgIGNvbnN0IHdpZHRoID1cclxuICAgICAgcGFyc2VJbnQoY2hhcnRDb250YWluZXIuc3R5bGUoJ3dpZHRoJykpIC0gbWFyZ2luLmxlZnQgLSBtYXJnaW4ucmlnaHQ7XHJcbiAgICBjb25zdCBoZWlnaHQgPVxyXG4gICAgICBwYXJzZUludChndWFnZWNvbnRhaW5lci5zdHlsZSgnaGVpZ2h0JykpIC1cclxuICAgICAgbWFyZ2luLnRvcCAtXHJcbiAgICAgIG1hcmdpbi5ib3R0b20gLVxyXG4gICAgICA1NjsgLy8gY2hhcnQgaGVhZGVyIGhlaWdodFxyXG5cclxuICAgIHJldHVybiB7IGNoYXJ0Q29udGFpbmVyLCBndWFnZWNvbnRhaW5lciwgd2lkdGgsIGhlaWdodCB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVTdmcoY2hhcnRDb250YWluZXIsIHdpZHRoLCBoZWlnaHQpIHtcclxuICAgIGNvbnN0IG1hcmdpbiA9IHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLm1hcmdpbjtcclxuICAgIHJldHVybiBjaGFydENvbnRhaW5lclxyXG4gICAgICAuYXBwZW5kKCdzdmcnKVxyXG4gICAgICAuYXR0cignaWQnLCB0aGlzLnVuaXF1ZUlkKVxyXG4gICAgICAuYXR0cignd2lkdGgnLCB3aWR0aCArIG1hcmdpbi5sZWZ0ICsgbWFyZ2luLnJpZ2h0KVxyXG4gICAgICAuYXR0cignaGVpZ2h0JywgaGVpZ2h0ICsgbWFyZ2luLnRvcCArIG1hcmdpbi5ib3R0b20pXHJcbiAgICAgIC5jYWxsKENoYXJ0SGVscGVyLnJlc3BvbnNpdmVmeSlcclxuICAgICAgLmFwcGVuZCgnZycpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZGp1c3REaW1lbnNpb25zQW5kUmFkaXVzKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IHJhZGl1cyA9IE1hdGgubWluKHdpZHRoLCBoZWlnaHQpIC8gMjtcclxuXHJcbiAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNEcmlsbGRvd25DaGFydCkge1xyXG4gICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5jdXJyZW50VmFsdWVXaWR0aFNjYWxlRmFjdG9yICs9IDQwO1xyXG4gICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5jdXJyZW50VmFsdWVIZWlnaHRTY2FsZUZhY3RvciArPSAyMDtcclxuICAgIH0gZWxzZSBpZiAod2luZG93LmlubmVyV2lkdGggPiAxNDAwKSB7XHJcbiAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmN1cnJlbnRWYWx1ZUhlaWdodFNjYWxlRmFjdG9yICs9IDE1O1xyXG4gICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5jdXJyZW50VmFsdWVXaWR0aFNjYWxlRmFjdG9yICo9IDI7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJhZGl1cztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29tcHV0ZUFuZ2xlcyhkYXRhX3JlYWR5OiBudW1iZXJbXSwgZGF0YTogYW55W10pOiBudW1iZXJbXSB7XHJcbiAgICBjb25zdCB0b3RhbCA9IGRhdGFfcmVhZHkucmVkdWNlKChzdW0sIHZhbCkgPT4gc3VtICsgdmFsLCAwKTtcclxuICAgIGNvbnN0IHRlbXBBcnJheTogbnVtYmVyW10gPSBbXTtcclxuXHJcbiAgICBkYXRhX3JlYWR5LmZvckVhY2goKHVuaXQsIGkpID0+IHtcclxuICAgICAgY29uc3QgYW5nbGUgPSAodW5pdCAvIHRvdGFsKSAqIDE4MDtcclxuICAgICAgdGVtcEFycmF5LnB1c2goaSA9PT0gMCA/IGFuZ2xlIDogdGVtcEFycmF5W2kgLSAxXSArIGFuZ2xlKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB0ZW1wQXJyYXk7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVBcmMocmFkaXVzOiBudW1iZXIsIGFuZ2xlVmFsdWU6IG51bWJlcltdLCBkYXRhX3JlYWR5OiBudW1iZXJbXSkge1xyXG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICBjb25zdCBkZWcycmFkID0gKGRlZzogbnVtYmVyKSA9PiAoZGVnICogTWF0aC5QSSkgLyAxODA7XHJcblxyXG4gICAgcmV0dXJuIGQzXHJcbiAgICAgIC5hcmMoKVxyXG4gICAgICAuaW5uZXJSYWRpdXMoXHJcbiAgICAgICAgcmFkaXVzIC1cclxuICAgICAgICAgIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnJpbmdXaWR0aCAtXHJcbiAgICAgICAgICBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5yaW5nSW5zZXRcclxuICAgICAgKVxyXG4gICAgICAub3V0ZXJSYWRpdXMocmFkaXVzKVxyXG4gICAgICAuc3RhcnRBbmdsZSgoXywgaSkgPT5cclxuICAgICAgICBkZWcycmFkKFxyXG4gICAgICAgICAgaSA9PT0gMFxyXG4gICAgICAgICAgICA/IHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLm1pbkFuZ2xlXHJcbiAgICAgICAgICAgIDogc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubWluQW5nbGUgKyBhbmdsZVZhbHVlW2kgLSAxXVxyXG4gICAgICAgIClcclxuICAgICAgKVxyXG4gICAgICAuZW5kQW5nbGUoKF8sIGkpID0+XHJcbiAgICAgICAgZGVnMnJhZChcclxuICAgICAgICAgIGkgPT09IGRhdGFfcmVhZHkubGVuZ3RoIC0gMVxyXG4gICAgICAgICAgICA/IHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLm1heEFuZ2xlXHJcbiAgICAgICAgICAgIDogc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubWluQW5nbGUgKyBhbmdsZVZhbHVlW2ldXHJcbiAgICAgICAgKVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkcmF3R2F1Z2VBcmNzKHN2ZywgYXJjLCBkYXRhX3JlYWR5LCBjb2xvck1hcHMsIG1ldGFEYXRhLCBpc1JpYSwgZGF0YSkge1xyXG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICBjb25zdCBhcmNzID0gc3ZnXHJcbiAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXJjJylcclxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIHRoaXMuY2VudGVyVHJhbnNsYXRpb24oYXJjLm91dGVyUmFkaXVzKCkoKSkpO1xyXG5cclxuICAgIGFyY3NcclxuICAgICAgLnNlbGVjdEFsbCgncGF0aCcpXHJcbiAgICAgIC5kYXRhKGRhdGFfcmVhZHkpXHJcbiAgICAgIC5lbnRlcigpXHJcbiAgICAgIC5hcHBlbmQoJ3BhdGgnKVxyXG4gICAgICAuYXR0cignZmlsbCcsIChfLCBpKSA9PiBjb2xvck1hcHNbaV0pXHJcbiAgICAgIC5zdHlsZSgnY3Vyc29yJywgKCkgPT5cclxuICAgICAgICBtZXRhRGF0YS5jdXJyZW50VmFsdWUgPiAwICYmIG1ldGFEYXRhLmhhc0RyaWxsRG93biAmJiAhaXNSaWFcclxuICAgICAgICAgID8gJ3BvaW50ZXInXHJcbiAgICAgICAgICA6ICdkZWZhdWx0J1xyXG4gICAgICApXHJcbiAgICAgIC5hdHRyKCdkJywgYXJjKVxyXG4gICAgICAub24oJ2NsaWNrJywgKGQpID0+IHtcclxuICAgICAgICBpZiAoIW1ldGFEYXRhLmhhc0RyaWxsRG93biB8fCBtZXRhRGF0YS5jdXJyZW50VmFsdWUgPT09IDApIHJldHVybjtcclxuICAgICAgICBjb25zdCByYW5nZSA9IGAke2RhdGFbMF19IGFuZCAke2RhdGFbZGF0YS5sZW5ndGggLSAxXX1gO1xyXG4gICAgICAgIHNlbGYuaGFuZGxlQ2xpY2socmFuZ2UpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZHJhd1BvaW50ZXIoc3ZnLCByYWRpdXMsIG1ldGFEYXRhLCBkYXRhKSB7XHJcbiAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgIGNvbnN0IHBvaW50ZXJIZWFkTGVuZ3RoID0gTWF0aC5yb3VuZChcclxuICAgICAgcmFkaXVzICogc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ucG9pbnRlckhlYWRMZW5ndGhQZXJjZW50XHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IGxpbmVEYXRhID0gW1xyXG4gICAgICBbc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ucG9pbnRlcldpZHRoIC8gMiwgMF0sXHJcbiAgICAgIFswLCAtcG9pbnRlckhlYWRMZW5ndGhdLFxyXG4gICAgICBbLShzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5wb2ludGVyV2lkdGggLyAyKSwgMF0sXHJcbiAgICAgIFswLCBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5wb2ludGVyVGFpbExlbmd0aF0sXHJcbiAgICAgIFtzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5wb2ludGVyV2lkdGggLyAyLCAwXSxcclxuICAgIF07XHJcblxyXG4gICAgY29uc3QgcG9pbnRlckxpbmUgPSBkMy5saW5lKCk7XHJcbiAgICBjb25zdCBwZyA9IHN2Z1xyXG4gICAgICAuYXBwZW5kKCdnJylcclxuICAgICAgLmRhdGEoW2xpbmVEYXRhXSlcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ3BvaW50ZXInKVxyXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgdGhpcy5jZW50ZXJUcmFuc2xhdGlvbihyYWRpdXMpKTtcclxuXHJcbiAgICBjb25zdCBwb2ludGVyVmFsdWUgPSBtZXRhRGF0YS5jdXJyZW50VmFsdWUgLSBkYXRhWzBdO1xyXG4gICAgY29uc3QgcmFuZ2UgPSBkYXRhW2RhdGEubGVuZ3RoIC0gMV0gLSBkYXRhWzBdO1xyXG4gICAgY29uc3QgcG9pbnRlckFuZ2xlID1cclxuICAgICAgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubWluQW5nbGUgKyAocG9pbnRlclZhbHVlIC8gcmFuZ2UpICogMTgwO1xyXG5cclxuICAgIHBnLmFwcGVuZCgncGF0aCcpXHJcbiAgICAgIC5hdHRyKCdkJywgcG9pbnRlckxpbmUpXHJcbiAgICAgIC5hdHRyKCdmaWxsJywgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ucG9pbnRlckNvbG9yKVxyXG4gICAgICAuYXR0cihcclxuICAgICAgICAndHJhbnNmb3JtJyxcclxuICAgICAgICBgcm90YXRlKCR7cG9pbnRlckFuZ2xlfSkgdHJhbnNsYXRlKDAsJHtcclxuICAgICAgICAgIC1yYWRpdXMgKyBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5yaW5nV2lkdGggKyBwb2ludGVySGVhZExlbmd0aFxyXG4gICAgICAgIH0pYFxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkcmF3TGFiZWxzKHN2ZywgcmFkaXVzLCBkYXRhX3JlYWR5LCBkYXRhLCBtZXRhRGF0YSkge1xyXG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICBjb25zdCByYW5nZSA9IGRhdGFbZGF0YS5sZW5ndGggLSAxXSAtIGRhdGFbMF07XHJcbiAgICBjb25zdCBsYWJlbEFycmF5ID0gdGhpcy5idWlsZExhYmVsQXJyYXkoZGF0YV9yZWFkeSwgZGF0YSk7XHJcblxyXG4gICAgY29uc3QgbGcgPSBzdmdcclxuICAgICAgLmFwcGVuZCgnZycpXHJcbiAgICAgIC5hdHRyKCdjbGFzcycsICdsYWJlbCcpXHJcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCB0aGlzLmNlbnRlclRyYW5zbGF0aW9uKHJhZGl1cykpO1xyXG5cclxuICAgIGxnLnNlbGVjdEFsbCgnLmJ1YmJsZScpXHJcbiAgICAgIC5kYXRhKGxhYmVsQXJyYXkpXHJcbiAgICAgIC5lbnRlcigpXHJcbiAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgKGQpID0+IHtcclxuICAgICAgICBjb25zdCBuZXdBbmdsZSA9XHJcbiAgICAgICAgICBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5taW5BbmdsZSArIChkLnZhbHVlIC8gcmFuZ2UpICogMTgwO1xyXG4gICAgICAgIHJldHVybiBgcm90YXRlKCR7bmV3QW5nbGV9KSB0cmFuc2xhdGUoMCwke1xyXG4gICAgICAgICAgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubGFiZWxJbnNldCAtIHJhZGl1cyAtIDIwXHJcbiAgICAgICAgfSlgO1xyXG4gICAgICB9KVxyXG4gICAgICAuYXBwZW5kKCd0ZXh0JylcclxuICAgICAgLmF0dHIoJ2ZpbGwnLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKVxyXG4gICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIHdpbmRvdy5pbm5lcldpZHRoIDwgMTQwMCA/ICcxMnB4JyA6ICcxNHB4JylcclxuICAgICAgLnN0eWxlKCdmb250LXdlaWdodCcsICc2MDAnKVxyXG4gICAgICAudGV4dCgoZCkgPT4gKG1ldGFEYXRhLmRhdGFUeXBlID8gZC5uYW1lICsgbWV0YURhdGEuZGF0YVR5cGUgOiBkLm5hbWUpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYnVpbGRMYWJlbEFycmF5KGRhdGFfcmVhZHk6IG51bWJlcltdLCBkYXRhOiBhbnlbXSkge1xyXG4gICAgY29uc3QgbGFiZWxBcnJheSA9IFt7IG5hbWU6IGRhdGFbMF0sIHZhbHVlOiAwIH1dO1xyXG4gICAgbGV0IGNvdW50ID0gMDtcclxuICAgIGRhdGFfcmVhZHkuZm9yRWFjaCgodW5pdCwgaSkgPT4ge1xyXG4gICAgICBjb3VudCArPSB1bml0O1xyXG4gICAgICBsYWJlbEFycmF5LnB1c2goeyBuYW1lOiBkYXRhW2kgKyAxXSwgdmFsdWU6IGNvdW50IH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gbGFiZWxBcnJheTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZHJhd0NlbnRlclRleHRzKHN2ZywgcmFkaXVzLCBtZXRhRGF0YSkge1xyXG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICBjb25zdCB0b3AgPSByYWRpdXMgLyAyIC0gMTA7XHJcbiAgICBjb25zdCBtaWQgPSB0b3AgKyBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5jdXJyZW50VmFsdWVIZWlnaHRTY2FsZUZhY3RvcjtcclxuICAgIGNvbnN0IGJvdHRvbSA9IG1pZCArIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmN1cnJlbnRWYWx1ZUhlaWdodFNjYWxlRmFjdG9yO1xyXG5cclxuICAgIC8vIGN1cnJlbnQgdmFsdWVcclxuICAgIHN2Z1xyXG4gICAgICAuYXBwZW5kKCdmb3JlaWduT2JqZWN0JylcclxuICAgICAgLmF0dHIoXHJcbiAgICAgICAgJ3RyYW5zZm9ybScsXHJcbiAgICAgICAgYHRyYW5zbGF0ZSgke3JhZGl1cyAtIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmN1cnJlbnRWYWx1ZVdpZHRoU2NhbGVGYWN0b3IgLyAyfSwke3RvcH0pYFxyXG4gICAgICApXHJcbiAgICAgIC5hdHRyKCd3aWR0aCcsIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmN1cnJlbnRWYWx1ZVdpZHRoU2NhbGVGYWN0b3IgKyA4KVxyXG4gICAgICAuYXR0cignaGVpZ2h0JywgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uY3VycmVudFZhbHVlSGVpZ2h0U2NhbGVGYWN0b3IpXHJcbiAgICAgIC5hcHBlbmQoJ3hodG1sOmRpdicpXHJcbiAgICAgIC5hdHRyKCdjbGFzcycsICd2YWx1ZS1kaXNwbGF5JylcclxuICAgICAgLmh0bWwobWV0YURhdGEuY3VycmVudFZhbHVlICsgbWV0YURhdGEuZGF0YVR5cGUpO1xyXG5cclxuICAgIC8vIHN0YXR1c1xyXG4gICAgaWYgKG1ldGFEYXRhLnN0YXR1cykge1xyXG4gICAgICBjb25zdCB3aWR0aFRlbXAgPSBtZXRhRGF0YS5zdGF0dXMubGVuZ3RoID4gNCA/IDIxMCA6IDEyMDtcclxuICAgICAgc3ZnXHJcbiAgICAgICAgLmFwcGVuZCgnZm9yZWlnbk9iamVjdCcpXHJcbiAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoJHtyYWRpdXMgLSB3aWR0aFRlbXAgLyAyfSwke21pZH0pYClcclxuICAgICAgICAuYXR0cignd2lkdGgnLCB3aWR0aFRlbXApXHJcbiAgICAgICAgLmFwcGVuZCgneGh0bWw6ZGl2JylcclxuICAgICAgICAuYXR0cignY2xhc3MnLCAnc3RhdHVzLWRpc3BsYXknKVxyXG4gICAgICAgIC5odG1sKG1ldGFEYXRhLnN0YXR1cyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZGF0ZSByYW5nZVxyXG4gICAgc3ZnXHJcbiAgICAgIC5hcHBlbmQoJ2ZvcmVpZ25PYmplY3QnKVxyXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgke3JhZGl1cyAtIDEwNX0sJHtib3R0b219KWApXHJcbiAgICAgIC5hdHRyKCd3aWR0aCcsIDIxMClcclxuICAgICAgLmFwcGVuZCgneGh0bWw6ZGl2JylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2RhdGVyYW5nZS1kaXNwbGF5JylcclxuICAgICAgLmh0bWwoXHJcbiAgICAgICAgbWV0YURhdGEuZGF0ZVJhbmdlXHJcbiAgICAgICAgICA/IGA8c3BhbiBjbGFzcz1cIm1hcmdpbnJpZ2h0LTNcIj48aSBjbGFzcz1cImZhIGZhLWNhbGVuZGFyXCI+PC9pPjwvc3Bhbj48c3Bhbj4ke21ldGFEYXRhLmRhdGVSYW5nZX08L3NwYW4+YFxyXG4gICAgICAgICAgOiAnJ1xyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjZW50ZXJUcmFuc2xhdGlvbihyYWRpdXM6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIGB0cmFuc2xhdGUoJHtyYWRpdXN9LCR7cmFkaXVzfSlgO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjZW50ZXJTdmcoc3ZnLCBjaGFydENvbnRhaW5lciwgd2lkdGgsIGhlaWdodCkge1xyXG4gICAgY29uc3QgbWFyZ2luID0gdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubWFyZ2luO1xyXG4gICAgY29uc3QgY29udGFpbmVyTWlkV2lkdGggPSBwYXJzZUludChjaGFydENvbnRhaW5lci5zdHlsZSgnd2lkdGgnKSkgLyAyO1xyXG4gICAgY29uc3Qgbm9kZUhhbGZXaWR0aCA9IHN2Zy5ub2RlKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggLyAyO1xyXG4gICAgY29uc3QgdXBkYXRlZFN0YXJ0aW5nUG9pbnQgPSBjb250YWluZXJNaWRXaWR0aCAtIG5vZGVIYWxmV2lkdGg7XHJcblxyXG4gICAgc3ZnLmF0dHIoXHJcbiAgICAgICd0cmFuc2Zvcm0nLFxyXG4gICAgICBgdHJhbnNsYXRlKCR7dXBkYXRlZFN0YXJ0aW5nUG9pbnQgKyBtYXJnaW4ubGVmdH0sJHttYXJnaW4udG9wfSlgXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgKiAgRXZlbnQgSGFuZGxlcnNcclxuICAgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cclxuICBoYW5kbGVDbGljayhkOiBhbnkpIHtcclxuICAgIHRoaXMuY2xpY2tFdmVudC5lbWl0KGQpO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlSGVhZGVyTWVudUNsaWNrKGlkKSB7XHJcbiAgICB0aGlzLmhlYWRlck1lbnVjbGlja0V2ZW50LmVtaXQoaWQpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2ICNndWFnZWNvbnRhaW5lciBjbGFzcz1cImxpYi1jaGFydC13cmFwcGVyXCIgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jYXJkLWJnKTtcIlxyXG4gIChyZXNpemVkKT1cIm9uUmVzaXplZCgkZXZlbnQpXCI+XHJcbiAgPGRpdiBjbGFzcz1cImhlYWRlci1hbHRcIiAqbmdJZj1cIiFpc0hlYWRlclZpc2libGVcIj5cclxuICAgIDxsaWItY2hhcnQtaGVhZGVyLXYyIFtjaGFydERhdGFdPVwiY2hhcnREYXRhXCIgW2NoYXJ0Q29uZmlndXJhdGlvbl09XCJjaGFydENvbmZpZ3VyYXRpb25cIlxyXG4gICAgICAoY2xpY2tFdmVudCk9XCJoYW5kbGVDbGljaygkZXZlbnQpXCI+PC9saWItY2hhcnQtaGVhZGVyLXYyPlxyXG4gIDwvZGl2PlxyXG4gIDxsaWItY2hhcnQtaGVhZGVyLXYxIFt0aXRsZV09XCJjaGFydERhdGEubWV0YURhdGEudGl0bGVcIiBbaGFzRHJpbGxEb3duXT1cImNoYXJ0RGF0YS5tZXRhRGF0YS5oYXNEcmlsbERvd25cIlxyXG4gICAgW2lzRWRpdEVuYWJsZWRdPVwiY2hhcnREYXRhLm1ldGFEYXRhLmlzRWRpdEVuYWJsZWRcIiBbaXNyaWFdPVwiY3VzdG9tQ2hhcnRDb25maWd1cmF0aW9uLmlzUmlhXCIgW21lbnVPcHRpb25zXT1cImNoYXJ0Q29uZmlndXJhdGlvbi5oZWFkZXJNZW51T3B0aW9uc1wiXHJcbiAgICBbc2VsZWN0ZWRLcGlUb29sdG9wXT1cImNoYXJ0Q29uZmlndXJhdGlvbi5zZWxlY3RlZEtwaVRvb2x0b3BcIiAobWVudU9wdGlvbkNsaWNrRXZlbnQpPVwiaGFuZGxlSGVhZGVyTWVudUNsaWNrKCRldmVudClcIlxyXG4gICAgW2lzQWxlcnRFbmFibGVkXT1cImlzQWxlcnRFbmFibGVkXCIgKm5nSWY9XCJpc0hlYWRlclZpc2libGVcIj48L2xpYi1jaGFydC1oZWFkZXItdjE+XHJcbiAgPGRpdiBbc3R5bGUuaGVpZ2h0XT1cImNoYXJ0Q29uZmlndXJhdGlvbi5zdmdIZWlnaHRcIiBpZD1cImd1YWdlY2hhcnRjb250YWluZXJcIiAjZ3VhZ2VjaGFydGNvbnRhaW5lclxyXG4gICAgY2xhc3M9XCJsaWItY2hhcnQtc3ZnIGd1YWdlY29udGFpbmVyXCI+PC9kaXY+XHJcbjwvZGl2PiJdfQ==
|