@senior-gestao-empresarial/angular-components 6.8.0 → 6.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/senior-gestao-empresarial-angular-components.umd.js +80 -105
- package/bundles/senior-gestao-empresarial-angular-components.umd.js.map +1 -1
- package/bundles/senior-gestao-empresarial-angular-components.umd.min.js +1 -1
- package/bundles/senior-gestao-empresarial-angular-components.umd.min.js.map +1 -1
- package/components/websocket/websocket.service.d.ts +11 -24
- package/esm2015/components/websocket/websocket.service.js +63 -88
- package/esm5/components/websocket/websocket.service.js +87 -112
- package/fesm2015/senior-gestao-empresarial-angular-components.js +58 -83
- package/fesm2015/senior-gestao-empresarial-angular-components.js.map +1 -1
- package/fesm5/senior-gestao-empresarial-angular-components.js +82 -107
- package/fesm5/senior-gestao-empresarial-angular-components.js.map +1 -1
- package/package.json +1 -1
- package/senior-gestao-empresarial-angular-components.metadata.json +1 -1
|
@@ -1,19 +1,17 @@
|
|
|
1
1
|
import { __decorate, __values } from "tslib";
|
|
2
|
-
import { Injectable } from
|
|
3
|
-
import { Stomp } from
|
|
4
|
-
import * as Cookies from
|
|
5
|
-
import {
|
|
6
|
-
import { finalize, first } from
|
|
7
|
-
import * as SockJS from
|
|
2
|
+
import { Injectable } from '@angular/core';
|
|
3
|
+
import { Stomp } from '@stomp/stompjs';
|
|
4
|
+
import * as Cookies from 'js-cookie';
|
|
5
|
+
import { Subject, fromEvent, iif, of, race, timer } from 'rxjs';
|
|
6
|
+
import { filter, finalize, first, map, switchMap, take } from 'rxjs/operators';
|
|
7
|
+
import * as SockJS from 'sockjs-client';
|
|
8
8
|
import * as i0 from "@angular/core";
|
|
9
9
|
var WebsocketService = /** @class */ (function () {
|
|
10
10
|
function WebsocketService() {
|
|
11
|
-
/** @private */
|
|
12
|
-
this.focused = true;
|
|
13
11
|
/** @private */
|
|
14
12
|
this.wasConnected = false;
|
|
15
13
|
/** @private */
|
|
16
|
-
this.
|
|
14
|
+
this.isConnected = false;
|
|
17
15
|
/** @private */
|
|
18
16
|
this.isConnecting = false;
|
|
19
17
|
/** @private */
|
|
@@ -26,23 +24,19 @@ var WebsocketService = /** @class */ (function () {
|
|
|
26
24
|
this.reconnect$ = new Subject();
|
|
27
25
|
/** @private */
|
|
28
26
|
this.error$ = new Subject();
|
|
29
|
-
|
|
30
|
-
window.onblur = this.onBlur;
|
|
27
|
+
this.subscribe$ = new Subject();
|
|
31
28
|
this.connect();
|
|
32
29
|
}
|
|
33
30
|
WebsocketService_1 = WebsocketService;
|
|
34
31
|
/**
|
|
35
|
-
* Observable responsável por emitir uma notificação quando a conexão websocket é estabelecida.
|
|
36
|
-
* @return Um `Observable<void>` que emite uma notificação quando a conexão websocket é estabelecida.
|
|
32
|
+
* Observable responsável por emitir uma notificação quando a conexão websocket é estabelecida pela primeira vez.
|
|
33
|
+
* @return Um `Observable<void>` que emite uma notificação quando a conexão websocket é estabelecida pela primeira vez.
|
|
37
34
|
*/
|
|
38
35
|
WebsocketService.prototype.onConnect = function () {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
}
|
|
44
|
-
}, 0);
|
|
45
|
-
return this.connect$.pipe(first());
|
|
36
|
+
if (this.isConnected || this.wasConnected) {
|
|
37
|
+
return of(undefined).pipe(take(1));
|
|
38
|
+
}
|
|
39
|
+
return this.connect$.asObservable().pipe(take(1));
|
|
46
40
|
};
|
|
47
41
|
/**
|
|
48
42
|
* Observable responsável por emitir uma notificação quando a conexão é desconectada.
|
|
@@ -59,16 +53,21 @@ var WebsocketService = /** @class */ (function () {
|
|
|
59
53
|
return this.reconnect$.asObservable();
|
|
60
54
|
};
|
|
61
55
|
/**
|
|
62
|
-
* Observable responsável por emitir uma notificação após o subscribe do evento.
|
|
63
|
-
* @return Um `Observable<void>` que emite uma notificação após o subscribe do evento.
|
|
56
|
+
* Observable responsável por emitir uma notificação após o subscribe do evento pela primeira vez.
|
|
57
|
+
* @return Um `Observable<void>` que emite uma notificação após o subscribe do evento pela primeira vez.
|
|
64
58
|
*/
|
|
65
59
|
WebsocketService.prototype.onSubscribe = function (_a) {
|
|
60
|
+
var _this = this;
|
|
66
61
|
var domain = _a.domain, service = _a.service, primitive = _a.primitive;
|
|
67
|
-
var
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
62
|
+
var key = this.getPrimitiveManagerKey(domain, service, primitive);
|
|
63
|
+
return this.onConnect().pipe(switchMap(function () {
|
|
64
|
+
return _this.primitiveManagers.has(key) &&
|
|
65
|
+
_this.primitiveManagers.get(key).isSubscribed
|
|
66
|
+
? of(void 0).pipe(take(1))
|
|
67
|
+
: _this.subscribe$.pipe(filter(function (primitiveManager) {
|
|
68
|
+
return _this.getPrimitiveManagerKey(primitiveManager.domain, primitiveManager.service, primitiveManager.primitive) === key;
|
|
69
|
+
}), take(1), map(function () { return void 0; }));
|
|
70
|
+
}));
|
|
72
71
|
};
|
|
73
72
|
/**
|
|
74
73
|
* Observable responsável por emitir uma notificação quando ocorre algum erro.
|
|
@@ -98,14 +97,16 @@ var WebsocketService = /** @class */ (function () {
|
|
|
98
97
|
primitive: primitive,
|
|
99
98
|
stompSubscriptions: [],
|
|
100
99
|
event$: new Subject(),
|
|
101
|
-
|
|
100
|
+
isSubscribed: false
|
|
102
101
|
};
|
|
103
102
|
this.primitiveManagers.set(key, primitiveManager);
|
|
104
|
-
if (this.isConnected
|
|
103
|
+
if (this.isConnected) {
|
|
105
104
|
this.createStompSubscriptions(primitiveManager);
|
|
106
105
|
return primitiveManager.event$
|
|
107
106
|
.asObservable()
|
|
108
|
-
.pipe(finalize(function () {
|
|
107
|
+
.pipe(finalize(function () {
|
|
108
|
+
return _this.disconnectPrimitiveOnFinalize(primitiveManager);
|
|
109
|
+
}));
|
|
109
110
|
}
|
|
110
111
|
else {
|
|
111
112
|
if (!this.isConnecting) {
|
|
@@ -116,7 +117,9 @@ var WebsocketService = /** @class */ (function () {
|
|
|
116
117
|
});
|
|
117
118
|
return primitiveManager.event$
|
|
118
119
|
.asObservable()
|
|
119
|
-
.pipe(finalize(function () {
|
|
120
|
+
.pipe(finalize(function () {
|
|
121
|
+
return _this.disconnectPrimitiveOnFinalize(primitiveManager);
|
|
122
|
+
}));
|
|
120
123
|
}
|
|
121
124
|
};
|
|
122
125
|
/** @private */
|
|
@@ -125,20 +128,24 @@ var WebsocketService = /** @class */ (function () {
|
|
|
125
128
|
var stompSubscriptionWithToken = this.createStompSubscription(withTokenUrl, primitiveManager);
|
|
126
129
|
var withoutTokenUrl = this.getSubscriptionUrlWithoutToken(primitiveManager.domain, primitiveManager.service, primitiveManager.primitive);
|
|
127
130
|
var stompSubscriptionWithoutToken = this.createStompSubscription(withoutTokenUrl, primitiveManager);
|
|
128
|
-
primitiveManager.stompSubscriptions = [
|
|
129
|
-
|
|
131
|
+
primitiveManager.stompSubscriptions = [
|
|
132
|
+
stompSubscriptionWithToken,
|
|
133
|
+
stompSubscriptionWithoutToken
|
|
134
|
+
];
|
|
135
|
+
primitiveManager.isSubscribed = true;
|
|
136
|
+
this.subscribe$.next(primitiveManager);
|
|
130
137
|
};
|
|
131
138
|
/** @private */
|
|
132
139
|
WebsocketService.prototype.connect = function () {
|
|
133
140
|
var _this = this;
|
|
134
141
|
this.createStompClient();
|
|
135
142
|
this.isConnecting = true;
|
|
136
|
-
this._stompClient.activate();
|
|
137
143
|
this._stompClient.connect({}, function () {
|
|
138
144
|
_this.isConnecting = false;
|
|
139
|
-
_this.
|
|
145
|
+
_this.isConnected = true;
|
|
140
146
|
if (_this.wasConnected) {
|
|
141
147
|
_this.reconnectPrimitives();
|
|
148
|
+
_this.connect$.next();
|
|
142
149
|
_this.reconnect$.next();
|
|
143
150
|
}
|
|
144
151
|
else {
|
|
@@ -146,24 +153,28 @@ var WebsocketService = /** @class */ (function () {
|
|
|
146
153
|
_this.connect$.next();
|
|
147
154
|
}
|
|
148
155
|
}, function (error) {
|
|
149
|
-
_this.
|
|
156
|
+
_this.isConnected = false;
|
|
150
157
|
_this.error$.next(error);
|
|
151
|
-
_this.
|
|
158
|
+
race(_this.disconnect$.pipe(take(1), map(function () { return ({ wasDisconnected: true }); })), timer(WebsocketService_1.RECONNECT_INTERVAL).pipe(take(1), switchMap(function () {
|
|
159
|
+
return iif(function () { return document.hidden; }, fromEvent(document, 'visibilitychange').pipe(first()), of(void 0));
|
|
160
|
+
}), map(function () { return ({ wasDisconnected: false }); })))
|
|
161
|
+
.pipe(take(1))
|
|
162
|
+
.subscribe({
|
|
163
|
+
next: function (_a) {
|
|
164
|
+
var wasDisconnected = _a.wasDisconnected;
|
|
165
|
+
if (!wasDisconnected &&
|
|
166
|
+
!(_this.isConnected || _this.isConnecting)) {
|
|
167
|
+
_this.connect();
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
});
|
|
152
171
|
});
|
|
153
172
|
};
|
|
154
|
-
/** @private */
|
|
155
|
-
WebsocketService.prototype.onFocus = function () {
|
|
156
|
-
this.focused = true;
|
|
157
|
-
};
|
|
158
|
-
/** @private */
|
|
159
|
-
WebsocketService.prototype.onBlur = function () {
|
|
160
|
-
this.focused = false;
|
|
161
|
-
};
|
|
162
173
|
WebsocketService.prototype.disconnect = function () {
|
|
163
174
|
var e_1, _a, e_2, _b, e_3, _c;
|
|
164
|
-
|
|
165
|
-
if (observersCount > 0)
|
|
175
|
+
if (this.getObserversCount() > 0) {
|
|
166
176
|
return;
|
|
177
|
+
}
|
|
167
178
|
try {
|
|
168
179
|
for (var _d = __values(this.primitiveManagers.values()), _e = _d.next(); !_e.done; _e = _d.next()) {
|
|
169
180
|
var primitiveManager = _e.value;
|
|
@@ -193,7 +204,6 @@ var WebsocketService = /** @class */ (function () {
|
|
|
193
204
|
for (var _h = __values(this.primitiveManagers.values()), _j = _h.next(); !_j.done; _j = _h.next()) {
|
|
194
205
|
var primitiveManager = _j.value;
|
|
195
206
|
primitiveManager.event$.complete();
|
|
196
|
-
primitiveManager.subscribe$.complete();
|
|
197
207
|
}
|
|
198
208
|
}
|
|
199
209
|
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
@@ -206,34 +216,32 @@ var WebsocketService = /** @class */ (function () {
|
|
|
206
216
|
this.primitiveManagers.clear();
|
|
207
217
|
this._stompClient.disconnect();
|
|
208
218
|
this._stompClient.deactivate();
|
|
209
|
-
this.
|
|
219
|
+
this.isConnected = false;
|
|
210
220
|
this.isConnecting = false;
|
|
211
221
|
this.wasConnected = false;
|
|
212
222
|
this.disconnect$.next();
|
|
213
223
|
};
|
|
214
224
|
/** @private */
|
|
215
|
-
WebsocketService.prototype.isConnected = function () {
|
|
216
|
-
return this.connected;
|
|
217
|
-
};
|
|
218
|
-
/** @private */
|
|
219
|
-
WebsocketService.prototype.setConnected = function (connected) {
|
|
220
|
-
this.connected = connected;
|
|
221
|
-
};
|
|
222
|
-
/** @private */
|
|
223
225
|
WebsocketService.prototype.getSubscriptionUrlWithToken = function (domain, service, primitive) {
|
|
224
|
-
var tenant = WebsocketService_1.TOKEN
|
|
225
|
-
|
|
226
|
+
var tenant = WebsocketService_1.TOKEN
|
|
227
|
+
? WebsocketService_1.TOKEN.username.split('@')[1]
|
|
228
|
+
: null;
|
|
229
|
+
var token = WebsocketService_1.TOKEN
|
|
230
|
+
? WebsocketService_1.TOKEN.access_token
|
|
231
|
+
: null;
|
|
226
232
|
return "/topic/" + tenant + "/" + token + "/" + domain + "/" + service + "/" + primitive;
|
|
227
233
|
};
|
|
228
234
|
/** @private */
|
|
229
235
|
WebsocketService.prototype.getSubscriptionUrlWithoutToken = function (domain, service, primitive) {
|
|
230
|
-
var tenant = WebsocketService_1.TOKEN
|
|
236
|
+
var tenant = WebsocketService_1.TOKEN
|
|
237
|
+
? WebsocketService_1.TOKEN.username.split('@')[1]
|
|
238
|
+
: null;
|
|
231
239
|
return "/topic/" + tenant + "/" + domain + "/" + service + "/" + primitive;
|
|
232
240
|
};
|
|
233
241
|
/** @private */
|
|
234
242
|
WebsocketService.prototype.createStompSubscription = function (destination, primitiveManager) {
|
|
235
243
|
return this._stompClient.subscribe(destination, function (message) {
|
|
236
|
-
var event = JSON.parse(message.body ||
|
|
244
|
+
var event = JSON.parse(message.body || '{}');
|
|
237
245
|
primitiveManager.event$.next(event);
|
|
238
246
|
});
|
|
239
247
|
};
|
|
@@ -241,58 +249,28 @@ var WebsocketService = /** @class */ (function () {
|
|
|
241
249
|
WebsocketService.prototype.createStompClient = function () {
|
|
242
250
|
var ws = new SockJS(WebsocketService_1.WEBSOCKET_URL + "subscription", null, { timeout: WebsocketService_1.CONNECTION_TIMEOUT });
|
|
243
251
|
this._stompClient = Stomp.over(ws);
|
|
244
|
-
|
|
245
|
-
this._stompClient.debug = function () { }; // Para remover os logs.
|
|
246
|
-
};
|
|
247
|
-
/** @private */
|
|
248
|
-
WebsocketService.prototype.reconnect = function () {
|
|
249
|
-
var _this = this;
|
|
250
|
-
if (this.connected)
|
|
251
|
-
this._stompClient.disconnect();
|
|
252
|
-
setTimeout(function () {
|
|
253
|
-
if (_this.getObserversCount() === 0)
|
|
254
|
-
return;
|
|
255
|
-
if (_this.focused) {
|
|
256
|
-
_this.connect();
|
|
257
|
-
}
|
|
258
|
-
else {
|
|
259
|
-
_this.reconnect();
|
|
260
|
-
}
|
|
261
|
-
}, WebsocketService_1.RECONNECT_TIMER);
|
|
252
|
+
this._stompClient.debug = function () { return null; };
|
|
262
253
|
};
|
|
263
254
|
/** @private */
|
|
264
255
|
WebsocketService.prototype.reconnectPrimitives = function () {
|
|
265
|
-
var e_4, _a
|
|
256
|
+
var e_4, _a;
|
|
266
257
|
try {
|
|
267
|
-
for (var
|
|
268
|
-
var primitiveManager =
|
|
269
|
-
try {
|
|
270
|
-
for (var _e = (e_5 = void 0, __values(primitiveManager.stompSubscriptions)), _f = _e.next(); !_f.done; _f = _e.next()) {
|
|
271
|
-
var stompSubscription = _f.value;
|
|
272
|
-
stompSubscription.unsubscribe();
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
catch (e_5_1) { e_5 = { error: e_5_1 }; }
|
|
276
|
-
finally {
|
|
277
|
-
try {
|
|
278
|
-
if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
|
|
279
|
-
}
|
|
280
|
-
finally { if (e_5) throw e_5.error; }
|
|
281
|
-
}
|
|
258
|
+
for (var _b = __values(this.primitiveManagers.values()), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
259
|
+
var primitiveManager = _c.value;
|
|
282
260
|
this.createStompSubscriptions(primitiveManager);
|
|
283
261
|
}
|
|
284
262
|
}
|
|
285
263
|
catch (e_4_1) { e_4 = { error: e_4_1 }; }
|
|
286
264
|
finally {
|
|
287
265
|
try {
|
|
288
|
-
if (
|
|
266
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
289
267
|
}
|
|
290
268
|
finally { if (e_4) throw e_4.error; }
|
|
291
269
|
}
|
|
292
270
|
};
|
|
293
271
|
/** @private */
|
|
294
272
|
WebsocketService.prototype.getObserversCount = function () {
|
|
295
|
-
var
|
|
273
|
+
var e_5, _a;
|
|
296
274
|
var observersCount = 0;
|
|
297
275
|
try {
|
|
298
276
|
for (var _b = __values(this.primitiveManagers.values()), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
@@ -300,36 +278,35 @@ var WebsocketService = /** @class */ (function () {
|
|
|
300
278
|
observersCount += primitiveManager.event$.observers.length;
|
|
301
279
|
}
|
|
302
280
|
}
|
|
303
|
-
catch (
|
|
281
|
+
catch (e_5_1) { e_5 = { error: e_5_1 }; }
|
|
304
282
|
finally {
|
|
305
283
|
try {
|
|
306
284
|
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
307
285
|
}
|
|
308
|
-
finally { if (
|
|
286
|
+
finally { if (e_5) throw e_5.error; }
|
|
309
287
|
}
|
|
310
288
|
return observersCount;
|
|
311
289
|
};
|
|
312
290
|
/** @private */
|
|
313
291
|
WebsocketService.prototype.disconnectPrimitiveOnFinalize = function (primitiveManager) {
|
|
314
|
-
var
|
|
292
|
+
var e_6, _a;
|
|
315
293
|
// @IMPORTANT: Replace .observers.length === 1 with .observed in rxjs 7.0+
|
|
316
294
|
var hasObservers = !(primitiveManager.event$.observers.length === 1);
|
|
317
295
|
if (hasObservers)
|
|
318
296
|
return;
|
|
319
297
|
primitiveManager.event$.complete();
|
|
320
|
-
primitiveManager.subscribe$.complete();
|
|
321
298
|
try {
|
|
322
299
|
for (var _b = __values(primitiveManager.stompSubscriptions), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
323
300
|
var stompSubscription = _c.value;
|
|
324
301
|
stompSubscription.unsubscribe();
|
|
325
302
|
}
|
|
326
303
|
}
|
|
327
|
-
catch (
|
|
304
|
+
catch (e_6_1) { e_6 = { error: e_6_1 }; }
|
|
328
305
|
finally {
|
|
329
306
|
try {
|
|
330
307
|
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
331
308
|
}
|
|
332
|
-
finally { if (
|
|
309
|
+
finally { if (e_6) throw e_6.error; }
|
|
333
310
|
}
|
|
334
311
|
var key = this.getPrimitiveManagerKey(primitiveManager.domain, primitiveManager.service, primitiveManager.primitive);
|
|
335
312
|
this.primitiveManagers.delete(key);
|
|
@@ -340,25 +317,23 @@ var WebsocketService = /** @class */ (function () {
|
|
|
340
317
|
return domain + "/" + service + "/" + primitive;
|
|
341
318
|
};
|
|
342
319
|
var WebsocketService_1;
|
|
343
|
-
|
|
344
|
-
WebsocketService.RECONNECT_TIMER = 3000;
|
|
345
|
-
/** @private */
|
|
320
|
+
WebsocketService.RECONNECT_INTERVAL = 3000;
|
|
346
321
|
WebsocketService.CONNECTION_TIMEOUT = 15000;
|
|
347
322
|
/** @private */
|
|
348
|
-
WebsocketService.BASE_URL_COOKIE =
|
|
323
|
+
WebsocketService.BASE_URL_COOKIE = 'com.senior.base.url';
|
|
349
324
|
/** @private */
|
|
350
|
-
WebsocketService.TOKEN_COOKIE =
|
|
325
|
+
WebsocketService.TOKEN_COOKIE = 'com.senior.token';
|
|
351
326
|
/** @private */
|
|
352
|
-
WebsocketService.TOKEN = JSON.parse(Cookies.get(WebsocketService_1.TOKEN_COOKIE) ||
|
|
327
|
+
WebsocketService.TOKEN = JSON.parse(Cookies.get(WebsocketService_1.TOKEN_COOKIE) || '{}');
|
|
353
328
|
/** @private */
|
|
354
|
-
WebsocketService.WEBSOCKET_URL = Cookies.get(WebsocketService_1.BASE_URL_COOKIE) +
|
|
329
|
+
WebsocketService.WEBSOCKET_URL = Cookies.get(WebsocketService_1.BASE_URL_COOKIE) + '/websocket/';
|
|
355
330
|
WebsocketService.ɵprov = i0.ɵɵdefineInjectable({ factory: function WebsocketService_Factory() { return new WebsocketService(); }, token: WebsocketService, providedIn: "root" });
|
|
356
331
|
WebsocketService = WebsocketService_1 = __decorate([
|
|
357
332
|
Injectable({
|
|
358
|
-
providedIn:
|
|
333
|
+
providedIn: 'root'
|
|
359
334
|
})
|
|
360
335
|
], WebsocketService);
|
|
361
336
|
return WebsocketService;
|
|
362
337
|
}());
|
|
363
338
|
export { WebsocketService };
|
|
364
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac2VuaW9yLWdlc3Rhby1lbXByZXNhcmlhbC9hbmd1bGFyLWNvbXBvbmVudHMvIiwic291cmNlcyI6WyJjb21wb25lbnRzL3dlYnNvY2tldC93ZWJzb2NrZXQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQTJCLEtBQUssRUFBcUIsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRixPQUFPLEtBQUssT0FBTyxNQUFNLFdBQVcsQ0FBQztBQUNyQyxPQUFPLEVBQWMsYUFBYSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxRCxPQUFPLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pELE9BQU8sS0FBSyxNQUFNLE1BQU0sZUFBZSxDQUFDOztBQWV4QztJQWlESTtRQTlCQSxlQUFlO1FBQ1AsWUFBTyxHQUFHLElBQUksQ0FBQztRQUt2QixlQUFlO1FBQ1AsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFFN0IsZUFBZTtRQUNQLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFFMUIsZUFBZTtRQUNQLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBRTdCLGVBQWU7UUFDUCxzQkFBaUIsR0FBa0MsSUFBSSxHQUFHLEVBQTRCLENBQUM7UUFFL0YsZUFBZTtRQUNQLGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBRXZDLGVBQWU7UUFDUCxnQkFBVyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFFMUMsZUFBZTtRQUNQLGVBQVUsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBRXpDLGVBQWU7UUFDUCxXQUFNLEdBQUcsSUFBSSxPQUFPLEVBQWEsQ0FBQztRQUd0QyxNQUFNLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDOUIsTUFB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LENBQUMsQ0FBQztRQUVuQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELGVBQWU7SUFDUCxpREFBc0IsR0FBOUIsVUFBK0IsTUFBYyxFQUFFLE9BQWUsRUFBRSxTQUFpQjtRQUM3RSxPQUFVLE1BQU0sU0FBSSxPQUFPLFNBQUksU0FBVyxDQUFDO0lBQy9DLENBQUM7O0lBbldELGVBQWU7SUFDQSxnQ0FBZSxHQUFHLElBQUksQ0FBQztJQUV0QyxlQUFlO0lBQ0EsbUNBQWtCLEdBQUcsS0FBSyxDQUFDO0lBRTFDLGVBQWU7SUFDQSxnQ0FBZSxHQUFHLHFCQUFxQixDQUFDO0lBRXZELGVBQWU7SUFDQSw2QkFBWSxHQUFHLGtCQUFrQixDQUFDO0lBRWpELGVBQWU7SUFDQSxzQkFBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBZ0IsQ0FBQyxZQUFZLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQztJQUV0RixlQUFlO0lBQ0EsOEJBQWEsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFnQixDQUFDLGVBQWUsQ0FBQyxHQUFHLGFBQWEsQ0FBQzs7SUFqQnBGLGdCQUFnQjtRQUg1QixVQUFVLENBQUM7WUFDUixVQUFVLEVBQUUsTUFBTTtTQUNyQixDQUFDO09BQ1csZ0JBQWdCLENBcVc1QjsyQkF6WEQ7Q0F5WEMsQUFyV0QsSUFxV0M7U0FyV1ksZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IENvbXBhdENsaWVudCwgRnJhbWVJbXBsLCBTdG9tcCwgU3RvbXBTdWJzY3JpcHRpb24gfSBmcm9tIFwiQHN0b21wL3N0b21wanNcIjtcclxuaW1wb3J0ICogYXMgQ29va2llcyBmcm9tIFwianMtY29va2llXCI7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFJlcGxheVN1YmplY3QsIFN1YmplY3QgfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBmaW5hbGl6ZSwgZmlyc3QgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuaW1wb3J0ICogYXMgU29ja0pTIGZyb20gXCJzb2NranMtY2xpZW50XCI7XHJcblxyXG4vKiogQHByaXZhdGUgKi9cclxuaW50ZXJmYWNlIFByaW1pdGl2ZU1hbmFnZXIge1xyXG4gICAgZG9tYWluOiBzdHJpbmc7XHJcbiAgICBzZXJ2aWNlOiBzdHJpbmc7XHJcbiAgICBwcmltaXRpdmU6IHN0cmluZztcclxuICAgIHN0b21wU3Vic2NyaXB0aW9uczogU3RvbXBTdWJzY3JpcHRpb25bXTtcclxuICAgIGV2ZW50JDogU3ViamVjdDxhbnk+O1xyXG4gICAgc3Vic2NyaWJlJDogUmVwbGF5U3ViamVjdDx2b2lkPjtcclxufVxyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogXCJyb290XCIsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBXZWJzb2NrZXRTZXJ2aWNlIHtcclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgUkVDT05ORUNUX1RJTUVSID0gMzAwMDtcclxuXHJcbiAgICAvKiogQHByaXZhdGUgKi9cclxuICAgIHByaXZhdGUgc3RhdGljIENPTk5FQ1RJT05fVElNRU9VVCA9IDE1MDAwO1xyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgQkFTRV9VUkxfQ09PS0lFID0gXCJjb20uc2VuaW9yLmJhc2UudXJsXCI7XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIHN0YXRpYyBUT0tFTl9DT09LSUUgPSBcImNvbS5zZW5pb3IudG9rZW5cIjtcclxuXHJcbiAgICAvKiogQHByaXZhdGUgKi9cclxuICAgIHByaXZhdGUgc3RhdGljIFRPS0VOID0gSlNPTi5wYXJzZShDb29raWVzLmdldChXZWJzb2NrZXRTZXJ2aWNlLlRPS0VOX0NPT0tJRSkgfHwgXCJ7fVwiKTtcclxuXHJcbiAgICAvKiogQHByaXZhdGUgKi9cclxuICAgIHByaXZhdGUgc3RhdGljIFdFQlNPQ0tFVF9VUkwgPSBDb29raWVzLmdldChXZWJzb2NrZXRTZXJ2aWNlLkJBU0VfVVJMX0NPT0tJRSkgKyBcIi93ZWJzb2NrZXQvXCI7XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIGZvY3VzZWQgPSB0cnVlO1xyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSBfc3RvbXBDbGllbnQ6IENvbXBhdENsaWVudDtcclxuXHJcbiAgICAvKiogQHByaXZhdGUgKi9cclxuICAgIHByaXZhdGUgd2FzQ29ubmVjdGVkID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIGNvbm5lY3RlZCA9IGZhbHNlO1xyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSBpc0Nvbm5lY3RpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAvKiogQHByaXZhdGUgKi9cclxuICAgIHByaXZhdGUgcHJpbWl0aXZlTWFuYWdlcnM6IE1hcDxzdHJpbmcsIFByaW1pdGl2ZU1hbmFnZXI+ID0gbmV3IE1hcDxzdHJpbmcsIFByaW1pdGl2ZU1hbmFnZXI+KCk7XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIGNvbm5lY3QkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgICAvKiogQHByaXZhdGUgKi9cclxuICAgIHByaXZhdGUgZGlzY29ubmVjdCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSByZWNvbm5lY3QkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgICAvKiogQHByaXZhdGUgKi9cclxuICAgIHByaXZhdGUgZXJyb3IkID0gbmV3IFN1YmplY3Q8RnJhbWVJbXBsPigpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHdpbmRvdy5vbmZvY3VzID0gdGhpcy5vbkZvY3VzO1xyXG4gICAgICAgIHdpbmRvdy5vbmJsdXIgPSB0aGlzLm9uQmx1cjtcclxuXHJcbiAgICAgICAgdGhpcy5jb25uZWN0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnNlcnZhYmxlIHJlc3BvbnPDoXZlbCBwb3IgZW1pdGlyIHVtYSBub3RpZmljYcOnw6NvIHF1YW5kbyBhIGNvbmV4w6NvIHdlYnNvY2tldCDDqSBlc3RhYmVsZWNpZGEuXHJcbiAgICAgKiBAcmV0dXJuIFVtIGBPYnNlcnZhYmxlPHZvaWQ+YCBxdWUgZW1pdGUgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIGEgY29uZXjDo28gd2Vic29ja2V0IMOpIGVzdGFiZWxlY2lkYS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uQ29ubmVjdCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0JC5uZXh0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCAwKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdCQucGlwZShmaXJzdCgpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9ic2VydmFibGUgcmVzcG9uc8OhdmVsIHBvciBlbWl0aXIgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIGEgY29uZXjDo28gw6kgZGVzY29uZWN0YWRhLlxyXG4gICAgICogQHJldHVybiBVbSBgT2JzZXJ2YWJsZTx2b2lkPmAgcXVlIGVtaXRlIHVtYSBub3RpZmljYcOnw6NvIHF1YW5kbyBhIGNvbmV4w6NvIMOpIGRlc2NvbmVjdGFkYS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uRGlzY29ubmVjdCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kaXNjb25uZWN0JC5hc09ic2VydmFibGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9ic2VydmFibGUgcmVzcG9uc8OhdmVsIHBvciBlbWl0aXIgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIGEgY29uZXjDo28gw6kgcmVjb25lY3RhZGEuXHJcbiAgICAgKiBAcmV0dXJuIFVtIGBPYnNlcnZhYmxlPHZvaWQ+YCBxdWUgZW1pdGUgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIGEgY29uZXjDo28gw6kgcmVjb25lY3RhZGEuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvblJlY29ubmVjdCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yZWNvbm5lY3QkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2JzZXJ2YWJsZSByZXNwb25zw6F2ZWwgcG9yIGVtaXRpciB1bWEgbm90aWZpY2HDp8OjbyBhcMOzcyBvIHN1YnNjcmliZSBkbyBldmVudG8uXHJcbiAgICAgKiBAcmV0dXJuIFVtIGBPYnNlcnZhYmxlPHZvaWQ+YCBxdWUgZW1pdGUgdW1hIG5vdGlmaWNhw6fDo28gYXDDs3MgbyBzdWJzY3JpYmUgZG8gZXZlbnRvLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25TdWJzY3JpYmUoeyBkb21haW4sIHNlcnZpY2UsIHByaW1pdGl2ZSB9OiB7IGRvbWFpbjogc3RyaW5nOyBzZXJ2aWNlOiBzdHJpbmc7IHByaW1pdGl2ZTogc3RyaW5nIH0pOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICAgICAgICBjb25zdCBwcmltaXRpdmVNYW5hZ2VyID0gdGhpcy5wcmltaXRpdmVNYW5hZ2Vycy5nZXQodGhpcy5nZXRQcmltaXRpdmVNYW5hZ2VyS2V5KGRvbWFpbiwgc2VydmljZSwgcHJpbWl0aXZlKSk7XHJcblxyXG4gICAgICAgIGlmICghcHJpbWl0aXZlTWFuYWdlcikge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHN1YnNjcmlwdGlvbiBmb3VuZCBmb3IgJHt0aGlzLmdldFByaW1pdGl2ZU1hbmFnZXJLZXkoZG9tYWluLCBzZXJ2aWNlLCBwcmltaXRpdmUpfWApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHByaW1pdGl2ZU1hbmFnZXIuc3Vic2NyaWJlJC5hc09ic2VydmFibGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9ic2VydmFibGUgcmVzcG9uc8OhdmVsIHBvciBlbWl0aXIgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIG9jb3JyZSBhbGd1bSBlcnJvLlxyXG4gICAgICogQHJldHVybiBVbSBgT2JzZXJ2YWJsZTxGcmFtZUltcGw+YCBxdWUgZW1pdGUgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIG9jb3JyZSBhbGd1bSBlcnJvLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25FcnJvcigpOiBPYnNlcnZhYmxlPEZyYW1lSW1wbD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmVycm9yJC5hc09ic2VydmFibGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEB0eXBlUGFyYW0gYDxUPmAgVGlwbyBkbyBvYmpldG8gcXVlIG8gcmV0b3JubyBkbyBgb2JzZXJ2YWJsZWAgdmFpIGRldm9sdmVyLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgT2JqZXRvIGRlIGNvbmZpZ3VyYcOnw6NvIGRvIGV2ZW50by5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLmRvbWFpbiBEb23DrW5pbyBkYSBwcmltaXRpdmEuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5zZXJ2aWNlIFNlcnZpw6dvIGRhIHByaW1pdGl2YS5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLnByaW1pdGl2ZSAgUHJpbWl0aXZhIHF1ZSBzZXLDoSBcIm9ic2VydmFkYVwiLlxyXG4gICAgICogQHJldHVybiBVbSBPYnNlcnZhYmxlPFQ+IHF1ZSBlbWl0ZSBub3RpZmljYcOnw7VlcyB0b2RhIHZleiBxdWUgbyByZXNwZWN0aXZvIGV2ZW50byDDqSBwdWJsaWNhZG8uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbkV2ZW50PFQ+KG9wdGlvbnM6IHsgZG9tYWluOiBzdHJpbmc7IHNlcnZpY2U6IHN0cmluZzsgcHJpbWl0aXZlOiBzdHJpbmcgfSk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgICAgIGNvbnN0IHsgZG9tYWluLCBzZXJ2aWNlLCBwcmltaXRpdmUgfSA9IG9wdGlvbnM7XHJcblxyXG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0UHJpbWl0aXZlTWFuYWdlcktleShkb21haW4sIHNlcnZpY2UsIHByaW1pdGl2ZSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnByaW1pdGl2ZU1hbmFnZXJzLmhhcyhrZXkpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByaW1pdGl2ZU1hbmFnZXJzLmdldChrZXkpLmV2ZW50JC5hc09ic2VydmFibGUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHByaW1pdGl2ZU1hbmFnZXI6IFByaW1pdGl2ZU1hbmFnZXIgPSB7XHJcbiAgICAgICAgICAgIGRvbWFpbjogZG9tYWluLFxyXG4gICAgICAgICAgICBzZXJ2aWNlOiBzZXJ2aWNlLFxyXG4gICAgICAgICAgICBwcmltaXRpdmU6IHByaW1pdGl2ZSxcclxuICAgICAgICAgICAgc3RvbXBTdWJzY3JpcHRpb25zOiBbXSxcclxuICAgICAgICAgICAgZXZlbnQkOiBuZXcgU3ViamVjdDxUPigpLFxyXG4gICAgICAgICAgICBzdWJzY3JpYmUkOiBuZXcgUmVwbGF5U3ViamVjdCgxKVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMucHJpbWl0aXZlTWFuYWdlcnMuc2V0KGtleSwgcHJpbWl0aXZlTWFuYWdlcik7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzQ29ubmVjdGVkKCkpIHtcclxuICAgICAgICAgICAgdGhpcy5jcmVhdGVTdG9tcFN1YnNjcmlwdGlvbnMocHJpbWl0aXZlTWFuYWdlcik7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gcHJpbWl0aXZlTWFuYWdlci5ldmVudCRcclxuICAgICAgICAgICAgICAgIC5hc09ic2VydmFibGUoKVxyXG4gICAgICAgICAgICAgICAgLnBpcGUoZmluYWxpemUoKCkgPT4gdGhpcy5kaXNjb25uZWN0UHJpbWl0aXZlT25GaW5hbGl6ZShwcmltaXRpdmVNYW5hZ2VyKSkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0Nvbm5lY3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdCgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNvbm5lY3QkLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlU3RvbXBTdWJzY3JpcHRpb25zKHByaW1pdGl2ZU1hbmFnZXIpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBwcmltaXRpdmVNYW5hZ2VyLmV2ZW50JFxyXG4gICAgICAgICAgICAgICAgLmFzT2JzZXJ2YWJsZSgpXHJcbiAgICAgICAgICAgICAgICAucGlwZShmaW5hbGl6ZSgoKSA9PiB0aGlzLmRpc2Nvbm5lY3RQcmltaXRpdmVPbkZpbmFsaXplKHByaW1pdGl2ZU1hbmFnZXIpKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVTdG9tcFN1YnNjcmlwdGlvbnMocHJpbWl0aXZlTWFuYWdlcjogUHJpbWl0aXZlTWFuYWdlcik6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHdpdGhUb2tlblVybCA9IHRoaXMuZ2V0U3Vic2NyaXB0aW9uVXJsV2l0aFRva2VuKFxyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLmRvbWFpbixcclxuICAgICAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5zZXJ2aWNlLFxyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnByaW1pdGl2ZVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGNvbnN0IHN0b21wU3Vic2NyaXB0aW9uV2l0aFRva2VuID0gdGhpcy5jcmVhdGVTdG9tcFN1YnNjcmlwdGlvbih3aXRoVG9rZW5VcmwsIHByaW1pdGl2ZU1hbmFnZXIpO1xyXG5cclxuICAgICAgICBjb25zdCB3aXRob3V0VG9rZW5VcmwgPSB0aGlzLmdldFN1YnNjcmlwdGlvblVybFdpdGhvdXRUb2tlbihcclxuICAgICAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5kb21haW4sXHJcbiAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIuc2VydmljZSxcclxuICAgICAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5wcmltaXRpdmVcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBjb25zdCBzdG9tcFN1YnNjcmlwdGlvbldpdGhvdXRUb2tlbiA9IHRoaXMuY3JlYXRlU3RvbXBTdWJzY3JpcHRpb24od2l0aG91dFRva2VuVXJsLCBwcmltaXRpdmVNYW5hZ2VyKTtcclxuXHJcbiAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5zdG9tcFN1YnNjcmlwdGlvbnMgPSBbc3RvbXBTdWJzY3JpcHRpb25XaXRoVG9rZW4sIHN0b21wU3Vic2NyaXB0aW9uV2l0aG91dFRva2VuXTtcclxuXHJcbiAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5zdWJzY3JpYmUkLm5leHQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQHByaXZhdGUgKi9cclxuICAgIHByaXZhdGUgY29ubmVjdCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmNyZWF0ZVN0b21wQ2xpZW50KCk7XHJcblxyXG4gICAgICAgIHRoaXMuaXNDb25uZWN0aW5nID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgdGhpcy5fc3RvbXBDbGllbnQuYWN0aXZhdGUoKTtcclxuXHJcbiAgICAgICAgdGhpcy5fc3RvbXBDbGllbnQuY29ubmVjdChcclxuICAgICAgICAgICAge30sXHJcbiAgICAgICAgICAgICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNDb25uZWN0aW5nID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRDb25uZWN0ZWQodHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMud2FzQ29ubmVjdGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWNvbm5lY3RQcmltaXRpdmVzKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVjb25uZWN0JC5uZXh0KCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMud2FzQ29ubmVjdGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0JC5uZXh0KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIChlcnJvcjogRnJhbWVJbXBsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldENvbm5lY3RlZChmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvciQubmV4dChlcnJvcik7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWNvbm5lY3QoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIG9uRm9jdXMoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5mb2N1c2VkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQHByaXZhdGUgKi9cclxuICAgIHByaXZhdGUgb25CbHVyKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZm9jdXNlZCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkaXNjb25uZWN0KCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IG9ic2VydmVyc0NvdW50ID0gdGhpcy5nZXRPYnNlcnZlcnNDb3VudCgpO1xyXG5cclxuICAgICAgICBpZiAob2JzZXJ2ZXJzQ291bnQgPiAwKSByZXR1cm47XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgcHJpbWl0aXZlTWFuYWdlciBvZiB0aGlzLnByaW1pdGl2ZU1hbmFnZXJzLnZhbHVlcygpKSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3RvbXBTdWJzY3JpcHRpb24gb2YgcHJpbWl0aXZlTWFuYWdlci5zdG9tcFN1YnNjcmlwdGlvbnMpIHtcclxuICAgICAgICAgICAgICAgIHN0b21wU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgcHJpbWl0aXZlTWFuYWdlciBvZiB0aGlzLnByaW1pdGl2ZU1hbmFnZXJzLnZhbHVlcygpKSB7XHJcbiAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIuZXZlbnQkLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIuc3Vic2NyaWJlJC5jb21wbGV0ZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5wcmltaXRpdmVNYW5hZ2Vycy5jbGVhcigpO1xyXG5cclxuICAgICAgICB0aGlzLl9zdG9tcENsaWVudC5kaXNjb25uZWN0KCk7XHJcbiAgICAgICAgdGhpcy5fc3RvbXBDbGllbnQuZGVhY3RpdmF0ZSgpO1xyXG5cclxuICAgICAgICB0aGlzLnNldENvbm5lY3RlZChmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5pc0Nvbm5lY3RpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLndhc0Nvbm5lY3RlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICB0aGlzLmRpc2Nvbm5lY3QkLm5leHQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQHByaXZhdGUgKi9cclxuICAgIHByaXZhdGUgaXNDb25uZWN0ZWQoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGVkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSBzZXRDb25uZWN0ZWQoY29ubmVjdGVkOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5jb25uZWN0ZWQgPSBjb25uZWN0ZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIGdldFN1YnNjcmlwdGlvblVybFdpdGhUb2tlbihkb21haW46IHN0cmluZywgc2VydmljZTogc3RyaW5nLCBwcmltaXRpdmU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgdGVuYW50ID0gV2Vic29ja2V0U2VydmljZS5UT0tFTiA/IFdlYnNvY2tldFNlcnZpY2UuVE9LRU4udXNlcm5hbWUuc3BsaXQoXCJAXCIpWzFdIDogbnVsbDtcclxuICAgICAgICBjb25zdCB0b2tlbiA9IFdlYnNvY2tldFNlcnZpY2UuVE9LRU4gPyBXZWJzb2NrZXRTZXJ2aWNlLlRPS0VOLmFjY2Vzc190b2tlbiA6IG51bGw7XHJcblxyXG4gICAgICAgIHJldHVybiBgL3RvcGljLyR7dGVuYW50fS8ke3Rva2VufS8ke2RvbWFpbn0vJHtzZXJ2aWNlfS8ke3ByaW1pdGl2ZX1gO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSBnZXRTdWJzY3JpcHRpb25VcmxXaXRob3V0VG9rZW4oZG9tYWluOiBzdHJpbmcsIHNlcnZpY2U6IHN0cmluZywgcHJpbWl0aXZlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IHRlbmFudCA9IFdlYnNvY2tldFNlcnZpY2UuVE9LRU4gPyBXZWJzb2NrZXRTZXJ2aWNlLlRPS0VOLnVzZXJuYW1lLnNwbGl0KFwiQFwiKVsxXSA6IG51bGw7XHJcblxyXG4gICAgICAgIHJldHVybiBgL3RvcGljLyR7dGVuYW50fS8ke2RvbWFpbn0vJHtzZXJ2aWNlfS8ke3ByaW1pdGl2ZX1gO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVTdG9tcFN1YnNjcmlwdGlvbihkZXN0aW5hdGlvbjogc3RyaW5nLCBwcmltaXRpdmVNYW5hZ2VyOiBQcmltaXRpdmVNYW5hZ2VyKTogU3RvbXBTdWJzY3JpcHRpb24ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zdG9tcENsaWVudC5zdWJzY3JpYmUoZGVzdGluYXRpb24sIChtZXNzYWdlOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBKU09OLnBhcnNlKG1lc3NhZ2UuYm9keSB8fCBcInt9XCIpO1xyXG5cclxuICAgICAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5ldmVudCQubmV4dChldmVudCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZVN0b21wQ2xpZW50KCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHdzID0gbmV3IFNvY2tKUyhgJHtXZWJzb2NrZXRTZXJ2aWNlLldFQlNPQ0tFVF9VUkx9c3Vic2NyaXB0aW9uYCwgbnVsbCwgeyB0aW1lb3V0OiBXZWJzb2NrZXRTZXJ2aWNlLkNPTk5FQ1RJT05fVElNRU9VVCB9KTtcclxuICAgICAgICB0aGlzLl9zdG9tcENsaWVudCA9IFN0b21wLm92ZXIod3MpO1xyXG4gICAgICAgIC8vIHRoaXMuX3N0b21wQ2xpZW50LmRlYnVnID0gKHN0cikgPT4gY29uc29sZS5sb2cobmV3IERhdGUoKS50b0lTT1N0cmluZygpLCBzdHIpO1xyXG4gICAgICAgIHRoaXMuX3N0b21wQ2xpZW50LmRlYnVnID0gKCkgPT4ge307IC8vIFBhcmEgcmVtb3ZlciBvcyBsb2dzLlxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSByZWNvbm5lY3QoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGVkKSB0aGlzLl9zdG9tcENsaWVudC5kaXNjb25uZWN0KCk7XHJcblxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5nZXRPYnNlcnZlcnNDb3VudCgpID09PSAwKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5mb2N1c2VkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3QoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVjb25uZWN0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCBXZWJzb2NrZXRTZXJ2aWNlLlJFQ09OTkVDVF9USU1FUik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIHJlY29ubmVjdFByaW1pdGl2ZXMoKTogdm9pZCB7XHJcbiAgICAgICAgZm9yIChjb25zdCBwcmltaXRpdmVNYW5hZ2VyIG9mIHRoaXMucHJpbWl0aXZlTWFuYWdlcnMudmFsdWVzKCkpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBzdG9tcFN1YnNjcmlwdGlvbiBvZiBwcmltaXRpdmVNYW5hZ2VyLnN0b21wU3Vic2NyaXB0aW9ucykge1xyXG4gICAgICAgICAgICAgICAgc3RvbXBTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5jcmVhdGVTdG9tcFN1YnNjcmlwdGlvbnMocHJpbWl0aXZlTWFuYWdlcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSBnZXRPYnNlcnZlcnNDb3VudCgpOiBudW1iZXIge1xyXG4gICAgICAgIGxldCBvYnNlcnZlcnNDb3VudCA9IDA7XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgcHJpbWl0aXZlTWFuYWdlciBvZiB0aGlzLnByaW1pdGl2ZU1hbmFnZXJzLnZhbHVlcygpKSB7XHJcbiAgICAgICAgICAgIG9ic2VydmVyc0NvdW50ICs9IHByaW1pdGl2ZU1hbmFnZXIuZXZlbnQkLm9ic2VydmVycy5sZW5ndGg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gb2JzZXJ2ZXJzQ291bnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIGRpc2Nvbm5lY3RQcmltaXRpdmVPbkZpbmFsaXplKHByaW1pdGl2ZU1hbmFnZXI6IFByaW1pdGl2ZU1hbmFnZXIpOiB2b2lkIHtcclxuICAgICAgICAvLyBASU1QT1JUQU5UOiBSZXBsYWNlIC5vYnNlcnZlcnMubGVuZ3RoID09PSAxIHdpdGggLm9ic2VydmVkIGluIHJ4anMgNy4wK1xyXG4gICAgICAgIGNvbnN0IGhhc09ic2VydmVycyA9ICEocHJpbWl0aXZlTWFuYWdlci5ldmVudCQub2JzZXJ2ZXJzLmxlbmd0aCA9PT0gMSk7XHJcblxyXG4gICAgICAgIGlmIChoYXNPYnNlcnZlcnMpIHJldHVybjtcclxuXHJcbiAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5ldmVudCQuY29tcGxldGUoKTtcclxuICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnN1YnNjcmliZSQuY29tcGxldGUoKTtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBzdG9tcFN1YnNjcmlwdGlvbiBvZiBwcmltaXRpdmVNYW5hZ2VyLnN0b21wU3Vic2NyaXB0aW9ucykge1xyXG4gICAgICAgICAgICBzdG9tcFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRQcmltaXRpdmVNYW5hZ2VyS2V5KHByaW1pdGl2ZU1hbmFnZXIuZG9tYWluLCBwcmltaXRpdmVNYW5hZ2VyLnNlcnZpY2UsIHByaW1pdGl2ZU1hbmFnZXIucHJpbWl0aXZlKTtcclxuXHJcbiAgICAgICAgdGhpcy5wcmltaXRpdmVNYW5hZ2Vycy5kZWxldGUoa2V5KTtcclxuXHJcbiAgICAgICAgdGhpcy5kaXNjb25uZWN0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIGdldFByaW1pdGl2ZU1hbmFnZXJLZXkoZG9tYWluOiBzdHJpbmcsIHNlcnZpY2U6IHN0cmluZywgcHJpbWl0aXZlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBgJHtkb21haW59LyR7c2VydmljZX0vJHtwcmltaXRpdmV9YDtcclxuICAgIH1cclxufVxyXG4iXX0=
|
|
339
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac2VuaW9yLWdlc3Rhby1lbXByZXNhcmlhbC9hbmd1bGFyLWNvbXBvbmVudHMvIiwic291cmNlcyI6WyJjb21wb25lbnRzL3dlYnNvY2tldC93ZWJzb2NrZXQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBR0gsS0FBSyxFQUVSLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxLQUFLLE9BQU8sTUFBTSxXQUFXLENBQUM7QUFDckMsT0FBTyxFQUVILE9BQU8sRUFDUCxTQUFTLEVBQ1QsR0FBRyxFQUNILEVBQUUsRUFDRixJQUFJLEVBQ0osS0FBSyxFQUNSLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0UsT0FBTyxLQUFLLE1BQU0sTUFBTSxlQUFlLENBQUM7O0FBZXhDO0lBb0RJO1FBN0JBLGVBQWU7UUFDUCxpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUU3QixlQUFlO1FBQ1AsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFFNUIsZUFBZTtRQUNQLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBRTdCLGVBQWU7UUFDRSxzQkFBaUIsR0FBa0MsSUFBSSxHQUFHLEVBR3hFLENBQUM7UUFFSixlQUFlO1FBQ1AsYUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFFdkMsZUFBZTtRQUNQLGdCQUFXLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUUxQyxlQUFlO1FBQ1AsZUFBVSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFFekMsZUFBZTtRQUNQLFdBQU0sR0FBRyxJQUFJLE9BQU8sRUFBYSxDQUFDO1FBRXpCLGVBQVUsR0FBRyxJQUFJLE9BQU8sRUFBb0IsQ0FBQztRQUcxRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbkIsQ0FBQzt5QkF0RFEsZ0JBQWdCO0lBd0R6Qjs7O09BR0c7SUFDSSxvQ0FBUyxHQUFoQjtRQUNJLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3ZDLE9BQU8sRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN0QztRQUVELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVEOzs7T0FHRztJQUNJLHVDQUFZLEdBQW5CO1FBQ0ksT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzNDLENBQUM7SUFFRDs7O09BR0c7SUFDSSxzQ0FBVyxHQUFsQjtRQUNJLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksc0NBQVcsR0FBbEIsVUFBbUIsRUFRbEI7UUFSRCxpQkErQkM7WUE5Qkcsa0JBQU0sRUFDTixvQkFBTyxFQUNQLHdCQUFTO1FBTVQsSUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFcEUsT0FBTyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsSUFBSSxDQUN4QixTQUFTLENBQ0w7WUFDSSxPQUFBLEtBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO2dCQUMvQixLQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFlBQVk7Z0JBQ3hDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMxQixDQUFDLENBQUMsS0FBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQ2hCLE1BQU0sQ0FDRixVQUFDLGdCQUFnQjtvQkFDYixPQUFBLEtBQUksQ0FBQyxzQkFBc0IsQ0FDdkIsZ0JBQWdCLENBQUMsTUFBTSxFQUN2QixnQkFBZ0IsQ0FBQyxPQUFPLEVBQ3hCLGdCQUFnQixDQUFDLFNBQVMsQ0FDN0IsS0FBSyxHQUFHO2dCQUpULENBSVMsQ0FDaEIsRUFDRCxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQ1AsR0FBRyxDQUFDLGNBQU0sT0FBQSxLQUFLLENBQUMsRUFBTixDQUFNLENBQUMsQ0FDcEI7UUFkUCxDQWNPLENBQ2QsQ0FDSixDQUFDO0lBQ04sQ0FBQztJQUVEOzs7T0FHRztJQUNJLGtDQUFPLEdBQWQ7UUFDSSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEMsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSSxrQ0FBTyxHQUFkLFVBQWtCLE9BSWpCO1FBSkQsaUJBbURDO1FBOUNXLElBQUEsdUJBQU0sRUFBRSx5QkFBTyxFQUFFLDZCQUFTLENBQWE7UUFFL0MsSUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFcEUsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ2pDLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7U0FDaEU7UUFFRCxJQUFNLGdCQUFnQixHQUFxQjtZQUN2QyxNQUFNLEVBQUUsTUFBTTtZQUNkLE9BQU8sRUFBRSxPQUFPO1lBQ2hCLFNBQVMsRUFBRSxTQUFTO1lBQ3BCLGtCQUFrQixFQUFFLEVBQUU7WUFDdEIsTUFBTSxFQUFFLElBQUksT0FBTyxFQUFLO1lBQ3hCLFlBQVksRUFBRSxLQUFLO1NBQ3RCLENBQUM7UUFFRixJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBRWxELElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNsQixJQUFJLENBQUMsd0JBQXdCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUVoRCxPQUFPLGdCQUFnQixDQUFDLE1BQU07aUJBQ3pCLFlBQVksRUFBRTtpQkFDZCxJQUFJLENBQ0QsUUFBUSxDQUFDO2dCQUNMLE9BQUEsS0FBSSxDQUFDLDZCQUE2QixDQUFDLGdCQUFnQixDQUFDO1lBQXBELENBQW9ELENBQ3ZELENBQ0osQ0FBQztTQUNUO2FBQU07WUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDcEIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2FBQ2xCO1lBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUM7Z0JBQ2xDLEtBQUksQ0FBQyx3QkFBd0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3BELENBQUMsQ0FBQyxDQUFDO1lBRUgsT0FBTyxnQkFBZ0IsQ0FBQyxNQUFNO2lCQUN6QixZQUFZLEVBQUU7aUJBQ2QsSUFBSSxDQUNELFFBQVEsQ0FBQztnQkFDTCxPQUFBLEtBQUksQ0FBQyw2QkFBNkIsQ0FBQyxnQkFBZ0IsQ0FBQztZQUFwRCxDQUFvRCxDQUN2RCxDQUNKLENBQUM7U0FDVDtJQUNMLENBQUM7SUFFRCxlQUFlO0lBQ1AsbURBQXdCLEdBQWhDLFVBQWlDLGdCQUFrQztRQUMvRCxJQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsMkJBQTJCLENBQ2pELGdCQUFnQixDQUFDLE1BQU0sRUFDdkIsZ0JBQWdCLENBQUMsT0FBTyxFQUN4QixnQkFBZ0IsQ0FBQyxTQUFTLENBQzdCLENBQUM7UUFFRixJQUFNLDBCQUEwQixHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FDM0QsWUFBWSxFQUNaLGdCQUFnQixDQUNuQixDQUFDO1FBRUYsSUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLDhCQUE4QixDQUN2RCxnQkFBZ0IsQ0FBQyxNQUFNLEVBQ3ZCLGdCQUFnQixDQUFDLE9BQU8sRUFDeEIsZ0JBQWdCLENBQUMsU0FBUyxDQUM3QixDQUFDO1FBRUYsSUFBTSw2QkFBNkIsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQzlELGVBQWUsRUFDZixnQkFBZ0IsQ0FDbkIsQ0FBQztRQUVGLGdCQUFnQixDQUFDLGtCQUFrQixHQUFHO1lBQ2xDLDBCQUEwQjtZQUMxQiw2QkFBNkI7U0FDaEMsQ0FBQztRQUVGLGdCQUFnQixDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDckMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQsZUFBZTtJQUNQLGtDQUFPLEdBQWY7UUFBQSxpQkEyREM7UUExREcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFekIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFFekIsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQ3JCLEVBQUUsRUFDRjtZQUNJLEtBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1lBRTFCLEtBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1lBRXhCLElBQUksS0FBSSxDQUFDLFlBQVksRUFBRTtnQkFDbkIsS0FBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7Z0JBRTNCLEtBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3JCLEtBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7YUFDMUI7aUJBQU07Z0JBQ0gsS0FBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7Z0JBQ3pCLEtBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7YUFDeEI7UUFDTCxDQUFDLEVBQ0QsVUFBQyxLQUFnQjtZQUNiLEtBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1lBRXpCLEtBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRXhCLElBQUksQ0FDQSxLQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FDakIsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUNQLEdBQUcsQ0FBQyxjQUFNLE9BQUEsQ0FBQyxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUEzQixDQUEyQixDQUFDLENBQ3pDLEVBQ0QsS0FBSyxDQUFDLGtCQUFnQixDQUFDLGtCQUFrQixDQUFDLENBQUMsSUFBSSxDQUMzQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQ1AsU0FBUyxDQUFDO2dCQUNOLE9BQUEsR0FBRyxDQUNDLGNBQU0sT0FBQSxRQUFRLENBQUMsTUFBTSxFQUFmLENBQWUsRUFDckIsU0FBUyxDQUFDLFFBQVEsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLElBQUksQ0FDeEMsS0FBSyxFQUFFLENBQ1YsRUFDRCxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FDYjtZQU5ELENBTUMsQ0FDSixFQUNELEdBQUcsQ0FBQyxjQUFNLE9BQUEsQ0FBQyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUE1QixDQUE0QixDQUFDLENBQzFDLENBQ0o7aUJBQ0ksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDYixTQUFTLENBQUM7Z0JBQ1AsSUFBSSxFQUFFLFVBQUMsRUFBbUI7d0JBQWpCLG9DQUFlO29CQUNwQixJQUNJLENBQUMsZUFBZTt3QkFDaEIsQ0FBQyxDQUFDLEtBQUksQ0FBQyxXQUFXLElBQUksS0FBSSxDQUFDLFlBQVksQ0FBQyxFQUMxQzt3QkFDRSxLQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7cUJBQ2xCO2dCQUNMLENBQUM7YUFDSixDQUFDLENBQUM7UUFDWCxDQUFDLENBQ0osQ0FBQztJQUNOLENBQUM7SUFFTSxxQ0FBVSxHQUFqQjs7UUFDSSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLENBQUMsRUFBRTtZQUM5QixPQUFPO1NBQ1Y7O1lBRUQsS0FBK0IsSUFBQSxLQUFBLFNBQUEsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxDQUFBLGdCQUFBLDRCQUFFO2dCQUEzRCxJQUFNLGdCQUFnQixXQUFBOztvQkFDdkIsS0FBZ0MsSUFBQSxvQkFBQSxTQUFBLGdCQUFnQixDQUFDLGtCQUFrQixDQUFBLENBQUEsZ0JBQUEsNEJBQUU7d0JBQWhFLElBQU0saUJBQWlCLFdBQUE7d0JBQ3hCLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxDQUFDO3FCQUNuQzs7Ozs7Ozs7O2FBQ0o7Ozs7Ozs7Ozs7WUFFRCxLQUErQixJQUFBLEtBQUEsU0FBQSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLENBQUEsZ0JBQUEsNEJBQUU7Z0JBQTNELElBQU0sZ0JBQWdCLFdBQUE7Z0JBQ3ZCLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQzthQUN0Qzs7Ozs7Ozs7O1FBRUQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxDQUFDO1FBRS9CLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUUvQixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN6QixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUMxQixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUUxQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxlQUFlO0lBQ1Asc0RBQTJCLEdBQW5DLFVBQ0ksTUFBYyxFQUNkLE9BQWUsRUFDZixTQUFpQjtRQUVqQixJQUFNLE1BQU0sR0FBRyxrQkFBZ0IsQ0FBQyxLQUFLO1lBQ2pDLENBQUMsQ0FBQyxrQkFBZ0IsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0MsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNYLElBQU0sS0FBSyxHQUFHLGtCQUFnQixDQUFDLEtBQUs7WUFDaEMsQ0FBQyxDQUFDLGtCQUFnQixDQUFDLEtBQUssQ0FBQyxZQUFZO1lBQ3JDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFFWCxPQUFPLFlBQVUsTUFBTSxTQUFJLEtBQUssU0FBSSxNQUFNLFNBQUksT0FBTyxTQUFJLFNBQVcsQ0FBQztJQUN6RSxDQUFDO0lBRUQsZUFBZTtJQUNQLHlEQUE4QixHQUF0QyxVQUNJLE1BQWMsRUFDZCxPQUFlLEVBQ2YsU0FBaUI7UUFFakIsSUFBTSxNQUFNLEdBQUcsa0JBQWdCLENBQUMsS0FBSztZQUNqQyxDQUFDLENBQUMsa0JBQWdCLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9DLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFFWCxPQUFPLFlBQVUsTUFBTSxTQUFJLE1BQU0sU0FBSSxPQUFPLFNBQUksU0FBVyxDQUFDO0lBQ2hFLENBQUM7SUFFRCxlQUFlO0lBQ1Asa0RBQXVCLEdBQS9CLFVBQ0ksV0FBbUIsRUFDbkIsZ0JBQWtDO1FBRWxDLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLFVBQUMsT0FBWTtZQUN6RCxJQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLENBQUM7WUFFL0MsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxlQUFlO0lBQ1AsNENBQWlCLEdBQXpCO1FBQ0ksSUFBTSxFQUFFLEdBQUcsSUFBSSxNQUFNLENBQ2Qsa0JBQWdCLENBQUMsYUFBYSxpQkFBYyxFQUMvQyxJQUFJLEVBQ0osRUFBRSxPQUFPLEVBQUUsa0JBQWdCLENBQUMsa0JBQWtCLEVBQUUsQ0FDbkQsQ0FBQztRQUNGLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssR0FBRyxjQUFNLE9BQUEsSUFBSSxFQUFKLENBQUksQ0FBQztJQUN6QyxDQUFDO0lBRUQsZUFBZTtJQUNQLDhDQUFtQixHQUEzQjs7O1lBQ0ksS0FBK0IsSUFBQSxLQUFBLFNBQUEsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxDQUFBLGdCQUFBLDRCQUFFO2dCQUEzRCxJQUFNLGdCQUFnQixXQUFBO2dCQUN2QixJQUFJLENBQUMsd0JBQXdCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQzthQUNuRDs7Ozs7Ozs7O0lBQ0wsQ0FBQztJQUVELGVBQWU7SUFDUCw0Q0FBaUIsR0FBekI7O1FBQ0ksSUFBSSxjQUFjLEdBQUcsQ0FBQyxDQUFDOztZQUV2QixLQUErQixJQUFBLEtBQUEsU0FBQSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLENBQUEsZ0JBQUEsNEJBQUU7Z0JBQTNELElBQU0sZ0JBQWdCLFdBQUE7Z0JBQ3ZCLGNBQWMsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQzthQUM5RDs7Ozs7Ozs7O1FBRUQsT0FBTyxjQUFjLENBQUM7SUFDMUIsQ0FBQztJQUVELGVBQWU7SUFDUCx3REFBNkIsR0FBckMsVUFDSSxnQkFBa0M7O1FBRWxDLDBFQUEwRTtRQUMxRSxJQUFNLFlBQVksR0FBRyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFFdkUsSUFBSSxZQUFZO1lBQUUsT0FBTztRQUV6QixnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7O1lBRW5DLEtBQWdDLElBQUEsS0FBQSxTQUFBLGdCQUFnQixDQUFDLGtCQUFrQixDQUFBLGdCQUFBLDRCQUFFO2dCQUFoRSxJQUFNLGlCQUFpQixXQUFBO2dCQUN4QixpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQzthQUNuQzs7Ozs7Ozs7O1FBRUQsSUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUNuQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQ3ZCLGdCQUFnQixDQUFDLE9BQU8sRUFDeEIsZ0JBQWdCLENBQUMsU0FBUyxDQUM3QixDQUFDO1FBRUYsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVuQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELGVBQWU7SUFDUCxpREFBc0IsR0FBOUIsVUFDSSxNQUFjLEVBQ2QsT0FBZSxFQUNmLFNBQWlCO1FBRWpCLE9BQVUsTUFBTSxTQUFJLE9BQU8sU0FBSSxTQUFXLENBQUM7SUFDL0MsQ0FBQzs7SUE5WmUsbUNBQWtCLEdBQUcsSUFBSSxDQUFDO0lBRW5DLG1DQUFrQixHQUFHLEtBQUssQ0FBQztJQUVsQyxlQUFlO0lBQ0EsZ0NBQWUsR0FBRyxxQkFBcUIsQ0FBQztJQUV2RCxlQUFlO0lBQ0EsNkJBQVksR0FBRyxrQkFBa0IsQ0FBQztJQUVqRCxlQUFlO0lBQ0Esc0JBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUM3QixPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFnQixDQUFDLFlBQVksQ0FBQyxJQUFJLElBQUksQ0FDckQsQ0FBQztJQUVGLGVBQWU7SUFDQSw4QkFBYSxHQUN4QixPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFnQixDQUFDLGVBQWUsQ0FBQyxHQUFHLGFBQWEsQ0FBQzs7SUFsQnpELGdCQUFnQjtRQUg1QixVQUFVLENBQUM7WUFDUixVQUFVLEVBQUUsTUFBTTtTQUNyQixDQUFDO09BQ1csZ0JBQWdCLENBZ2E1QjsyQkFqY0Q7Q0FpY0MsQUFoYUQsSUFnYUM7U0FoYVksZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gICAgQ29tcGF0Q2xpZW50LFxyXG4gICAgRnJhbWVJbXBsLFxyXG4gICAgU3RvbXAsXHJcbiAgICBTdG9tcFN1YnNjcmlwdGlvblxyXG59IGZyb20gJ0BzdG9tcC9zdG9tcGpzJztcclxuaW1wb3J0ICogYXMgQ29va2llcyBmcm9tICdqcy1jb29raWUnO1xyXG5pbXBvcnQge1xyXG4gICAgT2JzZXJ2YWJsZSxcclxuICAgIFN1YmplY3QsXHJcbiAgICBmcm9tRXZlbnQsXHJcbiAgICBpaWYsXHJcbiAgICBvZixcclxuICAgIHJhY2UsXHJcbiAgICB0aW1lclxyXG59IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBmaWx0ZXIsIGZpbmFsaXplLCBmaXJzdCwgbWFwLCBzd2l0Y2hNYXAsIHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCAqIGFzIFNvY2tKUyBmcm9tICdzb2NranMtY2xpZW50JztcclxuXHJcbi8qKiBAcHJpdmF0ZSAqL1xyXG5pbnRlcmZhY2UgUHJpbWl0aXZlTWFuYWdlciB7XHJcbiAgICBkb21haW46IHN0cmluZztcclxuICAgIHNlcnZpY2U6IHN0cmluZztcclxuICAgIHByaW1pdGl2ZTogc3RyaW5nO1xyXG4gICAgc3RvbXBTdWJzY3JpcHRpb25zOiBTdG9tcFN1YnNjcmlwdGlvbltdO1xyXG4gICAgZXZlbnQkOiBTdWJqZWN0PGFueT47XHJcbiAgICBpc1N1YnNjcmliZWQ6IGJvb2xlYW47XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgV2Vic29ja2V0U2VydmljZSB7XHJcbiAgICBzdGF0aWMgcmVhZG9ubHkgUkVDT05ORUNUX0lOVEVSVkFMID0gMzAwMDtcclxuXHJcbiAgICBzdGF0aWMgQ09OTkVDVElPTl9USU1FT1VUID0gMTUwMDA7XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIHN0YXRpYyBCQVNFX1VSTF9DT09LSUUgPSAnY29tLnNlbmlvci5iYXNlLnVybCc7XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIHN0YXRpYyBUT0tFTl9DT09LSUUgPSAnY29tLnNlbmlvci50b2tlbic7XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIHN0YXRpYyBUT0tFTiA9IEpTT04ucGFyc2UoXHJcbiAgICAgICAgQ29va2llcy5nZXQoV2Vic29ja2V0U2VydmljZS5UT0tFTl9DT09LSUUpIHx8ICd7fSdcclxuICAgICk7XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIHN0YXRpYyBXRUJTT0NLRVRfVVJMID1cclxuICAgICAgICBDb29raWVzLmdldChXZWJzb2NrZXRTZXJ2aWNlLkJBU0VfVVJMX0NPT0tJRSkgKyAnL3dlYnNvY2tldC8nO1xyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSBfc3RvbXBDbGllbnQ6IENvbXBhdENsaWVudDtcclxuXHJcbiAgICAvKiogQHByaXZhdGUgKi9cclxuICAgIHByaXZhdGUgd2FzQ29ubmVjdGVkID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIGlzQ29ubmVjdGVkID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIGlzQ29ubmVjdGluZyA9IGZhbHNlO1xyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBwcmltaXRpdmVNYW5hZ2VyczogTWFwPHN0cmluZywgUHJpbWl0aXZlTWFuYWdlcj4gPSBuZXcgTWFwPFxyXG4gICAgICAgIHN0cmluZyxcclxuICAgICAgICBQcmltaXRpdmVNYW5hZ2VyXHJcbiAgICA+KCk7XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIGNvbm5lY3QkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgICAvKiogQHByaXZhdGUgKi9cclxuICAgIHByaXZhdGUgZGlzY29ubmVjdCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSByZWNvbm5lY3QkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgICAvKiogQHByaXZhdGUgKi9cclxuICAgIHByaXZhdGUgZXJyb3IkID0gbmV3IFN1YmplY3Q8RnJhbWVJbXBsPigpO1xyXG5cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3Vic2NyaWJlJCA9IG5ldyBTdWJqZWN0PFByaW1pdGl2ZU1hbmFnZXI+KCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5jb25uZWN0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnNlcnZhYmxlIHJlc3BvbnPDoXZlbCBwb3IgZW1pdGlyIHVtYSBub3RpZmljYcOnw6NvIHF1YW5kbyBhIGNvbmV4w6NvIHdlYnNvY2tldCDDqSBlc3RhYmVsZWNpZGEgcGVsYSBwcmltZWlyYSB2ZXouXHJcbiAgICAgKiBAcmV0dXJuIFVtIGBPYnNlcnZhYmxlPHZvaWQ+YCBxdWUgZW1pdGUgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIGEgY29uZXjDo28gd2Vic29ja2V0IMOpIGVzdGFiZWxlY2lkYSBwZWxhIHByaW1laXJhIHZlei5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uQ29ubmVjdCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICAgICAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCB8fCB0aGlzLndhc0Nvbm5lY3RlZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gb2YodW5kZWZpbmVkKS5waXBlKHRha2UoMSkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdCQuYXNPYnNlcnZhYmxlKCkucGlwZSh0YWtlKDEpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9ic2VydmFibGUgcmVzcG9uc8OhdmVsIHBvciBlbWl0aXIgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIGEgY29uZXjDo28gw6kgZGVzY29uZWN0YWRhLlxyXG4gICAgICogQHJldHVybiBVbSBgT2JzZXJ2YWJsZTx2b2lkPmAgcXVlIGVtaXRlIHVtYSBub3RpZmljYcOnw6NvIHF1YW5kbyBhIGNvbmV4w6NvIMOpIGRlc2NvbmVjdGFkYS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uRGlzY29ubmVjdCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kaXNjb25uZWN0JC5hc09ic2VydmFibGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9ic2VydmFibGUgcmVzcG9uc8OhdmVsIHBvciBlbWl0aXIgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIGEgY29uZXjDo28gw6kgcmVjb25lY3RhZGEuXHJcbiAgICAgKiBAcmV0dXJuIFVtIGBPYnNlcnZhYmxlPHZvaWQ+YCBxdWUgZW1pdGUgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIGEgY29uZXjDo28gw6kgcmVjb25lY3RhZGEuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvblJlY29ubmVjdCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yZWNvbm5lY3QkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2JzZXJ2YWJsZSByZXNwb25zw6F2ZWwgcG9yIGVtaXRpciB1bWEgbm90aWZpY2HDp8OjbyBhcMOzcyBvIHN1YnNjcmliZSBkbyBldmVudG8gcGVsYSBwcmltZWlyYSB2ZXouXHJcbiAgICAgKiBAcmV0dXJuIFVtIGBPYnNlcnZhYmxlPHZvaWQ+YCBxdWUgZW1pdGUgdW1hIG5vdGlmaWNhw6fDo28gYXDDs3MgbyBzdWJzY3JpYmUgZG8gZXZlbnRvIHBlbGEgcHJpbWVpcmEgdmV6LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25TdWJzY3JpYmUoe1xyXG4gICAgICAgIGRvbWFpbixcclxuICAgICAgICBzZXJ2aWNlLFxyXG4gICAgICAgIHByaW1pdGl2ZVxyXG4gICAgfToge1xyXG4gICAgICAgIGRvbWFpbjogc3RyaW5nO1xyXG4gICAgICAgIHNlcnZpY2U6IHN0cmluZztcclxuICAgICAgICBwcmltaXRpdmU6IHN0cmluZztcclxuICAgIH0pOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmdldFByaW1pdGl2ZU1hbmFnZXJLZXkoZG9tYWluLCBzZXJ2aWNlLCBwcmltaXRpdmUpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5vbkNvbm5lY3QoKS5waXBlKFxyXG4gICAgICAgICAgICBzd2l0Y2hNYXAoXHJcbiAgICAgICAgICAgICAgICAoKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJpbWl0aXZlTWFuYWdlcnMuaGFzKGtleSkgJiZcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByaW1pdGl2ZU1hbmFnZXJzLmdldChrZXkpLmlzU3Vic2NyaWJlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA/IG9mKHZvaWQgMCkucGlwZSh0YWtlKDEpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuc3Vic2NyaWJlJC5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJpbWl0aXZlTWFuYWdlcikgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFByaW1pdGl2ZU1hbmFnZXJLZXkoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIuZG9tYWluLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIucHJpbWl0aXZlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSA9PT0ga2V5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2UoMSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcCgoKSA9PiB2b2lkIDApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9ic2VydmFibGUgcmVzcG9uc8OhdmVsIHBvciBlbWl0aXIgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIG9jb3JyZSBhbGd1bSBlcnJvLlxyXG4gICAgICogQHJldHVybiBVbSBgT2JzZXJ2YWJsZTxGcmFtZUltcGw+YCBxdWUgZW1pdGUgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIG9jb3JyZSBhbGd1bSBlcnJvLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25FcnJvcigpOiBPYnNlcnZhYmxlPEZyYW1lSW1wbD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmVycm9yJC5hc09ic2VydmFibGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEB0eXBlUGFyYW0gYDxUPmAgVGlwbyBkbyBvYmpldG8gcXVlIG8gcmV0b3JubyBkbyBgb2JzZXJ2YWJsZWAgdmFpIGRldm9sdmVyLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgT2JqZXRvIGRlIGNvbmZpZ3VyYcOnw6NvIGRvIGV2ZW50by5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLmRvbWFpbiBEb23DrW5pbyBkYSBwcmltaXRpdmEuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5zZXJ2aWNlIFNlcnZpw6dvIGRhIHByaW1pdGl2YS5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLnByaW1pdGl2ZSAgUHJpbWl0aXZhIHF1ZSBzZXLDoSBcIm9ic2VydmFkYVwiLlxyXG4gICAgICogQHJldHVybiBVbSBPYnNlcnZhYmxlPFQ+IHF1ZSBlbWl0ZSBub3RpZmljYcOnw7VlcyB0b2RhIHZleiBxdWUgbyByZXNwZWN0aXZvIGV2ZW50byDDqSBwdWJsaWNhZG8uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbkV2ZW50PFQ+KG9wdGlvbnM6IHtcclxuICAgICAgICBkb21haW46IHN0cmluZztcclxuICAgICAgICBzZXJ2aWNlOiBzdHJpbmc7XHJcbiAgICAgICAgcHJpbWl0aXZlOiBzdHJpbmc7XHJcbiAgICB9KTogT2JzZXJ2YWJsZTxUPiB7XHJcbiAgICAgICAgY29uc3QgeyBkb21haW4sIHNlcnZpY2UsIHByaW1pdGl2ZSB9ID0gb3B0aW9ucztcclxuXHJcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRQcmltaXRpdmVNYW5hZ2VyS2V5KGRvbWFpbiwgc2VydmljZSwgcHJpbWl0aXZlKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMucHJpbWl0aXZlTWFuYWdlcnMuaGFzKGtleSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJpbWl0aXZlTWFuYWdlcnMuZ2V0KGtleSkuZXZlbnQkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgcHJpbWl0aXZlTWFuYWdlcjogUHJpbWl0aXZlTWFuYWdlciA9IHtcclxuICAgICAgICAgICAgZG9tYWluOiBkb21haW4sXHJcbiAgICAgICAgICAgIHNlcnZpY2U6IHNlcnZpY2UsXHJcbiAgICAgICAgICAgIHByaW1pdGl2ZTogcHJpbWl0aXZlLFxyXG4gICAgICAgICAgICBzdG9tcFN1YnNjcmlwdGlvbnM6IFtdLFxyXG4gICAgICAgICAgICBldmVudCQ6IG5ldyBTdWJqZWN0PFQ+KCksXHJcbiAgICAgICAgICAgIGlzU3Vic2NyaWJlZDogZmFsc2VcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLnByaW1pdGl2ZU1hbmFnZXJzLnNldChrZXksIHByaW1pdGl2ZU1hbmFnZXIpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVN0b21wU3Vic2NyaXB0aW9ucyhwcmltaXRpdmVNYW5hZ2VyKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBwcmltaXRpdmVNYW5hZ2VyLmV2ZW50JFxyXG4gICAgICAgICAgICAgICAgLmFzT2JzZXJ2YWJsZSgpXHJcbiAgICAgICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgICAgICBmaW5hbGl6ZSgoKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc2Nvbm5lY3RQcmltaXRpdmVPbkZpbmFsaXplKHByaW1pdGl2ZU1hbmFnZXIpXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNDb25uZWN0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3QoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5jb25uZWN0JC5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVN0b21wU3Vic2NyaXB0aW9ucyhwcmltaXRpdmVNYW5hZ2VyKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gcHJpbWl0aXZlTWFuYWdlci5ldmVudCRcclxuICAgICAgICAgICAgICAgIC5hc09ic2VydmFibGUoKVxyXG4gICAgICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgZmluYWxpemUoKCkgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNjb25uZWN0UHJpbWl0aXZlT25GaW5hbGl6ZShwcmltaXRpdmVNYW5hZ2VyKVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVTdG9tcFN1YnNjcmlwdGlvbnMocHJpbWl0aXZlTWFuYWdlcjogUHJpbWl0aXZlTWFuYWdlcik6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHdpdGhUb2tlblVybCA9IHRoaXMuZ2V0U3Vic2NyaXB0aW9uVXJsV2l0aFRva2VuKFxyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLmRvbWFpbixcclxuICAgICAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5zZXJ2aWNlLFxyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnByaW1pdGl2ZVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGNvbnN0IHN0b21wU3Vic2NyaXB0aW9uV2l0aFRva2VuID0gdGhpcy5jcmVhdGVTdG9tcFN1YnNjcmlwdGlvbihcclxuICAgICAgICAgICAgd2l0aFRva2VuVXJsLFxyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgY29uc3Qgd2l0aG91dFRva2VuVXJsID0gdGhpcy5nZXRTdWJzY3JpcHRpb25VcmxXaXRob3V0VG9rZW4oXHJcbiAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIuZG9tYWluLFxyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnNlcnZpY2UsXHJcbiAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIucHJpbWl0aXZlXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgY29uc3Qgc3RvbXBTdWJzY3JpcHRpb25XaXRob3V0VG9rZW4gPSB0aGlzLmNyZWF0ZVN0b21wU3Vic2NyaXB0aW9uKFxyXG4gICAgICAgICAgICB3aXRob3V0VG9rZW5VcmwsXHJcbiAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXJcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnN0b21wU3Vic2NyaXB0aW9ucyA9IFtcclxuICAgICAgICAgICAgc3RvbXBTdWJzY3JpcHRpb25XaXRoVG9rZW4sXHJcbiAgICAgICAgICAgIHN0b21wU3Vic2NyaXB0aW9uV2l0aG91dFRva2VuXHJcbiAgICAgICAgXTtcclxuXHJcbiAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5pc1N1YnNjcmliZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuc3Vic2NyaWJlJC5uZXh0KHByaW1pdGl2ZU1hbmFnZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSBjb25uZWN0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY3JlYXRlU3RvbXBDbGllbnQoKTtcclxuXHJcbiAgICAgICAgdGhpcy5pc0Nvbm5lY3RpbmcgPSB0cnVlO1xyXG5cclxuICAgICAgICB0aGlzLl9zdG9tcENsaWVudC5jb25uZWN0KFxyXG4gICAgICAgICAgICB7fSxcclxuICAgICAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc0Nvbm5lY3RpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzQ29ubmVjdGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy53YXNDb25uZWN0ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlY29ubmVjdFByaW1pdGl2ZXMoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0JC5uZXh0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWNvbm5lY3QkLm5leHQoKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53YXNDb25uZWN0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdCQubmV4dCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAoZXJyb3I6IEZyYW1lSW1wbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc0Nvbm5lY3RlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IkLm5leHQoZXJyb3IpO1xyXG5cclxuICAgICAgICAgICAgICAgIHJhY2UoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNjb25uZWN0JC5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWtlKDEpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAoKCkgPT4gKHsgd2FzRGlzY29ubmVjdGVkOiB0cnVlIH0pKVxyXG4gICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgdGltZXIoV2Vic29ja2V0U2VydmljZS5SRUNPTk5FQ1RfSU5URVJWQUwpLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRha2UoMSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWlmKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpID0+IGRvY3VtZW50LmhpZGRlbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tRXZlbnQoZG9jdW1lbnQsICd2aXNpYmlsaXR5Y2hhbmdlJykucGlwZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Yodm9pZCAwKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAoKCkgPT4gKHsgd2FzRGlzY29ubmVjdGVkOiBmYWxzZSB9KSlcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgLnBpcGUodGFrZSgxKSlcclxuICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dDogKHsgd2FzRGlzY29ubmVjdGVkIH0pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhd2FzRGlzY29ubmVjdGVkICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgISh0aGlzLmlzQ29ubmVjdGVkIHx8IHRoaXMuaXNDb25uZWN0aW5nKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRpc2Nvbm5lY3QoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuZ2V0T2JzZXJ2ZXJzQ291bnQoKSA+IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBwcmltaXRpdmVNYW5hZ2VyIG9mIHRoaXMucHJpbWl0aXZlTWFuYWdlcnMudmFsdWVzKCkpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBzdG9tcFN1YnNjcmlwdGlvbiBvZiBwcmltaXRpdmVNYW5hZ2VyLnN0b21wU3Vic2NyaXB0aW9ucykge1xyXG4gICAgICAgICAgICAgICAgc3RvbXBTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBwcmltaXRpdmVNYW5hZ2VyIG9mIHRoaXMucHJpbWl0aXZlTWFuYWdlcnMudmFsdWVzKCkpIHtcclxuICAgICAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5ldmVudCQuY29tcGxldGUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucHJpbWl0aXZlTWFuYWdlcnMuY2xlYXIoKTtcclxuXHJcbiAgICAgICAgdGhpcy5fc3RvbXBDbGllbnQuZGlzY29ubmVjdCgpO1xyXG4gICAgICAgIHRoaXMuX3N0b21wQ2xpZW50LmRlYWN0aXZhdGUoKTtcclxuXHJcbiAgICAgICAgdGhpcy5pc0Nvbm5lY3RlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuaXNDb25uZWN0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy53YXNDb25uZWN0ZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdGhpcy5kaXNjb25uZWN0JC5uZXh0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIGdldFN1YnNjcmlwdGlvblVybFdpdGhUb2tlbihcclxuICAgICAgICBkb21haW46IHN0cmluZyxcclxuICAgICAgICBzZXJ2aWNlOiBzdHJpbmcsXHJcbiAgICAgICAgcHJpbWl0aXZlOiBzdHJpbmdcclxuICAgICk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgdGVuYW50ID0gV2Vic29ja2V0U2VydmljZS5UT0tFTlxyXG4gICAgICAgICAgICA/IFdlYnNvY2tldFNlcnZpY2UuVE9LRU4udXNlcm5hbWUuc3BsaXQoJ0AnKVsxXVxyXG4gICAgICAgICAgICA6IG51bGw7XHJcbiAgICAgICAgY29uc3QgdG9rZW4gPSBXZWJzb2NrZXRTZXJ2aWNlLlRPS0VOXHJcbiAgICAgICAgICAgID8gV2Vic29ja2V0U2VydmljZS5UT0tFTi5hY2Nlc3NfdG9rZW5cclxuICAgICAgICAgICAgOiBudWxsO1xyXG5cclxuICAgICAgICByZXR1cm4gYC90b3BpYy8ke3RlbmFudH0vJHt0b2tlbn0vJHtkb21haW59LyR7c2VydmljZX0vJHtwcmltaXRpdmV9YDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQHByaXZhdGUgKi9cclxuICAgIHByaXZhdGUgZ2V0U3Vic2NyaXB0aW9uVXJsV2l0aG91dFRva2VuKFxyXG4gICAgICAgIGRvbWFpbjogc3RyaW5nLFxyXG4gICAgICAgIHNlcnZpY2U6IHN0cmluZyxcclxuICAgICAgICBwcmltaXRpdmU6IHN0cmluZ1xyXG4gICAgKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCB0ZW5hbnQgPSBXZWJzb2NrZXRTZXJ2aWNlLlRPS0VOXHJcbiAgICAgICAgICAgID8gV2Vic29ja2V0U2VydmljZS5UT0tFTi51c2VybmFtZS5zcGxpdCgnQCcpWzFdXHJcbiAgICAgICAgICAgIDogbnVsbDtcclxuXHJcbiAgICAgICAgcmV0dXJuIGAvdG9waWMvJHt0ZW5hbnR9LyR7ZG9tYWlufS8ke3NlcnZpY2V9LyR7cHJpbWl0aXZlfWA7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBwcml2YXRlICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZVN0b21wU3Vic2NyaXB0aW9uKFxyXG4gICAgICAgIGRlc3RpbmF0aW9uOiBzdHJpbmcsXHJcbiAgICAgICAgcHJpbWl0aXZlTWFuYWdlcjogUHJpbWl0aXZlTWFuYWdlclxyXG4gICAgKTogU3RvbXBTdWJzY3JpcHRpb24ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zdG9tcENsaWVudC5zdWJzY3JpYmUoZGVzdGluYXRpb24sIChtZXNzYWdlOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBKU09OLnBhcnNlKG1lc3NhZ2UuYm9keSB8fCAne30nKTtcclxuXHJcbiAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIuZXZlbnQkLm5leHQoZXZlbnQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVTdG9tcENsaWVudCgpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB3cyA9IG5ldyBTb2NrSlMoXHJcbiAgICAgICAgICAgIGAke1dlYnNvY2tldFNlcnZpY2UuV0VCU09DS0VUX1VSTH1zdWJzY3JpcHRpb25gLFxyXG4gICAgICAgICAgICBudWxsLFxyXG4gICAgICAgICAgICB7IHRpbWVvdXQ6IFdlYnNvY2tldFNlcnZpY2UuQ09OTkVDVElPTl9USU1FT1VUIH1cclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMuX3N0b21wQ2xpZW50ID0gU3RvbXAub3Zlcih3cyk7XHJcbiAgICAgICAgdGhpcy5fc3RvbXBDbGllbnQuZGVidWcgPSAoKSA9PiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSByZWNvbm5lY3RQcmltaXRpdmVzKCk6IHZvaWQge1xyXG4gICAgICAgIGZvciAoY29uc3QgcHJpbWl0aXZlTWFuYWdlciBvZiB0aGlzLnByaW1pdGl2ZU1hbmFnZXJzLnZhbHVlcygpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlU3RvbXBTdWJzY3JpcHRpb25zKHByaW1pdGl2ZU1hbmFnZXIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQHByaXZhdGUgKi9cclxuICAgIHByaXZhdGUgZ2V0T2JzZXJ2ZXJzQ291bnQoKTogbnVtYmVyIHtcclxuICAgICAgICBsZXQgb2JzZXJ2ZXJzQ291bnQgPSAwO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IHByaW1pdGl2ZU1hbmFnZXIgb2YgdGhpcy5wcmltaXRpdmVNYW5hZ2Vycy52YWx1ZXMoKSkge1xyXG4gICAgICAgICAgICBvYnNlcnZlcnNDb3VudCArPSBwcmltaXRpdmVNYW5hZ2VyLmV2ZW50JC5vYnNlcnZlcnMubGVuZ3RoO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG9ic2VydmVyc0NvdW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSBkaXNjb25uZWN0UHJpbWl0aXZlT25GaW5hbGl6ZShcclxuICAgICAgICBwcmltaXRpdmVNYW5hZ2VyOiBQcmltaXRpdmVNYW5hZ2VyXHJcbiAgICApOiB2b2lkIHtcclxuICAgICAgICAvLyBASU1QT1JUQU5UOiBSZXBsYWNlIC5vYnNlcnZlcnMubGVuZ3RoID09PSAxIHdpdGggLm9ic2VydmVkIGluIHJ4anMgNy4wK1xyXG4gICAgICAgIGNvbnN0IGhhc09ic2VydmVycyA9ICEocHJpbWl0aXZlTWFuYWdlci5ldmVudCQub2JzZXJ2ZXJzLmxlbmd0aCA9PT0gMSk7XHJcblxyXG4gICAgICAgIGlmIChoYXNPYnNlcnZlcnMpIHJldHVybjtcclxuXHJcbiAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5ldmVudCQuY29tcGxldGUoKTtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBzdG9tcFN1YnNjcmlwdGlvbiBvZiBwcmltaXRpdmVNYW5hZ2VyLnN0b21wU3Vic2NyaXB0aW9ucykge1xyXG4gICAgICAgICAgICBzdG9tcFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRQcmltaXRpdmVNYW5hZ2VyS2V5KFxyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLmRvbWFpbixcclxuICAgICAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5zZXJ2aWNlLFxyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnByaW1pdGl2ZVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHRoaXMucHJpbWl0aXZlTWFuYWdlcnMuZGVsZXRlKGtleSk7XHJcblxyXG4gICAgICAgIHRoaXMuZGlzY29ubmVjdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAcHJpdmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSBnZXRQcmltaXRpdmVNYW5hZ2VyS2V5KFxyXG4gICAgICAgIGRvbWFpbjogc3RyaW5nLFxyXG4gICAgICAgIHNlcnZpY2U6IHN0cmluZyxcclxuICAgICAgICBwcmltaXRpdmU6IHN0cmluZ1xyXG4gICAgKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gYCR7ZG9tYWlufS8ke3NlcnZpY2V9LyR7cHJpbWl0aXZlfWA7XHJcbiAgICB9XHJcbn1cclxuIl19
|