@esfaenza/extensions 18.2.2 → 19.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/fesm2022/esfaenza-extensions.mjs +39 -36
- package/fesm2022/esfaenza-extensions.mjs.map +1 -1
- package/lib/services/extensions.exports.service.d.ts +3 -1
- package/package.json +5 -7
- package/esm2022/esfaenza-extensions.mjs +0 -5
- package/esm2022/lib/models/CallResult.mjs +0 -24
- package/esm2022/lib/models/CsvHeaders.mjs +0 -26
- package/esm2022/lib/models/ExportConsts.mjs +0 -32
- package/esm2022/lib/models/ExtensionsModuleConfig.mjs +0 -10
- package/esm2022/lib/models/GenericItem.mjs +0 -10
- package/esm2022/lib/models/InboundMessageTypes.mjs +0 -7
- package/esm2022/lib/models/InterComMessage.mjs +0 -16
- package/esm2022/lib/models/TypeCode.mjs +0 -25
- package/esm2022/lib/modules/extensions.module.mjs +0 -32
- package/esm2022/lib/pipes/loc_date.pipe.mjs +0 -38
- package/esm2022/lib/services/extensions.base.mjs +0 -30
- package/esm2022/lib/services/extensions.clipboard.service.mjs +0 -221
- package/esm2022/lib/services/extensions.dates.service.mjs +0 -244
- package/esm2022/lib/services/extensions.embedding.service.mjs +0 -213
- package/esm2022/lib/services/extensions.exports.service.mjs +0 -617
- package/esm2022/lib/services/extensions.hashing.service.mjs +0 -308
- package/esm2022/lib/services/extensions.intercom.service.mjs +0 -52
- package/esm2022/lib/services/extensions.messages.service.mjs +0 -450
- package/esm2022/lib/services/extensions.utilities.service.mjs +0 -250
- package/esm2022/lib/tokens.mjs +0 -12
- package/esm2022/public-api.mjs +0 -22
|
@@ -1,308 +0,0 @@
|
|
|
1
|
-
// Angular
|
|
2
|
-
import { Injectable } from "@angular/core";
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
/**
|
|
5
|
-
* Service che fornisce alcuni semplici funzioni di Hashing / GUID / ecc...
|
|
6
|
-
*/
|
|
7
|
-
export class HashingService {
|
|
8
|
-
/**
|
|
9
|
-
* Generazione di un GUID pseudo-univoco
|
|
10
|
-
*
|
|
11
|
-
* @returns {string} il GUID generato
|
|
12
|
-
*/
|
|
13
|
-
getGUID() {
|
|
14
|
-
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, c => {
|
|
15
|
-
var r = Math.random() * 16 | 0, v = c == "x" ? r : (r & 0x3 | 0x8);
|
|
16
|
-
return v.toString(16);
|
|
17
|
-
});
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Calcolo dell'hash su un oggetto
|
|
21
|
-
*
|
|
22
|
-
* @param {any} o Oggetto di cui calcolare l'hash
|
|
23
|
-
* @param {number} level Livello di ricorsione nel caso venga effettuato l'hash di un oggetto che contiene altri oggetti
|
|
24
|
-
* @param {boolean} navigateFullDepth Indica se navigare l'oggetto per l'intera lunghezza. In caso contrario si ferma al secondo livello
|
|
25
|
-
*
|
|
26
|
-
* @returns {string} Hash generato per l'oggetto in questione
|
|
27
|
-
*/
|
|
28
|
-
hashObject(o, level = 0, navigateFullDepth = false, precise = false) {
|
|
29
|
-
var strDef = this.stringify(o, level, navigateFullDepth);
|
|
30
|
-
var hash = precise ? this.md5(strDef) : this.simpleHash(strDef);
|
|
31
|
-
return hash;
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Hash più semplice e più veloce dell'md5, ma meno sicuro
|
|
35
|
-
*
|
|
36
|
-
* Vedi https://stackoverflow.com/questions/7616461/generate-a-hash-from-string-in-javascript
|
|
37
|
-
*
|
|
38
|
-
* @param {string} str Stringa di cui calcolare l'hash
|
|
39
|
-
*/
|
|
40
|
-
simpleHash(str, seed = 0) {
|
|
41
|
-
let h1 = 0xdeadbeef ^ seed, h2 = 0x41c6ce57 ^ seed;
|
|
42
|
-
for (let i = 0, ch; i < str.length; i++) {
|
|
43
|
-
ch = str.charCodeAt(i);
|
|
44
|
-
h1 = Math.imul(h1 ^ ch, 2654435761);
|
|
45
|
-
h2 = Math.imul(h2 ^ ch, 1597334677);
|
|
46
|
-
}
|
|
47
|
-
h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^ Math.imul(h2 ^ (h2 >>> 13), 3266489909);
|
|
48
|
-
h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^ Math.imul(h1 ^ (h1 >>> 13), 3266489909);
|
|
49
|
-
return (4294967296 * (2097151 & h2) + (h1 >>> 0)).toString();
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Blacklist dei tipi da ignorare quando si effettua l'hashing degli oggetti
|
|
53
|
-
*/
|
|
54
|
-
objBlacklist = {
|
|
55
|
-
"NgForm": true, "ElementRef": true, "ExtensionsService": true, "ToastrService": true, "LocaleService": true, "AppState": true, "Router": true,
|
|
56
|
-
"ActivatedRoute": true, "HTTPService": true, "Location": true, "CanvasComponent": true, "ModalDirective": true, "ChangeDetectorRef": true,
|
|
57
|
-
"DateService": true, "EventEmitter": true, "ViewRef_": true, "Subscriber": true, "ItemLocalization": true
|
|
58
|
-
};
|
|
59
|
-
/**
|
|
60
|
-
* Genera una stringa che identifica univocamente l'oggetto in questione
|
|
61
|
-
*
|
|
62
|
-
* @param {any} o Oggetto di cui calcolare la stringa univoca
|
|
63
|
-
* @param {number} level Livello di ricorsione nel caso venga effettuato l'hash di un oggetto che contiene altri oggetti
|
|
64
|
-
* @param {boolean} navigateFullDepth Indica se navigare l'oggetto per l'intera lunghezza. In caso contrario si ferma al secondo livello
|
|
65
|
-
*/
|
|
66
|
-
stringify(o, level, navigateFullDepth) {
|
|
67
|
-
var i, r;
|
|
68
|
-
if (o === null)
|
|
69
|
-
return "n";
|
|
70
|
-
if (o === true)
|
|
71
|
-
return "t";
|
|
72
|
-
if (o === false)
|
|
73
|
-
return "f";
|
|
74
|
-
if (o instanceof Date)
|
|
75
|
-
return 'd:' + o.valueOf().toString();
|
|
76
|
-
i = typeof o;
|
|
77
|
-
if (i === "string")
|
|
78
|
-
return "s:" + o;
|
|
79
|
-
if (i === "number")
|
|
80
|
-
return "n:" + o;
|
|
81
|
-
if (o instanceof Function)
|
|
82
|
-
return "m:" + o.toString();
|
|
83
|
-
if (o instanceof Array) {
|
|
84
|
-
r = [];
|
|
85
|
-
for (i = 0; i < o.length; i++) {
|
|
86
|
-
let res = this.stringify(o[i], level, navigateFullDepth);
|
|
87
|
-
if (res)
|
|
88
|
-
r.push(res);
|
|
89
|
-
}
|
|
90
|
-
return r.length > 0 ? "a:" + r.join(";") : "";
|
|
91
|
-
}
|
|
92
|
-
r = [];
|
|
93
|
-
//Se è oggetto, escludo tutti quelli di sistema/inutili
|
|
94
|
-
if (o) {
|
|
95
|
-
var name = o.__proto__.constructor.name;
|
|
96
|
-
if (!this.objBlacklist[name]) {
|
|
97
|
-
for (i in o) {
|
|
98
|
-
if (o.hasOwnProperty(i) && (level <= 2 || navigateFullDepth)) {
|
|
99
|
-
let res = this.stringify(o[i], level + 1, navigateFullDepth);
|
|
100
|
-
if (res)
|
|
101
|
-
r.push(i + ":" + res);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
return r.length > 0 ? "o:" + r.join(";") : "";
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* Data una stringa restituisce l'md5
|
|
110
|
-
*
|
|
111
|
-
* @param {string} s Stringa di cui calcolare l'md5
|
|
112
|
-
* @returns {string} md5 della stringa **s**
|
|
113
|
-
*/
|
|
114
|
-
md5(s) {
|
|
115
|
-
return this.hex(this.md51(s));
|
|
116
|
-
}
|
|
117
|
-
/**
|
|
118
|
-
* @ignore
|
|
119
|
-
*
|
|
120
|
-
* Metodo di utilità per il calcolo dell'md5
|
|
121
|
-
*/
|
|
122
|
-
md5cycle(x, k) {
|
|
123
|
-
var a = x[0], b = x[1], c = x[2], d = x[3];
|
|
124
|
-
a = this.ff(a, b, c, d, k[0], 7, -680876936);
|
|
125
|
-
d = this.ff(d, a, b, c, k[1], 12, -389564586);
|
|
126
|
-
c = this.ff(c, d, a, b, k[2], 17, 606105819);
|
|
127
|
-
b = this.ff(b, c, d, a, k[3], 22, -1044525330);
|
|
128
|
-
a = this.ff(a, b, c, d, k[4], 7, -176418897);
|
|
129
|
-
d = this.ff(d, a, b, c, k[5], 12, 1200080426);
|
|
130
|
-
c = this.ff(c, d, a, b, k[6], 17, -1473231341);
|
|
131
|
-
b = this.ff(b, c, d, a, k[7], 22, -45705983);
|
|
132
|
-
a = this.ff(a, b, c, d, k[8], 7, 1770035416);
|
|
133
|
-
d = this.ff(d, a, b, c, k[9], 12, -1958414417);
|
|
134
|
-
c = this.ff(c, d, a, b, k[10], 17, -42063);
|
|
135
|
-
b = this.ff(b, c, d, a, k[11], 22, -1990404162);
|
|
136
|
-
a = this.ff(a, b, c, d, k[12], 7, 1804603682);
|
|
137
|
-
d = this.ff(d, a, b, c, k[13], 12, -40341101);
|
|
138
|
-
c = this.ff(c, d, a, b, k[14], 17, -1502002290);
|
|
139
|
-
b = this.ff(b, c, d, a, k[15], 22, 1236535329);
|
|
140
|
-
a = this.gg(a, b, c, d, k[1], 5, -165796510);
|
|
141
|
-
d = this.gg(d, a, b, c, k[6], 9, -1069501632);
|
|
142
|
-
c = this.gg(c, d, a, b, k[11], 14, 643717713);
|
|
143
|
-
b = this.gg(b, c, d, a, k[0], 20, -373897302);
|
|
144
|
-
a = this.gg(a, b, c, d, k[5], 5, -701558691);
|
|
145
|
-
d = this.gg(d, a, b, c, k[10], 9, 38016083);
|
|
146
|
-
c = this.gg(c, d, a, b, k[15], 14, -660478335);
|
|
147
|
-
b = this.gg(b, c, d, a, k[4], 20, -405537848);
|
|
148
|
-
a = this.gg(a, b, c, d, k[9], 5, 568446438);
|
|
149
|
-
d = this.gg(d, a, b, c, k[14], 9, -1019803690);
|
|
150
|
-
c = this.gg(c, d, a, b, k[3], 14, -187363961);
|
|
151
|
-
b = this.gg(b, c, d, a, k[8], 20, 1163531501);
|
|
152
|
-
a = this.gg(a, b, c, d, k[13], 5, -1444681467);
|
|
153
|
-
d = this.gg(d, a, b, c, k[2], 9, -51403784);
|
|
154
|
-
c = this.gg(c, d, a, b, k[7], 14, 1735328473);
|
|
155
|
-
b = this.gg(b, c, d, a, k[12], 20, -1926607734);
|
|
156
|
-
a = this.hh(a, b, c, d, k[5], 4, -378558);
|
|
157
|
-
d = this.hh(d, a, b, c, k[8], 11, -2022574463);
|
|
158
|
-
c = this.hh(c, d, a, b, k[11], 16, 1839030562);
|
|
159
|
-
b = this.hh(b, c, d, a, k[14], 23, -35309556);
|
|
160
|
-
a = this.hh(a, b, c, d, k[1], 4, -1530992060);
|
|
161
|
-
d = this.hh(d, a, b, c, k[4], 11, 1272893353);
|
|
162
|
-
c = this.hh(c, d, a, b, k[7], 16, -155497632);
|
|
163
|
-
b = this.hh(b, c, d, a, k[10], 23, -1094730640);
|
|
164
|
-
a = this.hh(a, b, c, d, k[13], 4, 681279174);
|
|
165
|
-
d = this.hh(d, a, b, c, k[0], 11, -358537222);
|
|
166
|
-
c = this.hh(c, d, a, b, k[3], 16, -722521979);
|
|
167
|
-
b = this.hh(b, c, d, a, k[6], 23, 76029189);
|
|
168
|
-
a = this.hh(a, b, c, d, k[9], 4, -640364487);
|
|
169
|
-
d = this.hh(d, a, b, c, k[12], 11, -421815835);
|
|
170
|
-
c = this.hh(c, d, a, b, k[15], 16, 530742520);
|
|
171
|
-
b = this.hh(b, c, d, a, k[2], 23, -995338651);
|
|
172
|
-
a = this.ii(a, b, c, d, k[0], 6, -198630844);
|
|
173
|
-
d = this.ii(d, a, b, c, k[7], 10, 1126891415);
|
|
174
|
-
c = this.ii(c, d, a, b, k[14], 15, -1416354905);
|
|
175
|
-
b = this.ii(b, c, d, a, k[5], 21, -57434055);
|
|
176
|
-
a = this.ii(a, b, c, d, k[12], 6, 1700485571);
|
|
177
|
-
d = this.ii(d, a, b, c, k[3], 10, -1894986606);
|
|
178
|
-
c = this.ii(c, d, a, b, k[10], 15, -1051523);
|
|
179
|
-
b = this.ii(b, c, d, a, k[1], 21, -2054922799);
|
|
180
|
-
a = this.ii(a, b, c, d, k[8], 6, 1873313359);
|
|
181
|
-
d = this.ii(d, a, b, c, k[15], 10, -30611744);
|
|
182
|
-
c = this.ii(c, d, a, b, k[6], 15, -1560198380);
|
|
183
|
-
b = this.ii(b, c, d, a, k[13], 21, 1309151649);
|
|
184
|
-
a = this.ii(a, b, c, d, k[4], 6, -145523070);
|
|
185
|
-
d = this.ii(d, a, b, c, k[11], 10, -1120210379);
|
|
186
|
-
c = this.ii(c, d, a, b, k[2], 15, 718787259);
|
|
187
|
-
b = this.ii(b, c, d, a, k[9], 21, -343485551);
|
|
188
|
-
x[0] = this.add32(a, x[0]);
|
|
189
|
-
x[1] = this.add32(b, x[1]);
|
|
190
|
-
x[2] = this.add32(c, x[2]);
|
|
191
|
-
x[3] = this.add32(d, x[3]);
|
|
192
|
-
}
|
|
193
|
-
/**
|
|
194
|
-
* @ignore
|
|
195
|
-
*
|
|
196
|
-
* Metodo di utilità per il calcolo dell'md5
|
|
197
|
-
*/
|
|
198
|
-
cmn(q, a, b, x, s, t) {
|
|
199
|
-
a = this.add32(this.add32(a, q), this.add32(x, t));
|
|
200
|
-
return this.add32((a << s) | (a >>> (32 - s)), b);
|
|
201
|
-
}
|
|
202
|
-
/**
|
|
203
|
-
* @ignore
|
|
204
|
-
*
|
|
205
|
-
* Metodo di utilità per il calcolo dell'md5
|
|
206
|
-
*/
|
|
207
|
-
ff(a, b, c, d, x, s, t) {
|
|
208
|
-
return this.cmn((b & c) | ((~b) & d), a, b, x, s, t);
|
|
209
|
-
}
|
|
210
|
-
/**
|
|
211
|
-
* @ignore
|
|
212
|
-
*
|
|
213
|
-
* Metodo di utilità per il calcolo dell'md5
|
|
214
|
-
*/
|
|
215
|
-
gg(a, b, c, d, x, s, t) {
|
|
216
|
-
return this.cmn((b & d) | (c & (~d)), a, b, x, s, t);
|
|
217
|
-
}
|
|
218
|
-
/**
|
|
219
|
-
* @ignore
|
|
220
|
-
*
|
|
221
|
-
* Metodo di utilità per il calcolo dell'md5
|
|
222
|
-
*/
|
|
223
|
-
hh(a, b, c, d, x, s, t) {
|
|
224
|
-
return this.cmn(b ^ c ^ d, a, b, x, s, t);
|
|
225
|
-
}
|
|
226
|
-
/**
|
|
227
|
-
* @ignore
|
|
228
|
-
*
|
|
229
|
-
* Metodo di utilità per il calcolo dell'md5
|
|
230
|
-
*/
|
|
231
|
-
ii(a, b, c, d, x, s, t) {
|
|
232
|
-
return this.cmn(c ^ (b | (~d)), a, b, x, s, t);
|
|
233
|
-
}
|
|
234
|
-
/**
|
|
235
|
-
* @ignore
|
|
236
|
-
*
|
|
237
|
-
* Metodo di utilità per il calcolo dell'md5
|
|
238
|
-
*/
|
|
239
|
-
md51(s) {
|
|
240
|
-
var n = s.length, state = [1732584193, -271733879, -1732584194, 271733878], i;
|
|
241
|
-
for (i = 64; i <= s.length; i += 64)
|
|
242
|
-
this.md5cycle(state, this.md5blk(s.substring(i - 64, i)));
|
|
243
|
-
s = s.substring(i - 64);
|
|
244
|
-
var tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
|
|
245
|
-
for (i = 0; i < s.length; i++)
|
|
246
|
-
tail[i >> 2] |= s.charCodeAt(i) << ((i % 4) << 3);
|
|
247
|
-
tail[i >> 2] |= 0x80 << ((i % 4) << 3);
|
|
248
|
-
if (i > 55) {
|
|
249
|
-
this.md5cycle(state, tail);
|
|
250
|
-
for (i = 0; i < 16; i++)
|
|
251
|
-
tail[i] = 0;
|
|
252
|
-
}
|
|
253
|
-
tail[14] = n * 8;
|
|
254
|
-
this.md5cycle(state, tail);
|
|
255
|
-
return state;
|
|
256
|
-
}
|
|
257
|
-
/**
|
|
258
|
-
* @ignore
|
|
259
|
-
*
|
|
260
|
-
* Metodo di utilità per il calcolo dell'md5
|
|
261
|
-
*/
|
|
262
|
-
md5blk(s) {
|
|
263
|
-
var md5blks = [], i;
|
|
264
|
-
for (i = 0; i < 64; i += 4)
|
|
265
|
-
md5blks[i >> 2] = s.charCodeAt(i) + (s.charCodeAt(i + 1) << 8) + (s.charCodeAt(i + 2) << 16) + (s.charCodeAt(i + 3) << 24);
|
|
266
|
-
return md5blks;
|
|
267
|
-
}
|
|
268
|
-
/**
|
|
269
|
-
* Array dei possibili valori di un simbolo esadecimale
|
|
270
|
-
*/
|
|
271
|
-
hex_chr = '0123456789abcdef'.split('');
|
|
272
|
-
/**
|
|
273
|
-
* @ignore
|
|
274
|
-
*
|
|
275
|
-
* Metodo di utilità per il calcolo dell'md5
|
|
276
|
-
*/
|
|
277
|
-
rhex(n) {
|
|
278
|
-
var s = '', j = 0;
|
|
279
|
-
for (; j < 4; j++)
|
|
280
|
-
s += this.hex_chr[(n >> (j * 8 + 4)) & 0x0F] + this.hex_chr[(n >> (j * 8)) & 0x0F];
|
|
281
|
-
return s;
|
|
282
|
-
}
|
|
283
|
-
/**
|
|
284
|
-
* @ignore
|
|
285
|
-
*
|
|
286
|
-
* Metodo di utilità per il calcolo dell'md5
|
|
287
|
-
*/
|
|
288
|
-
hex(x) {
|
|
289
|
-
for (var i = 0; i < x.length; i++)
|
|
290
|
-
x[i] = this.rhex(x[i]);
|
|
291
|
-
return x.join('');
|
|
292
|
-
}
|
|
293
|
-
/**
|
|
294
|
-
* @ignore
|
|
295
|
-
*
|
|
296
|
-
* Metodo di utilità per il calcolo dell'md5
|
|
297
|
-
*/
|
|
298
|
-
add32(a, b) {
|
|
299
|
-
return (a + b) & 0xFFFFFFFF;
|
|
300
|
-
}
|
|
301
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HashingService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
302
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HashingService, providedIn: "root" });
|
|
303
|
-
}
|
|
304
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HashingService, decorators: [{
|
|
305
|
-
type: Injectable,
|
|
306
|
-
args: [{ providedIn: "root" }]
|
|
307
|
-
}] });
|
|
308
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0ZW5zaW9ucy5oYXNoaW5nLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9leHRlbnNpb25zL3NyYy9saWIvc2VydmljZXMvZXh0ZW5zaW9ucy5oYXNoaW5nLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsVUFBVTtBQUNWLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBRTNDOztHQUVHO0FBRUgsTUFBTSxPQUFPLGNBQWM7SUFFdkI7Ozs7T0FJRztJQUNJLE9BQU87UUFDVixPQUFPLHNDQUFzQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUU7WUFDL0QsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQ25FLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMxQixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNJLFVBQVUsQ0FBQyxDQUFNLEVBQUUsUUFBZ0IsQ0FBQyxFQUFFLG9CQUE2QixLQUFLLEVBQUUsVUFBbUIsS0FBSztRQUNyRyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUN6RCxJQUFJLElBQUksR0FBVyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEUsT0FBTyxJQUFJLENBQUM7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LENBQUMsQ0FBQztRQUM3QyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQy9DLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0MsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDOUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMvQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzdDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDL0MsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hELENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzlDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDOUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNoRCxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUUvQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzdDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDOUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDOUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM5QyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzdDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzVDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDL0MsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM5QyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUM1QyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQy9DLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDOUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDOUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMvQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzVDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzlDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFaEQsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQy9DLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQy9DLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDOUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM5QyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUM5QyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzlDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEQsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDN0MsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM5QyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzlDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzVDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0MsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMvQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUM5QyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRTlDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0MsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDOUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNoRCxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzlDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDL0MsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM3QyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQy9DLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzdDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDOUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMvQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMvQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzdDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEQsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDN0MsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUU5QyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3hCLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkQsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUMxQixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDMUIsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQzFCLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUMxQixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLElBQUksQ0FBQyxDQUFTO1FBQ2xCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUU5RSxLQUFLLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUU7WUFDL0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxD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QyxDQUFDO0lBQ2IsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxHQUFHLENBQUMsQ0FBQztRQUNULEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtZQUM3QixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDdEIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDZCxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQztJQUNoQyxDQUFDO3dHQXRUUSxjQUFjOzRHQUFkLGNBQWMsY0FERixNQUFNOzs0RkFDbEIsY0FBYztrQkFEMUIsVUFBVTttQkFBQyxFQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBbmd1bGFyXHJcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuLyoqXHJcbiAqIFNlcnZpY2UgY2hlIGZvcm5pc2NlIGFsY3VuaSBzZW1wbGljaSBmdW56aW9uaSBkaSBIYXNoaW5nIC8gR1VJRCAvIGVjYy4uLlxyXG4gKi9cclxuQEluamVjdGFibGUoe3Byb3ZpZGVkSW46IFwicm9vdFwifSlcclxuZXhwb3J0IGNsYXNzIEhhc2hpbmdTZXJ2aWNlIHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdlbmVyYXppb25lIGRpIHVuIEdVSUQgcHNldWRvLXVuaXZvY29cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge3N0cmluZ30gaWwgR1VJRCBnZW5lcmF0b1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0R1VJRCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBcInh4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eFwiLnJlcGxhY2UoL1t4eV0vZywgYyA9PiB7XHJcbiAgICAgICAgICAgIHZhciByID0gTWF0aC5yYW5kb20oKSAqIDE2IHwgMCwgdiA9IGMgPT0gXCJ4XCIgPyByIDogKHIgJiAweDMgfCAweDgpO1xyXG4gICAgICAgICAgICByZXR1cm4gdi50b1N0cmluZygxNik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjb2xvIGRlbGwnaGFzaCBzdSB1biBvZ2dldHRvXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7YW55fSBvIE9nZ2V0dG8gZGkgY3VpIGNhbGNvbGFyZSBsJ2hhc2hcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsZXZlbCBMaXZlbGxvIGRpIHJpY29yc2lvbmUgbmVsIGNhc28gdmVuZ2EgZWZmZXR0dWF0byBsJ2hhc2ggZGkgdW4gb2dnZXR0byBjaGUgY29udGllbmUgYWx0cmkgb2dnZXR0aVxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBuYXZpZ2F0ZUZ1bGxEZXB0aCBJbmRpY2Egc2UgbmF2aWdhcmUgbCdvZ2dldHRvIHBlciBsJ2ludGVyYSBsdW5naGV6emEuIEluIGNhc28gY29udHJhcmlvIHNpIGZlcm1hIGFsIHNlY29uZG8gbGl2ZWxsb1xyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBIYXNoIGdlbmVyYXRvIHBlciBsJ29nZ2V0dG8gaW4gcXVlc3Rpb25lXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBoYXNoT2JqZWN0KG86IGFueSwgbGV2ZWw6IG51bWJlciA9IDAsIG5hdmlnYXRlRnVsbERlcHRoOiBib29sZWFuID0gZmFsc2UsIHByZWNpc2U6IGJvb2xlYW4gPSBmYWxzZSk6IHN0cmluZyB7XHJcbiAgICAgICAgdmFyIHN0ckRlZiA9IHRoaXMuc3RyaW5naWZ5KG8sIGxldmVsLCBuYXZpZ2F0ZUZ1bGxEZXB0aCk7XHJcbiAgICAgICAgdmFyIGhhc2g6IHN0cmluZyA9IHByZWNpc2UgPyB0aGlzLm1kNShzdHJEZWYpIDogdGhpcy5zaW1wbGVIYXNoKHN0ckRlZik7XHJcbiAgICAgICAgcmV0dXJuIGhhc2g7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIYXNoIHBpw7kgc2VtcGxpY2UgZSBwacO5IHZlbG9jZSBkZWxsJ21kNSwgbWEgbWVubyBzaWN1cm9cclxuICAgICAqIFxyXG4gICAgICogVmVkaSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy83NjE2NDYxL2dlbmVyYXRlLWEtaGFzaC1mcm9tLXN0cmluZy1pbi1qYXZhc2NyaXB0XHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN0ciBTdHJpbmdhIGRpIGN1aSBjYWxjb2xhcmUgbCdoYXNoXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgc2ltcGxlSGFzaChzdHI6IHN0cmluZywgc2VlZCA9IDApOiBzdHJpbmcge1xyXG4gICAgICAgIGxldCBoMSA9IDB4ZGVhZGJlZWYgXiBzZWVkLCBoMiA9IDB4NDFjNmNlNTcgXiBzZWVkO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBjaDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjaCA9IHN0ci5jaGFyQ29kZUF0KGkpO1xyXG4gICAgICAgICAgICBoMSA9IE1hdGguaW11bChoMSBeIGNoLCAyNjU0NDM1NzYxKTtcclxuICAgICAgICAgICAgaDIgPSBNYXRoLmltdWwoaDIgXiBjaCwgMTU5NzMzNDY3Nyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGgxID0gTWF0aC5pbXVsKGgxIF4gKGgxPj4+MTYpLCAyMjQ2ODIyNTA3KSBeIE1hdGguaW11bChoMiBeIChoMj4+PjEzKSwgMzI2NjQ4OTkwOSk7XHJcbiAgICAgICAgaDIgPSBNYXRoLmltdWwoaDIgXiAoaDI+Pj4xNiksIDIyNDY4MjI1MDcpIF4gTWF0aC5pbXVsKGgxIF4gKGgxPj4+MTMpLCAzMjY2NDg5OTA5KTtcclxuICAgICAgICByZXR1cm4gKDQyOTQ5NjcyOTYgKiAoMjA5NzE1MSAmIGgyKSArIChoMT4+PjApKS50b1N0cmluZygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQmxhY2tsaXN0IGRlaSB0aXBpIGRhIGlnbm9yYXJlIHF1YW5kbyBzaSBlZmZldHR1YSBsJ2hhc2hpbmcgZGVnbGkgb2dnZXR0aVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIG9iakJsYWNrbGlzdCA9IHtcclxuICAgICAgICBcIk5nRm9ybVwiOiB0cnVlLCBcIkVsZW1lbnRSZWZcIjogdHJ1ZSwgXCJFeHRlbnNpb25zU2VydmljZVwiOiB0cnVlLCBcIlRvYXN0clNlcnZpY2VcIjogdHJ1ZSwgXCJMb2NhbGVTZXJ2aWNlXCI6IHRydWUsIFwiQXBwU3RhdGVcIjogdHJ1ZSwgXCJSb3V0ZXJcIjogdHJ1ZSxcclxuICAgICAgICBcIkFjdGl2YXRlZFJvdXRlXCI6IHRydWUsIFwiSFRUUFNlcnZpY2VcIjogdHJ1ZSwgXCJMb2NhdGlvblwiOiB0cnVlLCBcIkNhbnZhc0NvbXBvbmVudFwiOiB0cnVlLCBcIk1vZGFsRGlyZWN0aXZlXCI6IHRydWUsIFwiQ2hhbmdlRGV0ZWN0b3JSZWZcIjogdHJ1ZSxcclxuICAgICAgICBcIkRhdGVTZXJ2aWNlXCI6IHRydWUsIFwiRXZlbnRFbWl0dGVyXCI6IHRydWUsIFwiVmlld1JlZl9cIjogdHJ1ZSwgXCJTdWJzY3JpYmVyXCI6IHRydWUsIFwiSXRlbUxvY2FsaXphdGlvblwiOiB0cnVlXHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2VuZXJhIHVuYSBzdHJpbmdhIGNoZSBpZGVudGlmaWNhIHVuaXZvY2FtZW50ZSBsJ29nZ2V0dG8gaW4gcXVlc3Rpb25lXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7YW55fSBvIE9nZ2V0dG8gZGkgY3VpIGNhbGNvbGFyZSBsYSBzdHJpbmdhIHVuaXZvY2FcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsZXZlbCBMaXZlbGxvIGRpIHJpY29yc2lvbmUgbmVsIGNhc28gdmVuZ2EgZWZmZXR0dWF0byBsJ2hhc2ggZGkgdW4gb2dnZXR0byBjaGUgY29udGllbmUgYWx0cmkgb2dnZXR0aVxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBuYXZpZ2F0ZUZ1bGxEZXB0aCBJbmRpY2Egc2UgbmF2aWdhcmUgbCdvZ2dldHRvIHBlciBsJ2ludGVyYSBsdW5naGV6emEuIEluIGNhc28gY29udHJhcmlvIHNpIGZlcm1hIGFsIHNlY29uZG8gbGl2ZWxsb1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHN0cmluZ2lmeShvOiBhbnksIGxldmVsOiBudW1iZXIsIG5hdmlnYXRlRnVsbERlcHRoOiBib29sZWFuKSB7XHJcbiAgICAgICAgdmFyIGk6IGFueSwgcjogYW55O1xyXG4gICAgICAgIGlmIChvID09PSBudWxsKSByZXR1cm4gXCJuXCI7XHJcbiAgICAgICAgaWYgKG8gPT09IHRydWUpIHJldHVybiBcInRcIjtcclxuICAgICAgICBpZiAobyA9PT0gZmFsc2UpIHJldHVybiBcImZcIjtcclxuICAgICAgICBpZiAobyBpbnN0YW5jZW9mIERhdGUpIHJldHVybiAnZDonKyBvLnZhbHVlT2YoKS50b1N0cmluZygpO1xyXG4gICAgICAgIGkgPSB0eXBlb2YgbztcclxuICAgICAgICBpZiAoaSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIFwiczpcIiArIG87XHJcbiAgICAgICAgaWYgKGkgPT09IFwibnVtYmVyXCIpIHJldHVybiBcIm46XCIgKyBvO1xyXG4gICAgICAgIGlmIChvIGluc3RhbmNlb2YgRnVuY3Rpb24pIHJldHVybiBcIm06XCIgKyBvLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICAgICAgICByID0gW107XHJcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgcmVzID0gdGhpcy5zdHJpbmdpZnkob1tpXSwgbGV2ZWwsIG5hdmlnYXRlRnVsbERlcHRoKTtcclxuICAgICAgICAgICAgICAgIGlmIChyZXMpIHIucHVzaChyZXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByLmxlbmd0aCA+IDAgPyBcImE6XCIgKyByLmpvaW4oXCI7XCIpIDogXCJcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgciA9IFtdO1xyXG5cclxuICAgICAgICAvL1NlIMOoIG9nZ2V0dG8sIGVzY2x1ZG8gdHV0dGkgcXVlbGxpIGRpIHNpc3RlbWEvaW51dGlsaVxyXG4gICAgICAgIGlmIChvKSB7XHJcbiAgICAgICAgICAgIHZhciBuYW1lID0gby5fX3Byb3RvX18uY29uc3RydWN0b3IubmFtZTtcclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5vYmpCbGFja2xpc3RbbmFtZV0pIHtcclxuICAgICAgICAgICAgICAgIGZvciAoaSBpbiBvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG8uaGFzT3duUHJvcGVydHkoaSkgJiYgKGxldmVsIDw9IDIgfHwgbmF2aWdhdGVGdWxsRGVwdGgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXMgPSB0aGlzLnN0cmluZ2lmeShvW2ldLCBsZXZlbCArIDEsIG5hdmlnYXRlRnVsbERlcHRoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcykgci5wdXNoKGkgKyBcIjpcIiArIHJlcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByLmxlbmd0aCA+IDAgPyBcIm86XCIgKyByLmpvaW4oXCI7XCIpIDogXCJcIjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERhdGEgdW5hIHN0cmluZ2EgcmVzdGl0dWlzY2UgbCdtZDVcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHMgU3RyaW5nYSBkaSBjdWkgY2FsY29sYXJlIGwnbWQ1XHJcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBtZDUgZGVsbGEgc3RyaW5nYSAqKnMqKlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbWQ1KHM6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaGV4KHRoaXMubWQ1MShzKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaWdub3JlXHJcbiAgICAgKiBcclxuICAgICAqIE1ldG9kbyBkaSB1dGlsaXTDoCBwZXIgaWwgY2FsY29sbyBkZWxsJ21kNVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIG1kNWN5Y2xlKHgsIGspIHtcclxuICAgICAgICB2YXIgYSA9IHhbMF0sIGIgPSB4WzFdLCBjID0geFsyXSwgZCA9IHhbM107XHJcblxyXG4gICAgICAgIGEgPSB0aGlzLmZmKGEsIGIsIGMsIGQsIGtbMF0sIDcsIC02ODA4NzY5MzYpO1xyXG4gICAgICAgIGQgPSB0aGlzLmZmKGQsIGEsIGIsIGMsIGtbMV0sIDEyLCAtMzg5NTY0NTg2KTtcclxuICAgICAgICBjID0gdGhpcy5mZihjLCBkLCBhLCBiLCBrWzJdLCAxNywgNjA2MTA1ODE5KTtcclxuICAgICAgICBiID0gdGhpcy5mZihiLCBjLCBkLCBhLCBrWzNdLCAyMiwgLTEwNDQ1MjUzMzApO1xyXG4gICAgICAgIGEgPSB0aGlzLmZmKGEsIGIsIGMsIGQsIGtbNF0sIDcsIC0xNzY0MTg4OTcpO1xyXG4gICAgICAgIGQgPSB0aGlzLmZmKGQsIGEsIGIsIGMsIGtbNV0sIDEyLCAxMjAwMDgwNDI2KTtcclxuICAgICAgICBjID0gdGhpcy5mZihjLCBkLCBhLCBiLCBrWzZdLCAxNywgLTE0NzMyMzEzNDEpO1xyXG4gICAgICAgIGIgPSB0aGlzLmZmKGIsIGMsIGQsIGEsIGtbN10sIDIyLCAtNDU3MDU5ODMpO1xyXG4gICAgICAgIGEgPSB0aGlzLmZmKGEsIGIsIGMsIGQsIGtbOF0sIDcsIDE3NzAwMzU0MTYpO1xyXG4gICAgICAgIGQgPSB0aGlzLmZmKGQsIGEsIGIsIGMsIGtbOV0sIDEyLCAtMTk1ODQxNDQxNyk7XHJcbiAgICAgICAgYyA9IHRoaXMuZmYoYywgZCwgYSwgYiwga1sxMF0sIDE3LCAtNDIwNjMpO1xyXG4gICAgICAgIGIgPSB0aGlzLmZmKGIsIGMsIGQsIGEsIGtbMTFdLCAyMiwgLTE5OTA0MDQxNjIpO1xyXG4gICAgICAgIGEgPSB0aGlzLmZmKGEsIGIsIGMsIGQsIGtbMTJdLCA3LCAxODA0NjAzNjgyKTtcclxuICAgICAgICBkID0gdGhpcy5mZihkLCBhLCBiLCBjLCBrWzEzXSwgMTIsIC00MDM0MTEwMSk7XHJcbiAgICAgICAgYyA9IHRoaXMuZmYoYywgZCwgYSwgYiwga1sxNF0sIDE3LCAtMTUwMjAwMjI5MCk7XHJcbiAgICAgICAgYiA9IHRoaXMuZmYoYiwgYywgZCwgYSwga1sxNV0sIDIyLCAxMjM2NTM1MzI5KTtcclxuXHJcbiAgICAgICAgYSA9IHRoaXMuZ2coYSwgYiwgYywgZCwga1sxXSwgNSwgLTE2NTc5NjUxMCk7XHJcbiAgICAgICAgZCA9IHRoaXMuZ2coZCwgYSwgYiwgYywga1s2XSwgOSwgLTEwNjk1MDE2MzIpO1xyXG4gICAgICAgIGMgPSB0aGlzLmdnKGMsIGQsIGEsIGIsIGtbMTFdLCAxNCwgNjQzNzE3NzEzKTtcclxuICAgICAgICBiID0gdGhpcy5nZyhiLCBjLCBkLCBhLCBrWzBdLCAyMCwgLTM3Mzg5NzMwMik7XHJcbiAgICAgICAgYSA9IHRoaXMuZ2coYSwgYiwgYywgZCwga1s1XSwgNSwgLTcwMTU1ODY5MSk7XHJcbiAgICAgICAgZCA9IHRoaXMuZ2coZCwgYSwgYiwgYywga1sxMF0sIDksIDM4MDE2MDgzKTtcclxuICAgICAgICBjID0gdGhpcy5nZyhjLCBkLCBhLCBiLCBrWzE1XSwgMTQsIC02NjA0NzgzMzUpO1xyXG4gICAgICAgIGIgPSB0aGlzLmdnKGIsIGMsIGQsIGEsIGtbNF0sIDIwLCAtNDA1NTM3ODQ4KTtcclxuICAgICAgICBhID0gdGhpcy5nZyhhLCBiLCBjLCBkLCBrWzldLCA1LCA1Njg0NDY0MzgpO1xyXG4gICAgICAgIGQgPSB0aGlzLmdnKGQsIGEsIGIsIGMsIGtbMTRdLCA5LCAtMTAxOTgwMzY5MCk7XHJcbiAgICAgICAgYyA9IHRoaXMuZ2coYywgZCwgYSwgYiwga1szXSwgMTQsIC0xODczNjM5NjEpO1xyXG4gICAgICAgIGIgPSB0aGlzLmdnKGIsIGMsIGQsIGEsIGtbOF0sIDIwLCAxMTYzNTMxNTAxKTtcclxuICAgICAgICBhID0gdGhpcy5nZyhhLCBiLCBjLCBkLCBrWzEzXSwgNSwgLTE0NDQ2ODE0NjcpO1xyXG4gICAgICAgIGQgPSB0aGlzLmdnKGQsIGEsIGIsIGMsIGtbMl0sIDksIC01MTQwMzc4NCk7XHJcbiAgICAgICAgYyA9IHRoaXMuZ2coYywgZCwgYSwgYiwga1s3XSwgMTQsIDE3MzUzMjg0NzMpO1xyXG4gICAgICAgIGIgPSB0aGlzLmdnKGIsIGMsIGQsIGEsIGtbMTJdLCAyMCwgLTE5MjY2MDc3MzQpO1xyXG5cclxuICAgICAgICBhID0gdGhpcy5oaChhLCBiLCBjLCBkLCBrWzVdLCA0LCAtMzc4NTU4KTtcclxuICAgICAgICBkID0gdGhpcy5oaChkLCBhLCBiLCBjLCBrWzhdLCAxMSwgLTIwMjI1NzQ0NjMpO1xyXG4gICAgICAgIGMgPSB0aGlzLmhoKGMsIGQsIGEsIGIsIGtbMTFdLCAxNiwgMTgzOTAzMDU2Mik7XHJcbiAgICAgICAgYiA9IHRoaXMuaGgoYiwgYywgZCwgYSwga1sxNF0sIDIzLCAtMzUzMDk1NTYpO1xyXG4gICAgICAgIGEgPSB0aGlzLmhoKGEsIGIsIGMsIGQsIGtbMV0sIDQsIC0xNTMwOTkyMDYwKTtcclxuICAgICAgICBkID0gdGhpcy5oaChkLCBhLCBiLCBjLCBrWzRdLCAxMSwgMTI3Mjg5MzM1Myk7XHJcbiAgICAgICAgYyA9IHRoaXMuaGgoYywgZCwgYSwgYiwga1s3XSwgMTYsIC0xNTU0OTc2MzIpO1xyXG4gICAgICAgIGIgPSB0aGlzLmhoKGIsIGMsIGQsIGEsIGtbMTBdLCAyMywgLTEwOTQ3MzA2NDApO1xyXG4gICAgICAgIGEgPSB0aGlzLmhoKGEsIGIsIGMsIGQsIGtbMTNdLCA0LCA2ODEyNzkxNzQpO1xyXG4gICAgICAgIGQgPSB0aGlzLmhoKGQsIGEsIGIsIGMsIGtbMF0sIDExLCAtMzU4NTM3MjIyKTtcclxuICAgICAgICBjID0gdGhpcy5oaChjLCBkLCBhLCBiLCBrWzNdLCAxNiwgLTcyMjUyMTk3OSk7XHJcbiAgICAgICAgYiA9IHRoaXMuaGgoYiwgYywgZCwgYSwga1s2XSwgMjMsIDc2MDI5MTg5KTtcclxuICAgICAgICBhID0gdGhpcy5oaChhLCBiLCBjLCBkLCBrWzldLCA0LCAtNjQwMzY0NDg3KTtcclxuICAgICAgICBkID0gdGhpcy5oaChkLCBhLCBiLCBjLCBrWzEyXSwgMTEsIC00MjE4MTU4MzUpO1xyXG4gICAgICAgIGMgPSB0aGlzLmhoKGMsIGQsIGEsIGIsIGtbMTVdLCAxNiwgNTMwNzQyNTIwKTtcclxuICAgICAgICBiID0gdGhpcy5oaChiLCBjLCBkLCBhLCBrWzJdLCAyMywgLTk5NTMzODY1MSk7XHJcblxyXG4gICAgICAgIGEgPSB0aGlzLmlpKGEsIGIsIGMsIGQsIGtbMF0sIDYsIC0xOTg2MzA4NDQpO1xyXG4gICAgICAgIGQgPSB0aGlzLmlpKGQsIGEsIGIsIGMsIGtbN10sIDEwLCAxMTI2ODkxNDE1KTtcclxuICAgICAgICBjID0gdGhpcy5paShjLCBkLCBhLCBiLCBrWzE0XSwgMTUsIC0xNDE2MzU0OTA1KTtcclxuICAgICAgICBiID0gdGhpcy5paShiLCBjLCBkLCBhLCBrWzVdLCAyMSwgLTU3NDM0MDU1KTtcclxuICAgICAgICBhID0gdGhpcy5paShhLCBiLCBjLCBkLCBrWzEyXSwgNiwgMTcwMDQ4NTU3MSk7XHJcbiAgICAgICAgZCA9IHRoaXMuaWkoZCwgYSwgYiwgYywga1szXSwgMTAsIC0xODk0OTg2NjA2KTtcclxuICAgICAgICBjID0gdGhpcy5paShjLCBkLCBhLCBiLCBrWzEwXSwgMTUsIC0xMDUxNTIzKTtcclxuICAgICAgICBiID0gdGhpcy5paShiLCBjLCBkLCBhLCBrWzFdLCAyMSwgLTIwNTQ5MjI3OTkpO1xyXG4gICAgICAgIGEgPSB0aGlzLmlpKGEsIGIsIGMsIGQsIGtbOF0sIDYsIDE4NzMzMTMzNTkpO1xyXG4gICAgICAgIGQgPSB0aGlzLmlpKGQsIGEsIGIsIGMsIGtbMTVdLCAxMCwgLTMwNjExNzQ0KTtcclxuICAgICAgICBjID0gdGhpcy5paShjLCBkLCBhLCBiLCBrWzZdLCAxNSwgLTE1NjAxOTgzODApO1xyXG4gICAgICAgIGIgPSB0aGlzLmlpKGIsIGMsIGQsIGEsIGtbMTNdLCAyMSwgMTMwOTE1MTY0OSk7XHJcbiAgICAgICAgYSA9IHRoaXMuaWkoYSwgYiwgYywgZCwga1s0XSwgNiwgLTE0NTUyMzA3MCk7XHJcbiAgICAgICAgZCA9IHRoaXMuaWkoZCwgYSwgYiwgYywga1sxMV0sIDEwLCAtMTEyMDIxMDM3OSk7XHJcbiAgICAgICAgYyA9IHRoaXMuaWkoYywgZCwgYSwgYiwga1syXSwgMTUsIDcxODc4NzI1OSk7XHJcbiAgICAgICAgYiA9IHRoaXMuaWkoYiwgYywgZCwgYSwga1s5XSwgMjEsIC0zNDM0ODU1NTEpO1xyXG5cclxuICAgICAgICB4WzBdID0gdGhpcy5hZGQzMihhLCB4WzBdKTtcclxuICAgICAgICB4WzFdID0gdGhpcy5hZGQzMihiLCB4WzFdKTtcclxuICAgICAgICB4WzJdID0gdGhpcy5hZGQzMihjLCB4WzJdKTtcclxuICAgICAgICB4WzNdID0gdGhpcy5hZGQzMihkLCB4WzNdKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpZ25vcmVcclxuICAgICAqIFxyXG4gICAgICogTWV0b2RvIGRpIHV0aWxpdMOgIHBlciBpbCBjYWxjb2xvIGRlbGwnbWQ1XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY21uKHEsIGEsIGIsIHgsIHMsIHQpIHtcclxuICAgICAgICBhID0gdGhpcy5hZGQzMih0aGlzLmFkZDMyKGEsIHEpLCB0aGlzLmFkZDMyKHgsIHQpKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5hZGQzMigoYSA8PCBzKSB8IChhID4+PiAoMzIgLSBzKSksIGIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICogXHJcbiAgICAgKiBNZXRvZG8gZGkgdXRpbGl0w6AgcGVyIGlsIGNhbGNvbG8gZGVsbCdtZDVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBmZihhLCBiLCBjLCBkLCB4LCBzLCB0KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY21uKChiICYgYykgfCAoKH5iKSAmIGQpLCBhLCBiLCB4LCBzLCB0KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpZ25vcmVcclxuICAgICAqIFxyXG4gICAgICogTWV0b2RvIGRpIHV0aWxpdMOgIHBlciBpbCBjYWxjb2xvIGRlbGwnbWQ1XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2coYSwgYiwgYywgZCwgeCwgcywgdCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNtbigoYiAmIGQpIHwgKGMgJiAofmQpKSwgYSwgYiwgeCwgcywgdCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaWdub3JlXHJcbiAgICAgKiBcclxuICAgICAqIE1ldG9kbyBkaSB1dGlsaXTDoCBwZXIgaWwgY2FsY29sbyBkZWxsJ21kNVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGhoKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jbW4oYiBeIGMgXiBkLCBhLCBiLCB4LCBzLCB0KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpZ25vcmVcclxuICAgICAqIFxyXG4gICAgICogTWV0b2RvIGRpIHV0aWxpdMOgIHBlciBpbCBjYWxjb2xvIGRlbGwnbWQ1XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgaWkoYSwgYiwgYywgZCwgeCwgcywgdCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNtbihjIF4gKGIgfCAofmQpKSwgYSwgYiwgeCwgcywgdCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaWdub3JlXHJcbiAgICAgKiBcclxuICAgICAqIE1ldG9kbyBkaSB1dGlsaXTDoCBwZXIgaWwgY2FsY29sbyBkZWxsJ21kNVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIG1kNTEoczogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIG4gPSBzLmxlbmd0aCwgc3RhdGUgPSBbMTczMjU4NDE5MywgLTI3MTczMzg3OSwgLTE3MzI1ODQxOTQsIDI3MTczMzg3OF0sIGk7XHJcblxyXG4gICAgICAgIGZvciAoaSA9IDY0OyBpIDw9IHMubGVuZ3RoOyBpICs9IDY0KVxyXG4gICAgICAgICAgICB0aGlzLm1kNWN5Y2xlKHN0YXRlLCB0aGlzLm1kNWJsayhzLnN1YnN0cmluZyhpIC0gNjQsIGkpKSk7XHJcblxyXG4gICAgICAgIHMgPSBzLnN1YnN0cmluZyhpIC0gNjQpO1xyXG4gICAgICAgIHZhciB0YWlsID0gWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDBdO1xyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgICAgICB0YWlsW2kgPj4gMl0gfD0gcy5jaGFyQ29kZUF0KGkpIDw8ICgoaSAlIDQpIDw8IDMpO1xyXG4gICAgICAgIHRhaWxbaSA+PiAyXSB8PSAweDgwIDw8ICgoaSAlIDQpIDw8IDMpO1xyXG4gICAgICAgIGlmIChpID4gNTUpIHtcclxuICAgICAgICAgICAgdGhpcy5tZDVjeWNsZShzdGF0ZSwgdGFpbCk7XHJcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB0YWlsW2ldID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGFpbFsxNF0gPSBuICogODtcclxuICAgICAgICB0aGlzLm1kNWN5Y2xlKHN0YXRlLCB0YWlsKTtcclxuICAgICAgICByZXR1cm4gc3RhdGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaWdub3JlXHJcbiAgICAgKiBcclxuICAgICAqIE1ldG9kbyBkaSB1dGlsaXTDoCBwZXIgaWwgY2FsY29sbyBkZWxsJ21kNVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIG1kNWJsayhzKSB7XHJcbiAgICAgICAgdmFyIG1kNWJsa3MgPSBbXSwgaTtcclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkgKz0gNClcclxuICAgICAgICAgICAgbWQ1Ymxrc1tpID4+IDJdID0gcy5jaGFyQ29kZUF0KGkpICsgKHMuY2hhckNvZGVBdChpICsgMSkgPDwgOCkgKyAocy5jaGFyQ29kZUF0KGkgKyAyKSA8PCAxNikgKyAocy5jaGFyQ29kZUF0KGkgKyAzKSA8PCAyNCk7XHJcbiAgICAgICAgcmV0dXJuIG1kNWJsa3M7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBcnJheSBkZWkgcG9zc2liaWxpIHZhbG9yaSBkaSB1biBzaW1ib2xvIGVzYWRlY2ltYWxlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgaGV4X2Nocjogc3RyaW5nW10gPSAnMDEyMzQ1Njc4OWFiY2RlZicuc3BsaXQoJycpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICogXHJcbiAgICAgKiBNZXRvZG8gZGkgdXRpbGl0w6AgcGVyIGlsIGNhbGNvbG8gZGVsbCdtZDVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSByaGV4KG4pIHtcclxuICAgICAgICB2YXIgcyA9ICcnLCBqID0gMDtcclxuICAgICAgICBmb3IgKDsgaiA8IDQ7IGorKylcclxuICAgICAgICAgICAgcyArPSB0aGlzLmhleF9jaHJbKG4gPj4gKGogKiA4ICsgNCkpICYgMHgwRl0gKyB0aGlzLmhleF9jaHJbKG4gPj4gKGogKiA4KSkgJiAweDBGXTtcclxuICAgICAgICByZXR1cm4gcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpZ25vcmVcclxuICAgICAqIFxyXG4gICAgICogTWV0b2RvIGRpIHV0aWxpdMOgIHBlciBpbCBjYWxjb2xvIGRlbGwnbWQ1XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgaGV4KHgpIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHgubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgIHhbaV0gPSB0aGlzLnJoZXgoeFtpXSk7XHJcbiAgICAgICAgcmV0dXJuIHguam9pbignJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaWdub3JlXHJcbiAgICAgKiBcclxuICAgICAqIE1ldG9kbyBkaSB1dGlsaXTDoCBwZXIgaWwgY2FsY29sbyBkZWxsJ21kNVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGFkZDMyKGEsIGIpIHtcclxuICAgICAgICByZXR1cm4gKGEgKyBiKSAmIDB4RkZGRkZGRkY7XHJcbiAgICB9XHJcbn0iXX0=
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
// Angular
|
|
2
|
-
import { Injectable } from "@angular/core";
|
|
3
|
-
// Librerie
|
|
4
|
-
import { Subject } from "rxjs";
|
|
5
|
-
// Modelli
|
|
6
|
-
import { InterComMessage } from "../models/InterComMessage";
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
/** Service che si occupa di gestire la comunicazione fra i moduli interni ed esterni dell'applicativo */
|
|
9
|
-
export class InterComService {
|
|
10
|
-
/** Messaggi in uscita, uno per ogni recipient registratosi dall'entrypoint **register** */
|
|
11
|
-
outbounds = {};
|
|
12
|
-
/** Messaggi in entrata, unico per applicazione principale */
|
|
13
|
-
inbounds = new Subject();
|
|
14
|
-
/**
|
|
15
|
-
* Metodo che permette di inviare un messaggio dall'applicazione ad un modulo esterno o viceversa
|
|
16
|
-
*
|
|
17
|
-
* @param {any} messageType Tipologia di messaggio. Sarà di tipo **InboundMessageTypes** per tutti i messaggi inbound, dinamico per tutti i mesaggi outbound (il tipo dipenderà dagli enum dei messaggi dei moduli esterni)
|
|
18
|
-
* @param {any} message Messaggio da inviare che può essere un dto in casi complessi ma dovrà essere gestito a dovere lato implementativo
|
|
19
|
-
* @param {string} recipient Destinatario del messaggio. Per i messaggi inbound dev'essere lasciato vuoto, per i messaggi outbound sarà valorizzato alla chiave del modulo a cui si vuole inviare il messaggio
|
|
20
|
-
*/
|
|
21
|
-
send(messageType, message, recipient) {
|
|
22
|
-
let msg = new InterComMessage(messageType, message);
|
|
23
|
-
// Se non c'è un recipient significa che è un modulo esterno che invia messaggi al modulo main (quindi messaggio in entrata - inbound)
|
|
24
|
-
// Altrimenti significa che è il modulo main ad inviare messaggi ai moduli esterni (messaggio in uscita - outbound)
|
|
25
|
-
if (!recipient) {
|
|
26
|
-
this.inbounds.next(msg);
|
|
27
|
-
}
|
|
28
|
-
else {
|
|
29
|
-
if (!this.outbounds[recipient])
|
|
30
|
-
console.warn("@esfaenza/extensions - InterComService: Impossibile inviare il messaggio al recipient " + recipient + " assicurarsi che il modulo sia caricato e che effettui la chiamata al metodo 'regisster'");
|
|
31
|
-
else
|
|
32
|
-
this.outbounds[recipient].next(msg);
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Permette di registrare un modulo esterno alla lista dei moduli in listening sulla coda di messaggi
|
|
37
|
-
*
|
|
38
|
-
* @param {string} key Chiave del modulo da registrare. Tutti i messaggi inbound saranno inviati dall'applicazione principale su questa chiave
|
|
39
|
-
*/
|
|
40
|
-
register(key) {
|
|
41
|
-
if (this.outbounds[key])
|
|
42
|
-
throw "@esfaenza/extensions - InterComService: Impossibile registrare più volte lo stesso modulo";
|
|
43
|
-
this.outbounds[key] = new Subject();
|
|
44
|
-
}
|
|
45
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InterComService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
46
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InterComService, providedIn: "root" });
|
|
47
|
-
}
|
|
48
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InterComService, decorators: [{
|
|
49
|
-
type: Injectable,
|
|
50
|
-
args: [{ providedIn: "root" }]
|
|
51
|
-
}] });
|
|
52
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0ZW5zaW9ucy5pbnRlcmNvbS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXh0ZW5zaW9ucy9zcmMvbGliL3NlcnZpY2VzL2V4dGVuc2lvbnMuaW50ZXJjb20uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBQ1YsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxXQUFXO0FBQ1gsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUvQixVQUFVO0FBQ1YsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDOztBQUU1RCx5R0FBeUc7QUFFekcsTUFBTSxPQUFPLGVBQWU7SUFFeEIsMkZBQTJGO0lBQ3BGLFNBQVMsR0FBK0MsRUFBRSxDQUFDO0lBQ2xFLDZEQUE2RDtJQUN0RCxRQUFRLEdBQTZCLElBQUksT0FBTyxFQUFtQixDQUFDO0lBRTNFOzs7Ozs7T0FNRztJQUNJLElBQUksQ0FBQyxXQUFnQixFQUFFLE9BQVksRUFBRSxTQUFrQjtRQUMxRCxJQUFJLEdBQUcsR0FBRyxJQUFJLGVBQWUsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFcEQsc0lBQXNJO1FBQ3RJLG1IQUFtSDtRQUNuSCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDYixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM1QixDQUFDO2FBQ0ksQ0FBQztZQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQztnQkFDMUIsT0FBTyxDQUFDLElBQUksQ0FBQyx3RkFBd0YsR0FBRyxTQUFTLEdBQUcsMEZBQTBGLENBQUMsQ0FBQzs7Z0JBRWhOLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQzNDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLFFBQVEsQ0FBQyxHQUFXO1FBQ3ZCLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUM7WUFDbkIsTUFBTSwyRkFBMkYsQ0FBQztRQUN0RyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksT0FBTyxFQUFtQixDQUFDO0lBQ3pELENBQUM7d0dBdkNRLGVBQWU7NEdBQWYsZUFBZSxjQURILE1BQU07OzRGQUNsQixlQUFlO2tCQUQzQixVQUFVO21CQUFDLEVBQUMsVUFBVSxFQUFFLE1BQU0sRUFBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEFuZ3VsYXJcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcblxyXG4vLyBMaWJyZXJpZVxyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSBcInJ4anNcIjtcclxuXHJcbi8vIE1vZGVsbGlcclxuaW1wb3J0IHsgSW50ZXJDb21NZXNzYWdlIH0gZnJvbSBcIi4uL21vZGVscy9JbnRlckNvbU1lc3NhZ2VcIjtcclxuXHJcbi8qKiBTZXJ2aWNlIGNoZSBzaSBvY2N1cGEgZGkgZ2VzdGlyZSBsYSBjb211bmljYXppb25lIGZyYSBpIG1vZHVsaSBpbnRlcm5pIGVkIGVzdGVybmkgZGVsbCdhcHBsaWNhdGl2byAqL1xyXG5ASW5qZWN0YWJsZSh7cHJvdmlkZWRJbjogXCJyb290XCJ9KVxyXG5leHBvcnQgY2xhc3MgSW50ZXJDb21TZXJ2aWNlIHtcclxuXHJcbiAgICAvKiogTWVzc2FnZ2kgaW4gdXNjaXRhLCB1bm8gcGVyIG9nbmkgcmVjaXBpZW50IHJlZ2lzdHJhdG9zaSBkYWxsJ2VudHJ5cG9pbnQgKipyZWdpc3RlcioqICovXHJcbiAgICBwdWJsaWMgb3V0Ym91bmRzOiB7IFtpZDogc3RyaW5nXTogU3ViamVjdDxJbnRlckNvbU1lc3NhZ2U+IH0gPSB7fTtcclxuICAgIC8qKiBNZXNzYWdnaSBpbiBlbnRyYXRhLCB1bmljbyBwZXIgYXBwbGljYXppb25lIHByaW5jaXBhbGUgKi9cclxuICAgIHB1YmxpYyBpbmJvdW5kczogU3ViamVjdDxJbnRlckNvbU1lc3NhZ2U+ID0gbmV3IFN1YmplY3Q8SW50ZXJDb21NZXNzYWdlPigpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWV0b2RvIGNoZSBwZXJtZXR0ZSBkaSBpbnZpYXJlIHVuIG1lc3NhZ2dpbyBkYWxsJ2FwcGxpY2F6aW9uZSBhZCB1biBtb2R1bG8gZXN0ZXJubyBvIHZpY2V2ZXJzYVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gbWVzc2FnZVR5cGUgVGlwb2xvZ2lhIGRpIG1lc3NhZ2dpby4gU2Fyw6AgZGkgdGlwbyAqKkluYm91bmRNZXNzYWdlVHlwZXMqKiBwZXIgdHV0dGkgaSBtZXNzYWdnaSBpbmJvdW5kLCBkaW5hbWljbyBwZXIgdHV0dGkgaSBtZXNhZ2dpIG91dGJvdW5kIChpbCB0aXBvIGRpcGVuZGVyw6AgZGFnbGkgZW51bSBkZWkgbWVzc2FnZ2kgZGVpIG1vZHVsaSBlc3Rlcm5pKVxyXG4gICAgICogQHBhcmFtIHthbnl9IG1lc3NhZ2UgTWVzc2FnZ2lvIGRhIGludmlhcmUgY2hlIHB1w7IgZXNzZXJlIHVuIGR0byBpbiBjYXNpIGNvbXBsZXNzaSBtYSBkb3Zyw6AgZXNzZXJlIGdlc3RpdG8gYSBkb3ZlcmUgbGF0byBpbXBsZW1lbnRhdGl2b1xyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHJlY2lwaWVudCBEZXN0aW5hdGFyaW8gZGVsIG1lc3NhZ2dpby4gUGVyIGkgbWVzc2FnZ2kgaW5ib3VuZCBkZXYnZXNzZXJlIGxhc2NpYXRvIHZ1b3RvLCBwZXIgaSBtZXNzYWdnaSBvdXRib3VuZCBzYXLDoCB2YWxvcml6emF0byBhbGxhIGNoaWF2ZSBkZWwgbW9kdWxvIGEgY3VpIHNpIHZ1b2xlIGludmlhcmUgaWwgbWVzc2FnZ2lvXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZW5kKG1lc3NhZ2VUeXBlOiBhbnksIG1lc3NhZ2U6IGFueSwgcmVjaXBpZW50Pzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IG1zZyA9IG5ldyBJbnRlckNvbU1lc3NhZ2UobWVzc2FnZVR5cGUsIG1lc3NhZ2UpO1xyXG5cclxuICAgICAgICAvLyBTZSBub24gYyfDqCB1biByZWNpcGllbnQgc2lnbmlmaWNhIGNoZSDDqCB1biBtb2R1bG8gZXN0ZXJubyBjaGUgaW52aWEgbWVzc2FnZ2kgYWwgbW9kdWxvIG1haW4gKHF1aW5kaSBtZXNzYWdnaW8gaW4gZW50cmF0YSAtIGluYm91bmQpXHJcbiAgICAgICAgLy8gQWx0cmltZW50aSBzaWduaWZpY2EgY2hlIMOoIGlsIG1vZHVsbyBtYWluIGFkIGludmlhcmUgbWVzc2FnZ2kgYWkgbW9kdWxpIGVzdGVybmkgKG1lc3NhZ2dpbyBpbiB1c2NpdGEgLSBvdXRib3VuZClcclxuICAgICAgICBpZiAoIXJlY2lwaWVudCkge1xyXG4gICAgICAgICAgICB0aGlzLmluYm91bmRzLm5leHQobXNnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5vdXRib3VuZHNbcmVjaXBpZW50XSlcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIkBlc2ZhZW56YS9leHRlbnNpb25zIC0gSW50ZXJDb21TZXJ2aWNlOiBJbXBvc3NpYmlsZSBpbnZpYXJlIGlsIG1lc3NhZ2dpbyBhbCByZWNpcGllbnQgXCIgKyByZWNpcGllbnQgKyBcIiBhc3NpY3VyYXJzaSBjaGUgaWwgbW9kdWxvIHNpYSBjYXJpY2F0byBlIGNoZSBlZmZldHR1aSBsYSBjaGlhbWF0YSBhbCBtZXRvZG8gJ3JlZ2lzc3RlcidcIik7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHRoaXMub3V0Ym91bmRzW3JlY2lwaWVudF0ubmV4dChtc2cpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGVybWV0dGUgZGkgcmVnaXN0cmFyZSB1biBtb2R1bG8gZXN0ZXJubyBhbGxhIGxpc3RhIGRlaSBtb2R1bGkgaW4gbGlzdGVuaW5nIHN1bGxhIGNvZGEgZGkgbWVzc2FnZ2lcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBDaGlhdmUgZGVsIG1vZHVsbyBkYSByZWdpc3RyYXJlLiBUdXR0aSBpIG1lc3NhZ2dpIGluYm91bmQgc2FyYW5ubyBpbnZpYXRpIGRhbGwnYXBwbGljYXppb25lIHByaW5jaXBhbGUgc3UgcXVlc3RhIGNoaWF2ZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVnaXN0ZXIoa2V5OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5vdXRib3VuZHNba2V5XSlcclxuICAgICAgICAgICAgdGhyb3cgXCJAZXNmYWVuemEvZXh0ZW5zaW9ucyAtIEludGVyQ29tU2VydmljZTogSW1wb3NzaWJpbGUgcmVnaXN0cmFyZSBwacO5IHZvbHRlIGxvIHN0ZXNzbyBtb2R1bG9cIjtcclxuICAgICAgICB0aGlzLm91dGJvdW5kc1trZXldID0gbmV3IFN1YmplY3Q8SW50ZXJDb21NZXNzYWdlPigpO1xyXG4gICAgfVxyXG59Il19
|