@ng-maps/google
Version:
**@ng-maps/google** is a simple, modular and tree-shakable library for displaying google-maps inside an angular application
180 lines • 22.8 kB
JavaScript
import { Injectable, NgZone } from '@angular/core';
import { Observable } from 'rxjs';
import { MapsAPILoader, MapsApiWrapper, } from '@ng-maps/core';
import * as i0 from "@angular/core";
import * as i1 from "@ng-maps/core";
/**
* Wrapper class that handles the communication with the Google Maps Javascript
* API v3
*/
export class GoogleMapsAPIWrapper extends MapsApiWrapper {
constructor(_loader, _zone) {
super(_loader, _zone);
}
createMap(el, center, options) {
return this._zone.runOutsideAngular(async () => {
await this._loader.load();
if (this._mapResolver) {
this._mapResolver(new google.maps.Map(el, { center, ...options }));
}
return;
});
}
async setMapOptions(options) {
const map = await this._api;
map?.setOptions(options);
}
/**
* Creates a google map drawing manager with the map context
*/
async createDrawingManager(options = {}, addToMap = true) {
const map = await this._api;
if (addToMap) {
options.map = map;
}
return new google.maps.drawing.DrawingManager(options);
}
/**
* Creates a google map marker with the map context
*/
async createMarker(position, options, addToMap = true) {
const map = addToMap ? await this._api : null;
return new google.maps.Marker({ position, map, ...options });
}
async createInfoWindow(position, options) {
await this._api;
if (position === null) {
return new google.maps.InfoWindow({ ...options });
}
else {
return new google.maps.InfoWindow({ position: position, ...options });
}
}
/**
* Creates a google.map.Circle for the current map.
*
* @todo check how to improve type casting
*/
async createCircle(center, options) {
const opt = {
...options,
center,
map: await this._api,
};
if (typeof opt.strokePosition === 'string') {
opt.strokePosition = google.maps.StrokePosition[opt.strokePosition];
}
return new google.maps.Circle(opt);
}
/**
* Creates a google.map.Rectangle for the current map.
*/
async createRectangle(bounds, options) {
const map = await this._api;
return new google.maps.Rectangle({
...options,
bounds,
map,
});
}
async createPolyline(options) {
return this.getNativeMap().then((map) => {
const line = new google.maps.Polyline(options);
if (map) {
line.setMap(map);
}
return line;
});
}
createPolygon(options) {
return this.getNativeMap().then((map) => {
const polygon = new google.maps.Polygon(options);
if (map) {
polygon.setMap(map);
}
return polygon;
});
}
/**
* Creates a new google.map.Data layer for the current map
*/
async createDataLayer(options) {
return this._api?.then((m) => {
const data = new google.maps.Data(options);
data.setMap(m);
return data;
});
}
/**
* Determines if given coordinates are insite a Polygon path.
*/
containsLocation(latLng, polygon) {
return google.maps.geometry.poly.containsLocation(latLng, polygon);
}
/**
* @fixme typings
*/
subscribeToMapEvent(eventName) {
return new Observable((observer) => {
this._api?.then((m) => m.addListener(eventName, (...evArgs) => this._zone.run(() => observer.next(evArgs))));
});
}
clearInstanceListeners() {
this._api?.then((map) => {
google.maps.event.clearInstanceListeners(map);
});
}
async setCenter(latLng) {
return this._api?.then((map) => map.setCenter(latLng));
}
async getZoom() {
const map = await this._api;
return map?.getZoom();
}
async getBounds() {
const map = await this._api;
return map?.getBounds()?.toJSON();
}
async getMapTypeId() {
return this._api?.then((map) => map.getMapTypeId());
}
async setZoom(zoom) {
this._api?.then((map) => map.setZoom(zoom));
}
async getCenter() {
const map = await this._api;
return map?.getCenter()?.toJSON();
}
async panTo(latLng) {
this._api?.then((map) => map.panTo(latLng));
}
async panBy(x, y) {
this._api?.then((map) => map.panBy(x, y));
}
async fitBounds(latLng, padding) {
const map = await this._api;
map?.fitBounds(latLng, padding);
}
async panToBounds(latLng, padding) {
const map = await this._api;
return map?.panToBounds(latLng, padding);
}
/**
* Triggers the given event name on the map instance.
*/
async triggerMapEvent(eventName) {
const map = await this._api;
if (map) {
google.maps.event.trigger(map, eventName);
}
}
_isLatLngBoundsLiteral(bounds) {
return bounds != null && bounds.extend === undefined;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: GoogleMapsAPIWrapper, deps: [{ token: i1.MapsAPILoader }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: GoogleMapsAPIWrapper }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: GoogleMapsAPIWrapper, decorators: [{
type: Injectable
}], ctorParameters: () => [{ type: i1.MapsAPILoader }, { type: i0.NgZone }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ29vZ2xlLW1hcHMtYXBpLXdyYXBwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2dvb2dsZS9zcmMvbGliL2dvb2dsZS1tYXBzLWFwaS13cmFwcGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFbEMsT0FBTyxFQUtMLGFBQWEsRUFDYixjQUFjLEdBR2YsTUFBTSxlQUFlLENBQUM7OztBQUV2Qjs7O0dBR0c7QUFFSCxNQUFNLE9BQU8sb0JBQXFCLFNBQVEsY0FJekM7SUFDQyxZQUFZLE9BQXNCLEVBQUUsS0FBYTtRQUMvQyxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFLTSxTQUFTLENBQ2QsRUFBZSxFQUNmLE1BQWdCLEVBQ2hCLE9BQW1CO1FBRW5CLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLElBQUksRUFBRTtZQUM3QyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDMUIsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDckUsQ0FBQztZQUNELE9BQU87UUFDVCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxLQUFLLENBQUMsYUFBYSxDQUFDLE9BQStCO1FBQ3hELE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQztRQUM1QixHQUFHLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFD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QUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzVDLENBQUM7SUFDSCxDQUFDO0lBRVMsc0JBQXNCLENBQzlCLE1BQWtFO1FBRWxFLE9BQU8sTUFBTSxJQUFJLElBQUksSUFBSyxNQUFjLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQztJQUNoRSxDQUFDOzhHQWpQVSxvQkFBb0I7a0hBQXBCLG9CQUFvQjs7MkZBQXBCLG9CQUFvQjtrQkFEaEMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE5nWm9uZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge1xuICBCb3VuZHNMaXRlcmFsLFxuICBDaXJjbGVPcHRpb25zLFxuICBHZW9Qb2ludCxcbiAgTWFwT3B0aW9ucyxcbiAgTWFwc0FQSUxvYWRlcixcbiAgTWFwc0FwaVdyYXBwZXIsXG4gIE1hcmtlck9wdGlvbnMsXG4gIFJlY3RhbmdsZU9wdGlvbnMsXG59IGZyb20gJ0BuZy1tYXBzL2NvcmUnO1xuXG4vKipcbiAqIFdyYXBwZXIgY2xhc3MgdGhhdCBoYW5kbGVzIHRoZSBjb21tdW5pY2F0aW9uIHdpdGggdGhlIEdvb2dsZSBNYXBzIEphdmFzY3JpcHRcbiAqIEFQSSB2M1xuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgR29vZ2xlTWFwc0FQSVdyYXBwZXIgZXh0ZW5kcyBNYXBzQXBpV3JhcHBlcjxcbiAgZ29vZ2xlLm1hcHMuTWFwLFxuICBnb29nbGUubWFwcy5DaXJjbGUsXG4gIGdvb2dsZS5tYXBzLlJlY3RhbmdsZVxuPiB7XG4gIGNvbnN0cnVjdG9yKF9sb2FkZXI6IE1hcHNBUElMb2FkZXIsIF96b25lOiBOZ1pvbmUpIHtcbiAgICBzdXBlcihfbG9hZGVyLCBfem9uZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgX2FwaT86IFByb21pc2U8Z29vZ2xlLm1hcHMuTWFwPjtcbiAgcHJvdGVjdGVkIG92ZXJyaWRlIF9tYXBSZXNvbHZlcj86ICh2YWx1ZTogZ29vZ2xlLm1hcHMuTWFwKSA9PiB2b2lkO1xuXG4gIHB1YmxpYyBjcmVhdGVNYXAoXG4gICAgZWw6IEhUTUxFbGVtZW50LFxuICAgIGNlbnRlcjogR2VvUG9pbnQsXG4gICAgb3B0aW9uczogTWFwT3B0aW9ucyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5fbG9hZGVyLmxvYWQoKTtcbiAgICAgIGlmICh0aGlzLl9tYXBSZXNvbHZlcikge1xuICAgICAgICB0aGlzLl9tYXBSZXNvbHZlcihuZXcgZ29vZ2xlLm1hcHMuTWFwKGVsLCB7IGNlbnRlciwgLi4ub3B0aW9ucyB9KSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc2V0TWFwT3B0aW9ucyhvcHRpb25zOiBnb29nbGUubWFwcy5NYXBPcHRpb25zKSB7XG4gICAgY29uc3QgbWFwID0gYXdhaXQgdGhpcy5fYXBpO1xuICAgIG1hcD8uc2V0T3B0aW9ucyhvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgZ29vZ2xlIG1hcCBkcmF3aW5nIG1hbmFnZXIgd2l0aCB0aGUgbWFwIGNvbnRleHRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBjcmVhdGVEcmF3aW5nTWFuYWdlcihcbiAgICBvcHRpb25zOiBnb29nbGUubWFwcy5kcmF3aW5nLkRyYXdpbmdNYW5hZ2VyT3B0aW9ucyA9IHt9LFxuICAgIGFkZFRvTWFwOiBib29sZWFuID0gdHJ1ZSxcbiAgKTogUHJvbWlzZTxnb29nbGUubWFwcy5kcmF3aW5nLkRyYXdpbmdNYW5hZ2VyPiB7XG4gICAgY29uc3QgbWFwID0gYXdhaXQgdGhpcy5fYXBpO1xuICAgIGlmIChhZGRUb01hcCkge1xuICAgICAgb3B0aW9ucy5tYXAgPSBtYXA7XG4gICAgfVxuICAgIHJldHVybiBuZXcgZ29vZ2xlLm1hcHMuZHJhd2luZy5EcmF3aW5nTWFuYWdlcihvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgZ29vZ2xlIG1hcCBtYXJrZXIgd2l0aCB0aGUgbWFwIGNvbnRleHRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBjcmVhdGVNYXJrZXIoXG4gICAgcG9zaXRpb246IEdlb1BvaW50LFxuICAgIG9wdGlvbnM6IE1hcmtlck9wdGlvbnMsXG4gICAgYWRkVG9NYXA6IGJvb2xlYW4gPSB0cnVlLFxuICApOiBQcm9taXNlPGdvb2dsZS5tYXBzLk1hcmtlcj4ge1xuICAgIGNvbnN0IG1hcCA9IGFkZFRvTWFwID8gYXdhaXQgdGhpcy5fYXBpIDogbnVsbDtcbiAgICByZXR1cm4gbmV3IGdvb2dsZS5tYXBzLk1hcmtlcih7IHBvc2l0aW9uLCBtYXAsIC4uLm9wdGlvbnMgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY3JlYXRlSW5mb1dpbmRvdyhcbiAgICBwb3NpdGlvbjogR2VvUG9pbnQgfCBudWxsLFxuICAgIG9wdGlvbnM/OiBnb29nbGUubWFwcy5JbmZvV2luZG93T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxnb29nbGUubWFwcy5JbmZvV2luZG93PiB7XG4gICAgYXdhaXQgdGhpcy5fYXBpO1xuICAgIGlmIChwb3NpdGlvbiA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG5ldyBnb29nbGUubWFwcy5JbmZvV2luZG93KHsgLi4ub3B0aW9ucyB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBnb29nbGUubWFwcy5JbmZvV2luZG93KHsgcG9zaXRpb246IHBvc2l0aW9uLCAuLi5vcHRpb25zIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgZ29vZ2xlLm1hcC5DaXJjbGUgZm9yIHRoZSBjdXJyZW50IG1hcC5cbiAgICpcbiAgICogQHRvZG8gY2hlY2sgaG93IHRvIGltcHJvdmUgdHlwZSBjYXN0aW5nXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY3JlYXRlQ2lyY2xlKFxuICAgIGNlbnRlcjogR2VvUG9pbnQsXG4gICAgb3B0aW9uczogQ2lyY2xlT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxnb29nbGUubWFwcy5DaXJjbGU+IHtcbiAgICBjb25zdCBvcHQ6IGdvb2dsZS5tYXBzLkNpcmNsZU9wdGlvbnMgPSB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgY2VudGVyLFxuICAgICAgbWFwOiBhd2FpdCB0aGlzLl9hcGksXG4gICAgfTtcbiAgICBpZiAodHlwZW9mIG9wdC5zdHJva2VQb3NpdGlvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIG9wdC5zdHJva2VQb3NpdGlvbiA9IGdvb2dsZS5tYXBzLlN0cm9rZVBvc2l0aW9uW1xuICAgICAgICBvcHQuc3Ryb2tlUG9zaXRpb25cbiAgICAgIF0gYXMgYW55IGFzIGdvb2dsZS5tYXBzLlN0cm9rZVBvc2l0aW9uO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IGdvb2dsZS5tYXBzLkNpcmNsZShvcHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBnb29nbGUubWFwLlJlY3RhbmdsZSBmb3IgdGhlIGN1cnJlbnQgbWFwLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNyZWF0ZVJlY3RhbmdsZShcbiAgICBib3VuZHM6IEJvdW5kc0xpdGVyYWwsXG4gICAgb3B0aW9uczogUmVjdGFuZ2xlT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxnb29nbGUubWFwcy5SZWN0YW5nbGU+IHtcbiAgICBjb25zdCBtYXAgPSBhd2FpdCB0aGlzLl9hcGk7XG4gICAgcmV0dXJuIG5ldyBnb29nbGUubWFwcy5SZWN0YW5nbGUoe1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGJvdW5kcyxcbiAgICAgIG1hcCxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBjcmVhdGVQb2x5bGluZShcbiAgICBvcHRpb25zOiBnb29nbGUubWFwcy5Qb2x5bGluZU9wdGlvbnMsXG4gICk6IFByb21pc2U8Z29vZ2xlLm1hcHMuUG9seWxpbmU+IHtcbiAgICByZXR1cm4gdGhpcy5nZXROYXRpdmVNYXAoKS50aGVuKChtYXApID0+IHtcbiAgICAgIGNvbnN0IGxpbmUgPSBuZXcgZ29vZ2xlLm1hcHMuUG9seWxpbmUob3B0aW9ucyk7XG4gICAgICBpZiAobWFwKSB7XG4gICAgICAgIGxpbmUuc2V0TWFwKG1hcCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbGluZTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVQb2x5Z29uKFxuICAgIG9wdGlvbnM6IGdvb2dsZS5tYXBzLlBvbHlnb25PcHRpb25zLFxuICApOiBQcm9taXNlPGdvb2dsZS5tYXBzLlBvbHlnb24+IHtcbiAgICByZXR1cm4gdGhpcy5nZXROYXRpdmVNYXAoKS50aGVuKChtYXApID0+IHtcbiAgICAgIGNvbnN0IHBvbHlnb24gPSBuZXcgZ29vZ2xlLm1hcHMuUG9seWdvbihvcHRpb25zKTtcbiAgICAgIGlmIChtYXApIHtcbiAgICAgICAgcG9seWdvbi5zZXRNYXAobWFwKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwb2x5Z29uO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgZ29vZ2xlLm1hcC5EYXRhIGxheWVyIGZvciB0aGUgY3VycmVudCBtYXBcbiAgICovXG4gIHB1YmxpYyBhc3luYyBjcmVhdGVEYXRhTGF5ZXIoXG4gICAgb3B0aW9ucz86IGdvb2dsZS5tYXBzLkRhdGEuRGF0YU9wdGlvbnMsXG4gICk6IFByb21pc2U8Z29vZ2xlLm1hcHMuRGF0YSB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiB0aGlzLl9hcGk/LnRoZW4oKG0pID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLm1hcHMuRGF0YShvcHRpb25zKTtcbiAgICAgIGRhdGEuc2V0TWFwKG0pO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiBnaXZlbiBjb29yZGluYXRlcyBhcmUgaW5zaXRlIGEgUG9seWdvbiBwYXRoLlxuICAgKi9cbiAgcHVibGljIGNvbnRhaW5zTG9jYXRpb24oXG4gICAgbGF0TG5nOiBnb29nbGUubWFwcy5MYXRMbmcsXG4gICAgcG9seWdvbjogZ29vZ2xlLm1hcHMuUG9seWdvbixcbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGdvb2dsZS5tYXBzLmdlb21ldHJ5LnBvbHkuY29udGFpbnNMb2NhdGlvbihsYXRMbmcsIHBvbHlnb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBmaXhtZSB0eXBpbmdzXG4gICAqL1xuICBwdWJsaWMgc3Vic2NyaWJlVG9NYXBFdmVudChldmVudE5hbWU6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcikgPT4ge1xuICAgICAgdGhpcy5fYXBpPy50aGVuKChtKSA9PlxuICAgICAgICBtLmFkZExpc3RlbmVyKGV2ZW50TmFtZSwgKC4uLmV2QXJnczogQXJyYXk8YW55PikgPT5cbiAgICAgICAgICB0aGlzLl96b25lLnJ1bigoKSA9PiBvYnNlcnZlci5uZXh0KGV2QXJncykpLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhckluc3RhbmNlTGlzdGVuZXJzKCkge1xuICAgIHRoaXMuX2FwaT8udGhlbigobWFwOiBnb29nbGUubWFwcy5NYXApID0+IHtcbiAgICAgIGdvb2dsZS5tYXBzLmV2ZW50LmNsZWFySW5zdGFuY2VMaXN0ZW5lcnMobWFwKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzZXRDZW50ZXIobGF0TG5nOiBnb29nbGUubWFwcy5MYXRMbmdMaXRlcmFsKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaT8udGhlbigobWFwOiBnb29nbGUubWFwcy5NYXApID0+IG1hcC5zZXRDZW50ZXIobGF0TG5nKSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0Wm9vbSgpOiBQcm9taXNlPG51bWJlciB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IG1hcCA9IGF3YWl0IHRoaXMuX2FwaTtcbiAgICByZXR1cm4gbWFwPy5nZXRab29tKCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0Qm91bmRzKCk6IFByb21pc2U8Qm91bmRzTGl0ZXJhbCB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IG1hcCA9IGF3YWl0IHRoaXMuX2FwaTtcbiAgICByZXR1cm4gbWFwPy5nZXRCb3VuZHMoKT8udG9KU09OKCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0TWFwVHlwZUlkKCk6IFByb21pc2U8XG4gICAgZ29vZ2xlLm1hcHMuTWFwVHlwZUlkIHwgc3RyaW5nIHwgdW5kZWZpbmVkXG4gID4ge1xuICAgIHJldHVybiB0aGlzLl9hcGk/LnRoZW4oKG1hcCkgPT4gbWFwLmdldE1hcFR5cGVJZCgpKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzZXRab29tKHpvb206IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuX2FwaT8udGhlbigobWFwKSA9PiBtYXAuc2V0Wm9vbSh6b29tKSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0Q2VudGVyKCk6IFByb21pc2U8R2VvUG9pbnQgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBtYXAgPSBhd2FpdCB0aGlzLl9hcGk7XG4gICAgcmV0dXJuIG1hcD8uZ2V0Q2VudGVyKCk/LnRvSlNPTigpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHBhblRvKFxuICAgIGxhdExuZzogZ29vZ2xlLm1hcHMuTGF0TG5nIHwgZ29vZ2xlLm1hcHMuTGF0TG5nTGl0ZXJhbCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5fYXBpPy50aGVuKChtYXApID0+IG1hcC5wYW5UbyhsYXRMbmcpKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBwYW5CeSh4OiBudW1iZXIsIHk6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuX2FwaT8udGhlbigobWFwKSA9PiBtYXAucGFuQnkoeCwgeSkpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGZpdEJvdW5kcyhcbiAgICBsYXRMbmc6IEJvdW5kc0xpdGVyYWwsXG4gICAgcGFkZGluZz86IG51bWJlciB8IGdvb2dsZS5tYXBzLlBhZGRpbmcsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG1hcCA9IGF3YWl0IHRoaXMuX2FwaTtcbiAgICBtYXA/LmZpdEJvdW5kcyhsYXRMbmcsIHBhZGRpbmcpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHBhblRvQm91bmRzKFxuICAgIGxhdExuZzogQm91bmRzTGl0ZXJhbCxcbiAgICBwYWRkaW5nPzogbnVtYmVyIHwgZ29vZ2xlLm1hcHMuUGFkZGluZyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbWFwID0gYXdhaXQgdGhpcy5fYXBpO1xuICAgIHJldHVybiBtYXA/LnBhblRvQm91bmRzKGxhdExuZywgcGFkZGluZyk7XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlcnMgdGhlIGdpdmVuIGV2ZW50IG5hbWUgb24gdGhlIG1hcCBpbnN0YW5jZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyB0cmlnZ2VyTWFwRXZlbnQoZXZlbnROYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBtYXAgPSBhd2FpdCB0aGlzLl9hcGk7XG4gICAgaWYgKG1hcCkge1xuICAgICAgZ29vZ2xlLm1hcHMuZXZlbnQudHJpZ2dlcihtYXAsIGV2ZW50TmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIF9pc0xhdExuZ0JvdW5kc0xpdGVyYWwoXG4gICAgYm91bmRzOiBnb29nbGUubWFwcy5MYXRMbmdCb3VuZHMgfCBnb29nbGUubWFwcy5MYXRMbmdCb3VuZHNMaXRlcmFsLFxuICApOiBib3VuZHMgaXMgZ29vZ2xlLm1hcHMuTGF0TG5nQm91bmRzTGl0ZXJhbCB7XG4gICAgcmV0dXJuIGJvdW5kcyAhPSBudWxsICYmIChib3VuZHMgYXMgYW55KS5leHRlbmQgPT09IHVuZGVmaW5lZDtcbiAgfVxufVxuIl19