UNPKG

@ng-maps/core

Version:

**@ng-maps/core** is a simple, modular and tree-shakable library for displaying google-maps inside an angular application

333 lines 37.1 kB
import { Component, ContentChildren, EventEmitter, forwardRef, Input, Output, QueryList, } from '@angular/core'; import { ReplaySubject, Subscription } from 'rxjs'; import { FitBoundsAccessor } from '../services/fit-bounds'; import { MarkerManager } from '../services/managers/marker.manager'; import { NgMapsInfoWindowComponent } from './info-window'; import * as i0 from "@angular/core"; import * as i1 from "../services/managers/marker.manager"; let markerId = 0; /** * NgMapsMarkerComponent renders a map marker inside a {@link NgMapsViewComponent}. * * @example * <agm-map [latitude]="lat" [longitude]="lng" [zoom]="zoom"> * <agm-marker [latitude]="lat" [longitude]="lng" label="M"></agm-marker> * </agm-map> */ export class NgMapsMarkerComponent { constructor(markerManager) { this.markerManager = markerManager; /** * If true, the marker can be dragged. Default value is false. */ // eslint-disable-next-line @angular-eslint/no-input-rename this.draggable = false; this.icon = null; /** * If true, the marker is visible */ this.visible = true; /** * Whether to automatically open the child info window when the marker is clicked. */ this.openInfoWindow = true; /** * The marker's opacity between 0.0 and 1.0. */ this.opacity = 1; /** * Marker optimize flag. If it is false then it prevent duplicate rendering. * Default it is true */ this.optimized = true; /** * All markers are displayed on the map in order of their zIndex, with higher values displaying in * front of markers with lower values. By default, markers are displayed according to their * vertical position on screen, with lower markers appearing in front of markers further up the * screen. */ this.zIndex = 1; /** * If true, the marker can be clicked. Default value is true. */ // eslint-disable-next-line @angular-eslint/no-input-rename this.clickable = true; /** * This event emitter gets emitted when the user clicks on the marker. */ this.markerClick = new EventEmitter(); /** * This event is fired when the user rightclicks on the marker. */ this.markerRightClick = new EventEmitter(); /** * This event is fired when the user starts dragging the marker. */ this.dragStart = new EventEmitter(); /** * This event is repeatedly fired while the user drags the marker. */ this.drag = new EventEmitter(); /** * This event is fired when the user stops dragging the marker. */ this.dragEnd = new EventEmitter(); /** * This event is fired when the user mouses over the marker. */ this.mouseOver = new EventEmitter(); /** * This event is fired when the user mouses outside the marker. */ this.mouseOut = new EventEmitter(); /** * @internal */ this.infoWindow = new QueryList(); this._markerAddedToManger = false; this.subscription = new Subscription(); this._fitBoundsDetails$ = new ReplaySubject(1); this._id = (markerId++).toString(); } /** * @internal */ ngAfterContentInit() { this.handleInfoWindowUpdate(); this.infoWindow.changes.subscribe(() => this.handleInfoWindowUpdate()); } handleInfoWindowUpdate() { if (this.infoWindow.length > 1) { throw new Error('Expected no more than one info window.'); } this.infoWindow.forEach((marker) => { marker.hostMarker = this; }); } /** * @internal */ ngOnChanges(changes) { if (typeof this.latitude === 'string') { this.latitude = Number(this.latitude); } if (typeof this.longitude === 'string') { this.longitude = Number(this.longitude); } if (typeof this.latitude !== 'number' || typeof this.longitude !== 'number') { return; } if (!this._markerAddedToManger) { this.markerManager.addMarker(this).then(() => { this._updateFitBoundsDetails(); this._markerAddedToManger = true; this._addEventListeners(); }); return; } if (changes.latitude || changes.longitude) { this.markerManager.updateMarkerPosition(this); this._updateFitBoundsDetails(); } if (changes.title) { this.markerManager.updateTitle(this); } if (changes.label) { this.markerManager.updateLabel(this); } if (changes.draggable) { this.markerManager.updateDraggable(this); } if (changes.iconUrl) { this.markerManager.updateIconLegacy(this); } if (changes.icon) { this.markerManager.updateIcon(this); } if (changes.opacity) { this.markerManager.updateOpacity(this); } if (changes.visible) { this.markerManager.updateVisible(this); } if (changes.zIndex) { this.markerManager.updateZIndex(this); } if (changes.clickable) { this.markerManager.updateClickable(this); } if (changes.animation) { this.markerManager.updateAnimation(this); } } /** * @internal */ getFitBoundsDetails$() { return this._fitBoundsDetails$.asObservable(); } _updateFitBoundsDetails() { if (this.latitude && this.longitude) { this._fitBoundsDetails$.next({ latLng: { lat: this.latitude, lng: this.longitude }, }); } } _addEventListeners() { const cs = this.markerManager .createEventObservable(['click', 'pointerdown'], this) .subscribe({ next: (event) => { if (this.openInfoWindow) { this.infoWindow.forEach((infoWindow) => infoWindow.open(event)); } this.markerClick.emit(this); }, }); this.subscription.add(cs); const rc = this.markerManager .createEventObservable('rightclick', this) .subscribe(() => { this.markerRightClick.emit(); }); this.subscription.add(rc); const ds = this.markerManager .createEventObservable('dragstart', this) .subscribe((e) => { this.dragStart.emit(e); }); this.subscription.add(ds); const d = this.markerManager .createEventObservable('drag', this) .subscribe((e) => { this.drag.emit(e); }); this.subscription.add(d); const dragend = this.markerManager .createEventObservable('dragend', this) .subscribe((e) => { this.dragEnd.emit(e); }); this.subscription.add(dragend); const mouseover = this.markerManager .createEventObservable(['mouseover', 'pointerenter'], this) .subscribe((e) => { this.mouseOver.emit(e); }); this.subscription.add(mouseover); const mouseout = this.markerManager .createEventObservable(['mouseout', 'pointerleave'], this) .subscribe((e) => { this.mouseOut.emit(e); }); this.subscription.add(mouseout); } /** @internal */ id() { return this._id; } /** @internal */ toString() { return `NgMapsMarker-${this._id}`; } /** @internal */ ngOnDestroy() { this.markerManager.deleteMarker(this); // unsubscribe all registered observable subscription this.subscription.unsubscribe(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: NgMapsMarkerComponent, deps: [{ token: i1.MarkerManager }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.8", type: NgMapsMarkerComponent, selector: "map-marker", inputs: { latitude: "latitude", longitude: "longitude", title: "title", label: "label", draggable: ["markerDraggable", "draggable"], iconUrl: "iconUrl", icon: "icon", openInfoWindow: "openInfoWindow", opacity: "opacity", optimized: "optimized", visible: "visible", zIndex: "zIndex", animation: "animation", clickable: ["markerClickable", "clickable"] }, outputs: { markerClick: "markerClick", dragStart: "dragStart", drag: "drag", dragEnd: "dragEnd", mouseOver: "mouseOver", mouseOut: "mouseOut", markerRightClick: "markerRightClick" }, providers: [ { provide: FitBoundsAccessor, useExisting: forwardRef(() => NgMapsMarkerComponent), }, ], queries: [{ propertyName: "infoWindow", predicate: NgMapsInfoWindowComponent }], usesOnChanges: true, ngImport: i0, template: '<ng-content></ng-content>', isInline: true }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: NgMapsMarkerComponent, decorators: [{ type: Component, args: [{ selector: 'map-marker', providers: [ { provide: FitBoundsAccessor, useExisting: forwardRef(() => NgMapsMarkerComponent), }, ], // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property inputs: [ 'latitude', 'longitude', 'title', 'label', // eslint-disable-next-line @angular-eslint/no-input-rename 'draggable: markerDraggable', 'iconUrl', 'icon', 'openInfoWindow', 'opacity', 'optimized', 'visible', 'zIndex', 'animation', ], // eslint-disable-next-line @angular-eslint/no-outputs-metadata-property outputs: [ 'markerClick', 'dragStart', // eslint-disable-next-line @angular-eslint/no-output-native 'drag', 'dragEnd', 'mouseOver', 'mouseOut', ], template: '<ng-content></ng-content>', }] }], ctorParameters: () => [{ type: i1.MarkerManager }], propDecorators: { latitude: [{ type: Input }], longitude: [{ type: Input }], title: [{ type: Input }], label: [{ type: Input }], draggable: [{ type: Input, args: ['markerDraggable'] }], iconUrl: [{ type: Input }], icon: [{ type: Input }], visible: [{ type: Input }], openInfoWindow: [{ type: Input }], opacity: [{ type: Input }], optimized: [{ type: Input }], zIndex: [{ type: Input }], clickable: [{ type: Input, args: ['markerClickable'] }], markerClick: [{ type: Output }], markerRightClick: [{ type: Output }], dragStart: [{ type: Output }], drag: [{ type: Output }], dragEnd: [{ type: Output }], mouseOver: [{ type: Output }], mouseOut: [{ type: Output }], infoWindow: [{ type: ContentChildren, args: [NgMapsInfoWindowComponent] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvZGlyZWN0aXZlcy9tYXJrZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFDVCxlQUFlLEVBQ2YsWUFBWSxFQUNaLFVBQVUsRUFDVixLQUFLLEVBR0wsTUFBTSxFQUNOLFNBQVMsR0FFVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQWMsYUFBYSxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUkvRCxPQUFPLEVBQUUsaUJBQWlCLEVBQW9CLE1BQU0sd0JBQXdCLENBQUM7QUFDN0UsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBRXBFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBRTFELElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztBQUVqQjs7Ozs7OztHQU9HO0FBc0NILE1BQU0sT0FBTyxxQkFBcUI7SUEwSmhDLFlBQW9CLGFBQTRCO1FBQTVCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBOUhoRDs7V0FFRztRQUNILDJEQUEyRDtRQUMxQixjQUFTLEdBQVksS0FBSyxDQUFDO1FBVTVDLFNBQUksR0FNSyxJQUFJLENBQUM7UUFFOUI7O1dBRUc7UUFDYSxZQUFPLEdBQVksSUFBSSxDQUFDO1FBRXhDOztXQUVHO1FBQ2EsbUJBQWMsR0FBWSxJQUFJLENBQUM7UUFFL0M7O1dBRUc7UUFDYSxZQUFPLEdBQVcsQ0FBQyxDQUFDO1FBRXBDOzs7V0FHRztRQUNhLGNBQVMsR0FBWSxJQUFJLENBQUM7UUFFMUM7Ozs7O1dBS0c7UUFDYSxXQUFNLEdBQVcsQ0FBQyxDQUFDO1FBRW5DOztXQUVHO1FBQ0gsMkRBQTJEO1FBQzFCLGNBQVMsR0FBWSxJQUFJLENBQUM7UUFRM0Q7O1dBRUc7UUFFSSxnQkFBVyxHQUNoQixJQUFJLFlBQVks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RGYsTUFBTTtnQkFRQSxRQUFRO3NCQURkLE1BQU07Z0JBUUEsVUFBVTtzQkFEaEIsZUFBZTt1QkFBQyx5QkFBeUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBTaW1wbGVDaGFuZ2UsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgUmVwbGF5U3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IE1hcmtlckljb24gfSBmcm9tICcuLi9pbnRlcmZhY2UvbWFya2VyLWljb24nO1xuaW1wb3J0IHsgTWFya2VyT3B0aW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZS9tYXJrZXItb3B0aW9ucyc7XG5pbXBvcnQgeyBGaXRCb3VuZHNBY2Nlc3NvciwgRml0Qm91bmRzRGV0YWlscyB9IGZyb20gJy4uL3NlcnZpY2VzL2ZpdC1ib3VuZHMnO1xuaW1wb3J0IHsgTWFya2VyTWFuYWdlciB9IGZyb20gJy4uL3NlcnZpY2VzL21hbmFnZXJzL21hcmtlci5tYW5hZ2VyJztcblxuaW1wb3J0IHsgTmdNYXBzSW5mb1dpbmRvd0NvbXBvbmVudCB9IGZyb20gJy4vaW5mby13aW5kb3cnO1xuXG5sZXQgbWFya2VySWQgPSAwO1xuXG4vKipcbiAqIE5nTWFwc01hcmtlckNvbXBvbmVudCByZW5kZXJzIGEgbWFwIG1hcmtlciBpbnNpZGUgYSB7QGxpbmsgTmdNYXBzVmlld0NvbXBvbmVudH0uXG4gKlxuICogQGV4YW1wbGVcbiAqIDxhZ20tbWFwIFtsYXRpdHVkZV09XCJsYXRcIiBbbG9uZ2l0dWRlXT1cImxuZ1wiIFt6b29tXT1cInpvb21cIj5cbiAqICAgICAgICAgICAgICAgPGFnbS1tYXJrZXIgW2xhdGl0dWRlXT1cImxhdFwiIFtsb25naXR1ZGVdPVwibG5nXCIgbGFiZWw9XCJNXCI+PC9hZ20tbWFya2VyPlxuICogPC9hZ20tbWFwPlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtYXAtbWFya2VyJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogRml0Qm91bmRzQWNjZXNzb3IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBOZ01hcHNNYXJrZXJDb21wb25lbnQpLFxuICAgIH0sXG4gIF0sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8taW5wdXRzLW1ldGFkYXRhLXByb3BlcnR5XG4gIGlucHV0czogW1xuICAgICdsYXRpdHVkZScsXG4gICAgJ2xvbmdpdHVkZScsXG4gICAgJ3RpdGxlJyxcbiAgICAnbGFiZWwnLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8taW5wdXQtcmVuYW1lXG4gICAgJ2RyYWdnYWJsZTogbWFya2VyRHJhZ2dhYmxlJyxcbiAgICAnaWNvblVybCcsXG4gICAgJ2ljb24nLFxuICAgICdvcGVuSW5mb1dpbmRvdycsXG4gICAgJ29wYWNpdHknLFxuICAgICdvcHRpbWl6ZWQnLFxuICAgICd2aXNpYmxlJyxcbiAgICAnekluZGV4JyxcbiAgICAnYW5pbWF0aW9uJyxcbiAgXSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXRzLW1ldGFkYXRhLXByb3BlcnR5XG4gIG91dHB1dHM6IFtcbiAgICAnbWFya2VyQ2xpY2snLFxuICAgICdkcmFnU3RhcnQnLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tb3V0cHV0LW5hdGl2ZVxuICAgICdkcmFnJyxcbiAgICAnZHJhZ0VuZCcsXG4gICAgJ21vdXNlT3ZlcicsXG4gICAgJ21vdXNlT3V0JyxcbiAgXSxcbiAgdGVtcGxhdGU6ICc8bmctY29udGVudD48L25nLWNvbnRlbnQ+Jyxcbn0pXG5leHBvcnQgY2xhc3MgTmdNYXBzTWFya2VyQ29tcG9uZW50XG4gIGltcGxlbWVudHNcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25DaGFuZ2VzLFxuICAgIEFmdGVyQ29udGVudEluaXQsXG4gICAgRml0Qm91bmRzQWNjZXNzb3IsXG4gICAgTWFya2VyT3B0aW9uc1xue1xuICAvKipcbiAgICogVGhlIGxhdGl0dWRlIHBvc2l0aW9uIG9mIHRoZSBtYXJrZXIuXG4gICAqL1xuICBASW5wdXQoKSBwdWJsaWMgbGF0aXR1ZGU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBsb25naXR1ZGUgcG9zaXRpb24gb2YgdGhlIG1hcmtlci5cbiAgICovXG4gIEBJbnB1dCgpIHB1YmxpYyBsb25naXR1ZGU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB0aXRsZSBvZiB0aGUgbWFya2VyLlxuICAgKi9cbiAgQElucHV0KCkgcHVibGljIHRpdGxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbGFiZWwgKGEgc2luZ2xlIHVwcGVyY2FzZSBjaGFyYWN0ZXIpIGZvciB0aGUgbWFya2VyLlxuICAgKi9cbiAgQElucHV0KCkgcHVibGljIGxhYmVsPzogc3RyaW5nIHwgZ29vZ2xlLm1hcHMuTWFya2VyTGFiZWw7XG5cbiAgLyoqXG4gICAqIElmIHRydWUsIHRoZSBtYXJrZXIgY2FuIGJlIGRyYWdnZWQuIERlZmF1bHQgdmFsdWUgaXMgZmFsc2UuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLWlucHV0LXJlbmFtZVxuICBASW5wdXQoJ21hcmtlckRyYWdnYWJsZScpIHB1YmxpYyBkcmFnZ2FibGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogSWNvbiAodGhlIFVSTCBvZiB0aGUgaW1hZ2UpIGZvciB0aGUgZm9yZWdyb3VuZC5cbiAgICogQ2FuIGFsc28gYmUgYSBNYXJrZXJJY29uIChnb29nbGUubWFwcy5JY29uIGluIEdvb2dsZSBNYXBzIEphdmFzY3JpcHQgYXBpKVxuICAgKlxuICAgKiBAc2VlIDxhIGhyZWY9XCJodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9tYXBzL2RvY3VtZW50YXRpb24vamF2YXNjcmlwdC9yZWZlcmVuY2UvbWFya2VyI0ljb25cIj5nb29nbGUubWFwcy5JY29uPC9hPlxuICAgKi9cbiAgQElucHV0KCkgcHVibGljIGljb25Vcmw/OiBzdHJpbmcgfCBnb29nbGUubWFwcy5JY29uO1xuXG4gIEBJbnB1dCgpIHB1YmxpYyBpY29uOlxuICAgIHwgTWFya2VySWNvblxuICAgIHwgc3RyaW5nXG4gICAgfCBnb29nbGUubWFwcy5JY29uXG4gICAgfCBudWxsXG4gICAgfCB1bmRlZmluZWRcbiAgICB8IGdvb2dsZS5tYXBzLlN5bWJvbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIElmIHRydWUsIHRoZSBtYXJrZXIgaXMgdmlzaWJsZVxuICAgKi9cbiAgQElucHV0KCkgcHVibGljIHZpc2libGU6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGF1dG9tYXRpY2FsbHkgb3BlbiB0aGUgY2hpbGQgaW5mbyB3aW5kb3cgd2hlbiB0aGUgbWFya2VyIGlzIGNsaWNrZWQuXG4gICAqL1xuICBASW5wdXQoKSBwdWJsaWMgb3BlbkluZm9XaW5kb3c6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBUaGUgbWFya2VyJ3Mgb3BhY2l0eSBiZXR3ZWVuIDAuMCBhbmQgMS4wLlxuICAgKi9cbiAgQElucHV0KCkgcHVibGljIG9wYWNpdHk6IG51bWJlciA9IDE7XG5cbiAgLyoqXG4gICAqIE1hcmtlciBvcHRpbWl6ZSBmbGFnLiBJZiBpdCBpcyBmYWxzZSB0aGVuIGl0IHByZXZlbnQgZHVwbGljYXRlIHJlbmRlcmluZy5cbiAgICogRGVmYXVsdCBpdCBpcyB0cnVlXG4gICAqL1xuICBASW5wdXQoKSBwdWJsaWMgb3B0aW1pemVkOiBib29sZWFuID0gdHJ1ZTtcblxuICAvKipcbiAgICogQWxsIG1hcmtlcnMgYXJlIGRpc3BsYXllZCBvbiB0aGUgbWFwIGluIG9yZGVyIG9mIHRoZWlyIHpJbmRleCwgd2l0aCBoaWdoZXIgdmFsdWVzIGRpc3BsYXlpbmcgaW5cbiAgICogZnJvbnQgb2YgbWFya2VycyB3aXRoIGxvd2VyIHZhbHVlcy4gQnkgZGVmYXVsdCwgbWFya2VycyBhcmUgZGlzcGxheWVkIGFjY29yZGluZyB0byB0aGVpclxuICAgKiB2ZXJ0aWNhbCBwb3NpdGlvbiBvbiBzY3JlZW4sIHdpdGggbG93ZXIgbWFya2VycyBhcHBlYXJpbmcgaW4gZnJvbnQgb2YgbWFya2VycyBmdXJ0aGVyIHVwIHRoZVxuICAgKiBzY3JlZW4uXG4gICAqL1xuICBASW5wdXQoKSBwdWJsaWMgekluZGV4OiBudW1iZXIgPSAxO1xuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCB0aGUgbWFya2VyIGNhbiBiZSBjbGlja2VkLiBEZWZhdWx0IHZhbHVlIGlzIHRydWUuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLWlucHV0LXJlbmFtZVxuICBASW5wdXQoJ21hcmtlckNsaWNrYWJsZScpIHB1YmxpYyBjbGlja2FibGU6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBXaGljaCBhbmltYXRpb24gdG8gcGxheSB3aGVuIG1hcmtlciBpcyBhZGRlZCB0byBhIG1hcC5cbiAgICogVGhpcyBjYW4gYmUgJ0JPVU5DRScgb3IgJ0RST1AnXG4gICAqL1xuICBwdWJsaWMgYW5pbWF0aW9uPzogJ0JPVU5DRScgfCAnRFJPUCcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGlzIGV2ZW50IGVtaXR0ZXIgZ2V0cyBlbWl0dGVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIG9uIHRoZSBtYXJrZXIuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcHVibGljIG1hcmtlckNsaWNrOiBFdmVudEVtaXR0ZXI8TmdNYXBzTWFya2VyQ29tcG9uZW50PiA9XG4gICAgbmV3IEV2ZW50RW1pdHRlcjxOZ01hcHNNYXJrZXJDb21wb25lbnQ+KCk7XG5cbiAgLyoqXG4gICAqIFRoaXMgZXZlbnQgaXMgZmlyZWQgd2hlbiB0aGUgdXNlciByaWdodGNsaWNrcyBvbiB0aGUgbWFya2VyLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBtYXJrZXJSaWdodENsaWNrOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgLyoqXG4gICAqIFRoaXMgZXZlbnQgaXMgZmlyZWQgd2hlbiB0aGUgdXNlciBzdGFydHMgZHJhZ2dpbmcgdGhlIG1hcmtlci5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgZHJhZ1N0YXJ0OiBFdmVudEVtaXR0ZXI8Z29vZ2xlLm1hcHMuTWFwTW91c2VFdmVudD4gPVxuICAgIG5ldyBFdmVudEVtaXR0ZXI8Z29vZ2xlLm1hcHMuTWFwTW91c2VFdmVudD4oKTtcblxuICAvKipcbiAgICogVGhpcyBldmVudCBpcyByZXBlYXRlZGx5IGZpcmVkIHdoaWxlIHRoZSB1c2VyIGRyYWdzIHRoZSBtYXJrZXIuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtbmF0aXZlXG4gIHB1YmxpYyBkcmFnOiBFdmVudEVtaXR0ZXI8Z29vZ2xlLm1hcHMuTWFwTW91c2VFdmVudD4gPVxuICAgIG5ldyBFdmVudEVtaXR0ZXI8Z29vZ2xlLm1hcHMuTWFwTW91c2VFdmVudD4oKTtcblxuICAvKipcbiAgICogVGhpcyBldmVudCBpcyBmaXJlZCB3aGVuIHRoZSB1c2VyIHN0b3BzIGRyYWdnaW5nIHRoZSBtYXJrZXIuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcHVibGljIGRyYWdFbmQ6IEV2ZW50RW1pdHRlcjxnb29nbGUubWFwcy5NYXBNb3VzZUV2ZW50PiA9XG4gICAgbmV3IEV2ZW50RW1pdHRlcjxnb29nbGUubWFwcy5NYXBNb3VzZUV2ZW50PigpO1xuXG4gIC8qKlxuICAgKiBUaGlzIGV2ZW50IGlzIGZpcmVkIHdoZW4gdGhlIHVzZXIgbW91c2VzIG92ZXIgdGhlIG1hcmtlci5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgbW91c2VPdmVyOiBFdmVudEVtaXR0ZXI8Z29vZ2xlLm1hcHMuTWFwTW91c2VFdmVudD4gPVxuICAgIG5ldyBFdmVudEVtaXR0ZXI8Z29vZ2xlLm1hcHMuTWFwTW91c2VFdmVudD4oKTtcblxuICAvKipcbiAgICogVGhpcyBldmVudCBpcyBmaXJlZCB3aGVuIHRoZSB1c2VyIG1vdXNlcyBvdXRzaWRlIHRoZSBtYXJrZXIuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcHVibGljIG1vdXNlT3V0OiBFdmVudEVtaXR0ZXI8Z29vZ2xlLm1hcHMuTWFwTW91c2VFdmVudD4gPVxuICAgIG5ldyBFdmVudEVtaXR0ZXI8Z29vZ2xlLm1hcHMuTWFwTW91c2VFdmVudD4oKTtcblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBAQ29udGVudENoaWxkcmVuKE5nTWFwc0luZm9XaW5kb3dDb21wb25lbnQpXG4gIHB1YmxpYyBpbmZvV2luZG93OiBRdWVyeUxpc3Q8TmdNYXBzSW5mb1dpbmRvd0NvbXBvbmVudD4gPVxuICAgIG5ldyBRdWVyeUxpc3Q8TmdNYXBzSW5mb1dpbmRvd0NvbXBvbmVudD4oKTtcblxuICBwcml2YXRlIF9tYXJrZXJBZGRlZFRvTWFuZ2VyOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX2lkOiBzdHJpbmc7XG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9maXRCb3VuZHNEZXRhaWxzJDogUmVwbGF5U3ViamVjdDxGaXRCb3VuZHNEZXRhaWxzPiA9XG4gICAgbmV3IFJlcGxheVN1YmplY3Q8Rml0Qm91bmRzRGV0YWlscz4oMSk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBtYXJrZXJNYW5hZ2VyOiBNYXJrZXJNYW5hZ2VyKSB7XG4gICAgdGhpcy5faWQgPSAobWFya2VySWQrKykudG9TdHJpbmcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAgQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIHRoaXMuaGFuZGxlSW5mb1dpbmRvd1VwZGF0ZSgpO1xuICAgIHRoaXMuaW5mb1dpbmRvdy5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB0aGlzLmhhbmRsZUluZm9XaW5kb3dVcGRhdGUoKSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUluZm9XaW5kb3dVcGRhdGUoKSB7XG4gICAgaWYgKHRoaXMuaW5mb1dpbmRvdy5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIG5vIG1vcmUgdGhhbiBvbmUgaW5mbyB3aW5kb3cuJyk7XG4gICAgfVxuICAgIHRoaXMuaW5mb1dpbmRvdy5mb3JFYWNoKChtYXJrZXIpID0+IHtcbiAgICAgIG1hcmtlci5ob3N0TWFya2VyID0gdGhpcztcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiB7IFtrZXk6IHN0cmluZ106IFNpbXBsZUNoYW5nZSB9KSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLmxhdGl0dWRlID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5sYXRpdHVkZSA9IE51bWJlcih0aGlzLmxhdGl0dWRlKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB0aGlzLmxvbmdpdHVkZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMubG9uZ2l0dWRlID0gTnVtYmVyKHRoaXMubG9uZ2l0dWRlKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIHRoaXMubGF0aXR1ZGUgIT09ICdudW1iZXInIHx8XG4gICAgICB0eXBlb2YgdGhpcy5sb25naXR1ZGUgIT09ICdudW1iZXInXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5fbWFya2VyQWRkZWRUb01hbmdlcikge1xuICAgICAgdGhpcy5tYXJrZXJNYW5hZ2VyLmFkZE1hcmtlcih0aGlzKS50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5fdXBkYXRlRml0Qm91bmRzRGV0YWlscygpO1xuICAgICAgICB0aGlzLl9tYXJrZXJBZGRlZFRvTWFuZ2VyID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fYWRkRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlcy5sYXRpdHVkZSB8fCBjaGFuZ2VzLmxvbmdpdHVkZSkge1xuICAgICAgdGhpcy5tYXJrZXJNYW5hZ2VyLnVwZGF0ZU1hcmtlclBvc2l0aW9uKHRoaXMpO1xuICAgICAgdGhpcy5fdXBkYXRlRml0Qm91bmRzRGV0YWlscygpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlcy50aXRsZSkge1xuICAgICAgdGhpcy5tYXJrZXJNYW5hZ2VyLnVwZGF0ZVRpdGxlKHRoaXMpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlcy5sYWJlbCkge1xuICAgICAgdGhpcy5tYXJrZXJNYW5hZ2VyLnVwZGF0ZUxhYmVsKHRoaXMpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlcy5kcmFnZ2FibGUpIHtcbiAgICAgIHRoaXMubWFya2VyTWFuYWdlci51cGRhdGVEcmFnZ2FibGUodGhpcyk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzLmljb25VcmwpIHtcbiAgICAgIHRoaXMubWFya2VyTWFuYWdlci51cGRhdGVJY29uTGVnYWN5KHRoaXMpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlcy5pY29uKSB7XG4gICAgICB0aGlzLm1hcmtlck1hbmFnZXIudXBkYXRlSWNvbih0aGlzKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXMub3BhY2l0eSkge1xuICAgICAgdGhpcy5tYXJrZXJNYW5hZ2VyLnVwZGF0ZU9wYWNpdHkodGhpcyk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzLnZpc2libGUpIHtcbiAgICAgIHRoaXMubWFya2VyTWFuYWdlci51cGRhdGVWaXNpYmxlKHRoaXMpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlcy56SW5kZXgpIHtcbiAgICAgIHRoaXMubWFya2VyTWFuYWdlci51cGRhdGVaSW5kZXgodGhpcyk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzLmNsaWNrYWJsZSkge1xuICAgICAgdGhpcy5tYXJrZXJNYW5hZ2VyLnVwZGF0ZUNsaWNrYWJsZSh0aGlzKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXMuYW5pbWF0aW9uKSB7XG4gICAgICB0aGlzLm1hcmtlck1hbmFnZXIudXBkYXRlQW5pbWF0aW9uKHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBnZXRGaXRCb3VuZHNEZXRhaWxzJCgpOiBPYnNlcnZhYmxlPEZpdEJvdW5kc0RldGFpbHM+IHtcbiAgICByZXR1cm4gdGhpcy5fZml0Qm91bmRzRGV0YWlscyQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX3VwZGF0ZUZpdEJvdW5kc0RldGFpbHMoKSB7XG4gICAgaWYgKHRoaXMubGF0aXR1ZGUgJiYgdGhpcy5sb25naXR1ZGUpIHtcbiAgICAgIHRoaXMuX2ZpdEJvdW5kc0RldGFpbHMkLm5leHQoe1xuICAgICAgICBsYXRMbmc6IHsgbGF0OiB0aGlzLmxhdGl0dWRlLCBsbmc6IHRoaXMubG9uZ2l0dWRlIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgX2FkZEV2ZW50TGlzdGVuZXJzKCkge1xuICAgIGNvbnN0IGNzID0gdGhpcy5tYXJrZXJNYW5hZ2VyXG4gICAgICAuY3JlYXRlRXZlbnRPYnNlcnZhYmxlKFsnY2xpY2snLCAncG9pbnRlcmRvd24nXSwgdGhpcylcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoZXZlbnQpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5vcGVuSW5mb1dpbmRvdykge1xuICAgICAgICAgICAgdGhpcy5pbmZvV2luZG93LmZvckVhY2goKGluZm9XaW5kb3cpID0+IGluZm9XaW5kb3cub3BlbihldmVudCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLm1hcmtlckNsaWNrLmVtaXQodGhpcyk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQoY3MpO1xuXG4gICAgY29uc3QgcmMgPSB0aGlzLm1hcmtlck1hbmFnZXJcbiAgICAgIC5jcmVhdGVFdmVudE9ic2VydmFibGUoJ3JpZ2h0Y2xpY2snLCB0aGlzKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMubWFya2VyUmlnaHRDbGljay5lbWl0KCk7XG4gICAgICB9KTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQocmMpO1xuXG4gICAgY29uc3QgZHMgPSB0aGlzLm1hcmtlck1hbmFnZXJcbiAgICAgIC5jcmVhdGVFdmVudE9ic2VydmFibGU8Z29vZ2xlLm1hcHMuTWFwTW91c2VFdmVudD4oJ2RyYWdzdGFydCcsIHRoaXMpXG4gICAgICAuc3Vic2NyaWJlKChlOiBnb29nbGUubWFwcy5NYXBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuZHJhZ1N0YXJ0LmVtaXQoZSk7XG4gICAgICB9KTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQoZHMpO1xuXG4gICAgY29uc3QgZCA9IHRoaXMubWFya2VyTWFuYWdlclxuICAgICAgLmNyZWF0ZUV2ZW50T2JzZXJ2YWJsZTxnb29nbGUubWFwcy5NYXBNb3VzZUV2ZW50PignZHJhZycsIHRoaXMpXG4gICAgICAuc3Vic2NyaWJlKChlOiBnb29nbGUubWFwcy5NYXBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuZHJhZy5lbWl0KGUpO1xuICAgICAgfSk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKGQpO1xuXG4gICAgY29uc3QgZHJhZ2VuZCA9IHRoaXMubWFya2VyTWFuYWdlclxuICAgICAgLmNyZWF0ZUV2ZW50T2JzZXJ2YWJsZTxnb29nbGUubWFwcy5NYXBNb3VzZUV2ZW50PignZHJhZ2VuZCcsIHRoaXMpXG4gICAgICAuc3Vic2NyaWJlKChlOiBnb29nbGUubWFwcy5NYXBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuZHJhZ0VuZC5lbWl0KGUpO1xuICAgICAgfSk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKGRyYWdlbmQpO1xuXG4gICAgY29uc3QgbW91c2VvdmVyID0gdGhpcy5tYXJrZXJNYW5hZ2VyXG4gICAgICAuY3JlYXRlRXZlbnRPYnNlcnZhYmxlPGdvb2dsZS5tYXBzLk1hcE1vdXNlRXZlbnQ+KFxuICAgICAgICBbJ21vdXNlb3ZlcicsICdwb2ludGVyZW50ZXInXSxcbiAgICAgICAgdGhpcyxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKGU6IGdvb2dsZS5tYXBzLk1hcE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5tb3VzZU92ZXIuZW1pdChlKTtcbiAgICAgIH0pO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZChtb3VzZW92ZXIpO1xuXG4gICAgY29uc3QgbW91c2VvdXQgPSB0aGlzLm1hcmtlck1hbmFnZXJcbiAgICAgIC5jcmVhdGVFdmVudE9ic2VydmFibGU8Z29vZ2xlLm1hcHMuTWFwTW91c2VFdmVudD4oXG4gICAgICAgIFsnbW91c2VvdXQnLCAncG9pbnRlcmxlYXZlJ10sXG4gICAgICAgIHRoaXMsXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChlOiBnb29nbGUubWFwcy5NYXBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMubW91c2VPdXQuZW1pdChlKTtcbiAgICAgIH0pO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZChtb3VzZW91dCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHB1YmxpYyBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9pZDtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBOZ01hcHNNYXJrZXItJHt0aGlzLl9pZH1gO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5tYXJrZXJNYW5hZ2VyLmRlbGV0ZU1hcmtlcih0aGlzKTtcbiAgICAvLyB1bnN1YnNjcmliZSBhbGwgcmVnaXN0ZXJlZCBvYnNlcnZhYmxlIHN1YnNjcmlwdGlvblxuICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cbn1cbiJdfQ==