UNPKG

nep-datepicker

Version:

The Angular Nepali Datepicker is an npm package designed to integrate a Nepali date picker component into Angular applications.

194 lines 27.5 kB
import { Injectable } from '@angular/core'; import { englishLeapMonths, englishMonths, nepaliMonths, } from '../constants/data'; import * as i0 from "@angular/core"; export class NepaliDatepickerAngularPrivateService { constructor() { this.englishMonths = englishMonths; this.englishLeapMonths = englishLeapMonths; this.nepaliMonths = nepaliMonths; this.dateSeparatedCharacters = ['/', '-']; } setCurrentNepaliDate() { let today = new Date(); return this.engToNepDate(today.getDate(), today.getMonth(), today.getFullYear()); } //English to Nepali date conversion engToNepDate(date, month, year) { if (!this.isEnglishRange(date, month, year)) { throw new Error('Invalid date Only date between 1944 and 2043.'); } this.englishYear = year; this.englishMonth = month + 1; this.englishDate = date; //Setting nepali reference to 2000/1/1 with english date 1943/4/14 this.nepaliYear = 2000; this.nepaliMonth = 1; this.nepaliDate = 1; let difference = this.getEnglishDateDifference(1943, 4, 14); let index = 0; while (difference >= this.nepaliYearDays(index)) { this.nepaliYear++; difference = difference - this.nepaliYearDays(index); index++; } let i = 0; while (difference >= this.nepaliMonths[index][i]) { difference = difference - this.nepaliMonths[index][i]; this.nepaliMonth++; i++; } this.nepaliMonth--; this.nepaliDate = this.nepaliDate + difference; return { day: this.nepaliDate, month: this.nepaliMonth, year: this.nepaliYear, }; } toEnglishString(format) { if (typeof format === 'undefined') format = '-'; return (this.englishYear + format + this.englishMonth + format + this.englishDate); } getEnglishDateDifference(year, month, date) { let difference = this.countTotalEnglishDays(this.englishYear, this.englishMonth, this.englishDate) - this.countTotalEnglishDays(year, month, date); return difference < 0 ? -difference : difference; } countTotalEnglishDays(year, month, date) { let totalDays = year * 365 + date; for (let i = 0; i < month - 1; i++) totalDays = totalDays + this.englishMonths[i]; totalDays = totalDays + this.countleap(year, month); return totalDays; } countleap(year, month) { if (month <= 2) year--; return (Math.floor(year / 4) - Math.floor(year / 100) + Math.floor(year / 400)); } isEnglishRange(date, month, year) { if (year < 1944 || year > 2043) return false; if (month < 0 || month > 11) { throw new Error('Invalid Date'); } if (date < 1 || date > 31) { throw new Error('Invalid Date'); } return true; } isLeapYear(year) { if (year % 4 === 0) { return year % 100 === 0 ? year % 400 === 0 : true; } else return false; } nepToEngDate(date, month, year) { if (!this.isNepaliRange(date, month, year)) { throw new Error('Invalid date, Only date between 2000 and 2099.'); } this.nepaliYear = year; this.nepaliMonth = month + 1; this.nepaliDate = date; this.englishYear = 1944; this.englishMonth = 1; this.englishDate = 1; let difference = this.getNepaliDateDifference(2000, 9, 17); while (difference >= (this.isLeapYear(this.englishYear) ? 366 : 365)) { difference = difference - (this.isLeapYear(this.englishYear) ? 366 : 365); this.englishYear++; } let monthDays = this.isLeapYear(this.englishYear) ? this.englishLeapMonths : this.englishMonths; let i = 0; while (difference >= monthDays[i]) { this.englishMonth++; difference = difference - monthDays[i]; i++; } this.englishDate = this.englishDate + difference; return new Date(this.englishYear + '-' + this.englishMonth + '-' + this.englishDate); } toNepaliString(format) { if (typeof format === 'undefined') format = '-'; return (this.nepaliYear + format + this.nepaliMonth + format + this.nepaliDate); } getNepaliDateDifference(year, month, date) { const a = this.countTotalNepaliDays(this.nepaliYear, this.nepaliMonth, this.nepaliDate); const b = this.countTotalNepaliDays(year, month, date); let difference = a - b; return difference < 0 ? -difference : difference; } countTotalNepaliDays(year, month, date) { let total = 0; if (year < 2000) return 0; total = total + (date - 1); let yearIndex = year - 2000; for (let i = 0; i < month - 1; i++) total = total + this.nepaliMonths[yearIndex][i]; for (let i = 0; i < yearIndex; i++) total = total + this.nepaliYearDays(i); return total; } nepaliYearDays(index) { let total = 0; for (let i = 0; i < 12; i++) total += this.nepaliMonths[index][i]; return total; } isNepaliRange(date, month, year) { if (year < 2000 || year > 2099) return false; if (month < 0 || month > 11) { throw new Error('Invalid Date'); } if (date < 1 || date > this.nepaliMonths[year - 2000][month]) { throw new Error('Invalid Date'); } return true; } formatDate(date, format) { const subDates = date.split('/'); const regex = { year: /y{2,4}/i, month: /m{1,2}/i, day: /d{1,2}/i, }; format = format.replace(regex.year, subDates[0]); format = format.replace(regex.month, subDates[1]); format = format.replace(regex.day, subDates[2]); return format; } changeStructure(value) { value = value.split('T')[0]; let separatedCharacter; for (let i = 0; i < this.dateSeparatedCharacters.length; i++) { const character = this.dateSeparatedCharacters[i]; if (value.indexOf(character) !== -1) { separatedCharacter = character; break; } } if (!separatedCharacter) return; const splittedDate = value.split(separatedCharacter); return { year: Number(splittedDate[0]), month: Number(splittedDate[1]) - 1, day: Number(splittedDate[2]), }; } } NepaliDatepickerAngularPrivateService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: NepaliDatepickerAngularPrivateService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); NepaliDatepickerAngularPrivateService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: NepaliDatepickerAngularPrivateService, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: NepaliDatepickerAngularPrivateService, decorators: [{ type: Injectable, args: [{ providedIn: 'root', }] }], ctorParameters: function () { return []; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVwLWRhdGVwaWNrZXItcHJpdmF0ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnAtZGF0ZXBpY2tlci9zcmMvbGliL3NlcnZpY2VzL25lcC1kYXRlcGlja2VyLXByaXZhdGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsYUFBYSxFQUNiLFlBQVksR0FDYixNQUFNLG1CQUFtQixDQUFDOztBQUszQixNQUFNLE9BQU8scUNBQXFDO0lBY2hEO1FBYkEsa0JBQWEsR0FBRyxhQUFhLENBQUM7UUFDOUIsc0JBQWlCLEdBQUcsaUJBQWlCLENBQUM7UUFDdEMsaUJBQVksR0FBRyxZQUFZLENBQUM7UUFTNUIsNEJBQXVCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFFdEIsQ0FBQztJQUVoQixvQkFBb0I7UUFDbEIsSUFBSSxLQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN2QixPQUFPLElBQUksQ0FBQyxZQUFZLENBQ3RCLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFDZixLQUFLLENBQUMsUUFBUSxFQUFFLEVBQ2hCLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FDcEIsQ0FBQztJQUNKLENBQUM7SUFFRCxtQ0FBbUM7SUFDbkMsWUFBWSxDQUFDLElBQVMsRUFBRSxLQUFVLEVBQUUsSUFBUztRQUMzQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFO1lBQzNDLE1BQU0sSUFBSSxLQUFLLENBQUMsK0NBQStDLENBQUMsQ0FBQztTQUNsRTtRQUVELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxHQUFHLENB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QztRQUNyRCxPQUFPO1lBQ0wsSUFBSSxFQUFFLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDN0IsS0FBSyxFQUFFLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQ2xDLEdBQUcsRUFBRSxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzdCLENBQUM7SUFDSixDQUFDOztrSUEvT1UscUNBQXFDO3NJQUFyQyxxQ0FBcUMsY0FGcEMsTUFBTTsyRkFFUCxxQ0FBcUM7a0JBSGpELFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIGVuZ2xpc2hMZWFwTW9udGhzLFxyXG4gIGVuZ2xpc2hNb250aHMsXHJcbiAgbmVwYWxpTW9udGhzLFxyXG59IGZyb20gJy4uL2NvbnN0YW50cy9kYXRhJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZXBhbGlEYXRlcGlja2VyQW5ndWxhclByaXZhdGVTZXJ2aWNlIHtcclxuICBlbmdsaXNoTW9udGhzID0gZW5nbGlzaE1vbnRocztcclxuICBlbmdsaXNoTGVhcE1vbnRocyA9IGVuZ2xpc2hMZWFwTW9udGhzO1xyXG4gIG5lcGFsaU1vbnRocyA9IG5lcGFsaU1vbnRocztcclxuICBlbmdsaXNoWWVhcjogYW55O1xyXG4gIGVuZ2xpc2hNb250aDogYW55O1xyXG4gIGVuZ2xpc2hEYXRlOiBhbnk7XHJcbiAgbmVwYWxpWWVhcjogYW55O1xyXG4gIG5lcGFsaU1vbnRoOiBhbnk7XHJcbiAgbmVwYWxpRGF0ZTogYW55O1xyXG5cclxuICB3ZWVrRGF5OiBhbnk7XHJcbiAgZGF0ZVNlcGFyYXRlZENoYXJhY3RlcnMgPSBbJy8nLCAnLSddO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHt9XHJcblxyXG4gIHNldEN1cnJlbnROZXBhbGlEYXRlKCkge1xyXG4gICAgbGV0IHRvZGF5ID0gbmV3IERhdGUoKTtcclxuICAgIHJldHVybiB0aGlzLmVuZ1RvTmVwRGF0ZShcclxuICAgICAgdG9kYXkuZ2V0RGF0ZSgpLFxyXG4gICAgICB0b2RheS5nZXRNb250aCgpLFxyXG4gICAgICB0b2RheS5nZXRGdWxsWWVhcigpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLy9FbmdsaXNoIHRvIE5lcGFsaSBkYXRlIGNvbnZlcnNpb25cclxuICBlbmdUb05lcERhdGUoZGF0ZTogYW55LCBtb250aDogYW55LCB5ZWFyOiBhbnkpIHtcclxuICAgIGlmICghdGhpcy5pc0VuZ2xpc2hSYW5nZShkYXRlLCBtb250aCwgeWVhcikpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGRhdGUgT25seSBkYXRlIGJldHdlZW4gMTk0NCBhbmQgMjA0My4nKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmVuZ2xpc2hZZWFyID0geWVhcjtcclxuICAgIHRoaXMuZW5nbGlzaE1vbnRoID0gbW9udGggKyAxO1xyXG4gICAgdGhpcy5lbmdsaXNoRGF0ZSA9IGRhdGU7XHJcblxyXG4gICAgLy9TZXR0aW5nIG5lcGFsaSByZWZlcmVuY2UgdG8gMjAwMC8xLzEgd2l0aCBlbmdsaXNoIGRhdGUgMTk0My80LzE0XHJcbiAgICB0aGlzLm5lcGFsaVllYXIgPSAyMDAwO1xyXG4gICAgdGhpcy5uZXBhbGlNb250aCA9IDE7XHJcbiAgICB0aGlzLm5lcGFsaURhdGUgPSAxO1xyXG5cclxuICAgIGxldCBkaWZmZXJlbmNlID0gdGhpcy5nZXRFbmdsaXNoRGF0ZURpZmZlcmVuY2UoMTk0MywgNCwgMTQpO1xyXG5cclxuICAgIGxldCBpbmRleCA9IDA7XHJcbiAgICB3aGlsZSAoZGlmZmVyZW5jZSA+PSB0aGlzLm5lcGFsaVllYXJEYXlzKGluZGV4KSkge1xyXG4gICAgICB0aGlzLm5lcGFsaVllYXIrKztcclxuICAgICAgZGlmZmVyZW5jZSA9IGRpZmZlcmVuY2UgLSB0aGlzLm5lcGFsaVllYXJEYXlzKGluZGV4KTtcclxuICAgICAgaW5kZXgrKztcclxuICAgIH1cclxuXHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICB3aGlsZSAoZGlmZmVyZW5jZSA+PSB0aGlzLm5lcGFsaU1vbnRoc1tpbmRleF1baV0pIHtcclxuICAgICAgZGlmZmVyZW5jZSA9IGRpZmZlcmVuY2UgLSB0aGlzLm5lcGFsaU1vbnRoc1tpbmRleF1baV07XHJcbiAgICAgIHRoaXMubmVwYWxpTW9udGgrKztcclxuICAgICAgaSsrO1xyXG4gICAgfVxyXG4gICAgdGhpcy5uZXBhbGlNb250aC0tO1xyXG5cclxuICAgIHRoaXMubmVwYWxpRGF0ZSA9IHRoaXMubmVwYWxpRGF0ZSArIGRpZmZlcmVuY2U7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgZGF5OiB0aGlzLm5lcGFsaURhdGUsXHJcbiAgICAgIG1vbnRoOiB0aGlzLm5lcGFsaU1vbnRoLFxyXG4gICAgICB5ZWFyOiB0aGlzLm5lcGFsaVllYXIsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgdG9FbmdsaXNoU3RyaW5nKGZvcm1hdDogYW55KSB7XHJcbiAgICBpZiAodHlwZW9mIGZvcm1hdCA9PT0gJ3VuZGVmaW5lZCcpIGZvcm1hdCA9ICctJztcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHRoaXMuZW5nbGlzaFllYXIgKyBmb3JtYXQgKyB0aGlzLmVuZ2xpc2hNb250aCArIGZvcm1hdCArIHRoaXMuZW5nbGlzaERhdGVcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBnZXRFbmdsaXNoRGF0ZURpZmZlcmVuY2UoeWVhcjogYW55LCBtb250aDogYW55LCBkYXRlOiBhbnkpIHtcclxuICAgIGxldCBkaWZmZXJlbmNlID1cclxuICAgICAgdGhpcy5jb3VudFRvdGFsRW5nbGlzaERheXMoXHJcbiAgICAgICAgdGhpcy5lbmdsaXNoWWVhcixcclxuICAgICAgICB0aGlzLmVuZ2xpc2hNb250aCxcclxuICAgICAgICB0aGlzLmVuZ2xpc2hEYXRlXHJcbiAgICAgICkgLSB0aGlzLmNvdW50VG90YWxFbmdsaXNoRGF5cyh5ZWFyLCBtb250aCwgZGF0ZSk7XHJcbiAgICByZXR1cm4gZGlmZmVyZW5jZSA8IDAgPyAtZGlmZmVyZW5jZSA6IGRpZmZlcmVuY2U7XHJcbiAgfVxyXG5cclxuICBjb3VudFRvdGFsRW5nbGlzaERheXMoeWVhcjogYW55LCBtb250aDogYW55LCBkYXRlOiBhbnkpIHtcclxuICAgIGxldCB0b3RhbERheXMgPSB5ZWFyICogMzY1ICsgZGF0ZTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1vbnRoIC0gMTsgaSsrKVxyXG4gICAgICB0b3RhbERheXMgPSB0b3RhbERheXMgKyB0aGlzLmVuZ2xpc2hNb250aHNbaV07XHJcblxyXG4gICAgdG90YWxEYXlzID0gdG90YWxEYXlzICsgdGhpcy5jb3VudGxlYXAoeWVhciwgbW9udGgpO1xyXG4gICAgcmV0dXJuIHRvdGFsRGF5cztcclxuICB9XHJcblxyXG4gIGNvdW50bGVhcCh5ZWFyOiBhbnksIG1vbnRoOiBhbnkpIHtcclxuICAgIGlmIChtb250aCA8PSAyKSB5ZWFyLS07XHJcblxyXG4gICAgcmV0dXJuIChcclxuICAgICAgTWF0aC5mbG9vcih5ZWFyIC8gNCkgLSBNYXRoLmZsb29yKHllYXIgLyAxMDApICsgTWF0aC5mbG9vcih5ZWFyIC8gNDAwKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGlzRW5nbGlzaFJhbmdlKGRhdGU6IGFueSwgbW9udGg6IGFueSwgeWVhcjogYW55KSB7XHJcbiAgICBpZiAoeWVhciA8IDE5NDQgfHwgeWVhciA+IDIwNDMpIHJldHVybiBmYWxzZTtcclxuICAgIGlmIChtb250aCA8IDAgfHwgbW9udGggPiAxMSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgRGF0ZScpO1xyXG4gICAgfVxyXG4gICAgaWYgKGRhdGUgPCAxIHx8IGRhdGUgPiAzMSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgRGF0ZScpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgaXNMZWFwWWVhcih5ZWFyOiBhbnkpIHtcclxuICAgIGlmICh5ZWFyICUgNCA9PT0gMCkge1xyXG4gICAgICByZXR1cm4geWVhciAlIDEwMCA9PT0gMCA/IHllYXIgJSA0MDAgPT09IDAgOiB0cnVlO1xyXG4gICAgfSBlbHNlIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIG5lcFRvRW5nRGF0ZShkYXRlOiBhbnksIG1vbnRoOiBhbnksIHllYXI6IGFueSkge1xyXG4gICAgaWYgKCF0aGlzLmlzTmVwYWxpUmFuZ2UoZGF0ZSwgbW9udGgsIHllYXIpKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBkYXRlLCBPbmx5IGRhdGUgYmV0d2VlbiAyMDAwIGFuZCAyMDk5LicpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubmVwYWxpWWVhciA9IHllYXI7XHJcbiAgICB0aGlzLm5lcGFsaU1vbnRoID0gbW9udGggKyAxO1xyXG4gICAgdGhpcy5uZXBhbGlEYXRlID0gZGF0ZTtcclxuXHJcbiAgICB0aGlzLmVuZ2xpc2hZZWFyID0gMTk0NDtcclxuICAgIHRoaXMuZW5nbGlzaE1vbnRoID0gMTtcclxuICAgIHRoaXMuZW5nbGlzaERhdGUgPSAxO1xyXG5cclxuICAgIGxldCBkaWZmZXJlbmNlID0gdGhpcy5nZXROZXBhbGlEYXRlRGlmZmVyZW5jZSgyMDAwLCA5LCAxNyk7XHJcblxyXG4gICAgd2hpbGUgKGRpZmZlcmVuY2UgPj0gKHRoaXMuaXNMZWFwWWVhcih0aGlzLmVuZ2xpc2hZZWFyKSA/IDM2NiA6IDM2NSkpIHtcclxuICAgICAgZGlmZmVyZW5jZSA9IGRpZmZlcmVuY2UgLSAodGhpcy5pc0xlYXBZZWFyKHRoaXMuZW5nbGlzaFllYXIpID8gMzY2IDogMzY1KTtcclxuICAgICAgdGhpcy5lbmdsaXNoWWVhcisrO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBtb250aERheXMgPSB0aGlzLmlzTGVhcFllYXIodGhpcy5lbmdsaXNoWWVhcilcclxuICAgICAgPyB0aGlzLmVuZ2xpc2hMZWFwTW9udGhzXHJcbiAgICAgIDogdGhpcy5lbmdsaXNoTW9udGhzO1xyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgd2hpbGUgKGRpZmZlcmVuY2UgPj0gbW9udGhEYXlzW2ldKSB7XHJcbiAgICAgIHRoaXMuZW5nbGlzaE1vbnRoKys7XHJcbiAgICAgIGRpZmZlcmVuY2UgPSBkaWZmZXJlbmNlIC0gbW9udGhEYXlzW2ldO1xyXG4gICAgICBpKys7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5lbmdsaXNoRGF0ZSA9IHRoaXMuZW5nbGlzaERhdGUgKyBkaWZmZXJlbmNlO1xyXG5cclxuICAgIHJldHVybiBuZXcgRGF0ZShcclxuICAgICAgdGhpcy5lbmdsaXNoWWVhciArICctJyArIHRoaXMuZW5nbGlzaE1vbnRoICsgJy0nICsgdGhpcy5lbmdsaXNoRGF0ZVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHRvTmVwYWxpU3RyaW5nKGZvcm1hdDogYW55KSB7XHJcbiAgICBpZiAodHlwZW9mIGZvcm1hdCA9PT0gJ3VuZGVmaW5lZCcpIGZvcm1hdCA9ICctJztcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHRoaXMubmVwYWxpWWVhciArIGZvcm1hdCArIHRoaXMubmVwYWxpTW9udGggKyBmb3JtYXQgKyB0aGlzLm5lcGFsaURhdGVcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBnZXROZXBhbGlEYXRlRGlmZmVyZW5jZSh5ZWFyOiBhbnksIG1vbnRoOiBhbnksIGRhdGU6IGFueSkge1xyXG4gICAgY29uc3QgYSA9IHRoaXMuY291bnRUb3RhbE5lcGFsaURheXMoXHJcbiAgICAgIHRoaXMubmVwYWxpWWVhcixcclxuICAgICAgdGhpcy5uZXBhbGlNb250aCxcclxuICAgICAgdGhpcy5uZXBhbGlEYXRlXHJcbiAgICApO1xyXG4gICAgY29uc3QgYiA9IHRoaXMuY291bnRUb3RhbE5lcGFsaURheXMoeWVhciwgbW9udGgsIGRhdGUpO1xyXG4gICAgbGV0IGRpZmZlcmVuY2UgPSBhIC0gYjtcclxuICAgIHJldHVybiBkaWZmZXJlbmNlIDwgMCA/IC1kaWZmZXJlbmNlIDogZGlmZmVyZW5jZTtcclxuICB9XHJcblxyXG4gIGNvdW50VG90YWxOZXBhbGlEYXlzKHllYXI6IGFueSwgbW9udGg6IGFueSwgZGF0ZTogYW55KSB7XHJcbiAgICBsZXQgdG90YWwgPSAwO1xyXG4gICAgaWYgKHllYXIgPCAyMDAwKSByZXR1cm4gMDtcclxuXHJcbiAgICB0b3RhbCA9IHRvdGFsICsgKGRhdGUgLSAxKTtcclxuXHJcbiAgICBsZXQgeWVhckluZGV4ID0geWVhciAtIDIwMDA7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1vbnRoIC0gMTsgaSsrKVxyXG4gICAgICB0b3RhbCA9IHRvdGFsICsgdGhpcy5uZXBhbGlNb250aHNbeWVhckluZGV4XVtpXTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHllYXJJbmRleDsgaSsrKSB0b3RhbCA9IHRvdGFsICsgdGhpcy5uZXBhbGlZZWFyRGF5cyhpKTtcclxuXHJcbiAgICByZXR1cm4gdG90YWw7XHJcbiAgfVxyXG5cclxuICBuZXBhbGlZZWFyRGF5cyhpbmRleDogYW55KSB7XHJcbiAgICBsZXQgdG90YWwgPSAwO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMjsgaSsrKSB0b3RhbCArPSB0aGlzLm5lcGFsaU1vbnRoc1tpbmRleF1baV07XHJcbiAgICByZXR1cm4gdG90YWw7XHJcbiAgfVxyXG5cclxuICBpc05lcGFsaVJhbmdlKGRhdGU6IGFueSwgbW9udGg6IGFueSwgeWVhcjogYW55KSB7XHJcbiAgICBpZiAoeWVhciA8IDIwMDAgfHwgeWVhciA+IDIwOTkpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBpZiAobW9udGggPCAwIHx8IG1vbnRoID4gMTEpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIERhdGUnKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZGF0ZSA8IDEgfHwgZGF0ZSA+IHRoaXMubmVwYWxpTW9udGhzW3llYXIgLSAyMDAwXVttb250aF0pIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIERhdGUnKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBmb3JtYXREYXRlKGRhdGU6IHN0cmluZywgZm9ybWF0OiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IHN1YkRhdGVzID0gZGF0ZS5zcGxpdCgnLycpO1xyXG4gICAgY29uc3QgcmVnZXggPSB7XHJcbiAgICAgIHllYXI6IC95ezIsNH0vaSxcclxuICAgICAgbW9udGg6IC9tezEsMn0vaSxcclxuICAgICAgZGF5OiAvZHsxLDJ9L2ksXHJcbiAgICB9O1xyXG4gICAgZm9ybWF0ID0gZm9ybWF0LnJlcGxhY2UocmVnZXgueWVhciwgc3ViRGF0ZXNbMF0pO1xyXG4gICAgZm9ybWF0ID0gZm9ybWF0LnJlcGxhY2UocmVnZXgubW9udGgsIHN1YkRhdGVzWzFdKTtcclxuICAgIGZvcm1hdCA9IGZvcm1hdC5yZXBsYWNlKHJlZ2V4LmRheSwgc3ViRGF0ZXNbMl0pO1xyXG4gICAgcmV0dXJuIGZvcm1hdDtcclxuICB9XHJcblxyXG4gIGNoYW5nZVN0cnVjdHVyZSh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB2YWx1ZSA9IHZhbHVlLnNwbGl0KCdUJylbMF07XHJcbiAgICBsZXQgc2VwYXJhdGVkQ2hhcmFjdGVyO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmRhdGVTZXBhcmF0ZWRDaGFyYWN0ZXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGNoYXJhY3RlciA9IHRoaXMuZGF0ZVNlcGFyYXRlZENoYXJhY3RlcnNbaV07XHJcbiAgICAgIGlmICh2YWx1ZS5pbmRleE9mKGNoYXJhY3RlcikgIT09IC0xKSB7XHJcbiAgICAgICAgc2VwYXJhdGVkQ2hhcmFjdGVyID0gY2hhcmFjdGVyO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoIXNlcGFyYXRlZENoYXJhY3RlcikgcmV0dXJuO1xyXG4gICAgY29uc3Qgc3BsaXR0ZWREYXRlID0gdmFsdWUuc3BsaXQoc2VwYXJhdGVkQ2hhcmFjdGVyKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHllYXI6IE51bWJlcihzcGxpdHRlZERhdGVbMF0pLFxyXG4gICAgICBtb250aDogTnVtYmVyKHNwbGl0dGVkRGF0ZVsxXSkgLSAxLFxyXG4gICAgICBkYXk6IE51bWJlcihzcGxpdHRlZERhdGVbMl0pLFxyXG4gICAgfTtcclxuICB9XHJcbn1cclxuIl19