ng-yunzai-mobile
Version:
1. 适配yunzai_uni_app_x
407 lines • 34.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: location/location.service.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Injectable } from "@angular/core";
var LocationService = /** @class */ (function () {
function LocationService() {
// 定义一些常量
this.bdsUtils = {
x_PI: 3.14159265358979324 * 3000.0 / 180.0,
PI: 3.1415926535897932384626,
a: 6378245.0,
ee: 0.00669342162296594323,
};
}
/**
* 获取地址前需要将gcj02 、bd09 转换为wgs84
* @param option
*/
/**
* 获取地址前需要将gcj02 、bd09 转换为wgs84
* @param {?} option
* @return {?}
*/
LocationService.prototype.getLocation = /**
* 获取地址前需要将gcj02 、bd09 转换为wgs84
* @param {?} option
* @return {?}
*/
function (option) {
if (!option.longitude || !option.longitude)
return;
if (option.onOk) {
/** @type {?} */
var xy = void 0;
switch (option.type) {
case TYPE_ENUM.GCJ02:
xy = this.gcj02towgs84(option.longitude, option.latitude);
break;
case TYPE_ENUM.BD09:
xy = this.bd09towgs84(option.longitude, option.latitude);
break;
case TYPE_ENUM.WGS84:
xy = [option.longitude, option.latitude];
break;
}
this.queryAddressInfo(xy[0], xy[1]).then((/**
* @param {?} data
* @return {?}
*/
function (data) {
option.onOk(data);
})).catch((/**
* @return {?}
*/
function () {
option.onOk(null);
}));
}
};
/**
* 获取地址信息
* @param lon 坐标的x值
* @param lat 坐标的y值
*/
/**
* 获取地址信息
* @param {?} lon 坐标的x值
* @param {?} lat 坐标的y值
* @return {?}
*/
LocationService.prototype.queryAddressInfo = /**
* 获取地址信息
* @param {?} lon 坐标的x值
* @param {?} lat 坐标的y值
* @return {?}
*/
function (lon, lat) {
return new Promise((/**
* @param {?} resolve
* @param {?} reject
* @return {?}
*/
function (resolve, reject) {
/** @type {?} */
var param = {
lon: lon,
lat: lat,
ver: 1 // 接口版本
};
/** @type {?} */
var url = '//api.tianditu.gov.cn' + '/geocoder?postStr=' + JSON.stringify(param) + '&type=geocode&tk=40b42d3bf171b3e50dd21cd002efaa23';
/** @type {?} */
var xmlHttp = new XMLHttpRequest();
xmlHttp.open('GET', url);
xmlHttp.withCredentials = false;
xmlHttp.send();
xmlHttp.onreadystatechange = (/**
* @return {?}
*/
function () {
if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
/** @type {?} */
var res = JSON.parse(xmlHttp.responseText);
if (res.status == '0') {
resolve(res.result);
}
else {
reject(null);
console.error('错误1' + res.msg);
}
}
});
xmlHttp.onerror = (/**
* @param {?} error
* @return {?}
*/
function (error) {
console.error("错误2" + error);
reject(null);
});
}));
};
/**
* 判断是否在国内,不在国内则不做偏移
* @param lng
* @param lat
*/
/**
* 判断是否在国内,不在国内则不做偏移
* @param {?} lng
* @param {?} lat
* @return {?}
*/
LocationService.prototype.outOfChina = /**
* 判断是否在国内,不在国内则不做偏移
* @param {?} lng
* @param {?} lat
* @return {?}
*/
function (lng, lat) {
return (lng < 72.004 || lng > 137.8347) || ((lat < 0.8293 || lat > 55.8271) || false);
};
/**
* 纬度转换
* @param lng
* @param lat
*/
/**
* 纬度转换
* @param {?} lng
* @param {?} lat
* @return {?}
*/
LocationService.prototype.transformlng = /**
* 纬度转换
* @param {?} lng
* @param {?} lat
* @return {?}
*/
function (lng, lat) {
/** @type {?} */
var ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));
ret += (20.0 * Math.sin(6.0 * lng * this.bdsUtils.PI) + 20.0 * Math.sin(2.0 * lng * this.bdsUtils.PI)) * 2.0 / 3.0;
ret += (20.0 * Math.sin(lng * this.bdsUtils.PI) + 40.0 * Math.sin(lng / 3.0 * this.bdsUtils.PI)) * 2.0 / 3.0;
ret += (150.0 * Math.sin(lng / 12.0 * this.bdsUtils.PI) + 300.0 * Math.sin(lng / 30.0 * this.bdsUtils.PI)) * 2.0 / 3.0;
return ret;
};
/**
* 经度转换
* @param lng
* @param lat
*/
/**
* 经度转换
* @param {?} lng
* @param {?} lat
* @return {?}
*/
LocationService.prototype.transformlat = /**
* 经度转换
* @param {?} lng
* @param {?} lat
* @return {?}
*/
function (lng, lat) {
/** @type {?} */
var ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng));
ret += (20.0 * Math.sin(6.0 * lng * this.bdsUtils.PI) + 20.0 * Math.sin(2.0 * lng * this.bdsUtils.PI)) * 2.0 / 3.0;
ret += (20.0 * Math.sin(lat * this.bdsUtils.PI) + 40.0 * Math.sin(lat / 3.0 * this.bdsUtils.PI)) * 2.0 / 3.0;
ret += (160.0 * Math.sin(lat / 12.0 * this.bdsUtils.PI) + 320 * Math.sin(lat * this.bdsUtils.PI / 30.0)) * 2.0 / 3.0;
return ret;
};
/**
* 百度坐标系 (BD-09) 与 火星坐标系 (GCJ-02)的转换 / 即百度转谷歌、高德
* @param bd_lon
* @param bd_lat
*/
/**
* 百度坐标系 (BD-09) 与 火星坐标系 (GCJ-02)的转换 / 即百度转谷歌、高德
* @param {?} bd_lon
* @param {?} bd_lat
* @return {?}
*/
LocationService.prototype.bd09togcj02 = /**
* 百度坐标系 (BD-09) 与 火星坐标系 (GCJ-02)的转换 / 即百度转谷歌、高德
* @param {?} bd_lon
* @param {?} bd_lat
* @return {?}
*/
function (bd_lon, bd_lat) {
/** @type {?} */
var x = bd_lon - 0.0065;
/** @type {?} */
var y = bd_lat - 0.006;
/** @type {?} */
var z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * this.bdsUtils.x_PI);
/** @type {?} */
var theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * this.bdsUtils.x_PI);
/** @type {?} */
var gg_lng = z * Math.cos(theta);
/** @type {?} */
var gg_lat = z * Math.sin(theta);
return [gg_lng, gg_lat];
};
/**
* 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换 / 即谷歌、高德 转 百度
* @param lng
* @param lat
*/
/**
* 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换 / 即谷歌、高德 转 百度
* @param {?} lng
* @param {?} lat
* @return {?}
*/
LocationService.prototype.gcj02tobd09 = /**
* 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换 / 即谷歌、高德 转 百度
* @param {?} lng
* @param {?} lat
* @return {?}
*/
function (lng, lat) {
/** @type {?} */
var z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * this.bdsUtils.x_PI);
/** @type {?} */
var theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * this.bdsUtils.x_PI);
/** @type {?} */
var bd_lng = z * Math.cos(theta) + 0.0065;
/** @type {?} */
var bd_lat = z * Math.sin(theta) + 0.006;
return [bd_lng, bd_lat];
};
/**
* WGS84坐标系转火星坐标系GCj02 / 即WGS84 转谷歌、高德
* @param lng
* @param lat
*/
/**
* WGS84坐标系转火星坐标系GCj02 / 即WGS84 转谷歌、高德
* @param {?} lng
* @param {?} lat
* @return {?}
*/
LocationService.prototype.wgs84togcj02 = /**
* WGS84坐标系转火星坐标系GCj02 / 即WGS84 转谷歌、高德
* @param {?} lng
* @param {?} lat
* @return {?}
*/
function (lng, lat) {
if (this.outOfChina(lng, lat)) {
return [lng, lat];
}
else {
/** @type {?} */
var dlat = this.transformlat(lng - 105.0, lat - 35.0);
/** @type {?} */
var dlng = this.transformlng(lng - 105.0, lat - 35.0);
/** @type {?} */
var radlat = lat / 180.0 * this.bdsUtils.PI;
/** @type {?} */
var magic = Math.sin(radlat);
magic = 1 - this.bdsUtils.ee * magic * magic;
/** @type {?} */
var sqrtmagic = Math.sqrt(magic);
dlat = (dlat * 180.0) / ((this.bdsUtils.a * (1 - this.bdsUtils.ee)) / (magic * sqrtmagic) * this.bdsUtils.PI);
dlng = (dlng * 180.0) / (this.bdsUtils.a / sqrtmagic * Math.cos(radlat) * this.bdsUtils.PI);
/** @type {?} */
var mglat = lat + dlat;
/** @type {?} */
var mglng = lng + dlng;
return [mglng, mglat];
}
};
/**
* GCJ02(火星坐标系) 转换为 WGS84 / 即谷歌高德转WGS84
* @param lng
* @param lat
*/
/**
* GCJ02(火星坐标系) 转换为 WGS84 / 即谷歌高德转WGS84
* @param {?} lng
* @param {?} lat
* @return {?}
*/
LocationService.prototype.gcj02towgs84 = /**
* GCJ02(火星坐标系) 转换为 WGS84 / 即谷歌高德转WGS84
* @param {?} lng
* @param {?} lat
* @return {?}
*/
function (lng, lat) {
if (this.outOfChina(lng, lat)) {
return [lng, lat];
}
else {
/** @type {?} */
var dlat = this.transformlat(lng - 105.0, lat - 35.0);
/** @type {?} */
var dlng = this.transformlng(lng - 105.0, lat - 35.0);
/** @type {?} */
var radlat = lat / 180.0 * this.bdsUtils.PI;
/** @type {?} */
var magic = Math.sin(radlat);
magic = 1 - this.bdsUtils.ee * magic * magic;
/** @type {?} */
var sqrtmagic = Math.sqrt(magic);
dlat = (dlat * 180.0) / ((this.bdsUtils.a * (1 - this.bdsUtils.ee)) / (magic * sqrtmagic) * this.bdsUtils.PI);
dlng = (dlng * 180.0) / (this.bdsUtils.a / sqrtmagic * Math.cos(radlat) * this.bdsUtils.PI);
/** @type {?} */
var mglat = lat + dlat;
/** @type {?} */
var mglng = lng + dlng;
return [lng * 2 - mglng, lat * 2 - mglat];
}
};
/**
* 百度坐标系转wgs84坐标系
* @param lng
* @param lat
*/
/**
* 百度坐标系转wgs84坐标系
* @param {?} lng
* @param {?} lat
* @return {?}
*/
LocationService.prototype.bd09towgs84 = /**
* 百度坐标系转wgs84坐标系
* @param {?} lng
* @param {?} lat
* @return {?}
*/
function (lng, lat) {
// 百度坐标系先转为火星坐标系
/** @type {?} */
var gcj02 = this.bd09togcj02(lng, lat);
// 火星坐标系转wgs84坐标系
return this.gcj02towgs84(gcj02[0], gcj02[1]);
};
/**
* wgs84坐标系转百度坐标系
* @param lng
* @param lat
*/
/**
* wgs84坐标系转百度坐标系
* @param {?} lng
* @param {?} lat
* @return {?}
*/
LocationService.prototype.wgs84tobd09 = /**
* wgs84坐标系转百度坐标系
* @param {?} lng
* @param {?} lat
* @return {?}
*/
function (lng, lat) {
// wgs84先转为火星坐标系
/** @type {?} */
var gcj02 = this.wgs84togcj02(lng, lat);
// 火星坐标系转百度坐标系
return this.gcj02tobd09(gcj02[0], gcj02[1]);
};
LocationService.decorators = [
{ type: Injectable }
];
/** @nocollapse */
LocationService.ctorParameters = function () { return []; };
return LocationService;
}());
export { LocationService };
if (false) {
/** @type {?} */
LocationService.prototype.bdsUtils;
}
/** @enum {string} */
var TYPE_ENUM = {
GCJ02: "gcj02",
BD09: "bd09",
WGS84: "wgs84" // WGS84坐标系
,
};
export { TYPE_ENUM };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLXl1bnphaS1tb2JpbGUvIiwic291cmNlcyI6WyJsb2NhdGlvbi9sb2NhdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUd6QztJQVdFOztRQVBBLGFBQVEsR0FBRztZQUNULElBQUksRUFBRSxtQkFBbUIsR0FBRyxNQUFNLEdBQUcsS0FBSztZQUMxQyxFQUFFLEVBQUUsd0JBQXdCO1lBQzVCLENBQUMsRUFBRSxTQUFTO1lBQ1osRUFBRSxFQUFFLHNCQUFzQjtTQUMzQixDQUFDO0lBR0YsQ0FBQztJQUVEOzs7T0FHRzs7Ozs7O0lBQ0gscUNBQVc7Ozs7O0lBQVgsVUFBWSxNQUFzRjtRQUNoRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTO1lBQUUsT0FBTztRQUNuRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUU7O2dCQUNYLEVBQUUsU0FBWTtZQUNsQixRQUFRLE1BQU0sQ0FBQyxJQUFJLEVBQUU7Z0JBQ25CLEtBQUssU0FBUyxDQUFDLEtBQUs7b0JBQ2xCLEVBQUUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUMxRCxNQUFNO2dCQUNSLEtBQUssU0FBUyxDQUFDLElBQUk7b0JBQ2pCLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUN6RCxNQUFNO2dCQUNSLEtBQUssU0FBUyxDQUFDLEtBQUs7b0JBQ2xCLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUN6QyxNQUFNO2FBQ1Q7WUFFRCxJQUFJ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QUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNuSCxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQzdHLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ3ZILE9BQU8sR0FBRyxDQUFBO0lBQ1osQ0FBQztJQUVEOzs7O09BSUc7Ozs7Ozs7SUFDSCxzQ0FBWTs7Ozs7O0lBQVosVUFBYSxHQUFHLEVBQUUsR0FBRzs7WUFDZixHQUFHLEdBQUcsQ0FBQyxLQUFLLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDN0csR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxD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QUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDOztnQkFDdEYsS0FBSyxHQUFHLEdBQUcsR0FBRyxJQUFJOztnQkFDbEIsS0FBSyxHQUFHLEdBQUcsR0FBRyxJQUFJO1lBQ3hCLE9BQU8sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEtBQUssRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO1NBQzNDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7Ozs7Ozs7SUFDSCxxQ0FBVzs7Ozs7O0lBQVgsVUFBWSxHQUFHLEVBQUUsR0FBRzs7O1lBRVosS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQztRQUN4QyxpQkFBaUI7UUFDakIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQ7Ozs7T0FJRzs7Ozs7OztJQUNILHFDQUFXOzs7Ozs7SUFBWCxVQUFZLEdBQUcsRUFBRSxHQUFHOzs7WUFFWixLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO1FBQ3pDLGNBQWM7UUFDZCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlDLENBQUM7O2dCQWxORixVQUFVOzs7O0lBbU5YLHNCQUFDO0NBQUEsQUFuTkQsSUFtTkM7U0FsTlksZUFBZTs7O0lBRzFCLG1DQUtFOzs7QUE4TUosSUFBWSxTQUFTO0lBQ25CLEtBQUssU0FBVTtJQUNmLElBQUksUUFBUztJQUNiLEtBQUssU0FBVSxDQUFFLFdBQVc7O0VBQzdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge0xvY2F0aW9uTW9kZWx9IGZyb20gXCIuL2xvY2F0aW9uLm1vZGVsXCI7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBMb2NhdGlvblNlcnZpY2Uge1xyXG5cclxuICAvLyDlrprkuYnkuIDkupvluLjph49cclxuICBiZHNVdGlscyA9IHtcclxuICAgIHhfUEk6IDMuMTQxNTkyNjUzNTg5NzkzMjQgKiAzMDAwLjAgLyAxODAuMCxcclxuICAgIFBJOiAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2MjYsXHJcbiAgICBhOiA2Mzc4MjQ1LjAsXHJcbiAgICBlZTogMC4wMDY2OTM0MjE2MjI5NjU5NDMyMyxcclxuICB9O1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIOiOt+WPluWcsOWdgOWJjemcgOimgeWwhmdjajAyIOOAgWJkMDkg6L2s5o2i5Li6d2dzODRcclxuICAgKiBAcGFyYW0gb3B0aW9uXHJcbiAgICovXHJcbiAgZ2V0TG9jYXRpb24ob3B0aW9uOiB7IGxvbmdpdHVkZTogYW55LCBsYXRpdHVkZTogYW55LCB0eXBlOiBUWVBFX0VOVU0sIG9uT2s6ICh2YWx1ZTogYW55KSA9PiB2b2lkIH0pIHtcclxuICAgIGlmICghb3B0aW9uLmxvbmdpdHVkZSB8fCAhb3B0aW9uLmxvbmdpdHVkZSkgcmV0dXJuO1xyXG4gICAgaWYgKG9wdGlvbi5vbk9rKSB7XHJcbiAgICAgIGxldCB4eTogQXJyYXk8YW55PjtcclxuICAgICAgc3dpdGNoIChvcHRpb24udHlwZSkge1xyXG4gICAgICAgIGNhc2UgVFlQRV9FTlVNLkdDSjAyOlxyXG4gICAgICAgICAgeHkgPSB0aGlzLmdjajAydG93Z3M4NChvcHRpb24ubG9uZ2l0dWRlLCBvcHRpb24ubGF0aXR1ZGUpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBUWVBFX0VOVU0uQkQwOTpcclxuICAgICAgICAgIHh5ID0gdGhpcy5iZDA5dG93Z3M4NChvcHRpb24ubG9uZ2l0dWRlLCBvcHRpb24ubGF0aXR1ZGUpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBUWVBFX0VOVU0uV0dTODQ6XHJcbiAgICAgICAgICB4eSA9IFtvcHRpb24ubG9uZ2l0dWRlLCBvcHRpb24ubGF0aXR1ZGVdO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMucXVlcnlBZGRyZXNzSW5mbyh4eVswXSwgeHlbMV0pLnRoZW4oZGF0YSA9PiB7XHJcbiAgICAgICAgb3B0aW9uLm9uT2soZGF0YSk7XHJcbiAgICAgIH0pLmNhdGNoKCgpID0+IHtcclxuICAgICAgICBvcHRpb24ub25PayhudWxsKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIOiOt+WPluWcsOWdgOS/oeaBr1xyXG4gICAqIEBwYXJhbSBsb24g5Z2Q5qCH55qEeOWAvFxyXG4gICAqIEBwYXJhbSBsYXQg5Z2Q5qCH55qEeeWAvFxyXG4gICAqL1xyXG4gIHF1ZXJ5QWRkcmVzc0luZm8obG9uOiBhbnksIGxhdDogYW55KTogTG9jYXRpb25Nb2RlbCB8IGFueSB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBjb25zdCBwYXJhbSA9IHtcclxuICAgICAgICBsb246IGxvbixcclxuICAgICAgICBsYXQ6IGxhdCxcclxuICAgICAgICB2ZXI6IDEgLy8g5o6l5Y+j54mI5pysXHJcbiAgICAgIH07XHJcbiAgICAgIGNvbnN0IHVybCA9ICcvL2FwaS50aWFuZGl0dS5nb3YuY24nICsgJy9nZW9jb2Rlcj9wb3N0U3RyPScgKyBKU09OLnN0cmluZ2lmeShwYXJhbSkgKyAnJnR5cGU9Z2VvY29kZSZ0az00MGI0MmQzYmYxNzFiM2U1MGRkMjFjZDAwMmVmYWEyMyc7XHJcbiAgICAgIGNvbnN0IHhtbEh0dHAgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcclxuICAgICAgeG1sSHR0cC5vcGVuKCdHRVQnLCB1cmwpO1xyXG4gICAgICB4bWxIdHRwLndpdGhDcmVkZW50aWFscyA9IGZhbHNlO1xyXG4gICAgICB4bWxIdHRwLnNlbmQoKTtcclxuICAgICAgeG1sSHR0cC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKHhtbEh0dHAucmVhZHlTdGF0ZSA9PSA0ICYmIHhtbEh0dHAuc3RhdHVzID09IDIwMCkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHJlcyA9IEpTT04ucGFyc2UoeG1sSHR0cC5yZXNwb25zZVRleHQpO1xyXG4gICAgICAgICAgICAgIGlmIChyZXMuc3RhdHVzID09ICcwJykge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShyZXMucmVzdWx0KTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmVqZWN0KG51bGwpO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcign6ZSZ6K+vMScgKyByZXMubXNnKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgICB4bWxIdHRwLm9uZXJyb3IgPSBmdW5jdGlvbiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIumUmeivrzJcIiArIGVycm9yKTtcclxuICAgICAgICAgICAgcmVqZWN0KG51bGwpXHJcbiAgICAgIH07XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICog5Yik5pat5piv5ZCm5Zyo5Zu95YaF77yM5LiN5Zyo5Zu95YaF5YiZ5LiN5YGa5YGP56e7XHJcbiAgICogQHBhcmFtIGxuZ1xyXG4gICAqIEBwYXJhbSBsYXRcclxuICAgKi9cclxuICBvdXRPZkNoaW5hKGxuZywgbGF0KSB7XHJcbiAgICByZXR1cm4gKGxuZyA8IDcyLjAwNCB8fCBsbmcgPiAxMzcuODM0NykgfHwgKChsYXQgPCAwLjgyOTMgfHwgbGF0ID4gNTUuODI3MSkgfHwgZmFsc2UpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiDnuqzluqbovazmjaJcclxuICAgKiBAcGFyYW0gbG5nXHJcbiAgICogQHBhcmFtIGxhdFxyXG4gICAqL1xyXG4gIHRyYW5zZm9ybWxuZyhsbmcsIGxhdCkge1xyXG4gICAgbGV0IHJldCA9IDMwMC4wICsgbG5nICsgMi4wICogbGF0ICsgMC4xICogbG5nICogbG5nICsgMC4xICogbG5nICogbGF0ICsgMC4xICogTWF0aC5zcXJ0KE1hdGguYWJzKGxuZykpO1xyXG4gICAgcmV0ICs9ICgyMC4wICogTWF0aC5zaW4oNi4wICogbG5nICogdGhpcy5iZHNVdGlscy5QSSkgKyAyMC4wICogTWF0aC5zaW4oMi4wICogbG5nICogdGhpcy5iZHNVdGlscy5QSSkpICogMi4wIC8gMy4wO1xyXG4gICAgcmV0ICs9ICgyMC4wICogTWF0aC5zaW4obG5nICogdGhpcy5iZHNVdGlscy5QSSkgKyA0MC4wICogTWF0aC5zaW4obG5nIC8gMy4wICogdGhpcy5iZHNVdGlscy5QSSkpICogMi4wIC8gMy4wO1xyXG4gICAgcmV0ICs9ICgxNTAuMCAqIE1hdGguc2luKGxuZyAvIDEyLjAgKiB0aGlzLmJkc1V0aWxzLlBJKSArIDMwMC4wICogTWF0aC5zaW4obG5nIC8gMzAuMCAqIHRoaXMuYmRzVXRpbHMuUEkpKSAqIDIuMCAvIDMuMDtcclxuICAgIHJldHVybiByZXRcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIOe7j+W6pui9rOaNolxyXG4gICAqIEBwYXJhbSBsbmdcclxuICAgKiBAcGFyYW0gbGF0XHJcbiAgICovXHJcbiAgdHJhbnNmb3JtbGF0KGxuZywgbGF0KSB7XHJcbiAgICBsZXQgcmV0ID0gLTEwMC4wICsgMi4wICogbG5nICsgMy4wICogbGF0ICsgMC4yICogbGF0ICogbGF0ICsgMC4xICogbG5nICogbGF0ICsgMC4yICogTWF0aC5zcXJ0KE1hdGguYWJzKGxuZykpO1xyXG4gICAgcmV0ICs9ICgyMC4wICogTWF0aC5zaW4oNi4wICogbG5nICogdGhpcy5iZHNVdGlscy5QSSkgKyAyMC4wICogTWF0aC5zaW4oMi4wICogbG5nICogdGhpcy5iZHNVdGlscy5QSSkpICogMi4wIC8gMy4wO1xyXG4gICAgcmV0ICs9ICgyMC4wICogTWF0aC5zaW4obGF0ICogdGhpcy5iZHNVdGlscy5QSSkgKyA0MC4wICogTWF0aC5zaW4obGF0IC8gMy4wICogdGhpcy5iZHNVdGlscy5QSSkpICogMi4wIC8gMy4wO1xyXG4gICAgcmV0ICs9ICgxNjAuMCAqIE1hdGguc2luKGxhdCAvIDEyLjAgKiB0aGlzLmJkc1V0aWxzLlBJKSArIDMyMCAqIE1hdGguc2luKGxhdCAqIHRoaXMuYmRzVXRpbHMuUEkgLyAzMC4wKSkgKiAyLjAgLyAzLjA7XHJcbiAgICByZXR1cm4gcmV0XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiDnmb7luqblnZDmoIfns7sgKEJELTA5KSDkuI4g54Gr5pif5Z2Q5qCH57O7IChHQ0otMDIp55qE6L2s5o2iIC8g5Y2z55m+5bqm6L2s6LC35q2M44CB6auY5b63XHJcbiAgICogQHBhcmFtIGJkX2xvblxyXG4gICAqIEBwYXJhbSBiZF9sYXRcclxuICAgKi9cclxuICBiZDA5dG9nY2owMihiZF9sb24sIGJkX2xhdCkge1xyXG4gICAgY29uc3QgeCA9IGJkX2xvbiAtIDAuMDA2NTtcclxuICAgIGNvbnN0IHkgPSBiZF9sYXQgLSAwLjAwNjtcclxuICAgIGNvbnN0IHogPSBNYXRoLnNxcnQoeCAqIHggKyB5ICogeSkgLSAwLjAwMDAyICogTWF0aC5zaW4oeSAqIHRoaXMuYmRzVXRpbHMueF9QSSk7XHJcbiAgICBjb25zdCB0aGV0YSA9IE1hdGguYXRhbjIoeSwgeCkgLSAwLjAwMDAwMyAqIE1hdGguY29zKHggKiB0aGlzLmJkc1V0aWxzLnhfUEkpO1xyXG4gICAgY29uc3QgZ2dfbG5nID0geiAqIE1hdGguY29zKHRoZXRhKTtcclxuICAgIGNvbnN0IGdnX2xhdCA9IHogKiBNYXRoLnNpbih0aGV0YSk7XHJcbiAgICByZXR1cm4gW2dnX2xuZywgZ2dfbGF0XTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIOeBq+aYn+WdkOagh+ezuyAoR0NKLTAyKSDkuI7nmb7luqblnZDmoIfns7sgKEJELTA5KSDnmoTovazmjaIgLyDljbPosLfmrYzjgIHpq5jlvrcg6L2sIOeZvuW6plxyXG4gICAqIEBwYXJhbSBsbmdcclxuICAgKiBAcGFyYW0gbGF0XHJcbiAgICovXHJcbiAgZ2NqMDJ0b2JkMDkobG5nLCBsYXQpIHtcclxuICAgIGNvbnN0IHogPSBNYXRoLnNxcnQobG5nICogbG5nICsgbGF0ICogbGF0KSArIDAuMDAwMDIgKiBNYXRoLnNpbihsYXQgKiB0aGlzLmJkc1V0aWxzLnhfUEkpO1xyXG4gICAgY29uc3QgdGhldGEgPSBNYXRoLmF0YW4yKGxhdCwgbG5nKSArIDAuMDAwMDAzICogTWF0aC5jb3MobG5nICogdGhpcy5iZHNVdGlscy54X1BJKTtcclxuICAgIGNvbnN0IGJkX2xuZyA9IHogKiBNYXRoLmNvcyh0aGV0YSkgKyAwLjAwNjU7XHJcbiAgICBjb25zdCBiZF9sYXQgPSB6ICogTWF0aC5zaW4odGhldGEpICsgMC4wMDY7XHJcbiAgICByZXR1cm4gW2JkX2xuZywgYmRfbGF0XTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFdHUzg05Z2Q5qCH57O76L2s54Gr5pif5Z2Q5qCH57O7R0NqMDIgLyDljbNXR1M4NCDovazosLfmrYzjgIHpq5jlvrdcclxuICAgKiBAcGFyYW0gbG5nXHJcbiAgICogQHBhcmFtIGxhdFxyXG4gICAqL1xyXG4gIHdnczg0dG9nY2owMihsbmcsIGxhdCkge1xyXG4gICAgaWYgKHRoaXMub3V0T2ZDaGluYShsbmcsIGxhdCkpIHtcclxuICAgICAgcmV0dXJuIFtsbmcsIGxhdF1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBkbGF0ID0gdGhpcy50cmFuc2Zvcm1sYXQobG5nIC0gMTA1LjAsIGxhdCAtIDM1LjApO1xyXG4gICAgICBsZXQgZGxuZyA9IHRoaXMudHJhbnNmb3JtbG5nKGxuZyAtIDEwNS4wLCBsYXQgLSAzNS4wKTtcclxuICAgICAgY29uc3QgcmFkbGF0ID0gbGF0IC8gMTgwLjAgKiB0aGlzLmJkc1V0aWxzLlBJO1xyXG4gICAgICBsZXQgbWFnaWMgPSBNYXRoLnNpbihyYWRsYXQpO1xyXG4gICAgICBtYWdpYyA9IDEgLSB0aGlzLmJkc1V0aWxzLmVlICogbWFnaWMgKiBtYWdpYztcclxuICAgICAgY29uc3Qgc3FydG1hZ2ljID0gTWF0aC5zcXJ0KG1hZ2ljKTtcclxuICAgICAgZGxhdCA9IChkbGF0ICogMTgwLjApIC8gKCh0aGlzLmJkc1V0aWxzLmEgKiAoMSAtIHRoaXMuYmRzVXRpbHMuZWUpKSAvIChtYWdpYyAqIHNxcnRtYWdpYykgKiB0aGlzLmJkc1V0aWxzLlBJKTtcclxuICAgICAgZGxuZyA9IChkbG5nICogMTgwLjApIC8gKHRoaXMuYmRzVXRpbHMuYSAvIHNxcnRtYWdpYyAqIE1hdGguY29zKHJhZGxhdCkgKiB0aGlzLmJkc1V0aWxzLlBJKTtcclxuICAgICAgY29uc3QgbWdsYXQgPSBsYXQgKyBkbGF0O1xyXG4gICAgICBjb25zdCBtZ2xuZyA9IGxuZyArIGRsbmc7XHJcbiAgICAgIHJldHVybiBbbWdsbmcsIG1nbGF0XTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdDSjAy77yI54Gr5pif5Z2Q5qCH57O777yJIOi9rOaNouS4uiBXR1M4NCAvIOWNs+iwt+atjOmrmOW+t+i9rFdHUzg0XHJcbiAgICogQHBhcmFtIGxuZ1xyXG4gICAqIEBwYXJhbSBsYXRcclxuICAgKi9cclxuICBnY2owMnRvd2dzODQobG5nLCBsYXQpIHtcclxuICAgIGlmICh0aGlzLm91dE9mQ2hpbmEobG5nLCBsYXQpKSB7XHJcbiAgICAgIHJldHVybiBbbG5nLCBsYXRdXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgZGxhdCA9IHRoaXMudHJhbnNmb3JtbGF0KGxuZyAtIDEwNS4wLCBsYXQgLSAzNS4wKTtcclxuICAgICAgbGV0IGRsbmcgPSB0aGlzLnRyYW5zZm9ybWxuZyhsbmcgLSAxMDUuMCwgbGF0IC0gMzUuMCk7XHJcbiAgICAgIGNvbnN0IHJhZGxhdCA9IGxhdCAvIDE4MC4wICogdGhpcy5iZHNVdGlscy5QSTtcclxuICAgICAgbGV0IG1hZ2ljID0gTWF0aC5zaW4ocmFkbGF0KTtcclxuICAgICAgbWFnaWMgPSAxIC0gdGhpcy5iZHNVdGlscy5lZSAqIG1hZ2ljICogbWFnaWM7XHJcbiAgICAgIGNvbnN0IHNxcnRtYWdpYyA9IE1hdGguc3FydChtYWdpYyk7XHJcbiAgICAgIGRsYXQgPSAoZGxhdCAqIDE4MC4wKSAvICgodGhpcy5iZHNVdGlscy5hICogKDEgLSB0aGlzLmJkc1V0aWxzLmVlKSkgLyAobWFnaWMgKiBzcXJ0bWFnaWMpICogdGhpcy5iZHNVdGlscy5QSSk7XHJcbiAgICAgIGRsbmcgPSAoZGxuZyAqIDE4MC4wKSAvICh0aGlzLmJkc1V0aWxzLmEgLyBzcXJ0bWFnaWMgKiBNYXRoLmNvcyhyYWRsYXQpICogdGhpcy5iZHNVdGlscy5QSSk7XHJcbiAgICAgIGNvbnN0IG1nbGF0ID0gbGF0ICsgZGxhdDtcclxuICAgICAgY29uc3QgbWdsbmcgPSBsbmcgKyBkbG5nO1xyXG4gICAgICByZXR1cm4gW2xuZyAqIDIgLSBtZ2xuZywgbGF0ICogMiAtIG1nbGF0XTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIOeZvuW6puWdkOagh+ezu+i9rHdnczg05Z2Q5qCH57O7XHJcbiAgICogQHBhcmFtIGxuZ1xyXG4gICAqIEBwYXJhbSBsYXRcclxuICAgKi9cclxuICBiZDA5dG93Z3M4NChsbmcsIGxhdCkge1xyXG4gICAgLy8g55m+5bqm5Z2Q5qCH57O75YWI6L2s5Li654Gr5pif5Z2Q5qCH57O7XHJcbiAgICBjb25zdCBnY2owMiA9IHRoaXMuYmQwOXRvZ2NqMDIobG5nLCBsYXQpO1xyXG4gICAgLy8g54Gr5pif5Z2Q5qCH57O76L2sd2dzODTlnZDmoIfns7tcclxuICAgIHJldHVybiB0aGlzLmdjajAydG93Z3M4NChnY2owMlswXSwgZ2NqMDJbMV0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogd2dzODTlnZDmoIfns7vovaznmb7luqblnZDmoIfns7tcclxuICAgKiBAcGFyYW0gbG5nXHJcbiAgICogQHBhcmFtIGxhdFxyXG4gICAqL1xyXG4gIHdnczg0dG9iZDA5KGxuZywgbGF0KSB7XHJcbiAgICAvLyB3Z3M4NOWFiOi9rOS4uueBq+aYn+WdkOagh+ezu1xyXG4gICAgY29uc3QgZ2NqMDIgPSB0aGlzLndnczg0dG9nY2owMihsbmcsIGxhdCk7XHJcbiAgICAvLyDngavmmJ/lnZDmoIfns7vovaznmb7luqblnZDmoIfns7tcclxuICAgIHJldHVybiB0aGlzLmdjajAydG9iZDA5KGdjajAyWzBdLCBnY2owMlsxXSk7XHJcbiAgfVxyXG59XHJcblxyXG5cclxuLy8g5Z2Q5qCH57O75p6a5Li+XHJcbmV4cG9ydCBlbnVtIFRZUEVfRU5VTSB7XHJcbiAgR0NKMDIgPSAnZ2NqMDInLCAvLyDngavmmJ/lnZDmoIfns7tcclxuICBCRDA5ID0gJ2JkMDknLCAvLyDnmb7luqblnZDmoIfns7tcclxuICBXR1M4NCA9ICd3Z3M4NCcgIC8vIFdHUzg05Z2Q5qCH57O7XHJcbn1cclxuIl19