@doolehealth/service-lib 0.0.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.
- package/README.md +24 -0
- package/esm2022/doolehealth-service-lib.mjs +5 -0
- package/esm2022/lib/configuration.mjs +5 -0
- package/esm2022/lib/models/user.mjs +2 -0
- package/esm2022/lib/service-lib.component.mjs +19 -0
- package/esm2022/lib/service-lib.module.mjs +33 -0
- package/esm2022/lib/services/analytics.service.mjs +73 -0
- package/esm2022/lib/services/api-endpoints.service.mjs +51 -0
- package/esm2022/lib/services/authentication.service.mjs +400 -0
- package/esm2022/lib/services/change-endpoints.service.mjs +90 -0
- package/esm2022/lib/services/date.service.mjs +419 -0
- package/esm2022/lib/services/doole.service.mjs +1299 -0
- package/esm2022/lib/services/encryption.service.mjs +31 -0
- package/esm2022/lib/services/error.service.mjs +49 -0
- package/esm2022/lib/services/events.service.mjs +63 -0
- package/esm2022/lib/services/highcharts.service.mjs +621 -0
- package/esm2022/lib/services/http.service.mjs +124 -0
- package/esm2022/lib/services/language.service.mjs +38 -0
- package/esm2022/lib/services/loading.service.mjs +45 -0
- package/esm2022/lib/services/logging.service.mjs +28 -0
- package/esm2022/lib/services/navigation.service.mjs +41 -0
- package/esm2022/lib/services/network.service.mjs +42 -0
- package/esm2022/lib/services/notification.service.mjs +202 -0
- package/esm2022/lib/services/opentok.service.mjs +25 -0
- package/esm2022/lib/services/roles.service.mjs +44 -0
- package/esm2022/lib/services/storage.service.mjs +37 -0
- package/esm2022/lib/services/token.service.mjs +59 -0
- package/esm2022/lib/util/chatParameters.mjs +17 -0
- package/esm2022/lib/util/data-store.mjs +54 -0
- package/esm2022/lib/util/environment.mjs +29 -0
- package/esm2022/lib/util/language.model.mjs +3 -0
- package/esm2022/lib/util/notification-options.mjs +245 -0
- package/esm2022/lib/util/query-string-parameters.mjs +11 -0
- package/esm2022/lib/util/url-builder.mjs +15 -0
- package/esm2022/public-api.mjs +30 -0
- package/fesm2022/doolehealth-service-lib.mjs +4025 -0
- package/fesm2022/doolehealth-service-lib.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/configuration.d.ts +46 -0
- package/lib/models/user.d.ts +133 -0
- package/lib/service-lib.component.d.ts +5 -0
- package/lib/service-lib.module.d.ts +13 -0
- package/lib/services/analytics.service.d.ts +17 -0
- package/lib/services/api-endpoints.service.d.ts +13 -0
- package/lib/services/authentication.service.d.ts +102 -0
- package/lib/services/change-endpoints.service.d.ts +38 -0
- package/lib/services/date.service.d.ts +58 -0
- package/lib/services/doole.service.d.ts +169 -0
- package/lib/services/encryption.service.d.ts +9 -0
- package/lib/services/error.service.d.ts +11 -0
- package/lib/services/events.service.d.ts +32 -0
- package/lib/services/highcharts.service.d.ts +69 -0
- package/lib/services/http.service.d.ts +28 -0
- package/lib/services/language.service.d.ts +15 -0
- package/lib/services/loading.service.d.ts +22 -0
- package/lib/services/logging.service.d.ts +9 -0
- package/lib/services/navigation.service.d.ts +13 -0
- package/lib/services/network.service.d.ts +14 -0
- package/lib/services/notification.service.d.ts +25 -0
- package/lib/services/opentok.service.d.ts +17 -0
- package/lib/services/roles.service.d.ts +28 -0
- package/lib/services/storage.service.d.ts +10 -0
- package/lib/services/token.service.d.ts +16 -0
- package/lib/util/chatParameters.d.ts +25 -0
- package/lib/util/data-store.d.ts +13 -0
- package/lib/util/environment.d.ts +18 -0
- package/lib/util/language.model.d.ts +4 -0
- package/lib/util/notification-options.d.ts +145 -0
- package/lib/util/query-string-parameters.d.ts +6 -0
- package/lib/util/url-builder.d.ts +9 -0
- package/package.json +38 -0
- package/public-api.d.ts +23 -0
|
@@ -0,0 +1,419 @@
|
|
|
1
|
+
import { DatePipe } from '@angular/common';
|
|
2
|
+
import { Injectable } from '@angular/core';
|
|
3
|
+
import moment from 'moment';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@angular/common";
|
|
6
|
+
import * as i2 from "@ngx-translate/core";
|
|
7
|
+
export class DateService {
|
|
8
|
+
constructor(datePipe, translate) {
|
|
9
|
+
this.datePipe = datePipe;
|
|
10
|
+
this.translate = translate;
|
|
11
|
+
this.locale = this.getLocale();
|
|
12
|
+
}
|
|
13
|
+
getDateFormat() {
|
|
14
|
+
let lang = this.translate.currentLang;
|
|
15
|
+
let format = 'DD/MM/YY ';
|
|
16
|
+
if (lang === 'en')
|
|
17
|
+
format = 'MM/DD/YY ';
|
|
18
|
+
return format;
|
|
19
|
+
}
|
|
20
|
+
getDateFormat2() {
|
|
21
|
+
let lang = this.translate.currentLang;
|
|
22
|
+
let format = 'dd/MM/YY';
|
|
23
|
+
if (lang === 'en')
|
|
24
|
+
format = 'MM/dd/YY';
|
|
25
|
+
return format;
|
|
26
|
+
}
|
|
27
|
+
getDateFormat3() {
|
|
28
|
+
let lang = this.translate.currentLang;
|
|
29
|
+
let format = 'DD/MM/YYYY';
|
|
30
|
+
if (lang === 'en')
|
|
31
|
+
format = 'MM/DD/YYYY';
|
|
32
|
+
return format;
|
|
33
|
+
}
|
|
34
|
+
getLongFormat() {
|
|
35
|
+
let lang = this.translate.currentLang;
|
|
36
|
+
let format = 'dddd, MMM yyyy';
|
|
37
|
+
if (lang === 'en')
|
|
38
|
+
format = 'MMM, ddd yyyy';
|
|
39
|
+
return format;
|
|
40
|
+
}
|
|
41
|
+
getMonthViewDayHeader(date) {
|
|
42
|
+
let lang = this.translate.currentLang;
|
|
43
|
+
let days = ["D", "L", "M", "X", "J", "V", "S"];
|
|
44
|
+
if (lang === 'ca') {
|
|
45
|
+
days = ["DG", "DL", "DT", "DC", "DJ", "DV", "DS"];
|
|
46
|
+
}
|
|
47
|
+
else if (lang === 'en')
|
|
48
|
+
days = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
|
|
49
|
+
let num = date.getDay();
|
|
50
|
+
return days[num];
|
|
51
|
+
}
|
|
52
|
+
formatSelectedDate(date) {
|
|
53
|
+
if (date) {
|
|
54
|
+
let day = this.transformDate(date, this.getformatSelectedDate());
|
|
55
|
+
console.log("selected Day", day);
|
|
56
|
+
return day[0].toUpperCase() + day.slice(1);
|
|
57
|
+
}
|
|
58
|
+
return date;
|
|
59
|
+
}
|
|
60
|
+
getformatSelectedDate() {
|
|
61
|
+
let lang = this.translate.currentLang;
|
|
62
|
+
let format = 'EEEE, d MMMM';
|
|
63
|
+
if (lang === 'en')
|
|
64
|
+
format = 'MMMM d, EEEE';
|
|
65
|
+
return format;
|
|
66
|
+
}
|
|
67
|
+
getLocale() {
|
|
68
|
+
let lang = this.translate.currentLang;
|
|
69
|
+
let locale = 'es-ES';
|
|
70
|
+
if (lang === 'ca') {
|
|
71
|
+
locale = 'ca-ES';
|
|
72
|
+
}
|
|
73
|
+
else if (lang === 'en')
|
|
74
|
+
locale = 'en-US';
|
|
75
|
+
return locale;
|
|
76
|
+
}
|
|
77
|
+
getStartingDayWeek() {
|
|
78
|
+
let lang = this.translate.currentLang;
|
|
79
|
+
let day = '1';
|
|
80
|
+
if (lang == 'en')
|
|
81
|
+
day = '0';
|
|
82
|
+
return day;
|
|
83
|
+
}
|
|
84
|
+
getStartingDayMonth() {
|
|
85
|
+
let lang = this.translate.currentLang;
|
|
86
|
+
let day = 1;
|
|
87
|
+
if (lang == 'en')
|
|
88
|
+
day = 0;
|
|
89
|
+
return day;
|
|
90
|
+
}
|
|
91
|
+
ddMMy() {
|
|
92
|
+
let lang = this.translate.currentLang;
|
|
93
|
+
let format = 'dd/MM/y';
|
|
94
|
+
if (lang === 'en')
|
|
95
|
+
format = 'MM/dd/y';
|
|
96
|
+
return format;
|
|
97
|
+
}
|
|
98
|
+
getShortDateFormat() {
|
|
99
|
+
let lang = this.translate.currentLang;
|
|
100
|
+
let format = 'DD/MM/YY';
|
|
101
|
+
if (lang === 'en')
|
|
102
|
+
format = 'MM/DD/YY';
|
|
103
|
+
return format;
|
|
104
|
+
}
|
|
105
|
+
ddMMyyyyFormat(date) {
|
|
106
|
+
let lang = this.translate.currentLang;
|
|
107
|
+
let format = 'dd/MM/yyyy';
|
|
108
|
+
if (lang === 'en')
|
|
109
|
+
format = 'MM/dd/yyyy';
|
|
110
|
+
let day = this.transformDate(date, format);
|
|
111
|
+
return day[0].toUpperCase() + day.slice(1);
|
|
112
|
+
}
|
|
113
|
+
ddMMyFormat(date) {
|
|
114
|
+
let lang = this.translate.currentLang;
|
|
115
|
+
let format = 'dd MMM y';
|
|
116
|
+
if (lang === 'en')
|
|
117
|
+
format = 'MMM dd y';
|
|
118
|
+
let day = this.transformDate(date, format);
|
|
119
|
+
return day[0].toUpperCase() + day.slice(1);
|
|
120
|
+
}
|
|
121
|
+
ddMMMyyyformat(date) {
|
|
122
|
+
let lang = this.translate.currentLang;
|
|
123
|
+
let format = 'dd MMM yyy';
|
|
124
|
+
if (lang === 'en')
|
|
125
|
+
format = 'MMM dd yyy';
|
|
126
|
+
let day = this.transformDate(date, format);
|
|
127
|
+
return day[0].toUpperCase() + day.slice(1);
|
|
128
|
+
}
|
|
129
|
+
MMMMyyyyFormat(date) {
|
|
130
|
+
let format = 'MMMM yyyy';
|
|
131
|
+
let day = this.transformDate(date, format);
|
|
132
|
+
return day[0].toUpperCase() + day.slice(1);
|
|
133
|
+
}
|
|
134
|
+
getDayMonthYearFormat(date) {
|
|
135
|
+
let lang = this.translate.currentLang;
|
|
136
|
+
let format = 'EEEE, d MMMM YYYY';
|
|
137
|
+
if (lang === 'en')
|
|
138
|
+
format = 'MMMM, d EEEE YYYY';
|
|
139
|
+
let day = this.transformDate(date, format);
|
|
140
|
+
return day[0].toUpperCase() + day.slice(1);
|
|
141
|
+
}
|
|
142
|
+
selectedDateFormat(date) {
|
|
143
|
+
let lang = this.translate.currentLang;
|
|
144
|
+
let format = 'EEEE, d MMMM';
|
|
145
|
+
if (lang === 'en')
|
|
146
|
+
format = 'MMMM d, YYYY';
|
|
147
|
+
let day = this.transformDate(date, format);
|
|
148
|
+
return day[0].toUpperCase() + day.slice(1);
|
|
149
|
+
}
|
|
150
|
+
ddMMyyyyHHmm(date) {
|
|
151
|
+
let lang = this.translate.currentLang;
|
|
152
|
+
let format = 'dd/MM/yyyy HH:mm';
|
|
153
|
+
if (lang === 'en')
|
|
154
|
+
format = 'MM/dd/yyyy hh:mm a';
|
|
155
|
+
let day = this.transformDate(date, format);
|
|
156
|
+
return day[0].toUpperCase() + day.slice(1);
|
|
157
|
+
}
|
|
158
|
+
formatDateLongFormat(date) {
|
|
159
|
+
if (date) {
|
|
160
|
+
let day = this.transformDate(date, this.getLongDateFormat());
|
|
161
|
+
return day[0].toUpperCase() + day.slice(1);
|
|
162
|
+
}
|
|
163
|
+
return date;
|
|
164
|
+
}
|
|
165
|
+
yyyyMMddHHmm(date) {
|
|
166
|
+
if (date) {
|
|
167
|
+
let day = this.transformDate(date, this.yyyyMMddHHmmFormat());
|
|
168
|
+
console.log("selected Day", day);
|
|
169
|
+
return day[0].toUpperCase() + day.slice(1);
|
|
170
|
+
}
|
|
171
|
+
return date;
|
|
172
|
+
}
|
|
173
|
+
yyyyMMddHHmmFormat() {
|
|
174
|
+
let lang = this.translate.currentLang;
|
|
175
|
+
let format = 'yyyy-dd-MM HH:mm';
|
|
176
|
+
if (lang === 'en')
|
|
177
|
+
format = 'yyyy-MM-dd HH:mm a';
|
|
178
|
+
return format;
|
|
179
|
+
}
|
|
180
|
+
getLongDateFormat() {
|
|
181
|
+
let lang = this.translate.currentLang;
|
|
182
|
+
let format = 'EEEE, d MMMM yyyy, HH:mm';
|
|
183
|
+
if (lang === 'en')
|
|
184
|
+
format = 'MMMM, d yyyy, hh:mm a';
|
|
185
|
+
return format;
|
|
186
|
+
}
|
|
187
|
+
getDatetimeControlFormat() {
|
|
188
|
+
let lang = this.translate.currentLang;
|
|
189
|
+
let format = 'D MMM YYYY HH:mm';
|
|
190
|
+
if (lang === 'en')
|
|
191
|
+
format = 'MMM D YY hh:mm a';
|
|
192
|
+
return format;
|
|
193
|
+
}
|
|
194
|
+
getDayMonthFormat() {
|
|
195
|
+
let lang = this.translate.currentLang;
|
|
196
|
+
let format = 'd MMM';
|
|
197
|
+
if (lang === 'en')
|
|
198
|
+
format = 'MMM d';
|
|
199
|
+
return format;
|
|
200
|
+
}
|
|
201
|
+
getDayDotMonthFormat() {
|
|
202
|
+
let lang = this.translate.currentLang;
|
|
203
|
+
let format = 'd. MMM';
|
|
204
|
+
if (lang === 'en')
|
|
205
|
+
format = 'MMM. d';
|
|
206
|
+
return format;
|
|
207
|
+
}
|
|
208
|
+
getSelectedWeek(date) {
|
|
209
|
+
let lang = this.translate.currentLang;
|
|
210
|
+
let format = 'E d MMM';
|
|
211
|
+
if (lang === 'en')
|
|
212
|
+
format = 'MMM d, E';
|
|
213
|
+
let day = this.transformDate(date, format);
|
|
214
|
+
return day[0].toUpperCase() + day.slice(1);
|
|
215
|
+
}
|
|
216
|
+
getSelectedWeekFullDay(date) {
|
|
217
|
+
let lang = this.translate.currentLang;
|
|
218
|
+
let format = 'EEE d MMM';
|
|
219
|
+
if (lang === 'en')
|
|
220
|
+
format = 'MMM d, EEE';
|
|
221
|
+
let day = this.transformDate(date, format);
|
|
222
|
+
return day[0].toUpperCase() + day.slice(1);
|
|
223
|
+
}
|
|
224
|
+
formatDate(date) {
|
|
225
|
+
if (date) {
|
|
226
|
+
date = new Date(date);
|
|
227
|
+
if (this.isToday(date))
|
|
228
|
+
return this.datePipe.transform(date, this.getTimeFormat());
|
|
229
|
+
else {
|
|
230
|
+
let format = this.getDateFormat2();
|
|
231
|
+
return this.transformDate(date, format);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
return date;
|
|
235
|
+
}
|
|
236
|
+
ddMMyyyy(date) {
|
|
237
|
+
let lang = this.translate.currentLang;
|
|
238
|
+
let format = 'dd-MM-yyyy';
|
|
239
|
+
if (lang === 'en')
|
|
240
|
+
format = 'MM-dd-yyyy';
|
|
241
|
+
let day = this.transformDate(date, format);
|
|
242
|
+
return day[0].toUpperCase() + day.slice(1);
|
|
243
|
+
}
|
|
244
|
+
highchartsDatesFornmat() {
|
|
245
|
+
let lang = this.translate.currentLang;
|
|
246
|
+
let format = {};
|
|
247
|
+
if (lang == 'en') {
|
|
248
|
+
// %b: Short month, like 'Jan',%e Day of the month, 1 through 31
|
|
249
|
+
format = {
|
|
250
|
+
millisecond: '%H:%M:%S.%L',
|
|
251
|
+
second: '%l:%M:%S %P',
|
|
252
|
+
minute: '%l:%M %p',
|
|
253
|
+
hour: '%l:%M %p',
|
|
254
|
+
day: '%b. %e',
|
|
255
|
+
week: '%b. %e',
|
|
256
|
+
month: '%b \'%y',
|
|
257
|
+
year: '%Y'
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
format = {
|
|
262
|
+
millisecond: '%H:%M:%S.%L',
|
|
263
|
+
second: '%H:%M:%S',
|
|
264
|
+
minute: '%H:%M',
|
|
265
|
+
hour: '%H:%M',
|
|
266
|
+
day: '%e. %b',
|
|
267
|
+
week: '%e. %b',
|
|
268
|
+
month: '%b \'%y',
|
|
269
|
+
year: '%Y'
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
return format;
|
|
273
|
+
}
|
|
274
|
+
yyyyMMddFormat(date) {
|
|
275
|
+
console.log("DATE date: ", date);
|
|
276
|
+
let lang = this.translate.currentLang;
|
|
277
|
+
console.log("DATE lang: ", lang);
|
|
278
|
+
let format = 'yyyy-MM-dd';
|
|
279
|
+
if (lang == 'en')
|
|
280
|
+
format = 'yyyy-dd-MM';
|
|
281
|
+
console.log("DATE format: ", format);
|
|
282
|
+
let day = this.transformDate(date, format);
|
|
283
|
+
console.log("DATE day: ", day);
|
|
284
|
+
return day[0].toUpperCase() + day.slice(1);
|
|
285
|
+
}
|
|
286
|
+
yyyyMMddTHHmmssSSSZFormat(date) {
|
|
287
|
+
const fechaFormateada = this.datePipe.transform(date, 'yyyy-MM-ddTHH:mm:ss.SSS\'Z\'');
|
|
288
|
+
return fechaFormateada;
|
|
289
|
+
}
|
|
290
|
+
convert12to24format(time) {
|
|
291
|
+
console.log("TIME 12to24: ", time);
|
|
292
|
+
var hours = Number(time.match(/^(\d+)/)[1]);
|
|
293
|
+
var minutes = Number(time.match(/:(\d+)/)[1]);
|
|
294
|
+
var AMPM = time.match(/\s(.*)$/)[1];
|
|
295
|
+
if (AMPM == "PM" && hours < 12)
|
|
296
|
+
hours = hours + 12;
|
|
297
|
+
if (AMPM == "AM" && hours == 12)
|
|
298
|
+
hours = hours - 12;
|
|
299
|
+
var sHours = hours.toString();
|
|
300
|
+
var sMinutes = minutes.toString();
|
|
301
|
+
if (hours < 10)
|
|
302
|
+
sHours = "0" + sHours;
|
|
303
|
+
if (minutes < 10)
|
|
304
|
+
sMinutes = "0" + sMinutes;
|
|
305
|
+
let h = sHours + ":" + sMinutes;
|
|
306
|
+
console.log("HOURS: ", h);
|
|
307
|
+
return h;
|
|
308
|
+
}
|
|
309
|
+
format24h(time) {
|
|
310
|
+
let lang = this.translate.currentLang;
|
|
311
|
+
if (lang === 'en') {
|
|
312
|
+
// Check correct time format and split into components
|
|
313
|
+
time = time.toString().match(/^([01]\d|2[0-3])(:)([0-5]\d)(:[0-5]\d)?$/) || [time];
|
|
314
|
+
if (time.length > 1) { // If time format correct
|
|
315
|
+
time = time.slice(1); // Remove full string match value
|
|
316
|
+
time[5] = +time[0] < 12 ? ' AM' : ' PM'; // Set AM/PM
|
|
317
|
+
time[0] = +time[0] % 12 || 12; // Adjust hours
|
|
318
|
+
}
|
|
319
|
+
return time.join(''); // return adjusted time or original string
|
|
320
|
+
}
|
|
321
|
+
return time;
|
|
322
|
+
}
|
|
323
|
+
isAmericanFormat() {
|
|
324
|
+
return this.translate.currentLang === 'en';
|
|
325
|
+
}
|
|
326
|
+
getTimeFormat() {
|
|
327
|
+
let lang = this.translate.currentLang;
|
|
328
|
+
let format = 'HH:mm';
|
|
329
|
+
if (lang === 'en')
|
|
330
|
+
format = 'hh:mm a';
|
|
331
|
+
return format;
|
|
332
|
+
}
|
|
333
|
+
isToday(mDate) {
|
|
334
|
+
let date = new Date();
|
|
335
|
+
if (date.getDate() === mDate.getDate() && date.getMonth() === mDate.getMonth() && date.getFullYear() === mDate.getFullYear())
|
|
336
|
+
return true;
|
|
337
|
+
return false;
|
|
338
|
+
}
|
|
339
|
+
transformDate(date, format) {
|
|
340
|
+
const datePipe = new DatePipe(this.getLocale());
|
|
341
|
+
return datePipe.transform(date, format);
|
|
342
|
+
}
|
|
343
|
+
getCalendarDay(epoch) {
|
|
344
|
+
if (!epoch) {
|
|
345
|
+
return null;
|
|
346
|
+
}
|
|
347
|
+
let timeString = 'h:mm A';
|
|
348
|
+
const today = this.translate.instant('agenda.today');
|
|
349
|
+
const yesterday = this.translate.instant('agenda.yesterday');
|
|
350
|
+
return moment(epoch).calendar(null, {
|
|
351
|
+
sameDay: `[${today}] ` + timeString,
|
|
352
|
+
lastDay: `[${yesterday}] ` + timeString,
|
|
353
|
+
lastWeek: 'DD/MM/YY ' + timeString,
|
|
354
|
+
sameElse: 'DD/MM/YY ' + timeString,
|
|
355
|
+
nextDay: 'DD/MM/YY ' + timeString,
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
getCalendarDay2(epoch) {
|
|
359
|
+
if (!epoch) {
|
|
360
|
+
return null;
|
|
361
|
+
}
|
|
362
|
+
let timeString = this.getTimeFormat();
|
|
363
|
+
let dateString = this.getShortDateFormat();
|
|
364
|
+
const today = this.translate.instant('agenda.today');
|
|
365
|
+
const yesterday = this.translate.instant('agenda.yesterday');
|
|
366
|
+
return moment(epoch).calendar(null, {
|
|
367
|
+
sameDay: `[${today}] ` + timeString,
|
|
368
|
+
lastDay: `[${yesterday}] ` + timeString,
|
|
369
|
+
sameElse: dateString + ' ' + timeString,
|
|
370
|
+
lastWeek: dateString + ' ' + timeString,
|
|
371
|
+
nextDay: dateString + ' ' + timeString
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
getCalendarDayTime(epoch) {
|
|
375
|
+
if (!epoch) {
|
|
376
|
+
return null;
|
|
377
|
+
}
|
|
378
|
+
let timeString = this.getTimeFormat();
|
|
379
|
+
let dateString = this.getLongFormat();
|
|
380
|
+
let lang = this.translate.currentLang;
|
|
381
|
+
const today = this.translate.instant('agenda.today');
|
|
382
|
+
const yesterday = this.translate.instant('agenda.yesterday');
|
|
383
|
+
const to = this.translate.instant('agenda.to');
|
|
384
|
+
const m = moment;
|
|
385
|
+
m.locale(lang);
|
|
386
|
+
return m(epoch).calendar(null, {
|
|
387
|
+
sameDay: `[${today}] ` + `[${to}] ` + timeString,
|
|
388
|
+
lastDay: `[${yesterday}] ` + `[${to}] ` + timeString,
|
|
389
|
+
sameElse: dateString + ' ' + `[${to}] ` + timeString,
|
|
390
|
+
lastWeek: dateString + ' ' + `[${to}] ` + timeString,
|
|
391
|
+
nextDay: dateString + ' ' + `[${to}] ` + timeString
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
// return epoch string as specified format
|
|
395
|
+
formatEpoch(epoch) {
|
|
396
|
+
return this.getCalendarDay(epoch);
|
|
397
|
+
}
|
|
398
|
+
getToday() {
|
|
399
|
+
const tzoffset = (new Date()).getTimezoneOffset() * 60000; // offset in milliseconds
|
|
400
|
+
const localISOTime = (new Date(Date.now() - tzoffset)).toISOString().slice(0, -1);
|
|
401
|
+
let date = localISOTime; // this.dateService.selectedDateFormat(localISOTime);
|
|
402
|
+
return date;
|
|
403
|
+
}
|
|
404
|
+
getCurrentTime() {
|
|
405
|
+
const tzoffset = (new Date()).getTimezoneOffset() * 60000; // offset in milliseconds
|
|
406
|
+
const localISOTime = (new Date(Date.now() - tzoffset)).toISOString().slice(0, -1);
|
|
407
|
+
let date = localISOTime; // this.dateService.selectedDateFormat(localISOTime);
|
|
408
|
+
return new Date(Date.now() - tzoffset).getTime().toLocaleString();
|
|
409
|
+
}
|
|
410
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: DateService, deps: [{ token: i1.DatePipe }, { token: i2.TranslateService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
411
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: DateService, providedIn: 'root' }); }
|
|
412
|
+
}
|
|
413
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: DateService, decorators: [{
|
|
414
|
+
type: Injectable,
|
|
415
|
+
args: [{
|
|
416
|
+
providedIn: 'root',
|
|
417
|
+
}]
|
|
418
|
+
}], ctorParameters: () => [{ type: i1.DatePipe }, { type: i2.TranslateService }] });
|
|
419
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2VydmljZS1saWIvc3JjL2xpYi9zZXJ2aWNlcy9kYXRlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDOzs7O0FBSzVCLE1BQU0sT0FBTyxXQUFXO0lBSXRCLFlBQW9CLFFBQWtCLEVBQVMsU0FBMkI7UUFBdEQsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUFTLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQ3hFLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFHTSxhQUFhO1FBQ2xCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDO1FBQ3RDLElBQUksTUFBTSxHQUFHLFdBQVcsQ0FBQztRQUN6QixJQUFHLElBQUksS0FBSyxJQUFJO1lBQ2QsTUFBTSxHQUFHLFdBQVcsQ0FBQTtRQUN0QixPQUFPLE1BQU0sQ0FBQTtJQUNmLENBQUM7SUFFTSxjQUFjO1FBQ25CLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDO1FBQ3RDLElBQUksTUFBTSxHQUFHLFVBQVUsQ0FBQztRQUN4QixJQUFHLElBQUksS0FBSyxJQUFJO1lBQ2QsTUFBTSxHQUFHLFVBQVUsQ0FBQTtRQUNyQixPQUFPLE1BQU0sQ0FBQTtJQUNmLENBQUM7SUFFTSxjQUFjO1FBQ25CLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDO1FBQ3RDLElBQUksTUFBTSxHQUFHLFlBQVksQ0FBQztRQUMxQixJQUFHLElBQUksS0FB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QUFNLFFBQVEsR0FBRyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLHlCQUF5QjtRQUNwRixNQUFNLFlBQVksR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsRixJQUFJLElBQUksR0FBRyxZQUFZLENBQUEsQ0FBQSxxREFBcUQ7UUFDNUUsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0lBRUQsY0FBYztRQUNaLE1BQU0sUUFBUSxHQUFHLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLGlCQUFpQixFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMseUJBQXlCO1FBQ3BGLE1BQU0sWUFBWSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xGLElBQUksSUFBSSxHQUFHLFlBQVksQ0FBQSxDQUFBLHFEQUFxRDtRQUM1RSxPQUFPLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxRQUFRLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUNwRSxDQUFDOytHQXJnQlUsV0FBVzttSEFBWCxXQUFXLGNBRlYsTUFBTTs7NEZBRVAsV0FBVztrQkFIdkIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEYXRlUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBEYXRlU2VydmljZSB7XG4gIGxvY2FsZTpzdHJpbmc7XG4gIGxhbmd1YWdlOnN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRhdGVQaXBlOiBEYXRlUGlwZSwgcHVibGljIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSkge1xuICAgIHRoaXMubG9jYWxlID0gdGhpcy5nZXRMb2NhbGUoKTtcbiAgfVxuXG5cbiAgcHVibGljIGdldERhdGVGb3JtYXQoKXtcbiAgICBsZXQgbGFuZyA9IHRoaXMudHJhbnNsYXRlLmN1cnJlbnRMYW5nO1xuICAgIGxldCBmb3JtYXQgPSAnREQvTU0vWVkgJztcbiAgICBpZihsYW5nID09PSAnZW4nIClcbiAgICAgIGZvcm1hdCA9ICdNTS9ERC9ZWSAnXG4gICAgcmV0dXJuIGZvcm1hdFxuICB9XG5cbiAgcHVibGljIGdldERhdGVGb3JtYXQyKCl7XG4gICAgbGV0IGxhbmcgPSB0aGlzLnRyYW5zbGF0ZS5jdXJyZW50TGFuZztcbiAgICBsZXQgZm9ybWF0ID0gJ2RkL01NL1lZJztcbiAgICBpZihsYW5nID09PSAnZW4nIClcbiAgICAgIGZvcm1hdCA9ICdNTS9kZC9ZWSdcbiAgICByZXR1cm4gZm9ybWF0XG4gIH1cblxuICBwdWJsaWMgZ2V0RGF0ZUZvcm1hdDMoKXtcbiAgICBsZXQgbGFuZyA9IHRoaXMudHJhbnNsYXRlLmN1cnJlbnRMYW5nO1xuICAgIGxldCBmb3JtYXQgPSAnREQvTU0vWVlZWSc7XG4gICAgaWYobGFuZyA9PT0gJ2VuJyApXG4gICAgICBmb3JtYXQgPSAnTU0vREQvWVlZWSdcbiAgICByZXR1cm4gZm9ybWF0XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9uZ0Zvcm1hdCgpe1xuICAgIGxldCBsYW5nID0gIHRoaXMudHJhbnNsYXRlLmN1cnJlbnRMYW5nO1xuICAgIGxldCBmb3JtYXQgPSAnZGRkZCwgTU1NIHl5eXknO1xuXG4gICAgaWYobGFuZyA9PT0gJ2VuJyApXG4gICAgICBmb3JtYXQgPSAnTU1NLCBkZGQgeXl5eSc7XG5cbiAgICByZXR1cm4gZm9ybWF0XG4gIH1cblxuXG4gIHB1YmxpYyBnZXRNb250aFZpZXdEYXlIZWFkZXIoZGF0ZTpEYXRlKXtcbiAgICBsZXQgbGFuZyA9IHRoaXMudHJhbnNsYXRlLmN1cnJlbnRMYW5nO1xuICAgIGxldCBkYXlzID0gW1wiRFwiLFwiTFwiLCBcIk1cIiwgXCJYXCIsIFwiSlwiLCBcIlZcIiwgXCJTXCJdXG4gICAgaWYobGFuZyA9PT0gJ2NhJyl7XG4gICAgICBkYXlzID0gW1wiREdcIixcIkRMXCIsIFwiRFRcIiwgXCJEQ1wiLCBcIkRKXCIsIFwiRFZcIiwgXCJEU1wiXVxuICAgIH1lbHNlIGlmKGxhbmcgPT09ICdlbicpXG4gICAgICBkYXlzID0gIFtcIlN1blwiLFwiTW9uXCIsIFwiVHVlXCIsIFwiV2VkXCIsIFwiVGh1XCIsIFwiRnJpXCIsIFwiU2F0XCJdXG5cbiAgICBsZXQgbnVtID0gZGF0ZS5nZXREYXkoKVxuICAgIHJldHVybiBkYXlzW251bV1cbiAgfVxuXG4gIHB1YmxpYyBmb3JtYXRTZWxlY3RlZERhdGUoZGF0ZSl7XG4gICAgaWYoZGF0ZSl7XG4gICAgICBsZXQgZGF5ID0gdGhpcy50cmFuc2Zvcm1EYXRlKGRhdGUsIHRoaXMuZ2V0Zm9ybWF0U2VsZWN0ZWREYXRlKCkpO1xuICAgICAgY29uc29sZS5sb2coXCJzZWxlY3RlZCBEYXlcIiwgZGF5KTtcbiAgICAgIHJldHVybiBkYXlbMF0udG9VcHBlckNhc2UoKSArIGRheS5zbGljZSgxKTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cbiAgcHVibGljIGdldGZvcm1hdFNlbGVjdGVkRGF0ZSgpe1xuICAgIGxldCBsYW5nID0gIHRoaXMudHJhbnNsYXRlLmN1cnJlbnRMYW5nO1xuICAgIGxldCBmb3JtYXQgPSAnRUVFRSwgZCBNTU1NJ1xuICAgIGlmKGxhbmcgPT09ICdlbicgKVxuICAgICAgZm9ybWF0ID0gJ01NTU0gZCwgRUVFRSc7XG4gICAgcmV0dXJuIGZvcm1hdDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMb2NhbGUoKXtcbiAgICBsZXQgbGFuZyA9ICB0aGlzLnRyYW5zbGF0ZS5jdXJyZW50TGFuZztcbiAgICBsZXQgbG9jYWxlID0gJ2VzLUVTJ1xuICAgIGlmKGxhbmcgPT09ICdjYScpe1xuICAgICAgbG9jYWxlID0gJ2NhLUVTJ1xuICAgIH1lbHNlIGlmKGxhbmcgPT09ICdlbicpXG4gICAgICBsb2NhbGUgPSAnZW4tVVMnO1xuXG4gICAgcmV0dXJuIGxvY2FsZTtcblxuICB9XG5cbiAgcHVibGljIGdldFN0YXJ0aW5nRGF5V2Vlaygpe1xuICAgIGxldCBsYW5nID0gIHRoaXMudHJhbnNsYXRlLmN1cnJlbnRMYW5nO1xuICAgIGxldCBkYXkgPSAnMSdcbiAgICBpZihsYW5nID09ICdlbicpXG4gICAgICBkYXkgPSAnMCdcblxuICAgIHJldHVybiBkYXk7XG4gIH1cblxuXG4gIHB1YmxpYyBnZXRTdGFydGluZ0RheU1vbnRoKCl7XG4gICAgbGV0IGxhbmcgPSAgdGhpcy50cmFuc2xhdGUuY3VycmVudExhbmc7XG4gICAgbGV0IGRheSA9IDFcbiAgICBpZihsYW5nID09ICdlbicpXG4gICAgICBkYXkgPSAwXG5cbiAgICByZXR1cm4gZGF5O1xuICB9XG5cbiAgJ2RkL01NL3knXG5cbiAgcHVibGljIGRkTU15KCl7XG4gICAgbGV0IGxhbmcgPSAgdGhpcy50cmFuc2xhdGUuY3VycmVudExhbmc7XG4gICAgbGV0IGZvcm1hdCA9ICdkZC9NTS95J1xuXG4gICAgaWYobGFuZyA9PT0gJ2VuJyApXG4gICAgICBmb3JtYXQgPSAnTU0vZGQveSc7XG5cbiAgICByZXR1cm4gZm9ybWF0O1xuICB9XG5cbiAgcHVibGljIGdldFNob3J0RGF0ZUZvcm1hdCgpe1xuICAgIGxldCBsYW5nID0gIHRoaXMudHJhbnNsYXRlLmN1cnJlbnRMYW5nO1xuICAgIGxldCBmb3JtYXQgPSAnREQvTU0vWVknXG5cbiAgICBpZihsYW5nID09PSAnZW4nIClcbiAgICAgIGZvcm1hdCA9ICdNTS9ERC9ZWSc7XG5cbiAgICByZXR1cm4gZm9ybWF0O1xuICB9XG5cbiAgcHVibGljIGRkTU15eXl5Rm9ybWF0KGRhdGUpe1xuICAgIGxldCBsYW5nID0gIHRoaXMudHJhbnNsYXRlLmN1cnJlbnRMYW5nO1xuICAgIGxldCBmb3JtYXQgPSAnZGQvTU0veXl5eSc7XG5cbiAgICBpZihsYW5nID09PSAnZW4nIClcbiAgICAgIGZvcm1hdCA9ICdNTS9kZC95eXl5JztcblxuICAgIGxldCBkYXkgPSB0aGlzLnRyYW5zZm9ybURhdGUoZGF0ZSwgZm9ybWF0KTtcbiAgICByZXR1cm4gZGF5WzBdLnRvVXBwZXJDYXNlKCkgKyBkYXkuc2xpY2UoMSk7XG4gIH1cblxuICBwdWJsaWMgZGRNTXlGb3JtYXQoZGF0ZSl7XG4gICAgbGV0IGxhbmcgPSAgdGhpcy50cmFuc2xhdGUuY3VycmVudExhbmc7XG4gICAgbGV0IGZvcm1hdCA9ICdkZCBNTU0geSc7XG5cbiAgICBpZihsYW5nID09PSAnZW4nIClcbiAgICAgIGZvcm1hdCA9ICdNTU0gZGQgeSc7XG5cbiAgICAgIGxldCBkYXkgPSB0aGlzLnRyYW5zZm9ybURhdGUoZGF0ZSwgZm9ybWF0KTtcbiAgICAgIHJldHVybiBkYXlbMF0udG9VcHBlckNhc2UoKSArIGRheS5zbGljZSgxKTtcbiAgfVxuXG4gIHB1YmxpYyBkZE1NTXl5eWZvcm1hdChkYXRlKXtcbiAgICBsZXQgbGFuZyA9ICB0aGlzLnRyYW5zbGF0ZS5jdXJyZW50TGFuZztcbiAgICBsZXQgZm9ybWF0ID0gJ2RkIE1NTSB5eXknO1xuXG4gICAgaWYobGFuZyA9PT0gJ2VuJylcbiAgICAgIGZvcm1hdCA9ICdNTU0gZGQgeXl5JztcblxuICAgICAgbGV0IGRheSA9IHRoaXMudHJhbnNmb3JtRGF0ZShkYXRlLCBmb3JtYXQpO1xuICAgICAgcmV0dXJuIGRheVswXS50b1VwcGVyQ2FzZSgpICsgZGF5LnNsaWNlKDEpXG5cbiAgfVxuXG4gIHB1YmxpYyBNTU1NeXl5eUZvcm1hdChkYXRlKXtcblxuICAgIGxldCBmb3JtYXQgPSdNTU1NIHl5eXknO1xuXG4gICAgbGV0IGRheSA9IHRoaXMudHJhbnNmb3JtRGF0ZShkYXRlLCBmb3JtYXQpO1xuICAgIHJldHVybiBkYXlbMF0udG9VcHBlckNhc2UoKSArIGRheS5zbGljZSgxKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREYXlNb250aFllYXJGb3JtYXQoZGF0ZSl7XG4gICAgbGV0IGxhbmcgPSAgdGhpcy50cmFuc2xhdGUuY3VycmVudExhbmc7XG4gICAgbGV0IGZvcm1hdCA9ICdFRUVFLCBkIE1NTU0gWVlZWSc7XG5cbiAgICBpZihsYW5nID09PSAnZW4nIClcbiAgICAgIGZvcm1hdCA9ICdNTU1NLCBkIEVFRUUgWVlZWSc7XG5cbiAgICAgIGxldCBkYXkgPSB0aGlzLnRyYW5zZm9ybURhdGUoZGF0ZSwgZm9ybWF0KTtcbiAgICAgIHJldHVybiBkYXlbMF0udG9VcHBlckNhc2UoKSArIGRheS5zbGljZSgxKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RlZERhdGVGb3JtYXQoZGF0ZTpzdHJpbmcpe1xuXG4gICAgbGV0IGxhbmcgPSAgdGhpcy50cmFuc2xhdGUuY3VycmVudExhbmc7XG4gICAgbGV0IGZvcm1hdCA9ICdFRUVFLCBkIE1NTU0nXG5cbiAgICBpZihsYW5nID09PSAnZW4nIClcbiAgICAgIGZvcm1hdCA9ICdNTU1NIGQsIFlZWVknO1xuXG4gICAgbGV0IGRheSA9IHRoaXMudHJhbnNmb3JtRGF0ZShkYXRlLCBmb3JtYXQpO1xuICAgIHJldHVybiBkYXlbMF0udG9VcHBlckNhc2UoKSArIGRheS5zbGljZSgxKTtcbiAgfVxuXG5cblxuICBkZE1NeXl5eUhIbW0oZGF0ZSl7XG4gICAgbGV0IGxhbmcgPSAgdGhpcy50cmFuc2xhdGUuY3VycmVudExhbmc7XG4gICAgbGV0IGZvcm1hdCA9ICdkZC9NTS95eXl5IEhIOm1tJ1xuICAgIGlmKGxhbmcgPT09ICdlbicpXG4gICAgICBmb3JtYXQgPSAgJ01NL2RkL3l5eXkgaGg6bW0gYSc7XG5cbiAgICAgIGxldCBkYXkgPSB0aGlzLnRyYW5zZm9ybURhdGUoZGF0ZSwgZm9ybWF0KTtcbiAgICAgIHJldHVybiBkYXlbMF0udG9VcHBlckNhc2UoKSArIGRheS5zbGljZSgxKVxuICB9XG5cblxuICBwdWJsaWMgZm9ybWF0RGF0ZUxvbmdGb3JtYXQoZGF0ZT8pe1xuXG4gICAgaWYoZGF0ZSl7XG4gICAgICBsZXQgZGF5ID0gdGhpcy50cmFuc2Zvcm1EYXRlKGRhdGUsIHRoaXMuZ2V0TG9uZ0RhdGVGb3JtYXQoKSk7XG4gICAgICByZXR1cm4gZGF5WzBdLnRvVXBwZXJDYXNlKCkgKyBkYXkuc2xpY2UoMSk7XG4gICAgfVxuICAgIHJldHVybiBkYXRlO1xuXG4gIH1cblxuICBwdWJsaWMgeXl5eU1NZGRISG1tKGRhdGU/KXtcblxuICAgIGlmKGRhdGUpe1xuICAgICAgbGV0IGRheSA9IHRoaXMudHJhbnNmb3JtRGF0ZShkYXRlLCB0aGlzLnl5eXlNTWRkSEhtbUZvcm1hdCgpKTtcbiAgICAgIGNvbnNvbGUubG9nKFwic2VsZWN0ZWQgRGF5XCIsIGRheSk7XG4gICAgICByZXR1cm4gZGF5WzBdLnRvVXBwZXJDYXNlKCkgKyBkYXkuc2xpY2UoMSk7XG4gICAgfVxuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbiAgeXl5eU1NZGRISG1tRm9ybWF0KCl7XG4gICAgbGV0IGxhbmcgPSAgdGhpcy50cmFuc2xhdGUuY3VycmVudExhbmc7XG4gICAgbGV0IGZvcm1hdCA9ICd5eXl5LWRkLU1NIEhIOm1tJztcblxuICAgIGlmKGxhbmcgPT09ICdlbicgKVxuICAgICAgZm9ybWF0ID0gJ3l5eXktTU0tZGQgSEg6bW0gYSc7XG5cbiAgICByZXR1cm4gZm9ybWF0O1xuXG4gIH1cblxuXG4gIHB1YmxpYyBnZXRMb25nRGF0ZUZvcm1hdCgpe1xuICAgIGxldCBsYW5nID0gIHRoaXMudHJhbnNsYXRlLmN1cnJlbnRMYW5nO1xuICAgIGxldCBmb3JtYXQgPSAgJ0VFRUUsIGQgTU1NTSB5eXl5LCBISDptbSc7XG5cbiAgICBpZihsYW5nID09PSAnZW4nIClcbiAgICAgIGZvcm1hdCA9ICdNTU1NLCBkIHl5eXksIGhoOm1tIGEnO1xuXG4gICAgcmV0dXJuIGZvcm1hdDtcblxuICB9XG4gIHB1YmxpYyBnZXREYXRldGltZUNvbnRyb2xGb3JtYXQoKXtcbiAgICBsZXQgbGFuZyA9ICB0aGlzLnRyYW5zbGF0ZS5jdXJyZW50TGFuZztcbiAgICBsZXQgZm9ybWF0ID0gJ0QgTU1NIFlZWVkgSEg6bW0nXG5cbiAgICBpZihsYW5nID09PSAnZW4nIClcbiAgICAgIGZvcm1hdCA9ICdNTU0gRCBZWSBoaDptbSBhJztcblxuICAgICAgcmV0dXJuIGZvcm1hdDtcblxuICB9XG5cbiAgcHVibGljIGdldERheU1vbnRoRm9ybWF0KCl7XG4gICAgbGV0IGxhbmcgPSAgdGhpcy50cmFuc2xhdGUuY3VycmVudExhbmc7XG4gICAgbGV0IGZvcm1hdCA9ICdkIE1NTSc7XG5cbiAgICBpZihsYW5nID09PSAnZW4nIClcbiAgICAgIGZvcm1hdCA9ICdNTU0gZCc7XG5cbiAgICAgIHJldHVybiBmb3JtYXQ7XG5cbiAgfVxuXG4gIHB1YmxpYyBnZXREYXlEb3RNb250aEZvcm1hdCgpe1xuICAgIGxldCBsYW5nID0gIHRoaXMudHJhbnNsYXRlLmN1cnJlbnRMYW5nO1xuICAgIGxldCBmb3JtYXQgPSAnZC4gTU1NJztcblxuICAgIGlmKGxhbmcgPT09ICdlbicgKVxuICAgICAgZm9ybWF0ID0gJ01NTS4gZCc7XG5cbiAgICAgIHJldHVybiBmb3JtYXQ7XG5cbiAgfVxuXG4gIHB1YmxpYyBnZXRTZWxlY3RlZFdlZWsoZGF0ZTpzdHJpbmcpe1xuXG4gICAgbGV0IGxhbmcgPSAgdGhpcy50cmFuc2xhdGUuY3VycmVudExhbmc7XG4gICAgbGV0IGZvcm1hdCA9ICdFIGQgTU1NJ1xuXG4gICAgaWYobGFuZyA9PT0gJ2VuJyApXG4gICAgICBmb3JtYXQgPSAnTU1NIGQsIEUnO1xuXG4gICAgbGV0IGRheSA9IHRoaXMudHJhbnNmb3JtRGF0ZShkYXRlLCBmb3JtYXQpO1xuICAgIHJldHVybiBkYXlbMF0udG9VcHBlckNhc2UoKSArIGRheS5zbGljZSgxKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTZWxlY3RlZFdlZWtGdWxsRGF5KGRhdGU6c3RyaW5nKXtcblxuICAgIGxldCBsYW5nID0gIHRoaXMudHJhbnNsYXRlLmN1cnJlbnRMYW5nO1xuICAgIGxldCBmb3JtYXQgPSAnRUVFIGQgTU1NJ1xuXG4gICAgaWYobGFuZyA9PT0gJ2VuJyApXG4gICAgICBmb3JtYXQgPSAnTU1NIGQsIEVFRSc7XG5cbiAgICBsZXQgZGF5ID0gdGhpcy50cmFuc2Zvcm1EYXRlKGRhdGUsIGZvcm1hdCk7XG4gICAgcmV0dXJuIGRheVswXS50b1VwcGVyQ2FzZSgpICsgZGF5LnNsaWNlKDEpO1xuICB9XG5cbiAgcHVibGljIGZvcm1hdERhdGUoZGF0ZT8pe1xuICAgIGlmKGRhdGUpe1xuICAgICAgZGF0ZSA9IG5ldyBEYXRlKGRhdGUpXG5cbiAgICAgIGlmKHRoaXMuaXNUb2RheShkYXRlKSlcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKGRhdGUsICB0aGlzLmdldFRpbWVGb3JtYXQoKSlcbiAgICAgIGVsc2V7XG4gICAgICAgIGxldCBmb3JtYXQgPSB0aGlzLmdldERhdGVGb3JtYXQyKClcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtRGF0ZShkYXRlLCBmb3JtYXQpXG4gICAgICB9XG5cbiAgICB9XG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cblxuXG4gIGRkTU15eXl5KGRhdGUpe1xuICAgIGxldCBsYW5nID0gIHRoaXMudHJhbnNsYXRlLmN1cnJlbnRMYW5nO1xuICAgIGxldCBmb3JtYXQgPSAnZGQtTU0teXl5eSdcbiAgICBpZihsYW5nID09PSAnZW4nKVxuICAgICAgZm9ybWF0ID0gJ01NLWRkLXl5eXknO1xuXG4gICAgICBsZXQgZGF5ID0gdGhpcy50cmFuc2Zvcm1EYXRlKGRhdGUsIGZvcm1hdCk7XG4gICAgICByZXR1cm4gZGF5WzBdLnRvVXBwZXJDYXNlKCkgKyBkYXkuc2xpY2UoMSlcbiAgfVxuXG4gIGhpZ2hjaGFydHNEYXRlc0Zvcm5tYXQoKXtcblxuICBsZXQgbGFuZyA9ICB0aGlzLnRyYW5zbGF0ZS5jdXJyZW50TGFuZztcbiAgICBsZXQgZm9ybWF0ID0ge307XG4gIGlmKGxhbmcgPT0gJ2VuJyl7XG4gICAgICAvLyAlYjogU2hvcnQgbW9udGgsIGxpa2UgJ0phbicsJWUgRGF5IG9mIHRoZSBtb250aCwgMSB0aHJvdWdoIDMxXG4gICAgICBmb3JtYXQgPSB7XG4gICAgICAgIG1pbGxpc2Vjb25kOiAnJUg6JU06JVMuJUwnLFxuICAgICAgICBzZWNvbmQ6ICclbDolTTolUyAlUCcsXG4gICAgICAgIG1pbnV0ZTogJyVsOiVNICVwJyxcbiAgICAgICAgaG91cjogJyVsOiVNICVwJyxcbiAgICAgICAgZGF5OiAnJWIuICVlJyxcbiAgICAgICAgd2VlazogJyViLiAlZScsXG4gICAgICAgIG1vbnRoOiAnJWIgXFwnJXknLFxuICAgICAgICB5ZWFyOiAnJVknXG4gICAgICB9XG4gICAgfWVsc2V7XG4gICAgICBmb3JtYXQgPSB7XG4gICAgICAgIG1pbGxpc2Vjb25kOiAnJUg6JU06JVMuJUwnLFxuICAgICAgICBzZWNvbmQ6ICclSDolTTolUycsXG4gICAgICAgIG1pbnV0ZTogJyVIOiVNJyxcbiAgICAgICAgaG91cjogJyVIOiVNJyxcbiAgICAgICAgZGF5OiAnJWUuICViJyxcbiAgICAgICAgd2VlazogJyVlLiAlYicsXG4gICAgICAgIG1vbnRoOiAnJWIgXFwnJXknLFxuICAgICAgICB5ZWFyOiAnJVknXG4gICAgfVxuICAgIH1cbiAgIHJldHVybiBmb3JtYXQ7XG4gIH1cblxuICB5eXl5TU1kZEZvcm1hdChkYXRlKXtcbiAgICBjb25zb2xlLmxvZyhcIkRBVEUgZGF0ZTogXCIsIGRhdGUpO1xuICAgIGxldCBsYW5nID0gIHRoaXMudHJhbnNsYXRlLmN1cnJlbnRMYW5nO1xuICAgIGNvbnNvbGUubG9nKFwiREFURSBsYW5nOiBcIiwgbGFuZyk7XG4gICAgbGV0IGZvcm1hdCA9ICd5eXl5LU1NLWRkJztcblxuICAgIGlmKGxhbmcgPT0gJ2VuJylcbiAgICAgIGZvcm1hdCA9ICd5eXl5LWRkLU1NJztcblxuICAgIGNvbnNvbGUubG9nKFwiREFURSBmb3JtYXQ6IFwiLCBmb3JtYXQpO1xuXG4gICAgbGV0IGRheSA9IHRoaXMudHJhbnNmb3JtRGF0ZShkYXRlLCBmb3JtYXQpO1xuXG4gICAgY29uc29sZS5sb2coXCJEQVRFIGRheTogXCIsIGRheSk7XG5cbiAgICByZXR1cm4gZGF5WzBdLnRvVXBwZXJDYXNlKCkgKyBkYXkuc2xpY2UoMSlcbiAgfVxuXG4gIHB1YmxpYyB5eXl5TU1kZFRISG1tc3NTU1NaRm9ybWF0KGRhdGU/KXtcbiAgICBjb25zdCBmZWNoYUZvcm1hdGVhZGEgPXRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKGRhdGUsICd5eXl5LU1NLWRkVEhIOm1tOnNzLlNTU1xcJ1pcXCcnKTtcbiAgICByZXR1cm4gZmVjaGFGb3JtYXRlYWRhO1xuICB9XG4gIGNvbnZlcnQxMnRvMjRmb3JtYXQodGltZSl7XG5cbiAgICBjb25zb2xlLmxvZyhcIlRJTUUgMTJ0bzI0OiBcIix0aW1lKTtcbiAgICB2YXIgaG91cnMgPSBOdW1iZXIodGltZS5tYXRjaCgvXihcXGQrKS8pWzFdKTtcbiAgICB2YXIgbWludXRlcyA9IE51bWJlcih0aW1lLm1hdGNoKC86KFxcZCspLylbMV0pO1xuICAgIHZhciBBTVBNID0gdGltZS5tYXRjaCgvXFxzKC4qKSQvKVsxXTtcbiAgICBpZihBTVBNID09IFwiUE1cIiAmJiBob3VyczwxMikgaG91cnMgPSBob3VycysxMjtcbiAgICBpZihBTVBNID09IFwiQU1cIiAmJiBob3Vycz09MTIpIGhvdXJzID0gaG91cnMtMTI7XG4gICAgdmFyIHNIb3VycyA9IGhvdXJzLnRvU3RyaW5nKCk7XG4gICAgdmFyIHNNaW51dGVzID0gbWludXRlcy50b1N0cmluZygpO1xuICAgIGlmKGhvdXJzPDEwKSBzSG91cnMgPSBcIjBcIiArIHNIb3VycztcbiAgICBpZihtaW51dGVzPDEwKSBzTWludXRlcyA9IFwiMFwiICsgc01pbnV0ZXM7XG5cbiAgICBsZXQgaCA9IHNIb3VycyArIFwiOlwiICsgc01pbnV0ZXM7XG5cbiAgICBjb25zb2xlLmxvZyhcIkhPVVJTOiBcIixoKTtcbiAgICByZXR1cm4gaDtcbiAgfVxuXG4gIGZvcm1hdDI0aCh0aW1lKSB7XG5cbiAgICBsZXQgbGFuZyA9ICB0aGlzLnRyYW5zbGF0ZS5jdXJyZW50TGFuZztcbiAgICBpZihsYW5nID09PSAnZW4nKXtcbiAgICAgIC8vIENoZWNrIGNvcnJlY3QgdGltZSBmb3JtYXQgYW5kIHNwbGl0IGludG8gY29tcG9uZW50c1xuICAgIHRpbWUgPSB0aW1lLnRvU3RyaW5nICgpLm1hdGNoICgvXihbMDFdXFxkfDJbMC0zXSkoOikoWzAtNV1cXGQpKDpbMC01XVxcZCk/JC8pIHx8IFt0aW1lXTtcblxuICAgIGlmICh0aW1lLmxlbmd0aCA+IDEpIHsgLy8gSWYgdGltZSBmb3JtYXQgY29ycmVjdFxuICAgICAgdGltZSA9IHRpbWUuc2xpY2UgKDEpOyAgLy8gUmVtb3ZlIGZ1bGwgc3RyaW5nIG1hdGNoIHZhbHVlXG4gICAgICB0aW1lWzVdID0gK3RpbWVbMF0gPCAxMiA/ICcgQU0nIDogJyBQTSc7IC8vIFNldCBBTS9QTVxuICAgICAgdGltZVswXSA9ICt0aW1lWzBdICUgMTIgfHwgMTI7IC8vIEFkanVzdCBob3Vyc1xuICAgIH1cbiAgICByZXR1cm4gdGltZS5qb2luICgnJyk7IC8vIHJldHVybiBhZGp1c3RlZCB0aW1lIG9yIG9yaWdpbmFsIHN0cmluZ1xuICAgIH1cbiAgICByZXR1cm4gdGltZTtcblxuICB9XG5cbiAgaXNBbWVyaWNhbkZvcm1hdCgpe1xuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZS5jdXJyZW50TGFuZyA9PT0gJ2VuJztcbiAgfVxuXG4gIGdldFRpbWVGb3JtYXQoKXtcbiAgICBsZXQgbGFuZyA9ICB0aGlzLnRyYW5zbGF0ZS5jdXJyZW50TGFuZztcbiAgICBsZXQgZm9ybWF0ID0gICdISDptbSdcblxuICAgIGlmKGxhbmcgPT09ICdlbicgKVxuICAgICAgZm9ybWF0ID0gICdoaDptbSBhJztcblxuICAgIHJldHVybiBmb3JtYXQ7XG4gIH1cblxuICBpc1RvZGF5KG1EYXRlOiBEYXRlKXtcbiAgICBsZXQgZGF0ZSA9IG5ldyBEYXRlKClcbiAgICBpZihkYXRlLmdldERhdGUoKSA9PT0gbURhdGUuZ2V0RGF0ZSgpICYmIGRhdGUuZ2V0TW9udGgoKSA9PT0gbURhdGUuZ2V0TW9udGgoKSAmJiBkYXRlLmdldEZ1bGxZZWFyKCkgPT09IG1EYXRlLmdldEZ1bGxZZWFyKCkpXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgdHJhbnNmb3JtRGF0ZShkYXRlLCBmb3JtYXQpIHtcbiAgICBjb25zdCBkYXRlUGlwZTogRGF0ZVBpcGUgPSBuZXcgRGF0ZVBpcGUodGhpcy5nZXRMb2NhbGUoKSk7XG4gICAgcmV0dXJuIGRhdGVQaXBlLnRyYW5zZm9ybShkYXRlLCBmb3JtYXQpO1xuICB9XG5cbiAgZ2V0Q2FsZW5kYXJEYXkoZXBvY2g6IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKCFlcG9jaCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGxldCB0aW1lU3RyaW5nID0gJ2g6bW0gQSc7XG4gICAgY29uc3QgdG9kYXkgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdhZ2VuZGEudG9kYXknKTtcbiAgICBjb25zdCB5ZXN0ZXJkYXkgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdhZ2VuZGEueWVzdGVyZGF5Jyk7XG4gICAgcmV0dXJuIG1vbWVudChlcG9jaCkuY2FsZW5kYXIobnVsbCwge1xuICAgICAgc2FtZURheTogYFske3RvZGF5fV0gYCArIHRpbWVTdHJpbmcsXG4gICAgICBsYXN0RGF5OiBgWyR7eWVzdGVyZGF5fV0gYCArIHRpbWVTdHJpbmcsXG4gICAgICBsYXN0V2VlayA6ICdERC9NTS9ZWSAnICsgdGltZVN0cmluZyxcbiAgICAgIHNhbWVFbHNlOiAnREQvTU0vWVkgJyArIHRpbWVTdHJpbmcsXG4gICAgICBuZXh0RGF5IDogJ0REL01NL1lZICcgKyB0aW1lU3RyaW5nLFxuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q2FsZW5kYXJEYXkyKGVwb2NoOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmICghZXBvY2gpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBsZXQgdGltZVN0cmluZyA9IHRoaXMuZ2V0VGltZUZvcm1hdCgpO1xuICAgIGxldCBkYXRlU3RyaW5nID0gdGhpcy5nZXRTaG9ydERhdGVGb3JtYXQoKTtcbiAgICBjb25zdCB0b2RheSA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2FnZW5kYS50b2RheScpO1xuICAgIGNvbnN0IHllc3RlcmRheSA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2FnZW5kYS55ZXN0ZXJkYXknKTtcbiAgICByZXR1cm4gbW9tZW50KGVwb2NoKS5jYWxlbmRhcihudWxsLCB7XG4gICAgICBzYW1lRGF5OiBgWyR7dG9kYXl9XSAgYCAgKyB0aW1lU3RyaW5nLFxuICAgICAgbGFzdERheTogYFske3llc3RlcmRheX1dICBgICsgdGltZVN0cmluZyxcbiAgICAgIHNhbWVFbHNlOiBkYXRlU3RyaW5nICsgJyAnICsgdGltZVN0cmluZyxcbiAgICAgIGxhc3RXZWVrIDogZGF0ZVN0cmluZyArICcgJyArIHRpbWVTdHJpbmcsXG4gICAgICBuZXh0RGF5IDogZGF0ZVN0cmluZyArICcgJyArIHRpbWVTdHJpbmdcbiAgICB9KTtcbiAgfVxuXG5cbiAgZ2V0Q2FsZW5kYXJEYXlUaW1lKGVwb2NoOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmICghZXBvY2gpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBsZXQgdGltZVN0cmluZyA9IHRoaXMuZ2V0VGltZUZvcm1hdCgpO1xuICAgIGxldCBkYXRlU3RyaW5nID0gdGhpcy5nZXRMb25nRm9ybWF0KCk7XG4gICAgbGV0IGxhbmcgPSAgdGhpcy50cmFuc2xhdGUuY3VycmVudExhbmc7XG4gICAgY29uc3QgdG9kYXkgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdhZ2VuZGEudG9kYXknKTtcbiAgICBjb25zdCB5ZXN0ZXJkYXkgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdhZ2VuZGEueWVzdGVyZGF5Jyk7XG4gICAgY29uc3QgdG8gPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdhZ2VuZGEudG8nKTtcblxuICAgIGNvbnN0ICBtID0gbW9tZW50XG4gICAgbS5sb2NhbGUobGFuZylcbiAgICByZXR1cm4gbShlcG9jaCkuY2FsZW5kYXIobnVsbCwge1xuICAgICAgc2FtZURheTogYFske3RvZGF5fV0gIGAgICsgYFske3RvfV0gIGAgKyB0aW1lU3RyaW5nLFxuICAgICAgbGFzdERheTogYFske3llc3RlcmRheX1dICBgICsgYFske3RvfV0gIGAgKyB0aW1lU3RyaW5nLFxuICAgICAgc2FtZUVsc2U6IGRhdGVTdHJpbmcgKyAnICcgKyBgWyR7dG99XSAgYCArIHRpbWVTdHJpbmcsXG4gICAgICBsYXN0V2VlazogZGF0ZVN0cmluZyArICcgJyArIGBbJHt0b31dICBgICsgdGltZVN0cmluZyxcbiAgICAgIG5leHREYXkgOiBkYXRlU3RyaW5nICsgJyAnICsgYFske3RvfV0gIGAgKyB0aW1lU3RyaW5nXG4gICAgfSlcbiAgfVxuXG4gIC8vIHJldHVybiBlcG9jaCBzdHJpbmcgYXMgc3BlY2lmaWVkIGZvcm1hdFxuICBmb3JtYXRFcG9jaChlcG9jaCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q2FsZW5kYXJEYXkoZXBvY2gpO1xuICB9XG5cbiAgZ2V0VG9kYXkoKXtcbiAgICBjb25zdCB0em9mZnNldCA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lem9uZU9mZnNldCgpICogNjAwMDA7IC8vIG9mZnNldCBpbiBtaWxsaXNlY29uZHNcbiAgICBjb25zdCBsb2NhbElTT1RpbWUgPSAobmV3IERhdGUoRGF0ZS5ub3coKSAtIHR6b2Zmc2V0KSkudG9JU09TdHJpbmcoKS5zbGljZSgwLCAtMSk7XG4gICAgbGV0IGRhdGUgPSBsb2NhbElTT1RpbWUvLyB0aGlzLmRhdGVTZXJ2aWNlLnNlbGVjdGVkRGF0ZUZvcm1hdChsb2NhbElTT1RpbWUpO1xuICAgIHJldHVybiBkYXRlXG4gIH1cblxuICBnZXRDdXJyZW50VGltZSgpe1xuICAgIGNvbnN0IHR6b2Zmc2V0ID0gKG5ldyBEYXRlKCkpLmdldFRpbWV6b25lT2Zmc2V0KCkgKiA2MDAwMDsgLy8gb2Zmc2V0IGluIG1pbGxpc2Vjb25kc1xuICAgIGNvbnN0IGxvY2FsSVNPVGltZSA9IChuZXcgRGF0ZShEYXRlLm5vdygpIC0gdHpvZmZzZXQpKS50b0lTT1N0cmluZygpLnNsaWNlKDAsIC0xKTtcbiAgICBsZXQgZGF0ZSA9IGxvY2FsSVNPVGltZS8vIHRoaXMuZGF0ZVNlcnZpY2Uuc2VsZWN0ZWREYXRlRm9ybWF0KGxvY2FsSVNPVGltZSk7XG4gICAgcmV0dXJuIG5ldyBEYXRlKERhdGUubm93KCkgLSB0em9mZnNldCkuZ2V0VGltZSgpLnRvTG9jYWxlU3RyaW5nKCk7XG4gIH1cblxuXG59XG4iXX0=
|