@arsedizioni/ars-utils 18.5.61 → 19.0.1
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 +14 -12
- 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 +15 -13
- 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 +14 -12
- 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/fesm2022/arsedizioni-ars-utils.mjs.map +1 -1
- package/package.json +9 -33
- package/clipper.ui/ui/clipper.scss +0 -530
- 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 -1009
- 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 -488
- 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 -287
- 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/styles/ui.colors.scss +0 -77
- package/styles/ui.scss +0 -318
- 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,488 +0,0 @@
|
|
|
1
|
-
import { HttpClient, HttpHeaders } from '@angular/common/http';
|
|
2
|
-
import { inject, Injectable, signal } from '@angular/core';
|
|
3
|
-
import { BroadcastService, SystemUtils } from '@arsedizioni/ars-utils/core';
|
|
4
|
-
import { DialogService } from '@arsedizioni/ars-utils/ui';
|
|
5
|
-
import { of, throwError } from 'rxjs';
|
|
6
|
-
import { catchError, finalize, map } from 'rxjs/operators';
|
|
7
|
-
import { EvolutionServiceFlags } from './../definitions';
|
|
8
|
-
import { EvolutionMessages } from '../messages';
|
|
9
|
-
import * as i0 from "@angular/core";
|
|
10
|
-
export class EvolutionService {
|
|
11
|
-
constructor() {
|
|
12
|
-
this.httpClient = inject(HttpClient);
|
|
13
|
-
this.broadcastService = inject(BroadcastService);
|
|
14
|
-
this.broadcastServiceSubscription = null;
|
|
15
|
-
this.dialogService = inject(DialogService);
|
|
16
|
-
this._serviceUri = null;
|
|
17
|
-
this._flags = EvolutionServiceFlags.None;
|
|
18
|
-
this._loginInfo = null;
|
|
19
|
-
this.loggedIn = signal(false);
|
|
20
|
-
this.loggingIn = signal(false);
|
|
21
|
-
this.keepAlive = 0;
|
|
22
|
-
}
|
|
23
|
-
get serviceUri() {
|
|
24
|
-
return this._serviceUri;
|
|
25
|
-
}
|
|
26
|
-
get flags() {
|
|
27
|
-
return this._flags;
|
|
28
|
-
}
|
|
29
|
-
get loginInfo() {
|
|
30
|
-
if (!this._loginInfo) {
|
|
31
|
-
const loginInfo = localStorage.getItem('clipper_login_evolution');
|
|
32
|
-
if (loginInfo) {
|
|
33
|
-
try {
|
|
34
|
-
this._loginInfo = JSON.parse(loginInfo);
|
|
35
|
-
}
|
|
36
|
-
catch { }
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
return this._loginInfo;
|
|
40
|
-
}
|
|
41
|
-
ngOnDestroy() {
|
|
42
|
-
if (this.broadcastServiceSubscription) {
|
|
43
|
-
this.broadcastServiceSubscription.unsubscribe();
|
|
44
|
-
}
|
|
45
|
-
this.removeKeepAlive();
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Initialize service
|
|
49
|
-
* @param serviceUri : the service uri
|
|
50
|
-
* @param flags: the service flags. Default is none.
|
|
51
|
-
*/
|
|
52
|
-
initialize(serviceUri, flags = EvolutionServiceFlags.None) {
|
|
53
|
-
// Create unique client id
|
|
54
|
-
if (!localStorage.getItem('evolution_client_id')) {
|
|
55
|
-
localStorage.setItem('evolution_client_id', SystemUtils.generateUUID());
|
|
56
|
-
}
|
|
57
|
-
// Initialize
|
|
58
|
-
this._serviceUri = serviceUri;
|
|
59
|
-
this._flags = flags;
|
|
60
|
-
// React to message broadcasting
|
|
61
|
-
if (!this.broadcastServiceSubscription) {
|
|
62
|
-
this.broadcastServiceSubscription = this.broadcastService.getMessage().subscribe((message) => {
|
|
63
|
-
if (message.id === EvolutionMessages.LOGIN_CHANGED) {
|
|
64
|
-
setTimeout(() => {
|
|
65
|
-
this.login(message.data.email, message.data.password, true, message.data.oauth, message.data.oauthAccessToken).subscribe({
|
|
66
|
-
next: r => {
|
|
67
|
-
if (!r.success) {
|
|
68
|
-
if (r.message) {
|
|
69
|
-
this.dialogService.error(r.message, null, "Errore di Evolution");
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
else {
|
|
73
|
-
if ((this.flags & EvolutionServiceFlags.DisplayConnectionStateMessages) > 0) {
|
|
74
|
-
this.dialogService.toast('Connesso a Evolution', 1500, 'power');
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
},
|
|
78
|
-
error: () => { console.error("Evolution non disponibile."); } // Avoid unwanted errors on client
|
|
79
|
-
});
|
|
80
|
-
}, 500);
|
|
81
|
-
}
|
|
82
|
-
else if (message.id === EvolutionMessages.LOGOUT) {
|
|
83
|
-
if (this.loggedIn()) {
|
|
84
|
-
this.logout().subscribe(r => {
|
|
85
|
-
if (!r.success) {
|
|
86
|
-
if (r.message) {
|
|
87
|
-
this.dialogService.error("<p>" + r.message + "</p><br><br><hr><p class='small'><i>Per eliminare la configurazione di Evolution accedere a:<br><b>menu > personalizza > collegamenti</b></i></p>", null, "Errore di Evolution");
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
else {
|
|
91
|
-
if ((this.flags & EvolutionServiceFlags.DisplayConnectionStateMessages) > 0) {
|
|
92
|
-
this.dialogService.toast('Disconnesso da Evolution', 1500, 'power_off');
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
else {
|
|
98
|
-
this.clear();
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
// Eveluate current session storage in case of page refresh (F5)
|
|
104
|
-
if (!this.loggedIn() && this.getToken()) {
|
|
105
|
-
// Auto login
|
|
106
|
-
this.loggedIn.set(true);
|
|
107
|
-
// Notify
|
|
108
|
-
this.broadcastService.sendMessage(EvolutionMessages.LOGIN_COMPLETED);
|
|
109
|
-
// Set keep alive
|
|
110
|
-
this.setKeepAlive();
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
/**
|
|
114
|
-
* Set keep alive
|
|
115
|
-
*/
|
|
116
|
-
setKeepAlive() {
|
|
117
|
-
// Keep alive every 1 min
|
|
118
|
-
if (this.keepAlive === 0) {
|
|
119
|
-
this.keepAlive = window.setInterval(() => {
|
|
120
|
-
this.ping();
|
|
121
|
-
}, 1000 * 60);
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* Remove keep alive
|
|
126
|
-
*/
|
|
127
|
-
removeKeepAlive() {
|
|
128
|
-
if (this.keepAlive > 0) {
|
|
129
|
-
window.clearInterval(this.keepAlive);
|
|
130
|
-
this.keepAlive = 0;
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
/**
|
|
134
|
-
* Ping
|
|
135
|
-
*/
|
|
136
|
-
ping() {
|
|
137
|
-
this.httpClient.get(this._serviceUri + '/ping').subscribe();
|
|
138
|
-
}
|
|
139
|
-
/**
|
|
140
|
-
* Set JWT token
|
|
141
|
-
* @param value : the login result
|
|
142
|
-
*/
|
|
143
|
-
setToken(value) {
|
|
144
|
-
sessionStorage.setItem('evolution_jwt', value.token);
|
|
145
|
-
sessionStorage.setItem('evolution_jwt_refresh', value.refreshToken ?? '');
|
|
146
|
-
}
|
|
147
|
-
/**
|
|
148
|
-
* Return current JWT token
|
|
149
|
-
* @param refresh: true to get the refresh token. Default is false.
|
|
150
|
-
*/
|
|
151
|
-
getToken(refresh = false) {
|
|
152
|
-
let token = sessionStorage.getItem(refresh ? 'evolution_jwt_refresh' : 'evolution_jwt');
|
|
153
|
-
if (token && token[0] === '"') {
|
|
154
|
-
return token.substring(1, token.length - 1);
|
|
155
|
-
}
|
|
156
|
-
return token ?? '';
|
|
157
|
-
}
|
|
158
|
-
/**
|
|
159
|
-
* Store login info
|
|
160
|
-
*/
|
|
161
|
-
storeLogin() {
|
|
162
|
-
localStorage.setItem('evolution_login', JSON.stringify(this._loginInfo));
|
|
163
|
-
}
|
|
164
|
-
/**
|
|
165
|
-
* Perform auto login using current link data
|
|
166
|
-
* @param email: the optional email if using OAuth2
|
|
167
|
-
* @parma password: the optional password if using OAuth2
|
|
168
|
-
* @param remember: remember credentials
|
|
169
|
-
* @param oauth: the optional open authentication supported
|
|
170
|
-
* @param oauthAccessToken: the optional OAuth2 access token
|
|
171
|
-
* @param onSucces: function to execute on seccess
|
|
172
|
-
*/
|
|
173
|
-
autoLogin(email = null, password = null, remember = false, oauth = null, oauthAccessToken = null, onSucces = null) {
|
|
174
|
-
if (!oauth && !oauthAccessToken && (!email || !password)) {
|
|
175
|
-
// Try to use link if exists
|
|
176
|
-
const linkInfo = localStorage.getItem('clipper_link_evolution');
|
|
177
|
-
if (linkInfo) {
|
|
178
|
-
const link = JSON.parse(SystemUtils.cipher(linkInfo, 'evolution', true));
|
|
179
|
-
if (link) {
|
|
180
|
-
email = link.user;
|
|
181
|
-
password = link.password;
|
|
182
|
-
remember = true;
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
this.login(email, password, remember, oauth, oauthAccessToken)
|
|
187
|
-
.subscribe({
|
|
188
|
-
next: r => {
|
|
189
|
-
if (!r.success) {
|
|
190
|
-
this.dialogService.error(r.message, null, "Errore in Evolution");
|
|
191
|
-
}
|
|
192
|
-
else {
|
|
193
|
-
this.dialogService.toast('Connesso ad Evolution', 1500, 'power');
|
|
194
|
-
if (onSucces) {
|
|
195
|
-
onSucces();
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
},
|
|
199
|
-
error: () => { this.dialogService.error("Evolution non disponibile."); }
|
|
200
|
-
});
|
|
201
|
-
return true;
|
|
202
|
-
}
|
|
203
|
-
/**
|
|
204
|
-
* Perform auto logout
|
|
205
|
-
* @param onSucces: function to execute on seccess
|
|
206
|
-
*/
|
|
207
|
-
autoLogout(onSucces = null) {
|
|
208
|
-
if (!this.loggedIn())
|
|
209
|
-
return;
|
|
210
|
-
this.logout()
|
|
211
|
-
.pipe(map(r => { this.clear(); return r; }))
|
|
212
|
-
.subscribe({
|
|
213
|
-
next: r => {
|
|
214
|
-
if (!r.success) {
|
|
215
|
-
this.dialogService.error(r.message, null, "Errore in Evolution");
|
|
216
|
-
this.broadcastService.sendMessage(EvolutionMessages.LOGIN_CHANGED);
|
|
217
|
-
}
|
|
218
|
-
else {
|
|
219
|
-
this.dialogService.toast('Disconnesso da Evolution', 1500, 'power_off');
|
|
220
|
-
}
|
|
221
|
-
},
|
|
222
|
-
complete: () => {
|
|
223
|
-
if (onSucces) {
|
|
224
|
-
onSucces();
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
});
|
|
228
|
-
}
|
|
229
|
-
/**
|
|
230
|
-
* Perform login
|
|
231
|
-
* @param email: the optional email if using OAuth2
|
|
232
|
-
* @parma password: the optional password if using OAuth2
|
|
233
|
-
* @param remember: remember credentials
|
|
234
|
-
* @param oauth: the optional open authentication supported
|
|
235
|
-
* @param oauthAccessToken: the optional OAuth2 access token
|
|
236
|
-
* @returns: the login result
|
|
237
|
-
*/
|
|
238
|
-
login(email = null, password = null, remember = false, oauth = null, oauthAccessToken = null) {
|
|
239
|
-
this.loggingIn.set(true);
|
|
240
|
-
return this.httpClient
|
|
241
|
-
.post(this._serviceUri + '/login2', {
|
|
242
|
-
user: oauth ? null : email,
|
|
243
|
-
password: oauth ? null : password,
|
|
244
|
-
clientId: localStorage.getItem("evolution_client_id"),
|
|
245
|
-
OAUTH: oauth
|
|
246
|
-
}, {
|
|
247
|
-
headers: !oauth
|
|
248
|
-
? new HttpHeaders()
|
|
249
|
-
: new HttpHeaders()
|
|
250
|
-
.set("Authorization", oauthAccessToken ?? '')
|
|
251
|
-
})
|
|
252
|
-
.pipe(finalize(() => this.dialogService.clearBusy()), catchError(err => { this.handleLoginError(); return throwError(() => err); }), map((r) => {
|
|
253
|
-
this.loggingIn.set(false);
|
|
254
|
-
if (r.success) {
|
|
255
|
-
// Store access token
|
|
256
|
-
this.setToken(r.value);
|
|
257
|
-
const loginInfo = {
|
|
258
|
-
context: r.value.context,
|
|
259
|
-
OAUTH: oauth
|
|
260
|
-
};
|
|
261
|
-
if (!oauth) {
|
|
262
|
-
loginInfo.userCredentials =
|
|
263
|
-
SystemUtils.cipher(JSON.stringify({
|
|
264
|
-
email: email,
|
|
265
|
-
password: password,
|
|
266
|
-
remember: remember,
|
|
267
|
-
}), loginInfo.context.userId.toString());
|
|
268
|
-
}
|
|
269
|
-
this._loginInfo = loginInfo.context;
|
|
270
|
-
this.storeLogin();
|
|
271
|
-
this.loggedIn.set(true);
|
|
272
|
-
// Notify
|
|
273
|
-
this.broadcastService.sendMessage(EvolutionMessages.LOGIN_COMPLETED);
|
|
274
|
-
// Keep alive
|
|
275
|
-
this.setKeepAlive();
|
|
276
|
-
}
|
|
277
|
-
return r;
|
|
278
|
-
}));
|
|
279
|
-
}
|
|
280
|
-
/**
|
|
281
|
-
* Perform logout
|
|
282
|
-
*/
|
|
283
|
-
logout() {
|
|
284
|
-
return this.httpClient.post(this._serviceUri + '/logout', {}).pipe(finalize(() => { this.removeKeepAlive(); this.dialogService.clearBusy(); }), map(r => {
|
|
285
|
-
this.clear();
|
|
286
|
-
return r;
|
|
287
|
-
}), catchError((_e) => {
|
|
288
|
-
this.clear();
|
|
289
|
-
return of([]);
|
|
290
|
-
}));
|
|
291
|
-
}
|
|
292
|
-
/**
|
|
293
|
-
* Switch the current login to a new one with the same credentials except role possibly (context change)
|
|
294
|
-
* @param id : new user id
|
|
295
|
-
*/
|
|
296
|
-
loginSwitch(id) {
|
|
297
|
-
return this.httpClient
|
|
298
|
-
.post(this._serviceUri + '/login-switch/', {
|
|
299
|
-
userId: id,
|
|
300
|
-
clientId: localStorage.getItem("evolution_client_id")
|
|
301
|
-
})
|
|
302
|
-
.pipe(catchError((err) => {
|
|
303
|
-
this.handleLoginError();
|
|
304
|
-
return throwError(() => err);
|
|
305
|
-
}), map((r) => {
|
|
306
|
-
this.loggingIn.set(false);
|
|
307
|
-
if (r.success) {
|
|
308
|
-
// Store access token
|
|
309
|
-
this.setToken(r.value);
|
|
310
|
-
this._loginInfo = r.value.context;
|
|
311
|
-
this.loggedIn.set(true);
|
|
312
|
-
// Notify
|
|
313
|
-
this.broadcastService.sendMessage(EvolutionMessages.LOGIN_COMPLETED);
|
|
314
|
-
}
|
|
315
|
-
return r;
|
|
316
|
-
}));
|
|
317
|
-
}
|
|
318
|
-
/**
|
|
319
|
-
* Handle login error
|
|
320
|
-
*/
|
|
321
|
-
handleLoginError() {
|
|
322
|
-
this.loggingIn.set(false);
|
|
323
|
-
localStorage.removeItem('evolution_login');
|
|
324
|
-
}
|
|
325
|
-
/**
|
|
326
|
-
* Reset login refresh timer and login state
|
|
327
|
-
*/
|
|
328
|
-
reset() {
|
|
329
|
-
// Clear login info
|
|
330
|
-
this._loginInfo = null;
|
|
331
|
-
// Logged out
|
|
332
|
-
this.loggedIn.set(false);
|
|
333
|
-
// Notify
|
|
334
|
-
this.broadcastService.sendMessage(EvolutionMessages.LOGOUT_COMPLETED);
|
|
335
|
-
}
|
|
336
|
-
/**
|
|
337
|
-
* Clear login data
|
|
338
|
-
*/
|
|
339
|
-
clear() {
|
|
340
|
-
// Clear local storage
|
|
341
|
-
sessionStorage.removeItem('evolution_jwt');
|
|
342
|
-
sessionStorage.removeItem('evolution_jwt_refresh');
|
|
343
|
-
sessionStorage.removeItem('evolution_oauth');
|
|
344
|
-
localStorage.removeItem('evolution_login');
|
|
345
|
-
// Reset login
|
|
346
|
-
this.reset();
|
|
347
|
-
}
|
|
348
|
-
/**
|
|
349
|
-
* Perform token refresh
|
|
350
|
-
*/
|
|
351
|
-
refresh() {
|
|
352
|
-
return this.httpClient.get(this._serviceUri + '/refresh2/?token=' + this.getToken(true)).pipe(map((r) => {
|
|
353
|
-
// Update token
|
|
354
|
-
this.setToken(r.value);
|
|
355
|
-
}));
|
|
356
|
-
}
|
|
357
|
-
/**
|
|
358
|
-
* Convert folders in a tree of Node object.
|
|
359
|
-
* @param folders : the subfolders group or null to root
|
|
360
|
-
*/
|
|
361
|
-
toNodes(folders) {
|
|
362
|
-
return this._toNodes(folders, null);
|
|
363
|
-
}
|
|
364
|
-
/**
|
|
365
|
-
* Convert folders in a tree of Node object.
|
|
366
|
-
* @param folders : the children group or null to root
|
|
367
|
-
*/
|
|
368
|
-
_toNodes(folders, parent) {
|
|
369
|
-
let nodes = [];
|
|
370
|
-
folders.forEach((n) => {
|
|
371
|
-
let node = {
|
|
372
|
-
id: n.id,
|
|
373
|
-
name: n.name,
|
|
374
|
-
count: n.count,
|
|
375
|
-
parent: parent,
|
|
376
|
-
children: null,
|
|
377
|
-
bag: n,
|
|
378
|
-
};
|
|
379
|
-
node.children =
|
|
380
|
-
n.children && n.children.length > 0
|
|
381
|
-
? this._toNodes(n.children, node)
|
|
382
|
-
: [];
|
|
383
|
-
nodes.push(node);
|
|
384
|
-
});
|
|
385
|
-
return nodes;
|
|
386
|
-
}
|
|
387
|
-
/**
|
|
388
|
-
* Retrieve the taxonomy
|
|
389
|
-
*/
|
|
390
|
-
getTaxonomy() {
|
|
391
|
-
return this.httpClient.get(this._serviceUri + '/taxonomy');
|
|
392
|
-
}
|
|
393
|
-
/**
|
|
394
|
-
* Retrieve groups
|
|
395
|
-
* @param group: the group number
|
|
396
|
-
* @param register: the optional register id. Default is null.
|
|
397
|
-
*/
|
|
398
|
-
getGroups(group = 1, register = null) {
|
|
399
|
-
return this.httpClient.get(this._serviceUri +
|
|
400
|
-
(register
|
|
401
|
-
? '/compliance/groups/?group=' +
|
|
402
|
-
group +
|
|
403
|
-
'®ister=' +
|
|
404
|
-
register
|
|
405
|
-
: '/compliance/groups/?group=' + group));
|
|
406
|
-
}
|
|
407
|
-
////
|
|
408
|
-
// CONTEXT
|
|
409
|
-
////
|
|
410
|
-
/**
|
|
411
|
-
* Change context
|
|
412
|
-
*/
|
|
413
|
-
changeContext(params) {
|
|
414
|
-
return this.httpClient.post(this._serviceUri + '/compliance/context', params);
|
|
415
|
-
}
|
|
416
|
-
////
|
|
417
|
-
// REGISTERS
|
|
418
|
-
////
|
|
419
|
-
/**
|
|
420
|
-
* Retrieve a register
|
|
421
|
-
* @param id the register id
|
|
422
|
-
*/
|
|
423
|
-
getRegister(id) {
|
|
424
|
-
return this.httpClient.get(this._serviceUri +
|
|
425
|
-
'/compliance/registers/' + id);
|
|
426
|
-
}
|
|
427
|
-
/**
|
|
428
|
-
* Collect register profiles
|
|
429
|
-
* @param params parameters
|
|
430
|
-
*/
|
|
431
|
-
collectRegisterProfiles(params) {
|
|
432
|
-
return this.httpClient.post(this._serviceUri +
|
|
433
|
-
'/compliance/registers/profiles/collect', params);
|
|
434
|
-
}
|
|
435
|
-
////
|
|
436
|
-
// LAWS
|
|
437
|
-
////
|
|
438
|
-
/**
|
|
439
|
-
* Add one or more laws
|
|
440
|
-
* @param params parameters
|
|
441
|
-
*/
|
|
442
|
-
addLaws(params) {
|
|
443
|
-
return this.httpClient.post(this._serviceUri + '/compliance/laws/add', params);
|
|
444
|
-
}
|
|
445
|
-
////
|
|
446
|
-
// ACTIVITIES
|
|
447
|
-
////
|
|
448
|
-
/**
|
|
449
|
-
* Add one or more activities
|
|
450
|
-
* @param params parameters
|
|
451
|
-
*/
|
|
452
|
-
addActivities(params) {
|
|
453
|
-
return this.httpClient.post(this._serviceUri + '/compliance/activities/add', params);
|
|
454
|
-
}
|
|
455
|
-
/**
|
|
456
|
-
* Export laws
|
|
457
|
-
* @param params parameters
|
|
458
|
-
*/
|
|
459
|
-
exportLaws(params) {
|
|
460
|
-
return this.httpClient.post(this._serviceUri + '/compliance/laws/export', params, { responseType: 'blob' });
|
|
461
|
-
}
|
|
462
|
-
///
|
|
463
|
-
// LINKS
|
|
464
|
-
///
|
|
465
|
-
/**
|
|
466
|
-
* Save a user link
|
|
467
|
-
* @param item: the user link
|
|
468
|
-
*/
|
|
469
|
-
saveLink(item) {
|
|
470
|
-
return this.httpClient.post(this._serviceUri + '/account/links/save', item);
|
|
471
|
-
}
|
|
472
|
-
/**
|
|
473
|
-
* Delete a user link
|
|
474
|
-
* @param item: the user link
|
|
475
|
-
*/
|
|
476
|
-
deleteLink(item) {
|
|
477
|
-
return this.httpClient.post(this._serviceUri + '/account/links/delete', item);
|
|
478
|
-
}
|
|
479
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.10", ngImport: i0, type: EvolutionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
480
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.10", ngImport: i0, type: EvolutionService, providedIn: 'root' }); }
|
|
481
|
-
}
|
|
482
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.10", ngImport: i0, type: EvolutionService, decorators: [{
|
|
483
|
-
type: Injectable,
|
|
484
|
-
args: [{
|
|
485
|
-
providedIn: 'root',
|
|
486
|
-
}]
|
|
487
|
-
}] });
|
|
488
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZvbHV0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hcnMtdXRpbHMvZXZvbHV0aW9uLmNvbW1vbi9jb21tb24vc2VydmljZXMvZXZvbHV0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBYSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEUsT0FBTyxFQUFtQyxnQkFBZ0IsRUFBcUIsV0FBVyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDaEksT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzFELE9BQU8sRUFBRSxFQUFFLEVBQWdCLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwRCxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzRCxPQUFPLEVBQTJLLHFCQUFxQixFQUF3QyxNQUFNLGtCQUFrQixDQUFDO0FBQ3hRLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGFBQWEsQ0FBQzs7QUFNaEQsTUFBTSxPQUFPLGdCQUFnQjtJQUg3QjtRQU1VLGVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEMscUJBQWdCLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDNUMsaUNBQTRCLEdBQXlCLElBQUksQ0FBQztRQUMxRCxrQkFBYSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUV0QyxnQkFBVyxHQUFXLElBQUksQ0FBQztRQUkzQixXQUFNLEdBQTBCLHFCQUFxQixDQUFDLElBQUksQ0FBQztRQUkzRCxlQUFVLEdBQTZCLElBQUksQ0FBQztRQVlwQyxhQUFRLEdBQUcs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RyxxQkFBcUIsRUFDeEMsSUFBSSxDQUNMLENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsVUFBVSxDQUFDLElBQXVCO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQ3pCLElBQUksQ0FBQyxXQUFXLEdBQUcsdUJBQXVCLEVBQzFDLElBQUksQ0FDTCxDQUFDO0lBQ0osQ0FBQzsrR0Fwa0JVLGdCQUFnQjttSEFBaEIsZ0JBQWdCLGNBRmYsTUFBTTs7NEZBRVAsZ0JBQWdCO2tCQUg1QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUsIE9uRGVzdHJveSwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFwaVJlc3VsdCwgQnJvYWRjYXN0TWVzc2FnZUluZm8sIEJyb2FkY2FzdFNlcnZpY2UsIEZvbGRlclRyZWUsIElOb2RlLCBTeXN0ZW1VdGlscyB9IGZyb20gJ0BhcnNlZGl6aW9uaS9hcnMtdXRpbHMvY29yZSc7XHJcbmltcG9ydCB7IERpYWxvZ1NlcnZpY2UgfSBmcm9tICdAYXJzZWRpemlvbmkvYXJzLXV0aWxzL3VpJztcclxuaW1wb3J0IHsgb2YsIFN1YnNjcmlwdGlvbiwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBjYXRjaEVycm9yLCBmaW5hbGl6ZSwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBMb2dpbk9BdXRoVHlwZSB9IGZyb20gJ0BhcnNlZGl6aW9uaS9hcnMtdXRpbHMvdWkub2F1dGgnO1xyXG5pbXBvcnQgeyBFdm9sdXRpb25Db21wbGlhbmNlQWN0aXZpdGllc0FkZFBhcmFtcywgRXZvbHV0aW9uQ29tcGxpYW5jZUFjdGl2aXR5LCBFdm9sdXRpb25Db21wbGlhbmNlTGF3LCBFdm9sdXRpb25Db21wbGlhbmNlTGF3c0FkZFBhcmFtcywgRXZvbHV0aW9uTG9naW5JbmZvLCBFdm9sdXRpb25Mb2dpblJlc3VsdCwgRXZvbHV0aW9uU2VydmljZUZsYWdzLCBFdm9sdXRpb25Vc2VySW5mbywgRXZvbHV0aW9uVXNlckxpbmsgfSBmcm9tICcuLy4uL2RlZmluaXRpb25zJztcclxuaW1wb3J0IHsgRXZvbHV0aW9uTWVzc2FnZXMgfSBmcm9tICcuLi9tZXNzYWdlcyc7XHJcblxyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIEV2b2x1dGlvblNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xyXG5cclxuXHJcbiAgcHJpdmF0ZSBodHRwQ2xpZW50ID0gaW5qZWN0KEh0dHBDbGllbnQpO1xyXG4gIHByaXZhdGUgYnJvYWRjYXN0U2VydmljZSA9IGluamVjdChCcm9hZGNhc3RTZXJ2aWNlKTtcclxuICBwcml2YXRlIGJyb2FkY2FzdFNlcnZpY2VTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIGRpYWxvZ1NlcnZpY2UgPSBpbmplY3QoRGlhbG9nU2VydmljZSk7XHJcblxyXG4gIHByaXZhdGUgX3NlcnZpY2VVcmk6IHN0cmluZyA9IG51bGw7XHJcbiAgZ2V0IHNlcnZpY2VVcmkoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9zZXJ2aWNlVXJpO1xyXG4gIH1cclxuICBwcml2YXRlIF9mbGFnczogRXZvbHV0aW9uU2VydmljZUZsYWdzID0gRXZvbHV0aW9uU2VydmljZUZsYWdzLk5vbmU7XHJcbiAgZ2V0IGZsYWdzKCk6IEV2b2x1dGlvblNlcnZpY2VGbGFncyB7XHJcbiAgICByZXR1cm4gdGhpcy5fZmxhZ3M7XHJcbiAgfVxyXG4gIHByaXZhdGUgX2xvZ2luSW5mbzogRXZvbHV0aW9uVXNlckluZm8gfCBudWxsID0gbnVsbDtcclxuICBnZXQgbG9naW5JbmZvKCk6IEV2b2x1dGlvblVzZXJJbmZvIHwgbnVsbCB7XHJcbiAgICBpZiAoIXRoaXMuX2xvZ2luSW5mbykge1xyXG4gICAgICBjb25zdCBsb2dpbkluZm8gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2xpcHBlcl9sb2dpbl9ldm9sdXRpb24nKTtcclxuICAgICAgaWYgKGxvZ2luSW5mbykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICB0aGlzLl9sb2dpbkluZm8gPSBKU09OLnBhcnNlKGxvZ2luSW5mbykgYXMgRXZvbHV0aW9uVXNlckluZm87XHJcbiAgICAgICAgfSBjYXRjaCB7IH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuX2xvZ2luSW5mbztcclxuICB9XHJcbiAgcHVibGljIHJlYWRvbmx5IGxvZ2dlZEluID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcclxuICBwdWJsaWMgcmVhZG9ubHkgbG9nZ2luZ0luID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcclxuICBwcml2YXRlIGtlZXBBbGl2ZSA9IDA7XHJcblxyXG5cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICBpZiAodGhpcy5icm9hZGNhc3RTZXJ2aWNlU3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMuYnJvYWRjYXN0U2VydmljZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5yZW1vdmVLZWVwQWxpdmUoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluaXRpYWxpemUgc2VydmljZVxyXG4gICAqIEBwYXJhbSBzZXJ2aWNlVXJpIDogdGhlIHNlcnZpY2UgdXJpXHJcbiAgICogQHBhcmFtIGZsYWdzOiB0aGUgc2VydmljZSBmbGFncy4gRGVmYXVsdCBpcyBub25lLlxyXG4gICAqL1xyXG4gIGluaXRpYWxpemUoXHJcbiAgICBzZXJ2aWNlVXJpOiBzdHJpbmcsXHJcbiAgICBmbGFnczogRXZvbHV0aW9uU2VydmljZUZsYWdzID0gRXZvbHV0aW9uU2VydmljZUZsYWdzLk5vbmUpIHtcclxuICAgIC8vIENyZWF0ZSB1bmlxdWUgY2xpZW50IGlkXHJcbiAgICBpZiAoIWxvY2FsU3RvcmFnZS5nZXRJdGVtKCdldm9sdXRpb25fY2xpZW50X2lkJykpIHtcclxuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2V2b2x1dGlvbl9jbGllbnRfaWQnLCBTeXN0ZW1VdGlscy5nZW5lcmF0ZVVVSUQoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSW5pdGlhbGl6ZVxyXG4gICAgdGhpcy5fc2VydmljZVVyaSA9IHNlcnZpY2VVcmk7XHJcbiAgICB0aGlzLl9mbGFncyA9IGZsYWdzO1xyXG5cclxuICAgIC8vIFJlYWN0IHRvIG1lc3NhZ2UgYnJvYWRjYXN0aW5nXHJcbiAgICBpZiAoIXRoaXMuYnJvYWRjYXN0U2VydmljZVN1YnNjcmlwdGlvbikge1xyXG4gICAgICB0aGlzLmJyb2FkY2FzdFNlcnZpY2VTdWJzY3JpcHRpb24gPSB0aGlzLmJyb2FkY2FzdFNlcnZpY2UuZ2V0TWVzc2FnZSgpLnN1YnNjcmliZSgobWVzc2FnZTogQnJvYWRjYXN0TWVzc2FnZUluZm8pID0+IHtcclxuICAgICAgICBpZiAobWVzc2FnZS5pZCA9PT0gRXZvbHV0aW9uTWVzc2FnZXMuTE9HSU5fQ0hBTkdFRCkge1xyXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubG9naW4oXHJcbiAgICAgICAgICAgICAgbWVzc2FnZS5kYXRhLmVtYWlsLFxyXG4gICAgICAgICAgICAgIG1lc3NhZ2UuZGF0YS5wYXNzd29yZCxcclxuICAgICAgICAgICAgICB0cnVlLFxyXG4gICAgICAgICAgICAgIG1lc3NhZ2UuZGF0YS5vYXV0aCxcclxuICAgICAgICAgICAgICBtZXNzYWdlLmRhdGEub2F1dGhBY2Nlc3NUb2tlbikuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgICAgIG5leHQ6IHIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoIXIuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyLm1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5lcnJvcihyLm1lc3NhZ2UsIG51bGwsIFwiRXJyb3JlIGRpIEV2b2x1dGlvblwiKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGlzLmZsYWdzICYgRXZvbHV0aW9uU2VydmljZUZsYWdzLkRpc3BsYXlDb25uZWN0aW9uU3RhdGVNZXNzYWdlcykgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UudG9hc3QoJ0Nvbm5lc3NvIGEgRXZvbHV0aW9uJywgMTUwMCwgJ3Bvd2VyJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZXJyb3I6ICgpID0+IHsgY29uc29sZS5lcnJvcihcIkV2b2x1dGlvbiBub24gZGlzcG9uaWJpbGUuXCIpIH0gLy8gQXZvaWQgdW53YW50ZWQgZXJyb3JzIG9uIGNsaWVudFxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSwgNTAwKTtcclxuICAgICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UuaWQgPT09IEV2b2x1dGlvbk1lc3NhZ2VzLkxPR09VVCkge1xyXG4gICAgICAgICAgaWYgKHRoaXMubG9nZ2VkSW4oKSkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ291dCgpLnN1YnNjcmliZShyID0+IHtcclxuICAgICAgICAgICAgICBpZiAoIXIuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHIubWVzc2FnZSkge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UuZXJyb3IoXCI8cD5cIiArIHIubWVzc2FnZSArIFwiPC9wPjxicj48YnI+PGhyPjxwIGNsYXNzPSdzbWFsbCc+PGk+UGVyIGVsaW1pbmFyZSBsYSBjb25maWd1cmF6aW9uZSBkaSBFdm9sdXRpb24gYWNjZWRlcmUgYTo8YnI+PGI+bWVudSA+IHBlcnNvbmFsaXp6YSA+IGNvbGxlZ2FtZW50aTwvYj48L2k+PC9wPlwiLCBudWxsLCBcIkVycm9yZSBkaSBFdm9sdXRpb25cIik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICgodGhpcy5mbGFncyAmIEV2b2x1dGlvblNlcnZpY2VGbGFncy5EaXNwbGF5Q29ubmVjdGlvblN0YXRlTWVzc2FnZXMpID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UudG9hc3QoJ0Rpc2Nvbm5lc3NvIGRhIEV2b2x1dGlvbicsIDE1MDAsICdwb3dlcl9vZmYnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5jbGVhcigpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRXZlbHVhdGUgY3VycmVudCBzZXNzaW9uIHN0b3JhZ2UgaW4gY2FzZSBvZiBwYWdlIHJlZnJlc2ggKEY1KVxyXG4gICAgaWYgKCF0aGlzLmxvZ2dlZEluKCkgJiYgdGhpcy5nZXRUb2tlbigpKSB7XHJcbiAgICAgIC8vIEF1dG8gbG9naW5cclxuICAgICAgdGhpcy5sb2dnZWRJbi5zZXQodHJ1ZSk7XHJcbiAgICAgIC8vIE5vdGlmeVxyXG4gICAgICB0aGlzLmJyb2FkY2FzdFNlcnZpY2Uuc2VuZE1lc3NhZ2UoRXZvbHV0aW9uTWVzc2FnZXMuTE9HSU5fQ09NUExFVEVEKTtcclxuICAgICAgLy8gU2V0IGtlZXAgYWxpdmVcclxuICAgICAgdGhpcy5zZXRLZWVwQWxpdmUoKTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQga2VlcCBhbGl2ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgc2V0S2VlcEFsaXZlKCkge1xyXG4gICAgLy8gS2VlcCBhbGl2ZSBldmVyeSAxIG1pblxyXG4gICAgaWYgKHRoaXMua2VlcEFsaXZlID09PSAwKSB7XHJcbiAgICAgIHRoaXMua2VlcEFsaXZlID0gd2luZG93LnNldEludGVydmFsKFxyXG4gICAgICAgICgpID0+IHtcclxuICAgICAgICAgIHRoaXMucGluZygpO1xyXG4gICAgICAgIH0sIDEwMDAgKiA2MCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZW1vdmUga2VlcCBhbGl2ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVtb3ZlS2VlcEFsaXZlKCkge1xyXG4gICAgaWYgKHRoaXMua2VlcEFsaXZlID4gMCkge1xyXG4gICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmtlZXBBbGl2ZSk7XHJcbiAgICAgIHRoaXMua2VlcEFsaXZlID0gMDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gKiBQaW5nXHJcbiAqL1xyXG4gIHBpbmcoKSB7XHJcbiAgICB0aGlzLmh0dHBDbGllbnQuZ2V0PEFwaVJlc3VsdDxudW1iZXI+PihcclxuICAgICAgdGhpcy5fc2VydmljZVVyaSArICcvcGluZydcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiogU2V0IEpXVCB0b2tlblxyXG4qIEBwYXJhbSB2YWx1ZSA6IHRoZSBsb2dpbiByZXN1bHRcclxuKi9cclxuICBwcml2YXRlIHNldFRva2VuKHZhbHVlOiBFdm9sdXRpb25Mb2dpblJlc3VsdCkge1xyXG4gICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgnZXZvbHV0aW9uX2p3dCcsIHZhbHVlLnRva2VuKTtcclxuICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oJ2V2b2x1dGlvbl9qd3RfcmVmcmVzaCcsIHZhbHVlLnJlZnJlc2hUb2tlbiA/PyAnJyk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJuIGN1cnJlbnQgSldUIHRva2VuXHJcbiAgICogQHBhcmFtIHJlZnJlc2g6IHRydWUgdG8gZ2V0IHRoZSByZWZyZXNoIHRva2VuLiBEZWZhdWx0IGlzIGZhbHNlLlxyXG4gICAqL1xyXG4gIGdldFRva2VuKHJlZnJlc2g6IGJvb2xlYW4gPSBmYWxzZSk6IHN0cmluZyB7XHJcbiAgICBsZXQgdG9rZW4gPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHJlZnJlc2ggPyAnZXZvbHV0aW9uX2p3dF9yZWZyZXNoJyA6ICdldm9sdXRpb25fand0Jyk7XHJcbiAgICBpZiAodG9rZW4gJiYgdG9rZW5bMF0gPT09ICdcIicpIHtcclxuICAgICAgcmV0dXJuIHRva2VuLnN1YnN0cmluZygxLCB0b2tlbi5sZW5ndGggLSAxKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0b2tlbiA/PyAnJztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gKiBTdG9yZSBsb2dpbiBpbmZvXHJcbiAqL1xyXG4gIHN0b3JlTG9naW4oKSB7XHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnZXZvbHV0aW9uX2xvZ2luJywgSlNPTi5zdHJpbmdpZnkodGhpcy5fbG9naW5JbmZvKSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICogUGVyZm9ybSBhdXRvIGxvZ2luIHVzaW5nIGN1cnJlbnQgbGluayBkYXRhXHJcbiAgICogQHBhcmFtIGVtYWlsOiB0aGUgb3B0aW9uYWwgZW1haWwgaWYgdXNpbmcgT0F1dGgyXHJcbiAgICogQHBhcm1hIHBhc3N3b3JkOiB0aGUgb3B0aW9uYWwgcGFzc3dvcmQgaWYgdXNpbmcgT0F1dGgyXHJcbiAgICogQHBhcmFtIHJlbWVtYmVyOiByZW1lbWJlciBjcmVkZW50aWFscyBcclxuICAgKiBAcGFyYW0gb2F1dGg6IHRoZSBvcHRpb25hbCBvcGVuIGF1dGhlbnRpY2F0aW9uIHN1cHBvcnRlZFxyXG4gICAqIEBwYXJhbSBvYXV0aEFjY2Vzc1Rva2VuOiB0aGUgb3B0aW9uYWwgT0F1dGgyIGFjY2VzcyB0b2tlblxyXG4gKiBAcGFyYW0gb25TdWNjZXM6IGZ1bmN0aW9uIHRvIGV4ZWN1dGUgb24gc2VjY2Vzc1xyXG4gKi9cclxuICBhdXRvTG9naW4oXHJcbiAgICBlbWFpbDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCA9IG51bGwsXHJcbiAgICBwYXNzd29yZDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCA9IG51bGwsXHJcbiAgICByZW1lbWJlcjogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQgPSBmYWxzZSxcclxuICAgIG9hdXRoOiBMb2dpbk9BdXRoVHlwZSB8IG51bGwgfCB1bmRlZmluZWQgPSBudWxsLFxyXG4gICAgb2F1dGhBY2Nlc3NUb2tlbjogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCA9IG51bGwsXHJcbiAgICBvblN1Y2NlczogRnVuY3Rpb24gfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCFvYXV0aCAmJiAhb2F1dGhBY2Nlc3NUb2tlbiAmJiAoIWVtYWlsIHx8ICFwYXNzd29yZCkpIHtcclxuICAgICAgLy8gVHJ5IHRvIHVzZSBsaW5rIGlmIGV4aXN0c1xyXG4gICAgICBjb25zdCBsaW5rSW5mbyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdjbGlwcGVyX2xpbmtfZXZvbHV0aW9uJyk7XHJcbiAgICAgIGlmIChsaW5rSW5mbykge1xyXG4gICAgICAgIGNvbnN0IGxpbmsgPSBKU09OLnBhcnNlKFN5c3RlbVV0aWxzLmNpcGhlcihsaW5rSW5mbywgJ2V2b2x1dGlvbicsIHRydWUpKTtcclxuICAgICAgICBpZiAobGluaykge1xyXG4gICAgICAgICAgZW1haWwgPSBsaW5rLnVzZXI7XHJcbiAgICAgICAgICBwYXNzd29yZCA9IGxpbmsucGFzc3dvcmQ7XHJcbiAgICAgICAgICByZW1lbWJlciA9IHRydWVcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMubG9naW4oZW1haWwsIHBhc3N3b3JkLCByZW1lbWJlciwgb2F1dGgsIG9hdXRoQWNjZXNzVG9rZW4pXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IHIgPT4ge1xyXG4gICAgICAgICAgaWYgKCFyLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLmVycm9yKHIubWVzc2FnZSwgbnVsbCwgXCJFcnJvcmUgaW4gRXZvbHV0aW9uXCIpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLnRvYXN0KCdDb25uZXNzbyBhZCBFdm9sdXRpb24nLCAxNTAwLCAncG93ZXInKTtcclxuICAgICAgICAgICAgaWYgKG9uU3VjY2VzKSB7XHJcbiAgICAgICAgICAgICAgb25TdWNjZXMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6ICgpID0+IHsgdGhpcy5kaWFsb2dTZXJ2aWNlLmVycm9yKFwiRXZvbHV0aW9uIG5vbiBkaXNwb25pYmlsZS5cIikgfVxyXG4gICAgICB9KTtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGVyZm9ybSBhdXRvIGxvZ291dFxyXG4gICAqIEBwYXJhbSBvblN1Y2NlczogZnVuY3Rpb24gdG8gZXhlY3V0ZSBvbiBzZWNjZXNzXHJcbiAgICovXHJcbiAgYXV0b0xvZ291dChcclxuICAgIG9uU3VjY2VzOiBGdW5jdGlvbiB8IG51bGwgfCB1bmRlZmluZWQgPSBudWxsKSB7XHJcbiAgICBpZiAoIXRoaXMubG9nZ2VkSW4oKSkgcmV0dXJuO1xyXG4gICAgdGhpcy5sb2dvdXQoKVxyXG4gICAgICAucGlwZShtYXAociA9PiB7IHRoaXMuY2xlYXIoKTsgcmV0dXJuIHIgfSkpXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IHIgPT4ge1xyXG4gICAgICAgICAgaWYgKCFyLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLmVycm9yKHIubWVzc2FnZSwgbnVsbCwgXCJFcnJvcmUgaW4gRXZvbHV0aW9uXCIpO1xyXG4gICAgICAgICAgICB0aGlzLmJyb2FkY2FzdFNlcnZpY2Uuc2VuZE1lc3NhZ2UoRXZvbHV0aW9uTWVzc2FnZXMuTE9HSU5fQ0hBTkdFRCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UudG9hc3QoJ0Rpc2Nvbm5lc3NvIGRhIEV2b2x1dGlvbicsIDE1MDAsICdwb3dlcl9vZmYnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICBpZiAob25TdWNjZXMpIHtcclxuICAgICAgICAgICAgb25TdWNjZXMoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGVyZm9ybSBsb2dpbiAgIFxyXG4gICAqIEBwYXJhbSBlbWFpbDogdGhlIG9wdGlvbmFsIGVtYWlsIGlmIHVzaW5nIE9BdXRoMlxyXG4gICAqIEBwYXJtYSBwYXNzd29yZDogdGhlIG9wdGlvbmFsIHBhc3N3b3JkIGlmIHVzaW5nIE9BdXRoMlxyXG4gICAqIEBwYXJhbSByZW1lbWJlcjogcmVtZW1iZXIgY3JlZGVudGlhbHMgXHJcbiAgICogQHBhcmFtIG9hdXRoOiB0aGUgb3B0aW9uYWwgb3BlbiBhdXRoZW50aWNhdGlvbiBzdXBwb3J0ZWRcclxuICAgKiBAcGFyYW0gb2F1dGhBY2Nlc3NUb2tlbjogdGhlIG9wdGlvbmFsIE9BdXRoMiBhY2Nlc3MgdG9rZW5cclxuICAgKiBAcmV0dXJuczogdGhlIGxvZ2luIHJlc3VsdFxyXG4gICAqL1xyXG4gIGxvZ2luKGVtYWlsOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbCxcclxuICAgIHBhc3N3b3JkOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbCxcclxuICAgIHJlbWVtYmVyOiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCA9IGZhbHNlLFxyXG4gICAgb2F1dGg6IExvZ2luT0F1dGhUeXBlIHwgbnVsbCB8IHVuZGVmaW5lZCA9IG51bGwsXHJcbiAgICBvYXV0aEFjY2Vzc1Rva2VuOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbCkge1xyXG4gICAgdGhpcy5sb2dnaW5nSW4uc2V0KHRydWUpO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudFxyXG4gICAgICAucG9zdDxBcGlSZXN1bHQ8RXZvbHV0aW9uTG9naW5SZXN1bHQ+PihcclxuICAgICAgICB0aGlzLl9zZXJ2aWNlVXJpICsgJy9sb2dpbjInLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHVzZXI6IG9hdXRoID8gbnVsbCA6IGVtYWlsLFxyXG4gICAgICAgICAgcGFzc3dvcmQ6IG9hdXRoID8gbnVsbCA6IHBhc3N3b3JkLFxyXG4gICAgICAgICAgY2xpZW50SWQ6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiZXZvbHV0aW9uX2NsaWVudF9pZFwiKSxcclxuICAgICAgICAgIE9BVVRIOiBvYXV0aFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaGVhZGVyczpcclxuICAgICAgICAgICAgIW9hdXRoXHJcbiAgICAgICAgICAgICAgPyBuZXcgSHR0cEhlYWRlcnMoKVxyXG4gICAgICAgICAgICAgIDogbmV3IEh0dHBIZWFkZXJzKClcclxuICAgICAgICAgICAgICAgIC5zZXQoXCJBdXRob3JpemF0aW9uXCIsIG9hdXRoQWNjZXNzVG9rZW4gPz8gJycpXHJcbiAgICAgICAgfSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgZmluYWxpemUoKCkgPT4gdGhpcy5kaWFsb2dTZXJ2aWNlLmNsZWFyQnVzeSgpKSxcclxuICAgICAgICBjYXRjaEVycm9yKGVyciA9PiB7IHRoaXMuaGFuZGxlTG9naW5FcnJvcigpOyByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnIpIH0pLFxyXG4gICAgICAgIG1hcCgocjogQXBpUmVzdWx0PEV2b2x1dGlvbkxvZ2luUmVzdWx0PikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sb2dnaW5nSW4uc2V0KGZhbHNlKTtcclxuICAgICAgICAgIGlmIChyLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgLy8gU3RvcmUgYWNjZXNzIHRva2VuXHJcbiAgICAgICAgICAgIHRoaXMuc2V0VG9rZW4oci52YWx1ZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGxvZ2luSW5mbzogRXZvbHV0aW9uTG9naW5JbmZvID0ge1xyXG4gICAgICAgICAgICAgIGNvbnRleHQ6IHIudmFsdWUuY29udGV4dCxcclxuICAgICAgICAgICAgICBPQVVUSDogb2F1dGhcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIW9hdXRoKSB7XHJcbiAgICAgICAgICAgICAgbG9naW5JbmZvLnVzZXJDcmVkZW50aWFscyA9XHJcbiAgICAgICAgICAgICAgICBTeXN0ZW1VdGlscy5jaXBoZXIoXHJcbiAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHtcclxuICAgICAgICAgICAgICAgICAgICBlbWFpbDogZW1haWwsXHJcbiAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQ6IHBhc3N3b3JkLFxyXG4gICAgICAgICAgICAgICAgICAgIHJlbWVtYmVyOiByZW1lbWJlcixcclxuICAgICAgICAgICAgICAgICAgfSksIGxvZ2luSW5mby5jb250ZXh0LnVzZXJJZC50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9sb2dpbkluZm8gPSBsb2dpbkluZm8uY29udGV4dDtcclxuICAgICAgICAgICAgdGhpcy5zdG9yZUxvZ2luKCk7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VkSW4uc2V0KHRydWUpO1xyXG4gICAgICAgICAgICAvLyBOb3RpZnlcclxuICAgICAgICAgICAgdGhpcy5icm9hZGNhc3RTZXJ2aWNlLnNlbmRNZXNzYWdlKEV2b2x1dGlvbk1lc3NhZ2VzLkxPR0lOX0NPTVBMRVRFRCk7XHJcbiAgICAgICAgICAgIC8vIEtlZXAgYWxpdmVcclxuICAgICAgICAgICAgdGhpcy5zZXRLZWVwQWxpdmUoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiByO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQZXJmb3JtIGxvZ291dFxyXG4gICAqL1xyXG4gIGxvZ291dCgpIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucG9zdDxhbnk+KHRoaXMuX3NlcnZpY2VVcmkgKyAnL2xvZ291dCcsIHt9KS5waXBlKFxyXG4gICAgICBmaW5hbGl6ZSgoKSA9PiB7IHRoaXMucmVtb3ZlS2VlcEFsaXZlKCk7IHRoaXMuZGlhbG9nU2VydmljZS5jbGVhckJ1c3koKTsgfSksXHJcbiAgICAgIG1hcChyID0+IHtcclxuICAgICAgICB0aGlzLmNsZWFyKCk7XHJcbiAgICAgICAgcmV0dXJuIHJcclxuICAgICAgfSksXHJcbiAgICAgIGNhdGNoRXJyb3IoKF9lKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jbGVhcigpO1xyXG4gICAgICAgIHJldHVybiBvZihbXSk7XHJcbiAgICAgIH0pKTtcclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAqIFN3aXRjaCB0aGUgY3VycmVudCBsb2dpbiB0byBhIG5ldyBvbmUgd2l0aCB0aGUgc2FtZSBjcmVkZW50aWFscyBleGNlcHQgcm9sZSBwb3NzaWJseSAoY29udGV4dCBjaGFuZ2UpXHJcbiAgKiBAcGFyYW0gaWQgOiBuZXcgdXNlciBpZFxyXG4gICovXHJcbiAgbG9naW5Td2l0Y2goaWQ6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudFxyXG4gICAgICAucG9zdDxBcGlSZXN1bHQ8RXZvbHV0aW9uTG9naW5SZXN1bHQ+PihcclxuICAgICAgICB0aGlzLl9zZXJ2aWNlVXJpICsgJy9sb2dpbi1zd2l0Y2gvJyxcclxuICAgICAgICB7XHJcbiAgICAgICAgICB1c2VySWQ6IGlkLFxyXG4gICAgICAgICAgY2xpZW50SWQ6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiZXZvbHV0aW9uX2NsaWVudF9pZFwiKVxyXG4gICAgICAgIH1cclxuICAgICAgKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBjYXRjaEVycm9yKChlcnIpID0+IHtcclxuICAgICAgICAgIHRoaXMuaGFuZGxlTG9naW5FcnJvcigpO1xyXG4gICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBtYXAoKHI6IEFwaVJlc3VsdDxFdm9sdXRpb25Mb2dpblJlc3VsdD4pID0+IHtcclxuICAgICAgICAgIHRoaXMubG9nZ2luZ0luLnNldChmYWxzZSk7XHJcbiAgICAgICAgICBpZiAoci5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIC8vIFN0b3JlIGFjY2VzcyB0b2tlblxyXG4gICAgICAgICAgICB0aGlzLnNldFRva2VuKHIudmFsdWUpO1xyXG4gICAgICAgICAgICB0aGlzLl9sb2dpbkluZm8gPSByLnZhbHVlLmNvbnRleHQ7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VkSW4uc2V0KHRydWUpO1xyXG4gICAgICAgICAgICAvLyBOb3RpZnlcclxuICAgICAgICAgICAgdGhpcy5icm9hZGNhc3RTZXJ2aWNlLnNlbmRNZXNzYWdlKEV2b2x1dGlvbk1lc3NhZ2VzLkxPR0lOX0NPTVBMRVRFRCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gcjtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAqIEhhbmRsZSBsb2dpbiBlcnJvclxyXG4gKi9cclxuICBwcml2YXRlIGhhbmRsZUxvZ2luRXJyb3IoKSB7XHJcbiAgICB0aGlzLmxvZ2dpbmdJbi5zZXQoZmFsc2UpO1xyXG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ2V2b2x1dGlvbl9sb2dpbicpO1xyXG5cclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAgKiBSZXNldCBsb2dpbiByZWZyZXNoIHRpbWVyIGFuZCBsb2dpbiBzdGF0ZVxyXG4gICAqL1xyXG4gIHJlc2V0KCkge1xyXG4gICAgLy8gQ2xlYXIgbG9naW4gaW5mb1xyXG4gICAgdGhpcy5fbG9naW5JbmZvID0gbnVsbDtcclxuICAgIC8vIExvZ2dlZCBvdXRcclxuICAgIHRoaXMubG9nZ2VkSW4uc2V0KGZhbHNlKTtcclxuICAgIC8vIE5vdGlmeVxyXG4gICAgdGhpcy5icm9hZGNhc3RTZXJ2aWNlLnNlbmRNZXNzYWdlKEV2b2x1dGlvbk1lc3NhZ2VzLkxPR09VVF9DT01QTEVURUQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYXIgbG9naW4gZGF0YVxyXG4gICAqL1xyXG4gIGNsZWFyKCkge1xyXG4gICAgLy8gQ2xlYXIgbG9jYWwgc3RvcmFnZVxyXG4gICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSgnZXZvbHV0aW9uX2p3dCcpO1xyXG4gICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSgnZXZvbHV0aW9uX2p3dF9yZWZyZXNoJyk7XHJcbiAgICBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKCdldm9sdXRpb25fb2F1dGgnKTtcclxuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdldm9sdXRpb25fbG9naW4nKTtcclxuICAgIC8vIFJlc2V0IGxvZ2luXHJcbiAgICB0aGlzLnJlc2V0KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIFBlcmZvcm0gdG9rZW4gcmVmcmVzaFxyXG4gICovXHJcbiAgcmVmcmVzaCgpIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0PEFwaVJlc3VsdDxFdm9sdXRpb25Mb2dpblJlc3VsdD4+KFxyXG4gICAgICB0aGlzLl9zZXJ2aWNlVXJpICsgJy9yZWZyZXNoMi8/dG9rZW49JyArIHRoaXMuZ2V0VG9rZW4odHJ1ZSlcclxuICAgICkucGlwZShtYXAoKHI6IEFwaVJlc3VsdDxFdm9sdXRpb25Mb2dpblJlc3VsdD4pID0+IHtcclxuICAgICAgLy8gVXBkYXRlIHRva2VuXHJcbiAgICAgIHRoaXMuc2V0VG9rZW4oci52YWx1ZSk7XHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogQ29udmVydCBmb2xkZXJzIGluIGEgdHJlZSBvZiBOb2RlIG9iamVjdC5cclxuICAgKiBAcGFyYW0gZm9sZGVycyA6IHRoZSBzdWJmb2xkZXJzIGdyb3VwIG9yIG51bGwgdG8gcm9vdFxyXG4gICAqL1xyXG4gIHRvTm9kZXMoZm9sZGVyczogSU5vZGVbXSk6IElOb2RlW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3RvTm9kZXMoZm9sZGVycywgbnVsbCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb252ZXJ0IGZvbGRlcnMgaW4gYSB0cmVlIG9mIE5vZGUgb2JqZWN0LlxyXG4gICAqIEBwYXJhbSBmb2xkZXJzIDogdGhlIGNoaWxkcmVuIGdyb3VwIG9yIG51bGwgdG8gcm9vdFxyXG4gICAqL1xyXG4gIHByaXZhdGUgX3RvTm9kZXMoZm9sZGVyczogSU5vZGVbXSwgcGFyZW50OiBJTm9kZSB8IG51bGwpOiBJTm9kZVtdIHtcclxuICAgIGxldCBub2RlczogSU5vZGVbXSA9IFtdO1xyXG4gICAgZm9sZGVycy5mb3JFYWNoKChuKSA9PiB7XHJcbiAgICAgIGxldCBub2RlOiBJTm9kZSA9IHtcclxuICAgICAgICBpZDogbi5pZCxcclxuICAgICAgICBuYW1lOiBuLm5hbWUsXHJcbiAgICAgICAgY291bnQ6IG4uY291bnQsXHJcbiAgICAgICAgcGFyZW50OiBwYXJlbnQsXHJcbiAgICAgICAgY2hpbGRyZW46IG51bGwsXHJcbiAgICAgICAgYmFnOiBuLFxyXG4gICAgICB9O1xyXG4gICAgICBub2RlLmNoaWxkcmVuID1cclxuICAgICAgICBuLmNoaWxkcmVuICYmIG4uY2hpbGRyZW4ubGVuZ3RoID4gMFxyXG4gICAgICAgICAgPyB0aGlzLl90b05vZGVzKG4uY2hpbGRyZW4sIG5vZGUpXHJcbiAgICAgICAgICA6IFtdO1xyXG4gICAgICBub2Rlcy5wdXNoKG5vZGUpO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gbm9kZXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXRyaWV2ZSB0aGUgdGF4b25vbXlcclxuICAgKi9cclxuICBnZXRUYXhvbm9teSgpIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0PEFwaVJlc3VsdDxGb2xkZXJUcmVlPj4oXHJcbiAgICAgIHRoaXMuX3NlcnZpY2VVcmkgKyAnL3RheG9ub215J1xyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gKiBSZXRyaWV2ZSBncm91cHNcclxuICogQHBhcmFtIGdyb3VwOiB0aGUgZ3JvdXAgbnVtYmVyXHJcbiAqIEBwYXJhbSByZWdpc3RlcjogdGhlIG9wdGlvbmFsIHJlZ2lzdGVyIGlkLiBEZWZhdWx0IGlzIG51bGwuXHJcbiAqL1xyXG4gIGdldEdyb3Vwcyhncm91cDogbnVtYmVyID0gMSwgcmVnaXN0ZXI6IG51bWJlciB8IG51bGwgPSBudWxsKSB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldDxBcGlSZXN1bHQ8c3RyaW5nW10+PihcclxuICAgICAgdGhpcy5fc2VydmljZVVyaSArXHJcbiAgICAgIChyZWdpc3RlclxyXG4gICAgICAgID8gJy9jb21wbGlhbmNlL2dyb3Vwcy8/Z3JvdXA9JyArXHJcbiAgICAgICAgZ3JvdXAgK1xyXG4gICAgICAgICcmcmVnaXN0ZXI9JyArXHJcbiAgICAgICAgcmVnaXN0ZXJcclxuICAgICAgICA6ICcvY29tcGxpYW5jZS9ncm91cHMvP2dyb3VwPScgKyBncm91cClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvLy8vXHJcbiAgLy8gQ09OVEVYVFxyXG4gIC8vLy9cclxuICAvKipcclxuICAgKiBDaGFuZ2UgY29udGV4dFxyXG4gICAqL1xyXG4gIGNoYW5nZUNvbnRleHQocGFyYW1zOiBhbnkpIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucG9zdDxBcGlSZXN1bHQ8YW55Pj4oXHJcbiAgICAgIHRoaXMuX3NlcnZpY2VVcmkgKyAnL2NvbXBsaWFuY2UvY29udGV4dCcsXHJcbiAgICAgIHBhcmFtc1xyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8vLy9cclxuICAvLyBSRUdJU1RFUlNcclxuICAvLy8vXHJcblxyXG5cclxuICAvKipcclxuICAgKiBSZXRyaWV2ZSBhIHJlZ2lzdGVyXHJcbiAgICogQHBhcmFtIGlkIHRoZSByZWdpc3RlciBpZFxyXG4gICAqL1xyXG4gIGdldFJlZ2lzdGVyKGlkOiBudW1iZXIpIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0PEFwaVJlc3VsdDxhbnk+PihcclxuICAgICAgdGhpcy5fc2VydmljZVVyaSArXHJcbiAgICAgICcvY29tcGxpYW5jZS9yZWdpc3RlcnMvJyArIGlkXHJcbiAgICApO1xyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIENvbGxlY3QgcmVnaXN0ZXIgcHJvZmlsZXNcclxuICAgKiBAcGFyYW0gcGFyYW1zIHBhcmFtZXRlcnNcclxuICAgKi9cclxuICBjb2xsZWN0UmVnaXN0ZXJQcm9maWxlcyhwYXJhbXM6IGFueSkge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5wb3N0PEFwaVJlc3VsdDxhbnk+PihcclxuICAgICAgdGhpcy5fc2VydmljZVVyaSArXHJcbiAgICAgICcvY29tcGxpYW5jZS9yZWdpc3RlcnMvcHJvZmlsZXMvY29sbGVjdCcsXHJcbiAgICAgIHBhcmFtc1xyXG4gICAgKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8vXHJcbiAgLy8gTEFXU1xyXG4gIC8vLy9cclxuXHJcbiAgLyoqXHJcbiAgICogQWRkIG9uZSBvciBtb3JlIGxhd3NcclxuICAgKiBAcGFyYW0gcGFyYW1zIHBhcmFtZXRlcnNcclxuICAgKi9cclxuICBhZGRMYXdzKHBhcmFtczogRXZvbHV0aW9uQ29tcGxpYW5jZUxhd3NBZGRQYXJhbXMpIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucG9zdDxBcGlSZXN1bHQ8RXZvbHV0aW9uQ29tcGxpYW5jZUxhd1tdPj4oXHJcbiAgICAgIHRoaXMuX3NlcnZpY2VVcmkgKyAnL2NvbXBsaWFuY2UvbGF3cy9hZGQnLFxyXG4gICAgICBwYXJhbXNcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvLy8vXHJcbiAgLy8gQUNUSVZJVElFU1xyXG4gIC8vLy9cclxuXHJcblxyXG5cclxuICAvKipcclxuICAgKiBBZGQgb25lIG9yIG1vcmUgYWN0aXZpdGllc1xyXG4gICAqIEBwYXJhbSBwYXJhbXMgcGFyYW1ldGVyc1xyXG4gICAqL1xyXG4gIGFkZEFjdGl2aXRpZXMocGFyYW1zOiBFdm9sdXRpb25Db21wbGlhbmNlQWN0aXZpdGllc0FkZFBhcmFtcykge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5wb3N0PEFwaVJlc3VsdDxFdm9sdXRpb25Db21wbGlhbmNlQWN0aXZpdHk+PihcclxuICAgICAgdGhpcy5fc2VydmljZVVyaSArICcvY29tcGxpYW5jZS9hY3Rpdml0aWVzL2FkZCcsXHJcbiAgICAgIHBhcmFtc1xyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogRXhwb3J0IGxhd3NcclxuICAqIEBwYXJhbSBwYXJhbXMgcGFyYW1ldGVyc1xyXG4gICovXHJcbiAgZXhwb3J0TGF3cyhwYXJhbXM6IGFueSkge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5wb3N0KFxyXG4gICAgICB0aGlzLl9zZXJ2aWNlVXJpICsgJy9jb21wbGlhbmNlL2xhd3MvZXhwb3J0JyxcclxuICAgICAgcGFyYW1zLFxyXG4gICAgICB7IHJlc3BvbnNlVHlwZTogJ2Jsb2InIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvLy9cclxuICAvLyBMSU5LU1xyXG4gIC8vL1xyXG5cclxuICAvKipcclxuICAqIFNhdmUgYSB1c2VyIGxpbmtcclxuICAqIEBwYXJhbSBpdGVtOiB0aGUgdXNlciBsaW5rXHJcbiAgKi9cclxuICBzYXZlTGluayhpdGVtOiBFdm9sdXRpb25Vc2VyTGluaykge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5wb3N0PEFwaVJlc3VsdDxib29sZWFuPj4oXHJcbiAgICAgIHRoaXMuX3NlcnZpY2VVcmkgKyAnL2FjY291bnQvbGlua3Mvc2F2ZScsXHJcbiAgICAgIGl0ZW1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWxldGUgYSB1c2VyIGxpbmtcclxuICAgKiBAcGFyYW0gaXRlbTogdGhlIHVzZXIgbGlua1xyXG4gICAqL1xyXG4gIGRlbGV0ZUxpbmsoaXRlbTogRXZvbHV0aW9uVXNlckxpbmspIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucG9zdDxBcGlSZXN1bHQ8Ym9vbGVhbj4+KFxyXG4gICAgICB0aGlzLl9zZXJ2aWNlVXJpICsgJy9hY2NvdW50L2xpbmtzL2RlbGV0ZScsXHJcbiAgICAgIGl0ZW1cclxuICAgICk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Public API Surface of ars-utils
|
|
3
|
-
*/
|
|
4
|
-
export * from './common/common.module';
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2Fycy11dGlscy9ldm9sdXRpb24uY29tbW9uL3B1YmxpY19hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLHdCQUF3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogUHVibGljIEFQSSBTdXJmYWNlIG9mIGFycy11dGlsc1xyXG4gKi9cclxuXHJcbmV4cG9ydCAqIGZyb20gJy4vY29tbW9uL2NvbW1vbi5tb2R1bGUnO1xyXG5cclxuIl19
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Generated bundle index. Do not edit.
|
|
3
|
-
*/
|
|
4
|
-
export * from './public_api';
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJzZWRpemlvbmktYXJzLXV0aWxzLWhlbHAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hcnMtdXRpbHMvaGVscC9hcnNlZGl6aW9uaS1hcnMtdXRpbHMtaGVscC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL3B1YmxpY19hcGknO1xuIl19
|