@esfaenza/extensions 15.2.45 → 16.2.0
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/{esm2020 → esm2022}/esfaenza-extensions.mjs +4 -4
- package/esm2022/lib/models/CallResult.mjs +24 -0
- package/esm2022/lib/models/CsvHeaders.mjs +26 -0
- package/{esm2020 → esm2022}/lib/models/ExportConsts.mjs +31 -31
- package/esm2022/lib/models/ExtensionsModuleConfig.mjs +10 -0
- package/esm2022/lib/models/GenericItem.mjs +10 -0
- package/{esm2020 → esm2022}/lib/models/InboundMessageTypes.mjs +6 -6
- package/esm2022/lib/models/InterComMessage.mjs +16 -0
- package/{esm2020 → esm2022}/lib/models/TypeCode.mjs +24 -24
- package/{esm2020 → esm2022}/lib/modules/extensions.module.mjs +32 -32
- package/esm2022/lib/pipes/loc_date.pipe.mjs +38 -0
- package/esm2022/lib/services/extensions.base.mjs +30 -0
- package/esm2022/lib/services/extensions.clipboard.service.mjs +221 -0
- package/esm2022/lib/services/extensions.dates.service.mjs +244 -0
- package/esm2022/lib/services/extensions.embedding.service.mjs +213 -0
- package/esm2022/lib/services/extensions.exports.service.mjs +617 -0
- package/esm2022/lib/services/extensions.hashing.service.mjs +308 -0
- package/esm2022/lib/services/extensions.intercom.service.mjs +52 -0
- package/esm2022/lib/services/extensions.messages.service.mjs +450 -0
- package/esm2022/lib/services/extensions.utilities.service.mjs +250 -0
- package/{esm2020 → esm2022}/lib/tokens.mjs +11 -11
- package/{esm2020 → esm2022}/public-api.mjs +21 -21
- package/{fesm2020 → fesm2022}/esfaenza-extensions.mjs +2509 -2441
- package/fesm2022/esfaenza-extensions.mjs.map +1 -0
- package/index.d.ts +5 -5
- package/lib/models/CallResult.d.ts +23 -23
- package/lib/models/CsvHeaders.d.ts +25 -25
- package/lib/models/ExportConsts.d.ts +31 -31
- package/lib/models/ExtensionsModuleConfig.d.ts +9 -9
- package/lib/models/GenericItem.d.ts +9 -9
- package/lib/models/InboundMessageTypes.d.ts +5 -5
- package/lib/models/InterComMessage.d.ts +12 -12
- package/lib/models/TypeCode.d.ts +23 -23
- package/lib/modules/extensions.module.d.ts +11 -11
- package/lib/pipes/loc_date.pipe.d.ts +24 -24
- package/lib/services/extensions.base.d.ts +22 -22
- package/lib/services/extensions.clipboard.service.d.ts +54 -54
- package/lib/services/extensions.dates.service.d.ts +99 -99
- package/lib/services/extensions.embedding.service.d.ts +28 -28
- package/lib/services/extensions.exports.service.d.ts +234 -234
- package/lib/services/extensions.hashing.service.d.ts +121 -121
- package/lib/services/extensions.intercom.service.d.ts +28 -28
- package/lib/services/extensions.messages.service.d.ts +195 -195
- package/lib/services/extensions.utilities.service.d.ts +107 -107
- package/lib/tokens.d.ts +11 -11
- package/package.json +13 -19
- package/public-api.d.ts +18 -18
- package/esm2020/lib/models/CallResult.mjs +0 -6
- package/esm2020/lib/models/CsvHeaders.mjs +0 -6
- package/esm2020/lib/models/ExtensionsModuleConfig.mjs +0 -4
- package/esm2020/lib/models/GenericItem.mjs +0 -6
- package/esm2020/lib/models/InterComMessage.mjs +0 -14
- package/esm2020/lib/pipes/loc_date.pipe.mjs +0 -37
- package/esm2020/lib/services/extensions.base.mjs +0 -29
- package/esm2020/lib/services/extensions.clipboard.service.mjs +0 -219
- package/esm2020/lib/services/extensions.dates.service.mjs +0 -242
- package/esm2020/lib/services/extensions.embedding.service.mjs +0 -208
- package/esm2020/lib/services/extensions.exports.service.mjs +0 -615
- package/esm2020/lib/services/extensions.hashing.service.mjs +0 -310
- package/esm2020/lib/services/extensions.intercom.service.mjs +0 -54
- package/esm2020/lib/services/extensions.messages.service.mjs +0 -433
- package/esm2020/lib/services/extensions.utilities.service.mjs +0 -252
- package/fesm2015/esfaenza-extensions.mjs +0 -2513
- package/fesm2015/esfaenza-extensions.mjs.map +0 -1
- package/fesm2020/esfaenza-extensions.mjs.map +0 -1
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
// Angular
|
|
2
|
+
import { Injectable, Optional } from "@angular/core";
|
|
3
|
+
// Librerie
|
|
4
|
+
import Swal from "sweetalert2";
|
|
5
|
+
import { first } from "rxjs/operators";
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "./extensions.messages.service";
|
|
8
|
+
import * as i2 from "@esfaenza/localizations";
|
|
9
|
+
/**
|
|
10
|
+
* Service che fornisce un accesso base in lettura/scrittura sulla clipboard
|
|
11
|
+
*/
|
|
12
|
+
export class ClipboardService {
|
|
13
|
+
msgService;
|
|
14
|
+
locProvider;
|
|
15
|
+
/**
|
|
16
|
+
* Oggetto statico di localizzazione per i messaggi di questa Service
|
|
17
|
+
*/
|
|
18
|
+
loc = {
|
|
19
|
+
"Unfortunately Firefox doesn't yet support direct Clipboard access if not via extensions, Please use Chrome to do this operation": {
|
|
20
|
+
'en-US': "Unfortunately Firefox doesn't yet support direct Clipboard access if not via extensions, Please use Chrome to do this operation",
|
|
21
|
+
'it-IT': "Mi dispiace ma Firefox non supporta l'accesso diretto alla Clipboard, se non attraverso le estensioni. Si prega di usare Chrome"
|
|
22
|
+
},
|
|
23
|
+
"Generic error during 'copy' command execution": {
|
|
24
|
+
'en-US': "Generic error during 'copy' command execution",
|
|
25
|
+
'it-IT': "Errore generico durante l'esecuzione del comando 'copy'"
|
|
26
|
+
},
|
|
27
|
+
"Error during Clipboard content read operation": {
|
|
28
|
+
'en-US': "Error during Clipboard content read operation",
|
|
29
|
+
'it-IT': "Errore nella lettura del contenuto della Clipboard"
|
|
30
|
+
},
|
|
31
|
+
"Error during Clipboard content copy operation": {
|
|
32
|
+
'en-US': "Error during Clipboard content copy operation",
|
|
33
|
+
'it-IT': "Errore nella scrittura del contenuto nella Clipboard"
|
|
34
|
+
},
|
|
35
|
+
"Please insert your clipboard content": {
|
|
36
|
+
'en-US': "Please insert your clipboard content",
|
|
37
|
+
'it-IT': "Si prega di incollare il contenuto della Clipboard"
|
|
38
|
+
},
|
|
39
|
+
"User input required": {
|
|
40
|
+
'en-US': "User input required",
|
|
41
|
+
'it-IT': "Richiesto Input utente"
|
|
42
|
+
},
|
|
43
|
+
"Your current browser does not support reading from the clipboard directly. Please paste your clipboard's content in this Input field and confirm the operation": {
|
|
44
|
+
'en-US': "Your current browser does not support reading from the clipboard directly. Please paste your clipboard's content in this Input field and confirm the operation",
|
|
45
|
+
'it-IT': "Il browser corrente non supporta la lettura diretta dei dati della Clipboard, si prega di effettuare un'incolla (CTRL + V) nella casella di testo e confermare l'operazione"
|
|
46
|
+
},
|
|
47
|
+
"Confirm": {
|
|
48
|
+
'en-US': "Confirm",
|
|
49
|
+
'it-IT': "Conferma"
|
|
50
|
+
},
|
|
51
|
+
"Cancel": {
|
|
52
|
+
'en-US': "Cancel",
|
|
53
|
+
'it-IT': "Annulla"
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Costruttore
|
|
58
|
+
*
|
|
59
|
+
* @ignore
|
|
60
|
+
*/
|
|
61
|
+
constructor(msgService, locProvider) {
|
|
62
|
+
this.msgService = msgService;
|
|
63
|
+
this.locProvider = locProvider;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Prende il valore della clipboard.
|
|
67
|
+
* Si può specificare se ci si aspetta una lista o una matrice di valori in modo da ricevere già un risultato utilizzabile
|
|
68
|
+
*
|
|
69
|
+
* @param {'array' | 'matrix'} style Stile dell'output desiderato, se array o matrice
|
|
70
|
+
* @param {Function} valueFoundCallback Callback che questa funzione chiamerà una volta ottenuto i valori richiesti dalla clipboard
|
|
71
|
+
*/
|
|
72
|
+
async getClipboard(style, valueFoundCallback) {
|
|
73
|
+
let LOCALE = this.locProvider ? await this.locProvider.Locale.pipe(first()).toPromise() : 'it-IT';
|
|
74
|
+
if (navigator.userAgent.indexOf("Firefox") != -1) {
|
|
75
|
+
Swal.fire({
|
|
76
|
+
title: this.loc["User input required"][LOCALE],
|
|
77
|
+
text: this.loc["Your current browser does not support reading from the clipboard directly. Please paste your clipboard's content in this Input field and confirm the operation"][LOCALE],
|
|
78
|
+
input: 'textarea',
|
|
79
|
+
icon: "warning",
|
|
80
|
+
confirmButtonText: this.loc["Confirm"][LOCALE],
|
|
81
|
+
cancelButtonText: this.loc["Cancel"][LOCALE],
|
|
82
|
+
showCancelButton: true,
|
|
83
|
+
customClass: {
|
|
84
|
+
confirmButton: "btn btn-primary",
|
|
85
|
+
cancelButton: "btn btn-secondary app-margin-right-15",
|
|
86
|
+
container: "app-wrap",
|
|
87
|
+
},
|
|
88
|
+
reverseButtons: true,
|
|
89
|
+
allowOutsideClick: false,
|
|
90
|
+
inputValidator: (value) => {
|
|
91
|
+
if (!value)
|
|
92
|
+
return this.loc["Please insert your clipboard content"][LOCALE];
|
|
93
|
+
}
|
|
94
|
+
}).then(t => {
|
|
95
|
+
if (t.isConfirmed) {
|
|
96
|
+
console.log("[@esfaenza/extensions] Retrieving input data from user input");
|
|
97
|
+
this.doClipboardDataGet(t.value, style, valueFoundCallback);
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
if (window.clipboardData) {
|
|
103
|
+
console.log("[@esfaenza/extensions] Found clipboardData");
|
|
104
|
+
let data = window.clipboardData.getData("Text");
|
|
105
|
+
this.doClipboardDataGet(data, style, valueFoundCallback);
|
|
106
|
+
}
|
|
107
|
+
else if (window.navigator.clipboard) {
|
|
108
|
+
console.log("[@esfaenza/extensions] Found navigator clipboard");
|
|
109
|
+
window.navigator.permissions.query({ name: 'clipboard-read' }).then(result => {
|
|
110
|
+
if (!(result.state === 'granted' || result.state === 'prompt')) {
|
|
111
|
+
console.error("[@esfaenza/extensions] Clipboard permission not granted");
|
|
112
|
+
if (valueFoundCallback)
|
|
113
|
+
valueFoundCallback([]);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
console.log("[@esfaenza/extensions] Clipboard permission granted, retrieving values");
|
|
117
|
+
window.navigator.clipboard.readText()
|
|
118
|
+
.then((t) => this.doClipboardDataGet(t, style, valueFoundCallback))
|
|
119
|
+
.catch((err) => this.msgService.simpleError(this.loc["Error during Clipboard content read operation"][LOCALE] + ": " + err));
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/** @ignore */
|
|
124
|
+
doClipboardDataGet(clipboardText, style, valueFoundCallback) {
|
|
125
|
+
console.log("[@esfaenza/extensions] Retrieved clipboard values: " + clipboardText);
|
|
126
|
+
let value = style == "array" ? this.getClipboardLines(clipboardText) :
|
|
127
|
+
style == "matrix" ? this.getClipboardMatrix(clipboardText) : [];
|
|
128
|
+
console.log(`[@esfaenza/extensions] Adapted for ${style}: ${JSON.stringify(value)}`);
|
|
129
|
+
if (valueFoundCallback)
|
|
130
|
+
valueFoundCallback(value);
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Ottiene il contenuto della clipboard diviso per righe (separate da newline)
|
|
134
|
+
*
|
|
135
|
+
* @param {string} data contenuto letto dalla clipboard
|
|
136
|
+
*
|
|
137
|
+
* @returns {string[]} Array contenente il testo preso dalla clipboard diviso per riga
|
|
138
|
+
*/
|
|
139
|
+
getClipboardLines(data) {
|
|
140
|
+
let trimmedData = data.trim();
|
|
141
|
+
if (!trimmedData.includes("\r\n") && trimmedData.includes("\n"))
|
|
142
|
+
return trimmedData.split("\n");
|
|
143
|
+
return trimmedData.split("\r\n");
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Ottiene il contenuto della clipboard diviso per righe (separate da newline) e colonne (separate da tab)
|
|
147
|
+
*
|
|
148
|
+
* @param {string} data contenuto letto dalla clipboard
|
|
149
|
+
*
|
|
150
|
+
* @returns {string[][]} Matrice contenente il testo preso dalla clipboard diviso per riga e colonna
|
|
151
|
+
*/
|
|
152
|
+
getClipboardMatrix(data) {
|
|
153
|
+
var ret = [];
|
|
154
|
+
var rows = !data.includes("\r\n") && data.includes("\n") ? data.split("\n") : data.split("\r\n");
|
|
155
|
+
// A quanto pare ogni valore è separato da un \t... spero che sia uno standard di quando si copia da excel altrimenti ciao
|
|
156
|
+
for (let i = 0; i < rows.length; i++)
|
|
157
|
+
ret.push(rows[i].split('\t').map(t => t.trim()));
|
|
158
|
+
return ret;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Metodo che copia un testo all'interno della clipboard
|
|
162
|
+
*
|
|
163
|
+
* @param {string} text Testo da inserire nella clipboard
|
|
164
|
+
*/
|
|
165
|
+
async copyTextToClipboard(text) {
|
|
166
|
+
let LOCALE = this.locProvider ? await this.locProvider.Locale.pipe(first()).toPromise() : 'it-IT';
|
|
167
|
+
var textArea = document.createElement("textarea");
|
|
168
|
+
//
|
|
169
|
+
// *** This styling is an extra step which is likely not required. ***
|
|
170
|
+
//
|
|
171
|
+
// Why is it here? To ensure:
|
|
172
|
+
// 1. the element is able to have focus and selection.
|
|
173
|
+
// 2. if element was to flash render it has minimal visual impact.
|
|
174
|
+
// 3. less flakyness with selection and copying which **might** occur if
|
|
175
|
+
// the textarea element is not visible.
|
|
176
|
+
//
|
|
177
|
+
// The likelihood is the element won't even render, not even a flash,
|
|
178
|
+
// so some of these are just precautions. However in IE the element
|
|
179
|
+
// is visible whilst the popup box asking the user for permission for
|
|
180
|
+
// the web page to copy to the clipboard.
|
|
181
|
+
//
|
|
182
|
+
// Place in top-left corner of screen regardless of scroll position.
|
|
183
|
+
textArea.style.position = "fixed";
|
|
184
|
+
textArea.style.top = "0";
|
|
185
|
+
textArea.style.left = "0";
|
|
186
|
+
// Ensure it has a small width and height. Setting to 1px / 1em
|
|
187
|
+
// doesn't work as this gives a negative w/h on some browsers.
|
|
188
|
+
textArea.style.width = "2em";
|
|
189
|
+
textArea.style.height = "2em";
|
|
190
|
+
// We don't need padding, reducing the size if it does flash render.
|
|
191
|
+
textArea.style.padding = "0";
|
|
192
|
+
// Clean up any borders.
|
|
193
|
+
textArea.style.border = "none";
|
|
194
|
+
textArea.style.outline = "none";
|
|
195
|
+
textArea.style.boxShadow = "none";
|
|
196
|
+
// Avoid flash of white box if rendered for any reason.
|
|
197
|
+
textArea.style.background = "transparent";
|
|
198
|
+
textArea.value = text;
|
|
199
|
+
document.body.appendChild(textArea);
|
|
200
|
+
textArea.focus();
|
|
201
|
+
textArea.select();
|
|
202
|
+
try {
|
|
203
|
+
var successful = document.execCommand("copy");
|
|
204
|
+
if (!successful)
|
|
205
|
+
this.msgService.simpleError(this.loc["Generic error during 'copy' command execution"][LOCALE]);
|
|
206
|
+
}
|
|
207
|
+
catch (err) {
|
|
208
|
+
this.msgService.simpleError(this.loc["Error during Clipboard content copy operation"][LOCALE] + ": " + err);
|
|
209
|
+
}
|
|
210
|
+
document.body.removeChild(textArea);
|
|
211
|
+
}
|
|
212
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ClipboardService, deps: [{ token: i1.MessageService }, { token: i2.BaseLocalization, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
213
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ClipboardService, providedIn: "root" });
|
|
214
|
+
}
|
|
215
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ClipboardService, decorators: [{
|
|
216
|
+
type: Injectable,
|
|
217
|
+
args: [{ providedIn: "root" }]
|
|
218
|
+
}], ctorParameters: function () { return [{ type: i1.MessageService }, { type: i2.BaseLocalization, decorators: [{
|
|
219
|
+
type: Optional
|
|
220
|
+
}] }]; } });
|
|
221
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0ZW5zaW9ucy5jbGlwYm9hcmQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2V4dGVuc2lvbnMvc3JjL2xpYi9zZXJ2aWNlcy9leHRlbnNpb25zLmNsaXBib2FyZC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFVBQVU7QUFDVixPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQVFyRCxXQUFXO0FBQ1gsT0FBTyxJQUFJLE1BQU0sYUFBYSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7OztBQUV2Qzs7R0FFRztBQUVILE1BQU0sT0FBTyxnQkFBZ0I7SUFpREU7SUFBZ0Q7SUEvQzNFOztPQUVHO0lBQ0ssR0FBRyxHQUFHO1FBQ1YsaUlBQWlJLEVBQUU7WUFDL0gsT0FBTyxFQUFFLGlJQUFpSTtZQUMxSSxPQUFPLEVBQUUsaUlBQWlJO1NBQzdJO1FBQ0QsK0NBQStDLEVBQUU7WUFDN0MsT0FBTyxFQUFFLCtDQUErQztZQUN4RCxPQUFPLEVBQUUseURBQXlEO1NBQ3JFO1FBQ0QsK0NBQStDLEVBQUU7WUFDN0MsT0FBTyxFQUFFLCtDQUErQztZQUN4RCxPQUFPLEVBQUUsb0RBQW9EO1NBQ2hFO1FBQ0QsK0NBQStDLEVBQUM7WUFDNUMsT0FBTyxFQUFFLCtDQUErQztZQUN4RCxPQUFPLEVBQUUsc0RBQXNEO1NBQ2xFO1FBQ0Qsc0NBQXNDLEVBQUU7WUFDcEMsT0FBTyxFQUFFLHNDQUFzQztZQUMvQyxPQUFPLEVBQUUsb0RBQW9EO1NBQ2hFO1FBQ0QscUJBQXFCLEVBQUU7WUFDbkIsT0FBTyxFQUFFLHFCQUFxQjtZQUM5QixPQUFPLEVBQUUsd0JBQXdCO1NBQ3BDO1FBQ0QsZ0tBQWdLLEVBQUU7WUFDOUosT0FBTyxFQUFFLGdLQUFnSztZQUN6SyxPQUFPLEVBQUUsNktBQTZLO1NBQ3pMO1FBQ0Qs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QVEsQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLGFBQWEsQ0FBQztRQUUxQyxRQUFRLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztRQUV0QixRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNwQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDakIsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBRWxCLElBQUk7WUFDQSxJQUFJLFVBQVUsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzlDLElBQUcsQ0FBQyxVQUFVO2dCQUNWLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsK0NBQStDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1NBQ3RHO1FBQUMsT0FBTyxHQUFHLEVBQUU7WUFDVixJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLCtDQUErQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxHQUFFLEdBQUcsQ0FBQyxDQUFDO1NBQzlHO1FBRUQsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDeEMsQ0FBQzt3R0ExTlEsZ0JBQWdCOzRHQUFoQixnQkFBZ0IsY0FESixNQUFNOzs0RkFDbEIsZ0JBQWdCO2tCQUQ1QixVQUFVO21CQUFDLEVBQUMsVUFBVSxFQUFFLE1BQU0sRUFBQzs7MEJBa0Q0QixRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQW5ndWxhclxyXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBPcHRpb25hbCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcblxyXG4vLyBFc1xyXG5pbXBvcnQgeyBCYXNlTG9jYWxpemF0aW9uIH0gZnJvbSBcIkBlc2ZhZW56YS9sb2NhbGl6YXRpb25zXCI7XHJcblxyXG4vLyBNb2RlbGxpXHJcbmltcG9ydCB7IE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAnLi9leHRlbnNpb25zLm1lc3NhZ2VzLnNlcnZpY2UnO1xyXG5cclxuLy8gTGlicmVyaWVcclxuaW1wb3J0IFN3YWwgZnJvbSBcInN3ZWV0YWxlcnQyXCI7XHJcbmltcG9ydCB7IGZpcnN0IH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XHJcblxyXG4vKipcclxuICogU2VydmljZSBjaGUgZm9ybmlzY2UgdW4gYWNjZXNzbyBiYXNlIGluIGxldHR1cmEvc2NyaXR0dXJhIHN1bGxhIGNsaXBib2FyZFxyXG4gKi9cclxuQEluamVjdGFibGUoe3Byb3ZpZGVkSW46IFwicm9vdFwifSlcclxuZXhwb3J0IGNsYXNzIENsaXBib2FyZFNlcnZpY2Uge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2dnZXR0byBzdGF0aWNvIGRpIGxvY2FsaXp6YXppb25lIHBlciBpIG1lc3NhZ2dpIGRpIHF1ZXN0YSBTZXJ2aWNlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgbG9jID0ge1xyXG4gICAgICAgIFwiVW5mb3J0dW5hdGVseSBGaXJlZm94IGRvZXNuJ3QgeWV0IHN1cHBvcnQgZGlyZWN0IENsaXBib2FyZCBhY2Nlc3MgaWYgbm90IHZpYSBleHRlbnNpb25zLCBQbGVhc2UgdXNlIENocm9tZSB0byBkbyB0aGlzIG9wZXJhdGlvblwiOiB7XHJcbiAgICAgICAgICAgICdlbi1VUyc6IFwiVW5mb3J0dW5hdGVseSBGaXJlZm94IGRvZXNuJ3QgeWV0IHN1cHBvcnQgZGlyZWN0IENsaXBib2FyZCBhY2Nlc3MgaWYgbm90IHZpYSBleHRlbnNpb25zLCBQbGVhc2UgdXNlIENocm9tZSB0byBkbyB0aGlzIG9wZXJhdGlvblwiLFxyXG4gICAgICAgICAgICAnaXQtSVQnOiBcIk1pIGRpc3BpYWNlIG1hIEZpcmVmb3ggbm9uIHN1cHBvcnRhIGwnYWNjZXNzbyBkaXJldHRvIGFsbGEgQ2xpcGJvYXJkLCBzZSBub24gYXR0cmF2ZXJzbyBsZSBlc3RlbnNpb25pLiBTaSBwcmVnYSBkaSB1c2FyZSBDaHJvbWVcIlxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJHZW5lcmljIGVycm9yIGR1cmluZyAnY29weScgY29tbWFuZCBleGVjdXRpb25cIjoge1xyXG4gICAgICAgICAgICAnZW4tVVMnOiBcIkdlbmVyaWMgZXJyb3IgZHVyaW5nICdjb3B5JyBjb21tYW5kIGV4ZWN1dGlvblwiLFxyXG4gICAgICAgICAgICAnaXQtSVQnOiBcIkVycm9yZSBnZW5lcmljbyBkdXJhbnRlIGwnZXNlY3V6aW9uZSBkZWwgY29tYW5kbyAnY29weSdcIlxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJFcnJvciBkdXJpbmcgQ2xpcGJvYXJkIGNvbnRlbnQgcmVhZCBvcGVyYXRpb25cIjoge1xyXG4gICAgICAgICAgICAnZW4tVVMnOiBcIkVycm9yIGR1cmluZyBDbGlwYm9hcmQgY29udGVudCByZWFkIG9wZXJhdGlvblwiLFxyXG4gICAgICAgICAgICAnaXQtSVQnOiBcIkVycm9yZSBuZWxsYSBsZXR0dXJhIGRlbCBjb250ZW51dG8gZGVsbGEgQ2xpcGJvYXJkXCJcclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiRXJyb3IgZHVyaW5nIENsaXBib2FyZCBjb250ZW50IGNvcHkgb3BlcmF0aW9uXCI6e1xyXG4gICAgICAgICAgICAnZW4tVVMnOiBcIkVycm9yIGR1cmluZyBDbGlwYm9hcmQgY29udGVudCBjb3B5IG9wZXJhdGlvblwiLFxyXG4gICAgICAgICAgICAnaXQtSVQnOiBcIkVycm9yZSBuZWxsYSBzY3JpdHR1cmEgZGVsIGNvbnRlbnV0byBuZWxsYSBDbGlwYm9hcmRcIlxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJQbGVhc2UgaW5zZXJ0IHlvdXIgY2xpcGJvYXJkIGNvbnRlbnRcIjoge1xyXG4gICAgICAgICAgICAnZW4tVVMnOiBcIlBsZWFzZSBpbnNlcnQgeW91ciBjbGlwYm9hcmQgY29udGVudFwiLFxyXG4gICAgICAgICAgICAnaXQtSVQnOiBcIlNpIHByZWdhIGRpIGluY29sbGFyZSBpbCBjb250ZW51dG8gZGVsbGEgQ2xpcGJvYXJkXCJcclxuICAgICAgICB9LFxyXG4gICAgICAgIFwiVXNlciBpbnB1dCByZXF1aXJlZFwiOiB7XHJcbiAgICAgICAgICAgICdlbi1VUyc6IFwiVXNlciBpbnB1dCByZXF1aXJlZFwiLFxyXG4gICAgICAgICAgICAnaXQtSVQnOiBcIlJpY2hpZXN0byBJbnB1dCB1dGVudGVcIlxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJZb3VyIGN1cnJlbnQgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgZnJvbSB0aGUgY2xpcGJvYXJkIGRpcmVjdGx5LiBQbGVhc2UgcGFzdGUgeW91ciBjbGlwYm9hcmQncyBjb250ZW50IGluIHRoaXMgSW5wdXQgZmllbGQgYW5kIGNvbmZpcm0gdGhlIG9wZXJhdGlvblwiOiB7XHJcbiAgICAgICAgICAgICdlbi1VUyc6IFwiWW91ciBjdXJyZW50IGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nIGZyb20gdGhlIGNsaXBib2FyZCBkaXJlY3RseS4gUGxlYXNlIHBhc3RlIHlvdXIgY2xpcGJvYXJkJ3MgY29udGVudCBpbiB0aGlzIElucHV0IGZpZWxkIGFuZCBjb25maXJtIHRoZSBvcGVyYXRpb25cIixcclxuICAgICAgICAgICAgJ2l0LUlUJzogXCJJbCBicm93c2VyIGNvcnJlbnRlIG5vbiBzdXBwb3J0YSBsYSBsZXR0dXJhIGRpcmV0dGEgZGVpIGRhdGkgZGVsbGEgQ2xpcGJvYXJkLCBzaSBwcmVnYSBkaSBlZmZldHR1YXJlIHVuJ2luY29sbGEgKENUUkwgKyBWKSBuZWxsYSBjYXNlbGxhIGRpIHRlc3RvIGUgY29uZmVybWFyZSBsJ29wZXJhemlvbmVcIlxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJDb25maXJtXCI6IHtcclxuICAgICAgICAgICAgJ2VuLVVTJzogXCJDb25maXJtXCIsXHJcbiAgICAgICAgICAgICdpdC1JVCc6IFwiQ29uZmVybWFcIlxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXCJDYW5jZWxcIjoge1xyXG4gICAgICAgICAgICAnZW4tVVMnOiBcIkNhbmNlbFwiLFxyXG4gICAgICAgICAgICAnaXQtSVQnOiBcIkFubnVsbGFcIlxyXG4gICAgICAgIH0sXHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29zdHJ1dHRvcmVcclxuICAgICAqIFxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBtc2dTZXJ2aWNlOiBNZXNzYWdlU2VydmljZSwgQE9wdGlvbmFsKCkgcHJpdmF0ZSBsb2NQcm92aWRlcjogQmFzZUxvY2FsaXphdGlvbikgeyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcmVuZGUgaWwgdmFsb3JlIGRlbGxhIGNsaXBib2FyZC4gXHJcbiAgICAgKiBTaSBwdcOyIHNwZWNpZmljYXJlIHNlIGNpIHNpIGFzcGV0dGEgdW5hIGxpc3RhIG8gdW5hIG1hdHJpY2UgZGkgdmFsb3JpIGluIG1vZG8gZGEgcmljZXZlcmUgZ2nDoCB1biByaXN1bHRhdG8gdXRpbGl6emFiaWxlXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7J2FycmF5JyB8ICdtYXRyaXgnfSBzdHlsZSBTdGlsZSBkZWxsJ291dHB1dCBkZXNpZGVyYXRvLCBzZSBhcnJheSBvIG1hdHJpY2VcclxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHZhbHVlRm91bmRDYWxsYmFjayBDYWxsYmFjayBjaGUgcXVlc3RhIGZ1bnppb25lIGNoaWFtZXLDoCB1bmEgdm9sdGEgb3R0ZW51dG8gaSB2YWxvcmkgcmljaGllc3RpIGRhbGxhIGNsaXBib2FyZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0Q2xpcGJvYXJkKHN0eWxlOiAnYXJyYXknIHwgJ21hdHJpeCcsIHZhbHVlRm91bmRDYWxsYmFjayA6ICh2YWx1ZXM6IHN0cmluZ1tdIHwgc3RyaW5nW11bXSkgPT4gdm9pZCkge1xyXG4gICAgICAgIGxldCBMT0NBTEUgPSB0aGlzLmxvY1Byb3ZpZGVyID8gIGF3YWl0IHRoaXMubG9jUHJvdmlkZXIuTG9jYWxlLnBpcGUoZmlyc3QoKSkudG9Qcm9taXNlKCkgOiAnaXQtSVQnO1xyXG5cclxuICAgICAgICBpZiAobmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKFwiRmlyZWZveFwiKSAhPSAtMSkge1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgU3dhbC5maXJlKHtcclxuICAgICAgICAgICAgICAgIHRpdGxlOiB0aGlzLmxvY1tcIlVzZXIgaW5wdXQgcmVxdWlyZWRcIl1bTE9DQUxFXSxcclxuICAgICAgICAgICAgICAgIHRleHQ6IHRoaXMubG9jW1wiWW91ciBjdXJyZW50IGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nIGZyb20gdGhlIGNsaXBib2FyZCBkaXJlY3RseS4gUGxlYXNlIHBhc3RlIHlvdXIgY2xpcGJvYXJkJ3MgY29udGVudCBpbiB0aGlzIElucHV0IGZpZWxkIGFuZCBjb25maXJtIHRoZSBvcGVyYXRpb25cIl1bTE9DQUxFXSxcclxuICAgICAgICAgICAgICAgIGlucHV0OiAndGV4dGFyZWEnLFxyXG4gICAgICAgICAgICAgICAgaWNvbjogXCJ3YXJuaW5nXCIsXHJcbiAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogdGhpcy5sb2NbXCJDb25maXJtXCJdW0xPQ0FMRV0sXHJcbiAgICAgICAgICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiB0aGlzLmxvY1tcIkNhbmNlbFwiXVtMT0NBTEVdLFxyXG4gICAgICAgICAgICAgICAgc2hvd0NhbmNlbEJ1dHRvbjogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIGN1c3RvbUNsYXNzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvbjogXCJidG4gYnRuLXByaW1hcnlcIixcclxuICAgICAgICAgICAgICAgICAgICBjYW5jZWxCdXR0b246IFwiYnRuIGJ0bi1zZWNvbmRhcnkgYXBwLW1hcmdpbi1yaWdodC0xNVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcjogXCJhcHAtd3JhcFwiLFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHJldmVyc2VCdXR0b25zOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgYWxsb3dPdXRzaWRlQ2xpY2s6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgaW5wdXRWYWxpZGF0b3I6ICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY1tcIlBsZWFzZSBpbnNlcnQgeW91ciBjbGlwYm9hcmQgY29udGVudFwiXVtMT0NBTEVdXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSkudGhlbih0ID0+IHtcclxuICAgICAgICAgICAgICAgICAgaWYgKHQuaXNDb25maXJtZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiW0Blc2ZhZW56YS9leHRlbnNpb25zXSBSZXRyaWV2aW5nIGlucHV0IGRhdGEgZnJvbSB1c2VyIGlucHV0XCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5kb0NsaXBib2FyZERhdGFHZXQodC52YWx1ZSwgc3R5bGUsIHZhbHVlRm91bmRDYWxsYmFjayk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoKDxhbnk+d2luZG93KS5jbGlwYm9hcmREYXRhKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiW0Blc2ZhZW56YS9leHRlbnNpb25zXSBGb3VuZCBjbGlwYm9hcmREYXRhXCIpO1xyXG4gICAgICAgICAgICBsZXQgZGF0YSA9ICg8YW55PndpbmRvdykuY2xpcGJvYXJkRGF0YS5nZXREYXRhKFwiVGV4dFwiKTtcclxuICAgICAgICAgICAgdGhpcy5kb0NsaXBib2FyZERhdGFHZXQoZGF0YSwgc3R5bGUsIHZhbHVlRm91bmRDYWxsYmFjayk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBlbHNlIGlmICgoPGFueT53aW5kb3cpLm5hdmlnYXRvci5jbGlwYm9hcmQpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJbQGVzZmFlbnphL2V4dGVuc2lvbnNdIEZvdW5kIG5hdmlnYXRvciBjbGlwYm9hcmRcIik7XHJcbiAgICAgICAgICAgICg8YW55PndpbmRvdykubmF2aWdhdG9yLnBlcm1pc3Npb25zLnF1ZXJ5KHsgbmFtZTogJ2NsaXBib2FyZC1yZWFkJyB9KS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIShyZXN1bHQuc3RhdGUgPT09ICdncmFudGVkJyB8fCByZXN1bHQuc3RhdGUgPT09ICdwcm9tcHQnKSlcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiW0Blc2ZhZW56YS9leHRlbnNpb25zXSBDbGlwYm9hcmQgcGVybWlzc2lvbiBub3QgZ3JhbnRlZFwiKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVGb3VuZENhbGxiYWNrKSB2YWx1ZUZvdW5kQ2FsbGJhY2soW10pO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIltAZXNmYWVuemEvZXh0ZW5zaW9uc10gQ2xpcGJvYXJkIHBlcm1pc3Npb24gZ3JhbnRlZCwgcmV0cmlldmluZyB2YWx1ZXNcIik7XHJcbiAgICAgICAgICAgICAgICAoPGFueT53aW5kb3cpLm5hdmlnYXRvci5jbGlwYm9hcmQucmVhZFRleHQoKVxyXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKCh0OiBzdHJpbmcpID0+IHRoaXMuZG9DbGlwYm9hcmREYXRhR2V0KHQsIHN0eWxlLCB2YWx1ZUZvdW5kQ2FsbGJhY2spKVxyXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyOiBhbnkpID0+IHRoaXMubXNnU2VydmljZS5zaW1wbGVFcnJvcih0aGlzLmxvY1tcIkVycm9yIGR1cmluZyBDbGlwYm9hcmQgY29udGVudCByZWFkIG9wZXJhdGlvblwiXVtMT0NBTEVdICsgXCI6IFwiICsgZXJyKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgcHJpdmF0ZSBkb0NsaXBib2FyZERhdGFHZXQoY2xpcGJvYXJkVGV4dDogc3RyaW5nLCBzdHlsZTogXCJtYXRyaXhcIiB8IFwiYXJyYXlcIiwgdmFsdWVGb3VuZENhbGxiYWNrOiBGdW5jdGlvbikge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiW0Blc2ZhZW56YS9leHRlbnNpb25zXSBSZXRyaWV2ZWQgY2xpcGJvYXJkIHZhbHVlczogXCIgKyBjbGlwYm9hcmRUZXh0KTtcclxuICAgICAgICBsZXQgdmFsdWUgPSBzdHlsZSA9PSBcImFycmF5XCIgPyB0aGlzLmdldENsaXBib2FyZExpbmVzKGNsaXBib2FyZFRleHQpIDpcclxuICAgICAgICAgICAgc3R5bGUgPT0gXCJtYXRyaXhcIiA/IHRoaXMuZ2V0Q2xpcGJvYXJkTWF0cml4KGNsaXBib2FyZFRleHQpIDogW107XHJcbiAgICAgICAgY29uc29sZS5sb2coYFtAZXNmYWVuemEvZXh0ZW5zaW9uc10gQWRhcHRlZCBmb3IgJHtzdHlsZX06ICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfWApO1xyXG4gICAgICAgIGlmICh2YWx1ZUZvdW5kQ2FsbGJhY2spIHZhbHVlRm91bmRDYWxsYmFjayh2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPdHRpZW5lIGlsIGNvbnRlbnV0byBkZWxsYSBjbGlwYm9hcmQgZGl2aXNvIHBlciByaWdoZSAoc2VwYXJhdGUgZGEgbmV3bGluZSlcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGEgY29udGVudXRvIGxldHRvIGRhbGxhIGNsaXBib2FyZFxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nW119IEFycmF5IGNvbnRlbmVudGUgaWwgdGVzdG8gcHJlc28gZGFsbGEgY2xpcGJvYXJkIGRpdmlzbyBwZXIgcmlnYVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldENsaXBib2FyZExpbmVzKGRhdGE6IHN0cmluZyk6IHN0cmluZ1tdIHtcclxuICAgICAgICBsZXQgdHJpbW1lZERhdGEgPSBkYXRhLnRyaW0oKTtcclxuXHJcbiAgICAgICAgaWYgKCF0cmltbWVkRGF0YS5pbmNsdWRlcyhcIlxcclxcblwiKSAmJiB0cmltbWVkRGF0YS5pbmNsdWRlcyhcIlxcblwiKSlcclxuICAgICAgICAgICAgcmV0dXJuIHRyaW1tZWREYXRhLnNwbGl0KFwiXFxuXCIpO1xyXG5cclxuICAgICAgICByZXR1cm4gdHJpbW1lZERhdGEuc3BsaXQoXCJcXHJcXG5cIik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPdHRpZW5lIGlsIGNvbnRlbnV0byBkZWxsYSBjbGlwYm9hcmQgZGl2aXNvIHBlciByaWdoZSAoc2VwYXJhdGUgZGEgbmV3bGluZSkgZSBjb2xvbm5lIChzZXBhcmF0ZSBkYSB0YWIpXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhIGNvbnRlbnV0byBsZXR0byBkYWxsYSBjbGlwYm9hcmRcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge3N0cmluZ1tdW119IE1hdHJpY2UgY29udGVuZW50ZSBpbCB0ZXN0byBwcmVzbyBkYWxsYSBjbGlwYm9hcmQgZGl2aXNvIHBlciByaWdhIGUgY29sb25uYVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldENsaXBib2FyZE1hdHJpeChkYXRhOiBzdHJpbmcpOiBzdHJpbmdbXVtdIHtcclxuICAgICAgICB2YXIgcmV0OiBzdHJpbmdbXVtdID0gW107XHJcbiAgICAgICAgdmFyIHJvd3MgPSAhZGF0YS5pbmNsdWRlcyhcIlxcclxcblwiKSAmJiBkYXRhLmluY2x1ZGVzKFwiXFxuXCIpID8gZGF0YS5zcGxpdChcIlxcblwiKSA6IGRhdGEuc3BsaXQoXCJcXHJcXG5cIik7XHJcblxyXG4gICAgICAgIC8vIEEgcXVhbnRvIHBhcmUgb2duaSB2YWxvcmUgw6ggc2VwYXJhdG8gZGEgdW4gXFx0Li4uIHNwZXJvIGNoZSBzaWEgdW5vIHN0YW5kYXJkIGRpIHF1YW5kbyBzaSBjb3BpYSBkYSBleGNlbCBhbHRyaW1lbnRpIGNpYW9cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgIHJldC5wdXNoKHJvd3NbaV0uc3BsaXQoJ1xcdCcpLm1hcCh0ID0+IHQudHJpbSgpKSk7XHJcbiAgICAgICAgcmV0dXJuIHJldDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ldG9kbyBjaGUgY29waWEgdW4gdGVzdG8gYWxsJ2ludGVybm8gZGVsbGEgY2xpcGJvYXJkXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IFRlc3RvIGRhIGluc2VyaXJlIG5lbGxhIGNsaXBib2FyZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgY29weVRleHRUb0NsaXBib2FyZCh0ZXh0OiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgTE9DQUxFID0gdGhpcy5sb2NQcm92aWRlciA/ICBhd2FpdCB0aGlzLmxvY1Byb3ZpZGVyLkxvY2FsZS5waXBlKGZpcnN0KCkpLnRvUHJvbWlzZSgpIDogJ2l0LUlUJztcclxuXHJcbiAgICAgICAgdmFyIHRleHRBcmVhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRleHRhcmVhXCIpO1xyXG5cclxuICAgICAgICAvL1xyXG4gICAgICAgIC8vICoqKiBUaGlzIHN0eWxpbmcgaXMgYW4gZXh0cmEgc3RlcCB3aGljaCBpcyBsaWtlbHkgbm90IHJlcXVpcmVkLiAqKipcclxuICAgICAgICAvL1xyXG4gICAgICAgIC8vIFdoeSBpcyBpdCBoZXJlPyBUbyBlbnN1cmU6XHJcbiAgICAgICAgLy8gMS4gdGhlIGVsZW1lbnQgaXMgYWJsZSB0byBoYXZlIGZvY3VzIGFuZCBzZWxlY3Rpb24uXHJcbiAgICAgICAgLy8gMi4gaWYgZWxlbWVudCB3YXMgdG8gZmxhc2ggcmVuZGVyIGl0IGhhcyBtaW5pbWFsIHZpc3VhbCBpbXBhY3QuXHJcbiAgICAgICAgLy8gMy4gbGVzcyBmbGFreW5lc3Mgd2l0aCBzZWxlY3Rpb24gYW5kIGNvcHlpbmcgd2hpY2ggKiptaWdodCoqIG9jY3VyIGlmXHJcbiAgICAgICAgLy8gICAgdGhlIHRleHRhcmVhIGVsZW1lbnQgaXMgbm90IHZpc2libGUuXHJcbiAgICAgICAgLy9cclxuICAgICAgICAvLyBUaGUgbGlrZWxpaG9vZCBpcyB0aGUgZWxlbWVudCB3b24ndCBldmVuIHJlbmRlciwgbm90IGV2ZW4gYSBmbGFzaCxcclxuICAgICAgICAvLyBzbyBzb21lIG9mIHRoZXNlIGFyZSBqdXN0IHByZWNhdXRpb25zLiBIb3dldmVyIGluIElFIHRoZSBlbGVtZW50XHJcbiAgICAgICAgLy8gaXMgdmlzaWJsZSB3aGlsc3QgdGhlIHBvcHVwIGJveCBhc2tpbmcgdGhlIHVzZXIgZm9yIHBlcm1pc3Npb24gZm9yXHJcbiAgICAgICAgLy8gdGhlIHdlYiBwYWdlIHRvIGNvcHkgdG8gdGhlIGNsaXBib2FyZC5cclxuICAgICAgICAvL1xyXG5cclxuICAgICAgICAvLyBQbGFjZSBpbiB0b3AtbGVmdCBjb3JuZXIgb2Ygc2NyZWVuIHJlZ2FyZGxlc3Mgb2Ygc2Nyb2xsIHBvc2l0aW9uLlxyXG4gICAgICAgIHRleHRBcmVhLnN0eWxlLnBvc2l0aW9uID0gXCJmaXhlZFwiO1xyXG4gICAgICAgIHRleHRBcmVhLnN0eWxlLnRvcCA9IFwiMFwiO1xyXG4gICAgICAgIHRleHRBcmVhLnN0eWxlLmxlZnQgPSBcIjBcIjtcclxuXHJcbiAgICAgICAgLy8gRW5zdXJlIGl0IGhhcyBhIHNtYWxsIHdpZHRoIGFuZCBoZWlnaHQuIFNldHRpbmcgdG8gMXB4IC8gMWVtXHJcbiAgICAgICAgLy8gZG9lc24ndCB3b3JrIGFzIHRoaXMgZ2l2ZXMgYSBuZWdhdGl2ZSB3L2ggb24gc29tZSBicm93c2Vycy5cclxuICAgICAgICB0ZXh0QXJlYS5zdHlsZS53aWR0aCA9IFwiMmVtXCI7XHJcbiAgICAgICAgdGV4dEFyZWEuc3R5bGUuaGVpZ2h0ID0gXCIyZW1cIjtcclxuXHJcbiAgICAgICAgLy8gV2UgZG9uJ3QgbmVlZCBwYWRkaW5nLCByZWR1Y2luZyB0aGUgc2l6ZSBpZiBpdCBkb2VzIGZsYXNoIHJlbmRlci5cclxuICAgICAgICB0ZXh0QXJlYS5zdHlsZS5wYWRkaW5nID0gXCIwXCI7XHJcblxyXG4gICAgICAgIC8vIENsZWFuIHVwIGFueSBib3JkZXJzLlxyXG4gICAgICAgIHRleHRBcmVhLnN0eWxlLmJvcmRlciA9IFwibm9uZVwiO1xyXG4gICAgICAgIHRleHRBcmVhLnN0eWxlLm91dGxpbmUgPSBcIm5vbmVcIjtcclxuICAgICAgICB0ZXh0QXJlYS5zdHlsZS5ib3hTaGFkb3cgPSBcIm5vbmVcIjtcclxuXHJcbiAgICAgICAgLy8gQXZvaWQgZmxhc2ggb2Ygd2hpdGUgYm94IGlmIHJlbmRlcmVkIGZvciBhbnkgcmVhc29uLlxyXG4gICAgICAgIHRleHRBcmVhLnN0eWxlLmJhY2tncm91bmQgPSBcInRyYW5zcGFyZW50XCI7XHJcblxyXG4gICAgICAgIHRleHRBcmVhLnZhbHVlID0gdGV4dDtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0ZXh0QXJlYSk7XHJcbiAgICAgICAgdGV4dEFyZWEuZm9jdXMoKTtcclxuICAgICAgICB0ZXh0QXJlYS5zZWxlY3QoKTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIHN1Y2Nlc3NmdWwgPSBkb2N1bWVudC5leGVjQ29tbWFuZChcImNvcHlcIik7XHJcbiAgICAgICAgICAgIGlmKCFzdWNjZXNzZnVsKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5tc2dTZXJ2aWNlLnNpbXBsZUVycm9yKHRoaXMubG9jW1wiR2VuZXJpYyBlcnJvciBkdXJpbmcgJ2NvcHknIGNvbW1hbmQgZXhlY3V0aW9uXCJdW0xPQ0FMRV0pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICB0aGlzLm1zZ1NlcnZpY2Uuc2ltcGxlRXJyb3IodGhpcy5sb2NbXCJFcnJvciBkdXJpbmcgQ2xpcGJvYXJkIGNvbnRlbnQgY29weSBvcGVyYXRpb25cIl1bTE9DQUxFXSArIFwiOiBcIisgZXJyKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGV4dEFyZWEpO1xyXG4gICAgfVxyXG59Il19
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
// Angular
|
|
2
|
+
import { Injectable, Inject, Optional } from "@angular/core";
|
|
3
|
+
// Modelli
|
|
4
|
+
import { EXT_ALLOW_UTC } from "../tokens";
|
|
5
|
+
// Librerie
|
|
6
|
+
import { first } from "rxjs/operators";
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "@esfaenza/localizations";
|
|
9
|
+
/**
|
|
10
|
+
* Service che fornisce dei metodi di estensione per la gestione/manipolazione delle date
|
|
11
|
+
*/
|
|
12
|
+
export class DateService {
|
|
13
|
+
locProvider;
|
|
14
|
+
allowUtc;
|
|
15
|
+
/**
|
|
16
|
+
* Oggetto statico di localizzazione per i messaggi di questa Service
|
|
17
|
+
*/
|
|
18
|
+
loc = {
|
|
19
|
+
"SMALL_DATE_FORMAT": { 'en-US': "MM/DD/YYYY", 'it-IT': "DD/MM/YYYY" },
|
|
20
|
+
"FULL_DATE_FORMAT": { 'en-US': "MM/DD/YYYY HH:mm:ss", 'it-IT': "DD/MM/YYYY HH:mm:ss" },
|
|
21
|
+
"FULL_DATE_FORMAT_NO_SS": { 'en-US': "MM/DD/YYYY HH:mm", 'it-IT': "DD/MM/YYYY HH:mm" },
|
|
22
|
+
"SMALL_DATE_DISPLAY_FORMAT": { 'en-US': "DD/MM/YYYY", 'it-IT': "DD/MM/YYYY" },
|
|
23
|
+
"SMALL_DATE_DISPLAY_FORMAT_WITH_HOUR": { 'en-US': "DD/MM/YYYY HH", 'it-IT': "DD/MM/YYYY HH" },
|
|
24
|
+
"SMALL_DATE_DISPLAY_FORMAT_WITH_MINUTE": { 'en-US': "DD/MM/YYYY HH:mm", 'it-IT': "DD/MM/YYYY HH:mm" },
|
|
25
|
+
"FULL_DATE_DISPLAY_FORMAT": { 'en-US': "DD/MM/YYYY HH:mm:ss", 'it-IT': "DD/MM/YYYY HH:mm:ss" },
|
|
26
|
+
"FULL_DATE_DISPLAY_FORMAT_NO_SS": { 'en-US': "DD/MM/YYYY HH:mm", 'it-IT': "DD/MM/YYYY HH:mm" }
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Oggetto di configurazione per tenere da conto le informazioni sui formati
|
|
30
|
+
*/
|
|
31
|
+
cfg = {
|
|
32
|
+
fulldate: "",
|
|
33
|
+
fulldateDisplay: "",
|
|
34
|
+
smallDate: "",
|
|
35
|
+
fulldateNoSS: "",
|
|
36
|
+
smallDateWithH: "",
|
|
37
|
+
smallDateWithM: "",
|
|
38
|
+
fulldateDisplayNoSS: ""
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Costruttore
|
|
42
|
+
*
|
|
43
|
+
* @ignore
|
|
44
|
+
*/
|
|
45
|
+
constructor(locProvider, allowUtc) {
|
|
46
|
+
this.locProvider = locProvider;
|
|
47
|
+
this.allowUtc = allowUtc;
|
|
48
|
+
this.init();
|
|
49
|
+
}
|
|
50
|
+
async init() {
|
|
51
|
+
let LOCALE = this.locProvider ? await this.locProvider.Locale.pipe(first()).toPromise() : 'it-IT';
|
|
52
|
+
this.cfg.smallDate = this.loc["SMALL_DATE_FORMAT"][LOCALE];
|
|
53
|
+
this.cfg.fulldate = this.loc["FULL_DATE_FORMAT"][LOCALE];
|
|
54
|
+
this.cfg.fulldateNoSS = this.loc["FULL_DATE_FORMAT_NO_SS"][LOCALE];
|
|
55
|
+
this.cfg.fulldateDisplay = this.loc["FULL_DATE_DISPLAY_FORMAT"][LOCALE];
|
|
56
|
+
this.cfg.fulldateDisplayNoSS = this.loc["FULL_DATE_DISPLAY_FORMAT_NO_SS"][LOCALE];
|
|
57
|
+
this.cfg.smallDate = this.loc["SMALL_DATE_DISPLAY_FORMAT"][LOCALE];
|
|
58
|
+
this.cfg.smallDateWithH = this.loc["SMALL_DATE_DISPLAY_FORMAT_WITH_HOUR"][LOCALE];
|
|
59
|
+
this.cfg.smallDateWithM = this.loc["SMALL_DATE_DISPLAY_FORMAT_WITH_MINUTE"][LOCALE];
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Aggiusta una data in "istante finale" in base a qual è la parte di data significativa.
|
|
63
|
+
*
|
|
64
|
+
* Es. Istante finale delle ore: 05/10/1992 --> 04/10/1992 24:00(:00)
|
|
65
|
+
*
|
|
66
|
+
* @param {any} date Data qualsiasi (Date, stringa, dayjs...), verrà ricondotta ad un oggetto dayJs
|
|
67
|
+
* @param {'day' | 'hour' | 'minute'} timepart Parte significativa della data
|
|
68
|
+
* @param {boolean} printSeconds Indica se effettuare la stampa dei secondi o no
|
|
69
|
+
*/
|
|
70
|
+
adjustDateToFinalInstant(date, timepart, printSeconds = true) {
|
|
71
|
+
let mydt = this.getDateConvertion(date);
|
|
72
|
+
if (mydt == null)
|
|
73
|
+
return "FE: Not a Date";
|
|
74
|
+
let isZeroTime = mydt.startOf(timepart).valueOf() === mydt.valueOf();
|
|
75
|
+
if (!isZeroTime) {
|
|
76
|
+
if (timepart == "day" && mydt.subtract(1, "hour").hour() == mydt.hour()) {
|
|
77
|
+
// Se l'ora precedente è lo stesso orario dell'ora attuale l'istante finale dev'essere mandato avanti di 1
|
|
78
|
+
mydt = mydt.add(1, "hour");
|
|
79
|
+
}
|
|
80
|
+
return printSeconds ? mydt.format(this.cfg.fulldateDisplay) : mydt.format(this.cfg.fulldateDisplayNoSS);
|
|
81
|
+
}
|
|
82
|
+
let tmpValue = mydt.subtract(1, timepart);
|
|
83
|
+
let value = "";
|
|
84
|
+
// Istante finale delle ore: 05/10/1992 --> 04/10/1992 24:00(:00)
|
|
85
|
+
if (timepart == 'day')
|
|
86
|
+
value = tmpValue.format(this.cfg.smallDate) + " 24:00" + (printSeconds ? ':00' : '');
|
|
87
|
+
// Istante finale dei minuti: giorno 05/10/1992 04:00:00 --> 05/10/1992 03:60(:00)
|
|
88
|
+
else if (timepart == 'hour')
|
|
89
|
+
value = tmpValue.format(this.cfg.smallDateWithH) + ":60" + (printSeconds ? ':00' : '');
|
|
90
|
+
// Istante finale dei secondi: giorno 05/10/1992 04:10:00 --> 05/10/1992 04:09:60
|
|
91
|
+
else if (timepart == 'minute')
|
|
92
|
+
value = tmpValue.format(this.cfg.smallDateWithM) + ":60";
|
|
93
|
+
return value;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Funzione che effettua l'ordinamento fra 2 date in base alla direzione specificata
|
|
97
|
+
*
|
|
98
|
+
* @param {any} a Prima data per il confronto
|
|
99
|
+
* @param {any} b Seconda data per il confronto
|
|
100
|
+
* @param {'asc' | 'desc'} direction Direzione rispetto a cui ordinare le due date
|
|
101
|
+
*
|
|
102
|
+
* @returns {number} 0 se le date sono uguali, 1 se la data A deve venire logicamente prima della data B, -1 altrimenti
|
|
103
|
+
*/
|
|
104
|
+
dateSort(a, b, direction) {
|
|
105
|
+
if (a < b)
|
|
106
|
+
return direction == 'asc' ? 1 : -1;
|
|
107
|
+
else if (a > b)
|
|
108
|
+
return direction == 'asc' ? -1 : 1;
|
|
109
|
+
// con a uguale a b
|
|
110
|
+
return 0;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Effettua il trim dei secondi da una data espressa come stringa
|
|
114
|
+
*
|
|
115
|
+
* @param {string} value Data espressa come stringa
|
|
116
|
+
*
|
|
117
|
+
* @returns {string} Data senza i secondi
|
|
118
|
+
*/
|
|
119
|
+
trimSeconds(value) {
|
|
120
|
+
//I numeri mangiati da dayjs spesso vengono ricondotti a date vere. Mi assicuro che se ci sono solo numeri proseguo
|
|
121
|
+
if (!isNaN(value))
|
|
122
|
+
return value;
|
|
123
|
+
//Se non ho qualcosa del tipo XX/YY/ZZZZ aa:bb:cc di sicuro non è una data che mi interessa
|
|
124
|
+
if (!/^\d\d\/\d\d\/\d\d\d\d \d\d:\d\d:\d\d$/g.test(value))
|
|
125
|
+
return value;
|
|
126
|
+
//In questo caso mi arrivano valori che devono essere stampati as-is, solo tagliando i secondi
|
|
127
|
+
return "'" + value.substr(0, value.length - 3);
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Data una lista di date Da e una lista di date A restituisce un oggetto rappresentante il range che include tutte le date passate
|
|
131
|
+
*
|
|
132
|
+
* @param {any[]} fromDates Lista dei Da
|
|
133
|
+
* @param {any[]} toDates Lista dei A
|
|
134
|
+
*
|
|
135
|
+
* @returns {{ from: any, to: any }} Range di date Da - A che include tutti i valori di **fromDates** e **toDates**
|
|
136
|
+
*/
|
|
137
|
+
getMinMaxDatesRange(fromDates, toDates) {
|
|
138
|
+
let datesFroms = [];
|
|
139
|
+
let datesTo = [];
|
|
140
|
+
for (let i = 0; i < fromDates.length; i++) {
|
|
141
|
+
let d = fromDates[i];
|
|
142
|
+
var convertion = this.getDateConvertion(d);
|
|
143
|
+
if (convertion)
|
|
144
|
+
datesFroms.push(convertion);
|
|
145
|
+
}
|
|
146
|
+
for (let i = 0; i < toDates.length; i++) {
|
|
147
|
+
let d = toDates[i];
|
|
148
|
+
var convertion = this.getDateConvertion(d);
|
|
149
|
+
if (convertion)
|
|
150
|
+
datesTo.push(convertion);
|
|
151
|
+
}
|
|
152
|
+
return { from: dayjs.min(datesFroms), to: dayjs.max(datesTo) };
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Ottiene la conversione di una data in qualsiasi formato al formato standard DayJs
|
|
156
|
+
*
|
|
157
|
+
* @param {any} date Oggetto rappresentante una data. Potrebbe essere una stringa, un Date o già un DayJs
|
|
158
|
+
* @param {boolean} useUtc Indica se usare l'estensione utc di Dayjs per parsare la data o no
|
|
159
|
+
*
|
|
160
|
+
* @returns {any} Data in modalità DayJs
|
|
161
|
+
*/
|
|
162
|
+
getDateConvertion(date, useUtc = false) {
|
|
163
|
+
if (!date)
|
|
164
|
+
return null;
|
|
165
|
+
if (this.isDayJs(date))
|
|
166
|
+
return date;
|
|
167
|
+
if (this.isJsDate(date))
|
|
168
|
+
return useUtc ? dayjs.utc(date) : dayjs(date);
|
|
169
|
+
// Se non c'è la proprietà length vuol dire che non è una stringa e a questo punto non ho idea di che minchia sia
|
|
170
|
+
let length = date.length;
|
|
171
|
+
if (!length)
|
|
172
|
+
return null;
|
|
173
|
+
if (useUtc && !this.allowUtc)
|
|
174
|
+
throw "@esfaenza/extensions: Richiesta data UTC ma da configurazione la libreria non lo supporta";
|
|
175
|
+
// Per risparmiare chiamate a tentoni, in base alla lunghezza della stringa chiamo direttamente il metodo giusto,
|
|
176
|
+
// controllando poi che mi generi una data come me la aspetto io
|
|
177
|
+
let tryThis = null;
|
|
178
|
+
let toCall = useUtc ? dayjs.utc : dayjs;
|
|
179
|
+
// Se la data contiene la lettera "T" vuol dire che è una data del tipo 2020-10-15T00:00:00, direttamente parsabile dal dayjs col locale corretto.
|
|
180
|
+
// Per il resto mi baso sulla lunghezza della stringa
|
|
181
|
+
if (date.includes("T"))
|
|
182
|
+
tryThis = toCall(date);
|
|
183
|
+
else if (length == this.cfg.fulldate.length)
|
|
184
|
+
tryThis = toCall(date, this.cfg.fulldate);
|
|
185
|
+
else if (length == this.cfg.smallDate.length)
|
|
186
|
+
tryThis = toCall(date, this.cfg.smallDate);
|
|
187
|
+
else if (length == this.cfg.fulldateNoSS.length)
|
|
188
|
+
tryThis = toCall(date, this.cfg.fulldateNoSS);
|
|
189
|
+
if (tryThis && tryThis.isValid && tryThis.isValid())
|
|
190
|
+
return tryThis;
|
|
191
|
+
// Se niente funziona, null.
|
|
192
|
+
// Ricondurre l'Input ad una data non è possibile.
|
|
193
|
+
return null;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Helper che restituisce **true** qualora l'oggetto passato fosse una data vera e propria, **false** altrimenti
|
|
197
|
+
*
|
|
198
|
+
* @param {any} check Oggetto da controllare
|
|
199
|
+
*
|
|
200
|
+
* @returns {boolean} Indicazione se l'oggetto è un vero Date di Javascript o no
|
|
201
|
+
*/
|
|
202
|
+
isJsDate(check) {
|
|
203
|
+
return check && Object.prototype.toString.call(check) === "[object Date]" && !isNaN(check);
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Helper che restituisce **true** qualora l'oggetto passato fosse un DayJs vero e proprio, **false** altrimenti
|
|
207
|
+
*
|
|
208
|
+
* @param {any} check Oggetto da controllare
|
|
209
|
+
* @returns {boolean} Indicazione se l'oggetto è un vero DayJs o no
|
|
210
|
+
*/
|
|
211
|
+
isDayJs(check) {
|
|
212
|
+
// Non uso instanceof perché sarebbe estremamente più lento
|
|
213
|
+
// Non uso nemmeno isDayjs() della libreria Dayjs dato che ha lo stesso problema: https://github.com/iamkun/dayjs/blob/06f88f425828b1ce96b737332d25145a95a4ee9d/src/index.js#L9
|
|
214
|
+
return check.$D !== undefined && check.$M !== undefined && check.$y !== undefined;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Ottiene la formattazione di una data in base alla versione richiesta "small" o "long" e a se stampare o meno i secondi
|
|
218
|
+
*
|
|
219
|
+
* @param {any} date Oggetto rappresentante una data. Potrebbe essere una stringa, un Date o già un DayJs
|
|
220
|
+
* @param {boolean} small Indica se formattarla con un formato breve (se **true**) o un formato più lungo (se **false**)
|
|
221
|
+
*
|
|
222
|
+
* @returns {string} Data formattata nel formato richiesto
|
|
223
|
+
*/
|
|
224
|
+
getFormatted(date, small, seconds) {
|
|
225
|
+
var date = this.getDateConvertion(date);
|
|
226
|
+
if (!date)
|
|
227
|
+
return null;
|
|
228
|
+
return date.format(small ? this.cfg.smallDate : seconds ? this.cfg.fulldateDisplay : this.cfg.fulldateDisplayNoSS);
|
|
229
|
+
}
|
|
230
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DateService, deps: [{ token: i1.BaseLocalization, optional: true }, { token: EXT_ALLOW_UTC, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
231
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DateService, providedIn: "root" });
|
|
232
|
+
}
|
|
233
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DateService, decorators: [{
|
|
234
|
+
type: Injectable,
|
|
235
|
+
args: [{ providedIn: "root" }]
|
|
236
|
+
}], ctorParameters: function () { return [{ type: i1.BaseLocalization, decorators: [{
|
|
237
|
+
type: Optional
|
|
238
|
+
}] }, { type: undefined, decorators: [{
|
|
239
|
+
type: Optional
|
|
240
|
+
}, {
|
|
241
|
+
type: Inject,
|
|
242
|
+
args: [EXT_ALLOW_UTC]
|
|
243
|
+
}] }]; } });
|
|
244
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0ZW5zaW9ucy5kYXRlcy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXh0ZW5zaW9ucy9zcmMvbGliL3NlcnZpY2VzL2V4dGVuc2lvbnMuZGF0ZXMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBQ1YsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBSzdELFVBQVU7QUFDVixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRTFDLFdBQVc7QUFDWCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7OztBQVF0Qzs7RUFFRTtBQUVILE1BQU0sT0FBTyxXQUFXO0lBa0NtQjtJQUEwRTtJQWhDakg7O09BRUc7SUFDSyxHQUFHLEdBQUc7UUFDVixtQkFBbUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRTtRQUNyRSxrQkFBa0IsRUFBRSxFQUFFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxPQUFPLEVBQUUscUJBQXFCLEVBQUU7UUFDdEYsd0JBQXdCLEVBQUUsRUFBRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFO1FBQ3RGLDJCQUEyQixFQUFFLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFO1FBQzdFLHFDQUFxQyxFQUFFLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFO1FBQzdGLHVDQUF1QyxFQUFFLEVBQUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRTtRQUNyRywwQkFBMEIsRUFBRSxFQUFFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxPQUFPLEVBQUUscUJBQXFCLEVBQUU7UUFDOUYsZ0NBQWdD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LENBQUM7SUFDdEYsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSSxZQUFZLENBQUMsSUFBUyxFQUFFLEtBQWMsRUFBRSxPQUFnQjtRQUMzRCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPLElBQUksQ0FBQztRQUV2QixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3ZILENBQUM7d0dBclBRLFdBQVcsa0VBa0NzRSxhQUFhOzRHQWxDOUYsV0FBVyxjQURFLE1BQU07OzRGQUNuQixXQUFXO2tCQUR0QixVQUFVO21CQUFDLEVBQUMsVUFBVSxFQUFFLE1BQU0sRUFBQzs7MEJBbUNULFFBQVE7OzBCQUEyQyxRQUFROzswQkFBSSxNQUFNOzJCQUFDLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBbmd1bGFyXHJcbmltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCwgT3B0aW9uYWwgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuLy8gRXNcclxuaW1wb3J0IHsgQmFzZUxvY2FsaXphdGlvbiB9IGZyb20gXCJAZXNmYWVuemEvbG9jYWxpemF0aW9uc1wiO1xyXG5cclxuLy8gTW9kZWxsaVxyXG5pbXBvcnQgeyBFWFRfQUxMT1dfVVRDIH0gZnJvbSBcIi4uL3Rva2Vuc1wiO1xyXG5cclxuLy8gTGlicmVyaWVcclxuaW1wb3J0IHsgZmlyc3QgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuXHJcbi8qKlxyXG4gKiBEaWNoaWFyYXppb25lIGRlbGxhIHZhcmlhYmlsZSBnbG9iYWxlIGRheWpzLiBMJ29uZXJlIGRpIFwiY3JlYXJsYVwiIMOoIGFmZmlkYXRvIGFsbCdhcHBsaWNhemlvbmUgY2hlIHV0aWxpenphIHF1ZXN0YSBsaWJyZXJpYSwgXHJcbiAqIGNoZSBkb3Zyw6AgaW1wb3J0YXJlIGxvIHNjcmlwdCBnbG9iYWxlIGRpIGRheWpzIG5lbGxhIENMSVxyXG4gKi9cclxuIGRlY2xhcmUgdmFyIGRheWpzOiBhbnk7XHJcblxyXG4gLyoqXHJcbiAqIFNlcnZpY2UgY2hlIGZvcm5pc2NlIGRlaSBtZXRvZGkgZGkgZXN0ZW5zaW9uZSBwZXIgbGEgZ2VzdGlvbmUvbWFuaXBvbGF6aW9uZSBkZWxsZSBkYXRlXHJcbiAqL1xyXG4gQEluamVjdGFibGUoe3Byb3ZpZGVkSW46IFwicm9vdFwifSlcclxuZXhwb3J0IGNsYXNzIERhdGVTZXJ2aWNlIHtcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBPZ2dldHRvIHN0YXRpY28gZGkgbG9jYWxpenphemlvbmUgcGVyIGkgbWVzc2FnZ2kgZGkgcXVlc3RhIFNlcnZpY2VcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBsb2MgPSB7XHJcbiAgICAgICAgXCJTTUFMTF9EQVRFX0ZPUk1BVFwiOiB7ICdlbi1VUyc6IFwiTU0vREQvWVlZWVwiLCAnaXQtSVQnOiBcIkREL01NL1lZWVlcIiB9LFxyXG4gICAgICAgIFwiRlVMTF9EQVRFX0ZPUk1BVFwiOiB7ICdlbi1VUyc6IFwiTU0vREQvWVlZWSBISDptbTpzc1wiLCAnaXQtSVQnOiBcIkREL01NL1lZWVkgSEg6bW06c3NcIiB9LFxyXG4gICAgICAgIFwiRlVMTF9EQVRFX0ZPUk1BVF9OT19TU1wiOiB7ICdlbi1VUyc6IFwiTU0vREQvWVlZWSBISDptbVwiLCAnaXQtSVQnOiBcIkREL01NL1lZWVkgSEg6bW1cIiB9LFxyXG4gICAgICAgIFwiU01BTExfREFURV9ESVNQTEFZX0ZPUk1BVFwiOiB7ICdlbi1VUyc6IFwiREQvTU0vWVlZWVwiLCAnaXQtSVQnOiBcIkREL01NL1lZWVlcIiB9LFxyXG4gICAgICAgIFwiU01BTExfREFURV9ESVNQTEFZX0ZPUk1BVF9XSVRIX0hPVVJcIjogeyAnZW4tVVMnOiBcIkREL01NL1lZWVkgSEhcIiwgJ2l0LUlUJzogXCJERC9NTS9ZWVlZIEhIXCIgfSxcclxuICAgICAgICBcIlNNQUxMX0RBVEVfRElTUExBWV9GT1JNQVRfV0lUSF9NSU5VVEVcIjogeyAnZW4tVVMnOiBcIkREL01NL1lZWVkgSEg6bW1cIiwgJ2l0LUlUJzogXCJERC9NTS9ZWVlZIEhIOm1tXCIgfSxcclxuICAgICAgICBcIkZVTExfREFURV9ESVNQTEFZX0ZPUk1BVFwiOiB7ICdlbi1VUyc6IFwiREQvTU0vWVlZWSBISDptbTpzc1wiLCAnaXQtSVQnOiBcIkREL01NL1lZWVkgSEg6bW06c3NcIiB9LFxyXG4gICAgICAgIFwiRlVMTF9EQVRFX0RJU1BMQVlfRk9STUFUX05PX1NTXCI6IHsgJ2VuLVVTJzogXCJERC9NTS9ZWVlZIEhIOm1tXCIsICdpdC1JVCc6IFwiREQvTU0vWVlZWSBISDptbVwiIH1cclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPZ2dldHRvIGRpIGNvbmZpZ3VyYXppb25lIHBlciB0ZW5lcmUgZGEgY29udG8gbGUgaW5mb3JtYXppb25pIHN1aSBmb3JtYXRpXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY2ZnID0ge1xyXG4gICAgICAgIGZ1bGxkYXRlOiBcIlwiLFxyXG4gICAgICAgIGZ1bGxkYXRlRGlzcGxheTogXCJcIixcclxuICAgICAgICBzbWFsbERhdGU6IFwiXCIsXHJcbiAgICAgICAgZnVsbGRhdGVOb1NTOiBcIlwiLFxyXG4gICAgICAgIHNtYWxsRGF0ZVdpdGhIOiBcIlwiLFxyXG4gICAgICAgIHNtYWxsRGF0ZVdpdGhNOiBcIlwiLFxyXG4gICAgICAgIGZ1bGxkYXRlRGlzcGxheU5vU1M6IFwiXCJcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvc3RydXR0b3JlXHJcbiAgICAgKiBcclxuICAgICAqIEBpZ25vcmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKEBPcHRpb25hbCgpIHByaXZhdGUgbG9jUHJvdmlkZXI6IEJhc2VMb2NhbGl6YXRpb24sIEBPcHRpb25hbCgpIEBJbmplY3QoRVhUX0FMTE9XX1VUQykgcHJpdmF0ZSBhbGxvd1V0YzogYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMuaW5pdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGluaXQoKXtcclxuICAgICAgICBsZXQgTE9DQUxFID0gdGhpcy5sb2NQcm92aWRlciA/ICBhd2FpdCB0aGlzLmxvY1Byb3ZpZGVyLkxvY2FsZS5waXBlKGZpcnN0KCkpLnRvUHJvbWlzZSgpIDogJ2l0LUlUJztcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLmNmZy5zbWFsbERhdGUgPSB0aGlzLmxvY1tcIlNNQUxMX0RBVEVfRk9STUFUXCJdW0xPQ0FMRV07XHJcbiAgICAgICAgdGhpcy5jZmcuZnVsbGRhdGUgPSB0aGlzLmxvY1tcIkZVTExfREFURV9GT1JNQVRcIl1bTE9DQUxFXTtcclxuICAgICAgICB0aGlzLmNmZy5mdWxsZGF0ZU5vU1MgPSB0aGlzLmxvY1tcIkZVTExfREFURV9GT1JNQVRfTk9fU1NcIl1bTE9DQUxFXTtcclxuICAgICAgICB0aGlzLmNmZy5mdWxsZGF0ZURpc3BsYXkgPSB0aGlzLmxvY1tcIkZVTExfREFURV9ESVNQTEFZX0ZPUk1BVFwiXVtMT0NBTEVdO1xyXG4gICAgICAgIHRoaXMuY2ZnLmZ1bGxkYXRlRGlzcGxheU5vU1MgID10aGlzLmxvY1tcIkZVTExfREFURV9ESVNQTEFZX0ZPUk1BVF9OT19TU1wiXVtMT0NBTEVdO1xyXG4gICAgICAgIHRoaXMuY2ZnLnNtYWxsRGF0ZSA9IHRoaXMubG9jW1wiU01BTExfREFURV9ESVNQTEFZX0ZPUk1BVFwiXVtMT0NBTEVdO1xyXG4gICAgICAgIHRoaXMuY2ZnLnNtYWxsRGF0ZVdpdGhIID0gdGhpcy5sb2NbXCJTTUFMTF9EQVRFX0RJU1BMQVlfRk9STUFUX1dJVEhfSE9VUlwiXVtMT0NBTEVdO1xyXG4gICAgICAgIHRoaXMuY2ZnLnNtYWxsRGF0ZVdpdGhNID0gdGhpcy5sb2NbXCJTTUFMTF9EQVRFX0RJU1BMQVlfRk9STUFUX1dJVEhfTUlOVVRFXCJdW0xPQ0FMRV07XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEFnZ2l1c3RhIHVuYSBkYXRhIGluIFwiaXN0YW50ZSBmaW5hbGVcIiBpbiBiYXNlIGEgcXVhbCDDqCBsYSBwYXJ0ZSBkaSBkYXRhIHNpZ25pZmljYXRpdmEuXHJcbiAgICAgKiBcclxuICAgICAqIEVzLiBJc3RhbnRlIGZpbmFsZSBkZWxsZSBvcmU6IDA1LzEwLzE5OTIgLS0+IDA0LzEwLzE5OTIgMjQ6MDAoOjAwKVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gZGF0ZSBEYXRhIHF1YWxzaWFzaSAoRGF0ZSwgc3RyaW5nYSwgZGF5anMuLi4pLCB2ZXJyw6Agcmljb25kb3R0YSBhZCB1biBvZ2dldHRvIGRheUpzXHJcbiAgICAgKiBAcGFyYW0geydkYXknIHwgJ2hvdXInIHwgJ21pbnV0ZSd9IHRpbWVwYXJ0IFBhcnRlIHNpZ25pZmljYXRpdmEgZGVsbGEgZGF0YVxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBwcmludFNlY29uZHMgSW5kaWNhIHNlIGVmZmV0dHVhcmUgbGEgc3RhbXBhIGRlaSBzZWNvbmRpIG8gbm9cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFkanVzdERhdGVUb0ZpbmFsSW5zdGFudChkYXRlOiBhbnksIHRpbWVwYXJ0OiAnZGF5JyB8ICdob3VyJyB8ICdtaW51dGUnLCBwcmludFNlY29uZHM6IGJvb2xlYW4gPSB0cnVlKTogc3RyaW5nIHtcclxuICAgICAgICBsZXQgbXlkdCA9IHRoaXMuZ2V0RGF0ZUNvbnZlcnRpb24oZGF0ZSk7XHJcbiAgICAgICAgaWYgKG15ZHQgPT0gbnVsbCkgcmV0dXJuIFwiRkU6IE5vdCBhIERhdGVcIjtcclxuXHJcbiAgICAgICAgbGV0IGlzWmVyb1RpbWUgPSBteWR0LnN0YXJ0T2YodGltZXBhcnQpLnZhbHVlT2YoKSA9PT0gbXlkdC52YWx1ZU9mKCk7XHJcbiAgICAgICAgaWYgKCFpc1plcm9UaW1lKSB7XHJcbiAgICAgICAgICAgIGlmICh0aW1lcGFydCA9PSBcImRheVwiICYmIG15ZHQuc3VidHJhY3QoMSwgXCJob3VyXCIpLmhvdXIoKSA9PSBteWR0LmhvdXIoKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gU2UgbCdvcmEgcHJlY2VkZW50ZSDDqCBsbyBzdGVzc28gb3JhcmlvIGRlbGwnb3JhIGF0dHVhbGUgbCdpc3RhbnRlIGZpbmFsZSBkZXYnZXNzZXJlIG1hbmRhdG8gYXZhbnRpIGRpIDFcclxuICAgICAgICAgICAgICAgIG15ZHQgPSBteWR0LmFkZCgxLCBcImhvdXJcIik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBwcmludFNlY29uZHMgPyBteWR0LmZvcm1hdCh0aGlzLmNmZy5mdWxsZGF0ZURpc3BsYXkpIDogbXlkdC5mb3JtYXQodGhpcy5jZmcuZnVsbGRhdGVEaXNwbGF5Tm9TUyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgdG1wVmFsdWUgPSBteWR0LnN1YnRyYWN0KDEsIHRpbWVwYXJ0KTtcclxuICAgICAgICBsZXQgdmFsdWUgPSBcIlwiO1xyXG5cclxuICAgICAgICAvLyBJc3RhbnRlIGZpbmFsZSBkZWxsZSBvcmU6IDA1LzEwLzE5OTIgLS0+IDA0LzEwLzE5OTIgMjQ6MDAoOjAwKVxyXG4gICAgICAgIGlmICh0aW1lcGFydCA9PSAnZGF5JylcclxuICAgICAgICAgICAgdmFsdWUgPSB0bXBWYWx1ZS5mb3JtYXQodGhpcy5jZmcuc21hbGxEYXRlKSArIFwiIDI0OjAwXCIgKyAocHJpbnRTZWNvbmRzID8gJzowMCcgOiAnJyk7XHJcblxyXG4gICAgICAgIC8vIElzdGFudGUgZmluYWxlIGRlaSBtaW51dGk6IGdpb3JubyAwNS8xMC8xOTkyIDA0OjAwOjAwIC0tPiAwNS8xMC8xOTkyIDAzOjYwKDowMClcclxuICAgICAgICBlbHNlIGlmICh0aW1lcGFydCA9PSAnaG91cicpXHJcbiAgICAgICAgICAgIHZhbHVlID0gdG1wVmFsdWUuZm9ybWF0KHRoaXMuY2ZnLnNtYWxsRGF0ZVdpdGhIKSArIFwiOjYwXCIgKyAocHJpbnRTZWNvbmRzID8gJzowMCcgOiAnJyk7XHJcblxyXG4gICAgICAgIC8vIElzdGFudGUgZmluYWxlIGRlaSBzZWNvbmRpOiBnaW9ybm8gMDUvMTAvMTk5MiAwNDoxMDowMCAtLT4gMDUvMTAvMTk5MiAwNDowOTo2MFxyXG4gICAgICAgIGVsc2UgaWYgKHRpbWVwYXJ0ID09ICdtaW51dGUnKVxyXG4gICAgICAgICAgICB2YWx1ZSA9IHRtcFZhbHVlLmZvcm1hdCh0aGlzLmNmZy5zbWFsbERhdGVXaXRoTSkgKyBcIjo2MFwiO1xyXG5cclxuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGdW56aW9uZSBjaGUgZWZmZXR0dWEgbCdvcmRpbmFtZW50byBmcmEgMiBkYXRlIGluIGJhc2UgYWxsYSBkaXJlemlvbmUgc3BlY2lmaWNhdGFcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHthbnl9IGEgUHJpbWEgZGF0YSBwZXIgaWwgY29uZnJvbnRvXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gYiBTZWNvbmRhIGRhdGEgcGVyIGlsIGNvbmZyb250b1xyXG4gICAgICogQHBhcmFtIHsnYXNjJyB8ICdkZXNjJ30gZGlyZWN0aW9uIERpcmV6aW9uZSByaXNwZXR0byBhIGN1aSBvcmRpbmFyZSBsZSBkdWUgZGF0ZVxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSAwIHNlIGxlIGRhdGUgc29ubyB1Z3VhbGksIDEgc2UgbGEgZGF0YSBBIGRldmUgdmVuaXJlIGxvZ2ljYW1lbnRlIHByaW1hIGRlbGxhIGRhdGEgQiwgLTEgYWx0cmltZW50aVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZGF0ZVNvcnQoYTogYW55LCBiOiBhbnksIGRpcmVjdGlvbjogJ2FzYycgfCAnZGVzYycpOiBudW1iZXIge1xyXG4gICAgICAgIGlmIChhIDwgYikgcmV0dXJuIGRpcmVjdGlvbiA9PSAnYXNjJyA/IDEgOiAtMTtcclxuICAgICAgICBlbHNlIGlmIChhID4gYikgcmV0dXJuIGRpcmVjdGlvbiA9PSAnYXNjJyA/IC0xIDogMTtcclxuXHJcbiAgICAgICAgLy8gY29uIGEgdWd1YWxlIGEgYlxyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRWZmZXR0dWEgaWwgdHJpbSBkZWkgc2Vjb25kaSBkYSB1bmEgZGF0YSBlc3ByZXNzYSBjb21lIHN0cmluZ2FcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIERhdGEgZXNwcmVzc2EgY29tZSBzdHJpbmdhXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IERhdGEgc2VuemEgaSBzZWNvbmRpXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0cmltU2Vjb25kcyh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICAvL0kgbnVtZXJpIG1hbmdpYXRpIGRhIGRheWpzIHNwZXNzbyB2ZW5nb25vIHJpY29uZG90dGkgYSBkYXRlIHZlcmUuIE1pIGFzc2ljdXJvIGNoZSBzZSBjaSBzb25vIHNvbG8gbnVtZXJpIHByb3NlZ3VvXHJcbiAgICAgICAgaWYgKCFpc05hTig8YW55PnZhbHVlKSlcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG5cclxuICAgICAgICAvL1NlIG5vbiBobyBxdWFsY29zYSBkZWwgdGlwbyBYWC9ZWS9aWlpaIGFhOmJiOmNjIGRpIHNpY3VybyBub24gw6ggdW5hIGRhdGEgY2hlIG1pIGludGVyZXNzYVxyXG4gICAgICAgIGlmICghL15cXGRcXGRcXC9cXGRcXGRcXC9cXGRcXGRcXGRcXGQgXFxkXFxkOlxcZFxcZDpcXGRcXGQkL2cudGVzdCh2YWx1ZSkpXHJcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcclxuXHJcbiAgICAgICAgLy9JbiBxdWVzdG8gY2FzbyBtaSBhcnJpdmFubyB2YWxvcmkgY2hlIGRldm9ubyBlc3NlcmUgc3RhbXBhdGkgYXMtaXMsIHNvbG8gdGFnbGlhbmRvIGkgc2Vjb25kaVxyXG4gICAgICAgIHJldHVybiBcIidcIiArIHZhbHVlLnN1YnN0cigwLCB2YWx1ZS5sZW5ndGggLSAzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERhdGEgdW5hIGxpc3RhIGRpIGRhdGUgRGEgZSB1bmEgbGlzdGEgZGkgZGF0ZSBBIHJlc3RpdHVpc2NlIHVuIG9nZ2V0dG8gcmFwcHJlc2VudGFudGUgaWwgcmFuZ2UgY2hlIGluY2x1ZGUgdHV0dGUgbGUgZGF0ZSBwYXNzYXRlXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7YW55W119IGZyb21EYXRlcyBMaXN0YSBkZWkgRGFcclxuICAgICAqIEBwYXJhbSB7YW55W119IHRvRGF0ZXMgTGlzdGEgZGVpIEFcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge3sgZnJvbTogYW55LCB0bzogYW55IH19IFJhbmdlIGRpIGRhdGUgRGEgLSBBIGNoZSBpbmNsdWRlIHR1dHRpIGkgdmFsb3JpIGRpICoqZnJvbURhdGVzKiogZSAqKnRvRGF0ZXMqKlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0TWluTWF4RGF0ZXNSYW5nZShmcm9tRGF0ZXM6IGFueVtdLCB0b0RhdGVzOiBhbnlbXSk6IHsgZnJvbTogYW55LCB0bzogYW55IH0ge1xyXG4gICAgICAgIGxldCBkYXRlc0Zyb21zOiBhbnlbXSA9IFtdO1xyXG4gICAgICAgIGxldCBkYXRlc1RvOiBhbnlbXSA9IFtdO1xyXG5cclxuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgZnJvbURhdGVzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbGV0IGQgPSBmcm9tRGF0ZXNbaV07XHJcbiAgICAgICAgICAgIHZhciBjb252ZXJ0aW9uID0gdGhpcy5nZXREYXRlQ29udmVydGlvbihkKTtcclxuICAgICAgICAgICAgaWYgKGNvbnZlcnRpb24pXHJcbiAgICAgICAgICAgICAgICBkYXRlc0Zyb21zLnB1c2goY29udmVydGlvbik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgdG9EYXRlcy5sZW5ndGg7IGkrKylcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGxldCBkID0gdG9EYXRlc1tpXTtcclxuICAgICAgICAgICAgdmFyIGNvbnZlcnRpb24gPSB0aGlzLmdldERhdGVDb252ZXJ0aW9uKGQpO1xyXG4gICAgICAgICAgICBpZiAoY29udmVydGlvbilcclxuICAgICAgICAgICAgICAgIGRhdGVzVG8ucHVzaChjb252ZXJ0aW9uKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB7IGZyb206IGRheWpzLm1pbihkYXRlc0Zyb21zKSwgdG86IGRheWpzLm1heChkYXRlc1RvKSB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT3R0aWVuZSBsYSBjb252ZXJzaW9uZSBkaSB1bmEgZGF0YSBpbiBxdWFsc2lhc2kgZm9ybWF0byBhbCBmb3JtYXRvIHN0YW5kYXJkIERheUpzXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7YW55fSBkYXRlIE9nZ2V0dG8gcmFwcHJlc2VudGFudGUgdW5hIGRhdGEuIFBvdHJlYmJlIGVzc2VyZSB1bmEgc3RyaW5nYSwgdW4gRGF0ZSBvIGdpw6AgdW4gRGF5SnNcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gdXNlVXRjIEluZGljYSBzZSB1c2FyZSBsJ2VzdGVuc2lvbmUgdXRjIGRpIERheWpzIHBlciBwYXJzYXJlIGxhIGRhdGEgbyBub1xyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7YW55fSBEYXRhIGluIG1vZGFsaXTDoCBEYXlKc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0RGF0ZUNvbnZlcnRpb24oZGF0ZTogYW55LCB1c2VVdGM6IGJvb2xlYW4gPSBmYWxzZSk6IGFueSB7XHJcbiAgICAgICAgaWYgKCFkYXRlKVxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaXNEYXlKcyhkYXRlKSlcclxuICAgICAgICAgICAgcmV0dXJuIGRhdGU7XHJcblxyXG4gICAgICAgIGlmKHRoaXMuaXNKc0RhdGUoZGF0ZSkpXHJcbiAgICAgICAgICAgIHJldHVybiB1c2VVdGMgPyBkYXlqcy51dGMoZGF0ZSk6IGRheWpzKGRhdGUpO1xyXG5cclxuICAgICAgICAvLyBTZSBub24gYyfDqCBsYSBwcm9wcmlldMOgIGxlbmd0aCB2dW9sIGRpcmUgY2hlIG5vbiDDqCB1bmEgc3RyaW5nYSBlIGEgcXVlc3RvIHB1bnRvIG5vbiBobyBpZGVhIGRpIGNoZSBtaW5jaGlhIHNpYVxyXG4gICAgICAgIGxldCBsZW5ndGggPSBkYXRlLmxlbmd0aDtcclxuICAgICAgICBpZiAoIWxlbmd0aClcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICAgIGlmICh1c2VVdGMgJiYgIXRoaXMuYWxsb3dVdGMpXHJcbiAgICAgICAgICAgIHRocm93IFwiQGVzZmFlbnphL2V4dGVuc2lvbnM6IFJpY2hpZXN0YSBkYXRhIFVUQyBtYSBkYSBjb25maWd1cmF6aW9uZSBsYSBsaWJyZXJpYSBub24gbG8gc3VwcG9ydGFcIjtcclxuXHJcbiAgICAgICAgLy8gUGVyIHJpc3Bhcm1pYXJlIGNoaWFtYXRlIGEgdGVudG9uaSwgaW4gYmFzZSBhbGxhIGx1bmdoZXp6YSBkZWxsYSBzdHJpbmdhIGNoaWFtbyBkaXJldHRhbWVudGUgaWwgbWV0b2RvIGdpdXN0bywgXHJcbiAgICAgICAgLy8gY29udHJvbGxhbmRvIHBvaSBjaGUgbWkgZ2VuZXJpIHVuYSBkYXRhIGNvbWUgbWUgbGEgYXNwZXR0byBpb1xyXG4gICAgICAgIGxldCB0cnlUaGlzID0gbnVsbDtcclxuICAgICAgICBsZXQgdG9DYWxsID0gdXNlVXRjID8gZGF5anMudXRjIDogZGF5anM7XHJcblxyXG4gICAgICAgIC8vIFNlIGxhIGRhdGEgY29udGllbmUgbGEgbGV0dGVyYSBcIlRcIiB2dW9sIGRpcmUgY2hlIMOoIHVuYSBkYXRhIGRlbCB0aXBvIDIwMjAtMTAtMTVUMDA6MDA6MDAsIGRpcmV0dGFtZW50ZSBwYXJzYWJpbGUgZGFsIGRheWpzIGNvbCBsb2NhbGUgY29ycmV0dG8uXHJcbiAgICAgICAgLy8gUGVyIGlsIHJlc3RvIG1pIGJhc28gc3VsbGEgbHVuZ2hlenphIGRlbGxhIHN0cmluZ2FcclxuICAgICAgICBpZiAoKDxzdHJpbmc+ZGF0ZSkuaW5jbHVkZXMoXCJUXCIpKVxyXG4gICAgICAgICAgICB0cnlUaGlzID0gdG9DYWxsKGRhdGUpO1xyXG4gICAgICAgIGVsc2UgaWYgKGxlbmd0aCA9PSB0aGlzLmNmZy5mdWxsZGF0ZS5sZW5ndGgpXHJcbiAgICAgICAgICAgIHRyeVRoaXMgPSB0b0NhbGwoZGF0ZSwgdGhpcy5jZmcuZnVsbGRhdGUpO1xyXG4gICAgICAgIGVsc2UgaWYgKGxlbmd0aCA9PSB0aGlzLmNmZy5zbWFsbERhdGUubGVuZ3RoKVxyXG4gICAgICAgICAgICB0cnlUaGlzID0gdG9DYWxsKGRhdGUsIHRoaXMuY2ZnLnNtYWxsRGF0ZSk7XHJcbiAgICAgICAgZWxzZSBpZiAobGVuZ3RoID09IHRoaXMuY2ZnLmZ1bGxkYXRlTm9TUy5sZW5ndGgpXHJcbiAgICAgICAgICAgIHRyeVRoaXMgPSB0b0NhbGwoZGF0ZSwgdGhpcy5jZmcuZnVsbGRhdGVOb1NTKVxyXG5cclxuICAgICAgICBpZiAodHJ5VGhpcyAmJiB0cnlUaGlzLmlzVmFsaWQgJiYgdHJ5VGhpcy5pc1ZhbGlkKCkpXHJcbiAgICAgICAgICAgIHJldHVybiB0cnlUaGlzO1xyXG5cclxuICAgICAgICAvLyBTZSBuaWVudGUgZnVuemlvbmEsIG51bGwuIFxyXG4gICAgICAgIC8vIFJpY29uZHVycmUgbCdJbnB1dCBhZCB1bmEgZGF0YSBub24gw6ggcG9zc2liaWxlLlxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGVscGVyIGNoZSByZXN0aXR1aXNjZSAqKnRydWUqKiBxdWFsb3JhIGwnb2dnZXR0byBwYXNzYXRvIGZvc3NlIHVuYSBkYXRhIHZlcmEgZSBwcm9wcmlhLCAqKmZhbHNlKiogYWx0cmltZW50aVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gY2hlY2sgT2dnZXR0byBkYSBjb250cm9sbGFyZVxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gSW5kaWNhemlvbmUgc2UgbCdvZ2dldHRvIMOoIHVuIHZlcm8gRGF0ZSBkaSBKYXZhc2NyaXB0IG8gbm9cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBpc0pzRGF0ZShjaGVjazogYW55KTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIGNoZWNrICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChjaGVjaykgPT09IFwiW29iamVjdCBEYXRlXVwiICYmICFpc05hTihjaGVjayk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIZWxwZXIgY2hlIHJlc3RpdHVpc2NlICoqdHJ1ZSoqIHF1YWxvcmEgbCdvZ2dldHRvIHBhc3NhdG8gZm9zc2UgdW4gRGF5SnMgdmVybyBlIHByb3ByaW8sICoqZmFsc2UqKiBhbHRyaW1lbnRpXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7YW55fSBjaGVjayBPZ2dldHRvIGRhIGNvbnRyb2xsYXJlXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gSW5kaWNhemlvbmUgc2UgbCdvZ2dldHRvIMOoIHVuIHZlcm8gRGF5SnMgbyBub1xyXG4gICAgICovXHJcbiAgICAgcHJpdmF0ZSBpc0RheUpzKGNoZWNrOiBhbnkpOiBib29sZWFuIHtcclxuICAgICAgICAvLyBOb24gdXNvIGluc3RhbmNlb2YgcGVyY2jDqSBzYXJlYmJlIGVzdHJlbWFtZW50ZSBwacO5IGxlbnRvXHJcbiAgICAgICAgLy8gTm9uIHVzbyBuZW1tZW5vIGlzRGF5anMoKSBkZWxsYSBsaWJyZXJpYSBEYXlqcyBkYXRvIGNoZSBoYSBsbyBzdGVzc28gcHJvYmxlbWE6IGh0dHBzOi8vZ2l0aHViLmNvbS9pYW1rdW4vZGF5anMvYmxvYi8wNmY4OGY0MjU4MjhiMWNlOTZiNzM3MzMyZDI1MTQ1YTk1YTRlZTlkL3NyYy9pbmRleC5qcyNMOVxyXG4gICAgICAgIHJldHVybiBjaGVjay4kRCAhPT0gdW5kZWZpbmVkICYmIGNoZWNrLiRNICE9PSB1bmRlZmluZWQgJiYgY2hlY2suJHkgIT09IHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE90dGllbmUgbGEgZm9ybWF0dGF6aW9uZSBkaSB1bmEgZGF0YSBpbiBiYXNlIGFsbGEgdmVyc2lvbmUgcmljaGllc3RhIFwic21hbGxcIiBvIFwibG9uZ1wiIGUgYSBzZSBzdGFtcGFyZSBvIG1lbm8gaSBzZWNvbmRpXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7YW55fSBkYXRlIE9nZ2V0dG8gcmFwcHJlc2VudGFudGUgdW5hIGRhdGEuIFBvdHJlYmJlIGVzc2VyZSB1bmEgc3RyaW5nYSwgdW4gRGF0ZSBvIGdpw6AgdW4gRGF5SnNcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gc21hbGwgSW5kaWNhIHNlIGZvcm1hdHRhcmxhIGNvbiB1biBmb3JtYXRvIGJyZXZlIChzZSAqKnRydWUqKikgbyB1biBmb3JtYXRvIHBpw7kgbHVuZ28gKHNlICoqZmFsc2UqKilcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge3N0cmluZ30gRGF0YSBmb3JtYXR0YXRhIG5lbCBmb3JtYXRvIHJpY2hpZXN0b1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Rm9ybWF0dGVkKGRhdGU6IGFueSwgc21hbGw6IGJvb2xlYW4sIHNlY29uZHM6IGJvb2xlYW4pOiBzdHJpbmcge1xyXG4gICAgICAgIHZhciBkYXRlID0gdGhpcy5nZXREYXRlQ29udmVydGlvbihkYXRlKTtcclxuICAgICAgICBpZiAoIWRhdGUpIHJldHVybiBudWxsO1xyXG5cclxuICAgICAgICByZXR1cm4gZGF0ZS5mb3JtYXQoc21hbGwgPyB0aGlzLmNmZy5zbWFsbERhdGUgOiBzZWNvbmRzID8gdGhpcy5jZmcuZnVsbGRhdGVEaXNwbGF5IDogdGhpcy5jZmcuZnVsbGRhdGVEaXNwbGF5Tm9TUyk7XHJcbiAgICB9XHJcbn0iXX0=
|