axidio-styleguide-library1-v2 0.2.8 → 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.
@@ -49,321 +49,259 @@ export class GuageChartComponent extends ComponentUniqueId {
49
49
  };
50
50
  }
51
51
  get isAlertEnabled() {
52
- return this.chartConfiguration?.headerMenuOptions?.some(option => option.id === 'editAlert');
52
+ return this.chartConfiguration?.headerMenuOptions?.some((option) => option.id === 'editAlert');
53
53
  }
54
+ ngOnInit() { }
54
55
  ngOnChanges() {
55
- let self = this;
56
- d3.select('#' + self.uniqueId).remove();
56
+ d3.select('#' + this.uniqueId).remove();
57
57
  this.initializeLineChart();
58
58
  }
59
59
  onResized(event) {
60
- let self = this;
61
- d3.select('#' + self.uniqueId).remove();
60
+ d3.select('#' + this.uniqueId).remove();
62
61
  this.initializeLineChart();
63
62
  }
64
- ngOnInit() { }
63
+ /** -------------------------------
64
+ * Main Initialization Function
65
+ * ------------------------------*/
65
66
  initializeLineChart() {
66
- var self = this;
67
- let data = [];
68
- let metaData = null;
69
- let colorMaps = [];
70
- let angleValue = [];
71
- let data_ready = [];
72
- let labelArray = [];
73
- let colorType = null;
74
- let isria = this.customChartConfiguration.isRia;
75
- for (var i in this.defaultConfiguration) {
76
- this.chartConfiguration[i] = ChartHelper.getValueByConfigurationType(i, this.defaultConfiguration, this.customChartConfiguration);
77
- }
78
- data = this.chartData.data;
79
- metaData = this.chartData.metaData;
80
- colorType = metaData.colorType;
81
- if (colorType == 'low') {
82
- colorMaps = this.chartConfiguration.low_colorMap;
83
- }
84
- else {
85
- colorMaps = this.chartConfiguration.high_colorMap;
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);
86
+ }
87
+ /** -------------------------------
88
+ * Modular Helper Functions
89
+ * ------------------------------*/
90
+ setupChartConfiguration() {
91
+ for (const key in this.defaultConfiguration) {
92
+ this.chartConfiguration[key] = ChartHelper.getValueByConfigurationType(key, this.defaultConfiguration, this.customChartConfiguration);
86
93
  }
94
+ }
95
+ getColorMap(metaData) {
96
+ const colorType = metaData.colorType;
97
+ const colorMaps = colorType === 'low'
98
+ ? this.chartConfiguration.low_colorMap
99
+ : this.chartConfiguration.high_colorMap;
100
+ return { colorMaps };
101
+ }
102
+ configureDataType(metaData) {
87
103
  if (metaData.dataType) {
88
104
  this.dataType = metaData.dataType;
89
- if (this.dataType == 'USD') {
105
+ if (this.dataType === 'USD') {
90
106
  this.datatype_status = true;
91
107
  this.dataType = '$ ';
92
108
  }
93
109
  }
94
- data.map(function (dataUnit, i) {
110
+ }
111
+ calculateDataReady(data) {
112
+ const data_ready = [];
113
+ data.forEach((_, i) => {
95
114
  if (i < data.length - 1) {
96
- let diff = data[i + 1] - data[i];
97
- data_ready.push(diff);
115
+ data_ready.push(data[i + 1] - data[i]);
98
116
  }
99
117
  });
100
- var chartContainer = d3.select(this.containerElt.nativeElement);
101
- var guagecontainer = d3.select(this.guagecontainerElt.nativeElement);
102
- var margin = this.chartConfiguration.margin;
103
- var width = parseInt(chartContainer.style('width')) - margin.left - margin.right;
104
- var height = parseInt(guagecontainer.style('height')) -
118
+ return data_ready;
119
+ }
120
+ setupContainer() {
121
+ const chartContainer = d3.select(this.containerElt.nativeElement);
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')) -
105
126
  margin.top -
106
127
  margin.bottom -
107
- 56; //chart header height
108
- if (this.chartConfiguration.isHeaderVisible != undefined)
109
- this.isHeaderVisible = this.chartConfiguration.isHeaderVisible;
110
- var svg = chartContainer
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
111
134
  .append('svg')
112
- .attr('id', self.uniqueId)
135
+ .attr('id', this.uniqueId)
113
136
  .attr('width', width + margin.left + margin.right)
114
137
  .attr('height', height + margin.top + margin.bottom)
115
138
  .call(ChartHelper.responsivefy)
116
139
  .append('g');
117
- var radius = Math.min(width, height) / 2;
140
+ }
141
+ adjustDimensionsAndRadius(width, height) {
142
+ const radius = Math.min(width, height) / 2;
118
143
  if (this.chartConfiguration.isDrilldownChart) {
119
144
  this.chartConfiguration.currentValueWidthScaleFactor += 40;
120
145
  this.chartConfiguration.currentValueHeightScaleFactor += 20;
121
146
  }
122
- else {
123
- if (window.innerWidth > 1400) {
124
- this.chartConfiguration.currentValueHeightScaleFactor += 15;
125
- this.chartConfiguration.currentValueWidthScaleFactor *= 2;
126
- }
147
+ else if (window.innerWidth > 1400) {
148
+ this.chartConfiguration.currentValueHeightScaleFactor += 15;
149
+ this.chartConfiguration.currentValueWidthScaleFactor *= 2;
127
150
  }
128
- let topTextPosition = radius / 2 - 10;
129
- let midTextPosition = topTextPosition + this.chartConfiguration.currentValueHeightScaleFactor;
130
- let bottomTextPosition = midTextPosition + this.chartConfiguration.currentValueHeightScaleFactor;
131
- var data_length = data.length;
132
- function deg2rad(deg) {
133
- return (deg * Math.PI) / 180;
134
- }
135
- let tempArray = [];
136
- let total = 0;
137
- data_ready.map(function (unit) {
138
- total += unit;
139
- });
140
- data_ready.map(function (unit, i) {
141
- var angle = (unit / total) * 180;
142
- if (i === 0) {
143
- tempArray.push(angle);
144
- }
145
- else {
146
- let currentAngle = tempArray[i - 1] + angle;
147
- tempArray.push(currentAngle);
148
- }
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);
149
159
  });
150
- angleValue = tempArray;
151
- var arc = d3
160
+ return tempArray;
161
+ }
162
+ createArc(radius, angleValue, data_ready) {
163
+ const self = this;
164
+ const deg2rad = (deg) => (deg * Math.PI) / 180;
165
+ return d3
152
166
  .arc()
153
167
  .innerRadius(radius -
154
168
  self.chartConfiguration.ringWidth -
155
169
  self.chartConfiguration.ringInset)
156
170
  .outerRadius(radius)
157
- .startAngle(function (d, i) {
158
- var ratio;
159
- if (i === 0) {
160
- ratio = self.chartConfiguration.minAngle;
161
- }
162
- else {
163
- ratio = self.chartConfiguration.minAngle + angleValue[i - 1];
164
- }
165
- return deg2rad(ratio);
166
- })
167
- .endAngle(function (d, i) {
168
- var ratio;
169
- if (i === data_ready.length - 1) {
170
- ratio = self.chartConfiguration.maxAngle;
171
- }
172
- else {
173
- ratio = self.chartConfiguration.minAngle + angleValue[i];
174
- }
175
- return deg2rad(ratio);
176
- });
177
- function centerTranslation() {
178
- return 'translate(' + radius + ',' + radius + ')';
179
- }
180
- var centerTx = centerTranslation();
181
- var tickData = d3
182
- .range(self.chartConfiguration.majorTicks)
183
- .map(function (i) {
184
- return 1 / self.chartConfiguration.majorTicks;
185
- });
186
- var arcs = svg.append('g').attr('class', 'arc').attr('transform', centerTx);
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
181
+ .append('g')
182
+ .attr('class', 'arc')
183
+ .attr('transform', this.centerTranslation(arc.outerRadius()()));
187
184
  arcs
188
185
  .selectAll('path')
189
186
  .data(data_ready)
190
187
  .enter()
191
188
  .append('path')
192
- .on('click', function (d) {
193
- if (!metaData.hasDrillDown || metaData.currentValue == 0) {
189
+ .attr('fill', (_, i) => colorMaps[i])
190
+ .style('cursor', () => metaData.currentValue > 0 && metaData.hasDrillDown && !isRia
191
+ ? 'pointer'
192
+ : 'default')
193
+ .attr('d', arc)
194
+ .on('click', (d) => {
195
+ if (!metaData.hasDrillDown || metaData.currentValue === 0)
194
196
  return;
195
- }
196
- let range = getRange(d);
197
+ const range = `${data[0]} and ${data[data.length - 1]}`;
197
198
  self.handleClick(range);
198
- })
199
- .attr('fill', function (d, i) {
200
- return colorMaps[i];
201
- })
202
- .attr('id', function (d, i) {
203
- return colorMaps[i];
204
- })
205
- .attr('d', arc)
206
- // .style('cursor', 'pointer');
207
- .style('cursor', function (d) {
208
- if (metaData.currentValue > 0 && metaData.hasDrillDown && !isria)
209
- return 'pointer';
210
- else
211
- return 'default';
212
199
  });
213
- let getRange = function (d) {
214
- let index = data_ready.indexOf(d);
215
- return data[0] + ' and ' + data[data.length - 1];
216
- };
217
- let pointerHeadLength = Math.round(radius * self.chartConfiguration.pointerHeadLengthPercent);
218
- var lineData = [
200
+ }
201
+ drawPointer(svg, radius, metaData, data) {
202
+ const self = this;
203
+ const pointerHeadLength = Math.round(radius * self.chartConfiguration.pointerHeadLengthPercent);
204
+ const lineData = [
219
205
  [self.chartConfiguration.pointerWidth / 2, 0],
220
206
  [0, -pointerHeadLength],
221
207
  [-(self.chartConfiguration.pointerWidth / 2), 0],
222
208
  [0, self.chartConfiguration.pointerTailLength],
223
209
  [self.chartConfiguration.pointerWidth / 2, 0],
224
210
  ];
225
- var pointerLine = d3.line();
226
- var pg = svg
211
+ const pointerLine = d3.line();
212
+ const pg = svg
227
213
  .append('g')
228
214
  .data([lineData])
229
215
  .attr('class', 'pointer')
230
- .attr('transform', centerTx);
231
- var pointerValue = metaData.currentValue - data[0];
232
- var range = data[data_length - 1] - data[0];
233
- var pointerAngle = self.chartConfiguration.minAngle + (pointerValue / range) * 180;
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;
234
220
  pg.append('path')
235
221
  .attr('d', pointerLine)
236
222
  .attr('fill', self.chartConfiguration.pointerColor)
237
- .attr('transform', 'rotate(' +
238
- pointerAngle +
239
- ') translate(0,' +
240
- (-radius + self.chartConfiguration.ringWidth + pointerHeadLength) +
241
- ')');
242
- var lg = svg.append('g').attr('class', 'label').attr('transform', centerTx);
243
- let labelArrayTemp = [{ name: data[0], value: 0 }];
244
- let count = 0;
245
- data_ready.map(function (dataUnit, i) {
246
- count += dataUnit;
247
- let temp = { name: data[i + 1], value: count };
248
- labelArrayTemp.push(temp);
249
- });
250
- labelArray = labelArrayTemp;
223
+ .attr('transform', `rotate(${pointerAngle}) translate(0,${-radius + self.chartConfiguration.ringWidth + pointerHeadLength})`);
224
+ }
225
+ drawLabels(svg, radius, data_ready, data, metaData) {
226
+ const self = this;
227
+ const range = data[data.length - 1] - data[0];
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));
251
233
  lg.selectAll('.bubble')
252
234
  .data(labelArray)
253
235
  .enter()
254
236
  .append('g')
255
- .attr('transform', function (d) {
256
- var newAngle = self.chartConfiguration.minAngle + (d.value / range) * 180;
257
- return ('rotate(' +
258
- newAngle +
259
- ') translate(0,' +
260
- (self.chartConfiguration.labelInset - radius - 20) +
261
- ')');
262
- })
263
- .append('g')
264
- .attr('transform', function (d, i) {
265
- var newAngle = self.chartConfiguration.minAngle + (d.value / range) * 180;
266
- if (i == 0 && self.chartConfiguration.isValueLableAdjust) {
267
- return 'rotate(' + (0 - newAngle) + ') translate(-27,0)';
268
- }
269
- if (i == labelArray.length - 1 &&
270
- self.chartConfiguration.isValueLableAdjust) {
271
- return 'rotate(' + (0 - newAngle) + ') translate(-15,0)';
272
- }
273
- return 'rotate(' + (0 - newAngle) + ') translate(-17,0)';
237
+ .attr('transform', (d) => {
238
+ const newAngle = self.chartConfiguration.minAngle + (d.value / range) * 180;
239
+ return `rotate(${newAngle}) translate(0,${self.chartConfiguration.labelInset - radius - 20})`;
274
240
  })
275
241
  .append('text')
276
- .attr('style', function (d) {
277
- if (window.innerWidth < 1400)
278
- return 'font-size: ' + '12px' + '; font-weight:' + '600;';
279
- else
280
- return 'font-size: ' + '14px' + '; font-weight:' + '600;';
281
- })
282
242
  .attr('fill', 'var(--chart-text-color)')
283
- .text(function (d) {
284
- if (metaData.dataType) {
285
- return d.name + metaData.dataType;
286
- }
287
- return d.name;
243
+ .style('font-size', window.innerWidth < 1400 ? '12px' : '14px')
244
+ .style('font-weight', '600')
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 });
288
253
  });
254
+ return labelArray;
255
+ }
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
289
262
  svg
290
263
  .append('foreignObject')
291
- .attr('transform', 'translate(' +
292
- (radius - this.chartConfiguration.currentValueWidthScaleFactor / 2) +
293
- ',' +
294
- topTextPosition +
295
- ')')
264
+ .attr('transform', `translate(${radius - this.chartConfiguration.currentValueWidthScaleFactor / 2},${top})`)
296
265
  .attr('width', this.chartConfiguration.currentValueWidthScaleFactor + 8)
297
266
  .attr('height', this.chartConfiguration.currentValueHeightScaleFactor)
298
267
  .append('xhtml:div')
299
268
  .attr('class', 'value-display')
300
- .style('height', this.chartConfiguration.currentValueHeightScaleFactor + 10 + 'px')
301
- .style('font-size', function () {
302
- if (window.innerWidth > 1500) {
303
- self.chartConfiguration.currentValueHeightScaleFactor - 25 + 'px';
304
- }
305
- else {
306
- self.chartConfiguration.currentValueHeightScaleFactor - 15 + 'px';
307
- }
308
- })
309
269
  .html(metaData.currentValue + metaData.dataType);
270
+ // status
310
271
  if (metaData.status) {
311
- let widthTemp = metaData.status.length > 4 ? 210 : 120;
272
+ const widthTemp = metaData.status.length > 4 ? 210 : 120;
312
273
  svg
313
274
  .append('foreignObject')
314
- .attr('transform', 'translate(' + (radius - widthTemp / 2) + ',' + midTextPosition + ')')
275
+ .attr('transform', `translate(${radius - widthTemp / 2},${mid})`)
315
276
  .attr('width', widthTemp)
316
- .attr('height', this.chartConfiguration.currentValueHeightScaleFactor + 10)
317
277
  .append('xhtml:div')
318
278
  .attr('class', 'status-display')
319
- .style('font-size', this.chartConfiguration.currentValueHeightScaleFactor - 25 + 'px')
320
279
  .html(metaData.status);
321
280
  }
281
+ // date range
322
282
  svg
323
283
  .append('foreignObject')
324
- .attr('transform', 'translate(' + (radius - 105) + ',' + bottomTextPosition + ')')
284
+ .attr('transform', `translate(${radius - 105},${bottom})`)
325
285
  .attr('width', 210)
326
- .attr('height', this.chartConfiguration.currentValueHeightScaleFactor)
327
286
  .append('xhtml:div')
328
287
  .attr('class', 'daterange-display')
329
- .style('font-size', function () {
330
- if (self.chartConfiguration.isDrilldownChart) {
331
- {
332
- if (window.innerWidth < 1400)
333
- return '14px';
334
- else
335
- return '18px';
336
- }
337
- }
338
- else {
339
- if (window.innerWidth < 1400)
340
- return '14px';
341
- else
342
- return '18px';
343
- }
344
- })
345
- .html(function () {
346
- var desiredSize;
347
- if (window.innerWidth < 1400)
348
- desiredSize = '14px';
349
- else
350
- desiredSize = '18px';
351
- if (metaData.dateRange)
352
- return ('<span class="marginright-3"><i class="fa fa-calendar"></i></span><span> ' +
353
- metaData.dateRange +
354
- '</span>');
355
- else
356
- return '';
357
- });
358
- var containerMidWidth = parseInt(chartContainer.style('width')) / 2;
359
- var nodeHalfWidth = svg.node().getBoundingClientRect().width / 2;
360
- var updatedStartingPoint = containerMidWidth - nodeHalfWidth;
361
- svg.attr('transform', 'translate(' +
362
- (updatedStartingPoint + margin.left) +
363
- ',' +
364
- margin.top +
365
- ')');
288
+ .html(metaData.dateRange
289
+ ? `<span class="marginright-3"><i class="fa fa-calendar"></i></span><span>${metaData.dateRange}</span>`
290
+ : '');
291
+ }
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})`);
366
301
  }
302
+ /** -------------------------------
303
+ * Event Handlers
304
+ * ------------------------------*/
367
305
  handleClick(d) {
368
306
  this.clickEvent.emit(d);
369
307
  }
@@ -391,4 +329,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
391
329
  }], headerMenuclickEvent: [{
392
330
  type: Output
393
331
  }] } });
394
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VhZ2UtY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXhpZGlvLXN0eWxlZ3VpZGUtbGlicmFyeS9zcmMvbGliL2d1YWdlLWNoYXJ0L2d1YWdlLWNoYXJ0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2F4aWRpby1zdHlsZWd1aWRlLWxpYnJhcnkvc3JjL2xpYi9ndWFnZS1jaGFydC9ndWFnZS1jaGFydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFNBQVMsRUFFVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2pELE9BQU8sV0FBVyxNQUFNLGlCQUFpQixDQUFDO0FBRTFDLE9BQU8sa0JBQWtCLE1BQU0sa0JBQWtCLENBQUM7Ozs7OztBQVFsRCxNQUFNLE9BQU8sbUJBQW9CLFNBQVEsaUJBQWlCO0lBK0N4RDtRQUNFLEtBQUssRUFBRSxDQUFDO1FBdkNBLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ3JDLHlCQUFvQixHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDekQsdUJBQWtCLEdBQVEsRUFBRSxDQUFDO1FBQzdCLGFBQVEsR0FBUSxFQUFFLENBQUM7UUFDbkIsb0JBQWUsR0FBWSxLQUFLLENBQUM7UUFDakMsYUFBUSxHQUFRLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQyxvQkFBZSxHQUFZLElBQUksQ0FBQztRQUVoQyx5QkFBb0IsR0FBUTtZQUMxQixNQUFNLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVB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WCxTQUFTO3VCQUFDLHFCQUFxQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFJbEQsaUJBQWlCO3NCQURoQixTQUFTO3VCQUFDLGdCQUFnQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFHcEMsU0FBUztzQkFBakIsS0FBSztnQkFDRyx3QkFBd0I7c0JBQWhDLEtBQUs7Z0JBQ0ksVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxvQkFBb0I7c0JBQTdCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBPbkluaXQsXHJcbiAgVmlld0NoaWxkLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgSW5wdXQsXHJcbiAgT3V0cHV0LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBWaWV3RW5jYXBzdWxhdGlvbixcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0ICogYXMgZDMgZnJvbSAnZDMnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRVbmlxdWVJZCB9IGZyb20gJy4uL3VuaXF1ZS1pZCc7XHJcbmltcG9ydCBDaGFydEhlbHBlciBmcm9tICcuLi9jaGFydC1oZWxwZXInO1xyXG5pbXBvcnQgeyBSZXNpemVkRXZlbnQgfSBmcm9tICdhbmd1bGFyLXJlc2l6ZS1ldmVudCc7XHJcbmltcG9ydCBIZWFkZXJDb25maWdIZWxwZXIgZnJvbSAnLi4vaGVhZGVyLWNvbmZpZyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1ndWFnZS1jaGFydCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2d1YWdlLWNoYXJ0LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9ndWFnZS1jaGFydC5jb21wb25lbnQubGVzcycsICcuLi9jb21tb24tc3R5bGVzLmxlc3MnXSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgR3VhZ2VDaGFydENvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudFVuaXF1ZUlkIGltcGxlbWVudHMgT25Jbml0IHtcclxuICBAVmlld0NoaWxkKCdndWFnZWNoYXJ0Y29udGFpbmVyJywgeyBzdGF0aWM6IHRydWUgfSlcclxuICBjb250YWluZXJFbHQhOiBFbGVtZW50UmVmO1xyXG5cclxuICBAVmlld0NoaWxkKCdndWFnZWNvbnRhaW5lcicsIHsgc3RhdGljOiB0cnVlIH0pXHJcbiAgZ3VhZ2Vjb250YWluZXJFbHQhOiBFbGVtZW50UmVmO1xyXG5cclxuICBASW5wdXQoKSBjaGFydERhdGE6IGFueTtcclxuICBASW5wdXQoKSBjdXN0b21DaGFydENvbmZpZ3VyYXRpb246IGFueTtcclxuICBAT3V0cHV0KCkgY2xpY2tFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBoZWFkZXJNZW51Y2xpY2tFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIGNoYXJ0Q29uZmlndXJhdGlvbjogYW55ID0ge307XHJcbiAgZGF0YVR5cGU6IGFueSA9ICcnO1xyXG4gIGRhdGF0eXBlX3N0YXR1czogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHVuaXF1ZUlkOiBhbnkgPSB0aGlzLmdldFVuaXF1ZUlkKCk7XHJcbiAgaXNIZWFkZXJWaXNpYmxlOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgZGVmYXVsdENvbmZpZ3VyYXRpb246IGFueSA9IHtcclxuICAgIG1hcmdpbjogeyB0b3A6IDQwLCByaWdodDogMjAsIGJvdHRvbTogMjAsIGxlZnQ6IDIwIH0sXHJcbiAgICBtaW5BbmdsZTogLTkwLFxyXG4gICAgbWF4QW5nbGU6IDkwLFxyXG4gICAgcmluZ0luc2V0OiAyMCxcclxuICAgIHJpbmdXaWR0aDogMjAsXHJcbiAgICBtYWpvclRpY2tzOiAzLFxyXG4gICAgc3ZnSGVpZ2h0OiA4MCxcclxuICAgIGxvd19jb2xvck1hcDogWycjNDNDQzAwJywgJyNGRkVGMEMnLCAnI0ZGNEUwQyddLFxyXG4gICAgaGlnaF9jb2xvck1hcDogWycjRkY0RTBDJywgJyNGRkVGMEMnLCAnIzQzQ0MwMCddLFxyXG4gICAgaXNIZWFkZXJWaXNpYmxlOiB1bmRlZmluZWQsXHJcbiAgICBwb2ludGVyV2lkdGg6IDEwLFxyXG4gICAgcG9pbnRlclRhaWxMZW5ndGg6IDUsXHJcbiAgICBwb2ludGVySGVhZExlbmd0aFBlcmNlbnQ6IDAuNyxcclxuICAgIGxhYmVsSW5zZXQ6IDEwLFxyXG4gICAgbGVnZW5kSnVzdGlmaWVkOiBmYWxzZSxcclxuICAgIGJhY2tncm91bmRDb2xvcjogJyNGRkZGRkYnLFxyXG4gICAgaXNEcmlsbGRvd25DaGFydDogdW5kZWZpbmVkLFxyXG4gICAgcmluZ1NjYWxlRmFjdG9yOiAwLFxyXG4gICAgdGV4dHNBdENlbnRlclNjYWxlRmFjdG9yOiAwLFxyXG4gICAgY3VycmVudFZhbHVlV2lkdGhTY2FsZUZhY3RvcjogNjAsXHJcbiAgICBjdXJyZW50VmFsdWVIZWlnaHRTY2FsZUZhY3RvcjogMzAsXHJcbiAgICBwb2ludGVyQ29sb3I6ICcjNjg2ODY4JyxcclxuICAgIGlzVG9nZ2xlVmlzaWJsZTogdW5kZWZpbmVkLFxyXG4gICAgc2VsZWN0ZWRLcGlUb29sdG9wOiB1bmRlZmluZWQsXHJcbiAgICBpc1ZhbHVlTGFibGVBZGp1c3Q6IHVuZGVmaW5lZCxcclxuICAgIGlzVGl0bGVIaWRkZW46IHVuZGVmaW5lZCxcclxuICAgIGhlYWRlck1lbnVPcHRpb25zOiBIZWFkZXJDb25maWdIZWxwZXIuaGVhZGVyQ29uZmlnLmhlYWRlck1lbnVPcHRpb25zLFxyXG4gIH07XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgc3VwZXIoKTtcclxuICB9XHJcblxyXG4gIGdldCBpc0FsZXJ0RW5hYmxlZCgpOiBib29sZWFuIHtcclxuICByZXR1cm4gdGhpcy5jaGFydENvbmZpZ3VyYXRpb24/LmhlYWRlck1lbnVPcHRpb25zPy5zb21lKG9wdGlvbiA9PiBvcHRpb24uaWQgPT09ICdlZGl0QWxlcnQnKTtcclxufVxyXG5cclxuICBuZ09uQ2hhbmdlcygpIHtcclxuICAgIGxldCBzZWxmID0gdGhpcztcclxuICAgIGQzLnNlbGVjdCgnIycgKyBzZWxmLnVuaXF1ZUlkKS5yZW1vdmUoKTtcclxuICAgIHRoaXMuaW5pdGlhbGl6ZUxpbmVDaGFydCgpO1xyXG4gIH1cclxuICBvblJlc2l6ZWQoZXZlbnQ6IFJlc2l6ZWRFdmVudCkge1xyXG4gICAgbGV0IHNlbGYgPSB0aGlzO1xyXG4gICAgZDMuc2VsZWN0KCcjJyArIHNlbGYudW5pcXVlSWQpLnJlbW92ZSgpO1xyXG4gICAgdGhpcy5pbml0aWFsaXplTGluZUNoYXJ0KCk7XHJcbiAgfVxyXG4gIG5nT25Jbml0KCkge31cclxuXHJcbiAgaW5pdGlhbGl6ZUxpbmVDaGFydCgpIHtcclxuICAgIHZhciBzZWxmID0gdGhpcztcclxuICAgIGxldCBkYXRhID0gW107XHJcbiAgICBsZXQgbWV0YURhdGE6IGFueSA9IG51bGw7XHJcbiAgICBsZXQgY29sb3JNYXBzID0gW107XHJcbiAgICBsZXQgYW5nbGVWYWx1ZSA9IFtdO1xyXG4gICAgbGV0IGRhdGFfcmVhZHk6IGFueSA9IFtdO1xyXG4gICAgbGV0IGxhYmVsQXJyYXk6IGFueSA9IFtdO1xyXG4gICAgbGV0IGNvbG9yVHlwZSA9IG51bGw7XHJcblxyXG4gICBsZXQgaXNyaWEgPSB0aGlzLmN1c3RvbUNoYXJ0Q29uZmlndXJhdGlvbi5pc1JpYVxyXG5cclxuICAgIGZvciAodmFyIGkgaW4gdGhpcy5kZWZhdWx0Q29uZmlndXJhdGlvbikge1xyXG4gICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbltpXSA9IENoYXJ0SGVscGVyLmdldFZhbHVlQnlDb25maWd1cmF0aW9uVHlwZShcclxuICAgICAgICBpLFxyXG4gICAgICAgIHRoaXMuZGVmYXVsdENvbmZpZ3VyYXRpb24sXHJcbiAgICAgICAgdGhpcy5jdXN0b21DaGFydENvbmZpZ3VyYXRpb25cclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBkYXRhID0gdGhpcy5jaGFydERhdGEuZGF0YTtcclxuICAgIG1ldGFEYXRhID0gdGhpcy5jaGFydERhdGEubWV0YURhdGE7XHJcblxyXG4gICAgY29sb3JUeXBlID0gbWV0YURhdGEuY29sb3JUeXBlO1xyXG4gICAgaWYgKGNvbG9yVHlwZSA9PSAnbG93Jykge1xyXG4gICAgICBjb2xvck1hcHMgPSB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5sb3dfY29sb3JNYXA7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb2xvck1hcHMgPSB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5oaWdoX2NvbG9yTWFwO1xyXG4gICAgfVxyXG4gICAgaWYgKG1ldGFEYXRhLmRhdGFUeXBlKSB7XHJcbiAgICAgIHRoaXMuZGF0YVR5cGUgPSBtZXRhRGF0YS5kYXRhVHlwZTtcclxuICAgICAgaWYgKHRoaXMuZGF0YVR5cGUgPT0gJ1VTRCcpIHtcclxuICAgICAgICB0aGlzLmRhdGF0eXBlX3N0YXR1cyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5kYXRhVHlwZSA9ICckICc7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBkYXRhLm1hcChmdW5jdGlvbiAoZGF0YVVuaXQsIGkpIHtcclxuICAgICAgaWYgKGkgPCBkYXRhLmxlbmd0aCAtIDEpIHtcclxuICAgICAgICBsZXQgZGlmZiA9IGRhdGFbaSArIDFdIC0gZGF0YVtpXTtcclxuICAgICAgICBkYXRhX3JlYWR5LnB1c2goZGlmZik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHZhciBjaGFydENvbnRhaW5lciA9IGQzLnNlbGVjdCh0aGlzLmNvbnRhaW5lckVsdC5uYXRpdmVFbGVtZW50KTtcclxuICAgIHZhciBndWFnZWNvbnRhaW5lciA9IGQzLnNlbGVjdCh0aGlzLmd1YWdlY29udGFpbmVyRWx0Lm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgdmFyIG1hcmdpbiA9IHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLm1hcmdpbjtcclxuICAgIHZhciB3aWR0aCA9XHJcbiAgICAgIHBhcnNlSW50KGNoYXJ0Q29udGFpbmVyLnN0eWxlKCd3aWR0aCcpKSAtIG1hcmdpbi5sZWZ0IC0gbWFyZ2luLnJpZ2h0O1xyXG5cclxuICAgIHZhciBoZWlnaHQgPVxyXG4gICAgICBwYXJzZUludChndWFnZWNvbnRhaW5lci5zdHlsZSgnaGVpZ2h0JykpIC1cclxuICAgICAgbWFyZ2luLnRvcCAtXHJcbiAgICAgIG1hcmdpbi5ib3R0b20gLVxyXG4gICAgICA1NjsgLy9jaGFydCBoZWFkZXIgaGVpZ2h0XHJcblxyXG4gICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzSGVhZGVyVmlzaWJsZSAhPSB1bmRlZmluZWQpXHJcbiAgICAgIHRoaXMuaXNIZWFkZXJWaXNpYmxlID0gdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNIZWFkZXJWaXNpYmxlO1xyXG5cclxuICAgIHZhciBzdmcgPSBjaGFydENvbnRhaW5lclxyXG4gICAgICAuYXBwZW5kKCdzdmcnKVxyXG4gICAgICAuYXR0cignaWQnLCBzZWxmLnVuaXF1ZUlkKVxyXG4gICAgICAuYXR0cignd2lkdGgnLCB3aWR0aCArIG1hcmdpbi5sZWZ0ICsgbWFyZ2luLnJpZ2h0KVxyXG4gICAgICAuYXR0cignaGVpZ2h0JywgaGVpZ2h0ICsgbWFyZ2luLnRvcCArIG1hcmdpbi5ib3R0b20pXHJcbiAgICAgIC5jYWxsKENoYXJ0SGVscGVyLnJlc3BvbnNpdmVmeSlcclxuICAgICAgLmFwcGVuZCgnZycpO1xyXG5cclxuICAgIHZhciByYWRpdXMgPSBNYXRoLm1pbih3aWR0aCwgaGVpZ2h0KSAvIDI7XHJcblxyXG4gICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzRHJpbGxkb3duQ2hhcnQpIHtcclxuICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uY3VycmVudFZhbHVlV2lkdGhTY2FsZUZhY3RvciArPSA0MDtcclxuICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uY3VycmVudFZhbHVlSGVpZ2h0U2NhbGVGYWN0b3IgKz0gMjA7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAod2luZG93LmlubmVyV2lkdGggPiAxNDAwKSB7XHJcbiAgICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uY3VycmVudFZhbHVlSGVpZ2h0U2NhbGVGYWN0b3IgKz0gMTU7XHJcbiAgICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uY3VycmVudFZhbHVlV2lkdGhTY2FsZUZhY3RvciAqPSAyO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBsZXQgdG9wVGV4dFBvc2l0aW9uID0gcmFkaXVzIC8gMiAtIDEwO1xyXG4gICAgbGV0IG1pZFRleHRQb3NpdGlvbiA9XHJcbiAgICAgIHRvcFRleHRQb3NpdGlvbiArIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmN1cnJlbnRWYWx1ZUhlaWdodFNjYWxlRmFjdG9yO1xyXG4gICAgbGV0IGJvdHRvbVRleHRQb3NpdGlvbiA9XHJcbiAgICAgIG1pZFRleHRQb3NpdGlvbiArIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmN1cnJlbnRWYWx1ZUhlaWdodFNjYWxlRmFjdG9yO1xyXG4gICAgdmFyIGRhdGFfbGVuZ3RoID0gZGF0YS5sZW5ndGg7XHJcblxyXG4gICAgZnVuY3Rpb24gZGVnMnJhZChkZWcpIHtcclxuICAgICAgcmV0dXJuIChkZWcgKiBNYXRoLlBJKSAvIDE4MDtcclxuICAgIH1cclxuICAgIGxldCB0ZW1wQXJyYXk6IGFueSA9IFtdO1xyXG4gICAgbGV0IHRvdGFsID0gMDtcclxuICAgIGRhdGFfcmVhZHkubWFwKGZ1bmN0aW9uICh1bml0KSB7XHJcbiAgICAgIHRvdGFsICs9IHVuaXQ7XHJcbiAgICB9KTtcclxuICAgIGRhdGFfcmVhZHkubWFwKGZ1bmN0aW9uICh1bml0LCBpKSB7XHJcbiAgICAgIHZhciBhbmdsZSA9ICh1bml0IC8gdG90YWwpICogMTgwO1xyXG4gICAgICBpZiAoaSA9PT0gMCkge1xyXG4gICAgICAgIHRlbXBBcnJheS5wdXNoKGFuZ2xlKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBsZXQgY3VycmVudEFuZ2xlID0gdGVtcEFycmF5W2kgLSAxXSArIGFuZ2xlO1xyXG4gICAgICAgIHRlbXBBcnJheS5wdXNoKGN1cnJlbnRBbmdsZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgYW5nbGVWYWx1ZSA9IHRlbXBBcnJheTtcclxuXHJcbiAgICB2YXIgYXJjID0gZDNcclxuICAgICAgLmFyYygpXHJcbiAgICAgIC5pbm5lclJhZGl1cyhcclxuICAgICAgICByYWRpdXMgLVxyXG4gICAgICAgICAgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ucmluZ1dpZHRoIC1cclxuICAgICAgICAgIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnJpbmdJbnNldFxyXG4gICAgICApXHJcbiAgICAgIC5vdXRlclJhZGl1cyhyYWRpdXMpXHJcbiAgICAgIC5zdGFydEFuZ2xlKGZ1bmN0aW9uIChkLCBpKSB7XHJcbiAgICAgICAgdmFyIHJhdGlvO1xyXG4gICAgICAgIGlmIChpID09PSAwKSB7XHJcbiAgICAgICAgICByYXRpbyA9IHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLm1pbkFuZ2xlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByYXRpbyA9IHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLm1pbkFuZ2xlICsgYW5nbGVWYWx1ZVtpIC0gMV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBkZWcycmFkKHJhdGlvKTtcclxuICAgICAgfSlcclxuICAgICAgLmVuZEFuZ2xlKGZ1bmN0aW9uIChkLCBpKSB7XHJcbiAgICAgICAgdmFyIHJhdGlvO1xyXG4gICAgICAgIGlmIChpID09PSBkYXRhX3JlYWR5Lmxlbmd0aCAtIDEpIHtcclxuICAgICAgICAgIHJhdGlvID0gc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubWF4QW5nbGU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJhdGlvID0gc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubWluQW5nbGUgKyBhbmdsZVZhbHVlW2ldO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZGVnMnJhZChyYXRpbyk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIGZ1bmN0aW9uIGNlbnRlclRyYW5zbGF0aW9uKCkge1xyXG4gICAgICByZXR1cm4gJ3RyYW5zbGF0ZSgnICsgcmFkaXVzICsgJywnICsgcmFkaXVzICsgJyknO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBjZW50ZXJUeCA9IGNlbnRlclRyYW5zbGF0aW9uKCk7XHJcbiAgICB2YXIgdGlja0RhdGEgPSBkM1xyXG4gICAgICAucmFuZ2Uoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubWFqb3JUaWNrcylcclxuICAgICAgLm1hcChmdW5jdGlvbiAoaSkge1xyXG4gICAgICAgIHJldHVybiAxIC8gc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubWFqb3JUaWNrcztcclxuICAgICAgfSk7XHJcblxyXG4gICAgdmFyIGFyY3MgPSBzdmcuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCAnYXJjJykuYXR0cigndHJhbnNmb3JtJywgY2VudGVyVHgpO1xyXG5cclxuICAgIGFyY3NcclxuICAgICAgLnNlbGVjdEFsbCgncGF0aCcpXHJcbiAgICAgIC5kYXRhKGRhdGFfcmVhZHkpXHJcbiAgICAgIC5lbnRlcigpXHJcbiAgICAgIC5hcHBlbmQoJ3BhdGgnKVxyXG4gICAgICAub24oJ2NsaWNrJywgZnVuY3Rpb24gKGQpIHtcclxuICAgICAgICBpZiAoIW1ldGFEYXRhLmhhc0RyaWxsRG93biB8fCBtZXRhRGF0YS5jdXJyZW50VmFsdWUgPT0gMCkge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgcmFuZ2UgPSBnZXRSYW5nZShkKTtcclxuICAgICAgICBzZWxmLmhhbmRsZUNsaWNrKHJhbmdlKTtcclxuICAgICAgfSlcclxuICAgICAgLmF0dHIoJ2ZpbGwnLCBmdW5jdGlvbiAoZCwgaSkge1xyXG4gICAgICAgIHJldHVybiBjb2xvck1hcHNbaV07XHJcbiAgICAgIH0pXHJcbiAgICAgIC5hdHRyKCdpZCcsIGZ1bmN0aW9uIChkLCBpKSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbG9yTWFwc1tpXTtcclxuICAgICAgfSlcclxuICAgICAgLmF0dHIoJ2QnLCBhcmMpXHJcbiAgICAgIC8vIC5zdHlsZSgnY3Vyc29yJywgJ3BvaW50ZXInKTtcclxuICAgICAgLnN0eWxlKCdjdXJzb3InLCBmdW5jdGlvbiAoZCkge1xyXG4gICAgICAgIGlmIChtZXRhRGF0YS5jdXJyZW50VmFsdWUgPiAwICYmIG1ldGFEYXRhLmhhc0RyaWxsRG93biAmJiAhaXNyaWEpXHJcbiAgICAgICAgICByZXR1cm4gJ3BvaW50ZXInO1xyXG4gICAgICAgIGVsc2UgcmV0dXJuICdkZWZhdWx0JztcclxuICAgICAgfSk7XHJcblxyXG4gICAgbGV0IGdldFJhbmdlID0gZnVuY3Rpb24gKGQpIHtcclxuICAgICAgbGV0IGluZGV4ID0gZGF0YV9yZWFkeS5pbmRleE9mKGQpO1xyXG4gICAgICByZXR1cm4gZGF0YVswXSArICcgYW5kICcgKyBkYXRhW2RhdGEubGVuZ3RoIC0gMV07XHJcbiAgICB9O1xyXG5cclxuICAgIGxldCBwb2ludGVySGVhZExlbmd0aCA9IE1hdGgucm91bmQoXHJcbiAgICAgIHJhZGl1cyAqIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnBvaW50ZXJIZWFkTGVuZ3RoUGVyY2VudFxyXG4gICAgKTtcclxuXHJcbiAgICB2YXIgbGluZURhdGEgPSBbXHJcbiAgICAgIFtzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5wb2ludGVyV2lkdGggLyAyLCAwXSxcclxuICAgICAgWzAsIC1wb2ludGVySGVhZExlbmd0aF0sXHJcbiAgICAgIFstKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnBvaW50ZXJXaWR0aCAvIDIpLCAwXSxcclxuICAgICAgWzAsIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnBvaW50ZXJUYWlsTGVuZ3RoXSxcclxuICAgICAgW3NlbGYuY2hhcnRDb25maWd1cmF0aW9uLnBvaW50ZXJXaWR0aCAvIDIsIDBdLFxyXG4gICAgXTtcclxuXHJcbiAgICB2YXIgcG9pbnRlckxpbmUgPSBkMy5saW5lKCk7XHJcbiAgICB2YXIgcGcgPSBzdmdcclxuICAgICAgLmFwcGVuZCgnZycpXHJcbiAgICAgIC5kYXRhKFtsaW5lRGF0YV0pXHJcbiAgICAgIC5hdHRyKCdjbGFzcycsICdwb2ludGVyJylcclxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGNlbnRlclR4KTtcclxuXHJcbiAgICB2YXIgcG9pbnRlclZhbHVlID0gbWV0YURhdGEuY3VycmVudFZhbHVlIC0gZGF0YVswXTtcclxuICAgIHZhciByYW5nZSA9IGRhdGFbZGF0YV9sZW5ndGggLSAxXSAtIGRhdGFbMF07XHJcbiAgICB2YXIgcG9pbnRlckFuZ2xlID1cclxuICAgICAgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubWluQW5nbGUgKyAocG9pbnRlclZhbHVlIC8gcmFuZ2UpICogMTgwO1xyXG4gICAgcGcuYXBwZW5kKCdwYXRoJylcclxuICAgICAgLmF0dHIoJ2QnLCBwb2ludGVyTGluZSlcclxuICAgICAgLmF0dHIoJ2ZpbGwnLCBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5wb2ludGVyQ29sb3IpXHJcbiAgICAgIC5hdHRyKFxyXG4gICAgICAgICd0cmFuc2Zvcm0nLFxyXG4gICAgICAgICdyb3RhdGUoJyArXHJcbiAgICAgICAgICBwb2ludGVyQW5nbGUgK1xyXG4gICAgICAgICAgJykgdHJhbnNsYXRlKDAsJyArXHJcbiAgICAgICAgICAoLXJhZGl1cyArIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnJpbmdXaWR0aCArIHBvaW50ZXJIZWFkTGVuZ3RoKSArXHJcbiAgICAgICAgICAnKSdcclxuICAgICAgKTtcclxuXHJcbiAgICB2YXIgbGcgPSBzdmcuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCAnbGFiZWwnKS5hdHRyKCd0cmFuc2Zvcm0nLCBjZW50ZXJUeCk7XHJcbiAgICBsZXQgbGFiZWxBcnJheVRlbXAgPSBbeyBuYW1lOiBkYXRhWzBdLCB2YWx1ZTogMCB9XTtcclxuICAgIGxldCBjb3VudCA9IDA7XHJcbiAgICBkYXRhX3JlYWR5Lm1hcChmdW5jdGlvbiAoZGF0YVVuaXQsIGkpIHtcclxuICAgICAgY291bnQgKz0gZGF0YVVuaXQ7XHJcbiAgICAgIGxldCB0ZW1wID0geyBuYW1lOiBkYXRhW2kgKyAxXSwgdmFsdWU6IGNvdW50IH07XHJcbiAgICAgIGxhYmVsQXJyYXlUZW1wLnB1c2godGVtcCk7XHJcbiAgICB9KTtcclxuICAgIGxhYmVsQXJyYXkgPSBsYWJlbEFycmF5VGVtcDtcclxuXHJcbiAgICBsZy5zZWxlY3RBbGwoJy5idWJibGUnKVxyXG4gICAgICAuZGF0YShsYWJlbEFycmF5KVxyXG4gICAgICAuZW50ZXIoKVxyXG4gICAgICAuYXBwZW5kKCdnJylcclxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgICAgdmFyIG5ld0FuZ2xlID1cclxuICAgICAgICAgIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLm1pbkFuZ2xlICsgKGQudmFsdWUgLyByYW5nZSkgKiAxODA7XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICdyb3RhdGUoJyArXHJcbiAgICAgICAgICBuZXdBbmdsZSArXHJcbiAgICAgICAgICAnKSB0cmFuc2xhdGUoMCwnICtcclxuICAgICAgICAgIChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5sYWJlbEluc2V0IC0gcmFkaXVzIC0gMjApICtcclxuICAgICAgICAgICcpJ1xyXG4gICAgICAgICk7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24gKGQsIGkpIHtcclxuICAgICAgICB2YXIgbmV3QW5nbGUgPVxyXG4gICAgICAgICAgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubWluQW5nbGUgKyAoZC52YWx1ZSAvIHJhbmdlKSAqIDE4MDtcclxuICAgICAgICBpZiAoaSA9PSAwICYmIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmlzVmFsdWVMYWJsZUFkanVzdCkge1xyXG4gICAgICAgICAgcmV0dXJuICdyb3RhdGUoJyArICgwIC0gbmV3QW5nbGUpICsgJykgdHJhbnNsYXRlKC0yNywwKSc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIGkgPT0gbGFiZWxBcnJheS5sZW5ndGggLSAxICYmXHJcbiAgICAgICAgICBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5pc1ZhbHVlTGFibGVBZGp1c3RcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHJldHVybiAncm90YXRlKCcgKyAoMCAtIG5ld0FuZ2xlKSArICcpIHRyYW5zbGF0ZSgtMTUsMCknO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gJ3JvdGF0ZSgnICsgKDAgLSBuZXdBbmdsZSkgKyAnKSB0cmFuc2xhdGUoLTE3LDApJztcclxuICAgICAgfSlcclxuICAgICAgLmFwcGVuZCgndGV4dCcpXHJcbiAgICAgIC5hdHRyKCdzdHlsZScsIGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoIDwgMTQwMClcclxuICAgICAgICAgIHJldHVybiAnZm9udC1zaXplOiAnICsgJzEycHgnICsgJzsgZm9udC13ZWlnaHQ6JyArICc2MDA7JztcclxuICAgICAgICBlbHNlIHJldHVybiAnZm9udC1zaXplOiAnICsgJzE0cHgnICsgJzsgZm9udC13ZWlnaHQ6JyArICc2MDA7JztcclxuICAgICAgfSlcclxuICAgICAgLmF0dHIoJ2ZpbGwnLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKVxyXG4gICAgICAudGV4dChmdW5jdGlvbiAoZCkge1xyXG4gICAgICAgIGlmIChtZXRhRGF0YS5kYXRhVHlwZSkge1xyXG4gICAgICAgICAgcmV0dXJuIGQubmFtZSArIG1ldGFEYXRhLmRhdGFUeXBlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZC5uYW1lO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICBzdmdcclxuICAgICAgLmFwcGVuZCgnZm9yZWlnbk9iamVjdCcpXHJcbiAgICAgIC5hdHRyKFxyXG4gICAgICAgICd0cmFuc2Zvcm0nLFxyXG4gICAgICAgICd0cmFuc2xhdGUoJyArXHJcbiAgICAgICAgICAocmFkaXVzIC0gdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uY3VycmVudFZhbHVlV2lkdGhTY2FsZUZhY3RvciAvIDIpICtcclxuICAgICAgICAgICcsJyArXHJcbiAgICAgICAgICB0b3BUZXh0UG9zaXRpb24gK1xyXG4gICAgICAgICAgJyknXHJcbiAgICAgIClcclxuICAgICAgLmF0dHIoJ3dpZHRoJywgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uY3VycmVudFZhbHVlV2lkdGhTY2FsZUZhY3RvciArIDgpXHJcbiAgICAgIC5hdHRyKCdoZWlnaHQnLCB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5jdXJyZW50VmFsdWVIZWlnaHRTY2FsZUZhY3RvcilcclxuICAgICAgLmFwcGVuZCgneGh0bWw6ZGl2JylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ3ZhbHVlLWRpc3BsYXknKVxyXG4gICAgICAuc3R5bGUoXHJcbiAgICAgICAgJ2hlaWdodCcsXHJcbiAgICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uY3VycmVudFZhbHVlSGVpZ2h0U2NhbGVGYWN0b3IgKyAxMCArICdweCdcclxuICAgICAgKVxyXG4gICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAod2luZG93LmlubmVyV2lkdGggPiAxNTAwKSB7XHJcbiAgICAgICAgICBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5jdXJyZW50VmFsdWVIZWlnaHRTY2FsZUZhY3RvciAtIDI1ICsgJ3B4JztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uY3VycmVudFZhbHVlSGVpZ2h0U2NhbGVGYWN0b3IgLSAxNSArICdweCc7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICAuaHRtbChtZXRhRGF0YS5jdXJyZW50VmFsdWUgKyBtZXRhRGF0YS5kYXRhVHlwZSk7XHJcbiAgICBpZiAobWV0YURhdGEuc3RhdHVzKSB7XHJcbiAgICAgIGxldCB3aWR0aFRlbXAgPSBtZXRhRGF0YS5zdGF0dXMubGVuZ3RoID4gNCA/IDIxMCA6IDEyMDtcclxuICAgICAgc3ZnXHJcbiAgICAgICAgLmFwcGVuZCgnZm9yZWlnbk9iamVjdCcpXHJcbiAgICAgICAgLmF0dHIoXHJcbiAgICAgICAgICAndHJhbnNmb3JtJyxcclxuICAgICAgICAgICd0cmFuc2xhdGUoJyArIChyYWRpdXMgLSB3aWR0aFRlbXAgLyAyKSArICcsJyArIG1pZFRleHRQb3NpdGlvbiArICcpJ1xyXG4gICAgICAgIClcclxuICAgICAgICAuYXR0cignd2lkdGgnLCB3aWR0aFRlbXApXHJcbiAgICAgICAgLmF0dHIoXHJcbiAgICAgICAgICAnaGVpZ2h0JyxcclxuICAgICAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmN1cnJlbnRWYWx1ZUhlaWdodFNjYWxlRmFjdG9yICsgMTBcclxuICAgICAgICApXHJcbiAgICAgICAgLmFwcGVuZCgneGh0bWw6ZGl2JylcclxuICAgICAgICAuYXR0cignY2xhc3MnLCAnc3RhdHVzLWRpc3BsYXknKVxyXG4gICAgICAgIC5zdHlsZShcclxuICAgICAgICAgICdmb250LXNpemUnLFxyXG4gICAgICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uY3VycmVudFZhbHVlSGVpZ2h0U2NhbGVGYWN0b3IgLSAyNSArICdweCdcclxuICAgICAgICApXHJcbiAgICAgICAgLmh0bWwobWV0YURhdGEuc3RhdHVzKTtcclxuICAgIH1cclxuICAgIHN2Z1xyXG4gICAgICAuYXBwZW5kKCdmb3JlaWduT2JqZWN0JylcclxuICAgICAgLmF0dHIoXHJcbiAgICAgICAgJ3RyYW5zZm9ybScsXHJcbiAgICAgICAgJ3RyYW5zbGF0ZSgnICsgKHJhZGl1cyAtIDEwNSkgKyAnLCcgKyBib3R0b21UZXh0UG9zaXRpb24gKyAnKSdcclxuICAgICAgKVxyXG4gICAgICAuYXR0cignd2lkdGgnLCAyMTApXHJcbiAgICAgIC5hdHRyKCdoZWlnaHQnLCB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5jdXJyZW50VmFsdWVIZWlnaHRTY2FsZUZhY3RvcilcclxuICAgICAgLmFwcGVuZCgneGh0bWw6ZGl2JylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2RhdGVyYW5nZS1kaXNwbGF5JylcclxuICAgICAgLnN0eWxlKCdmb250LXNpemUnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmlzRHJpbGxkb3duQ2hhcnQpIHtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoIDwgMTQwMCkgcmV0dXJuICcxNHB4JztcclxuICAgICAgICAgICAgZWxzZSByZXR1cm4gJzE4cHgnO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAod2luZG93LmlubmVyV2lkdGggPCAxNDAwKSByZXR1cm4gJzE0cHgnO1xyXG4gICAgICAgICAgZWxzZSByZXR1cm4gJzE4cHgnO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgLmh0bWwoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBkZXNpcmVkU2l6ZTtcclxuICAgICAgICBpZiAod2luZG93LmlubmVyV2lkdGggPCAxNDAwKSBkZXNpcmVkU2l6ZSA9ICcxNHB4JztcclxuICAgICAgICBlbHNlIGRlc2lyZWRTaXplID0gJzE4cHgnO1xyXG4gICAgICAgIGlmIChtZXRhRGF0YS5kYXRlUmFuZ2UpXHJcbiAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJtYXJnaW5yaWdodC0zXCI+PGkgY2xhc3M9XCJmYSBmYS1jYWxlbmRhclwiPjwvaT48L3NwYW4+PHNwYW4+ICcgK1xyXG4gICAgICAgICAgICBtZXRhRGF0YS5kYXRlUmFuZ2UgK1xyXG4gICAgICAgICAgICAnPC9zcGFuPidcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgZWxzZSByZXR1cm4gJyc7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHZhciBjb250YWluZXJNaWRXaWR0aCA9IHBhcnNlSW50KGNoYXJ0Q29udGFpbmVyLnN0eWxlKCd3aWR0aCcpKSAvIDI7XHJcbiAgICB2YXIgbm9kZUhhbGZXaWR0aCA9IHN2Zy5ub2RlKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggLyAyO1xyXG4gICAgdmFyIHVwZGF0ZWRTdGFydGluZ1BvaW50ID0gY29udGFpbmVyTWlkV2lkdGggLSBub2RlSGFsZldpZHRoO1xyXG5cclxuICAgIHN2Zy5hdHRyKFxyXG4gICAgICAndHJhbnNmb3JtJyxcclxuICAgICAgJ3RyYW5zbGF0ZSgnICtcclxuICAgICAgICAodXBkYXRlZFN0YXJ0aW5nUG9pbnQgKyBtYXJnaW4ubGVmdCkgK1xyXG4gICAgICAgICcsJyArXHJcbiAgICAgICAgbWFyZ2luLnRvcCArXHJcbiAgICAgICAgJyknXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlQ2xpY2soZDogYW55KSB7XHJcbiAgICB0aGlzLmNsaWNrRXZlbnQuZW1pdChkKTtcclxuICB9XHJcbiAgaGFuZGxlSGVhZGVyTWVudUNsaWNrKGlkKSB7XHJcbiAgICB0aGlzLmhlYWRlck1lbnVjbGlja0V2ZW50LmVtaXQoaWQpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2ICNndWFnZWNvbnRhaW5lciBjbGFzcz1cImxpYi1jaGFydC13cmFwcGVyXCIgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jYXJkLWJnKTtcIlxyXG4gIChyZXNpemVkKT1cIm9uUmVzaXplZCgkZXZlbnQpXCI+XHJcbiAgPGRpdiBjbGFzcz1cImhlYWRlci1hbHRcIiAqbmdJZj1cIiFpc0hlYWRlclZpc2libGVcIj5cclxuICAgIDxsaWItY2hhcnQtaGVhZGVyLXYyIFtjaGFydERhdGFdPVwiY2hhcnREYXRhXCIgW2NoYXJ0Q29uZmlndXJhdGlvbl09XCJjaGFydENvbmZpZ3VyYXRpb25cIlxyXG4gICAgICAoY2xpY2tFdmVudCk9XCJoYW5kbGVDbGljaygkZXZlbnQpXCI+PC9saWItY2hhcnQtaGVhZGVyLXYyPlxyXG4gIDwvZGl2PlxyXG4gIDxsaWItY2hhcnQtaGVhZGVyLXYxIFt0aXRsZV09XCJjaGFydERhdGEubWV0YURhdGEudGl0bGVcIiBbaGFzRHJpbGxEb3duXT1cImNoYXJ0RGF0YS5tZXRhRGF0YS5oYXNEcmlsbERvd25cIlxyXG4gICAgW2lzRWRpdEVuYWJsZWRdPVwiY2hhcnREYXRhLm1ldGFEYXRhLmlzRWRpdEVuYWJsZWRcIiBbaXNyaWFdPVwiY3VzdG9tQ2hhcnRDb25maWd1cmF0aW9uLmlzUmlhXCIgW21lbnVPcHRpb25zXT1cImNoYXJ0Q29uZmlndXJhdGlvbi5oZWFkZXJNZW51T3B0aW9uc1wiXHJcbiAgICBbc2VsZWN0ZWRLcGlUb29sdG9wXT1cImNoYXJ0Q29uZmlndXJhdGlvbi5zZWxlY3RlZEtwaVRvb2x0b3BcIiAobWVudU9wdGlvbkNsaWNrRXZlbnQpPVwiaGFuZGxlSGVhZGVyTWVudUNsaWNrKCRldmVudClcIlxyXG4gICAgW2lzQWxlcnRFbmFibGVkXT1cImlzQWxlcnRFbmFibGVkXCIgKm5nSWY9XCJpc0hlYWRlclZpc2libGVcIj48L2xpYi1jaGFydC1oZWFkZXItdjE+XHJcbiAgPGRpdiBbc3R5bGUuaGVpZ2h0XT1cImNoYXJ0Q29uZmlndXJhdGlvbi5zdmdIZWlnaHRcIiBpZD1cImd1YWdlY2hhcnRjb250YWluZXJcIiAjZ3VhZ2VjaGFydGNvbnRhaW5lclxyXG4gICAgY2xhc3M9XCJsaWItY2hhcnQtc3ZnIGd1YWdlY29udGFpbmVyXCI+PC9kaXY+XHJcbjwvZGl2PiJdfQ==
332
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VhZ2UtY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXhpZGlvLXN0eWxlZ3VpZGUtbGlicmFyeS9zcmMvbGliL2d1YWdlLWNoYXJ0L2d1YWdlLWNoYXJ0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2F4aWRpby1zdHlsZWd1aWRlLWxpYnJhcnkvc3JjL2xpYi9ndWFnZS1jaGFydC9ndWFnZS1jaGFydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFNBQVMsRUFFVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2pELE9BQU8sV0FBVyxNQUFNLGlCQUFpQixDQUFDO0FBRTFDLE9BQU8sa0JBQWtCLE1BQU0sa0JBQWtCLENBQUM7Ozs7OztBQVFsRCxNQUFNLE9BQU8sbUJBQW9CLFNBQVEsaUJBQWlCO0lBNkN4RDtRQUNFLEtBQUssRUFBRSxDQUFDO1FBeENBLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ3JDLHlCQUFvQixHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFFekQsdUJBQWtCLEdBQVEsRUFBRSxDQUFDO1FBQzdCLGFBQVEsR0FBUSxFQUFFLENBQUM7UUFDbkIsb0JBQWUsR0FBWSxLQUFLLENBQUM7UUFDakMsYUFBUSxHQUFRLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQyxvQkFBZSxHQUFZLElBQUksQ0FBQztRQUVoQyx5QkFBb0IsR0FBUTtZQUMxQixNQUFNLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFO1lBQ3BELFFBQVEsRUFBRSxDQUFDLEVBQUU7WUFDYixRQUFRLEVBQUUsRUFBRTtZQUNaLFNBQVMsRUFBRSxFQUFFO1lBQ2IsU0FBUyxFQUFFLEVBQUU7WUFDYixVQUFVLEVBQUUsQ0FBQztZQUNiLFNBQVMsRUFBRSxFQUFFO1lBQ2IsWUFBWSxFQUFFLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUM7WUFDL0MsYUFBYSxFQUFFLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUM7WUFDaEQsZUFBZSxFQUFFLFNBQVM7WUFDMUIsWUFBWSxFQUFFLEVBQUU7WUFDaEIsaUJBQWlCLEVBQUUsQ0FBQztZQUNwQix3QkFBd0IsRUFBRSxHQUFHO1lBQzdCLFVBQVUsRUFBRSxFQUFFO1lBQ2QsZUFBZSxFQUFFLEtBQUs7WUFDdEIsZUFBZSxFQUFFLFNBQVM7WUFDMUIsZ0JBQWdCLEVBQUUsU0FBUztZQUMzQixlQUFlLEVBQUUsQ0FBQztZQUNsQix3QkFBd0IsRUFBRSxDQUFDO1lBQzNCLDRCQUE0QixFQUFFLEVBQUU7WUFDaEMsNkJBQTZCLEVBQUUsRUFBRTtZQUNqQyxZQUFZLEVBQUUsU0FBUztZQUN2QixlQUFlLEVBQUUsU0FBUztZQUMxQixrQkFBa0IsRUFBRSxTQUFTO1lBQzdCLGtCQUFrQixFQUFFLFNBQVM7WUFDN0IsYUFBYSxFQUFFLFNBQVM7WUFDeEIsaUJBQWlCLEVBQUUsa0JBQWtCLENBQUMsWUFBWSxDQUFDLGlCQUFpQjtTQUNyRSxDQUFDO0lBSUYsQ0FBQztJQUVELElBQUksY0FBYztRQUNoQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLENBQ3JELENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLFdBQVcsQ0FDdEMsQ0FBQztJQUNKLENBQUM7SUFFRCxRQUFRLEtBQUksQ0FBQztJQUViLFdBQVc7UUFDVCxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDeEMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELFNBQVMsQ0FBQyxLQUFtQjtRQUMzQixFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDeEMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVEOzt3Q0FFb0M7SUFDcEMsbUJBQW1CO1FBQ2pCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQztRQUNsQixNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDMUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEtBQUssQ0FBQztRQUVsRCxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUMvQixNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFakMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pELE1BQU0sRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FDckQsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBRXhCLElBQUksQ0FBQyxlQUFlO1lBQ2xCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUVsRSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDMUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUU3RCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN4RCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFM0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMzRSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUU1QyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRDs7d0NBRW9DO0lBRTVCLHVCQUF1QjtRQUM3QixLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQzVDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxXQUFXLENBQUMsMkJBQTJCLENBQ3BFLEdBQUcsRUFDSCxJQUFJLENBQUMsb0JBQW9CLEVBQ3pCLElBQUksQ0FBQyx3QkFBd0IsQ0FDOUIsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRU8sV0FBVyxDQUFDLFFBQWE7UUFDL0IsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQztRQUNyQyxNQUFNLFNBQVMsR0FDYixTQUFTLEtBQUssS0FBSztZQUNqQixDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVk7WUFDdEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUM7UUFDNUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxRQUFhO1FBQ3JDLElBQUksUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQztZQUNsQyxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssS0FBSyxFQUFFLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO2dCQUM1QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztZQUN2QixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxJQUFXO1FBQ3BDLE1BQU0sVUFBVSxHQUFhLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3BCLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3hCLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6QyxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBRU8sY0FBYztRQUNwQixNQUFNLGNBQWMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDbEUsTUFBTSxjQUFjLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDdkUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQztRQUU5QyxNQUFNLEtBQUssR0FDVCxRQUFRLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUN2RSxNQUFNLE1BQU0sR0FDVixRQUFRLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN4QyxNQUFNLENBQUMsR0FBRztZQUNWLE1BQU0sQ0FBQyxNQUFNO1lBQ2IsRUFBRSxDQUFDLENBQUMsc0JBQXNCO1FBRTVCLE9BQU8sRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQztJQUMzRCxDQUFDO0lBRU8sU0FBUyxDQUFDLGNBQWMsRUFBRSxLQUFLLEVBQUUsTUFBTTtRQUM3QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDO1FBQzlDLE9BQU8sY0FBYzthQUNsQixNQUFNLENBQUMsS0FBSyxDQUFDO2FBQ2IsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDO2FBQ3pCLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQzthQUNqRCxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7YUFDbkQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUM7YUFDOUIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2pCLENBQUM7SUFFTyx5QkFBeUIsQ0FBQyxLQUFhLEVBQUUsTUFBYztRQUM3RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFM0MsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUM3QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsNEJBQTRCLElBQUksRUFBRSxDQUFDO1lBQzNELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyw2QkFBNkIsSUFBSSxFQUFFLENBQUM7UUFDOUQsQ0FBQzthQUFNLElBQUksTUFBTSxDQUFDLFVBQVUsR0FBRyxJQUFJLEVBQUUsQ0FBQztZQUNwQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsNkJBQTZCLElBQUksRUFBRSxDQUFDO1lBQzVELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyw0QkFBNEIsSUFBSSxDQUFDLENBQUM7UUFDNUQsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFTyxhQUFhLENBQUMsVUFBb0IsRUFBRSxJQUFXO1FBQ3JELE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzVELE1BQU0sU0FBUyxHQUFhLEVBQUUsQ0FBQztRQUUvQixVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzdCLE1BQU0sS0FBSyxHQUFHLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQztZQUNuQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztRQUM3RCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFHTyxTQUFTLENBQUMsTUFBYyxFQUFFLFVBQW9CLEVBQUUsVUFBb0I7UUFDMUUsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLE1BQU0sT0FBTyxHQUFHLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBRXZELE9BQU8sRUFBRTthQUNOLEdBQUcsRUFBRTthQUNMLFdBQVcsQ0FDVixNQUFNO1lBQ0osSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVM7WUFDakMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FDcEM7YUFDQSxXQUFXLENBQUMsTUFBTSxDQUFDO2FBQ25CLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUNuQixPQUFPLENBQ0wsQ0FBQyxLQUFLLENBQUM7WUFDTCxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVE7WUFDbEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FDekQsQ0FDRjthQUNBLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUNqQixPQUFPLENBQ0wsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUN6QixDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVE7WUFDbEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUNyRCxDQUNGLENBQUM7SUFDTixDQUFDO0lBRU8sYUFBYSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLElBQUk7UUFDMUUsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLE1BQU0sSUFBSSxHQUFHLEdBQUc7YUFDYixNQUFNLENBQUMsR0FBRyxDQUFDO2FBQ1gsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUM7YUFDcEIsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRWxFLElBQUk7YUFDRCxTQUFTLENBQUMsTUFBTSxDQUFDO2FBQ2pCLElBQUksQ0FBQyxVQUFVLENBQUM7YUFDaEIsS0FBSyxFQUFFO2FBQ1AsTUFBTSxDQUFDLE1BQU0sQ0FBQzthQUNkLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDcEMsS0FBSyxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FDcEIsUUFBUSxDQUFDLFlBQVksR0FBRyxDQUFDLElBQUksUUFBUSxDQUFDLFlBQVksSUFBSSxDQUFDLEtBQUs7WUFDMUQsQ0FBQyxDQUFDLFNBQVM7WUFDWCxDQUFDLENBQUMsU0FBUyxDQUNkO2FBQ0EsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUM7YUFDZCxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLElBQUksUUFBUSxDQUFDLFlBQVksS0FBSyxDQUFDO2dCQUFFLE9BQU87WUFDbEUsTUFBTSxLQUFLLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN4RCxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLFdBQVcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJO1FBQzdDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQztRQUNsQixNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQ2xDLE1BQU0sR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsd0JBQXdCLENBQzFELENBQUM7UUFFRixNQUFNLFFBQVEsR0FBRztZQUNmLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzdDLENBQUMsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUM7WUFDdkIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDaEQsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDO1lBQzlDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQzlDLENBQUM7UUFFRixNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDOUIsTUFBTSxFQUFFLEdBQUcsR0FBRzthQUNYLE1BQU0sQ0FBQyxHQUFHLENBQUM7YUFDWCxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUNoQixJQUFJLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQzthQUN4QixJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBRXJELE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QyxNQUFNLFlBQVksR0FDaEIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsR0FBRyxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUM7UUFFbEUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7YUFDZCxJQUFJLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQzthQUN0QixJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLENBQUM7YUFDbEQsSUFBSSxDQUNILFdBQVcsRUFDWCxVQUFVLFlBQVksaUJBQ3BCLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLEdBQUcsaUJBQ2hELEdBQUcsQ0FDSixDQUFDO0lBQ04sQ0FBQztJQUVPLFVBQVUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsUUFBUTtRQUN4RCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUM7UUFDbEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRTFELE1BQU0sRUFBRSxHQUFHLEdBQUc7YUFDWCxNQUFNLENBQUMsR0FBRyxDQUFDO2FBQ1gsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUM7YUFDdEIsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUVyRCxFQUFFLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQzthQUNwQixJQUFJLENBQUMsVUFBVSxDQUFDO2FBQ2hCLEtBQUssRUFBRTthQUNQLE1BQU0sQ0FBQyxHQUFHLENBQUM7YUFDWCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDdkIsTUFBTSxRQUFRLEdBQ1osSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQzdELE9BQU8sVUFBVSxRQUFRLGlCQUN2QixJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVSxHQUFHLE1BQU0sR0FBRyxFQUNoRCxHQUFHLENBQUM7UUFDTixDQUFDLENBQUM7YUFDRCxNQUFNLENBQUMsTUFBTSxDQUFDO2FBQ2QsSUFBSSxDQUFDLE1BQU0sRUFBRSx5QkFBeUIsQ0FBQzthQUN2QyxLQUFLLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQzthQUM5RCxLQUFLLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQzthQUMzQixJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRU8sZUFBZSxDQUFDLFVBQW9CLEVBQUUsSUFBVztRQUN2RCxNQUFNLFVBQVUsR0FBRyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNqRCxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDZCxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzdCLEtBQUssSUFBSSxJQUFJLENBQUM7WUFDZCxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDdkQsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBRU8sZUFBZSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsUUFBUTtRQUMzQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUM7UUFDbEIsTUFBTSxHQUFHLEdBQUcsTUFBTSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDNUIsTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyw2QkFBNkIsQ0FBQztRQUN4RSxNQUFNLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLDZCQUE2QixDQUFDO1FBRTNFLGdCQUFnQjtRQUNoQixHQUFHO2FBQ0EsTUFBTSxDQUFDLGVBQWUsQ0FBQzthQUN2QixJQUFJLENBQ0gsV0FBVyxFQUNYLGFBQWEsTUFBTSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyw0QkFBNEIsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLENBQ3pGO2FBQ0EsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsNEJBQTRCLEdBQUcsQ0FBQyxDQUFDO2FBQ3ZFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLDZCQUE2QixDQUFDO2FBQ3JFLE1BQU0sQ0FBQyxXQUFXLENBQUM7YUFDbkIsSUFBSSxDQUFDLE9BQU8sRUFBRSxlQUFlLENBQUM7YUFDOUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRW5ELFNBQVM7UUFDVCxJQUFJLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNwQixNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQ3pELEdBQUc7aUJBQ0EsTUFBTSxDQUFDLGVBQWUsQ0FBQztpQkFDdkIsSUFBSSxDQUFDLFdBQVcsRUFBRSxhQUFhLE1BQU0sR0FBRyxTQUFTLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO2lCQUNoRSxJQUFJLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQztpQkFDeEIsTUFBTSxDQUFDLFdBQVcsQ0FBQztpQkFDbkIsSUFBSSxDQUFDLE9BQU8sRUFBRSxnQkFBZ0IsQ0FBQztpQkFDL0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMzQixDQUFDO1FBRUQsYUFBYTtRQUNiLEdBQUc7YUFDQSxNQUFNLENBQUMsZUFBZSxDQUFDO2FBQ3ZCLElBQUksQ0FBQyxXQUFXLEVBQUUsYUFBYSxNQUFNLEdBQUcsR0FBRyxJQUFJLE1BQU0sR0FBRyxDQUFDO2FBQ3pELElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDO2FBQ2xCLE1BQU0sQ0FBQyxXQUFXLENBQUM7YUFDbkIsSUFBSSxDQUFDLE9BQU8sRUFBRSxtQkFBbUIsQ0FBQzthQUNsQyxJQUFJLENBQ0gsUUFBUSxDQUFDLFNBQVM7WUFDaEIsQ0FBQyxDQUFDLDBFQUEwRSxRQUFRLENBQUMsU0FBUyxTQUFTO1lBQ3ZHLENBQUMsQ0FBQyxFQUFFLENBQ1AsQ0FBQztJQUNOLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxNQUFjO1FBQ3RDLE9BQU8sYUFBYSxNQUFNLElBQUksTUFBTSxHQUFHLENBQUM7SUFDMUMsQ0FBQztJQUVPLFNBQVMsQ0FBQyxHQUFHLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxNQUFNO1FBQ2xELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUM7UUFDOUMsTUFBTSxpQkFBaUIsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0RSxNQUFNLGFBQWEsR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ25FLE1BQU0sb0JBQW9CLEdBQUcsaUJBQWlCLEdBQUcsYUFBYSxDQUFDO1FBRS9ELEdBQUcsQ0FBQyxJQUFJLENBQ04sV0FBVyxFQUNYLGFBQWEsb0JBQW9CLEdBQUcsTUFBTSxDQUFDLElBQUksSUFBSSxNQUFNLENBQUMsR0FBRyxHQUFHLENBQ2pFLENBQUM7SUFDSixDQUFDO0lBRUQ7O3dDQUVvQztJQUNwQyxXQUFXLENBQUMsQ0FBTTtRQUNoQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQscUJBQXFCLENBQUMsRUFBRTtRQUN0QixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7K0dBNVlVLG1CQUFtQjttR0FBbkIsbUJBQW1CLHlnQkN0QmhDLHNnQ0FZTTs7NEZEVU8sbUJBQW1CO2tCQU4vQixTQUFTOytCQUNFLGlCQUFpQixpQkFHWixpQkFBaUIsQ0FBQyxJQUFJO3dEQUdlLFlBQVk7c0JBQS9ELFNBQVM7dUJBQUMscUJBQXFCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNILGlCQUFpQjtzQkFBL0QsU0FBUzt1QkFBQyxnQkFBZ0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBRXBDLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csd0JBQXdCO3NCQUFoQyxLQUFLO2dCQUNJLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csb0JBQW9CO3NCQUE3QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgT25Jbml0LFxyXG4gIFZpZXdDaGlsZCxcclxuICBFbGVtZW50UmVmLFxyXG4gIElucHV0LFxyXG4gIE91dHB1dCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgVmlld0VuY2Fwc3VsYXRpb24sXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCAqIGFzIGQzIGZyb20gJ2QzJztcclxuaW1wb3J0IHsgQ29tcG9uZW50VW5pcXVlSWQgfSBmcm9tICcuLi91bmlxdWUtaWQnO1xyXG5pbXBvcnQgQ2hhcnRIZWxwZXIgZnJvbSAnLi4vY2hhcnQtaGVscGVyJztcclxuaW1wb3J0IHsgUmVzaXplZEV2ZW50IH0gZnJvbSAnYW5ndWxhci1yZXNpemUtZXZlbnQnO1xyXG5pbXBvcnQgSGVhZGVyQ29uZmlnSGVscGVyIGZyb20gJy4uL2hlYWRlci1jb25maWcnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItZ3VhZ2UtY2hhcnQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9ndWFnZS1jaGFydC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZ3VhZ2UtY2hhcnQuY29tcG9uZW50Lmxlc3MnLCAnLi4vY29tbW9uLXN0eWxlcy5sZXNzJ10sXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxufSlcclxuZXhwb3J0IGNsYXNzIEd1YWdlQ2hhcnRDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRVbmlxdWVJZCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgQFZpZXdDaGlsZCgnZ3VhZ2VjaGFydGNvbnRhaW5lcicsIHsgc3RhdGljOiB0cnVlIH0pIGNvbnRhaW5lckVsdCE6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgnZ3VhZ2Vjb250YWluZXInLCB7IHN0YXRpYzogdHJ1ZSB9KSBndWFnZWNvbnRhaW5lckVsdCE6IEVsZW1lbnRSZWY7XHJcblxyXG4gIEBJbnB1dCgpIGNoYXJ0RGF0YTogYW55O1xyXG4gIEBJbnB1dCgpIGN1c3RvbUNoYXJ0Q29uZmlndXJhdGlvbjogYW55O1xyXG4gIEBPdXRwdXQoKSBjbGlja0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIGhlYWRlck1lbnVjbGlja0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIGNoYXJ0Q29uZmlndXJhdGlvbjogYW55ID0ge307XHJcbiAgZGF0YVR5cGU6IGFueSA9ICcnO1xyXG4gIGRhdGF0eXBlX3N0YXR1czogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHVuaXF1ZUlkOiBhbnkgPSB0aGlzLmdldFVuaXF1ZUlkKCk7XHJcbiAgaXNIZWFkZXJWaXNpYmxlOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgZGVmYXVsdENvbmZpZ3VyYXRpb246IGFueSA9IHtcclxuICAgIG1hcmdpbjogeyB0b3A6IDQwLCByaWdodDogMjAsIGJvdHRvbTogMjAsIGxlZnQ6IDIwIH0sXHJcbiAgICBtaW5BbmdsZTogLTkwLFxyXG4gICAgbWF4QW5nbGU6IDkwLFxyXG4gICAgcmluZ0luc2V0OiAyMCxcclxuICAgIHJpbmdXaWR0aDogMjAsXHJcbiAgICBtYWpvclRpY2tzOiAzLFxyXG4gICAgc3ZnSGVpZ2h0OiA4MCxcclxuICAgIGxvd19jb2xvck1hcDogWycjNDNDQzAwJywgJyNGRkVGMEMnLCAnI0ZGNEUwQyddLFxyXG4gICAgaGlnaF9jb2xvck1hcDogWycjRkY0RTBDJywgJyNGRkVGMEMnLCAnIzQzQ0MwMCddLFxyXG4gICAgaXNIZWFkZXJWaXNpYmxlOiB1bmRlZmluZWQsXHJcbiAgICBwb2ludGVyV2lkdGg6IDEwLFxyXG4gICAgcG9pbnRlclRhaWxMZW5ndGg6IDUsXHJcbiAgICBwb2ludGVySGVhZExlbmd0aFBlcmNlbnQ6IDAuNyxcclxuICAgIGxhYmVsSW5zZXQ6IDEwLFxyXG4gICAgbGVnZW5kSnVzdGlmaWVkOiBmYWxzZSxcclxuICAgIGJhY2tncm91bmRDb2xvcjogJyNGRkZGRkYnLFxyXG4gICAgaXNEcmlsbGRvd25DaGFydDogdW5kZWZpbmVkLFxyXG4gICAgcmluZ1NjYWxlRmFjdG9yOiAwLFxyXG4gICAgdGV4dHNBdENlbnRlclNjYWxlRmFjdG9yOiAwLFxyXG4gICAgY3VycmVudFZhbHVlV2lkdGhTY2FsZUZhY3RvcjogNjAsXHJcbiAgICBjdXJyZW50VmFsdWVIZWlnaHRTY2FsZUZhY3RvcjogMzAsXHJcbiAgICBwb2ludGVyQ29sb3I6ICcjNjg2ODY4JyxcclxuICAgIGlzVG9nZ2xlVmlzaWJsZTogdW5kZWZpbmVkLFxyXG4gICAgc2VsZWN0ZWRLcGlUb29sdG9wOiB1bmRlZmluZWQsXHJcbiAgICBpc1ZhbHVlTGFibGVBZGp1c3Q6IHVuZGVmaW5lZCxcclxuICAgIGlzVGl0bGVIaWRkZW46IHVuZGVmaW5lZCxcclxuICAgIGhlYWRlck1lbnVPcHRpb25zOiBIZWFkZXJDb25maWdIZWxwZXIuaGVhZGVyQ29uZmlnLmhlYWRlck1lbnVPcHRpb25zLFxyXG4gIH07XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgc3VwZXIoKTtcclxuICB9XHJcblxyXG4gIGdldCBpc0FsZXJ0RW5hYmxlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbj8uaGVhZGVyTWVudU9wdGlvbnM/LnNvbWUoXHJcbiAgICAgIChvcHRpb24pID0+IG9wdGlvbi5pZCA9PT0gJ2VkaXRBbGVydCdcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHt9XHJcblxyXG4gIG5nT25DaGFuZ2VzKCkge1xyXG4gICAgZDMuc2VsZWN0KCcjJyArIHRoaXMudW5pcXVlSWQpLnJlbW92ZSgpO1xyXG4gICAgdGhpcy5pbml0aWFsaXplTGluZUNoYXJ0KCk7XHJcbiAgfVxyXG5cclxuICBvblJlc2l6ZWQoZXZlbnQ6IFJlc2l6ZWRFdmVudCkge1xyXG4gICAgZDMuc2VsZWN0KCcjJyArIHRoaXMudW5pcXVlSWQpLnJlbW92ZSgpO1xyXG4gICAgdGhpcy5pbml0aWFsaXplTGluZUNoYXJ0KCk7XHJcbiAgfVxyXG5cclxuICAvKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAqICBNYWluIEluaXRpYWxpemF0aW9uIEZ1bmN0aW9uXHJcbiAgICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXHJcbiAgaW5pdGlhbGl6ZUxpbmVDaGFydCgpIHtcclxuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgY29uc3QgeyBkYXRhLCBtZXRhRGF0YSB9ID0gdGhpcy5jaGFydERhdGE7XHJcbiAgICBjb25zdCBpc1JpYSA9IHRoaXMuY3VzdG9tQ2hhcnRDb25maWd1cmF0aW9uLmlzUmlhO1xyXG5cclxuICAgIHRoaXMuc2V0dXBDaGFydENvbmZpZ3VyYXRpb24oKTtcclxuICAgIGNvbnN0IHsgY29sb3JNYXBzIH0gPSB0aGlzLmdldENvbG9yTWFwKG1ldGFEYXRhKTtcclxuICAgIHRoaXMuY29uZmlndXJlRGF0YVR5cGUobWV0YURhdGEpO1xyXG5cclxuICAgIGNvbnN0IGRhdGFfcmVhZHkgPSB0aGlzLmNhbGN1bGF0ZURhdGFSZWFkeShkYXRhKTtcclxuICAgIGNvbnN0IHsgY2hhcnRDb250YWluZXIsIGd1YWdlY29udGFpbmVyLCB3aWR0aCwgaGVpZ2h0IH0gPVxyXG4gICAgICB0aGlzLnNldHVwQ29udGFpbmVyKCk7XHJcblxyXG4gICAgdGhpcy5pc0hlYWRlclZpc2libGUgPVxyXG4gICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0hlYWRlclZpc2libGUgPz8gdGhpcy5pc0hlYWRlclZpc2libGU7XHJcblxyXG4gICAgY29uc3Qgc3ZnID0gdGhpcy5jcmVhdGVTdmcoY2hhcnRDb250YWluZXIsIHdpZHRoLCBoZWlnaHQpO1xyXG4gICAgY29uc3QgcmFkaXVzID0gdGhpcy5hZGp1c3REaW1lbnNpb25zQW5kUmFkaXVzKHdpZHRoLCBoZWlnaHQpO1xyXG5cclxuICAgIGNvbnN0IGFuZ2xlVmFsdWUgPSB0aGlzLmNvbXB1dGVBbmdsZXMoZGF0YV9yZWFkeSwgZGF0YSk7XHJcbiAgICBjb25zdCBhcmMgPSB0aGlzLmNyZWF0ZUFyYyhyYWRpdXMsIGFuZ2xlVmFsdWUsIGRhdGFfcmVhZHkpO1xyXG5cclxuICAgIHRoaXMuZHJhd0dhdWdlQXJjcyhzdmcsIGFyYywgZGF0YV9yZWFkeSwgY29sb3JNYXBzLCBtZXRhRGF0YSwgaXNSaWEsIGRhdGEpO1xyXG4gICAgdGhpcy5kcmF3UG9pbnRlcihzdmcsIHJhZGl1cywgbWV0YURhdGEsIGRhdGEpO1xyXG4gICAgdGhpcy5kcmF3TGFiZWxzKHN2ZywgcmFkaXVzLCBkYXRhX3JlYWR5LCBkYXRhLCBtZXRhRGF0YSk7XHJcbiAgICB0aGlzLmRyYXdDZW50ZXJUZXh0cyhzdmcsIHJhZGl1cywgbWV0YURhdGEpO1xyXG5cclxuICAgIHRoaXMuY2VudGVyU3ZnKHN2ZywgY2hhcnRDb250YWluZXIsIHdpZHRoLCBoZWlnaHQpO1xyXG4gIH1cclxuXHJcbiAgLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgKiAgTW9kdWxhciBIZWxwZXIgRnVuY3Rpb25zXHJcbiAgICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXHJcblxyXG4gIHByaXZhdGUgc2V0dXBDaGFydENvbmZpZ3VyYXRpb24oKSB7XHJcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmRlZmF1bHRDb25maWd1cmF0aW9uKSB7XHJcbiAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uW2tleV0gPSBDaGFydEhlbHBlci5nZXRWYWx1ZUJ5Q29uZmlndXJhdGlvblR5cGUoXHJcbiAgICAgICAga2V5LFxyXG4gICAgICAgIHRoaXMuZGVmYXVsdENvbmZpZ3VyYXRpb24sXHJcbiAgICAgICAgdGhpcy5jdXN0b21DaGFydENvbmZpZ3VyYXRpb25cclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0Q29sb3JNYXAobWV0YURhdGE6IGFueSkge1xyXG4gICAgY29uc3QgY29sb3JUeXBlID0gbWV0YURhdGEuY29sb3JUeXBlO1xyXG4gICAgY29uc3QgY29sb3JNYXBzID1cclxuICAgICAgY29sb3JUeXBlID09PSAnbG93J1xyXG4gICAgICAgID8gdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubG93X2NvbG9yTWFwXHJcbiAgICAgICAgOiB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5oaWdoX2NvbG9yTWFwO1xyXG4gICAgcmV0dXJuIHsgY29sb3JNYXBzIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbmZpZ3VyZURhdGFUeXBlKG1ldGFEYXRhOiBhbnkpIHtcclxuICAgIGlmIChtZXRhRGF0YS5kYXRhVHlwZSkge1xyXG4gICAgICB0aGlzLmRhdGFUeXBlID0gbWV0YURhdGEuZGF0YVR5cGU7XHJcbiAgICAgIGlmICh0aGlzLmRhdGFUeXBlID09PSAnVVNEJykge1xyXG4gICAgICAgIHRoaXMuZGF0YXR5cGVfc3RhdHVzID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmRhdGFUeXBlID0gJyQgJztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjYWxjdWxhdGVEYXRhUmVhZHkoZGF0YTogYW55W10pOiBudW1iZXJbXSB7XHJcbiAgICBjb25zdCBkYXRhX3JlYWR5OiBudW1iZXJbXSA9IFtdO1xyXG4gICAgZGF0YS5mb3JFYWNoKChfLCBpKSA9PiB7XHJcbiAgICAgIGlmIChpIDwgZGF0YS5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgZGF0YV9yZWFkeS5wdXNoKGRhdGFbaSArIDFdIC0gZGF0YVtpXSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGRhdGFfcmVhZHk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldHVwQ29udGFpbmVyKCkge1xyXG4gICAgY29uc3QgY2hhcnRDb250YWluZXIgPSBkMy5zZWxlY3QodGhpcy5jb250YWluZXJFbHQubmF0aXZlRWxlbWVudCk7XHJcbiAgICBjb25zdCBndWFnZWNvbnRhaW5lciA9IGQzLnNlbGVjdCh0aGlzLmd1YWdlY29udGFpbmVyRWx0Lm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgY29uc3QgbWFyZ2luID0gdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubWFyZ2luO1xyXG5cclxuICAgIGNvbnN0IHdpZHRoID1cclxuICAgICAgcGFyc2VJbnQoY2hhcnRDb250YWluZXIuc3R5bGUoJ3dpZHRoJykpIC0gbWFyZ2luLmxlZnQgLSBtYXJnaW4ucmlnaHQ7XHJcbiAgICBjb25zdCBoZWlnaHQgPVxyXG4gICAgICBwYXJzZUludChndWFnZWNvbnRhaW5lci5zdHlsZSgnaGVpZ2h0JykpIC1cclxuICAgICAgbWFyZ2luLnRvcCAtXHJcbiAgICAgIG1hcmdpbi5ib3R0b20gLVxyXG4gICAgICA1NjsgLy8gY2hhcnQgaGVhZGVyIGhlaWdodFxyXG5cclxuICAgIHJldHVybiB7IGNoYXJ0Q29udGFpbmVyLCBndWFnZWNvbnRhaW5lciwgd2lkdGgsIGhlaWdodCB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVTdmcoY2hhcnRDb250YWluZXIsIHdpZHRoLCBoZWlnaHQpIHtcclxuICAgIGNvbnN0IG1hcmdpbiA9IHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLm1hcmdpbjtcclxuICAgIHJldHVybiBjaGFydENvbnRhaW5lclxyXG4gICAgICAuYXBwZW5kKCdzdmcnKVxyXG4gICAgICAuYXR0cignaWQnLCB0aGlzLnVuaXF1ZUlkKVxyXG4gICAgICAuYXR0cignd2lkdGgnLCB3aWR0aCArIG1hcmdpbi5sZWZ0ICsgbWFyZ2luLnJpZ2h0KVxyXG4gICAgICAuYXR0cignaGVpZ2h0JywgaGVpZ2h0ICsgbWFyZ2luLnRvcCArIG1hcmdpbi5ib3R0b20pXHJcbiAgICAgIC5jYWxsKENoYXJ0SGVscGVyLnJlc3BvbnNpdmVmeSlcclxuICAgICAgLmFwcGVuZCgnZycpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZGp1c3REaW1lbnNpb25zQW5kUmFkaXVzKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IHJhZGl1cyA9IE1hdGgubWluKHdpZHRoLCBoZWlnaHQpIC8gMjtcclxuXHJcbiAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNEcmlsbGRvd25DaGFydCkge1xyXG4gICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5jdXJyZW50VmFsdWVXaWR0aFNjYWxlRmFjdG9yICs9IDQwO1xyXG4gICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5jdXJyZW50VmFsdWVIZWlnaHRTY2FsZUZhY3RvciArPSAyMDtcclxuICAgIH0gZWxzZSBpZiAod2luZG93LmlubmVyV2lkdGggPiAxNDAwKSB7XHJcbiAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmN1cnJlbnRWYWx1ZUhlaWdodFNjYWxlRmFjdG9yICs9IDE1O1xyXG4gICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5jdXJyZW50VmFsdWVXaWR0aFNjYWxlRmFjdG9yICo9IDI7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJhZGl1cztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29tcHV0ZUFuZ2xlcyhkYXRhX3JlYWR5OiBudW1iZXJbXSwgZGF0YTogYW55W10pOiBudW1iZXJbXSB7XHJcbiAgICBjb25zdCB0b3RhbCA9IGRhdGFfcmVhZHkucmVkdWNlKChzdW0sIHZhbCkgPT4gc3VtICsgdmFsLCAwKTtcclxuICAgIGNvbnN0IHRlbXBBcnJheTogbnVtYmVyW10gPSBbXTtcclxuXHJcbiAgICBkYXRhX3JlYWR5LmZvckVhY2goKHVuaXQsIGkpID0+IHtcclxuICAgICAgY29uc3QgYW5nbGUgPSAodW5pdCAvIHRvdGFsKSAqIDE4MDtcclxuICAgICAgdGVtcEFycmF5LnB1c2goaSA9PT0gMCA/IGFuZ2xlIDogdGVtcEFycmF5W2kgLSAxXSArIGFuZ2xlKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB0ZW1wQXJyYXk7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVBcmMocmFkaXVzOiBudW1iZXIsIGFuZ2xlVmFsdWU6IG51bWJlcltdLCBkYXRhX3JlYWR5OiBudW1iZXJbXSkge1xyXG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICBjb25zdCBkZWcycmFkID0gKGRlZzogbnVtYmVyKSA9PiAoZGVnICogTWF0aC5QSSkgLyAxODA7XHJcblxyXG4gICAgcmV0dXJuIGQzXHJcbiAgICAgIC5hcmMoKVxyXG4gICAgICAuaW5uZXJSYWRpdXMoXHJcbiAgICAgICAgcmFkaXVzIC1cclxuICAgICAgICAgIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnJpbmdXaWR0aCAtXHJcbiAgICAgICAgICBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5yaW5nSW5zZXRcclxuICAgICAgKVxyXG4gICAgICAub3V0ZXJSYWRpdXMocmFkaXVzKVxyXG4gICAgICAuc3RhcnRBbmdsZSgoXywgaSkgPT5cclxuICAgICAgICBkZWcycmFkKFxyXG4gICAgICAgICAgaSA9PT0gMFxyXG4gICAgICAgICAgICA/IHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLm1pbkFuZ2xlXHJcbiAgICAgICAgICAgIDogc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubWluQW5nbGUgKyBhbmdsZVZhbHVlW2kgLSAxXVxyXG4gICAgICAgIClcclxuICAgICAgKVxyXG4gICAgICAuZW5kQW5nbGUoKF8sIGkpID0+XHJcbiAgICAgICAgZGVnMnJhZChcclxuICAgICAgICAgIGkgPT09IGRhdGFfcmVhZHkubGVuZ3RoIC0gMVxyXG4gICAgICAgICAgICA/IHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLm1heEFuZ2xlXHJcbiAgICAgICAgICAgIDogc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubWluQW5nbGUgKyBhbmdsZVZhbHVlW2ldXHJcbiAgICAgICAgKVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkcmF3R2F1Z2VBcmNzKHN2ZywgYXJjLCBkYXRhX3JlYWR5LCBjb2xvck1hcHMsIG1ldGFEYXRhLCBpc1JpYSwgZGF0YSkge1xyXG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICBjb25zdCBhcmNzID0gc3ZnXHJcbiAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnYXJjJylcclxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIHRoaXMuY2VudGVyVHJhbnNsYXRpb24oYXJjLm91dGVyUmFkaXVzKCkoKSkpO1xyXG5cclxuICAgIGFyY3NcclxuICAgICAgLnNlbGVjdEFsbCgncGF0aCcpXHJcbiAgICAgIC5kYXRhKGRhdGFfcmVhZHkpXHJcbiAgICAgIC5lbnRlcigpXHJcbiAgICAgIC5hcHBlbmQoJ3BhdGgnKVxyXG4gICAgICAuYXR0cignZmlsbCcsIChfLCBpKSA9PiBjb2xvck1hcHNbaV0pXHJcbiAgICAgIC5zdHlsZSgnY3Vyc29yJywgKCkgPT5cclxuICAgICAgICBtZXRhRGF0YS5jdXJyZW50VmFsdWUgPiAwICYmIG1ldGFEYXRhLmhhc0RyaWxsRG93biAmJiAhaXNSaWFcclxuICAgICAgICAgID8gJ3BvaW50ZXInXHJcbiAgICAgICAgICA6ICdkZWZhdWx0J1xyXG4gICAgICApXHJcbiAgICAgIC5hdHRyKCdkJywgYXJjKVxyXG4gICAgICAub24oJ2NsaWNrJywgKGQpID0+IHtcclxuICAgICAgICBpZiAoIW1ldGFEYXRhLmhhc0RyaWxsRG93biB8fCBtZXRhRGF0YS5jdXJyZW50VmFsdWUgPT09IDApIHJldHVybjtcclxuICAgICAgICBjb25zdCByYW5nZSA9IGAke2RhdGFbMF19IGFuZCAke2RhdGFbZGF0YS5sZW5ndGggLSAxXX1gO1xyXG4gICAgICAgIHNlbGYuaGFuZGxlQ2xpY2socmFuZ2UpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZHJhd1BvaW50ZXIoc3ZnLCByYWRpdXMsIG1ldGFEYXRhLCBkYXRhKSB7XHJcbiAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgIGNvbnN0IHBvaW50ZXJIZWFkTGVuZ3RoID0gTWF0aC5yb3VuZChcclxuICAgICAgcmFkaXVzICogc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ucG9pbnRlckhlYWRMZW5ndGhQZXJjZW50XHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IGxpbmVEYXRhID0gW1xyXG4gICAgICBbc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ucG9pbnRlcldpZHRoIC8gMiwgMF0sXHJcbiAgICAgIFswLCAtcG9pbnRlckhlYWRMZW5ndGhdLFxyXG4gICAgICBbLShzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5wb2ludGVyV2lkdGggLyAyKSwgMF0sXHJcbiAgICAgIFswLCBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5wb2ludGVyVGFpbExlbmd0aF0sXHJcbiAgICAgIFtzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5wb2ludGVyV2lkdGggLyAyLCAwXSxcclxuICAgIF07XHJcblxyXG4gICAgY29uc3QgcG9pbnRlckxpbmUgPSBkMy5saW5lKCk7XHJcbiAgICBjb25zdCBwZyA9IHN2Z1xyXG4gICAgICAuYXBwZW5kKCdnJylcclxuICAgICAgLmRhdGEoW2xpbmVEYXRhXSlcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ3BvaW50ZXInKVxyXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgdGhpcy5jZW50ZXJUcmFuc2xhdGlvbihyYWRpdXMpKTtcclxuXHJcbiAgICBjb25zdCBwb2ludGVyVmFsdWUgPSBtZXRhRGF0YS5jdXJyZW50VmFsdWUgLSBkYXRhWzBdO1xyXG4gICAgY29uc3QgcmFuZ2UgPSBkYXRhW2RhdGEubGVuZ3RoIC0gMV0gLSBkYXRhWzBdO1xyXG4gICAgY29uc3QgcG9pbnRlckFuZ2xlID1cclxuICAgICAgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubWluQW5nbGUgKyAocG9pbnRlclZhbHVlIC8gcmFuZ2UpICogMTgwO1xyXG5cclxuICAgIHBnLmFwcGVuZCgncGF0aCcpXHJcbiAgICAgIC5hdHRyKCdkJywgcG9pbnRlckxpbmUpXHJcbiAgICAgIC5hdHRyKCdmaWxsJywgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ucG9pbnRlckNvbG9yKVxyXG4gICAgICAuYXR0cihcclxuICAgICAgICAndHJhbnNmb3JtJyxcclxuICAgICAgICBgcm90YXRlKCR7cG9pbnRlckFuZ2xlfSkgdHJhbnNsYXRlKDAsJHtcclxuICAgICAgICAgIC1yYWRpdXMgKyBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5yaW5nV2lkdGggKyBwb2ludGVySGVhZExlbmd0aFxyXG4gICAgICAgIH0pYFxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkcmF3TGFiZWxzKHN2ZywgcmFkaXVzLCBkYXRhX3JlYWR5LCBkYXRhLCBtZXRhRGF0YSkge1xyXG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICBjb25zdCByYW5nZSA9IGRhdGFbZGF0YS5sZW5ndGggLSAxXSAtIGRhdGFbMF07XHJcbiAgICBjb25zdCBsYWJlbEFycmF5ID0gdGhpcy5idWlsZExhYmVsQXJyYXkoZGF0YV9yZWFkeSwgZGF0YSk7XHJcblxyXG4gICAgY29uc3QgbGcgPSBzdmdcclxuICAgICAgLmFwcGVuZCgnZycpXHJcbiAgICAgIC5hdHRyKCdjbGFzcycsICdsYWJlbCcpXHJcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCB0aGlzLmNlbnRlclRyYW5zbGF0aW9uKHJhZGl1cykpO1xyXG5cclxuICAgIGxnLnNlbGVjdEFsbCgnLmJ1YmJsZScpXHJcbiAgICAgIC5kYXRhKGxhYmVsQXJyYXkpXHJcbiAgICAgIC5lbnRlcigpXHJcbiAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgKGQpID0+IHtcclxuICAgICAgICBjb25zdCBuZXdBbmdsZSA9XHJcbiAgICAgICAgICBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5taW5BbmdsZSArIChkLnZhbHVlIC8gcmFuZ2UpICogMTgwO1xyXG4gICAgICAgIHJldHVybiBgcm90YXRlKCR7bmV3QW5nbGV9KSB0cmFuc2xhdGUoMCwke1xyXG4gICAgICAgICAgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubGFiZWxJbnNldCAtIHJhZGl1cyAtIDIwXHJcbiAgICAgICAgfSlgO1xyXG4gICAgICB9KVxyXG4gICAgICAuYXBwZW5kKCd0ZXh0JylcclxuICAgICAgLmF0dHIoJ2ZpbGwnLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKVxyXG4gICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIHdpbmRvdy5pbm5lcldpZHRoIDwgMTQwMCA/ICcxMnB4JyA6ICcxNHB4JylcclxuICAgICAgLnN0eWxlKCdmb250LXdlaWdodCcsICc2MDAnKVxyXG4gICAgICAudGV4dCgoZCkgPT4gKG1ldGFEYXRhLmRhdGFUeXBlID8gZC5uYW1lICsgbWV0YURhdGEuZGF0YVR5cGUgOiBkLm5hbWUpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYnVpbGRMYWJlbEFycmF5KGRhdGFfcmVhZHk6IG51bWJlcltdLCBkYXRhOiBhbnlbXSkge1xyXG4gICAgY29uc3QgbGFiZWxBcnJheSA9IFt7IG5hbWU6IGRhdGFbMF0sIHZhbHVlOiAwIH1dO1xyXG4gICAgbGV0IGNvdW50ID0gMDtcclxuICAgIGRhdGFfcmVhZHkuZm9yRWFjaCgodW5pdCwgaSkgPT4ge1xyXG4gICAgICBjb3VudCArPSB1bml0O1xyXG4gICAgICBsYWJlbEFycmF5LnB1c2goeyBuYW1lOiBkYXRhW2kgKyAxXSwgdmFsdWU6IGNvdW50IH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gbGFiZWxBcnJheTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZHJhd0NlbnRlclRleHRzKHN2ZywgcmFkaXVzLCBtZXRhRGF0YSkge1xyXG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICBjb25zdCB0b3AgPSByYWRpdXMgLyAyIC0gMTA7XHJcbiAgICBjb25zdCBtaWQgPSB0b3AgKyBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5jdXJyZW50VmFsdWVIZWlnaHRTY2FsZUZhY3RvcjtcclxuICAgIGNvbnN0IGJvdHRvbSA9IG1pZCArIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmN1cnJlbnRWYWx1ZUhlaWdodFNjYWxlRmFjdG9yO1xyXG5cclxuICAgIC8vIGN1cnJlbnQgdmFsdWVcclxuICAgIHN2Z1xyXG4gICAgICAuYXBwZW5kKCdmb3JlaWduT2JqZWN0JylcclxuICAgICAgLmF0dHIoXHJcbiAgICAgICAgJ3RyYW5zZm9ybScsXHJcbiAgICAgICAgYHRyYW5zbGF0ZSgke3JhZGl1cyAtIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmN1cnJlbnRWYWx1ZVdpZHRoU2NhbGVGYWN0b3IgLyAyfSwke3RvcH0pYFxyXG4gICAgICApXHJcbiAgICAgIC5hdHRyKCd3aWR0aCcsIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmN1cnJlbnRWYWx1ZVdpZHRoU2NhbGVGYWN0b3IgKyA4KVxyXG4gICAgICAuYXR0cignaGVpZ2h0JywgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uY3VycmVudFZhbHVlSGVpZ2h0U2NhbGVGYWN0b3IpXHJcbiAgICAgIC5hcHBlbmQoJ3hodG1sOmRpdicpXHJcbiAgICAgIC5hdHRyKCdjbGFzcycsICd2YWx1ZS1kaXNwbGF5JylcclxuICAgICAgLmh0bWwobWV0YURhdGEuY3VycmVudFZhbHVlICsgbWV0YURhdGEuZGF0YVR5cGUpO1xyXG5cclxuICAgIC8vIHN0YXR1c1xyXG4gICAgaWYgKG1ldGFEYXRhLnN0YXR1cykge1xyXG4gICAgICBjb25zdCB3aWR0aFRlbXAgPSBtZXRhRGF0YS5zdGF0dXMubGVuZ3RoID4gNCA/IDIxMCA6IDEyMDtcclxuICAgICAgc3ZnXHJcbiAgICAgICAgLmFwcGVuZCgnZm9yZWlnbk9iamVjdCcpXHJcbiAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoJHtyYWRpdXMgLSB3aWR0aFRlbXAgLyAyfSwke21pZH0pYClcclxuICAgICAgICAuYXR0cignd2lkdGgnLCB3aWR0aFRlbXApXHJcbiAgICAgICAgLmFwcGVuZCgneGh0bWw6ZGl2JylcclxuICAgICAgICAuYXR0cignY2xhc3MnLCAnc3RhdHVzLWRpc3BsYXknKVxyXG4gICAgICAgIC5odG1sKG1ldGFEYXRhLnN0YXR1cyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZGF0ZSByYW5nZVxyXG4gICAgc3ZnXHJcbiAgICAgIC5hcHBlbmQoJ2ZvcmVpZ25PYmplY3QnKVxyXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgke3JhZGl1cyAtIDEwNX0sJHtib3R0b219KWApXHJcbiAgICAgIC5hdHRyKCd3aWR0aCcsIDIxMClcclxuICAgICAgLmFwcGVuZCgneGh0bWw6ZGl2JylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2RhdGVyYW5nZS1kaXNwbGF5JylcclxuICAgICAgLmh0bWwoXHJcbiAgICAgICAgbWV0YURhdGEuZGF0ZVJhbmdlXHJcbiAgICAgICAgICA/IGA8c3BhbiBjbGFzcz1cIm1hcmdpbnJpZ2h0LTNcIj48aSBjbGFzcz1cImZhIGZhLWNhbGVuZGFyXCI+PC9pPjwvc3Bhbj48c3Bhbj4ke21ldGFEYXRhLmRhdGVSYW5nZX08L3NwYW4+YFxyXG4gICAgICAgICAgOiAnJ1xyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjZW50ZXJUcmFuc2xhdGlvbihyYWRpdXM6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIGB0cmFuc2xhdGUoJHtyYWRpdXN9LCR7cmFkaXVzfSlgO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjZW50ZXJTdmcoc3ZnLCBjaGFydENvbnRhaW5lciwgd2lkdGgsIGhlaWdodCkge1xyXG4gICAgY29uc3QgbWFyZ2luID0gdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubWFyZ2luO1xyXG4gICAgY29uc3QgY29udGFpbmVyTWlkV2lkdGggPSBwYXJzZUludChjaGFydENvbnRhaW5lci5zdHlsZSgnd2lkdGgnKSkgLyAyO1xyXG4gICAgY29uc3Qgbm9kZUhhbGZXaWR0aCA9IHN2Zy5ub2RlKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggLyAyO1xyXG4gICAgY29uc3QgdXBkYXRlZFN0YXJ0aW5nUG9pbnQgPSBjb250YWluZXJNaWRXaWR0aCAtIG5vZGVIYWxmV2lkdGg7XHJcblxyXG4gICAgc3ZnLmF0dHIoXHJcbiAgICAgICd0cmFuc2Zvcm0nLFxyXG4gICAgICBgdHJhbnNsYXRlKCR7dXBkYXRlZFN0YXJ0aW5nUG9pbnQgKyBtYXJnaW4ubGVmdH0sJHttYXJnaW4udG9wfSlgXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgKiAgRXZlbnQgSGFuZGxlcnNcclxuICAgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cclxuICBoYW5kbGVDbGljayhkOiBhbnkpIHtcclxuICAgIHRoaXMuY2xpY2tFdmVudC5lbWl0KGQpO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlSGVhZGVyTWVudUNsaWNrKGlkKSB7XHJcbiAgICB0aGlzLmhlYWRlck1lbnVjbGlja0V2ZW50LmVtaXQoaWQpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2ICNndWFnZWNvbnRhaW5lciBjbGFzcz1cImxpYi1jaGFydC13cmFwcGVyXCIgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jYXJkLWJnKTtcIlxyXG4gIChyZXNpemVkKT1cIm9uUmVzaXplZCgkZXZlbnQpXCI+XHJcbiAgPGRpdiBjbGFzcz1cImhlYWRlci1hbHRcIiAqbmdJZj1cIiFpc0hlYWRlclZpc2libGVcIj5cclxuICAgIDxsaWItY2hhcnQtaGVhZGVyLXYyIFtjaGFydERhdGFdPVwiY2hhcnREYXRhXCIgW2NoYXJ0Q29uZmlndXJhdGlvbl09XCJjaGFydENvbmZpZ3VyYXRpb25cIlxyXG4gICAgICAoY2xpY2tFdmVudCk9XCJoYW5kbGVDbGljaygkZXZlbnQpXCI+PC9saWItY2hhcnQtaGVhZGVyLXYyPlxyXG4gIDwvZGl2PlxyXG4gIDxsaWItY2hhcnQtaGVhZGVyLXYxIFt0aXRsZV09XCJjaGFydERhdGEubWV0YURhdGEudGl0bGVcIiBbaGFzRHJpbGxEb3duXT1cImNoYXJ0RGF0YS5tZXRhRGF0YS5oYXNEcmlsbERvd25cIlxyXG4gICAgW2lzRWRpdEVuYWJsZWRdPVwiY2hhcnREYXRhLm1ldGFEYXRhLmlzRWRpdEVuYWJsZWRcIiBbaXNyaWFdPVwiY3VzdG9tQ2hhcnRDb25maWd1cmF0aW9uLmlzUmlhXCIgW21lbnVPcHRpb25zXT1cImNoYXJ0Q29uZmlndXJhdGlvbi5oZWFkZXJNZW51T3B0aW9uc1wiXHJcbiAgICBbc2VsZWN0ZWRLcGlUb29sdG9wXT1cImNoYXJ0Q29uZmlndXJhdGlvbi5zZWxlY3RlZEtwaVRvb2x0b3BcIiAobWVudU9wdGlvbkNsaWNrRXZlbnQpPVwiaGFuZGxlSGVhZGVyTWVudUNsaWNrKCRldmVudClcIlxyXG4gICAgW2lzQWxlcnRFbmFibGVkXT1cImlzQWxlcnRFbmFibGVkXCIgKm5nSWY9XCJpc0hlYWRlclZpc2libGVcIj48L2xpYi1jaGFydC1oZWFkZXItdjE+XHJcbiAgPGRpdiBbc3R5bGUuaGVpZ2h0XT1cImNoYXJ0Q29uZmlndXJhdGlvbi5zdmdIZWlnaHRcIiBpZD1cImd1YWdlY2hhcnRjb250YWluZXJcIiAjZ3VhZ2VjaGFydGNvbnRhaW5lclxyXG4gICAgY2xhc3M9XCJsaWItY2hhcnQtc3ZnIGd1YWdlY29udGFpbmVyXCI+PC9kaXY+XHJcbjwvZGl2PiJdfQ==