botframework-directlinejs 0.15.6-master.bb3d7ee → 0.15.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/directline.js +1 -1
- package/dist/directline.js.LICENSE.txt +2 -0
- package/dist/stats.json +10845 -10106
- package/lib/createDeferred.js +1 -3
- package/lib/dedupeFilenames.js +3 -9
- package/lib/directLine.js +53 -134
- package/lib/directLine.mock.js +23 -74
- package/lib/directLineStreaming.js +36 -195
- package/lib/parseFilename.js +4 -8
- package/lib/streaming/NetworkInformation.d.js +1 -1
- package/lib/streaming/WebSocketClientWithNetworkInformation.js +9 -40
- package/package.json +3 -3
|
@@ -1,61 +1,37 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
4
|
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
6
|
-
|
|
7
5
|
Object.defineProperty(exports, "__esModule", {
|
|
8
6
|
value: true
|
|
9
7
|
});
|
|
10
8
|
exports.DirectLineStreaming = void 0;
|
|
11
|
-
|
|
12
9
|
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
|
|
13
|
-
|
|
14
10
|
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
15
|
-
|
|
16
11
|
var _classPrivateFieldGet2 = _interopRequireDefault(require("@babel/runtime/helpers/classPrivateFieldGet"));
|
|
17
|
-
|
|
18
12
|
var _classPrivateFieldSet2 = _interopRequireDefault(require("@babel/runtime/helpers/classPrivateFieldSet"));
|
|
19
|
-
|
|
20
13
|
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
21
|
-
|
|
22
14
|
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
23
|
-
|
|
24
15
|
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
25
|
-
|
|
26
16
|
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
27
|
-
|
|
28
17
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
29
|
-
|
|
30
18
|
var _BehaviorSubject = require("rxjs/BehaviorSubject");
|
|
31
|
-
|
|
32
19
|
var _buffer = require("buffer");
|
|
33
|
-
|
|
34
20
|
var _Observable = require("rxjs/Observable");
|
|
35
|
-
|
|
36
21
|
var BFSE = _interopRequireWildcard(require("botframework-streaming"));
|
|
37
|
-
|
|
38
22
|
var _createDeferred = _interopRequireDefault(require("./createDeferred"));
|
|
39
|
-
|
|
40
23
|
var _crossFetch = _interopRequireDefault(require("cross-fetch"));
|
|
41
|
-
|
|
42
24
|
var _directLine = require("./directLine");
|
|
43
|
-
|
|
44
25
|
var _WebSocketClientWithNetworkInformation = _interopRequireDefault(require("./streaming/WebSocketClientWithNetworkInformation"));
|
|
45
|
-
|
|
46
|
-
var _excluded = ["attachments"];
|
|
47
|
-
|
|
26
|
+
var _excluded = ["attachments"]; // In order to keep file size down, only import the parts of rxjs that we use
|
|
48
27
|
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
49
|
-
|
|
50
28
|
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
51
|
-
|
|
52
29
|
var DIRECT_LINE_VERSION = 'DirectLine/3.0';
|
|
53
30
|
var MAX_RETRY_COUNT = 3;
|
|
54
|
-
var refreshTokenLifetime = 30 * 60 * 1000;
|
|
31
|
+
var refreshTokenLifetime = 30 * 60 * 1000;
|
|
32
|
+
//const refreshTokenLifetime = 5000;
|
|
55
33
|
// const timeout = 20 * 1000;
|
|
56
|
-
|
|
57
34
|
var refreshTokenInterval = refreshTokenLifetime / 2;
|
|
58
|
-
|
|
59
35
|
var StreamHandler = /*#__PURE__*/function () {
|
|
60
36
|
function StreamHandler(s, c$, sq) {
|
|
61
37
|
(0, _classCallCheck2["default"])(this, StreamHandler);
|
|
@@ -64,7 +40,6 @@ var StreamHandler = /*#__PURE__*/function () {
|
|
|
64
40
|
this.connectionStatus$ = c$;
|
|
65
41
|
this.shouldQueue = sq;
|
|
66
42
|
}
|
|
67
|
-
|
|
68
43
|
(0, _createClass2["default"])(StreamHandler, [{
|
|
69
44
|
key: "setSubscriber",
|
|
70
45
|
value: function setSubscriber(s) {
|
|
@@ -73,7 +48,7 @@ var StreamHandler = /*#__PURE__*/function () {
|
|
|
73
48
|
}, {
|
|
74
49
|
key: "processRequest",
|
|
75
50
|
value: function () {
|
|
76
|
-
var _processRequest = (0, _asyncToGenerator2["default"])(
|
|
51
|
+
var _processRequest = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee(request, logger) {
|
|
77
52
|
var streams, stream0, activitySetJson, activitySet, activity, attachments, stream, attachment, dataUri;
|
|
78
53
|
return _regenerator["default"].wrap(function _callee$(_context) {
|
|
79
54
|
while (1) {
|
|
@@ -83,39 +58,30 @@ var StreamHandler = /*#__PURE__*/function () {
|
|
|
83
58
|
stream0 = streams.shift();
|
|
84
59
|
_context.next = 4;
|
|
85
60
|
return stream0.readAsString();
|
|
86
|
-
|
|
87
61
|
case 4:
|
|
88
62
|
activitySetJson = _context.sent;
|
|
89
63
|
activitySet = JSON.parse(activitySetJson);
|
|
90
|
-
|
|
91
64
|
if (!(activitySet.activities.length !== 1)) {
|
|
92
65
|
_context.next = 9;
|
|
93
66
|
break;
|
|
94
67
|
}
|
|
95
|
-
|
|
96
68
|
// Only one activity is expected in a set in streaming
|
|
97
69
|
this.subscriber.error(new Error('there should be exactly one activity'));
|
|
98
70
|
return _context.abrupt("return", BFSE.StreamingResponse.create(500));
|
|
99
|
-
|
|
100
71
|
case 9:
|
|
101
72
|
activity = activitySet.activities[0];
|
|
102
|
-
|
|
103
73
|
if (!(streams.length > 0)) {
|
|
104
74
|
_context.next = 21;
|
|
105
75
|
break;
|
|
106
76
|
}
|
|
107
|
-
|
|
108
77
|
attachments = (0, _toConsumableArray2["default"])(activity.attachments);
|
|
109
|
-
|
|
110
78
|
case 12:
|
|
111
79
|
if (!(stream = streams.shift())) {
|
|
112
80
|
_context.next = 20;
|
|
113
81
|
break;
|
|
114
82
|
}
|
|
115
|
-
|
|
116
83
|
_context.next = 15;
|
|
117
84
|
return stream.readAsString();
|
|
118
|
-
|
|
119
85
|
case 15:
|
|
120
86
|
attachment = _context.sent;
|
|
121
87
|
dataUri = 'data:text/plain;base64,' + attachment;
|
|
@@ -125,19 +91,15 @@ var StreamHandler = /*#__PURE__*/function () {
|
|
|
125
91
|
});
|
|
126
92
|
_context.next = 12;
|
|
127
93
|
break;
|
|
128
|
-
|
|
129
94
|
case 20:
|
|
130
95
|
activity.attachments = attachments;
|
|
131
|
-
|
|
132
96
|
case 21:
|
|
133
97
|
if (this.shouldQueue()) {
|
|
134
98
|
this.activityQueue.push(activity);
|
|
135
99
|
} else {
|
|
136
100
|
this.subscriber.next(activity);
|
|
137
101
|
}
|
|
138
|
-
|
|
139
102
|
return _context.abrupt("return", BFSE.StreamingResponse.create(200));
|
|
140
|
-
|
|
141
103
|
case 23:
|
|
142
104
|
case "end":
|
|
143
105
|
return _context.stop();
|
|
@@ -145,18 +107,15 @@ var StreamHandler = /*#__PURE__*/function () {
|
|
|
145
107
|
}
|
|
146
108
|
}, _callee, this);
|
|
147
109
|
}));
|
|
148
|
-
|
|
149
110
|
function processRequest(_x, _x2) {
|
|
150
111
|
return _processRequest.apply(this, arguments);
|
|
151
112
|
}
|
|
152
|
-
|
|
153
113
|
return processRequest;
|
|
154
114
|
}()
|
|
155
115
|
}, {
|
|
156
116
|
key: "flush",
|
|
157
117
|
value: function flush() {
|
|
158
118
|
var _this = this;
|
|
159
|
-
|
|
160
119
|
this.connectionStatus$.subscribe(function () {});
|
|
161
120
|
this.activityQueue.forEach(function (a) {
|
|
162
121
|
return _this.subscriber.next(a);
|
|
@@ -171,45 +130,36 @@ var StreamHandler = /*#__PURE__*/function () {
|
|
|
171
130
|
}]);
|
|
172
131
|
return StreamHandler;
|
|
173
132
|
}();
|
|
174
|
-
|
|
175
133
|
var _networkInformation = /*#__PURE__*/new WeakMap();
|
|
176
|
-
|
|
177
134
|
var DirectLineStreaming = /*#__PURE__*/function () {
|
|
178
135
|
function DirectLineStreaming(options) {
|
|
179
136
|
var _this2 = this;
|
|
180
|
-
|
|
181
137
|
(0, _classCallCheck2["default"])(this, DirectLineStreaming);
|
|
182
138
|
(0, _defineProperty2["default"])(this, "connectionStatus$", new _BehaviorSubject.BehaviorSubject(_directLine.ConnectionStatus.Uninitialized));
|
|
183
139
|
(0, _defineProperty2["default"])(this, "_botAgent", '');
|
|
184
|
-
|
|
185
140
|
_networkInformation.set(this, {
|
|
186
141
|
writable: true,
|
|
187
142
|
value: void 0
|
|
188
143
|
});
|
|
189
|
-
|
|
190
144
|
// Rectifies `options.networkInformation`.
|
|
191
145
|
var networkInformation = options === null || options === void 0 ? void 0 : options.networkInformation;
|
|
192
|
-
|
|
193
146
|
if (typeof networkInformation === 'undefined' || typeof networkInformation.addEventListener === 'function' && typeof networkInformation.removeEventListener === 'function' && typeof networkInformation.type === 'string') {
|
|
194
147
|
(0, _classPrivateFieldSet2["default"])(this, _networkInformation, networkInformation);
|
|
195
148
|
} else {
|
|
196
149
|
console.warn('botframework-directlinejs: "networkInformation" option specified must be a `NetworkInformation`-like instance extending `EventTarget` interface with a `type` property returning a string.');
|
|
197
150
|
}
|
|
198
|
-
|
|
199
151
|
this.token = options.token;
|
|
200
152
|
this.refreshToken()["catch"](function () {
|
|
201
153
|
_this2.connectionStatus$.next(_directLine.ConnectionStatus.ExpiredToken);
|
|
202
154
|
});
|
|
203
155
|
this.domain = options.domain;
|
|
204
|
-
|
|
205
156
|
if (options.conversationId) {
|
|
206
157
|
this.conversationId = options.conversationId;
|
|
207
158
|
}
|
|
208
|
-
|
|
209
159
|
this._botAgent = this.getBotAgent(options.botAgent);
|
|
210
160
|
this.queueActivities = true;
|
|
211
|
-
this.activity$ = _Observable.Observable.create(
|
|
212
|
-
var _ref = (0, _asyncToGenerator2["default"])(
|
|
161
|
+
this.activity$ = _Observable.Observable.create(/*#__PURE__*/function () {
|
|
162
|
+
var _ref = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2(subscriber) {
|
|
213
163
|
return _regenerator["default"].wrap(function _callee2$(_context2) {
|
|
214
164
|
while (1) {
|
|
215
165
|
switch (_context2.prev = _context2.next) {
|
|
@@ -217,10 +167,10 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
217
167
|
_this2.activitySubscriber = subscriber;
|
|
218
168
|
_this2.theStreamHandler = new StreamHandler(subscriber, _this2.connectionStatus$, function () {
|
|
219
169
|
return _this2.queueActivities;
|
|
220
|
-
});
|
|
170
|
+
});
|
|
221
171
|
|
|
172
|
+
// Resolving connectDeferred will kick-off the connection.
|
|
222
173
|
_this2.connectDeferred.resolve();
|
|
223
|
-
|
|
224
174
|
case 3:
|
|
225
175
|
case "end":
|
|
226
176
|
return _context2.stop();
|
|
@@ -228,25 +178,22 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
228
178
|
}
|
|
229
179
|
}, _callee2);
|
|
230
180
|
}));
|
|
231
|
-
|
|
232
181
|
return function (_x3) {
|
|
233
182
|
return _ref.apply(this, arguments);
|
|
234
183
|
};
|
|
235
|
-
}()).share();
|
|
184
|
+
}()).share();
|
|
236
185
|
|
|
186
|
+
// connectWithRetryAsync() will create the connectDeferred object required in activity$.
|
|
237
187
|
this.connectWithRetryAsync();
|
|
238
188
|
}
|
|
239
|
-
|
|
240
189
|
(0, _createClass2["default"])(DirectLineStreaming, [{
|
|
241
190
|
key: "reconnect",
|
|
242
191
|
value: function reconnect(_ref2) {
|
|
243
192
|
var conversationId = _ref2.conversationId,
|
|
244
|
-
|
|
245
|
-
|
|
193
|
+
token = _ref2.token;
|
|
246
194
|
if (this.connectionStatus$.getValue() === _directLine.ConnectionStatus.Ended) {
|
|
247
195
|
throw new Error('Connection has ended.');
|
|
248
196
|
}
|
|
249
|
-
|
|
250
197
|
this.conversationId = conversationId;
|
|
251
198
|
this.token = token;
|
|
252
199
|
this.connectDeferred.resolve();
|
|
@@ -273,25 +220,22 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
273
220
|
value: function getBotAgent() {
|
|
274
221
|
var customAgent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
|
|
275
222
|
var clientAgent = 'directlineStreaming';
|
|
276
|
-
|
|
277
223
|
if (customAgent) {
|
|
278
224
|
clientAgent += "; ".concat(customAgent);
|
|
279
225
|
}
|
|
280
|
-
|
|
281
226
|
return "".concat(DIRECT_LINE_VERSION, " (").concat(clientAgent, ")");
|
|
282
227
|
}
|
|
283
228
|
}, {
|
|
284
229
|
key: "refreshToken",
|
|
285
230
|
value: function () {
|
|
286
|
-
var _refreshToken = (0, _asyncToGenerator2["default"])(
|
|
231
|
+
var _refreshToken = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee3() {
|
|
287
232
|
var firstCall,
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
233
|
+
retryCount,
|
|
234
|
+
numberOfAttempts,
|
|
235
|
+
res,
|
|
236
|
+
_yield$res$json,
|
|
237
|
+
token,
|
|
238
|
+
_args3 = arguments;
|
|
295
239
|
return _regenerator["default"].wrap(function _callee3$(_context3) {
|
|
296
240
|
while (1) {
|
|
297
241
|
switch (_context3.prev = _context3.next) {
|
|
@@ -300,22 +244,18 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
300
244
|
retryCount = _args3.length > 1 && _args3[1] !== undefined ? _args3[1] : 0;
|
|
301
245
|
_context3.next = 4;
|
|
302
246
|
return this.waitUntilOnline();
|
|
303
|
-
|
|
304
247
|
case 4:
|
|
305
248
|
numberOfAttempts = 0;
|
|
306
|
-
|
|
307
249
|
case 5:
|
|
308
250
|
if (!(numberOfAttempts < MAX_RETRY_COUNT)) {
|
|
309
251
|
_context3.next = 30;
|
|
310
252
|
break;
|
|
311
253
|
}
|
|
312
|
-
|
|
313
254
|
numberOfAttempts++;
|
|
314
255
|
_context3.next = 9;
|
|
315
256
|
return new Promise(function (r) {
|
|
316
257
|
return setTimeout(r, refreshTokenInterval);
|
|
317
258
|
});
|
|
318
|
-
|
|
319
259
|
case 9:
|
|
320
260
|
_context3.prev = 9;
|
|
321
261
|
_context3.next = 12;
|
|
@@ -323,26 +263,21 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
323
263
|
method: 'POST',
|
|
324
264
|
headers: this.commonHeaders()
|
|
325
265
|
});
|
|
326
|
-
|
|
327
266
|
case 12:
|
|
328
267
|
res = _context3.sent;
|
|
329
|
-
|
|
330
268
|
if (!res.ok) {
|
|
331
269
|
_context3.next = 22;
|
|
332
270
|
break;
|
|
333
271
|
}
|
|
334
|
-
|
|
335
272
|
numberOfAttempts = 0;
|
|
336
273
|
_context3.next = 17;
|
|
337
274
|
return res.json();
|
|
338
|
-
|
|
339
275
|
case 17:
|
|
340
276
|
_yield$res$json = _context3.sent;
|
|
341
277
|
token = _yield$res$json.token;
|
|
342
278
|
this.token = token;
|
|
343
279
|
_context3.next = 23;
|
|
344
280
|
break;
|
|
345
|
-
|
|
346
281
|
case 22:
|
|
347
282
|
if (res.status === 403 || res.status === 403) {
|
|
348
283
|
console.error("Fatal error while refreshing the token: ".concat(res.status, " ").concat(res.statusText));
|
|
@@ -350,24 +285,19 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
350
285
|
} else {
|
|
351
286
|
console.warn("Refresh attempt #".concat(numberOfAttempts, " failed: ").concat(res.status, " ").concat(res.statusText));
|
|
352
287
|
}
|
|
353
|
-
|
|
354
288
|
case 23:
|
|
355
289
|
_context3.next = 28;
|
|
356
290
|
break;
|
|
357
|
-
|
|
358
291
|
case 25:
|
|
359
292
|
_context3.prev = 25;
|
|
360
293
|
_context3.t0 = _context3["catch"](9);
|
|
361
294
|
console.warn("Refresh attempt #".concat(numberOfAttempts, " threw an exception: ").concat(_context3.t0));
|
|
362
|
-
|
|
363
295
|
case 28:
|
|
364
296
|
_context3.next = 5;
|
|
365
297
|
break;
|
|
366
|
-
|
|
367
298
|
case 30:
|
|
368
299
|
console.error('Retries exhausted');
|
|
369
300
|
this.streamConnection.disconnect();
|
|
370
|
-
|
|
371
301
|
case 32:
|
|
372
302
|
case "end":
|
|
373
303
|
return _context3.stop();
|
|
@@ -375,30 +305,24 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
375
305
|
}
|
|
376
306
|
}, _callee3, this, [[9, 25]]);
|
|
377
307
|
}));
|
|
378
|
-
|
|
379
308
|
function refreshToken() {
|
|
380
309
|
return _refreshToken.apply(this, arguments);
|
|
381
310
|
}
|
|
382
|
-
|
|
383
311
|
return refreshToken;
|
|
384
312
|
}()
|
|
385
313
|
}, {
|
|
386
314
|
key: "postActivity",
|
|
387
315
|
value: function postActivity(activity) {
|
|
388
316
|
var _this3 = this;
|
|
389
|
-
|
|
390
317
|
if (this.connectionStatus$.value === _directLine.ConnectionStatus.Ended || this.connectionStatus$.value === _directLine.ConnectionStatus.FailedToConnect) {
|
|
391
318
|
return _Observable.Observable["throw"](new Error('Connection is closed'));
|
|
392
319
|
}
|
|
393
|
-
|
|
394
320
|
if (activity.type === 'message' && activity.attachments && activity.attachments.length > 0) {
|
|
395
321
|
return this.postMessageWithAttachments(activity);
|
|
396
322
|
}
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
var _ref3 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4(subscriber) {
|
|
323
|
+
var resp$ = _Observable.Observable.create(/*#__PURE__*/function () {
|
|
324
|
+
var _ref3 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee4(subscriber) {
|
|
400
325
|
var request, resp, numberOfStreams, idString, _JSON$parse, id;
|
|
401
|
-
|
|
402
326
|
return _regenerator["default"].wrap(function _callee4$(_context4) {
|
|
403
327
|
while (1) {
|
|
404
328
|
switch (_context4.prev = _context4.next) {
|
|
@@ -408,37 +332,28 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
408
332
|
_context4.prev = 2;
|
|
409
333
|
_context4.next = 5;
|
|
410
334
|
return _this3.streamConnection.send(request);
|
|
411
|
-
|
|
412
335
|
case 5:
|
|
413
336
|
resp = _context4.sent;
|
|
414
|
-
|
|
415
337
|
if (!(resp.statusCode !== 200)) {
|
|
416
338
|
_context4.next = 8;
|
|
417
339
|
break;
|
|
418
340
|
}
|
|
419
|
-
|
|
420
341
|
throw new Error('PostActivity returned ' + resp.statusCode);
|
|
421
|
-
|
|
422
342
|
case 8:
|
|
423
343
|
numberOfStreams = resp.streams.length;
|
|
424
|
-
|
|
425
344
|
if (!(numberOfStreams !== 1)) {
|
|
426
345
|
_context4.next = 11;
|
|
427
346
|
break;
|
|
428
347
|
}
|
|
429
|
-
|
|
430
348
|
throw new Error('Expected one stream but got ' + numberOfStreams);
|
|
431
|
-
|
|
432
349
|
case 11:
|
|
433
350
|
_context4.next = 13;
|
|
434
351
|
return resp.streams[0].readAsString();
|
|
435
|
-
|
|
436
352
|
case 13:
|
|
437
353
|
idString = _context4.sent;
|
|
438
354
|
_JSON$parse = JSON.parse(idString), id = _JSON$parse.Id;
|
|
439
355
|
subscriber.next(id);
|
|
440
356
|
return _context4.abrupt("return", subscriber.complete());
|
|
441
|
-
|
|
442
357
|
case 19:
|
|
443
358
|
_context4.prev = 19;
|
|
444
359
|
_context4.t0 = _context4["catch"](2);
|
|
@@ -446,11 +361,8 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
446
361
|
// the disconnectionHandler. Everything else can
|
|
447
362
|
// be retried
|
|
448
363
|
console.warn(_context4.t0);
|
|
449
|
-
|
|
450
364
|
_this3.streamConnection.disconnect();
|
|
451
|
-
|
|
452
365
|
return _context4.abrupt("return", subscriber.error(_context4.t0));
|
|
453
|
-
|
|
454
366
|
case 24:
|
|
455
367
|
case "end":
|
|
456
368
|
return _context4.stop();
|
|
@@ -458,34 +370,30 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
458
370
|
}
|
|
459
371
|
}, _callee4, null, [[2, 19]]);
|
|
460
372
|
}));
|
|
461
|
-
|
|
462
373
|
return function (_x4) {
|
|
463
374
|
return _ref3.apply(this, arguments);
|
|
464
375
|
};
|
|
465
376
|
}());
|
|
466
|
-
|
|
467
377
|
return resp$;
|
|
468
378
|
}
|
|
469
379
|
}, {
|
|
470
380
|
key: "postMessageWithAttachments",
|
|
471
381
|
value: function postMessageWithAttachments(message) {
|
|
472
382
|
var _this4 = this;
|
|
473
|
-
|
|
474
383
|
var attachments = message.attachments,
|
|
475
|
-
|
|
384
|
+
messageWithoutAttachments = (0, _objectWithoutProperties2["default"])(message, _excluded);
|
|
476
385
|
return _Observable.Observable.create(function (subscriber) {
|
|
477
386
|
var httpContentList = [];
|
|
478
|
-
(0, _asyncToGenerator2["default"])(
|
|
387
|
+
(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee6() {
|
|
479
388
|
var arrayBuffers, url, request, activityStream, resp, _yield$resp$streams$, id;
|
|
480
|
-
|
|
481
389
|
return _regenerator["default"].wrap(function _callee6$(_context6) {
|
|
482
390
|
while (1) {
|
|
483
391
|
switch (_context6.prev = _context6.next) {
|
|
484
392
|
case 0:
|
|
485
393
|
_context6.prev = 0;
|
|
486
394
|
_context6.next = 3;
|
|
487
|
-
return Promise.all(attachments.map(
|
|
488
|
-
var _ref5 = (0, _asyncToGenerator2["default"])(
|
|
395
|
+
return Promise.all(attachments.map(/*#__PURE__*/function () {
|
|
396
|
+
var _ref5 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee5(attachment) {
|
|
489
397
|
var media, res;
|
|
490
398
|
return _regenerator["default"].wrap(function _callee5$(_context5) {
|
|
491
399
|
while (1) {
|
|
@@ -494,18 +402,14 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
494
402
|
media = attachment;
|
|
495
403
|
_context5.next = 3;
|
|
496
404
|
return (0, _crossFetch["default"])(media.contentUrl);
|
|
497
|
-
|
|
498
405
|
case 3:
|
|
499
406
|
res = _context5.sent;
|
|
500
|
-
|
|
501
407
|
if (!res.ok) {
|
|
502
408
|
_context5.next = 12;
|
|
503
409
|
break;
|
|
504
410
|
}
|
|
505
|
-
|
|
506
411
|
_context5.next = 7;
|
|
507
412
|
return res.arrayBuffer();
|
|
508
|
-
|
|
509
413
|
case 7:
|
|
510
414
|
_context5.t0 = _context5.sent;
|
|
511
415
|
_context5.t1 = media;
|
|
@@ -513,10 +417,8 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
513
417
|
arrayBuffer: _context5.t0,
|
|
514
418
|
media: _context5.t1
|
|
515
419
|
});
|
|
516
|
-
|
|
517
420
|
case 12:
|
|
518
421
|
throw new Error('...');
|
|
519
|
-
|
|
520
422
|
case 13:
|
|
521
423
|
case "end":
|
|
522
424
|
return _context5.stop();
|
|
@@ -524,20 +426,16 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
524
426
|
}
|
|
525
427
|
}, _callee5);
|
|
526
428
|
}));
|
|
527
|
-
|
|
528
429
|
return function (_x5) {
|
|
529
430
|
return _ref5.apply(this, arguments);
|
|
530
431
|
};
|
|
531
432
|
}()));
|
|
532
|
-
|
|
533
433
|
case 3:
|
|
534
434
|
arrayBuffers = _context6.sent;
|
|
535
435
|
arrayBuffers.forEach(function (_ref6) {
|
|
536
436
|
var arrayBuffer = _ref6.arrayBuffer,
|
|
537
|
-
|
|
538
|
-
|
|
437
|
+
media = _ref6.media;
|
|
539
438
|
var buffer = _buffer.Buffer.from(arrayBuffer);
|
|
540
|
-
|
|
541
439
|
var stream = new BFSE.SubscribableStream();
|
|
542
440
|
stream.write(buffer);
|
|
543
441
|
var httpContent = new BFSE.HttpContent({
|
|
@@ -559,38 +457,30 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
559
457
|
});
|
|
560
458
|
_context6.next = 13;
|
|
561
459
|
return _this4.streamConnection.send(request);
|
|
562
|
-
|
|
563
460
|
case 13:
|
|
564
461
|
resp = _context6.sent;
|
|
565
|
-
|
|
566
462
|
if (!(resp.streams && resp.streams.length !== 1)) {
|
|
567
463
|
_context6.next = 18;
|
|
568
464
|
break;
|
|
569
465
|
}
|
|
570
|
-
|
|
571
466
|
subscriber.error(new Error("Invalid stream count ".concat(resp.streams.length)));
|
|
572
467
|
_context6.next = 24;
|
|
573
468
|
break;
|
|
574
|
-
|
|
575
469
|
case 18:
|
|
576
470
|
_context6.next = 20;
|
|
577
471
|
return resp.streams[0].readAsJson();
|
|
578
|
-
|
|
579
472
|
case 20:
|
|
580
473
|
_yield$resp$streams$ = _context6.sent;
|
|
581
474
|
id = _yield$resp$streams$.Id;
|
|
582
475
|
subscriber.next(id);
|
|
583
476
|
subscriber.complete();
|
|
584
|
-
|
|
585
477
|
case 24:
|
|
586
478
|
_context6.next = 29;
|
|
587
479
|
break;
|
|
588
|
-
|
|
589
480
|
case 26:
|
|
590
481
|
_context6.prev = 26;
|
|
591
482
|
_context6.t0 = _context6["catch"](0);
|
|
592
483
|
subscriber.error(_context6.t0);
|
|
593
|
-
|
|
594
484
|
case 29:
|
|
595
485
|
case "end":
|
|
596
486
|
return _context6.stop();
|
|
@@ -603,9 +493,8 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
603
493
|
}, {
|
|
604
494
|
key: "waitUntilOnline",
|
|
605
495
|
value: function () {
|
|
606
|
-
var _waitUntilOnline = (0, _asyncToGenerator2["default"])(
|
|
496
|
+
var _waitUntilOnline = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee7() {
|
|
607
497
|
var _this5 = this;
|
|
608
|
-
|
|
609
498
|
return _regenerator["default"].wrap(function _callee7$(_context7) {
|
|
610
499
|
while (1) {
|
|
611
500
|
switch (_context7.prev = _context7.next) {
|
|
@@ -619,7 +508,6 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
619
508
|
return reject(e);
|
|
620
509
|
});
|
|
621
510
|
}));
|
|
622
|
-
|
|
623
511
|
case 1:
|
|
624
512
|
case "end":
|
|
625
513
|
return _context7.stop();
|
|
@@ -627,48 +515,39 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
627
515
|
}
|
|
628
516
|
}, _callee7);
|
|
629
517
|
}));
|
|
630
|
-
|
|
631
518
|
function waitUntilOnline() {
|
|
632
519
|
return _waitUntilOnline.apply(this, arguments);
|
|
633
520
|
}
|
|
634
|
-
|
|
635
521
|
return waitUntilOnline;
|
|
636
522
|
}()
|
|
637
523
|
}, {
|
|
638
524
|
key: "connectAsync",
|
|
639
525
|
value: function () {
|
|
640
|
-
var _connectAsync = (0, _asyncToGenerator2["default"])(
|
|
526
|
+
var _connectAsync = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee9() {
|
|
641
527
|
var _this6 = this;
|
|
642
|
-
|
|
643
528
|
var re, params, abortController, urlSearchParams, wsUrl;
|
|
644
529
|
return _regenerator["default"].wrap(function _callee9$(_context9) {
|
|
645
530
|
while (1) {
|
|
646
531
|
switch (_context9.prev = _context9.next) {
|
|
647
532
|
case 0:
|
|
648
533
|
re = new RegExp('^http(s?)');
|
|
649
|
-
|
|
650
534
|
if (re.test(this.domain)) {
|
|
651
535
|
_context9.next = 3;
|
|
652
536
|
break;
|
|
653
537
|
}
|
|
654
|
-
|
|
655
538
|
throw 'Domain must begin with http or https';
|
|
656
|
-
|
|
657
539
|
case 3:
|
|
658
540
|
params = {
|
|
659
541
|
token: this.token
|
|
660
542
|
};
|
|
661
|
-
|
|
662
543
|
if (this.conversationId) {
|
|
663
544
|
params['conversationId'] = this.conversationId;
|
|
664
545
|
}
|
|
665
|
-
|
|
666
546
|
abortController = new AbortController();
|
|
667
547
|
urlSearchParams = new URLSearchParams(params).toString();
|
|
668
548
|
wsUrl = "".concat(this.domain.replace(re, 'ws$1'), "/conversations/connect?").concat(urlSearchParams); // This promise will resolve when it is disconnected.
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
var _ref7 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee8(resolve, reject) {
|
|
549
|
+
return _context9.abrupt("return", new Promise(/*#__PURE__*/function () {
|
|
550
|
+
var _ref7 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee8(resolve, reject) {
|
|
672
551
|
var request, response, responseString, conversation;
|
|
673
552
|
return _regenerator["default"].wrap(function _callee8$(_context8) {
|
|
674
553
|
while (1) {
|
|
@@ -685,7 +564,6 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
685
564
|
if (abortController.signal.aborted) {
|
|
686
565
|
throw new Error('Cannot process streaming request, `streamingConnection` should be disconnected.');
|
|
687
566
|
}
|
|
688
|
-
|
|
689
567
|
return _this6.theStreamHandler.processRequest(streamingRequest);
|
|
690
568
|
}
|
|
691
569
|
},
|
|
@@ -694,59 +572,46 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
694
572
|
_this6.queueActivities = true;
|
|
695
573
|
_context8.next = 5;
|
|
696
574
|
return _this6.streamConnection.connect();
|
|
697
|
-
|
|
698
575
|
case 5:
|
|
699
576
|
request = BFSE.StreamingRequest.create('POST', '/v3/directline/conversations');
|
|
700
577
|
_context8.next = 8;
|
|
701
578
|
return _this6.streamConnection.send(request);
|
|
702
|
-
|
|
703
579
|
case 8:
|
|
704
580
|
response = _context8.sent;
|
|
705
|
-
|
|
706
581
|
if (!(response.statusCode !== 200)) {
|
|
707
582
|
_context8.next = 11;
|
|
708
583
|
break;
|
|
709
584
|
}
|
|
710
|
-
|
|
711
585
|
throw new Error('Connection response code ' + response.statusCode);
|
|
712
|
-
|
|
713
586
|
case 11:
|
|
714
587
|
if (!(response.streams.length !== 1)) {
|
|
715
588
|
_context8.next = 13;
|
|
716
589
|
break;
|
|
717
590
|
}
|
|
718
|
-
|
|
719
591
|
throw new Error('Expected 1 stream but got ' + response.streams.length);
|
|
720
|
-
|
|
721
592
|
case 13:
|
|
722
593
|
_context8.next = 15;
|
|
723
594
|
return response.streams[0].readAsString();
|
|
724
|
-
|
|
725
595
|
case 15:
|
|
726
596
|
responseString = _context8.sent;
|
|
727
597
|
conversation = JSON.parse(responseString);
|
|
728
598
|
_this6.conversationId = conversation.conversationId;
|
|
599
|
+
_this6.connectionStatus$.next(_directLine.ConnectionStatus.Online);
|
|
729
600
|
|
|
730
|
-
|
|
601
|
+
// Wait until DL consumers have had a chance to be notified
|
|
731
602
|
// of the connection status change.
|
|
732
603
|
// This is specific to RxJS implementation of observable, which calling subscribe() after next() will still get the value.
|
|
733
|
-
|
|
734
|
-
|
|
735
604
|
_context8.next = 21;
|
|
736
605
|
return _this6.waitUntilOnline();
|
|
737
|
-
|
|
738
606
|
case 21:
|
|
739
607
|
_this6.theStreamHandler.flush();
|
|
740
|
-
|
|
741
608
|
_this6.queueActivities = false;
|
|
742
609
|
_context8.next = 28;
|
|
743
610
|
break;
|
|
744
|
-
|
|
745
611
|
case 25:
|
|
746
612
|
_context8.prev = 25;
|
|
747
613
|
_context8.t0 = _context8["catch"](0);
|
|
748
614
|
reject(_context8.t0);
|
|
749
|
-
|
|
750
615
|
case 28:
|
|
751
616
|
case "end":
|
|
752
617
|
return _context8.stop();
|
|
@@ -754,14 +619,12 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
754
619
|
}
|
|
755
620
|
}, _callee8, null, [[0, 25]]);
|
|
756
621
|
}));
|
|
757
|
-
|
|
758
622
|
return function (_x6, _x7) {
|
|
759
623
|
return _ref7.apply(this, arguments);
|
|
760
624
|
};
|
|
761
625
|
}())["finally"](function () {
|
|
762
626
|
return abortController.abort();
|
|
763
627
|
}));
|
|
764
|
-
|
|
765
628
|
case 9:
|
|
766
629
|
case "end":
|
|
767
630
|
return _context9.stop();
|
|
@@ -769,19 +632,16 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
769
632
|
}
|
|
770
633
|
}, _callee9, this);
|
|
771
634
|
}));
|
|
772
|
-
|
|
773
635
|
function connectAsync() {
|
|
774
636
|
return _connectAsync.apply(this, arguments);
|
|
775
637
|
}
|
|
776
|
-
|
|
777
638
|
return connectAsync;
|
|
778
639
|
}()
|
|
779
640
|
}, {
|
|
780
641
|
key: "connectWithRetryAsync",
|
|
781
642
|
value: function () {
|
|
782
|
-
var _connectWithRetryAsync = (0, _asyncToGenerator2["default"])(
|
|
643
|
+
var _connectWithRetryAsync = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee10() {
|
|
783
644
|
var _this7 = this;
|
|
784
|
-
|
|
785
645
|
var numRetries, start;
|
|
786
646
|
return _regenerator["default"].wrap(function _callee10$(_context10) {
|
|
787
647
|
while (1) {
|
|
@@ -789,83 +649,68 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
789
649
|
case 0:
|
|
790
650
|
_context10.next = 2;
|
|
791
651
|
return (this.connectDeferred = (0, _createDeferred["default"])()).promise;
|
|
792
|
-
|
|
793
652
|
case 2:
|
|
794
653
|
numRetries = MAX_RETRY_COUNT;
|
|
795
654
|
this.connectionStatus$.next(_directLine.ConnectionStatus.Connecting);
|
|
796
|
-
|
|
797
655
|
case 4:
|
|
798
656
|
if (!(numRetries > 0)) {
|
|
799
657
|
_context10.next = 27;
|
|
800
658
|
break;
|
|
801
659
|
}
|
|
802
|
-
|
|
803
660
|
numRetries--;
|
|
804
661
|
start = Date.now();
|
|
805
662
|
_context10.prev = 7;
|
|
806
663
|
_context10.next = 10;
|
|
807
664
|
return this.connectAsync();
|
|
808
|
-
|
|
809
665
|
case 10:
|
|
810
666
|
_context10.next = 15;
|
|
811
667
|
break;
|
|
812
|
-
|
|
813
668
|
case 12:
|
|
814
669
|
_context10.prev = 12;
|
|
815
670
|
_context10.t0 = _context10["catch"](7);
|
|
816
671
|
console.error(_context10.t0);
|
|
817
|
-
|
|
818
672
|
case 15:
|
|
819
673
|
if (!(this.connectionStatus$.getValue() === _directLine.ConnectionStatus.Ended)) {
|
|
820
674
|
_context10.next = 17;
|
|
821
675
|
break;
|
|
822
676
|
}
|
|
823
|
-
|
|
824
677
|
return _context10.abrupt("return");
|
|
825
|
-
|
|
826
678
|
case 17:
|
|
827
679
|
// Make sure we don't signal ConnectionStatus.Connecting twice or more without an actual connection.
|
|
828
680
|
// Subsequent retries should be transparent.
|
|
829
681
|
if (this.connectionStatus$.getValue() !== _directLine.ConnectionStatus.Connecting) {
|
|
830
682
|
this.connectionStatus$.next(_directLine.ConnectionStatus.Connecting);
|
|
831
|
-
}
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
// If the current connection lasted for more than a minute, the previous connection is good, which means:
|
|
832
686
|
// - we should reset the retry counter, and;
|
|
833
687
|
// - we should reconnect immediately.
|
|
834
|
-
|
|
835
|
-
|
|
836
688
|
if (!(60000 < Date.now() - start)) {
|
|
837
689
|
_context10.next = 22;
|
|
838
690
|
break;
|
|
839
691
|
}
|
|
840
|
-
|
|
841
692
|
numRetries = MAX_RETRY_COUNT;
|
|
842
693
|
_context10.next = 25;
|
|
843
694
|
break;
|
|
844
|
-
|
|
845
695
|
case 22:
|
|
846
696
|
if (!(numRetries > 0)) {
|
|
847
697
|
_context10.next = 25;
|
|
848
698
|
break;
|
|
849
699
|
}
|
|
850
|
-
|
|
851
700
|
_context10.next = 25;
|
|
852
701
|
return new Promise(function (r) {
|
|
853
702
|
return setTimeout(r, _this7.getRetryDelay());
|
|
854
703
|
});
|
|
855
|
-
|
|
856
704
|
case 25:
|
|
857
705
|
_context10.next = 4;
|
|
858
706
|
break;
|
|
859
|
-
|
|
860
707
|
case 27:
|
|
861
708
|
// TODO: [TEST] Make sure FailedToConnect is reported immediately after last disconnection, should be no getRetryDelay().
|
|
862
709
|
// Failed to reconnect after multiple retries.
|
|
863
710
|
this.connectionStatus$.next(_directLine.ConnectionStatus.FailedToConnect);
|
|
864
|
-
|
|
865
711
|
case 28:
|
|
866
712
|
_context10.next = 0;
|
|
867
713
|
break;
|
|
868
|
-
|
|
869
714
|
case 30:
|
|
870
715
|
case "end":
|
|
871
716
|
return _context10.stop();
|
|
@@ -873,14 +718,11 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
873
718
|
}
|
|
874
719
|
}, _callee10, this, [[7, 12]]);
|
|
875
720
|
}));
|
|
876
|
-
|
|
877
721
|
function connectWithRetryAsync() {
|
|
878
722
|
return _connectWithRetryAsync.apply(this, arguments);
|
|
879
723
|
}
|
|
880
|
-
|
|
881
724
|
return connectWithRetryAsync;
|
|
882
725
|
}() // Returns the delay duration in milliseconds
|
|
883
|
-
|
|
884
726
|
}, {
|
|
885
727
|
key: "getRetryDelay",
|
|
886
728
|
value: function getRetryDelay() {
|
|
@@ -889,6 +731,5 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
889
731
|
}]);
|
|
890
732
|
return DirectLineStreaming;
|
|
891
733
|
}();
|
|
892
|
-
|
|
893
734
|
exports.DirectLineStreaming = DirectLineStreaming;
|
|
894
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9kaXJlY3RMaW5lU3RyZWFtaW5nLnRzIl0sIm5hbWVzIjpbIkRJUkVDVF9MSU5FX1ZFUlNJT04iLCJNQVhfUkVUUllfQ09VTlQiLCJyZWZyZXNoVG9rZW5MaWZldGltZSIsInJlZnJlc2hUb2tlbkludGVydmFsIiwiU3RyZWFtSGFuZGxlciIsInMiLCJjJCIsInNxIiwic3Vic2NyaWJlciIsImNvbm5lY3Rpb25TdGF0dXMkIiwic2hvdWxkUXVldWUiLCJyZXF1ZXN0IiwibG9nZ2VyIiwic3RyZWFtcyIsInN0cmVhbTAiLCJzaGlmdCIsInJlYWRBc1N0cmluZyIsImFjdGl2aXR5U2V0SnNvbiIsImFjdGl2aXR5U2V0IiwiSlNPTiIsInBhcnNlIiwiYWN0aXZpdGllcyIsImxlbmd0aCIsImVycm9yIiwiRXJyb3IiLCJCRlNFIiwiU3RyZWFtaW5nUmVzcG9uc2UiLCJjcmVhdGUiLCJhY3Rpdml0eSIsImF0dGFjaG1lbnRzIiwic3RyZWFtIiwiYXR0YWNobWVudCIsImRhdGFVcmkiLCJwdXNoIiwiY29udGVudFR5cGUiLCJjb250ZW50VXJsIiwiYWN0aXZpdHlRdWV1ZSIsIm5leHQiLCJzdWJzY3JpYmUiLCJmb3JFYWNoIiwiYSIsImNvbXBsZXRlIiwiRGlyZWN0TGluZVN0cmVhbWluZyIsIm9wdGlvbnMiLCJCZWhhdmlvclN1YmplY3QiLCJDb25uZWN0aW9uU3RhdHVzIiwiVW5pbml0aWFsaXplZCIsIm5ldHdvcmtJbmZvcm1hdGlvbiIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwidHlwZSIsImNvbnNvbGUiLCJ3YXJuIiwidG9rZW4iLCJyZWZyZXNoVG9rZW4iLCJFeHBpcmVkVG9rZW4iLCJkb21haW4iLCJjb252ZXJzYXRpb25JZCIsIl9ib3RBZ2VudCIsImdldEJvdEFnZW50IiwiYm90QWdlbnQiLCJxdWV1ZUFjdGl2aXRpZXMiLCJhY3Rpdml0eSQiLCJPYnNlcnZhYmxlIiwiYWN0aXZpdHlTdWJzY3JpYmVyIiwidGhlU3RyZWFtSGFuZGxlciIsImNvbm5lY3REZWZlcnJlZCIsInJlc29sdmUiLCJzaGFyZSIsImNvbm5lY3RXaXRoUmV0cnlBc3luYyIsImdldFZhbHVlIiwiRW5kZWQiLCJzdHJlYW1Db25uZWN0aW9uIiwiZGlzY29ubmVjdCIsIkF1dGhvcml6YXRpb24iLCJjdXN0b21BZ2VudCIsImNsaWVudEFnZW50IiwiZmlyc3RDYWxsIiwicmV0cnlDb3VudCIsIndhaXRVbnRpbE9ubGluZSIsIm51bWJlck9mQXR0ZW1wdHMiLCJQcm9taXNlIiwiciIsInNldFRpbWVvdXQiLCJtZXRob2QiLCJoZWFkZXJzIiwiY29tbW9uSGVhZGVycyIsInJlcyIsIm9rIiwianNvbiIsInN0YXR1cyIsInN0YXR1c1RleHQiLCJ2YWx1ZSIsIkZhaWxlZFRvQ29ubmVjdCIsInBvc3RNZXNzYWdlV2l0aEF0dGFjaG1lbnRzIiwicmVzcCQiLCJTdHJlYW1pbmdSZXF1ZXN0Iiwic2V0Qm9keSIsInN0cmluZ2lmeSIsInNlbmQiLCJyZXNwIiwic3RhdHVzQ29kZSIsIm51bWJlck9mU3RyZWFtcyIsImlkU3RyaW5nIiwiaWQiLCJJZCIsIm1lc3NhZ2UiLCJtZXNzYWdlV2l0aG91dEF0dGFjaG1lbnRzIiwiaHR0cENvbnRlbnRMaXN0IiwiYWxsIiwibWFwIiwibWVkaWEiLCJhcnJheUJ1ZmZlciIsImFycmF5QnVmZmVycyIsImJ1ZmZlciIsIkJ1ZmZlciIsImZyb20iLCJTdWJzY3JpYmFibGVTdHJlYW0iLCJ3cml0ZSIsImh0dHBDb250ZW50IiwiSHR0cENvbnRlbnQiLCJjb250ZW50TGVuZ3RoIiwidXJsIiwiYWN0aXZpdHlTdHJlYW0iLCJhZGRTdHJlYW0iLCJlIiwicmVhZEFzSnNvbiIsInJlamVjdCIsImNzIiwiT25saW5lIiwicmUiLCJSZWdFeHAiLCJ0ZXN0IiwicGFyYW1zIiwiYWJvcnRDb250cm9sbGVyIiwiQWJvcnRDb250cm9sbGVyIiwidXJsU2VhcmNoUGFyYW1zIiwiVVJMU2VhcmNoUGFyYW1zIiwidG9TdHJpbmciLCJ3c1VybCIsInJlcGxhY2UiLCJXZWJTb2NrZXRDbGllbnRXaXRoTmV0d29ya0luZm9ybWF0aW9uIiwiZGlzY29ubmVjdGlvbkhhbmRsZXIiLCJyZXF1ZXN0SGFuZGxlciIsInByb2Nlc3NSZXF1ZXN0Iiwic3RyZWFtaW5nUmVxdWVzdCIsInNpZ25hbCIsImFib3J0ZWQiLCJjb25uZWN0IiwicmVzcG9uc2UiLCJyZXNwb25zZVN0cmluZyIsImNvbnZlcnNhdGlvbiIsImZsdXNoIiwiYWJvcnQiLCJwcm9taXNlIiwibnVtUmV0cmllcyIsIkNvbm5lY3RpbmciLCJzdGFydCIsIkRhdGUiLCJub3ciLCJjb25uZWN0QXN5bmMiLCJnZXRSZXRyeURlbGF5IiwiTWF0aCIsImZsb29yIiwicmFuZG9tIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOzs7Ozs7OztBQUdBLElBQU1BLG1CQUFtQixHQUFHLGdCQUE1QjtBQUNBLElBQU1DLGVBQWUsR0FBRyxDQUF4QjtBQUNBLElBQU1DLG9CQUFvQixHQUFHLEtBQUssRUFBTCxHQUFVLElBQXZDLEMsQ0FDQTtBQUNBOztBQUNBLElBQU1DLG9CQUFvQixHQUFHRCxvQkFBb0IsR0FBRyxDQUFwRDs7SUFnQk1FLGE7QUFNSix5QkFBWUMsQ0FBWixFQUFxQ0MsRUFBckMsRUFBdUVDLEVBQXZFLEVBQTBGO0FBQUE7QUFBQSw0REFGakQsRUFFaUQ7QUFDeEYsU0FBS0MsVUFBTCxHQUFrQkgsQ0FBbEI7QUFDQSxTQUFLSSxpQkFBTCxHQUF5QkgsRUFBekI7QUFDQSxTQUFLSSxXQUFMLEdBQW1CSCxFQUFuQjtBQUNEOzs7O1dBRUQsdUJBQXFCRixDQUFyQixFQUE4QztBQUM1QyxXQUFLRyxVQUFMLEdBQWtCSCxDQUFsQjtBQUNEOzs7OzBHQUVELGlCQUFxQk0sT0FBckIsRUFBb0RDLE1BQXBEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNRQyxnQkFBQUEsT0FE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LGdCQUFBQSxPQUFPLENBQUM1QixLQUFSOztBQXJCUjtBQUFBLHNCQXlCVSxLQUFLZCxpQkFBTCxDQUF1QjZELFFBQXZCLE9BQXNDekIsNkJBQWlCMEIsS0F6QmpFO0FBQUE7QUFBQTtBQUFBOztBQUFBOztBQUFBO0FBOEJNO0FBQ0E7QUFDQSxvQkFBSSxLQUFLOUQsaUJBQUwsQ0FBdUI2RCxRQUF2QixPQUFzQ3pCLDZCQUFpQitHLFVBQTNELEVBQXVFO0FBQ3JFLHVCQUFLbkosaUJBQUwsQ0FBdUI0QixJQUF2QixDQUE0QlEsNkJBQWlCK0csVUFBN0M7QUFDRCxpQkFsQ1AsQ0FvQ007QUFDQTtBQUNBOzs7QUF0Q04sc0JBdUNVLFFBQVFFLElBQUksQ0FBQ0MsR0FBTCxLQUFhRixLQXZDL0I7QUFBQTtBQUFBO0FBQUE7O0FBd0NRRixnQkFBQUEsVUFBVSxHQUFHMUosZUFBYjtBQXhDUjtBQUFBOztBQUFBO0FBQUEsc0JBeUNpQjBKLFVBQVUsR0FBRyxDQXpDOUI7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQSx1QkEyQ2MsSUFBSTFFLE9BQUosQ0FBWSxVQUFBQyxDQUFDO0FBQUEseUJBQUlDLFVBQVUsQ0FBQ0QsQ0FBRCxFQUFJLE1BQUksQ0FBQytFLGFBQUwsRUFBSixDQUFkO0FBQUEsaUJBQWIsQ0EzQ2Q7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBK0NJO0FBQ0E7QUFDQSxxQkFBS3hKLGlCQUFMLENBQXVCNEIsSUFBdkIsQ0FBNEJRLDZCQUFpQmdELGVBQTdDOztBQWpESjtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTzs7Ozs7OztRQXVEQTs7OztXQUNBLHlCQUF3QjtBQUN0QixhQUFPcUUsSUFBSSxDQUFDQyxLQUFMLENBQVcsT0FBT0QsSUFBSSxDQUFDRSxNQUFMLEtBQWdCLEtBQWxDLENBQVA7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbIi8vIEluIG9yZGVyIHRvIGtlZXAgZmlsZSBzaXplIGRvd24sIG9ubHkgaW1wb3J0IHRoZSBwYXJ0cyBvZiByeGpzIHRoYXQgd2UgdXNlXG5cbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMvQmVoYXZpb3JTdWJqZWN0JztcbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ2J1ZmZlcic7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcy9PYnNlcnZhYmxlJztcbmltcG9ydCB7IFN1YnNjcmliZXIgfSBmcm9tICdyeGpzL1N1YnNjcmliZXInO1xuaW1wb3J0ICogYXMgQkZTRSBmcm9tICdib3RmcmFtZXdvcmstc3RyZWFtaW5nJztcbmltcG9ydCBjcmVhdGVEZWZlcnJlZCBmcm9tICcuL2NyZWF0ZURlZmVycmVkJztcbmltcG9ydCBmZXRjaCBmcm9tICdjcm9zcy1mZXRjaCc7XG5cbmltcG9ydCB7IEFjdGl2aXR5LCBDb25uZWN0aW9uU3RhdHVzLCBDb252ZXJzYXRpb24sIERpcmVjdExpbmUsIElCb3RDb25uZWN0aW9uLCBNZWRpYSwgTWVzc2FnZSB9IGZyb20gJy4vZGlyZWN0TGluZSc7XG5pbXBvcnQgV2ViU29ja2V0Q2xpZW50V2l0aE5ldHdvcmtJbmZvcm1hdGlvbiBmcm9tICcuL3N0cmVhbWluZy9XZWJTb2NrZXRDbGllbnRXaXRoTmV0d29ya0luZm9ybWF0aW9uJztcbmltcG9ydCB0eXBlIHsgRGVmZXJyZWQgfSBmcm9tICcuL2NyZWF0ZURlZmVycmVkJztcblxuY29uc3QgRElSRUNUX0xJTkVfVkVSU0lPTiA9ICdEaXJlY3RMaW5lLzMuMCc7XG5jb25zdCBNQVhfUkVUUllfQ09VTlQgPSAzO1xuY29uc3QgcmVmcmVzaFRva2VuTGlmZXRpbWUgPSAzMCAqIDYwICogMTAwMDtcbi8vY29uc3QgcmVmcmVzaFRva2VuTGlmZXRpbWUgPSA1MDAwO1xuLy8gY29uc3QgdGltZW91dCA9IDIwICogMTAwMDtcbmNvbnN0IHJlZnJlc2hUb2tlbkludGVydmFsID0gcmVmcmVzaFRva2VuTGlmZXRpbWUgLyAyO1xuXG5pbnRlcmZhY2UgRGlyZWN0TGluZVN0cmVhbWluZ09wdGlvbnMge1xuICB0b2tlbjogc3RyaW5nO1xuICBjb252ZXJzYXRpb25JZD86IHN0cmluZztcbiAgZG9tYWluOiBzdHJpbmc7XG4gIC8vIEF0dGFjaGVkIHRvIGFsbCByZXF1ZXN0cyB0byBpZGVudGlmeSByZXF1ZXN0aW5nIGFnZW50LlxuICBib3RBZ2VudD86IHN0cmluZztcblxuICAvKipcbiAgICogU2V0cyB0aGUgW2BOZXR3b3JrSW5mb3JtYXRpb25gIEFQSV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL05ldHdvcmtfSW5mb3JtYXRpb25fQVBJKS5cbiAgICogV2hlbiB0aGUgYE5ldHdvcmtJbmZvcm1hdGlvbmAgZGV0ZWN0IG5ldHdvcmsgY2hhbmdlcyBvciBvZmZsaW5lLCBpdCB3aWxsIGRpc2Nvbm5lY3QgdGhlIFdlYiBTb2NrZXQgYW5kIHJlY29ubmVjdCBpdC5cbiAgICovXG4gIG5ldHdvcmtJbmZvcm1hdGlvbj86IE5ldHdvcmtJbmZvcm1hdGlvbjtcbn1cblxuY2xhc3MgU3RyZWFtSGFuZGxlciBpbXBsZW1lbnRzIEJGU0UuUmVxdWVzdEhhbmRsZXIge1xuICBwcml2YXRlIGNvbm5lY3Rpb25TdGF0dXMkO1xuICBwcml2YXRlIHN1YnNjcmliZXI6IFN1YnNjcmliZXI8QWN0aXZpdHk+O1xuICBwcml2YXRlIHNob3VsZFF1ZXVlOiAoKSA9PiBib29sZWFuO1xuICBwcml2YXRlIGFjdGl2aXR5UXVldWU6IEFycmF5PEFjdGl2aXR5PiA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHM6IFN1YnNjcmliZXI8QWN0aXZpdHk+LCBjJDogT2JzZXJ2YWJsZTxDb25uZWN0aW9uU3RhdHVzPiwgc3E6ICgpID0+IGJvb2xlYW4pIHtcbiAgICB0aGlzLnN1YnNjcmliZXIgPSBzO1xuICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQgPSBjJDtcbiAgICB0aGlzLnNob3VsZFF1ZXVlID0gc3E7XG4gIH1cblxuICBwdWJsaWMgc2V0U3Vic2NyaWJlcihzOiBTdWJzY3JpYmVyPEFjdGl2aXR5Pikge1xuICAgIHRoaXMuc3Vic2NyaWJlciA9IHM7XG4gIH1cblxuICBhc3luYyBwcm9jZXNzUmVxdWVzdChyZXF1ZXN0OiBCRlNFLklSZWNlaXZlUmVxdWVzdCwgbG9nZ2VyPzogYW55KTogUHJvbWlzZTxCRlNFLlN0cmVhbWluZ1Jlc3BvbnNlPiB7XG4gICAgY29uc3Qgc3RyZWFtcyA9IFsuLi5yZXF1ZXN0LnN0cmVhbXNdO1xuICAgIGNvbnN0IHN0cmVhbTAgPSBzdHJlYW1zLnNoaWZ0KCk7XG4gICAgY29uc3QgYWN0aXZpdHlTZXRKc29uID0gYXdhaXQgc3RyZWFtMC5yZWFkQXNTdHJpbmcoKTtcbiAgICBjb25zdCBhY3Rpdml0eVNldCA9IEpTT04ucGFyc2UoYWN0aXZpdHlTZXRKc29uKTtcblxuICAgIGlmIChhY3Rpdml0eVNldC5hY3Rpdml0aWVzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgLy8gT25seSBvbmUgYWN0aXZpdHkgaXMgZXhwZWN0ZWQgaW4gYSBzZXQgaW4gc3RyZWFtaW5nXG4gICAgICB0aGlzLnN1YnNjcmliZXIuZXJyb3IobmV3IEVycm9yKCd0aGVyZSBzaG91bGQgYmUgZXhhY3RseSBvbmUgYWN0aXZpdHknKSk7XG4gICAgICByZXR1cm4gQkZTRS5TdHJlYW1pbmdSZXNwb25zZS5jcmVhdGUoNTAwKTtcbiAgICB9XG5cbiAgICBjb25zdCBhY3Rpdml0eSA9IGFjdGl2aXR5U2V0LmFjdGl2aXRpZXNbMF07XG5cbiAgICBpZiAoc3RyZWFtcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBhdHRhY2htZW50cyA9IFsuLi5hY3Rpdml0eS5hdHRhY2htZW50c107XG5cbiAgICAgIGxldCBzdHJlYW06IEJGU0UuQ29udGVudFN0cmVhbTtcbiAgICAgIHdoaWxlICgoc3RyZWFtID0gc3RyZWFtcy5zaGlmdCgpKSkge1xuICAgICAgICBjb25zdCBhdHRhY2htZW50ID0gYXdhaXQgc3RyZWFtLnJlYWRBc1N0cmluZygpO1xuICAgICAgICBjb25zdCBkYXRhVXJpID0gJ2RhdGE6dGV4dC9wbGFpbjtiYXNlNjQsJyArIGF0dGFjaG1lbnQ7XG4gICAgICAgIGF0dGFjaG1lbnRzLnB1c2goeyBjb250ZW50VHlwZTogc3RyZWFtLmNvbnRlbnRUeXBlLCBjb250ZW50VXJsOiBkYXRhVXJpIH0pO1xuICAgICAgfVxuXG4gICAgICBhY3Rpdml0eS5hdHRhY2htZW50cyA9IGF0dGFjaG1lbnRzO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNob3VsZFF1ZXVlKCkpIHtcbiAgICAgIHRoaXMuYWN0aXZpdHlRdWV1ZS5wdXNoKGFjdGl2aXR5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdWJzY3JpYmVyLm5leHQoYWN0aXZpdHkpO1xuICAgIH1cblxuICAgIHJldHVybiBCRlNFLlN0cmVhbWluZ1Jlc3BvbnNlLmNyZWF0ZSgyMDApO1xuICB9XG5cbiAgcHVibGljIGZsdXNoKCkge1xuICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQuc3Vic2NyaWJlKCgpID0+IHt9KTtcbiAgICB0aGlzLmFjdGl2aXR5UXVldWUuZm9yRWFjaChhID0+IHRoaXMuc3Vic2NyaWJlci5uZXh0KGEpKTtcbiAgICB0aGlzLmFjdGl2aXR5UXVldWUgPSBbXTtcbiAgfVxuXG4gIHB1YmxpYyBlbmQoKSB7XG4gICAgdGhpcy5zdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERpcmVjdExpbmVTdHJlYW1pbmcgaW1wbGVtZW50cyBJQm90Q29ubmVjdGlvbiB7XG4gIHB1YmxpYyBjb25uZWN0aW9uU3RhdHVzJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoQ29ubmVjdGlvblN0YXR1cy5VbmluaXRpYWxpemVkKTtcbiAgcHVibGljIGFjdGl2aXR5JDogT2JzZXJ2YWJsZTxBY3Rpdml0eT47XG5cbiAgcHJpdmF0ZSBhY3Rpdml0eVN1YnNjcmliZXI6IFN1YnNjcmliZXI8QWN0aXZpdHk+O1xuICBwcml2YXRlIGNvbm5lY3REZWZlcnJlZDogRGVmZXJyZWQ8dm9pZD47XG4gIHByaXZhdGUgdGhlU3RyZWFtSGFuZGxlcjogU3RyZWFtSGFuZGxlcjtcblxuICBwcml2YXRlIGRvbWFpbjogc3RyaW5nO1xuXG4gIHByaXZhdGUgY29udmVyc2F0aW9uSWQ6IHN0cmluZztcbiAgcHJpdmF0ZSB0b2tlbjogc3RyaW5nO1xuICBwcml2YXRlIHN0cmVhbUNvbm5lY3Rpb246IEJGU0UuV2ViU29ja2V0Q2xpZW50O1xuICBwcml2YXRlIHF1ZXVlQWN0aXZpdGllczogYm9vbGVhbjtcblxuICBwcml2YXRlIF9ib3RBZ2VudCA9ICcnO1xuXG4gICNuZXR3b3JrSW5mb3JtYXRpb246IE5ldHdvcmtJbmZvcm1hdGlvbiB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBEaXJlY3RMaW5lU3RyZWFtaW5nT3B0aW9ucykge1xuICAgIC8vIFJlY3RpZmllcyBgb3B0aW9ucy5uZXR3b3JrSW5mb3JtYXRpb25gLlxuICAgIGNvbnN0IG5ldHdvcmtJbmZvcm1hdGlvbiA9IG9wdGlvbnM/Lm5ldHdvcmtJbmZvcm1hdGlvbjtcblxuICAgIGlmIChcbiAgICAgIHR5cGVvZiBuZXR3b3JrSW5mb3JtYXRpb24gPT09ICd1bmRlZmluZWQnIHx8XG4gICAgICAodHlwZW9mIG5ldHdvcmtJbmZvcm1hdGlvbi5hZGRFdmVudExpc3RlbmVyID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAgIHR5cGVvZiBuZXR3b3JrSW5mb3JtYXRpb24ucmVtb3ZlRXZlbnRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgICB0eXBlb2YgbmV0d29ya0luZm9ybWF0aW9uLnR5cGUgPT09ICdzdHJpbmcnKVxuICAgICkge1xuICAgICAgdGhpcy4jbmV0d29ya0luZm9ybWF0aW9uID0gbmV0d29ya0luZm9ybWF0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICdib3RmcmFtZXdvcmstZGlyZWN0bGluZWpzOiBcIm5ldHdvcmtJbmZvcm1hdGlvblwiIG9wdGlvbiBzcGVjaWZpZWQgbXVzdCBiZSBhIGBOZXR3b3JrSW5mb3JtYXRpb25gLWxpa2UgaW5zdGFuY2UgZXh0ZW5kaW5nIGBFdmVudFRhcmdldGAgaW50ZXJmYWNlIHdpdGggYSBgdHlwZWAgcHJvcGVydHkgcmV0dXJuaW5nIGEgc3RyaW5nLidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy50b2tlbiA9IG9wdGlvbnMudG9rZW47XG5cbiAgICB0aGlzLnJlZnJlc2hUb2tlbigpLmNhdGNoKCgpID0+IHtcbiAgICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQubmV4dChDb25uZWN0aW9uU3RhdHVzLkV4cGlyZWRUb2tlbik7XG4gICAgfSk7XG5cbiAgICB0aGlzLmRvbWFpbiA9IG9wdGlvbnMuZG9tYWluO1xuXG4gICAgaWYgKG9wdGlvbnMuY29udmVyc2F0aW9uSWQpIHtcbiAgICAgIHRoaXMuY29udmVyc2F0aW9uSWQgPSBvcHRpb25zLmNvbnZlcnNhdGlvbklkO1xuICAgIH1cblxuICAgIHRoaXMuX2JvdEFnZW50ID0gdGhpcy5nZXRCb3RBZ2VudChvcHRpb25zLmJvdEFnZW50KTtcblxuICAgIHRoaXMucXVldWVBY3Rpdml0aWVzID0gdHJ1ZTtcbiAgICB0aGlzLmFjdGl2aXR5JCA9IE9ic2VydmFibGUuY3JlYXRlKGFzeW5jIChzdWJzY3JpYmVyOiBTdWJzY3JpYmVyPEFjdGl2aXR5PikgPT4ge1xuICAgICAgdGhpcy5hY3Rpdml0eVN1YnNjcmliZXIgPSBzdWJzY3JpYmVyO1xuICAgICAgdGhpcy50aGVTdHJlYW1IYW5kbGVyID0gbmV3IFN0cmVhbUhhbmRsZXIoc3Vic2NyaWJlciwgdGhpcy5jb25uZWN0aW9uU3RhdHVzJCwgKCkgPT4gdGhpcy5xdWV1ZUFjdGl2aXRpZXMpO1xuXG4gICAgICAvLyBSZXNvbHZpbmcgY29ubmVjdERlZmVycmVkIHdpbGwga2ljay1vZmYgdGhlIGNvbm5lY3Rpb24uXG4gICAgICB0aGlzLmNvbm5lY3REZWZlcnJlZC5yZXNvbHZlKCk7XG4gICAgfSkuc2hhcmUoKTtcblxuICAgIC8vIGNvbm5lY3RXaXRoUmV0cnlBc3luYygpIHdpbGwgY3JlYXRlIHRoZSBjb25uZWN0RGVmZXJyZWQgb2JqZWN0IHJlcXVpcmVkIGluIGFjdGl2aXR5JC5cbiAgICB0aGlzLmNvbm5lY3RXaXRoUmV0cnlBc3luYygpO1xuICB9XG5cbiAgcHVibGljIHJlY29ubmVjdCh7IGNvbnZlcnNhdGlvbklkLCB0b2tlbiB9OiBDb252ZXJzYXRpb24pIHtcbiAgICBpZiAodGhpcy5jb25uZWN0aW9uU3RhdHVzJC5nZXRWYWx1ZSgpID09PSBDb25uZWN0aW9uU3RhdHVzLkVuZGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nvbm5lY3Rpb24gaGFzIGVuZGVkLicpO1xuICAgIH1cblxuICAgIHRoaXMuY29udmVyc2F0aW9uSWQgPSBjb252ZXJzYXRpb25JZDtcbiAgICB0aGlzLnRva2VuID0gdG9rZW47XG5cbiAgICB0aGlzLmNvbm5lY3REZWZlcnJlZC5yZXNvbHZlKCk7XG4gIH1cblxuICBlbmQoKSB7XG4gICAgLy8gT25jZSBlbmQoKSBpcyBjYWxsZWQsIG5vIHJlY29ubmVjdGlvbiBjYW4gYmUgbWFkZS5cbiAgICB0aGlzLmFjdGl2aXR5U3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuXG4gICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJC5uZXh0KENvbm5lY3Rpb25TdGF0dXMuRW5kZWQpO1xuICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQuY29tcGxldGUoKTtcblxuICAgIHRoaXMuc3RyZWFtQ29ubmVjdGlvbi5kaXNjb25uZWN0KCk7XG4gIH1cblxuICBwcml2YXRlIGNvbW1vbkhlYWRlcnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0aGlzLnRva2VufWAsXG4gICAgICAneC1tcy1ib3QtYWdlbnQnOiB0aGlzLl9ib3RBZ2VudFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldEJvdEFnZW50KGN1c3RvbUFnZW50OiBzdHJpbmcgPSAnJyk6IHN0cmluZyB7XG4gICAgbGV0IGNsaWVudEFnZW50ID0gJ2RpcmVjdGxpbmVTdHJlYW1pbmcnO1xuXG4gICAgaWYgKGN1c3RvbUFnZW50KSB7XG4gICAgICBjbGllbnRBZ2VudCArPSBgOyAke2N1c3RvbUFnZW50fWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAke0RJUkVDVF9MSU5FX1ZFUlNJT059ICgke2NsaWVudEFnZW50fSlgO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoVG9rZW4oZmlyc3RDYWxsID0gdHJ1ZSwgcmV0cnlDb3VudCA9IDApIHtcbiAgICBhd2FpdCB0aGlzLndhaXRVbnRpbE9ubGluZSgpO1xuXG4gICAgbGV0IG51bWJlck9mQXR0ZW1wdHMgPSAwO1xuICAgIHdoaWxlIChudW1iZXJPZkF0dGVtcHRzIDwgTUFYX1JFVFJZX0NPVU5UKSB7XG4gICAgICBudW1iZXJPZkF0dGVtcHRzKys7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgcmVmcmVzaFRva2VuSW50ZXJ2YWwpKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke3RoaXMuZG9tYWlufS90b2tlbnMvcmVmcmVzaGAsIHsgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHRoaXMuY29tbW9uSGVhZGVycygpIH0pO1xuICAgICAgICBpZiAocmVzLm9rKSB7XG4gICAgICAgICAgbnVtYmVyT2ZBdHRlbXB0cyA9IDA7XG4gICAgICAgICAgY29uc3QgeyB0b2tlbiB9ID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgICB0aGlzLnRva2VuID0gdG9rZW47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHJlcy5zdGF0dXMgPT09IDQwMyB8fCByZXMuc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhdGFsIGVycm9yIHdoaWxlIHJlZnJlc2hpbmcgdGhlIHRva2VuOiAke3Jlcy5zdGF0dXN9ICR7cmVzLnN0YXR1c1RleHR9YCk7XG4gICAgICAgICAgICB0aGlzLnN0cmVhbUNvbm5lY3Rpb24uZGlzY29ubmVjdCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFJlZnJlc2ggYXR0ZW1wdCAjJHtudW1iZXJPZkF0dGVtcHRzfSBmYWlsZWQ6ICR7cmVzLnN0YXR1c30gJHtyZXMuc3RhdHVzVGV4dH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBSZWZyZXNoIGF0dGVtcHQgIyR7bnVtYmVyT2ZBdHRlbXB0c30gdGhyZXcgYW4gZXhjZXB0aW9uOiAke2V9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc29sZS5lcnJvcignUmV0cmllcyBleGhhdXN0ZWQnKTtcbiAgICB0aGlzLnN0cmVhbUNvbm5lY3Rpb24uZGlzY29ubmVjdCgpO1xuICB9XG5cbiAgcG9zdEFjdGl2aXR5KGFjdGl2aXR5OiBBY3Rpdml0eSkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQudmFsdWUgPT09IENvbm5lY3Rpb25TdGF0dXMuRW5kZWQgfHxcbiAgICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQudmFsdWUgPT09IENvbm5lY3Rpb25TdGF0dXMuRmFpbGVkVG9Db25uZWN0XG4gICAgKSB7XG4gICAgICByZXR1cm4gT2JzZXJ2YWJsZS50aHJvdyhuZXcgRXJyb3IoJ0Nvbm5lY3Rpb24gaXMgY2xvc2VkJykpO1xuICAgIH1cblxuICAgIGlmIChhY3Rpdml0eS50eXBlID09PSAnbWVzc2FnZScgJiYgYWN0aXZpdHkuYXR0YWNobWVudHMgJiYgYWN0aXZpdHkuYXR0YWNobWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHRoaXMucG9zdE1lc3NhZ2VXaXRoQXR0YWNobWVudHMoYWN0aXZpdHkpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3AkID0gT2JzZXJ2YWJsZS5jcmVhdGUoYXN5bmMgc3Vic2NyaWJlciA9PiB7XG4gICAgICBjb25zdCByZXF1ZXN0ID0gQkZTRS5TdHJlYW1pbmdSZXF1ZXN0LmNyZWF0ZShcbiAgICAgICAgJ1BPU1QnLFxuICAgICAgICAnL3YzL2RpcmVjdGxpbmUvY29udmVyc2F0aW9ucy8nICsgdGhpcy5jb252ZXJzYXRpb25JZCArICcvYWN0aXZpdGllcydcbiAgICAgICk7XG4gICAgICByZXF1ZXN0LnNldEJvZHkoSlNPTi5zdHJpbmdpZnkoYWN0aXZpdHkpKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuc3RyZWFtQ29ubmVjdGlvbi5zZW5kKHJlcXVlc3QpO1xuICAgICAgICBpZiAocmVzcC5zdGF0dXNDb2RlICE9PSAyMDApIHRocm93IG5ldyBFcnJvcignUG9zdEFjdGl2aXR5IHJldHVybmVkICcgKyByZXNwLnN0YXR1c0NvZGUpO1xuICAgICAgICBjb25zdCBudW1iZXJPZlN0cmVhbXMgPSByZXNwLnN0cmVhbXMubGVuZ3RoO1xuICAgICAgICBpZiAobnVtYmVyT2ZTdHJlYW1zICE9PSAxKSB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIG9uZSBzdHJlYW0gYnV0IGdvdCAnICsgbnVtYmVyT2ZTdHJlYW1zKTtcbiAgICAgICAgY29uc3QgaWRTdHJpbmcgPSBhd2FpdCByZXNwLnN0cmVhbXNbMF0ucmVhZEFzU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IHsgSWQ6IGlkIH0gPSBKU09OLnBhcnNlKGlkU3RyaW5nKTtcbiAgICAgICAgc3Vic2NyaWJlci5uZXh0KGlkKTtcbiAgICAgICAgcmV0dXJuIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBuZXR3b3JrIGlzc3VlIHRoZW4gaXRzIGhhbmRsZWQgYnlcbiAgICAgICAgLy8gdGhlIGRpc2Nvbm5lY3Rpb25IYW5kbGVyLiBFdmVyeXRoaW5nIGVsc2UgY2FuXG4gICAgICAgIC8vIGJlIHJldHJpZWRcbiAgICAgICAgY29uc29sZS53YXJuKGUpO1xuICAgICAgICB0aGlzLnN0cmVhbUNvbm5lY3Rpb24uZGlzY29ubmVjdCgpO1xuICAgICAgICByZXR1cm4gc3Vic2NyaWJlci5lcnJvcihlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzcCQ7XG4gIH1cblxuICBwcml2YXRlIHBvc3RNZXNzYWdlV2l0aEF0dGFjaG1lbnRzKG1lc3NhZ2U6IE1lc3NhZ2UpIHtcbiAgICBjb25zdCB7IGF0dGFjaG1lbnRzLCAuLi5tZXNzYWdlV2l0aG91dEF0dGFjaG1lbnRzIH0gPSBtZXNzYWdlO1xuXG4gICAgcmV0dXJuIE9ic2VydmFibGUuY3JlYXRlKHN1YnNjcmliZXIgPT4ge1xuICAgICAgY29uc3QgaHR0cENvbnRlbnRMaXN0ID0gW107XG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGFycmF5QnVmZmVycyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgYXR0YWNobWVudHMubWFwKGFzeW5jIGF0dGFjaG1lbnQgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBtZWRpYSA9IGF0dGFjaG1lbnQgYXMgTWVkaWE7XG4gICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKG1lZGlhLmNvbnRlbnRVcmwpO1xuICAgICAgICAgICAgICBpZiAocmVzLm9rKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgYXJyYXlCdWZmZXI6IGF3YWl0IHJlcy5hcnJheUJ1ZmZlcigpLCBtZWRpYSB9O1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignLi4uJyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGFycmF5QnVmZmVycy5mb3JFYWNoKCh7IGFycmF5QnVmZmVyLCBtZWRpYSB9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuZnJvbShhcnJheUJ1ZmZlcik7XG4gICAgICAgICAgICBjb25zdCBzdHJlYW0gPSBuZXcgQkZTRS5TdWJzY3JpYmFibGVTdHJlYW0oKTtcbiAgICAgICAgICAgIHN0cmVhbS53cml0ZShidWZmZXIpO1xuICAgICAgICAgICAgY29uc3QgaHR0cENvbnRlbnQgPSBuZXcgQkZTRS5IdHRwQ29udGVudCh7IHR5cGU6IG1lZGlhLmNvbnRlbnRUeXBlLCBjb250ZW50TGVuZ3RoOiBidWZmZXIubGVuZ3RoIH0sIHN0cmVhbSk7XG4gICAgICAgICAgICBodHRwQ29udGVudExpc3QucHVzaChodHRwQ29udGVudCk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjb25zdCB1cmwgPSBgL3YzL2RpcmVjdGxpbmUvY29udmVyc2F0aW9ucy8ke3RoaXMuY29udmVyc2F0aW9uSWR9L3VzZXJzLyR7bWVzc2FnZVdpdGhvdXRBdHRhY2htZW50cy5mcm9tLmlkfS91cGxvYWRgO1xuICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSBCRlNFLlN0cmVhbWluZ1JlcXVlc3QuY3JlYXRlKCdQVVQnLCB1cmwpO1xuICAgICAgICAgIGNvbnN0IGFjdGl2aXR5U3RyZWFtID0gbmV3IEJGU0UuU3Vic2NyaWJhYmxlU3RyZWFtKCk7XG4gICAgICAgICAgYWN0aXZpdHlTdHJlYW0ud3JpdGUoSlNPTi5zdHJpbmdpZnkobWVzc2FnZVdpdGhvdXRBdHRhY2htZW50cyksICd1dGYtOCcpO1xuICAgICAgICAgIHJlcXVlc3QuYWRkU3RyZWFtKFxuICAgICAgICAgICAgbmV3IEJGU0UuSHR0cENvbnRlbnQoXG4gICAgICAgICAgICAgIHsgdHlwZTogJ2FwcGxpY2F0aW9uL3ZuZC5taWNyb3NvZnQuYWN0aXZpdHknLCBjb250ZW50TGVuZ3RoOiBhY3Rpdml0eVN0cmVhbS5sZW5ndGggfSxcbiAgICAgICAgICAgICAgYWN0aXZpdHlTdHJlYW1cbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICAgIGh0dHBDb250ZW50TGlzdC5mb3JFYWNoKGUgPT4gcmVxdWVzdC5hZGRTdHJlYW0oZSkpO1xuXG4gICAgICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuc3RyZWFtQ29ubmVjdGlvbi5zZW5kKHJlcXVlc3QpO1xuICAgICAgICAgIGlmIChyZXNwLnN0cmVhbXMgJiYgcmVzcC5zdHJlYW1zLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5lcnJvcihuZXcgRXJyb3IoYEludmFsaWQgc3RyZWFtIGNvdW50ICR7cmVzcC5zdHJlYW1zLmxlbmd0aH1gKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHsgSWQ6IGlkIH0gPSBhd2FpdCByZXNwLnN0cmVhbXNbMF0ucmVhZEFzSnNvbjx7IElkOiBzdHJpbmcgfT4oKTtcbiAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChpZCk7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgc3Vic2NyaWJlci5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgICAgfSkoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd2FpdFVudGlsT25saW5lKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLnN1YnNjcmliZShcbiAgICAgICAgY3MgPT4ge1xuICAgICAgICAgIGlmIChjcyA9PT0gQ29ubmVjdGlvblN0YXR1cy5PbmxpbmUpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlID0+IHJlamVjdChlKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29ubmVjdEFzeW5jKCkge1xuICAgIGNvbnN0IHJlID0gbmV3IFJlZ0V4cCgnXmh0dHAocz8pJyk7XG5cbiAgICBpZiAoIXJlLnRlc3QodGhpcy5kb21haW4pKSB7XG4gICAgICB0aHJvdyAnRG9tYWluIG11c3QgYmVnaW4gd2l0aCBodHRwIG9yIGh0dHBzJztcbiAgICB9XG5cbiAgICBjb25zdCBwYXJhbXMgPSB7IHRva2VuOiB0aGlzLnRva2VuIH07XG5cbiAgICBpZiAodGhpcy5jb252ZXJzYXRpb25JZCkge1xuICAgICAgcGFyYW1zWydjb252ZXJzYXRpb25JZCddID0gdGhpcy5jb252ZXJzYXRpb25JZDtcbiAgICB9XG5cbiAgICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgY29uc3QgdXJsU2VhcmNoUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhwYXJhbXMpLnRvU3RyaW5nKCk7XG4gICAgY29uc3Qgd3NVcmwgPSBgJHt0aGlzLmRvbWFpbi5yZXBsYWNlKHJlLCAnd3MkMScpfS9jb252ZXJzYXRpb25zL2Nvbm5lY3Q/JHt1cmxTZWFyY2hQYXJhbXN9YDtcblxuICAgIC8vIFRoaXMgcHJvbWlzZSB3aWxsIHJlc29sdmUgd2hlbiBpdCBpcyBkaXNjb25uZWN0ZWQuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuc3RyZWFtQ29ubmVjdGlvbiA9IG5ldyBXZWJTb2NrZXRDbGllbnRXaXRoTmV0d29ya0luZm9ybWF0aW9uKHtcbiAgICAgICAgICBkaXNjb25uZWN0aW9uSGFuZGxlcjogcmVzb2x2ZSxcbiAgICAgICAgICBuZXR3b3JrSW5mb3JtYXRpb246IHRoaXMuI25ldHdvcmtJbmZvcm1hdGlvbixcbiAgICAgICAgICByZXF1ZXN0SGFuZGxlcjoge1xuICAgICAgICAgICAgcHJvY2Vzc1JlcXVlc3Q6IHN0cmVhbWluZ1JlcXVlc3QgPT4ge1xuICAgICAgICAgICAgICAvLyBJZiBgc3RyZWFtQ29ubmVjdGlvbmAgaXMgc3RpbGwgY3VycmVudCwgYWxsb3cgY2FsbCB0byBgcHJvY2Vzc1JlcXVlc3QoKWAsIG90aGVyd2lzZSwgaWdub3JlIGNhbGxzIHRvIGBwcm9jZXNzUmVxdWVzdCgpYC5cbiAgICAgICAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyB6b21iaWUgY29ubmVjdGlvbnMgZnJvbSBzZW5kaW5nIHVzIHJlcXVlc3RzLlxuICAgICAgICAgICAgICBpZiAoYWJvcnRDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcHJvY2VzcyBzdHJlYW1pbmcgcmVxdWVzdCwgYHN0cmVhbWluZ0Nvbm5lY3Rpb25gIHNob3VsZCBiZSBkaXNjb25uZWN0ZWQuJyk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZXR1cm4gdGhpcy50aGVTdHJlYW1IYW5kbGVyLnByb2Nlc3NSZXF1ZXN0KHN0cmVhbWluZ1JlcXVlc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgdXJsOiB3c1VybFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnF1ZXVlQWN0aXZpdGllcyA9IHRydWU7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5zdHJlYW1Db25uZWN0aW9uLmNvbm5lY3QoKTtcblxuICAgICAgICBjb25zdCByZXF1ZXN0ID0gQkZTRS5TdHJlYW1pbmdSZXF1ZXN0LmNyZWF0ZSgnUE9TVCcsICcvdjMvZGlyZWN0bGluZS9jb252ZXJzYXRpb25zJyk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zdHJlYW1Db25uZWN0aW9uLnNlbmQocmVxdWVzdCk7XG5cbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgIT09IDIwMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ29ubmVjdGlvbiByZXNwb25zZSBjb2RlICcgKyByZXNwb25zZS5zdGF0dXNDb2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXNwb25zZS5zdHJlYW1zLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgMSBzdHJlYW0gYnV0IGdvdCAnICsgcmVzcG9uc2Uuc3RyZWFtcy5sZW5ndGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2VTdHJpbmcgPSBhd2FpdCByZXNwb25zZS5zdHJlYW1zWzBdLnJlYWRBc1N0cmluZygpO1xuICAgICAgICBjb25zdCBjb252ZXJzYXRpb24gPSBKU09OLnBhcnNlKHJlc3BvbnNlU3RyaW5nKTtcblxuICAgICAgICB0aGlzLmNvbnZlcnNhdGlvbklkID0gY29udmVyc2F0aW9uLmNvbnZlcnNhdGlvbklkO1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLm5leHQoQ29ubmVjdGlvblN0YXR1cy5PbmxpbmUpO1xuXG4gICAgICAgIC8vIFdhaXQgdW50aWwgREwgY29uc3VtZXJzIGhhdmUgaGFkIGEgY2hhbmNlIHRvIGJlIG5vdGlmaWVkXG4gICAgICAgIC8vIG9mIHRoZSBjb25uZWN0aW9uIHN0YXR1cyBjaGFuZ2UuXG4gICAgICAgIC8vIFRoaXMgaXMgc3BlY2lmaWMgdG8gUnhKUyBpbXBsZW1lbnRhdGlvbiBvZiBvYnNlcnZhYmxlLCB3aGljaCBjYWxsaW5nIHN1YnNjcmliZSgpIGFmdGVyIG5leHQoKSB3aWxsIHN0aWxsIGdldCB0aGUgdmFsdWUuXG4gICAgICAgIGF3YWl0IHRoaXMud2FpdFVudGlsT25saW5lKCk7XG5cbiAgICAgICAgdGhpcy50aGVTdHJlYW1IYW5kbGVyLmZsdXNoKCk7XG4gICAgICAgIHRoaXMucXVldWVBY3Rpdml0aWVzID0gZmFsc2U7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9KS5maW5hbGx5KCgpID0+IGFib3J0Q29udHJvbGxlci5hYm9ydCgpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29ubmVjdFdpdGhSZXRyeUFzeW5jKCkge1xuICAgIC8vIFRoaXMgZm9yLWxvb3Agd2lsbCBicmVhayB3aGVuIHNvbWVvbmUgY2FsbCBlbmQoKSBhbmQgaXQgd2lsbCBzaWduYWwgQ29ubmVjdGlvblN0YXR1cy5FbmRlZC5cbiAgICBmb3IgKDs7KSB7XG4gICAgICAvLyBDcmVhdGUgYSBuZXcgc2lnbmFsIGFuZCB3YWl0IGZvciBzb21lb25lIGtpY2tpbmcgb2ZmIHRoZSBjb25uZWN0aW9uOlxuICAgICAgLy8gLSBzdWJzY3JpYmUgdG8gYWN0aXZpdHkkLCBvcjtcbiAgICAgIC8vIC0gcmV0cmllcyBleGhhdXN0ZWQgKEZhaWxlZFRvQ29ubmVjdCksIHRoZW4sIHNvbWVvbmUgY2FsbCByZWNvbm5lY3QoKVxuICAgICAgYXdhaXQgKHRoaXMuY29ubmVjdERlZmVycmVkID0gY3JlYXRlRGVmZXJyZWQoKSkucHJvbWlzZTtcblxuICAgICAgbGV0IG51bVJldHJpZXMgPSBNQVhfUkVUUllfQ09VTlQ7XG5cbiAgICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQubmV4dChDb25uZWN0aW9uU3RhdHVzLkNvbm5lY3RpbmcpO1xuXG4gICAgICB3aGlsZSAobnVtUmV0cmllcyA+IDApIHtcbiAgICAgICAgbnVtUmV0cmllcy0tO1xuXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFRoaXMgcHJvbWlzZSB3aWxsIHJlamVjdC9yZXNvbHZlIHdoZW4gZGlzY29ubmVjdGVkLlxuICAgICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdEFzeW5jKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHNvbWVvbmUgY2FsbCBlbmQoKSB0byBicmVhayB0aGUgY29ubmVjdGlvbiwgd2Ugd2lsbCBuZXZlciBsaXN0ZW4gdG8gYW55IHJlY29ubmVjdCgpLlxuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uU3RhdHVzJC5nZXRWYWx1ZSgpID09PSBDb25uZWN0aW9uU3RhdHVzLkVuZGVkKSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyB0aGUgb25seSBwbGFjZSB0aGUgbG9vcCBpbiB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgYnJva2UuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGRvbid0IHNpZ25hbCBDb25uZWN0aW9uU3RhdHVzLkNvbm5lY3RpbmcgdHdpY2Ugb3IgbW9yZSB3aXRob3V0IGFuIGFjdHVhbCBjb25uZWN0aW9uLlxuICAgICAgICAvLyBTdWJzZXF1ZW50IHJldHJpZXMgc2hvdWxkIGJlIHRyYW5zcGFyZW50LlxuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uU3RhdHVzJC5nZXRWYWx1ZSgpICE9PSBDb25uZWN0aW9uU3RhdHVzLkNvbm5lY3RpbmcpIHtcbiAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLm5leHQoQ29ubmVjdGlvblN0YXR1cy5Db25uZWN0aW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24gbGFzdGVkIGZvciBtb3JlIHRoYW4gYSBtaW51dGUsIHRoZSBwcmV2aW91cyBjb25uZWN0aW9uIGlzIGdvb2QsIHdoaWNoIG1lYW5zOlxuICAgICAgICAvLyAtIHdlIHNob3VsZCByZXNldCB0aGUgcmV0cnkgY291bnRlciwgYW5kO1xuICAgICAgICAvLyAtIHdlIHNob3VsZCByZWNvbm5lY3QgaW1tZWRpYXRlbHkuXG4gICAgICAgIGlmICg2MDAwMCA8IERhdGUubm93KCkgLSBzdGFydCkge1xuICAgICAgICAgIG51bVJldHJpZXMgPSBNQVhfUkVUUllfQ09VTlQ7XG4gICAgICAgIH0gZWxzZSBpZiAobnVtUmV0cmllcyA+IDApIHtcbiAgICAgICAgICAvLyBTbGVlcCBvbmx5IGlmIHdlIGFyZSBkb2luZyByZXRyeS4gT3RoZXJ3aXNlLCB3ZSBhcmUgZ29pbmcgdG8gYnJlYWsgdGhlIGxvb3AgYW5kIHNpZ25hbCBGYWlsZWRUb0Nvbm5lY3QuXG4gICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UociA9PiBzZXRUaW1lb3V0KHIsIHRoaXMuZ2V0UmV0cnlEZWxheSgpKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVE9ETzogW1RFU1RdIE1ha2Ugc3VyZSBGYWlsZWRUb0Nvbm5lY3QgaXMgcmVwb3J0ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgbGFzdCBkaXNjb25uZWN0aW9uLCBzaG91bGQgYmUgbm8gZ2V0UmV0cnlEZWxheSgpLlxuICAgICAgLy8gRmFpbGVkIHRvIHJlY29ubmVjdCBhZnRlciBtdWx0aXBsZSByZXRyaWVzLlxuICAgICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJC5uZXh0KENvbm5lY3Rpb25TdGF0dXMuRmFpbGVkVG9Db25uZWN0KTtcbiAgICB9XG5cbiAgICAvLyBOb3RlOiBObyBjb2RlIHdpbGwgaGl0IHRoaXMgbGluZS5cbiAgfVxuXG4gIC8vIFJldHVybnMgdGhlIGRlbGF5IGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kc1xuICBwcml2YXRlIGdldFJldHJ5RGVsYXkoKSB7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IoMzAwMCArIE1hdGgucmFuZG9tKCkgKiAxMjAwMCk7XG4gIH1cbn1cbiJdfQ==
|
|
735
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfQmVoYXZpb3JTdWJqZWN0IiwicmVxdWlyZSIsIl9idWZmZXIiLCJfT2JzZXJ2YWJsZSIsIkJGU0UiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl9jcmVhdGVEZWZlcnJlZCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfY3Jvc3NGZXRjaCIsIl9kaXJlY3RMaW5lIiwiX1dlYlNvY2tldENsaWVudFdpdGhOZXR3b3JrSW5mb3JtYXRpb24iLCJfZXhjbHVkZWQiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJub2RlSW50ZXJvcCIsIldlYWtNYXAiLCJjYWNoZUJhYmVsSW50ZXJvcCIsImNhY2hlTm9kZUludGVyb3AiLCJvYmoiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImNhY2hlIiwiaGFzIiwiZ2V0IiwibmV3T2JqIiwiaGFzUHJvcGVydHlEZXNjcmlwdG9yIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJrZXkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJkZXNjIiwic2V0IiwiRElSRUNUX0xJTkVfVkVSU0lPTiIsIk1BWF9SRVRSWV9DT1VOVCIsInJlZnJlc2hUb2tlbkxpZmV0aW1lIiwicmVmcmVzaFRva2VuSW50ZXJ2YWwiLCJTdHJlYW1IYW5kbGVyIiwicyIsImMkIiwic3EiLCJfY2xhc3NDYWxsQ2hlY2syIiwiX2RlZmluZVByb3BlcnR5MiIsInN1YnNjcmliZXIiLCJjb25uZWN0aW9uU3RhdHVzJCIsInNob3VsZFF1ZXVlIiwiX2NyZWF0ZUNsYXNzMiIsInZhbHVlIiwic2V0U3Vic2NyaWJlciIsIl9wcm9jZXNzUmVxdWVzdCIsIl9hc3luY1RvR2VuZXJhdG9yMiIsIl9yZWdlbmVyYXRvciIsIm1hcmsiLCJfY2FsbGVlIiwicmVxdWVzdCIsImxvZ2dlciIsInN0cmVhbXMiLCJzdHJlYW0wIiwiYWN0aXZpdHlTZXRKc29uIiwiYWN0aXZpdHlTZXQiLCJhY3Rpdml0eSIsImF0dGFjaG1lbnRzIiwic3RyZWFtIiwiYXR0YWNobWVudCIsImRhdGFVcmkiLCJ3cmFwIiwiX2NhbGxlZSQiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwiX3RvQ29uc3VtYWJsZUFycmF5MiIsInNoaWZ0IiwicmVhZEFzU3RyaW5nIiwic2VudCIsIkpTT04iLCJwYXJzZSIsImFjdGl2aXRpZXMiLCJsZW5ndGgiLCJlcnJvciIsIkVycm9yIiwiYWJydXB0IiwiU3RyZWFtaW5nUmVzcG9uc2UiLCJjcmVhdGUiLCJwdXNoIiwiY29udGVudFR5cGUiLCJjb250ZW50VXJsIiwiYWN0aXZpdHlRdWV1ZSIsInN0b3AiLCJwcm9jZXNzUmVxdWVzdCIsIl94IiwiX3gyIiwiYXBwbHkiLCJhcmd1bWVudHMiLCJmbHVzaCIsIl90aGlzIiwic3Vic2NyaWJlIiwiZm9yRWFjaCIsImEiLCJlbmQiLCJjb21wbGV0ZSIsIl9uZXR3b3JrSW5mb3JtYXRpb24iLCJEaXJlY3RMaW5lU3RyZWFtaW5nIiwib3B0aW9ucyIsIl90aGlzMiIsIkJlaGF2aW9yU3ViamVjdCIsIkNvbm5lY3Rpb25TdGF0dXMiLCJVbmluaXRpYWxpemVkIiwid3JpdGFibGUiLCJuZXR3b3JrSW5mb3JtYXRpb24iLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInR5cGUiLCJfY2xhc3NQcml2YXRlRmllbGRTZXQyIiwiY29uc29sZSIsIndhcm4iLCJ0b2tlbiIsInJlZnJlc2hUb2tlbiIsIkV4cGlyZWRUb2tlbiIsImRvbWFpbiIsImNvbnZlcnNhdGlvbklkIiwiX2JvdEFnZW50IiwiZ2V0Qm90QWdlbnQiLCJib3RBZ2VudCIsInF1ZXVlQWN0aXZpdGllcyIsImFjdGl2aXR5JCIsIk9ic2VydmFibGUiLCJfcmVmIiwiX2NhbGxlZTIiLCJfY2FsbGVlMiQiLCJfY29udGV4dDIiLCJhY3Rpdml0eVN1YnNjcmliZXIiLCJ0aGVTdHJlYW1IYW5kbGVyIiwiY29ubmVjdERlZmVycmVkIiwicmVzb2x2ZSIsIl94MyIsInNoYXJlIiwiY29ubmVjdFdpdGhSZXRyeUFzeW5jIiwicmVjb25uZWN0IiwiX3JlZjIiLCJnZXRWYWx1ZSIsIkVuZGVkIiwic3RyZWFtQ29ubmVjdGlvbiIsImRpc2Nvbm5lY3QiLCJjb21tb25IZWFkZXJzIiwiQXV0aG9yaXphdGlvbiIsImNvbmNhdCIsImN1c3RvbUFnZW50IiwidW5kZWZpbmVkIiwiY2xpZW50QWdlbnQiLCJfcmVmcmVzaFRva2VuIiwiX2NhbGxlZTMiLCJmaXJzdENhbGwiLCJyZXRyeUNvdW50IiwibnVtYmVyT2ZBdHRlbXB0cyIsInJlcyIsIl95aWVsZCRyZXMkanNvbiIsIl9hcmdzMyIsIl9jYWxsZWUzJCIsIl9jb250ZXh0MyIsIndhaXRVbnRpbE9ubGluZSIsIlByb21pc2UiLCJyIiwic2V0VGltZW91dCIsImZldGNoIiwibWV0aG9kIiwiaGVhZGVycyIsIm9rIiwianNvbiIsInN0YXR1cyIsInN0YXR1c1RleHQiLCJ0MCIsInBvc3RBY3Rpdml0eSIsIl90aGlzMyIsIkZhaWxlZFRvQ29ubmVjdCIsInBvc3RNZXNzYWdlV2l0aEF0dGFjaG1lbnRzIiwicmVzcCQiLCJfcmVmMyIsIl9jYWxsZWU0IiwicmVzcCIsIm51bWJlck9mU3RyZWFtcyIsImlkU3RyaW5nIiwiX0pTT04kcGFyc2UiLCJpZCIsIl9jYWxsZWU0JCIsIl9jb250ZXh0NCIsIlN0cmVhbWluZ1JlcXVlc3QiLCJzZXRCb2R5Iiwic3RyaW5naWZ5Iiwic2VuZCIsInN0YXR1c0NvZGUiLCJJZCIsIl94NCIsIm1lc3NhZ2UiLCJfdGhpczQiLCJtZXNzYWdlV2l0aG91dEF0dGFjaG1lbnRzIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiIsImh0dHBDb250ZW50TGlzdCIsIl9jYWxsZWU2IiwiYXJyYXlCdWZmZXJzIiwidXJsIiwiYWN0aXZpdHlTdHJlYW0iLCJfeWllbGQkcmVzcCRzdHJlYW1zJCIsIl9jYWxsZWU2JCIsIl9jb250ZXh0NiIsImFsbCIsIm1hcCIsIl9yZWY1IiwiX2NhbGxlZTUiLCJtZWRpYSIsIl9jYWxsZWU1JCIsIl9jb250ZXh0NSIsImFycmF5QnVmZmVyIiwidDEiLCJfeDUiLCJfcmVmNiIsImJ1ZmZlciIsIkJ1ZmZlciIsImZyb20iLCJTdWJzY3JpYmFibGVTdHJlYW0iLCJ3cml0ZSIsImh0dHBDb250ZW50IiwiSHR0cENvbnRlbnQiLCJjb250ZW50TGVuZ3RoIiwiYWRkU3RyZWFtIiwiZSIsInJlYWRBc0pzb24iLCJfd2FpdFVudGlsT25saW5lIiwiX2NhbGxlZTciLCJfdGhpczUiLCJfY2FsbGVlNyQiLCJfY29udGV4dDciLCJyZWplY3QiLCJjcyIsIk9ubGluZSIsIl9jb25uZWN0QXN5bmMiLCJfY2FsbGVlOSIsIl90aGlzNiIsInJlIiwicGFyYW1zIiwiYWJvcnRDb250cm9sbGVyIiwidXJsU2VhcmNoUGFyYW1zIiwid3NVcmwiLCJfY2FsbGVlOSQiLCJfY29udGV4dDkiLCJSZWdFeHAiLCJ0ZXN0IiwiQWJvcnRDb250cm9sbGVyIiwiVVJMU2VhcmNoUGFyYW1zIiwidG9TdHJpbmciLCJyZXBsYWNlIiwiX3JlZjciLCJfY2FsbGVlOCIsInJlc3BvbnNlIiwicmVzcG9uc2VTdHJpbmciLCJjb252ZXJzYXRpb24iLCJfY2FsbGVlOCQiLCJfY29udGV4dDgiLCJXZWJTb2NrZXRDbGllbnRXaXRoTmV0d29ya0luZm9ybWF0aW9uIiwiZGlzY29ubmVjdGlvbkhhbmRsZXIiLCJfY2xhc3NQcml2YXRlRmllbGRHZXQyIiwicmVxdWVzdEhhbmRsZXIiLCJzdHJlYW1pbmdSZXF1ZXN0Iiwic2lnbmFsIiwiYWJvcnRlZCIsImNvbm5lY3QiLCJfeDYiLCJfeDciLCJhYm9ydCIsImNvbm5lY3RBc3luYyIsIl9jb25uZWN0V2l0aFJldHJ5QXN5bmMiLCJfY2FsbGVlMTAiLCJfdGhpczciLCJudW1SZXRyaWVzIiwic3RhcnQiLCJfY2FsbGVlMTAkIiwiX2NvbnRleHQxMCIsImNyZWF0ZURlZmVycmVkIiwicHJvbWlzZSIsIkNvbm5lY3RpbmciLCJEYXRlIiwibm93IiwiZ2V0UmV0cnlEZWxheSIsIk1hdGgiLCJmbG9vciIsInJhbmRvbSIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi9zcmMvZGlyZWN0TGluZVN0cmVhbWluZy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbiBvcmRlciB0byBrZWVwIGZpbGUgc2l6ZSBkb3duLCBvbmx5IGltcG9ydCB0aGUgcGFydHMgb2YgcnhqcyB0aGF0IHdlIHVzZVxuXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzL0JlaGF2aW9yU3ViamVjdCc7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdidWZmZXInO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMvT2JzZXJ2YWJsZSc7XG5pbXBvcnQgeyBTdWJzY3JpYmVyIH0gZnJvbSAncnhqcy9TdWJzY3JpYmVyJztcbmltcG9ydCAqIGFzIEJGU0UgZnJvbSAnYm90ZnJhbWV3b3JrLXN0cmVhbWluZyc7XG5pbXBvcnQgY3JlYXRlRGVmZXJyZWQgZnJvbSAnLi9jcmVhdGVEZWZlcnJlZCc7XG5pbXBvcnQgZmV0Y2ggZnJvbSAnY3Jvc3MtZmV0Y2gnO1xuXG5pbXBvcnQgeyBBY3Rpdml0eSwgQ29ubmVjdGlvblN0YXR1cywgQ29udmVyc2F0aW9uLCBEaXJlY3RMaW5lLCBJQm90Q29ubmVjdGlvbiwgTWVkaWEsIE1lc3NhZ2UgfSBmcm9tICcuL2RpcmVjdExpbmUnO1xuaW1wb3J0IFdlYlNvY2tldENsaWVudFdpdGhOZXR3b3JrSW5mb3JtYXRpb24gZnJvbSAnLi9zdHJlYW1pbmcvV2ViU29ja2V0Q2xpZW50V2l0aE5ldHdvcmtJbmZvcm1hdGlvbic7XG5pbXBvcnQgdHlwZSB7IERlZmVycmVkIH0gZnJvbSAnLi9jcmVhdGVEZWZlcnJlZCc7XG5cbmNvbnN0IERJUkVDVF9MSU5FX1ZFUlNJT04gPSAnRGlyZWN0TGluZS8zLjAnO1xuY29uc3QgTUFYX1JFVFJZX0NPVU5UID0gMztcbmNvbnN0IHJlZnJlc2hUb2tlbkxpZmV0aW1lID0gMzAgKiA2MCAqIDEwMDA7XG4vL2NvbnN0IHJlZnJlc2hUb2tlbkxpZmV0aW1lID0gNTAwMDtcbi8vIGNvbnN0IHRpbWVvdXQgPSAyMCAqIDEwMDA7XG5jb25zdCByZWZyZXNoVG9rZW5JbnRlcnZhbCA9IHJlZnJlc2hUb2tlbkxpZmV0aW1lIC8gMjtcblxuaW50ZXJmYWNlIERpcmVjdExpbmVTdHJlYW1pbmdPcHRpb25zIHtcbiAgdG9rZW46IHN0cmluZztcbiAgY29udmVyc2F0aW9uSWQ/OiBzdHJpbmc7XG4gIGRvbWFpbjogc3RyaW5nO1xuICAvLyBBdHRhY2hlZCB0byBhbGwgcmVxdWVzdHMgdG8gaWRlbnRpZnkgcmVxdWVzdGluZyBhZ2VudC5cbiAgYm90QWdlbnQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIFtgTmV0d29ya0luZm9ybWF0aW9uYCBBUEldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9OZXR3b3JrX0luZm9ybWF0aW9uX0FQSSkuXG4gICAqIFdoZW4gdGhlIGBOZXR3b3JrSW5mb3JtYXRpb25gIGRldGVjdCBuZXR3b3JrIGNoYW5nZXMgb3Igb2ZmbGluZSwgaXQgd2lsbCBkaXNjb25uZWN0IHRoZSBXZWIgU29ja2V0IGFuZCByZWNvbm5lY3QgaXQuXG4gICAqL1xuICBuZXR3b3JrSW5mb3JtYXRpb24/OiBOZXR3b3JrSW5mb3JtYXRpb247XG59XG5cbmNsYXNzIFN0cmVhbUhhbmRsZXIgaW1wbGVtZW50cyBCRlNFLlJlcXVlc3RIYW5kbGVyIHtcbiAgcHJpdmF0ZSBjb25uZWN0aW9uU3RhdHVzJDtcbiAgcHJpdmF0ZSBzdWJzY3JpYmVyOiBTdWJzY3JpYmVyPEFjdGl2aXR5PjtcbiAgcHJpdmF0ZSBzaG91bGRRdWV1ZTogKCkgPT4gYm9vbGVhbjtcbiAgcHJpdmF0ZSBhY3Rpdml0eVF1ZXVlOiBBcnJheTxBY3Rpdml0eT4gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihzOiBTdWJzY3JpYmVyPEFjdGl2aXR5PiwgYyQ6IE9ic2VydmFibGU8Q29ubmVjdGlvblN0YXR1cz4sIHNxOiAoKSA9PiBib29sZWFuKSB7XG4gICAgdGhpcy5zdWJzY3JpYmVyID0gcztcbiAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkID0gYyQ7XG4gICAgdGhpcy5zaG91bGRRdWV1ZSA9IHNxO1xuICB9XG5cbiAgcHVibGljIHNldFN1YnNjcmliZXIoczogU3Vic2NyaWJlcjxBY3Rpdml0eT4pIHtcbiAgICB0aGlzLnN1YnNjcmliZXIgPSBzO1xuICB9XG5cbiAgYXN5bmMgcHJvY2Vzc1JlcXVlc3QocmVxdWVzdDogQkZTRS5JUmVjZWl2ZVJlcXVlc3QsIGxvZ2dlcj86IGFueSk6IFByb21pc2U8QkZTRS5TdHJlYW1pbmdSZXNwb25zZT4ge1xuICAgIGNvbnN0IHN0cmVhbXMgPSBbLi4ucmVxdWVzdC5zdHJlYW1zXTtcbiAgICBjb25zdCBzdHJlYW0wID0gc3RyZWFtcy5zaGlmdCgpO1xuICAgIGNvbnN0IGFjdGl2aXR5U2V0SnNvbiA9IGF3YWl0IHN0cmVhbTAucmVhZEFzU3RyaW5nKCk7XG4gICAgY29uc3QgYWN0aXZpdHlTZXQgPSBKU09OLnBhcnNlKGFjdGl2aXR5U2V0SnNvbik7XG5cbiAgICBpZiAoYWN0aXZpdHlTZXQuYWN0aXZpdGllcy5sZW5ndGggIT09IDEpIHtcbiAgICAgIC8vIE9ubHkgb25lIGFjdGl2aXR5IGlzIGV4cGVjdGVkIGluIGEgc2V0IGluIHN0cmVhbWluZ1xuICAgICAgdGhpcy5zdWJzY3JpYmVyLmVycm9yKG5ldyBFcnJvcigndGhlcmUgc2hvdWxkIGJlIGV4YWN0bHkgb25lIGFjdGl2aXR5JykpO1xuICAgICAgcmV0dXJuIEJGU0UuU3RyZWFtaW5nUmVzcG9uc2UuY3JlYXRlKDUwMCk7XG4gICAgfVxuXG4gICAgY29uc3QgYWN0aXZpdHkgPSBhY3Rpdml0eVNldC5hY3Rpdml0aWVzWzBdO1xuXG4gICAgaWYgKHN0cmVhbXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgYXR0YWNobWVudHMgPSBbLi4uYWN0aXZpdHkuYXR0YWNobWVudHNdO1xuXG4gICAgICBsZXQgc3RyZWFtOiBCRlNFLkNvbnRlbnRTdHJlYW07XG4gICAgICB3aGlsZSAoKHN0cmVhbSA9IHN0cmVhbXMuc2hpZnQoKSkpIHtcbiAgICAgICAgY29uc3QgYXR0YWNobWVudCA9IGF3YWl0IHN0cmVhbS5yZWFkQXNTdHJpbmcoKTtcbiAgICAgICAgY29uc3QgZGF0YVVyaSA9ICdkYXRhOnRleHQvcGxhaW47YmFzZTY0LCcgKyBhdHRhY2htZW50O1xuICAgICAgICBhdHRhY2htZW50cy5wdXNoKHsgY29udGVudFR5cGU6IHN0cmVhbS5jb250ZW50VHlwZSwgY29udGVudFVybDogZGF0YVVyaSB9KTtcbiAgICAgIH1cblxuICAgICAgYWN0aXZpdHkuYXR0YWNobWVudHMgPSBhdHRhY2htZW50cztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zaG91bGRRdWV1ZSgpKSB7XG4gICAgICB0aGlzLmFjdGl2aXR5UXVldWUucHVzaChhY3Rpdml0eSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3Vic2NyaWJlci5uZXh0KGFjdGl2aXR5KTtcbiAgICB9XG5cbiAgICByZXR1cm4gQkZTRS5TdHJlYW1pbmdSZXNwb25zZS5jcmVhdGUoMjAwKTtcbiAgfVxuXG4gIHB1YmxpYyBmbHVzaCgpIHtcbiAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLnN1YnNjcmliZSgoKSA9PiB7fSk7XG4gICAgdGhpcy5hY3Rpdml0eVF1ZXVlLmZvckVhY2goYSA9PiB0aGlzLnN1YnNjcmliZXIubmV4dChhKSk7XG4gICAgdGhpcy5hY3Rpdml0eVF1ZXVlID0gW107XG4gIH1cblxuICBwdWJsaWMgZW5kKCkge1xuICAgIHRoaXMuc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEaXJlY3RMaW5lU3RyZWFtaW5nIGltcGxlbWVudHMgSUJvdENvbm5lY3Rpb24ge1xuICBwdWJsaWMgY29ubmVjdGlvblN0YXR1cyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KENvbm5lY3Rpb25TdGF0dXMuVW5pbml0aWFsaXplZCk7XG4gIHB1YmxpYyBhY3Rpdml0eSQ6IE9ic2VydmFibGU8QWN0aXZpdHk+O1xuXG4gIHByaXZhdGUgYWN0aXZpdHlTdWJzY3JpYmVyOiBTdWJzY3JpYmVyPEFjdGl2aXR5PjtcbiAgcHJpdmF0ZSBjb25uZWN0RGVmZXJyZWQ6IERlZmVycmVkPHZvaWQ+O1xuICBwcml2YXRlIHRoZVN0cmVhbUhhbmRsZXI6IFN0cmVhbUhhbmRsZXI7XG5cbiAgcHJpdmF0ZSBkb21haW46IHN0cmluZztcblxuICBwcml2YXRlIGNvbnZlcnNhdGlvbklkOiBzdHJpbmc7XG4gIHByaXZhdGUgdG9rZW46IHN0cmluZztcbiAgcHJpdmF0ZSBzdHJlYW1Db25uZWN0aW9uOiBCRlNFLldlYlNvY2tldENsaWVudDtcbiAgcHJpdmF0ZSBxdWV1ZUFjdGl2aXRpZXM6IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBfYm90QWdlbnQgPSAnJztcblxuICAjbmV0d29ya0luZm9ybWF0aW9uOiBOZXR3b3JrSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogRGlyZWN0TGluZVN0cmVhbWluZ09wdGlvbnMpIHtcbiAgICAvLyBSZWN0aWZpZXMgYG9wdGlvbnMubmV0d29ya0luZm9ybWF0aW9uYC5cbiAgICBjb25zdCBuZXR3b3JrSW5mb3JtYXRpb24gPSBvcHRpb25zPy5uZXR3b3JrSW5mb3JtYXRpb247XG5cbiAgICBpZiAoXG4gICAgICB0eXBlb2YgbmV0d29ya0luZm9ybWF0aW9uID09PSAndW5kZWZpbmVkJyB8fFxuICAgICAgKHR5cGVvZiBuZXR3b3JrSW5mb3JtYXRpb24uYWRkRXZlbnRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgICB0eXBlb2YgbmV0d29ya0luZm9ybWF0aW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgICAgdHlwZW9mIG5ldHdvcmtJbmZvcm1hdGlvbi50eXBlID09PSAnc3RyaW5nJylcbiAgICApIHtcbiAgICAgIHRoaXMuI25ldHdvcmtJbmZvcm1hdGlvbiA9IG5ldHdvcmtJbmZvcm1hdGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAnYm90ZnJhbWV3b3JrLWRpcmVjdGxpbmVqczogXCJuZXR3b3JrSW5mb3JtYXRpb25cIiBvcHRpb24gc3BlY2lmaWVkIG11c3QgYmUgYSBgTmV0d29ya0luZm9ybWF0aW9uYC1saWtlIGluc3RhbmNlIGV4dGVuZGluZyBgRXZlbnRUYXJnZXRgIGludGVyZmFjZSB3aXRoIGEgYHR5cGVgIHByb3BlcnR5IHJldHVybmluZyBhIHN0cmluZy4nXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMudG9rZW4gPSBvcHRpb25zLnRva2VuO1xuXG4gICAgdGhpcy5yZWZyZXNoVG9rZW4oKS5jYXRjaCgoKSA9PiB7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLm5leHQoQ29ubmVjdGlvblN0YXR1cy5FeHBpcmVkVG9rZW4pO1xuICAgIH0pO1xuXG4gICAgdGhpcy5kb21haW4gPSBvcHRpb25zLmRvbWFpbjtcblxuICAgIGlmIChvcHRpb25zLmNvbnZlcnNhdGlvbklkKSB7XG4gICAgICB0aGlzLmNvbnZlcnNhdGlvbklkID0gb3B0aW9ucy5jb252ZXJzYXRpb25JZDtcbiAgICB9XG5cbiAgICB0aGlzLl9ib3RBZ2VudCA9IHRoaXMuZ2V0Qm90QWdlbnQob3B0aW9ucy5ib3RBZ2VudCk7XG5cbiAgICB0aGlzLnF1ZXVlQWN0aXZpdGllcyA9IHRydWU7XG4gICAgdGhpcy5hY3Rpdml0eSQgPSBPYnNlcnZhYmxlLmNyZWF0ZShhc3luYyAoc3Vic2NyaWJlcjogU3Vic2NyaWJlcjxBY3Rpdml0eT4pID0+IHtcbiAgICAgIHRoaXMuYWN0aXZpdHlTdWJzY3JpYmVyID0gc3Vic2NyaWJlcjtcbiAgICAgIHRoaXMudGhlU3RyZWFtSGFuZGxlciA9IG5ldyBTdHJlYW1IYW5kbGVyKHN1YnNjcmliZXIsIHRoaXMuY29ubmVjdGlvblN0YXR1cyQsICgpID0+IHRoaXMucXVldWVBY3Rpdml0aWVzKTtcblxuICAgICAgLy8gUmVzb2x2aW5nIGNvbm5lY3REZWZlcnJlZCB3aWxsIGtpY2stb2ZmIHRoZSBjb25uZWN0aW9uLlxuICAgICAgdGhpcy5jb25uZWN0RGVmZXJyZWQucmVzb2x2ZSgpO1xuICAgIH0pLnNoYXJlKCk7XG5cbiAgICAvLyBjb25uZWN0V2l0aFJldHJ5QXN5bmMoKSB3aWxsIGNyZWF0ZSB0aGUgY29ubmVjdERlZmVycmVkIG9iamVjdCByZXF1aXJlZCBpbiBhY3Rpdml0eSQuXG4gICAgdGhpcy5jb25uZWN0V2l0aFJldHJ5QXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyByZWNvbm5lY3QoeyBjb252ZXJzYXRpb25JZCwgdG9rZW4gfTogQ29udmVyc2F0aW9uKSB7XG4gICAgaWYgKHRoaXMuY29ubmVjdGlvblN0YXR1cyQuZ2V0VmFsdWUoKSA9PT0gQ29ubmVjdGlvblN0YXR1cy5FbmRlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb25uZWN0aW9uIGhhcyBlbmRlZC4nKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbnZlcnNhdGlvbklkID0gY29udmVyc2F0aW9uSWQ7XG4gICAgdGhpcy50b2tlbiA9IHRva2VuO1xuXG4gICAgdGhpcy5jb25uZWN0RGVmZXJyZWQucmVzb2x2ZSgpO1xuICB9XG5cbiAgZW5kKCkge1xuICAgIC8vIE9uY2UgZW5kKCkgaXMgY2FsbGVkLCBubyByZWNvbm5lY3Rpb24gY2FuIGJlIG1hZGUuXG4gICAgdGhpcy5hY3Rpdml0eVN1YnNjcmliZXIuY29tcGxldGUoKTtcblxuICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQubmV4dChDb25uZWN0aW9uU3RhdHVzLkVuZGVkKTtcbiAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLmNvbXBsZXRlKCk7XG5cbiAgICB0aGlzLnN0cmVhbUNvbm5lY3Rpb24uZGlzY29ubmVjdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21tb25IZWFkZXJzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dGhpcy50b2tlbn1gLFxuICAgICAgJ3gtbXMtYm90LWFnZW50JzogdGhpcy5fYm90QWdlbnRcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRCb3RBZ2VudChjdXN0b21BZ2VudDogc3RyaW5nID0gJycpOiBzdHJpbmcge1xuICAgIGxldCBjbGllbnRBZ2VudCA9ICdkaXJlY3RsaW5lU3RyZWFtaW5nJztcblxuICAgIGlmIChjdXN0b21BZ2VudCkge1xuICAgICAgY2xpZW50QWdlbnQgKz0gYDsgJHtjdXN0b21BZ2VudH1gO1xuICAgIH1cblxuICAgIHJldHVybiBgJHtESVJFQ1RfTElORV9WRVJTSU9OfSAoJHtjbGllbnRBZ2VudH0pYDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVmcmVzaFRva2VuKGZpcnN0Q2FsbCA9IHRydWUsIHJldHJ5Q291bnQgPSAwKSB7XG4gICAgYXdhaXQgdGhpcy53YWl0VW50aWxPbmxpbmUoKTtcblxuICAgIGxldCBudW1iZXJPZkF0dGVtcHRzID0gMDtcbiAgICB3aGlsZSAobnVtYmVyT2ZBdHRlbXB0cyA8IE1BWF9SRVRSWV9DT1VOVCkge1xuICAgICAgbnVtYmVyT2ZBdHRlbXB0cysrO1xuICAgICAgYXdhaXQgbmV3IFByb21pc2UociA9PiBzZXRUaW1lb3V0KHIsIHJlZnJlc2hUb2tlbkludGVydmFsKSk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgJHt0aGlzLmRvbWFpbn0vdG9rZW5zL3JlZnJlc2hgLCB7IG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB0aGlzLmNvbW1vbkhlYWRlcnMoKSB9KTtcbiAgICAgICAgaWYgKHJlcy5vaykge1xuICAgICAgICAgIG51bWJlck9mQXR0ZW1wdHMgPSAwO1xuICAgICAgICAgIGNvbnN0IHsgdG9rZW4gfSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgICAgdGhpcy50b2tlbiA9IHRva2VuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChyZXMuc3RhdHVzID09PSA0MDMgfHwgcmVzLnN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYXRhbCBlcnJvciB3aGlsZSByZWZyZXNoaW5nIHRoZSB0b2tlbjogJHtyZXMuc3RhdHVzfSAke3Jlcy5zdGF0dXNUZXh0fWApO1xuICAgICAgICAgICAgdGhpcy5zdHJlYW1Db25uZWN0aW9uLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBSZWZyZXNoIGF0dGVtcHQgIyR7bnVtYmVyT2ZBdHRlbXB0c30gZmFpbGVkOiAke3Jlcy5zdGF0dXN9ICR7cmVzLnN0YXR1c1RleHR9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgUmVmcmVzaCBhdHRlbXB0ICMke251bWJlck9mQXR0ZW1wdHN9IHRocmV3IGFuIGV4Y2VwdGlvbjogJHtlfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnNvbGUuZXJyb3IoJ1JldHJpZXMgZXhoYXVzdGVkJyk7XG4gICAgdGhpcy5zdHJlYW1Db25uZWN0aW9uLmRpc2Nvbm5lY3QoKTtcbiAgfVxuXG4gIHBvc3RBY3Rpdml0eShhY3Rpdml0eTogQWN0aXZpdHkpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLnZhbHVlID09PSBDb25uZWN0aW9uU3RhdHVzLkVuZGVkIHx8XG4gICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLnZhbHVlID09PSBDb25uZWN0aW9uU3RhdHVzLkZhaWxlZFRvQ29ubmVjdFxuICAgICkge1xuICAgICAgcmV0dXJuIE9ic2VydmFibGUudGhyb3cobmV3IEVycm9yKCdDb25uZWN0aW9uIGlzIGNsb3NlZCcpKTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aXZpdHkudHlwZSA9PT0gJ21lc3NhZ2UnICYmIGFjdGl2aXR5LmF0dGFjaG1lbnRzICYmIGFjdGl2aXR5LmF0dGFjaG1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB0aGlzLnBvc3RNZXNzYWdlV2l0aEF0dGFjaG1lbnRzKGFjdGl2aXR5KTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNwJCA9IE9ic2VydmFibGUuY3JlYXRlKGFzeW5jIHN1YnNjcmliZXIgPT4ge1xuICAgICAgY29uc3QgcmVxdWVzdCA9IEJGU0UuU3RyZWFtaW5nUmVxdWVzdC5jcmVhdGUoXG4gICAgICAgICdQT1NUJyxcbiAgICAgICAgJy92My9kaXJlY3RsaW5lL2NvbnZlcnNhdGlvbnMvJyArIHRoaXMuY29udmVyc2F0aW9uSWQgKyAnL2FjdGl2aXRpZXMnXG4gICAgICApO1xuICAgICAgcmVxdWVzdC5zZXRCb2R5KEpTT04uc3RyaW5naWZ5KGFjdGl2aXR5KSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLnN0cmVhbUNvbm5lY3Rpb24uc2VuZChyZXF1ZXN0KTtcbiAgICAgICAgaWYgKHJlc3Auc3RhdHVzQ29kZSAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoJ1Bvc3RBY3Rpdml0eSByZXR1cm5lZCAnICsgcmVzcC5zdGF0dXNDb2RlKTtcbiAgICAgICAgY29uc3QgbnVtYmVyT2ZTdHJlYW1zID0gcmVzcC5zdHJlYW1zLmxlbmd0aDtcbiAgICAgICAgaWYgKG51bWJlck9mU3RyZWFtcyAhPT0gMSkgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBvbmUgc3RyZWFtIGJ1dCBnb3QgJyArIG51bWJlck9mU3RyZWFtcyk7XG4gICAgICAgIGNvbnN0IGlkU3RyaW5nID0gYXdhaXQgcmVzcC5zdHJlYW1zWzBdLnJlYWRBc1N0cmluZygpO1xuICAgICAgICBjb25zdCB7IElkOiBpZCB9ID0gSlNPTi5wYXJzZShpZFN0cmluZyk7XG4gICAgICAgIHN1YnNjcmliZXIubmV4dChpZCk7XG4gICAgICAgIHJldHVybiBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIElmIHRoZXJlIGlzIGEgbmV0d29yayBpc3N1ZSB0aGVuIGl0cyBoYW5kbGVkIGJ5XG4gICAgICAgIC8vIHRoZSBkaXNjb25uZWN0aW9uSGFuZGxlci4gRXZlcnl0aGluZyBlbHNlIGNhblxuICAgICAgICAvLyBiZSByZXRyaWVkXG4gICAgICAgIGNvbnNvbGUud2FybihlKTtcbiAgICAgICAgdGhpcy5zdHJlYW1Db25uZWN0aW9uLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgcmV0dXJuIHN1YnNjcmliZXIuZXJyb3IoZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3AkO1xuICB9XG5cbiAgcHJpdmF0ZSBwb3N0TWVzc2FnZVdpdGhBdHRhY2htZW50cyhtZXNzYWdlOiBNZXNzYWdlKSB7XG4gICAgY29uc3QgeyBhdHRhY2htZW50cywgLi4ubWVzc2FnZVdpdGhvdXRBdHRhY2htZW50cyB9ID0gbWVzc2FnZTtcblxuICAgIHJldHVybiBPYnNlcnZhYmxlLmNyZWF0ZShzdWJzY3JpYmVyID0+IHtcbiAgICAgIGNvbnN0IGh0dHBDb250ZW50TGlzdCA9IFtdO1xuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBhcnJheUJ1ZmZlcnMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgIGF0dGFjaG1lbnRzLm1hcChhc3luYyBhdHRhY2htZW50ID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgbWVkaWEgPSBhdHRhY2htZW50IGFzIE1lZGlhO1xuICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChtZWRpYS5jb250ZW50VXJsKTtcbiAgICAgICAgICAgICAgaWYgKHJlcy5vaykge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGFycmF5QnVmZmVyOiBhd2FpdCByZXMuYXJyYXlCdWZmZXIoKSwgbWVkaWEgfTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJy4uLicpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBhcnJheUJ1ZmZlcnMuZm9yRWFjaCgoeyBhcnJheUJ1ZmZlciwgbWVkaWEgfSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmZyb20oYXJyYXlCdWZmZXIpO1xuICAgICAgICAgICAgY29uc3Qgc3RyZWFtID0gbmV3IEJGU0UuU3Vic2NyaWJhYmxlU3RyZWFtKCk7XG4gICAgICAgICAgICBzdHJlYW0ud3JpdGUoYnVmZmVyKTtcbiAgICAgICAgICAgIGNvbnN0IGh0dHBDb250ZW50ID0gbmV3IEJGU0UuSHR0cENvbnRlbnQoeyB0eXBlOiBtZWRpYS5jb250ZW50VHlwZSwgY29udGVudExlbmd0aDogYnVmZmVyLmxlbmd0aCB9LCBzdHJlYW0pO1xuICAgICAgICAgICAgaHR0cENvbnRlbnRMaXN0LnB1c2goaHR0cENvbnRlbnQpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3QgdXJsID0gYC92My9kaXJlY3RsaW5lL2NvbnZlcnNhdGlvbnMvJHt0aGlzLmNvbnZlcnNhdGlvbklkfS91c2Vycy8ke21lc3NhZ2VXaXRob3V0QXR0YWNobWVudHMuZnJvbS5pZH0vdXBsb2FkYDtcbiAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gQkZTRS5TdHJlYW1pbmdSZXF1ZXN0LmNyZWF0ZSgnUFVUJywgdXJsKTtcbiAgICAgICAgICBjb25zdCBhY3Rpdml0eVN0cmVhbSA9IG5ldyBCRlNFLlN1YnNjcmliYWJsZVN0cmVhbSgpO1xuICAgICAgICAgIGFjdGl2aXR5U3RyZWFtLndyaXRlKEpTT04uc3RyaW5naWZ5KG1lc3NhZ2VXaXRob3V0QXR0YWNobWVudHMpLCAndXRmLTgnKTtcbiAgICAgICAgICByZXF1ZXN0LmFkZFN0cmVhbShcbiAgICAgICAgICAgIG5ldyBCRlNFLkh0dHBDb250ZW50KFxuICAgICAgICAgICAgICB7IHR5cGU6ICdhcHBsaWNhdGlvbi92bmQubWljcm9zb2Z0LmFjdGl2aXR5JywgY29udGVudExlbmd0aDogYWN0aXZpdHlTdHJlYW0ubGVuZ3RoIH0sXG4gICAgICAgICAgICAgIGFjdGl2aXR5U3RyZWFtXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgICBodHRwQ29udGVudExpc3QuZm9yRWFjaChlID0+IHJlcXVlc3QuYWRkU3RyZWFtKGUpKTtcblxuICAgICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLnN0cmVhbUNvbm5lY3Rpb24uc2VuZChyZXF1ZXN0KTtcbiAgICAgICAgICBpZiAocmVzcC5zdHJlYW1zICYmIHJlc3Auc3RyZWFtcy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IobmV3IEVycm9yKGBJbnZhbGlkIHN0cmVhbSBjb3VudCAke3Jlc3Auc3RyZWFtcy5sZW5ndGh9YCkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB7IElkOiBpZCB9ID0gYXdhaXQgcmVzcC5zdHJlYW1zWzBdLnJlYWRBc0pzb248eyBJZDogc3RyaW5nIH0+KCk7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoaWQpO1xuICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICAgIH0pKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdhaXRVbnRpbE9ubGluZSgpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJC5zdWJzY3JpYmUoXG4gICAgICAgIGNzID0+IHtcbiAgICAgICAgICBpZiAoY3MgPT09IENvbm5lY3Rpb25TdGF0dXMuT25saW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZSA9PiByZWplY3QoZSlcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbm5lY3RBc3luYygpIHtcbiAgICBjb25zdCByZSA9IG5ldyBSZWdFeHAoJ15odHRwKHM/KScpO1xuXG4gICAgaWYgKCFyZS50ZXN0KHRoaXMuZG9tYWluKSkge1xuICAgICAgdGhyb3cgJ0RvbWFpbiBtdXN0IGJlZ2luIHdpdGggaHR0cCBvciBodHRwcyc7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1zID0geyB0b2tlbjogdGhpcy50b2tlbiB9O1xuXG4gICAgaWYgKHRoaXMuY29udmVyc2F0aW9uSWQpIHtcbiAgICAgIHBhcmFtc1snY29udmVyc2F0aW9uSWQnXSA9IHRoaXMuY29udmVyc2F0aW9uSWQ7XG4gICAgfVxuXG4gICAgY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIGNvbnN0IHVybFNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMocGFyYW1zKS50b1N0cmluZygpO1xuICAgIGNvbnN0IHdzVXJsID0gYCR7dGhpcy5kb21haW4ucmVwbGFjZShyZSwgJ3dzJDEnKX0vY29udmVyc2F0aW9ucy9jb25uZWN0PyR7dXJsU2VhcmNoUGFyYW1zfWA7XG5cbiAgICAvLyBUaGlzIHByb21pc2Ugd2lsbCByZXNvbHZlIHdoZW4gaXQgaXMgZGlzY29ubmVjdGVkLlxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnN0cmVhbUNvbm5lY3Rpb24gPSBuZXcgV2ViU29ja2V0Q2xpZW50V2l0aE5ldHdvcmtJbmZvcm1hdGlvbih7XG4gICAgICAgICAgZGlzY29ubmVjdGlvbkhhbmRsZXI6IHJlc29sdmUsXG4gICAgICAgICAgbmV0d29ya0luZm9ybWF0aW9uOiB0aGlzLiNuZXR3b3JrSW5mb3JtYXRpb24sXG4gICAgICAgICAgcmVxdWVzdEhhbmRsZXI6IHtcbiAgICAgICAgICAgIHByb2Nlc3NSZXF1ZXN0OiBzdHJlYW1pbmdSZXF1ZXN0ID0+IHtcbiAgICAgICAgICAgICAgLy8gSWYgYHN0cmVhbUNvbm5lY3Rpb25gIGlzIHN0aWxsIGN1cnJlbnQsIGFsbG93IGNhbGwgdG8gYHByb2Nlc3NSZXF1ZXN0KClgLCBvdGhlcndpc2UsIGlnbm9yZSBjYWxscyB0byBgcHJvY2Vzc1JlcXVlc3QoKWAuXG4gICAgICAgICAgICAgIC8vIFRoaXMgcHJldmVudHMgem9tYmllIGNvbm5lY3Rpb25zIGZyb20gc2VuZGluZyB1cyByZXF1ZXN0cy5cbiAgICAgICAgICAgICAgaWYgKGFib3J0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHByb2Nlc3Mgc3RyZWFtaW5nIHJlcXVlc3QsIGBzdHJlYW1pbmdDb25uZWN0aW9uYCBzaG91bGQgYmUgZGlzY29ubmVjdGVkLicpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudGhlU3RyZWFtSGFuZGxlci5wcm9jZXNzUmVxdWVzdChzdHJlYW1pbmdSZXF1ZXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHVybDogd3NVcmxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5xdWV1ZUFjdGl2aXRpZXMgPSB0cnVlO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuc3RyZWFtQ29ubmVjdGlvbi5jb25uZWN0KCk7XG5cbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IEJGU0UuU3RyZWFtaW5nUmVxdWVzdC5jcmVhdGUoJ1BPU1QnLCAnL3YzL2RpcmVjdGxpbmUvY29udmVyc2F0aW9ucycpO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuc3RyZWFtQ29ubmVjdGlvbi5zZW5kKHJlcXVlc3QpO1xuXG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXNDb2RlICE9PSAyMDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nvbm5lY3Rpb24gcmVzcG9uc2UgY29kZSAnICsgcmVzcG9uc2Uuc3RhdHVzQ29kZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzcG9uc2Uuc3RyZWFtcy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIDEgc3RyZWFtIGJ1dCBnb3QgJyArIHJlc3BvbnNlLnN0cmVhbXMubGVuZ3RoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlU3RyaW5nID0gYXdhaXQgcmVzcG9uc2Uuc3RyZWFtc1swXS5yZWFkQXNTdHJpbmcoKTtcbiAgICAgICAgY29uc3QgY29udmVyc2F0aW9uID0gSlNPTi5wYXJzZShyZXNwb25zZVN0cmluZyk7XG5cbiAgICAgICAgdGhpcy5jb252ZXJzYXRpb25JZCA9IGNvbnZlcnNhdGlvbi5jb252ZXJzYXRpb25JZDtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJC5uZXh0KENvbm5lY3Rpb25TdGF0dXMuT25saW5lKTtcblxuICAgICAgICAvLyBXYWl0IHVudGlsIERMIGNvbnN1bWVycyBoYXZlIGhhZCBhIGNoYW5jZSB0byBiZSBub3RpZmllZFxuICAgICAgICAvLyBvZiB0aGUgY29ubmVjdGlvbiBzdGF0dXMgY2hhbmdlLlxuICAgICAgICAvLyBUaGlzIGlzIHNwZWNpZmljIHRvIFJ4SlMgaW1wbGVtZW50YXRpb24gb2Ygb2JzZXJ2YWJsZSwgd2hpY2ggY2FsbGluZyBzdWJzY3JpYmUoKSBhZnRlciBuZXh0KCkgd2lsbCBzdGlsbCBnZXQgdGhlIHZhbHVlLlxuICAgICAgICBhd2FpdCB0aGlzLndhaXRVbnRpbE9ubGluZSgpO1xuXG4gICAgICAgIHRoaXMudGhlU3RyZWFtSGFuZGxlci5mbHVzaCgpO1xuICAgICAgICB0aGlzLnF1ZXVlQWN0aXZpdGllcyA9IGZhbHNlO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgfSkuZmluYWxseSgoKSA9PiBhYm9ydENvbnRyb2xsZXIuYWJvcnQoKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbm5lY3RXaXRoUmV0cnlBc3luYygpIHtcbiAgICAvLyBUaGlzIGZvci1sb29wIHdpbGwgYnJlYWsgd2hlbiBzb21lb25lIGNhbGwgZW5kKCkgYW5kIGl0IHdpbGwgc2lnbmFsIENvbm5lY3Rpb25TdGF0dXMuRW5kZWQuXG4gICAgZm9yICg7Oykge1xuICAgICAgLy8gQ3JlYXRlIGEgbmV3IHNpZ25hbCBhbmQgd2FpdCBmb3Igc29tZW9uZSBraWNraW5nIG9mZiB0aGUgY29ubmVjdGlvbjpcbiAgICAgIC8vIC0gc3Vic2NyaWJlIHRvIGFjdGl2aXR5JCwgb3I7XG4gICAgICAvLyAtIHJldHJpZXMgZXhoYXVzdGVkIChGYWlsZWRUb0Nvbm5lY3QpLCB0aGVuLCBzb21lb25lIGNhbGwgcmVjb25uZWN0KClcbiAgICAgIGF3YWl0ICh0aGlzLmNvbm5lY3REZWZlcnJlZCA9IGNyZWF0ZURlZmVycmVkKCkpLnByb21pc2U7XG5cbiAgICAgIGxldCBudW1SZXRyaWVzID0gTUFYX1JFVFJZX0NPVU5UO1xuXG4gICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLm5leHQoQ29ubmVjdGlvblN0YXR1cy5Db25uZWN0aW5nKTtcblxuICAgICAgd2hpbGUgKG51bVJldHJpZXMgPiAwKSB7XG4gICAgICAgIG51bVJldHJpZXMtLTtcblxuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBUaGlzIHByb21pc2Ugd2lsbCByZWplY3QvcmVzb2x2ZSB3aGVuIGRpc2Nvbm5lY3RlZC5cbiAgICAgICAgICBhd2FpdCB0aGlzLmNvbm5lY3RBc3luYygpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiBzb21lb25lIGNhbGwgZW5kKCkgdG8gYnJlYWsgdGhlIGNvbm5lY3Rpb24sIHdlIHdpbGwgbmV2ZXIgbGlzdGVuIHRvIGFueSByZWNvbm5lY3QoKS5cbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvblN0YXR1cyQuZ2V0VmFsdWUoKSA9PT0gQ29ubmVjdGlvblN0YXR1cy5FbmRlZCkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIG9ubHkgcGxhY2UgdGhlIGxvb3AgaW4gdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGJyb2tlLlxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCBzaWduYWwgQ29ubmVjdGlvblN0YXR1cy5Db25uZWN0aW5nIHR3aWNlIG9yIG1vcmUgd2l0aG91dCBhbiBhY3R1YWwgY29ubmVjdGlvbi5cbiAgICAgICAgLy8gU3Vic2VxdWVudCByZXRyaWVzIHNob3VsZCBiZSB0cmFuc3BhcmVudC5cbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvblN0YXR1cyQuZ2V0VmFsdWUoKSAhPT0gQ29ubmVjdGlvblN0YXR1cy5Db25uZWN0aW5nKSB7XG4gICAgICAgICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJC5uZXh0KENvbm5lY3Rpb25TdGF0dXMuQ29ubmVjdGluZyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGUgY3VycmVudCBjb25uZWN0aW9uIGxhc3RlZCBmb3IgbW9yZSB0aGFuIGEgbWludXRlLCB0aGUgcHJldmlvdXMgY29ubmVjdGlvbiBpcyBnb29kLCB3aGljaCBtZWFuczpcbiAgICAgICAgLy8gLSB3ZSBzaG91bGQgcmVzZXQgdGhlIHJldHJ5IGNvdW50ZXIsIGFuZDtcbiAgICAgICAgLy8gLSB3ZSBzaG91bGQgcmVjb25uZWN0IGltbWVkaWF0ZWx5LlxuICAgICAgICBpZiAoNjAwMDAgPCBEYXRlLm5vdygpIC0gc3RhcnQpIHtcbiAgICAgICAgICBudW1SZXRyaWVzID0gTUFYX1JFVFJZX0NPVU5UO1xuICAgICAgICB9IGVsc2UgaWYgKG51bVJldHJpZXMgPiAwKSB7XG4gICAgICAgICAgLy8gU2xlZXAgb25seSBpZiB3ZSBhcmUgZG9pbmcgcmV0cnkuIE90aGVyd2lzZSwgd2UgYXJlIGdvaW5nIHRvIGJyZWFrIHRoZSBsb29wIGFuZCBzaWduYWwgRmFpbGVkVG9Db25uZWN0LlxuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCB0aGlzLmdldFJldHJ5RGVsYXkoKSkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRPRE86IFtURVNUXSBNYWtlIHN1cmUgRmFpbGVkVG9Db25uZWN0IGlzIHJlcG9ydGVkIGltbWVkaWF0ZWx5IGFmdGVyIGxhc3QgZGlzY29ubmVjdGlvbiwgc2hvdWxkIGJlIG5vIGdldFJldHJ5RGVsYXkoKS5cbiAgICAgIC8vIEZhaWxlZCB0byByZWNvbm5lY3QgYWZ0ZXIgbXVsdGlwbGUgcmV0cmllcy5cbiAgICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQubmV4dChDb25uZWN0aW9uU3RhdHVzLkZhaWxlZFRvQ29ubmVjdCk7XG4gICAgfVxuXG4gICAgLy8gTm90ZTogTm8gY29kZSB3aWxsIGhpdCB0aGlzIGxpbmUuXG4gIH1cblxuICAvLyBSZXR1cm5zIHRoZSBkZWxheSBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHNcbiAgcHJpdmF0ZSBnZXRSZXRyeURlbGF5KCkge1xuICAgIHJldHVybiBNYXRoLmZsb29yKDMwMDAgKyBNYXRoLnJhbmRvbSgpICogMTIwMDApO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsSUFBQUEsZ0JBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLFdBQUEsR0FB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
|