http-request-manager 18.3.2 → 18.4.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/README.md +478 -255
- package/esm2022/lib/http-request-manager.module.mjs +23 -47
- package/esm2022/lib/http-request-services-demo/database-data-demo/database-data-demo.component.mjs +113 -32
- package/esm2022/lib/http-request-services-demo/http-request-services-demo.component.mjs +12 -7
- package/esm2022/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.mjs +3 -6
- package/esm2022/lib/http-request-services-demo/request-manager-ws-demo/models/oidc-client.model.mjs +13 -0
- package/esm2022/lib/http-request-services-demo/request-manager-ws-demo/models/user-data.model.mjs +13 -0
- package/esm2022/lib/http-request-services-demo/request-manager-ws-demo/request-manager-ws-demo.component.mjs +128 -0
- package/esm2022/lib/http-request-services-demo/request-manager-ws-demo/services/state-request.service.mjs +74 -0
- package/esm2022/lib/http-request-services-demo/store-state-manager-demo/models/settings.model.mjs +12 -0
- package/esm2022/lib/http-request-services-demo/store-state-manager-demo/services/settings-state.service.mjs +39 -0
- package/esm2022/lib/http-request-services-demo/store-state-manager-demo/store-state-manager-demo.component.mjs +34 -0
- package/esm2022/lib/models/database-storage.model.mjs +1 -1
- package/esm2022/lib/services/database-manager-service/database.manager.service.mjs +171 -0
- package/esm2022/lib/services/database-manager-service/db.storage.service.mjs +183 -0
- package/esm2022/lib/services/database-manager-service/index.mjs +4 -0
- package/esm2022/lib/services/database-manager-service/models/table-schema.mjs +19 -0
- package/esm2022/lib/services/index.mjs +1 -2
- package/esm2022/lib/services/local-storage-manager-service/local-storage-manager.service.mjs +7 -1
- package/esm2022/lib/services/local-storage-manager-service/models/storage-option.model.mjs +4 -3
- package/esm2022/lib/services/request-manager-services/request.service.mjs +2 -2
- package/esm2022/lib/services/request-manager-state-service/http-manager-state.store.mjs +272 -84
- package/esm2022/lib/services/request-manager-state-service/models/ws-options.model.mjs +6 -3
- package/esm2022/lib/services/request-manager-state-service/models/ws-user.model.mjs +10 -0
- package/esm2022/lib/services/store-state-manager-service/store-state-manager.service.mjs +4 -4
- package/esm2022/lib/services/utils/utils.service.mjs +14 -14
- package/esm2022/lib/services/ws-manager-service/index.mjs +2 -2
- package/esm2022/lib/services/ws-manager-service/models/channel-notification.model.mjs +5 -3
- package/esm2022/lib/services/ws-manager-service/models/communication-type.enum.mjs +7 -0
- package/esm2022/lib/services/ws-manager-service/models/index.mjs +2 -3
- package/esm2022/lib/services/ws-manager-service/models/user-message.model.mjs +1 -1
- package/esm2022/lib/services/ws-manager-service/services/websocket.service.mjs +178 -0
- package/fesm2022/http-request-manager.mjs +2444 -1796
- package/fesm2022/http-request-manager.mjs.map +1 -1
- package/http-request-manager-18.4.0.tgz +0 -0
- package/lib/http-request-manager.module.d.ts +25 -21
- package/lib/http-request-services-demo/database-data-demo/database-data-demo.component.d.ts +39 -12
- package/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.d.ts +0 -1
- package/lib/http-request-services-demo/request-manager-ws-demo/models/oidc-client.model.d.ts +16 -0
- package/lib/http-request-services-demo/request-manager-ws-demo/models/user-data.model.d.ts +14 -0
- package/lib/http-request-services-demo/request-manager-ws-demo/request-manager-ws-demo.component.d.ts +39 -0
- package/lib/http-request-services-demo/request-manager-ws-demo/services/state-request.service.d.ts +14 -0
- package/lib/http-request-services-demo/store-state-manager-demo/models/settings.model.d.ts +14 -0
- package/lib/http-request-services-demo/store-state-manager-demo/services/settings-state.service.d.ts +11 -0
- package/lib/http-request-services-demo/store-state-manager-demo/store-state-manager-demo.component.d.ts +14 -0
- package/lib/services/{database-manager-services → database-manager-service}/database.manager.service.d.ts +9 -7
- package/lib/services/{database-manager-services → database-manager-service}/db.storage.service.d.ts +14 -14
- package/lib/services/index.d.ts +0 -1
- package/lib/services/local-storage-manager-service/models/storage-option.model.d.ts +3 -1
- package/lib/services/request-manager-services/request.service.d.ts +1 -1
- package/lib/services/request-manager-state-service/http-manager-state.store.d.ts +34 -19
- package/lib/services/request-manager-state-service/models/ws-options.model.d.ts +9 -1
- package/lib/services/request-manager-state-service/models/ws-user.model.d.ts +10 -0
- package/lib/services/store-state-manager-service/store-state-manager.service.d.ts +3 -2
- package/lib/services/ws-manager-service/index.d.ts +1 -1
- package/lib/services/ws-manager-service/models/channel-notification.model.d.ts +4 -1
- package/lib/services/ws-manager-service/models/communication-type.enum.d.ts +5 -0
- package/lib/services/ws-manager-service/models/index.d.ts +1 -2
- package/lib/services/ws-manager-service/models/user-message.model.d.ts +5 -6
- package/lib/services/ws-manager-service/{websocket.service.d.ts → services/websocket.service.d.ts} +5 -2
- package/package.json +1 -1
- package/esm2022/lib/services/database-manager-services/database.manager.service.mjs +0 -119
- package/esm2022/lib/services/database-manager-services/db.storage.service.mjs +0 -143
- package/esm2022/lib/services/database-manager-services/index.mjs +0 -4
- package/esm2022/lib/services/database-manager-services/models/table-schema.mjs +0 -20
- package/esm2022/lib/services/ws-manager-service/models/user-info.model.mjs +0 -11
- package/esm2022/lib/services/ws-manager-service/models/user-name-info.model.mjs +0 -12
- package/esm2022/lib/services/ws-manager-service/websocket.service.mjs +0 -133
- package/http-request-manager-18.3.2.tgz +0 -0
- package/lib/services/ws-manager-service/models/user-info.model.d.ts +0 -11
- package/lib/services/ws-manager-service/models/user-name-info.model.d.ts +0 -14
- /package/lib/services/{database-manager-services → database-manager-service}/index.d.ts +0 -0
- /package/lib/services/{database-manager-services → database-manager-service}/models/table-schema.d.ts +0 -0
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
import { inject, Inject, Injectable, InjectionToken } from '@angular/core';
|
|
2
2
|
import { ComponentStore } from '@ngrx/component-store';
|
|
3
|
-
import { BehaviorSubject, of } from 'rxjs';
|
|
4
|
-
import { tap, switchMap, concatMap, scan, delay } from 'rxjs/operators';
|
|
3
|
+
import { BehaviorSubject, of, Subject, timer, merge } from 'rxjs';
|
|
4
|
+
import { tap, switchMap, concatMap, scan, delay, take, map, distinctUntilChanged, takeUntil, takeWhile, filter } from 'rxjs/operators';
|
|
5
5
|
import { DatabaseStorage } from '../../models/database-storage.model';
|
|
6
|
+
import { ApiRequest, RequestOptions, WSOptions } from './models';
|
|
7
|
+
import { ChannelMessage } from '../ws-manager-service/models';
|
|
6
8
|
import { HTTPManagerService, DataType } from '../request-manager-services';
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
+
import { DatabaseManagerService } from '../database-manager-service';
|
|
10
|
+
import { TableSchemaDef } from '../database-manager-service/models/table-schema';
|
|
11
|
+
import { LocalStorageManagerService, StorageType } from '../local-storage-manager-service';
|
|
12
|
+
import { SettingOptions } from '../local-storage-manager-service/models/setting-options.model';
|
|
13
|
+
import { UtilsService } from '../..';
|
|
9
14
|
import * as i0 from "@angular/core";
|
|
10
15
|
const API_OPTS = new InjectionToken('API_OPTS');
|
|
11
16
|
const defaultState = {
|
|
@@ -19,6 +24,9 @@ export class HTTPManagerStateService extends ComponentStore {
|
|
|
19
24
|
this.dataType = dataType;
|
|
20
25
|
this.database = database;
|
|
21
26
|
this.httpManagerService = inject(HTTPManagerService);
|
|
27
|
+
this.dbManagerService = inject(DatabaseManagerService);
|
|
28
|
+
this.localStorageManagerService = inject(LocalStorageManagerService);
|
|
29
|
+
this.utils = inject(UtilsService);
|
|
22
30
|
this.error$ = this.httpManagerService.error$;
|
|
23
31
|
this.isPending$ = this.httpManagerService.isPending$.pipe(delay(1));
|
|
24
32
|
// PAGINATION
|
|
@@ -28,11 +36,11 @@ export class HTTPManagerStateService extends ComponentStore {
|
|
|
28
36
|
this.totalPages$ = this.totalPages.asObservable();
|
|
29
37
|
this.percentage = new BehaviorSubject(0);
|
|
30
38
|
this.percentage$ = this.percentage.asObservable();
|
|
31
|
-
// ----------
|
|
32
39
|
this.hasDatabase = false;
|
|
33
40
|
this.streamedResponse = [];
|
|
34
|
-
|
|
35
|
-
this.
|
|
41
|
+
this.shouldRetry = true;
|
|
42
|
+
this.wsRetryAttempts = new BehaviorSubject(0);
|
|
43
|
+
this.wsRetryAttempts$ = this.wsRetryAttempts.asObservable();
|
|
36
44
|
this.messages$ = null;
|
|
37
45
|
this.connectionStatus$ = null;
|
|
38
46
|
this.userList = new BehaviorSubject([]);
|
|
@@ -47,6 +55,94 @@ export class HTTPManagerStateService extends ComponentStore {
|
|
|
47
55
|
this.channelList = [];
|
|
48
56
|
this.messages = [];
|
|
49
57
|
this.wsConnection = false;
|
|
58
|
+
this.wsOptions = WSOptions.adapt();
|
|
59
|
+
// WebSocket
|
|
60
|
+
this.initWS = this.effect((wsOptions$) => wsOptions$.pipe(tap((wsOptions) => {
|
|
61
|
+
this.wsOptions = wsOptions;
|
|
62
|
+
if (wsOptions?.wsServer)
|
|
63
|
+
this.httpManagerService.connect(wsOptions.wsServer, wsOptions.jwtToken);
|
|
64
|
+
}), switchMap((wsOptions) => merge(this.httpManagerService.connectionStatus$.pipe(tap((isConnected) => {
|
|
65
|
+
this.wsConnection = isConnected;
|
|
66
|
+
if (isConnected) {
|
|
67
|
+
console.log('🟢 WebSocket connection is open.');
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
console.log('🔴 WebSocket connection is closed.');
|
|
71
|
+
}
|
|
72
|
+
})), this.httpManagerService.messages$.pipe(tap((message) => {
|
|
73
|
+
if (!message)
|
|
74
|
+
return;
|
|
75
|
+
console.log('Received:', message.type);
|
|
76
|
+
if (message.error === 'JWT_INVALID') {
|
|
77
|
+
this.shouldRetry = false;
|
|
78
|
+
this.httpManagerService.disconnect();
|
|
79
|
+
}
|
|
80
|
+
if (message.type === 'success') {
|
|
81
|
+
const currentUser = this.apiOptions.ws?.userAdapter?.adapter?.(message.data) || message.data;
|
|
82
|
+
this.user.next(currentUser);
|
|
83
|
+
}
|
|
84
|
+
switch (message.type) {
|
|
85
|
+
case 'channelsList':
|
|
86
|
+
console.log('💬 Channels:', message.channels);
|
|
87
|
+
this.channelList = message.channels;
|
|
88
|
+
if (this.channelList.includes(wsOptions.id)) {
|
|
89
|
+
this.httpManagerService.subscribeToChannel(wsOptions.id);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
this.httpManagerService.createChannel(wsOptions.id);
|
|
93
|
+
}
|
|
94
|
+
break;
|
|
95
|
+
case 'stateMangerMessage':
|
|
96
|
+
console.log('💬 Message:', message.content);
|
|
97
|
+
this.fetchRecord(RequestOptions.adapt({ path: message.content.path }), message.content.method);
|
|
98
|
+
break;
|
|
99
|
+
case 'channelMessage':
|
|
100
|
+
console.log('💬 Message:', message.content);
|
|
101
|
+
this.fetchRecord(RequestOptions.adapt({ path: message.content.path }), message.content.method);
|
|
102
|
+
break;
|
|
103
|
+
case 'channelCommunication':
|
|
104
|
+
console.log('💬 Message Communication:', message.content);
|
|
105
|
+
this.appendMessages(message.content);
|
|
106
|
+
break;
|
|
107
|
+
case 'channelAlerts':
|
|
108
|
+
console.log('💬 Message Alerts:', message.content);
|
|
109
|
+
break;
|
|
110
|
+
case 'usersInChannel':
|
|
111
|
+
const data = message.data;
|
|
112
|
+
const wsUsers = data.users.map((item) => this.apiOptions.ws?.userAdapter?.adapter?.(item) || item);
|
|
113
|
+
const userList = wsUsers.filter((item) => item.username !== this.user.value[this.wsOptions.userAdapter?.id || 'id']);
|
|
114
|
+
this.userList.next(userList);
|
|
115
|
+
console.log('👥 Users:', userList);
|
|
116
|
+
break;
|
|
117
|
+
default:
|
|
118
|
+
if (message)
|
|
119
|
+
this.messages.push(message);
|
|
120
|
+
break;
|
|
121
|
+
}
|
|
122
|
+
}))))));
|
|
123
|
+
this.initDBStorage = this.effect((trigger$) => trigger$.pipe(tap(() => {
|
|
124
|
+
if (this.dataType !== DataType.ARRAY)
|
|
125
|
+
console.warn('Database storage requires dataType to be ARRAY');
|
|
126
|
+
if (!this.apiOptions.adapter)
|
|
127
|
+
console.warn('Database storage requires an adapter to define the data shape');
|
|
128
|
+
if (!this.database?.table)
|
|
129
|
+
console.warn('Database storage requires a table name');
|
|
130
|
+
}), filter(() => this.dataType === DataType.ARRAY && !!this.apiOptions.adapter && !!this.database?.table), switchMap(() => {
|
|
131
|
+
const sampleData = this.apiOptions.adapter?.({}) || {};
|
|
132
|
+
const schemaKeys = Object.keys(sampleData).filter(key => sampleData[key] !== undefined);
|
|
133
|
+
let schema = '++id';
|
|
134
|
+
if (schemaKeys.length > 0) {
|
|
135
|
+
const otherKeys = schemaKeys.filter(k => k !== 'id');
|
|
136
|
+
if (otherKeys.length > 0) {
|
|
137
|
+
schema += ', ' + otherKeys.join(', ');
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
const tableDef = TableSchemaDef.adapt({
|
|
141
|
+
table: this.database?.table,
|
|
142
|
+
schema: schema
|
|
143
|
+
});
|
|
144
|
+
return this.dbManagerService.createDatabaseTable(tableDef);
|
|
145
|
+
})));
|
|
50
146
|
// --------------------------------------------------------------------------------------------------
|
|
51
147
|
// SELECTORS
|
|
52
148
|
this.data$ = this.select(({ data, dataObject }) => {
|
|
@@ -127,10 +223,15 @@ export class HTTPManagerStateService extends ComponentStore {
|
|
|
127
223
|
else {
|
|
128
224
|
this.setData$({});
|
|
129
225
|
}
|
|
130
|
-
}))
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
226
|
+
}), concatMap(() => {
|
|
227
|
+
if (this.hasDatabase && this.database?.table) {
|
|
228
|
+
const currentData = this.get()?.data;
|
|
229
|
+
const idsToDelete = Array.isArray(currentData) ? currentData.map((r) => r.id) : [];
|
|
230
|
+
if (idsToDelete.length > 0) {
|
|
231
|
+
return this.dbManagerService.deleteTableRecords(this.database.table, idsToDelete);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
return of(null);
|
|
134
235
|
})));
|
|
135
236
|
// --------------------------------------------------------------------------------------------------
|
|
136
237
|
// CRUD OPERATIONS
|
|
@@ -138,11 +239,55 @@ export class HTTPManagerStateService extends ComponentStore {
|
|
|
138
239
|
this.fetchRecords = (options) => this.effect(() => of(RequestOptions.adapt(options)).pipe(switchMap(() => {
|
|
139
240
|
this.streamedResponse = [];
|
|
140
241
|
const requestOptions = this.updateRequestOptions(options?.headers);
|
|
141
|
-
|
|
142
|
-
.pipe(tap((data) => {
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
242
|
+
const fetchFromAPI = () => {
|
|
243
|
+
return this.httpManagerService.getRequest(requestOptions, options?.path).pipe(tap((data) => {
|
|
244
|
+
data = (!data) ? (this.dataType === DataType.ARRAY) ? [] : {} : data;
|
|
245
|
+
this.setData$(data);
|
|
246
|
+
}), concatMap((data) => {
|
|
247
|
+
if (this.hasDatabase && this.database?.table && Array.isArray(data) && data.length > 0) {
|
|
248
|
+
this.localStorageManagerService.updateStore({
|
|
249
|
+
name: this.database.table,
|
|
250
|
+
data: { ...this.database, ...{ expires: this.utils.expires(this.database.expiresIn) } }
|
|
251
|
+
});
|
|
252
|
+
return this.dbManagerService.createTableRecords(this.database.table, data);
|
|
253
|
+
}
|
|
254
|
+
return of(data);
|
|
255
|
+
}));
|
|
256
|
+
};
|
|
257
|
+
if (this.hasDatabase && this.database?.table) {
|
|
258
|
+
return this.dbManagerService.databaseExists().pipe(switchMap((dbExists) => {
|
|
259
|
+
if (!dbExists) {
|
|
260
|
+
const initObs = this.initDBStorageAsync();
|
|
261
|
+
return initObs.pipe(switchMap(() => fetchFromAPI()));
|
|
262
|
+
}
|
|
263
|
+
return this.dbManagerService.hasDatabaseTable(this.database.table).pipe(switchMap((tableExists) => {
|
|
264
|
+
if (!tableExists) {
|
|
265
|
+
const initObs = this.initDBStorageAsync();
|
|
266
|
+
return initObs.pipe(switchMap(() => fetchFromAPI()));
|
|
267
|
+
}
|
|
268
|
+
return this.localStorageManagerService.store$(this.database.table).pipe(take(1), switchMap((storeData) => {
|
|
269
|
+
const expires = storeData?.expires || 0;
|
|
270
|
+
const hasExpired = expires > 0 && this.utils.hasExpired(expires);
|
|
271
|
+
if (hasExpired) {
|
|
272
|
+
return this.dbManagerService.clearTable(this.database.table).pipe(switchMap(() => fetchFromAPI()), tap(() => {
|
|
273
|
+
this.localStorageManagerService.updateStore({
|
|
274
|
+
name: this.database.table,
|
|
275
|
+
data: { ...this.database, ...{ expires: this.utils.expires(this.database.expiresIn) } }
|
|
276
|
+
});
|
|
277
|
+
}));
|
|
278
|
+
}
|
|
279
|
+
return this.dbManagerService.getTableRecords(this.database.table).pipe(switchMap((dbData) => {
|
|
280
|
+
if (Array.isArray(dbData) && dbData.length > 0) {
|
|
281
|
+
this.setData$(dbData);
|
|
282
|
+
return of(dbData);
|
|
283
|
+
}
|
|
284
|
+
return fetchFromAPI();
|
|
285
|
+
}));
|
|
286
|
+
}));
|
|
287
|
+
}));
|
|
288
|
+
}));
|
|
289
|
+
}
|
|
290
|
+
return fetchFromAPI();
|
|
146
291
|
})));
|
|
147
292
|
// FETCH RECORD
|
|
148
293
|
this.fetchRecord = (options, method) => this.effect(() => of(RequestOptions.adapt(options)).pipe(switchMap((options) => {
|
|
@@ -158,6 +303,17 @@ export class HTTPManagerStateService extends ComponentStore {
|
|
|
158
303
|
this.updateData$(data);
|
|
159
304
|
if (method === 'CREATE')
|
|
160
305
|
this.addData$(data);
|
|
306
|
+
}), concatMap((data) => {
|
|
307
|
+
if (this.hasDatabase && this.database?.table) {
|
|
308
|
+
const id = options.path?.length ? options.path[options.path.length - 1] : null;
|
|
309
|
+
if (method === 'DELETE' && id)
|
|
310
|
+
return this.dbManagerService.deleteTableRecord(this.database.table, id);
|
|
311
|
+
if (method === 'UPDATE' && data)
|
|
312
|
+
return this.dbManagerService.updateTableRecord(this.database.table, data);
|
|
313
|
+
if (method === 'CREATE' && data)
|
|
314
|
+
return this.dbManagerService.createTableRecord(this.database.table, data);
|
|
315
|
+
}
|
|
316
|
+
return of(data);
|
|
161
317
|
}));
|
|
162
318
|
})));
|
|
163
319
|
// CREATE RECORD
|
|
@@ -170,6 +326,11 @@ export class HTTPManagerStateService extends ComponentStore {
|
|
|
170
326
|
this.addData$(data);
|
|
171
327
|
if (this.wsConnection)
|
|
172
328
|
this.wsCommunication('CREATE', [...options?.path || [], data.id]);
|
|
329
|
+
}), concatMap((data) => {
|
|
330
|
+
if (this.hasDatabase && this.database?.table && data?.id) {
|
|
331
|
+
return this.dbManagerService.createTableRecord(this.database.table, data);
|
|
332
|
+
}
|
|
333
|
+
return of(data);
|
|
173
334
|
}));
|
|
174
335
|
})));
|
|
175
336
|
// UPDATE RECORD
|
|
@@ -182,6 +343,11 @@ export class HTTPManagerStateService extends ComponentStore {
|
|
|
182
343
|
this.updateData$(data);
|
|
183
344
|
if (this.wsConnection)
|
|
184
345
|
this.wsCommunication('UPDATE', [...options?.path || []]);
|
|
346
|
+
}), concatMap((data) => {
|
|
347
|
+
if (this.hasDatabase && this.database?.table && data?.id) {
|
|
348
|
+
return this.dbManagerService.updateTableRecord(this.database.table, data);
|
|
349
|
+
}
|
|
350
|
+
return of(data);
|
|
185
351
|
}));
|
|
186
352
|
})));
|
|
187
353
|
// DELETE RECORD
|
|
@@ -194,6 +360,11 @@ export class HTTPManagerStateService extends ComponentStore {
|
|
|
194
360
|
this.deleteData$(data);
|
|
195
361
|
if (this.wsConnection)
|
|
196
362
|
this.wsCommunication('DELETE', [...options?.path || []]);
|
|
363
|
+
}), concatMap((data) => {
|
|
364
|
+
if (this.hasDatabase && this.database?.table && data?.id) {
|
|
365
|
+
return this.dbManagerService.deleteTableRecord(this.database.table, data.id);
|
|
366
|
+
}
|
|
367
|
+
return of(data);
|
|
197
368
|
}));
|
|
198
369
|
})));
|
|
199
370
|
// --------------------------------------------------------------------------------------------------
|
|
@@ -241,71 +412,64 @@ export class HTTPManagerStateService extends ComponentStore {
|
|
|
241
412
|
}
|
|
242
413
|
}));
|
|
243
414
|
})));
|
|
415
|
+
this.maxRetries = this.apiOptions.ws?.retry?.times || 3;
|
|
416
|
+
this.retryDelay = (this.apiOptions.ws?.retry?.delay && this.apiOptions.ws.retry.delay * 1000) || 5 * 1000;
|
|
417
|
+
this.wsNextRetry = new BehaviorSubject(this.retryDelay);
|
|
418
|
+
this.wsNextRetry$ = this.wsNextRetry.asObservable();
|
|
244
419
|
this.setApiRequestOptions(apiOptions, dataType, database);
|
|
420
|
+
this.status$ = this.setupConnectionStatus();
|
|
421
|
+
if (this.database && this.database.table) {
|
|
422
|
+
this.localStorageManagerService.createStore({
|
|
423
|
+
name: this.database.table,
|
|
424
|
+
data: { ...this.database, ...{ expires: this.utils.expires(this.database.expiresIn) } },
|
|
425
|
+
options: SettingOptions.adapt({
|
|
426
|
+
storage: StorageType.GLOBAL,
|
|
427
|
+
encrypted: false,
|
|
428
|
+
})
|
|
429
|
+
});
|
|
430
|
+
}
|
|
245
431
|
}
|
|
246
432
|
setApiRequestOptions(apiOptions, dataType, database) {
|
|
247
433
|
this.apiOptions = ApiRequest.adapt(apiOptions);
|
|
248
434
|
this.dataType = (dataType) ? dataType : DataType.ARRAY;
|
|
249
|
-
this.hasDatabase = this.database?.table
|
|
435
|
+
this.hasDatabase = (this.database?.table) ? true : false;
|
|
250
436
|
this.database = (this.hasDatabase) ? DatabaseStorage.adapt(database) : undefined;
|
|
251
|
-
|
|
437
|
+
if (this.database)
|
|
438
|
+
this.initDBStorage();
|
|
439
|
+
if (this.apiOptions.ws)
|
|
440
|
+
this.initWS(this.apiOptions.ws);
|
|
252
441
|
}
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
console.log('🟢 WebSocket connection is open.');
|
|
262
|
-
this.httpManagerService.getAllChannels();
|
|
263
|
-
this.httpManagerService.getUsersInChannel(wsOptions.id);
|
|
264
|
-
}
|
|
265
|
-
else {
|
|
266
|
-
console.log('🔴 WebSocket connection is closed.');
|
|
442
|
+
// WebSocket
|
|
443
|
+
setupConnectionStatus() {
|
|
444
|
+
return this.httpManagerService.connectionStatus$.pipe(distinctUntilChanged(), switchMap(status => {
|
|
445
|
+
if (status === true) {
|
|
446
|
+
this.shouldRetry = true;
|
|
447
|
+
this.wsRetryAttempts.next(0);
|
|
448
|
+
this.wsNextRetry.next(0);
|
|
449
|
+
return of(true);
|
|
267
450
|
}
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
.
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
this.
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
console.
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
this.
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
this.fetchRecord(RequestOptions.adapt({ path: message.content.path }), message.content.method);
|
|
291
|
-
break;
|
|
292
|
-
case 'channelCommunication':
|
|
293
|
-
console.log('💬 Message Communication:', message.content);
|
|
294
|
-
this.appendMessages(message.content);
|
|
295
|
-
break;
|
|
296
|
-
case 'channelAlerts':
|
|
297
|
-
console.log('💬 Message Alerts:', message.content);
|
|
298
|
-
break;
|
|
299
|
-
case 'usersInChannel':
|
|
300
|
-
this.userList.next(message.users);
|
|
301
|
-
console.log('👥 Users:', message.users);
|
|
302
|
-
break;
|
|
303
|
-
default:
|
|
304
|
-
if (message)
|
|
305
|
-
this.messages.push(message);
|
|
306
|
-
break;
|
|
307
|
-
}
|
|
308
|
-
});
|
|
451
|
+
if (!this.shouldRetry)
|
|
452
|
+
return of(false);
|
|
453
|
+
const countdownEnder$ = new Subject();
|
|
454
|
+
return timer(0, this.retryDelay)
|
|
455
|
+
.pipe(take(this.maxRetries), tap(i => {
|
|
456
|
+
const attempt = i + 1;
|
|
457
|
+
this.wsRetryAttempts.next(attempt);
|
|
458
|
+
countdownEnder$.next();
|
|
459
|
+
this.initWS(this.apiOptions.ws);
|
|
460
|
+
if (attempt === this.maxRetries) {
|
|
461
|
+
this.wsNextRetry.next(0);
|
|
462
|
+
// console.error(`🚨 FAILED CONNECTION: Tried #${attempt} times`);
|
|
463
|
+
}
|
|
464
|
+
else {
|
|
465
|
+
// console.log(`⚠️ Retry Attempt #${attempt}: Retrying in ${this.retryDelay / 1000}s`);
|
|
466
|
+
const seconds = this.retryDelay / 1000;
|
|
467
|
+
timer(0, 1000).pipe(map(tick => seconds - tick), takeWhile(val => val >= 0), takeUntil(countdownEnder$)).subscribe(remaining => {
|
|
468
|
+
this.wsNextRetry.next(remaining);
|
|
469
|
+
});
|
|
470
|
+
}
|
|
471
|
+
}), map(() => false));
|
|
472
|
+
}));
|
|
309
473
|
}
|
|
310
474
|
appendMessages(message) {
|
|
311
475
|
const currentMessages = this.communicationMessages.value;
|
|
@@ -323,13 +487,6 @@ export class HTTPManagerStateService extends ComponentStore {
|
|
|
323
487
|
get ApiRequestOptions() {
|
|
324
488
|
return this.apiOptions;
|
|
325
489
|
}
|
|
326
|
-
initStorage() {
|
|
327
|
-
// if(this.otherOptions.database) {
|
|
328
|
-
// console.log('Has Database Option:', this.otherOptions.database.table)
|
|
329
|
-
// const schema = (this.otherOptions.adapters?.incoming) ? Object.keys(this.otherOptions.adapters.incoming({})).join() : '++id'
|
|
330
|
-
// this.apiService.initDB(this.otherOptions.database.expiresIn, this.otherOptions.database.table, schema)
|
|
331
|
-
// }
|
|
332
|
-
}
|
|
333
490
|
initializeState(data) {
|
|
334
491
|
this.setData$(data);
|
|
335
492
|
}
|
|
@@ -354,22 +511,53 @@ export class HTTPManagerStateService extends ComponentStore {
|
|
|
354
511
|
});
|
|
355
512
|
return [...updatedData, ...addedData];
|
|
356
513
|
}
|
|
514
|
+
initDBStorageAsync() {
|
|
515
|
+
if (this.dataType !== DataType.ARRAY) {
|
|
516
|
+
console.warn('Database storage requires dataType to be ARRAY');
|
|
517
|
+
return of(null);
|
|
518
|
+
}
|
|
519
|
+
if (!this.apiOptions.adapter) {
|
|
520
|
+
console.warn('Database storage requires an adapter to define the data shape');
|
|
521
|
+
return of(null);
|
|
522
|
+
}
|
|
523
|
+
if (!this.database?.table) {
|
|
524
|
+
console.warn('Database storage requires a table name');
|
|
525
|
+
return of(null);
|
|
526
|
+
}
|
|
527
|
+
const sampleData = this.apiOptions.adapter?.({}) || {};
|
|
528
|
+
const schemaKeys = Object.keys(sampleData).filter(key => sampleData[key] !== undefined);
|
|
529
|
+
let schema = '++id';
|
|
530
|
+
if (schemaKeys.length > 0) {
|
|
531
|
+
const otherKeys = schemaKeys.filter(k => k !== 'id');
|
|
532
|
+
if (otherKeys.length > 0) {
|
|
533
|
+
schema += ', ' + otherKeys.join(', ');
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
const tableDef = TableSchemaDef.adapt({
|
|
537
|
+
table: this.database?.table,
|
|
538
|
+
schema: schema
|
|
539
|
+
});
|
|
540
|
+
return this.dbManagerService.createDatabaseTable(tableDef);
|
|
541
|
+
}
|
|
357
542
|
wsCommunication(method, path) {
|
|
358
543
|
if (this.wsConnection && this.apiOptions.ws) {
|
|
359
544
|
const wsServer = this.apiOptions.ws.id;
|
|
360
|
-
this.httpManagerService.
|
|
545
|
+
this.httpManagerService.sendMessageInChannel(wsServer, { method, path });
|
|
361
546
|
}
|
|
362
547
|
}
|
|
363
548
|
wsMessaging(message, channel) {
|
|
364
|
-
const user =
|
|
549
|
+
const user = this.wsOptions?.userAdapter?.adapter?.(this.user.value) || this.user.value;
|
|
365
550
|
const messageInfo = ChannelMessage.adapt({ ...message, fromUser: user });
|
|
366
551
|
if (this.wsConnection && this.apiOptions.ws) {
|
|
367
552
|
const wsServer = (channel) ? channel : this.apiOptions.ws.id;
|
|
368
553
|
if (messageInfo.toUser === 'allChannels') {
|
|
369
554
|
this.httpManagerService.sendBroadcast(messageInfo);
|
|
370
555
|
}
|
|
556
|
+
else if (messageInfo.toUser === 'allInChannel') {
|
|
557
|
+
this.httpManagerService.sendMessageInChannel(wsServer, messageInfo);
|
|
558
|
+
}
|
|
371
559
|
else {
|
|
372
|
-
this.httpManagerService.
|
|
560
|
+
this.httpManagerService.sendMessageToUser(wsServer, messageInfo);
|
|
373
561
|
}
|
|
374
562
|
}
|
|
375
563
|
}
|
|
@@ -400,4 +588,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
400
588
|
type: Inject,
|
|
401
589
|
args: ["database"]
|
|
402
590
|
}] }] });
|
|
403
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1tYW5hZ2VyLXN0YXRlLnN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaHR0cC1yZXF1ZXN0LW1hbmFnZXIvc3JjL2xpYi9zZXJ2aWNlcy9yZXF1ZXN0LW1hbmFnZXItc3RhdGUtc2VydmljZS9odHRwLW1hbmFnZXItc3RhdGUuc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFdkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxFQUFFLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQ3pELE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxRQUFRLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMzRSxPQUFPLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN0RCxPQUFPLEVBQWUsY0FBYyxFQUFFLFFBQVEsRUFBZSxNQUFNLDhCQUE4QixDQUFDOztBQUVsRyxNQUFNLFFBQVEsR0FBRyxJQUFJLGNBQWMsQ0FBYSxVQUFVLENBQUMsQ0FBQztBQU81RCxNQUFNLFlBQVksR0FBNkI7SUFDN0MsSUFBSSxFQUFFLEVBQUU7SUFDUixVQUFVLEVBQUUsSUFBSTtDQUNqQixDQUFDO0FBR0YsTUFBTSxPQUFPLHVCQUFrRCxTQUFRLGNBQXNDO0lBNkMzRyxZQUM0QixhQUFhLFVBQVUsQ0FBQyxLQUFLLEVBQUUsRUFDN0IsUUFBOEIsRUFDOUIsUUFBc0M7UUFF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OUIsT0FBTyxPQUFPLENBQUE7SUFDaEIsQ0FBQzsrR0Fqa0JVLHVCQUF1QixrQkE4Q3hCLFFBQVEsYUFDUixVQUFVLGFBQ1YsVUFBVTttSEFoRFQsdUJBQXVCOzs0RkFBdkIsdUJBQXVCO2tCQURuQyxVQUFVOzswQkErQ04sTUFBTTsyQkFBQyxRQUFROzswQkFDZixNQUFNOzJCQUFDLFVBQVU7OzBCQUNqQixNQUFNOzJCQUFDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIEluamVjdCwgSW5qZWN0YWJsZSwgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbXBvbmVudFN0b3JlIH0gZnJvbSAnQG5ncngvY29tcG9uZW50LXN0b3JlJztcblxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBvZiwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YXAsIHN3aXRjaE1hcCwgY29uY2F0TWFwLCBzY2FuLCBkZWxheSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IERhdGFiYXNlU3RvcmFnZSB9IGZyb20gJy4uLy4uL21vZGVscy9kYXRhYmFzZS1zdG9yYWdlLm1vZGVsJztcbmltcG9ydCB7IEhUVFBNYW5hZ2VyU2VydmljZSwgRGF0YVR5cGUgfSBmcm9tICcuLi9yZXF1ZXN0LW1hbmFnZXItc2VydmljZXMnO1xuaW1wb3J0IHsgQXBpUmVxdWVzdCwgUmVxdWVzdE9wdGlvbnMgfSBmcm9tICcuL21vZGVscyc7XG5pbXBvcnQgeyBDaGFubmVsSW5mbywgQ2hhbm5lbE1lc3NhZ2UsIFVzZXJJbmZvLCBVc2VyTWVzc2FnZSB9IGZyb20gJy4uL3dzLW1hbmFnZXItc2VydmljZS9tb2RlbHMnO1xuXG5jb25zdCBBUElfT1BUUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxBcGlSZXF1ZXN0PignQVBJX09QVFMnKTtcblxuZXhwb3J0IGludGVyZmFjZSBBUElTdGF0ZU1hbmFnZXJEYXRhPFQ+IHtcbiAgZGF0YTogVFtdXG4gIGRhdGFPYmplY3Q6IFQgfCBudWxsXG59XG5cbmNvbnN0IGRlZmF1bHRTdGF0ZTogQVBJU3RhdGVNYW5hZ2VyRGF0YTxhbnk+ID0ge1xuICBkYXRhOiBbXSxcbiAgZGF0YU9iamVjdDogbnVsbCxcbn07XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBIVFRQTWFuYWdlclN0YXRlU2VydmljZTxUIGV4dGVuZHMgeyBpZDogbnVtYmVyIH0+IGV4dGVuZHMgQ29tcG9uZW50U3RvcmU8QVBJU3RhdGVNYW5hZ2VyRGF0YTxUPj4ge1xuXG4gIGh0dHBNYW5hZ2VyU2VydmljZSA9IGluamVjdChIVFRQTWFuYWdlclNlcnZpY2UpXG5cbiAgZXJyb3IkID0gdGhpcy5odHRwTWFuYWdlclNlcnZpY2UuZXJyb3IkXG4gIGlzUGVuZGluZyQgPSB0aGlzLmh0dHBNYW5hZ2VyU2VydmljZS5pc1BlbmRpbmckLnBpcGUoZGVsYXkoMSkpXG5cbiAgLy8gUEFHSU5BVElPTlxuICBwcml2YXRlIHBhZ2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMClcbiAgcGFnZSQgPSB0aGlzLnBhZ2UuYXNPYnNlcnZhYmxlKClcblxuICBwcml2YXRlIHRvdGFsUGFnZXMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMClcbiAgdG90YWxQYWdlcyQgPSB0aGlzLnRvdGFsUGFnZXMuYXNPYnNlcnZhYmxlKClcblxuICBwcml2YXRlIHBlcmNlbnRhZ2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMClcbiAgcGVyY2VudGFnZSQgPSB0aGlzLnBlcmNlbnRhZ2UuYXNPYnNlcnZhYmxlKClcbiAgLy8gLS0tLS0tLS0tLVxuXG4gIHByaXZhdGUgaGFzRGF0YWJhc2UgPSBmYWxzZVxuXG4gIHN0cmVhbWVkUmVzcG9uc2UgPSBbXVxuXG4gIC8vIFdTXG4gIHN0YXR1cyQgPSB0aGlzLmh0dHBNYW5hZ2VyU2VydmljZS5jb25uZWN0aW9uU3RhdHVzJDtcblxuICBtZXNzYWdlcyQ6IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsO1xuICBjb25uZWN0aW9uU3RhdHVzJDogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSB1c2VyTGlzdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VXNlckluZm9bXT4oW10pXG4gIHVzZXJMaXN0JCA9IHRoaXMudXNlckxpc3QuYXNPYnNlcnZhYmxlKClcblxuICBwcml2YXRlIHVzZXIgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFVzZXJJbmZvfG51bGw+KG51bGwpXG4gIHVzZXIkID0gdGhpcy51c2VyLmFzT2JzZXJ2YWJsZSgpXG5cbiAgcHJpdmF0ZSBjb21tdW5pY2F0aW9uTWVzc2FnZXMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFVzZXJNZXNzYWdlW10+KFtdKVxuICBjb21tdW5pY2F0aW9uTWVzc2FnZXMkID0gdGhpcy5jb21tdW5pY2F0aW9uTWVzc2FnZXMuYXNPYnNlcnZhYmxlKClcblxuICBwcml2YXRlIGxhdGVzdENvbW11bmljYXRpb25NZXNzYWdlcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VXNlck1lc3NhZ2V8bnVsbD4obnVsbClcbiAgbGF0ZXN0Q29tbXVuaWNhdGlvbk1lc3NhZ2VzJCA9IHRoaXMubGF0ZXN0Q29tbXVuaWNhdGlvbk1lc3NhZ2VzLmFzT2JzZXJ2YWJsZSgpXG5cbiAgY2hhbm5lbHM6IENoYW5uZWxJbmZvW10gPSBbXVxuICBjaGFubmVsTGlzdDogc3RyaW5nW10gPSBbXVxuICBtZXNzYWdlczogYW55W10gPSBbXVxuICB3c0Nvbm5lY3Rpb24gPSBmYWxzZVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoQVBJX09QVFMpIHByaXZhdGUgYXBpT3B0aW9ucyA9IEFwaVJlcXVlc3QuYWRhcHQoKSxcbiAgICBASW5qZWN0KFwiZGF0YVR5cGVcIikgcHJpdmF0ZSBkYXRhVHlwZTogRGF0YVR5cGUgfCB1bmRlZmluZWQsXG4gICAgQEluamVjdChcImRhdGFiYXNlXCIpIHByaXZhdGUgZGF0YWJhc2U/OiBEYXRhYmFzZVN0b3JhZ2UgfCB1bmRlZmluZWRcbiAgKSB7XG4gICAgc3VwZXIoZGVmYXVsdFN0YXRlKTtcbiAgICB0aGlzLnNldEFwaVJlcXVlc3RPcHRpb25zKGFwaU9wdGlvbnMsIGRhdGFUeXBlLCBkYXRhYmFzZSlcbiAgfVxuXG4gIHNldEFwaVJlcXVlc3RPcHRpb25zKGFwaU9wdGlvbnM/OiBBcGlSZXF1ZXN0LCBkYXRhVHlwZT86IERhdGFUeXBlLCBkYXRhYmFzZT86IERhdGFiYXNlU3RvcmFnZSkge1xuXG4gICAgdGhpcy5hcGlPcHRpb25zID0gQXBpUmVxdWVzdC5hZGFwdChhcGlPcHRpb25zKVxuICAgIHRoaXMuZGF0YVR5cGUgPSAoZGF0YVR5cGUpID8gZGF0YVR5cGUgOiBEYXRhVHlwZS5BUlJBWVxuXG4gICAgdGhpcy5oYXNEYXRhYmFzZSA9IHRoaXMuZGF0YWJhc2U/LnRhYmxlID09PSBcIlwiID8gZmFsc2UgOiB0cnVlXG4gICAgdGhpcy5kYXRhYmFzZSA9ICh0aGlzLmhhc0RhdGFiYXNlKSA/IERhdGFiYXNlU3RvcmFnZS5hZGFwdChkYXRhYmFzZSkgOiB1bmRlZmluZWRcblxuICAgIHRoaXMuaW5pdFdTKHRoaXMuYXBpT3B0aW9ucy53cylcbiAgfVxuXG4gIGluaXRXUyh3c09wdGlvbnM6IGFueSkge1xuXG4gICAgaWYod3NPcHRpb25zPy53c1NlcnZlcikgdGhpcy5odHRwTWFuYWdlclNlcnZpY2UuY29ubmVjdCh3c09wdGlvbnMud3NTZXJ2ZXIsIHdzT3B0aW9ucy5qd3RUb2tlbilcblxuICAgICAgLy8gY29ubmVjdGlvbiBzdGF0dXNcbiAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkID0gdGhpcy5odHRwTWFuYWdlclNlcnZpY2UuY29ubmVjdGlvblN0YXR1cyRcbiAgICAuc3Vic2NyaWJlKFxuICAgICAgKGlzQ29ubmVjdGVkOiBhbnkpID0+IHtcblxuICAgICAgICB0aGlzLndzQ29ubmVjdGlvbiA9IGlzQ29ubmVjdGVkXG5cbiAgICAgICAgaWYgKGlzQ29ubmVjdGVkKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ/Cfn6IgV2ViU29ja2V0IGNvbm5lY3Rpb24gaXMgb3Blbi4nKVxuICAgICAgICAgIHRoaXMuaHR0cE1hbmFnZXJTZXJ2aWNlLmdldEFsbENoYW5uZWxzKClcbiAgICAgICAgICB0aGlzLmh0dHBNYW5hZ2VyU2VydmljZS5nZXRVc2Vyc0luQ2hhbm5lbCh3c09wdGlvbnMuaWQpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ/CflLQgV2ViU29ja2V0IGNvbm5lY3Rpb24gaXMgY2xvc2VkLicpXG4gICAgICAgIH1cblxuICAgICAgfVxuICAgIClcblxuICAgIC8vIFN1YnNjcmliZSB0byBpbmNvbWluZyBtZXNzYWdlc1xuICAgIHRoaXMubWVzc2FnZXMkID0gdGhpcy5odHRwTWFuYWdlclNlcnZpY2UubWVzc2FnZXMkXG4gICAgLnN1YnNjcmliZSgobWVzc2FnZTogYW55KSA9PiB7XG5cbiAgICAgIGlmKCFtZXNzYWdlKSByZXR1cm5cblxuICAgICAgICBjb25zb2xlLmxvZygnUmVjZWl2ZWQgbWVzc2FnZTonLCBtZXNzYWdlKVxuICAgICAgICBpZihtZXNzYWdlLnR5cGUgPT09ICdzdWNjZXNzJykgdGhpcy51c2VyLm5leHQobWVzc2FnZS51c2VyKVxuXG4gICAgICAgIHN3aXRjaCAobWVzc2FnZS50eXBlKSB7XG4gICAgICAgICAgY2FzZSAnY2hhbm5lbHNMaXN0JzpcblxuICAgICAgICAgICAgY29uc29sZS5sb2coJ/CfkqwgQ2hhbm5lbHM6JywgbWVzc2FnZS5jaGFubmVscylcblxuICAgICAgICAgICAgdGhpcy5jaGFubmVsTGlzdCA9IG1lc3NhZ2UuY2hhbm5lbHNcblxuICAgICAgICAgICAgaWYodGhpcy5jaGFubmVsTGlzdC5pbmNsdWRlcyh3c09wdGlvbnMuaWQpKSB7XG4gICAgICAgICAgICAgIHRoaXMuaHR0cE1hbmFnZXJTZXJ2aWNlLnN1YnNjcmliZVRvQ2hhbm5lbCh3c09wdGlvbnMuaWQpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmh0dHBNYW5hZ2VyU2VydmljZS5jcmVhdGVDaGFubmVsKHdzT3B0aW9ucy5pZClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdjaGFubmVsTWVzc2FnZSc6XG5cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCfwn5KsIE1lc3NhZ2U6JywgbWVzc2FnZS5jb250ZW50KVxuICAgICAgICAgICAgdGhpcy5mZXRjaFJlY29yZChSZXF1ZXN0T3B0aW9ucy5hZGFwdCh7IHBhdGg6IG1lc3NhZ2UuY29udGVudC5wYXRoIH0pLCBtZXNzYWdlLmNvbnRlbnQubWV0aG9kKVxuXG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ2NoYW5uZWxDb21tdW5pY2F0aW9uJzpcblxuICAgICAgICAgICAgY29uc29sZS5sb2coJ/CfkqwgTWVzc2FnZSBDb21tdW5pY2F0aW9uOicsIG1lc3NhZ2UuY29udGVudClcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kTWVzc2FnZXMobWVzc2FnZS5jb250ZW50KVxuXG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ2NoYW5uZWxBbGVydHMnOlxuXG4gICAgICAgICAgICBjb25zb2xlLmxvZygn8J+SrCBNZXNzYWdlIEFsZXJ0czonLCBtZXNzYWdlLmNvbnRlbnQpXG5cbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAndXNlcnNJbkNoYW5uZWwnOlxuXG4gICAgICAgICAgICB0aGlzLnVzZXJMaXN0Lm5leHQobWVzc2FnZS51c2VycylcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCfwn5GlIFVzZXJzOicsIG1lc3NhZ2UudXNlcnMpXG5cbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgZGVmYXVsdDpcblxuICAgICAgICAgICAgaWYgKG1lc3NhZ2UpIHRoaXMubWVzc2FnZXMucHVzaChtZXNzYWdlKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuXG4gICAgfSlcblxuICB9XG5cbiAgYXBwZW5kTWVzc2FnZXMobWVzc2FnZTogVXNlck1lc3NhZ2UpIHtcbiAgICBjb25zdCBjdXJyZW50TWVzc2FnZXMgPSB0aGlzLmNvbW11bmljYXRpb25NZXNzYWdlcy52YWx1ZVxuICAgIHRoaXMuY29tbXVuaWNhdGlvbk1lc3NhZ2VzLm5leHQoWy4uLmN1cnJlbnRNZXNzYWdlcywgbWVzc2FnZV0pXG4gICAgdGhpcy5sYXRlc3RNZXNzYWdlKClcbiAgfVxuXG4gIGxhdGVzdE1lc3NhZ2UoKSB7XG4gICAgY29uc3QgbWVzc2FnZXMgPSB0aGlzLmNvbW11bmljYXRpb25NZXNzYWdlcy52YWx1ZVxuICAgIGNvbnN0IGxhdGVzdE1lc3NhZ2UgPSBtZXNzYWdlc1ttZXNzYWdlcy5sZW5ndGggLTFdXG4gICAgdGhpcy5sYXRlc3RDb21tdW5pY2F0aW9uTWVzc2FnZXMubmV4dChsYXRlc3RNZXNzYWdlKVxuICB9XG5cbiAgY2xlYXJNZXNzYWdlcygpIHtcbiAgICB0aGlzLmNvbW11bmljYXRpb25NZXNzYWdlcy5uZXh0KFtdKVxuICB9XG5cbiAgZ2V0IEFwaVJlcXVlc3RPcHRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLmFwaU9wdGlvbnNcbiAgfVxuXG4gIGluaXRTdG9yYWdlKCkge1xuICAgIC8vIGlmKHRoaXMub3RoZXJPcHRpb25zLmRhdGFiYXNlKSB7XG4gICAgICAvLyBjb25zb2xlLmxvZygnSGFzIERhdGFiYXNlIE9wdGlvbjonLCB0aGlzLm90aGVyT3B0aW9ucy5kYXRhYmFzZS50YWJsZSlcbiAgICAgIC8vIGNvbnN0IHNjaGVtYSA9ICh0aGlzLm90aGVyT3B0aW9ucy5hZGFwdGVycz8uaW5jb21pbmcpID8gT2JqZWN0LmtleXModGhpcy5vdGhlck9wdGlvbnMuYWRhcHRlcnMuaW5jb21pbmcoe30pKS5qb2luKCkgOiAnKytpZCdcbiAgICAgIC8vIHRoaXMuYXBpU2VydmljZS5pbml0REIodGhpcy5vdGhlck9wdGlvbnMuZGF0YWJhc2UuZXhwaXJlc0luLCB0aGlzLm90aGVyT3B0aW9ucy5kYXRhYmFzZS50YWJsZSwgc2NoZW1hKVxuICAgIC8vIH1cbiAgfVxuXG4gIGluaXRpYWxpemVTdGF0ZShkYXRhOiBhbnkpIHtcbiAgICB0aGlzLnNldERhdGEkKGRhdGEpXG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBTRUxFQ1RPUlNcblxuICByZWFkb25seSBkYXRhJCA9IHRoaXMuc2VsZWN0KCh7IGRhdGEsIGRhdGFPYmplY3QgfSkgPT4ge1xuICAgIGNvbnN0IGlzQXJyYXkgPSggdGhpcy5kYXRhVHlwZSA9PT0gRGF0YVR5cGUuQVJSQVkpID8gdHJ1ZSA6IGZhbHNlXG4gICAgcmV0dXJuIChpc0FycmF5KSA/IGRhdGEgOiBkYXRhT2JqZWN0XG4gIH0pXG5cbiAgcmVhZG9ubHkgc2VsZWN0UmVjb3JkJCA9IChpZDogbnVtYmVyKSA9PiB0aGlzLnNlbGVjdChcbiAgICB0aGlzLmRhdGEkLFxuICAgIChkYXRhKSA9PiB7XG4gICAgICBpZiAodGhpcy5kYXRhVHlwZSA9PT0gRGF0YVR5cGUuQVJSQVkgJiYgQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICByZXR1cm4gZGF0YS5maW5kKGl0ZW0gPT4gaXRlbS5pZCA9PT0gaWQpIGFzIFQgfCBudWxsXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gKGRhdGEgYXMgVCkuaWQgPT09IGlkID8gZGF0YSA6IG51bGxcbiAgICAgIH1cbiAgICB9XG4gICk7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvLyBVUERBVEVSU1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgc2V0RGF0YSQgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlOiBBUElTdGF0ZU1hbmFnZXJEYXRhPFQ+LCBkYXRhOiBUIHwgVFtdIHwgYW55KSA9PiB7XG5cbiAgICBpZiAoIWRhdGEpIHJldHVybiBzdGF0ZTtcblxuICAgIGlmICh0aGlzLmRhdGFUeXBlID09PSBEYXRhVHlwZS5BUlJBWSkge1xuXG4gICAgICBjb25zdCBkYXRhQXJyYXkgPSBBcnJheS5pc0FycmF5KGRhdGEpID8gZGF0YSA6IFtkYXRhXVxuXG4gICAgICBjb25zdCBzdGF0ZURhdGFTYW1wbGUgPSAoc3RhdGUuZGF0YS5sZW5ndGggPiAwKSA/IE9iamVjdC5rZXlzKHN0YXRlLmRhdGFbMF0pIDogW11cbiAgICAgIGNvbnN0IG5ld0RhdGFTYW1wbGUgPSAoZGF0YUFycmF5Lmxlbmd0aCA+IDApID8gT2JqZWN0LmtleXMoZGF0YUFycmF5WzBdKSA6IFtdXG5cbiAgICAgIGNvbnN0IGlzU2FtZSA9IChzdGF0ZS5kYXRhLmxlbmd0aCA9PT0gMCkgPyBmYWxzZSA6IHN0YXRlRGF0YVNhbXBsZS5ldmVyeSgodmFsdWUsIGluZGV4KSA9PiB2YWx1ZSA9PT0gbmV3RGF0YVNhbXBsZVtpbmRleF0pXG4gICAgICBjb25zdCB1cGRhdGVkRGF0YSA9ICghaXNTYW1lICYmIGRhdGFBcnJheS5sZW5ndGggIT09IDApID8gdGhpcy51cGRhdGVBcnJheVN0YXRlKFtdLCBkYXRhQXJyYXkpIDogdGhpcy51cGRhdGVBcnJheVN0YXRlKHN0YXRlLmRhdGEsIGRhdGFBcnJheSlcblxuICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIGRhdGE6IHVwZGF0ZWREYXRhLCBkYXRhT2JqZWN0OiBudWxsIH0gYXMgQVBJU3RhdGVNYW5hZ2VyRGF0YTxUPjtcblxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBkYXRhT2JqZWN0ID0gdGhpcy5pc0VtcHR5KGRhdGEpID8gbnVsbCA6IGRhdGE7XG4gICAgICByZXR1cm4geyAuLi5zdGF0ZSwgZGF0YTogW10sIGRhdGFPYmplY3Q6IGRhdGFPYmplY3QgfSBhcyBBUElTdGF0ZU1hbmFnZXJEYXRhPFQ+O1xuICAgIH1cblxuICB9KTtcblxuICBwcml2YXRlIHVwZGF0ZUFycmF5U3RhdGUoY3VycmVudERhdGE6IGFueVtdLCBuZXdEYXRhOiBhbnlbXSk6IGFueVtdIHtcblxuICAgIGNvbnN0IGZpbHRlckN1cnJlbnREYXRhID0gKCkgPT4ge1xuICAgICAgY29uc3QgaWRzID0gdGhpcy5zdHJlYW1lZFJlc3BvbnNlLm1hcCgob2JqOiBhbnkpID0+IG9iai5pZClcbiAgICAgIHJldHVybiBjdXJyZW50RGF0YS5maWx0ZXIob2JqID0+IChvYmouaWQpID8gaWRzLmluY2x1ZGVzKG9iai5pZCkgOiBvYmopXG4gICAgfVxuXG4gICAgY29uc3QgZmlsdGVyZWRDdXJyZW50RGF0YSA9ICh0aGlzLmh0dHBNYW5hZ2VyU2VydmljZS5pc1BlbmRpbmcudmFsdWUpID8gY3VycmVudERhdGEgOiBmaWx0ZXJDdXJyZW50RGF0YSgpXG5cbiAgICBjb25zdCB1cGRhdGVkRGF0YSA9IGZpbHRlcmVkQ3VycmVudERhdGEubWFwKGl0ZW0gPT4ge1xuICAgICAgICBjb25zdCBuZXdJdGVtID0gbmV3RGF0YS5maW5kKG5ld0l0ZW0gPT4ge1xuICAgICAgICAgIGNvbnN0IGhhc0lkID0gKG5ld0l0ZW0/LmlkICYmIGl0ZW0/LmlkKSA/IHRydWUgOiBmYWxzZVxuICAgICAgICAgIHJldHVybiAoaGFzSWQpID8gbmV3SXRlbS5pZCA9PT0gaXRlbS5pZCA6IEpTT04uc3RyaW5naWZ5KG5ld0l0ZW0pID09PSBKU09OLnN0cmluZ2lmeShpdGVtKVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gKG5ld0l0ZW0pID8geyAuLi5pdGVtLCAuLi5uZXdJdGVtIH0gOiBpdGVtXG4gICAgfSlcblxuICAgIGNvbnN0IGFkZGVkRGF0YSA9IG5ld0RhdGEuZmlsdGVyKG5ld0l0ZW0gPT4ge1xuICAgICAgcmV0dXJuICFmaWx0ZXJlZEN1cnJlbnREYXRhLnNvbWUoaXRlbSA9PiB7XG4gICAgICAgICAgY29uc3QgaGFzSWQgPSAobmV3SXRlbT8uaWQgJiYgaXRlbT8uaWQpID8gdHJ1ZSA6IGZhbHNlXG4gICAgICAgICAgcmV0dXJuIChoYXNJZCkgPyBpdGVtLmlkID09PSBuZXdJdGVtLmlkIDogSlNPTi5zdHJpbmdpZnkobmV3SXRlbSkgPT09IEpTT04uc3RyaW5naWZ5KGl0ZW0pXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICByZXR1cm4gWy4uLnVwZGF0ZWREYXRhLCAuLi5hZGRlZERhdGFdXG5cbn1cblxuICBwcml2YXRlIHJlYWRvbmx5IGFkZERhdGEkID0gdGhpcy51cGRhdGVyKChzdGF0ZTogQVBJU3RhdGVNYW5hZ2VyRGF0YTxUPiwgZGF0YTogVCkgPT4ge1xuXG4gIGlmICh0aGlzLmRhdGFUeXBlID09PSBEYXRhVHlwZS5BUlJBWSkge1xuICAgICAgY29uc3QgZXhpc3RzID0gc3RhdGUuZGF0YS5zb21lKGl0ZW0gPT4gaXRlbS5pZCA9PT0gZGF0YS5pZCk7XG5cbiAgICAgIGlmIChleGlzdHMpIHtcbiAgICAgICAgICBjb25zdCB1cGRhdGVkRGF0YSA9IHN0YXRlLmRhdGEubWFwKGl0ZW0gPT5cbiAgICAgICAgICBpdGVtLmlkID09PSBkYXRhLmlkID8gZGF0YSA6IGl0ZW1cbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4geyAuLi5zdGF0ZSwgZGF0YTogdXBkYXRlZERhdGEgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG5ld1N0YXRlID0gWy4uLnN0YXRlLmRhdGEsIGRhdGFdO1xuICAgICAgICByZXR1cm4geyAuLi5zdGF0ZSwgZGF0YTogbmV3U3RhdGUgfTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIGRhdGFPYmplY3Q6IGRhdGEgfTtcbiAgICB9XG5cbiAgfSlcblxuICBwcml2YXRlIHJlYWRvbmx5IGRlbGV0ZURhdGEkID0gdGhpcy51cGRhdGVyKChzdGF0ZTogQVBJU3RhdGVNYW5hZ2VyRGF0YTxUPiwgZGF0YTogVCAmIHsgaWQ6IG51bWJlciB9KSA9PiB7XG4gICAgaWYgKHRoaXMuZGF0YVR5cGUgPT09IERhdGFUeXBlLkFSUkFZKSB7XG4gICAgY29uc3QgbmV3U3RhdGUgPSBzdGF0ZS5kYXRhLmZpbHRlcihpdGVtID0+IGl0ZW0uaWQgIT09IGRhdGEuaWQpXG4gICAgcmV0dXJuIHsgLi4uc3RhdGUsIC4uLnsgZGF0YTogbmV3U3RhdGUgfSB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7IC4uLnN0YXRlLCAuLi57IGRhdGFPYmplY3Q6IG51bGwgfSB9XG4gICAgfVxuICB9KVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgdXBkYXRlRGF0YSQgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlOiBBUElTdGF0ZU1hbmFnZXJEYXRhPFQ+LCBkYXRhOiBUKSA9PiB7XG5cbiAgICBpZiAodGhpcy5kYXRhVHlwZSA9PT0gRGF0YVR5cGUuQVJSQVkpIHtcblxuICAgICAgY29uc3Qgb2JqSW5kZXggPSBzdGF0ZS5kYXRhLmZpbmRJbmRleChpdGVtID0+IGl0ZW0uaWQgPT09IGRhdGEuaWQpXG5cbiAgICAgIGlmIChvYmpJbmRleCA+IC0xKSB7XG4gICAgICAgIGNvbnN0IG5ld1N0YXRlID0gWy4uLnN0YXRlLmRhdGFdXG4gICAgICAgIG5ld1N0YXRlW29iakluZGV4XSA9IGRhdGFcbiAgICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIC4uLnsgZGF0YTogbmV3U3RhdGUgfSB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdGF0ZVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7IC4uLnN0YXRlLCAuLi57IGRhdGFPYmplY3Q6IGRhdGEgfSB9XG4gICAgfVxuXG4gIH0pXG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gRUZGRUNUU1xuXG4gIHJlYWRvbmx5IGNsZWFyUmVjb3JkcyA9IHRoaXMuZWZmZWN0KGRhdGEgPT5cbiAgICBkYXRhLnBpcGUoXG4gICAgICB0YXAoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5kYXRhVHlwZSA9PT0gRGF0YVR5cGUuQVJSQVkpIHtcbiAgICAgICAgICB0aGlzLnNldERhdGEkKFtdKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2V0RGF0YSQoe30pXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICkpXG5cbiAgcmVhZG9ubHkgcmVmcmVzaERhdGEgPSB0aGlzLmVmZmVjdChkYXRhID0+XG4gICAgZGF0YS5waXBlKFxuICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgLy8gdGhpcy5hcGlTZXJ2aWNlLmZsdXNoRGF0YWJhc2UodGhpcy5vdGhlck9wdGlvbnMuZGF0YWJhc2U/LnRhYmxlKVxuICAgICAgICB0aGlzLmZldGNoUmVjb3JkcygpXG4gICAgICB9KVxuICApKVxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIENSVUQgT1BFUkFUSU9OU1xuXG4gIC8vIEZFVENIIFJFQ09SRFNcbiAgcmVhZG9ubHkgZmV0Y2hSZWNvcmRzID0gKG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucykgPT5cbiAgICB0aGlzLmVmZmVjdDxhbnk+KCgpID0+XG4gICAgb2YoUmVxdWVzdE9wdGlvbnMuYWRhcHQob3B0aW9ucykpLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xuXG4gICAgICAgIHRoaXMuc3RyZWFtZWRSZXNwb25zZSA9IFtdXG4gICAgICAgIGNvbnN0IHJlcXVlc3RPcHRpb25zID0gdGhpcy51cGRhdGVSZXF1ZXN0T3B0aW9ucyhvcHRpb25zPy5oZWFkZXJzKVxuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBNYW5hZ2VyU2VydmljZS5nZXRSZXF1ZXN0KHJlcXVlc3RPcHRpb25zLCBvcHRpb25zPy5wYXRoKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YXAoKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgZGF0YSA9ICghZGF0YSkgPyAodGhpcy5kYXRhVHlwZSA9PT0gRGF0YVR5cGUuQVJSQVkpID8gW10gOiB7fSA6IGRhdGFcbiAgICAgICAgICAgIHRoaXMuc2V0RGF0YSQoZGF0YSlcbiAgICAgICAgICB9KVxuICAgICAgICApXG5cbiAgICAgIH0pXG4gICAgKVxuICApXG5cbiAgLy8gRkVUQ0ggUkVDT1JEXG4gIHJlYWRvbmx5IGZldGNoUmVjb3JkID0gKG9wdGlvbnM6IFJlcXVlc3RPcHRpb25zLCBtZXRob2Q6IHN0cmluZykgPT5cbiAgICB0aGlzLmVmZmVjdDxhbnk+KCgpID0+XG4gICAgb2YoUmVxdWVzdE9wdGlvbnMuYWRhcHQob3B0aW9ucykpLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKG9wdGlvbnMpID0+IHtcblxuICAgICAgICB0aGlzLnN0cmVhbWVkUmVzcG9uc2UgPSBbXVxuICAgICAgICBjb25zdCByZXF1ZXN0T3B0aW9ucyA9IHRoaXMudXBkYXRlUmVxdWVzdE9wdGlvbnMob3B0aW9ucz8uaGVhZGVycylcblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwTWFuYWdlclNlcnZpY2UuZ2V0UmVxdWVzdChyZXF1ZXN0T3B0aW9ucywgb3B0aW9ucz8ucGF0aClcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGFwKChkYXRhOiBhbnkpID0+IHtcblxuICAgICAgICAgICAgZGF0YSA9ICghZGF0YSkgPyAodGhpcy5kYXRhVHlwZSA9PT0gRGF0YVR5cGUuQVJSQVkpID8gW10gOiB7fSA6IGRhdGFcblxuICAgICAgICAgICAgY29uc3QgaWQgPSAob3B0aW9ucyBhcyBhbnkpLnBhdGg/Lmxlbmd0aCA/IG9wdGlvbnMucGF0aFtvcHRpb25zLnBhdGgubGVuZ3RoIC0xXSA6IG51bGxcblxuICAgICAgICAgICAgaWYobWV0aG9kID09PSAnREVMRVRFJykgdGhpcy5kZWxldGVEYXRhJCh7IGlkIH0gYXMgVCAmIHsgaWQ6IG51bWJlciB9KVxuICAgICAgICAgICAgaWYobWV0aG9kID09PSAnVVBEQVRFJykgdGhpcy51cGRhdGVEYXRhJChkYXRhKVxuICAgICAgICAgICAgaWYobWV0aG9kID09PSAnQ1JFQVRFJykgdGhpcy5hZGREYXRhJChkYXRhKVxuXG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuXG4gICAgICB9KVxuICAgIClcbiAgKVxuXG4gIC8vIENSRUFURSBSRUNPUkRcbiAgcmVhZG9ubHkgY3JlYXRlUmVjb3JkID0gKGRhdGE6IGFueXxudWxsLCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMpID0+XG4gICAgdGhpcy5lZmZlY3Q8YW55PigoKSA9PlxuICAgICAgb2YoZGF0YSkucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKChkYXRhOiBhbnkpID0+IHtcblxuICAgICAgICB0aGlzLnN0cmVhbWVkUmVzcG9uc2UgPSBbXVxuICAgICAgICBjb25zdCByZXF1ZXN0T3B0aW9ucyA9IHRoaXMudXBkYXRlUmVxdWVzdE9wdGlvbnMob3B0aW9ucz8uaGVhZGVycylcblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwTWFuYWdlclNlcnZpY2UucG9zdFJlcXVlc3QoZGF0YSwgcmVxdWVzdE9wdGlvbnMsIG9wdGlvbnM/LnBhdGgpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRhcCgoZGF0YTogYW55KSA9PiB7XG5cbiAgICAgICAgICAgIGRhdGEgPSAoIWRhdGEpID8gKHRoaXMuZGF0YVR5cGUgPT09IERhdGFUeXBlLkFSUkFZKSA/IFtdIDoge30gOiBkYXRhXG4gICAgICAgICAgICB0aGlzLmFkZERhdGEkKGRhdGEpXG5cbiAgICAgICAgICAgIGlmKHRoaXMud3NDb25uZWN0aW9uKSB0aGlzLndzQ29tbXVuaWNhdGlvbignQ1JFQVRFJywgWy4uLm9wdGlvbnM/LnBhdGggfHwgW10sIGRhdGEuaWRdKVxuXG4gICAgICAgICAgfSksXG4gICAgICAgIClcblxuICAgICAgfSlcbiAgICApXG4gIClcblxuICAvLyBVUERBVEUgUkVDT1JEXG4gIHJlYWRvbmx5IHVwZGF0ZVJlY29yZCA9IChkYXRhOiBhbnl8bnVsbCwgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zKSA9PlxuICAgIHRoaXMuZWZmZWN0PGFueT4oKCkgPT5cbiAgICBvZihkYXRhKS5waXBlKFxuICAgICAgY29uY2F0TWFwKChkYXRhOiBhbnkpID0+IHtcblxuICAgICAgICB0aGlzLnN0cmVhbWVkUmVzcG9uc2UgPSBbXVxuICAgICAgICBjb25zdCByZXF1ZXN0T3B0aW9ucyA9IHRoaXMudXBkYXRlUmVxdWVzdE9wdGlvbnMob3B0aW9ucz8uaGVhZGVycylcblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwTWFuYWdlclNlcnZpY2UucHV0UmVxdWVzdChkYXRhLCByZXF1ZXN0T3B0aW9ucywgb3B0aW9ucz8ucGF0aClcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGFwKChkYXRhOiBhbnkpID0+IHtcblxuICAgICAgICAgICAgZGF0YSA9ICghZGF0YSkgPyAodGhpcy5kYXRhVHlwZSA9PT0gRGF0YVR5cGUuQVJSQVkpID8gW10gOiB7fSA6IGRhdGFcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRGF0YSQoZGF0YSlcblxuICAgICAgICAgICAgaWYodGhpcy53c0Nvbm5lY3Rpb24pIHRoaXMud3NDb21tdW5pY2F0aW9uKCdVUERBVEUnLCBbLi4ub3B0aW9ucz8ucGF0aCB8fCBbXV0pXG5cbiAgICAgICAgICB9KSxcbiAgICAgICAgKVxuXG4gICAgICB9KVxuICAgIClcbiAgKVxuXG4gIC8vIERFTEVURSBSRUNPUkRcbiAgcmVhZG9ubHkgZGVsZXRlUmVjb3JkID0gKG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucykgPT5cbiAgICB0aGlzLmVmZmVjdDxhbnk+KCgpID0+XG4gICAgb2Yob3B0aW9ucykucGlwZShcbiAgICAgIGNvbmNhdE1hcCgoZGF0YTogYW55KSA9PiB7XG5cbiAgICAgICAgdGhpcy5zdHJlYW1lZFJlc3BvbnNlID0gW11cbiAgICAgICAgY29uc3QgcmVxdWVzdE9wdGlvbnMgPSB0aGlzLnVwZGF0ZVJlcXVlc3RPcHRpb25zKG9wdGlvbnM/LmhlYWRlcnMpXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cE1hbmFnZXJTZXJ2aWNlLmRlbGV0ZVJlcXVlc3QocmVxdWVzdE9wdGlvbnMsIG9wdGlvbnM/LnBhdGgpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRhcCgoZGF0YTogYW55KSA9PiB7XG5cbiAgICAgICAgICAgIGRhdGEgPSAoIWRhdGEpID8gKHRoaXMuZGF0YVR5cGUgPT09IERhdGFUeXBlLkFSUkFZKSA/IFtdIDoge30gOiBkYXRhXG4gICAgICAgICAgICB0aGlzLmRlbGV0ZURhdGEkKGRhdGEpXG5cbiAgICAgICAgICAgIGlmKHRoaXMud3NDb25uZWN0aW9uKSB0aGlzLndzQ29tbXVuaWNhdGlvbignREVMRVRFJywgWy4uLm9wdGlvbnM/LnBhdGggfHwgW11dKVxuXG4gICAgICAgICAgfSksXG4gICAgICAgIClcblxuICAgICAgfSlcbiAgICApXG4gIClcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBGRVRDSCBTVFJFQU1cblxuICByZWFkb25seSBjcmVhdGVTdHJlYW0gPSAoZGF0YTogYW55fG51bGwsIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucykgPT5cbiAgICB0aGlzLmVmZmVjdDxhbnk+KCgpID0+XG4gICAgb2YoZGF0YSkucGlwZShcbiAgICAgIHRhcCgoKSA9PiB0aGlzLmh0dHBNYW5hZ2VyU2VydmljZS5pc1BlbmRpbmcubmV4dCh0cnVlKSksXG4gICAgICBzd2l0Y2hNYXAoKGRhdGE6IGFueSkgPT4ge1xuXG4gICAgICAgIGNvbnN0IHJlcXVlc3RPcHRpb25zID0gdGhpcy51cGRhdGVSZXF1ZXN0T3B0aW9ucyhvcHRpb25zPy5oZWFkZXJzKVxuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBNYW5hZ2VyU2VydmljZS5wb3N0UmVxdWVzdChkYXRhLCByZXF1ZXN0T3B0aW9ucywgb3B0aW9ucz8ucGF0aClcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGFwKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYocmVzLmxlbmd0aCA+IDApIHRoaXMuc2V0RGF0YSQocmVzKVxuICAgICAgICAgICAgdGhpcy5zdHJlYW1lZFJlc3BvbnNlID0gcmVzXG4gICAgICAgICAgfSksXG4gICAgICAgICAgc2NhbigoYWNjLCByZXM6IGFueSkgPT4ge1xuXG4gICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IGFjYy5jdXJyZW50XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50ID0gcmVzXG4gICAgICAgICAgICByZXR1cm4geyBwcmV2aW91cywgY3VycmVudCB9O1xuXG4gICAgICAgICAgfSwgeyBwcmV2aW91czogbnVsbCwgY3VycmVudDogbnVsbCB9KSxcbiAgICAgICAgICB0YXAoKHsgcHJldmlvdXMsIGN1cnJlbnQgfSkgPT4ge1xuXG4gICAgICAgICAgICBpZihwcmV2aW91cyAmJiBKU09OLnN0cmluZ2lmeShwcmV2aW91cykgPT09IEpTT04uc3RyaW5naWZ5KGN1cnJlbnQpKSB7XG4gICAgICAgICAgICAgIHRoaXMuaHR0cE1hbmFnZXJTZXJ2aWNlLmlzUGVuZGluZy5uZXh0KGZhbHNlKVxuICAgICAgICAgICAgICB0aGlzLnNldERhdGEkKFtdKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5odHRwTWFuYWdlclNlcnZpY2UuaXNQZW5kaW5nLm5leHQodHJ1ZSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0pXG4gICAgICAgIClcblxuICAgICAgfSlcbiAgICApXG5cbiAgKVxuXG4gIHJlYWRvbmx5IGZldGNoU3RyZWFtID0gKG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucykgPT5cbiAgICB0aGlzLmVmZmVjdDxhbnk+KCgpID0+XG4gICAgb2Yob3B0aW9ucykucGlwZShcbiAgICAgIHRhcCgoKSA9PiB0aGlzLmh0dHBNYW5hZ2VyU2VydmljZS5pc1BlbmRpbmcubmV4dCh0cnVlKSksXG4gICAgICBzd2l0Y2hNYXAoKG9wdGlvbnM6IGFueSkgPT4ge1xuXG4gICAgICAgIGNvbnN0IHJlcXVlc3RPcHRpb25zID0gdGhpcy51cGRhdGVSZXF1ZXN0T3B0aW9ucyhvcHRpb25zPy5oZWFkZXJzKVxuICAgICAgICByZXF1ZXN0T3B0aW9ucy5zdHJlYW0gPSB0cnVlXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cE1hbmFnZXJTZXJ2aWNlLmdldFJlcXVlc3QocmVxdWVzdE9wdGlvbnMsIG9wdGlvbnM/LnBhdGgpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRhcCgocmVzOiBhbnkpID0+IHtcblxuICAgICAgICAgICAgaWYocmVzLmxlbmd0aCA+IDApIHRoaXMuc2V0RGF0YSQocmVzKVxuICAgICAgICAgICAgdGhpcy5zdHJlYW1lZFJlc3BvbnNlID0gcmVzXG4gICAgICAgICAgfSksXG4gICAgICAgICAgc2NhbigoYWNjLCByZXM6IGFueSkgPT4ge1xuXG4gICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IGFjYy5jdXJyZW50XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50ID0gcmVzXG4gICAgICAgICAgICByZXR1cm4geyBwcmV2aW91cywgY3VycmVudCB9XG5cbiAgICAgICAgICB9LCB7IHByZXZpb3VzOiBudWxsLCBjdXJyZW50OiBudWxsIH0pLFxuICAgICAgICAgIHRhcCgoeyBwcmV2aW91cywgY3VycmVudCB9KSA9PiB7XG5cbiAgICAgICAgICAgIGlmKHByZXZpb3VzICYmIEpTT04uc3RyaW5naWZ5KHByZXZpb3VzKSA9PT0gSlNPTi5zdHJpbmdpZnkoY3VycmVudCkpIHtcbiAgICAgICAgICAgICAgdGhpcy5odHRwTWFuYWdlclNlcnZpY2UuaXNQZW5kaW5nLm5leHQoZmFsc2UpXG4gICAgICAgICAgICAgIHRoaXMuc2V0RGF0YSQoW10pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmh0dHBNYW5hZ2VyU2VydmljZS5pc1BlbmRpbmcubmV4dCh0cnVlKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuXG4gICAgICB9KSxcbiAgICApXG4gIClcblxuICBwcml2YXRlIHdzQ29tbXVuaWNhdGlvbihtZXRob2Q6IHN0cmluZywgcGF0aD86IHN0cmluZ3xudW1iZXJbXSkge1xuXG4gICAgaWYodGhpcy53c0Nvbm5lY3Rpb24gJiYgdGhpcy5hcGlPcHRpb25zLndzKSB7XG4gICAgICBjb25zdCB3c1NlcnZlciA9IHRoaXMuYXBpT3B0aW9ucy53cy5pZFxuICAgICAgdGhpcy5odHRwTWFuYWdlclNlcnZpY2Uuc2VuZE1lc3NhZ2Uod3NTZXJ2ZXIsIHsgbWV0aG9kLCBwYXRoIH0pXG4gICAgfVxuXG4gIH1cblxuICB3c01lc3NhZ2luZyhtZXNzYWdlOiBDaGFubmVsTWVzc2FnZSwgY2hhbm5lbD86IHN0cmluZykge1xuXG4gICAgY29uc3QgdXNlciA9IFVzZXJJbmZvLmFkYXB0KHRoaXMudXNlci52YWx1ZSlcbiAgICBjb25zdCBtZXNzYWdlSW5mbyA9IENoYW5uZWxNZXNzYWdlLmFkYXB0KHsgLi4ubWVzc2FnZSwgZnJvbVVzZXI6IHVzZXIgfSlcblxuICAgIGlmKHRoaXMud3NDb25uZWN0aW9uICYmIHRoaXMuYXBpT3B0aW9ucy53cykge1xuXG4gICAgICBjb25zdCB3c1NlcnZlciA9IChjaGFubmVsKSA/IGNoYW5uZWwgOiB0aGlzLmFwaU9wdGlvbnMud3MuaWRcblxuICAgICAgaWYobWVzc2FnZUluZm8udG9Vc2VyID09PSAnYWxsQ2hhbm5lbHMnKSB7XG4gICAgICAgIHRoaXMuaHR0cE1hbmFnZXJTZXJ2aWNlLnNlbmRCcm9hZGNhc3QobWVzc2FnZUluZm8pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmh0dHBNYW5hZ2VyU2VydmljZS5zZW5kTWVzc2FnZSh3c1NlcnZlciwgbWVzc2FnZUluZm8pXG4gICAgICB9XG5cbiAgICB9XG5cbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIE1JU0NcblxuICBwcml2YXRlIGlzRW1wdHkob2JqOiBhbnkpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5sZW5ndGggPT09IDBcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlUmVxdWVzdE9wdGlvbnMoaGVhZGVycz86IGFueSk6IEFwaVJlcXVlc3Qge1xuXG4gICAgY29uc3Qgb3B0aW9ucyA9IEFwaVJlcXVlc3QuYWRhcHQoeyAuLi50aGlzLmFwaU9wdGlvbnMgfSlcblxuICAgIG9wdGlvbnMuaGVhZGVycyA9IChoZWFkZXJzKVxuICAgICAgICAgID8geyAuLi5vcHRpb25zLmhlYWRlcnMsIC4uLmhlYWRlcnMgfVxuICAgICAgICAgIDogeyAuLi5vcHRpb25zLmhlYWRlcnMgfVxuXG4gICAgcmV0dXJuIG9wdGlvbnNcbiAgfVxuXG59XG4iXX0=
|
|
591
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1tYW5hZ2VyLXN0YXRlLnN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaHR0cC1yZXF1ZXN0LW1hbmFnZXIvc3JjL2xpYi9zZXJ2aWNlcy9yZXF1ZXN0LW1hbmFnZXItc3RhdGUtc2VydmljZS9odHRwLW1hbmFnZXItc3RhdGUuc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFdkQsT0FBTyxFQUFFLGVBQWUsRUFBYyxFQUFFLEVBQUUsT0FBTyxFQUFnQixLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVGLE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsb0JBQW9CLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2SSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDdEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2pFLE9BQU8sRUFBZSxjQUFjLEVBQWUsTUFBTSw4QkFBOEIsQ0FBQztBQUN4RixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0UsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDckUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBQ2pGLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxXQUFXLEVBQUUsTUFBTSxr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ZWN0LCBJbmplY3QsIEluamVjdGFibGUsIEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21wb25lbnRTdG9yZSB9IGZyb20gJ0BuZ3J4L2NvbXBvbmVudC1zdG9yZSc7XG5cbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgb2YsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiwgdGltZXIsIG1lcmdlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YXAsIHN3aXRjaE1hcCwgY29uY2F0TWFwLCBzY2FuLCBkZWxheSwgdGFrZSwgbWFwLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgdGFrZVVudGlsLCB0YWtlV2hpbGUsIGZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IERhdGFiYXNlU3RvcmFnZSB9IGZyb20gJy4uLy4uL21vZGVscy9kYXRhYmFzZS1zdG9yYWdlLm1vZGVsJztcbmltcG9ydCB7IEFwaVJlcXVlc3QsIFJlcXVlc3RPcHRpb25zLCBXU09wdGlvbnMgfSBmcm9tICcuL21vZGVscyc7XG5pbXBvcnQgeyBDaGFubmVsSW5mbywgQ2hhbm5lbE1lc3NhZ2UsIFVzZXJNZXNzYWdlIH0gZnJvbSAnLi4vd3MtbWFuYWdlci1zZXJ2aWNlL21vZGVscyc7XG5pbXBvcnQgeyBIVFRQTWFuYWdlclNlcnZpY2UsIERhdGFUeXBlIH0gZnJvbSAnLi4vcmVxdWVzdC1tYW5hZ2VyLXNlcnZpY2VzJztcbmltcG9ydCB7IERhdGFiYXNlTWFuYWdlclNlcnZpY2UgfSBmcm9tICcuLi9kYXRhYmFzZS1tYW5hZ2VyLXNlcnZpY2UnO1xuaW1wb3J0IHsgVGFibGVTY2hlbWFEZWYgfSBmcm9tICcuLi9kYXRhYmFzZS1tYW5hZ2VyLXNlcnZpY2UvbW9kZWxzL3RhYmxlLXNjaGVtYSc7XG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2VNYW5hZ2VyU2VydmljZSwgU3RvcmFnZVR5cGUgfSBmcm9tICcuLi9sb2NhbC1zdG9yYWdlLW1hbmFnZXItc2VydmljZSc7XG5pbXBvcnQgeyBTZXR0aW5nT3B0aW9ucyB9IGZyb20gJy4uL2xvY2FsLXN0b3JhZ2UtbWFuYWdlci1zZXJ2aWNlL21vZGVscy9zZXR0aW5nLW9wdGlvbnMubW9kZWwnO1xuaW1wb3J0IHsgVXRpbHNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4nO1xuXG5jb25zdCBBUElfT1BUUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxBcGlSZXF1ZXN0PignQVBJX09QVFMnKTtcblxuZXhwb3J0IGludGVyZmFjZSBBUElTdGF0ZU1hbmFnZXJEYXRhPFQ+IHtcbiAgZGF0YTogVFtdXG4gIGRhdGFPYmplY3Q6IFQgfCBudWxsXG59XG5cbmNvbnN0IGRlZmF1bHRTdGF0ZTogQVBJU3RhdGVNYW5hZ2VyRGF0YTxhbnk+ID0ge1xuICBkYXRhOiBbXSxcbiAgZGF0YU9iamVjdDogbnVsbCxcbn07XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBIVFRQTWFuYWdlclN0YXRlU2VydmljZTxUIGV4dGVuZHMgeyBpZDogbnVtYmVyIH0+IGV4dGVuZHMgQ29tcG9uZW50U3RvcmU8QVBJU3RhdGVNYW5hZ2VyRGF0YTxUPj4ge1xuXG4gIGh0dHBNYW5hZ2VyU2VydmljZSA9IGluamVjdChIVFRQTWFuYWdlclNlcnZpY2UpXG4gIGRiTWFuYWdlclNlcnZpY2UgPSBpbmplY3QoRGF0YWJhc2VNYW5hZ2VyU2VydmljZSlcbiAgbG9jYWxTdG9yYWdlTWFuYWdlclNlcnZpY2UgPSBpbmplY3QoTG9jYWxTdG9yYWdlTWFuYWdlclNlcnZpY2UpXG4gIHV0aWxzID0gaW5qZWN0KFV0aWxzU2VydmljZSlcblxuICBlcnJvciQgPSB0aGlzLmh0dHBNYW5hZ2VyU2VydmljZS5lcnJvciRcbiAgaXNQZW5kaW5nJCA9IHRoaXMuaHR0cE1hbmFnZXJTZXJ2aWNlLmlzUGVuZGluZyQucGlwZShkZWxheSgxKSlcblxuICAvLyBQQUdJTkFUSU9OXG4gIHByaXZhdGUgcGFnZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKVxuICBwYWdlJCA9IHRoaXMucGFnZS5hc09ic2VydmFibGUoKVxuXG4gIHByaXZhdGUgdG90YWxQYWdlcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKVxuICB0b3RhbFBhZ2VzJCA9IHRoaXMudG90YWxQYWdlcy5hc09ic2VydmFibGUoKVxuXG4gIHByaXZhdGUgcGVyY2VudGFnZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKVxuICBwZXJjZW50YWdlJCA9IHRoaXMucGVyY2VudGFnZS5hc09ic2VydmFibGUoKVxuXG4gIHByaXZhdGUgaGFzRGF0YWJhc2UgPSBmYWxzZVxuXG4gIHN0cmVhbWVkUmVzcG9uc2UgPSBbXVxuXG4gIC8vIFdTXG4gIHByaXZhdGUgbWF4UmV0cmllczogbnVtYmVyXG4gIHByaXZhdGUgcmV0cnlEZWxheTogbnVtYmVyXG4gIHByaXZhdGUgc2hvdWxkUmV0cnkgPSB0cnVlXG5cbiAgcHJpdmF0ZSB3c1JldHJ5QXR0ZW1wdHMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMClcbiAgd3NSZXRyeUF0dGVtcHRzJCA9IHRoaXMud3NSZXRyeUF0dGVtcHRzLmFzT2JzZXJ2YWJsZSgpXG5cbiAgcHJpdmF0ZSB3c05leHRSZXRyeTogQmVoYXZpb3JTdWJqZWN0PG51bWJlcj5cbiAgd3NOZXh0UmV0cnkkOiBPYnNlcnZhYmxlPG51bWJlcj5cblxuXG4gIG1lc3NhZ2VzJDogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XG4gIGNvbm5lY3Rpb25TdGF0dXMkOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIHVzZXJMaXN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4oW10pXG4gIHVzZXJMaXN0JCA9IHRoaXMudXNlckxpc3QuYXNPYnNlcnZhYmxlKClcblxuICBwcml2YXRlIHVzZXIgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueXxudWxsPihudWxsKVxuICB1c2VyJCA9IHRoaXMudXNlci5hc09ic2VydmFibGUoKVxuXG4gIHByaXZhdGUgY29tbXVuaWNhdGlvbk1lc3NhZ2VzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxVc2VyTWVzc2FnZVtdPihbXSlcbiAgY29tbXVuaWNhdGlvbk1lc3NhZ2VzJCA9IHRoaXMuY29tbXVuaWNhdGlvbk1lc3NhZ2VzLmFzT2JzZXJ2YWJsZSgpXG5cbiAgcHJpdmF0ZSBsYXRlc3RDb21tdW5pY2F0aW9uTWVzc2FnZXMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFVzZXJNZXNzYWdlfG51bGw+KG51bGwpXG4gIGxhdGVzdENvbW11bmljYXRpb25NZXNzYWdlcyQgPSB0aGlzLmxhdGVzdENvbW11bmljYXRpb25NZXNzYWdlcy5hc09ic2VydmFibGUoKVxuXG4gIGNoYW5uZWxzOiBDaGFubmVsSW5mb1tdID0gW11cbiAgY2hhbm5lbExpc3Q6IHN0cmluZ1tdID0gW11cbiAgbWVzc2FnZXM6IGFueVtdID0gW11cblxuICB3c0Nvbm5lY3Rpb24gPSBmYWxzZVxuICB3c09wdGlvbnMgPSBXU09wdGlvbnMuYWRhcHQoKVxuXG4gIHB1YmxpYyBzdGF0dXMkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoQVBJX09QVFMpIHByaXZhdGUgYXBpT3B0aW9ucyA9IEFwaVJlcXVlc3QuYWRhcHQoKSxcbiAgICBASW5qZWN0KFwiZGF0YVR5cGVcIikgcHJpdmF0ZSBkYXRhVHlwZTogRGF0YVR5cGUgfCB1bmRlZmluZWQsXG4gICAgQEluamVjdChcImRhdGFiYXNlXCIpIHByaXZhdGUgZGF0YWJhc2U/OiBEYXRhYmFzZVN0b3JhZ2UgfCB1bmRlZmluZWRcbiAgKSB7XG5cbiAgICBzdXBlcihkZWZhdWx0U3RhdGUpO1xuXG4gICAgdGhpcy5tYXhSZXRyaWVzID0gdGhpcy5hcGlPcHRpb25zLndzPy5yZXRyeT8udGltZXMgfHwgM1xuICAgIHRoaXMucmV0cnlEZWxheSA9ICh0aGlzLmFwaU9wdGlvbnMud3M/LnJldHJ5Py5kZWxheSAmJiB0aGlzLmFwaU9wdGlvbnMud3MucmV0cnkuZGVsYXkgKiAxMDAwKSB8fCA1ICogMTAwMFxuICAgIHRoaXMud3NOZXh0UmV0cnkgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4odGhpcy5yZXRyeURlbGF5KVxuICAgIHRoaXMud3NOZXh0UmV0cnkkID0gdGhpcy53c05leHRSZXRyeS5hc09ic2VydmFibGUoKVxuXG4gICAgdGhpcy5zZXRBcGlSZXF1ZXN0T3B0aW9ucyhhcGlPcHRpb25zLCBkYXRhVHlwZSwgZGF0YWJhc2UpXG4gICAgdGhpcy5zdGF0dXMkID0gdGhpcy5zZXR1cENvbm5lY3Rpb25TdGF0dXMoKTtcblxuICAgIGlmICh0aGlzLmRhdGFiYXNlICYmIHRoaXMuZGF0YWJhc2UudGFibGUpIHtcblxuICAgICAgdGhpcy5sb2NhbFN0b3JhZ2VNYW5hZ2VyU2VydmljZS5jcmVhdGVTdG9yZSh7XG4gICAgICAgIG5hbWU6IHRoaXMuZGF0YWJhc2UudGFibGUsXG4gICAgICAgIGRhdGE6IHsgLi4udGhpcy5kYXRhYmFzZSwgLi4ueyBleHBpcmVzOiB0aGlzLnV0aWxzLmV4cGlyZXModGhpcy5kYXRhYmFzZS5leHBpcmVzSW4pfSB9LFxuICAgICAgICBvcHRpb25zOiBTZXR0aW5nT3B0aW9ucy5hZGFwdCh7XG4gICAgICAgICAgc3RvcmFnZTogU3RvcmFnZVR5cGUuR0xPQkFMLFxuICAgICAgICAgIGVuY3J5cHRlZDogZmFsc2UsXG4gICAgICAgIH0pXG4gICAgICB9KVxuXG4gICAgfVxuXG4gIH1cblxuICBzZXRBcGlSZXF1ZXN0T3B0aW9ucyhhcGlPcHRpb25zPzogQXBpUmVxdWVzdCwgZGF0YVR5cGU/OiBEYXRhVHlwZSwgZGF0YWJhc2U/OiBEYXRhYmFzZVN0b3JhZ2UpIHtcblxuICAgIHRoaXMuYXBpT3B0aW9ucyA9IEFwaVJlcXVlc3QuYWRhcHQoYXBpT3B0aW9ucylcbiAgICB0aGlzLmRhdGFUeXBlID0gKGRhdGFUeXBlKSA/IGRhdGFUeXBlIDogRGF0YVR5cGUuQVJSQVlcblxuICAgIHRoaXMuaGFzRGF0YWJhc2UgPSAodGhpcy5kYXRhYmFzZT8udGFibGUpID8gdHJ1ZSA6IGZhbHNlXG4gICAgdGhpcy5kYXRhYmFzZSA9ICh0aGlzLmhhc0RhdGFiYXNlKSA/IERhdGFiYXNlU3RvcmFnZS5hZGFwdChkYXRhYmFzZSkgOiB1bmRlZmluZWRcblxuICAgIGlmKHRoaXMuZGF0YWJhc2UpIHRoaXMuaW5pdERCU3RvcmFnZSgpXG4gICAgaWYodGhpcy5hcGlPcHRpb25zLndzKSB0aGlzLmluaXRXUyh0aGlzLmFwaU9wdGlvbnMud3MgYXMgV1NPcHRpb25zKVxuXG4gIH1cblxuICAvLyBXZWJTb2NrZXRcbiAgcHJpdmF0ZSBzZXR1cENvbm5lY3Rpb25TdGF0dXMoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cE1hbmFnZXJTZXJ2aWNlLmNvbm5lY3Rpb25TdGF0dXMkLnBpcGUoXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgc3dpdGNoTWFwKHN0YXR1cyA9PiB7XG5cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHRoaXMuc2hvdWxkUmV0cnkgPSB0cnVlXG4gICAgICAgICAgdGhpcy53c1JldHJ5QXR0ZW1wdHMubmV4dCgwKTtcbiAgICAgICAgICB0aGlzLndzTmV4dFJldHJ5Lm5leHQoMCk7XG4gICAgICAgICAgcmV0dXJuIG9mKHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLnNob3VsZFJldHJ5KSByZXR1cm4gb2YoZmFsc2UpXG5cbiAgICAgICAgY29uc3QgY291bnRkb3duRW5kZXIkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAgICAgICByZXR1cm4gdGltZXIoMCwgdGhpcy5yZXRyeURlbGF5KVxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YWtlKHRoaXMubWF4UmV0cmllcyksXG4gICAgICAgICAgdGFwKGkgPT4ge1xuXG4gICAgICAgICAgICBjb25zdCBhdHRlbXB0ID0gaSArIDE7XG4gICAgICAgICAgICB0aGlzLndzUmV0cnlBdHRlbXB0cy5uZXh0KGF0dGVtcHQpO1xuICAgICAgICAgICAgY291bnRkb3duRW5kZXIkLm5leHQoKTtcbiAgICAgICAgICAgIHRoaXMuaW5pdFdTKHRoaXMuYXBpT3B0aW9ucy53cyBhcyBXU09wdGlvbnMpO1xuXG4gICAgICAgICAgICBpZiAoYXR0ZW1wdCA9PT0gdGhpcy5tYXhSZXRyaWVzKSB7XG4gICAgICAgICAgICAgIHRoaXMud3NOZXh0UmV0cnkubmV4dCgwKVxuICAgICAgICAgICAgICAvLyAgIGNvbnNvbGUuZXJyb3IoYPCfmqggRkFJTEVEIENPTk5FQ1RJT046IFRyaWVkICMke2F0dGVtcHR9IHRpbWVzYCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyAgIGNvbnNvbGUubG9nKGDimqDvuI8gUmV0cnkgQXR0ZW1wdCAjJHthdHRlbXB0fTogUmV0cnlpbmcgaW4gJHt0aGlzLnJldHJ5RGVsYXkgLyAxMDAwfXNgKTtcbiAgICAgICAgICAgICAgY29uc3Qgc2Vjb25kcyA9IHRoaXMucmV0cnlEZWxheSAvIDEwMDA7XG5cbiAgICAgICAgICAgICAgdGltZXIoMCwgMTAwMCkucGlwZShcbiAgICAgICAgICAgICAgICBtYXAodGljayA9PiBzZWNvbmRzIC0gdGljayksXG4gICAgICAgICAgICAgICAgdGFrZVdoaWxlKHZhbCA9PiB2YWwgPj0gMCksXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsKGNvdW50ZG93bkVuZGVyJClcbiAgICAgICAgICAgICAgKS5zdWJzY3JpYmUocmVtYWluaW5nID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLndzTmV4dFJldHJ5Lm5leHQocmVtYWluaW5nKTtcbiAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSksXG4gICAgICAgICAgbWFwKCgpID0+IGZhbHNlKVxuICAgICAgICApXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvLyBXZWJTb2NrZXRcbiAgcmVhZG9ubHkgaW5pdFdTID0gdGhpcy5lZmZlY3Q8V1NPcHRpb25zPigod3NPcHRpb25zJCkgPT5cbiAgICB3c09wdGlvbnMkLnBpcGUoXG4gICAgICB0YXAoKHdzT3B0aW9ucykgPT4ge1xuICAgICAgICB0aGlzLndzT3B0aW9ucyA9IHdzT3B0aW9uc1xuICAgICAgICBpZiAod3NPcHRpb25zPy53c1NlcnZlcikgdGhpcy5odHRwTWFuYWdlclNlcnZpY2UuY29ubmVjdCh3c09wdGlvbnMud3NTZXJ2ZXIsIHdzT3B0aW9ucy5qd3RUb2tlbilcbiAgICAgIH0pLFxuICAgICAgc3dpdGNoTWFwKCh3c09wdGlvbnMpID0+XG4gICAgICAgIG1lcmdlKFxuICAgICAgICAgIHRoaXMuaHR0cE1hbmFnZXJTZXJ2aWNlLmNvbm5lY3Rpb25TdGF0dXMkLnBpcGUoXG4gICAgICAgICAgICB0YXAoKGlzQ29ubmVjdGVkOiBhbnkpID0+IHtcblxuICAgICAgICAgICAgICB0aGlzLndzQ29ubmVjdGlvbiA9IGlzQ29ubmVjdGVkXG5cbiAgICAgICAgICAgICAgaWYgKGlzQ29ubmVjdGVkKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ/Cfn6IgV2ViU29ja2V0IGNvbm5lY3Rpb24gaXMgb3Blbi4nKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfwn5S0IFdlYlNvY2tldCBjb25uZWN0aW9uIGlzIGNsb3NlZC4nKVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKSxcbiAgICAgICAgICB0aGlzLmh0dHBNYW5hZ2VyU2VydmljZS5tZXNzYWdlcyQucGlwZShcbiAgICAgICAgICAgIHRhcCgobWVzc2FnZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgIGlmICghbWVzc2FnZSkgcmV0dXJuXG5cbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1JlY2VpdmVkOicsIG1lc3NhZ2UudHlwZSlcblxuICAgICAgICAgICAgICBpZiAobWVzc2FnZS5lcnJvciA9PT0gJ0pXVF9JTlZBTElEJykge1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvdWxkUmV0cnkgPSBmYWxzZVxuICAgICAgICAgICAgICAgIHRoaXMuaHR0cE1hbmFnZXJTZXJ2aWNlLmRpc2Nvbm5lY3QoKVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFVzZXIgPSB0aGlzLmFwaU9wdGlvbnMud3M/LnVzZXJBZGFwdGVyPy5hZGFwdGVyPy4obWVzc2FnZS5kYXRhKSB8fCBtZXNzYWdlLmRhdGFcbiAgICAgICAgICAgICAgICB0aGlzLnVzZXIubmV4dChjdXJyZW50VXNlcilcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS50eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnY2hhbm5lbHNMaXN0JzpcblxuICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ/CfkqwgQ2hhbm5lbHM6JywgbWVzc2FnZS5jaGFubmVscylcblxuICAgICAgICAgICAgICAgICAgdGhpcy5jaGFubmVsTGlzdCA9IG1lc3NhZ2UuY2hhbm5lbHNcblxuICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hhbm5lbExpc3QuaW5jbHVkZXMod3NPcHRpb25zLmlkKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmh0dHBNYW5hZ2VyU2VydmljZS5zdWJzY3JpYmVUb0NoYW5uZWwod3NPcHRpb25zLmlkKVxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5odHRwTWFuYWdlclNlcnZpY2UuY3JlYXRlQ2hhbm5lbCh3c09wdGlvbnMuaWQpXG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAnc3RhdGVNYW5nZXJNZXNzYWdlJzpcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfwn5KsIE1lc3NhZ2U6JywgbWVzc2FnZS5jb250ZW50KVxuICAgICAgICAgICAgICAgICAgdGhpcy5mZXRjaFJlY29yZChSZXF1ZXN0T3B0aW9ucy5hZGFwdCh7IHBhdGg6IG1lc3NhZ2UuY29udGVudC5wYXRoIH0pLCBtZXNzYWdlLmNvbnRlbnQubWV0aG9kKVxuICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlICdjaGFubmVsTWVzc2FnZSc6XG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn8J+SrCBNZXNzYWdlOicsIG1lc3NhZ2UuY29udGVudClcbiAgICAgICAgICAgICAgICAgIHRoaXMuZmV0Y2hSZWNvcmQoUmVxdWVzdE9wdGlvbnMuYWRhcHQoeyBwYXRoOiBtZXNzYWdlLmNvbnRlbnQucGF0aCB9KSwgbWVzc2FnZS5jb250ZW50Lm1ldGhvZClcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAnY2hhbm5lbENvbW11bmljYXRpb24nOlxuICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ/CfkqwgTWVzc2FnZSBDb21tdW5pY2F0aW9uOicsIG1lc3NhZ2UuY29udGVudClcbiAgICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kTWVzc2FnZXMobWVzc2FnZS5jb250ZW50KVxuICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlICdjaGFubmVsQWxlcnRzJzpcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfwn5KsIE1lc3NhZ2UgQWxlcnRzOicsIG1lc3NhZ2UuY29udGVudClcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAndXNlcnNJbkNoYW5uZWwnOlxuXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IG1lc3NhZ2UuZGF0YVxuICAgICAgICAgICAgICAgIGNvbnN0IHdzVXNlcnMgPSBkYXRhLnVzZXJzLm1hcCgoaXRlbTogYW55KSA9PiB0aGlzLmFwaU9wdGlvbnMud3M/LnVzZXJBZGFwdGVyPy5hZGFwdGVyPy4oaXRlbSkgfHwgaXRlbSlcbiAgICAgICAgICAgICAgICBjb25zdCB1c2VyTGlzdCA9IHdzVXNlcnMuZmlsdGVyKChpdGVtOiBhbnkpID0+IGl0ZW0udXNlcm5hbWUgIT09IHRoaXMudXNlci52YWx1ZVt0aGlzLndzT3B0aW9ucy51c2VyQWRhcHRlcj8uaWQgfHwgJ2lkJ10pXG5cbiAgICAgICAgICAgICAgICAgIHRoaXMudXNlckxpc3QubmV4dCh1c2VyTGlzdClcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfwn5GlIFVzZXJzOicsIHVzZXJMaXN0KVxuICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UpIHRoaXMubWVzc2FnZXMucHVzaChtZXNzYWdlKVxuICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIClcbiAgICApXG4gICk7XG5cbiAgYXBwZW5kTWVzc2FnZXMobWVzc2FnZTogVXNlck1lc3NhZ2UpIHtcbiAgICBjb25zdCBjdXJyZW50TWVzc2FnZXMgPSB0aGlzLmNvbW11bmljYXRpb25NZXNzYWdlcy52YWx1ZVxuICAgIHRoaXMuY29tbXVuaWNhdGlvbk1lc3NhZ2VzLm5leHQoWy4uLmN1cnJlbnRNZXNzYWdlcywgbWVzc2FnZV0pXG4gICAgdGhpcy5sYXRlc3RNZXNzYWdlKClcbiAgfVxuXG4gIGxhdGVzdE1lc3NhZ2UoKSB7XG4gICAgY29uc3QgbWVzc2FnZXMgPSB0aGlzLmNvbW11bmljYXRpb25NZXNzYWdlcy52YWx1ZVxuICAgIGNvbnN0IGxhdGVzdE1lc3NhZ2UgPSBtZXNzYWdlc1ttZXNzYWdlcy5sZW5ndGggLTFdXG4gICAgdGhpcy5sYXRlc3RDb21tdW5pY2F0aW9uTWVzc2FnZXMubmV4dChsYXRlc3RNZXNzYWdlKVxuICB9XG5cbiAgY2xlYXJNZXNzYWdlcygpIHtcbiAgICB0aGlzLmNvbW11bmljYXRpb25NZXNzYWdlcy5uZXh0KFtdKVxuICB9XG5cbiAgZ2V0IEFwaVJlcXVlc3RPcHRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLmFwaU9wdGlvbnNcbiAgfVxuXG4gIHJlYWRvbmx5IGluaXREQlN0b3JhZ2UgPSB0aGlzLmVmZmVjdDx2b2lkPigodHJpZ2dlciQpID0+XG4gICAgdHJpZ2dlciQucGlwZShcbiAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmRhdGFUeXBlICE9PSBEYXRhVHlwZS5BUlJBWSkgY29uc29sZS53YXJuKCdEYXRhYmFzZSBzdG9yYWdlIHJlcXVpcmVzIGRhdGFUeXBlIHRvIGJlIEFSUkFZJyk7XG4gICAgICAgIGlmICghdGhpcy5hcGlPcHRpb25zLmFkYXB0ZXIpIGNvbnNvbGUud2FybignRGF0YWJhc2Ugc3RvcmFnZSByZXF1aXJlcyBhbiBhZGFwdGVyIHRvIGRlZmluZSB0aGUgZGF0YSBzaGFwZScpO1xuICAgICAgICBpZiAoIXRoaXMuZGF0YWJhc2U/LnRhYmxlKSBjb25zb2xlLndhcm4oJ0RhdGFiYXNlIHN0b3JhZ2UgcmVxdWlyZXMgYSB0YWJsZSBuYW1lJyk7XG4gICAgICB9KSxcbiAgICAgIGZpbHRlcigoKSA9PiB0aGlzLmRhdGFUeXBlID09PSBEYXRhVHlwZS5BUlJBWSAmJiAhIXRoaXMuYXBpT3B0aW9ucy5hZGFwdGVyICYmICEhdGhpcy5kYXRhYmFzZT8udGFibGUpLFxuICAgICAgc3dpdGNoTWFwKCgpID0+IHtcbiAgICAgICAgY29uc3Qgc2FtcGxlRGF0YSA9IHRoaXMuYXBpT3B0aW9ucy5hZGFwdGVyPy4oe30pIHx8IHt9O1xuICAgICAgICBjb25zdCBzY2hlbWFLZXlzID0gT2JqZWN0LmtleXMoc2FtcGxlRGF0YSkuZmlsdGVyKGtleSA9PiBzYW1wbGVEYXRhW2tleV0gIT09IHVuZGVmaW5lZCk7XG5cbiAgICAgICAgbGV0IHNjaGVtYSA9ICcrK2lkJztcblxuICAgICAgICBpZiAoc2NoZW1hS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3Qgb3RoZXJLZXlzID0gc2NoZW1hS2V5cy5maWx0ZXIoayA9PiBrICE9PSAnaWQnKTtcbiAgICAgICAgICBpZiAob3RoZXJLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHNjaGVtYSArPSAnLCAnICsgb3RoZXJLZXlzLmpvaW4oJywgJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGFibGVEZWYgPSBUYWJsZVNjaGVtYURlZi5hZGFwdCh7XG4gICAgICAgICAgdGFibGU6IHRoaXMuZGF0YWJhc2U/LnRhYmxlLFxuICAgICAgICAgIHNjaGVtYTogc2NoZW1hXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmRiTWFuYWdlclNlcnZpY2UuY3JlYXRlRGF0YWJhc2VUYWJsZSh0YWJsZURlZilcbiAgICAgIH0pXG4gICAgKVxuICApO1xuXG4gIGluaXRpYWxpemVTdGF0ZShkYXRhOiBhbnkpIHtcbiAgICB0aGlzLnNldERhdGEkKGRhdGEpXG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBTRUxFQ1RPUlNcblxuICByZWFkb25seSBkYXRhJCA9IHRoaXMuc2VsZWN0KCh7IGRhdGEsIGRhdGFPYmplY3QgfSkgPT4ge1xuICAgIGNvbnN0IGlzQXJyYXkgPSggdGhpcy5kYXRhVHlwZSA9PT0gRGF0YVR5cGUuQVJSQVkpID8gdHJ1ZSA6IGZhbHNlXG4gICAgcmV0dXJuIChpc0FycmF5KSA/IGRhdGEgOiBkYXRhT2JqZWN0XG4gIH0pXG5cbiAgcmVhZG9ubHkgc2VsZWN0UmVjb3JkJCA9IChpZDogbnVtYmVyKSA9PiB0aGlzLnNlbGVjdChcbiAgICB0aGlzLmRhdGEkLFxuICAgIChkYXRhKSA9PiB7XG4gICAgICBpZiAodGhpcy5kYXRhVHlwZSA9PT0gRGF0YVR5cGUuQVJSQVkgJiYgQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICByZXR1cm4gZGF0YS5maW5kKGl0ZW0gPT4gaXRlbS5pZCA9PT0gaWQpIGFzIFQgfCBudWxsXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gKGRhdGEgYXMgVCkuaWQgPT09IGlkID8gZGF0YSA6IG51bGxcbiAgICAgIH1cbiAgICB9XG4gICk7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvLyBVUERBVEVSU1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgc2V0RGF0YSQgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlOiBBUElTdGF0ZU1hbmFnZXJEYXRhPFQ+LCBkYXRhOiBUIHwgVFtdIHwgYW55KSA9PiB7XG5cbiAgICBpZiAoIWRhdGEpIHJldHVybiBzdGF0ZTtcblxuICAgIGlmICh0aGlzLmRhdGFUeXBlID09PSBEYXRhVHlwZS5BUlJBWSkge1xuXG4gICAgICBjb25zdCBkYXRhQXJyYXkgPSBBcnJheS5pc0FycmF5KGRhdGEpID8gZGF0YSA6IFtkYXRhXVxuXG4gICAgICBjb25zdCBzdGF0ZURhdGFTYW1wbGUgPSAoc3RhdGUuZGF0YS5sZW5ndGggPiAwKSA/IE9iamVjdC5rZXlzKHN0YXRlLmRhdGFbMF0pIDogW11cbiAgICAgIGNvbnN0IG5ld0RhdGFTYW1wbGUgPSAoZGF0YUFycmF5Lmxlbmd0aCA+IDApID8gT2JqZWN0LmtleXMoZGF0YUFycmF5WzBdKSA6IFtdXG5cbiAgICAgIGNvbnN0IGlzU2FtZSA9IChzdGF0ZS5kYXRhLmxlbmd0aCA9PT0gMCkgPyBmYWxzZSA6IHN0YXRlRGF0YVNhbXBsZS5ldmVyeSgodmFsdWUsIGluZGV4KSA9PiB2YWx1ZSA9PT0gbmV3RGF0YVNhbXBsZVtpbmRleF0pXG4gICAgICBjb25zdCB1cGRhdGVkRGF0YSA9ICghaXNTYW1lICYmIGRhdGFBcnJheS5sZW5ndGggIT09IDApID8gdGhpcy51cGRhdGVBcnJheVN0YXRlKFtdLCBkYXRhQXJyYXkpIDogdGhpcy51cGRhdGVBcnJheVN0YXRlKHN0YXRlLmRhdGEsIGRhdGFBcnJheSlcblxuICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIGRhdGE6IHVwZGF0ZWREYXRhLCBkYXRhT2JqZWN0OiBudWxsIH0gYXMgQVBJU3RhdGVNYW5hZ2VyRGF0YTxUPjtcblxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBkYXRhT2JqZWN0ID0gdGhpcy5pc0VtcHR5KGRhdGEpID8gbnVsbCA6IGRhdGE7XG4gICAgICByZXR1cm4geyAuLi5zdGF0ZSwgZGF0YTogW10sIGRhdGFPYmplY3Q6IGRhdGFPYmplY3QgfSBhcyBBUElTdGF0ZU1hbmFnZXJEYXRhPFQ+O1xuICAgIH1cblxuICB9KTtcblxuICBwcml2YXRlIHVwZGF0ZUFycmF5U3RhdGUoY3VycmVudERhdGE6IGFueVtdLCBuZXdEYXRhOiBhbnlbXSk6IGFueVtdIHtcblxuICAgIGNvbnN0IGZpbHRlckN1cnJlbnREYXRhID0gKCkgPT4ge1xuICAgICAgY29uc3QgaWRzID0gdGhpcy5zdHJlYW1lZFJlc3BvbnNlLm1hcCgob2JqOiBhbnkpID0+IG9iai5pZClcbiAgICAgIHJldHVybiBjdXJyZW50RGF0YS5maWx0ZXIob2JqID0+IChvYmouaWQpID8gaWRzLmluY2x1ZGVzKG9iai5pZCkgOiBvYmopXG4gICAgfVxuXG4gICAgY29uc3QgZmlsdGVyZWRDdXJyZW50RGF0YSA9ICh0aGlzLmh0dHBNYW5hZ2VyU2VydmljZS5pc1BlbmRpbmcudmFsdWUpID8gY3VycmVudERhdGEgOiBmaWx0ZXJDdXJyZW50RGF0YSgpXG5cbiAgICBjb25zdCB1cGRhdGVkRGF0YSA9IGZpbHRlcmVkQ3VycmVudERhdGEubWFwKGl0ZW0gPT4ge1xuICAgICAgICBjb25zdCBuZXdJdGVtID0gbmV3RGF0YS5maW5kKG5ld0l0ZW0gPT4ge1xuICAgICAgICAgIGNvbnN0IGhhc0lkID0gKG5ld0l0ZW0/LmlkICYmIGl0ZW0/LmlkKSA/IHRydWUgOiBmYWxzZVxuICAgICAgICAgIHJldHVybiAoaGFzSWQpID8gbmV3SXRlbS5pZCA9PT0gaXRlbS5pZCA6IEpTT04uc3RyaW5naWZ5KG5ld0l0ZW0pID09PSBKU09OLnN0cmluZ2lmeShpdGVtKVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gKG5ld0l0ZW0pID8geyAuLi5pdGVtLCAuLi5uZXdJdGVtIH0gOiBpdGVtXG4gICAgfSlcblxuICAgIGNvbnN0IGFkZGVkRGF0YSA9IG5ld0RhdGEuZmlsdGVyKG5ld0l0ZW0gPT4ge1xuICAgICAgcmV0dXJuICFmaWx0ZXJlZEN1cnJlbnREYXRhLnNvbWUoaXRlbSA9PiB7XG4gICAgICAgICAgY29uc3QgaGFzSWQgPSAobmV3SXRlbT8uaWQgJiYgaXRlbT8uaWQpID8gdHJ1ZSA6IGZhbHNlXG4gICAgICAgICAgcmV0dXJuIChoYXNJZCkgPyBpdGVtLmlkID09PSBuZXdJdGVtLmlkIDogSlNPTi5zdHJpbmdpZnkobmV3SXRlbSkgPT09IEpTT04uc3RyaW5naWZ5KGl0ZW0pXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICByZXR1cm4gWy4uLnVwZGF0ZWREYXRhLCAuLi5hZGRlZERhdGFdXG5cbn1cblxuICBwcml2YXRlIHJlYWRvbmx5IGFkZERhdGEkID0gdGhpcy51cGRhdGVyKChzdGF0ZTogQVBJU3RhdGVNYW5hZ2VyRGF0YTxUPiwgZGF0YTogVCkgPT4ge1xuXG4gIGlmICh0aGlzLmRhdGFUeXBlID09PSBEYXRhVHlwZS5BUlJBWSkge1xuICAgICAgY29uc3QgZXhpc3RzID0gc3RhdGUuZGF0YS5zb21lKGl0ZW0gPT4gaXRlbS5pZCA9PT0gZGF0YS5pZCk7XG5cbiAgICAgIGlmIChleGlzdHMpIHtcbiAgICAgICAgICBjb25zdCB1cGRhdGVkRGF0YSA9IHN0YXRlLmRhdGEubWFwKGl0ZW0gPT5cbiAgICAgICAgICBpdGVtLmlkID09PSBkYXRhLmlkID8gZGF0YSA6IGl0ZW1cbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4geyAuLi5zdGF0ZSwgZGF0YTogdXBkYXRlZERhdGEgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG5ld1N0YXRlID0gWy4uLnN0YXRlLmRhdGEsIGRhdGFdO1xuICAgICAgICByZXR1cm4geyAuLi5zdGF0ZSwgZGF0YTogbmV3U3RhdGUgfTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIGRhdGFPYmplY3Q6IGRhdGEgfTtcbiAgICB9XG5cbiAgfSlcblxuICBwcml2YXRlIHJlYWRvbmx5IGRlbGV0ZURhdGEkID0gdGhpcy51cGRhdGVyKChzdGF0ZTogQVBJU3RhdGVNYW5hZ2VyRGF0YTxUPiwgZGF0YTogVCAmIHsgaWQ6IG51bWJlciB9KSA9PiB7XG4gICAgaWYgKHRoaXMuZGF0YVR5cGUgPT09IERhdGFUeXBlLkFSUkFZKSB7XG4gICAgY29uc3QgbmV3U3RhdGUgPSBzdGF0ZS5kYXRhLmZpbHRlcihpdGVtID0+IGl0ZW0uaWQgIT09IGRhdGEuaWQpXG4gICAgcmV0dXJuIHsgLi4uc3RhdGUsIC4uLnsgZGF0YTogbmV3U3RhdGUgfSB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7IC4uLnN0YXRlLCAuLi57IGRhdGFPYmplY3Q6IG51bGwgfSB9XG4gICAgfVxuICB9KVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgdXBkYXRlRGF0YSQgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlOiBBUElTdGF0ZU1hbmFnZXJEYXRhPFQ+LCBkYXRhOiBUKSA9PiB7XG5cbiAgICBpZiAodGhpcy5kYXRhVHlwZSA9PT0gRGF0YVR5cGUuQVJSQVkpIHtcblxuICAgICAgY29uc3Qgb2JqSW5kZXggPSBzdGF0ZS5kYXRhLmZpbmRJbmRleChpdGVtID0+IGl0ZW0uaWQgPT09IGRhdGEuaWQpXG5cbiAgICAgIGlmIChvYmpJbmRleCA+IC0xKSB7XG4gICAgICAgIGNvbnN0IG5ld1N0YXRlID0gWy4uLnN0YXRlLmRhdGFdXG4gICAgICAgIG5ld1N0YXRlW29iakluZGV4XSA9IGRhdGFcbiAgICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIC4uLnsgZGF0YTogbmV3U3RhdGUgfSB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdGF0ZVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7IC4uLnN0YXRlLCAuLi57IGRhdGFPYmplY3Q6IGRhdGEgfSB9XG4gICAgfVxuXG4gIH0pXG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gRUZGRUNUU1xuXG4gIHJlYWRvbmx5IGNsZWFyUmVjb3JkcyA9IHRoaXMuZWZmZWN0KGRhdGEgPT5cbiAgICBkYXRhLnBpcGUoXG5cbiAgICAgIHRhcCgoKSA9PiB7XG5cbiAgICAgICAgaWYgKHRoaXMuZGF0YVR5cGUgPT09IERhdGFUeXBlLkFSUkFZKSB7XG4gICAgICAgICAgdGhpcy5zZXREYXRhJChbXSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNldERhdGEkKHt9KVxuICAgICAgICB9XG5cbiAgICAgIH0pLFxuICAgICAgY29uY2F0TWFwKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaGFzRGF0YWJhc2UgJiYgdGhpcy5kYXRhYmFzZT8udGFibGUpIHtcblxuICAgICAgICAgIGNvbnN0IGN1cnJlbnREYXRhID0gdGhpcy5nZXQoKT8uZGF0YTtcbiAgICAgICAgICBjb25zdCBpZHNUb0RlbGV0ZSA9IEFycmF5LmlzQXJyYXkoY3VycmVudERhdGEpID8gY3VycmVudERhdGEubWFwKChyOiBhbnkpID0+IHIuaWQpIDogW107XG5cbiAgICAgICAgICBpZiAoaWRzVG9EZWxldGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGJNYW5hZ2VyU2VydmljZS5kZWxldGVUYWJsZVJlY29yZHModGhpcy5kYXRhYmFzZS50YWJsZSwgaWRzVG9EZWxldGUpO1xuICAgICAgICAgIH1cblxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICAgIH0pXG4gICkpXG5cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBDUlVEIE9QRVJBVElPTlNcblxuICAvLyBGRVRDSCBSRUNPUkRTXG4gIHJlYWRvbmx5IGZldGNoUmVjb3JkcyA9IChvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMpID0+XG4gICAgdGhpcy5lZmZlY3Q8YW55PigoKSA9PlxuICAgIG9mKFJlcXVlc3RPcHRpb25zLmFkYXB0KG9wdGlvbnMpKS5waXBlKFxuICAgICAgc3dpdGNoTWFwKCgpID0+IHtcblxuICAgICAgICB0aGlzLnN0cmVhbWVkUmVzcG9uc2UgPSBbXVxuICAgICAgICBjb25zdCByZXF1ZXN0T3B0aW9ucyA9IHRoaXMudXBkYXRlUmVxdWVzdE9wdGlvbnMob3B0aW9ucz8uaGVhZGVycylcblxuICAgICAgICBjb25zdCBmZXRjaEZyb21BUEkgPSAoKSA9PiB7XG5cbiAgICAgICAgICByZXR1cm4gdGhpcy5odHRwTWFuYWdlclNlcnZpY2UuZ2V0UmVxdWVzdChyZXF1ZXN0T3B0aW9ucywgb3B0aW9ucz8ucGF0aCkucGlwZShcbiAgICAgICAgICAgIHRhcCgoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICAgIGRhdGEgPSAoIWRhdGEpID8gKHRoaXMuZGF0YVR5cGUgPT09IERhdGFUeXBlLkFSUkFZKSA/IFtdIDoge30gOiBkYXRhXG4gICAgICAgICAgICAgIHRoaXMuc2V0RGF0YSQoZGF0YSlcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgY29uY2F0TWFwKChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGF0YWJhc2UgJiYgdGhpcy5kYXRhYmFzZT8udGFibGUgJiYgQXJyYXkuaXNBcnJheShkYXRhKSAmJiBkYXRhLmxlbmd0aCA+IDApIHtcblxuICAgICAgICAgICAgICAgIHRoaXMubG9jYWxTdG9yYWdlTWFuYWdlclNlcnZpY2UudXBkYXRlU3RvcmUoe1xuICAgICAgICAgICAgICAgICAgbmFtZTogdGhpcy5kYXRhYmFzZSEudGFibGUsXG4gICAgICAgICAgICAgICAgICBkYXRhOiB7IC4uLnRoaXMuZGF0YWJhc2UsIC4uLnsgZXhwaXJlczogdGhpcy51dGlscy5leHBpcmVzKHRoaXMuZGF0YWJhc2UhLmV4cGlyZXNJbil9IH1cbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGJNYW5hZ2VyU2VydmljZS5jcmVhdGVUYWJsZVJlY29yZHModGhpcy5kYXRhYmFzZS50YWJsZSwgZGF0YSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIG9mKGRhdGEpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5oYXNEYXRhYmFzZSAmJiB0aGlzLmRhdGFiYXNlPy50YWJsZSkge1xuXG4gICAgICAgICAgcmV0dXJuIHRoaXMuZGJNYW5hZ2VyU2VydmljZS5kYXRhYmFzZUV4aXN0cygpLnBpcGUoXG4gICAgICAgICAgICBzd2l0Y2hNYXAoKGRiRXhpc3RzOiBib29sZWFuKSA9PiB7XG5cbiAgICAgICAgICAgICAgaWYgKCFkYkV4aXN0cykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluaXRPYnM6IE9ic2VydmFibGU8YW55PiA9IHRoaXMuaW5pdERCU3RvcmFnZUFzeW5jKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGluaXRPYnMucGlwZShcbiAgICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiBmZXRjaEZyb21BUEkoKSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGJNYW5hZ2VyU2VydmljZS5oYXNEYXRhYmFzZVRhYmxlKHRoaXMuZGF0YWJhc2UhLnRhYmxlKS5waXBlKFxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgodGFibGVFeGlzdHM6IGJvb2xlYW4pOiBPYnNlcnZhYmxlPGFueT4gPT4ge1xuXG4gICAgICAgICAgICAgICAgICBpZiAoIXRhYmxlRXhpc3RzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGluaXRPYnM6IE9ic2VydmFibGU8YW55PiA9IHRoaXMuaW5pdERCU3RvcmFnZUFzeW5jKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbml0T2JzLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IGZldGNoRnJvbUFQSSgpKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbFN0b3JhZ2VNYW5hZ2VyU2VydmljZS5zdG9yZSQodGhpcy5kYXRhYmFzZSEudGFibGUpLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIHRha2UoMSksXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoc3RvcmVEYXRhOiBhbnkpID0+IHtcblxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4cGlyZXMgPSBzdG9yZURhdGE/LmV4cGlyZXMgfHwgMDtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXNFeHBpcmVkID0gZXhwaXJlcyA+IDAgJiYgdGhpcy51dGlscy5oYXNFeHBpcmVkKGV4cGlyZXMpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0V4cGlyZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRiTWFuYWdlclNlcnZpY2UuY2xlYXJUYWJsZSh0aGlzLmRhdGFiYXNlIS50YWJsZSkucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IGZldGNoRnJvbUFQSSgpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsU3RvcmFnZU1hbmFnZXJTZXJ2aWNlLnVwZGF0ZVN0b3JlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMuZGF0YWJhc2UhLnRhYmxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogeyAuLi50aGlzLmRhdGFiYXNlLCAuLi57IGV4cGlyZXM6IHRoaXMudXRpbHMuZXhwaXJlcyh0aGlzLmRhdGFiYXNlIS5leHBpcmVzSW4pfSB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGJNYW5hZ2VyU2VydmljZS5nZXRUYWJsZVJlY29yZHModGhpcy5kYXRhYmFzZSEudGFibGUpLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKGRiRGF0YTogYW55KSA9PiB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGJEYXRhKSAmJiBkYkRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0RGF0YSQoZGJEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YoZGJEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmZXRjaEZyb21BUEkoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmZXRjaEZyb21BUEkoKTtcblxuICAgICAgfSlcbiAgICApXG4gIClcblxuICBwcml2YXRlIGluaXREQlN0b3JhZ2VBc3luYygpIHtcblxuICAgIGlmICh0aGlzLmRhdGFUeXBlICE9PSBEYXRhVHlwZS5BUlJBWSkge1xuICAgICAgY29uc29sZS53YXJuKCdEYXRhYmFzZSBzdG9yYWdlIHJlcXVpcmVzIGRhdGFUeXBlIHRvIGJlIEFSUkFZJyk7XG4gICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmFwaU9wdGlvbnMuYWRhcHRlcikge1xuICAgICAgY29uc29sZS53YXJuKCdEYXRhYmFzZSBzdG9yYWdlIHJlcXVpcmVzIGFuIGFkYXB0ZXIgdG8gZGVmaW5lIHRoZSBkYXRhIHNoYXBlJyk7XG4gICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmRhdGFiYXNlPy50YWJsZSkge1xuICAgICAgY29uc29sZS53YXJuKCdEYXRhYmFzZSBzdG9yYWdlIHJlcXVpcmVzIGEgdGFibGUgbmFtZScpO1xuICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgIH1cblxuICAgIGNvbnN0IHNhbXBsZURhdGEgPSB0aGlzLmFwaU9wdGlvbnMuYWRhcHRlcj8uKHt9KSB8fCB7fTtcbiAgICBjb25zdCBzY2hlbWFLZXlzID0gT2JqZWN0LmtleXMoc2FtcGxlRGF0YSkuZmlsdGVyKGtleSA9PiBzYW1wbGVEYXRhW2tleV0gIT09IHVuZGVmaW5lZCk7XG5cbiAgICBsZXQgc2NoZW1hID0gJysraWQnO1xuXG4gICAgaWYgKHNjaGVtYUtleXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgb3RoZXJLZXlzID0gc2NoZW1hS2V5cy5maWx0ZXIoayA9PiBrICE9PSAnaWQnKTtcbiAgICAgIGlmIChvdGhlcktleXMubGVuZ3RoID4gMCkge1xuICAgICAgICBzY2hlbWEgKz0gJywgJyArIG90aGVyS2V5cy5qb2luKCcsICcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHRhYmxlRGVmID0gVGFibGVTY2hlbWFEZWYuYWRhcHQoe1xuICAgICAgdGFibGU6IHRoaXMuZGF0YWJhc2U/LnRhYmxlLFxuICAgICAgc2NoZW1hOiBzY2hlbWFcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmRiTWFuYWdlclNlcnZpY2UuY3JlYXRlRGF0YWJhc2VUYWJsZSh0YWJsZURlZik7XG5cbiAgfVxuXG4gIC8vIEZFVENIIFJFQ09SRFxuICByZWFkb25seSBmZXRjaFJlY29yZCA9IChvcHRpb25zOiBSZXF1ZXN0T3B0aW9ucywgbWV0aG9kOiBzdHJpbmcpID0+XG4gICAgdGhpcy5lZmZlY3Q8YW55PigoKSA9PlxuICAgIG9mKFJlcXVlc3RPcHRpb25zLmFkYXB0KG9wdGlvbnMpKS5waXBlKFxuICAgICAgc3dpdGNoTWFwKChvcHRpb25zKSA9PiB7XG5cbiAgICAgICAgdGhpcy5zdHJlYW1lZFJlc3BvbnNlID0gW11cbiAgICAgICAgY29uc3QgcmVxdWVzdE9wdGlvbnMgPSB0aGlzLnVwZGF0ZVJlcXVlc3RPcHRpb25zKG9wdGlvbnM/LmhlYWRlcnMpXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cE1hbmFnZXJTZXJ2aWNlLmdldFJlcXVlc3QocmVxdWVzdE9wdGlvbnMsIG9wdGlvbnM/LnBhdGgpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRhcCgoZGF0YTogYW55KSA9PiB7XG5cbiAgICAgICAgICAgIGRhdGEgPSAoIWRhdGEpID8gKHRoaXMuZGF0YVR5cGUgPT09IERhdGFUeXBlLkFSUkFZKSA/IFtdIDoge30gOiBkYXRhXG5cbiAgICAgICAgICAgIGNvbnN0IGlkID0gKG9wdGlvbnMgYXMgYW55KS5wYXRoPy5sZW5ndGggPyBvcHRpb25zLnBhdGhbb3B0aW9ucy5wYXRoLmxlbmd0aCAtMV0gOiBudWxsXG5cbiAgICAgICAgICAgIGlmKG1ldGhvZCA9PT0gJ0RFTEVURScpIHRoaXMuZGVsZXRlRGF0YSQoeyBpZCB9IGFzIFQgJiB7IGlkOiBudW1iZXIgfSlcbiAgICAgICAgICAgIGlmKG1ldGhvZCA9PT0gJ1VQREFURScpIHRoaXMudXBkYXRlRGF0YSQoZGF0YSlcbiAgICAgICAgICAgIGlmKG1ldGhvZCA9PT0gJ0NSRUFURScpIHRoaXMuYWRkRGF0YSQoZGF0YSlcblxuICAgICAgICAgIH0pLFxuICAgICAgICAgIGNvbmNhdE1hcCgoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNEYXRhYmFzZSAmJiB0aGlzLmRhdGFiYXNlPy50YWJsZSkge1xuICAgICAgICAgICAgICBjb25zdCBpZCA9IChvcHRpb25zIGFzIGFueSkucGF0aD8ubGVuZ3RoID8gb3B0aW9ucy5wYXRoW29wdGlvbnMucGF0aC5sZW5ndGggLTFdIDogbnVsbFxuXG4gICAgICAgICAgICAgIGlmKG1ldGhvZCA9PT0gJ0RFTEVURScgJiYgaWQpIHJldHVybiB0aGlzLmRiTWFuYWdlclNlcnZpY2UuZGVsZXRlVGFibGVSZWNvcmQodGhpcy5kYXRhYmFzZS50YWJsZSwgaWQpXG4gICAgICAgICAgICAgIGlmKG1ldGhvZCA9PT0gJ1VQREFURScgJiYgZGF0YSkgcmV0dXJuIHRoaXMuZGJNYW5hZ2VyU2VydmljZS51cGRhdGVUYWJsZVJlY29yZCh0aGlzLmRhdGFiYXNlLnRhYmxlLCBkYXRhKVxuICAgICAgICAgICAgICBpZihtZXRob2QgPT09ICdDUkVBVEUnICYmIGRhdGEpIHJldHVybiB0aGlzLmRiTWFuYWdlclNlcnZpY2UuY3JlYXRlVGFibGVSZWNvcmQodGhpcy5kYXRhYmFzZS50YWJsZSwgZGF0YSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvZihkYXRhKVxuICAgICAgICAgIH0pXG4gICAgICAgIClcblxuICAgICAgfSlcbiAgICApXG4gIClcblxuICAvLyBDUkVBVEUgUkVDT1JEXG4gIHJlYWRvbmx5IGNyZWF0ZVJlY29yZCA9IChkYXRhOiBhbnl8bnVsbCwgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zKSA9PlxuICAgIHRoaXMuZWZmZWN0PGFueT4oKCkgPT5cbiAgICAgIG9mKGRhdGEpLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcCgoZGF0YTogYW55KSA9PiB7XG5cbiAgICAgICAgdGhpcy5zdHJlYW1lZFJlc3BvbnNlID0gW11cbiAgICAgICAgY29uc3QgcmVxdWVzdE9wdGlvbnMgPSB0aGlzLnVwZGF0ZVJlcXVlc3RPcHRpb25zKG9wdGlvbnM/LmhlYWRlcnMpXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cE1hbmFnZXJTZXJ2aWNlLnBvc3RSZXF1ZXN0KGRhdGEsIHJlcXVlc3RPcHRpb25zLCBvcHRpb25zPy5wYXRoKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YXAoKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgZGF0YSA9ICghZGF0YSkgPyAodGhpcy5kYXRhVHlwZSA9PT0gRGF0YVR5cGUuQVJSQVkpID8gW10gOiB7fSA6IGRhdGFcbiAgICAgICAgICAgIHRoaXMuYWRkRGF0YSQoZGF0YSlcbiAgICAgICAgICAgIGlmKHRoaXMud3NDb25uZWN0aW9uKSB0aGlzLndzQ29tbXVuaWNhdGlvbignQ1JFQVRFJywgWy4uLm9wdGlvbnM/LnBhdGggfHwgW10sIGRhdGEuaWRdKVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIGNvbmNhdE1hcCgoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNEYXRhYmFzZSAmJiB0aGlzLmRhdGFiYXNlPy50YWJsZSAmJiBkYXRhPy5pZCkge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYk1hbmFnZXJTZXJ2aWNlLmNyZWF0ZVRhYmxlUmVjb3JkKHRoaXMuZGF0YWJhc2UudGFibGUsIGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG9mKGRhdGEpO1xuICAgICAgICAgIH0pXG4gICAgICAgIClcblxuICAgICAgfSlcbiAgICApXG4gIClcblxuICAvLyBVUERBVEUgUkVDT1JEXG4gIHJlYWRvbmx5IHVwZGF0ZVJlY29yZCA9IChkYXRhOiBhbnl8bnVsbCwgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zKSA9PlxuICAgIHRoaXMuZWZmZWN0PGFueT4oKCkgPT5cbiAgICBvZihkYXRhKS5waXBlKFxuICAgICAgY29uY2F0TWFwKChkYXRhOiBhbnkpID0+IHtcblxuICAgICAgICB0aGlzLnN0cmVhbWVkUmVzcG9uc2UgPSBbXVxuICAgICAgICBjb25zdCByZXF1ZXN0T3B0aW9ucyA9IHRoaXMudXBkYXRlUmVxdWVzdE9wdGlvbnMob3B0aW9ucz8uaGVhZGVycylcblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwTWFuYWdlclNlcnZpY2UucHV0UmVxdWVzdChkYXRhLCByZXF1ZXN0T3B0aW9ucywgb3B0aW9ucz8ucGF0aClcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGFwKChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGRhdGEgPSAoIWRhdGEpID8gKHRoaXMuZGF0YVR5cGUgPT09IERhdGFUeXBlLkFSUkFZKSA/IFtdIDoge30gOiBkYXRhXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZURhdGEkKGRhdGEpXG4gICAgICAgICAgICBpZih0aGlzLndzQ29ubmVjdGlvbikgdGhpcy53c0NvbW11bmljYXRpb24oJ1VQREFURScsIFsuLi5vcHRpb25zPy5wYXRoIHx8IFtdXSlcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBjb25jYXRNYXAoKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGF0YWJhc2UgJiYgdGhpcy5kYXRhYmFzZT8udGFibGUgJiYgZGF0YT8uaWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGJNYW5hZ2VyU2VydmljZS51cGRhdGVUYWJsZVJlY29yZCh0aGlzLmRhdGFiYXNlLnRhYmxlLCBkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvZihkYXRhKTtcbiAgICAgICAgICB9KVxuICAgICAgICApXG5cbiAgICAgIH0pXG4gICAgKVxuICApXG5cbiAgLy8gREVMRVRFIFJFQ09SRFxuICByZWFkb25seSBkZWxldGVSZWNvcmQgPSAob3B0aW9ucz86IFJlcXVlc3RPcHRpb25zKSA9PlxuICAgIHRoaXMuZWZmZWN0PGFueT4oKCkgPT5cbiAgICBvZihvcHRpb25zKS5waXBlKFxuICAgICAgY29uY2F0TWFwKChkYXRhOiBhbnkpID0+IHtcblxuICAgICAgICB0aGlzLnN0cmVhbWVkUmVzcG9uc2UgPSBbXVxuICAgICAgICBjb25zdCByZXF1ZXN0T3B0aW9ucyA9IHRoaXMudXBkYXRlUmVxdWVzdE9wdGlvbnMob3B0aW9ucz8uaGVhZGVycylcblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwTWFuYWdlclNlcnZpY2UuZGVsZXRlUmVxdWVzdChyZXF1ZXN0T3B0aW9ucywgb3B0aW9ucz8ucGF0aClcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGFwKChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGRhdGEgPSAoIWRhdGEpID8gKHRoaXMuZGF0YVR5cGUgPT09IERhdGFUeXBlLkFSUkFZKSA/IFtdIDoge30gOiBkYXRhXG4gICAgICAgICAgICB0aGlzLmRlbGV0ZURhdGEkKGRhdGEpXG4gICAgICAgICAgICBpZih0aGlzLndzQ29ubmVjdGlvbikgdGhpcy53c0NvbW11bmljYXRpb24oJ0RFTEVURScsIFsuLi5vcHRpb25zPy5wYXRoIHx8IFtdXSlcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBjb25jYXRNYXAoKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzRGF0YWJhc2UgJiYgdGhpcy5kYXRhYmFzZT8udGFibGUgJiYgZGF0YT8uaWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGJNYW5hZ2VyU2VydmljZS5kZWxldGVUYWJsZVJlY29yZCh0aGlzLmRhdGFiYXNlLnRhYmxlLCBkYXRhLmlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvZihkYXRhKTtcbiAgICAgICAgICB9KVxuICAgICAgICApXG5cbiAgICAgIH0pXG4gICAgKVxuICApXG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gRkVUQ0ggU1RSRUFNXG5cbiAgcmVhZG9ubHkgY3JlYXRlU3RyZWFtID0gKGRhdGE6IGFueXxudWxsLCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMpID0+XG4gICAgdGhpcy5lZmZlY3Q8YW55PigoKSA9PlxuICAgIG9mKGRhdGEpLnBpcGUoXG4gICAgICB0YXAoKCkgPT4gdGhpcy5odHRwTWFuYWdlclNlcnZpY2UuaXNQZW5kaW5nLm5leHQodHJ1ZSkpLFxuICAgICAgc3dpdGNoTWFwKChkYXRhOiBhbnkpID0+IHtcblxuICAgICAgICBjb25zdCByZXF1ZXN0T3B0aW9ucyA9IHRoaXMudXBkYXRlUmVxdWVzdE9wdGlvbnMob3B0aW9ucz8uaGVhZGVycylcblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwTWFuYWdlclNlcnZpY2UucG9zdFJlcXVlc3QoZGF0YSwgcmVxdWVzdE9wdGlvbnMsIG9wdGlvbnM/LnBhdGgpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRhcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmKHJlcy5sZW5ndGggPiAwKSB0aGlzLnNldERhdGEkKHJlcylcbiAgICAgICAgICAgIHRoaXMuc3RyZWFtZWRSZXNwb25zZSA9IHJlc1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIHNjYW4oKGFjYywgcmVzOiBhbnkpID0+IHtcblxuICAgICAgICAgICAgY29uc3QgcHJldmlvdXMgPSBhY2MuY3VycmVudFxuICAgICAgICAgICAgY29uc3QgY3VycmVudCA9IHJlc1xuICAgICAgICAgICAgcmV0dXJuIHsgcHJldmlvdXMsIGN1cnJlbnQgfTtcblxuICAgICAgICAgIH0sIHsgcHJldmlvdXM6IG51bGwsIGN1cnJlbnQ6IG51bGwgfSksXG4gICAgICAgICAgdGFwKCh7IHByZXZpb3VzLCBjdXJyZW50IH0pID0+IHtcblxuICAgICAgICAgICAgaWYocHJldmlvdXMgJiYgSlNPTi5zdHJpbmdpZnkocHJldmlvdXMpID09PSBKU09OLnN0cmluZ2lmeShjdXJyZW50KSkge1xuICAgICAgICAgICAgICB0aGlzLmh0dHBNYW5hZ2VyU2VydmljZS5pc1BlbmRpbmcubmV4dChmYWxzZSlcbiAgICAgICAgICAgICAgdGhpcy5zZXREYXRhJChbXSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuaHR0cE1hbmFnZXJTZXJ2aWNlLmlzUGVuZGluZy5uZXh0KHRydWUpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9KVxuICAgICAgICApXG5cbiAgICAgIH0pXG4gICAgKVxuXG4gIClcblxuICByZWFkb25seSBmZXRjaFN0cmVhbSA9IChvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMpID0+XG4gICAgdGhpcy5lZmZlY3Q8YW55PigoKSA9PlxuICAgIG9mKG9wdGlvbnMpLnBpcGUoXG4gICAgICB0YXAoKCkgPT4gdGhpcy5odHRwTWFuYWdlclNlcnZpY2UuaXNQZW5kaW5nLm5leHQodHJ1ZSkpLFxuICAgICAgc3dpdGNoTWFwKChvcHRpb25zOiBhbnkpID0+IHtcblxuICAgICAgICBjb25zdCByZXF1ZXN0T3B0aW9ucyA9IHRoaXMudXBkYXRlUmVxdWVzdE9wdGlvbnMob3B0aW9ucz8uaGVhZGVycylcbiAgICAgICAgcmVxdWVzdE9wdGlvbnMuc3RyZWFtID0gdHJ1ZVxuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBNYW5hZ2VyU2VydmljZS5nZXRSZXF1ZXN0KHJlcXVlc3RPcHRpb25zLCBvcHRpb25zPy5wYXRoKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YXAoKHJlczogYW55KSA9PiB7XG5cbiAgICAgICAgICAgIGlmKHJlcy5sZW5ndGggPiAwKSB0aGlzLnNldERhdGEkKHJlcylcbiAgICAgICAgICAgIHRoaXMuc3RyZWFtZWRSZXNwb25zZSA9IHJlc1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIHNjYW4oKGFjYywgcmVzOiBhbnkpID0+IHtcblxuICAgICAgICAgICAgY29uc3QgcHJldmlvdXMgPSBhY2MuY3VycmVudFxuICAgICAgICAgICAgY29uc3QgY3VycmVudCA9IHJlc1xuICAgICAgICAgICAgcmV0dXJuIHsgcHJldmlvdXMsIGN1cnJlbnQgfVxuXG4gICAgICAgICAgfSwgeyBwcmV2aW91czogbnVsbCwgY3VycmVudDogbnVsbCB9KSxcbiAgICAgICAgICB0YXAoKHsgcHJldmlvdXMsIGN1cnJlbnQgfSkgPT4ge1xuXG4gICAgICAgICAgICBpZihwcmV2aW91cyAmJiBKU09OLnN0cmluZ2lmeShwcmV2aW91cykgPT09IEpTT04uc3RyaW5naWZ5KGN1cnJlbnQpKSB7XG4gICAgICAgICAgICAgIHRoaXMuaHR0cE1hbmFnZXJTZXJ2aWNlLmlzUGVuZGluZy5uZXh0KGZhbHNlKVxuICAgICAgICAgICAgICB0aGlzLnNldERhdGEkKFtdKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5odHRwTWFuYWdlclNlcnZpY2UuaXNQZW5kaW5nLm5leHQodHJ1ZSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0pXG4gICAgICAgIClcblxuICAgICAgfSksXG4gICAgKVxuICApXG5cbiAgcHJpdmF0ZSB3c0NvbW11bmljYXRpb24obWV0aG9kOiBzdHJpbmcsIHBhdGg/OiBzdHJpbmd8bnVtYmVyW10pIHtcblxuICAgIGlmKHRoaXMud3NDb25uZWN0aW9uICYmIHRoaXMuYXBpT3B0aW9ucy53cykge1xuICAgICAgY29uc3Qgd3NTZXJ2ZXIgPSB0aGlzLmFwaU9wdGlvbnMud3MuaWRcbiAgICAgIHRoaXMuaHR0cE1hbmFnZXJTZXJ2aWNlLnNlbmRNZXNzYWdlSW5DaGFubmVsKHdzU2VydmVyLCB7IG1ldGhvZCwgcGF0aCB9KVxuICAgIH1cblxuICB9XG5cbiAgd3NNZXNzYWdpbmcobWVzc2FnZTogQ2hhbm5lbE1lc3NhZ2UsIGNoYW5uZWw/OiBzdHJpbmcpIHtcblxuICAgIGNvbnN0IHVzZXIgPSB0aGlzLndzT3B0aW9ucz8udXNlckFkYXB0ZXI/LmFkYXB0ZXI/Lih0aGlzLnVzZXIudmFsdWUpIHx8IHRoaXMudXNlci52YWx1ZVxuICAgIGNvbnN0IG1lc3NhZ2VJbmZvID0gQ2hhbm5lbE1lc3NhZ2UuYWRhcHQoeyAuLi5tZXNzYWdlLCBmcm9tVXNlcjogdXNlciB9KVxuXG4gICAgaWYodGhpcy53c0Nvbm5lY3Rpb24gJiYgdGhpcy5hcGlPcHRpb25zLndzKSB7XG5cbiAgICAgIGNvbnN0IHdzU2VydmVyID0gKGNoYW5uZWwpID8gY2hhbm5lbCA6IHRoaXMuYXBpT3B0aW9ucy53cy5pZFxuXG4gICAgICBpZihtZXNzYWdlSW5mby50b1VzZXIgPT09ICdhbGxDaGFubmVscycpIHtcbiAgICAgICAgdGhpcy5odHRwTWFuYWdlclNlcnZpY2Uuc2VuZEJyb2FkY2FzdChtZXNzYWdlSW5mbylcbiAgICAgIH0gZWxzZSBpZihtZXNzYWdlSW5mby50b1VzZXIgPT09ICdhbGxJbkNoYW5uZWwnKSB7XG4gICAgICAgIHRoaXMuaHR0cE1hbmFnZXJTZXJ2aWNlLnNlbmRNZXNzYWdlSW5DaGFubmVsKHdzU2VydmVyLCBtZXNzYWdlSW5mbylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaHR0cE1hbmFnZXJTZXJ2aWNlLnNlbmRNZXNzYWdlVG9Vc2VyKHdzU2VydmVyLCBtZXNzYWdlSW5mbylcbiAgICAgIH1cblxuICAgIH1cblxuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gTUlTQ1xuXG4gIHByaXZhdGUgaXNFbXB0eShvYmo6IGFueSkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmopLmxlbmd0aCA9PT0gMFxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVSZXF1ZXN0T3B0aW9ucyhoZWFkZXJzPzogYW55KTogQXBpUmVxdWVzdCB7XG5cbiAgICBjb25zdCBvcHRpb25zID0gQXBpUmVxdWVzdC5hZGFwdCh7IC4uLnRoaXMuYXBpT3B0aW9ucyB9KVxuXG4gICAgb3B0aW9ucy5oZWFkZXJzID0gKGhlYWRlcnMpXG4gICAgICAgICAgPyB7IC4uLm9wdGlvbnMuaGVhZGVycywgLi4uaGVhZGVycyB9XG4gICAgICAgICAgOiB7IC4uLm9wdGlvbnMuaGVhZGVycyB9XG5cbiAgICByZXR1cm4gb3B0aW9uc1xuICB9XG5cbn1cbiJdfQ==
|