lucy-calendar
Version:
LucyCalendar is a powerful and flexible date picker library for Angular applications, specifically designed for Ethiopian dates. It provides a user-friendly interface for selecting dates and supports various customization options to fit your needs.
110 lines • 21.2 kB
JavaScript
var EpochOffset;
(function (EpochOffset) {
EpochOffset[EpochOffset["AmeteAlem"] = -285019] = "AmeteAlem";
EpochOffset[EpochOffset["AmeteMihret"] = 1723856] = "AmeteMihret";
EpochOffset[EpochOffset["Coptic"] = 1824665] = "Coptic";
EpochOffset[EpochOffset["Gregorian"] = 1721426] = "Gregorian";
EpochOffset[EpochOffset["Unset"] = -1] = "Unset";
})(EpochOffset || (EpochOffset = {}));
const nMonths = 12;
const monthDays = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
const JD_EPOCH_OFFSET_AMETE_ALEM = -285019; // ዓ/ዓ
const JD_EPOCH_OFFSET_AMETE_MIHRET = 1723856; // ዓ/ም
const JD_EPOCH_OFFSET_COPTIC = 1824665;
const JD_EPOCH_OFFSET_GREGORIAN = 1721426;
export const monthNames = [
"መስከረም", "ጥቅምት", "ህዳር", "ታህሳስ", "ጥር", "የካቲት",
"መጋቢት", "ሚይዚያ", "ግንቦት", "ሰኔ", "ሐምሌ", "ነሐሴ", "ጳጉሜ"
];
export const dayNames = ["እሁድ", "ሰኞ", "ማክሰኞ", "ረቡዕ", "ሐሙስ", "ዓርብ", "ቅዳሜ"];
export function toGregorian(param) {
const { year, month, day } = param;
const era = year <= 0 ? JD_EPOCH_OFFSET_AMETE_ALEM : JD_EPOCH_OFFSET_AMETE_MIHRET;
let jdn = EthiopicToJdn({ year: param.year, month: param.month, day: param.day, era });
const date = JdnToGregorian(jdn);
return new Date(Date.UTC(date[0], date[1] - 1, date[2]));
}
export function toEthiopian(gcDate) {
const jdn = GregorianToJdn(gcDate.getFullYear(), gcDate.getMonth() + 1, gcDate.getDate());
return JdnToEthiopic(jdn, GuessEraFromJDN(jdn));
}
function Quotient(i, j) {
return Math.floor(i / j);
}
function Mod(i, j) {
return i - j * Quotient(i, j);
}
function GuessEraFromJDN(jdn) {
return (jdn >= (JD_EPOCH_OFFSET_AMETE_MIHRET + 365)) ? JD_EPOCH_OFFSET_AMETE_MIHRET : JD_EPOCH_OFFSET_AMETE_ALEM;
}
export function isEthiopianLeapYear(year) {
return year % 4 === 3; // Ethiopian leap years are multiples of 4 with a remainder of 3
}
function IsGregorianLeap(year) {
return (year % 4 === 0) && ((year % 100 !== 0) || (year % 400 === 0));
}
function GregorianToJdn(year, month, day) {
const s = Quotient(year, 4) - Quotient(year - 1, 4) - Quotient(year, 100) + Quotient(year - 1, 100) + Quotient(year, 400) - Quotient(year - 1, 400);
const t = Quotient(14 - month, 12);
const n = 31 * t * (month - 1) + (1 - t) * (59 + s + 30 * (month - 3) + Quotient((3 * month - 7), 5)) + day - 1;
const j = JD_EPOCH_OFFSET_GREGORIAN + 365 * (year - 1) + Quotient(year - 1, 4) - Quotient(year - 1, 100) + Quotient(year - 1, 400) + n;
return j;
}
function JdnToEthiopic(jdn, era) {
era = era ?? GuessEraFromJDN(jdn);
const r = Mod((jdn - era), 1461);
const n = Mod(r, 365) + 365 * Quotient(r, 1460);
const year = 4 * Quotient((jdn - era), 1461) + Quotient(r, 365) - Quotient(r, 1460);
;
const month = Quotient(n, 30) + 1;
const day = Mod(n, 30) + 1;
return { year, month: Number(month), day: Number(day) };
}
function EthCopticToJdn(year, month, day, era) {
return (era + 365) + 365 * (year - 1) + Quotient(year, 4) + 30 * month + day - 31;
}
function JdnToGregorian(j) {
const r2000 = Mod((j - JD_EPOCH_OFFSET_GREGORIAN), 730485);
const r400 = Mod((j - JD_EPOCH_OFFSET_GREGORIAN), 146097);
const r100 = Mod(r400, 36524);
const r4 = Mod(r100, 1461);
let n = Mod(r4, 365) + 365 * Quotient(r4, 1460);
const s = Quotient(r4, 1095);
const aprime = 400 * Quotient((j - JD_EPOCH_OFFSET_GREGORIAN), 146097) + 100 * Quotient(r400, 36524) + 4 * Quotient(r100, 1461) + Quotient(r4, 365) - Quotient(r4, 1460) - Quotient(r2000, 730484);
;
const year = aprime + 1;
const t = Quotient((364 + s - n), 306);
const month = t * (Quotient(n, 31) + 1) + (1 - t) * (Quotient((5 * (n - s) + 13), 153) + 1);
n += 1 - Quotient(r2000, 730484);
let day = n;
if ((r100 == 0) && (n == 0) && (r400 != 0)) {
let month = 12;
day = 31;
}
else {
monthDays[2] = (IsGregorianLeap(year)) ? 29 : 28;
for (let i = 1; i <= nMonths; ++i) {
if (n <= monthDays[i]) {
day = n;
break;
}
n -= monthDays[i];
}
}
return [year, month, day];
}
function EthiopicToJdn(param) {
return EthCopticToJdn(param.year, param.month, param.day, param.era);
}
function CopticToGregorian(year, month, day) {
let jdn = EthiopicToJdn({ year, month, day, era: JD_EPOCH_OFFSET_COPTIC });
return JdnToGregorian(jdn);
}
function GregorianToCoptic(year, month, day) {
let jdn = GregorianToJdn(year, month, day);
return JdnToEthiopic(jdn, JD_EPOCH_OFFSET_COPTIC);
}
function CopticToJdn(year, month, day) {
return EthCopticToJdn(year, month, day, JD_EPOCH_OFFSET_COPTIC);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1jb252ZXJ0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9sdWN5LWNhbGVuZGFyL3NyYy9saWIvZGF0ZS1jb252ZXJ0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsSUFBSyxXQU1KO0FBTkQsV0FBSyxXQUFXO0lBQ1osNkRBQW1CLENBQUE7SUFDbkIsaUVBQXFCLENBQUE7SUFDckIsdURBQWdCLENBQUE7SUFDaEIsNkRBQW1CLENBQUE7SUFDbkIsZ0RBQVUsQ0FBQTtBQUNkLENBQUMsRUFOSSxXQUFXLEtBQVgsV0FBVyxRQU1mO0FBQ0QsTUFBTSxPQUFPLEdBQVcsRUFBRSxDQUFDO0FBRTNCLE1BQU0sU0FBUyxHQUFhLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDaEYsTUFBTSwwQkFBMEIsR0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU07QUFDMUQsTUFBTSw0QkFBNEIsR0FBVyxPQUFPLENBQUMsQ0FBQyxNQUFNO0FBQzVELE1BQU0sc0JBQXNCLEdBQVcsT0FBTyxDQUFDO0FBQy9DLE1BQU0seUJBQXlCLEdBQVcsT0FBTyxDQUFDO0FBRWxELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBYTtJQUNoQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU07SUFDNUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSztDQUNwRCxDQUFDO0FBQ0YsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFhLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxF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LFFBQVEsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFFckMsTUFBTSxNQUFNLEdBQVcsR0FBRyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyx5QkFBeUIsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxHQUFHLEdBQUcsR0FBRyxRQUFRLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQUEsQ0FBQztJQUM1TSxNQUFNLElBQUksR0FBVyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ2hDLE1BQU0sQ0FBQyxHQUFXLFFBQVEsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDL0MsTUFBTSxLQUFLLEdBQVcsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUVwRyxDQUFDLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDakMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBRVosSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3pDLElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNmLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFDYixDQUFDO1NBQ0ksQ0FBQztRQUNGLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNqRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksT0FBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BCLEdBQUcsR0FBRyxDQUFDLENBQUM7Z0JBQ1IsTUFBTTtZQUNWLENBQUM7WUFDRCxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLENBQUM7SUFDTCxDQUFDO0lBRUQsT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDOUIsQ0FBQztBQUVELFNBQVMsYUFBYSxDQUFDLEtBQWdFO0lBQ25GLE9BQU8sY0FBYyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN6RSxDQUFDO0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxJQUFZLEVBQUUsS0FBYSxFQUFFLEdBQVc7SUFDL0QsSUFBSSxHQUFHLEdBQUcsYUFBYSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLHNCQUFzQixFQUFFLENBQUMsQ0FBQztJQUMzRSxPQUFPLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMvQixDQUFDO0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxJQUFZLEVBQUUsS0FBYSxFQUFFLEdBQVc7SUFDL0QsSUFBSSxHQUFHLEdBQUcsY0FBYyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDM0MsT0FBTyxhQUFhLENBQUMsR0FBRyxFQUFFLHNCQUFzQixDQUFDLENBQUM7QUFDdEQsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLElBQVksRUFBRSxLQUFhLEVBQUUsR0FBVztJQUN6RCxPQUFPLGNBQWMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO0FBQ3BFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcbmVudW0gRXBvY2hPZmZzZXQge1xyXG4gICAgQW1ldGVBbGVtID0gLTI4NTAxOSxcclxuICAgIEFtZXRlTWlocmV0ID0gMTcyMzg1NixcclxuICAgIENvcHRpYyA9IDE4MjQ2NjUsXHJcbiAgICBHcmVnb3JpYW4gPSAxNzIxNDI2LFxyXG4gICAgVW5zZXQgPSAtMVxyXG59XHJcbmNvbnN0IG5Nb250aHM6IG51bWJlciA9IDEyO1xyXG5cclxuY29uc3QgbW9udGhEYXlzOiBudW1iZXJbXSA9IFswLCAzMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxXTtcclxuY29uc3QgSkRfRVBPQ0hfT0ZGU0VUX0FNRVRFX0FMRU06IG51bWJlciA9IC0yODUwMTk7IC8vIOGLky/hi5NcclxuY29uc3QgSkRfRVBPQ0hfT0ZGU0VUX0FNRVRFX01JSFJFVDogbnVtYmVyID0gMTcyMzg1NjsgLy8g4YuTL+GInVxyXG5jb25zdCBKRF9FUE9DSF9PRkZTRVRfQ09QVElDOiBudW1iZXIgPSAxODI0NjY1O1xyXG5jb25zdCBKRF9FUE9DSF9PRkZTRVRfR1JFR09SSUFOOiBudW1iZXIgPSAxNzIxNDI2O1xyXG5cclxuZXhwb3J0IGNvbnN0IG1vbnRoTmFtZXM6IHN0cmluZ1tdID0gW1xyXG4gICAgXCLhiJjhiLXhiqjhiKjhiJ1cIiwgXCLhjKXhiYXhiJ3hibVcIiwgXCLhiIXhi7PhiK1cIiwgXCLhibPhiIXhiLPhiLVcIiwgXCLhjKXhiK1cIiwgXCLhi6jhiqvhibLhibVcIixcclxuICAgIFwi4YiY4YyL4Ymi4Ym1XCIsIFwi4Yia4Yut4Yua4YurXCIsIFwi4YyN4YqV4Ymm4Ym1XCIsIFwi4Yiw4YqUXCIsIFwi4YiQ4Yid4YiMXCIsIFwi4YqQ4YiQ4Yi0XCIsIFwi4Yyz4YyJ4YicXCJcclxuXTtcclxuZXhwb3J0IGNvbnN0IGRheU5hbWVzOiBzdHJpbmdbXSA9IFtcIuGKpeGIgeGLtVwiLCBcIuGIsOGKnlwiLCBcIuGIm+GKreGIsOGKnlwiLCBcIuGIqOGJoeGLlVwiLCBcIuGIkOGImeGItVwiLCBcIuGLk+GIreGJpVwiLCBcIuGJheGLs+GInFwiXTtcclxuXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdG9HcmVnb3JpYW4ocGFyYW06IHsgeWVhcjogbnVtYmVyLCBtb250aDogbnVtYmVyLCBkYXk6IG51bWJlciB9KTogRGF0ZSB7XHJcbiAgICBjb25zdCB7IHllYXIsIG1vbnRoLCBkYXkgfSA9IHBhcmFtO1xyXG5cclxuICAgIGNvbnN0IGVyYTogbnVtYmVyID0geWVhciA8PSAwID8gSkRfRVBPQ0hfT0ZGU0VUX0FNRVRFX0FMRU0gOiBKRF9FUE9DSF9PRkZTRVRfQU1FVEVfTUlIUkVUO1xyXG5cclxuICAgIGxldCBqZG4gPSBFdGhpb3BpY1RvSmRuKHsgeWVhcjogcGFyYW0ueWVhciwgbW9udGg6IHBhcmFtLm1vbnRoLCBkYXk6IHBhcmFtLmRheSwgZXJhIH0pO1xyXG4gICAgY29uc3QgZGF0ZSA9IEpkblRvR3JlZ29yaWFuKGpkbik7XHJcbiAgICByZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEMoZGF0ZVswXSwgZGF0ZVsxXSAtIDEsIGRhdGVbMl0pKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHRvRXRoaW9waWFuKGdjRGF0ZTogRGF0ZSk6IHsgeWVhcjogbnVtYmVyLCBtb250aDogbnVtYmVyLCBkYXk6IG51bWJlciB9IHtcclxuICAgIGNvbnN0IGpkbiA9IEdyZWdvcmlhblRvSmRuKGdjRGF0ZS5nZXRGdWxsWWVhcigpLCBnY0RhdGUuZ2V0TW9udGgoKSArIDEsIGdjRGF0ZS5nZXREYXRlKCkpO1xyXG4gICAgcmV0dXJuIEpkblRvRXRoaW9waWMoamRuLCBHdWVzc0VyYUZyb21KRE4oamRuKSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIFF1b3RpZW50KGk6IG51bWJlciwgajogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBNYXRoLmZsb29yKGkgLyBqKTtcclxufVxyXG5cclxuZnVuY3Rpb24gTW9kKGk6IG51bWJlciwgajogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBpIC0gaiAqIFF1b3RpZW50KGksIGopO1xyXG59XHJcbmZ1bmN0aW9uIEd1ZXNzRXJhRnJvbUpETihqZG46IG51bWJlcik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gKGpkbiA+PSAoSkRfRVBPQ0hfT0ZGU0VUX0FNRVRFX01JSFJFVCArIDM2NSkpID8gSkRfRVBPQ0hfT0ZGU0VUX0FNRVRFX01JSFJFVCA6IEpEX0VQT0NIX09GRlNFVF9BTUVURV9BTEVNO1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBpc0V0aGlvcGlhbkxlYXBZZWFyKHllYXI6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHllYXIgJSA0ID09PSAzOyAvLyBFdGhpb3BpYW4gbGVhcCB5ZWFycyBhcmUgbXVsdGlwbGVzIG9mIDQgd2l0aCBhIHJlbWFpbmRlciBvZiAzXHJcbn1cclxuZnVuY3Rpb24gSXNHcmVnb3JpYW5MZWFwKHllYXI6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICh5ZWFyICUgNCA9PT0gMCkgJiYgKCh5ZWFyICUgMTAwICE9PSAwKSB8fCAoeWVhciAlIDQwMCA9PT0gMCkpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBHcmVnb3JpYW5Ub0pkbih5ZWFyOiBudW1iZXIsIG1vbnRoOiBudW1iZXIsIGRheTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IHMgPSBRdW90aWVudCh5ZWFyLCA0KSAtIFF1b3RpZW50KHllYXIgLSAxLCA0KSAtIFF1b3RpZW50KHllYXIsIDEwMCkgKyBRdW90aWVudCh5ZWFyIC0gMSwgMTAwKSArIFF1b3RpZW50KHllYXIsIDQwMCkgLSBRdW90aWVudCh5ZWFyIC0gMSwgNDAwKTtcclxuXHJcbiAgICBjb25zdCB0ID0gUXVvdGllbnQoMTQgLSBtb250aCwgMTIpO1xyXG5cclxuICAgIGNvbnN0IG4gPSAzMSAqIHQgKiAobW9udGggLSAxKSArICgxIC0gdCkgKiAoNTkgKyBzICsgMzAgKiAobW9udGggLSAzKSArIFF1b3RpZW50KCgzICogbW9udGggLSA3KSwgNSkpICsgZGF5IC0gMTtcclxuXHJcbiAgICBjb25zdCBqID0gSkRfRVBPQ0hfT0ZGU0VUX0dSRUdPUklBTiArIDM2NSAqICh5ZWFyIC0gMSkgKyBRdW90aWVudCh5ZWFyIC0gMSwgNCkgLSBRdW90aWVudCh5ZWFyIC0gMSwgMTAwKSArIFF1b3RpZW50KHllYXIgLSAxLCA0MDApICsgbjtcclxuXHJcbiAgICByZXR1cm4gajtcclxufVxyXG5cclxuZnVuY3Rpb24gSmRuVG9FdGhpb3BpYyhqZG46IG51bWJlciwgZXJhPzogbnVtYmVyKTogeyB5ZWFyOiBudW1iZXIsIG1vbnRoOiBudW1iZXIsIGRheTogbnVtYmVyIH0ge1xyXG4gICAgZXJhID0gZXJhID8/IEd1ZXNzRXJhRnJvbUpETihqZG4pO1xyXG4gICAgY29uc3QgciA9IE1vZCgoamRuIC0gZXJhKSwgMTQ2MSk7XHJcbiAgICBjb25zdCBuID0gTW9kKHIsIDM2NSkgKyAzNjUgKiBRdW90aWVudChyLCAxNDYwKTtcclxuXHJcbiAgICBjb25zdCB5ZWFyID0gNCAqIFF1b3RpZW50KChqZG4gLSBlcmEpLCAxNDYxKSArIFF1b3RpZW50KHIsIDM2NSkgLSBRdW90aWVudChyLCAxNDYwKTs7XHJcbiAgICBjb25zdCBtb250aCA9IFF1b3RpZW50KG4sIDMwKSArIDE7XHJcbiAgICBjb25zdCBkYXkgPSBNb2QobiwgMzApICsgMTtcclxuICAgIHJldHVybiB7IHllYXIsIG1vbnRoOiBOdW1iZXIobW9udGgpLCBkYXk6IE51bWJlcihkYXkpIH07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIEV0aENvcHRpY1RvSmRuKHllYXI6IG51bWJlciwgbW9udGg6IG51bWJlciwgZGF5OiBudW1iZXIsIGVyYTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiAoZXJhICsgMzY1KSArIDM2NSAqICh5ZWFyIC0gMSkgKyBRdW90aWVudCh5ZWFyLCA0KSArIDMwICogbW9udGggKyBkYXkgLSAzMTtcclxufVxyXG5cclxuZnVuY3Rpb24gSmRuVG9HcmVnb3JpYW4oajogbnVtYmVyKTogbnVtYmVyW10ge1xyXG4gICAgY29uc3QgcjIwMDA6IG51bWJlciA9IE1vZCgoaiAtIEpEX0VQT0NIX09GRlNFVF9HUkVHT1JJQU4pLCA3MzA0ODUpO1xyXG4gICAgY29uc3QgcjQwMDogbnVtYmVyID0gTW9kKChqIC0gSkRfRVBPQ0hfT0ZGU0VUX0dSRUdPUklBTiksIDE0NjA5Nyk7XHJcbiAgICBjb25zdCByMTAwOiBudW1iZXIgPSBNb2QocjQwMCwgMzY1MjQpO1xyXG4gICAgY29uc3QgcjQ6IG51bWJlciA9IE1vZChyMTAwLCAxNDYxKTtcclxuXHJcbiAgICBsZXQgbjogbnVtYmVyID0gTW9kKHI0LCAzNjUpICsgMzY1ICogUXVvdGllbnQocjQsIDE0NjApO1xyXG4gICAgY29uc3QgczogbnVtYmVyID0gUXVvdGllbnQocjQsIDEwOTUpO1xyXG5cclxuICAgIGNvbnN0IGFwcmltZTogbnVtYmVyID0gNDAwICogUXVvdGllbnQoKGogLSBKRF9FUE9DSF9PRkZTRVRfR1JFR09SSUFOKSwgMTQ2MDk3KSArIDEwMCAqIFF1b3RpZW50KHI0MDAsIDM2NTI0KSArIDQgKiBRdW90aWVudChyMTAwLCAxNDYxKSArIFF1b3RpZW50KHI0LCAzNjUpIC0gUXVvdGllbnQocjQsIDE0NjApIC0gUXVvdGllbnQocjIwMDAsIDczMDQ4NCk7O1xyXG4gICAgY29uc3QgeWVhcjogbnVtYmVyID0gYXByaW1lICsgMTtcclxuICAgIGNvbnN0IHQ6IG51bWJlciA9IFF1b3RpZW50KCgzNjQgKyBzIC0gbiksIDMwNik7XHJcbiAgICBjb25zdCBtb250aDogbnVtYmVyID0gdCAqIChRdW90aWVudChuLCAzMSkgKyAxKSArICgxIC0gdCkgKiAoUXVvdGllbnQoKDUgKiAobiAtIHMpICsgMTMpLCAxNTMpICsgMSk7XHJcblxyXG4gICAgbiArPSAxIC0gUXVvdGllbnQocjIwMDAsIDczMDQ4NCk7XHJcbiAgICBsZXQgZGF5ID0gbjtcclxuXHJcbiAgICBpZiAoKHIxMDAgPT0gMCkgJiYgKG4gPT0gMCkgJiYgKHI0MDAgIT0gMCkpIHtcclxuICAgICAgICBsZXQgbW9udGggPSAxMjtcclxuICAgICAgICBkYXkgPSAzMTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIG1vbnRoRGF5c1syXSA9IChJc0dyZWdvcmlhbkxlYXAoeWVhcikpID8gMjkgOiAyODtcclxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBuTW9udGhzOyArK2kpIHtcclxuICAgICAgICAgICAgaWYgKG4gPD0gbW9udGhEYXlzW2ldKSB7XHJcbiAgICAgICAgICAgICAgICBkYXkgPSBuO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbiAtPSBtb250aERheXNbaV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBbeWVhciwgbW9udGgsIGRheV07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIEV0aGlvcGljVG9KZG4ocGFyYW06IHsgeWVhcjogbnVtYmVyLCBtb250aDogbnVtYmVyLCBkYXk6IG51bWJlciwgZXJhOiBudW1iZXIgfSk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gRXRoQ29wdGljVG9KZG4ocGFyYW0ueWVhciwgcGFyYW0ubW9udGgsIHBhcmFtLmRheSwgcGFyYW0uZXJhKTtcclxufVxyXG5cclxuZnVuY3Rpb24gQ29wdGljVG9HcmVnb3JpYW4oeWVhcjogbnVtYmVyLCBtb250aDogbnVtYmVyLCBkYXk6IG51bWJlcik6IG51bWJlcltdIHtcclxuICAgIGxldCBqZG4gPSBFdGhpb3BpY1RvSmRuKHsgeWVhciwgbW9udGgsIGRheSwgZXJhOiBKRF9FUE9DSF9PRkZTRVRfQ09QVElDIH0pO1xyXG4gICAgcmV0dXJuIEpkblRvR3JlZ29yaWFuKGpkbik7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIEdyZWdvcmlhblRvQ29wdGljKHllYXI6IG51bWJlciwgbW9udGg6IG51bWJlciwgZGF5OiBudW1iZXIpOiB7IHllYXI6IG51bWJlciwgbW9udGg6IG51bWJlciwgZGF5OiBudW1iZXIgfSB7XHJcbiAgICBsZXQgamRuID0gR3JlZ29yaWFuVG9KZG4oeWVhciwgbW9udGgsIGRheSk7XHJcbiAgICByZXR1cm4gSmRuVG9FdGhpb3BpYyhqZG4sIEpEX0VQT0NIX09GRlNFVF9DT1BUSUMpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBDb3B0aWNUb0pkbih5ZWFyOiBudW1iZXIsIG1vbnRoOiBudW1iZXIsIGRheTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBFdGhDb3B0aWNUb0pkbih5ZWFyLCBtb250aCwgZGF5LCBKRF9FUE9DSF9PRkZTRVRfQ09QVElDKTtcclxufSJdfQ==