valtech-components 4.0.376 → 4.0.377

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.
@@ -1,7 +1,7 @@
1
1
  import { Injectable, inject } from '@angular/core';
2
2
  import { Auth } from '@angular/fire/auth';
3
- import { Firestore, doc, docData, runTransaction, setDoc, } from '@angular/fire/firestore';
4
- import { map } from 'rxjs';
3
+ import { collection, collectionData, Firestore, doc, docData, limit, orderBy, query, runTransaction, setDoc, } from '@angular/fire/firestore';
4
+ import { map, of, tap } from 'rxjs';
5
5
  import { FirebaseService } from '../../../services/firebase/firebase.service';
6
6
  import { applyChessimalsMove, createChessimalsGame, resignChessimalsGame } from './chessimals-engine';
7
7
  import { MiniGamePlayerProfileService } from './mini-game-player-profile.service';
@@ -55,12 +55,24 @@ export class ChessimalsOnlineService {
55
55
  rematchRequests: [],
56
56
  },
57
57
  });
58
- await setDoc(this.gameRef(gameId), this.withUpdatedAt(state, now));
59
- return state;
58
+ const next = this.withUpdatedAt(state, now);
59
+ await setDoc(this.gameRef(gameId), next);
60
+ await this.saveCurrentUserHistory(next);
61
+ return next;
60
62
  }
61
63
  watchGame(gameId) {
62
64
  const normalizedGameId = this.normalizeGameId(gameId);
63
- return docData(this.gameRef(normalizedGameId)).pipe(map((value) => (value ? value : null)));
65
+ return docData(this.gameRef(normalizedGameId)).pipe(map((value) => (value ? value : null)), tap((state) => {
66
+ if (state)
67
+ void this.saveCurrentUserHistory(state);
68
+ }));
69
+ }
70
+ watchHistory(limitCount = 8) {
71
+ const uid = this.currentUid;
72
+ if (!uid)
73
+ return of([]);
74
+ const historyQuery = query(collection(this.firestore, this.historyPath(uid)), orderBy('updatedAt', 'desc'), limit(limitCount));
75
+ return collectionData(historyQuery).pipe(map((items) => items));
64
76
  }
65
77
  async joinGame(gameId) {
66
78
  const normalizedGameId = this.normalizeGameId(gameId);
@@ -78,18 +90,46 @@ export class ChessimalsOnlineService {
78
90
  return;
79
91
  if (state.status !== 'waiting' || !state.online?.lobby)
80
92
  return;
93
+ if (state.online.pendingGuest?.uid === uid)
94
+ return;
81
95
  const now = new Date();
82
96
  const guest = this.createParticipant(uid, now.toISOString());
97
+ const next = {
98
+ ...state,
99
+ online: {
100
+ ...state.online,
101
+ updatedAt: now.toISOString(),
102
+ pendingGuest: guest,
103
+ },
104
+ };
105
+ transaction.set(ref, next);
106
+ });
107
+ }
108
+ async acceptGuest(gameId) {
109
+ const normalizedGameId = this.normalizeGameId(gameId);
110
+ const uid = await this.ensureUser();
111
+ await runTransaction(this.firestore, async (transaction) => {
112
+ const ref = this.gameRef(normalizedGameId);
113
+ const snapshot = await transaction.get(ref);
114
+ if (!snapshot.exists())
115
+ throw new Error('CHESSIMALS_GAME_NOT_FOUND');
116
+ const state = snapshot.data();
117
+ this.assertNotExpired(state);
118
+ if (state.status !== 'waiting' || state.online?.lobby?.uid !== uid || !state.online.pendingGuest)
119
+ return;
120
+ const now = new Date();
83
121
  const [hostSide, guestSide] = Math.random() > 0.5 ? ['white', 'black'] : ['black', 'white'];
84
122
  const lobby = state.online.lobby;
85
- const onlineWithoutLobby = { ...state.online };
86
- delete onlineWithoutLobby.lobby;
123
+ const guest = state.online.pendingGuest;
124
+ const online = { ...state.online };
125
+ delete online.lobby;
126
+ delete online.pendingGuest;
87
127
  const next = {
88
128
  ...state,
89
129
  status: 'in_progress',
90
130
  currentTurn: 'white',
91
131
  online: {
92
- ...onlineWithoutLobby,
132
+ ...online,
93
133
  updatedAt: now.toISOString(),
94
134
  participants: {
95
135
  [hostSide]: { ...lobby, side: hostSide },
@@ -101,6 +141,24 @@ export class ChessimalsOnlineService {
101
141
  transaction.set(ref, next);
102
142
  });
103
143
  }
144
+ async rejectGuest(gameId) {
145
+ const normalizedGameId = this.normalizeGameId(gameId);
146
+ const uid = await this.ensureUser();
147
+ await runTransaction(this.firestore, async (transaction) => {
148
+ const ref = this.gameRef(normalizedGameId);
149
+ const snapshot = await transaction.get(ref);
150
+ if (!snapshot.exists())
151
+ throw new Error('CHESSIMALS_GAME_NOT_FOUND');
152
+ const state = snapshot.data();
153
+ this.assertNotExpired(state);
154
+ if (state.status !== 'waiting' || state.online?.lobby?.uid !== uid || !state.online.pendingGuest)
155
+ return;
156
+ const now = new Date();
157
+ const online = { ...state.online, updatedAt: now.toISOString() };
158
+ delete online.pendingGuest;
159
+ transaction.set(ref, { ...state, online });
160
+ });
161
+ }
104
162
  async move(gameId, move) {
105
163
  const normalizedGameId = this.normalizeGameId(gameId);
106
164
  const uid = await this.ensureUser();
@@ -203,9 +261,24 @@ export class ChessimalsOnlineService {
203
261
  const normalizedBaseRoute = `/${baseRoute.replace(/^\/+|\/+$/g, '') || 'mini-games'}`;
204
262
  return `${origin}${normalizedBaseRoute}/chessimals/${encodeURIComponent(this.normalizeGameId(gameId))}`;
205
263
  }
264
+ async saveCurrentUserHistory(state) {
265
+ const uid = this.currentUid;
266
+ if (!uid || state.mode !== 'online')
267
+ return;
268
+ const entry = this.createHistoryEntry(state, uid);
269
+ if (!entry)
270
+ return;
271
+ await setDoc(this.historyRef(uid, state.id), this.withoutUndefined(entry), { merge: true });
272
+ }
206
273
  gameRef(gameId) {
207
274
  return doc(this.firestore, `${COLLECTION_PATH}/${gameId}`);
208
275
  }
276
+ historyPath(uid) {
277
+ return `users/${uid}/miniGames/chessimals/history`;
278
+ }
279
+ historyRef(uid, gameId) {
280
+ return doc(this.firestore, `${this.historyPath(uid)}/${gameId}`);
281
+ }
209
282
  async ensureUser() {
210
283
  await this.firebase.whenFirebaseAuthReady();
211
284
  const user = this.auth.currentUser;
@@ -239,6 +312,53 @@ export class ChessimalsOnlineService {
239
312
  return state;
240
313
  return { ...state, online: { ...state.online, updatedAt: date.toISOString() } };
241
314
  }
315
+ createHistoryEntry(state, uid) {
316
+ if (!state.online)
317
+ return undefined;
318
+ const side = this.participantSide(state, uid);
319
+ const isLobbyHost = state.online.lobby?.uid === uid;
320
+ const isPendingGuest = state.online.pendingGuest?.uid === uid;
321
+ if (!side && !isLobbyHost && !isPendingGuest)
322
+ return undefined;
323
+ const opponent = side
324
+ ? side === 'white'
325
+ ? state.online.participants?.black
326
+ : state.online.participants?.white
327
+ : isLobbyHost
328
+ ? state.online.pendingGuest
329
+ : state.online.lobby;
330
+ return {
331
+ gameId: state.id,
332
+ mode: 'online',
333
+ boardSize: state.boardSize,
334
+ status: state.status,
335
+ outcome: this.historyOutcome(state, uid, side, isPendingGuest),
336
+ side,
337
+ opponentUid: opponent?.uid,
338
+ opponentName: opponent?.name,
339
+ winner: state.winner,
340
+ winnerReason: state.winnerReason,
341
+ moveCount: state.moveCount,
342
+ round: state.online.round,
343
+ createdAt: state.online.createdAt,
344
+ updatedAt: state.online.updatedAt,
345
+ finishedAt: state.status === 'finished' ? state.online.updatedAt : undefined,
346
+ expiresAt: state.online.expiresAt,
347
+ rematchOf: state.online.rematchOf,
348
+ };
349
+ }
350
+ withoutUndefined(value) {
351
+ return Object.fromEntries(Object.entries(value).filter(([, entry]) => entry !== undefined));
352
+ }
353
+ historyOutcome(state, uid, side, isPendingGuest) {
354
+ if (state.status === 'finished' && side && state.winner)
355
+ return state.winner === side ? 'won' : 'lost';
356
+ if (state.status === 'in_progress')
357
+ return 'in_progress';
358
+ if (isPendingGuest)
359
+ return 'pending';
360
+ return 'waiting';
361
+ }
242
362
  assertNotExpired(state) {
243
363
  if ((state.online?.expiresAtMs ?? 0) < Date.now())
244
364
  throw new Error('CHESSIMALS_GAME_EXPIRED');
@@ -263,4 +383,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
263
383
  type: Injectable,
264
384
  args: [{ providedIn: 'root' }]
265
385
  }] });
266
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlc3NpbWFscy1vbmxpbmUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9vcmdhbmlzbXMvbWluaS1nYW1lcy9jaGVzc2ltYWxzLW9ubGluZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMxQyxPQUFPLEVBQ0wsU0FBUyxFQUNULEdBQUcsRUFDSCxPQUFPLEVBQ1AsY0FBYyxFQUNkLE1BQU0sR0FDUCxNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFBYyxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFdkMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RHLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDOztBQVNsRixNQUFNLGVBQWUsR0FBRyw0QkFBNEIsQ0FBQztBQUNyRCxNQUFNLFdBQVcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFHeEMsTUFBTSxPQUFPLHVCQUF1QjtJQURwQztRQUVtQixTQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BCLGNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDOUIsYUFBUSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNuQyxhQUFRLEdBQUcsTUFBTSxDQUFDLDRCQUE0QixDQUFDLENBQUM7S0FzUWxFO0lBcFFDLElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFD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LEdBQUcsQ0FBQztRQUN6QixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUN6QyxDQUFDOytHQXhRVSx1QkFBdUI7bUhBQXZCLHVCQUF1QixjQURWLE1BQU07OzRGQUNuQix1QkFBdUI7a0JBRG5DLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBdXRoIH0gZnJvbSAnQGFuZ3VsYXIvZmlyZS9hdXRoJztcbmltcG9ydCB7XG4gIEZpcmVzdG9yZSxcbiAgZG9jLFxuICBkb2NEYXRhLFxuICBydW5UcmFuc2FjdGlvbixcbiAgc2V0RG9jLFxufSBmcm9tICdAYW5ndWxhci9maXJlL2ZpcmVzdG9yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBtYXAgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgRmlyZWJhc2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZmlyZWJhc2UvZmlyZWJhc2Uuc2VydmljZSc7XG5pbXBvcnQgeyBhcHBseUNoZXNzaW1hbHNNb3ZlLCBjcmVhdGVDaGVzc2ltYWxzR2FtZSwgcmVzaWduQ2hlc3NpbWFsc0dhbWUgfSBmcm9tICcuL2NoZXNzaW1hbHMtZW5naW5lJztcbmltcG9ydCB7IE1pbmlHYW1lUGxheWVyUHJvZmlsZVNlcnZpY2UgfSBmcm9tICcuL21pbmktZ2FtZS1wbGF5ZXItcHJvZmlsZS5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIENoZXNzaW1hbHNCb2FyZFNpemUsXG4gIENoZXNzaW1hbHNHYW1lU3RhdGUsXG4gIENoZXNzaW1hbHNNb3ZlLFxuICBDaGVzc2ltYWxzT25saW5lUGFydGljaXBhbnQsXG4gIENoZXNzaW1hbHNQbGF5ZXJDb2xvcixcbn0gZnJvbSAnLi90eXBlcyc7XG5cbmNvbnN0IENPTExFQ1RJT05fUEFUSCA9ICdtaW5pR2FtZXMvY2hlc3NpbWFscy9nYW1lcyc7XG5jb25zdCBHQU1FX1RUTF9NUyA9IDI0ICogNjAgKiA2MCAqIDEwMDA7XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgQ2hlc3NpbWFsc09ubGluZVNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IGF1dGggPSBpbmplY3QoQXV0aCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlyZXN0b3JlID0gaW5qZWN0KEZpcmVzdG9yZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlyZWJhc2UgPSBpbmplY3QoRmlyZWJhc2VTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBwcm9maWxlcyA9IGluamVjdChNaW5pR2FtZVBsYXllclByb2ZpbGVTZXJ2aWNlKTtcblxuICBnZXQgY3VycmVudFVpZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmF1dGguY3VycmVudFVzZXI/LnVpZDtcbiAgfVxuXG4gIG5vcm1hbGl6ZUdhbWVJZCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCByYXcgPSAodmFsdWUgPz8gJycpLnRyaW0oKS50b1VwcGVyQ2FzZSgpO1xuICAgIGNvbnN0IGRlY29kZWQgPSB0aGlzLmRlY29kZUlucHV0KHJhdyk7XG4gICAgY29uc3QgcGF0aFNlZ21lbnQgPSBkZWNvZGVkLnNwbGl0KC9bPyNdLylbMF0uc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbikucG9wKCkgPz8gZGVjb2RlZDtcbiAgICBjb25zdCBtYXRjaCA9IHBhdGhTZWdtZW50Lm1hdGNoKC9bQS1aMC05XXs0fS0/W0EtWjAtOV17NH0vKT8uWzBdXG4gICAgICA/PyBkZWNvZGVkLm1hdGNoKC9bQS1aMC05XXs0fS0/W0EtWjAtOV17NH0vKT8uWzBdXG4gICAgICA/PyBkZWNvZGVkO1xuICAgIGNvbnN0IGNvbXBhY3QgPSBtYXRjaC5yZXBsYWNlKC9bXkEtWjAtOV0vZywgJycpLnNsaWNlKDAsIDgpO1xuICAgIGlmIChjb21wYWN0Lmxlbmd0aCA8PSA0KSByZXR1cm4gY29tcGFjdDtcbiAgICByZXR1cm4gYCR7Y29tcGFjdC5zbGljZSgwLCA0KX0tJHtjb21wYWN0LnNsaWNlKDQsIDgpfWA7XG4gIH1cblxuICBpc1ZhbGlkR2FtZUlkKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gL15bQS1aMC05XXs0fS1bQS1aMC05XXs0fSQvLnRlc3QodGhpcy5ub3JtYWxpemVHYW1lSWQodmFsdWUpKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUdhbWUoYm9hcmRTaXplOiBDaGVzc2ltYWxzQm9hcmRTaXplKTogUHJvbWlzZTxDaGVzc2ltYWxzR2FtZVN0YXRlPiB7XG4gICAgY29uc3QgdWlkID0gYXdhaXQgdGhpcy5lbnN1cmVVc2VyKCk7XG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICBjb25zdCBleHBpcmVzQXQgPSBuZXcgRGF0ZShub3cuZ2V0VGltZSgpICsgR0FNRV9UVExfTVMpO1xuICAgIGNvbnN0IGdhbWVJZCA9IHRoaXMuY3JlYXRlR2FtZUlkKCk7XG4gICAgY29uc3QgaG9zdCA9IHRoaXMuY3JlYXRlUGFydGljaXBhbnQodWlkLCBub3cudG9JU09TdHJpbmcoKSk7XG4gICAgY29uc3Qgc3RhdGUgPSBjcmVhdGVDaGVzc2ltYWxzR2FtZShib2FyZFNpemUsIHtcbiAgICAgIGlkOiBnYW1lSWQsXG4gICAgICBtb2RlOiAnb25saW5lJyxcbiAgICAgIHN0YXR1czogJ3dhaXRpbmcnLFxuICAgICAgb25saW5lOiB7XG4gICAgICAgIGdhbWVJZCxcbiAgICAgICAgaG9zdFVpZDogdWlkLFxuICAgICAgICBjcmVhdGVkQXQ6IG5vdy50b0lTT1N0cmluZygpLFxuICAgICAgICB1cGRhdGVkQXQ6IG5vdy50b0lTT1N0cmluZygpLFxuICAgICAgICBleHBpcmVzQXQ6IGV4cGlyZXNBdC50b0lTT1N0cmluZygpLFxuICAgICAgICBleHBpcmVzQXRNczogZXhwaXJlc0F0LmdldFRpbWUoKSxcbiAgICAgICAgcm91bmQ6IDEsXG4gICAgICAgIGxvYmJ5OiBob3N0LFxuICAgICAgICByZW1hdGNoUmVxdWVzdHM6IFtdLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGF3YWl0IHNldERvYyh0aGlzLmdhbWVSZWYoZ2FtZUlkKSwgdGhpcy53aXRoVXBkYXRlZEF0KHN0YXRlLCBub3cpKTtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICB3YXRjaEdhbWUoZ2FtZUlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPENoZXNzaW1hbHNHYW1lU3RhdGUgfCBudWxsPiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZEdhbWVJZCA9IHRoaXMubm9ybWFsaXplR2FtZUlkKGdhbWVJZCk7XG4gICAgcmV0dXJuIGRvY0RhdGEodGhpcy5nYW1lUmVmKG5vcm1hbGl6ZWRHYW1lSWQpKS5waXBlKFxuICAgICAgbWFwKCh2YWx1ZSkgPT4gKHZhbHVlID8gKHZhbHVlIGFzIENoZXNzaW1hbHNHYW1lU3RhdGUpIDogbnVsbCkpLFxuICAgICk7XG4gIH1cblxuICBhc3luYyBqb2luR2FtZShnYW1lSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRHYW1lSWQgPSB0aGlzLm5vcm1hbGl6ZUdhbWVJZChnYW1lSWQpO1xuICAgIGNvbnN0IHVpZCA9IGF3YWl0IHRoaXMuZW5zdXJlVXNlcigpO1xuICAgIGF3YWl0IHJ1blRyYW5zYWN0aW9uKHRoaXMuZmlyZXN0b3JlLCBhc3luYyAodHJhbnNhY3Rpb24pID0+IHtcbiAgICAgIGNvbnN0IHJlZiA9IHRoaXMuZ2FtZVJlZihub3JtYWxpemVkR2FtZUlkKTtcbiAgICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgdHJhbnNhY3Rpb24uZ2V0KHJlZik7XG4gICAgICBpZiAoIXNuYXBzaG90LmV4aXN0cygpKSB0aHJvdyBuZXcgRXJyb3IoJ0NIRVNTSU1BTFNfR0FNRV9OT1RfRk9VTkQnKTtcblxuICAgICAgY29uc3Qgc3RhdGUgPSBzbmFwc2hvdC5kYXRhKCkgYXMgQ2hlc3NpbWFsc0dhbWVTdGF0ZTtcbiAgICAgIHRoaXMuYXNzZXJ0Tm90RXhwaXJlZChzdGF0ZSk7XG5cbiAgICAgIGlmICh0aGlzLmlzUGFydGljaXBhbnQoc3RhdGUsIHVpZCkpIHJldHVybjtcbiAgICAgIGlmIChzdGF0ZS5zdGF0dXMgPT09ICd3YWl0aW5nJyAmJiBzdGF0ZS5vbmxpbmU/LmxvYmJ5Py51aWQgPT09IHVpZCkgcmV0dXJuO1xuICAgICAgaWYgKHN0YXRlLnN0YXR1cyAhPT0gJ3dhaXRpbmcnIHx8ICFzdGF0ZS5vbmxpbmU/LmxvYmJ5KSByZXR1cm47XG5cbiAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgICBjb25zdCBndWVzdCA9IHRoaXMuY3JlYXRlUGFydGljaXBhbnQodWlkLCBub3cudG9JU09TdHJpbmcoKSk7XG4gICAgICBjb25zdCBbaG9zdFNpZGUsIGd1ZXN0U2lkZV0gPSBNYXRoLnJhbmRvbSgpID4gMC41ID8gWyd3aGl0ZScsICdibGFjayddIDogWydibGFjaycsICd3aGl0ZSddO1xuICAgICAgY29uc3QgbG9iYnkgPSBzdGF0ZS5vbmxpbmUubG9iYnk7XG4gICAgICBjb25zdCBvbmxpbmVXaXRob3V0TG9iYnkgPSB7IC4uLnN0YXRlLm9ubGluZSB9O1xuICAgICAgZGVsZXRlIG9ubGluZVdpdGhvdXRMb2JieS5sb2JieTtcbiAgICAgIGNvbnN0IG5leHQ6IENoZXNzaW1hbHNHYW1lU3RhdGUgPSB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBzdGF0dXM6ICdpbl9wcm9ncmVzcycsXG4gICAgICAgIGN1cnJlbnRUdXJuOiAnd2hpdGUnLFxuICAgICAgICBvbmxpbmU6IHtcbiAgICAgICAgICAuLi5vbmxpbmVXaXRob3V0TG9iYnksXG4gICAgICAgICAgdXBkYXRlZEF0OiBub3cudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICBwYXJ0aWNpcGFudHM6IHtcbiAgICAgICAgICAgIFtob3N0U2lkZV06IHsgLi4ubG9iYnksIHNpZGU6IGhvc3RTaWRlIGFzIENoZXNzaW1hbHNQbGF5ZXJDb2xvciB9LFxuICAgICAgICAgICAgW2d1ZXN0U2lkZV06IHsgLi4uZ3Vlc3QsIHNpZGU6IGd1ZXN0U2lkZSBhcyBDaGVzc2ltYWxzUGxheWVyQ29sb3IgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlbWF0Y2hSZXF1ZXN0czogW10sXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICB0cmFuc2FjdGlvbi5zZXQocmVmLCBuZXh0KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIG1vdmUoZ2FtZUlkOiBzdHJpbmcsIG1vdmU6IENoZXNzaW1hbHNNb3ZlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZEdhbWVJZCA9IHRoaXMubm9ybWFsaXplR2FtZUlkKGdhbWVJZCk7XG4gICAgY29uc3QgdWlkID0gYXdhaXQgdGhpcy5lbnN1cmVVc2VyKCk7XG4gICAgYXdhaXQgcnVuVHJhbnNhY3Rpb24odGhpcy5maXJlc3RvcmUsIGFzeW5jICh0cmFuc2FjdGlvbikgPT4ge1xuICAgICAgY29uc3QgcmVmID0gdGhpcy5nYW1lUmVmKG5vcm1hbGl6ZWRHYW1lSWQpO1xuICAgICAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCB0cmFuc2FjdGlvbi5nZXQocmVmKTtcbiAgICAgIGlmICghc25hcHNob3QuZXhpc3RzKCkpIHRocm93IG5ldyBFcnJvcignQ0hFU1NJTUFMU19HQU1FX05PVF9GT1VORCcpO1xuXG4gICAgICBjb25zdCBzdGF0ZSA9IHNuYXBzaG90LmRhdGEoKSBhcyBDaGVzc2ltYWxzR2FtZVN0YXRlO1xuICAgICAgdGhpcy5hc3NlcnROb3RFeHBpcmVkKHN0YXRlKTtcbiAgICAgIGNvbnN0IHNpZGUgPSB0aGlzLnBhcnRpY2lwYW50U2lkZShzdGF0ZSwgdWlkKTtcbiAgICAgIGlmICghc2lkZSB8fCBzaWRlICE9PSBzdGF0ZS5jdXJyZW50VHVybikgdGhyb3cgbmV3IEVycm9yKCdDSEVTU0lNQUxTX05PVF9ZT1VSX1RVUk4nKTtcblxuICAgICAgY29uc3QgdXBkYXRlZCA9IGFwcGx5Q2hlc3NpbWFsc01vdmUoc3RhdGUsIG1vdmUpO1xuICAgICAgdHJhbnNhY3Rpb24uc2V0KHJlZiwgdGhpcy53aXRoVXBkYXRlZEF0KHVwZGF0ZWQpKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHJlc2lnbihnYW1lSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRHYW1lSWQgPSB0aGlzLm5vcm1hbGl6ZUdhbWVJZChnYW1lSWQpO1xuICAgIGNvbnN0IHVpZCA9IGF3YWl0IHRoaXMuZW5zdXJlVXNlcigpO1xuICAgIGF3YWl0IHJ1blRyYW5zYWN0aW9uKHRoaXMuZmlyZXN0b3JlLCBhc3luYyAodHJhbnNhY3Rpb24pID0+IHtcbiAgICAgIGNvbnN0IHJlZiA9IHRoaXMuZ2FtZVJlZihub3JtYWxpemVkR2FtZUlkKTtcbiAgICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgdHJhbnNhY3Rpb24uZ2V0KHJlZik7XG4gICAgICBpZiAoIXNuYXBzaG90LmV4aXN0cygpKSB0aHJvdyBuZXcgRXJyb3IoJ0NIRVNTSU1BTFNfR0FNRV9OT1RfRk9VTkQnKTtcblxuICAgICAgY29uc3Qgc3RhdGUgPSBzbmFwc2hvdC5kYXRhKCkgYXMgQ2hlc3NpbWFsc0dhbWVTdGF0ZTtcbiAgICAgIHRoaXMuYXNzZXJ0Tm90RXhwaXJlZChzdGF0ZSk7XG4gICAgICBjb25zdCBzaWRlID0gdGhpcy5wYXJ0aWNpcGFudFNpZGUoc3RhdGUsIHVpZCk7XG4gICAgICBpZiAoIXNpZGUgfHwgc3RhdGUuc3RhdHVzID09PSAnZmluaXNoZWQnKSByZXR1cm47XG5cbiAgICAgIHRyYW5zYWN0aW9uLnNldChyZWYsIHRoaXMud2l0aFVwZGF0ZWRBdChyZXNpZ25DaGVzc2ltYWxzR2FtZShzdGF0ZSwgc2lkZSkpKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHJlcXVlc3RSZW1hdGNoKGdhbWVJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZEdhbWVJZCA9IHRoaXMubm9ybWFsaXplR2FtZUlkKGdhbWVJZCk7XG4gICAgY29uc3QgdWlkID0gYXdhaXQgdGhpcy5lbnN1cmVVc2VyKCk7XG4gICAgYXdhaXQgcnVuVHJhbnNhY3Rpb24odGhpcy5maXJlc3RvcmUsIGFzeW5jICh0cmFuc2FjdGlvbikgPT4ge1xuICAgICAgY29uc3QgcmVmID0gdGhpcy5nYW1lUmVmKG5vcm1hbGl6ZWRHYW1lSWQpO1xuICAgICAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCB0cmFuc2FjdGlvbi5nZXQocmVmKTtcbiAgICAgIGlmICghc25hcHNob3QuZXhpc3RzKCkpIHRocm93IG5ldyBFcnJvcignQ0hFU1NJTUFMU19HQU1FX05PVF9GT1VORCcpO1xuXG4gICAgICBjb25zdCBzdGF0ZSA9IHNuYXBzaG90LmRhdGEoKSBhcyBDaGVzc2ltYWxzR2FtZVN0YXRlO1xuICAgICAgdGhpcy5hc3NlcnROb3RFeHBpcmVkKHN0YXRlKTtcbiAgICAgIGlmIChzdGF0ZS5zdGF0dXMgIT09ICdmaW5pc2hlZCcpIHJldHVybjtcbiAgICAgIGlmICghdGhpcy5pc1BhcnRpY2lwYW50KHN0YXRlLCB1aWQpKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHBhcnRpY2lwYW50cyA9IHN0YXRlLm9ubGluZT8ucGFydGljaXBhbnRzO1xuICAgICAgaWYgKCFwYXJ0aWNpcGFudHM/LndoaXRlIHx8ICFwYXJ0aWNpcGFudHMuYmxhY2sgfHwgIXN0YXRlLm9ubGluZSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCByZXF1ZXN0cyA9IEFycmF5LmZyb20obmV3IFNldChbLi4uKHN0YXRlLm9ubGluZS5yZW1hdGNoUmVxdWVzdHMgPz8gW10pLCB1aWRdKSk7XG4gICAgICBjb25zdCBib3RoUmVhZHkgPSBbcGFydGljaXBhbnRzLndoaXRlLnVpZCwgcGFydGljaXBhbnRzLmJsYWNrLnVpZF0uZXZlcnkoKGl0ZW0pID0+IHJlcXVlc3RzLmluY2x1ZGVzKGl0ZW0pKTtcbiAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG5cbiAgICAgIGlmICghYm90aFJlYWR5KSB7XG4gICAgICAgIHRyYW5zYWN0aW9uLnNldChyZWYsIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBvbmxpbmU6IHsgLi4uc3RhdGUub25saW5lLCB1cGRhdGVkQXQ6IG5vdy50b0lTT1N0cmluZygpLCByZW1hdGNoUmVxdWVzdHM6IHJlcXVlc3RzIH0sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IFt3aGl0ZSwgYmxhY2tdID0gTWF0aC5yYW5kb20oKSA+IDAuNVxuICAgICAgICA/IFtwYXJ0aWNpcGFudHMud2hpdGUsIHBhcnRpY2lwYW50cy5ibGFja11cbiAgICAgICAgOiBbcGFydGljaXBhbnRzLmJsYWNrLCBwYXJ0aWNpcGFudHMud2hpdGVdO1xuICAgICAgY29uc3QgbmV4dCA9IGNyZWF0ZUNoZXNzaW1hbHNHYW1lKHN0YXRlLmJvYXJkU2l6ZSwge1xuICAgICAgICBpZDogc3RhdGUuaWQsXG4gICAgICAgIG1vZGU6ICdvbmxpbmUnLFxuICAgICAgICBzdGF0dXM6ICdpbl9wcm9ncmVzcycsXG4gICAgICAgIG9ubGluZToge1xuICAgICAgICAgIC4uLnN0YXRlLm9ubGluZSxcbiAgICAgICAgICB1cGRhdGVkQXQ6IG5vdy50b0lTT1N0cmluZygpLFxuICAgICAgICAgIHJvdW5kOiBzdGF0ZS5vbmxpbmUucm91bmQgKyAxLFxuICAgICAgICAgIHBhcnRpY2lwYW50czoge1xuICAgICAgICAgICAgd2hpdGU6IHsgLi4ud2hpdGUsIHNpZGU6ICd3aGl0ZScgfSxcbiAgICAgICAgICAgIGJsYWNrOiB7IC4uLmJsYWNrLCBzaWRlOiAnYmxhY2snIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZW1hdGNoUmVxdWVzdHM6IFtdLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIHRyYW5zYWN0aW9uLnNldChyZWYsIG5leHQpO1xuICAgIH0pO1xuICB9XG5cbiAgcGFydGljaXBhbnRTaWRlKHN0YXRlOiBDaGVzc2ltYWxzR2FtZVN0YXRlLCB1aWQgPSB0aGlzLmN1cnJlbnRVaWQpOiBDaGVzc2ltYWxzUGxheWVyQ29sb3IgfCB1bmRlZmluZWQge1xuICAgIGlmICghdWlkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHBhcnRpY2lwYW50cyA9IHN0YXRlLm9ubGluZT8ucGFydGljaXBhbnRzO1xuICAgIGlmIChwYXJ0aWNpcGFudHM/LndoaXRlPy51aWQgPT09IHVpZCkgcmV0dXJuICd3aGl0ZSc7XG4gICAgaWYgKHBhcnRpY2lwYW50cz8uYmxhY2s/LnVpZCA9PT0gdWlkKSByZXR1cm4gJ2JsYWNrJztcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaXNQYXJ0aWNpcGFudChzdGF0ZTogQ2hlc3NpbWFsc0dhbWVTdGF0ZSwgdWlkID0gdGhpcy5jdXJyZW50VWlkKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5wYXJ0aWNpcGFudFNpZGUoc3RhdGUsIHVpZCk7XG4gIH1cblxuICBpc0hvc3RXYWl0aW5nKHN0YXRlOiBDaGVzc2ltYWxzR2FtZVN0YXRlLCB1aWQgPSB0aGlzLmN1cnJlbnRVaWQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF1aWQgJiYgc3RhdGUuc3RhdHVzID09PSAnd2FpdGluZycgJiYgc3RhdGUub25saW5lPy5sb2JieT8udWlkID09PSB1aWQ7XG4gIH1cblxuICBzaGFyZVVybChnYW1lSWQ6IHN0cmluZywgYmFzZVJvdXRlID0gJy9taW5pLWdhbWVzJyk6IHN0cmluZyB7XG4gICAgY29uc3Qgb3JpZ2luID0gdHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgPyAnJyA6IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW47XG4gICAgY29uc3Qgbm9ybWFsaXplZEJhc2VSb3V0ZSA9IGAvJHtiYXNlUm91dGUucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgJycpIHx8ICdtaW5pLWdhbWVzJ31gO1xuICAgIHJldHVybiBgJHtvcmlnaW59JHtub3JtYWxpemVkQmFzZVJvdXRlfS9jaGVzc2ltYWxzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMubm9ybWFsaXplR2FtZUlkKGdhbWVJZCkpfWA7XG4gIH1cblxuICBwcml2YXRlIGdhbWVSZWYoZ2FtZUlkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gZG9jKHRoaXMuZmlyZXN0b3JlLCBgJHtDT0xMRUNUSU9OX1BBVEh9LyR7Z2FtZUlkfWApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVVc2VyKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgdGhpcy5maXJlYmFzZS53aGVuRmlyZWJhc2VBdXRoUmVhZHkoKTtcbiAgICBjb25zdCB1c2VyID0gdGhpcy5hdXRoLmN1cnJlbnRVc2VyO1xuICAgIGlmICh1c2VyPy51aWQpIHtcbiAgICAgIGF3YWl0IHVzZXIuZ2V0SWRUb2tlbigpO1xuICAgICAgcmV0dXJuIHVzZXIudWlkO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NIRVNTSU1BTFNfTE9HSU5fUkVRVUlSRUQnKTtcbiAgfVxuXG4gIHByaXZhdGUgZGVjb2RlSW5wdXQodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQodmFsdWUpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlUGFydGljaXBhbnQodWlkOiBzdHJpbmcsIGpvaW5lZEF0OiBzdHJpbmcpOiBDaGVzc2ltYWxzT25saW5lUGFydGljaXBhbnQge1xuICAgIGNvbnN0IHByb2ZpbGUgPSB0aGlzLnByb2ZpbGVzLmFjdGl2ZVByb2ZpbGUoKTtcbiAgICByZXR1cm4ge1xuICAgICAgdWlkLFxuICAgICAgcHJvZmlsZUlkOiBwcm9maWxlPy5pZCA/PyAnbG9jYWwtcGxheWVyJyxcbiAgICAgIG5hbWU6IHRoaXMucHJvZmlsZXMuZGlzcGxheU5hbWUocHJvZmlsZSwgJ0p1Z2Fkb3InKSxcbiAgICAgIGF2YXRhcjogcHJvZmlsZT8uYXZhdGFyID8/ICfimZ/vuI8nLFxuICAgICAgY29sb3I6IHByb2ZpbGU/LmNvbG9yID8/ICcjZmYwMGIyJyxcbiAgICAgIGpvaW5lZEF0LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHdpdGhVcGRhdGVkQXQoc3RhdGU6IENoZXNzaW1hbHNHYW1lU3RhdGUsIGRhdGUgPSBuZXcgRGF0ZSgpKTogQ2hlc3NpbWFsc0dhbWVTdGF0ZSB7XG4gICAgaWYgKCFzdGF0ZS5vbmxpbmUpIHJldHVybiBzdGF0ZTtcbiAgICByZXR1cm4geyAuLi5zdGF0ZSwgb25saW5lOiB7IC4uLnN0YXRlLm9ubGluZSwgdXBkYXRlZEF0OiBkYXRlLnRvSVNPU3RyaW5nKCkgfSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3NlcnROb3RFeHBpcmVkKHN0YXRlOiBDaGVzc2ltYWxzR2FtZVN0YXRlKTogdm9pZCB7XG4gICAgaWYgKChzdGF0ZS5vbmxpbmU/LmV4cGlyZXNBdE1zID8/IDApIDwgRGF0ZS5ub3coKSkgdGhyb3cgbmV3IEVycm9yKCdDSEVTU0lNQUxTX0dBTUVfRVhQSVJFRCcpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVHYW1lSWQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBhbHBoYWJldCA9ICdBQkNERUZHSEpLTE1OUFFSU1RVVldYWVoyMzQ1Njc4OSc7XG4gICAgY29uc3QgbWFrZVBhcnQgPSAoKTogc3RyaW5nID0+IEFycmF5LmZyb20oeyBsZW5ndGg6IDQgfSwgKCkgPT4gYWxwaGFiZXRbdGhpcy5yYW5kb21JbmRleChhbHBoYWJldC5sZW5ndGgpXSkuam9pbignJyk7XG4gICAgcmV0dXJuIGAke21ha2VQYXJ0KCl9LSR7bWFrZVBhcnQoKX1gO1xuICB9XG5cbiAgcHJpdmF0ZSByYW5kb21JbmRleChtYXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IG5ldyBVaW50MzJBcnJheSgxKTtcbiAgICAgIGNyeXB0by5nZXRSYW5kb21WYWx1ZXModmFsdWVzKTtcbiAgICAgIHJldHVybiB2YWx1ZXNbMF0gJSBtYXg7XG4gICAgfVxuICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBtYXgpO1xuICB9XG5cbn1cbiJdfQ==
386
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlc3NpbWFscy1vbmxpbmUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9vcmdhbmlzbXMvbWluaS1nYW1lcy9jaGVzc2ltYWxzLW9ubGluZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMxQyxPQUFPLEVBQ0wsVUFBVSxFQUNWLGNBQWMsRUFDZCxTQUFTLEVBQ1QsR0FBRyxFQUNILE9BQU8sRUFDUCxLQUFLLEVBQ0wsT0FBTyxFQUNQLEtBQUssRUFDTCxjQUFjLEVBQ2QsTUFBTSxHQUNQLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQUFjLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRWhELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RyxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQzs7QUFVbEYsTUFBTSxlQUFlLEdBQUcsNEJBQTRCLENBQUM7QUFDckQsTUFBTSxXQUFXLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBR3hDLE1BQU0sT0FBTyx1QkFBdUI7SUFEcEM7UUFFbUIsU0FBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQixjQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzlCLGFBQVEsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDbkMsYUFBUSxHQUFH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QUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQ2hHLENBQUM7SUFFTyxZQUFZO1FBQ2xCLE1BQU0sUUFBUSxHQUFHLGtDQUFrQyxDQUFDO1FBQ3BELE1BQU0sUUFBUSxHQUFHLEdBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDckgsT0FBTyxHQUFHLFFBQVEsRUFBRSxJQUFJLFFBQVEsRUFBRSxFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVPLFdBQVcsQ0FBQyxHQUFXO1FBQzdCLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxJQUFJLE1BQU0sQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUM1RCxNQUFNLE1BQU0sR0FBRyxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQyxNQUFNLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQy9CLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN6QixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUN6QyxDQUFDOytHQWpaVSx1QkFBdUI7bUhBQXZCLHVCQUF1QixjQURWLE1BQU07OzRGQUNuQix1QkFBdUI7a0JBRG5DLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBdXRoIH0gZnJvbSAnQGFuZ3VsYXIvZmlyZS9hdXRoJztcbmltcG9ydCB7XG4gIGNvbGxlY3Rpb24sXG4gIGNvbGxlY3Rpb25EYXRhLFxuICBGaXJlc3RvcmUsXG4gIGRvYyxcbiAgZG9jRGF0YSxcbiAgbGltaXQsXG4gIG9yZGVyQnksXG4gIHF1ZXJ5LFxuICBydW5UcmFuc2FjdGlvbixcbiAgc2V0RG9jLFxufSBmcm9tICdAYW5ndWxhci9maXJlL2ZpcmVzdG9yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBtYXAsIG9mLCB0YXAgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgRmlyZWJhc2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZmlyZWJhc2UvZmlyZWJhc2Uuc2VydmljZSc7XG5pbXBvcnQgeyBhcHBseUNoZXNzaW1hbHNNb3ZlLCBjcmVhdGVDaGVzc2ltYWxzR2FtZSwgcmVzaWduQ2hlc3NpbWFsc0dhbWUgfSBmcm9tICcuL2NoZXNzaW1hbHMtZW5naW5lJztcbmltcG9ydCB7IE1pbmlHYW1lUGxheWVyUHJvZmlsZVNlcnZpY2UgfSBmcm9tICcuL21pbmktZ2FtZS1wbGF5ZXItcHJvZmlsZS5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIENoZXNzaW1hbHNCb2FyZFNpemUsXG4gIENoZXNzaW1hbHNHYW1lU3RhdGUsXG4gIENoZXNzaW1hbHNIaXN0b3J5RW50cnksXG4gIENoZXNzaW1hbHNNb3ZlLFxuICBDaGVzc2ltYWxzT25saW5lUGFydGljaXBhbnQsXG4gIENoZXNzaW1hbHNQbGF5ZXJDb2xvcixcbn0gZnJvbSAnLi90eXBlcyc7XG5cbmNvbnN0IENPTExFQ1RJT05fUEFUSCA9ICdtaW5pR2FtZXMvY2hlc3NpbWFscy9nYW1lcyc7XG5jb25zdCBHQU1FX1RUTF9NUyA9IDI0ICogNjAgKiA2MCAqIDEwMDA7XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgQ2hlc3NpbWFsc09ubGluZVNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IGF1dGggPSBpbmplY3QoQXV0aCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlyZXN0b3JlID0gaW5qZWN0KEZpcmVzdG9yZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlyZWJhc2UgPSBpbmplY3QoRmlyZWJhc2VTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBwcm9maWxlcyA9IGluamVjdChNaW5pR2FtZVBsYXllclByb2ZpbGVTZXJ2aWNlKTtcblxuICBnZXQgY3VycmVudFVpZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmF1dGguY3VycmVudFVzZXI/LnVpZDtcbiAgfVxuXG4gIG5vcm1hbGl6ZUdhbWVJZCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCByYXcgPSAodmFsdWUgPz8gJycpLnRyaW0oKS50b1VwcGVyQ2FzZSgpO1xuICAgIGNvbnN0IGRlY29kZWQgPSB0aGlzLmRlY29kZUlucHV0KHJhdyk7XG4gICAgY29uc3QgcGF0aFNlZ21lbnQgPSBkZWNvZGVkLnNwbGl0KC9bPyNdLylbMF0uc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbikucG9wKCkgPz8gZGVjb2RlZDtcbiAgICBjb25zdCBtYXRjaCA9IHBhdGhTZWdtZW50Lm1hdGNoKC9bQS1aMC05XXs0fS0/W0EtWjAtOV17NH0vKT8uWzBdXG4gICAgICA/PyBkZWNvZGVkLm1hdGNoKC9bQS1aMC05XXs0fS0/W0EtWjAtOV17NH0vKT8uWzBdXG4gICAgICA/PyBkZWNvZGVkO1xuICAgIGNvbnN0IGNvbXBhY3QgPSBtYXRjaC5yZXBsYWNlKC9bXkEtWjAtOV0vZywgJycpLnNsaWNlKDAsIDgpO1xuICAgIGlmIChjb21wYWN0Lmxlbmd0aCA8PSA0KSByZXR1cm4gY29tcGFjdDtcbiAgICByZXR1cm4gYCR7Y29tcGFjdC5zbGljZSgwLCA0KX0tJHtjb21wYWN0LnNsaWNlKDQsIDgpfWA7XG4gIH1cblxuICBpc1ZhbGlkR2FtZUlkKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gL15bQS1aMC05XXs0fS1bQS1aMC05XXs0fSQvLnRlc3QodGhpcy5ub3JtYWxpemVHYW1lSWQodmFsdWUpKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUdhbWUoYm9hcmRTaXplOiBDaGVzc2ltYWxzQm9hcmRTaXplKTogUHJvbWlzZTxDaGVzc2ltYWxzR2FtZVN0YXRlPiB7XG4gICAgY29uc3QgdWlkID0gYXdhaXQgdGhpcy5lbnN1cmVVc2VyKCk7XG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICBjb25zdCBleHBpcmVzQXQgPSBuZXcgRGF0ZShub3cuZ2V0VGltZSgpICsgR0FNRV9UVExfTVMpO1xuICAgIGNvbnN0IGdhbWVJZCA9IHRoaXMuY3JlYXRlR2FtZUlkKCk7XG4gICAgY29uc3QgaG9zdCA9IHRoaXMuY3JlYXRlUGFydGljaXBhbnQodWlkLCBub3cudG9JU09TdHJpbmcoKSk7XG4gICAgY29uc3Qgc3RhdGUgPSBjcmVhdGVDaGVzc2ltYWxzR2FtZShib2FyZFNpemUsIHtcbiAgICAgIGlkOiBnYW1lSWQsXG4gICAgICBtb2RlOiAnb25saW5lJyxcbiAgICAgIHN0YXR1czogJ3dhaXRpbmcnLFxuICAgICAgb25saW5lOiB7XG4gICAgICAgIGdhbWVJZCxcbiAgICAgICAgaG9zdFVpZDogdWlkLFxuICAgICAgICBjcmVhdGVkQXQ6IG5vdy50b0lTT1N0cmluZygpLFxuICAgICAgICB1cGRhdGVkQXQ6IG5vdy50b0lTT1N0cmluZygpLFxuICAgICAgICBleHBpcmVzQXQ6IGV4cGlyZXNBdC50b0lTT1N0cmluZygpLFxuICAgICAgICBleHBpcmVzQXRNczogZXhwaXJlc0F0LmdldFRpbWUoKSxcbiAgICAgICAgcm91bmQ6IDEsXG4gICAgICAgIGxvYmJ5OiBob3N0LFxuICAgICAgICByZW1hdGNoUmVxdWVzdHM6IFtdLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IG5leHQgPSB0aGlzLndpdGhVcGRhdGVkQXQoc3RhdGUsIG5vdyk7XG4gICAgYXdhaXQgc2V0RG9jKHRoaXMuZ2FtZVJlZihnYW1lSWQpLCBuZXh0KTtcbiAgICBhd2FpdCB0aGlzLnNhdmVDdXJyZW50VXNlckhpc3RvcnkobmV4dCk7XG4gICAgcmV0dXJuIG5leHQ7XG4gIH1cblxuICB3YXRjaEdhbWUoZ2FtZUlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPENoZXNzaW1hbHNHYW1lU3RhdGUgfCBudWxsPiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZEdhbWVJZCA9IHRoaXMubm9ybWFsaXplR2FtZUlkKGdhbWVJZCk7XG4gICAgcmV0dXJuIGRvY0RhdGEodGhpcy5nYW1lUmVmKG5vcm1hbGl6ZWRHYW1lSWQpKS5waXBlKFxuICAgICAgbWFwKCh2YWx1ZSkgPT4gKHZhbHVlID8gKHZhbHVlIGFzIENoZXNzaW1hbHNHYW1lU3RhdGUpIDogbnVsbCkpLFxuICAgICAgdGFwKChzdGF0ZSkgPT4ge1xuICAgICAgICBpZiAoc3RhdGUpIHZvaWQgdGhpcy5zYXZlQ3VycmVudFVzZXJIaXN0b3J5KHN0YXRlKTtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICB3YXRjaEhpc3RvcnkobGltaXRDb3VudCA9IDgpOiBPYnNlcnZhYmxlPENoZXNzaW1hbHNIaXN0b3J5RW50cnlbXT4ge1xuICAgIGNvbnN0IHVpZCA9IHRoaXMuY3VycmVudFVpZDtcbiAgICBpZiAoIXVpZCkgcmV0dXJuIG9mKFtdKTtcbiAgICBjb25zdCBoaXN0b3J5UXVlcnkgPSBxdWVyeShcbiAgICAgIGNvbGxlY3Rpb24odGhpcy5maXJlc3RvcmUsIHRoaXMuaGlzdG9yeVBhdGgodWlkKSksXG4gICAgICBvcmRlckJ5KCd1cGRhdGVkQXQnLCAnZGVzYycpLFxuICAgICAgbGltaXQobGltaXRDb3VudCksXG4gICAgKTtcbiAgICByZXR1cm4gY29sbGVjdGlvbkRhdGEoaGlzdG9yeVF1ZXJ5KS5waXBlKG1hcCgoaXRlbXMpID0+IGl0ZW1zIGFzIENoZXNzaW1hbHNIaXN0b3J5RW50cnlbXSkpO1xuICB9XG5cbiAgYXN5bmMgam9pbkdhbWUoZ2FtZUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBub3JtYWxpemVkR2FtZUlkID0gdGhpcy5ub3JtYWxpemVHYW1lSWQoZ2FtZUlkKTtcbiAgICBjb25zdCB1aWQgPSBhd2FpdCB0aGlzLmVuc3VyZVVzZXIoKTtcbiAgICBhd2FpdCBydW5UcmFuc2FjdGlvbih0aGlzLmZpcmVzdG9yZSwgYXN5bmMgKHRyYW5zYWN0aW9uKSA9PiB7XG4gICAgICBjb25zdCByZWYgPSB0aGlzLmdhbWVSZWYobm9ybWFsaXplZEdhbWVJZCk7XG4gICAgICBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IHRyYW5zYWN0aW9uLmdldChyZWYpO1xuICAgICAgaWYgKCFzbmFwc2hvdC5leGlzdHMoKSkgdGhyb3cgbmV3IEVycm9yKCdDSEVTU0lNQUxTX0dBTUVfTk9UX0ZPVU5EJyk7XG5cbiAgICAgIGNvbnN0IHN0YXRlID0gc25hcHNob3QuZGF0YSgpIGFzIENoZXNzaW1hbHNHYW1lU3RhdGU7XG4gICAgICB0aGlzLmFzc2VydE5vdEV4cGlyZWQoc3RhdGUpO1xuXG4gICAgICBpZiAodGhpcy5pc1BhcnRpY2lwYW50KHN0YXRlLCB1aWQpKSByZXR1cm47XG4gICAgICBpZiAoc3RhdGUuc3RhdHVzID09PSAnd2FpdGluZycgJiYgc3RhdGUub25saW5lPy5sb2JieT8udWlkID09PSB1aWQpIHJldHVybjtcbiAgICAgIGlmIChzdGF0ZS5zdGF0dXMgIT09ICd3YWl0aW5nJyB8fCAhc3RhdGUub25saW5lPy5sb2JieSkgcmV0dXJuO1xuXG4gICAgICBpZiAoc3RhdGUub25saW5lLnBlbmRpbmdHdWVzdD8udWlkID09PSB1aWQpIHJldHVybjtcblxuICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICAgIGNvbnN0IGd1ZXN0ID0gdGhpcy5jcmVhdGVQYXJ0aWNpcGFudCh1aWQsIG5vdy50b0lTT1N0cmluZygpKTtcbiAgICAgIGNvbnN0IG5leHQ6IENoZXNzaW1hbHNHYW1lU3RhdGUgPSB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBvbmxpbmU6IHtcbiAgICAgICAgICAuLi5zdGF0ZS5vbmxpbmUsXG4gICAgICAgICAgdXBkYXRlZEF0OiBub3cudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICBwZW5kaW5nR3Vlc3Q6IGd1ZXN0LFxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgdHJhbnNhY3Rpb24uc2V0KHJlZiwgbmV4dCk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBhY2NlcHRHdWVzdChnYW1lSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRHYW1lSWQgPSB0aGlzLm5vcm1hbGl6ZUdhbWVJZChnYW1lSWQpO1xuICAgIGNvbnN0IHVpZCA9IGF3YWl0IHRoaXMuZW5zdXJlVXNlcigpO1xuICAgIGF3YWl0IHJ1blRyYW5zYWN0aW9uKHRoaXMuZmlyZXN0b3JlLCBhc3luYyAodHJhbnNhY3Rpb24pID0+IHtcbiAgICAgIGNvbnN0IHJlZiA9IHRoaXMuZ2FtZVJlZihub3JtYWxpemVkR2FtZUlkKTtcbiAgICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgdHJhbnNhY3Rpb24uZ2V0KHJlZik7XG4gICAgICBpZiAoIXNuYXBzaG90LmV4aXN0cygpKSB0aHJvdyBuZXcgRXJyb3IoJ0NIRVNTSU1BTFNfR0FNRV9OT1RfRk9VTkQnKTtcblxuICAgICAgY29uc3Qgc3RhdGUgPSBzbmFwc2hvdC5kYXRhKCkgYXMgQ2hlc3NpbWFsc0dhbWVTdGF0ZTtcbiAgICAgIHRoaXMuYXNzZXJ0Tm90RXhwaXJlZChzdGF0ZSk7XG4gICAgICBpZiAoc3RhdGUuc3RhdHVzICE9PSAnd2FpdGluZycgfHwgc3RhdGUub25saW5lPy5sb2JieT8udWlkICE9PSB1aWQgfHwgIXN0YXRlLm9ubGluZS5wZW5kaW5nR3Vlc3QpIHJldHVybjtcblxuICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICAgIGNvbnN0IFtob3N0U2lkZSwgZ3Vlc3RTaWRlXSA9IE1hdGgucmFuZG9tKCkgPiAwLjUgPyBbJ3doaXRlJywgJ2JsYWNrJ10gOiBbJ2JsYWNrJywgJ3doaXRlJ107XG4gICAgICBjb25zdCBsb2JieSA9IHN0YXRlLm9ubGluZS5sb2JieTtcbiAgICAgIGNvbnN0IGd1ZXN0ID0gc3RhdGUub25saW5lLnBlbmRpbmdHdWVzdDtcbiAgICAgIGNvbnN0IG9ubGluZTogTm9uTnVsbGFibGU8Q2hlc3NpbWFsc0dhbWVTdGF0ZVsnb25saW5lJ10+ID0geyAuLi5zdGF0ZS5vbmxpbmUgfTtcbiAgICAgIGRlbGV0ZSBvbmxpbmUubG9iYnk7XG4gICAgICBkZWxldGUgb25saW5lLnBlbmRpbmdHdWVzdDtcblxuICAgICAgY29uc3QgbmV4dDogQ2hlc3NpbWFsc0dhbWVTdGF0ZSA9IHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIHN0YXR1czogJ2luX3Byb2dyZXNzJyxcbiAgICAgICAgY3VycmVudFR1cm46ICd3aGl0ZScsXG4gICAgICAgIG9ubGluZToge1xuICAgICAgICAgIC4uLm9ubGluZSxcbiAgICAgICAgICB1cGRhdGVkQXQ6IG5vdy50b0lTT1N0cmluZygpLFxuICAgICAgICAgIHBhcnRpY2lwYW50czoge1xuICAgICAgICAgICAgW2hvc3RTaWRlXTogeyAuLi5sb2JieSwgc2lkZTogaG9zdFNpZGUgYXMgQ2hlc3NpbWFsc1BsYXllckNvbG9yIH0sXG4gICAgICAgICAgICBbZ3Vlc3RTaWRlXTogeyAuLi5ndWVzdCwgc2lkZTogZ3Vlc3RTaWRlIGFzIENoZXNzaW1hbHNQbGF5ZXJDb2xvciB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVtYXRjaFJlcXVlc3RzOiBbXSxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIHRyYW5zYWN0aW9uLnNldChyZWYsIG5leHQpO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgcmVqZWN0R3Vlc3QoZ2FtZUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBub3JtYWxpemVkR2FtZUlkID0gdGhpcy5ub3JtYWxpemVHYW1lSWQoZ2FtZUlkKTtcbiAgICBjb25zdCB1aWQgPSBhd2FpdCB0aGlzLmVuc3VyZVVzZXIoKTtcbiAgICBhd2FpdCBydW5UcmFuc2FjdGlvbih0aGlzLmZpcmVzdG9yZSwgYXN5bmMgKHRyYW5zYWN0aW9uKSA9PiB7XG4gICAgICBjb25zdCByZWYgPSB0aGlzLmdhbWVSZWYobm9ybWFsaXplZEdhbWVJZCk7XG4gICAgICBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IHRyYW5zYWN0aW9uLmdldChyZWYpO1xuICAgICAgaWYgKCFzbmFwc2hvdC5leGlzdHMoKSkgdGhyb3cgbmV3IEVycm9yKCdDSEVTU0lNQUxTX0dBTUVfTk9UX0ZPVU5EJyk7XG5cbiAgICAgIGNvbnN0IHN0YXRlID0gc25hcHNob3QuZGF0YSgpIGFzIENoZXNzaW1hbHNHYW1lU3RhdGU7XG4gICAgICB0aGlzLmFzc2VydE5vdEV4cGlyZWQoc3RhdGUpO1xuICAgICAgaWYgKHN0YXRlLnN0YXR1cyAhPT0gJ3dhaXRpbmcnIHx8IHN0YXRlLm9ubGluZT8ubG9iYnk/LnVpZCAhPT0gdWlkIHx8ICFzdGF0ZS5vbmxpbmUucGVuZGluZ0d1ZXN0KSByZXR1cm47XG5cbiAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgICBjb25zdCBvbmxpbmU6IE5vbk51bGxhYmxlPENoZXNzaW1hbHNHYW1lU3RhdGVbJ29ubGluZSddPiA9IHsgLi4uc3RhdGUub25saW5lLCB1cGRhdGVkQXQ6IG5vdy50b0lTT1N0cmluZygpIH07XG4gICAgICBkZWxldGUgb25saW5lLnBlbmRpbmdHdWVzdDtcbiAgICAgIHRyYW5zYWN0aW9uLnNldChyZWYsIHsgLi4uc3RhdGUsIG9ubGluZSB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIG1vdmUoZ2FtZUlkOiBzdHJpbmcsIG1vdmU6IENoZXNzaW1hbHNNb3ZlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZEdhbWVJZCA9IHRoaXMubm9ybWFsaXplR2FtZUlkKGdhbWVJZCk7XG4gICAgY29uc3QgdWlkID0gYXdhaXQgdGhpcy5lbnN1cmVVc2VyKCk7XG4gICAgYXdhaXQgcnVuVHJhbnNhY3Rpb24odGhpcy5maXJlc3RvcmUsIGFzeW5jICh0cmFuc2FjdGlvbikgPT4ge1xuICAgICAgY29uc3QgcmVmID0gdGhpcy5nYW1lUmVmKG5vcm1hbGl6ZWRHYW1lSWQpO1xuICAgICAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCB0cmFuc2FjdGlvbi5nZXQocmVmKTtcbiAgICAgIGlmICghc25hcHNob3QuZXhpc3RzKCkpIHRocm93IG5ldyBFcnJvcignQ0hFU1NJTUFMU19HQU1FX05PVF9GT1VORCcpO1xuXG4gICAgICBjb25zdCBzdGF0ZSA9IHNuYXBzaG90LmRhdGEoKSBhcyBDaGVzc2ltYWxzR2FtZVN0YXRlO1xuICAgICAgdGhpcy5hc3NlcnROb3RFeHBpcmVkKHN0YXRlKTtcbiAgICAgIGNvbnN0IHNpZGUgPSB0aGlzLnBhcnRpY2lwYW50U2lkZShzdGF0ZSwgdWlkKTtcbiAgICAgIGlmICghc2lkZSB8fCBzaWRlICE9PSBzdGF0ZS5jdXJyZW50VHVybikgdGhyb3cgbmV3IEVycm9yKCdDSEVTU0lNQUxTX05PVF9ZT1VSX1RVUk4nKTtcblxuICAgICAgY29uc3QgdXBkYXRlZCA9IGFwcGx5Q2hlc3NpbWFsc01vdmUoc3RhdGUsIG1vdmUpO1xuICAgICAgdHJhbnNhY3Rpb24uc2V0KHJlZiwgdGhpcy53aXRoVXBkYXRlZEF0KHVwZGF0ZWQpKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHJlc2lnbihnYW1lSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRHYW1lSWQgPSB0aGlzLm5vcm1hbGl6ZUdhbWVJZChnYW1lSWQpO1xuICAgIGNvbnN0IHVpZCA9IGF3YWl0IHRoaXMuZW5zdXJlVXNlcigpO1xuICAgIGF3YWl0IHJ1blRyYW5zYWN0aW9uKHRoaXMuZmlyZXN0b3JlLCBhc3luYyAodHJhbnNhY3Rpb24pID0+IHtcbiAgICAgIGNvbnN0IHJlZiA9IHRoaXMuZ2FtZVJlZihub3JtYWxpemVkR2FtZUlkKTtcbiAgICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgdHJhbnNhY3Rpb24uZ2V0KHJlZik7XG4gICAgICBpZiAoIXNuYXBzaG90LmV4aXN0cygpKSB0aHJvdyBuZXcgRXJyb3IoJ0NIRVNTSU1BTFNfR0FNRV9OT1RfRk9VTkQnKTtcblxuICAgICAgY29uc3Qgc3RhdGUgPSBzbmFwc2hvdC5kYXRhKCkgYXMgQ2hlc3NpbWFsc0dhbWVTdGF0ZTtcbiAgICAgIHRoaXMuYXNzZXJ0Tm90RXhwaXJlZChzdGF0ZSk7XG4gICAgICBjb25zdCBzaWRlID0gdGhpcy5wYXJ0aWNpcGFudFNpZGUoc3RhdGUsIHVpZCk7XG4gICAgICBpZiAoIXNpZGUgfHwgc3RhdGUuc3RhdHVzID09PSAnZmluaXNoZWQnKSByZXR1cm47XG5cbiAgICAgIHRyYW5zYWN0aW9uLnNldChyZWYsIHRoaXMud2l0aFVwZGF0ZWRBdChyZXNpZ25DaGVzc2ltYWxzR2FtZShzdGF0ZSwgc2lkZSkpKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHJlcXVlc3RSZW1hdGNoKGdhbWVJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZEdhbWVJZCA9IHRoaXMubm9ybWFsaXplR2FtZUlkKGdhbWVJZCk7XG4gICAgY29uc3QgdWlkID0gYXdhaXQgdGhpcy5lbnN1cmVVc2VyKCk7XG4gICAgYXdhaXQgcnVuVHJhbnNhY3Rpb24odGhpcy5maXJlc3RvcmUsIGFzeW5jICh0cmFuc2FjdGlvbikgPT4ge1xuICAgICAgY29uc3QgcmVmID0gdGhpcy5nYW1lUmVmKG5vcm1hbGl6ZWRHYW1lSWQpO1xuICAgICAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCB0cmFuc2FjdGlvbi5nZXQocmVmKTtcbiAgICAgIGlmICghc25hcHNob3QuZXhpc3RzKCkpIHRocm93IG5ldyBFcnJvcignQ0hFU1NJTUFMU19HQU1FX05PVF9GT1VORCcpO1xuXG4gICAgICBjb25zdCBzdGF0ZSA9IHNuYXBzaG90LmRhdGEoKSBhcyBDaGVzc2ltYWxzR2FtZVN0YXRlO1xuICAgICAgdGhpcy5hc3NlcnROb3RFeHBpcmVkKHN0YXRlKTtcbiAgICAgIGlmIChzdGF0ZS5zdGF0dXMgIT09ICdmaW5pc2hlZCcpIHJldHVybjtcbiAgICAgIGlmICghdGhpcy5pc1BhcnRpY2lwYW50KHN0YXRlLCB1aWQpKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHBhcnRpY2lwYW50cyA9IHN0YXRlLm9ubGluZT8ucGFydGljaXBhbnRzO1xuICAgICAgaWYgKCFwYXJ0aWNpcGFudHM/LndoaXRlIHx8ICFwYXJ0aWNpcGFudHMuYmxhY2sgfHwgIXN0YXRlLm9ubGluZSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCByZXF1ZXN0cyA9IEFycmF5LmZyb20obmV3IFNldChbLi4uKHN0YXRlLm9ubGluZS5yZW1hdGNoUmVxdWVzdHMgPz8gW10pLCB1aWRdKSk7XG4gICAgICBjb25zdCBib3RoUmVhZHkgPSBbcGFydGljaXBhbnRzLndoaXRlLnVpZCwgcGFydGljaXBhbnRzLmJsYWNrLnVpZF0uZXZlcnkoKGl0ZW0pID0+IHJlcXVlc3RzLmluY2x1ZGVzKGl0ZW0pKTtcbiAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG5cbiAgICAgIGlmICghYm90aFJlYWR5KSB7XG4gICAgICAgIHRyYW5zYWN0aW9uLnNldChyZWYsIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBvbmxpbmU6IHsgLi4uc3RhdGUub25saW5lLCB1cGRhdGVkQXQ6IG5vdy50b0lTT1N0cmluZygpLCByZW1hdGNoUmVxdWVzdHM6IHJlcXVlc3RzIH0sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IFt3aGl0ZSwgYmxhY2tdID0gTWF0aC5yYW5kb20oKSA+IDAuNVxuICAgICAgICA/IFtwYXJ0aWNpcGFudHMud2hpdGUsIHBhcnRpY2lwYW50cy5ibGFja11cbiAgICAgICAgOiBbcGFydGljaXBhbnRzLmJsYWNrLCBwYXJ0aWNpcGFudHMud2hpdGVdO1xuICAgICAgY29uc3QgbmV4dCA9IGNyZWF0ZUNoZXNzaW1hbHNHYW1lKHN0YXRlLmJvYXJkU2l6ZSwge1xuICAgICAgICBpZDogc3RhdGUuaWQsXG4gICAgICAgIG1vZGU6ICdvbmxpbmUnLFxuICAgICAgICBzdGF0dXM6ICdpbl9wcm9ncmVzcycsXG4gICAgICAgIG9ubGluZToge1xuICAgICAgICAgIC4uLnN0YXRlLm9ubGluZSxcbiAgICAgICAgICB1cGRhdGVkQXQ6IG5vdy50b0lTT1N0cmluZygpLFxuICAgICAgICAgIHJvdW5kOiBzdGF0ZS5vbmxpbmUucm91bmQgKyAxLFxuICAgICAgICAgIHBhcnRpY2lwYW50czoge1xuICAgICAgICAgICAgd2hpdGU6IHsgLi4ud2hpdGUsIHNpZGU6ICd3aGl0ZScgfSxcbiAgICAgICAgICAgIGJsYWNrOiB7IC4uLmJsYWNrLCBzaWRlOiAnYmxhY2snIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZW1hdGNoUmVxdWVzdHM6IFtdLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIHRyYW5zYWN0aW9uLnNldChyZWYsIG5leHQpO1xuICAgIH0pO1xuICB9XG5cbiAgcGFydGljaXBhbnRTaWRlKHN0YXRlOiBDaGVzc2ltYWxzR2FtZVN0YXRlLCB1aWQgPSB0aGlzLmN1cnJlbnRVaWQpOiBDaGVzc2ltYWxzUGxheWVyQ29sb3IgfCB1bmRlZmluZWQge1xuICAgIGlmICghdWlkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHBhcnRpY2lwYW50cyA9IHN0YXRlLm9ubGluZT8ucGFydGljaXBhbnRzO1xuICAgIGlmIChwYXJ0aWNpcGFudHM/LndoaXRlPy51aWQgPT09IHVpZCkgcmV0dXJuICd3aGl0ZSc7XG4gICAgaWYgKHBhcnRpY2lwYW50cz8uYmxhY2s/LnVpZCA9PT0gdWlkKSByZXR1cm4gJ2JsYWNrJztcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaXNQYXJ0aWNpcGFudChzdGF0ZTogQ2hlc3NpbWFsc0dhbWVTdGF0ZSwgdWlkID0gdGhpcy5jdXJyZW50VWlkKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5wYXJ0aWNpcGFudFNpZGUoc3RhdGUsIHVpZCk7XG4gIH1cblxuICBpc0hvc3RXYWl0aW5nKHN0YXRlOiBDaGVzc2ltYWxzR2FtZVN0YXRlLCB1aWQgPSB0aGlzLmN1cnJlbnRVaWQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF1aWQgJiYgc3RhdGUuc3RhdHVzID09PSAnd2FpdGluZycgJiYgc3RhdGUub25saW5lPy5sb2JieT8udWlkID09PSB1aWQ7XG4gIH1cblxuICBzaGFyZVVybChnYW1lSWQ6IHN0cmluZywgYmFzZVJvdXRlID0gJy9taW5pLWdhbWVzJyk6IHN0cmluZyB7XG4gICAgY29uc3Qgb3JpZ2luID0gdHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgPyAnJyA6IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW47XG4gICAgY29uc3Qgbm9ybWFsaXplZEJhc2VSb3V0ZSA9IGAvJHtiYXNlUm91dGUucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgJycpIHx8ICdtaW5pLWdhbWVzJ31gO1xuICAgIHJldHVybiBgJHtvcmlnaW59JHtub3JtYWxpemVkQmFzZVJvdXRlfS9jaGVzc2ltYWxzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMubm9ybWFsaXplR2FtZUlkKGdhbWVJZCkpfWA7XG4gIH1cblxuICBhc3luYyBzYXZlQ3VycmVudFVzZXJIaXN0b3J5KHN0YXRlOiBDaGVzc2ltYWxzR2FtZVN0YXRlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdWlkID0gdGhpcy5jdXJyZW50VWlkO1xuICAgIGlmICghdWlkIHx8IHN0YXRlLm1vZGUgIT09ICdvbmxpbmUnKSByZXR1cm47XG4gICAgY29uc3QgZW50cnkgPSB0aGlzLmNyZWF0ZUhpc3RvcnlFbnRyeShzdGF0ZSwgdWlkKTtcbiAgICBpZiAoIWVudHJ5KSByZXR1cm47XG4gICAgYXdhaXQgc2V0RG9jKHRoaXMuaGlzdG9yeVJlZih1aWQsIHN0YXRlLmlkKSwgdGhpcy53aXRob3V0VW5kZWZpbmVkKGVudHJ5KSwgeyBtZXJnZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2FtZVJlZihnYW1lSWQ6IHN0cmluZykge1xuICAgIHJldHVybiBkb2ModGhpcy5maXJlc3RvcmUsIGAke0NPTExFQ1RJT05fUEFUSH0vJHtnYW1lSWR9YCk7XG4gIH1cblxuICBwcml2YXRlIGhpc3RvcnlQYXRoKHVpZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHVzZXJzLyR7dWlkfS9taW5pR2FtZXMvY2hlc3NpbWFscy9oaXN0b3J5YDtcbiAgfVxuXG4gIHByaXZhdGUgaGlzdG9yeVJlZih1aWQ6IHN0cmluZywgZ2FtZUlkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gZG9jKHRoaXMuZmlyZXN0b3JlLCBgJHt0aGlzLmhpc3RvcnlQYXRoKHVpZCl9LyR7Z2FtZUlkfWApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVVc2VyKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgdGhpcy5maXJlYmFzZS53aGVuRmlyZWJhc2VBdXRoUmVhZHkoKTtcbiAgICBjb25zdCB1c2VyID0gdGhpcy5hdXRoLmN1cnJlbnRVc2VyO1xuICAgIGlmICh1c2VyPy51aWQpIHtcbiAgICAgIGF3YWl0IHVzZXIuZ2V0SWRUb2tlbigpO1xuICAgICAgcmV0dXJuIHVzZXIudWlkO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NIRVNTSU1BTFNfTE9HSU5fUkVRVUlSRUQnKTtcbiAgfVxuXG4gIHByaXZhdGUgZGVjb2RlSW5wdXQodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQodmFsdWUpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlUGFydGljaXBhbnQodWlkOiBzdHJpbmcsIGpvaW5lZEF0OiBzdHJpbmcpOiBDaGVzc2ltYWxzT25saW5lUGFydGljaXBhbnQge1xuICAgIGNvbnN0IHByb2ZpbGUgPSB0aGlzLnByb2ZpbGVzLmFjdGl2ZVByb2ZpbGUoKTtcbiAgICByZXR1cm4ge1xuICAgICAgdWlkLFxuICAgICAgcHJvZmlsZUlkOiBwcm9maWxlPy5pZCA/PyAnbG9jYWwtcGxheWVyJyxcbiAgICAgIG5hbWU6IHRoaXMucHJvZmlsZXMuZGlzcGxheU5hbWUocHJvZmlsZSwgJ0p1Z2Fkb3InKSxcbiAgICAgIGF2YXRhcjogcHJvZmlsZT8uYXZhdGFyID8/ICfimZ/vuI8nLFxuICAgICAgY29sb3I6IHByb2ZpbGU/LmNvbG9yID8/ICcjZmYwMGIyJyxcbiAgICAgIGpvaW5lZEF0LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHdpdGhVcGRhdGVkQXQoc3RhdGU6IENoZXNzaW1hbHNHYW1lU3RhdGUsIGRhdGUgPSBuZXcgRGF0ZSgpKTogQ2hlc3NpbWFsc0dhbWVTdGF0ZSB7XG4gICAgaWYgKCFzdGF0ZS5vbmxpbmUpIHJldHVybiBzdGF0ZTtcbiAgICByZXR1cm4geyAuLi5zdGF0ZSwgb25saW5lOiB7IC4uLnN0YXRlLm9ubGluZSwgdXBkYXRlZEF0OiBkYXRlLnRvSVNPU3RyaW5nKCkgfSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVIaXN0b3J5RW50cnkoc3RhdGU6IENoZXNzaW1hbHNHYW1lU3RhdGUsIHVpZDogc3RyaW5nKTogQ2hlc3NpbWFsc0hpc3RvcnlFbnRyeSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFzdGF0ZS5vbmxpbmUpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBzaWRlID0gdGhpcy5wYXJ0aWNpcGFudFNpZGUoc3RhdGUsIHVpZCk7XG4gICAgY29uc3QgaXNMb2JieUhvc3QgPSBzdGF0ZS5vbmxpbmUubG9iYnk/LnVpZCA9PT0gdWlkO1xuICAgIGNvbnN0IGlzUGVuZGluZ0d1ZXN0ID0gc3RhdGUub25saW5lLnBlbmRpbmdHdWVzdD8udWlkID09PSB1aWQ7XG4gICAgaWYgKCFzaWRlICYmICFpc0xvYmJ5SG9zdCAmJiAhaXNQZW5kaW5nR3Vlc3QpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBvcHBvbmVudCA9IHNpZGVcbiAgICAgID8gc2lkZSA9PT0gJ3doaXRlJ1xuICAgICAgICA/IHN0YXRlLm9ubGluZS5wYXJ0aWNpcGFudHM/LmJsYWNrXG4gICAgICAgIDogc3RhdGUub25saW5lLnBhcnRpY2lwYW50cz8ud2hpdGVcbiAgICAgIDogaXNMb2JieUhvc3RcbiAgICAgICAgPyBzdGF0ZS5vbmxpbmUucGVuZGluZ0d1ZXN0XG4gICAgICAgIDogc3RhdGUub25saW5lLmxvYmJ5O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGdhbWVJZDogc3RhdGUuaWQsXG4gICAgICBtb2RlOiAnb25saW5lJyxcbiAgICAgIGJvYXJkU2l6ZTogc3RhdGUuYm9hcmRTaXplLFxuICAgICAgc3RhdHVzOiBzdGF0ZS5zdGF0dXMsXG4gICAgICBvdXRjb21lOiB0aGlzLmhpc3RvcnlPdXRjb21lKHN0YXRlLCB1aWQsIHNpZGUsIGlzUGVuZGluZ0d1ZXN0KSxcbiAgICAgIHNpZGUsXG4gICAgICBvcHBvbmVudFVpZDogb3Bwb25lbnQ/LnVpZCxcbiAgICAgIG9wcG9uZW50TmFtZTogb3Bwb25lbnQ/Lm5hbWUsXG4gICAgICB3aW5uZXI6IHN0YXRlLndpbm5lcixcbiAgICAgIHdpbm5lclJlYXNvbjogc3RhdGUud2lubmVyUmVhc29uLFxuICAgICAgbW92ZUNvdW50OiBzdGF0ZS5tb3ZlQ291bnQsXG4gICAgICByb3VuZDogc3RhdGUub25saW5lLnJvdW5kLFxuICAgICAgY3JlYXRlZEF0OiBzdGF0ZS5vbmxpbmUuY3JlYXRlZEF0LFxuICAgICAgdXBkYXRlZEF0OiBzdGF0ZS5vbmxpbmUudXBkYXRlZEF0LFxuICAgICAgZmluaXNoZWRBdDogc3RhdGUuc3RhdHVzID09PSAnZmluaXNoZWQnID8gc3RhdGUub25saW5lLnVwZGF0ZWRBdCA6IHVuZGVmaW5lZCxcbiAgICAgIGV4cGlyZXNBdDogc3RhdGUub25saW5lLmV4cGlyZXNBdCxcbiAgICAgIHJlbWF0Y2hPZjogc3RhdGUub25saW5lLnJlbWF0Y2hPZixcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSB3aXRob3V0VW5kZWZpbmVkPFQgZXh0ZW5kcyBvYmplY3Q+KHZhbHVlOiBUKTogUGFydGlhbDxUPiB7XG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5maWx0ZXIoKFssIGVudHJ5XSkgPT4gZW50cnkgIT09IHVuZGVmaW5lZCksXG4gICAgKSBhcyBQYXJ0aWFsPFQ+O1xuICB9XG5cbiAgcHJpdmF0ZSBoaXN0b3J5T3V0Y29tZShcbiAgICBzdGF0ZTogQ2hlc3NpbWFsc0dhbWVTdGF0ZSxcbiAgICB1aWQ6IHN0cmluZyxcbiAgICBzaWRlOiBDaGVzc2ltYWxzUGxheWVyQ29sb3IgfCB1bmRlZmluZWQsXG4gICAgaXNQZW5kaW5nR3Vlc3Q6IGJvb2xlYW4sXG4gICk6IENoZXNzaW1hbHNIaXN0b3J5RW50cnlbJ291dGNvbWUnXSB7XG4gICAgaWYgKHN0YXRlLnN0YXR1cyA9PT0gJ2ZpbmlzaGVkJyAmJiBzaWRlICYmIHN0YXRlLndpbm5lcikgcmV0dXJuIHN0YXRlLndpbm5lciA9PT0gc2lkZSA/ICd3b24nIDogJ2xvc3QnO1xuICAgIGlmIChzdGF0ZS5zdGF0dXMgPT09ICdpbl9wcm9ncmVzcycpIHJldHVybiAnaW5fcHJvZ3Jlc3MnO1xuICAgIGlmIChpc1BlbmRpbmdHdWVzdCkgcmV0dXJuICdwZW5kaW5nJztcbiAgICByZXR1cm4gJ3dhaXRpbmcnO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3NlcnROb3RFeHBpcmVkKHN0YXRlOiBDaGVzc2ltYWxzR2FtZVN0YXRlKTogdm9pZCB7XG4gICAgaWYgKChzdGF0ZS5vbmxpbmU/LmV4cGlyZXNBdE1zID8/IDApIDwgRGF0ZS5ub3coKSkgdGhyb3cgbmV3IEVycm9yKCdDSEVTU0lNQUxTX0dBTUVfRVhQSVJFRCcpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVHYW1lSWQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBhbHBoYWJldCA9ICdBQkNERUZHSEpLTE1OUFFSU1RVVldYWVoyMzQ1Njc4OSc7XG4gICAgY29uc3QgbWFrZVBhcnQgPSAoKTogc3RyaW5nID0+IEFycmF5LmZyb20oeyBsZW5ndGg6IDQgfSwgKCkgPT4gYWxwaGFiZXRbdGhpcy5yYW5kb21JbmRleChhbHBoYWJldC5sZW5ndGgpXSkuam9pbignJyk7XG4gICAgcmV0dXJuIGAke21ha2VQYXJ0KCl9LSR7bWFrZVBhcnQoKX1gO1xuICB9XG5cbiAgcHJpdmF0ZSByYW5kb21JbmRleChtYXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IG5ldyBVaW50MzJBcnJheSgxKTtcbiAgICAgIGNyeXB0by5nZXRSYW5kb21WYWx1ZXModmFsdWVzKTtcbiAgICAgIHJldHVybiB2YWx1ZXNbMF0gJSBtYXg7XG4gICAgfVxuICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBtYXgpO1xuICB9XG5cbn1cbiJdfQ==