@smartbit4all/ng-client 4.2.38 → 4.2.39
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/smart-map/impl/leaflet-map.mjs +80 -9
- package/fesm2022/smartbit4all-ng-client.mjs +79 -8
- package/fesm2022/smartbit4all-ng-client.mjs.map +1 -1
- package/lib/smart-map/impl/leaflet-map.d.ts +2 -0
- package/package.json +1 -1
- package/smartbit4all-ng-client-4.2.39.tgz +0 -0
- package/smartbit4all-ng-client-4.2.38.tgz +0 -0
|
@@ -21,6 +21,7 @@ function createLeafletMapItem(item, config) {
|
|
|
21
21
|
title: item.label,
|
|
22
22
|
markerColor: config.color,
|
|
23
23
|
draggable: config.draggable,
|
|
24
|
+
icon: getIcon(config.color),
|
|
24
25
|
})),
|
|
25
26
|
]);
|
|
26
27
|
case GeoMapItemKind.LINE:
|
|
@@ -31,6 +32,7 @@ function createLeafletMapItem(item, config) {
|
|
|
31
32
|
title: item.label,
|
|
32
33
|
color: config.color,
|
|
33
34
|
draggable: config.draggable,
|
|
35
|
+
icon: getIcon(config.color),
|
|
34
36
|
})),
|
|
35
37
|
]);
|
|
36
38
|
}
|
|
@@ -40,6 +42,7 @@ export class LeafletMap extends AbstractMap {
|
|
|
40
42
|
constructor(el, cd, zone) {
|
|
41
43
|
super(el, cd, zone, createLeafletMapItem);
|
|
42
44
|
this.offsetDistance = 0.00004;
|
|
45
|
+
this.markers = [];
|
|
43
46
|
}
|
|
44
47
|
ngAfterViewChecked() {
|
|
45
48
|
if (!this.map && this.el.nativeElement.offsetParent) {
|
|
@@ -135,6 +138,7 @@ export class LeafletMap extends AbstractMap {
|
|
|
135
138
|
if (!this.map) {
|
|
136
139
|
return;
|
|
137
140
|
}
|
|
141
|
+
this.markers = [];
|
|
138
142
|
const markerGroups = new Map();
|
|
139
143
|
toAdd.forEach((item) => {
|
|
140
144
|
if (item.record instanceof L.Marker) {
|
|
@@ -183,7 +187,16 @@ export class LeafletMap extends AbstractMap {
|
|
|
183
187
|
let group = markerGroups.get(it.record.getLatLng().lat.toFixed(6) + ',' + it.record.getLatLng().lng.toFixed(6));
|
|
184
188
|
if (group && group.length > 1) {
|
|
185
189
|
const icon = this.createNumberedIcon(group.length);
|
|
186
|
-
const
|
|
190
|
+
const label = this.createLabel(group);
|
|
191
|
+
const extraMarker = L.marker(group[0].originalLatLng, { icon });
|
|
192
|
+
if (!extraMarker._tooltip) {
|
|
193
|
+
extraMarker.bindTooltip(label, {
|
|
194
|
+
permanent: false,
|
|
195
|
+
direction: 'auto',
|
|
196
|
+
});
|
|
197
|
+
this.markers.push(extraMarker);
|
|
198
|
+
}
|
|
199
|
+
const clusterMarker = extraMarker.addTo(this.map);
|
|
187
200
|
it.record.on('mouseover', (_event) => {
|
|
188
201
|
toAdd.forEach((item, index) => {
|
|
189
202
|
if (item.record instanceof L.Marker &&
|
|
@@ -212,6 +225,9 @@ export class LeafletMap extends AbstractMap {
|
|
|
212
225
|
}
|
|
213
226
|
});
|
|
214
227
|
}
|
|
228
|
+
else {
|
|
229
|
+
this.markers.push(it.record);
|
|
230
|
+
}
|
|
215
231
|
}
|
|
216
232
|
it.record.addTo(this.map);
|
|
217
233
|
this.overlays.set(it.id, it.record);
|
|
@@ -303,15 +319,49 @@ export class LeafletMap extends AbstractMap {
|
|
|
303
319
|
}
|
|
304
320
|
toBase64() {
|
|
305
321
|
return new Promise((resolve, reject) => {
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
322
|
+
setTimeout(() => {
|
|
323
|
+
leafletImage(this.map, (err, canvas) => {
|
|
324
|
+
if (err) {
|
|
325
|
+
console.error('Leaflet image capture error', err);
|
|
326
|
+
reject(err);
|
|
327
|
+
return;
|
|
328
|
+
}
|
|
329
|
+
const ctx = canvas.getContext('2d');
|
|
330
|
+
if (!ctx) {
|
|
331
|
+
reject('No context');
|
|
332
|
+
return;
|
|
333
|
+
}
|
|
334
|
+
this.markers.forEach((marker) => {
|
|
335
|
+
const tooltip = marker.getTooltip();
|
|
336
|
+
if (!tooltip) {
|
|
337
|
+
return;
|
|
338
|
+
}
|
|
339
|
+
const latLng = marker.getLatLng();
|
|
340
|
+
const point = this.map.latLngToContainerPoint(latLng);
|
|
341
|
+
const text = tooltip.getContent();
|
|
342
|
+
// Tooltip szöveg megjelenítése
|
|
343
|
+
ctx.font = 'bold 14px sans-serif';
|
|
344
|
+
ctx.fillStyle = 'black';
|
|
345
|
+
ctx.strokeStyle = 'white';
|
|
346
|
+
ctx.lineWidth = 4;
|
|
347
|
+
ctx.textAlign = 'center';
|
|
348
|
+
ctx.textBaseline = 'bottom';
|
|
349
|
+
ctx.strokeText(text, point.x, point.y + 10); // fehér kontúr
|
|
350
|
+
ctx.fillText(text, point.x, point.y + 10); // fekete szöveg
|
|
351
|
+
});
|
|
352
|
+
resolve(canvas.toDataURL('image/png'));
|
|
353
|
+
});
|
|
354
|
+
}, 300);
|
|
313
355
|
});
|
|
314
356
|
}
|
|
357
|
+
createLabel(group) {
|
|
358
|
+
let label = '';
|
|
359
|
+
group.forEach((item) => {
|
|
360
|
+
label += item._tooltip._content + ', ';
|
|
361
|
+
item._tooltip.permanent = false;
|
|
362
|
+
});
|
|
363
|
+
return label;
|
|
364
|
+
}
|
|
315
365
|
createNumberedIcon(number) {
|
|
316
366
|
const size = 35;
|
|
317
367
|
const scaleFactor = 15;
|
|
@@ -348,4 +398,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImpo
|
|
|
348
398
|
type: Component,
|
|
349
399
|
args: [{ selector: 'leaflet-map', template: ` <div id="leaflet"></div>`, styles: ["#leaflet{height:720px}::ng-deep .marker-count{background-color:#0078d4;color:#fff;font-weight:700;border-radius:50%;width:30px;height:30px;line-height:30px;text-align:center;border:2px solid white;box-shadow:0 0 4px #0006}::ng-deep .custom-cluster-icon{pointer-events:auto!important}\n"] }]
|
|
350
400
|
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }] });
|
|
351
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGVhZmxldC1tYXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC1uZy1jbGllbnQvc3JjL2xpYi9zbWFydC1tYXAvaW1wbC9sZWFmbGV0LW1hcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXVDLFNBQVMsRUFBc0IsTUFBTSxlQUFlLENBQUM7QUFDbkcsT0FBTyxFQUFFLFdBQVcsRUFBZ0IsTUFBTSxpQkFBaUIsQ0FBQztBQUM1RCxPQUFPLEVBQWMsY0FBYyxFQUFrQixNQUFNLFFBQVEsQ0FBQzs7QUFXcEUsU0FBUyxvQkFBb0IsQ0FBQyxJQUFnQixFQUFFLE1BQTRCO0lBQzFFLFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2xCLEtBQUssY0FBYyxDQUFDLE1BQU07WUFDeEIsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFTLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFTLENBQUMsU0FBUyxDQUFDLEVBQUU7Z0JBQ2pGLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUzthQUM1QixDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7Z0JBQ3pCLFNBQVMsRUFBRSxLQUFLO2dCQUNoQixTQUFTLEVBQUUsTUFBTTthQUNsQixDQUFDLENBQUM7WUFDSCxNQUFNLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDdkYsT0FBTyxNQUFNLENBQUM7UUFDaEIsS0FBSyxjQUFjLENBQUMsT0FBTztZQUN6QixNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxLQUFNLENBQUMsTUFBTSxDQUFDO1lBQzlDLE9BQU8sQ0FB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QUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDakUsR0FBRyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDMUIsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1gsR0FBRyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDbEIsR0FBRyxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUM7UUFDNUIsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBRWIsR0FBRyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDMUIsR0FBRyxDQUFDLElBQUksR0FBRyxzQkFBc0IsQ0FBQztRQUNsQyxHQUFHLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQztRQUN6QixHQUFHLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQztRQUM1QixHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRSxJQUFJLEdBQUcsQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQztRQUVwRCxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDWixPQUFPLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRTtZQUMzQixRQUFRLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDO1lBQ3RCLFVBQVUsRUFBRSxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUNoQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1NBQzVCLENBQUMsQ0FBQztJQUNMLENBQUM7K0dBalZVLFVBQVU7bUdBQVYsVUFBVSwwRUFyQlgsMkJBQTJCOzs0RkFxQjFCLFVBQVU7a0JBdkJ0QixTQUFTOytCQUNFLGFBQWEsWUFDYiwyQkFBMkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdDaGVja2VkLCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBOZ1pvbmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWJzdHJhY3RNYXAsIFJlY29yZFdpdGhJZCB9IGZyb20gJy4uL2Fic3RyYWN0LW1hcCc7XHJcbmltcG9ydCB7IEdlb01hcEl0ZW0sIEdlb01hcEl0ZW1LaW5kLCBHZW9NYXBWaWV3cG9ydCB9IGZyb20gJy4uL2FwaSc7XHJcbmltcG9ydCB7IENvb3JkLCBNYXBJdGVtQ29uZmlndXJhdGlvbiB9IGZyb20gJy4uL3NtYXJ0LW1hcC50eXBlcyc7XHJcblxyXG5kZWNsYXJlIHZhciBMOiBhbnk7XHJcbmRlY2xhcmUgY29uc3QgbGVhZmxldEltYWdlOiBhbnk7XHJcblxyXG5pbnRlcmZhY2UgTGVhZmxldE1hcE9wdGlvbnMge1xyXG4gIGNlbnRyZTogQXJyYXk8bnVtYmVyPjtcclxuICB6b29tOiBudW1iZXI7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZUxlYWZsZXRNYXBJdGVtKGl0ZW06IEdlb01hcEl0ZW0sIGNvbmZpZzogTWFwSXRlbUNvbmZpZ3VyYXRpb24pOiBhbnkge1xyXG4gIHN3aXRjaCAoaXRlbS5raW5kKSB7XHJcbiAgICBjYXNlIEdlb01hcEl0ZW1LaW5kLk1BUktFUjpcclxuICAgICAgbGV0IG1hcmtlciA9IEwubWFya2VyKEwubGF0TG5nKGl0ZW0ucG9zaXRpb24hLmxhdGl0dWRlLCBpdGVtLnBvc2l0aW9uIS5sb25naXR1ZGUpLCB7XHJcbiAgICAgICAgZHJhZ2dhYmxlOiBjb25maWcuZHJhZ2dhYmxlLFxyXG4gICAgICB9KS5iaW5kVG9vbHRpcChpdGVtLmxhYmVsLCB7XHJcbiAgICAgICAgcGVybWFuZW50OiBmYWxzZSxcclxuICAgICAgICBkaXJlY3Rpb246ICdhdXRvJyxcclxuICAgICAgfSk7XHJcbiAgICAgIG1hcmtlci5vcmlnaW5hbExhdExuZyA9IEwubGF0TG5nKGl0ZW0ucG9zaXRpb24hLmxhdGl0dWRlLCBpdGVtLnBvc2l0aW9uIS5sb25naXR1ZGUpOyAvL1xyXG4gICAgICByZXR1cm4gbWFya2VyO1xyXG4gICAgY2FzZSBHZW9NYXBJdGVtS2luZC5QT0xZR09OOlxyXG4gICAgICBjb25zdCBwb2x5Z29uUm91dGVQb2ludHMgPSBpdGVtLnJvdXRlIS5wb2ludHM7XHJcbiAgICAgIHJldHVybiBMLmxheWVyR3JvdXAoW1xyXG4gICAgICAgIEwucG9seWdvbihcclxuICAgICAgICAgIHBvbHlnb25Sb3V0ZVBvaW50cy5tYXAoKHApID0+IFtwLmxhdGl0dWRlLCBwLmxvbmdpdHVkZV0pLFxyXG4gICAgICAgICAgeyB0aXRsZTogaXRlbS5sYWJlbCwgY29sb3I6IGNvbmZpZy5jb2xvciB9XHJcbiAgICAgICAgKSxcclxuICAgICAgICAuLi5wb2x5Z29uUm91dGVQb2ludHMubWFwKChwKSA9PlxyXG4gICAgICAgICAgTC5tYXJrZXIoW3AubGF0aXR1ZGUsIHAubG9uZ2l0dWRlXSwge1xyXG4gICAgICAgICAgICB0aXRsZTogaXRlbS5sYWJlbCxcclxuICAgICAgICAgICAgbWFya2VyQ29sb3I6IGNvbmZpZy5jb2xvcixcclxuICAgICAgICAgICAgZHJhZ2dhYmxlOiBjb25maWcuZHJhZ2dhYmxlLFxyXG4gICAgICAgICAgfSlcclxuICAgICAgICApLFxyXG4gICAgICBdKTtcclxuICAgIGNhc2UgR2VvTWFwSXRlbUtpbmQuTElORTpcclxuICAgICAgY29uc3QgbGluZVJvdXRlUG9pbnRzID0gaXRlbS5yb3V0ZSEucG9pbnRzO1xyXG5cclxuICAgICAgcmV0dXJuIEwubGF5ZXJHcm91cChbXHJcbiAgICAgICAgTC5wb2x5bGluZShcclxuICAgICAgICAgIGxpbmVSb3V0ZVBvaW50cy5tYXAoKHApID0+IFtwLmxhdGl0dWRlLCBwLmxvbmdpdHVkZV0pLFxyXG4gICAgICAgICAgeyB0aXRsZTogaXRlbS5sYWJlbCwgY29sb3I6IGNvbmZpZy5jb2xvciB9XHJcbiAgICAgICAgKSxcclxuICAgICAgICAuLi5saW5lUm91dGVQb2ludHMubWFwKChwKSA9PlxyXG4gICAgICAgICAgTC5tYXJrZXIoW3AubGF0aXR1ZGUsIHAubG9uZ2l0dWRlXSwge1xyXG4gICAgICAgICAgICB0aXRsZTogaXRlbS5sYWJlbCxcclxuICAgICAgICAgICAgY29sb3I6IGNvbmZpZy5jb2xvcixcclxuICAgICAgICAgICAgZHJhZ2dhYmxlOiBjb25maWcuZHJhZ2dhYmxlLFxyXG4gICAgICAgICAgfSlcclxuICAgICAgICApLFxyXG4gICAgICBdKTtcclxuICB9XHJcbiAgdGhyb3cgbmV3IEVycm9yKCdGb28hJyk7XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGVhZmxldC1tYXAnLFxyXG4gIHRlbXBsYXRlOiBgIDxkaXYgaWQ9XCJsZWFmbGV0XCI+PC9kaXY+YCxcclxuICBzdHlsZXM6IGBcclxuICAgICAgI2xlYWZsZXQge1xyXG4gICAgICAgICAgaGVpZ2h0OiA3MjBweDtcclxuICAgICAgfVxyXG4gICAgIDo6bmctZGVlcCAubWFya2VyLWNvdW50IHtcclxuICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICMwMDc4ZDQ7XHJcbiAgICAgICAgICBjb2xvcjogd2hpdGU7XHJcbiAgICAgICAgICBmb250LXdlaWdodDogYm9sZDtcclxuICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcclxuICAgICAgICAgIHdpZHRoOiAzMHB4O1xyXG4gICAgICAgICAgaGVpZ2h0OiAzMHB4O1xyXG4gICAgICAgICAgbGluZS1oZWlnaHQ6IDMwcHg7XHJcbiAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgICAgICAgICBib3JkZXI6IDJweCBzb2xpZCB3aGl0ZTtcclxuICAgICAgICAgIGJveC1zaGFkb3c6IDAgMCA0cHggcmdiYSgwLDAsMCwwLjQpO1xyXG4gICAgfVxyXG4gICAgIDo6bmctZGVlcCAuY3VzdG9tLWNsdXN0ZXItaWNvbiB7XHJcbiAgICAgICAgICBwb2ludGVyLWV2ZW50czogYXV0byAhaW1wb3J0YW50O1xyXG4gICAgfWAsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBMZWFmbGV0TWFwIGV4dGVuZHMgQWJzdHJhY3RNYXAgaW1wbGVtZW50cyBBZnRlclZpZXdDaGVja2VkIHtcclxuICBvcmlnaW5hbExhdExuZzogYW55O1xyXG4gIG9mZnNldERpc3RhbmNlID0gMC4wMDAwNDtcclxuICBjb25zdHJ1Y3RvcihlbDogRWxlbWVudFJlZiwgY2Q6IENoYW5nZURldGVjdG9yUmVmLCB6b25lOiBOZ1pvbmUpIHtcclxuICAgIHN1cGVyKGVsLCBjZCwgem9uZSwgY3JlYXRlTGVhZmxldE1hcEl0ZW0pO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLm1hcCAmJiB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQub2Zmc2V0UGFyZW50KSB7XHJcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0aWFsaXplKCk6IHZvaWQge1xyXG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuY3JlYXRlTGVhZmxldE1hcE9wdGlvbnMoKTtcclxuICAgIHRoaXMubWFwID0gTC5tYXAoJ2xlYWZsZXQnLCB7IHByZWZlckNhbnZhczogdHJ1ZSB9KS5zZXRWaWV3KG9wdGlvbnMuY2VudHJlLCBvcHRpb25zLnpvb20pO1xyXG4gICAgTC50aWxlTGF5ZXIoJ2h0dHBzOi8vdGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmcnLCB7XHJcbiAgICAgIG1heFpvb206IDE5LFxyXG4gICAgICBhdHRyaWJ1dGlvbjogJyZjb3B5OyA8YSBocmVmPVwiaHR0cDovL3d3dy5vcGVuc3RyZWV0bWFwLm9yZy9jb3B5cmlnaHRcIj5PcGVuU3RyZWV0TWFwPC9hPicsXHJcbiAgICB9KS5hZGRUbyh0aGlzLm1hcCk7XHJcblxyXG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLml0ZW1zKCk7XHJcbiAgICBjb25zdCB0b0FkZDogQXJyYXk8UmVjb3JkV2l0aElkPiA9IGl0ZW1zLm1hcCgoaXQpID0+ICh7XHJcbiAgICAgIGlkOiBpdC5pZCEsXHJcbiAgICAgIHJlY29yZDogY3JlYXRlTGVhZmxldE1hcEl0ZW0oaXQsIHsgY29sb3I6ICcjMzM4OGZmJywgZHJhZ2dhYmxlOiBmYWxzZSB9KSxcclxuICAgIH0pKTtcclxuICAgIHRoaXMuaGFuZGxlSXRlbUNoYW5nZXMoW10sIHRvQWRkKTtcclxuICAgIGNvbnN0IG1vZGVsID0gdGhpcy5tb2RlbCgpO1xyXG4gICAgaWYgKG1vZGVsLnZpZXdTdGF0ZT8uZml0VG9Jbml0aWFsSXRlbXMpIHtcclxuICAgICAgY29uc3QgZGF0YXNldEJvdW5kcyA9IHRoaXMuZmluZERhdGFzZXRCb3VuZHMoKTtcclxuICAgICAgaWYgKGRhdGFzZXRCb3VuZHMpIHtcclxuICAgICAgICBjb25zdCB7IGEsIGIgfSA9IGRhdGFzZXRCb3VuZHM7XHJcbiAgICAgICAgY29uc3QgcG50QSA9IEwubGF0TG5nKGEueCwgYS55KTtcclxuICAgICAgICBjb25zdCBwbnRCID0gTC5sYXRMbmcoYi54LCBiLnkpO1xyXG4gICAgICAgIGNvbnN0IGJvdW5kcyA9IEwubGF0TG5nQm91bmRzKHBudEEsIHBudEIpO1xyXG4gICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5tYXAuZml0Qm91bmRzKGJvdW5kcyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMubWFwLm9uKCdjbGljaycsIChldmVudDogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHBvcyA9IGV2ZW50LmxhdGxuZztcclxuICAgICAgICB0aGlzLm9uTWFwQ2xpY2suZW1pdCh7XHJcbiAgICAgICAgICBjb29yZGluYXRlczoge1xyXG4gICAgICAgICAgICBsYXRpdHVkZTogcG9zLmxhdCBhcyBudW1iZXIsXHJcbiAgICAgICAgICAgIGxvbmdpdHVkZTogcG9zLmxuZyBhcyBudW1iZXIsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZlbnQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5tYXAub24oJ21vdmVlbmQnLCAoZXZlbnQ6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcclxuICAgICAgICBjb25zdCB2aWV3cG9ydCA9IHRoaXMuZ2V0Vmlld3BvcnQoKTtcclxuICAgICAgICB0aGlzLm9uTWFwRHJhZ0VuZC5lbWl0KHtcclxuICAgICAgICAgIHZpZXdwb3J0LFxyXG4gICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZlbnQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5tYXAub24oJ3pvb21lbmQnLCAoZXZlbnQ6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcclxuICAgICAgICBjb25zdCB2aWV3cG9ydCA9IHRoaXMuZ2V0Vmlld3BvcnQoKTtcclxuICAgICAgICB0aGlzLm9uTWFwRHJhZ0VuZC5lbWl0KHtcclxuICAgICAgICAgIHZpZXdwb3J0LFxyXG4gICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZlbnQsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXRWaWV3cG9ydCgpOiBHZW9NYXBWaWV3cG9ydCB7XHJcbiAgICBpZiAoIXRoaXMubWFwKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWFwIGlzIG5vdCB5ZXQgaW5pdGlhbGlzZWQhJyk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY2VudGVyID0gdGhpcy5tYXAuZ2V0Q2VudGVyKCk7XHJcbiAgICBjb25zdCB6b29tTGV2ZWwgPSB0aGlzLm1hcC5nZXRab29tKCkgYXMgbnVtYmVyO1xyXG4gICAgY29uc3QgbGVhZmxldEJvdW5kcyA9IHRoaXMubWFwLmdldEJvdW5kcygpO1xyXG4gICAgY29uc3QgeyBsYXQ6IHN3TGF0LCBsbmc6IHN3TG5nIH0gPSBsZWFmbGV0Qm91bmRzLmdldFNvdXRoV2VzdCgpO1xyXG4gICAgY29uc3QgeyBsYXQ6IG5lTGF0LCBsbmc6IG5lTG5nIH0gPSBsZWFmbGV0Qm91bmRzLmdldE5vcnRoRWFzdCgpO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGNlbnRlcjoge1xyXG4gICAgICAgIGxhdGl0dWRlOiBjZW50ZXIubGF0IGFzIG51bWJlcixcclxuICAgICAgICBsb25naXR1ZGU6IGNlbnRlci5sbmcgYXMgbnVtYmVyLFxyXG4gICAgICB9LFxyXG4gICAgICB6b29tTGV2ZWwsXHJcbiAgICAgIGJvdW5kczogW1xyXG4gICAgICAgIHsgbGF0aXR1ZGU6IHN3TGF0LCBsb25naXR1ZGU6IHN3TG5nIH0sXHJcbiAgICAgICAgeyBsYXRpdHVkZTogbmVMYXQsIGxvbmdpdHVkZTogbmVMbmcgfSxcclxuICAgICAgXSxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUxlYWZsZXRNYXBPcHRpb25zKCk6IExlYWZsZXRNYXBPcHRpb25zIHtcclxuICAgIGNvbnN0IHZpZXdwb3J0OiBHZW9NYXBWaWV3cG9ydCA9IHRoaXMubW9kZWwoKS52aWV3cG9ydCE7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBjZW50cmU6IFt2aWV3cG9ydC5jZW50ZXIhLmxhdGl0dWRlLCB2aWV3cG9ydC5jZW50ZXIhLmxvbmdpdHVkZV0sXHJcbiAgICAgIHpvb206IHZpZXdwb3J0Lnpvb21MZXZlbCEsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgaGFuZGxlSXRlbUNoYW5nZXModG9SZW1vdmU6IEFycmF5PFJlY29yZFdpdGhJZD4sIHRvQWRkOiBBcnJheTxSZWNvcmRXaXRoSWQ+KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMubWFwKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IG1hcmtlckdyb3VwczogTWFwPHN0cmluZywgYW55W10+ID0gbmV3IE1hcCgpO1xyXG5cclxuICAgIHRvQWRkLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgaWYgKGl0ZW0ucmVjb3JkIGluc3RhbmNlb2YgTC5NYXJrZXIpIHtcclxuICAgICAgICBjb25zdCBrZXkgPVxyXG4gICAgICAgICAgaXRlbS5yZWNvcmQuZ2V0TGF0TG5nKCkubGF0LnRvRml4ZWQoNikgKyAnLCcgKyBpdGVtLnJlY29yZC5nZXRMYXRMbmcoKS5sbmcudG9GaXhlZCg2KTtcclxuICAgICAgICBpZiAoIW1hcmtlckdyb3Vwcy5nZXQoa2V5KSkge1xyXG4gICAgICAgICAgbWFya2VyR3JvdXBzLnNldChrZXksIFtdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbWFya2VyR3JvdXBzLmdldChrZXkpIS5wdXNoKGl0ZW0ucmVjb3JkKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdG9SZW1vdmUuZm9yRWFjaCgoaXQpID0+IHtcclxuICAgICAgaXQucmVjb3JkLnJlbW92ZSgpO1xyXG4gICAgICB0aGlzLm92ZXJsYXlzLmRlbGV0ZShpdC5pZCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0b0FkZC5mb3JFYWNoKChpdCwgaW5kZXgpID0+IHtcclxuICAgICAgbGV0IHJlY29yZCA9IGl0LnJlY29yZDtcclxuICAgICAgaWYgKHJlY29yZCBpbnN0YW5jZW9mIEwuTGF5ZXJHcm91cCkge1xyXG4gICAgICAgIE9iamVjdC52YWx1ZXMocmVjb3JkLl9sYXllcnMpLmZvckVhY2goKGF0OiBhbnkpID0+IHtcclxuICAgICAgICAgIGF0Lm9uKCdjbGljaycsIChldmVudDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMub25PdmVybGF5Q2xpY2suZW1pdCh7XHJcbiAgICAgICAgICAgICAgICBpdGVtSWQ6IGl0LmlkLFxyXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDoge1xyXG4gICAgICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBldmVudCxcclxuICAgICAgICAgICAgICAgICAgb3ZlcmxheTogaXQucmVjb3JkLFxyXG4gICAgICAgICAgICAgICAgICBtYXA6IHRoaXMubWFwLFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpdC5yZWNvcmQub24oJ2NsaWNrJywgKGV2ZW50OiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLm9uT3ZlcmxheUNsaWNrLmVtaXQoe1xyXG4gICAgICAgICAgICAgIGl0ZW1JZDogaXQuaWQsXHJcbiAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDoge1xyXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZlbnQsXHJcbiAgICAgICAgICAgICAgICBvdmVybGF5OiBpdC5yZWNvcmQsXHJcbiAgICAgICAgICAgICAgICBtYXA6IHRoaXMubWFwLFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGxldCBncm91cCA9IG1hcmtlckdyb3Vwcy5nZXQoXHJcbiAgICAgICAgICBpdC5yZWNvcmQuZ2V0TGF0TG5nKCkubGF0LnRvRml4ZWQoNikgKyAnLCcgKyBpdC5yZWNvcmQuZ2V0TGF0TG5nKCkubG5nLnRvRml4ZWQoNilcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChncm91cCAmJiBncm91cC5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICBjb25zdCBpY29uID0gdGhpcy5jcmVhdGVOdW1iZXJlZEljb24oZ3JvdXAubGVuZ3RoKTtcclxuICAgICAgICAgIGNvbnN0IGNsdXN0ZXJNYXJrZXIgPSBMLm1hcmtlcihncm91cFswXS5vcmlnaW5hbExhdExuZywgeyBpY29uIH0pLmFkZFRvKHRoaXMubWFwKTtcclxuICAgICAgICAgIGl0LnJlY29yZC5vbignbW91c2VvdmVyJywgKF9ldmVudDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHRvQWRkLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgaXRlbS5yZWNvcmQgaW5zdGFuY2VvZiBMLk1hcmtlciAmJlxyXG4gICAgICAgICAgICAgICAgaXRlbS5yZWNvcmQub3JpZ2luYWxMYXRMbmcubGF0ID09IGl0LnJlY29yZC5vcmlnaW5hbExhdExuZy5sYXQgJiZcclxuICAgICAgICAgICAgICAgIGl0ZW0ucmVjb3JkLm9yaWdpbmFsTGF0TG5nLmxuZyA9PSBpdC5yZWNvcmQub3JpZ2luYWxMYXRMbmcubG5nXHJcbiAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICBpdC5yZWNvcmQuc2V0WkluZGV4T2Zmc2V0KDEwMDApO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYW5nbGUgPSAoKDM2MCAvIHRvQWRkLmxlbmd0aCkgKiBpbmRleCAqIE1hdGguUEkpIC8gMTgwO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3TGF0ID1cclxuICAgICAgICAgICAgICAgICAgaXRlbS5yZWNvcmQub3JpZ2luYWxMYXRMbmcubGF0ICsgdGhpcy5vZmZzZXREaXN0YW5jZSAqIE1hdGguY29zKGFuZ2xlKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0xuZyA9XHJcbiAgICAgICAgICAgICAgICAgIGl0ZW0ucmVjb3JkLm9yaWdpbmFsTGF0TG5nLmxuZyArIHRoaXMub2Zmc2V0RGlzdGFuY2UgKiBNYXRoLnNpbihhbmdsZSk7XHJcbiAgICAgICAgICAgICAgICBpdGVtLnJlY29yZC5zZXRMYXRMbmcoW25ld0xhdCwgbmV3TG5nXSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgaWYgKHRoaXMubWFwLmhhc0xheWVyKGNsdXN0ZXJNYXJrZXIpKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5tYXAucmVtb3ZlTGF5ZXIoY2x1c3Rlck1hcmtlcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgaXQucmVjb3JkLm9uKCdtb3VzZW91dCcsIChfZXZlbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICB0b0FkZC5mb3JFYWNoKChpdGVtLCBfaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoaXRlbS5yZWNvcmQgaW5zdGFuY2VvZiBMLk1hcmtlcikge1xyXG4gICAgICAgICAgICAgICAgaXRlbS5yZWNvcmQuc2V0TGF0TG5nKGl0ZW0ucmVjb3JkLm9yaWdpbmFsTGF0TG5nKTtcclxuICAgICAgICAgICAgICAgIGl0LnJlY29yZC5zZXRaSW5kZXhPZmZzZXQoMCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLm1hcC5oYXNMYXllcihjbHVzdGVyTWFya2VyKSkge1xyXG4gICAgICAgICAgICAgIGNsdXN0ZXJNYXJrZXIuYWRkVG8odGhpcy5tYXApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaXQucmVjb3JkLmFkZFRvKHRoaXMubWFwKTtcclxuICAgICAgdGhpcy5vdmVybGF5cy5zZXQoaXQuaWQsIGl0LnJlY29yZCk7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgb3ZlcnJpZGUgaGFuZGxlRWRpdGluZ0l0ZW1DaGFuZ2VzKFxyXG4gICAgdG9SZW1vdmU6IEFycmF5PFJlY29yZFdpdGhJZD4sXHJcbiAgICB0b0FkZDogQXJyYXk8UmVjb3JkV2l0aElkPlxyXG4gICk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLm1hcCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdG9SZW1vdmUuZm9yRWFjaCgoaXQpID0+IHtcclxuICAgICAgaXQucmVjb3JkLnJlbW92ZSgpO1xyXG4gICAgICB0aGlzLmVkaXRpbmdPdmVybGF5cy5kZWxldGUoaXQuaWQpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdG9BZGQuZm9yRWFjaCgoaXQpID0+IHtcclxuICAgICAgbGV0IHJlY29yZCA9IGl0LnJlY29yZDtcclxuICAgICAgaWYgKHJlY29yZCBpbnN0YW5jZW9mIEwuTGF5ZXJHcm91cCkge1xyXG4gICAgICAgIE9iamVjdC52YWx1ZXMocmVjb3JkLl9sYXllcnMpLmZvckVhY2goKGF0OiBhbnkpID0+IHtcclxuICAgICAgICAgIGF0Lm9uKCdjbGljaycsIChldmVudDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMub25FZGl0aW5nT3ZlcmxheUNsaWNrLmVtaXQoe1xyXG4gICAgICAgICAgICAgICAgaXRlbUlkOiBpdC5pZCxcclxuICAgICAgICAgICAgICAgIGNvb3JkOiB7XHJcbiAgICAgICAgICAgICAgICAgIHg6IGV2ZW50LmxhdGxuZy5sbmcsXHJcbiAgICAgICAgICAgICAgICAgIHk6IGV2ZW50LmxhdGxuZy5sYXQsXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgYXQub24oJ2RyYWdzdGFydCcsIChldmVudDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMub3JpZ2luYWxMYXRMbmcgPSBldmVudC50YXJnZXQuZ2V0TGF0TG5nKCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIGF0Lm9uKCdkcmFnZW5kJywgKGV2ZW50OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5vbkVkaXRpbmdPdmVybGF5RHJhZy5lbWl0KHtcclxuICAgICAgICAgICAgICAgIGl0ZW1JZDogaXQuaWQsXHJcbiAgICAgICAgICAgICAgICBzdGFydFBvc2l0aW9uOiB7XHJcbiAgICAgICAgICAgICAgICAgIHg6IHRoaXMub3JpZ2luYWxMYXRMbmcubG5nLFxyXG4gICAgICAgICAgICAgICAgICB5OiB0aGlzLm9yaWdpbmFsTGF0TG5nLmxhdCxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBkcmFnVG86IHtcclxuICAgICAgICAgICAgICAgICAgeDogZXZlbnQudGFyZ2V0LmdldExhdExuZygpLmxuZyxcclxuICAgICAgICAgICAgICAgICAgeTogZXZlbnQudGFyZ2V0LmdldExhdExuZygpLmxhdCxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLm9yaWdpbmFsTGF0TG5nID0gbnVsbDtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGl0LnJlY29yZC5vbignY2xpY2snLCAoZXZlbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMub25FZGl0aW5nT3ZlcmxheUNsaWNrLmVtaXQoe1xyXG4gICAgICAgICAgICAgIGl0ZW1JZDogaXQuaWQsXHJcbiAgICAgICAgICAgICAgY29vcmQ6IHtcclxuICAgICAgICAgICAgICAgIHg6IGV2ZW50LmxhdGxuZy5sbmcsXHJcbiAgICAgICAgICAgICAgICB5OiBldmVudC5sYXRsbmcubGF0LFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGl0LnJlY29yZC5hZGRUbyh0aGlzLm1hcCk7XHJcbiAgICAgIHRoaXMuZWRpdGluZ092ZXJsYXlzLnNldChpdC5pZCwgaXQucmVjb3JkKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmaW5kRGF0YXNldEJvdW5kcygpOiB7IGE6IENvb3JkOyBiOiBDb29yZCB9IHwgbnVsbCB7XHJcbiAgICBjb25zdCBpdGVtczogQXJyYXk8Q29vcmQ+ID0gdGhpcy5pdGVtcygpXHJcbiAgICAgIC5mbGF0TWFwKChpdCkgPT4gKGl0LnBvc2l0aW9uID8gW2l0LnBvc2l0aW9uXSA6IGl0LnJvdXRlID8gaXQucm91dGUucG9pbnRzIDogW10pKVxyXG4gICAgICAubWFwKChpdCkgPT4ge1xyXG4gICAgICAgIHJldHVybiB7IHg6IGl0LmxhdGl0dWRlLCB5OiBpdC5sb25naXR1ZGUgfTtcclxuICAgICAgfSk7XHJcbiAgICBpZiAoIWl0ZW1zIHx8IGl0ZW1zLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgc291dGh3ZXN0OiBDb29yZCA9IHsgeDogaXRlbXNbMF0ueCwgeTogaXRlbXNbMF0ueSB9O1xyXG4gICAgbGV0IG5vcnRoZWFzdDogQ29vcmQgPSB7IHg6IGl0ZW1zWzBdLngsIHk6IGl0ZW1zWzBdLnkgfTtcclxuXHJcbiAgICBpdGVtcy5mb3JFYWNoKChpdCkgPT4ge1xyXG4gICAgICBpZiAoaXQueCA8IHNvdXRod2VzdC54KSBzb3V0aHdlc3QueCA9IGl0Lng7XHJcbiAgICAgIGlmIChpdC55IDwgc291dGh3ZXN0LnkpIHNvdXRod2VzdC55ID0gaXQueTtcclxuXHJcbiAgICAgIGlmIChpdC54ID4gbm9ydGhlYXN0LngpIG5vcnRoZWFzdC54ID0gaXQueDtcclxuICAgICAgaWYgKGl0LnkgPiBub3J0aGVhc3QueSkgbm9ydGhlYXN0LnkgPSBpdC55O1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHsgYTogc291dGh3ZXN0LCBiOiBub3J0aGVhc3QgfTtcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIHRvQmFzZTY0KCk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBsZWFmbGV0SW1hZ2UodGhpcy5tYXAsIChlcnI6IGFueSwgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCkgPT4ge1xyXG4gICAgICAgIGlmIChlcnIpIHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0xlYWZsZXQgaW1hZ2UgY2FwdHVyZSBlcnJvcicsIGVycik7XHJcbiAgICAgICAgICByZWplY3QoZXJyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVzb2x2ZShjYW52YXMudG9EYXRhVVJMKCdpbWFnZS9wbmcnKSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjcmVhdGVOdW1iZXJlZEljb24obnVtYmVyOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IHNpemUgPSAzNTtcclxuICAgIGNvbnN0IHNjYWxlRmFjdG9yID0gMTU7XHJcbiAgICBjb25zdCBzY2FsZWRTaXplID0gc2l6ZSAqIHNjYWxlRmFjdG9yO1xyXG5cclxuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xyXG4gICAgY2FudmFzLndpZHRoID0gc2NhbGVkU2l6ZTtcclxuICAgIGNhbnZhcy5oZWlnaHQgPSBzY2FsZWRTaXplO1xyXG4gICAgY2FudmFzLnN0eWxlLndpZHRoID0gY2FudmFzLnN0eWxlLmhlaWdodCA9ICczNXB4JztcclxuICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpITtcclxuICAgIGN0eC5zY2FsZShzY2FsZUZhY3Rvciwgc2NhbGVGYWN0b3IpO1xyXG5cclxuICAgIGN0eC5iZWdpblBhdGgoKTtcclxuICAgIGN0eC5hcmMoc2l6ZSAvIDIsIHNpemUgLyAyLCBzaXplIC8gMiAtIDIsIDAsIDIgKiBNYXRoLlBJLCBmYWxzZSk7XHJcbiAgICBjdHguZmlsbFN0eWxlID0gJyMwMDc4ZDQnO1xyXG4gICAgY3R4LmZpbGwoKTtcclxuICAgIGN0eC5saW5lV2lkdGggPSAyO1xyXG4gICAgY3R4LnN0cm9rZVN0eWxlID0gJyNmZmZmZmYnO1xyXG4gICAgY3R4LnN0cm9rZSgpO1xyXG5cclxuICAgIGN0eC5maWxsU3R5bGUgPSAnI2ZmZmZmZic7XHJcbiAgICBjdHguZm9udCA9ICdib2xkIDE2cHggc2Fucy1zZXJpZic7XHJcbiAgICBjdHgudGV4dEFsaWduID0gJ2NlbnRlcic7XHJcbiAgICBjdHgudGV4dEJhc2VsaW5lID0gJ21pZGRsZSc7XHJcbiAgICBjdHguZmlsbFRleHQobnVtYmVyLnRvU3RyaW5nKCksIHNpemUgLyAyLCBzaXplIC8gMik7XHJcblxyXG4gICAgcmV0dXJuIEwuaWNvbih7XHJcbiAgICAgIGljb25Vcmw6IGNhbnZhcy50b0RhdGFVUkwoKSxcclxuICAgICAgaWNvblNpemU6IFtzaXplLCBzaXplXSxcclxuICAgICAgaWNvbkFuY2hvcjogW3NpemUgLyAyLCBzaXplIC8gMl0sXHJcbiAgICAgIHBvcHVwQW5jaG9yOiBbMCwgLXNpemUgLyAyXSxcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
401
|
+
function getIcon(color) {
|
|
402
|
+
const size = 12;
|
|
403
|
+
const scaleFactor = 12;
|
|
404
|
+
const scaledSize = size * scaleFactor;
|
|
405
|
+
const canvas = document.createElement('canvas');
|
|
406
|
+
canvas.width = scaledSize;
|
|
407
|
+
canvas.height = scaledSize;
|
|
408
|
+
canvas.style.width = canvas.style.height = `${size}px`;
|
|
409
|
+
const ctx = canvas.getContext('2d');
|
|
410
|
+
ctx.scale(scaleFactor, scaleFactor);
|
|
411
|
+
ctx.beginPath();
|
|
412
|
+
ctx.arc(size / 2, size / 2, size / 2, 0, 2 * Math.PI, false);
|
|
413
|
+
ctx.fillStyle = color;
|
|
414
|
+
ctx.fill();
|
|
415
|
+
return L.icon({
|
|
416
|
+
iconUrl: canvas.toDataURL(),
|
|
417
|
+
iconSize: [size, size],
|
|
418
|
+
iconAnchor: [size / 2, size / 2],
|
|
419
|
+
popupAnchor: [0, -size / 2],
|
|
420
|
+
});
|
|
421
|
+
}
|
|
422
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGVhZmxldC1tYXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC1uZy1jbGllbnQvc3JjL2xpYi9zbWFydC1tYXAvaW1wbC9sZWFmbGV0LW1hcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXVDLFNBQVMsRUFBc0IsTUFBTSxlQUFlLENBQUM7QUFDbkcsT0FBTyxFQUFFLFdBQVcsRUFBZ0IsTUFBTSxpQkFBaUIsQ0FBQztBQUM1RCxPQUFPLEVBQWMsY0FBYyxFQUFrQixNQUFNLFFBQVEsQ0FBQzs7QUFZcEUsU0FBUyxvQkFBb0IsQ0FBQyxJQUFnQixFQUFFLE1BQTRCO0lBQzFFLFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2xCLEtBQUssY0FBYyxDQUFDLE1BQU07WUFDeEIsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFTLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFTLENBQUMsU0FBUyxDQUFDLEVBQUU7Z0JBQ2pGLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUzthQUM1QixDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7Z0JBQ3pCLFNBQVMsRUFBRSxLQUFLO2dCQUNoQixTQUFTLEVBQUUsTUFBTTthQUNsQixDQUFDLENBQUM7WUFDSCxNQUFNLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDdkYsT0FBTyxNQUFNLENBQUM7UUFDaEIsS0FBSyxjQUFjLENBQUMsT0FBTztZQUN6QixNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxLQUFNLENBQUMsTUFBTSxDQUFDO1lBQzlDLE9BQU8sQ0FB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TUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNoRCxNQUFNLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQztJQUMxQixNQUFNLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQztJQUMzQixNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLElBQUksSUFBSSxDQUFDO0lBQ3ZELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFFLENBQUM7SUFDckMsR0FBRyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFFcEMsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ2hCLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzdELEdBQUcsQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ3RCLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUVYLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNaLE9BQU8sRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFO1FBQzNCLFFBQVEsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUM7UUFDdEIsVUFBVSxFQUFFLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ2hDLFdBQVcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7S0FDNUIsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0NoZWNrZWQsIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIE5nWm9uZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBBYnN0cmFjdE1hcCwgUmVjb3JkV2l0aElkIH0gZnJvbSAnLi4vYWJzdHJhY3QtbWFwJztcclxuaW1wb3J0IHsgR2VvTWFwSXRlbSwgR2VvTWFwSXRlbUtpbmQsIEdlb01hcFZpZXdwb3J0IH0gZnJvbSAnLi4vYXBpJztcclxuaW1wb3J0IHsgQ29vcmQsIE1hcEl0ZW1Db25maWd1cmF0aW9uIH0gZnJvbSAnLi4vc21hcnQtbWFwLnR5cGVzJztcclxuaW1wb3J0IHsgSSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9rZXljb2Rlcyc7XHJcblxyXG5kZWNsYXJlIHZhciBMOiBhbnk7XHJcbmRlY2xhcmUgY29uc3QgbGVhZmxldEltYWdlOiBhbnk7XHJcblxyXG5pbnRlcmZhY2UgTGVhZmxldE1hcE9wdGlvbnMge1xyXG4gIGNlbnRyZTogQXJyYXk8bnVtYmVyPjtcclxuICB6b29tOiBudW1iZXI7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZUxlYWZsZXRNYXBJdGVtKGl0ZW06IEdlb01hcEl0ZW0sIGNvbmZpZzogTWFwSXRlbUNvbmZpZ3VyYXRpb24pOiBhbnkge1xyXG4gIHN3aXRjaCAoaXRlbS5raW5kKSB7XHJcbiAgICBjYXNlIEdlb01hcEl0ZW1LaW5kLk1BUktFUjpcclxuICAgICAgbGV0IG1hcmtlciA9IEwubWFya2VyKEwubGF0TG5nKGl0ZW0ucG9zaXRpb24hLmxhdGl0dWRlLCBpdGVtLnBvc2l0aW9uIS5sb25naXR1ZGUpLCB7XHJcbiAgICAgICAgZHJhZ2dhYmxlOiBjb25maWcuZHJhZ2dhYmxlLFxyXG4gICAgICB9KS5iaW5kVG9vbHRpcChpdGVtLmxhYmVsLCB7XHJcbiAgICAgICAgcGVybWFuZW50OiBmYWxzZSxcclxuICAgICAgICBkaXJlY3Rpb246ICdhdXRvJyxcclxuICAgICAgfSk7XHJcbiAgICAgIG1hcmtlci5vcmlnaW5hbExhdExuZyA9IEwubGF0TG5nKGl0ZW0ucG9zaXRpb24hLmxhdGl0dWRlLCBpdGVtLnBvc2l0aW9uIS5sb25naXR1ZGUpOyAvL1xyXG4gICAgICByZXR1cm4gbWFya2VyO1xyXG4gICAgY2FzZSBHZW9NYXBJdGVtS2luZC5QT0xZR09OOlxyXG4gICAgICBjb25zdCBwb2x5Z29uUm91dGVQb2ludHMgPSBpdGVtLnJvdXRlIS5wb2ludHM7XHJcbiAgICAgIHJldHVybiBMLmxheWVyR3JvdXAoW1xyXG4gICAgICAgIEwucG9seWdvbihcclxuICAgICAgICAgIHBvbHlnb25Sb3V0ZVBvaW50cy5tYXAoKHApID0+IFtwLmxhdGl0dWRlLCBwLmxvbmdpdHVkZV0pLFxyXG4gICAgICAgICAgeyB0aXRsZTogaXRlbS5sYWJlbCwgY29sb3I6IGNvbmZpZy5jb2xvciB9XHJcbiAgICAgICAgKSxcclxuICAgICAgICAuLi5wb2x5Z29uUm91dGVQb2ludHMubWFwKChwKSA9PlxyXG4gICAgICAgICAgTC5tYXJrZXIoW3AubGF0aXR1ZGUsIHAubG9uZ2l0dWRlXSwge1xyXG4gICAgICAgICAgICB0aXRsZTogaXRlbS5sYWJlbCxcclxuICAgICAgICAgICAgbWFya2VyQ29sb3I6IGNvbmZpZy5jb2xvcixcclxuICAgICAgICAgICAgZHJhZ2dhYmxlOiBjb25maWcuZHJhZ2dhYmxlLFxyXG4gICAgICAgICAgICBpY29uOiBnZXRJY29uKGNvbmZpZy5jb2xvciksXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICksXHJcbiAgICAgIF0pO1xyXG4gICAgY2FzZSBHZW9NYXBJdGVtS2luZC5MSU5FOlxyXG4gICAgICBjb25zdCBsaW5lUm91dGVQb2ludHMgPSBpdGVtLnJvdXRlIS5wb2ludHM7XHJcblxyXG4gICAgICByZXR1cm4gTC5sYXllckdyb3VwKFtcclxuICAgICAgICBMLnBvbHlsaW5lKFxyXG4gICAgICAgICAgbGluZVJvdXRlUG9pbnRzLm1hcCgocCkgPT4gW3AubGF0aXR1ZGUsIHAubG9uZ2l0dWRlXSksXHJcbiAgICAgICAgICB7IHRpdGxlOiBpdGVtLmxhYmVsLCBjb2xvcjogY29uZmlnLmNvbG9yIH1cclxuICAgICAgICApLFxyXG4gICAgICAgIC4uLmxpbmVSb3V0ZVBvaW50cy5tYXAoKHApID0+XHJcbiAgICAgICAgICBMLm1hcmtlcihbcC5sYXRpdHVkZSwgcC5sb25naXR1ZGVdLCB7XHJcbiAgICAgICAgICAgIHRpdGxlOiBpdGVtLmxhYmVsLFxyXG4gICAgICAgICAgICBjb2xvcjogY29uZmlnLmNvbG9yLFxyXG4gICAgICAgICAgICBkcmFnZ2FibGU6IGNvbmZpZy5kcmFnZ2FibGUsXHJcbiAgICAgICAgICAgIGljb246IGdldEljb24oY29uZmlnLmNvbG9yKSxcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgKSxcclxuICAgICAgXSk7XHJcbiAgfVxyXG4gIHRocm93IG5ldyBFcnJvcignRm9vIScpO1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xlYWZsZXQtbWFwJyxcclxuICB0ZW1wbGF0ZTogYCA8ZGl2IGlkPVwibGVhZmxldFwiPjwvZGl2PmAsXHJcbiAgc3R5bGVzOiBgXHJcbiAgICAgICNsZWFmbGV0IHtcclxuICAgICAgICAgIGhlaWdodDogNzIwcHg7XHJcbiAgICAgIH1cclxuICAgICA6Om5nLWRlZXAgLm1hcmtlci1jb3VudCB7XHJcbiAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDA3OGQ0O1xyXG4gICAgICAgICAgY29sb3I6IHdoaXRlO1xyXG4gICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbiAgICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7XHJcbiAgICAgICAgICB3aWR0aDogMzBweDtcclxuICAgICAgICAgIGhlaWdodDogMzBweDtcclxuICAgICAgICAgIGxpbmUtaGVpZ2h0OiAzMHB4O1xyXG4gICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgICAgICAgYm9yZGVyOiAycHggc29saWQgd2hpdGU7XHJcbiAgICAgICAgICBib3gtc2hhZG93OiAwIDAgNHB4IHJnYmEoMCwwLDAsMC40KTtcclxuICAgIH1cclxuICAgICA6Om5nLWRlZXAgLmN1c3RvbS1jbHVzdGVyLWljb24ge1xyXG4gICAgICAgICAgcG9pbnRlci1ldmVudHM6IGF1dG8gIWltcG9ydGFudDtcclxuICAgIH1gLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTGVhZmxldE1hcCBleHRlbmRzIEFic3RyYWN0TWFwIGltcGxlbWVudHMgQWZ0ZXJWaWV3Q2hlY2tlZCB7XHJcbiAgb3JpZ2luYWxMYXRMbmc6IGFueTtcclxuICBvZmZzZXREaXN0YW5jZSA9IDAuMDAwMDQ7XHJcbiAgbWFya2VyczogYW55ID0gW107XHJcbiAgY29uc3RydWN0b3IoZWw6IEVsZW1lbnRSZWYsIGNkOiBDaGFuZ2VEZXRlY3RvclJlZiwgem9uZTogTmdab25lKSB7XHJcbiAgICBzdXBlcihlbCwgY2QsIHpvbmUsIGNyZWF0ZUxlYWZsZXRNYXBJdGVtKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5tYXAgJiYgdGhpcy5lbC5uYXRpdmVFbGVtZW50Lm9mZnNldFBhcmVudCkge1xyXG4gICAgICB0aGlzLmluaXRpYWxpemUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdGlhbGl6ZSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmNyZWF0ZUxlYWZsZXRNYXBPcHRpb25zKCk7XHJcbiAgICB0aGlzLm1hcCA9IEwubWFwKCdsZWFmbGV0JywgeyBwcmVmZXJDYW52YXM6IHRydWUgfSkuc2V0VmlldyhvcHRpb25zLmNlbnRyZSwgb3B0aW9ucy56b29tKTtcclxuICAgIEwudGlsZUxheWVyKCdodHRwczovL3RpbGUub3BlbnN0cmVldG1hcC5vcmcve3p9L3t4fS97eX0ucG5nJywge1xyXG4gICAgICBtYXhab29tOiAxOSxcclxuICAgICAgYXR0cmlidXRpb246ICcmY29weTsgPGEgaHJlZj1cImh0dHA6Ly93d3cub3BlbnN0cmVldG1hcC5vcmcvY29weXJpZ2h0XCI+T3BlblN0cmVldE1hcDwvYT4nLFxyXG4gICAgfSkuYWRkVG8odGhpcy5tYXApO1xyXG5cclxuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5pdGVtcygpO1xyXG4gICAgY29uc3QgdG9BZGQ6IEFycmF5PFJlY29yZFdpdGhJZD4gPSBpdGVtcy5tYXAoKGl0KSA9PiAoe1xyXG4gICAgICBpZDogaXQuaWQhLFxyXG4gICAgICByZWNvcmQ6IGNyZWF0ZUxlYWZsZXRNYXBJdGVtKGl0LCB7IGNvbG9yOiAnIzMzODhmZicsIGRyYWdnYWJsZTogZmFsc2UgfSksXHJcbiAgICB9KSk7XHJcbiAgICB0aGlzLmhhbmRsZUl0ZW1DaGFuZ2VzKFtdLCB0b0FkZCk7XHJcbiAgICBjb25zdCBtb2RlbCA9IHRoaXMubW9kZWwoKTtcclxuICAgIGlmIChtb2RlbC52aWV3U3RhdGU/LmZpdFRvSW5pdGlhbEl0ZW1zKSB7XHJcbiAgICAgIGNvbnN0IGRhdGFzZXRCb3VuZHMgPSB0aGlzLmZpbmREYXRhc2V0Qm91bmRzKCk7XHJcbiAgICAgIGlmIChkYXRhc2V0Qm91bmRzKSB7XHJcbiAgICAgICAgY29uc3QgeyBhLCBiIH0gPSBkYXRhc2V0Qm91bmRzO1xyXG4gICAgICAgIGNvbnN0IHBudEEgPSBMLmxhdExuZyhhLngsIGEueSk7XHJcbiAgICAgICAgY29uc3QgcG50QiA9IEwubGF0TG5nKGIueCwgYi55KTtcclxuICAgICAgICBjb25zdCBib3VuZHMgPSBMLmxhdExuZ0JvdW5kcyhwbnRBLCBwbnRCKTtcclxuICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcclxuICAgICAgICAgIHRoaXMubWFwLmZpdEJvdW5kcyhib3VuZHMpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLm1hcC5vbignY2xpY2snLCAoZXZlbnQ6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcclxuICAgICAgICBjb25zdCBwb3MgPSBldmVudC5sYXRsbmc7XHJcbiAgICAgICAgdGhpcy5vbk1hcENsaWNrLmVtaXQoe1xyXG4gICAgICAgICAgY29vcmRpbmF0ZXM6IHtcclxuICAgICAgICAgICAgbGF0aXR1ZGU6IHBvcy5sYXQgYXMgbnVtYmVyLFxyXG4gICAgICAgICAgICBsb25naXR1ZGU6IHBvcy5sbmcgYXMgbnVtYmVyLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2ZW50LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMubWFwLm9uKCdtb3ZlZW5kJywgKGV2ZW50OiBhbnkpID0+IHtcclxuICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgY29uc3Qgdmlld3BvcnQgPSB0aGlzLmdldFZpZXdwb3J0KCk7XHJcbiAgICAgICAgdGhpcy5vbk1hcERyYWdFbmQuZW1pdCh7XHJcbiAgICAgICAgICB2aWV3cG9ydCxcclxuICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2ZW50LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMubWFwLm9uKCd6b29tZW5kJywgKGV2ZW50OiBhbnkpID0+IHtcclxuICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgY29uc3Qgdmlld3BvcnQgPSB0aGlzLmdldFZpZXdwb3J0KCk7XHJcbiAgICAgICAgdGhpcy5vbk1hcERyYWdFbmQuZW1pdCh7XHJcbiAgICAgICAgICB2aWV3cG9ydCxcclxuICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2ZW50LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0Vmlld3BvcnQoKTogR2VvTWFwVmlld3BvcnQge1xyXG4gICAgaWYgKCF0aGlzLm1hcCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01hcCBpcyBub3QgeWV0IGluaXRpYWxpc2VkIScpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNlbnRlciA9IHRoaXMubWFwLmdldENlbnRlcigpO1xyXG4gICAgY29uc3Qgem9vbUxldmVsID0gdGhpcy5tYXAuZ2V0Wm9vbSgpIGFzIG51bWJlcjtcclxuICAgIGNvbnN0IGxlYWZsZXRCb3VuZHMgPSB0aGlzLm1hcC5nZXRCb3VuZHMoKTtcclxuICAgIGNvbnN0IHsgbGF0OiBzd0xhdCwgbG5nOiBzd0xuZyB9ID0gbGVhZmxldEJvdW5kcy5nZXRTb3V0aFdlc3QoKTtcclxuICAgIGNvbnN0IHsgbGF0OiBuZUxhdCwgbG5nOiBuZUxuZyB9ID0gbGVhZmxldEJvdW5kcy5nZXROb3J0aEVhc3QoKTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBjZW50ZXI6IHtcclxuICAgICAgICBsYXRpdHVkZTogY2VudGVyLmxhdCBhcyBudW1iZXIsXHJcbiAgICAgICAgbG9uZ2l0dWRlOiBjZW50ZXIubG5nIGFzIG51bWJlcixcclxuICAgICAgfSxcclxuICAgICAgem9vbUxldmVsLFxyXG4gICAgICBib3VuZHM6IFtcclxuICAgICAgICB7IGxhdGl0dWRlOiBzd0xhdCwgbG9uZ2l0dWRlOiBzd0xuZyB9LFxyXG4gICAgICAgIHsgbGF0aXR1ZGU6IG5lTGF0LCBsb25naXR1ZGU6IG5lTG5nIH0sXHJcbiAgICAgIF0sXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVMZWFmbGV0TWFwT3B0aW9ucygpOiBMZWFmbGV0TWFwT3B0aW9ucyB7XHJcbiAgICBjb25zdCB2aWV3cG9ydDogR2VvTWFwVmlld3BvcnQgPSB0aGlzLm1vZGVsKCkudmlld3BvcnQhO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgY2VudHJlOiBbdmlld3BvcnQuY2VudGVyIS5sYXRpdHVkZSwgdmlld3BvcnQuY2VudGVyIS5sb25naXR1ZGVdLFxyXG4gICAgICB6b29tOiB2aWV3cG9ydC56b29tTGV2ZWwhLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIGhhbmRsZUl0ZW1DaGFuZ2VzKHRvUmVtb3ZlOiBBcnJheTxSZWNvcmRXaXRoSWQ+LCB0b0FkZDogQXJyYXk8UmVjb3JkV2l0aElkPik6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLm1hcCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLm1hcmtlcnMgPSBbXTtcclxuICAgIGNvbnN0IG1hcmtlckdyb3VwczogTWFwPHN0cmluZywgYW55W10+ID0gbmV3IE1hcCgpO1xyXG5cclxuICAgIHRvQWRkLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgaWYgKGl0ZW0ucmVjb3JkIGluc3RhbmNlb2YgTC5NYXJrZXIpIHtcclxuICAgICAgICBjb25zdCBrZXkgPVxyXG4gICAgICAgICAgaXRlbS5yZWNvcmQuZ2V0TGF0TG5nKCkubGF0LnRvRml4ZWQoNikgKyAnLCcgKyBpdGVtLnJlY29yZC5nZXRMYXRMbmcoKS5sbmcudG9GaXhlZCg2KTtcclxuICAgICAgICBpZiAoIW1hcmtlckdyb3Vwcy5nZXQoa2V5KSkge1xyXG4gICAgICAgICAgbWFya2VyR3JvdXBzLnNldChrZXksIFtdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbWFya2VyR3JvdXBzLmdldChrZXkpIS5wdXNoKGl0ZW0ucmVjb3JkKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdG9SZW1vdmUuZm9yRWFjaCgoaXQpID0+IHtcclxuICAgICAgaXQucmVjb3JkLnJlbW92ZSgpO1xyXG4gICAgICB0aGlzLm92ZXJsYXlzLmRlbGV0ZShpdC5pZCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0b0FkZC5mb3JFYWNoKChpdCwgaW5kZXgpID0+IHtcclxuICAgICAgbGV0IHJlY29yZCA9IGl0LnJlY29yZDtcclxuICAgICAgaWYgKHJlY29yZCBpbnN0YW5jZW9mIEwuTGF5ZXJHcm91cCkge1xyXG4gICAgICAgIE9iamVjdC52YWx1ZXMocmVjb3JkLl9sYXllcnMpLmZvckVhY2goKGF0OiBhbnkpID0+IHtcclxuICAgICAgICAgIGF0Lm9uKCdjbGljaycsIChldmVudDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMub25PdmVybGF5Q2xpY2suZW1pdCh7XHJcbiAgICAgICAgICAgICAgICBpdGVtSWQ6IGl0LmlkLFxyXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDoge1xyXG4gICAgICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBldmVudCxcclxuICAgICAgICAgICAgICAgICAgb3ZlcmxheTogaXQucmVjb3JkLFxyXG4gICAgICAgICAgICAgICAgICBtYXA6IHRoaXMubWFwLFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpdC5yZWNvcmQub24oJ2NsaWNrJywgKGV2ZW50OiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLm9uT3ZlcmxheUNsaWNrLmVtaXQoe1xyXG4gICAgICAgICAgICAgIGl0ZW1JZDogaXQuaWQsXHJcbiAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDoge1xyXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZlbnQsXHJcbiAgICAgICAgICAgICAgICBvdmVybGF5OiBpdC5yZWNvcmQsXHJcbiAgICAgICAgICAgICAgICBtYXA6IHRoaXMubWFwLFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGxldCBncm91cCA9IG1hcmtlckdyb3Vwcy5nZXQoXHJcbiAgICAgICAgICBpdC5yZWNvcmQuZ2V0TGF0TG5nKCkubGF0LnRvRml4ZWQoNikgKyAnLCcgKyBpdC5yZWNvcmQuZ2V0TGF0TG5nKCkubG5nLnRvRml4ZWQoNilcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChncm91cCAmJiBncm91cC5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICBjb25zdCBpY29uID0gdGhpcy5jcmVhdGVOdW1iZXJlZEljb24oZ3JvdXAubGVuZ3RoKTtcclxuICAgICAgICAgIGNvbnN0IGxhYmVsID0gdGhpcy5jcmVhdGVMYWJlbChncm91cCk7XHJcbiAgICAgICAgICBjb25zdCBleHRyYU1hcmtlciA9IEwubWFya2VyKGdyb3VwWzBdLm9yaWdpbmFsTGF0TG5nLCB7IGljb24gfSk7XHJcblxyXG4gICAgICAgICAgaWYgKCFleHRyYU1hcmtlci5fdG9vbHRpcCkge1xyXG4gICAgICAgICAgICBleHRyYU1hcmtlci5iaW5kVG9vbHRpcChsYWJlbCwge1xyXG4gICAgICAgICAgICAgIHBlcm1hbmVudDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgZGlyZWN0aW9uOiAnYXV0bycsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLm1hcmtlcnMucHVzaChleHRyYU1hcmtlcik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjb25zdCBjbHVzdGVyTWFya2VyID0gZXh0cmFNYXJrZXIuYWRkVG8odGhpcy5tYXApO1xyXG4gICAgICAgICAgaXQucmVjb3JkLm9uKCdtb3VzZW92ZXInLCAoX2V2ZW50OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgdG9BZGQuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICBpdGVtLnJlY29yZCBpbnN0YW5jZW9mIEwuTWFya2VyICYmXHJcbiAgICAgICAgICAgICAgICBpdGVtLnJlY29yZC5vcmlnaW5hbExhdExuZy5sYXQgPT0gaXQucmVjb3JkLm9yaWdpbmFsTGF0TG5nLmxhdCAmJlxyXG4gICAgICAgICAgICAgICAgaXRlbS5yZWNvcmQub3JpZ2luYWxMYXRMbmcubG5nID09IGl0LnJlY29yZC5vcmlnaW5hbExhdExuZy5sbmdcclxuICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIGl0LnJlY29yZC5zZXRaSW5kZXhPZmZzZXQoMTAwMCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBhbmdsZSA9ICgoMzYwIC8gdG9BZGQubGVuZ3RoKSAqIGluZGV4ICogTWF0aC5QSSkgLyAxODA7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdMYXQgPVxyXG4gICAgICAgICAgICAgICAgICBpdGVtLnJlY29yZC5vcmlnaW5hbExhdExuZy5sYXQgKyB0aGlzLm9mZnNldERpc3RhbmNlICogTWF0aC5jb3MoYW5nbGUpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3TG5nID1cclxuICAgICAgICAgICAgICAgICAgaXRlbS5yZWNvcmQub3JpZ2luYWxMYXRMbmcubG5nICsgdGhpcy5vZmZzZXREaXN0YW5jZSAqIE1hdGguc2luKGFuZ2xlKTtcclxuICAgICAgICAgICAgICAgIGl0ZW0ucmVjb3JkLnNldExhdExuZyhbbmV3TGF0LCBuZXdMbmddKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5tYXAuaGFzTGF5ZXIoY2x1c3Rlck1hcmtlcikpIHtcclxuICAgICAgICAgICAgICB0aGlzLm1hcC5yZW1vdmVMYXllcihjbHVzdGVyTWFya2VyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBpdC5yZWNvcmQub24oJ21vdXNlb3V0JywgKF9ldmVudDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHRvQWRkLmZvckVhY2goKGl0ZW0sIF9pbmRleCkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChpdGVtLnJlY29yZCBpbnN0YW5jZW9mIEwuTWFya2VyKSB7XHJcbiAgICAgICAgICAgICAgICBpdGVtLnJlY29yZC5zZXRMYXRMbmcoaXRlbS5yZWNvcmQub3JpZ2luYWxMYXRMbmcpO1xyXG4gICAgICAgICAgICAgICAgaXQucmVjb3JkLnNldFpJbmRleE9mZnNldCgwKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMubWFwLmhhc0xheWVyKGNsdXN0ZXJNYXJrZXIpKSB7XHJcbiAgICAgICAgICAgICAgY2x1c3Rlck1hcmtlci5hZGRUbyh0aGlzLm1hcCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLm1hcmtlcnMucHVzaChpdC5yZWNvcmQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpdC5yZWNvcmQuYWRkVG8odGhpcy5tYXApO1xyXG4gICAgICB0aGlzLm92ZXJsYXlzLnNldChpdC5pZCwgaXQucmVjb3JkKTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBvdmVycmlkZSBoYW5kbGVFZGl0aW5nSXRlbUNoYW5nZXMoXHJcbiAgICB0b1JlbW92ZTogQXJyYXk8UmVjb3JkV2l0aElkPixcclxuICAgIHRvQWRkOiBBcnJheTxSZWNvcmRXaXRoSWQ+XHJcbiAgKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMubWFwKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0b1JlbW92ZS5mb3JFYWNoKChpdCkgPT4ge1xyXG4gICAgICBpdC5yZWNvcmQucmVtb3ZlKCk7XHJcbiAgICAgIHRoaXMuZWRpdGluZ092ZXJsYXlzLmRlbGV0ZShpdC5pZCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0b0FkZC5mb3JFYWNoKChpdCkgPT4ge1xyXG4gICAgICBsZXQgcmVjb3JkID0gaXQucmVjb3JkO1xyXG4gICAgICBpZiAocmVjb3JkIGluc3RhbmNlb2YgTC5MYXllckdyb3VwKSB7XHJcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhyZWNvcmQuX2xheWVycykuZm9yRWFjaCgoYXQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgYXQub24oJ2NsaWNrJywgKGV2ZW50OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5vbkVkaXRpbmdPdmVybGF5Q2xpY2suZW1pdCh7XHJcbiAgICAgICAgICAgICAgICBpdGVtSWQ6IGl0LmlkLFxyXG4gICAgICAgICAgICAgICAgY29vcmQ6IHtcclxuICAgICAgICAgICAgICAgICAgeDogZXZlbnQubGF0bG5nLmxuZyxcclxuICAgICAgICAgICAgICAgICAgeTogZXZlbnQubGF0bG5nLmxhdCxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBhdC5vbignZHJhZ3N0YXJ0JywgKGV2ZW50OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5vcmlnaW5hbExhdExuZyA9IGV2ZW50LnRhcmdldC5nZXRMYXRMbmcoKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgYXQub24oJ2RyYWdlbmQnLCAoZXZlbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLm9uRWRpdGluZ092ZXJsYXlEcmFnLmVtaXQoe1xyXG4gICAgICAgICAgICAgICAgaXRlbUlkOiBpdC5pZCxcclxuICAgICAgICAgICAgICAgIHN0YXJ0UG9zaXRpb246IHtcclxuICAgICAgICAgICAgICAgICAgeDogdGhpcy5vcmlnaW5hbExhdExuZy5sbmcsXHJcbiAgICAgICAgICAgICAgICAgIHk6IHRoaXMub3JpZ2luYWxMYXRMbmcubGF0LFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGRyYWdUbzoge1xyXG4gICAgICAgICAgICAgICAgICB4OiBldmVudC50YXJnZXQuZ2V0TGF0TG5nKCkubG5nLFxyXG4gICAgICAgICAgICAgICAgICB5OiBldmVudC50YXJnZXQuZ2V0TGF0TG5nKCkubGF0LFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMub3JpZ2luYWxMYXRMbmcgPSBudWxsO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaXQucmVjb3JkLm9uKCdjbGljaycsIChldmVudDogYW55KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5vbkVkaXRpbmdPdmVybGF5Q2xpY2suZW1pdCh7XHJcbiAgICAgICAgICAgICAgaXRlbUlkOiBpdC5pZCxcclxuICAgICAgICAgICAgICBjb29yZDoge1xyXG4gICAgICAgICAgICAgICAgeDogZXZlbnQubGF0bG5nLmxuZyxcclxuICAgICAgICAgICAgICAgIHk6IGV2ZW50LmxhdGxuZy5sYXQsXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaXQucmVjb3JkLmFkZFRvKHRoaXMubWFwKTtcclxuICAgICAgdGhpcy5lZGl0aW5nT3ZlcmxheXMuc2V0KGl0LmlkLCBpdC5yZWNvcmQpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZpbmREYXRhc2V0Qm91bmRzKCk6IHsgYTogQ29vcmQ7IGI6IENvb3JkIH0gfCBudWxsIHtcclxuICAgIGNvbnN0IGl0ZW1zOiBBcnJheTxDb29yZD4gPSB0aGlzLml0ZW1zKClcclxuICAgICAgLmZsYXRNYXAoKGl0KSA9PiAoaXQucG9zaXRpb24gPyBbaXQucG9zaXRpb25dIDogaXQucm91dGUgPyBpdC5yb3V0ZS5wb2ludHMgOiBbXSkpXHJcbiAgICAgIC5tYXAoKGl0KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHsgeDogaXQubGF0aXR1ZGUsIHk6IGl0LmxvbmdpdHVkZSB9O1xyXG4gICAgICB9KTtcclxuICAgIGlmICghaXRlbXMgfHwgaXRlbXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBzb3V0aHdlc3Q6IENvb3JkID0geyB4OiBpdGVtc1swXS54LCB5OiBpdGVtc1swXS55IH07XHJcbiAgICBsZXQgbm9ydGhlYXN0OiBDb29yZCA9IHsgeDogaXRlbXNbMF0ueCwgeTogaXRlbXNbMF0ueSB9O1xyXG5cclxuICAgIGl0ZW1zLmZvckVhY2goKGl0KSA9PiB7XHJcbiAgICAgIGlmIChpdC54IDwgc291dGh3ZXN0LngpIHNvdXRod2VzdC54ID0gaXQueDtcclxuICAgICAgaWYgKGl0LnkgPCBzb3V0aHdlc3QueSkgc291dGh3ZXN0LnkgPSBpdC55O1xyXG5cclxuICAgICAgaWYgKGl0LnggPiBub3J0aGVhc3QueCkgbm9ydGhlYXN0LnggPSBpdC54O1xyXG4gICAgICBpZiAoaXQueSA+IG5vcnRoZWFzdC55KSBub3J0aGVhc3QueSA9IGl0Lnk7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4geyBhOiBzb3V0aHdlc3QsIGI6IG5vcnRoZWFzdCB9O1xyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgdG9CYXNlNjQoKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGxlYWZsZXRJbWFnZSh0aGlzLm1hcCwgKGVycjogYW55LCBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50KSA9PiB7XHJcbiAgICAgICAgICBpZiAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0xlYWZsZXQgaW1hZ2UgY2FwdHVyZSBlcnJvcicsIGVycik7XHJcbiAgICAgICAgICAgIHJlamVjdChlcnIpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XHJcbiAgICAgICAgICBpZiAoIWN0eCkge1xyXG4gICAgICAgICAgICByZWplY3QoJ05vIGNvbnRleHQnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMubWFya2Vycy5mb3JFYWNoKChtYXJrZXI6IHsgZ2V0VG9vbHRpcDogKCkgPT4gYW55OyBnZXRMYXRMbmc6ICgpID0+IGFueSB9KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRvb2x0aXAgPSBtYXJrZXIuZ2V0VG9vbHRpcCgpO1xyXG4gICAgICAgICAgICBpZiAoIXRvb2x0aXApIHtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgbGF0TG5nID0gbWFya2VyLmdldExhdExuZygpO1xyXG4gICAgICAgICAgICBjb25zdCBwb2ludCA9IHRoaXMubWFwLmxhdExuZ1RvQ29udGFpbmVyUG9pbnQobGF0TG5nKTtcclxuICAgICAgICAgICAgY29uc3QgdGV4dCA9IHRvb2x0aXAuZ2V0Q29udGVudCgpO1xyXG5cclxuICAgICAgICAgICAgLy8gVG9vbHRpcCBzesO2dmVnIG1lZ2plbGVuw610w6lzZVxyXG4gICAgICAgICAgICBjdHguZm9udCA9ICdib2xkIDE0cHggc2Fucy1zZXJpZic7XHJcbiAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSAnYmxhY2snO1xyXG4gICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSAnd2hpdGUnO1xyXG4gICAgICAgICAgICBjdHgubGluZVdpZHRoID0gNDtcclxuICAgICAgICAgICAgY3R4LnRleHRBbGlnbiA9ICdjZW50ZXInO1xyXG4gICAgICAgICAgICBjdHgudGV4dEJhc2VsaW5lID0gJ2JvdHRvbSc7XHJcbiAgICAgICAgICAgIGN0eC5zdHJva2VUZXh0KHRleHQsIHBvaW50LngsIHBvaW50LnkgKyAxMCk7IC8vIGZlaMOpciBrb250w7pyXHJcbiAgICAgICAgICAgIGN0eC5maWxsVGV4dCh0ZXh0LCBwb2ludC54LCBwb2ludC55ICsgMTApOyAvLyBmZWtldGUgc3rDtnZlZ1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgcmVzb2x2ZShjYW52YXMudG9EYXRhVVJMKCdpbWFnZS9wbmcnKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0sIDMwMCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGNyZWF0ZUxhYmVsKGdyb3VwOiBhbnlbXSkge1xyXG4gICAgbGV0IGxhYmVsOiBzdHJpbmcgPSAnJztcclxuICAgIGdyb3VwLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgbGFiZWwgKz0gaXRlbS5fdG9vbHRpcC5fY29udGVudCArICcsICc7XHJcbiAgICAgIGl0ZW0uX3Rvb2x0aXAucGVybWFuZW50ID0gZmFsc2U7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBsYWJlbDtcclxuICB9XHJcbiAgY3JlYXRlTnVtYmVyZWRJY29uKG51bWJlcjogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBzaXplID0gMzU7XHJcbiAgICBjb25zdCBzY2FsZUZhY3RvciA9IDE1O1xyXG4gICAgY29uc3Qgc2NhbGVkU2l6ZSA9IHNpemUgKiBzY2FsZUZhY3RvcjtcclxuXHJcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgIGNhbnZhcy53aWR0aCA9IHNjYWxlZFNpemU7XHJcbiAgICBjYW52YXMuaGVpZ2h0ID0gc2NhbGVkU2l6ZTtcclxuICAgIGNhbnZhcy5zdHlsZS53aWR0aCA9IGNhbnZhcy5zdHlsZS5oZWlnaHQgPSAnMzVweCc7XHJcbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKSE7XHJcbiAgICBjdHguc2NhbGUoc2NhbGVGYWN0b3IsIHNjYWxlRmFjdG9yKTtcclxuXHJcbiAgICBjdHguYmVnaW5QYXRoKCk7XHJcbiAgICBjdHguYXJjKHNpemUgLyAyLCBzaXplIC8gMiwgc2l6ZSAvIDIgLSAyLCAwLCAyICogTWF0aC5QSSwgZmFsc2UpO1xyXG4gICAgY3R4LmZpbGxTdHlsZSA9ICcjMDA3OGQ0JztcclxuICAgIGN0eC5maWxsKCk7XHJcbiAgICBjdHgubGluZVdpZHRoID0gMjtcclxuICAgIGN0eC5zdHJva2VTdHlsZSA9ICcjZmZmZmZmJztcclxuICAgIGN0eC5zdHJva2UoKTtcclxuXHJcbiAgICBjdHguZmlsbFN0eWxlID0gJyNmZmZmZmYnO1xyXG4gICAgY3R4LmZvbnQgPSAnYm9sZCAxNnB4IHNhbnMtc2VyaWYnO1xyXG4gICAgY3R4LnRleHRBbGlnbiA9ICdjZW50ZXInO1xyXG4gICAgY3R4LnRleHRCYXNlbGluZSA9ICdtaWRkbGUnO1xyXG4gICAgY3R4LmZpbGxUZXh0KG51bWJlci50b1N0cmluZygpLCBzaXplIC8gMiwgc2l6ZSAvIDIpO1xyXG5cclxuICAgIHJldHVybiBMLmljb24oe1xyXG4gICAgICBpY29uVXJsOiBjYW52YXMudG9EYXRhVVJMKCksXHJcbiAgICAgIGljb25TaXplOiBbc2l6ZSwgc2l6ZV0sXHJcbiAgICAgIGljb25BbmNob3I6IFtzaXplIC8gMiwgc2l6ZSAvIDJdLFxyXG4gICAgICBwb3B1cEFuY2hvcjogWzAsIC1zaXplIC8gMl0sXHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuZnVuY3Rpb24gZ2V0SWNvbihjb2xvcjogc3RyaW5nKSB7XHJcbiAgY29uc3Qgc2l6ZSA9IDEyO1xyXG4gIGNvbnN0IHNjYWxlRmFjdG9yID0gMTI7XHJcbiAgY29uc3Qgc2NhbGVkU2l6ZSA9IHNpemUgKiBzY2FsZUZhY3RvcjtcclxuXHJcbiAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XHJcbiAgY2FudmFzLndpZHRoID0gc2NhbGVkU2l6ZTtcclxuICBjYW52YXMuaGVpZ2h0ID0gc2NhbGVkU2l6ZTtcclxuICBjYW52YXMuc3R5bGUud2lkdGggPSBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gYCR7c2l6ZX1weGA7XHJcbiAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJykhO1xyXG4gIGN0eC5zY2FsZShzY2FsZUZhY3Rvciwgc2NhbGVGYWN0b3IpO1xyXG5cclxuICBjdHguYmVnaW5QYXRoKCk7XHJcbiAgY3R4LmFyYyhzaXplIC8gMiwgc2l6ZSAvIDIsIHNpemUgLyAyLCAwLCAyICogTWF0aC5QSSwgZmFsc2UpO1xyXG4gIGN0eC5maWxsU3R5bGUgPSBjb2xvcjtcclxuICBjdHguZmlsbCgpO1xyXG5cclxuICByZXR1cm4gTC5pY29uKHtcclxuICAgIGljb25Vcmw6IGNhbnZhcy50b0RhdGFVUkwoKSxcclxuICAgIGljb25TaXplOiBbc2l6ZSwgc2l6ZV0sXHJcbiAgICBpY29uQW5jaG9yOiBbc2l6ZSAvIDIsIHNpemUgLyAyXSxcclxuICAgIHBvcHVwQW5jaG9yOiBbMCwgLXNpemUgLyAyXSxcclxuICB9KTtcclxufVxyXG4iXX0=
|
|
@@ -15525,6 +15525,7 @@ function createLeafletMapItem(item, config) {
|
|
|
15525
15525
|
title: item.label,
|
|
15526
15526
|
markerColor: config.color,
|
|
15527
15527
|
draggable: config.draggable,
|
|
15528
|
+
icon: getIcon(config.color),
|
|
15528
15529
|
})),
|
|
15529
15530
|
]);
|
|
15530
15531
|
case GeoMapItemKind.LINE:
|
|
@@ -15535,6 +15536,7 @@ function createLeafletMapItem(item, config) {
|
|
|
15535
15536
|
title: item.label,
|
|
15536
15537
|
color: config.color,
|
|
15537
15538
|
draggable: config.draggable,
|
|
15539
|
+
icon: getIcon(config.color),
|
|
15538
15540
|
})),
|
|
15539
15541
|
]);
|
|
15540
15542
|
}
|
|
@@ -15544,6 +15546,7 @@ class LeafletMap extends AbstractMap {
|
|
|
15544
15546
|
constructor(el, cd, zone) {
|
|
15545
15547
|
super(el, cd, zone, createLeafletMapItem);
|
|
15546
15548
|
this.offsetDistance = 0.00004;
|
|
15549
|
+
this.markers = [];
|
|
15547
15550
|
}
|
|
15548
15551
|
ngAfterViewChecked() {
|
|
15549
15552
|
if (!this.map && this.el.nativeElement.offsetParent) {
|
|
@@ -15639,6 +15642,7 @@ class LeafletMap extends AbstractMap {
|
|
|
15639
15642
|
if (!this.map) {
|
|
15640
15643
|
return;
|
|
15641
15644
|
}
|
|
15645
|
+
this.markers = [];
|
|
15642
15646
|
const markerGroups = new Map();
|
|
15643
15647
|
toAdd.forEach((item) => {
|
|
15644
15648
|
if (item.record instanceof L.Marker) {
|
|
@@ -15687,7 +15691,16 @@ class LeafletMap extends AbstractMap {
|
|
|
15687
15691
|
let group = markerGroups.get(it.record.getLatLng().lat.toFixed(6) + ',' + it.record.getLatLng().lng.toFixed(6));
|
|
15688
15692
|
if (group && group.length > 1) {
|
|
15689
15693
|
const icon = this.createNumberedIcon(group.length);
|
|
15690
|
-
const
|
|
15694
|
+
const label = this.createLabel(group);
|
|
15695
|
+
const extraMarker = L.marker(group[0].originalLatLng, { icon });
|
|
15696
|
+
if (!extraMarker._tooltip) {
|
|
15697
|
+
extraMarker.bindTooltip(label, {
|
|
15698
|
+
permanent: false,
|
|
15699
|
+
direction: 'auto',
|
|
15700
|
+
});
|
|
15701
|
+
this.markers.push(extraMarker);
|
|
15702
|
+
}
|
|
15703
|
+
const clusterMarker = extraMarker.addTo(this.map);
|
|
15691
15704
|
it.record.on('mouseover', (_event) => {
|
|
15692
15705
|
toAdd.forEach((item, index) => {
|
|
15693
15706
|
if (item.record instanceof L.Marker &&
|
|
@@ -15716,6 +15729,9 @@ class LeafletMap extends AbstractMap {
|
|
|
15716
15729
|
}
|
|
15717
15730
|
});
|
|
15718
15731
|
}
|
|
15732
|
+
else {
|
|
15733
|
+
this.markers.push(it.record);
|
|
15734
|
+
}
|
|
15719
15735
|
}
|
|
15720
15736
|
it.record.addTo(this.map);
|
|
15721
15737
|
this.overlays.set(it.id, it.record);
|
|
@@ -15807,14 +15823,48 @@ class LeafletMap extends AbstractMap {
|
|
|
15807
15823
|
}
|
|
15808
15824
|
toBase64() {
|
|
15809
15825
|
return new Promise((resolve, reject) => {
|
|
15810
|
-
|
|
15811
|
-
|
|
15812
|
-
|
|
15813
|
-
|
|
15814
|
-
|
|
15815
|
-
|
|
15816
|
-
|
|
15826
|
+
setTimeout(() => {
|
|
15827
|
+
leafletImage(this.map, (err, canvas) => {
|
|
15828
|
+
if (err) {
|
|
15829
|
+
console.error('Leaflet image capture error', err);
|
|
15830
|
+
reject(err);
|
|
15831
|
+
return;
|
|
15832
|
+
}
|
|
15833
|
+
const ctx = canvas.getContext('2d');
|
|
15834
|
+
if (!ctx) {
|
|
15835
|
+
reject('No context');
|
|
15836
|
+
return;
|
|
15837
|
+
}
|
|
15838
|
+
this.markers.forEach((marker) => {
|
|
15839
|
+
const tooltip = marker.getTooltip();
|
|
15840
|
+
if (!tooltip) {
|
|
15841
|
+
return;
|
|
15842
|
+
}
|
|
15843
|
+
const latLng = marker.getLatLng();
|
|
15844
|
+
const point = this.map.latLngToContainerPoint(latLng);
|
|
15845
|
+
const text = tooltip.getContent();
|
|
15846
|
+
// Tooltip szöveg megjelenítése
|
|
15847
|
+
ctx.font = 'bold 14px sans-serif';
|
|
15848
|
+
ctx.fillStyle = 'black';
|
|
15849
|
+
ctx.strokeStyle = 'white';
|
|
15850
|
+
ctx.lineWidth = 4;
|
|
15851
|
+
ctx.textAlign = 'center';
|
|
15852
|
+
ctx.textBaseline = 'bottom';
|
|
15853
|
+
ctx.strokeText(text, point.x, point.y + 10); // fehér kontúr
|
|
15854
|
+
ctx.fillText(text, point.x, point.y + 10); // fekete szöveg
|
|
15855
|
+
});
|
|
15856
|
+
resolve(canvas.toDataURL('image/png'));
|
|
15857
|
+
});
|
|
15858
|
+
}, 300);
|
|
15859
|
+
});
|
|
15860
|
+
}
|
|
15861
|
+
createLabel(group) {
|
|
15862
|
+
let label = '';
|
|
15863
|
+
group.forEach((item) => {
|
|
15864
|
+
label += item._tooltip._content + ', ';
|
|
15865
|
+
item._tooltip.permanent = false;
|
|
15817
15866
|
});
|
|
15867
|
+
return label;
|
|
15818
15868
|
}
|
|
15819
15869
|
createNumberedIcon(number) {
|
|
15820
15870
|
const size = 35;
|
|
@@ -15852,6 +15902,27 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImpo
|
|
|
15852
15902
|
type: Component,
|
|
15853
15903
|
args: [{ selector: 'leaflet-map', template: ` <div id="leaflet"></div>`, styles: ["#leaflet{height:720px}::ng-deep .marker-count{background-color:#0078d4;color:#fff;font-weight:700;border-radius:50%;width:30px;height:30px;line-height:30px;text-align:center;border:2px solid white;box-shadow:0 0 4px #0006}::ng-deep .custom-cluster-icon{pointer-events:auto!important}\n"] }]
|
|
15854
15904
|
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }] });
|
|
15905
|
+
function getIcon(color) {
|
|
15906
|
+
const size = 12;
|
|
15907
|
+
const scaleFactor = 12;
|
|
15908
|
+
const scaledSize = size * scaleFactor;
|
|
15909
|
+
const canvas = document.createElement('canvas');
|
|
15910
|
+
canvas.width = scaledSize;
|
|
15911
|
+
canvas.height = scaledSize;
|
|
15912
|
+
canvas.style.width = canvas.style.height = `${size}px`;
|
|
15913
|
+
const ctx = canvas.getContext('2d');
|
|
15914
|
+
ctx.scale(scaleFactor, scaleFactor);
|
|
15915
|
+
ctx.beginPath();
|
|
15916
|
+
ctx.arc(size / 2, size / 2, size / 2, 0, 2 * Math.PI, false);
|
|
15917
|
+
ctx.fillStyle = color;
|
|
15918
|
+
ctx.fill();
|
|
15919
|
+
return L.icon({
|
|
15920
|
+
iconUrl: canvas.toDataURL(),
|
|
15921
|
+
iconSize: [size, size],
|
|
15922
|
+
iconAnchor: [size / 2, size / 2],
|
|
15923
|
+
popupAnchor: [0, -size / 2],
|
|
15924
|
+
});
|
|
15925
|
+
}
|
|
15855
15926
|
|
|
15856
15927
|
var MapEngine;
|
|
15857
15928
|
(function (MapEngine) {
|