superagent 10.4.0 → 10.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/node/index.js CHANGED
@@ -87,6 +87,11 @@ function disposeNodeRequest(request_) {
87
87
  return;
88
88
  }
89
89
  request_._requestDisposed = true;
90
+ if (request_._streamResponseListener) {
91
+ req.removeListener('response', request_._streamResponseListener);
92
+ request_._streamResponseListener = undefined;
93
+ request_._streamResponse = undefined;
94
+ }
90
95
  try {
91
96
  // HTTP/2 wrapper keeps a session open as soon as request() is called.
92
97
  // Prefer destroying that session so we never call abort() → getFrame()
@@ -149,6 +154,59 @@ function preserveDotSegments(urlString) {
149
154
  };
150
155
  }
151
156
 
157
+ /**
158
+ * Default a scheme-less URL string to http://.
159
+ *
160
+ * @param {String} urlString
161
+ * @return {String}
162
+ * @api private
163
+ */
164
+ function withDefaultProtocol(urlString) {
165
+ return urlString.indexOf('http') === 0 ? urlString : `http://${urlString}`;
166
+ }
167
+
168
+ /**
169
+ * Protocols a redirect may lead to. A request made over a Unix domain socket
170
+ * may additionally be redirected within that same socket (see
171
+ * `isAllowedRedirectTarget`).
172
+ */
173
+ const REDIRECT_PROTOCOLS = new Set(['http:', 'https:']);
174
+ const UNIX_SOCKET_PROTOCOLS = new Set(['http+unix:', 'https+unix:']);
175
+
176
+ /**
177
+ * Whether a redirect from `current` to `target` may be followed.
178
+ *
179
+ * Only http(s) targets are followed. A remote server must never be able to
180
+ * steer the client into a local Unix domain socket (`http+unix://`) or any
181
+ * other scheme through a Location header; a request that was itself made over
182
+ * a Unix domain socket may only be redirected within that same socket.
183
+ *
184
+ * @param {URL} current
185
+ * @param {URL} target
186
+ * @return {Boolean}
187
+ * @api private
188
+ */
189
+ function isAllowedRedirectTarget(current, target) {
190
+ if (REDIRECT_PROTOCOLS.has(target.protocol)) return true;
191
+ return UNIX_SOCKET_PROTOCOLS.has(target.protocol) && target.protocol === current.protocol && target.hostname !== '' && target.hostname === current.hostname;
192
+ }
193
+
194
+ /**
195
+ * Whether two URLs share an origin. Unix socket URLs have an opaque (`null`)
196
+ * WHATWG origin, so they are compared by protocol and socket path instead.
197
+ *
198
+ * @param {URL} current
199
+ * @param {URL} target
200
+ * @return {Boolean}
201
+ * @api private
202
+ */
203
+ function isSameOrigin(current, target) {
204
+ if (current.origin !== 'null' && target.origin !== 'null') {
205
+ return current.origin === target.origin;
206
+ }
207
+ return current.protocol === target.protocol && current.hostname === target.hostname && current.port === target.port;
208
+ }
209
+
152
210
  /**
153
211
  * Expose `Response`.
154
212
  */
@@ -205,6 +263,19 @@ exports.serialize = {
205
263
 
206
264
  exports.parse = require('./parsers');
207
265
 
266
+ /**
267
+ * The default parsers as shipped; they only accumulate a buffered body, so
268
+ * they are skipped for unbuffered responses (see `_end`). Captured here so
269
+ * that a parser a user installs under the same key is still honoured.
270
+ */
271
+ const BUILT_IN_PARSERS = {
272
+ 'application/x-www-form-urlencoded': exports.parse['application/x-www-form-urlencoded'],
273
+ 'application/json': exports.parse['application/json'],
274
+ text: exports.parse.text,
275
+ image: exports.parse.image
276
+ };
277
+ const BUFFERING_PARSERS = new Set(Object.keys(BUILT_IN_PARSERS).map(key => BUILT_IN_PARSERS[key]));
278
+
208
279
  /**
209
280
  * Default buffering map. Can be used to set certain
210
281
  * response types to buffer/not buffer.
@@ -491,6 +562,10 @@ Request.prototype.write = function (data, encoding) {
491
562
  const request_ = this.request();
492
563
  if (!this._streamRequest) {
493
564
  this._streamRequest = true;
565
+ this._streamResponseListener = res => {
566
+ this._streamResponse = res;
567
+ };
568
+ request_.once('response', this._streamResponseListener);
494
569
  }
495
570
  return request_.write(data, encoding);
496
571
  };
@@ -568,15 +643,39 @@ Request.prototype._redirect = function (res) {
568
643
  }
569
644
  debug('redirect %s -> %s', this.url, url);
570
645
 
571
- // location
572
- url = new URL(url, this.url).href;
573
-
574
646
  // ensure the response is being consumed
575
647
  // this is required for Node v0.10+
576
648
  res.resume();
649
+
650
+ // location
651
+ //
652
+ // The Location header is attacker controlled: a malformed value must not
653
+ // throw out of the response event (which would crash the process), and only
654
+ // http(s) targets may be followed. A remote server must never be able to
655
+ // steer the client into a local Unix domain socket or another scheme.
656
+ let target;
657
+ let current;
658
+ try {
659
+ current = new URL(withDefaultProtocol(this.url));
660
+ target = new URL(url, current);
661
+ } catch (err) {
662
+ const error = new Error(`Invalid redirect location: ${url}`);
663
+ error.code = 'EINVALIDREDIRECT';
664
+ error.status = res.statusCode;
665
+ error.location = url;
666
+ return this.callback(error, res);
667
+ }
668
+ if (!isAllowedRedirectTarget(current, target)) {
669
+ const error = new Error(`Unsupported protocol in redirect location: ${target.href}`);
670
+ error.code = 'EUNSUPPORTEDREDIRECT';
671
+ error.status = res.statusCode;
672
+ error.location = url;
673
+ return this.callback(error, res);
674
+ }
675
+ url = target.href;
577
676
  this._emitPreRedirect(res);
578
677
  let headers = this.req.getHeaders ? this.req.getHeaders() : this.req._headers;
579
- const changesOrigin = new URL(url).origin !== new URL(this.url).origin;
678
+ const changesOrigin = !isSameOrigin(current, target);
580
679
 
581
680
  // implementation of 302 following defacto standard
582
681
  if (res.statusCode === 301 || res.statusCode === 302) {
@@ -610,6 +709,14 @@ Request.prototype._redirect = function (res) {
610
709
  delete headers.authorization;
611
710
  delete headers.cookie;
612
711
  }
712
+
713
+ // credentials given with `.auth(user, pass, { type: 'auto' })` are turned
714
+ // into an Authorization header by every `request()` call, so they must be
715
+ // dropped as well or they would be re-sent to the new origin
716
+ if (changesOrigin) {
717
+ this.username = undefined;
718
+ this.password = undefined;
719
+ }
613
720
  delete headers.host;
614
721
  delete this.req;
615
722
  delete this._formData;
@@ -757,13 +864,8 @@ Request.prototype.request = function () {
757
864
  } catch (err) {
758
865
  return this.emit('error', err);
759
866
  }
760
- let {
761
- url: urlString
762
- } = this;
867
+ const urlString = withDefaultProtocol(this.url);
763
868
  const retries = this._retries;
764
-
765
- // default to http://
766
- if (urlString.indexOf('http') !== 0) urlString = `http://${urlString}`;
767
869
  const protectedUrl = preserveDotSegments(urlString);
768
870
  const url = new URL(protectedUrl.urlString);
769
871
  let {
@@ -790,7 +892,9 @@ Request.prototype.request = function () {
790
892
  const {
791
893
  hostname
792
894
  } = url;
793
- const match = hostname in this._connectOverride ? this._connectOverride[hostname] : this._connectOverride['*'];
895
+ // the hostname may come from a redirect, so never let an inherited key
896
+ // such as "constructor" act as an override entry
897
+ const match = hasOwn(this._connectOverride, hostname) ? this._connectOverride[hostname] : this._connectOverride['*'];
794
898
  if (match) {
795
899
  // backup the real host
796
900
  if (!this._header.host) {
@@ -1100,7 +1204,7 @@ Request.prototype._end = function () {
1100
1204
  let contentType = req.getHeader('Content-Type');
1101
1205
  // Parse out just the content type from the header (ignore the charset)
1102
1206
  if (contentType) contentType = contentType.split(';')[0];
1103
- let serialize = this._serializer || exports.serialize[contentType];
1207
+ let serialize = this._serializer || (hasOwn(exports.serialize, contentType) ? exports.serialize[contentType] : undefined);
1104
1208
  if (!serialize && isJSON(contentType)) {
1105
1209
  serialize = exports.serialize['application/json'];
1106
1210
  }
@@ -1115,10 +1219,17 @@ Request.prototype._end = function () {
1115
1219
  return this._failRequest(err);
1116
1220
  }
1117
1221
  }
1222
+ let streamResponse;
1223
+ if (this._streamResponseListener) {
1224
+ req.removeListener('response', this._streamResponseListener);
1225
+ this._streamResponseListener = undefined;
1226
+ streamResponse = this._streamResponse;
1227
+ this._streamResponse = undefined;
1228
+ }
1118
1229
 
1119
1230
  // response
1120
1231
  // eslint-disable-next-line complexity
1121
- req.once('response', res => {
1232
+ const handleResponse = res => {
1122
1233
  debug('%s %s -> %s', this.method, this.url, res.statusCode);
1123
1234
  if (this._responseTimeoutTimer) {
1124
1235
  clearTimeout(this._responseTimeoutTimer);
@@ -1146,11 +1257,12 @@ Request.prototype._end = function () {
1146
1257
  }
1147
1258
 
1148
1259
  // zlib support
1260
+ let decompresser = null;
1149
1261
  if (this._shouldDecompress(res)) {
1150
- decompress(req, res);
1262
+ decompresser = decompress(req, res);
1151
1263
  }
1152
1264
  let buffer = this._buffer;
1153
- if (buffer === undefined && mime in exports.buffer) {
1265
+ if (buffer === undefined && hasOwn(exports.buffer, mime)) {
1154
1266
  buffer = Boolean(exports.buffer[mime]);
1155
1267
  }
1156
1268
  let parser = this._parser;
@@ -1209,7 +1321,9 @@ Request.prototype._end = function () {
1209
1321
  } else if (isBinary(mime)) {
1210
1322
  parser = exports.parse.image;
1211
1323
  buffer = buffer !== false; // For backwards-compatibility buffering default is ad-hoc MIME-dependent
1212
- } else if (exports.parse[mime]) {
1324
+ } else if (hasOwn(exports.parse, mime)) {
1325
+ // `mime` is attacker controlled; an inherited key such as
1326
+ // "constructor" must not resolve to a parser
1213
1327
  parser = exports.parse[mime];
1214
1328
  } else if (type === 'text') {
1215
1329
  parser = exports.parse.text;
@@ -1233,16 +1347,25 @@ Request.prototype._end = function () {
1233
1347
  this._resBuffered = buffer;
1234
1348
  let parserHandlesEnd = false;
1235
1349
  if (buffer) {
1236
- // Protectiona against zip bombs and other nuisance
1350
+ // Protection against zip bombs and other nuisance
1237
1351
  let responseBytesLeft = this._maxResponseSize || 200000000;
1352
+ let exceeded = false;
1238
1353
  res.on('data', buf => {
1239
- responseBytesLeft -= buf.byteLength || buf.length > 0 ? buf.length : 0;
1354
+ if (exceeded) return;
1355
+ // Parsers may have called `setEncoding()`, in which case chunks are
1356
+ // strings: count their encoded size rather than their UTF-16 length
1357
+ responseBytesLeft -= Buffer.isBuffer(buf) ? buf.length : Buffer.byteLength(String(buf));
1240
1358
  if (responseBytesLeft < 0) {
1359
+ exceeded = true;
1241
1360
  const error = new Error('Maximum response size reached');
1242
1361
  error.code = 'ETOOLARGE';
1243
1362
  // Parsers aren't required to observe error event,
1244
1363
  // so would incorrectly report success
1245
1364
  parserHandlesEnd = false;
1365
+ // A decompression bomb keeps inflating (and emitting) long after
1366
+ // the compressed input was consumed; stop it here so the limit
1367
+ // also bounds CPU and avoids a flood of late callbacks.
1368
+ if (decompresser) decompresser.destroy();
1246
1369
  // Destroy without an error: IncomingMessage.destroy(err) emits
1247
1370
  // 'error', and the parser may also fail, each of which would
1248
1371
  // call callback() again ("superagent: double callback bug").
@@ -1251,6 +1374,20 @@ Request.prototype._end = function () {
1251
1374
  }
1252
1375
  });
1253
1376
  }
1377
+ if (parser && !buffer && BUFFERING_PARSERS.has(parser)) {
1378
+ // The built-in parsers exist only to accumulate the body. When the
1379
+ // response is not buffered (`.buffer(false)`, or an unbuffered default
1380
+ // such as application/octet-stream) they would still collect the entire
1381
+ // stream in memory, without any size limit, while the response has
1382
+ // already been handed out to the caller. Keep only the encoding they
1383
+ // would have applied so `res.on('data')` consumers see the same chunks.
1384
+ if (parser === BUILT_IN_PARSERS['application/x-www-form-urlencoded']) {
1385
+ res.setEncoding('ascii');
1386
+ } else if (parser !== BUILT_IN_PARSERS.image) {
1387
+ res.setEncoding('utf8');
1388
+ }
1389
+ parser = null;
1390
+ }
1254
1391
  if (parser) {
1255
1392
  try {
1256
1393
  // Unbuffered parsers are supposed to emit response early,
@@ -1318,7 +1455,12 @@ Request.prototype._end = function () {
1318
1455
  this.emit('end');
1319
1456
  this.callback(null, this._emitResponse());
1320
1457
  });
1321
- });
1458
+ };
1459
+ if (streamResponse) {
1460
+ process.nextTick(handleResponse, streamResponse);
1461
+ } else {
1462
+ req.once('response', handleResponse);
1463
+ }
1322
1464
  this.emit('request', this);
1323
1465
  const getProgressMonitor = () => {
1324
1466
  const lengthComputable = true;
@@ -1370,8 +1512,12 @@ Request.prototype._end = function () {
1370
1512
 
1371
1513
  // attempt to get "Content-Length" header
1372
1514
  formData.getLength((error, length) => {
1373
- // TODO: Add chunked encoding when no length (if err)
1374
- if (error) debug('formData.getLength had error', error, length);
1515
+ // Unknown stream lengths can use chunked encoding, but filesystem
1516
+ // errors must fail before a partial multipart request is sent.
1517
+ if (error && error !== 'Unknown stream') {
1518
+ this._failRequest(error);
1519
+ return;
1520
+ }
1375
1521
  debug('got FormData Content-Length: %s', length);
1376
1522
  if (typeof length === 'number') {
1377
1523
  req.setHeader('Content-Length', length);
@@ -1518,4 +1664,4 @@ function hasNonEmptyResponseContent(res) {
1518
1664
  }
1519
1665
  return true;
1520
1666
  }
1521
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmb3JtYXQiLCJyZXF1aXJlIiwiU3RyZWFtIiwiaHR0cHMiLCJodHRwIiwiZnMiLCJ6bGliIiwidXRpbCIsInFzIiwibWltZSIsIm1ldGhvZHMiLCJGb3JtRGF0YSIsImZvcm1pZGFibGUiLCJkZWJ1ZyIsIkNvb2tpZUphciIsInNhZmVTdHJpbmdpZnkiLCJ1dGlscyIsIlJlcXVlc3RCYXNlIiwiaHR0cDIiLCJkZWNvbXByZXNzIiwiUmVzcG9uc2UiLCJtaXhpbiIsImhhc093biIsImlzQnJvdGxpRW5jb2RpbmciLCJpc0d6aXBPckRlZmxhdGVFbmNvZGluZyIsImNob29zZURlY29tcHJlc3NlciIsInJlcXVlc3QiLCJtZXRob2QiLCJ1cmwiLCJleHBvcnRzIiwiUmVxdWVzdCIsImVuZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsIm1vZHVsZSIsImFnZW50Iiwibm9vcCIsImRpc3Bvc2VOb2RlUmVxdWVzdCIsInJlcXVlc3RfIiwicmVxIiwiX3JlcXVlc3REaXNwb3NlZCIsInNlc3Npb24iLCJkZXN0cm95Iiwic29ja2V0IiwiYWJvcnQiLCJlcnIiLCJwcmVzZXJ2ZURvdFNlZ21lbnRzIiwidXJsU3RyaW5nIiwicGFydHMiLCJtYXRjaCIsInJlc3RvcmVQYXRoIiwicGF0aCIsInNlZ21lbnRzIiwicHJlZml4IiwicmVwbGFjZSIsIl8iLCJzZWdtZW50IiwibWFya2VyIiwicHVzaCIsInJlcXVlc3RQYXRoIiwicmVzdG9yZWRQYXRoIiwiaW5kZXgiLCJlbnRyaWVzIiwiZGVmaW5lIiwicHJvdG9jb2xzIiwic2VyaWFsaXplIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwib2JqZWN0Iiwic3RyaW5naWZ5IiwiaW5kaWNlcyIsInN0cmljdE51bGxIYW5kbGluZyIsInBhcnNlIiwiYnVmZmVyIiwiX2luaXRIZWFkZXJzIiwiX2hlYWRlciIsImhlYWRlciIsImNhbGwiLCJfZW5hYmxlSHR0cDIiLCJCb29sZWFuIiwicHJvY2VzcyIsImVudiIsIkhUVFAyX1RFU1QiLCJfYWdlbnQiLCJfZm9ybURhdGEiLCJ3cml0YWJsZSIsIl9yZWRpcmVjdHMiLCJyZWRpcmVjdHMiLCJjb29raWVzIiwiX3F1ZXJ5IiwicXNSYXciLCJfcmVkaXJlY3RMaXN0IiwiX3N0cmVhbVJlcXVlc3QiLCJfbG9va3VwIiwidW5kZWZpbmVkIiwib25jZSIsImNsZWFyVGltZW91dCIsImJpbmQiLCJpbmhlcml0cyIsInByb3RvdHlwZSIsImJvb2wiLCJFcnJvciIsImF0dGFjaCIsImZpZWxkIiwiZmlsZSIsIm9wdGlvbnMiLCJfZGF0YSIsIm8iLCJmaWxlbmFtZSIsImNyZWF0ZVJlYWRTdHJlYW0iLCJvbiIsImVycm9yIiwiZm9ybURhdGEiLCJfZ2V0Rm9ybURhdGEiLCJlbWl0IiwiYXBwZW5kIiwiY2FsbGVkIiwiY2FsbGJhY2siLCJhZGRSZXF1ZXN0IiwiVHlwZUVycm9yIiwibG9va3VwIiwidHlwZSIsInNldCIsImluY2x1ZGVzIiwiZ2V0VHlwZSIsImFjY2VwdCIsInF1ZXJ5IiwidmFsdWUiLCJPYmplY3QiLCJhc3NpZ24iLCJ3cml0ZSIsImRhdGEiLCJlbmNvZGluZyIsInBpcGUiLCJzdHJlYW0iLCJwaXBlZCIsIl9waXBlQ29udGludWUiLCJyZXMiLCJpc1JlZGlyZWN0Iiwic3RhdHVzQ29kZSIsIl9tYXhSZWRpcmVjdHMiLCJfcmVkaXJlY3QiLCJfZW1pdFJlc3BvbnNlIiwiX2Fib3J0ZWQiLCJfc2hvdWxkRGVjb21wcmVzcyIsImRlY29tcHJlc3NlciIsImNvZGUiLCJfYnVmZmVyIiwiaGVhZGVycyIsImxvY2F0aW9uIiwiVVJMIiwiaHJlZiIsInJlc3VtZSIsIl9lbWl0UHJlUmVkaXJlY3QiLCJnZXRIZWFkZXJzIiwiX2hlYWRlcnMiLCJjaGFuZ2VzT3JpZ2luIiwib3JpZ2luIiwiY2xlYW5IZWFkZXIiLCJhdXRob3JpemF0aW9uIiwiY29va2llIiwiaG9zdCIsIl9lbmRDYWxsZWQiLCJfZW1pdFJlZGlyZWN0IiwiX2NhbGxiYWNrIiwiYXV0aCIsInVzZXIiLCJwYXNzIiwiZW5jb2RlciIsInN0cmluZyIsIkJ1ZmZlciIsImZyb20iLCJ0b1N0cmluZyIsIl9hdXRoIiwiY2EiLCJjZXJ0IiwiX2NhIiwia2V5IiwiX2tleSIsInBmeCIsImlzQnVmZmVyIiwiX3BmeCIsIl9wYXNzcGhyYXNlIiwicGFzc3BocmFzZSIsIl9jZXJ0IiwiZGlzYWJsZVRMU0NlcnRzIiwiX2Rpc2FibGVUTFNDZXJ0cyIsIl9maW5hbGl6ZVF1ZXJ5U3RyaW5nIiwicmV0cmllcyIsIl9yZXRyaWVzIiwiaW5kZXhPZiIsInByb3RlY3RlZFVybCIsInByb3RvY29sIiwicGF0aG5hbWUiLCJzZWFyY2giLCJ0ZXN0Iiwic3BsaXQiLCJob3N0bmFtZSIsInNvY2tldFBhdGgiLCJfY29ubmVjdE92ZXJyaWRlIiwibmV3SG9zdCIsIm5ld1BvcnQiLCJwb3J0Iiwibm9ybWFsaXplSG9zdG5hbWUiLCJyZWplY3RVbmF1dGhvcml6ZWQiLCJOT0RFX1RMU19SRUpFQ1RfVU5BVVRIT1JJWkVEIiwic2VydmVybmFtZSIsIl90cnVzdExvY2FsaG9zdCIsIm1vZHVsZV8iLCJzZXRQcm90b2NvbCIsInJlc3BvbnNlIiwic2V0Tm9EZWxheSIsInNldEhlYWRlciIsImVtaXREcmFpbiIsInJlbW92ZUxpc3RlbmVyIiwidXNlcm5hbWUiLCJwYXNzd29yZCIsInRlbXBvcmFyeUphciIsInNldENvb2tpZXMiLCJnZXRDb29raWVzIiwiQ29va2llQWNjZXNzSW5mbyIsIkFsbCIsInRvVmFsdWVTdHJpbmciLCJfZGlzcG9zZVJlcXVlc3QiLCJfZmFpbFJlcXVlc3QiLCJfc2hvdWxkUmV0cnkiLCJfcmV0cnkiLCJmbiIsInRpbWVkb3V0IiwiY29uc29sZSIsIndhcm4iLCJfaXNSZXNwb25zZU9LIiwibWVzc2FnZSIsIlNUQVRVU19DT0RFUyIsInN0YXR1cyIsIl9tYXhSZXRyaWVzIiwibGlzdGVuZXJzIiwiX2lzSG9zdCIsImJvZHkiLCJmaWxlcyIsIl9lbmQiLCJfc2V0VGltZW91dHMiLCJfaGVhZGVyU2VudCIsImNvbnRlbnRUeXBlIiwiZ2V0SGVhZGVyIiwiX3NlcmlhbGl6ZXIiLCJpc0pTT04iLCJieXRlTGVuZ3RoIiwiX3Jlc3BvbnNlVGltZW91dFRpbWVyIiwibWF4IiwidG9Mb3dlckNhc2UiLCJ0cmltIiwibXVsdGlwYXJ0IiwicmVkaXJlY3QiLCJyZXNwb25zZVR5cGUiLCJfcmVzcG9uc2VUeXBlIiwicGFyc2VyIiwiX3BhcnNlciIsImltYWdlIiwiZm9ybSIsImJyaWRnZVN0cmVhbSIsIlBhc3NUaHJvdWdoIiwiaHR0cFZlcnNpb24iLCJyZWFkYWJsZSIsImZpZWxkcyIsImZsYXR0ZW5lZEZpZWxkcyIsImhhc093blByb3BlcnR5IiwiQXJyYXkiLCJpc0FycmF5IiwiZmxhdHRlbmVkRmlsZXMiLCJpc0JpbmFyeSIsInRleHQiLCJpc1RleHQiLCJfcmVzQnVmZmVyZWQiLCJwYXJzZXJIYW5kbGVzRW5kIiwicmVzcG9uc2VCeXRlc0xlZnQiLCJfbWF4UmVzcG9uc2VTaXplIiwiYnVmIiwiY29tcGxldGVBYm9ydGVkUmVzcG9uc2UiLCJnZXRQcm9ncmVzc01vbml0b3IiLCJsZW5ndGhDb21wdXRhYmxlIiwidG90YWwiLCJsb2FkZWQiLCJwcm9ncmVzcyIsIlRyYW5zZm9ybSIsIl90cmFuc2Zvcm0iLCJjaHVuayIsImRpcmVjdGlvbiIsImJ1ZmZlclRvQ2h1bmtzIiwiY2h1bmtTaXplIiwiY2h1bmtpbmciLCJSZWFkYWJsZSIsInRvdGFsTGVuZ3RoIiwicmVtYWluZGVyIiwiY3V0b2ZmIiwiaSIsInNsaWNlIiwicmVtYWluZGVyQnVmZmVyIiwiZ2V0TGVuZ3RoIiwiaGFzTm9uRW1wdHlSZXNwb25zZUNvbnRlbnQiLCJjb25uZWN0IiwiY29ubmVjdE92ZXJyaWRlIiwidHJ1c3RMb2NhbGhvc3QiLCJ0b2dnbGUiLCJuYW1lIiwidG9VcHBlckNhc2UiLCJzZW5kIiwic3VidHlwZSIsInJlZ2lzdHJ5Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL25vZGUvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICovXG5cbmNvbnN0IHsgZm9ybWF0IH0gPSByZXF1aXJlKCdub2RlOnVybCcpO1xuY29uc3QgU3RyZWFtID0gcmVxdWlyZSgnbm9kZTpzdHJlYW0nKTtcbmNvbnN0IGh0dHBzID0gcmVxdWlyZSgnbm9kZTpodHRwcycpO1xuY29uc3QgaHR0cCA9IHJlcXVpcmUoJ25vZGU6aHR0cCcpO1xuY29uc3QgZnMgPSByZXF1aXJlKCdub2RlOmZzJyk7XG5jb25zdCB6bGliID0gcmVxdWlyZSgnbm9kZTp6bGliJyk7XG5jb25zdCB1dGlsID0gcmVxdWlyZSgnbm9kZTp1dGlsJyk7XG5jb25zdCBxcyA9IHJlcXVpcmUoJ3FzJyk7XG5jb25zdCBtaW1lID0gcmVxdWlyZSgnbWltZScpO1xubGV0IG1ldGhvZHMgPSByZXF1aXJlKCdtZXRob2RzJyk7XG5jb25zdCBGb3JtRGF0YSA9IHJlcXVpcmUoJ2Zvcm0tZGF0YScpO1xuY29uc3QgZm9ybWlkYWJsZSA9IHJlcXVpcmUoJ2Zvcm1pZGFibGUnKTtcbmNvbnN0IGRlYnVnID0gcmVxdWlyZSgnZGVidWcnKSgnc3VwZXJhZ2VudCcpO1xuY29uc3QgQ29va2llSmFyID0gcmVxdWlyZSgnY29va2llamFyJyk7XG5jb25zdCBzYWZlU3RyaW5naWZ5ID0gcmVxdWlyZSgnZmFzdC1zYWZlLXN0cmluZ2lmeScpO1xuXG5jb25zdCB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5jb25zdCBSZXF1ZXN0QmFzZSA9IHJlcXVpcmUoJy4uL3JlcXVlc3QtYmFzZScpO1xuY29uc3QgaHR0cDIgPSByZXF1aXJlKCcuL2h0dHAyd3JhcHBlcicpO1xuY29uc3QgeyBkZWNvbXByZXNzIH0gPSByZXF1aXJlKCcuL3VuemlwJyk7XG5jb25zdCBSZXNwb25zZSA9IHJlcXVpcmUoJy4vcmVzcG9uc2UnKTtcblxuY29uc3QgeyBtaXhpbiwgaGFzT3duLCBpc0Jyb3RsaUVuY29kaW5nLCBpc0d6aXBPckRlZmxhdGVFbmNvZGluZyB9ID0gdXRpbHM7XG5jb25zdCB7IGNob29zZURlY29tcHJlc3NlciB9ID0gcmVxdWlyZSgnLi9kZWNvbXByZXNzJyk7XG5cbmZ1bmN0aW9uIHJlcXVlc3QobWV0aG9kLCB1cmwpIHtcbiAgLy8gY2FsbGJhY2tcbiAgaWYgKHR5cGVvZiB1cmwgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gbmV3IGV4cG9ydHMuUmVxdWVzdCgnR0VUJywgbWV0aG9kKS5lbmQodXJsKTtcbiAgfVxuXG4gIC8vIHVybCBmaXJzdFxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBuZXcgZXhwb3J0cy5SZXF1ZXN0KCdHRVQnLCBtZXRob2QpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBleHBvcnRzLlJlcXVlc3QobWV0aG9kLCB1cmwpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVlc3Q7XG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHM7XG5cbi8qKlxuICogRXhwb3NlIGBSZXF1ZXN0YC5cbiAqL1xuXG5leHBvcnRzLlJlcXVlc3QgPSBSZXF1ZXN0O1xuXG4vKipcbiAqIEV4cG9zZSB0aGUgYWdlbnQgZnVuY3Rpb25cbiAqL1xuXG5leHBvcnRzLmFnZW50ID0gcmVxdWlyZSgnLi9hZ2VudCcpO1xuXG4vKipcbiAqIE5vb3AuXG4gKi9cblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbi8qKlxuICogQ2xvc2UgYW4gdW5kZXJseWluZyBOb2RlIHJlcXVlc3Qvc2Vzc2lvbiBjcmVhdGVkIGR1cmluZyBzZXR1cC5cbiAqXG4gKiBVc2VkIHdoZW4gaGVhZGVyIGFwcGxpY2F0aW9uIG9yIGxhdGVyIHJlcXVlc3QtcGF0aCB3b3JrIHRocm93cyBhZnRlclxuICogYGh0dHAucmVxdWVzdCgpYCAvIGBodHRwMi5jb25uZWN0KClgIGhhcyBhbHJlYWR5IGFsbG9jYXRlZCBhIHNvY2tldC5cbiAqXG4gKiBAcGFyYW0ge1JlcXVlc3R9IHJlcXVlc3RfXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZGlzcG9zZU5vZGVSZXF1ZXN0KHJlcXVlc3RfKSB7XG4gIGNvbnN0IHsgcmVxIH0gPSByZXF1ZXN0XztcbiAgaWYgKCFyZXEgfHwgcmVxdWVzdF8uX3JlcXVlc3REaXNwb3NlZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHJlcXVlc3RfLl9yZXF1ZXN0RGlzcG9zZWQgPSB0cnVlO1xuXG4gIHRyeSB7XG4gICAgLy8gSFRUUC8yIHdyYXBwZXIga2VlcHMgYSBzZXNzaW9uIG9wZW4gYXMgc29vbiBhcyByZXF1ZXN0KCkgaXMgY2FsbGVkLlxuICAgIC8vIFByZWZlciBkZXN0cm95aW5nIHRoYXQgc2Vzc2lvbiBzbyB3ZSBuZXZlciBjYWxsIGFib3J0KCkg4oaSIGdldEZyYW1lKClcbiAgICAvLyB3aXRoIGludmFsaWQgaGVhZGVycyAod2hpY2ggd291bGQgZW1pdCBhIGxhdGUgcHJvdG9jb2wgZXJyb3IpLlxuICAgIGlmIChyZXEuc2Vzc2lvbiAmJiB0eXBlb2YgcmVxLnNlc3Npb24uZGVzdHJveSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmVxLnNlc3Npb24uZGVzdHJveSgpO1xuICAgIH1cblxuICAgIGlmIChyZXEuc29ja2V0ICYmIHR5cGVvZiByZXEuc29ja2V0LmRlc3Ryb3kgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJlcS5zb2NrZXQuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcmVxLmRlc3Ryb3kgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJlcS5kZXN0cm95KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiByZXEuYWJvcnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJlcS5hYm9ydCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcmVxLmVuZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmVxLmVuZCgpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZGVidWcoJ2Vycm9yIGRpc3Bvc2luZyByZXF1ZXN0IGFmdGVyIHNldHVwIGZhaWx1cmUnLCBlcnIpO1xuICB9XG59XG5cbi8qKlxuICogUHJlc2VydmUgZG90LW9ubHkgcGF0aCBzZWdtZW50cyB0aGF0IFdIQVRXRyBVUkwgbm9ybWFsaXplcyBhd2F5LlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB1cmxTdHJpbmdcbiAqIEByZXR1cm5zIHt7dXJsU3RyaW5nOiBTdHJpbmcsIHJlc3RvcmVQYXRoOiBGdW5jdGlvbn19XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gcHJlc2VydmVEb3RTZWdtZW50cyh1cmxTdHJpbmcpIHtcbiAgY29uc3QgcGFydHMgPSB1cmxTdHJpbmcubWF0Y2goXG4gICAgL14oW2Etel1bYS16XFxkKy4tXSo6XFwvXFwvW14vPyNdKikoW14/I10qKSguKikkL2lcbiAgKTtcbiAgaWYgKCFwYXJ0cykge1xuICAgIHJldHVybiB7XG4gICAgICB1cmxTdHJpbmcsXG4gICAgICByZXN0b3JlUGF0aChwYXRoKSB7XG4gICAgICAgIHJldHVybiBwYXRoO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBjb25zdCBzZWdtZW50cyA9IFtdO1xuICBjb25zdCBwcmVmaXggPSAnX19zdXBlcmFnZW50X2RvdF9zZWdtZW50Xyc7XG4gIGNvbnN0IHBhdGggPSBwYXJ0c1syXS5yZXBsYWNlKFxuICAgIC9cXC8oKD86XFwufCUyZSl7MSwyfSkoPz1cXC98JCkvZ2ksXG4gICAgKF8sIHNlZ21lbnQpID0+IHtcbiAgICAgIGNvbnN0IG1hcmtlciA9IGAke3ByZWZpeH0ke3NlZ21lbnRzLmxlbmd0aH1fX2A7XG4gICAgICBzZWdtZW50cy5wdXNoKHNlZ21lbnQpO1xuICAgICAgcmV0dXJuIGAvJHttYXJrZXJ9YDtcbiAgICB9XG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICB1cmxTdHJpbmc6IGAke3BhcnRzWzFdfSR7cGF0aH0ke3BhcnRzWzNdfWAsXG4gICAgcmVzdG9yZVBhdGgocmVxdWVzdFBhdGgpIHtcbiAgICAgIGxldCByZXN0b3JlZFBhdGggPSByZXF1ZXN0UGF0aDtcbiAgICAgIGZvciAoY29uc3QgW2luZGV4LCBzZWdtZW50XSBvZiBzZWdtZW50cy5lbnRyaWVzKCkpIHtcbiAgICAgICAgcmVzdG9yZWRQYXRoID0gcmVzdG9yZWRQYXRoLnJlcGxhY2UoYCR7cHJlZml4fSR7aW5kZXh9X19gLCBzZWdtZW50KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3RvcmVkUGF0aDtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogRXhwb3NlIGBSZXNwb25zZWAuXG4gKi9cblxuZXhwb3J0cy5SZXNwb25zZSA9IFJlc3BvbnNlO1xuXG4vKipcbiAqIERlZmluZSBcImZvcm1cIiBtaW1lIHR5cGUuXG4gKi9cblxubWltZS5kZWZpbmUoXG4gIHtcbiAgICAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJzogWydmb3JtJywgJ3VybGVuY29kZWQnLCAnZm9ybS1kYXRhJ11cbiAgfSxcbiAgdHJ1ZVxuKTtcblxuLyoqXG4gKiBQcm90b2NvbCBtYXAuXG4gKi9cblxuZXhwb3J0cy5wcm90b2NvbHMgPSB7XG4gICdodHRwOic6IGh0dHAsXG4gICdodHRwczonOiBodHRwcyxcbiAgJ2h0dHAyOic6IGh0dHAyXG59O1xuXG4vKipcbiAqIERlZmF1bHQgc2VyaWFsaXphdGlvbiBtYXAuXG4gKlxuICogICAgIHN1cGVyYWdlbnQuc2VyaWFsaXplWydhcHBsaWNhdGlvbi94bWwnXSA9IGZ1bmN0aW9uKG9iail7XG4gKiAgICAgICByZXR1cm4gJ2dlbmVyYXRlZCB4bWwgaGVyZSc7XG4gKiAgICAgfTtcbiAqXG4gKi9cblxuZXhwb3J0cy5zZXJpYWxpemUgPSB7XG4gICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKG9iamVjdCkge1xuICAgIHJldHVybiBxcy5zdHJpbmdpZnkob2JqZWN0LCB7IGluZGljZXM6IGZhbHNlLCBzdHJpY3ROdWxsSGFuZGxpbmc6IHRydWUgfSk7XG4gIH0sXG4gICdhcHBsaWNhdGlvbi9qc29uJzogc2FmZVN0cmluZ2lmeSxcbiAgLy8gQ1NQIHJlcG9ydHMgY2FycnkgSlNPTiBib2RpZXMgYnV0IHVzZSBhIGRpc3RpbmN0IHJlZ2lzdGVyZWQgbWVkaWEgdHlwZS5cbiAgJ2FwcGxpY2F0aW9uL2NzcC1yZXBvcnQnOiBzYWZlU3RyaW5naWZ5XG59O1xuXG4vKipcbiAqIERlZmF1bHQgcGFyc2Vycy5cbiAqXG4gKiAgICAgc3VwZXJhZ2VudC5wYXJzZVsnYXBwbGljYXRpb24veG1sJ10gPSBmdW5jdGlvbihyZXMsIGZuKXtcbiAqICAgICAgIGZuKG51bGwsIHJlcyk7XG4gKiAgICAgfTtcbiAqXG4gKi9cblxuZXhwb3J0cy5wYXJzZSA9IHJlcXVpcmUoJy4vcGFyc2VycycpO1xuXG4vKipcbiAqIERlZmF1bHQgYnVmZmVyaW5nIG1hcC4gQ2FuIGJlIHVzZWQgdG8gc2V0IGNlcnRhaW5cbiAqIHJlc3BvbnNlIHR5cGVzIHRvIGJ1ZmZlci9ub3QgYnVmZmVyLlxuICpcbiAqICAgICBzdXBlcmFnZW50LmJ1ZmZlclsnYXBwbGljYXRpb24veG1sJ10gPSB0cnVlO1xuICovXG5leHBvcnRzLmJ1ZmZlciA9IHt9O1xuXG4vKipcbiAqIEluaXRpYWxpemUgaW50ZXJuYWwgaGVhZGVyIHRyYWNraW5nIHByb3BlcnRpZXMgb24gYSByZXF1ZXN0IGluc3RhbmNlLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSByZXEgdGhlIGluc3RhbmNlXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gX2luaXRIZWFkZXJzKHJlcXVlc3RfKSB7XG4gIHJlcXVlc3RfLl9oZWFkZXIgPSB7XG4gICAgLy8gY29lcmNlcyBoZWFkZXIgbmFtZXMgdG8gbG93ZXJjYXNlXG4gIH07XG4gIHJlcXVlc3RfLmhlYWRlciA9IHtcbiAgICAvLyBwcmVzZXJ2ZXMgaGVhZGVyIG5hbWUgY2FzZVxuICB9O1xufVxuXG4vKipcbiAqIEluaXRpYWxpemUgYSBuZXcgYFJlcXVlc3RgIHdpdGggdGhlIGdpdmVuIGBtZXRob2RgIGFuZCBgdXJsYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbWV0aG9kXG4gKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IHVybFxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBSZXF1ZXN0KG1ldGhvZCwgdXJsKSB7XG4gIFN0cmVhbS5jYWxsKHRoaXMpO1xuICBpZiAodHlwZW9mIHVybCAhPT0gJ3N0cmluZycpIHVybCA9IGZvcm1hdCh1cmwpO1xuICB0aGlzLl9lbmFibGVIdHRwMiA9IEJvb2xlYW4ocHJvY2Vzcy5lbnYuSFRUUDJfVEVTVCk7IC8vIGludGVybmFsIG9ubHlcbiAgdGhpcy5fYWdlbnQgPSBmYWxzZTtcbiAgdGhpcy5fZm9ybURhdGEgPSBudWxsO1xuICB0aGlzLm1ldGhvZCA9IG1ldGhvZDtcbiAgdGhpcy51cmwgPSB1cmw7XG4gIF9pbml0SGVhZGVycyh0aGlzKTtcbiAgdGhpcy53cml0YWJsZSA9IHRydWU7XG4gIHRoaXMuX3JlZGlyZWN0cyA9IDA7XG4gIHRoaXMucmVkaXJlY3RzKG1ldGhvZCA9PT0gJ0hFQUQnID8gMCA6IDUpO1xuICB0aGlzLmNvb2tpZXMgPSAnJztcbiAgdGhpcy5xcyA9IHt9O1xuICB0aGlzLl9xdWVyeSA9IFtdO1xuICB0aGlzLnFzUmF3ID0gdGhpcy5fcXVlcnk7IC8vIFVudXNlZCwgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IG9ubHlcbiAgdGhpcy5fcmVkaXJlY3RMaXN0ID0gW107XG4gIHRoaXMuX3N0cmVhbVJlcXVlc3QgPSBmYWxzZTtcbiAgdGhpcy5fbG9va3VwID0gdW5kZWZpbmVkO1xuICB0aGlzLm9uY2UoJ2VuZCcsIHRoaXMuY2xlYXJUaW1lb3V0LmJpbmQodGhpcykpO1xufVxuXG4vKipcbiAqIEluaGVyaXQgZnJvbSBgU3RyZWFtYCAod2hpY2ggaW5oZXJpdHMgZnJvbSBgRXZlbnRFbWl0dGVyYCkuXG4gKiBNaXhpbiBgUmVxdWVzdEJhc2VgLlxuICovXG51dGlsLmluaGVyaXRzKFJlcXVlc3QsIFN0cmVhbSk7XG5cbm1peGluKFJlcXVlc3QucHJvdG90eXBlLCBSZXF1ZXN0QmFzZS5wcm90b3R5cGUpO1xuXG4vKipcbiAqIEVuYWJsZSBvciBEaXNhYmxlIGh0dHAyLlxuICpcbiAqIEVuYWJsZSBodHRwMi5cbiAqXG4gKiBgYGAganNcbiAqIHJlcXVlc3QuZ2V0KCdodHRwOi8vbG9jYWxob3N0LycpXG4gKiAgIC5odHRwMigpXG4gKiAgIC5lbmQoY2FsbGJhY2spO1xuICpcbiAqIHJlcXVlc3QuZ2V0KCdodHRwOi8vbG9jYWxob3N0LycpXG4gKiAgIC5odHRwMih0cnVlKVxuICogICAuZW5kKGNhbGxiYWNrKTtcbiAqIGBgYFxuICpcbiAqIERpc2FibGUgaHR0cDIuXG4gKlxuICogYGBgIGpzXG4gKiByZXF1ZXN0ID0gcmVxdWVzdC5odHRwMigpO1xuICogcmVxdWVzdC5nZXQoJ2h0dHA6Ly9sb2NhbGhvc3QvJylcbiAqICAgLmh0dHAyKGZhbHNlKVxuICogICAuZW5kKGNhbGxiYWNrKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5hYmxlXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUuaHR0cDIgPSBmdW5jdGlvbiAoYm9vbCkge1xuICBpZiAoZXhwb3J0cy5wcm90b2NvbHNbJ2h0dHAyOiddID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnc3VwZXJhZ2VudDogdGhpcyB2ZXJzaW9uIG9mIE5vZGUuanMgZG9lcyBub3Qgc3VwcG9ydCBodHRwMidcbiAgICApO1xuICB9XG5cbiAgdGhpcy5fZW5hYmxlSHR0cDIgPSBib29sID09PSB1bmRlZmluZWQgPyB0cnVlIDogYm9vbDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFF1ZXVlIHRoZSBnaXZlbiBgZmlsZWAgYXMgYW4gYXR0YWNobWVudCB0byB0aGUgc3BlY2lmaWVkIGBmaWVsZGAsXG4gKiB3aXRoIG9wdGlvbmFsIGBvcHRpb25zYCAob3IgZmlsZW5hbWUpLlxuICpcbiAqIGBgYCBqc1xuICogcmVxdWVzdC5wb3N0KCdodHRwOi8vbG9jYWxob3N0L3VwbG9hZCcpXG4gKiAgIC5hdHRhY2goJ2ZpZWxkJywgQnVmZmVyLmZyb20oJzxiPkhlbGxvIHdvcmxkPC9iPicpLCAnaGVsbG8uaHRtbCcpXG4gKiAgIC5lbmQoY2FsbGJhY2spO1xuICogYGBgXG4gKlxuICogQSBmaWxlbmFtZSBtYXkgYWxzbyBiZSB1c2VkOlxuICpcbiAqIGBgYCBqc1xuICogcmVxdWVzdC5wb3N0KCdodHRwOi8vbG9jYWxob3N0L3VwbG9hZCcpXG4gKiAgIC5hdHRhY2goJ2ZpbGVzJywgJ2ltYWdlLmpwZycpXG4gKiAgIC5lbmQoY2FsbGJhY2spO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkXG4gKiBAcGFyYW0ge1N0cmluZ3xmcy5SZWFkU3RyZWFtfEJ1ZmZlcn0gZmlsZVxuICogQHBhcmFtIHtTdHJpbmd8T2JqZWN0fSBvcHRpb25zXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUuYXR0YWNoID0gZnVuY3Rpb24gKGZpZWxkLCBmaWxlLCBvcHRpb25zKSB7XG4gIGlmIChmaWxlKSB7XG4gICAgaWYgKHRoaXMuX2RhdGEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInN1cGVyYWdlbnQgY2FuJ3QgbWl4IC5zZW5kKCkgYW5kIC5hdHRhY2goKVwiKTtcbiAgICB9XG5cbiAgICBsZXQgbyA9IG9wdGlvbnMgfHwge307XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgbyA9IHsgZmlsZW5hbWU6IG9wdGlvbnMgfTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGZpbGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAoIW8uZmlsZW5hbWUpIG8uZmlsZW5hbWUgPSBmaWxlO1xuICAgICAgZGVidWcoJ2NyZWF0aW5nIGBmcy5SZWFkU3RyZWFtYCBpbnN0YW5jZSBmb3IgZmlsZTogJXMnLCBmaWxlKTtcbiAgICAgIGZpbGUgPSBmcy5jcmVhdGVSZWFkU3RyZWFtKGZpbGUpO1xuICAgICAgZmlsZS5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc3QgZm9ybURhdGEgPSB0aGlzLl9nZXRGb3JtRGF0YSgpO1xuICAgICAgICBmb3JtRGF0YS5lbWl0KCdlcnJvcicsIGVycm9yKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoIW8uZmlsZW5hbWUgJiYgZmlsZS5wYXRoKSB7XG4gICAgICBvLmZpbGVuYW1lID0gZmlsZS5wYXRoO1xuICAgIH1cblxuICAgIHRoaXMuX2dldEZvcm1EYXRhKCkuYXBwZW5kKGZpZWxkLCBmaWxlLCBvKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuUmVxdWVzdC5wcm90b3R5cGUuX2dldEZvcm1EYXRhID0gZnVuY3Rpb24gKCkge1xuICBpZiAoIXRoaXMuX2Zvcm1EYXRhKSB7XG4gICAgdGhpcy5fZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICB0aGlzLl9mb3JtRGF0YS5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgIGRlYnVnKCdGb3JtRGF0YSBlcnJvcicsIGVycm9yKTtcbiAgICAgIGlmICh0aGlzLmNhbGxlZCkge1xuICAgICAgICAvLyBUaGUgcmVxdWVzdCBoYXMgYWxyZWFkeSBmaW5pc2hlZCBhbmQgdGhlIGNhbGxiYWNrIHdhcyBjYWxsZWQuXG4gICAgICAgIC8vIFNpbGVudGx5IGlnbm9yZSB0aGUgZXJyb3IuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jYWxsYmFjayhlcnJvcik7XG4gICAgICB0aGlzLmFib3J0KCk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gdGhpcy5fZm9ybURhdGE7XG59O1xuXG4vKipcbiAqIEdldHMvc2V0cyB0aGUgYEFnZW50YCB0byB1c2UgZm9yIHRoaXMgSFRUUCByZXF1ZXN0LiBUaGUgZGVmYXVsdCAoaWYgdGhpc1xuICogZnVuY3Rpb24gaXMgbm90IGNhbGxlZCkgaXMgdG8gb3B0IG91dCBvZiBjb25uZWN0aW9uIHBvb2xpbmcgKGBhZ2VudDogZmFsc2VgKS5cbiAqXG4gKiBAcGFyYW0ge2h0dHAuQWdlbnR9IGFnZW50XG4gKiBAcmV0dXJuIHtodHRwLkFnZW50fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5hZ2VudCA9IGZ1bmN0aW9uIChhZ2VudCkge1xuICBpZiAoXG4gICAgYXJndW1lbnRzLmxlbmd0aCA+IDAgJiZcbiAgICBhZ2VudCAmJlxuICAgIHR5cGVvZiBhZ2VudCA9PT0gJ29iamVjdCcgJiZcbiAgICB0eXBlb2YgYWdlbnQuYWRkUmVxdWVzdCAhPT0gJ2Z1bmN0aW9uJ1xuICApIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgJy5hZ2VudCgpIGV4cGVjdHMgYW4gaHR0cChzKS5BZ2VudC1jb21wYXRpYmxlIG9iamVjdC4gRGlkIHlvdSBtZWFuIHRvIHVzZSAuY2VydCgpIGFuZCAua2V5KCk/J1xuICAgICk7XG4gIH1cblxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRoaXMuX2FnZW50O1xuICB0aGlzLl9hZ2VudCA9IGFnZW50O1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogR2V0cy9zZXRzIHRoZSBgbG9va3VwYCBmdW5jdGlvbiB0byB1c2UgY3VzdG9tIEROUyByZXNvbHZlci5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBsb29rdXBcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5sb29rdXAgPSBmdW5jdGlvbiAobG9va3VwKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdGhpcy5fbG9va3VwO1xuICB0aGlzLl9sb29rdXAgPSBsb29rdXA7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXQgX0NvbnRlbnQtVHlwZV8gcmVzcG9uc2UgaGVhZGVyIHBhc3NlZCB0aHJvdWdoIGBtaW1lLmdldFR5cGUoKWAuXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogICAgICByZXF1ZXN0LnBvc3QoJy8nKVxuICogICAgICAgIC50eXBlKCd4bWwnKVxuICogICAgICAgIC5zZW5kKHhtbHN0cmluZylcbiAqICAgICAgICAuZW5kKGNhbGxiYWNrKTtcbiAqXG4gKiAgICAgIHJlcXVlc3QucG9zdCgnLycpXG4gKiAgICAgICAgLnR5cGUoJ2pzb24nKVxuICogICAgICAgIC5zZW5kKGpzb25zdHJpbmcpXG4gKiAgICAgICAgLmVuZChjYWxsYmFjayk7XG4gKlxuICogICAgICByZXF1ZXN0LnBvc3QoJy8nKVxuICogICAgICAgIC50eXBlKCdhcHBsaWNhdGlvbi9qc29uJylcbiAqICAgICAgICAuc2VuZChqc29uc3RyaW5nKVxuICogICAgICAgIC5lbmQoY2FsbGJhY2spO1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUudHlwZSA9IGZ1bmN0aW9uICh0eXBlKSB7XG4gIHJldHVybiB0aGlzLnNldChcbiAgICAnQ29udGVudC1UeXBlJyxcbiAgICB0eXBlLmluY2x1ZGVzKCcvJykgPyB0eXBlIDogbWltZS5nZXRUeXBlKHR5cGUpXG4gICk7XG59O1xuXG4vKipcbiAqIFNldCBfQWNjZXB0XyByZXNwb25zZSBoZWFkZXIgcGFzc2VkIHRocm91Z2ggYG1pbWUuZ2V0VHlwZSgpYC5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgICAgIHN1cGVyYWdlbnQudHlwZXMuanNvbiA9ICdhcHBsaWNhdGlvbi9qc29uJztcbiAqXG4gKiAgICAgIHJlcXVlc3QuZ2V0KCcvYWdlbnQnKVxuICogICAgICAgIC5hY2NlcHQoJ2pzb24nKVxuICogICAgICAgIC5lbmQoY2FsbGJhY2spO1xuICpcbiAqICAgICAgcmVxdWVzdC5nZXQoJy9hZ2VudCcpXG4gKiAgICAgICAgLmFjY2VwdCgnYXBwbGljYXRpb24vanNvbicpXG4gKiAgICAgICAgLmVuZChjYWxsYmFjayk7XG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGFjY2VwdFxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmFjY2VwdCA9IGZ1bmN0aW9uICh0eXBlKSB7XG4gIHJldHVybiB0aGlzLnNldCgnQWNjZXB0JywgdHlwZS5pbmNsdWRlcygnLycpID8gdHlwZSA6IG1pbWUuZ2V0VHlwZSh0eXBlKSk7XG59O1xuXG4vKipcbiAqIEFkZCBxdWVyeS1zdHJpbmcgYHZhbGAuXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogICByZXF1ZXN0LmdldCgnL3Nob2VzJylcbiAqICAgICAucXVlcnkoJ3NpemU9MTAnKVxuICogICAgIC5xdWVyeSh7IGNvbG9yOiAnYmx1ZScgfSlcbiAqXG4gKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IHZhbFxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLnF1ZXJ5ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgdGhpcy5fcXVlcnkucHVzaCh2YWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLnFzLCB2YWx1ZSk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogV3JpdGUgcmF3IGBkYXRhYCAvIGBlbmNvZGluZ2AgdG8gdGhlIHNvY2tldC5cbiAqXG4gKiBAcGFyYW0ge0J1ZmZlcnxTdHJpbmd9IGRhdGFcbiAqIEBwYXJhbSB7U3RyaW5nfSBlbmNvZGluZ1xuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoZGF0YSwgZW5jb2RpbmcpIHtcbiAgY29uc3QgcmVxdWVzdF8gPSB0aGlzLnJlcXVlc3QoKTtcbiAgaWYgKCF0aGlzLl9zdHJlYW1SZXF1ZXN0KSB7XG4gICAgdGhpcy5fc3RyZWFtUmVxdWVzdCA9IHRydWU7XG4gIH1cblxuICByZXR1cm4gcmVxdWVzdF8ud3JpdGUoZGF0YSwgZW5jb2RpbmcpO1xufTtcblxuLyoqXG4gKiBQaXBlIHRoZSByZXF1ZXN0IGJvZHkgdG8gYHN0cmVhbWAuXG4gKlxuICogQHBhcmFtIHtTdHJlYW19IHN0cmVhbVxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm4ge1N0cmVhbX1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUucGlwZSA9IGZ1bmN0aW9uIChzdHJlYW0sIG9wdGlvbnMpIHtcbiAgdGhpcy5waXBlZCA9IHRydWU7IC8vIEhBQ0suLi5cbiAgdGhpcy5idWZmZXIoZmFsc2UpO1xuICB0aGlzLmVuZCgpO1xuICByZXR1cm4gdGhpcy5fcGlwZUNvbnRpbnVlKHN0cmVhbSwgb3B0aW9ucyk7XG59O1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5fcGlwZUNvbnRpbnVlID0gZnVuY3Rpb24gKHN0cmVhbSwgb3B0aW9ucykge1xuICB0aGlzLnJlcS5vbmNlKCdyZXNwb25zZScsIChyZXMpID0+IHtcbiAgICAvLyByZWRpcmVjdFxuICAgIGlmIChcbiAgICAgIGlzUmVkaXJlY3QocmVzLnN0YXR1c0NvZGUpICYmXG4gICAgICB0aGlzLl9yZWRpcmVjdHMrKyAhPT0gdGhpcy5fbWF4UmVkaXJlY3RzXG4gICAgKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVkaXJlY3QocmVzKSA9PT0gdGhpc1xuICAgICAgICA/IHRoaXMuX3BpcGVDb250aW51ZShzdHJlYW0sIG9wdGlvbnMpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHRoaXMucmVzID0gcmVzO1xuICAgIHRoaXMuX2VtaXRSZXNwb25zZSgpO1xuICAgIGlmICh0aGlzLl9hYm9ydGVkKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5fc2hvdWxkRGVjb21wcmVzcyhyZXMpKSB7XG4gICAgICBjb25zdCBkZWNvbXByZXNzZXIgPSBjaG9vc2VEZWNvbXByZXNzZXIocmVzKTtcblxuICAgICAgZGVjb21wcmVzc2VyLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ1pfQlVGX0VSUk9SJykge1xuICAgICAgICAgIC8vIHVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUgaXMgaWdub3JlZCBieSBicm93c2VycyBhbmQgY3VybFxuICAgICAgICAgIHN0cmVhbS5lbWl0KCdlbmQnKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcnJvcik7XG4gICAgICB9KTtcbiAgICAgIHJlcy5waXBlKGRlY29tcHJlc3NlcikucGlwZShzdHJlYW0sIG9wdGlvbnMpO1xuICAgICAgLy8gZG9uJ3QgZW1pdCAnZW5kJyB1bnRpbCBkZWNvbXByZXNzZXIgaGFzIGNvbXBsZXRlZCB3cml0aW5nIGFsbCBpdHMgZGF0YS5cbiAgICAgIGRlY29tcHJlc3Nlci5vbmNlKCdlbmQnLCAoKSA9PiB0aGlzLmVtaXQoJ2VuZCcpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzLnBpcGUoc3RyZWFtLCBvcHRpb25zKTtcbiAgICAgIHJlcy5vbmNlKCdlbmQnLCAoKSA9PiB0aGlzLmVtaXQoJ2VuZCcpKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gc3RyZWFtO1xufTtcblxuLyoqXG4gKiBFbmFibGUgLyBkaXNhYmxlIGJ1ZmZlcmluZy5cbiAqXG4gKiBAcmV0dXJuIHtCb29sZWFufSBbdmFsXVxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmJ1ZmZlciA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICB0aGlzLl9idWZmZXIgPSB2YWx1ZSAhPT0gZmFsc2U7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBSZWRpcmVjdCB0byBgdXJsXG4gKlxuICogQHBhcmFtIHtJbmNvbWluZ01lc3NhZ2V9IHJlc1xuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5fcmVkaXJlY3QgPSBmdW5jdGlvbiAocmVzKSB7XG4gIGxldCB1cmwgPSByZXMuaGVhZGVycy5sb2NhdGlvbjtcbiAgaWYgKCF1cmwpIHtcbiAgICByZXR1cm4gdGhpcy5jYWxsYmFjayhuZXcgRXJyb3IoJ05vIGxvY2F0aW9uIGhlYWRlciBmb3IgcmVkaXJlY3QnKSwgcmVzKTtcbiAgfVxuXG4gIGRlYnVnKCdyZWRpcmVjdCAlcyAtPiAlcycsIHRoaXMudXJsLCB1cmwpO1xuXG4gIC8vIGxvY2F0aW9uXG4gIHVybCA9IG5ldyBVUkwodXJsLCB0aGlzLnVybCkuaHJlZjtcblxuICAvLyBlbnN1cmUgdGhlIHJlc3BvbnNlIGlzIGJlaW5nIGNvbnN1bWVkXG4gIC8vIHRoaXMgaXMgcmVxdWlyZWQgZm9yIE5vZGUgdjAuMTArXG4gIHJlcy5yZXN1bWUoKTtcblxuICB0aGlzLl9lbWl0UHJlUmVkaXJlY3QocmVzKTtcblxuICBsZXQgaGVhZGVycyA9IHRoaXMucmVxLmdldEhlYWRlcnMgPyB0aGlzLnJlcS5nZXRIZWFkZXJzKCkgOiB0aGlzLnJlcS5faGVhZGVycztcblxuICBjb25zdCBjaGFuZ2VzT3JpZ2luID0gbmV3IFVSTCh1cmwpLm9yaWdpbiAhPT0gbmV3IFVSTCh0aGlzLnVybCkub3JpZ2luO1xuXG4gIC8vIGltcGxlbWVudGF0aW9uIG9mIDMwMiBmb2xsb3dpbmcgZGVmYWN0byBzdGFuZGFyZFxuICBpZiAocmVzLnN0YXR1c0NvZGUgPT09IDMwMSB8fCByZXMuc3RhdHVzQ29kZSA9PT0gMzAyKSB7XG4gICAgLy8gc3RyaXAgQ29udGVudC0qIHJlbGF0ZWQgZmllbGRzXG4gICAgLy8gaW4gY2FzZSBvZiBQT1NUIGV0Y1xuICAgIGhlYWRlcnMgPSB1dGlscy5jbGVhbkhlYWRlcihoZWFkZXJzLCBjaGFuZ2VzT3JpZ2luKTtcblxuICAgIC8vIGZvcmNlIEdFVFxuICAgIHRoaXMubWV0aG9kID0gdGhpcy5tZXRob2QgPT09ICdIRUFEJyA/ICdIRUFEJyA6ICdHRVQnO1xuXG4gICAgLy8gY2xlYXIgZGF0YVxuICAgIHRoaXMuX2RhdGEgPSBudWxsO1xuICB9XG5cbiAgLy8gMzAzIGlzIGFsd2F5cyBHRVRcbiAgaWYgKHJlcy5zdGF0dXNDb2RlID09PSAzMDMpIHtcbiAgICAvLyBzdHJpcCBDb250ZW50LSogcmVsYXRlZCBmaWVsZHNcbiAgICAvLyBpbiBjYXNlIG9mIFBPU1QgZXRjXG4gICAgaGVhZGVycyA9IHV0aWxzLmNsZWFuSGVhZGVyKGhlYWRlcnMsIGNoYW5nZXNPcmlnaW4pO1xuXG4gICAgLy8gZm9yY2UgbWV0aG9kXG4gICAgdGhpcy5tZXRob2QgPSAnR0VUJztcblxuICAgIC8vIGNsZWFyIGRhdGFcbiAgICB0aGlzLl9kYXRhID0gbnVsbDtcbiAgfVxuXG4gIC8vIDMwNyBwcmVzZXJ2ZXMgbWV0aG9kXG4gIC8vIDMwOCBwcmVzZXJ2ZXMgbWV0aG9kXG4gIGlmICgocmVzLnN0YXR1c0NvZGUgPT09IDMwNyB8fCByZXMuc3RhdHVzQ29kZSA9PT0gMzA4KSAmJiBjaGFuZ2VzT3JpZ2luKSB7XG4gICAgZGVsZXRlIGhlYWRlcnMuYXV0aG9yaXphdGlvbjtcbiAgICBkZWxldGUgaGVhZGVycy5jb29raWU7XG4gIH1cblxuICBkZWxldGUgaGVhZGVycy5ob3N0O1xuXG4gIGRlbGV0ZSB0aGlzLnJlcTtcbiAgZGVsZXRlIHRoaXMuX2Zvcm1EYXRhO1xuXG4gIC8vIHJlbW92ZSBhbGwgYWRkIGhlYWRlciBleGNlcHQgVXNlci1BZ2VudFxuICBfaW5pdEhlYWRlcnModGhpcyk7XG5cbiAgLy8gcmVkaXJlY3RcbiAgdGhpcy5yZXMgPSByZXM7XG4gIHRoaXMuX2VuZENhbGxlZCA9IGZhbHNlO1xuICB0aGlzLnVybCA9IHVybDtcbiAgdGhpcy5xcyA9IHt9O1xuICB0aGlzLl9xdWVyeS5sZW5ndGggPSAwO1xuICB0aGlzLnNldChoZWFkZXJzKTtcbiAgdGhpcy5fZW1pdFJlZGlyZWN0KCk7XG4gIHRoaXMuX3JlZGlyZWN0TGlzdC5wdXNoKHRoaXMudXJsKTtcbiAgdGhpcy5lbmQodGhpcy5fY2FsbGJhY2spO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IEF1dGhvcml6YXRpb24gZmllbGQgdmFsdWUgd2l0aCBgdXNlcmAgYW5kIGBwYXNzYC5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgIC5hdXRoKCd0b2JpJywgJ2xlYXJuYm9vc3QnKVxuICogICAuYXV0aCgndG9iaTpsZWFybmJvb3N0JylcbiAqICAgLmF1dGgoJ3RvYmknKVxuICogICAuYXV0aChhY2Nlc3NUb2tlbiwgeyB0eXBlOiAnYmVhcmVyJyB9KVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB1c2VyXG4gKiBAcGFyYW0ge1N0cmluZ30gW3Bhc3NdXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIG9wdGlvbnMgd2l0aCBhdXRob3JpemF0aW9uIHR5cGUgJ2Jhc2ljJyBvciAnYmVhcmVyJyAoJ2Jhc2ljJyBpcyBkZWZhdWx0KVxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmF1dGggPSBmdW5jdGlvbiAodXNlciwgcGFzcywgb3B0aW9ucykge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkgcGFzcyA9ICcnO1xuICBpZiAodHlwZW9mIHBhc3MgPT09ICdvYmplY3QnICYmIHBhc3MgIT09IG51bGwpIHtcbiAgICAvLyBwYXNzIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgcmVwbGFjZWQgd2l0aCBvcHRpb25zXG4gICAgb3B0aW9ucyA9IHBhc3M7XG4gICAgcGFzcyA9ICcnO1xuICB9XG5cbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHsgdHlwZTogJ2Jhc2ljJyB9O1xuICB9XG5cbiAgY29uc3QgZW5jb2RlciA9IChzdHJpbmcpID0+IEJ1ZmZlci5mcm9tKHN0cmluZykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuXG4gIHJldHVybiB0aGlzLl9hdXRoKHVzZXIsIHBhc3MsIG9wdGlvbnMsIGVuY29kZXIpO1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIGNlcnRpZmljYXRlIGF1dGhvcml0eSBvcHRpb24gZm9yIGh0dHBzIHJlcXVlc3QuXG4gKlxuICogQHBhcmFtIHtCdWZmZXIgfCBBcnJheX0gY2VydFxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmNhID0gZnVuY3Rpb24gKGNlcnQpIHtcbiAgdGhpcy5fY2EgPSBjZXJ0O1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IHRoZSBjbGllbnQgY2VydGlmaWNhdGUga2V5IG9wdGlvbiBmb3IgaHR0cHMgcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0ge0J1ZmZlciB8IFN0cmluZ30gY2VydFxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmtleSA9IGZ1bmN0aW9uIChjZXJ0KSB7XG4gIHRoaXMuX2tleSA9IGNlcnQ7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIGtleSwgY2VydGlmaWNhdGUsIGFuZCBDQSBjZXJ0cyBvZiB0aGUgY2xpZW50IGluIFBGWCBvciBQS0NTMTIgZm9ybWF0LlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyIHwgU3RyaW5nfSBjZXJ0XG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUucGZ4ID0gZnVuY3Rpb24gKGNlcnQpIHtcbiAgaWYgKHR5cGVvZiBjZXJ0ID09PSAnb2JqZWN0JyAmJiAhQnVmZmVyLmlzQnVmZmVyKGNlcnQpKSB7XG4gICAgdGhpcy5fcGZ4ID0gY2VydC5wZng7XG4gICAgdGhpcy5fcGFzc3BocmFzZSA9IGNlcnQucGFzc3BocmFzZTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9wZnggPSBjZXJ0O1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldCB0aGUgY2xpZW50IGNlcnRpZmljYXRlIG9wdGlvbiBmb3IgaHR0cHMgcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0ge0J1ZmZlciB8IFN0cmluZ30gY2VydFxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmNlcnQgPSBmdW5jdGlvbiAoY2VydCkge1xuICB0aGlzLl9jZXJ0ID0gY2VydDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIERvIG5vdCByZWplY3QgZXhwaXJlZCBvciBpbnZhbGlkIFRMUyBjZXJ0cy5cbiAqIHNldHMgYHJlamVjdFVuYXV0aG9yaXplZD10cnVlYC4gQmUgd2FybmVkIHRoYXQgdGhpcyBhbGxvd3MgTUlUTSBhdHRhY2tzLlxuICpcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5kaXNhYmxlVExTQ2VydHMgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuX2Rpc2FibGVUTFNDZXJ0cyA9IHRydWU7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gYW4gaHR0cFtzXSByZXF1ZXN0LlxuICpcbiAqIEByZXR1cm4ge091dGdvaW5nTWVzc2FnZX1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG5SZXF1ZXN0LnByb3RvdHlwZS5yZXF1ZXN0ID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5yZXEpIHJldHVybiB0aGlzLnJlcTtcblxuICBjb25zdCBvcHRpb25zID0ge307XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBxdWVyeSA9IHFzLnN0cmluZ2lmeSh0aGlzLnFzLCB7XG4gICAgICBpbmRpY2VzOiBmYWxzZSxcbiAgICAgIHN0cmljdE51bGxIYW5kbGluZzogdHJ1ZVxuICAgIH0pO1xuICAgIGlmIChxdWVyeSkge1xuICAgICAgdGhpcy5xcyA9IHt9O1xuICAgICAgdGhpcy5fcXVlcnkucHVzaChxdWVyeSk7XG4gICAgfVxuXG4gICAgdGhpcy5fZmluYWxpemVRdWVyeVN0cmluZygpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4gdGhpcy5lbWl0KCdlcnJvcicsIGVycik7XG4gIH1cblxuICBsZXQgeyB1cmw6IHVybFN0cmluZyB9ID0gdGhpcztcbiAgY29uc3QgcmV0cmllcyA9IHRoaXMuX3JldHJpZXM7XG5cbiAgLy8gZGVmYXVsdCB0byBodHRwOi8vXG4gIGlmICh1cmxTdHJpbmcuaW5kZXhPZignaHR0cCcpICE9PSAwKSB1cmxTdHJpbmcgPSBgaHR0cDovLyR7dXJsU3RyaW5nfWA7XG4gIGNvbnN0IHByb3RlY3RlZFVybCA9IHByZXNlcnZlRG90U2VnbWVudHModXJsU3RyaW5nKTtcbiAgY29uc3QgdXJsID0gbmV3IFVSTChwcm90ZWN0ZWRVcmwudXJsU3RyaW5nKTtcbiAgbGV0IHsgcHJvdG9jb2wgfSA9IHVybDtcbiAgY29uc3QgcGF0aCA9IHByb3RlY3RlZFVybC5yZXN0b3JlUGF0aChgJHt1cmwucGF0aG5hbWV9JHt1cmwuc2VhcmNofWApO1xuXG4gIC8vIHN1cHBvcnQgdW5peCBzb2NrZXRzXG4gIGlmICgvXmh0dHBzP1xcK3VuaXg6Ly50ZXN0KHByb3RvY29sKSA9PT0gdHJ1ZSkge1xuICAgIC8vIGdldCB0aGUgcHJvdG9jb2xcbiAgICBwcm90b2NvbCA9IGAke3Byb3RvY29sLnNwbGl0KCcrJylbMF19OmA7XG5cbiAgICBpZiAoIXVybC5ob3N0bmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnSW52YWxpZCB1bml4IHNvY2tldCBVUkw6IHBlcmNlbnQtZW5jb2RlIHRoZSBzb2NrZXQgcGF0aCBieSByZXBsYWNpbmcgXCIvXCIgd2l0aCBcIiUyRlwiLidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gZ2V0IHRoZSBzb2NrZXQgcGF0aFxuICAgIG9wdGlvbnMuc29ja2V0UGF0aCA9IHVybC5ob3N0bmFtZS5yZXBsYWNlKC8lMkYvZywgJy8nKTtcbiAgICB1cmwuaG9zdCA9ICcnO1xuICAgIHVybC5ob3N0bmFtZSA9ICcnO1xuICB9XG5cbiAgLy8gT3ZlcnJpZGUgSVAgYWRkcmVzcyBvZiBhIGhvc3RuYW1lXG4gIGlmICh0aGlzLl9jb25uZWN0T3ZlcnJpZGUpIHtcbiAgICBjb25zdCB7IGhvc3RuYW1lIH0gPSB1cmw7XG4gICAgY29uc3QgbWF0Y2ggPVxuICAgICAgaG9zdG5hbWUgaW4gdGhpcy5fY29ubmVjdE92ZXJyaWRlXG4gICAgICAgID8gdGhpcy5fY29ubmVjdE92ZXJyaWRlW2hvc3RuYW1lXVxuICAgICAgICA6IHRoaXMuX2Nvbm5lY3RPdmVycmlkZVsnKiddO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgLy8gYmFja3VwIHRoZSByZWFsIGhvc3RcbiAgICAgIGlmICghdGhpcy5faGVhZGVyLmhvc3QpIHtcbiAgICAgICAgdGhpcy5zZXQoJ2hvc3QnLCB1cmwuaG9zdCk7XG4gICAgICB9XG5cbiAgICAgIGxldCBuZXdIb3N0O1xuICAgICAgbGV0IG5ld1BvcnQ7XG5cbiAgICAgIGlmICh0eXBlb2YgbWF0Y2ggPT09ICdvYmplY3QnKSB7XG4gICAgICAgIG5ld0hvc3QgPSBtYXRjaC5ob3N0O1xuICAgICAgICBuZXdQb3J0ID0gbWF0Y2gucG9ydDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld0hvc3QgPSBtYXRjaDtcbiAgICAgICAgbmV3UG9ydCA9IHVybC5wb3J0O1xuICAgICAgfVxuXG4gICAgICAvLyB3cmFwIFtpcHY2XVxuICAgICAgdXJsLmhvc3QgPSAvOi8udGVzdChuZXdIb3N0KSA/IGBbJHtuZXdIb3N0fV1gIDogbmV3SG9zdDtcbiAgICAgIGlmIChuZXdQb3J0KSB7XG4gICAgICAgIHVybC5ob3N0ICs9IGA6JHtuZXdQb3J0fWA7XG4gICAgICAgIHVybC5wb3J0ID0gbmV3UG9ydDtcbiAgICAgIH1cblxuICAgICAgdXJsLmhvc3RuYW1lID0gbmV3SG9zdDtcbiAgICB9XG4gIH1cblxuICAvLyBvcHRpb25zXG4gIG9wdGlvbnMubWV0aG9kID0gdGhpcy5tZXRob2Q7XG4gIG9wdGlvbnMucG9ydCA9IHVybC5wb3J0O1xuICBvcHRpb25zLnBhdGggPSBwYXRoO1xuICBvcHRpb25zLmhvc3QgPSB1dGlscy5ub3JtYWxpemVIb3N0bmFtZSh1cmwuaG9zdG5hbWUpOyAvLyBleDogWzo6MV0gLT4gOjoxXG4gIC8vIEFwcGx5IHVzZXIgaGVhZGVycyBiZWZvcmUgY29ubmVjdGluZyBzbyBpbnZhbGlkIHZhbHVlcyAoZS5nLiB1bmRlZmluZWQpXG4gIC8vIHRocm93IHdpdGhvdXQgYWxsb2NhdGluZyBhIFRDUCBoYW5kbGUuIFNlZSAjMTgyNy5cbiAgLy8gSFRUUC8yJ3Mgd3JhcHBlciBmb3J3YXJkcyBsZWZ0b3ZlciBvcHRpb25zIHRvIGh0dHAyLmNvbm5lY3QoKSwgc28gb25seVxuICAvLyBkbyB0aGlzIG9uIEhUVFAvMS5cbiAgaWYgKCF0aGlzLl9lbmFibGVIdHRwMikge1xuICAgIG9wdGlvbnMuaGVhZGVycyA9IHsgLi4udGhpcy5oZWFkZXIgfTtcbiAgfVxuXG4gIG9wdGlvbnMuY2EgPSB0aGlzLl9jYTtcbiAgb3B0aW9ucy5rZXkgPSB0aGlzLl9rZXk7XG4gIG9wdGlvbnMucGZ4ID0gdGhpcy5fcGZ4O1xuICBvcHRpb25zLmNlcnQgPSB0aGlzLl9jZXJ0O1xuICBvcHRpb25zLnBhc3NwaHJhc2UgPSB0aGlzLl9wYXNzcGhyYXNlO1xuICBvcHRpb25zLmFnZW50ID0gdGhpcy5fYWdlbnQ7XG4gIG9wdGlvbnMubG9va3VwID0gdGhpcy5fbG9va3VwO1xuICBvcHRpb25zLnJlamVjdFVuYXV0aG9yaXplZCA9XG4gICAgdHlwZW9mIHRoaXMuX2Rpc2FibGVUTFNDZXJ0cyA9PT0gJ2Jvb2xlYW4nXG4gICAgICA/ICF0aGlzLl9kaXNhYmxlVExTQ2VydHNcbiAgICAgIDogcHJvY2Vzcy5lbnYuTk9ERV9UTFNfUkVKRUNUX1VOQVVUSE9SSVpFRCAhPT0gJzAnO1xuXG4gIC8vIEFsbG93cyByZXF1ZXN0LmdldCgnaHR0cHM6Ly8xLjIuMy40LycpLnNldCgnSG9zdCcsICdleGFtcGxlLmNvbScpXG4gIGlmICh0aGlzLl9oZWFkZXIuaG9zdCkge1xuICAgIG9wdGlvbnMuc2VydmVybmFtZSA9IHRoaXMuX2hlYWRlci5ob3N0LnJlcGxhY2UoLzpcXGQrJC8sICcnKTtcbiAgfVxuXG4gIGlmIChcbiAgICB0aGlzLl90cnVzdExvY2FsaG9zdCAmJlxuICAgIC9eKD86bG9jYWxob3N0fDEyN1xcLjBcXC4wXFwuXFxkK3woMCo6KSs6MCoxKSQvLnRlc3QodXJsLmhvc3RuYW1lKVxuICApIHtcbiAgICBvcHRpb25zLnJlamVjdFVuYXV0aG9yaXplZCA9IGZhbHNlO1xuICB9XG5cbiAgLy8gaW5pdGlhdGUgcmVxdWVzdFxuICBjb25zdCBtb2R1bGVfID0gdGhpcy5fZW5hYmxlSHR0cDJcbiAgICA/IGV4cG9ydHMucHJvdG9jb2xzWydodHRwMjonXS5zZXRQcm90b2NvbChwcm90b2NvbClcbiAgICA6IGV4cG9ydHMucHJvdG9jb2xzW3Byb3RvY29sXTtcblxuICAvLyByZXF1ZXN0XG4gIHRoaXMucmVxID0gbW9kdWxlXy5yZXF1ZXN0KG9wdGlvbnMpO1xuICBjb25zdCB7IHJlcSB9ID0gdGhpcztcblxuICAvLyBBdHRhY2ggdGhpcyBiZWZvcmUgaGVhZGVyIHNldHVwIHNvIGRlc3Ryb3koKSBkdXJpbmcgYSBzZXR1cCBleGNlcHRpb25cbiAgLy8gY2Fubm90IGVtaXQgYW4gdW5oYW5kbGVkICdlcnJvcicgKG9yIGEgc2Vjb25kIGNhbGxiYWNrKS5cbiAgcmVxLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgIC8vIGZsYWcgYWJvcnRpb24gaGVyZSBmb3Igb3V0IHRpbWVvdXRzXG4gICAgLy8gYmVjYXVzZSBub2RlIHdpbGwgZW1pdCBhIGZhdXgtZXJyb3IgXCJzb2NrZXQgaGFuZyB1cFwiXG4gICAgLy8gd2hlbiByZXF1ZXN0IGlzIGFib3J0ZWQgYmVmb3JlIGEgY29ubmVjdGlvbiBpcyBtYWRlXG4gICAgaWYgKHRoaXMuX2Fib3J0ZWQgfHwgdGhpcy5fcmVxdWVzdERpc3Bvc2VkKSByZXR1cm47XG4gICAgLy8gaWYgbm90IHRoZSBzYW1lLCB3ZSBhcmUgaW4gdGhlICoqb2xkKiogKGNhbmNlbGxlZCkgcmVxdWVzdCxcbiAgICAvLyBzbyBuZWVkIHRvIGNvbnRpbnVlIChzYW1lIGFzIGZvciBhYm92ZSlcbiAgICBpZiAodGhpcy5fcmV0cmllcyAhPT0gcmV0cmllcykgcmV0dXJuO1xuICAgIC8vIGlmIHdlJ3ZlIHJlY2VpdmVkIGEgcmVzcG9uc2UgdGhlbiB3ZSBkb24ndCB3YW50IHRvIGxldFxuICAgIC8vIGFuIGVycm9yIGluIHRoZSByZXF1ZXN0IGJsb3cgdXAgdGhlIHJlc3BvbnNlXG4gICAgaWYgKHRoaXMucmVzcG9uc2UpIHJldHVybjtcbiAgICB0aGlzLmNhbGxiYWNrKGVycm9yKTtcbiAgfSk7XG5cbiAgdHJ5IHtcbiAgICAvLyBzZXQgdGNwIG5vIGRlbGF5XG4gICAgcmVxLnNldE5vRGVsYXkodHJ1ZSk7XG5cbiAgICBpZiAob3B0aW9ucy5tZXRob2QgIT09ICdIRUFEJykge1xuICAgICAgcmVxLnNldEhlYWRlcignQWNjZXB0LUVuY29kaW5nJywgJ2d6aXAsIGRlZmxhdGUnKTtcbiAgICB9XG5cbiAgICB0aGlzLnByb3RvY29sID0gcHJvdG9jb2w7XG4gICAgdGhpcy5ob3N0ID0gdXJsLmhvc3Q7XG5cbiAgICAvLyBleHBvc2UgZXZlbnRzXG4gICAgY29uc3QgZW1pdERyYWluID0gKCkgPT4ge1xuICAgICAgdGhpcy5lbWl0KCdkcmFpbicpO1xuICAgIH07XG5cbiAgICByZXEub24oJ2RyYWluJywgZW1pdERyYWluKTtcbiAgICByZXEub25jZSgnY2xvc2UnLCAoKSA9PiB7XG4gICAgICByZXEucmVtb3ZlTGlzdGVuZXIoJ2RyYWluJywgZW1pdERyYWluKTtcbiAgICB9KTtcblxuICAgIC8vIGF1dGhcbiAgICBpZiAodXJsLnVzZXJuYW1lIHx8IHVybC5wYXNzd29yZCkge1xuICAgICAgdGhpcy5hdXRoKHVybC51c2VybmFtZSwgdXJsLnBhc3N3b3JkKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy51c2VybmFtZSAmJiB0aGlzLnBhc3N3b3JkKSB7XG4gICAgICB0aGlzLmF1dGgodGhpcy51c2VybmFtZSwgdGhpcy5wYXNzd29yZCk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5oZWFkZXIpIHtcbiAgICAgIGlmIChoYXNPd24odGhpcy5oZWFkZXIsIGtleSkpIHJlcS5zZXRIZWFkZXIoa2V5LCB0aGlzLmhlYWRlcltrZXldKTtcbiAgICB9XG5cbiAgICAvLyBhZGQgY29va2llc1xuICAgIGlmICh0aGlzLmNvb2tpZXMpIHtcbiAgICAgIGlmIChoYXNPd24odGhpcy5faGVhZGVyLCAnY29va2llJykpIHtcbiAgICAgICAgLy8gbWVyZ2VcbiAgICAgICAgY29uc3QgdGVtcG9yYXJ5SmFyID0gbmV3IENvb2tpZUphci5Db29raWVKYXIoKTtcbiAgICAgICAgdGVtcG9yYXJ5SmFyLnNldENvb2tpZXModGhpcy5faGVhZGVyLmNvb2tpZS5zcGxpdCgnOyAnKSk7XG4gICAgICAgIHRlbXBvcmFyeUphci5zZXRDb29raWVzKHRoaXMuY29va2llcy5zcGxpdCgnOyAnKSk7XG4gICAgICAgIHJlcS5zZXRIZWFkZXIoXG4gICAgICAgICAgJ0Nvb2tpZScsXG4gICAgICAgICAgdGVtcG9yYXJ5SmFyXG4gICAgICAgICAgICAuZ2V0Q29va2llcyhDb29raWVKYXIuQ29va2llQWNjZXNzSW5mby5BbGwpXG4gICAgICAgICAgICAudG9WYWx1ZVN0cmluZygpXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXEuc2V0SGVhZGVyKCdDb29raWUnLCB0aGlzLmNvb2tpZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXE7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGRpc3Bvc2VOb2RlUmVxdWVzdCh0aGlzKTtcbiAgICB0aHJvdyBlcnI7XG4gIH1cbn07XG5cbi8qKlxuICogQWJvcnQvZW5kIHRoZSBOb2RlIHJlcXVlc3QgaWYgaXQgd2FzIGNyZWF0ZWQuXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblJlcXVlc3QucHJvdG90eXBlLl9kaXNwb3NlUmVxdWVzdCA9IGZ1bmN0aW9uICgpIHtcbiAgZGlzcG9zZU5vZGVSZXF1ZXN0KHRoaXMpO1xufTtcblxuLyoqXG4gKiBSZXBvcnQgYSBzZXR1cC9yZXF1ZXN0LXBhdGggZXJyb3Igd2l0aG91dCBsZWF2aW5nIHRoZSBzb2NrZXQgb3Blbi5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJvclxuICogQGFwaSBwcml2YXRlXG4gKi9cblJlcXVlc3QucHJvdG90eXBlLl9mYWlsUmVxdWVzdCA9IGZ1bmN0aW9uIChlcnJvcikge1xuICB0aGlzLl9kaXNwb3NlUmVxdWVzdCgpO1xuICBpZiAodHlwZW9mIHRoaXMuX2NhbGxiYWNrID09PSAnZnVuY3Rpb24nICYmIHRoaXMuX2NhbGxiYWNrICE9PSBub29wKSB7XG4gICAgdGhpcy5jYWxsYmFjayhlcnJvcik7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhyb3cgZXJyb3I7XG59O1xuXG4vKipcbiAqIEludm9rZSB0aGUgY2FsbGJhY2sgd2l0aCBgZXJyYCBhbmQgYHJlc2BcbiAqIGFuZCBoYW5kbGUgYXJpdHkgY2hlY2suXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyXG4gKiBAcGFyYW0ge1Jlc3BvbnNlfSByZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmNhbGxiYWNrID0gZnVuY3Rpb24gKGVycm9yLCByZXMpIHtcbiAgaWYgKHRoaXMuX3Nob3VsZFJldHJ5KGVycm9yLCByZXMpKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JldHJ5KCk7XG4gIH1cblxuICAvLyBBdm9pZCB0aGUgZXJyb3Igd2hpY2ggaXMgZW1pdHRlZCBmcm9tICdzb2NrZXQgaGFuZyB1cCcgdG8gY2F1c2UgdGhlIGZuIHVuZGVmaW5lZCBlcnJvciBvbiBKUyBydW50aW1lLlxuICBjb25zdCBmbiA9IHRoaXMuX2NhbGxiYWNrIHx8IG5vb3A7XG4gIHRoaXMuY2xlYXJUaW1lb3V0KCk7XG4gIGlmICh0aGlzLmNhbGxlZCkge1xuICAgIGlmICh0aGlzLnRpbWVkb3V0KSByZXR1cm47XG4gICAgcmV0dXJuIGNvbnNvbGUud2Fybignc3VwZXJhZ2VudDogZG91YmxlIGNhbGxiYWNrIGJ1ZycpO1xuICB9XG5cbiAgdGhpcy5jYWxsZWQgPSB0cnVlO1xuXG4gIGlmICghZXJyb3IpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKCF0aGlzLl9pc1Jlc3BvbnNlT0socmVzKSkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9ICdVbnN1Y2Nlc3NmdWwgSFRUUCByZXNwb25zZSc7XG4gICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICBtZXNzYWdlID0gaHR0cC5TVEFUVVNfQ09ERVNbcmVzLnN0YXR1c10gfHwgbWVzc2FnZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVycm9yID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgICBlcnJvci5zdGF0dXMgPSByZXMgPyByZXMuc3RhdHVzIDogdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgZXJyb3IgPSBlcnI7XG4gICAgICBlcnJvci5zdGF0dXMgPSBlcnJvci5zdGF0dXMgfHwgKHJlcyA/IHJlcy5zdGF0dXMgOiB1bmRlZmluZWQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEl0J3MgaW1wb3J0YW50IHRoYXQgdGhlIGNhbGxiYWNrIGlzIGNhbGxlZCBvdXRzaWRlIHRyeS9jYXRjaFxuICAvLyB0byBhdm9pZCBkb3VibGUgY2FsbGJhY2tcbiAgaWYgKCFlcnJvcikge1xuICAgIHJldHVybiBmbihudWxsLCByZXMpO1xuICB9XG5cbiAgZXJyb3IucmVzcG9uc2UgPSByZXM7XG4gIGlmICh0aGlzLl9tYXhSZXRyaWVzKSBlcnJvci5yZXRyaWVzID0gdGhpcy5fcmV0cmllcyAtIDE7XG5cbiAgLy8gb25seSBlbWl0IGVycm9yIGV2ZW50IGlmIHRoZXJlIGlzIGEgbGlzdGVuZXJcbiAgLy8gb3RoZXJ3aXNlIHdlIGFzc3VtZSB0aGUgY2FsbGJhY2sgdG8gYC5lbmQoKWAgd2lsbCBnZXQgdGhlIGVycm9yXG4gIGlmIChlcnJvciAmJiB0aGlzLmxpc3RlbmVycygnZXJyb3InKS5sZW5ndGggPiAwKSB7XG4gICAgdGhpcy5lbWl0KCdlcnJvcicsIGVycm9yKTtcbiAgfVxuXG4gIGZuKGVycm9yLCByZXMpO1xufTtcblxuLyoqXG4gKiBDaGVjayBpZiBgb2JqYCBpcyBhIGhvc3Qgb2JqZWN0LFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogaG9zdCBvYmplY3RcbiAqIEByZXR1cm4ge0Jvb2xlYW59IGlzIGEgaG9zdCBvYmplY3RcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5SZXF1ZXN0LnByb3RvdHlwZS5faXNIb3N0ID0gZnVuY3Rpb24gKG9iamVjdCkge1xuICByZXR1cm4gKFxuICAgIEJ1ZmZlci5pc0J1ZmZlcihvYmplY3QpIHx8XG4gICAgb2JqZWN0IGluc3RhbmNlb2YgU3RyZWFtIHx8XG4gICAgb2JqZWN0IGluc3RhbmNlb2YgRm9ybURhdGFcbiAgKTtcbn07XG5cbi8qKlxuICogSW5pdGlhdGUgcmVxdWVzdCwgaW52b2tpbmcgY2FsbGJhY2sgYGZuKGVyciwgcmVzKWBcbiAqIHdpdGggYW4gaW5zdGFuY2VvZiBgUmVzcG9uc2VgLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUuX2VtaXRSZXNwb25zZSA9IGZ1bmN0aW9uIChib2R5LCBmaWxlcykge1xuICBjb25zdCByZXNwb25zZSA9IG5ldyBSZXNwb25zZSh0aGlzKTtcbiAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlO1xuICByZXNwb25zZS5yZWRpcmVjdHMgPSB0aGlzLl9yZWRpcmVjdExpc3Q7XG4gIGlmICh1bmRlZmluZWQgIT09IGJvZHkpIHtcbiAgICByZXNwb25zZS5ib2R5ID0gYm9keTtcbiAgfVxuXG4gIHJlc3BvbnNlLmZpbGVzID0gZmlsZXM7XG4gIGlmICh0aGlzLl9lbmRDYWxsZWQpIHtcbiAgICByZXNwb25zZS5waXBlID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcImVuZCgpIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkLCBzbyBpdCdzIHRvbyBsYXRlIHRvIHN0YXJ0IHBpcGluZ1wiXG4gICAgICApO1xuICAgIH07XG4gIH1cblxuICB0aGlzLmVtaXQoJ3Jlc3BvbnNlJywgcmVzcG9uc2UpO1xuICByZXR1cm4gcmVzcG9uc2U7XG59O1xuXG4vKipcbiAqIEVtaXQgYHJlZGlyZWN0YCBldmVudCwgcGFzc2luZyBhbiBpbnN0YW5jZW9mIGBSZXNwb25zZWAuXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUuX2VtaXRSZWRpcmVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgcmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UodGhpcyk7XG4gIHJlc3BvbnNlLnJlZGlyZWN0cyA9IHRoaXMuX3JlZGlyZWN0TGlzdDtcbiAgdGhpcy5lbWl0KCdyZWRpcmVjdCcsIHJlc3BvbnNlKTtcbn07XG5cbi8qKlxuICogRW1pdCBhIHJlZGlyZWN0IHJlc3BvbnNlIGJlZm9yZSB0aGUgcmVxdWVzdCBVUkwgaXMgY2hhbmdlZC5cbiAqXG4gKiBAcGFyYW0ge0luY29taW5nTWVzc2FnZX0gcmVzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5fZW1pdFByZVJlZGlyZWN0ID0gZnVuY3Rpb24gKHJlcykge1xuICB0aGlzLnJlcyA9IHJlcztcbiAgY29uc3QgcmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UodGhpcyk7XG4gIHJlc3BvbnNlLnJlZGlyZWN0cyA9IHRoaXMuX3JlZGlyZWN0TGlzdDtcbiAgdGhpcy5lbWl0KCdwcmUtcmVkaXJlY3QnLCByZXNwb25zZSk7XG59O1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoZm4pIHtcbiAgdHJ5IHtcbiAgICB0aGlzLnJlcXVlc3QoKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhpcy5fZW5kQ2FsbGVkID0gdHJ1ZTtcbiAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLl9jYWxsYmFjayA9IGZuO1xuICAgICAgdGhpcy5jYWxsYmFjayhlcnIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRocm93IGVycjtcbiAgfVxuXG4gIGRlYnVnKCclcyAlcycsIHRoaXMubWV0aG9kLCB0aGlzLnVybCk7XG5cbiAgaWYgKHRoaXMuX2VuZENhbGxlZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICcuZW5kKCkgd2FzIGNhbGxlZCB0d2ljZS4gVGhpcyBpcyBub3Qgc3VwcG9ydGVkIGluIHN1cGVyYWdlbnQnXG4gICAgKTtcbiAgfVxuXG4gIHRoaXMuX2VuZENhbGxlZCA9IHRydWU7XG5cbiAgLy8gc3RvcmUgY2FsbGJhY2tcbiAgdGhpcy5fY2FsbGJhY2sgPSBmbiB8fCBub29wO1xuXG4gIHRoaXMuX2VuZCgpO1xufTtcblxuUmVxdWVzdC5wcm90b3R5cGUuX2VuZCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuX2Fib3J0ZWQpXG4gICAgcmV0dXJuIHRoaXMuY2FsbGJhY2soXG4gICAgICBuZXcgRXJyb3IoJ1RoZSByZXF1ZXN0IGhhcyBiZWVuIGFib3J0ZWQgZXZlbiBiZWZvcmUgLmVuZCgpIHdhcyBjYWxsZWQnKVxuICAgICk7XG5cbiAgbGV0IGRhdGEgPSB0aGlzLl9kYXRhO1xuICBjb25zdCB7IHJlcSB9ID0gdGhpcztcbiAgY29uc3QgeyBtZXRob2QgfSA9IHRoaXM7XG5cbiAgdGhpcy5fc2V0VGltZW91dHMoKTtcblxuICAvLyBib2R5XG4gIGlmIChtZXRob2QgIT09ICdIRUFEJyAmJiAhcmVxLl9oZWFkZXJTZW50KSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIHNlcmlhbGl6ZSBzdHVmZlxuICAgICAgaWYgKHR5cGVvZiBkYXRhICE9PSAnc3RyaW5nJykge1xuICAgICAgICBsZXQgY29udGVudFR5cGUgPSByZXEuZ2V0SGVhZGVyKCdDb250ZW50LVR5cGUnKTtcbiAgICAgICAgLy8gUGFyc2Ugb3V0IGp1c3QgdGhlIGNvbnRlbnQgdHlwZSBmcm9tIHRoZSBoZWFkZXIgKGlnbm9yZSB0aGUgY2hhcnNldClcbiAgICAgICAgaWYgKGNvbnRlbnRUeXBlKSBjb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlLnNwbGl0KCc7JylbMF07XG4gICAgICAgIGxldCBzZXJpYWxpemUgPSB0aGlzLl9zZXJpYWxpemVyIHx8IGV4cG9ydHMuc2VyaWFsaXplW2NvbnRlbnRUeXBlXTtcbiAgICAgICAgaWYgKCFzZXJpYWxpemUgJiYgaXNKU09OKGNvbnRlbnRUeXBlKSkge1xuICAgICAgICAgIHNlcmlhbGl6ZSA9IGV4cG9ydHMuc2VyaWFsaXplWydhcHBsaWNhdGlvbi9qc29uJ107XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2VyaWFsaXplKSBkYXRhID0gc2VyaWFsaXplKGRhdGEpO1xuICAgICAgfVxuXG4gICAgICAvLyBjb250ZW50LWxlbmd0aFxuICAgICAgaWYgKGRhdGEgJiYgIXJlcS5nZXRIZWFkZXIoJ0NvbnRlbnQtTGVuZ3RoJykpIHtcbiAgICAgICAgcmVxLnNldEhlYWRlcihcbiAgICAgICAgICAnQ29udGVudC1MZW5ndGgnLFxuICAgICAgICAgIEJ1ZmZlci5pc0J1ZmZlcihkYXRhKSA/IGRhdGEubGVuZ3RoIDogQnVmZmVyLmJ5dGVMZW5ndGgoZGF0YSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiB0aGlzLl9mYWlsUmVxdWVzdChlcnIpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHJlc3BvbnNlXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG4gIHJlcS5vbmNlKCdyZXNwb25zZScsIChyZXMpID0+IHtcbiAgICBkZWJ1ZygnJXMgJXMgLT4gJXMnLCB0aGlzLm1ldGhvZCwgdGhpcy51cmwsIHJlcy5zdGF0dXNDb2RlKTtcblxuICAgIGlmICh0aGlzLl9yZXNwb25zZVRpbWVvdXRUaW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3Jlc3BvbnNlVGltZW91dFRpbWVyKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5waXBlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG1heCA9IHRoaXMuX21heFJlZGlyZWN0cztcbiAgICBjb25zdCBtaW1lID0gdXRpbHMudHlwZShyZXMuaGVhZGVyc1snY29udGVudC10eXBlJ10gfHwgJycpIHx8ICd0ZXh0L3BsYWluJztcbiAgICBsZXQgdHlwZSA9IG1pbWUuc3BsaXQoJy8nKVswXTtcbiAgICBpZiAodHlwZSkgdHlwZSA9IHR5cGUudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgY29uc3QgbXVsdGlwYXJ0ID0gdHlwZSA9PT0gJ211bHRpcGFydCc7XG4gICAgY29uc3QgcmVkaXJlY3QgPSBpc1JlZGlyZWN0KHJlcy5zdGF0dXNDb2RlKTtcbiAgICBjb25zdCByZXNwb25zZVR5cGUgPSB0aGlzLl9yZXNwb25zZVR5cGU7XG5cbiAgICB0aGlzLnJlcyA9IHJlcztcblxuICAgIC8vIHJlZGlyZWN0XG4gICAgaWYgKHJlZGlyZWN0ICYmIHRoaXMuX3JlZGlyZWN0cysrICE9PSBtYXgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZWRpcmVjdChyZXMpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm1ldGhvZCA9PT0gJ0hFQUQnKSB7XG4gICAgICB0aGlzLmVtaXQoJ2VuZCcpO1xuICAgICAgdGhpcy5jYWxsYmFjayhudWxsLCB0aGlzLl9lbWl0UmVzcG9uc2UoKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gemxpYiBzdXBwb3J0XG4gICAgaWYgKHRoaXMuX3Nob3VsZERlY29tcHJlc3MocmVzKSkge1xuICAgICAgZGVjb21wcmVzcyhyZXEsIHJlcyk7XG4gICAgfVxuXG4gICAgbGV0IGJ1ZmZlciA9IHRoaXMuX2J1ZmZlcjtcbiAgICBpZiAoYnVmZmVyID09PSB1bmRlZmluZWQgJiYgbWltZSBpbiBleHBvcnRzLmJ1ZmZlcikge1xuICAgICAgYnVmZmVyID0gQm9vbGVhbihleHBvcnRzLmJ1ZmZlclttaW1lXSk7XG4gICAgfVxuXG4gICAgbGV0IHBhcnNlciA9IHRoaXMuX3BhcnNlcjtcbiAgICBpZiAodW5kZWZpbmVkID09PSBidWZmZXIgJiYgcGFyc2VyKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiQSBjdXN0b20gc3VwZXJhZ2VudCBwYXJzZXIgaGFzIGJlZW4gc2V0LCBidXQgYnVmZmVyaW5nIHN0cmF0ZWd5IGZvciB0aGUgcGFyc2VyIGhhc24ndCBiZWVuIGNvbmZpZ3VyZWQuIENhbGwgYHJlcS5idWZmZXIodHJ1ZSBvciBmYWxzZSlgIG9yIHNldCBgc3VwZXJhZ2VudC5idWZmZXJbbWltZV0gPSB0cnVlIG9yIGZhbHNlYFwiXG4gICAgICApO1xuICAgICAgYnVmZmVyID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcnNlcikge1xuICAgICAgaWYgKHJlc3BvbnNlVHlwZSkge1xuICAgICAgICBwYXJzZXIgPSBleHBvcnRzLnBhcnNlLmltYWdlOyAvLyBJdCdzIGFjdHVhbGx5IGEgZ2VuZXJpYyBCdWZmZXJcbiAgICAgICAgYnVmZmVyID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAobXVsdGlwYXJ0KSB7XG4gICAgICAgIGNvbnN0IGZvcm0gPSBmb3JtaWRhYmxlLmZvcm1pZGFibGUoKTtcbiAgICAgICAgcGFyc2VyID0gKHJlcywgY2FsbGJhY2spID0+IHtcbiAgICAgICAgICAvLyBDcmVhdGUgYSBQYXNzVGhyb3VnaCBzdHJlYW0gdGhhdCBhY3RzIGFzIGEgcHJvcGVyIEhUVFAgcmVxdWVzdFxuICAgICAgICAgIGNvbnN0IGJyaWRnZVN0cmVhbSA9IG5ldyBTdHJlYW0uUGFzc1Rocm91Z2goKTtcblxuICAgICAgICAgIC8vIEFkZCBIVFRQIHJlcXVlc3QgcHJvcGVydGllcyBmcm9tIHRoZSBjdXJyZW50IHJlcXVlc3QgY29udGV4dFxuICAgICAgICAgIGJyaWRnZVN0cmVhbS5tZXRob2QgPSB0aGlzLm1ldGhvZCB8fCAnUE9TVCc7XG4gICAgICAgICAgYnJpZGdlU3RyZWFtLnVybCA9IHRoaXMudXJsIHx8ICcvJztcbiAgICAgICAgICBicmlkZ2VTdHJlYW0uaHR0cFZlcnNpb24gPSByZXMuaHR0cFZlcnNpb24gfHwgJzEuMSc7XG4gICAgICAgICAgYnJpZGdlU3RyZWFtLmhlYWRlcnMgPSByZXMuaGVhZGVycyB8fCB7fTtcbiAgICAgICAgICBicmlkZ2VTdHJlYW0uc29ja2V0ID0gcmVzLnNvY2tldCB8fCB7IHJlYWRhYmxlOiB0cnVlIH07XG5cbiAgICAgICAgICAvLyBQaXBlIHRoZSByZXNwb25zZSBkYXRhIHRocm91Z2ggdGhlIGJyaWRnZSBzdHJlYW1cbiAgICAgICAgICByZXMucGlwZShicmlkZ2VTdHJlYW0pO1xuXG4gICAgICAgICAgZm9ybS5wYXJzZShicmlkZ2VTdHJlYW0sIChlcnIsIGZpZWxkcywgZmlsZXMpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIpIHJldHVybiBjYWxsYmFjayhlcnIpO1xuXG4gICAgICAgICAgICAvLyBGb3JtaWRhYmxlIHYzIGFsd2F5cyByZXR1cm5zIGFycmF5cywgYnV0IFN1cGVyQWdlbnQgZXhwZWN0cyBzaW5nbGUgdmFsdWVzXG4gICAgICAgICAgICAvLyBGbGF0dGVuIHNpbmdsZS1pdGVtIGFycmF5cyB0byBtYWludGFpbiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgICAgICAgICBjb25zdCBmbGF0dGVuZWRGaWVsZHMgPSB7fTtcbiAgICAgICAgICAgIGlmIChmaWVsZHMpIHtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZmllbGRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZmllbGRzLCBrZXkpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGZpZWxkc1trZXldO1xuICAgICAgICAgICAgICAgIGZsYXR0ZW5lZEZpZWxkc1trZXldID1cbiAgICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMSA/IHZhbHVlWzBdIDogdmFsdWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZmxhdHRlbmVkRmlsZXMgPSB7fTtcbiAgICAgICAgICAgIGlmIChmaWxlcykge1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBmaWxlcykge1xuICAgICAgICAgICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGZpbGVzLCBrZXkpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGZpbGVzW2tleV07XG4gICAgICAgICAgICAgICAgZmxhdHRlbmVkRmlsZXNba2V5XSA9XG4gICAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDEgPyB2YWx1ZVswXSA6IHZhbHVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFJldHVybiBmbGF0dGVuZWQgZmllbGRzIGFzIHRoZSBvYmplY3QgcGFyYW1ldGVyIHRvIG1hdGNoIFN1cGVyQWdlbnQncyBleHBlY3RlZCBmb3JtYXRcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGZsYXR0ZW5lZEZpZWxkcywgZmxhdHRlbmVkRmlsZXMpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGJ1ZmZlciA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKGlzQmluYXJ5KG1pbWUpKSB7XG4gICAgICAgIHBhcnNlciA9IGV4cG9ydHMucGFyc2UuaW1hZ2U7XG4gICAgICAgIGJ1ZmZlciA9IGJ1ZmZlciAhPT0gZmFsc2U7IC8vIEZvciBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBidWZmZXJpbmcgZGVmYXVsdCBpcyBhZC1ob2MgTUlNRS1kZXBlbmRlbnRcbiAgICAgIH0gZWxzZSBpZiAoZXhwb3J0cy5wYXJzZVttaW1lXSkge1xuICAgICAgICBwYXJzZXIgPSBleHBvcnRzLnBhcnNlW21pbWVdO1xuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgcGFyc2VyID0gZXhwb3J0cy5wYXJzZS50ZXh0O1xuICAgICAgICBidWZmZXIgPSBidWZmZXIgIT09IGZhbHNlO1xuICAgICAgICAvLyBldmVyeW9uZSB3YW50cyB0aGVpciBvd24gd2hpdGUtbGFiZWxlZCBqc29uXG4gICAgICB9IGVsc2UgaWYgKGlzSlNPTihtaW1lKSkge1xuICAgICAgICBwYXJzZXIgPSBleHBvcnRzLnBhcnNlWydhcHBsaWNhdGlvbi9qc29uJ107XG4gICAgICAgIGJ1ZmZlciA9IGJ1ZmZlciAhPT0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKGJ1ZmZlcikge1xuICAgICAgICBwYXJzZXIgPSBleHBvcnRzLnBhcnNlLnRleHQ7XG4gICAgICB9IGVsc2UgaWYgKHVuZGVmaW5lZCA9PT0gYnVmZmVyKSB7XG4gICAgICAgIHBhcnNlciA9IGV4cG9ydHMucGFyc2UuaW1hZ2U7IC8vIEl0J3MgYWN0dWFsbHkgYSBnZW5lcmljIEJ1ZmZlclxuICAgICAgICBidWZmZXIgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGJ5IGRlZmF1bHQgb25seSBidWZmZXIgdGV4dC8qLCBqc29uIGFuZCBtZXNzZWQgdXAgdGhpbmcgZnJvbSBoZWxsXG4gICAgaWYgKCh1bmRlZmluZWQgPT09IGJ1ZmZlciAmJiBpc1RleHQobWltZSkpIHx8IGlzSlNPTihtaW1lKSkge1xuICAgICAgYnVmZmVyID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB0aGlzLl9yZXNCdWZmZXJlZCA9IGJ1ZmZlcjtcbiAgICBsZXQgcGFyc2VySGFuZGxlc0VuZCA9IGZhbHNlO1xuICAgIGlmIChidWZmZXIpIHtcbiAgICAgIC8vIFByb3RlY3Rpb25hIGFnYWluc3QgemlwIGJvbWJzIGFuZCBvdGhlciBudWlzYW5jZVxuICAgICAgbGV0IHJlc3BvbnNlQnl0ZXNMZWZ0ID0gdGhpcy5fbWF4UmVzcG9uc2VTaXplIHx8IDIwMDAwMDAwMDtcbiAgICAgIHJlcy5vbignZGF0YScsIChidWYpID0+IHtcbiAgICAgICAgcmVzcG9uc2VCeXRlc0xlZnQgLT0gYnVmLmJ5dGVMZW5ndGggfHwgYnVmLmxlbmd0aCA+IDAgPyBidWYubGVuZ3RoIDogMDtcbiAgICAgICAgaWYgKHJlc3BvbnNlQnl0ZXNMZWZ0IDwgMCkge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdNYXhpbXVtIHJlc3BvbnNlIHNpemUgcmVhY2hlZCcpO1xuICAgICAgICAgIGVycm9yLmNvZGUgPSAnRVRPT0xBUkdFJztcbiAgICAgICAgICAvLyBQYXJzZXJzIGFyZW4ndCByZXF1aXJlZCB0byBvYnNlcnZlIGVycm9yIGV2ZW50LFxuICAgICAgICAgIC8vIHNvIHdvdWxkIGluY29ycmVjdGx5IHJlcG9ydCBzdWNjZXNzXG4gICAgICAgICAgcGFyc2VySGFuZGxlc0VuZCA9IGZhbHNlO1xuICAgICAgICAgIC8vIERlc3Ryb3kgd2l0aG91dCBhbiBlcnJvcjogSW5jb21pbmdNZXNzYWdlLmRlc3Ryb3koZXJyKSBlbWl0c1xuICAgICAgICAgIC8vICdlcnJvcicsIGFuZCB0aGUgcGFyc2VyIG1heSBhbHNvIGZhaWwsIGVhY2ggb2Ygd2hpY2ggd291bGRcbiAgICAgICAgICAvLyBjYWxsIGNhbGxiYWNrKCkgYWdhaW4gKFwic3VwZXJhZ2VudDogZG91YmxlIGNhbGxiYWNrIGJ1Z1wiKS5cbiAgICAgICAgICByZXMuZGVzdHJveSgpO1xuICAgICAgICAgIHRoaXMuY2FsbGJhY2soZXJyb3IsIG51bGwpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAocGFyc2VyKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBVbmJ1ZmZlcmVkIHBhcnNlcnMgYXJlIHN1cHBvc2VkIHRvIGVtaXQgcmVzcG9uc2UgZWFybHksXG4gICAgICAgIC8vIHdoaWNoIGlzIHdlaXJkIEJUVywgYmVjYXVzZSByZXNwb25zZS5ib2R5IHdvbid0IGJlIHRoZXJlLlxuICAgICAgICBwYXJzZXJIYW5kbGVzRW5kID0gYnVmZmVyO1xuXG4gICAgICAgIHBhcnNlcihyZXMsIChlcnJvciwgb2JqZWN0LCBmaWxlcykgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLnRpbWVkb3V0IHx8IHRoaXMuY2FsbGVkKSB7XG4gICAgICAgICAgICAvLyBUaW1lb3V0IG9yIG1heFJlc3BvbnNlU2l6ZSBoYXMgYWxyZWFkeSBoYW5kbGVkIGFsbCBjYWxsYmFja3NcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBJbnRlbnRpb25hbCAobm9uLXRpbWVvdXQpIGFib3J0IGlzIHN1cHBvc2VkIHRvIHByZXNlcnZlIHBhcnRpYWwgcmVzcG9uc2UsXG4gICAgICAgICAgLy8gZXZlbiBpZiBpdCBkb2Vzbid0IHBhcnNlLlxuICAgICAgICAgIGlmIChlcnJvciAmJiAhdGhpcy5fYWJvcnRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FsbGJhY2soZXJyb3IpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChwYXJzZXJIYW5kbGVzRW5kKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2VuZCcpO1xuICAgICAgICAgICAgdGhpcy5jYWxsYmFjayhudWxsLCB0aGlzLl9lbWl0UmVzcG9uc2Uob2JqZWN0LCBmaWxlcykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5jYWxsYmFjayhlcnIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5yZXMgPSByZXM7XG5cbiAgICAvLyB1bmJ1ZmZlcmVkXG4gICAgaWYgKCFidWZmZXIpIHtcbiAgICAgIGRlYnVnKCd1bmJ1ZmZlcmVkICVzICVzJywgdGhpcy5tZXRob2QsIHRoaXMudXJsKTtcbiAgICAgIHRoaXMuY2FsbGJhY2sobnVsbCwgdGhpcy5fZW1pdFJlc3BvbnNlKCkpO1xuICAgICAgaWYgKG11bHRpcGFydCkgcmV0dXJuOyAvLyBhbGxvdyBtdWx0aXBhcnQgdG8gaGFuZGxlIGVuZCBldmVudFxuICAgICAgcmVzLm9uY2UoJ2VuZCcsICgpID0+IHtcbiAgICAgICAgZGVidWcoJ2VuZCAlcyAlcycsIHRoaXMubWV0aG9kLCB0aGlzLnVybCk7XG4gICAgICAgIHRoaXMuZW1pdCgnZW5kJyk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjb21wbGV0ZUFib3J0ZWRSZXNwb25zZSA9ICgpID0+IHtcbiAgICAgIGlmICghdGhpcy5fYWJvcnRlZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHBhcnNlckhhbmRsZXNFbmQgPSBmYWxzZTtcbiAgICAgIGlmICghdGhpcy5jYWxsZWQpIHtcbiAgICAgICAgdGhpcy5lbWl0KCdlbmQnKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB0aGlzLl9lbWl0UmVzcG9uc2UoKTtcbiAgICAgICAgcmVzcG9uc2Uub24oJ2Vycm9yJywgbm9vcCk7XG4gICAgICAgIHRoaXMuY2FsbGJhY2sobnVsbCwgcmVzcG9uc2UpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuXG4gICAgLy8gdGVybWluYXRpbmcgZXZlbnRzXG4gICAgcmVzLm9uY2UoJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICBpZiAoY29tcGxldGVBYm9ydGVkUmVzcG9uc2UoKSkgcmV0dXJuO1xuICAgICAgcGFyc2VySGFuZGxlc0VuZCA9IGZhbHNlO1xuICAgICAgdGhpcy5jYWxsYmFjayhlcnJvciwgbnVsbCk7XG4gICAgfSk7XG4gICAgcmVzLm9uY2UoJ2Fib3J0ZWQnLCBjb21wbGV0ZUFib3J0ZWRSZXNwb25zZSk7XG4gICAgcmVzLm9uY2UoJ2Nsb3NlJywgY29tcGxldGVBYm9ydGVkUmVzcG9uc2UpO1xuICAgIGlmICghcGFyc2VySGFuZGxlc0VuZClcbiAgICAgIHJlcy5vbmNlKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgIGRlYnVnKCdlbmQgJXMgJXMnLCB0aGlzLm1ldGhvZCwgdGhpcy51cmwpO1xuICAgICAgICAvLyBUT0RPOiB1bmxlc3MgYnVmZmVyaW5nIGVtaXQgZWFybGllciB0byBzdHJlYW1cbiAgICAgICAgdGhpcy5lbWl0KCdlbmQnKTtcbiAgICAgICAgdGhpcy5jYWxsYmFjayhudWxsLCB0aGlzLl9lbWl0UmVzcG9uc2UoKSk7XG4gICAgICB9KTtcbiAgfSk7XG5cbiAgdGhpcy5lbWl0KCdyZXF1ZXN0JywgdGhpcyk7XG5cbiAgY29uc3QgZ2V0UHJvZ3Jlc3NNb25pdG9yID0gKCkgPT4ge1xuICAgIGNvbnN0IGxlbmd0aENvbXB1dGFibGUgPSB0cnVlO1xuICAgIGNvbnN0IHRvdGFsID0gcmVxLmdldEhlYWRlcignQ29udGVudC1MZW5ndGgnKTtcbiAgICBsZXQgbG9hZGVkID0gMDtcblxuICAgIGNvbnN0IHByb2dyZXNzID0gbmV3IFN0cmVhbS5UcmFuc2Zvcm0oKTtcbiAgICBwcm9ncmVzcy5fdHJhbnNmb3JtID0gKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spID0+IHtcbiAgICAgIGxvYWRlZCArPSBjaHVuay5sZW5ndGg7XG4gICAgICB0aGlzLmVtaXQoJ3Byb2dyZXNzJywge1xuICAgICAgICBkaXJlY3Rpb246ICd1cGxvYWQnLFxuICAgICAgICBsZW5ndGhDb21wdXRhYmxlLFxuICAgICAgICBsb2FkZWQsXG4gICAgICAgIHRvdGFsXG4gICAgICB9KTtcbiAgICAgIGNhbGxiYWNrKG51bGwsIGNodW5rKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHByb2dyZXNzO1xuICB9O1xuXG4gIGNvbnN0IGJ1ZmZlclRvQ2h1bmtzID0gKGJ1ZmZlcikgPT4ge1xuICAgIGNvbnN0IGNodW5rU2l6ZSA9IDE2ICogMTAyNDsgLy8gZGVmYXVsdCBoaWdoV2F0ZXJNYXJrIHZhbHVlXG4gICAgY29uc3QgY2h1bmtpbmcgPSBuZXcgU3RyZWFtLlJlYWRhYmxlKCk7XG4gICAgY29uc3QgdG90YWxMZW5ndGggPSBidWZmZXIubGVuZ3RoO1xuICAgIGNvbnN0IHJlbWFpbmRlciA9IHRvdGFsTGVuZ3RoICUgY2h1bmtTaXplO1xuICAgIGNvbnN0IGN1dG9mZiA9IHRvdGFsTGVuZ3RoIC0gcmVtYWluZGVyO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjdXRvZmY7IGkgKz0gY2h1bmtTaXplKSB7XG4gICAgICBjb25zdCBjaHVuayA9IGJ1ZmZlci5zbGljZShpLCBpICsgY2h1bmtTaXplKTtcbiAgICAgIGNodW5raW5nLnB1c2goY2h1bmspO1xuICAgIH1cblxuICAgIGlmIChyZW1haW5kZXIgPiAwKSB7XG4gICAgICBjb25zdCByZW1haW5kZXJCdWZmZXIgPSBidWZmZXIuc2xpY2UoLXJlbWFpbmRlcik7XG4gICAgICBjaHVua2luZy5wdXNoKHJlbWFpbmRlckJ1ZmZlcik7XG4gICAgfVxuXG4gICAgY2h1bmtpbmcucHVzaChudWxsKTsgLy8gbm8gbW9yZSBkYXRhXG5cbiAgICByZXR1cm4gY2h1bmtpbmc7XG4gIH07XG5cbiAgdHJ5IHtcbiAgICAvLyBpZiBhIEZvcm1EYXRhIGluc3RhbmNlIGdvdCBjcmVhdGVkLCB0aGVuIHdlIHNlbmQgdGhhdCBhcyB0aGUgcmVxdWVzdCBib2R5XG4gICAgY29uc3QgZm9ybURhdGEgPSB0aGlzLl9mb3JtRGF0YTtcbiAgICBpZiAoZm9ybURhdGEpIHtcbiAgICAgIC8vIHNldCBoZWFkZXJzXG4gICAgICBjb25zdCBoZWFkZXJzID0gZm9ybURhdGEuZ2V0SGVhZGVycygpO1xuICAgICAgZm9yIChjb25zdCBpIGluIGhlYWRlcnMpIHtcbiAgICAgICAgaWYgKGhhc093bihoZWFkZXJzLCBpKSkge1xuICAgICAgICAgIGRlYnVnKCdzZXR0aW5nIEZvcm1EYXRhIGhlYWRlcjogXCIlczogJXNcIicsIGksIGhlYWRlcnNbaV0pO1xuICAgICAgICAgIHJlcS5zZXRIZWFkZXIoaSwgaGVhZGVyc1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gYXR0ZW1wdCB0byBnZXQgXCJDb250ZW50LUxlbmd0aFwiIGhlYWRlclxuICAgICAgZm9ybURhdGEuZ2V0TGVuZ3RoKChlcnJvciwgbGVuZ3RoKSA9PiB7XG4gICAgICAgIC8vIFRPRE86IEFkZCBjaHVua2VkIGVuY29kaW5nIHdoZW4gbm8gbGVuZ3RoIChpZiBlcnIpXG4gICAgICAgIGlmIChlcnJvcikgZGVidWcoJ2Zvcm1EYXRhLmdldExlbmd0aCBoYWQgZXJyb3InLCBlcnJvciwgbGVuZ3RoKTtcblxuICAgICAgICBkZWJ1ZygnZ290IEZvcm1EYXRhIENvbnRlbnQtTGVuZ3RoOiAlcycsIGxlbmd0aCk7XG4gICAgICAgIGlmICh0eXBlb2YgbGVuZ3RoID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIHJlcS5zZXRIZWFkZXIoJ0NvbnRlbnQtTGVuZ3RoJywgbGVuZ3RoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcm1EYXRhLnBpcGUoZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpLnBpcGUocmVxKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoQnVmZmVyLmlzQnVmZmVyKGRhdGEpKSB7XG4gICAgICBidWZmZXJUb0NodW5rcyhkYXRhKS5waXBlKGdldFByb2dyZXNzTW9uaXRvcigpKS5waXBlKHJlcSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcS5lbmQoZGF0YSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aGlzLl9mYWlsUmVxdWVzdChlcnIpO1xuICB9XG59O1xuXG4vLyBDaGVjayB3aGV0aGVyIHJlc3BvbnNlIGhhcyBhIG5vbi0wLXNpemVkIGd6aXAtZW5jb2RlZCBib2R5XG5SZXF1ZXN0LnByb3RvdHlwZS5fc2hvdWxkRGVjb21wcmVzcyA9IChyZXMpID0+IHtcbiAgcmV0dXJuIChcbiAgICBoYXNOb25FbXB0eVJlc3BvbnNlQ29udGVudChyZXMpICYmXG4gICAgKGlzR3ppcE9yRGVmbGF0ZUVuY29kaW5nKHJlcykgfHwgaXNCcm90bGlFbmNvZGluZyhyZXMpKVxuICApO1xufTtcblxuLyoqXG4gKiBPdmVycmlkZXMgRE5TIGZvciBzZWxlY3RlZCBob3N0bmFtZXMuIFRha2VzIG9iamVjdCBtYXBwaW5nIGhvc3RuYW1lcyB0byBJUCBhZGRyZXNzZXMuXG4gKlxuICogV2hlbiBtYWtpbmcgYSByZXF1ZXN0IHRvIGEgVVJMIHdpdGggYSBob3N0bmFtZSBleGFjdGx5IG1hdGNoaW5nIGEga2V5IGluIHRoZSBvYmplY3QsXG4gKiB1c2UgdGhlIGdpdmVuIElQIGFkZHJlc3MgdG8gY29ubmVjdCwgaW5zdGVhZCBvZiB1c2luZyBETlMgdG8gcmVzb2x2ZSB0aGUgaG9zdG5hbWUuXG4gKlxuICogQSBzcGVjaWFsIGhvc3QgYCpgIG1hdGNoZXMgZXZlcnkgaG9zdG5hbWUgKGtlZXAgcmVkaXJlY3RzIGluIG1pbmQhKVxuICpcbiAqICAgICAgcmVxdWVzdC5jb25uZWN0KHtcbiAqICAgICAgICAndGVzdC5leGFtcGxlLmNvbSc6ICcxMjcuMC4wLjEnLFxuICogICAgICAgICdpcHY2LmV4YW1wbGUuY29tJzogJzo6MScsXG4gKiAgICAgIH0pXG4gKi9cblJlcXVlc3QucHJvdG90eXBlLmNvbm5lY3QgPSBmdW5jdGlvbiAoY29ubmVjdE92ZXJyaWRlKSB7XG4gIGlmICh0eXBlb2YgY29ubmVjdE92ZXJyaWRlID09PSAnc3RyaW5nJykge1xuICAgIHRoaXMuX2Nvbm5lY3RPdmVycmlkZSA9IHsgJyonOiBjb25uZWN0T3ZlcnJpZGUgfTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgY29ubmVjdE92ZXJyaWRlID09PSAnb2JqZWN0Jykge1xuICAgIHRoaXMuX2Nvbm5lY3RPdmVycmlkZSA9IGNvbm5lY3RPdmVycmlkZTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9jb25uZWN0T3ZlcnJpZGUgPSB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cblJlcXVlc3QucHJvdG90eXBlLnRydXN0TG9jYWxob3N0ID0gZnVuY3Rpb24gKHRvZ2dsZSkge1xuICB0aGlzLl90cnVzdExvY2FsaG9zdCA9IHRvZ2dsZSA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IHRvZ2dsZTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBnZW5lcmF0ZSBIVFRQIHZlcmIgbWV0aG9kc1xuaWYgKCFtZXRob2RzLmluY2x1ZGVzKCdkZWwnKSkge1xuICAvLyBjcmVhdGUgYSBjb3B5IHNvIHdlIGRvbid0IGNhdXNlIGNvbmZsaWN0cyB3aXRoXG4gIC8vIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBtZXRob2RzIHBhY2thZ2UgYW5kXG4gIC8vIG5wbSAzLnhcbiAgbWV0aG9kcyA9IFsuLi5tZXRob2RzXTtcbiAgbWV0aG9kcy5wdXNoKCdkZWwnKTtcbn1cblxuZm9yIChsZXQgbWV0aG9kIG9mIG1ldGhvZHMpIHtcbiAgY29uc3QgbmFtZSA9IG1ldGhvZDtcbiAgbWV0aG9kID0gbWV0aG9kID09PSAnZGVsJyA/ICdkZWxldGUnIDogbWV0aG9kO1xuXG4gIG1ldGhvZCA9IG1ldGhvZC50b1VwcGVyQ2FzZSgpO1xuICByZXF1ZXN0W25hbWVdID0gKHVybCwgZGF0YSwgZm4pID0+IHtcbiAgICBjb25zdCByZXF1ZXN0XyA9IHJlcXVlc3QobWV0aG9kLCB1cmwpO1xuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZm4gPSBkYXRhO1xuICAgICAgZGF0YSA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIGlmIChtZXRob2QgPT09ICdHRVQnIHx8IG1ldGhvZCA9PT0gJ0hFQUQnKSB7XG4gICAgICAgIHJlcXVlc3RfLnF1ZXJ5KGRhdGEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVxdWVzdF8uc2VuZChkYXRhKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZm4pIHJlcXVlc3RfLmVuZChmbik7XG4gICAgcmV0dXJuIHJlcXVlc3RfO1xuICB9O1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGBtaW1lYCBpcyB0ZXh0IGFuZCBzaG91bGQgYmUgYnVmZmVyZWQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1pbWVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGlzVGV4dChtaW1lKSB7XG4gIGNvbnN0IHBhcnRzID0gbWltZS5zcGxpdCgnLycpO1xuICBsZXQgdHlwZSA9IHBhcnRzWzBdO1xuICBpZiAodHlwZSkgdHlwZSA9IHR5cGUudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gIGxldCBzdWJ0eXBlID0gcGFydHNbMV07XG4gIGlmIChzdWJ0eXBlKSBzdWJ0eXBlID0gc3VidHlwZS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcblxuICByZXR1cm4gdHlwZSA9PT0gJ3RleHQnIHx8IHN1YnR5cGUgPT09ICd4LXd3dy1mb3JtLXVybGVuY29kZWQnO1xufVxuXG4vLyBUaGlzIGlzIG5vdCBhIGNhdGNoYWxsLCBidXQgYSBzdGFydC4gSXQgbWlnaHQgYmUgdXNlZnVsXG4vLyBpbiB0aGUgbG9uZyBydW4gdG8gaGF2ZSBmaWxlIHRoYXQgaW5jbHVkZXMgYWxsIGJpbmFyeVxuLy8gY29udGVudCB0eXBlcyBmcm9tIGh0dHBzOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL21lZGlhLXR5cGVzL21lZGlhLXR5cGVzLnhodG1sXG5mdW5jdGlvbiBpc0JpbmFyeShtaW1lKSB7XG4gIGxldCBbcmVnaXN0cnksIG5hbWVdID0gbWltZS5zcGxpdCgnLycpO1xuICBpZiAocmVnaXN0cnkpIHJlZ2lzdHJ5ID0gcmVnaXN0cnkudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gIGlmIChuYW1lKSBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgcmV0dXJuIChcbiAgICBbJ2F1ZGlvJywgJ2ZvbnQnLCAnaW1hZ2UnLCAndmlkZW8nXS5pbmNsdWRlcyhyZWdpc3RyeSkgfHxcbiAgICBbJ2d6JywgJ2d6aXAnXS5pbmNsdWRlcyhuYW1lKVxuICApO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGBtaW1lYCBpcyBqc29uIG9yIGhhcyAranNvbiBzdHJ1Y3R1cmVkIHN5bnRheCBzdWZmaXguXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1pbWVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBpc0pTT04obWltZSkge1xuICAvLyBzaG91bGQgbWF0Y2ggL2pzb24gb3IgK2pzb25cbiAgLy8gYnV0IG5vdCAvanNvbi1zZXFcbiAgcmV0dXJuIC9bLytdanNvbigkfFteLVxcd10pL2kudGVzdChtaW1lKTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB3ZSBzaG91bGQgZm9sbG93IHRoZSByZWRpcmVjdCBgY29kZWAuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IGNvZGVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBpc1JlZGlyZWN0KGNvZGUpIHtcbiAgcmV0dXJuIFszMDEsIDMwMiwgMzAzLCAzMDUsIDMwNywgMzA4XS5pbmNsdWRlcyhjb2RlKTtcbn1cblxuZnVuY3Rpb24gaGFzTm9uRW1wdHlSZXNwb25zZUNvbnRlbnQocmVzKSB7XG4gIGlmIChyZXMuc3RhdHVzQ29kZSA9PT0gMjA0IHx8IHJlcy5zdGF0dXNDb2RlID09PSAzMDQpIHtcbiAgICAvLyBUaGVzZSBhcmVuJ3Qgc3VwcG9zZWQgdG8gaGF2ZSBhbnkgYm9keVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIGhlYWRlciBjb250ZW50IGlzIGEgc3RyaW5nLCBhbmQgZGlzdGluY3Rpb24gYmV0d2VlbiAwIGFuZCBubyBpbmZvcm1hdGlvbiBpcyBjcnVjaWFsXG4gIGlmIChyZXMuaGVhZGVyc1snY29udGVudC1sZW5ndGgnXSA9PT0gJzAnKSB7XG4gICAgLy8gV2Uga25vdyB0aGF0IHRoZSBib2R5IGlzIGVtcHR5ICh1bmZvcnR1bmF0ZWx5LCB0aGlzIGNoZWNrIGRvZXMgbm90IGNvdmVyIGNodW5rZWQgZW5jb2RpbmcpXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG4iXSwibWFwcGluZ3MiOiI7O0FBQUE7QUFDQTtBQUNBOztBQUVBLE1BQU07RUFBRUE7QUFBTyxDQUFDLEdBQUdDLE9BQU8sQ0FBQyxVQUFVLENBQUM7QUFDdEMsTUFBTUMsTUFBTSxHQUFHRCxPQUFPLENBQUMsYUFBYSxDQUFDO0FBQ3JDLE1BQU1FLEtBQUssR0FBR0YsT0FBTyxDQUFDLFlBQVksQ0FBQztBQUNuQyxNQUFNRyxJQUFJLEdBQUdILE9BQU8sQ0FBQyxXQUFXLENBQUM7QUFDakMsTUFBTUksRUFBRSxHQUFHSixPQUFPLENBQUMsU0FBUyxDQUFDO0FBQzdCLE1BQU1LLElBQUksR0FBR0wsT0FBTyxDQUFDLFdBQVcsQ0FBQztBQUNqQyxNQUFNTSxJQUFJLEdBQUdOLE9BQU8sQ0FBQyxXQUFXLENBQUM7QUFDakMsTUFBTU8sRUFBRSxHQUFHUCxPQUFPLENBQUMsSUFBSSxDQUFDO0FBQ3hCLE1BQU1RLElBQUksR0FBR1IsT0FBTyxDQUFDLE1BQU0sQ0FBQztBQUM1QixJQUFJUyxPQUFPLEdBQUdULE9BQU8sQ0FBQyxTQUFTLENBQUM7QUFDaEMsTUFBTVUsUUFBUSxHQUFHVixPQUFPLENBQUMsV0FBVyxDQUFDO0FBQ3JDLE1BQU1XLFVBQVUsR0FBR1gsT0FBTyxDQUFDLFlBQVksQ0FBQztBQUN4QyxNQUFNWSxLQUFLLEdBQUdaLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxZQUFZLENBQUM7QUFDNUMsTUFBTWEsU0FBUyxHQUFHYixPQUFPLENBQUMsV0FBVyxDQUFDO0FBQ3RDLE1BQU1jLGFBQWEsR0FBR2QsT0FBTyxDQUFDLHFCQUFxQixDQUFDO0FBRXBELE1BQU1lLEtBQUssR0FBR2YsT0FBTyxDQUFDLFVBQVUsQ0FBQztBQUNqQyxNQUFNZ0IsV0FBVyxHQUFHaEIsT0FBTyxDQUFDLGlCQUFpQixDQUFDO0FBQzlDLE1BQU1pQixLQUFLLEdBQUdqQixPQUFPLENBQUMsZ0JBQWdCLENBQUM7QUFDdkMsTUFBTTtFQUFFa0I7QUFBVyxDQUFDLEdBQUdsQixPQUFPLENBQUMsU0FBUyxDQUFDO0FBQ3pDLE1BQU1tQixRQUFRLEdBQUduQixPQUFPLENBQUMsWUFBWSxDQUFDO0FBRXRDLE1BQU07RUFBRW9CLEtBQUs7RUFBRUMsTUFBTTtFQUFFQyxnQkFBZ0I7RUFBRUM7QUFBd0IsQ0FBQyxHQUFHUixLQUFLO0FBQzFFLE1BQU07RUFBRVM7QUFBbUIsQ0FBQyxHQUFHeEIsT0FBTyxDQUFDLGNBQWMsQ0FBQztBQUV0RCxTQUFTeUIsT0FBT0EsQ0FBQ0MsTUFBTSxFQUFFQyxHQUFHLEVBQUU7RUFDNUI7RUFDQSxJQUFJLE9BQU9BLEdBQUcsS0FBSyxVQUFVLEVBQUU7SUFDN0IsT0FBTyxJQUFJQyxPQUFPLENBQUNDLE9BQU8sQ0FBQyxLQUFLLEVBQUVILE1BQU0sQ0FBQyxDQUFDSSxHQUFHLENBQUNILEdBQUcsQ0FBQztFQUNwRDs7RUFFQTtFQUNBLElBQUlJLFNBQVMsQ0FBQ0MsTUFBTSxLQUFLLENBQUMsRUFBRTtJQUMxQixPQUFPLElBQUlKLE9BQU8sQ0FBQ0MsT0FBTyxDQUFDLEtBQUssRUFBRUgsTUFBTSxDQUFDO0VBQzNDO0VBRUEsT0FBTyxJQUFJRSxPQUFPLENBQUNDLE9BQU8sQ0FBQ0gsTUFBTSxFQUFFQyxHQUFHLENBQUM7QUFDekM7QUFFQU0sTUFBTSxDQUFDTCxPQUFPLEdBQUdILE9BQU87QUFDeEJHLE9BQU8sR0FBR0ssTUFBTSxDQUFDTCxPQUFPOztBQUV4QjtBQUNBO0FBQ0E7O0FBRUFBLE9BQU8sQ0FBQ0MsT0FBTyxHQUFHQSxPQUFPOztBQUV6QjtBQUNBO0FBQ0E7O0FBRUFELE9BQU8sQ0FBQ00sS0FBSyxHQUFHbEMsT0FBTyxDQUFDLFNBQVMsQ0FBQzs7QUFFbEM7QUFDQTtBQUNBOztBQUVBLFNBQVNtQyxJQUFJQSxDQUFBLEVBQUcsQ0FBQzs7QUFFakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0Msa0JBQWtCQSxDQUFDQyxRQUFRLEVBQUU7RUFDcEMsTUFBTTtJQUFFQztFQUFJLENBQUMsR0FBR0QsUUFBUTtFQUN4QixJQUFJLENBQUNDLEdBQUcsSUFBSUQsUUFBUSxDQUFDRSxnQkFBZ0IsRUFBRTtJQUNyQztFQUNGO0VBRUFGLFFBQVEsQ0FBQ0UsZ0JBQWdCLEdBQUcsSUFBSTtFQUVoQyxJQUFJO0lBQ0Y7SUFDQTtJQUNBO0lBQ0EsSUFBSUQsR0FBRyxDQUFDRSxPQUFPLElBQUksT0FBT0YsR0FBRyxDQUFDRSxPQUFPLENBQUNDLE9BQU8sS0FBSyxVQUFVLEVBQUU7TUFDNURILEdBQUcsQ0FBQ0UsT0FBTyxDQUFDQyxPQUFPLENBQUMsQ0FBQztJQUN2QjtJQUVBLElBQUlILEdBQUcsQ0FBQ0ksTUFBTSxJQUFJLE9BQU9KLEdBQUcsQ0FBQ0ksTUFBTSxDQUFDRCxPQUFPLEtBQUssVUFBVSxFQUFFO01BQzFESCxHQUFHLENBQUNJLE1BQU0sQ0FBQ0QsT0FBTyxDQUFDLENBQUM7SUFDdEI7SUFFQSxJQUFJLE9BQU9ILEdBQUcsQ0FBQ0csT0FBTyxLQUFLLFVBQVUsRUFBRTtNQUNyQ0gsR0FBRyxDQUFDRyxPQUFPLENBQUMsQ0FBQztNQUNiO0lBQ0Y7SUFFQSxJQUFJLE9BQU9ILEdBQUcsQ0FBQ0ssS0FBSyxLQUFLLFVBQVUsRUFBRTtNQUNuQ0wsR0FBRyxDQUFDSyxLQUFLLENBQUMsQ0FBQztNQUNYO0lBQ0Y7SUFFQSxJQUFJLE9BQU9MLEdBQUcsQ0FBQ1IsR0FBRyxLQUFLLFVBQVUsRUFBRTtNQUNqQ1EsR0FBRyxDQUFDUixHQUFHLENBQUMsQ0FBQztJQUNYO0VBQ0YsQ0FBQyxDQUFDLE9BQU9jLEdBQUcsRUFBRTtJQUNaaEMsS0FBSyxDQUFDLDZDQUE2QyxFQUFFZ0MsR0FBRyxDQUFDO0VBQzNEO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTQyxtQkFBbUJBLENBQUNDLFNBQVMsRUFBRTtFQUN0QyxNQUFNQyxLQUFLLEdBQUdELFNBQVMsQ0FBQ0UsS0FBSyxDQUMzQiwrQ0FDRixDQUFDO0VBQ0QsSUFBSSxDQUFDRCxLQUFLLEVBQUU7SUFDVixPQUFPO01BQ0xELFNBQVM7TUFDVEcsV0FBV0EsQ0FBQ0MsSUFBSSxFQUFFO1FBQ2hCLE9BQU9BLElBQUk7TUFDYjtJQUNGLENBQUM7RUFDSDtFQUVBLE1BQU1DLFFBQVEsR0FBRyxFQUFFO0VBQ25CLE1BQU1DLE1BQU0sR0FBRywyQkFBMkI7RUFDMUMsTUFBTUYsSUFBSSxHQUFHSCxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUNNLE9BQU8sQ0FDM0IsK0JBQStCLEVBQy9CLENBQUNDLENBQUMsRUFBRUMsT0FBTyxLQUFLO0lBQ2QsTUFBTUMsTUFBTSxHQUFHLEdBQUdKLE1BQU0sR0FBR0QsUUFBUSxDQUFDbkIsTUFBTSxJQUFJO0lBQzlDbUIsUUFBUSxDQUFDTSxJQUFJLENBQUNGLE9BQU8sQ0FBQztJQUN0QixPQUFPLElBQUlDLE1BQU0sRUFBRTtFQUNyQixDQUNGLENBQUM7RUFFRCxPQUFPO0lBQ0xWLFNBQVMsRUFBRSxHQUFHQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUdHLElBQUksR0FBR0gsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFO0lBQzFDRSxXQUFXQSxDQUFDUyxXQUFXLEVBQUU7TUFDdkIsSUFBSUMsWUFBWSxHQUFHRCxXQUFXO01BQzlCLEtBQUssTUFBTSxDQUFDRSxLQUFLLEVBQUVMLE9BQU8sQ0FBQyxJQUFJSixRQUFRLENBQUNVLE9BQU8sQ0FBQyxDQUFDLEVBQUU7UUFDakRGLFlBQVksR0FBR0EsWUFBWSxDQUFDTixPQUFPLENBQUMsR0FBR0QsTUFBTSxHQUFHUSxLQUFLLElBQUksRUFBRUwsT0FBTyxDQUFDO01BQ3JFO01BRUEsT0FBT0ksWUFBWTtJQUNyQjtFQUNGLENBQUM7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEvQixPQUFPLENBQUNULFFBQVEsR0FBR0EsUUFBUTs7QUFFM0I7QUFDQTtBQUNBOztBQUVBWCxJQUFJLENBQUNzRCxNQUFNLENBQ1Q7RUFDRSxtQ0FBbUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsV0FBVztBQUN6RSxDQUFDLEVBQ0QsSUFDRixDQUFDOztBQUVEO0FBQ0E7QUFDQTs7QUFFQWxDLE9BQU8sQ0FBQ21DLFNBQVMsR0FBRztFQUNsQixPQUFPLEVBQUU1RCxJQUFJO0VBQ2IsUUFBUSxFQUFFRCxLQUFLO0VBQ2YsUUFBUSxFQUFFZTtBQUNaLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQVcsT0FBTyxDQUFDb0MsU0FBUyxHQUFHO0VBQ2xCLG1DQUFtQ0MsQ0FBQ0MsTUFBTSxFQUFFO0lBQzFDLE9BQU8zRCxFQUFFLENBQUM0RCxTQUFTLENBQUNELE1BQU0sRUFBRTtNQUFFRSxPQUFPLEVBQUUsS0FBSztNQUFFQyxrQkFBa0IsRUFBRTtJQUFLLENBQUMsQ0FBQztFQUMzRSxDQUFDO0VBQ0Qsa0JBQWtCLEVBQUV2RCxhQUFhO0VBQ2pDO0VBQ0Esd0JBQXdCLEVBQUVBO0FBQzVCLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQWMsT0FBTyxDQUFDMEMsS0FBSyxHQUFHdEUsT0FBTyxDQUFDLFdBQVcsQ0FBQzs7QUFFcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E0QixPQUFPLENBQUMyQyxNQUFNLEdBQUcsQ0FBQyxDQUFDOztBQUVuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTQyxZQUFZQSxDQUFDbkMsUUFBUSxFQUFFO0VBQzlCQSxRQUFRLENBQUNvQyxPQUFPLEdBQUc7SUFDakI7RUFBQSxDQUNEO0VBQ0RwQyxRQUFRLENBQUNxQyxNQUFNLEdBQUc7SUFDaEI7RUFBQSxDQUNEO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsU0FBUzdDLE9BQU9BLENBQUNILE1BQU0sRUFBRUMsR0FBRyxFQUFFO0VBQzVCMUIsTUFBTSxDQUFDMEUsSUFBSSxDQUFDLElBQUksQ0FBQztFQUNqQixJQUFJLE9BQU9oRCxHQUFHLEtBQUssUUFBUSxFQUFFQSxHQUFHLEdBQUc1QixNQUFNLENBQUM0QixHQUFHLENBQUM7RUFDOUMsSUFBSSxDQUFDaUQsWUFBWSxHQUFHQyxPQUFPLENBQUNDLE9BQU8sQ0FBQ0MsR0FBRyxDQUFDQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0VBQ3JELElBQUksQ0FBQ0MsTUFBTSxHQUFHLEtBQUs7RUFDbkIsSUFBSSxDQUFDQyxTQUFTLEdBQUcsSUFBSTtFQUNyQixJQUFJLENBQUN4RCxNQUFNLEdBQUdBLE1BQU07RUFDcEIsSUFBSSxDQUFDQyxHQUFHLEdBQUdBLEdBQUc7RUFDZDZDLFlBQVksQ0FBQyxJQUFJLENBQUM7RUFDbEIsSUFBSSxDQUFDVyxRQUFRLEdBQUcsSUFBSTtFQUNwQixJQUFJLENBQUNDLFVBQVUsR0FBRyxDQUFDO0VBQ25CLElBQUksQ0FBQ0MsU0FBUyxDQUFDM0QsTUFBTSxLQUFLLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ3pDLElBQUksQ0FBQzRELE9BQU8sR0FBRyxFQUFFO0VBQ2pCLElBQUksQ0FBQy9FLEVBQUUsR0FBRyxDQUFDLENBQUM7RUFDWixJQUFJLENBQUNnRixNQUFNLEdBQUcsRUFBRTtFQUNoQixJQUFJLENBQUNDLEtBQUssR0FBRyxJQUFJLENBQUNELE1BQU0sQ0FBQyxDQUFDO0VBQzFCLElBQUksQ0FBQ0UsYUFBYSxHQUFHLEVBQUU7RUFDdkIsSUFBSSxDQUFDQyxjQUFjLEdBQUcsS0FBSztFQUMzQixJQUFJLENBQUNDLE9BQU8sR0FBR0MsU0FBUztFQUN4QixJQUFJLENBQUNDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDQyxZQUFZLENBQUNDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNoRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBekYsSUFBSSxDQUFDMEYsUUFBUSxDQUFDbkUsT0FBTyxFQUFFNUIsTUFBTSxDQUFDO0FBRTlCbUIsS0FBSyxDQUFDUyxPQUFPLENBQUNvRSxTQUFTLEVBQUVqRixXQUFXLENBQUNpRixTQUFTLENBQUM7O0FBRS9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBcEUsT0FBTyxDQUFDb0UsU0FBUyxDQUFDaEYsS0FBSyxHQUFHLFVBQVVpRixJQUFJLEVBQUU7RUFDeEMsSUFBSXRFLE9BQU8sQ0FBQ21DLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSzZCLFNBQVMsRUFBRTtJQUM3QyxNQUFNLElBQUlPLEtBQUssQ0FDYiw0REFDRixDQUFDO0VBQ0g7RUFFQSxJQUFJLENBQUN2QixZQUFZLEdBQUdzQixJQUFJLEtBQUtOLFNBQVMsR0FBRyxJQUFJLEdBQUdNLElBQUk7RUFDcEQsT0FBTyxJQUFJO0FBQ2IsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUFyRSxPQUFPLENBQUNvRSxTQUFTLENBQUNHLE1BQU0sR0FBRyxVQUFVQyxLQUFLLEVBQUVDLElBQUksRUFBRUMsT0FBTyxFQUFFO0VBQ3pELElBQUlELElBQUksRUFBRTtJQUNSLElBQUksSUFBSSxDQUFDRSxLQUFLLEVBQUU7TUFDZCxNQUFNLElBQUlMLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQztJQUMvRDtJQUVBLElBQUlNLENBQUMsR0FBR0YsT0FBTyxJQUFJLENBQUMsQ0FBQztJQUNyQixJQUFJLE9BQU9BLE9BQU8sS0FBSyxRQUFRLEVBQUU7TUFDL0JFLENBQUMsR0FBRztRQUFFQyxRQUFRLEVBQUVIO01BQVEsQ0FBQztJQUMzQjtJQUVBLElBQUksT0FBT0QsSUFBSSxLQUFLLFFBQVEsRUFBRTtNQUM1QixJQUFJLENBQUNHLENBQUMsQ0FBQ0MsUUFBUSxFQUFFRCxDQUFDLENBQUNDLFFBQVEsR0FBR0osSUFBSTtNQUNsQzFGLEtBQUssQ0FBQyxnREFBZ0QsRUFBRTBGLElBQUksQ0FBQztNQUM3REEsSUFBSSxHQUFHbEcsRUFBRSxDQUFDdUcsZ0JBQWdCLENBQUNMLElBQUksQ0FBQztNQUNoQ0EsSUFBSSxDQUFDTSxFQUFFLENBQUMsT0FBTyxFQUFHQyxLQUFLLElBQUs7UUFDMUIsTUFBTUMsUUFBUSxHQUFHLElBQUksQ0FBQ0MsWUFBWSxDQUFDLENBQUM7UUFDcENELFFBQVEsQ0FBQ0UsSUFBSSxDQUFDLE9BQU8sRUFBRUgsS0FBSyxDQUFDO01BQy9CLENBQUMsQ0FBQztJQUNKLENBQUMsTUFBTSxJQUFJLENBQUNKLENBQUMsQ0FBQ0MsUUFBUSxJQUFJSixJQUFJLENBQUNwRCxJQUFJLEVBQUU7TUFDbkN1RCxDQUFDLENBQUNDLFFBQVEsR0FBR0osSUFBSSxDQUFDcEQsSUFBSTtJQUN4QjtJQUVBLElBQUksQ0FBQzZELFlBQVksQ0FBQyxDQUFDLENBQUNFLE1BQU0sQ0FBQ1osS0FBSyxFQUFFQyxJQUFJLEVBQUVHLENBQUMsQ0FBQztFQUM1QztFQUVBLE9BQU8sSUFBSTtBQUNiLENBQUM7QUFFRDVFLE9BQU8sQ0FBQ29FLFNBQVMsQ0FBQ2MsWUFBWSxHQUFHLFlBQVk7RUFDM0MsSUFBSSxDQUFDLElBQUksQ0FBQzdCLFNBQVMsRUFBRTtJQUNuQixJQUFJLENBQUNBLFNBQVMsR0FBRyxJQUFJeEUsUUFBUSxDQUFDLENBQUM7SUFDL0IsSUFBSSxDQUFDd0UsU0FBUyxDQUFDMEIsRUFBRSxDQUFDLE9BQU8sRUFBR0MsS0FBSyxJQUFLO01BQ3BDakcsS0FBSyxDQUFDLGdCQUFnQixFQUFFaUcsS0FBSyxDQUFDO01BQzlCLElBQUksSUFBSSxDQUFDSyxNQUFNLEVBQUU7UUFDZjtRQUNBO1FBQ0E7TUFDRjtNQUVBLElBQUksQ0FBQ0MsUUFBUSxDQUFDTixLQUFLLENBQUM7TUFDcEIsSUFBSSxDQUFDbEUsS0FBSyxDQUFDLENBQUM7SUFDZCxDQUFDLENBQUM7RUFDSjtFQUVBLE9BQU8sSUFBSSxDQUFDdUMsU0FBUztBQUN2QixDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUFyRCxPQUFPLENBQUNvRSxTQUFTLENBQUMvRCxLQUFLLEdBQUcsVUFBVUEsS0FBSyxFQUFFO0VBQ3pDLElBQ0VILFNBQVMsQ0FBQ0MsTUFBTSxHQUFHLENBQUMsSUFDcEJFLEtBQUssSUFDTCxPQUFPQSxLQUFLLEtBQUssUUFBUSxJQUN6QixPQUFPQSxLQUFLLENBQUNrRixVQUFVLEtBQUssVUFBVSxFQUN0QztJQUNBLE1BQU0sSUFBSUMsU0FBUyxDQUNqQiw4RkFDRixDQUFDO0VBQ0g7RUFFQSxJQUFJdEYsU0FBUyxDQUFDQyxNQUFNLEtBQUssQ0FBQyxFQUFFLE9BQU8sSUFBSSxDQUFDaUQsTUFBTTtFQUM5QyxJQUFJLENBQUNBLE1BQU0sR0FBRy9DLEtBQUs7RUFDbkIsT0FBTyxJQUFJO0FBQ2IsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQUwsT0FBTyxDQUFDb0UsU0FBUyxDQUFDcUIsTUFBTSxHQUFHLFVBQVVBLE1BQU0sRUFBRTtFQUMzQyxJQUFJdkYsU0FBUyxDQUFDQyxNQUFNLEtBQUssQ0FBQyxFQUFFLE9BQU8sSUFBSSxDQUFDMkQsT0FBTztFQUMvQyxJQUFJLENBQUNBLE9BQU8sR0FBRzJCLE1BQU07RUFDckIsT0FBTyxJQUFJO0FBQ2IsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUF6RixPQUFPLENBQUNvRSxTQUFTLENBQUNzQixJQUFJLEdBQUcsVUFBVUEsSUFBSSxFQUFFO0VBQ3ZDLE9BQU8sSUFBSSxDQUFDQyxHQUFHLENBQ2IsY0FBYyxFQUNkRCxJQUFJLENBQUNFLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBR0YsSUFBSSxHQUFHL0csSUFBSSxDQUFDa0gsT0FBTyxDQUFDSCxJQUFJLENBQy9DLENBQUM7QUFDSCxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBMUYsT0FBTyxDQUFDb0UsU0FBUyxDQUFDMEIsTUFBTSxHQUFHLFVBQVVKLElBQUksRUFBRTtFQUN6QyxPQUFPLElBQUksQ0FBQ0MsR0FBRyxDQUFDLFFBQVEsRUFBRUQsSUFBSSxDQUFDRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUdGLElBQUksR0FBRy9HLElBQUksQ0FBQ2tILE9BQU8sQ0FBQ0gsSUFBSSxDQUFDLENBQUM7QUFDM0UsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTFGLE9BQU8sQ0FBQ29FLFNBQVMsQ0FBQzJCLEtBQUssR0FBRyxVQUFVQyxLQUFLLEVBQUU7RUFDekMsSUFBSSxPQUFPQSxLQUFLLEtBQUssUUFBUSxFQUFFO0lBQzdCLElBQUksQ0FBQ3RDLE1BQU0sQ0FBQzlCLElBQUksQ0FBQ29FLEtBQUssQ0FBQztFQUN6QixDQUFDLE1BQU07SUFDTEMsTUFBTSxDQUFDQyxNQUFNLENBQUMsSUFBSSxDQUFDeEgsRUFBRSxFQUFFc0gsS0FBSyxDQUFDO0VBQy9CO0VBRUEsT0FBTyxJQUFJO0FBQ2IsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBaEcsT0FBTyxDQUFDb0UsU0FBUyxDQUFDK0IsS0FBSyxHQUFHLFVBQVVDLElBQUksRUFBRUMsUUFBUSxFQUFFO0VBQ2xELE1BQU03RixRQUFRLEdBQUcsSUFBSSxDQUFDWixPQUFPLENBQUMsQ0FBQztFQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDaUUsY0FBYyxFQUFFO0lBQ3hCLElBQUksQ0FBQ0EsY0FBYyxHQUFHLElBQUk7RUFDNUI7RUFFQSxPQUFPckQsUUFBUSxDQUFDMkYsS0FBSyxDQUFDQyxJQUFJLEVBQUVDLFFBQVEsQ0FBQztBQUN2QyxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUFyRyxPQUFPLENBQUNvRSxTQUFTLENBQUNrQyxJQUFJLEdBQUcsVUFBVUMsTUFBTSxFQUFFN0IsT0FBTyxFQUFFO0VBQ2xELElBQUksQ0FBQzhCLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQztFQUNuQixJQUFJLENBQUM5RCxNQUFNLENBQUMsS0FBSyxDQUFDO0VBQ2xCLElBQUksQ0FBQ3pDLEdBQUcsQ0FBQyxDQUFDO0VBQ1YsT0FBTyxJQUFJLENBQUN3RyxhQUFhLENBQUNGLE1BQU0sRUFBRTdCLE9BQU8sQ0FBQztBQUM1QyxDQUFDO0FBRUQxRSxPQUFPLENBQUNvRSxTQUFTLENBQUNxQyxhQUFhLEdBQUcsVUFBVUYsTUFBTSxFQUFFN0IsT0FBTyxFQUFFO0VBQzNELElBQUksQ0FBQ2pFLEdBQUcsQ0FBQ3VELElBQUksQ0FBQyxVQUFVLEVBQUcwQyxHQUFHLElBQUs7SUFDakM7SUFDQSxJQUNFQyxVQUFVLENBQUNELEdBQUcsQ0FBQ0UsVUFBVSxDQUFDLElBQzFCLElBQUksQ0FBQ3JELFVBQVUsRUFBRSxLQUFLLElBQUksQ0FBQ3NELGFBQWEsRUFDeEM7TUFDQSxPQUFPLElBQUksQ0FBQ0MsU0FBUyxDQUFDSixHQUFHLENBQUMsS0FBSyxJQUFJLEdBQy9CLElBQUksQ0FBQ0QsYUFBYSxDQUFDRixNQUFNLEVBQUU3QixPQUFPLENBQUMsR0FDbkNYLFNBQVM7SUFDZjtJQUVBLElBQUksQ0FBQzJDLEdBQUcsR0FBR0EsR0FBRztJQUNkLElBQUksQ0FBQ0ssYUFBYSxDQUFDLENBQUM7SUFDcEIsSUFBSSxJQUFJLENBQUNDLFFBQVEsRUFBRTtJQUVuQixJQUFJLElBQUksQ0FBQ0MsaUJBQWlCLENBQUNQLEdBQUcsQ0FBQyxFQUFFO01BQy9CLE1BQU1RLFlBQVksR0FBR3ZILGtCQUFrQixDQUFDK0csR0FBRyxDQUFDO01BRTVDUSxZQUFZLENBQUNuQyxFQUFFLENBQUMsT0FBTyxFQUFHQyxLQUFLLElBQUs7UUFDbEMsSUFBSUEsS0FBSyxJQUFJQSxLQUFLLENBQUNtQyxJQUFJLEtBQUssYUFBYSxFQUFFO1VBQ3pDO1VBQ0FaLE1BQU0sQ0FBQ3BCLElBQUksQ0FBQyxLQUFLLENBQUM7VUFDbEI7UUFDRjtRQUVBb0IsTUFBTSxDQUFDcEIsSUFBSSxDQUFDLE9BQU8sRUFBRUgsS0FBSyxDQUFDO01BQzdCLENBQUMsQ0FBQztNQUNGMEIsR0FBRyxDQUFDSixJQUFJLENBQUNZLFlBQVksQ0FBQyxDQUFDWixJQUFJLENBQUNDLE1BQU0sRUFBRTdCLE9BQU8sQ0FBQztNQUM1QztNQUNBd0MsWUFBWSxDQUFDbEQsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQ21CLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsRCxDQUFDLE1BQU07TUFDTHVCLEdBQUcsQ0FBQ0osSUFBSSxDQUFDQyxNQUFNLEVBQUU3QixPQUFPLENBQUM7TUFDekJnQyxHQUFHLENBQUMxQyxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDbUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pDO0VBQ0YsQ0FBQyxDQUFDO0VBQ0YsT0FBT29CLE1BQU07QUFDZixDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBdkcsT0FBTyxDQUFDb0UsU0FBUyxDQUFDMUIsTUFBTSxHQUFHLFVBQVVzRCxLQUFLLEVBQUU7RUFDMUMsSUFBSSxDQUFDb0IsT0FBTyxHQUFHcEIsS0FBSyxLQUFLLEtBQUs7RUFDOUIsT0FBTyxJQUFJO0FBQ2IsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQWhHLE9BQU8sQ0FBQ29FLFNBQVMsQ0FBQzBDLFNBQVMsR0FBRyxVQUFVSixHQUFHLEVBQUU7RUFDM0MsSUFBSTVHLEdBQUcsR0FBRzRHLEdBQUcsQ0FBQ1csT0FBTyxDQUFDQyxRQUFRO0VBQzlCLElBQUksQ0FBQ3hILEdBQUcsRUFBRTtJQUNSLE9BQU8sSUFBSSxDQUFDd0YsUUFBUSxDQUFDLElBQUloQixLQUFLLENBQUMsaUNBQWlDLENBQUMsRUFBRW9DLEdBQUcsQ0FBQztFQUN6RTtFQUVBM0gsS0FBSyxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQ2UsR0FBRyxFQUFFQSxHQUFHLENBQUM7O0VBRXpDO0VBQ0FBLEdBQUcsR0FBRyxJQUFJeUgsR0FBRyxDQUFDekgsR0FBRyxFQUFFLElBQUksQ0FBQ0EsR0FBRyxDQUFDLENBQUMwSCxJQUFJOztFQUVqQztFQUNBO0VBQ0FkLEdBQUcsQ0FBQ2UsTUFBTSxDQUFDLENBQUM7RUFFWixJQUFJLENBQUNDLGdCQUFnQixDQUFDaEIsR0FBRyxDQUFDO0VBRTFCLElBQUlXLE9BQU8sR0FBRyxJQUFJLENBQUM1RyxHQUFHLENBQUNrSCxVQUFVLEdBQUcsSUFBSSxDQUFDbEgsR0FBRyxDQUFDa0gsVUFBVSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUNsSCxHQUFHLENBQUNtSCxRQUFRO0VBRTdFLE1BQU1DLGFBQWEsR0FBRyxJQUFJTixHQUFHLENBQUN6SCxHQUFHLENBQUMsQ0FBQ2dJLE1BQU0sS0FBSyxJQUFJUCxHQUFHLENBQUMsSUFBSSxDQUFDekgsR0FBRyxDQUFDLENBQUNnSSxNQUFNOztFQUV0RTtFQUNBLElBQUlwQixHQUFHLENBQUNFLFVBQVUsS0FBSyxHQUFHLElBQUlGLEdBQUcsQ0FBQ0UsVUFBVSxLQUFLLEdBQUcsRUFBRTtJQUNwRDtJQUNBO0lBQ0FTLE9BQU8sR0FBR25JLEtBQUssQ0FBQzZJLFdBQVcsQ0FBQ1YsT0FBTyxFQUFFUSxhQUFhLENBQUM7O0lBRW5EO0lBQ0EsSUFBSSxDQUFDaEksTUFBTSxHQUFHLElBQUksQ0FBQ0EsTUFBTSxLQUFLLE1BQU0sR0FBRyxNQUFNLEdBQUcsS0FBSzs7SUFFckQ7SUFDQSxJQUFJLENBQUM4RSxLQUFLLEdBQUcsSUFBSTtFQUNuQjs7RUFFQTtFQUNBLElBQUkrQixHQUFHLENBQUNFLFVBQVUsS0FBSyxHQUFHLEVBQUU7SUFDMUI7SUFDQTtJQUNBUyxPQUFPLEdBQUduSSxLQUFLLENBQUM2SSxXQUFXLENBQUNWLE9BQU8sRUFBRVEsYUFBYSxDQUFDOztJQUVuRDtJQUNBLElBQUksQ0FBQ2hJLE1BQU0sR0FBRyxLQUFLOztJQUVuQjtJQUNBLElBQUksQ0FBQzhFLEtBQUssR0FBRyxJQUFJO0VBQ25COztFQUVBO0VBQ0E7RUFDQSxJQUFJLENBQUMrQixHQUFHLENBQUNFLFVBQVUsS0FBSyxHQUFHLElBQUlGLEdBQUcsQ0FBQ0UsVUFBVSxLQUFLLEdBQUcsS0FBS2lCLGFBQWEsRUFBRTtJQUN2RSxPQUFPUixPQUFPLENBQUNXLGFBQWE7SUFDNUIsT0FBT1gsT0FBTyxDQUFDWSxNQUFNO0VBQ3ZCO0VBRUEsT0FBT1osT0FBTyxDQUFDYSxJQUFJO0VBRW5CLE9BQU8sSUFBSSxDQUFDekgsR0FBRztFQUNmLE9BQU8sSUFBSSxDQUFDNEMsU0FBUzs7RUFFckI7RUFDQVYsWUFBWSxDQUFDLElBQUksQ0FBQzs7RUFFbEI7RUFDQSxJQUFJLENBQUMrRCxHQUFHLEdBQUdBLEdBQUc7RUFDZCxJQUFJLENBQUN5QixVQUFVLEdBQUcsS0FBSztFQUN2QixJQUFJLENBQUNySSxHQUFHLEdBQUdBLEdBQUc7RUFDZCxJQUFJLENBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDO0VBQ1osSUFBSSxDQUFDZ0YsTUFBTSxDQUFDdkQsTUFBTSxHQUFHLENBQUM7RUFDdEIsSUFBSSxDQUFDd0YsR0FBRyxDQUFDMEIsT0FBTyxDQUFDO0VBQ2pCLElBQUksQ0FBQ2UsYUFBYSxDQUFDLENBQUM7RUFDcEIsSUFBSSxDQUFDeEUsYUFBYSxDQUFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQzlCLEdBQUcsQ0FBQztFQUNqQyxJQUFJLENBQUNHLEdBQUcsQ0FBQyxJQUFJLENBQUNvSSxTQUFTLENBQUM7RUFDeEIsT0FBTyxJQUFJO0FBQ2IsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQXJJLE9BQU8sQ0FBQ29FLFNBQVMsQ0FBQ2tFLElBQUksR0FBRyxVQUFVQyxJQUFJLEVBQUVDLElBQUksRUFBRTlELE9BQU8sRUFBRTtFQUN0RCxJQUFJeEUsU0FBUyxDQUFDQyxNQUFNLEtBQUssQ0FBQyxFQUFFcUksSUFBSSxHQUFHLEVBQUU7RUFDckMsSUFBSSxPQUFPQSxJQUFJLEtBQUssUUFBUSxJQUFJQSxJQUFJLEtBQUssSUFBSSxFQUFFO0lBQzdDO0lBQ0E5RCxPQUFPLEdBQUc4RCxJQUFJO0lBQ2RBLElBQUksR0FBRyxFQUFFO0VBQ1g7RUFFQSxJQUFJLENBQUM5RCxPQUFPLEVBQUU7SUFDWkEsT0FBTyxHQUFHO01BQUVnQixJQUFJLEVBQUU7SUFBUSxDQUFDO0VBQzdCO0VBRUEsTUFBTStDLE9BQU8sR0FBSUMsTUFBTSxJQUFLQyxNQUFNLENBQUNDLElBQUksQ0FBQ0YsTUFBTSxDQUFDLENBQUNHLFFBQVEsQ0FBQyxRQUFRLENBQUM7RUFFbEUsT0FBTyxJQUFJLENBQUNDLEtBQUssQ0FBQ1AsSUFBSSxFQUFFQyxJQUFJLEVBQUU5RCxPQUFPLEVBQUUrRCxPQUFPLENBQUM7QUFDakQsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQXpJLE9BQU8sQ0FBQ29FLFNBQVMsQ0FBQzJFLEVBQUUsR0FBRyxVQUFVQyxJQUFJLEVBQUU7RUFDckMsSUFBSSxDQUFDQyxHQUFHLEdBQUdELElBQUk7RUFDZixPQUFPLElBQUk7QUFDYixDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBaEosT0FBTyxDQUFDb0UsU0FBUyxDQUFDOEUsR0FBRyxHQUFHLFVBQVVGLElBQUksRUFBRTtFQUN0QyxJQUFJLENBQUNHLElBQUksR0FBR0gsSUFBSTtFQUNoQixPQUFPLElBQUk7QUFDYixDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBaEosT0FBTyxDQUFDb0UsU0FBUyxDQUFDZ0YsR0FBRyxHQUFHLFVBQVVKLElBQUksRUFBRTtFQUN0QyxJQUFJLE9BQU9BLElBQUksS0FBSyxRQUFRLElBQUksQ0FBQ0wsTUFBTSxDQUFDVSxRQUFRLENBQUNMLElBQUksQ0FBQyxFQUFFO0lBQ3RELElBQUksQ0FBQ00sSUFBSSxHQUFHTixJQUFJLENBQUNJLEdBQUc7SUFDcEIsSUFBSSxDQUFDRyxXQUFXLEdBQUdQLElBQUksQ0FBQ1EsVUFBVTtFQUNwQyxDQUFDLE1BQU07SUFDTCxJQUFJLENBQUNGLElBQUksR0FBR04sSUFBSTtFQUNsQjtFQUVBLE9BQU8sSUFBSTtBQUNiLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUFoSixPQUFPLENBQUNvRSxTQUFTLENBQUM0RSxJQUFJLEdBQUcsVUFBVUEsSUFBSSxFQUFFO0VBQ3ZDLElBQUksQ0FBQ1MsS0FBSyxHQUFHVCxJQUFJO0VBQ2pCLE9BQU8sSUFBSTtBQUNiLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUFoSixPQUFPLENBQUNvRSxTQUFTLENBQUNzRixlQUFlLEdBQUcsWUFBWTtFQUM5QyxJQUFJLENBQUNDLGdCQUFnQixHQUFHLElBQUk7RUFDNUIsT0FBTyxJQUFJO0FBQ2IsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTNKLE9BQU8sQ0FBQ29FLFNBQVMsQ0FBQ3hFLE9BQU8sR0FBRyxZQUFZO0VBQ3RDLElBQUksSUFBSSxDQUFDYSxHQUFHLEVBQUUsT0FBTyxJQUFJLENBQUNBLEdBQUc7RUFFN0IsTUFBTWlFLE9BQU8sR0FBRyxDQUFDLENBQUM7RUFFbEIsSUFBSTtJQUNGLE1BQU1xQixLQUFLLEdBQUdySCxFQUFFLENBQUM0RCxTQUFTLENBQUMsSUFBSSxDQUFDNUQsRUFBRSxFQUFFO01BQ2xDNkQsT0FBTyxFQUFFLEtBQUs7TUFDZEMsa0JBQWtCLEVBQUU7SUFDdEIsQ0FBQyxDQUFDO0lBQ0YsSUFBSXVELEtBQUssRUFBRTtNQUNULElBQUksQ0FBQ3JILEVBQUUsR0FBRyxDQUFDLENBQUM7TUFDWixJQUFJLENBQUNnRixNQUFNLENBQUM5QixJQUFJLENBQUNtRSxLQUFLLENBQUM7SUFDekI7SUFFQSxJQUFJLENBQUM2RCxvQkFBb0IsQ0FBQyxDQUFDO0VBQzdCLENBQUMsQ0FBQyxPQUFPN0ksR0FBRyxFQUFFO0lBQ1osT0FBTyxJQUFJLENBQUNvRSxJQUFJLENBQUMsT0FBTyxFQUFFcEUsR0FBRyxDQUFDO0VBQ2hDO0VBRUEsSUFBSTtJQUFFakIsR0FBRyxFQUFFbUI7RUFBVSxDQUFDLEdBQUcsSUFBSTtFQUM3QixNQUFNNEksT0FBTyxHQUFHLElBQUksQ0FBQ0MsUUFBUTs7RUFFN0I7RUFDQSxJQUFJN0ksU0FBUyxDQUFDOEksT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRTlJLFNBQVMsR0FBRyxVQUFVQSxTQUFTLEVBQUU7RUFDdEUsTUFBTStJLFlBQVksR0FBR2hKLG1CQUFtQixDQUFDQyxTQUFTLENBQUM7RUFDbkQsTUFBTW5CLEdBQUcsR0FBRyxJQUFJeUgsR0FBRyxDQUFDeUMsWUFBWSxDQUFDL0ksU0FBUyxDQUFDO0VBQzNDLElBQUk7SUFBRWdKO0VBQVMsQ0FBQyxHQUFHbkssR0FBRztFQUN0QixNQUFNdUIsSUFBSSxHQUFHMkksWUFBWSxDQUFDNUksV0FBVyxDQUFDLEdBQUd0QixHQUFHLENBQUNvSyxRQUFRLEdBQUdwSyxHQUFHLENBQUNxSyxNQUFNLEVBQUUsQ0FBQzs7RUFFckU7RUFDQSxJQUFJLGdCQUFnQixDQUFDQyxJQUFJLENBQUNILFFBQVEsQ0FBQyxLQUFLLElBQUksRUFBRTtJQUM1QztJQUNBQSxRQUFRLEdBQUcsR0FBR0EsUUFBUSxDQUFDSSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUc7SUFFdkMsSUFBSSxDQUFDdkssR0FBRyxDQUFDd0ssUUFBUSxFQUFFO01BQ2pCLE1BQU0sSUFBSWhHLEtBQUssQ0FDYixzRkFDRixDQUFDO0lBQ0g7O0lBRUE7SUFDQUksT0FBTyxDQUFDNkYsVUFBVSxHQUFHekssR0FBRyxDQUFDd0ssUUFBUSxDQUFDOUksT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUM7SUFDdEQxQixHQUFHLENBQUNvSSxJQUFJLEdBQUcsRUFBRTtJQUNicEksR0FBRyxDQUFDd0ssUUFBUSxHQUFHLEVBQUU7RUFDbkI7O0VBRUE7RUFDQSxJQUFJLElBQUksQ0FBQ0UsZ0JBQWdCLEVBQUU7SUFDekIsTUFBTTtNQUFFRjtJQUFTLENBQUMsR0FBR3hLLEdBQUc7SUFDeEIsTUFBTXFCLEtBQUssR0FDVG1KLFFBQVEsSUFBSSxJQUFJLENBQUNFLGdCQUFnQixHQUM3QixJQUFJLENBQUNBLGdCQUFnQixDQUFDRixRQUFRLENBQUMsR0FDL0IsSUFBSSxDQUFDRSxnQkFBZ0IsQ0FBQyxHQUFHLENBQUM7SUFDaEMsSUFBSXJKLEtBQUssRUFBRTtNQUNUO01BQ0EsSUFBSSxDQUFDLElBQUksQ0FBQ3lCLE9BQU8sQ0FBQ3NGLElBQUksRUFBRTtRQUN0QixJQUFJLENBQUN2QyxHQUFHLENBQUMsTUFBTSxFQUFFN0YsR0FBRyxDQUFDb0ksSUFBSSxDQUFDO01BQzVCO01BRUEsSUFBSXVDLE9BQU87TUFDWCxJQUFJQyxPQUFPO01BRVgsSUFBSSxPQUFPdkosS0FBSyxLQUFLLFFBQVEsRUFBRTtRQUM3QnNKLE9BQU8sR0FBR3RKLEtBQUssQ0FBQytHLElBQUk7UUFDcEJ3QyxPQUFPLEdBQUd2SixLQUFLLENBQUN3SixJQUFJO01BQ3RCLENBQUMsTUFBTTtRQUNMRixPQUFPLEdBQUd0SixLQUFLO1FBQ2Z1SixPQUFPLEdBQUc1SyxHQUFHLENBQUM2SyxJQUFJO01BQ3BCOztNQUVBO01BQ0E3SyxHQUFHLENBQUNvSSxJQUFJLEdBQUcsR0FBRyxDQUFDa0MsSUFBSSxDQUFDSyxPQUFPLENBQUMsR0FBRyxJQUFJQSxPQUFPLEdBQUcsR0FBR0EsT0FBTztNQUN2RCxJQUFJQyxPQUFPLEVBQUU7UUFDWDVLLEdBQUcsQ0FBQ29JLElBQUksSUFBSSxJQUFJd0MsT0FBTyxFQUFFO1FBQ3pCNUssR0FBRyxDQUFDNkssSUFBSSxHQUFHRCxPQUFPO01BQ3BCO01BRUE1SyxHQUFHLENBQUN3SyxRQUFRLEdBQUdHLE9BQU87SUFDeEI7RUFDRjs7RUFFQTtFQUNBL0YsT0FBTyxDQUFDN0UsTUFBTSxHQUFHLElBQUksQ0FBQ0EsTUFBTTtFQUM1QjZFLE9BQU8sQ0FBQ2lHLElBQUksR0FBRzdLLEdBQUcsQ0FBQzZLLElBQUk7RUFDdkJqRyxPQUFPLENBQUNyRCxJQUFJLEdBQUdBLElBQUk7RUFDbkJxRCxPQUFPLENBQUN3RCxJQUFJLEdBQUdoSixLQUFLLENBQUMwTCxpQkFBaUIsQ0FBQzlLLEdBQUcsQ0FBQ3dLLFFBQVEsQ0FBQyxDQUFDLENBQUM7RUFDdEQ7RUFDQTtFQUNBO0VBQ0E7RUFDQSxJQUFJLENBQUMsSUFBSSxDQUFDdkgsWUFBWSxFQUFFO0lBQ3RCMkIsT0FBTyxDQUFDMkMsT0FBTyxHQUFHO01BQUUsR0FBRyxJQUFJLENBQUN4RTtJQUFPLENBQUM7RUFDdEM7RUFFQTZCLE9BQU8sQ0FBQ3FFLEVBQUUsR0FBRyxJQUFJLENBQUNFLEdBQUc7RUFDckJ2RSxPQUFPLENBQUN3RSxHQUFHLEdBQUcsSUFBSSxDQUFDQyxJQUFJO0VBQ3ZCekUsT0FBTyxDQUFDMEUsR0FBRyxHQUFHLElBQUksQ0FBQ0UsSUFBSTtFQUN2QjVFLE9BQU8sQ0FBQ3NFLElBQUksR0FBRyxJQUFJLENBQUNTLEtBQUs7RUFDekIvRSxPQUFPLENBQUM4RSxVQUFVLEdBQUcsSUFBSSxDQUFDRCxXQUFXO0VBQ3JDN0UsT0FBTyxDQUFDckUsS0FBSyxHQUFHLElBQUksQ0FBQytDLE1BQU07RUFDM0JzQixPQUFPLENBQUNlLE1BQU0sR0FBRyxJQUFJLENBQUMzQixPQUFPO0VBQzdCWSxPQUFPLENBQUNtRyxrQkFBa0IsR0FDeEIsT0FBTyxJQUFJLENBQUNsQixnQkFBZ0IsS0FBSyxTQUFTLEdBQ3RDLENBQUMsSUFBSSxDQUFDQSxnQkFBZ0IsR0FDdEIxRyxPQUFPLENBQUNDLEdBQUcsQ0FBQzRILDRCQUE0QixLQUFLLEdBQUc7O0VBRXREO0VBQ0EsSUFBSSxJQUFJLENBQUNsSSxPQUFPLENBQUNzRixJQUFJLEVBQUU7SUFDckJ4RCxPQUFPLENBQUNxRyxVQUFVLEdBQUcsSUFBSSxDQUFDbkksT0FBTyxDQUFDc0YsSUFBSSxDQUFDMUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7RUFDN0Q7RUFFQSxJQUNFLElBQUksQ0FBQ3dKLGVBQWUsSUFDcEIsMkNBQTJDLENBQUNaLElBQUksQ0FBQ3RLLEdBQUcsQ0FBQ3dLLFFBQVEsQ0FBQyxFQUM5RDtJQUNBNUYsT0FBTyxDQUFDbUcsa0JBQWtCLEdBQUcsS0FBSztFQUNwQzs7RUFFQTtFQUNBLE1BQU1JLE9BQU8sR0FBRyxJQUFJLENBQUNsSSxZQUFZLEdBQzdCaEQsT0FBTyxDQUFDbUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDZ0osV0FBVyxDQUFDakIsUUFBUSxDQUFDLEdBQ2pEbEssT0FBTyxDQUFDbUMsU0FBUyxDQUFDK0gsUUFBUSxDQUFDOztFQUUvQjtFQUNBLElBQUksQ0FBQ3hKLEdBQUcsR0FBR3dLLE9BQU8sQ0FBQ3JMLE9BQU8sQ0FBQzhFLE9BQU8sQ0FBQztFQUNuQyxNQUFNO0lBQUVqRTtFQUFJLENBQUMsR0FBRyxJQUFJOztFQUVwQjtFQUNBO0VBQ0FBLEdBQUcsQ0FBQ3NFLEVBQUUsQ0FBQyxPQUFPLEVBQUdDLEtBQUssSUFBSztJQUN6QjtJQUNBO0lBQ0E7SUFDQSxJQUFJLElBQUksQ0FBQ2dDLFFBQVEsSUFBSSxJQUFJLENBQUN0RyxnQkFBZ0IsRUFBRTtJQUM1QztJQUNBO0lBQ0EsSUFBSSxJQUFJLENBQUNvSixRQUFRLEtBQUtELE9BQU8sRUFBRTtJQUMvQjtJQUNBO0lBQ0EsSUFBSSxJQUFJLENBQUNzQixRQUFRLEVBQUU7SUFDbkIsSUFBSSxDQUFDN0YsUUFBUSxDQUFDTixLQUFLLENBQUM7RUFDdEIsQ0FBQyxDQUFDO0VBRUYsSUFBSTtJQUNGO0lBQ0F2RSxHQUFHLENBQUMySyxVQUFVLENBQUMsSUFBSSxDQUFDO0lBRXBCLElBQUkxRyxPQUFPLENBQUM3RSxNQUFNLEtBQUssTUFBTSxFQUFFO01BQzdCWSxHQUFHLENBQUM0SyxTQUFTLENBQUMsaUJBQWlCLEVBQUUsZUFBZSxDQUFDO0lBQ25EO0lBRUEsSUFBSSxDQUFDcEIsUUFBUSxHQUFHQSxRQUFRO0lBQ3hCLElBQUksQ0FBQy9CLElBQUksR0FBR3BJLEdBQUcsQ0FBQ29JLElBQUk7O0lBRXBCO0lBQ0EsTUFBTW9ELFNBQVMsR0FBR0EsQ0FBQSxLQUFNO01BQ3RCLElBQUksQ0FBQ25HLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDcEIsQ0FBQztJQUVEMUUsR0FBRyxDQUFDc0UsRUFBRSxDQUFDLE9BQU8sRUFBRXVHLFNBQVMsQ0FBQztJQUMxQjdLLEdBQUcsQ0FBQ3VELElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTTtNQUN0QnZELEdBQUcsQ0FBQzhLLGNBQWMsQ0FBQyxPQUFPLEVBQUVELFNBQVMsQ0FBQztJQUN4QyxDQUFDLENBQUM7O0lBRUY7SUFDQSxJQUFJeEwsR0FBRyxDQUFDMEwsUUFBUSxJQUFJMUwsR0FBRyxDQUFDMkwsUUFBUSxFQUFFO01BQ2hDLElBQUksQ0FBQ25ELElBQUksQ0FBQ3hJLEdBQUcsQ0FBQzBMLFFBQVEsRUFBRTFMLEdBQUcsQ0FBQzJMLFFBQVEsQ0FBQztJQUN2QztJQUVBLElBQUksSUFBSSxDQUFDRCxRQUFRLElBQUksSUFBSSxDQUFDQyxRQUFRLEVBQUU7TUFDbEMsSUFBSSxDQUFDbkQsSUFBSSxDQUFDLElBQUksQ0FBQ2tELFFBQVEsRUFBRSxJQUFJLENBQUNDLFFBQVEsQ0FBQztJQUN6QztJQUVBLEtBQUssTUFBTXZDLEdBQUcsSUFBSSxJQUFJLENBQUNyRyxNQUFNLEVBQUU7TUFDN0IsSUFBSXJELE1BQU0sQ0FBQyxJQUFJLENBQUNxRCxNQUFNLEVBQUVxRyxHQUFHLENBQUMsRUFBRXpJLEdBQUcsQ0FBQzRLLFNBQVMsQ0FBQ25DLEdBQUcsRUFBRSxJQUFJLENBQUNyRyxNQUFNLENBQUNxRyxHQUFHLENBQUMsQ0FBQztJQUNwRTs7SUFFQTtJQUNBLElBQUksSUFBSSxDQUFDekYsT0FBTyxFQUFFO01BQ2hCLElBQUlqRSxNQUFNLENBQUMsSUFBSSxDQUFDb0QsT0FBTyxFQUFFLFFBQVEsQ0FBQyxFQUFFO1FBQ2xDO1FBQ0EsTUFBTThJLFlBQVksR0FBRyxJQUFJMU0sU0FBUyxDQUFDQSxTQUFTLENBQUMsQ0FBQztRQUM5QzBNLFlBQVksQ0FBQ0MsVUFBVSxDQUFDLElBQUksQ0FBQy9JLE9BQU8sQ0FBQ3FGLE1BQU0sQ0FBQ29DLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4RHFCLFlBQVksQ0FBQ0MsVUFBVSxDQUFDLElBQUksQ0FBQ2xJLE9BQU8sQ0FBQzRHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqRDVKLEdBQUcsQ0FBQzRLLFNBQVMsQ0FDWCxRQUFRLEVBQ1JLLFlBQVksQ0FDVEUsVUFBVSxDQUFDNU0sU0FBUyxDQUFDNk0sZ0JBQWdCLENBQUNDLEdBQUcsQ0FBQyxDQUMxQ0MsYUFBYSxDQUFDLENBQ25CLENBQUM7TUFDSCxDQUFDLE1BQU07UUFDTHRMLEdBQUcsQ0FBQzRLLFNBQVMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDNUgsT0FBTyxDQUFDO01BQ3ZDO0lBQ0Y7SUFFQSxPQUFPaEQsR0FBRztFQUNaLENBQUMsQ0FBQyxPQUFPTSxHQUFHLEVBQUU7SUFDWlIsa0JBQWtCLENBQUMsSUFBSSxDQUFDO0lBQ3hCLE1BQU1RLEdBQUc7RUFDWDtBQUNGLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBZixPQUFPLENBQUNvRSxTQUFTLENBQUM0SCxlQUFlLEdBQUcsWUFBWTtFQUM5Q3pMLGtCQUFrQixDQUFDLElBQUksQ0FBQztBQUMxQixDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBUCxPQUFPLENBQUNvRSxTQUFTLENBQUM2SCxZQUFZLEdBQUcsVUFBVWpILEtBQUssRUFBRTtFQUNoRCxJQUFJLENBQUNnSCxlQUFlLENBQUMsQ0FBQztFQUN0QixJQUFJLE9BQU8sSUFBSSxDQUFDM0QsU0FBUyxLQUFLLFVBQVUsSUFBSSxJQUFJLENBQUNBLFNBQVMsS0FBSy9ILElBQUksRUFBRTtJQUNuRSxJQUFJLENBQUNnRixRQUFRLENBQUNOLEtBQUssQ0FBQztJQUNwQjtFQUNGO0VBRUEsTUFBTUEsS0FBSztBQUNiLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQWhGLE9BQU8sQ0FBQ29FLFNBQVMsQ0FBQ2tCLFFBQVEsR0FBRyxVQUFVTixLQUFLLEVBQUUwQixHQUFHLEVBQUU7RUFDakQsSUFBSSxJQUFJLENBQUN3RixZQUFZLENBQUNsSCxLQUFLLEVBQUUwQixHQUFHLENBQUMsRUFBRTtJQUNqQyxPQUFPLElBQUksQ0FBQ3lGLE1BQU0sQ0FBQyxDQUFDO0VBQ3RCOztFQUVBO0VBQ0EsTUFBTUMsRUFBRSxHQUFHLElBQUksQ0FBQy9ELFNBQVMsSUFBSS9ILElBQUk7RUFDakMsSUFBSSxDQUFDMkQsWUFBWSxDQUFDLENBQUM7RUFDbkIsSUFBSSxJQUFJLENBQUNvQixNQUFNLEVBQUU7SUFDZixJQUFJLElBQUksQ0FBQ2dILFFBQVEsRUFBRTtJQUNuQixPQUFPQyxPQUFPLENBQUNDLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQztFQUN4RDtFQUVBLElBQUksQ0FBQ2xILE1BQU0sR0FBRyxJQUFJO0VBRWxCLElBQUksQ0FBQ0wsS0FBSyxFQUFFO0lBQ1YsSUFBSTtNQUNGLElBQUksQ0FBQyxJQUFJLENBQUN3SCxhQUFhLENBQUM5RixHQUFHLENBQUMsRUFBRTtRQUM1QixJQUFJK0YsT0FBTyxHQUFHLDRCQUE0QjtRQUMxQyxJQUFJL0YsR0FBRyxFQUFFO1VBQ1ArRixPQUFPLEdBQUduTyxJQUFJLENBQUNvTyxZQUFZLENBQUNoRyxHQUFHLENBQUNpRyxNQUFNLENBQUMsSUFBSUYsT0FBTztRQUNwRDtRQUVBekgsS0FBSyxHQUFHLElBQUlWLEtBQUssQ0FBQ21JLE9BQU8sQ0FBQztRQUMxQnpILEtBQUssQ0FBQzJILE1BQU0sR0FBR2pHLEdBQUcsR0FBR0EsR0FBRyxDQUFDaUcsTUFBTSxHQUFHNUksU0FBUztNQUM3QztJQUNGLENBQUMsQ0FBQyxPQUFPaEQsR0FBRyxFQUFFO01BQ1ppRSxLQUFLLEdBQUdqRSxHQUFHO01BQ1hpRSxLQUFLLENBQUMySCxNQUFNLEdBQUczSCxLQUFLLENBQUMySCxNQUFNLEtBQUtqRyxHQUFHLEdBQUdBLEdBQUcsQ0FBQ2lHLE1BQU0sR0FBRzVJLFNBQVMsQ0FBQztJQUMvRDtFQUNGOztFQUVBO0VBQ0E7RUFDQSxJQUFJLENBQUNpQixLQUFLLEVBQUU7SUFDVixPQUFPb0gsRUFBRSxDQUFDLElBQUksRUFBRTFGLEdBQUcsQ0FBQztFQUN0QjtFQUVBMUIsS0FBSyxDQUFDbUcsUUFBUSxHQUFHekUsR0FBRztFQUNwQixJQUFJLElBQUksQ0FBQ2tHLFdBQVcsRUFBRTVILEtBQUssQ0FBQzZFLE9BQU8sR0FBRyxJQUFJLENBQUNDLFFBQVEsR0FBRyxDQUFDOztFQUV2RDtFQUNBO0VBQ0EsSUFBSTlFLEtBQUssSUFBSSxJQUFJLENBQUM2SCxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMxTSxNQUFNLEdBQUcsQ0FBQyxFQUFFO0lBQy9DLElBQUksQ0FBQ2dGLElBQUksQ0FBQyxPQUFPLEVBQUVILEtBQUssQ0FBQztFQUMzQjtFQUVBb0gsRUFBRSxDQUFDcEgsS0FBSyxFQUFFMEIsR0FBRyxDQUFDO0FBQ2hCLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTFHLE9BQU8sQ0FBQ29FLFNBQVMsQ0FBQzBJLE9BQU8sR0FBRyxVQUFVekssTUFBTSxFQUFFO0VBQzVDLE9BQ0VzRyxNQUFNLENBQUNVLFFBQVEsQ0FBQ2hILE1BQU0sQ0FBQyxJQUN2QkEsTUFBTSxZQUFZakUsTUFBTSxJQUN4QmlFLE1BQU0sWUFBWXhELFFBQVE7QUFFOUIsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBbUIsT0FBTyxDQUFDb0UsU0FBUyxDQUFDMkMsYUFBYSxHQUFHLFVBQVVnRyxJQUFJLEVBQUVDLEtBQUssRUFBRTtFQUN2RCxNQUFNN0IsUUFBUSxHQUFHLElBQUk3TCxRQUFRLENBQUMsSUFBSSxDQUFDO0VBQ25DLElBQUksQ0FBQzZMLFFBQVEsR0FBR0EsUUFBUTtFQUN4QkEsUUFBUSxDQUFDM0gsU0FBUyxHQUFHLElBQUksQ0FBQ0ksYUFBYTtFQUN2QyxJQUFJRyxTQUFTLEtBQUtnSixJQUFJLEVBQUU7SUFDdEI1QixRQUFRLENBQUM0QixJQUFJLEdBQUdBLElBQUk7RUFDdEI7RUFFQTVCLFFBQVEsQ0FBQzZCLEtBQUssR0FBR0EsS0FBSztFQUN0QixJQUFJLElBQUksQ0FBQzdFLFVBQVUsRUFBRTtJQUNuQmdELFFBQVEsQ0FBQzdFLElBQUksR0FBRyxZQUFZO01BQzFCLE1BQU0sSUFBSWhDLEtBQUssQ0FDYixpRUFDRixDQUFDO0lBQ0gsQ0FBQztFQUNIO0VBRUEsSUFBSSxDQUFDYSxJQUFJLENBQUMsVUFBVSxFQUFFZ0csUUFBUSxDQUFDO0VBQy9CLE9BQU9BLFFBQVE7QUFDakIsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBbkwsT0FBTyxDQUFDb0UsU0FBUyxDQUFDZ0UsYUFBYSxHQUFHLFlBQVk7RUFDNUMsTUFBTStDLFFBQVEsR0FBRyxJQUFJN0wsUUFBUSxDQUFDLElBQUksQ0FBQztFQUNuQzZMLFFBQVEsQ0FBQzNILFNBQVMsR0FBRyxJQUFJLENBQUNJLGFBQWE7RUFDdkMsSUFBSSxDQUFDdUIsSUFBSSxDQUFDLFVBQVUsRUFBRWdHLFFBQVEsQ0FBQztBQUNqQyxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQW5MLE9BQU8sQ0FBQ29FLFNBQVMsQ0FBQ3NELGdCQUFnQixHQUFHLFVBQVVoQixHQUFHLEVBQUU7RUFDbEQsSUFBSSxDQUFDQSxHQUFHLEdBQUdBLEdBQUc7RUFDZCxNQUFNeUUsUUFBUSxHQUFHLElBQUk3TCxRQUFRLENBQUMsSUFBSSxDQUFDO0VBQ25DNkwsUUFBUSxDQUFDM0gsU0FBUyxHQUFHLElBQUksQ0FBQ0ksYUFBYTtFQUN2QyxJQUFJLENBQUN1QixJQUFJLENBQUMsY0FBYyxFQUFFZ0csUUFBUSxDQUFDO0FBQ3JDLENBQUM7QUFFRG5MLE9BQU8sQ0FBQ29FLFNBQVMsQ0FBQ25FLEdBQUcsR0FBRyxVQUFVbU0sRUFBRSxFQUFFO0VBQ3BDLElBQUk7SUFDRixJQUFJLENBQUN4TSxPQUFPLENBQUMsQ0FBQztFQUNoQixDQUFDLENBQUMsT0FBT21CLEdBQUcsRUFBRTtJQUNaLElBQUksQ0FBQ29ILFVBQVUsR0FBRyxJQUFJO0lBQ3RCLElBQUksT0FBT2lFLEVBQUUsS0FBSyxVQUFVLEVBQUU7TUFDNUIsSUFBSSxDQUFDL0QsU0FBUyxHQUFHK0QsRUFBRTtNQUNuQixJQUFJLENBQUM5RyxRQUFRLENBQUN2RSxHQUFHLENBQUM7TUFDbEI7SUFDRjtJQUVBLE1BQU1BLEdBQUc7RUFDWDtFQUVBaEMsS0FBSyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUNjLE1BQU0sRUFBRSxJQUFJLENBQUNDLEdBQUcsQ0FBQztFQUVyQyxJQUFJLElBQUksQ0FBQ3FJLFVBQVUsRUFBRTtJQUNuQixNQUFNLElBQUk3RCxLQUFLLENBQ2IsOERBQ0YsQ0FBQztFQUNIO0VBRUEsSUFBSSxDQUFDNkQsVUFBVSxHQUFHLElBQUk7O0VBRXRCO0VBQ0EsSUFBSSxDQUFDRSxTQUFTLEdBQUcrRCxFQUFFLElBQUk5TCxJQUFJO0VBRTNCLElBQUksQ0FBQzJNLElBQUksQ0FBQyxDQUFDO0FBQ2IsQ0FBQztBQUVEak4sT0FBTyxDQUFDb0UsU0FBUyxDQUFDNkksSUFBSSxHQUFHLFlBQVk7RUFDbkMsSUFBSSxJQUFJLENBQUNqRyxRQUFRLEVBQ2YsT0FBTyxJQUFJLENBQUMxQixRQUFRLENBQ2xCLElBQUloQixLQUFLLENBQUMsNERBQTRELENBQ3hFLENBQUM7RUFFSCxJQUFJOEIsSUFBSSxHQUFHLElBQUksQ0FBQ3pCLEtBQUs7RUFDckIsTUFBTTtJQUFFbEU7RUFBSSxDQUFDLEdBQUcsSUFBSTtFQUNwQixNQUFNO0lBQUVaO0VBQU8sQ0FBQyxHQUFHLElBQUk7RUFFdkIsSUFBSSxDQUFDcU4sWUFBWSxDQUFDLENBQUM7O0VBRW5CO0VBQ0EsSUFBSXJOLE1BQU0sS0FBSyxNQUFNLElBQUksQ0FBQ1ksR0FBRyxDQUFDME0sV0FBVyxFQUFFO0lBQ3pDLElBQUk7TUFDRjtNQUNBLElBQUksT0FBTy9HLElBQUksS0FBSyxRQUFRLEVBQUU7UUFDNUIsSUFBSWdILFdBQVcsR0FBRzNNLEdBQUcsQ0FBQzRNLFNBQVMsQ0FBQyxjQUFjLENBQUM7UUFDL0M7UUFDQSxJQUFJRCxXQUFXLEVBQUVBLFdBQVcsR0FBR0EsV0FBVyxDQUFDL0MsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4RCxJQUFJbEksU0FBUyxHQUFHLElBQUksQ0FBQ21MLFdBQVcsSUFBSXZOLE9BQU8sQ0FBQ29DLFNBQVMsQ0FBQ2lMLFdBQVcsQ0FBQztRQUNsRSxJQUFJLENBQUNqTCxTQUFTLElBQUlvTCxNQUFNLENBQUNILFdBQVcsQ0FBQyxFQUFFO1VBQ3JDakwsU0FBUyxHQUFHcEMsT0FBTyxDQUFDb0MsU0FBUyxDQUFDLGtCQUFrQixDQUFDO1FBQ25EO1FBRUEsSUFBSUEsU0FBUyxFQUFFaUUsSUFBSSxHQUFHakUsU0FBUyxDQUFDaUUsSUFBSSxDQUFDO01BQ3ZDOztNQUVBO01BQ0EsSUFBSUEsSUFBSSxJQUFJLENBQUMzRixHQUFHLENBQUM0TSxTQUFTLENBQUMsZ0JBQWdCLENBQUMsRUFBRTtRQUM1QzVNLEdBQUcsQ0FBQzRLLFNBQVMsQ0FDWCxnQkFBZ0IsRUFDaEIxQyxNQUFNLENBQUNVLFFBQVEsQ0FBQ2pELElBQUksQ0FBQyxHQUFHQSxJQUFJLENBQUNqRyxNQUFNLEdBQUd3SSxNQUFNLENBQUM2RSxVQUFVLENBQUNwSCxJQUFJLENBQzlELENBQUM7TUFDSDtJQUNGLENBQUMsQ0FBQyxPQUFPckYsR0FBRyxFQUFFO01BQ1osT0FBTyxJQUFJLENBQUNrTCxZQUFZLENBQUNsTCxHQUFHLENBQUM7SUFDL0I7RUFDRjs7RUFFQTtFQUNBO0VBQ0FOLEdBQUcsQ0FBQ3VELElBQUksQ0FBQyxVQUFVLEVBQUcwQyxHQUFHLElBQUs7SUFDNUIzSCxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQ2MsTUFBTSxFQUFFLElBQUksQ0FBQ0MsR0FBRyxFQUFFNEcsR0FBRyxDQUFDRSxVQUFVLENBQUM7SUFFM0QsSUFBSSxJQUFJLENBQUM2RyxxQkFBcUIsRUFBRTtNQUM5QnhKLFlBQVksQ0FBQyxJQUFJLENBQUN3SixxQkFBcUIsQ0FBQztJQUMxQztJQUVBLElBQUksSUFBSSxDQUFDakgsS0FBSyxFQUFFO01BQ2Q7SUFDRjtJQUVBLE1BQU1rSCxHQUFHLEdBQUcsSUFBSSxDQUFDN0csYUFBYTtJQUM5QixNQUFNbEksSUFBSSxHQUFHTyxLQUFLLENBQUN3RyxJQUFJLENBQUNnQixHQUFHLENBQUNXLE9BQU8sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxZQUFZO0lBQzFFLElBQUkzQixJQUFJLEdBQUcvRyxJQUFJLENBQUMwTCxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdCLElBQUkzRSxJQUFJLEVBQUVBLElBQUksR0FBR0EsSUFBSSxDQUFDaUksV0FBVyxDQUFDLENBQUMsQ0FBQ0MsSUFBSSxDQUFDLENBQUM7SUFDMUMsTUFBTUMsU0FBUyxHQUFHbkksSUFBSSxLQUFLLFdBQVc7SUFDdEMsTUFBTW9JLFFBQVEsR0FBR25ILFVBQVUsQ0FBQ0QsR0FBRyxDQUFDRSxVQUFVLENBQUM7SUFDM0MsTUFBTW1ILFlBQVksR0FBRyxJQUFJLENBQUNDLGFBQWE7SUFFdkMsSUFBSSxDQUFDdEgsR0FBRyxHQUFHQSxHQUFHOztJQUVkO0lBQ0EsSUFBSW9ILFFBQVEsSUFBSSxJQUFJLENBQUN2SyxVQUFVLEVBQUUsS0FBS21LLEdBQUcsRUFBRTtNQUN6QyxPQUFPLElBQUksQ0FBQzVHLFNBQVMsQ0FBQ0osR0FBRyxDQUFDO0lBQzVCO0lBRUEsSUFBSSxJQUFJLENBQUM3RyxNQUFNLEtBQUssTUFBTSxFQUFFO01BQzFCLElBQUksQ0FBQ3NGLElBQUksQ0FBQyxLQUFLLENBQUM7TUFDaEIsSUFBSSxDQUFDRyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQ3lCLGFBQWEsQ0FBQyxDQUFDLENBQUM7TUFDekM7SUFDRjs7SUFFQTtJQUNBLElBQUksSUFBSSxDQUFDRSxpQkFBaUIsQ0FBQ1AsR0FBRyxDQUFDLEVBQUU7TUFDL0JySCxVQUFVLENBQUNvQixHQUFHLEVBQUVpRyxHQUFHLENBQUM7SUFDdEI7SUFFQSxJQUFJaEUsTUFBTSxHQUFHLElBQUksQ0FBQzBFLE9BQU87SUFDekIsSUFBSTFFLE1BQU0sS0FBS3FCLFNBQVMsSUFBSXBGLElBQUksSUFBSW9CLE9BQU8sQ0FBQzJDLE1BQU0sRUFBRTtNQUNsREEsTUFBTSxHQUFHTSxPQUFPLENBQUNqRCxPQUFPLENBQUMyQyxNQUFNLENBQUMvRCxJQUFJLENBQUMsQ0FBQztJQUN4QztJQUVBLElBQUlzUCxNQUFNLEdBQUcsSUFBSSxDQUFDQyxPQUFPO0lBQ3pCLElBQUluSyxTQUFTLEtBQUtyQixNQUFNLElBQUl1TCxNQUFNLEVBQUU7TUFDbEMzQixPQUFPLENBQUNDLElBQUksQ0FDViwwTEFDRixDQUFDO01BQ0Q3SixNQUFNLEdBQUcsSUFBSTtJQUNmO0lBRUEsSUFBSSxDQUFDdUwsTUFBTSxFQUFFO01BQ1gsSUFBSUYsWUFBWSxFQUFFO1FBQ2hCRSxNQUFNLEdBQUdsTyxPQUFPLENBQUMwQyxLQUFLLENBQUMwTCxLQUFLLENBQUMsQ0FBQztRQUM5QnpMLE1BQU0sR0FBRyxJQUFJO01BQ2YsQ0FBQyxNQUFNLElBQUltTCxTQUFTLEVBQUU7UUFDcEIsTUFBTU8sSUFBSSxHQUFHdFAsVUFBVSxDQUFDQSxVQUFVLENBQUMsQ0FBQztRQUNwQ21QLE1BQU0sR0FBR0EsQ0FBQ3ZILEdBQUcsRUFBRXBCLFFBQVEsS0FBSztVQUMxQjtVQUNBLE1BQU0rSSxZQUFZLEdBQUcsSUFBSWpRLE1BQU0sQ0FBQ2tRLFdBQVcsQ0FBQyxDQUFDOztVQUU3QztVQUNBRCxZQUFZLENBQUN4TyxNQUFNLEdBQUcsSUFBSSxDQUFDQSxNQUFNLElBQUksTUFBTTtVQUMzQ3dPLFlBQVksQ0FBQ3ZPLEdBQUcsR0FBRyxJQUFJLENBQUNBLEdBQUcsSUFBSSxHQUFHO1VBQ2xDdU8sWUFBWSxDQUFDRSxXQUFXLEdBQUc3SCxHQUFHLENBQUM2SCxXQUFXLElBQUksS0FBSztVQUNuREYsWUFBWSxDQUFDaEgsT0FBTyxHQUFHWCxHQUFHLENBQUNXLE9BQU8sSUFBSSxDQUFDLENBQUM7VUFDeENnSCxZQUFZLENBQUN4TixNQUFNLEdBQUc2RixHQUFHLENBQUM3RixNQUFNLElBQUk7WUFBRTJOLFFBQVEsRUFBRTtVQUFLLENBQUM7O1VBRXREO1VBQ0E5SCxHQUFHLENBQUNKLElBQUksQ0FBQytILFlBQVksQ0FBQztVQUV0QkQsSUFBSSxDQUFDM0wsS0FBSyxDQUFDNEwsWUFBWSxFQUFFLENBQUN0TixHQUFHLEVBQUUwTixNQUFNLEVBQUV6QixLQUFLLEtBQUs7WUFDL0MsSUFBSWpNLEdBQUcsRUFBRSxPQUFPdUUsUUFBUSxDQUFDdkUsR0FBRyxDQUFDOztZQUU3QjtZQUNBO1lBQ0EsTUFBTTJOLGVBQWUsR0FBRyxDQUFDLENBQUM7WUFDMUIsSUFBSUQsTUFBTSxFQUFFO2NBQ1YsS0FBSyxNQUFNdkYsR0FBRyxJQUFJdUYsTUFBTSxFQUFFO2dCQUN4QixJQUFJLENBQUN4SSxNQUFNLENBQUM3QixTQUFTLENBQUN1SyxjQUFjLENBQUM3TCxJQUFJLENBQUMyTCxNQUFNLEVBQUV2RixHQUFHLENBQUMsRUFBRTtnQkFDeEQsTUFBTWxELEtBQUssR0FBR3lJLE1BQU0sQ0FBQ3ZGLEdBQUcsQ0FBQztnQkFDekJ3RixlQUFlLENBQUN4RixHQUFHLENBQUMsR0FDbEIwRixLQUFLLENBQUNDLE9BQU8sQ0FBQzdJLEtBQUssQ0FBQyxJQUFJQSxLQUFLLENBQUM3RixNQUFNLEtBQUssQ0FBQyxHQUFHNkYsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHQSxLQUFLO2NBQ2pFO1lBQ0Y7WUFFQSxNQUFNOEksY0FBYyxHQUFHLENBQUMsQ0FBQztZQUN6QixJQUFJOUIsS0FBSyxFQUFFO2NBQ1QsS0FBSyxNQUFNOUQsR0FBRyxJQUFJOEQsS0FBSyxFQUFFO2dCQUN2QixJQUFJLENBQUMvRyxNQUFNLENBQUM3QixTQUFTLENBQUN1SyxjQUFjLENBQUM3TCxJQUFJLENBQUNrSyxLQUFLLEVBQUU5RCxHQUFHLENBQUMsRUFBRTtnQkFDdkQsTUFBTWxELEtBQUssR0FBR2dILEtBQUssQ0FBQzlELEdBQUcsQ0FBQztnQkFDeEI0RixjQUFjLENBQUM1RixHQUFHLENBQUMsR0FDakIwRixLQUFLLENBQUNDLE9BQU8sQ0FBQzdJLEtBQUssQ0FBQyxJQUFJQSxLQUFLLENBQUM3RixNQUFNLEtBQUssQ0FBQyxHQUFHNkYsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHQSxLQUFLO2NBQ2pFO1lBQ0Y7O1lBRUE7WUFDQVYsUUFBUSxDQUFDLElBQUksRUFBRW9KLGVBQWUsRUFBRUksY0FBYyxDQUFDO1VBQ2pELENBQUMsQ0FBQztRQUNKLENBQUM7UUFFRHBNLE1BQU0sR0FBRyxJQUFJO01BQ2YsQ0FBQyxNQUFNLElBQUlxTSxRQUFRLENBQUNwUSxJQUFJLENBQUMsRUFBRTtRQUN6QnNQLE1BQU0sR0FBR2xPLE9BQU8sQ0FBQzBDLEtBQUssQ0FBQzBMLEtBQUs7UUFDNUJ6TCxNQUFNLEdBQUdBLE1BQU0sS0FBSyxLQUFLLENBQUMsQ0FBQztNQUM3QixDQUFDLE1BQU0sSUFBSTNDLE9BQU8sQ0FBQzBDLEtBQUssQ0FBQzlELElBQUksQ0FBQyxFQUFFO1FBQzlCc1AsTUFBTSxHQUFHbE8sT0FBTyxDQUFDMEMsS0FBSyxDQUFDOUQsSUFBSSxDQUFDO01BQzlCLENBQUMsTUFBTSxJQUFJK0csSUFBSSxLQUFLLE1BQU0sRUFBRTtRQUMxQnVJLE1BQU0sR0FBR2xPLE9BQU8sQ0FBQzBDLEtBQUssQ0FBQ3VNLElBQUk7UUFDM0J0TSxNQUFNLEdBQUdBLE1BQU0sS0FBSyxLQUFLO1FBQ3pCO01BQ0YsQ0FBQyxNQUFNLElBQUk2SyxNQUFNLENBQUM1TyxJQUFJLENBQUMsRUFBRTtRQUN2QnNQLE1BQU0sR0FBR2xPLE9BQU8sQ0FBQzBDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQztRQUMxQ0MsTUFBTSxHQUFHQSxNQUFNLEtBQUssS0FBSztNQUMzQixDQUFDLE1BQU0sSUFBSUEsTUFBTSxFQUFFO1FBQ2pCdUwsTUFBTSxHQUFHbE8sT0FBTyxDQUFDMEMsS0FBSyxDQUFDdU0sSUFBSTtNQUM3QixDQUFDLE1BQU0sSUFBSWpMLFNBQVMsS0FBS3JCLE1BQU0sRUFBRTtRQUMvQnVMLE1BQU0sR0FBR2xPLE9BQU8sQ0FBQzBDLEtBQUssQ0FBQzBMLEtBQUssQ0FBQyxDQUFDO1FBQzlCekwsTUFBTSxHQUFHLElBQUk7TUFDZjtJQUNGOztJQUVBO0lBQ0EsSUFBS3FCLFNBQVMsS0FBS3JCLE1BQU0sSUFBSXVNLE1BQU0sQ0FBQ3RRLElBQUksQ0FBQyxJQUFLNE8sTUFBTSxDQUFDNU8sSUFBSSxDQUFDLEVBQUU7TUFDMUQrRCxNQUFNLEdBQUcsSUFBSTtJQUNmO0lBRUEsSUFBSSxDQUFDd00sWUFBWSxHQUFHeE0sTUFBTTtJQUMxQixJQUFJeU0sZ0JBQWdCLEdBQUcsS0FBSztJQUM1QixJQUFJek0sTUFBTSxFQUFFO01BQ1Y7TUFDQSxJQUFJME0saUJBQWlCLEdBQUcsSUFBSSxDQUFDQyxnQkFBZ0IsSUFBSSxTQUFTO01BQzFEM0ksR0FBRyxDQUFDM0IsRUFBRSxDQUFDLE1BQU0sRUFBR3VLLEdBQUcsSUFBSztRQUN0QkYsaUJBQWlCLElBQUlFLEdBQUcsQ0FBQzlCLFVBQVUsSUFBSThCLEdBQUcsQ0FBQ25QLE1BQU0sR0FBRyxDQUFDLEdBQUdtUCxHQUFHLENBQUNuUCxNQUFNLEdBQUcsQ0FBQztRQUN0RSxJQUFJaVAsaUJBQWlCLEdBQUcsQ0FBQyxFQUFFO1VBQ3pCLE1BQU1wSyxLQUFLLEdBQUcsSUFBSVYsS0FBSyxDQUFDLCtCQUErQixDQUFDO1VBQ3hEVSxLQUFLLENBQUNtQyxJQUFJLEdBQUcsV0FBVztVQUN4QjtVQUNBO1VBQ0FnSSxnQkFBZ0IsR0FBRyxLQUFLO1VBQ3hCO1VBQ0E7VUFDQTtVQUNBekksR0FBRyxDQUFDOUYsT0FBTyxDQUFDLENBQUM7VUFDYixJQUFJLENBQUMwRSxRQUFRLENBQUNOLEtBQUssRUFBRSxJQUFJLENBQUM7UUFDNUI7TUFDRixDQUFDLENBQUM7SUFDSjtJQUVBLElBQUlpSixNQUFNLEVBQUU7TUFDVixJQUFJO1FBQ0Y7UUFDQTtRQUNBa0IsZ0JBQWdCLEdBQUd6TSxNQUFNO1FBRXpCdUwsTUFBTSxDQUFDdkgsR0FBRyxFQUFFLENBQUMxQixLQUFLLEVBQUUzQyxNQUFNLEVBQUUySyxLQUFLLEtBQUs7VUFDcEMsSUFBSSxJQUFJLENBQUNYLFFBQVEsSUFBSSxJQUFJLENBQUNoSCxNQUFNLEVBQUU7WUFDaEM7WUFDQTtVQUNGOztVQUVBO1VBQ0E7VUFDQSxJQUFJTCxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUNnQyxRQUFRLEVBQUU7WUFDM0IsT0FBTyxJQUFJLENBQUMxQixRQUFRLENBQUNOLEtBQUssQ0FBQztVQUM3QjtVQUVBLElBQUltSyxnQkFBZ0IsRUFBRTtZQUNwQixJQUFJLENBQUNoSyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQ2hCLElBQUksQ0FBQ0csUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUN5QixhQUFhLENBQUMxRSxNQUFNLEVBQUUySyxLQUFLLENBQUMsQ0FBQztVQUN4RDtRQUNGLENBQUMsQ0FBQztNQUNKLENBQUMsQ0FBQyxPQUFPak0sR0FBRyxFQUFFO1FBQ1osSUFBSSxDQUFDdUUsUUFBUSxDQUFDdkUsR0FBRyxDQUFDO1FBQ2xCO01BQ0Y7SUFDRjtJQUVBLElBQUksQ0FBQzJGLEdBQUcsR0FBR0EsR0FBRzs7SUFFZDtJQUNBLElBQUksQ0FBQ2hFLE1BQU0sRUFBRTtNQUNYM0QsS0FBSyxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQ2MsTUFBTSxFQUFFLElBQUksQ0FBQ0MsR0FBRyxDQUFDO01BQ2hELElBQUksQ0FBQ3dGLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDeUIsYUFBYSxDQUFDLENBQUMsQ0FBQztNQUN6QyxJQUFJOEcsU0FBUyxFQUFFLE9BQU8sQ0FBQztNQUN2Qm5ILEdBQUcsQ0FBQzFDLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTTtRQUNwQmpGLEtBQUssQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDYyxNQUFNLEVBQUUsSUFBSSxDQUFDQyxHQUFHLENBQUM7UUFDekMsSUFBSSxDQUFDcUYsSUFBSSxDQUFDLEtBQUssQ0FBQztNQUNsQixDQUFDLENBQUM7TUFDRjtJQUNGO0lBRUEsTUFBTW9LLHVCQUF1QixHQUFHQSxDQUFBLEtBQU07TUFDcEMsSUFBSSxDQUFDLElBQUksQ0FBQ3ZJLFFBQVEsRUFBRTtRQUNsQixPQUFPLEtBQUs7TUFDZDtNQUVBbUksZ0JBQWdCLEdBQUcsS0FBSztNQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDOUosTUFBTSxFQUFFO1FBQ2hCLElBQUksQ0FBQ0YsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUNoQixNQUFNZ0csUUFBUSxHQUFHLElBQUksQ0FBQ3BFLGFBQWEsQ0FBQyxDQUFDO1FBQ3JDb0UsUUFBUSxDQUFDcEcsRUFBRSxDQUFDLE9BQU8sRUFBRXpFLElBQUksQ0FBQztRQUMxQixJQUFJLENBQUNnRixRQUFRLENBQUMsSUFBSSxFQUFFNkYsUUFBUSxDQUFDO01BQy9CO01BRUEsT0FBTyxJQUFJO0lBQ2IsQ0FBQzs7SUFFRDtJQUNBekUsR0FBRyxDQUFDMUMsSUFBSSxDQUFDLE9BQU8sRUFBR2dCLEtBQUssSUFBSztNQUMzQixJQUFJdUssdUJBQXVCLENBQUMsQ0FBQyxFQUFFO01BQy9CSixnQkFBZ0IsR0FBRyxLQUFLO01BQ3hCLElBQUksQ0FBQzdKLFFBQVEsQ0FBQ04sS0FBSyxFQUFFLElBQUksQ0FBQztJQUM1QixDQUFDLENBQUM7SUFDRjBCLEdBQUcsQ0FBQzFDLElBQUksQ0FBQyxTQUFTLEVBQUV1TCx1QkFBdUIsQ0FBQztJQUM1QzdJLEdBQUcsQ0FBQzFDLElBQUksQ0FBQyxPQUFPLEVBQUV1TCx1QkFBdUIsQ0FBQztJQUMxQyxJQUFJLENBQUNKLGdCQUFnQixFQUNuQnpJLEdBQUcsQ0FBQzFDLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTTtNQUNwQmpGLEtBQUssQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDYyxNQUFNLEVBQUUsSUFBSSxDQUFDQyxHQUFHLENBQUM7TUFDekM7TUFDQSxJQUFJLENBQUNxRixJQUFJLENBQUMsS0FBSyxDQUFDO01BQ2hCLElBQUksQ0FBQ0csUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUN5QixhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQzNDLENBQUMsQ0FBQztFQUNOLENBQUMsQ0FBQztFQUVGLElBQUksQ0FBQzVCLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDO0VBRTFCLE1BQU1xSyxrQkFBa0IsR0FBR0EsQ0FBQSxLQUFNO0lBQy9CLE1BQU1DLGdCQUFnQixHQUFHLElBQUk7SUFDN0IsTUFBTUMsS0FBSyxHQUFHalAsR0FBRyxDQUFDNE0sU0FBUyxDQUFDLGdCQUFnQixDQUFDO0lBQzdDLElBQUlzQyxNQUFNLEdBQUcsQ0FBQztJQUVkLE1BQU1DLFFBQVEsR0FBRyxJQUFJeFIsTUFBTSxDQUFDeVIsU0FBUyxDQUFDLENBQUM7SUFDdkNELFFBQVEsQ0FBQ0UsVUFBVSxHQUFHLENBQUNDLEtBQUssRUFBRTFKLFFBQVEsRUFBRWYsUUFBUSxLQUFLO01BQ25EcUssTUFBTSxJQUFJSSxLQUFLLENBQUM1UCxNQUFNO01BQ3RCLElBQUksQ0FBQ2dGLElBQUksQ0FBQyxVQUFVLEVBQUU7UUFDcEI2SyxTQUFTLEVBQUUsUUFBUTtRQUNuQlAsZ0JBQWdCO1FBQ2hCRSxNQUFNO1FBQ05EO01BQ0YsQ0FBQyxDQUFDO01BQ0ZwSyxRQUFRLENBQUMsSUFBSSxFQUFFeUssS0FBSyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxPQUFPSCxRQUFRO0VBQ2pCLENBQUM7RUFFRCxNQUFNSyxjQUFjLEdBQUl2TixNQUFNLElBQUs7SUFDakMsTUFBTXdOLFNBQVMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDN0IsTUFBTUMsUUFBUSxHQUFHLElBQUkvUixNQUFNLENBQUNnUyxRQUFRLENBQUMsQ0FBQztJQUN0QyxNQUFNQyxXQUFXLEdBQUczTixNQUFNLENBQUN2QyxNQUFNO0lBQ2pDLE1BQU1tUSxTQUFTLEdBQUdELFdBQVcsR0FBR0gsU0FBUztJQUN6QyxNQUFNSyxNQUFNLEdBQUdGLFdBQVcsR0FBR0MsU0FBUztJQUV0QyxLQUFLLElBQUlFLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR0QsTUFBTSxFQUFFQyxDQUFDLElBQUlOLFNBQVMsRUFBRTtNQUMxQyxNQUFNSCxLQUFLLEdBQUdyTixNQUFNLENBQUMrTixLQUFLLENBQUNELENBQUMsRUFBRUEsQ0FBQyxHQUFHTixTQUFTLENBQUM7TUFDNUNDLFFBQVEsQ0FBQ3ZPLElBQUksQ0FBQ21PLEtBQUssQ0FBQztJQUN0QjtJQUVBLElBQUlPLFNBQVMsR0FBRyxDQUFDLEVBQUU7TUFDakIsTUFBTUksZUFBZSxHQUFHaE8sTUFBTSxDQUFDK04sS0FBSyxDQUFDLENBQUNILFNBQVMsQ0FBQztNQUNoREgsUUFBUSxDQUFDdk8sSUFBSSxDQUFDOE8sZUFBZSxDQUFDO0lBQ2hDO0lBRUFQLFFBQVEsQ0FBQ3ZPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDOztJQUVyQixPQUFPdU8sUUFBUTtFQUNqQixDQUFDO0VBRUQsSUFBSTtJQUNGO0lBQ0EsTUFBTWxMLFFBQVEsR0FBRyxJQUFJLENBQUM1QixTQUFTO0lBQy9CLElBQUk0QixRQUFRLEVBQUU7TUFDWjtNQUNBLE1BQU1vQyxPQUFPLEdBQUdwQyxRQUFRLENBQUMwQyxVQUFVLENBQUMsQ0FBQztNQUNyQyxLQUFLLE1BQU02SSxDQUFDLElBQUluSixPQUFPLEVBQUU7UUFDdkIsSUFBSTdILE1BQU0sQ0FBQzZILE9BQU8sRUFBRW1KLENBQUMsQ0FBQyxFQUFFO1VBQ3RCelIsS0FBSyxDQUFDLG1DQUFtQyxFQUFFeVIsQ0FBQyxFQUFFbkosT0FBTyxDQUFDbUosQ0FBQyxDQUFDLENBQUM7VUFDekQvUCxHQUFHLENBQUM0SyxTQUFTLENBQUNtRixDQUFDLEVBQUVuSixPQUFPLENBQUNtSixDQUFDLENBQUMsQ0FBQztRQUM5QjtNQUNGOztNQUVBO01BQ0F2TCxRQUFRLENBQUMwTCxTQUFTLENBQUMsQ0FBQzNMLEtBQUssRUFBRTdFLE1BQU0sS0FBSztRQUNwQztRQUNBLElBQUk2RSxLQUFLLEVBQUVqRyxLQUFLLENBQUMsOEJBQThCLEVBQUVpRyxLQUFLLEVBQUU3RSxNQUFNLENBQUM7UUFFL0RwQixLQUFLLENBQUMsaUNBQWlDLEVBQUVvQixNQUFNLENBQUM7UUFDaEQsSUFBSSxPQUFPQSxNQUFNLEtBQUssUUFBUSxFQUFFO1VBQzlCTSxHQUFHLENBQUM0SyxTQUFTLENBQUMsZ0JBQWdCLEVBQUVsTCxNQUFNLENBQUM7UUFDekM7UUFFQThFLFFBQVEsQ0FBQ3FCLElBQUksQ0FBQ2tKLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDbEosSUFBSSxDQUFDN0YsR0FBRyxDQUFDO01BQy9DLENBQUMsQ0FBQztJQUNKLENBQUMsTUFBTSxJQUFJa0ksTUFBTSxDQUFDVSxRQUFRLENBQUNqRCxJQUFJLENBQUMsRUFBRTtNQUNoQzZKLGNBQWMsQ0FBQzdKLElBQUksQ0FBQyxDQUFDRSxJQUFJLENBQUNrSixrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQ2xKLElBQUksQ0FBQzdGLEdBQUcsQ0FBQztJQUMzRCxDQUFDLE1BQU07TUFDTEEsR0FBRyxDQUFDUixHQUFHLENBQUNtRyxJQUFJLENBQUM7SUFDZjtFQUNGLENBQUMsQ0FBQyxPQUFPckYsR0FBRyxFQUFFO0lBQ1osSUFBSSxDQUFDa0wsWUFBWSxDQUFDbEwsR0FBRyxDQUFDO0VBQ3hCO0FBQ0YsQ0FBQzs7QUFFRDtBQUNBZixPQUFPLENBQUNvRSxTQUFTLENBQUM2QyxpQkFBaUIsR0FBSVAsR0FBRyxJQUFLO0VBQzdDLE9BQ0VrSywwQkFBMEIsQ0FBQ2xLLEdBQUcsQ0FBQyxLQUM5QmhILHVCQUF1QixDQUFDZ0gsR0FBRyxDQUFDLElBQUlqSCxnQkFBZ0IsQ0FBQ2lILEdBQUcsQ0FBQyxDQUFDO0FBRTNELENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTFHLE9BQU8sQ0FBQ29FLFNBQVMsQ0FBQ3lNLE9BQU8sR0FBRyxVQUFVQyxlQUFlLEVBQUU7RUFDckQsSUFBSSxPQUFPQSxlQUFlLEtBQUssUUFBUSxFQUFFO0lBQ3ZDLElBQUksQ0FBQ3RHLGdCQUFnQixHQUFHO01BQUUsR0FBRyxFQUFFc0c7SUFBZ0IsQ0FBQztFQUNsRCxDQUFDLE1BQU0sSUFBSSxPQUFPQSxlQUFlLEtBQUssUUFBUSxFQUFFO0lBQzlDLElBQUksQ0FBQ3RHLGdCQUFnQixHQUFHc0csZUFBZTtFQUN6QyxDQUFDLE1BQU07SUFDTCxJQUFJLENBQUN0RyxnQkFBZ0IsR0FBR3pHLFNBQVM7RUFDbkM7RUFFQSxPQUFPLElBQUk7QUFDYixDQUFDO0FBRUQvRCxPQUFPLENBQUNvRSxTQUFTLENBQUMyTSxjQUFjLEdBQUcsVUFBVUMsTUFBTSxFQUFFO0VBQ25ELElBQUksQ0FBQ2hHLGVBQWUsR0FBR2dHLE1BQU0sS0FBS2pOLFNBQVMsR0FBRyxJQUFJLEdBQUdpTixNQUFNO0VBQzNELE9BQU8sSUFBSTtBQUNiLENBQUM7O0FBRUQ7QUFDQSxJQUFJLENBQUNwUyxPQUFPLENBQUNnSCxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7RUFDNUI7RUFDQTtFQUNBO0VBQ0FoSCxPQUFPLEdBQUcsQ0FBQyxHQUFHQSxPQUFPLENBQUM7RUFDdEJBLE9BQU8sQ0FBQ2dELElBQUksQ0FBQyxLQUFLLENBQUM7QUFDckI7QUFFQSxLQUFLLElBQUkvQixNQUFNLElBQUlqQixPQUFPLEVBQUU7RUFDMUIsTUFBTXFTLElBQUksR0FBR3BSLE1BQU07RUFDbkJBLE1BQU0sR0FBR0EsTUFBTSxLQUFLLEtBQUssR0FBRyxRQUFRLEdBQUdBLE1BQU07RUFFN0NBLE1BQU0sR0FBR0EsTUFBTSxDQUFDcVIsV0FBVyxDQUFDLENBQUM7RUFDN0J0UixPQUFPLENBQUNxUixJQUFJLENBQUMsR0FBRyxDQUFDblIsR0FBRyxFQUFFc0csSUFBSSxFQUFFZ0csRUFBRSxLQUFLO0lBQ2pDLE1BQU01TCxRQUFRLEdBQUdaLE9BQU8sQ0FBQ0MsTUFBTSxFQUFFQyxHQUFHLENBQUM7SUFDckMsSUFBSSxPQUFPc0csSUFBSSxLQUFLLFVBQVUsRUFBRTtNQUM5QmdHLEVBQUUsR0FBR2hHLElBQUk7TUFDVEEsSUFBSSxHQUFHLElBQUk7SUFDYjtJQUVBLElBQUlBLElBQUksRUFBRTtNQUNSLElBQUl2RyxNQUFNLEtBQUssS0FBSyxJQUFJQSxNQUFNLEtBQUssTUFBTSxFQUFFO1FBQ3pDVyxRQUFRLENBQUN1RixLQUFLLENBQUNLLElBQUksQ0FBQztNQUN0QixDQUFDLE1BQU07UUFDTDVGLFFBQVEsQ0FBQzJRLElBQUksQ0FBQy9LLElBQUksQ0FBQztNQUNyQjtJQUNGO0lBRUEsSUFBSWdHLEVBQUUsRUFBRTVMLFFBQVEsQ0FBQ1AsR0FBRyxDQUFDbU0sRUFBRSxDQUFDO0lBQ3hCLE9BQU81TCxRQUFRO0VBQ2pCLENBQUM7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTeU8sTUFBTUEsQ0FBQ3RRLElBQUksRUFBRTtFQUNwQixNQUFNdUMsS0FBSyxHQUFHdkMsSUFBSSxDQUFDMEwsS0FBSyxDQUFDLEdBQUcsQ0FBQztFQUM3QixJQUFJM0UsSUFBSSxHQUFHeEUsS0FBSyxDQUFDLENBQUMsQ0FBQztFQUNuQixJQUFJd0UsSUFBSSxFQUFFQSxJQUFJLEdBQUdBLElBQUksQ0FBQ2lJLFdBQVcsQ0FBQyxDQUFDLENBQUNDLElBQUksQ0FBQyxDQUFDO0VBQzFDLElBQUl3RCxPQUFPLEdBQUdsUSxLQUFLLENBQUMsQ0FBQyxDQUFDO0VBQ3RCLElBQUlrUSxPQUFPLEVBQUVBLE9BQU8sR0FBR0EsT0FBTyxDQUFDekQsV0FBVyxDQUFDLENBQUMsQ0FBQ0MsSUFBSSxDQUFDLENBQUM7RUFFbkQsT0FBT2xJLElBQUksS0FBSyxNQUFNLElBQUkwTCxPQUFPLEtBQUssdUJBQXVCO0FBQy9EOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVNyQyxRQUFRQSxDQUFDcFEsSUFBSSxFQUFFO0VBQ3RCLElBQUksQ0FBQzBTLFFBQVEsRUFBRUosSUFBSSxDQUFDLEdBQUd0UyxJQUFJLENBQUMwTCxLQUFLLENBQUMsR0FBRyxDQUFDO0VBQ3RDLElBQUlnSCxRQUFRLEVBQUVBLFFBQVEsR0FBR0EsUUFBUSxDQUFDMUQsV0FBVyxDQUFDLENBQUMsQ0FBQ0MsSUFBSSxDQUFDLENBQUM7RUFDdEQsSUFBSXFELElBQUksRUFBRUEsSUFBSSxHQUFHQSxJQUFJLENBQUN0RCxXQUFXLENBQUMsQ0FBQyxDQUFDQyxJQUFJLENBQUMsQ0FBQztFQUMxQyxPQUNFLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUNoSSxRQUFRLENBQUN5TCxRQUFRLENBQUMsSUFDdEQsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUN6TCxRQUFRLENBQUNxTCxJQUFJLENBQUM7QUFFakM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsU0FBUzFELE1BQU1BLENBQUM1TyxJQUFJLEVBQUU7RUFDcEI7RUFDQTtFQUNBLE9BQU8scUJBQXFCLENBQUN5TCxJQUFJLENBQUN6TCxJQUFJLENBQUM7QUFDekM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsU0FBU2dJLFVBQVVBLENBQUNRLElBQUksRUFBRTtFQUN4QixPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQ3ZCLFFBQVEsQ0FBQ3VCLElBQUksQ0FBQztBQUN0RDtBQUVBLFNBQVN5SiwwQkFBMEJBLENBQUNsSyxHQUFHLEVBQUU7RUFDdkMsSUFBSUEsR0FBRyxDQUFDRSxVQUFVLEtBQUssR0FBRyxJQUFJRixHQUFHLENBQUNFLFVBQVUsS0FBSyxHQUFHLEVBQUU7SUFDcEQ7SUFDQSxPQUFPLEtBQUs7RUFDZDs7RUFFQTtFQUNBLElBQUlGLEdBQUcsQ0FBQ1csT0FBTyxDQUFDLGdCQUFnQixDQUFDLEtBQUssR0FBRyxFQUFFO0lBQ3pDO0lBQ0EsT0FBTyxLQUFLO0VBQ2Q7RUFFQSxPQUFPLElBQUk7QUFDYiIsImlnbm9yZUxpc3QiOltdfQ==
1667
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmb3JtYXQiLCJyZXF1aXJlIiwiU3RyZWFtIiwiaHR0cHMiLCJodHRwIiwiZnMiLCJ6bGliIiwidXRpbCIsInFzIiwibWltZSIsIm1ldGhvZHMiLCJGb3JtRGF0YSIsImZvcm1pZGFibGUiLCJkZWJ1ZyIsIkNvb2tpZUphciIsInNhZmVTdHJpbmdpZnkiLCJ1dGlscyIsIlJlcXVlc3RCYXNlIiwiaHR0cDIiLCJkZWNvbXByZXNzIiwiUmVzcG9uc2UiLCJtaXhpbiIsImhhc093biIsImlzQnJvdGxpRW5jb2RpbmciLCJpc0d6aXBPckRlZmxhdGVFbmNvZGluZyIsImNob29zZURlY29tcHJlc3NlciIsInJlcXVlc3QiLCJtZXRob2QiLCJ1cmwiLCJleHBvcnRzIiwiUmVxdWVzdCIsImVuZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsIm1vZHVsZSIsImFnZW50Iiwibm9vcCIsImRpc3Bvc2VOb2RlUmVxdWVzdCIsInJlcXVlc3RfIiwicmVxIiwiX3JlcXVlc3REaXNwb3NlZCIsIl9zdHJlYW1SZXNwb25zZUxpc3RlbmVyIiwicmVtb3ZlTGlzdGVuZXIiLCJ1bmRlZmluZWQiLCJfc3RyZWFtUmVzcG9uc2UiLCJzZXNzaW9uIiwiZGVzdHJveSIsInNvY2tldCIsImFib3J0IiwiZXJyIiwicHJlc2VydmVEb3RTZWdtZW50cyIsInVybFN0cmluZyIsInBhcnRzIiwibWF0Y2giLCJyZXN0b3JlUGF0aCIsInBhdGgiLCJzZWdtZW50cyIsInByZWZpeCIsInJlcGxhY2UiLCJfIiwic2VnbWVudCIsIm1hcmtlciIsInB1c2giLCJyZXF1ZXN0UGF0aCIsInJlc3RvcmVkUGF0aCIsImluZGV4IiwiZW50cmllcyIsIndpdGhEZWZhdWx0UHJvdG9jb2wiLCJpbmRleE9mIiwiUkVESVJFQ1RfUFJPVE9DT0xTIiwiU2V0IiwiVU5JWF9TT0NLRVRfUFJPVE9DT0xTIiwiaXNBbGxvd2VkUmVkaXJlY3RUYXJnZXQiLCJjdXJyZW50IiwidGFyZ2V0IiwiaGFzIiwicHJvdG9jb2wiLCJob3N0bmFtZSIsImlzU2FtZU9yaWdpbiIsIm9yaWdpbiIsInBvcnQiLCJkZWZpbmUiLCJwcm90b2NvbHMiLCJzZXJpYWxpemUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiLCJvYmplY3QiLCJzdHJpbmdpZnkiLCJpbmRpY2VzIiwic3RyaWN0TnVsbEhhbmRsaW5nIiwicGFyc2UiLCJCVUlMVF9JTl9QQVJTRVJTIiwidGV4dCIsImltYWdlIiwiQlVGRkVSSU5HX1BBUlNFUlMiLCJPYmplY3QiLCJrZXlzIiwibWFwIiwia2V5IiwiYnVmZmVyIiwiX2luaXRIZWFkZXJzIiwiX2hlYWRlciIsImhlYWRlciIsImNhbGwiLCJfZW5hYmxlSHR0cDIiLCJCb29sZWFuIiwicHJvY2VzcyIsImVudiIsIkhUVFAyX1RFU1QiLCJfYWdlbnQiLCJfZm9ybURhdGEiLCJ3cml0YWJsZSIsIl9yZWRpcmVjdHMiLCJyZWRpcmVjdHMiLCJjb29raWVzIiwiX3F1ZXJ5IiwicXNSYXciLCJfcmVkaXJlY3RMaXN0IiwiX3N0cmVhbVJlcXVlc3QiLCJfbG9va3VwIiwib25jZSIsImNsZWFyVGltZW91dCIsImJpbmQiLCJpbmhlcml0cyIsInByb3RvdHlwZSIsImJvb2wiLCJFcnJvciIsImF0dGFjaCIsImZpZWxkIiwiZmlsZSIsIm9wdGlvbnMiLCJfZGF0YSIsIm8iLCJmaWxlbmFtZSIsImNyZWF0ZVJlYWRTdHJlYW0iLCJvbiIsImVycm9yIiwiZm9ybURhdGEiLCJfZ2V0Rm9ybURhdGEiLCJlbWl0IiwiYXBwZW5kIiwiY2FsbGVkIiwiY2FsbGJhY2siLCJhZGRSZXF1ZXN0IiwiVHlwZUVycm9yIiwibG9va3VwIiwidHlwZSIsInNldCIsImluY2x1ZGVzIiwiZ2V0VHlwZSIsImFjY2VwdCIsInF1ZXJ5IiwidmFsdWUiLCJhc3NpZ24iLCJ3cml0ZSIsImRhdGEiLCJlbmNvZGluZyIsInJlcyIsInBpcGUiLCJzdHJlYW0iLCJwaXBlZCIsIl9waXBlQ29udGludWUiLCJpc1JlZGlyZWN0Iiwic3RhdHVzQ29kZSIsIl9tYXhSZWRpcmVjdHMiLCJfcmVkaXJlY3QiLCJfZW1pdFJlc3BvbnNlIiwiX2Fib3J0ZWQiLCJfc2hvdWxkRGVjb21wcmVzcyIsImRlY29tcHJlc3NlciIsImNvZGUiLCJfYnVmZmVyIiwiaGVhZGVycyIsImxvY2F0aW9uIiwicmVzdW1lIiwiVVJMIiwic3RhdHVzIiwiaHJlZiIsIl9lbWl0UHJlUmVkaXJlY3QiLCJnZXRIZWFkZXJzIiwiX2hlYWRlcnMiLCJjaGFuZ2VzT3JpZ2luIiwiY2xlYW5IZWFkZXIiLCJhdXRob3JpemF0aW9uIiwiY29va2llIiwidXNlcm5hbWUiLCJwYXNzd29yZCIsImhvc3QiLCJfZW5kQ2FsbGVkIiwiX2VtaXRSZWRpcmVjdCIsIl9jYWxsYmFjayIsImF1dGgiLCJ1c2VyIiwicGFzcyIsImVuY29kZXIiLCJzdHJpbmciLCJCdWZmZXIiLCJmcm9tIiwidG9TdHJpbmciLCJfYXV0aCIsImNhIiwiY2VydCIsIl9jYSIsIl9rZXkiLCJwZngiLCJpc0J1ZmZlciIsIl9wZngiLCJfcGFzc3BocmFzZSIsInBhc3NwaHJhc2UiLCJfY2VydCIsImRpc2FibGVUTFNDZXJ0cyIsIl9kaXNhYmxlVExTQ2VydHMiLCJfZmluYWxpemVRdWVyeVN0cmluZyIsInJldHJpZXMiLCJfcmV0cmllcyIsInByb3RlY3RlZFVybCIsInBhdGhuYW1lIiwic2VhcmNoIiwidGVzdCIsInNwbGl0Iiwic29ja2V0UGF0aCIsIl9jb25uZWN0T3ZlcnJpZGUiLCJuZXdIb3N0IiwibmV3UG9ydCIsIm5vcm1hbGl6ZUhvc3RuYW1lIiwicmVqZWN0VW5hdXRob3JpemVkIiwiTk9ERV9UTFNfUkVKRUNUX1VOQVVUSE9SSVpFRCIsInNlcnZlcm5hbWUiLCJfdHJ1c3RMb2NhbGhvc3QiLCJtb2R1bGVfIiwic2V0UHJvdG9jb2wiLCJyZXNwb25zZSIsInNldE5vRGVsYXkiLCJzZXRIZWFkZXIiLCJlbWl0RHJhaW4iLCJ0ZW1wb3JhcnlKYXIiLCJzZXRDb29raWVzIiwiZ2V0Q29va2llcyIsIkNvb2tpZUFjY2Vzc0luZm8iLCJBbGwiLCJ0b1ZhbHVlU3RyaW5nIiwiX2Rpc3Bvc2VSZXF1ZXN0IiwiX2ZhaWxSZXF1ZXN0IiwiX3Nob3VsZFJldHJ5IiwiX3JldHJ5IiwiZm4iLCJ0aW1lZG91dCIsImNvbnNvbGUiLCJ3YXJuIiwiX2lzUmVzcG9uc2VPSyIsIm1lc3NhZ2UiLCJTVEFUVVNfQ09ERVMiLCJfbWF4UmV0cmllcyIsImxpc3RlbmVycyIsIl9pc0hvc3QiLCJib2R5IiwiZmlsZXMiLCJfZW5kIiwiX3NldFRpbWVvdXRzIiwiX2hlYWRlclNlbnQiLCJjb250ZW50VHlwZSIsImdldEhlYWRlciIsIl9zZXJpYWxpemVyIiwiaXNKU09OIiwiYnl0ZUxlbmd0aCIsInN0cmVhbVJlc3BvbnNlIiwiaGFuZGxlUmVzcG9uc2UiLCJfcmVzcG9uc2VUaW1lb3V0VGltZXIiLCJtYXgiLCJ0b0xvd2VyQ2FzZSIsInRyaW0iLCJtdWx0aXBhcnQiLCJyZWRpcmVjdCIsInJlc3BvbnNlVHlwZSIsIl9yZXNwb25zZVR5cGUiLCJwYXJzZXIiLCJfcGFyc2VyIiwiZm9ybSIsImJyaWRnZVN0cmVhbSIsIlBhc3NUaHJvdWdoIiwiaHR0cFZlcnNpb24iLCJyZWFkYWJsZSIsImZpZWxkcyIsImZsYXR0ZW5lZEZpZWxkcyIsImhhc093blByb3BlcnR5IiwiQXJyYXkiLCJpc0FycmF5IiwiZmxhdHRlbmVkRmlsZXMiLCJpc0JpbmFyeSIsImlzVGV4dCIsIl9yZXNCdWZmZXJlZCIsInBhcnNlckhhbmRsZXNFbmQiLCJyZXNwb25zZUJ5dGVzTGVmdCIsIl9tYXhSZXNwb25zZVNpemUiLCJleGNlZWRlZCIsImJ1ZiIsIlN0cmluZyIsInNldEVuY29kaW5nIiwiY29tcGxldGVBYm9ydGVkUmVzcG9uc2UiLCJuZXh0VGljayIsImdldFByb2dyZXNzTW9uaXRvciIsImxlbmd0aENvbXB1dGFibGUiLCJ0b3RhbCIsImxvYWRlZCIsInByb2dyZXNzIiwiVHJhbnNmb3JtIiwiX3RyYW5zZm9ybSIsImNodW5rIiwiZGlyZWN0aW9uIiwiYnVmZmVyVG9DaHVua3MiLCJjaHVua1NpemUiLCJjaHVua2luZyIsIlJlYWRhYmxlIiwidG90YWxMZW5ndGgiLCJyZW1haW5kZXIiLCJjdXRvZmYiLCJpIiwic2xpY2UiLCJyZW1haW5kZXJCdWZmZXIiLCJnZXRMZW5ndGgiLCJoYXNOb25FbXB0eVJlc3BvbnNlQ29udGVudCIsImNvbm5lY3QiLCJjb25uZWN0T3ZlcnJpZGUiLCJ0cnVzdExvY2FsaG9zdCIsInRvZ2dsZSIsIm5hbWUiLCJ0b1VwcGVyQ2FzZSIsInNlbmQiLCJzdWJ0eXBlIiwicmVnaXN0cnkiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbm9kZS9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxuY29uc3QgeyBmb3JtYXQgfSA9IHJlcXVpcmUoJ25vZGU6dXJsJyk7XG5jb25zdCBTdHJlYW0gPSByZXF1aXJlKCdub2RlOnN0cmVhbScpO1xuY29uc3QgaHR0cHMgPSByZXF1aXJlKCdub2RlOmh0dHBzJyk7XG5jb25zdCBodHRwID0gcmVxdWlyZSgnbm9kZTpodHRwJyk7XG5jb25zdCBmcyA9IHJlcXVpcmUoJ25vZGU6ZnMnKTtcbmNvbnN0IHpsaWIgPSByZXF1aXJlKCdub2RlOnpsaWInKTtcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCdub2RlOnV0aWwnKTtcbmNvbnN0IHFzID0gcmVxdWlyZSgncXMnKTtcbmNvbnN0IG1pbWUgPSByZXF1aXJlKCdtaW1lJyk7XG5sZXQgbWV0aG9kcyA9IHJlcXVpcmUoJ21ldGhvZHMnKTtcbmNvbnN0IEZvcm1EYXRhID0gcmVxdWlyZSgnZm9ybS1kYXRhJyk7XG5jb25zdCBmb3JtaWRhYmxlID0gcmVxdWlyZSgnZm9ybWlkYWJsZScpO1xuY29uc3QgZGVidWcgPSByZXF1aXJlKCdkZWJ1ZycpKCdzdXBlcmFnZW50Jyk7XG5jb25zdCBDb29raWVKYXIgPSByZXF1aXJlKCdjb29raWVqYXInKTtcbmNvbnN0IHNhZmVTdHJpbmdpZnkgPSByZXF1aXJlKCdmYXN0LXNhZmUtc3RyaW5naWZ5Jyk7XG5cbmNvbnN0IHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbmNvbnN0IFJlcXVlc3RCYXNlID0gcmVxdWlyZSgnLi4vcmVxdWVzdC1iYXNlJyk7XG5jb25zdCBodHRwMiA9IHJlcXVpcmUoJy4vaHR0cDJ3cmFwcGVyJyk7XG5jb25zdCB7IGRlY29tcHJlc3MgfSA9IHJlcXVpcmUoJy4vdW56aXAnKTtcbmNvbnN0IFJlc3BvbnNlID0gcmVxdWlyZSgnLi9yZXNwb25zZScpO1xuXG5jb25zdCB7IG1peGluLCBoYXNPd24sIGlzQnJvdGxpRW5jb2RpbmcsIGlzR3ppcE9yRGVmbGF0ZUVuY29kaW5nIH0gPSB1dGlscztcbmNvbnN0IHsgY2hvb3NlRGVjb21wcmVzc2VyIH0gPSByZXF1aXJlKCcuL2RlY29tcHJlc3MnKTtcblxuZnVuY3Rpb24gcmVxdWVzdChtZXRob2QsIHVybCkge1xuICAvLyBjYWxsYmFja1xuICBpZiAodHlwZW9mIHVybCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBuZXcgZXhwb3J0cy5SZXF1ZXN0KCdHRVQnLCBtZXRob2QpLmVuZCh1cmwpO1xuICB9XG5cbiAgLy8gdXJsIGZpcnN0XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIG5ldyBleHBvcnRzLlJlcXVlc3QoJ0dFVCcsIG1ldGhvZCk7XG4gIH1cblxuICByZXR1cm4gbmV3IGV4cG9ydHMuUmVxdWVzdChtZXRob2QsIHVybCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWVzdDtcbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cztcblxuLyoqXG4gKiBFeHBvc2UgYFJlcXVlc3RgLlxuICovXG5cbmV4cG9ydHMuUmVxdWVzdCA9IFJlcXVlc3Q7XG5cbi8qKlxuICogRXhwb3NlIHRoZSBhZ2VudCBmdW5jdGlvblxuICovXG5cbmV4cG9ydHMuYWdlbnQgPSByZXF1aXJlKCcuL2FnZW50Jyk7XG5cbi8qKlxuICogTm9vcC5cbiAqL1xuXG5mdW5jdGlvbiBub29wKCkge31cblxuLyoqXG4gKiBDbG9zZSBhbiB1bmRlcmx5aW5nIE5vZGUgcmVxdWVzdC9zZXNzaW9uIGNyZWF0ZWQgZHVyaW5nIHNldHVwLlxuICpcbiAqIFVzZWQgd2hlbiBoZWFkZXIgYXBwbGljYXRpb24gb3IgbGF0ZXIgcmVxdWVzdC1wYXRoIHdvcmsgdGhyb3dzIGFmdGVyXG4gKiBgaHR0cC5yZXF1ZXN0KClgIC8gYGh0dHAyLmNvbm5lY3QoKWAgaGFzIGFscmVhZHkgYWxsb2NhdGVkIGEgc29ja2V0LlxuICpcbiAqIEBwYXJhbSB7UmVxdWVzdH0gcmVxdWVzdF9cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBkaXNwb3NlTm9kZVJlcXVlc3QocmVxdWVzdF8pIHtcbiAgY29uc3QgeyByZXEgfSA9IHJlcXVlc3RfO1xuICBpZiAoIXJlcSB8fCByZXF1ZXN0Xy5fcmVxdWVzdERpc3Bvc2VkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmVxdWVzdF8uX3JlcXVlc3REaXNwb3NlZCA9IHRydWU7XG4gIGlmIChyZXF1ZXN0Xy5fc3RyZWFtUmVzcG9uc2VMaXN0ZW5lcikge1xuICAgIHJlcS5yZW1vdmVMaXN0ZW5lcigncmVzcG9uc2UnLCByZXF1ZXN0Xy5fc3RyZWFtUmVzcG9uc2VMaXN0ZW5lcik7XG4gICAgcmVxdWVzdF8uX3N0cmVhbVJlc3BvbnNlTGlzdGVuZXIgPSB1bmRlZmluZWQ7XG4gICAgcmVxdWVzdF8uX3N0cmVhbVJlc3BvbnNlID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgdHJ5IHtcbiAgICAvLyBIVFRQLzIgd3JhcHBlciBrZWVwcyBhIHNlc3Npb24gb3BlbiBhcyBzb29uIGFzIHJlcXVlc3QoKSBpcyBjYWxsZWQuXG4gICAgLy8gUHJlZmVyIGRlc3Ryb3lpbmcgdGhhdCBzZXNzaW9uIHNvIHdlIG5ldmVyIGNhbGwgYWJvcnQoKSDihpIgZ2V0RnJhbWUoKVxuICAgIC8vIHdpdGggaW52YWxpZCBoZWFkZXJzICh3aGljaCB3b3VsZCBlbWl0IGEgbGF0ZSBwcm90b2NvbCBlcnJvcikuXG4gICAgaWYgKHJlcS5zZXNzaW9uICYmIHR5cGVvZiByZXEuc2Vzc2lvbi5kZXN0cm95ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXEuc2Vzc2lvbi5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgaWYgKHJlcS5zb2NrZXQgJiYgdHlwZW9mIHJlcS5zb2NrZXQuZGVzdHJveSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmVxLnNvY2tldC5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiByZXEuZGVzdHJveSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmVxLmRlc3Ryb3koKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHJlcS5hYm9ydCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmVxLmFib3J0KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiByZXEuZW5kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXEuZW5kKCk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBkZWJ1ZygnZXJyb3IgZGlzcG9zaW5nIHJlcXVlc3QgYWZ0ZXIgc2V0dXAgZmFpbHVyZScsIGVycik7XG4gIH1cbn1cblxuLyoqXG4gKiBQcmVzZXJ2ZSBkb3Qtb25seSBwYXRoIHNlZ21lbnRzIHRoYXQgV0hBVFdHIFVSTCBub3JtYWxpemVzIGF3YXkuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHVybFN0cmluZ1xuICogQHJldHVybnMge3t1cmxTdHJpbmc6IFN0cmluZywgcmVzdG9yZVBhdGg6IEZ1bmN0aW9ufX1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBwcmVzZXJ2ZURvdFNlZ21lbnRzKHVybFN0cmluZykge1xuICBjb25zdCBwYXJ0cyA9IHVybFN0cmluZy5tYXRjaChcbiAgICAvXihbYS16XVthLXpcXGQrLi1dKjpcXC9cXC9bXi8/I10qKShbXj8jXSopKC4qKSQvaVxuICApO1xuICBpZiAoIXBhcnRzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHVybFN0cmluZyxcbiAgICAgIHJlc3RvcmVQYXRoKHBhdGgpIHtcbiAgICAgICAgcmV0dXJuIHBhdGg7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IHNlZ21lbnRzID0gW107XG4gIGNvbnN0IHByZWZpeCA9ICdfX3N1cGVyYWdlbnRfZG90X3NlZ21lbnRfJztcbiAgY29uc3QgcGF0aCA9IHBhcnRzWzJdLnJlcGxhY2UoXG4gICAgL1xcLygoPzpcXC58JTJlKXsxLDJ9KSg/PVxcL3wkKS9naSxcbiAgICAoXywgc2VnbWVudCkgPT4ge1xuICAgICAgY29uc3QgbWFya2VyID0gYCR7cHJlZml4fSR7c2VnbWVudHMubGVuZ3RofV9fYDtcbiAgICAgIHNlZ21lbnRzLnB1c2goc2VnbWVudCk7XG4gICAgICByZXR1cm4gYC8ke21hcmtlcn1gO1xuICAgIH1cbiAgKTtcblxuICByZXR1cm4ge1xuICAgIHVybFN0cmluZzogYCR7cGFydHNbMV19JHtwYXRofSR7cGFydHNbM119YCxcbiAgICByZXN0b3JlUGF0aChyZXF1ZXN0UGF0aCkge1xuICAgICAgbGV0IHJlc3RvcmVkUGF0aCA9IHJlcXVlc3RQYXRoO1xuICAgICAgZm9yIChjb25zdCBbaW5kZXgsIHNlZ21lbnRdIG9mIHNlZ21lbnRzLmVudHJpZXMoKSkge1xuICAgICAgICByZXN0b3JlZFBhdGggPSByZXN0b3JlZFBhdGgucmVwbGFjZShgJHtwcmVmaXh9JHtpbmRleH1fX2AsIHNlZ21lbnQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdG9yZWRQYXRoO1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBEZWZhdWx0IGEgc2NoZW1lLWxlc3MgVVJMIHN0cmluZyB0byBodHRwOi8vLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB1cmxTdHJpbmdcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5mdW5jdGlvbiB3aXRoRGVmYXVsdFByb3RvY29sKHVybFN0cmluZykge1xuICByZXR1cm4gdXJsU3RyaW5nLmluZGV4T2YoJ2h0dHAnKSA9PT0gMCA/IHVybFN0cmluZyA6IGBodHRwOi8vJHt1cmxTdHJpbmd9YDtcbn1cblxuLyoqXG4gKiBQcm90b2NvbHMgYSByZWRpcmVjdCBtYXkgbGVhZCB0by4gQSByZXF1ZXN0IG1hZGUgb3ZlciBhIFVuaXggZG9tYWluIHNvY2tldFxuICogbWF5IGFkZGl0aW9uYWxseSBiZSByZWRpcmVjdGVkIHdpdGhpbiB0aGF0IHNhbWUgc29ja2V0IChzZWVcbiAqIGBpc0FsbG93ZWRSZWRpcmVjdFRhcmdldGApLlxuICovXG5jb25zdCBSRURJUkVDVF9QUk9UT0NPTFMgPSBuZXcgU2V0KFsnaHR0cDonLCAnaHR0cHM6J10pO1xuY29uc3QgVU5JWF9TT0NLRVRfUFJPVE9DT0xTID0gbmV3IFNldChbJ2h0dHArdW5peDonLCAnaHR0cHMrdW5peDonXSk7XG5cbi8qKlxuICogV2hldGhlciBhIHJlZGlyZWN0IGZyb20gYGN1cnJlbnRgIHRvIGB0YXJnZXRgIG1heSBiZSBmb2xsb3dlZC5cbiAqXG4gKiBPbmx5IGh0dHAocykgdGFyZ2V0cyBhcmUgZm9sbG93ZWQuIEEgcmVtb3RlIHNlcnZlciBtdXN0IG5ldmVyIGJlIGFibGUgdG9cbiAqIHN0ZWVyIHRoZSBjbGllbnQgaW50byBhIGxvY2FsIFVuaXggZG9tYWluIHNvY2tldCAoYGh0dHArdW5peDovL2ApIG9yIGFueVxuICogb3RoZXIgc2NoZW1lIHRocm91Z2ggYSBMb2NhdGlvbiBoZWFkZXI7IGEgcmVxdWVzdCB0aGF0IHdhcyBpdHNlbGYgbWFkZSBvdmVyXG4gKiBhIFVuaXggZG9tYWluIHNvY2tldCBtYXkgb25seSBiZSByZWRpcmVjdGVkIHdpdGhpbiB0aGF0IHNhbWUgc29ja2V0LlxuICpcbiAqIEBwYXJhbSB7VVJMfSBjdXJyZW50XG4gKiBAcGFyYW0ge1VSTH0gdGFyZ2V0XG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGlzQWxsb3dlZFJlZGlyZWN0VGFyZ2V0KGN1cnJlbnQsIHRhcmdldCkge1xuICBpZiAoUkVESVJFQ1RfUFJPVE9DT0xTLmhhcyh0YXJnZXQucHJvdG9jb2wpKSByZXR1cm4gdHJ1ZTtcblxuICByZXR1cm4gKFxuICAgIFVOSVhfU09DS0VUX1BST1RPQ09MUy5oYXModGFyZ2V0LnByb3RvY29sKSAmJlxuICAgIHRhcmdldC5wcm90b2NvbCA9PT0gY3VycmVudC5wcm90b2NvbCAmJlxuICAgIHRhcmdldC5ob3N0bmFtZSAhPT0gJycgJiZcbiAgICB0YXJnZXQuaG9zdG5hbWUgPT09IGN1cnJlbnQuaG9zdG5hbWVcbiAgKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHR3byBVUkxzIHNoYXJlIGFuIG9yaWdpbi4gVW5peCBzb2NrZXQgVVJMcyBoYXZlIGFuIG9wYXF1ZSAoYG51bGxgKVxuICogV0hBVFdHIG9yaWdpbiwgc28gdGhleSBhcmUgY29tcGFyZWQgYnkgcHJvdG9jb2wgYW5kIHNvY2tldCBwYXRoIGluc3RlYWQuXG4gKlxuICogQHBhcmFtIHtVUkx9IGN1cnJlbnRcbiAqIEBwYXJhbSB7VVJMfSB0YXJnZXRcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gaXNTYW1lT3JpZ2luKGN1cnJlbnQsIHRhcmdldCkge1xuICBpZiAoY3VycmVudC5vcmlnaW4gIT09ICdudWxsJyAmJiB0YXJnZXQub3JpZ2luICE9PSAnbnVsbCcpIHtcbiAgICByZXR1cm4gY3VycmVudC5vcmlnaW4gPT09IHRhcmdldC5vcmlnaW47XG4gIH1cblxuICByZXR1cm4gKFxuICAgIGN1cnJlbnQucHJvdG9jb2wgPT09IHRhcmdldC5wcm90b2NvbCAmJlxuICAgIGN1cnJlbnQuaG9zdG5hbWUgPT09IHRhcmdldC5ob3N0bmFtZSAmJlxuICAgIGN1cnJlbnQucG9ydCA9PT0gdGFyZ2V0LnBvcnRcbiAgKTtcbn1cblxuLyoqXG4gKiBFeHBvc2UgYFJlc3BvbnNlYC5cbiAqL1xuXG5leHBvcnRzLlJlc3BvbnNlID0gUmVzcG9uc2U7XG5cbi8qKlxuICogRGVmaW5lIFwiZm9ybVwiIG1pbWUgdHlwZS5cbiAqL1xuXG5taW1lLmRlZmluZShcbiAge1xuICAgICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnOiBbJ2Zvcm0nLCAndXJsZW5jb2RlZCcsICdmb3JtLWRhdGEnXVxuICB9LFxuICB0cnVlXG4pO1xuXG4vKipcbiAqIFByb3RvY29sIG1hcC5cbiAqL1xuXG5leHBvcnRzLnByb3RvY29scyA9IHtcbiAgJ2h0dHA6JzogaHR0cCxcbiAgJ2h0dHBzOic6IGh0dHBzLFxuICAnaHR0cDI6JzogaHR0cDJcbn07XG5cbi8qKlxuICogRGVmYXVsdCBzZXJpYWxpemF0aW9uIG1hcC5cbiAqXG4gKiAgICAgc3VwZXJhZ2VudC5zZXJpYWxpemVbJ2FwcGxpY2F0aW9uL3htbCddID0gZnVuY3Rpb24ob2JqKXtcbiAqICAgICAgIHJldHVybiAnZ2VuZXJhdGVkIHhtbCBoZXJlJztcbiAqICAgICB9O1xuICpcbiAqL1xuXG5leHBvcnRzLnNlcmlhbGl6ZSA9IHtcbiAgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcob2JqZWN0KSB7XG4gICAgcmV0dXJuIHFzLnN0cmluZ2lmeShvYmplY3QsIHsgaW5kaWNlczogZmFsc2UsIHN0cmljdE51bGxIYW5kbGluZzogdHJ1ZSB9KTtcbiAgfSxcbiAgJ2FwcGxpY2F0aW9uL2pzb24nOiBzYWZlU3RyaW5naWZ5LFxuICAvLyBDU1AgcmVwb3J0cyBjYXJyeSBKU09OIGJvZGllcyBidXQgdXNlIGEgZGlzdGluY3QgcmVnaXN0ZXJlZCBtZWRpYSB0eXBlLlxuICAnYXBwbGljYXRpb24vY3NwLXJlcG9ydCc6IHNhZmVTdHJpbmdpZnlcbn07XG5cbi8qKlxuICogRGVmYXVsdCBwYXJzZXJzLlxuICpcbiAqICAgICBzdXBlcmFnZW50LnBhcnNlWydhcHBsaWNhdGlvbi94bWwnXSA9IGZ1bmN0aW9uKHJlcywgZm4pe1xuICogICAgICAgZm4obnVsbCwgcmVzKTtcbiAqICAgICB9O1xuICpcbiAqL1xuXG5leHBvcnRzLnBhcnNlID0gcmVxdWlyZSgnLi9wYXJzZXJzJyk7XG5cbi8qKlxuICogVGhlIGRlZmF1bHQgcGFyc2VycyBhcyBzaGlwcGVkOyB0aGV5IG9ubHkgYWNjdW11bGF0ZSBhIGJ1ZmZlcmVkIGJvZHksIHNvXG4gKiB0aGV5IGFyZSBza2lwcGVkIGZvciB1bmJ1ZmZlcmVkIHJlc3BvbnNlcyAoc2VlIGBfZW5kYCkuIENhcHR1cmVkIGhlcmUgc29cbiAqIHRoYXQgYSBwYXJzZXIgYSB1c2VyIGluc3RhbGxzIHVuZGVyIHRoZSBzYW1lIGtleSBpcyBzdGlsbCBob25vdXJlZC5cbiAqL1xuY29uc3QgQlVJTFRfSU5fUEFSU0VSUyA9IHtcbiAgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCc6XG4gICAgZXhwb3J0cy5wYXJzZVsnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJ10sXG4gICdhcHBsaWNhdGlvbi9qc29uJzogZXhwb3J0cy5wYXJzZVsnYXBwbGljYXRpb24vanNvbiddLFxuICB0ZXh0OiBleHBvcnRzLnBhcnNlLnRleHQsXG4gIGltYWdlOiBleHBvcnRzLnBhcnNlLmltYWdlXG59O1xuY29uc3QgQlVGRkVSSU5HX1BBUlNFUlMgPSBuZXcgU2V0KFxuICBPYmplY3Qua2V5cyhCVUlMVF9JTl9QQVJTRVJTKS5tYXAoKGtleSkgPT4gQlVJTFRfSU5fUEFSU0VSU1trZXldKVxuKTtcblxuLyoqXG4gKiBEZWZhdWx0IGJ1ZmZlcmluZyBtYXAuIENhbiBiZSB1c2VkIHRvIHNldCBjZXJ0YWluXG4gKiByZXNwb25zZSB0eXBlcyB0byBidWZmZXIvbm90IGJ1ZmZlci5cbiAqXG4gKiAgICAgc3VwZXJhZ2VudC5idWZmZXJbJ2FwcGxpY2F0aW9uL3htbCddID0gdHJ1ZTtcbiAqL1xuZXhwb3J0cy5idWZmZXIgPSB7fTtcblxuLyoqXG4gKiBJbml0aWFsaXplIGludGVybmFsIGhlYWRlciB0cmFja2luZyBwcm9wZXJ0aWVzIG9uIGEgcmVxdWVzdCBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcmVxIHRoZSBpbnN0YW5jZVxuICogQGFwaSBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIF9pbml0SGVhZGVycyhyZXF1ZXN0Xykge1xuICByZXF1ZXN0Xy5faGVhZGVyID0ge1xuICAgIC8vIGNvZXJjZXMgaGVhZGVyIG5hbWVzIHRvIGxvd2VyY2FzZVxuICB9O1xuICByZXF1ZXN0Xy5oZWFkZXIgPSB7XG4gICAgLy8gcHJlc2VydmVzIGhlYWRlciBuYW1lIGNhc2VcbiAgfTtcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplIGEgbmV3IGBSZXF1ZXN0YCB3aXRoIHRoZSBnaXZlbiBgbWV0aG9kYCBhbmQgYHVybGAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1ldGhvZFxuICogQHBhcmFtIHtTdHJpbmd8T2JqZWN0fSB1cmxcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gUmVxdWVzdChtZXRob2QsIHVybCkge1xuICBTdHJlYW0uY2FsbCh0aGlzKTtcbiAgaWYgKHR5cGVvZiB1cmwgIT09ICdzdHJpbmcnKSB1cmwgPSBmb3JtYXQodXJsKTtcbiAgdGhpcy5fZW5hYmxlSHR0cDIgPSBCb29sZWFuKHByb2Nlc3MuZW52LkhUVFAyX1RFU1QpOyAvLyBpbnRlcm5hbCBvbmx5XG4gIHRoaXMuX2FnZW50ID0gZmFsc2U7XG4gIHRoaXMuX2Zvcm1EYXRhID0gbnVsbDtcbiAgdGhpcy5tZXRob2QgPSBtZXRob2Q7XG4gIHRoaXMudXJsID0gdXJsO1xuICBfaW5pdEhlYWRlcnModGhpcyk7XG4gIHRoaXMud3JpdGFibGUgPSB0cnVlO1xuICB0aGlzLl9yZWRpcmVjdHMgPSAwO1xuICB0aGlzLnJlZGlyZWN0cyhtZXRob2QgPT09ICdIRUFEJyA/IDAgOiA1KTtcbiAgdGhpcy5jb29raWVzID0gJyc7XG4gIHRoaXMucXMgPSB7fTtcbiAgdGhpcy5fcXVlcnkgPSBbXTtcbiAgdGhpcy5xc1JhdyA9IHRoaXMuX3F1ZXJ5OyAvLyBVbnVzZWQsIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBvbmx5XG4gIHRoaXMuX3JlZGlyZWN0TGlzdCA9IFtdO1xuICB0aGlzLl9zdHJlYW1SZXF1ZXN0ID0gZmFsc2U7XG4gIHRoaXMuX2xvb2t1cCA9IHVuZGVmaW5lZDtcbiAgdGhpcy5vbmNlKCdlbmQnLCB0aGlzLmNsZWFyVGltZW91dC5iaW5kKHRoaXMpKTtcbn1cblxuLyoqXG4gKiBJbmhlcml0IGZyb20gYFN0cmVhbWAgKHdoaWNoIGluaGVyaXRzIGZyb20gYEV2ZW50RW1pdHRlcmApLlxuICogTWl4aW4gYFJlcXVlc3RCYXNlYC5cbiAqL1xudXRpbC5pbmhlcml0cyhSZXF1ZXN0LCBTdHJlYW0pO1xuXG5taXhpbihSZXF1ZXN0LnByb3RvdHlwZSwgUmVxdWVzdEJhc2UucHJvdG90eXBlKTtcblxuLyoqXG4gKiBFbmFibGUgb3IgRGlzYWJsZSBodHRwMi5cbiAqXG4gKiBFbmFibGUgaHR0cDIuXG4gKlxuICogYGBgIGpzXG4gKiByZXF1ZXN0LmdldCgnaHR0cDovL2xvY2FsaG9zdC8nKVxuICogICAuaHR0cDIoKVxuICogICAuZW5kKGNhbGxiYWNrKTtcbiAqXG4gKiByZXF1ZXN0LmdldCgnaHR0cDovL2xvY2FsaG9zdC8nKVxuICogICAuaHR0cDIodHJ1ZSlcbiAqICAgLmVuZChjYWxsYmFjayk7XG4gKiBgYGBcbiAqXG4gKiBEaXNhYmxlIGh0dHAyLlxuICpcbiAqIGBgYCBqc1xuICogcmVxdWVzdCA9IHJlcXVlc3QuaHR0cDIoKTtcbiAqIHJlcXVlc3QuZ2V0KCdodHRwOi8vbG9jYWxob3N0LycpXG4gKiAgIC5odHRwMihmYWxzZSlcbiAqICAgLmVuZChjYWxsYmFjayk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZVxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmh0dHAyID0gZnVuY3Rpb24gKGJvb2wpIHtcbiAgaWYgKGV4cG9ydHMucHJvdG9jb2xzWydodHRwMjonXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ3N1cGVyYWdlbnQ6IHRoaXMgdmVyc2lvbiBvZiBOb2RlLmpzIGRvZXMgbm90IHN1cHBvcnQgaHR0cDInXG4gICAgKTtcbiAgfVxuXG4gIHRoaXMuX2VuYWJsZUh0dHAyID0gYm9vbCA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IGJvb2w7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBRdWV1ZSB0aGUgZ2l2ZW4gYGZpbGVgIGFzIGFuIGF0dGFjaG1lbnQgdG8gdGhlIHNwZWNpZmllZCBgZmllbGRgLFxuICogd2l0aCBvcHRpb25hbCBgb3B0aW9uc2AgKG9yIGZpbGVuYW1lKS5cbiAqXG4gKiBgYGAganNcbiAqIHJlcXVlc3QucG9zdCgnaHR0cDovL2xvY2FsaG9zdC91cGxvYWQnKVxuICogICAuYXR0YWNoKCdmaWVsZCcsIEJ1ZmZlci5mcm9tKCc8Yj5IZWxsbyB3b3JsZDwvYj4nKSwgJ2hlbGxvLmh0bWwnKVxuICogICAuZW5kKGNhbGxiYWNrKTtcbiAqIGBgYFxuICpcbiAqIEEgZmlsZW5hbWUgbWF5IGFsc28gYmUgdXNlZDpcbiAqXG4gKiBgYGAganNcbiAqIHJlcXVlc3QucG9zdCgnaHR0cDovL2xvY2FsaG9zdC91cGxvYWQnKVxuICogICAuYXR0YWNoKCdmaWxlcycsICdpbWFnZS5qcGcnKVxuICogICAuZW5kKGNhbGxiYWNrKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZFxuICogQHBhcmFtIHtTdHJpbmd8ZnMuUmVhZFN0cmVhbXxCdWZmZXJ9IGZpbGVcbiAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gb3B0aW9uc1xuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmF0dGFjaCA9IGZ1bmN0aW9uIChmaWVsZCwgZmlsZSwgb3B0aW9ucykge1xuICBpZiAoZmlsZSkge1xuICAgIGlmICh0aGlzLl9kYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzdXBlcmFnZW50IGNhbid0IG1peCAuc2VuZCgpIGFuZCAuYXR0YWNoKClcIik7XG4gICAgfVxuXG4gICAgbGV0IG8gPSBvcHRpb25zIHx8IHt9O1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIG8gPSB7IGZpbGVuYW1lOiBvcHRpb25zIH07XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBmaWxlID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKCFvLmZpbGVuYW1lKSBvLmZpbGVuYW1lID0gZmlsZTtcbiAgICAgIGRlYnVnKCdjcmVhdGluZyBgZnMuUmVhZFN0cmVhbWAgaW5zdGFuY2UgZm9yIGZpbGU6ICVzJywgZmlsZSk7XG4gICAgICBmaWxlID0gZnMuY3JlYXRlUmVhZFN0cmVhbShmaWxlKTtcbiAgICAgIGZpbGUub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnN0IGZvcm1EYXRhID0gdGhpcy5fZ2V0Rm9ybURhdGEoKTtcbiAgICAgICAgZm9ybURhdGEuZW1pdCgnZXJyb3InLCBlcnJvcik7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKCFvLmZpbGVuYW1lICYmIGZpbGUucGF0aCkge1xuICAgICAgby5maWxlbmFtZSA9IGZpbGUucGF0aDtcbiAgICB9XG5cbiAgICB0aGlzLl9nZXRGb3JtRGF0YSgpLmFwcGVuZChmaWVsZCwgZmlsZSwgbyk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cblJlcXVlc3QucHJvdG90eXBlLl9nZXRGb3JtRGF0YSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKCF0aGlzLl9mb3JtRGF0YSkge1xuICAgIHRoaXMuX2Zvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgdGhpcy5fZm9ybURhdGEub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICBkZWJ1ZygnRm9ybURhdGEgZXJyb3InLCBlcnJvcik7XG4gICAgICBpZiAodGhpcy5jYWxsZWQpIHtcbiAgICAgICAgLy8gVGhlIHJlcXVlc3QgaGFzIGFscmVhZHkgZmluaXNoZWQgYW5kIHRoZSBjYWxsYmFjayB3YXMgY2FsbGVkLlxuICAgICAgICAvLyBTaWxlbnRseSBpZ25vcmUgdGhlIGVycm9yLlxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY2FsbGJhY2soZXJyb3IpO1xuICAgICAgdGhpcy5hYm9ydCgpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuX2Zvcm1EYXRhO1xufTtcblxuLyoqXG4gKiBHZXRzL3NldHMgdGhlIGBBZ2VudGAgdG8gdXNlIGZvciB0aGlzIEhUVFAgcmVxdWVzdC4gVGhlIGRlZmF1bHQgKGlmIHRoaXNcbiAqIGZ1bmN0aW9uIGlzIG5vdCBjYWxsZWQpIGlzIHRvIG9wdCBvdXQgb2YgY29ubmVjdGlvbiBwb29saW5nIChgYWdlbnQ6IGZhbHNlYCkuXG4gKlxuICogQHBhcmFtIHtodHRwLkFnZW50fSBhZ2VudFxuICogQHJldHVybiB7aHR0cC5BZ2VudH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUuYWdlbnQgPSBmdW5jdGlvbiAoYWdlbnQpIHtcbiAgaWYgKFxuICAgIGFyZ3VtZW50cy5sZW5ndGggPiAwICYmXG4gICAgYWdlbnQgJiZcbiAgICB0eXBlb2YgYWdlbnQgPT09ICdvYmplY3QnICYmXG4gICAgdHlwZW9mIGFnZW50LmFkZFJlcXVlc3QgIT09ICdmdW5jdGlvbidcbiAgKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICcuYWdlbnQoKSBleHBlY3RzIGFuIGh0dHAocykuQWdlbnQtY29tcGF0aWJsZSBvYmplY3QuIERpZCB5b3UgbWVhbiB0byB1c2UgLmNlcnQoKSBhbmQgLmtleSgpPydcbiAgICApO1xuICB9XG5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHJldHVybiB0aGlzLl9hZ2VudDtcbiAgdGhpcy5fYWdlbnQgPSBhZ2VudDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEdldHMvc2V0cyB0aGUgYGxvb2t1cGAgZnVuY3Rpb24gdG8gdXNlIGN1c3RvbSBETlMgcmVzb2x2ZXIuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gbG9va3VwXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUubG9va3VwID0gZnVuY3Rpb24gKGxvb2t1cCkge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRoaXMuX2xvb2t1cDtcbiAgdGhpcy5fbG9va3VwID0gbG9va3VwO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IF9Db250ZW50LVR5cGVfIHJlc3BvbnNlIGhlYWRlciBwYXNzZWQgdGhyb3VnaCBgbWltZS5nZXRUeXBlKClgLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICAgICAgcmVxdWVzdC5wb3N0KCcvJylcbiAqICAgICAgICAudHlwZSgneG1sJylcbiAqICAgICAgICAuc2VuZCh4bWxzdHJpbmcpXG4gKiAgICAgICAgLmVuZChjYWxsYmFjayk7XG4gKlxuICogICAgICByZXF1ZXN0LnBvc3QoJy8nKVxuICogICAgICAgIC50eXBlKCdqc29uJylcbiAqICAgICAgICAuc2VuZChqc29uc3RyaW5nKVxuICogICAgICAgIC5lbmQoY2FsbGJhY2spO1xuICpcbiAqICAgICAgcmVxdWVzdC5wb3N0KCcvJylcbiAqICAgICAgICAudHlwZSgnYXBwbGljYXRpb24vanNvbicpXG4gKiAgICAgICAgLnNlbmQoanNvbnN0cmluZylcbiAqICAgICAgICAuZW5kKGNhbGxiYWNrKTtcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLnR5cGUgPSBmdW5jdGlvbiAodHlwZSkge1xuICByZXR1cm4gdGhpcy5zZXQoXG4gICAgJ0NvbnRlbnQtVHlwZScsXG4gICAgdHlwZS5pbmNsdWRlcygnLycpID8gdHlwZSA6IG1pbWUuZ2V0VHlwZSh0eXBlKVxuICApO1xufTtcblxuLyoqXG4gKiBTZXQgX0FjY2VwdF8gcmVzcG9uc2UgaGVhZGVyIHBhc3NlZCB0aHJvdWdoIGBtaW1lLmdldFR5cGUoKWAuXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogICAgICBzdXBlcmFnZW50LnR5cGVzLmpzb24gPSAnYXBwbGljYXRpb24vanNvbic7XG4gKlxuICogICAgICByZXF1ZXN0LmdldCgnL2FnZW50JylcbiAqICAgICAgICAuYWNjZXB0KCdqc29uJylcbiAqICAgICAgICAuZW5kKGNhbGxiYWNrKTtcbiAqXG4gKiAgICAgIHJlcXVlc3QuZ2V0KCcvYWdlbnQnKVxuICogICAgICAgIC5hY2NlcHQoJ2FwcGxpY2F0aW9uL2pzb24nKVxuICogICAgICAgIC5lbmQoY2FsbGJhY2spO1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBhY2NlcHRcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5hY2NlcHQgPSBmdW5jdGlvbiAodHlwZSkge1xuICByZXR1cm4gdGhpcy5zZXQoJ0FjY2VwdCcsIHR5cGUuaW5jbHVkZXMoJy8nKSA/IHR5cGUgOiBtaW1lLmdldFR5cGUodHlwZSkpO1xufTtcblxuLyoqXG4gKiBBZGQgcXVlcnktc3RyaW5nIGB2YWxgLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICAgcmVxdWVzdC5nZXQoJy9zaG9lcycpXG4gKiAgICAgLnF1ZXJ5KCdzaXplPTEwJylcbiAqICAgICAucXVlcnkoeyBjb2xvcjogJ2JsdWUnIH0pXG4gKlxuICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSB2YWxcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5xdWVyeSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHRoaXMuX3F1ZXJ5LnB1c2godmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIE9iamVjdC5hc3NpZ24odGhpcy5xcywgdmFsdWUpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFdyaXRlIHJhdyBgZGF0YWAgLyBgZW5jb2RpbmdgIHRvIHRoZSBzb2NrZXQuXG4gKlxuICogQHBhcmFtIHtCdWZmZXJ8U3RyaW5nfSBkYXRhXG4gKiBAcGFyYW0ge1N0cmluZ30gZW5jb2RpbmdcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKGRhdGEsIGVuY29kaW5nKSB7XG4gIGNvbnN0IHJlcXVlc3RfID0gdGhpcy5yZXF1ZXN0KCk7XG4gIGlmICghdGhpcy5fc3RyZWFtUmVxdWVzdCkge1xuICAgIHRoaXMuX3N0cmVhbVJlcXVlc3QgPSB0cnVlO1xuICAgIHRoaXMuX3N0cmVhbVJlc3BvbnNlTGlzdGVuZXIgPSAocmVzKSA9PiB7XG4gICAgICB0aGlzLl9zdHJlYW1SZXNwb25zZSA9IHJlcztcbiAgICB9O1xuICAgIHJlcXVlc3RfLm9uY2UoJ3Jlc3BvbnNlJywgdGhpcy5fc3RyZWFtUmVzcG9uc2VMaXN0ZW5lcik7XG4gIH1cblxuICByZXR1cm4gcmVxdWVzdF8ud3JpdGUoZGF0YSwgZW5jb2RpbmcpO1xufTtcblxuLyoqXG4gKiBQaXBlIHRoZSByZXF1ZXN0IGJvZHkgdG8gYHN0cmVhbWAuXG4gKlxuICogQHBhcmFtIHtTdHJlYW19IHN0cmVhbVxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm4ge1N0cmVhbX1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUucGlwZSA9IGZ1bmN0aW9uIChzdHJlYW0sIG9wdGlvbnMpIHtcbiAgdGhpcy5waXBlZCA9IHRydWU7IC8vIEhBQ0suLi5cbiAgdGhpcy5idWZmZXIoZmFsc2UpO1xuICB0aGlzLmVuZCgpO1xuICByZXR1cm4gdGhpcy5fcGlwZUNvbnRpbnVlKHN0cmVhbSwgb3B0aW9ucyk7XG59O1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5fcGlwZUNvbnRpbnVlID0gZnVuY3Rpb24gKHN0cmVhbSwgb3B0aW9ucykge1xuICB0aGlzLnJlcS5vbmNlKCdyZXNwb25zZScsIChyZXMpID0+IHtcbiAgICAvLyByZWRpcmVjdFxuICAgIGlmIChcbiAgICAgIGlzUmVkaXJlY3QocmVzLnN0YXR1c0NvZGUpICYmXG4gICAgICB0aGlzLl9yZWRpcmVjdHMrKyAhPT0gdGhpcy5fbWF4UmVkaXJlY3RzXG4gICAgKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVkaXJlY3QocmVzKSA9PT0gdGhpc1xuICAgICAgICA/IHRoaXMuX3BpcGVDb250aW51ZShzdHJlYW0sIG9wdGlvbnMpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHRoaXMucmVzID0gcmVzO1xuICAgIHRoaXMuX2VtaXRSZXNwb25zZSgpO1xuICAgIGlmICh0aGlzLl9hYm9ydGVkKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5fc2hvdWxkRGVjb21wcmVzcyhyZXMpKSB7XG4gICAgICBjb25zdCBkZWNvbXByZXNzZXIgPSBjaG9vc2VEZWNvbXByZXNzZXIocmVzKTtcblxuICAgICAgZGVjb21wcmVzc2VyLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ1pfQlVGX0VSUk9SJykge1xuICAgICAgICAgIC8vIHVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUgaXMgaWdub3JlZCBieSBicm93c2VycyBhbmQgY3VybFxuICAgICAgICAgIHN0cmVhbS5lbWl0KCdlbmQnKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcnJvcik7XG4gICAgICB9KTtcbiAgICAgIHJlcy5waXBlKGRlY29tcHJlc3NlcikucGlwZShzdHJlYW0sIG9wdGlvbnMpO1xuICAgICAgLy8gZG9uJ3QgZW1pdCAnZW5kJyB1bnRpbCBkZWNvbXByZXNzZXIgaGFzIGNvbXBsZXRlZCB3cml0aW5nIGFsbCBpdHMgZGF0YS5cbiAgICAgIGRlY29tcHJlc3Nlci5vbmNlKCdlbmQnLCAoKSA9PiB0aGlzLmVtaXQoJ2VuZCcpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzLnBpcGUoc3RyZWFtLCBvcHRpb25zKTtcbiAgICAgIHJlcy5vbmNlKCdlbmQnLCAoKSA9PiB0aGlzLmVtaXQoJ2VuZCcpKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gc3RyZWFtO1xufTtcblxuLyoqXG4gKiBFbmFibGUgLyBkaXNhYmxlIGJ1ZmZlcmluZy5cbiAqXG4gKiBAcmV0dXJuIHtCb29sZWFufSBbdmFsXVxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmJ1ZmZlciA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICB0aGlzLl9idWZmZXIgPSB2YWx1ZSAhPT0gZmFsc2U7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBSZWRpcmVjdCB0byBgdXJsXG4gKlxuICogQHBhcmFtIHtJbmNvbWluZ01lc3NhZ2V9IHJlc1xuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5fcmVkaXJlY3QgPSBmdW5jdGlvbiAocmVzKSB7XG4gIGxldCB1cmwgPSByZXMuaGVhZGVycy5sb2NhdGlvbjtcbiAgaWYgKCF1cmwpIHtcbiAgICByZXR1cm4gdGhpcy5jYWxsYmFjayhuZXcgRXJyb3IoJ05vIGxvY2F0aW9uIGhlYWRlciBmb3IgcmVkaXJlY3QnKSwgcmVzKTtcbiAgfVxuXG4gIGRlYnVnKCdyZWRpcmVjdCAlcyAtPiAlcycsIHRoaXMudXJsLCB1cmwpO1xuXG4gIC8vIGVuc3VyZSB0aGUgcmVzcG9uc2UgaXMgYmVpbmcgY29uc3VtZWRcbiAgLy8gdGhpcyBpcyByZXF1aXJlZCBmb3IgTm9kZSB2MC4xMCtcbiAgcmVzLnJlc3VtZSgpO1xuXG4gIC8vIGxvY2F0aW9uXG4gIC8vXG4gIC8vIFRoZSBMb2NhdGlvbiBoZWFkZXIgaXMgYXR0YWNrZXIgY29udHJvbGxlZDogYSBtYWxmb3JtZWQgdmFsdWUgbXVzdCBub3RcbiAgLy8gdGhyb3cgb3V0IG9mIHRoZSByZXNwb25zZSBldmVudCAod2hpY2ggd291bGQgY3Jhc2ggdGhlIHByb2Nlc3MpLCBhbmQgb25seVxuICAvLyBodHRwKHMpIHRhcmdldHMgbWF5IGJlIGZvbGxvd2VkLiBBIHJlbW90ZSBzZXJ2ZXIgbXVzdCBuZXZlciBiZSBhYmxlIHRvXG4gIC8vIHN0ZWVyIHRoZSBjbGllbnQgaW50byBhIGxvY2FsIFVuaXggZG9tYWluIHNvY2tldCBvciBhbm90aGVyIHNjaGVtZS5cbiAgbGV0IHRhcmdldDtcbiAgbGV0IGN1cnJlbnQ7XG4gIHRyeSB7XG4gICAgY3VycmVudCA9IG5ldyBVUkwod2l0aERlZmF1bHRQcm90b2NvbCh0aGlzLnVybCkpO1xuICAgIHRhcmdldCA9IG5ldyBVUkwodXJsLCBjdXJyZW50KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoYEludmFsaWQgcmVkaXJlY3QgbG9jYXRpb246ICR7dXJsfWApO1xuICAgIGVycm9yLmNvZGUgPSAnRUlOVkFMSURSRURJUkVDVCc7XG4gICAgZXJyb3Iuc3RhdHVzID0gcmVzLnN0YXR1c0NvZGU7XG4gICAgZXJyb3IubG9jYXRpb24gPSB1cmw7XG4gICAgcmV0dXJuIHRoaXMuY2FsbGJhY2soZXJyb3IsIHJlcyk7XG4gIH1cblxuICBpZiAoIWlzQWxsb3dlZFJlZGlyZWN0VGFyZ2V0KGN1cnJlbnQsIHRhcmdldCkpIHtcbiAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihcbiAgICAgIGBVbnN1cHBvcnRlZCBwcm90b2NvbCBpbiByZWRpcmVjdCBsb2NhdGlvbjogJHt0YXJnZXQuaHJlZn1gXG4gICAgKTtcbiAgICBlcnJvci5jb2RlID0gJ0VVTlNVUFBPUlRFRFJFRElSRUNUJztcbiAgICBlcnJvci5zdGF0dXMgPSByZXMuc3RhdHVzQ29kZTtcbiAgICBlcnJvci5sb2NhdGlvbiA9IHVybDtcbiAgICByZXR1cm4gdGhpcy5jYWxsYmFjayhlcnJvciwgcmVzKTtcbiAgfVxuXG4gIHVybCA9IHRhcmdldC5ocmVmO1xuXG4gIHRoaXMuX2VtaXRQcmVSZWRpcmVjdChyZXMpO1xuXG4gIGxldCBoZWFkZXJzID0gdGhpcy5yZXEuZ2V0SGVhZGVycyA/IHRoaXMucmVxLmdldEhlYWRlcnMoKSA6IHRoaXMucmVxLl9oZWFkZXJzO1xuXG4gIGNvbnN0IGNoYW5nZXNPcmlnaW4gPSAhaXNTYW1lT3JpZ2luKGN1cnJlbnQsIHRhcmdldCk7XG5cbiAgLy8gaW1wbGVtZW50YXRpb24gb2YgMzAyIGZvbGxvd2luZyBkZWZhY3RvIHN0YW5kYXJkXG4gIGlmIChyZXMuc3RhdHVzQ29kZSA9PT0gMzAxIHx8IHJlcy5zdGF0dXNDb2RlID09PSAzMDIpIHtcbiAgICAvLyBzdHJpcCBDb250ZW50LSogcmVsYXRlZCBmaWVsZHNcbiAgICAvLyBpbiBjYXNlIG9mIFBPU1QgZXRjXG4gICAgaGVhZGVycyA9IHV0aWxzLmNsZWFuSGVhZGVyKGhlYWRlcnMsIGNoYW5nZXNPcmlnaW4pO1xuXG4gICAgLy8gZm9yY2UgR0VUXG4gICAgdGhpcy5tZXRob2QgPSB0aGlzLm1ldGhvZCA9PT0gJ0hFQUQnID8gJ0hFQUQnIDogJ0dFVCc7XG5cbiAgICAvLyBjbGVhciBkYXRhXG4gICAgdGhpcy5fZGF0YSA9IG51bGw7XG4gIH1cblxuICAvLyAzMDMgaXMgYWx3YXlzIEdFVFxuICBpZiAocmVzLnN0YXR1c0NvZGUgPT09IDMwMykge1xuICAgIC8vIHN0cmlwIENvbnRlbnQtKiByZWxhdGVkIGZpZWxkc1xuICAgIC8vIGluIGNhc2Ugb2YgUE9TVCBldGNcbiAgICBoZWFkZXJzID0gdXRpbHMuY2xlYW5IZWFkZXIoaGVhZGVycywgY2hhbmdlc09yaWdpbik7XG5cbiAgICAvLyBmb3JjZSBtZXRob2RcbiAgICB0aGlzLm1ldGhvZCA9ICdHRVQnO1xuXG4gICAgLy8gY2xlYXIgZGF0YVxuICAgIHRoaXMuX2RhdGEgPSBudWxsO1xuICB9XG5cbiAgLy8gMzA3IHByZXNlcnZlcyBtZXRob2RcbiAgLy8gMzA4IHByZXNlcnZlcyBtZXRob2RcbiAgaWYgKChyZXMuc3RhdHVzQ29kZSA9PT0gMzA3IHx8IHJlcy5zdGF0dXNDb2RlID09PSAzMDgpICYmIGNoYW5nZXNPcmlnaW4pIHtcbiAgICBkZWxldGUgaGVhZGVycy5hdXRob3JpemF0aW9uO1xuICAgIGRlbGV0ZSBoZWFkZXJzLmNvb2tpZTtcbiAgfVxuXG4gIC8vIGNyZWRlbnRpYWxzIGdpdmVuIHdpdGggYC5hdXRoKHVzZXIsIHBhc3MsIHsgdHlwZTogJ2F1dG8nIH0pYCBhcmUgdHVybmVkXG4gIC8vIGludG8gYW4gQXV0aG9yaXphdGlvbiBoZWFkZXIgYnkgZXZlcnkgYHJlcXVlc3QoKWAgY2FsbCwgc28gdGhleSBtdXN0IGJlXG4gIC8vIGRyb3BwZWQgYXMgd2VsbCBvciB0aGV5IHdvdWxkIGJlIHJlLXNlbnQgdG8gdGhlIG5ldyBvcmlnaW5cbiAgaWYgKGNoYW5nZXNPcmlnaW4pIHtcbiAgICB0aGlzLnVzZXJuYW1lID0gdW5kZWZpbmVkO1xuICAgIHRoaXMucGFzc3dvcmQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBkZWxldGUgaGVhZGVycy5ob3N0O1xuXG4gIGRlbGV0ZSB0aGlzLnJlcTtcbiAgZGVsZXRlIHRoaXMuX2Zvcm1EYXRhO1xuXG4gIC8vIHJlbW92ZSBhbGwgYWRkIGhlYWRlciBleGNlcHQgVXNlci1BZ2VudFxuICBfaW5pdEhlYWRlcnModGhpcyk7XG5cbiAgLy8gcmVkaXJlY3RcbiAgdGhpcy5yZXMgPSByZXM7XG4gIHRoaXMuX2VuZENhbGxlZCA9IGZhbHNlO1xuICB0aGlzLnVybCA9IHVybDtcbiAgdGhpcy5xcyA9IHt9O1xuICB0aGlzLl9xdWVyeS5sZW5ndGggPSAwO1xuICB0aGlzLnNldChoZWFkZXJzKTtcbiAgdGhpcy5fZW1pdFJlZGlyZWN0KCk7XG4gIHRoaXMuX3JlZGlyZWN0TGlzdC5wdXNoKHRoaXMudXJsKTtcbiAgdGhpcy5lbmQodGhpcy5fY2FsbGJhY2spO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IEF1dGhvcml6YXRpb24gZmllbGQgdmFsdWUgd2l0aCBgdXNlcmAgYW5kIGBwYXNzYC5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgIC5hdXRoKCd0b2JpJywgJ2xlYXJuYm9vc3QnKVxuICogICAuYXV0aCgndG9iaTpsZWFybmJvb3N0JylcbiAqICAgLmF1dGgoJ3RvYmknKVxuICogICAuYXV0aChhY2Nlc3NUb2tlbiwgeyB0eXBlOiAnYmVhcmVyJyB9KVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB1c2VyXG4gKiBAcGFyYW0ge1N0cmluZ30gW3Bhc3NdXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIG9wdGlvbnMgd2l0aCBhdXRob3JpemF0aW9uIHR5cGUgJ2Jhc2ljJyBvciAnYmVhcmVyJyAoJ2Jhc2ljJyBpcyBkZWZhdWx0KVxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmF1dGggPSBmdW5jdGlvbiAodXNlciwgcGFzcywgb3B0aW9ucykge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkgcGFzcyA9ICcnO1xuICBpZiAodHlwZW9mIHBhc3MgPT09ICdvYmplY3QnICYmIHBhc3MgIT09IG51bGwpIHtcbiAgICAvLyBwYXNzIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgcmVwbGFjZWQgd2l0aCBvcHRpb25zXG4gICAgb3B0aW9ucyA9IHBhc3M7XG4gICAgcGFzcyA9ICcnO1xuICB9XG5cbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHsgdHlwZTogJ2Jhc2ljJyB9O1xuICB9XG5cbiAgY29uc3QgZW5jb2RlciA9IChzdHJpbmcpID0+IEJ1ZmZlci5mcm9tKHN0cmluZykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuXG4gIHJldHVybiB0aGlzLl9hdXRoKHVzZXIsIHBhc3MsIG9wdGlvbnMsIGVuY29kZXIpO1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIGNlcnRpZmljYXRlIGF1dGhvcml0eSBvcHRpb24gZm9yIGh0dHBzIHJlcXVlc3QuXG4gKlxuICogQHBhcmFtIHtCdWZmZXIgfCBBcnJheX0gY2VydFxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmNhID0gZnVuY3Rpb24gKGNlcnQpIHtcbiAgdGhpcy5fY2EgPSBjZXJ0O1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IHRoZSBjbGllbnQgY2VydGlmaWNhdGUga2V5IG9wdGlvbiBmb3IgaHR0cHMgcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0ge0J1ZmZlciB8IFN0cmluZ30gY2VydFxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmtleSA9IGZ1bmN0aW9uIChjZXJ0KSB7XG4gIHRoaXMuX2tleSA9IGNlcnQ7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIGtleSwgY2VydGlmaWNhdGUsIGFuZCBDQSBjZXJ0cyBvZiB0aGUgY2xpZW50IGluIFBGWCBvciBQS0NTMTIgZm9ybWF0LlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyIHwgU3RyaW5nfSBjZXJ0XG4gKiBAcmV0dXJuIHtSZXF1ZXN0fSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUucGZ4ID0gZnVuY3Rpb24gKGNlcnQpIHtcbiAgaWYgKHR5cGVvZiBjZXJ0ID09PSAnb2JqZWN0JyAmJiAhQnVmZmVyLmlzQnVmZmVyKGNlcnQpKSB7XG4gICAgdGhpcy5fcGZ4ID0gY2VydC5wZng7XG4gICAgdGhpcy5fcGFzc3BocmFzZSA9IGNlcnQucGFzc3BocmFzZTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9wZnggPSBjZXJ0O1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldCB0aGUgY2xpZW50IGNlcnRpZmljYXRlIG9wdGlvbiBmb3IgaHR0cHMgcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0ge0J1ZmZlciB8IFN0cmluZ30gY2VydFxuICogQHJldHVybiB7UmVxdWVzdH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJlcXVlc3QucHJvdG90eXBlLmNlcnQgPSBmdW5jdGlvbiAoY2VydCkge1xuICB0aGlzLl9jZXJ0ID0gY2VydDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIERvIG5vdCByZWplY3QgZXhwaXJlZCBvciBpbnZhbGlkIFRMUyBjZXJ0cy5cbiAqIHNldHMgYHJlamVjdFVuYXV0aG9yaXplZD10cnVlYC4gQmUgd2FybmVkIHRoYXQgdGhpcyBhbGxvd3MgTUlUTSBhdHRhY2tzLlxuICpcbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5kaXNhYmxlVExTQ2VydHMgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuX2Rpc2FibGVUTFNDZXJ0cyA9IHRydWU7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gYW4gaHR0cFtzXSByZXF1ZXN0LlxuICpcbiAqIEByZXR1cm4ge091dGdvaW5nTWVzc2FnZX1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG5SZXF1ZXN0LnByb3RvdHlwZS5yZXF1ZXN0ID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5yZXEpIHJldHVybiB0aGlzLnJlcTtcblxuICBjb25zdCBvcHRpb25zID0ge307XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBxdWVyeSA9IHFzLnN0cmluZ2lmeSh0aGlzLnFzLCB7XG4gICAgICBpbmRpY2VzOiBmYWxzZSxcbiAgICAgIHN0cmljdE51bGxIYW5kbGluZzogdHJ1ZVxuICAgIH0pO1xuICAgIGlmIChxdWVyeSkge1xuICAgICAgdGhpcy5xcyA9IHt9O1xuICAgICAgdGhpcy5fcXVlcnkucHVzaChxdWVyeSk7XG4gICAgfVxuXG4gICAgdGhpcy5fZmluYWxpemVRdWVyeVN0cmluZygpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4gdGhpcy5lbWl0KCdlcnJvcicsIGVycik7XG4gIH1cblxuICBjb25zdCB1cmxTdHJpbmcgPSB3aXRoRGVmYXVsdFByb3RvY29sKHRoaXMudXJsKTtcbiAgY29uc3QgcmV0cmllcyA9IHRoaXMuX3JldHJpZXM7XG5cbiAgY29uc3QgcHJvdGVjdGVkVXJsID0gcHJlc2VydmVEb3RTZWdtZW50cyh1cmxTdHJpbmcpO1xuICBjb25zdCB1cmwgPSBuZXcgVVJMKHByb3RlY3RlZFVybC51cmxTdHJpbmcpO1xuICBsZXQgeyBwcm90b2NvbCB9ID0gdXJsO1xuICBjb25zdCBwYXRoID0gcHJvdGVjdGVkVXJsLnJlc3RvcmVQYXRoKGAke3VybC5wYXRobmFtZX0ke3VybC5zZWFyY2h9YCk7XG5cbiAgLy8gc3VwcG9ydCB1bml4IHNvY2tldHNcbiAgaWYgKC9eaHR0cHM/XFwrdW5peDovLnRlc3QocHJvdG9jb2wpID09PSB0cnVlKSB7XG4gICAgLy8gZ2V0IHRoZSBwcm90b2NvbFxuICAgIHByb3RvY29sID0gYCR7cHJvdG9jb2wuc3BsaXQoJysnKVswXX06YDtcblxuICAgIGlmICghdXJsLmhvc3RuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdJbnZhbGlkIHVuaXggc29ja2V0IFVSTDogcGVyY2VudC1lbmNvZGUgdGhlIHNvY2tldCBwYXRoIGJ5IHJlcGxhY2luZyBcIi9cIiB3aXRoIFwiJTJGXCIuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBnZXQgdGhlIHNvY2tldCBwYXRoXG4gICAgb3B0aW9ucy5zb2NrZXRQYXRoID0gdXJsLmhvc3RuYW1lLnJlcGxhY2UoLyUyRi9nLCAnLycpO1xuICAgIHVybC5ob3N0ID0gJyc7XG4gICAgdXJsLmhvc3RuYW1lID0gJyc7XG4gIH1cblxuICAvLyBPdmVycmlkZSBJUCBhZGRyZXNzIG9mIGEgaG9zdG5hbWVcbiAgaWYgKHRoaXMuX2Nvbm5lY3RPdmVycmlkZSkge1xuICAgIGNvbnN0IHsgaG9zdG5hbWUgfSA9IHVybDtcbiAgICAvLyB0aGUgaG9zdG5hbWUgbWF5IGNvbWUgZnJvbSBhIHJlZGlyZWN0LCBzbyBuZXZlciBsZXQgYW4gaW5oZXJpdGVkIGtleVxuICAgIC8vIHN1Y2ggYXMgXCJjb25zdHJ1Y3RvclwiIGFjdCBhcyBhbiBvdmVycmlkZSBlbnRyeVxuICAgIGNvbnN0IG1hdGNoID0gaGFzT3duKHRoaXMuX2Nvbm5lY3RPdmVycmlkZSwgaG9zdG5hbWUpXG4gICAgICA/IHRoaXMuX2Nvbm5lY3RPdmVycmlkZVtob3N0bmFtZV1cbiAgICAgIDogdGhpcy5fY29ubmVjdE92ZXJyaWRlWycqJ107XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICAvLyBiYWNrdXAgdGhlIHJlYWwgaG9zdFxuICAgICAgaWYgKCF0aGlzLl9oZWFkZXIuaG9zdCkge1xuICAgICAgICB0aGlzLnNldCgnaG9zdCcsIHVybC5ob3N0KTtcbiAgICAgIH1cblxuICAgICAgbGV0IG5ld0hvc3Q7XG4gICAgICBsZXQgbmV3UG9ydDtcblxuICAgICAgaWYgKHR5cGVvZiBtYXRjaCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgbmV3SG9zdCA9IG1hdGNoLmhvc3Q7XG4gICAgICAgIG5ld1BvcnQgPSBtYXRjaC5wb3J0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3SG9zdCA9IG1hdGNoO1xuICAgICAgICBuZXdQb3J0ID0gdXJsLnBvcnQ7XG4gICAgICB9XG5cbiAgICAgIC8vIHdyYXAgW2lwdjZdXG4gICAgICB1cmwuaG9zdCA9IC86Ly50ZXN0KG5ld0hvc3QpID8gYFske25ld0hvc3R9XWAgOiBuZXdIb3N0O1xuICAgICAgaWYgKG5ld1BvcnQpIHtcbiAgICAgICAgdXJsLmhvc3QgKz0gYDoke25ld1BvcnR9YDtcbiAgICAgICAgdXJsLnBvcnQgPSBuZXdQb3J0O1xuICAgICAgfVxuXG4gICAgICB1cmwuaG9zdG5hbWUgPSBuZXdIb3N0O1xuICAgIH1cbiAgfVxuXG4gIC8vIG9wdGlvbnNcbiAgb3B0aW9ucy5tZXRob2QgPSB0aGlzLm1ldGhvZDtcbiAgb3B0aW9ucy5wb3J0ID0gdXJsLnBvcnQ7XG4gIG9wdGlvbnMucGF0aCA9IHBhdGg7XG4gIG9wdGlvbnMuaG9zdCA9IHV0aWxzLm5vcm1hbGl6ZUhvc3RuYW1lKHVybC5ob3N0bmFtZSk7IC8vIGV4OiBbOjoxXSAtPiA6OjFcbiAgLy8gQXBwbHkgdXNlciBoZWFkZXJzIGJlZm9yZSBjb25uZWN0aW5nIHNvIGludmFsaWQgdmFsdWVzIChlLmcuIHVuZGVmaW5lZClcbiAgLy8gdGhyb3cgd2l0aG91dCBhbGxvY2F0aW5nIGEgVENQIGhhbmRsZS4gU2VlICMxODI3LlxuICAvLyBIVFRQLzIncyB3cmFwcGVyIGZvcndhcmRzIGxlZnRvdmVyIG9wdGlvbnMgdG8gaHR0cDIuY29ubmVjdCgpLCBzbyBvbmx5XG4gIC8vIGRvIHRoaXMgb24gSFRUUC8xLlxuICBpZiAoIXRoaXMuX2VuYWJsZUh0dHAyKSB7XG4gICAgb3B0aW9ucy5oZWFkZXJzID0geyAuLi50aGlzLmhlYWRlciB9O1xuICB9XG5cbiAgb3B0aW9ucy5jYSA9IHRoaXMuX2NhO1xuICBvcHRpb25zLmtleSA9IHRoaXMuX2tleTtcbiAgb3B0aW9ucy5wZnggPSB0aGlzLl9wZng7XG4gIG9wdGlvbnMuY2VydCA9IHRoaXMuX2NlcnQ7XG4gIG9wdGlvbnMucGFzc3BocmFzZSA9IHRoaXMuX3Bhc3NwaHJhc2U7XG4gIG9wdGlvbnMuYWdlbnQgPSB0aGlzLl9hZ2VudDtcbiAgb3B0aW9ucy5sb29rdXAgPSB0aGlzLl9sb29rdXA7XG4gIG9wdGlvbnMucmVqZWN0VW5hdXRob3JpemVkID1cbiAgICB0eXBlb2YgdGhpcy5fZGlzYWJsZVRMU0NlcnRzID09PSAnYm9vbGVhbidcbiAgICAgID8gIXRoaXMuX2Rpc2FibGVUTFNDZXJ0c1xuICAgICAgOiBwcm9jZXNzLmVudi5OT0RFX1RMU19SRUpFQ1RfVU5BVVRIT1JJWkVEICE9PSAnMCc7XG5cbiAgLy8gQWxsb3dzIHJlcXVlc3QuZ2V0KCdodHRwczovLzEuMi4zLjQvJykuc2V0KCdIb3N0JywgJ2V4YW1wbGUuY29tJylcbiAgaWYgKHRoaXMuX2hlYWRlci5ob3N0KSB7XG4gICAgb3B0aW9ucy5zZXJ2ZXJuYW1lID0gdGhpcy5faGVhZGVyLmhvc3QucmVwbGFjZSgvOlxcZCskLywgJycpO1xuICB9XG5cbiAgaWYgKFxuICAgIHRoaXMuX3RydXN0TG9jYWxob3N0ICYmXG4gICAgL14oPzpsb2NhbGhvc3R8MTI3XFwuMFxcLjBcXC5cXGQrfCgwKjopKzowKjEpJC8udGVzdCh1cmwuaG9zdG5hbWUpXG4gICkge1xuICAgIG9wdGlvbnMucmVqZWN0VW5hdXRob3JpemVkID0gZmFsc2U7XG4gIH1cblxuICAvLyBpbml0aWF0ZSByZXF1ZXN0XG4gIGNvbnN0IG1vZHVsZV8gPSB0aGlzLl9lbmFibGVIdHRwMlxuICAgID8gZXhwb3J0cy5wcm90b2NvbHNbJ2h0dHAyOiddLnNldFByb3RvY29sKHByb3RvY29sKVxuICAgIDogZXhwb3J0cy5wcm90b2NvbHNbcHJvdG9jb2xdO1xuXG4gIC8vIHJlcXVlc3RcbiAgdGhpcy5yZXEgPSBtb2R1bGVfLnJlcXVlc3Qob3B0aW9ucyk7XG4gIGNvbnN0IHsgcmVxIH0gPSB0aGlzO1xuXG4gIC8vIEF0dGFjaCB0aGlzIGJlZm9yZSBoZWFkZXIgc2V0dXAgc28gZGVzdHJveSgpIGR1cmluZyBhIHNldHVwIGV4Y2VwdGlvblxuICAvLyBjYW5ub3QgZW1pdCBhbiB1bmhhbmRsZWQgJ2Vycm9yJyAob3IgYSBzZWNvbmQgY2FsbGJhY2spLlxuICByZXEub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgLy8gZmxhZyBhYm9ydGlvbiBoZXJlIGZvciBvdXQgdGltZW91dHNcbiAgICAvLyBiZWNhdXNlIG5vZGUgd2lsbCBlbWl0IGEgZmF1eC1lcnJvciBcInNvY2tldCBoYW5nIHVwXCJcbiAgICAvLyB3aGVuIHJlcXVlc3QgaXMgYWJvcnRlZCBiZWZvcmUgYSBjb25uZWN0aW9uIGlzIG1hZGVcbiAgICBpZiAodGhpcy5fYWJvcnRlZCB8fCB0aGlzLl9yZXF1ZXN0RGlzcG9zZWQpIHJldHVybjtcbiAgICAvLyBpZiBub3QgdGhlIHNhbWUsIHdlIGFyZSBpbiB0aGUgKipvbGQqKiAoY2FuY2VsbGVkKSByZXF1ZXN0LFxuICAgIC8vIHNvIG5lZWQgdG8gY29udGludWUgKHNhbWUgYXMgZm9yIGFib3ZlKVxuICAgIGlmICh0aGlzLl9yZXRyaWVzICE9PSByZXRyaWVzKSByZXR1cm47XG4gICAgLy8gaWYgd2UndmUgcmVjZWl2ZWQgYSByZXNwb25zZSB0aGVuIHdlIGRvbid0IHdhbnQgdG8gbGV0XG4gICAgLy8gYW4gZXJyb3IgaW4gdGhlIHJlcXVlc3QgYmxvdyB1cCB0aGUgcmVzcG9uc2VcbiAgICBpZiAodGhpcy5yZXNwb25zZSkgcmV0dXJuO1xuICAgIHRoaXMuY2FsbGJhY2soZXJyb3IpO1xuICB9KTtcblxuICB0cnkge1xuICAgIC8vIHNldCB0Y3Agbm8gZGVsYXlcbiAgICByZXEuc2V0Tm9EZWxheSh0cnVlKTtcblxuICAgIGlmIChvcHRpb25zLm1ldGhvZCAhPT0gJ0hFQUQnKSB7XG4gICAgICByZXEuc2V0SGVhZGVyKCdBY2NlcHQtRW5jb2RpbmcnLCAnZ3ppcCwgZGVmbGF0ZScpO1xuICAgIH1cblxuICAgIHRoaXMucHJvdG9jb2wgPSBwcm90b2NvbDtcbiAgICB0aGlzLmhvc3QgPSB1cmwuaG9zdDtcblxuICAgIC8vIGV4cG9zZSBldmVudHNcbiAgICBjb25zdCBlbWl0RHJhaW4gPSAoKSA9PiB7XG4gICAgICB0aGlzLmVtaXQoJ2RyYWluJyk7XG4gICAgfTtcblxuICAgIHJlcS5vbignZHJhaW4nLCBlbWl0RHJhaW4pO1xuICAgIHJlcS5vbmNlKCdjbG9zZScsICgpID0+IHtcbiAgICAgIHJlcS5yZW1vdmVMaXN0ZW5lcignZHJhaW4nLCBlbWl0RHJhaW4pO1xuICAgIH0pO1xuXG4gICAgLy8gYXV0aFxuICAgIGlmICh1cmwudXNlcm5hbWUgfHwgdXJsLnBhc3N3b3JkKSB7XG4gICAgICB0aGlzLmF1dGgodXJsLnVzZXJuYW1lLCB1cmwucGFzc3dvcmQpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnVzZXJuYW1lICYmIHRoaXMucGFzc3dvcmQpIHtcbiAgICAgIHRoaXMuYXV0aCh0aGlzLnVzZXJuYW1lLCB0aGlzLnBhc3N3b3JkKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmhlYWRlcikge1xuICAgICAgaWYgKGhhc093bih0aGlzLmhlYWRlciwga2V5KSkgcmVxLnNldEhlYWRlcihrZXksIHRoaXMuaGVhZGVyW2tleV0pO1xuICAgIH1cblxuICAgIC8vIGFkZCBjb29raWVzXG4gICAgaWYgKHRoaXMuY29va2llcykge1xuICAgICAgaWYgKGhhc093bih0aGlzLl9oZWFkZXIsICdjb29raWUnKSkge1xuICAgICAgICAvLyBtZXJnZVxuICAgICAgICBjb25zdCB0ZW1wb3JhcnlKYXIgPSBuZXcgQ29va2llSmFyLkNvb2tpZUphcigpO1xuICAgICAgICB0ZW1wb3JhcnlKYXIuc2V0Q29va2llcyh0aGlzLl9oZWFkZXIuY29va2llLnNwbGl0KCc7ICcpKTtcbiAgICAgICAgdGVtcG9yYXJ5SmFyLnNldENvb2tpZXModGhpcy5jb29raWVzLnNwbGl0KCc7ICcpKTtcbiAgICAgICAgcmVxLnNldEhlYWRlcihcbiAgICAgICAgICAnQ29va2llJyxcbiAgICAgICAgICB0ZW1wb3JhcnlKYXJcbiAgICAgICAgICAgIC5nZXRDb29raWVzKENvb2tpZUphci5Db29raWVBY2Nlc3NJbmZvLkFsbClcbiAgICAgICAgICAgIC50b1ZhbHVlU3RyaW5nKClcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlcS5zZXRIZWFkZXIoJ0Nvb2tpZScsIHRoaXMuY29va2llcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZGlzcG9zZU5vZGVSZXF1ZXN0KHRoaXMpO1xuICAgIHRocm93IGVycjtcbiAgfVxufTtcblxuLyoqXG4gKiBBYm9ydC9lbmQgdGhlIE5vZGUgcmVxdWVzdCBpZiBpdCB3YXMgY3JlYXRlZC5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuUmVxdWVzdC5wcm90b3R5cGUuX2Rpc3Bvc2VSZXF1ZXN0ID0gZnVuY3Rpb24gKCkge1xuICBkaXNwb3NlTm9kZVJlcXVlc3QodGhpcyk7XG59O1xuXG4vKipcbiAqIFJlcG9ydCBhIHNldHVwL3JlcXVlc3QtcGF0aCBlcnJvciB3aXRob3V0IGxlYXZpbmcgdGhlIHNvY2tldCBvcGVuLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVycm9yXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuUmVxdWVzdC5wcm90b3R5cGUuX2ZhaWxSZXF1ZXN0ID0gZnVuY3Rpb24gKGVycm9yKSB7XG4gIHRoaXMuX2Rpc3Bvc2VSZXF1ZXN0KCk7XG4gIGlmICh0eXBlb2YgdGhpcy5fY2FsbGJhY2sgPT09ICdmdW5jdGlvbicgJiYgdGhpcy5fY2FsbGJhY2sgIT09IG5vb3ApIHtcbiAgICB0aGlzLmNhbGxiYWNrKGVycm9yKTtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aHJvdyBlcnJvcjtcbn07XG5cbi8qKlxuICogSW52b2tlIHRoZSBjYWxsYmFjayB3aXRoIGBlcnJgIGFuZCBgcmVzYFxuICogYW5kIGhhbmRsZSBhcml0eSBjaGVjay5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEBwYXJhbSB7UmVzcG9uc2V9IHJlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuUmVxdWVzdC5wcm90b3R5cGUuY2FsbGJhY2sgPSBmdW5jdGlvbiAoZXJyb3IsIHJlcykge1xuICBpZiAodGhpcy5fc2hvdWxkUmV0cnkoZXJyb3IsIHJlcykpIHtcbiAgICByZXR1cm4gdGhpcy5fcmV0cnkoKTtcbiAgfVxuXG4gIC8vIEF2b2lkIHRoZSBlcnJvciB3aGljaCBpcyBlbWl0dGVkIGZyb20gJ3NvY2tldCBoYW5nIHVwJyB0byBjYXVzZSB0aGUgZm4gdW5kZWZpbmVkIGVycm9yIG9uIEpTIHJ1bnRpbWUuXG4gIGNvbnN0IGZuID0gdGhpcy5fY2FsbGJhY2sgfHwgbm9vcDtcbiAgdGhpcy5jbGVhclRpbWVvdXQoKTtcbiAgaWYgKHRoaXMuY2FsbGVkKSB7XG4gICAgaWYgKHRoaXMudGltZWRvdXQpIHJldHVybjtcbiAgICByZXR1cm4gY29uc29sZS53YXJuKCdzdXBlcmFnZW50OiBkb3VibGUgY2FsbGJhY2sgYnVnJyk7XG4gIH1cblxuICB0aGlzLmNhbGxlZCA9IHRydWU7XG5cbiAgaWYgKCFlcnJvcikge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIXRoaXMuX2lzUmVzcG9uc2VPSyhyZXMpKSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gJ1Vuc3VjY2Vzc2Z1bCBIVFRQIHJlc3BvbnNlJztcbiAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgIG1lc3NhZ2UgPSBodHRwLlNUQVRVU19DT0RFU1tyZXMuc3RhdHVzXSB8fCBtZXNzYWdlO1xuICAgICAgICB9XG5cbiAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgICAgIGVycm9yLnN0YXR1cyA9IHJlcyA/IHJlcy5zdGF0dXMgOiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBlcnJvciA9IGVycjtcbiAgICAgIGVycm9yLnN0YXR1cyA9IGVycm9yLnN0YXR1cyB8fCAocmVzID8gcmVzLnN0YXR1cyA6IHVuZGVmaW5lZCk7XG4gICAgfVxuICB9XG5cbiAgLy8gSXQncyBpbXBvcnRhbnQgdGhhdCB0aGUgY2FsbGJhY2sgaXMgY2FsbGVkIG91dHNpZGUgdHJ5L2NhdGNoXG4gIC8vIHRvIGF2b2lkIGRvdWJsZSBjYWxsYmFja1xuICBpZiAoIWVycm9yKSB7XG4gICAgcmV0dXJuIGZuKG51bGwsIHJlcyk7XG4gIH1cblxuICBlcnJvci5yZXNwb25zZSA9IHJlcztcbiAgaWYgKHRoaXMuX21heFJldHJpZXMpIGVycm9yLnJldHJpZXMgPSB0aGlzLl9yZXRyaWVzIC0gMTtcblxuICAvLyBvbmx5IGVtaXQgZXJyb3IgZXZlbnQgaWYgdGhlcmUgaXMgYSBsaXN0ZW5lclxuICAvLyBvdGhlcndpc2Ugd2UgYXNzdW1lIHRoZSBjYWxsYmFjayB0byBgLmVuZCgpYCB3aWxsIGdldCB0aGUgZXJyb3JcbiAgaWYgKGVycm9yICYmIHRoaXMubGlzdGVuZXJzKCdlcnJvcicpLmxlbmd0aCA+IDApIHtcbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyb3IpO1xuICB9XG5cbiAgZm4oZXJyb3IsIHJlcyk7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIGBvYmpgIGlzIGEgaG9zdCBvYmplY3QsXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBob3N0IG9iamVjdFxuICogQHJldHVybiB7Qm9vbGVhbn0gaXMgYSBob3N0IG9iamVjdFxuICogQGFwaSBwcml2YXRlXG4gKi9cblJlcXVlc3QucHJvdG90eXBlLl9pc0hvc3QgPSBmdW5jdGlvbiAob2JqZWN0KSB7XG4gIHJldHVybiAoXG4gICAgQnVmZmVyLmlzQnVmZmVyKG9iamVjdCkgfHxcbiAgICBvYmplY3QgaW5zdGFuY2VvZiBTdHJlYW0gfHxcbiAgICBvYmplY3QgaW5zdGFuY2VvZiBGb3JtRGF0YVxuICApO1xufTtcblxuLyoqXG4gKiBJbml0aWF0ZSByZXF1ZXN0LCBpbnZva2luZyBjYWxsYmFjayBgZm4oZXJyLCByZXMpYFxuICogd2l0aCBhbiBpbnN0YW5jZW9mIGBSZXNwb25zZWAuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEByZXR1cm4ge1JlcXVlc3R9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5fZW1pdFJlc3BvbnNlID0gZnVuY3Rpb24gKGJvZHksIGZpbGVzKSB7XG4gIGNvbnN0IHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKHRoaXMpO1xuICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gIHJlc3BvbnNlLnJlZGlyZWN0cyA9IHRoaXMuX3JlZGlyZWN0TGlzdDtcbiAgaWYgKHVuZGVmaW5lZCAhPT0gYm9keSkge1xuICAgIHJlc3BvbnNlLmJvZHkgPSBib2R5O1xuICB9XG5cbiAgcmVzcG9uc2UuZmlsZXMgPSBmaWxlcztcbiAgaWYgKHRoaXMuX2VuZENhbGxlZCkge1xuICAgIHJlc3BvbnNlLnBpcGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiZW5kKCkgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQsIHNvIGl0J3MgdG9vIGxhdGUgdG8gc3RhcnQgcGlwaW5nXCJcbiAgICAgICk7XG4gICAgfTtcbiAgfVxuXG4gIHRoaXMuZW1pdCgncmVzcG9uc2UnLCByZXNwb25zZSk7XG4gIHJldHVybiByZXNwb25zZTtcbn07XG5cbi8qKlxuICogRW1pdCBgcmVkaXJlY3RgIGV2ZW50LCBwYXNzaW5nIGFuIGluc3RhbmNlb2YgYFJlc3BvbnNlYC5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5fZW1pdFJlZGlyZWN0ID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCByZXNwb25zZSA9IG5ldyBSZXNwb25zZSh0aGlzKTtcbiAgcmVzcG9uc2UucmVkaXJlY3RzID0gdGhpcy5fcmVkaXJlY3RMaXN0O1xuICB0aGlzLmVtaXQoJ3JlZGlyZWN0JywgcmVzcG9uc2UpO1xufTtcblxuLyoqXG4gKiBFbWl0IGEgcmVkaXJlY3QgcmVzcG9uc2UgYmVmb3JlIHRoZSByZXF1ZXN0IFVSTCBpcyBjaGFuZ2VkLlxuICpcbiAqIEBwYXJhbSB7SW5jb21pbmdNZXNzYWdlfSByZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblJlcXVlc3QucHJvdG90eXBlLl9lbWl0UHJlUmVkaXJlY3QgPSBmdW5jdGlvbiAocmVzKSB7XG4gIHRoaXMucmVzID0gcmVzO1xuICBjb25zdCByZXNwb25zZSA9IG5ldyBSZXNwb25zZSh0aGlzKTtcbiAgcmVzcG9uc2UucmVkaXJlY3RzID0gdGhpcy5fcmVkaXJlY3RMaXN0O1xuICB0aGlzLmVtaXQoJ3ByZS1yZWRpcmVjdCcsIHJlc3BvbnNlKTtcbn07XG5cblJlcXVlc3QucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uIChmbikge1xuICB0cnkge1xuICAgIHRoaXMucmVxdWVzdCgpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aGlzLl9lbmRDYWxsZWQgPSB0cnVlO1xuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMuX2NhbGxiYWNrID0gZm47XG4gICAgICB0aGlzLmNhbGxiYWNrKGVycik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhyb3cgZXJyO1xuICB9XG5cbiAgZGVidWcoJyVzICVzJywgdGhpcy5tZXRob2QsIHRoaXMudXJsKTtcblxuICBpZiAodGhpcy5fZW5kQ2FsbGVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJy5lbmQoKSB3YXMgY2FsbGVkIHR3aWNlLiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gc3VwZXJhZ2VudCdcbiAgICApO1xuICB9XG5cbiAgdGhpcy5fZW5kQ2FsbGVkID0gdHJ1ZTtcblxuICAvLyBzdG9yZSBjYWxsYmFja1xuICB0aGlzLl9jYWxsYmFjayA9IGZuIHx8IG5vb3A7XG5cbiAgdGhpcy5fZW5kKCk7XG59O1xuXG5SZXF1ZXN0LnByb3RvdHlwZS5fZW5kID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5fYWJvcnRlZClcbiAgICByZXR1cm4gdGhpcy5jYWxsYmFjayhcbiAgICAgIG5ldyBFcnJvcignVGhlIHJlcXVlc3QgaGFzIGJlZW4gYWJvcnRlZCBldmVuIGJlZm9yZSAuZW5kKCkgd2FzIGNhbGxlZCcpXG4gICAgKTtcblxuICBsZXQgZGF0YSA9IHRoaXMuX2RhdGE7XG4gIGNvbnN0IHsgcmVxIH0gPSB0aGlzO1xuICBjb25zdCB7IG1ldGhvZCB9ID0gdGhpcztcblxuICB0aGlzLl9zZXRUaW1lb3V0cygpO1xuXG4gIC8vIGJvZHlcbiAgaWYgKG1ldGhvZCAhPT0gJ0hFQUQnICYmICFyZXEuX2hlYWRlclNlbnQpIHtcbiAgICB0cnkge1xuICAgICAgLy8gc2VyaWFsaXplIHN0dWZmXG4gICAgICBpZiAodHlwZW9mIGRhdGEgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGxldCBjb250ZW50VHlwZSA9IHJlcS5nZXRIZWFkZXIoJ0NvbnRlbnQtVHlwZScpO1xuICAgICAgICAvLyBQYXJzZSBvdXQganVzdCB0aGUgY29udGVudCB0eXBlIGZyb20gdGhlIGhlYWRlciAoaWdub3JlIHRoZSBjaGFyc2V0KVxuICAgICAgICBpZiAoY29udGVudFR5cGUpIGNvbnRlbnRUeXBlID0gY29udGVudFR5cGUuc3BsaXQoJzsnKVswXTtcbiAgICAgICAgbGV0IHNlcmlhbGl6ZSA9XG4gICAgICAgICAgdGhpcy5fc2VyaWFsaXplciB8fFxuICAgICAgICAgIChoYXNPd24oZXhwb3J0cy5zZXJpYWxpemUsIGNvbnRlbnRUeXBlKVxuICAgICAgICAgICAgPyBleHBvcnRzLnNlcmlhbGl6ZVtjb250ZW50VHlwZV1cbiAgICAgICAgICAgIDogdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKCFzZXJpYWxpemUgJiYgaXNKU09OKGNvbnRlbnRUeXBlKSkge1xuICAgICAgICAgIHNlcmlhbGl6ZSA9IGV4cG9ydHMuc2VyaWFsaXplWydhcHBsaWNhdGlvbi9qc29uJ107XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2VyaWFsaXplKSBkYXRhID0gc2VyaWFsaXplKGRhdGEpO1xuICAgICAgfVxuXG4gICAgICAvLyBjb250ZW50LWxlbmd0aFxuICAgICAgaWYgKGRhdGEgJiYgIXJlcS5nZXRIZWFkZXIoJ0NvbnRlbnQtTGVuZ3RoJykpIHtcbiAgICAgICAgcmVxLnNldEhlYWRlcihcbiAgICAgICAgICAnQ29udGVudC1MZW5ndGgnLFxuICAgICAgICAgIEJ1ZmZlci5pc0J1ZmZlcihkYXRhKSA/IGRhdGEubGVuZ3RoIDogQnVmZmVyLmJ5dGVMZW5ndGgoZGF0YSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiB0aGlzLl9mYWlsUmVxdWVzdChlcnIpO1xuICAgIH1cbiAgfVxuXG4gIGxldCBzdHJlYW1SZXNwb25zZTtcbiAgaWYgKHRoaXMuX3N0cmVhbVJlc3BvbnNlTGlzdGVuZXIpIHtcbiAgICByZXEucmVtb3ZlTGlzdGVuZXIoJ3Jlc3BvbnNlJywgdGhpcy5fc3RyZWFtUmVzcG9uc2VMaXN0ZW5lcik7XG4gICAgdGhpcy5fc3RyZWFtUmVzcG9uc2VMaXN0ZW5lciA9IHVuZGVmaW5lZDtcbiAgICBzdHJlYW1SZXNwb25zZSA9IHRoaXMuX3N0cmVhbVJlc3BvbnNlO1xuICAgIHRoaXMuX3N0cmVhbVJlc3BvbnNlID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLy8gcmVzcG9uc2VcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbiAgY29uc3QgaGFuZGxlUmVzcG9uc2UgPSAocmVzKSA9PiB7XG4gICAgZGVidWcoJyVzICVzIC0+ICVzJywgdGhpcy5tZXRob2QsIHRoaXMudXJsLCByZXMuc3RhdHVzQ29kZSk7XG5cbiAgICBpZiAodGhpcy5fcmVzcG9uc2VUaW1lb3V0VGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9yZXNwb25zZVRpbWVvdXRUaW1lcik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGlwZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBtYXggPSB0aGlzLl9tYXhSZWRpcmVjdHM7XG4gICAgY29uc3QgbWltZSA9IHV0aWxzLnR5cGUocmVzLmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddIHx8ICcnKSB8fCAndGV4dC9wbGFpbic7XG4gICAgbGV0IHR5cGUgPSBtaW1lLnNwbGl0KCcvJylbMF07XG4gICAgaWYgKHR5cGUpIHR5cGUgPSB0eXBlLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgIGNvbnN0IG11bHRpcGFydCA9IHR5cGUgPT09ICdtdWx0aXBhcnQnO1xuICAgIGNvbnN0IHJlZGlyZWN0ID0gaXNSZWRpcmVjdChyZXMuc3RhdHVzQ29kZSk7XG4gICAgY29uc3QgcmVzcG9uc2VUeXBlID0gdGhpcy5fcmVzcG9uc2VUeXBlO1xuXG4gICAgdGhpcy5yZXMgPSByZXM7XG5cbiAgICAvLyByZWRpcmVjdFxuICAgIGlmIChyZWRpcmVjdCAmJiB0aGlzLl9yZWRpcmVjdHMrKyAhPT0gbWF4KSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVkaXJlY3QocmVzKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5tZXRob2QgPT09ICdIRUFEJykge1xuICAgICAgdGhpcy5lbWl0KCdlbmQnKTtcbiAgICAgIHRoaXMuY2FsbGJhY2sobnVsbCwgdGhpcy5fZW1pdFJlc3BvbnNlKCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHpsaWIgc3VwcG9ydFxuICAgIGxldCBkZWNvbXByZXNzZXIgPSBudWxsO1xuICAgIGlmICh0aGlzLl9zaG91bGREZWNvbXByZXNzKHJlcykpIHtcbiAgICAgIGRlY29tcHJlc3NlciA9IGRlY29tcHJlc3MocmVxLCByZXMpO1xuICAgIH1cblxuICAgIGxldCBidWZmZXIgPSB0aGlzLl9idWZmZXI7XG4gICAgaWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkICYmIGhhc093bihleHBvcnRzLmJ1ZmZlciwgbWltZSkpIHtcbiAgICAgIGJ1ZmZlciA9IEJvb2xlYW4oZXhwb3J0cy5idWZmZXJbbWltZV0pO1xuICAgIH1cblxuICAgIGxldCBwYXJzZXIgPSB0aGlzLl9wYXJzZXI7XG4gICAgaWYgKHVuZGVmaW5lZCA9PT0gYnVmZmVyICYmIHBhcnNlcikge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcIkEgY3VzdG9tIHN1cGVyYWdlbnQgcGFyc2VyIGhhcyBiZWVuIHNldCwgYnV0IGJ1ZmZlcmluZyBzdHJhdGVneSBmb3IgdGhlIHBhcnNlciBoYXNuJ3QgYmVlbiBjb25maWd1cmVkLiBDYWxsIGByZXEuYnVmZmVyKHRydWUgb3IgZmFsc2UpYCBvciBzZXQgYHN1cGVyYWdlbnQuYnVmZmVyW21pbWVdID0gdHJ1ZSBvciBmYWxzZWBcIlxuICAgICAgKTtcbiAgICAgIGJ1ZmZlciA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJzZXIpIHtcbiAgICAgIGlmIChyZXNwb25zZVR5cGUpIHtcbiAgICAgICAgcGFyc2VyID0gZXhwb3J0cy5wYXJzZS5pbWFnZTsgLy8gSXQncyBhY3R1YWxseSBhIGdlbmVyaWMgQnVmZmVyXG4gICAgICAgIGJ1ZmZlciA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKG11bHRpcGFydCkge1xuICAgICAgICBjb25zdCBmb3JtID0gZm9ybWlkYWJsZS5mb3JtaWRhYmxlKCk7XG4gICAgICAgIHBhcnNlciA9IChyZXMsIGNhbGxiYWNrKSA9PiB7XG4gICAgICAgICAgLy8gQ3JlYXRlIGEgUGFzc1Rocm91Z2ggc3RyZWFtIHRoYXQgYWN0cyBhcyBhIHByb3BlciBIVFRQIHJlcXVlc3RcbiAgICAgICAgICBjb25zdCBicmlkZ2VTdHJlYW0gPSBuZXcgU3RyZWFtLlBhc3NUaHJvdWdoKCk7XG5cbiAgICAgICAgICAvLyBBZGQgSFRUUCByZXF1ZXN0IHByb3BlcnRpZXMgZnJvbSB0aGUgY3VycmVudCByZXF1ZXN0IGNvbnRleHRcbiAgICAgICAgICBicmlkZ2VTdHJlYW0ubWV0aG9kID0gdGhpcy5tZXRob2QgfHwgJ1BPU1QnO1xuICAgICAgICAgIGJyaWRnZVN0cmVhbS51cmwgPSB0aGlzLnVybCB8fCAnLyc7XG4gICAgICAgICAgYnJpZGdlU3RyZWFtLmh0dHBWZXJzaW9uID0gcmVzLmh0dHBWZXJzaW9uIHx8ICcxLjEnO1xuICAgICAgICAgIGJyaWRnZVN0cmVhbS5oZWFkZXJzID0gcmVzLmhlYWRlcnMgfHwge307XG4gICAgICAgICAgYnJpZGdlU3RyZWFtLnNvY2tldCA9IHJlcy5zb2NrZXQgfHwgeyByZWFkYWJsZTogdHJ1ZSB9O1xuXG4gICAgICAgICAgLy8gUGlwZSB0aGUgcmVzcG9uc2UgZGF0YSB0aHJvdWdoIHRoZSBicmlkZ2Ugc3RyZWFtXG4gICAgICAgICAgcmVzLnBpcGUoYnJpZGdlU3RyZWFtKTtcblxuICAgICAgICAgIGZvcm0ucGFyc2UoYnJpZGdlU3RyZWFtLCAoZXJyLCBmaWVsZHMsIGZpbGVzKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcblxuICAgICAgICAgICAgLy8gRm9ybWlkYWJsZSB2MyBhbHdheXMgcmV0dXJucyBhcnJheXMsIGJ1dCBTdXBlckFnZW50IGV4cGVjdHMgc2luZ2xlIHZhbHVlc1xuICAgICAgICAgICAgLy8gRmxhdHRlbiBzaW5nbGUtaXRlbSBhcnJheXMgdG8gbWFpbnRhaW4gYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgY29uc3QgZmxhdHRlbmVkRmllbGRzID0ge307XG4gICAgICAgICAgICBpZiAoZmllbGRzKSB7XG4gICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIGZpZWxkcykge1xuICAgICAgICAgICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGZpZWxkcywga2V5KSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBmaWVsZHNba2V5XTtcbiAgICAgICAgICAgICAgICBmbGF0dGVuZWRGaWVsZHNba2V5XSA9XG4gICAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDEgPyB2YWx1ZVswXSA6IHZhbHVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGZsYXR0ZW5lZEZpbGVzID0ge307XG4gICAgICAgICAgICBpZiAoZmlsZXMpIHtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZmlsZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChmaWxlcywga2V5KSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBmaWxlc1trZXldO1xuICAgICAgICAgICAgICAgIGZsYXR0ZW5lZEZpbGVzW2tleV0gPVxuICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAxID8gdmFsdWVbMF0gOiB2YWx1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBSZXR1cm4gZmxhdHRlbmVkIGZpZWxkcyBhcyB0aGUgb2JqZWN0IHBhcmFtZXRlciB0byBtYXRjaCBTdXBlckFnZW50J3MgZXhwZWN0ZWQgZm9ybWF0XG4gICAgICAgICAgICBjYWxsYmFjayhudWxsLCBmbGF0dGVuZWRGaWVsZHMsIGZsYXR0ZW5lZEZpbGVzKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBidWZmZXIgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChpc0JpbmFyeShtaW1lKSkge1xuICAgICAgICBwYXJzZXIgPSBleHBvcnRzLnBhcnNlLmltYWdlO1xuICAgICAgICBidWZmZXIgPSBidWZmZXIgIT09IGZhbHNlOyAvLyBGb3IgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgYnVmZmVyaW5nIGRlZmF1bHQgaXMgYWQtaG9jIE1JTUUtZGVwZW5kZW50XG4gICAgICB9IGVsc2UgaWYgKGhhc093bihleHBvcnRzLnBhcnNlLCBtaW1lKSkge1xuICAgICAgICAvLyBgbWltZWAgaXMgYXR0YWNrZXIgY29udHJvbGxlZDsgYW4gaW5oZXJpdGVkIGtleSBzdWNoIGFzXG4gICAgICAgIC8vIFwiY29uc3RydWN0b3JcIiBtdXN0IG5vdCByZXNvbHZlIHRvIGEgcGFyc2VyXG4gICAgICAgIHBhcnNlciA9IGV4cG9ydHMucGFyc2VbbWltZV07XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICBwYXJzZXIgPSBleHBvcnRzLnBhcnNlLnRleHQ7XG4gICAgICAgIGJ1ZmZlciA9IGJ1ZmZlciAhPT0gZmFsc2U7XG4gICAgICAgIC8vIGV2ZXJ5b25lIHdhbnRzIHRoZWlyIG93biB3aGl0ZS1sYWJlbGVkIGpzb25cbiAgICAgIH0gZWxzZSBpZiAoaXNKU09OKG1pbWUpKSB7XG4gICAgICAgIHBhcnNlciA9IGV4cG9ydHMucGFyc2VbJ2FwcGxpY2F0aW9uL2pzb24nXTtcbiAgICAgICAgYnVmZmVyID0gYnVmZmVyICE9PSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAoYnVmZmVyKSB7XG4gICAgICAgIHBhcnNlciA9IGV4cG9ydHMucGFyc2UudGV4dDtcbiAgICAgIH0gZWxzZSBpZiAodW5kZWZpbmVkID09PSBidWZmZXIpIHtcbiAgICAgICAgcGFyc2VyID0gZXhwb3J0cy5wYXJzZS5pbWFnZTsgLy8gSXQncyBhY3R1YWxseSBhIGdlbmVyaWMgQnVmZmVyXG4gICAgICAgIGJ1ZmZlciA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gYnkgZGVmYXVsdCBvbmx5IGJ1ZmZlciB0ZXh0LyosIGpzb24gYW5kIG1lc3NlZCB1cCB0aGluZyBmcm9tIGhlbGxcbiAgICBpZiAoKHVuZGVmaW5lZCA9PT0gYnVmZmVyICYmIGlzVGV4dChtaW1lKSkgfHwgaXNKU09OKG1pbWUpKSB7XG4gICAgICBidWZmZXIgPSB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMuX3Jlc0J1ZmZlcmVkID0gYnVmZmVyO1xuICAgIGxldCBwYXJzZXJIYW5kbGVzRW5kID0gZmFsc2U7XG4gICAgaWYgKGJ1ZmZlcikge1xuICAgICAgLy8gUHJvdGVjdGlvbiBhZ2FpbnN0IHppcCBib21icyBhbmQgb3RoZXIgbnVpc2FuY2VcbiAgICAgIGxldCByZXNwb25zZUJ5dGVzTGVmdCA9IHRoaXMuX21heFJlc3BvbnNlU2l6ZSB8fCAyMDAwMDAwMDA7XG4gICAgICBsZXQgZXhjZWVkZWQgPSBmYWxzZTtcbiAgICAgIHJlcy5vbignZGF0YScsIChidWYpID0+IHtcbiAgICAgICAgaWYgKGV4Y2VlZGVkKSByZXR1cm47XG4gICAgICAgIC8vIFBhcnNlcnMgbWF5IGhhdmUgY2FsbGVkIGBzZXRFbmNvZGluZygpYCwgaW4gd2hpY2ggY2FzZSBjaHVua3MgYXJlXG4gICAgICAgIC8vIHN0cmluZ3M6IGNvdW50IHRoZWlyIGVuY29kZWQgc2l6ZSByYXRoZXIgdGhhbiB0aGVpciBVVEYtMTYgbGVuZ3RoXG4gICAgICAgIHJlc3BvbnNlQnl0ZXNMZWZ0IC09IEJ1ZmZlci5pc0J1ZmZlcihidWYpXG4gICAgICAgICAgPyBidWYubGVuZ3RoXG4gICAgICAgICAgOiBCdWZmZXIuYnl0ZUxlbmd0aChTdHJpbmcoYnVmKSk7XG4gICAgICAgIGlmIChyZXNwb25zZUJ5dGVzTGVmdCA8IDApIHtcbiAgICAgICAgICBleGNlZWRlZCA9IHRydWU7XG4gICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ01heGltdW0gcmVzcG9uc2Ugc2l6ZSByZWFjaGVkJyk7XG4gICAgICAgICAgZXJyb3IuY29kZSA9ICdFVE9PTEFSR0UnO1xuICAgICAgICAgIC8vIFBhcnNlcnMgYXJlbid0IHJlcXVpcmVkIHRvIG9ic2VydmUgZXJyb3IgZXZlbnQsXG4gICAgICAgICAgLy8gc28gd291bGQgaW5jb3JyZWN0bHkgcmVwb3J0IHN1Y2Nlc3NcbiAgICAgICAgICBwYXJzZXJIYW5kbGVzRW5kID0gZmFsc2U7XG4gICAgICAgICAgLy8gQSBkZWNvbXByZXNzaW9uIGJvbWIga2VlcHMgaW5mbGF0aW5nIChhbmQgZW1pdHRpbmcpIGxvbmcgYWZ0ZXJcbiAgICAgICAgICAvLyB0aGUgY29tcHJlc3NlZCBpbnB1dCB3YXMgY29uc3VtZWQ7IHN0b3AgaXQgaGVyZSBzbyB0aGUgbGltaXRcbiAgICAgICAgICAvLyBhbHNvIGJvdW5kcyBDUFUgYW5kIGF2b2lkcyBhIGZsb29kIG9mIGxhdGUgY2FsbGJhY2tzLlxuICAgICAgICAgIGlmIChkZWNvbXByZXNzZXIpIGRlY29tcHJlc3Nlci5kZXN0cm95KCk7XG4gICAgICAgICAgLy8gRGVzdHJveSB3aXRob3V0IGFuIGVycm9yOiBJbmNvbWluZ01lc3NhZ2UuZGVzdHJveShlcnIpIGVtaXRzXG4gICAgICAgICAgLy8gJ2Vycm9yJywgYW5kIHRoZSBwYXJzZXIgbWF5IGFsc28gZmFpbCwgZWFjaCBvZiB3aGljaCB3b3VsZFxuICAgICAgICAgIC8vIGNhbGwgY2FsbGJhY2soKSBhZ2FpbiAoXCJzdXBlcmFnZW50OiBkb3VibGUgY2FsbGJhY2sgYnVnXCIpLlxuICAgICAgICAgIHJlcy5kZXN0cm95KCk7XG4gICAgICAgICAgdGhpcy5jYWxsYmFjayhlcnJvciwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChwYXJzZXIgJiYgIWJ1ZmZlciAmJiBCVUZGRVJJTkdfUEFSU0VSUy5oYXMocGFyc2VyKSkge1xuICAgICAgLy8gVGhlIGJ1aWx0LWluIHBhcnNlcnMgZXhpc3Qgb25seSB0byBhY2N1bXVsYXRlIHRoZSBib2R5LiBXaGVuIHRoZVxuICAgICAgLy8gcmVzcG9uc2UgaXMgbm90IGJ1ZmZlcmVkIChgLmJ1ZmZlcihmYWxzZSlgLCBvciBhbiB1bmJ1ZmZlcmVkIGRlZmF1bHRcbiAgICAgIC8vIHN1Y2ggYXMgYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtKSB0aGV5IHdvdWxkIHN0aWxsIGNvbGxlY3QgdGhlIGVudGlyZVxuICAgICAgLy8gc3RyZWFtIGluIG1lbW9yeSwgd2l0aG91dCBhbnkgc2l6ZSBsaW1pdCwgd2hpbGUgdGhlIHJlc3BvbnNlIGhhc1xuICAgICAgLy8gYWxyZWFkeSBiZWVuIGhhbmRlZCBvdXQgdG8gdGhlIGNhbGxlci4gS2VlcCBvbmx5IHRoZSBlbmNvZGluZyB0aGV5XG4gICAgICAvLyB3b3VsZCBoYXZlIGFwcGxpZWQgc28gYHJlcy5vbignZGF0YScpYCBjb25zdW1lcnMgc2VlIHRoZSBzYW1lIGNodW5rcy5cbiAgICAgIGlmIChwYXJzZXIgPT09IEJVSUxUX0lOX1BBUlNFUlNbJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCddKSB7XG4gICAgICAgIHJlcy5zZXRFbmNvZGluZygnYXNjaWknKTtcbiAgICAgIH0gZWxzZSBpZiAocGFyc2VyICE9PSBCVUlMVF9JTl9QQVJTRVJTLmltYWdlKSB7XG4gICAgICAgIHJlcy5zZXRFbmNvZGluZygndXRmOCcpO1xuICAgICAgfVxuXG4gICAgICBwYXJzZXIgPSBudWxsO1xuICAgIH1cblxuICAgIGlmIChwYXJzZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFVuYnVmZmVyZWQgcGFyc2VycyBhcmUgc3VwcG9zZWQgdG8gZW1pdCByZXNwb25zZSBlYXJseSxcbiAgICAgICAgLy8gd2hpY2ggaXMgd2VpcmQgQlRXLCBiZWNhdXNlIHJlc3BvbnNlLmJvZHkgd29uJ3QgYmUgdGhlcmUuXG4gICAgICAgIHBhcnNlckhhbmRsZXNFbmQgPSBidWZmZXI7XG5cbiAgICAgICAgcGFyc2VyKHJlcywgKGVycm9yLCBvYmplY3QsIGZpbGVzKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMudGltZWRvdXQgfHwgdGhpcy5jYWxsZWQpIHtcbiAgICAgICAgICAgIC8vIFRpbWVvdXQgb3IgbWF4UmVzcG9uc2VTaXplIGhhcyBhbHJlYWR5IGhhbmRsZWQgYWxsIGNhbGxiYWNrc1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEludGVudGlvbmFsIChub24tdGltZW91dCkgYWJvcnQgaXMgc3VwcG9zZWQgdG8gcHJlc2VydmUgcGFydGlhbCByZXNwb25zZSxcbiAgICAgICAgICAvLyBldmVuIGlmIGl0IGRvZXNuJ3QgcGFyc2UuXG4gICAgICAgICAgaWYgKGVycm9yICYmICF0aGlzLl9hYm9ydGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jYWxsYmFjayhlcnJvcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHBhcnNlckhhbmRsZXNFbmQpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZW5kJyk7XG4gICAgICAgICAgICB0aGlzLmNhbGxiYWNrKG51bGwsIHRoaXMuX2VtaXRSZXNwb25zZShvYmplY3QsIGZpbGVzKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLmNhbGxiYWNrKGVycik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnJlcyA9IHJlcztcblxuICAgIC8vIHVuYnVmZmVyZWRcbiAgICBpZiAoIWJ1ZmZlcikge1xuICAgICAgZGVidWcoJ3VuYnVmZmVyZWQgJXMgJXMnLCB0aGlzLm1ldGhvZCwgdGhpcy51cmwpO1xuICAgICAgdGhpcy5jYWxsYmFjayhudWxsLCB0aGlzLl9lbWl0UmVzcG9uc2UoKSk7XG4gICAgICBpZiAobXVsdGlwYXJ0KSByZXR1cm47IC8vIGFsbG93IG11bHRpcGFydCB0byBoYW5kbGUgZW5kIGV2ZW50XG4gICAgICByZXMub25jZSgnZW5kJywgKCkgPT4ge1xuICAgICAgICBkZWJ1ZygnZW5kICVzICVzJywgdGhpcy5tZXRob2QsIHRoaXMudXJsKTtcbiAgICAgICAgdGhpcy5lbWl0KCdlbmQnKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXBsZXRlQWJvcnRlZFJlc3BvbnNlID0gKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLl9hYm9ydGVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcGFyc2VySGFuZGxlc0VuZCA9IGZhbHNlO1xuICAgICAgaWYgKCF0aGlzLmNhbGxlZCkge1xuICAgICAgICB0aGlzLmVtaXQoJ2VuZCcpO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IHRoaXMuX2VtaXRSZXNwb25zZSgpO1xuICAgICAgICByZXNwb25zZS5vbignZXJyb3InLCBub29wKTtcbiAgICAgICAgdGhpcy5jYWxsYmFjayhudWxsLCByZXNwb25zZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG5cbiAgICAvLyB0ZXJtaW5hdGluZyBldmVudHNcbiAgICByZXMub25jZSgnZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgIGlmIChjb21wbGV0ZUFib3J0ZWRSZXNwb25zZSgpKSByZXR1cm47XG4gICAgICBwYXJzZXJIYW5kbGVzRW5kID0gZmFsc2U7XG4gICAgICB0aGlzLmNhbGxiYWNrKGVycm9yLCBudWxsKTtcbiAgICB9KTtcbiAgICByZXMub25jZSgnYWJvcnRlZCcsIGNvbXBsZXRlQWJvcnRlZFJlc3BvbnNlKTtcbiAgICByZXMub25jZSgnY2xvc2UnLCBjb21wbGV0ZUFib3J0ZWRSZXNwb25zZSk7XG4gICAgaWYgKCFwYXJzZXJIYW5kbGVzRW5kKVxuICAgICAgcmVzLm9uY2UoJ2VuZCcsICgpID0+IHtcbiAgICAgICAgZGVidWcoJ2VuZCAlcyAlcycsIHRoaXMubWV0aG9kLCB0aGlzLnVybCk7XG4gICAgICAgIC8vIFRPRE86IHVubGVzcyBidWZmZXJpbmcgZW1pdCBlYXJsaWVyIHRvIHN0cmVhbVxuICAgICAgICB0aGlzLmVtaXQoJ2VuZCcpO1xuICAgICAgICB0aGlzLmNhbGxiYWNrKG51bGwsIHRoaXMuX2VtaXRSZXNwb25zZSgpKTtcbiAgICAgIH0pO1xuICB9O1xuXG4gIGlmIChzdHJlYW1SZXNwb25zZSkge1xuICAgIHByb2Nlc3MubmV4dFRpY2soaGFuZGxlUmVzcG9uc2UsIHN0cmVhbVJlc3BvbnNlKTtcbiAgfSBlbHNlIHtcbiAgICByZXEub25jZSgncmVzcG9uc2UnLCBoYW5kbGVSZXNwb25zZSk7XG4gIH1cblxuICB0aGlzLmVtaXQoJ3JlcXVlc3QnLCB0aGlzKTtcblxuICBjb25zdCBnZXRQcm9ncmVzc01vbml0b3IgPSAoKSA9PiB7XG4gICAgY29uc3QgbGVuZ3RoQ29tcHV0YWJsZSA9IHRydWU7XG4gICAgY29uc3QgdG90YWwgPSByZXEuZ2V0SGVhZGVyKCdDb250ZW50LUxlbmd0aCcpO1xuICAgIGxldCBsb2FkZWQgPSAwO1xuXG4gICAgY29uc3QgcHJvZ3Jlc3MgPSBuZXcgU3RyZWFtLlRyYW5zZm9ybSgpO1xuICAgIHByb2dyZXNzLl90cmFuc2Zvcm0gPSAoY2h1bmssIGVuY29kaW5nLCBjYWxsYmFjaykgPT4ge1xuICAgICAgbG9hZGVkICs9IGNodW5rLmxlbmd0aDtcbiAgICAgIHRoaXMuZW1pdCgncHJvZ3Jlc3MnLCB7XG4gICAgICAgIGRpcmVjdGlvbjogJ3VwbG9hZCcsXG4gICAgICAgIGxlbmd0aENvbXB1dGFibGUsXG4gICAgICAgIGxvYWRlZCxcbiAgICAgICAgdG90YWxcbiAgICAgIH0pO1xuICAgICAgY2FsbGJhY2sobnVsbCwgY2h1bmspO1xuICAgIH07XG5cbiAgICByZXR1cm4gcHJvZ3Jlc3M7XG4gIH07XG5cbiAgY29uc3QgYnVmZmVyVG9DaHVua3MgPSAoYnVmZmVyKSA9PiB7XG4gICAgY29uc3QgY2h1bmtTaXplID0gMTYgKiAxMDI0OyAvLyBkZWZhdWx0IGhpZ2hXYXRlck1hcmsgdmFsdWVcbiAgICBjb25zdCBjaHVua2luZyA9IG5ldyBTdHJlYW0uUmVhZGFibGUoKTtcbiAgICBjb25zdCB0b3RhbExlbmd0aCA9IGJ1ZmZlci5sZW5ndGg7XG4gICAgY29uc3QgcmVtYWluZGVyID0gdG90YWxMZW5ndGggJSBjaHVua1NpemU7XG4gICAgY29uc3QgY3V0b2ZmID0gdG90YWxMZW5ndGggLSByZW1haW5kZXI7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGN1dG9mZjsgaSArPSBjaHVua1NpemUpIHtcbiAgICAgIGNvbnN0IGNodW5rID0gYnVmZmVyLnNsaWNlKGksIGkgKyBjaHVua1NpemUpO1xuICAgICAgY2h1bmtpbmcucHVzaChjaHVuayk7XG4gICAgfVxuXG4gICAgaWYgKHJlbWFpbmRlciA+IDApIHtcbiAgICAgIGNvbnN0IHJlbWFpbmRlckJ1ZmZlciA9IGJ1ZmZlci5zbGljZSgtcmVtYWluZGVyKTtcbiAgICAgIGNodW5raW5nLnB1c2gocmVtYWluZGVyQnVmZmVyKTtcbiAgICB9XG5cbiAgICBjaHVua2luZy5wdXNoKG51bGwpOyAvLyBubyBtb3JlIGRhdGFcblxuICAgIHJldHVybiBjaHVua2luZztcbiAgfTtcblxuICB0cnkge1xuICAgIC8vIGlmIGEgRm9ybURhdGEgaW5zdGFuY2UgZ290IGNyZWF0ZWQsIHRoZW4gd2Ugc2VuZCB0aGF0IGFzIHRoZSByZXF1ZXN0IGJvZHlcbiAgICBjb25zdCBmb3JtRGF0YSA9IHRoaXMuX2Zvcm1EYXRhO1xuICAgIGlmIChmb3JtRGF0YSkge1xuICAgICAgLy8gc2V0IGhlYWRlcnNcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSBmb3JtRGF0YS5nZXRIZWFkZXJzKCk7XG4gICAgICBmb3IgKGNvbnN0IGkgaW4gaGVhZGVycykge1xuICAgICAgICBpZiAoaGFzT3duKGhlYWRlcnMsIGkpKSB7XG4gICAgICAgICAgZGVidWcoJ3NldHRpbmcgRm9ybURhdGEgaGVhZGVyOiBcIiVzOiAlc1wiJywgaSwgaGVhZGVyc1tpXSk7XG4gICAgICAgICAgcmVxLnNldEhlYWRlcihpLCBoZWFkZXJzW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBhdHRlbXB0IHRvIGdldCBcIkNvbnRlbnQtTGVuZ3RoXCIgaGVhZGVyXG4gICAgICBmb3JtRGF0YS5nZXRMZW5ndGgoKGVycm9yLCBsZW5ndGgpID0+IHtcbiAgICAgICAgLy8gVW5rbm93biBzdHJlYW0gbGVuZ3RocyBjYW4gdXNlIGNodW5rZWQgZW5jb2RpbmcsIGJ1dCBmaWxlc3lzdGVtXG4gICAgICAgIC8vIGVycm9ycyBtdXN0IGZhaWwgYmVmb3JlIGEgcGFydGlhbCBtdWx0aXBhcnQgcmVxdWVzdCBpcyBzZW50LlxuICAgICAgICBpZiAoZXJyb3IgJiYgZXJyb3IgIT09ICdVbmtub3duIHN0cmVhbScpIHtcbiAgICAgICAgICB0aGlzLl9mYWlsUmVxdWVzdChlcnJvcik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVidWcoJ2dvdCBGb3JtRGF0YSBDb250ZW50LUxlbmd0aDogJXMnLCBsZW5ndGgpO1xuICAgICAgICBpZiAodHlwZW9mIGxlbmd0aCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICByZXEuc2V0SGVhZGVyKCdDb250ZW50LUxlbmd0aCcsIGxlbmd0aCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3JtRGF0YS5waXBlKGdldFByb2dyZXNzTW9uaXRvcigpKS5waXBlKHJlcSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKEJ1ZmZlci5pc0J1ZmZlcihkYXRhKSkge1xuICAgICAgYnVmZmVyVG9DaHVua3MoZGF0YSkucGlwZShnZXRQcm9ncmVzc01vbml0b3IoKSkucGlwZShyZXEpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXEuZW5kKGRhdGEpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhpcy5fZmFpbFJlcXVlc3QoZXJyKTtcbiAgfVxufTtcblxuLy8gQ2hlY2sgd2hldGhlciByZXNwb25zZSBoYXMgYSBub24tMC1zaXplZCBnemlwLWVuY29kZWQgYm9keVxuUmVxdWVzdC5wcm90b3R5cGUuX3Nob3VsZERlY29tcHJlc3MgPSAocmVzKSA9PiB7XG4gIHJldHVybiAoXG4gICAgaGFzTm9uRW1wdHlSZXNwb25zZUNvbnRlbnQocmVzKSAmJlxuICAgIChpc0d6aXBPckRlZmxhdGVFbmNvZGluZyhyZXMpIHx8IGlzQnJvdGxpRW5jb2RpbmcocmVzKSlcbiAgKTtcbn07XG5cbi8qKlxuICogT3ZlcnJpZGVzIEROUyBmb3Igc2VsZWN0ZWQgaG9zdG5hbWVzLiBUYWtlcyBvYmplY3QgbWFwcGluZyBob3N0bmFtZXMgdG8gSVAgYWRkcmVzc2VzLlxuICpcbiAqIFdoZW4gbWFraW5nIGEgcmVxdWVzdCB0byBhIFVSTCB3aXRoIGEgaG9zdG5hbWUgZXhhY3RseSBtYXRjaGluZyBhIGtleSBpbiB0aGUgb2JqZWN0LFxuICogdXNlIHRoZSBnaXZlbiBJUCBhZGRyZXNzIHRvIGNvbm5lY3QsIGluc3RlYWQgb2YgdXNpbmcgRE5TIHRvIHJlc29sdmUgdGhlIGhvc3RuYW1lLlxuICpcbiAqIEEgc3BlY2lhbCBob3N0IGAqYCBtYXRjaGVzIGV2ZXJ5IGhvc3RuYW1lIChrZWVwIHJlZGlyZWN0cyBpbiBtaW5kISlcbiAqXG4gKiAgICAgIHJlcXVlc3QuY29ubmVjdCh7XG4gKiAgICAgICAgJ3Rlc3QuZXhhbXBsZS5jb20nOiAnMTI3LjAuMC4xJyxcbiAqICAgICAgICAnaXB2Ni5leGFtcGxlLmNvbSc6ICc6OjEnLFxuICogICAgICB9KVxuICovXG5SZXF1ZXN0LnByb3RvdHlwZS5jb25uZWN0ID0gZnVuY3Rpb24gKGNvbm5lY3RPdmVycmlkZSkge1xuICBpZiAodHlwZW9mIGNvbm5lY3RPdmVycmlkZSA9PT0gJ3N0cmluZycpIHtcbiAgICB0aGlzLl9jb25uZWN0T3ZlcnJpZGUgPSB7ICcqJzogY29ubmVjdE92ZXJyaWRlIH07XG4gIH0gZWxzZSBpZiAodHlwZW9mIGNvbm5lY3RPdmVycmlkZSA9PT0gJ29iamVjdCcpIHtcbiAgICB0aGlzLl9jb25uZWN0T3ZlcnJpZGUgPSBjb25uZWN0T3ZlcnJpZGU7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fY29ubmVjdE92ZXJyaWRlID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5SZXF1ZXN0LnByb3RvdHlwZS50cnVzdExvY2FsaG9zdCA9IGZ1bmN0aW9uICh0b2dnbGUpIHtcbiAgdGhpcy5fdHJ1c3RMb2NhbGhvc3QgPSB0b2dnbGUgPT09IHVuZGVmaW5lZCA/IHRydWUgOiB0b2dnbGU7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gZ2VuZXJhdGUgSFRUUCB2ZXJiIG1ldGhvZHNcbmlmICghbWV0aG9kcy5pbmNsdWRlcygnZGVsJykpIHtcbiAgLy8gY3JlYXRlIGEgY29weSBzbyB3ZSBkb24ndCBjYXVzZSBjb25mbGljdHMgd2l0aFxuICAvLyBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgbWV0aG9kcyBwYWNrYWdlIGFuZFxuICAvLyBucG0gMy54XG4gIG1ldGhvZHMgPSBbLi4ubWV0aG9kc107XG4gIG1ldGhvZHMucHVzaCgnZGVsJyk7XG59XG5cbmZvciAobGV0IG1ldGhvZCBvZiBtZXRob2RzKSB7XG4gIGNvbnN0IG5hbWUgPSBtZXRob2Q7XG4gIG1ldGhvZCA9IG1ldGhvZCA9PT0gJ2RlbCcgPyAnZGVsZXRlJyA6IG1ldGhvZDtcblxuICBtZXRob2QgPSBtZXRob2QudG9VcHBlckNhc2UoKTtcbiAgcmVxdWVzdFtuYW1lXSA9ICh1cmwsIGRhdGEsIGZuKSA9PiB7XG4gICAgY29uc3QgcmVxdWVzdF8gPSByZXF1ZXN0KG1ldGhvZCwgdXJsKTtcbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGZuID0gZGF0YTtcbiAgICAgIGRhdGEgPSBudWxsO1xuICAgIH1cblxuICAgIGlmIChkYXRhKSB7XG4gICAgICBpZiAobWV0aG9kID09PSAnR0VUJyB8fCBtZXRob2QgPT09ICdIRUFEJykge1xuICAgICAgICByZXF1ZXN0Xy5xdWVyeShkYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlcXVlc3RfLnNlbmQoZGF0YSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGZuKSByZXF1ZXN0Xy5lbmQoZm4pO1xuICAgIHJldHVybiByZXF1ZXN0XztcbiAgfTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBgbWltZWAgaXMgdGV4dCBhbmQgc2hvdWxkIGJlIGJ1ZmZlcmVkLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtaW1lXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBpc1RleHQobWltZSkge1xuICBjb25zdCBwYXJ0cyA9IG1pbWUuc3BsaXQoJy8nKTtcbiAgbGV0IHR5cGUgPSBwYXJ0c1swXTtcbiAgaWYgKHR5cGUpIHR5cGUgPSB0eXBlLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICBsZXQgc3VidHlwZSA9IHBhcnRzWzFdO1xuICBpZiAoc3VidHlwZSkgc3VidHlwZSA9IHN1YnR5cGUudG9Mb3dlckNhc2UoKS50cmltKCk7XG5cbiAgcmV0dXJuIHR5cGUgPT09ICd0ZXh0JyB8fCBzdWJ0eXBlID09PSAneC13d3ctZm9ybS11cmxlbmNvZGVkJztcbn1cblxuLy8gVGhpcyBpcyBub3QgYSBjYXRjaGFsbCwgYnV0IGEgc3RhcnQuIEl0IG1pZ2h0IGJlIHVzZWZ1bFxuLy8gaW4gdGhlIGxvbmcgcnVuIHRvIGhhdmUgZmlsZSB0aGF0IGluY2x1ZGVzIGFsbCBiaW5hcnlcbi8vIGNvbnRlbnQgdHlwZXMgZnJvbSBodHRwczovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9tZWRpYS10eXBlcy9tZWRpYS10eXBlcy54aHRtbFxuZnVuY3Rpb24gaXNCaW5hcnkobWltZSkge1xuICBsZXQgW3JlZ2lzdHJ5LCBuYW1lXSA9IG1pbWUuc3BsaXQoJy8nKTtcbiAgaWYgKHJlZ2lzdHJ5KSByZWdpc3RyeSA9IHJlZ2lzdHJ5LnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICBpZiAobmFtZSkgbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gIHJldHVybiAoXG4gICAgWydhdWRpbycsICdmb250JywgJ2ltYWdlJywgJ3ZpZGVvJ10uaW5jbHVkZXMocmVnaXN0cnkpIHx8XG4gICAgWydneicsICdnemlwJ10uaW5jbHVkZXMobmFtZSlcbiAgKTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBgbWltZWAgaXMganNvbiBvciBoYXMgK2pzb24gc3RydWN0dXJlZCBzeW50YXggc3VmZml4LlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtaW1lXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gaXNKU09OKG1pbWUpIHtcbiAgLy8gc2hvdWxkIG1hdGNoIC9qc29uIG9yICtqc29uXG4gIC8vIGJ1dCBub3QgL2pzb24tc2VxXG4gIHJldHVybiAvWy8rXWpzb24oJHxbXi1cXHddKS9pLnRlc3QobWltZSk7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgd2Ugc2hvdWxkIGZvbGxvdyB0aGUgcmVkaXJlY3QgYGNvZGVgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBjb2RlXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gaXNSZWRpcmVjdChjb2RlKSB7XG4gIHJldHVybiBbMzAxLCAzMDIsIDMwMywgMzA1LCAzMDcsIDMwOF0uaW5jbHVkZXMoY29kZSk7XG59XG5cbmZ1bmN0aW9uIGhhc05vbkVtcHR5UmVzcG9uc2VDb250ZW50KHJlcykge1xuICBpZiAocmVzLnN0YXR1c0NvZGUgPT09IDIwNCB8fCByZXMuc3RhdHVzQ29kZSA9PT0gMzA0KSB7XG4gICAgLy8gVGhlc2UgYXJlbid0IHN1cHBvc2VkIHRvIGhhdmUgYW55IGJvZHlcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBoZWFkZXIgY29udGVudCBpcyBhIHN0cmluZywgYW5kIGRpc3RpbmN0aW9uIGJldHdlZW4gMCBhbmQgbm8gaW5mb3JtYXRpb24gaXMgY3J1Y2lhbFxuICBpZiAocmVzLmhlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ10gPT09ICcwJykge1xuICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgYm9keSBpcyBlbXB0eSAodW5mb3J0dW5hdGVseSwgdGhpcyBjaGVjayBkb2VzIG5vdCBjb3ZlciBjaHVua2VkIGVuY29kaW5nKVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuIl0sIm1hcHBpbmdzIjoiOztBQUFBO0FBQ0E7QUFDQTs7QUFFQSxNQUFNO0VBQUVBO0FBQU8sQ0FBQyxHQUFHQyxPQUFPLENBQUMsVUFBVSxDQUFDO0FBQ3RDLE1BQU1DLE1BQU0sR0FBR0QsT0FBTyxDQUFDLGFBQWEsQ0FBQztBQUNyQyxNQUFNRSxLQUFLLEdBQUdGLE9BQU8sQ0FBQyxZQUFZLENBQUM7QUFDbkMsTUFBTUcsSUFBSSxHQUFHSCxPQUFPLENBQUMsV0FBVyxDQUFDO0FBQ2pDLE1BQU1JLEVBQUUsR0FBR0osT0FBTyxDQUFDLFNBQVMsQ0FBQztBQUM3QixNQUFNSyxJQUFJLEdBQUdMLE9BQU8sQ0FBQyxXQUFXLENBQUM7QUFDakMsTUFBTU0sSUFBSSxHQUFHTixPQUFPLENBQUMsV0FBVyxDQUFDO0FBQ2pDLE1BQU1PLEVBQUUsR0FBR1AsT0FBTyxDQUFDLElBQUksQ0FBQztBQUN4QixNQUFNUSxJQUFJLEdBQUdSLE9BQU8sQ0FBQyxNQUFNLENBQUM7QUFDNUIsSUFBSVMsT0FBTyxHQUFHVCxPQUFPLENBQUMsU0FBUyxDQUFDO0FBQ2hDLE1BQU1VLFFBQVEsR0FBR1YsT0FBTyxDQUFDLFdBQVcsQ0FBQztBQUNyQyxNQUFNVyxVQUFVLEdBQUdYLE9BQU8sQ0FBQyxZQUFZLENBQUM7QUFDeEMsTUFBTVksS0FBSyxHQUFHWixPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsWUFBWSxDQUFDO0FBQzVDLE1BQU1hLFNBQVMsR0FBR2IsT0FBTyxDQUFDLFdBQVcsQ0FBQztBQUN0QyxNQUFNYyxhQUFhLEdBQUdkLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQztBQUVwRCxNQUFNZSxLQUFLLEdBQUdmLE9BQU8sQ0FBQyxVQUFVLENBQUM7QUFDakMsTUFBTWdCLFdBQVcsR0FBR2hCLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQztBQUM5QyxNQUFNaUIsS0FBSyxHQUFHakIsT0FBTyxDQUFDLGdCQUFnQixDQUFDO0FBQ3ZDLE1BQU07RUFBRWtCO0FBQVcsQ0FBQyxHQUFHbEIsT0FBTyxDQUFDLFNBQVMsQ0FBQztBQUN6QyxNQUFNbUIsUUFBUSxHQUFHbkIsT0FBTyxDQUFDLFlBQVksQ0FBQztBQUV0QyxNQUFNO0VBQUVvQixLQUFLO0VBQUVDLE1BQU07RUFBRUMsZ0JBQWdCO0VBQUVDO0FBQXdCLENBQUMsR0FBR1IsS0FBSztBQUMxRSxNQUFNO0VBQUVTO0FBQW1CLENBQUMsR0FBR3hCLE9BQU8sQ0FBQyxjQUFjLENBQUM7QUFFdEQsU0FBU3lCLE9BQU9BLENBQUNDLE1BQU0sRUFBRUMsR0FBRyxFQUFFO0VBQzVCO0VBQ0EsSUFBSSxPQUFPQSxHQUFHLEtBQUssVUFBVSxFQUFFO0lBQzdCLE9BQU8sSUFBSUMsT0FBTyxDQUFDQyxPQUFPLENBQUMsS0FBSyxFQUFFSCxNQUFNLENBQUMsQ0FBQ0ksR0FBRyxDQUFDSCxHQUFHLENBQUM7RUFDcEQ7O0VBRUE7RUFDQSxJQUFJSSxTQUFTLENBQUNDLE1BQU0sS0FBSyxDQUFDLEVBQUU7SUFDMUIsT0FBTyxJQUFJSixPQUFPLENBQUNDLE9BQU8sQ0FBQyxLQUFLLEVBQUVILE1BQU0sQ0FBQztFQUMzQztFQUVBLE9BQU8sSUFBSUUsT0FBTyxDQUFDQyxPQUFPLENBQUNILE1BQU0sRUFBRUMsR0FBRyxDQUFDO0FBQ3pDO0FBRUFNLE1BQU0sQ0FBQ0wsT0FBTyxHQUFHSCxPQUFPO0FBQ3hCRyxPQUFPLEdBQUdLLE1BQU0sQ0FBQ0wsT0FBTzs7QUFFeEI7QUFDQTtBQUNBOztBQUVBQSxPQUFPLENBQUNDLE9BQU8sR0FBR0EsT0FBTzs7QUFFekI7QUFDQTtBQUNBOztBQUVBRCxPQUFPLENBQUNNLEtBQUssR0FBR2xDLE9BQU8sQ0FBQyxTQUFTLENBQUM7O0FBRWxDO0FBQ0E7QUFDQTs7QUFFQSxTQUFTbUMsSUFBSUEsQ0FBQSxFQUFHLENBQUM7O0FBRWpCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNDLGtCQUFrQkEsQ0FBQ0MsUUFBUSxFQUFFO0VBQ3BDLE1BQU07SUFBRUM7RUFBSSxDQUFDLEdBQUdELFFBQVE7RUFDeEIsSUFBSSxDQUFDQyxHQUFHLElBQUlELFFBQVEsQ0FBQ0UsZ0JBQWdCLEVBQUU7SUFDckM7RUFDRjtFQUVBRixRQUFRLENBQUNFLGdCQUFnQixHQUFHLElBQUk7RUFDaEMsSUFBSUYsUUFBUSxDQUFDRyx1QkFBdUIsRUFBRTtJQUNwQ0YsR0FBRyxDQUFDRyxjQUFjLENBQUMsVUFBVSxFQUFFSixRQUFRLENBQUNHLHVCQUF1QixDQUFDO0lBQ2hFSCxRQUFRLENBQUNHLHVCQUF1QixHQUFHRSxTQUFTO0lBQzVDTCxRQUFRLENBQUNNLGVBQWUsR0FBR0QsU0FBUztFQUN0QztFQUVBLElBQUk7SUFDRjtJQUNBO0lBQ0E7SUFDQSxJQUFJSixHQUFHLENBQUNNLE9BQU8sSUFBSSxPQUFPTixHQUFHLENBQUNNLE9BQU8sQ0FBQ0MsT0FBTyxLQUFLLFVBQVUsRUFBRTtNQUM1RFAsR0FBRyxDQUFDTSxPQUFPLENBQUNDLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZCO0lBRUEsSUFBSVAsR0FBRyxDQUFDUSxNQUFNLElBQUksT0FBT1IsR0FBRyxDQUFDUSxNQUFNLENBQUNELE9BQU8sS0FBSyxVQUFVLEVBQUU7TUFDMURQLEdBQUcsQ0FBQ1EsTUFBTSxDQUFDRCxPQUFPLENBQUMsQ0FBQztJQUN0QjtJQUVBLElBQUksT0FBT1AsR0FBRyxDQUFDTyxPQUFPLEtBQUssVUFBVSxFQUFFO01BQ3JDUCxHQUFHLENBQUNPLE9BQU8sQ0FBQyxDQUFDO01BQ2I7SUFDRjtJQUVBLElBQUksT0FBT1AsR0FBRyxDQUFDUyxLQUFLLEtBQUssVUFBVSxFQUFFO01BQ25DVCxHQUFHLENBQUNTLEtBQUssQ0FBQyxDQUFDO01BQ1g7SUFDRjtJQUVBLElBQUksT0FBT1QsR0FBRyxDQUFDUixHQUFHLEtBQUssVUFBVSxFQUFFO01BQ2pDUSxHQUFHLENBQUNSLEdBQUcsQ0FBQyxDQUFDO0lBQ1g7RUFDRixDQUFDLENBQUMsT0FBT2tCLEdBQUcsRUFBRTtJQUNacEMsS0FBSyxDQUFDLDZDQUE2QyxFQUFFb0MsR0FBRyxDQUFDO0VBQzNEO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTQyxtQkFBbUJBLENBQUNDLFNBQVMsRUFBRTtFQUN0QyxNQUFNQyxLQUFLLEdBQUdELFNBQVMsQ0FBQ0UsS0FBSyxDQUMzQiwrQ0FDRixDQUFDO0VBQ0QsSUFBSSxDQUFDRCxLQUFLLEVBQUU7SUFDVixPQUFPO01BQ0xELFNBQVM7TUFDVEcsV0FBV0EsQ0FBQ0MsSUFBSSxFQUFFO1FBQ2hCLE9BQU9BLElBQUk7TUFDYjtJQUNGLENBQUM7RUFDSDtFQUVBLE1BQU1DLFFBQVEsR0FBRyxFQUFFO0VBQ25CLE1BQU1DLE1BQU0sR0FBRywyQkFBMkI7RUFDMUMsTUFBTUYsSUFBSSxHQUFHSCxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUNNLE9BQU8sQ0FDM0IsK0JBQStCLEVBQy9CLENBQUNDLENBQUMsRUFBRUMsT0FBTyxLQUFLO0lBQ2QsTUFBTUMsTUFBTSxHQUFHLEdBQUdKLE1BQU0sR0FBR0QsUUFBUSxDQUFDdkIsTUFBTSxJQUFJO0lBQzlDdUIsUUFBUSxDQUFDTSxJQUFJLENBQUNGLE9BQU8sQ0FBQztJQUN0QixPQUFPLElBQUlDLE1BQU0sRUFBRTtFQUNyQixDQUNGLENBQUM7RUFFRCxPQUFPO0lBQ0xWLFNBQVMsRUFBRSxHQUFHQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUdHLElBQUksR0FBR0gsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFO0lBQzFDRSxXQUFXQSxDQUFDUyxXQUFXLEVBQUU7TUFDdkIsSUFBSUMsWUFBWSxHQUFHRCxXQUFXO01BQzlCLEtBQUssTUFBTSxDQUFDRSxLQUFLLEVBQUVMLE9BQU8sQ0FBQyxJQUFJSixRQUFRLENBQUNVLE9BQU8sQ0FBQyxDQUFDLEVBQUU7UUFDakRGLFlBQVksR0FBR0EsWUFBWSxDQUFDTixPQUFPLENBQUMsR0FBR0QsTUFBTSxHQUFHUSxLQUFLLElBQUksRUFBRUwsT0FBTyxDQUFDO01BQ3JFO01BRUEsT0FBT0ksWUFBWTtJQUNyQjtFQUNGLENBQUM7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNHLG1CQUFtQkEsQ0FBQ2hCLFNBQVMsRUFBRTtFQUN0QyxPQUFPQSxTQUFTLENBQUNpQixPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHakIsU0FBUyxHQUFHLFVBQVVBLFNBQVMsRUFBRTtBQUM1RTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTWtCLGtCQUFrQixHQUFHLElBQUlDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztBQUN2RCxNQUFNQyxxQkFBcUIsR0FBRyxJQUFJRCxHQUFHLENBQUMsQ0FBQyxZQUFZLEVBQUUsYUFBYSxDQUFDLENBQUM7O0FBRXBFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0UsdUJBQXVCQSxDQUFDQyxPQUFPLEVBQUVDLE1BQU0sRUFBRTtFQUNoRCxJQUFJTCxrQkFBa0IsQ0FBQ00sR0FBRyxDQUFDRCxNQUFNLENBQUNFLFFBQVEsQ0FBQyxFQUFFLE9BQU8sSUFBSTtFQUV4RCxPQUNFTCxxQkFBcUIsQ0FBQ0ksR0FBRyxDQUFDRCxNQUFNLENBQUNFLFFBQVEsQ0FBQyxJQUMxQ0YsTUFBTSxDQUFDRSxRQUFRLEtBQUtILE9BQU8sQ0FBQ0csUUFBUSxJQUNwQ0YsTUFBTSxDQUFDRyxRQUFRLEtBQUssRUFBRSxJQUN0QkgsTUFBTSxDQUFDRyxRQUFRLEtBQUtKLE9BQU8sQ0FBQ0ksUUFBUTtBQUV4Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTQyxZQUFZQSxDQUFDTCxPQUFPLEVBQUVDLE1BQU0sRUFBRTtFQUNyQyxJQUFJRCxPQUFPLENBQUNNLE1BQU0sS0FBSyxNQUFNLElBQUlMLE1BQU0sQ0FBQ0ssTUFBTSxLQUFLLE1BQU0sRUFBRTtJQUN6RCxPQUFPTixPQUFPLENBQUNNLE1BQU0sS0FBS0wsTUFBTSxDQUFDSyxNQUFNO0VBQ3pDO0VBRUEsT0FDRU4sT0FBTyxDQUFDRyxRQUFRLEtBQUtGLE1BQU0sQ0FBQ0UsUUFBUSxJQUNwQ0gsT0FBTyxDQUFDSSxRQUFRLEtBQUtILE1BQU0sQ0FBQ0csUUFBUSxJQUNwQ0osT0FBTyxDQUFDTyxJQUFJLEtBQUtOLE1BQU0sQ0FBQ00sSUFBSTtBQUVoQzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUFuRCxPQUFPLENBQUNULFFBQVEsR0FBR0EsUUFBUTs7QUFFM0I7QUFDQTtBQUNBOztBQUVBWCxJQUFJLENBQUN3RSxNQUFNLENBQ1Q7RUFDRSxtQ0FBbUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsV0FBVztBQUN6RSxDQUFDLEVBQ0QsSUFDRixDQUFDOztBQUVEO0FBQ0E7QUFDQTs7QUFFQXBELE9BQU8sQ0FBQ3FELFNBQVMsR0FBRztFQUNsQixPQUFPLEVBQUU5RSxJQUFJO0VBQ2IsUUFBUSxFQUFFRCxLQUFLO0VBQ2YsUUFBUSxFQUFFZTtBQUNaLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQVcsT0FBTyxDQUFDc0QsU0FBUyxHQUFHO0VBQ2xCLG1DQUFtQ0MsQ0FBQ0MsTUFBTSxFQUFFO0lBQzFDLE9BQU83RSxFQUFFLENBQUM4RSxTQUFTLENBQUNELE1BQU0sRUFBRTtNQUFFRSxPQUFPLEVBQUUsS0FBSztNQUFFQyxrQkFBa0IsRUFBRTtJQUFLLENBQUMsQ0FBQztFQUMzRSxDQUFDO0VBQ0Qsa0JBQWtCLEVBQUV6RSxhQUFhO0VBQ2pDO0VBQ0Esd0JBQXdCLEVBQUVBO0FBQzVCLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQWMsT0FBTyxDQUFDNEQsS0FBSyxHQUFHeEYsT0FBTyxDQUFDLFdBQVcsQ0FBQzs7QUFFcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU15RixnQkFBZ0IsR0FBRztFQUN2QixtQ0FBbUMsRUFDakM3RCxPQUFPLENBQUM0RCxLQUFLLENBQUMsbUNBQW1DLENBQUM7RUFDcEQsa0JBQWtCLEVBQUU1RCxPQUFPLENBQUM0RCxLQUFLLENBQUMsa0JBQWtCLENBQUM7RUFDckRFLElBQUksRUFBRTlELE9BQU8sQ0FBQzRELEtBQUssQ0FBQ0UsSUFBSTtFQUN4QkMsS0FBSyxFQUFFL0QsT0FBTyxDQUFDNEQsS0FBSyxDQUFDRztBQUN2QixDQUFDO0FBQ0QsTUFBTUMsaUJBQWlCLEdBQUcsSUFBSXZCLEdBQUcsQ0FDL0J3QixNQUFNLENBQUNDLElBQUksQ0FBQ0wsZ0JBQWdCLENBQUMsQ0FBQ00sR0FBRyxDQUFFQyxHQUFHLElBQUtQLGdCQUFnQixDQUFDTyxHQUFHLENBQUMsQ0FDbEUsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQXBFLE9BQU8sQ0FBQ3FFLE1BQU0sR0FBRyxDQUFDLENBQUM7O0FBRW5CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNDLFlBQVlBLENBQUM3RCxRQUFRLEVBQUU7RUFDOUJBLFFBQVEsQ0FBQzhELE9BQU8sR0FBRztJQUNqQjtFQUFBLENBQ0Q7RUFDRDlELFFBQVEsQ0FBQytELE1BQU0sR0FBRztJQUNoQjtFQUFBLENBQ0Q7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTdkUsT0FBT0EsQ0FBQ0gsTUFBTSxFQUFFQyxHQUFHLEVBQUU7RUFDNUIxQixNQUFNLENBQUNvRyxJQUFJLENBQUMsSUFBSSxDQUFDO0VBQ2pCLElBQUksT0FBTzFFLEdBQUcsS0FBSyxRQUFRLEVBQUVBLEdBQUcsR0FBRzVCLE1BQU0sQ0FBQzRCLEdBQUcsQ0FBQztFQUM5QyxJQUFJLENBQUMyRSxZQUFZLEdBQUdDLE9BQU8sQ0FBQ0MsT0FBTyxDQUFDQyxHQUFHLENBQUNDLFVBQVUsQ0FBQyxDQUFDLENBQUM7RUFDckQsSUFBSSxDQUFDQyxNQUFNLEdBQUcsS0FBSztFQUNuQixJQUFJLENBQUNDLFNBQVMsR0FBRyxJQUFJO0VBQ3JCLElBQUksQ0FBQ2xGLE1BQU0sR0FBR0EsTUFBTTtFQUNwQixJQUFJLENBQUNDLEdBQUcsR0FBR0EsR0FBRztFQUNkdUUsWUFBWSxDQUFDLElBQUksQ0FBQztFQUNsQixJQUFJLENBQUNXLFFBQVEsR0FBRyxJQUFJO0VBQ3BCLElBQUksQ0FBQ0MsVUFBVSxHQUFHLENBQUM7RUFDbkIsSUFBSSxDQUFDQyxTQUFTLENBQUNyRixNQUFNLEtBQUssTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDekMsSUFBSSxDQUFDc0YsT0FBTyxHQUFHLEVBQUU7RUFDakIsSUFBSSxDQUFDekcsRUFBRSxHQUFHLENBQUMsQ0FBQztFQUNaLElBQUksQ0FBQzBHLE1BQU0sR0FBRyxFQUFFO0VBQ2hCLElBQUksQ0FBQ0MsS0FBSyxHQUFHLElBQUksQ0FBQ0QsTUFBTSxDQUFDLENBQUM7RUFDMUIsSUFBSSxDQUFDRSxhQUFhLEdBQUcsRUFBRTtFQUN2QixJQUFJLENBQUNDLGNBQWMsR0FBRyxLQUFLO0VBQzNCLElBQUksQ0FBQ0MsT0FBTyxHQUFHM0UsU0FBUztFQUN4QixJQUFJLENBQUM0RSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQ0MsWUFBWSxDQUFDQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDaEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQWxILElBQUksQ0FBQ21ILFFBQVEsQ0FBQzVGLE9BQU8sRUFBRTVCLE1BQU0sQ0FBQztBQUU5Qm1CLEtBQUssQ0FBQ1MsT0FBTyxDQUFDNkYsU0FBUyxFQUFFMUcsV0FBVyxDQUFDMEcsU0FBUyxDQUFDOztBQUUvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTdGLE9BQU8sQ0FBQzZGLFNBQVMsQ0FBQ3pHLEtBQUssR0FBRyxVQUFVMEcsSUFBSSxFQUFFO0VBQ3hDLElBQUkvRixPQUFPLENBQUNxRCxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUt2QyxTQUFTLEVBQUU7SUFDN0MsTUFBTSxJQUFJa0YsS0FBSyxDQUNiLDREQUNGLENBQUM7RUFDSDtFQUVBLElBQUksQ0FBQ3RCLFlBQVksR0FBR3FCLElBQUksS0FBS2pGLFNBQVMsR0FBRyxJQUFJLEdBQUdpRixJQUFJO0VBQ3BELE9BQU8sSUFBSTtBQUNiLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOUYsT0FBTyxDQUFDNkYsU0FBUyxDQUFDRyxNQUFNLEdBQUcsVUFBVUMsS0FBSyxFQUFFQyxJQUFJLEVBQUVDLE9BQU8sRUFBRTtFQUN6RCxJQUFJRCxJQUFJLEVBQUU7SUFDUixJQUFJLElBQUksQ0FBQ0UsS0FBSyxFQUFFO01BQ2QsTUFBTSxJQUFJTCxLQUFLLENBQUMsNENBQTRDLENBQUM7SUFDL0Q7SUFFQSxJQUFJTSxDQUFDLEdBQUdGLE9BQU8sSUFBSSxDQUFDLENBQUM7SUFDckIsSUFBSSxPQUFPQSxPQUFPLEtBQUssUUFBUSxFQUFFO01BQy9CRSxDQUFDLEdBQUc7UUFBRUMsUUFBUSxFQUFFSDtNQUFRLENBQUM7SUFDM0I7SUFFQSxJQUFJLE9BQU9ELElBQUksS0FBSyxRQUFRLEVBQUU7TUFDNUIsSUFBSSxDQUFDRyxDQUFDLENBQUNDLFFBQVEsRUFBRUQsQ0FBQyxDQUFDQyxRQUFRLEdBQUdKLElBQUk7TUFDbENuSCxLQUFLLENBQUMsZ0RBQWdELEVBQUVtSCxJQUFJLENBQUM7TUFDN0RBLElBQUksR0FBRzNILEVBQUUsQ0FBQ2dJLGdCQUFnQixDQUFDTCxJQUFJLENBQUM7TUFDaENBLElBQUksQ0FBQ00sRUFBRSxDQUFDLE9BQU8sRUFBR0MsS0FBSyxJQUFLO1FBQzFCLE1BQU1DLFFBQVEsR0FBRyxJQUFJLENBQUNDLFlBQVksQ0FBQyxDQUFDO1FBQ3BDRCxRQUFRLENBQUNFLElBQUksQ0FBQyxPQUFPLEVBQUVILEtBQUssQ0FBQztNQUMvQixDQUFDLENBQUM7SUFDSixDQUFDLE1BQU0sSUFBSSxDQUFDSixDQUFDLENBQUNDLFFBQVEsSUFBSUosSUFBSSxDQUFDekUsSUFBSSxFQUFFO01BQ25DNEUsQ0FBQyxDQUFDQyxRQUFRLEdBQUdKLElBQUksQ0FBQ3pFLElBQUk7SUFDeEI7SUFFQSxJQUFJLENBQUNrRixZQUFZLENBQUMsQ0FBQyxDQUFDRSxNQUFNLENBQUNaLEtBQUssRUFBRUMsSUFBSSxFQUFFRyxDQUFDLENBQUM7RUFDNUM7RUFFQSxPQUFPLElBQUk7QUFDYixDQUFDO0FBRURyRyxPQUFPLENBQUM2RixTQUFTLENBQUNjLFlBQVksR0FBRyxZQUFZO0VBQzNDLElBQUksQ0FBQyxJQUFJLENBQUM1QixTQUFTLEVBQUU7SUFDbkIsSUFBSSxDQUFDQSxTQUFTLEdBQUcsSUFBSWxHLFFBQVEsQ0FBQyxDQUFDO0lBQy9CLElBQUksQ0FBQ2tHLFNBQVMsQ0FBQ3lCLEVBQUUsQ0FBQyxPQUFPLEVBQUdDLEtBQUssSUFBSztNQUNwQzFILEtBQUssQ0FBQyxnQkFBZ0IsRUFBRTBILEtBQUssQ0FBQztNQUM5QixJQUFJLElBQUksQ0FBQ0ssTUFBTSxFQUFFO1FBQ2Y7UUFDQTtRQUNBO01BQ0Y7TUFFQSxJQUFJLENBQUNDLFFBQVEsQ0FBQ04sS0FBSyxDQUFDO01BQ3BCLElBQUksQ0FBQ3ZGLEtBQUssQ0FBQyxDQUFDO0lBQ2QsQ0FBQyxDQUFDO0VBQ0o7RUFFQSxPQUFPLElBQUksQ0FBQzZELFNBQVM7QUFDdkIsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBL0UsT0FBTyxDQUFDNkYsU0FBUyxDQUFDeEYsS0FBSyxHQUFHLFVBQVVBLEtBQUssRUFBRTtFQUN6QyxJQUNFSCxTQUFTLENBQUNDLE1BQU0sR0FBRyxDQUFDLElBQ3BCRSxLQUFLLElBQ0wsT0FBT0EsS0FBSyxLQUFLLFFBQVEsSUFDekIsT0FBT0EsS0FBSyxDQUFDMkcsVUFBVSxLQUFLLFVBQVUsRUFDdEM7SUFDQSxNQUFNLElBQUlDLFNBQVMsQ0FDakIsOEZBQ0YsQ0FBQztFQUNIO0VBRUEsSUFBSS9HLFNBQVMsQ0FBQ0MsTUFBTSxLQUFLLENBQUMsRUFBRSxPQUFPLElBQUksQ0FBQzJFLE1BQU07RUFDOUMsSUFBSSxDQUFDQSxNQUFNLEdBQUd6RSxLQUFLO0VBQ25CLE9BQU8sSUFBSTtBQUNiLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUFMLE9BQU8sQ0FBQzZGLFNBQVMsQ0FBQ3FCLE1BQU0sR0FBRyxVQUFVQSxNQUFNLEVBQUU7RUFDM0MsSUFBSWhILFNBQVMsQ0FBQ0MsTUFBTSxLQUFLLENBQUMsRUFBRSxPQUFPLElBQUksQ0FBQ3FGLE9BQU87RUFDL0MsSUFBSSxDQUFDQSxPQUFPLEdBQUcwQixNQUFNO0VBQ3JCLE9BQU8sSUFBSTtBQUNiLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBbEgsT0FBTyxDQUFDNkYsU0FBUyxDQUFDc0IsSUFBSSxHQUFHLFVBQVVBLElBQUksRUFBRTtFQUN2QyxPQUFPLElBQUksQ0FBQ0MsR0FBRyxDQUNiLGNBQWMsRUFDZEQsSUFBSSxDQUFDRSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUdGLElBQUksR0FBR3hJLElBQUksQ0FBQzJJLE9BQU8sQ0FBQ0gsSUFBSSxDQUMvQyxDQUFDO0FBQ0gsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQW5ILE9BQU8sQ0FBQzZGLFNBQVMsQ0FBQzBCLE1BQU0sR0FBRyxVQUFVSixJQUFJLEVBQUU7RUFDekMsT0FBTyxJQUFJLENBQUNDLEdBQUcsQ0FBQyxRQUFRLEVBQUVELElBQUksQ0FBQ0UsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHRixJQUFJLEdBQUd4SSxJQUFJLENBQUMySSxPQUFPLENBQUNILElBQUksQ0FBQyxDQUFDO0FBQzNFLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUFuSCxPQUFPLENBQUM2RixTQUFTLENBQUMyQixLQUFLLEdBQUcsVUFBVUMsS0FBSyxFQUFFO0VBQ3pDLElBQUksT0FBT0EsS0FBSyxLQUFLLFFBQVEsRUFBRTtJQUM3QixJQUFJLENBQUNyQyxNQUFNLENBQUNwRCxJQUFJLENBQUN5RixLQUFLLENBQUM7RUFDekIsQ0FBQyxNQUFNO0lBQ0x6RCxNQUFNLENBQUMwRCxNQUFNLENBQUMsSUFBSSxDQUFDaEosRUFBRSxFQUFFK0ksS0FBSyxDQUFDO0VBQy9CO0VBRUEsT0FBTyxJQUFJO0FBQ2IsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBekgsT0FBTyxDQUFDNkYsU0FBUyxDQUFDOEIsS0FBSyxHQUFHLFVBQVVDLElBQUksRUFBRUMsUUFBUSxFQUFFO0VBQ2xELE1BQU1ySCxRQUFRLEdBQUcsSUFBSSxDQUFDWixPQUFPLENBQUMsQ0FBQztFQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDMkYsY0FBYyxFQUFFO0lBQ3hCLElBQUksQ0FBQ0EsY0FBYyxHQUFHLElBQUk7SUFDMUIsSUFBSSxDQUFDNUUsdUJBQXVCLEdBQUltSCxHQUFHLElBQUs7TUFDdEMsSUFBSSxDQUFDaEgsZUFBZSxHQUFHZ0gsR0FBRztJQUM1QixDQUFDO0lBQ0R0SCxRQUFRLENBQUNpRixJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQzlFLHVCQUF1QixDQUFDO0VBQ3pEO0VBRUEsT0FBT0gsUUFBUSxDQUFDbUgsS0FBSyxDQUFDQyxJQUFJLEVBQUVDLFFBQVEsQ0FBQztBQUN2QyxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE3SCxPQUFPLENBQUM2RixTQUFTLENBQUNrQyxJQUFJLEdBQUcsVUFBVUMsTUFBTSxFQUFFN0IsT0FBTyxFQUFFO0VBQ2xELElBQUksQ0FBQzhCLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQztFQUNuQixJQUFJLENBQUM3RCxNQUFNLENBQUMsS0FBSyxDQUFDO0VBQ2xCLElBQUksQ0FBQ25FLEdBQUcsQ0FBQyxDQUFDO0VBQ1YsT0FBTyxJQUFJLENBQUNpSSxhQUFhLENBQUNGLE1BQU0sRUFBRTdCLE9BQU8sQ0FBQztBQUM1QyxDQUFDO0FBRURuRyxPQUFPLENBQUM2RixTQUFTLENBQUNxQyxhQUFhLEdBQUcsVUFBVUYsTUFBTSxFQUFFN0IsT0FBTyxFQUFFO0VBQzNELElBQUksQ0FBQzFGLEdBQUcsQ0FBQ2dGLElBQUksQ0FBQyxVQUFVLEVBQUdxQyxHQUFHLElBQUs7SUFDakM7SUFDQSxJQUNFSyxVQUFVLENBQUNMLEdBQUcsQ0FBQ00sVUFBVSxDQUFDLElBQzFCLElBQUksQ0FBQ25ELFVBQVUsRUFBRSxLQUFLLElBQUksQ0FBQ29ELGFBQWEsRUFDeEM7TUFDQSxPQUFPLElBQUksQ0FBQ0MsU0FBUyxDQUFDUixHQUFHLENBQUMsS0FBSyxJQUFJLEdBQy9CLElBQUksQ0FBQ0ksYUFBYSxDQUFDRixNQUFNLEVBQUU3QixPQUFPLENBQUMsR0FDbkN0RixTQUFTO0lBQ2Y7SUFFQSxJQUFJLENBQUNpSCxHQUFHLEdBQUdBLEdBQUc7SUFDZCxJQUFJLENBQUNTLGFBQWEsQ0FBQyxDQUFDO0lBQ3BCLElBQUksSUFBSSxDQUFDQyxRQUFRLEVBQUU7SUFFbkIsSUFBSSxJQUFJLENBQUNDLGlCQUFpQixDQUFDWCxHQUFHLENBQUMsRUFBRTtNQUMvQixNQUFNWSxZQUFZLEdBQUcvSSxrQkFBa0IsQ0FBQ21JLEdBQUcsQ0FBQztNQUU1Q1ksWUFBWSxDQUFDbEMsRUFBRSxDQUFDLE9BQU8sRUFBR0MsS0FBSyxJQUFLO1FBQ2xDLElBQUlBLEtBQUssSUFBSUEsS0FBSyxDQUFDa0MsSUFBSSxLQUFLLGFBQWEsRUFBRTtVQUN6QztVQUNBWCxNQUFNLENBQUNwQixJQUFJLENBQUMsS0FBSyxDQUFDO1VBQ2xCO1FBQ0Y7UUFFQW9CLE1BQU0sQ0FBQ3BCLElBQUksQ0FBQyxPQUFPLEVBQUVILEtBQUssQ0FBQztNQUM3QixDQUFDLENBQUM7TUFDRnFCLEdBQUcsQ0FBQ0MsSUFBSSxDQUFDVyxZQUFZLENBQUMsQ0FBQ1gsSUFBSSxDQUFDQyxNQUFNLEVBQUU3QixPQUFPLENBQUM7TUFDNUM7TUFDQXVDLFlBQVksQ0FBQ2pELElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUNtQixJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbEQsQ0FBQyxNQUFNO01BQ0xrQixHQUFHLENBQUNDLElBQUksQ0FBQ0MsTUFBTSxFQUFFN0IsT0FBTyxDQUFDO01BQ3pCMkIsR0FBRyxDQUFDckMsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQ21CLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6QztFQUNGLENBQUMsQ0FBQztFQUNGLE9BQU9vQixNQUFNO0FBQ2YsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQWhJLE9BQU8sQ0FBQzZGLFNBQVMsQ0FBQ3pCLE1BQU0sR0FBRyxVQUFVcUQsS0FBSyxFQUFFO0VBQzFDLElBQUksQ0FBQ21CLE9BQU8sR0FBR25CLEtBQUssS0FBSyxLQUFLO0VBQzlCLE9BQU8sSUFBSTtBQUNiLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUF6SCxPQUFPLENBQUM2RixTQUFTLENBQUN5QyxTQUFTLEdBQUcsVUFBVVIsR0FBRyxFQUFFO0VBQzNDLElBQUloSSxHQUFHLEdBQUdnSSxHQUFHLENBQUNlLE9BQU8sQ0FBQ0MsUUFBUTtFQUM5QixJQUFJLENBQUNoSixHQUFHLEVBQUU7SUFDUixPQUFPLElBQUksQ0FBQ2lILFFBQVEsQ0FBQyxJQUFJaEIsS0FBSyxDQUFDLGlDQUFpQyxDQUFDLEVBQUUrQixHQUFHLENBQUM7RUFDekU7RUFFQS9JLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUNlLEdBQUcsRUFBRUEsR0FBRyxDQUFDOztFQUV6QztFQUNBO0VBQ0FnSSxHQUFHLENBQUNpQixNQUFNLENBQUMsQ0FBQzs7RUFFWjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQSxJQUFJbkcsTUFBTTtFQUNWLElBQUlELE9BQU87RUFDWCxJQUFJO0lBQ0ZBLE9BQU8sR0FBRyxJQUFJcUcsR0FBRyxDQUFDM0csbUJBQW1CLENBQUMsSUFBSSxDQUFDdkMsR0FBRyxDQUFDLENBQUM7SUFDaEQ4QyxNQUFNLEdBQUcsSUFBSW9HLEdBQUcsQ0FBQ2xKLEdBQUcsRUFBRTZDLE9BQU8sQ0FBQztFQUNoQyxDQUFDLENBQUMsT0FBT3hCLEdBQUcsRUFBRTtJQUNaLE1BQU1zRixLQUFLLEdBQUcsSUFBSVYsS0FBSyxDQUFDLDhCQUE4QmpHLEdBQUcsRUFBRSxDQUFDO0lBQzVEMkcsS0FBSyxDQUFDa0MsSUFBSSxHQUFHLGtCQUFrQjtJQUMvQmxDLEtBQUssQ0FBQ3dDLE1BQU0sR0FBR25CLEdBQUcsQ0FBQ00sVUFBVTtJQUM3QjNCLEtBQUssQ0FBQ3FDLFFBQVEsR0FBR2hKLEdBQUc7SUFDcEIsT0FBTyxJQUFJLENBQUNpSCxRQUFRLENBQUNOLEtBQUssRUFBRXFCLEdBQUcsQ0FBQztFQUNsQztFQUVBLElBQUksQ0FBQ3BGLHVCQUF1QixDQUFDQyxPQUFPLEVBQUVDLE1BQU0sQ0FBQyxFQUFFO0lBQzdDLE1BQU02RCxLQUFLLEdBQUcsSUFBSVYsS0FBSyxDQUNyQiw4Q0FBOENuRCxNQUFNLENBQUNzRyxJQUFJLEVBQzNELENBQUM7SUFDRHpDLEtBQUssQ0FBQ2tDLElBQUksR0FBRyxzQkFBc0I7SUFDbkNsQyxLQUFLLENBQUN3QyxNQUFNLEdBQUduQixHQUFHLENBQUNNLFVBQVU7SUFDN0IzQixLQUFLLENBQUNxQyxRQUFRLEdBQUdoSixHQUFHO0lBQ3BCLE9BQU8sSUFBSSxDQUFDaUgsUUFBUSxDQUFDTixLQUFLLEVBQUVxQixHQUFHLENBQUM7RUFDbEM7RUFFQWhJLEdBQUcsR0FBRzhDLE1BQU0sQ0FBQ3NHLElBQUk7RUFFakIsSUFBSSxDQUFDQyxnQkFBZ0IsQ0FBQ3JCLEdBQUcsQ0FBQztFQUUxQixJQUFJZSxPQUFPLEdBQUcsSUFBSSxDQUFDcEksR0FBRyxDQUFDMkksVUFBVSxHQUFHLElBQUksQ0FBQzNJLEdBQUcsQ0FBQzJJLFVBQVUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDM0ksR0FBRyxDQUFDNEksUUFBUTtFQUU3RSxNQUFNQyxhQUFhLEdBQUcsQ0FBQ3RHLFlBQVksQ0FBQ0wsT0FBTyxFQUFFQyxNQUFNLENBQUM7O0VBRXBEO0VBQ0EsSUFBSWtGLEdBQUcsQ0FBQ00sVUFBVSxLQUFLLEdBQUcsSUFBSU4sR0FBRyxDQUFDTSxVQUFVLEtBQUssR0FBRyxFQUFFO0lBQ3BEO0lBQ0E7SUFDQVMsT0FBTyxHQUFHM0osS0FBSyxDQUFDcUssV0FBVyxDQUFDVixPQUFPLEVBQUVTLGFBQWEsQ0FBQzs7SUFFbkQ7SUFDQSxJQUFJLENBQUN6SixNQUFNLEdBQUcsSUFBSSxDQUFDQSxNQUFNLEtBQUssTUFBTSxHQUFHLE1BQU0sR0FBRyxLQUFLOztJQUVyRDtJQUNBLElBQUksQ0FBQ3VHLEtBQUssR0FBRyxJQUFJO0VBQ25COztFQUVBO0VBQ0EsSUFBSTBCLEdBQUcsQ0FBQ00sVUFBVSxLQUFLLEdBQUcsRUFBRTtJQUMxQjtJQUNBO0lBQ0FTLE9BQU8sR0FBRzNKLEtBQUssQ0FBQ3FLLFdBQVcsQ0FBQ1YsT0FBTyxFQUFFUyxhQUFhLENBQUM7O0lBRW5EO0lBQ0EsSUFBSSxDQUFDekosTUFBTSxHQUFHLEtBQUs7O0lBRW5CO0lBQ0EsSUFBSSxDQUFDdUcsS0FBSyxHQUFHLElBQUk7RUFDbkI7O0VBRUE7RUFDQTtFQUNBLElBQUksQ0FBQzBCLEdBQUcsQ0FBQ00sVUFBVSxLQUFLLEdBQUcsSUFBSU4sR0FBRyxDQUFDTSxVQUFVLEtBQUssR0FBRyxLQUFLa0IsYUFBYSxFQUFFO0lBQ3ZFLE9BQU9ULE9BQU8sQ0FBQ1csYUFBYTtJQUM1QixPQUFPWCxPQUFPLENBQUNZLE1BQU07RUFDdkI7O0VBRUE7RUFDQTtFQUNBO0VBQ0EsSUFBSUgsYUFBYSxFQUFFO0lBQ2pCLElBQUksQ0FBQ0ksUUFBUSxHQUFHN0ksU0FBUztJQUN6QixJQUFJLENBQUM4SSxRQUFRLEdBQUc5SSxTQUFTO0VBQzNCO0VBRUEsT0FBT2dJLE9BQU8sQ0FBQ2UsSUFBSTtFQUVuQixPQUFPLElBQUksQ0FBQ25KLEdBQUc7RUFDZixPQUFPLElBQUksQ0FBQ3NFLFNBQVM7O0VBRXJCO0VBQ0FWLFlBQVksQ0FBQyxJQUFJLENBQUM7O0VBRWxCO0VBQ0EsSUFBSSxDQUFDeUQsR0FBRyxHQUFHQSxHQUFHO0VBQ2QsSUFBSSxDQUFDK0IsVUFBVSxHQUFHLEtBQUs7RUFDdkIsSUFBSSxDQUFDL0osR0FBRyxHQUFHQSxHQUFHO0VBQ2QsSUFBSSxDQUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQztFQUNaLElBQUksQ0FBQzBHLE1BQU0sQ0FBQ2pGLE1BQU0sR0FBRyxDQUFDO0VBQ3RCLElBQUksQ0FBQ2lILEdBQUcsQ0FBQ3lCLE9BQU8sQ0FBQztFQUNqQixJQUFJLENBQUNpQixhQUFhLENBQUMsQ0FBQztFQUNwQixJQUFJLENBQUN4RSxhQUFhLENBQUN0RCxJQUFJLENBQUMsSUFBSSxDQUFDbEMsR0FBRyxDQUFDO0VBQ2pDLElBQUksQ0FBQ0csR0FBRyxDQUFDLElBQUksQ0FBQzhKLFNBQVMsQ0FBQztFQUN4QixPQUFPLElBQUk7QUFDYixDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBL0osT0FBTyxDQUFDNkYsU0FBUyxDQUFDbUUsSUFBSSxHQUFHLFVBQVVDLElBQUksRUFBRUMsSUFBSSxFQUFFL0QsT0FBTyxFQUFFO0VBQ3RELElBQUlqRyxTQUFTLENBQUNDLE1BQU0sS0FBSyxDQUFDLEVBQUUrSixJQUFJLEdBQUcsRUFBRTtFQUNyQyxJQUFJLE9BQU9BLElBQUksS0FBSyxRQUFRLElBQUlBLElBQUksS0FBSyxJQUFJLEVBQUU7SUFDN0M7SUFDQS9ELE9BQU8sR0FBRytELElBQUk7SUFDZEEsSUFBSSxHQUFHLEVBQUU7RUFDWDtFQUVBLElBQUksQ0FBQy9ELE9BQU8sRUFBRTtJQUNaQSxPQUFPLEdBQUc7TUFBRWdCLElBQUksRUFBRTtJQUFRLENBQUM7RUFDN0I7RUFFQSxNQUFNZ0QsT0FBTyxHQUFJQyxNQUFNLElBQUtDLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDRixNQUFNLENBQUMsQ0FBQ0csUUFBUSxDQUFDLFFBQVEsQ0FBQztFQUVsRSxPQUFPLElBQUksQ0FBQ0MsS0FBSyxDQUFDUCxJQUFJLEVBQUVDLElBQUksRUFBRS9ELE9BQU8sRUFBRWdFLE9BQU8sQ0FBQztBQUNqRCxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBbkssT0FBTyxDQUFDNkYsU0FBUyxDQUFDNEUsRUFBRSxHQUFHLFVBQVVDLElBQUksRUFBRTtFQUNyQyxJQUFJLENBQUNDLEdBQUcsR0FBR0QsSUFBSTtFQUNmLE9BQU8sSUFBSTtBQUNiLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUExSyxPQUFPLENBQUM2RixTQUFTLENBQUMxQixHQUFHLEdBQUcsVUFBVXVHLElBQUksRUFBRTtFQUN0QyxJQUFJLENBQUNFLElBQUksR0FBR0YsSUFBSTtFQUNoQixPQUFPLElBQUk7QUFDYixDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBMUssT0FBTyxDQUFDNkYsU0FBUyxDQUFDZ0YsR0FBRyxHQUFHLFVBQVVILElBQUksRUFBRTtFQUN0QyxJQUFJLE9BQU9BLElBQUksS0FBSyxRQUFRLElBQUksQ0FBQ0wsTUFBTSxDQUFDUyxRQUFRLENBQUNKLElBQUksQ0FBQyxFQUFFO0lBQ3RELElBQUksQ0FBQ0ssSUFBSSxHQUFHTCxJQUFJLENBQUNHLEdBQUc7SUFDcEIsSUFBSSxDQUFDRyxXQUFXLEdBQUdOLElBQUksQ0FBQ08sVUFBVTtFQUNwQyxDQUFDLE1BQU07SUFDTCxJQUFJLENBQUNGLElBQUksR0FBR0wsSUFBSTtFQUNsQjtFQUVBLE9BQU8sSUFBSTtBQUNiLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUExSyxPQUFPLENBQUM2RixTQUFTLENBQUM2RSxJQUFJLEdBQUcsVUFBVUEsSUFBSSxFQUFFO0VBQ3ZDLElBQUksQ0FBQ1EsS0FBSyxHQUFHUixJQUFJO0VBQ2pCLE9BQU8sSUFBSTtBQUNiLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUExSyxPQUFPLENBQUM2RixTQUFTLENBQUNzRixlQUFlLEdBQUcsWUFBWTtFQUM5QyxJQUFJLENBQUNDLGdCQUFnQixHQUFHLElBQUk7RUFDNUIsT0FBTyxJQUFJO0FBQ2IsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQXBMLE9BQU8sQ0FBQzZGLFNBQVMsQ0FBQ2pHLE9BQU8sR0FBRyxZQUFZO0VBQ3RDLElBQUksSUFBSSxDQUFDYSxHQUFHLEVBQUUsT0FBTyxJQUFJLENBQUNBLEdBQUc7RUFFN0IsTUFBTTBGLE9BQU8sR0FBRyxDQUFDLENBQUM7RUFFbEIsSUFBSTtJQUNGLE1BQU1xQixLQUFLLEdBQUc5SSxFQUFFLENBQUM4RSxTQUFTLENBQUMsSUFBSSxDQUFDOUUsRUFBRSxFQUFFO01BQ2xDK0UsT0FBTyxFQUFFLEtBQUs7TUFDZEMsa0JBQWtCLEVBQUU7SUFDdEIsQ0FBQyxDQUFDO0lBQ0YsSUFBSThELEtBQUssRUFBRTtNQUNULElBQUksQ0FBQzlJLEVBQUUsR0FBRyxDQUFDLENBQUM7TUFDWixJQUFJLENBQUMwRyxNQUFNLENBQUNwRCxJQUFJLENBQUN3RixLQUFLLENBQUM7SUFDekI7SUFFQSxJQUFJLENBQUM2RCxvQkFBb0IsQ0FBQyxDQUFDO0VBQzdCLENBQUMsQ0FBQyxPQUFPbEssR0FBRyxFQUFFO0lBQ1osT0FBTyxJQUFJLENBQUN5RixJQUFJLENBQUMsT0FBTyxFQUFFekYsR0FBRyxDQUFDO0VBQ2hDO0VBRUEsTUFBTUUsU0FBUyxHQUFHZ0IsbUJBQW1CLENBQUMsSUFBSSxDQUFDdkMsR0FBRyxDQUFDO0VBQy9DLE1BQU13TCxPQUFPLEdBQUcsSUFBSSxDQUFDQyxRQUFRO0VBRTdCLE1BQU1DLFlBQVksR0FBR3BLLG1CQUFtQixDQUFDQyxTQUFTLENBQUM7RUFDbkQsTUFBTXZCLEdBQUcsR0FBRyxJQUFJa0osR0FBRyxDQUFDd0MsWUFBWSxDQUFDbkssU0FBUyxDQUFDO0VBQzNDLElBQUk7SUFBRXlCO0VBQVMsQ0FBQyxHQUFHaEQsR0FBRztFQUN0QixNQUFNMkIsSUFBSSxHQUFHK0osWUFBWSxDQUFDaEssV0FBVyxDQUFDLEdBQUcxQixHQUFHLENBQUMyTCxRQUFRLEdBQUczTCxHQUFHLENBQUM0TCxNQUFNLEVBQUUsQ0FBQzs7RUFFckU7RUFDQSxJQUFJLGdCQUFnQixDQUFDQyxJQUFJLENBQUM3SSxRQUFRLENBQUMsS0FBSyxJQUFJLEVBQUU7SUFDNUM7SUFDQUEsUUFBUSxHQUFHLEdBQUdBLFFBQVEsQ0FBQzhJLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRztJQUV2QyxJQUFJLENBQUM5TCxHQUFHLENBQUNpRCxRQUFRLEVBQUU7TUFDakIsTUFBTSxJQUFJZ0QsS0FBSyxDQUNiLHNGQUNGLENBQUM7SUFDSDs7SUFFQTtJQUNBSSxPQUFPLENBQUMwRixVQUFVLEdBQUcvTCxHQUFHLENBQUNpRCxRQUFRLENBQUNuQixPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQztJQUN0RDlCLEdBQUcsQ0FBQzhKLElBQUksR0FBRyxFQUFFO0lBQ2I5SixHQUFHLENBQUNpRCxRQUFRLEdBQUcsRUFBRTtFQUNuQjs7RUFFQTtFQUNBLElBQUksSUFBSSxDQUFDK0ksZ0JBQWdCLEVBQUU7SUFDekIsTUFBTTtNQUFFL0k7SUFBUyxDQUFDLEdBQUdqRCxHQUFHO0lBQ3hCO0lBQ0E7SUFDQSxNQUFNeUIsS0FBSyxHQUFHL0IsTUFBTSxDQUFDLElBQUksQ0FBQ3NNLGdCQUFnQixFQUFFL0ksUUFBUSxDQUFDLEdBQ2pELElBQUksQ0FBQytJLGdCQUFnQixDQUFDL0ksUUFBUSxDQUFDLEdBQy9CLElBQUksQ0FBQytJLGdCQUFnQixDQUFDLEdBQUcsQ0FBQztJQUM5QixJQUFJdkssS0FBSyxFQUFFO01BQ1Q7TUFDQSxJQUFJLENBQUMsSUFBSSxDQUFDK0MsT0FBTyxDQUFDc0YsSUFBSSxFQUFFO1FBQ3RCLElBQUksQ0FBQ3hDLEdBQUcsQ0FBQyxNQUFNLEVBQUV0SCxHQUFHLENBQUM4SixJQUFJLENBQUM7TUFDNUI7TUFFQSxJQUFJbUMsT0FBTztNQUNYLElBQUlDLE9BQU87TUFFWCxJQUFJLE9BQU96SyxLQUFLLEtBQUssUUFBUSxFQUFFO1FBQzdCd0ssT0FBTyxHQUFHeEssS0FBSyxDQUFDcUksSUFBSTtRQUNwQm9DLE9BQU8sR0FBR3pLLEtBQUssQ0FBQzJCLElBQUk7TUFDdEIsQ0FBQyxNQUFNO1FBQ0w2SSxPQUFPLEdBQUd4SyxLQUFLO1FBQ2Z5SyxPQUFPLEdBQUdsTSxHQUFHLENBQUNvRCxJQUFJO01BQ3BCOztNQUVBO01BQ0FwRCxHQUFHLENBQUM4SixJQUFJLEdBQUcsR0FBRyxDQUFDK0IsSUFBSSxDQUFDSSxPQUFPLENBQUMsR0FBRyxJQUFJQSxPQUFPLEdBQUcsR0FBR0EsT0FBTztNQUN2RCxJQUFJQyxPQUFPLEVBQUU7UUFDWGxNLEdBQUcsQ0FBQzhKLElBQUksSUFBSSxJQUFJb0MsT0FBTyxFQUFFO1FBQ3pCbE0sR0FBRyxDQUFDb0QsSUFBSSxHQUFHOEksT0FBTztNQUNwQjtNQUVBbE0sR0FBRyxDQUFDaUQsUUFBUSxHQUFHZ0osT0FBTztJQUN4QjtFQUNGOztFQUVBO0VBQ0E1RixPQUFPLENBQUN0RyxNQUFNLEdBQUcsSUFBSSxDQUFDQSxNQUFNO0VBQzVCc0csT0FBTyxDQUFDakQsSUFBSSxHQUFHcEQsR0FBRyxDQUFDb0QsSUFBSTtFQUN2QmlELE9BQU8sQ0FBQzFFLElBQUksR0FBR0EsSUFBSTtFQUNuQjBFLE9BQU8sQ0FBQ3lELElBQUksR0FBRzFLLEtBQUssQ0FBQytNLGlCQUFpQixDQUFDbk0sR0FBRyxDQUFDaUQsUUFBUSxDQUFDLENBQUMsQ0FBQztFQUN0RDtFQUNBO0VBQ0E7RUFDQTtFQUNBLElBQUksQ0FBQyxJQUFJLENBQUMwQixZQUFZLEVBQUU7SUFDdEIwQixPQUFPLENBQUMwQyxPQUFPLEdBQUc7TUFBRSxHQUFHLElBQUksQ0FBQ3RFO0lBQU8sQ0FBQztFQUN0QztFQUVBNEIsT0FBTyxDQUFDc0UsRUFBRSxHQUFHLElBQUksQ0FBQ0UsR0FBRztFQUNyQnhFLE9BQU8sQ0FBQ2hDLEdBQUcsR0FBRyxJQUFJLENBQUN5RyxJQUFJO0VBQ3ZCekUsT0FBTyxDQUFDMEUsR0FBRyxHQUFHLElBQUksQ0FBQ0UsSUFBSTtFQUN2QjVFLE9BQU8sQ0FBQ3VFLElBQUksR0FBRyxJQUFJLENBQUNRLEtBQUs7RUFDekIvRSxPQUFPLENBQUM4RSxVQUFVLEdBQUcsSUFBSSxDQUFDRCxXQUFXO0VBQ3JDN0UsT0FBTyxDQUFDOUYsS0FBSyxHQUFHLElBQUksQ0FBQ3lFLE1BQU07RUFDM0JxQixPQUFPLENBQUNlLE1BQU0sR0FBRyxJQUFJLENBQUMxQixPQUFPO0VBQzdCVyxPQUFPLENBQUMrRixrQkFBa0IsR0FDeEIsT0FBTyxJQUFJLENBQUNkLGdCQUFnQixLQUFLLFNBQVMsR0FDdEMsQ0FBQyxJQUFJLENBQUNBLGdCQUFnQixHQUN0QnpHLE9BQU8sQ0FBQ0MsR0FBRyxDQUFDdUgsNEJBQTRCLEtBQUssR0FBRzs7RUFFdEQ7RUFDQSxJQUFJLElBQUksQ0FBQzdILE9BQU8sQ0FBQ3NGLElBQUksRUFBRTtJQUNyQnpELE9BQU8sQ0FBQ2lHLFVBQVUsR0FBRyxJQUFJLENBQUM5SCxPQUFPLENBQUNzRixJQUFJLENBQUNoSSxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztFQUM3RDtFQUVBLElBQ0UsSUFBSSxDQUFDeUssZUFBZSxJQUNwQiwyQ0FBMkMsQ0FBQ1YsSUFBSSxDQUFDN0wsR0FBRyxDQUFDaUQsUUFBUSxDQUFDLEVBQzlEO0lBQ0FvRCxPQUFPLENBQUMrRixrQkFBa0IsR0FBRyxLQUFLO0VBQ3BDOztFQUVBO0VBQ0EsTUFBTUksT0FBTyxHQUFHLElBQUksQ0FBQzdILFlBQVksR0FDN0IxRSxPQUFPLENBQUNxRCxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUNtSixXQUFXLENBQUN6SixRQUFRLENBQUMsR0FDakQvQyxPQUFPLENBQUNxRCxTQUFTLENBQUNOLFFBQVEsQ0FBQzs7RUFFL0I7RUFDQSxJQUFJLENBQUNyQyxHQUFHLEdBQUc2TCxPQUFPLENBQUMxTSxPQUFPLENBQUN1RyxPQUFPLENBQUM7RUFDbkMsTUFBTTtJQUFFMUY7RUFBSSxDQUFDLEdBQUcsSUFBSTs7RUFFcEI7RUFDQTtFQUNBQSxHQUFHLENBQUMrRixFQUFFLENBQUMsT0FBTyxFQUFHQyxLQUFLLElBQUs7SUFDekI7SUFDQTtJQUNBO0lBQ0EsSUFBSSxJQUFJLENBQUMrQixRQUFRLElBQUksSUFBSSxDQUFDOUgsZ0JBQWdCLEVBQUU7SUFDNUM7SUFDQTtJQUNBLElBQUksSUFBSSxDQUFDNkssUUFBUSxLQUFLRCxPQUFPLEVBQUU7SUFDL0I7SUFDQTtJQUNBLElBQUksSUFBSSxDQUFDa0IsUUFBUSxFQUFFO0lBQ25CLElBQUksQ0FBQ3pGLFFBQVEsQ0FBQ04sS0FBSyxDQUFDO0VBQ3RCLENBQUMsQ0FBQztFQUVGLElBQUk7SUFDRjtJQUNBaEcsR0FBRyxDQUFDZ00sVUFBVSxDQUFDLElBQUksQ0FBQztJQUVwQixJQUFJdEcsT0FBTyxDQUFDdEcsTUFBTSxLQUFLLE1BQU0sRUFBRTtNQUM3QlksR0FBRyxDQUFDaU0sU0FBUyxDQUFDLGlCQUFpQixFQUFFLGVBQWUsQ0FBQztJQUNuRDtJQUVBLElBQUksQ0FBQzVKLFFBQVEsR0FBR0EsUUFBUTtJQUN4QixJQUFJLENBQUM4RyxJQUFJLEdBQUc5SixHQUFHLENBQUM4SixJQUFJOztJQUVwQjtJQUNBLE1BQU0rQyxTQUFTLEdBQUdBLENBQUEsS0FBTTtNQUN0QixJQUFJLENBQUMvRixJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3BCLENBQUM7SUFFRG5HLEdBQUcsQ0FBQytGLEVBQUUsQ0FBQyxPQUFPLEVBQUVtRyxTQUFTLENBQUM7SUFDMUJsTSxHQUFHLENBQUNnRixJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU07TUFDdEJoRixHQUFHLENBQUNHLGNBQWMsQ0FBQyxPQUFPLEVBQUUrTCxTQUFTLENBQUM7SUFDeEMsQ0FBQyxDQUFDOztJQUVGO0lBQ0EsSUFBSTdNLEdBQUcsQ0FBQzRKLFFBQVEsSUFBSTVKLEdBQUcsQ0FBQzZKLFFBQVEsRUFBRTtNQUNoQyxJQUFJLENBQUNLLElBQUksQ0FBQ2xLLEdBQUcsQ0FBQzRKLFFBQVEsRUFBRTVKLEdBQUcsQ0FBQzZKLFFBQVEsQ0FBQztJQUN2QztJQUVBLElBQUksSUFBSSxDQUFDRCxRQUFRLElBQUksSUFBSSxDQUFDQyxRQUFRLEVBQUU7TUFDbEMsSUFBSSxDQUFDSyxJQUFJLENBQUMsSUFBSSxDQUFDTixRQUFRLEVBQUUsSUFBSSxDQUFDQyxRQUFRLENBQUM7SUFDekM7SUFFQSxLQUFLLE1BQU14RixHQUFHLElBQUksSUFBSSxDQUFDSSxNQUFNLEVBQUU7TUFDN0IsSUFBSS9FLE1BQU0sQ0FBQyxJQUFJLENBQUMrRSxNQUFNLEVBQUVKLEdBQUcsQ0FBQyxFQUFFMUQsR0FBRyxDQUFDaU0sU0FBUyxDQUFDdkksR0FBRyxFQUFFLElBQUksQ0FBQ0ksTUFBTSxDQUFDSixHQUFHLENBQUMsQ0FBQztJQUNwRTs7SUFFQTtJQUNBLElBQUksSUFBSSxDQUFDZ0IsT0FBTyxFQUFFO01BQ2hCLElBQUkzRixNQUFNLENBQUMsSUFBSSxDQUFDOEUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxFQUFFO1FBQ2xDO1FBQ0EsTUFBTXNJLFlBQVksR0FBRyxJQUFJNU4sU0FBUyxDQUFDQSxTQUFTLENBQUMsQ0FBQztRQUM5QzROLFlBQVksQ0FBQ0MsVUFBVSxDQUFDLElBQUksQ0FBQ3ZJLE9BQU8sQ0FBQ21GLE1BQU0sQ0FBQ21DLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4RGdCLFlBQVksQ0FBQ0MsVUFBVSxDQUFDLElBQUksQ0FBQzFILE9BQU8sQ0FBQ3lHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqRG5MLEdBQUcsQ0FBQ2lNLFNBQVMsQ0FDWCxRQUFRLEVBQ1JFLFlBQVksQ0FDVEUsVUFBVSxDQUFDOU4sU0FBUyxDQUFDK04sZ0JBQWdCLENBQUNDLEdBQUcsQ0FBQyxDQUMxQ0MsYUFBYSxDQUFDLENBQ25CLENBQUM7TUFDSCxDQUFDLE1BQU07UUFDTHhNLEdBQUcsQ0FBQ2lNLFNBQVMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDdkgsT0FBTyxDQUFDO01BQ3ZDO0lBQ0Y7SUFFQSxPQUFPMUUsR0FBRztFQUNaLENBQUMsQ0FBQyxPQUFPVSxHQUFHLEVBQUU7SUFDWlosa0JBQWtCLENBQUMsSUFBSSxDQUFDO0lBQ3hCLE1BQU1ZLEdBQUc7RUFDWDtBQUNGLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBbkIsT0FBTyxDQUFDNkYsU0FBUyxDQUFDcUgsZUFBZSxHQUFHLFlBQVk7RUFDOUMzTSxrQkFBa0IsQ0FBQyxJQUFJLENBQUM7QUFDMUIsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQVAsT0FBTyxDQUFDNkYsU0FBUyxDQUFDc0gsWUFBWSxHQUFHLFVBQVUxRyxLQUFLLEVBQUU7RUFDaEQsSUFBSSxDQUFDeUcsZUFBZSxDQUFDLENBQUM7RUFDdEIsSUFBSSxPQUFPLElBQUksQ0FBQ25ELFNBQVMsS0FBSyxVQUFVLElBQUksSUFBSSxDQUFDQSxTQUFTLEtBQUt6SixJQUFJLEVBQUU7SUFDbkUsSUFBSSxDQUFDeUcsUUFBUSxDQUFDTixLQUFLLENBQUM7SUFDcEI7RUFDRjtFQUVBLE1BQU1BLEtBQUs7QUFDYixDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUF6RyxPQUFPLENBQUM2RixTQUFTLENBQUNrQixRQUFRLEdBQUcsVUFBVU4sS0FBSyxFQUFFcUIsR0FBRyxFQUFFO0VBQ2pELElBQUksSUFBSSxDQUFDc0YsWUFBWSxDQUFDM0csS0FBSyxFQUFFcUIsR0FBRyxDQUFDLEVBQUU7SUFDakMsT0FBTyxJQUFJLENBQUN1RixNQUFNLENBQUMsQ0FBQztFQUN0Qjs7RUFFQTtFQUNBLE1BQU1DLEVBQUUsR0FBRyxJQUFJLENBQUN2RCxTQUFTLElBQUl6SixJQUFJO0VBQ2pDLElBQUksQ0FBQ29GLFlBQVksQ0FBQyxDQUFDO0VBQ25CLElBQUksSUFBSSxDQUFDb0IsTUFBTSxFQUFFO0lBQ2YsSUFBSSxJQUFJLENBQUN5RyxRQUFRLEVBQUU7SUFDbkIsT0FBT0MsT0FBTyxDQUFDQyxJQUFJLENBQUMsaUNBQWlDLENBQUM7RUFDeEQ7RUFFQSxJQUFJLENBQUMzRyxNQUFNLEdBQUcsSUFBSTtFQUVsQixJQUFJLENBQUNMLEtBQUssRUFBRTtJQUNWLElBQUk7TUFDRixJQUFJLENBQUMsSUFBSSxDQUFDaUgsYUFBYSxDQUFDNUYsR0FBRyxDQUFDLEVBQUU7UUFDNUIsSUFBSTZGLE9BQU8sR0FBRyw0QkFBNEI7UUFDMUMsSUFBSTdGLEdBQUcsRUFBRTtVQUNQNkYsT0FBTyxHQUFHclAsSUFBSSxDQUFDc1AsWUFBWSxDQUFDOUYsR0FBRyxDQUFDbUIsTUFBTSxDQUFDLElBQUkwRSxPQUFPO1FBQ3BEO1FBRUFsSCxLQUFLLEdBQUcsSUFBSVYsS0FBSyxDQUFDNEgsT0FBTyxDQUFDO1FBQzFCbEgsS0FBSyxDQUFDd0MsTUFBTSxHQUFHbkIsR0FBRyxHQUFHQSxHQUFHLENBQUNtQixNQUFNLEdBQUdwSSxTQUFTO01BQzdDO0lBQ0YsQ0FBQyxDQUFDLE9BQU9NLEdBQUcsRUFBRTtNQUNac0YsS0FBSyxHQUFHdEYsR0FBRztNQUNYc0YsS0FBSyxDQUFDd0MsTUFBTSxHQUFHeEMsS0FBSyxDQUFDd0MsTUFBTSxLQUFLbkIsR0FBRyxHQUFHQSxHQUFHLENBQUNtQixNQUFNLEdBQUdwSSxTQUFTLENBQUM7SUFDL0Q7RUFDRjs7RUFFQTtFQUNBO0VBQ0EsSUFBSSxDQUFDNEYsS0FBSyxFQUFFO0lBQ1YsT0FBTzZHLEVBQUUsQ0FBQyxJQUFJLEVBQUV4RixHQUFHLENBQUM7RUFDdEI7RUFFQXJCLEtBQUssQ0FBQytGLFFBQVEsR0FBRzFFLEdBQUc7RUFDcEIsSUFBSSxJQUFJLENBQUMrRixXQUFXLEVBQUVwSCxLQUFLLENBQUM2RSxPQUFPLEdBQUcsSUFBSSxDQUFDQyxRQUFRLEdBQUcsQ0FBQzs7RUFFdkQ7RUFDQTtFQUNBLElBQUk5RSxLQUFLLElBQUksSUFBSSxDQUFDcUgsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDM04sTUFBTSxHQUFHLENBQUMsRUFBRTtJQUMvQyxJQUFJLENBQUN5RyxJQUFJLENBQUMsT0FBTyxFQUFFSCxLQUFLLENBQUM7RUFDM0I7RUFFQTZHLEVBQUUsQ0FBQzdHLEtBQUssRUFBRXFCLEdBQUcsQ0FBQztBQUNoQixDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E5SCxPQUFPLENBQUM2RixTQUFTLENBQUNrSSxPQUFPLEdBQUcsVUFBVXhLLE1BQU0sRUFBRTtFQUM1QyxPQUNFOEcsTUFBTSxDQUFDUyxRQUFRLENBQUN2SCxNQUFNLENBQUMsSUFDdkJBLE1BQU0sWUFBWW5GLE1BQU0sSUFDeEJtRixNQUFNLFlBQVkxRSxRQUFRO0FBRTlCLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQW1CLE9BQU8sQ0FBQzZGLFNBQVMsQ0FBQzBDLGFBQWEsR0FBRyxVQUFVeUYsSUFBSSxFQUFFQyxLQUFLLEVBQUU7RUFDdkQsTUFBTXpCLFFBQVEsR0FBRyxJQUFJbE4sUUFBUSxDQUFDLElBQUksQ0FBQztFQUNuQyxJQUFJLENBQUNrTixRQUFRLEdBQUdBLFFBQVE7RUFDeEJBLFFBQVEsQ0FBQ3RILFNBQVMsR0FBRyxJQUFJLENBQUNJLGFBQWE7RUFDdkMsSUFBSXpFLFNBQVMsS0FBS21OLElBQUksRUFBRTtJQUN0QnhCLFFBQVEsQ0FBQ3dCLElBQUksR0FBR0EsSUFBSTtFQUN0QjtFQUVBeEIsUUFBUSxDQUFDeUIsS0FBSyxHQUFHQSxLQUFLO0VBQ3RCLElBQUksSUFBSSxDQUFDcEUsVUFBVSxFQUFFO0lBQ25CMkMsUUFBUSxDQUFDekUsSUFBSSxHQUFHLFlBQVk7TUFDMUIsTUFBTSxJQUFJaEMsS0FBSyxDQUNiLGlFQUNGLENBQUM7SUFDSCxDQUFDO0VBQ0g7RUFFQSxJQUFJLENBQUNhLElBQUksQ0FBQyxVQUFVLEVBQUU0RixRQUFRLENBQUM7RUFDL0IsT0FBT0EsUUFBUTtBQUNqQixDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUF4TSxPQUFPLENBQUM2RixTQUFTLENBQUNpRSxhQUFhLEdBQUcsWUFBWTtFQUM1QyxNQUFNMEMsUUFBUSxHQUFHLElBQUlsTixRQUFRLENBQUMsSUFBSSxDQUFDO0VBQ25Da04sUUFBUSxDQUFDdEgsU0FBUyxHQUFHLElBQUksQ0FBQ0ksYUFBYTtFQUN2QyxJQUFJLENBQUNzQixJQUFJLENBQUMsVUFBVSxFQUFFNEYsUUFBUSxDQUFDO0FBQ2pDLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBeE0sT0FBTyxDQUFDNkYsU0FBUyxDQUFDc0QsZ0JBQWdCLEdBQUcsVUFBVXJCLEdBQUcsRUFBRTtFQUNsRCxJQUFJLENBQUNBLEdBQUcsR0FBR0EsR0FBRztFQUNkLE1BQU0wRSxRQUFRLEdBQUcsSUFBSWxOLFFBQVEsQ0FBQyxJQUFJLENBQUM7RUFDbkNrTixRQUFRLENBQUN0SCxTQUFTLEdBQUcsSUFBSSxDQUFDSSxhQUFhO0VBQ3ZDLElBQUksQ0FBQ3NCLElBQUksQ0FBQyxjQUFjLEVBQUU0RixRQUFRLENBQUM7QUFDckMsQ0FBQztBQUVEeE0sT0FBTyxDQUFDNkYsU0FBUyxDQUFDNUYsR0FBRyxHQUFHLFVBQVVxTixFQUFFLEVBQUU7RUFDcEMsSUFBSTtJQUNGLElBQUksQ0FBQzFOLE9BQU8sQ0FBQyxDQUFDO0VBQ2hCLENBQUMsQ0FBQyxPQUFPdUIsR0FBRyxFQUFFO0lBQ1osSUFBSSxDQUFDMEksVUFBVSxHQUFHLElBQUk7SUFDdEIsSUFBSSxPQUFPeUQsRUFBRSxLQUFLLFVBQVUsRUFBRTtNQUM1QixJQUFJLENBQUN2RCxTQUFTLEdBQUd1RCxFQUFFO01BQ25CLElBQUksQ0FBQ3ZHLFFBQVEsQ0FBQzVGLEdBQUcsQ0FBQztNQUNsQjtJQUNGO0lBRUEsTUFBTUEsR0FBRztFQUNYO0VBRUFwQyxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQ2MsTUFBTSxFQUFFLElBQUksQ0FBQ0MsR0FBRyxDQUFDO0VBRXJDLElBQUksSUFBSSxDQUFDK0osVUFBVSxFQUFFO0lBQ25CLE1BQU0sSUFBSTlELEtBQUssQ0FDYiw4REFDRixDQUFDO0VBQ0g7RUFFQSxJQUFJLENBQUM4RCxVQUFVLEdBQUcsSUFBSTs7RUFFdEI7RUFDQSxJQUFJLENBQUNFLFNBQVMsR0FBR3VELEVBQUUsSUFBSWhOLElBQUk7RUFFM0IsSUFBSSxDQUFDNE4sSUFBSSxDQUFDLENBQUM7QUFDYixDQUFDO0FBRURsTyxPQUFPLENBQUM2RixTQUFTLENBQUNxSSxJQUFJLEdBQUcsWUFBWTtFQUNuQyxJQUFJLElBQUksQ0FBQzFGLFFBQVEsRUFDZixPQUFPLElBQUksQ0FBQ3pCLFFBQVEsQ0FDbEIsSUFBSWhCLEtBQUssQ0FBQyw0REFBNEQsQ0FDeEUsQ0FBQztFQUVILElBQUk2QixJQUFJLEdBQUcsSUFBSSxDQUFDeEIsS0FBSztFQUNyQixNQUFNO0lBQUUzRjtFQUFJLENBQUMsR0FBRyxJQUFJO0VBQ3BCLE1BQU07SUFBRVo7RUFBTyxDQUFDLEdBQUcsSUFBSTtFQUV2QixJQUFJLENBQUNzTyxZQUFZLENBQUMsQ0FBQzs7RUFFbkI7RUFDQSxJQUFJdE8sTUFBTSxLQUFLLE1BQU0sSUFBSSxDQUFDWSxHQUFHLENBQUMyTixXQUFXLEVBQUU7SUFDekMsSUFBSTtNQUNGO01BQ0EsSUFBSSxPQUFPeEcsSUFBSSxLQUFLLFFBQVEsRUFBRTtRQUM1QixJQUFJeUcsV0FBVyxHQUFHNU4sR0FBRyxDQUFDNk4sU0FBUyxDQUFDLGNBQWMsQ0FBQztRQUMvQztRQUNBLElBQUlELFdBQVcsRUFBRUEsV0FBVyxHQUFHQSxXQUFXLENBQUN6QyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hELElBQUl2SSxTQUFTLEdBQ1gsSUFBSSxDQUFDa0wsV0FBVyxLQUNmL08sTUFBTSxDQUFDTyxPQUFPLENBQUNzRCxTQUFTLEVBQUVnTCxXQUFXLENBQUMsR0FDbkN0TyxPQUFPLENBQUNzRCxTQUFTLENBQUNnTCxXQUFXLENBQUMsR0FDOUJ4TixTQUFTLENBQUM7UUFDaEIsSUFBSSxDQUFDd0MsU0FBUyxJQUFJbUwsTUFBTSxDQUFDSCxXQUFXLENBQUMsRUFBRTtVQUNyQ2hMLFNBQVMsR0FBR3RELE9BQU8sQ0FBQ3NELFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQztRQUNuRDtRQUVBLElBQUlBLFNBQVMsRUFBRXVFLElBQUksR0FBR3ZFLFNBQVMsQ0FBQ3VFLElBQUksQ0FBQztNQUN2Qzs7TUFFQTtNQUNBLElBQUlBLElBQUksSUFBSSxDQUFDbkgsR0FBRyxDQUFDNk4sU0FBUyxDQUFDLGdCQUFnQixDQUFDLEVBQUU7UUFDNUM3TixHQUFHLENBQUNpTSxTQUFTLENBQ1gsZ0JBQWdCLEVBQ2hCckMsTUFBTSxDQUFDUyxRQUFRLENBQUNsRCxJQUFJLENBQUMsR0FBR0EsSUFBSSxDQUFDekgsTUFBTSxHQUFHa0ssTUFBTSxDQUFDb0UsVUFBVSxDQUFDN0csSUFBSSxDQUM5RCxDQUFDO01BQ0g7SUFDRixDQUFDLENBQUMsT0FBT3pHLEdBQUcsRUFBRTtNQUNaLE9BQU8sSUFBSSxDQUFDZ00sWUFBWSxDQUFDaE0sR0FBRyxDQUFDO0lBQy9CO0VBQ0Y7RUFFQSxJQUFJdU4sY0FBYztFQUNsQixJQUFJLElBQUksQ0FBQy9OLHVCQUF1QixFQUFFO0lBQ2hDRixHQUFHLENBQUNHLGNBQWMsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDRCx1QkFBdUIsQ0FBQztJQUM1RCxJQUFJLENBQUNBLHVCQUF1QixHQUFHRSxTQUFTO0lBQ3hDNk4sY0FBYyxHQUFHLElBQUksQ0FBQzVOLGVBQWU7SUFDckMsSUFBSSxDQUFDQSxlQUFlLEdBQUdELFNBQVM7RUFDbEM7O0VBRUE7RUFDQTtFQUNBLE1BQU04TixjQUFjLEdBQUk3RyxHQUFHLElBQUs7SUFDOUIvSSxLQUFLLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQ2MsTUFBTSxFQUFFLElBQUksQ0FBQ0MsR0FBRyxFQUFFZ0ksR0FBRyxDQUFDTSxVQUFVLENBQUM7SUFFM0QsSUFBSSxJQUFJLENBQUN3RyxxQkFBcUIsRUFBRTtNQUM5QmxKLFlBQVksQ0FBQyxJQUFJLENBQUNrSixxQkFBcUIsQ0FBQztJQUMxQztJQUVBLElBQUksSUFBSSxDQUFDM0csS0FBSyxFQUFFO01BQ2Q7SUFDRjtJQUVBLE1BQU00RyxHQUFHLEdBQUcsSUFBSSxDQUFDeEcsYUFBYTtJQUM5QixNQUFNMUosSUFBSSxHQUFHTyxLQUFLLENBQUNpSSxJQUFJLENBQUNXLEdBQUcsQ0FBQ2UsT0FBTyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLFlBQVk7SUFDMUUsSUFBSTFCLElBQUksR0FBR3hJLElBQUksQ0FBQ2lOLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0IsSUFBSXpFLElBQUksRUFBRUEsSUFBSSxHQUFHQSxJQUFJLENBQUMySCxXQUFXLENBQUMsQ0FBQyxDQUFDQyxJQUFJLENBQUMsQ0FBQztJQUMxQyxNQUFNQyxTQUFTLEdBQUc3SCxJQUFJLEtBQUssV0FBVztJQUN0QyxNQUFNOEgsUUFBUSxHQUFHOUcsVUFBVSxDQUFDTCxHQUFHLENBQUNNLFVBQVUsQ0FBQztJQUMzQyxNQUFNOEcsWUFBWSxHQUFHLElBQUksQ0FBQ0MsYUFBYTtJQUV2QyxJQUFJLENBQUNySCxHQUFHLEdBQUdBLEdBQUc7O0lBRWQ7SUFDQSxJQUFJbUgsUUFBUSxJQUFJLElBQUksQ0FBQ2hLLFVBQVUsRUFBRSxLQUFLNEosR0FBRyxFQUFFO01BQ3pDLE9BQU8sSUFBSSxDQUFDdkcsU0FBUyxDQUFDUixHQUFHLENBQUM7SUFDNUI7SUFFQSxJQUFJLElBQUksQ0FBQ2pJLE1BQU0sS0FBSyxNQUFNLEVBQUU7TUFDMUIsSUFBSSxDQUFDK0csSUFBSSxDQUFDLEtBQUssQ0FBQztNQUNoQixJQUFJLENBQUNHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDd0IsYUFBYSxDQUFDLENBQUMsQ0FBQztNQUN6QztJQUNGOztJQUVBO0lBQ0EsSUFBSUcsWUFBWSxHQUFHLElBQUk7SUFDdkIsSUFBSSxJQUFJLENBQUNELGlCQUFpQixDQUFDWCxHQUFHLENBQUMsRUFBRTtNQUMvQlksWUFBWSxHQUFHckosVUFBVSxDQUFDb0IsR0FBRyxFQUFFcUgsR0FBRyxDQUFDO0lBQ3JDO0lBRUEsSUFBSTFELE1BQU0sR0FBRyxJQUFJLENBQUN3RSxPQUFPO0lBQ3pCLElBQUl4RSxNQUFNLEtBQUt2RCxTQUFTLElBQUlyQixNQUFNLENBQUNPLE9BQU8sQ0FBQ3FFLE1BQU0sRUFBRXpGLElBQUksQ0FBQyxFQUFFO01BQ3hEeUYsTUFBTSxHQUFHTSxPQUFPLENBQUMzRSxPQUFPLENBQUNxRSxNQUFNLENBQUN6RixJQUFJLENBQUMsQ0FBQztJQUN4QztJQUVBLElBQUl5USxNQUFNLEdBQUcsSUFBSSxDQUFDQyxPQUFPO0lBQ3pCLElBQUl4TyxTQUFTLEtBQUt1RCxNQUFNLElBQUlnTCxNQUFNLEVBQUU7TUFDbEM1QixPQUFPLENBQUNDLElBQUksQ0FDViwwTEFDRixDQUFDO01BQ0RySixNQUFNLEdBQUcsSUFBSTtJQUNmO0lBRUEsSUFBSSxDQUFDZ0wsTUFBTSxFQUFFO01BQ1gsSUFBSUYsWUFBWSxFQUFFO1FBQ2hCRSxNQUFNLEdBQUdyUCxPQUFPLENBQUM0RCxLQUFLLENBQUNHLEtBQUssQ0FBQyxDQUFDO1FBQzlCTSxNQUFNLEdBQUcsSUFBSTtNQUNmLENBQUMsTUFBTSxJQUFJNEssU0FBUyxFQUFFO1FBQ3BCLE1BQU1NLElBQUksR0FBR3hRLFVBQVUsQ0FBQ0EsVUFBVSxDQUFDLENBQUM7UUFDcENzUSxNQUFNLEdBQUdBLENBQUN0SCxHQUFHLEVBQUVmLFFBQVEsS0FBSztVQUMxQjtVQUNBLE1BQU13SSxZQUFZLEdBQUcsSUFBSW5SLE1BQU0sQ0FBQ29SLFdBQVcsQ0FBQyxDQUFDOztVQUU3QztVQUNBRCxZQUFZLENBQUMxUCxNQUFNLEdBQUcsSUFBSSxDQUFDQSxNQUFNLElBQUksTUFBTTtVQUMzQzBQLFlBQVksQ0FBQ3pQLEdBQUcsR0FBRyxJQUFJLENBQUNBLEdBQUcsSUFBSSxHQUFHO1VBQ2xDeVAsWUFBWSxDQUFDRSxXQUFXLEdBQUczSCxHQUFHLENBQUMySCxXQUFXLElBQUksS0FBSztVQUNuREYsWUFBWSxDQUFDMUcsT0FBTyxHQUFHZixHQUFHLENBQUNlLE9BQU8sSUFBSSxDQUFDLENBQUM7VUFDeEMwRyxZQUFZLENBQUN0TyxNQUFNLEdBQUc2RyxHQUFHLENBQUM3RyxNQUFNLElBQUk7WUFBRXlPLFFBQVEsRUFBRTtVQUFLLENBQUM7O1VBRXREO1VBQ0E1SCxHQUFHLENBQUNDLElBQUksQ0FBQ3dILFlBQVksQ0FBQztVQUV0QkQsSUFBSSxDQUFDM0wsS0FBSyxDQUFDNEwsWUFBWSxFQUFFLENBQUNwTyxHQUFHLEVBQUV3TyxNQUFNLEVBQUUxQixLQUFLLEtBQUs7WUFDL0MsSUFBSTlNLEdBQUcsRUFBRSxPQUFPNEYsUUFBUSxDQUFDNUYsR0FBRyxDQUFDOztZQUU3QjtZQUNBO1lBQ0EsTUFBTXlPLGVBQWUsR0FBRyxDQUFDLENBQUM7WUFDMUIsSUFBSUQsTUFBTSxFQUFFO2NBQ1YsS0FBSyxNQUFNeEwsR0FBRyxJQUFJd0wsTUFBTSxFQUFFO2dCQUN4QixJQUFJLENBQUMzTCxNQUFNLENBQUM2QixTQUFTLENBQUNnSyxjQUFjLENBQUNyTCxJQUFJLENBQUNtTCxNQUFNLEVBQUV4TCxHQUFHLENBQUMsRUFBRTtnQkFDeEQsTUFBTXNELEtBQUssR0FBR2tJLE1BQU0sQ0FBQ3hMLEdBQUcsQ0FBQztnQkFDekJ5TCxlQUFlLENBQUN6TCxHQUFHLENBQUMsR0FDbEIyTCxLQUFLLENBQUNDLE9BQU8sQ0FBQ3RJLEtBQUssQ0FBQyxJQUFJQSxLQUFLLENBQUN0SCxNQUFNLEtBQUssQ0FBQyxHQUFHc0gsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHQSxLQUFLO2NBQ2pFO1lBQ0Y7WUFFQSxNQUFNdUksY0FBYyxHQUFHLENBQUMsQ0FBQztZQUN6QixJQUFJL0IsS0FBSyxFQUFFO2NBQ1QsS0FBSyxNQUFNOUosR0FBRyxJQUFJOEosS0FBSyxFQUFFO2dCQUN2QixJQUFJLENBQUNqSyxNQUFNLENBQUM2QixTQUFTLENBQUNnSyxjQUFjLENBQUNyTCxJQUFJLENBQUN5SixLQUFLLEVBQUU5SixHQUFHLENBQUMsRUFBRTtnQkFDdkQsTUFBTXNELEtBQUssR0FBR3dHLEtBQUssQ0FBQzlKLEdBQUcsQ0FBQztnQkFDeEI2TCxjQUFjLENBQUM3TCxHQUFHLENBQUMsR0FDakIyTCxLQUFLLENBQUNDLE9BQU8sQ0FBQ3RJLEtBQUssQ0FBQyxJQUFJQSxLQUFLLENBQUN0SCxNQUFNLEtBQUssQ0FBQyxHQUFHc0gsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHQSxLQUFLO2NBQ2pFO1lBQ0Y7O1lBRUE7WUFDQVYsUUFBUSxDQUFDLElBQUksRUFBRTZJLGVBQWUsRUFBRUksY0FBYyxDQUFDO1VBQ2pELENBQUMsQ0FBQztRQUNKLENBQUM7UUFFRDVMLE1BQU0sR0FBRyxJQUFJO01BQ2YsQ0FBQyxNQUFNLElBQUk2TCxRQUFRLENBQUN0UixJQUFJLENBQUMsRUFBRTtRQUN6QnlRLE1BQU0sR0FBR3JQLE9BQU8sQ0FBQzRELEtBQUssQ0FBQ0csS0FBSztRQUM1Qk0sTUFBTSxHQUFHQSxNQUFNLEtBQUssS0FBSyxDQUFDLENBQUM7TUFDN0IsQ0FBQyxNQUFNLElBQUk1RSxNQUFNLENBQUNPLE9BQU8sQ0FBQzRELEtBQUssRUFBRWhGLElBQUksQ0FBQyxFQUFFO1FBQ3RDO1FBQ0E7UUFDQXlRLE1BQU0sR0FBR3JQLE9BQU8sQ0FBQzRELEtBQUssQ0FBQ2hGLElBQUksQ0FBQztNQUM5QixDQUFDLE1BQU0sSUFBSXdJLElBQUksS0FBSyxNQUFNLEVBQUU7UUFDMUJpSSxNQUFNLEdBQUdyUCxPQUFPLENBQUM0RCxLQUFLLENBQUNFLElBQUk7UUFDM0JPLE1BQU0sR0FBR0EsTUFBTSxLQUFLLEtBQUs7UUFDekI7TUFDRixDQUFDLE1BQU0sSUFBSW9LLE1BQU0sQ0FBQzdQLElBQUksQ0FBQyxFQUFFO1FBQ3ZCeVEsTUFBTSxHQUFHclAsT0FBTyxDQUFDNEQsS0FBSyxDQUFDLGtCQUFrQixDQUFDO1FBQzFDUyxNQUFNLEdBQUdBLE1BQU0sS0FBSyxLQUFLO01BQzNCLENBQUMsTUFBTSxJQUFJQSxNQUFNLEVBQUU7UUFDakJnTCxNQUFNLEdBQUdyUCxPQUFPLENBQUM0RCxLQUFLLENBQUNFLElBQUk7TUFDN0IsQ0FBQyxNQUFNLElBQUloRCxTQUFTLEtBQUt1RCxNQUFNLEVBQUU7UUFDL0JnTCxNQUFNLEdBQUdyUCxPQUFPLENBQUM0RCxLQUFLLENBQUNHLEtBQUssQ0FBQyxDQUFDO1FBQzlCTSxNQUFNLEdBQUcsSUFBSTtNQUNmO0lBQ0Y7O0lBRUE7SUFDQSxJQUFLdkQsU0FBUyxLQUFLdUQsTUFBTSxJQUFJOEwsTUFBTSxDQUFDdlIsSUFBSSxDQUFDLElBQUs2UCxNQUFNLENBQUM3UCxJQUFJLENBQUMsRUFBRTtNQUMxRHlGLE1BQU0sR0FBRyxJQUFJO0lBQ2Y7SUFFQSxJQUFJLENBQUMrTCxZQUFZLEdBQUcvTCxNQUFNO0lBQzFCLElBQUlnTSxnQkFBZ0IsR0FBRyxLQUFLO0lBQzVCLElBQUloTSxNQUFNLEVBQUU7TUFDVjtNQUNBLElBQUlpTSxpQkFBaUIsR0FBRyxJQUFJLENBQUNDLGdCQUFnQixJQUFJLFNBQVM7TUFDMUQsSUFBSUMsUUFBUSxHQUFHLEtBQUs7TUFDcEJ6SSxHQUFHLENBQUN0QixFQUFFLENBQUMsTUFBTSxFQUFHZ0ssR0FBRyxJQUFLO1FBQ3RCLElBQUlELFFBQVEsRUFBRTtRQUNkO1FBQ0E7UUFDQUYsaUJBQWlCLElBQUloRyxNQUFNLENBQUNTLFFBQVEsQ0FBQzBGLEdBQUcsQ0FBQyxHQUNyQ0EsR0FBRyxDQUFDclEsTUFBTSxHQUNWa0ssTUFBTSxDQUFDb0UsVUFBVSxDQUFDZ0MsTUFBTSxDQUFDRCxHQUFHLENBQUMsQ0FBQztRQUNsQyxJQUFJSCxpQkFBaUIsR0FBRyxDQUFDLEVBQUU7VUFDekJFLFFBQVEsR0FBRyxJQUFJO1VBQ2YsTUFBTTlKLEtBQUssR0FBRyxJQUFJVixLQUFLLENBQUMsK0JBQStCLENBQUM7VUFDeERVLEtBQUssQ0FBQ2tDLElBQUksR0FBRyxXQUFXO1VBQ3hCO1VBQ0E7VUFDQXlILGdCQUFnQixHQUFHLEtBQUs7VUFDeEI7VUFDQTtVQUNBO1VBQ0EsSUFBSTFILFlBQVksRUFBRUEsWUFBWSxDQUFDMUgsT0FBTyxDQUFDLENBQUM7VUFDeEM7VUFDQTtVQUNBO1VBQ0E4RyxHQUFHLENBQUM5RyxPQUFPLENBQUMsQ0FBQztVQUNiLElBQUksQ0FBQytGLFFBQVEsQ0FBQ04sS0FBSyxFQUFFLElBQUksQ0FBQztRQUM1QjtNQUNGLENBQUMsQ0FBQztJQUNKO0lBRUEsSUFBSTJJLE1BQU0sSUFBSSxDQUFDaEwsTUFBTSxJQUFJTCxpQkFBaUIsQ0FBQ2xCLEdBQUcsQ0FBQ3VNLE1BQU0sQ0FBQyxFQUFFO01BQ3REO01BQ0E7TUFDQTtNQUNBO01BQ0E7TUFDQTtNQUNBLElBQUlBLE1BQU0sS0FBS3hMLGdCQUFnQixDQUFDLG1DQUFtQyxDQUFDLEVBQUU7UUFDcEVrRSxHQUFHLENBQUM0SSxXQUFXLENBQUMsT0FBTyxDQUFDO01BQzFCLENBQUMsTUFBTSxJQUFJdEIsTUFBTSxLQUFLeEwsZ0JBQWdCLENBQUNFLEtBQUssRUFBRTtRQUM1Q2dFLEdBQUcsQ0FBQzRJLFdBQVcsQ0FBQyxNQUFNLENBQUM7TUFDekI7TUFFQXRCLE1BQU0sR0FBRyxJQUFJO0lBQ2Y7SUFFQSxJQUFJQSxNQUFNLEVBQUU7TUFDVixJQUFJO1FBQ0Y7UUFDQTtRQUNBZ0IsZ0JBQWdCLEdBQUdoTSxNQUFNO1FBRXpCZ0wsTUFBTSxDQUFDdEgsR0FBRyxFQUFFLENBQUNyQixLQUFLLEVBQUVsRCxNQUFNLEVBQUUwSyxLQUFLLEtBQUs7VUFDcEMsSUFBSSxJQUFJLENBQUNWLFFBQVEsSUFBSSxJQUFJLENBQUN6RyxNQUFNLEVBQUU7WUFDaEM7WUFDQTtVQUNGOztVQUVBO1VBQ0E7VUFDQSxJQUFJTCxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMrQixRQUFRLEVBQUU7WUFDM0IsT0FBTyxJQUFJLENBQUN6QixRQUFRLENBQUNOLEtBQUssQ0FBQztVQUM3QjtVQUVBLElBQUkySixnQkFBZ0IsRUFBRTtZQUNwQixJQUFJLENBQUN4SixJQUFJLENBQUMsS0FBSyxDQUFDO1lBQ2hCLElBQUksQ0FBQ0csUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUN3QixhQUFhLENBQUNoRixNQUFNLEVBQUUwSyxLQUFLLENBQUMsQ0FBQztVQUN4RDtRQUNGLENBQUMsQ0FBQztNQUNKLENBQUMsQ0FBQyxPQUFPOU0sR0FBRyxFQUFFO1FBQ1osSUFBSSxDQUFDNEYsUUFBUSxDQUFDNUYsR0FBRyxDQUFDO1FBQ2xCO01BQ0Y7SUFDRjtJQUVBLElBQUksQ0FBQzJHLEdBQUcsR0FBR0EsR0FBRzs7SUFFZDtJQUNBLElBQUksQ0FBQzFELE1BQU0sRUFBRTtNQUNYckYsS0FBSyxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQ2MsTUFBTSxFQUFFLElBQUksQ0FBQ0MsR0FBRyxDQUFDO01BQ2hELElBQUksQ0FBQ2lILFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDd0IsYUFBYSxDQUFDLENBQUMsQ0FBQztNQUN6QyxJQUFJeUcsU0FBUyxFQUFFLE9BQU8sQ0FBQztNQUN2QmxILEdBQUcsQ0FBQ3JDLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTTtRQUNwQjFHLEtBQUssQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDYyxNQUFNLEVBQUUsSUFBSSxDQUFDQyxHQUFHLENBQUM7UUFDekMsSUFBSSxDQUFDOEcsSUFBSSxDQUFDLEtBQUssQ0FBQztNQUNsQixDQUFDLENBQUM7TUFDRjtJQUNGO0lBRUEsTUFBTStKLHVCQUF1QixHQUFHQSxDQUFBLEtBQU07TUFDcEMsSUFBSSxDQUFDLElBQUksQ0FBQ25JLFFBQVEsRUFBRTtRQUNsQixPQUFPLEtBQUs7TUFDZDtNQUVBNEgsZ0JBQWdCLEdBQUcsS0FBSztNQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDdEosTUFBTSxFQUFFO1FBQ2hCLElBQUksQ0FBQ0YsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUNoQixNQUFNNEYsUUFBUSxHQUFHLElBQUksQ0FBQ2pFLGFBQWEsQ0FBQyxDQUFDO1FBQ3JDaUUsUUFBUSxDQUFDaEcsRUFBRSxDQUFDLE9BQU8sRUFBRWxHLElBQUksQ0FBQztRQUMxQixJQUFJLENBQUN5RyxRQUFRLENBQUMsSUFBSSxFQUFFeUYsUUFBUSxDQUFDO01BQy9CO01BRUEsT0FBTyxJQUFJO0lBQ2IsQ0FBQzs7SUFFRDtJQUNBMUUsR0FBRyxDQUFDckMsSUFBSSxDQUFDLE9BQU8sRUFBR2dCLEtBQUssSUFBSztNQUMzQixJQUFJa0ssdUJBQXVCLENBQUMsQ0FBQyxFQUFFO01BQy9CUCxnQkFBZ0IsR0FBRyxLQUFLO01BQ3hCLElBQUksQ0FBQ3JKLFFBQVEsQ0FBQ04sS0FBSyxFQUFFLElBQUksQ0FBQztJQUM1QixDQUFDLENBQUM7SUFDRnFCLEdBQUcsQ0FBQ3JDLElBQUksQ0FBQyxTQUFTLEVBQUVrTCx1QkFBdUIsQ0FBQztJQUM1QzdJLEdBQUcsQ0FBQ3JDLElBQUksQ0FBQyxPQUFPLEVBQUVrTCx1QkFBdUIsQ0FBQztJQUMxQyxJQUFJLENBQUNQLGdCQUFnQixFQUNuQnRJLEdBQUcsQ0FBQ3JDLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTTtNQUNwQjFHLEtBQUssQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDYyxNQUFNLEVBQUUsSUFBSSxDQUFDQyxHQUFHLENBQUM7TUFDekM7TUFDQSxJQUFJLENBQUM4RyxJQUFJLENBQUMsS0FBSyxDQUFDO01BQ2hCLElBQUksQ0FBQ0csUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUN3QixhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQzNDLENBQUMsQ0FBQztFQUNOLENBQUM7RUFFRCxJQUFJbUcsY0FBYyxFQUFFO0lBQ2xCL0osT0FBTyxDQUFDaU0sUUFBUSxDQUFDakMsY0FBYyxFQUFFRCxjQUFjLENBQUM7RUFDbEQsQ0FBQyxNQUFNO0lBQ0xqTyxHQUFHLENBQUNnRixJQUFJLENBQUMsVUFBVSxFQUFFa0osY0FBYyxDQUFDO0VBQ3RDO0VBRUEsSUFBSSxDQUFDL0gsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUM7RUFFMUIsTUFBTWlLLGtCQUFrQixHQUFHQSxDQUFBLEtBQU07SUFDL0IsTUFBTUMsZ0JBQWdCLEdBQUcsSUFBSTtJQUM3QixNQUFNQyxLQUFLLEdBQUd0USxHQUFHLENBQUM2TixTQUFTLENBQUMsZ0JBQWdCLENBQUM7SUFDN0MsSUFBSTBDLE1BQU0sR0FBRyxDQUFDO0lBRWQsTUFBTUMsUUFBUSxHQUFHLElBQUk3UyxNQUFNLENBQUM4UyxTQUFTLENBQUMsQ0FBQztJQUN2Q0QsUUFBUSxDQUFDRSxVQUFVLEdBQUcsQ0FBQ0MsS0FBSyxFQUFFdkosUUFBUSxFQUFFZCxRQUFRLEtBQUs7TUFDbkRpSyxNQUFNLElBQUlJLEtBQUssQ0FBQ2pSLE1BQU07TUFDdEIsSUFBSSxDQUFDeUcsSUFBSSxDQUFDLFVBQVUsRUFBRTtRQUNwQnlLLFNBQVMsRUFBRSxRQUFRO1FBQ25CUCxnQkFBZ0I7UUFDaEJFLE1BQU07UUFDTkQ7TUFDRixDQUFDLENBQUM7TUFDRmhLLFFBQVEsQ0FBQyxJQUFJLEVBQUVxSyxLQUFLLENBQUM7SUFDdkIsQ0FBQztJQUVELE9BQU9ILFFBQVE7RUFDakIsQ0FBQztFQUVELE1BQU1LLGNBQWMsR0FBSWxOLE1BQU0sSUFBSztJQUNqQyxNQUFNbU4sU0FBUyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUM3QixNQUFNQyxRQUFRLEdBQUcsSUFBSXBULE1BQU0sQ0FBQ3FULFFBQVEsQ0FBQyxDQUFDO0lBQ3RDLE1BQU1DLFdBQVcsR0FBR3ROLE1BQU0sQ0FBQ2pFLE1BQU07SUFDakMsTUFBTXdSLFNBQVMsR0FBR0QsV0FBVyxHQUFHSCxTQUFTO0lBQ3pDLE1BQU1LLE1BQU0sR0FBR0YsV0FBVyxHQUFHQyxTQUFTO0lBRXRDLEtBQUssSUFBSUUsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHRCxNQUFNLEVBQUVDLENBQUMsSUFBSU4sU0FBUyxFQUFFO01BQzFDLE1BQU1ILEtBQUssR0FBR2hOLE1BQU0sQ0FBQzBOLEtBQUssQ0FBQ0QsQ0FBQyxFQUFFQSxDQUFDLEdBQUdOLFNBQVMsQ0FBQztNQUM1Q0MsUUFBUSxDQUFDeFAsSUFBSSxDQUFDb1AsS0FBSyxDQUFDO0lBQ3RCO0lBRUEsSUFBSU8sU0FBUyxHQUFHLENBQUMsRUFBRTtNQUNqQixNQUFNSSxlQUFlLEdBQUczTixNQUFNLENBQUMwTixLQUFLLENBQUMsQ0FBQ0gsU0FBUyxDQUFDO01BQ2hESCxRQUFRLENBQUN4UCxJQUFJLENBQUMrUCxlQUFlLENBQUM7SUFDaEM7SUFFQVAsUUFBUSxDQUFDeFAsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7O0lBRXJCLE9BQU93UCxRQUFRO0VBQ2pCLENBQUM7RUFFRCxJQUFJO0lBQ0Y7SUFDQSxNQUFNOUssUUFBUSxHQUFHLElBQUksQ0FBQzNCLFNBQVM7SUFDL0IsSUFBSTJCLFFBQVEsRUFBRTtNQUNaO01BQ0EsTUFBTW1DLE9BQU8sR0FBR25DLFFBQVEsQ0FBQzBDLFVBQVUsQ0FBQyxDQUFDO01BQ3JDLEtBQUssTUFBTXlJLENBQUMsSUFBSWhKLE9BQU8sRUFBRTtRQUN2QixJQUFJckosTUFBTSxDQUFDcUosT0FBTyxFQUFFZ0osQ0FBQyxDQUFDLEVBQUU7VUFDdEI5UyxLQUFLLENBQUMsbUNBQW1DLEVBQUU4UyxDQUFDLEVBQUVoSixPQUFPLENBQUNnSixDQUFDLENBQUMsQ0FBQztVQUN6RHBSLEdBQUcsQ0FBQ2lNLFNBQVMsQ0FBQ21GLENBQUMsRUFBRWhKLE9BQU8sQ0FBQ2dKLENBQUMsQ0FBQyxDQUFDO1FBQzlCO01BQ0Y7O01BRUE7TUFDQW5MLFFBQVEsQ0FBQ3NMLFNBQVMsQ0FBQyxDQUFDdkwsS0FBSyxFQUFFdEcsTUFBTSxLQUFLO1FBQ3BDO1FBQ0E7UUFDQSxJQUFJc0csS0FBSyxJQUFJQSxLQUFLLEtBQUssZ0JBQWdCLEVBQUU7VUFDdkMsSUFBSSxDQUFDMEcsWUFBWSxDQUFDMUcsS0FBSyxDQUFDO1VBQ3hCO1FBQ0Y7UUFFQTFILEtBQUssQ0FBQyxpQ0FBaUMsRUFBRW9CLE1BQU0sQ0FBQztRQUNoRCxJQUFJLE9BQU9BLE1BQU0sS0FBSyxRQUFRLEVBQUU7VUFDOUJNLEdBQUcsQ0FBQ2lNLFNBQVMsQ0FBQyxnQkFBZ0IsRUFBRXZNLE1BQU0sQ0FBQztRQUN6QztRQUVBdUcsUUFBUSxDQUFDcUIsSUFBSSxDQUFDOEksa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUM5SSxJQUFJLENBQUN0SCxHQUFHLENBQUM7TUFDL0MsQ0FBQyxDQUFDO0lBQ0osQ0FBQyxNQUFNLElBQUk0SixNQUFNLENBQUNTLFFBQVEsQ0FBQ2xELElBQUksQ0FBQyxFQUFFO01BQ2hDMEosY0FBYyxDQUFDMUosSUFBSSxDQUFDLENBQUNHLElBQUksQ0FBQzhJLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDOUksSUFBSSxDQUFDdEgsR0FBRyxDQUFDO0lBQzNELENBQUMsTUFBTTtNQUNMQSxHQUFHLENBQUNSLEdBQUcsQ0FBQzJILElBQUksQ0FBQztJQUNmO0VBQ0YsQ0FBQyxDQUFDLE9BQU96RyxHQUFHLEVBQUU7SUFDWixJQUFJLENBQUNnTSxZQUFZLENBQUNoTSxHQUFHLENBQUM7RUFDeEI7QUFDRixDQUFDOztBQUVEO0FBQ0FuQixPQUFPLENBQUM2RixTQUFTLENBQUM0QyxpQkFBaUIsR0FBSVgsR0FBRyxJQUFLO0VBQzdDLE9BQ0VtSywwQkFBMEIsQ0FBQ25LLEdBQUcsQ0FBQyxLQUM5QnBJLHVCQUF1QixDQUFDb0ksR0FBRyxDQUFDLElBQUlySSxnQkFBZ0IsQ0FBQ3FJLEdBQUcsQ0FBQyxDQUFDO0FBRTNELENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTlILE9BQU8sQ0FBQzZGLFNBQVMsQ0FBQ3FNLE9BQU8sR0FBRyxVQUFVQyxlQUFlLEVBQUU7RUFDckQsSUFBSSxPQUFPQSxlQUFlLEtBQUssUUFBUSxFQUFFO0lBQ3ZDLElBQUksQ0FBQ3JHLGdCQUFnQixHQUFHO01BQUUsR0FBRyxFQUFFcUc7SUFBZ0IsQ0FBQztFQUNsRCxDQUFDLE1BQU0sSUFBSSxPQUFPQSxlQUFlLEtBQUssUUFBUSxFQUFFO0lBQzlDLElBQUksQ0FBQ3JHLGdCQUFnQixHQUFHcUcsZUFBZTtFQUN6QyxDQUFDLE1BQU07SUFDTCxJQUFJLENBQUNyRyxnQkFBZ0IsR0FBR2pMLFNBQVM7RUFDbkM7RUFFQSxPQUFPLElBQUk7QUFDYixDQUFDO0FBRURiLE9BQU8sQ0FBQzZGLFNBQVMsQ0FBQ3VNLGNBQWMsR0FBRyxVQUFVQyxNQUFNLEVBQUU7RUFDbkQsSUFBSSxDQUFDaEcsZUFBZSxHQUFHZ0csTUFBTSxLQUFLeFIsU0FBUyxHQUFHLElBQUksR0FBR3dSLE1BQU07RUFDM0QsT0FBTyxJQUFJO0FBQ2IsQ0FBQzs7QUFFRDtBQUNBLElBQUksQ0FBQ3pULE9BQU8sQ0FBQ3lJLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtFQUM1QjtFQUNBO0VBQ0E7RUFDQXpJLE9BQU8sR0FBRyxDQUFDLEdBQUdBLE9BQU8sQ0FBQztFQUN0QkEsT0FBTyxDQUFDb0QsSUFBSSxDQUFDLEtBQUssQ0FBQztBQUNyQjtBQUVBLEtBQUssSUFBSW5DLE1BQU0sSUFBSWpCLE9BQU8sRUFBRTtFQUMxQixNQUFNMFQsSUFBSSxHQUFHelMsTUFBTTtFQUNuQkEsTUFBTSxHQUFHQSxNQUFNLEtBQUssS0FBSyxHQUFHLFFBQVEsR0FBR0EsTUFBTTtFQUU3Q0EsTUFBTSxHQUFHQSxNQUFNLENBQUMwUyxXQUFXLENBQUMsQ0FBQztFQUM3QjNTLE9BQU8sQ0FBQzBTLElBQUksQ0FBQyxHQUFHLENBQUN4UyxHQUFHLEVBQUU4SCxJQUFJLEVBQUUwRixFQUFFLEtBQUs7SUFDakMsTUFBTTlNLFFBQVEsR0FBR1osT0FBTyxDQUFDQyxNQUFNLEVBQUVDLEdBQUcsQ0FBQztJQUNyQyxJQUFJLE9BQU84SCxJQUFJLEtBQUssVUFBVSxFQUFFO01BQzlCMEYsRUFBRSxHQUFHMUYsSUFBSTtNQUNUQSxJQUFJLEdBQUcsSUFBSTtJQUNiO0lBRUEsSUFBSUEsSUFBSSxFQUFFO01BQ1IsSUFBSS9ILE1BQU0sS0FBSyxLQUFLLElBQUlBLE1BQU0sS0FBSyxNQUFNLEVBQUU7UUFDekNXLFFBQVEsQ0FBQ2dILEtBQUssQ0FBQ0ksSUFBSSxDQUFDO01BQ3RCLENBQUMsTUFBTTtRQUNMcEgsUUFBUSxDQUFDZ1MsSUFBSSxDQUFDNUssSUFBSSxDQUFDO01BQ3JCO0lBQ0Y7SUFFQSxJQUFJMEYsRUFBRSxFQUFFOU0sUUFBUSxDQUFDUCxHQUFHLENBQUNxTixFQUFFLENBQUM7SUFDeEIsT0FBTzlNLFFBQVE7RUFDakIsQ0FBQztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVMwUCxNQUFNQSxDQUFDdlIsSUFBSSxFQUFFO0VBQ3BCLE1BQU0yQyxLQUFLLEdBQUczQyxJQUFJLENBQUNpTixLQUFLLENBQUMsR0FBRyxDQUFDO0VBQzdCLElBQUl6RSxJQUFJLEdBQUc3RixLQUFLLENBQUMsQ0FBQyxDQUFDO0VBQ25CLElBQUk2RixJQUFJLEVBQUVBLElBQUksR0FBR0EsSUFBSSxDQUFDMkgsV0FBVyxDQUFDLENBQUMsQ0FBQ0MsSUFBSSxDQUFDLENBQUM7RUFDMUMsSUFBSTBELE9BQU8sR0FBR25SLEtBQUssQ0FBQyxDQUFDLENBQUM7RUFDdEIsSUFBSW1SLE9BQU8sRUFBRUEsT0FBTyxHQUFHQSxPQUFPLENBQUMzRCxXQUFXLENBQUMsQ0FBQyxDQUFDQyxJQUFJLENBQUMsQ0FBQztFQUVuRCxPQUFPNUgsSUFBSSxLQUFLLE1BQU0sSUFBSXNMLE9BQU8sS0FBSyx1QkFBdUI7QUFDL0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBU3hDLFFBQVFBLENBQUN0UixJQUFJLEVBQUU7RUFDdEIsSUFBSSxDQUFDK1QsUUFBUSxFQUFFSixJQUFJLENBQUMsR0FBRzNULElBQUksQ0FBQ2lOLEtBQUssQ0FBQyxHQUFHLENBQUM7RUFDdEMsSUFBSThHLFFBQVEsRUFBRUEsUUFBUSxHQUFHQSxRQUFRLENBQUM1RCxXQUFXLENBQUMsQ0FBQyxDQUFDQyxJQUFJLENBQUMsQ0FBQztFQUN0RCxJQUFJdUQsSUFBSSxFQUFFQSxJQUFJLEdBQUdBLElBQUksQ0FBQ3hELFdBQVcsQ0FBQyxDQUFDLENBQUNDLElBQUksQ0FBQyxDQUFDO0VBQzFDLE9BQ0UsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQzFILFFBQVEsQ0FBQ3FMLFFBQVEsQ0FBQyxJQUN0RCxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQ3JMLFFBQVEsQ0FBQ2lMLElBQUksQ0FBQztBQUVqQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTOUQsTUFBTUEsQ0FBQzdQLElBQUksRUFBRTtFQUNwQjtFQUNBO0VBQ0EsT0FBTyxxQkFBcUIsQ0FBQ2dOLElBQUksQ0FBQ2hOLElBQUksQ0FBQztBQUN6Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTd0osVUFBVUEsQ0FBQ1EsSUFBSSxFQUFFO0VBQ3hCLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDdEIsUUFBUSxDQUFDc0IsSUFBSSxDQUFDO0FBQ3REO0FBRUEsU0FBU3NKLDBCQUEwQkEsQ0FBQ25LLEdBQUcsRUFBRTtFQUN2QyxJQUFJQSxHQUFHLENBQUNNLFVBQVUsS0FBSyxHQUFHLElBQUlOLEdBQUcsQ0FBQ00sVUFBVSxLQUFLLEdBQUcsRUFBRTtJQUNwRDtJQUNBLE9BQU8sS0FBSztFQUNkOztFQUVBO0VBQ0EsSUFBSU4sR0FBRyxDQUFDZSxPQUFPLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxHQUFHLEVBQUU7SUFDekM7SUFDQSxPQUFPLEtBQUs7RUFDZDtFQUVBLE9BQU8sSUFBSTtBQUNiIiwiaWdub3JlTGlzdCI6W119