raise-common-lib 0.0.248 → 0.0.249

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.
Files changed (62) hide show
  1. package/README.md +57 -57
  2. package/bundles/raise-common-lib.umd.js +1937 -12
  3. package/bundles/raise-common-lib.umd.js.map +1 -1
  4. package/bundles/raise-common-lib.umd.min.js +1 -1
  5. package/bundles/raise-common-lib.umd.min.js.map +1 -1
  6. package/esm2015/lib/common-grid/index.component.js +210 -8
  7. package/esm2015/lib/date-tree-filter/date-tree-filter-popover/index.component.js +761 -0
  8. package/esm2015/lib/date-tree-filter/date-tree-filter.helper.js +679 -0
  9. package/esm2015/lib/raise-common-lib.module.js +4 -1
  10. package/esm2015/public-api.js +3 -1
  11. package/esm2015/raise-common-lib.js +2 -2
  12. package/esm5/lib/common-grid/index.component.js +244 -8
  13. package/esm5/lib/date-tree-filter/date-tree-filter-popover/index.component.js +902 -0
  14. package/esm5/lib/date-tree-filter/date-tree-filter.helper.js +787 -0
  15. package/esm5/lib/raise-common-lib.module.js +4 -1
  16. package/esm5/public-api.js +3 -1
  17. package/esm5/raise-common-lib.js +2 -2
  18. package/fesm2015/raise-common-lib.js +1649 -9
  19. package/fesm2015/raise-common-lib.js.map +1 -1
  20. package/fesm5/raise-common-lib.js +1931 -10
  21. package/fesm5/raise-common-lib.js.map +1 -1
  22. package/lib/common-grid/index.component.d.ts +30 -1
  23. package/lib/date-tree-filter/date-tree-filter-popover/index.component.d.ts +46 -0
  24. package/lib/date-tree-filter/date-tree-filter.helper.d.ts +54 -0
  25. package/package.json +1 -1
  26. package/public-api.d.ts +2 -0
  27. package/raise-common-lib.metadata.json +1 -1
  28. package/src/assets/img/arrow_right.svg +4 -4
  29. package/src/assets/img/calendar-disabled.svg +6 -6
  30. package/src/assets/img/calendar.svg +6 -6
  31. package/src/assets/img/calendar_arrow_left.svg +3 -3
  32. package/src/assets/img/calendar_arrow_right.svg +3 -3
  33. package/src/assets/img/checked-vector.svg +3 -3
  34. package/src/assets/img/dialog-close.svg +4 -4
  35. package/src/assets/img/dialog-grow.svg +6 -6
  36. package/src/assets/img/dialog-shrink.svg +6 -6
  37. package/src/assets/img/plus.svg +4 -4
  38. package/src/assets/img/raise_logo_main_new.svg +27 -27
  39. package/src/assets/img/search.svg +4 -4
  40. package/src/assets/img/shrink-icon.svg +6 -6
  41. package/src/assets/img/time-disabled.svg +4 -4
  42. package/src/assets/img/time.svg +4 -4
  43. package/src/assets/img/toolbar-action-addFolder.svg +17 -17
  44. package/src/assets/img/toolbar-action-calculator.svg +11 -11
  45. package/src/assets/img/toolbar-action-collapse.svg +7 -7
  46. package/src/assets/img/toolbar-action-combine.svg +4 -4
  47. package/src/assets/img/toolbar-action-edit.svg +4 -4
  48. package/src/assets/img/toolbar-action-expand.svg +7 -7
  49. package/src/assets/img/toolbar-action-folderMove.svg +8 -8
  50. package/src/assets/img/toolbar-action-lock.svg +6 -6
  51. package/src/assets/img/toolbar-action-preview.svg +7 -7
  52. package/src/assets/img/toolbar-action-publish.svg +5 -5
  53. package/src/assets/img/toolbar-action-reminders.svg +10 -10
  54. package/src/assets/img/toolbar-action-rename.svg +7 -7
  55. package/src/assets/img/toolbar-action-saveSequence.svg +5 -5
  56. package/src/assets/img/toolbar-action-send-file.svg +5 -5
  57. package/src/assets/img/toolbar-action-settle.svg +7 -7
  58. package/src/assets/img/toolbar-action-share.svg +5 -5
  59. package/src/assets/img/toolbar-action-submitForApproval.svg +4 -4
  60. package/src/assets/img/toolbar-action-sync.svg +4 -4
  61. package/src/assets/img/toolbar-action-template.svg +6 -6
  62. package/src/assets/img/toolbar-action-workflow.svg +9 -9
@@ -0,0 +1,679 @@
1
+ /**
2
+ * @fileoverview added by tsickle
3
+ * Generated from: lib/date-tree-filter/date-tree-filter.helper.ts
4
+ * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
5
+ */
6
+ import moment from "moment";
7
+ /**
8
+ * @record
9
+ */
10
+ export function DateTreeFilterSetupOptions() { }
11
+ if (false) {
12
+ /** @type {?} */
13
+ DateTreeFilterSetupOptions.prototype.rows;
14
+ /** @type {?} */
15
+ DateTreeFilterSetupOptions.prototype.fields;
16
+ /** @type {?} */
17
+ DateTreeFilterSetupOptions.prototype.hints;
18
+ }
19
+ /**
20
+ * @record
21
+ */
22
+ export function DateTreeFilterHelperOptions() { }
23
+ if (false) {
24
+ /** @type {?} */
25
+ DateTreeFilterHelperOptions.prototype.getTranslation;
26
+ /** @type {?} */
27
+ DateTreeFilterHelperOptions.prototype.getPopoverElement;
28
+ /** @type {?} */
29
+ DateTreeFilterHelperOptions.prototype.getGridElement;
30
+ /** @type {?} */
31
+ DateTreeFilterHelperOptions.prototype.applyRows;
32
+ /** @type {?|undefined} */
33
+ DateTreeFilterHelperOptions.prototype.parseDateValue;
34
+ /** @type {?|undefined} */
35
+ DateTreeFilterHelperOptions.prototype.dateFormats;
36
+ }
37
+ /**
38
+ * @record
39
+ */
40
+ export function RsCommonGridDateTreeFactoryHost() { }
41
+ if (false) {
42
+ /** @type {?} */
43
+ RsCommonGridDateTreeFactoryHost.prototype.translation;
44
+ /** @type {?} */
45
+ RsCommonGridDateTreeFactoryHost.prototype.dateTreePopoverRef;
46
+ /** @type {?} */
47
+ RsCommonGridDateTreeFactoryHost.prototype.grid;
48
+ }
49
+ /** @type {?} */
50
+ export const DATE_TREE_DEFAULT_DATE_FORMATS = [
51
+ "YYYY-MM-DD",
52
+ "MM/DD/YYYY",
53
+ "DD/MM/YYYY",
54
+ "YYYY/MM/DD",
55
+ "DD-MMM-YYYY",
56
+ "MMM DD, YYYY",
57
+ ];
58
+ export class DateTreeFilterHelper {
59
+ /**
60
+ * @param {?} options
61
+ */
62
+ constructor(options) {
63
+ this.popoverVisible = false;
64
+ this.popoverField = "";
65
+ this.popoverStyle = {};
66
+ this.selectedByField = {};
67
+ this.fieldLabelMap = {};
68
+ this.dateFields = [];
69
+ this.sourceRows = [];
70
+ this.defaultDateFormats = [
71
+ "YYYY-MM-DD",
72
+ "MM/DD/YYYY",
73
+ "DD/MM/YYYY",
74
+ "YYYY/MM/DD",
75
+ "DD-MMM-YYYY",
76
+ "DD-MMM-YYYY hh:mm A",
77
+ "MMM DD, YYYY",
78
+ moment.ISO_8601,
79
+ ];
80
+ this.options = options;
81
+ }
82
+ /**
83
+ * @param {?} config
84
+ * @return {?}
85
+ */
86
+ setup(config) {
87
+ /** @type {?} */
88
+ var rows = config && config.rows ? config.rows : [];
89
+ /** @type {?} */
90
+ var fields = config && config.fields ? config.fields : [];
91
+ /** @type {?} */
92
+ var hints = config && config.hints ? config.hints : [];
93
+ this.sourceRows = rows;
94
+ this.dateFields = this.resolveDateTreeFieldsByHints(fields, hints);
95
+ this.fieldLabelMap = {};
96
+ (fields || []).forEach((/**
97
+ * @param {?} item
98
+ * @return {?}
99
+ */
100
+ (item) => {
101
+ if (!item || !item.columnName) {
102
+ return;
103
+ }
104
+ this.fieldLabelMap[item.columnName] =
105
+ item.columnDisplayName || item.columnName;
106
+ }));
107
+ this.apply();
108
+ }
109
+ /**
110
+ * @param {?} args
111
+ * @return {?}
112
+ */
113
+ handleGridActionBegin(args) {
114
+ /** @type {?} */
115
+ var requestType = this.getRequestType(args);
116
+ if (requestType === "filterchoicerequest" ||
117
+ requestType === "filtersearchbegin") {
118
+ args.filterChoiceCount = 15000;
119
+ }
120
+ if (requestType !== "filterbeforeopen") {
121
+ return;
122
+ }
123
+ /** @type {?} */
124
+ var columnName = this.resolveActionColumnName(args);
125
+ if (!this.isDateTreeField(columnName)) {
126
+ this.close();
127
+ return;
128
+ }
129
+ args.cancel = true;
130
+ this.open(columnName);
131
+ }
132
+ /**
133
+ * @param {?} selectionMap
134
+ * @return {?}
135
+ */
136
+ updateSelection(selectionMap) {
137
+ this.selectedByField = selectionMap || {};
138
+ this.apply();
139
+ }
140
+ /**
141
+ * @return {?}
142
+ */
143
+ close() {
144
+ if (!this.popoverVisible) {
145
+ return;
146
+ }
147
+ this.popoverVisible = false;
148
+ this.popoverField = "";
149
+ this.popoverStyle = {};
150
+ }
151
+ /**
152
+ * @param {?} event
153
+ * @return {?}
154
+ */
155
+ handleDocumentMouseDown(event) {
156
+ if (!this.popoverVisible) {
157
+ return;
158
+ }
159
+ /** @type {?} */
160
+ var target = (/** @type {?} */ (event.target));
161
+ if (!target) {
162
+ return;
163
+ }
164
+ if (this.isInsidePopover(target) || this.isDateFilterMenuItem(target)) {
165
+ return;
166
+ }
167
+ this.close();
168
+ }
169
+ /**
170
+ * @param {?} event
171
+ * @return {?}
172
+ */
173
+ handleDocumentMouseOver(event) {
174
+ if (!this.popoverVisible) {
175
+ return;
176
+ }
177
+ /** @type {?} */
178
+ var target = (/** @type {?} */ (event.target));
179
+ if (!target) {
180
+ return;
181
+ }
182
+ if (this.isInsidePopover(target)) {
183
+ return;
184
+ }
185
+ /** @type {?} */
186
+ var menuItem = (/** @type {?} */ (target.closest(".e-menu-item")));
187
+ if (menuItem) {
188
+ if (!this.isDateFilterMenuItem(menuItem)) {
189
+ this.close();
190
+ }
191
+ return;
192
+ }
193
+ /** @type {?} */
194
+ var otherFilterTarget = (/** @type {?} */ (target.closest(".e-filtermenudiv, .e-headercell .e-columnmenu, .e-columnmenu, .e-contextmenu")));
195
+ if (otherFilterTarget && !this.isDateFilterMenuItem(otherFilterTarget)) {
196
+ this.close();
197
+ }
198
+ }
199
+ /**
200
+ * @return {?}
201
+ */
202
+ updatePosition() {
203
+ if (!this.popoverVisible) {
204
+ return;
205
+ }
206
+ /** @type {?} */
207
+ var anchor = this.findDateFilterAnchorElement();
208
+ if (anchor) {
209
+ /** @type {?} */
210
+ var rect = anchor.getBoundingClientRect();
211
+ /** @type {?} */
212
+ var viewportWidth = window.innerWidth || document.documentElement.clientWidth;
213
+ /** @type {?} */
214
+ var viewportHeight = window.innerHeight || document.documentElement.clientHeight;
215
+ /** @type {?} */
216
+ var popoverElement = this.options.getPopoverElement
217
+ ? this.options.getPopoverElement()
218
+ : null;
219
+ /** @type {?} */
220
+ var popoverWidth = popoverElement && popoverElement.offsetWidth
221
+ ? popoverElement.offsetWidth
222
+ : 300;
223
+ /** @type {?} */
224
+ var popoverHeight = popoverElement && popoverElement.offsetHeight
225
+ ? popoverElement.offsetHeight
226
+ : 420;
227
+ /** @type {?} */
228
+ var edgeGap = 8;
229
+ /** @type {?} */
230
+ var anchorGap = 8;
231
+ /** @type {?} */
232
+ var top = rect.top - 6;
233
+ /** @type {?} */
234
+ var left = rect.right + anchorGap;
235
+ if (left + popoverWidth > viewportWidth - edgeGap) {
236
+ left = rect.left - popoverWidth - anchorGap;
237
+ }
238
+ if (left < edgeGap) {
239
+ left = edgeGap;
240
+ }
241
+ if (left + popoverWidth > viewportWidth - edgeGap) {
242
+ left = Math.max(edgeGap, viewportWidth - popoverWidth - edgeGap);
243
+ }
244
+ if (top + popoverHeight > viewportHeight - edgeGap) {
245
+ top = Math.max(edgeGap, viewportHeight - popoverHeight - edgeGap);
246
+ }
247
+ this.popoverStyle = {
248
+ position: "fixed",
249
+ left: left + "px",
250
+ top: top + "px",
251
+ };
252
+ return;
253
+ }
254
+ /** @type {?} */
255
+ var gridElement = this.options.getGridElement
256
+ ? this.options.getGridElement()
257
+ : null;
258
+ if (gridElement && gridElement.getBoundingClientRect) {
259
+ /** @type {?} */
260
+ var fallbackRect = gridElement.getBoundingClientRect();
261
+ this.popoverStyle = {
262
+ position: "fixed",
263
+ left: Math.max(8, fallbackRect.right - 312) + "px",
264
+ top: Math.max(8, fallbackRect.top + 8) + "px",
265
+ };
266
+ }
267
+ }
268
+ /**
269
+ * @private
270
+ * @param {?} field
271
+ * @return {?}
272
+ */
273
+ open(field) {
274
+ this.popoverField = field;
275
+ this.popoverVisible = true;
276
+ this.updatePosition();
277
+ setTimeout((/**
278
+ * @return {?}
279
+ */
280
+ () => this.updatePosition()), 50);
281
+ setTimeout((/**
282
+ * @return {?}
283
+ */
284
+ () => this.updatePosition()), 150);
285
+ }
286
+ /**
287
+ * @private
288
+ * @return {?}
289
+ */
290
+ apply() {
291
+ /** @type {?} */
292
+ var filteredRows = this.filterRowsBySelectedDateTree(this.sourceRows || []);
293
+ this.options.applyRows(filteredRows);
294
+ }
295
+ /**
296
+ * @private
297
+ * @param {?} args
298
+ * @return {?}
299
+ */
300
+ getRequestType(args) {
301
+ if (!args || !args.requestType) {
302
+ return "";
303
+ }
304
+ return String(args.requestType).trim().toLowerCase();
305
+ }
306
+ /**
307
+ * @private
308
+ * @param {?} args
309
+ * @return {?}
310
+ */
311
+ resolveActionColumnName(args) {
312
+ if (!args) {
313
+ return "";
314
+ }
315
+ return (args.columnName ||
316
+ args.field ||
317
+ args.currentFilteringColumn ||
318
+ (args.column && (args.column.field || args.column.columnName)) ||
319
+ "");
320
+ }
321
+ /**
322
+ * @private
323
+ * @param {?} fields
324
+ * @param {?} hints
325
+ * @return {?}
326
+ */
327
+ resolveDateTreeFieldsByHints(fields, hints) {
328
+ /** @type {?} */
329
+ var normalizedHints = (hints || [])
330
+ .filter((/**
331
+ * @param {?} item
332
+ * @return {?}
333
+ */
334
+ (item) => !!item))
335
+ .map((/**
336
+ * @param {?} item
337
+ * @return {?}
338
+ */
339
+ (item) => String(item).trim().toLowerCase()));
340
+ if (!fields || !fields.length || !normalizedHints.length) {
341
+ return [];
342
+ }
343
+ return fields
344
+ .filter((/**
345
+ * @param {?} item
346
+ * @return {?}
347
+ */
348
+ (item) => {
349
+ if (!item || !item.columnName) {
350
+ return false;
351
+ }
352
+ /** @type {?} */
353
+ var columnName = String(item.columnName || "").toLowerCase();
354
+ /** @type {?} */
355
+ var displayName = String(item.columnDisplayName || "").toLowerCase();
356
+ return normalizedHints.some((/**
357
+ * @param {?} hint
358
+ * @return {?}
359
+ */
360
+ (hint) => {
361
+ return (columnName === hint ||
362
+ displayName === hint ||
363
+ (hint.length >= 3 &&
364
+ (columnName.indexOf(hint) > -1 ||
365
+ displayName.indexOf(hint) > -1)));
366
+ }));
367
+ }))
368
+ .map((/**
369
+ * @param {?} item
370
+ * @return {?}
371
+ */
372
+ (item) => item.columnName));
373
+ }
374
+ /**
375
+ * @private
376
+ * @param {?} field
377
+ * @return {?}
378
+ */
379
+ isDateTreeField(field) {
380
+ return this.dateFields.indexOf(field) > -1;
381
+ }
382
+ /**
383
+ * @private
384
+ * @param {?} field
385
+ * @return {?}
386
+ */
387
+ getFieldDaySelectionMap(field) {
388
+ if (!this.selectedByField[field]) {
389
+ this.selectedByField[field] = {};
390
+ }
391
+ return this.selectedByField[field];
392
+ }
393
+ /**
394
+ * @private
395
+ * @param {?} rows
396
+ * @param {?=} excludeField
397
+ * @return {?}
398
+ */
399
+ filterRowsBySelectedDateTree(rows, excludeField) {
400
+ /** @type {?} */
401
+ var filteredRows = rows ? rows.slice() : [];
402
+ this.dateFields.forEach((/**
403
+ * @param {?} field
404
+ * @return {?}
405
+ */
406
+ (field) => {
407
+ if (excludeField && field === excludeField) {
408
+ return;
409
+ }
410
+ /** @type {?} */
411
+ var selectedMap = this.getFieldDaySelectionMap(field);
412
+ /** @type {?} */
413
+ var selectedKeys = Object.keys(selectedMap);
414
+ if (!selectedKeys.length) {
415
+ return;
416
+ }
417
+ filteredRows = filteredRows.filter((/**
418
+ * @param {?} row
419
+ * @return {?}
420
+ */
421
+ (row) => {
422
+ /** @type {?} */
423
+ var dayKey = this.getDayKeyByRowValue(row[field]);
424
+ return dayKey ? !!selectedMap[dayKey] : false;
425
+ }));
426
+ }));
427
+ return filteredRows;
428
+ }
429
+ /**
430
+ * @private
431
+ * @param {?} value
432
+ * @return {?}
433
+ */
434
+ getDayKeyByRowValue(value) {
435
+ /** @type {?} */
436
+ var date = this.parseDateValue(value);
437
+ if (!date) {
438
+ return "";
439
+ }
440
+ return this.toDayKey(date.getFullYear(), date.getMonth() + 1, date.getDate());
441
+ }
442
+ /**
443
+ * @private
444
+ * @param {?} value
445
+ * @return {?}
446
+ */
447
+ parseDateValue(value) {
448
+ if (this.options.parseDateValue) {
449
+ return this.options.parseDateValue(value);
450
+ }
451
+ if (!value) {
452
+ return null;
453
+ }
454
+ if (value instanceof Date) {
455
+ return value;
456
+ }
457
+ /** @type {?} */
458
+ var formats = this.options && this.options.dateFormats && this.options.dateFormats.length
459
+ ? this.options.dateFormats
460
+ : this.defaultDateFormats;
461
+ /** @type {?} */
462
+ var parsed = moment(value, formats, true);
463
+ if (parsed.isValid()) {
464
+ return parsed.toDate();
465
+ }
466
+ /** @type {?} */
467
+ var fallback = new Date(value);
468
+ return isNaN(fallback.getTime()) ? null : fallback;
469
+ }
470
+ /**
471
+ * @private
472
+ * @param {?} year
473
+ * @param {?} month
474
+ * @param {?} day
475
+ * @return {?}
476
+ */
477
+ toDayKey(year, month, day) {
478
+ return year + "-" + this.pad2(month) + "-" + this.pad2(day);
479
+ }
480
+ /**
481
+ * @private
482
+ * @param {?} value
483
+ * @return {?}
484
+ */
485
+ pad2(value) {
486
+ return value < 10 ? "0" + value : String(value);
487
+ }
488
+ /**
489
+ * @private
490
+ * @param {?} target
491
+ * @return {?}
492
+ */
493
+ isInsidePopover(target) {
494
+ /** @type {?} */
495
+ var popoverElement = this.options.getPopoverElement
496
+ ? this.options.getPopoverElement()
497
+ : null;
498
+ if (!target || !popoverElement) {
499
+ return false;
500
+ }
501
+ return popoverElement.contains(target);
502
+ }
503
+ /**
504
+ * @private
505
+ * @param {?} element
506
+ * @return {?}
507
+ */
508
+ isDateFilterMenuItem(element) {
509
+ if (!element) {
510
+ return false;
511
+ }
512
+ /** @type {?} */
513
+ var menuItem = (/** @type {?} */ (element.closest(".e-menu-item")));
514
+ if (!menuItem) {
515
+ return false;
516
+ }
517
+ /** @type {?} */
518
+ var text = (menuItem.textContent || "").trim().toLowerCase();
519
+ /** @type {?} */
520
+ var translation = this.options.getTranslation
521
+ ? this.options.getTranslation()
522
+ : null;
523
+ /** @type {?} */
524
+ var filterText = String((translation && translation.FILTER) || "filter")
525
+ .trim()
526
+ .toLowerCase();
527
+ if (!text) {
528
+ return false;
529
+ }
530
+ if (text.indexOf(filterText) > -1 || text.indexOf("filter") > -1) {
531
+ return true;
532
+ }
533
+ /** @type {?} */
534
+ var cls = (menuItem.className || "").toLowerCase();
535
+ return cls.indexOf("filter") > -1;
536
+ }
537
+ /**
538
+ * @private
539
+ * @return {?}
540
+ */
541
+ findDateFilterAnchorElement() {
542
+ /** @type {?} */
543
+ var menuContainers = (/** @type {?} */ (Array.from(document.querySelectorAll(".e-columnmenu, .e-contextmenu"))));
544
+ /** @type {?} */
545
+ var visibleContainers = menuContainers.filter((/**
546
+ * @param {?} container
547
+ * @return {?}
548
+ */
549
+ (container) => {
550
+ if (!container || !container.getBoundingClientRect) {
551
+ return false;
552
+ }
553
+ /** @type {?} */
554
+ var rect = container.getBoundingClientRect();
555
+ if (rect.width <= 0 || rect.height <= 0) {
556
+ return false;
557
+ }
558
+ /** @type {?} */
559
+ var style = window.getComputedStyle(container);
560
+ if (!style || style.display === "none" || style.visibility === "hidden") {
561
+ return false;
562
+ }
563
+ return true;
564
+ }));
565
+ if (!visibleContainers.length) {
566
+ return null;
567
+ }
568
+ /** @type {?} */
569
+ var currentContainer = visibleContainers[visibleContainers.length - 1];
570
+ /** @type {?} */
571
+ var menuItems = (/** @type {?} */ (Array.from(currentContainer.querySelectorAll(".e-menu-item"))));
572
+ /** @type {?} */
573
+ var visibleFilterItems = menuItems.filter((/**
574
+ * @param {?} item
575
+ * @return {?}
576
+ */
577
+ (item) => {
578
+ if (!this.isDateFilterMenuItem(item)) {
579
+ return false;
580
+ }
581
+ if (!item.getBoundingClientRect) {
582
+ return false;
583
+ }
584
+ /** @type {?} */
585
+ var rect = item.getBoundingClientRect();
586
+ return rect.width > 0 && rect.height > 0;
587
+ }));
588
+ if (!visibleFilterItems.length) {
589
+ return null;
590
+ }
591
+ /** @type {?} */
592
+ var focusedItem = visibleFilterItems.find((/**
593
+ * @param {?} item
594
+ * @return {?}
595
+ */
596
+ (item) => {
597
+ return (item.classList.contains("e-focused") ||
598
+ item.classList.contains("e-selected") ||
599
+ item.classList.contains("e-hover"));
600
+ }));
601
+ return focusedItem || visibleFilterItems[visibleFilterItems.length - 1];
602
+ }
603
+ }
604
+ if (false) {
605
+ /** @type {?} */
606
+ DateTreeFilterHelper.prototype.popoverVisible;
607
+ /** @type {?} */
608
+ DateTreeFilterHelper.prototype.popoverField;
609
+ /** @type {?} */
610
+ DateTreeFilterHelper.prototype.popoverStyle;
611
+ /** @type {?} */
612
+ DateTreeFilterHelper.prototype.selectedByField;
613
+ /** @type {?} */
614
+ DateTreeFilterHelper.prototype.fieldLabelMap;
615
+ /** @type {?} */
616
+ DateTreeFilterHelper.prototype.dateFields;
617
+ /**
618
+ * @type {?}
619
+ * @private
620
+ */
621
+ DateTreeFilterHelper.prototype.sourceRows;
622
+ /**
623
+ * @type {?}
624
+ * @private
625
+ */
626
+ DateTreeFilterHelper.prototype.options;
627
+ /**
628
+ * @type {?}
629
+ * @private
630
+ */
631
+ DateTreeFilterHelper.prototype.defaultDateFormats;
632
+ }
633
+ /**
634
+ * @param {?} host
635
+ * @return {?}
636
+ */
637
+ function resolveGridElement(host) {
638
+ if (!host || !host.grid) {
639
+ return null;
640
+ }
641
+ /** @type {?} */
642
+ var gridRef = host.grid;
643
+ if (gridRef.grid && gridRef.grid.element) {
644
+ return gridRef.grid.element;
645
+ }
646
+ if (gridRef.element) {
647
+ return gridRef.element;
648
+ }
649
+ return null;
650
+ }
651
+ /**
652
+ * @param {?} host
653
+ * @param {?} applyRows
654
+ * @param {?=} dateFormats
655
+ * @return {?}
656
+ */
657
+ export function createRsCommonGridDateTreeHelper(host, applyRows, dateFormats) {
658
+ return new DateTreeFilterHelper({
659
+ getTranslation: (/**
660
+ * @return {?}
661
+ */
662
+ () => (host ? host.translation : null)),
663
+ getPopoverElement: (/**
664
+ * @return {?}
665
+ */
666
+ () => host && host.dateTreePopoverRef
667
+ ? host.dateTreePopoverRef.nativeElement
668
+ : null),
669
+ getGridElement: (/**
670
+ * @return {?}
671
+ */
672
+ () => resolveGridElement(host)),
673
+ applyRows: applyRows,
674
+ dateFormats: dateFormats && dateFormats.length
675
+ ? dateFormats
676
+ : DATE_TREE_DEFAULT_DATE_FORMATS,
677
+ });
678
+ }
679
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS10cmVlLWZpbHRlci5oZWxwZXIuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9yYWlzZS1jb21tb24tbGliLyIsInNvdXJjZXMiOlsibGliL2RhdGUtdHJlZS1maWx0ZXIvZGF0ZS10cmVlLWZpbHRlci5oZWxwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7Ozs7QUFFNUIsZ0RBSUM7OztJQUhDLDBDQUFZOztJQUNaLDRDQUFjOztJQUNkLDJDQUFnQjs7Ozs7QUFHbEIsaURBT0M7OztJQU5DLHFEQUEwQjs7SUFDMUIsd0RBQXFDOztJQUNyQyxxREFBa0M7O0lBQ2xDLGdEQUFpQzs7SUFDakMscURBQXNDOztJQUN0QyxrREFBdUI7Ozs7O0FBR3pCLHFEQUlDOzs7SUFIQyxzREFBaUI7O0lBQ2pCLDZEQUF3Qjs7SUFDeEIsK0NBQVU7OztBQUdaLE1BQU0sT0FBTyw4QkFBOEIsR0FBRztJQUM1QyxZQUFZO0lBQ1osWUFBWTtJQUNaLFlBQVk7SUFDWixZQUFZO0lBQ1osYUFBYTtJQUNiLGNBQWM7Q0FDZjtBQUVELE1BQU0sT0FBTyxvQkFBb0I7Ozs7SUFxQi9CLFlBQVksT0FBb0M7UUFwQnpDLG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLGlCQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLGlCQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLG9CQUFlLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLGtCQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ25CLGVBQVUsR0FBRyxFQUFFLENBQUM7UUFFZixlQUFVLEdBQUcsRUFBRSxDQUFDO1FBRWhCLHVCQUFrQixHQUFHO1lBQzNCLFlBQVk7WUFDWixZQUFZO1lBQ1osWUFBWTtZQUNaLFlBQVk7WUFDWixhQUFhO1lBQ2IscUJBQXFCO1lBQ3JCLGNBQWM7WUFDZCxNQUFNLENBQUMsUUFBUTtTQUNoQixDQUFDO1FBR0EsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7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O1FBQzlDLFNBQVMsRUFBRSxTQUFTO1FBQ3BCLFdBQVcsRUFDVCxXQUFXLElBQUksV0FBVyxDQUFDLE1BQU07WUFDL0IsQ0FBQyxDQUFDLFdBQVc7WUFDYixDQUFDLENBQUMsOEJBQThCO0tBQ3JDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbW9tZW50IGZyb20gXCJtb21lbnRcIjtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRGF0ZVRyZWVGaWx0ZXJTZXR1cE9wdGlvbnMge1xyXG4gIHJvd3M6IGFueVtdO1xyXG4gIGZpZWxkczogYW55W107XHJcbiAgaGludHM6IHN0cmluZ1tdO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIERhdGVUcmVlRmlsdGVySGVscGVyT3B0aW9ucyB7XHJcbiAgZ2V0VHJhbnNsYXRpb246ICgpID0+IGFueTtcclxuICBnZXRQb3BvdmVyRWxlbWVudDogKCkgPT4gSFRNTEVsZW1lbnQ7XHJcbiAgZ2V0R3JpZEVsZW1lbnQ6ICgpID0+IEhUTUxFbGVtZW50O1xyXG4gIGFwcGx5Um93czogKHJvd3M6IGFueVtdKSA9PiB2b2lkO1xyXG4gIHBhcnNlRGF0ZVZhbHVlPzogKHZhbHVlOiBhbnkpID0+IERhdGU7XHJcbiAgZGF0ZUZvcm1hdHM/OiBzdHJpbmdbXTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBSc0NvbW1vbkdyaWREYXRlVHJlZUZhY3RvcnlIb3N0IHtcclxuICB0cmFuc2xhdGlvbjogYW55O1xyXG4gIGRhdGVUcmVlUG9wb3ZlclJlZjogYW55O1xyXG4gIGdyaWQ6IGFueTtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IERBVEVfVFJFRV9ERUZBVUxUX0RBVEVfRk9STUFUUyA9IFtcclxuICBcIllZWVktTU0tRERcIixcclxuICBcIk1NL0REL1lZWVlcIixcclxuICBcIkREL01NL1lZWVlcIixcclxuICBcIllZWVkvTU0vRERcIixcclxuICBcIkRELU1NTS1ZWVlZXCIsXHJcbiAgXCJNTU0gREQsIFlZWVlcIixcclxuXTtcclxuXHJcbmV4cG9ydCBjbGFzcyBEYXRlVHJlZUZpbHRlckhlbHBlciB7XHJcbiAgcHVibGljIHBvcG92ZXJWaXNpYmxlID0gZmFsc2U7XHJcbiAgcHVibGljIHBvcG92ZXJGaWVsZCA9IFwiXCI7XHJcbiAgcHVibGljIHBvcG92ZXJTdHlsZSA9IHt9O1xyXG4gIHB1YmxpYyBzZWxlY3RlZEJ5RmllbGQgPSB7fTtcclxuICBwdWJsaWMgZmllbGRMYWJlbE1hcCA9IHt9O1xyXG4gIHB1YmxpYyBkYXRlRmllbGRzID0gW107XHJcblxyXG4gIHByaXZhdGUgc291cmNlUm93cyA9IFtdO1xyXG4gIHByaXZhdGUgb3B0aW9uczogRGF0ZVRyZWVGaWx0ZXJIZWxwZXJPcHRpb25zO1xyXG4gIHByaXZhdGUgZGVmYXVsdERhdGVGb3JtYXRzID0gW1xyXG4gICAgXCJZWVlZLU1NLUREXCIsXHJcbiAgICBcIk1NL0REL1lZWVlcIixcclxuICAgIFwiREQvTU0vWVlZWVwiLFxyXG4gICAgXCJZWVlZL01NL0REXCIsXHJcbiAgICBcIkRELU1NTS1ZWVlZXCIsXHJcbiAgICBcIkRELU1NTS1ZWVlZIGhoOm1tIEFcIixcclxuICAgIFwiTU1NIERELCBZWVlZXCIsXHJcbiAgICBtb21lbnQuSVNPXzg2MDEsXHJcbiAgXTtcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9uczogRGF0ZVRyZWVGaWx0ZXJIZWxwZXJPcHRpb25zKSB7XHJcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldHVwKGNvbmZpZzogRGF0ZVRyZWVGaWx0ZXJTZXR1cE9wdGlvbnMpIHtcclxuICAgIHZhciByb3dzID0gY29uZmlnICYmIGNvbmZpZy5yb3dzID8gY29uZmlnLnJvd3MgOiBbXTtcclxuICAgIHZhciBmaWVsZHMgPSBjb25maWcgJiYgY29uZmlnLmZpZWxkcyA/IGNvbmZpZy5maWVsZHMgOiBbXTtcclxuICAgIHZhciBoaW50cyA9IGNvbmZpZyAmJiBjb25maWcuaGludHMgPyBjb25maWcuaGludHMgOiBbXTtcclxuICAgIHRoaXMuc291cmNlUm93cyA9IHJvd3M7XHJcbiAgICB0aGlzLmRhdGVGaWVsZHMgPSB0aGlzLnJlc29sdmVEYXRlVHJlZUZpZWxkc0J5SGludHMoZmllbGRzLCBoaW50cyk7XHJcbiAgICB0aGlzLmZpZWxkTGFiZWxNYXAgPSB7fTtcclxuICAgIChmaWVsZHMgfHwgW10pLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgaWYgKCFpdGVtIHx8ICFpdGVtLmNvbHVtbk5hbWUpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5maWVsZExhYmVsTWFwW2l0ZW0uY29sdW1uTmFtZV0gPVxyXG4gICAgICAgIGl0ZW0uY29sdW1uRGlzcGxheU5hbWUgfHwgaXRlbS5jb2x1bW5OYW1lO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmFwcGx5KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaGFuZGxlR3JpZEFjdGlvbkJlZ2luKGFyZ3M6IGFueSkge1xyXG4gICAgdmFyIHJlcXVlc3RUeXBlID0gdGhpcy5nZXRSZXF1ZXN0VHlwZShhcmdzKTtcclxuICAgIGlmIChcclxuICAgICAgcmVxdWVzdFR5cGUgPT09IFwiZmlsdGVyY2hvaWNlcmVxdWVzdFwiIHx8XHJcbiAgICAgIHJlcXVlc3RUeXBlID09PSBcImZpbHRlcnNlYXJjaGJlZ2luXCJcclxuICAgICkge1xyXG4gICAgICBhcmdzLmZpbHRlckNob2ljZUNvdW50ID0gMTUwMDA7XHJcbiAgICB9XHJcbiAgICBpZiAocmVxdWVzdFR5cGUgIT09IFwiZmlsdGVyYmVmb3Jlb3BlblwiKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHZhciBjb2x1bW5OYW1lID0gdGhpcy5yZXNvbHZlQWN0aW9uQ29sdW1uTmFtZShhcmdzKTtcclxuICAgIGlmICghdGhpcy5pc0RhdGVUcmVlRmllbGQoY29sdW1uTmFtZSkpIHtcclxuICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBhcmdzLmNhbmNlbCA9IHRydWU7XHJcbiAgICB0aGlzLm9wZW4oY29sdW1uTmFtZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlU2VsZWN0aW9uKHNlbGVjdGlvbk1hcDogYW55KSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkQnlGaWVsZCA9IHNlbGVjdGlvbk1hcCB8fCB7fTtcclxuICAgIHRoaXMuYXBwbHkoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbG9zZSgpIHtcclxuICAgIGlmICghdGhpcy5wb3BvdmVyVmlzaWJsZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnBvcG92ZXJWaXNpYmxlID0gZmFsc2U7XHJcbiAgICB0aGlzLnBvcG92ZXJGaWVsZCA9IFwiXCI7XHJcbiAgICB0aGlzLnBvcG92ZXJTdHlsZSA9IHt9O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGhhbmRsZURvY3VtZW50TW91c2VEb3duKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICBpZiAoIXRoaXMucG9wb3ZlclZpc2libGUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdmFyIHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgIGlmICghdGFyZ2V0KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmlzSW5zaWRlUG9wb3Zlcih0YXJnZXQpIHx8IHRoaXMuaXNEYXRlRmlsdGVyTWVudUl0ZW0odGFyZ2V0KSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmNsb3NlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaGFuZGxlRG9jdW1lbnRNb3VzZU92ZXIoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgIGlmICghdGhpcy5wb3BvdmVyVmlzaWJsZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB2YXIgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgaWYgKCF0YXJnZXQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuaXNJbnNpZGVQb3BvdmVyKHRhcmdldCkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdmFyIG1lbnVJdGVtID0gdGFyZ2V0LmNsb3Nlc3QoXCIuZS1tZW51LWl0ZW1cIikgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBpZiAobWVudUl0ZW0pIHtcclxuICAgICAgaWYgKCF0aGlzLmlzRGF0ZUZpbHRlck1lbnVJdGVtKG1lbnVJdGVtKSkge1xyXG4gICAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB2YXIgb3RoZXJGaWx0ZXJUYXJnZXQgPSB0YXJnZXQuY2xvc2VzdChcclxuICAgICAgXCIuZS1maWx0ZXJtZW51ZGl2LCAuZS1oZWFkZXJjZWxsIC5lLWNvbHVtbm1lbnUsIC5lLWNvbHVtbm1lbnUsIC5lLWNvbnRleHRtZW51XCJcclxuICAgICkgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBpZiAob3RoZXJGaWx0ZXJUYXJnZXQgJiYgIXRoaXMuaXNEYXRlRmlsdGVyTWVudUl0ZW0ob3RoZXJGaWx0ZXJUYXJnZXQpKSB7XHJcbiAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVQb3NpdGlvbigpIHtcclxuICAgIGlmICghdGhpcy5wb3BvdmVyVmlzaWJsZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB2YXIgYW5jaG9yID0gdGhpcy5maW5kRGF0ZUZpbHRlckFuY2hvckVsZW1lbnQoKTtcclxuICAgIGlmIChhbmNob3IpIHtcclxuICAgICAgdmFyIHJlY3QgPSBhbmNob3IuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgIHZhciB2aWV3cG9ydFdpZHRoID1cclxuICAgICAgICB3aW5kb3cuaW5uZXJXaWR0aCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg7XHJcbiAgICAgIHZhciB2aWV3cG9ydEhlaWdodCA9XHJcbiAgICAgICAgd2luZG93LmlubmVySGVpZ2h0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7XHJcbiAgICAgIHZhciBwb3BvdmVyRWxlbWVudCA9IHRoaXMub3B0aW9ucy5nZXRQb3BvdmVyRWxlbWVudFxyXG4gICAgICAgID8gdGhpcy5vcHRpb25zLmdldFBvcG92ZXJFbGVtZW50KClcclxuICAgICAgICA6IG51bGw7XHJcbiAgICAgIHZhciBwb3BvdmVyV2lkdGggPVxyXG4gICAgICAgIHBvcG92ZXJFbGVtZW50ICYmIHBvcG92ZXJFbGVtZW50Lm9mZnNldFdpZHRoXHJcbiAgICAgICAgICA/IHBvcG92ZXJFbGVtZW50Lm9mZnNldFdpZHRoXHJcbiAgICAgICAgICA6IDMwMDtcclxuICAgICAgdmFyIHBvcG92ZXJIZWlnaHQgPVxyXG4gICAgICAgIHBvcG92ZXJFbGVtZW50ICYmIHBvcG92ZXJFbGVtZW50Lm9mZnNldEhlaWdodFxyXG4gICAgICAgICAgPyBwb3BvdmVyRWxlbWVudC5vZmZzZXRIZWlnaHRcclxuICAgICAgICAgIDogNDIwO1xyXG4gICAgICB2YXIgZWRnZUdhcCA9IDg7XHJcbiAgICAgIHZhciBhbmNob3JHYXAgPSA4O1xyXG4gICAgICB2YXIgdG9wID0gcmVjdC50b3AgLSA2O1xyXG4gICAgICB2YXIgbGVmdCA9IHJlY3QucmlnaHQgKyBhbmNob3JHYXA7XHJcblxyXG4gICAgICBpZiAobGVmdCArIHBvcG92ZXJXaWR0aCA+IHZpZXdwb3J0V2lkdGggLSBlZGdlR2FwKSB7XHJcbiAgICAgICAgbGVmdCA9IHJlY3QubGVmdCAtIHBvcG92ZXJXaWR0aCAtIGFuY2hvckdhcDtcclxuICAgICAgfVxyXG4gICAgICBpZiAobGVmdCA8IGVkZ2VHYXApIHtcclxuICAgICAgICBsZWZ0ID0gZWRnZUdhcDtcclxuICAgICAgfVxyXG4gICAgICBpZiAobGVmdCArIHBvcG92ZXJXaWR0aCA+IHZpZXdwb3J0V2lkdGggLSBlZGdlR2FwKSB7XHJcbiAgICAgICAgbGVmdCA9IE1hdGgubWF4KGVkZ2VHYXAsIHZpZXdwb3J0V2lkdGggLSBwb3BvdmVyV2lkdGggLSBlZGdlR2FwKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodG9wICsgcG9wb3ZlckhlaWdodCA+IHZpZXdwb3J0SGVpZ2h0IC0gZWRnZUdhcCkge1xyXG4gICAgICAgIHRvcCA9IE1hdGgubWF4KGVkZ2VHYXAsIHZpZXdwb3J0SGVpZ2h0IC0gcG9wb3ZlckhlaWdodCAtIGVkZ2VHYXApO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMucG9wb3ZlclN0eWxlID0ge1xyXG4gICAgICAgIHBvc2l0aW9uOiBcImZpeGVkXCIsXHJcbiAgICAgICAgbGVmdDogbGVmdCArIFwicHhcIixcclxuICAgICAgICB0b3A6IHRvcCArIFwicHhcIixcclxuICAgICAgfTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdmFyIGdyaWRFbGVtZW50ID0gdGhpcy5vcHRpb25zLmdldEdyaWRFbGVtZW50XHJcbiAgICAgID8gdGhpcy5vcHRpb25zLmdldEdyaWRFbGVtZW50KClcclxuICAgICAgOiBudWxsO1xyXG4gICAgaWYgKGdyaWRFbGVtZW50ICYmIGdyaWRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCkge1xyXG4gICAgICB2YXIgZmFsbGJhY2tSZWN0ID0gZ3JpZEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgIHRoaXMucG9wb3ZlclN0eWxlID0ge1xyXG4gICAgICAgIHBvc2l0aW9uOiBcImZpeGVkXCIsXHJcbiAgICAgICAgbGVmdDogTWF0aC5tYXgoOCwgZmFsbGJhY2tSZWN0LnJpZ2h0IC0gMzEyKSArIFwicHhcIixcclxuICAgICAgICB0b3A6IE1hdGgubWF4KDgsIGZhbGxiYWNrUmVjdC50b3AgKyA4KSArIFwicHhcIixcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgb3BlbihmaWVsZDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnBvcG92ZXJGaWVsZCA9IGZpZWxkO1xyXG4gICAgdGhpcy5wb3BvdmVyVmlzaWJsZSA9IHRydWU7XHJcbiAgICB0aGlzLnVwZGF0ZVBvc2l0aW9uKCk7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMudXBkYXRlUG9zaXRpb24oKSwgNTApO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnVwZGF0ZVBvc2l0aW9uKCksIDE1MCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFwcGx5KCkge1xyXG4gICAgdmFyIGZpbHRlcmVkUm93cyA9IHRoaXMuZmlsdGVyUm93c0J5U2VsZWN0ZWREYXRlVHJlZShcclxuICAgICAgdGhpcy5zb3VyY2VSb3dzIHx8IFtdXHJcbiAgICApO1xyXG4gICAgdGhpcy5vcHRpb25zLmFwcGx5Um93cyhmaWx0ZXJlZFJvd3MpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRSZXF1ZXN0VHlwZShhcmdzKSB7XHJcbiAgICBpZiAoIWFyZ3MgfHwgIWFyZ3MucmVxdWVzdFR5cGUpIHtcclxuICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gU3RyaW5nKGFyZ3MucmVxdWVzdFR5cGUpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXNvbHZlQWN0aW9uQ29sdW1uTmFtZShhcmdzKSB7XHJcbiAgICBpZiAoIWFyZ3MpIHtcclxuICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICBhcmdzLmNvbHVtbk5hbWUgfHxcclxuICAgICAgYXJncy5maWVsZCB8fFxyXG4gICAgICBhcmdzLmN1cnJlbnRGaWx0ZXJpbmdDb2x1bW4gfHxcclxuICAgICAgKGFyZ3MuY29sdW1uICYmIChhcmdzLmNvbHVtbi5maWVsZCB8fCBhcmdzLmNvbHVtbi5jb2x1bW5OYW1lKSkgfHxcclxuICAgICAgXCJcIlxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVzb2x2ZURhdGVUcmVlRmllbGRzQnlIaW50cyhmaWVsZHM6IGFueVtdLCBoaW50czogc3RyaW5nW10pIHtcclxuICAgIHZhciBub3JtYWxpemVkSGludHMgPSAoaGludHMgfHwgW10pXHJcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+ICEhaXRlbSlcclxuICAgICAgLm1hcCgoaXRlbSkgPT4gU3RyaW5nKGl0ZW0pLnRyaW0oKS50b0xvd2VyQ2FzZSgpKTtcclxuICAgIGlmICghZmllbGRzIHx8ICFmaWVsZHMubGVuZ3RoIHx8ICFub3JtYWxpemVkSGludHMubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuICAgIHJldHVybiBmaWVsZHNcclxuICAgICAgLmZpbHRlcigoaXRlbSkgPT4ge1xyXG4gICAgICAgIGlmICghaXRlbSB8fCAhaXRlbS5jb2x1bW5OYW1lKSB7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBjb2x1bW5OYW1lID0gU3RyaW5nKGl0ZW0uY29sdW1uTmFtZSB8fCBcIlwiKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIHZhciBkaXNwbGF5TmFtZSA9IFN0cmluZyhpdGVtLmNvbHVtbkRpc3BsYXlOYW1lIHx8IFwiXCIpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRIaW50cy5zb21lKChoaW50KSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICBjb2x1bW5OYW1lID09PSBoaW50IHx8XHJcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lID09PSBoaW50IHx8XHJcbiAgICAgICAgICAgIChoaW50Lmxlbmd0aCA+PSAzICYmXHJcbiAgICAgICAgICAgICAgKGNvbHVtbk5hbWUuaW5kZXhPZihoaW50KSA+IC0xIHx8XHJcbiAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZS5pbmRleE9mKGhpbnQpID4gLTEpKVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSlcclxuICAgICAgLm1hcCgoaXRlbSkgPT4gaXRlbS5jb2x1bW5OYW1lKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNEYXRlVHJlZUZpZWxkKGZpZWxkOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiB0aGlzLmRhdGVGaWVsZHMuaW5kZXhPZihmaWVsZCkgPiAtMTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0RmllbGREYXlTZWxlY3Rpb25NYXAoZmllbGQ6IHN0cmluZykge1xyXG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkQnlGaWVsZFtmaWVsZF0pIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEJ5RmllbGRbZmllbGRdID0ge307XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEJ5RmllbGRbZmllbGRdO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmaWx0ZXJSb3dzQnlTZWxlY3RlZERhdGVUcmVlKHJvd3M6IGFueVtdLCBleGNsdWRlRmllbGQ/OiBzdHJpbmcpIHtcclxuICAgIHZhciBmaWx0ZXJlZFJvd3MgPSByb3dzID8gcm93cy5zbGljZSgpIDogW107XHJcbiAgICB0aGlzLmRhdGVGaWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcclxuICAgICAgaWYgKGV4Y2x1ZGVGaWVsZCAmJiBmaWVsZCA9PT0gZXhjbHVkZUZpZWxkKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHZhciBzZWxlY3RlZE1hcCA9IHRoaXMuZ2V0RmllbGREYXlTZWxlY3Rpb25NYXAoZmllbGQpO1xyXG4gICAgICB2YXIgc2VsZWN0ZWRLZXlzID0gT2JqZWN0LmtleXMoc2VsZWN0ZWRNYXApO1xyXG4gICAgICBpZiAoIXNlbGVjdGVkS2V5cy5sZW5ndGgpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgZmlsdGVyZWRSb3dzID0gZmlsdGVyZWRSb3dzLmZpbHRlcigocm93KSA9PiB7XHJcbiAgICAgICAgdmFyIGRheUtleSA9IHRoaXMuZ2V0RGF5S2V5QnlSb3dWYWx1ZShyb3dbZmllbGRdKTtcclxuICAgICAgICByZXR1cm4gZGF5S2V5ID8gISFzZWxlY3RlZE1hcFtkYXlLZXldIDogZmFsc2U7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZmlsdGVyZWRSb3dzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXREYXlLZXlCeVJvd1ZhbHVlKHZhbHVlOiBhbnkpIHtcclxuICAgIHZhciBkYXRlID0gdGhpcy5wYXJzZURhdGVWYWx1ZSh2YWx1ZSk7XHJcbiAgICBpZiAoIWRhdGUpIHtcclxuICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy50b0RheUtleShcclxuICAgICAgZGF0ZS5nZXRGdWxsWWVhcigpLFxyXG4gICAgICBkYXRlLmdldE1vbnRoKCkgKyAxLFxyXG4gICAgICBkYXRlLmdldERhdGUoKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcGFyc2VEYXRlVmFsdWUodmFsdWU6IGFueSk6IERhdGUge1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5wYXJzZURhdGVWYWx1ZSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zLnBhcnNlRGF0ZVZhbHVlKHZhbHVlKTtcclxuICAgIH1cclxuICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XHJcbiAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH1cclxuICAgIHZhciBmb3JtYXRzID1cclxuICAgICAgdGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5kYXRlRm9ybWF0cyAmJiB0aGlzLm9wdGlvbnMuZGF0ZUZvcm1hdHMubGVuZ3RoXHJcbiAgICAgICAgPyB0aGlzLm9wdGlvbnMuZGF0ZUZvcm1hdHNcclxuICAgICAgICA6IHRoaXMuZGVmYXVsdERhdGVGb3JtYXRzO1xyXG4gICAgdmFyIHBhcnNlZCA9IG1vbWVudCh2YWx1ZSwgZm9ybWF0cywgdHJ1ZSk7XHJcbiAgICBpZiAocGFyc2VkLmlzVmFsaWQoKSkge1xyXG4gICAgICByZXR1cm4gcGFyc2VkLnRvRGF0ZSgpO1xyXG4gICAgfVxyXG4gICAgdmFyIGZhbGxiYWNrID0gbmV3IERhdGUodmFsdWUpO1xyXG4gICAgcmV0dXJuIGlzTmFOKGZhbGxiYWNrLmdldFRpbWUoKSkgPyBudWxsIDogZmFsbGJhY2s7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRvRGF5S2V5KHllYXI6IG51bWJlciwgbW9udGg6IG51bWJlciwgZGF5OiBudW1iZXIpIHtcclxuICAgIHJldHVybiB5ZWFyICsgXCItXCIgKyB0aGlzLnBhZDIobW9udGgpICsgXCItXCIgKyB0aGlzLnBhZDIoZGF5KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcGFkMih2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gdmFsdWUgPCAxMCA/IFwiMFwiICsgdmFsdWUgOiBTdHJpbmcodmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc0luc2lkZVBvcG92ZXIodGFyZ2V0OiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xyXG4gICAgdmFyIHBvcG92ZXJFbGVtZW50ID0gdGhpcy5vcHRpb25zLmdldFBvcG92ZXJFbGVtZW50XHJcbiAgICAgID8gdGhpcy5vcHRpb25zLmdldFBvcG92ZXJFbGVtZW50KClcclxuICAgICAgOiBudWxsO1xyXG4gICAgaWYgKCF0YXJnZXQgfHwgIXBvcG92ZXJFbGVtZW50KSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiBwb3BvdmVyRWxlbWVudC5jb250YWlucyh0YXJnZXQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc0RhdGVGaWx0ZXJNZW51SXRlbShlbGVtZW50OiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCFlbGVtZW50KSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHZhciBtZW51SXRlbSA9IGVsZW1lbnQuY2xvc2VzdChcIi5lLW1lbnUtaXRlbVwiKSBhcyBIVE1MRWxlbWVudDtcclxuICAgIGlmICghbWVudUl0ZW0pIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgdmFyIHRleHQgPSAobWVudUl0ZW0udGV4dENvbnRlbnQgfHwgXCJcIikudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICB2YXIgdHJhbnNsYXRpb24gPSB0aGlzLm9wdGlvbnMuZ2V0VHJhbnNsYXRpb25cclxuICAgICAgPyB0aGlzLm9wdGlvbnMuZ2V0VHJhbnNsYXRpb24oKVxyXG4gICAgICA6IG51bGw7XHJcbiAgICB2YXIgZmlsdGVyVGV4dCA9IFN0cmluZygodHJhbnNsYXRpb24gJiYgdHJhbnNsYXRpb24uRklMVEVSKSB8fCBcImZpbHRlclwiKVxyXG4gICAgICAudHJpbSgpXHJcbiAgICAgIC50b0xvd2VyQ2FzZSgpO1xyXG4gICAgaWYgKCF0ZXh0KSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmICh0ZXh0LmluZGV4T2YoZmlsdGVyVGV4dCkgPiAtMSB8fCB0ZXh0LmluZGV4T2YoXCJmaWx0ZXJcIikgPiAtMSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHZhciBjbHMgPSAobWVudUl0ZW0uY2xhc3NOYW1lIHx8IFwiXCIpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICByZXR1cm4gY2xzLmluZGV4T2YoXCJmaWx0ZXJcIikgPiAtMTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZmluZERhdGVGaWx0ZXJBbmNob3JFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcclxuICAgIHZhciBtZW51Q29udGFpbmVycyA9IEFycmF5LmZyb20oXHJcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIuZS1jb2x1bW5tZW51LCAuZS1jb250ZXh0bWVudVwiKVxyXG4gICAgKSBhcyBIVE1MRWxlbWVudFtdO1xyXG4gICAgdmFyIHZpc2libGVDb250YWluZXJzID0gbWVudUNvbnRhaW5lcnMuZmlsdGVyKChjb250YWluZXIpID0+IHtcclxuICAgICAgaWYgKCFjb250YWluZXIgfHwgIWNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgdmFyIHJlY3QgPSBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgIGlmIChyZWN0LndpZHRoIDw9IDAgfHwgcmVjdC5oZWlnaHQgPD0gMCkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICB2YXIgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjb250YWluZXIpO1xyXG4gICAgICBpZiAoIXN0eWxlIHx8IHN0eWxlLmRpc3BsYXkgPT09IFwibm9uZVwiIHx8IHN0eWxlLnZpc2liaWxpdHkgPT09IFwiaGlkZGVuXCIpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9KTtcclxuICAgIGlmICghdmlzaWJsZUNvbnRhaW5lcnMubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgdmFyIGN1cnJlbnRDb250YWluZXIgPSB2aXNpYmxlQ29udGFpbmVyc1t2aXNpYmxlQ29udGFpbmVycy5sZW5ndGggLSAxXTtcclxuICAgIHZhciBtZW51SXRlbXMgPSBBcnJheS5mcm9tKFxyXG4gICAgICBjdXJyZW50Q29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoXCIuZS1tZW51LWl0ZW1cIilcclxuICAgICkgYXMgSFRNTEVsZW1lbnRbXTtcclxuICAgIHZhciB2aXNpYmxlRmlsdGVySXRlbXMgPSBtZW51SXRlbXMuZmlsdGVyKChpdGVtKSA9PiB7XHJcbiAgICAgIGlmICghdGhpcy5pc0RhdGVGaWx0ZXJNZW51SXRlbShpdGVtKSkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoIWl0ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIHZhciByZWN0ID0gaXRlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgcmV0dXJuIHJlY3Qud2lkdGggPiAwICYmIHJlY3QuaGVpZ2h0ID4gMDtcclxuICAgIH0pO1xyXG4gICAgaWYgKCF2aXNpYmxlRmlsdGVySXRlbXMubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgdmFyIGZvY3VzZWRJdGVtID0gdmlzaWJsZUZpbHRlckl0ZW1zLmZpbmQoKGl0ZW0pID0+IHtcclxuICAgICAgcmV0dXJuIChcclxuICAgICAgICBpdGVtLmNsYXNzTGlzdC5jb250YWlucyhcImUtZm9jdXNlZFwiKSB8fFxyXG4gICAgICAgIGl0ZW0uY2xhc3NMaXN0LmNvbnRhaW5zKFwiZS1zZWxlY3RlZFwiKSB8fFxyXG4gICAgICAgIGl0ZW0uY2xhc3NMaXN0LmNvbnRhaW5zKFwiZS1ob3ZlclwiKVxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZm9jdXNlZEl0ZW0gfHwgdmlzaWJsZUZpbHRlckl0ZW1zW3Zpc2libGVGaWx0ZXJJdGVtcy5sZW5ndGggLSAxXTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlc29sdmVHcmlkRWxlbWVudChob3N0OiBSc0NvbW1vbkdyaWREYXRlVHJlZUZhY3RvcnlIb3N0KTogSFRNTEVsZW1lbnQge1xyXG4gIGlmICghaG9zdCB8fCAhaG9zdC5ncmlkKSB7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcbiAgdmFyIGdyaWRSZWYgPSBob3N0LmdyaWQ7XHJcbiAgaWYgKGdyaWRSZWYuZ3JpZCAmJiBncmlkUmVmLmdyaWQuZWxlbWVudCkge1xyXG4gICAgcmV0dXJuIGdyaWRSZWYuZ3JpZC5lbGVtZW50O1xyXG4gIH1cclxuICBpZiAoZ3JpZFJlZi5lbGVtZW50KSB7XHJcbiAgICByZXR1cm4gZ3JpZFJlZi5lbGVtZW50O1xyXG4gIH1cclxuICByZXR1cm4gbnVsbDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJzQ29tbW9uR3JpZERhdGVUcmVlSGVscGVyKFxyXG4gIGhvc3Q6IFJzQ29tbW9uR3JpZERhdGVUcmVlRmFjdG9yeUhvc3QsXHJcbiAgYXBwbHlSb3dzOiAocm93czogYW55W10pID0+IHZvaWQsXHJcbiAgZGF0ZUZvcm1hdHM/OiBzdHJpbmdbXVxyXG4pIHtcclxuICByZXR1cm4gbmV3IERhdGVUcmVlRmlsdGVySGVscGVyKHtcclxuICAgIGdldFRyYW5zbGF0aW9uOiAoKSA9PiAoaG9zdCA/IGhvc3QudHJhbnNsYXRpb24gOiBudWxsKSxcclxuICAgIGdldFBvcG92ZXJFbGVtZW50OiAoKSA9PlxyXG4gICAgICBob3N0ICYmIGhvc3QuZGF0ZVRyZWVQb3BvdmVyUmVmXHJcbiAgICAgICAgPyBob3N0LmRhdGVUcmVlUG9wb3ZlclJlZi5uYXRpdmVFbGVtZW50XHJcbiAgICAgICAgOiBudWxsLFxyXG4gICAgZ2V0R3JpZEVsZW1lbnQ6ICgpID0+IHJlc29sdmVHcmlkRWxlbWVudChob3N0KSxcclxuICAgIGFwcGx5Um93czogYXBwbHlSb3dzLFxyXG4gICAgZGF0ZUZvcm1hdHM6XHJcbiAgICAgIGRhdGVGb3JtYXRzICYmIGRhdGVGb3JtYXRzLmxlbmd0aFxyXG4gICAgICAgID8gZGF0ZUZvcm1hdHNcclxuICAgICAgICA6IERBVEVfVFJFRV9ERUZBVUxUX0RBVEVfRk9STUFUUyxcclxuICB9KTtcclxufVxyXG4iXX0=