ecabs-components 1.0.28 → 1.0.30

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 (163) hide show
  1. package/esm2022/ecabs-components.mjs +4 -4
  2. package/esm2022/lib/base/consts/date-mask.consts.mjs +56 -56
  3. package/esm2022/lib/base/directives/date-mask.directive.mjs +64 -64
  4. package/esm2022/lib/base/directives/date-mask.directive.module.mjs +21 -21
  5. package/esm2022/lib/base/directives/digits-only.directive.mjs +129 -129
  6. package/esm2022/lib/base/directives/digits-only.directive.module.mjs +21 -21
  7. package/esm2022/lib/base/directives/number-border.directive.mjs +53 -53
  8. package/esm2022/lib/base/directives/number-border.directive.module.mjs +21 -21
  9. package/esm2022/lib/base/directives/tooltip-if-truncated.directive.mjs +29 -0
  10. package/esm2022/lib/base/directives/tooltip-if-truncated.directive.module.mjs +22 -0
  11. package/esm2022/lib/base/element-base.mjs +99 -99
  12. package/esm2022/lib/base/element-wrapper/element-wrapper.component.mjs +52 -52
  13. package/esm2022/lib/base/element-wrapper/element-wrapper.module.mjs +51 -51
  14. package/esm2022/lib/base/hint/hint.component.mjs +20 -20
  15. package/esm2022/lib/base/hint/hint.module.mjs +19 -19
  16. package/esm2022/lib/base/validation/validation.component.mjs +69 -69
  17. package/esm2022/lib/base/validation/validation.module.mjs +19 -19
  18. package/esm2022/lib/ecabs-active-status-filter/ecabs-active-status-filter.component.mjs +30 -30
  19. package/esm2022/lib/ecabs-active-status-filter/ecabs-active-status-filter.module.mjs +19 -19
  20. package/esm2022/lib/ecabs-breadcrumb/ecabs-breadcrumb.component.mjs +15 -15
  21. package/esm2022/lib/ecabs-breadcrumb/ecabs-breadcrumb.module.mjs +19 -19
  22. package/esm2022/lib/ecabs-buttons/ecabs-buttons.component.mjs +62 -62
  23. package/esm2022/lib/ecabs-buttons/ecabs-buttons.module.mjs +20 -20
  24. package/esm2022/lib/ecabs-checkbox-toggle/ecabs-checkbox-toggle.component.mjs +100 -100
  25. package/esm2022/lib/ecabs-checkbox-toggle/ecabs-checkbox-toggle.module.mjs +35 -35
  26. package/esm2022/lib/ecabs-date-picker/components/ecabs-date-picker-header/ecabs-date-picker-header.component.mjs +16 -16
  27. package/esm2022/lib/ecabs-date-picker/ecabs-date-picker.component.mjs +84 -84
  28. package/esm2022/lib/ecabs-date-picker/ecabs-date-picker.module.mjs +47 -47
  29. package/esm2022/lib/ecabs-date-time-picker/components/ecabs-date-time-picker-header/ecabs-date-time-picker-header.component.mjs +16 -16
  30. package/esm2022/lib/ecabs-date-time-picker/ecabs-date-time-picker.component.mjs +178 -178
  31. package/esm2022/lib/ecabs-date-time-picker/ecabs-date-time-picker.module.mjs +63 -63
  32. package/esm2022/lib/ecabs-date-time-range-picker/components/ecabs-date-time-range-picker-header/ecabs-date-time-range-picker-header.component.mjs +16 -16
  33. package/esm2022/lib/ecabs-date-time-range-picker/ecabs-date-time-range-picker.component.mjs +192 -192
  34. package/esm2022/lib/ecabs-date-time-range-picker/ecabs-date-time-range-picker.module.mjs +64 -64
  35. package/esm2022/lib/ecabs-date-time-range-picker/time-range.directive.mjs +44 -44
  36. package/esm2022/lib/ecabs-dialog-confirm/ecabs-dialog-confirm.component.mjs +46 -46
  37. package/esm2022/lib/ecabs-dialog-confirm/ecabs-dialog-confirm.module.mjs +19 -19
  38. package/esm2022/lib/ecabs-dialog-message/ecabs-dialog-message.component.mjs +43 -43
  39. package/esm2022/lib/ecabs-dialog-message/ecabs-dialog-message.module.mjs +19 -19
  40. package/esm2022/lib/ecabs-empty-placeholder/ecabs-empty-placeholder.component.mjs +18 -18
  41. package/esm2022/lib/ecabs-empty-placeholder/ecabs-empty-placeholder.module.mjs +18 -18
  42. package/esm2022/lib/ecabs-expansion-panel/ecabs-expansion-panel.component.mjs +75 -75
  43. package/esm2022/lib/ecabs-expansion-panel/ecabs-expansion-panel.module.mjs +23 -23
  44. package/esm2022/lib/ecabs-increment/ecabs-increment.component.mjs +77 -77
  45. package/esm2022/lib/ecabs-increment/ecabs-increment.module.mjs +22 -22
  46. package/esm2022/lib/ecabs-input/ecabs-input.component.mjs +82 -82
  47. package/esm2022/lib/ecabs-input/ecabs-input.module.mjs +21 -21
  48. package/esm2022/lib/ecabs-language-selector/ecabs-language-selector.component.mjs +61 -61
  49. package/esm2022/lib/ecabs-language-selector/ecabs-language-selector.module.mjs +38 -38
  50. package/esm2022/lib/ecabs-loading/ecabs-loading.component.mjs +23 -23
  51. package/esm2022/lib/ecabs-loading/ecabs-loading.module.mjs +18 -18
  52. package/esm2022/lib/ecabs-loading/spinner/spinner.component.mjs +15 -15
  53. package/esm2022/lib/ecabs-note/ecabs-note.component.mjs +29 -29
  54. package/esm2022/lib/ecabs-note/ecabs-note.module.mjs +18 -18
  55. package/esm2022/lib/ecabs-phone/ecabs-phone.component.mjs +103 -103
  56. package/esm2022/lib/ecabs-phone/ecabs-phone.module.mjs +21 -21
  57. package/esm2022/lib/ecabs-picker-header/ecabs-picker-header.component.mjs +49 -49
  58. package/esm2022/lib/ecabs-picker-header/ecabs-picker-header.module.mjs +21 -21
  59. package/esm2022/lib/ecabs-radio-button-list/ecabs-radio-button-list.component.mjs +64 -64
  60. package/esm2022/lib/ecabs-radio-button-list/ecabs-radio-button-list.module.mjs +31 -31
  61. package/esm2022/lib/ecabs-select/ecabs-select.component.mjs +322 -310
  62. package/esm2022/lib/ecabs-select/ecabs-select.module.mjs +68 -60
  63. package/esm2022/lib/ecabs-table/ecabs-table-filter-wrapper/ecabs-table-filter-wrapper.component.mjs +16 -16
  64. package/esm2022/lib/ecabs-table/ecabs-table-filter-wrapper/ecabs-table-filter-wrapper.module.mjs +23 -23
  65. package/esm2022/lib/ecabs-table/ecabs-table.component.mjs +42 -42
  66. package/esm2022/lib/ecabs-table/ecabs-table.module.mjs +32 -32
  67. package/esm2022/lib/ecabs-textarea/ecabs-textarea.component.mjs +61 -61
  68. package/esm2022/lib/ecabs-textarea/ecabs-textarea.module.mjs +19 -19
  69. package/esm2022/lib/ecabs-timepicker/componets/ecabs-time-list-panel/ecabs-time-list-panel.component.mjs +136 -136
  70. package/esm2022/lib/ecabs-timepicker/config.model.mjs +1 -1
  71. package/esm2022/lib/ecabs-timepicker/ecabs-timepicker.component.mjs +311 -311
  72. package/esm2022/lib/ecabs-timepicker/ecabs-timepicker.module.mjs +19 -19
  73. package/esm2022/lib/ecabs-timepicker/ecabs-timepicker.service.mjs +30 -30
  74. package/esm2022/lib/ecabs-validation/ecabs-validation.component.mjs +18 -18
  75. package/esm2022/lib/ecabs-validation/ecabs-validation.module.mjs +18 -18
  76. package/esm2022/lib/models/bread-crumb.mjs +1 -1
  77. package/esm2022/lib/models/timepicker.models.mjs +1 -1
  78. package/esm2022/lib/models/validation.models.mjs +1 -1
  79. package/esm2022/lib/services/ecabs-components.service.mjs +31 -31
  80. package/esm2022/public-api.mjs +61 -59
  81. package/fesm2022/ecabs-components.mjs +3318 -3256
  82. package/fesm2022/ecabs-components.mjs.map +1 -1
  83. package/index.d.ts +5 -5
  84. package/lib/base/consts/date-mask.consts.d.ts +7 -7
  85. package/lib/base/directives/date-mask.directive.d.ts +16 -16
  86. package/lib/base/directives/date-mask.directive.module.d.ts +8 -8
  87. package/lib/base/directives/digits-only.directive.d.ts +26 -26
  88. package/lib/base/directives/digits-only.directive.module.d.ts +8 -8
  89. package/lib/base/directives/number-border.directive.d.ts +13 -13
  90. package/lib/base/directives/number-border.directive.module.d.ts +8 -8
  91. package/lib/base/directives/tooltip-if-truncated.directive.d.ts +12 -0
  92. package/lib/base/directives/tooltip-if-truncated.directive.module.d.ts +8 -0
  93. package/lib/base/element-base.d.ts +28 -28
  94. package/lib/base/element-wrapper/element-wrapper.component.d.ts +19 -19
  95. package/lib/base/element-wrapper/element-wrapper.module.d.ts +16 -16
  96. package/lib/base/hint/hint.component.d.ts +8 -8
  97. package/lib/base/hint/hint.module.d.ts +10 -10
  98. package/lib/base/validation/validation.component.d.ts +24 -24
  99. package/lib/base/validation/validation.module.d.ts +10 -10
  100. package/lib/ecabs-active-status-filter/ecabs-active-status-filter.component.d.ts +14 -14
  101. package/lib/ecabs-active-status-filter/ecabs-active-status-filter.module.d.ts +10 -10
  102. package/lib/ecabs-breadcrumb/ecabs-breadcrumb.component.d.ts +7 -7
  103. package/lib/ecabs-breadcrumb/ecabs-breadcrumb.module.d.ts +10 -10
  104. package/lib/ecabs-buttons/ecabs-buttons.component.d.ts +20 -20
  105. package/lib/ecabs-buttons/ecabs-buttons.module.d.ts +11 -11
  106. package/lib/ecabs-checkbox-toggle/ecabs-checkbox-toggle.component.d.ts +31 -31
  107. package/lib/ecabs-checkbox-toggle/ecabs-checkbox-toggle.module.d.ts +12 -12
  108. package/lib/ecabs-date-picker/components/ecabs-date-picker-header/ecabs-date-picker-header.component.d.ts +6 -6
  109. package/lib/ecabs-date-picker/ecabs-date-picker.component.d.ts +29 -29
  110. package/lib/ecabs-date-picker/ecabs-date-picker.module.d.ts +15 -15
  111. package/lib/ecabs-date-time-picker/components/ecabs-date-time-picker-header/ecabs-date-time-picker-header.component.d.ts +6 -6
  112. package/lib/ecabs-date-time-picker/ecabs-date-time-picker.component.d.ts +51 -51
  113. package/lib/ecabs-date-time-picker/ecabs-date-time-picker.module.d.ts +19 -19
  114. package/lib/ecabs-date-time-range-picker/components/ecabs-date-time-range-picker-header/ecabs-date-time-range-picker-header.component.d.ts +6 -6
  115. package/lib/ecabs-date-time-range-picker/ecabs-date-time-range-picker.component.d.ts +58 -58
  116. package/lib/ecabs-date-time-range-picker/ecabs-date-time-range-picker.module.d.ts +20 -20
  117. package/lib/ecabs-date-time-range-picker/time-range.directive.d.ts +15 -15
  118. package/lib/ecabs-dialog-confirm/ecabs-dialog-confirm.component.d.ts +31 -31
  119. package/lib/ecabs-dialog-confirm/ecabs-dialog-confirm.module.d.ts +11 -11
  120. package/lib/ecabs-dialog-message/ecabs-dialog-message.component.d.ts +28 -28
  121. package/lib/ecabs-dialog-message/ecabs-dialog-message.module.d.ts +11 -11
  122. package/lib/ecabs-empty-placeholder/ecabs-empty-placeholder.component.d.ts +12 -12
  123. package/lib/ecabs-empty-placeholder/ecabs-empty-placeholder.module.d.ts +9 -9
  124. package/lib/ecabs-expansion-panel/ecabs-expansion-panel.component.d.ts +28 -28
  125. package/lib/ecabs-expansion-panel/ecabs-expansion-panel.module.d.ts +14 -14
  126. package/lib/ecabs-increment/ecabs-increment.component.d.ts +26 -26
  127. package/lib/ecabs-increment/ecabs-increment.module.d.ts +13 -13
  128. package/lib/ecabs-input/ecabs-input.component.d.ts +27 -27
  129. package/lib/ecabs-input/ecabs-input.module.d.ts +12 -12
  130. package/lib/ecabs-language-selector/ecabs-language-selector.component.d.ts +20 -20
  131. package/lib/ecabs-language-selector/ecabs-language-selector.module.d.ts +12 -12
  132. package/lib/ecabs-loading/ecabs-loading.component.d.ts +8 -8
  133. package/lib/ecabs-loading/ecabs-loading.module.d.ts +9 -9
  134. package/lib/ecabs-loading/spinner/spinner.component.d.ts +6 -6
  135. package/lib/ecabs-note/ecabs-note.component.d.ts +7 -7
  136. package/lib/ecabs-note/ecabs-note.module.d.ts +9 -9
  137. package/lib/ecabs-phone/ecabs-phone.component.d.ts +33 -33
  138. package/lib/ecabs-phone/ecabs-phone.module.d.ts +12 -12
  139. package/lib/ecabs-picker-header/ecabs-picker-header.component.d.ts +19 -19
  140. package/lib/ecabs-picker-header/ecabs-picker-header.module.d.ts +12 -12
  141. package/lib/ecabs-radio-button-list/ecabs-radio-button-list.component.d.ts +24 -24
  142. package/lib/ecabs-radio-button-list/ecabs-radio-button-list.module.d.ts +11 -11
  143. package/lib/ecabs-select/ecabs-select.component.d.ts +72 -71
  144. package/lib/ecabs-select/ecabs-select.module.d.ts +17 -15
  145. package/lib/ecabs-table/ecabs-table-filter-wrapper/ecabs-table-filter-wrapper.component.d.ts +8 -8
  146. package/lib/ecabs-table/ecabs-table-filter-wrapper/ecabs-table-filter-wrapper.module.d.ts +9 -9
  147. package/lib/ecabs-table/ecabs-table.component.d.ts +18 -18
  148. package/lib/ecabs-table/ecabs-table.module.d.ts +12 -12
  149. package/lib/ecabs-textarea/ecabs-textarea.component.d.ts +20 -20
  150. package/lib/ecabs-textarea/ecabs-textarea.module.d.ts +10 -10
  151. package/lib/ecabs-timepicker/componets/ecabs-time-list-panel/ecabs-time-list-panel.component.d.ts +40 -40
  152. package/lib/ecabs-timepicker/config.model.d.ts +5 -5
  153. package/lib/ecabs-timepicker/ecabs-timepicker.component.d.ts +53 -53
  154. package/lib/ecabs-timepicker/ecabs-timepicker.module.d.ts +10 -10
  155. package/lib/ecabs-timepicker/ecabs-timepicker.service.d.ts +12 -12
  156. package/lib/ecabs-validation/ecabs-validation.component.d.ts +10 -10
  157. package/lib/ecabs-validation/ecabs-validation.module.d.ts +9 -9
  158. package/lib/models/bread-crumb.d.ts +5 -5
  159. package/lib/models/timepicker.models.d.ts +6 -6
  160. package/lib/models/validation.models.d.ts +7 -7
  161. package/lib/services/ecabs-components.service.d.ts +16 -16
  162. package/package.json +1 -1
  163. package/public-api.d.ts +60 -58
@@ -1,312 +1,312 @@
1
- import { Component, Input, HostBinding, HostListener } from '@angular/core';
2
- import { NG_VALUE_ACCESSOR, NgControl } from '@angular/forms';
3
- import ElementBaseComponent from '../base/element-base';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "./ecabs-timepicker.service";
6
- import * as i2 from "@angular/common";
7
- import * as i3 from "../base/element-wrapper/element-wrapper.component";
8
- import * as i4 from "./componets/ecabs-time-list-panel/ecabs-time-list-panel.component";
9
- export class EcabsTimepickerComponent extends ElementBaseComponent {
10
- get data() {
11
- return this._data;
12
- }
13
- set data(value) {
14
- this._data = value;
15
- if (this._data.length === 5) {
16
- if (this._data === '23:59') {
17
- this.onChangeFn(this._data + (this.addSecond ? ':59' : ''));
18
- }
19
- else {
20
- this.onChangeFn(this._data + (this.addSecond ? ':00' : ''));
21
- }
22
- }
23
- else if (this._data === '') {
24
- this.onChangeFn(this._data);
25
- }
26
- }
27
- constructor(elementRef, timepickerService, injector) {
28
- super();
29
- this.elementRef = elementRef;
30
- this.timepickerService = timepickerService;
31
- this.injector = injector;
32
- this.showCloseIcon = true;
33
- this.focusedFlag = false;
34
- this.listPlacement = 'auto';
35
- this.showDayStart = true;
36
- this.showDayEnd = false;
37
- this.addSecond = true;
38
- this.position = {};
39
- this._data = '';
40
- this.listPosition = {};
41
- //eslint-disable-next-line @typescript-eslint/no-unused-vars, no-unused-vars, @typescript-eslint/no-empty-function
42
- this.onChangeFn = (_) => { };
43
- // eslint-disable-next-line @typescript-eslint/no-empty-function
44
- this.onTouchedFn = () => { };
45
- this.placeholder = '00:00';
46
- this._timePicker = this.elementRef.nativeElement;
47
- setTimeout(() => {
48
- this._input = this._timePicker.querySelector('input');
49
- });
50
- if (!this.iconClass) {
51
- this.iconClass = this.timepickerService.getConfig().iconClass;
52
- }
53
- }
54
- handleMousedown($event) {
55
- const target = $event.target;
56
- if (target.closest('.form-time-list') ||
57
- target.closest('.timeInputWrapper') === this._timePicker.querySelector('.timeInputWrapper')) {
58
- this._timePicker.querySelector('.timeInputWrapper').focus();
59
- return;
60
- }
61
- if (this.focusedFlag) {
62
- this.close();
63
- }
64
- }
65
- ngAfterViewInit() {
66
- const ngControl = this.injector.get(NgControl, null);
67
- if (ngControl) {
68
- this.control = ngControl.control;
69
- }
70
- }
71
- clearInput() {
72
- this.data = '';
73
- }
74
- calcListPosition() {
75
- const position = this._timePicker.querySelector('.timeInputFieldWrapper').getBoundingClientRect();
76
- if (this.appendTo) {
77
- this.listPosition = {
78
- left: position.x,
79
- top: position.top + position.height,
80
- width: position.width,
81
- };
82
- }
83
- else {
84
- this.listPosition = {
85
- left: 0,
86
- top: position.height,
87
- width: position.width,
88
- };
89
- }
90
- }
91
- inputKeyDown(event) {
92
- this.caretPositionStart = event.target.selectionStart;
93
- this.caretPositionEnd = event.target.selectionEnd;
94
- const key = event.key;
95
- this.setCaretPosition(this._input);
96
- switch (this.checkSpecialKeys(key, this.caretPositionStart, this.caretPositionEnd)) {
97
- case 'stop':
98
- return false;
99
- case 'tab':
100
- this.close();
101
- return false;
102
- case 'arrow':
103
- return false;
104
- }
105
- if (this.checkUnUsedKeys(key)) {
106
- return false;
107
- }
108
- const newData = this.data.slice(0, this.caretPositionStart) + key + this.data.slice(this.caretPositionStart, this.data.length);
109
- if (this.checkOutOfRangeNumber(newData)) {
110
- this.data = newData;
111
- this.caretPositionStart++;
112
- }
113
- if (this.caretPositionStart === this.data.length &&
114
- (this.data.length === 2 || (this.data.length === 1 && parseInt(this.data) > 2))) {
115
- this.makeHourFull();
116
- this.data += ':';
117
- this.caretPositionStart++;
118
- }
119
- return false;
120
- }
121
- checkSpecialKeys(key, selectionStart, selectionEnd) {
122
- if (selectionStart !== selectionEnd && key !== 'ArrowLeft' && key !== 'ArrowRight') {
123
- if (!(this.data.slice(selectionStart, selectionEnd).includes(':') && selectionEnd !== this.data.length)) {
124
- this.data = this.data.slice(0, selectionStart) + this.data.slice(selectionEnd, this.data.length);
125
- }
126
- }
127
- if (selectionStart === selectionEnd && key === 'Backspace') {
128
- if (this.data.length > 0) {
129
- if (this.data[selectionStart - 1] !== ':' ||
130
- (this.data[selectionStart - 1] === ':' && selectionStart === this.data.length)) {
131
- this.data = this.data.slice(0, selectionStart - 1) + this.data.slice(selectionEnd, this.data.length);
132
- this.caretPositionStart--;
133
- }
134
- }
135
- return 'stop';
136
- }
137
- if (key === 'Tab' || key === ' ' || key === ':') {
138
- if (!this.data.includes(':') && this.data.length > 0) {
139
- this.makeHourFull();
140
- this.data += ':';
141
- this.caretPositionStart++;
142
- return 'stop';
143
- }
144
- if (key === 'Tab') {
145
- return 'tab';
146
- }
147
- return 'stop';
148
- }
149
- if (key === 'ArrowRight') {
150
- if (this.caretPositionStart < this.data.length) {
151
- this.caretPositionStart++;
152
- }
153
- return 'arrow';
154
- }
155
- if (key === 'ArrowLeft') {
156
- if (this.caretPositionStart > 0) {
157
- this.caretPositionStart--;
158
- }
159
- return 'arrow';
160
- }
161
- if (key === 'ArrowDown' && !this.focusedFlag) {
162
- this.show();
163
- }
164
- return 'continue';
165
- }
166
- checkUnUsedKeys(key) {
167
- const r = new RegExp('[0-9]');
168
- return !r.test(key);
169
- }
170
- setCaretPosition(elem) {
171
- setTimeout(() => {
172
- if (elem !== null) {
173
- if (elem.createTextRange) {
174
- const range = elem.createTextRange();
175
- range.move('character', this.caretPositionStart);
176
- range.select();
177
- }
178
- else {
179
- if (elem.selectionStart) {
180
- elem.focus();
181
- elem.setSelectionRange(this.caretPositionStart, this.caretPositionStart);
182
- }
183
- else {
184
- elem.focus();
185
- }
186
- }
187
- }
188
- });
189
- }
190
- checkOutOfRangeNumber(time) {
191
- const hour = parseInt(time.split(':')[0], 10);
192
- let minute = -1;
193
- if (time.split(':').length > 1) {
194
- minute = parseInt(time.split(':')[1], 10);
195
- }
196
- if (hour < 24 && time.split(':')[0].length < 3 && minute < 60) {
197
- if (time.split(':').length > 1 && time.split(':')[1].length > 2) {
198
- return false;
199
- }
200
- return true;
201
- }
202
- return false;
203
- }
204
- makeHourFull() {
205
- const hourPart = this.data.split(':')[0];
206
- const minutePart = this.data.split(':').length > 1 ? this.data.split(':')[1] : '';
207
- if (hourPart.length === 1) {
208
- this.data = '0' + hourPart + (minutePart ? ':' + minutePart : minutePart);
209
- this.caretPositionStart++;
210
- }
211
- }
212
- makeMinuteFull() {
213
- const hourPart = this.data.split(':')[0];
214
- const minutePart = this.data.split(':').length > 1 ? this.data.split(':')[1] : '';
215
- if (minutePart.length === 0) {
216
- this.data = hourPart + ':00';
217
- this.caretPositionStart += 2;
218
- }
219
- if (minutePart.length === 1) {
220
- this.data = hourPart + ':' + minutePart + '0';
221
- this.caretPositionStart++;
222
- }
223
- }
224
- fixTimeToNearest() {
225
- if (this.data.length > 0) {
226
- this.makeHourFull();
227
- this.makeMinuteFull();
228
- }
229
- }
230
- registerOnChange(fn) {
231
- this.onChangeFn = fn;
232
- }
233
- registerOnTouched(fn) {
234
- this.onTouchedFn = fn;
235
- }
236
- setDisabledState(isDisabled) {
237
- this.disabled = isDisabled;
238
- }
239
- writeValue(obj) {
240
- if (obj) {
241
- obj = obj.toString();
242
- let temp = '';
243
- if (obj.split(':').length >= 2) {
244
- temp = obj.split(':')[0] + ':' + obj.split(':')[1];
245
- }
246
- this._data = temp;
247
- }
248
- else {
249
- this._data = '';
250
- }
251
- }
252
- onChange() {
253
- this.onChangeFn(this.data);
254
- }
255
- show() {
256
- this.calcListPosition();
257
- this.focusedFlag = true;
258
- }
259
- close(val = null) {
260
- if (val) {
261
- this.data = val;
262
- }
263
- else {
264
- this.fixTimeToNearest();
265
- }
266
- this.focusedFlag = false;
267
- this.control?.markAsTouched();
268
- }
269
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EcabsTimepickerComponent, deps: [{ token: i0.ElementRef }, { token: i1.FormTimePickerService }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component }); }
270
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: EcabsTimepickerComponent, selector: "ecabs-timepicker", inputs: { showCloseIcon: "showCloseIcon", focusedFlag: "focusedFlag", listPlacement: "listPlacement", appendTo: "appendTo", min: "min", max: "max", showDayStart: "showDayStart", showDayEnd: "showDayEnd", addSecond: "addSecond" }, host: { listeners: { "document:mousedown": "handleMousedown($event)" }, properties: { "class.form-timepicker-focused": "this.focusedFlag" } }, providers: [
271
- {
272
- provide: NG_VALUE_ACCESSOR,
273
- useExisting: EcabsTimepickerComponent,
274
- multi: true,
275
- },
276
- ], usesInheritance: true, ngImport: i0, template: "<div class=\"timeInputWrapper\" [ngClass]=\"{ disabled: disabled }\">\r\n <app-element-wrapper\r\n [data]=\"getData()\"\r\n [showCloseIcon]=\"showCloseIcon\"\r\n [focusedFlag]=\"focusedFlag\"\r\n (clear)=\"clearInput()\"\r\n >\r\n <div class=\"timeInputFieldWrapper\">\r\n <input\r\n type=\"text\"\r\n class=\"form-field__input\"\r\n [value]=\"data\"\r\n [disabled]=\"disabled\"\r\n (focus)=\"show()\"\r\n (click)=\"show()\"\r\n (keydown)=\"inputKeyDown($event)\"\r\n [placeholder]=\"placeholder\"\r\n />\r\n <div class=\"form-field__input--suffix\" *ngIf=\"type !== 'number'\">\r\n <ng-content select=\"mat-icon\"></ng-content>\r\n </div>\r\n <ecabs-time-list-panel\r\n [typedValue]=\"data\"\r\n *ngIf=\"focusedFlag\"\r\n [showDayStart]=\"showDayStart\"\r\n [showDayEnd]=\"showDayEnd\"\r\n [min]=\"min\"\r\n [max]=\"max\"\r\n class=\"form-time-list\"\r\n [appendTo]=\"appendTo\"\r\n [listPosition]=\"listPosition\"\r\n (closeMe)=\"close($event)\"\r\n ></ecabs-time-list-panel>\r\n </div>\r\n </app-element-wrapper>\r\n</div>\r\n", styles: [":host::ng-deep .timeInputWrapper app-element-wrapper .form-field{margin-bottom:0}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.ElementWrapperComponent, selector: "app-element-wrapper", inputs: ["data", "showCloseIcon", "focusedFlag", "showPassword", "control"], outputs: ["showHidePassword", "clear", "increase", "decrease"] }, { kind: "component", type: i4.EcabsTimeListPanelComponent, selector: "ecabs-time-list-panel", inputs: ["typedValue", "listPlacement", "listPosition", "appendTo", "min", "max", "showDayStart", "showDayEnd", "position"], outputs: ["onscroll", "closeMe"] }] }); }
277
- }
278
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EcabsTimepickerComponent, decorators: [{
279
- type: Component,
280
- args: [{ selector: 'ecabs-timepicker', providers: [
281
- {
282
- provide: NG_VALUE_ACCESSOR,
283
- useExisting: EcabsTimepickerComponent,
284
- multi: true,
285
- },
286
- ], template: "<div class=\"timeInputWrapper\" [ngClass]=\"{ disabled: disabled }\">\r\n <app-element-wrapper\r\n [data]=\"getData()\"\r\n [showCloseIcon]=\"showCloseIcon\"\r\n [focusedFlag]=\"focusedFlag\"\r\n (clear)=\"clearInput()\"\r\n >\r\n <div class=\"timeInputFieldWrapper\">\r\n <input\r\n type=\"text\"\r\n class=\"form-field__input\"\r\n [value]=\"data\"\r\n [disabled]=\"disabled\"\r\n (focus)=\"show()\"\r\n (click)=\"show()\"\r\n (keydown)=\"inputKeyDown($event)\"\r\n [placeholder]=\"placeholder\"\r\n />\r\n <div class=\"form-field__input--suffix\" *ngIf=\"type !== 'number'\">\r\n <ng-content select=\"mat-icon\"></ng-content>\r\n </div>\r\n <ecabs-time-list-panel\r\n [typedValue]=\"data\"\r\n *ngIf=\"focusedFlag\"\r\n [showDayStart]=\"showDayStart\"\r\n [showDayEnd]=\"showDayEnd\"\r\n [min]=\"min\"\r\n [max]=\"max\"\r\n class=\"form-time-list\"\r\n [appendTo]=\"appendTo\"\r\n [listPosition]=\"listPosition\"\r\n (closeMe)=\"close($event)\"\r\n ></ecabs-time-list-panel>\r\n </div>\r\n </app-element-wrapper>\r\n</div>\r\n", styles: [":host::ng-deep .timeInputWrapper app-element-wrapper .form-field{margin-bottom:0}\n"] }]
287
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.FormTimePickerService }, { type: i0.Injector }]; }, propDecorators: { showCloseIcon: [{
288
- type: Input
289
- }], focusedFlag: [{
290
- type: Input
291
- }, {
292
- type: HostBinding,
293
- args: ['class.form-timepicker-focused']
294
- }], listPlacement: [{
295
- type: Input
296
- }], appendTo: [{
297
- type: Input
298
- }], min: [{
299
- type: Input
300
- }], max: [{
301
- type: Input
302
- }], showDayStart: [{
303
- type: Input
304
- }], showDayEnd: [{
305
- type: Input
306
- }], addSecond: [{
307
- type: Input
308
- }], handleMousedown: [{
309
- type: HostListener,
310
- args: ['document:mousedown', ['$event']]
311
- }] } });
1
+ import { Component, Input, HostBinding, HostListener } from '@angular/core';
2
+ import { NG_VALUE_ACCESSOR, NgControl } from '@angular/forms';
3
+ import ElementBaseComponent from '../base/element-base';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "./ecabs-timepicker.service";
6
+ import * as i2 from "@angular/common";
7
+ import * as i3 from "../base/element-wrapper/element-wrapper.component";
8
+ import * as i4 from "./componets/ecabs-time-list-panel/ecabs-time-list-panel.component";
9
+ export class EcabsTimepickerComponent extends ElementBaseComponent {
10
+ get data() {
11
+ return this._data;
12
+ }
13
+ set data(value) {
14
+ this._data = value;
15
+ if (this._data.length === 5) {
16
+ if (this._data === '23:59') {
17
+ this.onChangeFn(this._data + (this.addSecond ? ':59' : ''));
18
+ }
19
+ else {
20
+ this.onChangeFn(this._data + (this.addSecond ? ':00' : ''));
21
+ }
22
+ }
23
+ else if (this._data === '') {
24
+ this.onChangeFn(this._data);
25
+ }
26
+ }
27
+ constructor(elementRef, timepickerService, injector) {
28
+ super();
29
+ this.elementRef = elementRef;
30
+ this.timepickerService = timepickerService;
31
+ this.injector = injector;
32
+ this.showCloseIcon = true;
33
+ this.focusedFlag = false;
34
+ this.listPlacement = 'auto';
35
+ this.showDayStart = true;
36
+ this.showDayEnd = false;
37
+ this.addSecond = true;
38
+ this.position = {};
39
+ this._data = '';
40
+ this.listPosition = {};
41
+ //eslint-disable-next-line @typescript-eslint/no-unused-vars, no-unused-vars, @typescript-eslint/no-empty-function
42
+ this.onChangeFn = (_) => { };
43
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
44
+ this.onTouchedFn = () => { };
45
+ this.placeholder = '00:00';
46
+ this._timePicker = this.elementRef.nativeElement;
47
+ setTimeout(() => {
48
+ this._input = this._timePicker.querySelector('input');
49
+ });
50
+ if (!this.iconClass) {
51
+ this.iconClass = this.timepickerService.getConfig().iconClass;
52
+ }
53
+ }
54
+ handleMousedown($event) {
55
+ const target = $event.target;
56
+ if (target.closest('.form-time-list') ||
57
+ target.closest('.timeInputWrapper') === this._timePicker.querySelector('.timeInputWrapper')) {
58
+ this._timePicker.querySelector('.timeInputWrapper').focus();
59
+ return;
60
+ }
61
+ if (this.focusedFlag) {
62
+ this.close();
63
+ }
64
+ }
65
+ ngAfterViewInit() {
66
+ const ngControl = this.injector.get(NgControl, null);
67
+ if (ngControl) {
68
+ this.control = ngControl.control;
69
+ }
70
+ }
71
+ clearInput() {
72
+ this.data = '';
73
+ }
74
+ calcListPosition() {
75
+ const position = this._timePicker.querySelector('.timeInputFieldWrapper').getBoundingClientRect();
76
+ if (this.appendTo) {
77
+ this.listPosition = {
78
+ left: position.x,
79
+ top: position.top + position.height,
80
+ width: position.width,
81
+ };
82
+ }
83
+ else {
84
+ this.listPosition = {
85
+ left: 0,
86
+ top: position.height,
87
+ width: position.width,
88
+ };
89
+ }
90
+ }
91
+ inputKeyDown(event) {
92
+ this.caretPositionStart = event.target.selectionStart;
93
+ this.caretPositionEnd = event.target.selectionEnd;
94
+ const key = event.key;
95
+ this.setCaretPosition(this._input);
96
+ switch (this.checkSpecialKeys(key, this.caretPositionStart, this.caretPositionEnd)) {
97
+ case 'stop':
98
+ return false;
99
+ case 'tab':
100
+ this.close();
101
+ return false;
102
+ case 'arrow':
103
+ return false;
104
+ }
105
+ if (this.checkUnUsedKeys(key)) {
106
+ return false;
107
+ }
108
+ const newData = this.data.slice(0, this.caretPositionStart) + key + this.data.slice(this.caretPositionStart, this.data.length);
109
+ if (this.checkOutOfRangeNumber(newData)) {
110
+ this.data = newData;
111
+ this.caretPositionStart++;
112
+ }
113
+ if (this.caretPositionStart === this.data.length &&
114
+ (this.data.length === 2 || (this.data.length === 1 && parseInt(this.data) > 2))) {
115
+ this.makeHourFull();
116
+ this.data += ':';
117
+ this.caretPositionStart++;
118
+ }
119
+ return false;
120
+ }
121
+ checkSpecialKeys(key, selectionStart, selectionEnd) {
122
+ if (selectionStart !== selectionEnd && key !== 'ArrowLeft' && key !== 'ArrowRight') {
123
+ if (!(this.data.slice(selectionStart, selectionEnd).includes(':') && selectionEnd !== this.data.length)) {
124
+ this.data = this.data.slice(0, selectionStart) + this.data.slice(selectionEnd, this.data.length);
125
+ }
126
+ }
127
+ if (selectionStart === selectionEnd && key === 'Backspace') {
128
+ if (this.data.length > 0) {
129
+ if (this.data[selectionStart - 1] !== ':' ||
130
+ (this.data[selectionStart - 1] === ':' && selectionStart === this.data.length)) {
131
+ this.data = this.data.slice(0, selectionStart - 1) + this.data.slice(selectionEnd, this.data.length);
132
+ this.caretPositionStart--;
133
+ }
134
+ }
135
+ return 'stop';
136
+ }
137
+ if (key === 'Tab' || key === ' ' || key === ':') {
138
+ if (!this.data.includes(':') && this.data.length > 0) {
139
+ this.makeHourFull();
140
+ this.data += ':';
141
+ this.caretPositionStart++;
142
+ return 'stop';
143
+ }
144
+ if (key === 'Tab') {
145
+ return 'tab';
146
+ }
147
+ return 'stop';
148
+ }
149
+ if (key === 'ArrowRight') {
150
+ if (this.caretPositionStart < this.data.length) {
151
+ this.caretPositionStart++;
152
+ }
153
+ return 'arrow';
154
+ }
155
+ if (key === 'ArrowLeft') {
156
+ if (this.caretPositionStart > 0) {
157
+ this.caretPositionStart--;
158
+ }
159
+ return 'arrow';
160
+ }
161
+ if (key === 'ArrowDown' && !this.focusedFlag) {
162
+ this.show();
163
+ }
164
+ return 'continue';
165
+ }
166
+ checkUnUsedKeys(key) {
167
+ const r = new RegExp('[0-9]');
168
+ return !r.test(key);
169
+ }
170
+ setCaretPosition(elem) {
171
+ setTimeout(() => {
172
+ if (elem !== null) {
173
+ if (elem.createTextRange) {
174
+ const range = elem.createTextRange();
175
+ range.move('character', this.caretPositionStart);
176
+ range.select();
177
+ }
178
+ else {
179
+ if (elem.selectionStart) {
180
+ elem.focus();
181
+ elem.setSelectionRange(this.caretPositionStart, this.caretPositionStart);
182
+ }
183
+ else {
184
+ elem.focus();
185
+ }
186
+ }
187
+ }
188
+ });
189
+ }
190
+ checkOutOfRangeNumber(time) {
191
+ const hour = parseInt(time.split(':')[0], 10);
192
+ let minute = -1;
193
+ if (time.split(':').length > 1) {
194
+ minute = parseInt(time.split(':')[1], 10);
195
+ }
196
+ if (hour < 24 && time.split(':')[0].length < 3 && minute < 60) {
197
+ if (time.split(':').length > 1 && time.split(':')[1].length > 2) {
198
+ return false;
199
+ }
200
+ return true;
201
+ }
202
+ return false;
203
+ }
204
+ makeHourFull() {
205
+ const hourPart = this.data.split(':')[0];
206
+ const minutePart = this.data.split(':').length > 1 ? this.data.split(':')[1] : '';
207
+ if (hourPart.length === 1) {
208
+ this.data = '0' + hourPart + (minutePart ? ':' + minutePart : minutePart);
209
+ this.caretPositionStart++;
210
+ }
211
+ }
212
+ makeMinuteFull() {
213
+ const hourPart = this.data.split(':')[0];
214
+ const minutePart = this.data.split(':').length > 1 ? this.data.split(':')[1] : '';
215
+ if (minutePart.length === 0) {
216
+ this.data = hourPart + ':00';
217
+ this.caretPositionStart += 2;
218
+ }
219
+ if (minutePart.length === 1) {
220
+ this.data = hourPart + ':' + minutePart + '0';
221
+ this.caretPositionStart++;
222
+ }
223
+ }
224
+ fixTimeToNearest() {
225
+ if (this.data.length > 0) {
226
+ this.makeHourFull();
227
+ this.makeMinuteFull();
228
+ }
229
+ }
230
+ registerOnChange(fn) {
231
+ this.onChangeFn = fn;
232
+ }
233
+ registerOnTouched(fn) {
234
+ this.onTouchedFn = fn;
235
+ }
236
+ setDisabledState(isDisabled) {
237
+ this.disabled = isDisabled;
238
+ }
239
+ writeValue(obj) {
240
+ if (obj) {
241
+ obj = obj.toString();
242
+ let temp = '';
243
+ if (obj.split(':').length >= 2) {
244
+ temp = obj.split(':')[0] + ':' + obj.split(':')[1];
245
+ }
246
+ this._data = temp;
247
+ }
248
+ else {
249
+ this._data = '';
250
+ }
251
+ }
252
+ onChange() {
253
+ this.onChangeFn(this.data);
254
+ }
255
+ show() {
256
+ this.calcListPosition();
257
+ this.focusedFlag = true;
258
+ }
259
+ close(val = null) {
260
+ if (val) {
261
+ this.data = val;
262
+ }
263
+ else {
264
+ this.fixTimeToNearest();
265
+ }
266
+ this.focusedFlag = false;
267
+ this.control?.markAsTouched();
268
+ }
269
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EcabsTimepickerComponent, deps: [{ token: i0.ElementRef }, { token: i1.FormTimePickerService }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component }); }
270
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: EcabsTimepickerComponent, selector: "ecabs-timepicker", inputs: { showCloseIcon: "showCloseIcon", focusedFlag: "focusedFlag", listPlacement: "listPlacement", appendTo: "appendTo", min: "min", max: "max", showDayStart: "showDayStart", showDayEnd: "showDayEnd", addSecond: "addSecond" }, host: { listeners: { "document:mousedown": "handleMousedown($event)" }, properties: { "class.form-timepicker-focused": "this.focusedFlag" } }, providers: [
271
+ {
272
+ provide: NG_VALUE_ACCESSOR,
273
+ useExisting: EcabsTimepickerComponent,
274
+ multi: true,
275
+ },
276
+ ], usesInheritance: true, ngImport: i0, template: "<div class=\"timeInputWrapper\" [ngClass]=\"{ disabled: disabled }\">\r\n <app-element-wrapper\r\n [data]=\"getData()\"\r\n [showCloseIcon]=\"showCloseIcon\"\r\n [focusedFlag]=\"focusedFlag\"\r\n (clear)=\"clearInput()\"\r\n >\r\n <div class=\"timeInputFieldWrapper\">\r\n <input\r\n type=\"text\"\r\n class=\"form-field__input\"\r\n [value]=\"data\"\r\n [disabled]=\"disabled\"\r\n (focus)=\"show()\"\r\n (click)=\"show()\"\r\n (keydown)=\"inputKeyDown($event)\"\r\n [placeholder]=\"placeholder\"\r\n />\r\n <div class=\"form-field__input--suffix\" *ngIf=\"type !== 'number'\">\r\n <ng-content select=\"mat-icon\"></ng-content>\r\n </div>\r\n <ecabs-time-list-panel\r\n [typedValue]=\"data\"\r\n *ngIf=\"focusedFlag\"\r\n [showDayStart]=\"showDayStart\"\r\n [showDayEnd]=\"showDayEnd\"\r\n [min]=\"min\"\r\n [max]=\"max\"\r\n class=\"form-time-list\"\r\n [appendTo]=\"appendTo\"\r\n [listPosition]=\"listPosition\"\r\n (closeMe)=\"close($event)\"\r\n ></ecabs-time-list-panel>\r\n </div>\r\n </app-element-wrapper>\r\n</div>\r\n", styles: [":host::ng-deep .timeInputWrapper app-element-wrapper .form-field{margin-bottom:0}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.ElementWrapperComponent, selector: "app-element-wrapper", inputs: ["data", "showCloseIcon", "focusedFlag", "showPassword", "control"], outputs: ["showHidePassword", "clear", "increase", "decrease"] }, { kind: "component", type: i4.EcabsTimeListPanelComponent, selector: "ecabs-time-list-panel", inputs: ["typedValue", "listPlacement", "listPosition", "appendTo", "min", "max", "showDayStart", "showDayEnd", "position"], outputs: ["onscroll", "closeMe"] }] }); }
277
+ }
278
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EcabsTimepickerComponent, decorators: [{
279
+ type: Component,
280
+ args: [{ selector: 'ecabs-timepicker', providers: [
281
+ {
282
+ provide: NG_VALUE_ACCESSOR,
283
+ useExisting: EcabsTimepickerComponent,
284
+ multi: true,
285
+ },
286
+ ], template: "<div class=\"timeInputWrapper\" [ngClass]=\"{ disabled: disabled }\">\r\n <app-element-wrapper\r\n [data]=\"getData()\"\r\n [showCloseIcon]=\"showCloseIcon\"\r\n [focusedFlag]=\"focusedFlag\"\r\n (clear)=\"clearInput()\"\r\n >\r\n <div class=\"timeInputFieldWrapper\">\r\n <input\r\n type=\"text\"\r\n class=\"form-field__input\"\r\n [value]=\"data\"\r\n [disabled]=\"disabled\"\r\n (focus)=\"show()\"\r\n (click)=\"show()\"\r\n (keydown)=\"inputKeyDown($event)\"\r\n [placeholder]=\"placeholder\"\r\n />\r\n <div class=\"form-field__input--suffix\" *ngIf=\"type !== 'number'\">\r\n <ng-content select=\"mat-icon\"></ng-content>\r\n </div>\r\n <ecabs-time-list-panel\r\n [typedValue]=\"data\"\r\n *ngIf=\"focusedFlag\"\r\n [showDayStart]=\"showDayStart\"\r\n [showDayEnd]=\"showDayEnd\"\r\n [min]=\"min\"\r\n [max]=\"max\"\r\n class=\"form-time-list\"\r\n [appendTo]=\"appendTo\"\r\n [listPosition]=\"listPosition\"\r\n (closeMe)=\"close($event)\"\r\n ></ecabs-time-list-panel>\r\n </div>\r\n </app-element-wrapper>\r\n</div>\r\n", styles: [":host::ng-deep .timeInputWrapper app-element-wrapper .form-field{margin-bottom:0}\n"] }]
287
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.FormTimePickerService }, { type: i0.Injector }]; }, propDecorators: { showCloseIcon: [{
288
+ type: Input
289
+ }], focusedFlag: [{
290
+ type: Input
291
+ }, {
292
+ type: HostBinding,
293
+ args: ['class.form-timepicker-focused']
294
+ }], listPlacement: [{
295
+ type: Input
296
+ }], appendTo: [{
297
+ type: Input
298
+ }], min: [{
299
+ type: Input
300
+ }], max: [{
301
+ type: Input
302
+ }], showDayStart: [{
303
+ type: Input
304
+ }], showDayEnd: [{
305
+ type: Input
306
+ }], addSecond: [{
307
+ type: Input
308
+ }], handleMousedown: [{
309
+ type: HostListener,
310
+ args: ['document:mousedown', ['$event']]
311
+ }] } });
312
312
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNhYnMtdGltZXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lY2Ficy1jb21wb25lbnRzL3NyYy9saWIvZWNhYnMtdGltZXBpY2tlci9lY2Ficy10aW1lcGlja2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VjYWJzLWNvbXBvbmVudHMvc3JjL2xpYi9lY2Ficy10aW1lcGlja2VyL2VjYWJzLXRpbWVwaWNrZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBdUMsTUFBTSxlQUFlLENBQUM7QUFDakgsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxTQUFTLEVBQXNCLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEcsT0FBTyxvQkFBb0IsTUFBTSxzQkFBc0IsQ0FBQzs7Ozs7O0FBZXhELE1BQU0sT0FBTyx3QkFBeUIsU0FBUSxvQkFBb0I7SUFtQmhFLElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBRUQsSUFBSSxJQUFJLENBQUUsS0FBVTtRQUNsQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRztZQUM3QixJQUFLLElBQUksQ0FBQyxLQUFLLEtBQUssT0FBTyxFQUFHO2dCQUM1QixJQUFJLENBQUMsVUFBVSxDQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBRSxDQUFFLENBQUM7YUFDakU7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLFVBQVUsQ0FBRSxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUUs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ZW50LCBJbnB1dCwgSG9zdEJpbmRpbmcsIEhvc3RMaXN0ZW5lciwgRWxlbWVudFJlZiwgSW5qZWN0b3IsIEFmdGVyVmlld0luaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SLCBOZ0NvbnRyb2wsIFVudHlwZWRGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgRm9ybVRpbWVQaWNrZXJTZXJ2aWNlIH0gZnJvbSAnLi9lY2Ficy10aW1lcGlja2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgRWxlbWVudEJhc2VDb21wb25lbnQgZnJvbSAnLi4vYmFzZS9lbGVtZW50LWJhc2UnO1xyXG5pbXBvcnQgeyBMaXN0UGxhY2VtZW50LCBMaXN0UG9zaXRpb24gfSBmcm9tICcuLi9tb2RlbHMvdGltZXBpY2tlci5tb2RlbHMnO1xyXG5cclxuQENvbXBvbmVudCgge1xyXG4gIHNlbGVjdG9yOiAnZWNhYnMtdGltZXBpY2tlcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2VjYWJzLXRpbWVwaWNrZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWyAnZWNhYnMtdGltZXBpY2tlci5jb21wb25lbnQuc2NzcycgXSxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICAgIHVzZUV4aXN0aW5nOiBFY2Fic1RpbWVwaWNrZXJDb21wb25lbnQsXHJcbiAgICAgIG11bHRpOiB0cnVlLFxyXG4gICAgfSxcclxuICBdLFxyXG59IClcclxuZXhwb3J0IGNsYXNzIEVjYWJzVGltZXBpY2tlckNvbXBvbmVudCBleHRlbmRzIEVsZW1lbnRCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEFmdGVyVmlld0luaXQge1xyXG4gIEBJbnB1dCgpIHNob3dDbG9zZUljb24gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIEBIb3N0QmluZGluZyggJ2NsYXNzLmZvcm0tdGltZXBpY2tlci1mb2N1c2VkJyApIGZvY3VzZWRGbGFnID0gZmFsc2U7XHJcbiAgQElucHV0KCkgbGlzdFBsYWNlbWVudDogTGlzdFBsYWNlbWVudCA9ICdhdXRvJztcclxuICBASW5wdXQoKSBhcHBlbmRUbyE6IHN0cmluZztcclxuICBASW5wdXQoKSBtaW4hOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgbWF4ITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHNob3dEYXlTdGFydCA9IHRydWU7XHJcbiAgQElucHV0KCkgc2hvd0RheUVuZCA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGFkZFNlY29uZCA9IHRydWU7XHJcblxyXG4gIHBvc2l0aW9uOiBMaXN0UG9zaXRpb24gPSB7fTtcclxuICBfZGF0YSA9ICcnO1xyXG4gIF90aW1lUGlja2VyO1xyXG4gIF9pbnB1dCE6IGFueTtcclxuICBsaXN0UG9zaXRpb246IExpc3RQb3NpdGlvbiA9IHt9O1xyXG4gIGNhcmV0UG9zaXRpb25TdGFydCE6IGFueTtcclxuICBjYXJldFBvc2l0aW9uRW5kITogYW55O1xyXG5cclxuICBnZXQgZGF0YSgpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RhdGE7XHJcbiAgfVxyXG5cclxuICBzZXQgZGF0YSggdmFsdWU6IGFueSApIHtcclxuICAgIHRoaXMuX2RhdGEgPSB2YWx1ZTtcclxuICAgIGlmICggdGhpcy5fZGF0YS5sZW5ndGggPT09IDUgKSB7XHJcbiAgICAgIGlmICggdGhpcy5fZGF0YSA9PT0gJzIzOjU5JyApIHtcclxuICAgICAgICB0aGlzLm9uQ2hhbmdlRm4oIHRoaXMuX2RhdGEgKyAoIHRoaXMuYWRkU2Vjb25kID8gJzo1OScgOiAnJyApICk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZUZuKCB0aGlzLl9kYXRhICsgKCB0aGlzLmFkZFNlY29uZCA/ICc6MDAnIDogJycgKSApO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKCB0aGlzLl9kYXRhID09PSAnJyApIHtcclxuICAgICAgdGhpcy5vbkNoYW5nZUZuKCB0aGlzLl9kYXRhICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcclxuICAgIHByaXZhdGUgdGltZXBpY2tlclNlcnZpY2U6IEZvcm1UaW1lUGlja2VyU2VydmljZSxcclxuICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yXHJcbiAgKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgdGhpcy5wbGFjZWhvbGRlciA9ICcwMDowMCc7XHJcbiAgICB0aGlzLl90aW1lUGlja2VyID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBzZXRUaW1lb3V0KCAoKSA9PiB7XHJcbiAgICAgIHRoaXMuX2lucHV0ID0gdGhpcy5fdGltZVBpY2tlci5xdWVyeVNlbGVjdG9yKCAnaW5wdXQnICk7XHJcbiAgICB9ICk7XHJcbiAgICBpZiAoICF0aGlzLmljb25DbGFzcyApIHtcclxuICAgICAgdGhpcy5pY29uQ2xhc3MgPSB0aGlzLnRpbWVwaWNrZXJTZXJ2aWNlLmdldENvbmZpZygpLmljb25DbGFzcztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoICdkb2N1bWVudDptb3VzZWRvd24nLCBbICckZXZlbnQnIF0gKVxyXG4gIGhhbmRsZU1vdXNlZG93biggJGV2ZW50OiBNb3VzZUV2ZW50ICk6IHZvaWQge1xyXG4gICAgY29uc3QgdGFyZ2V0ID0gJGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgIGlmIChcclxuICAgICAgdGFyZ2V0LmNsb3Nlc3QoICcuZm9ybS10aW1lLWxpc3QnICkgfHxcclxuICAgICAgdGFyZ2V0LmNsb3Nlc3QoICcudGltZUlucHV0V3JhcHBlcicgKSA9PT0gdGhpcy5fdGltZVBpY2tlci5xdWVyeVNlbGVjdG9yKCAnLnRpbWVJbnB1dFdyYXBwZXInIClcclxuICAgICkge1xyXG4gICAgICB0aGlzLl90aW1lUGlja2VyLnF1ZXJ5U2VsZWN0b3IoICcudGltZUlucHV0V3JhcHBlcicgKS5mb2N1cygpO1xyXG5cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKCB0aGlzLmZvY3VzZWRGbGFnICkge1xyXG4gICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICBjb25zdCBuZ0NvbnRyb2w6IE5nQ29udHJvbCA9IHRoaXMuaW5qZWN0b3IuZ2V0KCBOZ0NvbnRyb2wsIG51bGwgKSBhcyBOZ0NvbnRyb2w7XHJcbiAgICBpZiAoIG5nQ29udHJvbCApIHtcclxuICAgICAgdGhpcy5jb250cm9sID0gbmdDb250cm9sLmNvbnRyb2wgYXMgVW50eXBlZEZvcm1Db250cm9sO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2xlYXJJbnB1dCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGF0YSA9ICcnO1xyXG4gIH1cclxuXHJcbiAgY2FsY0xpc3RQb3NpdGlvbigpOiB2b2lkIHtcclxuICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5fdGltZVBpY2tlci5xdWVyeVNlbGVjdG9yKCAnLnRpbWVJbnB1dEZpZWxkV3JhcHBlcicgKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIGlmICggdGhpcy5hcHBlbmRUbyApIHtcclxuICAgICAgdGhpcy5saXN0UG9zaXRpb24gPSB7XHJcbiAgICAgICAgbGVmdDogcG9zaXRpb24ueCxcclxuICAgICAgICB0b3A6IHBvc2l0aW9uLnRvcCArIHBvc2l0aW9uLmhlaWdodCxcclxuICAgICAgICB3aWR0aDogcG9zaXRpb24ud2lkdGgsXHJcbiAgICAgIH07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmxpc3RQb3NpdGlvbiA9IHtcclxuICAgICAgICBsZWZ0OiAwLFxyXG4gICAgICAgIHRvcDogcG9zaXRpb24uaGVpZ2h0LFxyXG4gICAgICAgIHdpZHRoOiBwb3NpdGlvbi53aWR0aCxcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlucHV0S2V5RG93biggZXZlbnQ6IGFueSApOiBib29sZWFuIHtcclxuICAgIHRoaXMuY2FyZXRQb3NpdGlvblN0YXJ0ID0gZXZlbnQudGFyZ2V0LnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgdGhpcy5jYXJldFBvc2l0aW9uRW5kID0gZXZlbnQudGFyZ2V0LnNlbGVjdGlvbkVuZDtcclxuICAgIGNvbnN0IGtleSA9IGV2ZW50LmtleTtcclxuICAgIHRoaXMuc2V0Q2FyZXRQb3NpdGlvbiggdGhpcy5faW5wdXQgKTtcclxuICAgIHN3aXRjaCAoIHRoaXMuY2hlY2tTcGVjaWFsS2V5cygga2V5LCB0aGlzLmNhcmV0UG9zaXRpb25TdGFydCwgdGhpcy5jYXJldFBvc2l0aW9uRW5kICkgKSB7XHJcbiAgICAgIGNhc2UgJ3N0b3AnOlxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgIGNhc2UgJ3RhYic6XHJcbiAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICBjYXNlICdhcnJvdyc6XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICggdGhpcy5jaGVja1VuVXNlZEtleXMoIGtleSApICkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbmV3RGF0YSA9XHJcbiAgICAgIHRoaXMuZGF0YS5zbGljZSggMCwgdGhpcy5jYXJldFBvc2l0aW9uU3RhcnQgKSArIGtleSArIHRoaXMuZGF0YS5zbGljZSggdGhpcy5jYXJldFBvc2l0aW9uU3RhcnQsIHRoaXMuZGF0YS5sZW5ndGggKTtcclxuXHJcbiAgICBpZiAoIHRoaXMuY2hlY2tPdXRPZlJhbmdlTnVtYmVyKCBuZXdEYXRhICkgKSB7XHJcbiAgICAgIHRoaXMuZGF0YSA9IG5ld0RhdGE7XHJcbiAgICAgIHRoaXMuY2FyZXRQb3NpdGlvblN0YXJ0Kys7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLmNhcmV0UG9zaXRpb25TdGFydCA9PT0gdGhpcy5kYXRhLmxlbmd0aCAmJlxyXG4gICAgICAoIHRoaXMuZGF0YS5sZW5ndGggPT09IDIgfHwgKCB0aGlzLmRhdGEubGVuZ3RoID09PSAxICYmIHBhcnNlSW50KCB0aGlzLmRhdGEgKSA+IDIgKSApXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5tYWtlSG91ckZ1bGwoKTtcclxuICAgICAgdGhpcy5kYXRhICs9ICc6JztcclxuICAgICAgdGhpcy5jYXJldFBvc2l0aW9uU3RhcnQrKztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBjaGVja1NwZWNpYWxLZXlzKCBrZXk6IGFueSwgc2VsZWN0aW9uU3RhcnQ6IGFueSwgc2VsZWN0aW9uRW5kOiBhbnkgKTogJ3N0b3AnIHwgJ2NvbnRpbnVlJyB8ICd0YWInIHwgJ2Fycm93JyB7XHJcbiAgICBpZiAoIHNlbGVjdGlvblN0YXJ0ICE9PSBzZWxlY3Rpb25FbmQgJiYga2V5ICE9PSAnQXJyb3dMZWZ0JyAmJiBrZXkgIT09ICdBcnJvd1JpZ2h0JyApIHtcclxuICAgICAgaWYgKCAhKCB0aGlzLmRhdGEuc2xpY2UoIHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQgKS5pbmNsdWRlcyggJzonICkgJiYgc2VsZWN0aW9uRW5kICE9PSB0aGlzLmRhdGEubGVuZ3RoICkgKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gdGhpcy5kYXRhLnNsaWNlKCAwLCBzZWxlY3Rpb25TdGFydCApICsgdGhpcy5kYXRhLnNsaWNlKCBzZWxlY3Rpb25FbmQsIHRoaXMuZGF0YS5sZW5ndGggKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKCBzZWxlY3Rpb25TdGFydCA9PT0gc2VsZWN0aW9uRW5kICYmIGtleSA9PT0gJ0JhY2tzcGFjZScgKSB7XHJcbiAgICAgIGlmICggdGhpcy5kYXRhLmxlbmd0aCA+IDAgKSB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgdGhpcy5kYXRhWyBzZWxlY3Rpb25TdGFydCAtIDEgXSAhPT0gJzonIHx8XHJcbiAgICAgICAgICAoIHRoaXMuZGF0YVsgc2VsZWN0aW9uU3RhcnQgLSAxIF0gPT09ICc6JyAmJiBzZWxlY3Rpb25TdGFydCA9PT0gdGhpcy5kYXRhLmxlbmd0aCApXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICB0aGlzLmRhdGEgPSB0aGlzLmRhdGEuc2xpY2UoIDAsIHNlbGVjdGlvblN0YXJ0IC0gMSApICsgdGhpcy5kYXRhLnNsaWNlKCBzZWxlY3Rpb25FbmQsIHRoaXMuZGF0YS5sZW5ndGggKTtcclxuICAgICAgICAgIHRoaXMuY2FyZXRQb3NpdGlvblN0YXJ0LS07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gJ3N0b3AnO1xyXG4gICAgfVxyXG4gICAgaWYgKCBrZXkgPT09ICdUYWInIHx8IGtleSA9PT0gJyAnIHx8IGtleSA9PT0gJzonICkge1xyXG4gICAgICBpZiAoICF0aGlzLmRhdGEuaW5jbHVkZXMoICc6JyApICYmIHRoaXMuZGF0YS5sZW5ndGggPiAwICkge1xyXG4gICAgICAgIHRoaXMubWFrZUhvdXJGdWxsKCk7XHJcbiAgICAgICAgdGhpcy5kYXRhICs9ICc6JztcclxuICAgICAgICB0aGlzLmNhcmV0UG9zaXRpb25TdGFydCsrO1xyXG5cclxuICAgICAgICByZXR1cm4gJ3N0b3AnO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICgga2V5ID09PSAnVGFiJyApIHtcclxuICAgICAgICByZXR1cm4gJ3RhYic7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiAnc3RvcCc7XHJcbiAgICB9XHJcbiAgICBpZiAoIGtleSA9PT0gJ0Fycm93UmlnaHQnICkge1xyXG4gICAgICBpZiAoIHRoaXMuY2FyZXRQb3NpdGlvblN0YXJ0IDwgdGhpcy5kYXRhLmxlbmd0aCApIHtcclxuICAgICAgICB0aGlzLmNhcmV0UG9zaXRpb25TdGFydCsrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gJ2Fycm93JztcclxuICAgIH1cclxuICAgIGlmICgga2V5ID09PSAnQXJyb3dMZWZ0JyApIHtcclxuICAgICAgaWYgKCB0aGlzLmNhcmV0UG9zaXRpb25TdGFydCA+IDAgKSB7XHJcbiAgICAgICAgdGhpcy5jYXJldFBvc2l0aW9uU3RhcnQtLTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuICdhcnJvdyc7XHJcbiAgICB9XHJcbiAgICBpZiAoIGtleSA9PT0gJ0Fycm93RG93bicgJiYgIXRoaXMuZm9jdXNlZEZsYWcgKSB7XHJcbiAgICAgIHRoaXMuc2hvdygpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiAnY29udGludWUnO1xyXG4gIH1cclxuXHJcbiAgY2hlY2tVblVzZWRLZXlzKCBrZXk6IHN0cmluZyApOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHIgPSBuZXcgUmVnRXhwKCAnWzAtOV0nICk7XHJcblxyXG4gICAgcmV0dXJuICFyLnRlc3QoIGtleSApO1xyXG4gIH1cclxuXHJcbiAgc2V0Q2FyZXRQb3NpdGlvbiggZWxlbTogYW55ICk6IHZvaWQge1xyXG4gICAgc2V0VGltZW91dCggKCkgPT4ge1xyXG4gICAgICBpZiAoIGVsZW0gIT09IG51bGwgKSB7XHJcbiAgICAgICAgaWYgKCBlbGVtLmNyZWF0ZVRleHRSYW5nZSApIHtcclxuICAgICAgICAgIGNvbnN0IHJhbmdlID0gZWxlbS5jcmVhdGVUZXh0UmFuZ2UoKTtcclxuICAgICAgICAgIHJhbmdlLm1vdmUoICdjaGFyYWN0ZXInLCB0aGlzLmNhcmV0UG9zaXRpb25TdGFydCApO1xyXG4gICAgICAgICAgcmFuZ2Uuc2VsZWN0KCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGlmICggZWxlbS5zZWxlY3Rpb25TdGFydCApIHtcclxuICAgICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgICBlbGVtLnNldFNlbGVjdGlvblJhbmdlKCB0aGlzLmNhcmV0UG9zaXRpb25TdGFydCwgdGhpcy5jYXJldFBvc2l0aW9uU3RhcnQgKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGVsZW0uZm9jdXMoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gKTtcclxuICB9XHJcblxyXG4gIGNoZWNrT3V0T2ZSYW5nZU51bWJlciggdGltZTogYW55ICk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgaG91ciA9IHBhcnNlSW50KCB0aW1lLnNwbGl0KCAnOicgKVsgMCBdLCAxMCApO1xyXG4gICAgbGV0IG1pbnV0ZSA9IC0xO1xyXG4gICAgaWYgKCB0aW1lLnNwbGl0KCAnOicgKS5sZW5ndGggPiAxICkge1xyXG4gICAgICBtaW51dGUgPSBwYXJzZUludCggdGltZS5zcGxpdCggJzonIClbIDEgXSwgMTAgKTtcclxuICAgIH1cclxuICAgIGlmICggaG91ciA8IDI0ICYmIHRpbWUuc3BsaXQoICc6JyApWyAwIF0ubGVuZ3RoIDwgMyAmJiBtaW51dGUgPCA2MCApIHtcclxuICAgICAgaWYgKCB0aW1lLnNwbGl0KCAnOicgKS5sZW5ndGggPiAxICYmIHRpbWUuc3BsaXQoICc6JyApWyAxIF0ubGVuZ3RoID4gMiApIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIG1ha2VIb3VyRnVsbCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGhvdXJQYXJ0ID0gdGhpcy5kYXRhLnNwbGl0KCAnOicgKVsgMCBdO1xyXG4gICAgY29uc3QgbWludXRlUGFydCA9IHRoaXMuZGF0YS5zcGxpdCggJzonICkubGVuZ3RoID4gMSA/IHRoaXMuZGF0YS5zcGxpdCggJzonIClbIDEgXSA6ICcnO1xyXG4gICAgaWYgKCBob3VyUGFydC5sZW5ndGggPT09IDEgKSB7XHJcbiAgICAgIHRoaXMuZGF0YSA9ICcwJyArIGhvdXJQYXJ0ICsgKCBtaW51dGVQYXJ0ID8gJzonICsgbWludXRlUGFydCA6IG1pbnV0ZVBhcnQgKTtcclxuICAgICAgdGhpcy5jYXJldFBvc2l0aW9uU3RhcnQrKztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG1ha2VNaW51dGVGdWxsKCk6IHZvaWQge1xyXG4gICAgY29uc3QgaG91clBhcnQgPSB0aGlzLmRhdGEuc3BsaXQoICc6JyApWyAwIF07XHJcbiAgICBjb25zdCBtaW51dGVQYXJ0ID0gdGhpcy5kYXRhLnNwbGl0KCAnOicgKS5sZW5ndGggPiAxID8gdGhpcy5kYXRhLnNwbGl0KCAnOicgKVsgMSBdIDogJyc7XHJcbiAgICBpZiAoIG1pbnV0ZVBhcnQubGVuZ3RoID09PSAwICkge1xyXG4gICAgICB0aGlzLmRhdGEgPSBob3VyUGFydCArICc6MDAnO1xyXG4gICAgICB0aGlzLmNhcmV0UG9zaXRpb25TdGFydCArPSAyO1xyXG4gICAgfVxyXG4gICAgaWYgKCBtaW51dGVQYXJ0Lmxlbmd0aCA9PT0gMSApIHtcclxuICAgICAgdGhpcy5kYXRhID0gaG91clBhcnQgKyAnOicgKyBtaW51dGVQYXJ0ICsgJzAnO1xyXG4gICAgICB0aGlzLmNhcmV0UG9zaXRpb25TdGFydCsrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZml4VGltZVRvTmVhcmVzdCgpOiB2b2lkIHtcclxuICAgIGlmICggdGhpcy5kYXRhLmxlbmd0aCA+IDAgKSB7XHJcbiAgICAgIHRoaXMubWFrZUhvdXJGdWxsKCk7XHJcbiAgICAgIHRoaXMubWFrZU1pbnV0ZUZ1bGwoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycywgbm8tdW51c2VkLXZhcnMsIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxyXG4gIHB1YmxpYyBvbkNoYW5nZUZuID0gKCBfOiBhbnkgKTogdm9pZCA9PiB7IH07XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxyXG4gIHB1YmxpYyBvblRvdWNoZWRGbiA9ICgpOiB2b2lkID0+IHsgfTtcclxuXHJcbiAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoIGZuOiBhbnkgKTogdm9pZCB7XHJcbiAgICB0aGlzLm9uQ2hhbmdlRm4gPSBmbjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZCggZm46IGFueSApOiB2b2lkIHtcclxuICAgIHRoaXMub25Ub3VjaGVkRm4gPSBmbjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXREaXNhYmxlZFN0YXRlKCBpc0Rpc2FibGVkOiBib29sZWFuICk6IHZvaWQge1xyXG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgd3JpdGVWYWx1ZSggb2JqOiBhbnkgKTogdm9pZCB7XHJcbiAgICBpZiAoIG9iaiApIHtcclxuICAgICAgb2JqID0gb2JqLnRvU3RyaW5nKCk7XHJcbiAgICAgIGxldCB0ZW1wID0gJyc7XHJcbiAgICAgIGlmICggb2JqLnNwbGl0KCAnOicgKS5sZW5ndGggPj0gMiApIHtcclxuICAgICAgICB0ZW1wID0gb2JqLnNwbGl0KCAnOicgKVsgMCBdICsgJzonICsgb2JqLnNwbGl0KCAnOicgKVsgMSBdO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX2RhdGEgPSB0ZW1wO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fZGF0YSA9ICcnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQ2hhbmdlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5vbkNoYW5nZUZuKCB0aGlzLmRhdGEgKTtcclxuICB9XHJcblxyXG4gIHNob3coKTogdm9pZCB7XHJcbiAgICB0aGlzLmNhbGNMaXN0UG9zaXRpb24oKTtcclxuICAgIHRoaXMuZm9jdXNlZEZsYWcgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgY2xvc2UoIHZhbCA9IG51bGwgKTogdm9pZCB7XHJcbiAgICBpZiAoIHZhbCApIHtcclxuICAgICAgdGhpcy5kYXRhID0gdmFsO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5maXhUaW1lVG9OZWFyZXN0KCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmZvY3VzZWRGbGFnID0gZmFsc2U7XHJcbiAgICB0aGlzLmNvbnRyb2w/Lm1hcmtBc1RvdWNoZWQoKTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cInRpbWVJbnB1dFdyYXBwZXJcIiBbbmdDbGFzc109XCJ7IGRpc2FibGVkOiBkaXNhYmxlZCB9XCI+XHJcbiAgPGFwcC1lbGVtZW50LXdyYXBwZXJcclxuICAgIFtkYXRhXT1cImdldERhdGEoKVwiXHJcbiAgICBbc2hvd0Nsb3NlSWNvbl09XCJzaG93Q2xvc2VJY29uXCJcclxuICAgIFtmb2N1c2VkRmxhZ109XCJmb2N1c2VkRmxhZ1wiXHJcbiAgICAoY2xlYXIpPVwiY2xlYXJJbnB1dCgpXCJcclxuICA+XHJcbiAgICA8ZGl2IGNsYXNzPVwidGltZUlucHV0RmllbGRXcmFwcGVyXCI+XHJcbiAgICAgIDxpbnB1dFxyXG4gICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICBjbGFzcz1cImZvcm0tZmllbGRfX2lucHV0XCJcclxuICAgICAgICBbdmFsdWVdPVwiZGF0YVwiXHJcbiAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgICAgICAoZm9jdXMpPVwic2hvdygpXCJcclxuICAgICAgICAoY2xpY2spPVwic2hvdygpXCJcclxuICAgICAgICAoa2V5ZG93bik9XCJpbnB1dEtleURvd24oJGV2ZW50KVwiXHJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcclxuICAgICAgLz5cclxuICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGRfX2lucHV0LS1zdWZmaXhcIiAqbmdJZj1cInR5cGUgIT09ICdudW1iZXInXCI+XHJcbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwibWF0LWljb25cIj48L25nLWNvbnRlbnQ+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZWNhYnMtdGltZS1saXN0LXBhbmVsXHJcbiAgICAgICAgW3R5cGVkVmFsdWVdPVwiZGF0YVwiXHJcbiAgICAgICAgKm5nSWY9XCJmb2N1c2VkRmxhZ1wiXHJcbiAgICAgICAgW3Nob3dEYXlTdGFydF09XCJzaG93RGF5U3RhcnRcIlxyXG4gICAgICAgIFtzaG93RGF5RW5kXT1cInNob3dEYXlFbmRcIlxyXG4gICAgICAgIFttaW5dPVwibWluXCJcclxuICAgICAgICBbbWF4XT1cIm1heFwiXHJcbiAgICAgICAgY2xhc3M9XCJmb3JtLXRpbWUtbGlzdFwiXHJcbiAgICAgICAgW2FwcGVuZFRvXT1cImFwcGVuZFRvXCJcclxuICAgICAgICBbbGlzdFBvc2l0aW9uXT1cImxpc3RQb3NpdGlvblwiXHJcbiAgICAgICAgKGNsb3NlTWUpPVwiY2xvc2UoJGV2ZW50KVwiXHJcbiAgICAgID48L2VjYWJzLXRpbWUtbGlzdC1wYW5lbD5cclxuICAgIDwvZGl2PlxyXG4gIDwvYXBwLWVsZW1lbnQtd3JhcHBlcj5cclxuPC9kaXY+XHJcbiJdfQ==