design-angular-kit 1.0.0-1 → 1.0.0-11

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 (229) hide show
  1. package/README.md +183 -24
  2. package/assets/i18n/en.json +97 -0
  3. package/assets/i18n/it.json +97 -0
  4. package/esm2020/lib/abstracts/abstract-form.component.mjs +171 -0
  5. package/esm2020/lib/abstracts/abstract.component.mjs +45 -0
  6. package/esm2020/lib/components/components.module.mjs +256 -0
  7. package/esm2020/lib/components/core/accordion/accordion.component.mjs +31 -0
  8. package/esm2020/lib/components/core/alert/alert.component.mjs +69 -0
  9. package/esm2020/lib/components/core/badge/badge.directive.mjs +34 -0
  10. package/esm2020/lib/components/core/button/button.directive.mjs +80 -0
  11. package/esm2020/lib/components/core/callout/callout.component.mjs +84 -0
  12. package/esm2020/lib/components/core/card/card.component.mjs +58 -0
  13. package/esm2020/lib/components/core/carousel/carousel/carousel.component.mjs +79 -0
  14. package/esm2020/lib/components/core/carousel/carousel-item/carousel-item.component.mjs +15 -0
  15. package/esm2020/lib/components/core/chip/chip.component.mjs +89 -0
  16. package/esm2020/lib/components/core/collapse/collapse.component.mjs +101 -0
  17. package/esm2020/lib/components/core/dimmer/dimmer-buttons/dimmer-buttons.component.mjs +24 -0
  18. package/esm2020/lib/components/core/dimmer/dimmer-icon/dimmer-icon.component.mjs +11 -0
  19. package/esm2020/lib/components/core/dimmer/dimmer.component.mjs +59 -0
  20. package/esm2020/lib/components/core/dropdown/dropdown/dropdown.component.mjs +130 -0
  21. package/esm2020/lib/components/core/dropdown/dropdown-item/dropdown-item.component.mjs +68 -0
  22. package/esm2020/lib/components/core/forward/forward.directive.mjs +51 -0
  23. package/esm2020/lib/components/core/link/link.component.mjs +40 -0
  24. package/esm2020/lib/components/core/list/list/list.component.mjs +13 -0
  25. package/esm2020/lib/components/core/list/list-item/list-item.component.mjs +36 -0
  26. package/esm2020/lib/components/core/modal/modal.component.mjs +98 -0
  27. package/esm2020/lib/components/core/notifications/notifications.component.mjs +110 -0
  28. package/esm2020/lib/components/core/pagination/pagination.component.mjs +131 -0
  29. package/esm2020/lib/components/core/popover/popover.directive.mjs +179 -0
  30. package/esm2020/lib/components/core/progress-bar/progress-bar.component.mjs +34 -0
  31. package/esm2020/lib/components/core/progress-button/progress-button.component.mjs +27 -0
  32. package/esm2020/lib/components/core/rating/rating.component.mjs +49 -0
  33. package/esm2020/lib/components/core/spinner/spinner.component.mjs +35 -0
  34. package/esm2020/lib/components/core/steppers/steppers-container/steppers-container.component.mjs +127 -0
  35. package/esm2020/lib/components/core/steppers/steppers-item/steppers-item.component.mjs +19 -0
  36. package/esm2020/lib/components/core/tab/tab-container/tab-container.component.mjs +59 -0
  37. package/esm2020/lib/components/core/tab/tab-item/tab-item.component.mjs +36 -0
  38. package/esm2020/lib/components/core/table/table.component.mjs +57 -0
  39. package/esm2020/lib/components/core/tooltip/tooltip.directive.mjs +143 -0
  40. package/esm2020/lib/components/form/checkbox/checkbox.component.mjs +40 -0
  41. package/esm2020/lib/components/form/input/input.component.mjs +222 -0
  42. package/esm2020/lib/components/form/password-input/password-input.component.mjs +112 -0
  43. package/esm2020/lib/components/form/radio-button/radio-button.component.mjs +68 -0
  44. package/esm2020/lib/components/form/select/select.component.mjs +62 -0
  45. package/esm2020/lib/components/form/textarea/textarea.component.mjs +46 -0
  46. package/esm2020/lib/components/form/upload-drag-drop/upload-drag-drop.component.mjs +139 -0
  47. package/esm2020/lib/components/form/upload-file-list/upload-file-list.component.mjs +104 -0
  48. package/esm2020/lib/components/navigation/back-button/back-button.component.mjs +69 -0
  49. package/esm2020/lib/components/navigation/back-to-top/back-to-top.component.mjs +64 -0
  50. package/esm2020/lib/components/navigation/breadcrumbs/breadcrumb/breadcrumb.component.mjs +56 -0
  51. package/esm2020/lib/components/navigation/breadcrumbs/breadcrumb-item/breadcrumb-item.component.mjs +23 -0
  52. package/esm2020/lib/components/navigation/header/header.component.mjs +57 -0
  53. package/esm2020/lib/components/utils/icon/icon.component.mjs +54 -0
  54. package/esm2020/lib/components/utils/language-switcher/language-switcher.component.mjs +39 -0
  55. package/esm2020/lib/components/utils/not-found-page/not-found-page.component.mjs +13 -0
  56. package/esm2020/lib/design-angular-kit.module.mjs +45 -131
  57. package/esm2020/lib/interfaces/core.mjs +16 -0
  58. package/esm2020/lib/interfaces/form.mjs +2 -0
  59. package/esm2020/lib/interfaces/icon.mjs +2 -0
  60. package/esm2020/lib/interfaces/utils.mjs +2 -0
  61. package/esm2020/lib/pipes/mark-matching-text.pipe.mjs +36 -0
  62. package/esm2020/lib/services/notifications/notifications.service.mjs +120 -0
  63. package/esm2020/lib/utils/boolean-input.mjs +15 -0
  64. package/esm2020/lib/utils/file-utils.mjs +73 -0
  65. package/esm2020/lib/utils/regex.mjs +26 -0
  66. package/esm2020/lib/validators/it-validators.mjs +134 -0
  67. package/esm2020/public_api.mjs +67 -36
  68. package/fesm2015/design-angular-kit.mjs +3550 -2712
  69. package/fesm2015/design-angular-kit.mjs.map +1 -1
  70. package/fesm2020/design-angular-kit.mjs +3519 -2722
  71. package/fesm2020/design-angular-kit.mjs.map +1 -1
  72. package/lib/abstracts/abstract-form.component.d.ts +86 -0
  73. package/lib/abstracts/abstract.component.d.ts +30 -0
  74. package/lib/components/components.module.d.ts +60 -0
  75. package/lib/components/core/accordion/accordion.component.d.ts +12 -0
  76. package/lib/components/core/alert/alert.component.d.ts +39 -0
  77. package/lib/components/core/badge/badge.directive.d.ts +16 -0
  78. package/lib/components/core/button/button.directive.d.ts +36 -0
  79. package/lib/components/core/callout/callout.component.d.ts +47 -0
  80. package/lib/components/core/card/card.component.d.ts +41 -0
  81. package/lib/components/core/carousel/carousel/carousel.component.d.ts +50 -0
  82. package/lib/components/core/carousel/carousel-item/carousel-item.component.d.ts +11 -0
  83. package/lib/components/core/chip/chip.component.d.ts +62 -0
  84. package/lib/components/core/collapse/collapse.component.d.ts +60 -0
  85. package/lib/components/core/dimmer/dimmer-buttons/dimmer-buttons.component.d.ts +12 -0
  86. package/lib/components/core/dimmer/dimmer-icon/dimmer-icon.component.d.ts +5 -0
  87. package/lib/components/core/dimmer/dimmer.component.d.ts +24 -0
  88. package/lib/components/core/dropdown/dropdown/dropdown.component.d.ts +81 -0
  89. package/lib/components/core/dropdown/dropdown-item/dropdown-item.component.d.ts +39 -0
  90. package/lib/components/core/forward/forward.directive.d.ts +14 -0
  91. package/lib/components/core/link/link.component.d.ts +31 -0
  92. package/lib/components/core/list/list/list.component.d.ts +10 -0
  93. package/lib/components/core/list/list-item/list-item.component.d.ts +24 -0
  94. package/lib/components/core/modal/modal.component.d.ts +59 -0
  95. package/lib/components/core/notifications/notifications.component.d.ts +44 -0
  96. package/lib/components/core/pagination/pagination.component.d.ts +92 -0
  97. package/lib/components/core/popover/popover.directive.d.ts +98 -0
  98. package/lib/components/core/progress-bar/progress-bar.component.d.ts +28 -0
  99. package/lib/components/core/progress-button/progress-button.component.d.ts +22 -0
  100. package/lib/components/core/rating/rating.component.d.ts +24 -0
  101. package/lib/components/core/spinner/spinner.component.d.ts +21 -0
  102. package/lib/components/core/steppers/steppers-container/steppers-container.component.d.ts +104 -0
  103. package/lib/components/core/steppers/steppers-item/steppers-item.component.d.ts +20 -0
  104. package/lib/components/core/tab/tab-container/tab-container.component.d.ts +30 -0
  105. package/lib/components/core/tab/tab-item/tab-item.component.d.ts +34 -0
  106. package/lib/components/core/table/table.component.d.ts +54 -0
  107. package/lib/components/core/tooltip/tooltip.directive.d.ts +81 -0
  108. package/lib/components/form/checkbox/checkbox.component.d.ts +30 -0
  109. package/lib/components/form/input/input.component.d.ts +96 -0
  110. package/lib/components/form/password-input/password-input.component.d.ts +55 -0
  111. package/lib/components/form/radio-button/radio-button.component.d.ts +29 -0
  112. package/lib/components/form/select/select.component.d.ts +30 -0
  113. package/lib/components/form/textarea/textarea.component.d.ts +24 -0
  114. package/lib/components/form/upload-drag-drop/upload-drag-drop.component.d.ts +54 -0
  115. package/lib/components/form/upload-file-list/upload-file-list.component.d.ts +59 -0
  116. package/lib/components/navigation/back-button/back-button.component.d.ts +47 -0
  117. package/lib/components/navigation/back-to-top/back-to-top.component.d.ts +41 -0
  118. package/lib/components/navigation/breadcrumbs/breadcrumb/breadcrumb.component.d.ts +32 -0
  119. package/lib/components/navigation/breadcrumbs/breadcrumb-item/breadcrumb-item.component.d.ts +22 -0
  120. package/lib/components/navigation/header/header.component.d.ts +24 -0
  121. package/lib/components/utils/icon/icon.component.d.ts +40 -0
  122. package/lib/components/utils/language-switcher/language-switcher.component.d.ts +23 -0
  123. package/lib/components/utils/not-found-page/not-found-page.component.d.ts +5 -0
  124. package/lib/design-angular-kit.module.d.ts +7 -24
  125. package/lib/interfaces/core.d.ts +59 -0
  126. package/lib/interfaces/form.d.ts +67 -0
  127. package/lib/interfaces/icon.d.ts +3 -0
  128. package/lib/interfaces/utils.d.ts +10 -0
  129. package/lib/services/notifications/notifications.service.d.ts +63 -0
  130. package/lib/utils/boolean-input.d.ts +11 -0
  131. package/lib/utils/file-utils.d.ts +32 -0
  132. package/lib/utils/regex.d.ts +25 -0
  133. package/lib/validators/it-validators.d.ts +58 -0
  134. package/package.json +22 -13
  135. package/public_api.d.ts +59 -35
  136. package/esm2020/lib/badge/badge.directive.mjs +0 -83
  137. package/esm2020/lib/breadcrumb/breadcrumb-item.component.mjs +0 -66
  138. package/esm2020/lib/breadcrumb/breadcrumb.component.mjs +0 -89
  139. package/esm2020/lib/button/button.directive.mjs +0 -185
  140. package/esm2020/lib/button/button.module.mjs +0 -18
  141. package/esm2020/lib/checkbox/checkbox.component.mjs +0 -138
  142. package/esm2020/lib/collapse/collapse-group.component.mjs +0 -57
  143. package/esm2020/lib/collapse/collapse-item.component.mjs +0 -79
  144. package/esm2020/lib/collapse/collapse.config.mjs +0 -12
  145. package/esm2020/lib/collapse/collapse.directive.mjs +0 -55
  146. package/esm2020/lib/collapse/collapse.module.mjs +0 -22
  147. package/esm2020/lib/dropdown/dropdown-divider.component.mjs +0 -11
  148. package/esm2020/lib/dropdown/dropdown-item.component.mjs +0 -97
  149. package/esm2020/lib/dropdown/dropdown.component.mjs +0 -143
  150. package/esm2020/lib/dropdown/dropdown.config.mjs +0 -12
  151. package/esm2020/lib/dropdown/dropdown.directive.mjs +0 -156
  152. package/esm2020/lib/dropdown/dropdown.module.mjs +0 -25
  153. package/esm2020/lib/enums/icons.enum.mjs +0 -27
  154. package/esm2020/lib/form-input/form-input-password.utils.mjs +0 -154
  155. package/esm2020/lib/form-input/form-input.component.mjs +0 -495
  156. package/esm2020/lib/form-input/it-prefix.directive.mjs +0 -13
  157. package/esm2020/lib/form-input/it-suffix.directive.mjs +0 -13
  158. package/esm2020/lib/form-input/it-text-prefix.directive.mjs +0 -13
  159. package/esm2020/lib/form-input/it-text-suffix.directive.mjs +0 -13
  160. package/esm2020/lib/form-input/mark-matching-text.pipe.mjs +0 -36
  161. package/esm2020/lib/icon/icon.component.mjs +0 -87
  162. package/esm2020/lib/icon/icon.module.mjs +0 -18
  163. package/esm2020/lib/models/Alignment.mjs +0 -15
  164. package/esm2020/lib/models/ButtonSize.mjs +0 -15
  165. package/esm2020/lib/models/InputType.mjs +0 -44
  166. package/esm2020/lib/models/ThemeColor.mjs +0 -30
  167. package/esm2020/lib/popover/popover.config.mjs +0 -17
  168. package/esm2020/lib/popover/popover.directive.mjs +0 -33
  169. package/esm2020/lib/popover/popover.module.mjs +0 -19
  170. package/esm2020/lib/progress-bar/progress-bar.component.mjs +0 -98
  171. package/esm2020/lib/radio/radio.component.mjs +0 -287
  172. package/esm2020/lib/radio/unique-selection-dispatcher.mjs +0 -55
  173. package/esm2020/lib/tabs/tab-group.component.mjs +0 -177
  174. package/esm2020/lib/tabs/tab.component.mjs +0 -73
  175. package/esm2020/lib/tabs/tabs.module.mjs +0 -20
  176. package/esm2020/lib/toggle/toggle.component.mjs +0 -86
  177. package/esm2020/lib/tooltip/tooltip.config.mjs +0 -17
  178. package/esm2020/lib/tooltip/tooltip.directive.mjs +0 -43
  179. package/esm2020/lib/tooltip/tooltip.module.mjs +0 -19
  180. package/esm2020/lib/util/focus-mouse.directive.mjs +0 -32
  181. package/esm2020/lib/util/util.mjs +0 -12
  182. package/esm2020/lib/util/utils.module.mjs +0 -16
  183. package/lib/badge/badge.directive.d.ts +0 -33
  184. package/lib/breadcrumb/breadcrumb-item.component.d.ts +0 -33
  185. package/lib/breadcrumb/breadcrumb.component.d.ts +0 -33
  186. package/lib/button/button.directive.d.ts +0 -72
  187. package/lib/button/button.module.d.ts +0 -8
  188. package/lib/checkbox/checkbox.component.d.ts +0 -61
  189. package/lib/collapse/collapse-group.component.d.ts +0 -16
  190. package/lib/collapse/collapse-item.component.d.ts +0 -46
  191. package/lib/collapse/collapse.config.d.ts +0 -6
  192. package/lib/collapse/collapse.directive.d.ts +0 -25
  193. package/lib/collapse/collapse.module.d.ts +0 -12
  194. package/lib/dropdown/dropdown-divider.component.d.ts +0 -5
  195. package/lib/dropdown/dropdown-item.component.d.ts +0 -56
  196. package/lib/dropdown/dropdown.component.d.ts +0 -65
  197. package/lib/dropdown/dropdown.config.d.ts +0 -6
  198. package/lib/dropdown/dropdown.directive.d.ts +0 -77
  199. package/lib/dropdown/dropdown.module.d.ts +0 -15
  200. package/lib/enums/icons.enum.d.ts +0 -23
  201. package/lib/form-input/form-input-password.utils.d.ts +0 -45
  202. package/lib/form-input/form-input.component.d.ts +0 -283
  203. package/lib/form-input/it-prefix.directive.d.ts +0 -5
  204. package/lib/form-input/it-suffix.directive.d.ts +0 -5
  205. package/lib/form-input/it-text-prefix.directive.d.ts +0 -5
  206. package/lib/form-input/it-text-suffix.directive.d.ts +0 -5
  207. package/lib/icon/icon.component.d.ts +0 -34
  208. package/lib/icon/icon.module.d.ts +0 -8
  209. package/lib/models/Alignment.d.ts +0 -12
  210. package/lib/models/ButtonSize.d.ts +0 -11
  211. package/lib/models/InputType.d.ts +0 -36
  212. package/lib/models/ThemeColor.d.ts +0 -21
  213. package/lib/popover/popover.config.d.ts +0 -11
  214. package/lib/popover/popover.directive.d.ts +0 -20
  215. package/lib/popover/popover.module.d.ts +0 -9
  216. package/lib/progress-bar/progress-bar.component.d.ts +0 -55
  217. package/lib/radio/radio.component.d.ts +0 -116
  218. package/lib/radio/unique-selection-dispatcher.d.ts +0 -36
  219. package/lib/tabs/tab-group.component.d.ts +0 -71
  220. package/lib/tabs/tab.component.d.ts +0 -44
  221. package/lib/tabs/tabs.module.d.ts +0 -10
  222. package/lib/toggle/toggle.component.d.ts +0 -46
  223. package/lib/tooltip/tooltip.config.d.ts +0 -11
  224. package/lib/tooltip/tooltip.directive.d.ts +0 -27
  225. package/lib/tooltip/tooltip.module.d.ts +0 -9
  226. package/lib/util/focus-mouse.directive.d.ts +0 -13
  227. package/lib/util/util.d.ts +0 -5
  228. package/lib/util/utils.module.d.ts +0 -7
  229. /package/lib/{form-input → pipes}/mark-matching-text.pipe.d.ts +0 -0
@@ -0,0 +1,143 @@
1
+ import { Directive, EventEmitter, Input, Output } from '@angular/core';
2
+ import { isTrueBooleanInput } from '../../../utils/boolean-input';
3
+ import { Tooltip } from 'bootstrap-italia';
4
+ import * as i0 from "@angular/core";
5
+ export class TooltipDirective {
6
+ constructor(_elementRef) {
7
+ this._elementRef = _elementRef;
8
+ /**
9
+ * This event fires immediately when the show method is called.
10
+ */
11
+ this.onShow = new EventEmitter();
12
+ /**
13
+ * This event is triggered when the tooltip has been made visible to the user (it will wait for the CSS transitions to complete).
14
+ */
15
+ this.onShown = new EventEmitter();
16
+ /**
17
+ * This event fires immediately when the hide method is called.
18
+ */
19
+ this.onHide = new EventEmitter();
20
+ /**
21
+ * This event is raised when the tooltip has finished being hidden from the user (it will wait for the CSS transitions to complete).
22
+ */
23
+ this.onHidden = new EventEmitter();
24
+ /**
25
+ * This event fires after the show event when the tooltip template has been added to the DOM.
26
+ */
27
+ this.onInserted = new EventEmitter();
28
+ this.element = this._elementRef.nativeElement;
29
+ }
30
+ /**
31
+ * Define the tooltip title
32
+ * @param title the tooltip title
33
+ */
34
+ set title(title) {
35
+ if (title) {
36
+ // this.element.setAttribute("title", title);
37
+ this.element.setAttribute('data-bs-original-title', title);
38
+ }
39
+ }
40
+ /**
41
+ * Define the tooltip placement
42
+ * @param placement
43
+ */
44
+ set placement(placement) {
45
+ this.element.setAttribute('data-bs-placement', placement);
46
+ }
47
+ /**
48
+ * Indicates whether the title contains html
49
+ * @param html true if contain html
50
+ */
51
+ set html(html) {
52
+ this.element.setAttribute('data-bs-html', isTrueBooleanInput(html) ? 'true' : 'false');
53
+ }
54
+ ngAfterViewInit() {
55
+ this.element.setAttribute('data-bs-toggle', 'tooltip');
56
+ this.tooltip = Tooltip.getOrCreateInstance(this.element);
57
+ this.element.addEventListener('show.bs.tooltip', event => this.onShow.emit(event));
58
+ this.element.addEventListener('shown.bs.tooltip', event => this.onShown.emit(event));
59
+ this.element.addEventListener('hide.bs.tooltip', event => this.onHide.emit(event));
60
+ this.element.addEventListener('hidden.bs.tooltip', event => this.onHidden.emit(event));
61
+ this.element.addEventListener('inserted.bs.tooltip', event => this.onInserted.emit(event));
62
+ }
63
+ ngOnDestroy() {
64
+ this.dispose();
65
+ }
66
+ /**
67
+ * Shows the tooltip of an item.
68
+ */
69
+ show() {
70
+ this.tooltip?.show();
71
+ }
72
+ /**
73
+ * Hide the tooltip of an element.
74
+ */
75
+ hide() {
76
+ this.tooltip?.hide();
77
+ }
78
+ /**
79
+ * Activate / Deactivate the tooltip of an element
80
+ */
81
+ toggle() {
82
+ this.tooltip?.toggle();
83
+ }
84
+ /**
85
+ * Hides and destroys the tooltip of an element.
86
+ */
87
+ dispose() {
88
+ this.tooltip?.dispose();
89
+ }
90
+ /**
91
+ * Gives the tooltip of an element a chance to be shown.
92
+ */
93
+ enable() {
94
+ this.tooltip?.enable();
95
+ }
96
+ /**
97
+ * Removes the ability to show the tooltip of an element.
98
+ */
99
+ disable() {
100
+ this.tooltip?.disable();
101
+ }
102
+ /**
103
+ * Toggles the possibility that the tooltip of an element is shown or hidden.
104
+ */
105
+ toggleEnabled() {
106
+ this.tooltip?.disable();
107
+ }
108
+ /**
109
+ * Updates the position of an element's tooltip.
110
+ */
111
+ update() {
112
+ this.tooltip?.disable();
113
+ }
114
+ }
115
+ TooltipDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: TooltipDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
116
+ TooltipDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.0.4", type: TooltipDirective, selector: "[itTooltip]", inputs: { title: ["itTooltip", "title"], placement: ["tooltipPlacement", "placement"], html: ["tooltipHtml", "html"] }, outputs: { onShow: "onShow", onShown: "onShown", onHide: "onHide", onHidden: "onHidden", onInserted: "onInserted" }, exportAs: ["itTooltip"], ngImport: i0 });
117
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: TooltipDirective, decorators: [{
118
+ type: Directive,
119
+ args: [{
120
+ selector: '[itTooltip]',
121
+ exportAs: 'itTooltip'
122
+ }]
123
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { title: [{
124
+ type: Input,
125
+ args: ['itTooltip']
126
+ }], placement: [{
127
+ type: Input,
128
+ args: ['tooltipPlacement']
129
+ }], html: [{
130
+ type: Input,
131
+ args: ['tooltipHtml']
132
+ }], onShow: [{
133
+ type: Output
134
+ }], onShown: [{
135
+ type: Output
136
+ }], onHide: [{
137
+ type: Output
138
+ }], onHidden: [{
139
+ type: Output
140
+ }], onInserted: [{
141
+ type: Output
142
+ }] } });
143
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHRpcC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ24tYW5ndWxhci1raXQvc3JjL2xpYi9jb21wb25lbnRzL2NvcmUvdG9vbHRpcC90b29sdGlwLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFhLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU3RyxPQUFPLEVBQWdCLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDaEYsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGtCQUFrQixDQUFDOztBQU0zQyxNQUFNLE9BQU8sZ0JBQWdCO0lBeUQzQixZQUNtQixXQUF1QjtRQUF2QixnQkFBVyxHQUFYLFdBQVcsQ0FBWTtRQTdCMUM7O1dBRUc7UUFDTyxXQUFNLEdBQXdCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFM0Q7O1dBRUc7UUFDTyxZQUFPLEdBQXdCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFNUQ7O1dBRUc7UUFDTyxXQUFNLEdBQXdCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFM0Q7O1dBRUc7UUFDTyxhQUFRLEdBQXdCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFN0Q7O1dBRUc7UUFDTyxlQUFVLEdBQXdCLElBQUksWUFBWSxFQUFFLENBQUM7UUFRN0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQztJQUNoRCxDQUFDO0lBM0REOzs7T0FHRztJQUNILElBQXdCLEtBQUssQ0FBQyxLQUF5QjtRQUNyRCxJQUFJLEtBQUssRUFBRTtZQUNULDZDQUE2QztZQUM3QyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyx3QkFBd0IsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUM1RDtJQUNILENBQUM7SUFFRDs7O09BR0c7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Z0JBV2EsU0FBUztzQkFBdkMsS0FBSzt1QkFBQyxrQkFBa0I7Z0JBUUMsSUFBSTtzQkFBN0IsS0FBSzt1QkFBQyxhQUFhO2dCQU9WLE1BQU07c0JBQWYsTUFBTTtnQkFLRyxPQUFPO3NCQUFoQixNQUFNO2dCQUtHLE1BQU07c0JBQWYsTUFBTTtnQkFLRyxRQUFRO3NCQUFqQixNQUFNO2dCQUtHLFVBQVU7c0JBQW5CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uRGVzdHJveSwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBFbGVtZW50UGxhY2VtZW50IH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcy9jb3JlJztcbmltcG9ydCB7IEJvb2xlYW5JbnB1dCwgaXNUcnVlQm9vbGVhbklucHV0IH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvYm9vbGVhbi1pbnB1dCc7XG5pbXBvcnQgeyBUb29sdGlwIH0gZnJvbSAnYm9vdHN0cmFwLWl0YWxpYSc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tpdFRvb2x0aXBdJyxcbiAgZXhwb3J0QXM6ICdpdFRvb2x0aXAnXG59KVxuZXhwb3J0IGNsYXNzIFRvb2x0aXBEaXJlY3RpdmUgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuXG4gIC8qKlxuICAgKiBEZWZpbmUgdGhlIHRvb2x0aXAgdGl0bGVcbiAgICogQHBhcmFtIHRpdGxlIHRoZSB0b29sdGlwIHRpdGxlXG4gICAqL1xuICBASW5wdXQoJ2l0VG9vbHRpcCcpIHNldCB0aXRsZSh0aXRsZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHRpdGxlKSB7XG4gICAgICAvLyB0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKFwidGl0bGVcIiwgdGl0bGUpO1xuICAgICAgdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1icy1vcmlnaW5hbC10aXRsZScsIHRpdGxlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lIHRoZSB0b29sdGlwIHBsYWNlbWVudFxuICAgKiBAcGFyYW0gcGxhY2VtZW50XG4gICAqL1xuICBASW5wdXQoJ3Rvb2x0aXBQbGFjZW1lbnQnKSBzZXQgcGxhY2VtZW50KHBsYWNlbWVudDogRWxlbWVudFBsYWNlbWVudCkge1xuICAgIHRoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtYnMtcGxhY2VtZW50JywgcGxhY2VtZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdGl0bGUgY29udGFpbnMgaHRtbFxuICAgKiBAcGFyYW0gaHRtbCB0cnVlIGlmIGNvbnRhaW4gaHRtbFxuICAgKi9cbiAgQElucHV0KCd0b29sdGlwSHRtbCcpIHNldCBodG1sKGh0bWw6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtYnMtaHRtbCcsIGlzVHJ1ZUJvb2xlYW5JbnB1dChodG1sKSA/ICd0cnVlJyA6ICdmYWxzZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZXZlbnQgZmlyZXMgaW1tZWRpYXRlbHkgd2hlbiB0aGUgc2hvdyBtZXRob2QgaXMgY2FsbGVkLlxuICAgKi9cbiAgQE91dHB1dCgpIG9uU2hvdzogRXZlbnRFbWl0dGVyPEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvKipcbiAgICogVGhpcyBldmVudCBpcyB0cmlnZ2VyZWQgd2hlbiB0aGUgdG9vbHRpcCBoYXMgYmVlbiBtYWRlIHZpc2libGUgdG8gdGhlIHVzZXIgKGl0IHdpbGwgd2FpdCBmb3IgdGhlIENTUyB0cmFuc2l0aW9ucyB0byBjb21wbGV0ZSkuXG4gICAqL1xuICBAT3V0cHV0KCkgb25TaG93bjogRXZlbnRFbWl0dGVyPEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvKipcbiAgICogVGhpcyBldmVudCBmaXJlcyBpbW1lZGlhdGVseSB3aGVuIHRoZSBoaWRlIG1ldGhvZCBpcyBjYWxsZWQuXG4gICAqL1xuICBAT3V0cHV0KCkgb25IaWRlOiBFdmVudEVtaXR0ZXI8RXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIC8qKlxuICAgKiBUaGlzIGV2ZW50IGlzIHJhaXNlZCB3aGVuIHRoZSB0b29sdGlwIGhhcyBmaW5pc2hlZCBiZWluZyBoaWRkZW4gZnJvbSB0aGUgdXNlciAoaXQgd2lsbCB3YWl0IGZvciB0aGUgQ1NTIHRyYW5zaXRpb25zIHRvIGNvbXBsZXRlKS5cbiAgICovXG4gIEBPdXRwdXQoKSBvbkhpZGRlbjogRXZlbnRFbWl0dGVyPEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvKipcbiAgICogVGhpcyBldmVudCBmaXJlcyBhZnRlciB0aGUgc2hvdyBldmVudCB3aGVuIHRoZSB0b29sdGlwIHRlbXBsYXRlIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBET00uXG4gICAqL1xuICBAT3V0cHV0KCkgb25JbnNlcnRlZDogRXZlbnRFbWl0dGVyPEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIHRvb2x0aXA/OiBUb29sdGlwO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWZcbiAgKSB7XG4gICAgdGhpcy5lbGVtZW50ID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtYnMtdG9nZ2xlJywgJ3Rvb2x0aXAnKTtcbiAgICB0aGlzLnRvb2x0aXAgPSBUb29sdGlwLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcy5lbGVtZW50KTtcblxuICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdzaG93LmJzLnRvb2x0aXAnLCBldmVudCA9PiB0aGlzLm9uU2hvdy5lbWl0KGV2ZW50KSk7XG4gICAgdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Nob3duLmJzLnRvb2x0aXAnLCBldmVudCA9PiB0aGlzLm9uU2hvd24uZW1pdChldmVudCkpO1xuICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdoaWRlLmJzLnRvb2x0aXAnLCBldmVudCA9PiB0aGlzLm9uSGlkZS5lbWl0KGV2ZW50KSk7XG4gICAgdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2hpZGRlbi5icy50b29sdGlwJywgZXZlbnQgPT4gdGhpcy5vbkhpZGRlbi5lbWl0KGV2ZW50KSk7XG4gICAgdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2luc2VydGVkLmJzLnRvb2x0aXAnLCBldmVudCA9PiB0aGlzLm9uSW5zZXJ0ZWQuZW1pdChldmVudCkpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwb3NlKCk7XG4gIH1cblxuICAvKipcbiAgICogU2hvd3MgdGhlIHRvb2x0aXAgb2YgYW4gaXRlbS5cbiAgICovXG4gIHB1YmxpYyBzaG93KCk6IHZvaWQge1xuICAgIHRoaXMudG9vbHRpcD8uc2hvdygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhpZGUgdGhlIHRvb2x0aXAgb2YgYW4gZWxlbWVudC5cbiAgICovXG4gIHB1YmxpYyBoaWRlKCk6IHZvaWQge1xuICAgIHRoaXMudG9vbHRpcD8uaGlkZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjdGl2YXRlIC8gRGVhY3RpdmF0ZSB0aGUgdG9vbHRpcCBvZiBhbiBlbGVtZW50XG4gICAqL1xuICBwdWJsaWMgdG9nZ2xlKCk6IHZvaWQge1xuICAgIHRoaXMudG9vbHRpcD8udG9nZ2xlKCk7XG4gIH1cblxuICAvKipcbiAgICogSGlkZXMgYW5kIGRlc3Ryb3lzIHRoZSB0b29sdGlwIG9mIGFuIGVsZW1lbnQuXG4gICAqL1xuICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLnRvb2x0aXA/LmRpc3Bvc2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHaXZlcyB0aGUgdG9vbHRpcCBvZiBhbiBlbGVtZW50IGEgY2hhbmNlIHRvIGJlIHNob3duLlxuICAgKi9cbiAgcHVibGljIGVuYWJsZSgpOiB2b2lkIHtcbiAgICB0aGlzLnRvb2x0aXA/LmVuYWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgdGhlIGFiaWxpdHkgdG8gc2hvdyB0aGUgdG9vbHRpcCBvZiBhbiBlbGVtZW50LlxuICAgKi9cbiAgcHVibGljIGRpc2FibGUoKTogdm9pZCB7XG4gICAgdGhpcy50b29sdGlwPy5kaXNhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlcyB0aGUgcG9zc2liaWxpdHkgdGhhdCB0aGUgdG9vbHRpcCBvZiBhbiBlbGVtZW50IGlzIHNob3duIG9yIGhpZGRlbi5cbiAgICovXG4gIHB1YmxpYyB0b2dnbGVFbmFibGVkKCk6IHZvaWQge1xuICAgIHRoaXMudG9vbHRpcD8uZGlzYWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQncyB0b29sdGlwLlxuICAgKi9cbiAgcHVibGljIHVwZGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLnRvb2x0aXA/LmRpc2FibGUoKTtcbiAgfVxuXG59XG4iXX0=
@@ -0,0 +1,40 @@
1
+ import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
2
+ import { AbstractFormComponent } from '../../../abstracts/abstract-form.component';
3
+ import { isTrueBooleanInput } from '../../../utils/boolean-input';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/common";
6
+ import * as i2 from "@angular/forms";
7
+ export class CheckboxComponent extends AbstractFormComponent {
8
+ get isIndeterminate() {
9
+ return isTrueBooleanInput(this.indeterminate);
10
+ }
11
+ get isGroup() {
12
+ return isTrueBooleanInput(this.group);
13
+ }
14
+ ngOnInit() {
15
+ super.ngOnInit();
16
+ if (this.control.value || this.checked === undefined) {
17
+ return;
18
+ }
19
+ const value = isTrueBooleanInput(this.checked);
20
+ this.writeValue(value);
21
+ return this.onChange(value);
22
+ }
23
+ }
24
+ CheckboxComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: CheckboxComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
25
+ CheckboxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: CheckboxComponent, selector: "it-checkbox", inputs: { toggle: "toggle", inline: "inline", group: "group", checked: "checked", indeterminate: "indeterminate" }, usesInheritance: true, ngImport: i0, template: "<ng-container>\n <div class=\"form-check\"\n [class.form-check-group]=\"isGroup\"\n [class.form-check-inline]=\"inline\">\n\n <div *ngIf=\"toggle; else defaultStyle\" class=\"toggles\">\n <label [for]=\"id\">\n <ng-container *ngTemplateOutlet=\"htmlLabel\"></ng-container>\n <input [id]=\"id\"\n type=\"checkbox\"\n [formControl]=\"control\"\n [attr.aria-describedby]=\"id + '-help'\">\n <span class=\"lever\"></span>\n </label>\n </div>\n\n <ng-template #defaultStyle>\n <input [id]=\"id\"\n type=\"checkbox\"\n class=\"form-check-input\"\n [class.is-invalid]=\"isInvalid\"\n [class.is-valid]=\"isValid\"\n [class.semi-checked]=\"isIndeterminate\"\n [formControl]=\"control\"\n [attr.aria-describedby]=\"id + '-help'\">\n <label class=\"form-check-label\" [for]=\"id\">\n <ng-container *ngTemplateOutlet=\"htmlLabel\"></ng-container>\n </label>\n </ng-template>\n\n <small *ngIf=\"isGroup\" [id]=\"id + '-help'\" class=\"form-text\">\n <ng-content></ng-content>\n </small>\n\n <div *ngIf=\"isInvalid && isGroup\" class=\"form-feedback just-validate-error-label\" [id]=\"id + '-error'\">\n <ng-container *ngTemplateOutlet=\"error\"></ng-container>\n </div>\n </div>\n\n <div *ngIf=\"isInvalid && !isGroup\" class=\"form-feedback just-validate-error-label\" [id]=\"id + '-error'\">\n <ng-container *ngTemplateOutlet=\"error\"></ng-container>\n </div>\n</ng-container>\n\n<ng-template #error>\n <div #customError>\n <ng-content select=\"[error]\"></ng-content>\n </div>\n <ng-container *ngIf=\"!customError.hasChildNodes()\">{{invalidMessage | async}}</ng-container>\n</ng-template>\n\n<ng-template #htmlLabel>\n <div #customLabel>\n <ng-content select=\"[label]\"></ng-content>\n </div>\n <ng-container *ngIf=\"!customLabel.hasChildNodes()\">{{label}}</ng-container>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
26
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: CheckboxComponent, decorators: [{
27
+ type: Component,
28
+ args: [{ selector: 'it-checkbox', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container>\n <div class=\"form-check\"\n [class.form-check-group]=\"isGroup\"\n [class.form-check-inline]=\"inline\">\n\n <div *ngIf=\"toggle; else defaultStyle\" class=\"toggles\">\n <label [for]=\"id\">\n <ng-container *ngTemplateOutlet=\"htmlLabel\"></ng-container>\n <input [id]=\"id\"\n type=\"checkbox\"\n [formControl]=\"control\"\n [attr.aria-describedby]=\"id + '-help'\">\n <span class=\"lever\"></span>\n </label>\n </div>\n\n <ng-template #defaultStyle>\n <input [id]=\"id\"\n type=\"checkbox\"\n class=\"form-check-input\"\n [class.is-invalid]=\"isInvalid\"\n [class.is-valid]=\"isValid\"\n [class.semi-checked]=\"isIndeterminate\"\n [formControl]=\"control\"\n [attr.aria-describedby]=\"id + '-help'\">\n <label class=\"form-check-label\" [for]=\"id\">\n <ng-container *ngTemplateOutlet=\"htmlLabel\"></ng-container>\n </label>\n </ng-template>\n\n <small *ngIf=\"isGroup\" [id]=\"id + '-help'\" class=\"form-text\">\n <ng-content></ng-content>\n </small>\n\n <div *ngIf=\"isInvalid && isGroup\" class=\"form-feedback just-validate-error-label\" [id]=\"id + '-error'\">\n <ng-container *ngTemplateOutlet=\"error\"></ng-container>\n </div>\n </div>\n\n <div *ngIf=\"isInvalid && !isGroup\" class=\"form-feedback just-validate-error-label\" [id]=\"id + '-error'\">\n <ng-container *ngTemplateOutlet=\"error\"></ng-container>\n </div>\n</ng-container>\n\n<ng-template #error>\n <div #customError>\n <ng-content select=\"[error]\"></ng-content>\n </div>\n <ng-container *ngIf=\"!customError.hasChildNodes()\">{{invalidMessage | async}}</ng-container>\n</ng-template>\n\n<ng-template #htmlLabel>\n <div #customLabel>\n <ng-content select=\"[label]\"></ng-content>\n </div>\n <ng-container *ngIf=\"!customLabel.hasChildNodes()\">{{label}}</ng-container>\n</ng-template>\n" }]
29
+ }], propDecorators: { toggle: [{
30
+ type: Input
31
+ }], inline: [{
32
+ type: Input
33
+ }], group: [{
34
+ type: Input
35
+ }], checked: [{
36
+ type: Input
37
+ }], indeterminate: [{
38
+ type: Input
39
+ }] } });
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGVzaWduLWFuZ3VsYXIta2l0L3NyYy9saWIvY29tcG9uZW50cy9mb3JtL2NoZWNrYm94L2NoZWNrYm94LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1hbmd1bGFyLWtpdC9zcmMvbGliL2NvbXBvbmVudHMvZm9ybS9jaGVja2JveC9jaGVja2JveC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNuRixPQUFPLEVBQWdCLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7Ozs7QUFPaEYsTUFBTSxPQUFPLGlCQUFrQixTQUFRLHFCQUE4QjtJQTJCbkUsSUFBSSxlQUFlO1FBQ2pCLE9BQU8sa0JBQWtCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRCxJQUFJLE9BQU87UUFDVCxPQUFPLGtCQUFrQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRVEsUUFBUTtRQUNmLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUVqQixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFO1lBQ3BELE9BQU87U0FDUjtRQUVELE1BQU0sS0FBSyxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QixDQUFDOzs4R0E3Q1UsaUJBQWlCO2tHQUFqQixpQkFBaUIsOExDVDlCLDYrREF5REE7MkZEaERhLGlCQUFpQjtrQkFMN0IsU0FBUzsrQkFDRSxhQUFhLG1CQUVOLHVCQUF1QixDQUFDLE1BQU07OEJBT3RDLE1BQU07c0JBQWQsS0FBSztnQkFLRyxNQUFNO3NCQUFkLEtBQUs7Z0JBS0csS0FBSztzQkFBYixLQUFLO2dCQUtHLE9BQU87c0JBQWYsS0FBSztnQkFLRyxhQUFhO3NCQUFyQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Rm9ybUNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2Fic3RyYWN0cy9hYnN0cmFjdC1mb3JtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBCb29sZWFuSW5wdXQsIGlzVHJ1ZUJvb2xlYW5JbnB1dCB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2Jvb2xlYW4taW5wdXQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpdC1jaGVja2JveCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jaGVja2JveC5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIENoZWNrYm94Q29tcG9uZW50IGV4dGVuZHMgQWJzdHJhY3RGb3JtQ29tcG9uZW50PGJvb2xlYW4+IHtcblxuICAvKipcbiAgICogSWYgc2hvdyBjaGVja2JveCBhcyB0b2dnbGVcbiAgICovXG4gIEBJbnB1dCgpIHRvZ2dsZT86IEJvb2xlYW5JbnB1dDtcblxuICAvKipcbiAgICogSWYgc2hvdyBjaGVja2JveCBpbmxpbmVcbiAgICovXG4gIEBJbnB1dCgpIGlubGluZT86IEJvb2xlYW5JbnB1dDtcblxuICAvKipcbiAgICogSWYgaXMgY2hlY2tib3ggZ3JvdXBcbiAgICovXG4gIEBJbnB1dCgpIGdyb3VwPzogQm9vbGVhbklucHV0O1xuXG4gIC8qKlxuICAgKiBJZiBjaGVja2JveCBpcyBjaGVja2VkXG4gICAqL1xuICBASW5wdXQoKSBjaGVja2VkPzogQm9vbGVhbklucHV0O1xuXG4gIC8qKlxuICAgKiBJZiBjaGVja2JveCBpcyBpbmRldGVybWluYXRlXG4gICAqL1xuICBASW5wdXQoKSBpbmRldGVybWluYXRlPzogQm9vbGVhbklucHV0O1xuXG4gIGdldCBpc0luZGV0ZXJtaW5hdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzVHJ1ZUJvb2xlYW5JbnB1dCh0aGlzLmluZGV0ZXJtaW5hdGUpO1xuICB9XG5cbiAgZ2V0IGlzR3JvdXAoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzVHJ1ZUJvb2xlYW5JbnB1dCh0aGlzLmdyb3VwKTtcbiAgfVxuXG4gIG92ZXJyaWRlIG5nT25Jbml0KCkge1xuICAgIHN1cGVyLm5nT25Jbml0KCk7XG5cbiAgICBpZiAodGhpcy5jb250cm9sLnZhbHVlIHx8IHRoaXMuY2hlY2tlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSBpc1RydWVCb29sZWFuSW5wdXQodGhpcy5jaGVja2VkKTtcbiAgICB0aGlzLndyaXRlVmFsdWUodmFsdWUpO1xuICAgIHJldHVybiB0aGlzLm9uQ2hhbmdlKHZhbHVlKTtcbiAgfVxufVxuIiwiPG5nLWNvbnRhaW5lcj5cbiAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2tcIlxuICAgICAgIFtjbGFzcy5mb3JtLWNoZWNrLWdyb3VwXT1cImlzR3JvdXBcIlxuICAgICAgIFtjbGFzcy5mb3JtLWNoZWNrLWlubGluZV09XCJpbmxpbmVcIj5cblxuICAgIDxkaXYgKm5nSWY9XCJ0b2dnbGU7IGVsc2UgZGVmYXVsdFN0eWxlXCIgY2xhc3M9XCJ0b2dnbGVzXCI+XG4gICAgICA8bGFiZWwgW2Zvcl09XCJpZFwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaHRtbExhYmVsXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDxpbnB1dCBbaWRdPVwiaWRcIlxuICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJjb250cm9sXCJcbiAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiaWQgKyAnLWhlbHAnXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibGV2ZXJcIj48L3NwYW4+XG4gICAgICA8L2xhYmVsPlxuICAgIDwvZGl2PlxuXG4gICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0U3R5bGU+XG4gICAgICA8aW5wdXQgW2lkXT1cImlkXCJcbiAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiXG4gICAgICAgICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwiaXNJbnZhbGlkXCJcbiAgICAgICAgICAgICBbY2xhc3MuaXMtdmFsaWRdPVwiaXNWYWxpZFwiXG4gICAgICAgICAgICAgW2NsYXNzLnNlbWktY2hlY2tlZF09XCJpc0luZGV0ZXJtaW5hdGVcIlxuICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJjb250cm9sXCJcbiAgICAgICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cImlkICsgJy1oZWxwJ1wiPlxuICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIFtmb3JdPVwiaWRcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImh0bWxMYWJlbFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9sYWJlbD5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPHNtYWxsICpuZ0lmPVwiaXNHcm91cFwiIFtpZF09XCJpZCArICctaGVscCdcIiBjbGFzcz1cImZvcm0tdGV4dFwiPlxuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIDwvc21hbGw+XG5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNJbnZhbGlkICYmIGlzR3JvdXBcIiBjbGFzcz1cImZvcm0tZmVlZGJhY2sganVzdC12YWxpZGF0ZS1lcnJvci1sYWJlbFwiIFtpZF09XCJpZCArICctZXJyb3InXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZXJyb3JcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiAqbmdJZj1cImlzSW52YWxpZCAmJiAhaXNHcm91cFwiIGNsYXNzPVwiZm9ybS1mZWVkYmFjayBqdXN0LXZhbGlkYXRlLWVycm9yLWxhYmVsXCIgW2lkXT1cImlkICsgJy1lcnJvcidcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZXJyb3JcIj48L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlICNlcnJvcj5cbiAgPGRpdiAjY3VzdG9tRXJyb3I+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2Vycm9yXVwiPjwvbmctY29udGVudD5cbiAgPC9kaXY+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY3VzdG9tRXJyb3IuaGFzQ2hpbGROb2RlcygpXCI+e3tpbnZhbGlkTWVzc2FnZSB8IGFzeW5jfX08L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjaHRtbExhYmVsPlxuICA8ZGl2ICNjdXN0b21MYWJlbD5cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbbGFiZWxdXCI+PC9uZy1jb250ZW50PlxuICA8L2Rpdj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjdXN0b21MYWJlbC5oYXNDaGlsZE5vZGVzKClcIj57e2xhYmVsfX08L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
@@ -0,0 +1,222 @@
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { AbstractFormComponent } from '../../../abstracts/abstract-form.component';
3
+ import { Validators } from '@angular/forms';
4
+ import { ItValidators } from '../../../validators/it-validators';
5
+ import { isTrueBooleanInput } from '../../../utils/boolean-input';
6
+ import { debounceTime, distinctUntilChanged, map, Observable, of, switchMap } from 'rxjs';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@angular/common";
9
+ import * as i2 from "@angular/forms";
10
+ import * as i3 from "../../utils/icon/icon.component";
11
+ import * as i4 from "../../../pipes/mark-matching-text.pipe";
12
+ export class InputComponent extends AbstractFormComponent {
13
+ constructor() {
14
+ super(...arguments);
15
+ /**
16
+ * The input type
17
+ * @default text
18
+ */
19
+ this.type = 'text';
20
+ /**
21
+ * The input placeholder
22
+ */
23
+ this.placeholder = '';
24
+ /**
25
+ * Time span [ms] has passed without another source emission, to delay data filtering.
26
+ * Useful when the user is typing multiple letters
27
+ * @default 300 [ms]
28
+ */
29
+ this.autocompleteDebounceTime = 300;
30
+ /**
31
+ * Fired when the Autocomplete Item has been selected
32
+ */
33
+ this.onAutocompleteSelected = new EventEmitter();
34
+ this.showAutocompletion = false;
35
+ /** Observable da cui vengono emessi i risultati dell'auto completamento */
36
+ this.autocompleteResults$ = new Observable();
37
+ }
38
+ get isActiveLabel() {
39
+ const value = this.control.value;
40
+ if ((!!value && value !== 0) || value === 0 || !!this.placeholder) {
41
+ return true;
42
+ }
43
+ if (this.type === 'number' && (isTrueBooleanInput(this.currency) || isTrueBooleanInput(this.percentage))) {
44
+ return true;
45
+ }
46
+ return this.type === 'date' || this.type === 'time' || this.type === 'color';
47
+ }
48
+ /**
49
+ * Check is readonly field
50
+ */
51
+ get isReadonly() {
52
+ return this.readonly === 'plaintext' || isTrueBooleanInput(this.readonly);
53
+ }
54
+ /**
55
+ * Return the invalid message string from TranslateService
56
+ */
57
+ get invalidMessage() {
58
+ if (this.hasError('min') && this.min) {
59
+ return this._translateService.get('it.errors.min-invalid', {
60
+ min: this.min
61
+ });
62
+ }
63
+ if (this.hasError('max') && this.max) {
64
+ return this._translateService.get('it.errors.max-invalid', {
65
+ max: this.max
66
+ });
67
+ }
68
+ if (this.hasError('minlength')) {
69
+ const error = this.getError('minlength');
70
+ return this._translateService.get('it.errors.min-length-invalid', { min: error.requiredLength });
71
+ }
72
+ if (this.hasError('maxlength')) {
73
+ const error = this.getError('maxlength');
74
+ return this._translateService.get('it.errors.max-length-invalid', { max: error.requiredLength });
75
+ }
76
+ if (this.hasError('email') || this.hasError('invalidEmail')) {
77
+ return this._translateService.get('it.errors.email-invalid');
78
+ }
79
+ if (this.hasError('invalidTel')) {
80
+ return this._translateService.get('it.errors.tel-invalid');
81
+ }
82
+ if (this.hasError('invalidUrl')) {
83
+ return this._translateService.get('it.errors.url-invalid');
84
+ }
85
+ if (this.hasError('invalidTaxCode')) {
86
+ return this._translateService.get('it.errors.tax-code-invalid');
87
+ }
88
+ if (this.hasError('invalidVatNumber')) {
89
+ return this._translateService.get('it.errors.vat-number-invalid');
90
+ }
91
+ if (this.hasError('invalidCap')) {
92
+ return this._translateService.get('it.errors.cap-invalid');
93
+ }
94
+ if (this.hasError('invalidRegex')) {
95
+ return this._translateService.get('it.errors.regex-invalid');
96
+ }
97
+ if (this.hasError('pattern')) {
98
+ const error = this.getError('pattern');
99
+ return this._translateService.get('it.errors.pattern-invalid', { pattern: error.requiredPattern });
100
+ }
101
+ return super.invalidMessage;
102
+ }
103
+ ngOnInit() {
104
+ super.ngOnInit();
105
+ const validators = [];
106
+ switch (this.type) {
107
+ case 'number':
108
+ if (isTrueBooleanInput(this.percentage)) {
109
+ this.min = this.min || 0;
110
+ this.max = this.max || 100;
111
+ }
112
+ // Dynamic min/max validators
113
+ validators.push((control) => this.min ? Validators.min(this.min)(control) : null);
114
+ validators.push((control) => this.max ? Validators.max(this.max)(control) : null);
115
+ break;
116
+ case 'email':
117
+ validators.push(ItValidators.email);
118
+ break;
119
+ case 'tel':
120
+ validators.push(ItValidators.tel);
121
+ break;
122
+ case 'url':
123
+ validators.push(ItValidators.url);
124
+ break;
125
+ }
126
+ this.addValidators(validators);
127
+ this.autocompleteResults$ = this.getAutocompleteResults$();
128
+ }
129
+ /**
130
+ * Increment or decrease the input number value of step
131
+ * @param decrease true to decrease value
132
+ */
133
+ incrementNumber(decrease = false) {
134
+ if (this.type !== 'number') {
135
+ return;
136
+ }
137
+ const step = (this.step === 'any' ? 1 : (this.step ?? 1));
138
+ let value = Number(this.control.value);
139
+ value = (isNaN(value) ? 0 : value) + (decrease ? -step : step);
140
+ value = Math.round(value * 1e12) / 1e12; // prevent js decimal error
141
+ if (this.min !== undefined && value < this.min) {
142
+ value = this.min;
143
+ }
144
+ else if (this.max !== undefined && value > this.max) {
145
+ value = this.max;
146
+ }
147
+ this.control.setValue(value);
148
+ }
149
+ /**
150
+ * Create the autocomplete list
151
+ */
152
+ getAutocompleteResults$() {
153
+ if (this.type !== 'search') {
154
+ return of({ searchedValue: '', relatedEntries: [] });
155
+ }
156
+ return this.control.valueChanges.pipe(debounceTime(this.autocompleteDebounceTime), // Delay filter data after time span has passed without another source emission, useful when the user is typing multiple letters
157
+ distinctUntilChanged(), // Only if searchValue is distinct in comparison to the last value
158
+ switchMap(searchedValue => {
159
+ if (!this.autocompleteData) {
160
+ return of({ searchedValue, relatedEntries: [] });
161
+ }
162
+ const autoCompleteData$ = Array.isArray(this.autocompleteData) ? of(this.autocompleteData) : this.autocompleteData(searchedValue);
163
+ return autoCompleteData$.pipe(map(autocompleteData => {
164
+ if (!searchedValue) {
165
+ return { searchedValue, relatedEntries: [] };
166
+ }
167
+ const lowercaseValue = searchedValue.toLowerCase();
168
+ const relatedEntries = autocompleteData.filter(item => item.value?.toLowerCase().includes(lowercaseValue));
169
+ return { searchedValue, relatedEntries };
170
+ }));
171
+ }));
172
+ }
173
+ onEntryClick(entry, event) {
174
+ // Se non è stato definito un link associato all'elemento dell'autocomplete, probabilmente il desiderata
175
+ // non è effettuare la navigazione al default '#', pertanto in tal caso meglio annullare la navigazione.
176
+ if (!entry.link) {
177
+ event.preventDefault();
178
+ }
179
+ this.onAutocompleteSelected.next(entry);
180
+ this.control.setValue(entry.value);
181
+ this.showAutocompletion = false;
182
+ }
183
+ autocompleteItemTrackByValueFn(index, item) {
184
+ return item.value;
185
+ }
186
+ onKeyDown() {
187
+ this.showAutocompletion = this.type === 'search';
188
+ }
189
+ }
190
+ InputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: InputComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
191
+ InputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: InputComponent, selector: "it-input", inputs: { type: "type", placeholder: "placeholder", description: "description", readonly: "readonly", max: "max", min: "min", step: "step", currency: "currency", percentage: "percentage", adaptive: "adaptive", autocompleteData: "autocompleteData", autocompleteDebounceTime: "autocompleteDebounceTime" }, outputs: { onAutocompleteSelected: "onAutocompleteSelected" }, usesInheritance: true, ngImport: i0, template: "<div class=\"form-group\">\n <div class=\"input-group\">\n <div class=\"input-group-prepend\" [class.d-none]=\"!prependText.hasChildNodes() && !prepend.hasChildNodes()\">\n <div #prepend>\n <ng-content select=\"[prepend]\"></ng-content>\n </div>\n <div class=\"input-group-text\" #prependText>\n <ng-content select=\"[prependText]\"></ng-content>\n </div>\n </div>\n\n <label *ngIf=\"label\" [for]=\"id\" [class.active]=\"isActiveLabel\"\n [class.empty-prepend-label]=\"!prependText.hasChildNodes() && !prepend.hasChildNodes()\">\n {{label}}\n </label>\n\n <span *ngIf=\"type === 'number'\"\n class=\"input-number\"\n [class.input-number-currency]=\"currency\"\n [class.input-number-percentage]=\"percentage\"\n [class.input-number-adaptive]=\"adaptive\">\n\n <input type=\"number\"\n [id]=\"id\"\n [step]=\"step ?? null\"\n [class.is-invalid]=\"isInvalid\"\n [class.is-valid]=\"isValid\"\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n [readonly]=\"isReadonly\"\n [attr.aria-describedby]=\"id + '-description'\"\n (blur)=\"markAsTouched()\" />\n\n <button type=\"button\" class=\"input-number-add\" (click)=\"incrementNumber()\">\n <span class=\"visually-hidden\">{{'it.form.increase-value'}}</span>\n </button>\n <button type=\"button\" class=\"input-number-sub\" (click)=\"incrementNumber(true)\">\n <span class=\"visually-hidden\">{{'it.form.decrease-value'}}</span>\n </button>\n </span>\n\n <input *ngIf=\"type !== 'number'\"\n [id]=\"id\"\n [type]=\"type\"\n [class.form-control]=\"readonly !== 'plaintext'\"\n [class.form-control-plaintext]=\"readonly === 'plaintext'\"\n [class.is-invalid]=\"isInvalid\"\n [class.is-valid]=\"isValid\"\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n [readonly]=\"isReadonly\"\n (keydown)=\"onKeyDown()\"\n [attr.aria-describedby]=\"id + '-description'\"\n (blur)=\"markAsTouched()\">\n\n <div class=\"input-group-append\">\n <ng-content select=\"[append]\"></ng-content>\n\n <div class=\"input-group-text\">\n <ng-content select=\"[appendText]\"></ng-content>\n </div>\n </div>\n </div>\n\n <small *ngIf=\"description\" [id]=\"id + '-description'\" class=\"form-text\">{{description}}</small>\n\n <!-- INIZIO gestione AUTOCOMPLETAMENTO -->\n <ng-container *ngIf=\"type === 'search'\">\n <!-- Icona lente per autocompletamento -->\n <span class=\"autocomplete-icon\" aria-hidden=\"true\">\n <it-icon name=\"search\" size=\"sm\"></it-icon>\n </span>\n\n <ng-container *ngIf=\"autocompleteResults$ | async as autocomplete\">\n <!-- Lista di autocompletamento -->\n <ul class=\"autocomplete-list\" [class.autocomplete-list-show]=\"autocomplete.relatedEntries?.length && showAutocompletion\">\n <li *ngFor=\"let entry of autocomplete.relatedEntries; trackBy: autocompleteItemTrackByValueFn\"\n (click)=\"onEntryClick(entry, $event)\">\n <a [href]=\"entry.link\">\n <ng-container *ngTemplateOutlet=\"autocompleteItemTemplate\"></ng-container>\n </a>\n <ng-template #autocompleteItemTemplate>\n <div class=\"avatar size-sm\" *ngIf=\"entry.avatarSrcPath\">\n <img [src]=\"entry.avatarSrcPath\" [alt]=\"entry.avatarAltText\">\n </div>\n <it-icon *ngIf=\"entry.icon\" [name]=\"entry.icon\" size=\"sm\"></it-icon>\n <span class=\"autocomplete-list-text\">\n <span [innerHTML]=\"entry.value | markMatchingText: autocomplete.searchedValue\"></span>\n <em *ngIf=\"entry.label\">{{entry.label}}</em>\n </span>\n </ng-template>\n </li>\n </ul>\n </ng-container>\n </ng-container>\n <!-- FINE gestione AUTOCOMPLETAMENTO -->\n\n <div *ngIf=\"isInvalid\" class=\"form-feedback just-validate-error-label\" [id]=\"id + '-error'\">\n <div #customError>\n <ng-content select=\"[error]\"></ng-content>\n </div>\n <ng-container *ngIf=\"!customError.hasChildNodes()\">{{invalidMessage | async}}</ng-container>\n </div>\n</div>\n", styles: [".form-group label{z-index:1000}.form-group input:focus:not(.focus--mouse){box-shadow:inherit!important;border-color:inherit!important}.form-group .input-number button.input-number-add{top:0}.form-group .input-number button.input-number-sub{bottom:0}.form-group .input-group-text:empty{display:none}.form-group label.empty-prepend-label{left:auto!important;max-width:100%!important}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i3.IconComponent, selector: "it-icon[name]", inputs: ["name", "size", "color", "padded", "class"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.MarkMatchingTextPipe, name: "markMatchingText" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
192
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: InputComponent, decorators: [{
193
+ type: Component,
194
+ args: [{ selector: 'it-input', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"form-group\">\n <div class=\"input-group\">\n <div class=\"input-group-prepend\" [class.d-none]=\"!prependText.hasChildNodes() && !prepend.hasChildNodes()\">\n <div #prepend>\n <ng-content select=\"[prepend]\"></ng-content>\n </div>\n <div class=\"input-group-text\" #prependText>\n <ng-content select=\"[prependText]\"></ng-content>\n </div>\n </div>\n\n <label *ngIf=\"label\" [for]=\"id\" [class.active]=\"isActiveLabel\"\n [class.empty-prepend-label]=\"!prependText.hasChildNodes() && !prepend.hasChildNodes()\">\n {{label}}\n </label>\n\n <span *ngIf=\"type === 'number'\"\n class=\"input-number\"\n [class.input-number-currency]=\"currency\"\n [class.input-number-percentage]=\"percentage\"\n [class.input-number-adaptive]=\"adaptive\">\n\n <input type=\"number\"\n [id]=\"id\"\n [step]=\"step ?? null\"\n [class.is-invalid]=\"isInvalid\"\n [class.is-valid]=\"isValid\"\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n [readonly]=\"isReadonly\"\n [attr.aria-describedby]=\"id + '-description'\"\n (blur)=\"markAsTouched()\" />\n\n <button type=\"button\" class=\"input-number-add\" (click)=\"incrementNumber()\">\n <span class=\"visually-hidden\">{{'it.form.increase-value'}}</span>\n </button>\n <button type=\"button\" class=\"input-number-sub\" (click)=\"incrementNumber(true)\">\n <span class=\"visually-hidden\">{{'it.form.decrease-value'}}</span>\n </button>\n </span>\n\n <input *ngIf=\"type !== 'number'\"\n [id]=\"id\"\n [type]=\"type\"\n [class.form-control]=\"readonly !== 'plaintext'\"\n [class.form-control-plaintext]=\"readonly === 'plaintext'\"\n [class.is-invalid]=\"isInvalid\"\n [class.is-valid]=\"isValid\"\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n [readonly]=\"isReadonly\"\n (keydown)=\"onKeyDown()\"\n [attr.aria-describedby]=\"id + '-description'\"\n (blur)=\"markAsTouched()\">\n\n <div class=\"input-group-append\">\n <ng-content select=\"[append]\"></ng-content>\n\n <div class=\"input-group-text\">\n <ng-content select=\"[appendText]\"></ng-content>\n </div>\n </div>\n </div>\n\n <small *ngIf=\"description\" [id]=\"id + '-description'\" class=\"form-text\">{{description}}</small>\n\n <!-- INIZIO gestione AUTOCOMPLETAMENTO -->\n <ng-container *ngIf=\"type === 'search'\">\n <!-- Icona lente per autocompletamento -->\n <span class=\"autocomplete-icon\" aria-hidden=\"true\">\n <it-icon name=\"search\" size=\"sm\"></it-icon>\n </span>\n\n <ng-container *ngIf=\"autocompleteResults$ | async as autocomplete\">\n <!-- Lista di autocompletamento -->\n <ul class=\"autocomplete-list\" [class.autocomplete-list-show]=\"autocomplete.relatedEntries?.length && showAutocompletion\">\n <li *ngFor=\"let entry of autocomplete.relatedEntries; trackBy: autocompleteItemTrackByValueFn\"\n (click)=\"onEntryClick(entry, $event)\">\n <a [href]=\"entry.link\">\n <ng-container *ngTemplateOutlet=\"autocompleteItemTemplate\"></ng-container>\n </a>\n <ng-template #autocompleteItemTemplate>\n <div class=\"avatar size-sm\" *ngIf=\"entry.avatarSrcPath\">\n <img [src]=\"entry.avatarSrcPath\" [alt]=\"entry.avatarAltText\">\n </div>\n <it-icon *ngIf=\"entry.icon\" [name]=\"entry.icon\" size=\"sm\"></it-icon>\n <span class=\"autocomplete-list-text\">\n <span [innerHTML]=\"entry.value | markMatchingText: autocomplete.searchedValue\"></span>\n <em *ngIf=\"entry.label\">{{entry.label}}</em>\n </span>\n </ng-template>\n </li>\n </ul>\n </ng-container>\n </ng-container>\n <!-- FINE gestione AUTOCOMPLETAMENTO -->\n\n <div *ngIf=\"isInvalid\" class=\"form-feedback just-validate-error-label\" [id]=\"id + '-error'\">\n <div #customError>\n <ng-content select=\"[error]\"></ng-content>\n </div>\n <ng-container *ngIf=\"!customError.hasChildNodes()\">{{invalidMessage | async}}</ng-container>\n </div>\n</div>\n", styles: [".form-group label{z-index:1000}.form-group input:focus:not(.focus--mouse){box-shadow:inherit!important;border-color:inherit!important}.form-group .input-number button.input-number-add{top:0}.form-group .input-number button.input-number-sub{bottom:0}.form-group .input-group-text:empty{display:none}.form-group label.empty-prepend-label{left:auto!important;max-width:100%!important}\n"] }]
195
+ }], propDecorators: { type: [{
196
+ type: Input
197
+ }], placeholder: [{
198
+ type: Input
199
+ }], description: [{
200
+ type: Input
201
+ }], readonly: [{
202
+ type: Input
203
+ }], max: [{
204
+ type: Input
205
+ }], min: [{
206
+ type: Input
207
+ }], step: [{
208
+ type: Input
209
+ }], currency: [{
210
+ type: Input
211
+ }], percentage: [{
212
+ type: Input
213
+ }], adaptive: [{
214
+ type: Input
215
+ }], autocompleteData: [{
216
+ type: Input
217
+ }], autocompleteDebounceTime: [{
218
+ type: Input
219
+ }], onAutocompleteSelected: [{
220
+ type: Output
221
+ }] } });
222
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGVzaWduLWFuZ3VsYXIta2l0L3NyYy9saWIvY29tcG9uZW50cy9mb3JtL2lucHV0L2lucHV0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1hbmd1bGFyLWtpdC9zcmMvbGliL2NvbXBvbmVudHMvZm9ybS9pbnB1dC9pbnB1dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBRW5GLE9BQU8sRUFBZ0MsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ2pFLE9BQU8sRUFBZ0Isa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNoRixPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7O0FBUTFGLE1BQU0sT0FBTyxjQUFlLFNBQVEscUJBQXNDO0lBTjFFOztRQVFFOzs7V0FHRztRQUNNLFNBQUksR0FBcUIsTUFBTSxDQUFDO1FBRXpDOztXQUVHO1FBQ00sZ0JBQVcsR0FBVyxFQUFFLENBQUM7UUFrRGxDOzs7O1dBSUc7UUFDTSw2QkFBd0IsR0FBVyxHQUFHLENBQUM7UUFFaEQ7O1dBRUc7UUFDTywyQkFBc0IsR0FBbUMsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUV0Rix1QkFBa0IsR0FBRyxLQUFLLENBQUM7UUEwRTNCLDJFQUEy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QUFFLENBQUM7U0FDeEI7UUFFRCxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO0lBQ2xDLENBQUM7SUFFRCw4QkFBOEIsQ0FBQyxLQUFhLEVBQUUsSUFBc0I7UUFDbEUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxTQUFTO1FBQ1AsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDO0lBQ25ELENBQUM7OzJHQTlQVSxjQUFjOytGQUFkLGNBQWMsc2JDZDNCLHl5SUF3R0E7MkZEMUZhLGNBQWM7a0JBTjFCLFNBQVM7K0JBQ0UsVUFBVSxtQkFHSCx1QkFBdUIsQ0FBQyxNQUFNOzhCQVF0QyxJQUFJO3NCQUFaLEtBQUs7Z0JBS0csV0FBVztzQkFBbkIsS0FBSztnQkFLRyxXQUFXO3NCQUFuQixLQUFLO2dCQU1HLFFBQVE7c0JBQWhCLEtBQUs7Z0JBS0csR0FBRztzQkFBWCxLQUFLO2dCQUtHLEdBQUc7c0JBQVgsS0FBSztnQkFLRyxJQUFJO3NCQUFaLEtBQUs7Z0JBS0csUUFBUTtzQkFBaEIsS0FBSztnQkFLRyxVQUFVO3NCQUFsQixLQUFLO2dCQUtHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBT0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQU9HLHdCQUF3QjtzQkFBaEMsS0FBSztnQkFLSSxzQkFBc0I7c0JBQS9CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Rm9ybUNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2Fic3RyYWN0cy9hYnN0cmFjdC1mb3JtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBdXRvY29tcGxldGVJdGVtLCBJbnB1dENvbnRyb2xUeXBlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcy9mb3JtJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgVmFsaWRhdG9yRm4sIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBJdFZhbGlkYXRvcnMgfSBmcm9tICcuLi8uLi8uLi92YWxpZGF0b3JzL2l0LXZhbGlkYXRvcnMnO1xuaW1wb3J0IHsgQm9vbGVhbklucHV0LCBpc1RydWVCb29sZWFuSW5wdXQgfSBmcm9tICcuLi8uLi8uLi91dGlscy9ib29sZWFuLWlucHV0JztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcCwgT2JzZXJ2YWJsZSwgb2YsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpdC1pbnB1dCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9pbnB1dC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2lucHV0LmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIElucHV0Q29tcG9uZW50IGV4dGVuZHMgQWJzdHJhY3RGb3JtQ29tcG9uZW50PHN0cmluZyB8IG51bWJlcj4ge1xuXG4gIC8qKlxuICAgKiBUaGUgaW5wdXQgdHlwZVxuICAgKiBAZGVmYXVsdCB0ZXh0XG4gICAqL1xuICBASW5wdXQoKSB0eXBlOiBJbnB1dENvbnRyb2xUeXBlID0gJ3RleHQnO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5wdXQgcGxhY2Vob2xkZXJcbiAgICovXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnJztcblxuICAvKipcbiAgICogVGhlIGlucHV0IGRlc2NyaXB0aW9uXG4gICAqL1xuICBASW5wdXQoKSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVG8gcHJldmVudCBtb2RpZmljYXRpb24gb2YgdGhlIGNvbnRhaW5lZCB2YWx1ZS5cbiAgICogLSA8Yj5wbGFpbnRleHQ8L2I+OiBSZWFkb25seSBmaWVsZCBpbiB0aGUgZm9ybSBzdHlsaXplZCBhcyBwbGFpbiB0ZXh0XG4gICAqL1xuICBASW5wdXQoKSByZWFkb25seT86IEJvb2xlYW5JbnB1dCB8ICdwbGFpbnRleHQnO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4IHZhbHVlIFtVc2VkIG9ubHkgaW4gdHlwZSA9ICdudW1iZXInXVxuICAgKi9cbiAgQElucHV0KCkgbWF4PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbWluIHZhbHVlIFtVc2VkIG9ubHkgaW4gdHlwZSA9ICdudW1iZXInXVxuICAgKi9cbiAgQElucHV0KCkgbWluPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RlcCB2YWx1ZSBbVXNlZCBvbmx5IGluIHR5cGUgPSAnbnVtYmVyJ11cbiAgICovXG4gIEBJbnB1dCgpIHN0ZXA/OiBudW1iZXIgfCAnYW55JztcblxuICAvKipcbiAgICogSWYgaXMgYSBjdXJyZW5jeSBudW1iZXIgW1VzZWQgb25seSBpbiB0eXBlID0gJ251bWJlciddXG4gICAqL1xuICBASW5wdXQoKSBjdXJyZW5jeT86IEJvb2xlYW5JbnB1dDtcblxuICAvKipcbiAgICogSWYgaXMgYSBwZXJjZW50YWdlIG51bWJlciBbVXNlZCBvbmx5IGluIHR5cGUgPSAnbnVtYmVyJ11cbiAgICovXG4gIEBJbnB1dCgpIHBlcmNlbnRhZ2U/OiBCb29sZWFuSW5wdXQ7XG5cbiAgLyoqXG4gICAqIFRvIG1ha2UgdGhlIG51bWVyaWMgZmllbGQgYXV0b21hdGljYWxseSByZXNpemUgYWNjb3JkaW5nIHRvIHRoZSB2YWx1ZSBjb250YWluZWQgaW4gaXQuIFtVc2VkIG9ubHkgaW4gdHlwZSA9ICdudW1iZXInXVxuICAgKi9cbiAgQElucHV0KCkgYWRhcHRpdmU/OiBCb29sZWFuSW5wdXQ7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB0aGUgbGlzdCBvZiBzZWFyY2hhYmxlIGVsZW1lbnRzIG9uIHdoaWNoIHRvIGJhc2UgdGhlIGlucHV0IGF1dG9jb21wbGV0ZSBzeXN0ZW0gW09wdGlvbmFsLiBVc2VkIG9ubHkgaW4gdHlwZSA9ICdzZWFyY2gnXVxuICAgKiBJZiB5b3UgbmVlZCB0byByZXRyaWV2ZSBpdGVtcyB2aWEgQVBJLCBjYW4gcGFzcyBhIGZ1bmN0aW9uIG9mIE9ic2VydmFibGVcbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkXG4gICAqL1xuICBASW5wdXQoKSBhdXRvY29tcGxldGVEYXRhPzogQXJyYXk8QXV0b2NvbXBsZXRlSXRlbT4gfCAoKHNlYXJjaD86IHN0cmluZykgPT4gT2JzZXJ2YWJsZTxBcnJheTxBdXRvY29tcGxldGVJdGVtPj4pO1xuXG4gIC8qKlxuICAgKiBUaW1lIHNwYW4gW21zXSBoYXMgcGFzc2VkIHdpdGhvdXQgYW5vdGhlciBzb3VyY2UgZW1pc3Npb24sIHRvIGRlbGF5IGRhdGEgZmlsdGVyaW5nLlxuICAgKiBVc2VmdWwgd2hlbiB0aGUgdXNlciBpcyB0eXBpbmcgbXVsdGlwbGUgbGV0dGVyc1xuICAgKiBAZGVmYXVsdCAzMDAgW21zXVxuICAgKi9cbiAgQElucHV0KCkgYXV0b2NvbXBsZXRlRGVib3VuY2VUaW1lOiBudW1iZXIgPSAzMDA7XG5cbiAgLyoqXG4gICAqIEZpcmVkIHdoZW4gdGhlIEF1dG9jb21wbGV0ZSBJdGVtIGhhcyBiZWVuIHNlbGVjdGVkXG4gICAqL1xuICBAT3V0cHV0KCkgb25BdXRvY29tcGxldGVTZWxlY3RlZDogRXZlbnRFbWl0dGVyPEF1dG9jb21wbGV0ZUl0ZW0+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHNob3dBdXRvY29tcGxldGlvbiA9IGZhbHNlO1xuXG5cbiAgZ2V0IGlzQWN0aXZlTGFiZWwoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmNvbnRyb2wudmFsdWU7XG4gICAgaWYgKCghIXZhbHVlICYmIHZhbHVlICE9PSAwKSB8fCB2YWx1ZSA9PT0gMCB8fCAhIXRoaXMucGxhY2Vob2xkZXIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnR5cGUgPT09ICdudW1iZXInICYmIChpc1RydWVCb29sZWFuSW5wdXQodGhpcy5jdXJyZW5jeSkgfHwgaXNUcnVlQm9vbGVhbklucHV0KHRoaXMucGVyY2VudGFnZSkpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy50eXBlID09PSAnZGF0ZScgfHwgdGhpcy50eXBlID09PSAndGltZScgfHwgdGhpcy50eXBlID09PSAnY29sb3InO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlzIHJlYWRvbmx5IGZpZWxkXG4gICAqL1xuICBnZXQgaXNSZWFkb25seSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkb25seSA9PT0gJ3BsYWludGV4dCcgfHwgaXNUcnVlQm9vbGVhbklucHV0KHRoaXMucmVhZG9ubHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgaW52YWxpZCBtZXNzYWdlIHN0cmluZyBmcm9tIFRyYW5zbGF0ZVNlcnZpY2VcbiAgICovXG4gIG92ZXJyaWRlIGdldCBpbnZhbGlkTWVzc2FnZSgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIGlmICh0aGlzLmhhc0Vycm9yKCdtaW4nKSAmJiB0aGlzLm1pbikge1xuICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuZ2V0KCdpdC5lcnJvcnMubWluLWludmFsaWQnLCB7XG4gICAgICAgIG1pbjogdGhpcy5taW5cbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNFcnJvcignbWF4JykgJiYgdGhpcy5tYXgpIHtcbiAgICAgIHJldHVybiB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmdldCgnaXQuZXJyb3JzLm1heC1pbnZhbGlkJywge1xuICAgICAgICBtYXg6IHRoaXMubWF4XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFzRXJyb3IoJ21pbmxlbmd0aCcpKSB7XG4gICAgICBjb25zdCBlcnJvciA9IHRoaXMuZ2V0RXJyb3IoJ21pbmxlbmd0aCcpO1xuICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuZ2V0KCdpdC5lcnJvcnMubWluLWxlbmd0aC1pbnZhbGlkJywgeyBtaW46IGVycm9yLnJlcXVpcmVkTGVuZ3RoIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNFcnJvcignbWF4bGVuZ3RoJykpIHtcbiAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5nZXRFcnJvcignbWF4bGVuZ3RoJyk7XG4gICAgICByZXR1cm4gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5nZXQoJ2l0LmVycm9ycy5tYXgtbGVuZ3RoLWludmFsaWQnLCB7IG1heDogZXJyb3IucmVxdWlyZWRMZW5ndGggfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc0Vycm9yKCdlbWFpbCcpIHx8IHRoaXMuaGFzRXJyb3IoJ2ludmFsaWRFbWFpbCcpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5nZXQoJ2l0LmVycm9ycy5lbWFpbC1pbnZhbGlkJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc0Vycm9yKCdpbnZhbGlkVGVsJykpIHtcbiAgICAgIHJldHVybiB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmdldCgnaXQuZXJyb3JzLnRlbC1pbnZhbGlkJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc0Vycm9yKCdpbnZhbGlkVXJsJykpIHtcbiAgICAgIHJldHVybiB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmdldCgnaXQuZXJyb3JzLnVybC1pbnZhbGlkJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc0Vycm9yKCdpbnZhbGlkVGF4Q29kZScpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5nZXQoJ2l0LmVycm9ycy50YXgtY29kZS1pbnZhbGlkJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc0Vycm9yKCdpbnZhbGlkVmF0TnVtYmVyJykpIHtcbiAgICAgIHJldHVybiB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmdldCgnaXQuZXJyb3JzLnZhdC1udW1iZXItaW52YWxpZCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNFcnJvcignaW52YWxpZENhcCcpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5nZXQoJ2l0LmVycm9ycy5jYXAtaW52YWxpZCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNFcnJvcignaW52YWxpZFJlZ2V4JykpIHtcbiAgICAgIHJldHVybiB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmdldCgnaXQuZXJyb3JzLnJlZ2V4LWludmFsaWQnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFzRXJyb3IoJ3BhdHRlcm4nKSkge1xuICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLmdldEVycm9yKCdwYXR0ZXJuJyk7XG4gICAgICByZXR1cm4gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5nZXQoJ2l0LmVycm9ycy5wYXR0ZXJuLWludmFsaWQnLCB7IHBhdHRlcm46IGVycm9yLnJlcXVpcmVkUGF0dGVybiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIuaW52YWxpZE1lc3NhZ2U7XG4gIH1cblxuICAvKiogT2JzZXJ2YWJsZSBkYSBjdWkgdmVuZ29ubyBlbWVzc2kgaSByaXN1bHRhdGkgZGVsbCdhdXRvIGNvbXBsZXRhbWVudG8gKi9cbiAgYXV0b2NvbXBsZXRlUmVzdWx0cyQ6IE9ic2VydmFibGU8eyBzZWFyY2hlZFZhbHVlOiBzdHJpbmcsIHJlbGF0ZWRFbnRyaWVzOiBBcnJheTxBdXRvY29tcGxldGVJdGVtPiB9PiA9IG5ldyBPYnNlcnZhYmxlKCk7XG5cblxuICBvdmVycmlkZSBuZ09uSW5pdCgpIHtcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xuXG4gICAgY29uc3QgdmFsaWRhdG9yczogQXJyYXk8VmFsaWRhdG9yRm4+ID0gW107XG4gICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgIGlmIChpc1RydWVCb29sZWFuSW5wdXQodGhpcy5wZXJjZW50YWdlKSkge1xuICAgICAgICAgIHRoaXMubWluID0gdGhpcy5taW4gfHwgMDtcbiAgICAgICAgICB0aGlzLm1heCA9IHRoaXMubWF4IHx8IDEwMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIER5bmFtaWMgbWluL21heCB2YWxpZGF0b3JzXG4gICAgICAgIHZhbGlkYXRvcnMucHVzaCgoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiB0aGlzLm1pbiA/IFZhbGlkYXRvcnMubWluKHRoaXMubWluKShjb250cm9sKSA6IG51bGwpO1xuICAgICAgICB2YWxpZGF0b3JzLnB1c2goKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4gdGhpcy5tYXggPyBWYWxpZGF0b3JzLm1heCh0aGlzLm1heCkoY29udHJvbCkgOiBudWxsKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdlbWFpbCc6XG4gICAgICAgIHZhbGlkYXRvcnMucHVzaChJdFZhbGlkYXRvcnMuZW1haWwpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RlbCc6XG4gICAgICAgIHZhbGlkYXRvcnMucHVzaChJdFZhbGlkYXRvcnMudGVsKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd1cmwnOlxuICAgICAgICB2YWxpZGF0b3JzLnB1c2goSXRWYWxpZGF0b3JzLnVybCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHRoaXMuYWRkVmFsaWRhdG9ycyh2YWxpZGF0b3JzKTtcbiAgICB0aGlzLmF1dG9jb21wbGV0ZVJlc3VsdHMkID0gdGhpcy5nZXRBdXRvY29tcGxldGVSZXN1bHRzJCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluY3JlbWVudCBvciBkZWNyZWFzZSB0aGUgaW5wdXQgbnVtYmVyIHZhbHVlIG9mIHN0ZXBcbiAgICogQHBhcmFtIGRlY3JlYXNlIHRydWUgdG8gZGVjcmVhc2UgdmFsdWVcbiAgICovXG4gIGluY3JlbWVudE51bWJlcihkZWNyZWFzZTogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudHlwZSAhPT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc3RlcCA9ICh0aGlzLnN0ZXAgPT09ICdhbnknID8gMSA6ICh0aGlzLnN0ZXAgPz8gMSkpO1xuICAgIGxldCB2YWx1ZSA9IE51bWJlcih0aGlzLmNvbnRyb2wudmFsdWUpO1xuICAgIHZhbHVlID0gKGlzTmFOKHZhbHVlKSA/IDAgOiB2YWx1ZSkgKyAoZGVjcmVhc2UgPyAtc3RlcCA6IHN0ZXApO1xuICAgIHZhbHVlID0gTWF0aC5yb3VuZCh2YWx1ZSAqIDFlMTIpIC8gMWUxMjsgLy8gcHJldmVudCBqcyBkZWNpbWFsIGVycm9yXG5cbiAgICBpZiAodGhpcy5taW4gIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSA8IHRoaXMubWluKSB7XG4gICAgICB2YWx1ZSA9IHRoaXMubWluO1xuICAgIH0gZWxzZSBpZiAodGhpcy5tYXggIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSA+IHRoaXMubWF4KSB7XG4gICAgICB2YWx1ZSA9IHRoaXMubWF4O1xuICAgIH1cblxuICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZSh2YWx1ZSk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIGF1dG9jb21wbGV0ZSBsaXN0XG4gICAqL1xuICBwcml2YXRlIGdldEF1dG9jb21wbGV0ZVJlc3VsdHMkKCk6IE9ic2VydmFibGU8eyBzZWFyY2hlZFZhbHVlOiBzdHJpbmcsIHJlbGF0ZWRFbnRyaWVzOiBBcnJheTxBdXRvY29tcGxldGVJdGVtPiB9PiB7XG4gICAgaWYgKHRoaXMudHlwZSAhPT0gJ3NlYXJjaCcpIHtcbiAgICAgIHJldHVybiBvZih7IHNlYXJjaGVkVmFsdWU6ICcnLCByZWxhdGVkRW50cmllczogW10gfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbnRyb2wudmFsdWVDaGFuZ2VzLnBpcGUoXG4gICAgICBkZWJvdW5jZVRpbWUodGhpcy5hdXRvY29tcGxldGVEZWJvdW5jZVRpbWUpLCAvLyBEZWxheSBmaWx0ZXIgZGF0YSBhZnRlciB0aW1lIHNwYW4gaGFzIHBhc3NlZCB3aXRob3V0IGFub3RoZXIgc291cmNlIGVtaXNzaW9uLCB1c2VmdWwgd2hlbiB0aGUgdXNlciBpcyB0eXBpbmcgbXVsdGlwbGUgbGV0dGVyc1xuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSwgLy8gT25seSBpZiBzZWFyY2hWYWx1ZSBpcyBkaXN0aW5jdCBpbiBjb21wYXJpc29uIHRvIHRoZSBsYXN0IHZhbHVlXG4gICAgICBzd2l0Y2hNYXAoc2VhcmNoZWRWYWx1ZSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5hdXRvY29tcGxldGVEYXRhKSB7XG4gICAgICAgICAgcmV0dXJuIG9mKHsgc2VhcmNoZWRWYWx1ZSwgcmVsYXRlZEVudHJpZXM6IFtdIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYXV0b0NvbXBsZXRlRGF0YSQgPSBBcnJheS5pc0FycmF5KHRoaXMuYXV0b2NvbXBsZXRlRGF0YSkgPyBvZih0aGlzLmF1dG9jb21wbGV0ZURhdGEpIDogdGhpcy5hdXRvY29tcGxldGVEYXRhKHNlYXJjaGVkVmFsdWUpO1xuICAgICAgICByZXR1cm4gYXV0b0NvbXBsZXRlRGF0YSQucGlwZShcbiAgICAgICAgICBtYXAoYXV0b2NvbXBsZXRlRGF0YSA9PiB7XG4gICAgICAgICAgICBpZiAoIXNlYXJjaGVkVmFsdWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgc2VhcmNoZWRWYWx1ZSwgcmVsYXRlZEVudHJpZXM6IFtdIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvd2VyY2FzZVZhbHVlID0gc2VhcmNoZWRWYWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZEVudHJpZXMgPSBhdXRvY29tcGxldGVEYXRhLmZpbHRlcihpdGVtID0+IGl0ZW0udmFsdWU/LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobG93ZXJjYXNlVmFsdWUpKTtcblxuICAgICAgICAgICAgcmV0dXJuIHsgc2VhcmNoZWRWYWx1ZSwgcmVsYXRlZEVudHJpZXMgfTtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgb25FbnRyeUNsaWNrKGVudHJ5OiBBdXRvY29tcGxldGVJdGVtLCBldmVudDogRXZlbnQpIHtcbiAgICAvLyBTZSBub24gw6ggc3RhdG8gZGVmaW5pdG8gdW4gbGluayBhc3NvY2lhdG8gYWxsJ2VsZW1lbnRvIGRlbGwnYXV0b2NvbXBsZXRlLCBwcm9iYWJpbG1lbnRlIGlsIGRlc2lkZXJhdGFcbiAgICAvLyBub24gw6ggZWZmZXR0dWFyZSBsYSBuYXZpZ2F6aW9uZSBhbCBkZWZhdWx0ICcjJywgcGVydGFudG8gaW4gdGFsIGNhc28gbWVnbGlvIGFubnVsbGFyZSBsYSBuYXZpZ2F6aW9uZS5cbiAgICBpZiAoIWVudHJ5LmxpbmspIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgdGhpcy5vbkF1dG9jb21wbGV0ZVNlbGVjdGVkLm5leHQoZW50cnkpO1xuICAgIHRoaXMuY29udHJvbC5zZXRWYWx1ZShlbnRyeS52YWx1ZSk7XG4gICAgdGhpcy5zaG93QXV0b2NvbXBsZXRpb24gPSBmYWxzZTtcbiAgfVxuXG4gIGF1dG9jb21wbGV0ZUl0ZW1UcmFja0J5VmFsdWVGbihpbmRleDogbnVtYmVyLCBpdGVtOiBBdXRvY29tcGxldGVJdGVtKSB7XG4gICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gIH1cblxuICBvbktleURvd24oKSB7XG4gICAgdGhpcy5zaG93QXV0b2NvbXBsZXRpb24gPSB0aGlzLnR5cGUgPT09ICdzZWFyY2gnO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXBcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtcHJlcGVuZFwiIFtjbGFzcy5kLW5vbmVdPVwiIXByZXBlbmRUZXh0Lmhhc0NoaWxkTm9kZXMoKSAmJiAhcHJlcGVuZC5oYXNDaGlsZE5vZGVzKClcIj5cbiAgICAgIDxkaXYgI3ByZXBlbmQ+XG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltwcmVwZW5kXVwiPjwvbmctY29udGVudD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLXRleHRcIiAjcHJlcGVuZFRleHQ+XG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltwcmVwZW5kVGV4dF1cIj48L25nLWNvbnRlbnQ+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxsYWJlbCAqbmdJZj1cImxhYmVsXCIgW2Zvcl09XCJpZFwiIFtjbGFzcy5hY3RpdmVdPVwiaXNBY3RpdmVMYWJlbFwiXG4gICAgICAgICAgIFtjbGFzcy5lbXB0eS1wcmVwZW5kLWxhYmVsXT1cIiFwcmVwZW5kVGV4dC5oYXNDaGlsZE5vZGVzKCkgJiYgIXByZXBlbmQuaGFzQ2hpbGROb2RlcygpXCI+XG4gICAgICB7e2xhYmVsfX1cbiAgICA8L2xhYmVsPlxuXG4gICAgPHNwYW4gKm5nSWY9XCJ0eXBlID09PSAnbnVtYmVyJ1wiXG4gICAgICAgICAgY2xhc3M9XCJpbnB1dC1udW1iZXJcIlxuICAgICAgICAgIFtjbGFzcy5pbnB1dC1udW1iZXItY3VycmVuY3ldPVwiY3VycmVuY3lcIlxuICAgICAgICAgIFtjbGFzcy5pbnB1dC1udW1iZXItcGVyY2VudGFnZV09XCJwZXJjZW50YWdlXCJcbiAgICAgICAgICBbY2xhc3MuaW5wdXQtbnVtYmVyLWFkYXB0aXZlXT1cImFkYXB0aXZlXCI+XG5cbiAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICBbaWRdPVwiaWRcIlxuICAgICAgICAgICAgIFtzdGVwXT1cInN0ZXAgPz8gbnVsbFwiXG4gICAgICAgICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwiaXNJbnZhbGlkXCJcbiAgICAgICAgICAgICBbY2xhc3MuaXMtdmFsaWRdPVwiaXNWYWxpZFwiXG4gICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImNvbnRyb2xcIlxuICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgW3JlYWRvbmx5XT1cImlzUmVhZG9ubHlcIlxuICAgICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiaWQgKyAnLWRlc2NyaXB0aW9uJ1wiXG4gICAgICAgICAgICAgKGJsdXIpPVwibWFya0FzVG91Y2hlZCgpXCIgLz5cblxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJpbnB1dC1udW1iZXItYWRkXCIgKGNsaWNrKT1cImluY3JlbWVudE51bWJlcigpXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidmlzdWFsbHktaGlkZGVuXCI+e3snaXQuZm9ybS5pbmNyZWFzZS12YWx1ZSd9fTwvc3Bhbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJpbnB1dC1udW1iZXItc3ViXCIgKGNsaWNrKT1cImluY3JlbWVudE51bWJlcih0cnVlKVwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInZpc3VhbGx5LWhpZGRlblwiPnt7J2l0LmZvcm0uZGVjcmVhc2UtdmFsdWUnfX08L3NwYW4+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L3NwYW4+XG5cbiAgICA8aW5wdXQgKm5nSWY9XCJ0eXBlICE9PSAnbnVtYmVyJ1wiXG4gICAgICAgICAgIFtpZF09XCJpZFwiXG4gICAgICAgICAgIFt0eXBlXT1cInR5cGVcIlxuICAgICAgICAgICBbY2xhc3MuZm9ybS1jb250cm9sXT1cInJlYWRvbmx5ICE9PSAncGxhaW50ZXh0J1wiXG4gICAgICAgICAgIFtjbGFzcy5mb3JtLWNvbnRyb2wtcGxhaW50ZXh0XT1cInJlYWRvbmx5ID09PSAncGxhaW50ZXh0J1wiXG4gICAgICAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cImlzSW52YWxpZFwiXG4gICAgICAgICAgIFtjbGFzcy5pcy12YWxpZF09XCJpc1ZhbGlkXCJcbiAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImNvbnRyb2xcIlxuICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgICAgICBbcmVhZG9ubHldPVwiaXNSZWFkb25seVwiXG4gICAgICAgICAgIChrZXlkb3duKT1cIm9uS2V5RG93bigpXCJcbiAgICAgICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJpZCArICctZGVzY3JpcHRpb24nXCJcbiAgICAgICAgICAgKGJsdXIpPVwibWFya0FzVG91Y2hlZCgpXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtYXBwZW5kXCI+XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbYXBwZW5kXVwiPjwvbmctY29udGVudD5cblxuICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLXRleHRcIj5cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2FwcGVuZFRleHRdXCI+PC9uZy1jb250ZW50PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxzbWFsbCAqbmdJZj1cImRlc2NyaXB0aW9uXCIgW2lkXT1cImlkICsgJy1kZXNjcmlwdGlvbidcIiBjbGFzcz1cImZvcm0tdGV4dFwiPnt7ZGVzY3JpcHRpb259fTwvc21hbGw+XG5cbiAgPCEtLSBJTklaSU8gZ2VzdGlvbmUgQVVUT0NPTVBMRVRBTUVOVE8gLS0+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0eXBlID09PSAnc2VhcmNoJ1wiPlxuICAgIDwhLS0gSWNvbmEgbGVudGUgcGVyIGF1dG9jb21wbGV0YW1lbnRvIC0tPlxuICAgIDxzcGFuIGNsYXNzPVwiYXV0b2NvbXBsZXRlLWljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgIDxpdC1pY29uIG5hbWU9XCJzZWFyY2hcIiBzaXplPVwic21cIj48L2l0LWljb24+XG4gICAgPC9zcGFuPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImF1dG9jb21wbGV0ZVJlc3VsdHMkIHwgYXN5bmMgYXMgYXV0b2NvbXBsZXRlXCI+XG4gICAgICA8IS0tIExpc3RhIGRpIGF1dG9jb21wbGV0YW1lbnRvIC0tPlxuICAgICAgPHVsIGNsYXNzPVwiYXV0b2NvbXBsZXRlLWxpc3RcIiBbY2xhc3MuYXV0b2NvbXBsZXRlLWxpc3Qtc2hvd109XCJhdXRvY29tcGxldGUucmVsYXRlZEVudHJpZXM/Lmxlbmd0aCAmJiBzaG93QXV0b2NvbXBsZXRpb25cIj5cbiAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBlbnRyeSBvZiBhdXRvY29tcGxldGUucmVsYXRlZEVudHJpZXM7IHRyYWNrQnk6IGF1dG9jb21wbGV0ZUl0ZW1UcmFja0J5VmFsdWVGblwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25FbnRyeUNsaWNrKGVudHJ5LCAkZXZlbnQpXCI+XG4gICAgICAgICAgPGEgW2hyZWZdPVwiZW50cnkubGlua1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImF1dG9jb21wbGV0ZUl0ZW1UZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvYT5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2F1dG9jb21wbGV0ZUl0ZW1UZW1wbGF0ZT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdmF0YXIgc2l6ZS1zbVwiICpuZ0lmPVwiZW50cnkuYXZhdGFyU3JjUGF0aFwiPlxuICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwiZW50cnkuYXZhdGFyU3JjUGF0aFwiIFthbHRdPVwiZW50cnkuYXZhdGFyQWx0VGV4dFwiPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8aXQtaWNvbiAqbmdJZj1cImVudHJ5Lmljb25cIiBbbmFtZV09XCJlbnRyeS5pY29uXCIgc2l6ZT1cInNtXCI+PC9pdC1pY29uPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhdXRvY29tcGxldGUtbGlzdC10ZXh0XCI+XG4gICAgICAgICAgICA8c3BhbiBbaW5uZXJIVE1MXT1cImVudHJ5LnZhbHVlIHwgbWFya01hdGNoaW5nVGV4dDogYXV0b2NvbXBsZXRlLnNlYXJjaGVkVmFsdWVcIj48L3NwYW4+XG4gICAgICAgICAgICA8ZW0gKm5nSWY9XCJlbnRyeS5sYWJlbFwiPnt7ZW50cnkubGFiZWx9fTwvZW0+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvbGk+XG4gICAgICA8L3VsPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cbiAgPCEtLSBGSU5FIGdlc3Rpb25lIEFVVE9DT01QTEVUQU1FTlRPIC0tPlxuXG4gIDxkaXYgKm5nSWY9XCJpc0ludmFsaWRcIiBjbGFzcz1cImZvcm0tZmVlZGJhY2sganVzdC12YWxpZGF0ZS1lcnJvci1sYWJlbFwiIFtpZF09XCJpZCArICctZXJyb3InXCI+XG4gICAgPGRpdiAjY3VzdG9tRXJyb3I+XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbZXJyb3JdXCI+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY3VzdG9tRXJyb3IuaGFzQ2hpbGROb2RlcygpXCI+e3tpbnZhbGlkTWVzc2FnZSB8IGFzeW5jfX08L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==