UNPKG

@miracledevs/paradigm-web-angular

Version:

An angular wrapper with base functionality and helper services.

361 lines 28 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; /*! * Paradigm Framework - Angular Wrapper * Copyright (c) 2017 Miracle Devs, Inc * Licensed under MIT (https://github.com/MiracleDevs/Paradigm.Web.Shared/blob/master/LICENSE) */ import { ServiceBase } from './base.service'; import { ObjectExtensions } from '@miracledevs/paradigm-ui-web-shared'; import { Injectable } from '@angular/core'; import * as i0 from "@angular/core"; /** * Represents the response of the geolocation service. * @record */ export function Coordinate() { } if (false) { /** * the latitude as a decimal number (always returned). * @type {?} */ Coordinate.prototype.latitude; /** * the longitude as a decimal number (always returned). * @type {?} */ Coordinate.prototype.longitude; /** * the accuracy of position (always returned). * @type {?|undefined} */ Coordinate.prototype.accuracy; /** * the altitude in meters above the mean sea level (returned if available). * @type {?|undefined} */ Coordinate.prototype.altitude; /** * the altitude accuracy of position (returned if available). * @type {?|undefined} */ Coordinate.prototype.altitudeAccuracy; /** * the heading as degrees clockwise from North (returned if available). * @type {?|undefined} */ Coordinate.prototype.heading; /** * the speed in meters per second (returned if available). * @type {?|undefined} */ Coordinate.prototype.speed; } /** * Represents the \@see navigator.geolocation options. * @record */ export function IPositionOptions() { } if (false) { /** * Indicates if the geolocation should have high accuracy to find the current position. * @type {?|undefined} */ IPositionOptions.prototype.enableHighAccuracy; /** * A timeout value for the geolocation query. * @type {?|undefined} */ IPositionOptions.prototype.timeout; /** * The maximum age for the request. * @type {?|undefined} */ IPositionOptions.prototype.maximumAge; } /** * Represents a geolocation watcher. * It listens for geolocation events. */ export class GeolocationWatcher { /** * Creates a new instance of \@see GeolocationWatcher * @param {?} geolocation a reference to the geolocation service. */ constructor(geolocation) { this.geolocation = geolocation; this.watchIndex = -1; } /** * Register the watcher and stores the watch operation index. * @param {?} index the index representing this watch operation. * @return {?} */ register(index) { if (!this.isDisposed()) { throw new Error('This watcher can not be registered again.'); } this.watchIndex = index; } /** * Unregisters the watcher. * Once unregistered, the watcher does not receives any more events. * @return {?} */ unregister() { if (this.isDisposed()) { throw new Error('This watcher has not been properly registered.'); } this.beingUnregistered = true; this.geolocation.unregisterWatcher(this); this.beingUnregistered = false; this.watchIndex = -1; } /** * Gets the watch index. * @return {?} */ getWatchIndex() { return this.watchIndex; } /** * Indicates if this watcher is disposed. * @return {?} */ isDisposed() { return this.watchIndex < 0; } /** * Indicates if the watcher is being unregistered. * @return {?} */ isBeingUnregistered() { return this.beingUnregistered; } } if (false) { /** * The geolocation watch operation index. * @type {?} * @private */ GeolocationWatcher.prototype.watchIndex; /** * Indicates if the watcher is being unregistered. * @type {?} * @private */ GeolocationWatcher.prototype.beingUnregistered; /** * Event called when the geolocation service reports new geolocation information. * \@param coordinates the new geolocation coordinates. * @type {?} */ GeolocationWatcher.prototype.onInformationReceived; /** * Event called when the geolocation service found an error. * \@param error the error found. * @type {?} */ GeolocationWatcher.prototype.onError; /** * @type {?} * @private */ GeolocationWatcher.prototype.geolocation; } /** * Provides a common interface for different geolocation providers. * @record */ export function IGeolocationProvider() { } if (false) { /** * Indicates if the geolocation provider is available. * @return {?} */ IGeolocationProvider.prototype.isAvailable = function () { }; /** * Gets the current geolocation. * @return {?} */ IGeolocationProvider.prototype.getGeolocation = function () { }; /** * Registers a new geolocation watcher. * @return {?} */ IGeolocationProvider.prototype.registerWatcher = function () { }; /** * Unregisters a geolocation watcher. * @param {?} watcher the watcher that will be unregistered. * @return {?} */ IGeolocationProvider.prototype.unregisterWatcher = function (watcher) { }; } /** * Implements the geolocation provider api using the \@see navigator.geolocation */ export class NavigationGeolocationProvider { /** * Creates a new instance of \@see NavigationGeolocationProvider * @param {?=} options geolocation options. */ constructor(options) { this.options = options; } /** * Gets the current geolocation if a service geolocation service is available. * @return {?} */ getGeolocation() { if (this.isAvailable()) { return new Promise((/** * @param {?} resolve * @param {?} reject * @return {?} */ (resolve, reject) => this.getGeoLocator().getCurrentPosition((/** * @param {?} info * @return {?} */ info => resolve(info.coords)), (/** * @param {?} error * @return {?} */ error => reject(error.message)), this.options))); } return Promise.reject('The geolocation service is not available.'); } /** * Registers a geolocation watcher to lister for geolocation events. * @return {?} */ registerWatcher() { if (this.isAvailable()) { /** @type {?} */ const watcher = new GeolocationWatcher(this); watcher.register(this.getGeoLocator().watchPosition((/** * @param {?} info * @return {?} */ info => { if (watcher.onInformationReceived) { watcher.onInformationReceived(info.coords); } }), (/** * @param {?} error * @return {?} */ error => { if (watcher.onError) { watcher.onError(error.message); } }), this.options)); return watcher; } throw new Error('The geolocation service is not available.'); } /** * Unregisters the geolocation watcher. * @param {?} watcher the watcher that will be unregistered. * @return {?} */ unregisterWatcher(watcher) { if (!watcher.isBeingUnregistered()) { throw new Error('Can not call this method directly. Call GeolocationWatcher.unregister instead.'); } if (this.isAvailable()) { this.getGeoLocator().clearWatch(watcher.getWatchIndex()); } } /** * Indicates if the geolocation service is available. * @return {?} */ isAvailable() { return !ObjectExtensions.isNull(navigator.geolocation) && !ObjectExtensions.isNull(navigator.geolocation.getCurrentPosition) && !ObjectExtensions.isNull(navigator.geolocation.watchPosition) && !ObjectExtensions.isNull(navigator.geolocation.clearWatch); } /** * Gets the geolocation service. * @private * @return {?} */ getGeoLocator() { return navigator.geolocation; } } if (false) { /** * @type {?} * @private */ NavigationGeolocationProvider.prototype.options; } export class GeolocationService extends ServiceBase { /** * Creates a new instance of \@see GeolocationService * By default \@see GeolocationService uses \@see NavigationGeolocationProvider as provider. * The provider can be changed using \@see GeolocationService.setGeolocationProvider */ constructor() { super(); this.geolocationProvider = new NavigationGeolocationProvider(); } /** * Sets the geolocation provider. * @param {?} provider geolocation provider. * @return {?} */ setGeolocationProvider(provider) { if (!provider) { throw new Error('The geolocation provider can not be null or undefined.'); } this.geolocationProvider = provider; } /** * Gets the current geolocation if a service geolocation service is available. * @return {?} */ getGeolocation() { return tslib_1.__awaiter(this, void 0, void 0, function* () { return yield this.geolocationProvider.getGeolocation(); }); } /** * Registers a geolocation watcher to lister for geolocation events. * @return {?} */ registerWatcher() { return this.geolocationProvider.registerWatcher(); } /** * Indicates if the geolocation service is available. * @return {?} */ isAvailable() { return this.geolocationProvider.isAvailable(); } } GeolocationService.decorators = [ { type: Injectable, args: [{ providedIn: 'root' },] } ]; /** @nocollapse */ GeolocationService.ctorParameters = () => []; /** @nocollapse */ GeolocationService.ngInjectableDef = i0.defineInjectable({ factory: function GeolocationService_Factory() { return new GeolocationService(); }, token: GeolocationService, providedIn: "root" }); if (false) { /** * Reference to a geolocation provider. * @type {?} * @private */ GeolocationService.prototype.geolocationProvider; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvbG9jYXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BtaXJhY2xlZGV2cy9wYXJhZGlnbS13ZWItYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9zZXJ2aWNlcy9nZW9sb2NhdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFNQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDdkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7O0FBSzNDLGdDQW9DQzs7Ozs7O0lBL0JHLDhCQUFpQjs7Ozs7SUFLakIsK0JBQWtCOzs7OztJQUtsQiw4QkFBa0I7Ozs7O0lBS2xCLDhCQUFrQjs7Ozs7SUFLbEIsc0NBQTBCOzs7OztJQUsxQiw2QkFBaUI7Ozs7O0lBS2pCLDJCQUFlOzs7Ozs7QUFNbkIsc0NBZ0JDOzs7Ozs7SUFYRyw4Q0FBNkI7Ozs7O0lBSzdCLG1DQUFpQjs7Ozs7SUFLakIsc0NBQW9COzs7Ozs7QUFReEIsTUFBTSxPQUFPLGtCQUFrQjs7Ozs7SUE0QjNCLFlBQW9CLFdBQWlDO1FBQWpDLGdCQUFXLEdBQVgsV0FBVyxDQUFzQjtRQUVqRCxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7Ozs7OztJQU1ELFFBQVEsQ0FBQyxLQUFhO1FBRWxCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQ3RCO1lBQ0ksTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1NBQ2hFO1FBRUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDNUIsQ0FBQzs7Ozs7O0lBTUQsVUFBVTtRQUVOLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUNyQjtZQUNJLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0RBQWdELENBQUMsQ0FB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bnRlbnQiOlsiLyohXG4gKiBQYXJhZGlnbSBGcmFtZXdvcmsgLSBBbmd1bGFyIFdyYXBwZXJcbiAqIENvcHlyaWdodCAoYykgMjAxNyBNaXJhY2xlIERldnMsIEluY1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vTWlyYWNsZURldnMvUGFyYWRpZ20uV2ViLlNoYXJlZC9ibG9iL21hc3Rlci9MSUNFTlNFKVxuICovXG5cbmltcG9ydCB7IFNlcnZpY2VCYXNlIH0gZnJvbSAnLi9iYXNlLnNlcnZpY2UnO1xuaW1wb3J0IHsgT2JqZWN0RXh0ZW5zaW9ucyB9IGZyb20gJ0BtaXJhY2xlZGV2cy9wYXJhZGlnbS11aS13ZWItc2hhcmVkJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSByZXNwb25zZSBvZiB0aGUgZ2VvbG9jYXRpb24gc2VydmljZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb29yZGluYXRlXG57XG4gICAgLyoqXG4gICAgICogdGhlIGxhdGl0dWRlIGFzIGEgZGVjaW1hbCBudW1iZXIgKGFsd2F5cyByZXR1cm5lZCkuXG4gICAgICovXG4gICAgbGF0aXR1ZGU6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIHRoZSBsb25naXR1ZGUgYXMgYSBkZWNpbWFsIG51bWJlciAoYWx3YXlzIHJldHVybmVkKS5cbiAgICAgKi9cbiAgICBsb25naXR1ZGU6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIHRoZSBhY2N1cmFjeSBvZiBwb3NpdGlvbiAoYWx3YXlzIHJldHVybmVkKS5cbiAgICAgKi9cbiAgICBhY2N1cmFjeT86IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIHRoZSBhbHRpdHVkZSBpbiBtZXRlcnMgYWJvdmUgdGhlIG1lYW4gc2VhIGxldmVsIChyZXR1cm5lZCBpZiBhdmFpbGFibGUpLlxuICAgICAqL1xuICAgIGFsdGl0dWRlPzogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogdGhlIGFsdGl0dWRlIGFjY3VyYWN5IG9mIHBvc2l0aW9uIChyZXR1cm5lZCBpZiBhdmFpbGFibGUpLlxuICAgICAqL1xuICAgIGFsdGl0dWRlQWNjdXJhY3k/OiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiB0aGUgaGVhZGluZyBhcyBkZWdyZWVzIGNsb2Nrd2lzZSBmcm9tIE5vcnRoIChyZXR1cm5lZCBpZiBhdmFpbGFibGUpLlxuICAgICAqL1xuICAgIGhlYWRpbmc/OiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiB0aGUgc3BlZWQgaW4gbWV0ZXJzIHBlciBzZWNvbmQgKHJldHVybmVkIGlmIGF2YWlsYWJsZSkuXG4gICAgICovXG4gICAgc3BlZWQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgQHNlZSBuYXZpZ2F0b3IuZ2VvbG9jYXRpb24gb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJUG9zaXRpb25PcHRpb25zXG57XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIHRoZSBnZW9sb2NhdGlvbiBzaG91bGQgaGF2ZSBoaWdoIGFjY3VyYWN5IHRvIGZpbmQgdGhlIGN1cnJlbnQgcG9zaXRpb24uXG4gICAgICovXG4gICAgZW5hYmxlSGlnaEFjY3VyYWN5PzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIEEgdGltZW91dCB2YWx1ZSBmb3IgdGhlIGdlb2xvY2F0aW9uIHF1ZXJ5LlxuICAgICAqL1xuICAgIHRpbWVvdXQ/OiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBhZ2UgZm9yIHRoZSByZXF1ZXN0LlxuICAgICAqL1xuICAgIG1heGltdW1BZ2U/OiBudW1iZXI7XG59XG5cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgZ2VvbG9jYXRpb24gd2F0Y2hlci5cbiAqIEl0IGxpc3RlbnMgZm9yIGdlb2xvY2F0aW9uIGV2ZW50cy5cbiAqL1xuZXhwb3J0IGNsYXNzIEdlb2xvY2F0aW9uV2F0Y2hlclxue1xuICAgIC8qKlxuICAgICAqIFRoZSBnZW9sb2NhdGlvbiB3YXRjaCBvcGVyYXRpb24gaW5kZXguXG4gICAgICovXG4gICAgcHJpdmF0ZSB3YXRjaEluZGV4OiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIHdhdGNoZXIgaXMgYmVpbmcgdW5yZWdpc3RlcmVkLlxuICAgICAqL1xuICAgIHByaXZhdGUgYmVpbmdVbnJlZ2lzdGVyZWQ6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCBjYWxsZWQgd2hlbiB0aGUgZ2VvbG9jYXRpb24gc2VydmljZSByZXBvcnRzIG5ldyBnZW9sb2NhdGlvbiBpbmZvcm1hdGlvbi5cbiAgICAgKiBAcGFyYW0gY29vcmRpbmF0ZXMgdGhlIG5ldyBnZW9sb2NhdGlvbiBjb29yZGluYXRlcy5cbiAgICAgKi9cbiAgICBvbkluZm9ybWF0aW9uUmVjZWl2ZWQ6IChjb29yZGluYXRlczogQ29vcmRpbmF0ZSkgPT4gdm9pZDtcblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGNhbGxlZCB3aGVuIHRoZSBnZW9sb2NhdGlvbiBzZXJ2aWNlIGZvdW5kIGFuIGVycm9yLlxuICAgICAqIEBwYXJhbSBlcnJvciB0aGUgZXJyb3IgZm91bmQuXG4gICAgICovXG4gICAgb25FcnJvcjogKGVycm9yOiBzdHJpbmcpID0+IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIEBzZWUgR2VvbG9jYXRpb25XYXRjaGVyXG4gICAgICogQHBhcmFtIGdlb2xvY2F0aW9uIGEgcmVmZXJlbmNlIHRvIHRoZSBnZW9sb2NhdGlvbiBzZXJ2aWNlLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZ2VvbG9jYXRpb246IElHZW9sb2NhdGlvblByb3ZpZGVyKVxuICAgIHtcbiAgICAgICAgdGhpcy53YXRjaEluZGV4ID0gLTE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXIgdGhlIHdhdGNoZXIgYW5kIHN0b3JlcyB0aGUgd2F0Y2ggb3BlcmF0aW9uIGluZGV4LlxuICAgICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggcmVwcmVzZW50aW5nIHRoaXMgd2F0Y2ggb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIHJlZ2lzdGVyKGluZGV4OiBudW1iZXIpOiB2b2lkXG4gICAge1xuICAgICAgICBpZiAoIXRoaXMuaXNEaXNwb3NlZCgpKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgd2F0Y2hlciBjYW4gbm90IGJlIHJlZ2lzdGVyZWQgYWdhaW4uJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLndhdGNoSW5kZXggPSBpbmRleDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVbnJlZ2lzdGVycyB0aGUgd2F0Y2hlci5cbiAgICAgKiBPbmNlIHVucmVnaXN0ZXJlZCwgdGhlIHdhdGNoZXIgZG9lcyBub3QgcmVjZWl2ZXMgYW55IG1vcmUgZXZlbnRzLlxuICAgICAqL1xuICAgIHVucmVnaXN0ZXIoKTogdm9pZFxuICAgIHtcbiAgICAgICAgaWYgKHRoaXMuaXNEaXNwb3NlZCgpKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgd2F0Y2hlciBoYXMgbm90IGJlZW4gcHJvcGVybHkgcmVnaXN0ZXJlZC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYmVpbmdVbnJlZ2lzdGVyZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmdlb2xvY2F0aW9uLnVucmVnaXN0ZXJXYXRjaGVyKHRoaXMpO1xuICAgICAgICB0aGlzLmJlaW5nVW5yZWdpc3RlcmVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMud2F0Y2hJbmRleCA9IC0xO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHdhdGNoIGluZGV4LlxuICAgICAqL1xuICAgIGdldFdhdGNoSW5kZXgoKTogbnVtYmVyXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy53YXRjaEluZGV4O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiB0aGlzIHdhdGNoZXIgaXMgZGlzcG9zZWQuXG4gICAgICovXG4gICAgaXNEaXNwb3NlZCgpOiBib29sZWFuXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy53YXRjaEluZGV4IDwgMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIHdhdGNoZXIgaXMgYmVpbmcgdW5yZWdpc3RlcmVkLlxuICAgICAqL1xuICAgIGlzQmVpbmdVbnJlZ2lzdGVyZWQoKTogYm9vbGVhblxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmVpbmdVbnJlZ2lzdGVyZWQ7XG4gICAgfVxufVxuXG4vKipcbiAqIFByb3ZpZGVzIGEgY29tbW9uIGludGVyZmFjZSBmb3IgZGlmZmVyZW50IGdlb2xvY2F0aW9uIHByb3ZpZGVycy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJR2VvbG9jYXRpb25Qcm92aWRlclxue1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiB0aGUgZ2VvbG9jYXRpb24gcHJvdmlkZXIgaXMgYXZhaWxhYmxlLlxuICAgICAqL1xuICAgIGlzQXZhaWxhYmxlKCk6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjdXJyZW50IGdlb2xvY2F0aW9uLlxuICAgICAqL1xuICAgIGdldEdlb2xvY2F0aW9uKCk6IFByb21pc2U8Q29vcmRpbmF0ZT47XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlcnMgYSBuZXcgZ2VvbG9jYXRpb24gd2F0Y2hlci5cbiAgICAgKi9cbiAgICByZWdpc3RlcldhdGNoZXIoKTogR2VvbG9jYXRpb25XYXRjaGVyO1xuXG4gICAgLyoqXG4gICAgICogVW5yZWdpc3RlcnMgYSBnZW9sb2NhdGlvbiB3YXRjaGVyLlxuICAgICAqIEBwYXJhbSB3YXRjaGVyIHRoZSB3YXRjaGVyIHRoYXQgd2lsbCBiZSB1bnJlZ2lzdGVyZWQuXG4gICAgICovXG4gICAgdW5yZWdpc3RlcldhdGNoZXIod2F0Y2hlcjogR2VvbG9jYXRpb25XYXRjaGVyKTogdm9pZDtcbn1cblxuLyoqXG4gKiBJbXBsZW1lbnRzIHRoZSBnZW9sb2NhdGlvbiBwcm92aWRlciBhcGkgdXNpbmcgdGhlIEBzZWUgbmF2aWdhdG9yLmdlb2xvY2F0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBOYXZpZ2F0aW9uR2VvbG9jYXRpb25Qcm92aWRlciBpbXBsZW1lbnRzIElHZW9sb2NhdGlvblByb3ZpZGVyXG57XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBAc2VlIE5hdmlnYXRpb25HZW9sb2NhdGlvblByb3ZpZGVyXG4gICAgICogQHBhcmFtIG9wdGlvbnMgZ2VvbG9jYXRpb24gb3B0aW9ucy5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIG9wdGlvbnM/OiBJUG9zaXRpb25PcHRpb25zKVxuICAgIHtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjdXJyZW50IGdlb2xvY2F0aW9uIGlmIGEgc2VydmljZSBnZW9sb2NhdGlvbiBzZXJ2aWNlIGlzIGF2YWlsYWJsZS5cbiAgICAgKi9cbiAgICBnZXRHZW9sb2NhdGlvbigpOiBQcm9taXNlPENvb3JkaW5hdGU+XG4gICAge1xuICAgICAgICBpZiAodGhpcy5pc0F2YWlsYWJsZSgpKVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gdGhpcy5nZXRHZW9Mb2NhdG9yKCkuZ2V0Q3VycmVudFBvc2l0aW9uKFxuICAgICAgICAgICAgICAgIGluZm8gPT4gcmVzb2x2ZShpbmZvLmNvb3JkcyksXG4gICAgICAgICAgICAgICAgZXJyb3IgPT4gcmVqZWN0KGVycm9yLm1lc3NhZ2UpLFxuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucykpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCdUaGUgZ2VvbG9jYXRpb24gc2VydmljZSBpcyBub3QgYXZhaWxhYmxlLicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVycyBhIGdlb2xvY2F0aW9uIHdhdGNoZXIgdG8gbGlzdGVyIGZvciBnZW9sb2NhdGlvbiBldmVudHMuXG4gICAgICovXG4gICAgcmVnaXN0ZXJXYXRjaGVyKCk6IEdlb2xvY2F0aW9uV2F0Y2hlclxuICAgIHtcbiAgICAgICAgaWYgKHRoaXMuaXNBdmFpbGFibGUoKSlcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3Qgd2F0Y2hlciA9IG5ldyBHZW9sb2NhdGlvbldhdGNoZXIodGhpcyk7XG5cbiAgICAgICAgICAgIHdhdGNoZXIucmVnaXN0ZXIodGhpcy5nZXRHZW9Mb2NhdG9yKCkud2F0Y2hQb3NpdGlvbihcbiAgICAgICAgICAgICAgICBpbmZvID0+XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZiAod2F0Y2hlci5vbkluZm9ybWF0aW9uUmVjZWl2ZWQpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdhdGNoZXIub25JbmZvcm1hdGlvblJlY2VpdmVkKGluZm8uY29vcmRzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIGVycm9yID0+XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZiAod2F0Y2hlci5vbkVycm9yKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3YXRjaGVyLm9uRXJyb3IoZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCB0aGlzLm9wdGlvbnMpKTtcblxuICAgICAgICAgICAgcmV0dXJuIHdhdGNoZXI7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBnZW9sb2NhdGlvbiBzZXJ2aWNlIGlzIG5vdCBhdmFpbGFibGUuJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVW5yZWdpc3RlcnMgdGhlIGdlb2xvY2F0aW9uIHdhdGNoZXIuXG4gICAgICogQHBhcmFtIHdhdGNoZXIgdGhlIHdhdGNoZXIgdGhhdCB3aWxsIGJlIHVucmVnaXN0ZXJlZC5cbiAgICAgKi9cbiAgICB1bnJlZ2lzdGVyV2F0Y2hlcih3YXRjaGVyOiBHZW9sb2NhdGlvbldhdGNoZXIpOiB2b2lkXG4gICAge1xuICAgICAgICBpZiAoIXdhdGNoZXIuaXNCZWluZ1VucmVnaXN0ZXJlZCgpKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbiBub3QgY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4gQ2FsbCBHZW9sb2NhdGlvbldhdGNoZXIudW5yZWdpc3RlciBpbnN0ZWFkLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaXNBdmFpbGFibGUoKSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5nZXRHZW9Mb2NhdG9yKCkuY2xlYXJXYXRjaCh3YXRjaGVyLmdldFdhdGNoSW5kZXgoKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGdlb2xvY2F0aW9uIHNlcnZpY2UgaXMgYXZhaWxhYmxlLlxuICAgICAqL1xuICAgIGlzQXZhaWxhYmxlKCk6IGJvb2xlYW5cbiAgICB7XG4gICAgICAgIHJldHVybiAhT2JqZWN0RXh0ZW5zaW9ucy5pc051bGwobmF2aWdhdG9yLmdlb2xvY2F0aW9uKSAmJlxuICAgICAgICAgICAgIU9iamVjdEV4dGVuc2lvbnMuaXNOdWxsKG5hdmlnYXRvci5nZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24pICYmXG4gICAgICAgICAgICAhT2JqZWN0RXh0ZW5zaW9ucy5pc051bGwobmF2aWdhdG9yLmdlb2xvY2F0aW9uLndhdGNoUG9zaXRpb24pICYmXG4gICAgICAgICAgICAhT2JqZWN0RXh0ZW5zaW9ucy5pc051bGwobmF2aWdhdG9yLmdlb2xvY2F0aW9uLmNsZWFyV2F0Y2gpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGdlb2xvY2F0aW9uIHNlcnZpY2UuXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRHZW9Mb2NhdG9yKCk6IEdlb2xvY2F0aW9uXG4gICAge1xuICAgICAgICByZXR1cm4gbmF2aWdhdG9yLmdlb2xvY2F0aW9uO1xuICAgIH1cbn1cblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBHZW9sb2NhdGlvblNlcnZpY2UgZXh0ZW5kcyBTZXJ2aWNlQmFzZVxue1xuICAgIC8qKlxuICAgICAqIFJlZmVyZW5jZSB0byBhIGdlb2xvY2F0aW9uIHByb3ZpZGVyLlxuICAgICAqL1xuICAgIHByaXZhdGUgZ2VvbG9jYXRpb25Qcm92aWRlcjogSUdlb2xvY2F0aW9uUHJvdmlkZXI7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIEBzZWUgR2VvbG9jYXRpb25TZXJ2aWNlXG4gICAgICogQnkgZGVmYXVsdCBAc2VlIEdlb2xvY2F0aW9uU2VydmljZSB1c2VzIEBzZWUgTmF2aWdhdGlvbkdlb2xvY2F0aW9uUHJvdmlkZXIgYXMgcHJvdmlkZXIuXG4gICAgICogVGhlIHByb3ZpZGVyIGNhbiBiZSBjaGFuZ2VkIHVzaW5nIEBzZWUgR2VvbG9jYXRpb25TZXJ2aWNlLnNldEdlb2xvY2F0aW9uUHJvdmlkZXJcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpXG4gICAge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmdlb2xvY2F0aW9uUHJvdmlkZXIgPSBuZXcgTmF2aWdhdGlvbkdlb2xvY2F0aW9uUHJvdmlkZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBnZW9sb2NhdGlvbiBwcm92aWRlci5cbiAgICAgKiBAcGFyYW0gcHJvdmlkZXIgZ2VvbG9jYXRpb24gcHJvdmlkZXIuXG4gICAgICovXG4gICAgc2V0R2VvbG9jYXRpb25Qcm92aWRlcihwcm92aWRlcjogSUdlb2xvY2F0aW9uUHJvdmlkZXIpOiB2b2lkXG4gICAge1xuICAgICAgICBpZiAoIXByb3ZpZGVyKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBnZW9sb2NhdGlvbiBwcm92aWRlciBjYW4gbm90IGJlIG51bGwgb3IgdW5kZWZpbmVkLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5nZW9sb2NhdGlvblByb3ZpZGVyID0gcHJvdmlkZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY3VycmVudCBnZW9sb2NhdGlvbiBpZiBhIHNlcnZpY2UgZ2VvbG9jYXRpb24gc2VydmljZSBpcyBhdmFpbGFibGUuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgdGhlIGdlb2xvY2F0aW9uIG9wdGlvbnMuXG4gICAgICovXG4gICAgYXN5bmMgZ2V0R2VvbG9jYXRpb24oKTogUHJvbWlzZTxDb29yZGluYXRlPlxuICAgIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2VvbG9jYXRpb25Qcm92aWRlci5nZXRHZW9sb2NhdGlvbigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVycyBhIGdlb2xvY2F0aW9uIHdhdGNoZXIgdG8gbGlzdGVyIGZvciBnZW9sb2NhdGlvbiBldmVudHMuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgdGhlIGdlb2xvY2F0aW9uIG9wdGlvbnMuXG4gICAgICovXG4gICAgcmVnaXN0ZXJXYXRjaGVyKCk6IEdlb2xvY2F0aW9uV2F0Y2hlclxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2VvbG9jYXRpb25Qcm92aWRlci5yZWdpc3RlcldhdGNoZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGdlb2xvY2F0aW9uIHNlcnZpY2UgaXMgYXZhaWxhYmxlLlxuICAgICAqL1xuICAgIGlzQXZhaWxhYmxlKCk6IGJvb2xlYW5cbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLmdlb2xvY2F0aW9uUHJvdmlkZXIuaXNBdmFpbGFibGUoKTtcbiAgICB9XG59XG4iXX0=