UNPKG

@boldadmin/angular-google-maps

Version:
352 lines 23.9 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Injectable } from '@angular/core'; import { EventPublisher } from '@boldadmin/event-publisher'; import { Coordinates } from '../value-object/coordinates'; import { Location } from '../value-object/location'; import { AngularGoogleMapsGeocoder } from './angular-google-maps-geocoder.service'; import { GoogleMapsFactory } from './google-maps-factory.service'; var AngularGoogleMapsBuilder = /** @class */ (function () { function AngularGoogleMapsBuilder(googleMapsFactory, geocoder, eventPublisher) { this.googleMapsFactory = googleMapsFactory; this.geocoder = geocoder; this.eventPublisher = eventPublisher; } /** * @template THIS * @this {THIS} * @param {?} mapOptions * @return {THIS} */ AngularGoogleMapsBuilder.prototype.createMap = /** * @template THIS * @this {THIS} * @param {?} mapOptions * @return {THIS} */ function (mapOptions) { (/** @type {?} */ (this)).map = (/** @type {?} */ (this)).googleMapsFactory.createMap(mapOptions); return (/** @type {?} */ (this)); }; /** * @template THIS * @this {THIS} * @param {?} markerOptions * @return {THIS} */ AngularGoogleMapsBuilder.prototype.addCenterMarker = /** * @template THIS * @this {THIS} * @param {?} markerOptions * @return {THIS} */ function (markerOptions) { (/** @type {?} */ (this)).marker = (/** @type {?} */ (this)).googleMapsFactory.createMarker(markerOptions); (/** @type {?} */ (this)).marker.setPosition((/** @type {?} */ (this)).map.getCenter()); (/** @type {?} */ (this)).marker.setMap((/** @type {?} */ (this)).map); (/** @type {?} */ (this)).addMarkerListeners(); return (/** @type {?} */ (this)); }; /** * @template THIS * @this {THIS} * @param {?} circleOptions * @return {THIS} */ AngularGoogleMapsBuilder.prototype.addCircle = /** * @template THIS * @this {THIS} * @param {?} circleOptions * @return {THIS} */ function (circleOptions) { var _this = this; (/** @type {?} */ (this)).circle = (/** @type {?} */ (this)).googleMapsFactory.createCircle(circleOptions); (/** @type {?} */ (this)).circle.setMap((/** @type {?} */ (this)).map); (/** @type {?} */ (this)).circle.addListener('radius_changed', (/** * @return {?} */ function () { return (/** @type {?} */ (_this)).notifyLocationChange(); })); return (/** @type {?} */ (this)); }; /** * @template THIS * @this {THIS} * @param {?} polylineOptions * @return {THIS} */ AngularGoogleMapsBuilder.prototype.addPolyline = /** * @template THIS * @this {THIS} * @param {?} polylineOptions * @return {THIS} */ function (polylineOptions) { /** @type {?} */ var polyline = (/** @type {?} */ (this)).googleMapsFactory.createPolyline(polylineOptions); polyline.setMap((/** @type {?} */ (this)).map); return (/** @type {?} */ (this)); }; /** * @template THIS * @this {THIS} * @param {?} markerOptions * @return {THIS} */ AngularGoogleMapsBuilder.prototype.addMarker = /** * @template THIS * @this {THIS} * @param {?} markerOptions * @return {THIS} */ function (markerOptions) { /** @type {?} */ var marker = (/** @type {?} */ (this)).googleMapsFactory.createMarker(markerOptions); marker.setMap((/** @type {?} */ (this)).map); return (/** @type {?} */ (this)); }; /** * @template THIS * @this {THIS} * @return {THIS} */ AngularGoogleMapsBuilder.prototype.bindCircleToMarker = /** * @template THIS * @this {THIS} * @return {THIS} */ function () { (/** @type {?} */ (this)).circle.bindTo('center', (/** @type {?} */ (this)).marker, 'position'); return (/** @type {?} */ (this)); }; /** * @template THIS * @this {THIS} * @return {THIS} */ AngularGoogleMapsBuilder.prototype.hideMarker = /** * @template THIS * @this {THIS} * @return {THIS} */ function () { (/** @type {?} */ (this)).marker.setMap(null); return (/** @type {?} */ (this)); }; /** * @template THIS * @this {THIS} * @return {THIS} */ AngularGoogleMapsBuilder.prototype.hideCircle = /** * @template THIS * @this {THIS} * @return {THIS} */ function () { (/** @type {?} */ (this)).circle.setMap(null); return (/** @type {?} */ (this)); }; /** * @template THIS * @this {THIS} * @return {THIS} */ AngularGoogleMapsBuilder.prototype.addSearchBox = /** * @template THIS * @this {THIS} * @return {THIS} */ function () { var _this = this; /** @type {?} */ var box = (/** @type {?} */ (this)).googleMapsFactory.createSearchBox(); box.addListener('places_changed', (/** * @return {?} */ function () { /** @type {?} */ var places = box.getPlaces(); if (places[0]) { (/** @type {?} */ (_this)).changeMapLocationAndZoom(places[0].geometry.location); (/** @type {?} */ (_this)).changeMarkerLocation(places[0].geometry.location); /** @type {?} */ var loc = places[0].geometry.location; /** @type {?} */ var coordinates = new Coordinates(loc.lat(), loc.lng()); (/** @type {?} */ (_this)).eventPublisher.notify('locationChanged', new Location(coordinates, (/** @type {?} */ (_this)).circle.getRadius())); } })); return (/** @type {?} */ (this)); }; /** * @private * @return {?} */ AngularGoogleMapsBuilder.prototype.addMarkerListeners = /** * @private * @return {?} */ function () { var _this = this; this.marker.addListener('dragend', (/** * @return {?} */ function () { return _this.notifyLocationChange(); })); this.marker.addListener('dragend', (/** * @param {?} mouseEvent * @return {?} */ function (mouseEvent) { return _this.reverseGeocode(mouseEvent); })); this.map.addListener('click', (/** * @param {?} mouseEvent * @return {?} */ function (mouseEvent) { return _this.changeMarkerLocation(mouseEvent.latLng); })); this.map.addListener('click', (/** * @return {?} */ function () { return _this.notifyLocationChange(); })); this.map.addListener('click', (/** * @param {?} mouseEvent * @return {?} */ function (mouseEvent) { return _this.reverseGeocode(mouseEvent); })); }; /** * @private * @return {?} */ AngularGoogleMapsBuilder.prototype.notifyLocationChange = /** * @private * @return {?} */ function () { this.eventPublisher.notify('locationChanged', new Location(this.getCoordinates(), this.getRadius())); }; /** * @private * @return {?} */ AngularGoogleMapsBuilder.prototype.getRadius = /** * @private * @return {?} */ function () { /** @type {?} */ var radiusInMeters = 0; if (this.circle !== undefined) radiusInMeters = this.circle.getRadius(); return radiusInMeters; }; /** * @private * @return {?} */ AngularGoogleMapsBuilder.prototype.getCoordinates = /** * @private * @return {?} */ function () { /** @type {?} */ var coordinates = new Coordinates(0, 0); if (this.marker !== undefined) coordinates = new Coordinates(this.marker.getPosition().lat(), this.marker.getPosition().lng()); return coordinates; }; /** * @private * @param {?} location * @return {?} */ AngularGoogleMapsBuilder.prototype.changeMapLocationAndZoom = /** * @private * @param {?} location * @return {?} */ function (location) { this.map.panTo(location); this.map.setZoom(16); }; /** * @private * @param {?} location * @return {?} */ AngularGoogleMapsBuilder.prototype.changeMarkerLocation = /** * @private * @param {?} location * @return {?} */ function (location) { this.circle.setMap(this.map); this.marker.setMap(this.map); this.marker.setPosition(location); }; /** * @private * @param {?} e * @return {?} */ AngularGoogleMapsBuilder.prototype.reverseGeocode = /** * @private * @param {?} e * @return {?} */ function (e) { var _this = this; this.geocoder.reverseGeocode(new Coordinates(e.latLng.lat(), e.latLng.lng()), (/** * @param {?} address * @return {?} */ function (address) { return _this.eventPublisher.notify('addressReverseGeocoded', address); })); }; AngularGoogleMapsBuilder.decorators = [ { type: Injectable } ]; /** @nocollapse */ AngularGoogleMapsBuilder.ctorParameters = function () { return [ { type: GoogleMapsFactory }, { type: AngularGoogleMapsGeocoder }, { type: EventPublisher } ]; }; return AngularGoogleMapsBuilder; }()); export { AngularGoogleMapsBuilder }; if (false) { /** * @type {?} * @private */ AngularGoogleMapsBuilder.prototype.map; /** * @type {?} * @private */ AngularGoogleMapsBuilder.prototype.marker; /** * @type {?} * @private */ AngularGoogleMapsBuilder.prototype.circle; /** * @type {?} * @private */ AngularGoogleMapsBuilder.prototype.googleMapsFactory; /** * @type {?} * @private */ AngularGoogleMapsBuilder.prototype.geocoder; /** * @type {?} * @private */ AngularGoogleMapsBuilder.prototype.eventPublisher; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1nb29nbGUtbWFwcy1idWlsZGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AYm9sZGFkbWluL2FuZ3VsYXItZ29vZ2xlLW1hcHMvIiwic291cmNlcyI6WyJzZXJ2aWNlL2FuZ3VsYXItZ29vZ2xlLW1hcHMtYnVpbGRlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQzFDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQTtBQUMzRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNkJBQTZCLENBQUE7QUFDekQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDBCQUEwQixDQUFBO0FBQ25ELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHdDQUF3QyxDQUFBO0FBQ2xGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLCtCQUErQixDQUFBO0FBWWpFO0lBT0ksa0NBQW9CLGlCQUFvQyxFQUNwQyxRQUFtQyxFQUNuQyxjQUE4QjtRQUY5QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLGFBQVEsR0FBUixRQUFRLENBQTJCO1FBQ25DLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtJQUMvQyxDQUFDOzs7Ozs7O0lBRUosNENBQVM7Ozs7OztJQUFULFVBQVUsVUFBc0I7UUFDNUIsbUJBQUEsSUFBSSxFQUFBLENBQUMsR0FBRyxHQUFHLG1CQUFBLElBQUksRUFBQSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUV2RCxPQUFPLG1CQUFBLElBQUksRUFBQSxDQUFBO0lBQ2YsQ0FBQzs7Ozs7OztJQUVELGtEQUFlOzs7Ozs7SUFBZixVQUFnQixhQUE0QjtRQUN4QyxtQkFBQSxJQUFJLEVBQUEsQ0FBQyxNQUFNLEdBQUcsbUJBQUEsSUFBSSxFQUFBLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBQ2hFLG1CQUFBLElBQUksRUFBQSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsbUJBQUEsSUFBSSxFQUFBLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUE7UUFDN0MsbUJBQUEsSUFBSSxFQUFBLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxtQkFBQSxJQUFJLEVBQUEsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUM1QixtQkFBQSxJQUFJLEVBQUEsQ0FBQyxrQkFBa0IsRUFBRSxDQUFBO1FBQ3pCLE9BQU8sbUJBQUEsSUFBSSxFQUFBLENBQUE7SUFDZixDQUFDOzs7Ozs7O0lBRUQsNENBQVM7Ozs7OztJQUFULFVBQVUsYUFBNEI7UUFBdEMsaUJBS0M7UUFKRyxtQkFBQSxJQUFJLEVBQUEsQ0FBQyxNQUFNLEdBQUcsbUJBQUEsSUFBSSxFQUFBLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBQ2hFLG1CQUFBLElBQUksRUFBQSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsbUJBQUEsSUFBSSxFQUFBLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDNUIsbUJBQUEsSUFBSSxFQUFBLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0I7OztRQUFFLGNBQU0sT0FBQSxtQkFBQSxLQUFJLEVBQUEsQ0FBQyxvQkFBb0IsRUFBRSxFQUEzQixDQUEyQixFQUFDLENBQUE7UUFDNUUsT0FBTyxtQkFBQSxJQUFJLEVBQUEsQ0FBQTtJQUNmLENBQUM7Ozs7Ozs7SUFFRCw4Q0FBVzs7Ozs7O0lBQVgsVUFBWSxlQUFnQzs7WUFDbEMsUUFBUSxHQUFHLG1CQUFBLElBQUksRUFBQSxDQUFDLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUM7UUFDdkUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxtQkFBQSxJQUFJLEVBQUEsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUN6QixPQUFPLG1CQUFBLElBQUksRUFBQSxDQUFBO0lBQ2YsQ0FBQzs7Ozs7OztJQUVELDRDQUFTOzs7Ozs7SUFBVCxVQUFVLGFBQTRCOztZQUM1QixNQUFNLEdBQUcsbUJBQUEsSUFBSSxFQUFBLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQztRQUNqRSxNQUFNLENBQUMsTUFBTSxDQUFDLG1CQUFBLElBQUksRUFBQSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ3ZCLE9BQU8sbUJBQUEsSUFBSSxFQUFBLENBQUE7SUFDZixDQUFDOzs7Ozs7SUFFRCxxREFBa0I7Ozs7O0lBQWxCO1FBQ0ksbUJBQUEsSUFBSSxFQUFBLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsbUJBQUEsSUFBSSxFQUFBLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFBO1FBQ3JELE9BQU8sbUJBQUEsSUFBSSxFQUFBLENBQUE7SUFDZixDQUFDOzs7Ozs7SUFFRCw2Q0FBVTs7Ozs7SUFBVjtRQUNJLG1CQUFBLElBQUksRUFBQSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDeEIsT0FBTyxtQkFBQSxJQUFJLEVBQUEsQ0FBQTtJQUNmLENBQUM7Ozs7OztJQUVELDZDQUFVOzs7OztJQUFWO1FBQ0ksbUJBQUEsSUFBSSxFQUFBLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUN4QixPQUFPLG1CQUFBLElBQUksRUFBQSxDQUFBO0lBQ2YsQ0FBQzs7Ozs7O0lBRUQsK0NBQVk7Ozs7O0lBQVo7UUFBQSxpQkFjQzs7WUFiUyxHQUFHLEdBQUcsbUJBQUEsSUFBSSxFQUFBLENBQUMsaUJBQWlCLENBQUMsZUFBZSxFQUFFO1FBRXBELEdBQUcsQ0FBQyxXQUFXLENBQUMsZ0JBQWdCOzs7UUFBRTs7Z0JBQ3hCLE1BQU0sR0FBRyxHQUFHLENBQUMsU0FBUyxFQUFFO1lBQzlCLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUNYLG1CQUFBLEtBQUksRUFBQSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUE7Z0JBQzFELG1CQUFBLEtBQUksRUFBQSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUE7O29CQUNoRCxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFROztvQkFDakMsV0FBVyxHQUFHLElBQUksV0FBVyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ3pELG1CQUFBLEtBQUksRUFBQSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxRQUFRLENBQUMsV0FBVyxFQUFFLG1CQUFBLEtBQUksRUFBQSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUE7YUFDcEc7UUFDTCxDQUFDLEVBQUMsQ0FBQTtRQUNGLE9BQU8sbUJBQUEsSUFBSSxFQUFBLENBQUE7SUFDZixDQUFDOzs7OztJQUVPLHFEQUFrQjs7OztJQUExQjtRQUFBLGlCQU1DO1FBTEcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsU0FBUzs7O1FBQUUsY0FBTSxPQUFBLEtBQUksQ0FBQyxvQkFBb0IsRUFBRSxFQUEzQixDQUEyQixFQUFDLENBQUE7UUFDckUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsU0FBUzs7OztRQUFFLFVBQUEsVUFBVSxJQUFJLE9BQUEsS0FBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsRUFBL0IsQ0FBK0IsRUFBQyxDQUFBO1FBQ2pGLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLE9BQU87Ozs7UUFBRSxVQUFBLFVBQVUsSUFBSSxPQUFBLEtBQUksQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQTVDLENBQTRDLEVBQUMsQ0FBQTtRQUN6RixJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxPQUFPOzs7UUFBRSxjQUFNLE9BQUEsS0FBSSxDQUFDLG9CQUFvQixFQUFFLEVBQTNCLENBQTJCLEVBQUMsQ0FBQTtRQUNoRSxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxPQUFPOzs7O1FBQUUsVUFBQSxVQUFVLElBQUksT0FBQSxLQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxFQUEvQixDQUErQixFQUFDLENBQUE7SUFDaEYsQ0FBQzs7Ozs7SUFFTyx1REFBb0I7Ozs7SUFBNUI7UUFDSSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUN4RyxDQUFDOzs7OztJQUVPLDRDQUFTOzs7O0lBQWpCOztZQUNRLGNBQWMsR0FBRyxDQUFDO1FBQ3RCLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxTQUFTO1lBQ3pCLGNBQWMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFBO1FBRTVDLE9BQU8sY0FBYyxDQUFBO0lBQ3pCLENBQUM7Ozs7O0lBRU8saURBQWM7Ozs7SUFBdEI7O1lBQ1EsV0FBVyxHQUFHLElBQUksV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdkMsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLFNBQVM7WUFDekIsV0FBVyxHQUFHLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFBO1FBRW5HLE9BQU8sV0FBVyxDQUFBO0lBQ3RCLENBQUM7Ozs7OztJQUVPLDJEQUF3Qjs7Ozs7SUFBaEMsVUFBaUMsUUFBZ0I7UUFDN0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDeEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDeEIsQ0FBQzs7Ozs7O0lBRU8sdURBQW9COzs7OztJQUE1QixVQUE2QixRQUFnQjtRQUN6QyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQzVCLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ3JDLENBQUM7Ozs7OztJQUNPLGlEQUFjOzs7OztJQUF0QixVQUF1QixDQUFhO1FBQXBDLGlCQUlDO1FBSEcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDOzs7O1FBQUUsVUFBQyxPQUFlO1lBQzFGLE9BQUEsS0FBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsd0JBQXdCLEVBQUUsT0FBTyxDQUFDO1FBQTdELENBQTZELEVBQ2hFLENBQUE7SUFDTCxDQUFDOztnQkF0SEosVUFBVTs7OztnQkFaRixpQkFBaUI7Z0JBRGpCLHlCQUF5QjtnQkFIekIsY0FBYzs7SUF1SXZCLCtCQUFDO0NBQUEsQUF2SEQsSUF1SEM7U0F0SFksd0JBQXdCOzs7Ozs7SUFFakMsdUNBQWdCOzs7OztJQUNoQiwwQ0FBc0I7Ozs7O0lBQ3RCLDBDQUFzQjs7Ozs7SUFFVixxREFBNEM7Ozs7O0lBQzVDLDRDQUEyQzs7Ozs7SUFDM0Msa0RBQXNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQgeyBFdmVudFB1Ymxpc2hlciB9IGZyb20gJ0Bib2xkYWRtaW4vZXZlbnQtcHVibGlzaGVyJ1xuaW1wb3J0IHsgQ29vcmRpbmF0ZXMgfSBmcm9tICcuLi92YWx1ZS1vYmplY3QvY29vcmRpbmF0ZXMnXG5pbXBvcnQgeyBMb2NhdGlvbiB9IGZyb20gJy4uL3ZhbHVlLW9iamVjdC9sb2NhdGlvbidcbmltcG9ydCB7IEFuZ3VsYXJHb29nbGVNYXBzR2VvY29kZXIgfSBmcm9tICcuL2FuZ3VsYXItZ29vZ2xlLW1hcHMtZ2VvY29kZXIuc2VydmljZSdcbmltcG9ydCB7IEdvb2dsZU1hcHNGYWN0b3J5IH0gZnJvbSAnLi9nb29nbGUtbWFwcy1mYWN0b3J5LnNlcnZpY2UnXG5pbXBvcnQgQ2lyY2xlID0gZ29vZ2xlLm1hcHMuQ2lyY2xlXG5pbXBvcnQgQ2lyY2xlT3B0aW9ucyA9IGdvb2dsZS5tYXBzLkNpcmNsZU9wdGlvbnNcbmltcG9ydCBMYXRMbmcgPSBnb29nbGUubWFwcy5MYXRMbmdcbmltcG9ydCBNYXAgPSBnb29nbGUubWFwcy5NYXBcbmltcG9ydCBNYXBPcHRpb25zID0gZ29vZ2xlLm1hcHMuTWFwT3B0aW9uc1xuaW1wb3J0IE1hcmtlciA9IGdvb2dsZS5tYXBzLk1hcmtlclxuaW1wb3J0IE1hcmtlck9wdGlvbnMgPSBnb29nbGUubWFwcy5NYXJrZXJPcHRpb25zXG5pbXBvcnQgTW91c2VFdmVudCA9IGdvb2dsZS5tYXBzLk1vdXNlRXZlbnRcbmltcG9ydCBQb2x5bGluZU9wdGlvbnMgPSBnb29nbGUubWFwcy5Qb2x5bGluZU9wdGlvbnNcblxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQW5ndWxhckdvb2dsZU1hcHNCdWlsZGVyIHtcblxuICAgIHByaXZhdGUgbWFwOiBNYXBcbiAgICBwcml2YXRlIG1hcmtlcjogTWFya2VyXG4gICAgcHJpdmF0ZSBjaXJjbGU6IENpcmNsZVxuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBnb29nbGVNYXBzRmFjdG9yeTogR29vZ2xlTWFwc0ZhY3RvcnksXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBnZW9jb2RlcjogQW5ndWxhckdvb2dsZU1hcHNHZW9jb2RlcixcbiAgICAgICAgICAgICAgICBwcml2YXRlIGV2ZW50UHVibGlzaGVyOiBFdmVudFB1Ymxpc2hlclxuICAgICkge31cblxuICAgIGNyZWF0ZU1hcChtYXBPcHRpb25zOiBNYXBPcHRpb25zKSB7XG4gICAgICAgIHRoaXMubWFwID0gdGhpcy5nb29nbGVNYXBzRmFjdG9yeS5jcmVhdGVNYXAobWFwT3B0aW9ucylcblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIGFkZENlbnRlck1hcmtlcihtYXJrZXJPcHRpb25zOiBNYXJrZXJPcHRpb25zKSB7XG4gICAgICAgIHRoaXMubWFya2VyID0gdGhpcy5nb29nbGVNYXBzRmFjdG9yeS5jcmVhdGVNYXJrZXIobWFya2VyT3B0aW9ucylcbiAgICAgICAgdGhpcy5tYXJrZXIuc2V0UG9zaXRpb24odGhpcy5tYXAuZ2V0Q2VudGVyKCkpXG4gICAgICAgIHRoaXMubWFya2VyLnNldE1hcCh0aGlzLm1hcClcbiAgICAgICAgdGhpcy5hZGRNYXJrZXJMaXN0ZW5lcnMoKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIGFkZENpcmNsZShjaXJjbGVPcHRpb25zOiBDaXJjbGVPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuY2lyY2xlID0gdGhpcy5nb29nbGVNYXBzRmFjdG9yeS5jcmVhdGVDaXJjbGUoY2lyY2xlT3B0aW9ucylcbiAgICAgICAgdGhpcy5jaXJjbGUuc2V0TWFwKHRoaXMubWFwKVxuICAgICAgICB0aGlzLmNpcmNsZS5hZGRMaXN0ZW5lcigncmFkaXVzX2NoYW5nZWQnLCAoKSA9PiB0aGlzLm5vdGlmeUxvY2F0aW9uQ2hhbmdlKCkpXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgYWRkUG9seWxpbmUocG9seWxpbmVPcHRpb25zOiBQb2x5bGluZU9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgcG9seWxpbmUgPSB0aGlzLmdvb2dsZU1hcHNGYWN0b3J5LmNyZWF0ZVBvbHlsaW5lKHBvbHlsaW5lT3B0aW9ucylcbiAgICAgICAgcG9seWxpbmUuc2V0TWFwKHRoaXMubWFwKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIGFkZE1hcmtlcihtYXJrZXJPcHRpb25zOiBNYXJrZXJPcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG1hcmtlciA9IHRoaXMuZ29vZ2xlTWFwc0ZhY3RvcnkuY3JlYXRlTWFya2VyKG1hcmtlck9wdGlvbnMpXG4gICAgICAgIG1hcmtlci5zZXRNYXAodGhpcy5tYXApXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgYmluZENpcmNsZVRvTWFya2VyKCkge1xuICAgICAgICB0aGlzLmNpcmNsZS5iaW5kVG8oJ2NlbnRlcicsIHRoaXMubWFya2VyLCAncG9zaXRpb24nKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIGhpZGVNYXJrZXIoKSB7XG4gICAgICAgIHRoaXMubWFya2VyLnNldE1hcChudWxsKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIGhpZGVDaXJjbGUoKSB7XG4gICAgICAgIHRoaXMuY2lyY2xlLnNldE1hcChudWxsKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIGFkZFNlYXJjaEJveCgpIHtcbiAgICAgICAgY29uc3QgYm94ID0gdGhpcy5nb29nbGVNYXBzRmFjdG9yeS5jcmVhdGVTZWFyY2hCb3goKVxuXG4gICAgICAgIGJveC5hZGRMaXN0ZW5lcigncGxhY2VzX2NoYW5nZWQnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwbGFjZXMgPSBib3guZ2V0UGxhY2VzKClcbiAgICAgICAgICAgIGlmIChwbGFjZXNbMF0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZU1hcExvY2F0aW9uQW5kWm9vbShwbGFjZXNbMF0uZ2VvbWV0cnkubG9jYXRpb24pXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VNYXJrZXJMb2NhdGlvbihwbGFjZXNbMF0uZ2VvbWV0cnkubG9jYXRpb24pXG4gICAgICAgICAgICAgICAgY29uc3QgbG9jID0gcGxhY2VzWzBdLmdlb21ldHJ5LmxvY2F0aW9uXG4gICAgICAgICAgICAgICAgY29uc3QgY29vcmRpbmF0ZXMgPSBuZXcgQ29vcmRpbmF0ZXMobG9jLmxhdCgpLCBsb2MubG5nKCkpXG4gICAgICAgICAgICAgICAgdGhpcy5ldmVudFB1Ymxpc2hlci5ub3RpZnkoJ2xvY2F0aW9uQ2hhbmdlZCcsIG5ldyBMb2NhdGlvbihjb29yZGluYXRlcywgdGhpcy5jaXJjbGUuZ2V0UmFkaXVzKCkpKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHByaXZhdGUgYWRkTWFya2VyTGlzdGVuZXJzKCkge1xuICAgICAgICB0aGlzLm1hcmtlci5hZGRMaXN0ZW5lcignZHJhZ2VuZCcsICgpID0+IHRoaXMubm90aWZ5TG9jYXRpb25DaGFuZ2UoKSlcbiAgICAgICAgdGhpcy5tYXJrZXIuYWRkTGlzdGVuZXIoJ2RyYWdlbmQnLCBtb3VzZUV2ZW50ID0+IHRoaXMucmV2ZXJzZUdlb2NvZGUobW91c2VFdmVudCkpXG4gICAgICAgIHRoaXMubWFwLmFkZExpc3RlbmVyKCdjbGljaycsIG1vdXNlRXZlbnQgPT4gdGhpcy5jaGFuZ2VNYXJrZXJMb2NhdGlvbihtb3VzZUV2ZW50LmxhdExuZykpXG4gICAgICAgIHRoaXMubWFwLmFkZExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMubm90aWZ5TG9jYXRpb25DaGFuZ2UoKSlcbiAgICAgICAgdGhpcy5tYXAuYWRkTGlzdGVuZXIoJ2NsaWNrJywgbW91c2VFdmVudCA9PiB0aGlzLnJldmVyc2VHZW9jb2RlKG1vdXNlRXZlbnQpKVxuICAgIH1cblxuICAgIHByaXZhdGUgbm90aWZ5TG9jYXRpb25DaGFuZ2UoKSB7XG4gICAgICAgIHRoaXMuZXZlbnRQdWJsaXNoZXIubm90aWZ5KCdsb2NhdGlvbkNoYW5nZWQnLCBuZXcgTG9jYXRpb24odGhpcy5nZXRDb29yZGluYXRlcygpLCB0aGlzLmdldFJhZGl1cygpKSlcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFJhZGl1cygpIHtcbiAgICAgICAgbGV0IHJhZGl1c0luTWV0ZXJzID0gMFxuICAgICAgICBpZiAodGhpcy5jaXJjbGUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJhZGl1c0luTWV0ZXJzID0gdGhpcy5jaXJjbGUuZ2V0UmFkaXVzKClcblxuICAgICAgICByZXR1cm4gcmFkaXVzSW5NZXRlcnNcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldENvb3JkaW5hdGVzKCkge1xuICAgICAgICBsZXQgY29vcmRpbmF0ZXMgPSBuZXcgQ29vcmRpbmF0ZXMoMCwgMClcbiAgICAgICAgaWYgKHRoaXMubWFya2VyICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICBjb29yZGluYXRlcyA9IG5ldyBDb29yZGluYXRlcyh0aGlzLm1hcmtlci5nZXRQb3NpdGlvbigpLmxhdCgpLCB0aGlzLm1hcmtlci5nZXRQb3NpdGlvbigpLmxuZygpKVxuXG4gICAgICAgIHJldHVybiBjb29yZGluYXRlc1xuICAgIH1cblxuICAgIHByaXZhdGUgY2hhbmdlTWFwTG9jYXRpb25BbmRab29tKGxvY2F0aW9uOiBMYXRMbmcpIHtcbiAgICAgICAgdGhpcy5tYXAucGFuVG8obG9jYXRpb24pXG4gICAgICAgIHRoaXMubWFwLnNldFpvb20oMTYpXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjaGFuZ2VNYXJrZXJMb2NhdGlvbihsb2NhdGlvbjogTGF0TG5nKSB7XG4gICAgICAgIHRoaXMuY2lyY2xlLnNldE1hcCh0aGlzLm1hcClcbiAgICAgICAgdGhpcy5tYXJrZXIuc2V0TWFwKHRoaXMubWFwKVxuICAgICAgICB0aGlzLm1hcmtlci5zZXRQb3NpdGlvbihsb2NhdGlvbilcbiAgICB9XG4gICAgcHJpdmF0ZSByZXZlcnNlR2VvY29kZShlOiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIHRoaXMuZ2VvY29kZXIucmV2ZXJzZUdlb2NvZGUobmV3IENvb3JkaW5hdGVzKGUubGF0TG5nLmxhdCgpLCBlLmxhdExuZy5sbmcoKSksIChhZGRyZXNzOiBzdHJpbmcpID0+XG4gICAgICAgICAgICB0aGlzLmV2ZW50UHVibGlzaGVyLm5vdGlmeSgnYWRkcmVzc1JldmVyc2VHZW9jb2RlZCcsIGFkZHJlc3MpXG4gICAgICAgIClcbiAgICB9XG59XG4iXX0=