tango-app-ui-analyse-traffic 3.0.1-dev → 3.3.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/chart-detail-modal/chart-detail-modal.component.mjs +55 -0
- package/esm2022/lib/components/image-doc/image-doc.component.mjs +105 -0
- package/esm2022/lib/components/reactive-select/reactive-select.component.mjs +80 -0
- package/esm2022/lib/components/tango-analyse-traffic/tango-analyse-traffic.component.mjs +22 -6
- package/esm2022/lib/components/traffic-analysis/traffic-analysis.component.mjs +579 -130
- package/esm2022/lib/components/traffic-card-charts/traffic-card-charts.component.mjs +937 -0
- package/esm2022/lib/components/traffic-charts/traffic-charts.component.mjs +422 -0
- package/esm2022/lib/services/traffic.service.mjs +69 -0
- package/esm2022/lib/tango-analyse-traffic-routing.module.mjs +4 -4
- package/esm2022/lib/tango-analyse-traffic.module.mjs +27 -9
- package/fesm2022/tango-app-ui-analyse-traffic.mjs +2234 -136
- package/fesm2022/tango-app-ui-analyse-traffic.mjs.map +1 -1
- package/lib/components/chart-detail-modal/chart-detail-modal.component.d.ts +16 -0
- package/lib/components/image-doc/image-doc.component.d.ts +31 -0
- package/lib/components/reactive-select/reactive-select.component.d.ts +23 -0
- package/lib/components/tango-analyse-traffic/tango-analyse-traffic.component.d.ts +7 -1
- package/lib/components/traffic-analysis/traffic-analysis.component.d.ts +62 -3
- package/lib/components/traffic-card-charts/traffic-card-charts.component.d.ts +81 -0
- package/lib/components/traffic-charts/traffic-charts.component.d.ts +55 -0
- package/lib/services/traffic.service.d.ts +26 -0
- package/lib/tango-analyse-traffic.module.d.ts +10 -3
- package/package.json +1 -1
|
@@ -0,0 +1,422 @@
|
|
|
1
|
+
import { Component, HostListener, ViewChild } from '@angular/core';
|
|
2
|
+
import * as am5 from '@amcharts/amcharts5';
|
|
3
|
+
import * as am5xy from '@amcharts/amcharts5/xy';
|
|
4
|
+
import am5themes_Animated from '@amcharts/amcharts5/themes/Animated';
|
|
5
|
+
import { FormControl } from '@angular/forms';
|
|
6
|
+
import { Subject, takeUntil } from "rxjs";
|
|
7
|
+
import { debounceTime } from 'rxjs/operators';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
import * as i1 from "@ng-bootstrap/ng-bootstrap";
|
|
10
|
+
import * as i2 from "../../services/traffic.service";
|
|
11
|
+
import * as i3 from "tango-app-ui-global";
|
|
12
|
+
import * as i4 from "@angular/common";
|
|
13
|
+
import * as i5 from "@angular/forms";
|
|
14
|
+
import * as i6 from "../reactive-select/reactive-select.component";
|
|
15
|
+
export class TrafficChartsComponent {
|
|
16
|
+
zone;
|
|
17
|
+
modalService;
|
|
18
|
+
service;
|
|
19
|
+
gs;
|
|
20
|
+
cd;
|
|
21
|
+
chart;
|
|
22
|
+
root;
|
|
23
|
+
yAxis;
|
|
24
|
+
xAxis;
|
|
25
|
+
legend;
|
|
26
|
+
tooltipContainer;
|
|
27
|
+
tooltipData;
|
|
28
|
+
datasets = [
|
|
29
|
+
{ value: 'footfall', label: 'Footfall' },
|
|
30
|
+
{ value: 'bounced footfall', label: 'Bounced Footfall' },
|
|
31
|
+
{ value: 'engagers', label: 'Engagers' },
|
|
32
|
+
{ value: 'missed opportunity', label: 'Missed Opportunity' },
|
|
33
|
+
{ value: 'potential buyer', label: 'Potential Buyer' },
|
|
34
|
+
{ value: 'conversion', label: 'Conversion' }
|
|
35
|
+
];
|
|
36
|
+
// data = {
|
|
37
|
+
// dataset1: [
|
|
38
|
+
// { year: 'Store-1', engagers: 10, bounced: 8, billable: 5, missedOpportunity: 3, conversion: 2, expenses: 20 },
|
|
39
|
+
// { year: '2013', engagers: 15, bounced: 10, billable: 7, missedOpportunity: 4, conversion: 3, expenses: 25 },
|
|
40
|
+
// { year: '2014', engagers: 20, bounced: 12, billable: 9, missedOpportunity: 5, conversion: 4, expenses: 10 },
|
|
41
|
+
// { year: '2015', engagers: 25, bounced: 15, billable: 10, missedOpportunity: 6, conversion: 5, expenses: 35 },
|
|
42
|
+
// { year: '2016', engagers: 10, bounced: 8, billable: 5, missedOpportunity: 3, conversion: 2, expenses: 20 },
|
|
43
|
+
// { year: '2017', engagers: 15, bounced: 10, billable: 7, missedOpportunity: 4, conversion: 3, expenses: 25 },
|
|
44
|
+
// { year: '2018', engagers: 20, bounced: 12, billable: 9, missedOpportunity: 5, conversion: 4, expenses: 10 },
|
|
45
|
+
// { year: '2019', engagers: 25, bounced: 15, billable: 10, missedOpportunity: 6, conversion: 5, expenses: 35 },
|
|
46
|
+
// { year: '2020', engagers: 30, bounced: 18, billable: 12, missedOpportunity: 7, conversion: 6, expenses: 10 },
|
|
47
|
+
// { year: '2021', engagers: 2, bounced: 12, billable: 19, missedOpportunity: 4, conversion: 14, expenses: 10 },
|
|
48
|
+
// { year: '2022', engagers: 5, bounced: 25, billable: 3, missedOpportunity: 6, conversion: 5, expenses: 5,columnSettings: {
|
|
49
|
+
// fillOpacity: 0.5,
|
|
50
|
+
// strokeWidth: 2,
|
|
51
|
+
// strokeDasharray: [5, 5]
|
|
52
|
+
// },
|
|
53
|
+
// strokeSettings: {
|
|
54
|
+
// stroke: am5.color(0xff0000),
|
|
55
|
+
// strokeWidth: 2,
|
|
56
|
+
// strokeDasharray: [5, 5]
|
|
57
|
+
// } },
|
|
58
|
+
// { year: '2023', engagers: 13, bounced: 8, billable: 12, missedOpportunity: 7, conversion: 6, expenses: 10, columnSettings: {
|
|
59
|
+
// fillOpacity: 0.3,
|
|
60
|
+
// strokeWidth: 1,
|
|
61
|
+
// strokeDasharray: [3, 3]
|
|
62
|
+
// }, },
|
|
63
|
+
// { year: '2024', engagers: 17, bounced: 18, billable: 12, missedOpportunity: 7, conversion: 16, expenses: 30, columnSettings: {
|
|
64
|
+
// fillOpacity: 0.3,
|
|
65
|
+
// strokeWidth: 1,
|
|
66
|
+
// strokeDasharray: [3, 3]
|
|
67
|
+
// }, }
|
|
68
|
+
// ],
|
|
69
|
+
// dataset2: [
|
|
70
|
+
// { year: '2016', engagers: 5, bounced: 4, billable: 3, missedOpportunity: 2, conversion: 1, expenses: 10, },
|
|
71
|
+
// { year: '2017', engagers: 8, bounced: 6, billable: 5, missedOpportunity: 3, conversion: 2, expenses: 15 },
|
|
72
|
+
// { year: '2018', engagers: 10, bounced: 8, billable: 6, missedOpportunity: 4, conversion: 3, expenses: 20 },
|
|
73
|
+
// { year: '2019', engagers: 12, bounced: 10, billable: 8, missedOpportunity: 5, conversion: 4, expenses: 25 },
|
|
74
|
+
// { year: '2020', engagers: 15, bounced: 12, billable: 10, missedOpportunity: 6, conversion: 5, expenses: 30 }
|
|
75
|
+
// ],
|
|
76
|
+
// dataset3: [
|
|
77
|
+
// { year: '2016', engagers: 12, bounced: 11, billable: 8, missedOpportunity: 7, conversion: 6, expenses: 18 },
|
|
78
|
+
// { year: '2017', engagers: 14, bounced: 13, billable: 10, missedOpportunity: 9, conversion: 8, expenses: 22 },
|
|
79
|
+
// { year: '2018', engagers: 18, bounced: 15, billable: 12, missedOpportunity: 11, conversion: 10, expenses: 27 },
|
|
80
|
+
// { year: '2019', engagers: 20, bounced: 18, billable: 15, missedOpportunity: 12, conversion: 11, expenses: 32 },
|
|
81
|
+
// { year: '2020', engagers: 22, bounced: 20, billable: 17, missedOpportunity: 14, conversion: 12, expenses: 37 }
|
|
82
|
+
// ]
|
|
83
|
+
// };
|
|
84
|
+
type = "daily";
|
|
85
|
+
// currentData = this.data.dataset1;
|
|
86
|
+
sharedTooltip;
|
|
87
|
+
selectValue = new FormControl("dataset1");
|
|
88
|
+
clickListener;
|
|
89
|
+
objData;
|
|
90
|
+
destroy$ = new Subject();
|
|
91
|
+
getFootfallTrendData;
|
|
92
|
+
processType = "footfall";
|
|
93
|
+
typeValue;
|
|
94
|
+
headerData;
|
|
95
|
+
constructor(zone, modalService, service, gs, cd) {
|
|
96
|
+
this.zone = zone;
|
|
97
|
+
this.modalService = modalService;
|
|
98
|
+
this.service = service;
|
|
99
|
+
this.gs = gs;
|
|
100
|
+
this.cd = cd;
|
|
101
|
+
}
|
|
102
|
+
offset = 1;
|
|
103
|
+
limit = 10;
|
|
104
|
+
ngOnInit() {
|
|
105
|
+
this.gs.dataRangeValue
|
|
106
|
+
.pipe(takeUntil(this.destroy$), debounceTime(300))
|
|
107
|
+
.subscribe((data) => {
|
|
108
|
+
this.headerData = data;
|
|
109
|
+
this.objData = {
|
|
110
|
+
fromDate: this.headerData.date.startDate,
|
|
111
|
+
toDate: this.headerData.date.endDate,
|
|
112
|
+
storeId: data.stores.filter((store) => store.checked).map((store) => store.storeId),
|
|
113
|
+
clientId: data.client,
|
|
114
|
+
processType: this.processType,
|
|
115
|
+
filterBy: this.processType,
|
|
116
|
+
limit: this.limit,
|
|
117
|
+
offset: this.offset
|
|
118
|
+
};
|
|
119
|
+
this.footfallTrend();
|
|
120
|
+
this.selectValue.valueChanges.subscribe((value) => {
|
|
121
|
+
this.onDatasetChange(value);
|
|
122
|
+
});
|
|
123
|
+
// this.onDatasetChange(this.selectValue.value);
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
ngOnDestroy() {
|
|
127
|
+
if (this.root) {
|
|
128
|
+
this.root.dispose();
|
|
129
|
+
}
|
|
130
|
+
this.destroy$.next(true);
|
|
131
|
+
this.destroy$.complete();
|
|
132
|
+
}
|
|
133
|
+
footfallTrend() {
|
|
134
|
+
this.service
|
|
135
|
+
.getfootfallTrend(this.objData)
|
|
136
|
+
.pipe(takeUntil(this.destroy$))
|
|
137
|
+
?.subscribe({
|
|
138
|
+
next: (res) => {
|
|
139
|
+
if (res && res.code === 200) {
|
|
140
|
+
this.getFootfallTrendData = res?.data.footfallTrendData;
|
|
141
|
+
this.cd.detectChanges();
|
|
142
|
+
setTimeout(() => this.createChart(), 0); // Call with a delay to ensure the element is in the DOM
|
|
143
|
+
}
|
|
144
|
+
},
|
|
145
|
+
error: (err) => {
|
|
146
|
+
this.cd.detectChanges();
|
|
147
|
+
},
|
|
148
|
+
complete: () => { },
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
selectPlan(type) {
|
|
152
|
+
this.type = type;
|
|
153
|
+
// this.currentData = this.data.dataset2;
|
|
154
|
+
this.updateChartData();
|
|
155
|
+
}
|
|
156
|
+
createChart() {
|
|
157
|
+
setTimeout(() => {
|
|
158
|
+
const chartDiv = document.getElementById("Footfalltrend");
|
|
159
|
+
if (!chartDiv) {
|
|
160
|
+
console.error("Could not find HTML element with id `Footfalltrend`");
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
if (this.root) {
|
|
164
|
+
this.root.dispose();
|
|
165
|
+
}
|
|
166
|
+
this.root = am5.Root.new('Footfalltrend');
|
|
167
|
+
this.root.setThemes([am5themes_Animated.new(this.root)]);
|
|
168
|
+
this.chart = this.root.container.children.push(am5xy.XYChart.new(this.root, {
|
|
169
|
+
panX: false,
|
|
170
|
+
panY: false,
|
|
171
|
+
wheelX: 'panX',
|
|
172
|
+
wheelY: 'zoomX',
|
|
173
|
+
layout: this.root.verticalLayout
|
|
174
|
+
}));
|
|
175
|
+
this.chart.set("scrollbarX", am5.Scrollbar.new(this.root, {
|
|
176
|
+
orientation: "horizontal"
|
|
177
|
+
}));
|
|
178
|
+
const xAxis = this.chart.xAxes.push(am5xy.CategoryAxis.new(this.root, {
|
|
179
|
+
categoryField: 'storeName',
|
|
180
|
+
renderer: am5xy.AxisRendererX.new(this.root, {
|
|
181
|
+
minGridDistance: 30
|
|
182
|
+
}),
|
|
183
|
+
tooltip: am5.Tooltip.new(this.root, {})
|
|
184
|
+
}));
|
|
185
|
+
this.getFootfallTrendData = this.getFootfallTrendData?.map((item) => ({
|
|
186
|
+
storeName: item.storeName,
|
|
187
|
+
footfall: Number(item.footfallRate),
|
|
188
|
+
conversion: Number(item.conversionRate),
|
|
189
|
+
bounced: Number(item.bouncedRate),
|
|
190
|
+
engagers: Number(item.engagersRate),
|
|
191
|
+
missedopportunities: Number(item.missedopportunitiesRate),
|
|
192
|
+
avgDownTime: Number(item.avgDownTime),
|
|
193
|
+
}));
|
|
194
|
+
xAxis.data.setAll(this.getFootfallTrendData);
|
|
195
|
+
const yAxis = this.chart.yAxes.push(am5xy.ValueAxis.new(this.root, {
|
|
196
|
+
renderer: am5xy.AxisRendererY.new(this.root, {})
|
|
197
|
+
}));
|
|
198
|
+
// Set the title of the y-axis
|
|
199
|
+
yAxis.children.unshift(am5.Label.new(this.root, {
|
|
200
|
+
rotation: -90,
|
|
201
|
+
text: 'Footfall',
|
|
202
|
+
y: am5.p50,
|
|
203
|
+
centerX: am5.p50
|
|
204
|
+
}));
|
|
205
|
+
this.createColumnSeries('Engagers', 'engagers', xAxis, yAxis, false, am5.color(0xB3E3FF));
|
|
206
|
+
this.createColumnSeries('Bounced', 'bounced', xAxis, yAxis, true, am5.color(0x80D1FF));
|
|
207
|
+
this.createColumnSeries('Billable', 'footfall', xAxis, yAxis, true, am5.color(0x66C8FF));
|
|
208
|
+
this.createColumnSeries('Missed Opportunity', 'missedopportunities', xAxis, yAxis, true, am5.color(0x4DBFFF));
|
|
209
|
+
this.createColumnSeries('Conversion', 'conversion', xAxis, yAxis, true, am5.color(0x33B5FF));
|
|
210
|
+
this.createLineSeries('Expenses', 'avgDownTime', xAxis, yAxis, am5.color(0x33B5FF));
|
|
211
|
+
const legend = this.chart.children.push(am5.Legend.new(this.root, {
|
|
212
|
+
centerX: am5.p50,
|
|
213
|
+
x: am5.p50
|
|
214
|
+
}));
|
|
215
|
+
legend.data.setAll(this.chart.series.values);
|
|
216
|
+
this.chart.set('cursor', am5xy.XYCursor.new(this.root, {
|
|
217
|
+
behavior: 'none'
|
|
218
|
+
}));
|
|
219
|
+
this.chart.series.each((series) => {
|
|
220
|
+
if (series.columns) {
|
|
221
|
+
series.columns.template.set("interactive", true);
|
|
222
|
+
series.columns.template.events.on("click", (ev) => {
|
|
223
|
+
const data = ev.target.dataItem.dataContext;
|
|
224
|
+
const { clientX, clientY } = ev.originalEvent;
|
|
225
|
+
this.showTooltip(data, clientX, clientY);
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
this.chart.appear(1000, 100);
|
|
230
|
+
}, 0);
|
|
231
|
+
}
|
|
232
|
+
tooltipVisible = false;
|
|
233
|
+
showTooltip(data, x, y) {
|
|
234
|
+
this.tooltipVisible = false;
|
|
235
|
+
this.tooltipData = data;
|
|
236
|
+
const tooltipElement = this.tooltipContainer.nativeElement;
|
|
237
|
+
// Set tooltip content and make it visible to calculate dimensions
|
|
238
|
+
tooltipElement.style.display = 'block';
|
|
239
|
+
tooltipElement.style.visibility = 'hidden'; // Make it invisible but still present in the DOM
|
|
240
|
+
// Force a reflow to ensure dimensions are up-to-date
|
|
241
|
+
tooltipElement.style.position = 'absolute';
|
|
242
|
+
// Wait for the next event loop to get accurate dimensions
|
|
243
|
+
setTimeout(() => {
|
|
244
|
+
const tooltipWidth = tooltipElement.offsetWidth;
|
|
245
|
+
const tooltipHeight = tooltipElement.offsetHeight;
|
|
246
|
+
const screenWidth = window.innerWidth;
|
|
247
|
+
const screenHeight = window.innerHeight;
|
|
248
|
+
// Calculate if there is enough space on the right side, otherwise place it on the left
|
|
249
|
+
if (x + tooltipWidth > screenWidth) {
|
|
250
|
+
tooltipElement.style.left = `${x - tooltipWidth}px`;
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
tooltipElement.style.left = `${x}px`;
|
|
254
|
+
}
|
|
255
|
+
// Calculate if there is enough space at the bottom, otherwise place it at the top
|
|
256
|
+
if (y + tooltipHeight > screenHeight) {
|
|
257
|
+
tooltipElement.style.top = `${y - tooltipHeight}px`;
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
tooltipElement.style.top = `${y}px`;
|
|
261
|
+
}
|
|
262
|
+
tooltipElement.style.visibility = 'visible'; // Make it visible again
|
|
263
|
+
this.tooltipVisible = true;
|
|
264
|
+
}, 0);
|
|
265
|
+
}
|
|
266
|
+
hideTooltip() {
|
|
267
|
+
this.tooltipVisible = false;
|
|
268
|
+
const tooltipElement = this.tooltipContainer.nativeElement;
|
|
269
|
+
tooltipElement.style.display = 'none';
|
|
270
|
+
}
|
|
271
|
+
onClick(event) {
|
|
272
|
+
const tooltipElement = this.tooltipContainer.nativeElement;
|
|
273
|
+
// Check if the click was outside the tooltip
|
|
274
|
+
if (tooltipElement && !tooltipElement.contains(event.target) && this.tooltipVisible) {
|
|
275
|
+
this.hideTooltip();
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
// openModal(data: any,clientX: number, clientY: number) {
|
|
279
|
+
// const modalRef = this.modalService.open(ChartDetailModalComponent,{
|
|
280
|
+
// centered: true,
|
|
281
|
+
// windowClass: 'custom-modal',
|
|
282
|
+
// size: "sm",
|
|
283
|
+
// });
|
|
284
|
+
// modalRef.componentInstance.data = data;
|
|
285
|
+
// modalRef.componentInstance.clientX = clientX;
|
|
286
|
+
// modalRef.componentInstance.clientY = clientY;
|
|
287
|
+
// }
|
|
288
|
+
onDatasetChange(selectedValue) {
|
|
289
|
+
// const selectedDataset = selectedValue as keyof Dataset;
|
|
290
|
+
// this.currentData = this.data[selectedDataset];
|
|
291
|
+
this.updateChartData();
|
|
292
|
+
// this.updateYAxisLabel(selectedValue);
|
|
293
|
+
}
|
|
294
|
+
// updateYAxisLabel(selectedValue: string) {
|
|
295
|
+
// const newLabelText = `Footfall - ${selectedValue}`; // Customize your label text as needed
|
|
296
|
+
// console.log('Updating Y-axis label to:', newLabelText);
|
|
297
|
+
// const label = this.yAxis.children.getIndex(0) as am5.Label;
|
|
298
|
+
// label.set("text", newLabelText);
|
|
299
|
+
// }
|
|
300
|
+
updateChartData() {
|
|
301
|
+
const xAxis = this.chart.xAxes.getIndex(0);
|
|
302
|
+
xAxis.data.setAll(this.getFootfallTrendData);
|
|
303
|
+
this.chart.series.each((series) => {
|
|
304
|
+
series.data.setAll(this.getFootfallTrendData);
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
createColumnSeries(name, fieldName, xAxis, yAxis, stacked, color) {
|
|
308
|
+
const series = this.chart.series.push(am5xy.ColumnSeries.new(this.root, {
|
|
309
|
+
name: name,
|
|
310
|
+
xAxis: xAxis,
|
|
311
|
+
yAxis: yAxis,
|
|
312
|
+
valueYField: fieldName,
|
|
313
|
+
categoryXField: 'storeName',
|
|
314
|
+
stacked: stacked,
|
|
315
|
+
}));
|
|
316
|
+
series.data.setAll(this.getFootfallTrendData);
|
|
317
|
+
// Adapter to apply custom column settings
|
|
318
|
+
series.columns.template.adapters.add("fillOpacity", (fillOpacity, target) => {
|
|
319
|
+
const dataItem = target.dataItem.dataContext;
|
|
320
|
+
return dataItem.columnSettings ? dataItem.columnSettings.fillOpacity : fillOpacity;
|
|
321
|
+
});
|
|
322
|
+
series.columns.template.adapters.add("strokeDasharray", (strokeDasharray, target) => {
|
|
323
|
+
const dataItem = target.dataItem.dataContext;
|
|
324
|
+
return dataItem.columnSettings ? dataItem.columnSettings.strokeDasharray : strokeDasharray;
|
|
325
|
+
});
|
|
326
|
+
series.columns.template.adapters.add("strokeWidth", (strokeWidth, target) => {
|
|
327
|
+
const dataItem = target.dataItem.dataContext;
|
|
328
|
+
return dataItem.columnSettings ? dataItem.columnSettings.strokeWidth : strokeWidth;
|
|
329
|
+
});
|
|
330
|
+
series.columns.template.setAll({
|
|
331
|
+
// tooltipText: "{name}: {valueY.formatNumber('#.#')}%", // Ensure proper formatting for single value display
|
|
332
|
+
// tooltipY: am5.percent(10),
|
|
333
|
+
fill: color,
|
|
334
|
+
stroke: color // Set custom stroke color for the bars
|
|
335
|
+
});
|
|
336
|
+
series.bullets.push(() => {
|
|
337
|
+
return am5.Bullet.new(this.root, {
|
|
338
|
+
sprite: am5.Label.new(this.root, {
|
|
339
|
+
text: "{valueY.formatNumber('#.#')}%",
|
|
340
|
+
fill: this.root.interfaceColors.get("alternativeText"),
|
|
341
|
+
centerY: am5.p50,
|
|
342
|
+
centerX: am5.p50,
|
|
343
|
+
populateText: true,
|
|
344
|
+
fontSize: 12 // Reduce font size
|
|
345
|
+
})
|
|
346
|
+
});
|
|
347
|
+
});
|
|
348
|
+
series.appear();
|
|
349
|
+
}
|
|
350
|
+
createLineSeries(name, fieldName, xAxis, yAxis, color) {
|
|
351
|
+
const series = this.chart.series.push(am5xy.LineSeries.new(this.root, {
|
|
352
|
+
name: name,
|
|
353
|
+
xAxis: xAxis,
|
|
354
|
+
yAxis: yAxis,
|
|
355
|
+
valueYField: fieldName,
|
|
356
|
+
categoryXField: 'storeName',
|
|
357
|
+
tooltip: am5.Tooltip.new(this.root, {
|
|
358
|
+
pointerOrientation: "horizontal",
|
|
359
|
+
labelText: "{name}: {valueY.formatNumber('#.#')}%",
|
|
360
|
+
background: am5.Rectangle.new(this.root, {
|
|
361
|
+
fill: am5.color(0xffcc00) // Set the desired tooltip background color
|
|
362
|
+
})
|
|
363
|
+
})
|
|
364
|
+
}));
|
|
365
|
+
series.strokes.template.setAll({
|
|
366
|
+
strokeWidth: 2,
|
|
367
|
+
stroke: color,
|
|
368
|
+
templateField: "strokeSettings",
|
|
369
|
+
fontSize: 12 // Reduce font size
|
|
370
|
+
});
|
|
371
|
+
series.data.setAll(this.getFootfallTrendData);
|
|
372
|
+
// Adapter to apply custom stroke settings
|
|
373
|
+
series.strokes.template.adapters.add("stroke", (stroke, target) => {
|
|
374
|
+
const dataItem = target.dataItem;
|
|
375
|
+
if (dataItem && dataItem.dataContext && dataItem.dataContext.strokeSettings) {
|
|
376
|
+
return dataItem.dataContext.strokeSettings.stroke ?? stroke;
|
|
377
|
+
}
|
|
378
|
+
return stroke;
|
|
379
|
+
});
|
|
380
|
+
series.strokes.template.adapters.add("strokeWidth", (strokeWidth, target) => {
|
|
381
|
+
const dataItem = target.dataItem;
|
|
382
|
+
if (dataItem && dataItem.dataContext && dataItem.dataContext.strokeSettings) {
|
|
383
|
+
return dataItem.dataContext.strokeSettings.strokeWidth ?? strokeWidth;
|
|
384
|
+
}
|
|
385
|
+
return strokeWidth;
|
|
386
|
+
});
|
|
387
|
+
series.strokes.template.adapters.add("strokeDasharray", (strokeDasharray, target) => {
|
|
388
|
+
const dataItem = target.dataItem;
|
|
389
|
+
if (dataItem && dataItem.dataContext && dataItem.dataContext.strokeSettings) {
|
|
390
|
+
return dataItem.dataContext.strokeSettings.strokeDasharray ?? strokeDasharray;
|
|
391
|
+
}
|
|
392
|
+
return strokeDasharray;
|
|
393
|
+
});
|
|
394
|
+
series.bullets.push(() => {
|
|
395
|
+
return am5.Bullet.new(this.root, {
|
|
396
|
+
sprite: am5.Circle.new(this.root, {
|
|
397
|
+
strokeWidth: 1,
|
|
398
|
+
stroke: series.get("stroke"),
|
|
399
|
+
radius: 1,
|
|
400
|
+
fill: this.root.interfaceColors.get("background")
|
|
401
|
+
}),
|
|
402
|
+
});
|
|
403
|
+
});
|
|
404
|
+
series.appear();
|
|
405
|
+
}
|
|
406
|
+
changeStatus(type) {
|
|
407
|
+
this.typeValue = type;
|
|
408
|
+
}
|
|
409
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TrafficChartsComponent, deps: [{ token: i0.NgZone }, { token: i1.NgbModal }, { token: i2.TrafficService }, { token: i3.GlobalStateService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
410
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TrafficChartsComponent, selector: "lib-traffic-charts", host: { listeners: { "document:click": "onClick($event)" } }, viewQueries: [{ propertyName: "tooltipContainer", first: true, predicate: ["tooltipContainer"], descendants: true }], ngImport: i0, template: "<div class=\"card\">\r\n <div class=\"card-header border-0 pt-3\">\r\n <h3 class=\"card-title align-items-start flex-column\">\r\n <span class=\"card-label mb-2\">Footfall Trend</span>\r\n <span class=\"text-sub mb-2\">Based on 31 May, 2024\u2013 06 Jun, 2024</span>\r\n </h3>\r\n <div class=\"card-toolbar text-nowrap\">\r\n <div class=\"d-flex\">\r\n <div class=\"d-flex align-items-center position-relative my-1\">\r\n <!--begin::Nav group-->\r\n <div class=\"nav-group nav-group-outline border-1 btn-group p-0\">\r\n <button class=\"btn btn-outline\" [ngClass]=\"type === 'daily'? 'activePlanBtn':'inactivePlanBtn'\"\r\n (click)=\"selectPlan('daily')\">\r\n Daily\r\n </button>\r\n\r\n <button class=\"btn btn-outline px-6 py-3\"\r\n [ngClass]=\"type === 'week'? 'activePlanBtn':'inactivePlanBtn'\" (click)=\"selectPlan('week')\">\r\n Week\r\n </button>\r\n <button class=\"btn btn-outline px-6 py-3\"\r\n [ngClass]=\"type === 'month'? 'activePlanBtn':'inactivePlanBtn'\"\r\n (click)=\"selectPlan('month')\">\r\n Month\r\n </button>\r\n </div>\r\n <!--end::Nav group-->\r\n <div class=\"d-flex\">\r\n <span class=\"mx-2 mt-3\">Trend</span>\r\n\r\n <lib-reactive-select [formControl]=\"selectValue\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"datasets\" class=\"w-100\"></lib-reactive-select>\r\n <!-- <select class=\"form-select form-select-sm\" (change)=\"onDatasetChange($event)\">\r\n <option *ngFor=\"let dataset of datasets\" [value]=\"dataset.value\">{{ dataset.label }}\r\n </option>\r\n </select> -->\r\n </div>\r\n <div class=\"d-flex mt-1\">\r\n <span class=\"d-flex ms-3 cursor-pointer text-nowrap\">Forecast\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\r\n fill=\"none\">\r\n <g clip-path=\"url(#clip0_2645_27459)\">\r\n <path\r\n d=\"M3.33398 1.33331L3.46065 1.95998C3.55142 2.40998 3.75683 2.82893 4.05699 3.17628C4.35715 3.52362 4.74189 3.78759 5.17398 3.94265L5.33398 3.99998L5.17398 4.05731C4.74189 4.21237 4.35715 4.47634 4.05699 4.82368C3.75683 5.17103 3.55142 5.58998 3.46065 6.03998L3.33398 6.66665L3.20732 6.03998C3.11654 5.58998 2.91114 5.17103 2.61098 4.82368C2.31082 4.47634 1.92607 4.21237 1.49398 4.05731L1.33398 3.99998L1.49398 3.94265C1.92607 3.78759 2.31082 3.52362 2.61098 3.17628C2.91114 2.82893 3.11654 2.40998 3.20732 1.95998L3.33398 1.33331ZM5.33398 10.6666L5.48732 11.5173C5.52713 11.7392 5.62256 11.9474 5.76468 12.1224C5.9068 12.2974 6.09098 12.4335 6.29998 12.518L6.66732 12.6666L6.29998 12.8153C6.09094 12.8997 5.90668 13.0356 5.76445 13.2105C5.62221 13.3854 5.52663 13.5935 5.48665 13.8153L5.33398 14.6666L5.18065 13.816C5.14084 13.5941 5.04541 13.3859 4.90329 13.2109C4.76117 13.0359 4.57699 12.8998 4.36798 12.8153L4.00065 12.6666L4.36798 12.518C4.57703 12.4336 4.76129 12.2977 4.90352 12.1228C5.04576 11.9479 5.14133 11.7398 5.18132 11.518L5.33398 10.6666ZM10.6673 1.99998L11.038 3.76931C11.2269 4.67137 11.6463 5.50908 12.2554 6.20076C12.8645 6.89244 13.6424 7.41448 14.5133 7.71598L15.334 7.99998L14.5133 8.28398C13.6424 8.58548 12.8645 9.10752 12.2554 9.7992C11.6463 10.4909 11.2269 11.3286 11.038 12.2306L10.6673 14L10.2967 12.2306C10.1077 11.3286 9.6883 10.4909 9.07922 9.7992C8.47015 9.10752 7.69223 8.58548 6.82132 8.28398L6.00065 7.99998L6.82132 7.71598C7.69223 7.41448 8.47015 6.89244 9.07922 6.20076C9.6883 5.50908 10.1077 4.67137 10.2967 3.76931L10.6673 1.99998Z\"\r\n stroke=\"#344054\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_2645_27459\">\r\n <rect width=\"16\" height=\"16\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n\r\n <span class=\"form-check form-switch mx-6\">\r\n <input class=\"form-check-input cursor-pointer\" type=\"checkbox\">\r\n </span>\r\n\r\n </span>\r\n <span class=\"cursor-pointer dropdown1\">\r\n <span \r\n data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M5 10H15M2.5 5H17.5M7.5 15H12.5\" stroke=\"#344054\" stroke-width=\"1.66667\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n \r\n <ul class=\"dropdown-menu p-0\">\r\n <li><button class=\"dropdown-item\" [ngClass]=\"typeValue ==='normailze' ? 'bg-forcast':''\" type=\"button\"\r\n (click)=\"changeStatus('normailze')\">Normailze\r\n <svg class=\"text-end\" *ngIf=\"typeValue ==='normailze' ? 'bg-forcast':''\" xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M13.3327 4L5.99935 11.3333L2.66602 8\" stroke=\"#344054\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button></li>\r\n <li><button class=\"dropdown-item\" [ngClass]=\"typeValue ==='average' ? 'bg-forcast':''\" type=\"button\"\r\n (click)=\"changeStatus('average')\">Average\r\n <svg class=\"text-end\" *ngIf=\"typeValue ==='average' ? 'bg-forcast':''\" xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M13.3327 4L5.99935 11.3333L2.66602 8\" stroke=\"#344054\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button></li>\r\n <li><button class=\"dropdown-item\" [ngClass]=\"typeValue ==='target' ? 'bg-forcast':''\" type=\"button\"\r\n (click)=\"changeStatus('target')\">Target\r\n <svg class=\"text-end\" *ngIf=\"typeValue ==='target' ? 'bg-forcast':''\" xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M13.3327 4L5.99935 11.3333L2.66602 8\" stroke=\"#344054\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg></button></li>\r\n \r\n <li><button class=\"dropdown-item\" [ngClass]=\"typeValue ==='weekend' ? 'bg-forcast':''\" type=\"button\"\r\n (click)=\"changeStatus('weekend')\">Weekends\r\n <svg class=\"text-end\" *ngIf=\"typeValue ==='weekend' ? 'bg-forcast':''\" xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M13.3327 4L5.99935 11.3333L2.66602 8\" stroke=\"#344054\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg></button></li>\r\n \r\n <li><button class=\"dropdown-item\" [ngClass]=\"typeValue ==='weekdays' ? 'bg-forcast':''\" type=\"button\"\r\n (click)=\"changeStatus('weekdays')\">Weekdays\r\n <svg class=\"text-end\" *ngIf=\"typeValue ==='weekdays' ? 'bg-forcast':''\" xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M13.3327 4L5.99935 11.3333L2.66602 8\" stroke=\"#344054\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button></li>\r\n </ul>\r\n </span>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"card-body p-0\">\r\n <div class=\"text-center\" id=\"Footfalltrend\"></div>\r\n <div #tooltipContainer class=\"tooltip-container\" >\r\n <div class=\"tooltip-content\" *ngIf=\"tooltipData\">\r\n <div class=\"content p-5\">\r\n <div class=\"container\">\r\n <div class=\"title text-start\">{{tooltipData.storeName}}</div>\r\n </div>\r\n <div class=\"grid-container\">\r\n <div class=\"grid-item label\">Total Footfall</div>\r\n <div class=\"grid-item value\">100</div>\r\n <div class=\"grid-item label\">Bounced Footfall</div>\r\n <div class=\"grid-item value\">{{tooltipData.bounced}}</div>\r\n <div class=\"grid-item label\">Engagers</div>\r\n <div class=\"grid-item value\">{{tooltipData.engagers}}</div>\r\n <div class=\"grid-item label\">Avg Dwell Time</div>\r\n <div class=\"grid-item value\">34 Mins</div>\r\n <div class=\"grid-item label\">Conversion Rate</div>\r\n <div class=\"grid-item value\">{{tooltipData.conversion}}%</div>\r\n <div class=\"grid-item label\">Missed Opportunities</div>\r\n <div class=\"grid-item value\">{{tooltipData.missedopportunities}}</div>\r\n <div class=\"grid-item label\">Down Time</div>\r\n <div class=\"grid-item value\">23%</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex mx-3 my-2\">\r\n <span class=\"mx-3\"><svg width=\"36\" height=\"36\" viewBox=\"0 0 36 36\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"2\" y=\"2\" width=\"32\" height=\"32\" rx=\"16\" fill=\"#DAF1FF\"/>\r\n <rect x=\"2\" y=\"2\" width=\"32\" height=\"32\" rx=\"16\" stroke=\"#EAF8FF\" stroke-width=\"4\"/>\r\n <path d=\"M18.6667 11.3334L12 19.3334H18L17.3333 24.6667L24 16.6667H18L18.6667 11.3334Z\" stroke=\"#00A3FF\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg></span>\r\n <span class=\"mx-2 my-2\"><span class=\"text-week\">Weekend staffing lower than weekdays</span> <span class=\"text-cause ms-2\">cause potentially 20% fewer weekend conversions.</span></span>\r\n </div>\r\n </div>\r\n</div>", styles: ["#Footfalltrend{width:100%;height:500px}.activePlanBtn{border-radius:6px;background:var(--Primary-50, #EAF8FF);color:var(--Gray-700, #344054);font-size:14px!important;font-weight:500!important;line-height:20px}.inactivePlanBtn{color:var(--Gray-500, #667085)!important;font-size:14px;font-weight:500!important;line-height:20px}.text-week{color:#000;font-size:16px;font-style:normal;font-weight:700;line-height:24px}.text-cause{color:#000;font-size:16px;font-style:normal;font-weight:400;line-height:24px}.tooltip-content{font-size:12px}.tooltip-container{display:none;position:absolute;padding:8px;z-index:1;top:150px!important;border-radius:8px;background:var(--Primary-25, #ffffff)}.title{color:var(--Black, #101828);font-size:16px;font-style:normal;font-weight:600;line-height:24px}.grid-container{display:grid;grid-template-columns:1fr 1fr}.grid-item{padding:8px;border:0px solid #ddd;text-align:left;border-bottom:1px solid var(--Gray-200, #EAECF0)}.label{background-color:#fff;font-weight:700;color:var(--Gray-500, #667085);font-size:12px;font-style:normal;font-weight:500;line-height:18px;white-space:nowrap}.value{text-align:end;background-color:#fff;color:var(--Gray-900, #101828);font-size:12px;font-style:normal;font-weight:600;line-height:18px}.dropdown-item:hover,.dropdown-item:focus,.bg-forcast{color:var(--bs-dropdown-link-hover-color)!important;background:#eaf8ff!important}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i6.ReactiveSelectComponent, selector: "lib-reactive-select", inputs: ["idField", "nameField", "label", "data"] }] });
|
|
411
|
+
}
|
|
412
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TrafficChartsComponent, decorators: [{
|
|
413
|
+
type: Component,
|
|
414
|
+
args: [{ selector: 'lib-traffic-charts', template: "<div class=\"card\">\r\n <div class=\"card-header border-0 pt-3\">\r\n <h3 class=\"card-title align-items-start flex-column\">\r\n <span class=\"card-label mb-2\">Footfall Trend</span>\r\n <span class=\"text-sub mb-2\">Based on 31 May, 2024\u2013 06 Jun, 2024</span>\r\n </h3>\r\n <div class=\"card-toolbar text-nowrap\">\r\n <div class=\"d-flex\">\r\n <div class=\"d-flex align-items-center position-relative my-1\">\r\n <!--begin::Nav group-->\r\n <div class=\"nav-group nav-group-outline border-1 btn-group p-0\">\r\n <button class=\"btn btn-outline\" [ngClass]=\"type === 'daily'? 'activePlanBtn':'inactivePlanBtn'\"\r\n (click)=\"selectPlan('daily')\">\r\n Daily\r\n </button>\r\n\r\n <button class=\"btn btn-outline px-6 py-3\"\r\n [ngClass]=\"type === 'week'? 'activePlanBtn':'inactivePlanBtn'\" (click)=\"selectPlan('week')\">\r\n Week\r\n </button>\r\n <button class=\"btn btn-outline px-6 py-3\"\r\n [ngClass]=\"type === 'month'? 'activePlanBtn':'inactivePlanBtn'\"\r\n (click)=\"selectPlan('month')\">\r\n Month\r\n </button>\r\n </div>\r\n <!--end::Nav group-->\r\n <div class=\"d-flex\">\r\n <span class=\"mx-2 mt-3\">Trend</span>\r\n\r\n <lib-reactive-select [formControl]=\"selectValue\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"datasets\" class=\"w-100\"></lib-reactive-select>\r\n <!-- <select class=\"form-select form-select-sm\" (change)=\"onDatasetChange($event)\">\r\n <option *ngFor=\"let dataset of datasets\" [value]=\"dataset.value\">{{ dataset.label }}\r\n </option>\r\n </select> -->\r\n </div>\r\n <div class=\"d-flex mt-1\">\r\n <span class=\"d-flex ms-3 cursor-pointer text-nowrap\">Forecast\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"\r\n fill=\"none\">\r\n <g clip-path=\"url(#clip0_2645_27459)\">\r\n <path\r\n d=\"M3.33398 1.33331L3.46065 1.95998C3.55142 2.40998 3.75683 2.82893 4.05699 3.17628C4.35715 3.52362 4.74189 3.78759 5.17398 3.94265L5.33398 3.99998L5.17398 4.05731C4.74189 4.21237 4.35715 4.47634 4.05699 4.82368C3.75683 5.17103 3.55142 5.58998 3.46065 6.03998L3.33398 6.66665L3.20732 6.03998C3.11654 5.58998 2.91114 5.17103 2.61098 4.82368C2.31082 4.47634 1.92607 4.21237 1.49398 4.05731L1.33398 3.99998L1.49398 3.94265C1.92607 3.78759 2.31082 3.52362 2.61098 3.17628C2.91114 2.82893 3.11654 2.40998 3.20732 1.95998L3.33398 1.33331ZM5.33398 10.6666L5.48732 11.5173C5.52713 11.7392 5.62256 11.9474 5.76468 12.1224C5.9068 12.2974 6.09098 12.4335 6.29998 12.518L6.66732 12.6666L6.29998 12.8153C6.09094 12.8997 5.90668 13.0356 5.76445 13.2105C5.62221 13.3854 5.52663 13.5935 5.48665 13.8153L5.33398 14.6666L5.18065 13.816C5.14084 13.5941 5.04541 13.3859 4.90329 13.2109C4.76117 13.0359 4.57699 12.8998 4.36798 12.8153L4.00065 12.6666L4.36798 12.518C4.57703 12.4336 4.76129 12.2977 4.90352 12.1228C5.04576 11.9479 5.14133 11.7398 5.18132 11.518L5.33398 10.6666ZM10.6673 1.99998L11.038 3.76931C11.2269 4.67137 11.6463 5.50908 12.2554 6.20076C12.8645 6.89244 13.6424 7.41448 14.5133 7.71598L15.334 7.99998L14.5133 8.28398C13.6424 8.58548 12.8645 9.10752 12.2554 9.7992C11.6463 10.4909 11.2269 11.3286 11.038 12.2306L10.6673 14L10.2967 12.2306C10.1077 11.3286 9.6883 10.4909 9.07922 9.7992C8.47015 9.10752 7.69223 8.58548 6.82132 8.28398L6.00065 7.99998L6.82132 7.71598C7.69223 7.41448 8.47015 6.89244 9.07922 6.20076C9.6883 5.50908 10.1077 4.67137 10.2967 3.76931L10.6673 1.99998Z\"\r\n stroke=\"#344054\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_2645_27459\">\r\n <rect width=\"16\" height=\"16\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n\r\n <span class=\"form-check form-switch mx-6\">\r\n <input class=\"form-check-input cursor-pointer\" type=\"checkbox\">\r\n </span>\r\n\r\n </span>\r\n <span class=\"cursor-pointer dropdown1\">\r\n <span \r\n data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M5 10H15M2.5 5H17.5M7.5 15H12.5\" stroke=\"#344054\" stroke-width=\"1.66667\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n \r\n <ul class=\"dropdown-menu p-0\">\r\n <li><button class=\"dropdown-item\" [ngClass]=\"typeValue ==='normailze' ? 'bg-forcast':''\" type=\"button\"\r\n (click)=\"changeStatus('normailze')\">Normailze\r\n <svg class=\"text-end\" *ngIf=\"typeValue ==='normailze' ? 'bg-forcast':''\" xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M13.3327 4L5.99935 11.3333L2.66602 8\" stroke=\"#344054\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button></li>\r\n <li><button class=\"dropdown-item\" [ngClass]=\"typeValue ==='average' ? 'bg-forcast':''\" type=\"button\"\r\n (click)=\"changeStatus('average')\">Average\r\n <svg class=\"text-end\" *ngIf=\"typeValue ==='average' ? 'bg-forcast':''\" xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M13.3327 4L5.99935 11.3333L2.66602 8\" stroke=\"#344054\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button></li>\r\n <li><button class=\"dropdown-item\" [ngClass]=\"typeValue ==='target' ? 'bg-forcast':''\" type=\"button\"\r\n (click)=\"changeStatus('target')\">Target\r\n <svg class=\"text-end\" *ngIf=\"typeValue ==='target' ? 'bg-forcast':''\" xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M13.3327 4L5.99935 11.3333L2.66602 8\" stroke=\"#344054\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg></button></li>\r\n \r\n <li><button class=\"dropdown-item\" [ngClass]=\"typeValue ==='weekend' ? 'bg-forcast':''\" type=\"button\"\r\n (click)=\"changeStatus('weekend')\">Weekends\r\n <svg class=\"text-end\" *ngIf=\"typeValue ==='weekend' ? 'bg-forcast':''\" xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M13.3327 4L5.99935 11.3333L2.66602 8\" stroke=\"#344054\" stroke-width=\"1.5\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg></button></li>\r\n \r\n <li><button class=\"dropdown-item\" [ngClass]=\"typeValue ==='weekdays' ? 'bg-forcast':''\" type=\"button\"\r\n (click)=\"changeStatus('weekdays')\">Weekdays\r\n <svg class=\"text-end\" *ngIf=\"typeValue ==='weekdays' ? 'bg-forcast':''\" xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M13.3327 4L5.99935 11.3333L2.66602 8\" stroke=\"#344054\" stroke-width=\"1.5\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button></li>\r\n </ul>\r\n </span>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"card-body p-0\">\r\n <div class=\"text-center\" id=\"Footfalltrend\"></div>\r\n <div #tooltipContainer class=\"tooltip-container\" >\r\n <div class=\"tooltip-content\" *ngIf=\"tooltipData\">\r\n <div class=\"content p-5\">\r\n <div class=\"container\">\r\n <div class=\"title text-start\">{{tooltipData.storeName}}</div>\r\n </div>\r\n <div class=\"grid-container\">\r\n <div class=\"grid-item label\">Total Footfall</div>\r\n <div class=\"grid-item value\">100</div>\r\n <div class=\"grid-item label\">Bounced Footfall</div>\r\n <div class=\"grid-item value\">{{tooltipData.bounced}}</div>\r\n <div class=\"grid-item label\">Engagers</div>\r\n <div class=\"grid-item value\">{{tooltipData.engagers}}</div>\r\n <div class=\"grid-item label\">Avg Dwell Time</div>\r\n <div class=\"grid-item value\">34 Mins</div>\r\n <div class=\"grid-item label\">Conversion Rate</div>\r\n <div class=\"grid-item value\">{{tooltipData.conversion}}%</div>\r\n <div class=\"grid-item label\">Missed Opportunities</div>\r\n <div class=\"grid-item value\">{{tooltipData.missedopportunities}}</div>\r\n <div class=\"grid-item label\">Down Time</div>\r\n <div class=\"grid-item value\">23%</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex mx-3 my-2\">\r\n <span class=\"mx-3\"><svg width=\"36\" height=\"36\" viewBox=\"0 0 36 36\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"2\" y=\"2\" width=\"32\" height=\"32\" rx=\"16\" fill=\"#DAF1FF\"/>\r\n <rect x=\"2\" y=\"2\" width=\"32\" height=\"32\" rx=\"16\" stroke=\"#EAF8FF\" stroke-width=\"4\"/>\r\n <path d=\"M18.6667 11.3334L12 19.3334H18L17.3333 24.6667L24 16.6667H18L18.6667 11.3334Z\" stroke=\"#00A3FF\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg></span>\r\n <span class=\"mx-2 my-2\"><span class=\"text-week\">Weekend staffing lower than weekdays</span> <span class=\"text-cause ms-2\">cause potentially 20% fewer weekend conversions.</span></span>\r\n </div>\r\n </div>\r\n</div>", styles: ["#Footfalltrend{width:100%;height:500px}.activePlanBtn{border-radius:6px;background:var(--Primary-50, #EAF8FF);color:var(--Gray-700, #344054);font-size:14px!important;font-weight:500!important;line-height:20px}.inactivePlanBtn{color:var(--Gray-500, #667085)!important;font-size:14px;font-weight:500!important;line-height:20px}.text-week{color:#000;font-size:16px;font-style:normal;font-weight:700;line-height:24px}.text-cause{color:#000;font-size:16px;font-style:normal;font-weight:400;line-height:24px}.tooltip-content{font-size:12px}.tooltip-container{display:none;position:absolute;padding:8px;z-index:1;top:150px!important;border-radius:8px;background:var(--Primary-25, #ffffff)}.title{color:var(--Black, #101828);font-size:16px;font-style:normal;font-weight:600;line-height:24px}.grid-container{display:grid;grid-template-columns:1fr 1fr}.grid-item{padding:8px;border:0px solid #ddd;text-align:left;border-bottom:1px solid var(--Gray-200, #EAECF0)}.label{background-color:#fff;font-weight:700;color:var(--Gray-500, #667085);font-size:12px;font-style:normal;font-weight:500;line-height:18px;white-space:nowrap}.value{text-align:end;background-color:#fff;color:var(--Gray-900, #101828);font-size:12px;font-style:normal;font-weight:600;line-height:18px}.dropdown-item:hover,.dropdown-item:focus,.bg-forcast{color:var(--bs-dropdown-link-hover-color)!important;background:#eaf8ff!important}\n"] }]
|
|
415
|
+
}], ctorParameters: () => [{ type: i0.NgZone }, { type: i1.NgbModal }, { type: i2.TrafficService }, { type: i3.GlobalStateService }, { type: i0.ChangeDetectorRef }], propDecorators: { tooltipContainer: [{
|
|
416
|
+
type: ViewChild,
|
|
417
|
+
args: ['tooltipContainer']
|
|
418
|
+
}], onClick: [{
|
|
419
|
+
type: HostListener,
|
|
420
|
+
args: ['document:click', ['$event']]
|
|
421
|
+
}] } });
|
|
422
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhZmZpYy1jaGFydHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tYW5hbHlzZS10cmFmZmljL3NyYy9saWIvY29tcG9uZW50cy90cmFmZmljLWNoYXJ0cy90cmFmZmljLWNoYXJ0cy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1hbmFseXNlLXRyYWZmaWMvc3JjL2xpYi9jb21wb25lbnRzL3RyYWZmaWMtY2hhcnRzL3RyYWZmaWMtY2hhcnRzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUIsU0FBUyxFQUFjLFlBQVksRUFBMEMsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFJLE9BQU8sS0FBSyxHQUFHLE1BQU0scUJBQXFCLENBQUM7QUFDM0MsT0FBTyxLQUFLLEtBQUssTUFBTSx3QkFBd0IsQ0FBQztBQUNoRCxPQUFPLGtCQUFrQixNQUFNLHFDQUFxQyxDQUFDO0FBSXJFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3QyxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUxQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7O0FBTzlDLE1BQU0sT0FBTyxzQkFBc0I7SUE2RWI7SUFBcUI7SUFBK0I7SUFBZ0M7SUFDOUY7SUE3RVYsS0FBSyxDQUFNO0lBQ1gsSUFBSSxDQUFNO0lBQ1YsS0FBSyxDQUFNO0lBQ1gsS0FBSyxDQUFNO0lBQ1gsTUFBTSxDQUFNO0lBQ21CLGdCQUFnQixDQUE2QjtJQUM1RSxXQUFXLENBQU07SUFFakIsUUFBUSxHQUFHO1FBQ1QsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUU7UUFDeEMsRUFBRSxLQUFLLEVBQUUsa0JB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LEVBQUU7Z0JBQy9CLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO29CQUNoQyxXQUFXLEVBQUUsQ0FBQztvQkFDZCxNQUFNLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7b0JBQzVCLE1BQU0sRUFBRSxDQUFDO29CQUNULElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDO2lCQUNsRCxDQUFDO2FBRUgsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDbEIsQ0FBQztJQUdELFlBQVksQ0FBQyxJQUFRO1FBQ3ZCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO0lBQ3BCLENBQUM7d0dBamNVLHNCQUFzQjs0RkFBdEIsc0JBQXNCLDhPQ2xCbkMsZytZQXlKTTs7NEZEdklPLHNCQUFzQjtrQkFMbEMsU0FBUzsrQkFDRSxvQkFBb0I7Z01BVUMsZ0JBQWdCO3NCQUE5QyxTQUFTO3VCQUFDLGtCQUFrQjtnQkFtUjdCLE9BQU87c0JBRE4sWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgTmdab25lLCBPbkRlc3Ryb3ksIE9uSW5pdCwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgKiBhcyBhbTUgZnJvbSAnQGFtY2hhcnRzL2FtY2hhcnRzNSc7XHJcbmltcG9ydCAqIGFzIGFtNXh5IGZyb20gJ0BhbWNoYXJ0cy9hbWNoYXJ0czUveHknO1xyXG5pbXBvcnQgYW01dGhlbWVzX0FuaW1hdGVkIGZyb20gJ0BhbWNoYXJ0cy9hbWNoYXJ0czUvdGhlbWVzL0FuaW1hdGVkJztcclxuaW1wb3J0IHsgTmdiTW9kYWwgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XHJcbmltcG9ydCB7IENoYXJ0RGV0YWlsTW9kYWxDb21wb25lbnQgfSBmcm9tICcuLi9jaGFydC1kZXRhaWwtbW9kYWwvY2hhcnQtZGV0YWlsLW1vZGFsLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE5nYlRvb2x0aXAgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XHJcbmltcG9ydCB7IEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBUcmFmZmljU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RyYWZmaWMuc2VydmljZSc7XHJcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IEdsb2JhbFN0YXRlU2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1nbG9iYWwnO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi10cmFmZmljLWNoYXJ0cycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3RyYWZmaWMtY2hhcnRzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vdHJhZmZpYy1jaGFydHMuY29tcG9uZW50LnNjc3MnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUcmFmZmljQ2hhcnRzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LE9uRGVzdHJveSB7XHJcbiAgY2hhcnQ6IGFueTtcclxuICByb290OiBhbnk7XHJcbiAgeUF4aXM6IGFueTtcclxuICB4QXhpczogYW55O1xyXG4gIGxlZ2VuZDogYW55O1xyXG4gIEBWaWV3Q2hpbGQoJ3Rvb2x0aXBDb250YWluZXInKSB0b29sdGlwQ29udGFpbmVyOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcclxuICB0b29sdGlwRGF0YTogYW55O1xyXG5cclxuICBkYXRhc2V0cyA9IFtcclxuICAgIHsgdmFsdWU6ICdmb290ZmFsbCcsIGxhYmVsOiAnRm9vdGZhbGwnIH0sXHJcbiAgICB7IHZhbHVlOiAnYm91bmNlZCBmb290ZmFsbCcsIGxhYmVsOiAnQm91bmNlZCBGb290ZmFsbCcgfSxcclxuICAgIHsgdmFsdWU6ICdlbmdhZ2VycycsIGxhYmVsOiAnRW5nYWdlcnMnIH0sXHJcbiAgICB7IHZhbHVlOiAnbWlzc2VkIG9wcG9ydHVuaXR5JywgbGFiZWw6ICdNaXNzZWQgT3Bwb3J0dW5pdHknIH0sXHJcbiAgICB7IHZhbHVlOiAncG90ZW50aWFsIGJ1eWVyJywgbGFiZWw6ICdQb3RlbnRpYWwgQnV5ZXInIH0sXHJcbiAgICB7IHZhbHVlOiAnY29udmVyc2lvbicsIGxhYmVsOiAnQ29udmVyc2lvbicgfVxyXG4gIF07XHJcblxyXG4gIC8vIGRhdGEgPSB7XHJcbiAgLy8gICBkYXRhc2V0MTogW1xyXG4gIC8vICAgICB7IHllYXI6ICdTdG9yZS0xJywgZW5nYWdlcnM6IDEwLCBib3VuY2VkOiA4LCBiaWxsYWJsZTogNSwgbWlzc2VkT3Bwb3J0dW5pdHk6IDMsIGNvbnZlcnNpb246IDIsIGV4cGVuc2VzOiAyMCB9LFxyXG4gIC8vICAgICB7IHllYXI6ICcyMDEzJywgZW5nYWdlcnM6IDE1LCBib3VuY2VkOiAxMCwgYmlsbGFibGU6IDcsIG1pc3NlZE9wcG9ydHVuaXR5OiA0LCBjb252ZXJzaW9uOiAzLCBleHBlbnNlczogMjUgfSxcclxuICAvLyAgICAgeyB5ZWFyOiAnMjAxNCcsIGVuZ2FnZXJzOiAyMCwgYm91bmNlZDogMTIsIGJpbGxhYmxlOiA5LCBtaXNzZWRPcHBvcnR1bml0eTogNSwgY29udmVyc2lvbjogNCwgZXhwZW5zZXM6IDEwIH0sXHJcbiAgLy8gICAgIHsgeWVhcjogJzIwMTUnLCBlbmdhZ2VyczogMjUsIGJvdW5jZWQ6IDE1LCBiaWxsYWJsZTogMTAsIG1pc3NlZE9wcG9ydHVuaXR5OiA2LCBjb252ZXJzaW9uOiA1LCBleHBlbnNlczogMzUgfSxcclxuICAvLyAgICAgeyB5ZWFyOiAnMjAxNicsIGVuZ2FnZXJzOiAxMCwgYm91bmNlZDogOCwgYmlsbGFibGU6IDUsIG1pc3NlZE9wcG9ydHVuaXR5OiAzLCBjb252ZXJzaW9uOiAyLCBleHBlbnNlczogMjAgfSxcclxuICAvLyAgICAgeyB5ZWFyOiAnMjAxNycsIGVuZ2FnZXJzOiAxNSwgYm91bmNlZDogMTAsIGJpbGxhYmxlOiA3LCBtaXNzZWRPcHBvcnR1bml0eTogNCwgY29udmVyc2lvbjogMywgZXhwZW5zZXM6IDI1IH0sXHJcbiAgLy8gICAgIHsgeWVhcjogJzIwMTgnLCBlbmdhZ2VyczogMjAsIGJvdW5jZWQ6IDEyLCBiaWxsYWJsZTogOSwgbWlzc2VkT3Bwb3J0dW5pdHk6IDUsIGNvbnZlcnNpb246IDQsIGV4cGVuc2VzOiAxMCB9LFxyXG4gIC8vICAgICB7IHllYXI6ICcyMDE5JywgZW5nYWdlcnM6IDI1LCBib3VuY2VkOiAxNSwgYmlsbGFibGU6IDEwLCBtaXNzZWRPcHBvcnR1bml0eTogNiwgY29udmVyc2lvbjogNSwgZXhwZW5zZXM6IDM1IH0sXHJcbiAgLy8gICAgIHsgeWVhcjogJzIwMjAnLCBlbmdhZ2VyczogMzAsIGJvdW5jZWQ6IDE4LCBiaWxsYWJsZTogMTIsIG1pc3NlZE9wcG9ydHVuaXR5OiA3LCBjb252ZXJzaW9uOiA2LCBleHBlbnNlczogMTAgfSxcclxuICAvLyAgICAgeyB5ZWFyOiAnMjAyMScsIGVuZ2FnZXJzOiAyLCBib3VuY2VkOiAxMiwgYmlsbGFibGU6IDE5LCBtaXNzZWRPcHBvcnR1bml0eTogNCwgY29udmVyc2lvbjogMTQsIGV4cGVuc2VzOiAxMCB9LFxyXG4gIC8vICAgICB7IHllYXI6ICcyMDIyJywgZW5nYWdlcnM6IDUsIGJvdW5jZWQ6IDI1LCBiaWxsYWJsZTogMywgbWlzc2VkT3Bwb3J0dW5pdHk6IDYsIGNvbnZlcnNpb246IDUsIGV4cGVuc2VzOiA1LGNvbHVtblNldHRpbmdzOiB7XHJcbiAgLy8gICAgICAgZmlsbE9wYWNpdHk6IDAuNSxcclxuICAvLyAgICAgICBzdHJva2VXaWR0aDogMixcclxuICAvLyAgICAgICBzdHJva2VEYXNoYXJyYXk6IFs1LCA1XVxyXG4gIC8vICAgICB9LFxyXG4gIC8vICAgICBzdHJva2VTZXR0aW5nczoge1xyXG4gIC8vICAgICAgIHN0cm9rZTogYW01LmNvbG9yKDB4ZmYwMDAwKSxcclxuICAvLyAgICAgICBzdHJva2VXaWR0aDogMixcclxuICAvLyAgICAgICBzdHJva2VEYXNoYXJyYXk6IFs1LCA1XVxyXG4gIC8vICAgICB9IH0sXHJcbiAgLy8gICAgIHsgeWVhcjogJzIwMjMnLCBlbmdhZ2VyczogMTMsIGJvdW5jZWQ6IDgsIGJpbGxhYmxlOiAxMiwgbWlzc2VkT3Bwb3J0dW5pdHk6IDcsIGNvbnZlcnNpb246IDYsIGV4cGVuc2VzOiAxMCwgY29sdW1uU2V0dGluZ3M6IHtcclxuICAvLyAgICAgICBmaWxsT3BhY2l0eTogMC4zLFxyXG4gIC8vICAgICAgIHN0cm9rZVdpZHRoOiAxLFxyXG4gIC8vICAgICAgIHN0cm9rZURhc2hhcnJheTogWzMsIDNdXHJcbiAgLy8gICAgIH0sIH0sXHJcbiAgLy8gICAgIHsgeWVhcjogJzIwMjQnLCBlbmdhZ2VyczogMTcsIGJvdW5jZWQ6IDE4LCBiaWxsYWJsZTogMTIsIG1pc3NlZE9wcG9ydHVuaXR5OiA3LCBjb252ZXJzaW9uOiAxNiwgZXhwZW5zZXM6IDMwLCBjb2x1bW5TZXR0aW5nczoge1xyXG4gIC8vICAgICAgIGZpbGxPcGFjaXR5OiAwLjMsXHJcbiAgLy8gICAgICAgc3Ryb2tlV2lkdGg6IDEsXHJcbiAgLy8gICAgICAgc3Ryb2tlRGFzaGFycmF5OiBbMywgM11cclxuICAvLyAgICAgfSwgfVxyXG4gIC8vICAgXSxcclxuICAvLyAgIGRhdGFzZXQyOiBbXHJcbiAgLy8gICAgIHsgeWVhcjogJzIwMTYnLCBlbmdhZ2VyczogNSwgYm91bmNlZDogNCwgYmlsbGFibGU6IDMsIG1pc3NlZE9wcG9ydHVuaXR5OiAyLCBjb252ZXJzaW9uOiAxLCBleHBlbnNlczogMTAsIH0sXHJcbiAgLy8gICAgIHsgeWVhcjogJzIwMTcnLCBlbmdhZ2VyczogOCwgYm91bmNlZDogNiwgYmlsbGFibGU6IDUsIG1pc3NlZE9wcG9ydHVuaXR5OiAzLCBjb252ZXJzaW9uOiAyLCBleHBlbnNlczogMTUgfSxcclxuICAvLyAgICAgeyB5ZWFyOiAnMjAxOCcsIGVuZ2FnZXJzOiAxMCwgYm91bmNlZDogOCwgYmlsbGFibGU6IDYsIG1pc3NlZE9wcG9ydHVuaXR5OiA0LCBjb252ZXJzaW9uOiAzLCBleHBlbnNlczogMjAgfSxcclxuICAvLyAgICAgeyB5ZWFyOiAnMjAxOScsIGVuZ2FnZXJzOiAxMiwgYm91bmNlZDogMTAsIGJpbGxhYmxlOiA4LCBtaXNzZWRPcHBvcnR1bml0eTogNSwgY29udmVyc2lvbjogNCwgZXhwZW5zZXM6IDI1IH0sXHJcbiAgLy8gICAgIHsgeWVhcjogJzIwMjAnLCBlbmdhZ2VyczogMTUsIGJvdW5jZWQ6IDEyLCBiaWxsYWJsZTogMTAsIG1pc3NlZE9wcG9ydHVuaXR5OiA2LCBjb252ZXJzaW9uOiA1LCBleHBlbnNlczogMzAgfVxyXG4gIC8vICAgXSxcclxuICAvLyAgIGRhdGFzZXQzOiBbXHJcbiAgLy8gICAgIHsgeWVhcjogJzIwMTYnLCBlbmdhZ2VyczogMTIsIGJvdW5jZWQ6IDExLCBiaWxsYWJsZTogOCwgbWlzc2VkT3Bwb3J0dW5pdHk6IDcsIGNvbnZlcnNpb246IDYsIGV4cGVuc2VzOiAxOCB9LFxyXG4gIC8vICAgICB7IHllYXI6ICcyMDE3JywgZW5nYWdlcnM6IDE0LCBib3VuY2VkOiAxMywgYmlsbGFibGU6IDEwLCBtaXNzZWRPcHBvcnR1bml0eTogOSwgY29udmVyc2lvbjogOCwgZXhwZW5zZXM6IDIyIH0sXHJcbiAgLy8gICAgIHsgeWVhcjogJzIwMTgnLCBlbmdhZ2VyczogMTgsIGJvdW5jZWQ6IDE1LCBiaWxsYWJsZTogMTIsIG1pc3NlZE9wcG9ydHVuaXR5OiAxMSwgY29udmVyc2lvbjogMTAsIGV4cGVuc2VzOiAyNyB9LFxyXG4gIC8vICAgICB7IHllYXI6ICcyMDE5JywgZW5nYWdlcnM6IDIwLCBib3VuY2VkOiAxOCwgYmlsbGFibGU6IDE1LCBtaXNzZWRPcHBvcnR1bml0eTogMTIsIGNvbnZlcnNpb246IDExLCBleHBlbnNlczogMzIgfSxcclxuICAvLyAgICAgeyB5ZWFyOiAnMjAyMCcsIGVuZ2FnZXJzOiAyMiwgYm91bmNlZDogMjAsIGJpbGxhYmxlOiAxNywgbWlzc2VkT3Bwb3J0dW5pdHk6IDE0LCBjb252ZXJzaW9uOiAxMiwgZXhwZW5zZXM6IDM3IH1cclxuICAvLyAgIF1cclxuICAvLyB9O1xyXG4gIHR5cGU6IGFueSA9IFwiZGFpbHlcIjtcclxuICAvLyBjdXJyZW50RGF0YSA9IHRoaXMuZGF0YS5kYXRhc2V0MTtcclxuICBwcml2YXRlIHNoYXJlZFRvb2x0aXA6IGFtNS5Ub29sdGlwO1xyXG4gIHNlbGVjdFZhbHVlPSBuZXcgRm9ybUNvbnRyb2woXCJkYXRhc2V0MVwiKTtcclxuICBwcml2YXRlIGNsaWNrTGlzdGVuZXI6ICgpID0+IHZvaWQ7XHJcbiAgb2JqRGF0YTogYW55O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xyXG4gIGdldEZvb3RmYWxsVHJlbmREYXRhOiBhbnk7XHJcbiAgcHJvY2Vzc1R5cGU9XCJmb290ZmFsbFwiXHJcbiAgdHlwZVZhbHVlOiBhbnk7XHJcbiAgaGVhZGVyRGF0YTogYW55O1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgem9uZTogTmdab25lLHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBOZ2JNb2RhbCxwcml2YXRlIHNlcnZpY2U6IFRyYWZmaWNTZXJ2aWNlLCBwdWJsaWMgZ3M6IEdsb2JhbFN0YXRlU2VydmljZSxcclxuICAgIHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmKSB7fVxyXG4gICAgb2Zmc2V0OiBudW1iZXIgPSAxO1xyXG4gICAgbGltaXQ6IG51bWJlciA9IDEwO1xyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCksIGRlYm91bmNlVGltZSgzMDApKVxyXG4gICAgICAuc3Vic2NyaWJlKChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMuaGVhZGVyRGF0YSA9IGRhdGE7XHJcbiAgICAgICAgICB0aGlzLm9iakRhdGEgPSB7XHJcbiAgICAgICAgICAgIGZyb21EYXRlOiB0aGlzLmhlYWRlckRhdGEuZGF0ZS5zdGFydERhdGUsXHJcbiAgICAgICAgICAgIHRvRGF0ZTogdGhpcy5oZWFkZXJEYXRhLmRhdGUuZW5kRGF0ZSxcclxuICAgICAgICAgICAgc3RvcmVJZDogIGRhdGEuc3RvcmVzLmZpbHRlcigoc3RvcmU6YW55KSA9PiBzdG9yZS5jaGVja2VkKS5tYXAoKHN0b3JlOmFueSkgPT4gc3RvcmUuc3RvcmVJZCksXHJcbiAgICAgICAgICAgIGNsaWVudElkOmRhdGEuY2xpZW50LFxyXG4gICAgICAgICAgICBwcm9jZXNzVHlwZTogdGhpcy5wcm9jZXNzVHlwZSxcclxuICAgICAgICAgICAgZmlsdGVyQnk6dGhpcy5wcm9jZXNzVHlwZSxcclxuICAgICAgICAgICAgbGltaXQ6dGhpcy5saW1pdCxcclxuICAgICAgICAgICAgb2Zmc2V0OnRoaXMub2Zmc2V0XHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgdGhpcy5mb290ZmFsbFRyZW5kKCk7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdFZhbHVlLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5vbkRhdGFzZXRDaGFuZ2UodmFsdWUpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICAvLyB0aGlzLm9uRGF0YXNldENoYW5nZSh0aGlzLnNlbGVjdFZhbHVlLnZhbHVlKTtcclxuICAgICAgICBcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnJvb3QpIHtcclxuICAgICAgdGhpcy5yb290LmRpc3Bvc2UoKTtcclxuICAgIH1cclxuICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICB9XHJcblxyXG4gIGZvb3RmYWxsVHJlbmQoKXsgIFxyXG4gICAgdGhpcy5zZXJ2aWNlXHJcbiAgICAuZ2V0Zm9vdGZhbGxUcmVuZCh0aGlzLm9iakRhdGEpXHJcbiAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICA/LnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXMgJiYgcmVzLmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgdGhpcy5nZXRGb290ZmFsbFRyZW5kRGF0YSA9IHJlcz8uZGF0YS5mb290ZmFsbFRyZW5kRGF0YTtcclxuICAgICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpOyBcclxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5jcmVhdGVDaGFydCgpLCAwKTsgLy8gQ2FsbCB3aXRoIGEgZGVsYXkgdG8gZW5zdXJlIHRoZSBlbGVtZW50IGlzIGluIHRoZSBET01cclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfSxcclxuICAgICAgY29tcGxldGU6ICgpID0+IHt9LFxyXG4gICAgfSk7XHJcbiAgICBcclxuICB9XHJcbiAgc2VsZWN0UGxhbih0eXBlOiBhbnkpIHtcclxuICAgIHRoaXMudHlwZSA9IHR5cGU7XHJcbiAgICAvLyB0aGlzLmN1cnJlbnREYXRhID0gdGhpcy5kYXRhLmRhdGFzZXQyO1xyXG4gICAgdGhpcy51cGRhdGVDaGFydERhdGEoKTtcclxuICB9XHJcblxyXG4gIGNyZWF0ZUNoYXJ0KCkge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGNoYXJ0RGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJGb290ZmFsbHRyZW5kXCIpO1xyXG4gICAgICBpZiAoIWNoYXJ0RGl2KSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkNvdWxkIG5vdCBmaW5kIEhUTUwgZWxlbWVudCB3aXRoIGlkIGBGb290ZmFsbHRyZW5kYFwiKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMucm9vdCkge1xyXG4gICAgICAgIHRoaXMucm9vdC5kaXNwb3NlKCk7XHJcbiAgICAgIH1cclxuICAgIHRoaXMucm9vdCA9IGFtNS5Sb290Lm5ldygnRm9vdGZhbGx0cmVuZCcpO1xyXG4gICAgdGhpcy5yb290LnNldFRoZW1lcyhbYW01dGhlbWVzX0FuaW1hdGVkLm5ldyh0aGlzLnJvb3QpXSk7XHJcblxyXG4gICAgdGhpcy5jaGFydCA9IHRoaXMucm9vdC5jb250YWluZXIuY2hpbGRyZW4ucHVzaChcclxuICAgICAgYW01eHkuWFlDaGFydC5uZXcodGhpcy5yb290LCB7XHJcbiAgICAgICAgcGFuWDogZmFsc2UsXHJcbiAgICAgICAgcGFuWTogZmFsc2UsXHJcbiAgICAgICAgd2hlZWxYOiAncGFuWCcsXHJcbiAgICAgICAgd2hlZWxZOiAnem9vbVgnLFxyXG4gICAgICAgIGxheW91dDogdGhpcy5yb290LnZlcnRpY2FsTGF5b3V0XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuY2hhcnQuc2V0KFwic2Nyb2xsYmFyWFwiLCBhbTUuU2Nyb2xsYmFyLm5ldyh0aGlzLnJvb3QsIHtcclxuICAgICAgb3JpZW50YXRpb246IFwiaG9yaXpvbnRhbFwiXHJcbiAgICB9KSk7XHJcblxyXG4gICAgY29uc3QgeEF4aXMgPSB0aGlzLmNoYXJ0LnhBeGVzLnB1c2goXHJcbiAgICAgIGFtNXh5LkNhdGVnb3J5QXhpcy5uZXcodGhpcy5yb290LCB7XHJcbiAgICAgICAgY2F0ZWdvcnlGaWVsZDogJ3N0b3JlTmFtZScsXHJcbiAgICAgICAgcmVuZGVyZXI6IGFtNXh5LkF4aXNSZW5kZXJlclgubmV3KHRoaXMucm9vdCwge1xyXG4gICAgICAgICAgbWluR3JpZERpc3RhbmNlOiAzMFxyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHRvb2x0aXA6IGFtNS5Ub29sdGlwLm5ldyh0aGlzLnJvb3QsIHt9KVxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICAgIHRoaXMuZ2V0Rm9vdGZhbGxUcmVuZERhdGEgPSB0aGlzLmdldEZvb3RmYWxsVHJlbmREYXRhPy5tYXAoXHJcbiAgICAgIChpdGVtOiBhbnkpID0+ICh7XHJcbiAgICAgICAgc3RvcmVOYW1lOiBpdGVtLnN0b3JlTmFtZSxcclxuICAgICAgICBmb290ZmFsbDogTnVtYmVyKGl0ZW0uZm9vdGZhbGxSYXRlKSxcclxuICAgICAgICBjb252ZXJzaW9uOiBOdW1iZXIoaXRlbS5jb252ZXJzaW9uUmF0ZSksXHJcbiAgICAgICAgYm91bmNlZDogTnVtYmVyKGl0ZW0uYm91bmNlZFJhdGUpLFxyXG4gICAgICAgIGVuZ2FnZXJzOiBOdW1iZXIoaXRlbS5lbmdhZ2Vyc1JhdGUpLFxyXG4gICAgICAgIG1pc3NlZG9wcG9ydHVuaXRpZXM6IE51bWJlcihpdGVtLm1pc3NlZG9wcG9ydHVuaXRpZXNSYXRlKSxcclxuICAgICAgICBhdmdEb3duVGltZTogTnVtYmVyKGl0ZW0uYXZnRG93blRpbWUpLFxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICAgIHhBeGlzLmRhdGEuc2V0QWxsKHRoaXMuZ2V0Rm9vdGZhbGxUcmVuZERhdGEpO1xyXG5cclxuICAgIGNvbnN0IHlBeGlzID0gdGhpcy5jaGFydC55QXhlcy5wdXNoKFxyXG4gICAgICBhbTV4eS5WYWx1ZUF4aXMubmV3KHRoaXMucm9vdCwge1xyXG4gICAgICAgIHJlbmRlcmVyOiBhbTV4eS5BeGlzUmVuZGVyZXJZLm5ldyh0aGlzLnJvb3QsIHt9KVxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgICAvLyBTZXQgdGhlIHRpdGxlIG9mIHRoZSB5LWF4aXNcclxuICAgIHlBeGlzLmNoaWxkcmVuLnVuc2hpZnQoYW01LkxhYmVsLm5ldyh0aGlzLnJvb3QsIHtcclxuICAgICAgcm90YXRpb246IC05MCxcclxuICAgICAgdGV4dDogJ0Zvb3RmYWxsJyxcclxuICAgICAgeTogYW01LnA1MCxcclxuICAgICAgY2VudGVyWDogYW01LnA1MFxyXG4gICAgfSkpO1xyXG5cclxuICAgIHRoaXMuY3JlYXRlQ29sdW1uU2VyaWVzKCdFbmdhZ2VycycsICdlbmdhZ2VycycsIHhBeGlzLCB5QXhpcywgZmFsc2UsIGFtNS5jb2xvcigweEIzRTNGRikpO1xyXG4gICAgdGhpcy5jcmVhdGVDb2x1bW5TZXJpZXMoJ0JvdW5jZWQnLCAnYm91bmNlZCcsIHhBeGlzLCB5QXhpcywgdHJ1ZSwgYW01LmNvbG9yKDB4ODBEMUZGKSk7XHJcbiAgICB0aGlzLmNyZWF0ZUNvbHVtblNlcmllcygnQmlsbGFibGUnLCAnZm9vdGZhbGwnLCB4QXhpcywgeUF4aXMsIHRydWUsIGFtNS5jb2xvcigweDY2QzhGRikpO1xyXG4gICAgdGhpcy5jcmVhdGVDb2x1bW5TZXJpZXMoJ01pc3NlZCBPcHBvcnR1bml0eScsICdtaXNzZWRvcHBvcnR1bml0aWVzJywgeEF4aXMsIHlBeGlzLCB0cnVlLCBhbTUuY29sb3IoMHg0REJGRkYpKTtcclxuICAgIHRoaXMuY3JlYXRlQ29sdW1uU2VyaWVzKCdDb252ZXJzaW9uJywgJ2NvbnZlcnNpb24nLCB4QXhpcywgeUF4aXMsIHRydWUsIGFtNS5jb2xvcigweDMzQjVGRikpO1xyXG4gICAgdGhpcy5jcmVhdGVMaW5lU2VyaWVzKCdFeHBlbnNlcycsICdhdmdEb3duVGltZScsIHhBeGlzLCB5QXhpcywgYW01LmNvbG9yKDB4MzNCNUZGKSk7XHJcblxyXG4gICAgY29uc3QgbGVnZW5kID0gdGhpcy5jaGFydC5jaGlsZHJlbi5wdXNoKFxyXG4gICAgICBhbTUuTGVnZW5kLm5ldyh0aGlzLnJvb3QsIHtcclxuICAgICAgICBjZW50ZXJYOiBhbTUucDUwLFxyXG4gICAgICAgIHg6IGFtNS5wNTBcclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gICAgbGVnZW5kLmRhdGEuc2V0QWxsKHRoaXMuY2hhcnQuc2VyaWVzLnZhbHVlcyk7XHJcblxyXG4gICAgdGhpcy5jaGFydC5zZXQoJ2N1cnNvcicsIGFtNXh5LlhZQ3Vyc29yLm5ldyh0aGlzLnJvb3QsIHtcclxuICAgICAgYmVoYXZpb3I6ICdub25lJ1xyXG4gICAgfSkpO1xyXG5cclxuICAgIHRoaXMuY2hhcnQuc2VyaWVzLmVhY2goKHNlcmllczogYW55KSA9PiB7XHJcbiAgICAgIGlmIChzZXJpZXMuY29sdW1ucykge1xyXG4gICAgICAgIHNlcmllcy5jb2x1bW5zLnRlbXBsYXRlLnNldChcImludGVyYWN0aXZlXCIsIHRydWUpO1xyXG4gICAgICAgIHNlcmllcy5jb2x1bW5zLnRlbXBsYXRlLmV2ZW50cy5vbihcImNsaWNrXCIsIChldjogYW55KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBkYXRhID0gZXYudGFyZ2V0LmRhdGFJdGVtLmRhdGFDb250ZXh0O1xyXG4gICAgICAgICAgY29uc3QgeyBjbGllbnRYLCBjbGllbnRZIH0gPSBldi5vcmlnaW5hbEV2ZW50O1xyXG4gICAgICAgICAgdGhpcy5zaG93VG9vbHRpcChkYXRhLCBjbGllbnRYLCBjbGllbnRZKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmNoYXJ0LmFwcGVhcigxMDAwLCAxMDApO1xyXG4gIH0sMClcclxuICB9XHJcblxyXG4gIHRvb2x0aXBWaXNpYmxlID0gZmFsc2U7XHJcbiAgc2hvd1Rvb2x0aXAoZGF0YTogYW55LCB4OiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy50b29sdGlwVmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgdGhpcy50b29sdGlwRGF0YSA9IGRhdGE7XHJcbiAgICBjb25zdCB0b29sdGlwRWxlbWVudCA9IHRoaXMudG9vbHRpcENvbnRhaW5lci5uYXRpdmVFbGVtZW50O1xyXG4gIFxyXG4gICAgLy8gU2V0IHRvb2x0aXAgY29udGVudCBhbmQgbWFrZSBpdCB2aXNpYmxlIHRvIGNhbGN1bGF0ZSBkaW1lbnNpb25zXHJcbiAgICB0b29sdGlwRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgIHRvb2x0aXBFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJzsgLy8gTWFrZSBpdCBpbnZpc2libGUgYnV0IHN0aWxsIHByZXNlbnQgaW4gdGhlIERPTVxyXG4gIFxyXG4gICAgLy8gRm9yY2UgYSByZWZsb3cgdG8gZW5zdXJlIGRpbWVuc2lvbnMgYXJlIHVwLXRvLWRhdGVcclxuICAgIHRvb2x0aXBFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcclxuICAgIFxyXG4gICAgLy8gV2FpdCBmb3IgdGhlIG5leHQgZXZlbnQgbG9vcCB0byBnZXQgYWNjdXJhdGUgZGltZW5zaW9uc1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGNvbnN0IHRvb2x0aXBXaWR0aCA9IHRvb2x0aXBFbGVtZW50Lm9mZnNldFdpZHRoO1xyXG4gICAgICBjb25zdCB0b29sdGlwSGVpZ2h0ID0gdG9vbHRpcEVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xyXG4gICAgICBjb25zdCBzY3JlZW5XaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xyXG4gICAgICBjb25zdCBzY3JlZW5IZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XHJcbiAgXHJcbiAgICAgIC8vIENhbGN1bGF0ZSBpZiB0aGVyZSBpcyBlbm91Z2ggc3BhY2Ugb24gdGhlIHJpZ2h0IHNpZGUsIG90aGVyd2lzZSBwbGFjZSBpdCBvbiB0aGUgbGVmdFxyXG4gICAgICBpZiAoeCArIHRvb2x0aXBXaWR0aCA+IHNjcmVlbldpZHRoKSB7XHJcbiAgICAgICAgdG9vbHRpcEVsZW1lbnQuc3R5bGUubGVmdCA9IGAke3ggLSB0b29sdGlwV2lkdGh9cHhgO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRvb2x0aXBFbGVtZW50LnN0eWxlLmxlZnQgPSBgJHt4fXB4YDtcclxuICAgICAgfVxyXG4gIFxyXG4gICAgICAvLyBDYWxjdWxhdGUgaWYgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIGF0IHRoZSBib3R0b20sIG90aGVyd2lzZSBwbGFjZSBpdCBhdCB0aGUgdG9wXHJcbiAgICAgIGlmICh5ICsgdG9vbHRpcEhlaWdodCA+IHNjcmVlbkhlaWdodCkge1xyXG4gICAgICAgIHRvb2x0aXBFbGVtZW50LnN0eWxlLnRvcCA9IGAke3kgLSB0b29sdGlwSGVpZ2h0fXB4YDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0b29sdGlwRWxlbWVudC5zdHlsZS50b3AgPSBgJHt5fXB4YDtcclxuICAgICAgfVxyXG4gIFxyXG4gICAgICB0b29sdGlwRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnOyAvLyBNYWtlIGl0IHZpc2libGUgYWdhaW5cclxuICAgICAgdGhpcy50b29sdGlwVmlzaWJsZSA9IHRydWU7XHJcbiAgICB9LCAwKTtcclxuICB9XHJcblxyXG4gIGhpZGVUb29sdGlwKCk6IHZvaWQge1xyXG4gICAgdGhpcy50b29sdGlwVmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgY29uc3QgdG9vbHRpcEVsZW1lbnQgPSB0aGlzLnRvb2x0aXBDb250YWluZXIubmF0aXZlRWxlbWVudDtcclxuICAgIHRvb2x0aXBFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXHJcbiAgb25DbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgdG9vbHRpcEVsZW1lbnQgPSB0aGlzLnRvb2x0aXBDb250YWluZXIubmF0aXZlRWxlbWVudDtcclxuXHJcbiAgICAvLyBDaGVjayBpZiB0aGUgY2xpY2sgd2FzIG91dHNpZGUgdGhlIHRvb2x0aXBcclxuICAgIGlmICh0b29sdGlwRWxlbWVudCAmJiAhdG9vbHRpcEVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0IGFzIE5vZGUpICYmIHRoaXMudG9vbHRpcFZpc2libGUpIHtcclxuICAgICAgdGhpcy5oaWRlVG9vbHRpcCgpO1xyXG4gICAgfVxyXG4gIH1cclxuICBcclxuICBcclxuICBcclxuICAvLyBvcGVuTW9kYWwoZGF0YTogYW55LGNsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyKSB7XHJcbiAgLy8gICBjb25zdCBtb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oQ2hhcnREZXRhaWxNb2RhbENvbXBvbmVudCx7XHJcbiAgLy8gICAgIGNlbnRlcmVkOiB0cnVlLFxyXG4gIC8vICAgICB3aW5kb3dDbGFzczogJ2N1c3RvbS1tb2RhbCcsXHJcbiAgLy8gICAgIHNpemU6IFwic21cIixcclxuICAvLyAgIH0pO1xyXG4gIC8vICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuZGF0YSA9IGRhdGE7XHJcbiAgLy8gICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5jbGllbnRYID0gY2xpZW50WDtcclxuICAvLyAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmNsaWVudFkgPSBjbGllbnRZO1xyXG4gIC8vIH1cclxuICBcclxuXHJcbiAgb25EYXRhc2V0Q2hhbmdlKHNlbGVjdGVkVmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgLy8gY29uc3Qgc2VsZWN0ZWREYXRhc2V0ID0gc2VsZWN0ZWRWYWx1ZSBhcyBrZXlvZiBEYXRhc2V0O1xyXG4gICAgLy8gdGhpcy5jdXJyZW50RGF0YSA9IHRoaXMuZGF0YVtzZWxlY3RlZERhdGFzZXRdO1xyXG4gICAgdGhpcy51cGRhdGVDaGFydERhdGEoKTtcclxuICAgIC8vIHRoaXMudXBkYXRlWUF4aXNMYWJlbChzZWxlY3RlZFZhbHVlKTtcclxuICB9XHJcbiAgLy8gdXBkYXRlWUF4aXNMYWJlbChzZWxlY3RlZFZhbHVlOiBzdHJpbmcpIHtcclxuICAvLyAgIGNvbnN0IG5ld0xhYmVsVGV4dCA9IGBGb290ZmFsbCAtICR7c2VsZWN0ZWRWYWx1ZX1gOyAvLyBDdXN0b21pemUgeW91ciBsYWJlbCB0ZXh0IGFzIG5lZWRlZFxyXG4gIC8vICAgY29uc29sZS5sb2coJ1VwZGF0aW5nIFktYXhpcyBsYWJlbCB0bzonLCBuZXdMYWJlbFRleHQpO1xyXG4gIC8vICAgY29uc3QgbGFiZWwgPSB0aGlzLnlBeGlzLmNoaWxkcmVuLmdldEluZGV4KDApIGFzIGFtNS5MYWJlbDtcclxuICAvLyAgIGxhYmVsLnNldChcInRleHRcIiwgbmV3TGFiZWxUZXh0KTtcclxuICAvLyB9XHJcbiAgdXBkYXRlQ2hhcnREYXRhKCk6IHZvaWQge1xyXG4gICAgY29uc3QgeEF4aXMgPSB0aGlzLmNoYXJ0LnhBeGVzLmdldEluZGV4KDApIGFzIGFtNXh5LkNhdGVnb3J5QXhpczxhbTV4eS5BeGlzUmVuZGVyZXI+O1xyXG4gICAgeEF4aXMuZGF0YS5zZXRBbGwodGhpcy5nZXRGb290ZmFsbFRyZW5kRGF0YSk7XHJcblxyXG4gICAgdGhpcy5jaGFydC5zZXJpZXMuZWFjaCgoc2VyaWVzOiBhbnkpID0+IHtcclxuICAgICAgc2VyaWVzLmRhdGEuc2V0QWxsKHRoaXMuZ2V0Rm9vdGZhbGxUcmVuZERhdGEpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjcmVhdGVDb2x1bW5TZXJpZXMobmFtZTogc3RyaW5nLCBmaWVsZE5hbWU6IHN0cmluZywgeEF4aXM6IGFtNXh5LkNhdGVnb3J5QXhpczxhbTV4eS5BeGlzUmVuZGVyZXI+LCB5QXhpczogYW01eHkuVmFsdWVBeGlzPGFtNXh5LkF4aXNSZW5kZXJlcj4sIHN0YWNrZWQ6IGJvb2xlYW4sY29sb3I6IGFtNS5Db2xvcik6IHZvaWQge1xyXG4gICAgY29uc3Qgc2VyaWVzID0gdGhpcy5jaGFydC5zZXJpZXMucHVzaChcclxuICAgICAgYW01eHkuQ29sdW1uU2VyaWVzLm5ldyh0aGlzLnJvb3QsIHtcclxuICAgICAgICBuYW1lOiBuYW1lLFxyXG4gICAgICAgIHhBeGlzOiB4QXhpcyxcclxuICAgICAgICB5QXhpczogeUF4aXMsXHJcbiAgICAgICAgdmFsdWVZRmllbGQ6IGZpZWxkTmFtZSxcclxuICAgICAgICBjYXRlZ29yeVhGaWVsZDogJ3N0b3JlTmFtZScsXHJcbiAgICAgICAgc3RhY2tlZDogc3RhY2tlZCxcclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gICAgc2VyaWVzLmRhdGEuc2V0QWxsKHRoaXMuZ2V0Rm9vdGZhbGxUcmVuZERhdGEpO1xyXG5cclxuICAvLyBBZGFwdGVyIHRvIGFwcGx5IGN1c3RvbSBjb2x1bW4gc2V0dGluZ3NcclxuICBzZXJpZXMuY29sdW1ucy50ZW1wbGF0ZS5hZGFwdGVycy5hZGQoXCJmaWxsT3BhY2l0eVwiLCAoZmlsbE9wYWNpdHk6YW55LCB0YXJnZXQ6YW55KSA9PiB7XHJcbiAgICBjb25zdCBkYXRhSXRlbSA9IHRhcmdldC5kYXRhSXRlbS5kYXRhQ29udGV4dCBhcyBhbnk7XHJcbiAgICByZXR1cm4gZGF0YUl0ZW0uY29sdW1uU2V0dGluZ3MgPyBkYXRhSXRlbS5jb2x1bW5TZXR0aW5ncy5maWxsT3BhY2l0eSA6IGZpbGxPcGFjaXR5O1xyXG4gIH0pO1xyXG5cclxuICBzZXJpZXMuY29sdW1ucy50ZW1wbGF0ZS5hZGFwdGVycy5hZGQoXCJzdHJva2VEYXNoYXJyYXlcIiwgKHN0cm9rZURhc2hhcnJheTphbnksIHRhcmdldDphbnkpID0+IHtcclxuICAgIGNvbnN0IGRhdGFJdGVtID0gdGFyZ2V0LmRhdGFJdGVtLmRhdGFDb250ZXh0IGFzIGFueTtcclxuICAgIHJldHVybiBkYXRhSXRlbS5jb2x1bW5TZXR0aW5ncyA/IGRhdGFJdGVtLmNvbHVtblNldHRpbmdzLnN0cm9rZURhc2hhcnJheSA6IHN0cm9rZURhc2hhcnJheTtcclxuICB9KTtcclxuXHJcbiAgc2VyaWVzLmNvbHVtbnMudGVtcGxhdGUuYWRhcHRlcnMuYWRkKFwic3Ryb2tlV2lkdGhcIiwgKHN0cm9rZVdpZHRoOmFueSwgdGFyZ2V0OmFueSkgPT4ge1xyXG4gICAgY29uc3QgZGF0YUl0ZW0gPSB0YXJnZXQuZGF0YUl0ZW0uZGF0YUNvbnRleHQgYXMgYW55O1xyXG4gICAgcmV0dXJuIGRhdGFJdGVtLmNvbHVtblNldHRpbmdzID8gZGF0YUl0ZW0uY29sdW1uU2V0dGluZ3Muc3Ryb2tlV2lkdGggOiBzdHJva2VXaWR0aDtcclxuICB9KTtcclxuICAgIHNlcmllcy5jb2x1bW5zLnRlbXBsYXRlLnNldEFsbCh7XHJcbiAgICAvLyAgIHRvb2x0aXBUZXh0OiBcIntuYW1lfToge3ZhbHVlWS5mb3JtYXROdW1iZXIoJyMuIycpfSVcIiwgLy8gRW5zdXJlIHByb3BlciBmb3JtYXR0aW5nIGZvciBzaW5nbGUgdmFsdWUgZGlzcGxheVxyXG4gICAgLy8gICB0b29sdGlwWTogYW01LnBlcmNlbnQoMTApLFxyXG4gICAgICBmaWxsOiBjb2xvciwgLy8gU2V0IGN1c3RvbSBmaWxsIGNvbG9yIGZvciB0aGUgYmFyc1xyXG4gICAgICBzdHJva2U6IGNvbG9yIC8vIFNldCBjdXN0b20gc3Ryb2tlIGNvbG9yIGZvciB0aGUgYmFyc1xyXG4gICAgfSk7XHJcblxyXG4gICAgc2VyaWVzLmJ1bGxldHMucHVzaCgoKSA9PiB7XHJcbiAgICAgIHJldHVybiBhbTUuQnVsbGV0Lm5ldyh0aGlzLnJvb3QsIHtcclxuICAgICAgICBzcHJpdGU6IGFtNS5MYWJlbC5uZXcodGhpcy5yb290LCB7XHJcbiAgICAgICAgICB0ZXh0OiBcInt2YWx1ZVkuZm9ybWF0TnVtYmVyKCcjLiMnKX0lXCIsXHJcbiAgICAgICAgICBmaWxsOiB0aGlzLnJvb3QuaW50ZXJmYWNlQ29sb3JzLmdldChcImFsdGVybmF0aXZlVGV4dFwiKSxcclxuICAgICAgICAgIGNlbnRlclk6IGFtNS5wNTAsXHJcbiAgICAgICAgICBjZW50ZXJYOiBhbTUucDUwLFxyXG4gICAgICAgICAgcG9wdWxhdGVUZXh0OiB0cnVlLFxyXG4gICAgICAgICAgZm9udFNpemU6IDEyICAvLyBSZWR1Y2UgZm9udCBzaXplXHJcbiAgICAgICAgfSlcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBzZXJpZXMuYXBwZWFyKCk7XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIGNyZWF0ZUxpbmVTZXJpZXMobmFtZTogc3RyaW5nLCBmaWVsZE5hbWU6IHN0cmluZywgeEF4aXM6IGFtNXh5LkNhdGVnb3J5QXhpczxhbTV4eS5BeGlzUmVuZGVyZXI+LCB5QXhpczogYW01eHkuVmFsdWVBeGlzPGFtNXh5LkF4aXNSZW5kZXJlcj4sY29sb3I6IGFtNS5Db2xvcik6IHZvaWQge1xyXG4gICAgY29uc3Qgc2VyaWVzID0gdGhpcy5jaGFydC5zZXJpZXMucHVzaChcclxuICAgICAgYW01eHkuTGluZVNlcmllcy5uZXcodGhpcy5yb290LCB7XHJcbiAgICAgICAgbmFtZTogbmFtZSxcclxuICAgICAgICB4QXhpczogeEF4aXMsXHJcbiAgICAgICAgeUF4aXM6IHlBeGlzLFxyXG4gICAgICAgIHZhbHVlWUZpZWxkOiBmaWVsZE5hbWUsXHJcbiAgICAgICAgY2F0ZWdvcnlYRmllbGQ6ICdzdG9yZU5hbWUnLFxyXG4gICAgICAgIHRvb2x0aXA6IGFtNS5Ub29sdGlwLm5ldyh0aGlzLnJvb3QsIHtcclxuICAgICAgICAgIHBvaW50ZXJPcmllbnRhdGlvbjogXCJob3Jpem9udGFsXCIsXHJcbiAgICAgICAgICBsYWJlbFRleHQ6IFwie25hbWV9OiB7dmFsdWVZLmZvcm1hdE51bWJlcignIy4jJyl9JVwiLFxyXG4gICAgICAgICAgYmFja2dyb3VuZDogYW01LlJlY3RhbmdsZS5uZXcodGhpcy5yb290LCB7XHJcbiAgICAgICAgICAgIGZpbGw6IGFtNS5jb2xvcigweGZmY2MwMCkgLy8gU2V0IHRoZSBkZXNpcmVkIHRvb2x0aXAgYmFja2dyb3VuZCBjb2xvclxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9KVxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgICBzZXJpZXMuc3Ryb2tlcy50ZW1wbGF0ZS5zZXRBbGwoe1xyXG4gICAgICBzdHJva2VXaWR0aDogMixcclxuICAgICAgc3Ryb2tlOiBjb2xvcixcclxuICAgICAgIHRlbXBsYXRlRmllbGQ6IFwic3Ryb2tlU2V0dGluZ3NcIixcclxuICAgICAgIGZvbnRTaXplOiAxMiAgLy8gUmVkdWNlIGZvbnQgc2l6ZVxyXG4gICAgfSk7XHJcblxyXG4gICAgc2VyaWVzLmRhdGEuc2V0QWxsKHRoaXMuZ2V0Rm9vdGZhbGxUcmVuZERhdGEpO1xyXG5cclxuICAgICAgLy8gQWRhcHRlciB0byBhcHBseSBjdXN0b20gc3Ryb2tlIHNldHRpbmdzXHJcbiAgICAgIHNlcmllcy5zdHJva2VzLnRlbXBsYXRlLmFkYXB0ZXJzLmFkZChcInN0cm9rZVwiLCAoc3Ryb2tlOmFueSwgdGFyZ2V0OmFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGRhdGFJdGVtID0gdGFyZ2V0LmRhdGFJdGVtO1xyXG4gICAgICAgIGlmIChkYXRhSXRlbSAmJiBkYXRhSXRlbS5kYXRhQ29udGV4dCAmJiBkYXRhSXRlbS5kYXRhQ29udGV4dC5zdHJva2VTZXR0aW5ncykge1xyXG4gICAgICAgICAgcmV0dXJuIGRhdGFJdGVtLmRhdGFDb250ZXh0LnN0cm9rZVNldHRpbmdzLnN0cm9rZSA/PyBzdHJva2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzdHJva2U7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgc2VyaWVzLnN0cm9rZXMudGVtcGxhdGUuYWRhcHRlcnMuYWRkKFwic3Ryb2tlV2lkdGhcIiwgKHN0cm9rZVdpZHRoOmFueSwgdGFyZ2V0OmFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGRhdGFJdGVtID0gdGFyZ2V0LmRhdGFJdGVtO1xyXG4gICAgICAgIGlmIChkYXRhSXRlbSAmJiBkYXRhSXRlbS5kYXRhQ29udGV4dCAmJiBkYXRhSXRlbS5kYXRhQ29udGV4dC5zdHJva2VTZXR0aW5ncykge1xyXG4gICAgICAgICAgcmV0dXJuIGRhdGFJdGVtLmRhdGFDb250ZXh0LnN0cm9rZVNldHRpbmdzLnN0cm9rZVdpZHRoID8/IHN0cm9rZVdpZHRoO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc3Ryb2tlV2lkdGg7XHJcbiAgICAgIH0pO1xyXG5cclxuICBzZXJpZXMuc3Ryb2tlcy50ZW1wbGF0ZS5hZGFwdGVycy5hZGQoXCJzdHJva2VEYXNoYXJyYXlcIiwgKHN0cm9rZURhc2hhcnJheTphbnksIHRhcmdldDphbnkpID0+IHtcclxuICAgIGNvbnN0IGRhdGFJdGVtID0gdGFyZ2V0LmRhdGFJdGVtO1xyXG4gICAgaWYgKGRhdGFJdGVtICYmIGRhdGFJdGVtLmRhdGFDb250ZXh0ICYmIGRhdGFJdGVtLmRhdGFDb250ZXh0LnN0cm9rZVNldHRpbmdzKSB7XHJcbiAgICAgIHJldHVybiBkYXRhSXRlbS5kYXRhQ29udGV4dC5zdHJva2VTZXR0aW5ncy5zdHJva2VEYXNoYXJyYXkgPz8gc3Ryb2tlRGFzaGFycmF5O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN0cm9rZURhc2hhcnJheTtcclxuICB9KTtcclxuXHJcbiAgICBzZXJpZXMuYnVsbGV0cy5wdXNoKCgpID0+IHtcclxuICAgICAgcmV0dXJuIGFtNS5CdWxsZXQubmV3KHRoaXMucm9vdCwge1xyXG4gICAgICAgIHNwcml0ZTogYW01LkNpcmNsZS5uZXcodGhpcy5yb290LCB7XHJcbiAgICAgICAgICBzdHJva2VXaWR0aDogMSxcclxuICAgICAgICAgIHN0cm9rZTogc2VyaWVzLmdldChcInN0cm9rZVwiKSxcclxuICAgICAgICAgIHJhZGl1czogMSxcclxuICAgICAgICAgIGZpbGw6IHRoaXMucm9vdC5pbnRlcmZhY2VDb2xvcnMuZ2V0KFwiYmFja2dyb3VuZFwiKVxyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIFxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIHNlcmllcy5hcHBlYXIoKTtcclxuICB9XHJcblxyXG5cclxuICBjaGFuZ2VTdGF0dXModHlwZTphbnkpe1xyXG50aGlzLnR5cGVWYWx1ZSA9IHR5cGU7XHJcbiAgfVxyXG59XHJcblxyXG5cclxuIiwiPGRpdiBjbGFzcz1cImNhcmRcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBib3JkZXItMCBwdC0zXCI+XHJcbiAgICAgICAgPGgzIGNsYXNzPVwiY2FyZC10aXRsZSBhbGlnbi1pdGVtcy1zdGFydCBmbGV4LWNvbHVtblwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhcmQtbGFiZWwgbWItMlwiPkZvb3RmYWxsIFRyZW5kPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtc3ViIG1iLTJcIj5CYXNlZCBvbiAzMSBNYXksIDIwMjTigJMgMDYgSnVuLCAyMDI0PC9zcGFuPlxyXG4gICAgICAgIDwvaDM+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtdG9vbGJhciB0ZXh0LW5vd3JhcFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBwb3NpdGlvbi1yZWxhdGl2ZSBteS0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLWJlZ2luOjpOYXYgZ3JvdXAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibmF2LWdyb3VwIG5hdi1ncm91cC1vdXRsaW5lIGJvcmRlci0xIGJ0bi1ncm91cCBwLTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZVwiIFtuZ0NsYXNzXT1cInR5cGUgPT09ICdkYWlseSc/ICdhY3RpdmVQbGFuQnRuJzonaW5hY3RpdmVQbGFuQnRuJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0UGxhbignZGFpbHknKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGFpbHlcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lICBweC02IHB5LTNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwidHlwZSA9PT0gJ3dlZWsnPyAnYWN0aXZlUGxhbkJ0bic6J2luYWN0aXZlUGxhbkJ0bidcIiAoY2xpY2spPVwic2VsZWN0UGxhbignd2VlaycpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWVrXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIHB4LTYgcHktM1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ0eXBlID09PSAnbW9udGgnPyAnYWN0aXZlUGxhbkJ0bic6J2luYWN0aXZlUGxhbkJ0bidcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFBsYW4oJ21vbnRoJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vbnRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS1lbmQ6Ok5hdiBncm91cC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJteC0yIG10LTNcIj5UcmVuZDwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0IFtmb3JtQ29udHJvbF09XCJzZWxlY3RWYWx1ZVwiIFtpZEZpZWxkXT1cIid2YWx1ZSdcIiBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIiBbZGF0YV09XCJkYXRhc2V0c1wiIGNsYXNzPVwidy0xMDBcIj48L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0IGZvcm0tc2VsZWN0LXNtXCIgKGNoYW5nZSk9XCJvbkRhdGFzZXRDaGFuZ2UoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgZGF0YXNldCBvZiBkYXRhc2V0c1wiIFt2YWx1ZV09XCJkYXRhc2V0LnZhbHVlXCI+e3sgZGF0YXNldC5sYWJlbCB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PiAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IG10LTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkLWZsZXggbXMtMyBjdXJzb3ItcG9pbnRlciB0ZXh0LW5vd3JhcFwiPkZvcmVjYXN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjY2xpcDBfMjY0NV8yNzQ1OSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMy4zMzM5OCAxLjMzMzMxTDMuNDYwNjUgMS45NTk5OEMzLjU1MTQyIDIuNDA5OTggMy43NTY4MyAyLjgyODkzIDQuMDU2OTkgMy4xNzYyOEM0LjM1NzE1IDMuNTIzNjIgNC43NDE4OSAzLjc4NzU5IDUuMTczOTggMy45NDI2NUw1LjMzMzk4IDMuOTk5OThMNS4xNzM5OCA0LjA1NzMxQzQuNzQxODkgNC4yMTIzNyA0LjM1NzE1IDQuNDc2MzQgNC4wNTY5OSA0LjgyMzY4QzMuNzU2ODMgNS4xNzEwMyAzLjU1MTQyIDUuNTg5OTggMy40NjA2NSA2LjAzOTk4TDMuMzMzOTggNi42NjY2NUwzLjIwNzMyIDYuMDM5OThDMy4xMTY1NCA1LjU4OTk4IDIuOTExMTQgNS4xNzEwMyAyLjYxMDk4IDQuODIzNjhDMi4zMTA4MiA0LjQ3NjM0IDEuOTI2MDcgNC4yMTIzNyAxLjQ5Mzk4IDQuMDU3MzFMMS4zMzM5OCAzLjk5OTk4TDEuNDkzOTggMy45NDI2NUMxLjkyNjA3IDMuNzg3NTkgMi4zMTA4MiAzLjUyMzYyIDIuNjEwOTggMy4xNzYyOEMyLjkxMTE0IDIuODI4OTMgMy4xMTY1NCAyLjQwOTk4IDMuMjA3MzIgMS45NTk5OEwzLjMzMzk4IDEuMzMzMzFaTTUuMzMzOTggMTAuNjY2Nkw1LjQ4NzMyIDExLjUxNzNDNS41MjcxMyAxMS43MzkyIDUuNjIyNTYgMTEuOTQ3NCA1Ljc2NDY4IDEyLjEyMjRDNS45MDY4IDEyLjI5NzQgNi4wOTA5OCAxMi40MzM1IDYuMjk5OTggMTIuNTE4TDYuNjY3MzIgMTIuNjY2Nkw2LjI5OTk4IDEyLjgxNTNDNi4wOTA5NCAxMi44OTk3IDUuOTA2NjggMTMuMDM1NiA1Ljc2NDQ1IDEzLjIxMDVDNS42MjIyMSAxMy4zODU0IDUuNTI2NjMgMTMuNTkzNSA1LjQ4NjY1IDEzLjgxNTNMNS4zMzM5OCAxNC42NjY2TDUuMTgwNjUgMTMuODE2QzUuMTQwODQgMTMuNTk0MSA1LjA0NTQxIDEzLjM4NTkgNC45MDMyOSAxMy4yMTA5QzQuNzYxMTcgMTMuMDM1OSA0LjU3Njk5IDEyLjg5OTggNC4zNjc5OCAxMi44MTUzTDQuMDAwNjUgMTIuNjY2Nkw0LjM2Nzk4IDEyLjUxOEM0LjU3NzAzIDEyLjQzMzYgNC43NjEyOSAxMi4yOTc3IDQuOTAzNTIgMTIuMTIyOEM1LjA0NTc2IDExLjk0NzkgNS4xNDEzMyAxMS43Mzk4IDUuMTgxMzIgMTEuNTE4TDUuMzMzOTggMTAuNjY2NlpNMTAuNjY3MyAxLjk5OTk4TDExLjAzOCAzLjc2OTMxQzExLjIyNjkgNC42NzEzNyAxMS42NDYzIDUuNTA5MDggMTIuMjU1NCA2LjIwMDc2QzEyLjg2NDUgNi44OTI0NCAxMy42NDI0IDcuNDE0NDggMTQuNTEzMyA3LjcxNTk4TDE1LjMzNCA3Ljk5OTk4TDE0LjUxMzMgOC4yODM5OEMxMy42NDI0IDguNTg1NDggMTIuODY0NSA5LjEwNzUyIDEyLjI1NTQgOS43OTkyQzExLjY0NjMgMTAuNDkwOSAxMS4yMjY5IDExLjMyODYgMTEuMDM4IDEyLjIzMDZMMTAuNjY3MyAxNEwxMC4yOTY3IDEyLjIzMDZDMTAuMTA3NyAxMS4zMjg2IDkuNjg4MyAxMC40OTA5IDkuMDc5MjIgOS43OTkyQzguNDcwMTUgOS4xMDc1MiA3LjY5MjIzIDguNTg1NDggNi44MjEzMiA4LjI4Mzk4TDYuMDAwNjUgNy45OTk5OEw2LjgyMTMyIDcuNzE1OThDNy42OTIyMyA3LjQxNDQ4IDguNDcwMTUgNi44OTI0NCA5LjA3OTIyIDYuMjAwNzZDOS42ODgzIDUuNTA5MDggMTAuMTA3NyA0LjY3MTM3IDEwLjI5NjcgMy43NjkzMUwxMC42NjczIDEuOTk5OThaXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cImNsaXAwXzI2NDVfMjc0NTlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb3JtLWNoZWNrIGZvcm0tc3dpdGNoIG14LTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IGN1cnNvci1wb2ludGVyXCIgdHlwZT1cImNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgZHJvcGRvd24xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYnMtdG9nZ2xlPVwiZHJvcGRvd25cIiBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk01IDEwSDE1TTIuNSA1SDE3LjVNNy41IDE1SDEyLjVcIiBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42NjY2N1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImRyb3Bkb3duLW1lbnUgcC0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxidXR0b24gY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgW25nQ2xhc3NdPVwidHlwZVZhbHVlID09PSdub3JtYWlsemUnID8gJ2JnLWZvcmNhc3QnOicnXCIgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2hhbmdlU3RhdHVzKCdub3JtYWlsemUnKVwiPk5vcm1haWx6ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cInRleHQtZW5kXCIgKm5nSWY9XCJ0eXBlVmFsdWUgPT09J25vcm1haWx6ZScgPyAnYmctZm9yY2FzdCc6JydcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEzLjMzMjcgNEw1Ljk5OTM1IDExLjMzMzNMMi42NjYwMiA4XCIgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+PC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+PGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBbbmdDbGFzc109XCJ0eXBlVmFsdWUgPT09J2F2ZXJhZ2UnID8gJ2JnLWZvcmNhc3QnOicnXCIgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2hhbmdlU3RhdHVzKCdhdmVyYWdlJylcIj5BdmVyYWdlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwidGV4dC1lbmRcIiAqbmdJZj1cInR5cGVWYWx1ZSA9PT0nYXZlcmFnZScgPyAnYmctZm9yY2FzdCc6JydcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEzLjMzMjcgNEw1Ljk5OTM1IDExLjMzMzNMMi42NjYwMiA4XCIgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+PC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+PGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBbbmdDbGFzc109XCJ0eXBlVmFsdWUgPT09J3RhcmdldCcgPyAnYmctZm9yY2FzdCc6JydcIiB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjaGFuZ2VTdGF0dXMoJ3RhcmdldCcpXCI+VGFyZ2V0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwidGV4dC1lbmRcIiAqbmdJZj1cInR5cGVWYWx1ZSA9PT0ndGFyZ2V0JyA/ICdiZy1mb3JjYXN0JzonJ1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEzLjMzMjcgNEw1Ljk5OTM1IDExLjMzMzNMMi42NjYwMiA4XCIgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+PC9idXR0b24+PC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT48YnV0dG9uIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIFtuZ0NsYXNzXT1cInR5cGVWYWx1ZSA9PT0nd2Vla2VuZCcgPyAnYmctZm9yY2FzdCc6JydcIiB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjaGFuZ2VTdGF0dXMoJ3dlZWtlbmQnKVwiPldlZWtlbmRzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwidGV4dC1lbmRcIiAqbmdJZj1cInR5cGVWYWx1ZSA9PT0nd2Vla2VuZCcgPyAnYmctZm9yY2FzdCc6JydcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMy4zMzI3IDRMNS45OTkzNSAxMS4zMzMzTDIuNjY2MDIgOFwiIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPjwvYnV0dG9uPjwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+PGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBbbmdDbGFzc109XCJ0eXBlVmFsdWUgPT09J3dlZWtkYXlzJyA/ICdiZy1mb3JjYXN0JzonJ1wiIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNoYW5nZVN0YXR1cygnd2Vla2RheXMnKVwiPldlZWtkYXlzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwidGV4dC1lbmRcIiAqbmdJZj1cInR5cGVWYWx1ZSA9PT0nd2Vla2RheXMnID8gJ2JnLWZvcmNhc3QnOicnXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMy4zMzI3IDRMNS45OTkzNSAxMS4zMzMzTDIuNjY2MDIgOFwiIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPjwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IHAtMFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiIGlkPVwiRm9vdGZhbGx0cmVuZFwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgI3Rvb2x0aXBDb250YWluZXIgY2xhc3M9XCJ0b29sdGlwLWNvbnRhaW5lclwiID5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRvb2x0aXAtY29udGVudFwiICpuZ0lmPVwidG9vbHRpcERhdGFcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50IHAtNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZSB0ZXh0LXN0YXJ0XCI+e3t0b29sdGlwRGF0YS5zdG9yZU5hbWV9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQtaXRlbSBsYWJlbFwiPlRvdGFsIEZvb3RmYWxsPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZC1pdGVtIHZhbHVlXCI+MTAwPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZC1pdGVtIGxhYmVsXCI+Qm91bmNlZCBGb290ZmFsbDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQtaXRlbSB2YWx1ZVwiPnt7dG9vbHRpcERhdGEuYm91bmNlZH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZC1pdGVtIGxhYmVsXCI+RW5nYWdlcnM8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkLWl0ZW0gdmFsdWVcIj57e3Rvb2x0aXBEYXRhLmVuZ2FnZXJzfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkLWl0ZW0gbGFiZWxcIj5BdmcgRHdlbGwgVGltZTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQtaXRlbSB2YWx1ZVwiPjM0IE1pbnM8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkLWl0ZW0gbGFiZWxcIj5Db252ZXJzaW9uIFJhdGU8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkLWl0ZW0gdmFsdWVcIj57e3Rvb2x0aXBEYXRhLmNvbnZlcnNpb259fSU8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkLWl0ZW0gbGFiZWxcIj5NaXNzZWQgT3Bwb3J0dW5pdGllczwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdyaWQtaXRlbSB2YWx1ZVwiPnt7dG9vbHRpcERhdGEubWlzc2Vkb3Bwb3J0dW5pdGllc319PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZC1pdGVtIGxhYmVsXCI+RG93biBUaW1lPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZC1pdGVtIHZhbHVlXCI+MjMlPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggbXgtMyBteS0yXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXgtM1wiPjxzdmcgd2lkdGg9XCIzNlwiIGhlaWdodD1cIjM2XCIgdmlld0JveD1cIjAgMCAzNiAzNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgICAgPHJlY3QgeD1cIjJcIiB5PVwiMlwiIHdpZHRoPVwiMzJcIiBoZWlnaHQ9XCIzMlwiIHJ4PVwiMTZcIiBmaWxsPVwiI0RBRjFGRlwiLz5cclxuICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIyXCIgeT1cIjJcIiB3aWR0aD1cIjMyXCIgaGVpZ2h0PVwiMzJcIiByeD1cIjE2XCIgc3Ryb2tlPVwiI0VBRjhGRlwiIHN0cm9rZS13aWR0aD1cIjRcIi8+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE4LjY2NjcgMTEuMzMzNEwxMiAxOS4zMzM0SDE4TDE3LjMzMzMgMjQuNjY2N0wyNCAxNi42NjY3SDE4TDE4LjY2NjcgMTEuMzMzNFpcIiBzdHJva2U9XCIjMDBBM0ZGXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPjwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJteC0yIG15LTJcIj48c3BhbiBjbGFzcz1cInRleHQtd2Vla1wiPldlZWtlbmQgc3RhZmZpbmcgbG93ZXIgdGhhbiB3ZWVrZGF5czwvc3Bhbj4gPHNwYW4gY2xhc3M9XCJ0ZXh0LWNhdXNlIG1zLTJcIj5jYXVzZSBwb3RlbnRpYWxseSAyMCUgZmV3ZXIgd2Vla2VuZCBjb252ZXJzaW9ucy48L3NwYW4+PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==
|