angular-bootstrap-italia
Version:
<p align="center"> <h1 align="center">Bootstrap Italia + Angular 9</h1>
196 lines • 25.4 kB
JavaScript
import { __decorate } from "tslib";
import { Component, Input, Output, EventEmitter } from '@angular/core';
import * as L from 'leaflet';
// Leaflet Draw
import 'leaflet-draw';
import drawLocales from 'leaflet-draw-locales';
let LeafletMapComponent = class LeafletMapComponent {
constructor() {
this.geoJson = new EventEmitter();
this.editableLayers = new L.FeatureGroup();
this.options = {
position: 'topright',
draw: {
marker: {
icon: L.icon({
iconSize: [25, 41],
iconAnchor: [13, 41],
iconUrl: 'assets/marker-icon.png',
shadowUrl: 'assets/marker-shadow.png'
})
},
// rectangle: { showArea: false }, // disable showArea
rectangle: false,
polyline: false,
polygon: true,
circlemarker: false
},
edit: {
featureGroup: this.editableLayers,
remove: true
}
};
}
ngOnInit() {
this.drawnLayers = [];
// initialize Leaflet
this.map = L.map('mapid', {
center: [this.latitude, this.longitude],
zoom: 6,
scrollWheelZoom: true
});
// add the OpenStreetMap tiles
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
maxZoom: 19,
attribution: '© <a href="https://openstreetmap.org/copyright">OpenStreetMap</a> contributors',
}).addTo(this.map);
// Center Marker
// this.userCenterMarker = L.marker([this.latitude, this.longitude]).addTo(this.map);
// show the scale bar on the lower left corner
L.control.scale().addTo(this.map);
// Automatically defines Leaflet.draw to the specified language
drawLocales('it');
this.map.addLayer(this.editableLayers);
if (this.enableEdit) {
const drawControl = new L.Control.Draw(this.options);
this.map.addControl(drawControl);
}
this.map.on(L.Draw.Event.CREATED, (e) => {
this.drawnLayers.push({ layer: e.layer, type: e.layerType });
this.editableLayers.addLayer(e.layer);
// Output GeoJSON
this.updateMapGeoJson();
});
this.map.on(L.Draw.Event.DELETED, (e) => {
e.layers.eachLayer(layer => {
var _a, _b;
let lyIndex = -1;
this.drawnLayers.forEach((value, index) => {
if (value.layer._leaflet_id === layer._leaflet_id) {
lyIndex = index;
}
});
if (lyIndex > -1) {
this.drawnLayers.splice(lyIndex, 1);
}
if (((_a = this.locationBoundingBox) === null || _a === void 0 ? void 0 : _a._leaflet_id) === layer._leaflet_id) {
this.locationBoundingBox = null;
}
if (((_b = this.userCenterMarker) === null || _b === void 0 ? void 0 : _b._leaflet_id) === layer._leaflet_id) {
this.userCenterMarker = null;
}
});
this.updateMapGeoJson();
});
// Input GeoJson feature list
const fullLayer = L.geoJSON(this.geoJsonFeatureList);
const layers = fullLayer.getLayers();
layers.forEach(layer => {
this.drawnLayers.push({ layer, type: 'Feature' });
this.editableLayers.addLayer(layer);
});
this.map.fitBounds(fullLayer.getBounds());
}
ngOnChanges(changes) {
var _a, _b;
if (this.map && (changes.latitude || changes.longitude)) {
this.map.setView([this.latitude, this.longitude], 6);
if (this.userCenterMarker) {
this.map.removeLayer(this.userCenterMarker);
}
this.userCenterMarker = L.marker([this.latitude, this.longitude], {
icon: L.icon({
iconSize: [25, 41],
iconAnchor: [13, 41],
iconUrl: 'assets/marker-icon.png',
shadowUrl: 'assets/marker-shadow.png'
})
});
this.editableLayers.addLayer(this.userCenterMarker);
}
if (changes.bboxPolygon && ((_a = this.bboxPolygon) === null || _a === void 0 ? void 0 : _a.coordinates)) {
const bbox = this.getBoundBoxFromPolygon(this.bboxPolygon.coordinates);
if (this.locationBoundingBox) {
this.map.removeLayer(this.locationBoundingBox);
}
// add the bounding box to the map, and set the map extent to it
// this.locationBoundingBox = L.rectangle(bbox);
// this.editableLayers.addLayer(this.locationBoundingBox);
this.map.fitBounds(bbox);
}
if (changes.shapePolygon && ((_b = this.shapePolygon) === null || _b === void 0 ? void 0 : _b.coordinates)) {
this.locationBoundingBox = L.geoJSON(this.shapePolygon);
this.editableLayers.addLayer(this.locationBoundingBox);
}
this.updateMapGeoJson();
}
getBoundBoxFromPolygon(coordinates) {
const lats = [];
const lngs = [];
for (const coordinate of coordinates[0]) {
lats.push(coordinate[1]);
lngs.push(coordinate[0]);
}
// calc the min and max lng and lat
const minlat = Math.min.apply(null, lats);
const maxlat = Math.max.apply(null, lats);
const minlng = Math.min.apply(null, lngs);
const maxlng = Math.max.apply(null, lngs);
// create a bounding rectangle that can be used in leaflet
return [[minlat, minlng], [maxlat, maxlng]];
}
layerToGeoJson(layer, layerType) {
const geoJson = layer.toGeoJSON();
if (layerType === 'circle') {
const radius = layer.getRadius();
geoJson.properties.radius = radius;
}
return geoJson;
}
updateMapGeoJson() {
const drawnLayersGeoJson = [];
if (this.drawnLayers) {
this.drawnLayers.forEach(e => {
const geojson = this.layerToGeoJson(e.layer, e.type);
drawnLayersGeoJson.push(geojson);
});
}
if (this.userCenterMarker) {
drawnLayersGeoJson.push(this.userCenterMarker.toGeoJSON());
}
if (this.locationBoundingBox) {
drawnLayersGeoJson.push(this.locationBoundingBox.toGeoJSON());
}
this.geoJson.emit(drawnLayersGeoJson);
}
};
__decorate([
Input()
], LeafletMapComponent.prototype, "latitude", void 0);
__decorate([
Input()
], LeafletMapComponent.prototype, "longitude", void 0);
__decorate([
Input()
], LeafletMapComponent.prototype, "enableEdit", void 0);
__decorate([
Input()
], LeafletMapComponent.prototype, "bboxPolygon", void 0);
__decorate([
Input()
], LeafletMapComponent.prototype, "shapePolygon", void 0);
__decorate([
Input()
], LeafletMapComponent.prototype, "geoJsonFeatureList", void 0);
__decorate([
Output()
], LeafletMapComponent.prototype, "geoJson", void 0);
LeafletMapComponent = __decorate([
Component({
selector: 'lib-leaflet-map',
template: "<div id=\"mapid\"></div>\r\n",
styles: ["#mapid{height:500px}"]
})
], LeafletMapComponent);
export { LeafletMapComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGVhZmxldC1tYXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vYW5ndWxhci1ib290c3RyYXAtaXRhbGlhLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvbGVhZmxldC9sZWFmbGV0LW1hcC9sZWFmbGV0LW1hcC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFhLE1BQU0sRUFBRSxZQUFZLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQ3pHLE9BQU8sS0FBSyxDQUFDLE1BQU0sU0FBUyxDQUFDO0FBRTdCLGVBQWU7QUFDZixPQUFPLGNBQWMsQ0FBQztBQUN0QixPQUFPLFdBQVcsTUFBTSxzQkFBc0IsQ0FBQztBQVEvQyxJQUFhLG1CQUFtQixHQUFoQyxNQUFhLG1CQUFtQjtJQTBDOUI7UUFoQ1UsWUFBTyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFRL0IsbUJBQWMsR0FBRyxJQUFJLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN0QyxZQUFPLEdBQUc7WUFDaEIsUUFBUSxFQUFFLFVBQVU7WUFDcEIsSUFBSSxFQUFFO2dCQUNKLE1BQU0sRUFBRTtvQkFDTixJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQzt3QkFDWCxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO3dCQUNsQixVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO3dCQUNwQixPQUFPLEVBQUUsd0JBQXdCO3dCQUNqQyxTQUFTLEVBQUUsMEJBQTBCO3FCQUN0QyxDQUFDO2lCQUNIO2dCQUNELHNEQUFzRDtnQkFDdEQsU0FBUyxFQUFFLEtBQUs7Z0JBQ2hCLFFBQVEsRUFBRSxLQUFLO2dCQUNmLE9BQU8sRUFBRSxJQUFJO2dCQUNiLFlBQVksRUFBRSxLQUFLO2FBQ3BCO1lBQ0QsSUFBSSxFQUFFO2dCQUNKLFlBQVksRUFBRSxJQUFJLENBQUMsY0FBYztnQkFDakMs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bkluaXQsIElucHV0LCBPbkNoYW5nZXMsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCAqIGFzIEwgZnJvbSAnbGVhZmxldCc7XHJcblxyXG4vLyBMZWFmbGV0IERyYXdcclxuaW1wb3J0ICdsZWFmbGV0LWRyYXcnO1xyXG5pbXBvcnQgZHJhd0xvY2FsZXMgZnJvbSAnbGVhZmxldC1kcmF3LWxvY2FsZXMnO1xyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLWxlYWZsZXQtbWFwJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vbGVhZmxldC1tYXAuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2xlYWZsZXQtbWFwLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIExlYWZsZXRNYXBDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XHJcblxyXG4gIC8vIEBJbnB1dCgpIG1hcElkOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgbGF0aXR1ZGU6IG51bWJlcjtcclxuICBASW5wdXQoKSBsb25naXR1ZGU6IG51bWJlcjtcclxuICBASW5wdXQoKSBlbmFibGVFZGl0OiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIGJib3hQb2x5Z29uOiBhbnk7XHJcbiAgQElucHV0KCkgc2hhcGVQb2x5Z29uOiBhbnk7XHJcbiAgQElucHV0KCkgZ2VvSnNvbkZlYXR1cmVMaXN0OiBhbnlbXTtcclxuXHJcbiAgQE91dHB1dCgpIGdlb0pzb24gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIHByaXZhdGUgbWFwO1xyXG4gIHByaXZhdGUgdXNlckNlbnRlck1hcmtlcjtcclxuXHJcbiAgcHJpdmF0ZSBkcmF3bkxheWVyczogYW55W107XHJcbiAgcHJpdmF0ZSBsb2NhdGlvbkJvdW5kaW5nQm94O1xyXG5cclxuICBwcml2YXRlIGVkaXRhYmxlTGF5ZXJzID0gbmV3IEwuRmVhdHVyZUdyb3VwKCk7XHJcbiAgcHJpdmF0ZSBvcHRpb25zID0ge1xyXG4gICAgcG9zaXRpb246ICd0b3ByaWdodCcsXHJcbiAgICBkcmF3OiB7XHJcbiAgICAgIG1hcmtlcjoge1xyXG4gICAgICAgIGljb246IEwuaWNvbih7XHJcbiAgICAgICAgICBpY29uU2l6ZTogWzI1LCA0MV0sXHJcbiAgICAgICAgICBpY29uQW5jaG9yOiBbMTMsIDQxXSxcclxuICAgICAgICAgIGljb25Vcmw6ICdhc3NldHMvbWFya2VyLWljb24ucG5nJyxcclxuICAgICAgICAgIHNoYWRvd1VybDogJ2Fzc2V0cy9tYXJrZXItc2hhZG93LnBuZydcclxuICAgICAgICB9KVxyXG4gICAgICB9LFxyXG4gICAgICAvLyByZWN0YW5nbGU6IHsgc2hvd0FyZWE6IGZhbHNlIH0sIC8vIGRpc2FibGUgc2hvd0FyZWFcclxuICAgICAgcmVjdGFuZ2xlOiBmYWxzZSxcclxuICAgICAgcG9seWxpbmU6IGZhbHNlLFxyXG4gICAgICBwb2x5Z29uOiB0cnVlLFxyXG4gICAgICBjaXJjbGVtYXJrZXI6IGZhbHNlXHJcbiAgICB9LFxyXG4gICAgZWRpdDoge1xyXG4gICAgICBmZWF0dXJlR3JvdXA6IHRoaXMuZWRpdGFibGVMYXllcnMsIC8vIFJFUVVJUkVEISFcclxuICAgICAgcmVtb3ZlOiB0cnVlXHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmRyYXduTGF5ZXJzID0gW107XHJcblxyXG4gICAgLy8gaW5pdGlhbGl6ZSBMZWFmbGV0XHJcbiAgICB0aGlzLm1hcCA9IEwubWFwKCdtYXBpZCcsIHtcclxuICAgICAgY2VudGVyOiBbdGhpcy5sYXRpdHVkZSwgdGhpcy5sb25naXR1ZGVdLFxyXG4gICAgICB6b29tOiA2LFxyXG4gICAgICBzY3JvbGxXaGVlbFpvb206IHRydWVcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIGFkZCB0aGUgT3BlblN0cmVldE1hcCB0aWxlc1xyXG4gICAgTC50aWxlTGF5ZXIoJ2h0dHBzOi8ve3N9LnRpbGUub3BlbnN0cmVldG1hcC5vcmcve3p9L3t4fS97eX0ucG5nJywge1xyXG4gICAgICBtYXhab29tOiAxOSxcclxuICAgICAgYXR0cmlidXRpb246ICcmY29weTsgPGEgaHJlZj1cImh0dHBzOi8vb3BlbnN0cmVldG1hcC5vcmcvY29weXJpZ2h0XCI+T3BlblN0cmVldE1hcDwvYT4gY29udHJpYnV0b3JzJyxcclxuICAgIH0pLmFkZFRvKHRoaXMubWFwKTtcclxuXHJcbiAgICAvLyBDZW50ZXIgTWFya2VyXHJcbiAgICAvLyB0aGlzLnVzZXJDZW50ZXJNYXJrZXIgPSBMLm1hcmtlcihbdGhpcy5sYXRpdHVkZSwgdGhpcy5sb25naXR1ZGVdKS5hZGRUbyh0aGlzLm1hcCk7XHJcblxyXG4gICAgLy8gc2hvdyB0aGUgc2NhbGUgYmFyIG9uIHRoZSBsb3dlciBsZWZ0IGNvcm5lclxyXG4gICAgTC5jb250cm9sLnNjYWxlKCkuYWRkVG8odGhpcy5tYXApO1xyXG5cclxuICAgIC8vIEF1dG9tYXRpY2FsbHkgZGVmaW5lcyBMZWFmbGV0LmRyYXcgdG8gdGhlIHNwZWNpZmllZCBsYW5ndWFnZVxyXG4gICAgZHJhd0xvY2FsZXMoJ2l0Jyk7XHJcblxyXG4gICAgdGhpcy5tYXAuYWRkTGF5ZXIodGhpcy5lZGl0YWJsZUxheWVycyk7XHJcblxyXG4gICAgaWYgKHRoaXMuZW5hYmxlRWRpdCkge1xyXG4gICAgICBjb25zdCBkcmF3Q29udHJvbCA9IG5ldyBMLkNvbnRyb2wuRHJhdyh0aGlzLm9wdGlvbnMpO1xyXG4gICAgICB0aGlzLm1hcC5hZGRDb250cm9sKGRyYXdDb250cm9sKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm1hcC5vbihMLkRyYXcuRXZlbnQuQ1JFQVRFRCwgKGUpID0+IHtcclxuICAgICAgdGhpcy5kcmF3bkxheWVycy5wdXNoKHsgbGF5ZXI6IGUubGF5ZXIsIHR5cGU6IGUubGF5ZXJUeXBlIH0pO1xyXG5cclxuICAgICAgdGhpcy5lZGl0YWJsZUxheWVycy5hZGRMYXllcihlLmxheWVyKTtcclxuXHJcbiAgICAgIC8vIE91dHB1dCBHZW9KU09OXHJcbiAgICAgIHRoaXMudXBkYXRlTWFwR2VvSnNvbigpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5tYXAub24oTC5EcmF3LkV2ZW50LkRFTEVURUQsIChlKSA9PiB7XHJcbiAgICAgIGUubGF5ZXJzLmVhY2hMYXllcihsYXllciA9PiB7XHJcbiAgICAgICAgbGV0IGx5SW5kZXggPSAtMTtcclxuICAgICAgICB0aGlzLmRyYXduTGF5ZXJzLmZvckVhY2goKHZhbHVlLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgaWYgKHZhbHVlLmxheWVyLl9sZWFmbGV0X2lkID09PSBsYXllci5fbGVhZmxldF9pZCkge1xyXG4gICAgICAgICAgICBseUluZGV4ID0gaW5kZXg7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmIChseUluZGV4ID4gLTEpIHtcclxuICAgICAgICAgIHRoaXMuZHJhd25MYXllcnMuc3BsaWNlKGx5SW5kZXgsIDEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMubG9jYXRpb25Cb3VuZGluZ0JveD8uX2xlYWZsZXRfaWQgPT09IGxheWVyLl9sZWFmbGV0X2lkKSB7XHJcbiAgICAgICAgICB0aGlzLmxvY2F0aW9uQm91bmRpbmdCb3ggPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMudXNlckNlbnRlck1hcmtlcj8uX2xlYWZsZXRfaWQgPT09IGxheWVyLl9sZWFmbGV0X2lkKSB7XHJcbiAgICAgICAgICB0aGlzLnVzZXJDZW50ZXJNYXJrZXIgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLnVwZGF0ZU1hcEdlb0pzb24oKTtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIElucHV0IEdlb0pzb24gZmVhdHVyZSBsaXN0XHJcbiAgICBjb25zdCBmdWxsTGF5ZXIgPSBMLmdlb0pTT04odGhpcy5nZW9Kc29uRmVhdHVyZUxpc3QpO1xyXG4gICAgY29uc3QgbGF5ZXJzID0gZnVsbExheWVyLmdldExheWVycygpO1xyXG4gICAgbGF5ZXJzLmZvckVhY2gobGF5ZXIgPT4ge1xyXG4gICAgICB0aGlzLmRyYXduTGF5ZXJzLnB1c2goeyBsYXllciwgdHlwZTogJ0ZlYXR1cmUnIH0pO1xyXG4gICAgICB0aGlzLmVkaXRhYmxlTGF5ZXJzLmFkZExheWVyKGxheWVyKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMubWFwLmZpdEJvdW5kcyhmdWxsTGF5ZXIuZ2V0Qm91bmRzKCkpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMubWFwICYmIChjaGFuZ2VzLmxhdGl0dWRlIHx8IGNoYW5nZXMubG9uZ2l0dWRlKSkge1xyXG4gICAgICB0aGlzLm1hcC5zZXRWaWV3KFt0aGlzLmxhdGl0dWRlLCB0aGlzLmxvbmdpdHVkZV0sIDYpO1xyXG5cclxuICAgICAgaWYgKHRoaXMudXNlckNlbnRlck1hcmtlcikge1xyXG4gICAgICAgIHRoaXMubWFwLnJlbW92ZUxheWVyKHRoaXMudXNlckNlbnRlck1hcmtlcik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMudXNlckNlbnRlck1hcmtlciA9IEwubWFya2VyKFxyXG4gICAgICAgIFt0aGlzLmxhdGl0dWRlLCB0aGlzLmxvbmdpdHVkZV0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaWNvbjogTC5pY29uKHtcclxuICAgICAgICAgICAgaWNvblNpemU6IFsyNSwgNDFdLFxyXG4gICAgICAgICAgICBpY29uQW5jaG9yOiBbMTMsIDQxXSxcclxuICAgICAgICAgICAgaWNvblVybDogJ2Fzc2V0cy9tYXJrZXItaWNvbi5wbmcnLFxyXG4gICAgICAgICAgICBzaGFkb3dVcmw6ICdhc3NldHMvbWFya2VyLXNoYWRvdy5wbmcnXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy5lZGl0YWJsZUxheWVycy5hZGRMYXllcih0aGlzLnVzZXJDZW50ZXJNYXJrZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjaGFuZ2VzLmJib3hQb2x5Z29uICYmIHRoaXMuYmJveFBvbHlnb24/LmNvb3JkaW5hdGVzKSB7XHJcbiAgICAgIGNvbnN0IGJib3ggPSB0aGlzLmdldEJvdW5kQm94RnJvbVBvbHlnb24odGhpcy5iYm94UG9seWdvbi5jb29yZGluYXRlcyk7XHJcblxyXG4gICAgICBpZiAodGhpcy5sb2NhdGlvbkJvdW5kaW5nQm94KSB7XHJcbiAgICAgICAgdGhpcy5tYXAucmVtb3ZlTGF5ZXIodGhpcy5sb2NhdGlvbkJvdW5kaW5nQm94KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gYWRkIHRoZSBib3VuZGluZyBib3ggdG8gdGhlIG1hcCwgYW5kIHNldCB0aGUgbWFwIGV4dGVudCB0byBpdFxyXG4gICAgICAvLyB0aGlzLmxvY2F0aW9uQm91bmRpbmdCb3ggPSBMLnJlY3RhbmdsZShiYm94KTtcclxuICAgICAgLy8gdGhpcy5lZGl0YWJsZUxheWVycy5hZGRMYXllcih0aGlzLmxvY2F0aW9uQm91bmRpbmdCb3gpO1xyXG4gICAgICB0aGlzLm1hcC5maXRCb3VuZHMoYmJveCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNoYW5nZXMuc2hhcGVQb2x5Z29uICYmIHRoaXMuc2hhcGVQb2x5Z29uPy5jb29yZGluYXRlcykge1xyXG4gICAgICB0aGlzLmxvY2F0aW9uQm91bmRpbmdCb3ggPSBMLmdlb0pTT04odGhpcy5zaGFwZVBvbHlnb24pO1xyXG4gICAgICB0aGlzLmVkaXRhYmxlTGF5ZXJzLmFkZExheWVyKHRoaXMubG9jYXRpb25Cb3VuZGluZ0JveCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy51cGRhdGVNYXBHZW9Kc29uKCk7XHJcbiAgfVxyXG5cclxuICBnZXRCb3VuZEJveEZyb21Qb2x5Z29uKGNvb3JkaW5hdGVzKSB7XHJcbiAgICBjb25zdCBsYXRzID0gW107XHJcbiAgICBjb25zdCBsbmdzID0gW107XHJcblxyXG4gICAgZm9yIChjb25zdCBjb29yZGluYXRlIG9mIGNvb3JkaW5hdGVzWzBdKSB7XHJcbiAgICAgIGxhdHMucHVzaChjb29yZGluYXRlWzFdKTtcclxuICAgICAgbG5ncy5wdXNoKGNvb3JkaW5hdGVbMF0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGNhbGMgdGhlIG1pbiBhbmQgbWF4IGxuZyBhbmQgbGF0XHJcbiAgICBjb25zdCBtaW5sYXQgPSBNYXRoLm1pbi5hcHBseShudWxsLCBsYXRzKTtcclxuICAgIGNvbnN0IG1heGxhdCA9IE1hdGgubWF4LmFwcGx5KG51bGwsIGxhdHMpO1xyXG4gICAgY29uc3QgbWlubG5nID0gTWF0aC5taW4uYXBwbHkobnVsbCwgbG5ncyk7XHJcbiAgICBjb25zdCBtYXhsbmcgPSBNYXRoLm1heC5hcHBseShudWxsLCBsbmdzKTtcclxuXHJcbiAgICAvLyBjcmVhdGUgYSBib3VuZGluZyByZWN0YW5nbGUgdGhhdCBjYW4gYmUgdXNlZCBpbiBsZWFmbGV0XHJcbiAgICByZXR1cm4gW1ttaW5sYXQsIG1pbmxuZ10sIFttYXhsYXQsIG1heGxuZ11dO1xyXG4gIH1cclxuXHJcbiAgbGF5ZXJUb0dlb0pzb24obGF5ZXI6IGFueSwgbGF5ZXJUeXBlOiBhbnkpIHtcclxuICAgIGNvbnN0IGdlb0pzb24gPSBsYXllci50b0dlb0pTT04oKTtcclxuICAgIGlmIChsYXllclR5cGUgPT09ICdjaXJjbGUnKSB7XHJcbiAgICAgIGNvbnN0IHJhZGl1cyA9IGxheWVyLmdldFJhZGl1cygpO1xyXG4gICAgICBnZW9Kc29uLnByb3BlcnRpZXMucmFkaXVzID0gcmFkaXVzO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBnZW9Kc29uO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlTWFwR2VvSnNvbigpIHtcclxuICAgIGNvbnN0IGRyYXduTGF5ZXJzR2VvSnNvbiA9IFtdO1xyXG5cclxuICAgIGlmICh0aGlzLmRyYXduTGF5ZXJzKSB7XHJcbiAgICAgIHRoaXMuZHJhd25MYXllcnMuZm9yRWFjaChlID0+IHtcclxuICAgICAgICBjb25zdCBnZW9qc29uID0gdGhpcy5sYXllclRvR2VvSnNvbihlLmxheWVyLCBlLnR5cGUpO1xyXG4gICAgICAgIGRyYXduTGF5ZXJzR2VvSnNvbi5wdXNoKGdlb2pzb24pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy51c2VyQ2VudGVyTWFya2VyKSB7XHJcbiAgICAgIGRyYXduTGF5ZXJzR2VvSnNvbi5wdXNoKHRoaXMudXNlckNlbnRlck1hcmtlci50b0dlb0pTT04oKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMubG9jYXRpb25Cb3VuZGluZ0JveCkge1xyXG4gICAgICBkcmF3bkxheWVyc0dlb0pzb24ucHVzaCh0aGlzLmxvY2F0aW9uQm91bmRpbmdCb3gudG9HZW9KU09OKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZ2VvSnNvbi5lbWl0KGRyYXduTGF5ZXJzR2VvSnNvbik7XHJcbiAgfVxyXG59XHJcbiJdfQ==