@arsedizioni/ars-utils 18.5.62 → 19.0.2

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 (174) hide show
  1. package/fesm2022/arsedizioni-ars-utils-clipper.common.mjs +10 -10
  2. package/fesm2022/arsedizioni-ars-utils-clipper.common.mjs.map +1 -1
  3. package/fesm2022/arsedizioni-ars-utils-clipper.ui.mjs +41 -41
  4. package/fesm2022/arsedizioni-ars-utils-clipper.ui.mjs.map +1 -1
  5. package/fesm2022/arsedizioni-ars-utils-core.mjs +99 -99
  6. package/fesm2022/arsedizioni-ars-utils-core.mjs.map +1 -1
  7. package/fesm2022/arsedizioni-ars-utils-evolution.common.mjs +10 -10
  8. package/fesm2022/arsedizioni-ars-utils-evolution.common.mjs.map +1 -1
  9. package/fesm2022/arsedizioni-ars-utils-help.mjs +13 -13
  10. package/fesm2022/arsedizioni-ars-utils-help.mjs.map +1 -1
  11. package/fesm2022/arsedizioni-ars-utils-support.common.mjs +10 -10
  12. package/fesm2022/arsedizioni-ars-utils-support.common.mjs.map +1 -1
  13. package/fesm2022/arsedizioni-ars-utils-support.ui.mjs +6 -6
  14. package/fesm2022/arsedizioni-ars-utils-support.ui.mjs.map +1 -1
  15. package/fesm2022/arsedizioni-ars-utils-tinymce.mjs +7 -7
  16. package/fesm2022/arsedizioni-ars-utils-tinymce.mjs.map +1 -1
  17. package/fesm2022/arsedizioni-ars-utils-ui.application.mjs +58 -58
  18. package/fesm2022/arsedizioni-ars-utils-ui.application.mjs.map +1 -1
  19. package/fesm2022/arsedizioni-ars-utils-ui.mjs +34 -34
  20. package/fesm2022/arsedizioni-ars-utils-ui.mjs.map +1 -1
  21. package/fesm2022/arsedizioni-ars-utils-ui.oauth.mjs +7 -7
  22. package/fesm2022/arsedizioni-ars-utils-ui.oauth.mjs.map +1 -1
  23. package/package.json +5 -29
  24. package/esm2022/arsedizioni-ars-utils.mjs +0 -5
  25. package/esm2022/clipper.common/arsedizioni-ars-utils-clipper.common.mjs +0 -5
  26. package/esm2022/clipper.common/common/common.module.mjs +0 -16
  27. package/esm2022/clipper.common/common/definitions.mjs +0 -2041
  28. package/esm2022/clipper.common/common/interceptors/auth.interceptor.mjs +0 -100
  29. package/esm2022/clipper.common/common/messages.mjs +0 -36
  30. package/esm2022/clipper.common/common/services/clipper.service.mjs +0 -1011
  31. package/esm2022/clipper.common/public_api.mjs +0 -5
  32. package/esm2022/clipper.ui/arsedizioni-ars-utils-clipper.ui.mjs +0 -5
  33. package/esm2022/clipper.ui/documents.mjs +0 -50
  34. package/esm2022/clipper.ui/public_api.mjs +0 -18
  35. package/esm2022/clipper.ui/ui/browser-dialog/browser-dialog.component.mjs +0 -766
  36. package/esm2022/clipper.ui/ui/document/document.component.mjs +0 -688
  37. package/esm2022/clipper.ui/ui/document-index/document-index.component.mjs +0 -118
  38. package/esm2022/clipper.ui/ui/document-manager/document-manager.mjs +0 -441
  39. package/esm2022/clipper.ui/ui/document-menu/document-menu.component.mjs +0 -217
  40. package/esm2022/clipper.ui/ui/references/references.component.mjs +0 -380
  41. package/esm2022/clipper.ui/ui/search-calendar/search-calendar.component.mjs +0 -116
  42. package/esm2022/clipper.ui/ui/search-dialog/search-dialog.component.mjs +0 -339
  43. package/esm2022/clipper.ui/ui/search-facets/search-facets.component.mjs +0 -251
  44. package/esm2022/clipper.ui/ui/search-free-text-help/search-free-text-help.component.mjs +0 -17
  45. package/esm2022/clipper.ui/ui/search-free-text-query-builder/search-free-text-query-builder.component.mjs +0 -106
  46. package/esm2022/clipper.ui/ui/search-result-item/search-result-item.component.mjs +0 -120
  47. package/esm2022/clipper.ui/ui/search-result-manager/search-result-manager.mjs +0 -531
  48. package/esm2022/core/arsedizioni-ars-utils-core.mjs +0 -5
  49. package/esm2022/core/core.module.mjs +0 -151
  50. package/esm2022/core/dateFnsAdapter.mjs +0 -203
  51. package/esm2022/core/definitions.mjs +0 -47
  52. package/esm2022/core/directives/autoFocusDirective.mjs +0 -22
  53. package/esm2022/core/directives/changeDateIntervalDirective.mjs +0 -48
  54. package/esm2022/core/directives/copyClipboardDirective.mjs +0 -46
  55. package/esm2022/core/directives/validators.mjs +0 -502
  56. package/esm2022/core/pipes/format.pipe.mjs +0 -53
  57. package/esm2022/core/pipes/replace.pipe.mjs +0 -29
  58. package/esm2022/core/pipes/safe-html.pipe.mjs +0 -24
  59. package/esm2022/core/pipes/safe-url.pipe.mjs +0 -24
  60. package/esm2022/core/pipes/search-callback.pipe.mjs +0 -21
  61. package/esm2022/core/pipes/search-filter.pipe.mjs +0 -50
  62. package/esm2022/core/public_api.mjs +0 -22
  63. package/esm2022/core/selectable.mjs +0 -131
  64. package/esm2022/core/services/broadcast.service.mjs +0 -35
  65. package/esm2022/core/services/broadcastChannelManager.mjs +0 -80
  66. package/esm2022/core/services/environment.service.mjs +0 -29
  67. package/esm2022/core/services/screen.service.mjs +0 -23
  68. package/esm2022/core/services/theme.service.mjs +0 -140
  69. package/esm2022/core/system.mjs +0 -664
  70. package/esm2022/evolution.common/arsedizioni-ars-utils-evolution.common.mjs +0 -5
  71. package/esm2022/evolution.common/common/common.module.mjs +0 -16
  72. package/esm2022/evolution.common/common/definitions.mjs +0 -454
  73. package/esm2022/evolution.common/common/interceptors/auth.interceptor.mjs +0 -100
  74. package/esm2022/evolution.common/common/messages.mjs +0 -8
  75. package/esm2022/evolution.common/common/services/evolution.service.mjs +0 -490
  76. package/esm2022/evolution.common/public_api.mjs +0 -5
  77. package/esm2022/help/arsedizioni-ars-utils-help.mjs +0 -5
  78. package/esm2022/help/components/help-viewer/help-viewer.component.mjs +0 -442
  79. package/esm2022/help/definitions.mjs +0 -2
  80. package/esm2022/help/help.module.mjs +0 -12
  81. package/esm2022/help/public_api.mjs +0 -7
  82. package/esm2022/help/services/help.service.mjs +0 -77
  83. package/esm2022/public_api.mjs +0 -15
  84. package/esm2022/support.common/arsedizioni-ars-utils-support.common.mjs +0 -5
  85. package/esm2022/support.common/common/common.module.mjs +0 -16
  86. package/esm2022/support.common/common/definitions.mjs +0 -29
  87. package/esm2022/support.common/common/interceptors/auth.interceptor.mjs +0 -100
  88. package/esm2022/support.common/common/messages.mjs +0 -13
  89. package/esm2022/support.common/common/services/support.service.mjs +0 -289
  90. package/esm2022/support.common/public_api.mjs +0 -8
  91. package/esm2022/support.ui/arsedizioni-ars-utils-support.ui.mjs +0 -5
  92. package/esm2022/support.ui/public_api.mjs +0 -5
  93. package/esm2022/support.ui/ui/notifications-browser/notification/notification.component.mjs +0 -80
  94. package/esm2022/support.ui/ui/notifications-browser/notifications-browser.component.mjs +0 -233
  95. package/esm2022/tinymce/arsedizioni-ars-utils-tinymce.mjs +0 -5
  96. package/esm2022/tinymce/full-screen-editor/full-screen-editor.component.mjs +0 -48
  97. package/esm2022/tinymce/public_api.mjs +0 -7
  98. package/esm2022/tinymce/tinymce.module.mjs +0 -19
  99. package/esm2022/tinymce/utils.mjs +0 -150
  100. package/esm2022/ui/arsedizioni-ars-utils-ui.mjs +0 -5
  101. package/esm2022/ui/public_api.mjs +0 -12
  102. package/esm2022/ui/ui/components/button-selector/button-selector.component.mjs +0 -150
  103. package/esm2022/ui/ui/components/button-toggle/button-toggle.component.mjs +0 -51
  104. package/esm2022/ui/ui/components/calendar-empty-header/calendar-empy-header.component.mjs +0 -30
  105. package/esm2022/ui/ui/components/chips-selector/chips-selector.component.mjs +0 -272
  106. package/esm2022/ui/ui/components/file-input/file-input.component.mjs +0 -264
  107. package/esm2022/ui/ui/components/file-preview/file-preview.component.mjs +0 -73
  108. package/esm2022/ui/ui/components/filter-bar/filter-bar.component.mjs +0 -356
  109. package/esm2022/ui/ui/definitions.mjs +0 -2
  110. package/esm2022/ui/ui/dialogs/busy/busy-dialog.component.mjs +0 -47
  111. package/esm2022/ui/ui/dialogs/confirm/confirm-dialog.component.mjs +0 -101
  112. package/esm2022/ui/ui/dialogs/credentials/credentials-dialog.component.mjs +0 -86
  113. package/esm2022/ui/ui/dialogs/info/info-dialog.component.mjs +0 -51
  114. package/esm2022/ui/ui/dialogs/prompt/prompt-dialog.component.mjs +0 -77
  115. package/esm2022/ui/ui/dialogs/prompt-date/prompt-date-dialog.component.mjs +0 -79
  116. package/esm2022/ui/ui/dialogs/prompt-time/prompt-time-dialog.component.mjs +0 -72
  117. package/esm2022/ui/ui/dialogs/recover-password/recover-password-dialog.component.mjs +0 -49
  118. package/esm2022/ui/ui/dialogs/reset-password/reset-password-dialog.component.mjs +0 -89
  119. package/esm2022/ui/ui/dialogs/select/select-dialog.component.mjs +0 -374
  120. package/esm2022/ui/ui/dialogs/select-file/select-file-dialog.component.mjs +0 -106
  121. package/esm2022/ui/ui/dialogs/select-picture/select-picture-dialog.component.mjs +0 -62
  122. package/esm2022/ui/ui/dialogs/select-tree/select-tree-dialog.component.mjs +0 -277
  123. package/esm2022/ui/ui/dialogs/send-to/send-to-dialog.component.mjs +0 -90
  124. package/esm2022/ui/ui/dialogs/toast/toast.component.mjs +0 -32
  125. package/esm2022/ui/ui/directives/resize-table-column.directive.mjs +0 -63
  126. package/esm2022/ui/ui/filters.mjs +0 -43
  127. package/esm2022/ui/ui/paginatorIntl.mjs +0 -34
  128. package/esm2022/ui/ui/services/dialog.service.mjs +0 -417
  129. package/esm2022/ui/ui/services/ui.service.mjs +0 -21
  130. package/esm2022/ui/ui/ui.module.mjs +0 -21
  131. package/esm2022/ui.application/arsedizioni-ars-utils-ui.application.mjs +0 -5
  132. package/esm2022/ui.application/public_api.mjs +0 -21
  133. package/esm2022/ui.application/ui/components/button-selector/button-selector.component.mjs +0 -150
  134. package/esm2022/ui.application/ui/components/button-toggle/button-toggle.component.mjs +0 -51
  135. package/esm2022/ui.application/ui/components/calendar-empty-header/calendar-empy-header.component.mjs +0 -30
  136. package/esm2022/ui.application/ui/components/chips-selector/chips-selector.component.mjs +0 -272
  137. package/esm2022/ui.application/ui/components/file-input/file-input.component.mjs +0 -264
  138. package/esm2022/ui.application/ui/components/file-preview/file-preview.component.mjs +0 -73
  139. package/esm2022/ui.application/ui/components/filter-bar/filter-bar.component.mjs +0 -356
  140. package/esm2022/ui.application/ui/definitions.mjs +0 -31
  141. package/esm2022/ui.application/ui/dialogs/prompt/prompt-dialog.component.mjs +0 -77
  142. package/esm2022/ui.application/ui/dialogs/prompt-date/prompt-date-dialog.component.mjs +0 -79
  143. package/esm2022/ui.application/ui/dialogs/prompt-time/prompt-time-dialog.component.mjs +0 -72
  144. package/esm2022/ui.application/ui/dialogs/select/select-dialog.component.mjs +0 -374
  145. package/esm2022/ui.application/ui/dialogs/select-file/select-file-dialog.component.mjs +0 -106
  146. package/esm2022/ui.application/ui/dialogs/select-picture/select-picture-dialog.component.mjs +0 -62
  147. package/esm2022/ui.application/ui/dialogs/select-tree/select-tree-dialog.component.mjs +0 -277
  148. package/esm2022/ui.application/ui/dialogs/send-to/send-to-dialog.component.mjs +0 -90
  149. package/esm2022/ui.application/ui/directives/resize-table-column.directive.mjs +0 -63
  150. package/esm2022/ui.application/ui/filters.mjs +0 -43
  151. package/esm2022/ui.application/ui/services/applicationDialog.service.mjs +0 -304
  152. package/esm2022/ui.application/ui/ui.module.mjs +0 -30
  153. package/esm2022/ui.oauth/arsedizioni-ars-utils-ui.oauth.mjs +0 -5
  154. package/esm2022/ui.oauth/public_api.mjs +0 -6
  155. package/esm2022/ui.oauth/ui/components/login/login-oauth.component.mjs +0 -199
  156. package/esm2022/ui.oauth/ui/definitions.mjs +0 -7
  157. package/esm2022/ui.oauth/ui/ui.module.mjs +0 -13
  158. package/ui/ui/components/button-selector/button-selector.component.d.ts +0 -52
  159. package/ui/ui/components/button-toggle/button-toggle.component.d.ts +0 -28
  160. package/ui/ui/components/calendar-empty-header/calendar-empy-header.component.d.ts +0 -11
  161. package/ui/ui/components/chips-selector/chips-selector.component.d.ts +0 -82
  162. package/ui/ui/components/file-input/file-input.component.d.ts +0 -88
  163. package/ui/ui/components/file-preview/file-preview.component.d.ts +0 -26
  164. package/ui/ui/components/filter-bar/filter-bar.component.d.ts +0 -83
  165. package/ui/ui/dialogs/prompt/prompt-dialog.component.d.ts +0 -18
  166. package/ui/ui/dialogs/prompt-date/prompt-date-dialog.component.d.ts +0 -18
  167. package/ui/ui/dialogs/prompt-time/prompt-time-dialog.component.d.ts +0 -18
  168. package/ui/ui/dialogs/select/select-dialog.component.d.ts +0 -122
  169. package/ui/ui/dialogs/select-file/select-file-dialog.component.d.ts +0 -36
  170. package/ui/ui/dialogs/select-picture/select-picture-dialog.component.d.ts +0 -26
  171. package/ui/ui/dialogs/select-tree/select-tree-dialog.component.d.ts +0 -98
  172. package/ui/ui/dialogs/send-to/send-to-dialog.component.d.ts +0 -28
  173. package/ui/ui/directives/resize-table-column.directive.d.ts +0 -19
  174. package/ui/ui/filters.d.ts +0 -57
@@ -1,140 +0,0 @@
1
- import { computed, inject, Injectable, RendererFactory2, signal } from "@angular/core";
2
- import { BroadcastChannelManager } from './broadcastChannelManager';
3
- import { BehaviorSubject } from "rxjs";
4
- import * as i0 from "@angular/core";
5
- export class ThemeService {
6
- constructor() {
7
- // messaggi broadcast
8
- this.broadcastChannel = new BroadcastChannelManager('THEME-SERVICE');
9
- this.broadcastMessage = '$theme-changed';
10
- // per intercettare il cambio di tema a livello di sistema
11
- this.prefersColorSchemeMediaQueryList = window.matchMedia('(prefers-color-scheme: dark)');
12
- /**
13
- * Theme changed event.
14
- * Notify the consuming component about the incoming theme change.
15
- * @example
16
- * // React to theme changes
17
- * this.themeService.themeChanged
18
- * .pipe(takeUntil(this.unsubscribe))
19
- * .subscribe((value: ThemeType) => {
20
- * // do the job done....
21
- * });
22
- */
23
- this.themeChanged = new BehaviorSubject('auto');
24
- // espone al consumatore un'observable
25
- this.changed = this.themeChanged.asObservable();
26
- this.renderFactory2 = inject(RendererFactory2);
27
- this.renderer = this.renderFactory2.createRenderer(null, null);
28
- /**
29
- * Current theme
30
- */
31
- this.theme = signal("light");
32
- /**
33
- * The current theme is "System default"
34
- */
35
- this.auto = computed(() => this.theme() === 'auto');
36
- /**
37
- * Configuration schema about the icon, the text and the toggle() sequence
38
- */
39
- this.themeInfo = {
40
- ['auto']: { icon: 'contrast', name: 'Impostazione predefinita di sistema', next: 'light', tooltip: 'Passa a tema chiaro', },
41
- ['light']: { icon: 'light_mode', name: 'Tema chiaro', next: 'dark', tooltip: 'Passa a tema scuro', },
42
- ['dark']: { icon: 'dark_mode', name: 'Tema scuro', next: 'auto', tooltip: 'Passa a tema predefinito di sistema', },
43
- };
44
- /**
45
- * Icon of the current theme (mat-icon code)
46
- */
47
- this.themeIcon = computed(() => this.themeInfo[this.theme()].icon);
48
- /**
49
- * Current theme name
50
- */
51
- this.themeName = computed(() => this.themeInfo[this.theme()].name);
52
- /**
53
- * Tooltip text on toggle
54
- */
55
- this.toggleTooltip = computed(() => this.themeInfo[this.theme()].tooltip);
56
- this.initialize();
57
- }
58
- /**
59
- * Initialize
60
- */
61
- initialize() {
62
- // React to current theme
63
- this.prefersColorSchemeMediaQueryList.onchange = (_) => this.auto() ? this.setTheme() : null;
64
- // Support boradcast channel messaging
65
- this.broadcastChannel.subscribe({
66
- messageId: this.broadcastMessage,
67
- action: (bag) => {
68
- if (this.theme() !== bag.data) {
69
- this.setTheme(bag.data);
70
- }
71
- }
72
- });
73
- // Load current theme
74
- this.loadTheme();
75
- }
76
- ngOnDestroy() {
77
- this.broadcastChannel.dispose();
78
- }
79
- /**
80
- * Get the current preferred theme
81
- */
82
- getPreferredTheme() {
83
- let theme = localStorage.getItem("preferred-theme");
84
- if (!this.isTheme(theme)) {
85
- theme = 'auto';
86
- }
87
- return theme;
88
- }
89
- /**
90
- * Load theme
91
- */
92
- loadTheme() {
93
- this.setTheme(this.getPreferredTheme());
94
- }
95
- /**
96
- * Check if a value string is a theme type
97
- * @param value : th string value
98
- * @returns true if the the value is a valid theme type
99
- */
100
- isTheme(value) {
101
- return ['auto', 'light', 'dark'].includes(value);
102
- }
103
- /**
104
- * Set the new theme
105
- * @param theme the new theme
106
- */
107
- setTheme(theme = 'auto') {
108
- this.renderer.removeClass(document.body, 'light');
109
- this.renderer.removeClass(document.body, 'dark');
110
- this.theme.set(theme);
111
- localStorage.setItem("preferred-theme", this.theme());
112
- this.renderer.addClass(document.body, this.auto() ? (window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light") : theme);
113
- // Notify that current theme has changed
114
- this.themeChanged.next(this.getTheme());
115
- this.broadcastChannel.sendMessage(this.broadcastMessage, this.theme());
116
- }
117
- /**
118
- * Toggle theme
119
- */
120
- toggleTheme() {
121
- this.setTheme(this.themeInfo[this.theme()].next);
122
- }
123
- /**
124
- * Get current real theme: light or dark
125
- */
126
- getTheme() {
127
- return (this.auto()
128
- ? (window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light")
129
- : this.getPreferredTheme());
130
- }
131
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.10", ngImport: i0, type: ThemeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
132
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.10", ngImport: i0, type: ThemeService, providedIn: "root" }); }
133
- }
134
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.10", ngImport: i0, type: ThemeService, decorators: [{
135
- type: Injectable,
136
- args: [{
137
- providedIn: "root",
138
- }]
139
- }], ctorParameters: () => [] });
140
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlbWUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Fycy11dGlscy9jb3JlL3NlcnZpY2VzL3RoZW1lLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFhLGdCQUFnQixFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRyxPQUFPLEVBQUUsdUJBQXVCLEVBQThCLE1BQU0sMkJBQTJCLENBQUM7QUFDaEcsT0FBTyxFQUFFLGVBQWUsRUFBYyxNQUFNLE1BQU0sQ0FBQzs7QUFxQm5ELE1BQU0sT0FBTyxZQUFZO0lBMER2QjtRQXhEQSxxQkFBcUI7UUFDSixxQkFBZ0IsR0FBRyxJQUFJLHVCQUF1QixDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2hFLHFCQUFnQixHQUFXLGdCQUFnQixDQUFDO1FBRTdELDBEQUEwRDtRQUN6QyxxQ0FBZ0MsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLDhCQUE4QixDQUFDLENBQUM7UUFFdEc7Ozs7Ozs7Ozs7V0FVRztRQUNLLGlCQUFZLEdBQUcsSUFBSSxlQUFlLENBQVksTUFBTSxDQUFDLENBQUM7UUFDOUQsc0NBQXNDO1FBQy9CLFlBQU8sR0FBMEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVqRSxtQkFBYyxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzFDLGFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFbEU7O1dBRUc7UUFDYyxVQUFLLEdBQUcsTUFBTSxDQUFZLE9BQU8sQ0FBQyxDQUFDO1FBQ3BEOztXQUVHO1FBQ2MsU0FBSSxHQUFvQixRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLE1BQU0sQ0FB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QUMsVUFBVSxDQUFDLDhCQUE4QixDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztZQUNyRyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztJQUNsQyxDQUFDOytHQWxKVSxZQUFZO21IQUFaLFlBQVksY0FGWCxNQUFNOzs0RkFFUCxZQUFZO2tCQUh4QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvbXB1dGVkLCBpbmplY3QsIEluamVjdGFibGUsIE9uRGVzdHJveSwgUmVuZGVyZXJGYWN0b3J5MiwgU2lnbmFsLCBzaWduYWwgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBCcm9hZGNhc3RDaGFubmVsTWFuYWdlciwgQnJvYWRjYXN0Q2hhbm5lbE1lc3NhZ2VCYWcgfSBmcm9tICcuL2Jyb2FkY2FzdENoYW5uZWxNYW5hZ2VyJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSBcInJ4anNcIjtcclxuXHJcblxyXG4vKipcclxuICogS2luZCBvZiB0aGVtZXM6IHN5c3RlbSBkZWZhdWx0LCBsaWdodCBvciBkYXJrXHJcbiAqL1xyXG5leHBvcnQgdHlwZSBUaGVtZVR5cGUgPSAnYXV0bycgfCAnbGlnaHQnIHwgJ2RhcmsnO1xyXG5cclxuLyoqXHJcbiAqIEF2YWlsYWJsZSB0aGVtZXMnIHNjaGVtYVxyXG4gKi9cclxuaW50ZXJmYWNlIFRoZW1lSW5mb1JlY29yZCB7XHJcbiAgaWNvbjogc3RyaW5nO1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBuZXh0OiBUaGVtZVR5cGU7XHJcbiAgdG9vbHRpcDogc3RyaW5nO1xyXG59XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogXCJyb290XCIsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUaGVtZVNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xyXG5cclxuICAvLyBtZXNzYWdnaSBicm9hZGNhc3RcclxuICBwcml2YXRlIHJlYWRvbmx5IGJyb2FkY2FzdENoYW5uZWwgPSBuZXcgQnJvYWRjYXN0Q2hhbm5lbE1hbmFnZXIoJ1RIRU1FLVNFUlZJQ0UnKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGJyb2FkY2FzdE1lc3NhZ2U6IHN0cmluZyA9ICckdGhlbWUtY2hhbmdlZCc7XHJcblxyXG4gIC8vIHBlciBpbnRlcmNldHRhcmUgaWwgY2FtYmlvIGRpIHRlbWEgYSBsaXZlbGxvIGRpIHNpc3RlbWFcclxuICBwcml2YXRlIHJlYWRvbmx5IHByZWZlcnNDb2xvclNjaGVtZU1lZGlhUXVlcnlMaXN0ID0gd2luZG93Lm1hdGNoTWVkaWEoJyhwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyayknKTtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlbWUgY2hhbmdlZCBldmVudC5cclxuICAgKiBOb3RpZnkgdGhlIGNvbnN1bWluZyBjb21wb25lbnQgYWJvdXQgdGhlIGluY29taW5nIHRoZW1lIGNoYW5nZS5cclxuICAgKiBAZXhhbXBsZSBcclxuICAgKiAvLyBSZWFjdCB0byB0aGVtZSBjaGFuZ2VzXHJcbiAgICogdGhpcy50aGVtZVNlcnZpY2UudGhlbWVDaGFuZ2VkXHJcbiAgICogICAgLnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUpKVxyXG4gICAqICAgIC5zdWJzY3JpYmUoKHZhbHVlOiBUaGVtZVR5cGUpID0+IHtcclxuICAgKiAgICAgIC8vIGRvIHRoZSBqb2IgZG9uZS4uLi5cclxuICAgKiAgICB9KTtcclxuICAgKi9cclxuICBwcml2YXRlIHRoZW1lQ2hhbmdlZCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VGhlbWVUeXBlPignYXV0bycpO1xyXG4gIC8vIGVzcG9uZSBhbCBjb25zdW1hdG9yZSB1bidvYnNlcnZhYmxlXHJcbiAgcHVibGljIGNoYW5nZWQ6IE9ic2VydmFibGU8VGhlbWVUeXBlPiA9IHRoaXMudGhlbWVDaGFuZ2VkLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBwcml2YXRlIHJlbmRlckZhY3RvcnkyID0gaW5qZWN0KFJlbmRlcmVyRmFjdG9yeTIpO1xyXG4gIHByaXZhdGUgcmVuZGVyZXIgPSB0aGlzLnJlbmRlckZhY3RvcnkyLmNyZWF0ZVJlbmRlcmVyKG51bGwsIG51bGwpO1xyXG5cclxuICAvKipcclxuICAgKiBDdXJyZW50IHRoZW1lXHJcbiAgICovXHJcbiAgcHJpdmF0ZSByZWFkb25seSB0aGVtZSA9IHNpZ25hbDxUaGVtZVR5cGU+KFwibGlnaHRcIik7XHJcbiAgLyoqXHJcbiAgICogVGhlIGN1cnJlbnQgdGhlbWUgaXMgXCJTeXN0ZW0gZGVmYXVsdFwiXHJcbiAgICovXHJcbiAgcHJpdmF0ZSByZWFkb25seSBhdXRvOiBTaWduYWw8Ym9vbGVhbj4gPSBjb21wdXRlZCgoKSA9PiB0aGlzLnRoZW1lKCkgPT09ICdhdXRvJyk7XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbmZpZ3VyYXRpb24gc2NoZW1hIGFib3V0IHRoZSBpY29uLCB0aGUgdGV4dCBhbmQgdGhlIHRvZ2dsZSgpIHNlcXVlbmNlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSByZWFkb25seSB0aGVtZUluZm86IFJlY29yZDxUaGVtZVR5cGUsIFRoZW1lSW5mb1JlY29yZD4gPSB7XHJcbiAgICBbJ2F1dG8nXTogeyBpY29uOiAnY29udHJhc3QnLCBuYW1lOiAnSW1wb3N0YXppb25lIHByZWRlZmluaXRhIGRpIHNpc3RlbWEnLCBuZXh0OiAnbGlnaHQnLCB0b29sdGlwOiAnUGFzc2EgYSB0ZW1hIGNoaWFybycsIH0sXHJcbiAgICBbJ2xpZ2h0J106IHsgaWNvbjogJ2xpZ2h0X21vZGUnLCBuYW1lOiAnVGVtYSBjaGlhcm8nLCBuZXh0OiAnZGFyaycsIHRvb2x0aXA6ICdQYXNzYSBhIHRlbWEgc2N1cm8nLCB9LFxyXG4gICAgWydkYXJrJ106IHsgaWNvbjogJ2RhcmtfbW9kZScsIG5hbWU6ICdUZW1hIHNjdXJvJywgbmV4dDogJ2F1dG8nLCB0b29sdGlwOiAnUGFzc2EgYSB0ZW1hIHByZWRlZmluaXRvIGRpIHNpc3RlbWEnLCB9LFxyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gICAqIEljb24gb2YgdGhlIGN1cnJlbnQgdGhlbWUgKG1hdC1pY29uIGNvZGUpXHJcbiAgICovXHJcbiAgcHVibGljIHJlYWRvbmx5IHRoZW1lSWNvbjogU2lnbmFsPHN0cmluZz4gPSBjb21wdXRlZCgoKSA9PiB0aGlzLnRoZW1lSW5mb1t0aGlzLnRoZW1lKCldLmljb24pO1xyXG4gIC8qKlxyXG4gICAqIEN1cnJlbnQgdGhlbWUgbmFtZVxyXG4gICAqL1xyXG4gIHB1YmxpYyByZWFkb25seSB0aGVtZU5hbWU6IFNpZ25hbDxzdHJpbmc+ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy50aGVtZUluZm9bdGhpcy50aGVtZSgpXS5uYW1lKTtcclxuICAvKipcclxuICAgKiBUb29sdGlwIHRleHQgb24gdG9nZ2xlIFxyXG4gICAqL1xyXG4gIHB1YmxpYyByZWFkb25seSB0b2dnbGVUb29sdGlwOiBTaWduYWw8c3RyaW5nPiA9IGNvbXB1dGVkKCgpID0+IHRoaXMudGhlbWVJbmZvW3RoaXMudGhlbWUoKV0udG9vbHRpcCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5pbml0aWFsaXplKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJbml0aWFsaXplXHJcbiAgICovXHJcbiAgaW5pdGlhbGl6ZSgpIHtcclxuICAgIC8vIFJlYWN0IHRvIGN1cnJlbnQgdGhlbWVcclxuICAgIHRoaXMucHJlZmVyc0NvbG9yU2NoZW1lTWVkaWFRdWVyeUxpc3Qub25jaGFuZ2UgPSAoXzogTWVkaWFRdWVyeUxpc3RFdmVudCkgPT4gdGhpcy5hdXRvKCkgPyB0aGlzLnNldFRoZW1lKCkgOiBudWxsO1xyXG5cclxuICAgIC8vIFN1cHBvcnQgYm9yYWRjYXN0IGNoYW5uZWwgbWVzc2FnaW5nXHJcbiAgICB0aGlzLmJyb2FkY2FzdENoYW5uZWwuc3Vic2NyaWJlPFRoZW1lVHlwZT4oe1xyXG4gICAgICBtZXNzYWdlSWQ6IHRoaXMuYnJvYWRjYXN0TWVzc2FnZSxcclxuICAgICAgYWN0aW9uOiAoYmFnOiBCcm9hZGNhc3RDaGFubmVsTWVzc2FnZUJhZzxUaGVtZVR5cGU+KSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMudGhlbWUoKSAhPT0gYmFnLmRhdGEpIHtcclxuICAgICAgICAgIHRoaXMuc2V0VGhlbWUoYmFnLmRhdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gTG9hZCBjdXJyZW50IHRoZW1lXHJcbiAgICB0aGlzLmxvYWRUaGVtZSgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmJyb2FkY2FzdENoYW5uZWwuZGlzcG9zZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBjdXJyZW50IHByZWZlcnJlZCB0aGVtZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0UHJlZmVycmVkVGhlbWUoKTogVGhlbWVUeXBlIHtcclxuICAgIGxldCB0aGVtZTogVGhlbWVUeXBlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJwcmVmZXJyZWQtdGhlbWVcIikgYXMgVGhlbWVUeXBlO1xyXG4gICAgaWYgKCF0aGlzLmlzVGhlbWUodGhlbWUpKSB7XHJcbiAgICAgIHRoZW1lID0gJ2F1dG8nO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoZW1lO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTG9hZCB0aGVtZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgbG9hZFRoZW1lKCkge1xyXG4gICAgdGhpcy5zZXRUaGVtZSh0aGlzLmdldFByZWZlcnJlZFRoZW1lKCkpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIGEgdmFsdWUgc3RyaW5nIGlzIGEgdGhlbWUgdHlwZVxyXG4gICAqIEBwYXJhbSB2YWx1ZSA6IHRoIHN0cmluZyB2YWx1ZVxyXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIHRoZSB2YWx1ZSBpcyBhIHZhbGlkIHRoZW1lIHR5cGVcclxuICAgKi9cclxuICBwcml2YXRlIGlzVGhlbWUodmFsdWU6IHN0cmluZyk6IHZhbHVlIGlzIFRoZW1lVHlwZSB7XHJcbiAgICByZXR1cm4gWydhdXRvJywgJ2xpZ2h0JywgJ2RhcmsnXS5pbmNsdWRlcyh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRoZSBuZXcgdGhlbWVcclxuICAgKiBAcGFyYW0gdGhlbWUgdGhlIG5ldyB0aGVtZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgc2V0VGhlbWUodGhlbWU6IFRoZW1lVHlwZSA9ICdhdXRvJykge1xyXG4gICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyhkb2N1bWVudC5ib2R5LCAnbGlnaHQnKTtcclxuICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoZG9jdW1lbnQuYm9keSwgJ2RhcmsnKTtcclxuICAgIHRoaXMudGhlbWUuc2V0KHRoZW1lKTtcclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwicHJlZmVycmVkLXRoZW1lXCIsIHRoaXMudGhlbWUoKSk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGRvY3VtZW50LmJvZHksIHRoaXMuYXV0bygpID8gKHdpbmRvdy5tYXRjaE1lZGlhICYmIHdpbmRvdy5tYXRjaE1lZGlhKFwiKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKVwiKS5tYXRjaGVzID8gXCJkYXJrXCIgOiBcImxpZ2h0XCIpIDogdGhlbWUpO1xyXG4gICAgLy8gTm90aWZ5IHRoYXQgY3VycmVudCB0aGVtZSBoYXMgY2hhbmdlZFxyXG4gICAgdGhpcy50aGVtZUNoYW5nZWQubmV4dCh0aGlzLmdldFRoZW1lKCkpO1xyXG4gICAgdGhpcy5icm9hZGNhc3RDaGFubmVsLnNlbmRNZXNzYWdlKHRoaXMuYnJvYWRjYXN0TWVzc2FnZSwgdGhpcy50aGVtZSgpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRvZ2dsZSB0aGVtZVxyXG4gICAqL1xyXG4gIHB1YmxpYyB0b2dnbGVUaGVtZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuc2V0VGhlbWUodGhpcy50aGVtZUluZm9bdGhpcy50aGVtZSgpXS5uZXh0KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBjdXJyZW50IHJlYWwgdGhlbWU6IGxpZ2h0IG9yIGRhcmtcclxuICAgKi9cclxuICBwdWJsaWMgZ2V0VGhlbWUoKTogVGhlbWVUeXBlIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHRoaXMuYXV0bygpXHJcbiAgICAgICAgPyAod2luZG93Lm1hdGNoTWVkaWEgJiYgd2luZG93Lm1hdGNoTWVkaWEoXCIocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspXCIpLm1hdGNoZXMgPyBcImRhcmtcIiA6IFwibGlnaHRcIilcclxuICAgICAgICA6IHRoaXMuZ2V0UHJlZmVycmVkVGhlbWUoKSk7XHJcbiAgfVxyXG59Il19