UNPKG

ng-jalali-date-time

Version:

Jalali date / month / range picker for Angular with Material Design support

230 lines 35.8 kB
import { Injectable } from '@angular/core'; import { JalaliDateTime } from 'jalali-date-time'; import { JalaliLocale } from './shared/jalali.locale'; export class NgJalaliDateTimeService { constructor() { this.jalali = JalaliDateTime({ timezone: 'Asia/Tehran', locale: 'en', dateFormat: 'Y-M-D', timeFormat: 'H:I:S', titleFormat: 'W، d N Y', fullTextFormat: 'W، d N Y H:I:S', }); this.jalaliLocale = new JalaliLocale(); } checkDate(date) { if (typeof date !== 'string' || date.length !== 10) return ''; if (!date.match(/([0-9]{4}-[0-9]{2}-[0-9]{2})/)) return ''; const [year, month, day] = date.split('-'); if (Number(year) < 1000 || Number(year) > 4000) return ''; if (Number(month) < 1 || Number(month) > 12) return ''; if (Number(day) < 1 || Number(day) > 31) return ''; return date; } checkTime(time) { if (typeof time !== 'string' || time.length !== 8) return ''; if (!time.match(/([0-9]{2}:[0-9]{2}:[0-9]{2})/)) return ''; const [hour, minute, second] = time.split('-'); if (Number(hour) < 0 || Number(hour) > 23) return ''; if (Number(minute) < 0 || Number(minute) > 59) return ''; if (Number(second) < 0 || Number(second) > 59) return ''; return time; } checkMonth(date) { if (typeof date !== 'string' || date.length !== 7) return ''; if (!date.match(/([0-9]{4}-[0-9]{2})/)) return ''; const [year, month] = date.split('-'); if (Number(year) < 1000 || Number(year) > 4000) return ''; if (Number(month) < 1 || Number(month) > 12) return ''; return date; } checkAppearance(appearance) { return ['legacy', 'standard', 'fill', 'outline'].includes(appearance) ? appearance : 'legacy'; } setFontCSS(css, font) { return Object.assign(Object.assign({}, css), { fontFamily: font }); } checkCSS(css) { if (!css) css = {}; css.font = css.font ? css.font : "Roboto, 'Helvetica Neue', sans-serif"; css.field = css.field ? css.field : {}; css.input = this.setFontCSS(css.input ? css.input : {}, css.font); css.reset = css.reset ? css.reset : {}; css.box = css.box ? css.box : {}; css.arrow = css.arrow ? css.arrow : {}; css.header = this.setFontCSS(css.header ? css.header : {}, css.font); css.item = this.setFontCSS(css.item ? css.item : {}, css.font); css.selected = css.selected ? css.selected : {}; css.selected = Object.assign(Object.assign({}, css.item), css.selected); css.current = css.current ? css.current : {}; css.current = Object.assign(Object.assign({}, css.item), css.current); if (!css.date) css.date = {}; css.date.name = this.setFontCSS(css.date.name ? css.date.name : {}, css.font); css.date.time = this.setFontCSS(css.date.time ? css.date.time : {}, css.font); if (!css.month) css.month = {}; if (!css.range) css.range = {}; css.range.tool = this.setFontCSS(css.range.tool ? css.range.tool : {}, css.font); css.range.custom = css.range.custom ? css.range.custom : {}; css.range.custom = Object.assign(Object.assign({}, css.range.tool), css.range.custom); css.range.confirm = css.range.confirm ? css.range.confirm : {}; css.range.confirm = Object.assign(Object.assign(Object.assign({}, css.range.tool), css.range.custom), css.range.confirm); css.range.name = this.setFontCSS(css.range.name ? css.range.name : {}, css.font); css.range.date = this.setFontCSS(css.range.date ? css.range.date : {}, css.font); return css; } jalaliToGregorian(jalali, time) { const gregorian = this.jalali.gregorian(jalali).date; return new Date(gregorian + 'T' + (this.checkTime(time) ? time : '12:00:00')); } getCalendar(month) { const now = this.jalaliToGregorian(month + '-01'); const title = this.jalali.toFullText(now, { format: 'N Y' }); let begin = now; while (begin.getDay() !== 6) begin = new Date(begin.getTime() - 24 * 3600 * 1000); const weeks = []; let days = []; let date = this.jalali.toDate(begin); while (date.substr(0, 7) <= month || days.length % 7 !== 0) { days.push({ date, month: date.substr(0, 7), day: Number(date.substr(8)), }); if (days.length === 7) { weeks.push({ days }); days = []; } begin = new Date(begin.getTime() + 24 * 3600 * 1000); date = this.jalali.toDate(begin); } return { month, title, weeks }; } getDayInMonth(month) { const [Y, M] = month.split('-'); if (Number(M) < 7) return 31; if (Number(M) < 12) return 30; const date = this.jalaliToGregorian(month + '-30'); const check = this.jalali.toString(date, { format: 'Y-M-D' }).substr(0, 7); return check === month ? 30 : 29; } /* * DATETIME */ getDateTimeValue(jalali, time) { const gregorian = jalali ? this.jalali.gregorian(jalali).date : ''; const date = gregorian ? new Date(gregorian + 'T' + (time ? time : '12:00:00')) : null; const timestamp = gregorian ? Math.floor(date.getTime() / 1000) : null; time = time ? time : '00:00:00'; return { jalali, gregorian, date, time, timestamp, }; } getDateTimeTitle(value, time) { if (!value.jalali) return ''; return time ? this.jalali.toFullText(value.date) : this.jalali.toTitle(value.date); } /* * MONTH */ getMonthValue(month) { let days = 0; const gregorian = { first: '', last: '' }; if (month) { days = this.getDayInMonth(month); gregorian.first = this.jalali.gregorian(month + '-01').date; gregorian.last = this.jalali.gregorian(month + '-' + days.toString()).date; } return { month, days, gregorian, }; } getMonthTitle(value) { if (!value.month) return ''; const date = this.jalaliToGregorian(value.month + '-01'); return this.jalali.toTitle(date, { format: 'N Y' }); } /* * RANGE */ getRangeValue(from, to) { let days = 0; let hours = 0; let minutes = 0; let seconds = 0; const gregorian = { from: '', to: '' }; if (from && to) { gregorian.from = this.jalali.gregorian(from).date; gregorian.to = this.jalali.gregorian(to).date; const fTimestamp = Math.floor(new Date(gregorian.from + 'T12:00:00').getTime() / 1000); const tTimestamp = Math.floor(new Date(gregorian.to + 'T12:00:00').getTime() / 1000); days = Math.floor(Math.abs((tTimestamp - fTimestamp) / (24 * 3600))) + 1; hours = days * 24; minutes = hours * 60; seconds = minutes * 60; } return { range: from && to ? from + '|' + to : '', from, to, days, hours, minutes, seconds, gregorian, }; } getRangeTitle(value) { if (!value.from || !value.to) return ''; const fDate = this.jalaliToGregorian(value.from); const tDate = this.jalaliToGregorian(value.to); const [fY, fM, fD] = value.from.split('-'); const [tY, tM, tD] = value.to.split('-'); let from = ''; if (fY === tY && fM === tM) { from = this.jalali.toTitle(fDate, { format: 'd' }); } else if (fY === tY) { from = this.jalali.toTitle(fDate, { format: 'd N' }); } else { from = this.jalali.toTitle(fDate, { format: 'd N Y' }); } return from + ' ' + this.jalaliLocale.rangeTo + ' ' + this.jalali.toTitle(tDate, { format: 'd N Y' }); } } NgJalaliDateTimeService.decorators = [ { type: Injectable } ]; NgJalaliDateTimeService.ctorParameters = () => []; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctamFsYWxpLWRhdGUtdGltZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctamFsYWxpLWRhdGUtdGltZS9zcmMvbGliL25nLWphbGFsaS1kYXRlLXRpbWUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVsRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFRdEQsTUFBTSxPQUFPLHVCQUF1QjtJQVloQztRQVhPLFdBQU0sR0FBRyxjQUFjLENBQUM7WUFDM0IsUUFBUSxFQUFFLGFBQWE7WUFDdkIsTUFBTSxFQUFFLElBQUk7WUFDWixVQUFVLEVBQUUsT0FBTztZQUNuQixVQUFVLEVBQUUsT0FBTztZQUNuQixXQUFXLEVBQUUsVUFBVTtZQUN2QixjQUFjLEVBQUUsZ0JBQWdCO1NBQ25DLENBQUMsQ0FBQztRQUVJLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUUxQixDQUFDO0lBRWhCLFNBQVMsQ0FBQyxJQUFZO1FBQ2xCLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssRUFBRTtZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQzlELElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLDhCQUE4QixDQUFDO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFFM0QsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUk7WUFBRSxPQUFPLEVB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R0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEUsR0FBRyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDdkMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDakMsR0FBRyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDdkMsR0FBRyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckUsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0QsR0FBRyxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDaEQsR0FBRyxDQUFDLFFBQVEsbUNBQVEsR0FBRyxDQUFDLElBQUksR0FBSyxHQUFHLENBQUMsUUFBUSxDQUFFLENBQUM7UUFDaEQsR0FBRyxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDN0MsR0FBRyxDQUFDLE9BQU8sbUNBQVEsR0FBRyxDQUFDLElBQUksR0FBSyxHQUFHLENBQUMsT0FBTyxDQUFFLENBQUM7UUFFOUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJO1lBQUUsR0FBRyxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7UUFDN0IsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUUsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFOUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLO1lBQUUsR0FBRyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7UUFFL0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLO1lBQUUsR0FBRyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDL0IsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakYsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLENB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QUM7OztZQTlPSixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSmFsYWxpRGF0ZVRpbWUgfSBmcm9tICdqYWxhbGktZGF0ZS10aW1lJztcblxuaW1wb3J0IHsgSmFsYWxpTG9jYWxlIH0gZnJvbSAnLi9zaGFyZWQvamFsYWxpLmxvY2FsZSc7XG5pbXBvcnQgeyBKYWxhbGlDYWxlbmRhckludGVyZmFjZSwgSmFsYWxpV2Vla0ludGVyZmFjZSwgSmFsYWxpRGF5SW50ZXJmYWNlIH0gZnJvbSAnLi9zaGFyZWQvamFsYWxpLmludGVyZmFjZSc7XG5pbXBvcnQgeyBOZ0phbGFsaURhdGVUaW1lVmFsdWVJbnRlcmZhY2UgfSBmcm9tICcuL2NvbXBvbmVudC9uZy1qYWxhbGktZGF0ZS10aW1lL25nLWphbGFsaS1kYXRlLXRpbWUuaW50ZXJmYWNlJztcbmltcG9ydCB7IE5nSmFsYWxpTW9udGhWYWx1ZUludGVyZmFjZSB9IGZyb20gJy4vY29tcG9uZW50L25nLWphbGFsaS1tb250aC9uZy1qYWxhbGktbW9udGguaW50ZXJmYWNlJztcbmltcG9ydCB7IE5nSmFsYWxpUmFuZ2VWYWx1ZUludGVyZmFjZSB9IGZyb20gJy4vY29tcG9uZW50L25nLWphbGFsaS1yYW5nZS9uZy1qYWxhbGktcmFuZ2UuaW50ZXJmYWNlJztcbmltcG9ydCB7IE5nSmFsYWxpRGF0ZVRpbWVDc3NJbnRlcmZhY2UgfSBmcm9tICcuL25nLWphbGFsaS1kYXRlLXRpbWUuaW50ZXJmYWNlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE5nSmFsYWxpRGF0ZVRpbWVTZXJ2aWNlIHtcbiAgICBwdWJsaWMgamFsYWxpID0gSmFsYWxpRGF0ZVRpbWUoe1xuICAgICAgICB0aW1lem9uZTogJ0FzaWEvVGVocmFuJyxcbiAgICAgICAgbG9jYWxlOiAnZW4nLFxuICAgICAgICBkYXRlRm9ybWF0OiAnWS1NLUQnLFxuICAgICAgICB0aW1lRm9ybWF0OiAnSDpJOlMnLFxuICAgICAgICB0aXRsZUZvcm1hdDogJ1fYjCBkIE4gWScsXG4gICAgICAgIGZ1bGxUZXh0Rm9ybWF0OiAnV9iMIGQgTiBZIEg6STpTJyxcbiAgICB9KTtcblxuICAgIHB1YmxpYyBqYWxhbGlMb2NhbGUgPSBuZXcgSmFsYWxpTG9jYWxlKCk7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgICBjaGVja0RhdGUoZGF0ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRlICE9PSAnc3RyaW5nJyB8fCBkYXRlLmxlbmd0aCAhPT0gMTApIHJldHVybiAnJztcbiAgICAgICAgaWYgKCFkYXRlLm1hdGNoKC8oWzAtOV17NH0tWzAtOV17Mn0tWzAtOV17Mn0pLykpIHJldHVybiAnJztcblxuICAgICAgICBjb25zdCBbeWVhciwgbW9udGgsIGRheV0gPSBkYXRlLnNwbGl0KCctJyk7XG4gICAgICAgIGlmIChOdW1iZXIoeWVhcikgPCAxMDAwIHx8IE51bWJlcih5ZWFyKSA+IDQwMDApIHJldHVybiAnJztcbiAgICAgICAgaWYgKE51bWJlcihtb250aCkgPCAxIHx8IE51bWJlcihtb250aCkgPiAxMikgcmV0dXJuICcnO1xuICAgICAgICBpZiAoTnVtYmVyKGRheSkgPCAxIHx8IE51bWJlcihkYXkpID4gMzEpIHJldHVybiAnJztcbiAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgfVxuXG4gICAgY2hlY2tUaW1lKHRpbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0eXBlb2YgdGltZSAhPT0gJ3N0cmluZycgfHwgdGltZS5sZW5ndGggIT09IDgpIHJldHVybiAnJztcbiAgICAgICAgaWYgKCF0aW1lLm1hdGNoKC8oWzAtOV17Mn06WzAtOV17Mn06WzAtOV17Mn0pLykpIHJldHVybiAnJztcblxuICAgICAgICBjb25zdCBbaG91ciwgbWludXRlLCBzZWNvbmRdID0gdGltZS5zcGxpdCgnLScpO1xuICAgICAgICBpZiAoTnVtYmVyKGhvdXIpIDwgMCB8fCBOdW1iZXIoaG91cikgPiAyMykgcmV0dXJuICcnO1xuICAgICAgICBpZiAoTnVtYmVyKG1pbnV0ZSkgPCAwIHx8IE51bWJlcihtaW51dGUpID4gNTkpIHJldHVybiAnJztcbiAgICAgICAgaWYgKE51bWJlcihzZWNvbmQpIDwgMCB8fCBOdW1iZXIoc2Vjb25kKSA+IDU5KSByZXR1cm4gJyc7XG4gICAgICAgIHJldHVybiB0aW1lO1xuICAgIH1cblxuICAgIGNoZWNrTW9udGgoZGF0ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRlICE9PSAnc3RyaW5nJyB8fCBkYXRlLmxlbmd0aCAhPT0gNykgcmV0dXJuICcnO1xuICAgICAgICBpZiAoIWRhdGUubWF0Y2goLyhbMC05XXs0fS1bMC05XXsyfSkvKSkgcmV0dXJuICcnO1xuXG4gICAgICAgIGNvbnN0IFt5ZWFyLCBtb250aF0gPSBkYXRlLnNwbGl0KCctJyk7XG4gICAgICAgIGlmIChOdW1iZXIoeWVhcikgPCAxMDAwIHx8IE51bWJlcih5ZWFyKSA+IDQwMDApIHJldHVybiAnJztcbiAgICAgICAgaWYgKE51bWJlcihtb250aCkgPCAxIHx8IE51bWJlcihtb250aCkgPiAxMikgcmV0dXJuICcnO1xuICAgICAgICByZXR1cm4gZGF0ZTtcbiAgICB9XG5cbiAgICBjaGVja0FwcGVhcmFuY2UoYXBwZWFyYW5jZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIFsnbGVnYWN5JywgJ3N0YW5kYXJkJywgJ2ZpbGwnLCAnb3V0bGluZSddLmluY2x1ZGVzKGFwcGVhcmFuY2UpID8gYXBwZWFyYW5jZSA6ICdsZWdhY3knO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0Rm9udENTUyhjc3M6IHsgW2tleTogc3RyaW5nXTogYW55IH0sIGZvbnQ6IHN0cmluZyk6IHsgW2tleTogc3RyaW5nXTogYW55IH0ge1xuICAgICAgICByZXR1cm4geyAuLi5jc3MsIGZvbnRGYW1pbHk6IGZvbnQgfTtcbiAgICB9XG5cbiAgICBjaGVja0NTUyhjc3M6IE5nSmFsYWxpRGF0ZVRpbWVDc3NJbnRlcmZhY2UpOiBOZ0phbGFsaURhdGVUaW1lQ3NzSW50ZXJmYWNlIHtcbiAgICAgICAgaWYgKCFjc3MpIGNzcyA9IHt9O1xuICAgICAgICBjc3MuZm9udCA9IGNzcy5mb250ID8gY3NzLmZvbnQgOiBcIlJvYm90bywgJ0hlbHZldGljYSBOZXVlJywgc2Fucy1zZXJpZlwiO1xuXG4gICAgICAgIGNzcy5maWVsZCA9IGNzcy5maWVsZCA/IGNzcy5maWVsZCA6IHt9O1xuICAgICAgICBjc3MuaW5wdXQgPSB0aGlzLnNldEZvbnRDU1MoY3NzLmlucHV0ID8gY3NzLmlucHV0IDoge30sIGNzcy5mb250KTtcbiAgICAgICAgY3NzLnJlc2V0ID0gY3NzLnJlc2V0ID8gY3NzLnJlc2V0IDoge307XG4gICAgICAgIGNzcy5ib3ggPSBjc3MuYm94ID8gY3NzLmJveCA6IHt9O1xuICAgICAgICBjc3MuYXJyb3cgPSBjc3MuYXJyb3cgPyBjc3MuYXJyb3cgOiB7fTtcbiAgICAgICAgY3NzLmhlYWRlciA9IHRoaXMuc2V0Rm9udENTUyhjc3MuaGVhZGVyID8gY3NzLmhlYWRlciA6IHt9LCBjc3MuZm9udCk7XG4gICAgICAgIGNzcy5pdGVtID0gdGhpcy5zZXRGb250Q1NTKGNzcy5pdGVtID8gY3NzLml0ZW0gOiB7fSwgY3NzLmZvbnQpO1xuICAgICAgICBjc3Muc2VsZWN0ZWQgPSBjc3Muc2VsZWN0ZWQgPyBjc3Muc2VsZWN0ZWQgOiB7fTtcbiAgICAgICAgY3NzLnNlbGVjdGVkID0geyAuLi5jc3MuaXRlbSwgLi4uY3NzLnNlbGVjdGVkIH07XG4gICAgICAgIGNzcy5jdXJyZW50ID0gY3NzLmN1cnJlbnQgPyBjc3MuY3VycmVudCA6IHt9O1xuICAgICAgICBjc3MuY3VycmVudCA9IHsgLi4uY3NzLml0ZW0sIC4uLmNzcy5jdXJyZW50IH07XG5cbiAgICAgICAgaWYgKCFjc3MuZGF0ZSkgY3NzLmRhdGUgPSB7fTtcbiAgICAgICAgY3NzLmRhdGUubmFtZSA9IHRoaXMuc2V0Rm9udENTUyhjc3MuZGF0ZS5uYW1lID8gY3NzLmRhdGUubmFtZSA6IHt9LCBjc3MuZm9udCk7XG4gICAgICAgIGNzcy5kYXRlLnRpbWUgPSB0aGlzLnNldEZvbnRDU1MoY3NzLmRhdGUudGltZSA/IGNzcy5kYXRlLnRpbWUgOiB7fSwgY3NzLmZvbnQpO1xuXG4gICAgICAgIGlmICghY3NzLm1vbnRoKSBjc3MubW9udGggPSB7fTtcblxuICAgICAgICBpZiAoIWNzcy5yYW5nZSkgY3NzLnJhbmdlID0ge307XG4gICAgICAgIGNzcy5yYW5nZS50b29sID0gdGhpcy5zZXRGb250Q1NTKGNzcy5yYW5nZS50b29sID8gY3NzLnJhbmdlLnRvb2wgOiB7fSwgY3NzLmZvbnQpO1xuICAgICAgICBjc3MucmFuZ2UuY3VzdG9tID0gY3NzLnJhbmdlLmN1c3RvbSA/IGNzcy5yYW5nZS5jdXN0b20gOiB7fTtcbiAgICAgICAgY3NzLnJhbmdlLmN1c3RvbSA9IHsgLi4uY3NzLnJhbmdlLnRvb2wsIC4uLmNzcy5yYW5nZS5jdXN0b20gfTtcbiAgICAgICAgY3NzLnJhbmdlLmNvbmZpcm0gPSBjc3MucmFuZ2UuY29uZmlybSA/IGNzcy5yYW5nZS5jb25maXJtIDoge307XG4gICAgICAgIGNzcy5yYW5nZS5jb25maXJtID0ge1xuICAgICAgICAgICAgLi4uY3NzLnJhbmdlLnRvb2wsXG4gICAgICAgICAgICAuLi5jc3MucmFuZ2UuY3VzdG9tLFxuICAgICAgICAgICAgLi4uY3NzLnJhbmdlLmNvbmZpcm0sXG4gICAgICAgIH07XG4gICAgICAgIGNzcy5yYW5nZS5uYW1lID0gdGhpcy5zZXRGb250Q1NTKGNzcy5yYW5nZS5uYW1lID8gY3NzLnJhbmdlLm5hbWUgOiB7fSwgY3NzLmZvbnQpO1xuICAgICAgICBjc3MucmFuZ2UuZGF0ZSA9IHRoaXMuc2V0Rm9udENTUyhjc3MucmFuZ2UuZGF0ZSA/IGNzcy5yYW5nZS5kYXRlIDoge30sIGNzcy5mb250KTtcblxuICAgICAgICByZXR1cm4gY3NzO1xuICAgIH1cblxuICAgIGphbGFsaVRvR3JlZ29yaWFuKGphbGFsaTogc3RyaW5nLCB0aW1lPzogc3RyaW5nKTogRGF0ZSB7XG4gICAgICAgIGNvbnN0IGdyZWdvcmlhbjogc3RyaW5nID0gdGhpcy5qYWxhbGkuZ3JlZ29yaWFuKGphbGFsaSkuZGF0ZTtcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKGdyZWdvcmlhbiArICdUJyArICh0aGlzLmNoZWNrVGltZSh0aW1lKSA/IHRpbWUgOiAnMTI6MDA6MDAnKSk7XG4gICAgfVxuXG4gICAgZ2V0Q2FsZW5kYXIobW9udGg6IHN0cmluZyk6IEphbGFsaUNhbGVuZGFySW50ZXJmYWNlIHtcbiAgICAgICAgY29uc3Qgbm93OiBEYXRlID0gdGhpcy5qYWxhbGlUb0dyZWdvcmlhbihtb250aCArICctMDEnKTtcbiAgICAgICAgY29uc3QgdGl0bGUgPSB0aGlzLmphbGFsaS50b0Z1bGxUZXh0KG5vdywgeyBmb3JtYXQ6ICdOIFknIH0pO1xuXG4gICAgICAgIGxldCBiZWdpbjogRGF0ZSA9IG5vdztcbiAgICAgICAgd2hpbGUgKGJlZ2luLmdldERheSgpICE9PSA2KSBiZWdpbiA9IG5ldyBEYXRlKGJlZ2luLmdldFRpbWUoKSAtIDI0ICogMzYwMCAqIDEwMDApO1xuXG4gICAgICAgIGNvbnN0IHdlZWtzOiBKYWxhbGlXZWVrSW50ZXJmYWNlW10gPSBbXTtcbiAgICAgICAgbGV0IGRheXM6IEphbGFsaURheUludGVyZmFjZVtdID0gW107XG4gICAgICAgIGxldCBkYXRlID0gdGhpcy5qYWxhbGkudG9EYXRlKGJlZ2luKTtcbiAgICAgICAgd2hpbGUgKGRhdGUuc3Vic3RyKDAsIDcpIDw9IG1vbnRoIHx8IGRheXMubGVuZ3RoICUgNyAhPT0gMCkge1xuICAgICAgICAgICAgZGF5cy5wdXNoKHtcbiAgICAgICAgICAgICAgICBkYXRlLFxuICAgICAgICAgICAgICAgIG1vbnRoOiBkYXRlLnN1YnN0cigwLCA3KSxcbiAgICAgICAgICAgICAgICBkYXk6IE51bWJlcihkYXRlLnN1YnN0cig4KSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChkYXlzLmxlbmd0aCA9PT0gNykge1xuICAgICAgICAgICAgICAgIHdlZWtzLnB1c2goeyBkYXlzIH0pO1xuICAgICAgICAgICAgICAgIGRheXMgPSBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYmVnaW4gPSBuZXcgRGF0ZShiZWdpbi5nZXRUaW1lKCkgKyAyNCAqIDM2MDAgKiAxMDAwKTtcbiAgICAgICAgICAgIGRhdGUgPSB0aGlzLmphbGFsaS50b0RhdGUoYmVnaW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgbW9udGgsIHRpdGxlLCB3ZWVrcyB9O1xuICAgIH1cblxuICAgIGdldERheUluTW9udGgobW9udGg6IHN0cmluZyk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IFtZLCBNXSA9IG1vbnRoLnNwbGl0KCctJyk7XG4gICAgICAgIGlmIChOdW1iZXIoTSkgPCA3KSByZXR1cm4gMzE7XG4gICAgICAgIGlmIChOdW1iZXIoTSkgPCAxMikgcmV0dXJuIDMwO1xuXG4gICAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLmphbGFsaVRvR3JlZ29yaWFuKG1vbnRoICsgJy0zMCcpO1xuICAgICAgICBjb25zdCBjaGVjayA9IHRoaXMuamFsYWxpLnRvU3RyaW5nKGRhdGUsIHsgZm9ybWF0OiAnWS1NLUQnIH0pLnN1YnN0cigwLCA3KTtcbiAgICAgICAgcmV0dXJuIGNoZWNrID09PSBtb250aCA/IDMwIDogMjk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBEQVRFVElNRVxuICAgICAqL1xuICAgIGdldERhdGVUaW1lVmFsdWUoamFsYWxpOiBzdHJpbmcsIHRpbWU6IHN0cmluZyk6IE5nSmFsYWxpRGF0ZVRpbWVWYWx1ZUludGVyZmFjZSB7XG4gICAgICAgIGNvbnN0IGdyZWdvcmlhbjogc3RyaW5nID0gamFsYWxpID8gdGhpcy5qYWxhbGkuZ3JlZ29yaWFuKGphbGFsaSkuZGF0ZSA6ICcnO1xuICAgICAgICBjb25zdCBkYXRlOiBEYXRlID0gZ3JlZ29yaWFuID8gbmV3IERhdGUoZ3JlZ29yaWFuICsgJ1QnICsgKHRpbWUgPyB0aW1lIDogJzEyOjAwOjAwJykpIDogbnVsbDtcbiAgICAgICAgY29uc3QgdGltZXN0YW1wOiBudW1iZXIgPSBncmVnb3JpYW4gPyBNYXRoLmZsb29yKGRhdGUuZ2V0VGltZSgpIC8gMTAwMCkgOiBudWxsO1xuICAgICAgICB0aW1lID0gdGltZSA/IHRpbWUgOiAnMDA6MDA6MDAnO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBqYWxhbGksXG4gICAgICAgICAgICBncmVnb3JpYW4sXG4gICAgICAgICAgICBkYXRlLFxuICAgICAgICAgICAgdGltZSxcbiAgICAgICAgICAgIHRpbWVzdGFtcCxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBnZXREYXRlVGltZVRpdGxlKHZhbHVlOiBOZ0phbGFsaURhdGVUaW1lVmFsdWVJbnRlcmZhY2UsIHRpbWU6IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgICAgICBpZiAoIXZhbHVlLmphbGFsaSkgcmV0dXJuICcnO1xuICAgICAgICByZXR1cm4gdGltZSA/IHRoaXMuamFsYWxpLnRvRnVsbFRleHQodmFsdWUuZGF0ZSkgOiB0aGlzLmphbGFsaS50b1RpdGxlKHZhbHVlLmRhdGUpO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogTU9OVEhcbiAgICAgKi9cbiAgICBnZXRNb250aFZhbHVlKG1vbnRoOiBzdHJpbmcpOiBOZ0phbGFsaU1vbnRoVmFsdWVJbnRlcmZhY2Uge1xuICAgICAgICBsZXQgZGF5czogbnVtYmVyID0gMDtcbiAgICAgICAgY29uc3QgZ3JlZ29yaWFuID0geyBmaXJzdDogJycsIGxhc3Q6ICcnIH07XG5cbiAgICAgICAgaWYgKG1vbnRoKSB7XG4gICAgICAgICAgICBkYXlzID0gdGhpcy5nZXREYXlJbk1vbnRoKG1vbnRoKTtcbiAgICAgICAgICAgIGdyZWdvcmlhbi5maXJzdCA9IHRoaXMuamFsYWxpLmdyZWdvcmlhbihtb250aCArICctMDEnKS5kYXRlO1xuICAgICAgICAgICAgZ3JlZ29yaWFuLmxhc3QgPSB0aGlzLmphbGFsaS5ncmVnb3JpYW4obW9udGggKyAnLScgKyBkYXlzLnRvU3RyaW5nKCkpLmRhdGU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbW9udGgsXG4gICAgICAgICAgICBkYXlzLFxuICAgICAgICAgICAgZ3JlZ29yaWFuLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGdldE1vbnRoVGl0bGUodmFsdWU6IE5nSmFsYWxpTW9udGhWYWx1ZUludGVyZmFjZSk6IHN0cmluZyB7XG4gICAgICAgIGlmICghdmFsdWUubW9udGgpIHJldHVybiAnJztcblxuICAgICAgICBjb25zdCBkYXRlOiBEYXRlID0gdGhpcy5qYWxhbGlUb0dyZWdvcmlhbih2YWx1ZS5tb250aCArICctMDEnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuamFsYWxpLnRvVGl0bGUoZGF0ZSwgeyBmb3JtYXQ6ICdOIFknIH0pO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogUkFOR0VcbiAgICAgKi9cbiAgICBnZXRSYW5nZVZhbHVlKGZyb206IHN0cmluZywgdG86IHN0cmluZyk6IE5nSmFsYWxpUmFuZ2VWYWx1ZUludGVyZmFjZSB7XG4gICAgICAgIGxldCBkYXlzOiBudW1iZXIgPSAwO1xuICAgICAgICBsZXQgaG91cnM6IG51bWJlciA9IDA7XG4gICAgICAgIGxldCBtaW51dGVzOiBudW1iZXIgPSAwO1xuICAgICAgICBsZXQgc2Vjb25kczogbnVtYmVyID0gMDtcbiAgICAgICAgY29uc3QgZ3JlZ29yaWFuID0geyBmcm9tOiAnJywgdG86ICcnIH07XG5cbiAgICAgICAgaWYgKGZyb20gJiYgdG8pIHtcbiAgICAgICAgICAgIGdyZWdvcmlhbi5mcm9tID0gdGhpcy5qYWxhbGkuZ3JlZ29yaWFuKGZyb20pLmRhdGU7XG4gICAgICAgICAgICBncmVnb3JpYW4udG8gPSB0aGlzLmphbGFsaS5ncmVnb3JpYW4odG8pLmRhdGU7XG5cbiAgICAgICAgICAgIGNvbnN0IGZUaW1lc3RhbXA6IG51bWJlciA9IE1hdGguZmxvb3IobmV3IERhdGUoZ3JlZ29yaWFuLmZyb20gKyAnVDEyOjAwOjAwJykuZ2V0VGltZSgpIC8gMTAwMCk7XG4gICAgICAgICAgICBjb25zdCB0VGltZXN0YW1wOiBudW1iZXIgPSBNYXRoLmZsb29yKG5ldyBEYXRlKGdyZWdvcmlhbi50byArICdUMTI6MDA6MDAnKS5nZXRUaW1lKCkgLyAxMDAwKTtcbiAgICAgICAgICAgIGRheXMgPSBNYXRoLmZsb29yKE1hdGguYWJzKCh0VGltZXN0YW1wIC0gZlRpbWVzdGFtcCkgLyAoMjQgKiAzNjAwKSkpICsgMTtcbiAgICAgICAgICAgIGhvdXJzID0gZGF5cyAqIDI0O1xuICAgICAgICAgICAgbWludXRlcyA9IGhvdXJzICogNjA7XG4gICAgICAgICAgICBzZWNvbmRzID0gbWludXRlcyAqIDYwO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJhbmdlOiBmcm9tICYmIHRvID8gZnJvbSArICd8JyArIHRvIDogJycsXG4gICAgICAgICAgICBmcm9tLFxuICAgICAgICAgICAgdG8sXG4gICAgICAgICAgICBkYXlzLFxuICAgICAgICAgICAgaG91cnMsXG4gICAgICAgICAgICBtaW51dGVzLFxuICAgICAgICAgICAgc2Vjb25kcyxcbiAgICAgICAgICAgIGdyZWdvcmlhbixcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBnZXRSYW5nZVRpdGxlKHZhbHVlOiBOZ0phbGFsaVJhbmdlVmFsdWVJbnRlcmZhY2UpOiBzdHJpbmcge1xuICAgICAgICBpZiAoIXZhbHVlLmZyb20gfHwgIXZhbHVlLnRvKSByZXR1cm4gJyc7XG5cbiAgICAgICAgY29uc3QgZkRhdGUgPSB0aGlzLmphbGFsaVRvR3JlZ29yaWFuKHZhbHVlLmZyb20pO1xuICAgICAgICBjb25zdCB0RGF0ZSA9IHRoaXMuamFsYWxpVG9HcmVnb3JpYW4odmFsdWUudG8pO1xuXG4gICAgICAgIGNvbnN0IFtmWSwgZk0sIGZEXSA9IHZhbHVlLmZyb20uc3BsaXQoJy0nKTtcbiAgICAgICAgY29uc3QgW3RZLCB0TSwgdERdID0gdmFsdWUudG8uc3BsaXQoJy0nKTtcblxuICAgICAgICBsZXQgZnJvbTogc3RyaW5nID0gJyc7XG4gICAgICAgIGlmIChmWSA9PT0gdFkgJiYgZk0gPT09IHRNKSB7XG4gICAgICAgICAgICBmcm9tID0gdGhpcy5qYWxhbGkudG9UaXRsZShmRGF0ZSwgeyBmb3JtYXQ6ICdkJyB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChmWSA9PT0gdFkpIHtcbiAgICAgICAgICAgIGZyb20gPSB0aGlzLmphbGFsaS50b1RpdGxlKGZEYXRlLCB7IGZvcm1hdDogJ2QgTicgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmcm9tID0gdGhpcy5qYWxhbGkudG9UaXRsZShmRGF0ZSwgeyBmb3JtYXQ6ICdkIE4gWScgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZyb20gKyAnICcgKyB0aGlzLmphbGFsaUxvY2FsZS5yYW5nZVRvICsgJyAnICsgdGhpcy5qYWxhbGkudG9UaXRsZSh0RGF0ZSwgeyBmb3JtYXQ6ICdkIE4gWScgfSk7XG4gICAgfVxufVxuIl19