UNPKG

matrix-react-sdk

Version:
124 lines (121 loc) 16.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.watchPosition = exports.mapGeolocationPositionToTimedGeo = exports.mapGeolocationError = exports.getGeoUri = exports.getCurrentPosition = exports.genericPositionFromGeolocation = exports.GeolocationError = void 0; var _logger = require("matrix-js-sdk/src/logger"); /* Copyright 2024 New Vector Ltd. Copyright 2022 The Matrix.org Foundation C.I.C SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ // map GeolocationPositionError codes // https://developer.mozilla.org/en-US/docs/Web/API/GeolocationPositionError let GeolocationError = exports.GeolocationError = /*#__PURE__*/function (GeolocationError) { GeolocationError["Unavailable"] = "Unavailable"; GeolocationError["PermissionDenied"] = "PermissionDenied"; GeolocationError["PositionUnavailable"] = "PositionUnavailable"; GeolocationError["Timeout"] = "Timeout"; GeolocationError["Default"] = "Default"; return GeolocationError; }({}); const GeolocationOptions = { timeout: 10000, maximumAge: 60000 }; const isGeolocationPositionError = error => typeof error === "object" && !!error["PERMISSION_DENIED"]; /** * Maps GeolocationPositionError to our GeolocationError enum */ const mapGeolocationError = error => { _logger.logger.error("Geolocation failed", error); if (isGeolocationPositionError(error)) { switch (error?.code) { case error.PERMISSION_DENIED: return GeolocationError.PermissionDenied; case error.POSITION_UNAVAILABLE: return GeolocationError.PositionUnavailable; case error.TIMEOUT: return GeolocationError.Timeout; default: return GeolocationError.Default; } } else if (error instanceof Error && error.message === GeolocationError.Unavailable) { return GeolocationError.Unavailable; } else { return GeolocationError.Default; } }; exports.mapGeolocationError = mapGeolocationError; const getGeolocation = () => { if (!navigator.geolocation) { throw new Error(GeolocationError.Unavailable); } return navigator.geolocation; }; const genericPositionFromGeolocation = geoPosition => { const { latitude, longitude, altitude, accuracy } = geoPosition.coords; return { // safari reports geolocation timestamps as Apple Cocoa Core Data timestamp // or ms since 1/1/2001 instead of the regular epoch // they also use local time, not utc // to simplify, just use Date.now() timestamp: Date.now(), latitude, longitude, altitude: altitude ?? undefined, accuracy }; }; exports.genericPositionFromGeolocation = genericPositionFromGeolocation; const getGeoUri = position => { const lat = position.latitude; const lon = position.longitude; const alt = Number.isFinite(position.altitude) ? `,${position.altitude}` : ""; const acc = Number.isFinite(position.accuracy) ? `;u=${position.accuracy}` : ""; return `geo:${lat},${lon}${alt}${acc}`; }; exports.getGeoUri = getGeoUri; const mapGeolocationPositionToTimedGeo = position => { const genericPosition = genericPositionFromGeolocation(position); return { timestamp: genericPosition.timestamp, geoUri: getGeoUri(genericPosition) }; }; /** * Gets current position, returns a promise * @returns Promise<GeolocationPosition> */ exports.mapGeolocationPositionToTimedGeo = mapGeolocationPositionToTimedGeo; const getCurrentPosition = async () => { try { const position = await new Promise((resolve, reject) => { getGeolocation().getCurrentPosition(resolve, reject, GeolocationOptions); }); return position; } catch (error) { throw new Error(mapGeolocationError(error)); } }; exports.getCurrentPosition = getCurrentPosition; const watchPosition = (onWatchPosition, onWatchPositionError) => { try { const onError = error => onWatchPositionError(mapGeolocationError(error)); const watchId = getGeolocation().watchPosition(onWatchPosition, onError, GeolocationOptions); const clearWatch = () => { getGeolocation().clearWatch(watchId); }; return clearWatch; } catch (error) { throw new Error(mapGeolocationError(error)); } }; exports.watchPosition = watchPosition; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9nZ2VyIiwicmVxdWlyZSIsIkdlb2xvY2F0aW9uRXJyb3IiLCJleHBvcnRzIiwiR2VvbG9jYXRpb25PcHRpb25zIiwidGltZW91dCIsIm1heGltdW1BZ2UiLCJpc0dlb2xvY2F0aW9uUG9zaXRpb25FcnJvciIsImVycm9yIiwibWFwR2VvbG9jYXRpb25FcnJvciIsImxvZ2dlciIsImNvZGUiLCJQRVJNSVNTSU9OX0RFTklFRCIsIlBlcm1pc3Npb25EZW5pZWQiLCJQT1NJVElPTl9VTkFWQUlMQUJMRSIsIlBvc2l0aW9uVW5hdmFpbGFibGUiLCJUSU1FT1VUIiwiVGltZW91dCIsIkRlZmF1bHQiLCJFcnJvciIsIm1lc3NhZ2UiLCJVbmF2YWlsYWJsZSIsImdldEdlb2xvY2F0aW9uIiwibmF2aWdhdG9yIiwiZ2VvbG9jYXRpb24iLCJnZW5lcmljUG9zaXRpb25Gcm9tR2VvbG9jYXRpb24iLCJnZW9Qb3NpdGlvbiIsImxhdGl0dWRlIiwibG9uZ2l0dWRlIiwiYWx0aXR1ZGUiLCJhY2N1cmFjeSIsImNvb3JkcyIsInRpbWVzdGFtcCIsIkRhdGUiLCJub3ciLCJ1bmRlZmluZWQiLCJnZXRHZW9VcmkiLCJwb3NpdGlvbiIsImxhdCIsImxvbiIsImFsdCIsIk51bWJlciIsImlzRmluaXRlIiwiYWNjIiwibWFwR2VvbG9jYXRpb25Qb3NpdGlvblRvVGltZWRHZW8iLCJnZW5lcmljUG9zaXRpb24iLCJnZW9VcmkiLCJnZXRDdXJyZW50UG9zaXRpb24iLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsIndhdGNoUG9zaXRpb24iLCJvbldhdGNoUG9zaXRpb24iLCJvbldhdGNoUG9zaXRpb25FcnJvciIsIm9uRXJyb3IiLCJ3YXRjaElkIiwiY2xlYXJXYXRjaCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9iZWFjb24vZ2VvbG9jYXRpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMjIgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQ1xuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbG9nZ2VyXCI7XG5cbi8vIG1hcCBHZW9sb2NhdGlvblBvc2l0aW9uRXJyb3IgY29kZXNcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9HZW9sb2NhdGlvblBvc2l0aW9uRXJyb3JcbmV4cG9ydCBlbnVtIEdlb2xvY2F0aW9uRXJyb3Ige1xuICAgIC8vIG5vIG5hdmlnYXRvci5nZW9sb2NhdGlvblxuICAgIFVuYXZhaWxhYmxlID0gXCJVbmF2YWlsYWJsZVwiLFxuICAgIC8vIFRoZSBhY3F1aXNpdGlvbiBvZiB0aGUgZ2VvbG9jYXRpb24gaW5mb3JtYXRpb24gZmFpbGVkIGJlY2F1c2UgdGhlIHBhZ2UgZGlkbid0IGhhdmUgdGhlIHBlcm1pc3Npb24gdG8gZG8gaXQuXG4gICAgUGVybWlzc2lvbkRlbmllZCA9IFwiUGVybWlzc2lvbkRlbmllZFwiLFxuICAgIC8vIFRoZSBhY3F1aXNpdGlvbiBvZiB0aGUgZ2VvbG9jYXRpb24gZmFpbGVkIGJlY2F1c2UgYXQgbGVhc3Qgb25lIGludGVybmFsIHNvdXJjZSBvZiBwb3NpdGlvbiByZXR1cm5lZCBhbiBpbnRlcm5hbCBlcnJvci5cbiAgICBQb3NpdGlvblVuYXZhaWxhYmxlID0gXCJQb3NpdGlvblVuYXZhaWxhYmxlXCIsXG4gICAgLy8gVGhlIHRpbWUgYWxsb3dlZCB0byBhY3F1aXJlIHRoZSBnZW9sb2NhdGlvbiB3YXMgcmVhY2hlZCBiZWZvcmUgdGhlIGluZm9ybWF0aW9uIHdhcyBvYnRhaW5lZC5cbiAgICBUaW1lb3V0ID0gXCJUaW1lb3V0XCIsXG4gICAgLy8gb3RoZXIgdW5leHBlY3RlZCBmYWlsdXJlXG4gICAgRGVmYXVsdCA9IFwiRGVmYXVsdFwiLFxufVxuXG5jb25zdCBHZW9sb2NhdGlvbk9wdGlvbnMgPSB7XG4gICAgdGltZW91dDogMTAwMDAsXG4gICAgbWF4aW11bUFnZTogNjAwMDAsXG59O1xuXG5jb25zdCBpc0dlb2xvY2F0aW9uUG9zaXRpb25FcnJvciA9IChlcnJvcjogdW5rbm93bik6IGVycm9yIGlzIEdlb2xvY2F0aW9uUG9zaXRpb25FcnJvciA9PlxuICAgIHR5cGVvZiBlcnJvciA9PT0gXCJvYmplY3RcIiAmJiAhIShlcnJvciBhcyBHZW9sb2NhdGlvblBvc2l0aW9uRXJyb3IpW1wiUEVSTUlTU0lPTl9ERU5JRURcIl07XG4vKipcbiAqIE1hcHMgR2VvbG9jYXRpb25Qb3NpdGlvbkVycm9yIHRvIG91ciBHZW9sb2NhdGlvbkVycm9yIGVudW1cbiAqL1xuZXhwb3J0IGNvbnN0IG1hcEdlb2xvY2F0aW9uRXJyb3IgPSAoZXJyb3I6IEdlb2xvY2F0aW9uUG9zaXRpb25FcnJvciB8IEVycm9yIHwgdW5rbm93bik6IEdlb2xvY2F0aW9uRXJyb3IgPT4ge1xuICAgIGxvZ2dlci5lcnJvcihcIkdlb2xvY2F0aW9uIGZhaWxlZFwiLCBlcnJvcik7XG5cbiAgICBpZiAoaXNHZW9sb2NhdGlvblBvc2l0aW9uRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgIHN3aXRjaCAoZXJyb3I/LmNvZGUpIHtcbiAgICAgICAgICAgIGNhc2UgZXJyb3IuUEVSTUlTU0lPTl9ERU5JRUQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIEdlb2xvY2F0aW9uRXJyb3IuUGVybWlzc2lvbkRlbmllZDtcbiAgICAgICAgICAgIGNhc2UgZXJyb3IuUE9TSVRJT05fVU5BVkFJTEFCTEU6XG4gICAgICAgICAgICAgICAgcmV0dXJuIEdlb2xvY2F0aW9uRXJyb3IuUG9zaXRpb25VbmF2YWlsYWJsZTtcbiAgICAgICAgICAgIGNhc2UgZXJyb3IuVElNRU9VVDpcbiAgICAgICAgICAgICAgICByZXR1cm4gR2VvbG9jYXRpb25FcnJvci5UaW1lb3V0O1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gR2VvbG9jYXRpb25FcnJvci5EZWZhdWx0O1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm1lc3NhZ2UgPT09IEdlb2xvY2F0aW9uRXJyb3IuVW5hdmFpbGFibGUpIHtcbiAgICAgICAgcmV0dXJuIEdlb2xvY2F0aW9uRXJyb3IuVW5hdmFpbGFibGU7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIEdlb2xvY2F0aW9uRXJyb3IuRGVmYXVsdDtcbiAgICB9XG59O1xuXG5jb25zdCBnZXRHZW9sb2NhdGlvbiA9ICgpOiBHZW9sb2NhdGlvbiA9PiB7XG4gICAgaWYgKCFuYXZpZ2F0b3IuZ2VvbG9jYXRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKEdlb2xvY2F0aW9uRXJyb3IuVW5hdmFpbGFibGUpO1xuICAgIH1cbiAgICByZXR1cm4gbmF2aWdhdG9yLmdlb2xvY2F0aW9uO1xufTtcblxuZXhwb3J0IHR5cGUgR2VuZXJpY1Bvc2l0aW9uID0ge1xuICAgIGxhdGl0dWRlOiBudW1iZXI7XG4gICAgbG9uZ2l0dWRlOiBudW1iZXI7XG4gICAgYWx0aXR1ZGU/OiBudW1iZXI7XG4gICAgYWNjdXJhY3k/OiBudW1iZXI7XG4gICAgdGltZXN0YW1wOiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBUaW1lZEdlb1VyaSA9IHtcbiAgICBnZW9Vcmk6IHN0cmluZztcbiAgICB0aW1lc3RhbXA6IG51bWJlcjtcbn07XG5cbmV4cG9ydCBjb25zdCBnZW5lcmljUG9zaXRpb25Gcm9tR2VvbG9jYXRpb24gPSAoZ2VvUG9zaXRpb246IEdlb2xvY2F0aW9uUG9zaXRpb24pOiBHZW5lcmljUG9zaXRpb24gPT4ge1xuICAgIGNvbnN0IHsgbGF0aXR1ZGUsIGxvbmdpdHVkZSwgYWx0aXR1ZGUsIGFjY3VyYWN5IH0gPSBnZW9Qb3NpdGlvbi5jb29yZHM7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICAvLyBzYWZhcmkgcmVwb3J0cyBnZW9sb2NhdGlvbiB0aW1lc3RhbXBzIGFzIEFwcGxlIENvY29hIENvcmUgRGF0YSB0aW1lc3RhbXBcbiAgICAgICAgLy8gb3IgbXMgc2luY2UgMS8xLzIwMDEgaW5zdGVhZCBvZiB0aGUgcmVndWxhciBlcG9jaFxuICAgICAgICAvLyB0aGV5IGFsc28gdXNlIGxvY2FsIHRpbWUsIG5vdCB1dGNcbiAgICAgICAgLy8gdG8gc2ltcGxpZnksIGp1c3QgdXNlIERhdGUubm93KClcbiAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICBsYXRpdHVkZSxcbiAgICAgICAgbG9uZ2l0dWRlLFxuICAgICAgICBhbHRpdHVkZTogYWx0aXR1ZGUgPz8gdW5kZWZpbmVkLFxuICAgICAgICBhY2N1cmFjeSxcbiAgICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEdlb1VyaSA9IChwb3NpdGlvbjogR2VuZXJpY1Bvc2l0aW9uKTogc3RyaW5nID0+IHtcbiAgICBjb25zdCBsYXQgPSBwb3NpdGlvbi5sYXRpdHVkZTtcbiAgICBjb25zdCBsb24gPSBwb3NpdGlvbi5sb25naXR1ZGU7XG4gICAgY29uc3QgYWx0ID0gTnVtYmVyLmlzRmluaXRlKHBvc2l0aW9uLmFsdGl0dWRlKSA/IGAsJHtwb3NpdGlvbi5hbHRpdHVkZX1gIDogXCJcIjtcbiAgICBjb25zdCBhY2MgPSBOdW1iZXIuaXNGaW5pdGUocG9zaXRpb24uYWNjdXJhY3kpID8gYDt1PSR7cG9zaXRpb24uYWNjdXJhY3l9YCA6IFwiXCI7XG4gICAgcmV0dXJuIGBnZW86JHtsYXR9LCR7bG9ufSR7YWx0fSR7YWNjfWA7XG59O1xuXG5leHBvcnQgY29uc3QgbWFwR2VvbG9jYXRpb25Qb3NpdGlvblRvVGltZWRHZW8gPSAocG9zaXRpb246IEdlb2xvY2F0aW9uUG9zaXRpb24pOiBUaW1lZEdlb1VyaSA9PiB7XG4gICAgY29uc3QgZ2VuZXJpY1Bvc2l0aW9uID0gZ2VuZXJpY1Bvc2l0aW9uRnJvbUdlb2xvY2F0aW9uKHBvc2l0aW9uKTtcbiAgICByZXR1cm4geyB0aW1lc3RhbXA6IGdlbmVyaWNQb3NpdGlvbi50aW1lc3RhbXAsIGdlb1VyaTogZ2V0R2VvVXJpKGdlbmVyaWNQb3NpdGlvbikgfTtcbn07XG5cbi8qKlxuICogR2V0cyBjdXJyZW50IHBvc2l0aW9uLCByZXR1cm5zIGEgcHJvbWlzZVxuICogQHJldHVybnMgUHJvbWlzZTxHZW9sb2NhdGlvblBvc2l0aW9uPlxuICovXG5leHBvcnQgY29uc3QgZ2V0Q3VycmVudFBvc2l0aW9uID0gYXN5bmMgKCk6IFByb21pc2U8R2VvbG9jYXRpb25Qb3NpdGlvbj4gPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmU6IFBvc2l0aW9uQ2FsbGJhY2ssIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgZ2V0R2VvbG9jYXRpb24oKS5nZXRDdXJyZW50UG9zaXRpb24ocmVzb2x2ZSwgcmVqZWN0LCBHZW9sb2NhdGlvbk9wdGlvbnMpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHBvc2l0aW9uO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtYXBHZW9sb2NhdGlvbkVycm9yKGVycm9yKSk7XG4gICAgfVxufTtcblxuZXhwb3J0IHR5cGUgQ2xlYXJXYXRjaENhbGxiYWNrID0gKCkgPT4gdm9pZDtcbmV4cG9ydCBjb25zdCB3YXRjaFBvc2l0aW9uID0gKFxuICAgIG9uV2F0Y2hQb3NpdGlvbjogUG9zaXRpb25DYWxsYmFjayxcbiAgICBvbldhdGNoUG9zaXRpb25FcnJvcjogKGVycm9yOiBHZW9sb2NhdGlvbkVycm9yKSA9PiB2b2lkLFxuKTogQ2xlYXJXYXRjaENhbGxiYWNrID0+IHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBvbkVycm9yID0gKGVycm9yOiBHZW9sb2NhdGlvblBvc2l0aW9uRXJyb3IpOiB2b2lkID0+IG9uV2F0Y2hQb3NpdGlvbkVycm9yKG1hcEdlb2xvY2F0aW9uRXJyb3IoZXJyb3IpKTtcbiAgICAgICAgY29uc3Qgd2F0Y2hJZCA9IGdldEdlb2xvY2F0aW9uKCkud2F0Y2hQb3NpdGlvbihvbldhdGNoUG9zaXRpb24sIG9uRXJyb3IsIEdlb2xvY2F0aW9uT3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGNsZWFyV2F0Y2ggPSAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgICBnZXRHZW9sb2NhdGlvbigpLmNsZWFyV2F0Y2god2F0Y2hJZCk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBjbGVhcldhdGNoO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtYXBHZW9sb2NhdGlvbkVycm9yKGVycm9yKSk7XG4gICAgfVxufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBUUEsSUFBQUEsT0FBQSxHQUFBQyxPQUFBO0FBUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQUEsSUFDWUMsZ0JBQWdCLEdBQUFDLE9BQUEsQ0FBQUQsZ0JBQUEsMEJBQWhCQSxnQkFBZ0I7RUFBaEJBLGdCQUFnQjtFQUFoQkEsZ0JBQWdCO0VBQWhCQSxnQkFBZ0I7RUFBaEJBLGdCQUFnQjtFQUFoQkEsZ0JBQWdCO0VBQUEsT0FBaEJBLGdCQUFnQjtBQUFBO0FBYTVCLE1BQU1FLGtCQUFrQixHQUFHO0VBQ3ZCQyxPQUFPLEVBQUUsS0FBSztFQUNkQyxVQUFVLEVBQUU7QUFDaEIsQ0FBQztBQUVELE1BQU1DLDBCQUEwQixHQUFJQyxLQUFjLElBQzlDLE9BQU9BLEtBQUssS0FBSyxRQUFRLElBQUksQ0FBQyxDQUFFQSxLQUFLLENBQThCLG1CQUFtQixDQUFDO0FBQzNGO0FBQ0E7QUFDQTtBQUNPLE1BQU1DLG1CQUFtQixHQUFJRCxLQUFpRCxJQUF1QjtFQUN4R0UsY0FBTSxDQUFDRixLQUFLLENBQUMsb0JBQW9CLEVBQUVBLEtBQUssQ0FBQztFQUV6QyxJQUFJRCwwQkFBMEIsQ0FBQ0MsS0FBSyxDQUFDLEVBQUU7SUFDbkMsUUFBUUEsS0FBSyxFQUFFRyxJQUFJO01BQ2YsS0FBS0gsS0FBSyxDQUFDSSxpQkFBaUI7UUFDeEIsT0FBT1YsZ0JBQWdCLENBQUNXLGdCQUFnQjtNQUM1QyxLQUFLTCxLQUFLLENBQUNNLG9CQUFvQjtRQUMzQixPQUFPWixnQkFBZ0IsQ0FBQ2EsbUJBQW1CO01BQy9DLEtBQUtQLEtBQUssQ0FBQ1EsT0FBTztRQUNkLE9BQU9kLGdCQUFnQixDQUFDZSxPQUFPO01BQ25DO1FBQ0ksT0FBT2YsZ0JBQWdCLENBQUNnQixPQUFPO0lBQ3ZDO0VBQ0osQ0FBQyxNQUFNLElBQUlWLEtBQUssWUFBWVcsS0FBSyxJQUFJWCxLQUFLLENBQUNZLE9BQU8sS0FBS2xCLGdCQUFnQixDQUFDbUIsV0FBVyxFQUFFO0lBQ2pGLE9BQU9uQixnQkFBZ0IsQ0FBQ21CLFdBQVc7RUFDdkMsQ0FBQyxNQUFNO0lBQ0gsT0FBT25CLGdCQUFnQixDQUFDZ0IsT0FBTztFQUNuQztBQUNKLENBQUM7QUFBQ2YsT0FBQSxDQUFBTSxtQkFBQSxHQUFBQSxtQkFBQTtBQUVGLE1BQU1hLGNBQWMsR0FBR0EsQ0FBQSxLQUFtQjtFQUN0QyxJQUFJLENBQUNDLFNBQVMsQ0FBQ0MsV0FBVyxFQUFFO0lBQ3hCLE1BQU0sSUFBSUwsS0FBSyxDQUFDakIsZ0JBQWdCLENBQUNtQixXQUFXLENBQUM7RUFDakQ7RUFDQSxPQUFPRSxTQUFTLENBQUNDLFdBQVc7QUFDaEMsQ0FBQztBQWVNLE1BQU1DLDhCQUE4QixHQUFJQyxXQUFnQyxJQUFzQjtFQUNqRyxNQUFNO0lBQUVDLFFBQVE7SUFBRUMsU0FBUztJQUFFQyxRQUFRO0lBQUVDO0VBQVMsQ0FBQyxHQUFHSixXQUFXLENBQUNLLE1BQU07RUFFdEUsT0FBTztJQUNIO0lBQ0E7SUFDQTtJQUNBO0lBQ0FDLFNBQVMsRUFBRUMsSUFBSSxDQUFDQyxHQUFHLENBQUMsQ0FBQztJQUNyQlAsUUFBUTtJQUNSQyxTQUFTO0lBQ1RDLFFBQVEsRUFBRUEsUUFBUSxJQUFJTSxTQUFTO0lBQy9CTDtFQUNKLENBQUM7QUFDTCxDQUFDO0FBQUMzQixPQUFBLENBQUFzQiw4QkFBQSxHQUFBQSw4QkFBQTtBQUVLLE1BQU1XLFNBQVMsR0FBSUMsUUFBeUIsSUFBYTtFQUM1RCxNQUFNQyxHQUFHLEdBQUdELFFBQVEsQ0FBQ1YsUUFBUTtFQUM3QixNQUFNWSxHQUFHLEdBQUdGLFFBQVEsQ0FBQ1QsU0FBUztFQUM5QixNQUFNWSxHQUFHLEdBQUdDLE1BQU0sQ0FBQ0MsUUFBUSxDQUFDTCxRQUFRLENBQUNSLFFBQVEsQ0FBQyxHQUFHLElBQUlRLFFBQVEsQ0FBQ1IsUUFBUSxFQUFFLEdBQUcsRUFBRTtFQUM3RSxNQUFNYyxHQUFHLEdBQUdGLE1BQU0sQ0FBQ0MsUUFBUSxDQUFDTCxRQUFRLENBQUNQLFFBQVEsQ0FBQyxHQUFHLE1BQU1PLFFBQVEsQ0FBQ1AsUUFBUSxFQUFFLEdBQUcsRUFBRTtFQUMvRSxPQUFPLE9BQU9RLEdBQUcsSUFBSUMsR0FBRyxHQUFHQyxHQUFHLEdBQUdHLEdBQUcsRUFBRTtBQUMxQyxDQUFDO0FBQUN4QyxPQUFBLENBQUFpQyxTQUFBLEdBQUFBLFNBQUE7QUFFSyxNQUFNUSxnQ0FBZ0MsR0FBSVAsUUFBNkIsSUFBa0I7RUFDNUYsTUFBTVEsZUFBZSxHQUFHcEIsOEJBQThCLENBQUNZLFFBQVEsQ0FBQztFQUNoRSxPQUFPO0lBQUVMLFNBQVMsRUFBRWEsZUFBZSxDQUFDYixTQUFTO0lBQUVjLE1BQU0sRUFBRVYsU0FBUyxDQUFDUyxlQUFlO0VBQUUsQ0FBQztBQUN2RixDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBSEExQyxPQUFBLENBQUF5QyxnQ0FBQSxHQUFBQSxnQ0FBQTtBQUlPLE1BQU1HLGtCQUFrQixHQUFHLE1BQUFBLENBQUEsS0FBMEM7RUFDeEUsSUFBSTtJQUNBLE1BQU1WLFFBQVEsR0FBRyxNQUFNLElBQUlXLE9BQU8sQ0FBQyxDQUFDQyxPQUF5QixFQUFFQyxNQUFNLEtBQUs7TUFDdEU1QixjQUFjLENBQUMsQ0FBQyxDQUFDeUIsa0JBQWtCLENBQUNFLE9BQU8sRUFBRUMsTUFBTSxFQUFFOUMsa0JBQWtCLENBQUM7SUFDNUUsQ0FBQyxDQUFDO0lBQ0YsT0FBT2lDLFFBQVE7RUFDbkIsQ0FBQyxDQUFDLE9BQU83QixLQUFLLEVBQUU7SUFDWixNQUFNLElBQUlXLEtBQUssQ0FBQ1YsbUJBQW1CLENBQUNELEtBQUssQ0FBQyxDQUFDO0VBQy9DO0FBQ0osQ0FBQztBQUFDTCxPQUFBLENBQUE0QyxrQkFBQSxHQUFBQSxrQkFBQTtBQUdLLE1BQU1JLGFBQWEsR0FBR0EsQ0FDekJDLGVBQWlDLEVBQ2pDQyxvQkFBdUQsS0FDbEM7RUFDckIsSUFBSTtJQUNBLE1BQU1DLE9BQU8sR0FBSTlDLEtBQStCLElBQVc2QyxvQkFBb0IsQ0FBQzVDLG1CQUFtQixDQUFDRCxLQUFLLENBQUMsQ0FBQztJQUMzRyxNQUFNK0MsT0FBTyxHQUFHakMsY0FBYyxDQUFDLENBQUMsQ0FBQzZCLGFBQWEsQ0FBQ0MsZUFBZSxFQUFFRSxPQUFPLEVBQUVsRCxrQkFBa0IsQ0FBQztJQUM1RixNQUFNb0QsVUFBVSxHQUFHQSxDQUFBLEtBQVk7TUFDM0JsQyxjQUFjLENBQUMsQ0FBQyxDQUFDa0MsVUFBVSxDQUFDRCxPQUFPLENBQUM7SUFDeEMsQ0FBQztJQUNELE9BQU9DLFVBQVU7RUFDckIsQ0FBQyxDQUFDLE9BQU9oRCxLQUFLLEVBQUU7SUFDWixNQUFNLElBQUlXLEtBQUssQ0FBQ1YsbUJBQW1CLENBQUNELEtBQUssQ0FBQyxDQUFDO0VBQy9DO0FBQ0osQ0FBQztBQUFDTCxPQUFBLENBQUFnRCxhQUFBLEdBQUFBLGFBQUEiLCJpZ25vcmVMaXN0IjpbXX0=