nmce-func 1.3.2 → 1.4.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.
- package/README.md +24 -24
- package/_func/currencyFunc.d.ts +16 -6
- package/_func/dateFunc.d.ts +75 -78
- package/_func/index.d.ts +0 -1
- package/esm2022/_func/addressFunc.mjs +1 -1
- package/esm2022/_func/currencyFunc.mjs +45 -33
- package/esm2022/_func/dateFunc.mjs +193 -201
- package/esm2022/_func/htmlPrintFunc.mjs +6 -6
- package/esm2022/_func/index.mjs +1 -2
- package/esm2022/_func/jsonFunc.mjs +6 -4
- package/esm2022/_func/stringAusFunc.mjs +1 -1
- package/esm2022/_func/stringFunc.mjs +1 -1
- package/esm2022/_func/uuidFunc.mjs +1 -3
- package/esm2022/public-api.mjs +1 -1
- package/fesm2022/nmce-func.mjs +247 -291
- package/fesm2022/nmce-func.mjs.map +1 -1
- package/package.json +1 -1
- package/_func/authentication.service.d.ts +0 -27
- package/esm2022/_func/authentication.service.mjs +0 -48
|
@@ -1,99 +1,155 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { DateTime, Duration, Settings } from 'luxon';
|
|
2
2
|
export class DateFunc {
|
|
3
|
+
/**
|
|
4
|
+
* At runtime, there's no simple guarantee that the input is Date. Sometimes you codes expect date, but the response from the Web service may give you string or number.
|
|
5
|
+
* This function give you safe parse of date data from I/O, not of your control.
|
|
6
|
+
* If the data is invalid, throws RangeError or TypeError.
|
|
7
|
+
* @param dt
|
|
8
|
+
* @returns
|
|
9
|
+
*/
|
|
10
|
+
static dateDataToDate(dt) {
|
|
11
|
+
if (dt instanceof Date) {
|
|
12
|
+
return dt;
|
|
13
|
+
}
|
|
14
|
+
if (typeof dt === 'string') {
|
|
15
|
+
const r = Date.parse(dt);
|
|
16
|
+
if (isNaN(r)) {
|
|
17
|
+
throw new RangeError('Invalid string for Date');
|
|
18
|
+
}
|
|
19
|
+
return new Date(r);
|
|
20
|
+
}
|
|
21
|
+
if (typeof dt === 'number') {
|
|
22
|
+
const rd = new Date(dt);
|
|
23
|
+
if (Number.isNaN(rd.valueOf())) {
|
|
24
|
+
throw new RangeError('Invalid number for Date');
|
|
25
|
+
}
|
|
26
|
+
return rd;
|
|
27
|
+
}
|
|
28
|
+
throw new TypeError('Expect Date, string or number');
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Similar to dateDataToDate, but allow null and defined semantically.
|
|
32
|
+
* @param dt
|
|
33
|
+
* @returns
|
|
34
|
+
*/
|
|
35
|
+
static dateDataToDateOrNull(dt) {
|
|
36
|
+
if (dt instanceof Date) {
|
|
37
|
+
return dt;
|
|
38
|
+
}
|
|
39
|
+
if (typeof dt === 'string') {
|
|
40
|
+
const r = Date.parse(dt);
|
|
41
|
+
if (isNaN(r)) {
|
|
42
|
+
throw new RangeError('Invalid string for Date');
|
|
43
|
+
}
|
|
44
|
+
return new Date(r);
|
|
45
|
+
}
|
|
46
|
+
if (typeof dt === 'number') {
|
|
47
|
+
const rd = new Date(dt);
|
|
48
|
+
if (Number.isNaN(rd.valueOf())) {
|
|
49
|
+
throw new RangeError('Invalid number for Date');
|
|
50
|
+
}
|
|
51
|
+
return rd;
|
|
52
|
+
}
|
|
53
|
+
if (dt == null) {
|
|
54
|
+
return dt;
|
|
55
|
+
}
|
|
56
|
+
throw new TypeError('Expect Date, string or number');
|
|
57
|
+
}
|
|
3
58
|
/**
|
|
4
59
|
* Transform UTC DateTime to local date without H, M and S. For example, the month day of 2018-01-23T22:00:00Z is 24 in Australia.
|
|
5
60
|
* @param dtUtc
|
|
6
|
-
* @param offsetMinutes if not defined, it will be new Date().getTimezoneOffset(). //https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getTimezoneOffset
|
|
7
61
|
*/
|
|
8
62
|
static dateTimeUtcToLocalDateNumber(dtUtc) {
|
|
9
|
-
if (
|
|
10
|
-
return
|
|
63
|
+
if (dtUtc == null) {
|
|
64
|
+
return dtUtc;
|
|
11
65
|
}
|
|
12
|
-
const localDt =
|
|
66
|
+
const localDt = this.dateDataToDate(dtUtc);
|
|
13
67
|
const localDNum = localDt.setHours(0, 0, 0, 0);
|
|
14
68
|
return localDNum;
|
|
15
69
|
}
|
|
16
70
|
/**
|
|
17
71
|
* Date only. However, the date may still be in UTC.
|
|
18
72
|
* @param dtUtc
|
|
73
|
+
* @returns new Date object.
|
|
19
74
|
*/
|
|
20
75
|
static dateTimeUtcToLocalDate(dtUtc) {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
76
|
+
if (dtUtc == null) {
|
|
77
|
+
return dtUtc;
|
|
78
|
+
}
|
|
79
|
+
const localDt = this.dateDataToDate(dtUtc);
|
|
80
|
+
const localNum = localDt.setHours(0, 0, 0, 0);
|
|
81
|
+
return new Date(localNum);
|
|
24
82
|
}
|
|
83
|
+
/**
|
|
84
|
+
* '2018-01-23T22:00:00Z' will become '2018-01-24' in Australia.
|
|
85
|
+
* @param dtUtc
|
|
86
|
+
* @returns new Date object.
|
|
87
|
+
*/
|
|
25
88
|
static localISODateString(dtUtc) {
|
|
26
|
-
const dt =
|
|
27
|
-
|
|
89
|
+
const dt = this.dateTimeUtcToLocalDate(dtUtc);
|
|
90
|
+
if (dt == null) {
|
|
91
|
+
return dt;
|
|
92
|
+
}
|
|
93
|
+
const d = DateTime.fromJSDate(dt);
|
|
94
|
+
return d.toISODate();
|
|
28
95
|
}
|
|
29
96
|
/**
|
|
30
|
-
*
|
|
97
|
+
* local date ONLY (no time) to UTC date.
|
|
98
|
+
* The input could be a string of yyyy-MM-dd, or a Date Object.
|
|
99
|
+
* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date
|
|
100
|
+
* While the time value at the heart of a Date object is UTC, the basic methods to fetch the date and time
|
|
101
|
+
* or its components all work in the local (i.e. host system) time zone and offset.
|
|
31
102
|
* @param dt if dt contain time info, it will become dt.setHours(0, 0, 0, 0)
|
|
32
103
|
*/
|
|
33
104
|
static localDateToUtc(d) {
|
|
34
|
-
|
|
105
|
+
if (d == null) {
|
|
106
|
+
return d;
|
|
107
|
+
}
|
|
108
|
+
const dt = this.dateDataToDate(d);
|
|
35
109
|
const n = dt.setHours(0, 0, 0, 0);
|
|
36
110
|
const offset = dt.getTimezoneOffset() * 60000;
|
|
37
111
|
return new Date(n + offset);
|
|
38
112
|
}
|
|
39
|
-
static getTimezoneOffset() {
|
|
40
|
-
const dt = this.today;
|
|
41
|
-
return dt.getTimezoneOffset();
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Transform UTC DateTime to local dateTime.
|
|
45
|
-
* @param dtUtc
|
|
46
|
-
* @param offsetMinutes if not defined, it will be new Date().getTimezoneOffset(). //https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getTimezoneOffset
|
|
47
|
-
*/
|
|
48
|
-
static dateTimeUtcToLocalDateTime(dtUtc) {
|
|
49
|
-
const stillUtc = moment.utc(dtUtc).toDate();
|
|
50
|
-
return moment(stillUtc).local().toDate();
|
|
51
|
-
}
|
|
52
|
-
static dateTimeUtcToLocaMoment(dtUtc) {
|
|
53
|
-
const stillUtc = moment.utc(dtUtc);
|
|
54
|
-
return stillUtc.local();
|
|
55
|
-
}
|
|
56
113
|
static getEndOfWeek(dt) {
|
|
57
|
-
|
|
114
|
+
const dateTime = DateTime.fromJSDate(this.dateDataToDate(dt));
|
|
115
|
+
return dateTime.endOf('week').toJSDate();
|
|
58
116
|
}
|
|
59
117
|
static getStartOfWeek(dt) {
|
|
60
|
-
|
|
118
|
+
const dateTime = DateTime.fromJSDate(this.dateDataToDate(dt));
|
|
119
|
+
return dateTime.startOf('week').toJSDate();
|
|
61
120
|
}
|
|
62
121
|
static getEndOfMonth(dt) {
|
|
63
|
-
|
|
64
|
-
return
|
|
122
|
+
const dateTime = DateTime.fromJSDate(this.dateDataToDate(dt));
|
|
123
|
+
return dateTime.endOf('month').toJSDate();
|
|
65
124
|
}
|
|
66
125
|
static getStartOfMonth(dt) {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
static getDaysBetweenDates(dt1, dt2) {
|
|
70
|
-
return this.getDaysBetween(dt1, dt2);
|
|
126
|
+
const dateTime = DateTime.fromJSDate(this.dateDataToDate(dt));
|
|
127
|
+
return dateTime.startOf('month').toJSDate();
|
|
71
128
|
}
|
|
72
129
|
static getEndOfDate(dt) {
|
|
73
|
-
|
|
74
|
-
|
|
130
|
+
const dateTime = DateTime.fromJSDate(this.dateDataToDate(dt));
|
|
131
|
+
return dateTime.endOf('day').toJSDate();
|
|
75
132
|
}
|
|
76
133
|
static getStartOfDate(dt) {
|
|
77
|
-
|
|
134
|
+
const dateTime = DateTime.fromJSDate(this.dateDataToDate(dt));
|
|
135
|
+
return dateTime.startOf('day').toJSDate();
|
|
78
136
|
}
|
|
79
137
|
static getEndOfToday() {
|
|
80
|
-
|
|
81
|
-
return moment(Date.now()).endOf('day').toDate();
|
|
138
|
+
return this.getEndOfDate(Date.now());
|
|
82
139
|
}
|
|
83
140
|
static getStartOfToday() {
|
|
84
|
-
|
|
85
|
-
return moment(Date.now()).startOf('day').toDate();
|
|
141
|
+
return this.getStartOfDate(Date.now());
|
|
86
142
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
const
|
|
90
|
-
|
|
91
|
-
return dat.toDate();
|
|
143
|
+
static getDaysBetween(d1, d2) {
|
|
144
|
+
const dm1 = DateTime.fromJSDate(this.dateDataToDate(d1));
|
|
145
|
+
const dm2 = DateTime.fromJSDate(this.dateDataToDate(d1));
|
|
146
|
+
return dm2.diff(dm1, 'days').days;
|
|
92
147
|
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
dat.
|
|
96
|
-
|
|
148
|
+
//inspired https://stackoverflow.com/questions/563406/add-days-to-javascript-date
|
|
149
|
+
static addDays(dt, days) {
|
|
150
|
+
const dat = DateTime.fromJSDate(this.dateDataToDate(dt));
|
|
151
|
+
const r = dat.plus({ days: days });
|
|
152
|
+
return r.toJSDate();
|
|
97
153
|
}
|
|
98
154
|
/**
|
|
99
155
|
* Start of today
|
|
@@ -104,104 +160,119 @@ export class DateFunc {
|
|
|
104
160
|
static get now() {
|
|
105
161
|
return new Date(Date.now());
|
|
106
162
|
}
|
|
163
|
+
/**
|
|
164
|
+
* From now, next 5 minute mark. For example 2:23:44 will be 2:25:00;
|
|
165
|
+
* @returns
|
|
166
|
+
*/
|
|
107
167
|
static getNext5MinuteMark() {
|
|
108
|
-
const m =
|
|
109
|
-
const minute = m.minute
|
|
168
|
+
const m = DateTime.now().set({ second: 0, millisecond: 0 });
|
|
169
|
+
const minute = m.minute;
|
|
110
170
|
const mod = minute % 5;
|
|
111
171
|
if (mod) {
|
|
112
172
|
const delta = 5 - mod;
|
|
113
|
-
return m.
|
|
173
|
+
return m.plus({ minutes: delta }).toJSDate();
|
|
114
174
|
}
|
|
115
|
-
return m.
|
|
175
|
+
return m.toJSDate();
|
|
116
176
|
}
|
|
117
177
|
static getYMD(d) {
|
|
118
|
-
|
|
178
|
+
const dt = DateTime.fromJSDate(this.dateDataToDate(d));
|
|
179
|
+
return dt.toFormat('yyyyMMdd');
|
|
119
180
|
}
|
|
120
181
|
static getDMYWithSlash(d) {
|
|
121
|
-
|
|
182
|
+
const dt = DateTime.fromJSDate(this.dateDataToDate(d));
|
|
183
|
+
return dt.toFormat('dd/MM/yyyy');
|
|
122
184
|
}
|
|
123
185
|
static getDMYHmWithSlash(d) {
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
static getMcpTime(dt) {
|
|
127
|
-
return moment(dt).format('HH:mm:ss.SSSZ');
|
|
186
|
+
const dt = DateTime.fromJSDate(this.dateDataToDate(d));
|
|
187
|
+
return dt.toFormat('dd/MM/yyyy HH:mm');
|
|
128
188
|
}
|
|
129
189
|
/**
|
|
130
|
-
*
|
|
131
|
-
* @param dtUtc
|
|
190
|
+
*
|
|
191
|
+
* @param dtUtc In 24 hour format, and the date separator depending on the system or Luxon default locale
|
|
192
|
+
* @returns
|
|
132
193
|
*/
|
|
133
|
-
static
|
|
134
|
-
|
|
135
|
-
|
|
194
|
+
static getDateTime24Simple(dtUtc) {
|
|
195
|
+
if (dtUtc == null) {
|
|
196
|
+
return dtUtc;
|
|
197
|
+
}
|
|
198
|
+
const d = this.dateDataToDate(dtUtc);
|
|
199
|
+
const dt = DateTime.fromJSDate(d);
|
|
200
|
+
return dt.toLocaleString(DateTime.DATE_SHORT) + ' ' + dt.toLocaleString(DateTime.TIME_24_SIMPLE);
|
|
201
|
+
}
|
|
202
|
+
static setDefaultLocale(locale) {
|
|
203
|
+
Settings.defaultLocale = locale;
|
|
204
|
+
}
|
|
205
|
+
static getDefaultLocale() {
|
|
206
|
+
return Settings.defaultLocale;
|
|
207
|
+
}
|
|
208
|
+
static setDefaultZone(zone) {
|
|
209
|
+
Settings.defaultZone = zone;
|
|
210
|
+
}
|
|
211
|
+
static getDefaultZone() {
|
|
212
|
+
return Settings.defaultZone.name;
|
|
213
|
+
}
|
|
214
|
+
static isZoneValid() {
|
|
215
|
+
return Settings.defaultZone.isValid;
|
|
136
216
|
}
|
|
137
217
|
/**
|
|
138
|
-
*
|
|
218
|
+
* For example, in AEST, it is -600.
|
|
219
|
+
* @returns
|
|
139
220
|
*/
|
|
140
|
-
static
|
|
141
|
-
const
|
|
142
|
-
|
|
143
|
-
return dm1.diff(dm2, 'minutes');
|
|
144
|
-
}
|
|
145
|
-
static getDaysBetween(d1, d2) {
|
|
146
|
-
const dm1 = moment(d1);
|
|
147
|
-
const dm2 = moment(d2);
|
|
148
|
-
return dm2.diff(dm1, 'days');
|
|
221
|
+
static getLocalTimezoneOffset() {
|
|
222
|
+
const dt = new Date(Date.now());
|
|
223
|
+
return dt.getTimezoneOffset();
|
|
149
224
|
}
|
|
150
225
|
/**
|
|
151
226
|
* Get hour of the date. If Date is not defined, the hour will be current hour.
|
|
152
227
|
* @param dtUtc
|
|
153
228
|
*/
|
|
154
229
|
static getHour(dtUtc) {
|
|
155
|
-
const
|
|
156
|
-
return
|
|
230
|
+
const dt = DateTime.fromJSDate(this.dateDataToDate(dtUtc));
|
|
231
|
+
return dt.hour;
|
|
157
232
|
}
|
|
158
233
|
static getMinute(dtUtc) {
|
|
159
|
-
const
|
|
160
|
-
return
|
|
234
|
+
const dt = DateTime.fromJSDate(this.dateDataToDate(dtUtc));
|
|
235
|
+
return dt.minute;
|
|
161
236
|
}
|
|
162
|
-
static
|
|
163
|
-
const
|
|
164
|
-
return
|
|
237
|
+
static GetHM(dtUtc) {
|
|
238
|
+
const dt = DateTime.fromJSDate(this.dateDataToDate(dtUtc));
|
|
239
|
+
return { h: dt.hour, m: dt.minute };
|
|
165
240
|
}
|
|
166
|
-
static
|
|
167
|
-
|
|
168
|
-
return moment().diff(m, 'hours') >= 24;
|
|
241
|
+
static composeDateTime(dt, h = 0, minute = 0, second = 0) {
|
|
242
|
+
return new Date(this.dateDataToDate(dt).setHours(h, minute, second, 0));
|
|
169
243
|
}
|
|
170
|
-
static
|
|
171
|
-
|
|
244
|
+
static olderThan24Hours(d) {
|
|
245
|
+
const m = DateTime.fromJSDate(this.dateDataToDate(d));
|
|
246
|
+
return DateTime.now().diff(m, 'hours') >= Duration.fromISO('PT24H');
|
|
172
247
|
}
|
|
173
248
|
static olderThanHours(d, hours) {
|
|
174
|
-
const m =
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
return
|
|
249
|
+
const m = DateTime.fromJSDate(this.dateDataToDate(d));
|
|
250
|
+
const diff = DateTime.now().diff(m, 'hours');
|
|
251
|
+
const duration = Duration.fromISO(`PT${hours}H`);
|
|
252
|
+
console.debug('diff: ' + diff.hours + ' duration: ' + duration.hours);
|
|
253
|
+
return diff.hours >= duration.hours;
|
|
179
254
|
}
|
|
180
255
|
static olderThanMinutes(d, minutes) {
|
|
181
|
-
const m =
|
|
182
|
-
return
|
|
256
|
+
const m = DateTime.fromJSDate(this.dateDataToDate(d));
|
|
257
|
+
return DateTime.now().diff(m, 'minutes') >= Duration.fromMillis(minutes * 60 * 1000);
|
|
183
258
|
}
|
|
184
259
|
/**
|
|
185
260
|
* It could be 11PM yesterday, and 1 AM today. Actually based on local today.
|
|
186
261
|
*/
|
|
187
262
|
static olderThan1Day(dtUtc) {
|
|
188
|
-
return DateFunc.
|
|
263
|
+
return DateFunc.getDayAge(dtUtc) > 0;
|
|
189
264
|
}
|
|
190
265
|
static getHourAge(d) {
|
|
191
|
-
const m =
|
|
192
|
-
return
|
|
193
|
-
}
|
|
194
|
-
static getHourAgeUtc(dtUtc) {
|
|
195
|
-
const m = moment.utc(dtUtc);
|
|
196
|
-
return moment.utc().diff(m, 'hours');
|
|
266
|
+
const m = DateTime.fromJSDate(this.dateDataToDate(d));
|
|
267
|
+
return DateTime.now().diff(m, 'hours').hours;
|
|
197
268
|
}
|
|
198
269
|
/**
|
|
199
|
-
* Compare
|
|
270
|
+
* Compare date with now.
|
|
200
271
|
* @param dtUtc
|
|
201
272
|
*/
|
|
202
|
-
static
|
|
203
|
-
const m =
|
|
204
|
-
return
|
|
273
|
+
static getDayAge(d) {
|
|
274
|
+
const m = DateTime.fromJSDate(this.dateDataToDate(d));
|
|
275
|
+
return DateTime.now().diff(m, 'days').days;
|
|
205
276
|
}
|
|
206
277
|
/**
|
|
207
278
|
* How many years from now.
|
|
@@ -209,108 +280,29 @@ export class DateFunc {
|
|
|
209
280
|
* @returns
|
|
210
281
|
*/
|
|
211
282
|
static getAge(d) {
|
|
212
|
-
const m =
|
|
213
|
-
return
|
|
214
|
-
}
|
|
215
|
-
/**
|
|
216
|
-
* Year of date.
|
|
217
|
-
* @param d
|
|
218
|
-
* @returns
|
|
219
|
-
*/
|
|
220
|
-
static getYear(d) {
|
|
221
|
-
const m = moment(d);
|
|
222
|
-
return m.year();
|
|
223
|
-
}
|
|
224
|
-
static getUtcNow() {
|
|
225
|
-
return moment.utc().toDate();
|
|
226
|
-
}
|
|
227
|
-
static addMinutes(d, m) {
|
|
228
|
-
return moment(d).add(m, 'm').toDate();
|
|
229
|
-
}
|
|
230
|
-
static addMonth(d, m) {
|
|
231
|
-
return moment(d).add(m, 'M').toDate();
|
|
232
|
-
}
|
|
233
|
-
static getDuration(d1, d2) {
|
|
234
|
-
const md1 = moment(d1);
|
|
235
|
-
const md2 = moment(d2);
|
|
236
|
-
return moment.duration(md2.diff(md1));
|
|
283
|
+
const m = DateTime.fromJSDate(this.dateDataToDate(d));
|
|
284
|
+
return DateTime.now().diff(m, 'years').years;
|
|
237
285
|
}
|
|
238
286
|
/**
|
|
239
287
|
* Convert minutes from midnight to HH:mm text
|
|
240
|
-
* @param
|
|
288
|
+
* @param minutes
|
|
241
289
|
*/
|
|
242
|
-
static getHMFromMins(
|
|
243
|
-
|
|
244
|
-
// getTimeFromMins(1530) to equal getTimeFromMins(90) (i.e. mins rollover)
|
|
245
|
-
if (mins >= 24 * 60 || mins < 0) {
|
|
290
|
+
static getHMFromMins(minutes) {
|
|
291
|
+
if (minutes >= 24 * 60 || minutes < 0) {
|
|
246
292
|
throw new RangeError('Valid input should be greater than or equal to 0 and less than 1440.');
|
|
247
293
|
}
|
|
248
|
-
const h =
|
|
249
|
-
return
|
|
294
|
+
const h = minutes / 60 | 0, m = minutes % 60 | 0;
|
|
295
|
+
return DateTime.utc().set({ hour: h, minute: m }).toFormat('HH:mm');
|
|
250
296
|
}
|
|
251
297
|
static getMinutesSinceMidnight(d) {
|
|
252
|
-
const
|
|
253
|
-
const midnight =
|
|
254
|
-
return
|
|
298
|
+
const dt = DateTime.fromJSDate(this.dateDataToDate(d));
|
|
299
|
+
const midnight = dt.startOf('day');
|
|
300
|
+
return dt.diff(midnight, 'minutes').minutes;
|
|
255
301
|
}
|
|
256
302
|
static getMinutesBetween(start, end) {
|
|
257
|
-
const m =
|
|
258
|
-
const m2 =
|
|
259
|
-
return m2.diff(m, 'minutes');
|
|
260
|
-
}
|
|
261
|
-
/**
|
|
262
|
-
* Parse json string with date serialized into string, and get proper date object back
|
|
263
|
-
* @param s
|
|
264
|
-
*/
|
|
265
|
-
static dateSafeJsonParse(s) {
|
|
266
|
-
return JSON.parse(s, this.dateReviver);
|
|
267
|
-
}
|
|
268
|
-
static dateReviver(key, value) {
|
|
269
|
-
if (DateFunc.isSerializedDate(value)) {
|
|
270
|
-
return (new Date(value));
|
|
271
|
-
}
|
|
272
|
-
// If it's not a date-string, we want to return the value as-is. If we fail to return
|
|
273
|
-
// a value, it will be omitted from the resultant data structure.
|
|
274
|
-
return (value);
|
|
275
|
-
}
|
|
276
|
-
// I determine if the given value is a string that matches the serialized-date pattern.
|
|
277
|
-
static isSerializedDate(value) {
|
|
278
|
-
// Dates are serialized in TZ format, example: '1981-12-20T04:00:14.000Z'.
|
|
279
|
-
const datePattern = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/;
|
|
280
|
-
return (DateFunc.isString(value) && datePattern.test(value));
|
|
281
|
-
}
|
|
282
|
-
// I determine if the given value is a String.
|
|
283
|
-
static isString(value) {
|
|
284
|
-
return ({}.toString.call(value) === '[object String]');
|
|
285
|
-
}
|
|
286
|
-
static dateSafeParse(s) {
|
|
287
|
-
const m = moment(s);
|
|
288
|
-
return m.toDate();
|
|
289
|
-
}
|
|
290
|
-
static composeDateWithMinutes(d, minute) {
|
|
291
|
-
const m = moment(d);
|
|
292
|
-
const midnight = moment(d).startOf('day'); // Mutates the original moment by setting it to the start of a unit of time. So I have better not to use m which wil be changed by calling this function
|
|
293
|
-
midnight.add(minute, 'minutes');
|
|
294
|
-
return midnight.toDate();
|
|
295
|
-
}
|
|
296
|
-
/**
|
|
297
|
-
* Safe compare since date data may be considered as string rather than date.
|
|
298
|
-
* @param d1
|
|
299
|
-
* @param d2
|
|
300
|
-
*/
|
|
301
|
-
static compare(d1, d2) {
|
|
302
|
-
if (!d1 && !d2) {
|
|
303
|
-
return 0;
|
|
304
|
-
}
|
|
305
|
-
if (!d1) {
|
|
306
|
-
return -NaN;
|
|
307
|
-
}
|
|
308
|
-
if (!d2) {
|
|
309
|
-
return NaN;
|
|
310
|
-
}
|
|
311
|
-
const dd1 = (new Date(d1)).valueOf();
|
|
312
|
-
const dd2 = (new Date(d2)).valueOf();
|
|
313
|
-
return dd1 - dd2;
|
|
303
|
+
const m = DateTime.fromJSDate(this.dateDataToDate(start));
|
|
304
|
+
const m2 = DateTime.fromJSDate(this.dateDataToDate(end));
|
|
305
|
+
return m2.diff(m, 'minutes').minutes;
|
|
314
306
|
}
|
|
315
307
|
}
|
|
316
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZUZ1bmMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9ubWNlLWZ1bmMvc3JjL19mdW5jL2RhdGVGdW5jLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUU1QixNQUFNLE9BQU8sUUFBUTtJQUVwQjs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLDRCQUE0QixDQUFDLEtBQThCO1FBQ2pFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNaLE9BQU8sQ0FBQyxDQUFDLENBQUMsNkNBQTZDO1FBQ3hELENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsMEJBQTBCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0QsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUUvQyxPQUFPLFNBQVMsQ0FBQztJQUNsQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLHNCQUFzQixDQUFDLEtBQThCO1FBQzNELE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzVDLE9BQU8sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVELE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxLQUE4QjtRQUN2RCxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDakMsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFN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QUcsQ0FBQztJQUNsQixDQUFDO0NBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5cbmV4cG9ydCBjbGFzcyBEYXRlRnVuYyB7XG5cblx0LyoqXG5cdCAqIFRyYW5zZm9ybSBVVEMgRGF0ZVRpbWUgdG8gbG9jYWwgZGF0ZSB3aXRob3V0IEgsIE0gYW5kIFMuIEZvciBleGFtcGxlLCB0aGUgbW9udGggZGF5IG9mIDIwMTgtMDEtMjNUMjI6MDA6MDBaIGlzIDI0IGluIEF1c3RyYWxpYS5cblx0ICogQHBhcmFtIGR0VXRjXG5cdCAqIEBwYXJhbSBvZmZzZXRNaW51dGVzIGlmIG5vdCBkZWZpbmVkLCBpdCB3aWxsIGJlIG5ldyBEYXRlKCkuZ2V0VGltZXpvbmVPZmZzZXQoKS4gLy9odHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9EYXRlL2dldFRpbWV6b25lT2Zmc2V0XG5cdCAqL1xuXHRzdGF0aWMgZGF0ZVRpbWVVdGNUb0xvY2FsRGF0ZU51bWJlcihkdFV0YzogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQpOiBudW1iZXIge1xuXHRcdGlmICghZHRVdGMpIHtcblx0XHRcdHJldHVybiAwOyAvLzAgaXMgYmV0dGVyIGZvciBjYWxjdWxhdGlvbiBieSB0aGUgY2xpZW50cy5cblx0XHR9XG5cblx0XHRjb25zdCBsb2NhbER0ID0gRGF0ZUZ1bmMuZGF0ZVRpbWVVdGNUb0xvY2FsRGF0ZVRpbWUoZHRVdGMpO1xuXHRcdGNvbnN0IGxvY2FsRE51bSA9IGxvY2FsRHQuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG5cblx0XHRyZXR1cm4gbG9jYWxETnVtO1xuXHR9XG5cblx0LyoqXG5cdCAqIERhdGUgb25seS4gSG93ZXZlciwgdGhlIGRhdGUgbWF5IHN0aWxsIGJlIGluIFVUQy5cblx0ICogQHBhcmFtIGR0VXRjXG5cdCAqL1xuXHRzdGF0aWMgZGF0ZVRpbWVVdGNUb0xvY2FsRGF0ZShkdFV0YzogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQpOiBEYXRlIHtcblx0XHRjb25zdCBsb2NhbER0ID0gRGF0ZUZ1bmMuZGF0ZVRpbWVVdGNUb0xvY2FsRGF0ZVRpbWUoZHRVdGMpO1xuXHRcdGNvbnN0IGxvY2FsRCA9IGxvY2FsRHQuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG5cdFx0cmV0dXJuIG5ldyBEYXRlKGxvY2FsRCk7XG5cdH1cblxuXHRzdGF0aWMgbG9jYWxJU09EYXRlU3RyaW5nKGR0VXRjOiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG5cdFx0Y29uc3QgZHQgPSBtb21lbnQoZHRVdGMpLmxvY2FsKCk7XG5cdFx0cmV0dXJuIGR0LmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xuXHR9XG5cblx0LyoqXG5cdCAqIGxvY2F0ZSBkYXRlIE9OTFkgKG5vIHRpbWUpIHRvIFVUQyBkYXRlLlxuXHQgKiBAcGFyYW0gZHQgaWYgZHQgY29udGFpbiB0aW1lIGluZm8sIGl0IHdpbGwgYmVjb21lIGR0LnNldEhvdXJzKDAsIDAsIDAsIDApXG5cdCAqL1xuXHRzdGF0aWMgbG9jYWxEYXRlVG9VdGMoZDogRGF0ZSB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQgfCBzdHJpbmcpOiBEYXRlIHtcblx0XHRjb25zdCBkdCA9IG1vbWVudChkKS50b0RhdGUoKTtcblx0XHRjb25zdCBuID0gZHQuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG5cdFx0Y29uc3Qgb2Zmc2V0ID0gZHQuZ2V0VGltZXpvbmVPZmZzZXQoKSAqIDYwMDAwO1xuXHRcdHJldHVybiBuZXcgRGF0ZShuICsgb2Zmc2V0KTtcblx0fVxuXG5cdHN0YXRpYyBnZXRUaW1lem9uZU9mZnNldCgpOiBudW1iZXIge1xuXHRcdGNvbnN0IGR0ID0gdGhpcy50b2RheTtcblx0XHRyZXR1cm4gZHQuZ2V0VGltZXpvbmVPZmZzZXQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUcmFuc2Zvcm0gVVRDIERhdGVUaW1lIHRvIGxvY2FsIGRhdGVUaW1lLlxuXHQgKiBAcGFyYW0gZHRVdGNcblx0ICogQHBhcmFtIG9mZnNldE1pbnV0ZXMgaWYgbm90IGRlZmluZWQsIGl0IHdpbGwgYmUgbmV3IERhdGUoKS5nZXRUaW1lem9uZU9mZnNldCgpLiAvL2h0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0RhdGUvZ2V0VGltZXpvbmVPZmZzZXRcblx0ICovXG5cdHN0YXRpYyBkYXRlVGltZVV0Y1RvTG9jYWxEYXRlVGltZShkdFV0YzogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQpOiBEYXRlIHtcblx0XHRjb25zdCBzdGlsbFV0YyA9IG1vbWVudC51dGMoZHRVdGMpLnRvRGF0ZSgpO1xuXHRcdHJldHVybiBtb21lbnQoc3RpbGxVdGMpLmxvY2FsKCkudG9EYXRlKCk7XG5cdH1cblxuXHRzdGF0aWMgZGF0ZVRpbWVVdGNUb0xvY2FNb21lbnQoZHRVdGM6IERhdGUgfCBudWxsIHwgdW5kZWZpbmVkKTogbW9tZW50Lk1vbWVudCB7XG5cdFx0Y29uc3Qgc3RpbGxVdGMgPSBtb21lbnQudXRjKGR0VXRjKTtcblx0XHRyZXR1cm4gc3RpbGxVdGMubG9jYWwoKTtcblx0fVxuXG5cdHN0YXRpYyBnZXRFbmRPZldlZWsoZHQ6IERhdGUgfCBudWxsIHwgdW5kZWZpbmVkIHwgbnVtYmVyKSB7XG5cdFx0cmV0dXJuIG1vbWVudChkdCkuZW5kT2YoJ2lzb1dlZWsnKS50b0RhdGUoKTtcblx0fVxuXG5cdHN0YXRpYyBnZXRTdGFydE9mV2VlayhkdDogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQgfCBudW1iZXIpIHtcblx0XHRyZXR1cm4gbW9tZW50KGR0KS5zdGFydE9mKCdpc29XZWVrJykudG9EYXRlKCk7XG5cdH1cblxuXHRzdGF0aWMgZ2V0RW5kT2ZNb250aChkdDogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQgfCBudW1iZXIpIHtcblx0XHQvLyAgcmV0dXJuIG5ldyBEYXRlKGR0LmdldEZ1bGxZZWFyKCksIGR0LmdldE1vbnRoKCkgKyAxLCAwLCAyMywgNTksIDU5LCA5OTkpO1xuXHRcdHJldHVybiBtb21lbnQoZHQpLmVuZE9mKCdtb250aCcpLnRvRGF0ZSgpO1xuXHR9XG5cblx0c3RhdGljIGdldFN0YXJ0T2ZNb250aChkdDogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQgfCBudW1iZXIpIHtcblx0XHRyZXR1cm4gbW9tZW50KGR0KS5zdGFydE9mKCdtb250aCcpLnRvRGF0ZSgpO1xuXHR9XG5cblx0c3RhdGljIGdldERheXNCZXR3ZWVuRGF0ZXMoZHQxOiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCwgZHQyOiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiB0aGlzLmdldERheXNCZXR3ZWVuKGR0MSwgZHQyKTtcblx0fVxuXG5cdHN0YXRpYyBnZXRFbmRPZkRhdGUoZHQ6IERhdGUgfCBudWxsIHwgdW5kZWZpbmVkKTogRGF0ZSB7XG5cdFx0cmV0dXJuIGR0ID8gbmV3IERhdGUoZHQuc2V0SG91cnMoMjMsIDU5LCA1OSwgOTk5KSkgOlxuXHRcdFx0bmV3IERhdGUodGhpcy5ub3cuc2V0SG91cnMoMjMsIDU5LCA1OSwgOTk5KSk7XG5cdH1cblxuXHRzdGF0aWMgZ2V0U3RhcnRPZkRhdGUoZHQ6IERhdGUgfCBudWxsIHwgdW5kZWZpbmVkKTogRGF0ZSB7XG5cdFx0cmV0dXJuIG1vbWVudChkdCkuc3RhcnRPZignZGF5JykudG9EYXRlKCk7XG5cdH1cblxuXHRzdGF0aWMgZ2V0RW5kT2ZUb2RheSgpOiBEYXRlIHtcblx0XHQvL1x0cmV0dXJuIG5ldyBEYXRlKChuZXcgRGF0ZShEYXRlLm5vdygpKSkuc2V0SG91cnMoMjMsIDU5LCA1OSwgOTk5KSk7XG5cdFx0cmV0dXJuIG1vbWVudChEYXRlLm5vdygpKS5lbmRPZignZGF5JykudG9EYXRlKCk7XG5cblx0fVxuXG5cdHN0YXRpYyBnZXRTdGFydE9mVG9kYXkoKTogRGF0ZSB7XG5cdFx0Ly9cdHJldHVybiBuZXcgRGF0ZSgobmV3IERhdGUoRGF0ZS5ub3coKSkpLnNldEhvdXJzKDAsIDAsIDAsIDApKTtcblx0XHRyZXR1cm4gbW9tZW50KERhdGUubm93KCkpLnN0YXJ0T2YoJ2RheScpLnRvRGF0ZSgpO1xuXHR9XG5cblx0Ly9pbnNwaXJlZCBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy81NjM0MDYvYWRkLWRheXMtdG8tamF2YXNjcmlwdC1kYXRlXG5cdHN0YXRpYyBhZGREYXlzKGR0OiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCwgZGF5czogbnVtYmVyID0gMCkge1xuXHRcdGNvbnN0IGRhdCA9IG1vbWVudChkdCk7XG5cdFx0ZGF0LmFkZChkYXlzLCAnZGF5cycpO1xuXHRcdHJldHVybiBkYXQudG9EYXRlKCk7XG5cdH1cblxuXHRzdGF0aWMgc3VidHJhY3REYXlzKGR0OiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCwgZGF5czogbnVtYmVyID0gMCkge1xuXHRcdGNvbnN0IGRhdCA9IG1vbWVudChkdCk7XG5cdFx0ZGF0LnN1YnRyYWN0KGRheXMsICdkYXlzJyk7XG5cdFx0cmV0dXJuIGRhdC50b0RhdGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTdGFydCBvZiB0b2RheVxuXHQgKi9cblx0c3RhdGljIGdldCB0b2RheSgpOiBEYXRlIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRTdGFydE9mVG9kYXkoKTtcblx0fVxuXG5cdHN0YXRpYyBnZXQgbm93KCk6IERhdGUge1xuXHRcdHJldHVybiBuZXcgRGF0ZShEYXRlLm5vdygpKTtcblx0fVxuXG5cdHN0YXRpYyBnZXROZXh0NU1pbnV0ZU1hcmsoKTogRGF0ZSB7XG5cdFx0Y29uc3QgbSA9IG1vbWVudCgpLnNldCgnc2Vjb25kJywgMCkuc2V0KCdtaWxsaXNlY29uZCcsIDApO1xuXHRcdGNvbnN0IG1pbnV0ZSA9IG0ubWludXRlKCk7XG5cdFx0Y29uc3QgbW9kID0gbWludXRlICUgNTtcblx0XHRpZiAobW9kKSB7XG5cdFx0XHRjb25zdCBkZWx0YSA9IDUgLSBtb2Q7XG5cdFx0XHRyZXR1cm4gbS5hZGQoZGVsdGEsICdtJykudG9EYXRlKCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG0udG9EYXRlKCk7XG5cdH1cblxuXHRzdGF0aWMgZ2V0WU1EKGQ6IERhdGUpIHtcblx0XHRyZXR1cm4gbW9tZW50KGQpLmZvcm1hdCgnWVlZWU1NREQnKTtcblx0fVxuXG5cdHN0YXRpYyBnZXRETVlXaXRoU2xhc2goZDogRGF0ZSkge1xuXHRcdHJldHVybiBtb21lbnQoZCkuZm9ybWF0KCdERC9NTS9ZWVlZJyk7XG5cdH1cblxuXHRzdGF0aWMgZ2V0RE1ZSG1XaXRoU2xhc2goZDogRGF0ZSkge1xuXHRcdHJldHVybiBtb21lbnQoZCkuZm9ybWF0KCdERC9NTS9ZWVlZIEhIOm1tJyk7XG5cdH1cblxuXHRzdGF0aWMgZ2V0TWNwVGltZShkdDogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gbW9tZW50KGR0KS5mb3JtYXQoJ0hIOm1tOnNzLlNTU1onKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbiAyNCBob3VyIGZvcm1hdFxuXHQgKiBAcGFyYW0gZHRVdGNcblx0ICovXG5cdHN0YXRpYyBnZXRMb2NhbERNWUhtV2l0aFNsYXNoKGR0VXRjOiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuXHRcdGNvbnN0IGQgPSBEYXRlRnVuYy5kYXRlVGltZVV0Y1RvTG9jYWxEYXRlVGltZShkdFV0Yyk7XG5cdFx0cmV0dXJuIG1vbWVudChkKS5mb3JtYXQoJ0REL01NL1lZWVkgSEg6bW0nKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBPZmZzZXQgbWludXRlcyBjb21wYXJpbmcgd2l0aCB0b2RheVxuXHQgKi9cblx0c3RhdGljIGdldE9mZnNldE1pbnV0ZXMoZHRVdGM6IERhdGUgfCBudWxsIHwgdW5kZWZpbmVkIHwgbnVtYmVyKTogbnVtYmVyIHtcblx0XHRjb25zdCBkbTEgPSBtb21lbnQoZHRVdGMpO1xuXHRcdGNvbnN0IGRtMiA9IG1vbWVudChuZXcgRGF0ZSgpLnNldEhvdXJzKDAsIDAsIDAsIDApKTtcblx0XHRyZXR1cm4gZG0xLmRpZmYoZG0yLCAnbWludXRlcycpO1xuXHR9XG5cblx0c3RhdGljIGdldERheXNCZXR3ZWVuKGQxPzogRGF0ZSB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIGQyPzogRGF0ZSB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBudW1iZXIge1xuXHRcdGNvbnN0IGRtMSA9IG1vbWVudChkMSk7XG5cdFx0Y29uc3QgZG0yID0gbW9tZW50KGQyKTtcblx0XHRyZXR1cm4gZG0yLmRpZmYoZG0xLCAnZGF5cycpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBob3VyIG9mIHRoZSBkYXRlLiBJZiBEYXRlIGlzIG5vdCBkZWZpbmVkLCB0aGUgaG91ciB3aWxsIGJlIGN1cnJlbnQgaG91ci5cblx0ICogQHBhcmFtIGR0VXRjXG5cdCAqL1xuXHRzdGF0aWMgZ2V0SG91cihkdFV0YzogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQgfCBudW1iZXIpOiBudW1iZXIge1xuXHRcdGNvbnN0IG0gPSBtb21lbnQoZHRVdGMpO1xuXHRcdHJldHVybiBtLmhvdXJzKCk7XG5cdH1cblxuXHRzdGF0aWMgZ2V0TWludXRlKGR0VXRjOiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCB8IG51bWJlcik6IG51bWJlciB7XG5cdFx0Y29uc3QgbSA9IG1vbWVudChkdFV0Yyk7XG5cdFx0cmV0dXJuIG0ubWludXRlcygpO1xuXHR9XG5cblx0c3RhdGljIGNvbXBvc2VEYXRlVGltZShkdDogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQsIGg6IG51bWJlciA9IDAsIG1pbnV0ZTogbnVtYmVyID0gMCk6IERhdGUge1xuXHRcdGNvbnN0IG10ID0gbW9tZW50KGR0KTtcblx0XHRyZXR1cm4gbmV3IERhdGUobXQudG9EYXRlKCkuc2V0SG91cnMoaCwgbWludXRlLCAwLCAwKSk7XG5cdH1cblxuXHRzdGF0aWMgb2xkZXJUaGFuMjRIb3VycyhkOiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IG0gPSBtb21lbnQoZCk7XG5cdFx0cmV0dXJuIG1vbWVudCgpLmRpZmYobSwgJ2hvdXJzJykgPj0gMjQ7XG5cdH1cblxuXHRzdGF0aWMgb2xkZXJUaGFuMjRIb3Vyc1V0YyhkdFV0YzogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gRGF0ZUZ1bmMuZ2V0SG91ckFnZVV0YyhkdFV0YykgPj0gMjQ7XG5cdH1cblxuXHRzdGF0aWMgb2xkZXJUaGFuSG91cnMoZDogRGF0ZSwgaG91cnM6IG51bWJlcikge1xuXHRcdGNvbnN0IG0gPSBtb21lbnQoZCk7XG5cdFx0cmV0dXJuIG1vbWVudCgpLmRpZmYobSwgJ2hvdXJzJykgPj0gaG91cnM7XG5cdH1cblxuXHRzdGF0aWMgb2xkZXJUaGFuSG91cnNVdGMoZHRVdGM6IERhdGUgfCBudWxsIHwgdW5kZWZpbmVkLCBob3VyczogbnVtYmVyKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIERhdGVGdW5jLmdldEhvdXJBZ2VVdGMoZHRVdGMpID49IGhvdXJzO1xuXHR9XG5cblx0c3RhdGljIG9sZGVyVGhhbk1pbnV0ZXMoZDogRGF0ZSwgbWludXRlczogbnVtYmVyKSB7XG5cdFx0Y29uc3QgbSA9IG1vbWVudChkKTtcblx0XHRyZXR1cm4gbW9tZW50KCkuZGlmZihtLCAnbWludXRlcycpID49IG1pbnV0ZXM7XG5cdH1cblxuXHQvKipcblx0ICogSXQgY291bGQgYmUgMTFQTSB5ZXN0ZXJkYXksIGFuZCAxIEFNIHRvZGF5LiBBY3R1YWxseSBiYXNlZCBvbiBsb2NhbCB0b2RheS5cblx0ICovXG5cdHN0YXRpYyBvbGRlclRoYW4xRGF5KGR0VXRjOiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBEYXRlRnVuYy5nZXREYXlBZ2VVdGMoZHRVdGMpID4gMDtcblx0fVxuXG5cdHN0YXRpYyBnZXRIb3VyQWdlKGQ6IERhdGUpIHtcblx0XHRjb25zdCBtID0gbW9tZW50KGQpO1xuXHRcdHJldHVybiBtb21lbnQoKS5kaWZmKG0sICdob3VycycpO1xuXHR9XG5cblx0c3RhdGljIGdldEhvdXJBZ2VVdGMoZHRVdGM6IERhdGUgfCBudWxsIHwgdW5kZWZpbmVkKSB7XG5cdFx0Y29uc3QgbSA9IG1vbWVudC51dGMoZHRVdGMpO1xuXHRcdHJldHVybiBtb21lbnQudXRjKCkuZGlmZihtLCAnaG91cnMnKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb21wYXJlIHV0YyBkYXRlIHdpdGggdXRjIG5vdy5cblx0ICogQHBhcmFtIGR0VXRjXG5cdCAqL1xuXHRzdGF0aWMgZ2V0RGF5QWdlVXRjKGR0VXRjOiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuXHRcdGNvbnN0IG0gPSBtb21lbnQudXRjKGR0VXRjKTtcblx0XHRyZXR1cm4gbW9tZW50LnV0YygpLmRpZmYobSwgJ2RheXMnKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBIb3cgbWFueSB5ZWFycyBmcm9tIG5vdy5cblx0ICogQHBhcmFtIGQgXG5cdCAqIEByZXR1cm5zIFxuXHQgKi9cblx0c3RhdGljIGdldEFnZShkOiBEYXRlKSB7XG5cdFx0Y29uc3QgbSA9IG1vbWVudChkKTtcblx0XHRyZXR1cm4gbW9tZW50KCkuZGlmZihtLCAneWVhcnMnKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBZZWFyIG9mIGRhdGUuXG5cdCAqIEBwYXJhbSBkIFxuXHQgKiBAcmV0dXJucyBcblx0ICovXG5cdHN0YXRpYyBnZXRZZWFyKGQ6IERhdGUpIHtcblx0XHRjb25zdCBtID0gbW9tZW50KGQpO1xuXHRcdHJldHVybiBtLnllYXIoKTtcblx0fVxuXG5cdHN0YXRpYyBnZXRVdGNOb3coKTogRGF0ZSB7XG5cdFx0cmV0dXJuIG1vbWVudC51dGMoKS50b0RhdGUoKTtcblx0fVxuXG5cdHN0YXRpYyBhZGRNaW51dGVzKGQ6IERhdGUsIG06IG51bWJlcik6IERhdGUge1xuXHRcdHJldHVybiBtb21lbnQoZCkuYWRkKG0sICdtJykudG9EYXRlKCk7XG5cdH1cblxuXHRzdGF0aWMgYWRkTW9udGgoZDogRGF0ZSwgbTogbnVtYmVyKTogRGF0ZSB7XG5cdFx0cmV0dXJuIG1vbWVudChkKS5hZGQobSwgJ00nKS50b0RhdGUoKTtcblx0fVxuXG5cdHN0YXRpYyBnZXREdXJhdGlvbihkMTogRGF0ZSwgZDI6IERhdGUpIHtcblx0XHRjb25zdCBtZDEgPSBtb21lbnQoZDEpO1xuXHRcdGNvbnN0IG1kMiA9IG1vbWVudChkMik7XG5cdFx0cmV0dXJuIG1vbWVudC5kdXJhdGlvbihtZDIuZGlmZihtZDEpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0IG1pbnV0ZXMgZnJvbSBtaWRuaWdodCB0byBISDptbSB0ZXh0XG5cdCAqIEBwYXJhbSBtaW5zXG5cdCAqL1xuXHRzdGF0aWMgZ2V0SE1Gcm9tTWlucyhtaW5zOiBudW1iZXIpOiBzdHJpbmcge1xuXHRcdC8vIGRvIG5vdCBpbmNsdWRlIHRoZSBmaXJzdCB2YWxpZGF0aW9uIGNoZWNrIGlmIHlvdSB3YW50LCBmb3IgZXhhbXBsZSxcblx0XHQvLyBnZXRUaW1lRnJvbU1pbnMoMTUzMCkgdG8gZXF1YWwgZ2V0VGltZUZyb21NaW5zKDkwKSAoaS5lLiBtaW5zIHJvbGxvdmVyKVxuXHRcdGlmIChtaW5zID49IDI0ICogNjAgfHwgbWlucyA8IDApIHtcblx0XHRcdHRocm93IG5ldyBSYW5nZUVycm9yKCdWYWxpZCBpbnB1dCBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAgYW5kIGxlc3MgdGhhbiAxNDQwLicpO1xuXHRcdH1cblx0XHRjb25zdCBoID0gbWlucyAvIDYwIHwgMCxcblx0XHRcdG0gPSBtaW5zICUgNjAgfCAwO1xuXHRcdHJldHVybiBtb21lbnQudXRjKCkuaG91cnMoaCkubWludXRlcyhtKS5mb3JtYXQoJ0hIOm1tJyk7XG5cdH1cblxuXHRzdGF0aWMgZ2V0TWludXRlc1NpbmNlTWlkbmlnaHQoZDogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQpIHtcblx0XHRjb25zdCBtID0gbW9tZW50KGQpO1xuXHRcdGNvbnN0IG1pZG5pZ2h0ID0gbW9tZW50KGQpLnN0YXJ0T2YoJ2RheScpOyAvL011dGF0ZXMgdGhlIG9yaWdpbmFsIG1vbWVudCBieSBzZXR0aW5nIGl0IHRvIHRoZSBzdGFydCBvZiBhIHVuaXQgb2YgdGltZS4gU28gSSBoYXZlIGJldHRlciBub3QgdG8gdXNlIG0gd2hpY2ggd2lsIGJlIGNoYW5nZWQgYnkgY2FsbGluZyB0aGlzIGZ1bmN0aW9uXG5cdFx0cmV0dXJuIG0uZGlmZihtaWRuaWdodCwgJ21pbnV0ZXMnKTtcblx0fVxuXG5cdHN0YXRpYyBnZXRNaW51dGVzQmV0d2VlbihzdGFydDogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQsIGVuZDogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQpIHtcblx0XHRjb25zdCBtID0gbW9tZW50KHN0YXJ0KTtcblx0XHRjb25zdCBtMiA9IG1vbWVudChlbmQpO1xuXHRcdHJldHVybiBtMi5kaWZmKG0sICdtaW51dGVzJyk7XG5cdH1cblxuXHQvKipcblx0ICogUGFyc2UganNvbiBzdHJpbmcgd2l0aCBkYXRlIHNlcmlhbGl6ZWQgaW50byBzdHJpbmcsIGFuZCBnZXQgcHJvcGVyIGRhdGUgb2JqZWN0IGJhY2tcblx0ICogQHBhcmFtIHNcblx0ICovXG5cdHN0YXRpYyBkYXRlU2FmZUpzb25QYXJzZShzOiBzdHJpbmcpIHtcblx0XHRyZXR1cm4gSlNPTi5wYXJzZShzLCB0aGlzLmRhdGVSZXZpdmVyKTtcblx0fVxuXG5cdHByaXZhdGUgc3RhdGljIGRhdGVSZXZpdmVyKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG5cdFx0aWYgKERhdGVGdW5jLmlzU2VyaWFsaXplZERhdGUodmFsdWUpKSB7XG5cdFx0XHRyZXR1cm4gKG5ldyBEYXRlKHZhbHVlKSk7XG5cdFx0fVxuXG5cdFx0Ly8gSWYgaXQncyBub3QgYSBkYXRlLXN0cmluZywgd2Ugd2FudCB0byByZXR1cm4gdGhlIHZhbHVlIGFzLWlzLiBJZiB3ZSBmYWlsIHRvIHJldHVyblxuXHRcdC8vIGEgdmFsdWUsIGl0IHdpbGwgYmUgb21pdHRlZCBmcm9tIHRoZSByZXN1bHRhbnQgZGF0YSBzdHJ1Y3R1cmUuXG5cdFx0cmV0dXJuICh2YWx1ZSk7XG5cblx0fVxuXG5cblx0Ly8gSSBkZXRlcm1pbmUgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIGEgc3RyaW5nIHRoYXQgbWF0Y2hlcyB0aGUgc2VyaWFsaXplZC1kYXRlIHBhdHRlcm4uXG5cdHByaXZhdGUgc3RhdGljIGlzU2VyaWFsaXplZERhdGUodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuXHRcdC8vIERhdGVzIGFyZSBzZXJpYWxpemVkIGluIFRaIGZvcm1hdCwgZXhhbXBsZTogJzE5ODEtMTItMjBUMDQ6MDA6MTQuMDAwWicuXG5cdFx0Y29uc3QgZGF0ZVBhdHRlcm4gPSAvXlxcZHs0fS1cXGR7Mn0tXFxkezJ9VFxcZHsyfTpcXGR7Mn06XFxkezJ9XFwuXFxkezN9WiQvO1xuXHRcdHJldHVybiAoRGF0ZUZ1bmMuaXNTdHJpbmcodmFsdWUpICYmIGRhdGVQYXR0ZXJuLnRlc3QodmFsdWUpKTtcblx0fVxuXG5cblx0Ly8gSSBkZXRlcm1pbmUgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIGEgU3RyaW5nLlxuXHRwcml2YXRlIHN0YXRpYyBpc1N0cmluZyh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuICh7fS50b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgU3RyaW5nXScpO1xuXHR9XG5cblx0c3RhdGljIGRhdGVTYWZlUGFyc2Uoczogc3RyaW5nIHwgRGF0ZSkge1xuXHRcdGNvbnN0IG0gPSBtb21lbnQocyk7XG5cdFx0cmV0dXJuIG0udG9EYXRlKCk7XG5cdH1cblxuXHRzdGF0aWMgY29tcG9zZURhdGVXaXRoTWludXRlcyhkOiBEYXRlLCBtaW51dGU6IG51bWJlcik6IERhdGUge1xuXHRcdGNvbnN0IG0gPSBtb21lbnQoZCk7XG5cdFx0Y29uc3QgbWlkbmlnaHQgPSBtb21lbnQoZCkuc3RhcnRPZignZGF5Jyk7IC8vIE11dGF0ZXMgdGhlIG9yaWdpbmFsIG1vbWVudCBieSBzZXR0aW5nIGl0IHRvIHRoZSBzdGFydCBvZiBhIHVuaXQgb2YgdGltZS4gU28gSSBoYXZlIGJldHRlciBub3QgdG8gdXNlIG0gd2hpY2ggd2lsIGJlIGNoYW5nZWQgYnkgY2FsbGluZyB0aGlzIGZ1bmN0aW9uXG5cdFx0bWlkbmlnaHQuYWRkKG1pbnV0ZSwgJ21pbnV0ZXMnKTtcblx0XHRyZXR1cm4gbWlkbmlnaHQudG9EYXRlKCk7XG5cdH1cblxuXHQvKipcblx0ICogU2FmZSBjb21wYXJlIHNpbmNlIGRhdGUgZGF0YSBtYXkgYmUgY29uc2lkZXJlZCBhcyBzdHJpbmcgcmF0aGVyIHRoYW4gZGF0ZS5cblx0ICogQHBhcmFtIGQxXG5cdCAqIEBwYXJhbSBkMlxuXHQgKi9cblx0c3RhdGljIGNvbXBhcmUoZDE6IERhdGUgfCB1bmRlZmluZWQsIGQyOiBEYXRlIHwgdW5kZWZpbmVkKTogbnVtYmVyIHtcblx0XHRpZiAoIWQxICYmICFkMikge1xuXHRcdFx0cmV0dXJuIDA7XG5cdFx0fVxuXG5cdFx0aWYgKCFkMSkge1xuXHRcdFx0cmV0dXJuIC1OYU5cblx0XHR9XG5cblx0XHRpZiAoIWQyKSB7XG5cdFx0XHRyZXR1cm4gTmFOO1xuXHRcdH1cblxuXHRcdGNvbnN0IGRkMSA9IChuZXcgRGF0ZShkMSkpLnZhbHVlT2YoKTtcblx0XHRjb25zdCBkZDIgPSAobmV3IERhdGUoZDIpKS52YWx1ZU9mKCk7XG5cdFx0cmV0dXJuIGRkMSAtIGRkMjtcblx0fVxufVxuXG4iXX0=
|
|
308
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZUZ1bmMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9ubWNlLWZ1bmMvc3JjL19mdW5jL2RhdGVGdW5jLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUVyRCxNQUFNLE9BQU8sUUFBUTtJQUNwQjs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsY0FBYyxDQUFDLEVBQTBCO1FBQy9DLElBQUksRUFBRSxZQUFZLElBQUksRUFBQyxDQUFDO1lBQ3ZCLE9BQU8sRUFBRSxDQUFDO1FBQ1gsQ0FBQztRQUVELElBQUksT0FBTyxFQUFFLEtBQUssUUFBUSxFQUFDLENBQUM7WUFDM0IsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN6QixJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDO2dCQUNiLE1BQU0sSUFBSSxVQUFVLENBQUMseUJBQXlCLENBQUMsQ0FBQztZQUNqRCxDQUFDO1lBRUQsT0FBTyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQixDQUFDO1FBRUQsSUFBSSxPQUFPLEVBQUUsS0FBSyxRQUFRLEVBQUMsQ0FBQztZQUMzQixNQUFNLEVBQUUsR0FBRyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtZQUN2QixJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUMsQ0FBQztnQkFDL0IsTUFBTSxJQUFJLFVBQVUsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1lBQ2pELENBQUM7WUFFRCxPQUFPLEVBQUUsQ0FBQztRQUNYLENBQUM7UUFFRCxNQUFNLElBQUksU0FBUyxDQUFDLCtCQUErQixDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMs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QUFDLENBQUMsT0FBTyxDQUFDO0lBQ3RDLENBQUM7Q0FDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGVUaW1lLCBEdXJhdGlvbiwgU2V0dGluZ3MgfSBmcm9tICdsdXhvbic7XHJcblxyXG5leHBvcnQgY2xhc3MgRGF0ZUZ1bmMge1xyXG5cdC8qKlxyXG5cdCAqIEF0IHJ1bnRpbWUsIHRoZXJlJ3Mgbm8gc2ltcGxlIGd1YXJhbnRlZSB0aGF0IHRoZSBpbnB1dCBpcyBEYXRlLiBTb21ldGltZXMgeW91IGNvZGVzIGV4cGVjdCBkYXRlLCBidXQgdGhlIHJlc3BvbnNlIGZyb20gdGhlIFdlYiBzZXJ2aWNlIG1heSBnaXZlIHlvdSBzdHJpbmcgb3IgbnVtYmVyLlxyXG5cdCAqIFRoaXMgZnVuY3Rpb24gZ2l2ZSB5b3Ugc2FmZSBwYXJzZSBvZiBkYXRlIGRhdGEgZnJvbSBJL08sIG5vdCBvZiB5b3VyIGNvbnRyb2wuXHJcblx0ICogSWYgdGhlIGRhdGEgaXMgaW52YWxpZCwgdGhyb3dzIFJhbmdlRXJyb3Igb3IgVHlwZUVycm9yLlxyXG5cdCAqIEBwYXJhbSBkdCBcclxuXHQgKiBAcmV0dXJucyBcclxuXHQgKi9cclxuXHRzdGF0aWMgZGF0ZURhdGFUb0RhdGUoZHQ6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIpIDogRGF0ZSB7XHJcblx0XHRpZiAoZHQgaW5zdGFuY2VvZiBEYXRlKXtcclxuXHRcdFx0cmV0dXJuIGR0O1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0eXBlb2YgZHQgPT09ICdzdHJpbmcnKXtcclxuXHRcdFx0Y29uc3QgciA9IERhdGUucGFyc2UoZHQpO1xyXG5cdFx0XHRpZiAoaXNOYU4ocikpe1xyXG5cdFx0XHRcdHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHN0cmluZyBmb3IgRGF0ZScpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gbmV3IERhdGUocik7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHR5cGVvZiBkdCA9PT0gJ251bWJlcicpe1xyXG5cdFx0XHRjb25zdCByZCA9IG5ldyBEYXRlKGR0KVxyXG5cdFx0XHRpZiAoTnVtYmVyLmlzTmFOKHJkLnZhbHVlT2YoKSkpe1xyXG5cdFx0XHRcdHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIG51bWJlciBmb3IgRGF0ZScpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gcmQ7XHJcblx0XHR9XHJcblxyXG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0IERhdGUsIHN0cmluZyBvciBudW1iZXInKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNpbWlsYXIgdG8gZGF0ZURhdGFUb0RhdGUsIGJ1dCBhbGxvdyBudWxsIGFuZCBkZWZpbmVkIHNlbWFudGljYWxseS5cclxuXHQgKiBAcGFyYW0gZHQgXHJcblx0ICogQHJldHVybnMgXHJcblx0ICovXHJcblx0c3RhdGljIGRhdGVEYXRhVG9EYXRlT3JOdWxsKGR0OiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCkgOiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCB7XHJcblx0XHRpZiAoZHQgaW5zdGFuY2VvZiBEYXRlKXtcclxuXHRcdFx0cmV0dXJuIGR0O1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0eXBlb2YgZHQgPT09ICdzdHJpbmcnKXtcclxuXHRcdFx0Y29uc3QgciA9IERhdGUucGFyc2UoZHQpO1xyXG5cdFx0XHRpZiAoaXNOYU4ocikpe1xyXG5cdFx0XHRcdHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHN0cmluZyBmb3IgRGF0ZScpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gbmV3IERhdGUocik7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHR5cGVvZiBkdCA9PT0gJ251bWJlcicpe1xyXG5cdFx0XHRjb25zdCByZCA9IG5ldyBEYXRlKGR0KVxyXG5cdFx0XHRpZiAoTnVtYmVyLmlzTmFOKHJkLnZhbHVlT2YoKSkpe1xyXG5cdFx0XHRcdHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIG51bWJlciBmb3IgRGF0ZScpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gcmQ7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKGR0ID09IG51bGwpeyBcclxuXHRcdFx0cmV0dXJuIGR0O1xyXG5cdFx0fVxyXG5cclxuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdCBEYXRlLCBzdHJpbmcgb3IgbnVtYmVyJyk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBUcmFuc2Zvcm0gVVRDIERhdGVUaW1lIHRvIGxvY2FsIGRhdGUgd2l0aG91dCBILCBNIGFuZCBTLiBGb3IgZXhhbXBsZSwgdGhlIG1vbnRoIGRheSBvZiAyMDE4LTAxLTIzVDIyOjAwOjAwWiBpcyAyNCBpbiBBdXN0cmFsaWEuXHJcblx0ICogQHBhcmFtIGR0VXRjXHJcblx0ICovXHJcblx0c3RhdGljIGRhdGVUaW1lVXRjVG9Mb2NhbERhdGVOdW1iZXIoZHRVdGM6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCB7XHJcblx0XHRpZiAoZHRVdGMgPT0gbnVsbCkge1xyXG5cdFx0XHRyZXR1cm4gZHRVdGM7XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgbG9jYWxEdCA9IHRoaXMuZGF0ZURhdGFUb0RhdGUoZHRVdGMpO1xyXG5cdFx0Y29uc3QgbG9jYWxETnVtID0gbG9jYWxEdC5zZXRIb3VycygwLCAwLCAwLCAwKTtcclxuXHJcblx0XHRyZXR1cm4gbG9jYWxETnVtO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGF0ZSBvbmx5LiBIb3dldmVyLCB0aGUgZGF0ZSBtYXkgc3RpbGwgYmUgaW4gVVRDLlxyXG5cdCAqIEBwYXJhbSBkdFV0Y1xyXG5cdCAqIEByZXR1cm5zIG5ldyBEYXRlIG9iamVjdC5cclxuXHQgKi9cclxuXHRzdGF0aWMgZGF0ZVRpbWVVdGNUb0xvY2FsRGF0ZShkdFV0YzogRGF0ZSB8IHN0cmluZyB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCB7XHJcblx0XHRpZiAoZHRVdGMgPT0gbnVsbCkge1xyXG5cdFx0XHRyZXR1cm4gZHRVdGM7XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgbG9jYWxEdCA9IHRoaXMuZGF0ZURhdGFUb0RhdGUoZHRVdGMpO1xyXG5cdFx0Y29uc3QgbG9jYWxOdW0gPSBsb2NhbER0LnNldEhvdXJzKDAsIDAsIDAsIDApO1xyXG5cdFx0cmV0dXJuIG5ldyBEYXRlKGxvY2FsTnVtKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqICcyMDE4LTAxLTIzVDIyOjAwOjAwWicgd2lsbCBiZWNvbWUgJzIwMTgtMDEtMjQnIGluIEF1c3RyYWxpYS5cclxuXHQgKiBAcGFyYW0gZHRVdGMgXHJcblx0ICogQHJldHVybnMgIG5ldyBEYXRlIG9iamVjdC5cclxuXHQgKi9cclxuXHRzdGF0aWMgbG9jYWxJU09EYXRlU3RyaW5nKGR0VXRjOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQge1x0XHRcclxuXHQgICAgY29uc3QgZHQgPSB0aGlzLmRhdGVUaW1lVXRjVG9Mb2NhbERhdGUoZHRVdGMpO1xyXG5cdFx0aWYgKGR0ID09IG51bGwpIHtcclxuXHRcdFx0cmV0dXJuIGR0O1xyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGQ9IERhdGVUaW1lLmZyb21KU0RhdGUoZHQpO1xyXG5cdFx0cmV0dXJuIGQudG9JU09EYXRlKCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBsb2NhbCBkYXRlIE9OTFkgKG5vIHRpbWUpIHRvIFVUQyBkYXRlLlxyXG5cdCAqIFRoZSBpbnB1dCBjb3VsZCBiZSBhIHN0cmluZyBvZiB5eXl5LU1NLWRkLCBvciBhIERhdGUgT2JqZWN0LlxyXG5cdCAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0RhdGVcclxuXHQgKiBXaGlsZSB0aGUgdGltZSB2YWx1ZSBhdCB0aGUgaGVhcnQgb2YgYSBEYXRlIG9iamVjdCBpcyBVVEMsIHRoZSBiYXNpYyBtZXRob2RzIHRvIGZldGNoIHRoZSBkYXRlIGFuZCB0aW1lIFxyXG5cdCAqIG9yIGl0cyBjb21wb25lbnRzIGFsbCB3b3JrIGluIHRoZSBsb2NhbCAoaS5lLiBob3N0IHN5c3RlbSkgdGltZSB6b25lIGFuZCBvZmZzZXQuXHJcblx0ICogQHBhcmFtIGR0IGlmIGR0IGNvbnRhaW4gdGltZSBpbmZvLCBpdCB3aWxsIGJlY29tZSBkdC5zZXRIb3VycygwLCAwLCAwLCAwKVxyXG5cdCAqL1xyXG5cdHN0YXRpYyBsb2NhbERhdGVUb1V0YyhkOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCB8IHN0cmluZyk6IERhdGUgfCBudWxsIHwgdW5kZWZpbmVkIHtcclxuXHRcdGlmIChkID09IG51bGwpIHtcclxuXHRcdFx0cmV0dXJuIGQ7XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgZHQgPSB0aGlzLmRhdGVEYXRhVG9EYXRlKGQpO1xyXG5cdFx0Y29uc3QgbiA9IGR0LnNldEhvdXJzKDAsIDAsIDAsIDApO1xyXG5cdFx0Y29uc3Qgb2Zmc2V0ID0gZHQuZ2V0VGltZXpvbmVPZmZzZXQoKSAqIDYwMDAwO1xyXG5cdFx0cmV0dXJuIG5ldyBEYXRlKG4gKyBvZmZzZXQpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldEVuZE9mV2VlayhkdDogRGF0ZSB8IHN0cmluZyB8IG51bWJlcikgOiBEYXRlIHtcclxuXHRcdGNvbnN0IGRhdGVUaW1lID0gRGF0ZVRpbWUuZnJvbUpTRGF0ZSh0aGlzLmRhdGVEYXRhVG9EYXRlKGR0KSk7XHJcblx0XHRyZXR1cm4gZGF0ZVRpbWUuZW5kT2YoJ3dlZWsnKS50b0pTRGF0ZSgpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldFN0YXJ0T2ZXZWVrKGR0OiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyKSA6IERhdGUge1xyXG5cdFx0Y29uc3QgZGF0ZVRpbWUgPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZHQpKTtcclxuXHRcdHJldHVybiBkYXRlVGltZS5zdGFydE9mKCd3ZWVrJykudG9KU0RhdGUoKTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXRFbmRPZk1vbnRoKGR0OiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyKSA6IERhdGUge1xyXG5cdFx0Y29uc3QgZGF0ZVRpbWUgPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZHQpKTtcclxuXHRcdHJldHVybiBkYXRlVGltZS5lbmRPZignbW9udGgnKS50b0pTRGF0ZSgpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldFN0YXJ0T2ZNb250aChkdDogRGF0ZSB8IHN0cmluZyB8IG51bWJlcikgOiBEYXRlIHtcclxuXHRcdGNvbnN0IGRhdGVUaW1lID0gRGF0ZVRpbWUuZnJvbUpTRGF0ZSh0aGlzLmRhdGVEYXRhVG9EYXRlKGR0KSk7XHJcblx0XHRyZXR1cm4gZGF0ZVRpbWUuc3RhcnRPZignbW9udGgnKS50b0pTRGF0ZSgpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldEVuZE9mRGF0ZShkdDogRGF0ZSB8IHN0cmluZyB8IG51bWJlcik6IERhdGUge1xyXG5cdFx0Y29uc3QgZGF0ZVRpbWUgPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZHQpKTtcclxuXHRcdHJldHVybiBkYXRlVGltZS5lbmRPZignZGF5JykudG9KU0RhdGUoKTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXRTdGFydE9mRGF0ZShkdDogRGF0ZSB8IHN0cmluZyB8IG51bWJlcik6IERhdGUge1xyXG5cdFx0Y29uc3QgZGF0ZVRpbWUgPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZHQpKTtcclxuXHRcdHJldHVybiBkYXRlVGltZS5zdGFydE9mKCdkYXknKS50b0pTRGF0ZSgpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldEVuZE9mVG9kYXkoKTogRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQge1xyXG5cdFx0cmV0dXJuIHRoaXMuZ2V0RW5kT2ZEYXRlKERhdGUubm93KCkpO1xyXG5cclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXRTdGFydE9mVG9kYXkoKTogRGF0ZSB7XHJcblx0XHRyZXR1cm4gdGhpcy5nZXRTdGFydE9mRGF0ZShEYXRlLm5vdygpKTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXREYXlzQmV0d2VlbihkMTogRGF0ZSB8IHN0cmluZyB8IG51bWJlciwgZDI6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIpOiBudW1iZXIge1xyXG5cdFx0Y29uc3QgZG0xID0gRGF0ZVRpbWUuZnJvbUpTRGF0ZSh0aGlzLmRhdGVEYXRhVG9EYXRlKGQxKSk7XHJcblx0XHRjb25zdCBkbTIgPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZDEpKTtcclxuXHRcdHJldHVybiBkbTIuZGlmZihkbTEsICdkYXlzJykuZGF5cztcclxuXHR9XHJcblxyXG5cdC8vaW5zcGlyZWQgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNTYzNDA2L2FkZC1kYXlzLXRvLWphdmFzY3JpcHQtZGF0ZVxyXG5cdHN0YXRpYyBhZGREYXlzKGR0OiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyLCBkYXlzOiBudW1iZXIpIDogRGF0ZSB7XHJcblx0XHRjb25zdCBkYXQgPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZHQpKTtcclxuXHRcdGNvbnN0IHIgPSBkYXQucGx1cyh7ZGF5czogZGF5c30pO1xyXG5cdFx0cmV0dXJuIHIudG9KU0RhdGUoKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFN0YXJ0IG9mIHRvZGF5XHJcblx0ICovXHJcblx0c3RhdGljIGdldCB0b2RheSgpOiBEYXRlIHtcclxuXHRcdHJldHVybiB0aGlzLmdldFN0YXJ0T2ZUb2RheSgpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldCBub3coKTogRGF0ZSB7XHJcblx0XHRyZXR1cm4gbmV3IERhdGUoRGF0ZS5ub3coKSk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGcm9tIG5vdywgbmV4dCA1IG1pbnV0ZSBtYXJrLiBGb3IgZXhhbXBsZSAyOjIzOjQ0IHdpbGwgYmUgMjoyNTowMDtcclxuXHQgKiBAcmV0dXJucyBcclxuXHQgKi9cclxuXHRzdGF0aWMgZ2V0TmV4dDVNaW51dGVNYXJrKCk6IERhdGUge1xyXG5cdFx0Y29uc3QgbSA9IERhdGVUaW1lLm5vdygpLnNldCh7c2Vjb25kOiAwLCBtaWxsaXNlY29uZDowfSk7XHJcblx0XHRjb25zdCBtaW51dGUgPSBtLm1pbnV0ZTtcclxuXHRcdGNvbnN0IG1vZCA9IG1pbnV0ZSAlIDU7XHJcblx0XHRpZiAobW9kKSB7XHJcblx0XHRcdGNvbnN0IGRlbHRhID0gNSAtIG1vZDtcclxuXHRcdFx0cmV0dXJuIG0ucGx1cyh7bWludXRlczogZGVsdGF9KS50b0pTRGF0ZSgpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBtLnRvSlNEYXRlKCk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0WU1EKGQ6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIpIHtcclxuXHRcdGNvbnN0IGR0ID0gRGF0ZVRpbWUuZnJvbUpTRGF0ZSh0aGlzLmRhdGVEYXRhVG9EYXRlKGQpKTtcclxuXHRcdHJldHVybiBkdC50b0Zvcm1hdCgneXl5eU1NZGQnKTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXRETVlXaXRoU2xhc2goZDogRGF0ZSB8IHN0cmluZyB8IG51bWJlcikge1xyXG5cdFx0Y29uc3QgZHQgPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZCkpO1xyXG5cdFx0cmV0dXJuIGR0LnRvRm9ybWF0KCdkZC9NTS95eXl5Jyk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0RE1ZSG1XaXRoU2xhc2goZDogRGF0ZSB8IHN0cmluZyB8IG51bWJlcikge1xyXG5cdFx0Y29uc3QgZHQgPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZCkpO1xyXG5cdFx0cmV0dXJuIGR0LnRvRm9ybWF0KCdkZC9NTS95eXl5IEhIOm1tJyk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBcclxuXHQgKiBAcGFyYW0gZHRVdGMgSW4gMjQgaG91ciBmb3JtYXQsIGFuZCB0aGUgZGF0ZSBzZXBhcmF0b3IgZGVwZW5kaW5nIG9uIHRoZSBzeXN0ZW0gb3IgTHV4b24gZGVmYXVsdCBsb2NhbGVcclxuXHQgKiBAcmV0dXJucyBcclxuXHQgKi9cclxuXHRzdGF0aWMgZ2V0RGF0ZVRpbWUyNFNpbXBsZShkdFV0YzogRGF0ZSB8IHN0cmluZyB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpIHtcclxuXHRcdGlmIChkdFV0YyA9PSBudWxsKSB7XHJcblx0XHRcdHJldHVybiBkdFV0YztcclxuXHRcdH1cclxuXHRcdFxyXG5cdFx0Y29uc3QgZCA9IHRoaXMuZGF0ZURhdGFUb0RhdGUoZHRVdGMpO1xyXG5cdFx0Y29uc3QgZHQgPSBEYXRlVGltZS5mcm9tSlNEYXRlKGQpO1xyXG5cdFx0cmV0dXJuIGR0LnRvTG9jYWxlU3RyaW5nKERhdGVUaW1lLkRBVEVfU0hPUlQpICsgJyAnICsgZHQudG9Mb2NhbGVTdHJpbmcoRGF0ZVRpbWUuVElNRV8yNF9TSU1QTEUpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIHNldERlZmF1bHRMb2NhbGUobG9jYWxlOiBzdHJpbmcpe1xyXG5cdFx0U2V0dGluZ3MuZGVmYXVsdExvY2FsZT1sb2NhbGU7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0RGVmYXVsdExvY2FsZSgpe1xyXG5cdFx0cmV0dXJuIFNldHRpbmdzLmRlZmF1bHRMb2NhbGU7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgc2V0RGVmYXVsdFpvbmUoem9uZTogc3RyaW5nKXtcclxuXHRcdFNldHRpbmdzLmRlZmF1bHRab25lPXpvbmU7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0RGVmYXVsdFpvbmUoKSA6IHN0cmluZyB7XHJcblx0XHRyZXR1cm4gU2V0dGluZ3MuZGVmYXVsdFpvbmUubmFtZTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBpc1pvbmVWYWxpZCgpOiBib29sZWFue1xyXG5cdFx0cmV0dXJuIFNldHRpbmdzLmRlZmF1bHRab25lLmlzVmFsaWQ7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGb3IgZXhhbXBsZSwgaW4gQUVTVCwgaXQgaXMgLTYwMC5cclxuXHQgKiBAcmV0dXJucyBcclxuXHQgKi9cclxuXHRzdGF0aWMgZ2V0TG9jYWxUaW1lem9uZU9mZnNldCgpOiBudW1iZXIge1xyXG5cdFx0Y29uc3QgZHQgPSBuZXcgRGF0ZShEYXRlLm5vdygpKTtcclxuXHRcdHJldHVybiBkdC5nZXRUaW1lem9uZU9mZnNldCgpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2V0IGhvdXIgb2YgdGhlIGRhdGUuIElmIERhdGUgaXMgbm90IGRlZmluZWQsIHRoZSBob3VyIHdpbGwgYmUgY3VycmVudCBob3VyLlxyXG5cdCAqIEBwYXJhbSBkdFV0Y1xyXG5cdCAqL1xyXG5cdHN0YXRpYyBnZXRIb3VyKGR0VXRjOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyKTogbnVtYmVyIHtcclxuXHRcdGNvbnN0IGR0ID0gRGF0ZVRpbWUuZnJvbUpTRGF0ZSh0aGlzLmRhdGVEYXRhVG9EYXRlKGR0VXRjKSk7XHJcblx0XHRyZXR1cm4gZHQuaG91cjtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXRNaW51dGUoZHRVdGM6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIpOiBudW1iZXIge1xyXG5cdFx0Y29uc3QgZHQgPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZHRVdGMpKTtcclxuXHRcdHJldHVybiBkdC5taW51dGU7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgR2V0SE0oZHRVdGM6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIpOiB7aDogbnVtYmVyLCBtOiBudW1iZXJ9e1xyXG5cdFx0Y29uc3QgZHQgPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZHRVdGMpKTtcclxuXHRcdHJldHVybiB7aDogZHQuaG91ciwgbTogZHQubWludXRlfTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBjb21wb3NlRGF0ZVRpbWUoZHQ6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIsIGg6IG51bWJlciA9IDAsIG1pbnV0ZTogbnVtYmVyID0gMCwgc2Vjb25kOiBudW1iZXIgPSAwKTogRGF0ZSB7XHJcblx0XHRyZXR1cm4gbmV3IERhdGUoIHRoaXMuZGF0ZURhdGFUb0RhdGUoZHQpLnNldEhvdXJzKGgsIG1pbnV0ZSwgc2Vjb25kLCAwKSk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgb2xkZXJUaGFuMjRIb3VycyhkOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyKTogYm9vbGVhbiB7XHJcblx0XHRjb25zdCBtID0gRGF0ZVRpbWUuZnJvbUpTRGF0ZSh0aGlzLmRhdGVEYXRhVG9EYXRlKGQpKTtcclxuXHRcdHJldHVybiBEYXRlVGltZS5ub3coKS5kaWZmKG0sICdob3VycycpID49IER1cmF0aW9uLmZyb21JU08oJ1BUMjRIJyk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgb2xkZXJUaGFuSG91cnMoZDogRGF0ZSB8IHN0cmluZyB8IG51bWJlciwgaG91cnM6IG51bWJlcikgOiBib29sZWFuIHtcclxuXHRcdGNvbnN0IG0gPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZCkpO1xyXG5cdFx0Y29uc3QgZGlmZiA9IERhdGVUaW1lLm5vdygpLmRpZmYobSwgJ2hvdXJzJyk7IFxyXG5cdFx0Y29uc3QgZHVyYXRpb24gPSBEdXJhdGlvbi5mcm9tSVNPKGBQVCR7aG91cnN9SGApO1xyXG5cdFx0Y29uc29sZS5kZWJ1ZygnZGlmZjogJyArIGRpZmYuaG91cnMgKyAnICAgZHVyYXRpb246ICcgKyBkdXJhdGlvbi5ob3Vycyk7XHJcblx0XHRyZXR1cm4gZGlmZi5ob3VycyA+PSBkdXJhdGlvbi5ob3VycztcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBvbGRlclRoYW5NaW51dGVzKGQ6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIsIG1pbnV0ZXM6IG51bWJlcikge1xyXG5cdFx0Y29uc3QgbSA9IERhdGVUaW1lLmZyb21KU0RhdGUodGhpcy5kYXRlRGF0YVRvRGF0ZShkKSk7XHJcblx0XHRyZXR1cm4gRGF0ZVRpbWUubm93KCkuZGlmZihtLCAnbWludXRlcycpID49IER1cmF0aW9uLmZyb21NaWxsaXMobWludXRlcyo2MCoxMDAwKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEl0IGNvdWxkIGJlIDExUE0geWVzdGVyZGF5LCBhbmQgMSBBTSB0b2RheS4gQWN0dWFsbHkgYmFzZWQgb24gbG9jYWwgdG9kYXkuXHJcblx0ICovXHJcblx0c3RhdGljIG9sZGVyVGhhbjFEYXkoZHRVdGM6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIpOiBib29sZWFuIHtcclxuXHRcdHJldHVybiBEYXRlRnVuYy5nZXREYXlBZ2UoZHRVdGMpID4gMDtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXRIb3VyQWdlKGQ6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIpIHtcclxuXHRcdGNvbnN0IG0gPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZCkpO1xyXG5cdFx0cmV0dXJuIERhdGVUaW1lLm5vdygpLmRpZmYobSwgJ2hvdXJzJykuaG91cnM7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb21wYXJlIGRhdGUgd2l0aCBub3cuXHJcblx0ICogQHBhcmFtIGR0VXRjXHJcblx0ICovXHJcblx0c3RhdGljIGdldERheUFnZShkOiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyKSB7XHJcblx0XHRjb25zdCBtID0gRGF0ZVRpbWUuZnJvbUpTRGF0ZSh0aGlzLmRhdGVEYXRhVG9EYXRlKGQpKTtcclxuXHRcdHJldHVybiBEYXRlVGltZS5ub3coKS5kaWZmKG0sICdkYXlzJykuZGF5cztcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEhvdyBtYW55IHllYXJzIGZyb20gbm93LlxyXG5cdCAqIEBwYXJhbSBkXHJcblx0ICogQHJldHVybnNcclxuXHQgKi9cclxuXHRzdGF0aWMgZ2V0QWdlKGQ6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIpIHtcclxuXHRcdGNvbnN0IG0gPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoZCkpO1xyXG5cdFx0cmV0dXJuIERhdGVUaW1lLm5vdygpLmRpZmYobSwgJ3llYXJzJykueWVhcnM7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb252ZXJ0IG1pbnV0ZXMgZnJvbSBtaWRuaWdodCB0byBISDptbSB0ZXh0XHJcblx0ICogQHBhcmFtIG1pbnV0ZXNcclxuXHQgKi9cclxuXHRzdGF0aWMgZ2V0SE1Gcm9tTWlucyhtaW51dGVzOiBudW1iZXIpOiBzdHJpbmcge1xyXG5cdFx0aWYgKG1pbnV0ZXMgPj0gMjQgKiA2MCB8fCBtaW51dGVzIDwgMCkge1xyXG5cdFx0XHR0aHJvdyBuZXcgUmFuZ2VFcnJvcignVmFsaWQgaW5wdXQgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAwIGFuZCBsZXNzIHRoYW4gMTQ0MC4nKTtcclxuXHRcdH1cclxuXHRcdGNvbnN0IGggPSBtaW51dGVzIC8gNjAgfCAwLFxyXG5cdFx0XHRtID0gbWludXRlcyAlIDYwIHwgMDtcclxuXHRcdHJldHVybiBEYXRlVGltZS51dGMoKS5zZXQoe2hvdXI6IGgsIG1pbnV0ZTogbX0pLnRvRm9ybWF0KCdISDptbScpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldE1pbnV0ZXNTaW5jZU1pZG5pZ2h0KGQ6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIpIHtcclxuXHRcdGNvbnN0IGR0ID0gRGF0ZVRpbWUuZnJvbUpTRGF0ZSh0aGlzLmRhdGVEYXRhVG9EYXRlKGQpKTtcclxuXHRcdGNvbnN0IG1pZG5pZ2h0ID0gZHQuc3RhcnRPZignZGF5Jyk7XHJcblx0XHRyZXR1cm4gZHQuZGlmZihtaWRuaWdodCwgJ21pbnV0ZXMnKS5taW51dGVzO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldE1pbnV0ZXNCZXR3ZWVuKHN0YXJ0OiBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyLCBlbmQ6IERhdGUgfCBzdHJpbmcgfCBudW1iZXIpIHtcclxuXHRcdGNvbnN0IG0gPSBEYXRlVGltZS5mcm9tSlNEYXRlKHRoaXMuZGF0ZURhdGFUb0RhdGUoc3RhcnQpKTtcclxuXHRcdGNvbnN0IG0yID0gRGF0ZVRpbWUuZnJvbUpTRGF0ZSh0aGlzLmRhdGVEYXRhVG9EYXRlKGVuZCkpO1xyXG5cdFx0cmV0dXJuIG0yLmRpZmYobSwgJ21pbnV0ZXMnKS5taW51dGVzO1xyXG5cdH1cclxufVxyXG5cclxuIl19
|