@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.
- package/fesm2022/arsedizioni-ars-utils-clipper.common.mjs +10 -10
- package/fesm2022/arsedizioni-ars-utils-clipper.common.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-clipper.ui.mjs +41 -41
- package/fesm2022/arsedizioni-ars-utils-clipper.ui.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-core.mjs +99 -99
- package/fesm2022/arsedizioni-ars-utils-core.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-evolution.common.mjs +10 -10
- package/fesm2022/arsedizioni-ars-utils-evolution.common.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-help.mjs +13 -13
- package/fesm2022/arsedizioni-ars-utils-help.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-support.common.mjs +10 -10
- package/fesm2022/arsedizioni-ars-utils-support.common.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-support.ui.mjs +6 -6
- package/fesm2022/arsedizioni-ars-utils-support.ui.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-tinymce.mjs +7 -7
- package/fesm2022/arsedizioni-ars-utils-tinymce.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-ui.application.mjs +58 -58
- package/fesm2022/arsedizioni-ars-utils-ui.application.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-ui.mjs +34 -34
- package/fesm2022/arsedizioni-ars-utils-ui.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-ui.oauth.mjs +7 -7
- package/fesm2022/arsedizioni-ars-utils-ui.oauth.mjs.map +1 -1
- package/package.json +5 -29
- package/esm2022/arsedizioni-ars-utils.mjs +0 -5
- package/esm2022/clipper.common/arsedizioni-ars-utils-clipper.common.mjs +0 -5
- package/esm2022/clipper.common/common/common.module.mjs +0 -16
- package/esm2022/clipper.common/common/definitions.mjs +0 -2041
- package/esm2022/clipper.common/common/interceptors/auth.interceptor.mjs +0 -100
- package/esm2022/clipper.common/common/messages.mjs +0 -36
- package/esm2022/clipper.common/common/services/clipper.service.mjs +0 -1011
- package/esm2022/clipper.common/public_api.mjs +0 -5
- package/esm2022/clipper.ui/arsedizioni-ars-utils-clipper.ui.mjs +0 -5
- package/esm2022/clipper.ui/documents.mjs +0 -50
- package/esm2022/clipper.ui/public_api.mjs +0 -18
- package/esm2022/clipper.ui/ui/browser-dialog/browser-dialog.component.mjs +0 -766
- package/esm2022/clipper.ui/ui/document/document.component.mjs +0 -688
- package/esm2022/clipper.ui/ui/document-index/document-index.component.mjs +0 -118
- package/esm2022/clipper.ui/ui/document-manager/document-manager.mjs +0 -441
- package/esm2022/clipper.ui/ui/document-menu/document-menu.component.mjs +0 -217
- package/esm2022/clipper.ui/ui/references/references.component.mjs +0 -380
- package/esm2022/clipper.ui/ui/search-calendar/search-calendar.component.mjs +0 -116
- package/esm2022/clipper.ui/ui/search-dialog/search-dialog.component.mjs +0 -339
- package/esm2022/clipper.ui/ui/search-facets/search-facets.component.mjs +0 -251
- package/esm2022/clipper.ui/ui/search-free-text-help/search-free-text-help.component.mjs +0 -17
- package/esm2022/clipper.ui/ui/search-free-text-query-builder/search-free-text-query-builder.component.mjs +0 -106
- package/esm2022/clipper.ui/ui/search-result-item/search-result-item.component.mjs +0 -120
- package/esm2022/clipper.ui/ui/search-result-manager/search-result-manager.mjs +0 -531
- package/esm2022/core/arsedizioni-ars-utils-core.mjs +0 -5
- package/esm2022/core/core.module.mjs +0 -151
- package/esm2022/core/dateFnsAdapter.mjs +0 -203
- package/esm2022/core/definitions.mjs +0 -47
- package/esm2022/core/directives/autoFocusDirective.mjs +0 -22
- package/esm2022/core/directives/changeDateIntervalDirective.mjs +0 -48
- package/esm2022/core/directives/copyClipboardDirective.mjs +0 -46
- package/esm2022/core/directives/validators.mjs +0 -502
- package/esm2022/core/pipes/format.pipe.mjs +0 -53
- package/esm2022/core/pipes/replace.pipe.mjs +0 -29
- package/esm2022/core/pipes/safe-html.pipe.mjs +0 -24
- package/esm2022/core/pipes/safe-url.pipe.mjs +0 -24
- package/esm2022/core/pipes/search-callback.pipe.mjs +0 -21
- package/esm2022/core/pipes/search-filter.pipe.mjs +0 -50
- package/esm2022/core/public_api.mjs +0 -22
- package/esm2022/core/selectable.mjs +0 -131
- package/esm2022/core/services/broadcast.service.mjs +0 -35
- package/esm2022/core/services/broadcastChannelManager.mjs +0 -80
- package/esm2022/core/services/environment.service.mjs +0 -29
- package/esm2022/core/services/screen.service.mjs +0 -23
- package/esm2022/core/services/theme.service.mjs +0 -140
- package/esm2022/core/system.mjs +0 -664
- package/esm2022/evolution.common/arsedizioni-ars-utils-evolution.common.mjs +0 -5
- package/esm2022/evolution.common/common/common.module.mjs +0 -16
- package/esm2022/evolution.common/common/definitions.mjs +0 -454
- package/esm2022/evolution.common/common/interceptors/auth.interceptor.mjs +0 -100
- package/esm2022/evolution.common/common/messages.mjs +0 -8
- package/esm2022/evolution.common/common/services/evolution.service.mjs +0 -490
- package/esm2022/evolution.common/public_api.mjs +0 -5
- package/esm2022/help/arsedizioni-ars-utils-help.mjs +0 -5
- package/esm2022/help/components/help-viewer/help-viewer.component.mjs +0 -442
- package/esm2022/help/definitions.mjs +0 -2
- package/esm2022/help/help.module.mjs +0 -12
- package/esm2022/help/public_api.mjs +0 -7
- package/esm2022/help/services/help.service.mjs +0 -77
- package/esm2022/public_api.mjs +0 -15
- package/esm2022/support.common/arsedizioni-ars-utils-support.common.mjs +0 -5
- package/esm2022/support.common/common/common.module.mjs +0 -16
- package/esm2022/support.common/common/definitions.mjs +0 -29
- package/esm2022/support.common/common/interceptors/auth.interceptor.mjs +0 -100
- package/esm2022/support.common/common/messages.mjs +0 -13
- package/esm2022/support.common/common/services/support.service.mjs +0 -289
- package/esm2022/support.common/public_api.mjs +0 -8
- package/esm2022/support.ui/arsedizioni-ars-utils-support.ui.mjs +0 -5
- package/esm2022/support.ui/public_api.mjs +0 -5
- package/esm2022/support.ui/ui/notifications-browser/notification/notification.component.mjs +0 -80
- package/esm2022/support.ui/ui/notifications-browser/notifications-browser.component.mjs +0 -233
- package/esm2022/tinymce/arsedizioni-ars-utils-tinymce.mjs +0 -5
- package/esm2022/tinymce/full-screen-editor/full-screen-editor.component.mjs +0 -48
- package/esm2022/tinymce/public_api.mjs +0 -7
- package/esm2022/tinymce/tinymce.module.mjs +0 -19
- package/esm2022/tinymce/utils.mjs +0 -150
- package/esm2022/ui/arsedizioni-ars-utils-ui.mjs +0 -5
- package/esm2022/ui/public_api.mjs +0 -12
- package/esm2022/ui/ui/components/button-selector/button-selector.component.mjs +0 -150
- package/esm2022/ui/ui/components/button-toggle/button-toggle.component.mjs +0 -51
- package/esm2022/ui/ui/components/calendar-empty-header/calendar-empy-header.component.mjs +0 -30
- package/esm2022/ui/ui/components/chips-selector/chips-selector.component.mjs +0 -272
- package/esm2022/ui/ui/components/file-input/file-input.component.mjs +0 -264
- package/esm2022/ui/ui/components/file-preview/file-preview.component.mjs +0 -73
- package/esm2022/ui/ui/components/filter-bar/filter-bar.component.mjs +0 -356
- package/esm2022/ui/ui/definitions.mjs +0 -2
- package/esm2022/ui/ui/dialogs/busy/busy-dialog.component.mjs +0 -47
- package/esm2022/ui/ui/dialogs/confirm/confirm-dialog.component.mjs +0 -101
- package/esm2022/ui/ui/dialogs/credentials/credentials-dialog.component.mjs +0 -86
- package/esm2022/ui/ui/dialogs/info/info-dialog.component.mjs +0 -51
- package/esm2022/ui/ui/dialogs/prompt/prompt-dialog.component.mjs +0 -77
- package/esm2022/ui/ui/dialogs/prompt-date/prompt-date-dialog.component.mjs +0 -79
- package/esm2022/ui/ui/dialogs/prompt-time/prompt-time-dialog.component.mjs +0 -72
- package/esm2022/ui/ui/dialogs/recover-password/recover-password-dialog.component.mjs +0 -49
- package/esm2022/ui/ui/dialogs/reset-password/reset-password-dialog.component.mjs +0 -89
- package/esm2022/ui/ui/dialogs/select/select-dialog.component.mjs +0 -374
- package/esm2022/ui/ui/dialogs/select-file/select-file-dialog.component.mjs +0 -106
- package/esm2022/ui/ui/dialogs/select-picture/select-picture-dialog.component.mjs +0 -62
- package/esm2022/ui/ui/dialogs/select-tree/select-tree-dialog.component.mjs +0 -277
- package/esm2022/ui/ui/dialogs/send-to/send-to-dialog.component.mjs +0 -90
- package/esm2022/ui/ui/dialogs/toast/toast.component.mjs +0 -32
- package/esm2022/ui/ui/directives/resize-table-column.directive.mjs +0 -63
- package/esm2022/ui/ui/filters.mjs +0 -43
- package/esm2022/ui/ui/paginatorIntl.mjs +0 -34
- package/esm2022/ui/ui/services/dialog.service.mjs +0 -417
- package/esm2022/ui/ui/services/ui.service.mjs +0 -21
- package/esm2022/ui/ui/ui.module.mjs +0 -21
- package/esm2022/ui.application/arsedizioni-ars-utils-ui.application.mjs +0 -5
- package/esm2022/ui.application/public_api.mjs +0 -21
- package/esm2022/ui.application/ui/components/button-selector/button-selector.component.mjs +0 -150
- package/esm2022/ui.application/ui/components/button-toggle/button-toggle.component.mjs +0 -51
- package/esm2022/ui.application/ui/components/calendar-empty-header/calendar-empy-header.component.mjs +0 -30
- package/esm2022/ui.application/ui/components/chips-selector/chips-selector.component.mjs +0 -272
- package/esm2022/ui.application/ui/components/file-input/file-input.component.mjs +0 -264
- package/esm2022/ui.application/ui/components/file-preview/file-preview.component.mjs +0 -73
- package/esm2022/ui.application/ui/components/filter-bar/filter-bar.component.mjs +0 -356
- package/esm2022/ui.application/ui/definitions.mjs +0 -31
- package/esm2022/ui.application/ui/dialogs/prompt/prompt-dialog.component.mjs +0 -77
- package/esm2022/ui.application/ui/dialogs/prompt-date/prompt-date-dialog.component.mjs +0 -79
- package/esm2022/ui.application/ui/dialogs/prompt-time/prompt-time-dialog.component.mjs +0 -72
- package/esm2022/ui.application/ui/dialogs/select/select-dialog.component.mjs +0 -374
- package/esm2022/ui.application/ui/dialogs/select-file/select-file-dialog.component.mjs +0 -106
- package/esm2022/ui.application/ui/dialogs/select-picture/select-picture-dialog.component.mjs +0 -62
- package/esm2022/ui.application/ui/dialogs/select-tree/select-tree-dialog.component.mjs +0 -277
- package/esm2022/ui.application/ui/dialogs/send-to/send-to-dialog.component.mjs +0 -90
- package/esm2022/ui.application/ui/directives/resize-table-column.directive.mjs +0 -63
- package/esm2022/ui.application/ui/filters.mjs +0 -43
- package/esm2022/ui.application/ui/services/applicationDialog.service.mjs +0 -304
- package/esm2022/ui.application/ui/ui.module.mjs +0 -30
- package/esm2022/ui.oauth/arsedizioni-ars-utils-ui.oauth.mjs +0 -5
- package/esm2022/ui.oauth/public_api.mjs +0 -6
- package/esm2022/ui.oauth/ui/components/login/login-oauth.component.mjs +0 -199
- package/esm2022/ui.oauth/ui/definitions.mjs +0 -7
- package/esm2022/ui.oauth/ui/ui.module.mjs +0 -13
- package/ui/ui/components/button-selector/button-selector.component.d.ts +0 -52
- package/ui/ui/components/button-toggle/button-toggle.component.d.ts +0 -28
- package/ui/ui/components/calendar-empty-header/calendar-empy-header.component.d.ts +0 -11
- package/ui/ui/components/chips-selector/chips-selector.component.d.ts +0 -82
- package/ui/ui/components/file-input/file-input.component.d.ts +0 -88
- package/ui/ui/components/file-preview/file-preview.component.d.ts +0 -26
- package/ui/ui/components/filter-bar/filter-bar.component.d.ts +0 -83
- package/ui/ui/dialogs/prompt/prompt-dialog.component.d.ts +0 -18
- package/ui/ui/dialogs/prompt-date/prompt-date-dialog.component.d.ts +0 -18
- package/ui/ui/dialogs/prompt-time/prompt-time-dialog.component.d.ts +0 -18
- package/ui/ui/dialogs/select/select-dialog.component.d.ts +0 -122
- package/ui/ui/dialogs/select-file/select-file-dialog.component.d.ts +0 -36
- package/ui/ui/dialogs/select-picture/select-picture-dialog.component.d.ts +0 -26
- package/ui/ui/dialogs/select-tree/select-tree-dialog.component.d.ts +0 -98
- package/ui/ui/dialogs/send-to/send-to-dialog.component.d.ts +0 -28
- package/ui/ui/directives/resize-table-column.directive.d.ts +0 -19
- 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
|