angular-hijri-gregorian-date-time-picker 1.5.0 → 1.5.1

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.
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItbW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9oaWpyaS1ncmVnb3JpYW4tZGF0ZXBpY2tlci9zcmMvX2ludGVyZmFjZXMvY2FsZW5kYXItbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgTW9udGhJbmZvIHtcbiAgZkQ6IERheUluZm87IC8vIEZpcnN0IGRheSBvZiB0aGUgbW9udGhcbiAgbEQ6IERheUluZm87IC8vIExhc3QgZGF5IG9mIHRoZSBtb250aFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFllYXJEYXRhIHtcbiAgW21vbnRoOiBzdHJpbmddOiBNb250aEluZm87XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YSB7XG4gIFt5ZWFyOiBzdHJpbmddOiBZZWFyRGF0YTtcbn1cblxuLy8gVGltZSB2YWx1ZSBzdHJ1Y3R1cmUgZm9yIHRpbWUgcGlja2VyXG5leHBvcnQgaW50ZXJmYWNlIFRpbWVWYWx1ZSB7XG4gIGhvdXI6IG51bWJlcjsgICAvLyAwLTIzIGZvciAyNC1ob3VyIGZvcm1hdFxuICBtaW51dGU6IG51bWJlcjsgLy8gMC01OVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIERheUluZm8ge1xuICBnRDogc3RyaW5nOyAvLyBHcmVnb3JpYW4gZGF0ZVxuICB1RDogc3RyaW5nOyAvLyBVbSBhbC1RdXJyYSBkYXRlXG4gIGROOiBzdHJpbmc7IC8vIERheSBuYW1lIHNob3J0aGFuZFxuICB1QzogbnVtYmVyOyAvLyBQbGFjZWhvbGRlciBzaW5jZSB3ZSBhcmUgbm90IHVzaW5nIGl0IGluIHRoZSBvdXRwdXRcbiAgc2VsZWN0ZWQ/OiBib29sZWFuO1xuICBkaXNhYmxlZD86IGJvb2xlYW47IC8vIE5ldzogaW5kaWNhdGVzIGlmIGRheSBpcyBkaXNhYmxlZCAob3V0IG9mIG1pbi9tYXggcmFuZ2UpXG4gIHRpbWU/OiBUaW1lVmFsdWU7ICAgLy8gTmV3OiBvcHRpb25hbCB0aW1lIGluZm9ybWF0aW9uXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9kYXlEYXRlIHtcbiAgZ3JlZ29yaWFuPzogc3RyaW5nO1xuICB1bW1BbFF1cmE/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIE1vbnRoRGF5cyA9IERheUluZm9bXTtcbiJdfQ==
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3R5bGVzLWNvbmZpZy5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2hpanJpLWdyZWdvcmlhbi1kYXRlcGlja2VyL3NyYy9faW50ZXJmYWNlcy9zdHlsZXMtY29uZmlnLm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIHN0eWxlc0NvbmZpZyB7XG4gIGJhY2tncm91bmRDb2xvcj86IHN0cmluZztcbiAgcHJpbWFyeUNvbG9yPzogc3RyaW5nO1xuICBzZWNvbmRhcnlDb2xvcj86IHN0cmluZztcbiAgdG9kYXlzRGF0ZUJnQ29sb3I/OiBzdHJpbmc7XG4gIHRvZGF5c0RhdGVUZXh0Q29sb3I/OiBzdHJpbmc7XG4gIGNvbmZpcm1CdG5UZXh0Q29sb3I/OiBzdHJpbmc7XG4gIGRpc2FibGVkRGF5Q29sb3I/OiBzdHJpbmc7XG4gIGRheU5hbWVDb2xvcj86IHN0cmluZztcbiAgZGF5Q29sb3I/OiBzdHJpbmc7XG4gIGZvbnRGYW1pbHk/OiBzdHJpbmc7XG4gIGJvcmRlclJhZGl1cz86IHN0cmluZztcbn1cbiJdfQ==
@@ -1,375 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import * as datesDictionary from '../_data/dictionary.json';
3
- import * as i0 from "@angular/core";
4
- export class DateUtilitiesService {
5
- constructor() {
6
- this.calendarData = datesDictionary['default']; //prod
7
- // this.calendarData = datesDictionary; //debug
8
- }
9
- parseDate(dateStr) {
10
- if (!dateStr) {
11
- return null;
12
- }
13
- const parts = dateStr?.split('/');
14
- if (parts.length !== 3) {
15
- return null;
16
- }
17
- const [day, month, year] = parts.map(Number);
18
- if (isNaN(day) ||
19
- isNaN(month) ||
20
- isNaN(year) ||
21
- day < 1 ||
22
- day > 31 ||
23
- month < 1 ||
24
- month > 12 ||
25
- year < 1) {
26
- return null;
27
- }
28
- return new Date(year, month - 1, day);
29
- }
30
- formatDate(date) {
31
- const day = String(date.getDate()).padStart(2, '0');
32
- const month = String(date.getMonth() + 1).padStart(2, '0');
33
- const year = date.getFullYear();
34
- return `${day}/${month}/${year}`;
35
- }
36
- getDayShortHand(date) {
37
- return date.toLocaleString('en-US', { weekday: 'short' });
38
- }
39
- generateDates(fD, lD, uC) {
40
- const startDate = this.parseDate(fD?.gD);
41
- const endDate = this.parseDate(lD?.gD);
42
- const daysInMonth = [];
43
- let currentGregorianDate = new Date(startDate);
44
- let currentUmmAlQuraDay = parseInt(fD?.uD?.split('/')[0]);
45
- let currentUmmAlQuraMonth = parseInt(fD?.uD?.split('/')[1]);
46
- let currentUmmAlQuraYear = parseInt(fD?.uD?.split('/')[2]);
47
- let daysInCurrentUmmAlQuraMonth = uC;
48
- while (currentGregorianDate <= endDate) {
49
- const ummAlQuraDate = `${currentUmmAlQuraDay
50
- .toString()
51
- .padStart(2, '0')}/${currentUmmAlQuraMonth
52
- .toString()
53
- .padStart(2, '0')}/${currentUmmAlQuraYear}`;
54
- daysInMonth.push({
55
- gD: this.formatDate(currentGregorianDate),
56
- uD: ummAlQuraDate,
57
- dN: this.getDayShortHand(currentGregorianDate),
58
- uC: 0,
59
- });
60
- currentGregorianDate.setDate(currentGregorianDate.getDate() + 1);
61
- currentUmmAlQuraDay += 1;
62
- if (currentUmmAlQuraDay > daysInCurrentUmmAlQuraMonth) {
63
- currentUmmAlQuraDay = 1;
64
- currentUmmAlQuraMonth += 1;
65
- if (currentUmmAlQuraMonth > 12) {
66
- currentUmmAlQuraMonth = 1;
67
- currentUmmAlQuraYear += 1;
68
- }
69
- const nextMonthData = this.calendarData[currentUmmAlQuraYear.toString()]?.[currentUmmAlQuraMonth.toString()];
70
- daysInCurrentUmmAlQuraMonth = nextMonthData ? nextMonthData.fD.uC : 30;
71
- }
72
- }
73
- return daysInMonth;
74
- }
75
- convertDate(dateStr, isGregorian) {
76
- if (!dateStr)
77
- return null;
78
- if (isGregorian) {
79
- // Preprocess Gregorian date
80
- const gregorianDate = this.parseDate(dateStr);
81
- if (!gregorianDate)
82
- return null;
83
- const formattedDate = this.formatDate(gregorianDate);
84
- for (const yearKey in this.calendarData) {
85
- for (const monthKey in this.calendarData[yearKey]) {
86
- const monthData = this.calendarData[yearKey][monthKey];
87
- if (this.isDateInMonthRange(formattedDate, monthData.fD?.gD, monthData.lD?.gD)) {
88
- const daysInMonth = this.generateDates(monthData.fD, monthData.lD, monthData.fD?.uC);
89
- const dayMatch = daysInMonth.find((d) => d.gD === formattedDate);
90
- if (dayMatch)
91
- return dayMatch;
92
- }
93
- }
94
- }
95
- }
96
- else {
97
- const [day, month, year] = dateStr.split('/').map(Number);
98
- if (isNaN(day) || isNaN(month) || isNaN(year))
99
- return null;
100
- for (const yearKey in this.calendarData) {
101
- for (const monthKey in this.calendarData[yearKey]) {
102
- const monthData = this.calendarData[yearKey][monthKey];
103
- if (this.isDateInMonthRange(`${day}/${month}/${year}`, monthData.fD?.uD, monthData.lD?.uD)) {
104
- const daysInMonth = this.generateDates(monthData.fD, monthData.lD, monthData.fD?.uC);
105
- const dayMatch = daysInMonth.find((d) => {
106
- const [uDay, uMonth, uYear] = d?.uD?.split('/').map(Number);
107
- return uDay === day && uMonth === month && uYear === year;
108
- });
109
- if (dayMatch)
110
- return dayMatch;
111
- }
112
- }
113
- }
114
- }
115
- return null;
116
- }
117
- isDateInMonthRange(dateToCheck, monthStartDate, monthEndDate) {
118
- if (!monthStartDate || !monthEndDate)
119
- return false;
120
- const checkDate = this.parseDate(dateToCheck);
121
- const startDate = this.parseDate(monthStartDate);
122
- const endDate = this.parseDate(monthEndDate);
123
- if (!checkDate || !startDate || !endDate)
124
- return false;
125
- return checkDate >= startDate && checkDate <= endDate;
126
- }
127
- getMonthData(inputDate, type) {
128
- const [day, month, year] = inputDate?.split('/').map(Number);
129
- let isGregorian;
130
- if (type == 'greg') {
131
- isGregorian = true;
132
- }
133
- else {
134
- isGregorian = false;
135
- }
136
- if (isGregorian) {
137
- return this.getGregorianMonthData(day, month, year);
138
- }
139
- else {
140
- return this.getUmAlQurraMonthData(day, month, year);
141
- }
142
- }
143
- getGregorianMonthData(day, month, year) {
144
- const yearData = this.calendarData[year];
145
- if (!yearData)
146
- return null;
147
- const monthData = yearData[month];
148
- if (!monthData)
149
- return null;
150
- const monthArray = [];
151
- const endDate = new Date(year, month, 0);
152
- for (let d = 1; d <= endDate.getDate(); d++) {
153
- const offset = d - 1;
154
- monthArray.push({
155
- gD: `${d.toString().padStart(2, '0')}/${month
156
- .toString()
157
- .padStart(2, '0')}/${year}`,
158
- uD: this.calculateUmAlQurraDate(monthData.fD.uD, offset, monthData.fD.uC),
159
- dN: this.getDayName(new Date(year, month - 1, d).getDay()),
160
- uC: monthData.fD.uC,
161
- });
162
- }
163
- return monthArray;
164
- }
165
- getUmAlQurraMonthData(day, month, year) {
166
- for (const gregorianYear in this.calendarData) {
167
- const yearData = this.calendarData[parseInt(gregorianYear)];
168
- for (const monthIndex in yearData) {
169
- const monthData = yearData[parseInt(monthIndex)];
170
- const [fDay, fMonth, fYear] = monthData?.fD?.uD?.split('/').map(Number);
171
- if (fYear === year && fMonth === month) {
172
- const totalDays = monthData.fD.uC;
173
- const monthArray = [];
174
- const umAlQurraStartDate = `01/${month
175
- .toString()
176
- .padStart(2, '0')}/${year}`;
177
- const dayDifference = fDay - 1;
178
- const startGregorianDate = this.calculateGregorianDate(monthData.fD.gD, -dayDifference);
179
- for (let i = 0; i < totalDays; i++) {
180
- const uDate = this.calculateUmAlQurraDate(umAlQurraStartDate, i, totalDays);
181
- const gDate = this.calculateGregorianDate(startGregorianDate, i);
182
- const [gDay, gMonth, gYear] = gDate?.split('/').map(Number);
183
- const dayName = this.getDayName(new Date(gYear, gMonth - 1, gDay).getDay());
184
- monthArray.push({
185
- gD: gDate,
186
- uD: uDate,
187
- dN: dayName,
188
- uC: totalDays,
189
- });
190
- }
191
- return monthArray;
192
- }
193
- }
194
- }
195
- return null;
196
- }
197
- calculateGregorianDate(startGDate, offset) {
198
- const [day, month, year] = startGDate?.split('/').map(Number);
199
- const newDate = new Date(year, month - 1, day + offset);
200
- return `${newDate.getDate().toString().padStart(2, '0')}/${(newDate.getMonth() + 1)
201
- .toString()
202
- .padStart(2, '0')}/${newDate.getFullYear()}`;
203
- }
204
- calculateUmAlQurraDate(startUDate, offset, uC) {
205
- const [day, month, year] = startUDate?.split('/').map(Number);
206
- let newDay = day + offset;
207
- let newMonth = month;
208
- let newYear = year;
209
- while (newDay > uC) {
210
- newDay -= uC;
211
- newMonth += 1;
212
- }
213
- while (newMonth > 12) {
214
- newMonth = 1;
215
- newYear += 1;
216
- }
217
- return `${newDay.toString().padStart(2, '0')}/${newMonth
218
- .toString()
219
- .padStart(2, '0')}/${newYear}`;
220
- }
221
- getDayName(dayIndex) {
222
- const days = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
223
- return days[dayIndex];
224
- }
225
- /// Check date is it in past or future
226
- checkPastOrFuture(inputDate, targetDate) {
227
- if (inputDate) {
228
- const [day, month, year] = inputDate?.split('/').map(Number);
229
- const dateToCheck = new Date(year, month - 1, day);
230
- const today = targetDate;
231
- today.setHours(0, 0, 0, 0);
232
- if (dateToCheck > today) {
233
- return 'Future';
234
- }
235
- else if (dateToCheck < today) {
236
- return 'Past';
237
- }
238
- else {
239
- return 'Today';
240
- }
241
- }
242
- }
243
- /// Convert english numbers to arabic equivalent
244
- parseEnglish(englishNum) {
245
- if (!englishNum)
246
- return englishNum;
247
- const numStr = String(englishNum);
248
- const arabicNumbers = [
249
- '\u0660',
250
- '\u0661',
251
- '\u0662',
252
- '\u0663',
253
- '\u0664',
254
- '\u0665',
255
- '\u0666',
256
- '\u0667',
257
- '\u0668',
258
- '\u0669',
259
- ];
260
- return numStr.replace(/[0-9]/g, (digit) => {
261
- return arabicNumbers[Number(digit)] || digit;
262
- });
263
- }
264
- /// Convert arabic numbers to english equivalent
265
- parseArabic(arabicNum) {
266
- return arabicNum.replace(/[٠١٢٣٤٥٦٧٨٩]/g, function (d) {
267
- return d.charCodeAt(0) - 1632;
268
- });
269
- }
270
- ///
271
- convertDateNumerals(date, targetLang) {
272
- const arabicNumbers = ['٠', '١', '٢', '٣', '٤', '٥', '٦', '٧', '٨', '٩'];
273
- const englishNumbers = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
274
- const toArabic = (value) => value
275
- .split('')
276
- .map((char) => (/\d/.test(char) ? arabicNumbers[+char] : char))
277
- .join('');
278
- const toEnglish = (value) => value
279
- .split('')
280
- .map((char) => {
281
- const index = arabicNumbers.indexOf(char);
282
- return index > -1 ? englishNumbers[index] : char;
283
- })
284
- .join('');
285
- if (targetLang === 'ar') {
286
- const [day, month, year] = date.split('/');
287
- return `${toArabic(year)}/${toArabic(month)}/${toArabic(day)}`;
288
- }
289
- else {
290
- const [year, month, day] = date.split('/');
291
- return `${toEnglish(day)}/${toEnglish(month)}/${toEnglish(year)}`;
292
- }
293
- }
294
- /**
295
- * Normalize input date to DD/MM/YYYY string format (Gregorian)
296
- * Accepts Date object or DD/MM/YYYY string
297
- */
298
- normalizeDateToString(date) {
299
- if (!date)
300
- return null;
301
- if (date instanceof Date) {
302
- return this.formatDate(date);
303
- }
304
- // Already a string - validate format
305
- const parsed = this.parseDate(date);
306
- return parsed ? this.formatDate(parsed) : null;
307
- }
308
- /**
309
- * Compare two dates (Gregorian format DD/MM/YYYY)
310
- * Returns: -1 if date1 < date2, 0 if equal, 1 if date1 > date2
311
- */
312
- compareDates(date1Str, date2Str) {
313
- const d1 = this.parseDate(date1Str);
314
- const d2 = this.parseDate(date2Str);
315
- if (!d1 || !d2)
316
- return 0;
317
- if (d1 < d2)
318
- return -1;
319
- if (d1 > d2)
320
- return 1;
321
- return 0;
322
- }
323
- /**
324
- * Compare two Hijri dates (UM format DD/MM/YYYY)
325
- * Converts to Gregorian for comparison
326
- */
327
- compareHijriDates(hijri1, hijri2) {
328
- const day1 = this.convertDate(hijri1, false);
329
- const day2 = this.convertDate(hijri2, false);
330
- if (!day1?.gD || !day2?.gD)
331
- return 0;
332
- return this.compareDates(day1.gD, day2.gD);
333
- }
334
- /**
335
- * Check if a date is within the specified range (inclusive)
336
- * All dates in Gregorian DD/MM/YYYY format
337
- */
338
- isDateInRange(dateStr, minDateStr, maxDateStr) {
339
- if (!dateStr)
340
- return false;
341
- // If no constraints, date is valid
342
- if (!minDateStr && !maxDateStr)
343
- return true;
344
- // Check minimum constraint
345
- if (minDateStr && this.compareDates(dateStr, minDateStr) < 0) {
346
- return false;
347
- }
348
- // Check maximum constraint
349
- if (maxDateStr && this.compareDates(dateStr, maxDateStr) > 0) {
350
- return false;
351
- }
352
- return true;
353
- }
354
- /**
355
- * Check if a Hijri date is within the specified range
356
- * Converts to Gregorian for comparison
357
- */
358
- isHijriDateInRange(hijriDateStr, minDateStr, maxDateStr) {
359
- if (!hijriDateStr)
360
- return false;
361
- const dayInfo = this.convertDate(hijriDateStr, false);
362
- if (!dayInfo?.gD)
363
- return false;
364
- return this.isDateInRange(dayInfo.gD, minDateStr, maxDateStr);
365
- }
366
- }
367
- DateUtilitiesService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DateUtilitiesService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
368
- DateUtilitiesService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DateUtilitiesService, providedIn: 'root' });
369
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DateUtilitiesService, decorators: [{
370
- type: Injectable,
371
- args: [{
372
- providedIn: 'root',
373
- }]
374
- }], ctorParameters: function () { return []; } });
375
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS11dGlsaXRpZXMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2hpanJpLWdyZWdvcmlhbi1kYXRlcGlja2VyL3NyYy9fc2VydmljZXMvZGF0ZS11dGlsaXRpZXMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sS0FBSyxlQUFlLE1BQU0sMEJBQTBCLENBQUM7O0FBTTVELE1BQU0sT0FBTyxvQkFBb0I7SUFHL0I7UUFDRSxJQUFJLENBQUMsWUFBWSxHQUFJLGVBQXVCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNO1FBQy9ELCtDQUErQztJQUNqRCxDQUFDO0lBRUQsU0FBUyxDQUFDLE9BQWU7UUFDdkIsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNaLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFDRCxNQUFNLEtBQUssR0FBRyxPQUFPLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDdEIsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0MsSUFDRSxLQUFLLENBQUMsR0FBRyxDQUFDO1lBQ1YsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUNaLEtBQUssQ0FBQyxJQUFJLENBQUM7WUFDWCxHQUFHLEdBQUcsQ0FBQztZQUNQLEdBQUcsR0FBRyxFQUFFO1lBQ1IsS0FBSyxHQUFHLENBQUM7WUFDVCxLQUFLLEdBQUcsRUFBRTtZQUNWLElBQUksR0FBRyxDQUFDLEVBQ1I7WUFDQSxPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJ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SUFDSCxhQUFhLENBQ1gsT0FBZSxFQUNmLFVBQXlCLEVBQ3pCLFVBQXlCO1FBRXpCLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFM0IsbUNBQW1DO1FBQ25DLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxVQUFVO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFNUMsMkJBQTJCO1FBQzNCLElBQUksVUFBVSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUM1RCxPQUFPLEtBQUssQ0FBQztTQUNkO1FBRUQsMkJBQTJCO1FBQzNCLElBQUksVUFBVSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUM1RCxPQUFPLEtBQUssQ0FBQztTQUNkO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsa0JBQWtCLENBQ2hCLFlBQW9CLEVBQ3BCLFVBQXlCLEVBQ3pCLFVBQXlCO1FBRXpCLElBQUksQ0FBQyxZQUFZO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFaEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFL0IsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7O2lIQW5kVSxvQkFBb0I7cUhBQXBCLG9CQUFvQixjQUZuQixNQUFNOzJGQUVQLG9CQUFvQjtrQkFIaEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgKiBhcyBkYXRlc0RpY3Rpb25hcnkgZnJvbSAnLi4vX2RhdGEvZGljdGlvbmFyeS5qc29uJztcbmltcG9ydCB7IERhdGEsIERheUluZm8sIE1vbnRoRGF5cyB9IGZyb20gJy4uL19pbnRlcmZhY2VzL2NhbGVuZGFyLW1vZGVsJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIERhdGVVdGlsaXRpZXNTZXJ2aWNlIHtcbiAgcHVibGljIGNhbGVuZGFyRGF0YTogRGF0YTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmNhbGVuZGFyRGF0YSA9IChkYXRlc0RpY3Rpb25hcnkgYXMgYW55KVsnZGVmYXVsdCddOyAvL3Byb2RcbiAgICAvLyB0aGlzLmNhbGVuZGFyRGF0YSA9IGRhdGVzRGljdGlvbmFyeTsgLy9kZWJ1Z1xuICB9XG5cbiAgcGFyc2VEYXRlKGRhdGVTdHI6IHN0cmluZyk6IERhdGUgfCBudWxsIHtcbiAgICBpZiAoIWRhdGVTdHIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBwYXJ0cyA9IGRhdGVTdHI/LnNwbGl0KCcvJyk7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IFtkYXksIG1vbnRoLCB5ZWFyXSA9IHBhcnRzLm1hcChOdW1iZXIpO1xuICAgIGlmIChcbiAgICAgIGlzTmFOKGRheSkgfHxcbiAgICAgIGlzTmFOKG1vbnRoKSB8fFxuICAgICAgaXNOYU4oeWVhcikgfHxcbiAgICAgIGRheSA8IDEgfHxcbiAgICAgIGRheSA+IDMxIHx8XG4gICAgICBtb250aCA8IDEgfHxcbiAgICAgIG1vbnRoID4gMTIgfHxcbiAgICAgIHllYXIgPCAxXG4gICAgKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBEYXRlKHllYXIsIG1vbnRoIC0gMSwgZGF5KTtcbiAgfVxuXG4gIGZvcm1hdERhdGUoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgY29uc3QgZGF5ID0gU3RyaW5nKGRhdGUuZ2V0RGF0ZSgpKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgIGNvbnN0IG1vbnRoID0gU3RyaW5nKGRhdGUuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICByZXR1cm4gYCR7ZGF5fS8ke21vbnRofS8ke3llYXJ9YDtcbiAgfVxuXG4gIGdldERheVNob3J0SGFuZChkYXRlOiBEYXRlKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZGF0ZS50b0xvY2FsZVN0cmluZygnZW4tVVMnLCB7IHdlZWtkYXk6ICdzaG9ydCcgfSk7XG4gIH1cblxuICBnZW5lcmF0ZURhdGVzKGZEOiBEYXlJbmZvLCBsRDogRGF5SW5mbywgdUM6IG51bWJlcik6IE1vbnRoRGF5cyB7XG4gICAgY29uc3Qgc3RhcnREYXRlID0gdGhpcy5wYXJzZURhdGUoZkQ/LmdEKTtcbiAgICBjb25zdCBlbmREYXRlID0gdGhpcy5wYXJzZURhdGUobEQ/LmdEKTtcbiAgICBjb25zdCBkYXlzSW5Nb250aDogTW9udGhEYXlzID0gW107XG4gICAgbGV0IGN1cnJlbnRHcmVnb3JpYW5EYXRlID0gbmV3IERhdGUoc3RhcnREYXRlKTtcbiAgICBsZXQgY3VycmVudFVtbUFsUXVyYURheSA9IHBhcnNlSW50KGZEPy51RD8uc3BsaXQoJy8nKVswXSk7XG4gICAgbGV0IGN1cnJlbnRVbW1BbFF1cmFNb250aCA9IHBhcnNlSW50KGZEPy51RD8uc3BsaXQoJy8nKVsxXSk7XG4gICAgbGV0IGN1cnJlbnRVbW1BbFF1cmFZZWFyID0gcGFyc2VJbnQoZkQ/LnVEPy5zcGxpdCgnLycpWzJdKTtcbiAgICBsZXQgZGF5c0luQ3VycmVudFVtbUFsUXVyYU1vbnRoID0gdUM7XG4gICAgd2hpbGUgKGN1cnJlbnRHcmVnb3JpYW5EYXRlIDw9IGVuZERhdGUpIHtcbiAgICAgIGNvbnN0IHVtbUFsUXVyYURhdGUgPSBgJHtjdXJyZW50VW1tQWxRdXJhRGF5XG4gICAgICAgIC50b1N0cmluZygpXG4gICAgICAgIC5wYWRTdGFydCgyLCAnMCcpfS8ke2N1cnJlbnRVbW1BbFF1cmFNb250aFxuICAgICAgICAudG9TdHJpbmcoKVxuICAgICAgICAucGFkU3RhcnQoMiwgJzAnKX0vJHtjdXJyZW50VW1tQWxRdXJhWWVhcn1gO1xuICAgICAgZGF5c0luTW9udGgucHVzaCh7XG4gICAgICAgIGdEOiB0aGlzLmZvcm1hdERhdGUoY3VycmVudEdyZWdvcmlhbkRhdGUpLFxuICAgICAgICB1RDogdW1tQWxRdXJhRGF0ZSxcbiAgICAgICAgZE46IHRoaXMuZ2V0RGF5U2hvcnRIYW5kKGN1cnJlbnRHcmVnb3JpYW5EYXRlKSxcbiAgICAgICAgdUM6IDAsXG4gICAgICB9KTtcbiAgICAgIGN1cnJlbnRHcmVnb3JpYW5EYXRlLnNldERhdGUoY3VycmVudEdyZWdvcmlhbkRhdGUuZ2V0RGF0ZSgpICsgMSk7XG4gICAgICBjdXJyZW50VW1tQWxRdXJhRGF5ICs9IDE7XG4gICAgICBpZiAoY3VycmVudFVtbUFsUXVyYURheSA+IGRheXNJbkN1cnJlbnRVbW1BbFF1cmFNb250aCkge1xuICAgICAgICBjdXJyZW50VW1tQWxRdXJhRGF5ID0gMTtcbiAgICAgICAgY3VycmVudFVtbUFsUXVyYU1vbnRoICs9IDE7XG4gICAgICAgIGlmIChjdXJyZW50VW1tQWxRdXJhTW9udGggPiAxMikge1xuICAgICAgICAgIGN1cnJlbnRVbW1BbFF1cmFNb250aCA9IDE7XG4gICAgICAgICAgY3VycmVudFVtbUFsUXVyYVllYXIgKz0gMTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXh0TW9udGhEYXRhID1cbiAgICAgICAgICB0aGlzLmNhbGVuZGFyRGF0YVtjdXJyZW50VW1tQWxRdXJhWWVhci50b1N0cmluZygpXT8uW1xuICAgICAgICAgICAgY3VycmVudFVtbUFsUXVyYU1vbnRoLnRvU3RyaW5nKClcbiAgICAgICAgICBdO1xuICAgICAgICBkYXlzSW5DdXJyZW50VW1tQWxRdXJhTW9udGggPSBuZXh0TW9udGhEYXRhID8gbmV4dE1vbnRoRGF0YS5mRC51QyA6IDMwO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGF5c0luTW9udGg7XG4gIH1cblxuICBjb252ZXJ0RGF0ZShkYXRlU3RyOiBzdHJpbmcsIGlzR3JlZ29yaWFuOiBib29sZWFuKTogRGF5SW5mbyB8IG51bGwge1xuICAgIGlmICghZGF0ZVN0cikgcmV0dXJuIG51bGw7XG5cbiAgICBpZiAoaXNHcmVnb3JpYW4pIHtcbiAgICAgIC8vIFByZXByb2Nlc3MgR3JlZ29yaWFuIGRhdGVcbiAgICAgIGNvbnN0IGdyZWdvcmlhbkRhdGUgPSB0aGlzLnBhcnNlRGF0ZShkYXRlU3RyKTtcbiAgICAgIGlmICghZ3JlZ29yaWFuRGF0ZSkgcmV0dXJuIG51bGw7XG4gICAgICBjb25zdCBmb3JtYXR0ZWREYXRlID0gdGhpcy5mb3JtYXREYXRlKGdyZWdvcmlhbkRhdGUpO1xuXG4gICAgICBmb3IgKGNvbnN0IHllYXJLZXkgaW4gdGhpcy5jYWxlbmRhckRhdGEpIHtcbiAgICAgICAgZm9yIChjb25zdCBtb250aEtleSBpbiB0aGlzLmNhbGVuZGFyRGF0YVt5ZWFyS2V5XSkge1xuICAgICAgICAgIGNvbnN0IG1vbnRoRGF0YSA9IHRoaXMuY2FsZW5kYXJEYXRhW3llYXJLZXldW21vbnRoS2V5XTtcblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuaXNEYXRlSW5Nb250aFJhbmdlKFxuICAgICAgICAgICAgICBmb3JtYXR0ZWREYXRlLFxuICAgICAgICAgICAgICBtb250aERhdGEuZkQ/LmdELFxuICAgICAgICAgICAgICBtb250aERhdGEubEQ/LmdEXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBkYXlzSW5Nb250aCA9IHRoaXMuZ2VuZXJhdGVEYXRlcyhcbiAgICAgICAgICAgICAgbW9udGhEYXRhLmZELFxuICAgICAgICAgICAgICBtb250aERhdGEubEQsXG4gICAgICAgICAgICAgIG1vbnRoRGF0YS5mRD8udUNcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGNvbnN0IGRheU1hdGNoID0gZGF5c0luTW9udGguZmluZCgoZCkgPT4gZC5nRCA9PT0gZm9ybWF0dGVkRGF0ZSk7XG4gICAgICAgICAgICBpZiAoZGF5TWF0Y2gpIHJldHVybiBkYXlNYXRjaDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgW2RheSwgbW9udGgsIHllYXJdID0gZGF0ZVN0ci5zcGxpdCgnLycpLm1hcChOdW1iZXIpO1xuXG4gICAgICBpZiAoaXNOYU4oZGF5KSB8fCBpc05hTihtb250aCkgfHwgaXNOYU4oeWVhcikpIHJldHVybiBudWxsO1xuXG4gICAgICBmb3IgKGNvbnN0IHllYXJLZXkgaW4gdGhpcy5jYWxlbmRhckRhdGEpIHtcbiAgICAgICAgZm9yIChjb25zdCBtb250aEtleSBpbiB0aGlzLmNhbGVuZGFyRGF0YVt5ZWFyS2V5XSkge1xuICAgICAgICAgIGNvbnN0IG1vbnRoRGF0YSA9IHRoaXMuY2FsZW5kYXJEYXRhW3llYXJLZXldW21vbnRoS2V5XTtcblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuaXNEYXRlSW5Nb250aFJhbmdlKFxuICAgICAgICAgICAgICBgJHtkYXl9LyR7bW9udGh9LyR7eWVhcn1gLFxuICAgICAgICAgICAgICBtb250aERhdGEuZkQ/LnVELFxuICAgICAgICAgICAgICBtb250aERhdGEubEQ/LnVEXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBkYXlzSW5Nb250aCA9IHRoaXMuZ2VuZXJhdGVEYXRlcyhcbiAgICAgICAgICAgICAgbW9udGhEYXRhLmZELFxuICAgICAgICAgICAgICBtb250aERhdGEubEQsXG4gICAgICAgICAgICAgIG1vbnRoRGF0YS5mRD8udUNcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGNvbnN0IGRheU1hdGNoID0gZGF5c0luTW9udGguZmluZCgoZCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBbdURheSwgdU1vbnRoLCB1WWVhcl0gPSBkPy51RD8uc3BsaXQoJy8nKS5tYXAoTnVtYmVyKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHVEYXkgPT09IGRheSAmJiB1TW9udGggPT09IG1vbnRoICYmIHVZZWFyID09PSB5ZWFyO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChkYXlNYXRjaCkgcmV0dXJuIGRheU1hdGNoO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0RhdGVJbk1vbnRoUmFuZ2UoXG4gICAgZGF0ZVRvQ2hlY2s6IHN0cmluZyxcbiAgICBtb250aFN0YXJ0RGF0ZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIG1vbnRoRW5kRGF0ZTogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmICghbW9udGhTdGFydERhdGUgfHwgIW1vbnRoRW5kRGF0ZSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3QgY2hlY2tEYXRlID0gdGhpcy5wYXJzZURhdGUoZGF0ZVRvQ2hlY2spO1xuICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IHRoaXMucGFyc2VEYXRlKG1vbnRoU3RhcnREYXRlKTtcbiAgICBjb25zdCBlbmREYXRlID0gdGhpcy5wYXJzZURhdGUobW9udGhFbmREYXRlKTtcblxuICAgIGlmICghY2hlY2tEYXRlIHx8ICFzdGFydERhdGUgfHwgIWVuZERhdGUpIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiBjaGVja0RhdGUgPj0gc3RhcnREYXRlICYmIGNoZWNrRGF0ZSA8PSBlbmREYXRlO1xuICB9XG5cbiAgZ2V0TW9udGhEYXRhKGlucHV0RGF0ZTogc3RyaW5nLCB0eXBlOiBzdHJpbmcpOiBEYXlJbmZvW10gfCBudWxsIHtcbiAgICBjb25zdCBbZGF5LCBtb250aCwgeWVhcl0gPSBpbnB1dERhdGU/LnNwbGl0KCcvJykubWFwKE51bWJlcik7XG4gICAgbGV0IGlzR3JlZ29yaWFuOiBib29sZWFuO1xuICAgIGlmICh0eXBlID09ICdncmVnJykge1xuICAgICAgaXNHcmVnb3JpYW4gPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpc0dyZWdvcmlhbiA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoaXNHcmVnb3JpYW4pIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEdyZWdvcmlhbk1vbnRoRGF0YShkYXksIG1vbnRoLCB5ZWFyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0VW1BbFF1cnJhTW9udGhEYXRhKGRheSwgbW9udGgsIHllYXIpO1xuICAgIH1cbiAgfVxuXG4gIGdldEdyZWdvcmlhbk1vbnRoRGF0YShcbiAgICBkYXk6IG51bWJlcixcbiAgICBtb250aDogbnVtYmVyLFxuICAgIHllYXI6IG51bWJlclxuICApOiBEYXlJbmZvW10gfCBudWxsIHtcbiAgICBjb25zdCB5ZWFyRGF0YSA9IHRoaXMuY2FsZW5kYXJEYXRhW3llYXJdO1xuICAgIGlmICgheWVhckRhdGEpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IG1vbnRoRGF0YSA9IHllYXJEYXRhW21vbnRoXTtcbiAgICBpZiAoIW1vbnRoRGF0YSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgbW9udGhBcnJheTogRGF5SW5mb1tdID0gW107XG4gICAgY29uc3QgZW5kRGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCAwKTtcbiAgICBmb3IgKGxldCBkID0gMTsgZCA8PSBlbmREYXRlLmdldERhdGUoKTsgZCsrKSB7XG4gICAgICBjb25zdCBvZmZzZXQgPSBkIC0gMTtcblxuICAgICAgbW9udGhBcnJheS5wdXNoKHtcbiAgICAgICAgZ0Q6IGAke2QudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfS8ke21vbnRoXG4gICAgICAgICAgLnRvU3RyaW5nKClcbiAgICAgICAgICAucGFkU3RhcnQoMiwgJzAnKX0vJHt5ZWFyfWAsXG4gICAgICAgIHVEOiB0aGlzLmNhbGN1bGF0ZVVtQWxRdXJyYURhdGUoXG4gICAgICAgICAgbW9udGhEYXRhLmZELnVELFxuICAgICAgICAgIG9mZnNldCxcbiAgICAgICAgICBtb250aERhdGEuZkQudUNcbiAgICAgICAgKSxcbiAgICAgICAgZE46IHRoaXMuZ2V0RGF5TmFtZShuZXcgRGF0ZSh5ZWFyLCBtb250aCAtIDEsIGQpLmdldERheSgpKSxcbiAgICAgICAgdUM6IG1vbnRoRGF0YS5mRC51QyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBtb250aEFycmF5O1xuICB9XG5cbiAgZ2V0VW1BbFF1cnJhTW9udGhEYXRhKFxuICAgIGRheTogbnVtYmVyLFxuICAgIG1vbnRoOiBudW1iZXIsXG4gICAgeWVhcjogbnVtYmVyXG4gICk6IERheUluZm9bXSB8IG51bGwge1xuICAgIGZvciAoY29uc3QgZ3JlZ29yaWFuWWVhciBpbiB0aGlzLmNhbGVuZGFyRGF0YSkge1xuICAgICAgY29uc3QgeWVhckRhdGEgPSB0aGlzLmNhbGVuZGFyRGF0YVtwYXJzZUludChncmVnb3JpYW5ZZWFyKV07XG5cbiAgICAgIGZvciAoY29uc3QgbW9udGhJbmRleCBpbiB5ZWFyRGF0YSkge1xuICAgICAgICBjb25zdCBtb250aERhdGEgPSB5ZWFyRGF0YVtwYXJzZUludChtb250aEluZGV4KV07XG4gICAgICAgIGNvbnN0IFtmRGF5LCBmTW9udGgsIGZZZWFyXSA9IG1vbnRoRGF0YT8uZkQ/LnVEPy5zcGxpdCgnLycpLm1hcChOdW1iZXIpO1xuXG4gICAgICAgIGlmIChmWWVhciA9PT0geWVhciAmJiBmTW9udGggPT09IG1vbnRoKSB7XG4gICAgICAgICAgY29uc3QgdG90YWxEYXlzID0gbW9udGhEYXRhLmZELnVDO1xuICAgICAgICAgIGNvbnN0IG1vbnRoQXJyYXk6IERheUluZm9bXSA9IFtdO1xuICAgICAgICAgIGNvbnN0IHVtQWxRdXJyYVN0YXJ0RGF0ZSA9IGAwMS8ke21vbnRoXG4gICAgICAgICAgICAudG9TdHJpbmcoKVxuICAgICAgICAgICAgLnBhZFN0YXJ0KDIsICcwJyl9LyR7eWVhcn1gO1xuICAgICAgICAgIGNvbnN0IGRheURpZmZlcmVuY2UgPSBmRGF5IC0gMTtcblxuICAgICAgICAgIGNvbnN0IHN0YXJ0R3JlZ29yaWFuRGF0ZSA9IHRoaXMuY2FsY3VsYXRlR3JlZ29yaWFuRGF0ZShcbiAgICAgICAgICAgIG1vbnRoRGF0YS5mRC5nRCxcbiAgICAgICAgICAgIC1kYXlEaWZmZXJlbmNlXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG90YWxEYXlzOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHVEYXRlID0gdGhpcy5jYWxjdWxhdGVVbUFsUXVycmFEYXRlKFxuICAgICAgICAgICAgICB1bUFsUXVycmFTdGFydERhdGUsXG4gICAgICAgICAgICAgIGksXG4gICAgICAgICAgICAgIHRvdGFsRGF5c1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IGdEYXRlID0gdGhpcy5jYWxjdWxhdGVHcmVnb3JpYW5EYXRlKHN0YXJ0R3JlZ29yaWFuRGF0ZSwgaSk7XG4gICAgICAgICAgICBjb25zdCBbZ0RheSwgZ01vbnRoLCBnWWVhcl0gPSBnRGF0ZT8uc3BsaXQoJy8nKS5tYXAoTnVtYmVyKTtcbiAgICAgICAgICAgIGNvbnN0IGRheU5hbWUgPSB0aGlzLmdldERheU5hbWUoXG4gICAgICAgICAgICAgIG5ldyBEYXRlKGdZZWFyLCBnTW9udGggLSAxLCBnRGF5KS5nZXREYXkoKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgbW9udGhBcnJheS5wdXNoKHtcbiAgICAgICAgICAgICAgZ0Q6IGdEYXRlLFxuICAgICAgICAgICAgICB1RDogdURhdGUsXG4gICAgICAgICAgICAgIGROOiBkYXlOYW1lLFxuICAgICAgICAgICAgICB1QzogdG90YWxEYXlzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIG1vbnRoQXJyYXk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNhbGN1bGF0ZUdyZWdvcmlhbkRhdGUoc3RhcnRHRGF0ZTogc3RyaW5nLCBvZmZzZXQ6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgW2RheSwgbW9udGgsIHllYXJdID0gc3RhcnRHRGF0ZT8uc3BsaXQoJy8nKS5tYXAoTnVtYmVyKTtcbiAgICBjb25zdCBuZXdEYXRlID0gbmV3IERhdGUoeWVhciwgbW9udGggLSAxLCBkYXkgKyBvZmZzZXQpO1xuXG4gICAgcmV0dXJuIGAke25ld0RhdGUuZ2V0RGF0ZSgpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKX0vJHsoXG4gICAgICBuZXdEYXRlLmdldE1vbnRoKCkgKyAxXG4gICAgKVxuICAgICAgLnRvU3RyaW5nKClcbiAgICAgIC5wYWRTdGFydCgyLCAnMCcpfS8ke25ld0RhdGUuZ2V0RnVsbFllYXIoKX1gO1xuICB9XG5cbiAgY2FsY3VsYXRlVW1BbFF1cnJhRGF0ZShcbiAgICBzdGFydFVEYXRlOiBzdHJpbmcsXG4gICAgb2Zmc2V0OiBudW1iZXIsXG4gICAgdUM6IG51bWJlclxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IFtkYXksIG1vbnRoLCB5ZWFyXSA9IHN0YXJ0VURhdGU/LnNwbGl0KCcvJykubWFwKE51bWJlcik7XG5cbiAgICBsZXQgbmV3RGF5ID0gZGF5ICsgb2Zmc2V0O1xuICAgIGxldCBuZXdNb250aCA9IG1vbnRoO1xuICAgIGxldCBuZXdZZWFyID0geWVhcjtcblxuICAgIHdoaWxlIChuZXdEYXkgPiB1Qykge1xuICAgICAgbmV3RGF5IC09IHVDO1xuICAgICAgbmV3TW9udGggKz0gMTtcbiAgICB9XG5cbiAgICB3aGlsZSAobmV3TW9udGggPiAxMikge1xuICAgICAgbmV3TW9udGggPSAxO1xuICAgICAgbmV3WWVhciArPSAxO1xuICAgIH1cblxuICAgIHJldHVybiBgJHtuZXdEYXkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfS8ke25ld01vbnRoXG4gICAgICAudG9TdHJpbmcoKVxuICAgICAgLnBhZFN0YXJ0KDIsICcwJyl9LyR7bmV3WWVhcn1gO1xuICB9XG5cbiAgZ2V0RGF5TmFtZShkYXlJbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBkYXlzID0gWydTdW4nLCAnTW9uJywgJ1R1ZScsICdXZWQnLCAnVGh1JywgJ0ZyaScsICdTYXQnXTtcbiAgICByZXR1cm4gZGF5c1tkYXlJbmRleF07XG4gIH1cblxuICAvLy8gQ2hlY2sgZGF0ZSBpcyBpdCBpbiBwYXN0IG9yIGZ1dHVyZVxuICBjaGVja1Bhc3RPckZ1dHVyZShpbnB1dERhdGU6IGFueSwgdGFyZ2V0RGF0ZTogYW55KSB7XG4gICAgaWYgKGlucHV0RGF0ZSkge1xuICAgICAgY29uc3QgW2RheSwgbW9udGgsIHllYXJdID0gaW5wdXREYXRlPy5zcGxpdCgnLycpLm1hcChOdW1iZXIpO1xuICAgICAgY29uc3QgZGF0ZVRvQ2hlY2sgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCAtIDEsIGRheSk7XG4gICAgICBjb25zdCB0b2RheSA9IHRhcmdldERhdGU7XG4gICAgICB0b2RheS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICAgIGlmIChkYXRlVG9DaGVjayA+IHRvZGF5KSB7XG4gICAgICAgIHJldHVybiAnRnV0dXJlJztcbiAgICAgIH0gZWxzZSBpZiAoZGF0ZVRvQ2hlY2sgPCB0b2RheSkge1xuICAgICAgICByZXR1cm4gJ1Bhc3QnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuICdUb2RheSc7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8vIENvbnZlcnQgZW5nbGlzaCBudW1iZXJzIHRvIGFyYWJpYyBlcXVpdmFsZW50XG4gIHBhcnNlRW5nbGlzaChlbmdsaXNoTnVtOiBhbnkpIHtcbiAgICBpZiAoIWVuZ2xpc2hOdW0pIHJldHVybiBlbmdsaXNoTnVtO1xuICAgIGNvbnN0IG51bVN0ciA9IFN0cmluZyhlbmdsaXNoTnVtKTtcbiAgICBjb25zdCBhcmFiaWNOdW1iZXJzID0gW1xuICAgICAgJ1xcdTA2NjAnLFxuICAgICAgJ1xcdTA2NjEnLFxuICAgICAgJ1xcdTA2NjInLFxuICAgICAgJ1xcdTA2NjMnLFxuICAgICAgJ1xcdTA2NjQnLFxuICAgICAgJ1xcdTA2NjUnLFxuICAgICAgJ1xcdTA2NjYnLFxuICAgICAgJ1xcdTA2NjcnLFxuICAgICAgJ1xcdTA2NjgnLFxuICAgICAgJ1xcdTA2NjknLFxuICAgIF07XG4gICAgcmV0dXJuIG51bVN0ci5yZXBsYWNlKC9bMC05XS9nLCAoZGlnaXQpID0+IHtcbiAgICAgIHJldHVybiBhcmFiaWNOdW1iZXJzW051bWJlcihkaWdpdCldIHx8IGRpZ2l0O1xuICAgIH0pO1xuICB9XG5cbiAgLy8vIENvbnZlcnQgYXJhYmljIG51bWJlcnMgdG8gZW5nbGlzaCBlcXVpdmFsZW50XG4gIHBhcnNlQXJhYmljKGFyYWJpY051bTogYW55KSB7XG4gICAgcmV0dXJuIGFyYWJpY051bS5yZXBsYWNlKC9b2aDZodmi2aPZpNml2abZp9mo2aldL2csIGZ1bmN0aW9uIChkOiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBkLmNoYXJDb2RlQXQoMCkgLSAxNjMyO1xuICAgIH0pO1xuICB9XG5cbiAgLy8vXG4gIGNvbnZlcnREYXRlTnVtZXJhbHMoZGF0ZTogc3RyaW5nLCB0YXJnZXRMYW5nOiAnZW4nIHwgJ2FyJyk6IHN0cmluZyB7XG4gICAgY29uc3QgYXJhYmljTnVtYmVycyA9IFsn2aAnLCAn2aEnLCAn2aInLCAn2aMnLCAn2aQnLCAn2aUnLCAn2aYnLCAn2acnLCAn2agnLCAn2aknXTtcbiAgICBjb25zdCBlbmdsaXNoTnVtYmVycyA9IFsnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOSddO1xuXG4gICAgY29uc3QgdG9BcmFiaWMgPSAodmFsdWU6IHN0cmluZykgPT5cbiAgICAgIHZhbHVlXG4gICAgICAgIC5zcGxpdCgnJylcbiAgICAgICAgLm1hcCgoY2hhcikgPT4gKC9cXGQvLnRlc3QoY2hhcikgPyBhcmFiaWNOdW1iZXJzWytjaGFyXSA6IGNoYXIpKVxuICAgICAgICAuam9pbignJyk7XG5cbiAgICBjb25zdCB0b0VuZ2xpc2ggPSAodmFsdWU6IHN0cmluZykgPT5cbiAgICAgIHZhbHVlXG4gICAgICAgIC5zcGxpdCgnJylcbiAgICAgICAgLm1hcCgoY2hhcikgPT4ge1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gYXJhYmljTnVtYmVycy5pbmRleE9mKGNoYXIpO1xuICAgICAgICAgIHJldHVybiBpbmRleCA+IC0xID8gZW5nbGlzaE51bWJlcnNbaW5kZXhdIDogY2hhcjtcbiAgICAgICAgfSlcbiAgICAgICAgLmpvaW4oJycpO1xuXG4gICAgaWYgKHRhcmdldExhbmcgPT09ICdhcicpIHtcbiAgICAgIGNvbnN0IFtkYXksIG1vbnRoLCB5ZWFyXSA9IGRhdGUuc3BsaXQoJy8nKTtcbiAgICAgIHJldHVybiBgJHt0b0FyYWJpYyh5ZWFyKX0vJHt0b0FyYWJpYyhtb250aCl9LyR7dG9BcmFiaWMoZGF5KX1gO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBbeWVhciwgbW9udGgsIGRheV0gPSBkYXRlLnNwbGl0KCcvJyk7XG4gICAgICByZXR1cm4gYCR7dG9FbmdsaXNoKGRheSl9LyR7dG9FbmdsaXNoKG1vbnRoKX0vJHt0b0VuZ2xpc2goeWVhcil9YDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplIGlucHV0IGRhdGUgdG8gREQvTU0vWVlZWSBzdHJpbmcgZm9ybWF0IChHcmVnb3JpYW4pXG4gICAqIEFjY2VwdHMgRGF0ZSBvYmplY3Qgb3IgREQvTU0vWVlZWSBzdHJpbmdcbiAgICovXG4gIG5vcm1hbGl6ZURhdGVUb1N0cmluZyhkYXRlOiBEYXRlIHwgc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCFkYXRlKSByZXR1cm4gbnVsbDtcblxuICAgIGlmIChkYXRlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0RGF0ZShkYXRlKTtcbiAgICB9XG5cbiAgICAvLyBBbHJlYWR5IGEgc3RyaW5nIC0gdmFsaWRhdGUgZm9ybWF0XG4gICAgY29uc3QgcGFyc2VkID0gdGhpcy5wYXJzZURhdGUoZGF0ZSk7XG4gICAgcmV0dXJuIHBhcnNlZCA/IHRoaXMuZm9ybWF0RGF0ZShwYXJzZWQpIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wYXJlIHR3byBkYXRlcyAoR3JlZ29yaWFuIGZvcm1hdCBERC9NTS9ZWVlZKVxuICAgKiBSZXR1cm5zOiAtMSBpZiBkYXRlMSA8IGRhdGUyLCAwIGlmIGVxdWFsLCAxIGlmIGRhdGUxID4gZGF0ZTJcbiAgICovXG4gIGNvbXBhcmVEYXRlcyhkYXRlMVN0cjogc3RyaW5nLCBkYXRlMlN0cjogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCBkMSA9IHRoaXMucGFyc2VEYXRlKGRhdGUxU3RyKTtcbiAgICBjb25zdCBkMiA9IHRoaXMucGFyc2VEYXRlKGRhdGUyU3RyKTtcblxuICAgIGlmICghZDEgfHwgIWQyKSByZXR1cm4gMDtcblxuICAgIGlmIChkMSA8IGQyKSByZXR1cm4gLTE7XG4gICAgaWYgKGQxID4gZDIpIHJldHVybiAxO1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXBhcmUgdHdvIEhpanJpIGRhdGVzIChVTSBmb3JtYXQgREQvTU0vWVlZWSlcbiAgICogQ29udmVydHMgdG8gR3JlZ29yaWFuIGZvciBjb21wYXJpc29uXG4gICAqL1xuICBjb21wYXJlSGlqcmlEYXRlcyhoaWpyaTE6IHN0cmluZywgaGlqcmkyOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGNvbnN0IGRheTEgPSB0aGlzLmNvbnZlcnREYXRlKGhpanJpMSwgZmFsc2UpO1xuICAgIGNvbnN0IGRheTIgPSB0aGlzLmNvbnZlcnREYXRlKGhpanJpMiwgZmFsc2UpO1xuXG4gICAgaWYgKCFkYXkxPy5nRCB8fCAhZGF5Mj8uZ0QpIHJldHVybiAwO1xuXG4gICAgcmV0dXJuIHRoaXMuY29tcGFyZURhdGVzKGRheTEuZ0QsIGRheTIuZ0QpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgZGF0ZSBpcyB3aXRoaW4gdGhlIHNwZWNpZmllZCByYW5nZSAoaW5jbHVzaXZlKVxuICAgKiBBbGwgZGF0ZXMgaW4gR3JlZ29yaWFuIEREL01NL1lZWVkgZm9ybWF0XG4gICAqL1xuICBpc0RhdGVJblJhbmdlKFxuICAgIGRhdGVTdHI6IHN0cmluZyxcbiAgICBtaW5EYXRlU3RyOiBzdHJpbmcgfCBudWxsLFxuICAgIG1heERhdGVTdHI6IHN0cmluZyB8IG51bGxcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKCFkYXRlU3RyKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBJZiBubyBjb25zdHJhaW50cywgZGF0ZSBpcyB2YWxpZFxuICAgIGlmICghbWluRGF0ZVN0ciAmJiAhbWF4RGF0ZVN0cikgcmV0dXJuIHRydWU7XG5cbiAgICAvLyBDaGVjayBtaW5pbXVtIGNvbnN0cmFpbnRcbiAgICBpZiAobWluRGF0ZVN0ciAmJiB0aGlzLmNvbXBhcmVEYXRlcyhkYXRlU3RyLCBtaW5EYXRlU3RyKSA8IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBtYXhpbXVtIGNvbnN0cmFpbnRcbiAgICBpZiAobWF4RGF0ZVN0ciAmJiB0aGlzLmNvbXBhcmVEYXRlcyhkYXRlU3RyLCBtYXhEYXRlU3RyKSA+IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIEhpanJpIGRhdGUgaXMgd2l0aGluIHRoZSBzcGVjaWZpZWQgcmFuZ2VcbiAgICogQ29udmVydHMgdG8gR3JlZ29yaWFuIGZvciBjb21wYXJpc29uXG4gICAqL1xuICBpc0hpanJpRGF0ZUluUmFuZ2UoXG4gICAgaGlqcmlEYXRlU3RyOiBzdHJpbmcsXG4gICAgbWluRGF0ZVN0cjogc3RyaW5nIHwgbnVsbCxcbiAgICBtYXhEYXRlU3RyOiBzdHJpbmcgfCBudWxsXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmICghaGlqcmlEYXRlU3RyKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBkYXlJbmZvID0gdGhpcy5jb252ZXJ0RGF0ZShoaWpyaURhdGVTdHIsIGZhbHNlKTtcbiAgICBpZiAoIWRheUluZm8/LmdEKSByZXR1cm4gZmFsc2U7XG5cbiAgICByZXR1cm4gdGhpcy5pc0RhdGVJblJhbmdlKGRheUluZm8uZ0QsIG1pbkRhdGVTdHIsIG1heERhdGVTdHIpO1xuICB9XG59XG4iXX0=
@@ -1,5 +0,0 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- export * from './public-api';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1oaWpyaS1ncmVnb3JpYW4tZGF0ZS10aW1lLXBpY2tlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2hpanJpLWdyZWdvcmlhbi1kYXRlcGlja2VyL3NyYy9hbmd1bGFyLWhpanJpLWdyZWdvcmlhbi1kYXRlLXRpbWUtcGlja2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vcHVibGljLWFwaSc7XG4iXX0=