text-to-map
Version:
Text To Map usiluje o lepší, strojově zpracovatelné využití částí vyhlášek s výčtem ulic a dalších lokací. Jde o rozšiřitelnou sadu konceptů a nástrojů, které zajistí hladký převod výčtu ulic a jejich rozsahů v lidsky srozumitelném jazyce do strojově zpra
82 lines • 14.7 kB
JavaScript
import { roundToNDecimalPlaces } from "./helpers";
/**
* Convert JTSK to WGS84 - taken from @arodax/jtsk2wgs84 package that had some
* import issues.
*
* @param x
* @param y
* @param h
* @return {{jtsk_x: number, jtsk_y: number, lon: number, lat: number, altitude: number}}
*/
export default function jtsk2wgs84(x, y, h = 200) {
const originalX = x;
const originalY = y;
let a = 6377397.15508;
let e = 0.081696831215303;
let n = 0.97992470462083;
let uRo = 12310230.12797036;
let sinUQ = 0.863499969506341;
let cosUQ = 0.504348889819882;
let sinVQ = 0.420215144586493;
let cosVQ = 0.907424504992097;
let alpha = 1.000597498371542;
let k = 1.003419163966575;
let ro = Math.sqrt(x * x + y * y);
let epsilon = 2 * Math.atan(y / (ro + x));
let D = epsilon / n;
let S = 2 * Math.atan(Math.exp((1 / n) * Math.log(uRo / ro))) - Math.PI / 2;
let sinS = Math.sin(S);
let cosS = Math.cos(S);
let sinU = sinUQ * sinS - cosUQ * cosS * Math.cos(D);
let cosU = Math.sqrt(1 - sinU * sinU);
let sinDV = (Math.sin(D) * cosS) / cosU;
let cosDV = Math.sqrt(1 - sinDV * sinDV);
let sinV = sinVQ * cosDV - cosVQ * sinDV;
let cosV = cosVQ * cosDV + sinVQ * sinDV;
let lJtsk = (2 * Math.atan(sinV / (1 + cosV))) / alpha;
let t = Math.exp((2 / alpha) * Math.log((1 + sinU) / cosU / k));
let pom = (t - 1) / (t + 1);
let sinB = pom;
do {
sinB = pom;
pom = t * Math.exp(e * Math.log((1 + e * sinB) / (1 - e * sinB)));
pom = (pom - 1) / (pom + 1);
} while (Math.abs(pom - sinB) > 1e-15);
let bJtsk = Math.atan(pom / Math.sqrt(1 - pom * pom));
let f1 = 299.152812853;
let e2 = 1 - (1 - 1 / f1) * (1 - 1 / f1);
ro = a / Math.sqrt(1 - e2 * Math.sin(bJtsk) * Math.sin(bJtsk));
x = (ro + h) * Math.cos(bJtsk) * Math.cos(lJtsk);
y = (ro + h) * Math.cos(bJtsk) * Math.sin(lJtsk);
let z = ((1 - e2) * ro + h) * Math.sin(bJtsk);
let dx = 570.69;
let dy = 85.69;
let dz = 462.84;
let wz = ((-5.2611 / 3600) * Math.PI) / 180;
let wy = ((-1.58676 / 3600) * Math.PI) / 180;
let wx = ((-4.99821 / 3600) * Math.PI) / 180;
let m = 3.543e-6;
let xn = dx + (1 + m) * (x + wz * y - wy * z);
let yn = dy + (1 + m) * (-wz * x + y + wx * z);
let zn = dz + (1 + m) * (wy * x - wx * y + z);
a = 6378137.0;
f1 = 298.257223563;
let aB = f1 / (f1 - 1);
let p = Math.sqrt(xn * xn + yn * yn);
e2 = 1 - (1 - 1 / f1) * (1 - 1 / f1);
let theta = Math.atan((zn * aB) / p);
let st = Math.sin(theta);
let ct = Math.cos(theta);
t = (zn + e2 * aB * a * st * st * st) / (p - e2 * a * ct * ct * ct);
let B = Math.atan(t);
let L = 2 * Math.atan(yn / (p + xn));
h = Math.sqrt(1 + t * t) * (p - a / Math.sqrt(1 + (1 - e2) * t * t));
return {
jtsk_x: originalX,
jtsk_y: originalY,
lat: roundToNDecimalPlaces((B / Math.PI) * 180, 6),
lon: roundToNDecimalPlaces((L / Math.PI) * 180, 6),
altitude: Math.round(h * 100) / 100,
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianRzazJ3Z3M4NC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9qdHNrMndnczg0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQVVsRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sQ0FBQyxPQUFPLFVBQVUsVUFBVSxDQUNoQyxDQUFTLEVBQ1QsQ0FBUyxFQUNULElBQVksR0FBRztJQUVmLE1BQU0sU0FBUyxHQUFHLENBQUMsQ0FBQztJQUNwQixNQUFNLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFFcEIsSUFBSSxDQUFDLEdBQUcsYUFBYSxDQUFDO0lBQ3RCLElBQUksQ0FBQyxHQUFHLGlCQUFpQixDQUFDO0lBQzFCLElBQUksQ0FBQyxHQUFHLGdCQUFnQixDQUFDO0lBQ3pCLElBQUksR0FBRyxHQUFHLGlCQUFpQixDQUFDO0lBQzVCLElBQUksS0FBSyxHQUFHLGlCQUFpQixDQUFDO0lBQzlCLElBQUksS0FBSyxHQUFHLGlCQUFpQixDQUFDO0lBQzlCLElBQUksS0FBSyxHQUFHLGlCQUFpQixDQUFDO0lBQzlCLElBQUksS0FBSyxHQUFHLGlCQUFpQixDQUFDO0lBQzlCLElBQUksS0FBSyxHQUFHLGlCQUFpQixDQUFDO0lBQzlCLElBQUksQ0FBQyxHQUFHLGlCQUFpQixDQUFDO0lBRTFCLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDbEMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUMsSUFBSSxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQztJQUNwQixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUM1RSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkIsSUFBSSxJQUFJLEdBQUcsS0FBSyxHQUFHLElBQUksR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckQsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ3RDLElBQUksS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDeEMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDO0lBQ3pDLElBQUksSUFBSSxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUN6QyxJQUFJLElBQUksR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDekMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUN2RCxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFFNUIsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDO0lBRWYsR0FBRztRQUNELElBQUksR0FBRyxHQUFHLENBQUM7UUFDWCxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEUsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0tBQzdCLFFBQVEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsS0FBSyxFQUFFO0lBRXZDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBRXRELElBQUksRUFBRSxHQUFHLGFBQWEsQ0FBQztJQUN2QixJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUN6QyxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUMvRCxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pELENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUU5QyxJQUFJLEVBQUUsR0FBRyxNQUFNLENBQUM7SUFDaEIsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDO0lBQ2YsSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDO0lBQ2hCLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQzVDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQzdDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQzdDLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQztJQUNqQixJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDOUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDL0MsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBRTlDLENBQUMsR0FBRyxTQUFTLENBQUM7SUFDZCxFQUFFLEdBQUcsYUFBYSxDQUFDO0lBQ25CLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN2QixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3JDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUNyQyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3JDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDekIsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6QixDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDcEUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyQixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNyQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVyRSxPQUFPO1FBQ0wsTUFBTSxFQUFFLFNBQVM7UUFDakIsTUFBTSxFQUFFLFNBQVM7UUFDakIsR0FBRyxFQUFFLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELEdBQUcsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNsRCxRQUFRLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRztLQUNwQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJvdW5kVG9ORGVjaW1hbFBsYWNlcyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ29udmVyc2lvblJlc3VsdCB7XHJcbiAganRza194OiBudW1iZXI7XHJcbiAganRza195OiBudW1iZXI7XHJcbiAgbGF0OiBudW1iZXI7XHJcbiAgbG9uOiBudW1iZXI7XHJcbiAgYWx0aXR1ZGU6IG51bWJlcjtcclxufVxyXG5cclxuLyoqXHJcbiAqIENvbnZlcnQgSlRTSyB0byBXR1M4NCAtIHRha2VuIGZyb20gQGFyb2RheC9qdHNrMndnczg0IHBhY2thZ2UgdGhhdCBoYWQgc29tZVxyXG4gKiBpbXBvcnQgaXNzdWVzLlxyXG4gKlxyXG4gKiBAcGFyYW0geFxyXG4gKiBAcGFyYW0geVxyXG4gKiBAcGFyYW0gaFxyXG4gKiBAcmV0dXJuIHt7anRza194OiBudW1iZXIsIGp0c2tfeTogbnVtYmVyLCBsb246IG51bWJlciwgbGF0OiBudW1iZXIsIGFsdGl0dWRlOiBudW1iZXJ9fVxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ganRzazJ3Z3M4NChcclxuICB4OiBudW1iZXIsXHJcbiAgeTogbnVtYmVyLFxyXG4gIGg6IG51bWJlciA9IDIwMFxyXG4pOiBDb252ZXJzaW9uUmVzdWx0IHtcclxuICBjb25zdCBvcmlnaW5hbFggPSB4O1xyXG4gIGNvbnN0IG9yaWdpbmFsWSA9IHk7XHJcblxyXG4gIGxldCBhID0gNjM3NzM5Ny4xNTUwODtcclxuICBsZXQgZSA9IDAuMDgxNjk2ODMxMjE1MzAzO1xyXG4gIGxldCBuID0gMC45Nzk5MjQ3MDQ2MjA4MztcclxuICBsZXQgdVJvID0gMTIzMTAyMzAuMTI3OTcwMzY7XHJcbiAgbGV0IHNpblVRID0gMC44NjM0OTk5Njk1MDYzNDE7XHJcbiAgbGV0IGNvc1VRID0gMC41MDQzNDg4ODk4MTk4ODI7XHJcbiAgbGV0IHNpblZRID0gMC40MjAyMTUxNDQ1ODY0OTM7XHJcbiAgbGV0IGNvc1ZRID0gMC45MDc0MjQ1MDQ5OTIwOTc7XHJcbiAgbGV0IGFscGhhID0gMS4wMDA1OTc0OTgzNzE1NDI7XHJcbiAgbGV0IGsgPSAxLjAwMzQxOTE2Mzk2NjU3NTtcclxuXHJcbiAgbGV0IHJvID0gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkpO1xyXG4gIGxldCBlcHNpbG9uID0gMiAqIE1hdGguYXRhbih5IC8gKHJvICsgeCkpO1xyXG4gIGxldCBEID0gZXBzaWxvbiAvIG47XHJcbiAgbGV0IFMgPSAyICogTWF0aC5hdGFuKE1hdGguZXhwKCgxIC8gbikgKiBNYXRoLmxvZyh1Um8gLyBybykpKSAtIE1hdGguUEkgLyAyO1xyXG4gIGxldCBzaW5TID0gTWF0aC5zaW4oUyk7XHJcbiAgbGV0IGNvc1MgPSBNYXRoLmNvcyhTKTtcclxuICBsZXQgc2luVSA9IHNpblVRICogc2luUyAtIGNvc1VRICogY29zUyAqIE1hdGguY29zKEQpO1xyXG4gIGxldCBjb3NVID0gTWF0aC5zcXJ0KDEgLSBzaW5VICogc2luVSk7XHJcbiAgbGV0IHNpbkRWID0gKE1hdGguc2luKEQpICogY29zUykgLyBjb3NVO1xyXG4gIGxldCBjb3NEViA9IE1hdGguc3FydCgxIC0gc2luRFYgKiBzaW5EVik7XHJcbiAgbGV0IHNpblYgPSBzaW5WUSAqIGNvc0RWIC0gY29zVlEgKiBzaW5EVjtcclxuICBsZXQgY29zViA9IGNvc1ZRICogY29zRFYgKyBzaW5WUSAqIHNpbkRWO1xyXG4gIGxldCBsSnRzayA9ICgyICogTWF0aC5hdGFuKHNpblYgLyAoMSArIGNvc1YpKSkgLyBhbHBoYTtcclxuICBsZXQgdCA9IE1hdGguZXhwKCgyIC8gYWxwaGEpICogTWF0aC5sb2coKDEgKyBzaW5VKSAvIGNvc1UgLyBrKSk7XHJcbiAgbGV0IHBvbSA9ICh0IC0gMSkgLyAodCArIDEpO1xyXG5cclxuICBsZXQgc2luQiA9IHBvbTtcclxuXHJcbiAgZG8ge1xyXG4gICAgc2luQiA9IHBvbTtcclxuICAgIHBvbSA9IHQgKiBNYXRoLmV4cChlICogTWF0aC5sb2coKDEgKyBlICogc2luQikgLyAoMSAtIGUgKiBzaW5CKSkpO1xyXG4gICAgcG9tID0gKHBvbSAtIDEpIC8gKHBvbSArIDEpO1xyXG4gIH0gd2hpbGUgKE1hdGguYWJzKHBvbSAtIHNpbkIpID4gMWUtMTUpO1xyXG5cclxuICBsZXQgYkp0c2sgPSBNYXRoLmF0YW4ocG9tIC8gTWF0aC5zcXJ0KDEgLSBwb20gKiBwb20pKTtcclxuXHJcbiAgbGV0IGYxID0gMjk5LjE1MjgxMjg1MztcclxuICBsZXQgZTIgPSAxIC0gKDEgLSAxIC8gZjEpICogKDEgLSAxIC8gZjEpO1xyXG4gIHJvID0gYSAvIE1hdGguc3FydCgxIC0gZTIgKiBNYXRoLnNpbihiSnRzaykgKiBNYXRoLnNpbihiSnRzaykpO1xyXG4gIHggPSAocm8gKyBoKSAqIE1hdGguY29zKGJKdHNrKSAqIE1hdGguY29zKGxKdHNrKTtcclxuICB5ID0gKHJvICsgaCkgKiBNYXRoLmNvcyhiSnRzaykgKiBNYXRoLnNpbihsSnRzayk7XHJcbiAgbGV0IHogPSAoKDEgLSBlMikgKiBybyArIGgpICogTWF0aC5zaW4oYkp0c2spO1xyXG5cclxuICBsZXQgZHggPSA1NzAuNjk7XHJcbiAgbGV0IGR5ID0gODUuNjk7XHJcbiAgbGV0IGR6ID0gNDYyLjg0O1xyXG4gIGxldCB3eiA9ICgoLTUuMjYxMSAvIDM2MDApICogTWF0aC5QSSkgLyAxODA7XHJcbiAgbGV0IHd5ID0gKCgtMS41ODY3NiAvIDM2MDApICogTWF0aC5QSSkgLyAxODA7XHJcbiAgbGV0IHd4ID0gKCgtNC45OTgyMSAvIDM2MDApICogTWF0aC5QSSkgLyAxODA7XHJcbiAgbGV0IG0gPSAzLjU0M2UtNjtcclxuICBsZXQgeG4gPSBkeCArICgxICsgbSkgKiAoeCArIHd6ICogeSAtIHd5ICogeik7XHJcbiAgbGV0IHluID0gZHkgKyAoMSArIG0pICogKC13eiAqIHggKyB5ICsgd3ggKiB6KTtcclxuICBsZXQgem4gPSBkeiArICgxICsgbSkgKiAod3kgKiB4IC0gd3ggKiB5ICsgeik7XHJcblxyXG4gIGEgPSA2Mzc4MTM3LjA7XHJcbiAgZjEgPSAyOTguMjU3MjIzNTYzO1xyXG4gIGxldCBhQiA9IGYxIC8gKGYxIC0gMSk7XHJcbiAgbGV0IHAgPSBNYXRoLnNxcnQoeG4gKiB4biArIHluICogeW4pO1xyXG4gIGUyID0gMSAtICgxIC0gMSAvIGYxKSAqICgxIC0gMSAvIGYxKTtcclxuICBsZXQgdGhldGEgPSBNYXRoLmF0YW4oKHpuICogYUIpIC8gcCk7XHJcbiAgbGV0IHN0ID0gTWF0aC5zaW4odGhldGEpO1xyXG4gIGxldCBjdCA9IE1hdGguY29zKHRoZXRhKTtcclxuICB0ID0gKHpuICsgZTIgKiBhQiAqIGEgKiBzdCAqIHN0ICogc3QpIC8gKHAgLSBlMiAqIGEgKiBjdCAqIGN0ICogY3QpO1xyXG4gIGxldCBCID0gTWF0aC5hdGFuKHQpO1xyXG4gIGxldCBMID0gMiAqIE1hdGguYXRhbih5biAvIChwICsgeG4pKTtcclxuICBoID0gTWF0aC5zcXJ0KDEgKyB0ICogdCkgKiAocCAtIGEgLyBNYXRoLnNxcnQoMSArICgxIC0gZTIpICogdCAqIHQpKTtcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIGp0c2tfeDogb3JpZ2luYWxYLFxyXG4gICAganRza195OiBvcmlnaW5hbFksXHJcbiAgICBsYXQ6IHJvdW5kVG9ORGVjaW1hbFBsYWNlcygoQiAvIE1hdGguUEkpICogMTgwLCA2KSxcclxuICAgIGxvbjogcm91bmRUb05EZWNpbWFsUGxhY2VzKChMIC8gTWF0aC5QSSkgKiAxODAsIDYpLFxyXG4gICAgYWx0aXR1ZGU6IE1hdGgucm91bmQoaCAqIDEwMCkgLyAxMDAsXHJcbiAgfTtcclxufVxyXG4iXX0=