@cloudbase/realtime 2.0.2-alpha.0 → 2.5.0-beta.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.
@@ -47,7 +47,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
47
47
  };
48
48
  import { VirtualWebSocketClient } from './virtual-websocket-client';
49
49
  import { genRequestId } from './message';
50
- import { CLOSE_EVENT_CODE, CLOSE_EVENT_CODE_INFO, getWSCloseError } from './ws-event';
50
+ import { CloseEventCode, CLOSE_EVENT_CODE_INFO, getWSCloseError, } from './ws-event';
51
51
  import { ERR_CODE, TimeoutError, RealtimeErrorMessageError, CloudSDKError } from './error';
52
52
  import { getWsClass, getRuntime } from './common';
53
53
  import { sleep } from './utils';
@@ -55,7 +55,7 @@ var WS_READY_STATE = {
55
55
  CONNECTING: 0,
56
56
  OPEN: 1,
57
57
  CLOSING: 2,
58
- CLOSED: 3
58
+ CLOSED: 3,
59
59
  };
60
60
  var MAX_RTT_OBSERVED = 3;
61
61
  var DEFAULT_EXPECTED_EVENT_WAIT_TIME = 5000;
@@ -68,401 +68,400 @@ var DEFAULT_LOGIN_TIMEOUT = 5000;
68
68
  var RealtimeWebSocketClient = (function () {
69
69
  function RealtimeWebSocketClient(options) {
70
70
  var _this = this;
71
- this._virtualWSClient = new Set();
72
- this._queryIdClientMap = new Map();
73
- this._watchIdClientMap = new Map();
74
- this._pingFailed = 0;
75
- this._pongMissed = 0;
76
- this._logins = new Map();
77
- this._wsReadySubsribers = [];
78
- this._wsResponseWait = new Map();
79
- this._rttObserved = [];
71
+ this.virtualWSClient = new Set();
72
+ this.queryIdClientMap = new Map();
73
+ this.watchIdClientMap = new Map();
74
+ this.pingFailed = 0;
75
+ this.pongMissed = 0;
76
+ this.logins = new Map();
77
+ this.wsReadySubsribers = [];
78
+ this.wsResponseWait = new Map();
79
+ this.rttObserved = [];
80
80
  this.send = function (opts) { return __awaiter(_this, void 0, void 0, function () {
81
81
  var _this = this;
82
82
  return __generator(this, function (_a) {
83
- return [2, new Promise(function (_resolve, _reject) { return __awaiter(_this, void 0, void 0, function () {
84
- var timeoutId, _hasResolved, _hasRejected, resolve, reject, err_1, e_1;
85
- var _this = this;
86
- return __generator(this, function (_a) {
87
- switch (_a.label) {
88
- case 0:
89
- _hasResolved = false;
90
- _hasRejected = false;
91
- resolve = function (value) {
92
- _hasResolved = true;
93
- timeoutId && clearTimeout(timeoutId);
94
- _resolve(value);
95
- };
96
- reject = function (error) {
97
- _hasRejected = true;
98
- timeoutId && clearTimeout(timeoutId);
99
- _reject(error);
100
- };
101
- if (opts.timeout) {
102
- timeoutId = setTimeout(function () { return __awaiter(_this, void 0, void 0, function () {
103
- return __generator(this, function (_a) {
104
- switch (_a.label) {
105
- case 0:
106
- if (!(!_hasResolved || !_hasRejected)) return [3, 2];
107
- return [4, sleep(0)];
108
- case 1:
109
- _a.sent();
110
- if (!_hasResolved || !_hasRejected) {
111
- reject(new TimeoutError('wsclient.send timedout'));
83
+ return [2, new Promise(function (_resolve, _reject) {
84
+ void (function () { return __awaiter(_this, void 0, void 0, function () {
85
+ var timeoutId, hasResolved, hasRejected, resolve, reject, respWaitSpec, err_1, e_1;
86
+ var _this = this;
87
+ return __generator(this, function (_a) {
88
+ switch (_a.label) {
89
+ case 0:
90
+ hasResolved = false;
91
+ hasRejected = false;
92
+ resolve = function (value) {
93
+ hasResolved = true;
94
+ timeoutId && clearTimeout(timeoutId);
95
+ _resolve(value);
96
+ };
97
+ reject = function (error) {
98
+ hasRejected = true;
99
+ timeoutId && clearTimeout(timeoutId);
100
+ _reject(error);
101
+ };
102
+ if (opts.timeout) {
103
+ timeoutId = setTimeout(function () {
104
+ (function () { return __awaiter(_this, void 0, void 0, function () {
105
+ return __generator(this, function (_a) {
106
+ switch (_a.label) {
107
+ case 0:
108
+ if (!(!hasResolved || !hasRejected)) return [3, 2];
109
+ return [4, sleep(0)];
110
+ case 1:
111
+ _a.sent();
112
+ if (!hasResolved || !hasRejected) {
113
+ reject(new TimeoutError('wsclient.send timedout'));
114
+ }
115
+ _a.label = 2;
116
+ case 2: return [2];
112
117
  }
113
- _a.label = 2;
114
- case 2: return [2];
115
- }
116
- });
117
- }); }, opts.timeout);
118
- }
119
- _a.label = 1;
120
- case 1:
121
- _a.trys.push([1, 8, , 9]);
122
- if (!this._wsInitPromise) return [3, 3];
123
- return [4, this._wsInitPromise];
124
- case 2:
125
- _a.sent();
126
- _a.label = 3;
127
- case 3:
128
- if (!this._ws) {
129
- reject(new Error('invalid state: ws connection not exists, can not send message'));
130
- return [2];
131
- }
132
- if (this._ws.readyState !== WS_READY_STATE.OPEN) {
133
- reject(new Error("ws readyState invalid: " + this._ws.readyState + ", can not send message"));
134
- return [2];
135
- }
136
- if (opts.waitResponse) {
137
- this._wsResponseWait.set(opts.msg.requestId, {
138
- resolve: resolve,
139
- reject: reject,
140
- skipOnMessage: opts.skipOnMessage
141
- });
142
- }
143
- _a.label = 4;
144
- case 4:
145
- _a.trys.push([4, 6, , 7]);
146
- return [4, this._ws.send(JSON.stringify(opts.msg))];
147
- case 5:
148
- _a.sent();
149
- if (!opts.waitResponse) {
150
- resolve();
151
- }
152
- return [3, 7];
153
- case 6:
154
- err_1 = _a.sent();
155
- if (err_1) {
156
- reject(err_1);
118
+ });
119
+ }); })();
120
+ }, opts.timeout);
121
+ }
122
+ _a.label = 1;
123
+ case 1:
124
+ _a.trys.push([1, 8, , 9]);
125
+ if (!(this.wsInitPromise !== undefined || this.wsInitPromise !== null)) return [3, 3];
126
+ return [4, this.wsInitPromise];
127
+ case 2:
128
+ _a.sent();
129
+ _a.label = 3;
130
+ case 3:
131
+ if (!this.ws) {
132
+ reject(new Error('invalid state: ws connection not exists, can not send message'));
133
+ return [2];
134
+ }
135
+ if (this.ws.readyState !== WS_READY_STATE.OPEN) {
136
+ reject(new Error("ws readyState invalid: " + this.ws.readyState + ", can not send message"));
137
+ return [2];
138
+ }
157
139
  if (opts.waitResponse) {
158
- this._wsResponseWait.delete(opts.msg.requestId);
140
+ respWaitSpec = {
141
+ resolve: resolve,
142
+ reject: reject,
143
+ skipOnMessage: opts.skipOnMessage,
144
+ };
145
+ this.wsResponseWait.set(opts.msg.requestId, respWaitSpec);
159
146
  }
160
- }
161
- return [3, 7];
162
- case 7: return [3, 9];
163
- case 8:
164
- e_1 = _a.sent();
165
- reject(e_1);
166
- return [3, 9];
167
- case 9: return [2];
168
- }
169
- });
170
- }); })];
147
+ _a.label = 4;
148
+ case 4:
149
+ _a.trys.push([4, 6, , 7]);
150
+ return [4, this.ws.send(JSON.stringify(opts.msg))];
151
+ case 5:
152
+ _a.sent();
153
+ if (!opts.waitResponse) {
154
+ resolve(void 0);
155
+ }
156
+ return [3, 7];
157
+ case 6:
158
+ err_1 = _a.sent();
159
+ if (err_1) {
160
+ reject(err_1);
161
+ if (opts.waitResponse) {
162
+ this.wsResponseWait.delete(opts.msg.requestId);
163
+ }
164
+ }
165
+ return [3, 7];
166
+ case 7: return [3, 9];
167
+ case 8:
168
+ e_1 = _a.sent();
169
+ reject(e_1);
170
+ return [3, 9];
171
+ case 9: return [2];
172
+ }
173
+ });
174
+ }); })();
175
+ })];
171
176
  });
172
177
  }); };
173
178
  this.closeAllClients = function (error) {
174
- _this._virtualWSClient.forEach(function (client) {
179
+ _this.virtualWSClient.forEach(function (client) {
175
180
  client.closeWithError(error);
176
181
  });
177
182
  };
178
183
  this.pauseClients = function (clients) {
179
- ;
180
- (clients || _this._virtualWSClient).forEach(function (client) {
184
+ (clients || _this.virtualWSClient).forEach(function (client) {
181
185
  client.pause();
182
186
  });
183
187
  };
184
188
  this.resumeClients = function (clients) {
185
- ;
186
- (clients || _this._virtualWSClient).forEach(function (client) {
189
+ (clients || _this.virtualWSClient).forEach(function (client) {
187
190
  client.resume();
188
191
  });
189
192
  };
190
193
  this.initWebSocketConnection = function (reconnect, availableRetries) {
191
- if (availableRetries === void 0) { availableRetries = _this._maxReconnect; }
194
+ if (availableRetries === void 0) { availableRetries = _this.maxReconnect; }
192
195
  return __awaiter(_this, void 0, void 0, function () {
193
196
  var e_2;
194
197
  var _this = this;
195
198
  return __generator(this, function (_a) {
196
199
  switch (_a.label) {
197
200
  case 0:
198
- if (reconnect && this._reconnectState) {
201
+ if (reconnect && this.reconnectState) {
199
202
  return [2];
200
203
  }
201
204
  if (reconnect) {
202
- this._reconnectState = true;
205
+ this.reconnectState = true;
203
206
  }
204
- if (this._wsInitPromise) {
205
- return [2, this._wsInitPromise];
207
+ if (this.wsInitPromise !== undefined && this.wsInitPromise !== null) {
208
+ return [2, this.wsInitPromise];
206
209
  }
207
210
  if (reconnect) {
208
211
  this.pauseClients();
209
212
  }
210
- this.close(CLOSE_EVENT_CODE.ReconnectWebSocket);
211
- this._wsInitPromise = new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
212
- var wsSign_1, e_3, isConnected;
213
- var _this = this;
214
- return __generator(this, function (_a) {
215
- switch (_a.label) {
216
- case 0:
217
- _a.trys.push([0, 6, , 11]);
218
- return [4, this.getWsSign()];
219
- case 1:
220
- wsSign_1 = _a.sent();
221
- return [4, new Promise(function (success) {
222
- var url = wsSign_1.wsUrl || 'wss://tcb-ws.tencentcloudapi.com';
223
- var wsClass = getWsClass();
224
- _this._ws = wsClass ? new wsClass(url) : new WebSocket(url);
225
- success();
226
- })];
227
- case 2:
228
- _a.sent();
229
- if (!this._ws.connect) return [3, 4];
230
- return [4, this._ws.connect()];
231
- case 3:
232
- _a.sent();
233
- _a.label = 4;
234
- case 4: return [4, this.initWebSocketEvent()];
235
- case 5:
236
- _a.sent();
237
- resolve();
238
- if (reconnect) {
239
- this.resumeClients();
240
- this._reconnectState = false;
241
- }
242
- return [3, 11];
243
- case 6:
244
- e_3 = _a.sent();
245
- console.error('[realtime] initWebSocketConnection connect fail', e_3);
246
- if (!(availableRetries > 0)) return [3, 9];
247
- isConnected = true;
248
- this._wsInitPromise = undefined;
249
- if (!isConnected) return [3, 8];
250
- return [4, sleep(this._reconnectInterval)];
251
- case 7:
252
- _a.sent();
253
- if (reconnect) {
254
- this._reconnectState = false;
255
- }
256
- _a.label = 8;
257
- case 8:
258
- resolve(this.initWebSocketConnection(reconnect, availableRetries - 1));
259
- return [3, 10];
260
- case 9:
261
- reject(e_3);
262
- if (reconnect) {
263
- this.closeAllClients(new CloudSDKError({
264
- errCode: ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_RECONNECT_WATCH_FAIL,
265
- errMsg: e_3
266
- }));
267
- }
268
- _a.label = 10;
269
- case 10: return [3, 11];
270
- case 11: return [2];
271
- }
272
- });
273
- }); });
213
+ this.close(CloseEventCode.ReconnectWebSocket);
214
+ this.wsInitPromise = new Promise(function (resolve, reject) {
215
+ (function () { return __awaiter(_this, void 0, void 0, function () {
216
+ var wsSign_1, e_3, isConnected;
217
+ var _this = this;
218
+ return __generator(this, function (_a) {
219
+ switch (_a.label) {
220
+ case 0:
221
+ _a.trys.push([0, 6, , 11]);
222
+ return [4, this.getWsSign()];
223
+ case 1:
224
+ wsSign_1 = _a.sent();
225
+ return [4, new Promise(function (success) {
226
+ var url = wsSign_1.wsUrl || 'wss://tcb-ws.tencentcloudapi.com';
227
+ var wsClass = getWsClass();
228
+ _this.ws = wsClass ? new wsClass(url) : new WebSocket(url);
229
+ success(void 0);
230
+ })];
231
+ case 2:
232
+ _a.sent();
233
+ if (!this.ws.connect) return [3, 4];
234
+ return [4, this.ws.connect()];
235
+ case 3:
236
+ _a.sent();
237
+ _a.label = 4;
238
+ case 4: return [4, this.initWebSocketEvent()];
239
+ case 5:
240
+ _a.sent();
241
+ resolve();
242
+ if (reconnect) {
243
+ this.resumeClients();
244
+ this.reconnectState = false;
245
+ }
246
+ return [3, 11];
247
+ case 6:
248
+ e_3 = _a.sent();
249
+ console.error('[realtime] initWebSocketConnection connect fail', e_3);
250
+ if (!(availableRetries > 0)) return [3, 9];
251
+ isConnected = true;
252
+ this.wsInitPromise = undefined;
253
+ if (!isConnected) return [3, 8];
254
+ return [4, sleep(this.reconnectInterval)];
255
+ case 7:
256
+ _a.sent();
257
+ if (reconnect) {
258
+ this.reconnectState = false;
259
+ }
260
+ _a.label = 8;
261
+ case 8:
262
+ resolve(this.initWebSocketConnection(reconnect, availableRetries - 1));
263
+ return [3, 10];
264
+ case 9:
265
+ reject(e_3);
266
+ if (reconnect) {
267
+ this.closeAllClients(new CloudSDKError({
268
+ errCode: ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_RECONNECT_WATCH_FAIL,
269
+ errMsg: e_3,
270
+ }));
271
+ }
272
+ _a.label = 10;
273
+ case 10: return [3, 11];
274
+ case 11: return [2];
275
+ }
276
+ });
277
+ }); })();
278
+ });
274
279
  _a.label = 1;
275
280
  case 1:
276
281
  _a.trys.push([1, 3, 4, 5]);
277
- return [4, this._wsInitPromise];
282
+ return [4, this.wsInitPromise];
278
283
  case 2:
279
284
  _a.sent();
280
- this._wsReadySubsribers.forEach(function (_a) {
285
+ this.wsReadySubsribers.forEach(function (_a) {
281
286
  var resolve = _a.resolve;
282
287
  return resolve();
283
288
  });
284
289
  return [3, 5];
285
290
  case 3:
286
291
  e_2 = _a.sent();
287
- this._wsReadySubsribers.forEach(function (_a) {
292
+ this.wsReadySubsribers.forEach(function (_a) {
288
293
  var reject = _a.reject;
289
294
  return reject();
290
295
  });
291
296
  return [3, 5];
292
297
  case 4:
293
- this._wsInitPromise = undefined;
294
- this._wsReadySubsribers = [];
298
+ this.wsInitPromise = undefined;
299
+ this.wsReadySubsribers = [];
295
300
  return [7];
296
301
  case 5: return [2];
297
302
  }
298
303
  });
299
304
  });
300
305
  };
301
- this.initWebSocketEvent = function () {
302
- return new Promise(function (resolve, reject) {
303
- if (!_this._ws) {
304
- throw new Error('can not initWebSocketEvent, ws not exists');
306
+ this.initWebSocketEvent = function () { return new Promise(function (resolve, reject) {
307
+ if (!_this.ws) {
308
+ throw new Error('can not initWebSocketEvent, ws not exists');
309
+ }
310
+ var wsOpened = false;
311
+ _this.ws.onopen = function (event) {
312
+ console.warn('[realtime] ws event: open', event);
313
+ wsOpened = true;
314
+ resolve();
315
+ };
316
+ _this.ws.onerror = function (event) {
317
+ _this.logins = new Map();
318
+ if (!wsOpened) {
319
+ console.error('[realtime] ws open failed with ws event: error', event);
320
+ reject(event);
305
321
  }
306
- var wsOpened = false;
307
- _this._ws.onopen = function (event) {
308
- console.warn('[realtime] ws event: open', event);
309
- wsOpened = true;
310
- resolve();
311
- };
312
- _this._ws.onerror = function (event) {
313
- _this._logins = new Map();
314
- if (!wsOpened) {
315
- console.error('[realtime] ws open failed with ws event: error', event);
316
- reject(event);
322
+ else {
323
+ console.error('[realtime] ws event: error', event);
324
+ _this.clearHeartbeat();
325
+ _this.virtualWSClient.forEach(function (client) { return client.closeWithError(new CloudSDKError({
326
+ errCode: ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_WEBSOCKET_CONNECTION_ERROR,
327
+ errMsg: event,
328
+ })); });
329
+ }
330
+ };
331
+ _this.ws.onclose = function (closeEvent) {
332
+ console.warn('[realtime] ws event: close', closeEvent);
333
+ _this.logins = new Map();
334
+ _this.clearHeartbeat();
335
+ switch (closeEvent.code) {
336
+ case CloseEventCode.ReconnectWebSocket: {
337
+ break;
317
338
  }
318
- else {
319
- console.error('[realtime] ws event: error', event);
320
- _this.clearHeartbeat();
321
- _this._virtualWSClient.forEach(function (client) {
322
- return client.closeWithError(new CloudSDKError({
323
- errCode: ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_WEBSOCKET_CONNECTION_ERROR,
324
- errMsg: event
325
- }));
326
- });
339
+ case CloseEventCode.NoRealtimeListeners: {
340
+ break;
327
341
  }
328
- };
329
- _this._ws.onclose = function (closeEvent) {
330
- console.warn('[realtime] ws event: close', closeEvent);
331
- _this._logins = new Map();
332
- _this.clearHeartbeat();
333
- switch (closeEvent.code) {
334
- case CLOSE_EVENT_CODE.ReconnectWebSocket: {
335
- break;
342
+ case CloseEventCode.HeartbeatPingError:
343
+ case CloseEventCode.HeartbeatPongTimeoutError:
344
+ case CloseEventCode.NormalClosure:
345
+ case CloseEventCode.AbnormalClosure: {
346
+ if (_this.maxReconnect > 0) {
347
+ _this.initWebSocketConnection(true, _this.maxReconnect);
336
348
  }
337
- case CLOSE_EVENT_CODE.NoRealtimeListeners: {
338
- break;
349
+ else {
350
+ _this.closeAllClients(getWSCloseError(closeEvent.code));
339
351
  }
340
- case CLOSE_EVENT_CODE.HeartbeatPingError:
341
- case CLOSE_EVENT_CODE.HeartbeatPongTimeoutError:
342
- case CLOSE_EVENT_CODE.NormalClosure:
343
- case CLOSE_EVENT_CODE.AbnormalClosure: {
344
- if (_this._maxReconnect > 0) {
345
- _this.initWebSocketConnection(true, _this._maxReconnect);
346
- }
347
- else {
348
- _this.closeAllClients(getWSCloseError(closeEvent.code));
349
- }
350
- break;
352
+ break;
353
+ }
354
+ case CloseEventCode.NoAuthentication: {
355
+ _this.closeAllClients(getWSCloseError(closeEvent.code, closeEvent.reason));
356
+ break;
357
+ }
358
+ default: {
359
+ if (_this.maxReconnect > 0) {
360
+ _this.initWebSocketConnection(true, _this.maxReconnect);
351
361
  }
352
- case CLOSE_EVENT_CODE.NoAuthentication: {
353
- _this.closeAllClients(getWSCloseError(closeEvent.code, closeEvent.reason));
354
- break;
362
+ else {
363
+ _this.closeAllClients(getWSCloseError(closeEvent.code));
355
364
  }
356
- default: {
357
- if (_this._maxReconnect > 0) {
358
- _this.initWebSocketConnection(true, _this._maxReconnect);
359
- }
360
- else {
361
- _this.closeAllClients(getWSCloseError(closeEvent.code));
362
- }
365
+ }
366
+ }
367
+ };
368
+ _this.ws.onmessage = function (res) {
369
+ var rawMsg = res.data;
370
+ _this.heartbeat();
371
+ var msg;
372
+ try {
373
+ msg = JSON.parse(rawMsg);
374
+ }
375
+ catch (e) {
376
+ throw new Error("[realtime] onMessage parse res.data error: " + e);
377
+ }
378
+ if (msg.msgType === 'ERROR') {
379
+ var virtualWatch_1 = null;
380
+ _this.virtualWSClient.forEach(function (item) {
381
+ if (item.watchId === msg.watchId) {
382
+ virtualWatch_1 = item;
363
383
  }
384
+ });
385
+ if (virtualWatch_1) {
386
+ virtualWatch_1.listener.onError(msg);
364
387
  }
365
- };
366
- _this._ws.onmessage = function (res) {
367
- var rawMsg = res.data;
368
- _this.heartbeat();
369
- var msg;
388
+ }
389
+ var responseWaitSpec = _this.wsResponseWait.get(msg.requestId);
390
+ if (responseWaitSpec) {
370
391
  try {
371
- msg = JSON.parse(rawMsg);
392
+ if (msg.msgType === 'ERROR') {
393
+ responseWaitSpec.reject(new RealtimeErrorMessageError(msg));
394
+ }
395
+ else {
396
+ responseWaitSpec.resolve(msg);
397
+ }
372
398
  }
373
399
  catch (e) {
374
- throw new Error("[realtime] onMessage parse res.data error: " + e);
400
+ console.error('ws onMessage responseWaitSpec.resolve(msg) errored:', e);
375
401
  }
376
- if (msg.msgType === 'ERROR') {
377
- var virtualWatch_1 = null;
378
- _this._virtualWSClient.forEach(function (item) {
379
- if (item.watchId === msg.watchId) {
380
- virtualWatch_1 = item;
381
- }
382
- });
383
- if (virtualWatch_1) {
384
- virtualWatch_1.listener.onError(msg);
385
- }
402
+ finally {
403
+ _this.wsResponseWait.delete(msg.requestId);
386
404
  }
387
- var responseWaitSpec = _this._wsResponseWait.get(msg.requestId);
388
- if (responseWaitSpec) {
389
- try {
390
- if (msg.msgType === 'ERROR') {
391
- responseWaitSpec.reject(new RealtimeErrorMessageError(msg));
392
- }
393
- else {
394
- responseWaitSpec.resolve(msg);
395
- }
396
- }
397
- catch (e) {
398
- console.error('ws onMessage responseWaitSpec.resolve(msg) errored:', e);
399
- }
400
- finally {
401
- _this._wsResponseWait.delete(msg.requestId);
402
- }
403
- if (responseWaitSpec.skipOnMessage) {
405
+ if (responseWaitSpec.skipOnMessage) {
406
+ return;
407
+ }
408
+ }
409
+ if (msg.msgType === 'PONG') {
410
+ if (_this.lastPingSendTS) {
411
+ var rtt = Date.now() - _this.lastPingSendTS;
412
+ if (rtt > DEFAULT_UNTRUSTED_RTT_THRESHOLD) {
413
+ console.warn("[realtime] untrusted rtt observed: " + rtt);
404
414
  return;
405
415
  }
416
+ if (_this.rttObserved.length >= MAX_RTT_OBSERVED) {
417
+ _this.rttObserved.splice(0, _this.rttObserved.length - MAX_RTT_OBSERVED + 1);
418
+ }
419
+ _this.rttObserved.push(rtt);
406
420
  }
407
- if (msg.msgType === 'PONG') {
408
- if (_this._lastPingSendTS) {
409
- var rtt = Date.now() - _this._lastPingSendTS;
410
- if (rtt > DEFAULT_UNTRUSTED_RTT_THRESHOLD) {
411
- console.warn("[realtime] untrusted rtt observed: " + rtt);
412
- return;
413
- }
414
- if (_this._rttObserved.length >= MAX_RTT_OBSERVED) {
415
- _this._rttObserved.splice(0, _this._rttObserved.length - MAX_RTT_OBSERVED + 1);
421
+ return;
422
+ }
423
+ var client = msg.watchId && _this.watchIdClientMap.get(msg.watchId);
424
+ if (client) {
425
+ client.onMessage(msg);
426
+ }
427
+ else {
428
+ console.error("[realtime] no realtime listener found responsible for watchId " + msg.watchId + ": ", msg);
429
+ switch (msg.msgType) {
430
+ case 'INIT_EVENT':
431
+ case 'NEXT_EVENT':
432
+ case 'CHECK_EVENT': {
433
+ client = _this.queryIdClientMap.get(msg.msgData.queryID);
434
+ if (client) {
435
+ client.onMessage(msg);
416
436
  }
417
- _this._rttObserved.push(rtt);
437
+ break;
418
438
  }
419
- return;
420
- }
421
- var client = msg.watchId && _this._watchIdClientMap.get(msg.watchId);
422
- if (client) {
423
- client.onMessage(msg);
424
- }
425
- else {
426
- console.error("[realtime] no realtime listener found responsible for watchId " + msg.watchId + ": ", msg);
427
- switch (msg.msgType) {
428
- case 'INIT_EVENT':
429
- case 'NEXT_EVENT':
430
- case 'CHECK_EVENT': {
431
- client = _this._queryIdClientMap.get(msg.msgData.queryID);
432
- if (client) {
433
- client.onMessage(msg);
434
- }
439
+ default: {
440
+ for (var _i = 0, _a = Array.from(_this.watchIdClientMap.entries()); _i < _a.length; _i++) {
441
+ var _b = _a[_i], client_1 = _b[1];
442
+ client_1.onMessage(msg);
435
443
  break;
436
444
  }
437
- default: {
438
- for (var _i = 0, _a = Array.from(_this._watchIdClientMap.entries()); _i < _a.length; _i++) {
439
- var _b = _a[_i], client_1 = _b[1];
440
- client_1.onMessage(msg);
441
- break;
442
- }
443
- }
444
445
  }
445
446
  }
446
- };
447
- _this.heartbeat();
448
- });
449
- };
450
- this.isWSConnected = function () {
451
- return Boolean(_this._ws && _this._ws.readyState === WS_READY_STATE.OPEN);
452
- };
447
+ }
448
+ };
449
+ _this.heartbeat();
450
+ }); };
451
+ this.isWSConnected = function () { return Boolean(_this.ws && _this.ws.readyState === WS_READY_STATE.OPEN); };
453
452
  this.onceWSConnected = function () { return __awaiter(_this, void 0, void 0, function () {
454
453
  var _this = this;
455
454
  return __generator(this, function (_a) {
456
455
  if (this.isWSConnected()) {
457
456
  return [2];
458
457
  }
459
- if (this._wsInitPromise) {
460
- return [2, this._wsInitPromise];
458
+ if (this.wsInitPromise !== null && this.wsInitPromise !== undefined) {
459
+ return [2, this.wsInitPromise];
461
460
  }
462
461
  return [2, new Promise(function (resolve, reject) {
463
- _this._wsReadySubsribers.push({
462
+ _this.wsReadySubsribers.push({
464
463
  resolve: resolve,
465
- reject: reject
464
+ reject: reject,
466
465
  });
467
466
  })];
468
467
  });
@@ -475,76 +474,78 @@ var RealtimeWebSocketClient = (function () {
475
474
  case 0:
476
475
  if (!refresh) {
477
476
  if (envId) {
478
- loginInfo_1 = this._logins.get(envId);
477
+ loginInfo_1 = this.logins.get(envId);
479
478
  if (loginInfo_1) {
480
479
  if (loginInfo_1.loggedIn && loginInfo_1.loginResult) {
481
480
  return [2, loginInfo_1.loginResult];
482
481
  }
483
- else if (loginInfo_1.loggingInPromise) {
482
+ if (loginInfo_1.loggingInPromise !== null && loginInfo_1.loggingInPromise !== undefined) {
484
483
  return [2, loginInfo_1.loggingInPromise];
485
484
  }
486
485
  }
487
486
  }
488
487
  else {
489
- emptyEnvLoginInfo = this._logins.get('');
490
- if (emptyEnvLoginInfo === null || emptyEnvLoginInfo === void 0 ? void 0 : emptyEnvLoginInfo.loggingInPromise) {
488
+ emptyEnvLoginInfo = this.logins.get('');
489
+ if ((emptyEnvLoginInfo === null || emptyEnvLoginInfo === void 0 ? void 0 : emptyEnvLoginInfo.loggingInPromise) !== null && (emptyEnvLoginInfo === null || emptyEnvLoginInfo === void 0 ? void 0 : emptyEnvLoginInfo.loggingInPromise) !== undefined) {
491
490
  return [2, emptyEnvLoginInfo.loggingInPromise];
492
491
  }
493
492
  }
494
493
  }
495
- promise = new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
496
- var wsSign, msgData, loginMsg, loginResMsg, e_5;
497
- return __generator(this, function (_a) {
498
- switch (_a.label) {
499
- case 0:
500
- _a.trys.push([0, 3, , 4]);
501
- return [4, this.getWsSign()];
502
- case 1:
503
- wsSign = _a.sent();
504
- msgData = {
505
- envId: wsSign.envId || '',
506
- accessToken: '',
507
- referrer: 'web',
508
- sdkVersion: '',
509
- dataVersion: ''
510
- };
511
- loginMsg = {
512
- watchId: undefined,
513
- requestId: genRequestId(),
514
- msgType: 'LOGIN',
515
- msgData: msgData,
516
- exMsgData: {
517
- runtime: getRuntime(),
518
- signStr: wsSign.signStr,
519
- secretVersion: wsSign.secretVersion
494
+ promise = new Promise(function (resolve, reject) {
495
+ (function () { return __awaiter(_this, void 0, void 0, function () {
496
+ var wsSign, msgData, loginMsg, loginResMsg, e_5;
497
+ return __generator(this, function (_a) {
498
+ switch (_a.label) {
499
+ case 0:
500
+ _a.trys.push([0, 3, , 4]);
501
+ return [4, this.getWsSign()];
502
+ case 1:
503
+ wsSign = _a.sent();
504
+ msgData = {
505
+ envId: wsSign.envId || '',
506
+ accessToken: '',
507
+ referrer: 'web',
508
+ sdkVersion: '',
509
+ dataVersion: '',
510
+ };
511
+ loginMsg = {
512
+ watchId: undefined,
513
+ requestId: genRequestId(),
514
+ msgType: 'LOGIN',
515
+ msgData: msgData,
516
+ exMsgData: {
517
+ runtime: getRuntime(),
518
+ signStr: wsSign.signStr,
519
+ secretVersion: wsSign.secretVersion,
520
+ },
521
+ };
522
+ return [4, this.send({
523
+ msg: loginMsg,
524
+ waitResponse: true,
525
+ skipOnMessage: true,
526
+ timeout: DEFAULT_LOGIN_TIMEOUT,
527
+ })];
528
+ case 2:
529
+ loginResMsg = _a.sent();
530
+ if (!loginResMsg.msgData.code) {
531
+ resolve({
532
+ envId: wsSign.envId,
533
+ });
520
534
  }
521
- };
522
- return [4, this.send({
523
- msg: loginMsg,
524
- waitResponse: true,
525
- skipOnMessage: true,
526
- timeout: DEFAULT_LOGIN_TIMEOUT
527
- })];
528
- case 2:
529
- loginResMsg = _a.sent();
530
- if (!loginResMsg.msgData.code) {
531
- resolve({
532
- envId: wsSign.envId
533
- });
534
- }
535
- else {
536
- reject(new Error(loginResMsg.msgData.code + " " + loginResMsg.msgData.message));
537
- }
538
- return [3, 4];
539
- case 3:
540
- e_5 = _a.sent();
541
- reject(e_5);
542
- return [3, 4];
543
- case 4: return [2];
544
- }
545
- });
546
- }); });
547
- loginInfo = envId && this._logins.get(envId);
535
+ else {
536
+ reject(new Error(loginResMsg.msgData.code + " " + loginResMsg.msgData.message));
537
+ }
538
+ return [3, 4];
539
+ case 3:
540
+ e_5 = _a.sent();
541
+ reject(e_5);
542
+ return [3, 4];
543
+ case 4: return [2];
544
+ }
545
+ });
546
+ }); })();
547
+ });
548
+ loginInfo = envId && this.logins.get(envId);
548
549
  loginStartTS = Date.now();
549
550
  if (loginInfo) {
550
551
  loginInfo.loggedIn = false;
@@ -555,9 +556,9 @@ var RealtimeWebSocketClient = (function () {
555
556
  loginInfo = {
556
557
  loggedIn: false,
557
558
  loggingInPromise: promise,
558
- loginStartTS: loginStartTS
559
+ loginStartTS: loginStartTS,
559
560
  };
560
- this._logins.set(envId || '', loginInfo);
561
+ this.logins.set(envId || '', loginInfo);
561
562
  }
562
563
  _a.label = 1;
563
564
  case 1:
@@ -565,26 +566,24 @@ var RealtimeWebSocketClient = (function () {
565
566
  return [4, promise];
566
567
  case 2:
567
568
  loginResult = _a.sent();
568
- curLoginInfo = envId && this._logins.get(envId);
569
- if (curLoginInfo &&
570
- curLoginInfo === loginInfo &&
571
- curLoginInfo.loginStartTS === loginStartTS) {
569
+ curLoginInfo = envId && this.logins.get(envId);
570
+ if (curLoginInfo
571
+ && curLoginInfo === loginInfo
572
+ && curLoginInfo.loginStartTS === loginStartTS) {
572
573
  loginInfo.loggedIn = true;
573
574
  loginInfo.loggingInPromise = undefined;
574
575
  loginInfo.loginStartTS = undefined;
575
576
  loginInfo.loginResult = loginResult;
576
577
  return [2, loginResult];
577
578
  }
578
- else if (curLoginInfo) {
579
+ if (curLoginInfo) {
579
580
  if (curLoginInfo.loggedIn && curLoginInfo.loginResult) {
580
581
  return [2, curLoginInfo.loginResult];
581
582
  }
582
- else if (curLoginInfo.loggingInPromise) {
583
+ if (curLoginInfo.loggingInPromise !== null && curLoginInfo.loggingInPromise !== undefined) {
583
584
  return [2, curLoginInfo.loggingInPromise];
584
585
  }
585
- else {
586
- throw new Error('ws unexpected login info');
587
- }
586
+ throw new Error('ws unexpected login info');
588
587
  }
589
588
  else {
590
589
  throw new Error('ws login info reset');
@@ -606,11 +605,11 @@ var RealtimeWebSocketClient = (function () {
606
605
  return __generator(this, function (_b) {
607
606
  switch (_b.label) {
608
607
  case 0:
609
- if (this._wsSign && this._wsSign.expiredTs > Date.now()) {
610
- return [2, this._wsSign];
608
+ if (this.wsSign && this.wsSign.expiredTs > Date.now()) {
609
+ return [2, this.wsSign];
611
610
  }
612
611
  expiredTs = Date.now() + 60000;
613
- return [4, this._context.appConfig.request.send('auth.wsWebSign', { runtime: getRuntime() })];
612
+ return [4, this.context.appConfig.request.send('auth.wsWebSign', { runtime: getRuntime() })];
614
613
  case 1:
615
614
  res = _b.sent();
616
615
  if (res.code) {
@@ -623,23 +622,20 @@ var RealtimeWebSocketClient = (function () {
623
622
  wsUrl: wsUrl,
624
623
  secretVersion: secretVersion,
625
624
  envId: envId,
626
- expiredTs: expiredTs
625
+ expiredTs: expiredTs,
627
626
  }];
628
627
  }
629
- else {
630
- throw new Error('[tcb-js-sdk] 获取实时数据推送登录票据失败');
631
- }
632
- return [2];
628
+ throw new Error('[tcb-js-sdk] 获取实时数据推送登录票据失败');
633
629
  }
634
630
  });
635
631
  }); };
636
632
  this.getWaitExpectedTimeoutLength = function () {
637
- if (!_this._rttObserved.length) {
633
+ if (!_this.rttObserved.length) {
638
634
  return DEFAULT_EXPECTED_EVENT_WAIT_TIME;
639
635
  }
640
- return ((_this._rttObserved.reduce(function (acc, cur) { return acc + cur; }) /
641
- _this._rttObserved.length) *
642
- 1.5);
636
+ return ((_this.rttObserved.reduce(function (acc, cur) { return acc + cur; })
637
+ / _this.rttObserved.length)
638
+ * 1.5);
643
639
  };
644
640
  this.ping = function () { return __awaiter(_this, void 0, void 0, function () {
645
641
  var msg;
@@ -650,10 +646,10 @@ var RealtimeWebSocketClient = (function () {
650
646
  watchId: undefined,
651
647
  requestId: genRequestId(),
652
648
  msgType: 'PING',
653
- msgData: null
649
+ msgData: null,
654
650
  };
655
651
  return [4, this.send({
656
- msg: msg
652
+ msg: msg,
657
653
  })];
658
654
  case 1:
659
655
  _a.sent();
@@ -662,88 +658,89 @@ var RealtimeWebSocketClient = (function () {
662
658
  });
663
659
  }); };
664
660
  this.onWatchStart = function (client, queryID) {
665
- _this._queryIdClientMap.set(queryID, client);
661
+ _this.queryIdClientMap.set(queryID, client);
666
662
  };
667
663
  this.onWatchClose = function (client, queryID) {
668
664
  if (queryID) {
669
- _this._queryIdClientMap.delete(queryID);
665
+ _this.queryIdClientMap.delete(queryID);
670
666
  }
671
- _this._watchIdClientMap.delete(client.watchId);
672
- _this._virtualWSClient.delete(client);
673
- if (!_this._virtualWSClient.size) {
674
- _this.close(CLOSE_EVENT_CODE.NoRealtimeListeners);
667
+ _this.watchIdClientMap.delete(client.watchId);
668
+ _this.virtualWSClient.delete(client);
669
+ if (!_this.virtualWSClient.size) {
670
+ _this.close(CloseEventCode.NoRealtimeListeners);
675
671
  }
676
672
  };
677
- this._maxReconnect = options.maxReconnect || DEFAULT_MAX_RECONNECT;
678
- this._reconnectInterval =
679
- options.reconnectInterval || DEFAULT_WS_RECONNECT_INTERVAL;
680
- this._context = options.context;
673
+ this.maxReconnect = options.maxReconnect || DEFAULT_MAX_RECONNECT;
674
+ this.reconnectInterval = options.reconnectInterval || DEFAULT_WS_RECONNECT_INTERVAL;
675
+ this.context = options.context;
681
676
  }
682
677
  RealtimeWebSocketClient.prototype.clearHeartbeat = function () {
683
- this._pingTimeoutId && clearTimeout(this._pingTimeoutId);
684
- this._pongTimeoutId && clearTimeout(this._pongTimeoutId);
678
+ this.pingTimeoutId && clearTimeout(this.pingTimeoutId);
679
+ this.pongTimeoutId && clearTimeout(this.pongTimeoutId);
685
680
  };
686
681
  RealtimeWebSocketClient.prototype.close = function (code) {
687
682
  this.clearHeartbeat();
688
- if (this._ws) {
689
- this._ws.close(code, CLOSE_EVENT_CODE_INFO[code].name);
690
- this._ws = undefined;
683
+ if (this.ws) {
684
+ this.ws.close(code, CLOSE_EVENT_CODE_INFO[code].name);
685
+ this.ws = undefined;
691
686
  }
692
687
  };
693
688
  RealtimeWebSocketClient.prototype.watch = function (options) {
694
- if (!this._ws && !this._wsInitPromise) {
689
+ if (!this.ws && (this.wsInitPromise === undefined || this.wsInitPromise === null)) {
695
690
  this.initWebSocketConnection(false);
696
691
  }
697
692
  var virtualClient = new VirtualWebSocketClient(__assign(__assign({}, options), { send: this.send, login: this.webLogin, isWSConnected: this.isWSConnected, onceWSConnected: this.onceWSConnected, getWaitExpectedTimeoutLength: this.getWaitExpectedTimeoutLength, onWatchStart: this.onWatchStart, onWatchClose: this.onWatchClose, debug: true }));
698
- this._virtualWSClient.add(virtualClient);
699
- this._watchIdClientMap.set(virtualClient.watchId, virtualClient);
693
+ this.virtualWSClient.add(virtualClient);
694
+ this.watchIdClientMap.set(virtualClient.watchId, virtualClient);
700
695
  return virtualClient.listener;
701
696
  };
702
697
  RealtimeWebSocketClient.prototype.heartbeat = function (immediate) {
703
698
  var _this = this;
704
699
  this.clearHeartbeat();
705
- this._pingTimeoutId = setTimeout(function () { return __awaiter(_this, void 0, void 0, function () {
706
- var e_6;
707
- var _this = this;
708
- return __generator(this, function (_a) {
709
- switch (_a.label) {
710
- case 0:
711
- _a.trys.push([0, 2, , 3]);
712
- if (!this._ws || this._ws.readyState !== WS_READY_STATE.OPEN) {
713
- return [2];
714
- }
715
- this._lastPingSendTS = Date.now();
716
- return [4, this.ping()];
717
- case 1:
718
- _a.sent();
719
- this._pingFailed = 0;
720
- this._pongTimeoutId = setTimeout(function () {
721
- console.error('pong timed out');
722
- if (_this._pongMissed < DEFAULT_PONG_MISS_TOLERANCE) {
723
- _this._pongMissed++;
724
- _this.heartbeat(true);
700
+ this.pingTimeoutId = setTimeout(function () {
701
+ (function () { return __awaiter(_this, void 0, void 0, function () {
702
+ var e_6;
703
+ var _this = this;
704
+ return __generator(this, function (_a) {
705
+ switch (_a.label) {
706
+ case 0:
707
+ _a.trys.push([0, 2, , 3]);
708
+ if (!this.ws || this.ws.readyState !== WS_READY_STATE.OPEN) {
709
+ return [2];
710
+ }
711
+ this.lastPingSendTS = Date.now();
712
+ return [4, this.ping()];
713
+ case 1:
714
+ _a.sent();
715
+ this.pingFailed = 0;
716
+ this.pongTimeoutId = setTimeout(function () {
717
+ console.error('pong timed out');
718
+ if (_this.pongMissed < DEFAULT_PONG_MISS_TOLERANCE) {
719
+ _this.pongMissed += 1;
720
+ _this.heartbeat(true);
721
+ }
722
+ else {
723
+ _this.initWebSocketConnection(true);
724
+ }
725
+ }, this.context.appConfig.realtimePongWaitTimeout);
726
+ return [3, 3];
727
+ case 2:
728
+ e_6 = _a.sent();
729
+ if (this.pingFailed < DEFAULT_PING_FAIL_TOLERANCE) {
730
+ this.pingFailed += 1;
731
+ this.heartbeat();
725
732
  }
726
733
  else {
727
- _this.initWebSocketConnection(true);
734
+ this.close(CloseEventCode.HeartbeatPingError);
728
735
  }
729
- }, this._context.appConfig.realtimePongWaitTimeout);
730
- return [3, 3];
731
- case 2:
732
- e_6 = _a.sent();
733
- if (this._pingFailed < DEFAULT_PING_FAIL_TOLERANCE) {
734
- this._pingFailed++;
735
- this.heartbeat();
736
- }
737
- else {
738
- this.close(CLOSE_EVENT_CODE.HeartbeatPingError);
739
- }
740
- return [3, 3];
741
- case 3: return [2];
742
- }
743
- });
744
- }); }, immediate ? 0 : this._context.appConfig.realtimePingInterval);
736
+ return [3, 3];
737
+ case 3: return [2];
738
+ }
739
+ });
740
+ }); })();
741
+ }, immediate ? 0 : this.context.appConfig.realtimePingInterval);
745
742
  };
746
743
  return RealtimeWebSocketClient;
747
744
  }());
748
745
  export { RealtimeWebSocketClient };
749
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93ZWJzb2NrZXQtY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNEJBQTRCLENBQUE7QUFDbkUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQWN4QyxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQixlQUFlLEVBQ2hCLE1BQU0sWUFBWSxDQUFBO0FBRW5CLE9BQU8sRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLHlCQUF5QixFQUFDLGFBQWEsRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQUN6RixPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUNqRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBNEQvQixJQUFNLGNBQWMsR0FBRztJQUNyQixVQUFVLEVBQUUsQ0FBQztJQUNiLElBQUksRUFBRSxDQUFDO0lBQ1AsT0FBTyxFQUFFLENBQUM7SUFDVixNQUFNLEVBQUUsQ0FBQztDQUNWLENBQUE7QUFFRCxJQUFNLGdCQUFnQixHQUFHLENBQUMsQ0FBQTtBQUMxQixJQUFNLGdDQUFnQyxHQUFHLElBQUksQ0FBQTtBQUM3QyxJQUFNLCtCQUErQixHQUFHLEtBQUssQ0FBQTtBQUM3QyxJQUFNLHFCQUFxQixHQUFHLENBQUMsQ0FBQTtBQUMvQixJQUFNLDZCQUE2QixHQUFHLEtBQUssQ0FBQTtBQUUzQyxJQUFNLDJCQUEyQixHQUFHLENBQUMsQ0FBQTtBQUNyQyxJQUFNLDJCQUEyQixHQUFHLENBQUMsQ0FBQTtBQUNyQyxJQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQTtBQUVsQztJQStCRSxpQ0FBWSxPQUFtRDtRQUEvRCxpQkFN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QUFFLENBQUE7d0JBQ2pDLFdBQU0sSUFBSSxDQUFDLElBQUksRUFBRSxFQUFBOzt3QkFBakIsU0FBaUIsQ0FBQTt3QkFDakIsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUE7d0JBR3BCLElBQUksQ0FBQyxjQUFjLEdBQUcsVUFBVSxDQUFDOzRCQUMvQixPQUFPLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUE7NEJBQy9CLElBQUksS0FBSSxDQUFDLFdBQVcsR0FBRywyQkFBMkIsRUFBRTtnQ0FDbEQsS0FBSSxDQUFDLFdBQVcsRUFBRSxDQUFBO2dDQUNsQixLQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFBOzZCQUNyQjtpQ0FBTTtnQ0FFTCxLQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUE7NkJBQ25DO3dCQUNILENBQUMsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFBOzs7O3dCQUVuRCxJQUFJLElBQUksQ0FBQyxXQUFXLEdBQUcsMkJBQTJCLEVBQUU7NEJBQ2xELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQTs0QkFDbEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFBO3lCQUNqQjs2QkFBTTs0QkFDTCxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLENBQUE7eUJBQ2hEOzs7OzthQUVKLEVBQ0QsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLG9CQUFvQixDQUM3RCxDQUFBO0lBQ0gsQ0FBQztJQStCSCw4QkFBQztBQUFELENBQUMsQUEzM0JELElBMjNCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFZpcnR1YWxXZWJTb2NrZXRDbGllbnQgfSBmcm9tICcuL3ZpcnR1YWwtd2Vic29ja2V0LWNsaWVudCdcbmltcG9ydCB7IGdlblJlcXVlc3RJZCB9IGZyb20gJy4vbWVzc2FnZSdcbmltcG9ydCB7XG4gIElEYXRhYmFzZVNlcnZpY2VDb250ZXh0LFxufSBmcm9tICdAY2xvdWRiYXNlL3R5cGVzL2RhdGFiYXNlJ1xuaW1wb3J0IHtcbiAgSVdhdGNoT3B0aW9ucyxcbiAgREJSZWFsdGltZUxpc3RlbmVyLFxuICBJUmVxdWVzdE1lc3NhZ2UsXG4gIElSZXNwb25zZU1lc3NhZ2UsXG4gIElSZXF1ZXN0TWVzc2FnZVBpbmdNc2csXG4gIElSZXF1ZXN0TWVzc2FnZUxvZ2luTXNnLFxuICBJUmVzcG9uc2VNZXNzYWdlTG9naW5SZXNNc2csXG4gIElSZXF1ZXN0TWVzc2FnZUxvZ2luRGF0YVxufSBmcm9tICdAY2xvdWRiYXNlL3R5cGVzL3JlYWx0aW1lJ1xuaW1wb3J0IHtcbiAgQ0xPU0VfRVZFTlRfQ09ERSxcbiAgQ0xPU0VfRVZFTlRfQ09ERV9JTkZPLFxuICBnZXRXU0Nsb3NlRXJyb3Jcbn0gZnJvbSAnLi93cy1ldmVudCdcblxuaW1wb3J0IHsgRVJSX0NPREUsIFRpbWVvdXRFcnJvciwgUmVhbHRpbWVFcnJvck1lc3NhZ2VFcnJvcixDbG91ZFNES0Vycm9yIH0gZnJvbSAnLi9lcnJvcidcbmltcG9ydCB7IGdldFdzQ2xhc3MsIGdldFJ1bnRpbWUgfSBmcm9tICcuL2NvbW1vbidcbmltcG9ydCB7IHNsZWVwIH0gZnJvbSAnLi91dGlscydcblxuZXhwb3J0IGludGVyZmFjZSBJUmVhbHRpbWVXZWJTb2NrZXRDbGllbnRDb25zdHJ1Y3Rvck9wdGlvbnMge1xuICBtYXhSZWNvbm5lY3Q/OiBudW1iZXJcbiAgcmVjb25uZWN0SW50ZXJ2YWw/OiBudW1iZXJcbiAgY29udGV4dDogSURhdGFiYXNlU2VydmljZUNvbnRleHRcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2lnbmF0dXJlIHtcbiAgZW52SWQ6IHN0cmluZ1xuICBzZWNyZXRWZXJzaW9uOiBudW1iZXJcbiAgc2lnblN0cjogc3RyaW5nXG4gIHdzVXJsOiBzdHJpbmdcbiAgZXhwaXJlVFM6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElMb2dpbkluZm8ge1xuICBsb2dnZWRJbjogYm9vbGVhblxuICBsb2dnaW5nSW5Qcm9taXNlPzogUHJvbWlzZTxJTG9naW5SZXN1bHQ+XG4gIGxvZ2luU3RhcnRUUz86IG51bWJlclxuICBsb2dpblJlc3VsdD86IElMb2dpblJlc3VsdFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElMb2dpblJlc3VsdCB7XG4gIGVudklkOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJV1NTZW5kT3B0aW9ucyB7XG4gIG1zZzogSVJlcXVlc3RNZXNzYWdlXG4gIHdhaXRSZXNwb25zZT86IGJvb2xlYW5cbiAgLy8gd2hlbiB3YWl0UmVzcG9uc2UgaXMgc2V0IHRvIHRydWUsIGlmIHNraXBPbk1lc3NhZ2UgaXMgdHJ1ZSwgZ2VuZXJhbCBvbk1lc3NhZ2UgaGFuZGxlciB3aWxsIGJlIHNraXBwZWRcbiAgc2tpcE9uTWVzc2FnZT86IGJvb2xlYW5cbiAgdGltZW91dD86IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElXU1dhdGNoT3B0aW9ucyBleHRlbmRzIElXYXRjaE9wdGlvbnMge1xuICBlbnZJZD86IHN0cmluZ1xuICBjb2xsZWN0aW9uTmFtZTogc3RyaW5nXG4gIHF1ZXJ5OiBzdHJpbmdcbiAgbGltaXQ/OiBudW1iZXJcbiAgb3JkZXJCeT86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbn1cblxuaW50ZXJmYWNlIElSZXNvbHZlUmVqZWN0IHtcbiAgcmVzb2x2ZTogKHZhbHVlPzogYW55IHwgUHJvbWlzZUxpa2U8YW55PiB8IHVuZGVmaW5lZCkgPT4gdm9pZFxuICByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWRcbn1cblxuaW50ZXJmYWNlIElSZXNwb25zZVdhaXRTcGVjIGV4dGVuZHMgSVJlc29sdmVSZWplY3Qge1xuICBza2lwT25NZXNzYWdlPzogYm9vbGVhblxufVxuXG5pbnRlcmZhY2UgSVdzU2lnbiB7XG4gIHNpZ25TdHI6IHN0cmluZyxcbiAgd3NVcmw6IHN0cmluZyxcbiAgc2VjcmV0VmVyc2lvbjogc3RyaW5nXG4gIGVudklkOiBzdHJpbmdcbiAgZXhwaXJlZFRzOiBudW1iZXJcbn1cblxuY29uc3QgV1NfUkVBRFlfU1RBVEUgPSB7XG4gIENPTk5FQ1RJTkc6IDAsXG4gIE9QRU46IDEsXG4gIENMT1NJTkc6IDIsXG4gIENMT1NFRDogM1xufVxuXG5jb25zdCBNQVhfUlRUX09CU0VSVkVEID0gM1xuY29uc3QgREVGQVVMVF9FWFBFQ1RFRF9FVkVOVF9XQUlUX1RJTUUgPSA1MDAwXG5jb25zdCBERUZBVUxUX1VOVFJVU1RFRF9SVFRfVEhSRVNIT0xEID0gMTAwMDBcbmNvbnN0IERFRkFVTFRfTUFYX1JFQ09OTkVDVCA9IDVcbmNvbnN0IERFRkFVTFRfV1NfUkVDT05ORUNUX0lOVEVSVkFMID0gMTAwMDBcbi8vIGNvbnN0IERFRkFVTFRfV1NfUkVDT05ORUNUX01BWF9WQUxJRF9JTlRFUlZBTCA9IDMgKiA2MCAqIDEwMDBcbmNvbnN0IERFRkFVTFRfUElOR19GQUlMX1RPTEVSQU5DRSA9IDJcbmNvbnN0IERFRkFVTFRfUE9OR19NSVNTX1RPTEVSQU5DRSA9IDJcbmNvbnN0IERFRkFVTFRfTE9HSU5fVElNRU9VVCA9IDUwMDBcblxuZXhwb3J0IGNsYXNzIFJlYWx0aW1lV2ViU29ja2V0Q2xpZW50IHtcbiAgcHJpdmF0ZSBfdmlydHVhbFdTQ2xpZW50OiBTZXQ8VmlydHVhbFdlYlNvY2tldENsaWVudD4gPSBuZXcgU2V0KClcbiAgLy8gYWZ0ZXIgbGlzdGVuZXIgaW5pdFdhdGNoLCB0aGUgbGlzdGVuZXIgaGFzIHRoZSBxdWVyeUlEIGFuZCBjYW4gc3RvcmUgaXQgaGVyZVxuICBwcml2YXRlIF9xdWVyeUlkQ2xpZW50TWFwOiBNYXA8c3RyaW5nLCBWaXJ0dWFsV2ViU29ja2V0Q2xpZW50PiA9IG5ldyBNYXAoKVxuICBwcml2YXRlIF93YXRjaElkQ2xpZW50TWFwOiBNYXA8c3RyaW5nLCBWaXJ0dWFsV2ViU29ja2V0Q2xpZW50PiA9IG5ldyBNYXAoKVxuICBwcml2YXRlIF9tYXhSZWNvbm5lY3Q6IG51bWJlclxuICAvLyBwcml2YXRlIF9hdmFpbGFibGVSZXRyaWVzOiBudW1iZXJcbiAgcHJpdmF0ZSBfcmVjb25uZWN0SW50ZXJ2YWw6IG51bWJlclxuICBwcml2YXRlIF9jb250ZXh0OiBJRGF0YWJhc2VTZXJ2aWNlQ29udGV4dFxuICAvLyBwcml2YXRlIF93cz86IFdYTlMuU29ja2V0LklTb2NrZXRUYXNrXG4gIHByaXZhdGUgX3dzPzogYW55XG4gIHByaXZhdGUgX2xhc3RQaW5nU2VuZFRTPzogbnVtYmVyXG4gIHByaXZhdGUgX3BpbmdGYWlsZWQgPSAwXG4gIHByaXZhdGUgX3BvbmdNaXNzZWQgPSAwXG4gIHByaXZhdGUgX3BpbmdUaW1lb3V0SWQ/OiBudW1iZXJcbiAgcHJpdmF0ZSBfcG9uZ1RpbWVvdXRJZD86IG51bWJlclxuICBwcml2YXRlIF9sb2dpbnM6IE1hcDxzdHJpbmcgLyogZW52SWQgKi8sIElMb2dpbkluZm8+ID0gbmV3IE1hcCgpXG4gIC8vIHByaXZhdGUgX2xvZ2luSW5mbzogSUxvZ2luSW5mb1xuICAvLyBwcml2YXRlIF9zaWduYXR1cmVzOiBNYXA8c3RyaW5nIC8qIGVudklkICovLCBJU2lnbmF0dXJlPiA9IG5ldyBNYXAoKVxuICBwcml2YXRlIF93c0luaXRQcm9taXNlPzogUHJvbWlzZTx2b2lkPlxuICBwcml2YXRlIF93c1JlYWR5U3Vic3JpYmVyczogSVJlc29sdmVSZWplY3RbXSA9IFtdXG4gIHByaXZhdGUgX3dzUmVzcG9uc2VXYWl0OiBNYXA8XG4gICAgc3RyaW5nIC8qIHJlcXVlc3RJZCAqLyxcbiAgICBJUmVzcG9uc2VXYWl0U3BlY1xuICA+ID0gbmV3IE1hcCgpXG4gIHByaXZhdGUgX3J0dE9ic2VydmVkOiBudW1iZXJbXSA9IFtdXG4gIHByaXZhdGUgX3JlY29ubmVjdFN0YXRlOiBib29sZWFuXG4gIC8vIG9idGFpbmVkIGZyb20gdGhlIGZpcnN0IGdldFNpZ25hdHVyZSB3aXRoIG5vIGVudklkIHByb3ZpZGVkXG4gIC8vIHByaXZhdGUgX2RlZmF1bHRFbnZJZD86IHN0cmluZ1xuICBwcml2YXRlIF93c1NpZ246IElXc1NpZ25cblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJUmVhbHRpbWVXZWJTb2NrZXRDbGllbnRDb25zdHJ1Y3Rvck9wdGlvbnMpIHtcbiAgICB0aGlzLl9tYXhSZWNvbm5lY3QgPSBvcHRpb25zLm1heFJlY29ubmVjdCB8fCBERUZBVUxUX01BWF9SRUNPTk5FQ1RcbiAgICAvLyB0aGlzLl9hdmFpbGFibGVSZXRyaWVzID0gdGhpcy5fbWF4UmVjb25uZWN0XG4gICAgdGhpcy5fcmVjb25uZWN0SW50ZXJ2YWwgPVxuICAgICAgb3B0aW9ucy5yZWNvbm5lY3RJbnRlcnZhbCB8fCBERUZBVUxUX1dTX1JFQ09OTkVDVF9JTlRFUlZBTFxuICAgIHRoaXMuX2NvbnRleHQgPSBvcHRpb25zLmNvbnRleHRcbiAgfVxuXG4gIGNsZWFySGVhcnRiZWF0KCkge1xuICAgIHRoaXMuX3BpbmdUaW1lb3V0SWQgJiYgY2xlYXJUaW1lb3V0KHRoaXMuX3BpbmdUaW1lb3V0SWQpXG4gICAgdGhpcy5fcG9uZ1RpbWVvdXRJZCAmJiBjbGVhclRpbWVvdXQodGhpcy5fcG9uZ1RpbWVvdXRJZClcbiAgfVxuXG4gIHNlbmQgPSBhc3luYyA8VCA9IGFueT4ob3B0czogSVdTU2VuZE9wdGlvbnMpOiBQcm9taXNlPFQ+ID0+XG4gICAgbmV3IFByb21pc2U8VD4oYXN5bmMgKF9yZXNvbHZlLCBfcmVqZWN0KSA9PiB7XG4gICAgICBsZXQgdGltZW91dElkOiBudW1iZXJcbiAgICAgIGxldCBfaGFzUmVzb2x2ZWQgPSBmYWxzZVxuICAgICAgbGV0IF9oYXNSZWplY3RlZCA9IGZhbHNlXG5cbiAgICAgIGNvbnN0IHJlc29sdmU6IHR5cGVvZiBfcmVzb2x2ZSA9IChcbiAgICAgICAgdmFsdWU/OiBUIHwgUHJvbWlzZUxpa2U8VD4gfCB1bmRlZmluZWRcbiAgICAgICkgPT4ge1xuICAgICAgICBfaGFzUmVzb2x2ZWQgPSB0cnVlXG4gICAgICAgIHRpbWVvdXRJZCAmJiBjbGVhclRpbWVvdXQodGltZW91dElkKVxuICAgICAgICBfcmVzb2x2ZSh2YWx1ZSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVqZWN0OiB0eXBlb2YgX3JlamVjdCA9IChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgIF9oYXNSZWplY3RlZCA9IHRydWVcbiAgICAgICAgdGltZW91dElkICYmIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpXG4gICAgICAgIF9yZWplY3QoZXJyb3IpXG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRzLnRpbWVvdXQpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcbiAgICAgICAgICBpZiAoIV9oYXNSZXNvbHZlZCB8fCAhX2hhc1JlamVjdGVkKSB7XG4gICAgICAgICAgICAvLyB3YWl0IGFub3RoZXIgaW1tZWRpYXRlIHRpbWVvdXQgdG8gYWxsb3cgdGhlIHN1Y2Nlc3MvZmFpbCBjYWxsYmFjayB0byBiZSBpbnZva2VkIGlmIHdzIGhhcyBhbHJlYWR5IGdvdCB0aGUgcmVzdWx0LFxuICAgICAgICAgICAgLy8gdGhpcyBpcyBiZWNhdXNlIHRoZSB0aW1lciBpcyByZWdpc3RlcmVkIGJlZm9yZSB3cy5zZW5kXG4gICAgICAgICAgICBhd2FpdCBzbGVlcCgwKVxuICAgICAgICAgICAgaWYgKCFfaGFzUmVzb2x2ZWQgfHwgIV9oYXNSZWplY3RlZCkge1xuICAgICAgICAgICAgICByZWplY3QobmV3IFRpbWVvdXRFcnJvcignd3NjbGllbnQuc2VuZCB0aW1lZG91dCcpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgb3B0cy50aW1lb3V0KVxuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBpZiAodGhpcy5fY29udGV4dC5kZWJ1Zykge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhgW3JlYWx0aW1lXSB3cyBzZW5kICgke25ldyBEYXRlKCl9KTogYCwgb3B0cylcbiAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgIC8vICAgYFtyZWFsdGltZV0gd3Mgc2VuZCAke1xuICAgICAgICAvLyAgICAgb3B0cy5tc2cubXNnVHlwZVxuICAgICAgICAvLyAgIH0gKCR7bmV3IERhdGUoKS50b0xvY2FsZVN0cmluZygpfSk6IGAsXG4gICAgICAgIC8vICAgb3B0c1xuICAgICAgICAvLyApXG4gICAgICAgIC8vIH1cblxuICAgICAgICBpZiAodGhpcy5fd3NJbml0UHJvbWlzZSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuX3dzSW5pdFByb21pc2VcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5fd3MpIHtcbiAgICAgICAgICByZWplY3QoXG4gICAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICdpbnZhbGlkIHN0YXRlOiB3cyBjb25uZWN0aW9uIG5vdCBleGlzdHMsIGNhbiBub3Qgc2VuZCBtZXNzYWdlJ1xuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl93cy5yZWFkeVN0YXRlICE9PSBXU19SRUFEWV9TVEFURS5PUEVOKSB7XG4gICAgICAgICAgcmVqZWN0KFxuICAgICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgd3MgcmVhZHlTdGF0ZSBpbnZhbGlkOiAke3RoaXMuX3dzLnJlYWR5U3RhdGV9LCBjYW4gbm90IHNlbmQgbWVzc2FnZWBcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0cy53YWl0UmVzcG9uc2UpIHtcbiAgICAgICAgICB0aGlzLl93c1Jlc3BvbnNlV2FpdC5zZXQob3B0cy5tc2cucmVxdWVzdElkLCB7XG4gICAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgICAgcmVqZWN0LFxuICAgICAgICAgICAgc2tpcE9uTWVzc2FnZTogb3B0cy5za2lwT25NZXNzYWdlXG4gICAgICAgICAgfSBhcyBJUmVzcG9uc2VXYWl0U3BlYylcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdzZW5kIG1zZzonLCBvcHRzLm1zZylcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLl93cy5zZW5kKEpTT04uc3RyaW5naWZ5KG9wdHMubXNnKSlcbiAgICAgICAgICBpZiAoIW9wdHMud2FpdFJlc3BvbnNlKSB7XG4gICAgICAgICAgICByZXNvbHZlKClcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIHJlamVjdChlcnIpXG4gICAgICAgICAgICBpZiAob3B0cy53YWl0UmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgdGhpcy5fd3NSZXNwb25zZVdhaXQuZGVsZXRlKG9wdHMubXNnLnJlcXVlc3RJZClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gdGhpcy5fd3Muc2VuZChKU09OLnN0cmluZ2lmeShvcHRzLm1zZyksIGVyciA9PiB7XG4gICAgICAgIC8vICAgaWYgKGVycikge1xuICAgICAgICAvLyAgICAgcmVqZWN0KGVycilcbiAgICAgICAgLy8gICAgIGlmIChvcHRzLndhaXRSZXNwb25zZSkge1xuICAgICAgICAvLyAgICAgICB0aGlzLl93c1Jlc3BvbnNlV2FpdC5kZWxldGUob3B0cy5tc2cucmVxdWVzdElkKVxuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyAgICAgcmV0dXJuXG4gICAgICAgIC8vICAgfVxuXG4gICAgICAgIC8vICAgaWYgKCFvcHRzLndhaXRSZXNwb25zZSkge1xuICAgICAgICAvLyAgICAgcmVzb2x2ZSgpXG4gICAgICAgIC8vICAgfVxuICAgICAgICAvLyB9KVxuXG4gICAgICAgIC8vIHRoaXMuX3dzLnNlbmQoe1xuICAgICAgICAvLyAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KG9wdHMubXNnKSxcbiAgICAgICAgLy8gICBzdWNjZXNzOiByZXMgPT4ge1xuICAgICAgICAvLyAgICAgaWYgKCFvcHRzLndhaXRSZXNwb25zZSkge1xuICAgICAgICAvLyAgICAgICByZXNvbHZlKHJlcylcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gICB9LFxuICAgICAgICAvLyAgIGZhaWw6IGUgPT4ge1xuICAgICAgICAvLyAgICAgcmVqZWN0KGUpXG4gICAgICAgIC8vICAgICBpZiAob3B0cy53YWl0UmVzcG9uc2UpIHtcbiAgICAgICAgLy8gICAgICAgdGhpcy5fd3NSZXNwb25zZVdhaXQuZGVsZXRlKG9wdHMubXNnLnJlcXVlc3RJZClcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gICB9XG4gICAgICAgIC8vIH0pXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlamVjdChlKVxuICAgICAgfVxuICAgIH0pXG5cbiAgY2xvc2UoY29kZTogQ0xPU0VfRVZFTlRfQ09ERSkge1xuICAgIHRoaXMuY2xlYXJIZWFydGJlYXQoKVxuXG4gICAgaWYgKHRoaXMuX3dzKSB7XG4gICAgICB0aGlzLl93cy5jbG9zZShjb2RlLCBDTE9TRV9FVkVOVF9DT0RFX0lORk9bY29kZV0ubmFtZSlcbiAgICAgIHRoaXMuX3dzID0gdW5kZWZpbmVkXG4gICAgfVxuICB9XG5cbiAgY2xvc2VBbGxDbGllbnRzID0gKGVycm9yOiBhbnkpID0+IHtcbiAgICB0aGlzLl92aXJ0dWFsV1NDbGllbnQuZm9yRWFjaChjbGllbnQgPT4ge1xuICAgICAgY2xpZW50LmNsb3NlV2l0aEVycm9yKGVycm9yKVxuICAgIH0pXG4gIH1cblxuICBwYXVzZUNsaWVudHMgPSAoY2xpZW50cz86IFNldDxWaXJ0dWFsV2ViU29ja2V0Q2xpZW50PikgPT4ge1xuICAgIDsoY2xpZW50cyB8fCB0aGlzLl92aXJ0dWFsV1NDbGllbnQpLmZvckVhY2goY2xpZW50ID0+IHtcbiAgICAgIGNsaWVudC5wYXVzZSgpXG4gICAgfSlcbiAgfVxuXG4gIHJlc3VtZUNsaWVudHMgPSAoY2xpZW50cz86IFNldDxWaXJ0dWFsV2ViU29ja2V0Q2xpZW50PikgPT4ge1xuICAgIDsoY2xpZW50cyB8fCB0aGlzLl92aXJ0dWFsV1NDbGllbnQpLmZvckVhY2goY2xpZW50ID0+IHtcbiAgICAgIGNsaWVudC5yZXN1bWUoKVxuICAgIH0pXG4gIH1cblxuICB3YXRjaChvcHRpb25zOiBJV1NXYXRjaE9wdGlvbnMpOiBEQlJlYWx0aW1lTGlzdGVuZXIge1xuICAgIGlmICghdGhpcy5fd3MgJiYgIXRoaXMuX3dzSW5pdFByb21pc2UpIHtcbiAgICAgIHRoaXMuaW5pdFdlYlNvY2tldENvbm5lY3Rpb24oZmFsc2UpXG4gICAgfVxuXG4gICAgY29uc3QgdmlydHVhbENsaWVudCA9IG5ldyBWaXJ0dWFsV2ViU29ja2V0Q2xpZW50KHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBzZW5kOiB0aGlzLnNlbmQsXG4gICAgICBsb2dpbjogdGhpcy53ZWJMb2dpbixcbiAgICAgIGlzV1NDb25uZWN0ZWQ6IHRoaXMuaXNXU0Nvbm5lY3RlZCxcbiAgICAgIG9uY2VXU0Nvbm5lY3RlZDogdGhpcy5vbmNlV1NDb25uZWN0ZWQsXG4gICAgICBnZXRXYWl0RXhwZWN0ZWRUaW1lb3V0TGVuZ3RoOiB0aGlzLmdldFdhaXRFeHBlY3RlZFRpbWVvdXRMZW5ndGgsXG4gICAgICBvbldhdGNoU3RhcnQ6IHRoaXMub25XYXRjaFN0YXJ0LFxuICAgICAgb25XYXRjaENsb3NlOiB0aGlzLm9uV2F0Y2hDbG9zZSxcbiAgICAgIGRlYnVnOiB0cnVlXG4gICAgfSlcbiAgICB0aGlzLl92aXJ0dWFsV1NDbGllbnQuYWRkKHZpcnR1YWxDbGllbnQpXG4gICAgdGhpcy5fd2F0Y2hJZENsaWVudE1hcC5zZXQodmlydHVhbENsaWVudC53YXRjaElkLCB2aXJ0dWFsQ2xpZW50KVxuICAgIHJldHVybiB2aXJ0dWFsQ2xpZW50Lmxpc3RlbmVyXG4gIH1cblxuICBwcml2YXRlIGluaXRXZWJTb2NrZXRDb25uZWN0aW9uID0gYXN5bmMgKFxuICAgIHJlY29ubmVjdDogYm9vbGVhbixcbiAgICBhdmFpbGFibGVSZXRyaWVzOiBudW1iZXIgPSB0aGlzLl9tYXhSZWNvbm5lY3RcbiAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgLy8g5b2T5YmN5aSE5LqO5q2j5Zyo6YeN6L+e5Lit55qE54q25oCBXG4gICAgaWYgKHJlY29ubmVjdCAmJiB0aGlzLl9yZWNvbm5lY3RTdGF0ZSkge1xuICAgICAgcmV0dXJuIC8vIOW/veeVpVxuICAgIH1cblxuICAgIGlmIChyZWNvbm5lY3QpIHtcbiAgICAgIHRoaXMuX3JlY29ubmVjdFN0YXRlID0gdHJ1ZSAvLyDph43ov57nirbmgIHlvIDlp4tcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fd3NJbml0UHJvbWlzZSkge1xuICAgICAgLy8gdGhlcmUgYWxyZWFkeSBleGlzdHMgYSB3ZWJzb2NrZXQgaW5pdGlhdGlvbiwganVzdCB3YWl0IGZvciBpdFxuICAgICAgcmV0dXJuIHRoaXMuX3dzSW5pdFByb21pc2VcbiAgICB9XG5cbiAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAvLyAgIGBbcmVhbHRpbWVdIGluaXRXZWJTb2NrZXRDb25uZWN0aW9uIHJlY29ubmVjdCAke3JlY29ubmVjdH0gYXZhaWxhYmxlUmV0cmllcyAke2F2YWlsYWJsZVJldHJpZXN9YFxuICAgIC8vIClcbiAgICAvLyB9XG5cbiAgICBpZiAocmVjb25uZWN0KSB7XG4gICAgICB0aGlzLnBhdXNlQ2xpZW50cygpXG4gICAgfVxuXG4gICAgdGhpcy5jbG9zZShDTE9TRV9FVkVOVF9DT0RFLlJlY29ubmVjdFdlYlNvY2tldClcblxuICAgIHRoaXMuX3dzSW5pdFByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPihhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgIC8vICAgJ1tyZWFsdGltZV0gaW5pdFdlYlNvY2tldENvbm5lY3Rpb24gc3RhcnQgdGhyb3dFcnJvcklmTmV0d29ya09mZmxpbmUnXG4gICAgICAgIC8vIClcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIC8vIOaaguS4jeajgOafpee9kee7nOaAgVxuICAgICAgICAvLyBhd2FpdCB0aHJvd0Vycm9ySWZOZXR3b3JrT2ZmbGluZSgpXG5cbiAgICAgICAgLy8gaWYgKHByb2Nlc3MuZW52LkRFQlVHKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdbcmVhbHRpbWVdIGluaXRXZWJTb2NrZXRDb25uZWN0aW9uIHN0YXJ0IGdldFNpZ25hdHVyZScpXG4gICAgICAgIC8vIH1cblxuICAgICAgICAvLyBjb25zdCBzaWduYXR1cmUgPSBhd2FpdCB0aGlzLmdldFNpZ25hdHVyZSgpXG4gICAgICAgIGNvbnN0IHdzU2lnbiA9IGF3YWl0IHRoaXMuZ2V0V3NTaWduKClcblxuICAgICAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ1tyZWFsdGltZV0gaW5pdFdlYlNvY2tldENvbm5lY3Rpb24gZ2V0U2lnbmF0dXJlIHN1Y2Nlc3MnKVxuICAgICAgICAvLyBjb25zb2xlLmxvZygnW3JlYWx0aW1lXSBpbml0V2ViU29ja2V0Q29ubmVjdGlvbiBzdGFydCBjb25uZWN0U29ja2V0JylcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHN1Y2Nlc3MgPT4ge1xuICAgICAgICAgIC8vIHRoaXMuX3dzID0gZ2V0U0RLKHRoaXMuX2NvbnRleHQuaWRlbnRpZmllcnMpXG4gICAgICAgICAgLy8gICAuX3NvY2tldFNraXBDaGVja0RvbWFpbkZhY3RvcnkoKVxuICAgICAgICAgIC8vICAgLmNvbm5lY3RTb2NrZXQoe1xuICAgICAgICAgIC8vICAgICB1cmw6IHNpZ25hdHVyZS53c1VybCxcbiAgICAgICAgICAvLyAgICAgaGVhZGVyOiB7XG4gICAgICAgICAgLy8gICAgICAgXCJjb250ZW50LXR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAvLyAgICAgfSxcbiAgICAgICAgICAvLyAgICAgc3VjY2VzczogKCkgPT4gc3VjY2VzcygpLFxuICAgICAgICAgIC8vICAgICBmYWlsXG4gICAgICAgICAgLy8gICB9KVxuXG4gICAgICAgICAgY29uc3QgdXJsID0gd3NTaWduLndzVXJsIHx8ICd3c3M6Ly90Y2Itd3MudGVuY2VudGNsb3VkYXBpLmNvbSc7XG4gICAgICAgICAgY29uc3Qgd3NDbGFzcyA9IGdldFdzQ2xhc3MoKTtcbiAgICAgICAgICB0aGlzLl93cyA9IHdzQ2xhc3MgPyBuZXcgd3NDbGFzcyh1cmwpIDogbmV3IFdlYlNvY2tldCh1cmwpXG4gICAgICAgICAgc3VjY2VzcygpXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYodGhpcy5fd3MuY29ubmVjdCl7XG4gICAgICAgICAgYXdhaXQgdGhpcy5fd3MuY29ubmVjdCgpXG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgIC8vICAgJ1tyZWFsdGltZV0gaW5pdFdlYlNvY2tldENvbm5lY3Rpb24gY29ubmVjdFNvY2tldCBzdWNjZXNzZnVsbHkgZmlyZWQnXG4gICAgICAgIC8vIClcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdFdlYlNvY2tldEV2ZW50KClcbiAgICAgICAgcmVzb2x2ZSgpXG5cbiAgICAgICAgaWYgKHJlY29ubmVjdCkge1xuICAgICAgICAgIHRoaXMucmVzdW1lQ2xpZW50cygpXG4gICAgICAgICAgdGhpcy5fcmVjb25uZWN0U3RhdGUgPSBmYWxzZSAvLyDph43ov57nirbmgIHnu5PmnZ9cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignW3JlYWx0aW1lXSBpbml0V2ViU29ja2V0Q29ubmVjdGlvbiBjb25uZWN0IGZhaWwnLCBlKVxuICAgICAgICAvLyB9XG5cbiAgICAgICAgaWYgKGF2YWlsYWJsZVJldHJpZXMgPiAwKSB7XG4gICAgICAgICAgLy8gdGhpcyBpcyBhbiBvcHRpbWl6YXRpb24sIGluIGNhc2Ugb2YgbmV0d29yayBvZmZsaW5lLCB3ZSBkb24ndCBuZWVkIHRvIHN0dWJib3JubHkgc2xlZXAgZm9yIHNvbWV0aW1lLFxuICAgICAgICAgIC8vIHdlIG9ubHkgbmVlZCB0byB3YWl0IGZvciB0aGUgbmV0d29yayB0byBiZSBiYWNrIG9ubGluZSwgdGhpcyBlbnN1cmVzIG1pbmltdW0gZG93bnRpbWVcbiAgICAgICAgICAvLyBjb25zdCB7IGlzQ29ubmVjdGVkIH0gPSBhd2FpdCBnZXROZXR3b3JrU3RhdHVzKClcbiAgICAgICAgICBjb25zdCBpc0Nvbm5lY3RlZCA9IHRydWVcblxuICAgICAgICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgIC8vICAgJ1tyZWFsdGltZV0gaW5pdFdlYlNvY2tldENvbm5lY3Rpb24gd2FpdGluZyBmb3IgbmV0d29yayBvbmxpbmUnXG4gICAgICAgICAgLy8gKVxuICAgICAgICAgIC8vIH1cblxuICAgICAgICAgIC8vIGF1dG8gd2FpdCB1bnRpbCBuZXR3b3JrIG9ubGluZSwgY2F1c2UnIGl0IHdvdWxkIGJlIG1lYW5pbmdsZXNzIHRvIHJlY29ubmVjdCB3aGlsZSBuZXR3b3JrIGlzIG9mZmxpbmVcblxuICAgICAgICAgIC8vIGF3YWl0IG9uY2VOZXR3b3JrT25saW5lKClcblxuICAgICAgICAgIC8vIENPTVBBVElCSUxJVFk6IHdhaXQgZm9yIGlkZSBzdGF0ZSB1cGRhdGVcbiAgICAgICAgICAvLyBpZiAoaXNEZXZUb29scygpKSB7XG4gICAgICAgICAgLy8gICBhd2FpdCBzbGVlcCgwKVxuICAgICAgICAgIC8vIH1cblxuICAgICAgICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdbcmVhbHRpbWVdIGluaXRXZWJTb2NrZXRDb25uZWN0aW9uIG5ldHdvcmsgb25saW5lJylcbiAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICB0aGlzLl93c0luaXRQcm9taXNlID0gdW5kZWZpbmVkXG5cbiAgICAgICAgICBpZiAoaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgICAvLyAgIGBbcmVhbHRpbWVdIGluaXRXZWJTb2NrZXRDb25uZWN0aW9uIHNsZWVwICR7dGhpcy5fcmVjb25uZWN0SW50ZXJ2YWx9bXNgXG4gICAgICAgICAgICAvLyApXG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICBhd2FpdCBzbGVlcCh0aGlzLl9yZWNvbm5lY3RJbnRlcnZhbClcbiAgICAgICAgICAgIGlmIChyZWNvbm5lY3QpIHtcbiAgICAgICAgICAgICAgdGhpcy5fcmVjb25uZWN0U3RhdGUgPSBmYWxzZSAvLyDph43ov57lvILluLjkuZ/nrpfph43ov57nirbmgIHnu5PmnZ9cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXNvbHZlKHRoaXMuaW5pdFdlYlNvY2tldENvbm5lY3Rpb24ocmVjb25uZWN0LCBhdmFpbGFibGVSZXRyaWVzIC0gMSkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KGUpXG5cbiAgICAgICAgICBpZiAocmVjb25uZWN0KSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlQWxsQ2xpZW50cyhcbiAgICAgICAgICAgICAgbmV3IENsb3VkU0RLRXJyb3Ioe1xuICAgICAgICAgICAgICAgIGVyckNvZGU6IEVSUl9DT0RFLlNES19EQVRBQkFTRV9SRUFMVElNRV9MSVNURU5FUl9SRUNPTk5FQ1RfV0FUQ0hfRkFJTCBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgZXJyTXNnOiBlXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcblxuICAgIC8vIGxldCBzdWNjZXNzID0gZmFsc2VcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLl93c0luaXRQcm9taXNlXG4gICAgICAvLyBzdWNjZXNzID0gdHJ1ZVxuICAgICAgdGhpcy5fd3NSZWFkeVN1YnNyaWJlcnMuZm9yRWFjaCgoeyByZXNvbHZlIH0pID0+IHJlc29sdmUoKSlcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLl93c1JlYWR5U3Vic3JpYmVycy5mb3JFYWNoKCh7IHJlamVjdCB9KSA9PiByZWplY3QoKSlcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5fd3NJbml0UHJvbWlzZSA9IHVuZGVmaW5lZFxuICAgICAgdGhpcy5fd3NSZWFkeVN1YnNyaWJlcnMgPSBbXVxuICAgIH1cblxuICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgIC8vIGNvbnNvbGUubG9nKFxuICAgIC8vICAgYFtyZWFsdGltZV0gaW5pdFdlYlNvY2tldENvbm5lY3Rpb24gJHtzdWNjZXNzID8gJ3N1Y2Nlc3MnIDogJ2ZhaWwnfWBcbiAgICAvLyApXG4gICAgLy8gfVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0V2ViU29ja2V0RXZlbnQgPSAoKSA9PlxuICAgIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICghdGhpcy5fd3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW4gbm90IGluaXRXZWJTb2NrZXRFdmVudCwgd3Mgbm90IGV4aXN0cycpXG4gICAgICB9XG5cbiAgICAgIGxldCB3c09wZW5lZCA9IGZhbHNlXG5cbiAgICAgIHRoaXMuX3dzLm9ub3BlbiA9IGV2ZW50ID0+IHtcbiAgICAgICAgLy8gdGhpcy5fd3Mub25PcGVuKCgpID0+IHtcbiAgICAgICAgLy8gdGhpcy5fd3Mub24oXCJvcGVuXCIsICgpID0+IHtcbiAgICAgICAgLy8gdGhpcy5fY29udGV4dC5kZWJ1ZyAmJlxuICAgICAgICBjb25zb2xlLndhcm4oJ1tyZWFsdGltZV0gd3MgZXZlbnQ6IG9wZW4nLCBldmVudClcbiAgICAgICAgd3NPcGVuZWQgPSB0cnVlXG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgfVxuXG4gICAgICB0aGlzLl93cy5vbmVycm9yID0gZXZlbnQgPT4ge1xuICAgICAgICAvLyB0aGlzLl93cy5vbihcImVycm9yXCIsIGVycm9yID0+IHtcbiAgICAgICAgLy8gdGhpcy5fd3Mub25FcnJvcihlcnJvciA9PiB7XG4gICAgICAgIC8vIGFsbCBsb2dpbnMgYXJlIGludmFsaWQgYWZ0ZXIgZGlzY29ubmVjdGlvblxuICAgICAgICB0aGlzLl9sb2dpbnMgPSBuZXcgTWFwKClcblxuICAgICAgICAvLyBlcnJvcuWGmei/m2ZpbGVcblxuICAgICAgICBpZiAoIXdzT3BlbmVkKSB7XG4gICAgICAgICAgLy8gdGhpcy5fY29udGV4dC5kZWJ1ZyAmJlxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tyZWFsdGltZV0gd3Mgb3BlbiBmYWlsZWQgd2l0aCB3cyBldmVudDogZXJyb3InLCBldmVudClcbiAgICAgICAgICAvLyB3cml0ZVRvRmlsZShcbiAgICAgICAgICAvLyAgIFwid3NlcnJvci50eHRcIixcbiAgICAgICAgICAvLyAgIGAke1xuICAgICAgICAgIC8vICAgICB0aGlzLnNwZWNpYWxOdW1iZXJcbiAgICAgICAgICAvLyAgIH0gW3JlYWx0aW1lXSB3cyBvcGVuIGZhaWxlZCB3aXRoIHdzIGV2ZW50OiBlcnJvciAke2Vycm9yfSBcXG5gXG4gICAgICAgICAgLy8gKVxuXG4gICAgICAgICAgcmVqZWN0KGV2ZW50KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHRoaXMuX2NvbnRleHQuZGVidWcgJiZcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdbcmVhbHRpbWVdIHdzIGV2ZW50OiBlcnJvcicsIGV2ZW50KVxuXG4gICAgICAgICAgLy8gd3JpdGVUb0ZpbGUoXG4gICAgICAgICAgLy8gICBcIndzZXJyb3IudHh0XCIsXG4gICAgICAgICAgLy8gICBgJHt0aGlzLnNwZWNpYWxOdW1iZXJ9IFtyZWFsdGltZV0gd3MgZXZlbnQ6IGVycm9yICR7ZXJyb3J9IFxcbmBcbiAgICAgICAgICAvLyApXG5cbiAgICAgICAgICB0aGlzLmNsZWFySGVhcnRiZWF0KClcbiAgICAgICAgICB0aGlzLl92aXJ0dWFsV1NDbGllbnQuZm9yRWFjaChjbGllbnQgPT5cbiAgICAgICAgICAgIGNsaWVudC5jbG9zZVdpdGhFcnJvcihcbiAgICAgICAgICAgICAgbmV3IENsb3VkU0RLRXJyb3Ioe1xuICAgICAgICAgICAgICAgIGVyckNvZGU6IEVSUl9DT0RFLlNES19EQVRBQkFTRV9SRUFMVElNRV9MSVNURU5FUl9XRUJTT0NLRVRfQ09OTkVDVElPTl9FUlJPUiBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgZXJyTXNnOiBldmVudFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUT0RPOiByZWNvbm5lY3RcbiAgICAgIHRoaXMuX3dzLm9uY2xvc2UgPSBjbG9zZUV2ZW50ID0+IHtcbiAgICAgICAgLy8gdGhpcy5fd3Mub24oXCJjbG9zZVwiLCAoY2xvc2VFdmVudCwgY2xvc2VyZWFzb24pID0+IHtcbiAgICAgICAgLy8gdGhpcy5fd3Mub25DbG9zZShjbG9zZUV2ZW50ID0+IHtcbiAgICAgICAgLy8gaWYgKHByb2Nlc3MuZW52LkRFQlVHKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW3JlYWx0aW1lXSB3cyBldmVudDogY2xvc2UnLCBjbG9zZUV2ZW50KVxuICAgICAgICAvLyB9XG5cbiAgICAgICAgLy8gd3JpdGVUb0ZpbGUoXG4gICAgICAgIC8vICAgXCJ3c2Nsb3NlLnR4dFwiLFxuICAgICAgICAvLyAgIGAke1xuICAgICAgICAvLyAgICAgdGhpcy5zcGVjaWFsTnVtYmVyXG4gICAgICAgIC8vICAgfSBbcmVhbHRpbWVdIHdzIGV2ZW50OiBjbG9zZSAke2Nsb3NlRXZlbnR9ICR7Y2xvc2VyZWFzb259IFxcbmBcbiAgICAgICAgLy8gKVxuXG4gICAgICAgIC8vIGFsbCBsb2dpbnMgYXJlIGludmFsaWQgYWZ0ZXIgZGlzY29ubmVjdGlvblxuICAgICAgICB0aGlzLl9sb2dpbnMgPSBuZXcgTWFwKClcblxuICAgICAgICB0aGlzLmNsZWFySGVhcnRiZWF0KClcbiAgICAgICAgc3dpdGNoIChjbG9zZUV2ZW50LmNvZGUpIHtcbiAgICAgICAgICBjYXNlIENMT1NFX0VWRU5UX0NPREUuUmVjb25uZWN0V2ViU29ja2V0OiB7XG4gICAgICAgICAgICAvLyBqdXN0IGlnbm9yZVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBDTE9TRV9FVkVOVF9DT0RFLk5vUmVhbHRpbWVMaXN0ZW5lcnM6IHtcbiAgICAgICAgICAgIC8vIHF1aXRcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgQ0xPU0VfRVZFTlRfQ09ERS5IZWFydGJlYXRQaW5nRXJyb3I6XG4gICAgICAgICAgY2FzZSBDTE9TRV9FVkVOVF9DT0RFLkhlYXJ0YmVhdFBvbmdUaW1lb3V0RXJyb3I6XG4gICAgICAgICAgY2FzZSBDTE9TRV9FVkVOVF9DT0RFLk5vcm1hbENsb3N1cmU6XG4gICAgICAgICAgY2FzZSBDTE9TRV9FVkVOVF9DT0RFLkFibm9ybWFsQ2xvc3VyZToge1xuICAgICAgICAgICAgLy8gTm9ybWFsIENsb3N1cmUgYW5kIEFibm9ybWFsIENsb3N1cmU6XG4gICAgICAgICAgICAvLyAgIGV4cGVjdGVkIGNsb3N1cmUsIG1vc3QgbGlrZWx5IGRpc3BhdGNoZWQgYnkgd2VjaGF0IGNsaWVudCxcbiAgICAgICAgICAgIC8vICAgc2luY2UgdGhpcyBpcyB0aGUgc3RhdHVzIGNvZGUgZGlzcGF0Y2hlZCBpbiBjYXNlIG9mIG5ldHdvcmsgZmFpbHVyZSxcbiAgICAgICAgICAgIC8vICAgd2Ugc2hvdWxkIHJldHJ5XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9tYXhSZWNvbm5lY3QgPiAwKSB7XG4gICAgICAgICAgICAgIC8vIGlmICh0aGlzLl9hdmFpbGFibGVSZXRyaWVzID4gMCkge1xuICAgICAgICAgICAgICB0aGlzLmluaXRXZWJTb2NrZXRDb25uZWN0aW9uKHRydWUsIHRoaXMuX21heFJlY29ubmVjdClcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuY2xvc2VBbGxDbGllbnRzKGdldFdTQ2xvc2VFcnJvcihjbG9zZUV2ZW50LmNvZGUpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBDTE9TRV9FVkVOVF9DT0RFLk5vQXV0aGVudGljYXRpb246IHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VBbGxDbGllbnRzKFxuICAgICAgICAgICAgICBnZXRXU0Nsb3NlRXJyb3IoY2xvc2VFdmVudC5jb2RlLCBjbG9zZUV2ZW50LnJlYXNvbilcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIC8vIHdlIHNob3VsZCByZXRyeSBieSBkZWZhdWx0XG4gICAgICAgICAgICBpZiAodGhpcy5fbWF4UmVjb25uZWN0ID4gMCkge1xuICAgICAgICAgICAgICAvLyBpZiAodGhpcy5fYXZhaWxhYmxlUmV0cmllcyA+IDApIHtcbiAgICAgICAgICAgICAgdGhpcy5pbml0V2ViU29ja2V0Q29ubmVjdGlvbih0cnVlLCB0aGlzLl9tYXhSZWNvbm5lY3QpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmNsb3NlQWxsQ2xpZW50cyhnZXRXU0Nsb3NlRXJyb3IoY2xvc2VFdmVudC5jb2RlKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybihgW3JlYWx0aW1lXSB1bnJlY29nbml6ZSB3cyBjbG9zZSBldmVudGAsIGNsb3NlRXZlbnQpXG4gICAgICAgICAgICAvLyB0aGlzLmNsb3NlQWxsQ2xpZW50cyhnZXRXU0Nsb3NlRXJyb3IoY2xvc2VFdmVudC5jb2RlKSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5fd3Mub25tZXNzYWdlID0gcmVzID0+IHtcbiAgICAgICAgLy8gdGhpcy5fd3Mub24oXCJtZXNzYWdlXCIsIHJlcyA9PiB7XG4gICAgICAgIC8vIHRoaXMuX3dzLm9uTWVzc2FnZShyZXMgPT4ge1xuICAgICAgICAvLyBjb25zdCByYXdNc2cgPSByZXMuZGF0YVxuICAgICAgICBjb25zdCByYXdNc2cgPSByZXMuZGF0YVxuXG4gICAgICAgIC8vIHJlc2V0ICYgcmVzdGFydCBoZWFydGJlYXRcbiAgICAgICAgdGhpcy5oZWFydGJlYXQoKVxuXG4gICAgICAgIGxldCBtc2c6IElSZXNwb25zZU1lc3NhZ2VcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIG1zZyA9IEpTT04ucGFyc2UocmF3TXNnIGFzIHN0cmluZylcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgW3JlYWx0aW1lXSBvbk1lc3NhZ2UgcGFyc2UgcmVzLmRhdGEgZXJyb3I6ICR7ZX1gKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgIC8vICAgYFtyZWFsdGltZV0gb25NZXNzYWdlICR7XG4gICAgICAgIC8vICAgICBtc2cubXNnVHlwZVxuICAgICAgICAvLyAgIH0gKCR7bmV3IERhdGUoKS50b0xvY2FsZVN0cmluZygpfSlgLFxuICAgICAgICAvLyAgIG1zZ1xuICAgICAgICAvLyApXG5cbiAgICAgICAgaWYgKG1zZy5tc2dUeXBlID09PSAnRVJST1InKSB7XG4gICAgICAgICAgLy8g5om+5Yiw5b2T5YmN55uR5ZCs77yM5bm25bCGZXJyb3Lov5Tlm55cbiAgICAgICAgICBsZXQgdmlydHVhbFdhdGNoID0gbnVsbFxuICAgICAgICAgIHRoaXMuX3ZpcnR1YWxXU0NsaWVudC5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaWYgKGl0ZW0ud2F0Y2hJZCA9PT0gbXNnLndhdGNoSWQpIHtcbiAgICAgICAgICAgICAgdmlydHVhbFdhdGNoID0gaXRlbVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICBpZiAodmlydHVhbFdhdGNoKSB7XG4gICAgICAgICAgICB2aXJ0dWFsV2F0Y2gubGlzdGVuZXIub25FcnJvcihtc2cpXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2VXYWl0U3BlYyA9IHRoaXMuX3dzUmVzcG9uc2VXYWl0LmdldChtc2cucmVxdWVzdElkKVxuICAgICAgICBpZiAocmVzcG9uc2VXYWl0U3BlYykge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAobXNnLm1zZ1R5cGUgPT09ICdFUlJPUicpIHtcbiAgICAgICAgICAgICAgcmVzcG9uc2VXYWl0U3BlYy5yZWplY3QobmV3IFJlYWx0aW1lRXJyb3JNZXNzYWdlRXJyb3IobXNnKSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlc3BvbnNlV2FpdFNwZWMucmVzb2x2ZShtc2cpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gdGhpcy5fY29udGV4dC5kZWJ1ZyAmJlxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgJ3dzIG9uTWVzc2FnZSByZXNwb25zZVdhaXRTcGVjLnJlc29sdmUobXNnKSBlcnJvcmVkOicsXG4gICAgICAgICAgICAgIGVcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5fd3NSZXNwb25zZVdhaXQuZGVsZXRlKG1zZy5yZXF1ZXN0SWQpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyZXNwb25zZVdhaXRTcGVjLnNraXBPbk1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtc2cubXNnVHlwZSA9PT0gJ1BPTkcnKSB7XG4gICAgICAgICAgaWYgKHRoaXMuX2xhc3RQaW5nU2VuZFRTKSB7XG4gICAgICAgICAgICBjb25zdCBydHQgPSBEYXRlLm5vdygpIC0gdGhpcy5fbGFzdFBpbmdTZW5kVFNcbiAgICAgICAgICAgIGlmIChydHQgPiBERUZBVUxUX1VOVFJVU1RFRF9SVFRfVEhSRVNIT0xEKSB7XG4gICAgICAgICAgICAgIC8vIHRoaXMuX2NvbnRleHQuZGVidWcgJiZcbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBbcmVhbHRpbWVdIHVudHJ1c3RlZCBydHQgb2JzZXJ2ZWQ6ICR7cnR0fWApXG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX3J0dE9ic2VydmVkLmxlbmd0aCA+PSBNQVhfUlRUX09CU0VSVkVEKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3J0dE9ic2VydmVkLnNwbGljZShcbiAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgIHRoaXMuX3J0dE9ic2VydmVkLmxlbmd0aCAtIE1BWF9SVFRfT0JTRVJWRUQgKyAxXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3J0dE9ic2VydmVkLnB1c2gocnR0KVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjbGllbnQgPSBtc2cud2F0Y2hJZCAmJiB0aGlzLl93YXRjaElkQ2xpZW50TWFwLmdldChtc2cud2F0Y2hJZClcbiAgICAgICAgaWYgKGNsaWVudCkge1xuICAgICAgICAgIGNsaWVudC5vbk1lc3NhZ2UobXNnKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFRPRE8sIHRoaXMgaXMgYSB0ZW1wb3JhcnkgZml4IGRvbmUgZm9yIHNlcnZlclxuICAgICAgICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBgW3JlYWx0aW1lXSBubyByZWFsdGltZSBsaXN0ZW5lciBmb3VuZCByZXNwb25zaWJsZSBmb3Igd2F0Y2hJZCAke21zZy53YXRjaElkfTogYCxcbiAgICAgICAgICAgIG1zZ1xuICAgICAgICAgIClcbiAgICAgICAgICAvLyB9XG4gICAgICAgICAgc3dpdGNoIChtc2cubXNnVHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnSU5JVF9FVkVOVCc6XG4gICAgICAgICAgICBjYXNlICdORVhUX0VWRU5UJzpcbiAgICAgICAgICAgIGNhc2UgJ0NIRUNLX0VWRU5UJzoge1xuICAgICAgICAgICAgICBjbGllbnQgPSB0aGlzLl9xdWVyeUlkQ2xpZW50TWFwLmdldChtc2cubXNnRGF0YS5xdWVyeUlEKVxuICAgICAgICAgICAgICBpZiAoY2xpZW50KSB7XG4gICAgICAgICAgICAgICAgY2xpZW50Lm9uTWVzc2FnZShtc2cpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBbLGNsaWVudF0gb2YgQXJyYXkuZnJvbSh0aGlzLl93YXRjaElkQ2xpZW50TWFwLmVudHJpZXMoKSkpIHtcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnd2F0Y2hpZCoqKioqJywgd2F0Y2hJZClcbiAgICAgICAgICAgICAgICBjbGllbnQub25NZXNzYWdlKG1zZylcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaGVhcnRiZWF0KClcbiAgICB9KVxuXG4gIHByaXZhdGUgaXNXU0Nvbm5lY3RlZCA9ICgpOiBib29sZWFuID0+IHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLl93cyAmJiB0aGlzLl93cy5yZWFkeVN0YXRlID09PSBXU19SRUFEWV9TVEFURS5PUEVOKVxuICB9XG5cbiAgcHJpdmF0ZSBvbmNlV1NDb25uZWN0ZWQgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKHRoaXMuaXNXU0Nvbm5lY3RlZCgpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fd3NJbml0UHJvbWlzZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3dzSW5pdFByb21pc2VcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5fd3NSZWFkeVN1YnNyaWJlcnMucHVzaCh7XG4gICAgICAgIHJlc29sdmUsXG4gICAgICAgIHJlamVjdFxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSB3ZWJMb2dpbiA9IGFzeW5jIChcbiAgICBlbnZJZD86IHN0cmluZyxcbiAgICByZWZyZXNoPzogYm9vbGVhblxuICApOiBQcm9taXNlPGFueT4gPT4ge1xuICAgIGlmICghcmVmcmVzaCkge1xuICAgICAgLy8gbGV0IGxvZ2luSW5mbyA9IHRoaXMuX2xvZ2luSW5mb1xuICAgICAgaWYgKGVudklkKSB7XG4gICAgICAgIGNvbnN0IGxvZ2luSW5mbyA9IHRoaXMuX2xvZ2lucy5nZXQoZW52SWQpXG4gICAgICAgIGlmIChsb2dpbkluZm8pIHtcbiAgICAgICAgICBpZiAobG9naW5JbmZvLmxvZ2dlZEluICYmIGxvZ2luSW5mby5sb2dpblJlc3VsdCkge1xuICAgICAgICAgICAgLy8gaWYgKHByb2Nlc3MuZW52LkRFQlVHKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnW3JlYWx0aW1lXSBsb2dpbjogYWxyZWFkeSBsb2dnZWQgaW4nKVxuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgcmV0dXJuIGxvZ2luSW5mby5sb2dpblJlc3VsdFxuICAgICAgICAgIH0gZWxzZSBpZiAobG9naW5JbmZvLmxvZ2dpbmdJblByb21pc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBsb2dpbkluZm8ubG9nZ2luZ0luUHJvbWlzZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZW1wdHlFbnZMb2dpbkluZm8gPSB0aGlzLl9sb2dpbnMuZ2V0KCcnKVxuICAgICAgICBpZiAoZW1wdHlFbnZMb2dpbkluZm8/LmxvZ2dpbmdJblByb21pc2UpIHtcbiAgICAgICAgICByZXR1cm4gZW1wdHlFbnZMb2dpbkluZm8ubG9nZ2luZ0luUHJvbWlzZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGNvbnNvbGUubG9nKCdbcmVhbHRpbWVdIGxvZ2luOiBsb2dnaW5nIGluJylcblxuICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZTxJTG9naW5SZXN1bHQ+KGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIGNvbnN0IHNpZ25hdHVyZSA9IGF3YWl0IHRoaXMuZ2V0U2lnbmF0dXJlKGVudklkLCByZWZyZXNoKVxuXG4gICAgICAgIGNvbnN0IHdzU2lnbiA9IGF3YWl0IHRoaXMuZ2V0V3NTaWduKClcblxuICAgICAgICAvLyBjb25zdCB3eFZlcnNpb24gPSBnZXRXWFZlcnNpb24oKVxuICAgICAgICBjb25zdCBtc2dEYXRhOiBJUmVxdWVzdE1lc3NhZ2VMb2dpbkRhdGEgPSB7XG4gICAgICAgICAgZW52SWQ6IHdzU2lnbi5lbnZJZCB8fCAnJyxcbiAgICAgICAgICBhY2Nlc3NUb2tlbjogJycsIC8vIOW3suW6n+W8g+Wtl+autVxuICAgICAgICAgIC8vIHNpZ25TdHI6IHNpZ25hdHVyZS5zaWduU3RyLFxuICAgICAgICAgIC8vIHNlY3JldFZlcnNpb246IHNpZ25hdHVyZS5zZWNyZXRWZXJzaW9uLFxuICAgICAgICAgIHJlZmVycmVyOiAnd2ViJyxcbiAgICAgICAgICBzZGtWZXJzaW9uOiAnJyxcbiAgICAgICAgICBkYXRhVmVyc2lvbjogJydcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsb2dpbk1zZzogSVJlcXVlc3RNZXNzYWdlTG9naW5Nc2cgPSB7XG4gICAgICAgICAgd2F0Y2hJZDogdW5kZWZpbmVkLFxuICAgICAgICAgIHJlcXVlc3RJZDogZ2VuUmVxdWVzdElkKCksXG4gICAgICAgICAgbXNnVHlwZTogJ0xPR0lOJyxcbiAgICAgICAgICBtc2dEYXRhLFxuICAgICAgICAgIGV4TXNnRGF0YToge1xuICAgICAgICAgICAgcnVudGltZTogZ2V0UnVudGltZSgpLFxuICAgICAgICAgICAgc2lnblN0cjogd3NTaWduLnNpZ25TdHIsXG4gICAgICAgICAgICBzZWNyZXRWZXJzaW9uOiB3c1NpZ24uc2VjcmV0VmVyc2lvblxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsb2dpblJlc01zZyA9IGF3YWl0IHRoaXMuc2VuZDxJUmVzcG9uc2VNZXNzYWdlTG9naW5SZXNNc2c+KHtcbiAgICAgICAgICBtc2c6IGxvZ2luTXNnLFxuICAgICAgICAgIHdhaXRSZXNwb25zZTogdHJ1ZSxcbiAgICAgICAgICBza2lwT25NZXNzYWdlOiB0cnVlLFxuICAgICAgICAgIHRpbWVvdXQ6IERFRkFVTFRfTE9HSU5fVElNRU9VVFxuICAgICAgICB9KVxuXG4gICAgICAgIGlmICghbG9naW5SZXNNc2cubXNnRGF0YS5jb2RlKSB7XG4gICAgICAgICAgLy8gbG9naW4gc3VjY2Vzc1xuICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgZW52SWQ6IHdzU2lnbi5lbnZJZFxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gbG9naW4gZmFpbGVkXG4gICAgICAgICAgcmVqZWN0KFxuICAgICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgJHtsb2dpblJlc01zZy5tc2dEYXRhLmNvZGV9ICR7bG9naW5SZXNNc2cubXNnRGF0YS5tZXNzYWdlfWBcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpXG4gICAgICB9XG4gICAgfSlcblxuICAgIC8vIGxldCBsb2dpbkluZm8gPSB0aGlzLl9sb2dpbkluZm9cbiAgICBsZXQgbG9naW5JbmZvID0gZW52SWQgJiYgdGhpcy5fbG9naW5zLmdldChlbnZJZClcblxuICAgIGNvbnN0IGxvZ2luU3RhcnRUUyA9IERhdGUubm93KClcblxuICAgIGlmIChsb2dpbkluZm8pIHtcbiAgICAgIGxvZ2luSW5mby5sb2dnZWRJbiA9IGZhbHNlXG4gICAgICBsb2dpbkluZm8ubG9nZ2luZ0luUHJvbWlzZSA9IHByb21pc2VcbiAgICAgIGxvZ2luSW5mby5sb2dpblN0YXJ0VFMgPSBsb2dpblN0YXJ0VFNcbiAgICB9IGVsc2Uge1xuICAgICAgbG9naW5JbmZvID0ge1xuICAgICAgICBsb2dnZWRJbjogZmFsc2UsXG4gICAgICAgIGxvZ2dpbmdJblByb21pc2U6IHByb21pc2UsXG4gICAgICAgIGxvZ2luU3RhcnRUU1xuICAgICAgfVxuICAgICAgLy8gdGhpcy5fbG9naW5JbmZvID0gbG9naW5JbmZvXG4gICAgICB0aGlzLl9sb2dpbnMuc2V0KGVudklkIHx8ICcnLCBsb2dpbkluZm8pXG4gICAgfVxuXG4gICAgLy8gdHJ5IHtcbiAgICAvLyAgIGNvbnN0IGxvZ2luUmVzdWx0ID0gYXdhaXQgcHJvbWlzZVxuICAgIC8vICAgbG9naW5JbmZvLmxvZ2dlZEluID0gdHJ1ZVxuICAgIC8vICAgbG9naW5JbmZvLmxvZ2dpbmdJblByb21pc2UgPSB1bmRlZmluZWRcbiAgICAvLyAgIGxvZ2luSW5mby5sb2dpblN0YXJ0VFMgPSB1bmRlZmluZWRcbiAgICAvLyAgIGxvZ2luSW5mby5sb2dpblJlc3VsdCA9IGxvZ2luUmVzdWx0XG4gICAgLy8gICByZXR1cm4gbG9naW5SZXN1bHRcbiAgICAvLyB9IGNhdGNoIChlKSB7XG4gICAgLy8gICBsb2dpbkluZm8ubG9nZ2VkSW4gPSBmYWxzZVxuICAgIC8vICAgbG9naW5JbmZvLmxvZ2dpbmdJblByb21pc2UgPSB1bmRlZmluZWRcbiAgICAvLyAgIGxvZ2luSW5mby5sb2dpblN0YXJ0VFMgPSB1bmRlZmluZWRcbiAgICAvLyAgIGxvZ2luSW5mby5sb2dpblJlc3VsdCA9IHVuZGVmaW5lZFxuICAgIC8vICAgdGhyb3cgZVxuICAgIC8vIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBsb2dpblJlc3VsdCA9IGF3YWl0IHByb21pc2VcbiAgICAgIGNvbnN0IGN1ckxvZ2luSW5mbyA9IGVudklkICYmIHRoaXMuX2xvZ2lucy5nZXQoZW52SWQpXG4gICAgICBpZiAoXG4gICAgICAgIGN1ckxvZ2luSW5mbyAmJlxuICAgICAgICBjdXJMb2dpbkluZm8gPT09IGxvZ2luSW5mbyAmJlxuICAgICAgICBjdXJMb2dpbkluZm8ubG9naW5TdGFydFRTID09PSBsb2dpblN0YXJ0VFNcbiAgICAgICkge1xuICAgICAgICBsb2dpbkluZm8ubG9nZ2VkSW4gPSB0cnVlXG4gICAgICAgIGxvZ2luSW5mby5sb2dnaW5nSW5Qcm9taXNlID0gdW5kZWZpbmVkXG4gICAgICAgIGxvZ2luSW5mby5sb2dpblN0YXJ0VFMgPSB1bmRlZmluZWRcbiAgICAgICAgbG9naW5JbmZvLmxvZ2luUmVzdWx0ID0gbG9naW5SZXN1bHRcbiAgICAgICAgcmV0dXJuIGxvZ2luUmVzdWx0XG4gICAgICB9IGVsc2UgaWYgKGN1ckxvZ2luSW5mbykge1xuICAgICAgICBpZiAoY3VyTG9naW5JbmZvLmxvZ2dlZEluICYmIGN1ckxvZ2luSW5mby5sb2dpblJlc3VsdCkge1xuICAgICAgICAgIHJldHVybiBjdXJMb2dpbkluZm8ubG9naW5SZXN1bHRcbiAgICAgICAgfSBlbHNlIGlmIChjdXJMb2dpbkluZm8ubG9nZ2luZ0luUHJvbWlzZSkge1xuICAgICAgICAgIHJldHVybiBjdXJMb2dpbkluZm8ubG9nZ2luZ0luUHJvbWlzZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignd3MgdW5leHBlY3RlZCBsb2dpbiBpbmZvJylcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd3cyBsb2dpbiBpbmZvIHJlc2V0JylcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2dpbkluZm8ubG9nZ2VkSW4gPSBmYWxzZVxuICAgICAgbG9naW5JbmZvLmxvZ2dpbmdJblByb21pc2UgPSB1bmRlZmluZWRcbiAgICAgIGxvZ2luSW5mby5sb2dpblN0YXJ0VFMgPSB1bmRlZmluZWRcbiAgICAgIGxvZ2luSW5mby5sb2dpblJlc3VsdCA9IHVuZGVmaW5lZFxuICAgICAgdGhyb3cgZVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0V3NTaWduID0gYXN5bmMgKCk6IFByb21pc2U8SVdzU2lnbj4gPT4ge1xuICAgIGlmICh0aGlzLl93c1NpZ24gJiYgdGhpcy5fd3NTaWduLmV4cGlyZWRUcyA+IERhdGUubm93KCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl93c1NpZ25cbiAgICB9XG4gICAgY29uc3QgZXhwaXJlZFRzID0gRGF0ZS5ub3coKSArIDYwMDAwXG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5fY29udGV4dC5hcHBDb25maWcucmVxdWVzdC5zZW5kKCdhdXRoLndzV2ViU2lnbicsIHtydW50aW1lOiBnZXRSdW50aW1lKCl9KVxuXG4gICAgaWYgKHJlcy5jb2RlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFt0Y2ItanMtc2RrXSDojrflj5blrp7ml7bmlbDmja7mjqjpgIHnmbvlvZXnpajmja7lpLHotKU6ICR7cmVzLmNvZGV9YClcbiAgICB9XG5cbiAgICBpZiAocmVzLmRhdGEpIHtcbiAgICAgIGNvbnN0IHtzaWduU3RyLCB3c1VybCwgc2VjcmV0VmVyc2lvbiwgZW52SWR9ID0gcmVzLmRhdGFcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNpZ25TdHIsXG4gICAgICAgIHdzVXJsLFxuICAgICAgICBzZWNyZXRWZXJzaW9uLFxuICAgICAgICBlbnZJZCxcbiAgICAgICAgZXhwaXJlZFRzXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignW3RjYi1qcy1zZGtdIOiOt+WPluWunuaXtuaVsOaNruaOqOmAgeeZu+W9leelqOaNruWksei0pScpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRXYWl0RXhwZWN0ZWRUaW1lb3V0TGVuZ3RoID0gKCkgPT4ge1xuICAgIGlmICghdGhpcy5fcnR0T2JzZXJ2ZWQubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gREVGQVVMVF9FWFBFQ1RFRF9FVkVOVF9XQUlUX1RJTUVcbiAgICB9XG5cbiAgICAvLyAxLjUgKiBSVFRcbiAgICByZXR1cm4gKFxuICAgICAgKHRoaXMuX3J0dE9ic2VydmVkLnJlZHVjZSgoYWNjLCBjdXIpID0+IGFjYyArIGN1cikgL1xuICAgICAgICB0aGlzLl9ydHRPYnNlcnZlZC5sZW5ndGgpICpcbiAgICAgIDEuNVxuICAgIClcbiAgfVxuXG4gIHByaXZhdGUgaGVhcnRiZWF0KGltbWVkaWF0ZT86IGJvb2xlYW4pIHtcbiAgICB0aGlzLmNsZWFySGVhcnRiZWF0KClcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgdGhpcy5fcGluZ1RpbWVvdXRJZCA9IHNldFRpbWVvdXQoXG4gICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKCF0aGlzLl93cyB8fCB0aGlzLl93cy5yZWFkeVN0YXRlICE9PSBXU19SRUFEWV9TVEFURS5PUEVOKSB7XG4gICAgICAgICAgICAvLyBubyBuZWVkIHRvIHBpbmdcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuX2xhc3RQaW5nU2VuZFRTID0gRGF0ZS5ub3coKVxuICAgICAgICAgIGF3YWl0IHRoaXMucGluZygpXG4gICAgICAgICAgdGhpcy5fcGluZ0ZhaWxlZCA9IDBcblxuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICB0aGlzLl9wb25nVGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdwb25nIHRpbWVkIG91dCcpXG4gICAgICAgICAgICBpZiAodGhpcy5fcG9uZ01pc3NlZCA8IERFRkFVTFRfUE9OR19NSVNTX1RPTEVSQU5DRSkge1xuICAgICAgICAgICAgICB0aGlzLl9wb25nTWlzc2VkKytcbiAgICAgICAgICAgICAgdGhpcy5oZWFydGJlYXQodHJ1ZSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIGxvZ2ljYWwgcGVyY2VpdmVkIGNvbm5lY3Rpb24gbG9zdCwgZXZlbiB0aG91Z2ggd2Vic29ja2V0IGRpZCBub3QgcmVjZWl2ZSBlcnJvciBvciBjbG9zZSBldmVudFxuICAgICAgICAgICAgICB0aGlzLmluaXRXZWJTb2NrZXRDb25uZWN0aW9uKHRydWUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgdGhpcy5fY29udGV4dC5hcHBDb25maWcucmVhbHRpbWVQb25nV2FpdFRpbWVvdXQpXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAodGhpcy5fcGluZ0ZhaWxlZCA8IERFRkFVTFRfUElOR19GQUlMX1RPTEVSQU5DRSkge1xuICAgICAgICAgICAgdGhpcy5fcGluZ0ZhaWxlZCsrXG4gICAgICAgICAgICB0aGlzLmhlYXJ0YmVhdCgpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2UoQ0xPU0VfRVZFTlRfQ09ERS5IZWFydGJlYXRQaW5nRXJyb3IpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgaW1tZWRpYXRlID8gMCA6IHRoaXMuX2NvbnRleHQuYXBwQ29uZmlnLnJlYWx0aW1lUGluZ0ludGVydmFsXG4gICAgKVxuICB9XG5cbiAgcHJpdmF0ZSBwaW5nID0gYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG1zZzogSVJlcXVlc3RNZXNzYWdlUGluZ01zZyA9IHtcbiAgICAgIHdhdGNoSWQ6IHVuZGVmaW5lZCxcbiAgICAgIHJlcXVlc3RJZDogZ2VuUmVxdWVzdElkKCksXG4gICAgICBtc2dUeXBlOiAnUElORycsXG4gICAgICBtc2dEYXRhOiBudWxsXG4gICAgfVxuICAgIGF3YWl0IHRoaXMuc2VuZCh7XG4gICAgICBtc2dcbiAgICB9KVxuICAgIC8vIGNvbnNvbGUubG9nKCdwaW5nIHNlbnQnKVxuICB9XG5cbiAgcHJpdmF0ZSBvbldhdGNoU3RhcnQgPSAoY2xpZW50OiBWaXJ0dWFsV2ViU29ja2V0Q2xpZW50LCBxdWVyeUlEOiBzdHJpbmcpID0+IHtcbiAgICB0aGlzLl9xdWVyeUlkQ2xpZW50TWFwLnNldChxdWVyeUlELCBjbGllbnQpXG4gIH1cblxuICBwcml2YXRlIG9uV2F0Y2hDbG9zZSA9IChjbGllbnQ6IFZpcnR1YWxXZWJTb2NrZXRDbGllbnQsIHF1ZXJ5SUQ6IHN0cmluZykgPT4ge1xuICAgIGlmIChxdWVyeUlEKSB7XG4gICAgICB0aGlzLl9xdWVyeUlkQ2xpZW50TWFwLmRlbGV0ZShxdWVyeUlEKVxuICAgIH1cbiAgICB0aGlzLl93YXRjaElkQ2xpZW50TWFwLmRlbGV0ZShjbGllbnQud2F0Y2hJZClcbiAgICB0aGlzLl92aXJ0dWFsV1NDbGllbnQuZGVsZXRlKGNsaWVudClcblxuICAgIGlmICghdGhpcy5fdmlydHVhbFdTQ2xpZW50LnNpemUpIHtcbiAgICAgIC8vIG5vIG1vcmUgZXhpc3Rpbmcgd2F0Y2gsIHdlIHNob3VsZCByZWxlYXNlIHRoZSB3ZWJzb2NrZXQgY29ubmVjdGlvblxuICAgICAgdGhpcy5jbG9zZShDTE9TRV9FVkVOVF9DT0RFLk5vUmVhbHRpbWVMaXN0ZW5lcnMpXG4gICAgfVxuICB9XG59XG4iXX0=
746
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93ZWJzb2NrZXQtY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNEJBQTRCLENBQUE7QUFDbkUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQWN4QyxPQUFPLEVBQ0wsY0FBYyxFQUNkLHFCQUFxQixFQUNyQixlQUFlLEdBQ2hCLE1BQU0sWUFBWSxDQUFBO0FBRW5CLE9BQU8sRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLHlCQUF5QixFQUFFLGFBQWEsRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQUMxRixPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUNqRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBNEQvQixJQUFNLGNBQWMsR0FBRztJQUNyQixVQUFVLEVBQUUsQ0FBQztJQUNiLElBQUksRUFBRSxDQUFDO0lBQ1AsT0FBTyxFQUFFLENBQUM7SUFDVixNQUFNLEVBQUUsQ0FBQztDQUNWLENBQUE7QUFFRCxJQUFNLGdCQUFnQixHQUFHLENBQUMsQ0FBQTtBQUMxQixJQUFNLGdDQUFnQyxHQUFHLElBQUksQ0FBQTtBQUM3QyxJQUFNLCtCQUErQixHQUFHLEtBQUssQ0FBQTtBQUM3QyxJQUFNLHFCQUFxQixHQUFHLENBQUMsQ0FBQTtBQUMvQixJQUFNLDZCQUE2QixHQUFHLEtBQUssQ0FBQTtBQUUzQyxJQUFNLDJCQUEyQixHQUFHLENBQUMsQ0FBQTtBQUNyQyxJQUFNLDJCQUEyQixHQUFHLENBQUMsQ0FBQTtBQUNyQyxJQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQTtBQUVsQztJQStCRSxpQ0FBWSxPQUFtRDtRQUEvRCxpQkFLQztR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LENBQUMsVUFBVSxHQUFHLDJCQUEyQixFQUFFO2dDQUNqRCxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsQ0FBQTtnQ0FDcEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFBOzZCQUNqQjtpQ0FBTTtnQ0FDTCxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBOzZCQUM5Qzs7Ozs7aUJBRUosQ0FDRixFQUFFLENBQUE7UUFDTCxDQUFDLEVBQ0QsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLG9CQUFvQixDQUM1RCxDQUFBO0lBQ0gsQ0FBQztJQThCSCw4QkFBQztBQUFELENBQUMsQUE1cUJELElBNHFCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFZpcnR1YWxXZWJTb2NrZXRDbGllbnQgfSBmcm9tICcuL3ZpcnR1YWwtd2Vic29ja2V0LWNsaWVudCdcbmltcG9ydCB7IGdlblJlcXVlc3RJZCB9IGZyb20gJy4vbWVzc2FnZSdcbmltcG9ydCB7XG4gIElEYXRhYmFzZVNlcnZpY2VDb250ZXh0LFxufSBmcm9tICdAY2xvdWRiYXNlL3R5cGVzL2RhdGFiYXNlJ1xuaW1wb3J0IHtcbiAgSVdhdGNoT3B0aW9ucyxcbiAgREJSZWFsdGltZUxpc3RlbmVyLFxuICBJUmVxdWVzdE1lc3NhZ2UsXG4gIElSZXNwb25zZU1lc3NhZ2UsXG4gIElSZXF1ZXN0TWVzc2FnZVBpbmdNc2csXG4gIElSZXF1ZXN0TWVzc2FnZUxvZ2luTXNnLFxuICBJUmVzcG9uc2VNZXNzYWdlTG9naW5SZXNNc2csXG4gIElSZXF1ZXN0TWVzc2FnZUxvZ2luRGF0YSxcbn0gZnJvbSAnQGNsb3VkYmFzZS90eXBlcy9yZWFsdGltZSdcbmltcG9ydCB7XG4gIENsb3NlRXZlbnRDb2RlLFxuICBDTE9TRV9FVkVOVF9DT0RFX0lORk8sXG4gIGdldFdTQ2xvc2VFcnJvcixcbn0gZnJvbSAnLi93cy1ldmVudCdcblxuaW1wb3J0IHsgRVJSX0NPREUsIFRpbWVvdXRFcnJvciwgUmVhbHRpbWVFcnJvck1lc3NhZ2VFcnJvciwgQ2xvdWRTREtFcnJvciB9IGZyb20gJy4vZXJyb3InXG5pbXBvcnQgeyBnZXRXc0NsYXNzLCBnZXRSdW50aW1lIH0gZnJvbSAnLi9jb21tb24nXG5pbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4vdXRpbHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgSVJlYWx0aW1lV2ViU29ja2V0Q2xpZW50Q29uc3RydWN0b3JPcHRpb25zIHtcbiAgbWF4UmVjb25uZWN0PzogbnVtYmVyXG4gIHJlY29ubmVjdEludGVydmFsPzogbnVtYmVyXG4gIGNvbnRleHQ6IElEYXRhYmFzZVNlcnZpY2VDb250ZXh0XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNpZ25hdHVyZSB7XG4gIGVudklkOiBzdHJpbmdcbiAgc2VjcmV0VmVyc2lvbjogbnVtYmVyXG4gIHNpZ25TdHI6IHN0cmluZ1xuICB3c1VybDogc3RyaW5nXG4gIGV4cGlyZVRTOiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJTG9naW5JbmZvIHtcbiAgbG9nZ2VkSW46IGJvb2xlYW5cbiAgbG9nZ2luZ0luUHJvbWlzZT86IFByb21pc2U8SUxvZ2luUmVzdWx0PlxuICBsb2dpblN0YXJ0VFM/OiBudW1iZXJcbiAgbG9naW5SZXN1bHQ/OiBJTG9naW5SZXN1bHRcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJTG9naW5SZXN1bHQge1xuICBlbnZJZDogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVdTU2VuZE9wdGlvbnMge1xuICBtc2c6IElSZXF1ZXN0TWVzc2FnZVxuICB3YWl0UmVzcG9uc2U/OiBib29sZWFuXG4gIC8vIHdoZW4gd2FpdFJlc3BvbnNlIGlzIHNldCB0byB0cnVlLCBpZiBza2lwT25NZXNzYWdlIGlzIHRydWUsIGdlbmVyYWwgb25NZXNzYWdlIGhhbmRsZXIgd2lsbCBiZSBza2lwcGVkXG4gIHNraXBPbk1lc3NhZ2U/OiBib29sZWFuXG4gIHRpbWVvdXQ/OiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJV1NXYXRjaE9wdGlvbnMgZXh0ZW5kcyBJV2F0Y2hPcHRpb25zIHtcbiAgZW52SWQ/OiBzdHJpbmdcbiAgY29sbGVjdGlvbk5hbWU6IHN0cmluZ1xuICBxdWVyeTogc3RyaW5nXG4gIGxpbWl0PzogbnVtYmVyXG4gIG9yZGVyQnk/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG59XG5cbmludGVyZmFjZSBJUmVzb2x2ZVJlamVjdCB7XG4gIHJlc29sdmU6ICh2YWx1ZT86IGFueSB8IFByb21pc2VMaWtlPGFueT4gfCB1bmRlZmluZWQpID0+IHZvaWRcbiAgcmVqZWN0OiAocmVhc29uPzogYW55KSA9PiB2b2lkXG59XG5cbmludGVyZmFjZSBJUmVzcG9uc2VXYWl0U3BlYyBleHRlbmRzIElSZXNvbHZlUmVqZWN0IHtcbiAgc2tpcE9uTWVzc2FnZT86IGJvb2xlYW5cbn1cblxuaW50ZXJmYWNlIElXc1NpZ24ge1xuICBzaWduU3RyOiBzdHJpbmcsXG4gIHdzVXJsOiBzdHJpbmcsXG4gIHNlY3JldFZlcnNpb246IHN0cmluZ1xuICBlbnZJZDogc3RyaW5nXG4gIGV4cGlyZWRUczogbnVtYmVyXG59XG5cbmNvbnN0IFdTX1JFQURZX1NUQVRFID0ge1xuICBDT05ORUNUSU5HOiAwLFxuICBPUEVOOiAxLFxuICBDTE9TSU5HOiAyLFxuICBDTE9TRUQ6IDMsXG59XG5cbmNvbnN0IE1BWF9SVFRfT0JTRVJWRUQgPSAzXG5jb25zdCBERUZBVUxUX0VYUEVDVEVEX0VWRU5UX1dBSVRfVElNRSA9IDUwMDBcbmNvbnN0IERFRkFVTFRfVU5UUlVTVEVEX1JUVF9USFJFU0hPTEQgPSAxMDAwMFxuY29uc3QgREVGQVVMVF9NQVhfUkVDT05ORUNUID0gNVxuY29uc3QgREVGQVVMVF9XU19SRUNPTk5FQ1RfSU5URVJWQUwgPSAxMDAwMFxuLy8gY29uc3QgREVGQVVMVF9XU19SRUNPTk5FQ1RfTUFYX1ZBTElEX0lOVEVSVkFMID0gMyAqIDYwICogMTAwMFxuY29uc3QgREVGQVVMVF9QSU5HX0ZBSUxfVE9MRVJBTkNFID0gMlxuY29uc3QgREVGQVVMVF9QT05HX01JU1NfVE9MRVJBTkNFID0gMlxuY29uc3QgREVGQVVMVF9MT0dJTl9USU1FT1VUID0gNTAwMFxuXG5leHBvcnQgY2xhc3MgUmVhbHRpbWVXZWJTb2NrZXRDbGllbnQge1xuICBwcml2YXRlIHZpcnR1YWxXU0NsaWVudDogU2V0PFZpcnR1YWxXZWJTb2NrZXRDbGllbnQ+ID0gbmV3IFNldCgpXG4gIC8vIGFmdGVyIGxpc3RlbmVyIGluaXRXYXRjaCwgdGhlIGxpc3RlbmVyIGhhcyB0aGUgcXVlcnlJRCBhbmQgY2FuIHN0b3JlIGl0IGhlcmVcbiAgcHJpdmF0ZSBxdWVyeUlkQ2xpZW50TWFwOiBNYXA8c3RyaW5nLCBWaXJ0dWFsV2ViU29ja2V0Q2xpZW50PiA9IG5ldyBNYXAoKVxuICBwcml2YXRlIHdhdGNoSWRDbGllbnRNYXA6IE1hcDxzdHJpbmcsIFZpcnR1YWxXZWJTb2NrZXRDbGllbnQ+ID0gbmV3IE1hcCgpXG4gIHByaXZhdGUgbWF4UmVjb25uZWN0OiBudW1iZXJcbiAgLy8gcHJpdmF0ZSBfYXZhaWxhYmxlUmV0cmllczogbnVtYmVyXG4gIHByaXZhdGUgcmVjb25uZWN0SW50ZXJ2YWw6IG51bWJlclxuICBwcml2YXRlIGNvbnRleHQ6IElEYXRhYmFzZVNlcnZpY2VDb250ZXh0XG4gIC8vIHByaXZhdGUgX3dzPzogV1hOUy5Tb2NrZXQuSVNvY2tldFRhc2tcbiAgcHJpdmF0ZSB3cz86IGFueVxuICBwcml2YXRlIGxhc3RQaW5nU2VuZFRTPzogbnVtYmVyXG4gIHByaXZhdGUgcGluZ0ZhaWxlZCA9IDBcbiAgcHJpdmF0ZSBwb25nTWlzc2VkID0gMFxuICBwcml2YXRlIHBpbmdUaW1lb3V0SWQ/OiBudW1iZXJcbiAgcHJpdmF0ZSBwb25nVGltZW91dElkPzogbnVtYmVyXG4gIHByaXZhdGUgbG9naW5zOiBNYXA8c3RyaW5nIC8qIGVudklkICovLCBJTG9naW5JbmZvPiA9IG5ldyBNYXAoKVxuICAvLyBwcml2YXRlIF9sb2dpbkluZm86IElMb2dpbkluZm9cbiAgLy8gcHJpdmF0ZSBfc2lnbmF0dXJlczogTWFwPHN0cmluZyAvKiBlbnZJZCAqLywgSVNpZ25hdHVyZT4gPSBuZXcgTWFwKClcbiAgcHJpdmF0ZSB3c0luaXRQcm9taXNlPzogUHJvbWlzZTx2b2lkPlxuICBwcml2YXRlIHdzUmVhZHlTdWJzcmliZXJzOiBJUmVzb2x2ZVJlamVjdFtdID0gW11cbiAgcHJpdmF0ZSB3c1Jlc3BvbnNlV2FpdDogTWFwPFxuICBzdHJpbmcgLyogcmVxdWVzdElkICovLFxuICBJUmVzcG9uc2VXYWl0U3BlY1xuICA+ID0gbmV3IE1hcCgpXG4gIHByaXZhdGUgcnR0T2JzZXJ2ZWQ6IG51bWJlcltdID0gW11cbiAgcHJpdmF0ZSByZWNvbm5lY3RTdGF0ZTogYm9vbGVhblxuICAvLyBvYnRhaW5lZCBmcm9tIHRoZSBmaXJzdCBnZXRTaWduYXR1cmUgd2l0aCBubyBlbnZJZCBwcm92aWRlZFxuICAvLyBwcml2YXRlIF9kZWZhdWx0RW52SWQ/OiBzdHJpbmdcbiAgcHJpdmF0ZSB3c1NpZ246IElXc1NpZ25cblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJUmVhbHRpbWVXZWJTb2NrZXRDbGllbnRDb25zdHJ1Y3Rvck9wdGlvbnMpIHtcbiAgICB0aGlzLm1heFJlY29ubmVjdCA9IG9wdGlvbnMubWF4UmVjb25uZWN0IHx8IERFRkFVTFRfTUFYX1JFQ09OTkVDVFxuICAgIC8vIHRoaXMuX2F2YWlsYWJsZVJldHJpZXMgPSB0aGlzLl9tYXhSZWNvbm5lY3RcbiAgICB0aGlzLnJlY29ubmVjdEludGVydmFsID0gb3B0aW9ucy5yZWNvbm5lY3RJbnRlcnZhbCB8fCBERUZBVUxUX1dTX1JFQ09OTkVDVF9JTlRFUlZBTFxuICAgIHRoaXMuY29udGV4dCA9IG9wdGlvbnMuY29udGV4dFxuICB9XG5cbiAgY2xlYXJIZWFydGJlYXQoKSB7XG4gICAgdGhpcy5waW5nVGltZW91dElkICYmIGNsZWFyVGltZW91dCh0aGlzLnBpbmdUaW1lb3V0SWQpXG4gICAgdGhpcy5wb25nVGltZW91dElkICYmIGNsZWFyVGltZW91dCh0aGlzLnBvbmdUaW1lb3V0SWQpXG4gIH1cblxuICBzZW5kID0gYXN5bmMgPFQgPSBhbnk+KG9wdHM6IElXU1NlbmRPcHRpb25zKTogUHJvbWlzZTxUPiA9PiBuZXcgUHJvbWlzZTxUPigoX3Jlc29sdmUsIF9yZWplY3QpID0+IHtcbiAgICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgICBsZXQgdGltZW91dElkOiBudW1iZXJcbiAgICAgIGxldCBoYXNSZXNvbHZlZCA9IGZhbHNlXG4gICAgICBsZXQgaGFzUmVqZWN0ZWQgPSBmYWxzZVxuXG4gICAgICBjb25zdCByZXNvbHZlOiB0eXBlb2YgX3Jlc29sdmUgPSAodmFsdWU/OiBUIHwgUHJvbWlzZUxpa2U8VD4gfCB1bmRlZmluZWQpID0+IHtcbiAgICAgICAgaGFzUmVzb2x2ZWQgPSB0cnVlXG4gICAgICAgIHRpbWVvdXRJZCAmJiBjbGVhclRpbWVvdXQodGltZW91dElkKVxuICAgICAgICBfcmVzb2x2ZSh2YWx1ZSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVqZWN0OiB0eXBlb2YgX3JlamVjdCA9IChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgIGhhc1JlamVjdGVkID0gdHJ1ZVxuICAgICAgICB0aW1lb3V0SWQgJiYgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZClcbiAgICAgICAgX3JlamVjdChlcnJvcilcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdHMudGltZW91dCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWhhc1Jlc29sdmVkIHx8ICFoYXNSZWplY3RlZCkge1xuICAgICAgICAgICAgICAvLyB3YWl0IGFub3RoZXIgaW1tZWRpYXRlIHRpbWVvdXQgdG8gYWxsb3cgdGhlIHN1Y2Nlc3MvZmFpbCBjYWxsYmFjayB0byBiZSBpbnZva2VkIGlmIHdzIGhhcyBhbHJlYWR5IGdvdCB0aGUgcmVzdWx0LFxuICAgICAgICAgICAgICAvLyB0aGlzIGlzIGJlY2F1c2UgdGhlIHRpbWVyIGlzIHJlZ2lzdGVyZWQgYmVmb3JlIHdzLnNlbmRcbiAgICAgICAgICAgICAgYXdhaXQgc2xlZXAoMClcbiAgICAgICAgICAgICAgaWYgKCFoYXNSZXNvbHZlZCB8fCAhaGFzUmVqZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICByZWplY3QobmV3IFRpbWVvdXRFcnJvcignd3NjbGllbnQuc2VuZCB0aW1lZG91dCcpKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkoKVxuICAgICAgICB9LCBvcHRzLnRpbWVvdXQpXG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICh0aGlzLndzSW5pdFByb21pc2UgIT09IHVuZGVmaW5lZCB8fCB0aGlzLndzSW5pdFByb21pc2UgIT09IG51bGwpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLndzSW5pdFByb21pc2VcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy53cykge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ2ludmFsaWQgc3RhdGU6IHdzIGNvbm5lY3Rpb24gbm90IGV4aXN0cywgY2FuIG5vdCBzZW5kIG1lc3NhZ2UnKSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLndzLnJlYWR5U3RhdGUgIT09IFdTX1JFQURZX1NUQVRFLk9QRU4pIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKGB3cyByZWFkeVN0YXRlIGludmFsaWQ6ICR7dGhpcy53cy5yZWFkeVN0YXRlfSwgY2FuIG5vdCBzZW5kIG1lc3NhZ2VgKSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRzLndhaXRSZXNwb25zZSkge1xuICAgICAgICAgIGNvbnN0IHJlc3BXYWl0U3BlYzogSVJlc3BvbnNlV2FpdFNwZWMgPSB7XG4gICAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgICAgcmVqZWN0LFxuICAgICAgICAgICAgc2tpcE9uTWVzc2FnZTogb3B0cy5za2lwT25NZXNzYWdlLFxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLndzUmVzcG9uc2VXYWl0LnNldChvcHRzLm1zZy5yZXF1ZXN0SWQsIHJlc3BXYWl0U3BlYylcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdzZW5kIG1zZzonLCBvcHRzLm1zZylcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLndzLnNlbmQoSlNPTi5zdHJpbmdpZnkob3B0cy5tc2cpKVxuICAgICAgICAgIGlmICghb3B0cy53YWl0UmVzcG9uc2UpIHtcbiAgICAgICAgICAgIHJlc29sdmUodm9pZCAwKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgcmVqZWN0KGVycilcbiAgICAgICAgICAgIGlmIChvcHRzLndhaXRSZXNwb25zZSkge1xuICAgICAgICAgICAgICB0aGlzLndzUmVzcG9uc2VXYWl0LmRlbGV0ZShvcHRzLm1zZy5yZXF1ZXN0SWQpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlamVjdChlKVxuICAgICAgfVxuICAgIH0pKClcbiAgfSlcblxuICBjbG9zZShjb2RlOiBDbG9zZUV2ZW50Q29kZSkge1xuICAgIHRoaXMuY2xlYXJIZWFydGJlYXQoKVxuXG4gICAgaWYgKHRoaXMud3MpIHtcbiAgICAgIHRoaXMud3MuY2xvc2UoY29kZSwgQ0xPU0VfRVZFTlRfQ09ERV9JTkZPW2NvZGVdLm5hbWUpXG4gICAgICB0aGlzLndzID0gdW5kZWZpbmVkXG4gICAgfVxuICB9XG5cbiAgY2xvc2VBbGxDbGllbnRzID0gKGVycm9yOiBhbnkpID0+IHtcbiAgICB0aGlzLnZpcnR1YWxXU0NsaWVudC5mb3JFYWNoKChjbGllbnQpID0+IHtcbiAgICAgIGNsaWVudC5jbG9zZVdpdGhFcnJvcihlcnJvcilcbiAgICB9KVxuICB9XG5cbiAgcGF1c2VDbGllbnRzID0gKGNsaWVudHM/OiBTZXQ8VmlydHVhbFdlYlNvY2tldENsaWVudD4pID0+IHtcbiAgICAoY2xpZW50cyB8fCB0aGlzLnZpcnR1YWxXU0NsaWVudCkuZm9yRWFjaCgoY2xpZW50KSA9PiB7XG4gICAgICBjbGllbnQucGF1c2UoKVxuICAgIH0pXG4gIH1cblxuICByZXN1bWVDbGllbnRzID0gKGNsaWVudHM/OiBTZXQ8VmlydHVhbFdlYlNvY2tldENsaWVudD4pID0+IHtcbiAgICAoY2xpZW50cyB8fCB0aGlzLnZpcnR1YWxXU0NsaWVudCkuZm9yRWFjaCgoY2xpZW50KSA9PiB7XG4gICAgICBjbGllbnQucmVzdW1lKClcbiAgICB9KVxuICB9XG5cbiAgd2F0Y2gob3B0aW9uczogSVdTV2F0Y2hPcHRpb25zKTogREJSZWFsdGltZUxpc3RlbmVyIHtcbiAgICBpZiAoIXRoaXMud3MgJiYgKHRoaXMud3NJbml0UHJvbWlzZSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMud3NJbml0UHJvbWlzZSA9PT0gbnVsbCkpIHtcbiAgICAgIHRoaXMuaW5pdFdlYlNvY2tldENvbm5lY3Rpb24oZmFsc2UpXG4gICAgfVxuXG4gICAgY29uc3QgdmlydHVhbENsaWVudCA9IG5ldyBWaXJ0dWFsV2ViU29ja2V0Q2xpZW50KHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBzZW5kOiB0aGlzLnNlbmQsXG4gICAgICBsb2dpbjogdGhpcy53ZWJMb2dpbixcbiAgICAgIGlzV1NDb25uZWN0ZWQ6IHRoaXMuaXNXU0Nvbm5lY3RlZCxcbiAgICAgIG9uY2VXU0Nvbm5lY3RlZDogdGhpcy5vbmNlV1NDb25uZWN0ZWQsXG4gICAgICBnZXRXYWl0RXhwZWN0ZWRUaW1lb3V0TGVuZ3RoOiB0aGlzLmdldFdhaXRFeHBlY3RlZFRpbWVvdXRMZW5ndGgsXG4gICAgICBvbldhdGNoU3RhcnQ6IHRoaXMub25XYXRjaFN0YXJ0LFxuICAgICAgb25XYXRjaENsb3NlOiB0aGlzLm9uV2F0Y2hDbG9zZSxcbiAgICAgIGRlYnVnOiB0cnVlLFxuICAgIH0pXG4gICAgdGhpcy52aXJ0dWFsV1NDbGllbnQuYWRkKHZpcnR1YWxDbGllbnQpXG4gICAgdGhpcy53YXRjaElkQ2xpZW50TWFwLnNldCh2aXJ0dWFsQ2xpZW50LndhdGNoSWQsIHZpcnR1YWxDbGllbnQpXG4gICAgcmV0dXJuIHZpcnR1YWxDbGllbnQubGlzdGVuZXJcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFdlYlNvY2tldENvbm5lY3Rpb24gPSBhc3luYyAoXG4gICAgcmVjb25uZWN0OiBib29sZWFuLFxuICAgIGF2YWlsYWJsZVJldHJpZXM6IG51bWJlciA9IHRoaXMubWF4UmVjb25uZWN0XG4gICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIC8vIOW9k+WJjeWkhOS6juato+WcqOmHjei/nuS4reeahOeKtuaAgVxuICAgIGlmIChyZWNvbm5lY3QgJiYgdGhpcy5yZWNvbm5lY3RTdGF0ZSkge1xuICAgICAgcmV0dXJuIC8vIOW/veeVpVxuICAgIH1cblxuICAgIGlmIChyZWNvbm5lY3QpIHtcbiAgICAgIHRoaXMucmVjb25uZWN0U3RhdGUgPSB0cnVlIC8vIOmHjei/nueKtuaAgeW8gOWni1xuICAgIH1cblxuICAgIGlmICh0aGlzLndzSW5pdFByb21pc2UgIT09IHVuZGVmaW5lZCAmJiB0aGlzLndzSW5pdFByb21pc2UgIT09IG51bGwpIHtcbiAgICAgIC8vIHRoZXJlIGFscmVhZHkgZXhpc3RzIGEgd2Vic29ja2V0IGluaXRpYXRpb24sIGp1c3Qgd2FpdCBmb3IgaXRcbiAgICAgIHJldHVybiB0aGlzLndzSW5pdFByb21pc2VcbiAgICB9XG5cbiAgICBpZiAocmVjb25uZWN0KSB7XG4gICAgICB0aGlzLnBhdXNlQ2xpZW50cygpXG4gICAgfVxuXG4gICAgdGhpcy5jbG9zZShDbG9zZUV2ZW50Q29kZS5SZWNvbm5lY3RXZWJTb2NrZXQpXG5cbiAgICB0aGlzLndzSW5pdFByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHdzU2lnbiA9IGF3YWl0IHRoaXMuZ2V0V3NTaWduKClcblxuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChzdWNjZXNzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB1cmwgPSB3c1NpZ24ud3NVcmwgfHwgJ3dzczovL3RjYi13cy50ZW5jZW50Y2xvdWRhcGkuY29tJ1xuICAgICAgICAgICAgY29uc3Qgd3NDbGFzcyA9IGdldFdzQ2xhc3MoKVxuICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lICovXG4gICAgICAgICAgICB0aGlzLndzID0gd3NDbGFzcyA/IG5ldyB3c0NsYXNzKHVybCkgOiBuZXcgV2ViU29ja2V0KHVybClcbiAgICAgICAgICAgIHN1Y2Nlc3Modm9pZCAwKVxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICBpZiAodGhpcy53cy5jb25uZWN0KSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLndzLmNvbm5lY3QoKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGF3YWl0IHRoaXMuaW5pdFdlYlNvY2tldEV2ZW50KClcbiAgICAgICAgICByZXNvbHZlKClcblxuICAgICAgICAgIGlmIChyZWNvbm5lY3QpIHtcbiAgICAgICAgICAgIHRoaXMucmVzdW1lQ2xpZW50cygpXG4gICAgICAgICAgICB0aGlzLnJlY29ubmVjdFN0YXRlID0gZmFsc2UgLy8g6YeN6L+e54q25oCB57uT5p2fXG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignW3JlYWx0aW1lXSBpbml0V2ViU29ja2V0Q29ubmVjdGlvbiBjb25uZWN0IGZhaWwnLCBlKVxuXG4gICAgICAgICAgaWYgKGF2YWlsYWJsZVJldHJpZXMgPiAwKSB7XG4gICAgICAgICAgICAvLyB0aGlzIGlzIGFuIG9wdGltaXphdGlvbiwgaW4gY2FzZSBvZiBuZXR3b3JrIG9mZmxpbmUsIHdlIGRvbid0IG5lZWQgdG8gc3R1YmJvcm5seSBzbGVlcCBmb3Igc29tZXRpbWUsXG4gICAgICAgICAgICAvLyB3ZSBvbmx5IG5lZWQgdG8gd2FpdCBmb3IgdGhlIG5ldHdvcmsgdG8gYmUgYmFjayBvbmxpbmUsIHRoaXMgZW5zdXJlcyBtaW5pbXVtIGRvd250aW1lXG4gICAgICAgICAgICAvLyBjb25zdCB7IGlzQ29ubmVjdGVkIH0gPSBhd2FpdCBnZXROZXR3b3JrU3RhdHVzKClcbiAgICAgICAgICAgIGNvbnN0IGlzQ29ubmVjdGVkID0gdHJ1ZVxuXG4gICAgICAgICAgICB0aGlzLndzSW5pdFByb21pc2UgPSB1bmRlZmluZWRcblxuICAgICAgICAgICAgaWYgKGlzQ29ubmVjdGVkKSB7XG4gICAgICAgICAgICAgIGF3YWl0IHNsZWVwKHRoaXMucmVjb25uZWN0SW50ZXJ2YWwpXG4gICAgICAgICAgICAgIGlmIChyZWNvbm5lY3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlY29ubmVjdFN0YXRlID0gZmFsc2UgLy8g6YeN6L+e5byC5bi45Lmf566X6YeN6L+e54q25oCB57uT5p2fXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLmluaXRXZWJTb2NrZXRDb25uZWN0aW9uKHJlY29ubmVjdCwgYXZhaWxhYmxlUmV0cmllcyAtIDEpKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZWplY3QoZSlcblxuICAgICAgICAgICAgaWYgKHJlY29ubmVjdCkge1xuICAgICAgICAgICAgICB0aGlzLmNsb3NlQWxsQ2xpZW50cyhuZXcgQ2xvdWRTREtFcnJvcih7XG4gICAgICAgICAgICAgICAgZXJyQ29kZTogRVJSX0NPREUuU0RLX0RBVEFCQVNFX1JFQUxUSU1FX0xJU1RFTkVSX1JFQ09OTkVDVF9XQVRDSF9GQUlMIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICBlcnJNc2c6IGUsXG4gICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSkoKVxuICAgIH0pXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy53c0luaXRQcm9taXNlXG4gICAgICB0aGlzLndzUmVhZHlTdWJzcmliZXJzLmZvckVhY2goKHsgcmVzb2x2ZSB9KSA9PiByZXNvbHZlKCkpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy53c1JlYWR5U3Vic3JpYmVycy5mb3JFYWNoKCh7IHJlamVjdCB9KSA9PiByZWplY3QoKSlcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy53c0luaXRQcm9taXNlID0gdW5kZWZpbmVkXG4gICAgICB0aGlzLndzUmVhZHlTdWJzcmliZXJzID0gW11cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluaXRXZWJTb2NrZXRFdmVudCA9ICgpID0+IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBpZiAoIXRoaXMud3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY2FuIG5vdCBpbml0V2ViU29ja2V0RXZlbnQsIHdzIG5vdCBleGlzdHMnKVxuICAgIH1cblxuICAgIGxldCB3c09wZW5lZCA9IGZhbHNlXG5cbiAgICB0aGlzLndzLm9ub3BlbiA9IChldmVudCkgPT4ge1xuICAgICAgY29uc29sZS53YXJuKCdbcmVhbHRpbWVdIHdzIGV2ZW50OiBvcGVuJywgZXZlbnQpXG4gICAgICB3c09wZW5lZCA9IHRydWVcbiAgICAgIHJlc29sdmUoKVxuICAgIH1cblxuICAgIHRoaXMud3Mub25lcnJvciA9IChldmVudCkgPT4ge1xuICAgICAgLy8gYWxsIGxvZ2lucyBhcmUgaW52YWxpZCBhZnRlciBkaXNjb25uZWN0aW9uXG4gICAgICB0aGlzLmxvZ2lucyA9IG5ldyBNYXAoKVxuXG4gICAgICAvLyBlcnJvcuWGmei/m2ZpbGVcblxuICAgICAgaWYgKCF3c09wZW5lZCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdbcmVhbHRpbWVdIHdzIG9wZW4gZmFpbGVkIHdpdGggd3MgZXZlbnQ6IGVycm9yJywgZXZlbnQpXG4gICAgICAgIHJlamVjdChldmVudClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tyZWFsdGltZV0gd3MgZXZlbnQ6IGVycm9yJywgZXZlbnQpXG5cbiAgICAgICAgdGhpcy5jbGVhckhlYXJ0YmVhdCgpXG4gICAgICAgIHRoaXMudmlydHVhbFdTQ2xpZW50LmZvckVhY2goY2xpZW50ID0+IGNsaWVudC5jbG9zZVdpdGhFcnJvcihuZXcgQ2xvdWRTREtFcnJvcih7XG4gICAgICAgICAgZXJyQ29kZTogRVJSX0NPREUuU0RLX0RBVEFCQVNFX1JFQUxUSU1FX0xJU1RFTkVSX1dFQlNPQ0tFVF9DT05ORUNUSU9OX0VSUk9SIGFzIHN0cmluZyxcbiAgICAgICAgICBlcnJNc2c6IGV2ZW50LFxuICAgICAgICB9KSkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVE9ETzogcmVjb25uZWN0XG4gICAgdGhpcy53cy5vbmNsb3NlID0gKGNsb3NlRXZlbnQpID0+IHtcbiAgICAgIGNvbnNvbGUud2FybignW3JlYWx0aW1lXSB3cyBldmVudDogY2xvc2UnLCBjbG9zZUV2ZW50KVxuICAgICAgLy8gYWxsIGxvZ2lucyBhcmUgaW52YWxpZCBhZnRlciBkaXNjb25uZWN0aW9uXG4gICAgICB0aGlzLmxvZ2lucyA9IG5ldyBNYXAoKVxuXG4gICAgICB0aGlzLmNsZWFySGVhcnRiZWF0KClcbiAgICAgIHN3aXRjaCAoY2xvc2VFdmVudC5jb2RlKSB7XG4gICAgICAgIGNhc2UgQ2xvc2VFdmVudENvZGUuUmVjb25uZWN0V2ViU29ja2V0OiB7XG4gICAgICAgICAgLy8ganVzdCBpZ25vcmVcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgQ2xvc2VFdmVudENvZGUuTm9SZWFsdGltZUxpc3RlbmVyczoge1xuICAgICAgICAgIC8vIHF1aXRcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgQ2xvc2VFdmVudENvZGUuSGVhcnRiZWF0UGluZ0Vycm9yOlxuICAgICAgICBjYXNlIENsb3NlRXZlbnRDb2RlLkhlYXJ0YmVhdFBvbmdUaW1lb3V0RXJyb3I6XG4gICAgICAgIGNhc2UgQ2xvc2VFdmVudENvZGUuTm9ybWFsQ2xvc3VyZTpcbiAgICAgICAgY2FzZSBDbG9zZUV2ZW50Q29kZS5BYm5vcm1hbENsb3N1cmU6IHtcbiAgICAgICAgICAvLyBOb3JtYWwgQ2xvc3VyZSBhbmQgQWJub3JtYWwgQ2xvc3VyZTpcbiAgICAgICAgICAvLyAgIGV4cGVjdGVkIGNsb3N1cmUsIG1vc3QgbGlrZWx5IGRpc3BhdGNoZWQgYnkgd2VjaGF0IGNsaWVudCxcbiAgICAgICAgICAvLyAgIHNpbmNlIHRoaXMgaXMgdGhlIHN0YXR1cyBjb2RlIGRpc3BhdGNoZWQgaW4gY2FzZSBvZiBuZXR3b3JrIGZhaWx1cmUsXG4gICAgICAgICAgLy8gICB3ZSBzaG91bGQgcmV0cnlcblxuICAgICAgICAgIGlmICh0aGlzLm1heFJlY29ubmVjdCA+IDApIHtcbiAgICAgICAgICAgIC8vIGlmICh0aGlzLl9hdmFpbGFibGVSZXRyaWVzID4gMCkge1xuICAgICAgICAgICAgdGhpcy5pbml0V2ViU29ja2V0Q29ubmVjdGlvbih0cnVlLCB0aGlzLm1heFJlY29ubmVjdClcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jbG9zZUFsbENsaWVudHMoZ2V0V1NDbG9zZUVycm9yKGNsb3NlRXZlbnQuY29kZSkpXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBDbG9zZUV2ZW50Q29kZS5Ob0F1dGhlbnRpY2F0aW9uOiB7XG4gICAgICAgICAgdGhpcy5jbG9zZUFsbENsaWVudHMoZ2V0V1NDbG9zZUVycm9yKGNsb3NlRXZlbnQuY29kZSwgY2xvc2VFdmVudC5yZWFzb24pKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIC8vIHdlIHNob3VsZCByZXRyeSBieSBkZWZhdWx0XG4gICAgICAgICAgaWYgKHRoaXMubWF4UmVjb25uZWN0ID4gMCkge1xuICAgICAgICAgICAgLy8gaWYgKHRoaXMuX2F2YWlsYWJsZVJldHJpZXMgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmluaXRXZWJTb2NrZXRDb25uZWN0aW9uKHRydWUsIHRoaXMubWF4UmVjb25uZWN0KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlQWxsQ2xpZW50cyhnZXRXU0Nsb3NlRXJyb3IoY2xvc2VFdmVudC5jb2RlKSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLndzLm9ubWVzc2FnZSA9IChyZXMpID0+IHtcbiAgICAgIGNvbnN0IHJhd01zZyA9IHJlcy5kYXRhXG5cbiAgICAgIC8vIHJlc2V0ICYgcmVzdGFydCBoZWFydGJlYXRcbiAgICAgIHRoaXMuaGVhcnRiZWF0KClcblxuICAgICAgbGV0IG1zZzogSVJlc3BvbnNlTWVzc2FnZVxuXG4gICAgICB0cnkge1xuICAgICAgICBtc2cgPSBKU09OLnBhcnNlKHJhd01zZyBhcyBzdHJpbmcpXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgW3JlYWx0aW1lXSBvbk1lc3NhZ2UgcGFyc2UgcmVzLmRhdGEgZXJyb3I6ICR7ZX1gKVxuICAgICAgfVxuXG4gICAgICBpZiAobXNnLm1zZ1R5cGUgPT09ICdFUlJPUicpIHtcbiAgICAgICAgLy8g5om+5Yiw5b2T5YmN55uR5ZCs77yM5bm25bCGZXJyb3Lov5Tlm55cbiAgICAgICAgbGV0IHZpcnR1YWxXYXRjaCA9IG51bGxcbiAgICAgICAgdGhpcy52aXJ0dWFsV1NDbGllbnQuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgIGlmIChpdGVtLndhdGNoSWQgPT09IG1zZy53YXRjaElkKSB7XG4gICAgICAgICAgICB2aXJ0dWFsV2F0Y2ggPSBpdGVtXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIGlmICh2aXJ0dWFsV2F0Y2gpIHtcbiAgICAgICAgICB2aXJ0dWFsV2F0Y2gubGlzdGVuZXIub25FcnJvcihtc2cpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzcG9uc2VXYWl0U3BlYyA9IHRoaXMud3NSZXNwb25zZVdhaXQuZ2V0KG1zZy5yZXF1ZXN0SWQpXG4gICAgICBpZiAocmVzcG9uc2VXYWl0U3BlYykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChtc2cubXNnVHlwZSA9PT0gJ0VSUk9SJykge1xuICAgICAgICAgICAgcmVzcG9uc2VXYWl0U3BlYy5yZWplY3QobmV3IFJlYWx0aW1lRXJyb3JNZXNzYWdlRXJyb3IobXNnKSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzcG9uc2VXYWl0U3BlYy5yZXNvbHZlKG1zZylcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgJ3dzIG9uTWVzc2FnZSByZXNwb25zZVdhaXRTcGVjLnJlc29sdmUobXNnKSBlcnJvcmVkOicsXG4gICAgICAgICAgICBlXG4gICAgICAgICAgKVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRoaXMud3NSZXNwb25zZVdhaXQuZGVsZXRlKG1zZy5yZXF1ZXN0SWQpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3BvbnNlV2FpdFNwZWMuc2tpcE9uTWVzc2FnZSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChtc2cubXNnVHlwZSA9PT0gJ1BPTkcnKSB7XG4gICAgICAgIGlmICh0aGlzLmxhc3RQaW5nU2VuZFRTKSB7XG4gICAgICAgICAgY29uc3QgcnR0ID0gRGF0ZS5ub3coKSAtIHRoaXMubGFzdFBpbmdTZW5kVFNcbiAgICAgICAgICBpZiAocnR0ID4gREVGQVVMVF9VTlRSVVNURURfUlRUX1RIUkVTSE9MRCkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBbcmVhbHRpbWVdIHVudHJ1c3RlZCBydHQgb2JzZXJ2ZWQ6ICR7cnR0fWApXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMucnR0T2JzZXJ2ZWQubGVuZ3RoID49IE1BWF9SVFRfT0JTRVJWRUQpIHtcbiAgICAgICAgICAgIHRoaXMucnR0T2JzZXJ2ZWQuc3BsaWNlKFxuICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICB0aGlzLnJ0dE9ic2VydmVkLmxlbmd0aCAtIE1BWF9SVFRfT0JTRVJWRUQgKyAxXG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMucnR0T2JzZXJ2ZWQucHVzaChydHQpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGxldCBjbGllbnQgPSBtc2cud2F0Y2hJZCAmJiB0aGlzLndhdGNoSWRDbGllbnRNYXAuZ2V0KG1zZy53YXRjaElkKVxuICAgICAgaWYgKGNsaWVudCkge1xuICAgICAgICBjbGllbnQub25NZXNzYWdlKG1zZylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgYFtyZWFsdGltZV0gbm8gcmVhbHRpbWUgbGlzdGVuZXIgZm91bmQgcmVzcG9uc2libGUgZm9yIHdhdGNoSWQgJHttc2cud2F0Y2hJZH06IGAsXG4gICAgICAgICAgbXNnXG4gICAgICAgIClcbiAgICAgICAgc3dpdGNoIChtc2cubXNnVHlwZSkge1xuICAgICAgICAgIGNhc2UgJ0lOSVRfRVZFTlQnOlxuICAgICAgICAgIGNhc2UgJ05FWFRfRVZFTlQnOlxuICAgICAgICAgIGNhc2UgJ0NIRUNLX0VWRU5UJzoge1xuICAgICAgICAgICAgY2xpZW50ID0gdGhpcy5xdWVyeUlkQ2xpZW50TWFwLmdldChtc2cubXNnRGF0YS5xdWVyeUlEKVxuICAgICAgICAgICAgaWYgKGNsaWVudCkge1xuICAgICAgICAgICAgICBjbGllbnQub25NZXNzYWdlKG1zZylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgWywgY2xpZW50XSBvZiBBcnJheS5mcm9tKHRoaXMud2F0Y2hJZENsaWVudE1hcC5lbnRyaWVzKCkpKSB7XG4gICAgICAgICAgICAgIGNsaWVudC5vbk1lc3NhZ2UobXNnKVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuaGVhcnRiZWF0KClcbiAgfSlcblxuICBwcml2YXRlIGlzV1NDb25uZWN0ZWQgPSAoKTogYm9vbGVhbiA9PiBCb29sZWFuKHRoaXMud3MgJiYgdGhpcy53cy5yZWFkeVN0YXRlID09PSBXU19SRUFEWV9TVEFURS5PUEVOKVxuXG4gIHByaXZhdGUgb25jZVdTQ29ubmVjdGVkID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmICh0aGlzLmlzV1NDb25uZWN0ZWQoKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMud3NJbml0UHJvbWlzZSAhPT0gbnVsbCAmJiB0aGlzLndzSW5pdFByb21pc2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMud3NJbml0UHJvbWlzZVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLndzUmVhZHlTdWJzcmliZXJzLnB1c2goe1xuICAgICAgICByZXNvbHZlLFxuICAgICAgICByZWplY3QsXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIHdlYkxvZ2luID0gYXN5bmMgKFxuICAgIGVudklkPzogc3RyaW5nLFxuICAgIHJlZnJlc2g/OiBib29sZWFuXG4gICk6IFByb21pc2U8YW55PiA9PiB7XG4gICAgaWYgKCFyZWZyZXNoKSB7XG4gICAgICBpZiAoZW52SWQpIHtcbiAgICAgICAgY29uc3QgbG9naW5JbmZvID0gdGhpcy5sb2dpbnMuZ2V0KGVudklkKVxuICAgICAgICBpZiAobG9naW5JbmZvKSB7XG4gICAgICAgICAgaWYgKGxvZ2luSW5mby5sb2dnZWRJbiAmJiBsb2dpbkluZm8ubG9naW5SZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiBsb2dpbkluZm8ubG9naW5SZXN1bHRcbiAgICAgICAgICB9IGlmIChsb2dpbkluZm8ubG9nZ2luZ0luUHJvbWlzZSAhPT0gbnVsbCAmJiBsb2dpbkluZm8ubG9nZ2luZ0luUHJvbWlzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbG9naW5JbmZvLmxvZ2dpbmdJblByb21pc2VcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGVtcHR5RW52TG9naW5JbmZvID0gdGhpcy5sb2dpbnMuZ2V0KCcnKVxuICAgICAgICBpZiAoZW1wdHlFbnZMb2dpbkluZm8/LmxvZ2dpbmdJblByb21pc2UgIT09IG51bGwgJiYgZW1wdHlFbnZMb2dpbkluZm8/LmxvZ2dpbmdJblByb21pc2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBlbXB0eUVudkxvZ2luSW5mby5sb2dnaW5nSW5Qcm9taXNlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2U8SUxvZ2luUmVzdWx0PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHdzU2lnbiA9IGF3YWl0IHRoaXMuZ2V0V3NTaWduKClcblxuICAgICAgICAgIGNvbnN0IG1zZ0RhdGE6IElSZXF1ZXN0TWVzc2FnZUxvZ2luRGF0YSA9IHtcbiAgICAgICAgICAgIGVudklkOiB3c1NpZ24uZW52SWQgfHwgJycsXG4gICAgICAgICAgICBhY2Nlc3NUb2tlbjogJycsIC8vIOW3suW6n+W8g+Wtl+autVxuICAgICAgICAgICAgcmVmZXJyZXI6ICd3ZWInLFxuICAgICAgICAgICAgc2RrVmVyc2lvbjogJycsXG4gICAgICAgICAgICBkYXRhVmVyc2lvbjogJycsXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGxvZ2luTXNnOiBJUmVxdWVzdE1lc3NhZ2VMb2dpbk1zZyA9IHtcbiAgICAgICAgICAgIHdhdGNoSWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHJlcXVlc3RJZDogZ2VuUmVxdWVzdElkKCksXG4gICAgICAgICAgICBtc2dUeXBlOiAnTE9HSU4nLFxuICAgICAgICAgICAgbXNnRGF0YSxcbiAgICAgICAgICAgIGV4TXNnRGF0YToge1xuICAgICAgICAgICAgICBydW50aW1lOiBnZXRSdW50aW1lKCksXG4gICAgICAgICAgICAgIHNpZ25TdHI6IHdzU2lnbi5zaWduU3RyLFxuICAgICAgICAgICAgICBzZWNyZXRWZXJzaW9uOiB3c1NpZ24uc2VjcmV0VmVyc2lvbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGxvZ2luUmVzTXNnID0gYXdhaXQgdGhpcy5zZW5kPElSZXNwb25zZU1lc3NhZ2VMb2dpblJlc01zZz4oe1xuICAgICAgICAgICAgbXNnOiBsb2dpbk1zZyxcbiAgICAgICAgICAgIHdhaXRSZXNwb25zZTogdHJ1ZSxcbiAgICAgICAgICAgIHNraXBPbk1lc3NhZ2U6IHRydWUsXG4gICAgICAgICAgICB0aW1lb3V0OiBERUZBVUxUX0xPR0lOX1RJTUVPVVQsXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIGlmICghbG9naW5SZXNNc2cubXNnRGF0YS5jb2RlKSB7XG4gICAgICAgICAgICAvLyBsb2dpbiBzdWNjZXNzXG4gICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgZW52SWQ6IHdzU2lnbi5lbnZJZCxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGxvZ2luIGZhaWxlZFxuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgJHtsb2dpblJlc01zZy5tc2dEYXRhLmNvZGV9ICR7bG9naW5SZXNNc2cubXNnRGF0YS5tZXNzYWdlfWApKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHJlamVjdChlKVxuICAgICAgICB9XG4gICAgICB9KSgpXG4gICAgfSlcblxuICAgIGxldCBsb2dpbkluZm8gPSBlbnZJZCAmJiB0aGlzLmxvZ2lucy5nZXQoZW52SWQpXG5cbiAgICBjb25zdCBsb2dpblN0YXJ0VFMgPSBEYXRlLm5vdygpXG5cbiAgICBpZiAobG9naW5JbmZvKSB7XG4gICAgICBsb2dpbkluZm8ubG9nZ2VkSW4gPSBmYWxzZVxuICAgICAgbG9naW5JbmZvLmxvZ2dpbmdJblByb21pc2UgPSBwcm9taXNlXG4gICAgICBsb2dpbkluZm8ubG9naW5TdGFydFRTID0gbG9naW5TdGFydFRTXG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2luSW5mbyA9IHtcbiAgICAgICAgbG9nZ2VkSW46IGZhbHNlLFxuICAgICAgICBsb2dnaW5nSW5Qcm9taXNlOiBwcm9taXNlLFxuICAgICAgICBsb2dpblN0YXJ0VFMsXG4gICAgICB9XG4gICAgICB0aGlzLmxvZ2lucy5zZXQoZW52SWQgfHwgJycsIGxvZ2luSW5mbylcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgbG9naW5SZXN1bHQgPSBhd2FpdCBwcm9taXNlXG4gICAgICBjb25zdCBjdXJMb2dpbkluZm8gPSBlbnZJZCAmJiB0aGlzLmxvZ2lucy5nZXQoZW52SWQpXG4gICAgICBpZiAoXG4gICAgICAgIGN1ckxvZ2luSW5mb1xuICAgICAgICAmJiBjdXJMb2dpbkluZm8gPT09IGxvZ2luSW5mb1xuICAgICAgICAmJiBjdXJMb2dpbkluZm8ubG9naW5TdGFydFRTID09PSBsb2dpblN0YXJ0VFNcbiAgICAgICkge1xuICAgICAgICBsb2dpbkluZm8ubG9nZ2VkSW4gPSB0cnVlXG4gICAgICAgIGxvZ2luSW5mby5sb2dnaW5nSW5Qcm9taXNlID0gdW5kZWZpbmVkXG4gICAgICAgIGxvZ2luSW5mby5sb2dpblN0YXJ0VFMgPSB1bmRlZmluZWRcbiAgICAgICAgbG9naW5JbmZvLmxvZ2luUmVzdWx0ID0gbG9naW5SZXN1bHRcbiAgICAgICAgcmV0dXJuIGxvZ2luUmVzdWx0XG4gICAgICB9IGlmIChjdXJMb2dpbkluZm8pIHtcbiAgICAgICAgaWYgKGN1ckxvZ2luSW5mby5sb2dnZWRJbiAmJiBjdXJMb2dpbkluZm8ubG9naW5SZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gY3VyTG9naW5JbmZvLmxvZ2luUmVzdWx0XG4gICAgICAgIH0gaWYgKGN1ckxvZ2luSW5mby5sb2dnaW5nSW5Qcm9taXNlICE9PSBudWxsICYmIGN1ckxvZ2luSW5mby5sb2dnaW5nSW5Qcm9taXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gY3VyTG9naW5JbmZvLmxvZ2dpbmdJblByb21pc2VcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dzIHVuZXhwZWN0ZWQgbG9naW4gaW5mbycpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dzIGxvZ2luIGluZm8gcmVzZXQnKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZ2luSW5mby5sb2dnZWRJbiA9IGZhbHNlXG4gICAgICBsb2dpbkluZm8ubG9nZ2luZ0luUHJvbWlzZSA9IHVuZGVmaW5lZFxuICAgICAgbG9naW5JbmZvLmxvZ2luU3RhcnRUUyA9IHVuZGVmaW5lZFxuICAgICAgbG9naW5JbmZvLmxvZ2luUmVzdWx0ID0gdW5kZWZpbmVkXG4gICAgICB0aHJvdyBlXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRXc1NpZ24gPSBhc3luYyAoKTogUHJvbWlzZTxJV3NTaWduPiA9PiB7XG4gICAgaWYgKHRoaXMud3NTaWduICYmIHRoaXMud3NTaWduLmV4cGlyZWRUcyA+IERhdGUubm93KCkpIHtcbiAgICAgIHJldHVybiB0aGlzLndzU2lnblxuICAgIH1cbiAgICBjb25zdCBleHBpcmVkVHMgPSBEYXRlLm5vdygpICsgNjAwMDBcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmNvbnRleHQuYXBwQ29uZmlnLnJlcXVlc3Quc2VuZCgnYXV0aC53c1dlYlNpZ24nLCB7IHJ1bnRpbWU6IGdldFJ1bnRpbWUoKSB9KVxuXG4gICAgaWYgKHJlcy5jb2RlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFt0Y2ItanMtc2RrXSDojrflj5blrp7ml7bmlbDmja7mjqjpgIHnmbvlvZXnpajmja7lpLHotKU6ICR7cmVzLmNvZGV9YClcbiAgICB9XG5cbiAgICBpZiAocmVzLmRhdGEpIHtcbiAgICAgIGNvbnN0IHsgc2lnblN0ciwgd3NVcmwsIHNlY3JldFZlcnNpb24sIGVudklkIH0gPSByZXMuZGF0YVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2lnblN0cixcbiAgICAgICAgd3NVcmwsXG4gICAgICAgIHNlY3JldFZlcnNpb24sXG4gICAgICAgIGVudklkLFxuICAgICAgICBleHBpcmVkVHMsXG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcignW3RjYi1qcy1zZGtdIOiOt+WPluWunuaXtuaVsOaNruaOqOmAgeeZu+W9leelqOaNruWksei0pScpXG4gIH1cblxuICBwcml2YXRlIGdldFdhaXRFeHBlY3RlZFRpbWVvdXRMZW5ndGggPSAoKSA9PiB7XG4gICAgaWYgKCF0aGlzLnJ0dE9ic2VydmVkLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIERFRkFVTFRfRVhQRUNURURfRVZFTlRfV0FJVF9USU1FXG4gICAgfVxuXG4gICAgLy8gMS41ICogUlRUXG4gICAgcmV0dXJuIChcbiAgICAgICh0aGlzLnJ0dE9ic2VydmVkLnJlZHVjZSgoYWNjLCBjdXIpID0+IGFjYyArIGN1cilcbiAgICAgICAgLyB0aGlzLnJ0dE9ic2VydmVkLmxlbmd0aClcbiAgICAgICogMS41XG4gICAgKVxuICB9XG5cbiAgcHJpdmF0ZSBoZWFydGJlYXQoaW1tZWRpYXRlPzogYm9vbGVhbikge1xuICAgIHRoaXMuY2xlYXJIZWFydGJlYXQoKVxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0aGlzLnBpbmdUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KFxuICAgICAgKCkgPT4ge1xuICAgICAgICAoXG4gICAgICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLndzIHx8IHRoaXMud3MucmVhZHlTdGF0ZSAhPT0gV1NfUkVBRFlfU1RBVEUuT1BFTikge1xuICAgICAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gcGluZ1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdGhpcy5sYXN0UGluZ1NlbmRUUyA9IERhdGUubm93KClcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5waW5nKClcbiAgICAgICAgICAgICAgdGhpcy5waW5nRmFpbGVkID0gMFxuXG4gICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgdGhpcy5wb25nVGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcigncG9uZyB0aW1lZCBvdXQnKVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBvbmdNaXNzZWQgPCBERUZBVUxUX1BPTkdfTUlTU19UT0xFUkFOQ0UpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMucG9uZ01pc3NlZCArPSAxXG4gICAgICAgICAgICAgICAgICB0aGlzLmhlYXJ0YmVhdCh0cnVlKVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAvLyBsb2dpY2FsIHBlcmNlaXZlZCBjb25uZWN0aW9uIGxvc3QsIGV2ZW4gdGhvdWdoIHdlYnNvY2tldCBkaWQgbm90IHJlY2VpdmUgZXJyb3Igb3IgY2xvc2UgZXZlbnRcbiAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdFdlYlNvY2tldENvbm5lY3Rpb24odHJ1ZSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0sIHRoaXMuY29udGV4dC5hcHBDb25maWcucmVhbHRpbWVQb25nV2FpdFRpbWVvdXQpXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLnBpbmdGYWlsZWQgPCBERUZBVUxUX1BJTkdfRkFJTF9UT0xFUkFOQ0UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBpbmdGYWlsZWQgKz0gMVxuICAgICAgICAgICAgICAgIHRoaXMuaGVhcnRiZWF0KClcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKENsb3NlRXZlbnRDb2RlLkhlYXJ0YmVhdFBpbmdFcnJvcilcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgKSgpXG4gICAgICB9LFxuICAgICAgaW1tZWRpYXRlID8gMCA6IHRoaXMuY29udGV4dC5hcHBDb25maWcucmVhbHRpbWVQaW5nSW50ZXJ2YWxcbiAgICApXG4gIH1cblxuICBwcml2YXRlIHBpbmcgPSBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbXNnOiBJUmVxdWVzdE1lc3NhZ2VQaW5nTXNnID0ge1xuICAgICAgd2F0Y2hJZDogdW5kZWZpbmVkLFxuICAgICAgcmVxdWVzdElkOiBnZW5SZXF1ZXN0SWQoKSxcbiAgICAgIG1zZ1R5cGU6ICdQSU5HJyxcbiAgICAgIG1zZ0RhdGE6IG51bGwsXG4gICAgfVxuICAgIGF3YWl0IHRoaXMuc2VuZCh7XG4gICAgICBtc2csXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgb25XYXRjaFN0YXJ0ID0gKGNsaWVudDogVmlydHVhbFdlYlNvY2tldENsaWVudCwgcXVlcnlJRDogc3RyaW5nKSA9PiB7XG4gICAgdGhpcy5xdWVyeUlkQ2xpZW50TWFwLnNldChxdWVyeUlELCBjbGllbnQpXG4gIH1cblxuICBwcml2YXRlIG9uV2F0Y2hDbG9zZSA9IChjbGllbnQ6IFZpcnR1YWxXZWJTb2NrZXRDbGllbnQsIHF1ZXJ5SUQ6IHN0cmluZykgPT4ge1xuICAgIGlmIChxdWVyeUlEKSB7XG4gICAgICB0aGlzLnF1ZXJ5SWRDbGllbnRNYXAuZGVsZXRlKHF1ZXJ5SUQpXG4gICAgfVxuICAgIHRoaXMud2F0Y2hJZENsaWVudE1hcC5kZWxldGUoY2xpZW50LndhdGNoSWQpXG4gICAgdGhpcy52aXJ0dWFsV1NDbGllbnQuZGVsZXRlKGNsaWVudClcblxuICAgIGlmICghdGhpcy52aXJ0dWFsV1NDbGllbnQuc2l6ZSkge1xuICAgICAgLy8gbm8gbW9yZSBleGlzdGluZyB3YXRjaCwgd2Ugc2hvdWxkIHJlbGVhc2UgdGhlIHdlYnNvY2tldCBjb25uZWN0aW9uXG4gICAgICB0aGlzLmNsb3NlKENsb3NlRXZlbnRDb2RlLk5vUmVhbHRpbWVMaXN0ZW5lcnMpXG4gICAgfVxuICB9XG59XG4iXX0=