@f1softinternational/f1-nepali-date-picker 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,258 @@
1
+ import { BS_CALENDAR_DATA, BS_MONTHS_EN, BS_MONTHS_NP, BS_MIN_YEAR, BS_MAX_YEAR, AD_EPOCH, BS_EPOCH, getDaysInBSMonth, toNepaliDigits, } from '../utils/bs-calendar-data';
2
+ /**
3
+ * NepaliDate - Represents a date in the Bikram Sambat (BS) calendar
4
+ */
5
+ export class NepaliDate {
6
+ constructor(year, month, day) {
7
+ this._year = year;
8
+ this._month = month;
9
+ this._day = day;
10
+ }
11
+ // Getters
12
+ get year() {
13
+ return this._year;
14
+ }
15
+ get month() {
16
+ return this._month;
17
+ }
18
+ get day() {
19
+ return this._day;
20
+ }
21
+ /**
22
+ * Create NepaliDate from current date
23
+ */
24
+ static today() {
25
+ return NepaliDate.fromAD(new Date());
26
+ }
27
+ /**
28
+ * Create NepaliDate from AD Date
29
+ */
30
+ static fromAD(adDate) {
31
+ // Calculate days from epoch
32
+ const epochTime = AD_EPOCH.getTime();
33
+ const targetTime = new Date(adDate.getFullYear(), adDate.getMonth(), adDate.getDate()).getTime();
34
+ let daysDiff = Math.floor((targetTime - epochTime) / (1000 * 60 * 60 * 24));
35
+ if (daysDiff < 0) {
36
+ throw new Error('Date is before supported range');
37
+ }
38
+ let bsYear = BS_EPOCH.year;
39
+ let bsMonth = BS_EPOCH.month;
40
+ let bsDay = BS_EPOCH.day;
41
+ // Add days
42
+ while (daysDiff > 0) {
43
+ const daysInMonth = getDaysInBSMonth(bsYear, bsMonth);
44
+ const daysRemainingInMonth = daysInMonth - bsDay;
45
+ if (daysDiff <= daysRemainingInMonth) {
46
+ bsDay += daysDiff;
47
+ daysDiff = 0;
48
+ }
49
+ else {
50
+ daysDiff -= daysRemainingInMonth + 1;
51
+ bsMonth++;
52
+ bsDay = 1;
53
+ if (bsMonth > 12) {
54
+ bsMonth = 1;
55
+ bsYear++;
56
+ if (bsYear > BS_MAX_YEAR) {
57
+ throw new Error(`Date exceeds supported range (max: ${BS_MAX_YEAR} BS)`);
58
+ }
59
+ }
60
+ }
61
+ }
62
+ return new NepaliDate(bsYear, bsMonth, bsDay);
63
+ }
64
+ /**
65
+ * Convert to AD Date
66
+ */
67
+ toAD() {
68
+ if (!this.isValid()) {
69
+ throw new Error('Invalid NepaliDate');
70
+ }
71
+ let totalDays = 0;
72
+ // Add days for complete years
73
+ for (let year = BS_EPOCH.year; year < this._year; year++) {
74
+ const yearData = BS_CALENDAR_DATA[year];
75
+ if (yearData) {
76
+ totalDays += yearData.reduce((sum, days) => sum + days, 0);
77
+ }
78
+ }
79
+ // Add days for complete months in current year
80
+ for (let month = 1; month < this._month; month++) {
81
+ totalDays += getDaysInBSMonth(this._year, month);
82
+ }
83
+ // Add remaining days
84
+ totalDays += this._day - 1;
85
+ // Calculate AD date from epoch
86
+ const adDate = new Date(AD_EPOCH);
87
+ adDate.setDate(adDate.getDate() + totalDays);
88
+ return adDate;
89
+ }
90
+ /**
91
+ * Check if the date is valid
92
+ */
93
+ isValid() {
94
+ // Check year range
95
+ if (this._year < BS_MIN_YEAR || this._year > BS_MAX_YEAR) {
96
+ return false;
97
+ }
98
+ // Check month range
99
+ if (this._month < 1 || this._month > 12) {
100
+ return false;
101
+ }
102
+ // Check day range
103
+ const daysInMonth = getDaysInBSMonth(this._year, this._month);
104
+ if (this._day < 1 || this._day > daysInMonth) {
105
+ return false;
106
+ }
107
+ return true;
108
+ }
109
+ /**
110
+ * Get the day of week (0 = Sunday, 6 = Saturday)
111
+ */
112
+ getDay() {
113
+ return this.toAD().getDay();
114
+ }
115
+ /**
116
+ * Get month name in specified language
117
+ */
118
+ getMonthName(lang = 'en') {
119
+ return lang === 'np' ? BS_MONTHS_NP[this._month - 1] : BS_MONTHS_EN[this._month - 1];
120
+ }
121
+ /**
122
+ * Format date according to pattern
123
+ * Patterns:
124
+ * YYYY - 4-digit year
125
+ * YY - 2-digit year
126
+ * MM - 2-digit month
127
+ * M - month without leading zero
128
+ * DD - 2-digit day
129
+ * D - day without leading zero
130
+ * MMMM - full month name (English)
131
+ * mmmm - full month name (Nepali)
132
+ */
133
+ format(pattern = 'YYYY-MM-DD', useNepaliDigits = false) {
134
+ let result = pattern;
135
+ // Replace patterns (order matters - longer patterns first)
136
+ result = result.replace(/YYYY/g, String(this._year).padStart(4, '0'));
137
+ result = result.replace(/YY/g, String(this._year).slice(-2));
138
+ result = result.replace(/MMMM/g, BS_MONTHS_EN[this._month - 1]);
139
+ result = result.replace(/mmmm/g, BS_MONTHS_NP[this._month - 1]);
140
+ result = result.replace(/MM/g, String(this._month).padStart(2, '0'));
141
+ result = result.replace(/M/g, String(this._month));
142
+ result = result.replace(/DD/g, String(this._day).padStart(2, '0'));
143
+ result = result.replace(/D/g, String(this._day));
144
+ if (useNepaliDigits) {
145
+ result = toNepaliDigits(result);
146
+ }
147
+ return result;
148
+ }
149
+ /**
150
+ * Create a clone of this date
151
+ */
152
+ clone() {
153
+ return new NepaliDate(this._year, this._month, this._day);
154
+ }
155
+ /**
156
+ * Compare with another NepaliDate
157
+ * Returns: -1 if this < other, 0 if equal, 1 if this > other
158
+ */
159
+ compareTo(other) {
160
+ if (this._year !== other._year) {
161
+ return this._year < other._year ? -1 : 1;
162
+ }
163
+ if (this._month !== other._month) {
164
+ return this._month < other._month ? -1 : 1;
165
+ }
166
+ if (this._day !== other._day) {
167
+ return this._day < other._day ? -1 : 1;
168
+ }
169
+ return 0;
170
+ }
171
+ /**
172
+ * Check if this date is before another
173
+ */
174
+ isBefore(other) {
175
+ return this.compareTo(other) < 0;
176
+ }
177
+ /**
178
+ * Check if this date is after another
179
+ */
180
+ isAfter(other) {
181
+ return this.compareTo(other) > 0;
182
+ }
183
+ /**
184
+ * Check if this date equals another
185
+ */
186
+ equals(other) {
187
+ return this.compareTo(other) === 0;
188
+ }
189
+ /**
190
+ * Add days to date (returns new NepaliDate)
191
+ */
192
+ addDays(days) {
193
+ const adDate = this.toAD();
194
+ adDate.setDate(adDate.getDate() + days);
195
+ return NepaliDate.fromAD(adDate);
196
+ }
197
+ /**
198
+ * Add months to date (returns new NepaliDate)
199
+ */
200
+ addMonths(months) {
201
+ let newYear = this._year;
202
+ let newMonth = this._month + months;
203
+ while (newMonth > 12) {
204
+ newMonth -= 12;
205
+ newYear++;
206
+ }
207
+ while (newMonth < 1) {
208
+ newMonth += 12;
209
+ newYear--;
210
+ }
211
+ // Adjust day if it exceeds days in new month
212
+ const daysInNewMonth = getDaysInBSMonth(newYear, newMonth);
213
+ const newDay = Math.min(this._day, daysInNewMonth);
214
+ return new NepaliDate(newYear, newMonth, newDay);
215
+ }
216
+ /**
217
+ * Add years to date (returns new NepaliDate)
218
+ */
219
+ addYears(years) {
220
+ const newYear = this._year + years;
221
+ const daysInNewMonth = getDaysInBSMonth(newYear, this._month);
222
+ const newDay = Math.min(this._day, daysInNewMonth);
223
+ return new NepaliDate(newYear, this._month, newDay);
224
+ }
225
+ /**
226
+ * Get string representation
227
+ */
228
+ toString() {
229
+ return this.format('YYYY-MM-DD');
230
+ }
231
+ /**
232
+ * Convert to plain object
233
+ */
234
+ toObject() {
235
+ return {
236
+ year: this._year,
237
+ month: this._month,
238
+ day: this._day,
239
+ };
240
+ }
241
+ /**
242
+ * Create from plain object
243
+ */
244
+ static fromObject(obj) {
245
+ return new NepaliDate(obj.year, obj.month, obj.day);
246
+ }
247
+ /**
248
+ * Parse from string (YYYY-MM-DD format)
249
+ */
250
+ static parse(dateString) {
251
+ const parts = dateString.split('-').map(Number);
252
+ if (parts.length !== 3 || parts.some(isNaN)) {
253
+ throw new Error('Invalid date format. Expected YYYY-MM-DD');
254
+ }
255
+ return new NepaliDate(parts[0], parts[1], parts[2]);
256
+ }
257
+ }
258
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVwYWxpLWRhdGUubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mMS1uZXBhbGktZGF0ZS1waWNrZXIvc3JjL2xpYi9tb2RlbHMvbmVwYWxpLWRhdGUubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILGdCQUFnQixFQUNoQixZQUFZLEVBQ1osWUFBWSxFQUNaLFdBQVcsRUFDWCxXQUFXLEVBQ1gsUUFBUSxFQUNSLFFBQVEsRUFDUixnQkFBZ0IsRUFDaEIsY0FBYyxHQUNqQixNQUFNLDJCQUEyQixDQUFDO0FBRW5DOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFVBQVU7SUFLbkIsWUFBWSxJQUFZLEVBQUUsS0FBYSxFQUFFLEdBQVc7UUFDaEQsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDbEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDcEIsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7SUFDcEIsQ0FBQztJQUVELFVBQVU7SUFDVixJQUFJLElBQUk7UUFDSixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDdEIsQ0FBQztJQUVELElBQUksS0FBSztRQUNMLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQsSUFBSSxHQUFHO1FBQ0gsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxLQUFLO1FBQ1IsT0FBTyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQVk7UUFDdEIsNEJBQTRCO1FBQzVCLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNyQyxNQUFNLFVBQVUsR0FBRyxJQUFJLElBQUks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TyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0QsTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEUsTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEUsTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDbkQsTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ25FLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFakQsSUFBSSxlQUFlLEVBQUU7WUFDakIsTUFBTSxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNuQztRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENB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dGVudCI6WyJpbXBvcnQge1xuICAgIEJTX0NBTEVOREFSX0RBVEEsXG4gICAgQlNfTU9OVEhTX0VOLFxuICAgIEJTX01PTlRIU19OUCxcbiAgICBCU19NSU5fWUVBUixcbiAgICBCU19NQVhfWUVBUixcbiAgICBBRF9FUE9DSCxcbiAgICBCU19FUE9DSCxcbiAgICBnZXREYXlzSW5CU01vbnRoLFxuICAgIHRvTmVwYWxpRGlnaXRzLFxufSBmcm9tICcuLi91dGlscy9icy1jYWxlbmRhci1kYXRhJztcblxuLyoqXG4gKiBOZXBhbGlEYXRlIC0gUmVwcmVzZW50cyBhIGRhdGUgaW4gdGhlIEJpa3JhbSBTYW1iYXQgKEJTKSBjYWxlbmRhclxuICovXG5leHBvcnQgY2xhc3MgTmVwYWxpRGF0ZSB7XG4gICAgcHJpdmF0ZSBfeWVhcjogbnVtYmVyO1xuICAgIHByaXZhdGUgX21vbnRoOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfZGF5OiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3Rvcih5ZWFyOiBudW1iZXIsIG1vbnRoOiBudW1iZXIsIGRheTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX3llYXIgPSB5ZWFyO1xuICAgICAgICB0aGlzLl9tb250aCA9IG1vbnRoO1xuICAgICAgICB0aGlzLl9kYXkgPSBkYXk7XG4gICAgfVxuXG4gICAgLy8gR2V0dGVyc1xuICAgIGdldCB5ZWFyKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl95ZWFyO1xuICAgIH1cblxuICAgIGdldCBtb250aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fbW9udGg7XG4gICAgfVxuXG4gICAgZ2V0IGRheSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBOZXBhbGlEYXRlIGZyb20gY3VycmVudCBkYXRlXG4gICAgICovXG4gICAgc3RhdGljIHRvZGF5KCk6IE5lcGFsaURhdGUge1xuICAgICAgICByZXR1cm4gTmVwYWxpRGF0ZS5mcm9tQUQobmV3IERhdGUoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIE5lcGFsaURhdGUgZnJvbSBBRCBEYXRlXG4gICAgICovXG4gICAgc3RhdGljIGZyb21BRChhZERhdGU6IERhdGUpOiBOZXBhbGlEYXRlIHtcbiAgICAgICAgLy8gQ2FsY3VsYXRlIGRheXMgZnJvbSBlcG9jaFxuICAgICAgICBjb25zdCBlcG9jaFRpbWUgPSBBRF9FUE9DSC5nZXRUaW1lKCk7XG4gICAgICAgIGNvbnN0IHRhcmdldFRpbWUgPSBuZXcgRGF0ZShhZERhdGUuZ2V0RnVsbFllYXIoKSwgYWREYXRlLmdldE1vbnRoKCksIGFkRGF0ZS5nZXREYXRlKCkpLmdldFRpbWUoKTtcbiAgICAgICAgbGV0IGRheXNEaWZmID0gTWF0aC5mbG9vcigodGFyZ2V0VGltZSAtIGVwb2NoVGltZSkgLyAoMTAwMCAqIDYwICogNjAgKiAyNCkpO1xuXG4gICAgICAgIGlmIChkYXlzRGlmZiA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRGF0ZSBpcyBiZWZvcmUgc3VwcG9ydGVkIHJhbmdlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYnNZZWFyID0gQlNfRVBPQ0gueWVhcjtcbiAgICAgICAgbGV0IGJzTW9udGggPSBCU19FUE9DSC5tb250aDtcbiAgICAgICAgbGV0IGJzRGF5ID0gQlNfRVBPQ0guZGF5O1xuXG4gICAgICAgIC8vIEFkZCBkYXlzXG4gICAgICAgIHdoaWxlIChkYXlzRGlmZiA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGRheXNJbk1vbnRoID0gZ2V0RGF5c0luQlNNb250aChic1llYXIsIGJzTW9udGgpO1xuICAgICAgICAgICAgY29uc3QgZGF5c1JlbWFpbmluZ0luTW9udGggPSBkYXlzSW5Nb250aCAtIGJzRGF5O1xuXG4gICAgICAgICAgICBpZiAoZGF5c0RpZmYgPD0gZGF5c1JlbWFpbmluZ0luTW9udGgpIHtcbiAgICAgICAgICAgICAgICBic0RheSArPSBkYXlzRGlmZjtcbiAgICAgICAgICAgICAgICBkYXlzRGlmZiA9IDA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRheXNEaWZmIC09IGRheXNSZW1haW5pbmdJbk1vbnRoICsgMTtcbiAgICAgICAgICAgICAgICBic01vbnRoKys7XG4gICAgICAgICAgICAgICAgYnNEYXkgPSAxO1xuXG4gICAgICAgICAgICAgICAgaWYgKGJzTW9udGggPiAxMikge1xuICAgICAgICAgICAgICAgICAgICBic01vbnRoID0gMTtcbiAgICAgICAgICAgICAgICAgICAgYnNZZWFyKys7XG4gICAgICAgICAgICAgICAgICAgIGlmIChic1llYXIgPiBCU19NQVhfWUVBUikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEYXRlIGV4Y2VlZHMgc3VwcG9ydGVkIHJhbmdlIChtYXg6ICR7QlNfTUFYX1lFQVJ9IEJTKWApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBOZXBhbGlEYXRlKGJzWWVhciwgYnNNb250aCwgYnNEYXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgdG8gQUQgRGF0ZVxuICAgICAqL1xuICAgIHRvQUQoKTogRGF0ZSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBOZXBhbGlEYXRlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdG90YWxEYXlzID0gMDtcblxuICAgICAgICAvLyBBZGQgZGF5cyBmb3IgY29tcGxldGUgeWVhcnNcbiAgICAgICAgZm9yIChsZXQgeWVhciA9IEJTX0VQT0NILnllYXI7IHllYXIgPCB0aGlzLl95ZWFyOyB5ZWFyKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHllYXJEYXRhID0gQlNfQ0FMRU5EQVJfREFUQVt5ZWFyXTtcbiAgICAgICAgICAgIGlmICh5ZWFyRGF0YSkge1xuICAgICAgICAgICAgICAgIHRvdGFsRGF5cyArPSB5ZWFyRGF0YS5yZWR1Y2UoKHN1bSwgZGF5cykgPT4gc3VtICsgZGF5cywgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgZGF5cyBmb3IgY29tcGxldGUgbW9udGhzIGluIGN1cnJlbnQgeWVhclxuICAgICAgICBmb3IgKGxldCBtb250aCA9IDE7IG1vbnRoIDwgdGhpcy5fbW9udGg7IG1vbnRoKyspIHtcbiAgICAgICAgICAgIHRvdGFsRGF5cyArPSBnZXREYXlzSW5CU01vbnRoKHRoaXMuX3llYXIsIG1vbnRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCByZW1haW5pbmcgZGF5c1xuICAgICAgICB0b3RhbERheXMgKz0gdGhpcy5fZGF5IC0gMTtcblxuICAgICAgICAvLyBDYWxjdWxhdGUgQUQgZGF0ZSBmcm9tIGVwb2NoXG4gICAgICAgIGNvbnN0IGFkRGF0ZSA9IG5ldyBEYXRlKEFEX0VQT0NIKTtcbiAgICAgICAgYWREYXRlLnNldERhdGUoYWREYXRlLmdldERhdGUoKSArIHRvdGFsRGF5cyk7XG5cbiAgICAgICAgcmV0dXJuIGFkRGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGUgZGF0ZSBpcyB2YWxpZFxuICAgICAqL1xuICAgIGlzVmFsaWQoKTogYm9vbGVhbiB7XG4gICAgICAgIC8vIENoZWNrIHllYXIgcmFuZ2VcbiAgICAgICAgaWYgKHRoaXMuX3llYXIgPCBCU19NSU5fWUVBUiB8fCB0aGlzLl95ZWFyID4gQlNfTUFYX1lFQVIpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIG1vbnRoIHJhbmdlXG4gICAgICAgIGlmICh0aGlzLl9tb250aCA8IDEgfHwgdGhpcy5fbW9udGggPiAxMikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgZGF5IHJhbmdlXG4gICAgICAgIGNvbnN0IGRheXNJbk1vbnRoID0gZ2V0RGF5c0luQlNNb250aCh0aGlzLl95ZWFyLCB0aGlzLl9tb250aCk7XG4gICAgICAgIGlmICh0aGlzLl9kYXkgPCAxIHx8IHRoaXMuX2RheSA+IGRheXNJbk1vbnRoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGRheSBvZiB3ZWVrICgwID0gU3VuZGF5LCA2ID0gU2F0dXJkYXkpXG4gICAgICovXG4gICAgZ2V0RGF5KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvQUQoKS5nZXREYXkoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgbW9udGggbmFtZSBpbiBzcGVjaWZpZWQgbGFuZ3VhZ2VcbiAgICAgKi9cbiAgICBnZXRNb250aE5hbWUobGFuZzogJ2VuJyB8ICducCcgPSAnZW4nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGxhbmcgPT09ICducCcgPyBCU19NT05USFNfTlBbdGhpcy5fbW9udGggLSAxXSA6IEJTX01PTlRIU19FTlt0aGlzLl9tb250aCAtIDFdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvcm1hdCBkYXRlIGFjY29yZGluZyB0byBwYXR0ZXJuXG4gICAgICogUGF0dGVybnM6XG4gICAgICogICBZWVlZIC0gNC1kaWdpdCB5ZWFyXG4gICAgICogICBZWSAgIC0gMi1kaWdpdCB5ZWFyXG4gICAgICogICBNTSAgIC0gMi1kaWdpdCBtb250aFxuICAgICAqICAgTSAgICAtIG1vbnRoIHdpdGhvdXQgbGVhZGluZyB6ZXJvXG4gICAgICogICBERCAgIC0gMi1kaWdpdCBkYXlcbiAgICAgKiAgIEQgICAgLSBkYXkgd2l0aG91dCBsZWFkaW5nIHplcm9cbiAgICAgKiAgIE1NTU0gLSBmdWxsIG1vbnRoIG5hbWUgKEVuZ2xpc2gpXG4gICAgICogICBtbW1tIC0gZnVsbCBtb250aCBuYW1lIChOZXBhbGkpXG4gICAgICovXG4gICAgZm9ybWF0KHBhdHRlcm46IHN0cmluZyA9ICdZWVlZLU1NLUREJywgdXNlTmVwYWxpRGlnaXRzOiBib29sZWFuID0gZmFsc2UpOiBzdHJpbmcge1xuICAgICAgICBsZXQgcmVzdWx0ID0gcGF0dGVybjtcblxuICAgICAgICAvLyBSZXBsYWNlIHBhdHRlcm5zIChvcmRlciBtYXR0ZXJzIC0gbG9uZ2VyIHBhdHRlcm5zIGZpcnN0KVxuICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvWVlZWS9nLCBTdHJpbmcodGhpcy5feWVhcikucGFkU3RhcnQoNCwgJzAnKSk7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC9ZWS9nLCBTdHJpbmcodGhpcy5feWVhcikuc2xpY2UoLTIpKTtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoL01NTU0vZywgQlNfTU9OVEhTX0VOW3RoaXMuX21vbnRoIC0gMV0pO1xuICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvbW1tbS9nLCBCU19NT05USFNfTlBbdGhpcy5fbW9udGggLSAxXSk7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC9NTS9nLCBTdHJpbmcodGhpcy5fbW9udGgpLnBhZFN0YXJ0KDIsICcwJykpO1xuICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvTS9nLCBTdHJpbmcodGhpcy5fbW9udGgpKTtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoL0REL2csIFN0cmluZyh0aGlzLl9kYXkpLnBhZFN0YXJ0KDIsICcwJykpO1xuICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvRC9nLCBTdHJpbmcodGhpcy5fZGF5KSk7XG5cbiAgICAgICAgaWYgKHVzZU5lcGFsaURpZ2l0cykge1xuICAgICAgICAgICAgcmVzdWx0ID0gdG9OZXBhbGlEaWdpdHMocmVzdWx0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgY2xvbmUgb2YgdGhpcyBkYXRlXG4gICAgICovXG4gICAgY2xvbmUoKTogTmVwYWxpRGF0ZSB7XG4gICAgICAgIHJldHVybiBuZXcgTmVwYWxpRGF0ZSh0aGlzLl95ZWFyLCB0aGlzLl9tb250aCwgdGhpcy5fZGF5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wYXJlIHdpdGggYW5vdGhlciBOZXBhbGlEYXRlXG4gICAgICogUmV0dXJuczogLTEgaWYgdGhpcyA8IG90aGVyLCAwIGlmIGVxdWFsLCAxIGlmIHRoaXMgPiBvdGhlclxuICAgICAqL1xuICAgIGNvbXBhcmVUbyhvdGhlcjogTmVwYWxpRGF0ZSk6IG51bWJlciB7XG4gICAgICAgIGlmICh0aGlzLl95ZWFyICE9PSBvdGhlci5feWVhcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3llYXIgPCBvdGhlci5feWVhciA/IC0xIDogMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fbW9udGggIT09IG90aGVyLl9tb250aCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoIDwgb3RoZXIuX21vbnRoID8gLTEgOiAxO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9kYXkgIT09IG90aGVyLl9kYXkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kYXkgPCBvdGhlci5fZGF5ID8gLTEgOiAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoaXMgZGF0ZSBpcyBiZWZvcmUgYW5vdGhlclxuICAgICAqL1xuICAgIGlzQmVmb3JlKG90aGVyOiBOZXBhbGlEYXRlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbXBhcmVUbyhvdGhlcikgPCAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoaXMgZGF0ZSBpcyBhZnRlciBhbm90aGVyXG4gICAgICovXG4gICAgaXNBZnRlcihvdGhlcjogTmVwYWxpRGF0ZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb21wYXJlVG8ob3RoZXIpID4gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGlzIGRhdGUgZXF1YWxzIGFub3RoZXJcbiAgICAgKi9cbiAgICBlcXVhbHMob3RoZXI6IE5lcGFsaURhdGUpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZVRvKG90aGVyKSA9PT0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgZGF5cyB0byBkYXRlIChyZXR1cm5zIG5ldyBOZXBhbGlEYXRlKVxuICAgICAqL1xuICAgIGFkZERheXMoZGF5czogbnVtYmVyKTogTmVwYWxpRGF0ZSB7XG4gICAgICAgIGNvbnN0IGFkRGF0ZSA9IHRoaXMudG9BRCgpO1xuICAgICAgICBhZERhdGUuc2V0RGF0ZShhZERhdGUuZ2V0RGF0ZSgpICsgZGF5cyk7XG4gICAgICAgIHJldHVybiBOZXBhbGlEYXRlLmZyb21BRChhZERhdGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCBtb250aHMgdG8gZGF0ZSAocmV0dXJucyBuZXcgTmVwYWxpRGF0ZSlcbiAgICAgKi9cbiAgICBhZGRNb250aHMobW9udGhzOiBudW1iZXIpOiBOZXBhbGlEYXRlIHtcbiAgICAgICAgbGV0IG5ld1llYXIgPSB0aGlzLl95ZWFyO1xuICAgICAgICBsZXQgbmV3TW9udGggPSB0aGlzLl9tb250aCArIG1vbnRocztcblxuICAgICAgICB3aGlsZSAobmV3TW9udGggPiAxMikge1xuICAgICAgICAgICAgbmV3TW9udGggLT0gMTI7XG4gICAgICAgICAgICBuZXdZZWFyKys7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKG5ld01vbnRoIDwgMSkge1xuICAgICAgICAgICAgbmV3TW9udGggKz0gMTI7XG4gICAgICAgICAgICBuZXdZZWFyLS07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGp1c3QgZGF5IGlmIGl0IGV4Y2VlZHMgZGF5cyBpbiBuZXcgbW9udGhcbiAgICAgICAgY29uc3QgZGF5c0luTmV3TW9udGggPSBnZXREYXlzSW5CU01vbnRoKG5ld1llYXIsIG5ld01vbnRoKTtcbiAgICAgICAgY29uc3QgbmV3RGF5ID0gTWF0aC5taW4odGhpcy5fZGF5LCBkYXlzSW5OZXdNb250aCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBOZXBhbGlEYXRlKG5ld1llYXIsIG5ld01vbnRoLCBuZXdEYXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCB5ZWFycyB0byBkYXRlIChyZXR1cm5zIG5ldyBOZXBhbGlEYXRlKVxuICAgICAqL1xuICAgIGFkZFllYXJzKHllYXJzOiBudW1iZXIpOiBOZXBhbGlEYXRlIHtcbiAgICAgICAgY29uc3QgbmV3WWVhciA9IHRoaXMuX3llYXIgKyB5ZWFycztcbiAgICAgICAgY29uc3QgZGF5c0luTmV3TW9udGggPSBnZXREYXlzSW5CU01vbnRoKG5ld1llYXIsIHRoaXMuX21vbnRoKTtcbiAgICAgICAgY29uc3QgbmV3RGF5ID0gTWF0aC5taW4odGhpcy5fZGF5LCBkYXlzSW5OZXdNb250aCk7XG4gICAgICAgIHJldHVybiBuZXcgTmVwYWxpRGF0ZShuZXdZZWFyLCB0aGlzLl9tb250aCwgbmV3RGF5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgc3RyaW5nIHJlcHJlc2VudGF0aW9uXG4gICAgICovXG4gICAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0KCdZWVlZLU1NLUREJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydCB0byBwbGFpbiBvYmplY3RcbiAgICAgKi9cbiAgICB0b09iamVjdCgpOiB7IHllYXI6IG51bWJlcjsgbW9udGg6IG51bWJlcjsgZGF5OiBudW1iZXIgfSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB5ZWFyOiB0aGlzLl95ZWFyLFxuICAgICAgICAgICAgbW9udGg6IHRoaXMuX21vbnRoLFxuICAgICAgICAgICAgZGF5OiB0aGlzLl9kYXksXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGZyb20gcGxhaW4gb2JqZWN0XG4gICAgICovXG4gICAgc3RhdGljIGZyb21PYmplY3Qob2JqOiB7IHllYXI6IG51bWJlcjsgbW9udGg6IG51bWJlcjsgZGF5OiBudW1iZXIgfSk6IE5lcGFsaURhdGUge1xuICAgICAgICByZXR1cm4gbmV3IE5lcGFsaURhdGUob2JqLnllYXIsIG9iai5tb250aCwgb2JqLmRheSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyc2UgZnJvbSBzdHJpbmcgKFlZWVktTU0tREQgZm9ybWF0KVxuICAgICAqL1xuICAgIHN0YXRpYyBwYXJzZShkYXRlU3RyaW5nOiBzdHJpbmcpOiBOZXBhbGlEYXRlIHtcbiAgICAgICAgY29uc3QgcGFydHMgPSBkYXRlU3RyaW5nLnNwbGl0KCctJykubWFwKE51bWJlcik7XG4gICAgICAgIGlmIChwYXJ0cy5sZW5ndGggIT09IDMgfHwgcGFydHMuc29tZShpc05hTikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBkYXRlIGZvcm1hdC4gRXhwZWN0ZWQgWVlZWS1NTS1ERCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgTmVwYWxpRGF0ZShwYXJ0c1swXSwgcGFydHNbMV0sIHBhcnRzWzJdKTtcbiAgICB9XG59XG4iXX0=
@@ -0,0 +1,155 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { NepaliDate } from '../models/nepali-date.model';
3
+ import { BS_CALENDAR_DATA, BS_MONTHS_EN, BS_MONTHS_NP, BS_WEEKDAYS_EN, BS_WEEKDAYS_NP, BS_MIN_YEAR, BS_MAX_YEAR, getDaysInBSMonth, getTotalDaysInBSYear, toNepaliDigits, } from '../utils/bs-calendar-data';
4
+ import * as i0 from "@angular/core";
5
+ /**
6
+ * DateConverterService - Service for BS/AD date conversions and utilities
7
+ */
8
+ export class DateConverterService {
9
+ /**
10
+ * Convert AD Date to NepaliDate (BS)
11
+ */
12
+ convertToBS(adDate) {
13
+ return NepaliDate.fromAD(adDate);
14
+ }
15
+ /**
16
+ * Convert NepaliDate (BS) to AD Date
17
+ */
18
+ convertToAD(bsDate) {
19
+ return bsDate.toAD();
20
+ }
21
+ /**
22
+ * Get today's date in BS
23
+ */
24
+ getTodayBS() {
25
+ return NepaliDate.today();
26
+ }
27
+ /**
28
+ * Get number of days in a BS month
29
+ */
30
+ getDaysInMonth(year, month) {
31
+ return getDaysInBSMonth(year, month);
32
+ }
33
+ /**
34
+ * Get total days in a BS year
35
+ */
36
+ getDaysInYear(year) {
37
+ return getTotalDaysInBSYear(year);
38
+ }
39
+ /**
40
+ * Get month names
41
+ */
42
+ getMonthNames(lang = 'en') {
43
+ return lang === 'np' ? [...BS_MONTHS_NP] : [...BS_MONTHS_EN];
44
+ }
45
+ /**
46
+ * Get weekday names
47
+ */
48
+ getWeekdayNames(lang = 'en') {
49
+ return lang === 'np' ? [...BS_WEEKDAYS_NP] : [...BS_WEEKDAYS_EN];
50
+ }
51
+ /**
52
+ * Get minimum supported year
53
+ */
54
+ getMinYear() {
55
+ return BS_MIN_YEAR;
56
+ }
57
+ /**
58
+ * Get maximum supported year
59
+ */
60
+ getMaxYear() {
61
+ return BS_MAX_YEAR;
62
+ }
63
+ /**
64
+ * Validate a BS date
65
+ */
66
+ isValidDate(year, month, day) {
67
+ const date = new NepaliDate(year, month, day);
68
+ return date.isValid();
69
+ }
70
+ /**
71
+ * Format a NepaliDate
72
+ */
73
+ format(date, pattern = 'YYYY-MM-DD', useNepaliDigits = false) {
74
+ return date.format(pattern, useNepaliDigits);
75
+ }
76
+ /**
77
+ * Parse a date string to NepaliDate
78
+ */
79
+ parse(dateString) {
80
+ return NepaliDate.parse(dateString);
81
+ }
82
+ /**
83
+ * Convert number to Nepali digits
84
+ */
85
+ toNepaliDigits(num) {
86
+ return toNepaliDigits(num);
87
+ }
88
+ /**
89
+ * Get calendar grid for a month
90
+ * Returns a 2D array representing weeks (rows) and days (columns)
91
+ * Each cell contains the day number or null for empty cells
92
+ */
93
+ getMonthCalendarGrid(year, month) {
94
+ const daysInMonth = this.getDaysInMonth(year, month);
95
+ const firstDayOfMonth = new NepaliDate(year, month, 1);
96
+ const startDayOfWeek = firstDayOfMonth.getDay(); // 0 = Sunday
97
+ const grid = [];
98
+ let currentWeek = [];
99
+ // Fill empty cells before first day
100
+ for (let i = 0; i < startDayOfWeek; i++) {
101
+ currentWeek.push(null);
102
+ }
103
+ // Fill days
104
+ for (let day = 1; day <= daysInMonth; day++) {
105
+ currentWeek.push(day);
106
+ if (currentWeek.length === 7) {
107
+ grid.push(currentWeek);
108
+ currentWeek = [];
109
+ }
110
+ }
111
+ // Fill remaining empty cells in last week
112
+ if (currentWeek.length > 0) {
113
+ while (currentWeek.length < 7) {
114
+ currentWeek.push(null);
115
+ }
116
+ grid.push(currentWeek);
117
+ }
118
+ return grid;
119
+ }
120
+ /**
121
+ * Get years range for year selector
122
+ */
123
+ getYearRange(startYear, endYear) {
124
+ const start = startYear ?? BS_MIN_YEAR;
125
+ const end = endYear ?? BS_MAX_YEAR;
126
+ const years = [];
127
+ for (let year = start; year <= end; year++) {
128
+ if (BS_CALENDAR_DATA[year]) {
129
+ years.push(year);
130
+ }
131
+ }
132
+ return years;
133
+ }
134
+ /**
135
+ * Check if a date is within a range
136
+ */
137
+ isDateInRange(date, minDate, maxDate) {
138
+ if (minDate && date.isBefore(minDate)) {
139
+ return false;
140
+ }
141
+ if (maxDate && date.isAfter(maxDate)) {
142
+ return false;
143
+ }
144
+ return true;
145
+ }
146
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DateConverterService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
147
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DateConverterService, providedIn: 'root' }); }
148
+ }
149
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DateConverterService, decorators: [{
150
+ type: Injectable,
151
+ args: [{
152
+ providedIn: 'root',
153
+ }]
154
+ }] });
155
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1jb252ZXJ0ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2YxLW5lcGFsaS1kYXRlLXBpY2tlci9zcmMvbGliL3NlcnZpY2VzL2RhdGUtY29udmVydGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDekQsT0FBTyxFQUNILGdCQUFnQixFQUNoQixZQUFZLEVBQ1osWUFBWSxFQUNaLGNBQWMsRUFDZCxjQUFjLEVBQ2QsV0FBVyxFQUNYLFdBQVcsRUFDWCxnQkFBZ0IsRUFDaEIsb0JBQW9CLEVBQ3BCLGNBQWMsR0FDakIsTUFBTSwyQkFBMkIsQ0FBQzs7QUFFbkM7O0dBRUc7QUFJSCxNQUFNLE9BQU8sb0JBQW9CO0lBQzdCOztPQUVHO0lBQ0gsV0FBVyxDQUFDLE1BQVk7UUFDcEIsT0FBTyxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7T0FFRztJQUNILFdBQVcsQ0FBQyxNQUFrQjtRQUMxQixPQUFPLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxVQUFVO1FBQ04sT0FBTyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsY0FBYyxDQUFDLElBQVksRUFBRSxLQUFhO1FBQ3RDLE9BQU8sZ0JBQWdCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7T0FFRztJQUNILGFBQWEsQ0FBQyxJQUFZO1FBQ3RCLE9BQU8sb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsYUFBYSxDQUFDLE9BQW9CLElBQUk7UUFDbEMsT0FBTyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxlQUFlLENBQUMsT0FBb0IsSUFBSTtRQUNwQyxPQUFPLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFRDs7T0FFRztJQUNILFVBQVU7UUFDTixPQUFPLFdBQVcsQ0FBQztJQUN2QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxVQUFVO1FBQ04sT0FBTyxXQUFXLENBQUM7SUFDdkIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsV0FBVyxDQUFDLElBQVksRUFBRSxLQUFhLEVBQUUsR0FBVztRQUNoRCxNQUFNLElBQUksR0FBRyxJQUFJLFVBQVUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzlDLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxJQUFnQixFQUFFLFVBQWtCLFlBQVksRUFBRSxrQkFBMkIsS0FBSztRQUNyRixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxVQUFrQjtRQUNwQixPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsY0FBYyxDQUFDLEdBQW9CO1FBQy9CLE9BQU8sY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsb0JBQW9CLENBQUMsSUFBWSxFQUFFLEtBQWE7UUFDNUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDckQsTUFBTSxlQUFlLEdBQUcsSUFBSSxVQUFVLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN2RCxNQUFNLGNBQWMsR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxhQUFhO1FBRTlELE1BQU0sSUFBSSxHQUF3QixFQUFFLENBQUM7UUFDckMsSUFBSSxXQUFXLEdBQXNCLEVBQUUsQ0FBQztRQUV4QyxvQ0FBb0M7UUFDcEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGNBQWMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNyQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzFCO1FBRUQsWUFBWTtRQUNaLEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsSUFBSSxXQUFXLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDekMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUV0QixJQUFJLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUN2QixXQUFXLEdBQUcsRUFBRSxDQUFDO2FBQ3BCO1NBQ0o7UUFFRCwwQ0FBMEM7UUFDMUMsSUFBSSxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN4QixPQUFPLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUMzQixXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQzFCO1lBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUMxQjtRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7T0FFRztJQUNILFlBQVksQ0FBQyxTQUFrQixFQUFFLE9BQWdCO1FBQzdDLE1BQU0sS0FBSyxHQUFHLFNBQVMsSUFBSSxXQUFXLENBQUM7UUFDdkMsTUFBTSxHQUFHLEdBQUcsT0FBTyxJQUFJLFdBQVcsQ0FBQztRQUNuQyxNQUFNLEtBQUssR0FBYSxFQUFFLENBQUM7UUFFM0IsS0FBSyxJQUFJLElBQUksR0FBRyxLQUFLLEVBQUUsSUFBSSxJQUFJLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUN4QyxJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUN4QixLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3BCO1NBQ0o7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxhQUFhLENBQUMsSUFBZ0IsRUFBRSxPQUFvQixFQUFFLE9BQW9CO1FBQ3RFLElBQUksT0FBTyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDbkMsT0FBTyxLQUFLLENBQUM7U0FDaEI7UUFDRCxJQUFJLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ2xDLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQzsrR0FoS1Esb0JBQW9CO21IQUFwQixvQkFBb0IsY0FGakIsTUFBTTs7NEZBRVQsb0JBQW9CO2tCQUhoQyxVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5lcGFsaURhdGUgfSBmcm9tICcuLi9tb2RlbHMvbmVwYWxpLWRhdGUubW9kZWwnO1xuaW1wb3J0IHtcbiAgICBCU19DQUxFTkRBUl9EQVRBLFxuICAgIEJTX01PTlRIU19FTixcbiAgICBCU19NT05USFNfTlAsXG4gICAgQlNfV0VFS0RBWVNfRU4sXG4gICAgQlNfV0VFS0RBWVNfTlAsXG4gICAgQlNfTUlOX1lFQVIsXG4gICAgQlNfTUFYX1lFQVIsXG4gICAgZ2V0RGF5c0luQlNNb250aCxcbiAgICBnZXRUb3RhbERheXNJbkJTWWVhcixcbiAgICB0b05lcGFsaURpZ2l0cyxcbn0gZnJvbSAnLi4vdXRpbHMvYnMtY2FsZW5kYXItZGF0YSc7XG5cbi8qKlxuICogRGF0ZUNvbnZlcnRlclNlcnZpY2UgLSBTZXJ2aWNlIGZvciBCUy9BRCBkYXRlIGNvbnZlcnNpb25zIGFuZCB1dGlsaXRpZXNcbiAqL1xuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgRGF0ZUNvbnZlcnRlclNlcnZpY2Uge1xuICAgIC8qKlxuICAgICAqIENvbnZlcnQgQUQgRGF0ZSB0byBOZXBhbGlEYXRlIChCUylcbiAgICAgKi9cbiAgICBjb252ZXJ0VG9CUyhhZERhdGU6IERhdGUpOiBOZXBhbGlEYXRlIHtcbiAgICAgICAgcmV0dXJuIE5lcGFsaURhdGUuZnJvbUFEKGFkRGF0ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydCBOZXBhbGlEYXRlIChCUykgdG8gQUQgRGF0ZVxuICAgICAqL1xuICAgIGNvbnZlcnRUb0FEKGJzRGF0ZTogTmVwYWxpRGF0ZSk6IERhdGUge1xuICAgICAgICByZXR1cm4gYnNEYXRlLnRvQUQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdG9kYXkncyBkYXRlIGluIEJTXG4gICAgICovXG4gICAgZ2V0VG9kYXlCUygpOiBOZXBhbGlEYXRlIHtcbiAgICAgICAgcmV0dXJuIE5lcGFsaURhdGUudG9kYXkoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgbnVtYmVyIG9mIGRheXMgaW4gYSBCUyBtb250aFxuICAgICAqL1xuICAgIGdldERheXNJbk1vbnRoKHllYXI6IG51bWJlciwgbW9udGg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBnZXREYXlzSW5CU01vbnRoKHllYXIsIG1vbnRoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdG90YWwgZGF5cyBpbiBhIEJTIHllYXJcbiAgICAgKi9cbiAgICBnZXREYXlzSW5ZZWFyKHllYXI6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBnZXRUb3RhbERheXNJbkJTWWVhcih5ZWFyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgbW9udGggbmFtZXNcbiAgICAgKi9cbiAgICBnZXRNb250aE5hbWVzKGxhbmc6ICdlbicgfCAnbnAnID0gJ2VuJyk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIGxhbmcgPT09ICducCcgPyBbLi4uQlNfTU9OVEhTX05QXSA6IFsuLi5CU19NT05USFNfRU5dO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB3ZWVrZGF5IG5hbWVzXG4gICAgICovXG4gICAgZ2V0V2Vla2RheU5hbWVzKGxhbmc6ICdlbicgfCAnbnAnID0gJ2VuJyk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIGxhbmcgPT09ICducCcgPyBbLi4uQlNfV0VFS0RBWVNfTlBdIDogWy4uLkJTX1dFRUtEQVlTX0VOXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgbWluaW11bSBzdXBwb3J0ZWQgeWVhclxuICAgICAqL1xuICAgIGdldE1pblllYXIoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIEJTX01JTl9ZRUFSO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBtYXhpbXVtIHN1cHBvcnRlZCB5ZWFyXG4gICAgICovXG4gICAgZ2V0TWF4WWVhcigpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gQlNfTUFYX1lFQVI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmFsaWRhdGUgYSBCUyBkYXRlXG4gICAgICovXG4gICAgaXNWYWxpZERhdGUoeWVhcjogbnVtYmVyLCBtb250aDogbnVtYmVyLCBkYXk6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBkYXRlID0gbmV3IE5lcGFsaURhdGUoeWVhciwgbW9udGgsIGRheSk7XG4gICAgICAgIHJldHVybiBkYXRlLmlzVmFsaWQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JtYXQgYSBOZXBhbGlEYXRlXG4gICAgICovXG4gICAgZm9ybWF0KGRhdGU6IE5lcGFsaURhdGUsIHBhdHRlcm46IHN0cmluZyA9ICdZWVlZLU1NLUREJywgdXNlTmVwYWxpRGlnaXRzOiBib29sZWFuID0gZmFsc2UpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gZGF0ZS5mb3JtYXQocGF0dGVybiwgdXNlTmVwYWxpRGlnaXRzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZSBhIGRhdGUgc3RyaW5nIHRvIE5lcGFsaURhdGVcbiAgICAgKi9cbiAgICBwYXJzZShkYXRlU3RyaW5nOiBzdHJpbmcpOiBOZXBhbGlEYXRlIHtcbiAgICAgICAgcmV0dXJuIE5lcGFsaURhdGUucGFyc2UoZGF0ZVN0cmluZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydCBudW1iZXIgdG8gTmVwYWxpIGRpZ2l0c1xuICAgICAqL1xuICAgIHRvTmVwYWxpRGlnaXRzKG51bTogbnVtYmVyIHwgc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRvTmVwYWxpRGlnaXRzKG51bSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGNhbGVuZGFyIGdyaWQgZm9yIGEgbW9udGhcbiAgICAgKiBSZXR1cm5zIGEgMkQgYXJyYXkgcmVwcmVzZW50aW5nIHdlZWtzIChyb3dzKSBhbmQgZGF5cyAoY29sdW1ucylcbiAgICAgKiBFYWNoIGNlbGwgY29udGFpbnMgdGhlIGRheSBudW1iZXIgb3IgbnVsbCBmb3IgZW1wdHkgY2VsbHNcbiAgICAgKi9cbiAgICBnZXRNb250aENhbGVuZGFyR3JpZCh5ZWFyOiBudW1iZXIsIG1vbnRoOiBudW1iZXIpOiAobnVtYmVyIHwgbnVsbClbXVtdIHtcbiAgICAgICAgY29uc3QgZGF5c0luTW9udGggPSB0aGlzLmdldERheXNJbk1vbnRoKHllYXIsIG1vbnRoKTtcbiAgICAgICAgY29uc3QgZmlyc3REYXlPZk1vbnRoID0gbmV3IE5lcGFsaURhdGUoeWVhciwgbW9udGgsIDEpO1xuICAgICAgICBjb25zdCBzdGFydERheU9mV2VlayA9IGZpcnN0RGF5T2ZNb250aC5nZXREYXkoKTsgLy8gMCA9IFN1bmRheVxuXG4gICAgICAgIGNvbnN0IGdyaWQ6IChudW1iZXIgfCBudWxsKVtdW10gPSBbXTtcbiAgICAgICAgbGV0IGN1cnJlbnRXZWVrOiAobnVtYmVyIHwgbnVsbClbXSA9IFtdO1xuXG4gICAgICAgIC8vIEZpbGwgZW1wdHkgY2VsbHMgYmVmb3JlIGZpcnN0IGRheVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0YXJ0RGF5T2ZXZWVrOyBpKyspIHtcbiAgICAgICAgICAgIGN1cnJlbnRXZWVrLnB1c2gobnVsbCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGaWxsIGRheXNcbiAgICAgICAgZm9yIChsZXQgZGF5ID0gMTsgZGF5IDw9IGRheXNJbk1vbnRoOyBkYXkrKykge1xuICAgICAgICAgICAgY3VycmVudFdlZWsucHVzaChkYXkpO1xuXG4gICAgICAgICAgICBpZiAoY3VycmVudFdlZWsubGVuZ3RoID09PSA3KSB7XG4gICAgICAgICAgICAgICAgZ3JpZC5wdXNoKGN1cnJlbnRXZWVrKTtcbiAgICAgICAgICAgICAgICBjdXJyZW50V2VlayA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmlsbCByZW1haW5pbmcgZW1wdHkgY2VsbHMgaW4gbGFzdCB3ZWVrXG4gICAgICAgIGlmIChjdXJyZW50V2Vlay5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB3aGlsZSAoY3VycmVudFdlZWsubGVuZ3RoIDwgNykge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRXZWVrLnB1c2gobnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBncmlkLnB1c2goY3VycmVudFdlZWspO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGdyaWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHllYXJzIHJhbmdlIGZvciB5ZWFyIHNlbGVjdG9yXG4gICAgICovXG4gICAgZ2V0WWVhclJhbmdlKHN0YXJ0WWVhcj86IG51bWJlciwgZW5kWWVhcj86IG51bWJlcik6IG51bWJlcltdIHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBzdGFydFllYXIgPz8gQlNfTUlOX1lFQVI7XG4gICAgICAgIGNvbnN0IGVuZCA9IGVuZFllYXIgPz8gQlNfTUFYX1lFQVI7XG4gICAgICAgIGNvbnN0IHllYXJzOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IHllYXIgPSBzdGFydDsgeWVhciA8PSBlbmQ7IHllYXIrKykge1xuICAgICAgICAgICAgaWYgKEJTX0NBTEVOREFSX0RBVEFbeWVhcl0pIHtcbiAgICAgICAgICAgICAgICB5ZWFycy5wdXNoKHllYXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHllYXJzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGEgZGF0ZSBpcyB3aXRoaW4gYSByYW5nZVxuICAgICAqL1xuICAgIGlzRGF0ZUluUmFuZ2UoZGF0ZTogTmVwYWxpRGF0ZSwgbWluRGF0ZT86IE5lcGFsaURhdGUsIG1heERhdGU/OiBOZXBhbGlEYXRlKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChtaW5EYXRlICYmIGRhdGUuaXNCZWZvcmUobWluRGF0ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWF4RGF0ZSAmJiBkYXRlLmlzQWZ0ZXIobWF4RGF0ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG4iXX0=