@blinkk/root-cms 1.0.0-rc.11 → 1.0.0-rc.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/ui/signin.js CHANGED
@@ -4,15 +4,15 @@
4
4
  var stringToByteArray$1 = function(str) {
5
5
  const out = [];
6
6
  let p2 = 0;
7
- for (let i2 = 0; i2 < str.length; i2++) {
8
- let c2 = str.charCodeAt(i2);
7
+ for (let i3 = 0; i3 < str.length; i3++) {
8
+ let c2 = str.charCodeAt(i3);
9
9
  if (c2 < 128) {
10
10
  out[p2++] = c2;
11
11
  } else if (c2 < 2048) {
12
12
  out[p2++] = c2 >> 6 | 192;
13
13
  out[p2++] = c2 & 63 | 128;
14
- } else if ((c2 & 64512) === 55296 && i2 + 1 < str.length && (str.charCodeAt(i2 + 1) & 64512) === 56320) {
15
- c2 = 65536 + ((c2 & 1023) << 10) + (str.charCodeAt(++i2) & 1023);
14
+ } else if ((c2 & 64512) === 55296 && i3 + 1 < str.length && (str.charCodeAt(i3 + 1) & 64512) === 56320) {
15
+ c2 = 65536 + ((c2 & 1023) << 10) + (str.charCodeAt(++i3) & 1023);
16
16
  out[p2++] = c2 >> 18 | 240;
17
17
  out[p2++] = c2 >> 12 & 63 | 128;
18
18
  out[p2++] = c2 >> 6 & 63 | 128;
@@ -39,9 +39,9 @@
39
39
  const c22 = bytes[pos++];
40
40
  const c3 = bytes[pos++];
41
41
  const c4 = bytes[pos++];
42
- const u2 = ((c1 & 7) << 18 | (c22 & 63) << 12 | (c3 & 63) << 6 | c4 & 63) - 65536;
43
- out[c2++] = String.fromCharCode(55296 + (u2 >> 10));
44
- out[c2++] = String.fromCharCode(56320 + (u2 & 1023));
42
+ const u3 = ((c1 & 7) << 18 | (c22 & 63) << 12 | (c3 & 63) << 6 | c4 & 63) - 65536;
43
+ out[c2++] = String.fromCharCode(55296 + (u3 >> 10));
44
+ out[c2++] = String.fromCharCode(56320 + (u3 & 1023));
45
45
  } else {
46
46
  const c22 = bytes[pos++];
47
47
  const c3 = bytes[pos++];
@@ -110,12 +110,12 @@
110
110
  this.init_();
111
111
  const byteToCharMap = webSafe ? this.byteToCharMapWebSafe_ : this.byteToCharMap_;
112
112
  const output = [];
113
- for (let i2 = 0; i2 < input.length; i2 += 3) {
114
- const byte1 = input[i2];
115
- const haveByte2 = i2 + 1 < input.length;
116
- const byte2 = haveByte2 ? input[i2 + 1] : 0;
117
- const haveByte3 = i2 + 2 < input.length;
118
- const byte3 = haveByte3 ? input[i2 + 2] : 0;
113
+ for (let i3 = 0; i3 < input.length; i3 += 3) {
114
+ const byte1 = input[i3];
115
+ const haveByte2 = i3 + 1 < input.length;
116
+ const byte2 = haveByte2 ? input[i3 + 1] : 0;
117
+ const haveByte3 = i3 + 2 < input.length;
118
+ const byte3 = haveByte3 ? input[i3 + 2] : 0;
119
119
  const outByte1 = byte1 >> 2;
120
120
  const outByte2 = (byte1 & 3) << 4 | byte2 >> 4;
121
121
  let outByte3 = (byte2 & 15) << 2 | byte3 >> 6;
@@ -177,17 +177,17 @@
177
177
  this.init_();
178
178
  const charToByteMap = webSafe ? this.charToByteMapWebSafe_ : this.charToByteMap_;
179
179
  const output = [];
180
- for (let i2 = 0; i2 < input.length; ) {
181
- const byte1 = charToByteMap[input.charAt(i2++)];
182
- const haveByte2 = i2 < input.length;
183
- const byte2 = haveByte2 ? charToByteMap[input.charAt(i2)] : 0;
184
- ++i2;
185
- const haveByte3 = i2 < input.length;
186
- const byte3 = haveByte3 ? charToByteMap[input.charAt(i2)] : 64;
187
- ++i2;
188
- const haveByte4 = i2 < input.length;
189
- const byte4 = haveByte4 ? charToByteMap[input.charAt(i2)] : 64;
190
- ++i2;
180
+ for (let i3 = 0; i3 < input.length; ) {
181
+ const byte1 = charToByteMap[input.charAt(i3++)];
182
+ const haveByte2 = i3 < input.length;
183
+ const byte2 = haveByte2 ? charToByteMap[input.charAt(i3)] : 0;
184
+ ++i3;
185
+ const haveByte3 = i3 < input.length;
186
+ const byte3 = haveByte3 ? charToByteMap[input.charAt(i3)] : 64;
187
+ ++i3;
188
+ const haveByte4 = i3 < input.length;
189
+ const byte4 = haveByte4 ? charToByteMap[input.charAt(i3)] : 64;
190
+ ++i3;
191
191
  if (byte1 == null || byte2 == null || byte3 == null || byte4 == null) {
192
192
  throw new DecodeBase64StringError();
193
193
  }
@@ -215,14 +215,14 @@
215
215
  this.charToByteMap_ = {};
216
216
  this.byteToCharMapWebSafe_ = {};
217
217
  this.charToByteMapWebSafe_ = {};
218
- for (let i2 = 0; i2 < this.ENCODED_VALS.length; i2++) {
219
- this.byteToCharMap_[i2] = this.ENCODED_VALS.charAt(i2);
220
- this.charToByteMap_[this.byteToCharMap_[i2]] = i2;
221
- this.byteToCharMapWebSafe_[i2] = this.ENCODED_VALS_WEBSAFE.charAt(i2);
222
- this.charToByteMapWebSafe_[this.byteToCharMapWebSafe_[i2]] = i2;
223
- if (i2 >= this.ENCODED_VALS_BASE.length) {
224
- this.charToByteMap_[this.ENCODED_VALS_WEBSAFE.charAt(i2)] = i2;
225
- this.charToByteMapWebSafe_[this.ENCODED_VALS.charAt(i2)] = i2;
218
+ for (let i3 = 0; i3 < this.ENCODED_VALS.length; i3++) {
219
+ this.byteToCharMap_[i3] = this.ENCODED_VALS.charAt(i3);
220
+ this.charToByteMap_[this.byteToCharMap_[i3]] = i3;
221
+ this.byteToCharMapWebSafe_[i3] = this.ENCODED_VALS_WEBSAFE.charAt(i3);
222
+ this.charToByteMapWebSafe_[this.byteToCharMapWebSafe_[i3]] = i3;
223
+ if (i3 >= this.ENCODED_VALS_BASE.length) {
224
+ this.charToByteMap_[this.ENCODED_VALS_WEBSAFE.charAt(i3)] = i3;
225
+ this.charToByteMapWebSafe_[this.ENCODED_VALS.charAt(i3)] = i3;
226
226
  }
227
227
  }
228
228
  }
@@ -424,7 +424,7 @@
424
424
  }
425
425
  };
426
426
  function replaceTemplate(template, data) {
427
- return template.replace(PATTERN, (_3, key) => {
427
+ return template.replace(PATTERN, (_, key) => {
428
428
  const value = data[key];
429
429
  return value != null ? String(value) : `<${key}?>`;
430
430
  });
@@ -592,11 +592,11 @@
592
592
  }
593
593
  // Unsubscribe is synchronous - we guarantee that no events are sent to
594
594
  // any unsubscribed Observer.
595
- unsubscribeOne(i2) {
596
- if (this.observers === void 0 || this.observers[i2] === void 0) {
595
+ unsubscribeOne(i3) {
596
+ if (this.observers === void 0 || this.observers[i3] === void 0) {
597
597
  return;
598
598
  }
599
- delete this.observers[i2];
599
+ delete this.observers[i3];
600
600
  this.observerCount -= 1;
601
601
  if (this.observerCount === 0 && this.onNoObservers !== void 0) {
602
602
  this.onNoObservers(this);
@@ -606,18 +606,18 @@
606
606
  if (this.finalized) {
607
607
  return;
608
608
  }
609
- for (let i2 = 0; i2 < this.observers.length; i2++) {
610
- this.sendOne(i2, fn);
609
+ for (let i3 = 0; i3 < this.observers.length; i3++) {
610
+ this.sendOne(i3, fn);
611
611
  }
612
612
  }
613
613
  // Call the Observer via one of it's callback function. We are careful to
614
614
  // confirm that the observe has not been unsubscribed since this asynchronous
615
615
  // function had been queued.
616
- sendOne(i2, fn) {
616
+ sendOne(i3, fn) {
617
617
  this.task.then(() => {
618
- if (this.observers !== void 0 && this.observers[i2] !== void 0) {
618
+ if (this.observers !== void 0 && this.observers[i3] !== void 0) {
619
619
  try {
620
- fn(this.observers[i2]);
620
+ fn(this.observers[i3]);
621
621
  } catch (e2) {
622
622
  if (typeof console !== "undefined" && console.error) {
623
623
  console.error(e2);
@@ -1801,9 +1801,9 @@
1801
1801
  if (Object.prototype.hasOwnProperty.call(s2, p2) && e2.indexOf(p2) < 0)
1802
1802
  t2[p2] = s2[p2];
1803
1803
  if (s2 != null && typeof Object.getOwnPropertySymbols === "function")
1804
- for (var i2 = 0, p2 = Object.getOwnPropertySymbols(s2); i2 < p2.length; i2++) {
1805
- if (e2.indexOf(p2[i2]) < 0 && Object.prototype.propertyIsEnumerable.call(s2, p2[i2]))
1806
- t2[p2[i2]] = s2[p2[i2]];
1804
+ for (var i3 = 0, p2 = Object.getOwnPropertySymbols(s2); i3 < p2.length; i3++) {
1805
+ if (e2.indexOf(p2[i3]) < 0 && Object.prototype.propertyIsEnumerable.call(s2, p2[i3]))
1806
+ t2[p2[i3]] = s2[p2[i3]];
1807
1807
  }
1808
1808
  return t2;
1809
1809
  }
@@ -2319,7 +2319,7 @@
2319
2319
  constructor(auth2) {
2320
2320
  this.auth = auth2;
2321
2321
  this.timer = null;
2322
- this.promise = new Promise((_3, reject) => {
2322
+ this.promise = new Promise((_, reject) => {
2323
2323
  this.timer = setTimeout(() => {
2324
2324
  return reject(_createError(
2325
2325
  this.auth,
@@ -2614,7 +2614,7 @@
2614
2614
  userInternal.auth._notifyListenersIfCurrent(userInternal);
2615
2615
  }
2616
2616
  function mergeProviderData(original, newData) {
2617
- const deduped = original.filter((o3) => !newData.some((n2) => n2.providerId === o3.providerId));
2617
+ const deduped = original.filter((o2) => !newData.some((n2) => n2.providerId === o2.providerId));
2618
2618
  return [...deduped, ...newData];
2619
2619
  }
2620
2620
  function extractProviderData(providers) {
@@ -3232,7 +3232,7 @@
3232
3232
  for (const onAbort of onAbortStack) {
3233
3233
  try {
3234
3234
  onAbort();
3235
- } catch (_3) {
3235
+ } catch (_) {
3236
3236
  }
3237
3237
  }
3238
3238
  throw this.auth._errorFactory.create("login-blocked", {
@@ -3325,8 +3325,8 @@
3325
3325
  false
3326
3326
  );
3327
3327
  let passwordChar;
3328
- for (let i2 = 0; i2 < password.length; i2++) {
3329
- passwordChar = password.charAt(i2);
3328
+ for (let i3 = 0; i3 < password.length; i3++) {
3329
+ passwordChar = password.charAt(i3);
3330
3330
  this.updatePasswordCharacterOptionsStatuses(
3331
3331
  status,
3332
3332
  /* containsLowercaseCharacter= */
@@ -5374,7 +5374,7 @@
5374
5374
  Receiver.receivers = [];
5375
5375
  function _generateEventId(prefix = "", digits = 10) {
5376
5376
  let random = "";
5377
- for (let i2 = 0; i2 < digits; i2++) {
5377
+ for (let i3 = 0; i3 < digits; i3++) {
5378
5378
  random += Math.floor(Math.random() * 10);
5379
5379
  }
5380
5380
  return prefix + random;
@@ -6498,8 +6498,8 @@
6498
6498
  beacon.H[hint].L = beacon.H[hint].L || [];
6499
6499
  beacon.H[hint].r = [...beacon.H[hint].L];
6500
6500
  if (beacon.CP) {
6501
- for (let i2 = 0; i2 < beacon.CP.length; i2++) {
6502
- beacon.CP[i2] = null;
6501
+ for (let i3 = 0; i3 < beacon.CP.length; i3++) {
6502
+ beacon.CP[i3] = null;
6503
6503
  }
6504
6504
  }
6505
6505
  }
@@ -7234,312 +7234,321 @@
7234
7234
  /* ClientPlatform.BROWSER */
7235
7235
  );
7236
7236
 
7237
- // ../../node_modules/.pnpm/preact@10.11.0/node_modules/preact/dist/preact.module.js
7237
+ // ../../node_modules/.pnpm/preact@10.19.3/node_modules/preact/dist/preact.module.js
7238
7238
  var n;
7239
7239
  var l;
7240
7240
  var u;
7241
- var i;
7242
7241
  var t;
7242
+ var i;
7243
7243
  var o;
7244
7244
  var r;
7245
- var f = {};
7246
- var e = [];
7247
- var c = /acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;
7248
- function s(n2, l2) {
7249
- for (var u2 in l2)
7250
- n2[u2] = l2[u2];
7245
+ var f;
7246
+ var e;
7247
+ var c = {};
7248
+ var s = [];
7249
+ var a = /acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;
7250
+ var h = Array.isArray;
7251
+ function v(n2, l2) {
7252
+ for (var u3 in l2)
7253
+ n2[u3] = l2[u3];
7251
7254
  return n2;
7252
7255
  }
7253
- function a(n2) {
7256
+ function p(n2) {
7254
7257
  var l2 = n2.parentNode;
7255
7258
  l2 && l2.removeChild(n2);
7256
7259
  }
7257
- function h(l2, u2, i2) {
7258
- var t2, o3, r2, f2 = {};
7259
- for (r2 in u2)
7260
- "key" == r2 ? t2 = u2[r2] : "ref" == r2 ? o3 = u2[r2] : f2[r2] = u2[r2];
7261
- if (arguments.length > 2 && (f2.children = arguments.length > 3 ? n.call(arguments, 2) : i2), "function" == typeof l2 && null != l2.defaultProps)
7260
+ function y(l2, u3, t2) {
7261
+ var i3, o2, r2, f3 = {};
7262
+ for (r2 in u3)
7263
+ "key" == r2 ? i3 = u3[r2] : "ref" == r2 ? o2 = u3[r2] : f3[r2] = u3[r2];
7264
+ if (arguments.length > 2 && (f3.children = arguments.length > 3 ? n.call(arguments, 2) : t2), "function" == typeof l2 && null != l2.defaultProps)
7262
7265
  for (r2 in l2.defaultProps)
7263
- void 0 === f2[r2] && (f2[r2] = l2.defaultProps[r2]);
7264
- return v(l2, f2, t2, o3, null);
7266
+ void 0 === f3[r2] && (f3[r2] = l2.defaultProps[r2]);
7267
+ return d(l2, f3, i3, o2, null);
7265
7268
  }
7266
- function v(n2, i2, t2, o3, r2) {
7267
- var f2 = { type: n2, props: i2, key: t2, ref: o3, __k: null, __: null, __b: 0, __e: null, __d: void 0, __c: null, __h: null, constructor: void 0, __v: null == r2 ? ++u : r2 };
7268
- return null == r2 && null != l.vnode && l.vnode(f2), f2;
7269
+ function d(n2, t2, i3, o2, r2) {
7270
+ var f3 = { type: n2, props: t2, key: i3, ref: o2, __k: null, __: null, __b: 0, __e: null, __d: void 0, __c: null, constructor: void 0, __v: null == r2 ? ++u : r2, __i: -1, __u: 0 };
7271
+ return null == r2 && null != l.vnode && l.vnode(f3), f3;
7269
7272
  }
7270
- function p(n2) {
7273
+ function g(n2) {
7271
7274
  return n2.children;
7272
7275
  }
7273
- function d(n2, l2) {
7276
+ function b(n2, l2) {
7274
7277
  this.props = n2, this.context = l2;
7275
7278
  }
7276
- function _(n2, l2) {
7279
+ function m(n2, l2) {
7277
7280
  if (null == l2)
7278
- return n2.__ ? _(n2.__, n2.__.__k.indexOf(n2) + 1) : null;
7279
- for (var u2; l2 < n2.__k.length; l2++)
7280
- if (null != (u2 = n2.__k[l2]) && null != u2.__e)
7281
- return u2.__e;
7282
- return "function" == typeof n2.type ? _(n2) : null;
7281
+ return n2.__ ? m(n2.__, n2.__i + 1) : null;
7282
+ for (var u3; l2 < n2.__k.length; l2++)
7283
+ if (null != (u3 = n2.__k[l2]) && null != u3.__e)
7284
+ return u3.__e;
7285
+ return "function" == typeof n2.type ? m(n2) : null;
7283
7286
  }
7284
7287
  function k(n2) {
7285
- var l2, u2;
7288
+ var l2, u3;
7286
7289
  if (null != (n2 = n2.__) && null != n2.__c) {
7287
7290
  for (n2.__e = n2.__c.base = null, l2 = 0; l2 < n2.__k.length; l2++)
7288
- if (null != (u2 = n2.__k[l2]) && null != u2.__e) {
7289
- n2.__e = n2.__c.base = u2.__e;
7291
+ if (null != (u3 = n2.__k[l2]) && null != u3.__e) {
7292
+ n2.__e = n2.__c.base = u3.__e;
7290
7293
  break;
7291
7294
  }
7292
7295
  return k(n2);
7293
7296
  }
7294
7297
  }
7295
- function b(n2) {
7296
- (!n2.__d && (n2.__d = true) && t.push(n2) && !g.__r++ || o !== l.debounceRendering) && ((o = l.debounceRendering) || setTimeout)(g);
7297
- }
7298
- function g() {
7299
- for (var n2; g.__r = t.length; )
7300
- n2 = t.sort(function(n3, l2) {
7301
- return n3.__v.__b - l2.__v.__b;
7302
- }), t = [], n2.some(function(n3) {
7303
- var l2, u2, i2, t2, o3, r2;
7304
- n3.__d && (o3 = (t2 = (l2 = n3).__v).__e, (r2 = l2.__P) && (u2 = [], (i2 = s({}, t2)).__v = t2.__v + 1, j(r2, t2, i2, l2.__n, void 0 !== r2.ownerSVGElement, null != t2.__h ? [o3] : null, u2, null == o3 ? _(t2) : o3, t2.__h), z(u2, t2), t2.__e != o3 && k(t2)));
7305
- });
7306
- }
7307
- function w(n2, l2, u2, i2, t2, o3, r2, c2, s2, a2) {
7308
- var h2, y, d2, k2, b2, g2, w2, x = i2 && i2.__k || e, C2 = x.length;
7309
- for (u2.__k = [], h2 = 0; h2 < l2.length; h2++)
7310
- if (null != (k2 = u2.__k[h2] = null == (k2 = l2[h2]) || "boolean" == typeof k2 ? null : "string" == typeof k2 || "number" == typeof k2 || "bigint" == typeof k2 ? v(null, k2, null, null, k2) : Array.isArray(k2) ? v(p, { children: k2 }, null, null, null) : k2.__b > 0 ? v(k2.type, k2.props, k2.key, k2.ref ? k2.ref : null, k2.__v) : k2)) {
7311
- if (k2.__ = u2, k2.__b = u2.__b + 1, null === (d2 = x[h2]) || d2 && k2.key == d2.key && k2.type === d2.type)
7312
- x[h2] = void 0;
7313
- else
7314
- for (y = 0; y < C2; y++) {
7315
- if ((d2 = x[y]) && k2.key == d2.key && k2.type === d2.type) {
7316
- x[y] = void 0;
7317
- break;
7318
- }
7319
- d2 = null;
7320
- }
7321
- j(n2, k2, d2 = d2 || f, t2, o3, r2, c2, s2, a2), b2 = k2.__e, (y = k2.ref) && d2.ref != y && (w2 || (w2 = []), d2.ref && w2.push(d2.ref, null, k2), w2.push(y, k2.__c || b2, k2)), null != b2 ? (null == g2 && (g2 = b2), "function" == typeof k2.type && k2.__k === d2.__k ? k2.__d = s2 = m(k2, s2, n2) : s2 = A(n2, k2, d2, x, b2, s2), "function" == typeof u2.type && (u2.__d = s2)) : s2 && d2.__e == s2 && s2.parentNode != n2 && (s2 = _(d2));
7322
- }
7323
- for (u2.__e = g2, h2 = C2; h2--; )
7324
- null != x[h2] && ("function" == typeof u2.type && null != x[h2].__e && x[h2].__e == u2.__d && (u2.__d = _(i2, h2 + 1)), N(x[h2], x[h2]));
7325
- if (w2)
7326
- for (h2 = 0; h2 < w2.length; h2++)
7327
- M(w2[h2], w2[++h2], w2[++h2]);
7328
- }
7329
- function m(n2, l2, u2) {
7330
- for (var i2, t2 = n2.__k, o3 = 0; t2 && o3 < t2.length; o3++)
7331
- (i2 = t2[o3]) && (i2.__ = n2, l2 = "function" == typeof i2.type ? m(i2, l2, u2) : A(u2, i2, i2, t2, i2.__e, l2));
7332
- return l2;
7333
- }
7334
- function A(n2, l2, u2, i2, t2, o3) {
7335
- var r2, f2, e2;
7336
- if (void 0 !== l2.__d)
7337
- r2 = l2.__d, l2.__d = void 0;
7338
- else if (null == u2 || t2 != o3 || null == t2.parentNode)
7339
- n:
7340
- if (null == o3 || o3.parentNode !== n2)
7341
- n2.appendChild(t2), r2 = null;
7342
- else {
7343
- for (f2 = o3, e2 = 0; (f2 = f2.nextSibling) && e2 < i2.length; e2 += 2)
7344
- if (f2 == t2)
7345
- break n;
7346
- n2.insertBefore(t2, o3), r2 = o3;
7298
+ function w(n2) {
7299
+ (!n2.__d && (n2.__d = true) && i.push(n2) && !x.__r++ || o !== l.debounceRendering) && ((o = l.debounceRendering) || r)(x);
7300
+ }
7301
+ function x() {
7302
+ var n2, u3, t2, o2, r2, e2, c2, s2, a2;
7303
+ for (i.sort(f); n2 = i.shift(); )
7304
+ n2.__d && (u3 = i.length, o2 = void 0, e2 = (r2 = (t2 = n2).__v).__e, s2 = [], a2 = [], (c2 = t2.__P) && ((o2 = v({}, r2)).__v = r2.__v + 1, l.vnode && l.vnode(o2), L(c2, o2, r2, t2.__n, void 0 !== c2.ownerSVGElement, 32 & r2.__u ? [e2] : null, s2, null == e2 ? m(r2) : e2, !!(32 & r2.__u), a2), o2.__.__k[o2.__i] = o2, M(s2, o2, a2), o2.__e != e2 && k(o2)), i.length > u3 && i.sort(f));
7305
+ x.__r = 0;
7306
+ }
7307
+ function C(n2, l2, u3, t2, i3, o2, r2, f3, e2, a2, h2) {
7308
+ var v2, p2, y2, d2, _, g2 = t2 && t2.__k || s, b2 = l2.length;
7309
+ for (u3.__d = e2, P(u3, l2, g2), e2 = u3.__d, v2 = 0; v2 < b2; v2++)
7310
+ null != (y2 = u3.__k[v2]) && "boolean" != typeof y2 && "function" != typeof y2 && (p2 = -1 === y2.__i ? c : g2[y2.__i] || c, y2.__i = v2, L(n2, y2, p2, i3, o2, r2, f3, e2, a2, h2), d2 = y2.__e, y2.ref && p2.ref != y2.ref && (p2.ref && z(p2.ref, null, y2), h2.push(y2.ref, y2.__c || d2, y2)), null == _ && null != d2 && (_ = d2), 65536 & y2.__u || p2.__k === y2.__k ? e2 = S(y2, e2, n2) : "function" == typeof y2.type && void 0 !== y2.__d ? e2 = y2.__d : d2 && (e2 = d2.nextSibling), y2.__d = void 0, y2.__u &= -196609);
7311
+ u3.__d = e2, u3.__e = _;
7312
+ }
7313
+ function P(n2, l2, u3) {
7314
+ var t2, i3, o2, r2, f3, e2 = l2.length, c2 = u3.length, s2 = c2, a2 = 0;
7315
+ for (n2.__k = [], t2 = 0; t2 < e2; t2++)
7316
+ null != (i3 = n2.__k[t2] = null == (i3 = l2[t2]) || "boolean" == typeof i3 || "function" == typeof i3 ? null : "string" == typeof i3 || "number" == typeof i3 || "bigint" == typeof i3 || i3.constructor == String ? d(null, i3, null, null, i3) : h(i3) ? d(g, { children: i3 }, null, null, null) : void 0 === i3.constructor && i3.__b > 0 ? d(i3.type, i3.props, i3.key, i3.ref ? i3.ref : null, i3.__v) : i3) ? (i3.__ = n2, i3.__b = n2.__b + 1, f3 = H(i3, u3, r2 = t2 + a2, s2), i3.__i = f3, o2 = null, -1 !== f3 && (s2--, (o2 = u3[f3]) && (o2.__u |= 131072)), null == o2 || null === o2.__v ? (-1 == f3 && a2--, "function" != typeof i3.type && (i3.__u |= 65536)) : f3 !== r2 && (f3 === r2 + 1 ? a2++ : f3 > r2 ? s2 > e2 - r2 ? a2 += f3 - r2 : a2-- : a2 = f3 < r2 && f3 == r2 - 1 ? f3 - r2 : 0, f3 !== t2 + a2 && (i3.__u |= 65536))) : (o2 = u3[t2]) && null == o2.key && o2.__e && (o2.__e == n2.__d && (n2.__d = m(o2)), N(o2, o2, false), u3[t2] = null, s2--);
7317
+ if (s2)
7318
+ for (t2 = 0; t2 < c2; t2++)
7319
+ null != (o2 = u3[t2]) && 0 == (131072 & o2.__u) && (o2.__e == n2.__d && (n2.__d = m(o2)), N(o2, o2));
7320
+ }
7321
+ function S(n2, l2, u3) {
7322
+ var t2, i3;
7323
+ if ("function" == typeof n2.type) {
7324
+ for (t2 = n2.__k, i3 = 0; t2 && i3 < t2.length; i3++)
7325
+ t2[i3] && (t2[i3].__ = n2, l2 = S(t2[i3], l2, u3));
7326
+ return l2;
7327
+ }
7328
+ return n2.__e != l2 && (u3.insertBefore(n2.__e, l2 || null), l2 = n2.__e), l2 && l2.nextSibling;
7329
+ }
7330
+ function H(n2, l2, u3, t2) {
7331
+ var i3 = n2.key, o2 = n2.type, r2 = u3 - 1, f3 = u3 + 1, e2 = l2[u3];
7332
+ if (null === e2 || e2 && i3 == e2.key && o2 === e2.type)
7333
+ return u3;
7334
+ if (t2 > (null != e2 && 0 == (131072 & e2.__u) ? 1 : 0))
7335
+ for (; r2 >= 0 || f3 < l2.length; ) {
7336
+ if (r2 >= 0) {
7337
+ if ((e2 = l2[r2]) && 0 == (131072 & e2.__u) && i3 == e2.key && o2 === e2.type)
7338
+ return r2;
7339
+ r2--;
7347
7340
  }
7348
- return void 0 !== r2 ? r2 : t2.nextSibling;
7349
- }
7350
- function C(n2, l2, u2, i2, t2) {
7351
- var o3;
7352
- for (o3 in u2)
7353
- "children" === o3 || "key" === o3 || o3 in l2 || H(n2, o3, null, u2[o3], i2);
7354
- for (o3 in l2)
7355
- t2 && "function" != typeof l2[o3] || "children" === o3 || "key" === o3 || "value" === o3 || "checked" === o3 || u2[o3] === l2[o3] || H(n2, o3, l2[o3], u2[o3], i2);
7341
+ if (f3 < l2.length) {
7342
+ if ((e2 = l2[f3]) && 0 == (131072 & e2.__u) && i3 == e2.key && o2 === e2.type)
7343
+ return f3;
7344
+ f3++;
7345
+ }
7346
+ }
7347
+ return -1;
7356
7348
  }
7357
- function $(n2, l2, u2) {
7358
- "-" === l2[0] ? n2.setProperty(l2, u2) : n2[l2] = null == u2 ? "" : "number" != typeof u2 || c.test(l2) ? u2 : u2 + "px";
7349
+ function I(n2, l2, u3) {
7350
+ "-" === l2[0] ? n2.setProperty(l2, null == u3 ? "" : u3) : n2[l2] = null == u3 ? "" : "number" != typeof u3 || a.test(l2) ? u3 : u3 + "px";
7359
7351
  }
7360
- function H(n2, l2, u2, i2, t2) {
7361
- var o3;
7352
+ function T(n2, l2, u3, t2, i3) {
7353
+ var o2;
7362
7354
  n:
7363
7355
  if ("style" === l2)
7364
- if ("string" == typeof u2)
7365
- n2.style.cssText = u2;
7356
+ if ("string" == typeof u3)
7357
+ n2.style.cssText = u3;
7366
7358
  else {
7367
- if ("string" == typeof i2 && (n2.style.cssText = i2 = ""), i2)
7368
- for (l2 in i2)
7369
- u2 && l2 in u2 || $(n2.style, l2, "");
7370
- if (u2)
7371
- for (l2 in u2)
7372
- i2 && u2[l2] === i2[l2] || $(n2.style, l2, u2[l2]);
7359
+ if ("string" == typeof t2 && (n2.style.cssText = t2 = ""), t2)
7360
+ for (l2 in t2)
7361
+ u3 && l2 in u3 || I(n2.style, l2, "");
7362
+ if (u3)
7363
+ for (l2 in u3)
7364
+ t2 && u3[l2] === t2[l2] || I(n2.style, l2, u3[l2]);
7373
7365
  }
7374
7366
  else if ("o" === l2[0] && "n" === l2[1])
7375
- o3 = l2 !== (l2 = l2.replace(/Capture$/, "")), l2 = l2.toLowerCase() in n2 ? l2.toLowerCase().slice(2) : l2.slice(2), n2.l || (n2.l = {}), n2.l[l2 + o3] = u2, u2 ? i2 || n2.addEventListener(l2, o3 ? T : I, o3) : n2.removeEventListener(l2, o3 ? T : I, o3);
7376
- else if ("dangerouslySetInnerHTML" !== l2) {
7377
- if (t2)
7367
+ o2 = l2 !== (l2 = l2.replace(/(PointerCapture)$|Capture$/, "$1")), l2 = l2.toLowerCase() in n2 ? l2.toLowerCase().slice(2) : l2.slice(2), n2.l || (n2.l = {}), n2.l[l2 + o2] = u3, u3 ? t2 ? u3.u = t2.u : (u3.u = Date.now(), n2.addEventListener(l2, o2 ? D : A, o2)) : n2.removeEventListener(l2, o2 ? D : A, o2);
7368
+ else {
7369
+ if (i3)
7378
7370
  l2 = l2.replace(/xlink(H|:h)/, "h").replace(/sName$/, "s");
7379
- else if ("href" !== l2 && "list" !== l2 && "form" !== l2 && "tabIndex" !== l2 && "download" !== l2 && l2 in n2)
7371
+ else if ("width" !== l2 && "height" !== l2 && "href" !== l2 && "list" !== l2 && "form" !== l2 && "tabIndex" !== l2 && "download" !== l2 && "rowSpan" !== l2 && "colSpan" !== l2 && "role" !== l2 && l2 in n2)
7380
7372
  try {
7381
- n2[l2] = null == u2 ? "" : u2;
7373
+ n2[l2] = null == u3 ? "" : u3;
7382
7374
  break n;
7383
7375
  } catch (n3) {
7384
7376
  }
7385
- "function" == typeof u2 || (null != u2 && (false !== u2 || "a" === l2[0] && "r" === l2[1]) ? n2.setAttribute(l2, u2) : n2.removeAttribute(l2));
7377
+ "function" == typeof u3 || (null == u3 || false === u3 && "-" !== l2[4] ? n2.removeAttribute(l2) : n2.setAttribute(l2, u3));
7386
7378
  }
7387
7379
  }
7388
- function I(n2) {
7389
- this.l[n2.type + false](l.event ? l.event(n2) : n2);
7380
+ function A(n2) {
7381
+ var u3 = this.l[n2.type + false];
7382
+ if (n2.t) {
7383
+ if (n2.t <= u3.u)
7384
+ return;
7385
+ } else
7386
+ n2.t = Date.now();
7387
+ return u3(l.event ? l.event(n2) : n2);
7390
7388
  }
7391
- function T(n2) {
7392
- this.l[n2.type + true](l.event ? l.event(n2) : n2);
7389
+ function D(n2) {
7390
+ return this.l[n2.type + true](l.event ? l.event(n2) : n2);
7393
7391
  }
7394
- function j(n2, u2, i2, t2, o3, r2, f2, e2, c2) {
7395
- var a2, h2, v2, y, _3, k2, b2, g2, m2, x, A2, C2, $2, H2 = u2.type;
7396
- if (void 0 !== u2.constructor)
7392
+ function L(n2, u3, t2, i3, o2, r2, f3, e2, c2, s2) {
7393
+ var a2, p2, y2, d2, _, m2, k2, w2, x2, P2, S2, $, H2, I2, T2, A2 = u3.type;
7394
+ if (void 0 !== u3.constructor)
7397
7395
  return null;
7398
- null != i2.__h && (c2 = i2.__h, e2 = u2.__e = i2.__e, u2.__h = null, r2 = [e2]), (a2 = l.__b) && a2(u2);
7399
- try {
7400
- n:
7401
- if ("function" == typeof H2) {
7402
- if (g2 = u2.props, m2 = (a2 = H2.contextType) && t2[a2.__c], x = a2 ? m2 ? m2.props.value : a2.__ : t2, i2.__c ? b2 = (h2 = u2.__c = i2.__c).__ = h2.__E : ("prototype" in H2 && H2.prototype.render ? u2.__c = h2 = new H2(g2, x) : (u2.__c = h2 = new d(g2, x), h2.constructor = H2, h2.render = O), m2 && m2.sub(h2), h2.props = g2, h2.state || (h2.state = {}), h2.context = x, h2.__n = t2, v2 = h2.__d = true, h2.__h = []), null == h2.__s && (h2.__s = h2.state), null != H2.getDerivedStateFromProps && (h2.__s == h2.state && (h2.__s = s({}, h2.__s)), s(h2.__s, H2.getDerivedStateFromProps(g2, h2.__s))), y = h2.props, _3 = h2.state, v2)
7403
- null == H2.getDerivedStateFromProps && null != h2.componentWillMount && h2.componentWillMount(), null != h2.componentDidMount && h2.__h.push(h2.componentDidMount);
7396
+ 128 & t2.__u && (c2 = !!(32 & t2.__u), r2 = [e2 = u3.__e = t2.__e]), (a2 = l.__b) && a2(u3);
7397
+ n:
7398
+ if ("function" == typeof A2)
7399
+ try {
7400
+ if (w2 = u3.props, x2 = (a2 = A2.contextType) && i3[a2.__c], P2 = a2 ? x2 ? x2.props.value : a2.__ : i3, t2.__c ? k2 = (p2 = u3.__c = t2.__c).__ = p2.__E : ("prototype" in A2 && A2.prototype.render ? u3.__c = p2 = new A2(w2, P2) : (u3.__c = p2 = new b(w2, P2), p2.constructor = A2, p2.render = O), x2 && x2.sub(p2), p2.props = w2, p2.state || (p2.state = {}), p2.context = P2, p2.__n = i3, y2 = p2.__d = true, p2.__h = [], p2._sb = []), null == p2.__s && (p2.__s = p2.state), null != A2.getDerivedStateFromProps && (p2.__s == p2.state && (p2.__s = v({}, p2.__s)), v(p2.__s, A2.getDerivedStateFromProps(w2, p2.__s))), d2 = p2.props, _ = p2.state, p2.__v = u3, y2)
7401
+ null == A2.getDerivedStateFromProps && null != p2.componentWillMount && p2.componentWillMount(), null != p2.componentDidMount && p2.__h.push(p2.componentDidMount);
7404
7402
  else {
7405
- if (null == H2.getDerivedStateFromProps && g2 !== y && null != h2.componentWillReceiveProps && h2.componentWillReceiveProps(g2, x), !h2.__e && null != h2.shouldComponentUpdate && false === h2.shouldComponentUpdate(g2, h2.__s, x) || u2.__v === i2.__v) {
7406
- h2.props = g2, h2.state = h2.__s, u2.__v !== i2.__v && (h2.__d = false), h2.__v = u2, u2.__e = i2.__e, u2.__k = i2.__k, u2.__k.forEach(function(n3) {
7407
- n3 && (n3.__ = u2);
7408
- }), h2.__h.length && f2.push(h2);
7403
+ if (null == A2.getDerivedStateFromProps && w2 !== d2 && null != p2.componentWillReceiveProps && p2.componentWillReceiveProps(w2, P2), !p2.__e && (null != p2.shouldComponentUpdate && false === p2.shouldComponentUpdate(w2, p2.__s, P2) || u3.__v === t2.__v)) {
7404
+ for (u3.__v !== t2.__v && (p2.props = w2, p2.state = p2.__s, p2.__d = false), u3.__e = t2.__e, u3.__k = t2.__k, u3.__k.forEach(function(n3) {
7405
+ n3 && (n3.__ = u3);
7406
+ }), S2 = 0; S2 < p2._sb.length; S2++)
7407
+ p2.__h.push(p2._sb[S2]);
7408
+ p2._sb = [], p2.__h.length && f3.push(p2);
7409
7409
  break n;
7410
7410
  }
7411
- null != h2.componentWillUpdate && h2.componentWillUpdate(g2, h2.__s, x), null != h2.componentDidUpdate && h2.__h.push(function() {
7412
- h2.componentDidUpdate(y, _3, k2);
7411
+ null != p2.componentWillUpdate && p2.componentWillUpdate(w2, p2.__s, P2), null != p2.componentDidUpdate && p2.__h.push(function() {
7412
+ p2.componentDidUpdate(d2, _, m2);
7413
7413
  });
7414
7414
  }
7415
- if (h2.context = x, h2.props = g2, h2.__v = u2, h2.__P = n2, A2 = l.__r, C2 = 0, "prototype" in H2 && H2.prototype.render)
7416
- h2.state = h2.__s, h2.__d = false, A2 && A2(u2), a2 = h2.render(h2.props, h2.state, h2.context);
7417
- else
7415
+ if (p2.context = P2, p2.props = w2, p2.__P = n2, p2.__e = false, $ = l.__r, H2 = 0, "prototype" in A2 && A2.prototype.render) {
7416
+ for (p2.state = p2.__s, p2.__d = false, $ && $(u3), a2 = p2.render(p2.props, p2.state, p2.context), I2 = 0; I2 < p2._sb.length; I2++)
7417
+ p2.__h.push(p2._sb[I2]);
7418
+ p2._sb = [];
7419
+ } else
7418
7420
  do {
7419
- h2.__d = false, A2 && A2(u2), a2 = h2.render(h2.props, h2.state, h2.context), h2.state = h2.__s;
7420
- } while (h2.__d && ++C2 < 25);
7421
- h2.state = h2.__s, null != h2.getChildContext && (t2 = s(s({}, t2), h2.getChildContext())), v2 || null == h2.getSnapshotBeforeUpdate || (k2 = h2.getSnapshotBeforeUpdate(y, _3)), $2 = null != a2 && a2.type === p && null == a2.key ? a2.props.children : a2, w(n2, Array.isArray($2) ? $2 : [$2], u2, i2, t2, o3, r2, f2, e2, c2), h2.base = u2.__e, u2.__h = null, h2.__h.length && f2.push(h2), b2 && (h2.__E = h2.__ = null), h2.__e = false;
7422
- } else
7423
- null == r2 && u2.__v === i2.__v ? (u2.__k = i2.__k, u2.__e = i2.__e) : u2.__e = L(i2.__e, u2, i2, t2, o3, r2, f2, c2);
7424
- (a2 = l.diffed) && a2(u2);
7425
- } catch (n3) {
7426
- u2.__v = null, (c2 || null != r2) && (u2.__e = e2, u2.__h = !!c2, r2[r2.indexOf(e2)] = null), l.__e(n3, u2, i2);
7427
- }
7428
- }
7429
- function z(n2, u2) {
7430
- l.__c && l.__c(u2, n2), n2.some(function(u3) {
7421
+ p2.__d = false, $ && $(u3), a2 = p2.render(p2.props, p2.state, p2.context), p2.state = p2.__s;
7422
+ } while (p2.__d && ++H2 < 25);
7423
+ p2.state = p2.__s, null != p2.getChildContext && (i3 = v(v({}, i3), p2.getChildContext())), y2 || null == p2.getSnapshotBeforeUpdate || (m2 = p2.getSnapshotBeforeUpdate(d2, _)), C(n2, h(T2 = null != a2 && a2.type === g && null == a2.key ? a2.props.children : a2) ? T2 : [T2], u3, t2, i3, o2, r2, f3, e2, c2, s2), p2.base = u3.__e, u3.__u &= -161, p2.__h.length && f3.push(p2), k2 && (p2.__E = p2.__ = null);
7424
+ } catch (n3) {
7425
+ u3.__v = null, c2 || null != r2 ? (u3.__e = e2, u3.__u |= c2 ? 160 : 32, r2[r2.indexOf(e2)] = null) : (u3.__e = t2.__e, u3.__k = t2.__k), l.__e(n3, u3, t2);
7426
+ }
7427
+ else
7428
+ null == r2 && u3.__v === t2.__v ? (u3.__k = t2.__k, u3.__e = t2.__e) : u3.__e = j(t2.__e, u3, t2, i3, o2, r2, f3, c2, s2);
7429
+ (a2 = l.diffed) && a2(u3);
7430
+ }
7431
+ function M(n2, u3, t2) {
7432
+ u3.__d = void 0;
7433
+ for (var i3 = 0; i3 < t2.length; i3++)
7434
+ z(t2[i3], t2[++i3], t2[++i3]);
7435
+ l.__c && l.__c(u3, n2), n2.some(function(u4) {
7431
7436
  try {
7432
- n2 = u3.__h, u3.__h = [], n2.some(function(n3) {
7433
- n3.call(u3);
7437
+ n2 = u4.__h, u4.__h = [], n2.some(function(n3) {
7438
+ n3.call(u4);
7434
7439
  });
7435
7440
  } catch (n3) {
7436
- l.__e(n3, u3.__v);
7441
+ l.__e(n3, u4.__v);
7437
7442
  }
7438
7443
  });
7439
7444
  }
7440
- function L(l2, u2, i2, t2, o3, r2, e2, c2) {
7441
- var s2, h2, v2, y = i2.props, p2 = u2.props, d2 = u2.type, k2 = 0;
7442
- if ("svg" === d2 && (o3 = true), null != r2) {
7443
- for (; k2 < r2.length; k2++)
7444
- if ((s2 = r2[k2]) && "setAttribute" in s2 == !!d2 && (d2 ? s2.localName === d2 : 3 === s2.nodeType)) {
7445
- l2 = s2, r2[k2] = null;
7445
+ function j(l2, u3, t2, i3, o2, r2, f3, e2, s2) {
7446
+ var a2, v2, y2, d2, _, g2, b2, k2 = t2.props, w2 = u3.props, x2 = u3.type;
7447
+ if ("svg" === x2 && (o2 = true), null != r2) {
7448
+ for (a2 = 0; a2 < r2.length; a2++)
7449
+ if ((_ = r2[a2]) && "setAttribute" in _ == !!x2 && (x2 ? _.localName === x2 : 3 === _.nodeType)) {
7450
+ l2 = _, r2[a2] = null;
7446
7451
  break;
7447
7452
  }
7448
7453
  }
7449
7454
  if (null == l2) {
7450
- if (null === d2)
7451
- return document.createTextNode(p2);
7452
- l2 = o3 ? document.createElementNS("http://www.w3.org/2000/svg", d2) : document.createElement(d2, p2.is && p2), r2 = null, c2 = false;
7455
+ if (null === x2)
7456
+ return document.createTextNode(w2);
7457
+ l2 = o2 ? document.createElementNS("http://www.w3.org/2000/svg", x2) : document.createElement(x2, w2.is && w2), r2 = null, e2 = false;
7453
7458
  }
7454
- if (null === d2)
7455
- y === p2 || c2 && l2.data === p2 || (l2.data = p2);
7459
+ if (null === x2)
7460
+ k2 === w2 || e2 && l2.data === w2 || (l2.data = w2);
7456
7461
  else {
7457
- if (r2 = r2 && n.call(l2.childNodes), h2 = (y = i2.props || f).dangerouslySetInnerHTML, v2 = p2.dangerouslySetInnerHTML, !c2) {
7458
- if (null != r2)
7459
- for (y = {}, k2 = 0; k2 < l2.attributes.length; k2++)
7460
- y[l2.attributes[k2].name] = l2.attributes[k2].value;
7461
- (v2 || h2) && (v2 && (h2 && v2.__html == h2.__html || v2.__html === l2.innerHTML) || (l2.innerHTML = v2 && v2.__html || ""));
7462
- }
7463
- if (C(l2, p2, y, o3, c2), v2)
7464
- u2.__k = [];
7465
- else if (k2 = u2.props.children, w(l2, Array.isArray(k2) ? k2 : [k2], u2, i2, t2, o3 && "foreignObject" !== d2, r2, e2, r2 ? r2[0] : i2.__k && _(i2, 0), c2), null != r2)
7466
- for (k2 = r2.length; k2--; )
7467
- null != r2[k2] && a(r2[k2]);
7468
- c2 || ("value" in p2 && void 0 !== (k2 = p2.value) && (k2 !== l2.value || "progress" === d2 && !k2 || "option" === d2 && k2 !== y.value) && H(l2, "value", k2, y.value, false), "checked" in p2 && void 0 !== (k2 = p2.checked) && k2 !== l2.checked && H(l2, "checked", k2, y.checked, false));
7462
+ if (r2 = r2 && n.call(l2.childNodes), k2 = t2.props || c, !e2 && null != r2)
7463
+ for (k2 = {}, a2 = 0; a2 < l2.attributes.length; a2++)
7464
+ k2[(_ = l2.attributes[a2]).name] = _.value;
7465
+ for (a2 in k2)
7466
+ _ = k2[a2], "children" == a2 || ("dangerouslySetInnerHTML" == a2 ? y2 = _ : "key" === a2 || a2 in w2 || T(l2, a2, null, _, o2));
7467
+ for (a2 in w2)
7468
+ _ = w2[a2], "children" == a2 ? d2 = _ : "dangerouslySetInnerHTML" == a2 ? v2 = _ : "value" == a2 ? g2 = _ : "checked" == a2 ? b2 = _ : "key" === a2 || e2 && "function" != typeof _ || k2[a2] === _ || T(l2, a2, _, k2[a2], o2);
7469
+ if (v2)
7470
+ e2 || y2 && (v2.__html === y2.__html || v2.__html === l2.innerHTML) || (l2.innerHTML = v2.__html), u3.__k = [];
7471
+ else if (y2 && (l2.innerHTML = ""), C(l2, h(d2) ? d2 : [d2], u3, t2, i3, o2 && "foreignObject" !== x2, r2, f3, r2 ? r2[0] : t2.__k && m(t2, 0), e2, s2), null != r2)
7472
+ for (a2 = r2.length; a2--; )
7473
+ null != r2[a2] && p(r2[a2]);
7474
+ e2 || (a2 = "value", void 0 !== g2 && (g2 !== l2[a2] || "progress" === x2 && !g2 || "option" === x2 && g2 !== k2[a2]) && T(l2, a2, g2, k2[a2], false), a2 = "checked", void 0 !== b2 && b2 !== l2[a2] && T(l2, a2, b2, k2[a2], false));
7469
7475
  }
7470
7476
  return l2;
7471
7477
  }
7472
- function M(n2, u2, i2) {
7478
+ function z(n2, u3, t2) {
7473
7479
  try {
7474
- "function" == typeof n2 ? n2(u2) : n2.current = u2;
7480
+ "function" == typeof n2 ? n2(u3) : n2.current = u3;
7475
7481
  } catch (n3) {
7476
- l.__e(n3, i2);
7482
+ l.__e(n3, t2);
7477
7483
  }
7478
7484
  }
7479
- function N(n2, u2, i2) {
7480
- var t2, o3;
7481
- if (l.unmount && l.unmount(n2), (t2 = n2.ref) && (t2.current && t2.current !== n2.__e || M(t2, null, u2)), null != (t2 = n2.__c)) {
7482
- if (t2.componentWillUnmount)
7485
+ function N(n2, u3, t2) {
7486
+ var i3, o2;
7487
+ if (l.unmount && l.unmount(n2), (i3 = n2.ref) && (i3.current && i3.current !== n2.__e || z(i3, null, u3)), null != (i3 = n2.__c)) {
7488
+ if (i3.componentWillUnmount)
7483
7489
  try {
7484
- t2.componentWillUnmount();
7490
+ i3.componentWillUnmount();
7485
7491
  } catch (n3) {
7486
- l.__e(n3, u2);
7492
+ l.__e(n3, u3);
7487
7493
  }
7488
- t2.base = t2.__P = null, n2.__c = void 0;
7494
+ i3.base = i3.__P = null, n2.__c = void 0;
7489
7495
  }
7490
- if (t2 = n2.__k)
7491
- for (o3 = 0; o3 < t2.length; o3++)
7492
- t2[o3] && N(t2[o3], u2, "function" != typeof n2.type);
7493
- i2 || null == n2.__e || a(n2.__e), n2.__ = n2.__e = n2.__d = void 0;
7496
+ if (i3 = n2.__k)
7497
+ for (o2 = 0; o2 < i3.length; o2++)
7498
+ i3[o2] && N(i3[o2], u3, t2 || "function" != typeof n2.type);
7499
+ t2 || null == n2.__e || p(n2.__e), n2.__ = n2.__e = n2.__d = void 0;
7494
7500
  }
7495
- function O(n2, l2, u2) {
7496
- return this.constructor(n2, u2);
7501
+ function O(n2, l2, u3) {
7502
+ return this.constructor(n2, u3);
7497
7503
  }
7498
- function P(u2, i2, t2) {
7499
- var o3, r2, e2;
7500
- l.__ && l.__(u2, i2), r2 = (o3 = "function" == typeof t2) ? null : t2 && t2.__k || i2.__k, e2 = [], j(i2, u2 = (!o3 && t2 || i2).__k = h(p, null, [u2]), r2 || f, f, void 0 !== i2.ownerSVGElement, !o3 && t2 ? [t2] : r2 ? null : i2.firstChild ? n.call(i2.childNodes) : null, e2, !o3 && t2 ? t2 : r2 ? r2.__e : i2.firstChild, o3), z(e2, u2);
7504
+ function q(u3, t2, i3) {
7505
+ var o2, r2, f3, e2;
7506
+ l.__ && l.__(u3, t2), r2 = (o2 = "function" == typeof i3) ? null : i3 && i3.__k || t2.__k, f3 = [], e2 = [], L(t2, u3 = (!o2 && i3 || t2).__k = y(g, null, [u3]), r2 || c, c, void 0 !== t2.ownerSVGElement, !o2 && i3 ? [i3] : r2 ? null : t2.firstChild ? n.call(t2.childNodes) : null, f3, !o2 && i3 ? i3 : r2 ? r2.__e : t2.firstChild, o2, e2), M(f3, u3, e2);
7501
7507
  }
7502
- n = e.slice, l = { __e: function(n2, l2, u2, i2) {
7503
- for (var t2, o3, r2; l2 = l2.__; )
7504
- if ((t2 = l2.__c) && !t2.__)
7508
+ n = s.slice, l = { __e: function(n2, l2, u3, t2) {
7509
+ for (var i3, o2, r2; l2 = l2.__; )
7510
+ if ((i3 = l2.__c) && !i3.__)
7505
7511
  try {
7506
- if ((o3 = t2.constructor) && null != o3.getDerivedStateFromError && (t2.setState(o3.getDerivedStateFromError(n2)), r2 = t2.__d), null != t2.componentDidCatch && (t2.componentDidCatch(n2, i2 || {}), r2 = t2.__d), r2)
7507
- return t2.__E = t2;
7512
+ if ((o2 = i3.constructor) && null != o2.getDerivedStateFromError && (i3.setState(o2.getDerivedStateFromError(n2)), r2 = i3.__d), null != i3.componentDidCatch && (i3.componentDidCatch(n2, t2 || {}), r2 = i3.__d), r2)
7513
+ return i3.__E = i3;
7508
7514
  } catch (l3) {
7509
7515
  n2 = l3;
7510
7516
  }
7511
7517
  throw n2;
7512
- } }, u = 0, i = function(n2) {
7513
- return null != n2 && void 0 === n2.constructor;
7514
- }, d.prototype.setState = function(n2, l2) {
7515
- var u2;
7516
- u2 = null != this.__s && this.__s !== this.state ? this.__s : this.__s = s({}, this.state), "function" == typeof n2 && (n2 = n2(s({}, u2), this.props)), n2 && s(u2, n2), null != n2 && this.__v && (l2 && this.__h.push(l2), b(this));
7517
- }, d.prototype.forceUpdate = function(n2) {
7518
- this.__v && (this.__e = true, n2 && this.__h.push(n2), b(this));
7519
- }, d.prototype.render = p, t = [], g.__r = 0, r = 0;
7518
+ } }, u = 0, t = function(n2) {
7519
+ return null != n2 && null == n2.constructor;
7520
+ }, b.prototype.setState = function(n2, l2) {
7521
+ var u3;
7522
+ u3 = null != this.__s && this.__s !== this.state ? this.__s : this.__s = v({}, this.state), "function" == typeof n2 && (n2 = n2(v({}, u3), this.props)), n2 && v(u3, n2), null != n2 && this.__v && (l2 && this._sb.push(l2), w(this));
7523
+ }, b.prototype.forceUpdate = function(n2) {
7524
+ this.__v && (this.__e = true, n2 && this.__h.push(n2), w(this));
7525
+ }, b.prototype.render = g, i = [], r = "function" == typeof Promise ? Promise.prototype.then.bind(Promise.resolve()) : setTimeout, f = function(n2, l2) {
7526
+ return n2.__v.__b - l2.__v.__b;
7527
+ }, x.__r = 0, e = 0;
7520
7528
 
7521
- // ../../node_modules/.pnpm/preact@10.11.0/node_modules/preact/jsx-runtime/dist/jsxRuntime.module.js
7522
- var _2 = 0;
7523
- function o2(o3, e2, n2, t2, f2) {
7524
- var l2, s2, u2 = {};
7525
- for (s2 in e2)
7526
- "ref" == s2 ? l2 = e2[s2] : u2[s2] = e2[s2];
7527
- var a2 = { type: o3, props: u2, key: n2, ref: l2, __k: null, __: null, __b: 0, __e: null, __d: void 0, __c: null, __h: null, constructor: void 0, __v: --_2, __source: f2, __self: t2 };
7528
- if ("function" == typeof o3 && (l2 = o3.defaultProps))
7529
- for (s2 in l2)
7530
- void 0 === u2[s2] && (u2[s2] = l2[s2]);
7531
- return l.vnode && l.vnode(a2), a2;
7529
+ // ../../node_modules/.pnpm/preact@10.19.3/node_modules/preact/jsx-runtime/dist/jsxRuntime.module.js
7530
+ var f2 = 0;
7531
+ var i2 = Array.isArray;
7532
+ function u2(e2, t2, n2, o2, i3, u3) {
7533
+ var a2, c2, p2 = {};
7534
+ for (c2 in t2)
7535
+ "ref" == c2 ? a2 = t2[c2] : p2[c2] = t2[c2];
7536
+ var l2 = { type: e2, props: p2, key: n2, ref: a2, __k: null, __: null, __b: 0, __e: null, __d: void 0, __c: null, constructor: void 0, __v: --f2, __i: -1, __u: 0, __source: i3, __self: u3 };
7537
+ if ("function" == typeof e2 && (a2 = e2.defaultProps))
7538
+ for (c2 in a2)
7539
+ void 0 === p2[c2] && (p2[c2] = a2[c2]);
7540
+ return l.vnode && l.vnode(l2), l2;
7532
7541
  }
7533
7542
 
7534
7543
  // signin/signin.tsx
7535
7544
  function SignIn() {
7536
7545
  const title = window.__ROOT_CTX.name;
7537
- return /* @__PURE__ */ o2("div", { className: "signin", children: [
7538
- /* @__PURE__ */ o2("div", { className: "signin__headline", children: [
7539
- title && /* @__PURE__ */ o2("h1", { className: "signin__headline__title", children: title }),
7540
- /* @__PURE__ */ o2("p", { className: "signin__headline__body", children: title ? `Sign in to continue to ${title}` : "Sign in to continue" })
7546
+ return /* @__PURE__ */ u2("div", { className: "signin", children: [
7547
+ /* @__PURE__ */ u2("div", { className: "signin__headline", children: [
7548
+ title && /* @__PURE__ */ u2("h1", { className: "signin__headline__title", children: title }),
7549
+ /* @__PURE__ */ u2("p", { className: "signin__headline__body", children: title ? `Sign in to continue to ${title}` : "Sign in to continue" })
7541
7550
  ] }),
7542
- /* @__PURE__ */ o2(SignIn.Button, {})
7551
+ /* @__PURE__ */ u2(SignIn.Button, {})
7543
7552
  ] });
7544
7553
  }
7545
7554
  SignIn.Button = () => {
@@ -7570,41 +7579,41 @@
7570
7579
  }
7571
7580
  loginSuccessRedirect();
7572
7581
  }
7573
- return /* @__PURE__ */ o2("button", { className: "signin__button", onClick: signIn, children: [
7574
- /* @__PURE__ */ o2("div", { className: "signin__button__icon", children: /* @__PURE__ */ o2(SignIn.GLogo, {}) }),
7575
- /* @__PURE__ */ o2("div", { className: "signin__button__label", children: "Sign in with Google" })
7582
+ return /* @__PURE__ */ u2("button", { className: "signin__button", onClick: signIn, children: [
7583
+ /* @__PURE__ */ u2("div", { className: "signin__button__icon", children: /* @__PURE__ */ u2(SignIn.GLogo, {}) }),
7584
+ /* @__PURE__ */ u2("div", { className: "signin__button__label", children: "Sign in with Google" })
7576
7585
  ] });
7577
7586
  };
7578
- SignIn.GLogo = () => /* @__PURE__ */ o2("svg", { version: "1.1", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 48 48", children: /* @__PURE__ */ o2("g", { children: [
7579
- /* @__PURE__ */ o2(
7587
+ SignIn.GLogo = () => /* @__PURE__ */ u2("svg", { version: "1.1", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 48 48", children: /* @__PURE__ */ u2("g", { children: [
7588
+ /* @__PURE__ */ u2(
7580
7589
  "path",
7581
7590
  {
7582
7591
  fill: "#EA4335",
7583
7592
  d: "M24 9.5c3.54 0 6.71 1.22 9.21 3.6l6.85-6.85C35.9 2.38 30.47 0 24 0 14.62 0 6.51 5.38 2.56 13.22l7.98 6.19C12.43 13.72 17.74 9.5 24 9.5z"
7584
7593
  }
7585
7594
  ),
7586
- /* @__PURE__ */ o2(
7595
+ /* @__PURE__ */ u2(
7587
7596
  "path",
7588
7597
  {
7589
7598
  fill: "#4285F4",
7590
7599
  d: "M46.98 24.55c0-1.57-.15-3.09-.38-4.55H24v9.02h12.94c-.58 2.96-2.26 5.48-4.78 7.18l7.73 6c4.51-4.18 7.09-10.36 7.09-17.65z"
7591
7600
  }
7592
7601
  ),
7593
- /* @__PURE__ */ o2(
7602
+ /* @__PURE__ */ u2(
7594
7603
  "path",
7595
7604
  {
7596
7605
  fill: "#FBBC05",
7597
7606
  d: "M10.53 28.59c-.48-1.45-.76-2.99-.76-4.59s.27-3.14.76-4.59l-7.98-6.19C.92 16.46 0 20.12 0 24c0 3.88.92 7.54 2.56 10.78l7.97-6.19z"
7598
7607
  }
7599
7608
  ),
7600
- /* @__PURE__ */ o2(
7609
+ /* @__PURE__ */ u2(
7601
7610
  "path",
7602
7611
  {
7603
7612
  fill: "#34A853",
7604
7613
  d: "M24 48c6.48 0 11.93-2.13 15.89-5.81l-7.73-6c-2.15 1.45-4.92 2.3-8.16 2.3-6.26 0-11.57-4.22-13.47-9.91l-7.98 6.19C6.51 42.62 14.62 48 24 48z"
7605
7614
  }
7606
7615
  ),
7607
- /* @__PURE__ */ o2("path", { fill: "none", d: "M0 0h48v48H0z" })
7616
+ /* @__PURE__ */ u2("path", { fill: "none", d: "M0 0h48v48H0z" })
7608
7617
  ] }) });
7609
7618
  function loginSuccessRedirect() {
7610
7619
  const params = new URLSearchParams(window.location.search);
@@ -7619,7 +7628,7 @@
7619
7628
  window.firebase = { app, auth };
7620
7629
  var root = document.getElementById("root");
7621
7630
  root.innerHTML = "";
7622
- P(/* @__PURE__ */ o2(SignIn, {}), root);
7631
+ q(/* @__PURE__ */ u2(SignIn, {}), root);
7623
7632
  })();
7624
7633
  /*! Bundled license information:
7625
7634
 
@@ -9001,3 +9010,4 @@ firebase/app/dist/esm/index.esm.js:
9001
9010
  * limitations under the License.
9002
9011
  *)
9003
9012
  */
9013
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSt1dGlsQDEuOS4zL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvdXRpbC9zcmMvY29uc3RhbnRzLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrdXRpbEAxLjkuMy9ub2RlX21vZHVsZXMvQGZpcmViYXNlL3V0aWwvc3JjL2Fzc2VydC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK3V0aWxAMS45LjMvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS91dGlsL3NyYy9jcnlwdC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK3V0aWxAMS45LjMvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS91dGlsL3NyYy9kZWVwQ29weS50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK3V0aWxAMS45LjMvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS91dGlsL3NyYy9nbG9iYWwudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSt1dGlsQDEuOS4zL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvdXRpbC9zcmMvZGVmYXVsdHMudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSt1dGlsQDEuOS4zL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvdXRpbC9zcmMvZGVmZXJyZWQudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSt1dGlsQDEuOS4zL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvdXRpbC9zcmMvZW11bGF0b3IudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSt1dGlsQDEuOS4zL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvdXRpbC9zcmMvZW52aXJvbm1lbnQudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSt1dGlsQDEuOS4zL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvdXRpbC9zcmMvZXJyb3JzLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrdXRpbEAxLjkuMy9ub2RlX21vZHVsZXMvQGZpcmViYXNlL3V0aWwvc3JjL2pzb24udHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSt1dGlsQDEuOS4zL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvdXRpbC9zcmMvand0LnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrdXRpbEAxLjkuMy9ub2RlX21vZHVsZXMvQGZpcmViYXNlL3V0aWwvc3JjL29iai50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK3V0aWxAMS45LjMvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS91dGlsL3NyYy9wcm9taXNlLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrdXRpbEAxLjkuMy9ub2RlX21vZHVsZXMvQGZpcmViYXNlL3V0aWwvc3JjL3F1ZXJ5LnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrdXRpbEAxLjkuMy9ub2RlX21vZHVsZXMvQGZpcmViYXNlL3V0aWwvc3JjL3NoYTEudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSt1dGlsQDEuOS4zL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvdXRpbC9zcmMvc3Vic2NyaWJlLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrdXRpbEAxLjkuMy9ub2RlX21vZHVsZXMvQGZpcmViYXNlL3V0aWwvc3JjL3ZhbGlkYXRpb24udHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSt1dGlsQDEuOS4zL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvdXRpbC9zcmMvdXRmOC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK3V0aWxAMS45LjMvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS91dGlsL3NyYy91dWlkLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrdXRpbEAxLjkuMy9ub2RlX21vZHVsZXMvQGZpcmViYXNlL3V0aWwvc3JjL2V4cG9uZW50aWFsX2JhY2tvZmYudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSt1dGlsQDEuOS4zL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvdXRpbC9zcmMvZm9ybWF0dGVycy50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK3V0aWxAMS45LjMvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS91dGlsL3NyYy9jb21wYXQudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZStjb21wb25lbnRAMC42LjQvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9jb21wb25lbnQvc3JjL2NvbXBvbmVudC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2NvbXBvbmVudEAwLjYuNC9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2NvbXBvbmVudC9zcmMvY29uc3RhbnRzLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrY29tcG9uZW50QDAuNi40L25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvY29tcG9uZW50L3NyYy9wcm92aWRlci50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2NvbXBvbmVudEAwLjYuNC9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2NvbXBvbmVudC9zcmMvY29tcG9uZW50X2NvbnRhaW5lci50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2xvZ2dlckAwLjQuMC9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2xvZ2dlci9zcmMvbG9nZ2VyLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9pZGJANy4xLjEvbm9kZV9tb2R1bGVzL2lkYi9idWlsZC93cmFwLWlkYi12YWx1ZS5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vaWRiQDcuMS4xL25vZGVfbW9kdWxlcy9pZGIvYnVpbGQvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXBwL3NyYy9wbGF0Zm9ybUxvZ2dlclNlcnZpY2UudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXBwL3NyYy9sb2dnZXIudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXBwL3NyYy9jb25zdGFudHMudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXBwL3NyYy9pbnRlcm5hbC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hcHAvc3JjL2Vycm9ycy50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hcHAvc3JjL2ZpcmViYXNlQXBwLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2FwcC9zcmMvYXBpLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2FwcC9zcmMvaW5kZXhlZGRiLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2FwcC9zcmMvaGVhcnRiZWF0U2VydmljZS50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hcHAvc3JjL3JlZ2lzdGVyQ29yZUNvbXBvbmVudHMudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXBwL3NyYy9pbmRleC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vZmlyZWJhc2VAMTAuNS4yL25vZGVfbW9kdWxlcy9maXJlYmFzZS9hcHAvaW5kZXgudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3RzbGliQDIuNi4yL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYubWpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL21vZGVsL2VudW1fbWFwcy50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL2Vycm9ycy50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL3V0aWwvbG9nLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvdXRpbC9hc3NlcnQudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS91dGlsL2xvY2F0aW9uLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvdXRpbC9uYXZpZ2F0b3IudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS91dGlsL2RlbGF5LnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvdXRpbC9lbXVsYXRvci50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL3V0aWwvZmV0Y2hfcHJvdmlkZXIudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvYXBpL2Vycm9ycy50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9hcGkvaW5kZXgudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvcGxhdGZvcm1fYnJvd3Nlci9yZWNhcHRjaGEvcmVjYXB0Y2hhLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2FwaS9hdXRoZW50aWNhdGlvbi9yZWNhcHRjaGEudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvYXBpL2FjY291bnRfbWFuYWdlbWVudC9hY2NvdW50LnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvdXRpbC90aW1lLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvdXNlci9pZF90b2tlbl9yZXN1bHQudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS91c2VyL2ludmFsaWRhdGlvbi50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL3VzZXIvcHJvYWN0aXZlX3JlZnJlc2gudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS91c2VyL3VzZXJfbWV0YWRhdGEudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS91c2VyL3JlbG9hZC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9hcGkvYXV0aGVudGljYXRpb24vdG9rZW4udHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS91c2VyL3Rva2VuX21hbmFnZXIudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS91c2VyL3VzZXJfaW1wbC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL3V0aWwvaW5zdGFudGlhdG9yLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvcGVyc2lzdGVuY2UvaW5fbWVtb3J5LnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvcGVyc2lzdGVuY2UvcGVyc2lzdGVuY2VfdXNlcl9tYW5hZ2VyLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvdXRpbC9icm93c2VyLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvdXRpbC92ZXJzaW9uLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvYXV0aC9taWRkbGV3YXJlLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2FwaS9wYXNzd29yZF9wb2xpY3kvZ2V0X3Bhc3N3b3JkX3BvbGljeS50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL2F1dGgvcGFzc3dvcmRfcG9saWN5X2ltcGwudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS9hdXRoL2F1dGhfaW1wbC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9wbGF0Zm9ybV9icm93c2VyL2xvYWRfanMudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvcGxhdGZvcm1fYnJvd3Nlci9yZWNhcHRjaGEvcmVjYXB0Y2hhX2VudGVycHJpc2VfdmVyaWZpZXIudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS9hdXRoL2luaXRpYWxpemUudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS9hdXRoL2VtdWxhdG9yLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvY3JlZGVudGlhbHMvYXV0aF9jcmVkZW50aWFsLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2FwaS9hY2NvdW50X21hbmFnZW1lbnQvZW1haWxfYW5kX3Bhc3N3b3JkLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2FwaS9hdXRoZW50aWNhdGlvbi9lbWFpbF9hbmRfcGFzc3dvcmQudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvYXBpL2F1dGhlbnRpY2F0aW9uL2VtYWlsX2xpbmsudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS9jcmVkZW50aWFscy9lbWFpbC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9hcGkvYXV0aGVudGljYXRpb24vaWRwLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvY3JlZGVudGlhbHMvb2F1dGgudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvYXBpL2F1dGhlbnRpY2F0aW9uL3Ntcy50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL2NyZWRlbnRpYWxzL3Bob25lLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvYWN0aW9uX2NvZGVfdXJsLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvcHJvdmlkZXJzL2VtYWlsLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvcHJvdmlkZXJzL2ZlZGVyYXRlZC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL3Byb3ZpZGVycy9vYXV0aC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL3Byb3ZpZGVycy9mYWNlYm9vay50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL3Byb3ZpZGVycy9nb29nbGUudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS9wcm92aWRlcnMvZ2l0aHViLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvY3JlZGVudGlhbHMvc2FtbC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL3Byb3ZpZGVycy9zYW1sLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvcHJvdmlkZXJzL3R3aXR0ZXIudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvYXBpL2F1dGhlbnRpY2F0aW9uL3NpZ25fdXAudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS91c2VyL3VzZXJfY3JlZGVudGlhbF9pbXBsLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvc3RyYXRlZ2llcy9hbm9ueW1vdXMudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvbWZhL21mYV9lcnJvci50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL3V0aWwvcHJvdmlkZXJzLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvdXNlci9saW5rX3VubGluay50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL3VzZXIvcmVhdXRoZW50aWNhdGUudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS9zdHJhdGVnaWVzL2NyZWRlbnRpYWwudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvYXBpL2F1dGhlbnRpY2F0aW9uL2N1c3RvbV90b2tlbi50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL3N0cmF0ZWdpZXMvY3VzdG9tX3Rva2VuLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL21mYS9tZmFfaW5mby50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL3N0cmF0ZWdpZXMvYWN0aW9uX2NvZGVfc2V0dGluZ3MudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS9zdHJhdGVnaWVzL2VtYWlsX2FuZF9wYXNzd29yZC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL3N0cmF0ZWdpZXMvZW1haWxfbGluay50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9hcGkvYXV0aGVudGljYXRpb24vY3JlYXRlX2F1dGhfdXJpLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvc3RyYXRlZ2llcy9lbWFpbC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9hcGkvYWNjb3VudF9tYW5hZ2VtZW50L3Byb2ZpbGUudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS91c2VyL2FjY291bnRfaW5mby50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL3VzZXIvYWRkaXRpb25hbF91c2VyX2luZm8udHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS9pbmRleC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9tZmEvbWZhX3Nlc3Npb24udHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvbWZhL21mYV9yZXNvbHZlci50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9hcGkvYWNjb3VudF9tYW5hZ2VtZW50L21mYS50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9tZmEvbWZhX3VzZXIudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS9wZXJzaXN0ZW5jZS9pbmRleC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9wbGF0Zm9ybV9icm93c2VyL3BlcnNpc3RlbmNlL2Jyb3dzZXIudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvcGxhdGZvcm1fYnJvd3Nlci9wZXJzaXN0ZW5jZS9sb2NhbF9zdG9yYWdlLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL3BsYXRmb3JtX2Jyb3dzZXIvcGVyc2lzdGVuY2Uvc2Vzc2lvbl9zdG9yYWdlLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL3BsYXRmb3JtX2Jyb3dzZXIvbWVzc2FnZWNoYW5uZWwvcHJvbWlzZS50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9wbGF0Zm9ybV9icm93c2VyL21lc3NhZ2VjaGFubmVsL3JlY2VpdmVyLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvdXRpbC9ldmVudF9pZC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9wbGF0Zm9ybV9icm93c2VyL21lc3NhZ2VjaGFubmVsL3NlbmRlci50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9wbGF0Zm9ybV9icm93c2VyL2F1dGhfd2luZG93LnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL3BsYXRmb3JtX2Jyb3dzZXIvdXRpbC93b3JrZXIudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvcGxhdGZvcm1fYnJvd3Nlci9wZXJzaXN0ZW5jZS9pbmRleGVkX2RiLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2FwaS9hdXRoZW50aWNhdGlvbi9tZmEudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvcGxhdGZvcm1fYnJvd3Nlci9yZWNhcHRjaGEvcmVjYXB0Y2hhX21vY2sudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvcGxhdGZvcm1fYnJvd3Nlci9yZWNhcHRjaGEvcmVjYXB0Y2hhX2xvYWRlci50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9wbGF0Zm9ybV9icm93c2VyL3JlY2FwdGNoYS9yZWNhcHRjaGFfdmVyaWZpZXIudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvcGxhdGZvcm1fYnJvd3Nlci9zdHJhdGVnaWVzL3Bob25lLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL3BsYXRmb3JtX2Jyb3dzZXIvcHJvdmlkZXJzL3Bob25lLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvdXRpbC9yZXNvbHZlci50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL3N0cmF0ZWdpZXMvaWRwLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvc3RyYXRlZ2llcy9hYnN0cmFjdF9wb3B1cF9yZWRpcmVjdF9vcGVyYXRpb24udHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvcGxhdGZvcm1fYnJvd3Nlci9zdHJhdGVnaWVzL3BvcHVwLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvc3RyYXRlZ2llcy9yZWRpcmVjdC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9wbGF0Zm9ybV9icm93c2VyL3N0cmF0ZWdpZXMvcmVkaXJlY3QudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS9hdXRoL2F1dGhfZXZlbnRfbWFuYWdlci50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9hcGkvcHJvamVjdF9jb25maWcvZ2V0X3Byb2plY3RfY29uZmlnLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvdXRpbC92YWxpZGF0ZV9vcmlnaW4udHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvcGxhdGZvcm1fYnJvd3Nlci9pZnJhbWUvZ2FwaS50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9wbGF0Zm9ybV9icm93c2VyL2lmcmFtZS9pZnJhbWUudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvcGxhdGZvcm1fYnJvd3Nlci91dGlsL3BvcHVwLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvdXRpbC9oYW5kbGVyLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL3BsYXRmb3JtX2Jyb3dzZXIvcG9wdXBfcmVkaXJlY3QudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvbWZhL21mYV9hc3NlcnRpb24udHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvcGxhdGZvcm1fYnJvd3Nlci9tZmEvYXNzZXJ0aW9ucy9waG9uZS50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9tZmEvYXNzZXJ0aW9ucy90b3RwLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvYXV0aC9maXJlYmFzZV9pbnRlcm5hbC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL2F1dGgvcmVnaXN0ZXIudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvcGxhdGZvcm1fYnJvd3Nlci9pbmRleC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcHJlYWN0QDEwLjE5LjMvbm9kZV9tb2R1bGVzL3ByZWFjdC9zcmMvY29uc3RhbnRzLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9wcmVhY3RAMTAuMTkuMy9ub2RlX21vZHVsZXMvcHJlYWN0L3NyYy91dGlsLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9wcmVhY3RAMTAuMTkuMy9ub2RlX21vZHVsZXMvcHJlYWN0L3NyYy9vcHRpb25zLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9wcmVhY3RAMTAuMTkuMy9ub2RlX21vZHVsZXMvcHJlYWN0L3NyYy9jcmVhdGUtZWxlbWVudC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcHJlYWN0QDEwLjE5LjMvbm9kZV9tb2R1bGVzL3ByZWFjdC9zcmMvY29tcG9uZW50LmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9wcmVhY3RAMTAuMTkuMy9ub2RlX21vZHVsZXMvcHJlYWN0L3NyYy9jcmVhdGUtY29udGV4dC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcHJlYWN0QDEwLjE5LjMvbm9kZV9tb2R1bGVzL3ByZWFjdC9zcmMvZGlmZi9jaGlsZHJlbi5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcHJlYWN0QDEwLjE5LjMvbm9kZV9tb2R1bGVzL3ByZWFjdC9zcmMvZGlmZi9wcm9wcy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcHJlYWN0QDEwLjE5LjMvbm9kZV9tb2R1bGVzL3ByZWFjdC9zcmMvZGlmZi9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcHJlYWN0QDEwLjE5LjMvbm9kZV9tb2R1bGVzL3ByZWFjdC9zcmMvcmVuZGVyLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9wcmVhY3RAMTAuMTkuMy9ub2RlX21vZHVsZXMvcHJlYWN0L3NyYy9jbG9uZS1lbGVtZW50LmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9wcmVhY3RAMTAuMTkuMy9ub2RlX21vZHVsZXMvcHJlYWN0L3NyYy9kaWZmL2NhdGNoLWVycm9yLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9wcmVhY3RAMTAuMTkuMy9ub2RlX21vZHVsZXMvcHJlYWN0L2pzeC1ydW50aW1lL3NyYy91dGlscy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcHJlYWN0QDEwLjE5LjMvbm9kZV9tb2R1bGVzL3ByZWFjdC9zcmMvY29uc3RhbnRzLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9wcmVhY3RAMTAuMTkuMy9ub2RlX21vZHVsZXMvcHJlYWN0L2pzeC1ydW50aW1lL3NyYy9pbmRleC5qcyIsICIuLi8uLi9zaWduaW4vc2lnbmluLnRzeCJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IEZpcmViYXNlIGNvbnN0YW50cy4gIFNvbWUgb2YgdGhlc2UgKEBkZWZpbmVzKSBjYW4gYmUgb3ZlcnJpZGRlbiBhdCBjb21waWxlLXRpbWUuXG4gKi9cblxuZXhwb3J0IGNvbnN0IENPTlNUQU5UUyA9IHtcbiAgLyoqXG4gICAqIEBkZWZpbmUge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyBpcyB0aGUgY2xpZW50IE5vZGUuanMgU0RLLlxuICAgKi9cbiAgTk9ERV9DTElFTlQ6IGZhbHNlLFxuICAvKipcbiAgICogQGRlZmluZSB7Ym9vbGVhbn0gV2hldGhlciB0aGlzIGlzIHRoZSBBZG1pbiBOb2RlLmpzIFNESy5cbiAgICovXG4gIE5PREVfQURNSU46IGZhbHNlLFxuXG4gIC8qKlxuICAgKiBGaXJlYmFzZSBTREsgVmVyc2lvblxuICAgKi9cbiAgU0RLX1ZFUlNJT046ICcke0pTQ09SRV9WRVJTSU9OfSdcbn07XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgQ09OU1RBTlRTIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG4vKipcbiAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgcHJvdmlkZWQgYXNzZXJ0aW9uIGlzIGZhbHN5XG4gKi9cbmV4cG9ydCBjb25zdCBhc3NlcnQgPSBmdW5jdGlvbiAoYXNzZXJ0aW9uOiB1bmtub3duLCBtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKCFhc3NlcnRpb24pIHtcbiAgICB0aHJvdyBhc3NlcnRpb25FcnJvcihtZXNzYWdlKTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXR1cm5zIGFuIEVycm9yIG9iamVjdCBzdWl0YWJsZSBmb3IgdGhyb3dpbmcuXG4gKi9cbmV4cG9ydCBjb25zdCBhc3NlcnRpb25FcnJvciA9IGZ1bmN0aW9uIChtZXNzYWdlOiBzdHJpbmcpOiBFcnJvciB7XG4gIHJldHVybiBuZXcgRXJyb3IoXG4gICAgJ0ZpcmViYXNlIERhdGFiYXNlICgnICtcbiAgICAgIENPTlNUQU5UUy5TREtfVkVSU0lPTiArXG4gICAgICAnKSBJTlRFUk5BTCBBU1NFUlQgRkFJTEVEOiAnICtcbiAgICAgIG1lc3NhZ2VcbiAgKTtcbn07XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuY29uc3Qgc3RyaW5nVG9CeXRlQXJyYXkgPSBmdW5jdGlvbiAoc3RyOiBzdHJpbmcpOiBudW1iZXJbXSB7XG4gIC8vIFRPRE8odXNlcik6IFVzZSBuYXRpdmUgaW1wbGVtZW50YXRpb25zIGlmL3doZW4gYXZhaWxhYmxlXG4gIGNvbnN0IG91dDogbnVtYmVyW10gPSBbXTtcbiAgbGV0IHAgPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgIGxldCBjID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgaWYgKGMgPCAxMjgpIHtcbiAgICAgIG91dFtwKytdID0gYztcbiAgICB9IGVsc2UgaWYgKGMgPCAyMDQ4KSB7XG4gICAgICBvdXRbcCsrXSA9IChjID4+IDYpIHwgMTkyO1xuICAgICAgb3V0W3ArK10gPSAoYyAmIDYzKSB8IDEyODtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgKGMgJiAweGZjMDApID09PSAweGQ4MDAgJiZcbiAgICAgIGkgKyAxIDwgc3RyLmxlbmd0aCAmJlxuICAgICAgKHN0ci5jaGFyQ29kZUF0KGkgKyAxKSAmIDB4ZmMwMCkgPT09IDB4ZGMwMFxuICAgICkge1xuICAgICAgLy8gU3Vycm9nYXRlIFBhaXJcbiAgICAgIGMgPSAweDEwMDAwICsgKChjICYgMHgwM2ZmKSA8PCAxMCkgKyAoc3RyLmNoYXJDb2RlQXQoKytpKSAmIDB4MDNmZik7XG4gICAgICBvdXRbcCsrXSA9IChjID4+IDE4KSB8IDI0MDtcbiAgICAgIG91dFtwKytdID0gKChjID4+IDEyKSAmIDYzKSB8IDEyODtcbiAgICAgIG91dFtwKytdID0gKChjID4+IDYpICYgNjMpIHwgMTI4O1xuICAgICAgb3V0W3ArK10gPSAoYyAmIDYzKSB8IDEyODtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0W3ArK10gPSAoYyA+PiAxMikgfCAyMjQ7XG4gICAgICBvdXRbcCsrXSA9ICgoYyA+PiA2KSAmIDYzKSB8IDEyODtcbiAgICAgIG91dFtwKytdID0gKGMgJiA2MykgfCAxMjg7XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFR1cm5zIGFuIGFycmF5IG9mIG51bWJlcnMgaW50byB0aGUgc3RyaW5nIGdpdmVuIGJ5IHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZVxuICogY2hhcmFjdGVycyB0byB3aGljaCB0aGUgbnVtYmVycyBjb3JyZXNwb25kLlxuICogQHBhcmFtIGJ5dGVzIEFycmF5IG9mIG51bWJlcnMgcmVwcmVzZW50aW5nIGNoYXJhY3RlcnMuXG4gKiBAcmV0dXJuIFN0cmluZ2lmaWNhdGlvbiBvZiB0aGUgYXJyYXkuXG4gKi9cbmNvbnN0IGJ5dGVBcnJheVRvU3RyaW5nID0gZnVuY3Rpb24gKGJ5dGVzOiBudW1iZXJbXSk6IHN0cmluZyB7XG4gIC8vIFRPRE8odXNlcik6IFVzZSBuYXRpdmUgaW1wbGVtZW50YXRpb25zIGlmL3doZW4gYXZhaWxhYmxlXG4gIGNvbnN0IG91dDogc3RyaW5nW10gPSBbXTtcbiAgbGV0IHBvcyA9IDAsXG4gICAgYyA9IDA7XG4gIHdoaWxlIChwb3MgPCBieXRlcy5sZW5ndGgpIHtcbiAgICBjb25zdCBjMSA9IGJ5dGVzW3BvcysrXTtcbiAgICBpZiAoYzEgPCAxMjgpIHtcbiAgICAgIG91dFtjKytdID0gU3RyaW5nLmZyb21DaGFyQ29kZShjMSk7XG4gICAgfSBlbHNlIGlmIChjMSA+IDE5MSAmJiBjMSA8IDIyNCkge1xuICAgICAgY29uc3QgYzIgPSBieXRlc1twb3MrK107XG4gICAgICBvdXRbYysrXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoKChjMSAmIDMxKSA8PCA2KSB8IChjMiAmIDYzKSk7XG4gICAgfSBlbHNlIGlmIChjMSA+IDIzOSAmJiBjMSA8IDM2NSkge1xuICAgICAgLy8gU3Vycm9nYXRlIFBhaXJcbiAgICAgIGNvbnN0IGMyID0gYnl0ZXNbcG9zKytdO1xuICAgICAgY29uc3QgYzMgPSBieXRlc1twb3MrK107XG4gICAgICBjb25zdCBjNCA9IGJ5dGVzW3BvcysrXTtcbiAgICAgIGNvbnN0IHUgPVxuICAgICAgICAoKChjMSAmIDcpIDw8IDE4KSB8ICgoYzIgJiA2MykgPDwgMTIpIHwgKChjMyAmIDYzKSA8PCA2KSB8IChjNCAmIDYzKSkgLVxuICAgICAgICAweDEwMDAwO1xuICAgICAgb3V0W2MrK10gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4ZDgwMCArICh1ID4+IDEwKSk7XG4gICAgICBvdXRbYysrXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMHhkYzAwICsgKHUgJiAxMDIzKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGMyID0gYnl0ZXNbcG9zKytdO1xuICAgICAgY29uc3QgYzMgPSBieXRlc1twb3MrK107XG4gICAgICBvdXRbYysrXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoXG4gICAgICAgICgoYzEgJiAxNSkgPDwgMTIpIHwgKChjMiAmIDYzKSA8PCA2KSB8IChjMyAmIDYzKVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dC5qb2luKCcnKTtcbn07XG5cbmludGVyZmFjZSBCYXNlNjQge1xuICBieXRlVG9DaGFyTWFwXzogeyBba2V5OiBudW1iZXJdOiBzdHJpbmcgfSB8IG51bGw7XG4gIGNoYXJUb0J5dGVNYXBfOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9IHwgbnVsbDtcbiAgYnl0ZVRvQ2hhck1hcFdlYlNhZmVfOiB7IFtrZXk6IG51bWJlcl06IHN0cmluZyB9IHwgbnVsbDtcbiAgY2hhclRvQnl0ZU1hcFdlYlNhZmVfOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9IHwgbnVsbDtcbiAgRU5DT0RFRF9WQUxTX0JBU0U6IHN0cmluZztcbiAgcmVhZG9ubHkgRU5DT0RFRF9WQUxTOiBzdHJpbmc7XG4gIHJlYWRvbmx5IEVOQ09ERURfVkFMU19XRUJTQUZFOiBzdHJpbmc7XG4gIEhBU19OQVRJVkVfU1VQUE9SVDogYm9vbGVhbjtcbiAgZW5jb2RlQnl0ZUFycmF5KGlucHV0OiBudW1iZXJbXSB8IFVpbnQ4QXJyYXksIHdlYlNhZmU/OiBib29sZWFuKTogc3RyaW5nO1xuICBlbmNvZGVTdHJpbmcoaW5wdXQ6IHN0cmluZywgd2ViU2FmZT86IGJvb2xlYW4pOiBzdHJpbmc7XG4gIGRlY29kZVN0cmluZyhpbnB1dDogc3RyaW5nLCB3ZWJTYWZlOiBib29sZWFuKTogc3RyaW5nO1xuICBkZWNvZGVTdHJpbmdUb0J5dGVBcnJheShpbnB1dDogc3RyaW5nLCB3ZWJTYWZlOiBib29sZWFuKTogbnVtYmVyW107XG4gIGluaXRfKCk6IHZvaWQ7XG59XG5cbi8vIFdlIGRlZmluZSBpdCBhcyBhbiBvYmplY3QgbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgY2xhc3MgYmVjYXVzZSBhIGNsYXNzIGNvbXBpbGVkIGRvd24gdG8gZXM1IGNhbid0XG4vLyBiZSB0cmVlc2hha2VkLiBodHRwczovL2dpdGh1Yi5jb20vcm9sbHVwL3JvbGx1cC9pc3N1ZXMvMTY5MVxuLy8gU3RhdGljIGxvb2t1cCBtYXBzLCBsYXppbHkgcG9wdWxhdGVkIGJ5IGluaXRfKClcbmV4cG9ydCBjb25zdCBiYXNlNjQ6IEJhc2U2NCA9IHtcbiAgLyoqXG4gICAqIE1hcHMgYnl0ZXMgdG8gY2hhcmFjdGVycy5cbiAgICovXG4gIGJ5dGVUb0NoYXJNYXBfOiBudWxsLFxuXG4gIC8qKlxuICAgKiBNYXBzIGNoYXJhY3RlcnMgdG8gYnl0ZXMuXG4gICAqL1xuICBjaGFyVG9CeXRlTWFwXzogbnVsbCxcblxuICAvKipcbiAgICogTWFwcyBieXRlcyB0byB3ZWJzYWZlIGNoYXJhY3RlcnMuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBieXRlVG9DaGFyTWFwV2ViU2FmZV86IG51bGwsXG5cbiAgLyoqXG4gICAqIE1hcHMgd2Vic2FmZSBjaGFyYWN0ZXJzIHRvIGJ5dGVzLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY2hhclRvQnl0ZU1hcFdlYlNhZmVfOiBudWxsLFxuXG4gIC8qKlxuICAgKiBPdXIgZGVmYXVsdCBhbHBoYWJldCwgc2hhcmVkIGJldHdlZW5cbiAgICogRU5DT0RFRF9WQUxTIGFuZCBFTkNPREVEX1ZBTFNfV0VCU0FGRVxuICAgKi9cbiAgRU5DT0RFRF9WQUxTX0JBU0U6XG4gICAgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyArICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgKyAnMDEyMzQ1Njc4OScsXG5cbiAgLyoqXG4gICAqIE91ciBkZWZhdWx0IGFscGhhYmV0LiBWYWx1ZSA2NCAoPSkgaXMgc3BlY2lhbDsgaXQgbWVhbnMgXCJub3RoaW5nLlwiXG4gICAqL1xuICBnZXQgRU5DT0RFRF9WQUxTKCkge1xuICAgIHJldHVybiB0aGlzLkVOQ09ERURfVkFMU19CQVNFICsgJysvPSc7XG4gIH0sXG5cbiAgLyoqXG4gICAqIE91ciB3ZWJzYWZlIGFscGhhYmV0LlxuICAgKi9cbiAgZ2V0IEVOQ09ERURfVkFMU19XRUJTQUZFKCkge1xuICAgIHJldHVybiB0aGlzLkVOQ09ERURfVkFMU19CQVNFICsgJy1fLic7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBicm93c2VyIHN1cHBvcnRzIHRoZSBhdG9iIGFuZCBidG9hIGZ1bmN0aW9ucy4gVGhpcyBleHRlbnNpb25cbiAgICogc3RhcnRlZCBhdCBNb3ppbGxhIGJ1dCBpcyBub3cgaW1wbGVtZW50ZWQgYnkgbWFueSBicm93c2Vycy4gV2UgdXNlIHRoZVxuICAgKiBBU1NVTUVfKiB2YXJpYWJsZXMgdG8gYXZvaWQgcHVsbGluZyBpbiB0aGUgZnVsbCB1c2VyYWdlbnQgZGV0ZWN0aW9uIGxpYnJhcnlcbiAgICogYnV0IHN0aWxsIGFsbG93aW5nIHRoZSBzdGFuZGFyZCBwZXItYnJvd3NlciBjb21waWxhdGlvbnMuXG4gICAqXG4gICAqL1xuICBIQVNfTkFUSVZFX1NVUFBPUlQ6IHR5cGVvZiBhdG9iID09PSAnZnVuY3Rpb24nLFxuXG4gIC8qKlxuICAgKiBCYXNlNjQtZW5jb2RlIGFuIGFycmF5IG9mIGJ5dGVzLlxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXQgQW4gYXJyYXkgb2YgYnl0ZXMgKG51bWJlcnMgd2l0aFxuICAgKiAgICAgdmFsdWUgaW4gWzAsIDI1NV0pIHRvIGVuY29kZS5cbiAgICogQHBhcmFtIHdlYlNhZmUgQm9vbGVhbiBpbmRpY2F0aW5nIHdlIHNob3VsZCB1c2UgdGhlXG4gICAqICAgICBhbHRlcm5hdGl2ZSBhbHBoYWJldC5cbiAgICogQHJldHVybiBUaGUgYmFzZTY0IGVuY29kZWQgc3RyaW5nLlxuICAgKi9cbiAgZW5jb2RlQnl0ZUFycmF5KGlucHV0OiBudW1iZXJbXSB8IFVpbnQ4QXJyYXksIHdlYlNhZmU/OiBib29sZWFuKTogc3RyaW5nIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICB0aHJvdyBFcnJvcignZW5jb2RlQnl0ZUFycmF5IHRha2VzIGFuIGFycmF5IGFzIGEgcGFyYW1ldGVyJyk7XG4gICAgfVxuXG4gICAgdGhpcy5pbml0XygpO1xuXG4gICAgY29uc3QgYnl0ZVRvQ2hhck1hcCA9IHdlYlNhZmVcbiAgICAgID8gdGhpcy5ieXRlVG9DaGFyTWFwV2ViU2FmZV8hXG4gICAgICA6IHRoaXMuYnl0ZVRvQ2hhck1hcF8hO1xuXG4gICAgY29uc3Qgb3V0cHV0ID0gW107XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSArPSAzKSB7XG4gICAgICBjb25zdCBieXRlMSA9IGlucHV0W2ldO1xuICAgICAgY29uc3QgaGF2ZUJ5dGUyID0gaSArIDEgPCBpbnB1dC5sZW5ndGg7XG4gICAgICBjb25zdCBieXRlMiA9IGhhdmVCeXRlMiA/IGlucHV0W2kgKyAxXSA6IDA7XG4gICAgICBjb25zdCBoYXZlQnl0ZTMgPSBpICsgMiA8IGlucHV0Lmxlbmd0aDtcbiAgICAgIGNvbnN0IGJ5dGUzID0gaGF2ZUJ5dGUzID8gaW5wdXRbaSArIDJdIDogMDtcblxuICAgICAgY29uc3Qgb3V0Qnl0ZTEgPSBieXRlMSA+PiAyO1xuICAgICAgY29uc3Qgb3V0Qnl0ZTIgPSAoKGJ5dGUxICYgMHgwMykgPDwgNCkgfCAoYnl0ZTIgPj4gNCk7XG4gICAgICBsZXQgb3V0Qnl0ZTMgPSAoKGJ5dGUyICYgMHgwZikgPDwgMikgfCAoYnl0ZTMgPj4gNik7XG4gICAgICBsZXQgb3V0Qnl0ZTQgPSBieXRlMyAmIDB4M2Y7XG5cbiAgICAgIGlmICghaGF2ZUJ5dGUzKSB7XG4gICAgICAgIG91dEJ5dGU0ID0gNjQ7XG5cbiAgICAgICAgaWYgKCFoYXZlQnl0ZTIpIHtcbiAgICAgICAgICBvdXRCeXRlMyA9IDY0O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG91dHB1dC5wdXNoKFxuICAgICAgICBieXRlVG9DaGFyTWFwW291dEJ5dGUxXSxcbiAgICAgICAgYnl0ZVRvQ2hhck1hcFtvdXRCeXRlMl0sXG4gICAgICAgIGJ5dGVUb0NoYXJNYXBbb3V0Qnl0ZTNdLFxuICAgICAgICBieXRlVG9DaGFyTWFwW291dEJ5dGU0XVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0cHV0LmpvaW4oJycpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBCYXNlNjQtZW5jb2RlIGEgc3RyaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXQgQSBzdHJpbmcgdG8gZW5jb2RlLlxuICAgKiBAcGFyYW0gd2ViU2FmZSBJZiB0cnVlLCB3ZSBzaG91bGQgdXNlIHRoZVxuICAgKiAgICAgYWx0ZXJuYXRpdmUgYWxwaGFiZXQuXG4gICAqIEByZXR1cm4gVGhlIGJhc2U2NCBlbmNvZGVkIHN0cmluZy5cbiAgICovXG4gIGVuY29kZVN0cmluZyhpbnB1dDogc3RyaW5nLCB3ZWJTYWZlPzogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgLy8gU2hvcnRjdXQgZm9yIE1vemlsbGEgYnJvd3NlcnMgdGhhdCBpbXBsZW1lbnRcbiAgICAvLyBhIG5hdGl2ZSBiYXNlNjQgZW5jb2RlciBpbiB0aGUgZm9ybSBvZiBcImJ0b2EvYXRvYlwiXG4gICAgaWYgKHRoaXMuSEFTX05BVElWRV9TVVBQT1JUICYmICF3ZWJTYWZlKSB7XG4gICAgICByZXR1cm4gYnRvYShpbnB1dCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmVuY29kZUJ5dGVBcnJheShzdHJpbmdUb0J5dGVBcnJheShpbnB1dCksIHdlYlNhZmUpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBCYXNlNjQtZGVjb2RlIGEgc3RyaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXQgdG8gZGVjb2RlLlxuICAgKiBAcGFyYW0gd2ViU2FmZSBUcnVlIGlmIHdlIHNob3VsZCB1c2UgdGhlXG4gICAqICAgICBhbHRlcm5hdGl2ZSBhbHBoYWJldC5cbiAgICogQHJldHVybiBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBkZWNvZGVkIHZhbHVlLlxuICAgKi9cbiAgZGVjb2RlU3RyaW5nKGlucHV0OiBzdHJpbmcsIHdlYlNhZmU6IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIC8vIFNob3J0Y3V0IGZvciBNb3ppbGxhIGJyb3dzZXJzIHRoYXQgaW1wbGVtZW50XG4gICAgLy8gYSBuYXRpdmUgYmFzZTY0IGVuY29kZXIgaW4gdGhlIGZvcm0gb2YgXCJidG9hL2F0b2JcIlxuICAgIGlmICh0aGlzLkhBU19OQVRJVkVfU1VQUE9SVCAmJiAhd2ViU2FmZSkge1xuICAgICAgcmV0dXJuIGF0b2IoaW5wdXQpO1xuICAgIH1cbiAgICByZXR1cm4gYnl0ZUFycmF5VG9TdHJpbmcodGhpcy5kZWNvZGVTdHJpbmdUb0J5dGVBcnJheShpbnB1dCwgd2ViU2FmZSkpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBCYXNlNjQtZGVjb2RlIGEgc3RyaW5nLlxuICAgKlxuICAgKiBJbiBiYXNlLTY0IGRlY29kaW5nLCBncm91cHMgb2YgZm91ciBjaGFyYWN0ZXJzIGFyZSBjb252ZXJ0ZWQgaW50byB0aHJlZVxuICAgKiBieXRlcy4gIElmIHRoZSBlbmNvZGVyIGRpZCBub3QgYXBwbHkgcGFkZGluZywgdGhlIGlucHV0IGxlbmd0aCBtYXkgbm90XG4gICAqIGJlIGEgbXVsdGlwbGUgb2YgNC5cbiAgICpcbiAgICogSW4gdGhpcyBjYXNlLCB0aGUgbGFzdCBncm91cCB3aWxsIGhhdmUgZmV3ZXIgdGhhbiA0IGNoYXJhY3RlcnMsIGFuZFxuICAgKiBwYWRkaW5nIHdpbGwgYmUgaW5mZXJyZWQuICBJZiB0aGUgZ3JvdXAgaGFzIG9uZSBvciB0d28gY2hhcmFjdGVycywgaXQgZGVjb2Rlc1xuICAgKiB0byBvbmUgYnl0ZS4gIElmIHRoZSBncm91cCBoYXMgdGhyZWUgY2hhcmFjdGVycywgaXQgZGVjb2RlcyB0byB0d28gYnl0ZXMuXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dCBJbnB1dCB0byBkZWNvZGUuXG4gICAqIEBwYXJhbSB3ZWJTYWZlIFRydWUgaWYgd2Ugc2hvdWxkIHVzZSB0aGUgd2ViLXNhZmUgYWxwaGFiZXQuXG4gICAqIEByZXR1cm4gYnl0ZXMgcmVwcmVzZW50aW5nIHRoZSBkZWNvZGVkIHZhbHVlLlxuICAgKi9cbiAgZGVjb2RlU3RyaW5nVG9CeXRlQXJyYXkoaW5wdXQ6IHN0cmluZywgd2ViU2FmZTogYm9vbGVhbik6IG51bWJlcltdIHtcbiAgICB0aGlzLmluaXRfKCk7XG5cbiAgICBjb25zdCBjaGFyVG9CeXRlTWFwID0gd2ViU2FmZVxuICAgICAgPyB0aGlzLmNoYXJUb0J5dGVNYXBXZWJTYWZlXyFcbiAgICAgIDogdGhpcy5jaGFyVG9CeXRlTWFwXyE7XG5cbiAgICBjb25zdCBvdXRwdXQ6IG51bWJlcltdID0gW107XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgKSB7XG4gICAgICBjb25zdCBieXRlMSA9IGNoYXJUb0J5dGVNYXBbaW5wdXQuY2hhckF0KGkrKyldO1xuXG4gICAgICBjb25zdCBoYXZlQnl0ZTIgPSBpIDwgaW5wdXQubGVuZ3RoO1xuICAgICAgY29uc3QgYnl0ZTIgPSBoYXZlQnl0ZTIgPyBjaGFyVG9CeXRlTWFwW2lucHV0LmNoYXJBdChpKV0gOiAwO1xuICAgICAgKytpO1xuXG4gICAgICBjb25zdCBoYXZlQnl0ZTMgPSBpIDwgaW5wdXQubGVuZ3RoO1xuICAgICAgY29uc3QgYnl0ZTMgPSBoYXZlQnl0ZTMgPyBjaGFyVG9CeXRlTWFwW2lucHV0LmNoYXJBdChpKV0gOiA2NDtcbiAgICAgICsraTtcblxuICAgICAgY29uc3QgaGF2ZUJ5dGU0ID0gaSA8IGlucHV0Lmxlbmd0aDtcbiAgICAgIGNvbnN0IGJ5dGU0ID0gaGF2ZUJ5dGU0ID8gY2hhclRvQnl0ZU1hcFtpbnB1dC5jaGFyQXQoaSldIDogNjQ7XG4gICAgICArK2k7XG5cbiAgICAgIGlmIChieXRlMSA9PSBudWxsIHx8IGJ5dGUyID09IG51bGwgfHwgYnl0ZTMgPT0gbnVsbCB8fCBieXRlNCA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBEZWNvZGVCYXNlNjRTdHJpbmdFcnJvcigpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvdXRCeXRlMSA9IChieXRlMSA8PCAyKSB8IChieXRlMiA+PiA0KTtcbiAgICAgIG91dHB1dC5wdXNoKG91dEJ5dGUxKTtcblxuICAgICAgaWYgKGJ5dGUzICE9PSA2NCkge1xuICAgICAgICBjb25zdCBvdXRCeXRlMiA9ICgoYnl0ZTIgPDwgNCkgJiAweGYwKSB8IChieXRlMyA+PiAyKTtcbiAgICAgICAgb3V0cHV0LnB1c2gob3V0Qnl0ZTIpO1xuXG4gICAgICAgIGlmIChieXRlNCAhPT0gNjQpIHtcbiAgICAgICAgICBjb25zdCBvdXRCeXRlMyA9ICgoYnl0ZTMgPDwgNikgJiAweGMwKSB8IGJ5dGU0O1xuICAgICAgICAgIG91dHB1dC5wdXNoKG91dEJ5dGUzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH0sXG5cbiAgLyoqXG4gICAqIExhenkgc3RhdGljIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uLiBDYWxsZWQgYmVmb3JlXG4gICAqIGFjY2Vzc2luZyBhbnkgb2YgdGhlIHN0YXRpYyBtYXAgdmFyaWFibGVzLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgaW5pdF8oKSB7XG4gICAgaWYgKCF0aGlzLmJ5dGVUb0NoYXJNYXBfKSB7XG4gICAgICB0aGlzLmJ5dGVUb0NoYXJNYXBfID0ge307XG4gICAgICB0aGlzLmNoYXJUb0J5dGVNYXBfID0ge307XG4gICAgICB0aGlzLmJ5dGVUb0NoYXJNYXBXZWJTYWZlXyA9IHt9O1xuICAgICAgdGhpcy5jaGFyVG9CeXRlTWFwV2ViU2FmZV8gPSB7fTtcblxuICAgICAgLy8gV2Ugd2FudCBxdWljayBtYXBwaW5ncyBiYWNrIGFuZCBmb3J0aCwgc28gd2UgcHJlY29tcHV0ZSB0d28gbWFwcy5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5FTkNPREVEX1ZBTFMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5ieXRlVG9DaGFyTWFwX1tpXSA9IHRoaXMuRU5DT0RFRF9WQUxTLmNoYXJBdChpKTtcbiAgICAgICAgdGhpcy5jaGFyVG9CeXRlTWFwX1t0aGlzLmJ5dGVUb0NoYXJNYXBfW2ldXSA9IGk7XG4gICAgICAgIHRoaXMuYnl0ZVRvQ2hhck1hcFdlYlNhZmVfW2ldID0gdGhpcy5FTkNPREVEX1ZBTFNfV0VCU0FGRS5jaGFyQXQoaSk7XG4gICAgICAgIHRoaXMuY2hhclRvQnl0ZU1hcFdlYlNhZmVfW3RoaXMuYnl0ZVRvQ2hhck1hcFdlYlNhZmVfW2ldXSA9IGk7XG5cbiAgICAgICAgLy8gQmUgZm9yZ2l2aW5nIHdoZW4gZGVjb2RpbmcgYW5kIGNvcnJlY3RseSBkZWNvZGUgYm90aCBlbmNvZGluZ3MuXG4gICAgICAgIGlmIChpID49IHRoaXMuRU5DT0RFRF9WQUxTX0JBU0UubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5jaGFyVG9CeXRlTWFwX1t0aGlzLkVOQ09ERURfVkFMU19XRUJTQUZFLmNoYXJBdChpKV0gPSBpO1xuICAgICAgICAgIHRoaXMuY2hhclRvQnl0ZU1hcFdlYlNhZmVfW3RoaXMuRU5DT0RFRF9WQUxTLmNoYXJBdChpKV0gPSBpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEFuIGVycm9yIGVuY291bnRlcmVkIHdoaWxlIGRlY29kaW5nIGJhc2U2NCBzdHJpbmcuXG4gKi9cbmV4cG9ydCBjbGFzcyBEZWNvZGVCYXNlNjRTdHJpbmdFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcmVhZG9ubHkgbmFtZSA9ICdEZWNvZGVCYXNlNjRTdHJpbmdFcnJvcic7XG59XG5cbi8qKlxuICogVVJMLXNhZmUgYmFzZTY0IGVuY29kaW5nXG4gKi9cbmV4cG9ydCBjb25zdCBiYXNlNjRFbmNvZGUgPSBmdW5jdGlvbiAoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB1dGY4Qnl0ZXMgPSBzdHJpbmdUb0J5dGVBcnJheShzdHIpO1xuICByZXR1cm4gYmFzZTY0LmVuY29kZUJ5dGVBcnJheSh1dGY4Qnl0ZXMsIHRydWUpO1xufTtcblxuLyoqXG4gKiBVUkwtc2FmZSBiYXNlNjQgZW5jb2RpbmcgKHdpdGhvdXQgXCIuXCIgcGFkZGluZyBpbiB0aGUgZW5kKS5cbiAqIGUuZy4gVXNlZCBpbiBKU09OIFdlYiBUb2tlbiAoSldUKSBwYXJ0cy5cbiAqL1xuZXhwb3J0IGNvbnN0IGJhc2U2NHVybEVuY29kZVdpdGhvdXRQYWRkaW5nID0gZnVuY3Rpb24gKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gVXNlIGJhc2U2NHVybCBlbmNvZGluZyBhbmQgcmVtb3ZlIHBhZGRpbmcgaW4gdGhlIGVuZCAoZG90IGNoYXJhY3RlcnMpLlxuICByZXR1cm4gYmFzZTY0RW5jb2RlKHN0cikucmVwbGFjZSgvXFwuL2csICcnKTtcbn07XG5cbi8qKlxuICogVVJMLXNhZmUgYmFzZTY0IGRlY29kaW5nXG4gKlxuICogTk9URTogRE8gTk9UIHVzZSB0aGUgZ2xvYmFsIGF0b2IoKSBmdW5jdGlvbiAtIGl0IGRvZXMgTk9UIHN1cHBvcnQgdGhlXG4gKiBiYXNlNjRVcmwgdmFyaWFudCBlbmNvZGluZy5cbiAqXG4gKiBAcGFyYW0gc3RyIFRvIGJlIGRlY29kZWRcbiAqIEByZXR1cm4gRGVjb2RlZCByZXN1bHQsIGlmIHBvc3NpYmxlXG4gKi9cbmV4cG9ydCBjb25zdCBiYXNlNjREZWNvZGUgPSBmdW5jdGlvbiAoc3RyOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYmFzZTY0LmRlY29kZVN0cmluZyhzdHIsIHRydWUpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5lcnJvcignYmFzZTY0RGVjb2RlIGZhaWxlZDogJywgZSk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8qKlxuICogRG8gYSBkZWVwLWNvcHkgb2YgYmFzaWMgSmF2YVNjcmlwdCBPYmplY3RzIG9yIEFycmF5cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZXBDb3B5PFQ+KHZhbHVlOiBUKTogVCB7XG4gIHJldHVybiBkZWVwRXh0ZW5kKHVuZGVmaW5lZCwgdmFsdWUpIGFzIFQ7XG59XG5cbi8qKlxuICogQ29weSBwcm9wZXJ0aWVzIGZyb20gc291cmNlIHRvIHRhcmdldCAocmVjdXJzaXZlbHkgYWxsb3dzIGV4dGVuc2lvblxuICogb2YgT2JqZWN0cyBhbmQgQXJyYXlzKS4gIFNjYWxhciB2YWx1ZXMgaW4gdGhlIHRhcmdldCBhcmUgb3Zlci13cml0dGVuLlxuICogSWYgdGFyZ2V0IGlzIHVuZGVmaW5lZCwgYW4gb2JqZWN0IG9mIHRoZSBhcHByb3ByaWF0ZSB0eXBlIHdpbGwgYmUgY3JlYXRlZFxuICogKGFuZCByZXR1cm5lZCkuXG4gKlxuICogV2UgcmVjdXJzaXZlbHkgY29weSBhbGwgY2hpbGQgcHJvcGVydGllcyBvZiBwbGFpbiBPYmplY3RzIGluIHRoZSBzb3VyY2UtIHNvXG4gKiB0aGF0IG5hbWVzcGFjZS0gbGlrZSBkaWN0aW9uYXJpZXMgYXJlIG1lcmdlZC5cbiAqXG4gKiBOb3RlIHRoYXQgdGhlIHRhcmdldCBjYW4gYmUgYSBmdW5jdGlvbiwgaW4gd2hpY2ggY2FzZSB0aGUgcHJvcGVydGllcyBpblxuICogdGhlIHNvdXJjZSBPYmplY3QgYXJlIGNvcGllZCBvbnRvIGl0IGFzIHN0YXRpYyBwcm9wZXJ0aWVzIG9mIHRoZSBGdW5jdGlvbi5cbiAqXG4gKiBOb3RlOiB3ZSBkb24ndCBtZXJnZSBfX3Byb3RvX18gdG8gcHJldmVudCBwcm90b3R5cGUgcG9sbHV0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWVwRXh0ZW5kKHRhcmdldDogdW5rbm93biwgc291cmNlOiB1bmtub3duKTogdW5rbm93biB7XG4gIGlmICghKHNvdXJjZSBpbnN0YW5jZW9mIE9iamVjdCkpIHtcbiAgICByZXR1cm4gc291cmNlO1xuICB9XG5cbiAgc3dpdGNoIChzb3VyY2UuY29uc3RydWN0b3IpIHtcbiAgICBjYXNlIERhdGU6XG4gICAgICAvLyBUcmVhdCBEYXRlcyBsaWtlIHNjYWxhcnM7IGlmIHRoZSB0YXJnZXQgZGF0ZSBvYmplY3QgaGFkIGFueSBjaGlsZFxuICAgICAgLy8gcHJvcGVydGllcyAtIHRoZXkgd2lsbCBiZSBsb3N0IVxuICAgICAgY29uc3QgZGF0ZVZhbHVlID0gc291cmNlIGFzIERhdGU7XG4gICAgICByZXR1cm4gbmV3IERhdGUoZGF0ZVZhbHVlLmdldFRpbWUoKSk7XG5cbiAgICBjYXNlIE9iamVjdDpcbiAgICAgIGlmICh0YXJnZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0YXJnZXQgPSB7fTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgQXJyYXk6XG4gICAgICAvLyBBbHdheXMgY29weSB0aGUgYXJyYXkgc291cmNlIGFuZCBvdmVyd3JpdGUgdGhlIHRhcmdldC5cbiAgICAgIHRhcmdldCA9IFtdO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgLy8gTm90IGEgcGxhaW4gT2JqZWN0IC0gdHJlYXQgaXQgYXMgYSBzY2FsYXIuXG4gICAgICByZXR1cm4gc291cmNlO1xuICB9XG5cbiAgZm9yIChjb25zdCBwcm9wIGluIHNvdXJjZSkge1xuICAgIC8vIHVzZSBpc1ZhbGlkS2V5IHRvIGd1YXJkIGFnYWluc3QgcHJvdG90eXBlIHBvbGx1dGlvbi4gU2VlIGh0dHBzOi8vc255ay5pby92dWxuL1NOWUstSlMtTE9EQVNILTQ1MDIwMlxuICAgIGlmICghc291cmNlLmhhc093blByb3BlcnR5KHByb3ApIHx8ICFpc1ZhbGlkS2V5KHByb3ApKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgKHRhcmdldCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbcHJvcF0gPSBkZWVwRXh0ZW5kKFxuICAgICAgKHRhcmdldCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbcHJvcF0sXG4gICAgICAoc291cmNlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtwcm9wXVxuICAgICk7XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5mdW5jdGlvbiBpc1ZhbGlkS2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBrZXkgIT09ICdfX3Byb3RvX18nO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8qKlxuICogUG9seWZpbGwgZm9yIGBnbG9iYWxUaGlzYCBvYmplY3QuXG4gKiBAcmV0dXJucyB0aGUgYGdsb2JhbFRoaXNgIG9iamVjdCBmb3IgdGhlIGdpdmVuIGVudmlyb25tZW50LlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2xvYmFsKCk6IHR5cGVvZiBnbG9iYWxUaGlzIHtcbiAgaWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBzZWxmO1xuICB9XG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiB3aW5kb3c7XG4gIH1cbiAgaWYgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGdsb2JhbDtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBsb2NhdGUgZ2xvYmFsIG9iamVjdC4nKTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBiYXNlNjREZWNvZGUgfSBmcm9tICcuL2NyeXB0JztcbmltcG9ydCB7IGdldEdsb2JhbCB9IGZyb20gJy4vZ2xvYmFsJztcblxuLyoqXG4gKiBLZXlzIGZvciBleHBlcmltZW50YWwgcHJvcGVydGllcyBvbiB0aGUgYEZpcmViYXNlRGVmYXVsdHNgIG9iamVjdC5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHR5cGUgRXhwZXJpbWVudGFsS2V5ID0gJ2F1dGhUb2tlblN5bmNVUkwnIHwgJ2F1dGhJZFRva2VuTWF4QWdlJztcblxuLyoqXG4gKiBBbiBvYmplY3QgdGhhdCBjYW4gYmUgaW5qZWN0ZWQgaW50byB0aGUgZW52aXJvbm1lbnQgYXMgX19GSVJFQkFTRV9ERUZBVUxUU19fLFxuICogZWl0aGVyIGFzIGEgcHJvcGVydHkgb2YgZ2xvYmFsVGhpcywgYSBzaGVsbCBlbnZpcm9ubWVudCB2YXJpYWJsZSwgb3IgYVxuICogY29va2llLlxuICpcbiAqIFRoaXMgb2JqZWN0IGNhbiBiZSB1c2VkIHRvIGF1dG9tYXRpY2FsbHkgY29uZmlndXJlIGFuZCBpbml0aWFsaXplXG4gKiBhIEZpcmViYXNlIGFwcCBhcyB3ZWxsIGFzIGFueSBlbXVsYXRvcnMuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpcmViYXNlRGVmYXVsdHMge1xuICBjb25maWc/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBlbXVsYXRvckhvc3RzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgX2F1dGhUb2tlblN5bmNVUkw/OiBzdHJpbmc7XG4gIF9hdXRoSWRUb2tlbk1heEFnZT86IG51bWJlcjtcbiAgLyoqXG4gICAqIE92ZXJyaWRlIEZpcmViYXNlJ3MgcnVudGltZSBlbnZpcm9ubWVudCBkZXRlY3Rpb24gYW5kXG4gICAqIGZvcmNlIHRoZSBTREsgdG8gYWN0IGFzIGlmIGl0IHdlcmUgaW4gdGhlIHNwZWNpZmllZCBlbnZpcm9ubWVudC5cbiAgICovXG4gIGZvcmNlRW52aXJvbm1lbnQ/OiAnYnJvd3NlcicgfCAnbm9kZSc7XG4gIFtrZXk6IHN0cmluZ106IHVua25vd247XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgLy8gTmVlZCBgdmFyYCBmb3IgdGhpcyB0byB3b3JrLlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdmFyXG4gIHZhciBfX0ZJUkVCQVNFX0RFRkFVTFRTX186IEZpcmViYXNlRGVmYXVsdHMgfCB1bmRlZmluZWQ7XG59XG5cbmNvbnN0IGdldERlZmF1bHRzRnJvbUdsb2JhbCA9ICgpOiBGaXJlYmFzZURlZmF1bHRzIHwgdW5kZWZpbmVkID0+XG4gIGdldEdsb2JhbCgpLl9fRklSRUJBU0VfREVGQVVMVFNfXztcblxuLyoqXG4gKiBBdHRlbXB0IHRvIHJlYWQgZGVmYXVsdHMgZnJvbSBhIEpTT04gc3RyaW5nIHByb3ZpZGVkIHRvXG4gKiBwcm9jZXNzKC4pZW52KC4pX19GSVJFQkFTRV9ERUZBVUxUU19fIG9yIGEgSlNPTiBmaWxlIHdob3NlIHBhdGggaXMgaW5cbiAqIHByb2Nlc3MoLillbnYoLilfX0ZJUkVCQVNFX0RFRkFVTFRTX1BBVEhfX1xuICogVGhlIGRvdHMgYXJlIGluIHBhcmVucyBiZWNhdXNlIGNlcnRhaW4gY29tcGlsZXJzIChWaXRlPykgY2Fubm90XG4gKiBoYW5kbGUgc2VlaW5nIHRoYXQgdmFyaWFibGUgaW4gY29tbWVudHMuXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZpcmViYXNlL2ZpcmViYXNlLWpzLXNkay9pc3N1ZXMvNjgzOFxuICovXG5jb25zdCBnZXREZWZhdWx0c0Zyb21FbnZWYXJpYWJsZSA9ICgpOiBGaXJlYmFzZURlZmF1bHRzIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKHR5cGVvZiBwcm9jZXNzID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YgcHJvY2Vzcy5lbnYgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGRlZmF1bHRzSnNvblN0cmluZyA9IHByb2Nlc3MuZW52Ll9fRklSRUJBU0VfREVGQVVMVFNfXztcbiAgaWYgKGRlZmF1bHRzSnNvblN0cmluZykge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGRlZmF1bHRzSnNvblN0cmluZyk7XG4gIH1cbn07XG5cbmNvbnN0IGdldERlZmF1bHRzRnJvbUNvb2tpZSA9ICgpOiBGaXJlYmFzZURlZmF1bHRzIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgbGV0IG1hdGNoO1xuICB0cnkge1xuICAgIG1hdGNoID0gZG9jdW1lbnQuY29va2llLm1hdGNoKC9fX0ZJUkVCQVNFX0RFRkFVTFRTX189KFteO10rKS8pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gU29tZSBlbnZpcm9ubWVudHMgc3VjaCBhcyBBbmd1bGFyIFVuaXZlcnNhbCBTU1IgaGF2ZSBhXG4gICAgLy8gYGRvY3VtZW50YCBvYmplY3QgYnV0IGVycm9yIG9uIGFjY2Vzc2luZyBgZG9jdW1lbnQuY29va2llYC5cbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgZGVjb2RlZCA9IG1hdGNoICYmIGJhc2U2NERlY29kZShtYXRjaFsxXSk7XG4gIHJldHVybiBkZWNvZGVkICYmIEpTT04ucGFyc2UoZGVjb2RlZCk7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgX19GSVJFQkFTRV9ERUZBVUxUU19fIG9iamVjdC4gSXQgY2hlY2tzIGluIG9yZGVyOlxuICogKDEpIGlmIHN1Y2ggYW4gb2JqZWN0IGV4aXN0cyBhcyBhIHByb3BlcnR5IG9mIGBnbG9iYWxUaGlzYFxuICogKDIpIGlmIHN1Y2ggYW4gb2JqZWN0IHdhcyBwcm92aWRlZCBvbiBhIHNoZWxsIGVudmlyb25tZW50IHZhcmlhYmxlXG4gKiAoMykgaWYgc3VjaCBhbiBvYmplY3QgZXhpc3RzIGluIGEgY29va2llXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBnZXREZWZhdWx0cyA9ICgpOiBGaXJlYmFzZURlZmF1bHRzIHwgdW5kZWZpbmVkID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gKFxuICAgICAgZ2V0RGVmYXVsdHNGcm9tR2xvYmFsKCkgfHxcbiAgICAgIGdldERlZmF1bHRzRnJvbUVudlZhcmlhYmxlKCkgfHxcbiAgICAgIGdldERlZmF1bHRzRnJvbUNvb2tpZSgpXG4gICAgKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8qKlxuICAgICAqIENhdGNoLWFsbCBmb3IgYmVpbmcgdW5hYmxlIHRvIGdldCBfX0ZJUkVCQVNFX0RFRkFVTFRTX18gZHVlXG4gICAgICogdG8gYW55IGVudmlyb25tZW50IGNhc2Ugd2UgaGF2ZSBub3QgYWNjb3VudGVkIGZvci4gTG9nIHRvXG4gICAgICogaW5mbyBpbnN0ZWFkIG9mIHN3YWxsb3dpbmcgc28gd2UgY2FuIGZpbmQgdGhlc2UgdW5rbm93biBjYXNlc1xuICAgICAqIGFuZCBhZGQgcGF0aHMgZm9yIHRoZW0gaWYgbmVlZGVkLlxuICAgICAqL1xuICAgIGNvbnNvbGUuaW5mbyhgVW5hYmxlIHRvIGdldCBfX0ZJUkVCQVNFX0RFRkFVTFRTX18gZHVlIHRvOiAke2V9YCk7XG4gICAgcmV0dXJuO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHVybnMgZW11bGF0b3IgaG9zdCBzdG9yZWQgaW4gdGhlIF9fRklSRUJBU0VfREVGQVVMVFNfXyBvYmplY3RcbiAqIGZvciB0aGUgZ2l2ZW4gcHJvZHVjdC5cbiAqIEByZXR1cm5zIGEgVVJMIGhvc3QgZm9ybWF0dGVkIGxpa2UgYDEyNy4wLjAuMTo5OTk5YCBvciBgWzo6MV06NDAwMGAgaWYgYXZhaWxhYmxlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBnZXREZWZhdWx0RW11bGF0b3JIb3N0ID0gKFxuICBwcm9kdWN0TmFtZTogc3RyaW5nXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4gZ2V0RGVmYXVsdHMoKT8uZW11bGF0b3JIb3N0cz8uW3Byb2R1Y3ROYW1lXTtcblxuLyoqXG4gKiBSZXR1cm5zIGVtdWxhdG9yIGhvc3RuYW1lIGFuZCBwb3J0IHN0b3JlZCBpbiB0aGUgX19GSVJFQkFTRV9ERUZBVUxUU19fIG9iamVjdFxuICogZm9yIHRoZSBnaXZlbiBwcm9kdWN0LlxuICogQHJldHVybnMgYSBwYWlyIG9mIGhvc3RuYW1lIGFuZCBwb3J0IGxpa2UgYFtcIjo6MVwiLCA0MDAwXWAgaWYgYXZhaWxhYmxlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBnZXREZWZhdWx0RW11bGF0b3JIb3N0bmFtZUFuZFBvcnQgPSAoXG4gIHByb2R1Y3ROYW1lOiBzdHJpbmdcbik6IFtob3N0bmFtZTogc3RyaW5nLCBwb3J0OiBudW1iZXJdIHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgaG9zdCA9IGdldERlZmF1bHRFbXVsYXRvckhvc3QocHJvZHVjdE5hbWUpO1xuICBpZiAoIWhvc3QpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IHNlcGFyYXRvckluZGV4ID0gaG9zdC5sYXN0SW5kZXhPZignOicpOyAvLyBGaW5kaW5nIHRoZSBsYXN0IHNpbmNlIElQdjYgYWRkciBhbHNvIGhhcyBjb2xvbnMuXG4gIGlmIChzZXBhcmF0b3JJbmRleCA8PSAwIHx8IHNlcGFyYXRvckluZGV4ICsgMSA9PT0gaG9zdC5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaG9zdCAke2hvc3R9IHdpdGggbm8gc2VwYXJhdGUgaG9zdG5hbWUgYW5kIHBvcnQhYCk7XG4gIH1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtZ2xvYmFsc1xuICBjb25zdCBwb3J0ID0gcGFyc2VJbnQoaG9zdC5zdWJzdHJpbmcoc2VwYXJhdG9ySW5kZXggKyAxKSwgMTApO1xuICBpZiAoaG9zdFswXSA9PT0gJ1snKSB7XG4gICAgLy8gQnJhY2tldC1xdW90ZWQgYFtpcHY2YWRkcl06cG9ydGAgPT4gcmV0dXJuIFwiaXB2NmFkZHJcIiAod2l0aG91dCBicmFja2V0cykuXG4gICAgcmV0dXJuIFtob3N0LnN1YnN0cmluZygxLCBzZXBhcmF0b3JJbmRleCAtIDEpLCBwb3J0XTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gW2hvc3Quc3Vic3RyaW5nKDAsIHNlcGFyYXRvckluZGV4KSwgcG9ydF07XG4gIH1cbn07XG5cbi8qKlxuICogUmV0dXJucyBGaXJlYmFzZSBhcHAgY29uZmlnIHN0b3JlZCBpbiB0aGUgX19GSVJFQkFTRV9ERUZBVUxUU19fIG9iamVjdC5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGdldERlZmF1bHRBcHBDb25maWcgPSAoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZCA9PlxuICBnZXREZWZhdWx0cygpPy5jb25maWc7XG5cbi8qKlxuICogUmV0dXJucyBhbiBleHBlcmltZW50YWwgc2V0dGluZyBvbiB0aGUgX19GSVJFQkFTRV9ERUZBVUxUU19fIG9iamVjdCAocHJvcGVydGllc1xuICogcHJlZml4ZWQgYnkgXCJfXCIpXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFeHBlcmltZW50YWxTZXR0aW5nID0gPFQgZXh0ZW5kcyBFeHBlcmltZW50YWxLZXk+KFxuICBuYW1lOiBUXG4pOiBGaXJlYmFzZURlZmF1bHRzW2BfJHtUfWBdID0+XG4gIGdldERlZmF1bHRzKCk/LltgXyR7bmFtZX1gXSBhcyBGaXJlYmFzZURlZmF1bHRzW2BfJHtUfWBdO1xuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmV4cG9ydCBjbGFzcyBEZWZlcnJlZDxSPiB7XG4gIHByb21pc2U6IFByb21pc2U8Uj47XG4gIHJlamVjdDogKHZhbHVlPzogdW5rbm93bikgPT4gdm9pZCA9ICgpID0+IHt9O1xuICByZXNvbHZlOiAodmFsdWU/OiB1bmtub3duKSA9PiB2b2lkID0gKCkgPT4ge307XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMucHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMucmVzb2x2ZSA9IHJlc29sdmUgYXMgKHZhbHVlPzogdW5rbm93bikgPT4gdm9pZDtcbiAgICAgIHRoaXMucmVqZWN0ID0gcmVqZWN0IGFzICh2YWx1ZT86IHVua25vd24pID0+IHZvaWQ7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogT3VyIEFQSSBpbnRlcm5hbHMgYXJlIG5vdCBwcm9taXNlaWZpZWQgYW5kIGNhbm5vdCBiZWNhdXNlIG91ciBjYWxsYmFjayBBUElzIGhhdmUgc3VidGxlIGV4cGVjdGF0aW9ucyBhcm91bmRcbiAgICogaW52b2tpbmcgcHJvbWlzZXMgaW5saW5lLCB3aGljaCBQcm9taXNlcyBhcmUgZm9yYmlkZGVuIHRvIGRvLiBUaGlzIG1ldGhvZCBhY2NlcHRzIGFuIG9wdGlvbmFsIG5vZGUtc3R5bGUgY2FsbGJhY2tcbiAgICogYW5kIHJldHVybnMgYSBub2RlLXN0eWxlIGNhbGxiYWNrIHdoaWNoIHdpbGwgcmVzb2x2ZSBvciByZWplY3QgdGhlIERlZmVycmVkJ3MgcHJvbWlzZS5cbiAgICovXG4gIHdyYXBDYWxsYmFjayhcbiAgICBjYWxsYmFjaz86IChlcnJvcj86IHVua25vd24sIHZhbHVlPzogdW5rbm93bikgPT4gdm9pZFxuICApOiAoZXJyb3I6IHVua25vd24sIHZhbHVlPzogdW5rbm93bikgPT4gdm9pZCB7XG4gICAgcmV0dXJuIChlcnJvciwgdmFsdWU/KSA9PiB7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5yZWplY3QoZXJyb3IpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZXNvbHZlKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gQXR0YWNoaW5nIG5vb3AgaGFuZGxlciBqdXN0IGluIGNhc2UgZGV2ZWxvcGVyIHdhc24ndCBleHBlY3RpbmdcbiAgICAgICAgLy8gcHJvbWlzZXNcbiAgICAgICAgdGhpcy5wcm9taXNlLmNhdGNoKCgpID0+IHt9KTtcblxuICAgICAgICAvLyBTb21lIG9mIG91ciBjYWxsYmFja3MgZG9uJ3QgZXhwZWN0IGEgdmFsdWUgYW5kIG91ciBvd24gdGVzdHNcbiAgICAgICAgLy8gYXNzZXJ0IHRoYXQgdGhlIHBhcmFtZXRlciBsZW5ndGggaXMgMVxuICAgICAgICBpZiAoY2FsbGJhY2subGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgY2FsbGJhY2soZXJyb3IpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhbGxiYWNrKGVycm9yLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgYmFzZTY0dXJsRW5jb2RlV2l0aG91dFBhZGRpbmcgfSBmcm9tICcuL2NyeXB0JztcblxuLy8gRmlyZWJhc2UgQXV0aCB0b2tlbnMgY29udGFpbiBzbmFrZV9jYXNlIGNsYWltcyBmb2xsb3dpbmcgdGhlIEpXVCBzdGFuZGFyZCAvIGNvbnZlbnRpb24uXG4vKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cblxuZXhwb3J0IHR5cGUgRmlyZWJhc2VTaWduSW5Qcm92aWRlciA9XG4gIHwgJ2N1c3RvbSdcbiAgfCAnZW1haWwnXG4gIHwgJ3Bhc3N3b3JkJ1xuICB8ICdwaG9uZSdcbiAgfCAnYW5vbnltb3VzJ1xuICB8ICdnb29nbGUuY29tJ1xuICB8ICdmYWNlYm9vay5jb20nXG4gIHwgJ2dpdGh1Yi5jb20nXG4gIHwgJ3R3aXR0ZXIuY29tJ1xuICB8ICdtaWNyb3NvZnQuY29tJ1xuICB8ICdhcHBsZS5jb20nO1xuXG5pbnRlcmZhY2UgRmlyZWJhc2VJZFRva2VuIHtcbiAgLy8gQWx3YXlzIHNldCB0byBodHRwczovL3NlY3VyZXRva2VuLmdvb2dsZS5jb20vUFJPSkVDVF9JRFxuICBpc3M6IHN0cmluZztcblxuICAvLyBBbHdheXMgc2V0IHRvIFBST0pFQ1RfSURcbiAgYXVkOiBzdHJpbmc7XG5cbiAgLy8gVGhlIHVzZXIncyB1bmlxdWUgSURcbiAgc3ViOiBzdHJpbmc7XG5cbiAgLy8gVGhlIHRva2VuIGlzc3VlIHRpbWUsIGluIHNlY29uZHMgc2luY2UgZXBvY2hcbiAgaWF0OiBudW1iZXI7XG5cbiAgLy8gVGhlIHRva2VuIGV4cGlyeSB0aW1lLCBub3JtYWxseSAnaWF0JyArIDM2MDBcbiAgZXhwOiBudW1iZXI7XG5cbiAgLy8gVGhlIHVzZXIncyB1bmlxdWUgSUQuIE11c3QgYmUgZXF1YWwgdG8gJ3N1YidcbiAgdXNlcl9pZDogc3RyaW5nO1xuXG4gIC8vIFRoZSB0aW1lIHRoZSB1c2VyIGF1dGhlbnRpY2F0ZWQsIG5vcm1hbGx5ICdpYXQnXG4gIGF1dGhfdGltZTogbnVtYmVyO1xuXG4gIC8vIFRoZSBzaWduIGluIHByb3ZpZGVyLCBvbmx5IHNldCB3aGVuIHRoZSBwcm92aWRlciBpcyAnYW5vbnltb3VzJ1xuICBwcm92aWRlcl9pZD86ICdhbm9ueW1vdXMnO1xuXG4gIC8vIFRoZSB1c2VyJ3MgcHJpbWFyeSBlbWFpbFxuICBlbWFpbD86IHN0cmluZztcblxuICAvLyBUaGUgdXNlcidzIGVtYWlsIHZlcmlmaWNhdGlvbiBzdGF0dXNcbiAgZW1haWxfdmVyaWZpZWQ/OiBib29sZWFuO1xuXG4gIC8vIFRoZSB1c2VyJ3MgcHJpbWFyeSBwaG9uZSBudW1iZXJcbiAgcGhvbmVfbnVtYmVyPzogc3RyaW5nO1xuXG4gIC8vIFRoZSB1c2VyJ3MgZGlzcGxheSBuYW1lXG4gIG5hbWU/OiBzdHJpbmc7XG5cbiAgLy8gVGhlIHVzZXIncyBwcm9maWxlIHBob3RvIFVSTFxuICBwaWN0dXJlPzogc3RyaW5nO1xuXG4gIC8vIEluZm9ybWF0aW9uIG9uIGFsbCBpZGVudGl0aWVzIGxpbmtlZCB0byB0aGlzIHVzZXJcbiAgZmlyZWJhc2U6IHtcbiAgICAvLyBUaGUgcHJpbWFyeSBzaWduLWluIHByb3ZpZGVyXG4gICAgc2lnbl9pbl9wcm92aWRlcjogRmlyZWJhc2VTaWduSW5Qcm92aWRlcjtcblxuICAgIC8vIEEgbWFwIG9mIHByb3ZpZGVycyB0byB0aGUgdXNlcidzIGxpc3Qgb2YgdW5pcXVlIGlkZW50aWZpZXJzIGZyb21cbiAgICAvLyBlYWNoIHByb3ZpZGVyXG4gICAgaWRlbnRpdGllcz86IHsgW3Byb3ZpZGVyIGluIEZpcmViYXNlU2lnbkluUHJvdmlkZXJdPzogc3RyaW5nW10gfTtcbiAgfTtcblxuICAvLyBDdXN0b20gY2xhaW1zIHNldCBieSB0aGUgZGV2ZWxvcGVyXG4gIFtjbGFpbTogc3RyaW5nXTogdW5rbm93bjtcblxuICB1aWQ/OiBuZXZlcjsgLy8gVHJ5IHRvIGNhdGNoIGEgY29tbW9uIG1pc3Rha2Ugb2YgXCJ1aWRcIiAoc2hvdWxkIGJlIFwic3ViXCIgaW5zdGVhZCkuXG59XG5cbmV4cG9ydCB0eXBlIEVtdWxhdG9yTW9ja1Rva2VuT3B0aW9ucyA9ICh7IHVzZXJfaWQ6IHN0cmluZyB9IHwgeyBzdWI6IHN0cmluZyB9KSAmXG4gIFBhcnRpYWw8RmlyZWJhc2VJZFRva2VuPjtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1vY2tVc2VyVG9rZW4oXG4gIHRva2VuOiBFbXVsYXRvck1vY2tUb2tlbk9wdGlvbnMsXG4gIHByb2plY3RJZD86IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgaWYgKHRva2VuLnVpZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdUaGUgXCJ1aWRcIiBmaWVsZCBpcyBubyBsb25nZXIgc3VwcG9ydGVkIGJ5IG1vY2tVc2VyVG9rZW4uIFBsZWFzZSB1c2UgXCJzdWJcIiBpbnN0ZWFkIGZvciBGaXJlYmFzZSBBdXRoIFVzZXIgSUQuJ1xuICAgICk7XG4gIH1cbiAgLy8gVW5zZWN1cmVkIEpXVHMgdXNlIFwibm9uZVwiIGFzIHRoZSBhbGdvcml0aG0uXG4gIGNvbnN0IGhlYWRlciA9IHtcbiAgICBhbGc6ICdub25lJyxcbiAgICB0eXBlOiAnSldUJ1xuICB9O1xuXG4gIGNvbnN0IHByb2plY3QgPSBwcm9qZWN0SWQgfHwgJ2RlbW8tcHJvamVjdCc7XG4gIGNvbnN0IGlhdCA9IHRva2VuLmlhdCB8fCAwO1xuICBjb25zdCBzdWIgPSB0b2tlbi5zdWIgfHwgdG9rZW4udXNlcl9pZDtcbiAgaWYgKCFzdWIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJtb2NrVXNlclRva2VuIG11c3QgY29udGFpbiAnc3ViJyBvciAndXNlcl9pZCcgZmllbGQhXCIpO1xuICB9XG5cbiAgY29uc3QgcGF5bG9hZDogRmlyZWJhc2VJZFRva2VuID0ge1xuICAgIC8vIFNldCBhbGwgcmVxdWlyZWQgZmllbGRzIHRvIGRlY2VudCBkZWZhdWx0c1xuICAgIGlzczogYGh0dHBzOi8vc2VjdXJldG9rZW4uZ29vZ2xlLmNvbS8ke3Byb2plY3R9YCxcbiAgICBhdWQ6IHByb2plY3QsXG4gICAgaWF0LFxuICAgIGV4cDogaWF0ICsgMzYwMCxcbiAgICBhdXRoX3RpbWU6IGlhdCxcbiAgICBzdWIsXG4gICAgdXNlcl9pZDogc3ViLFxuICAgIGZpcmViYXNlOiB7XG4gICAgICBzaWduX2luX3Byb3ZpZGVyOiAnY3VzdG9tJyxcbiAgICAgIGlkZW50aXRpZXM6IHt9XG4gICAgfSxcblxuICAgIC8vIE92ZXJyaWRlIHdpdGggdXNlciBvcHRpb25zXG4gICAgLi4udG9rZW5cbiAgfTtcblxuICAvLyBVbnNlY3VyZWQgSldUcyB1c2UgdGhlIGVtcHR5IHN0cmluZyBhcyBhIHNpZ25hdHVyZS5cbiAgY29uc3Qgc2lnbmF0dXJlID0gJyc7XG4gIHJldHVybiBbXG4gICAgYmFzZTY0dXJsRW5jb2RlV2l0aG91dFBhZGRpbmcoSlNPTi5zdHJpbmdpZnkoaGVhZGVyKSksXG4gICAgYmFzZTY0dXJsRW5jb2RlV2l0aG91dFBhZGRpbmcoSlNPTi5zdHJpbmdpZnkocGF5bG9hZCkpLFxuICAgIHNpZ25hdHVyZVxuICBdLmpvaW4oJy4nKTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBDT05TVEFOVFMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBnZXREZWZhdWx0cyB9IGZyb20gJy4vZGVmYXVsdHMnO1xuXG4vKipcbiAqIFJldHVybnMgbmF2aWdhdG9yLnVzZXJBZ2VudCBzdHJpbmcgb3IgJycgaWYgaXQncyBub3QgZGVmaW5lZC5cbiAqIEByZXR1cm4gdXNlciBhZ2VudCBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFVBKCk6IHN0cmluZyB7XG4gIGlmIChcbiAgICB0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIHR5cGVvZiBuYXZpZ2F0b3JbJ3VzZXJBZ2VudCddID09PSAnc3RyaW5nJ1xuICApIHtcbiAgICByZXR1cm4gbmF2aWdhdG9yWyd1c2VyQWdlbnQnXTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbn1cblxuLyoqXG4gKiBEZXRlY3QgQ29yZG92YSAvIFBob25lR2FwIC8gSW9uaWMgZnJhbWV3b3JrcyBvbiBhIG1vYmlsZSBkZXZpY2UuXG4gKlxuICogRGVsaWJlcmF0ZWx5IGRvZXMgbm90IHJlbHkgb24gY2hlY2tpbmcgYGZpbGU6Ly9gIFVSTHMgKGFzIHRoaXMgZmFpbHMgUGhvbmVHYXBcbiAqIGluIHRoZSBSaXBwbGUgZW11bGF0b3IpIG5vciBDb3Jkb3ZhIGBvbkRldmljZVJlYWR5YCwgd2hpY2ggd291bGQgbm9ybWFsbHlcbiAqIHdhaXQgZm9yIGEgY2FsbGJhY2suXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc01vYmlsZUNvcmRvdmEoKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAvLyBAdHMtaWdub3JlIFNldHRpbmcgdXAgYW4gYnJvYWRseSBhcHBsaWNhYmxlIGluZGV4IHNpZ25hdHVyZSBmb3IgV2luZG93XG4gICAgLy8ganVzdCB0byBkZWFsIHdpdGggdGhpcyBjYXNlIHdvdWxkIHByb2JhYmx5IGJlIGEgYmFkIGlkZWEuXG4gICAgISEod2luZG93Wydjb3Jkb3ZhJ10gfHwgd2luZG93WydwaG9uZWdhcCddIHx8IHdpbmRvd1snUGhvbmVHYXAnXSkgJiZcbiAgICAvaW9zfGlwaG9uZXxpcG9kfGlwYWR8YW5kcm9pZHxibGFja2JlcnJ5fGllbW9iaWxlL2kudGVzdChnZXRVQSgpKVxuICApO1xufVxuXG4vKipcbiAqIERldGVjdCBOb2RlLmpzLlxuICpcbiAqIEByZXR1cm4gdHJ1ZSBpZiBOb2RlLmpzIGVudmlyb25tZW50IGlzIGRldGVjdGVkIG9yIHNwZWNpZmllZC5cbiAqL1xuLy8gTm9kZSBkZXRlY3Rpb24gbG9naWMgZnJvbTogaHR0cHM6Ly9naXRodWIuY29tL2lsaWFrYW4vZGV0ZWN0LW5vZGUvXG5leHBvcnQgZnVuY3Rpb24gaXNOb2RlKCk6IGJvb2xlYW4ge1xuICBjb25zdCBmb3JjZUVudmlyb25tZW50ID0gZ2V0RGVmYXVsdHMoKT8uZm9yY2VFbnZpcm9ubWVudDtcbiAgaWYgKGZvcmNlRW52aXJvbm1lbnQgPT09ICdub2RlJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2UgaWYgKGZvcmNlRW52aXJvbm1lbnQgPT09ICdicm93c2VyJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIChcbiAgICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChnbG9iYWwucHJvY2VzcykgPT09ICdbb2JqZWN0IHByb2Nlc3NdJ1xuICAgICk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBEZXRlY3QgQnJvd3NlciBFbnZpcm9ubWVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNCcm93c2VyKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIHNlbGYgPT09ICdvYmplY3QnICYmIHNlbGYuc2VsZiA9PT0gc2VsZjtcbn1cblxuLyoqXG4gKiBEZXRlY3QgYnJvd3NlciBleHRlbnNpb25zIChDaHJvbWUgYW5kIEZpcmVmb3ggYXQgbGVhc3QpLlxuICovXG5pbnRlcmZhY2UgQnJvd3NlclJ1bnRpbWUge1xuICBpZD86IHVua25vd247XG59XG5kZWNsYXJlIGNvbnN0IGNocm9tZTogeyBydW50aW1lPzogQnJvd3NlclJ1bnRpbWUgfTtcbmRlY2xhcmUgY29uc3QgYnJvd3NlcjogeyBydW50aW1lPzogQnJvd3NlclJ1bnRpbWUgfTtcbmV4cG9ydCBmdW5jdGlvbiBpc0Jyb3dzZXJFeHRlbnNpb24oKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJ1bnRpbWUgPVxuICAgIHR5cGVvZiBjaHJvbWUgPT09ICdvYmplY3QnXG4gICAgICA/IGNocm9tZS5ydW50aW1lXG4gICAgICA6IHR5cGVvZiBicm93c2VyID09PSAnb2JqZWN0J1xuICAgICAgPyBicm93c2VyLnJ1bnRpbWVcbiAgICAgIDogdW5kZWZpbmVkO1xuICByZXR1cm4gdHlwZW9mIHJ1bnRpbWUgPT09ICdvYmplY3QnICYmIHJ1bnRpbWUuaWQgIT09IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBEZXRlY3QgUmVhY3QgTmF0aXZlLlxuICpcbiAqIEByZXR1cm4gdHJ1ZSBpZiBSZWFjdE5hdGl2ZSBlbnZpcm9ubWVudCBpcyBkZXRlY3RlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVhY3ROYXRpdmUoKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIG5hdmlnYXRvciA9PT0gJ29iamVjdCcgJiYgbmF2aWdhdG9yWydwcm9kdWN0J10gPT09ICdSZWFjdE5hdGl2ZSdcbiAgKTtcbn1cblxuLyoqIERldGVjdHMgRWxlY3Ryb24gYXBwcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0VsZWN0cm9uKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2V0VUEoKS5pbmRleE9mKCdFbGVjdHJvbi8nKSA+PSAwO1xufVxuXG4vKiogRGV0ZWN0cyBJbnRlcm5ldCBFeHBsb3Jlci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0lFKCk6IGJvb2xlYW4ge1xuICBjb25zdCB1YSA9IGdldFVBKCk7XG4gIHJldHVybiB1YS5pbmRleE9mKCdNU0lFICcpID49IDAgfHwgdWEuaW5kZXhPZignVHJpZGVudC8nKSA+PSAwO1xufVxuXG4vKiogRGV0ZWN0cyBVbml2ZXJzYWwgV2luZG93cyBQbGF0Zm9ybSBhcHBzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVVdQKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2V0VUEoKS5pbmRleE9mKCdNU0FwcEhvc3QvJykgPj0gMDtcbn1cblxuLyoqXG4gKiBEZXRlY3Qgd2hldGhlciB0aGUgY3VycmVudCBTREsgYnVpbGQgaXMgdGhlIE5vZGUgdmVyc2lvbi5cbiAqXG4gKiBAcmV0dXJuIHRydWUgaWYgaXQncyB0aGUgTm9kZSBTREsgYnVpbGQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc05vZGVTZGsoKTogYm9vbGVhbiB7XG4gIHJldHVybiBDT05TVEFOVFMuTk9ERV9DTElFTlQgPT09IHRydWUgfHwgQ09OU1RBTlRTLk5PREVfQURNSU4gPT09IHRydWU7XG59XG5cbi8qKiBSZXR1cm5zIHRydWUgaWYgd2UgYXJlIHJ1bm5pbmcgaW4gU2FmYXJpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2FmYXJpKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgICFpc05vZGUoKSAmJlxuICAgIG5hdmlnYXRvci51c2VyQWdlbnQuaW5jbHVkZXMoJ1NhZmFyaScpICYmXG4gICAgIW5hdmlnYXRvci51c2VyQWdlbnQuaW5jbHVkZXMoJ0Nocm9tZScpXG4gICk7XG59XG5cbi8qKlxuICogVGhpcyBtZXRob2QgY2hlY2tzIGlmIGluZGV4ZWREQiBpcyBzdXBwb3J0ZWQgYnkgY3VycmVudCBicm93c2VyL3NlcnZpY2Ugd29ya2VyIGNvbnRleHRcbiAqIEByZXR1cm4gdHJ1ZSBpZiBpbmRleGVkREIgaXMgc3VwcG9ydGVkIGJ5IGN1cnJlbnQgYnJvd3Nlci9zZXJ2aWNlIHdvcmtlciBjb250ZXh0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0luZGV4ZWREQkF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gdHlwZW9mIGluZGV4ZWREQiA9PT0gJ29iamVjdCc7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGlzIG1ldGhvZCB2YWxpZGF0ZXMgYnJvd3Nlci9zdyBjb250ZXh0IGZvciBpbmRleGVkREIgYnkgb3BlbmluZyBhIGR1bW15IGluZGV4ZWREQiBkYXRhYmFzZSBhbmQgcmVqZWN0XG4gKiBpZiBlcnJvcnMgb2NjdXIgZHVyaW5nIHRoZSBkYXRhYmFzZSBvcGVuIG9wZXJhdGlvbi5cbiAqXG4gKiBAdGhyb3dzIGV4Y2VwdGlvbiBpZiBjdXJyZW50IGJyb3dzZXIvc3cgY29udGV4dCBjYW4ndCBydW4gaWRiLm9wZW4gKGV4OiBTYWZhcmkgaWZyYW1lLCBGaXJlZm94XG4gKiBwcml2YXRlIGJyb3dzaW5nKVxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVJbmRleGVkREJPcGVuYWJsZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICB0cnkge1xuICAgICAgbGV0IHByZUV4aXN0OiBib29sZWFuID0gdHJ1ZTtcbiAgICAgIGNvbnN0IERCX0NIRUNLX05BTUUgPVxuICAgICAgICAndmFsaWRhdGUtYnJvd3Nlci1jb250ZXh0LWZvci1pbmRleGVkZGItYW5hbHl0aWNzLW1vZHVsZSc7XG4gICAgICBjb25zdCByZXF1ZXN0ID0gc2VsZi5pbmRleGVkREIub3BlbihEQl9DSEVDS19OQU1FKTtcbiAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICByZXF1ZXN0LnJlc3VsdC5jbG9zZSgpO1xuICAgICAgICAvLyBkZWxldGUgZGF0YWJhc2Ugb25seSB3aGVuIGl0IGRvZXNuJ3QgcHJlLWV4aXN0XG4gICAgICAgIGlmICghcHJlRXhpc3QpIHtcbiAgICAgICAgICBzZWxmLmluZGV4ZWREQi5kZWxldGVEYXRhYmFzZShEQl9DSEVDS19OQU1FKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgfTtcbiAgICAgIHJlcXVlc3Qub251cGdyYWRlbmVlZGVkID0gKCkgPT4ge1xuICAgICAgICBwcmVFeGlzdCA9IGZhbHNlO1xuICAgICAgfTtcblxuICAgICAgcmVxdWVzdC5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICByZWplY3QocmVxdWVzdC5lcnJvcj8ubWVzc2FnZSB8fCAnJyk7XG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZWplY3QoZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICpcbiAqIFRoaXMgbWV0aG9kIGNoZWNrcyB3aGV0aGVyIGNvb2tpZSBpcyBlbmFibGVkIHdpdGhpbiBjdXJyZW50IGJyb3dzZXJcbiAqIEByZXR1cm4gdHJ1ZSBpZiBjb29raWUgaXMgZW5hYmxlZCB3aXRoaW4gY3VycmVudCBicm93c2VyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcmVDb29raWVzRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgPT09ICd1bmRlZmluZWQnIHx8ICFuYXZpZ2F0b3IuY29va2llRW5hYmxlZCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IFN0YW5kYXJkaXplZCBGaXJlYmFzZSBFcnJvci5cbiAqXG4gKiBVc2FnZTpcbiAqXG4gKiAgIC8vIFR5cGVzY3JpcHQgc3RyaW5nIGxpdGVyYWxzIGZvciB0eXBlLXNhZmUgY29kZXNcbiAqICAgdHlwZSBFcnIgPVxuICogICAgICd1bmtub3duJyB8XG4gKiAgICAgJ29iamVjdC1ub3QtZm91bmQnXG4gKiAgICAgO1xuICpcbiAqICAgLy8gQ2xvc3VyZSBlbnVtIGZvciB0eXBlLXNhZmUgZXJyb3IgY29kZXNcbiAqICAgLy8gYXQtZW51bSB7c3RyaW5nfVxuICogICB2YXIgRXJyID0ge1xuICogICAgIFVOS05PV046ICd1bmtub3duJyxcbiAqICAgICBPQkpFQ1RfTk9UX0ZPVU5EOiAnb2JqZWN0LW5vdC1mb3VuZCcsXG4gKiAgIH1cbiAqXG4gKiAgIGxldCBlcnJvcnM6IE1hcDxFcnIsIHN0cmluZz4gPSB7XG4gKiAgICAgJ2dlbmVyaWMtZXJyb3InOiBcIlVua25vd24gZXJyb3JcIixcbiAqICAgICAnZmlsZS1ub3QtZm91bmQnOiBcIkNvdWxkIG5vdCBmaW5kIGZpbGU6IHskZmlsZX1cIixcbiAqICAgfTtcbiAqXG4gKiAgIC8vIFR5cGUtc2FmZSBmdW5jdGlvbiAtIG11c3QgcGFzcyBhIHZhbGlkIGVycm9yIGNvZGUgYXMgcGFyYW0uXG4gKiAgIGxldCBlcnJvciA9IG5ldyBFcnJvckZhY3Rvcnk8RXJyPignc2VydmljZScsICdTZXJ2aWNlJywgZXJyb3JzKTtcbiAqXG4gKiAgIC4uLlxuICogICB0aHJvdyBlcnJvci5jcmVhdGUoRXJyLkdFTkVSSUMpO1xuICogICAuLi5cbiAqICAgdGhyb3cgZXJyb3IuY3JlYXRlKEVyci5GSUxFX05PVF9GT1VORCwgeydmaWxlJzogZmlsZU5hbWV9KTtcbiAqICAgLi4uXG4gKiAgIC8vIFNlcnZpY2U6IENvdWxkIG5vdCBmaWxlIGZpbGU6IGZvby50eHQgKHNlcnZpY2UvZmlsZS1ub3QtZm91bmQpLlxuICpcbiAqICAgY2F0Y2ggKGUpIHtcbiAqICAgICBhc3NlcnQoZS5tZXNzYWdlID09PSBcIkNvdWxkIG5vdCBmaW5kIGZpbGU6IGZvby50eHQuXCIpO1xuICogICAgIGlmICgoZSBhcyBGaXJlYmFzZUVycm9yKT8uY29kZSA9PT0gJ3NlcnZpY2UvZmlsZS1ub3QtZm91bmQnKSB7XG4gKiAgICAgICBjb25zb2xlLmxvZyhcIkNvdWxkIG5vdCByZWFkIGZpbGU6IFwiICsgZVsnZmlsZSddKTtcbiAqICAgICB9XG4gKiAgIH1cbiAqL1xuXG5leHBvcnQgdHlwZSBFcnJvck1hcDxFcnJvckNvZGUgZXh0ZW5kcyBzdHJpbmc+ID0ge1xuICByZWFkb25seSBbSyBpbiBFcnJvckNvZGVdOiBzdHJpbmc7XG59O1xuXG5jb25zdCBFUlJPUl9OQU1FID0gJ0ZpcmViYXNlRXJyb3InO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0cmluZ0xpa2Uge1xuICB0b1N0cmluZygpOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXJyb3JEYXRhIHtcbiAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbn1cblxuLy8gQmFzZWQgb24gY29kZSBmcm9tOlxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRXJyb3IjQ3VzdG9tX0Vycm9yX1R5cGVzXG5leHBvcnQgY2xhc3MgRmlyZWJhc2VFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqIFRoZSBjdXN0b20gbmFtZSBmb3IgYWxsIEZpcmViYXNlRXJyb3JzLiAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmcgPSBFUlJPUl9OQU1FO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIC8qKiBUaGUgZXJyb3IgY29kZSBmb3IgdGhpcyBlcnJvci4gKi9cbiAgICByZWFkb25seSBjb2RlOiBzdHJpbmcsXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIC8qKiBDdXN0b20gZGF0YSBmb3IgdGhpcyBlcnJvci4gKi9cbiAgICBwdWJsaWMgY3VzdG9tRGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuXG4gICAgLy8gRml4IEZvciBFUzVcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQtd2lraS9ibG9iL21hc3Rlci9CcmVha2luZy1DaGFuZ2VzLm1kI2V4dGVuZGluZy1idWlsdC1pbnMtbGlrZS1lcnJvci1hcnJheS1hbmQtbWFwLW1heS1uby1sb25nZXItd29ya1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBGaXJlYmFzZUVycm9yLnByb3RvdHlwZSk7XG5cbiAgICAvLyBNYWludGFpbnMgcHJvcGVyIHN0YWNrIHRyYWNlIGZvciB3aGVyZSBvdXIgZXJyb3Igd2FzIHRocm93bi5cbiAgICAvLyBPbmx5IGF2YWlsYWJsZSBvbiBWOC5cbiAgICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIEVycm9yRmFjdG9yeS5wcm90b3R5cGUuY3JlYXRlKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEVycm9yRmFjdG9yeTxcbiAgRXJyb3JDb2RlIGV4dGVuZHMgc3RyaW5nLFxuICBFcnJvclBhcmFtcyBleHRlbmRzIHsgcmVhZG9ubHkgW0sgaW4gRXJyb3JDb2RlXT86IEVycm9yRGF0YSB9ID0ge31cbj4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNlcnZpY2U6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNlcnZpY2VOYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBlcnJvcnM6IEVycm9yTWFwPEVycm9yQ29kZT5cbiAgKSB7fVxuXG4gIGNyZWF0ZTxLIGV4dGVuZHMgRXJyb3JDb2RlPihcbiAgICBjb2RlOiBLLFxuICAgIC4uLmRhdGE6IEsgZXh0ZW5kcyBrZXlvZiBFcnJvclBhcmFtcyA/IFtFcnJvclBhcmFtc1tLXV0gOiBbXVxuICApOiBGaXJlYmFzZUVycm9yIHtcbiAgICBjb25zdCBjdXN0b21EYXRhID0gKGRhdGFbMF0gYXMgRXJyb3JEYXRhKSB8fCB7fTtcbiAgICBjb25zdCBmdWxsQ29kZSA9IGAke3RoaXMuc2VydmljZX0vJHtjb2RlfWA7XG4gICAgY29uc3QgdGVtcGxhdGUgPSB0aGlzLmVycm9yc1tjb2RlXTtcblxuICAgIGNvbnN0IG1lc3NhZ2UgPSB0ZW1wbGF0ZSA/IHJlcGxhY2VUZW1wbGF0ZSh0ZW1wbGF0ZSwgY3VzdG9tRGF0YSkgOiAnRXJyb3InO1xuICAgIC8vIFNlcnZpY2UgTmFtZTogRXJyb3IgbWVzc2FnZSAoc2VydmljZS9jb2RlKS5cbiAgICBjb25zdCBmdWxsTWVzc2FnZSA9IGAke3RoaXMuc2VydmljZU5hbWV9OiAke21lc3NhZ2V9ICgke2Z1bGxDb2RlfSkuYDtcblxuICAgIGNvbnN0IGVycm9yID0gbmV3IEZpcmViYXNlRXJyb3IoZnVsbENvZGUsIGZ1bGxNZXNzYWdlLCBjdXN0b21EYXRhKTtcblxuICAgIHJldHVybiBlcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXBsYWNlVGVtcGxhdGUodGVtcGxhdGU6IHN0cmluZywgZGF0YTogRXJyb3JEYXRhKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRlbXBsYXRlLnJlcGxhY2UoUEFUVEVSTiwgKF8sIGtleSkgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gZGF0YVtrZXldO1xuICAgIHJldHVybiB2YWx1ZSAhPSBudWxsID8gU3RyaW5nKHZhbHVlKSA6IGA8JHtrZXl9Pz5gO1xuICB9KTtcbn1cblxuY29uc3QgUEFUVEVSTiA9IC9cXHtcXCQoW159XSspfS9nO1xuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8qKlxuICogRXZhbHVhdGVzIGEgSlNPTiBzdHJpbmcgaW50byBhIGphdmFzY3JpcHQgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgQSBzdHJpbmcgY29udGFpbmluZyBKU09OLlxuICogQHJldHVybiB7Kn0gVGhlIGphdmFzY3JpcHQgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc3BlY2lmaWVkIEpTT04uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBqc29uRXZhbChzdHI6IHN0cmluZyk6IHVua25vd24ge1xuICByZXR1cm4gSlNPTi5wYXJzZShzdHIpO1xufVxuXG4vKipcbiAqIFJldHVybnMgSlNPTiByZXByZXNlbnRpbmcgYSBqYXZhc2NyaXB0IG9iamVjdC5cbiAqIEBwYXJhbSB7Kn0gZGF0YSBKYXZhc2NyaXB0IG9iamVjdCB0byBiZSBzdHJpbmdpZmllZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIEpTT04gY29udGVudHMgb2YgdGhlIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ2lmeShkYXRhOiB1bmtub3duKTogc3RyaW5nIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEpO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IGJhc2U2NERlY29kZSB9IGZyb20gJy4vY3J5cHQnO1xuaW1wb3J0IHsganNvbkV2YWwgfSBmcm9tICcuL2pzb24nO1xuXG5pbnRlcmZhY2UgQ2xhaW1zIHtcbiAgW2tleTogc3RyaW5nXToge307XG59XG5cbmludGVyZmFjZSBEZWNvZGVkVG9rZW4ge1xuICBoZWFkZXI6IG9iamVjdDtcbiAgY2xhaW1zOiBDbGFpbXM7XG4gIGRhdGE6IG9iamVjdDtcbiAgc2lnbmF0dXJlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRGVjb2RlcyBhIEZpcmViYXNlIGF1dGguIHRva2VuIGludG8gY29uc3RpdHVlbnQgcGFydHMuXG4gKlxuICogTm90ZXM6XG4gKiAtIE1heSByZXR1cm4gd2l0aCBpbnZhbGlkIC8gaW5jb21wbGV0ZSBjbGFpbXMgaWYgdGhlcmUncyBubyBuYXRpdmUgYmFzZTY0IGRlY29kaW5nIHN1cHBvcnQuXG4gKiAtIERvZXNuJ3QgY2hlY2sgaWYgdGhlIHRva2VuIGlzIGFjdHVhbGx5IHZhbGlkLlxuICovXG5leHBvcnQgY29uc3QgZGVjb2RlID0gZnVuY3Rpb24gKHRva2VuOiBzdHJpbmcpOiBEZWNvZGVkVG9rZW4ge1xuICBsZXQgaGVhZGVyID0ge30sXG4gICAgY2xhaW1zOiBDbGFpbXMgPSB7fSxcbiAgICBkYXRhID0ge30sXG4gICAgc2lnbmF0dXJlID0gJyc7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJ0cyA9IHRva2VuLnNwbGl0KCcuJyk7XG4gICAgaGVhZGVyID0ganNvbkV2YWwoYmFzZTY0RGVjb2RlKHBhcnRzWzBdKSB8fCAnJykgYXMgb2JqZWN0O1xuICAgIGNsYWltcyA9IGpzb25FdmFsKGJhc2U2NERlY29kZShwYXJ0c1sxXSkgfHwgJycpIGFzIENsYWltcztcbiAgICBzaWduYXR1cmUgPSBwYXJ0c1syXTtcbiAgICBkYXRhID0gY2xhaW1zWydkJ10gfHwge307XG4gICAgZGVsZXRlIGNsYWltc1snZCddO1xuICB9IGNhdGNoIChlKSB7fVxuXG4gIHJldHVybiB7XG4gICAgaGVhZGVyLFxuICAgIGNsYWltcyxcbiAgICBkYXRhLFxuICAgIHNpZ25hdHVyZVxuICB9O1xufTtcblxuaW50ZXJmYWNlIERlY29kZWRUb2tlbiB7XG4gIGhlYWRlcjogb2JqZWN0O1xuICBjbGFpbXM6IENsYWltcztcbiAgZGF0YTogb2JqZWN0O1xuICBzaWduYXR1cmU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBEZWNvZGVzIGEgRmlyZWJhc2UgYXV0aC4gdG9rZW4gYW5kIGNoZWNrcyB0aGUgdmFsaWRpdHkgb2YgaXRzIHRpbWUtYmFzZWQgY2xhaW1zLiBXaWxsIHJldHVybiB0cnVlIGlmIHRoZVxuICogdG9rZW4gaXMgd2l0aGluIHRoZSB0aW1lIHdpbmRvdyBhdXRob3JpemVkIGJ5IHRoZSAnbmJmJyAobm90LWJlZm9yZSkgYW5kICdpYXQnIChpc3N1ZWQtYXQpIGNsYWltcy5cbiAqXG4gKiBOb3RlczpcbiAqIC0gTWF5IHJldHVybiBhIGZhbHNlIG5lZ2F0aXZlIGlmIHRoZXJlJ3Mgbm8gbmF0aXZlIGJhc2U2NCBkZWNvZGluZyBzdXBwb3J0LlxuICogLSBEb2Vzbid0IGNoZWNrIGlmIHRoZSB0b2tlbiBpcyBhY3R1YWxseSB2YWxpZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzVmFsaWRUaW1lc3RhbXAgPSBmdW5jdGlvbiAodG9rZW46IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBjbGFpbXM6IENsYWltcyA9IGRlY29kZSh0b2tlbikuY2xhaW1zO1xuICBjb25zdCBub3c6IG51bWJlciA9IE1hdGguZmxvb3IobmV3IERhdGUoKS5nZXRUaW1lKCkgLyAxMDAwKTtcbiAgbGV0IHZhbGlkU2luY2U6IG51bWJlciA9IDAsXG4gICAgdmFsaWRVbnRpbDogbnVtYmVyID0gMDtcblxuICBpZiAodHlwZW9mIGNsYWltcyA9PT0gJ29iamVjdCcpIHtcbiAgICBpZiAoY2xhaW1zLmhhc093blByb3BlcnR5KCduYmYnKSkge1xuICAgICAgdmFsaWRTaW5jZSA9IGNsYWltc1snbmJmJ10gYXMgbnVtYmVyO1xuICAgIH0gZWxzZSBpZiAoY2xhaW1zLmhhc093blByb3BlcnR5KCdpYXQnKSkge1xuICAgICAgdmFsaWRTaW5jZSA9IGNsYWltc1snaWF0J10gYXMgbnVtYmVyO1xuICAgIH1cblxuICAgIGlmIChjbGFpbXMuaGFzT3duUHJvcGVydHkoJ2V4cCcpKSB7XG4gICAgICB2YWxpZFVudGlsID0gY2xhaW1zWydleHAnXSBhcyBudW1iZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRva2VuIHdpbGwgZXhwaXJlIGFmdGVyIDI0aCBieSBkZWZhdWx0XG4gICAgICB2YWxpZFVudGlsID0gdmFsaWRTaW5jZSArIDg2NDAwO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAoXG4gICAgISFub3cgJiZcbiAgICAhIXZhbGlkU2luY2UgJiZcbiAgICAhIXZhbGlkVW50aWwgJiZcbiAgICBub3cgPj0gdmFsaWRTaW5jZSAmJlxuICAgIG5vdyA8PSB2YWxpZFVudGlsXG4gICk7XG59O1xuXG4vKipcbiAqIERlY29kZXMgYSBGaXJlYmFzZSBhdXRoLiB0b2tlbiBhbmQgcmV0dXJucyBpdHMgaXNzdWVkIGF0IHRpbWUgaWYgdmFsaWQsIG51bGwgb3RoZXJ3aXNlLlxuICpcbiAqIE5vdGVzOlxuICogLSBNYXkgcmV0dXJuIG51bGwgaWYgdGhlcmUncyBubyBuYXRpdmUgYmFzZTY0IGRlY29kaW5nIHN1cHBvcnQuXG4gKiAtIERvZXNuJ3QgY2hlY2sgaWYgdGhlIHRva2VuIGlzIGFjdHVhbGx5IHZhbGlkLlxuICovXG5leHBvcnQgY29uc3QgaXNzdWVkQXRUaW1lID0gZnVuY3Rpb24gKHRva2VuOiBzdHJpbmcpOiBudW1iZXIgfCBudWxsIHtcbiAgY29uc3QgY2xhaW1zOiBDbGFpbXMgPSBkZWNvZGUodG9rZW4pLmNsYWltcztcbiAgaWYgKHR5cGVvZiBjbGFpbXMgPT09ICdvYmplY3QnICYmIGNsYWltcy5oYXNPd25Qcm9wZXJ0eSgnaWF0JykpIHtcbiAgICByZXR1cm4gY2xhaW1zWydpYXQnXSBhcyBudW1iZXI7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuXG4vKipcbiAqIERlY29kZXMgYSBGaXJlYmFzZSBhdXRoLiB0b2tlbiBhbmQgY2hlY2tzIHRoZSB2YWxpZGl0eSBvZiBpdHMgZm9ybWF0LiBFeHBlY3RzIGEgdmFsaWQgaXNzdWVkLWF0IHRpbWUuXG4gKlxuICogTm90ZXM6XG4gKiAtIE1heSByZXR1cm4gYSBmYWxzZSBuZWdhdGl2ZSBpZiB0aGVyZSdzIG5vIG5hdGl2ZSBiYXNlNjQgZGVjb2Rpbmcgc3VwcG9ydC5cbiAqIC0gRG9lc24ndCBjaGVjayBpZiB0aGUgdG9rZW4gaXMgYWN0dWFsbHkgdmFsaWQuXG4gKi9cbmV4cG9ydCBjb25zdCBpc1ZhbGlkRm9ybWF0ID0gZnVuY3Rpb24gKHRva2VuOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgZGVjb2RlZCA9IGRlY29kZSh0b2tlbiksXG4gICAgY2xhaW1zID0gZGVjb2RlZC5jbGFpbXM7XG5cbiAgcmV0dXJuICEhY2xhaW1zICYmIHR5cGVvZiBjbGFpbXMgPT09ICdvYmplY3QnICYmIGNsYWltcy5oYXNPd25Qcm9wZXJ0eSgnaWF0Jyk7XG59O1xuXG4vKipcbiAqIEF0dGVtcHRzIHRvIHBlZXIgaW50byBhbiBhdXRoIHRva2VuIGFuZCBkZXRlcm1pbmUgaWYgaXQncyBhbiBhZG1pbiBhdXRoIHRva2VuIGJ5IGxvb2tpbmcgYXQgdGhlIGNsYWltcyBwb3J0aW9uLlxuICpcbiAqIE5vdGVzOlxuICogLSBNYXkgcmV0dXJuIGEgZmFsc2UgbmVnYXRpdmUgaWYgdGhlcmUncyBubyBuYXRpdmUgYmFzZTY0IGRlY29kaW5nIHN1cHBvcnQuXG4gKiAtIERvZXNuJ3QgY2hlY2sgaWYgdGhlIHRva2VuIGlzIGFjdHVhbGx5IHZhbGlkLlxuICovXG5leHBvcnQgY29uc3QgaXNBZG1pbiA9IGZ1bmN0aW9uICh0b2tlbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGNsYWltczogQ2xhaW1zID0gZGVjb2RlKHRva2VuKS5jbGFpbXM7XG4gIHJldHVybiB0eXBlb2YgY2xhaW1zID09PSAnb2JqZWN0JyAmJiBjbGFpbXNbJ2FkbWluJ10gPT09IHRydWU7XG59O1xuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjb250YWluczxUIGV4dGVuZHMgb2JqZWN0PihvYmo6IFQsIGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2FmZUdldDxUIGV4dGVuZHMgb2JqZWN0LCBLIGV4dGVuZHMga2V5b2YgVD4oXG4gIG9iajogVCxcbiAga2V5OiBLXG4pOiBUW0tdIHwgdW5kZWZpbmVkIHtcbiAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHtcbiAgICByZXR1cm4gb2JqW2tleV07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFbXB0eShvYmo6IG9iamVjdCk6IG9iaiBpcyB7fSB7XG4gIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFwPEsgZXh0ZW5kcyBzdHJpbmcsIFYsIFU+KFxuICBvYmo6IHsgW2tleSBpbiBLXTogViB9LFxuICBmbjogKHZhbHVlOiBWLCBrZXk6IEssIG9iajogeyBba2V5IGluIEtdOiBWIH0pID0+IFUsXG4gIGNvbnRleHRPYmo/OiB1bmtub3duXG4pOiB7IFtrZXkgaW4gS106IFUgfSB7XG4gIGNvbnN0IHJlczogUGFydGlhbDx7IFtrZXkgaW4gS106IFUgfT4gPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHtcbiAgICAgIHJlc1trZXldID0gZm4uY2FsbChjb250ZXh0T2JqLCBvYmpba2V5XSwga2V5LCBvYmopO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzIGFzIHsgW2tleSBpbiBLXTogVSB9O1xufVxuXG4vKipcbiAqIERlZXAgZXF1YWwgdHdvIG9iamVjdHMuIFN1cHBvcnQgQXJyYXlzIGFuZCBPYmplY3RzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVlcEVxdWFsKGE6IG9iamVjdCwgYjogb2JqZWN0KTogYm9vbGVhbiB7XG4gIGlmIChhID09PSBiKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBhS2V5cyA9IE9iamVjdC5rZXlzKGEpO1xuICBjb25zdCBiS2V5cyA9IE9iamVjdC5rZXlzKGIpO1xuICBmb3IgKGNvbnN0IGsgb2YgYUtleXMpIHtcbiAgICBpZiAoIWJLZXlzLmluY2x1ZGVzKGspKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgYVByb3AgPSAoYSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba107XG4gICAgY29uc3QgYlByb3AgPSAoYiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba107XG4gICAgaWYgKGlzT2JqZWN0KGFQcm9wKSAmJiBpc09iamVjdChiUHJvcCkpIHtcbiAgICAgIGlmICghZGVlcEVxdWFsKGFQcm9wLCBiUHJvcCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYVByb3AgIT09IGJQcm9wKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBrIG9mIGJLZXlzKSB7XG4gICAgaWYgKCFhS2V5cy5pbmNsdWRlcyhrKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaXNPYmplY3QodGhpbmc6IHVua25vd24pOiB0aGluZyBpcyBvYmplY3Qge1xuICByZXR1cm4gdGhpbmcgIT09IG51bGwgJiYgdHlwZW9mIHRoaW5nID09PSAnb2JqZWN0Jztcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBEZWZlcnJlZCB9IGZyb20gJy4vZGVmZXJyZWQnO1xuXG4vKipcbiAqIFJlamVjdHMgaWYgdGhlIGdpdmVuIHByb21pc2UgZG9lc24ndCByZXNvbHZlIGluIHRpbWVJbk1TIG1pbGxpc2Vjb25kcy5cbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvbWlzZVdpdGhUaW1lb3V0PFQ+KFxuICBwcm9taXNlOiBQcm9taXNlPFQ+LFxuICB0aW1lSW5NUyA9IDIwMDBcbik6IFByb21pc2U8VD4ge1xuICBjb25zdCBkZWZlcnJlZFByb21pc2UgPSBuZXcgRGVmZXJyZWQ8VD4oKTtcbiAgc2V0VGltZW91dCgoKSA9PiBkZWZlcnJlZFByb21pc2UucmVqZWN0KCd0aW1lb3V0IScpLCB0aW1lSW5NUyk7XG4gIHByb21pc2UudGhlbihkZWZlcnJlZFByb21pc2UucmVzb2x2ZSwgZGVmZXJyZWRQcm9taXNlLnJlamVjdCk7XG4gIHJldHVybiBkZWZlcnJlZFByb21pc2UucHJvbWlzZTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4vKipcbiAqIFJldHVybnMgYSBxdWVyeXN0cmluZy1mb3JtYXR0ZWQgc3RyaW5nIChlLmcuICZhcmc9dmFsJmFyZzI9dmFsMikgZnJvbSBhXG4gKiBwYXJhbXMgb2JqZWN0IChlLmcuIHthcmc6ICd2YWwnLCBhcmcyOiAndmFsMid9KVxuICogTm90ZTogWW91IG11c3QgcHJlcGVuZCBpdCB3aXRoID8gd2hlbiBhZGRpbmcgaXQgdG8gYSBVUkwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBxdWVyeXN0cmluZyhxdWVyeXN0cmluZ1BhcmFtczoge1xuICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXI7XG59KTogc3RyaW5nIHtcbiAgY29uc3QgcGFyYW1zID0gW107XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHF1ZXJ5c3RyaW5nUGFyYW1zKSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgdmFsdWUuZm9yRWFjaChhcnJheVZhbCA9PiB7XG4gICAgICAgIHBhcmFtcy5wdXNoKFxuICAgICAgICAgIGVuY29kZVVSSUNvbXBvbmVudChrZXkpICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGFycmF5VmFsKVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcmFtcy5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChrZXkpICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBwYXJhbXMubGVuZ3RoID8gJyYnICsgcGFyYW1zLmpvaW4oJyYnKSA6ICcnO1xufVxuXG4vKipcbiAqIERlY29kZXMgYSBxdWVyeXN0cmluZyAoZS5nLiA/YXJnPXZhbCZhcmcyPXZhbDIpIGludG8gYSBwYXJhbXMgb2JqZWN0XG4gKiAoZS5nLiB7YXJnOiAndmFsJywgYXJnMjogJ3ZhbDInfSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1ZXJ5c3RyaW5nRGVjb2RlKHF1ZXJ5c3RyaW5nOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3Qgb2JqOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGNvbnN0IHRva2VucyA9IHF1ZXJ5c3RyaW5nLnJlcGxhY2UoL15cXD8vLCAnJykuc3BsaXQoJyYnKTtcblxuICB0b2tlbnMuZm9yRWFjaCh0b2tlbiA9PiB7XG4gICAgaWYgKHRva2VuKSB7XG4gICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSB0b2tlbi5zcGxpdCgnPScpO1xuICAgICAgb2JqW2RlY29kZVVSSUNvbXBvbmVudChrZXkpXSA9IGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBFeHRyYWN0IHRoZSBxdWVyeSBzdHJpbmcgcGFydCBvZiBhIFVSTCwgaW5jbHVkaW5nIHRoZSBsZWFkaW5nIHF1ZXN0aW9uIG1hcmsgKGlmIHByZXNlbnQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFF1ZXJ5c3RyaW5nKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcXVlcnlTdGFydCA9IHVybC5pbmRleE9mKCc/Jyk7XG4gIGlmICghcXVlcnlTdGFydCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuICBjb25zdCBmcmFnbWVudFN0YXJ0ID0gdXJsLmluZGV4T2YoJyMnLCBxdWVyeVN0YXJ0KTtcbiAgcmV0dXJuIHVybC5zdWJzdHJpbmcoXG4gICAgcXVlcnlTdGFydCxcbiAgICBmcmFnbWVudFN0YXJ0ID4gMCA/IGZyYWdtZW50U3RhcnQgOiB1bmRlZmluZWRcbiAgKTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4vKipcbiAqIEBmaWxlb3ZlcnZpZXcgU0hBLTEgY3J5cHRvZ3JhcGhpYyBoYXNoLlxuICogVmFyaWFibGUgbmFtZXMgZm9sbG93IHRoZSBub3RhdGlvbiBpbiBGSVBTIFBVQiAxODAtMzpcbiAqIGh0dHA6Ly9jc3JjLm5pc3QuZ292L3B1YmxpY2F0aW9ucy9maXBzL2ZpcHMxODAtMy9maXBzMTgwLTNfZmluYWwucGRmLlxuICpcbiAqIFVzYWdlOlxuICogICB2YXIgc2hhMSA9IG5ldyBzaGExKCk7XG4gKiAgIHNoYTEudXBkYXRlKGJ5dGVzKTtcbiAqICAgdmFyIGhhc2ggPSBzaGExLmRpZ2VzdCgpO1xuICpcbiAqIFBlcmZvcm1hbmNlOlxuICogICBDaHJvbWUgMjM6ICAgfjQwMCBNYml0L3NcbiAqICAgRmlyZWZveCAxNjogIH4yNTAgTWJpdC9zXG4gKlxuICovXG5cbi8qKlxuICogU0hBLTEgY3J5cHRvZ3JhcGhpYyBoYXNoIGNvbnN0cnVjdG9yLlxuICpcbiAqIFRoZSBwcm9wZXJ0aWVzIGRlY2xhcmVkIGhlcmUgYXJlIGRpc2N1c3NlZCBpbiB0aGUgYWJvdmUgYWxnb3JpdGhtIGRvY3VtZW50LlxuICogQGNvbnN0cnVjdG9yXG4gKiBAZmluYWxcbiAqIEBzdHJ1Y3RcbiAqL1xuZXhwb3J0IGNsYXNzIFNoYTEge1xuICAvKipcbiAgICogSG9sZHMgdGhlIHByZXZpb3VzIHZhbHVlcyBvZiBhY2N1bXVsYXRlZCB2YXJpYWJsZXMgYS1lIGluIHRoZSBjb21wcmVzc19cbiAgICogZnVuY3Rpb24uXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGNoYWluXzogbnVtYmVyW10gPSBbXTtcblxuICAvKipcbiAgICogQSBidWZmZXIgaG9sZGluZyB0aGUgcGFydGlhbGx5IGNvbXB1dGVkIGhhc2ggcmVzdWx0LlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBidWZfOiBudW1iZXJbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBBbiBhcnJheSBvZiA4MCBieXRlcywgZWFjaCBhIHBhcnQgb2YgdGhlIG1lc3NhZ2UgdG8gYmUgaGFzaGVkLiAgUmVmZXJyZWQgdG9cbiAgICogYXMgdGhlIG1lc3NhZ2Ugc2NoZWR1bGUgaW4gdGhlIGRvY3MuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIFdfOiBudW1iZXJbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBDb250YWlucyBkYXRhIG5lZWRlZCB0byBwYWQgbWVzc2FnZXMgbGVzcyB0aGFuIDY0IGJ5dGVzLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBwYWRfOiBudW1iZXJbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZSB7bnVtYmVyfVxuICAgKi9cbiAgcHJpdmF0ZSBpbmJ1Zl86IG51bWJlciA9IDA7XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlIHtudW1iZXJ9XG4gICAqL1xuICBwcml2YXRlIHRvdGFsXzogbnVtYmVyID0gMDtcblxuICBibG9ja1NpemU6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmJsb2NrU2l6ZSA9IDUxMiAvIDg7XG5cbiAgICB0aGlzLnBhZF9bMF0gPSAxMjg7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCB0aGlzLmJsb2NrU2l6ZTsgKytpKSB7XG4gICAgICB0aGlzLnBhZF9baV0gPSAwO1xuICAgIH1cblxuICAgIHRoaXMucmVzZXQoKTtcbiAgfVxuXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuY2hhaW5fWzBdID0gMHg2NzQ1MjMwMTtcbiAgICB0aGlzLmNoYWluX1sxXSA9IDB4ZWZjZGFiODk7XG4gICAgdGhpcy5jaGFpbl9bMl0gPSAweDk4YmFkY2ZlO1xuICAgIHRoaXMuY2hhaW5fWzNdID0gMHgxMDMyNTQ3NjtcbiAgICB0aGlzLmNoYWluX1s0XSA9IDB4YzNkMmUxZjA7XG5cbiAgICB0aGlzLmluYnVmXyA9IDA7XG4gICAgdGhpcy50b3RhbF8gPSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIGNvbXByZXNzIGhlbHBlciBmdW5jdGlvbi5cbiAgICogQHBhcmFtIGJ1ZiBCbG9jayB0byBjb21wcmVzcy5cbiAgICogQHBhcmFtIG9mZnNldCBPZmZzZXQgb2YgdGhlIGJsb2NrIGluIHRoZSBidWZmZXIuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjb21wcmVzc18oYnVmOiBudW1iZXJbXSB8IFVpbnQ4QXJyYXkgfCBzdHJpbmcsIG9mZnNldD86IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghb2Zmc2V0KSB7XG4gICAgICBvZmZzZXQgPSAwO1xuICAgIH1cblxuICAgIGNvbnN0IFcgPSB0aGlzLldfO1xuXG4gICAgLy8gZ2V0IDE2IGJpZyBlbmRpYW4gd29yZHNcbiAgICBpZiAodHlwZW9mIGJ1ZiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTY7IGkrKykge1xuICAgICAgICAvLyBUT0RPKHVzZXIpOiBbYnVnIDgxNDAxMjJdIFJlY2VudCB2ZXJzaW9ucyBvZiBTYWZhcmkgZm9yIE1hYyBPUyBhbmQgaU9TXG4gICAgICAgIC8vIGhhdmUgYSBidWcgdGhhdCB0dXJucyB0aGUgcG9zdC1pbmNyZW1lbnQgKysgb3BlcmF0b3IgaW50byBwcmUtaW5jcmVtZW50XG4gICAgICAgIC8vIGR1cmluZyBKSVQgY29tcGlsYXRpb24uICBXZSBoYXZlIGNvZGUgdGhhdCBkZXBlbmRzIGhlYXZpbHkgb24gU0hBLTEgZm9yXG4gICAgICAgIC8vIGNvcnJlY3RuZXNzIGFuZCB3aGljaCBpcyBhZmZlY3RlZCBieSB0aGlzIGJ1Zywgc28gSSd2ZSByZW1vdmVkIGFsbCB1c2VzXG4gICAgICAgIC8vIG9mIHBvc3QtaW5jcmVtZW50ICsrIGluIHdoaWNoIHRoZSByZXN1bHQgdmFsdWUgaXMgdXNlZC4gIFdlIGNhbiByZXZlcnRcbiAgICAgICAgLy8gdGhpcyBjaGFuZ2Ugb25jZSB0aGUgU2FmYXJpIGJ1Z1xuICAgICAgICAvLyAoaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEwOTAzNikgaGFzIGJlZW4gZml4ZWQgYW5kXG4gICAgICAgIC8vIG1vc3QgY2xpZW50cyBoYXZlIGJlZW4gdXBkYXRlZC5cbiAgICAgICAgV1tpXSA9XG4gICAgICAgICAgKGJ1Zi5jaGFyQ29kZUF0KG9mZnNldCkgPDwgMjQpIHxcbiAgICAgICAgICAoYnVmLmNoYXJDb2RlQXQob2Zmc2V0ICsgMSkgPDwgMTYpIHxcbiAgICAgICAgICAoYnVmLmNoYXJDb2RlQXQob2Zmc2V0ICsgMikgPDwgOCkgfFxuICAgICAgICAgIGJ1Zi5jaGFyQ29kZUF0KG9mZnNldCArIDMpO1xuICAgICAgICBvZmZzZXQgKz0gNDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7XG4gICAgICAgIFdbaV0gPVxuICAgICAgICAgIChidWZbb2Zmc2V0XSA8PCAyNCkgfFxuICAgICAgICAgIChidWZbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAgICAgICAoYnVmW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICAgICAgICBidWZbb2Zmc2V0ICsgM107XG4gICAgICAgIG9mZnNldCArPSA0O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGV4cGFuZCB0byA4MCB3b3Jkc1xuICAgIGZvciAobGV0IGkgPSAxNjsgaSA8IDgwOyBpKyspIHtcbiAgICAgIGNvbnN0IHQgPSBXW2kgLSAzXSBeIFdbaSAtIDhdIF4gV1tpIC0gMTRdIF4gV1tpIC0gMTZdO1xuICAgICAgV1tpXSA9ICgodCA8PCAxKSB8ICh0ID4+PiAzMSkpICYgMHhmZmZmZmZmZjtcbiAgICB9XG5cbiAgICBsZXQgYSA9IHRoaXMuY2hhaW5fWzBdO1xuICAgIGxldCBiID0gdGhpcy5jaGFpbl9bMV07XG4gICAgbGV0IGMgPSB0aGlzLmNoYWluX1syXTtcbiAgICBsZXQgZCA9IHRoaXMuY2hhaW5fWzNdO1xuICAgIGxldCBlID0gdGhpcy5jaGFpbl9bNF07XG4gICAgbGV0IGYsIGs7XG5cbiAgICAvLyBUT0RPKHVzZXIpOiBUcnkgdG8gdW5yb2xsIHRoaXMgbG9vcCB0byBzcGVlZCB1cCB0aGUgY29tcHV0YXRpb24uXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA4MDsgaSsrKSB7XG4gICAgICBpZiAoaSA8IDQwKSB7XG4gICAgICAgIGlmIChpIDwgMjApIHtcbiAgICAgICAgICBmID0gZCBeIChiICYgKGMgXiBkKSk7XG4gICAgICAgICAgayA9IDB4NWE4Mjc5OTk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZiA9IGIgXiBjIF4gZDtcbiAgICAgICAgICBrID0gMHg2ZWQ5ZWJhMTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGkgPCA2MCkge1xuICAgICAgICAgIGYgPSAoYiAmIGMpIHwgKGQgJiAoYiB8IGMpKTtcbiAgICAgICAgICBrID0gMHg4ZjFiYmNkYztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmID0gYiBeIGMgXiBkO1xuICAgICAgICAgIGsgPSAweGNhNjJjMWQ2O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHQgPSAoKChhIDw8IDUpIHwgKGEgPj4+IDI3KSkgKyBmICsgZSArIGsgKyBXW2ldKSAmIDB4ZmZmZmZmZmY7XG4gICAgICBlID0gZDtcbiAgICAgIGQgPSBjO1xuICAgICAgYyA9ICgoYiA8PCAzMCkgfCAoYiA+Pj4gMikpICYgMHhmZmZmZmZmZjtcbiAgICAgIGIgPSBhO1xuICAgICAgYSA9IHQ7XG4gICAgfVxuXG4gICAgdGhpcy5jaGFpbl9bMF0gPSAodGhpcy5jaGFpbl9bMF0gKyBhKSAmIDB4ZmZmZmZmZmY7XG4gICAgdGhpcy5jaGFpbl9bMV0gPSAodGhpcy5jaGFpbl9bMV0gKyBiKSAmIDB4ZmZmZmZmZmY7XG4gICAgdGhpcy5jaGFpbl9bMl0gPSAodGhpcy5jaGFpbl9bMl0gKyBjKSAmIDB4ZmZmZmZmZmY7XG4gICAgdGhpcy5jaGFpbl9bM10gPSAodGhpcy5jaGFpbl9bM10gKyBkKSAmIDB4ZmZmZmZmZmY7XG4gICAgdGhpcy5jaGFpbl9bNF0gPSAodGhpcy5jaGFpbl9bNF0gKyBlKSAmIDB4ZmZmZmZmZmY7XG4gIH1cblxuICB1cGRhdGUoYnl0ZXM/OiBudW1iZXJbXSB8IFVpbnQ4QXJyYXkgfCBzdHJpbmcsIGxlbmd0aD86IG51bWJlcik6IHZvaWQge1xuICAgIC8vIFRPRE8oam9obmxlbnopOiB0aWdodGVuIHRoZSBmdW5jdGlvbiBzaWduYXR1cmUgYW5kIHJlbW92ZSB0aGlzIGNoZWNrXG4gICAgaWYgKGJ5dGVzID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGxlbmd0aCA9IGJ5dGVzLmxlbmd0aDtcbiAgICB9XG5cbiAgICBjb25zdCBsZW5ndGhNaW51c0Jsb2NrID0gbGVuZ3RoIC0gdGhpcy5ibG9ja1NpemU7XG4gICAgbGV0IG4gPSAwO1xuICAgIC8vIFVzaW5nIGxvY2FsIGluc3RlYWQgb2YgbWVtYmVyIHZhcmlhYmxlcyBnaXZlcyB+NSUgc3BlZWR1cCBvbiBGaXJlZm94IDE2LlxuICAgIGNvbnN0IGJ1ZiA9IHRoaXMuYnVmXztcbiAgICBsZXQgaW5idWYgPSB0aGlzLmluYnVmXztcblxuICAgIC8vIFRoZSBvdXRlciB3aGlsZSBsb29wIHNob3VsZCBleGVjdXRlIGF0IG1vc3QgdHdpY2UuXG4gICAgd2hpbGUgKG4gPCBsZW5ndGgpIHtcbiAgICAgIC8vIFdoZW4gd2UgaGF2ZSBubyBkYXRhIGluIHRoZSBibG9jayB0byB0b3AgdXAsIHdlIGNhbiBkaXJlY3RseSBwcm9jZXNzIHRoZVxuICAgICAgLy8gaW5wdXQgYnVmZmVyIChhc3N1bWluZyBpdCBjb250YWlucyBzdWZmaWNpZW50IGRhdGEpLiBUaGlzIGdpdmVzIH4yNSVcbiAgICAgIC8vIHNwZWVkdXAgb24gQ2hyb21lIDIzIGFuZCB+MTUlIHNwZWVkdXAgb24gRmlyZWZveCAxNiwgYnV0IHJlcXVpcmVzIHRoYXRcbiAgICAgIC8vIHRoZSBkYXRhIGlzIHByb3ZpZGVkIGluIGxhcmdlIGNodW5rcyAob3IgaW4gbXVsdGlwbGVzIG9mIDY0IGJ5dGVzKS5cbiAgICAgIGlmIChpbmJ1ZiA9PT0gMCkge1xuICAgICAgICB3aGlsZSAobiA8PSBsZW5ndGhNaW51c0Jsb2NrKSB7XG4gICAgICAgICAgdGhpcy5jb21wcmVzc18oYnl0ZXMsIG4pO1xuICAgICAgICAgIG4gKz0gdGhpcy5ibG9ja1NpemU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBieXRlcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgd2hpbGUgKG4gPCBsZW5ndGgpIHtcbiAgICAgICAgICBidWZbaW5idWZdID0gYnl0ZXMuY2hhckNvZGVBdChuKTtcbiAgICAgICAgICArK2luYnVmO1xuICAgICAgICAgICsrbjtcbiAgICAgICAgICBpZiAoaW5idWYgPT09IHRoaXMuYmxvY2tTaXplKSB7XG4gICAgICAgICAgICB0aGlzLmNvbXByZXNzXyhidWYpO1xuICAgICAgICAgICAgaW5idWYgPSAwO1xuICAgICAgICAgICAgLy8gSnVtcCB0byB0aGUgb3V0ZXIgbG9vcCBzbyB3ZSB1c2UgdGhlIGZ1bGwtYmxvY2sgb3B0aW1pemF0aW9uLlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aGlsZSAobiA8IGxlbmd0aCkge1xuICAgICAgICAgIGJ1ZltpbmJ1Zl0gPSBieXRlc1tuXTtcbiAgICAgICAgICArK2luYnVmO1xuICAgICAgICAgICsrbjtcbiAgICAgICAgICBpZiAoaW5idWYgPT09IHRoaXMuYmxvY2tTaXplKSB7XG4gICAgICAgICAgICB0aGlzLmNvbXByZXNzXyhidWYpO1xuICAgICAgICAgICAgaW5idWYgPSAwO1xuICAgICAgICAgICAgLy8gSnVtcCB0byB0aGUgb3V0ZXIgbG9vcCBzbyB3ZSB1c2UgdGhlIGZ1bGwtYmxvY2sgb3B0aW1pemF0aW9uLlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5pbmJ1Zl8gPSBpbmJ1ZjtcbiAgICB0aGlzLnRvdGFsXyArPSBsZW5ndGg7XG4gIH1cblxuICAvKiogQG92ZXJyaWRlICovXG4gIGRpZ2VzdCgpOiBudW1iZXJbXSB7XG4gICAgY29uc3QgZGlnZXN0OiBudW1iZXJbXSA9IFtdO1xuICAgIGxldCB0b3RhbEJpdHMgPSB0aGlzLnRvdGFsXyAqIDg7XG5cbiAgICAvLyBBZGQgcGFkIDB4ODAgMHgwMCouXG4gICAgaWYgKHRoaXMuaW5idWZfIDwgNTYpIHtcbiAgICAgIHRoaXMudXBkYXRlKHRoaXMucGFkXywgNTYgLSB0aGlzLmluYnVmXyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudXBkYXRlKHRoaXMucGFkXywgdGhpcy5ibG9ja1NpemUgLSAodGhpcy5pbmJ1Zl8gLSA1NikpO1xuICAgIH1cblxuICAgIC8vIEFkZCAjIGJpdHMuXG4gICAgZm9yIChsZXQgaSA9IHRoaXMuYmxvY2tTaXplIC0gMTsgaSA+PSA1NjsgaS0tKSB7XG4gICAgICB0aGlzLmJ1Zl9baV0gPSB0b3RhbEJpdHMgJiAyNTU7XG4gICAgICB0b3RhbEJpdHMgLz0gMjU2OyAvLyBEb24ndCB1c2UgYml0LXNoaWZ0aW5nIGhlcmUhXG4gICAgfVxuXG4gICAgdGhpcy5jb21wcmVzc18odGhpcy5idWZfKTtcblxuICAgIGxldCBuID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDU7IGkrKykge1xuICAgICAgZm9yIChsZXQgaiA9IDI0OyBqID49IDA7IGogLT0gOCkge1xuICAgICAgICBkaWdlc3Rbbl0gPSAodGhpcy5jaGFpbl9baV0gPj4gaikgJiAyNTU7XG4gICAgICAgICsrbjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRpZ2VzdDtcbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5leHBvcnQgdHlwZSBOZXh0Rm48VD4gPSAodmFsdWU6IFQpID0+IHZvaWQ7XG5leHBvcnQgdHlwZSBFcnJvckZuID0gKGVycm9yOiBFcnJvcikgPT4gdm9pZDtcbmV4cG9ydCB0eXBlIENvbXBsZXRlRm4gPSAoKSA9PiB2b2lkO1xuXG5leHBvcnQgaW50ZXJmYWNlIE9ic2VydmVyPFQ+IHtcbiAgLy8gQ2FsbGVkIG9uY2UgZm9yIGVhY2ggdmFsdWUgaW4gYSBzdHJlYW0gb2YgdmFsdWVzLlxuICBuZXh0OiBOZXh0Rm48VD47XG5cbiAgLy8gQSBzdHJlYW0gdGVybWluYXRlcyBieSBhIHNpbmdsZSBjYWxsIHRvIEVJVEhFUiBlcnJvcigpIG9yIGNvbXBsZXRlKCkuXG4gIGVycm9yOiBFcnJvckZuO1xuXG4gIC8vIE5vIGV2ZW50cyB3aWxsIGJlIHNlbnQgdG8gbmV4dCgpIG9uY2UgY29tcGxldGUoKSBpcyBjYWxsZWQuXG4gIGNvbXBsZXRlOiBDb21wbGV0ZUZuO1xufVxuXG5leHBvcnQgdHlwZSBQYXJ0aWFsT2JzZXJ2ZXI8VD4gPSBQYXJ0aWFsPE9ic2VydmVyPFQ+PjtcblxuLy8gVE9ETzogU3VwcG9ydCBhbHNvIFVuc3Vic2NyaWJlLnVuc3Vic2NyaWJlP1xuZXhwb3J0IHR5cGUgVW5zdWJzY3JpYmUgPSAoKSA9PiB2b2lkO1xuXG4vKipcbiAqIFRoZSBTdWJzY3JpYmUgaW50ZXJmYWNlIGhhcyB0d28gZm9ybXMgLSBwYXNzaW5nIHRoZSBpbmxpbmUgZnVuY3Rpb25cbiAqIGNhbGxiYWNrcywgb3IgYSBvYmplY3QgaW50ZXJmYWNlIHdpdGggY2FsbGJhY2sgcHJvcGVydGllcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdWJzY3JpYmU8VD4ge1xuICAobmV4dD86IE5leHRGbjxUPiwgZXJyb3I/OiBFcnJvckZuLCBjb21wbGV0ZT86IENvbXBsZXRlRm4pOiBVbnN1YnNjcmliZTtcbiAgKG9ic2VydmVyOiBQYXJ0aWFsT2JzZXJ2ZXI8VD4pOiBVbnN1YnNjcmliZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPYnNlcnZhYmxlPFQ+IHtcbiAgLy8gU3Vic2NyaWJlIG1ldGhvZFxuICBzdWJzY3JpYmU6IFN1YnNjcmliZTxUPjtcbn1cblxuZXhwb3J0IHR5cGUgRXhlY3V0b3I8VD4gPSAob2JzZXJ2ZXI6IE9ic2VydmVyPFQ+KSA9PiB2b2lkO1xuXG4vKipcbiAqIEhlbHBlciB0byBtYWtlIGEgU3Vic2NyaWJlIGZ1bmN0aW9uIChqdXN0IGxpa2UgUHJvbWlzZSBoZWxwcyBtYWtlIGFcbiAqIFRoZW5hYmxlKS5cbiAqXG4gKiBAcGFyYW0gZXhlY3V0b3IgRnVuY3Rpb24gd2hpY2ggY2FuIG1ha2UgY2FsbHMgdG8gYSBzaW5nbGUgT2JzZXJ2ZXJcbiAqICAgICBhcyBhIHByb3h5LlxuICogQHBhcmFtIG9uTm9PYnNlcnZlcnMgQ2FsbGJhY2sgd2hlbiBjb3VudCBvZiBPYnNlcnZlcnMgZ29lcyB0byB6ZXJvLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU3Vic2NyaWJlPFQ+KFxuICBleGVjdXRvcjogRXhlY3V0b3I8VD4sXG4gIG9uTm9PYnNlcnZlcnM/OiBFeGVjdXRvcjxUPlxuKTogU3Vic2NyaWJlPFQ+IHtcbiAgY29uc3QgcHJveHkgPSBuZXcgT2JzZXJ2ZXJQcm94eTxUPihleGVjdXRvciwgb25Ob09ic2VydmVycyk7XG4gIHJldHVybiBwcm94eS5zdWJzY3JpYmUuYmluZChwcm94eSk7XG59XG5cbi8qKlxuICogSW1wbGVtZW50IGZhbi1vdXQgZm9yIGFueSBudW1iZXIgb2YgT2JzZXJ2ZXJzIGF0dGFjaGVkIHZpYSBhIHN1YnNjcmliZVxuICogZnVuY3Rpb24uXG4gKi9cbmNsYXNzIE9ic2VydmVyUHJveHk8VD4gaW1wbGVtZW50cyBPYnNlcnZlcjxUPiB7XG4gIHByaXZhdGUgb2JzZXJ2ZXJzOiBBcnJheTxPYnNlcnZlcjxUPj4gfCB1bmRlZmluZWQgPSBbXTtcbiAgcHJpdmF0ZSB1bnN1YnNjcmliZXM6IFVuc3Vic2NyaWJlW10gPSBbXTtcbiAgcHJpdmF0ZSBvbk5vT2JzZXJ2ZXJzOiBFeGVjdXRvcjxUPiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBvYnNlcnZlckNvdW50ID0gMDtcbiAgLy8gTWljcm8tdGFzayBzY2hlZHVsaW5nIGJ5IGNhbGxpbmcgdGFzay50aGVuKCkuXG4gIHByaXZhdGUgdGFzayA9IFByb21pc2UucmVzb2x2ZSgpO1xuICBwcml2YXRlIGZpbmFsaXplZCA9IGZhbHNlO1xuICBwcml2YXRlIGZpbmFsRXJyb3I/OiBFcnJvcjtcblxuICAvKipcbiAgICogQHBhcmFtIGV4ZWN1dG9yIEZ1bmN0aW9uIHdoaWNoIGNhbiBtYWtlIGNhbGxzIHRvIGEgc2luZ2xlIE9ic2VydmVyXG4gICAqICAgICBhcyBhIHByb3h5LlxuICAgKiBAcGFyYW0gb25Ob09ic2VydmVycyBDYWxsYmFjayB3aGVuIGNvdW50IG9mIE9ic2VydmVycyBnb2VzIHRvIHplcm8uXG4gICAqL1xuICBjb25zdHJ1Y3RvcihleGVjdXRvcjogRXhlY3V0b3I8VD4sIG9uTm9PYnNlcnZlcnM/OiBFeGVjdXRvcjxUPikge1xuICAgIHRoaXMub25Ob09ic2VydmVycyA9IG9uTm9PYnNlcnZlcnM7XG4gICAgLy8gQ2FsbCB0aGUgZXhlY3V0b3IgYXN5bmNocm9ub3VzbHkgc28gc3Vic2NyaWJlcnMgdGhhdCBhcmUgY2FsbGVkXG4gICAgLy8gc3luY2hyb25vdXNseSBhZnRlciB0aGUgY3JlYXRpb24gb2YgdGhlIHN1YnNjcmliZSBmdW5jdGlvblxuICAgIC8vIGNhbiBzdGlsbCByZWNlaXZlIHRoZSB2ZXJ5IGZpcnN0IHZhbHVlIGdlbmVyYXRlZCBpbiB0aGUgZXhlY3V0b3IuXG4gICAgdGhpcy50YXNrXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIGV4ZWN1dG9yKHRoaXMpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlID0+IHtcbiAgICAgICAgdGhpcy5lcnJvcihlKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgbmV4dCh2YWx1ZTogVCk6IHZvaWQge1xuICAgIHRoaXMuZm9yRWFjaE9ic2VydmVyKChvYnNlcnZlcjogT2JzZXJ2ZXI8VD4pID0+IHtcbiAgICAgIG9ic2VydmVyLm5leHQodmFsdWUpO1xuICAgIH0pO1xuICB9XG5cbiAgZXJyb3IoZXJyb3I6IEVycm9yKTogdm9pZCB7XG4gICAgdGhpcy5mb3JFYWNoT2JzZXJ2ZXIoKG9ic2VydmVyOiBPYnNlcnZlcjxUPikgPT4ge1xuICAgICAgb2JzZXJ2ZXIuZXJyb3IoZXJyb3IpO1xuICAgIH0pO1xuICAgIHRoaXMuY2xvc2UoZXJyb3IpO1xuICB9XG5cbiAgY29tcGxldGUoKTogdm9pZCB7XG4gICAgdGhpcy5mb3JFYWNoT2JzZXJ2ZXIoKG9ic2VydmVyOiBPYnNlcnZlcjxUPikgPT4ge1xuICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICB9KTtcbiAgICB0aGlzLmNsb3NlKCk7XG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gYWRkIGFuIE9ic2VydmVyIHRvIHRoZSBmYW4tb3V0IGxpc3QuXG4gICAqXG4gICAqIC0gV2UgcmVxdWlyZSB0aGF0IG5vIGV2ZW50IGlzIHNlbnQgdG8gYSBzdWJzY3JpYmVyIHN5Y2hyb25vdXNseSB0byB0aGVpclxuICAgKiAgIGNhbGwgdG8gc3Vic2NyaWJlKCkuXG4gICAqL1xuICBzdWJzY3JpYmUoXG4gICAgbmV4dE9yT2JzZXJ2ZXI/OiBOZXh0Rm48VD4gfCBQYXJ0aWFsT2JzZXJ2ZXI8VD4sXG4gICAgZXJyb3I/OiBFcnJvckZuLFxuICAgIGNvbXBsZXRlPzogQ29tcGxldGVGblxuICApOiBVbnN1YnNjcmliZSB7XG4gICAgbGV0IG9ic2VydmVyOiBPYnNlcnZlcjxUPjtcblxuICAgIGlmIChcbiAgICAgIG5leHRPck9ic2VydmVyID09PSB1bmRlZmluZWQgJiZcbiAgICAgIGVycm9yID09PSB1bmRlZmluZWQgJiZcbiAgICAgIGNvbXBsZXRlID09PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBPYnNlcnZlci4nKTtcbiAgICB9XG5cbiAgICAvLyBBc3NlbWJsZSBhbiBPYnNlcnZlciBvYmplY3Qgd2hlbiBwYXNzZWQgYXMgY2FsbGJhY2sgZnVuY3Rpb25zLlxuICAgIGlmIChcbiAgICAgIGltcGxlbWVudHNBbnlNZXRob2RzKG5leHRPck9ic2VydmVyIGFzIHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9LCBbXG4gICAgICAgICduZXh0JyxcbiAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgJ2NvbXBsZXRlJ1xuICAgICAgXSlcbiAgICApIHtcbiAgICAgIG9ic2VydmVyID0gbmV4dE9yT2JzZXJ2ZXIgYXMgT2JzZXJ2ZXI8VD47XG4gICAgfSBlbHNlIHtcbiAgICAgIG9ic2VydmVyID0ge1xuICAgICAgICBuZXh0OiBuZXh0T3JPYnNlcnZlciBhcyBOZXh0Rm48VD4sXG4gICAgICAgIGVycm9yLFxuICAgICAgICBjb21wbGV0ZVxuICAgICAgfSBhcyBPYnNlcnZlcjxUPjtcbiAgICB9XG5cbiAgICBpZiAob2JzZXJ2ZXIubmV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBvYnNlcnZlci5uZXh0ID0gbm9vcCBhcyBOZXh0Rm48VD47XG4gICAgfVxuICAgIGlmIChvYnNlcnZlci5lcnJvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBvYnNlcnZlci5lcnJvciA9IG5vb3AgYXMgRXJyb3JGbjtcbiAgICB9XG4gICAgaWYgKG9ic2VydmVyLmNvbXBsZXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIG9ic2VydmVyLmNvbXBsZXRlID0gbm9vcCBhcyBDb21wbGV0ZUZuO1xuICAgIH1cblxuICAgIGNvbnN0IHVuc3ViID0gdGhpcy51bnN1YnNjcmliZU9uZS5iaW5kKHRoaXMsIHRoaXMub2JzZXJ2ZXJzIS5sZW5ndGgpO1xuXG4gICAgLy8gQXR0ZW1wdCB0byBzdWJzY3JpYmUgdG8gYSB0ZXJtaW5hdGVkIE9ic2VydmFibGUgLSB3ZVxuICAgIC8vIGp1c3QgcmVzcG9uZCB0byB0aGUgT2JzZXJ2ZXIgd2l0aCB0aGUgZmluYWwgZXJyb3Igb3IgY29tcGxldGVcbiAgICAvLyBldmVudC5cbiAgICBpZiAodGhpcy5maW5hbGl6ZWQpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZmxvYXRpbmctcHJvbWlzZXNcbiAgICAgIHRoaXMudGFzay50aGVuKCgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAodGhpcy5maW5hbEVycm9yKSB7XG4gICAgICAgICAgICBvYnNlcnZlci5lcnJvcih0aGlzLmZpbmFsRXJyb3IpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vIG5vdGhpbmdcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLm9ic2VydmVycyEucHVzaChvYnNlcnZlciBhcyBPYnNlcnZlcjxUPik7XG5cbiAgICByZXR1cm4gdW5zdWI7XG4gIH1cblxuICAvLyBVbnN1YnNjcmliZSBpcyBzeW5jaHJvbm91cyAtIHdlIGd1YXJhbnRlZSB0aGF0IG5vIGV2ZW50cyBhcmUgc2VudCB0b1xuICAvLyBhbnkgdW5zdWJzY3JpYmVkIE9ic2VydmVyLlxuICBwcml2YXRlIHVuc3Vic2NyaWJlT25lKGk6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLm9ic2VydmVycyA9PT0gdW5kZWZpbmVkIHx8IHRoaXMub2JzZXJ2ZXJzW2ldID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkZWxldGUgdGhpcy5vYnNlcnZlcnNbaV07XG5cbiAgICB0aGlzLm9ic2VydmVyQ291bnQgLT0gMTtcbiAgICBpZiAodGhpcy5vYnNlcnZlckNvdW50ID09PSAwICYmIHRoaXMub25Ob09ic2VydmVycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLm9uTm9PYnNlcnZlcnModGhpcyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmb3JFYWNoT2JzZXJ2ZXIoZm46IChvYnNlcnZlcjogT2JzZXJ2ZXI8VD4pID0+IHZvaWQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5maW5hbGl6ZWQpIHtcbiAgICAgIC8vIEFscmVhZHkgY2xvc2VkIGJ5IHByZXZpb3VzIGV2ZW50Li4uLmp1c3QgZWF0IHRoZSBhZGRpdGlvbmFsIHZhbHVlcy5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTaW5jZSBzZW5kT25lIGNhbGxzIGFzeW5jaHJvbm91c2x5IC0gdGhlcmUgaXMgbm8gY2hhbmNlIHRoYXRcbiAgICAvLyB0aGlzLm9ic2VydmVycyB3aWxsIGJlY29tZSB1bmRlZmluZWQuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9ic2VydmVycyEubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuc2VuZE9uZShpLCBmbik7XG4gICAgfVxuICB9XG5cbiAgLy8gQ2FsbCB0aGUgT2JzZXJ2ZXIgdmlhIG9uZSBvZiBpdCdzIGNhbGxiYWNrIGZ1bmN0aW9uLiBXZSBhcmUgY2FyZWZ1bCB0b1xuICAvLyBjb25maXJtIHRoYXQgdGhlIG9ic2VydmUgaGFzIG5vdCBiZWVuIHVuc3Vic2NyaWJlZCBzaW5jZSB0aGlzIGFzeW5jaHJvbm91c1xuICAvLyBmdW5jdGlvbiBoYWQgYmVlbiBxdWV1ZWQuXG4gIHByaXZhdGUgc2VuZE9uZShpOiBudW1iZXIsIGZuOiAob2JzZXJ2ZXI6IE9ic2VydmVyPFQ+KSA9PiB2b2lkKTogdm9pZCB7XG4gICAgLy8gRXhlY3V0ZSB0aGUgY2FsbGJhY2sgYXN5bmNocm9ub3VzbHlcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWZsb2F0aW5nLXByb21pc2VzXG4gICAgdGhpcy50YXNrLnRoZW4oKCkgPT4ge1xuICAgICAgaWYgKHRoaXMub2JzZXJ2ZXJzICE9PSB1bmRlZmluZWQgJiYgdGhpcy5vYnNlcnZlcnNbaV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGZuKHRoaXMub2JzZXJ2ZXJzW2ldKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vIElnbm9yZSBleGNlcHRpb25zIHJhaXNlZCBpbiBPYnNlcnZlcnMgb3IgbWlzc2luZyBtZXRob2RzIG9mIGFuXG4gICAgICAgICAgLy8gT2JzZXJ2ZXIuXG4gICAgICAgICAgLy8gTG9nIGVycm9yIHRvIGNvbnNvbGUuIGIvMzE0MDQ4MDZcbiAgICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIGNvbnNvbGUuZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNsb3NlKGVycj86IEVycm9yKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZmluYWxpemVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZmluYWxpemVkID0gdHJ1ZTtcbiAgICBpZiAoZXJyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZmluYWxFcnJvciA9IGVycjtcbiAgICB9XG4gICAgLy8gUHJveHkgaXMgbm8gbG9uZ2VyIG5lZWRlZCAtIGdhcmJhZ2UgY29sbGVjdCByZWZlcmVuY2VzXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1mbG9hdGluZy1wcm9taXNlc1xuICAgIHRoaXMudGFzay50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMub2JzZXJ2ZXJzID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5vbk5vT2JzZXJ2ZXJzID0gdW5kZWZpbmVkO1xuICAgIH0pO1xuICB9XG59XG5cbi8qKiBUdXJuIHN5bmNocm9ub3VzIGZ1bmN0aW9uIGludG8gb25lIGNhbGxlZCBhc3luY2hyb25vdXNseS4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXR5cGVzXG5leHBvcnQgZnVuY3Rpb24gYXN5bmMoZm46IEZ1bmN0aW9uLCBvbkVycm9yPzogRXJyb3JGbik6IEZ1bmN0aW9uIHtcbiAgcmV0dXJuICguLi5hcmdzOiB1bmtub3duW10pID0+IHtcbiAgICBQcm9taXNlLnJlc29sdmUodHJ1ZSlcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgZm4oLi4uYXJncyk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgaWYgKG9uRXJyb3IpIHtcbiAgICAgICAgICBvbkVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH07XG59XG5cbi8qKlxuICogUmV0dXJuIHRydWUgaWYgdGhlIG9iamVjdCBwYXNzZWQgaW4gaW1wbGVtZW50cyBhbnkgb2YgdGhlIG5hbWVkIG1ldGhvZHMuXG4gKi9cbmZ1bmN0aW9uIGltcGxlbWVudHNBbnlNZXRob2RzKFxuICBvYmo6IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9LFxuICBtZXRob2RzOiBzdHJpbmdbXVxuKTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCBvYmogPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmb3IgKGNvbnN0IG1ldGhvZCBvZiBtZXRob2RzKSB7XG4gICAgaWYgKG1ldGhvZCBpbiBvYmogJiYgdHlwZW9mIG9ialttZXRob2RdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG5vb3AoKTogdm9pZCB7XG4gIC8vIGRvIG5vdGhpbmdcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4vKipcbiAqIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQgZm9yIGEgcHVibGljIGZ1bmN0aW9uLlxuICogVGhyb3dzIGFuIGVycm9yIGlmIGl0IGZhaWxzLlxuICpcbiAqIEBwYXJhbSBmbk5hbWUgVGhlIGZ1bmN0aW9uIG5hbWVcbiAqIEBwYXJhbSBtaW5Db3VudCBUaGUgbWluaW11bSBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGFsbG93IGZvciB0aGUgZnVuY3Rpb24gY2FsbFxuICogQHBhcmFtIG1heENvdW50IFRoZSBtYXhpbXVtIG51bWJlciBvZiBhcmd1bWVudCB0byBhbGxvdyBmb3IgdGhlIGZ1bmN0aW9uIGNhbGxcbiAqIEBwYXJhbSBhcmdDb3VudCBUaGUgYWN0dWFsIG51bWJlciBvZiBhcmd1bWVudHMgcHJvdmlkZWQuXG4gKi9cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUFyZ0NvdW50ID0gZnVuY3Rpb24gKFxuICBmbk5hbWU6IHN0cmluZyxcbiAgbWluQ291bnQ6IG51bWJlcixcbiAgbWF4Q291bnQ6IG51bWJlcixcbiAgYXJnQ291bnQ6IG51bWJlclxuKTogdm9pZCB7XG4gIGxldCBhcmdFcnJvcjtcbiAgaWYgKGFyZ0NvdW50IDwgbWluQ291bnQpIHtcbiAgICBhcmdFcnJvciA9ICdhdCBsZWFzdCAnICsgbWluQ291bnQ7XG4gIH0gZWxzZSBpZiAoYXJnQ291bnQgPiBtYXhDb3VudCkge1xuICAgIGFyZ0Vycm9yID0gbWF4Q291bnQgPT09IDAgPyAnbm9uZScgOiAnbm8gbW9yZSB0aGFuICcgKyBtYXhDb3VudDtcbiAgfVxuICBpZiAoYXJnRXJyb3IpIHtcbiAgICBjb25zdCBlcnJvciA9XG4gICAgICBmbk5hbWUgK1xuICAgICAgJyBmYWlsZWQ6IFdhcyBjYWxsZWQgd2l0aCAnICtcbiAgICAgIGFyZ0NvdW50ICtcbiAgICAgIChhcmdDb3VudCA9PT0gMSA/ICcgYXJndW1lbnQuJyA6ICcgYXJndW1lbnRzLicpICtcbiAgICAgICcgRXhwZWN0cyAnICtcbiAgICAgIGFyZ0Vycm9yICtcbiAgICAgICcuJztcbiAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3IpO1xuICB9XG59O1xuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHN0cmluZyB0byBwcmVmaXggYW4gZXJyb3IgbWVzc2FnZSBhYm91dCBmYWlsZWQgYXJndW1lbnQgdmFsaWRhdGlvblxuICpcbiAqIEBwYXJhbSBmbk5hbWUgVGhlIGZ1bmN0aW9uIG5hbWVcbiAqIEBwYXJhbSBhcmdOYW1lIFRoZSBuYW1lIG9mIHRoZSBhcmd1bWVudFxuICogQHJldHVybiBUaGUgcHJlZml4IHRvIGFkZCB0byB0aGUgZXJyb3IgdGhyb3duIGZvciB2YWxpZGF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXJyb3JQcmVmaXgoZm5OYW1lOiBzdHJpbmcsIGFyZ05hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtmbk5hbWV9IGZhaWxlZDogJHthcmdOYW1lfSBhcmd1bWVudCBgO1xufVxuXG4vKipcbiAqIEBwYXJhbSBmbk5hbWVcbiAqIEBwYXJhbSBhcmd1bWVudE51bWJlclxuICogQHBhcmFtIG5hbWVzcGFjZVxuICogQHBhcmFtIG9wdGlvbmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZU5hbWVzcGFjZShcbiAgZm5OYW1lOiBzdHJpbmcsXG4gIG5hbWVzcGFjZTogc3RyaW5nLFxuICBvcHRpb25hbDogYm9vbGVhblxuKTogdm9pZCB7XG4gIGlmIChvcHRpb25hbCAmJiAhbmFtZXNwYWNlKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICh0eXBlb2YgbmFtZXNwYWNlICE9PSAnc3RyaW5nJykge1xuICAgIC8vVE9ETzogSSBzaG91bGQgZG8gbW9yZSB2YWxpZGF0aW9uIGhlcmUuIFdlIG9ubHkgYWxsb3cgY2VydGFpbiBjaGFycyBpbiBuYW1lc3BhY2VzLlxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGVycm9yUHJlZml4KGZuTmFtZSwgJ25hbWVzcGFjZScpICsgJ211c3QgYmUgYSB2YWxpZCBmaXJlYmFzZSBuYW1lc3BhY2UuJ1xuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlQ2FsbGJhY2soXG4gIGZuTmFtZTogc3RyaW5nLFxuICBhcmd1bWVudE5hbWU6IHN0cmluZyxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHlwZXNcbiAgY2FsbGJhY2s6IEZ1bmN0aW9uLFxuICBvcHRpb25hbDogYm9vbGVhblxuKTogdm9pZCB7XG4gIGlmIChvcHRpb25hbCAmJiAhY2FsbGJhY2spIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGVycm9yUHJlZml4KGZuTmFtZSwgYXJndW1lbnROYW1lKSArICdtdXN0IGJlIGEgdmFsaWQgZnVuY3Rpb24uJ1xuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlQ29udGV4dE9iamVjdChcbiAgZm5OYW1lOiBzdHJpbmcsXG4gIGFyZ3VtZW50TmFtZTogc3RyaW5nLFxuICBjb250ZXh0OiB1bmtub3duLFxuICBvcHRpb25hbDogYm9vbGVhblxuKTogdm9pZCB7XG4gIGlmIChvcHRpb25hbCAmJiAhY29udGV4dCkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAodHlwZW9mIGNvbnRleHQgIT09ICdvYmplY3QnIHx8IGNvbnRleHQgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBlcnJvclByZWZpeChmbk5hbWUsIGFyZ3VtZW50TmFtZSkgKyAnbXVzdCBiZSBhIHZhbGlkIGNvbnRleHQgb2JqZWN0LidcbiAgICApO1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi9hc3NlcnQnO1xuXG4vLyBDb2RlIG9yaWdpbmFsbHkgY2FtZSBmcm9tIGdvb2cuY3J5cHQuc3RyaW5nVG9VdGY4Qnl0ZUFycmF5LCBidXQgZm9yIHNvbWUgcmVhc29uIHRoZXlcbi8vIGF1dG9tYXRpY2FsbHkgcmVwbGFjZWQgJ1xcclxcbicgd2l0aCAnXFxuJywgYW5kIHRoZXkgZGlkbid0IGhhbmRsZSBzdXJyb2dhdGUgcGFpcnMsXG4vLyBzbyBpdCdzIGJlZW4gbW9kaWZpZWQuXG5cbi8vIE5vdGUgdGhhdCBub3QgYWxsIFVuaWNvZGUgY2hhcmFjdGVycyBhcHBlYXIgYXMgc2luZ2xlIGNoYXJhY3RlcnMgaW4gSmF2YVNjcmlwdCBzdHJpbmdzLlxuLy8gZnJvbUNoYXJDb2RlIHJldHVybnMgdGhlIFVURi0xNiBlbmNvZGluZyBvZiBhIGNoYXJhY3RlciAtIHNvIHNvbWUgVW5pY29kZSBjaGFyYWN0ZXJzXG4vLyB1c2UgMiBjaGFyYWN0ZXJzIGluIEphdmFzY3JpcHQuICBBbGwgNC1ieXRlIFVURi04IGNoYXJhY3RlcnMgYmVnaW4gd2l0aCBhIGZpcnN0XG4vLyBjaGFyYWN0ZXIgaW4gdGhlIHJhbmdlIDB4RDgwMCAtIDB4REJGRiAodGhlIGZpcnN0IGNoYXJhY3RlciBvZiBhIHNvLWNhbGxlZCBzdXJyb2dhdGVcbi8vIHBhaXIpLlxuLy8gU2VlIGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi81LjEvI3NlYy0xNS4xLjNcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqL1xuZXhwb3J0IGNvbnN0IHN0cmluZ1RvQnl0ZUFycmF5ID0gZnVuY3Rpb24gKHN0cjogc3RyaW5nKTogbnVtYmVyW10ge1xuICBjb25zdCBvdXQ6IG51bWJlcltdID0gW107XG4gIGxldCBwID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICBsZXQgYyA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuXG4gICAgLy8gSXMgdGhpcyB0aGUgbGVhZCBzdXJyb2dhdGUgaW4gYSBzdXJyb2dhdGUgcGFpcj9cbiAgICBpZiAoYyA+PSAweGQ4MDAgJiYgYyA8PSAweGRiZmYpIHtcbiAgICAgIGNvbnN0IGhpZ2ggPSBjIC0gMHhkODAwOyAvLyB0aGUgaGlnaCAxMCBiaXRzLlxuICAgICAgaSsrO1xuICAgICAgYXNzZXJ0KGkgPCBzdHIubGVuZ3RoLCAnU3Vycm9nYXRlIHBhaXIgbWlzc2luZyB0cmFpbCBzdXJyb2dhdGUuJyk7XG4gICAgICBjb25zdCBsb3cgPSBzdHIuY2hhckNvZGVBdChpKSAtIDB4ZGMwMDsgLy8gdGhlIGxvdyAxMCBiaXRzLlxuICAgICAgYyA9IDB4MTAwMDAgKyAoaGlnaCA8PCAxMCkgKyBsb3c7XG4gICAgfVxuXG4gICAgaWYgKGMgPCAxMjgpIHtcbiAgICAgIG91dFtwKytdID0gYztcbiAgICB9IGVsc2UgaWYgKGMgPCAyMDQ4KSB7XG4gICAgICBvdXRbcCsrXSA9IChjID4+IDYpIHwgMTkyO1xuICAgICAgb3V0W3ArK10gPSAoYyAmIDYzKSB8IDEyODtcbiAgICB9IGVsc2UgaWYgKGMgPCA2NTUzNikge1xuICAgICAgb3V0W3ArK10gPSAoYyA+PiAxMikgfCAyMjQ7XG4gICAgICBvdXRbcCsrXSA9ICgoYyA+PiA2KSAmIDYzKSB8IDEyODtcbiAgICAgIG91dFtwKytdID0gKGMgJiA2MykgfCAxMjg7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dFtwKytdID0gKGMgPj4gMTgpIHwgMjQwO1xuICAgICAgb3V0W3ArK10gPSAoKGMgPj4gMTIpICYgNjMpIHwgMTI4O1xuICAgICAgb3V0W3ArK10gPSAoKGMgPj4gNikgJiA2MykgfCAxMjg7XG4gICAgICBvdXRbcCsrXSA9IChjICYgNjMpIHwgMTI4O1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGUgbGVuZ3RoIHdpdGhvdXQgYWN0dWFsbHkgY29udmVydGluZzsgdXNlZnVsIGZvciBkb2luZyBjaGVhcGVyIHZhbGlkYXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBjb25zdCBzdHJpbmdMZW5ndGggPSBmdW5jdGlvbiAoc3RyOiBzdHJpbmcpOiBudW1iZXIge1xuICBsZXQgcCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgYyA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgIGlmIChjIDwgMTI4KSB7XG4gICAgICBwKys7XG4gICAgfSBlbHNlIGlmIChjIDwgMjA0OCkge1xuICAgICAgcCArPSAyO1xuICAgIH0gZWxzZSBpZiAoYyA+PSAweGQ4MDAgJiYgYyA8PSAweGRiZmYpIHtcbiAgICAgIC8vIExlYWQgc3Vycm9nYXRlIG9mIGEgc3Vycm9nYXRlIHBhaXIuICBUaGUgcGFpciB0b2dldGhlciB3aWxsIHRha2UgNCBieXRlcyB0byByZXByZXNlbnQuXG4gICAgICBwICs9IDQ7XG4gICAgICBpKys7IC8vIHNraXAgdHJhaWwgc3Vycm9nYXRlLlxuICAgIH0gZWxzZSB7XG4gICAgICBwICs9IDM7XG4gICAgfVxuICB9XG4gIHJldHVybiBwO1xufTtcbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4vKipcbiAqIENvcGllZCBmcm9tIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMTE3NTIzXG4gKiBHZW5lcmF0ZXMgYSBuZXcgdXVpZC5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHV1aWR2NCA9IGZ1bmN0aW9uICgpOiBzdHJpbmcge1xuICByZXR1cm4gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCBjID0+IHtcbiAgICBjb25zdCByID0gKE1hdGgucmFuZG9tKCkgKiAxNikgfCAwLFxuICAgICAgdiA9IGMgPT09ICd4JyA/IHIgOiAociAmIDB4MykgfCAweDg7XG4gICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpO1xuICB9KTtcbn07XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLyoqXG4gKiBUaGUgYW1vdW50IG9mIG1pbGxpc2Vjb25kcyB0byBleHBvbmVudGlhbGx5IGluY3JlYXNlLlxuICovXG5jb25zdCBERUZBVUxUX0lOVEVSVkFMX01JTExJUyA9IDEwMDA7XG5cbi8qKlxuICogVGhlIGZhY3RvciB0byBiYWNrb2ZmIGJ5LlxuICogU2hvdWxkIGJlIGEgbnVtYmVyIGdyZWF0ZXIgdGhhbiAxLlxuICovXG5jb25zdCBERUZBVUxUX0JBQ0tPRkZfRkFDVE9SID0gMjtcblxuLyoqXG4gKiBUaGUgbWF4aW11bSBtaWxsaXNlY29uZHMgdG8gaW5jcmVhc2UgdG8uXG4gKlxuICogPHA+VmlzaWJsZSBmb3IgdGVzdGluZ1xuICovXG5leHBvcnQgY29uc3QgTUFYX1ZBTFVFX01JTExJUyA9IDQgKiA2MCAqIDYwICogMTAwMDsgLy8gRm91ciBob3VycywgbGlrZSBpT1MgYW5kIEFuZHJvaWQuXG5cbi8qKlxuICogVGhlIHBlcmNlbnRhZ2Ugb2YgYmFja29mZiB0aW1lIHRvIHJhbmRvbWl6ZSBieS5cbiAqIFNlZVxuICogaHR0cDovL2dvL3NhZmUtY2xpZW50LWJlaGF2aW9yI3N0ZXAtMS1kZXRlcm1pbmUtdGhlLWFwcHJvcHJpYXRlLXJldHJ5LWludGVydmFsLXRvLWhhbmRsZS1zcGlrZS10cmFmZmljXG4gKiBmb3IgY29udGV4dC5cbiAqXG4gKiA8cD5WaXNpYmxlIGZvciB0ZXN0aW5nXG4gKi9cbmV4cG9ydCBjb25zdCBSQU5ET01fRkFDVE9SID0gMC41O1xuXG4vKipcbiAqIEJhc2VkIG9uIHRoZSBiYWNrb2ZmIG1ldGhvZCBmcm9tXG4gKiBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2Nsb3N1cmUtbGlicmFyeS9ibG9iL21hc3Rlci9jbG9zdXJlL2dvb2cvbWF0aC9leHBvbmVudGlhbGJhY2tvZmYuanMuXG4gKiBFeHRyYWN0ZWQgaGVyZSBzbyB3ZSBkb24ndCBuZWVkIHRvIHBhc3MgbWV0YWRhdGEgYW5kIGEgc3RhdGVmdWwgRXhwb25lbnRpYWxCYWNrb2ZmIG9iamVjdCBhcm91bmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVCYWNrb2ZmTWlsbGlzKFxuICBiYWNrb2ZmQ291bnQ6IG51bWJlcixcbiAgaW50ZXJ2YWxNaWxsaXM6IG51bWJlciA9IERFRkFVTFRfSU5URVJWQUxfTUlMTElTLFxuICBiYWNrb2ZmRmFjdG9yOiBudW1iZXIgPSBERUZBVUxUX0JBQ0tPRkZfRkFDVE9SXG4pOiBudW1iZXIge1xuICAvLyBDYWxjdWxhdGVzIGFuIGV4cG9uZW50aWFsbHkgaW5jcmVhc2luZyB2YWx1ZS5cbiAgLy8gRGV2aWF0aW9uOiBjYWxjdWxhdGVzIHZhbHVlIGZyb20gY291bnQgYW5kIGEgY29uc3RhbnQgaW50ZXJ2YWwsIHNvIHdlIG9ubHkgbmVlZCB0byBzYXZlIHZhbHVlXG4gIC8vIGFuZCBjb3VudCB0byByZXN0b3JlIHN0YXRlLlxuICBjb25zdCBjdXJyQmFzZVZhbHVlID0gaW50ZXJ2YWxNaWxsaXMgKiBNYXRoLnBvdyhiYWNrb2ZmRmFjdG9yLCBiYWNrb2ZmQ291bnQpO1xuXG4gIC8vIEEgcmFuZG9tIFwiZnV6elwiIHRvIGF2b2lkIHdhdmVzIG9mIHJldHJpZXMuXG4gIC8vIERldmlhdGlvbjogcmFuZG9tRmFjdG9yIGlzIHJlcXVpcmVkLlxuICBjb25zdCByYW5kb21XYWl0ID0gTWF0aC5yb3VuZChcbiAgICAvLyBBIGZyYWN0aW9uIG9mIHRoZSBiYWNrb2ZmIHZhbHVlIHRvIGFkZC9zdWJ0cmFjdC5cbiAgICAvLyBEZXZpYXRpb246IGNoYW5nZXMgbXVsdGlwbGljYXRpb24gb3JkZXIgdG8gaW1wcm92ZSByZWFkYWJpbGl0eS5cbiAgICBSQU5ET01fRkFDVE9SICpcbiAgICAgIGN1cnJCYXNlVmFsdWUgKlxuICAgICAgLy8gQSByYW5kb20gZmxvYXQgKHJvdW5kZWQgdG8gaW50IGJ5IE1hdGgucm91bmQgYWJvdmUpIGluIHRoZSByYW5nZSBbLTEsIDFdLiBEZXRlcm1pbmVzXG4gICAgICAvLyBpZiB3ZSBhZGQgb3Igc3VidHJhY3QuXG4gICAgICAoTWF0aC5yYW5kb20oKSAtIDAuNSkgKlxuICAgICAgMlxuICApO1xuXG4gIC8vIExpbWl0cyBiYWNrb2ZmIHRvIG1heCB0byBhdm9pZCBlZmZlY3RpdmVseSBwZXJtYW5lbnQgYmFja29mZi5cbiAgcmV0dXJuIE1hdGgubWluKE1BWF9WQUxVRV9NSUxMSVMsIGN1cnJCYXNlVmFsdWUgKyByYW5kb21XYWl0KTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4vKipcbiAqIFByb3ZpZGUgRW5nbGlzaCBvcmRpbmFsIGxldHRlcnMgYWZ0ZXIgYSBudW1iZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9yZGluYWwoaTogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoaSkpIHtcbiAgICByZXR1cm4gYCR7aX1gO1xuICB9XG4gIHJldHVybiBpICsgaW5kaWNhdG9yKGkpO1xufVxuXG5mdW5jdGlvbiBpbmRpY2F0b3IoaTogbnVtYmVyKTogc3RyaW5nIHtcbiAgaSA9IE1hdGguYWJzKGkpO1xuICBjb25zdCBjZW50ID0gaSAlIDEwMDtcbiAgaWYgKGNlbnQgPj0gMTAgJiYgY2VudCA8PSAyMCkge1xuICAgIHJldHVybiAndGgnO1xuICB9XG4gIGNvbnN0IGRlYyA9IGkgJSAxMDtcbiAgaWYgKGRlYyA9PT0gMSkge1xuICAgIHJldHVybiAnc3QnO1xuICB9XG4gIGlmIChkZWMgPT09IDIpIHtcbiAgICByZXR1cm4gJ25kJztcbiAgfVxuICBpZiAoZGVjID09PSAzKSB7XG4gICAgcmV0dXJuICdyZCc7XG4gIH1cbiAgcmV0dXJuICd0aCc7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuZXhwb3J0IGludGVyZmFjZSBDb21wYXQ8VD4ge1xuICBfZGVsZWdhdGU6IFQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNb2R1bGFySW5zdGFuY2U8RXhwU2VydmljZT4oXG4gIHNlcnZpY2U6IENvbXBhdDxFeHBTZXJ2aWNlPiB8IEV4cFNlcnZpY2Vcbik6IEV4cFNlcnZpY2Uge1xuICBpZiAoc2VydmljZSAmJiAoc2VydmljZSBhcyBDb21wYXQ8RXhwU2VydmljZT4pLl9kZWxlZ2F0ZSkge1xuICAgIHJldHVybiAoc2VydmljZSBhcyBDb21wYXQ8RXhwU2VydmljZT4pLl9kZWxlZ2F0ZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gc2VydmljZSBhcyBFeHBTZXJ2aWNlO1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7XG4gIEluc3RhbnRpYXRpb25Nb2RlLFxuICBJbnN0YW5jZUZhY3RvcnksXG4gIENvbXBvbmVudFR5cGUsXG4gIERpY3Rpb25hcnksXG4gIE5hbWUsXG4gIG9uSW5zdGFuY2VDcmVhdGVkQ2FsbGJhY2tcbn0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogQ29tcG9uZW50IGZvciBzZXJ2aWNlIG5hbWUgVCwgZS5nLiBgYXV0aGAsIGBhdXRoLWludGVybmFsYFxuICovXG5leHBvcnQgY2xhc3MgQ29tcG9uZW50PFQgZXh0ZW5kcyBOYW1lID0gTmFtZT4ge1xuICBtdWx0aXBsZUluc3RhbmNlcyA9IGZhbHNlO1xuICAvKipcbiAgICogUHJvcGVydGllcyB0byBiZSBhZGRlZCB0byB0aGUgc2VydmljZSBuYW1lc3BhY2VcbiAgICovXG4gIHNlcnZpY2VQcm9wczogRGljdGlvbmFyeSA9IHt9O1xuXG4gIGluc3RhbnRpYXRpb25Nb2RlID0gSW5zdGFudGlhdGlvbk1vZGUuTEFaWTtcblxuICBvbkluc3RhbmNlQ3JlYXRlZDogb25JbnN0YW5jZUNyZWF0ZWRDYWxsYmFjazxUPiB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSBUaGUgcHVibGljIHNlcnZpY2UgbmFtZSwgZS5nLiBhcHAsIGF1dGgsIGZpcmVzdG9yZSwgZGF0YWJhc2VcbiAgICogQHBhcmFtIGluc3RhbmNlRmFjdG9yeSBTZXJ2aWNlIGZhY3RvcnkgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoZSBwdWJsaWMgaW50ZXJmYWNlXG4gICAqIEBwYXJhbSB0eXBlIHdoZXRoZXIgdGhlIHNlcnZpY2UgcHJvdmlkZWQgYnkgdGhlIGNvbXBvbmVudCBpcyBwdWJsaWMgb3IgcHJpdmF0ZVxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkgbmFtZTogVCxcbiAgICByZWFkb25seSBpbnN0YW5jZUZhY3Rvcnk6IEluc3RhbmNlRmFjdG9yeTxUPixcbiAgICByZWFkb25seSB0eXBlOiBDb21wb25lbnRUeXBlXG4gICkge31cblxuICBzZXRJbnN0YW50aWF0aW9uTW9kZShtb2RlOiBJbnN0YW50aWF0aW9uTW9kZSk6IHRoaXMge1xuICAgIHRoaXMuaW5zdGFudGlhdGlvbk1vZGUgPSBtb2RlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0TXVsdGlwbGVJbnN0YW5jZXMobXVsdGlwbGVJbnN0YW5jZXM6IGJvb2xlYW4pOiB0aGlzIHtcbiAgICB0aGlzLm11bHRpcGxlSW5zdGFuY2VzID0gbXVsdGlwbGVJbnN0YW5jZXM7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRTZXJ2aWNlUHJvcHMocHJvcHM6IERpY3Rpb25hcnkpOiB0aGlzIHtcbiAgICB0aGlzLnNlcnZpY2VQcm9wcyA9IHByb3BzO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0SW5zdGFuY2VDcmVhdGVkQ2FsbGJhY2soY2FsbGJhY2s6IG9uSW5zdGFuY2VDcmVhdGVkQ2FsbGJhY2s8VD4pOiB0aGlzIHtcbiAgICB0aGlzLm9uSW5zdGFuY2VDcmVhdGVkID0gY2FsbGJhY2s7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9FTlRSWV9OQU1FID0gJ1tERUZBVUxUXSc7XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgRGVmZXJyZWQgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5pbXBvcnQgeyBDb21wb25lbnRDb250YWluZXIgfSBmcm9tICcuL2NvbXBvbmVudF9jb250YWluZXInO1xuaW1wb3J0IHsgREVGQVVMVF9FTlRSWV9OQU1FIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHtcbiAgSW5pdGlhbGl6ZU9wdGlvbnMsXG4gIEluc3RhbnRpYXRpb25Nb2RlLFxuICBOYW1lLFxuICBOYW1lU2VydmljZU1hcHBpbmcsXG4gIE9uSW5pdENhbGxCYWNrXG59IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnQnO1xuXG4vKipcbiAqIFByb3ZpZGVyIGZvciBpbnN0YW5jZSBmb3Igc2VydmljZSBuYW1lIFQsIGUuZy4gJ2F1dGgnLCAnYXV0aC1pbnRlcm5hbCdcbiAqIE5hbWVTZXJ2aWNlTWFwcGluZ1tUXSBpcyBhbiBhbGlhcyBmb3IgdGhlIHR5cGUgb2YgdGhlIGluc3RhbmNlXG4gKi9cbmV4cG9ydCBjbGFzcyBQcm92aWRlcjxUIGV4dGVuZHMgTmFtZT4ge1xuICBwcml2YXRlIGNvbXBvbmVudDogQ29tcG9uZW50PFQ+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5zdGFuY2VzOiBNYXA8c3RyaW5nLCBOYW1lU2VydmljZU1hcHBpbmdbVF0+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IGluc3RhbmNlc0RlZmVycmVkOiBNYXA8XG4gICAgc3RyaW5nLFxuICAgIERlZmVycmVkPE5hbWVTZXJ2aWNlTWFwcGluZ1tUXT5cbiAgPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnN0YW5jZXNPcHRpb25zOiBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gPVxuICAgIG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBvbkluaXRDYWxsYmFja3M6IE1hcDxzdHJpbmcsIFNldDxPbkluaXRDYWxsQmFjazxUPj4+ID0gbmV3IE1hcCgpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbmFtZTogVCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyXG4gICkge31cblxuICAvKipcbiAgICogQHBhcmFtIGlkZW50aWZpZXIgQSBwcm92aWRlciBjYW4gcHJvdmlkZSBtdWxpdHBsZSBpbnN0YW5jZXMgb2YgYSBzZXJ2aWNlXG4gICAqIGlmIHRoaXMuY29tcG9uZW50Lm11bHRpcGxlSW5zdGFuY2VzIGlzIHRydWUuXG4gICAqL1xuICBnZXQoaWRlbnRpZmllcj86IHN0cmluZyk6IFByb21pc2U8TmFtZVNlcnZpY2VNYXBwaW5nW1RdPiB7XG4gICAgLy8gaWYgbXVsdGlwbGVJbnN0YW5jZXMgaXMgbm90IHN1cHBvcnRlZCwgdXNlIHRoZSBkZWZhdWx0IG5hbWVcbiAgICBjb25zdCBub3JtYWxpemVkSWRlbnRpZmllciA9IHRoaXMubm9ybWFsaXplSW5zdGFuY2VJZGVudGlmaWVyKGlkZW50aWZpZXIpO1xuXG4gICAgaWYgKCF0aGlzLmluc3RhbmNlc0RlZmVycmVkLmhhcyhub3JtYWxpemVkSWRlbnRpZmllcikpIHtcbiAgICAgIGNvbnN0IGRlZmVycmVkID0gbmV3IERlZmVycmVkPE5hbWVTZXJ2aWNlTWFwcGluZ1tUXT4oKTtcbiAgICAgIHRoaXMuaW5zdGFuY2VzRGVmZXJyZWQuc2V0KG5vcm1hbGl6ZWRJZGVudGlmaWVyLCBkZWZlcnJlZCk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5pc0luaXRpYWxpemVkKG5vcm1hbGl6ZWRJZGVudGlmaWVyKSB8fFxuICAgICAgICB0aGlzLnNob3VsZEF1dG9Jbml0aWFsaXplKClcbiAgICAgICkge1xuICAgICAgICAvLyBpbml0aWFsaXplIHRoZSBzZXJ2aWNlIGlmIGl0IGNhbiBiZSBhdXRvLWluaXRpYWxpemVkXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLmdldE9ySW5pdGlhbGl6ZVNlcnZpY2Uoe1xuICAgICAgICAgICAgaW5zdGFuY2VJZGVudGlmaWVyOiBub3JtYWxpemVkSWRlbnRpZmllclxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShpbnN0YW5jZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gd2hlbiB0aGUgaW5zdGFuY2UgZmFjdG9yeSB0aHJvd3MgYW4gZXhjZXB0aW9uIGR1cmluZyBnZXQoKSwgaXQgc2hvdWxkIG5vdCBjYXVzZVxuICAgICAgICAgIC8vIGEgZmF0YWwgZXJyb3IuIFdlIGp1c3QgcmV0dXJuIHRoZSB1bnJlc29sdmVkIHByb21pc2UgaW4gdGhpcyBjYXNlLlxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaW5zdGFuY2VzRGVmZXJyZWQuZ2V0KG5vcm1hbGl6ZWRJZGVudGlmaWVyKSEucHJvbWlzZTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucy5pZGVudGlmaWVyIEEgcHJvdmlkZXIgY2FuIHByb3ZpZGUgbXVsaXRwbGUgaW5zdGFuY2VzIG9mIGEgc2VydmljZVxuICAgKiBpZiB0aGlzLmNvbXBvbmVudC5tdWx0aXBsZUluc3RhbmNlcyBpcyB0cnVlLlxuICAgKiBAcGFyYW0gb3B0aW9ucy5vcHRpb25hbCBJZiBvcHRpb25hbCBpcyBmYWxzZSBvciBub3QgcHJvdmlkZWQsIHRoZSBtZXRob2QgdGhyb3dzIGFuIGVycm9yIHdoZW5cbiAgICogdGhlIHNlcnZpY2UgaXMgbm90IGltbWVkaWF0ZWx5IGF2YWlsYWJsZS5cbiAgICogSWYgb3B0aW9uYWwgaXMgdHJ1ZSwgdGhlIG1ldGhvZCByZXR1cm5zIG51bGwgaWYgdGhlIHNlcnZpY2UgaXMgbm90IGltbWVkaWF0ZWx5IGF2YWlsYWJsZS5cbiAgICovXG4gIGdldEltbWVkaWF0ZShvcHRpb25zOiB7XG4gICAgaWRlbnRpZmllcj86IHN0cmluZztcbiAgICBvcHRpb25hbDogdHJ1ZTtcbiAgfSk6IE5hbWVTZXJ2aWNlTWFwcGluZ1tUXSB8IG51bGw7XG4gIGdldEltbWVkaWF0ZShvcHRpb25zPzoge1xuICAgIGlkZW50aWZpZXI/OiBzdHJpbmc7XG4gICAgb3B0aW9uYWw/OiBmYWxzZTtcbiAgfSk6IE5hbWVTZXJ2aWNlTWFwcGluZ1tUXTtcbiAgZ2V0SW1tZWRpYXRlKG9wdGlvbnM/OiB7XG4gICAgaWRlbnRpZmllcj86IHN0cmluZztcbiAgICBvcHRpb25hbD86IGJvb2xlYW47XG4gIH0pOiBOYW1lU2VydmljZU1hcHBpbmdbVF0gfCBudWxsIHtcbiAgICAvLyBpZiBtdWx0aXBsZUluc3RhbmNlcyBpcyBub3Qgc3VwcG9ydGVkLCB1c2UgdGhlIGRlZmF1bHQgbmFtZVxuICAgIGNvbnN0IG5vcm1hbGl6ZWRJZGVudGlmaWVyID0gdGhpcy5ub3JtYWxpemVJbnN0YW5jZUlkZW50aWZpZXIoXG4gICAgICBvcHRpb25zPy5pZGVudGlmaWVyXG4gICAgKTtcbiAgICBjb25zdCBvcHRpb25hbCA9IG9wdGlvbnM/Lm9wdGlvbmFsID8/IGZhbHNlO1xuXG4gICAgaWYgKFxuICAgICAgdGhpcy5pc0luaXRpYWxpemVkKG5vcm1hbGl6ZWRJZGVudGlmaWVyKSB8fFxuICAgICAgdGhpcy5zaG91bGRBdXRvSW5pdGlhbGl6ZSgpXG4gICAgKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRPckluaXRpYWxpemVTZXJ2aWNlKHtcbiAgICAgICAgICBpbnN0YW5jZUlkZW50aWZpZXI6IG5vcm1hbGl6ZWRJZGVudGlmaWVyXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAob3B0aW9uYWwpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEluIGNhc2UgYSBjb21wb25lbnQgaXMgbm90IGluaXRpYWxpemVkIGFuZCBzaG91bGQvY2FuIG5vdCBiZSBhdXRvLWluaXRpYWxpemVkIGF0IHRoZSBtb21lbnQsIHJldHVybiBudWxsIGlmIHRoZSBvcHRpb25hbCBmbGFnIGlzIHNldCwgb3IgdGhyb3dcbiAgICAgIGlmIChvcHRpb25hbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IEVycm9yKGBTZXJ2aWNlICR7dGhpcy5uYW1lfSBpcyBub3QgYXZhaWxhYmxlYCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0Q29tcG9uZW50KCk6IENvbXBvbmVudDxUPiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmNvbXBvbmVudDtcbiAgfVxuXG4gIHNldENvbXBvbmVudChjb21wb25lbnQ6IENvbXBvbmVudDxUPik6IHZvaWQge1xuICAgIGlmIChjb21wb25lbnQubmFtZSAhPT0gdGhpcy5uYW1lKSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgYE1pc21hdGNoaW5nIENvbXBvbmVudCAke2NvbXBvbmVudC5uYW1lfSBmb3IgUHJvdmlkZXIgJHt0aGlzLm5hbWV9LmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29tcG9uZW50KSB7XG4gICAgICB0aHJvdyBFcnJvcihgQ29tcG9uZW50IGZvciAke3RoaXMubmFtZX0gaGFzIGFscmVhZHkgYmVlbiBwcm92aWRlZGApO1xuICAgIH1cblxuICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50O1xuXG4gICAgLy8gcmV0dXJuIGVhcmx5IHdpdGhvdXQgYXR0ZW1wdGluZyB0byBpbml0aWFsaXplIHRoZSBjb21wb25lbnQgaWYgdGhlIGNvbXBvbmVudCByZXF1aXJlcyBleHBsaWNpdCBpbml0aWFsaXphdGlvbiAoY2FsbGluZyBgUHJvdmlkZXIuaW5pdGlhbGl6ZSgpYClcbiAgICBpZiAoIXRoaXMuc2hvdWxkQXV0b0luaXRpYWxpemUoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGlmIHRoZSBzZXJ2aWNlIGlzIGVhZ2VyLCBpbml0aWFsaXplIHRoZSBkZWZhdWx0IGluc3RhbmNlXG4gICAgaWYgKGlzQ29tcG9uZW50RWFnZXIoY29tcG9uZW50KSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5nZXRPckluaXRpYWxpemVTZXJ2aWNlKHsgaW5zdGFuY2VJZGVudGlmaWVyOiBERUZBVUxUX0VOVFJZX05BTUUgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIHdoZW4gdGhlIGluc3RhbmNlIGZhY3RvcnkgZm9yIGFuIGVhZ2VyIENvbXBvbmVudCB0aHJvd3MgYW4gZXhjZXB0aW9uIGR1cmluZyB0aGUgZWFnZXJcbiAgICAgICAgLy8gaW5pdGlhbGl6YXRpb24sIGl0IHNob3VsZCBub3QgY2F1c2UgYSBmYXRhbCBlcnJvci5cbiAgICAgICAgLy8gVE9ETzogSW52ZXN0aWdhdGUgaWYgd2UgbmVlZCB0byBtYWtlIGl0IGNvbmZpZ3VyYWJsZSwgYmVjYXVzZSBzb21lIGNvbXBvbmVudCBtYXkgd2FudCB0byBjYXVzZVxuICAgICAgICAvLyBhIGZhdGFsIGVycm9yIGluIHRoaXMgY2FzZT9cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgc2VydmljZSBpbnN0YW5jZXMgZm9yIHRoZSBwZW5kaW5nIHByb21pc2VzIGFuZCByZXNvbHZlIHRoZW1cbiAgICAvLyBOT1RFOiBpZiB0aGlzLm11bHRpcGxlSW5zdGFuY2VzIGlzIGZhbHNlLCBvbmx5IHRoZSBkZWZhdWx0IGluc3RhbmNlIHdpbGwgYmUgY3JlYXRlZFxuICAgIC8vIGFuZCBhbGwgcHJvbWlzZXMgd2l0aCByZXNvbHZlIHdpdGggaXQgcmVnYXJkbGVzcyBvZiB0aGUgaWRlbnRpZmllci5cbiAgICBmb3IgKGNvbnN0IFtcbiAgICAgIGluc3RhbmNlSWRlbnRpZmllcixcbiAgICAgIGluc3RhbmNlRGVmZXJyZWRcbiAgICBdIG9mIHRoaXMuaW5zdGFuY2VzRGVmZXJyZWQuZW50cmllcygpKSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkSWRlbnRpZmllciA9XG4gICAgICAgIHRoaXMubm9ybWFsaXplSW5zdGFuY2VJZGVudGlmaWVyKGluc3RhbmNlSWRlbnRpZmllcik7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIGBnZXRPckluaXRpYWxpemVTZXJ2aWNlKClgIHNob3VsZCBhbHdheXMgcmV0dXJuIGEgdmFsaWQgaW5zdGFuY2Ugc2luY2UgYSBjb21wb25lbnQgaXMgZ3VhcmFudGVlZC4gdXNlICEgdG8gbWFrZSB0eXBlc2NyaXB0IGhhcHB5LlxuICAgICAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMuZ2V0T3JJbml0aWFsaXplU2VydmljZSh7XG4gICAgICAgICAgaW5zdGFuY2VJZGVudGlmaWVyOiBub3JtYWxpemVkSWRlbnRpZmllclxuICAgICAgICB9KSE7XG4gICAgICAgIGluc3RhbmNlRGVmZXJyZWQucmVzb2x2ZShpbnN0YW5jZSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIHdoZW4gdGhlIGluc3RhbmNlIGZhY3RvcnkgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgaXQgc2hvdWxkIG5vdCBjYXVzZVxuICAgICAgICAvLyBhIGZhdGFsIGVycm9yLiBXZSBqdXN0IGxlYXZlIHRoZSBwcm9taXNlIHVucmVzb2x2ZWQuXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY2xlYXJJbnN0YW5jZShpZGVudGlmaWVyOiBzdHJpbmcgPSBERUZBVUxUX0VOVFJZX05BTUUpOiB2b2lkIHtcbiAgICB0aGlzLmluc3RhbmNlc0RlZmVycmVkLmRlbGV0ZShpZGVudGlmaWVyKTtcbiAgICB0aGlzLmluc3RhbmNlc09wdGlvbnMuZGVsZXRlKGlkZW50aWZpZXIpO1xuICAgIHRoaXMuaW5zdGFuY2VzLmRlbGV0ZShpZGVudGlmaWVyKTtcbiAgfVxuXG4gIC8vIGFwcC5kZWxldGUoKSB3aWxsIGNhbGwgdGhpcyBtZXRob2Qgb24gZXZlcnkgcHJvdmlkZXIgdG8gZGVsZXRlIHRoZSBzZXJ2aWNlc1xuICAvLyBUT0RPOiBzaG91bGQgd2UgbWFyayB0aGUgcHJvdmlkZXIgYXMgZGVsZXRlZD9cbiAgYXN5bmMgZGVsZXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNlcnZpY2VzID0gQXJyYXkuZnJvbSh0aGlzLmluc3RhbmNlcy52YWx1ZXMoKSk7XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAuLi5zZXJ2aWNlc1xuICAgICAgICAuZmlsdGVyKHNlcnZpY2UgPT4gJ0lOVEVSTkFMJyBpbiBzZXJ2aWNlKSAvLyBsZWdhY3kgc2VydmljZXNcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgLm1hcChzZXJ2aWNlID0+IChzZXJ2aWNlIGFzIGFueSkuSU5URVJOQUwhLmRlbGV0ZSgpKSxcbiAgICAgIC4uLnNlcnZpY2VzXG4gICAgICAgIC5maWx0ZXIoc2VydmljZSA9PiAnX2RlbGV0ZScgaW4gc2VydmljZSkgLy8gbW9kdWxhcml6ZWQgc2VydmljZXNcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgLm1hcChzZXJ2aWNlID0+IChzZXJ2aWNlIGFzIGFueSkuX2RlbGV0ZSgpKVxuICAgIF0pO1xuICB9XG5cbiAgaXNDb21wb25lbnRTZXQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29tcG9uZW50ICE9IG51bGw7XG4gIH1cblxuICBpc0luaXRpYWxpemVkKGlkZW50aWZpZXI6IHN0cmluZyA9IERFRkFVTFRfRU5UUllfTkFNRSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmluc3RhbmNlcy5oYXMoaWRlbnRpZmllcik7XG4gIH1cblxuICBnZXRPcHRpb25zKGlkZW50aWZpZXI6IHN0cmluZyA9IERFRkFVTFRfRU5UUllfTkFNRSk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4gdGhpcy5pbnN0YW5jZXNPcHRpb25zLmdldChpZGVudGlmaWVyKSB8fCB7fTtcbiAgfVxuXG4gIGluaXRpYWxpemUob3B0czogSW5pdGlhbGl6ZU9wdGlvbnMgPSB7fSk6IE5hbWVTZXJ2aWNlTWFwcGluZ1tUXSB7XG4gICAgY29uc3QgeyBvcHRpb25zID0ge30gfSA9IG9wdHM7XG4gICAgY29uc3Qgbm9ybWFsaXplZElkZW50aWZpZXIgPSB0aGlzLm5vcm1hbGl6ZUluc3RhbmNlSWRlbnRpZmllcihcbiAgICAgIG9wdHMuaW5zdGFuY2VJZGVudGlmaWVyXG4gICAgKTtcbiAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkKG5vcm1hbGl6ZWRJZGVudGlmaWVyKSkge1xuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgIGAke3RoaXMubmFtZX0oJHtub3JtYWxpemVkSWRlbnRpZmllcn0pIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWRgXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5pc0NvbXBvbmVudFNldCgpKSB7XG4gICAgICB0aHJvdyBFcnJvcihgQ29tcG9uZW50ICR7dGhpcy5uYW1lfSBoYXMgbm90IGJlZW4gcmVnaXN0ZXJlZCB5ZXRgKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMuZ2V0T3JJbml0aWFsaXplU2VydmljZSh7XG4gICAgICBpbnN0YW5jZUlkZW50aWZpZXI6IG5vcm1hbGl6ZWRJZGVudGlmaWVyLFxuICAgICAgb3B0aW9uc1xuICAgIH0pITtcblxuICAgIC8vIHJlc29sdmUgYW55IHBlbmRpbmcgcHJvbWlzZSB3YWl0aW5nIGZvciB0aGUgc2VydmljZSBpbnN0YW5jZVxuICAgIGZvciAoY29uc3QgW1xuICAgICAgaW5zdGFuY2VJZGVudGlmaWVyLFxuICAgICAgaW5zdGFuY2VEZWZlcnJlZFxuICAgIF0gb2YgdGhpcy5pbnN0YW5jZXNEZWZlcnJlZC5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWREZWZlcnJlZElkZW50aWZpZXIgPVxuICAgICAgICB0aGlzLm5vcm1hbGl6ZUluc3RhbmNlSWRlbnRpZmllcihpbnN0YW5jZUlkZW50aWZpZXIpO1xuICAgICAgaWYgKG5vcm1hbGl6ZWRJZGVudGlmaWVyID09PSBub3JtYWxpemVkRGVmZXJyZWRJZGVudGlmaWVyKSB7XG4gICAgICAgIGluc3RhbmNlRGVmZXJyZWQucmVzb2x2ZShpbnN0YW5jZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGludm9rZWQgIGFmdGVyIHRoZSBwcm92aWRlciBoYXMgYmVlbiBpbml0aWFsaXplZCBieSBjYWxsaW5nIHByb3ZpZGVyLmluaXRpYWxpemUoKS5cbiAgICogVGhlIGZ1bmN0aW9uIGlzIGludm9rZWQgU1lOQ0hST05PVVNMWSwgc28gaXQgc2hvdWxkIG5vdCBleGVjdXRlIGFueSBsb25ncnVubmluZyB0YXNrcyBpbiBvcmRlciB0byBub3QgYmxvY2sgdGhlIHByb2dyYW0uXG4gICAqXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIEFuIG9wdGlvbmFsIGluc3RhbmNlIGlkZW50aWZpZXJcbiAgICogQHJldHVybnMgYSBmdW5jdGlvbiB0byB1bnJlZ2lzdGVyIHRoZSBjYWxsYmFja1xuICAgKi9cbiAgb25Jbml0KGNhbGxiYWNrOiBPbkluaXRDYWxsQmFjazxUPiwgaWRlbnRpZmllcj86IHN0cmluZyk6ICgpID0+IHZvaWQge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRJZGVudGlmaWVyID0gdGhpcy5ub3JtYWxpemVJbnN0YW5jZUlkZW50aWZpZXIoaWRlbnRpZmllcik7XG4gICAgY29uc3QgZXhpc3RpbmdDYWxsYmFja3MgPVxuICAgICAgdGhpcy5vbkluaXRDYWxsYmFja3MuZ2V0KG5vcm1hbGl6ZWRJZGVudGlmaWVyKSA/P1xuICAgICAgbmV3IFNldDxPbkluaXRDYWxsQmFjazxUPj4oKTtcbiAgICBleGlzdGluZ0NhbGxiYWNrcy5hZGQoY2FsbGJhY2spO1xuICAgIHRoaXMub25Jbml0Q2FsbGJhY2tzLnNldChub3JtYWxpemVkSWRlbnRpZmllciwgZXhpc3RpbmdDYWxsYmFja3MpO1xuXG4gICAgY29uc3QgZXhpc3RpbmdJbnN0YW5jZSA9IHRoaXMuaW5zdGFuY2VzLmdldChub3JtYWxpemVkSWRlbnRpZmllcik7XG4gICAgaWYgKGV4aXN0aW5nSW5zdGFuY2UpIHtcbiAgICAgIGNhbGxiYWNrKGV4aXN0aW5nSW5zdGFuY2UsIG5vcm1hbGl6ZWRJZGVudGlmaWVyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgZXhpc3RpbmdDYWxsYmFja3MuZGVsZXRlKGNhbGxiYWNrKTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEludm9rZSBvbkluaXQgY2FsbGJhY2tzIHN5bmNocm9ub3VzbHlcbiAgICogQHBhcmFtIGluc3RhbmNlIHRoZSBzZXJ2aWNlIGluc3RhbmNlYFxuICAgKi9cbiAgcHJpdmF0ZSBpbnZva2VPbkluaXRDYWxsYmFja3MoXG4gICAgaW5zdGFuY2U6IE5hbWVTZXJ2aWNlTWFwcGluZ1tUXSxcbiAgICBpZGVudGlmaWVyOiBzdHJpbmdcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgY2FsbGJhY2tzID0gdGhpcy5vbkluaXRDYWxsYmFja3MuZ2V0KGlkZW50aWZpZXIpO1xuICAgIGlmICghY2FsbGJhY2tzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgY2FsbGJhY2sgb2YgY2FsbGJhY2tzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjYWxsYmFjayhpbnN0YW5jZSwgaWRlbnRpZmllcik7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gaWdub3JlIGVycm9ycyBpbiB0aGUgb25Jbml0IGNhbGxiYWNrXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRPckluaXRpYWxpemVTZXJ2aWNlKHtcbiAgICBpbnN0YW5jZUlkZW50aWZpZXIsXG4gICAgb3B0aW9ucyA9IHt9XG4gIH06IHtcbiAgICBpbnN0YW5jZUlkZW50aWZpZXI6IHN0cmluZztcbiAgICBvcHRpb25zPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH0pOiBOYW1lU2VydmljZU1hcHBpbmdbVF0gfCBudWxsIHtcbiAgICBsZXQgaW5zdGFuY2UgPSB0aGlzLmluc3RhbmNlcy5nZXQoaW5zdGFuY2VJZGVudGlmaWVyKTtcbiAgICBpZiAoIWluc3RhbmNlICYmIHRoaXMuY29tcG9uZW50KSB7XG4gICAgICBpbnN0YW5jZSA9IHRoaXMuY29tcG9uZW50Lmluc3RhbmNlRmFjdG9yeSh0aGlzLmNvbnRhaW5lciwge1xuICAgICAgICBpbnN0YW5jZUlkZW50aWZpZXI6IG5vcm1hbGl6ZUlkZW50aWZpZXJGb3JGYWN0b3J5KGluc3RhbmNlSWRlbnRpZmllciksXG4gICAgICAgIG9wdGlvbnNcbiAgICAgIH0pO1xuICAgICAgdGhpcy5pbnN0YW5jZXMuc2V0KGluc3RhbmNlSWRlbnRpZmllciwgaW5zdGFuY2UpO1xuICAgICAgdGhpcy5pbnN0YW5jZXNPcHRpb25zLnNldChpbnN0YW5jZUlkZW50aWZpZXIsIG9wdGlvbnMpO1xuXG4gICAgICAvKipcbiAgICAgICAqIEludm9rZSBvbkluaXQgbGlzdGVuZXJzLlxuICAgICAgICogTm90ZSB0aGlzLmNvbXBvbmVudC5vbkluc3RhbmNlQ3JlYXRlZCBpcyBkaWZmZXJlbnQsIHdoaWNoIGlzIHVzZWQgYnkgdGhlIGNvbXBvbmVudCBjcmVhdG9yLFxuICAgICAgICogd2hpbGUgb25Jbml0IGxpc3RlbmVycyBhcmUgcmVnaXN0ZXJlZCBieSBjb25zdW1lcnMgb2YgdGhlIHByb3ZpZGVyLlxuICAgICAgICovXG4gICAgICB0aGlzLmludm9rZU9uSW5pdENhbGxiYWNrcyhpbnN0YW5jZSwgaW5zdGFuY2VJZGVudGlmaWVyKTtcblxuICAgICAgLyoqXG4gICAgICAgKiBPcmRlciBpcyBpbXBvcnRhbnRcbiAgICAgICAqIG9uSW5zdGFuY2VDcmVhdGVkKCkgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciB0aGlzLmluc3RhbmNlcy5zZXQoaW5zdGFuY2VJZGVudGlmaWVyLCBpbnN0YW5jZSk7IHdoaWNoXG4gICAgICAgKiBtYWtlcyBgaXNJbml0aWFsaXplZCgpYCByZXR1cm4gdHJ1ZS5cbiAgICAgICAqL1xuICAgICAgaWYgKHRoaXMuY29tcG9uZW50Lm9uSW5zdGFuY2VDcmVhdGVkKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5jb21wb25lbnQub25JbnN0YW5jZUNyZWF0ZWQoXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lcixcbiAgICAgICAgICAgIGluc3RhbmNlSWRlbnRpZmllcixcbiAgICAgICAgICAgIGluc3RhbmNlXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gaWdub3JlIGVycm9ycyBpbiB0aGUgb25JbnN0YW5jZUNyZWF0ZWRDYWxsYmFja1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGluc3RhbmNlIHx8IG51bGw7XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZUluc3RhbmNlSWRlbnRpZmllcihcbiAgICBpZGVudGlmaWVyOiBzdHJpbmcgPSBERUZBVUxUX0VOVFJZX05BTUVcbiAgKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5jb21wb25lbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudC5tdWx0aXBsZUluc3RhbmNlcyA/IGlkZW50aWZpZXIgOiBERUZBVUxUX0VOVFJZX05BTUU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBpZGVudGlmaWVyOyAvLyBhc3N1bWUgbXVsdGlwbGUgaW5zdGFuY2VzIGFyZSBzdXBwb3J0ZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgaXMgcHJvdmlkZWQuXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRBdXRvSW5pdGlhbGl6ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgISF0aGlzLmNvbXBvbmVudCAmJlxuICAgICAgdGhpcy5jb21wb25lbnQuaW5zdGFudGlhdGlvbk1vZGUgIT09IEluc3RhbnRpYXRpb25Nb2RlLkVYUExJQ0lUXG4gICAgKTtcbiAgfVxufVxuXG4vLyB1bmRlZmluZWQgc2hvdWxkIGJlIHBhc3NlZCB0byB0aGUgc2VydmljZSBmYWN0b3J5IGZvciB0aGUgZGVmYXVsdCBpbnN0YW5jZVxuZnVuY3Rpb24gbm9ybWFsaXplSWRlbnRpZmllckZvckZhY3RvcnkoaWRlbnRpZmllcjogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGlkZW50aWZpZXIgPT09IERFRkFVTFRfRU5UUllfTkFNRSA/IHVuZGVmaW5lZCA6IGlkZW50aWZpZXI7XG59XG5cbmZ1bmN0aW9uIGlzQ29tcG9uZW50RWFnZXI8VCBleHRlbmRzIE5hbWU+KGNvbXBvbmVudDogQ29tcG9uZW50PFQ+KTogYm9vbGVhbiB7XG4gIHJldHVybiBjb21wb25lbnQuaW5zdGFudGlhdGlvbk1vZGUgPT09IEluc3RhbnRpYXRpb25Nb2RlLkVBR0VSO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IFByb3ZpZGVyIH0gZnJvbSAnLi9wcm92aWRlcic7XG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudCc7XG5pbXBvcnQgeyBOYW1lIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogQ29tcG9uZW50Q29udGFpbmVyIHRoYXQgcHJvdmlkZXMgUHJvdmlkZXJzIGZvciBzZXJ2aWNlIG5hbWUgVCwgZS5nLiBgYXV0aGAsIGBhdXRoLWludGVybmFsYFxuICovXG5leHBvcnQgY2xhc3MgQ29tcG9uZW50Q29udGFpbmVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBwcm92aWRlcnMgPSBuZXcgTWFwPHN0cmluZywgUHJvdmlkZXI8TmFtZT4+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBuYW1lOiBzdHJpbmcpIHt9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBjb21wb25lbnQgQ29tcG9uZW50IGJlaW5nIGFkZGVkXG4gICAqIEBwYXJhbSBvdmVyd3JpdGUgV2hlbiBhIGNvbXBvbmVudCB3aXRoIHRoZSBzYW1lIG5hbWUgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkLFxuICAgKiBpZiBvdmVyd3JpdGUgaXMgdHJ1ZTogb3ZlcndyaXRlIHRoZSBleGlzdGluZyBjb21wb25lbnQgd2l0aCB0aGUgbmV3IGNvbXBvbmVudCBhbmQgY3JlYXRlIGEgbmV3XG4gICAqIHByb3ZpZGVyIHdpdGggdGhlIG5ldyBjb21wb25lbnQuIEl0IGNhbiBiZSB1c2VmdWwgaW4gdGVzdHMgd2hlcmUgeW91IHdhbnQgdG8gdXNlIGRpZmZlcmVudCBtb2Nrc1xuICAgKiBmb3IgZGlmZmVyZW50IHRlc3RzLlxuICAgKiBpZiBvdmVyd3JpdGUgaXMgZmFsc2U6IHRocm93IGFuIGV4Y2VwdGlvblxuICAgKi9cbiAgYWRkQ29tcG9uZW50PFQgZXh0ZW5kcyBOYW1lPihjb21wb25lbnQ6IENvbXBvbmVudDxUPik6IHZvaWQge1xuICAgIGNvbnN0IHByb3ZpZGVyID0gdGhpcy5nZXRQcm92aWRlcihjb21wb25lbnQubmFtZSk7XG4gICAgaWYgKHByb3ZpZGVyLmlzQ29tcG9uZW50U2V0KCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENvbXBvbmVudCAke2NvbXBvbmVudC5uYW1lfSBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQgd2l0aCAke3RoaXMubmFtZX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIHByb3ZpZGVyLnNldENvbXBvbmVudChjb21wb25lbnQpO1xuICB9XG5cbiAgYWRkT3JPdmVyd3JpdGVDb21wb25lbnQ8VCBleHRlbmRzIE5hbWU+KGNvbXBvbmVudDogQ29tcG9uZW50PFQ+KTogdm9pZCB7XG4gICAgY29uc3QgcHJvdmlkZXIgPSB0aGlzLmdldFByb3ZpZGVyKGNvbXBvbmVudC5uYW1lKTtcbiAgICBpZiAocHJvdmlkZXIuaXNDb21wb25lbnRTZXQoKSkge1xuICAgICAgLy8gZGVsZXRlIHRoZSBleGlzdGluZyBwcm92aWRlciBmcm9tIHRoZSBjb250YWluZXIsIHNvIHdlIGNhbiByZWdpc3RlciB0aGUgbmV3IGNvbXBvbmVudFxuICAgICAgdGhpcy5wcm92aWRlcnMuZGVsZXRlKGNvbXBvbmVudC5uYW1lKTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZENvbXBvbmVudChjb21wb25lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIGdldFByb3ZpZGVyIHByb3ZpZGVzIGEgdHlwZSBzYWZlIGludGVyZmFjZSB3aGVyZSBpdCBjYW4gb25seSBiZSBjYWxsZWQgd2l0aCBhIGZpZWxkIG5hbWVcbiAgICogcHJlc2VudCBpbiBOYW1lU2VydmljZU1hcHBpbmcgaW50ZXJmYWNlLlxuICAgKlxuICAgKiBGaXJlYmFzZSBTREtzIHByb3ZpZGluZyBzZXJ2aWNlcyBzaG91bGQgZXh0ZW5kIE5hbWVTZXJ2aWNlTWFwcGluZyBpbnRlcmZhY2UgdG8gcmVnaXN0ZXJcbiAgICogdGhlbXNlbHZlcy5cbiAgICovXG4gIGdldFByb3ZpZGVyPFQgZXh0ZW5kcyBOYW1lPihuYW1lOiBUKTogUHJvdmlkZXI8VD4ge1xuICAgIGlmICh0aGlzLnByb3ZpZGVycy5oYXMobmFtZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb3ZpZGVycy5nZXQobmFtZSkgYXMgdW5rbm93biBhcyBQcm92aWRlcjxUPjtcbiAgICB9XG5cbiAgICAvLyBjcmVhdGUgYSBQcm92aWRlciBmb3IgYSBzZXJ2aWNlIHRoYXQgaGFzbid0IHJlZ2lzdGVyZWQgd2l0aCBGaXJlYmFzZVxuICAgIGNvbnN0IHByb3ZpZGVyID0gbmV3IFByb3ZpZGVyPFQ+KG5hbWUsIHRoaXMpO1xuICAgIHRoaXMucHJvdmlkZXJzLnNldChuYW1lLCBwcm92aWRlciBhcyB1bmtub3duIGFzIFByb3ZpZGVyPE5hbWU+KTtcblxuICAgIHJldHVybiBwcm92aWRlciBhcyBQcm92aWRlcjxUPjtcbiAgfVxuXG4gIGdldFByb3ZpZGVycygpOiBBcnJheTxQcm92aWRlcjxOYW1lPj4ge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMucHJvdmlkZXJzLnZhbHVlcygpKTtcbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmV4cG9ydCB0eXBlIExvZ0xldmVsU3RyaW5nID1cbiAgfCAnZGVidWcnXG4gIHwgJ3ZlcmJvc2UnXG4gIHwgJ2luZm8nXG4gIHwgJ3dhcm4nXG4gIHwgJ2Vycm9yJ1xuICB8ICdzaWxlbnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIExvZ09wdGlvbnMge1xuICBsZXZlbDogTG9nTGV2ZWxTdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIExvZ0NhbGxiYWNrID0gKGNhbGxiYWNrUGFyYW1zOiBMb2dDYWxsYmFja1BhcmFtcykgPT4gdm9pZDtcblxuZXhwb3J0IGludGVyZmFjZSBMb2dDYWxsYmFja1BhcmFtcyB7XG4gIGxldmVsOiBMb2dMZXZlbFN0cmluZztcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBhcmdzOiB1bmtub3duW107XG4gIHR5cGU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIGNvbnRhaW5lciBmb3IgYWxsIG9mIHRoZSBMb2dnZXIgaW5zdGFuY2VzXG4gKi9cbmV4cG9ydCBjb25zdCBpbnN0YW5jZXM6IExvZ2dlcltdID0gW107XG5cbi8qKlxuICogVGhlIEpTIFNESyBzdXBwb3J0cyA1IGxvZyBsZXZlbHMgYW5kIGFsc28gYWxsb3dzIGEgdXNlciB0aGUgYWJpbGl0eSB0b1xuICogc2lsZW5jZSB0aGUgbG9ncyBhbHRvZ2V0aGVyLlxuICpcbiAqIFRoZSBvcmRlciBpcyBhIGZvbGxvd3M6XG4gKiBERUJVRyA8IFZFUkJPU0UgPCBJTkZPIDwgV0FSTiA8IEVSUk9SXG4gKlxuICogQWxsIG9mIHRoZSBsb2cgdHlwZXMgYWJvdmUgdGhlIGN1cnJlbnQgbG9nIGxldmVsIHdpbGwgYmUgY2FwdHVyZWQgKGkuZS4gaWZcbiAqIHlvdSBzZXQgdGhlIGxvZyBsZXZlbCB0byBgSU5GT2AsIGVycm9ycyB3aWxsIHN0aWxsIGJlIGxvZ2dlZCwgYnV0IGBERUJVR2AgYW5kXG4gKiBgVkVSQk9TRWAgbG9ncyB3aWxsIG5vdClcbiAqL1xuZXhwb3J0IGVudW0gTG9nTGV2ZWwge1xuICBERUJVRyxcbiAgVkVSQk9TRSxcbiAgSU5GTyxcbiAgV0FSTixcbiAgRVJST1IsXG4gIFNJTEVOVFxufVxuXG5jb25zdCBsZXZlbFN0cmluZ1RvRW51bTogeyBba2V5IGluIExvZ0xldmVsU3RyaW5nXTogTG9nTGV2ZWwgfSA9IHtcbiAgJ2RlYnVnJzogTG9nTGV2ZWwuREVCVUcsXG4gICd2ZXJib3NlJzogTG9nTGV2ZWwuVkVSQk9TRSxcbiAgJ2luZm8nOiBMb2dMZXZlbC5JTkZPLFxuICAnd2Fybic6IExvZ0xldmVsLldBUk4sXG4gICdlcnJvcic6IExvZ0xldmVsLkVSUk9SLFxuICAnc2lsZW50JzogTG9nTGV2ZWwuU0lMRU5UXG59O1xuXG4vKipcbiAqIFRoZSBkZWZhdWx0IGxvZyBsZXZlbFxuICovXG5jb25zdCBkZWZhdWx0TG9nTGV2ZWw6IExvZ0xldmVsID0gTG9nTGV2ZWwuSU5GTztcblxuLyoqXG4gKiBXZSBhbGxvdyB1c2VycyB0aGUgYWJpbGl0eSB0byBwYXNzIHRoZWlyIG93biBsb2cgaGFuZGxlci4gV2Ugd2lsbCBwYXNzIHRoZVxuICogdHlwZSBvZiBsb2csIHRoZSBjdXJyZW50IGxvZyBsZXZlbCwgYW5kIGFueSBvdGhlciBhcmd1bWVudHMgcGFzc2VkIChpLmUuIHRoZVxuICogbWVzc2FnZXMgdGhhdCB0aGUgdXNlciB3YW50cyB0byBsb2cpIHRvIHRoaXMgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCB0eXBlIExvZ0hhbmRsZXIgPSAoXG4gIGxvZ2dlckluc3RhbmNlOiBMb2dnZXIsXG4gIGxvZ1R5cGU6IExvZ0xldmVsLFxuICAuLi5hcmdzOiB1bmtub3duW11cbikgPT4gdm9pZDtcblxuLyoqXG4gKiBCeSBkZWZhdWx0LCBgY29uc29sZS5kZWJ1Z2AgaXMgbm90IGRpc3BsYXllZCBpbiB0aGUgZGV2ZWxvcGVyIGNvbnNvbGUgKGluXG4gKiBjaHJvbWUpLiBUbyBhdm9pZCBmb3JjaW5nIHVzZXJzIHRvIGhhdmUgdG8gb3B0LWluIHRvIHRoZXNlIGxvZ3MgdHdpY2VcbiAqIChpLmUuIG9uY2UgZm9yIGZpcmViYXNlLCBhbmQgb25jZSBpbiB0aGUgY29uc29sZSksIHdlIGFyZSBzZW5kaW5nIGBERUJVR2BcbiAqIGxvZ3MgdG8gdGhlIGBjb25zb2xlLmxvZ2AgZnVuY3Rpb24uXG4gKi9cbmNvbnN0IENvbnNvbGVNZXRob2QgPSB7XG4gIFtMb2dMZXZlbC5ERUJVR106ICdsb2cnLFxuICBbTG9nTGV2ZWwuVkVSQk9TRV06ICdsb2cnLFxuICBbTG9nTGV2ZWwuSU5GT106ICdpbmZvJyxcbiAgW0xvZ0xldmVsLldBUk5dOiAnd2FybicsXG4gIFtMb2dMZXZlbC5FUlJPUl06ICdlcnJvcidcbn07XG5cbi8qKlxuICogVGhlIGRlZmF1bHQgbG9nIGhhbmRsZXIgd2lsbCBmb3J3YXJkIERFQlVHLCBWRVJCT1NFLCBJTkZPLCBXQVJOLCBhbmQgRVJST1JcbiAqIG1lc3NhZ2VzIG9uIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgY29uc29sZSBjb3VudGVycGFydHMgKGlmIHRoZSBsb2cgbWV0aG9kXG4gKiBpcyBzdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnQgbG9nIGxldmVsKVxuICovXG5jb25zdCBkZWZhdWx0TG9nSGFuZGxlcjogTG9nSGFuZGxlciA9IChpbnN0YW5jZSwgbG9nVHlwZSwgLi4uYXJncyk6IHZvaWQgPT4ge1xuICBpZiAobG9nVHlwZSA8IGluc3RhbmNlLmxvZ0xldmVsKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgY29uc3QgbWV0aG9kID0gQ29uc29sZU1ldGhvZFtsb2dUeXBlIGFzIGtleW9mIHR5cGVvZiBDb25zb2xlTWV0aG9kXTtcbiAgaWYgKG1ldGhvZCkge1xuICAgIGNvbnNvbGVbbWV0aG9kIGFzICdsb2cnIHwgJ2luZm8nIHwgJ3dhcm4nIHwgJ2Vycm9yJ10oXG4gICAgICBgWyR7bm93fV0gICR7aW5zdGFuY2UubmFtZX06YCxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBBdHRlbXB0ZWQgdG8gbG9nIGEgbWVzc2FnZSB3aXRoIGFuIGludmFsaWQgbG9nVHlwZSAodmFsdWU6ICR7bG9nVHlwZX0pYFxuICAgICk7XG4gIH1cbn07XG5cbmV4cG9ydCBjbGFzcyBMb2dnZXIge1xuICAvKipcbiAgICogR2l2ZXMgeW91IGFuIGluc3RhbmNlIG9mIGEgTG9nZ2VyIHRvIGNhcHR1cmUgbWVzc2FnZXMgYWNjb3JkaW5nIHRvXG4gICAqIEZpcmViYXNlJ3MgbG9nZ2luZyBzY2hlbWUuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIHRoYXQgdGhlIGxvZ3Mgd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGhcbiAgICovXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICAvKipcbiAgICAgKiBDYXB0dXJlIHRoZSBjdXJyZW50IGluc3RhbmNlIGZvciBsYXRlciB1c2VcbiAgICAgKi9cbiAgICBpbnN0YW5jZXMucHVzaCh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbG9nIGxldmVsIG9mIHRoZSBnaXZlbiBMb2dnZXIgaW5zdGFuY2UuXG4gICAqL1xuICBwcml2YXRlIF9sb2dMZXZlbCA9IGRlZmF1bHRMb2dMZXZlbDtcblxuICBnZXQgbG9nTGV2ZWwoKTogTG9nTGV2ZWwge1xuICAgIHJldHVybiB0aGlzLl9sb2dMZXZlbDtcbiAgfVxuXG4gIHNldCBsb2dMZXZlbCh2YWw6IExvZ0xldmVsKSB7XG4gICAgaWYgKCEodmFsIGluIExvZ0xldmVsKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCB2YWx1ZSBcIiR7dmFsfVwiIGFzc2lnbmVkIHRvIFxcYGxvZ0xldmVsXFxgYCk7XG4gICAgfVxuICAgIHRoaXMuX2xvZ0xldmVsID0gdmFsO1xuICB9XG5cbiAgLy8gV29ya2Fyb3VuZCBmb3Igc2V0dGVyL2dldHRlciBoYXZpbmcgdG8gYmUgdGhlIHNhbWUgdHlwZS5cbiAgc2V0TG9nTGV2ZWwodmFsOiBMb2dMZXZlbCB8IExvZ0xldmVsU3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fbG9nTGV2ZWwgPSB0eXBlb2YgdmFsID09PSAnc3RyaW5nJyA/IGxldmVsU3RyaW5nVG9FbnVtW3ZhbF0gOiB2YWw7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG1haW4gKGludGVybmFsKSBsb2cgaGFuZGxlciBmb3IgdGhlIExvZ2dlciBpbnN0YW5jZS5cbiAgICogQ2FuIGJlIHNldCB0byBhIG5ldyBmdW5jdGlvbiBpbiBpbnRlcm5hbCBwYWNrYWdlIGNvZGUgYnV0IG5vdCBieSB1c2VyLlxuICAgKi9cbiAgcHJpdmF0ZSBfbG9nSGFuZGxlcjogTG9nSGFuZGxlciA9IGRlZmF1bHRMb2dIYW5kbGVyO1xuICBnZXQgbG9nSGFuZGxlcigpOiBMb2dIYW5kbGVyIHtcbiAgICByZXR1cm4gdGhpcy5fbG9nSGFuZGxlcjtcbiAgfVxuICBzZXQgbG9nSGFuZGxlcih2YWw6IExvZ0hhbmRsZXIpIHtcbiAgICBpZiAodHlwZW9mIHZhbCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVmFsdWUgYXNzaWduZWQgdG8gYGxvZ0hhbmRsZXJgIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgIH1cbiAgICB0aGlzLl9sb2dIYW5kbGVyID0gdmFsO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBvcHRpb25hbCwgYWRkaXRpb25hbCwgdXNlci1kZWZpbmVkIGxvZyBoYW5kbGVyIGZvciB0aGUgTG9nZ2VyIGluc3RhbmNlLlxuICAgKi9cbiAgcHJpdmF0ZSBfdXNlckxvZ0hhbmRsZXI6IExvZ0hhbmRsZXIgfCBudWxsID0gbnVsbDtcbiAgZ2V0IHVzZXJMb2dIYW5kbGVyKCk6IExvZ0hhbmRsZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fdXNlckxvZ0hhbmRsZXI7XG4gIH1cbiAgc2V0IHVzZXJMb2dIYW5kbGVyKHZhbDogTG9nSGFuZGxlciB8IG51bGwpIHtcbiAgICB0aGlzLl91c2VyTG9nSGFuZGxlciA9IHZhbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZnVuY3Rpb25zIGJlbG93IGFyZSBhbGwgYmFzZWQgb24gdGhlIGBjb25zb2xlYCBpbnRlcmZhY2VcbiAgICovXG5cbiAgZGVidWcoLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgdGhpcy5fdXNlckxvZ0hhbmRsZXIgJiYgdGhpcy5fdXNlckxvZ0hhbmRsZXIodGhpcywgTG9nTGV2ZWwuREVCVUcsIC4uLmFyZ3MpO1xuICAgIHRoaXMuX2xvZ0hhbmRsZXIodGhpcywgTG9nTGV2ZWwuREVCVUcsIC4uLmFyZ3MpO1xuICB9XG4gIGxvZyguLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICB0aGlzLl91c2VyTG9nSGFuZGxlciAmJlxuICAgICAgdGhpcy5fdXNlckxvZ0hhbmRsZXIodGhpcywgTG9nTGV2ZWwuVkVSQk9TRSwgLi4uYXJncyk7XG4gICAgdGhpcy5fbG9nSGFuZGxlcih0aGlzLCBMb2dMZXZlbC5WRVJCT1NFLCAuLi5hcmdzKTtcbiAgfVxuICBpbmZvKC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuICAgIHRoaXMuX3VzZXJMb2dIYW5kbGVyICYmIHRoaXMuX3VzZXJMb2dIYW5kbGVyKHRoaXMsIExvZ0xldmVsLklORk8sIC4uLmFyZ3MpO1xuICAgIHRoaXMuX2xvZ0hhbmRsZXIodGhpcywgTG9nTGV2ZWwuSU5GTywgLi4uYXJncyk7XG4gIH1cbiAgd2FybiguLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICB0aGlzLl91c2VyTG9nSGFuZGxlciAmJiB0aGlzLl91c2VyTG9nSGFuZGxlcih0aGlzLCBMb2dMZXZlbC5XQVJOLCAuLi5hcmdzKTtcbiAgICB0aGlzLl9sb2dIYW5kbGVyKHRoaXMsIExvZ0xldmVsLldBUk4sIC4uLmFyZ3MpO1xuICB9XG4gIGVycm9yKC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuICAgIHRoaXMuX3VzZXJMb2dIYW5kbGVyICYmIHRoaXMuX3VzZXJMb2dIYW5kbGVyKHRoaXMsIExvZ0xldmVsLkVSUk9SLCAuLi5hcmdzKTtcbiAgICB0aGlzLl9sb2dIYW5kbGVyKHRoaXMsIExvZ0xldmVsLkVSUk9SLCAuLi5hcmdzKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0TG9nTGV2ZWwobGV2ZWw6IExvZ0xldmVsU3RyaW5nIHwgTG9nTGV2ZWwpOiB2b2lkIHtcbiAgaW5zdGFuY2VzLmZvckVhY2goaW5zdCA9PiB7XG4gICAgaW5zdC5zZXRMb2dMZXZlbChsZXZlbCk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0VXNlckxvZ0hhbmRsZXIoXG4gIGxvZ0NhbGxiYWNrOiBMb2dDYWxsYmFjayB8IG51bGwsXG4gIG9wdGlvbnM/OiBMb2dPcHRpb25zXG4pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBpbnN0YW5jZSBvZiBpbnN0YW5jZXMpIHtcbiAgICBsZXQgY3VzdG9tTG9nTGV2ZWw6IExvZ0xldmVsIHwgbnVsbCA9IG51bGw7XG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5sZXZlbCkge1xuICAgICAgY3VzdG9tTG9nTGV2ZWwgPSBsZXZlbFN0cmluZ1RvRW51bVtvcHRpb25zLmxldmVsXTtcbiAgICB9XG4gICAgaWYgKGxvZ0NhbGxiYWNrID09PSBudWxsKSB7XG4gICAgICBpbnN0YW5jZS51c2VyTG9nSGFuZGxlciA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGluc3RhbmNlLnVzZXJMb2dIYW5kbGVyID0gKFxuICAgICAgICBpbnN0YW5jZTogTG9nZ2VyLFxuICAgICAgICBsZXZlbDogTG9nTGV2ZWwsXG4gICAgICAgIC4uLmFyZ3M6IHVua25vd25bXVxuICAgICAgKSA9PiB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBhcmdzXG4gICAgICAgICAgLm1hcChhcmcgPT4ge1xuICAgICAgICAgICAgaWYgKGFyZyA9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgYXJnID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICByZXR1cm4gYXJnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgYXJnID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGFyZy50b1N0cmluZygpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChhcmcgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICByZXR1cm4gYXJnLm1lc3NhZ2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhcmcpO1xuICAgICAgICAgICAgICB9IGNhdGNoIChpZ25vcmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIC5maWx0ZXIoYXJnID0+IGFyZylcbiAgICAgICAgICAuam9pbignICcpO1xuICAgICAgICBpZiAobGV2ZWwgPj0gKGN1c3RvbUxvZ0xldmVsID8/IGluc3RhbmNlLmxvZ0xldmVsKSkge1xuICAgICAgICAgIGxvZ0NhbGxiYWNrKHtcbiAgICAgICAgICAgIGxldmVsOiBMb2dMZXZlbFtsZXZlbF0udG9Mb3dlckNhc2UoKSBhcyBMb2dMZXZlbFN0cmluZyxcbiAgICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgICBhcmdzLFxuICAgICAgICAgICAgdHlwZTogaW5zdGFuY2UubmFtZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgfVxufVxuIiwgImNvbnN0IGluc3RhbmNlT2ZBbnkgPSAob2JqZWN0LCBjb25zdHJ1Y3RvcnMpID0+IGNvbnN0cnVjdG9ycy5zb21lKChjKSA9PiBvYmplY3QgaW5zdGFuY2VvZiBjKTtcblxubGV0IGlkYlByb3h5YWJsZVR5cGVzO1xubGV0IGN1cnNvckFkdmFuY2VNZXRob2RzO1xuLy8gVGhpcyBpcyBhIGZ1bmN0aW9uIHRvIHByZXZlbnQgaXQgdGhyb3dpbmcgdXAgaW4gbm9kZSBlbnZpcm9ubWVudHMuXG5mdW5jdGlvbiBnZXRJZGJQcm94eWFibGVUeXBlcygpIHtcbiAgICByZXR1cm4gKGlkYlByb3h5YWJsZVR5cGVzIHx8XG4gICAgICAgIChpZGJQcm94eWFibGVUeXBlcyA9IFtcbiAgICAgICAgICAgIElEQkRhdGFiYXNlLFxuICAgICAgICAgICAgSURCT2JqZWN0U3RvcmUsXG4gICAgICAgICAgICBJREJJbmRleCxcbiAgICAgICAgICAgIElEQkN1cnNvcixcbiAgICAgICAgICAgIElEQlRyYW5zYWN0aW9uLFxuICAgICAgICBdKSk7XG59XG4vLyBUaGlzIGlzIGEgZnVuY3Rpb24gdG8gcHJldmVudCBpdCB0aHJvd2luZyB1cCBpbiBub2RlIGVudmlyb25tZW50cy5cbmZ1bmN0aW9uIGdldEN1cnNvckFkdmFuY2VNZXRob2RzKCkge1xuICAgIHJldHVybiAoY3Vyc29yQWR2YW5jZU1ldGhvZHMgfHxcbiAgICAgICAgKGN1cnNvckFkdmFuY2VNZXRob2RzID0gW1xuICAgICAgICAgICAgSURCQ3Vyc29yLnByb3RvdHlwZS5hZHZhbmNlLFxuICAgICAgICAgICAgSURCQ3Vyc29yLnByb3RvdHlwZS5jb250aW51ZSxcbiAgICAgICAgICAgIElEQkN1cnNvci5wcm90b3R5cGUuY29udGludWVQcmltYXJ5S2V5LFxuICAgICAgICBdKSk7XG59XG5jb25zdCBjdXJzb3JSZXF1ZXN0TWFwID0gbmV3IFdlYWtNYXAoKTtcbmNvbnN0IHRyYW5zYWN0aW9uRG9uZU1hcCA9IG5ldyBXZWFrTWFwKCk7XG5jb25zdCB0cmFuc2FjdGlvblN0b3JlTmFtZXNNYXAgPSBuZXcgV2Vha01hcCgpO1xuY29uc3QgdHJhbnNmb3JtQ2FjaGUgPSBuZXcgV2Vha01hcCgpO1xuY29uc3QgcmV2ZXJzZVRyYW5zZm9ybUNhY2hlID0gbmV3IFdlYWtNYXAoKTtcbmZ1bmN0aW9uIHByb21pc2lmeVJlcXVlc3QocmVxdWVzdCkge1xuICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHVubGlzdGVuID0gKCkgPT4ge1xuICAgICAgICAgICAgcmVxdWVzdC5yZW1vdmVFdmVudExpc3RlbmVyKCdzdWNjZXNzJywgc3VjY2Vzcyk7XG4gICAgICAgICAgICByZXF1ZXN0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgZXJyb3IpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBzdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZSh3cmFwKHJlcXVlc3QucmVzdWx0KSk7XG4gICAgICAgICAgICB1bmxpc3RlbigpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBlcnJvciA9ICgpID0+IHtcbiAgICAgICAgICAgIHJlamVjdChyZXF1ZXN0LmVycm9yKTtcbiAgICAgICAgICAgIHVubGlzdGVuKCk7XG4gICAgICAgIH07XG4gICAgICAgIHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcignc3VjY2VzcycsIHN1Y2Nlc3MpO1xuICAgICAgICByZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgZXJyb3IpO1xuICAgIH0pO1xuICAgIHByb21pc2VcbiAgICAgICAgLnRoZW4oKHZhbHVlKSA9PiB7XG4gICAgICAgIC8vIFNpbmNlIGN1cnNvcmluZyByZXVzZXMgdGhlIElEQlJlcXVlc3QgKCpzaWdoKiksIHdlIGNhY2hlIGl0IGZvciBsYXRlciByZXRyaWV2YWxcbiAgICAgICAgLy8gKHNlZSB3cmFwRnVuY3Rpb24pLlxuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBJREJDdXJzb3IpIHtcbiAgICAgICAgICAgIGN1cnNvclJlcXVlc3RNYXAuc2V0KHZhbHVlLCByZXF1ZXN0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDYXRjaGluZyB0byBhdm9pZCBcIlVuY2F1Z2h0IFByb21pc2UgZXhjZXB0aW9uc1wiXG4gICAgfSlcbiAgICAgICAgLmNhdGNoKCgpID0+IHsgfSk7XG4gICAgLy8gVGhpcyBtYXBwaW5nIGV4aXN0cyBpbiByZXZlcnNlVHJhbnNmb3JtQ2FjaGUgYnV0IGRvZXNuJ3QgZG9lc24ndCBleGlzdCBpbiB0cmFuc2Zvcm1DYWNoZS4gVGhpc1xuICAgIC8vIGlzIGJlY2F1c2Ugd2UgY3JlYXRlIG1hbnkgcHJvbWlzZXMgZnJvbSBhIHNpbmdsZSBJREJSZXF1ZXN0LlxuICAgIHJldmVyc2VUcmFuc2Zvcm1DYWNoZS5zZXQocHJvbWlzZSwgcmVxdWVzdCk7XG4gICAgcmV0dXJuIHByb21pc2U7XG59XG5mdW5jdGlvbiBjYWNoZURvbmVQcm9taXNlRm9yVHJhbnNhY3Rpb24odHgpIHtcbiAgICAvLyBFYXJseSBiYWlsIGlmIHdlJ3ZlIGFscmVhZHkgY3JlYXRlZCBhIGRvbmUgcHJvbWlzZSBmb3IgdGhpcyB0cmFuc2FjdGlvbi5cbiAgICBpZiAodHJhbnNhY3Rpb25Eb25lTWFwLmhhcyh0eCkpXG4gICAgICAgIHJldHVybjtcbiAgICBjb25zdCBkb25lID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCB1bmxpc3RlbiA9ICgpID0+IHtcbiAgICAgICAgICAgIHR4LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NvbXBsZXRlJywgY29tcGxldGUpO1xuICAgICAgICAgICAgdHgucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBlcnJvcik7XG4gICAgICAgICAgICB0eC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIGVycm9yKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB1bmxpc3RlbigpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBlcnJvciA9ICgpID0+IHtcbiAgICAgICAgICAgIHJlamVjdCh0eC5lcnJvciB8fCBuZXcgRE9NRXhjZXB0aW9uKCdBYm9ydEVycm9yJywgJ0Fib3J0RXJyb3InKSk7XG4gICAgICAgICAgICB1bmxpc3RlbigpO1xuICAgICAgICB9O1xuICAgICAgICB0eC5hZGRFdmVudExpc3RlbmVyKCdjb21wbGV0ZScsIGNvbXBsZXRlKTtcbiAgICAgICAgdHguYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBlcnJvcik7XG4gICAgICAgIHR4LmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgZXJyb3IpO1xuICAgIH0pO1xuICAgIC8vIENhY2hlIGl0IGZvciBsYXRlciByZXRyaWV2YWwuXG4gICAgdHJhbnNhY3Rpb25Eb25lTWFwLnNldCh0eCwgZG9uZSk7XG59XG5sZXQgaWRiUHJveHlUcmFwcyA9IHtcbiAgICBnZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcikge1xuICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgSURCVHJhbnNhY3Rpb24pIHtcbiAgICAgICAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIHRyYW5zYWN0aW9uLmRvbmUuXG4gICAgICAgICAgICBpZiAocHJvcCA9PT0gJ2RvbmUnKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc2FjdGlvbkRvbmVNYXAuZ2V0KHRhcmdldCk7XG4gICAgICAgICAgICAvLyBQb2x5ZmlsbCBmb3Igb2JqZWN0U3RvcmVOYW1lcyBiZWNhdXNlIG9mIEVkZ2UuXG4gICAgICAgICAgICBpZiAocHJvcCA9PT0gJ29iamVjdFN0b3JlTmFtZXMnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5vYmplY3RTdG9yZU5hbWVzIHx8IHRyYW5zYWN0aW9uU3RvcmVOYW1lc01hcC5nZXQodGFyZ2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIE1ha2UgdHguc3RvcmUgcmV0dXJuIHRoZSBvbmx5IHN0b3JlIGluIHRoZSB0cmFuc2FjdGlvbiwgb3IgdW5kZWZpbmVkIGlmIHRoZXJlIGFyZSBtYW55LlxuICAgICAgICAgICAgaWYgKHByb3AgPT09ICdzdG9yZScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVjZWl2ZXIub2JqZWN0U3RvcmVOYW1lc1sxXVxuICAgICAgICAgICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICA6IHJlY2VpdmVyLm9iamVjdFN0b3JlKHJlY2VpdmVyLm9iamVjdFN0b3JlTmFtZXNbMF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEVsc2UgdHJhbnNmb3JtIHdoYXRldmVyIHdlIGdldCBiYWNrLlxuICAgICAgICByZXR1cm4gd3JhcCh0YXJnZXRbcHJvcF0pO1xuICAgIH0sXG4gICAgc2V0KHRhcmdldCwgcHJvcCwgdmFsdWUpIHtcbiAgICAgICAgdGFyZ2V0W3Byb3BdID0gdmFsdWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgaGFzKHRhcmdldCwgcHJvcCkge1xuICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgSURCVHJhbnNhY3Rpb24gJiZcbiAgICAgICAgICAgIChwcm9wID09PSAnZG9uZScgfHwgcHJvcCA9PT0gJ3N0b3JlJykpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wIGluIHRhcmdldDtcbiAgICB9LFxufTtcbmZ1bmN0aW9uIHJlcGxhY2VUcmFwcyhjYWxsYmFjaykge1xuICAgIGlkYlByb3h5VHJhcHMgPSBjYWxsYmFjayhpZGJQcm94eVRyYXBzKTtcbn1cbmZ1bmN0aW9uIHdyYXBGdW5jdGlvbihmdW5jKSB7XG4gICAgLy8gRHVlIHRvIGV4cGVjdGVkIG9iamVjdCBlcXVhbGl0eSAod2hpY2ggaXMgZW5mb3JjZWQgYnkgdGhlIGNhY2hpbmcgaW4gYHdyYXBgKSwgd2VcbiAgICAvLyBvbmx5IGNyZWF0ZSBvbmUgbmV3IGZ1bmMgcGVyIGZ1bmMuXG4gICAgLy8gRWRnZSBkb2Vzbid0IHN1cHBvcnQgb2JqZWN0U3RvcmVOYW1lcyAoYm9vbyksIHNvIHdlIHBvbHlmaWxsIGl0IGhlcmUuXG4gICAgaWYgKGZ1bmMgPT09IElEQkRhdGFiYXNlLnByb3RvdHlwZS50cmFuc2FjdGlvbiAmJlxuICAgICAgICAhKCdvYmplY3RTdG9yZU5hbWVzJyBpbiBJREJUcmFuc2FjdGlvbi5wcm90b3R5cGUpKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoc3RvcmVOYW1lcywgLi4uYXJncykge1xuICAgICAgICAgICAgY29uc3QgdHggPSBmdW5jLmNhbGwodW53cmFwKHRoaXMpLCBzdG9yZU5hbWVzLCAuLi5hcmdzKTtcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uU3RvcmVOYW1lc01hcC5zZXQodHgsIHN0b3JlTmFtZXMuc29ydCA/IHN0b3JlTmFtZXMuc29ydCgpIDogW3N0b3JlTmFtZXNdKTtcbiAgICAgICAgICAgIHJldHVybiB3cmFwKHR4KTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLy8gQ3Vyc29yIG1ldGhvZHMgYXJlIHNwZWNpYWwsIGFzIHRoZSBiZWhhdmlvdXIgaXMgYSBsaXR0bGUgbW9yZSBkaWZmZXJlbnQgdG8gc3RhbmRhcmQgSURCLiBJblxuICAgIC8vIElEQiwgeW91IGFkdmFuY2UgdGhlIGN1cnNvciBhbmQgd2FpdCBmb3IgYSBuZXcgJ3N1Y2Nlc3MnIG9uIHRoZSBJREJSZXF1ZXN0IHRoYXQgZ2F2ZSB5b3UgdGhlXG4gICAgLy8gY3Vyc29yLiBJdCdzIGtpbmRhIGxpa2UgYSBwcm9taXNlIHRoYXQgY2FuIHJlc29sdmUgd2l0aCBtYW55IHZhbHVlcy4gVGhhdCBkb2Vzbid0IG1ha2Ugc2Vuc2VcbiAgICAvLyB3aXRoIHJlYWwgcHJvbWlzZXMsIHNvIGVhY2ggYWR2YW5jZSBtZXRob2RzIHJldHVybnMgYSBuZXcgcHJvbWlzZSBmb3IgdGhlIGN1cnNvciBvYmplY3QsIG9yXG4gICAgLy8gdW5kZWZpbmVkIGlmIHRoZSBlbmQgb2YgdGhlIGN1cnNvciBoYXMgYmVlbiByZWFjaGVkLlxuICAgIGlmIChnZXRDdXJzb3JBZHZhbmNlTWV0aG9kcygpLmluY2x1ZGVzKGZ1bmMpKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgICAgICAgLy8gQ2FsbGluZyB0aGUgb3JpZ2luYWwgZnVuY3Rpb24gd2l0aCB0aGUgcHJveHkgYXMgJ3RoaXMnIGNhdXNlcyBJTExFR0FMIElOVk9DQVRJT04sIHNvIHdlIHVzZVxuICAgICAgICAgICAgLy8gdGhlIG9yaWdpbmFsIG9iamVjdC5cbiAgICAgICAgICAgIGZ1bmMuYXBwbHkodW53cmFwKHRoaXMpLCBhcmdzKTtcbiAgICAgICAgICAgIHJldHVybiB3cmFwKGN1cnNvclJlcXVlc3RNYXAuZ2V0KHRoaXMpKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgIC8vIENhbGxpbmcgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIHdpdGggdGhlIHByb3h5IGFzICd0aGlzJyBjYXVzZXMgSUxMRUdBTCBJTlZPQ0FUSU9OLCBzbyB3ZSB1c2VcbiAgICAgICAgLy8gdGhlIG9yaWdpbmFsIG9iamVjdC5cbiAgICAgICAgcmV0dXJuIHdyYXAoZnVuYy5hcHBseSh1bndyYXAodGhpcyksIGFyZ3MpKTtcbiAgICB9O1xufVxuZnVuY3Rpb24gdHJhbnNmb3JtQ2FjaGFibGVWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpXG4gICAgICAgIHJldHVybiB3cmFwRnVuY3Rpb24odmFsdWUpO1xuICAgIC8vIFRoaXMgZG9lc24ndCByZXR1cm4sIGl0IGp1c3QgY3JlYXRlcyBhICdkb25lJyBwcm9taXNlIGZvciB0aGUgdHJhbnNhY3Rpb24sXG4gICAgLy8gd2hpY2ggaXMgbGF0ZXIgcmV0dXJuZWQgZm9yIHRyYW5zYWN0aW9uLmRvbmUgKHNlZSBpZGJPYmplY3RIYW5kbGVyKS5cbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBJREJUcmFuc2FjdGlvbilcbiAgICAgICAgY2FjaGVEb25lUHJvbWlzZUZvclRyYW5zYWN0aW9uKHZhbHVlKTtcbiAgICBpZiAoaW5zdGFuY2VPZkFueSh2YWx1ZSwgZ2V0SWRiUHJveHlhYmxlVHlwZXMoKSkpXG4gICAgICAgIHJldHVybiBuZXcgUHJveHkodmFsdWUsIGlkYlByb3h5VHJhcHMpO1xuICAgIC8vIFJldHVybiB0aGUgc2FtZSB2YWx1ZSBiYWNrIGlmIHdlJ3JlIG5vdCBnb2luZyB0byB0cmFuc2Zvcm0gaXQuXG4gICAgcmV0dXJuIHZhbHVlO1xufVxuZnVuY3Rpb24gd3JhcCh2YWx1ZSkge1xuICAgIC8vIFdlIHNvbWV0aW1lcyBnZW5lcmF0ZSBtdWx0aXBsZSBwcm9taXNlcyBmcm9tIGEgc2luZ2xlIElEQlJlcXVlc3QgKGVnIHdoZW4gY3Vyc29yaW5nKSwgYmVjYXVzZVxuICAgIC8vIElEQiBpcyB3ZWlyZCBhbmQgYSBzaW5nbGUgSURCUmVxdWVzdCBjYW4geWllbGQgbWFueSByZXNwb25zZXMsIHNvIHRoZXNlIGNhbid0IGJlIGNhY2hlZC5cbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBJREJSZXF1ZXN0KVxuICAgICAgICByZXR1cm4gcHJvbWlzaWZ5UmVxdWVzdCh2YWx1ZSk7XG4gICAgLy8gSWYgd2UndmUgYWxyZWFkeSB0cmFuc2Zvcm1lZCB0aGlzIHZhbHVlIGJlZm9yZSwgcmV1c2UgdGhlIHRyYW5zZm9ybWVkIHZhbHVlLlxuICAgIC8vIFRoaXMgaXMgZmFzdGVyLCBidXQgaXQgYWxzbyBwcm92aWRlcyBvYmplY3QgZXF1YWxpdHkuXG4gICAgaWYgKHRyYW5zZm9ybUNhY2hlLmhhcyh2YWx1ZSkpXG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm1DYWNoZS5nZXQodmFsdWUpO1xuICAgIGNvbnN0IG5ld1ZhbHVlID0gdHJhbnNmb3JtQ2FjaGFibGVWYWx1ZSh2YWx1ZSk7XG4gICAgLy8gTm90IGFsbCB0eXBlcyBhcmUgdHJhbnNmb3JtZWQuXG4gICAgLy8gVGhlc2UgbWF5IGJlIHByaW1pdGl2ZSB0eXBlcywgc28gdGhleSBjYW4ndCBiZSBXZWFrTWFwIGtleXMuXG4gICAgaWYgKG5ld1ZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgICB0cmFuc2Zvcm1DYWNoZS5zZXQodmFsdWUsIG5ld1ZhbHVlKTtcbiAgICAgICAgcmV2ZXJzZVRyYW5zZm9ybUNhY2hlLnNldChuZXdWYWx1ZSwgdmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3VmFsdWU7XG59XG5jb25zdCB1bndyYXAgPSAodmFsdWUpID0+IHJldmVyc2VUcmFuc2Zvcm1DYWNoZS5nZXQodmFsdWUpO1xuXG5leHBvcnQgeyByZXZlcnNlVHJhbnNmb3JtQ2FjaGUgYXMgYSwgaW5zdGFuY2VPZkFueSBhcyBpLCByZXBsYWNlVHJhcHMgYXMgciwgdW53cmFwIGFzIHUsIHdyYXAgYXMgdyB9O1xuIiwgImltcG9ydCB7IHcgYXMgd3JhcCwgciBhcyByZXBsYWNlVHJhcHMgfSBmcm9tICcuL3dyYXAtaWRiLXZhbHVlLmpzJztcbmV4cG9ydCB7IHUgYXMgdW53cmFwLCB3IGFzIHdyYXAgfSBmcm9tICcuL3dyYXAtaWRiLXZhbHVlLmpzJztcblxuLyoqXG4gKiBPcGVuIGEgZGF0YWJhc2UuXG4gKlxuICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgZGF0YWJhc2UuXG4gKiBAcGFyYW0gdmVyc2lvbiBTY2hlbWEgdmVyc2lvbi5cbiAqIEBwYXJhbSBjYWxsYmFja3MgQWRkaXRpb25hbCBjYWxsYmFja3MuXG4gKi9cbmZ1bmN0aW9uIG9wZW5EQihuYW1lLCB2ZXJzaW9uLCB7IGJsb2NrZWQsIHVwZ3JhZGUsIGJsb2NraW5nLCB0ZXJtaW5hdGVkIH0gPSB7fSkge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBpbmRleGVkREIub3BlbihuYW1lLCB2ZXJzaW9uKTtcbiAgICBjb25zdCBvcGVuUHJvbWlzZSA9IHdyYXAocmVxdWVzdCk7XG4gICAgaWYgKHVwZ3JhZGUpIHtcbiAgICAgICAgcmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCd1cGdyYWRlbmVlZGVkJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICB1cGdyYWRlKHdyYXAocmVxdWVzdC5yZXN1bHQpLCBldmVudC5vbGRWZXJzaW9uLCBldmVudC5uZXdWZXJzaW9uLCB3cmFwKHJlcXVlc3QudHJhbnNhY3Rpb24pLCBldmVudCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoYmxvY2tlZCkge1xuICAgICAgICByZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoJ2Jsb2NrZWQnLCAoZXZlbnQpID0+IGJsb2NrZWQoXG4gICAgICAgIC8vIENhc3RpbmcgZHVlIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC1ET00tbGliLWdlbmVyYXRvci9wdWxsLzE0MDVcbiAgICAgICAgZXZlbnQub2xkVmVyc2lvbiwgZXZlbnQubmV3VmVyc2lvbiwgZXZlbnQpKTtcbiAgICB9XG4gICAgb3BlblByb21pc2VcbiAgICAgICAgLnRoZW4oKGRiKSA9PiB7XG4gICAgICAgIGlmICh0ZXJtaW5hdGVkKVxuICAgICAgICAgICAgZGIuYWRkRXZlbnRMaXN0ZW5lcignY2xvc2UnLCAoKSA9PiB0ZXJtaW5hdGVkKCkpO1xuICAgICAgICBpZiAoYmxvY2tpbmcpIHtcbiAgICAgICAgICAgIGRiLmFkZEV2ZW50TGlzdGVuZXIoJ3ZlcnNpb25jaGFuZ2UnLCAoZXZlbnQpID0+IGJsb2NraW5nKGV2ZW50Lm9sZFZlcnNpb24sIGV2ZW50Lm5ld1ZlcnNpb24sIGV2ZW50KSk7XG4gICAgICAgIH1cbiAgICB9KVxuICAgICAgICAuY2F0Y2goKCkgPT4geyB9KTtcbiAgICByZXR1cm4gb3BlblByb21pc2U7XG59XG4vKipcbiAqIERlbGV0ZSBhIGRhdGFiYXNlLlxuICpcbiAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGRhdGFiYXNlLlxuICovXG5mdW5jdGlvbiBkZWxldGVEQihuYW1lLCB7IGJsb2NrZWQgfSA9IHt9KSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IGluZGV4ZWREQi5kZWxldGVEYXRhYmFzZShuYW1lKTtcbiAgICBpZiAoYmxvY2tlZCkge1xuICAgICAgICByZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoJ2Jsb2NrZWQnLCAoZXZlbnQpID0+IGJsb2NrZWQoXG4gICAgICAgIC8vIENhc3RpbmcgZHVlIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC1ET00tbGliLWdlbmVyYXRvci9wdWxsLzE0MDVcbiAgICAgICAgZXZlbnQub2xkVmVyc2lvbiwgZXZlbnQpKTtcbiAgICB9XG4gICAgcmV0dXJuIHdyYXAocmVxdWVzdCkudGhlbigoKSA9PiB1bmRlZmluZWQpO1xufVxuXG5jb25zdCByZWFkTWV0aG9kcyA9IFsnZ2V0JywgJ2dldEtleScsICdnZXRBbGwnLCAnZ2V0QWxsS2V5cycsICdjb3VudCddO1xuY29uc3Qgd3JpdGVNZXRob2RzID0gWydwdXQnLCAnYWRkJywgJ2RlbGV0ZScsICdjbGVhciddO1xuY29uc3QgY2FjaGVkTWV0aG9kcyA9IG5ldyBNYXAoKTtcbmZ1bmN0aW9uIGdldE1ldGhvZCh0YXJnZXQsIHByb3ApIHtcbiAgICBpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBJREJEYXRhYmFzZSAmJlxuICAgICAgICAhKHByb3AgaW4gdGFyZ2V0KSAmJlxuICAgICAgICB0eXBlb2YgcHJvcCA9PT0gJ3N0cmluZycpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGNhY2hlZE1ldGhvZHMuZ2V0KHByb3ApKVxuICAgICAgICByZXR1cm4gY2FjaGVkTWV0aG9kcy5nZXQocHJvcCk7XG4gICAgY29uc3QgdGFyZ2V0RnVuY05hbWUgPSBwcm9wLnJlcGxhY2UoL0Zyb21JbmRleCQvLCAnJyk7XG4gICAgY29uc3QgdXNlSW5kZXggPSBwcm9wICE9PSB0YXJnZXRGdW5jTmFtZTtcbiAgICBjb25zdCBpc1dyaXRlID0gd3JpdGVNZXRob2RzLmluY2x1ZGVzKHRhcmdldEZ1bmNOYW1lKTtcbiAgICBpZiAoXG4gICAgLy8gQmFpbCBpZiB0aGUgdGFyZ2V0IGRvZXNuJ3QgZXhpc3Qgb24gdGhlIHRhcmdldC4gRWcsIGdldEFsbCBpc24ndCBpbiBFZGdlLlxuICAgICEodGFyZ2V0RnVuY05hbWUgaW4gKHVzZUluZGV4ID8gSURCSW5kZXggOiBJREJPYmplY3RTdG9yZSkucHJvdG90eXBlKSB8fFxuICAgICAgICAhKGlzV3JpdGUgfHwgcmVhZE1ldGhvZHMuaW5jbHVkZXModGFyZ2V0RnVuY05hbWUpKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG1ldGhvZCA9IGFzeW5jIGZ1bmN0aW9uIChzdG9yZU5hbWUsIC4uLmFyZ3MpIHtcbiAgICAgICAgLy8gaXNXcml0ZSA/ICdyZWFkd3JpdGUnIDogdW5kZWZpbmVkIGd6aXBwcyBiZXR0ZXIsIGJ1dCBmYWlscyBpbiBFZGdlIDooXG4gICAgICAgIGNvbnN0IHR4ID0gdGhpcy50cmFuc2FjdGlvbihzdG9yZU5hbWUsIGlzV3JpdGUgPyAncmVhZHdyaXRlJyA6ICdyZWFkb25seScpO1xuICAgICAgICBsZXQgdGFyZ2V0ID0gdHguc3RvcmU7XG4gICAgICAgIGlmICh1c2VJbmRleClcbiAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5pbmRleChhcmdzLnNoaWZ0KCkpO1xuICAgICAgICAvLyBNdXN0IHJlamVjdCBpZiBvcCByZWplY3RzLlxuICAgICAgICAvLyBJZiBpdCdzIGEgd3JpdGUgb3BlcmF0aW9uLCBtdXN0IHJlamVjdCBpZiB0eC5kb25lIHJlamVjdHMuXG4gICAgICAgIC8vIE11c3QgcmVqZWN0IHdpdGggb3AgcmVqZWN0aW9uIGZpcnN0LlxuICAgICAgICAvLyBNdXN0IHJlc29sdmUgd2l0aCBvcCB2YWx1ZS5cbiAgICAgICAgLy8gTXVzdCBoYW5kbGUgYm90aCBwcm9taXNlcyAobm8gdW5oYW5kbGVkIHJlamVjdGlvbnMpXG4gICAgICAgIHJldHVybiAoYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgdGFyZ2V0W3RhcmdldEZ1bmNOYW1lXSguLi5hcmdzKSxcbiAgICAgICAgICAgIGlzV3JpdGUgJiYgdHguZG9uZSxcbiAgICAgICAgXSkpWzBdO1xuICAgIH07XG4gICAgY2FjaGVkTWV0aG9kcy5zZXQocHJvcCwgbWV0aG9kKTtcbiAgICByZXR1cm4gbWV0aG9kO1xufVxucmVwbGFjZVRyYXBzKChvbGRUcmFwcykgPT4gKHtcbiAgICAuLi5vbGRUcmFwcyxcbiAgICBnZXQ6ICh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKSA9PiBnZXRNZXRob2QodGFyZ2V0LCBwcm9wKSB8fCBvbGRUcmFwcy5nZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlciksXG4gICAgaGFzOiAodGFyZ2V0LCBwcm9wKSA9PiAhIWdldE1ldGhvZCh0YXJnZXQsIHByb3ApIHx8IG9sZFRyYXBzLmhhcyh0YXJnZXQsIHByb3ApLFxufSkpO1xuXG5leHBvcnQgeyBkZWxldGVEQiwgb3BlbkRCIH07XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgQ29tcG9uZW50Q29udGFpbmVyLFxuICBDb21wb25lbnRUeXBlLFxuICBQcm92aWRlcixcbiAgTmFtZVxufSBmcm9tICdAZmlyZWJhc2UvY29tcG9uZW50JztcbmltcG9ydCB7IFBsYXRmb3JtTG9nZ2VyU2VydmljZSwgVmVyc2lvblNlcnZpY2UgfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIFBsYXRmb3JtTG9nZ2VyU2VydmljZUltcGwgaW1wbGVtZW50cyBQbGF0Zm9ybUxvZ2dlclNlcnZpY2Uge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyKSB7fVxuICAvLyBJbiBpbml0aWFsIGltcGxlbWVudGF0aW9uLCB0aGlzIHdpbGwgYmUgY2FsbGVkIGJ5IGluc3RhbGxhdGlvbnMgb25cbiAgLy8gYXV0aCB0b2tlbiByZWZyZXNoLCBhbmQgaW5zdGFsbGF0aW9ucyB3aWxsIHNlbmQgdGhpcyBzdHJpbmcuXG4gIGdldFBsYXRmb3JtSW5mb1N0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHByb3ZpZGVycyA9IHRoaXMuY29udGFpbmVyLmdldFByb3ZpZGVycygpO1xuICAgIC8vIExvb3AgdGhyb3VnaCBwcm92aWRlcnMgYW5kIGdldCBsaWJyYXJ5L3ZlcnNpb24gcGFpcnMgZnJvbSBhbnkgdGhhdCBhcmVcbiAgICAvLyB2ZXJzaW9uIGNvbXBvbmVudHMuXG4gICAgcmV0dXJuIHByb3ZpZGVyc1xuICAgICAgLm1hcChwcm92aWRlciA9PiB7XG4gICAgICAgIGlmIChpc1ZlcnNpb25TZXJ2aWNlUHJvdmlkZXIocHJvdmlkZXIpKSB7XG4gICAgICAgICAgY29uc3Qgc2VydmljZSA9IHByb3ZpZGVyLmdldEltbWVkaWF0ZSgpIGFzIFZlcnNpb25TZXJ2aWNlO1xuICAgICAgICAgIHJldHVybiBgJHtzZXJ2aWNlLmxpYnJhcnl9LyR7c2VydmljZS52ZXJzaW9ufWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKGxvZ1N0cmluZyA9PiBsb2dTdHJpbmcpXG4gICAgICAuam9pbignICcpO1xuICB9XG59XG4vKipcbiAqXG4gKiBAcGFyYW0gcHJvdmlkZXIgY2hlY2sgaWYgdGhpcyBwcm92aWRlciBwcm92aWRlcyBhIFZlcnNpb25TZXJ2aWNlXG4gKlxuICogTk9URTogVXNpbmcgUHJvdmlkZXI8J2FwcC12ZXJzaW9uJz4gaXMgYSBoYWNrIHRvIGluZGljYXRlIHRoYXQgdGhlIHByb3ZpZGVyXG4gKiBwcm92aWRlcyBWZXJzaW9uU2VydmljZS4gVGhlIHByb3ZpZGVyIGlzIG5vdCBuZWNlc3NhcmlseSBhICdhcHAtdmVyc2lvbidcbiAqIHByb3ZpZGVyLlxuICovXG5mdW5jdGlvbiBpc1ZlcnNpb25TZXJ2aWNlUHJvdmlkZXIocHJvdmlkZXI6IFByb3ZpZGVyPE5hbWU+KTogYm9vbGVhbiB7XG4gIGNvbnN0IGNvbXBvbmVudCA9IHByb3ZpZGVyLmdldENvbXBvbmVudCgpO1xuICByZXR1cm4gY29tcG9uZW50Py50eXBlID09PSBDb21wb25lbnRUeXBlLlZFUlNJT047XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnQGZpcmViYXNlL2xvZ2dlcic7XG5cbmV4cG9ydCBjb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKCdAZmlyZWJhc2UvYXBwJyk7XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgbmFtZSBhcyBhcHBOYW1lIH0gZnJvbSAnLi4vcGFja2FnZS5qc29uJztcbmltcG9ydCB7IG5hbWUgYXMgYXBwQ29tcGF0TmFtZSB9IGZyb20gJy4uLy4uL2FwcC1jb21wYXQvcGFja2FnZS5qc29uJztcbmltcG9ydCB7IG5hbWUgYXMgYW5hbHl0aWNzQ29tcGF0TmFtZSB9IGZyb20gJy4uLy4uLy4uL3BhY2thZ2VzL2FuYWx5dGljcy1jb21wYXQvcGFja2FnZS5qc29uJztcbmltcG9ydCB7IG5hbWUgYXMgYW5hbHl0aWNzTmFtZSB9IGZyb20gJy4uLy4uLy4uL3BhY2thZ2VzL2FuYWx5dGljcy9wYWNrYWdlLmpzb24nO1xuaW1wb3J0IHsgbmFtZSBhcyBhcHBDaGVja0NvbXBhdE5hbWUgfSBmcm9tICcuLi8uLi8uLi9wYWNrYWdlcy9hcHAtY2hlY2stY29tcGF0L3BhY2thZ2UuanNvbic7XG5pbXBvcnQgeyBuYW1lIGFzIGFwcENoZWNrTmFtZSB9IGZyb20gJy4uLy4uLy4uL3BhY2thZ2VzL2FwcC1jaGVjay9wYWNrYWdlLmpzb24nO1xuaW1wb3J0IHsgbmFtZSBhcyBhdXRoTmFtZSB9IGZyb20gJy4uLy4uLy4uL3BhY2thZ2VzL2F1dGgvcGFja2FnZS5qc29uJztcbmltcG9ydCB7IG5hbWUgYXMgYXV0aENvbXBhdE5hbWUgfSBmcm9tICcuLi8uLi8uLi9wYWNrYWdlcy9hdXRoLWNvbXBhdC9wYWNrYWdlLmpzb24nO1xuaW1wb3J0IHsgbmFtZSBhcyBkYXRhYmFzZU5hbWUgfSBmcm9tICcuLi8uLi8uLi9wYWNrYWdlcy9kYXRhYmFzZS9wYWNrYWdlLmpzb24nO1xuaW1wb3J0IHsgbmFtZSBhcyBkYXRhYmFzZUNvbXBhdE5hbWUgfSBmcm9tICcuLi8uLi8uLi9wYWNrYWdlcy9kYXRhYmFzZS1jb21wYXQvcGFja2FnZS5qc29uJztcbmltcG9ydCB7IG5hbWUgYXMgZnVuY3Rpb25zTmFtZSB9IGZyb20gJy4uLy4uLy4uL3BhY2thZ2VzL2Z1bmN0aW9ucy9wYWNrYWdlLmpzb24nO1xuaW1wb3J0IHsgbmFtZSBhcyBmdW5jdGlvbnNDb21wYXROYW1lIH0gZnJvbSAnLi4vLi4vLi4vcGFja2FnZXMvZnVuY3Rpb25zLWNvbXBhdC9wYWNrYWdlLmpzb24nO1xuaW1wb3J0IHsgbmFtZSBhcyBpbnN0YWxsYXRpb25zTmFtZSB9IGZyb20gJy4uLy4uLy4uL3BhY2thZ2VzL2luc3RhbGxhdGlvbnMvcGFja2FnZS5qc29uJztcbmltcG9ydCB7IG5hbWUgYXMgaW5zdGFsbGF0aW9uc0NvbXBhdE5hbWUgfSBmcm9tICcuLi8uLi8uLi9wYWNrYWdlcy9pbnN0YWxsYXRpb25zLWNvbXBhdC9wYWNrYWdlLmpzb24nO1xuaW1wb3J0IHsgbmFtZSBhcyBtZXNzYWdpbmdOYW1lIH0gZnJvbSAnLi4vLi4vLi4vcGFja2FnZXMvbWVzc2FnaW5nL3BhY2thZ2UuanNvbic7XG5pbXBvcnQgeyBuYW1lIGFzIG1lc3NhZ2luZ0NvbXBhdE5hbWUgfSBmcm9tICcuLi8uLi8uLi9wYWNrYWdlcy9tZXNzYWdpbmctY29tcGF0L3BhY2thZ2UuanNvbic7XG5pbXBvcnQgeyBuYW1lIGFzIHBlcmZvcm1hbmNlTmFtZSB9IGZyb20gJy4uLy4uLy4uL3BhY2thZ2VzL3BlcmZvcm1hbmNlL3BhY2thZ2UuanNvbic7XG5pbXBvcnQgeyBuYW1lIGFzIHBlcmZvcm1hbmNlQ29tcGF0TmFtZSB9IGZyb20gJy4uLy4uLy4uL3BhY2thZ2VzL3BlcmZvcm1hbmNlLWNvbXBhdC9wYWNrYWdlLmpzb24nO1xuaW1wb3J0IHsgbmFtZSBhcyByZW1vdGVDb25maWdOYW1lIH0gZnJvbSAnLi4vLi4vLi4vcGFja2FnZXMvcmVtb3RlLWNvbmZpZy9wYWNrYWdlLmpzb24nO1xuaW1wb3J0IHsgbmFtZSBhcyByZW1vdGVDb25maWdDb21wYXROYW1lIH0gZnJvbSAnLi4vLi4vLi4vcGFja2FnZXMvcmVtb3RlLWNvbmZpZy1jb21wYXQvcGFja2FnZS5qc29uJztcbmltcG9ydCB7IG5hbWUgYXMgc3RvcmFnZU5hbWUgfSBmcm9tICcuLi8uLi8uLi9wYWNrYWdlcy9zdG9yYWdlL3BhY2thZ2UuanNvbic7XG5pbXBvcnQgeyBuYW1lIGFzIHN0b3JhZ2VDb21wYXROYW1lIH0gZnJvbSAnLi4vLi4vLi4vcGFja2FnZXMvc3RvcmFnZS1jb21wYXQvcGFja2FnZS5qc29uJztcbmltcG9ydCB7IG5hbWUgYXMgZmlyZXN0b3JlTmFtZSB9IGZyb20gJy4uLy4uLy4uL3BhY2thZ2VzL2ZpcmVzdG9yZS9wYWNrYWdlLmpzb24nO1xuaW1wb3J0IHsgbmFtZSBhcyBmaXJlc3RvcmVDb21wYXROYW1lIH0gZnJvbSAnLi4vLi4vLi4vcGFja2FnZXMvZmlyZXN0b3JlLWNvbXBhdC9wYWNrYWdlLmpzb24nO1xuaW1wb3J0IHsgbmFtZSBhcyBwYWNrYWdlTmFtZSB9IGZyb20gJy4uLy4uLy4uL3BhY2thZ2VzL2ZpcmViYXNlL3BhY2thZ2UuanNvbic7XG5cbi8qKlxuICogVGhlIGRlZmF1bHQgYXBwIG5hbWVcbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfRU5UUllfTkFNRSA9ICdbREVGQVVMVF0nO1xuXG5leHBvcnQgY29uc3QgUExBVEZPUk1fTE9HX1NUUklORyA9IHtcbiAgW2FwcE5hbWVdOiAnZmlyZS1jb3JlJyxcbiAgW2FwcENvbXBhdE5hbWVdOiAnZmlyZS1jb3JlLWNvbXBhdCcsXG4gIFthbmFseXRpY3NOYW1lXTogJ2ZpcmUtYW5hbHl0aWNzJyxcbiAgW2FuYWx5dGljc0NvbXBhdE5hbWVdOiAnZmlyZS1hbmFseXRpY3MtY29tcGF0JyxcbiAgW2FwcENoZWNrTmFtZV06ICdmaXJlLWFwcC1jaGVjaycsXG4gIFthcHBDaGVja0NvbXBhdE5hbWVdOiAnZmlyZS1hcHAtY2hlY2stY29tcGF0JyxcbiAgW2F1dGhOYW1lXTogJ2ZpcmUtYXV0aCcsXG4gIFthdXRoQ29tcGF0TmFtZV06ICdmaXJlLWF1dGgtY29tcGF0JyxcbiAgW2RhdGFiYXNlTmFtZV06ICdmaXJlLXJ0ZGInLFxuICBbZGF0YWJhc2VDb21wYXROYW1lXTogJ2ZpcmUtcnRkYi1jb21wYXQnLFxuICBbZnVuY3Rpb25zTmFtZV06ICdmaXJlLWZuJyxcbiAgW2Z1bmN0aW9uc0NvbXBhdE5hbWVdOiAnZmlyZS1mbi1jb21wYXQnLFxuICBbaW5zdGFsbGF0aW9uc05hbWVdOiAnZmlyZS1paWQnLFxuICBbaW5zdGFsbGF0aW9uc0NvbXBhdE5hbWVdOiAnZmlyZS1paWQtY29tcGF0JyxcbiAgW21lc3NhZ2luZ05hbWVdOiAnZmlyZS1mY20nLFxuICBbbWVzc2FnaW5nQ29tcGF0TmFtZV06ICdmaXJlLWZjbS1jb21wYXQnLFxuICBbcGVyZm9ybWFuY2VOYW1lXTogJ2ZpcmUtcGVyZicsXG4gIFtwZXJmb3JtYW5jZUNvbXBhdE5hbWVdOiAnZmlyZS1wZXJmLWNvbXBhdCcsXG4gIFtyZW1vdGVDb25maWdOYW1lXTogJ2ZpcmUtcmMnLFxuICBbcmVtb3RlQ29uZmlnQ29tcGF0TmFtZV06ICdmaXJlLXJjLWNvbXBhdCcsXG4gIFtzdG9yYWdlTmFtZV06ICdmaXJlLWdjcycsXG4gIFtzdG9yYWdlQ29tcGF0TmFtZV06ICdmaXJlLWdjcy1jb21wYXQnLFxuICBbZmlyZXN0b3JlTmFtZV06ICdmaXJlLWZzdCcsXG4gIFtmaXJlc3RvcmVDb21wYXROYW1lXTogJ2ZpcmUtZnN0LWNvbXBhdCcsXG4gICdmaXJlLWpzJzogJ2ZpcmUtanMnLCAvLyBQbGF0Zm9ybSBpZGVudGlmaWVyIGZvciBKUyBTREsuXG4gIFtwYWNrYWdlTmFtZV06ICdmaXJlLWpzLWFsbCdcbn0gYXMgY29uc3Q7XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgRmlyZWJhc2VBcHAgfSBmcm9tICcuL3B1YmxpYy10eXBlcyc7XG5pbXBvcnQgeyBDb21wb25lbnQsIFByb3ZpZGVyLCBOYW1lIH0gZnJvbSAnQGZpcmViYXNlL2NvbXBvbmVudCc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgeyBERUZBVUxUX0VOVFJZX05BTUUgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBGaXJlYmFzZUFwcEltcGwgfSBmcm9tICcuL2ZpcmViYXNlQXBwJztcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IF9hcHBzID0gbmV3IE1hcDxzdHJpbmcsIEZpcmViYXNlQXBwPigpO1xuXG4vKipcbiAqIFJlZ2lzdGVyZWQgY29tcG9uZW50cy5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBjb25zdCBfY29tcG9uZW50cyA9IG5ldyBNYXA8c3RyaW5nLCBDb21wb25lbnQ8YW55Pj4oKTtcblxuLyoqXG4gKiBAcGFyYW0gY29tcG9uZW50IC0gdGhlIGNvbXBvbmVudCBiZWluZyBhZGRlZCB0byB0aGlzIGFwcCdzIGNvbnRhaW5lclxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gX2FkZENvbXBvbmVudDxUIGV4dGVuZHMgTmFtZT4oXG4gIGFwcDogRmlyZWJhc2VBcHAsXG4gIGNvbXBvbmVudDogQ29tcG9uZW50PFQ+XG4pOiB2b2lkIHtcbiAgdHJ5IHtcbiAgICAoYXBwIGFzIEZpcmViYXNlQXBwSW1wbCkuY29udGFpbmVyLmFkZENvbXBvbmVudChjb21wb25lbnQpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgYENvbXBvbmVudCAke2NvbXBvbmVudC5uYW1lfSBmYWlsZWQgdG8gcmVnaXN0ZXIgd2l0aCBGaXJlYmFzZUFwcCAke2FwcC5uYW1lfWAsXG4gICAgICBlXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9hZGRPck92ZXJ3cml0ZUNvbXBvbmVudChcbiAgYXBwOiBGaXJlYmFzZUFwcCxcbiAgY29tcG9uZW50OiBDb21wb25lbnRcbik6IHZvaWQge1xuICAoYXBwIGFzIEZpcmViYXNlQXBwSW1wbCkuY29udGFpbmVyLmFkZE9yT3ZlcndyaXRlQ29tcG9uZW50KGNvbXBvbmVudCk7XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSBjb21wb25lbnQgLSB0aGUgY29tcG9uZW50IHRvIHJlZ2lzdGVyXG4gKiBAcmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgY29tcG9uZW50IGlzIHJlZ2lzdGVyZWQgc3VjY2Vzc2Z1bGx5XG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfcmVnaXN0ZXJDb21wb25lbnQ8VCBleHRlbmRzIE5hbWU+KFxuICBjb21wb25lbnQ6IENvbXBvbmVudDxUPlxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGNvbXBvbmVudE5hbWUgPSBjb21wb25lbnQubmFtZTtcbiAgaWYgKF9jb21wb25lbnRzLmhhcyhjb21wb25lbnROYW1lKSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgIGBUaGVyZSB3ZXJlIG11bHRpcGxlIGF0dGVtcHRzIHRvIHJlZ2lzdGVyIGNvbXBvbmVudCAke2NvbXBvbmVudE5hbWV9LmBcbiAgICApO1xuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgX2NvbXBvbmVudHMuc2V0KGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudCk7XG5cbiAgLy8gYWRkIHRoZSBjb21wb25lbnQgdG8gZXhpc3RpbmcgYXBwIGluc3RhbmNlc1xuICBmb3IgKGNvbnN0IGFwcCBvZiBfYXBwcy52YWx1ZXMoKSkge1xuICAgIF9hZGRDb21wb25lbnQoYXBwIGFzIEZpcmViYXNlQXBwSW1wbCwgY29tcG9uZW50KTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0gYXBwIC0gRmlyZWJhc2VBcHAgaW5zdGFuY2VcbiAqIEBwYXJhbSBuYW1lIC0gc2VydmljZSBuYW1lXG4gKlxuICogQHJldHVybnMgdGhlIHByb3ZpZGVyIGZvciB0aGUgc2VydmljZSB3aXRoIHRoZSBtYXRjaGluZyBuYW1lXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfZ2V0UHJvdmlkZXI8VCBleHRlbmRzIE5hbWU+KFxuICBhcHA6IEZpcmViYXNlQXBwLFxuICBuYW1lOiBUXG4pOiBQcm92aWRlcjxUPiB7XG4gIGNvbnN0IGhlYXJ0YmVhdENvbnRyb2xsZXIgPSAoYXBwIGFzIEZpcmViYXNlQXBwSW1wbCkuY29udGFpbmVyXG4gICAgLmdldFByb3ZpZGVyKCdoZWFydGJlYXQnKVxuICAgIC5nZXRJbW1lZGlhdGUoeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgaWYgKGhlYXJ0YmVhdENvbnRyb2xsZXIpIHtcbiAgICB2b2lkIGhlYXJ0YmVhdENvbnRyb2xsZXIudHJpZ2dlckhlYXJ0YmVhdCgpO1xuICB9XG4gIHJldHVybiAoYXBwIGFzIEZpcmViYXNlQXBwSW1wbCkuY29udGFpbmVyLmdldFByb3ZpZGVyKG5hbWUpO1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0gYXBwIC0gRmlyZWJhc2VBcHAgaW5zdGFuY2VcbiAqIEBwYXJhbSBuYW1lIC0gc2VydmljZSBuYW1lXG4gKiBAcGFyYW0gaW5zdGFuY2VJZGVudGlmaWVyIC0gc2VydmljZSBpbnN0YW5jZSBpZGVudGlmaWVyIGluIGNhc2UgdGhlIHNlcnZpY2Ugc3VwcG9ydHMgbXVsdGlwbGUgaW5zdGFuY2VzXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfcmVtb3ZlU2VydmljZUluc3RhbmNlPFQgZXh0ZW5kcyBOYW1lPihcbiAgYXBwOiBGaXJlYmFzZUFwcCxcbiAgbmFtZTogVCxcbiAgaW5zdGFuY2VJZGVudGlmaWVyOiBzdHJpbmcgPSBERUZBVUxUX0VOVFJZX05BTUVcbik6IHZvaWQge1xuICBfZ2V0UHJvdmlkZXIoYXBwLCBuYW1lKS5jbGVhckluc3RhbmNlKGluc3RhbmNlSWRlbnRpZmllcik7XG59XG5cbi8qKlxuICogVGVzdCBvbmx5XG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfY2xlYXJDb21wb25lbnRzKCk6IHZvaWQge1xuICBfY29tcG9uZW50cy5jbGVhcigpO1xufVxuXG4vKipcbiAqIEV4cG9ydGVkIGluIG9yZGVyIHRvIGJlIHVzZWQgaW4gYXBwLWNvbXBhdCBwYWNrYWdlXG4gKi9cbmV4cG9ydCB7IERFRkFVTFRfRU5UUllfTkFNRSBhcyBfREVGQVVMVF9FTlRSWV9OQU1FIH07XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgRXJyb3JGYWN0b3J5LCBFcnJvck1hcCB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcblxuZXhwb3J0IGNvbnN0IGVudW0gQXBwRXJyb3Ige1xuICBOT19BUFAgPSAnbm8tYXBwJyxcbiAgQkFEX0FQUF9OQU1FID0gJ2JhZC1hcHAtbmFtZScsXG4gIERVUExJQ0FURV9BUFAgPSAnZHVwbGljYXRlLWFwcCcsXG4gIEFQUF9ERUxFVEVEID0gJ2FwcC1kZWxldGVkJyxcbiAgTk9fT1BUSU9OUyA9ICduby1vcHRpb25zJyxcbiAgSU5WQUxJRF9BUFBfQVJHVU1FTlQgPSAnaW52YWxpZC1hcHAtYXJndW1lbnQnLFxuICBJTlZBTElEX0xPR19BUkdVTUVOVCA9ICdpbnZhbGlkLWxvZy1hcmd1bWVudCcsXG4gIElEQl9PUEVOID0gJ2lkYi1vcGVuJyxcbiAgSURCX0dFVCA9ICdpZGItZ2V0JyxcbiAgSURCX1dSSVRFID0gJ2lkYi1zZXQnLFxuICBJREJfREVMRVRFID0gJ2lkYi1kZWxldGUnXG59XG5cbmNvbnN0IEVSUk9SUzogRXJyb3JNYXA8QXBwRXJyb3I+ID0ge1xuICBbQXBwRXJyb3IuTk9fQVBQXTpcbiAgICBcIk5vIEZpcmViYXNlIEFwcCAneyRhcHBOYW1lfScgaGFzIGJlZW4gY3JlYXRlZCAtIFwiICtcbiAgICAnY2FsbCBpbml0aWFsaXplQXBwKCkgZmlyc3QnLFxuICBbQXBwRXJyb3IuQkFEX0FQUF9OQU1FXTogXCJJbGxlZ2FsIEFwcCBuYW1lOiAneyRhcHBOYW1lfVwiLFxuICBbQXBwRXJyb3IuRFVQTElDQVRFX0FQUF06XG4gICAgXCJGaXJlYmFzZSBBcHAgbmFtZWQgJ3skYXBwTmFtZX0nIGFscmVhZHkgZXhpc3RzIHdpdGggZGlmZmVyZW50IG9wdGlvbnMgb3IgY29uZmlnXCIsXG4gIFtBcHBFcnJvci5BUFBfREVMRVRFRF06IFwiRmlyZWJhc2UgQXBwIG5hbWVkICd7JGFwcE5hbWV9JyBhbHJlYWR5IGRlbGV0ZWRcIixcbiAgW0FwcEVycm9yLk5PX09QVElPTlNdOlxuICAgICdOZWVkIHRvIHByb3ZpZGUgb3B0aW9ucywgd2hlbiBub3QgYmVpbmcgZGVwbG95ZWQgdG8gaG9zdGluZyB2aWEgc291cmNlLicsXG4gIFtBcHBFcnJvci5JTlZBTElEX0FQUF9BUkdVTUVOVF06XG4gICAgJ2ZpcmViYXNlLnskYXBwTmFtZX0oKSB0YWtlcyBlaXRoZXIgbm8gYXJndW1lbnQgb3IgYSAnICtcbiAgICAnRmlyZWJhc2UgQXBwIGluc3RhbmNlLicsXG4gIFtBcHBFcnJvci5JTlZBTElEX0xPR19BUkdVTUVOVF06XG4gICAgJ0ZpcnN0IGFyZ3VtZW50IHRvIGBvbkxvZ2AgbXVzdCBiZSBudWxsIG9yIGEgZnVuY3Rpb24uJyxcbiAgW0FwcEVycm9yLklEQl9PUEVOXTpcbiAgICAnRXJyb3IgdGhyb3duIHdoZW4gb3BlbmluZyBJbmRleGVkREIuIE9yaWdpbmFsIGVycm9yOiB7JG9yaWdpbmFsRXJyb3JNZXNzYWdlfS4nLFxuICBbQXBwRXJyb3IuSURCX0dFVF06XG4gICAgJ0Vycm9yIHRocm93biB3aGVuIHJlYWRpbmcgZnJvbSBJbmRleGVkREIuIE9yaWdpbmFsIGVycm9yOiB7JG9yaWdpbmFsRXJyb3JNZXNzYWdlfS4nLFxuICBbQXBwRXJyb3IuSURCX1dSSVRFXTpcbiAgICAnRXJyb3IgdGhyb3duIHdoZW4gd3JpdGluZyB0byBJbmRleGVkREIuIE9yaWdpbmFsIGVycm9yOiB7JG9yaWdpbmFsRXJyb3JNZXNzYWdlfS4nLFxuICBbQXBwRXJyb3IuSURCX0RFTEVURV06XG4gICAgJ0Vycm9yIHRocm93biB3aGVuIGRlbGV0aW5nIGZyb20gSW5kZXhlZERCLiBPcmlnaW5hbCBlcnJvcjogeyRvcmlnaW5hbEVycm9yTWVzc2FnZX0uJ1xufTtcblxuaW50ZXJmYWNlIEVycm9yUGFyYW1zIHtcbiAgW0FwcEVycm9yLk5PX0FQUF06IHsgYXBwTmFtZTogc3RyaW5nIH07XG4gIFtBcHBFcnJvci5CQURfQVBQX05BTUVdOiB7IGFwcE5hbWU6IHN0cmluZyB9O1xuICBbQXBwRXJyb3IuRFVQTElDQVRFX0FQUF06IHsgYXBwTmFtZTogc3RyaW5nIH07XG4gIFtBcHBFcnJvci5BUFBfREVMRVRFRF06IHsgYXBwTmFtZTogc3RyaW5nIH07XG4gIFtBcHBFcnJvci5JTlZBTElEX0FQUF9BUkdVTUVOVF06IHsgYXBwTmFtZTogc3RyaW5nIH07XG4gIFtBcHBFcnJvci5JREJfT1BFTl06IHsgb3JpZ2luYWxFcnJvck1lc3NhZ2U/OiBzdHJpbmcgfTtcbiAgW0FwcEVycm9yLklEQl9HRVRdOiB7IG9yaWdpbmFsRXJyb3JNZXNzYWdlPzogc3RyaW5nIH07XG4gIFtBcHBFcnJvci5JREJfV1JJVEVdOiB7IG9yaWdpbmFsRXJyb3JNZXNzYWdlPzogc3RyaW5nIH07XG4gIFtBcHBFcnJvci5JREJfREVMRVRFXTogeyBvcmlnaW5hbEVycm9yTWVzc2FnZT86IHN0cmluZyB9O1xufVxuXG5leHBvcnQgY29uc3QgRVJST1JfRkFDVE9SWSA9IG5ldyBFcnJvckZhY3Rvcnk8QXBwRXJyb3IsIEVycm9yUGFyYW1zPihcbiAgJ2FwcCcsXG4gICdGaXJlYmFzZScsXG4gIEVSUk9SU1xuKTtcbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQge1xuICBGaXJlYmFzZUFwcCxcbiAgRmlyZWJhc2VPcHRpb25zLFxuICBGaXJlYmFzZUFwcFNldHRpbmdzXG59IGZyb20gJy4vcHVibGljLXR5cGVzJztcbmltcG9ydCB7XG4gIENvbXBvbmVudENvbnRhaW5lcixcbiAgQ29tcG9uZW50LFxuICBDb21wb25lbnRUeXBlXG59IGZyb20gJ0BmaXJlYmFzZS9jb21wb25lbnQnO1xuaW1wb3J0IHsgRVJST1JfRkFDVE9SWSwgQXBwRXJyb3IgfSBmcm9tICcuL2Vycm9ycyc7XG5cbmV4cG9ydCBjbGFzcyBGaXJlYmFzZUFwcEltcGwgaW1wbGVtZW50cyBGaXJlYmFzZUFwcCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29wdGlvbnM6IEZpcmViYXNlT3B0aW9ucztcbiAgcHJpdmF0ZSByZWFkb25seSBfbmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogT3JpZ2luYWwgY29uZmlnIHZhbHVlcyBwYXNzZWQgaW4gYXMgYSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIuXG4gICAqIEl0IGlzIG9ubHkgdXNlZCB0byBjb21wYXJlIHdpdGggYW5vdGhlciBjb25maWcgb2JqZWN0IHRvIHN1cHBvcnQgaWRlbXBvdGVudCBpbml0aWFsaXplQXBwKCkuXG4gICAqXG4gICAqIFVwZGF0aW5nIGF1dG9tYXRpY0RhdGFDb2xsZWN0aW9uRW5hYmxlZCBvbiB0aGUgQXBwIGluc3RhbmNlIHdpbGwgbm90IGNoYW5nZSBpdHMgdmFsdWUgaW4gX2NvbmZpZy5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2NvbmZpZzogUmVxdWlyZWQ8RmlyZWJhc2VBcHBTZXR0aW5ncz47XG4gIHByaXZhdGUgX2F1dG9tYXRpY0RhdGFDb2xsZWN0aW9uRW5hYmxlZDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfaXNEZWxldGVkID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2NvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIG9wdGlvbnM6IEZpcmViYXNlT3B0aW9ucyxcbiAgICBjb25maWc6IFJlcXVpcmVkPEZpcmViYXNlQXBwU2V0dGluZ3M+LFxuICAgIGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyXG4gICkge1xuICAgIHRoaXMuX29wdGlvbnMgPSB7IC4uLm9wdGlvbnMgfTtcbiAgICB0aGlzLl9jb25maWcgPSB7IC4uLmNvbmZpZyB9O1xuICAgIHRoaXMuX25hbWUgPSBjb25maWcubmFtZTtcbiAgICB0aGlzLl9hdXRvbWF0aWNEYXRhQ29sbGVjdGlvbkVuYWJsZWQgPVxuICAgICAgY29uZmlnLmF1dG9tYXRpY0RhdGFDb2xsZWN0aW9uRW5hYmxlZDtcbiAgICB0aGlzLl9jb250YWluZXIgPSBjb250YWluZXI7XG4gICAgdGhpcy5jb250YWluZXIuYWRkQ29tcG9uZW50KFxuICAgICAgbmV3IENvbXBvbmVudCgnYXBwJywgKCkgPT4gdGhpcywgQ29tcG9uZW50VHlwZS5QVUJMSUMpXG4gICAgKTtcbiAgfVxuXG4gIGdldCBhdXRvbWF0aWNEYXRhQ29sbGVjdGlvbkVuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgdGhpcy5jaGVja0Rlc3Ryb3llZCgpO1xuICAgIHJldHVybiB0aGlzLl9hdXRvbWF0aWNEYXRhQ29sbGVjdGlvbkVuYWJsZWQ7XG4gIH1cblxuICBzZXQgYXV0b21hdGljRGF0YUNvbGxlY3Rpb25FbmFibGVkKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuY2hlY2tEZXN0cm95ZWQoKTtcbiAgICB0aGlzLl9hdXRvbWF0aWNEYXRhQ29sbGVjdGlvbkVuYWJsZWQgPSB2YWw7XG4gIH1cblxuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHRoaXMuY2hlY2tEZXN0cm95ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgfVxuXG4gIGdldCBvcHRpb25zKCk6IEZpcmViYXNlT3B0aW9ucyB7XG4gICAgdGhpcy5jaGVja0Rlc3Ryb3llZCgpO1xuICAgIHJldHVybiB0aGlzLl9vcHRpb25zO1xuICB9XG5cbiAgZ2V0IGNvbmZpZygpOiBSZXF1aXJlZDxGaXJlYmFzZUFwcFNldHRpbmdzPiB7XG4gICAgdGhpcy5jaGVja0Rlc3Ryb3llZCgpO1xuICAgIHJldHVybiB0aGlzLl9jb25maWc7XG4gIH1cblxuICBnZXQgY29udGFpbmVyKCk6IENvbXBvbmVudENvbnRhaW5lciB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnRhaW5lcjtcbiAgfVxuXG4gIGdldCBpc0RlbGV0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzRGVsZXRlZDtcbiAgfVxuXG4gIHNldCBpc0RlbGV0ZWQodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5faXNEZWxldGVkID0gdmFsO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZnVuY3Rpb24gd2lsbCB0aHJvdyBhbiBFcnJvciBpZiB0aGUgQXBwIGhhcyBhbHJlYWR5IGJlZW4gZGVsZXRlZCAtXG4gICAqIHVzZSBiZWZvcmUgcGVyZm9ybWluZyBBUEkgYWN0aW9ucyBvbiB0aGUgQXBwLlxuICAgKi9cbiAgcHJpdmF0ZSBjaGVja0Rlc3Ryb3llZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0RlbGV0ZWQpIHtcbiAgICAgIHRocm93IEVSUk9SX0ZBQ1RPUlkuY3JlYXRlKEFwcEVycm9yLkFQUF9ERUxFVEVELCB7IGFwcE5hbWU6IHRoaXMuX25hbWUgfSk7XG4gICAgfVxuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgRmlyZWJhc2VBcHAsXG4gIEZpcmViYXNlT3B0aW9ucyxcbiAgRmlyZWJhc2VBcHBTZXR0aW5nc1xufSBmcm9tICcuL3B1YmxpYy10eXBlcyc7XG5pbXBvcnQgeyBERUZBVUxUX0VOVFJZX05BTUUsIFBMQVRGT1JNX0xPR19TVFJJTkcgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBFUlJPUl9GQUNUT1JZLCBBcHBFcnJvciB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7XG4gIENvbXBvbmVudENvbnRhaW5lcixcbiAgQ29tcG9uZW50LFxuICBOYW1lLFxuICBDb21wb25lbnRUeXBlXG59IGZyb20gJ0BmaXJlYmFzZS9jb21wb25lbnQnO1xuaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gJy4uLy4uL2ZpcmViYXNlL3BhY2thZ2UuanNvbic7XG5pbXBvcnQgeyBGaXJlYmFzZUFwcEltcGwgfSBmcm9tICcuL2ZpcmViYXNlQXBwJztcbmltcG9ydCB7IF9hcHBzLCBfY29tcG9uZW50cywgX3JlZ2lzdGVyQ29tcG9uZW50IH0gZnJvbSAnLi9pbnRlcm5hbCc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQge1xuICBMb2dMZXZlbFN0cmluZyxcbiAgc2V0TG9nTGV2ZWwgYXMgc2V0TG9nTGV2ZWxJbXBsLFxuICBMb2dDYWxsYmFjayxcbiAgTG9nT3B0aW9ucyxcbiAgc2V0VXNlckxvZ0hhbmRsZXJcbn0gZnJvbSAnQGZpcmViYXNlL2xvZ2dlcic7XG5pbXBvcnQgeyBkZWVwRXF1YWwsIGdldERlZmF1bHRBcHBDb25maWcgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5cbmV4cG9ydCB7IEZpcmViYXNlRXJyb3IgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5cbi8qKlxuICogVGhlIGN1cnJlbnQgU0RLIHZlcnNpb24uXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgU0RLX1ZFUlNJT04gPSB2ZXJzaW9uO1xuXG4vKipcbiAqIENyZWF0ZXMgYW5kIGluaXRpYWxpemVzIGEge0BsaW5rIEBmaXJlYmFzZS9hcHAjRmlyZWJhc2VBcHB9IGluc3RhbmNlLlxuICpcbiAqIFNlZVxuICoge0BsaW5rXG4gKiAgIGh0dHBzOi8vZmlyZWJhc2UuZ29vZ2xlLmNvbS9kb2NzL3dlYi9zZXR1cCNhZGRfZmlyZWJhc2VfdG9feW91cl9hcHBcbiAqICAgfCBBZGQgRmlyZWJhc2UgdG8geW91ciBhcHB9IGFuZFxuICoge0BsaW5rXG4gKiAgIGh0dHBzOi8vZmlyZWJhc2UuZ29vZ2xlLmNvbS9kb2NzL3dlYi9zZXR1cCNtdWx0aXBsZS1wcm9qZWN0c1xuICogICB8IEluaXRpYWxpemUgbXVsdGlwbGUgcHJvamVjdHN9IGZvciBkZXRhaWxlZCBkb2N1bWVudGF0aW9uLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBqYXZhc2NyaXB0XG4gKlxuICogLy8gSW5pdGlhbGl6ZSBkZWZhdWx0IGFwcFxuICogLy8gUmV0cmlldmUgeW91ciBvd24gb3B0aW9ucyB2YWx1ZXMgYnkgYWRkaW5nIGEgd2ViIGFwcCBvblxuICogLy8gaHR0cHM6Ly9jb25zb2xlLmZpcmViYXNlLmdvb2dsZS5jb21cbiAqIGluaXRpYWxpemVBcHAoe1xuICogICBhcGlLZXk6IFwiQUl6YS4uLi5cIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEF1dGggLyBHZW5lcmFsIFVzZVxuICogICBhdXRoRG9tYWluOiBcIllPVVJfQVBQLmZpcmViYXNlYXBwLmNvbVwiLCAgICAgICAgIC8vIEF1dGggd2l0aCBwb3B1cC9yZWRpcmVjdFxuICogICBkYXRhYmFzZVVSTDogXCJodHRwczovL1lPVVJfQVBQLmZpcmViYXNlaW8uY29tXCIsIC8vIFJlYWx0aW1lIERhdGFiYXNlXG4gKiAgIHN0b3JhZ2VCdWNrZXQ6IFwiWU9VUl9BUFAuYXBwc3BvdC5jb21cIiwgICAgICAgICAgLy8gU3RvcmFnZVxuICogICBtZXNzYWdpbmdTZW5kZXJJZDogXCIxMjM0NTY3ODlcIiAgICAgICAgICAgICAgICAgIC8vIENsb3VkIE1lc3NhZ2luZ1xuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgamF2YXNjcmlwdFxuICpcbiAqIC8vIEluaXRpYWxpemUgYW5vdGhlciBhcHBcbiAqIGNvbnN0IG90aGVyQXBwID0gaW5pdGlhbGl6ZUFwcCh7XG4gKiAgIGRhdGFiYXNlVVJMOiBcImh0dHBzOi8vPE9USEVSX0RBVEFCQVNFX05BTUU+LmZpcmViYXNlaW8uY29tXCIsXG4gKiAgIHN0b3JhZ2VCdWNrZXQ6IFwiPE9USEVSX1NUT1JBR0VfQlVDS0VUPi5hcHBzcG90LmNvbVwiXG4gKiB9LCBcIm90aGVyQXBwXCIpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIGNvbmZpZ3VyZSB0aGUgYXBwJ3Mgc2VydmljZXMuXG4gKiBAcGFyYW0gbmFtZSAtIE9wdGlvbmFsIG5hbWUgb2YgdGhlIGFwcCB0byBpbml0aWFsaXplLiBJZiBubyBuYW1lXG4gKiAgIGlzIHByb3ZpZGVkLCB0aGUgZGVmYXVsdCBpcyBgXCJbREVGQVVMVF1cImAuXG4gKlxuICogQHJldHVybnMgVGhlIGluaXRpYWxpemVkIGFwcC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0aWFsaXplQXBwKFxuICBvcHRpb25zOiBGaXJlYmFzZU9wdGlvbnMsXG4gIG5hbWU/OiBzdHJpbmdcbik6IEZpcmViYXNlQXBwO1xuLyoqXG4gKiBDcmVhdGVzIGFuZCBpbml0aWFsaXplcyBhIEZpcmViYXNlQXBwIGluc3RhbmNlLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBjb25maWd1cmUgdGhlIGFwcCdzIHNlcnZpY2VzLlxuICogQHBhcmFtIGNvbmZpZyAtIEZpcmViYXNlQXBwIENvbmZpZ3VyYXRpb25cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0aWFsaXplQXBwKFxuICBvcHRpb25zOiBGaXJlYmFzZU9wdGlvbnMsXG4gIGNvbmZpZz86IEZpcmViYXNlQXBwU2V0dGluZ3Ncbik6IEZpcmViYXNlQXBwO1xuLyoqXG4gKiBDcmVhdGVzIGFuZCBpbml0aWFsaXplcyBhIEZpcmViYXNlQXBwIGluc3RhbmNlLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRpYWxpemVBcHAoKTogRmlyZWJhc2VBcHA7XG5leHBvcnQgZnVuY3Rpb24gaW5pdGlhbGl6ZUFwcChcbiAgX29wdGlvbnM/OiBGaXJlYmFzZU9wdGlvbnMsXG4gIHJhd0NvbmZpZyA9IHt9XG4pOiBGaXJlYmFzZUFwcCB7XG4gIGxldCBvcHRpb25zID0gX29wdGlvbnM7XG5cbiAgaWYgKHR5cGVvZiByYXdDb25maWcgIT09ICdvYmplY3QnKSB7XG4gICAgY29uc3QgbmFtZSA9IHJhd0NvbmZpZztcbiAgICByYXdDb25maWcgPSB7IG5hbWUgfTtcbiAgfVxuXG4gIGNvbnN0IGNvbmZpZzogUmVxdWlyZWQ8RmlyZWJhc2VBcHBTZXR0aW5ncz4gPSB7XG4gICAgbmFtZTogREVGQVVMVF9FTlRSWV9OQU1FLFxuICAgIGF1dG9tYXRpY0RhdGFDb2xsZWN0aW9uRW5hYmxlZDogZmFsc2UsXG4gICAgLi4ucmF3Q29uZmlnXG4gIH07XG4gIGNvbnN0IG5hbWUgPSBjb25maWcubmFtZTtcblxuICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnIHx8ICFuYW1lKSB7XG4gICAgdGhyb3cgRVJST1JfRkFDVE9SWS5jcmVhdGUoQXBwRXJyb3IuQkFEX0FQUF9OQU1FLCB7XG4gICAgICBhcHBOYW1lOiBTdHJpbmcobmFtZSlcbiAgICB9KTtcbiAgfVxuXG4gIG9wdGlvbnMgfHw9IGdldERlZmF1bHRBcHBDb25maWcoKTtcblxuICBpZiAoIW9wdGlvbnMpIHtcbiAgICB0aHJvdyBFUlJPUl9GQUNUT1JZLmNyZWF0ZShBcHBFcnJvci5OT19PUFRJT05TKTtcbiAgfVxuXG4gIGNvbnN0IGV4aXN0aW5nQXBwID0gX2FwcHMuZ2V0KG5hbWUpIGFzIEZpcmViYXNlQXBwSW1wbDtcbiAgaWYgKGV4aXN0aW5nQXBwKSB7XG4gICAgLy8gcmV0dXJuIHRoZSBleGlzdGluZyBhcHAgaWYgb3B0aW9ucyBhbmQgY29uZmlnIGRlZXAgZXF1YWwgdGhlIG9uZXMgaW4gdGhlIGV4aXN0aW5nIGFwcC5cbiAgICBpZiAoXG4gICAgICBkZWVwRXF1YWwob3B0aW9ucywgZXhpc3RpbmdBcHAub3B0aW9ucykgJiZcbiAgICAgIGRlZXBFcXVhbChjb25maWcsIGV4aXN0aW5nQXBwLmNvbmZpZylcbiAgICApIHtcbiAgICAgIHJldHVybiBleGlzdGluZ0FwcDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgRVJST1JfRkFDVE9SWS5jcmVhdGUoQXBwRXJyb3IuRFVQTElDQVRFX0FQUCwgeyBhcHBOYW1lOiBuYW1lIH0pO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGNvbnRhaW5lciA9IG5ldyBDb21wb25lbnRDb250YWluZXIobmFtZSk7XG4gIGZvciAoY29uc3QgY29tcG9uZW50IG9mIF9jb21wb25lbnRzLnZhbHVlcygpKSB7XG4gICAgY29udGFpbmVyLmFkZENvbXBvbmVudChjb21wb25lbnQpO1xuICB9XG5cbiAgY29uc3QgbmV3QXBwID0gbmV3IEZpcmViYXNlQXBwSW1wbChvcHRpb25zLCBjb25maWcsIGNvbnRhaW5lcik7XG5cbiAgX2FwcHMuc2V0KG5hbWUsIG5ld0FwcCk7XG5cbiAgcmV0dXJuIG5ld0FwcDtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgYSB7QGxpbmsgQGZpcmViYXNlL2FwcCNGaXJlYmFzZUFwcH0gaW5zdGFuY2UuXG4gKlxuICogV2hlbiBjYWxsZWQgd2l0aCBubyBhcmd1bWVudHMsIHRoZSBkZWZhdWx0IGFwcCBpcyByZXR1cm5lZC4gV2hlbiBhbiBhcHAgbmFtZVxuICogaXMgcHJvdmlkZWQsIHRoZSBhcHAgY29ycmVzcG9uZGluZyB0byB0aGF0IG5hbWUgaXMgcmV0dXJuZWQuXG4gKlxuICogQW4gZXhjZXB0aW9uIGlzIHRocm93biBpZiB0aGUgYXBwIGJlaW5nIHJldHJpZXZlZCBoYXMgbm90IHlldCBiZWVuXG4gKiBpbml0aWFsaXplZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgamF2YXNjcmlwdFxuICogLy8gUmV0dXJuIHRoZSBkZWZhdWx0IGFwcFxuICogY29uc3QgYXBwID0gZ2V0QXBwKCk7XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgamF2YXNjcmlwdFxuICogLy8gUmV0dXJuIGEgbmFtZWQgYXBwXG4gKiBjb25zdCBvdGhlckFwcCA9IGdldEFwcChcIm90aGVyQXBwXCIpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIG5hbWUgLSBPcHRpb25hbCBuYW1lIG9mIHRoZSBhcHAgdG8gcmV0dXJuLiBJZiBubyBuYW1lIGlzXG4gKiAgIHByb3ZpZGVkLCB0aGUgZGVmYXVsdCBpcyBgXCJbREVGQVVMVF1cImAuXG4gKlxuICogQHJldHVybnMgVGhlIGFwcCBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm92aWRlZCBhcHAgbmFtZS5cbiAqICAgSWYgbm8gYXBwIG5hbWUgaXMgcHJvdmlkZWQsIHRoZSBkZWZhdWx0IGFwcCBpcyByZXR1cm5lZC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBcHAobmFtZTogc3RyaW5nID0gREVGQVVMVF9FTlRSWV9OQU1FKTogRmlyZWJhc2VBcHAge1xuICBjb25zdCBhcHAgPSBfYXBwcy5nZXQobmFtZSk7XG4gIGlmICghYXBwICYmIG5hbWUgPT09IERFRkFVTFRfRU5UUllfTkFNRSAmJiBnZXREZWZhdWx0QXBwQ29uZmlnKCkpIHtcbiAgICByZXR1cm4gaW5pdGlhbGl6ZUFwcCgpO1xuICB9XG4gIGlmICghYXBwKSB7XG4gICAgdGhyb3cgRVJST1JfRkFDVE9SWS5jcmVhdGUoQXBwRXJyb3IuTk9fQVBQLCB7IGFwcE5hbWU6IG5hbWUgfSk7XG4gIH1cblxuICByZXR1cm4gYXBwO1xufVxuXG4vKipcbiAqIEEgKHJlYWQtb25seSkgYXJyYXkgb2YgYWxsIGluaXRpYWxpemVkIGFwcHMuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBcHBzKCk6IEZpcmViYXNlQXBwW10ge1xuICByZXR1cm4gQXJyYXkuZnJvbShfYXBwcy52YWx1ZXMoKSk7XG59XG5cbi8qKlxuICogUmVuZGVycyB0aGlzIGFwcCB1bnVzYWJsZSBhbmQgZnJlZXMgdGhlIHJlc291cmNlcyBvZiBhbGwgYXNzb2NpYXRlZFxuICogc2VydmljZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGphdmFzY3JpcHRcbiAqIGRlbGV0ZUFwcChhcHApXG4gKiAgIC50aGVuKGZ1bmN0aW9uKCkge1xuICogICAgIGNvbnNvbGUubG9nKFwiQXBwIGRlbGV0ZWQgc3VjY2Vzc2Z1bGx5XCIpO1xuICogICB9KVxuICogICAuY2F0Y2goZnVuY3Rpb24oZXJyb3IpIHtcbiAqICAgICBjb25zb2xlLmxvZyhcIkVycm9yIGRlbGV0aW5nIGFwcDpcIiwgZXJyb3IpO1xuICogICB9KTtcbiAqIGBgYFxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUFwcChhcHA6IEZpcmViYXNlQXBwKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IG5hbWUgPSBhcHAubmFtZTtcbiAgaWYgKF9hcHBzLmhhcyhuYW1lKSkge1xuICAgIF9hcHBzLmRlbGV0ZShuYW1lKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIChhcHAgYXMgRmlyZWJhc2VBcHBJbXBsKS5jb250YWluZXJcbiAgICAgICAgLmdldFByb3ZpZGVycygpXG4gICAgICAgIC5tYXAocHJvdmlkZXIgPT4gcHJvdmlkZXIuZGVsZXRlKCkpXG4gICAgKTtcbiAgICAoYXBwIGFzIEZpcmViYXNlQXBwSW1wbCkuaXNEZWxldGVkID0gdHJ1ZTtcbiAgfVxufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBhIGxpYnJhcnkncyBuYW1lIGFuZCB2ZXJzaW9uIGZvciBwbGF0Zm9ybSBsb2dnaW5nIHB1cnBvc2VzLlxuICogQHBhcmFtIGxpYnJhcnkgLSBOYW1lIG9mIDFwIG9yIDNwIGxpYnJhcnkgKGUuZy4gZmlyZXN0b3JlLCBhbmd1bGFyZmlyZSlcbiAqIEBwYXJhbSB2ZXJzaW9uIC0gQ3VycmVudCB2ZXJzaW9uIG9mIHRoYXQgbGlicmFyeS5cbiAqIEBwYXJhbSB2YXJpYW50IC0gQnVuZGxlIHZhcmlhbnQsIGUuZy4sIG5vZGUsIHJuLCBldGMuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJWZXJzaW9uKFxuICBsaWJyYXJ5S2V5T3JOYW1lOiBzdHJpbmcsXG4gIHZlcnNpb246IHN0cmluZyxcbiAgdmFyaWFudD86IHN0cmluZ1xuKTogdm9pZCB7XG4gIC8vIFRPRE86IFdlIGNhbiB1c2UgdGhpcyBjaGVjayB0byB3aGl0ZWxpc3Qgc3RyaW5ncyB3aGVuL2lmIHdlIHNldCB1cFxuICAvLyBhIGdvb2Qgd2hpdGVsaXN0IHN5c3RlbS5cbiAgbGV0IGxpYnJhcnkgPSBQTEFURk9STV9MT0dfU1RSSU5HW2xpYnJhcnlLZXlPck5hbWVdID8/IGxpYnJhcnlLZXlPck5hbWU7XG4gIGlmICh2YXJpYW50KSB7XG4gICAgbGlicmFyeSArPSBgLSR7dmFyaWFudH1gO1xuICB9XG4gIGNvbnN0IGxpYnJhcnlNaXNtYXRjaCA9IGxpYnJhcnkubWF0Y2goL1xcc3xcXC8vKTtcbiAgY29uc3QgdmVyc2lvbk1pc21hdGNoID0gdmVyc2lvbi5tYXRjaCgvXFxzfFxcLy8pO1xuICBpZiAobGlicmFyeU1pc21hdGNoIHx8IHZlcnNpb25NaXNtYXRjaCkge1xuICAgIGNvbnN0IHdhcm5pbmcgPSBbXG4gICAgICBgVW5hYmxlIHRvIHJlZ2lzdGVyIGxpYnJhcnkgXCIke2xpYnJhcnl9XCIgd2l0aCB2ZXJzaW9uIFwiJHt2ZXJzaW9ufVwiOmBcbiAgICBdO1xuICAgIGlmIChsaWJyYXJ5TWlzbWF0Y2gpIHtcbiAgICAgIHdhcm5pbmcucHVzaChcbiAgICAgICAgYGxpYnJhcnkgbmFtZSBcIiR7bGlicmFyeX1cIiBjb250YWlucyBpbGxlZ2FsIGNoYXJhY3RlcnMgKHdoaXRlc3BhY2Ugb3IgXCIvXCIpYFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGxpYnJhcnlNaXNtYXRjaCAmJiB2ZXJzaW9uTWlzbWF0Y2gpIHtcbiAgICAgIHdhcm5pbmcucHVzaCgnYW5kJyk7XG4gICAgfVxuICAgIGlmICh2ZXJzaW9uTWlzbWF0Y2gpIHtcbiAgICAgIHdhcm5pbmcucHVzaChcbiAgICAgICAgYHZlcnNpb24gbmFtZSBcIiR7dmVyc2lvbn1cIiBjb250YWlucyBpbGxlZ2FsIGNoYXJhY3RlcnMgKHdoaXRlc3BhY2Ugb3IgXCIvXCIpYFxuICAgICAgKTtcbiAgICB9XG4gICAgbG9nZ2VyLndhcm4od2FybmluZy5qb2luKCcgJykpO1xuICAgIHJldHVybjtcbiAgfVxuICBfcmVnaXN0ZXJDb21wb25lbnQoXG4gICAgbmV3IENvbXBvbmVudChcbiAgICAgIGAke2xpYnJhcnl9LXZlcnNpb25gIGFzIE5hbWUsXG4gICAgICAoKSA9PiAoeyBsaWJyYXJ5LCB2ZXJzaW9uIH0pLFxuICAgICAgQ29tcG9uZW50VHlwZS5WRVJTSU9OXG4gICAgKVxuICApO1xufVxuXG4vKipcbiAqIFNldHMgbG9nIGhhbmRsZXIgZm9yIGFsbCBGaXJlYmFzZSBTREtzLlxuICogQHBhcmFtIGxvZ0NhbGxiYWNrIC0gQW4gb3B0aW9uYWwgY3VzdG9tIGxvZyBoYW5kbGVyIHRoYXQgZXhlY3V0ZXMgdXNlciBjb2RlIHdoZW5ldmVyXG4gKiB0aGUgRmlyZWJhc2UgU0RLIG1ha2VzIGEgbG9nZ2luZyBjYWxsLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uTG9nKFxuICBsb2dDYWxsYmFjazogTG9nQ2FsbGJhY2sgfCBudWxsLFxuICBvcHRpb25zPzogTG9nT3B0aW9uc1xuKTogdm9pZCB7XG4gIGlmIChsb2dDYWxsYmFjayAhPT0gbnVsbCAmJiB0eXBlb2YgbG9nQ2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBFUlJPUl9GQUNUT1JZLmNyZWF0ZShBcHBFcnJvci5JTlZBTElEX0xPR19BUkdVTUVOVCk7XG4gIH1cbiAgc2V0VXNlckxvZ0hhbmRsZXIobG9nQ2FsbGJhY2ssIG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIFNldHMgbG9nIGxldmVsIGZvciBhbGwgRmlyZWJhc2UgU0RLcy5cbiAqXG4gKiBBbGwgb2YgdGhlIGxvZyB0eXBlcyBhYm92ZSB0aGUgY3VycmVudCBsb2cgbGV2ZWwgYXJlIGNhcHR1cmVkIChpLmUuIGlmXG4gKiB5b3Ugc2V0IHRoZSBsb2cgbGV2ZWwgdG8gYGluZm9gLCBlcnJvcnMgYXJlIGxvZ2dlZCwgYnV0IGBkZWJ1Z2AgYW5kXG4gKiBgdmVyYm9zZWAgbG9ncyBhcmUgbm90KS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRMb2dMZXZlbChsb2dMZXZlbDogTG9nTGV2ZWxTdHJpbmcpOiB2b2lkIHtcbiAgc2V0TG9nTGV2ZWxJbXBsKGxvZ0xldmVsKTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBGaXJlYmFzZUVycm9yIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuaW1wb3J0IHsgREJTY2hlbWEsIG9wZW5EQiwgSURCUERhdGFiYXNlIH0gZnJvbSAnaWRiJztcbmltcG9ydCB7IEFwcEVycm9yLCBFUlJPUl9GQUNUT1JZIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHsgRmlyZWJhc2VBcHAgfSBmcm9tICcuL3B1YmxpYy10eXBlcyc7XG5pbXBvcnQgeyBIZWFydGJlYXRzSW5JbmRleGVkREIgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyJztcblxuY29uc3QgREJfTkFNRSA9ICdmaXJlYmFzZS1oZWFydGJlYXQtZGF0YWJhc2UnO1xuY29uc3QgREJfVkVSU0lPTiA9IDE7XG5jb25zdCBTVE9SRV9OQU1FID0gJ2ZpcmViYXNlLWhlYXJ0YmVhdC1zdG9yZSc7XG5cbmludGVyZmFjZSBBcHBEQiBleHRlbmRzIERCU2NoZW1hIHtcbiAgJ2ZpcmViYXNlLWhlYXJ0YmVhdC1zdG9yZSc6IHtcbiAgICBrZXk6IHN0cmluZztcbiAgICB2YWx1ZTogSGVhcnRiZWF0c0luSW5kZXhlZERCO1xuICB9O1xufVxuXG5sZXQgZGJQcm9taXNlOiBQcm9taXNlPElEQlBEYXRhYmFzZTxBcHBEQj4+IHwgbnVsbCA9IG51bGw7XG5mdW5jdGlvbiBnZXREYlByb21pc2UoKTogUHJvbWlzZTxJREJQRGF0YWJhc2U8QXBwREI+PiB7XG4gIGlmICghZGJQcm9taXNlKSB7XG4gICAgZGJQcm9taXNlID0gb3BlbkRCPEFwcERCPihEQl9OQU1FLCBEQl9WRVJTSU9OLCB7XG4gICAgICB1cGdyYWRlOiAoZGIsIG9sZFZlcnNpb24pID0+IHtcbiAgICAgICAgLy8gV2UgZG9uJ3QgdXNlICdicmVhaycgaW4gdGhpcyBzd2l0Y2ggc3RhdGVtZW50LCB0aGUgZmFsbC10aHJvdWdoXG4gICAgICAgIC8vIGJlaGF2aW9yIGlzIHdoYXQgd2Ugd2FudCwgYmVjYXVzZSBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgdmVyc2lvbnMgYmV0d2VlblxuICAgICAgICAvLyB0aGUgb2xkIHZlcnNpb24gYW5kIHRoZSBjdXJyZW50IHZlcnNpb24sIHdlIHdhbnQgQUxMIHRoZSBtaWdyYXRpb25zXG4gICAgICAgIC8vIHRoYXQgY29ycmVzcG9uZCB0byB0aG9zZSB2ZXJzaW9ucyB0byBydW4sIG5vdCBvbmx5IHRoZSBsYXN0IG9uZS5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGRlZmF1bHQtY2FzZVxuICAgICAgICBzd2l0Y2ggKG9sZFZlcnNpb24pIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBkYi5jcmVhdGVPYmplY3RTdG9yZShTVE9SRV9OQU1FKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pLmNhdGNoKGUgPT4ge1xuICAgICAgdGhyb3cgRVJST1JfRkFDVE9SWS5jcmVhdGUoQXBwRXJyb3IuSURCX09QRU4sIHtcbiAgICAgICAgb3JpZ2luYWxFcnJvck1lc3NhZ2U6IGUubWVzc2FnZVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGRiUHJvbWlzZTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRIZWFydGJlYXRzRnJvbUluZGV4ZWREQihcbiAgYXBwOiBGaXJlYmFzZUFwcFxuKTogUHJvbWlzZTxIZWFydGJlYXRzSW5JbmRleGVkREIgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBkYiA9IGF3YWl0IGdldERiUHJvbWlzZSgpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiXG4gICAgICAudHJhbnNhY3Rpb24oU1RPUkVfTkFNRSlcbiAgICAgIC5vYmplY3RTdG9yZShTVE9SRV9OQU1FKVxuICAgICAgLmdldChjb21wdXRlS2V5KGFwcCkpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoZSBpbnN0YW5jZW9mIEZpcmViYXNlRXJyb3IpIHtcbiAgICAgIGxvZ2dlci53YXJuKGUubWVzc2FnZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGlkYkdldEVycm9yID0gRVJST1JfRkFDVE9SWS5jcmVhdGUoQXBwRXJyb3IuSURCX0dFVCwge1xuICAgICAgICBvcmlnaW5hbEVycm9yTWVzc2FnZTogKGUgYXMgRXJyb3IpPy5tZXNzYWdlXG4gICAgICB9KTtcbiAgICAgIGxvZ2dlci53YXJuKGlkYkdldEVycm9yLm1lc3NhZ2UpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVIZWFydGJlYXRzVG9JbmRleGVkREIoXG4gIGFwcDogRmlyZWJhc2VBcHAsXG4gIGhlYXJ0YmVhdE9iamVjdDogSGVhcnRiZWF0c0luSW5kZXhlZERCXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBkYiA9IGF3YWl0IGdldERiUHJvbWlzZSgpO1xuICAgIGNvbnN0IHR4ID0gZGIudHJhbnNhY3Rpb24oU1RPUkVfTkFNRSwgJ3JlYWR3cml0ZScpO1xuICAgIGNvbnN0IG9iamVjdFN0b3JlID0gdHgub2JqZWN0U3RvcmUoU1RPUkVfTkFNRSk7XG4gICAgYXdhaXQgb2JqZWN0U3RvcmUucHV0KGhlYXJ0YmVhdE9iamVjdCwgY29tcHV0ZUtleShhcHApKTtcbiAgICBhd2FpdCB0eC5kb25lO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKGUgaW5zdGFuY2VvZiBGaXJlYmFzZUVycm9yKSB7XG4gICAgICBsb2dnZXIud2FybihlLm1lc3NhZ2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBpZGJHZXRFcnJvciA9IEVSUk9SX0ZBQ1RPUlkuY3JlYXRlKEFwcEVycm9yLklEQl9XUklURSwge1xuICAgICAgICBvcmlnaW5hbEVycm9yTWVzc2FnZTogKGUgYXMgRXJyb3IpPy5tZXNzYWdlXG4gICAgICB9KTtcbiAgICAgIGxvZ2dlci53YXJuKGlkYkdldEVycm9yLm1lc3NhZ2UpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21wdXRlS2V5KGFwcDogRmlyZWJhc2VBcHApOiBzdHJpbmcge1xuICByZXR1cm4gYCR7YXBwLm5hbWV9ISR7YXBwLm9wdGlvbnMuYXBwSWR9YDtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBDb21wb25lbnRDb250YWluZXIgfSBmcm9tICdAZmlyZWJhc2UvY29tcG9uZW50JztcbmltcG9ydCB7XG4gIGJhc2U2NHVybEVuY29kZVdpdGhvdXRQYWRkaW5nLFxuICBpc0luZGV4ZWREQkF2YWlsYWJsZSxcbiAgdmFsaWRhdGVJbmRleGVkREJPcGVuYWJsZVxufSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5pbXBvcnQge1xuICByZWFkSGVhcnRiZWF0c0Zyb21JbmRleGVkREIsXG4gIHdyaXRlSGVhcnRiZWF0c1RvSW5kZXhlZERCXG59IGZyb20gJy4vaW5kZXhlZGRiJztcbmltcG9ydCB7IEZpcmViYXNlQXBwIH0gZnJvbSAnLi9wdWJsaWMtdHlwZXMnO1xuaW1wb3J0IHtcbiAgSGVhcnRiZWF0c0J5VXNlckFnZW50LFxuICBIZWFydGJlYXRTZXJ2aWNlLFxuICBIZWFydGJlYXRzSW5JbmRleGVkREIsXG4gIEhlYXJ0YmVhdFN0b3JhZ2UsXG4gIFNpbmdsZURhdGVIZWFydGJlYXRcbn0gZnJvbSAnLi90eXBlcyc7XG5cbmNvbnN0IE1BWF9IRUFERVJfQllURVMgPSAxMDI0O1xuLy8gMzAgZGF5c1xuY29uc3QgU1RPUkVEX0hFQVJUQkVBVF9SRVRFTlRJT05fTUFYX01JTExJUyA9IDMwICogMjQgKiA2MCAqIDYwICogMTAwMDtcblxuZXhwb3J0IGNsYXNzIEhlYXJ0YmVhdFNlcnZpY2VJbXBsIGltcGxlbWVudHMgSGVhcnRiZWF0U2VydmljZSB7XG4gIC8qKlxuICAgKiBUaGUgcGVyc2lzdGVuY2UgbGF5ZXIgZm9yIGhlYXJ0YmVhdHNcbiAgICogTGVhdmUgcHVibGljIGZvciBlYXNpZXIgdGVzdGluZy5cbiAgICovXG4gIF9zdG9yYWdlOiBIZWFydGJlYXRTdG9yYWdlSW1wbDtcblxuICAvKipcbiAgICogSW4tbWVtb3J5IGNhY2hlIGZvciBoZWFydGJlYXRzLCB1c2VkIGJ5IGdldEhlYXJ0YmVhdHNIZWFkZXIoKSB0byBnZW5lcmF0ZVxuICAgKiB0aGUgaGVhZGVyIHN0cmluZy5cbiAgICogU3RvcmVzIG9uZSByZWNvcmQgcGVyIGRhdGUuIFRoaXMgd2lsbCBiZSBjb25zb2xpZGF0ZWQgaW50byB0aGUgc3RhbmRhcmRcbiAgICogZm9ybWF0IG9mIG9uZSByZWNvcmQgcGVyIHVzZXIgYWdlbnQgc3RyaW5nIGJlZm9yZSBiZWluZyBzZW50IGFzIGEgaGVhZGVyLlxuICAgKiBQb3B1bGF0ZWQgZnJvbSBpbmRleGVkREIgd2hlbiB0aGUgY29udHJvbGxlciBpcyBpbnN0YW50aWF0ZWQgYW5kIHNob3VsZFxuICAgKiBiZSBrZXB0IGluIHN5bmMgd2l0aCBpbmRleGVkREIuXG4gICAqIExlYXZlIHB1YmxpYyBmb3IgZWFzaWVyIHRlc3RpbmcuXG4gICAqL1xuICBfaGVhcnRiZWF0c0NhY2hlOiBIZWFydGJlYXRzSW5JbmRleGVkREIgfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogdGhlIGluaXRpYWxpemF0aW9uIHByb21pc2UgZm9yIHBvcHVsYXRpbmcgaGVhcnRiZWF0Q2FjaGUuXG4gICAqIElmIGdldEhlYXJ0YmVhdHNIZWFkZXIoKSBpcyBjYWxsZWQgYmVmb3JlIHRoZSBwcm9taXNlIHJlc29sdmVzXG4gICAqIChoZWFyYmVhdHNDYWNoZSA9PSBudWxsKSwgaXQgc2hvdWxkIHdhaXQgZm9yIHRoaXMgcHJvbWlzZVxuICAgKiBMZWF2ZSBwdWJsaWMgZm9yIGVhc2llciB0ZXN0aW5nLlxuICAgKi9cbiAgX2hlYXJ0YmVhdHNDYWNoZVByb21pc2U6IFByb21pc2U8SGVhcnRiZWF0c0luSW5kZXhlZERCPjtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lcikge1xuICAgIGNvbnN0IGFwcCA9IHRoaXMuY29udGFpbmVyLmdldFByb3ZpZGVyKCdhcHAnKS5nZXRJbW1lZGlhdGUoKTtcbiAgICB0aGlzLl9zdG9yYWdlID0gbmV3IEhlYXJ0YmVhdFN0b3JhZ2VJbXBsKGFwcCk7XG4gICAgdGhpcy5faGVhcnRiZWF0c0NhY2hlUHJvbWlzZSA9IHRoaXMuX3N0b3JhZ2UucmVhZCgpLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgIHRoaXMuX2hlYXJ0YmVhdHNDYWNoZSA9IHJlc3VsdDtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHRvIHJlcG9ydCBhIGhlYXJ0YmVhdC4gVGhlIGZ1bmN0aW9uIHdpbGwgZ2VuZXJhdGVcbiAgICogYSBIZWFydGJlYXRzQnlVc2VyQWdlbnQgb2JqZWN0LCB1cGRhdGUgaGVhcnRiZWF0c0NhY2hlLCBhbmQgcGVyc2lzdCBpdFxuICAgKiB0byBJbmRleGVkREIuXG4gICAqIE5vdGUgdGhhdCB3ZSBvbmx5IHN0b3JlIG9uZSBoZWFydGJlYXQgcGVyIGRheS4gU28gaWYgYSBoZWFydGJlYXQgZm9yIHRvZGF5IGlzXG4gICAqIGFscmVhZHkgbG9nZ2VkLCBzdWJzZXF1ZW50IGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24gaW4gdGhlIHNhbWUgZGF5IHdpbGwgYmUgaWdub3JlZC5cbiAgICovXG4gIGFzeW5jIHRyaWdnZXJIZWFydGJlYXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGxhdGZvcm1Mb2dnZXIgPSB0aGlzLmNvbnRhaW5lclxuICAgICAgLmdldFByb3ZpZGVyKCdwbGF0Zm9ybS1sb2dnZXInKVxuICAgICAgLmdldEltbWVkaWF0ZSgpO1xuXG4gICAgLy8gVGhpcyBpcyB0aGUgXCJGaXJlYmFzZSB1c2VyIGFnZW50XCIgc3RyaW5nIGZyb20gdGhlIHBsYXRmb3JtIGxvZ2dlclxuICAgIC8vIHNlcnZpY2UsIG5vdCB0aGUgYnJvd3NlciB1c2VyIGFnZW50LlxuICAgIGNvbnN0IGFnZW50ID0gcGxhdGZvcm1Mb2dnZXIuZ2V0UGxhdGZvcm1JbmZvU3RyaW5nKCk7XG4gICAgY29uc3QgZGF0ZSA9IGdldFVUQ0RhdGVTdHJpbmcoKTtcbiAgICBpZiAodGhpcy5faGVhcnRiZWF0c0NhY2hlID09PSBudWxsKSB7XG4gICAgICB0aGlzLl9oZWFydGJlYXRzQ2FjaGUgPSBhd2FpdCB0aGlzLl9oZWFydGJlYXRzQ2FjaGVQcm9taXNlO1xuICAgIH1cbiAgICAvLyBEbyBub3Qgc3RvcmUgYSBoZWFydGJlYXQgaWYgb25lIGlzIGFscmVhZHkgc3RvcmVkIGZvciB0aGlzIGRheVxuICAgIC8vIG9yIGlmIGEgaGVhZGVyIGhhcyBhbHJlYWR5IGJlZW4gc2VudCB0b2RheS5cbiAgICBpZiAoXG4gICAgICB0aGlzLl9oZWFydGJlYXRzQ2FjaGUubGFzdFNlbnRIZWFydGJlYXREYXRlID09PSBkYXRlIHx8XG4gICAgICB0aGlzLl9oZWFydGJlYXRzQ2FjaGUuaGVhcnRiZWF0cy5zb21lKFxuICAgICAgICBzaW5nbGVEYXRlSGVhcnRiZWF0ID0+IHNpbmdsZURhdGVIZWFydGJlYXQuZGF0ZSA9PT0gZGF0ZVxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGVyZSBpcyBubyBlbnRyeSBmb3IgdGhpcyBkYXRlLiBDcmVhdGUgb25lLlxuICAgICAgdGhpcy5faGVhcnRiZWF0c0NhY2hlLmhlYXJ0YmVhdHMucHVzaCh7IGRhdGUsIGFnZW50IH0pO1xuICAgIH1cbiAgICAvLyBSZW1vdmUgZW50cmllcyBvbGRlciB0aGFuIDMwIGRheXMuXG4gICAgdGhpcy5faGVhcnRiZWF0c0NhY2hlLmhlYXJ0YmVhdHMgPSB0aGlzLl9oZWFydGJlYXRzQ2FjaGUuaGVhcnRiZWF0cy5maWx0ZXIoXG4gICAgICBzaW5nbGVEYXRlSGVhcnRiZWF0ID0+IHtcbiAgICAgICAgY29uc3QgaGJUaW1lc3RhbXAgPSBuZXcgRGF0ZShzaW5nbGVEYXRlSGVhcnRiZWF0LmRhdGUpLnZhbHVlT2YoKTtcbiAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgcmV0dXJuIG5vdyAtIGhiVGltZXN0YW1wIDw9IFNUT1JFRF9IRUFSVEJFQVRfUkVURU5USU9OX01BWF9NSUxMSVM7XG4gICAgICB9XG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5fc3RvcmFnZS5vdmVyd3JpdGUodGhpcy5faGVhcnRiZWF0c0NhY2hlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgYmFzZTY0IGVuY29kZWQgc3RyaW5nIHdoaWNoIGNhbiBiZSBhdHRhY2hlZCB0byB0aGUgaGVhcnRiZWF0LXNwZWNpZmljIGhlYWRlciBkaXJlY3RseS5cbiAgICogSXQgYWxzbyBjbGVhcnMgYWxsIGhlYXJ0YmVhdHMgZnJvbSBtZW1vcnkgYXMgd2VsbCBhcyBpbiBJbmRleGVkREIuXG4gICAqXG4gICAqIE5PVEU6IENvbnN1bWluZyBwcm9kdWN0IFNES3Mgc2hvdWxkIG5vdCBzZW5kIHRoZSBoZWFkZXIgaWYgdGhpcyBtZXRob2RcbiAgICogcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcuXG4gICAqL1xuICBhc3luYyBnZXRIZWFydGJlYXRzSGVhZGVyKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKHRoaXMuX2hlYXJ0YmVhdHNDYWNoZSA9PT0gbnVsbCkge1xuICAgICAgYXdhaXQgdGhpcy5faGVhcnRiZWF0c0NhY2hlUHJvbWlzZTtcbiAgICB9XG4gICAgLy8gSWYgaXQncyBzdGlsbCBudWxsIG9yIHRoZSBhcnJheSBpcyBlbXB0eSwgdGhlcmUgaXMgbm8gZGF0YSB0byBzZW5kLlxuICAgIGlmIChcbiAgICAgIHRoaXMuX2hlYXJ0YmVhdHNDYWNoZSA9PT0gbnVsbCB8fFxuICAgICAgdGhpcy5faGVhcnRiZWF0c0NhY2hlLmhlYXJ0YmVhdHMubGVuZ3RoID09PSAwXG4gICAgKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGNvbnN0IGRhdGUgPSBnZXRVVENEYXRlU3RyaW5nKCk7XG4gICAgLy8gRXh0cmFjdCBhcyBtYW55IGhlYXJ0YmVhdHMgZnJvbSB0aGUgY2FjaGUgYXMgd2lsbCBmaXQgdW5kZXIgdGhlIHNpemUgbGltaXQuXG4gICAgY29uc3QgeyBoZWFydGJlYXRzVG9TZW5kLCB1bnNlbnRFbnRyaWVzIH0gPSBleHRyYWN0SGVhcnRiZWF0c0ZvckhlYWRlcihcbiAgICAgIHRoaXMuX2hlYXJ0YmVhdHNDYWNoZS5oZWFydGJlYXRzXG4gICAgKTtcbiAgICBjb25zdCBoZWFkZXJTdHJpbmcgPSBiYXNlNjR1cmxFbmNvZGVXaXRob3V0UGFkZGluZyhcbiAgICAgIEpTT04uc3RyaW5naWZ5KHsgdmVyc2lvbjogMiwgaGVhcnRiZWF0czogaGVhcnRiZWF0c1RvU2VuZCB9KVxuICAgICk7XG4gICAgLy8gU3RvcmUgbGFzdCBzZW50IGRhdGUgdG8gcHJldmVudCBhbm90aGVyIGJlaW5nIGxvZ2dlZC9zZW50IGZvciB0aGUgc2FtZSBkYXkuXG4gICAgdGhpcy5faGVhcnRiZWF0c0NhY2hlLmxhc3RTZW50SGVhcnRiZWF0RGF0ZSA9IGRhdGU7XG4gICAgaWYgKHVuc2VudEVudHJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gU3RvcmUgYW55IHVuc2VudCBlbnRyaWVzIGlmIHRoZXkgZXhpc3QuXG4gICAgICB0aGlzLl9oZWFydGJlYXRzQ2FjaGUuaGVhcnRiZWF0cyA9IHVuc2VudEVudHJpZXM7XG4gICAgICAvLyBUaGlzIHNlZW1zIG1vcmUgbGlrZWx5IHRoYW4gZW1wdHlpbmcgdGhlIGFycmF5IChiZWxvdykgdG8gbGVhZCB0byBzb21lIG9kZCBzdGF0ZVxuICAgICAgLy8gc2luY2UgdGhlIGNhY2hlIGlzbid0IGVtcHR5IGFuZCB0aGlzIHdpbGwgYmUgY2FsbGVkIGFnYWluIG9uIHRoZSBuZXh0IHJlcXVlc3QsXG4gICAgICAvLyBhbmQgaXMgcHJvYmFibHkgc2FmZXN0IGlmIHdlIGF3YWl0IGl0LlxuICAgICAgYXdhaXQgdGhpcy5fc3RvcmFnZS5vdmVyd3JpdGUodGhpcy5faGVhcnRiZWF0c0NhY2hlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5faGVhcnRiZWF0c0NhY2hlLmhlYXJ0YmVhdHMgPSBbXTtcbiAgICAgIC8vIERvIG5vdCB3YWl0IGZvciB0aGlzLCB0byByZWR1Y2UgbGF0ZW5jeS5cbiAgICAgIHZvaWQgdGhpcy5fc3RvcmFnZS5vdmVyd3JpdGUodGhpcy5faGVhcnRiZWF0c0NhY2hlKTtcbiAgICB9XG4gICAgcmV0dXJuIGhlYWRlclN0cmluZztcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRVVENEYXRlU3RyaW5nKCk6IHN0cmluZyB7XG4gIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgLy8gUmV0dXJucyBkYXRlIGZvcm1hdCAnWVlZWS1NTS1ERCdcbiAgcmV0dXJuIHRvZGF5LnRvSVNPU3RyaW5nKCkuc3Vic3RyaW5nKDAsIDEwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RIZWFydGJlYXRzRm9ySGVhZGVyKFxuICBoZWFydGJlYXRzQ2FjaGU6IFNpbmdsZURhdGVIZWFydGJlYXRbXSxcbiAgbWF4U2l6ZSA9IE1BWF9IRUFERVJfQllURVNcbik6IHtcbiAgaGVhcnRiZWF0c1RvU2VuZDogSGVhcnRiZWF0c0J5VXNlckFnZW50W107XG4gIHVuc2VudEVudHJpZXM6IFNpbmdsZURhdGVIZWFydGJlYXRbXTtcbn0ge1xuICAvLyBIZWFydGJlYXRzIGdyb3VwZWQgYnkgdXNlciBhZ2VudCBpbiB0aGUgc3RhbmRhcmQgZm9ybWF0IHRvIGJlIHNlbnQgaW5cbiAgLy8gdGhlIGhlYWRlci5cbiAgY29uc3QgaGVhcnRiZWF0c1RvU2VuZDogSGVhcnRiZWF0c0J5VXNlckFnZW50W10gPSBbXTtcbiAgLy8gU2luZ2xlIGRhdGUgZm9ybWF0IGhlYXJ0YmVhdHMgdGhhdCBhcmUgbm90IHNlbnQuXG4gIGxldCB1bnNlbnRFbnRyaWVzID0gaGVhcnRiZWF0c0NhY2hlLnNsaWNlKCk7XG4gIGZvciAoY29uc3Qgc2luZ2xlRGF0ZUhlYXJ0YmVhdCBvZiBoZWFydGJlYXRzQ2FjaGUpIHtcbiAgICAvLyBMb29rIGZvciBhbiBleGlzdGluZyBlbnRyeSB3aXRoIHRoZSBzYW1lIHVzZXIgYWdlbnQuXG4gICAgY29uc3QgaGVhcnRiZWF0RW50cnkgPSBoZWFydGJlYXRzVG9TZW5kLmZpbmQoXG4gICAgICBoYiA9PiBoYi5hZ2VudCA9PT0gc2luZ2xlRGF0ZUhlYXJ0YmVhdC5hZ2VudFxuICAgICk7XG4gICAgaWYgKCFoZWFydGJlYXRFbnRyeSkge1xuICAgICAgLy8gSWYgbm8gZW50cnkgZm9yIHRoaXMgdXNlciBhZ2VudCBleGlzdHMsIGNyZWF0ZSBvbmUuXG4gICAgICBoZWFydGJlYXRzVG9TZW5kLnB1c2goe1xuICAgICAgICBhZ2VudDogc2luZ2xlRGF0ZUhlYXJ0YmVhdC5hZ2VudCxcbiAgICAgICAgZGF0ZXM6IFtzaW5nbGVEYXRlSGVhcnRiZWF0LmRhdGVdXG4gICAgICB9KTtcbiAgICAgIGlmIChjb3VudEJ5dGVzKGhlYXJ0YmVhdHNUb1NlbmQpID4gbWF4U2l6ZSkge1xuICAgICAgICAvLyBJZiB0aGUgaGVhZGVyIHdvdWxkIGV4Y2VlZCBtYXggc2l6ZSwgcmVtb3ZlIHRoZSBhZGRlZCBoZWFydGJlYXRcbiAgICAgICAgLy8gZW50cnkgYW5kIHN0b3AgYWRkaW5nIHRvIHRoZSBoZWFkZXIuXG4gICAgICAgIGhlYXJ0YmVhdHNUb1NlbmQucG9wKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBoZWFydGJlYXRFbnRyeS5kYXRlcy5wdXNoKHNpbmdsZURhdGVIZWFydGJlYXQuZGF0ZSk7XG4gICAgICAvLyBJZiB0aGUgaGVhZGVyIHdvdWxkIGV4Y2VlZCBtYXggc2l6ZSwgcmVtb3ZlIHRoZSBhZGRlZCBkYXRlXG4gICAgICAvLyBhbmQgc3RvcCBhZGRpbmcgdG8gdGhlIGhlYWRlci5cbiAgICAgIGlmIChjb3VudEJ5dGVzKGhlYXJ0YmVhdHNUb1NlbmQpID4gbWF4U2l6ZSkge1xuICAgICAgICBoZWFydGJlYXRFbnRyeS5kYXRlcy5wb3AoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFBvcCB1bnNlbnQgZW50cnkgZnJvbSBxdWV1ZS4gKFNraXBwZWQgaWYgYWRkaW5nIHRoZSBlbnRyeSBleGNlZWRlZFxuICAgIC8vIHF1b3RhIGFuZCB0aGUgbG9vcCBicmVha3MgZWFybHkuKVxuICAgIHVuc2VudEVudHJpZXMgPSB1bnNlbnRFbnRyaWVzLnNsaWNlKDEpO1xuICB9XG4gIHJldHVybiB7XG4gICAgaGVhcnRiZWF0c1RvU2VuZCxcbiAgICB1bnNlbnRFbnRyaWVzXG4gIH07XG59XG5cbmV4cG9ydCBjbGFzcyBIZWFydGJlYXRTdG9yYWdlSW1wbCBpbXBsZW1lbnRzIEhlYXJ0YmVhdFN0b3JhZ2Uge1xuICBwcml2YXRlIF9jYW5Vc2VJbmRleGVkREJQcm9taXNlOiBQcm9taXNlPGJvb2xlYW4+O1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgYXBwOiBGaXJlYmFzZUFwcCkge1xuICAgIHRoaXMuX2NhblVzZUluZGV4ZWREQlByb21pc2UgPSB0aGlzLnJ1bkluZGV4ZWREQkVudmlyb25tZW50Q2hlY2soKTtcbiAgfVxuICBhc3luYyBydW5JbmRleGVkREJFbnZpcm9ubWVudENoZWNrKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghaXNJbmRleGVkREJBdmFpbGFibGUoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdmFsaWRhdGVJbmRleGVkREJPcGVuYWJsZSgpXG4gICAgICAgIC50aGVuKCgpID0+IHRydWUpXG4gICAgICAgIC5jYXRjaCgoKSA9PiBmYWxzZSk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZWFkIGFsbCBoZWFydGJlYXRzLlxuICAgKi9cbiAgYXN5bmMgcmVhZCgpOiBQcm9taXNlPEhlYXJ0YmVhdHNJbkluZGV4ZWREQj4ge1xuICAgIGNvbnN0IGNhblVzZUluZGV4ZWREQiA9IGF3YWl0IHRoaXMuX2NhblVzZUluZGV4ZWREQlByb21pc2U7XG4gICAgaWYgKCFjYW5Vc2VJbmRleGVkREIpIHtcbiAgICAgIHJldHVybiB7IGhlYXJ0YmVhdHM6IFtdIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGlkYkhlYXJ0YmVhdE9iamVjdCA9IGF3YWl0IHJlYWRIZWFydGJlYXRzRnJvbUluZGV4ZWREQih0aGlzLmFwcCk7XG4gICAgICByZXR1cm4gaWRiSGVhcnRiZWF0T2JqZWN0IHx8IHsgaGVhcnRiZWF0czogW10gfTtcbiAgICB9XG4gIH1cbiAgLy8gb3ZlcndyaXRlIHRoZSBzdG9yYWdlIHdpdGggdGhlIHByb3ZpZGVkIGhlYXJ0YmVhdHNcbiAgYXN5bmMgb3ZlcndyaXRlKGhlYXJ0YmVhdHNPYmplY3Q6IEhlYXJ0YmVhdHNJbkluZGV4ZWREQik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNhblVzZUluZGV4ZWREQiA9IGF3YWl0IHRoaXMuX2NhblVzZUluZGV4ZWREQlByb21pc2U7XG4gICAgaWYgKCFjYW5Vc2VJbmRleGVkREIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZXhpc3RpbmdIZWFydGJlYXRzT2JqZWN0ID0gYXdhaXQgdGhpcy5yZWFkKCk7XG4gICAgICByZXR1cm4gd3JpdGVIZWFydGJlYXRzVG9JbmRleGVkREIodGhpcy5hcHAsIHtcbiAgICAgICAgbGFzdFNlbnRIZWFydGJlYXREYXRlOlxuICAgICAgICAgIGhlYXJ0YmVhdHNPYmplY3QubGFzdFNlbnRIZWFydGJlYXREYXRlID8/XG4gICAgICAgICAgZXhpc3RpbmdIZWFydGJlYXRzT2JqZWN0Lmxhc3RTZW50SGVhcnRiZWF0RGF0ZSxcbiAgICAgICAgaGVhcnRiZWF0czogaGVhcnRiZWF0c09iamVjdC5oZWFydGJlYXRzXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgLy8gYWRkIGhlYXJ0YmVhdHNcbiAgYXN5bmMgYWRkKGhlYXJ0YmVhdHNPYmplY3Q6IEhlYXJ0YmVhdHNJbkluZGV4ZWREQik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNhblVzZUluZGV4ZWREQiA9IGF3YWl0IHRoaXMuX2NhblVzZUluZGV4ZWREQlByb21pc2U7XG4gICAgaWYgKCFjYW5Vc2VJbmRleGVkREIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZXhpc3RpbmdIZWFydGJlYXRzT2JqZWN0ID0gYXdhaXQgdGhpcy5yZWFkKCk7XG4gICAgICByZXR1cm4gd3JpdGVIZWFydGJlYXRzVG9JbmRleGVkREIodGhpcy5hcHAsIHtcbiAgICAgICAgbGFzdFNlbnRIZWFydGJlYXREYXRlOlxuICAgICAgICAgIGhlYXJ0YmVhdHNPYmplY3QubGFzdFNlbnRIZWFydGJlYXREYXRlID8/XG4gICAgICAgICAgZXhpc3RpbmdIZWFydGJlYXRzT2JqZWN0Lmxhc3RTZW50SGVhcnRiZWF0RGF0ZSxcbiAgICAgICAgaGVhcnRiZWF0czogW1xuICAgICAgICAgIC4uLmV4aXN0aW5nSGVhcnRiZWF0c09iamVjdC5oZWFydGJlYXRzLFxuICAgICAgICAgIC4uLmhlYXJ0YmVhdHNPYmplY3QuaGVhcnRiZWF0c1xuICAgICAgICBdXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDYWxjdWxhdGUgYnl0ZXMgb2YgYSBIZWFydGJlYXRzQnlVc2VyQWdlbnQgYXJyYXkgYWZ0ZXIgYmVpbmcgd3JhcHBlZFxuICogaW4gYSBwbGF0Zm9ybSBsb2dnaW5nIGhlYWRlciBKU09OIG9iamVjdCwgc3RyaW5naWZpZWQsIGFuZCBjb252ZXJ0ZWRcbiAqIHRvIGJhc2UgNjQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb3VudEJ5dGVzKGhlYXJ0YmVhdHNDYWNoZTogSGVhcnRiZWF0c0J5VXNlckFnZW50W10pOiBudW1iZXIge1xuICAvLyBiYXNlNjQgaGFzIGEgcmVzdHJpY3RlZCBzZXQgb2YgY2hhcmFjdGVycywgYWxsIG9mIHdoaWNoIHNob3VsZCBiZSAxIGJ5dGUuXG4gIHJldHVybiBiYXNlNjR1cmxFbmNvZGVXaXRob3V0UGFkZGluZyhcbiAgICAvLyBoZWFydGJlYXRzQ2FjaGUgd3JhcHBlciBwcm9wZXJ0aWVzXG4gICAgSlNPTi5zdHJpbmdpZnkoeyB2ZXJzaW9uOiAyLCBoZWFydGJlYXRzOiBoZWFydGJlYXRzQ2FjaGUgfSlcbiAgKS5sZW5ndGg7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgQ29tcG9uZW50LCBDb21wb25lbnRUeXBlIH0gZnJvbSAnQGZpcmViYXNlL2NvbXBvbmVudCc7XG5pbXBvcnQgeyBQbGF0Zm9ybUxvZ2dlclNlcnZpY2VJbXBsIH0gZnJvbSAnLi9wbGF0Zm9ybUxvZ2dlclNlcnZpY2UnO1xuaW1wb3J0IHsgbmFtZSwgdmVyc2lvbiB9IGZyb20gJy4uL3BhY2thZ2UuanNvbic7XG5pbXBvcnQgeyBfcmVnaXN0ZXJDb21wb25lbnQgfSBmcm9tICcuL2ludGVybmFsJztcbmltcG9ydCB7IHJlZ2lzdGVyVmVyc2lvbiB9IGZyb20gJy4vYXBpJztcbmltcG9ydCB7IEhlYXJ0YmVhdFNlcnZpY2VJbXBsIH0gZnJvbSAnLi9oZWFydGJlYXRTZXJ2aWNlJztcblxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyQ29yZUNvbXBvbmVudHModmFyaWFudD86IHN0cmluZyk6IHZvaWQge1xuICBfcmVnaXN0ZXJDb21wb25lbnQoXG4gICAgbmV3IENvbXBvbmVudChcbiAgICAgICdwbGF0Zm9ybS1sb2dnZXInLFxuICAgICAgY29udGFpbmVyID0+IG5ldyBQbGF0Zm9ybUxvZ2dlclNlcnZpY2VJbXBsKGNvbnRhaW5lciksXG4gICAgICBDb21wb25lbnRUeXBlLlBSSVZBVEVcbiAgICApXG4gICk7XG4gIF9yZWdpc3RlckNvbXBvbmVudChcbiAgICBuZXcgQ29tcG9uZW50KFxuICAgICAgJ2hlYXJ0YmVhdCcsXG4gICAgICBjb250YWluZXIgPT4gbmV3IEhlYXJ0YmVhdFNlcnZpY2VJbXBsKGNvbnRhaW5lciksXG4gICAgICBDb21wb25lbnRUeXBlLlBSSVZBVEVcbiAgICApXG4gICk7XG5cbiAgLy8gUmVnaXN0ZXIgYGFwcGAgcGFja2FnZS5cbiAgcmVnaXN0ZXJWZXJzaW9uKG5hbWUsIHZlcnNpb24sIHZhcmlhbnQpO1xuICAvLyBCVUlMRF9UQVJHRVQgd2lsbCBiZSByZXBsYWNlZCBieSB2YWx1ZXMgbGlrZSBlc201LCBlc20yMDE3LCBjanM1LCBldGMgZHVyaW5nIHRoZSBjb21waWxhdGlvblxuICByZWdpc3RlclZlcnNpb24obmFtZSwgdmVyc2lvbiwgJ19fQlVJTERfVEFSR0VUX18nKTtcbiAgLy8gUmVnaXN0ZXIgcGxhdGZvcm0gU0RLIGlkZW50aWZpZXIgKG5vIHZlcnNpb24pLlxuICByZWdpc3RlclZlcnNpb24oJ2ZpcmUtanMnLCAnJyk7XG59XG4iLCAiLyoqXG4gKiBGaXJlYmFzZSBBcHBcbiAqXG4gKiBAcmVtYXJrcyBUaGlzIHBhY2thZ2UgY29vcmRpbmF0ZXMgdGhlIGNvbW11bmljYXRpb24gYmV0d2VlbiB0aGUgZGlmZmVyZW50IEZpcmViYXNlIGNvbXBvbmVudHNcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICovXG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IHJlZ2lzdGVyQ29yZUNvbXBvbmVudHMgfSBmcm9tICcuL3JlZ2lzdGVyQ29yZUNvbXBvbmVudHMnO1xuXG5leHBvcnQgKiBmcm9tICcuL2FwaSc7XG5leHBvcnQgKiBmcm9tICcuL2ludGVybmFsJztcbmV4cG9ydCAqIGZyb20gJy4vcHVibGljLXR5cGVzJztcblxucmVnaXN0ZXJDb3JlQ29tcG9uZW50cygnX19SVU5USU1FX0VOVl9fJyk7XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IHJlZ2lzdGVyVmVyc2lvbiB9IGZyb20gJ0BmaXJlYmFzZS9hcHAnO1xuaW1wb3J0IHsgbmFtZSwgdmVyc2lvbiB9IGZyb20gJy4uL3BhY2thZ2UuanNvbic7XG5cbnJlZ2lzdGVyVmVyc2lvbihuYW1lLCB2ZXJzaW9uLCAnYXBwJyk7XG5leHBvcnQgKiBmcm9tICdAZmlyZWJhc2UvYXBwJztcbiIsICIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cblxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSwgU3VwcHJlc3NlZEVycm9yLCBTeW1ib2wgKi9cblxudmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7XG4gIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcbiAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XG4gIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XG4gIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XG4gIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59XG5cbmV4cG9ydCB2YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcbiAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcbiAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0O1xuICB9XG4gIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXG4gICAgICB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcbiAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XG4gICAgICB9XG4gIHJldHVybiB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xuICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xuICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xuICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xuICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19wYXJhbShwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2VzRGVjb3JhdGUoY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHtcbiAgZnVuY3Rpb24gYWNjZXB0KGYpIHsgaWYgKGYgIT09IHZvaWQgMCAmJiB0eXBlb2YgZiAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRnVuY3Rpb24gZXhwZWN0ZWRcIik7IHJldHVybiBmOyB9XG4gIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleSA9IGtpbmQgPT09IFwiZ2V0dGVyXCIgPyBcImdldFwiIDoga2luZCA9PT0gXCJzZXR0ZXJcIiA/IFwic2V0XCIgOiBcInZhbHVlXCI7XG4gIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bXCJzdGF0aWNcIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsO1xuICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTtcbiAgdmFyIF8sIGRvbmUgPSBmYWxzZTtcbiAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBjb250ZXh0ID0ge307XG4gICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbikgY29udGV4dFtwXSA9IHAgPT09IFwiYWNjZXNzXCIgPyB7fSA6IGNvbnRleHRJbltwXTtcbiAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dC5hY2Nlc3NbcF0gPSBjb250ZXh0SW4uYWNjZXNzW3BdO1xuICAgICAgY29udGV4dC5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uIChmKSB7IGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkXCIpOyBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmIHx8IG51bGwpKTsgfTtcbiAgICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpXSkoa2luZCA9PT0gXCJhY2Nlc3NvclwiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleV0sIGNvbnRleHQpO1xuICAgICAgaWYgKGtpbmQgPT09IFwiYWNjZXNzb3JcIikge1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSBcIm9iamVjdFwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkXCIpO1xuICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF87XG4gICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXztcbiAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoXyA9IGFjY2VwdChyZXN1bHQpKSB7XG4gICAgICAgICAgaWYgKGtpbmQgPT09IFwiZmllbGRcIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XG4gICAgICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleV0gPSBfO1xuICAgICAgfVxuICB9XG4gIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTtcbiAgZG9uZSA9IHRydWU7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19ydW5Jbml0aWFsaXplcnModGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZSkge1xuICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhbHVlID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnLCB2YWx1ZSkgOiBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnKTtcbiAgfVxuICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZSA6IHZvaWQgMDtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3Byb3BLZXkoeCkge1xuICByZXR1cm4gdHlwZW9mIHggPT09IFwic3ltYm9sXCIgPyB4IDogXCJcIi5jb25jYXQoeCk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19zZXRGdW5jdGlvbk5hbWUoZiwgbmFtZSwgcHJlZml4KSB7XG4gIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzeW1ib2xcIikgbmFtZSA9IG5hbWUuZGVzY3JpcHRpb24gPyBcIltcIi5jb25jYXQobmFtZS5kZXNjcmlwdGlvbiwgXCJdXCIpIDogXCJcIjtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCBcIm5hbWVcIiwgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiBwcmVmaXggPyBcIlwiLmNvbmNhdChwcmVmaXgsIFwiIFwiLCBuYW1lKSA6IG5hbWUgfSk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xuICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xuICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xuICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcbiAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XG4gIGZ1bmN0aW9uIHN0ZXAob3ApIHtcbiAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcbiAgICAgIHdoaWxlIChnICYmIChnID0gMCwgb3BbMF0gJiYgKF8gPSAwKSksIF8pIHRyeSB7XG4gICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xuICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcbiAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XG4gICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xuICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XG4gICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxuICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XG4gICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XG4gICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcbiAgfVxufVxuXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgfVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgb1trMl0gPSBtW2tdO1xufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xuICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHApKSBfX2NyZWF0ZUJpbmRpbmcobywgbSwgcCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XG4gIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7XG4gIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xuICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XG4gICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcbiAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XG4gICAgICB9XG4gIH07XG4gIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XG4gIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcbiAgaWYgKCFtKSByZXR1cm4gbztcbiAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XG4gIHRyeSB7XG4gICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcbiAgfVxuICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cbiAgZmluYWxseSB7XG4gICAgICB0cnkge1xuICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xuICAgICAgfVxuICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XG4gIH1cbiAgcmV0dXJuIGFyO1xufVxuXG4vKiogQGRlcHJlY2F0ZWQgKi9cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcbiAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXG4gICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XG4gIHJldHVybiBhcjtcbn1cblxuLyoqIEBkZXByZWNhdGVkICovXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XG4gIGZvciAodmFyIHMgPSAwLCBpID0gMCwgaWwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgaWw7IGkrKykgcyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xuICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXG4gICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcbiAgICAgICAgICByW2tdID0gYVtqXTtcbiAgcmV0dXJuIHI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tLCBwYWNrKSB7XG4gIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XG4gICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XG4gICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcbiAgICAgICAgICBhcltpXSA9IGZyb21baV07XG4gICAgICB9XG4gIH1cbiAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcbiAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xuICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xuICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xuICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XG4gIGZ1bmN0aW9uIHZlcmIobikgeyBpZiAoZ1tuXSkgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgfVxuICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XG4gIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxuICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XG4gIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cbiAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XG4gIHZhciBpLCBwO1xuICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xuICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBmYWxzZSB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XG4gIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG4gIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XG4gIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcbiAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxuICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xuICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxuICByZXR1cm4gY29va2VkO1xufTtcblxudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgb1tcImRlZmF1bHRcIl0gPSB2O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcbiAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XG4gIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xuICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XG4gIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHJlYWQgcHJpdmF0ZSBtZW1iZXIgZnJvbSBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xuICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XG4gIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcbiAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgc2V0dGVyXCIpO1xuICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xuICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRJbihzdGF0ZSwgcmVjZWl2ZXIpIHtcbiAgaWYgKHJlY2VpdmVyID09PSBudWxsIHx8ICh0eXBlb2YgcmVjZWl2ZXIgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHJlY2VpdmVyICE9PSBcImZ1bmN0aW9uXCIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHVzZSAnaW4nIG9wZXJhdG9yIG9uIG5vbi1vYmplY3RcIik7XG4gIHJldHVybiB0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyID09PSBzdGF0ZSA6IHN0YXRlLmhhcyhyZWNlaXZlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnYsIHZhbHVlLCBhc3luYykge1xuICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWQuXCIpO1xuICAgIHZhciBkaXNwb3NlO1xuICAgIGlmIChhc3luYykge1xuICAgICAgICBpZiAoIVN5bWJvbC5hc3luY0Rpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNEaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdO1xuICAgIH1cbiAgICBpZiAoZGlzcG9zZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgIGlmICghU3ltYm9sLmRpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuZGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuZGlzcG9zZV07XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZGlzcG9zZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IG5vdCBkaXNwb3NhYmxlLlwiKTtcbiAgICBlbnYuc3RhY2sucHVzaCh7IHZhbHVlOiB2YWx1ZSwgZGlzcG9zZTogZGlzcG9zZSwgYXN5bmM6IGFzeW5jIH0pO1xuICB9XG4gIGVsc2UgaWYgKGFzeW5jKSB7XG4gICAgZW52LnN0YWNrLnB1c2goeyBhc3luYzogdHJ1ZSB9KTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbnZhciBfU3VwcHJlc3NlZEVycm9yID0gdHlwZW9mIFN1cHByZXNzZWRFcnJvciA9PT0gXCJmdW5jdGlvblwiID8gU3VwcHJlc3NlZEVycm9yIDogZnVuY3Rpb24gKGVycm9yLCBzdXBwcmVzc2VkLCBtZXNzYWdlKSB7XG4gIHZhciBlID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICByZXR1cm4gZS5uYW1lID0gXCJTdXBwcmVzc2VkRXJyb3JcIiwgZS5lcnJvciA9IGVycm9yLCBlLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fZGlzcG9zZVJlc291cmNlcyhlbnYpIHtcbiAgZnVuY3Rpb24gZmFpbChlKSB7XG4gICAgZW52LmVycm9yID0gZW52Lmhhc0Vycm9yID8gbmV3IF9TdXBwcmVzc2VkRXJyb3IoZSwgZW52LmVycm9yLCBcIkFuIGVycm9yIHdhcyBzdXBwcmVzc2VkIGR1cmluZyBkaXNwb3NhbC5cIikgOiBlO1xuICAgIGVudi5oYXNFcnJvciA9IHRydWU7XG4gIH1cbiAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICB3aGlsZSAoZW52LnN0YWNrLmxlbmd0aCkge1xuICAgICAgdmFyIHJlYyA9IGVudi5zdGFjay5wb3AoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciByZXN1bHQgPSByZWMuZGlzcG9zZSAmJiByZWMuZGlzcG9zZS5jYWxsKHJlYy52YWx1ZSk7XG4gICAgICAgIGlmIChyZWMuYXN5bmMpIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzdWx0KS50aGVuKG5leHQsIGZ1bmN0aW9uKGUpIHsgZmFpbChlKTsgcmV0dXJuIG5leHQoKTsgfSk7XG4gICAgICB9XG4gICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgIGZhaWwoZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlbnYuaGFzRXJyb3IpIHRocm93IGVudi5lcnJvcjtcbiAgfVxuICByZXR1cm4gbmV4dCgpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIF9fZXh0ZW5kcyxcbiAgX19hc3NpZ24sXG4gIF9fcmVzdCxcbiAgX19kZWNvcmF0ZSxcbiAgX19wYXJhbSxcbiAgX19tZXRhZGF0YSxcbiAgX19hd2FpdGVyLFxuICBfX2dlbmVyYXRvcixcbiAgX19jcmVhdGVCaW5kaW5nLFxuICBfX2V4cG9ydFN0YXIsXG4gIF9fdmFsdWVzLFxuICBfX3JlYWQsXG4gIF9fc3ByZWFkLFxuICBfX3NwcmVhZEFycmF5cyxcbiAgX19zcHJlYWRBcnJheSxcbiAgX19hd2FpdCxcbiAgX19hc3luY0dlbmVyYXRvcixcbiAgX19hc3luY0RlbGVnYXRvcixcbiAgX19hc3luY1ZhbHVlcyxcbiAgX19tYWtlVGVtcGxhdGVPYmplY3QsXG4gIF9faW1wb3J0U3RhcixcbiAgX19pbXBvcnREZWZhdWx0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4sXG4gIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlLFxuICBfX2Rpc3Bvc2VSZXNvdXJjZXMsXG59O1xuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8qKlxuICogQW4gZW51bSBvZiBmYWN0b3JzIHRoYXQgbWF5IGJlIHVzZWQgZm9yIG11bHRpZmFjdG9yIGF1dGhlbnRpY2F0aW9uLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IEZhY3RvcklkID0ge1xuICAvKiogUGhvbmUgYXMgc2Vjb25kIGZhY3RvciAqL1xuICBQSE9ORTogJ3Bob25lJyxcbiAgVE9UUDogJ3RvdHAnXG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIEVudW1lcmF0aW9uIG9mIHN1cHBvcnRlZCBwcm92aWRlcnMuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgUHJvdmlkZXJJZCA9IHtcbiAgLyoqIEZhY2Vib29rIHByb3ZpZGVyIElEICovXG4gIEZBQ0VCT09LOiAnZmFjZWJvb2suY29tJyxcbiAgLyoqIEdpdEh1YiBwcm92aWRlciBJRCAqL1xuICBHSVRIVUI6ICdnaXRodWIuY29tJyxcbiAgLyoqIEdvb2dsZSBwcm92aWRlciBJRCAqL1xuICBHT09HTEU6ICdnb29nbGUuY29tJyxcbiAgLyoqIFBhc3N3b3JkIHByb3ZpZGVyICovXG4gIFBBU1NXT1JEOiAncGFzc3dvcmQnLFxuICAvKiogUGhvbmUgcHJvdmlkZXIgKi9cbiAgUEhPTkU6ICdwaG9uZScsXG4gIC8qKiBUd2l0dGVyIHByb3ZpZGVyIElEICovXG4gIFRXSVRURVI6ICd0d2l0dGVyLmNvbSdcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICogRW51bWVyYXRpb24gb2Ygc3VwcG9ydGVkIHNpZ24taW4gbWV0aG9kcy5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBTaWduSW5NZXRob2QgPSB7XG4gIC8qKiBFbWFpbCBsaW5rIHNpZ24gaW4gbWV0aG9kICovXG4gIEVNQUlMX0xJTks6ICdlbWFpbExpbmsnLFxuICAvKiogRW1haWwvcGFzc3dvcmQgc2lnbiBpbiBtZXRob2QgKi9cbiAgRU1BSUxfUEFTU1dPUkQ6ICdwYXNzd29yZCcsXG4gIC8qKiBGYWNlYm9vayBzaWduIGluIG1ldGhvZCAqL1xuICBGQUNFQk9PSzogJ2ZhY2Vib29rLmNvbScsXG4gIC8qKiBHaXRIdWIgc2lnbiBpbiBtZXRob2QgKi9cbiAgR0lUSFVCOiAnZ2l0aHViLmNvbScsXG4gIC8qKiBHb29nbGUgc2lnbiBpbiBtZXRob2QgKi9cbiAgR09PR0xFOiAnZ29vZ2xlLmNvbScsXG4gIC8qKiBQaG9uZSBzaWduIGluIG1ldGhvZCAqL1xuICBQSE9ORTogJ3Bob25lJyxcbiAgLyoqIFR3aXR0ZXIgc2lnbiBpbiBtZXRob2QgKi9cbiAgVFdJVFRFUjogJ3R3aXR0ZXIuY29tJ1xufSBhcyBjb25zdDtcblxuLyoqXG4gKiBFbnVtZXJhdGlvbiBvZiBzdXBwb3J0ZWQgb3BlcmF0aW9uIHR5cGVzLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IE9wZXJhdGlvblR5cGUgPSB7XG4gIC8qKiBPcGVyYXRpb24gaW52b2x2aW5nIGxpbmtpbmcgYW4gYWRkaXRpb25hbCBwcm92aWRlciB0byBhbiBhbHJlYWR5IHNpZ25lZC1pbiB1c2VyLiAqL1xuICBMSU5LOiAnbGluaycsXG4gIC8qKiBPcGVyYXRpb24gaW52b2x2aW5nIHVzaW5nIGEgcHJvdmlkZXIgdG8gcmVhdXRoZW50aWNhdGUgYW4gYWxyZWFkeSBzaWduZWQtaW4gdXNlci4gKi9cbiAgUkVBVVRIRU5USUNBVEU6ICdyZWF1dGhlbnRpY2F0ZScsXG4gIC8qKiBPcGVyYXRpb24gaW52b2x2aW5nIHNpZ25pbmcgaW4gYSB1c2VyLiAqL1xuICBTSUdOX0lOOiAnc2lnbkluJ1xufSBhcyBjb25zdDtcblxuLyoqXG4gKiBBbiBlbnVtZXJhdGlvbiBvZiB0aGUgcG9zc2libGUgZW1haWwgYWN0aW9uIHR5cGVzLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IEFjdGlvbkNvZGVPcGVyYXRpb24gPSB7XG4gIC8qKiBUaGUgZW1haWwgbGluayBzaWduLWluIGFjdGlvbi4gKi9cbiAgRU1BSUxfU0lHTklOOiAnRU1BSUxfU0lHTklOJyxcbiAgLyoqIFRoZSBwYXNzd29yZCByZXNldCBhY3Rpb24uICovXG4gIFBBU1NXT1JEX1JFU0VUOiAnUEFTU1dPUkRfUkVTRVQnLFxuICAvKiogVGhlIGVtYWlsIHJldm9jYXRpb24gYWN0aW9uLiAqL1xuICBSRUNPVkVSX0VNQUlMOiAnUkVDT1ZFUl9FTUFJTCcsXG4gIC8qKiBUaGUgcmV2ZXJ0IHNlY29uZCBmYWN0b3IgYWRkaXRpb24gZW1haWwgYWN0aW9uLiAqL1xuICBSRVZFUlRfU0VDT05EX0ZBQ1RPUl9BRERJVElPTjogJ1JFVkVSVF9TRUNPTkRfRkFDVE9SX0FERElUSU9OJyxcbiAgLyoqIFRoZSByZXZlcnQgc2Vjb25kIGZhY3RvciBhZGRpdGlvbiBlbWFpbCBhY3Rpb24uICovXG4gIFZFUklGWV9BTkRfQ0hBTkdFX0VNQUlMOiAnVkVSSUZZX0FORF9DSEFOR0VfRU1BSUwnLFxuICAvKiogVGhlIGVtYWlsIHZlcmlmaWNhdGlvbiBhY3Rpb24uICovXG4gIFZFUklGWV9FTUFJTDogJ1ZFUklGWV9FTUFJTCdcbn0gYXMgY29uc3Q7XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgQXV0aEVycm9yTWFwLCBVc2VyIH0gZnJvbSAnLi4vbW9kZWwvcHVibGljX3R5cGVzJztcbmltcG9ydCB7IEVycm9yRmFjdG9yeSwgRXJyb3JNYXAgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5cbmltcG9ydCB7IElkVG9rZW5NZmFSZXNwb25zZSB9IGZyb20gJy4uL2FwaS9hdXRoZW50aWNhdGlvbi9tZmEnO1xuaW1wb3J0IHsgQXBwTmFtZSB9IGZyb20gJy4uL21vZGVsL2F1dGgnO1xuaW1wb3J0IHsgQXV0aENyZWRlbnRpYWwgfSBmcm9tICcuL2NyZWRlbnRpYWxzJztcblxuLyoqXG4gKiBFbnVtZXJhdGlvbiBvZiBGaXJlYmFzZSBBdXRoIGVycm9yIGNvZGVzLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgZW51bSBBdXRoRXJyb3JDb2RlIHtcbiAgQURNSU5fT05MWV9PUEVSQVRJT04gPSAnYWRtaW4tcmVzdHJpY3RlZC1vcGVyYXRpb24nLFxuICBBUkdVTUVOVF9FUlJPUiA9ICdhcmd1bWVudC1lcnJvcicsXG4gIEFQUF9OT1RfQVVUSE9SSVpFRCA9ICdhcHAtbm90LWF1dGhvcml6ZWQnLFxuICBBUFBfTk9UX0lOU1RBTExFRCA9ICdhcHAtbm90LWluc3RhbGxlZCcsXG4gIENBUFRDSEFfQ0hFQ0tfRkFJTEVEID0gJ2NhcHRjaGEtY2hlY2stZmFpbGVkJyxcbiAgQ09ERV9FWFBJUkVEID0gJ2NvZGUtZXhwaXJlZCcsXG4gIENPUkRPVkFfTk9UX1JFQURZID0gJ2NvcmRvdmEtbm90LXJlYWR5JyxcbiAgQ09SU19VTlNVUFBPUlRFRCA9ICdjb3JzLXVuc3VwcG9ydGVkJyxcbiAgQ1JFREVOVElBTF9BTFJFQURZX0lOX1VTRSA9ICdjcmVkZW50aWFsLWFscmVhZHktaW4tdXNlJyxcbiAgQ1JFREVOVElBTF9NSVNNQVRDSCA9ICdjdXN0b20tdG9rZW4tbWlzbWF0Y2gnLFxuICBDUkVERU5USUFMX1RPT19PTERfTE9HSU5fQUdBSU4gPSAncmVxdWlyZXMtcmVjZW50LWxvZ2luJyxcbiAgREVQRU5ERU5UX1NES19JTklUX0JFRk9SRV9BVVRIID0gJ2RlcGVuZGVudC1zZGstaW5pdGlhbGl6ZWQtYmVmb3JlLWF1dGgnLFxuICBEWU5BTUlDX0xJTktfTk9UX0FDVElWQVRFRCA9ICdkeW5hbWljLWxpbmstbm90LWFjdGl2YXRlZCcsXG4gIEVNQUlMX0NIQU5HRV9ORUVEU19WRVJJRklDQVRJT04gPSAnZW1haWwtY2hhbmdlLW5lZWRzLXZlcmlmaWNhdGlvbicsXG4gIEVNQUlMX0VYSVNUUyA9ICdlbWFpbC1hbHJlYWR5LWluLXVzZScsXG4gIEVNVUxBVE9SX0NPTkZJR19GQUlMRUQgPSAnZW11bGF0b3ItY29uZmlnLWZhaWxlZCcsXG4gIEVYUElSRURfT09CX0NPREUgPSAnZXhwaXJlZC1hY3Rpb24tY29kZScsXG4gIEVYUElSRURfUE9QVVBfUkVRVUVTVCA9ICdjYW5jZWxsZWQtcG9wdXAtcmVxdWVzdCcsXG4gIElOVEVSTkFMX0VSUk9SID0gJ2ludGVybmFsLWVycm9yJyxcbiAgSU5WQUxJRF9BUElfS0VZID0gJ2ludmFsaWQtYXBpLWtleScsXG4gIElOVkFMSURfQVBQX0NSRURFTlRJQUwgPSAnaW52YWxpZC1hcHAtY3JlZGVudGlhbCcsXG4gIElOVkFMSURfQVBQX0lEID0gJ2ludmFsaWQtYXBwLWlkJyxcbiAgSU5WQUxJRF9BVVRIID0gJ2ludmFsaWQtdXNlci10b2tlbicsXG4gIElOVkFMSURfQVVUSF9FVkVOVCA9ICdpbnZhbGlkLWF1dGgtZXZlbnQnLFxuICBJTlZBTElEX0NFUlRfSEFTSCA9ICdpbnZhbGlkLWNlcnQtaGFzaCcsXG4gIElOVkFMSURfQ09ERSA9ICdpbnZhbGlkLXZlcmlmaWNhdGlvbi1jb2RlJyxcbiAgSU5WQUxJRF9DT05USU5VRV9VUkkgPSAnaW52YWxpZC1jb250aW51ZS11cmknLFxuICBJTlZBTElEX0NPUkRPVkFfQ09ORklHVVJBVElPTiA9ICdpbnZhbGlkLWNvcmRvdmEtY29uZmlndXJhdGlvbicsXG4gIElOVkFMSURfQ1VTVE9NX1RPS0VOID0gJ2ludmFsaWQtY3VzdG9tLXRva2VuJyxcbiAgSU5WQUxJRF9EWU5BTUlDX0xJTktfRE9NQUlOID0gJ2ludmFsaWQtZHluYW1pYy1saW5rLWRvbWFpbicsXG4gIElOVkFMSURfRU1BSUwgPSAnaW52YWxpZC1lbWFpbCcsXG4gIElOVkFMSURfRU1VTEFUT1JfU0NIRU1FID0gJ2ludmFsaWQtZW11bGF0b3Itc2NoZW1lJyxcbiAgSU5WQUxJRF9JRFBfUkVTUE9OU0UgPSAnaW52YWxpZC1jcmVkZW50aWFsJyxcbiAgSU5WQUxJRF9NRVNTQUdFX1BBWUxPQUQgPSAnaW52YWxpZC1tZXNzYWdlLXBheWxvYWQnLFxuICBJTlZBTElEX01GQV9TRVNTSU9OID0gJ2ludmFsaWQtbXVsdGktZmFjdG9yLXNlc3Npb24nLFxuICBJTlZBTElEX09BVVRIX0NMSUVOVF9JRCA9ICdpbnZhbGlkLW9hdXRoLWNsaWVudC1pZCcsXG4gIElOVkFMSURfT0FVVEhfUFJPVklERVIgPSAnaW52YWxpZC1vYXV0aC1wcm92aWRlcicsXG4gIElOVkFMSURfT09CX0NPREUgPSAnaW52YWxpZC1hY3Rpb24tY29kZScsXG4gIElOVkFMSURfT1JJR0lOID0gJ3VuYXV0aG9yaXplZC1kb21haW4nLFxuICBJTlZBTElEX1BBU1NXT1JEID0gJ3dyb25nLXBhc3N3b3JkJyxcbiAgSU5WQUxJRF9QRVJTSVNURU5DRSA9ICdpbnZhbGlkLXBlcnNpc3RlbmNlLXR5cGUnLFxuICBJTlZBTElEX1BIT05FX05VTUJFUiA9ICdpbnZhbGlkLXBob25lLW51bWJlcicsXG4gIElOVkFMSURfUFJPVklERVJfSUQgPSAnaW52YWxpZC1wcm92aWRlci1pZCcsXG4gIElOVkFMSURfUkVDSVBJRU5UX0VNQUlMID0gJ2ludmFsaWQtcmVjaXBpZW50LWVtYWlsJyxcbiAgSU5WQUxJRF9TRU5ERVIgPSAnaW52YWxpZC1zZW5kZXInLFxuICBJTlZBTElEX1NFU1NJT05fSU5GTyA9ICdpbnZhbGlkLXZlcmlmaWNhdGlvbi1pZCcsXG4gIElOVkFMSURfVEVOQU5UX0lEID0gJ2ludmFsaWQtdGVuYW50LWlkJyxcbiAgTE9HSU5fQkxPQ0tFRCA9ICdsb2dpbi1ibG9ja2VkJyxcbiAgTUZBX0lORk9fTk9UX0ZPVU5EID0gJ211bHRpLWZhY3Rvci1pbmZvLW5vdC1mb3VuZCcsXG4gIE1GQV9SRVFVSVJFRCA9ICdtdWx0aS1mYWN0b3ItYXV0aC1yZXF1aXJlZCcsXG4gIE1JU1NJTkdfQU5EUk9JRF9QQUNLQUdFX05BTUUgPSAnbWlzc2luZy1hbmRyb2lkLXBrZy1uYW1lJyxcbiAgTUlTU0lOR19BUFBfQ1JFREVOVElBTCA9ICdtaXNzaW5nLWFwcC1jcmVkZW50aWFsJyxcbiAgTUlTU0lOR19BVVRIX0RPTUFJTiA9ICdhdXRoLWRvbWFpbi1jb25maWctcmVxdWlyZWQnLFxuICBNSVNTSU5HX0NPREUgPSAnbWlzc2luZy12ZXJpZmljYXRpb24tY29kZScsXG4gIE1JU1NJTkdfQ09OVElOVUVfVVJJID0gJ21pc3NpbmctY29udGludWUtdXJpJyxcbiAgTUlTU0lOR19JRlJBTUVfU1RBUlQgPSAnbWlzc2luZy1pZnJhbWUtc3RhcnQnLFxuICBNSVNTSU5HX0lPU19CVU5ETEVfSUQgPSAnbWlzc2luZy1pb3MtYnVuZGxlLWlkJyxcbiAgTUlTU0lOR19PUl9JTlZBTElEX05PTkNFID0gJ21pc3Npbmctb3ItaW52YWxpZC1ub25jZScsXG4gIE1JU1NJTkdfTUZBX0lORk8gPSAnbWlzc2luZy1tdWx0aS1mYWN0b3ItaW5mbycsXG4gIE1JU1NJTkdfTUZBX1NFU1NJT04gPSAnbWlzc2luZy1tdWx0aS1mYWN0b3Itc2Vzc2lvbicsXG4gIE1JU1NJTkdfUEhPTkVfTlVNQkVSID0gJ21pc3NpbmctcGhvbmUtbnVtYmVyJyxcbiAgTUlTU0lOR19QQVNTV09SRCA9ICdtaXNzaW5nLXBhc3N3b3JkJyxcbiAgTUlTU0lOR19TRVNTSU9OX0lORk8gPSAnbWlzc2luZy12ZXJpZmljYXRpb24taWQnLFxuICBNT0RVTEVfREVTVFJPWUVEID0gJ2FwcC1kZWxldGVkJyxcbiAgTkVFRF9DT05GSVJNQVRJT04gPSAnYWNjb3VudC1leGlzdHMtd2l0aC1kaWZmZXJlbnQtY3JlZGVudGlhbCcsXG4gIE5FVFdPUktfUkVRVUVTVF9GQUlMRUQgPSAnbmV0d29yay1yZXF1ZXN0LWZhaWxlZCcsXG4gIE5VTExfVVNFUiA9ICdudWxsLXVzZXInLFxuICBOT19BVVRIX0VWRU5UID0gJ25vLWF1dGgtZXZlbnQnLFxuICBOT19TVUNIX1BST1ZJREVSID0gJ25vLXN1Y2gtcHJvdmlkZXInLFxuICBPUEVSQVRJT05fTk9UX0FMTE9XRUQgPSAnb3BlcmF0aW9uLW5vdC1hbGxvd2VkJyxcbiAgT1BFUkFUSU9OX05PVF9TVVBQT1JURUQgPSAnb3BlcmF0aW9uLW5vdC1zdXBwb3J0ZWQtaW4tdGhpcy1lbnZpcm9ubWVudCcsXG4gIFBPUFVQX0JMT0NLRUQgPSAncG9wdXAtYmxvY2tlZCcsXG4gIFBPUFVQX0NMT1NFRF9CWV9VU0VSID0gJ3BvcHVwLWNsb3NlZC1ieS11c2VyJyxcbiAgUFJPVklERVJfQUxSRUFEWV9MSU5LRUQgPSAncHJvdmlkZXItYWxyZWFkeS1saW5rZWQnLFxuICBRVU9UQV9FWENFRURFRCA9ICdxdW90YS1leGNlZWRlZCcsXG4gIFJFRElSRUNUX0NBTkNFTExFRF9CWV9VU0VSID0gJ3JlZGlyZWN0LWNhbmNlbGxlZC1ieS11c2VyJyxcbiAgUkVESVJFQ1RfT1BFUkFUSU9OX1BFTkRJTkcgPSAncmVkaXJlY3Qtb3BlcmF0aW9uLXBlbmRpbmcnLFxuICBSRUpFQ1RFRF9DUkVERU5USUFMID0gJ3JlamVjdGVkLWNyZWRlbnRpYWwnLFxuICBTRUNPTkRfRkFDVE9SX0FMUkVBRFlfRU5ST0xMRUQgPSAnc2Vjb25kLWZhY3Rvci1hbHJlYWR5LWluLXVzZScsXG4gIFNFQ09ORF9GQUNUT1JfTElNSVRfRVhDRUVERUQgPSAnbWF4aW11bS1zZWNvbmQtZmFjdG9yLWNvdW50LWV4Y2VlZGVkJyxcbiAgVEVOQU5UX0lEX01JU01BVENIID0gJ3RlbmFudC1pZC1taXNtYXRjaCcsXG4gIFRJTUVPVVQgPSAndGltZW91dCcsXG4gIFRPS0VOX0VYUElSRUQgPSAndXNlci10b2tlbi1leHBpcmVkJyxcbiAgVE9PX01BTllfQVRURU1QVFNfVFJZX0xBVEVSID0gJ3Rvby1tYW55LXJlcXVlc3RzJyxcbiAgVU5BVVRIT1JJWkVEX0RPTUFJTiA9ICd1bmF1dGhvcml6ZWQtY29udGludWUtdXJpJyxcbiAgVU5TVVBQT1JURURfRklSU1RfRkFDVE9SID0gJ3Vuc3VwcG9ydGVkLWZpcnN0LWZhY3RvcicsXG4gIFVOU1VQUE9SVEVEX1BFUlNJU1RFTkNFID0gJ3Vuc3VwcG9ydGVkLXBlcnNpc3RlbmNlLXR5cGUnLFxuICBVTlNVUFBPUlRFRF9URU5BTlRfT1BFUkFUSU9OID0gJ3Vuc3VwcG9ydGVkLXRlbmFudC1vcGVyYXRpb24nLFxuICBVTlZFUklGSUVEX0VNQUlMID0gJ3VudmVyaWZpZWQtZW1haWwnLFxuICBVU0VSX0NBTkNFTExFRCA9ICd1c2VyLWNhbmNlbGxlZCcsXG4gIFVTRVJfREVMRVRFRCA9ICd1c2VyLW5vdC1mb3VuZCcsXG4gIFVTRVJfRElTQUJMRUQgPSAndXNlci1kaXNhYmxlZCcsXG4gIFVTRVJfTUlTTUFUQ0ggPSAndXNlci1taXNtYXRjaCcsXG4gIFVTRVJfU0lHTkVEX09VVCA9ICd1c2VyLXNpZ25lZC1vdXQnLFxuICBXRUFLX1BBU1NXT1JEID0gJ3dlYWstcGFzc3dvcmQnLFxuICBXRUJfU1RPUkFHRV9VTlNVUFBPUlRFRCA9ICd3ZWItc3RvcmFnZS11bnN1cHBvcnRlZCcsXG4gIEFMUkVBRFlfSU5JVElBTElaRUQgPSAnYWxyZWFkeS1pbml0aWFsaXplZCcsXG4gIFJFQ0FQVENIQV9OT1RfRU5BQkxFRCA9ICdyZWNhcHRjaGEtbm90LWVuYWJsZWQnLFxuICBNSVNTSU5HX1JFQ0FQVENIQV9UT0tFTiA9ICdtaXNzaW5nLXJlY2FwdGNoYS10b2tlbicsXG4gIElOVkFMSURfUkVDQVBUQ0hBX1RPS0VOID0gJ2ludmFsaWQtcmVjYXB0Y2hhLXRva2VuJyxcbiAgSU5WQUxJRF9SRUNBUFRDSEFfQUNUSU9OID0gJ2ludmFsaWQtcmVjYXB0Y2hhLWFjdGlvbicsXG4gIE1JU1NJTkdfQ0xJRU5UX1RZUEUgPSAnbWlzc2luZy1jbGllbnQtdHlwZScsXG4gIE1JU1NJTkdfUkVDQVBUQ0hBX1ZFUlNJT04gPSAnbWlzc2luZy1yZWNhcHRjaGEtdmVyc2lvbicsXG4gIElOVkFMSURfUkVDQVBUQ0hBX1ZFUlNJT04gPSAnaW52YWxpZC1yZWNhcHRjaGEtdmVyc2lvbicsXG4gIElOVkFMSURfUkVRX1RZUEUgPSAnaW52YWxpZC1yZXEtdHlwZScsXG4gIFVOU1VQUE9SVEVEX1BBU1NXT1JEX1BPTElDWV9TQ0hFTUFfVkVSU0lPTiA9ICd1bnN1cHBvcnRlZC1wYXNzd29yZC1wb2xpY3ktc2NoZW1hLXZlcnNpb24nLFxuICBQQVNTV09SRF9ET0VTX05PVF9NRUVUX1JFUVVJUkVNRU5UUyA9ICdwYXNzd29yZC1kb2VzLW5vdC1tZWV0LXJlcXVpcmVtZW50cydcbn1cblxuZnVuY3Rpb24gX2RlYnVnRXJyb3JNYXAoKTogRXJyb3JNYXA8QXV0aEVycm9yQ29kZT4ge1xuICByZXR1cm4ge1xuICAgIFtBdXRoRXJyb3JDb2RlLkFETUlOX09OTFlfT1BFUkFUSU9OXTpcbiAgICAgICdUaGlzIG9wZXJhdGlvbiBpcyByZXN0cmljdGVkIHRvIGFkbWluaXN0cmF0b3JzIG9ubHkuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5BUkdVTUVOVF9FUlJPUl06ICcnLFxuICAgIFtBdXRoRXJyb3JDb2RlLkFQUF9OT1RfQVVUSE9SSVpFRF06XG4gICAgICBcIlRoaXMgYXBwLCBpZGVudGlmaWVkIGJ5IHRoZSBkb21haW4gd2hlcmUgaXQncyBob3N0ZWQsIGlzIG5vdCBcIiArXG4gICAgICAnYXV0aG9yaXplZCB0byB1c2UgRmlyZWJhc2UgQXV0aGVudGljYXRpb24gd2l0aCB0aGUgcHJvdmlkZWQgQVBJIGtleS4gJyArXG4gICAgICAnUmV2aWV3IHlvdXIga2V5IGNvbmZpZ3VyYXRpb24gaW4gdGhlIEdvb2dsZSBBUEkgY29uc29sZS4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLkFQUF9OT1RfSU5TVEFMTEVEXTpcbiAgICAgICdUaGUgcmVxdWVzdGVkIG1vYmlsZSBhcHBsaWNhdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBpZGVudGlmaWVyICgnICtcbiAgICAgICdBbmRyb2lkIHBhY2thZ2UgbmFtZSBvciBpT1MgYnVuZGxlIElEKSBwcm92aWRlZCBpcyBub3QgaW5zdGFsbGVkIG9uICcgK1xuICAgICAgJ3RoaXMgZGV2aWNlLicsXG4gICAgW0F1dGhFcnJvckNvZGUuQ0FQVENIQV9DSEVDS19GQUlMRURdOlxuICAgICAgJ1RoZSByZUNBUFRDSEEgcmVzcG9uc2UgdG9rZW4gcHJvdmlkZWQgaXMgZWl0aGVyIGludmFsaWQsIGV4cGlyZWQsICcgK1xuICAgICAgJ2FscmVhZHkgdXNlZCBvciB0aGUgZG9tYWluIGFzc29jaWF0ZWQgd2l0aCBpdCBkb2VzIG5vdCBtYXRjaCB0aGUgbGlzdCAnICtcbiAgICAgICdvZiB3aGl0ZWxpc3RlZCBkb21haW5zLicsXG4gICAgW0F1dGhFcnJvckNvZGUuQ09ERV9FWFBJUkVEXTpcbiAgICAgICdUaGUgU01TIGNvZGUgaGFzIGV4cGlyZWQuIFBsZWFzZSByZS1zZW5kIHRoZSB2ZXJpZmljYXRpb24gY29kZSB0byB0cnkgJyArXG4gICAgICAnYWdhaW4uJyxcbiAgICBbQXV0aEVycm9yQ29kZS5DT1JET1ZBX05PVF9SRUFEWV06ICdDb3Jkb3ZhIGZyYW1ld29yayBpcyBub3QgcmVhZHkuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5DT1JTX1VOU1VQUE9SVEVEXTogJ1RoaXMgYnJvd3NlciBpcyBub3Qgc3VwcG9ydGVkLicsXG4gICAgW0F1dGhFcnJvckNvZGUuQ1JFREVOVElBTF9BTFJFQURZX0lOX1VTRV06XG4gICAgICAnVGhpcyBjcmVkZW50aWFsIGlzIGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIGEgZGlmZmVyZW50IHVzZXIgYWNjb3VudC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLkNSRURFTlRJQUxfTUlTTUFUQ0hdOlxuICAgICAgJ1RoZSBjdXN0b20gdG9rZW4gY29ycmVzcG9uZHMgdG8gYSBkaWZmZXJlbnQgYXVkaWVuY2UuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5DUkVERU5USUFMX1RPT19PTERfTE9HSU5fQUdBSU5dOlxuICAgICAgJ1RoaXMgb3BlcmF0aW9uIGlzIHNlbnNpdGl2ZSBhbmQgcmVxdWlyZXMgcmVjZW50IGF1dGhlbnRpY2F0aW9uLiBMb2cgaW4gJyArXG4gICAgICAnYWdhaW4gYmVmb3JlIHJldHJ5aW5nIHRoaXMgcmVxdWVzdC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLkRFUEVOREVOVF9TREtfSU5JVF9CRUZPUkVfQVVUSF06XG4gICAgICAnQW5vdGhlciBGaXJlYmFzZSBTREsgd2FzIGluaXRpYWxpemVkIGFuZCBpcyB0cnlpbmcgdG8gdXNlIEF1dGggYmVmb3JlIEF1dGggaXMgJyArXG4gICAgICAnaW5pdGlhbGl6ZWQuIFBsZWFzZSBiZSBzdXJlIHRvIGNhbGwgYGluaXRpYWxpemVBdXRoYCBvciBgZ2V0QXV0aGAgYmVmb3JlICcgK1xuICAgICAgJ3N0YXJ0aW5nIGFueSBvdGhlciBGaXJlYmFzZSBTREsuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5EWU5BTUlDX0xJTktfTk9UX0FDVElWQVRFRF06XG4gICAgICAnUGxlYXNlIGFjdGl2YXRlIER5bmFtaWMgTGlua3MgaW4gdGhlIEZpcmViYXNlIENvbnNvbGUgYW5kIGFncmVlIHRvIHRoZSB0ZXJtcyBhbmQgJyArXG4gICAgICAnY29uZGl0aW9ucy4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLkVNQUlMX0NIQU5HRV9ORUVEU19WRVJJRklDQVRJT05dOlxuICAgICAgJ011bHRpLWZhY3RvciB1c2VycyBtdXN0IGFsd2F5cyBoYXZlIGEgdmVyaWZpZWQgZW1haWwuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5FTUFJTF9FWElTVFNdOlxuICAgICAgJ1RoZSBlbWFpbCBhZGRyZXNzIGlzIGFscmVhZHkgaW4gdXNlIGJ5IGFub3RoZXIgYWNjb3VudC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLkVNVUxBVE9SX0NPTkZJR19GQUlMRURdOlxuICAgICAgJ0F1dGggaW5zdGFuY2UgaGFzIGFscmVhZHkgYmVlbiB1c2VkIHRvIG1ha2UgYSBuZXR3b3JrIGNhbGwuIEF1dGggY2FuICcgK1xuICAgICAgJ25vIGxvbmdlciBiZSBjb25maWd1cmVkIHRvIHVzZSB0aGUgZW11bGF0b3IuIFRyeSBjYWxsaW5nICcgK1xuICAgICAgJ1wiY29ubmVjdEF1dGhFbXVsYXRvcigpXCIgc29vbmVyLicsXG4gICAgW0F1dGhFcnJvckNvZGUuRVhQSVJFRF9PT0JfQ09ERV06ICdUaGUgYWN0aW9uIGNvZGUgaGFzIGV4cGlyZWQuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5FWFBJUkVEX1BPUFVQX1JFUVVFU1RdOlxuICAgICAgJ1RoaXMgb3BlcmF0aW9uIGhhcyBiZWVuIGNhbmNlbGxlZCBkdWUgdG8gYW5vdGhlciBjb25mbGljdGluZyBwb3B1cCBiZWluZyBvcGVuZWQuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUl06ICdBbiBpbnRlcm5hbCBBdXRoRXJyb3IgaGFzIG9jY3VycmVkLicsXG4gICAgW0F1dGhFcnJvckNvZGUuSU5WQUxJRF9BUFBfQ1JFREVOVElBTF06XG4gICAgICAnVGhlIHBob25lIHZlcmlmaWNhdGlvbiByZXF1ZXN0IGNvbnRhaW5zIGFuIGludmFsaWQgYXBwbGljYXRpb24gdmVyaWZpZXIuJyArXG4gICAgICAnIFRoZSByZUNBUFRDSEEgdG9rZW4gcmVzcG9uc2UgaXMgZWl0aGVyIGludmFsaWQgb3IgZXhwaXJlZC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLklOVkFMSURfQVBQX0lEXTpcbiAgICAgICdUaGUgbW9iaWxlIGFwcCBpZGVudGlmaWVyIGlzIG5vdCByZWdpc3RlZCBmb3IgdGhlIGN1cnJlbnQgcHJvamVjdC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLklOVkFMSURfQVVUSF06XG4gICAgICBcIlRoaXMgdXNlcidzIGNyZWRlbnRpYWwgaXNuJ3QgdmFsaWQgZm9yIHRoaXMgcHJvamVjdC4gVGhpcyBjYW4gaGFwcGVuIFwiICtcbiAgICAgIFwiaWYgdGhlIHVzZXIncyB0b2tlbiBoYXMgYmVlbiB0YW1wZXJlZCB3aXRoLCBvciBpZiB0aGUgdXNlciBpc24ndCBmb3IgXCIgK1xuICAgICAgJ3RoZSBwcm9qZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIEFQSSBrZXkuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5JTlZBTElEX0FVVEhfRVZFTlRdOiAnQW4gaW50ZXJuYWwgQXV0aEVycm9yIGhhcyBvY2N1cnJlZC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLklOVkFMSURfQ09ERV06XG4gICAgICAnVGhlIFNNUyB2ZXJpZmljYXRpb24gY29kZSB1c2VkIHRvIGNyZWF0ZSB0aGUgcGhvbmUgYXV0aCBjcmVkZW50aWFsIGlzICcgK1xuICAgICAgJ2ludmFsaWQuIFBsZWFzZSByZXNlbmQgdGhlIHZlcmlmaWNhdGlvbiBjb2RlIHNtcyBhbmQgYmUgc3VyZSB0byB1c2UgdGhlICcgK1xuICAgICAgJ3ZlcmlmaWNhdGlvbiBjb2RlIHByb3ZpZGVkIGJ5IHRoZSB1c2VyLicsXG4gICAgW0F1dGhFcnJvckNvZGUuSU5WQUxJRF9DT05USU5VRV9VUkldOlxuICAgICAgJ1RoZSBjb250aW51ZSBVUkwgcHJvdmlkZWQgaW4gdGhlIHJlcXVlc3QgaXMgaW52YWxpZC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLklOVkFMSURfQ09SRE9WQV9DT05GSUdVUkFUSU9OXTpcbiAgICAgICdUaGUgZm9sbG93aW5nIENvcmRvdmEgcGx1Z2lucyBtdXN0IGJlIGluc3RhbGxlZCB0byBlbmFibGUgT0F1dGggc2lnbi1pbjogJyArXG4gICAgICAnY29yZG92YS1wbHVnaW4tYnVpbGRpbmZvLCBjb3Jkb3ZhLXVuaXZlcnNhbC1saW5rcy1wbHVnaW4sICcgK1xuICAgICAgJ2NvcmRvdmEtcGx1Z2luLWJyb3dzZXJ0YWIsIGNvcmRvdmEtcGx1Z2luLWluYXBwYnJvd3NlciBhbmQgJyArXG4gICAgICAnY29yZG92YS1wbHVnaW4tY3VzdG9tdXJsc2NoZW1lLicsXG4gICAgW0F1dGhFcnJvckNvZGUuSU5WQUxJRF9DVVNUT01fVE9LRU5dOlxuICAgICAgJ1RoZSBjdXN0b20gdG9rZW4gZm9ybWF0IGlzIGluY29ycmVjdC4gUGxlYXNlIGNoZWNrIHRoZSBkb2N1bWVudGF0aW9uLicsXG4gICAgW0F1dGhFcnJvckNvZGUuSU5WQUxJRF9EWU5BTUlDX0xJTktfRE9NQUlOXTpcbiAgICAgICdUaGUgcHJvdmlkZWQgZHluYW1pYyBsaW5rIGRvbWFpbiBpcyBub3QgY29uZmlndXJlZCBvciBhdXRob3JpemVkIGZvciB0aGUgY3VycmVudCBwcm9qZWN0LicsXG4gICAgW0F1dGhFcnJvckNvZGUuSU5WQUxJRF9FTUFJTF06ICdUaGUgZW1haWwgYWRkcmVzcyBpcyBiYWRseSBmb3JtYXR0ZWQuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5JTlZBTElEX0VNVUxBVE9SX1NDSEVNRV06XG4gICAgICAnRW11bGF0b3IgVVJMIG11c3Qgc3RhcnQgd2l0aCBhIHZhbGlkIHNjaGVtZSAoaHR0cDovLyBvciBodHRwczovLykuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5JTlZBTElEX0FQSV9LRVldOlxuICAgICAgJ1lvdXIgQVBJIGtleSBpcyBpbnZhbGlkLCBwbGVhc2UgY2hlY2sgeW91IGhhdmUgY29waWVkIGl0IGNvcnJlY3RseS4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLklOVkFMSURfQ0VSVF9IQVNIXTpcbiAgICAgICdUaGUgU0hBLTEgY2VydGlmaWNhdGUgaGFzaCBwcm92aWRlZCBpcyBpbnZhbGlkLicsXG4gICAgW0F1dGhFcnJvckNvZGUuSU5WQUxJRF9JRFBfUkVTUE9OU0VdOlxuICAgICAgJ1RoZSBzdXBwbGllZCBhdXRoIGNyZWRlbnRpYWwgaXMgbWFsZm9ybWVkIG9yIGhhcyBleHBpcmVkLicsXG4gICAgW0F1dGhFcnJvckNvZGUuSU5WQUxJRF9NRVNTQUdFX1BBWUxPQURdOlxuICAgICAgJ1RoZSBlbWFpbCB0ZW1wbGF0ZSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgYWN0aW9uIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycyBpbiBpdHMgbWVzc2FnZS4gJyArXG4gICAgICAnUGxlYXNlIGZpeCBieSBnb2luZyB0byB0aGUgQXV0aCBlbWFpbCB0ZW1wbGF0ZXMgc2VjdGlvbiBpbiB0aGUgRmlyZWJhc2UgQ29uc29sZS4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLklOVkFMSURfTUZBX1NFU1NJT05dOlxuICAgICAgJ1RoZSByZXF1ZXN0IGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCBwcm9vZiBvZiBmaXJzdCBmYWN0b3Igc3VjY2Vzc2Z1bCBzaWduLWluLicsXG4gICAgW0F1dGhFcnJvckNvZGUuSU5WQUxJRF9PQVVUSF9QUk9WSURFUl06XG4gICAgICAnRW1haWxBdXRoUHJvdmlkZXIgaXMgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBvcGVyYXRpb24uIFRoaXMgb3BlcmF0aW9uICcgK1xuICAgICAgJ29ubHkgc3VwcG9ydHMgT0F1dGggcHJvdmlkZXJzLicsXG4gICAgW0F1dGhFcnJvckNvZGUuSU5WQUxJRF9PQVVUSF9DTElFTlRfSURdOlxuICAgICAgJ1RoZSBPQXV0aCBjbGllbnQgSUQgcHJvdmlkZWQgaXMgZWl0aGVyIGludmFsaWQgb3IgZG9lcyBub3QgbWF0Y2ggdGhlICcgK1xuICAgICAgJ3NwZWNpZmllZCBBUEkga2V5LicsXG4gICAgW0F1dGhFcnJvckNvZGUuSU5WQUxJRF9PUklHSU5dOlxuICAgICAgJ1RoaXMgZG9tYWluIGlzIG5vdCBhdXRob3JpemVkIGZvciBPQXV0aCBvcGVyYXRpb25zIGZvciB5b3VyIEZpcmViYXNlICcgK1xuICAgICAgJ3Byb2plY3QuIEVkaXQgdGhlIGxpc3Qgb2YgYXV0aG9yaXplZCBkb21haW5zIGZyb20gdGhlIEZpcmViYXNlIGNvbnNvbGUuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5JTlZBTElEX09PQl9DT0RFXTpcbiAgICAgICdUaGUgYWN0aW9uIGNvZGUgaXMgaW52YWxpZC4gVGhpcyBjYW4gaGFwcGVuIGlmIHRoZSBjb2RlIGlzIG1hbGZvcm1lZCwgJyArXG4gICAgICAnZXhwaXJlZCwgb3IgaGFzIGFscmVhZHkgYmVlbiB1c2VkLicsXG4gICAgW0F1dGhFcnJvckNvZGUuSU5WQUxJRF9QQVNTV09SRF06XG4gICAgICAnVGhlIHBhc3N3b3JkIGlzIGludmFsaWQgb3IgdGhlIHVzZXIgZG9lcyBub3QgaGF2ZSBhIHBhc3N3b3JkLicsXG4gICAgW0F1dGhFcnJvckNvZGUuSU5WQUxJRF9QRVJTSVNURU5DRV06XG4gICAgICAnVGhlIHNwZWNpZmllZCBwZXJzaXN0ZW5jZSB0eXBlIGlzIGludmFsaWQuIEl0IGNhbiBvbmx5IGJlIGxvY2FsLCBzZXNzaW9uIG9yIG5vbmUuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5JTlZBTElEX1BIT05FX05VTUJFUl06XG4gICAgICAnVGhlIGZvcm1hdCBvZiB0aGUgcGhvbmUgbnVtYmVyIHByb3ZpZGVkIGlzIGluY29ycmVjdC4gUGxlYXNlIGVudGVyIHRoZSAnICtcbiAgICAgICdwaG9uZSBudW1iZXIgaW4gYSBmb3JtYXQgdGhhdCBjYW4gYmUgcGFyc2VkIGludG8gRS4xNjQgZm9ybWF0LiBFLjE2NCAnICtcbiAgICAgICdwaG9uZSBudW1iZXJzIGFyZSB3cml0dGVuIGluIHRoZSBmb3JtYXQgWytdW2NvdW50cnkgY29kZV1bc3Vic2NyaWJlciAnICtcbiAgICAgICdudW1iZXIgaW5jbHVkaW5nIGFyZWEgY29kZV0uJyxcbiAgICBbQXV0aEVycm9yQ29kZS5JTlZBTElEX1BST1ZJREVSX0lEXTpcbiAgICAgICdUaGUgc3BlY2lmaWVkIHByb3ZpZGVyIElEIGlzIGludmFsaWQuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5JTlZBTElEX1JFQ0lQSUVOVF9FTUFJTF06XG4gICAgICAnVGhlIGVtYWlsIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBhY3Rpb24gZmFpbGVkIHRvIHNlbmQgYXMgdGhlIHByb3ZpZGVkICcgK1xuICAgICAgJ3JlY2lwaWVudCBlbWFpbCBhZGRyZXNzIGlzIGludmFsaWQuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5JTlZBTElEX1NFTkRFUl06XG4gICAgICAnVGhlIGVtYWlsIHRlbXBsYXRlIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBhY3Rpb24gY29udGFpbnMgYW4gaW52YWxpZCBzZW5kZXIgZW1haWwgb3IgbmFtZS4gJyArXG4gICAgICAnUGxlYXNlIGZpeCBieSBnb2luZyB0byB0aGUgQXV0aCBlbWFpbCB0ZW1wbGF0ZXMgc2VjdGlvbiBpbiB0aGUgRmlyZWJhc2UgQ29uc29sZS4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLklOVkFMSURfU0VTU0lPTl9JTkZPXTpcbiAgICAgICdUaGUgdmVyaWZpY2F0aW9uIElEIHVzZWQgdG8gY3JlYXRlIHRoZSBwaG9uZSBhdXRoIGNyZWRlbnRpYWwgaXMgaW52YWxpZC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLklOVkFMSURfVEVOQU5UX0lEXTpcbiAgICAgIFwiVGhlIEF1dGggaW5zdGFuY2UncyB0ZW5hbnQgSUQgaXMgaW52YWxpZC5cIixcbiAgICBbQXV0aEVycm9yQ29kZS5MT0dJTl9CTE9DS0VEXTpcbiAgICAgICdMb2dpbiBibG9ja2VkIGJ5IHVzZXItcHJvdmlkZWQgbWV0aG9kOiB7JG9yaWdpbmFsTWVzc2FnZX0nLFxuICAgIFtBdXRoRXJyb3JDb2RlLk1JU1NJTkdfQU5EUk9JRF9QQUNLQUdFX05BTUVdOlxuICAgICAgJ0FuIEFuZHJvaWQgUGFja2FnZSBOYW1lIG11c3QgYmUgcHJvdmlkZWQgaWYgdGhlIEFuZHJvaWQgQXBwIGlzIHJlcXVpcmVkIHRvIGJlIGluc3RhbGxlZC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLk1JU1NJTkdfQVVUSF9ET01BSU5dOlxuICAgICAgJ0JlIHN1cmUgdG8gaW5jbHVkZSBhdXRoRG9tYWluIHdoZW4gY2FsbGluZyBmaXJlYmFzZS5pbml0aWFsaXplQXBwKCksICcgK1xuICAgICAgJ2J5IGZvbGxvd2luZyB0aGUgaW5zdHJ1Y3Rpb25zIGluIHRoZSBGaXJlYmFzZSBjb25zb2xlLicsXG4gICAgW0F1dGhFcnJvckNvZGUuTUlTU0lOR19BUFBfQ1JFREVOVElBTF06XG4gICAgICAnVGhlIHBob25lIHZlcmlmaWNhdGlvbiByZXF1ZXN0IGlzIG1pc3NpbmcgYW4gYXBwbGljYXRpb24gdmVyaWZpZXIgJyArXG4gICAgICAnYXNzZXJ0aW9uLiBBIHJlQ0FQVENIQSByZXNwb25zZSB0b2tlbiBuZWVkcyB0byBiZSBwcm92aWRlZC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLk1JU1NJTkdfQ09ERV06XG4gICAgICAnVGhlIHBob25lIGF1dGggY3JlZGVudGlhbCB3YXMgY3JlYXRlZCB3aXRoIGFuIGVtcHR5IFNNUyB2ZXJpZmljYXRpb24gY29kZS4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLk1JU1NJTkdfQ09OVElOVUVfVVJJXTpcbiAgICAgICdBIGNvbnRpbnVlIFVSTCBtdXN0IGJlIHByb3ZpZGVkIGluIHRoZSByZXF1ZXN0LicsXG4gICAgW0F1dGhFcnJvckNvZGUuTUlTU0lOR19JRlJBTUVfU1RBUlRdOiAnQW4gaW50ZXJuYWwgQXV0aEVycm9yIGhhcyBvY2N1cnJlZC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLk1JU1NJTkdfSU9TX0JVTkRMRV9JRF06XG4gICAgICAnQW4gaU9TIEJ1bmRsZSBJRCBtdXN0IGJlIHByb3ZpZGVkIGlmIGFuIEFwcCBTdG9yZSBJRCBpcyBwcm92aWRlZC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLk1JU1NJTkdfT1JfSU5WQUxJRF9OT05DRV06XG4gICAgICAnVGhlIHJlcXVlc3QgZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIG5vbmNlLiBUaGlzIGNhbiBvY2N1ciBpZiB0aGUgJyArXG4gICAgICAnU0hBLTI1NiBoYXNoIG9mIHRoZSBwcm92aWRlZCByYXcgbm9uY2UgZG9lcyBub3QgbWF0Y2ggdGhlIGhhc2hlZCBub25jZSAnICtcbiAgICAgICdpbiB0aGUgSUQgdG9rZW4gcGF5bG9hZC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLk1JU1NJTkdfUEFTU1dPUkRdOiAnQSBub24tZW1wdHkgcGFzc3dvcmQgbXVzdCBiZSBwcm92aWRlZCcsXG4gICAgW0F1dGhFcnJvckNvZGUuTUlTU0lOR19NRkFfSU5GT106XG4gICAgICAnTm8gc2Vjb25kIGZhY3RvciBpZGVudGlmaWVyIGlzIHByb3ZpZGVkLicsXG4gICAgW0F1dGhFcnJvckNvZGUuTUlTU0lOR19NRkFfU0VTU0lPTl06XG4gICAgICAnVGhlIHJlcXVlc3QgaXMgbWlzc2luZyBwcm9vZiBvZiBmaXJzdCBmYWN0b3Igc3VjY2Vzc2Z1bCBzaWduLWluLicsXG4gICAgW0F1dGhFcnJvckNvZGUuTUlTU0lOR19QSE9ORV9OVU1CRVJdOlxuICAgICAgJ1RvIHNlbmQgdmVyaWZpY2F0aW9uIGNvZGVzLCBwcm92aWRlIGEgcGhvbmUgbnVtYmVyIGZvciB0aGUgcmVjaXBpZW50LicsXG4gICAgW0F1dGhFcnJvckNvZGUuTUlTU0lOR19TRVNTSU9OX0lORk9dOlxuICAgICAgJ1RoZSBwaG9uZSBhdXRoIGNyZWRlbnRpYWwgd2FzIGNyZWF0ZWQgd2l0aCBhbiBlbXB0eSB2ZXJpZmljYXRpb24gSUQuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5NT0RVTEVfREVTVFJPWUVEXTpcbiAgICAgICdUaGlzIGluc3RhbmNlIG9mIEZpcmViYXNlQXBwIGhhcyBiZWVuIGRlbGV0ZWQuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5NRkFfSU5GT19OT1RfRk9VTkRdOlxuICAgICAgJ1RoZSB1c2VyIGRvZXMgbm90IGhhdmUgYSBzZWNvbmQgZmFjdG9yIG1hdGNoaW5nIHRoZSBpZGVudGlmaWVyIHByb3ZpZGVkLicsXG4gICAgW0F1dGhFcnJvckNvZGUuTUZBX1JFUVVJUkVEXTpcbiAgICAgICdQcm9vZiBvZiBvd25lcnNoaXAgb2YgYSBzZWNvbmQgZmFjdG9yIGlzIHJlcXVpcmVkIHRvIGNvbXBsZXRlIHNpZ24taW4uJyxcbiAgICBbQXV0aEVycm9yQ29kZS5ORUVEX0NPTkZJUk1BVElPTl06XG4gICAgICAnQW4gYWNjb3VudCBhbHJlYWR5IGV4aXN0cyB3aXRoIHRoZSBzYW1lIGVtYWlsIGFkZHJlc3MgYnV0IGRpZmZlcmVudCAnICtcbiAgICAgICdzaWduLWluIGNyZWRlbnRpYWxzLiBTaWduIGluIHVzaW5nIGEgcHJvdmlkZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgJyArXG4gICAgICAnZW1haWwgYWRkcmVzcy4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLk5FVFdPUktfUkVRVUVTVF9GQUlMRURdOlxuICAgICAgJ0EgbmV0d29yayBBdXRoRXJyb3IgKHN1Y2ggYXMgdGltZW91dCwgaW50ZXJydXB0ZWQgY29ubmVjdGlvbiBvciB1bnJlYWNoYWJsZSBob3N0KSBoYXMgb2NjdXJyZWQuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5OT19BVVRIX0VWRU5UXTogJ0FuIGludGVybmFsIEF1dGhFcnJvciBoYXMgb2NjdXJyZWQuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5OT19TVUNIX1BST1ZJREVSXTpcbiAgICAgICdVc2VyIHdhcyBub3QgbGlua2VkIHRvIGFuIGFjY291bnQgd2l0aCB0aGUgZ2l2ZW4gcHJvdmlkZXIuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5OVUxMX1VTRVJdOlxuICAgICAgJ0EgbnVsbCB1c2VyIG9iamVjdCB3YXMgcHJvdmlkZWQgYXMgdGhlIGFyZ3VtZW50IGZvciBhbiBvcGVyYXRpb24gd2hpY2ggJyArXG4gICAgICAncmVxdWlyZXMgYSBub24tbnVsbCB1c2VyIG9iamVjdC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLk9QRVJBVElPTl9OT1RfQUxMT1dFRF06XG4gICAgICAnVGhlIGdpdmVuIHNpZ24taW4gcHJvdmlkZXIgaXMgZGlzYWJsZWQgZm9yIHRoaXMgRmlyZWJhc2UgcHJvamVjdC4gJyArXG4gICAgICAnRW5hYmxlIGl0IGluIHRoZSBGaXJlYmFzZSBjb25zb2xlLCB1bmRlciB0aGUgc2lnbi1pbiBtZXRob2QgdGFiIG9mIHRoZSAnICtcbiAgICAgICdBdXRoIHNlY3Rpb24uJyxcbiAgICBbQXV0aEVycm9yQ29kZS5PUEVSQVRJT05fTk9UX1NVUFBPUlRFRF06XG4gICAgICAnVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgZW52aXJvbm1lbnQgdGhpcyBhcHBsaWNhdGlvbiBpcyAnICtcbiAgICAgICdydW5uaW5nIG9uLiBcImxvY2F0aW9uLnByb3RvY29sXCIgbXVzdCBiZSBodHRwLCBodHRwcyBvciBjaHJvbWUtZXh0ZW5zaW9uJyArXG4gICAgICAnIGFuZCB3ZWIgc3RvcmFnZSBtdXN0IGJlIGVuYWJsZWQuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5QT1BVUF9CTE9DS0VEXTpcbiAgICAgICdVbmFibGUgdG8gZXN0YWJsaXNoIGEgY29ubmVjdGlvbiB3aXRoIHRoZSBwb3B1cC4gSXQgbWF5IGhhdmUgYmVlbiBibG9ja2VkIGJ5IHRoZSBicm93c2VyLicsXG4gICAgW0F1dGhFcnJvckNvZGUuUE9QVVBfQ0xPU0VEX0JZX1VTRVJdOlxuICAgICAgJ1RoZSBwb3B1cCBoYXMgYmVlbiBjbG9zZWQgYnkgdGhlIHVzZXIgYmVmb3JlIGZpbmFsaXppbmcgdGhlIG9wZXJhdGlvbi4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLlBST1ZJREVSX0FMUkVBRFlfTElOS0VEXTpcbiAgICAgICdVc2VyIGNhbiBvbmx5IGJlIGxpbmtlZCB0byBvbmUgaWRlbnRpdHkgZm9yIHRoZSBnaXZlbiBwcm92aWRlci4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLlFVT1RBX0VYQ0VFREVEXTpcbiAgICAgIFwiVGhlIHByb2plY3QncyBxdW90YSBmb3IgdGhpcyBvcGVyYXRpb24gaGFzIGJlZW4gZXhjZWVkZWQuXCIsXG4gICAgW0F1dGhFcnJvckNvZGUuUkVESVJFQ1RfQ0FOQ0VMTEVEX0JZX1VTRVJdOlxuICAgICAgJ1RoZSByZWRpcmVjdCBvcGVyYXRpb24gaGFzIGJlZW4gY2FuY2VsbGVkIGJ5IHRoZSB1c2VyIGJlZm9yZSBmaW5hbGl6aW5nLicsXG4gICAgW0F1dGhFcnJvckNvZGUuUkVESVJFQ1RfT1BFUkFUSU9OX1BFTkRJTkddOlxuICAgICAgJ0EgcmVkaXJlY3Qgc2lnbi1pbiBvcGVyYXRpb24gaXMgYWxyZWFkeSBwZW5kaW5nLicsXG4gICAgW0F1dGhFcnJvckNvZGUuUkVKRUNURURfQ1JFREVOVElBTF06XG4gICAgICAnVGhlIHJlcXVlc3QgY29udGFpbnMgbWFsZm9ybWVkIG9yIG1pc21hdGNoaW5nIGNyZWRlbnRpYWxzLicsXG4gICAgW0F1dGhFcnJvckNvZGUuU0VDT05EX0ZBQ1RPUl9BTFJFQURZX0VOUk9MTEVEXTpcbiAgICAgICdUaGUgc2Vjb25kIGZhY3RvciBpcyBhbHJlYWR5IGVucm9sbGVkIG9uIHRoaXMgYWNjb3VudC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLlNFQ09ORF9GQUNUT1JfTElNSVRfRVhDRUVERURdOlxuICAgICAgJ1RoZSBtYXhpbXVtIGFsbG93ZWQgbnVtYmVyIG9mIHNlY29uZCBmYWN0b3JzIG9uIGEgdXNlciBoYXMgYmVlbiBleGNlZWRlZC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLlRFTkFOVF9JRF9NSVNNQVRDSF06XG4gICAgICBcIlRoZSBwcm92aWRlZCB0ZW5hbnQgSUQgZG9lcyBub3QgbWF0Y2ggdGhlIEF1dGggaW5zdGFuY2UncyB0ZW5hbnQgSURcIixcbiAgICBbQXV0aEVycm9yQ29kZS5USU1FT1VUXTogJ1RoZSBvcGVyYXRpb24gaGFzIHRpbWVkIG91dC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLlRPS0VOX0VYUElSRURdOlxuICAgICAgXCJUaGUgdXNlcidzIGNyZWRlbnRpYWwgaXMgbm8gbG9uZ2VyIHZhbGlkLiBUaGUgdXNlciBtdXN0IHNpZ24gaW4gYWdhaW4uXCIsXG4gICAgW0F1dGhFcnJvckNvZGUuVE9PX01BTllfQVRURU1QVFNfVFJZX0xBVEVSXTpcbiAgICAgICdXZSBoYXZlIGJsb2NrZWQgYWxsIHJlcXVlc3RzIGZyb20gdGhpcyBkZXZpY2UgZHVlIHRvIHVudXN1YWwgYWN0aXZpdHkuICcgK1xuICAgICAgJ1RyeSBhZ2FpbiBsYXRlci4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLlVOQVVUSE9SSVpFRF9ET01BSU5dOlxuICAgICAgJ1RoZSBkb21haW4gb2YgdGhlIGNvbnRpbnVlIFVSTCBpcyBub3Qgd2hpdGVsaXN0ZWQuICBQbGVhc2Ugd2hpdGVsaXN0ICcgK1xuICAgICAgJ3RoZSBkb21haW4gaW4gdGhlIEZpcmViYXNlIGNvbnNvbGUuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5VTlNVUFBPUlRFRF9GSVJTVF9GQUNUT1JdOlxuICAgICAgJ0Vucm9sbGluZyBhIHNlY29uZCBmYWN0b3Igb3Igc2lnbmluZyBpbiB3aXRoIGEgbXVsdGktZmFjdG9yIGFjY291bnQgcmVxdWlyZXMgc2lnbi1pbiB3aXRoIGEgc3VwcG9ydGVkIGZpcnN0IGZhY3Rvci4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLlVOU1VQUE9SVEVEX1BFUlNJU1RFTkNFXTpcbiAgICAgICdUaGUgY3VycmVudCBlbnZpcm9ubWVudCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBzcGVjaWZpZWQgcGVyc2lzdGVuY2UgdHlwZS4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLlVOU1VQUE9SVEVEX1RFTkFOVF9PUEVSQVRJT05dOlxuICAgICAgJ1RoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gYSBtdWx0aS10ZW5hbnQgY29udGV4dC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLlVOVkVSSUZJRURfRU1BSUxdOlxuICAgICAgJ1RoZSBvcGVyYXRpb24gcmVxdWlyZXMgYSB2ZXJpZmllZCBlbWFpbC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLlVTRVJfQ0FOQ0VMTEVEXTpcbiAgICAgICdUaGUgdXNlciBkaWQgbm90IGdyYW50IHlvdXIgYXBwbGljYXRpb24gdGhlIHBlcm1pc3Npb25zIGl0IHJlcXVlc3RlZC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLlVTRVJfREVMRVRFRF06XG4gICAgICAnVGhlcmUgaXMgbm8gdXNlciByZWNvcmQgY29ycmVzcG9uZGluZyB0byB0aGlzIGlkZW50aWZpZXIuIFRoZSB1c2VyIG1heSAnICtcbiAgICAgICdoYXZlIGJlZW4gZGVsZXRlZC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLlVTRVJfRElTQUJMRURdOlxuICAgICAgJ1RoZSB1c2VyIGFjY291bnQgaGFzIGJlZW4gZGlzYWJsZWQgYnkgYW4gYWRtaW5pc3RyYXRvci4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLlVTRVJfTUlTTUFUQ0hdOlxuICAgICAgJ1RoZSBzdXBwbGllZCBjcmVkZW50aWFscyBkbyBub3QgY29ycmVzcG9uZCB0byB0aGUgcHJldmlvdXNseSBzaWduZWQgaW4gdXNlci4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLlVTRVJfU0lHTkVEX09VVF06ICcnLFxuICAgIFtBdXRoRXJyb3JDb2RlLldFQUtfUEFTU1dPUkRdOlxuICAgICAgJ1RoZSBwYXNzd29yZCBtdXN0IGJlIDYgY2hhcmFjdGVycyBsb25nIG9yIG1vcmUuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5XRUJfU1RPUkFHRV9VTlNVUFBPUlRFRF06XG4gICAgICAnVGhpcyBicm93c2VyIGlzIG5vdCBzdXBwb3J0ZWQgb3IgM3JkIHBhcnR5IGNvb2tpZXMgYW5kIGRhdGEgbWF5IGJlIGRpc2FibGVkLicsXG4gICAgW0F1dGhFcnJvckNvZGUuQUxSRUFEWV9JTklUSUFMSVpFRF06XG4gICAgICAnaW5pdGlhbGl6ZUF1dGgoKSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCB3aXRoICcgK1xuICAgICAgJ2RpZmZlcmVudCBvcHRpb25zLiBUbyBhdm9pZCB0aGlzIGVycm9yLCBjYWxsIGluaXRpYWxpemVBdXRoKCkgd2l0aCB0aGUgJyArXG4gICAgICAnc2FtZSBvcHRpb25zIGFzIHdoZW4gaXQgd2FzIG9yaWdpbmFsbHkgY2FsbGVkLCBvciBjYWxsIGdldEF1dGgoKSB0byByZXR1cm4gdGhlJyArXG4gICAgICAnIGFscmVhZHkgaW5pdGlhbGl6ZWQgaW5zdGFuY2UuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5NSVNTSU5HX1JFQ0FQVENIQV9UT0tFTl06XG4gICAgICAnVGhlIHJlQ0FQVENIQSB0b2tlbiBpcyBtaXNzaW5nIHdoZW4gc2VuZGluZyByZXF1ZXN0IHRvIHRoZSBiYWNrZW5kLicsXG4gICAgW0F1dGhFcnJvckNvZGUuSU5WQUxJRF9SRUNBUFRDSEFfVE9LRU5dOlxuICAgICAgJ1RoZSByZUNBUFRDSEEgdG9rZW4gaXMgaW52YWxpZCB3aGVuIHNlbmRpbmcgcmVxdWVzdCB0byB0aGUgYmFja2VuZC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLklOVkFMSURfUkVDQVBUQ0hBX0FDVElPTl06XG4gICAgICAnVGhlIHJlQ0FQVENIQSBhY3Rpb24gaXMgaW52YWxpZCB3aGVuIHNlbmRpbmcgcmVxdWVzdCB0byB0aGUgYmFja2VuZC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLlJFQ0FQVENIQV9OT1RfRU5BQkxFRF06XG4gICAgICAncmVDQVBUQ0hBIEVudGVycHJpc2UgaW50ZWdyYXRpb24gaXMgbm90IGVuYWJsZWQgZm9yIHRoaXMgcHJvamVjdC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLk1JU1NJTkdfQ0xJRU5UX1RZUEVdOlxuICAgICAgJ1RoZSByZUNBUFRDSEEgY2xpZW50IHR5cGUgaXMgbWlzc2luZyB3aGVuIHNlbmRpbmcgcmVxdWVzdCB0byB0aGUgYmFja2VuZC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLk1JU1NJTkdfUkVDQVBUQ0hBX1ZFUlNJT05dOlxuICAgICAgJ1RoZSByZUNBUFRDSEEgdmVyc2lvbiBpcyBtaXNzaW5nIHdoZW4gc2VuZGluZyByZXF1ZXN0IHRvIHRoZSBiYWNrZW5kLicsXG4gICAgW0F1dGhFcnJvckNvZGUuSU5WQUxJRF9SRVFfVFlQRV06ICdJbnZhbGlkIHJlcXVlc3QgcGFyYW1ldGVycy4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLklOVkFMSURfUkVDQVBUQ0hBX1ZFUlNJT05dOlxuICAgICAgJ1RoZSByZUNBUFRDSEEgdmVyc2lvbiBpcyBpbnZhbGlkIHdoZW4gc2VuZGluZyByZXF1ZXN0IHRvIHRoZSBiYWNrZW5kLicsXG4gICAgW0F1dGhFcnJvckNvZGUuVU5TVVBQT1JURURfUEFTU1dPUkRfUE9MSUNZX1NDSEVNQV9WRVJTSU9OXTpcbiAgICAgICdUaGUgcGFzc3dvcmQgcG9saWN5IHJlY2VpdmVkIGZyb20gdGhlIGJhY2tlbmQgdXNlcyBhIHNjaGVtYSB2ZXJzaW9uIHRoYXQgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIHZlcnNpb24gb2YgdGhlIEZpcmViYXNlIFNESy4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLlBBU1NXT1JEX0RPRVNfTk9UX01FRVRfUkVRVUlSRU1FTlRTXTpcbiAgICAgICdUaGUgcGFzc3dvcmQgZG9lcyBub3QgbWVldCB0aGUgcmVxdWlyZW1lbnRzLidcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFcnJvck1hcFJldHJpZXZlciBleHRlbmRzIEF1dGhFcnJvck1hcCB7XG4gICgpOiBFcnJvck1hcDxBdXRoRXJyb3JDb2RlPjtcbn1cblxuZnVuY3Rpb24gX3Byb2RFcnJvck1hcCgpOiBFcnJvck1hcDxBdXRoRXJyb3JDb2RlPiB7XG4gIC8vIFdlIHdpbGwgaW5jbHVkZSB0aGlzIG9uZSBtZXNzYWdlIGluIHRoZSBwcm9kIGVycm9yIG1hcCBzaW5jZSBieSB0aGUgdmVyeVxuICAvLyBuYXR1cmUgb2YgdGhpcyBlcnJvciwgZGV2ZWxvcGVycyB3aWxsIG5ldmVyIGJlIGFibGUgdG8gc2VlIHRoZSBtZXNzYWdlXG4gIC8vIHVzaW5nIHRoZSBkZWJ1Z0Vycm9yTWFwICh3aGljaCBpcyBpbnN0YWxsZWQgZHVyaW5nIGF1dGggaW5pdGlhbGl6YXRpb24pLlxuICByZXR1cm4ge1xuICAgIFtBdXRoRXJyb3JDb2RlLkRFUEVOREVOVF9TREtfSU5JVF9CRUZPUkVfQVVUSF06XG4gICAgICAnQW5vdGhlciBGaXJlYmFzZSBTREsgd2FzIGluaXRpYWxpemVkIGFuZCBpcyB0cnlpbmcgdG8gdXNlIEF1dGggYmVmb3JlIEF1dGggaXMgJyArXG4gICAgICAnaW5pdGlhbGl6ZWQuIFBsZWFzZSBiZSBzdXJlIHRvIGNhbGwgYGluaXRpYWxpemVBdXRoYCBvciBgZ2V0QXV0aGAgYmVmb3JlICcgK1xuICAgICAgJ3N0YXJ0aW5nIGFueSBvdGhlciBGaXJlYmFzZSBTREsuJ1xuICB9IGFzIEVycm9yTWFwPEF1dGhFcnJvckNvZGU+O1xufVxuXG4vKipcbiAqIEEgdmVyYm9zZSBlcnJvciBtYXAgd2l0aCBkZXRhaWxlZCBkZXNjcmlwdGlvbnMgZm9yIG1vc3QgZXJyb3IgY29kZXMuXG4gKlxuICogU2VlIGRpc2N1c3Npb24gYXQge0BsaW5rIEF1dGhFcnJvck1hcH1cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBkZWJ1Z0Vycm9yTWFwOiBBdXRoRXJyb3JNYXAgPSBfZGVidWdFcnJvck1hcDtcblxuLyoqXG4gKiBBIG1pbmltYWwgZXJyb3IgbWFwIHdpdGggYWxsIHZlcmJvc2UgZXJyb3IgbWVzc2FnZXMgc3RyaXBwZWQuXG4gKlxuICogU2VlIGRpc2N1c3Npb24gYXQge0BsaW5rIEF1dGhFcnJvck1hcH1cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBwcm9kRXJyb3JNYXA6IEF1dGhFcnJvck1hcCA9IF9wcm9kRXJyb3JNYXA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmFtZWRFcnJvclBhcmFtcyB7XG4gIGFwcE5hbWU6IEFwcE5hbWU7XG4gIGNyZWRlbnRpYWw/OiBBdXRoQ3JlZGVudGlhbDtcbiAgZW1haWw/OiBzdHJpbmc7XG4gIHBob25lTnVtYmVyPzogc3RyaW5nO1xuICB0ZW5hbnRJZD86IHN0cmluZztcbiAgdXNlcj86IFVzZXI7XG4gIF9zZXJ2ZXJSZXNwb25zZT86IG9iamVjdDtcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xudHlwZSBHZW5lcmljQXV0aEVycm9yUGFyYW1zID0ge1xuICBba2V5IGluIEV4Y2x1ZGU8XG4gICAgQXV0aEVycm9yQ29kZSxcbiAgICB8IEF1dGhFcnJvckNvZGUuQVJHVU1FTlRfRVJST1JcbiAgICB8IEF1dGhFcnJvckNvZGUuREVQRU5ERU5UX1NES19JTklUX0JFRk9SRV9BVVRIXG4gICAgfCBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SXG4gICAgfCBBdXRoRXJyb3JDb2RlLk1GQV9SRVFVSVJFRFxuICAgIHwgQXV0aEVycm9yQ29kZS5OT19BVVRIX0VWRU5UXG4gICAgfCBBdXRoRXJyb3JDb2RlLk9QRVJBVElPTl9OT1RfU1VQUE9SVEVEXG4gID5dOiB7XG4gICAgYXBwTmFtZT86IEFwcE5hbWU7XG4gICAgZW1haWw/OiBzdHJpbmc7XG4gICAgcGhvbmVOdW1iZXI/OiBzdHJpbmc7XG4gICAgbWVzc2FnZT86IHN0cmluZztcbiAgfTtcbn07XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aEVycm9yUGFyYW1zIGV4dGVuZHMgR2VuZXJpY0F1dGhFcnJvclBhcmFtcyB7XG4gIFtBdXRoRXJyb3JDb2RlLkFSR1VNRU5UX0VSUk9SXTogeyBhcHBOYW1lPzogQXBwTmFtZSB9O1xuICBbQXV0aEVycm9yQ29kZS5ERVBFTkRFTlRfU0RLX0lOSVRfQkVGT1JFX0FVVEhdOiB7IGFwcE5hbWU/OiBBcHBOYW1lIH07XG4gIFtBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SXTogeyBhcHBOYW1lPzogQXBwTmFtZSB9O1xuICBbQXV0aEVycm9yQ29kZS5MT0dJTl9CTE9DS0VEXToge1xuICAgIGFwcE5hbWU/OiBBcHBOYW1lO1xuICAgIG9yaWdpbmFsTWVzc2FnZT86IHN0cmluZztcbiAgfTtcbiAgW0F1dGhFcnJvckNvZGUuT1BFUkFUSU9OX05PVF9TVVBQT1JURURdOiB7IGFwcE5hbWU/OiBBcHBOYW1lIH07XG4gIFtBdXRoRXJyb3JDb2RlLk5PX0FVVEhfRVZFTlRdOiB7IGFwcE5hbWU/OiBBcHBOYW1lIH07XG4gIFtBdXRoRXJyb3JDb2RlLk1GQV9SRVFVSVJFRF06IHtcbiAgICBhcHBOYW1lOiBBcHBOYW1lO1xuICAgIF9zZXJ2ZXJSZXNwb25zZTogSWRUb2tlbk1mYVJlc3BvbnNlO1xuICB9O1xuICBbQXV0aEVycm9yQ29kZS5JTlZBTElEX0NPUkRPVkFfQ09ORklHVVJBVElPTl06IHtcbiAgICBhcHBOYW1lOiBBcHBOYW1lO1xuICAgIG1pc3NpbmdQbHVnaW4/OiBzdHJpbmc7XG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBfREVGQVVMVF9BVVRIX0VSUk9SX0ZBQ1RPUlkgPSBuZXcgRXJyb3JGYWN0b3J5PFxuICBBdXRoRXJyb3JDb2RlLFxuICBBdXRoRXJyb3JQYXJhbXNcbj4oJ2F1dGgnLCAnRmlyZWJhc2UnLCBfcHJvZEVycm9yTWFwKCkpO1xuXG4vKipcbiAqIEEgbWFwIG9mIHBvdGVudGlhbCBgQXV0aGAgZXJyb3IgY29kZXMsIGZvciBlYXNpZXIgY29tcGFyaXNvbiB3aXRoIGVycm9yc1xuICogdGhyb3duIGJ5IHRoZSBTREsuXG4gKlxuICogQHJlbWFya3NcbiAqIE5vdGUgdGhhdCB5b3UgY2FuJ3QgdHJlZS1zaGFrZSBpbmRpdmlkdWFsIGtleXNcbiAqIGluIHRoZSBtYXAsIHNvIGJ5IHVzaW5nIHRoZSBtYXAgeW91IG1pZ2h0IHN1YnN0YW50aWFsbHkgaW5jcmVhc2UgeW91clxuICogYnVuZGxlIHNpemUuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgQVVUSF9FUlJPUl9DT0RFU19NQVBfRE9fTk9UX1VTRV9JTlRFUk5BTExZID0ge1xuICBBRE1JTl9PTkxZX09QRVJBVElPTjogJ2F1dGgvYWRtaW4tcmVzdHJpY3RlZC1vcGVyYXRpb24nLFxuICBBUkdVTUVOVF9FUlJPUjogJ2F1dGgvYXJndW1lbnQtZXJyb3InLFxuICBBUFBfTk9UX0FVVEhPUklaRUQ6ICdhdXRoL2FwcC1ub3QtYXV0aG9yaXplZCcsXG4gIEFQUF9OT1RfSU5TVEFMTEVEOiAnYXV0aC9hcHAtbm90LWluc3RhbGxlZCcsXG4gIENBUFRDSEFfQ0hFQ0tfRkFJTEVEOiAnYXV0aC9jYXB0Y2hhLWNoZWNrLWZhaWxlZCcsXG4gIENPREVfRVhQSVJFRDogJ2F1dGgvY29kZS1leHBpcmVkJyxcbiAgQ09SRE9WQV9OT1RfUkVBRFk6ICdhdXRoL2NvcmRvdmEtbm90LXJlYWR5JyxcbiAgQ09SU19VTlNVUFBPUlRFRDogJ2F1dGgvY29ycy11bnN1cHBvcnRlZCcsXG4gIENSRURFTlRJQUxfQUxSRUFEWV9JTl9VU0U6ICdhdXRoL2NyZWRlbnRpYWwtYWxyZWFkeS1pbi11c2UnLFxuICBDUkVERU5USUFMX01JU01BVENIOiAnYXV0aC9jdXN0b20tdG9rZW4tbWlzbWF0Y2gnLFxuICBDUkVERU5USUFMX1RPT19PTERfTE9HSU5fQUdBSU46ICdhdXRoL3JlcXVpcmVzLXJlY2VudC1sb2dpbicsXG4gIERFUEVOREVOVF9TREtfSU5JVF9CRUZPUkVfQVVUSDogJ2F1dGgvZGVwZW5kZW50LXNkay1pbml0aWFsaXplZC1iZWZvcmUtYXV0aCcsXG4gIERZTkFNSUNfTElOS19OT1RfQUNUSVZBVEVEOiAnYXV0aC9keW5hbWljLWxpbmstbm90LWFjdGl2YXRlZCcsXG4gIEVNQUlMX0NIQU5HRV9ORUVEU19WRVJJRklDQVRJT046ICdhdXRoL2VtYWlsLWNoYW5nZS1uZWVkcy12ZXJpZmljYXRpb24nLFxuICBFTUFJTF9FWElTVFM6ICdhdXRoL2VtYWlsLWFscmVhZHktaW4tdXNlJyxcbiAgRU1VTEFUT1JfQ09ORklHX0ZBSUxFRDogJ2F1dGgvZW11bGF0b3ItY29uZmlnLWZhaWxlZCcsXG4gIEVYUElSRURfT09CX0NPREU6ICdhdXRoL2V4cGlyZWQtYWN0aW9uLWNvZGUnLFxuICBFWFBJUkVEX1BPUFVQX1JFUVVFU1Q6ICdhdXRoL2NhbmNlbGxlZC1wb3B1cC1yZXF1ZXN0JyxcbiAgSU5URVJOQUxfRVJST1I6ICdhdXRoL2ludGVybmFsLWVycm9yJyxcbiAgSU5WQUxJRF9BUElfS0VZOiAnYXV0aC9pbnZhbGlkLWFwaS1rZXknLFxuICBJTlZBTElEX0FQUF9DUkVERU5USUFMOiAnYXV0aC9pbnZhbGlkLWFwcC1jcmVkZW50aWFsJyxcbiAgSU5WQUxJRF9BUFBfSUQ6ICdhdXRoL2ludmFsaWQtYXBwLWlkJyxcbiAgSU5WQUxJRF9BVVRIOiAnYXV0aC9pbnZhbGlkLXVzZXItdG9rZW4nLFxuICBJTlZBTElEX0FVVEhfRVZFTlQ6ICdhdXRoL2ludmFsaWQtYXV0aC1ldmVudCcsXG4gIElOVkFMSURfQ0VSVF9IQVNIOiAnYXV0aC9pbnZhbGlkLWNlcnQtaGFzaCcsXG4gIElOVkFMSURfQ09ERTogJ2F1dGgvaW52YWxpZC12ZXJpZmljYXRpb24tY29kZScsXG4gIElOVkFMSURfQ09OVElOVUVfVVJJOiAnYXV0aC9pbnZhbGlkLWNvbnRpbnVlLXVyaScsXG4gIElOVkFMSURfQ09SRE9WQV9DT05GSUdVUkFUSU9OOiAnYXV0aC9pbnZhbGlkLWNvcmRvdmEtY29uZmlndXJhdGlvbicsXG4gIElOVkFMSURfQ1VTVE9NX1RPS0VOOiAnYXV0aC9pbnZhbGlkLWN1c3RvbS10b2tlbicsXG4gIElOVkFMSURfRFlOQU1JQ19MSU5LX0RPTUFJTjogJ2F1dGgvaW52YWxpZC1keW5hbWljLWxpbmstZG9tYWluJyxcbiAgSU5WQUxJRF9FTUFJTDogJ2F1dGgvaW52YWxpZC1lbWFpbCcsXG4gIElOVkFMSURfRU1VTEFUT1JfU0NIRU1FOiAnYXV0aC9pbnZhbGlkLWVtdWxhdG9yLXNjaGVtZScsXG4gIElOVkFMSURfSURQX1JFU1BPTlNFOiAnYXV0aC9pbnZhbGlkLWNyZWRlbnRpYWwnLFxuICBJTlZBTElEX01FU1NBR0VfUEFZTE9BRDogJ2F1dGgvaW52YWxpZC1tZXNzYWdlLXBheWxvYWQnLFxuICBJTlZBTElEX01GQV9TRVNTSU9OOiAnYXV0aC9pbnZhbGlkLW11bHRpLWZhY3Rvci1zZXNzaW9uJyxcbiAgSU5WQUxJRF9PQVVUSF9DTElFTlRfSUQ6ICdhdXRoL2ludmFsaWQtb2F1dGgtY2xpZW50LWlkJyxcbiAgSU5WQUxJRF9PQVVUSF9QUk9WSURFUjogJ2F1dGgvaW52YWxpZC1vYXV0aC1wcm92aWRlcicsXG4gIElOVkFMSURfT09CX0NPREU6ICdhdXRoL2ludmFsaWQtYWN0aW9uLWNvZGUnLFxuICBJTlZBTElEX09SSUdJTjogJ2F1dGgvdW5hdXRob3JpemVkLWRvbWFpbicsXG4gIElOVkFMSURfUEFTU1dPUkQ6ICdhdXRoL3dyb25nLXBhc3N3b3JkJyxcbiAgSU5WQUxJRF9QRVJTSVNURU5DRTogJ2F1dGgvaW52YWxpZC1wZXJzaXN0ZW5jZS10eXBlJyxcbiAgSU5WQUxJRF9QSE9ORV9OVU1CRVI6ICdhdXRoL2ludmFsaWQtcGhvbmUtbnVtYmVyJyxcbiAgSU5WQUxJRF9QUk9WSURFUl9JRDogJ2F1dGgvaW52YWxpZC1wcm92aWRlci1pZCcsXG4gIElOVkFMSURfUkVDSVBJRU5UX0VNQUlMOiAnYXV0aC9pbnZhbGlkLXJlY2lwaWVudC1lbWFpbCcsXG4gIElOVkFMSURfU0VOREVSOiAnYXV0aC9pbnZhbGlkLXNlbmRlcicsXG4gIElOVkFMSURfU0VTU0lPTl9JTkZPOiAnYXV0aC9pbnZhbGlkLXZlcmlmaWNhdGlvbi1pZCcsXG4gIElOVkFMSURfVEVOQU5UX0lEOiAnYXV0aC9pbnZhbGlkLXRlbmFudC1pZCcsXG4gIE1GQV9JTkZPX05PVF9GT1VORDogJ2F1dGgvbXVsdGktZmFjdG9yLWluZm8tbm90LWZvdW5kJyxcbiAgTUZBX1JFUVVJUkVEOiAnYXV0aC9tdWx0aS1mYWN0b3ItYXV0aC1yZXF1aXJlZCcsXG4gIE1JU1NJTkdfQU5EUk9JRF9QQUNLQUdFX05BTUU6ICdhdXRoL21pc3NpbmctYW5kcm9pZC1wa2ctbmFtZScsXG4gIE1JU1NJTkdfQVBQX0NSRURFTlRJQUw6ICdhdXRoL21pc3NpbmctYXBwLWNyZWRlbnRpYWwnLFxuICBNSVNTSU5HX0FVVEhfRE9NQUlOOiAnYXV0aC9hdXRoLWRvbWFpbi1jb25maWctcmVxdWlyZWQnLFxuICBNSVNTSU5HX0NPREU6ICdhdXRoL21pc3NpbmctdmVyaWZpY2F0aW9uLWNvZGUnLFxuICBNSVNTSU5HX0NPTlRJTlVFX1VSSTogJ2F1dGgvbWlzc2luZy1jb250aW51ZS11cmknLFxuICBNSVNTSU5HX0lGUkFNRV9TVEFSVDogJ2F1dGgvbWlzc2luZy1pZnJhbWUtc3RhcnQnLFxuICBNSVNTSU5HX0lPU19CVU5ETEVfSUQ6ICdhdXRoL21pc3NpbmctaW9zLWJ1bmRsZS1pZCcsXG4gIE1JU1NJTkdfT1JfSU5WQUxJRF9OT05DRTogJ2F1dGgvbWlzc2luZy1vci1pbnZhbGlkLW5vbmNlJyxcbiAgTUlTU0lOR19NRkFfSU5GTzogJ2F1dGgvbWlzc2luZy1tdWx0aS1mYWN0b3ItaW5mbycsXG4gIE1JU1NJTkdfTUZBX1NFU1NJT046ICdhdXRoL21pc3NpbmctbXVsdGktZmFjdG9yLXNlc3Npb24nLFxuICBNSVNTSU5HX1BIT05FX05VTUJFUjogJ2F1dGgvbWlzc2luZy1waG9uZS1udW1iZXInLFxuICBNSVNTSU5HX1NFU1NJT05fSU5GTzogJ2F1dGgvbWlzc2luZy12ZXJpZmljYXRpb24taWQnLFxuICBNT0RVTEVfREVTVFJPWUVEOiAnYXV0aC9hcHAtZGVsZXRlZCcsXG4gIE5FRURfQ09ORklSTUFUSU9OOiAnYXV0aC9hY2NvdW50LWV4aXN0cy13aXRoLWRpZmZlcmVudC1jcmVkZW50aWFsJyxcbiAgTkVUV09SS19SRVFVRVNUX0ZBSUxFRDogJ2F1dGgvbmV0d29yay1yZXF1ZXN0LWZhaWxlZCcsXG4gIE5VTExfVVNFUjogJ2F1dGgvbnVsbC11c2VyJyxcbiAgTk9fQVVUSF9FVkVOVDogJ2F1dGgvbm8tYXV0aC1ldmVudCcsXG4gIE5PX1NVQ0hfUFJPVklERVI6ICdhdXRoL25vLXN1Y2gtcHJvdmlkZXInLFxuICBPUEVSQVRJT05fTk9UX0FMTE9XRUQ6ICdhdXRoL29wZXJhdGlvbi1ub3QtYWxsb3dlZCcsXG4gIE9QRVJBVElPTl9OT1RfU1VQUE9SVEVEOiAnYXV0aC9vcGVyYXRpb24tbm90LXN1cHBvcnRlZC1pbi10aGlzLWVudmlyb25tZW50JyxcbiAgUE9QVVBfQkxPQ0tFRDogJ2F1dGgvcG9wdXAtYmxvY2tlZCcsXG4gIFBPUFVQX0NMT1NFRF9CWV9VU0VSOiAnYXV0aC9wb3B1cC1jbG9zZWQtYnktdXNlcicsXG4gIFBST1ZJREVSX0FMUkVBRFlfTElOS0VEOiAnYXV0aC9wcm92aWRlci1hbHJlYWR5LWxpbmtlZCcsXG4gIFFVT1RBX0VYQ0VFREVEOiAnYXV0aC9xdW90YS1leGNlZWRlZCcsXG4gIFJFRElSRUNUX0NBTkNFTExFRF9CWV9VU0VSOiAnYXV0aC9yZWRpcmVjdC1jYW5jZWxsZWQtYnktdXNlcicsXG4gIFJFRElSRUNUX09QRVJBVElPTl9QRU5ESU5HOiAnYXV0aC9yZWRpcmVjdC1vcGVyYXRpb24tcGVuZGluZycsXG4gIFJFSkVDVEVEX0NSRURFTlRJQUw6ICdhdXRoL3JlamVjdGVkLWNyZWRlbnRpYWwnLFxuICBTRUNPTkRfRkFDVE9SX0FMUkVBRFlfRU5ST0xMRUQ6ICdhdXRoL3NlY29uZC1mYWN0b3ItYWxyZWFkeS1pbi11c2UnLFxuICBTRUNPTkRfRkFDVE9SX0xJTUlUX0VYQ0VFREVEOiAnYXV0aC9tYXhpbXVtLXNlY29uZC1mYWN0b3ItY291bnQtZXhjZWVkZWQnLFxuICBURU5BTlRfSURfTUlTTUFUQ0g6ICdhdXRoL3RlbmFudC1pZC1taXNtYXRjaCcsXG4gIFRJTUVPVVQ6ICdhdXRoL3RpbWVvdXQnLFxuICBUT0tFTl9FWFBJUkVEOiAnYXV0aC91c2VyLXRva2VuLWV4cGlyZWQnLFxuICBUT09fTUFOWV9BVFRFTVBUU19UUllfTEFURVI6ICdhdXRoL3Rvby1tYW55LXJlcXVlc3RzJyxcbiAgVU5BVVRIT1JJWkVEX0RPTUFJTjogJ2F1dGgvdW5hdXRob3JpemVkLWNvbnRpbnVlLXVyaScsXG4gIFVOU1VQUE9SVEVEX0ZJUlNUX0ZBQ1RPUjogJ2F1dGgvdW5zdXBwb3J0ZWQtZmlyc3QtZmFjdG9yJyxcbiAgVU5TVVBQT1JURURfUEVSU0lTVEVOQ0U6ICdhdXRoL3Vuc3VwcG9ydGVkLXBlcnNpc3RlbmNlLXR5cGUnLFxuICBVTlNVUFBPUlRFRF9URU5BTlRfT1BFUkFUSU9OOiAnYXV0aC91bnN1cHBvcnRlZC10ZW5hbnQtb3BlcmF0aW9uJyxcbiAgVU5WRVJJRklFRF9FTUFJTDogJ2F1dGgvdW52ZXJpZmllZC1lbWFpbCcsXG4gIFVTRVJfQ0FOQ0VMTEVEOiAnYXV0aC91c2VyLWNhbmNlbGxlZCcsXG4gIFVTRVJfREVMRVRFRDogJ2F1dGgvdXNlci1ub3QtZm91bmQnLFxuICBVU0VSX0RJU0FCTEVEOiAnYXV0aC91c2VyLWRpc2FibGVkJyxcbiAgVVNFUl9NSVNNQVRDSDogJ2F1dGgvdXNlci1taXNtYXRjaCcsXG4gIFVTRVJfU0lHTkVEX09VVDogJ2F1dGgvdXNlci1zaWduZWQtb3V0JyxcbiAgV0VBS19QQVNTV09SRDogJ2F1dGgvd2Vhay1wYXNzd29yZCcsXG4gIFdFQl9TVE9SQUdFX1VOU1VQUE9SVEVEOiAnYXV0aC93ZWItc3RvcmFnZS11bnN1cHBvcnRlZCcsXG4gIEFMUkVBRFlfSU5JVElBTElaRUQ6ICdhdXRoL2FscmVhZHktaW5pdGlhbGl6ZWQnLFxuICBSRUNBUFRDSEFfTk9UX0VOQUJMRUQ6ICdhdXRoL3JlY2FwdGNoYS1ub3QtZW5hYmxlZCcsXG4gIE1JU1NJTkdfUkVDQVBUQ0hBX1RPS0VOOiAnYXV0aC9taXNzaW5nLXJlY2FwdGNoYS10b2tlbicsXG4gIElOVkFMSURfUkVDQVBUQ0hBX1RPS0VOOiAnYXV0aC9pbnZhbGlkLXJlY2FwdGNoYS10b2tlbicsXG4gIElOVkFMSURfUkVDQVBUQ0hBX0FDVElPTjogJ2F1dGgvaW52YWxpZC1yZWNhcHRjaGEtYWN0aW9uJyxcbiAgTUlTU0lOR19DTElFTlRfVFlQRTogJ2F1dGgvbWlzc2luZy1jbGllbnQtdHlwZScsXG4gIE1JU1NJTkdfUkVDQVBUQ0hBX1ZFUlNJT046ICdhdXRoL21pc3NpbmctcmVjYXB0Y2hhLXZlcnNpb24nLFxuICBJTlZBTElEX1JFQ0FQVENIQV9WRVJTSU9OOiAnYXV0aC9pbnZhbGlkLXJlY2FwdGNoYS12ZXJzaW9uJyxcbiAgSU5WQUxJRF9SRVFfVFlQRTogJ2F1dGgvaW52YWxpZC1yZXEtdHlwZSdcbn0gYXMgY29uc3Q7XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgTG9nZ2VyLCBMb2dMZXZlbCB9IGZyb20gJ0BmaXJlYmFzZS9sb2dnZXInO1xuaW1wb3J0IHsgU0RLX1ZFUlNJT04gfSBmcm9tICdAZmlyZWJhc2UvYXBwJztcblxuZXhwb3J0IHsgTG9nTGV2ZWwgfTtcblxuY29uc3QgbG9nQ2xpZW50ID0gbmV3IExvZ2dlcignQGZpcmViYXNlL2F1dGgnKTtcblxuLy8gSGVscGVyIG1ldGhvZHMgYXJlIG5lZWRlZCBiZWNhdXNlIHZhcmlhYmxlcyBjYW4ndCBiZSBleHBvcnRlZCBhcyByZWFkL3dyaXRlXG5leHBvcnQgZnVuY3Rpb24gX2dldExvZ0xldmVsKCk6IExvZ0xldmVsIHtcbiAgcmV0dXJuIGxvZ0NsaWVudC5sb2dMZXZlbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9zZXRMb2dMZXZlbChuZXdMZXZlbDogTG9nTGV2ZWwpOiB2b2lkIHtcbiAgbG9nQ2xpZW50LmxvZ0xldmVsID0gbmV3TGV2ZWw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfbG9nRGVidWcobXNnOiBzdHJpbmcsIC4uLmFyZ3M6IHN0cmluZ1tdKTogdm9pZCB7XG4gIGlmIChsb2dDbGllbnQubG9nTGV2ZWwgPD0gTG9nTGV2ZWwuREVCVUcpIHtcbiAgICBsb2dDbGllbnQuZGVidWcoYEF1dGggKCR7U0RLX1ZFUlNJT059KTogJHttc2d9YCwgLi4uYXJncyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9sb2dXYXJuKG1zZzogc3RyaW5nLCAuLi5hcmdzOiBzdHJpbmdbXSk6IHZvaWQge1xuICBpZiAobG9nQ2xpZW50LmxvZ0xldmVsIDw9IExvZ0xldmVsLldBUk4pIHtcbiAgICBsb2dDbGllbnQud2FybihgQXV0aCAoJHtTREtfVkVSU0lPTn0pOiAke21zZ31gLCAuLi5hcmdzKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX2xvZ0Vycm9yKG1zZzogc3RyaW5nLCAuLi5hcmdzOiBzdHJpbmdbXSk6IHZvaWQge1xuICBpZiAobG9nQ2xpZW50LmxvZ0xldmVsIDw9IExvZ0xldmVsLkVSUk9SKSB7XG4gICAgbG9nQ2xpZW50LmVycm9yKGBBdXRoICgke1NES19WRVJTSU9OfSk6ICR7bXNnfWAsIC4uLmFyZ3MpO1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgQXV0aCB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5pbXBvcnQgeyBFcnJvckZhY3RvcnksIEZpcmViYXNlRXJyb3IgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5pbXBvcnQgeyBBdXRoSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC9hdXRoJztcbmltcG9ydCB7XG4gIF9ERUZBVUxUX0FVVEhfRVJST1JfRkFDVE9SWSxcbiAgQXV0aEVycm9yQ29kZSxcbiAgQXV0aEVycm9yUGFyYW1zLFxuICBwcm9kRXJyb3JNYXAsXG4gIEVycm9yTWFwUmV0cmlldmVyXG59IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBfbG9nRXJyb3IgfSBmcm9tICcuL2xvZyc7XG5cbnR5cGUgQXV0aEVycm9yTGlzdFBhcmFtczxLPiA9IEsgZXh0ZW5kcyBrZXlvZiBBdXRoRXJyb3JQYXJhbXNcbiAgPyBbQXV0aEVycm9yUGFyYW1zW0tdXVxuICA6IFtdO1xudHlwZSBMZXNzQXBwTmFtZTxLIGV4dGVuZHMgQXV0aEVycm9yQ29kZT4gPSBPbWl0PEF1dGhFcnJvclBhcmFtc1tLXSwgJ2FwcE5hbWUnPjtcblxuLyoqXG4gKiBVbmNvbmRpdGlvbmFsbHkgZmFpbHMsIHRocm93aW5nIGEgZGV2ZWxvcGVyIGZhY2luZyBJTlRFUk5BTF9FUlJPUlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiBmYWlsKGF1dGgsIEF1dGhFcnJvckNvZGUuTUZBX1JFUVVJUkVEKTsgIC8vIEVycm9yOiB0aGUgTUZBX1JFUVVJUkVEIGVycm9yIG5lZWRzIG1vcmUgcGFyYW1zIHRoYW4gYXBwTmFtZVxuICogZmFpbChhdXRoLCBBdXRoRXJyb3JDb2RlLk1GQV9SRVFVSVJFRCwge3NlcnZlclJlc3BvbnNlfSk7ICAvLyBDb21waWxlc1xuICogZmFpbChBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SKTsgIC8vIENvbXBpbGVzOyBpbnRlcm5hbCBlcnJvciBkb2VzIG5vdCBuZWVkIGFwcE5hbWVcbiAqIGZhaWwoQXV0aEVycm9yQ29kZS5VU0VSX0RFTEVURUQpOyAgLy8gRXJyb3I6IFVTRVJfREVMRVRFRCByZXF1aXJlcyBhcHAgbmFtZVxuICogZmFpbChhdXRoLCBBdXRoRXJyb3JDb2RlLlVTRVJfREVMRVRFRCk7ICAvLyBDb21waWxlczsgVVNFUl9ERUxFVEVEIF9vbmx5XyBuZWVkcyBhcHAgbmFtZVxuICogYGBgXG4gKlxuICogQHBhcmFtIGFwcE5hbWUgQXBwIG5hbWUgZm9yIHRhZ2dpbmcgdGhlIGVycm9yXG4gKiBAdGhyb3dzIEZpcmViYXNlRXJyb3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9mYWlsPEsgZXh0ZW5kcyBBdXRoRXJyb3JDb2RlPihcbiAgY29kZTogSyxcbiAgLi4uZGF0YToge30gZXh0ZW5kcyBBdXRoRXJyb3JQYXJhbXNbS11cbiAgICA/IFtBdXRoRXJyb3JQYXJhbXNbS10/XVxuICAgIDogW0F1dGhFcnJvclBhcmFtc1tLXV1cbik6IG5ldmVyO1xuZXhwb3J0IGZ1bmN0aW9uIF9mYWlsPEsgZXh0ZW5kcyBBdXRoRXJyb3JDb2RlPihcbiAgYXV0aDogQXV0aCxcbiAgY29kZTogSyxcbiAgLi4uZGF0YToge30gZXh0ZW5kcyBMZXNzQXBwTmFtZTxLPiA/IFtMZXNzQXBwTmFtZTxLPj9dIDogW0xlc3NBcHBOYW1lPEs+XVxuKTogbmV2ZXI7XG5leHBvcnQgZnVuY3Rpb24gX2ZhaWw8SyBleHRlbmRzIEF1dGhFcnJvckNvZGU+KFxuICBhdXRoT3JDb2RlOiBBdXRoIHwgSyxcbiAgLi4ucmVzdDogdW5rbm93bltdXG4pOiBuZXZlciB7XG4gIHRocm93IGNyZWF0ZUVycm9ySW50ZXJuYWwoYXV0aE9yQ29kZSwgLi4ucmVzdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfY3JlYXRlRXJyb3I8SyBleHRlbmRzIEF1dGhFcnJvckNvZGU+KFxuICBjb2RlOiBLLFxuICAuLi5kYXRhOiB7fSBleHRlbmRzIEF1dGhFcnJvclBhcmFtc1tLXVxuICAgID8gW0F1dGhFcnJvclBhcmFtc1tLXT9dXG4gICAgOiBbQXV0aEVycm9yUGFyYW1zW0tdXVxuKTogRmlyZWJhc2VFcnJvcjtcbmV4cG9ydCBmdW5jdGlvbiBfY3JlYXRlRXJyb3I8SyBleHRlbmRzIEF1dGhFcnJvckNvZGU+KFxuICBhdXRoOiBBdXRoLFxuICBjb2RlOiBLLFxuICAuLi5kYXRhOiB7fSBleHRlbmRzIExlc3NBcHBOYW1lPEs+ID8gW0xlc3NBcHBOYW1lPEs+P10gOiBbTGVzc0FwcE5hbWU8Sz5dXG4pOiBGaXJlYmFzZUVycm9yO1xuZXhwb3J0IGZ1bmN0aW9uIF9jcmVhdGVFcnJvcjxLIGV4dGVuZHMgQXV0aEVycm9yQ29kZT4oXG4gIGF1dGhPckNvZGU6IEF1dGggfCBLLFxuICAuLi5yZXN0OiB1bmtub3duW11cbik6IEZpcmViYXNlRXJyb3Ige1xuICByZXR1cm4gY3JlYXRlRXJyb3JJbnRlcm5hbChhdXRoT3JDb2RlLCAuLi5yZXN0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9lcnJvcldpdGhDdXN0b21NZXNzYWdlKFxuICBhdXRoOiBBdXRoLFxuICBjb2RlOiBBdXRoRXJyb3JDb2RlLFxuICBtZXNzYWdlOiBzdHJpbmdcbik6IEZpcmViYXNlRXJyb3Ige1xuICBjb25zdCBlcnJvck1hcCA9IHtcbiAgICAuLi4ocHJvZEVycm9yTWFwIGFzIEVycm9yTWFwUmV0cmlldmVyKSgpLFxuICAgIFtjb2RlXTogbWVzc2FnZVxuICB9O1xuICBjb25zdCBmYWN0b3J5ID0gbmV3IEVycm9yRmFjdG9yeTxBdXRoRXJyb3JDb2RlLCBBdXRoRXJyb3JQYXJhbXM+KFxuICAgICdhdXRoJyxcbiAgICAnRmlyZWJhc2UnLFxuICAgIGVycm9yTWFwXG4gICk7XG4gIHJldHVybiBmYWN0b3J5LmNyZWF0ZShjb2RlLCB7XG4gICAgYXBwTmFtZTogYXV0aC5uYW1lXG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX2Fzc2VydEluc3RhbmNlT2YoXG4gIGF1dGg6IEF1dGgsXG4gIG9iamVjdDogb2JqZWN0LFxuICBpbnN0YW5jZTogdW5rbm93blxuKTogdm9pZCB7XG4gIGNvbnN0IGNvbnN0cnVjdG9ySW5zdGFuY2UgPSBpbnN0YW5jZSBhcyB7IG5ldyAoLi4uYXJnczogdW5rbm93bltdKTogdW5rbm93biB9O1xuICBpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBjb25zdHJ1Y3Rvckluc3RhbmNlKSkge1xuICAgIGlmIChjb25zdHJ1Y3Rvckluc3RhbmNlLm5hbWUgIT09IG9iamVjdC5jb25zdHJ1Y3Rvci5uYW1lKSB7XG4gICAgICBfZmFpbChhdXRoLCBBdXRoRXJyb3JDb2RlLkFSR1VNRU5UX0VSUk9SKTtcbiAgICB9XG5cbiAgICB0aHJvdyBfZXJyb3JXaXRoQ3VzdG9tTWVzc2FnZShcbiAgICAgIGF1dGgsXG4gICAgICBBdXRoRXJyb3JDb2RlLkFSR1VNRU5UX0VSUk9SLFxuICAgICAgYFR5cGUgb2YgJHtvYmplY3QuY29uc3RydWN0b3IubmFtZX0gZG9lcyBub3QgbWF0Y2ggZXhwZWN0ZWQgaW5zdGFuY2UuYCArXG4gICAgICAgIGBEaWQgeW91IHBhc3MgYSByZWZlcmVuY2UgZnJvbSBhIGRpZmZlcmVudCBBdXRoIFNESz9gXG4gICAgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVFcnJvckludGVybmFsPEsgZXh0ZW5kcyBBdXRoRXJyb3JDb2RlPihcbiAgYXV0aE9yQ29kZTogQXV0aCB8IEssXG4gIC4uLnJlc3Q6IHVua25vd25bXVxuKTogRmlyZWJhc2VFcnJvciB7XG4gIGlmICh0eXBlb2YgYXV0aE9yQ29kZSAhPT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCBjb2RlID0gcmVzdFswXSBhcyBLO1xuICAgIGNvbnN0IGZ1bGxQYXJhbXMgPSBbLi4ucmVzdC5zbGljZSgxKV0gYXMgQXV0aEVycm9yTGlzdFBhcmFtczxLPjtcbiAgICBpZiAoZnVsbFBhcmFtc1swXSkge1xuICAgICAgZnVsbFBhcmFtc1swXS5hcHBOYW1lID0gYXV0aE9yQ29kZS5uYW1lO1xuICAgIH1cblxuICAgIHJldHVybiAoYXV0aE9yQ29kZSBhcyBBdXRoSW50ZXJuYWwpLl9lcnJvckZhY3RvcnkuY3JlYXRlKFxuICAgICAgY29kZSxcbiAgICAgIC4uLmZ1bGxQYXJhbXNcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIF9ERUZBVUxUX0FVVEhfRVJST1JfRkFDVE9SWS5jcmVhdGUoXG4gICAgYXV0aE9yQ29kZSxcbiAgICAuLi4ocmVzdCBhcyBBdXRoRXJyb3JMaXN0UGFyYW1zPEs+KVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX2Fzc2VydDxLIGV4dGVuZHMgQXV0aEVycm9yQ29kZT4oXG4gIGFzc2VydGlvbjogdW5rbm93bixcbiAgY29kZTogSyxcbiAgLi4uZGF0YToge30gZXh0ZW5kcyBBdXRoRXJyb3JQYXJhbXNbS11cbiAgICA/IFtBdXRoRXJyb3JQYXJhbXNbS10/XVxuICAgIDogW0F1dGhFcnJvclBhcmFtc1tLXV1cbik6IGFzc2VydHMgYXNzZXJ0aW9uO1xuZXhwb3J0IGZ1bmN0aW9uIF9hc3NlcnQ8SyBleHRlbmRzIEF1dGhFcnJvckNvZGU+KFxuICBhc3NlcnRpb246IHVua25vd24sXG4gIGF1dGg6IEF1dGgsXG4gIGNvZGU6IEssXG4gIC4uLmRhdGE6IHt9IGV4dGVuZHMgTGVzc0FwcE5hbWU8Sz4gPyBbTGVzc0FwcE5hbWU8Sz4/XSA6IFtMZXNzQXBwTmFtZTxLPl1cbik6IGFzc2VydHMgYXNzZXJ0aW9uO1xuZXhwb3J0IGZ1bmN0aW9uIF9hc3NlcnQ8SyBleHRlbmRzIEF1dGhFcnJvckNvZGU+KFxuICBhc3NlcnRpb246IHVua25vd24sXG4gIGF1dGhPckNvZGU6IEF1dGggfCBLLFxuICAuLi5yZXN0OiB1bmtub3duW11cbik6IGFzc2VydHMgYXNzZXJ0aW9uIHtcbiAgaWYgKCFhc3NlcnRpb24pIHtcbiAgICB0aHJvdyBjcmVhdGVFcnJvckludGVybmFsKGF1dGhPckNvZGUsIC4uLnJlc3QpO1xuICB9XG59XG5cbi8vIFdlIHJlYWxseSBkbyB3YW50IHRvIGFjY2VwdCBsaXRlcmFsbHkgYW55IGZ1bmN0aW9uIHR5cGUgaGVyZVxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHlwZXNcbnR5cGUgVHlwZUV4cGVjdGF0aW9uID0gRnVuY3Rpb24gfCBzdHJpbmcgfCBNYXBUeXBlO1xuXG5pbnRlcmZhY2UgTWFwVHlwZSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIFR5cGVFeHBlY3RhdGlvbiB8IE9wdGlvbmFsPiB7fVxuXG5jbGFzcyBPcHRpb25hbCB7XG4gIGNvbnN0cnVjdG9yKHJlYWRvbmx5IHR5cGU6IFR5cGVFeHBlY3RhdGlvbikge31cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9wdCh0eXBlOiBUeXBlRXhwZWN0YXRpb24pOiBPcHRpb25hbCB7XG4gIHJldHVybiBuZXcgT3B0aW9uYWwodHlwZSk7XG59XG5cbi8qKlxuICogQXNzZXJ0cyB0aGUgcnVudGltZSB0eXBlcyBvZiBhcmd1bWVudHMuIFRoZSAnZXhwZWN0ZWQnIGZpZWxkIGNhbiBiZSBvbmUgb2ZcbiAqIGEgY2xhc3MsIGEgc3RyaW5nIChyZXByZXNlbnRpbmcgYSBcInR5cGVvZlwiIGNhbGwpLCBvciBhIHJlY29yZCBtYXAgb2YgbmFtZVxuICogdG8gdHlwZS4gRnVydGhlcm1vcmUsIHRoZSBvcHQoKSBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBtYXJrIGEgZmllbGQgYXNcbiAqIG9wdGlvbmFsLiBGb3IgZXhhbXBsZTpcbiAqXG4gKiBmdW5jdGlvbiBmb28oYXV0aDogQXV0aCwgcHJvZmlsZToge2Rpc3BsYXlOYW1lPzogc3RyaW5nfSwgdXBkYXRlID0gZmFsc2UpIHtcbiAqICAgYXNzZXJ0VHlwZXMoYXJndW1lbnRzLCBbQXV0aEltcGwsIHtkaXNwbGF5TmFtZTogb3B0KCdzdHJpbmcnKX0sIG9wdCgnYm9vbGVhbicpXSk7XG4gKiB9XG4gKlxuICogb3B0KCkgY2FuIGJlIHVzZWQgZm9yIGFueSB0eXBlOlxuICogZnVuY3Rpb24gZm9vKGF1dGg/OiBBdXRoKSB7XG4gKiAgIGFzc2VydFR5cGVzKGFyZ3VtZW50cywgW29wdChBdXRoSW1wbCldKTtcbiAqIH1cbiAqXG4gKiBUaGUgc3RyaW5nIHR5cGVzIGNhbiBiZSBvcidkIHRvZ2V0aGVyLCBhbmQgeW91IGNhbiB1c2UgXCJudWxsXCIgYXMgd2VsbCAobm90ZVxuICogdGhhdCB0eXBlb2YgbnVsbCA9PT0gJ29iamVjdCc7IHRoaXMgaXMgYW4gZWRnZSBjYXNlKS4gRm9yIGV4YW1wbGU6XG4gKlxuICogZnVuY3Rpb24gZm9vKHByb2ZpbGU6IHtkaXNwbGF5TmFtZT86IHN0cmluZyB8IG51bGx9KSB7XG4gKiAgIGFzc2VydFR5cGVzKGFyZ3VtZW50cywgW3tkaXNwbGF5TmFtZTogb3B0KCdzdHJpbmd8bnVsbCcpfV0pO1xuICogfVxuICpcbiAqIEBwYXJhbSBhcmdzXG4gKiBAcGFyYW0gZXhwZWN0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFR5cGVzKFxuICBhcmdzOiBPbWl0PElBcmd1bWVudHMsICdjYWxsZWUnPixcbiAgLi4uZXhwZWN0ZWQ6IEFycmF5PFR5cGVFeHBlY3RhdGlvbiB8IE9wdGlvbmFsPlxuKTogdm9pZCB7XG4gIGlmIChhcmdzLmxlbmd0aCA+IGV4cGVjdGVkLmxlbmd0aCkge1xuICAgIF9mYWlsKEF1dGhFcnJvckNvZGUuQVJHVU1FTlRfRVJST1IsIHt9KTtcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZXhwZWN0ZWQubGVuZ3RoOyBpKyspIHtcbiAgICBsZXQgZXhwZWN0ID0gZXhwZWN0ZWRbaV07XG4gICAgY29uc3QgYXJnID0gYXJnc1tpXTtcblxuICAgIGlmIChleHBlY3QgaW5zdGFuY2VvZiBPcHRpb25hbCkge1xuICAgICAgLy8gSWYgdGhlIGFyZyBpcyB1bmRlZmluZWQsIHRoZW4gaXQgbWF0Y2hlcyBcIm9wdGlvbmFsXCIgYW5kIHdlIGNhbiBtb3ZlIHRvXG4gICAgICAvLyB0aGUgbmV4dCBhcmdcbiAgICAgIGlmICh0eXBlb2YgYXJnID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGV4cGVjdCA9IGV4cGVjdC50eXBlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZXhwZWN0ID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gSGFuZGxlIHRoZSBlZGdlIGNhc2UgZm9yIG51bGwgYmVjYXVzZSB0eXBlb2YgbnVsbCA9PT0gJ29iamVjdCdcbiAgICAgIGlmIChleHBlY3QuaW5jbHVkZXMoJ251bGwnKSAmJiBhcmcgPT09IG51bGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlcXVpcmVkID0gZXhwZWN0LnNwbGl0KCd8Jyk7XG4gICAgICBfYXNzZXJ0KHJlcXVpcmVkLmluY2x1ZGVzKHR5cGVvZiBhcmcpLCBBdXRoRXJyb3JDb2RlLkFSR1VNRU5UX0VSUk9SLCB7fSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwZWN0ID09PSAnb2JqZWN0Jykge1xuICAgICAgLy8gUmVjdXJzaXZlbHkgY2hlY2sgcmVjb3JkIGFyZ3VtZW50c1xuICAgICAgY29uc3QgcmVjb3JkID0gYXJnIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgY29uc3QgbWFwID0gZXhwZWN0IGFzIE1hcFR5cGU7XG4gICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZXhwZWN0KTtcblxuICAgICAgYXNzZXJ0VHlwZXMoXG4gICAgICAgIGtleXMubWFwKGsgPT4gcmVjb3JkW2tdKSxcbiAgICAgICAgLi4ua2V5cy5tYXAoayA9PiBtYXBba10pXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBfYXNzZXJ0KGFyZyBpbnN0YW5jZW9mIGV4cGVjdCwgQXV0aEVycm9yQ29kZS5BUkdVTUVOVF9FUlJPUiwge30pO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFVuY29uZGl0aW9uYWxseSBmYWlscywgdGhyb3dpbmcgYW4gaW50ZXJuYWwgZXJyb3Igd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZS5cbiAqXG4gKiBAcGFyYW0gZmFpbHVyZSB0eXBlIG9mIGZhaWx1cmUgZW5jb3VudGVyZWRcbiAqIEB0aHJvd3MgRXJyb3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlYnVnRmFpbChmYWlsdXJlOiBzdHJpbmcpOiBuZXZlciB7XG4gIC8vIExvZyB0aGUgZmFpbHVyZSBpbiBhZGRpdGlvbiB0byB0aHJvdyBhbiBleGNlcHRpb24sIGp1c3QgaW4gY2FzZSB0aGVcbiAgLy8gZXhjZXB0aW9uIGlzIHN3YWxsb3dlZC5cbiAgY29uc3QgbWVzc2FnZSA9IGBJTlRFUk5BTCBBU1NFUlRJT04gRkFJTEVEOiBgICsgZmFpbHVyZTtcbiAgX2xvZ0Vycm9yKG1lc3NhZ2UpO1xuXG4gIC8vIE5PVEU6IFdlIGRvbid0IHVzZSBGaXJlYmFzZUVycm9yIGhlcmUgYmVjYXVzZSB0aGVzZSBhcmUgaW50ZXJuYWwgZmFpbHVyZXNcbiAgLy8gdGhhdCBjYW5ub3QgYmUgaGFuZGxlZCBieSB0aGUgdXNlci4gKEFsc28gaXQgd291bGQgY3JlYXRlIGEgY2lyY3VsYXJcbiAgLy8gZGVwZW5kZW5jeSBiZXR3ZWVuIHRoZSBlcnJvciBhbmQgYXNzZXJ0IG1vZHVsZXMgd2hpY2ggZG9lc24ndCB3b3JrLilcbiAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xufVxuXG4vKipcbiAqIEZhaWxzIGlmIHRoZSBnaXZlbiBhc3NlcnRpb24gY29uZGl0aW9uIGlzIGZhbHNlLCB0aHJvd2luZyBhbiBFcnJvciB3aXRoIHRoZVxuICogZ2l2ZW4gbWVzc2FnZSBpZiBpdCBkaWQuXG4gKlxuICogQHBhcmFtIGFzc2VydGlvblxuICogQHBhcmFtIG1lc3NhZ2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlYnVnQXNzZXJ0KFxuICBhc3NlcnRpb246IHVua25vd24sXG4gIG1lc3NhZ2U6IHN0cmluZ1xuKTogYXNzZXJ0cyBhc3NlcnRpb24ge1xuICBpZiAoIWFzc2VydGlvbikge1xuICAgIGRlYnVnRmFpbChtZXNzYWdlKTtcbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBfZ2V0Q3VycmVudFVybCgpOiBzdHJpbmcge1xuICByZXR1cm4gKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyAmJiBzZWxmLmxvY2F0aW9uPy5ocmVmKSB8fCAnJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9pc0h0dHBPckh0dHBzKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gX2dldEN1cnJlbnRTY2hlbWUoKSA9PT0gJ2h0dHA6JyB8fCBfZ2V0Q3VycmVudFNjaGVtZSgpID09PSAnaHR0cHM6Jztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9nZXRDdXJyZW50U2NoZW1lKCk6IHN0cmluZyB8IG51bGwge1xuICByZXR1cm4gKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyAmJiBzZWxmLmxvY2F0aW9uPy5wcm90b2NvbCkgfHwgbnVsbDtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBpc0Jyb3dzZXJFeHRlbnNpb24gfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5pbXBvcnQgeyBfaXNIdHRwT3JIdHRwcyB9IGZyb20gJy4vbG9jYXRpb24nO1xuXG4vKipcbiAqIERldGVybWluZSB3aGV0aGVyIHRoZSBicm93c2VyIGlzIHdvcmtpbmcgb25saW5lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfaXNPbmxpbmUoKTogYm9vbGVhbiB7XG4gIGlmIChcbiAgICB0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIG5hdmlnYXRvciAmJlxuICAgICdvbkxpbmUnIGluIG5hdmlnYXRvciAmJlxuICAgIHR5cGVvZiBuYXZpZ2F0b3Iub25MaW5lID09PSAnYm9vbGVhbicgJiZcbiAgICAvLyBBcHBseSBvbmx5IGZvciB0cmFkaXRpb25hbCB3ZWIgYXBwcyBhbmQgQ2hyb21lIGV4dGVuc2lvbnMuXG4gICAgLy8gVGhpcyBpcyBlc3BlY2lhbGx5IHRydWUgZm9yIENvcmRvdmEgYXBwcyB3aGljaCBoYXZlIHVucmVsaWFibGVcbiAgICAvLyBuYXZpZ2F0b3Iub25MaW5lIGJlaGF2aW9yIHVubGVzcyBjb3Jkb3ZhLXBsdWdpbi1uZXR3b3JrLWluZm9ybWF0aW9uIGlzXG4gICAgLy8gaW5zdGFsbGVkIHdoaWNoIG92ZXJ3cml0ZXMgdGhlIG5hdGl2ZSBuYXZpZ2F0b3Iub25MaW5lIHZhbHVlIGFuZFxuICAgIC8vIGRlZmluZXMgbmF2aWdhdG9yLmNvbm5lY3Rpb24uXG4gICAgKF9pc0h0dHBPckh0dHBzKCkgfHwgaXNCcm93c2VyRXh0ZW5zaW9uKCkgfHwgJ2Nvbm5lY3Rpb24nIGluIG5hdmlnYXRvcilcbiAgKSB7XG4gICAgcmV0dXJuIG5hdmlnYXRvci5vbkxpbmU7XG4gIH1cbiAgLy8gSWYgd2UgY2FuJ3QgZGV0ZXJtaW5lIHRoZSBzdGF0ZSwgYXNzdW1lIGl0IGlzIG9ubGluZS5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfZ2V0VXNlckxhbmd1YWdlKCk6IHN0cmluZyB8IG51bGwge1xuICBpZiAodHlwZW9mIG5hdmlnYXRvciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCBuYXZpZ2F0b3JMYW5ndWFnZTogTmF2aWdhdG9yTGFuZ3VhZ2UgPSBuYXZpZ2F0b3I7XG4gIHJldHVybiAoXG4gICAgLy8gTW9zdCByZWxpYWJsZSwgYnV0IG9ubHkgc3VwcG9ydGVkIGluIENocm9tZS9GaXJlZm94LlxuICAgIChuYXZpZ2F0b3JMYW5ndWFnZS5sYW5ndWFnZXMgJiYgbmF2aWdhdG9yTGFuZ3VhZ2UubGFuZ3VhZ2VzWzBdKSB8fFxuICAgIC8vIFN1cHBvcnRlZCBpbiBtb3N0IGJyb3dzZXJzLCBidXQgcmV0dXJucyB0aGUgbGFuZ3VhZ2Ugb2YgdGhlIGJyb3dzZXJcbiAgICAvLyBVSSwgbm90IHRoZSBsYW5ndWFnZSBzZXQgaW4gYnJvd3NlciBzZXR0aW5ncy5cbiAgICBuYXZpZ2F0b3JMYW5ndWFnZS5sYW5ndWFnZSB8fFxuICAgIC8vIENvdWxkbid0IGRldGVybWluZSBsYW5ndWFnZS5cbiAgICBudWxsXG4gICk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgaXNNb2JpbGVDb3Jkb3ZhLCBpc1JlYWN0TmF0aXZlIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuaW1wb3J0IHsgX2lzT25saW5lIH0gZnJvbSAnLi9uYXZpZ2F0b3InO1xuaW1wb3J0IHsgZGVidWdBc3NlcnQgfSBmcm9tICcuL2Fzc2VydCc7XG5cbmV4cG9ydCBjb25zdCBlbnVtIERlbGF5TWluIHtcbiAgT0ZGTElORSA9IDUwMDBcbn1cblxuLyoqXG4gKiBBIHN0cnVjdHVyZSB0byBoZWxwIHBpY2sgYmV0d2VlbiBhIHJhbmdlIG9mIGxvbmcgYW5kIHNob3J0IGRlbGF5IGR1cmF0aW9uc1xuICogZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGVudmlyb25tZW50LiBJbiBnZW5lcmFsLCB0aGUgbG9uZyBkZWxheSBpcyB1c2VkIGZvclxuICogbW9iaWxlIGVudmlyb25tZW50cyB3aGVyZWFzIHNob3J0IGRlbGF5cyBhcmUgdXNlZCBmb3IgZGVza3RvcCBlbnZpcm9ubWVudHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBEZWxheSB7XG4gIC8vIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgb2ZmbGluZSBkZWxheSB0aW1lb3V0IGluIG1zLlxuXG4gIHByaXZhdGUgcmVhZG9ubHkgaXNNb2JpbGU6IGJvb2xlYW47XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2hvcnREZWxheTogbnVtYmVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbG9uZ0RlbGF5OiBudW1iZXJcbiAgKSB7XG4gICAgLy8gSW50ZXJuYWwgZXJyb3Igd2hlbiBpbXByb3Blcmx5IGluaXRpYWxpemVkLlxuICAgIGRlYnVnQXNzZXJ0KFxuICAgICAgbG9uZ0RlbGF5ID4gc2hvcnREZWxheSxcbiAgICAgICdTaG9ydCBkZWxheSBzaG91bGQgYmUgbGVzcyB0aGFuIGxvbmcgZGVsYXkhJ1xuICAgICk7XG4gICAgdGhpcy5pc01vYmlsZSA9IGlzTW9iaWxlQ29yZG92YSgpIHx8IGlzUmVhY3ROYXRpdmUoKTtcbiAgfVxuXG4gIGdldCgpOiBudW1iZXIge1xuICAgIGlmICghX2lzT25saW5lKCkpIHtcbiAgICAgIC8vIFBpY2sgdGhlIHNob3J0ZXIgdGltZW91dC5cbiAgICAgIHJldHVybiBNYXRoLm1pbihEZWxheU1pbi5PRkZMSU5FLCB0aGlzLnNob3J0RGVsYXkpO1xuICAgIH1cbiAgICAvLyBJZiBydW5uaW5nIGluIGEgbW9iaWxlIGVudmlyb25tZW50LCByZXR1cm4gdGhlIGxvbmcgZGVsYXksIG90aGVyd2lzZVxuICAgIC8vIHJldHVybiB0aGUgc2hvcnQgZGVsYXkuXG4gICAgLy8gVGhpcyBjb3VsZCBiZSBpbXByb3ZlZCBpbiB0aGUgZnV0dXJlIHRvIGR5bmFtaWNhbGx5IGNoYW5nZSBiYXNlZCBvbiBvdGhlclxuICAgIC8vIHZhcmlhYmxlcyBpbnN0ZWFkIG9mIGp1c3QgcmVhZGluZyB0aGUgY3VycmVudCBlbnZpcm9ubWVudC5cbiAgICByZXR1cm4gdGhpcy5pc01vYmlsZSA/IHRoaXMubG9uZ0RlbGF5IDogdGhpcy5zaG9ydERlbGF5O1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgQ29uZmlnSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC9hdXRoJztcbmltcG9ydCB7IGRlYnVnQXNzZXJ0IH0gZnJvbSAnLi9hc3NlcnQnO1xuXG5leHBvcnQgZnVuY3Rpb24gX2VtdWxhdG9yVXJsKGNvbmZpZzogQ29uZmlnSW50ZXJuYWwsIHBhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICBkZWJ1Z0Fzc2VydChjb25maWcuZW11bGF0b3IsICdFbXVsYXRvciBzaG91bGQgYWx3YXlzIGJlIHNldCBoZXJlJyk7XG4gIGNvbnN0IHsgdXJsIH0gPSBjb25maWcuZW11bGF0b3I7XG5cbiAgaWYgKCFwYXRoKSB7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxuXG4gIHJldHVybiBgJHt1cmx9JHtwYXRoLnN0YXJ0c1dpdGgoJy8nKSA/IHBhdGguc2xpY2UoMSkgOiBwYXRofWA7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgZGVidWdGYWlsIH0gZnJvbSAnLi9hc3NlcnQnO1xuXG5leHBvcnQgY2xhc3MgRmV0Y2hQcm92aWRlciB7XG4gIHByaXZhdGUgc3RhdGljIGZldGNoSW1wbDogdHlwZW9mIGZldGNoIHwgbnVsbDtcbiAgcHJpdmF0ZSBzdGF0aWMgaGVhZGVyc0ltcGw6IHR5cGVvZiBIZWFkZXJzIHwgbnVsbDtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVzcG9uc2VJbXBsOiB0eXBlb2YgUmVzcG9uc2UgfCBudWxsO1xuXG4gIHN0YXRpYyBpbml0aWFsaXplKFxuICAgIGZldGNoSW1wbDogdHlwZW9mIGZldGNoLFxuICAgIGhlYWRlcnNJbXBsPzogdHlwZW9mIEhlYWRlcnMsXG4gICAgcmVzcG9uc2VJbXBsPzogdHlwZW9mIFJlc3BvbnNlXG4gICk6IHZvaWQge1xuICAgIHRoaXMuZmV0Y2hJbXBsID0gZmV0Y2hJbXBsO1xuICAgIGlmIChoZWFkZXJzSW1wbCkge1xuICAgICAgdGhpcy5oZWFkZXJzSW1wbCA9IGhlYWRlcnNJbXBsO1xuICAgIH1cbiAgICBpZiAocmVzcG9uc2VJbXBsKSB7XG4gICAgICB0aGlzLnJlc3BvbnNlSW1wbCA9IHJlc3BvbnNlSW1wbDtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZmV0Y2goKTogdHlwZW9mIGZldGNoIHtcbiAgICBpZiAodGhpcy5mZXRjaEltcGwpIHtcbiAgICAgIHJldHVybiB0aGlzLmZldGNoSW1wbDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyAmJiAnZmV0Y2gnIGluIHNlbGYpIHtcbiAgICAgIHJldHVybiBzZWxmLmZldGNoO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnICYmIGdsb2JhbFRoaXMuZmV0Y2gpIHtcbiAgICAgIHJldHVybiBnbG9iYWxUaGlzLmZldGNoO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGZldGNoICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIGZldGNoO1xuICAgIH1cbiAgICBkZWJ1Z0ZhaWwoXG4gICAgICAnQ291bGQgbm90IGZpbmQgZmV0Y2ggaW1wbGVtZW50YXRpb24sIG1ha2Ugc3VyZSB5b3UgY2FsbCBGZXRjaFByb3ZpZGVyLmluaXRpYWxpemUoKSB3aXRoIGFuIGFwcHJvcHJpYXRlIHBvbHlmaWxsJ1xuICAgICk7XG4gIH1cblxuICBzdGF0aWMgaGVhZGVycygpOiB0eXBlb2YgSGVhZGVycyB7XG4gICAgaWYgKHRoaXMuaGVhZGVyc0ltcGwpIHtcbiAgICAgIHJldHVybiB0aGlzLmhlYWRlcnNJbXBsO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnICYmICdIZWFkZXJzJyBpbiBzZWxmKSB7XG4gICAgICByZXR1cm4gc2VsZi5IZWFkZXJzO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnICYmIGdsb2JhbFRoaXMuSGVhZGVycykge1xuICAgICAgcmV0dXJuIGdsb2JhbFRoaXMuSGVhZGVycztcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBIZWFkZXJzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIEhlYWRlcnM7XG4gICAgfVxuICAgIGRlYnVnRmFpbChcbiAgICAgICdDb3VsZCBub3QgZmluZCBIZWFkZXJzIGltcGxlbWVudGF0aW9uLCBtYWtlIHN1cmUgeW91IGNhbGwgRmV0Y2hQcm92aWRlci5pbml0aWFsaXplKCkgd2l0aCBhbiBhcHByb3ByaWF0ZSBwb2x5ZmlsbCdcbiAgICApO1xuICB9XG5cbiAgc3RhdGljIHJlc3BvbnNlKCk6IHR5cGVvZiBSZXNwb25zZSB7XG4gICAgaWYgKHRoaXMucmVzcG9uc2VJbXBsKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXNwb25zZUltcGw7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgJiYgJ1Jlc3BvbnNlJyBpbiBzZWxmKSB7XG4gICAgICByZXR1cm4gc2VsZi5SZXNwb25zZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyAmJiBnbG9iYWxUaGlzLlJlc3BvbnNlKSB7XG4gICAgICByZXR1cm4gZ2xvYmFsVGhpcy5SZXNwb25zZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBSZXNwb25zZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBSZXNwb25zZTtcbiAgICB9XG4gICAgZGVidWdGYWlsKFxuICAgICAgJ0NvdWxkIG5vdCBmaW5kIFJlc3BvbnNlIGltcGxlbWVudGF0aW9uLCBtYWtlIHN1cmUgeW91IGNhbGwgRmV0Y2hQcm92aWRlci5pbml0aWFsaXplKCkgd2l0aCBhbiBhcHByb3ByaWF0ZSBwb2x5ZmlsbCdcbiAgICApO1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgQXV0aEVycm9yQ29kZSB9IGZyb20gJy4uL2NvcmUvZXJyb3JzJztcblxuLyoqXG4gKiBFcnJvcnMgdGhhdCBjYW4gYmUgcmV0dXJuZWQgYnkgdGhlIGJhY2tlbmRcbiAqL1xuZXhwb3J0IGNvbnN0IGVudW0gU2VydmVyRXJyb3Ige1xuICBBRE1JTl9PTkxZX09QRVJBVElPTiA9ICdBRE1JTl9PTkxZX09QRVJBVElPTicsXG4gIEJMT0NLSU5HX0ZVTkNUSU9OX0VSUk9SX1JFU1BPTlNFID0gJ0JMT0NLSU5HX0ZVTkNUSU9OX0VSUk9SX1JFU1BPTlNFJyxcbiAgQ0FQVENIQV9DSEVDS19GQUlMRUQgPSAnQ0FQVENIQV9DSEVDS19GQUlMRUQnLFxuICBDT1JTX1VOU1VQUE9SVEVEID0gJ0NPUlNfVU5TVVBQT1JURUQnLFxuICBDUkVERU5USUFMX01JU01BVENIID0gJ0NSRURFTlRJQUxfTUlTTUFUQ0gnLFxuICBDUkVERU5USUFMX1RPT19PTERfTE9HSU5fQUdBSU4gPSAnQ1JFREVOVElBTF9UT09fT0xEX0xPR0lOX0FHQUlOJyxcbiAgRFlOQU1JQ19MSU5LX05PVF9BQ1RJVkFURUQgPSAnRFlOQU1JQ19MSU5LX05PVF9BQ1RJVkFURUQnLFxuICBFTUFJTF9DSEFOR0VfTkVFRFNfVkVSSUZJQ0FUSU9OID0gJ0VNQUlMX0NIQU5HRV9ORUVEU19WRVJJRklDQVRJT04nLFxuICBFTUFJTF9FWElTVFMgPSAnRU1BSUxfRVhJU1RTJyxcbiAgRU1BSUxfTk9UX0ZPVU5EID0gJ0VNQUlMX05PVF9GT1VORCcsXG4gIEVYUElSRURfT09CX0NPREUgPSAnRVhQSVJFRF9PT0JfQ09ERScsXG4gIEZFREVSQVRFRF9VU0VSX0lEX0FMUkVBRFlfTElOS0VEID0gJ0ZFREVSQVRFRF9VU0VSX0lEX0FMUkVBRFlfTElOS0VEJyxcbiAgSU5WQUxJRF9BUFBfQ1JFREVOVElBTCA9ICdJTlZBTElEX0FQUF9DUkVERU5USUFMJyxcbiAgSU5WQUxJRF9BUFBfSUQgPSAnSU5WQUxJRF9BUFBfSUQnLFxuICBJTlZBTElEX0NFUlRfSEFTSCA9ICdJTlZBTElEX0NFUlRfSEFTSCcsXG4gIElOVkFMSURfQ09ERSA9ICdJTlZBTElEX0NPREUnLFxuICBJTlZBTElEX0NPTlRJTlVFX1VSSSA9ICdJTlZBTElEX0NPTlRJTlVFX1VSSScsXG4gIElOVkFMSURfQ1VTVE9NX1RPS0VOID0gJ0lOVkFMSURfQ1VTVE9NX1RPS0VOJyxcbiAgSU5WQUxJRF9EWU5BTUlDX0xJTktfRE9NQUlOID0gJ0lOVkFMSURfRFlOQU1JQ19MSU5LX0RPTUFJTicsXG4gIElOVkFMSURfRU1BSUwgPSAnSU5WQUxJRF9FTUFJTCcsXG4gIElOVkFMSURfSURfVE9LRU4gPSAnSU5WQUxJRF9JRF9UT0tFTicsXG4gIElOVkFMSURfSURQX1JFU1BPTlNFID0gJ0lOVkFMSURfSURQX1JFU1BPTlNFJyxcbiAgSU5WQUxJRF9JREVOVElGSUVSID0gJ0lOVkFMSURfSURFTlRJRklFUicsXG4gIElOVkFMSURfTUVTU0FHRV9QQVlMT0FEID0gJ0lOVkFMSURfTUVTU0FHRV9QQVlMT0FEJyxcbiAgSU5WQUxJRF9NRkFfUEVORElOR19DUkVERU5USUFMID0gJ0lOVkFMSURfTUZBX1BFTkRJTkdfQ1JFREVOVElBTCcsXG4gIElOVkFMSURfT0FVVEhfQ0xJRU5UX0lEID0gJ0lOVkFMSURfT0FVVEhfQ0xJRU5UX0lEJyxcbiAgSU5WQUxJRF9PT0JfQ09ERSA9ICdJTlZBTElEX09PQl9DT0RFJyxcbiAgSU5WQUxJRF9QQVNTV09SRCA9ICdJTlZBTElEX1BBU1NXT1JEJyxcbiAgSU5WQUxJRF9QRU5ESU5HX1RPS0VOID0gJ0lOVkFMSURfUEVORElOR19UT0tFTicsXG4gIElOVkFMSURfUEhPTkVfTlVNQkVSID0gJ0lOVkFMSURfUEhPTkVfTlVNQkVSJyxcbiAgSU5WQUxJRF9QUk9WSURFUl9JRCA9ICdJTlZBTElEX1BST1ZJREVSX0lEJyxcbiAgSU5WQUxJRF9SRUNJUElFTlRfRU1BSUwgPSAnSU5WQUxJRF9SRUNJUElFTlRfRU1BSUwnLFxuICBJTlZBTElEX1NFTkRFUiA9ICdJTlZBTElEX1NFTkRFUicsXG4gIElOVkFMSURfU0VTU0lPTl9JTkZPID0gJ0lOVkFMSURfU0VTU0lPTl9JTkZPJyxcbiAgSU5WQUxJRF9URU1QT1JBUllfUFJPT0YgPSAnSU5WQUxJRF9URU1QT1JBUllfUFJPT0YnLFxuICBJTlZBTElEX1RFTkFOVF9JRCA9ICdJTlZBTElEX1RFTkFOVF9JRCcsXG4gIE1GQV9FTlJPTExNRU5UX05PVF9GT1VORCA9ICdNRkFfRU5ST0xMTUVOVF9OT1RfRk9VTkQnLFxuICBNSVNTSU5HX0FORFJPSURfUEFDS0FHRV9OQU1FID0gJ01JU1NJTkdfQU5EUk9JRF9QQUNLQUdFX05BTUUnLFxuICBNSVNTSU5HX0FQUF9DUkVERU5USUFMID0gJ01JU1NJTkdfQVBQX0NSRURFTlRJQUwnLFxuICBNSVNTSU5HX0NPREUgPSAnTUlTU0lOR19DT0RFJyxcbiAgTUlTU0lOR19DT05USU5VRV9VUkkgPSAnTUlTU0lOR19DT05USU5VRV9VUkknLFxuICBNSVNTSU5HX0NVU1RPTV9UT0tFTiA9ICdNSVNTSU5HX0NVU1RPTV9UT0tFTicsXG4gIE1JU1NJTkdfSU9TX0JVTkRMRV9JRCA9ICdNSVNTSU5HX0lPU19CVU5ETEVfSUQnLFxuICBNSVNTSU5HX01GQV9FTlJPTExNRU5UX0lEID0gJ01JU1NJTkdfTUZBX0VOUk9MTE1FTlRfSUQnLFxuICBNSVNTSU5HX01GQV9QRU5ESU5HX0NSRURFTlRJQUwgPSAnTUlTU0lOR19NRkFfUEVORElOR19DUkVERU5USUFMJyxcbiAgTUlTU0lOR19PT0JfQ09ERSA9ICdNSVNTSU5HX09PQl9DT0RFJyxcbiAgTUlTU0lOR19PUl9JTlZBTElEX05PTkNFID0gJ01JU1NJTkdfT1JfSU5WQUxJRF9OT05DRScsXG4gIE1JU1NJTkdfUEFTU1dPUkQgPSAnTUlTU0lOR19QQVNTV09SRCcsXG4gIE1JU1NJTkdfUkVRX1RZUEUgPSAnTUlTU0lOR19SRVFfVFlQRScsXG4gIE1JU1NJTkdfUEhPTkVfTlVNQkVSID0gJ01JU1NJTkdfUEhPTkVfTlVNQkVSJyxcbiAgTUlTU0lOR19TRVNTSU9OX0lORk8gPSAnTUlTU0lOR19TRVNTSU9OX0lORk8nLFxuICBPUEVSQVRJT05fTk9UX0FMTE9XRUQgPSAnT1BFUkFUSU9OX05PVF9BTExPV0VEJyxcbiAgUEFTU1dPUkRfTE9HSU5fRElTQUJMRUQgPSAnUEFTU1dPUkRfTE9HSU5fRElTQUJMRUQnLFxuICBRVU9UQV9FWENFRURFRCA9ICdRVU9UQV9FWENFRURFRCcsXG4gIFJFU0VUX1BBU1NXT1JEX0VYQ0VFRF9MSU1JVCA9ICdSRVNFVF9QQVNTV09SRF9FWENFRURfTElNSVQnLFxuICBSRUpFQ1RFRF9DUkVERU5USUFMID0gJ1JFSkVDVEVEX0NSRURFTlRJQUwnLFxuICBTRUNPTkRfRkFDVE9SX0VYSVNUUyA9ICdTRUNPTkRfRkFDVE9SX0VYSVNUUycsXG4gIFNFQ09ORF9GQUNUT1JfTElNSVRfRVhDRUVERUQgPSAnU0VDT05EX0ZBQ1RPUl9MSU1JVF9FWENFRURFRCcsXG4gIFNFU1NJT05fRVhQSVJFRCA9ICdTRVNTSU9OX0VYUElSRUQnLFxuICBURU5BTlRfSURfTUlTTUFUQ0ggPSAnVEVOQU5UX0lEX01JU01BVENIJyxcbiAgVE9LRU5fRVhQSVJFRCA9ICdUT0tFTl9FWFBJUkVEJyxcbiAgVE9PX01BTllfQVRURU1QVFNfVFJZX0xBVEVSID0gJ1RPT19NQU5ZX0FUVEVNUFRTX1RSWV9MQVRFUicsXG4gIFVOU1VQUE9SVEVEX0ZJUlNUX0ZBQ1RPUiA9ICdVTlNVUFBPUlRFRF9GSVJTVF9GQUNUT1InLFxuICBVTlNVUFBPUlRFRF9URU5BTlRfT1BFUkFUSU9OID0gJ1VOU1VQUE9SVEVEX1RFTkFOVF9PUEVSQVRJT04nLFxuICBVTkFVVEhPUklaRURfRE9NQUlOID0gJ1VOQVVUSE9SSVpFRF9ET01BSU4nLFxuICBVTlZFUklGSUVEX0VNQUlMID0gJ1VOVkVSSUZJRURfRU1BSUwnLFxuICBVU0VSX0NBTkNFTExFRCA9ICdVU0VSX0NBTkNFTExFRCcsXG4gIFVTRVJfRElTQUJMRUQgPSAnVVNFUl9ESVNBQkxFRCcsXG4gIFVTRVJfTk9UX0ZPVU5EID0gJ1VTRVJfTk9UX0ZPVU5EJyxcbiAgV0VBS19QQVNTV09SRCA9ICdXRUFLX1BBU1NXT1JEJyxcbiAgUkVDQVBUQ0hBX05PVF9FTkFCTEVEID0gJ1JFQ0FQVENIQV9OT1RfRU5BQkxFRCcsXG4gIE1JU1NJTkdfUkVDQVBUQ0hBX1RPS0VOID0gJ01JU1NJTkdfUkVDQVBUQ0hBX1RPS0VOJyxcbiAgSU5WQUxJRF9SRUNBUFRDSEFfVE9LRU4gPSAnSU5WQUxJRF9SRUNBUFRDSEFfVE9LRU4nLFxuICBJTlZBTElEX1JFQ0FQVENIQV9BQ1RJT04gPSAnSU5WQUxJRF9SRUNBUFRDSEFfQUNUSU9OJyxcbiAgTUlTU0lOR19DTElFTlRfVFlQRSA9ICdNSVNTSU5HX0NMSUVOVF9UWVBFJyxcbiAgTUlTU0lOR19SRUNBUFRDSEFfVkVSU0lPTiA9ICdNSVNTSU5HX1JFQ0FQVENIQV9WRVJTSU9OJyxcbiAgSU5WQUxJRF9SRUNBUFRDSEFfVkVSU0lPTiA9ICdJTlZBTElEX1JFQ0FQVENIQV9WRVJTSU9OJyxcbiAgSU5WQUxJRF9SRVFfVFlQRSA9ICdJTlZBTElEX1JFUV9UWVBFJyxcbiAgUEFTU1dPUkRfRE9FU19OT1RfTUVFVF9SRVFVSVJFTUVOVFMgPSAnUEFTU1dPUkRfRE9FU19OT1RfTUVFVF9SRVFVSVJFTUVOVFMnXG59XG5cbi8qKlxuICogQVBJIFJlc3BvbnNlIGluIHRoZSBldmVudCBvZiBhbiBlcnJvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpzb25FcnJvciB7XG4gIGVycm9yOiB7XG4gICAgY29kZTogbnVtYmVyO1xuICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICBlcnJvcnM/OiBbXG4gICAgICB7XG4gICAgICAgIG1lc3NhZ2U6IFNlcnZlckVycm9yO1xuICAgICAgICBkb21haW46IHN0cmluZztcbiAgICAgICAgcmVhc29uOiBzdHJpbmc7XG4gICAgICB9XG4gICAgXTtcbiAgfTtcbn1cblxuLyoqXG4gKiBUeXBlIGRlZmluaXRpb24gZm9yIGEgbWFwIGZyb20gc2VydmVyIGVycm9ycyB0byBkZXZlbG9wZXIgdmlzaWJsZSBlcnJvcnNcbiAqL1xuZXhwb3J0IGRlY2xhcmUgdHlwZSBTZXJ2ZXJFcnJvck1hcDxBcGlFcnJvciBleHRlbmRzIHN0cmluZz4gPSB7XG4gIHJlYWRvbmx5IFtLIGluIEFwaUVycm9yXTogQXV0aEVycm9yQ29kZTtcbn07XG5cbi8qKlxuICogTWFwIGZyb20gZXJyb3JzIHJldHVybmVkIGJ5IHRoZSBzZXJ2ZXIgdG8gZXJyb3JzIHRvIGRldmVsb3BlciB2aXNpYmxlIGVycm9yc1xuICovXG5leHBvcnQgY29uc3QgU0VSVkVSX0VSUk9SX01BUDogUGFydGlhbDxTZXJ2ZXJFcnJvck1hcDxTZXJ2ZXJFcnJvcj4+ID0ge1xuICAvLyBDdXN0b20gdG9rZW4gZXJyb3JzLlxuICBbU2VydmVyRXJyb3IuQ1JFREVOVElBTF9NSVNNQVRDSF06IEF1dGhFcnJvckNvZGUuQ1JFREVOVElBTF9NSVNNQVRDSCxcbiAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW4gaWYgdGhlIFNESyBzZW5kcyBhIGJhZCByZXF1ZXN0LlxuICBbU2VydmVyRXJyb3IuTUlTU0lOR19DVVNUT01fVE9LRU5dOiBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SLFxuXG4gIC8vIENyZWF0ZSBBdXRoIFVSSSBlcnJvcnMuXG4gIFtTZXJ2ZXJFcnJvci5JTlZBTElEX0lERU5USUZJRVJdOiBBdXRoRXJyb3JDb2RlLklOVkFMSURfRU1BSUwsXG4gIC8vIFRoaXMgY2FuIG9ubHkgaGFwcGVuIGlmIHRoZSBTREsgc2VuZHMgYSBiYWQgcmVxdWVzdC5cbiAgW1NlcnZlckVycm9yLk1JU1NJTkdfQ09OVElOVUVfVVJJXTogQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUixcblxuICAvLyBTaWduIGluIHdpdGggZW1haWwgYW5kIHBhc3N3b3JkIGVycm9ycyAoc29tZSBhcHBseSB0byBzaWduIHVwIHRvbykuXG4gIFtTZXJ2ZXJFcnJvci5JTlZBTElEX1BBU1NXT1JEXTogQXV0aEVycm9yQ29kZS5JTlZBTElEX1BBU1NXT1JELFxuICAvLyBUaGlzIGNhbiBvbmx5IGhhcHBlbiBpZiB0aGUgU0RLIHNlbmRzIGEgYmFkIHJlcXVlc3QuXG4gIFtTZXJ2ZXJFcnJvci5NSVNTSU5HX1BBU1NXT1JEXTogQXV0aEVycm9yQ29kZS5NSVNTSU5HX1BBU1NXT1JELFxuXG4gIC8vIFNpZ24gdXAgd2l0aCBlbWFpbCBhbmQgcGFzc3dvcmQgZXJyb3JzLlxuICBbU2VydmVyRXJyb3IuRU1BSUxfRVhJU1RTXTogQXV0aEVycm9yQ29kZS5FTUFJTF9FWElTVFMsXG4gIFtTZXJ2ZXJFcnJvci5QQVNTV09SRF9MT0dJTl9ESVNBQkxFRF06IEF1dGhFcnJvckNvZGUuT1BFUkFUSU9OX05PVF9BTExPV0VELFxuXG4gIC8vIFZlcmlmeSBhc3NlcnRpb24gZm9yIHNpZ24gaW4gd2l0aCBjcmVkZW50aWFsIGVycm9yczpcbiAgW1NlcnZlckVycm9yLklOVkFMSURfSURQX1JFU1BPTlNFXTogQXV0aEVycm9yQ29kZS5JTlZBTElEX0lEUF9SRVNQT05TRSxcbiAgW1NlcnZlckVycm9yLklOVkFMSURfUEVORElOR19UT0tFTl06IEF1dGhFcnJvckNvZGUuSU5WQUxJRF9JRFBfUkVTUE9OU0UsXG4gIFtTZXJ2ZXJFcnJvci5GRURFUkFURURfVVNFUl9JRF9BTFJFQURZX0xJTktFRF06XG4gICAgQXV0aEVycm9yQ29kZS5DUkVERU5USUFMX0FMUkVBRFlfSU5fVVNFLFxuXG4gIC8vIFRoaXMgY2FuIG9ubHkgaGFwcGVuIGlmIHRoZSBTREsgc2VuZHMgYSBiYWQgcmVxdWVzdC5cbiAgW1NlcnZlckVycm9yLk1JU1NJTkdfUkVRX1RZUEVdOiBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SLFxuXG4gIC8vIFNlbmQgUGFzc3dvcmQgcmVzZXQgZW1haWwgZXJyb3JzOlxuICBbU2VydmVyRXJyb3IuRU1BSUxfTk9UX0ZPVU5EXTogQXV0aEVycm9yQ29kZS5VU0VSX0RFTEVURUQsXG4gIFtTZXJ2ZXJFcnJvci5SRVNFVF9QQVNTV09SRF9FWENFRURfTElNSVRdOlxuICAgIEF1dGhFcnJvckNvZGUuVE9PX01BTllfQVRURU1QVFNfVFJZX0xBVEVSLFxuXG4gIFtTZXJ2ZXJFcnJvci5FWFBJUkVEX09PQl9DT0RFXTogQXV0aEVycm9yQ29kZS5FWFBJUkVEX09PQl9DT0RFLFxuICBbU2VydmVyRXJyb3IuSU5WQUxJRF9PT0JfQ09ERV06IEF1dGhFcnJvckNvZGUuSU5WQUxJRF9PT0JfQ09ERSxcbiAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW4gaWYgdGhlIFNESyBzZW5kcyBhIGJhZCByZXF1ZXN0LlxuICBbU2VydmVyRXJyb3IuTUlTU0lOR19PT0JfQ09ERV06IEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IsXG5cbiAgLy8gT3BlcmF0aW9ucyB0aGF0IHJlcXVpcmUgSUQgdG9rZW4gaW4gcmVxdWVzdDpcbiAgW1NlcnZlckVycm9yLkNSRURFTlRJQUxfVE9PX09MRF9MT0dJTl9BR0FJTl06XG4gICAgQXV0aEVycm9yQ29kZS5DUkVERU5USUFMX1RPT19PTERfTE9HSU5fQUdBSU4sXG4gIFtTZXJ2ZXJFcnJvci5JTlZBTElEX0lEX1RPS0VOXTogQXV0aEVycm9yQ29kZS5JTlZBTElEX0FVVEgsXG4gIFtTZXJ2ZXJFcnJvci5UT0tFTl9FWFBJUkVEXTogQXV0aEVycm9yQ29kZS5UT0tFTl9FWFBJUkVELFxuICBbU2VydmVyRXJyb3IuVVNFUl9OT1RfRk9VTkRdOiBBdXRoRXJyb3JDb2RlLlRPS0VOX0VYUElSRUQsXG5cbiAgLy8gT3RoZXIgZXJyb3JzLlxuICBbU2VydmVyRXJyb3IuVE9PX01BTllfQVRURU1QVFNfVFJZX0xBVEVSXTpcbiAgICBBdXRoRXJyb3JDb2RlLlRPT19NQU5ZX0FUVEVNUFRTX1RSWV9MQVRFUixcbiAgW1NlcnZlckVycm9yLlBBU1NXT1JEX0RPRVNfTk9UX01FRVRfUkVRVUlSRU1FTlRTXTpcbiAgICBBdXRoRXJyb3JDb2RlLlBBU1NXT1JEX0RPRVNfTk9UX01FRVRfUkVRVUlSRU1FTlRTLFxuXG4gIC8vIFBob25lIEF1dGggcmVsYXRlZCBlcnJvcnMuXG4gIFtTZXJ2ZXJFcnJvci5JTlZBTElEX0NPREVdOiBBdXRoRXJyb3JDb2RlLklOVkFMSURfQ09ERSxcbiAgW1NlcnZlckVycm9yLklOVkFMSURfU0VTU0lPTl9JTkZPXTogQXV0aEVycm9yQ29kZS5JTlZBTElEX1NFU1NJT05fSU5GTyxcbiAgW1NlcnZlckVycm9yLklOVkFMSURfVEVNUE9SQVJZX1BST09GXTogQXV0aEVycm9yQ29kZS5JTlZBTElEX0lEUF9SRVNQT05TRSxcbiAgW1NlcnZlckVycm9yLk1JU1NJTkdfU0VTU0lPTl9JTkZPXTogQXV0aEVycm9yQ29kZS5NSVNTSU5HX1NFU1NJT05fSU5GTyxcbiAgW1NlcnZlckVycm9yLlNFU1NJT05fRVhQSVJFRF06IEF1dGhFcnJvckNvZGUuQ09ERV9FWFBJUkVELFxuXG4gIC8vIE90aGVyIGFjdGlvbiBjb2RlIGVycm9ycyB3aGVuIGFkZGl0aW9uYWwgc2V0dGluZ3MgcGFzc2VkLlxuICAvLyBNSVNTSU5HX0NPTlRJTlVFX1VSSSBpcyBnZXR0aW5nIG1hcHBlZCB0byBJTlRFUk5BTF9FUlJPUiBhYm92ZS5cbiAgLy8gVGhpcyBpcyBPSyBhcyB0aGlzIGVycm9yIHdpbGwgYmUgY2F1Z2h0IGJ5IGNsaWVudCBzaWRlIHZhbGlkYXRpb24uXG4gIFtTZXJ2ZXJFcnJvci5NSVNTSU5HX0FORFJPSURfUEFDS0FHRV9OQU1FXTpcbiAgICBBdXRoRXJyb3JDb2RlLk1JU1NJTkdfQU5EUk9JRF9QQUNLQUdFX05BTUUsXG4gIFtTZXJ2ZXJFcnJvci5VTkFVVEhPUklaRURfRE9NQUlOXTogQXV0aEVycm9yQ29kZS5VTkFVVEhPUklaRURfRE9NQUlOLFxuXG4gIC8vIGdldFByb2plY3RDb25maWcgZXJyb3JzIHdoZW4gY2xpZW50SWQgaXMgcGFzc2VkLlxuICBbU2VydmVyRXJyb3IuSU5WQUxJRF9PQVVUSF9DTElFTlRfSURdOiBBdXRoRXJyb3JDb2RlLklOVkFMSURfT0FVVEhfQ0xJRU5UX0lELFxuXG4gIC8vIFVzZXIgYWN0aW9ucyAoc2lnbi11cCBvciBkZWxldGlvbikgZGlzYWJsZWQgZXJyb3JzLlxuICBbU2VydmVyRXJyb3IuQURNSU5fT05MWV9PUEVSQVRJT05dOiBBdXRoRXJyb3JDb2RlLkFETUlOX09OTFlfT1BFUkFUSU9OLFxuXG4gIC8vIE11bHRpIGZhY3RvciByZWxhdGVkIGVycm9ycy5cbiAgW1NlcnZlckVycm9yLklOVkFMSURfTUZBX1BFTkRJTkdfQ1JFREVOVElBTF06XG4gICAgQXV0aEVycm9yQ29kZS5JTlZBTElEX01GQV9TRVNTSU9OLFxuICBbU2VydmVyRXJyb3IuTUZBX0VOUk9MTE1FTlRfTk9UX0ZPVU5EXTogQXV0aEVycm9yQ29kZS5NRkFfSU5GT19OT1RfRk9VTkQsXG4gIFtTZXJ2ZXJFcnJvci5NSVNTSU5HX01GQV9FTlJPTExNRU5UX0lEXTogQXV0aEVycm9yQ29kZS5NSVNTSU5HX01GQV9JTkZPLFxuICBbU2VydmVyRXJyb3IuTUlTU0lOR19NRkFfUEVORElOR19DUkVERU5USUFMXTpcbiAgICBBdXRoRXJyb3JDb2RlLk1JU1NJTkdfTUZBX1NFU1NJT04sXG4gIFtTZXJ2ZXJFcnJvci5TRUNPTkRfRkFDVE9SX0VYSVNUU106XG4gICAgQXV0aEVycm9yQ29kZS5TRUNPTkRfRkFDVE9SX0FMUkVBRFlfRU5ST0xMRUQsXG4gIFtTZXJ2ZXJFcnJvci5TRUNPTkRfRkFDVE9SX0xJTUlUX0VYQ0VFREVEXTpcbiAgICBBdXRoRXJyb3JDb2RlLlNFQ09ORF9GQUNUT1JfTElNSVRfRVhDRUVERUQsXG5cbiAgLy8gQmxvY2tpbmcgZnVuY3Rpb25zIHJlbGF0ZWQgZXJyb3JzLlxuICBbU2VydmVyRXJyb3IuQkxPQ0tJTkdfRlVOQ1RJT05fRVJST1JfUkVTUE9OU0VdOiBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SLFxuXG4gIC8vIFJlY2FwdGNoYSByZWxhdGVkIGVycm9ycy5cbiAgW1NlcnZlckVycm9yLlJFQ0FQVENIQV9OT1RfRU5BQkxFRF06IEF1dGhFcnJvckNvZGUuUkVDQVBUQ0hBX05PVF9FTkFCTEVELFxuICBbU2VydmVyRXJyb3IuTUlTU0lOR19SRUNBUFRDSEFfVE9LRU5dOiBBdXRoRXJyb3JDb2RlLk1JU1NJTkdfUkVDQVBUQ0hBX1RPS0VOLFxuICBbU2VydmVyRXJyb3IuSU5WQUxJRF9SRUNBUFRDSEFfVE9LRU5dOiBBdXRoRXJyb3JDb2RlLklOVkFMSURfUkVDQVBUQ0hBX1RPS0VOLFxuICBbU2VydmVyRXJyb3IuSU5WQUxJRF9SRUNBUFRDSEFfQUNUSU9OXTpcbiAgICBBdXRoRXJyb3JDb2RlLklOVkFMSURfUkVDQVBUQ0hBX0FDVElPTixcbiAgW1NlcnZlckVycm9yLk1JU1NJTkdfQ0xJRU5UX1RZUEVdOiBBdXRoRXJyb3JDb2RlLk1JU1NJTkdfQ0xJRU5UX1RZUEUsXG4gIFtTZXJ2ZXJFcnJvci5NSVNTSU5HX1JFQ0FQVENIQV9WRVJTSU9OXTpcbiAgICBBdXRoRXJyb3JDb2RlLk1JU1NJTkdfUkVDQVBUQ0hBX1ZFUlNJT04sXG4gIFtTZXJ2ZXJFcnJvci5JTlZBTElEX1JFQ0FQVENIQV9WRVJTSU9OXTpcbiAgICBBdXRoRXJyb3JDb2RlLklOVkFMSURfUkVDQVBUQ0hBX1ZFUlNJT04sXG4gIFtTZXJ2ZXJFcnJvci5JTlZBTElEX1JFUV9UWVBFXTogQXV0aEVycm9yQ29kZS5JTlZBTElEX1JFUV9UWVBFXG59O1xuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEZpcmViYXNlRXJyb3IsIHF1ZXJ5c3RyaW5nIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuXG5pbXBvcnQgeyBBdXRoRXJyb3JDb2RlLCBOYW1lZEVycm9yUGFyYW1zIH0gZnJvbSAnLi4vY29yZS9lcnJvcnMnO1xuaW1wb3J0IHtcbiAgX2NyZWF0ZUVycm9yLFxuICBfZXJyb3JXaXRoQ3VzdG9tTWVzc2FnZSxcbiAgX2ZhaWxcbn0gZnJvbSAnLi4vY29yZS91dGlsL2Fzc2VydCc7XG5pbXBvcnQgeyBEZWxheSB9IGZyb20gJy4uL2NvcmUvdXRpbC9kZWxheSc7XG5pbXBvcnQgeyBfZW11bGF0b3JVcmwgfSBmcm9tICcuLi9jb3JlL3V0aWwvZW11bGF0b3InO1xuaW1wb3J0IHsgRmV0Y2hQcm92aWRlciB9IGZyb20gJy4uL2NvcmUvdXRpbC9mZXRjaF9wcm92aWRlcic7XG5pbXBvcnQgeyBBdXRoIH0gZnJvbSAnLi4vbW9kZWwvcHVibGljX3R5cGVzJztcbmltcG9ydCB7IEF1dGhJbnRlcm5hbCwgQ29uZmlnSW50ZXJuYWwgfSBmcm9tICcuLi9tb2RlbC9hdXRoJztcbmltcG9ydCB7IElkVG9rZW5SZXNwb25zZSwgVGFnZ2VkV2l0aFRva2VuUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbC9pZF90b2tlbic7XG5pbXBvcnQgeyBJZFRva2VuTWZhUmVzcG9uc2UgfSBmcm9tICcuL2F1dGhlbnRpY2F0aW9uL21mYSc7XG5pbXBvcnQgeyBTRVJWRVJfRVJST1JfTUFQLCBTZXJ2ZXJFcnJvciwgU2VydmVyRXJyb3JNYXAgfSBmcm9tICcuL2Vycm9ycyc7XG5cbmV4cG9ydCBjb25zdCBlbnVtIEh0dHBNZXRob2Qge1xuICBQT1NUID0gJ1BPU1QnLFxuICBHRVQgPSAnR0VUJ1xufVxuXG5leHBvcnQgY29uc3QgZW51bSBIdHRwSGVhZGVyIHtcbiAgQ09OVEVOVF9UWVBFID0gJ0NvbnRlbnQtVHlwZScsXG4gIFhfRklSRUJBU0VfTE9DQUxFID0gJ1gtRmlyZWJhc2UtTG9jYWxlJyxcbiAgWF9DTElFTlRfVkVSU0lPTiA9ICdYLUNsaWVudC1WZXJzaW9uJyxcbiAgWF9GSVJFQkFTRV9HTVBJRCA9ICdYLUZpcmViYXNlLWdtcGlkJyxcbiAgWF9GSVJFQkFTRV9DTElFTlQgPSAnWC1GaXJlYmFzZS1DbGllbnQnLFxuICBYX0ZJUkVCQVNFX0FQUF9DSEVDSyA9ICdYLUZpcmViYXNlLUFwcENoZWNrJ1xufVxuXG5leHBvcnQgY29uc3QgZW51bSBFbmRwb2ludCB7XG4gIENSRUFURV9BVVRIX1VSSSA9ICcvdjEvYWNjb3VudHM6Y3JlYXRlQXV0aFVyaScsXG4gIERFTEVURV9BQ0NPVU5UID0gJy92MS9hY2NvdW50czpkZWxldGUnLFxuICBSRVNFVF9QQVNTV09SRCA9ICcvdjEvYWNjb3VudHM6cmVzZXRQYXNzd29yZCcsXG4gIFNJR05fVVAgPSAnL3YxL2FjY291bnRzOnNpZ25VcCcsXG4gIFNJR05fSU5fV0lUSF9DVVNUT01fVE9LRU4gPSAnL3YxL2FjY291bnRzOnNpZ25JbldpdGhDdXN0b21Ub2tlbicsXG4gIFNJR05fSU5fV0lUSF9FTUFJTF9MSU5LID0gJy92MS9hY2NvdW50czpzaWduSW5XaXRoRW1haWxMaW5rJyxcbiAgU0lHTl9JTl9XSVRIX0lEUCA9ICcvdjEvYWNjb3VudHM6c2lnbkluV2l0aElkcCcsXG4gIFNJR05fSU5fV0lUSF9QQVNTV09SRCA9ICcvdjEvYWNjb3VudHM6c2lnbkluV2l0aFBhc3N3b3JkJyxcbiAgU0lHTl9JTl9XSVRIX1BIT05FX05VTUJFUiA9ICcvdjEvYWNjb3VudHM6c2lnbkluV2l0aFBob25lTnVtYmVyJyxcbiAgU0VORF9WRVJJRklDQVRJT05fQ09ERSA9ICcvdjEvYWNjb3VudHM6c2VuZFZlcmlmaWNhdGlvbkNvZGUnLFxuICBTRU5EX09PQl9DT0RFID0gJy92MS9hY2NvdW50czpzZW5kT29iQ29kZScsXG4gIFNFVF9BQ0NPVU5UX0lORk8gPSAnL3YxL2FjY291bnRzOnVwZGF0ZScsXG4gIEdFVF9BQ0NPVU5UX0lORk8gPSAnL3YxL2FjY291bnRzOmxvb2t1cCcsXG4gIEdFVF9SRUNBUFRDSEFfUEFSQU0gPSAnL3YxL3JlY2FwdGNoYVBhcmFtcycsXG4gIFNUQVJUX01GQV9FTlJPTExNRU5UID0gJy92Mi9hY2NvdW50cy9tZmFFbnJvbGxtZW50OnN0YXJ0JyxcbiAgRklOQUxJWkVfTUZBX0VOUk9MTE1FTlQgPSAnL3YyL2FjY291bnRzL21mYUVucm9sbG1lbnQ6ZmluYWxpemUnLFxuICBTVEFSVF9NRkFfU0lHTl9JTiA9ICcvdjIvYWNjb3VudHMvbWZhU2lnbkluOnN0YXJ0JyxcbiAgRklOQUxJWkVfTUZBX1NJR05fSU4gPSAnL3YyL2FjY291bnRzL21mYVNpZ25JbjpmaW5hbGl6ZScsXG4gIFdJVEhEUkFXX01GQSA9ICcvdjIvYWNjb3VudHMvbWZhRW5yb2xsbWVudDp3aXRoZHJhdycsXG4gIEdFVF9QUk9KRUNUX0NPTkZJRyA9ICcvdjEvcHJvamVjdHMnLFxuICBHRVRfUkVDQVBUQ0hBX0NPTkZJRyA9ICcvdjIvcmVjYXB0Y2hhQ29uZmlnJyxcbiAgR0VUX1BBU1NXT1JEX1BPTElDWSA9ICcvdjIvcGFzc3dvcmRQb2xpY3knXG59XG5cbmV4cG9ydCBjb25zdCBlbnVtIFJlY2FwdGNoYUNsaWVudFR5cGUge1xuICBXRUIgPSAnQ0xJRU5UX1RZUEVfV0VCJyxcbiAgQU5EUk9JRCA9ICdDTElFTlRfVFlQRV9BTkRST0lEJyxcbiAgSU9TID0gJ0NMSUVOVF9UWVBFX0lPUydcbn1cblxuZXhwb3J0IGNvbnN0IGVudW0gUmVjYXB0Y2hhVmVyc2lvbiB7XG4gIEVOVEVSUFJJU0UgPSAnUkVDQVBUQ0hBX0VOVEVSUFJJU0UnXG59XG5cbmV4cG9ydCBjb25zdCBlbnVtIFJlY2FwdGNoYUFjdGlvbk5hbWUge1xuICBTSUdOX0lOX1dJVEhfUEFTU1dPUkQgPSAnc2lnbkluV2l0aFBhc3N3b3JkJyxcbiAgR0VUX09PQl9DT0RFID0gJ2dldE9vYkNvZGUnLFxuICBTSUdOX1VQX1BBU1NXT1JEID0gJ3NpZ25VcFBhc3N3b3JkJ1xufVxuXG5leHBvcnQgY29uc3QgZW51bSBFbmZvcmNlbWVudFN0YXRlIHtcbiAgRU5GT1JDRSA9ICdFTkZPUkNFJyxcbiAgQVVESVQgPSAnQVVESVQnLFxuICBPRkYgPSAnT0ZGJyxcbiAgRU5GT1JDRU1FTlRfU1RBVEVfVU5TUEVDSUZJRUQgPSAnRU5GT1JDRU1FTlRfU1RBVEVfVU5TUEVDSUZJRUQnXG59XG5cbi8vIFByb3ZpZGVycyB0aGF0IGhhdmUgcmVDQVBUQ0hBIEVudGVycHJpc2Ugc3VwcG9ydC5cbmV4cG9ydCBjb25zdCBlbnVtIFJlY2FwdGNoYVByb3ZpZGVyIHtcbiAgRU1BSUxfUEFTU1dPUkRfUFJPVklERVIgPSAnRU1BSUxfUEFTU1dPUkRfUFJPVklERVInXG59XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0FQSV9USU1FT1VUX01TID0gbmV3IERlbGF5KDMwXzAwMCwgNjBfMDAwKTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9hZGRUaWRJZk5lY2Vzc2FyeTxUIGV4dGVuZHMgeyB0ZW5hbnRJZD86IHN0cmluZyB9PihcbiAgYXV0aDogQXV0aCxcbiAgcmVxdWVzdDogVFxuKTogVCB7XG4gIGlmIChhdXRoLnRlbmFudElkICYmICFyZXF1ZXN0LnRlbmFudElkKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnJlcXVlc3QsXG4gICAgICB0ZW5hbnRJZDogYXV0aC50ZW5hbnRJZFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHJlcXVlc3Q7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBfcGVyZm9ybUFwaVJlcXVlc3Q8VCwgVj4oXG4gIGF1dGg6IEF1dGgsXG4gIG1ldGhvZDogSHR0cE1ldGhvZCxcbiAgcGF0aDogRW5kcG9pbnQsXG4gIHJlcXVlc3Q/OiBULFxuICBjdXN0b21FcnJvck1hcDogUGFydGlhbDxTZXJ2ZXJFcnJvck1hcDxTZXJ2ZXJFcnJvcj4+ID0ge31cbik6IFByb21pc2U8Vj4ge1xuICByZXR1cm4gX3BlcmZvcm1GZXRjaFdpdGhFcnJvckhhbmRsaW5nKGF1dGgsIGN1c3RvbUVycm9yTWFwLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IGJvZHkgPSB7fTtcbiAgICBsZXQgcGFyYW1zID0ge307XG4gICAgaWYgKHJlcXVlc3QpIHtcbiAgICAgIGlmIChtZXRob2QgPT09IEh0dHBNZXRob2QuR0VUKSB7XG4gICAgICAgIHBhcmFtcyA9IHJlcXVlc3Q7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBib2R5ID0ge1xuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHJlcXVlc3QpXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnkgPSBxdWVyeXN0cmluZyh7XG4gICAgICBrZXk6IGF1dGguY29uZmlnLmFwaUtleSxcbiAgICAgIC4uLnBhcmFtc1xuICAgIH0pLnNsaWNlKDEpO1xuXG4gICAgY29uc3QgaGVhZGVycyA9IGF3YWl0IChhdXRoIGFzIEF1dGhJbnRlcm5hbCkuX2dldEFkZGl0aW9uYWxIZWFkZXJzKCk7XG4gICAgaGVhZGVyc1tIdHRwSGVhZGVyLkNPTlRFTlRfVFlQRV0gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICBpZiAoYXV0aC5sYW5ndWFnZUNvZGUpIHtcbiAgICAgIGhlYWRlcnNbSHR0cEhlYWRlci5YX0ZJUkVCQVNFX0xPQ0FMRV0gPSBhdXRoLmxhbmd1YWdlQ29kZTtcbiAgICB9XG5cbiAgICByZXR1cm4gRmV0Y2hQcm92aWRlci5mZXRjaCgpKFxuICAgICAgX2dldEZpbmFsVGFyZ2V0KGF1dGgsIGF1dGguY29uZmlnLmFwaUhvc3QsIHBhdGgsIHF1ZXJ5KSxcbiAgICAgIHtcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgICByZWZlcnJlclBvbGljeTogJ25vLXJlZmVycmVyJyxcbiAgICAgICAgLi4uYm9keVxuICAgICAgfVxuICAgICk7XG4gIH0pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gX3BlcmZvcm1GZXRjaFdpdGhFcnJvckhhbmRsaW5nPFY+KFxuICBhdXRoOiBBdXRoLFxuICBjdXN0b21FcnJvck1hcDogUGFydGlhbDxTZXJ2ZXJFcnJvck1hcDxTZXJ2ZXJFcnJvcj4+LFxuICBmZXRjaEZuOiAoKSA9PiBQcm9taXNlPFJlc3BvbnNlPlxuKTogUHJvbWlzZTxWPiB7XG4gIChhdXRoIGFzIEF1dGhJbnRlcm5hbCkuX2NhbkluaXRFbXVsYXRvciA9IGZhbHNlO1xuICBjb25zdCBlcnJvck1hcCA9IHsgLi4uU0VSVkVSX0VSUk9SX01BUCwgLi4uY3VzdG9tRXJyb3JNYXAgfTtcbiAgdHJ5IHtcbiAgICBjb25zdCBuZXR3b3JrVGltZW91dCA9IG5ldyBOZXR3b3JrVGltZW91dDxSZXNwb25zZT4oYXV0aCk7XG4gICAgY29uc3QgcmVzcG9uc2U6IFJlc3BvbnNlID0gYXdhaXQgUHJvbWlzZS5yYWNlPFByb21pc2U8UmVzcG9uc2U+PihbXG4gICAgICBmZXRjaEZuKCksXG4gICAgICBuZXR3b3JrVGltZW91dC5wcm9taXNlXG4gICAgXSk7XG5cbiAgICAvLyBJZiB3ZSd2ZSByZWFjaGVkIHRoaXMgcG9pbnQsIHRoZSBmZXRjaCBzdWNjZWVkZWQgYW5kIHRoZSBuZXR3b3JrVGltZW91dFxuICAgIC8vIGRpZG4ndCB0aHJvdzsgY2xlYXIgdGhlIG5ldHdvcmsgdGltZW91dCBkZWxheSBzbyB0aGF0IE5vZGUgd29uJ3QgaGFuZ1xuICAgIG5ldHdvcmtUaW1lb3V0LmNsZWFyTmV0d29ya1RpbWVvdXQoKTtcblxuICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgaWYgKCduZWVkQ29uZmlybWF0aW9uJyBpbiBqc29uKSB7XG4gICAgICB0aHJvdyBfbWFrZVRhZ2dlZEVycm9yKGF1dGgsIEF1dGhFcnJvckNvZGUuTkVFRF9DT05GSVJNQVRJT04sIGpzb24pO1xuICAgIH1cblxuICAgIGlmIChyZXNwb25zZS5vayAmJiAhKCdlcnJvck1lc3NhZ2UnIGluIGpzb24pKSB7XG4gICAgICByZXR1cm4ganNvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gcmVzcG9uc2Uub2sgPyBqc29uLmVycm9yTWVzc2FnZSA6IGpzb24uZXJyb3IubWVzc2FnZTtcbiAgICAgIGNvbnN0IFtzZXJ2ZXJFcnJvckNvZGUsIHNlcnZlckVycm9yTWVzc2FnZV0gPSBlcnJvck1lc3NhZ2Uuc3BsaXQoJyA6ICcpO1xuICAgICAgaWYgKHNlcnZlckVycm9yQ29kZSA9PT0gU2VydmVyRXJyb3IuRkVERVJBVEVEX1VTRVJfSURfQUxSRUFEWV9MSU5LRUQpIHtcbiAgICAgICAgdGhyb3cgX21ha2VUYWdnZWRFcnJvcihcbiAgICAgICAgICBhdXRoLFxuICAgICAgICAgIEF1dGhFcnJvckNvZGUuQ1JFREVOVElBTF9BTFJFQURZX0lOX1VTRSxcbiAgICAgICAgICBqc29uXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKHNlcnZlckVycm9yQ29kZSA9PT0gU2VydmVyRXJyb3IuRU1BSUxfRVhJU1RTKSB7XG4gICAgICAgIHRocm93IF9tYWtlVGFnZ2VkRXJyb3IoYXV0aCwgQXV0aEVycm9yQ29kZS5FTUFJTF9FWElTVFMsIGpzb24pO1xuICAgICAgfSBlbHNlIGlmIChzZXJ2ZXJFcnJvckNvZGUgPT09IFNlcnZlckVycm9yLlVTRVJfRElTQUJMRUQpIHtcbiAgICAgICAgdGhyb3cgX21ha2VUYWdnZWRFcnJvcihhdXRoLCBBdXRoRXJyb3JDb2RlLlVTRVJfRElTQUJMRUQsIGpzb24pO1xuICAgICAgfVxuICAgICAgY29uc3QgYXV0aEVycm9yID1cbiAgICAgICAgZXJyb3JNYXBbc2VydmVyRXJyb3JDb2RlIGFzIFNlcnZlckVycm9yXSB8fFxuICAgICAgICAoc2VydmVyRXJyb3JDb2RlXG4gICAgICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAucmVwbGFjZSgvW19cXHNdKy9nLCAnLScpIGFzIHVua25vd24gYXMgQXV0aEVycm9yQ29kZSk7XG4gICAgICBpZiAoc2VydmVyRXJyb3JNZXNzYWdlKSB7XG4gICAgICAgIHRocm93IF9lcnJvcldpdGhDdXN0b21NZXNzYWdlKGF1dGgsIGF1dGhFcnJvciwgc2VydmVyRXJyb3JNZXNzYWdlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF9mYWlsKGF1dGgsIGF1dGhFcnJvcik7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKGUgaW5zdGFuY2VvZiBGaXJlYmFzZUVycm9yKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICAvLyBDaGFuZ2luZyB0aGlzIHRvIGEgZGlmZmVyZW50IGVycm9yIGNvZGUgd2lsbCBsb2cgdXNlciBvdXQgd2hlbiB0aGVyZSBpcyBhIG5ldHdvcmsgZXJyb3JcbiAgICAvLyBiZWNhdXNlIHdlIHRyZWF0IGFueSBlcnJvciBvdGhlciB0aGFuIE5FVFdPUktfUkVRVUVTVF9GQUlMRUQgYXMgdG9rZW4gaXMgaW52YWxpZC5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmlyZWJhc2UvZmlyZWJhc2UtanMtc2RrL2Jsb2IvNGZiYzczNjEwZDcwYmU0ZTA4NTJlN2RlNjNhMzljYjc4OTdlODU0Ni9wYWNrYWdlcy9hdXRoL3NyYy9jb3JlL2F1dGgvYXV0aF9pbXBsLnRzI0wzMDktTDMxNlxuICAgIF9mYWlsKGF1dGgsIEF1dGhFcnJvckNvZGUuTkVUV09SS19SRVFVRVNUX0ZBSUxFRCwgeyAnbWVzc2FnZSc6IFN0cmluZyhlKSB9KTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gX3BlcmZvcm1TaWduSW5SZXF1ZXN0PFQsIFYgZXh0ZW5kcyBJZFRva2VuUmVzcG9uc2U+KFxuICBhdXRoOiBBdXRoLFxuICBtZXRob2Q6IEh0dHBNZXRob2QsXG4gIHBhdGg6IEVuZHBvaW50LFxuICByZXF1ZXN0PzogVCxcbiAgY3VzdG9tRXJyb3JNYXA6IFBhcnRpYWw8U2VydmVyRXJyb3JNYXA8U2VydmVyRXJyb3I+PiA9IHt9XG4pOiBQcm9taXNlPFY+IHtcbiAgY29uc3Qgc2VydmVyUmVzcG9uc2UgPSAoYXdhaXQgX3BlcmZvcm1BcGlSZXF1ZXN0PFQsIFYgfCBJZFRva2VuTWZhUmVzcG9uc2U+KFxuICAgIGF1dGgsXG4gICAgbWV0aG9kLFxuICAgIHBhdGgsXG4gICAgcmVxdWVzdCxcbiAgICBjdXN0b21FcnJvck1hcFxuICApKSBhcyBWO1xuICBpZiAoJ21mYVBlbmRpbmdDcmVkZW50aWFsJyBpbiBzZXJ2ZXJSZXNwb25zZSkge1xuICAgIF9mYWlsKGF1dGgsIEF1dGhFcnJvckNvZGUuTUZBX1JFUVVJUkVELCB7XG4gICAgICBfc2VydmVyUmVzcG9uc2U6IHNlcnZlclJlc3BvbnNlXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gc2VydmVyUmVzcG9uc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfZ2V0RmluYWxUYXJnZXQoXG4gIGF1dGg6IEF1dGgsXG4gIGhvc3Q6IHN0cmluZyxcbiAgcGF0aDogc3RyaW5nLFxuICBxdWVyeTogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBjb25zdCBiYXNlID0gYCR7aG9zdH0ke3BhdGh9PyR7cXVlcnl9YDtcblxuICBpZiAoIShhdXRoIGFzIEF1dGhJbnRlcm5hbCkuY29uZmlnLmVtdWxhdG9yKSB7XG4gICAgcmV0dXJuIGAke2F1dGguY29uZmlnLmFwaVNjaGVtZX06Ly8ke2Jhc2V9YDtcbiAgfVxuXG4gIHJldHVybiBfZW11bGF0b3JVcmwoYXV0aC5jb25maWcgYXMgQ29uZmlnSW50ZXJuYWwsIGJhc2UpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX3BhcnNlRW5mb3JjZW1lbnRTdGF0ZShcbiAgZW5mb3JjZW1lbnRTdGF0ZVN0cjogc3RyaW5nXG4pOiBFbmZvcmNlbWVudFN0YXRlIHtcbiAgc3dpdGNoIChlbmZvcmNlbWVudFN0YXRlU3RyKSB7XG4gICAgY2FzZSAnRU5GT1JDRSc6XG4gICAgICByZXR1cm4gRW5mb3JjZW1lbnRTdGF0ZS5FTkZPUkNFO1xuICAgIGNhc2UgJ0FVRElUJzpcbiAgICAgIHJldHVybiBFbmZvcmNlbWVudFN0YXRlLkFVRElUO1xuICAgIGNhc2UgJ09GRic6XG4gICAgICByZXR1cm4gRW5mb3JjZW1lbnRTdGF0ZS5PRkY7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBFbmZvcmNlbWVudFN0YXRlLkVORk9SQ0VNRU5UX1NUQVRFX1VOU1BFQ0lGSUVEO1xuICB9XG59XG5cbmNsYXNzIE5ldHdvcmtUaW1lb3V0PFQ+IHtcbiAgLy8gTm9kZSB0aW1lcnMgYW5kIGJyb3dzZXIgdGltZXJzIGFyZSBmdW5kYW1lbnRhbGx5IGluY29tcGF0aWJsZSwgYnV0IHdlXG4gIC8vIGRvbid0IGNhcmUgYWJvdXQgdGhlIHZhbHVlIGhlcmVcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJpdmF0ZSB0aW1lcjogYW55IHwgbnVsbCA9IG51bGw7XG4gIHJlYWRvbmx5IHByb21pc2UgPSBuZXcgUHJvbWlzZTxUPigoXywgcmVqZWN0KSA9PiB7XG4gICAgdGhpcy50aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgcmV0dXJuIHJlamVjdChcbiAgICAgICAgX2NyZWF0ZUVycm9yKHRoaXMuYXV0aCwgQXV0aEVycm9yQ29kZS5ORVRXT1JLX1JFUVVFU1RfRkFJTEVEKVxuICAgICAgKTtcbiAgICB9LCBERUZBVUxUX0FQSV9USU1FT1VUX01TLmdldCgpKTtcbiAgfSk7XG5cbiAgY2xlYXJOZXR3b3JrVGltZW91dCgpOiB2b2lkIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lcik7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGF1dGg6IEF1dGgpIHt9XG59XG5cbmludGVyZmFjZSBQb3RlbnRpYWxSZXNwb25zZSBleHRlbmRzIElkVG9rZW5SZXNwb25zZSB7XG4gIGVtYWlsPzogc3RyaW5nO1xuICBwaG9uZU51bWJlcj86IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9tYWtlVGFnZ2VkRXJyb3IoXG4gIGF1dGg6IEF1dGgsXG4gIGNvZGU6IEF1dGhFcnJvckNvZGUsXG4gIHJlc3BvbnNlOiBQb3RlbnRpYWxSZXNwb25zZVxuKTogRmlyZWJhc2VFcnJvciB7XG4gIGNvbnN0IGVycm9yUGFyYW1zOiBOYW1lZEVycm9yUGFyYW1zID0ge1xuICAgIGFwcE5hbWU6IGF1dGgubmFtZVxuICB9O1xuXG4gIGlmIChyZXNwb25zZS5lbWFpbCkge1xuICAgIGVycm9yUGFyYW1zLmVtYWlsID0gcmVzcG9uc2UuZW1haWw7XG4gIH1cbiAgaWYgKHJlc3BvbnNlLnBob25lTnVtYmVyKSB7XG4gICAgZXJyb3JQYXJhbXMucGhvbmVOdW1iZXIgPSByZXNwb25zZS5waG9uZU51bWJlcjtcbiAgfVxuXG4gIGNvbnN0IGVycm9yID0gX2NyZWF0ZUVycm9yKGF1dGgsIGNvZGUsIGVycm9yUGFyYW1zKTtcblxuICAvLyBXZSBrbm93IGN1c3RvbURhdGEgaXMgZGVmaW5lZCBvbiBlcnJvciBiZWNhdXNlIGVycm9yUGFyYW1zIGlzIGRlZmluZWRcbiAgKGVycm9yLmN1c3RvbURhdGEhIGFzIFRhZ2dlZFdpdGhUb2tlblJlc3BvbnNlKS5fdG9rZW5SZXNwb25zZSA9IHJlc3BvbnNlO1xuICByZXR1cm4gZXJyb3I7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgUmVjYXB0Y2hhUGFyYW1ldGVycyB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5pbXBvcnQge1xuICBHZXRSZWNhcHRjaGFDb25maWdSZXNwb25zZSxcbiAgUmVjYXB0Y2hhRW5mb3JjZW1lbnRQcm92aWRlclN0YXRlXG59IGZyb20gJy4uLy4uL2FwaS9hdXRoZW50aWNhdGlvbi9yZWNhcHRjaGEnO1xuaW1wb3J0IHsgRW5mb3JjZW1lbnRTdGF0ZSwgX3BhcnNlRW5mb3JjZW1lbnRTdGF0ZSB9IGZyb20gJy4uLy4uL2FwaS9pbmRleCc7XG5cbi8vIHJlQ0FQVENIQSB2MiBpbnRlcmZhY2VcbmV4cG9ydCBpbnRlcmZhY2UgUmVjYXB0Y2hhIHtcbiAgcmVuZGVyOiAoY29udGFpbmVyOiBIVE1MRWxlbWVudCwgcGFyYW1ldGVyczogUmVjYXB0Y2hhUGFyYW1ldGVycykgPT4gbnVtYmVyO1xuICBnZXRSZXNwb25zZTogKGlkOiBudW1iZXIpID0+IHN0cmluZztcbiAgZXhlY3V0ZTogKGlkOiBudW1iZXIpID0+IHVua25vd247XG4gIHJlc2V0OiAoaWQ6IG51bWJlcikgPT4gdW5rbm93bjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVjIoXG4gIGdyZWNhcHRjaGE6IFJlY2FwdGNoYSB8IEdyZUNBUFRDSEEgfCB1bmRlZmluZWRcbik6IGdyZWNhcHRjaGEgaXMgUmVjYXB0Y2hhIHtcbiAgcmV0dXJuIChcbiAgICBncmVjYXB0Y2hhICE9PSB1bmRlZmluZWQgJiZcbiAgICAoZ3JlY2FwdGNoYSBhcyBSZWNhcHRjaGEpLmdldFJlc3BvbnNlICE9PSB1bmRlZmluZWRcbiAgKTtcbn1cblxuLy8gcmVDQVBUQ0hBIEVudGVycHJpc2UgJiB2MyBzaGFyZWQgaW50ZXJmYWNlXG5leHBvcnQgaW50ZXJmYWNlIEdyZUNBUFRDSEFUb3BMZXZlbCBleHRlbmRzIEdyZUNBUFRDSEEge1xuICBlbnRlcnByaXNlOiBHcmVDQVBUQ0hBO1xufVxuXG4vLyByZUNBUFRDSEEgRW50ZXJwcmlzZSBpbnRlcmZhY2VcbmV4cG9ydCBpbnRlcmZhY2UgR3JlQ0FQVENIQSB7XG4gIHJlYWR5OiAoY2FsbGJhY2s6ICgpID0+IHZvaWQpID0+IHZvaWQ7XG4gIGV4ZWN1dGU6IChzaXRlS2V5OiBzdHJpbmcsIG9wdGlvbnM6IHsgYWN0aW9uOiBzdHJpbmcgfSkgPT4gUHJvbWlzZTxzdHJpbmc+O1xuICByZW5kZXI6IChcbiAgICBjb250YWluZXI6IHN0cmluZyB8IEhUTUxFbGVtZW50LFxuICAgIHBhcmFtZXRlcnM6IEdyZUNBUFRDSEFSZW5kZXJPcHRpb25cbiAgKSA9PiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3JlQ0FQVENIQVJlbmRlck9wdGlvbiB7XG4gIHNpdGVrZXk6IHN0cmluZztcbiAgc2l6ZTogJ2ludmlzaWJsZSc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0VudGVycHJpc2UoXG4gIGdyZWNhcHRjaGE6IFJlY2FwdGNoYSB8IEdyZUNBUFRDSEEgfCB1bmRlZmluZWRcbik6IGdyZWNhcHRjaGEgaXMgR3JlQ0FQVENIQVRvcExldmVsIHtcbiAgcmV0dXJuIChcbiAgICBncmVjYXB0Y2hhICE9PSB1bmRlZmluZWQgJiZcbiAgICAoZ3JlY2FwdGNoYSBhcyBHcmVDQVBUQ0hBVG9wTGV2ZWwpLmVudGVycHJpc2UgIT09IHVuZGVmaW5lZFxuICApO1xufVxuXG4vLyBUT0RPKGNodWFucik6IFJlcGxhY2UgdGhpcyB3aXRoIHRoZSBBdXRoV2luZG93IGFmdGVyIHJlc29sdmluZyB0aGUgZGVwZW5kZW5jeSBpc3N1ZSBpbiBOb2RlLmpzIGVudi5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgZ3JlY2FwdGNoYT86IFJlY2FwdGNoYSB8IEdyZUNBUFRDSEFUb3BMZXZlbDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmVjYXB0Y2hhQ29uZmlnIHtcbiAgLyoqXG4gICAqIFRoZSByZUNBUFRDSEEgc2l0ZSBrZXkuXG4gICAqL1xuICBzaXRlS2V5OiBzdHJpbmcgPSAnJztcblxuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgcHJvdmlkZXJzIGFuZCB0aGVpciBlbmFibGVtZW50IHN0YXR1cyBmb3IgcmVDQVBUQ0hBIEVudGVycHJpc2UuXG4gICAqL1xuICByZWNhcHRjaGFFbmZvcmNlbWVudFN0YXRlOiBSZWNhcHRjaGFFbmZvcmNlbWVudFByb3ZpZGVyU3RhdGVbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHJlc3BvbnNlOiBHZXRSZWNhcHRjaGFDb25maWdSZXNwb25zZSkge1xuICAgIGlmIChyZXNwb25zZS5yZWNhcHRjaGFLZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZWNhcHRjaGFLZXkgdW5kZWZpbmVkJyk7XG4gICAgfVxuICAgIC8vIEV4YW1wbGUgcmVzcG9uc2UucmVjYXB0Y2hhS2V5OiBcInByb2plY3RzL3Byb2oxMjMva2V5cy9zaXRla2V5MTIzXCJcbiAgICB0aGlzLnNpdGVLZXkgPSByZXNwb25zZS5yZWNhcHRjaGFLZXkuc3BsaXQoJy8nKVszXTtcbiAgICB0aGlzLnJlY2FwdGNoYUVuZm9yY2VtZW50U3RhdGUgPSByZXNwb25zZS5yZWNhcHRjaGFFbmZvcmNlbWVudFN0YXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHJlQ0FQVENIQSBFbnRlcnByaXNlIGVuZm9yY2VtZW50IHN0YXRlIGZvciB0aGUgZ2l2ZW4gcHJvdmlkZXIuXG4gICAqXG4gICAqIEBwYXJhbSBwcm92aWRlclN0ciAtIFRoZSBwcm92aWRlciB3aG9zZSBlbmZvcmNlbWVudCBzdGF0ZSBpcyB0byBiZSByZXR1cm5lZC5cbiAgICogQHJldHVybnMgVGhlIHJlQ0FQVENIQSBFbnRlcnByaXNlIGVuZm9yY2VtZW50IHN0YXRlIGZvciB0aGUgZ2l2ZW4gcHJvdmlkZXIuXG4gICAqL1xuICBnZXRQcm92aWRlckVuZm9yY2VtZW50U3RhdGUocHJvdmlkZXJTdHI6IHN0cmluZyk6IEVuZm9yY2VtZW50U3RhdGUgfCBudWxsIHtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5yZWNhcHRjaGFFbmZvcmNlbWVudFN0YXRlIHx8XG4gICAgICB0aGlzLnJlY2FwdGNoYUVuZm9yY2VtZW50U3RhdGUubGVuZ3RoID09PSAwXG4gICAgKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJlY2FwdGNoYUVuZm9yY2VtZW50U3RhdGUgb2YgdGhpcy5yZWNhcHRjaGFFbmZvcmNlbWVudFN0YXRlKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHJlY2FwdGNoYUVuZm9yY2VtZW50U3RhdGUucHJvdmlkZXIgJiZcbiAgICAgICAgcmVjYXB0Y2hhRW5mb3JjZW1lbnRTdGF0ZS5wcm92aWRlciA9PT0gcHJvdmlkZXJTdHJcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gX3BhcnNlRW5mb3JjZW1lbnRTdGF0ZShcbiAgICAgICAgICByZWNhcHRjaGFFbmZvcmNlbWVudFN0YXRlLmVuZm9yY2VtZW50U3RhdGVcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByZUNBUFRDSEEgRW50ZXJwcmlzZSBlbmZvcmNlbWVudCBzdGF0ZSBmb3IgdGhlIHByb3ZpZGVyIGlzIHNldCB0byBFTkZPUkNFIG9yIEFVRElULlxuICAgKlxuICAgKiBAcGFyYW0gcHJvdmlkZXJTdHIgLSBUaGUgcHJvdmlkZXIgd2hvc2UgZW5hYmxlbWVudCBzdGF0ZSBpcyB0byBiZSByZXR1cm5lZC5cbiAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgcmVDQVBUQ0hBIEVudGVycHJpc2UgcHJvdGVjdGlvbiBpcyBlbmFibGVkIGZvciB0aGUgZ2l2ZW4gcHJvdmlkZXIuXG4gICAqL1xuICBpc1Byb3ZpZGVyRW5hYmxlZChwcm92aWRlclN0cjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuZ2V0UHJvdmlkZXJFbmZvcmNlbWVudFN0YXRlKHByb3ZpZGVyU3RyKSA9PT1cbiAgICAgICAgRW5mb3JjZW1lbnRTdGF0ZS5FTkZPUkNFIHx8XG4gICAgICB0aGlzLmdldFByb3ZpZGVyRW5mb3JjZW1lbnRTdGF0ZShwcm92aWRlclN0cikgPT09IEVuZm9yY2VtZW50U3RhdGUuQVVESVRcbiAgICApO1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgRW5kcG9pbnQsXG4gIEh0dHBNZXRob2QsXG4gIFJlY2FwdGNoYUNsaWVudFR5cGUsXG4gIFJlY2FwdGNoYVZlcnNpb24sXG4gIF9wZXJmb3JtQXBpUmVxdWVzdCxcbiAgX2FkZFRpZElmTmVjZXNzYXJ5XG59IGZyb20gJy4uL2luZGV4JztcbmltcG9ydCB7IEF1dGggfSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuXG5pbnRlcmZhY2UgR2V0UmVjYXB0Y2hhUGFyYW1SZXNwb25zZSB7XG4gIHJlY2FwdGNoYVNpdGVLZXk/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRSZWNhcHRjaGFQYXJhbXMoYXV0aDogQXV0aCk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHJldHVybiAoXG4gICAgKFxuICAgICAgYXdhaXQgX3BlcmZvcm1BcGlSZXF1ZXN0PHZvaWQsIEdldFJlY2FwdGNoYVBhcmFtUmVzcG9uc2U+KFxuICAgICAgICBhdXRoLFxuICAgICAgICBIdHRwTWV0aG9kLkdFVCxcbiAgICAgICAgRW5kcG9pbnQuR0VUX1JFQ0FQVENIQV9QQVJBTVxuICAgICAgKVxuICAgICkucmVjYXB0Y2hhU2l0ZUtleSB8fCAnJ1xuICApO1xufVxuXG4vLyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgZm9yIHJlQ0FQVENIQSBlbnRlcnByaXNlIGludGVncmF0aW9uLlxuaW50ZXJmYWNlIEdldFJlY2FwdGNoYUNvbmZpZ1JlcXVlc3Qge1xuICB0ZW5hbnRJZD86IHN0cmluZztcbiAgY2xpZW50VHlwZT86IFJlY2FwdGNoYUNsaWVudFR5cGU7XG4gIHZlcnNpb24/OiBSZWNhcHRjaGFWZXJzaW9uO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlY2FwdGNoYUVuZm9yY2VtZW50UHJvdmlkZXJTdGF0ZSB7XG4gIHByb3ZpZGVyOiBzdHJpbmc7XG4gIGVuZm9yY2VtZW50U3RhdGU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXRSZWNhcHRjaGFDb25maWdSZXNwb25zZSB7XG4gIHJlY2FwdGNoYUtleTogc3RyaW5nO1xuICByZWNhcHRjaGFFbmZvcmNlbWVudFN0YXRlOiBSZWNhcHRjaGFFbmZvcmNlbWVudFByb3ZpZGVyU3RhdGVbXTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFJlY2FwdGNoYUNvbmZpZyhcbiAgYXV0aDogQXV0aCxcbiAgcmVxdWVzdDogR2V0UmVjYXB0Y2hhQ29uZmlnUmVxdWVzdFxuKTogUHJvbWlzZTxHZXRSZWNhcHRjaGFDb25maWdSZXNwb25zZT4ge1xuICByZXR1cm4gX3BlcmZvcm1BcGlSZXF1ZXN0PFxuICAgIEdldFJlY2FwdGNoYUNvbmZpZ1JlcXVlc3QsXG4gICAgR2V0UmVjYXB0Y2hhQ29uZmlnUmVzcG9uc2VcbiAgPihcbiAgICBhdXRoLFxuICAgIEh0dHBNZXRob2QuR0VULFxuICAgIEVuZHBvaW50LkdFVF9SRUNBUFRDSEFfQ09ORklHLFxuICAgIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KVxuICApO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEVuZHBvaW50LCBIdHRwTWV0aG9kLCBfcGVyZm9ybUFwaVJlcXVlc3QgfSBmcm9tICcuLi9pbmRleCc7XG5pbXBvcnQgeyBNZmFFbnJvbGxtZW50IH0gZnJvbSAnLi9tZmEnO1xuaW1wb3J0IHsgQXV0aCB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVsZXRlQWNjb3VudFJlcXVlc3Qge1xuICBpZFRva2VuOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVBY2NvdW50KFxuICBhdXRoOiBBdXRoLFxuICByZXF1ZXN0OiBEZWxldGVBY2NvdW50UmVxdWVzdFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBfcGVyZm9ybUFwaVJlcXVlc3Q8RGVsZXRlQWNjb3VudFJlcXVlc3QsIHZvaWQ+KFxuICAgIGF1dGgsXG4gICAgSHR0cE1ldGhvZC5QT1NULFxuICAgIEVuZHBvaW50LkRFTEVURV9BQ0NPVU5ULFxuICAgIHJlcXVlc3RcbiAgKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcm92aWRlclVzZXJJbmZvIHtcbiAgcHJvdmlkZXJJZDogc3RyaW5nO1xuICByYXdJZD86IHN0cmluZztcbiAgZW1haWw/OiBzdHJpbmc7XG4gIGRpc3BsYXlOYW1lPzogc3RyaW5nO1xuICBwaG90b1VybD86IHN0cmluZztcbiAgcGhvbmVOdW1iZXI/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVsZXRlTGlua2VkQWNjb3VudHNSZXF1ZXN0IHtcbiAgaWRUb2tlbjogc3RyaW5nO1xuICBkZWxldGVQcm92aWRlcjogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVsZXRlTGlua2VkQWNjb3VudHNSZXNwb25zZSB7XG4gIHByb3ZpZGVyVXNlckluZm86IFByb3ZpZGVyVXNlckluZm9bXTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUxpbmtlZEFjY291bnRzKFxuICBhdXRoOiBBdXRoLFxuICByZXF1ZXN0OiBEZWxldGVMaW5rZWRBY2NvdW50c1JlcXVlc3Rcbik6IFByb21pc2U8RGVsZXRlTGlua2VkQWNjb3VudHNSZXNwb25zZT4ge1xuICByZXR1cm4gX3BlcmZvcm1BcGlSZXF1ZXN0PFxuICAgIERlbGV0ZUxpbmtlZEFjY291bnRzUmVxdWVzdCxcbiAgICBEZWxldGVMaW5rZWRBY2NvdW50c1Jlc3BvbnNlXG4gID4oYXV0aCwgSHR0cE1ldGhvZC5QT1NULCBFbmRwb2ludC5TRVRfQUNDT1VOVF9JTkZPLCByZXF1ZXN0KTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBUElVc2VySW5mbyB7XG4gIGxvY2FsSWQ/OiBzdHJpbmc7XG4gIGRpc3BsYXlOYW1lPzogc3RyaW5nO1xuICBwaG90b1VybD86IHN0cmluZztcbiAgZW1haWw/OiBzdHJpbmc7XG4gIGVtYWlsVmVyaWZpZWQ/OiBib29sZWFuO1xuICBwaG9uZU51bWJlcj86IHN0cmluZztcbiAgbGFzdExvZ2luQXQ/OiBudW1iZXI7XG4gIGNyZWF0ZWRBdD86IG51bWJlcjtcbiAgdGVuYW50SWQ/OiBzdHJpbmc7XG4gIHBhc3N3b3JkSGFzaD86IHN0cmluZztcbiAgcHJvdmlkZXJVc2VySW5mbz86IFByb3ZpZGVyVXNlckluZm9bXTtcbiAgbWZhSW5mbz86IE1mYUVucm9sbG1lbnRbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXRBY2NvdW50SW5mb1JlcXVlc3Qge1xuICBpZFRva2VuOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0QWNjb3VudEluZm9SZXNwb25zZSB7XG4gIHVzZXJzOiBBUElVc2VySW5mb1tdO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QWNjb3VudEluZm8oXG4gIGF1dGg6IEF1dGgsXG4gIHJlcXVlc3Q6IEdldEFjY291bnRJbmZvUmVxdWVzdFxuKTogUHJvbWlzZTxHZXRBY2NvdW50SW5mb1Jlc3BvbnNlPiB7XG4gIHJldHVybiBfcGVyZm9ybUFwaVJlcXVlc3Q8R2V0QWNjb3VudEluZm9SZXF1ZXN0LCBHZXRBY2NvdW50SW5mb1Jlc3BvbnNlPihcbiAgICBhdXRoLFxuICAgIEh0dHBNZXRob2QuUE9TVCxcbiAgICBFbmRwb2ludC5HRVRfQUNDT1VOVF9JTkZPLFxuICAgIHJlcXVlc3RcbiAgKTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdXRjVGltZXN0YW1wVG9EYXRlU3RyaW5nKFxuICB1dGNUaW1lc3RhbXA/OiBzdHJpbmcgfCBudW1iZXJcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghdXRjVGltZXN0YW1wKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICB0cnkge1xuICAgIC8vIENvbnZlcnQgdG8gZGF0ZSBvYmplY3QuXG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKE51bWJlcih1dGNUaW1lc3RhbXApKTtcbiAgICAvLyBUZXN0IGRhdGUgaXMgdmFsaWQuXG4gICAgaWYgKCFpc05hTihkYXRlLmdldFRpbWUoKSkpIHtcbiAgICAgIC8vIENvbnZlcnQgdG8gVVRDIGRhdGUgc3RyaW5nLlxuICAgICAgcmV0dXJuIGRhdGUudG9VVENTdHJpbmcoKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBEbyBub3RoaW5nLiB1bmRlZmluZWQgd2lsbCBiZSByZXR1cm5lZC5cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IElkVG9rZW5SZXN1bHQsIFBhcnNlZFRva2VuLCBVc2VyIH0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcbmltcG9ydCB7IGJhc2U2NERlY29kZSwgZ2V0TW9kdWxhckluc3RhbmNlIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuXG5pbXBvcnQgeyBVc2VySW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC91c2VyJztcbmltcG9ydCB7IF9hc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydCc7XG5pbXBvcnQgeyBfbG9nRXJyb3IgfSBmcm9tICcuLi91dGlsL2xvZyc7XG5pbXBvcnQgeyB1dGNUaW1lc3RhbXBUb0RhdGVTdHJpbmcgfSBmcm9tICcuLi91dGlsL3RpbWUnO1xuaW1wb3J0IHsgQXV0aEVycm9yQ29kZSB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbi8qKlxuICogUmV0dXJucyBhIEpTT04gV2ViIFRva2VuIChKV1QpIHVzZWQgdG8gaWRlbnRpZnkgdGhlIHVzZXIgdG8gYSBGaXJlYmFzZSBzZXJ2aWNlLlxuICpcbiAqIEByZW1hcmtzXG4gKiBSZXR1cm5zIHRoZSBjdXJyZW50IHRva2VuIGlmIGl0IGhhcyBub3QgZXhwaXJlZCBvciBpZiBpdCB3aWxsIG5vdCBleHBpcmUgaW4gdGhlIG5leHQgZml2ZVxuICogbWludXRlcy4gT3RoZXJ3aXNlLCB0aGlzIHdpbGwgcmVmcmVzaCB0aGUgdG9rZW4gYW5kIHJldHVybiBhIG5ldyBvbmUuXG4gKlxuICogQHBhcmFtIHVzZXIgLSBUaGUgdXNlci5cbiAqIEBwYXJhbSBmb3JjZVJlZnJlc2ggLSBGb3JjZSByZWZyZXNoIHJlZ2FyZGxlc3Mgb2YgdG9rZW4gZXhwaXJhdGlvbi5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJZFRva2VuKHVzZXI6IFVzZXIsIGZvcmNlUmVmcmVzaCA9IGZhbHNlKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgcmV0dXJuIGdldE1vZHVsYXJJbnN0YW5jZSh1c2VyKS5nZXRJZFRva2VuKGZvcmNlUmVmcmVzaCk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGRlc2VyaWFsaXplZCBKU09OIFdlYiBUb2tlbiAoSldUKSB1c2VkIHRvIGlkZW50aWZ5IHRoZSB1c2VyIHRvIGEgRmlyZWJhc2Ugc2VydmljZS5cbiAqXG4gKiBAcmVtYXJrc1xuICogUmV0dXJucyB0aGUgY3VycmVudCB0b2tlbiBpZiBpdCBoYXMgbm90IGV4cGlyZWQgb3IgaWYgaXQgd2lsbCBub3QgZXhwaXJlIGluIHRoZSBuZXh0IGZpdmVcbiAqIG1pbnV0ZXMuIE90aGVyd2lzZSwgdGhpcyB3aWxsIHJlZnJlc2ggdGhlIHRva2VuIGFuZCByZXR1cm4gYSBuZXcgb25lLlxuICpcbiAqIEBwYXJhbSB1c2VyIC0gVGhlIHVzZXIuXG4gKiBAcGFyYW0gZm9yY2VSZWZyZXNoIC0gRm9yY2UgcmVmcmVzaCByZWdhcmRsZXNzIG9mIHRva2VuIGV4cGlyYXRpb24uXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0SWRUb2tlblJlc3VsdChcbiAgdXNlcjogVXNlcixcbiAgZm9yY2VSZWZyZXNoID0gZmFsc2Vcbik6IFByb21pc2U8SWRUb2tlblJlc3VsdD4ge1xuICBjb25zdCB1c2VySW50ZXJuYWwgPSBnZXRNb2R1bGFySW5zdGFuY2UodXNlcikgYXMgVXNlckludGVybmFsO1xuICBjb25zdCB0b2tlbiA9IGF3YWl0IHVzZXJJbnRlcm5hbC5nZXRJZFRva2VuKGZvcmNlUmVmcmVzaCk7XG4gIGNvbnN0IGNsYWltcyA9IF9wYXJzZVRva2VuKHRva2VuKTtcblxuICBfYXNzZXJ0KFxuICAgIGNsYWltcyAmJiBjbGFpbXMuZXhwICYmIGNsYWltcy5hdXRoX3RpbWUgJiYgY2xhaW1zLmlhdCxcbiAgICB1c2VySW50ZXJuYWwuYXV0aCxcbiAgICBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SXG4gICk7XG4gIGNvbnN0IGZpcmViYXNlID1cbiAgICB0eXBlb2YgY2xhaW1zLmZpcmViYXNlID09PSAnb2JqZWN0JyA/IGNsYWltcy5maXJlYmFzZSA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBzaWduSW5Qcm92aWRlcjogc3RyaW5nIHwgdW5kZWZpbmVkID0gZmlyZWJhc2U/Llsnc2lnbl9pbl9wcm92aWRlciddO1xuXG4gIHJldHVybiB7XG4gICAgY2xhaW1zLFxuICAgIHRva2VuLFxuICAgIGF1dGhUaW1lOiB1dGNUaW1lc3RhbXBUb0RhdGVTdHJpbmcoXG4gICAgICBzZWNvbmRzU3RyaW5nVG9NaWxsaXNlY29uZHMoY2xhaW1zLmF1dGhfdGltZSlcbiAgICApISxcbiAgICBpc3N1ZWRBdFRpbWU6IHV0Y1RpbWVzdGFtcFRvRGF0ZVN0cmluZyhcbiAgICAgIHNlY29uZHNTdHJpbmdUb01pbGxpc2Vjb25kcyhjbGFpbXMuaWF0KVxuICAgICkhLFxuICAgIGV4cGlyYXRpb25UaW1lOiB1dGNUaW1lc3RhbXBUb0RhdGVTdHJpbmcoXG4gICAgICBzZWNvbmRzU3RyaW5nVG9NaWxsaXNlY29uZHMoY2xhaW1zLmV4cClcbiAgICApISxcbiAgICBzaWduSW5Qcm92aWRlcjogc2lnbkluUHJvdmlkZXIgfHwgbnVsbCxcbiAgICBzaWduSW5TZWNvbmRGYWN0b3I6IGZpcmViYXNlPy5bJ3NpZ25faW5fc2Vjb25kX2ZhY3RvciddIHx8IG51bGxcbiAgfTtcbn1cblxuZnVuY3Rpb24gc2Vjb25kc1N0cmluZ1RvTWlsbGlzZWNvbmRzKHNlY29uZHM6IHN0cmluZyk6IG51bWJlciB7XG4gIHJldHVybiBOdW1iZXIoc2Vjb25kcykgKiAxMDAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX3BhcnNlVG9rZW4odG9rZW46IHN0cmluZyk6IFBhcnNlZFRva2VuIHwgbnVsbCB7XG4gIGNvbnN0IFthbGdvcml0aG0sIHBheWxvYWQsIHNpZ25hdHVyZV0gPSB0b2tlbi5zcGxpdCgnLicpO1xuICBpZiAoXG4gICAgYWxnb3JpdGhtID09PSB1bmRlZmluZWQgfHxcbiAgICBwYXlsb2FkID09PSB1bmRlZmluZWQgfHxcbiAgICBzaWduYXR1cmUgPT09IHVuZGVmaW5lZFxuICApIHtcbiAgICBfbG9nRXJyb3IoJ0pXVCBtYWxmb3JtZWQsIGNvbnRhaW5lZCBmZXdlciB0aGFuIDMgc2VjdGlvbnMnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgZGVjb2RlZCA9IGJhc2U2NERlY29kZShwYXlsb2FkKTtcbiAgICBpZiAoIWRlY29kZWQpIHtcbiAgICAgIF9sb2dFcnJvcignRmFpbGVkIHRvIGRlY29kZSBiYXNlNjQgSldUIHBheWxvYWQnKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gSlNPTi5wYXJzZShkZWNvZGVkKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIF9sb2dFcnJvcihcbiAgICAgICdDYXVnaHQgZXJyb3IgcGFyc2luZyBKV1QgcGF5bG9hZCBhcyBKU09OJyxcbiAgICAgIChlIGFzIEVycm9yKT8udG9TdHJpbmcoKVxuICAgICk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLyoqXG4gKiBFeHRyYWN0IGV4cGlyZXNJbiBUVEwgZnJvbSBhIHRva2VuIGJ5IHN1YnRyYWN0aW5nIHRoZSBleHBpcmF0aW9uIGZyb20gdGhlIGlzc3VhbmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gX3Rva2VuRXhwaXJlc0luKHRva2VuOiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBwYXJzZWRUb2tlbiA9IF9wYXJzZVRva2VuKHRva2VuKTtcbiAgX2Fzc2VydChwYXJzZWRUb2tlbiwgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUik7XG4gIF9hc3NlcnQodHlwZW9mIHBhcnNlZFRva2VuLmV4cCAhPT0gJ3VuZGVmaW5lZCcsIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IpO1xuICBfYXNzZXJ0KHR5cGVvZiBwYXJzZWRUb2tlbi5pYXQgIT09ICd1bmRlZmluZWQnLCBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SKTtcbiAgcmV0dXJuIE51bWJlcihwYXJzZWRUb2tlbi5leHApIC0gTnVtYmVyKHBhcnNlZFRva2VuLmlhdCk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgRmlyZWJhc2VFcnJvciB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcblxuaW1wb3J0IHsgVXNlckludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvdXNlcic7XG5pbXBvcnQgeyBBdXRoRXJyb3JDb2RlIH0gZnJvbSAnLi4vZXJyb3JzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIF9sb2dvdXRJZkludmFsaWRhdGVkPFQ+KFxuICB1c2VyOiBVc2VySW50ZXJuYWwsXG4gIHByb21pc2U6IFByb21pc2U8VD4sXG4gIGJ5cGFzc0F1dGhTdGF0ZSA9IGZhbHNlXG4pOiBQcm9taXNlPFQ+IHtcbiAgaWYgKGJ5cGFzc0F1dGhTdGF0ZSkge1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHByb21pc2U7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoZSBpbnN0YW5jZW9mIEZpcmViYXNlRXJyb3IgJiYgaXNVc2VySW52YWxpZGF0ZWQoZSkpIHtcbiAgICAgIGlmICh1c2VyLmF1dGguY3VycmVudFVzZXIgPT09IHVzZXIpIHtcbiAgICAgICAgYXdhaXQgdXNlci5hdXRoLnNpZ25PdXQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzVXNlckludmFsaWRhdGVkKHsgY29kZSB9OiBGaXJlYmFzZUVycm9yKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgY29kZSA9PT0gYGF1dGgvJHtBdXRoRXJyb3JDb2RlLlVTRVJfRElTQUJMRUR9YCB8fFxuICAgIGNvZGUgPT09IGBhdXRoLyR7QXV0aEVycm9yQ29kZS5UT0tFTl9FWFBJUkVEfWBcbiAgKTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBGaXJlYmFzZUVycm9yIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuaW1wb3J0IHsgVXNlckludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvdXNlcic7XG5pbXBvcnQgeyBBdXRoRXJyb3JDb2RlIH0gZnJvbSAnLi4vZXJyb3JzJztcblxuLy8gUmVmcmVzaCB0aGUgdG9rZW4gZml2ZSBtaW51dGVzIGJlZm9yZSBleHBpcmF0aW9uXG5leHBvcnQgY29uc3QgZW51bSBEdXJhdGlvbiB7XG4gIE9GRlNFVCA9IDUgKiAxMDAwICogNjAsXG4gIFJFVFJZX0JBQ0tPRkZfTUlOID0gMzAgKiAxMDAwLFxuICBSRVRSWV9CQUNLT0ZGX01BWCA9IDE2ICogNjAgKiAxMDAwXG59XG5cbmV4cG9ydCBjbGFzcyBQcm9hY3RpdmVSZWZyZXNoIHtcbiAgcHJpdmF0ZSBpc1J1bm5pbmcgPSBmYWxzZTtcblxuICAvLyBOb2RlIHRpbWVycyBhbmQgYnJvd3NlciB0aW1lcnMgcmV0dXJuIGZ1bmRhbWVudGFsbHkgZGlmZmVyZW50IHR5cGVzLlxuICAvLyBXZSBkb24ndCBhY3R1YWxseSBjYXJlIHdoYXQgdGhlIHZhbHVlIGlzIGJ1dCBUUyB3b24ndCBhY2NlcHQgdW5rbm93biBhbmRcbiAgLy8gd2UgY2FuJ3QgY2FzdCBwcm9wZXJseSBpbiBib3RoIGVudmlyb25tZW50cy5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJpdmF0ZSB0aW1lcklkOiBhbnkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBlcnJvckJhY2tvZmYgPSBEdXJhdGlvbi5SRVRSWV9CQUNLT0ZGX01JTjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHVzZXI6IFVzZXJJbnRlcm5hbCkge31cblxuICBfc3RhcnQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNSdW5uaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5pc1J1bm5pbmcgPSB0cnVlO1xuICAgIHRoaXMuc2NoZWR1bGUoKTtcbiAgfVxuXG4gIF9zdG9wKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc1J1bm5pbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmlzUnVubmluZyA9IGZhbHNlO1xuICAgIGlmICh0aGlzLnRpbWVySWQgIT09IG51bGwpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVySWQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0SW50ZXJ2YWwod2FzRXJyb3I6IGJvb2xlYW4pOiBudW1iZXIge1xuICAgIGlmICh3YXNFcnJvcikge1xuICAgICAgY29uc3QgaW50ZXJ2YWwgPSB0aGlzLmVycm9yQmFja29mZjtcbiAgICAgIHRoaXMuZXJyb3JCYWNrb2ZmID0gTWF0aC5taW4oXG4gICAgICAgIHRoaXMuZXJyb3JCYWNrb2ZmICogMixcbiAgICAgICAgRHVyYXRpb24uUkVUUllfQkFDS09GRl9NQVhcbiAgICAgICk7XG4gICAgICByZXR1cm4gaW50ZXJ2YWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlc2V0IHRoZSBlcnJvciBiYWNrb2ZmXG4gICAgICB0aGlzLmVycm9yQmFja29mZiA9IER1cmF0aW9uLlJFVFJZX0JBQ0tPRkZfTUlOO1xuICAgICAgY29uc3QgZXhwVGltZSA9IHRoaXMudXNlci5zdHNUb2tlbk1hbmFnZXIuZXhwaXJhdGlvblRpbWUgPz8gMDtcbiAgICAgIGNvbnN0IGludGVydmFsID0gZXhwVGltZSAtIERhdGUubm93KCkgLSBEdXJhdGlvbi5PRkZTRVQ7XG5cbiAgICAgIHJldHVybiBNYXRoLm1heCgwLCBpbnRlcnZhbCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzY2hlZHVsZSh3YXNFcnJvciA9IGZhbHNlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzUnVubmluZykge1xuICAgICAgLy8gSnVzdCBpbiBjYXNlLi4uXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaW50ZXJ2YWwgPSB0aGlzLmdldEludGVydmFsKHdhc0Vycm9yKTtcbiAgICB0aGlzLnRpbWVySWQgPSBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuaXRlcmF0aW9uKCk7XG4gICAgfSwgaW50ZXJ2YWwpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpdGVyYXRpb24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMudXNlci5nZXRJZFRva2VuKHRydWUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIE9ubHkgcmV0cnkgb24gbmV0d29yayBlcnJvcnNcbiAgICAgIGlmIChcbiAgICAgICAgKGUgYXMgRmlyZWJhc2VFcnJvcik/LmNvZGUgPT09XG4gICAgICAgIGBhdXRoLyR7QXV0aEVycm9yQ29kZS5ORVRXT1JLX1JFUVVFU1RfRkFJTEVEfWBcbiAgICAgICkge1xuICAgICAgICB0aGlzLnNjaGVkdWxlKC8qIHdhc0Vycm9yICovIHRydWUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2NoZWR1bGUoKTtcbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IFVzZXJNZXRhZGF0YSBhcyBVc2VyTWV0YWRhdGFUeXBlIH0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcblxuaW1wb3J0IHsgdXRjVGltZXN0YW1wVG9EYXRlU3RyaW5nIH0gZnJvbSAnLi4vdXRpbC90aW1lJztcblxuZXhwb3J0IGNsYXNzIFVzZXJNZXRhZGF0YSBpbXBsZW1lbnRzIFVzZXJNZXRhZGF0YVR5cGUge1xuICBjcmVhdGlvblRpbWU/OiBzdHJpbmc7XG4gIGxhc3RTaWduSW5UaW1lPzogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY3JlYXRlZEF0Pzogc3RyaW5nIHwgbnVtYmVyLFxuICAgIHByaXZhdGUgbGFzdExvZ2luQXQ/OiBzdHJpbmcgfCBudW1iZXJcbiAgKSB7XG4gICAgdGhpcy5faW5pdGlhbGl6ZVRpbWUoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2luaXRpYWxpemVUaW1lKCk6IHZvaWQge1xuICAgIHRoaXMubGFzdFNpZ25JblRpbWUgPSB1dGNUaW1lc3RhbXBUb0RhdGVTdHJpbmcodGhpcy5sYXN0TG9naW5BdCk7XG4gICAgdGhpcy5jcmVhdGlvblRpbWUgPSB1dGNUaW1lc3RhbXBUb0RhdGVTdHJpbmcodGhpcy5jcmVhdGVkQXQpO1xuICB9XG5cbiAgX2NvcHkobWV0YWRhdGE6IFVzZXJNZXRhZGF0YSk6IHZvaWQge1xuICAgIHRoaXMuY3JlYXRlZEF0ID0gbWV0YWRhdGEuY3JlYXRlZEF0O1xuICAgIHRoaXMubGFzdExvZ2luQXQgPSBtZXRhZGF0YS5sYXN0TG9naW5BdDtcbiAgICB0aGlzLl9pbml0aWFsaXplVGltZSgpO1xuICB9XG5cbiAgdG9KU09OKCk6IG9iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNyZWF0ZWRBdDogdGhpcy5jcmVhdGVkQXQsXG4gICAgICBsYXN0TG9naW5BdDogdGhpcy5sYXN0TG9naW5BdFxuICAgIH07XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBVc2VyLCBVc2VySW5mbyB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5cbmltcG9ydCB7XG4gIGdldEFjY291bnRJbmZvLFxuICBQcm92aWRlclVzZXJJbmZvXG59IGZyb20gJy4uLy4uL2FwaS9hY2NvdW50X21hbmFnZW1lbnQvYWNjb3VudCc7XG5pbXBvcnQgeyBVc2VySW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC91c2VyJztcbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgX2Fzc2VydCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0JztcbmltcG9ydCB7IF9sb2dvdXRJZkludmFsaWRhdGVkIH0gZnJvbSAnLi9pbnZhbGlkYXRpb24nO1xuaW1wb3J0IHsgVXNlck1ldGFkYXRhIH0gZnJvbSAnLi91c2VyX21ldGFkYXRhJztcbmltcG9ydCB7IGdldE1vZHVsYXJJbnN0YW5jZSB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIF9yZWxvYWRXaXRob3V0U2F2aW5nKHVzZXI6IFVzZXJJbnRlcm5hbCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhdXRoID0gdXNlci5hdXRoO1xuICBjb25zdCBpZFRva2VuID0gYXdhaXQgdXNlci5nZXRJZFRva2VuKCk7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgX2xvZ291dElmSW52YWxpZGF0ZWQoXG4gICAgdXNlcixcbiAgICBnZXRBY2NvdW50SW5mbyhhdXRoLCB7IGlkVG9rZW4gfSlcbiAgKTtcblxuICBfYXNzZXJ0KHJlc3BvbnNlPy51c2Vycy5sZW5ndGgsIGF1dGgsIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IpO1xuXG4gIGNvbnN0IGNvcmVBY2NvdW50ID0gcmVzcG9uc2UudXNlcnNbMF07XG5cbiAgdXNlci5fbm90aWZ5UmVsb2FkTGlzdGVuZXIoY29yZUFjY291bnQpO1xuXG4gIGNvbnN0IG5ld1Byb3ZpZGVyRGF0YSA9IGNvcmVBY2NvdW50LnByb3ZpZGVyVXNlckluZm8/Lmxlbmd0aFxuICAgID8gZXh0cmFjdFByb3ZpZGVyRGF0YShjb3JlQWNjb3VudC5wcm92aWRlclVzZXJJbmZvKVxuICAgIDogW107XG5cbiAgY29uc3QgcHJvdmlkZXJEYXRhID0gbWVyZ2VQcm92aWRlckRhdGEodXNlci5wcm92aWRlckRhdGEsIG5ld1Byb3ZpZGVyRGF0YSk7XG5cbiAgLy8gUHJlc2VydmVzIHRoZSBub24tbm9ueW1vdXMgc3RhdHVzIG9mIHRoZSBzdG9yZWQgdXNlciwgZXZlbiBpZiBubyBtb3JlXG4gIC8vIGNyZWRlbnRpYWxzIChmZWRlcmF0ZWQgb3IgZW1haWwvcGFzc3dvcmQpIGFyZSBsaW5rZWQgdG8gdGhlIHVzZXIuIElmXG4gIC8vIHRoZSB1c2VyIHdhcyBwcmV2aW91c2x5IGFub255bW91cywgdGhlbiB1c2UgcHJvdmlkZXIgZGF0YSB0byB1cGRhdGUuXG4gIC8vIE9uIHRoZSBvdGhlciBoYW5kLCBpZiBpdCB3YXMgbm90IGFub255bW91cyBiZWZvcmUsIGl0IHNob3VsZCBuZXZlciBiZVxuICAvLyBjb25zaWRlcmVkIGFub255bW91cyBub3cuXG4gIGNvbnN0IG9sZElzQW5vbnltb3VzID0gdXNlci5pc0Fub255bW91cztcbiAgY29uc3QgbmV3SXNBbm9ueW1vdXMgPVxuICAgICEodXNlci5lbWFpbCAmJiBjb3JlQWNjb3VudC5wYXNzd29yZEhhc2gpICYmICFwcm92aWRlckRhdGE/Lmxlbmd0aDtcbiAgY29uc3QgaXNBbm9ueW1vdXMgPSAhb2xkSXNBbm9ueW1vdXMgPyBmYWxzZSA6IG5ld0lzQW5vbnltb3VzO1xuXG4gIGNvbnN0IHVwZGF0ZXM6IFBhcnRpYWw8VXNlckludGVybmFsPiA9IHtcbiAgICB1aWQ6IGNvcmVBY2NvdW50LmxvY2FsSWQsXG4gICAgZGlzcGxheU5hbWU6IGNvcmVBY2NvdW50LmRpc3BsYXlOYW1lIHx8IG51bGwsXG4gICAgcGhvdG9VUkw6IGNvcmVBY2NvdW50LnBob3RvVXJsIHx8IG51bGwsXG4gICAgZW1haWw6IGNvcmVBY2NvdW50LmVtYWlsIHx8IG51bGwsXG4gICAgZW1haWxWZXJpZmllZDogY29yZUFjY291bnQuZW1haWxWZXJpZmllZCB8fCBmYWxzZSxcbiAgICBwaG9uZU51bWJlcjogY29yZUFjY291bnQucGhvbmVOdW1iZXIgfHwgbnVsbCxcbiAgICB0ZW5hbnRJZDogY29yZUFjY291bnQudGVuYW50SWQgfHwgbnVsbCxcbiAgICBwcm92aWRlckRhdGEsXG4gICAgbWV0YWRhdGE6IG5ldyBVc2VyTWV0YWRhdGEoY29yZUFjY291bnQuY3JlYXRlZEF0LCBjb3JlQWNjb3VudC5sYXN0TG9naW5BdCksXG4gICAgaXNBbm9ueW1vdXNcbiAgfTtcblxuICBPYmplY3QuYXNzaWduKHVzZXIsIHVwZGF0ZXMpO1xufVxuXG4vKipcbiAqIFJlbG9hZHMgdXNlciBhY2NvdW50IGRhdGEsIGlmIHNpZ25lZCBpbi5cbiAqXG4gKiBAcGFyYW0gdXNlciAtIFRoZSB1c2VyLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbG9hZCh1c2VyOiBVc2VyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHVzZXJJbnRlcm5hbDogVXNlckludGVybmFsID0gZ2V0TW9kdWxhckluc3RhbmNlKHVzZXIpIGFzIFVzZXJJbnRlcm5hbDtcbiAgYXdhaXQgX3JlbG9hZFdpdGhvdXRTYXZpbmcodXNlckludGVybmFsKTtcblxuICAvLyBFdmVuIHRob3VnaCB0aGUgY3VycmVudCB1c2VyIGhhc24ndCBjaGFuZ2VkLCB1cGRhdGVcbiAgLy8gY3VycmVudCB1c2VyIHdpbGwgdHJpZ2dlciBhIHBlcnNpc3RlbmNlIHVwZGF0ZSB3LyB0aGVcbiAgLy8gbmV3IGluZm8uXG4gIGF3YWl0IHVzZXJJbnRlcm5hbC5hdXRoLl9wZXJzaXN0VXNlcklmQ3VycmVudCh1c2VySW50ZXJuYWwpO1xuICB1c2VySW50ZXJuYWwuYXV0aC5fbm90aWZ5TGlzdGVuZXJzSWZDdXJyZW50KHVzZXJJbnRlcm5hbCk7XG59XG5cbmZ1bmN0aW9uIG1lcmdlUHJvdmlkZXJEYXRhKFxuICBvcmlnaW5hbDogVXNlckluZm9bXSxcbiAgbmV3RGF0YTogVXNlckluZm9bXVxuKTogVXNlckluZm9bXSB7XG4gIGNvbnN0IGRlZHVwZWQgPSBvcmlnaW5hbC5maWx0ZXIoXG4gICAgbyA9PiAhbmV3RGF0YS5zb21lKG4gPT4gbi5wcm92aWRlcklkID09PSBvLnByb3ZpZGVySWQpXG4gICk7XG4gIHJldHVybiBbLi4uZGVkdXBlZCwgLi4ubmV3RGF0YV07XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RQcm92aWRlckRhdGEocHJvdmlkZXJzOiBQcm92aWRlclVzZXJJbmZvW10pOiBVc2VySW5mb1tdIHtcbiAgcmV0dXJuIHByb3ZpZGVycy5tYXAoKHsgcHJvdmlkZXJJZCwgLi4ucHJvdmlkZXIgfSkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBwcm92aWRlcklkLFxuICAgICAgdWlkOiBwcm92aWRlci5yYXdJZCB8fCAnJyxcbiAgICAgIGRpc3BsYXlOYW1lOiBwcm92aWRlci5kaXNwbGF5TmFtZSB8fCBudWxsLFxuICAgICAgZW1haWw6IHByb3ZpZGVyLmVtYWlsIHx8IG51bGwsXG4gICAgICBwaG9uZU51bWJlcjogcHJvdmlkZXIucGhvbmVOdW1iZXIgfHwgbnVsbCxcbiAgICAgIHBob3RvVVJMOiBwcm92aWRlci5waG90b1VybCB8fCBudWxsXG4gICAgfTtcbiAgfSk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG5cbmltcG9ydCB7IHF1ZXJ5c3RyaW5nIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuXG5pbXBvcnQge1xuICBfZ2V0RmluYWxUYXJnZXQsXG4gIF9wZXJmb3JtRmV0Y2hXaXRoRXJyb3JIYW5kbGluZyxcbiAgSHR0cE1ldGhvZCxcbiAgSHR0cEhlYWRlclxufSBmcm9tICcuLi9pbmRleCc7XG5pbXBvcnQgeyBGZXRjaFByb3ZpZGVyIH0gZnJvbSAnLi4vLi4vY29yZS91dGlsL2ZldGNoX3Byb3ZpZGVyJztcbmltcG9ydCB7IEF1dGggfSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuaW1wb3J0IHsgQXV0aEludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvYXV0aCc7XG5cbmV4cG9ydCBjb25zdCBlbnVtIEVuZHBvaW50IHtcbiAgVE9LRU4gPSAnL3YxL3Rva2VuJ1xufVxuXG4vKiogVGhlIHNlcnZlciByZXNwb25zZXMgd2l0aCBzbmFrZV9jYXNlOyB3ZSBjb252ZXJ0IHRvIGNhbWVsQ2FzZSAqL1xuaW50ZXJmYWNlIFJlcXVlc3RTdHNUb2tlblNlcnZlclJlc3BvbnNlIHtcbiAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gIGV4cGlyZXNfaW46IHN0cmluZztcbiAgcmVmcmVzaF90b2tlbjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RTdHNUb2tlblJlc3BvbnNlIHtcbiAgYWNjZXNzVG9rZW46IHN0cmluZztcbiAgZXhwaXJlc0luOiBzdHJpbmc7XG4gIHJlZnJlc2hUb2tlbjogc3RyaW5nO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVxdWVzdFN0c1Rva2VuKFxuICBhdXRoOiBBdXRoLFxuICByZWZyZXNoVG9rZW46IHN0cmluZ1xuKTogUHJvbWlzZTxSZXF1ZXN0U3RzVG9rZW5SZXNwb25zZT4ge1xuICBjb25zdCByZXNwb25zZSA9XG4gICAgYXdhaXQgX3BlcmZvcm1GZXRjaFdpdGhFcnJvckhhbmRsaW5nPFJlcXVlc3RTdHNUb2tlblNlcnZlclJlc3BvbnNlPihcbiAgICAgIGF1dGgsXG4gICAgICB7fSxcbiAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgYm9keSA9IHF1ZXJ5c3RyaW5nKHtcbiAgICAgICAgICAnZ3JhbnRfdHlwZSc6ICdyZWZyZXNoX3Rva2VuJyxcbiAgICAgICAgICAncmVmcmVzaF90b2tlbic6IHJlZnJlc2hUb2tlblxuICAgICAgICB9KS5zbGljZSgxKTtcbiAgICAgICAgY29uc3QgeyB0b2tlbkFwaUhvc3QsIGFwaUtleSB9ID0gYXV0aC5jb25maWc7XG4gICAgICAgIGNvbnN0IHVybCA9IF9nZXRGaW5hbFRhcmdldChcbiAgICAgICAgICBhdXRoLFxuICAgICAgICAgIHRva2VuQXBpSG9zdCxcbiAgICAgICAgICBFbmRwb2ludC5UT0tFTixcbiAgICAgICAgICBga2V5PSR7YXBpS2V5fWBcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBoZWFkZXJzID0gYXdhaXQgKGF1dGggYXMgQXV0aEludGVybmFsKS5fZ2V0QWRkaXRpb25hbEhlYWRlcnMoKTtcbiAgICAgICAgaGVhZGVyc1tIdHRwSGVhZGVyLkNPTlRFTlRfVFlQRV0gPSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJztcblxuICAgICAgICByZXR1cm4gRmV0Y2hQcm92aWRlci5mZXRjaCgpKHVybCwge1xuICAgICAgICAgIG1ldGhvZDogSHR0cE1ldGhvZC5QT1NULFxuICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgYm9keVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICApO1xuXG4gIC8vIFRoZSByZXNwb25zZSBjb21lcyBiYWNrIGluIHNuYWtlX2Nhc2UuIENvbnZlcnQgdG8gY2FtZWw6XG4gIHJldHVybiB7XG4gICAgYWNjZXNzVG9rZW46IHJlc3BvbnNlLmFjY2Vzc190b2tlbixcbiAgICBleHBpcmVzSW46IHJlc3BvbnNlLmV4cGlyZXNfaW4sXG4gICAgcmVmcmVzaFRva2VuOiByZXNwb25zZS5yZWZyZXNoX3Rva2VuXG4gIH07XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgRmluYWxpemVNZmFSZXNwb25zZSB9IGZyb20gJy4uLy4uL2FwaS9hdXRoZW50aWNhdGlvbi9tZmEnO1xuaW1wb3J0IHsgcmVxdWVzdFN0c1Rva2VuIH0gZnJvbSAnLi4vLi4vYXBpL2F1dGhlbnRpY2F0aW9uL3Rva2VuJztcbmltcG9ydCB7IEF1dGhJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL2F1dGgnO1xuaW1wb3J0IHsgSWRUb2tlblJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vbW9kZWwvaWRfdG9rZW4nO1xuaW1wb3J0IHsgQXV0aEVycm9yQ29kZSB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBQZXJzaXN0ZWRCbG9iIH0gZnJvbSAnLi4vcGVyc2lzdGVuY2UnO1xuaW1wb3J0IHsgX2Fzc2VydCwgZGVidWdGYWlsIH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQnO1xuaW1wb3J0IHsgX3Rva2VuRXhwaXJlc0luIH0gZnJvbSAnLi9pZF90b2tlbl9yZXN1bHQnO1xuXG4vKipcbiAqIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGJlZm9yZSB0aGUgb2ZmaWNpYWwgZXhwaXJhdGlvbiB0aW1lIG9mIGEgdG9rZW5cbiAqIHRvIHJlZnJlc2ggdGhhdCB0b2tlbiwgdG8gcHJvdmlkZSBhIGJ1ZmZlciBmb3IgUlBDcyB0byBjb21wbGV0ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGVudW0gQnVmZmVyIHtcbiAgVE9LRU5fUkVGUkVTSCA9IDMwXzAwMFxufVxuXG4vKipcbiAqIFdlIG5lZWQgdG8gbWFyayB0aGlzIGNsYXNzIGFzIGludGVybmFsIGV4cGxpY2l0bHkgdG8gZXhjbHVkZSBpdCBpbiB0aGUgcHVibGljIHR5cGluZ3MsIGJlY2F1c2VcbiAqIGl0IHJlZmVyZW5jZXMgQXV0aEludGVybmFsIHdoaWNoIGhhcyBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgd2l0aCBVc2VySW50ZXJuYWwuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBTdHNUb2tlbk1hbmFnZXIge1xuICByZWZyZXNoVG9rZW46IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBhY2Nlc3NUb2tlbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIGV4cGlyYXRpb25UaW1lOiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICBnZXQgaXNFeHBpcmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICAhdGhpcy5leHBpcmF0aW9uVGltZSB8fFxuICAgICAgRGF0ZS5ub3coKSA+IHRoaXMuZXhwaXJhdGlvblRpbWUgLSBCdWZmZXIuVE9LRU5fUkVGUkVTSFxuICAgICk7XG4gIH1cblxuICB1cGRhdGVGcm9tU2VydmVyUmVzcG9uc2UoXG4gICAgcmVzcG9uc2U6IElkVG9rZW5SZXNwb25zZSB8IEZpbmFsaXplTWZhUmVzcG9uc2VcbiAgKTogdm9pZCB7XG4gICAgX2Fzc2VydChyZXNwb25zZS5pZFRva2VuLCBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SKTtcbiAgICBfYXNzZXJ0KFxuICAgICAgdHlwZW9mIHJlc3BvbnNlLmlkVG9rZW4gIT09ICd1bmRlZmluZWQnLFxuICAgICAgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUlxuICAgICk7XG4gICAgX2Fzc2VydChcbiAgICAgIHR5cGVvZiByZXNwb25zZS5yZWZyZXNoVG9rZW4gIT09ICd1bmRlZmluZWQnLFxuICAgICAgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUlxuICAgICk7XG4gICAgY29uc3QgZXhwaXJlc0luID1cbiAgICAgICdleHBpcmVzSW4nIGluIHJlc3BvbnNlICYmIHR5cGVvZiByZXNwb25zZS5leHBpcmVzSW4gIT09ICd1bmRlZmluZWQnXG4gICAgICAgID8gTnVtYmVyKHJlc3BvbnNlLmV4cGlyZXNJbilcbiAgICAgICAgOiBfdG9rZW5FeHBpcmVzSW4ocmVzcG9uc2UuaWRUb2tlbik7XG4gICAgdGhpcy51cGRhdGVUb2tlbnNBbmRFeHBpcmF0aW9uKFxuICAgICAgcmVzcG9uc2UuaWRUb2tlbixcbiAgICAgIHJlc3BvbnNlLnJlZnJlc2hUb2tlbixcbiAgICAgIGV4cGlyZXNJblxuICAgICk7XG4gIH1cblxuICBhc3luYyBnZXRUb2tlbihcbiAgICBhdXRoOiBBdXRoSW50ZXJuYWwsXG4gICAgZm9yY2VSZWZyZXNoID0gZmFsc2VcbiAgKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgX2Fzc2VydChcbiAgICAgICF0aGlzLmFjY2Vzc1Rva2VuIHx8IHRoaXMucmVmcmVzaFRva2VuLFxuICAgICAgYXV0aCxcbiAgICAgIEF1dGhFcnJvckNvZGUuVE9LRU5fRVhQSVJFRFxuICAgICk7XG5cbiAgICBpZiAoIWZvcmNlUmVmcmVzaCAmJiB0aGlzLmFjY2Vzc1Rva2VuICYmICF0aGlzLmlzRXhwaXJlZCkge1xuICAgICAgcmV0dXJuIHRoaXMuYWNjZXNzVG9rZW47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVmcmVzaFRva2VuKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlZnJlc2goYXV0aCwgdGhpcy5yZWZyZXNoVG9rZW4hKTtcbiAgICAgIHJldHVybiB0aGlzLmFjY2Vzc1Rva2VuO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY2xlYXJSZWZyZXNoVG9rZW4oKTogdm9pZCB7XG4gICAgdGhpcy5yZWZyZXNoVG9rZW4gPSBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoKGF1dGg6IEF1dGhJbnRlcm5hbCwgb2xkVG9rZW46IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgYWNjZXNzVG9rZW4sIHJlZnJlc2hUb2tlbiwgZXhwaXJlc0luIH0gPSBhd2FpdCByZXF1ZXN0U3RzVG9rZW4oXG4gICAgICBhdXRoLFxuICAgICAgb2xkVG9rZW5cbiAgICApO1xuICAgIHRoaXMudXBkYXRlVG9rZW5zQW5kRXhwaXJhdGlvbihcbiAgICAgIGFjY2Vzc1Rva2VuLFxuICAgICAgcmVmcmVzaFRva2VuLFxuICAgICAgTnVtYmVyKGV4cGlyZXNJbilcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVUb2tlbnNBbmRFeHBpcmF0aW9uKFxuICAgIGFjY2Vzc1Rva2VuOiBzdHJpbmcsXG4gICAgcmVmcmVzaFRva2VuOiBzdHJpbmcsXG4gICAgZXhwaXJlc0luU2VjOiBudW1iZXJcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5yZWZyZXNoVG9rZW4gPSByZWZyZXNoVG9rZW4gfHwgbnVsbDtcbiAgICB0aGlzLmFjY2Vzc1Rva2VuID0gYWNjZXNzVG9rZW4gfHwgbnVsbDtcbiAgICB0aGlzLmV4cGlyYXRpb25UaW1lID0gRGF0ZS5ub3coKSArIGV4cGlyZXNJblNlYyAqIDEwMDA7XG4gIH1cblxuICBzdGF0aWMgZnJvbUpTT04oYXBwTmFtZTogc3RyaW5nLCBvYmplY3Q6IFBlcnNpc3RlZEJsb2IpOiBTdHNUb2tlbk1hbmFnZXIge1xuICAgIGNvbnN0IHsgcmVmcmVzaFRva2VuLCBhY2Nlc3NUb2tlbiwgZXhwaXJhdGlvblRpbWUgfSA9IG9iamVjdDtcblxuICAgIGNvbnN0IG1hbmFnZXIgPSBuZXcgU3RzVG9rZW5NYW5hZ2VyKCk7XG4gICAgaWYgKHJlZnJlc2hUb2tlbikge1xuICAgICAgX2Fzc2VydCh0eXBlb2YgcmVmcmVzaFRva2VuID09PSAnc3RyaW5nJywgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUiwge1xuICAgICAgICBhcHBOYW1lXG4gICAgICB9KTtcbiAgICAgIG1hbmFnZXIucmVmcmVzaFRva2VuID0gcmVmcmVzaFRva2VuO1xuICAgIH1cbiAgICBpZiAoYWNjZXNzVG9rZW4pIHtcbiAgICAgIF9hc3NlcnQodHlwZW9mIGFjY2Vzc1Rva2VuID09PSAnc3RyaW5nJywgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUiwge1xuICAgICAgICBhcHBOYW1lXG4gICAgICB9KTtcbiAgICAgIG1hbmFnZXIuYWNjZXNzVG9rZW4gPSBhY2Nlc3NUb2tlbjtcbiAgICB9XG4gICAgaWYgKGV4cGlyYXRpb25UaW1lKSB7XG4gICAgICBfYXNzZXJ0KFxuICAgICAgICB0eXBlb2YgZXhwaXJhdGlvblRpbWUgPT09ICdudW1iZXInLFxuICAgICAgICBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SLFxuICAgICAgICB7XG4gICAgICAgICAgYXBwTmFtZVxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgbWFuYWdlci5leHBpcmF0aW9uVGltZSA9IGV4cGlyYXRpb25UaW1lO1xuICAgIH1cbiAgICByZXR1cm4gbWFuYWdlcjtcbiAgfVxuXG4gIHRvSlNPTigpOiBvYmplY3Qge1xuICAgIHJldHVybiB7XG4gICAgICByZWZyZXNoVG9rZW46IHRoaXMucmVmcmVzaFRva2VuLFxuICAgICAgYWNjZXNzVG9rZW46IHRoaXMuYWNjZXNzVG9rZW4sXG4gICAgICBleHBpcmF0aW9uVGltZTogdGhpcy5leHBpcmF0aW9uVGltZVxuICAgIH07XG4gIH1cblxuICBfYXNzaWduKHN0c1Rva2VuTWFuYWdlcjogU3RzVG9rZW5NYW5hZ2VyKTogdm9pZCB7XG4gICAgdGhpcy5hY2Nlc3NUb2tlbiA9IHN0c1Rva2VuTWFuYWdlci5hY2Nlc3NUb2tlbjtcbiAgICB0aGlzLnJlZnJlc2hUb2tlbiA9IHN0c1Rva2VuTWFuYWdlci5yZWZyZXNoVG9rZW47XG4gICAgdGhpcy5leHBpcmF0aW9uVGltZSA9IHN0c1Rva2VuTWFuYWdlci5leHBpcmF0aW9uVGltZTtcbiAgfVxuXG4gIF9jbG9uZSgpOiBTdHNUb2tlbk1hbmFnZXIge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5ldyBTdHNUb2tlbk1hbmFnZXIoKSwgdGhpcy50b0pTT04oKSk7XG4gIH1cblxuICBfcGVyZm9ybVJlZnJlc2goKTogbmV2ZXIge1xuICAgIHJldHVybiBkZWJ1Z0ZhaWwoJ25vdCBpbXBsZW1lbnRlZCcpO1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgSWRUb2tlblJlc3VsdCB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5pbXBvcnQgeyBOZXh0Rm4gfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5cbmltcG9ydCB7XG4gIEFQSVVzZXJJbmZvLFxuICBkZWxldGVBY2NvdW50XG59IGZyb20gJy4uLy4uL2FwaS9hY2NvdW50X21hbmFnZW1lbnQvYWNjb3VudCc7XG5pbXBvcnQgeyBGaW5hbGl6ZU1mYVJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vYXBpL2F1dGhlbnRpY2F0aW9uL21mYSc7XG5pbXBvcnQgeyBBdXRoSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC9hdXRoJztcbmltcG9ydCB7IElkVG9rZW5SZXNwb25zZSB9IGZyb20gJy4uLy4uL21vZGVsL2lkX3Rva2VuJztcbmltcG9ydCB7XG4gIE11dGFibGVVc2VySW5mbyxcbiAgVXNlckludGVybmFsLFxuICBVc2VyUGFyYW1ldGVyc1xufSBmcm9tICcuLi8uLi9tb2RlbC91c2VyJztcbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgUGVyc2lzdGVkQmxvYiB9IGZyb20gJy4uL3BlcnNpc3RlbmNlJztcbmltcG9ydCB7IF9hc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydCc7XG5pbXBvcnQgeyBnZXRJZFRva2VuUmVzdWx0IH0gZnJvbSAnLi9pZF90b2tlbl9yZXN1bHQnO1xuaW1wb3J0IHsgX2xvZ291dElmSW52YWxpZGF0ZWQgfSBmcm9tICcuL2ludmFsaWRhdGlvbic7XG5pbXBvcnQgeyBQcm9hY3RpdmVSZWZyZXNoIH0gZnJvbSAnLi9wcm9hY3RpdmVfcmVmcmVzaCc7XG5pbXBvcnQgeyBfcmVsb2FkV2l0aG91dFNhdmluZywgcmVsb2FkIH0gZnJvbSAnLi9yZWxvYWQnO1xuaW1wb3J0IHsgU3RzVG9rZW5NYW5hZ2VyIH0gZnJvbSAnLi90b2tlbl9tYW5hZ2VyJztcbmltcG9ydCB7IFVzZXJNZXRhZGF0YSB9IGZyb20gJy4vdXNlcl9tZXRhZGF0YSc7XG5pbXBvcnQgeyBQcm92aWRlcklkIH0gZnJvbSAnLi4vLi4vbW9kZWwvZW51bXMnO1xuXG5mdW5jdGlvbiBhc3NlcnRTdHJpbmdPclVuZGVmaW5lZChcbiAgYXNzZXJ0aW9uOiB1bmtub3duLFxuICBhcHBOYW1lOiBzdHJpbmdcbik6IGFzc2VydHMgYXNzZXJ0aW9uIGlzIHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIF9hc3NlcnQoXG4gICAgdHlwZW9mIGFzc2VydGlvbiA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGFzc2VydGlvbiA9PT0gJ3VuZGVmaW5lZCcsXG4gICAgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUixcbiAgICB7IGFwcE5hbWUgfVxuICApO1xufVxuXG5leHBvcnQgY2xhc3MgVXNlckltcGwgaW1wbGVtZW50cyBVc2VySW50ZXJuYWwge1xuICAvLyBGb3IgdGhlIHVzZXIgb2JqZWN0LCBwcm92aWRlciBpcyBhbHdheXMgRmlyZWJhc2UuXG4gIHJlYWRvbmx5IHByb3ZpZGVySWQgPSBQcm92aWRlcklkLkZJUkVCQVNFO1xuICBzdHNUb2tlbk1hbmFnZXI6IFN0c1Rva2VuTWFuYWdlcjtcbiAgLy8gTGFzdCBrbm93biBhY2Nlc3NUb2tlbiBzbyB3ZSBrbm93IHdoZW4gaXQgY2hhbmdlc1xuICBwcml2YXRlIGFjY2Vzc1Rva2VuOiBzdHJpbmcgfCBudWxsO1xuXG4gIHVpZDogc3RyaW5nO1xuICBhdXRoOiBBdXRoSW50ZXJuYWw7XG4gIGVtYWlsVmVyaWZpZWQ6IGJvb2xlYW47XG4gIGlzQW5vbnltb3VzOiBib29sZWFuO1xuICB0ZW5hbnRJZDogc3RyaW5nIHwgbnVsbDtcbiAgcmVhZG9ubHkgbWV0YWRhdGE6IFVzZXJNZXRhZGF0YTtcbiAgcHJvdmlkZXJEYXRhOiBNdXRhYmxlVXNlckluZm9bXTtcblxuICAvLyBPcHRpb25hbCBmaWVsZHMgZnJvbSBVc2VySW5mb1xuICBkaXNwbGF5TmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgZW1haWw6IHN0cmluZyB8IG51bGw7XG4gIHBob25lTnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICBwaG90b1VSTDogc3RyaW5nIHwgbnVsbDtcblxuICBfcmVkaXJlY3RFdmVudElkPzogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHByb2FjdGl2ZVJlZnJlc2ggPSBuZXcgUHJvYWN0aXZlUmVmcmVzaCh0aGlzKTtcblxuICBjb25zdHJ1Y3Rvcih7IHVpZCwgYXV0aCwgc3RzVG9rZW5NYW5hZ2VyLCAuLi5vcHQgfTogVXNlclBhcmFtZXRlcnMpIHtcbiAgICB0aGlzLnVpZCA9IHVpZDtcbiAgICB0aGlzLmF1dGggPSBhdXRoO1xuICAgIHRoaXMuc3RzVG9rZW5NYW5hZ2VyID0gc3RzVG9rZW5NYW5hZ2VyO1xuICAgIHRoaXMuYWNjZXNzVG9rZW4gPSBzdHNUb2tlbk1hbmFnZXIuYWNjZXNzVG9rZW47XG4gICAgdGhpcy5kaXNwbGF5TmFtZSA9IG9wdC5kaXNwbGF5TmFtZSB8fCBudWxsO1xuICAgIHRoaXMuZW1haWwgPSBvcHQuZW1haWwgfHwgbnVsbDtcbiAgICB0aGlzLmVtYWlsVmVyaWZpZWQgPSBvcHQuZW1haWxWZXJpZmllZCB8fCBmYWxzZTtcbiAgICB0aGlzLnBob25lTnVtYmVyID0gb3B0LnBob25lTnVtYmVyIHx8IG51bGw7XG4gICAgdGhpcy5waG90b1VSTCA9IG9wdC5waG90b1VSTCB8fCBudWxsO1xuICAgIHRoaXMuaXNBbm9ueW1vdXMgPSBvcHQuaXNBbm9ueW1vdXMgfHwgZmFsc2U7XG4gICAgdGhpcy50ZW5hbnRJZCA9IG9wdC50ZW5hbnRJZCB8fCBudWxsO1xuICAgIHRoaXMucHJvdmlkZXJEYXRhID0gb3B0LnByb3ZpZGVyRGF0YSA/IFsuLi5vcHQucHJvdmlkZXJEYXRhXSA6IFtdO1xuICAgIHRoaXMubWV0YWRhdGEgPSBuZXcgVXNlck1ldGFkYXRhKFxuICAgICAgb3B0LmNyZWF0ZWRBdCB8fCB1bmRlZmluZWQsXG4gICAgICBvcHQubGFzdExvZ2luQXQgfHwgdW5kZWZpbmVkXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGdldElkVG9rZW4oZm9yY2VSZWZyZXNoPzogYm9vbGVhbik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgYWNjZXNzVG9rZW4gPSBhd2FpdCBfbG9nb3V0SWZJbnZhbGlkYXRlZChcbiAgICAgIHRoaXMsXG4gICAgICB0aGlzLnN0c1Rva2VuTWFuYWdlci5nZXRUb2tlbih0aGlzLmF1dGgsIGZvcmNlUmVmcmVzaClcbiAgICApO1xuICAgIF9hc3NlcnQoYWNjZXNzVG9rZW4sIHRoaXMuYXV0aCwgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUik7XG5cbiAgICBpZiAodGhpcy5hY2Nlc3NUb2tlbiAhPT0gYWNjZXNzVG9rZW4pIHtcbiAgICAgIHRoaXMuYWNjZXNzVG9rZW4gPSBhY2Nlc3NUb2tlbjtcbiAgICAgIGF3YWl0IHRoaXMuYXV0aC5fcGVyc2lzdFVzZXJJZkN1cnJlbnQodGhpcyk7XG4gICAgICB0aGlzLmF1dGguX25vdGlmeUxpc3RlbmVyc0lmQ3VycmVudCh0aGlzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWNjZXNzVG9rZW47XG4gIH1cblxuICBnZXRJZFRva2VuUmVzdWx0KGZvcmNlUmVmcmVzaD86IGJvb2xlYW4pOiBQcm9taXNlPElkVG9rZW5SZXN1bHQ+IHtcbiAgICByZXR1cm4gZ2V0SWRUb2tlblJlc3VsdCh0aGlzLCBmb3JjZVJlZnJlc2gpO1xuICB9XG5cbiAgcmVsb2FkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiByZWxvYWQodGhpcyk7XG4gIH1cblxuICBwcml2YXRlIHJlbG9hZFVzZXJJbmZvOiBBUElVc2VySW5mbyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlbG9hZExpc3RlbmVyOiBOZXh0Rm48QVBJVXNlckluZm8+IHwgbnVsbCA9IG51bGw7XG5cbiAgX2Fzc2lnbih1c2VyOiBVc2VySW50ZXJuYWwpOiB2b2lkIHtcbiAgICBpZiAodGhpcyA9PT0gdXNlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBfYXNzZXJ0KHRoaXMudWlkID09PSB1c2VyLnVpZCwgdGhpcy5hdXRoLCBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SKTtcbiAgICB0aGlzLmRpc3BsYXlOYW1lID0gdXNlci5kaXNwbGF5TmFtZTtcbiAgICB0aGlzLnBob3RvVVJMID0gdXNlci5waG90b1VSTDtcbiAgICB0aGlzLmVtYWlsID0gdXNlci5lbWFpbDtcbiAgICB0aGlzLmVtYWlsVmVyaWZpZWQgPSB1c2VyLmVtYWlsVmVyaWZpZWQ7XG4gICAgdGhpcy5waG9uZU51bWJlciA9IHVzZXIucGhvbmVOdW1iZXI7XG4gICAgdGhpcy5pc0Fub255bW91cyA9IHVzZXIuaXNBbm9ueW1vdXM7XG4gICAgdGhpcy50ZW5hbnRJZCA9IHVzZXIudGVuYW50SWQ7XG4gICAgdGhpcy5wcm92aWRlckRhdGEgPSB1c2VyLnByb3ZpZGVyRGF0YS5tYXAodXNlckluZm8gPT4gKHsgLi4udXNlckluZm8gfSkpO1xuICAgIHRoaXMubWV0YWRhdGEuX2NvcHkodXNlci5tZXRhZGF0YSk7XG4gICAgdGhpcy5zdHNUb2tlbk1hbmFnZXIuX2Fzc2lnbih1c2VyLnN0c1Rva2VuTWFuYWdlcik7XG4gIH1cblxuICBfY2xvbmUoYXV0aDogQXV0aEludGVybmFsKTogVXNlckludGVybmFsIHtcbiAgICBjb25zdCBuZXdVc2VyID0gbmV3IFVzZXJJbXBsKHtcbiAgICAgIC4uLnRoaXMsXG4gICAgICBhdXRoLFxuICAgICAgc3RzVG9rZW5NYW5hZ2VyOiB0aGlzLnN0c1Rva2VuTWFuYWdlci5fY2xvbmUoKVxuICAgIH0pO1xuICAgIG5ld1VzZXIubWV0YWRhdGEuX2NvcHkodGhpcy5tZXRhZGF0YSk7XG4gICAgcmV0dXJuIG5ld1VzZXI7XG4gIH1cblxuICBfb25SZWxvYWQoY2FsbGJhY2s6IE5leHRGbjxBUElVc2VySW5mbz4pOiB2b2lkIHtcbiAgICAvLyBUaGVyZSBzaG91bGQgb25seSBldmVyIGJlIG9uZSBsaXN0ZW5lciwgYW5kIHRoYXQgaXMgYSBzaW5nbGUgaW5zdGFuY2Ugb2YgTXVsdGlGYWN0b3JVc2VyXG4gICAgX2Fzc2VydCghdGhpcy5yZWxvYWRMaXN0ZW5lciwgdGhpcy5hdXRoLCBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SKTtcbiAgICB0aGlzLnJlbG9hZExpc3RlbmVyID0gY2FsbGJhY2s7XG4gICAgaWYgKHRoaXMucmVsb2FkVXNlckluZm8pIHtcbiAgICAgIHRoaXMuX25vdGlmeVJlbG9hZExpc3RlbmVyKHRoaXMucmVsb2FkVXNlckluZm8pO1xuICAgICAgdGhpcy5yZWxvYWRVc2VySW5mbyA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgX25vdGlmeVJlbG9hZExpc3RlbmVyKHVzZXJJbmZvOiBBUElVc2VySW5mbyk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlbG9hZExpc3RlbmVyKSB7XG4gICAgICB0aGlzLnJlbG9hZExpc3RlbmVyKHVzZXJJbmZvKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgbm8gbGlzdGVuZXIgaXMgc3Vic2NyaWJlZCB5ZXQsIHNhdmUgdGhlIHJlc3VsdCBzbyBpdCdzIGF2YWlsYWJsZSB3aGVuIHRoZXkgZG8gc3Vic2NyaWJlXG4gICAgICB0aGlzLnJlbG9hZFVzZXJJbmZvID0gdXNlckluZm87XG4gICAgfVxuICB9XG5cbiAgX3N0YXJ0UHJvYWN0aXZlUmVmcmVzaCgpOiB2b2lkIHtcbiAgICB0aGlzLnByb2FjdGl2ZVJlZnJlc2guX3N0YXJ0KCk7XG4gIH1cblxuICBfc3RvcFByb2FjdGl2ZVJlZnJlc2goKTogdm9pZCB7XG4gICAgdGhpcy5wcm9hY3RpdmVSZWZyZXNoLl9zdG9wKCk7XG4gIH1cblxuICBhc3luYyBfdXBkYXRlVG9rZW5zSWZOZWNlc3NhcnkoXG4gICAgcmVzcG9uc2U6IElkVG9rZW5SZXNwb25zZSB8IEZpbmFsaXplTWZhUmVzcG9uc2UsXG4gICAgcmVsb2FkID0gZmFsc2VcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IHRva2Vuc1JlZnJlc2hlZCA9IGZhbHNlO1xuICAgIGlmIChcbiAgICAgIHJlc3BvbnNlLmlkVG9rZW4gJiZcbiAgICAgIHJlc3BvbnNlLmlkVG9rZW4gIT09IHRoaXMuc3RzVG9rZW5NYW5hZ2VyLmFjY2Vzc1Rva2VuXG4gICAgKSB7XG4gICAgICB0aGlzLnN0c1Rva2VuTWFuYWdlci51cGRhdGVGcm9tU2VydmVyUmVzcG9uc2UocmVzcG9uc2UpO1xuICAgICAgdG9rZW5zUmVmcmVzaGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAocmVsb2FkKSB7XG4gICAgICBhd2FpdCBfcmVsb2FkV2l0aG91dFNhdmluZyh0aGlzKTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmF1dGguX3BlcnNpc3RVc2VySWZDdXJyZW50KHRoaXMpO1xuICAgIGlmICh0b2tlbnNSZWZyZXNoZWQpIHtcbiAgICAgIHRoaXMuYXV0aC5fbm90aWZ5TGlzdGVuZXJzSWZDdXJyZW50KHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpZFRva2VuID0gYXdhaXQgdGhpcy5nZXRJZFRva2VuKCk7XG4gICAgYXdhaXQgX2xvZ291dElmSW52YWxpZGF0ZWQodGhpcywgZGVsZXRlQWNjb3VudCh0aGlzLmF1dGgsIHsgaWRUb2tlbiB9KSk7XG4gICAgdGhpcy5zdHNUb2tlbk1hbmFnZXIuY2xlYXJSZWZyZXNoVG9rZW4oKTtcblxuICAgIC8vIFRPRE86IERldGVybWluZSBpZiBjYW5jZWxsYWJsZS1wcm9taXNlcyBhcmUgbmVjZXNzYXJ5IHRvIHVzZSBpbiB0aGlzIGNsYXNzIHNvIHRoYXQgZGVsZXRlKClcbiAgICAvLyAgICAgICBjYW5jZWxzIHBlbmRpbmcgYWN0aW9ucy4uLlxuXG4gICAgcmV0dXJuIHRoaXMuYXV0aC5zaWduT3V0KCk7XG4gIH1cblxuICB0b0pTT04oKTogUGVyc2lzdGVkQmxvYiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHVpZDogdGhpcy51aWQsXG4gICAgICBlbWFpbDogdGhpcy5lbWFpbCB8fCB1bmRlZmluZWQsXG4gICAgICBlbWFpbFZlcmlmaWVkOiB0aGlzLmVtYWlsVmVyaWZpZWQsXG4gICAgICBkaXNwbGF5TmFtZTogdGhpcy5kaXNwbGF5TmFtZSB8fCB1bmRlZmluZWQsXG4gICAgICBpc0Fub255bW91czogdGhpcy5pc0Fub255bW91cyxcbiAgICAgIHBob3RvVVJMOiB0aGlzLnBob3RvVVJMIHx8IHVuZGVmaW5lZCxcbiAgICAgIHBob25lTnVtYmVyOiB0aGlzLnBob25lTnVtYmVyIHx8IHVuZGVmaW5lZCxcbiAgICAgIHRlbmFudElkOiB0aGlzLnRlbmFudElkIHx8IHVuZGVmaW5lZCxcbiAgICAgIHByb3ZpZGVyRGF0YTogdGhpcy5wcm92aWRlckRhdGEubWFwKHVzZXJJbmZvID0+ICh7IC4uLnVzZXJJbmZvIH0pKSxcbiAgICAgIHN0c1Rva2VuTWFuYWdlcjogdGhpcy5zdHNUb2tlbk1hbmFnZXIudG9KU09OKCksXG4gICAgICAvLyBSZWRpcmVjdCBldmVudCBJRCBtdXN0IGJlIG1haW50YWluZWQgaW4gY2FzZSB0aGVyZSBpcyBhIHBlbmRpbmdcbiAgICAgIC8vIHJlZGlyZWN0IGV2ZW50LlxuICAgICAgX3JlZGlyZWN0RXZlbnRJZDogdGhpcy5fcmVkaXJlY3RFdmVudElkLFxuICAgICAgLi4udGhpcy5tZXRhZGF0YS50b0pTT04oKSxcblxuICAgICAgLy8gUmVxdWlyZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgbGVnYWN5IFNESyAoZ28vZmlyZWJhc2UtYXV0aC1zZGstcGVyc2lzdGVuY2UtcGFyc2luZyk6XG4gICAgICBhcGlLZXk6IHRoaXMuYXV0aC5jb25maWcuYXBpS2V5LFxuICAgICAgYXBwTmFtZTogdGhpcy5hdXRoLm5hbWVcbiAgICAgIC8vIE1pc3NpbmcgYXV0aERvbWFpbiB3aWxsIGJlIHRvbGVyYXRlZCBieSB0aGUgbGVnYWN5IFNESy5cbiAgICAgIC8vIHN0c1Rva2VuTWFuYWdlci5hcGlLZXkgaXNuJ3QgYWN0dWFsbHkgcmVxdWlyZWQgKGRlc3BpdGUgdGhlIGxlZ2FjeSBTREsgcGVyc2lzdGluZyBpdCkuXG4gICAgfTtcbiAgfVxuXG4gIGdldCByZWZyZXNoVG9rZW4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zdHNUb2tlbk1hbmFnZXIucmVmcmVzaFRva2VuIHx8ICcnO1xuICB9XG5cbiAgc3RhdGljIF9mcm9tSlNPTihhdXRoOiBBdXRoSW50ZXJuYWwsIG9iamVjdDogUGVyc2lzdGVkQmxvYik6IFVzZXJJbnRlcm5hbCB7XG4gICAgY29uc3QgZGlzcGxheU5hbWUgPSBvYmplY3QuZGlzcGxheU5hbWUgPz8gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGVtYWlsID0gb2JqZWN0LmVtYWlsID8/IHVuZGVmaW5lZDtcbiAgICBjb25zdCBwaG9uZU51bWJlciA9IG9iamVjdC5waG9uZU51bWJlciA/PyB1bmRlZmluZWQ7XG4gICAgY29uc3QgcGhvdG9VUkwgPSBvYmplY3QucGhvdG9VUkwgPz8gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHRlbmFudElkID0gb2JqZWN0LnRlbmFudElkID8/IHVuZGVmaW5lZDtcbiAgICBjb25zdCBfcmVkaXJlY3RFdmVudElkID0gb2JqZWN0Ll9yZWRpcmVjdEV2ZW50SWQgPz8gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNyZWF0ZWRBdCA9IG9iamVjdC5jcmVhdGVkQXQgPz8gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGxhc3RMb2dpbkF0ID0gb2JqZWN0Lmxhc3RMb2dpbkF0ID8/IHVuZGVmaW5lZDtcbiAgICBjb25zdCB7XG4gICAgICB1aWQsXG4gICAgICBlbWFpbFZlcmlmaWVkLFxuICAgICAgaXNBbm9ueW1vdXMsXG4gICAgICBwcm92aWRlckRhdGEsXG4gICAgICBzdHNUb2tlbk1hbmFnZXI6IHBsYWluT2JqZWN0VG9rZW5NYW5hZ2VyXG4gICAgfSA9IG9iamVjdDtcblxuICAgIF9hc3NlcnQodWlkICYmIHBsYWluT2JqZWN0VG9rZW5NYW5hZ2VyLCBhdXRoLCBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SKTtcblxuICAgIGNvbnN0IHN0c1Rva2VuTWFuYWdlciA9IFN0c1Rva2VuTWFuYWdlci5mcm9tSlNPTihcbiAgICAgIHRoaXMubmFtZSxcbiAgICAgIHBsYWluT2JqZWN0VG9rZW5NYW5hZ2VyIGFzIFBlcnNpc3RlZEJsb2JcbiAgICApO1xuXG4gICAgX2Fzc2VydCh0eXBlb2YgdWlkID09PSAnc3RyaW5nJywgYXV0aCwgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUik7XG4gICAgYXNzZXJ0U3RyaW5nT3JVbmRlZmluZWQoZGlzcGxheU5hbWUsIGF1dGgubmFtZSk7XG4gICAgYXNzZXJ0U3RyaW5nT3JVbmRlZmluZWQoZW1haWwsIGF1dGgubmFtZSk7XG4gICAgX2Fzc2VydChcbiAgICAgIHR5cGVvZiBlbWFpbFZlcmlmaWVkID09PSAnYm9vbGVhbicsXG4gICAgICBhdXRoLFxuICAgICAgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUlxuICAgICk7XG4gICAgX2Fzc2VydChcbiAgICAgIHR5cGVvZiBpc0Fub255bW91cyA9PT0gJ2Jvb2xlYW4nLFxuICAgICAgYXV0aCxcbiAgICAgIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1JcbiAgICApO1xuICAgIGFzc2VydFN0cmluZ09yVW5kZWZpbmVkKHBob25lTnVtYmVyLCBhdXRoLm5hbWUpO1xuICAgIGFzc2VydFN0cmluZ09yVW5kZWZpbmVkKHBob3RvVVJMLCBhdXRoLm5hbWUpO1xuICAgIGFzc2VydFN0cmluZ09yVW5kZWZpbmVkKHRlbmFudElkLCBhdXRoLm5hbWUpO1xuICAgIGFzc2VydFN0cmluZ09yVW5kZWZpbmVkKF9yZWRpcmVjdEV2ZW50SWQsIGF1dGgubmFtZSk7XG4gICAgYXNzZXJ0U3RyaW5nT3JVbmRlZmluZWQoY3JlYXRlZEF0LCBhdXRoLm5hbWUpO1xuICAgIGFzc2VydFN0cmluZ09yVW5kZWZpbmVkKGxhc3RMb2dpbkF0LCBhdXRoLm5hbWUpO1xuICAgIGNvbnN0IHVzZXIgPSBuZXcgVXNlckltcGwoe1xuICAgICAgdWlkLFxuICAgICAgYXV0aCxcbiAgICAgIGVtYWlsLFxuICAgICAgZW1haWxWZXJpZmllZCxcbiAgICAgIGRpc3BsYXlOYW1lLFxuICAgICAgaXNBbm9ueW1vdXMsXG4gICAgICBwaG90b1VSTCxcbiAgICAgIHBob25lTnVtYmVyLFxuICAgICAgdGVuYW50SWQsXG4gICAgICBzdHNUb2tlbk1hbmFnZXIsXG4gICAgICBjcmVhdGVkQXQsXG4gICAgICBsYXN0TG9naW5BdFxuICAgIH0pO1xuXG4gICAgaWYgKHByb3ZpZGVyRGF0YSAmJiBBcnJheS5pc0FycmF5KHByb3ZpZGVyRGF0YSkpIHtcbiAgICAgIHVzZXIucHJvdmlkZXJEYXRhID0gcHJvdmlkZXJEYXRhLm1hcCh1c2VySW5mbyA9PiAoeyAuLi51c2VySW5mbyB9KSk7XG4gICAgfVxuXG4gICAgaWYgKF9yZWRpcmVjdEV2ZW50SWQpIHtcbiAgICAgIHVzZXIuX3JlZGlyZWN0RXZlbnRJZCA9IF9yZWRpcmVjdEV2ZW50SWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVzZXI7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBhIFVzZXIgZnJvbSBhbiBpZFRva2VuIHNlcnZlciByZXNwb25zZVxuICAgKiBAcGFyYW0gYXV0aFxuICAgKiBAcGFyYW0gaWRUb2tlblJlc3BvbnNlXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgX2Zyb21JZFRva2VuUmVzcG9uc2UoXG4gICAgYXV0aDogQXV0aEludGVybmFsLFxuICAgIGlkVG9rZW5SZXNwb25zZTogSWRUb2tlblJlc3BvbnNlLFxuICAgIGlzQW5vbnltb3VzOiBib29sZWFuID0gZmFsc2VcbiAgKTogUHJvbWlzZTxVc2VySW50ZXJuYWw+IHtcbiAgICBjb25zdCBzdHNUb2tlbk1hbmFnZXIgPSBuZXcgU3RzVG9rZW5NYW5hZ2VyKCk7XG4gICAgc3RzVG9rZW5NYW5hZ2VyLnVwZGF0ZUZyb21TZXJ2ZXJSZXNwb25zZShpZFRva2VuUmVzcG9uc2UpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgRmlyZWJhc2UgQXV0aCB1c2VyLlxuICAgIGNvbnN0IHVzZXIgPSBuZXcgVXNlckltcGwoe1xuICAgICAgdWlkOiBpZFRva2VuUmVzcG9uc2UubG9jYWxJZCxcbiAgICAgIGF1dGgsXG4gICAgICBzdHNUb2tlbk1hbmFnZXIsXG4gICAgICBpc0Fub255bW91c1xuICAgIH0pO1xuXG4gICAgLy8gVXBkYXRlcyB0aGUgdXNlciBpbmZvIGFuZCBkYXRhIGFuZCByZXNvbHZlcyB3aXRoIGEgdXNlciBpbnN0YW5jZS5cbiAgICBhd2FpdCBfcmVsb2FkV2l0aG91dFNhdmluZyh1c2VyKTtcbiAgICByZXR1cm4gdXNlcjtcbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IGRlYnVnQXNzZXJ0IH0gZnJvbSAnLi9hc3NlcnQnO1xuXG4vKipcbiAqIE91ciBBUEkgaGFzIGEgbG90IG9mIG9uZS1vZmYgY29uc3RhbnRzIHRoYXQgYXJlIHVzZWQgdG8gZG8gdGhpbmdzLlxuICogVW5mb3J0dW5hdGVseSB3ZSBjYW4ndCBleHBvcnQgdGhlc2UgYXMgY2xhc3NlcyBpbnN0YW50aWF0ZWQgZGlyZWN0bHkgc2luY2VcbiAqIHRoZSBjb25zdHJ1Y3RvciBtYXkgc2lkZSBlZmZlY3QgYW5kIHRoZXJlZm9yZSBjYW4ndCBiZSBwcm92ZW4gdG8gYmUgc2FmZWx5XG4gKiBjdWxsZWQuIEluc3RlYWQsIHdlIGV4cG9ydCB0aGVzZSBjbGFzc2VzIHRoZW1zZWx2ZXMgYXMgYSBsb3dlckNhbWVsQ2FzZVxuICogY29uc3RhbnQsIGFuZCBpbnN0YW50aWF0ZSB0aGVtIHVuZGVyIHRoZSBob29kLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpbmdsZXRvbkluc3RhbnRpYXRvcjxUPiB7XG4gIG5ldyAoKTogVDtcbn1cblxuY29uc3QgaW5zdGFuY2VDYWNoZTogTWFwPHVua25vd24sIHVua25vd24+ID0gbmV3IE1hcCgpO1xuXG5leHBvcnQgZnVuY3Rpb24gX2dldEluc3RhbmNlPFQ+KGNsczogdW5rbm93bik6IFQge1xuICBkZWJ1Z0Fzc2VydChjbHMgaW5zdGFuY2VvZiBGdW5jdGlvbiwgJ0V4cGVjdGVkIGEgY2xhc3MgZGVmaW5pdGlvbicpO1xuICBsZXQgaW5zdGFuY2UgPSBpbnN0YW5jZUNhY2hlLmdldChjbHMpIGFzIFQgfCB1bmRlZmluZWQ7XG5cbiAgaWYgKGluc3RhbmNlKSB7XG4gICAgZGVidWdBc3NlcnQoXG4gICAgICBpbnN0YW5jZSBpbnN0YW5jZW9mIGNscyxcbiAgICAgICdJbnN0YW5jZSBzdG9yZWQgaW4gY2FjaGUgbWlzbWF0Y2hlZCB3aXRoIGNsYXNzJ1xuICAgICk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgaW5zdGFuY2UgPSBuZXcgKGNscyBhcyBTaW5nbGV0b25JbnN0YW50aWF0b3I8VD4pKCk7XG4gIGluc3RhbmNlQ2FjaGUuc2V0KGNscywgaW5zdGFuY2UpO1xuICByZXR1cm4gaW5zdGFuY2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfY2xlYXJJbnN0YW5jZU1hcCgpOiB2b2lkIHtcbiAgaW5zdGFuY2VDYWNoZS5jbGVhcigpO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IFBlcnNpc3RlbmNlIH0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcblxuaW1wb3J0IHtcbiAgUGVyc2lzdGVuY2VJbnRlcm5hbCxcbiAgUGVyc2lzdGVuY2VUeXBlLFxuICBQZXJzaXN0ZW5jZVZhbHVlLFxuICBTdG9yYWdlRXZlbnRMaXN0ZW5lclxufSBmcm9tICcuLi9wZXJzaXN0ZW5jZSc7XG5cbmV4cG9ydCBjbGFzcyBJbk1lbW9yeVBlcnNpc3RlbmNlIGltcGxlbWVudHMgUGVyc2lzdGVuY2VJbnRlcm5hbCB7XG4gIHN0YXRpYyB0eXBlOiAnTk9ORScgPSAnTk9ORSc7XG4gIHJlYWRvbmx5IHR5cGUgPSBQZXJzaXN0ZW5jZVR5cGUuTk9ORTtcbiAgc3RvcmFnZTogUmVjb3JkPHN0cmluZywgUGVyc2lzdGVuY2VWYWx1ZT4gPSB7fTtcblxuICBhc3luYyBfaXNBdmFpbGFibGUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBhc3luYyBfc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogUGVyc2lzdGVuY2VWYWx1ZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc3RvcmFnZVtrZXldID0gdmFsdWU7XG4gIH1cblxuICBhc3luYyBfZ2V0PFQgZXh0ZW5kcyBQZXJzaXN0ZW5jZVZhbHVlPihrZXk6IHN0cmluZyk6IFByb21pc2U8VCB8IG51bGw+IHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuc3RvcmFnZVtrZXldO1xuICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6ICh2YWx1ZSBhcyBUKTtcbiAgfVxuXG4gIGFzeW5jIF9yZW1vdmUoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBkZWxldGUgdGhpcy5zdG9yYWdlW2tleV07XG4gIH1cblxuICBfYWRkTGlzdGVuZXIoX2tleTogc3RyaW5nLCBfbGlzdGVuZXI6IFN0b3JhZ2VFdmVudExpc3RlbmVyKTogdm9pZCB7XG4gICAgLy8gTGlzdGVuZXJzIGFyZSBub3Qgc3VwcG9ydGVkIGZvciBpbi1tZW1vcnkgc3RvcmFnZSBzaW5jZSBpdCBjYW5ub3QgYmUgc2hhcmVkIGFjcm9zcyB3aW5kb3dzL3dvcmtlcnNcbiAgICByZXR1cm47XG4gIH1cblxuICBfcmVtb3ZlTGlzdGVuZXIoX2tleTogc3RyaW5nLCBfbGlzdGVuZXI6IFN0b3JhZ2VFdmVudExpc3RlbmVyKTogdm9pZCB7XG4gICAgLy8gTGlzdGVuZXJzIGFyZSBub3Qgc3VwcG9ydGVkIGZvciBpbi1tZW1vcnkgc3RvcmFnZSBzaW5jZSBpdCBjYW5ub3QgYmUgc2hhcmVkIGFjcm9zcyB3aW5kb3dzL3dvcmtlcnNcbiAgICByZXR1cm47XG4gIH1cbn1cblxuLyoqXG4gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgUGVyc2lzdGVuY2V9IG9mIHR5cGUgJ05PTkUnLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGluTWVtb3J5UGVyc2lzdGVuY2U6IFBlcnNpc3RlbmNlID0gSW5NZW1vcnlQZXJzaXN0ZW5jZTtcbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBBcGlLZXksIEFwcE5hbWUsIEF1dGhJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL2F1dGgnO1xuaW1wb3J0IHsgVXNlckludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvdXNlcic7XG5pbXBvcnQgeyBQZXJzaXN0ZWRCbG9iLCBQZXJzaXN0ZW5jZUludGVybmFsIH0gZnJvbSAnLi4vcGVyc2lzdGVuY2UnO1xuaW1wb3J0IHsgVXNlckltcGwgfSBmcm9tICcuLi91c2VyL3VzZXJfaW1wbCc7XG5pbXBvcnQgeyBfZ2V0SW5zdGFuY2UgfSBmcm9tICcuLi91dGlsL2luc3RhbnRpYXRvcic7XG5pbXBvcnQgeyBpbk1lbW9yeVBlcnNpc3RlbmNlIH0gZnJvbSAnLi9pbl9tZW1vcnknO1xuXG5leHBvcnQgY29uc3QgZW51bSBLZXlOYW1lIHtcbiAgQVVUSF9VU0VSID0gJ2F1dGhVc2VyJyxcbiAgQVVUSF9FVkVOVCA9ICdhdXRoRXZlbnQnLFxuICBSRURJUkVDVF9VU0VSID0gJ3JlZGlyZWN0VXNlcicsXG4gIFBFUlNJU1RFTkNFX1VTRVIgPSAncGVyc2lzdGVuY2UnXG59XG5leHBvcnQgY29uc3QgZW51bSBOYW1lc3BhY2Uge1xuICBQRVJTSVNURU5DRSA9ICdmaXJlYmFzZSdcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9wZXJzaXN0ZW5jZUtleU5hbWUoXG4gIGtleTogc3RyaW5nLFxuICBhcGlLZXk6IEFwaUtleSxcbiAgYXBwTmFtZTogQXBwTmFtZVxuKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke05hbWVzcGFjZS5QRVJTSVNURU5DRX06JHtrZXl9OiR7YXBpS2V5fToke2FwcE5hbWV9YDtcbn1cblxuZXhwb3J0IGNsYXNzIFBlcnNpc3RlbmNlVXNlck1hbmFnZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGZ1bGxVc2VyS2V5OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZnVsbFBlcnNpc3RlbmNlS2V5OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgYm91bmRFdmVudEhhbmRsZXI6ICgpID0+IHZvaWQ7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcGVyc2lzdGVuY2U6IFBlcnNpc3RlbmNlSW50ZXJuYWwsXG4gICAgcHJpdmF0ZSByZWFkb25seSBhdXRoOiBBdXRoSW50ZXJuYWwsXG4gICAgcHJpdmF0ZSByZWFkb25seSB1c2VyS2V5OiBzdHJpbmdcbiAgKSB7XG4gICAgY29uc3QgeyBjb25maWcsIG5hbWUgfSA9IHRoaXMuYXV0aDtcbiAgICB0aGlzLmZ1bGxVc2VyS2V5ID0gX3BlcnNpc3RlbmNlS2V5TmFtZSh0aGlzLnVzZXJLZXksIGNvbmZpZy5hcGlLZXksIG5hbWUpO1xuICAgIHRoaXMuZnVsbFBlcnNpc3RlbmNlS2V5ID0gX3BlcnNpc3RlbmNlS2V5TmFtZShcbiAgICAgIEtleU5hbWUuUEVSU0lTVEVOQ0VfVVNFUixcbiAgICAgIGNvbmZpZy5hcGlLZXksXG4gICAgICBuYW1lXG4gICAgKTtcbiAgICB0aGlzLmJvdW5kRXZlbnRIYW5kbGVyID0gYXV0aC5fb25TdG9yYWdlRXZlbnQuYmluZChhdXRoKTtcbiAgICB0aGlzLnBlcnNpc3RlbmNlLl9hZGRMaXN0ZW5lcih0aGlzLmZ1bGxVc2VyS2V5LCB0aGlzLmJvdW5kRXZlbnRIYW5kbGVyKTtcbiAgfVxuXG4gIHNldEN1cnJlbnRVc2VyKHVzZXI6IFVzZXJJbnRlcm5hbCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnBlcnNpc3RlbmNlLl9zZXQodGhpcy5mdWxsVXNlcktleSwgdXNlci50b0pTT04oKSk7XG4gIH1cblxuICBhc3luYyBnZXRDdXJyZW50VXNlcigpOiBQcm9taXNlPFVzZXJJbnRlcm5hbCB8IG51bGw+IHtcbiAgICBjb25zdCBibG9iID0gYXdhaXQgdGhpcy5wZXJzaXN0ZW5jZS5fZ2V0PFBlcnNpc3RlZEJsb2I+KHRoaXMuZnVsbFVzZXJLZXkpO1xuICAgIHJldHVybiBibG9iID8gVXNlckltcGwuX2Zyb21KU09OKHRoaXMuYXV0aCwgYmxvYikgOiBudWxsO1xuICB9XG5cbiAgcmVtb3ZlQ3VycmVudFVzZXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMucGVyc2lzdGVuY2UuX3JlbW92ZSh0aGlzLmZ1bGxVc2VyS2V5KTtcbiAgfVxuXG4gIHNhdmVQZXJzaXN0ZW5jZUZvclJlZGlyZWN0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnBlcnNpc3RlbmNlLl9zZXQoXG4gICAgICB0aGlzLmZ1bGxQZXJzaXN0ZW5jZUtleSxcbiAgICAgIHRoaXMucGVyc2lzdGVuY2UudHlwZVxuICAgICk7XG4gIH1cblxuICBhc3luYyBzZXRQZXJzaXN0ZW5jZShuZXdQZXJzaXN0ZW5jZTogUGVyc2lzdGVuY2VJbnRlcm5hbCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLnBlcnNpc3RlbmNlID09PSBuZXdQZXJzaXN0ZW5jZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRVc2VyID0gYXdhaXQgdGhpcy5nZXRDdXJyZW50VXNlcigpO1xuICAgIGF3YWl0IHRoaXMucmVtb3ZlQ3VycmVudFVzZXIoKTtcblxuICAgIHRoaXMucGVyc2lzdGVuY2UgPSBuZXdQZXJzaXN0ZW5jZTtcblxuICAgIGlmIChjdXJyZW50VXNlcikge1xuICAgICAgcmV0dXJuIHRoaXMuc2V0Q3VycmVudFVzZXIoY3VycmVudFVzZXIpO1xuICAgIH1cbiAgfVxuXG4gIGRlbGV0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLnBlcnNpc3RlbmNlLl9yZW1vdmVMaXN0ZW5lcih0aGlzLmZ1bGxVc2VyS2V5LCB0aGlzLmJvdW5kRXZlbnRIYW5kbGVyKTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBjcmVhdGUoXG4gICAgYXV0aDogQXV0aEludGVybmFsLFxuICAgIHBlcnNpc3RlbmNlSGllcmFyY2h5OiBQZXJzaXN0ZW5jZUludGVybmFsW10sXG4gICAgdXNlcktleSA9IEtleU5hbWUuQVVUSF9VU0VSXG4gICk6IFByb21pc2U8UGVyc2lzdGVuY2VVc2VyTWFuYWdlcj4ge1xuICAgIGlmICghcGVyc2lzdGVuY2VIaWVyYXJjaHkubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbmV3IFBlcnNpc3RlbmNlVXNlck1hbmFnZXIoXG4gICAgICAgIF9nZXRJbnN0YW5jZShpbk1lbW9yeVBlcnNpc3RlbmNlKSxcbiAgICAgICAgYXV0aCxcbiAgICAgICAgdXNlcktleVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBFbGltaW5hdGUgYW55IHBlcnNpc3RlbmNlcyB0aGF0IGFyZSBub3QgYXZhaWxhYmxlXG4gICAgY29uc3QgYXZhaWxhYmxlUGVyc2lzdGVuY2VzID0gKFxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHBlcnNpc3RlbmNlSGllcmFyY2h5Lm1hcChhc3luYyBwZXJzaXN0ZW5jZSA9PiB7XG4gICAgICAgICAgaWYgKGF3YWl0IHBlcnNpc3RlbmNlLl9pc0F2YWlsYWJsZSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gcGVyc2lzdGVuY2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgKS5maWx0ZXIocGVyc2lzdGVuY2UgPT4gcGVyc2lzdGVuY2UpIGFzIFBlcnNpc3RlbmNlSW50ZXJuYWxbXTtcblxuICAgIC8vIEZhbGwgYmFjayB0byB0aGUgZmlyc3QgcGVyc2lzdGVuY2UgbGlzdGVkLCBvciBpbiBtZW1vcnkgaWYgbm9uZSBhdmFpbGFibGVcbiAgICBsZXQgc2VsZWN0ZWRQZXJzaXN0ZW5jZSA9XG4gICAgICBhdmFpbGFibGVQZXJzaXN0ZW5jZXNbMF0gfHxcbiAgICAgIF9nZXRJbnN0YW5jZTxQZXJzaXN0ZW5jZUludGVybmFsPihpbk1lbW9yeVBlcnNpc3RlbmNlKTtcblxuICAgIGNvbnN0IGtleSA9IF9wZXJzaXN0ZW5jZUtleU5hbWUodXNlcktleSwgYXV0aC5jb25maWcuYXBpS2V5LCBhdXRoLm5hbWUpO1xuXG4gICAgLy8gUHVsbCBvdXQgdGhlIGV4aXN0aW5nIHVzZXIsIHNldHRpbmcgdGhlIGNob3NlbiBwZXJzaXN0ZW5jZSB0byB0aGF0XG4gICAgLy8gcGVyc2lzdGVuY2UgaWYgdGhlIHVzZXIgZXhpc3RzLlxuICAgIGxldCB1c2VyVG9NaWdyYXRlOiBVc2VySW50ZXJuYWwgfCBudWxsID0gbnVsbDtcbiAgICAvLyBOb3RlLCBoZXJlIHdlIGNoZWNrIGZvciBhIHVzZXIgaW4gX2FsbF8gcGVyc2lzdGVuY2VzLCBub3QganVzdCB0aGVcbiAgICAvLyBvbmVzIGRlZW1lZCBhdmFpbGFibGUuIElmIHdlIGNhbiBtaWdyYXRlIGEgdXNlciBvdXQgb2YgYSBicm9rZW5cbiAgICAvLyBwZXJzaXN0ZW5jZSwgd2Ugd2lsbCAoYnV0IG9ubHkgaWYgdGhhdCBwZXJzaXN0ZW5jZSBzdXBwb3J0cyBtaWdyYXRpb24pLlxuICAgIGZvciAoY29uc3QgcGVyc2lzdGVuY2Ugb2YgcGVyc2lzdGVuY2VIaWVyYXJjaHkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGJsb2IgPSBhd2FpdCBwZXJzaXN0ZW5jZS5fZ2V0PFBlcnNpc3RlZEJsb2I+KGtleSk7XG4gICAgICAgIGlmIChibG9iKSB7XG4gICAgICAgICAgY29uc3QgdXNlciA9IFVzZXJJbXBsLl9mcm9tSlNPTihhdXRoLCBibG9iKTsgLy8gdGhyb3dzIGZvciB1bnBhcnNhYmxlIGJsb2IgKHdyb25nIGZvcm1hdClcbiAgICAgICAgICBpZiAocGVyc2lzdGVuY2UgIT09IHNlbGVjdGVkUGVyc2lzdGVuY2UpIHtcbiAgICAgICAgICAgIHVzZXJUb01pZ3JhdGUgPSB1c2VyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZWxlY3RlZFBlcnNpc3RlbmNlID0gcGVyc2lzdGVuY2U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge31cbiAgICB9XG5cbiAgICAvLyBJZiB3ZSBmaW5kIHRoZSB1c2VyIGluIGEgcGVyc2lzdGVuY2UgdGhhdCBkb2VzIHN1cHBvcnQgbWlncmF0aW9uLCB1c2VcbiAgICAvLyB0aGF0IG1pZ3JhdGlvbiBwYXRoIChvZiBvbmx5IHBlcnNpc3RlbmNlcyB0aGF0IHN1cHBvcnQgbWlncmF0aW9uKVxuICAgIGNvbnN0IG1pZ3JhdGlvbkhpZXJhcmNoeSA9IGF2YWlsYWJsZVBlcnNpc3RlbmNlcy5maWx0ZXIoXG4gICAgICBwID0+IHAuX3Nob3VsZEFsbG93TWlncmF0aW9uXG4gICAgKTtcblxuICAgIC8vIElmIHRoZSBwZXJzaXN0ZW5jZSBkb2VzIF9ub3RfIGFsbG93IG1pZ3JhdGlvbiwganVzdCBmaW5pc2ggb2ZmIGhlcmVcbiAgICBpZiAoXG4gICAgICAhc2VsZWN0ZWRQZXJzaXN0ZW5jZS5fc2hvdWxkQWxsb3dNaWdyYXRpb24gfHxcbiAgICAgICFtaWdyYXRpb25IaWVyYXJjaHkubGVuZ3RoXG4gICAgKSB7XG4gICAgICByZXR1cm4gbmV3IFBlcnNpc3RlbmNlVXNlck1hbmFnZXIoc2VsZWN0ZWRQZXJzaXN0ZW5jZSwgYXV0aCwgdXNlcktleSk7XG4gICAgfVxuXG4gICAgc2VsZWN0ZWRQZXJzaXN0ZW5jZSA9IG1pZ3JhdGlvbkhpZXJhcmNoeVswXTtcbiAgICBpZiAodXNlclRvTWlncmF0ZSkge1xuICAgICAgLy8gVGhpcyBub3JtYWxseSBzaG91bGRuJ3QgdGhyb3cgc2luY2UgY2hvc2VuUGVyc2lzdGVuY2UuaXNBdmFpbGFibGUoKSBpcyB0cnVlLCBidXQgaWYgaXQgZG9lc1xuICAgICAgLy8gd2UnbGwganVzdCBsZXQgaXQgYnViYmxlIHRvIHN1cmZhY2UgdGhlIGVycm9yLlxuICAgICAgYXdhaXQgc2VsZWN0ZWRQZXJzaXN0ZW5jZS5fc2V0KGtleSwgdXNlclRvTWlncmF0ZS50b0pTT04oKSk7XG4gICAgfVxuXG4gICAgLy8gQXR0ZW1wdCB0byBjbGVhciB0aGUga2V5IGluIG90aGVyIHBlcnNpc3RlbmNlcyBidXQgaWdub3JlIGVycm9ycy4gVGhpcyBoZWxwcyBwcmV2ZW50IGlzc3Vlc1xuICAgIC8vIHN1Y2ggYXMgdXNlcnMgZ2V0dGluZyBzdHVjayB3aXRoIGEgcHJldmlvdXMgYWNjb3VudCBhZnRlciBzaWduaW5nIG91dCBhbmQgcmVmcmVzaGluZyB0aGUgdGFiLlxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgcGVyc2lzdGVuY2VIaWVyYXJjaHkubWFwKGFzeW5jIHBlcnNpc3RlbmNlID0+IHtcbiAgICAgICAgaWYgKHBlcnNpc3RlbmNlICE9PSBzZWxlY3RlZFBlcnNpc3RlbmNlKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHBlcnNpc3RlbmNlLl9yZW1vdmUoa2V5KTtcbiAgICAgICAgICB9IGNhdGNoIHt9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgICByZXR1cm4gbmV3IFBlcnNpc3RlbmNlVXNlck1hbmFnZXIoc2VsZWN0ZWRQZXJzaXN0ZW5jZSwgYXV0aCwgdXNlcktleSk7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBpc0lFLCBnZXRVQSB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcblxuaW50ZXJmYWNlIE5hdmlnYXRvclN0YW5kYWxvbmUgZXh0ZW5kcyBOYXZpZ2F0b3Ige1xuICBzdGFuZGFsb25lPzogdW5rbm93bjtcbn1cblxuaW50ZXJmYWNlIERvY3VtZW50IHtcbiAgZG9jdW1lbnRNb2RlPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEVudW1zIGZvciBCcm93c2VyIG5hbWUuXG4gKi9cbmV4cG9ydCBjb25zdCBlbnVtIEJyb3dzZXJOYW1lIHtcbiAgQU5EUk9JRCA9ICdBbmRyb2lkJyxcbiAgQkxBQ0tCRVJSWSA9ICdCbGFja2JlcnJ5JyxcbiAgRURHRSA9ICdFZGdlJyxcbiAgRklSRUZPWCA9ICdGaXJlZm94JyxcbiAgSUUgPSAnSUUnLFxuICBJRU1PQklMRSA9ICdJRU1vYmlsZScsXG4gIE9QRVJBID0gJ09wZXJhJyxcbiAgT1RIRVIgPSAnT3RoZXInLFxuICBDSFJPTUUgPSAnQ2hyb21lJyxcbiAgU0FGQVJJID0gJ1NhZmFyaScsXG4gIFNJTEsgPSAnU2lsaycsXG4gIFdFQk9TID0gJ1dlYm9zJ1xufVxuXG4vKipcbiAqIERldGVybWluZSB0aGUgYnJvd3NlciBmb3IgdGhlIHB1cnBvc2VzIG9mIHJlcG9ydGluZyB1c2FnZSB0byB0aGUgQVBJXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfZ2V0QnJvd3Nlck5hbWUodXNlckFnZW50OiBzdHJpbmcpOiBCcm93c2VyTmFtZSB8IHN0cmluZyB7XG4gIGNvbnN0IHVhID0gdXNlckFnZW50LnRvTG93ZXJDYXNlKCk7XG4gIGlmICh1YS5pbmNsdWRlcygnb3BlcmEvJykgfHwgdWEuaW5jbHVkZXMoJ29wci8nKSB8fCB1YS5pbmNsdWRlcygnb3Bpb3MvJykpIHtcbiAgICByZXR1cm4gQnJvd3Nlck5hbWUuT1BFUkE7XG4gIH0gZWxzZSBpZiAoX2lzSUVNb2JpbGUodWEpKSB7XG4gICAgLy8gV2luZG93cyBwaG9uZSBJRU1vYmlsZSBicm93c2VyLlxuICAgIHJldHVybiBCcm93c2VyTmFtZS5JRU1PQklMRTtcbiAgfSBlbHNlIGlmICh1YS5pbmNsdWRlcygnbXNpZScpIHx8IHVhLmluY2x1ZGVzKCd0cmlkZW50LycpKSB7XG4gICAgcmV0dXJuIEJyb3dzZXJOYW1lLklFO1xuICB9IGVsc2UgaWYgKHVhLmluY2x1ZGVzKCdlZGdlLycpKSB7XG4gICAgcmV0dXJuIEJyb3dzZXJOYW1lLkVER0U7XG4gIH0gZWxzZSBpZiAoX2lzRmlyZWZveCh1YSkpIHtcbiAgICByZXR1cm4gQnJvd3Nlck5hbWUuRklSRUZPWDtcbiAgfSBlbHNlIGlmICh1YS5pbmNsdWRlcygnc2lsay8nKSkge1xuICAgIHJldHVybiBCcm93c2VyTmFtZS5TSUxLO1xuICB9IGVsc2UgaWYgKF9pc0JsYWNrQmVycnkodWEpKSB7XG4gICAgLy8gQmxhY2tiZXJyeSBicm93c2VyLlxuICAgIHJldHVybiBCcm93c2VyTmFtZS5CTEFDS0JFUlJZO1xuICB9IGVsc2UgaWYgKF9pc1dlYk9TKHVhKSkge1xuICAgIC8vIFdlYk9TIGRlZmF1bHQgYnJvd3Nlci5cbiAgICByZXR1cm4gQnJvd3Nlck5hbWUuV0VCT1M7XG4gIH0gZWxzZSBpZiAoX2lzU2FmYXJpKHVhKSkge1xuICAgIHJldHVybiBCcm93c2VyTmFtZS5TQUZBUkk7XG4gIH0gZWxzZSBpZiAoXG4gICAgKHVhLmluY2x1ZGVzKCdjaHJvbWUvJykgfHwgX2lzQ2hyb21lSU9TKHVhKSkgJiZcbiAgICAhdWEuaW5jbHVkZXMoJ2VkZ2UvJylcbiAgKSB7XG4gICAgcmV0dXJuIEJyb3dzZXJOYW1lLkNIUk9NRTtcbiAgfSBlbHNlIGlmIChfaXNBbmRyb2lkKHVhKSkge1xuICAgIC8vIEFuZHJvaWQgc3RvY2sgYnJvd3Nlci5cbiAgICByZXR1cm4gQnJvd3Nlck5hbWUuQU5EUk9JRDtcbiAgfSBlbHNlIHtcbiAgICAvLyBNb3N0IG1vZGVybiBicm93c2VycyBoYXZlIG5hbWUvdmVyc2lvbiBhdCBlbmQgb2YgdXNlciBhZ2VudCBzdHJpbmcuXG4gICAgY29uc3QgcmUgPSAvKFthLXpBLVpcXGRcXC5dKylcXC9bYS16QS1aXFxkXFwuXSokLztcbiAgICBjb25zdCBtYXRjaGVzID0gdXNlckFnZW50Lm1hdGNoKHJlKTtcbiAgICBpZiAobWF0Y2hlcz8ubGVuZ3RoID09PSAyKSB7XG4gICAgICByZXR1cm4gbWF0Y2hlc1sxXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIEJyb3dzZXJOYW1lLk9USEVSO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX2lzRmlyZWZveCh1YSA9IGdldFVBKCkpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9maXJlZm94XFwvL2kudGVzdCh1YSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfaXNTYWZhcmkodXNlckFnZW50ID0gZ2V0VUEoKSk6IGJvb2xlYW4ge1xuICBjb25zdCB1YSA9IHVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gKFxuICAgIHVhLmluY2x1ZGVzKCdzYWZhcmkvJykgJiZcbiAgICAhdWEuaW5jbHVkZXMoJ2Nocm9tZS8nKSAmJlxuICAgICF1YS5pbmNsdWRlcygnY3Jpb3MvJykgJiZcbiAgICAhdWEuaW5jbHVkZXMoJ2FuZHJvaWQnKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX2lzQ2hyb21lSU9TKHVhID0gZ2V0VUEoKSk6IGJvb2xlYW4ge1xuICByZXR1cm4gL2NyaW9zXFwvL2kudGVzdCh1YSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfaXNJRU1vYmlsZSh1YSA9IGdldFVBKCkpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9pZW1vYmlsZS9pLnRlc3QodWEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX2lzQW5kcm9pZCh1YSA9IGdldFVBKCkpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9hbmRyb2lkL2kudGVzdCh1YSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfaXNCbGFja0JlcnJ5KHVhID0gZ2V0VUEoKSk6IGJvb2xlYW4ge1xuICByZXR1cm4gL2JsYWNrYmVycnkvaS50ZXN0KHVhKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9pc1dlYk9TKHVhID0gZ2V0VUEoKSk6IGJvb2xlYW4ge1xuICByZXR1cm4gL3dlYm9zL2kudGVzdCh1YSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfaXNJT1ModWEgPSBnZXRVQSgpKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgL2lwaG9uZXxpcGFkfGlwb2QvaS50ZXN0KHVhKSB8fFxuICAgICgvbWFjaW50b3NoL2kudGVzdCh1YSkgJiYgL21vYmlsZS9pLnRlc3QodWEpKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX2lzSU9TN09yOCh1YSA9IGdldFVBKCkpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICAvKGlQYWR8aVBob25lfGlQb2QpLipPUyA3X1xcZC9pLnRlc3QodWEpIHx8XG4gICAgLyhpUGFkfGlQaG9uZXxpUG9kKS4qT1MgOF9cXGQvaS50ZXN0KHVhKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX2lzSU9TU3RhbmRhbG9uZSh1YSA9IGdldFVBKCkpOiBib29sZWFuIHtcbiAgcmV0dXJuIF9pc0lPUyh1YSkgJiYgISEod2luZG93Lm5hdmlnYXRvciBhcyBOYXZpZ2F0b3JTdGFuZGFsb25lKT8uc3RhbmRhbG9uZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9pc0lFMTAoKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc0lFKCkgJiYgKGRvY3VtZW50IGFzIERvY3VtZW50KS5kb2N1bWVudE1vZGUgPT09IDEwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX2lzTW9iaWxlQnJvd3Nlcih1YTogc3RyaW5nID0gZ2V0VUEoKSk6IGJvb2xlYW4ge1xuICAvLyBUT0RPOiBpbXBsZW1lbnQgZ2V0QnJvd3Nlck5hbWUgZXF1aXZhbGVudCBmb3IgT1MuXG4gIHJldHVybiAoXG4gICAgX2lzSU9TKHVhKSB8fFxuICAgIF9pc0FuZHJvaWQodWEpIHx8XG4gICAgX2lzV2ViT1ModWEpIHx8XG4gICAgX2lzQmxhY2tCZXJyeSh1YSkgfHxcbiAgICAvd2luZG93cyBwaG9uZS9pLnRlc3QodWEpIHx8XG4gICAgX2lzSUVNb2JpbGUodWEpXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfaXNJZnJhbWUoKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgLy8gQ2hlY2sgdGhhdCB0aGUgY3VycmVudCB3aW5kb3cgaXMgbm90IHRoZSB0b3Agd2luZG93LlxuICAgIC8vIElmIHNvLCByZXR1cm4gdHJ1ZS5cbiAgICByZXR1cm4gISEod2luZG93ICYmIHdpbmRvdyAhPT0gd2luZG93LnRvcCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBTREtfVkVSU0lPTiB9IGZyb20gJ0BmaXJlYmFzZS9hcHAnO1xuaW1wb3J0IHsgX2dldEJyb3dzZXJOYW1lIH0gZnJvbSAnLi9icm93c2VyJztcbmltcG9ydCB7IGdldFVBIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuXG5leHBvcnQgY29uc3QgZW51bSBDbGllbnRJbXBsZW1lbnRhdGlvbiB7XG4gIENPUkUgPSAnSnNDb3JlJ1xufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgZW51bSBDbGllbnRQbGF0Zm9ybSB7XG4gIEJST1dTRVIgPSAnQnJvd3NlcicsXG4gIE5PREUgPSAnTm9kZScsXG4gIFJFQUNUX05BVElWRSA9ICdSZWFjdE5hdGl2ZScsXG4gIENPUkRPVkEgPSAnQ29yZG92YScsXG4gIFdPUktFUiA9ICdXb3JrZXInXG59XG5cbi8qXG4gKiBEZXRlcm1pbmUgdGhlIFNESyB2ZXJzaW9uIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gX2dldENsaWVudFZlcnNpb24oXG4gIGNsaWVudFBsYXRmb3JtOiBDbGllbnRQbGF0Zm9ybSxcbiAgZnJhbWV3b3JrczogcmVhZG9ubHkgc3RyaW5nW10gPSBbXVxuKTogc3RyaW5nIHtcbiAgbGV0IHJlcG9ydGVkUGxhdGZvcm06IHN0cmluZztcbiAgc3dpdGNoIChjbGllbnRQbGF0Zm9ybSkge1xuICAgIGNhc2UgQ2xpZW50UGxhdGZvcm0uQlJPV1NFUjpcbiAgICAgIC8vIEluIGEgYnJvd3NlciBlbnZpcm9ubWVudCwgcmVwb3J0IHRoZSBicm93c2VyIG5hbWUuXG4gICAgICByZXBvcnRlZFBsYXRmb3JtID0gX2dldEJyb3dzZXJOYW1lKGdldFVBKCkpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBDbGllbnRQbGF0Zm9ybS5XT1JLRVI6XG4gICAgICAvLyBUZWNobmljYWxseSBhIHdvcmtlciBydW5zIGZyb20gYSBicm93c2VyIGJ1dCB3ZSBuZWVkIHRvIGRpZmZlcmVudGlhdGUgYVxuICAgICAgLy8gd29ya2VyIGZyb20gYSBicm93c2VyLlxuICAgICAgLy8gRm9yIGV4YW1wbGU6IENocm9tZS1Xb3JrZXIvSnNDb3JlLzQuOS4xL0ZpcmViYXNlQ29yZS13ZWIuXG4gICAgICByZXBvcnRlZFBsYXRmb3JtID0gYCR7X2dldEJyb3dzZXJOYW1lKGdldFVBKCkpfS0ke2NsaWVudFBsYXRmb3JtfWA7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmVwb3J0ZWRQbGF0Zm9ybSA9IGNsaWVudFBsYXRmb3JtO1xuICB9XG4gIGNvbnN0IHJlcG9ydGVkRnJhbWV3b3JrcyA9IGZyYW1ld29ya3MubGVuZ3RoXG4gICAgPyBmcmFtZXdvcmtzLmpvaW4oJywnKVxuICAgIDogJ0ZpcmViYXNlQ29yZS13ZWInOyAvKiBkZWZhdWx0IHZhbHVlIGlmIG5vIG90aGVyIGZyYW1ld29yayBpcyB1c2VkICovXG4gIHJldHVybiBgJHtyZXBvcnRlZFBsYXRmb3JtfS8ke0NsaWVudEltcGxlbWVudGF0aW9uLkNPUkV9LyR7U0RLX1ZFUlNJT059LyR7cmVwb3J0ZWRGcmFtZXdvcmtzfWA7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgQXV0aEludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvYXV0aCc7XG5pbXBvcnQgeyBVbnN1YnNjcmliZSwgVXNlciB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5pbXBvcnQgeyBBdXRoRXJyb3JDb2RlIH0gZnJvbSAnLi4vZXJyb3JzJztcblxuaW50ZXJmYWNlIE1pZGRsZXdhcmVFbnRyeSB7XG4gICh1c2VyOiBVc2VyIHwgbnVsbCk6IFByb21pc2U8dm9pZD47XG4gIG9uQWJvcnQ/OiAoKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgY2xhc3MgQXV0aE1pZGRsZXdhcmVRdWV1ZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcXVldWU6IE1pZGRsZXdhcmVFbnRyeVtdID0gW107XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBhdXRoOiBBdXRoSW50ZXJuYWwpIHt9XG5cbiAgcHVzaENhbGxiYWNrKFxuICAgIGNhbGxiYWNrOiAodXNlcjogVXNlciB8IG51bGwpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+LFxuICAgIG9uQWJvcnQ/OiAoKSA9PiB2b2lkXG4gICk6IFVuc3Vic2NyaWJlIHtcbiAgICAvLyBUaGUgY2FsbGJhY2sgY291bGQgYmUgc3luYyBvciBhc3luYy4gV3JhcCBpdCBpbnRvIGFcbiAgICAvLyBmdW5jdGlvbiB0aGF0IGlzIGFsd2F5cyBhc3luYy5cbiAgICBjb25zdCB3cmFwcGVkQ2FsbGJhY2s6IE1pZGRsZXdhcmVFbnRyeSA9IChcbiAgICAgIHVzZXI6IFVzZXIgfCBudWxsXG4gICAgKTogUHJvbWlzZTx2b2lkPiA9PlxuICAgICAgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNhbGxiYWNrKHVzZXIpO1xuICAgICAgICAgIC8vIEVpdGhlciByZXNvbHZlIHdpdGggZXhpc3RpbmcgcHJvbWlzZSBvciB3cmFwIGEgbm9uLXByb21pc2VcbiAgICAgICAgICAvLyByZXR1cm4gdmFsdWUgaW50byBhIHByb21pc2UuXG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gU3luYyBjYWxsYmFjayB0aHJvd3MuXG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAvLyBBdHRhY2ggdGhlIG9uQWJvcnQgaWYgcHJlc2VudFxuICAgIHdyYXBwZWRDYWxsYmFjay5vbkFib3J0ID0gb25BYm9ydDtcbiAgICB0aGlzLnF1ZXVlLnB1c2god3JhcHBlZENhbGxiYWNrKTtcblxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5xdWV1ZS5sZW5ndGggLSAxO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAvLyBVbnN1YnNjcmliZS4gUmVwbGFjZSB3aXRoIG5vLW9wLiBEbyBub3QgcmVtb3ZlIGZyb20gYXJyYXksIG9yIGl0IHdpbGwgZGlzdHVyYlxuICAgICAgLy8gaW5kZXhpbmcgb2Ygb3RoZXIgZWxlbWVudHMuXG4gICAgICB0aGlzLnF1ZXVlW2luZGV4XSA9ICgpID0+IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH07XG4gIH1cblxuICBhc3luYyBydW5NaWRkbGV3YXJlKG5leHRVc2VyOiBVc2VyIHwgbnVsbCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmF1dGguY3VycmVudFVzZXIgPT09IG5leHRVc2VyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gV2hpbGUgcnVubmluZyB0aGUgbWlkZGxld2FyZSwgYnVpbGQgYSB0ZW1wb3Jhcnkgc3RhY2sgb2Ygb25BYm9ydFxuICAgIC8vIGNhbGxiYWNrcyB0byBjYWxsIGlmIG9uZSBtaWRkbGV3YXJlIGNhbGxiYWNrIHJlamVjdHMuXG5cbiAgICBjb25zdCBvbkFib3J0U3RhY2s6IEFycmF5PCgpID0+IHZvaWQ+ID0gW107XG4gICAgdHJ5IHtcbiAgICAgIGZvciAoY29uc3QgYmVmb3JlU3RhdGVDYWxsYmFjayBvZiB0aGlzLnF1ZXVlKSB7XG4gICAgICAgIGF3YWl0IGJlZm9yZVN0YXRlQ2FsbGJhY2sobmV4dFVzZXIpO1xuXG4gICAgICAgIC8vIE9ubHkgcHVzaCB0aGUgb25BYm9ydCBpZiB0aGUgY2FsbGJhY2sgc3VjY2VlZHNcbiAgICAgICAgaWYgKGJlZm9yZVN0YXRlQ2FsbGJhY2sub25BYm9ydCkge1xuICAgICAgICAgIG9uQWJvcnRTdGFjay5wdXNoKGJlZm9yZVN0YXRlQ2FsbGJhY2sub25BYm9ydCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBSdW4gYWxsIG9uQWJvcnQsIHdpdGggc2VwYXJhdGUgdHJ5L2NhdGNoIHRvIGlnbm9yZSBhbnkgZXJyb3JzIGFuZFxuICAgICAgLy8gY29udGludWVcbiAgICAgIG9uQWJvcnRTdGFjay5yZXZlcnNlKCk7XG4gICAgICBmb3IgKGNvbnN0IG9uQWJvcnQgb2Ygb25BYm9ydFN0YWNrKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgb25BYm9ydCgpO1xuICAgICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgICAgLyogc3dhbGxvdyBlcnJvciAqL1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRocm93IHRoaXMuYXV0aC5fZXJyb3JGYWN0b3J5LmNyZWF0ZShBdXRoRXJyb3JDb2RlLkxPR0lOX0JMT0NLRUQsIHtcbiAgICAgICAgb3JpZ2luYWxNZXNzYWdlOiAoZSBhcyBFcnJvcik/Lm1lc3NhZ2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7XG4gIF9wZXJmb3JtQXBpUmVxdWVzdCxcbiAgRW5kcG9pbnQsXG4gIEh0dHBNZXRob2QsXG4gIF9hZGRUaWRJZk5lY2Vzc2FyeVxufSBmcm9tICcuLi9pbmRleCc7XG5pbXBvcnQgeyBBdXRoIH0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcblxuLyoqXG4gKiBSZXF1ZXN0IG9iamVjdCBmb3IgZmV0Y2hpbmcgdGhlIHBhc3N3b3JkIHBvbGljeS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRQYXNzd29yZFBvbGljeVJlcXVlc3Qge1xuICB0ZW5hbnRJZD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZXNwb25zZSBvYmplY3QgZm9yIGZldGNoaW5nIHRoZSBwYXNzd29yZCBwb2xpY3kuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0UGFzc3dvcmRQb2xpY3lSZXNwb25zZSB7XG4gIGN1c3RvbVN0cmVuZ3RoT3B0aW9uczoge1xuICAgIG1pblBhc3N3b3JkTGVuZ3RoPzogbnVtYmVyO1xuICAgIG1heFBhc3N3b3JkTGVuZ3RoPzogbnVtYmVyO1xuICAgIGNvbnRhaW5zTG93ZXJjYXNlQ2hhcmFjdGVyPzogYm9vbGVhbjtcbiAgICBjb250YWluc1VwcGVyY2FzZUNoYXJhY3Rlcj86IGJvb2xlYW47XG4gICAgY29udGFpbnNOdW1lcmljQ2hhcmFjdGVyPzogYm9vbGVhbjtcbiAgICBjb250YWluc05vbkFscGhhbnVtZXJpY0NoYXJhY3Rlcj86IGJvb2xlYW47XG4gIH07XG4gIGFsbG93ZWROb25BbHBoYW51bWVyaWNDaGFyYWN0ZXJzPzogc3RyaW5nW107XG4gIGVuZm9yY2VtZW50U3RhdGU6IHN0cmluZztcbiAgZm9yY2VVcGdyYWRlT25TaWduaW4/OiBib29sZWFuO1xuICBzY2hlbWFWZXJzaW9uOiBudW1iZXI7XG59XG5cbi8qKlxuICogRmV0Y2hlcyB0aGUgcGFzc3dvcmQgcG9saWN5IGZvciB0aGUgY3VycmVudGx5IHNldCB0ZW5hbnQgb3IgdGhlIHByb2plY3QgaWYgbm8gdGVuYW50IGlzIHNldC5cbiAqXG4gKiBAcGFyYW0gYXV0aCBBdXRoIG9iamVjdC5cbiAqIEBwYXJhbSByZXF1ZXN0IFBhc3N3b3JkIHBvbGljeSByZXF1ZXN0LlxuICogQHJldHVybnMgUGFzc3dvcmQgcG9saWN5IHJlc3BvbnNlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gX2dldFBhc3N3b3JkUG9saWN5KFxuICBhdXRoOiBBdXRoLFxuICByZXF1ZXN0OiBHZXRQYXNzd29yZFBvbGljeVJlcXVlc3QgPSB7fVxuKTogUHJvbWlzZTxHZXRQYXNzd29yZFBvbGljeVJlc3BvbnNlPiB7XG4gIHJldHVybiBfcGVyZm9ybUFwaVJlcXVlc3Q8XG4gICAgR2V0UGFzc3dvcmRQb2xpY3lSZXF1ZXN0LFxuICAgIEdldFBhc3N3b3JkUG9saWN5UmVzcG9uc2VcbiAgPihcbiAgICBhdXRoLFxuICAgIEh0dHBNZXRob2QuR0VULFxuICAgIEVuZHBvaW50LkdFVF9QQVNTV09SRF9QT0xJQ1ksXG4gICAgX2FkZFRpZElmTmVjZXNzYXJ5KGF1dGgsIHJlcXVlc3QpXG4gICk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjMgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgR2V0UGFzc3dvcmRQb2xpY3lSZXNwb25zZSB9IGZyb20gJy4uLy4uL2FwaS9wYXNzd29yZF9wb2xpY3kvZ2V0X3Bhc3N3b3JkX3BvbGljeSc7XG5pbXBvcnQge1xuICBQYXNzd29yZFBvbGljeUN1c3RvbVN0cmVuZ3RoT3B0aW9ucyxcbiAgUGFzc3dvcmRQb2xpY3lJbnRlcm5hbCxcbiAgUGFzc3dvcmRWYWxpZGF0aW9uU3RhdHVzSW50ZXJuYWxcbn0gZnJvbSAnLi4vLi4vbW9kZWwvcGFzc3dvcmRfcG9saWN5JztcbmltcG9ydCB7IFBhc3N3b3JkVmFsaWRhdGlvblN0YXR1cyB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5cbi8vIE1pbmltdW0gbWluIHBhc3N3b3JkIGxlbmd0aCBlbmZvcmNlZCBieSB0aGUgYmFja2VuZCwgZXZlbiBpZiBubyBtaW5pbXVtIGxlbmd0aCBpcyBzZXQuXG5jb25zdCBNSU5JTVVNX01JTl9QQVNTV09SRF9MRU5HVEggPSA2O1xuXG4vKipcbiAqIFN0b3JlcyBwYXNzd29yZCBwb2xpY3kgcmVxdWlyZW1lbnRzIGFuZCBwcm92aWRlcyBwYXNzd29yZCB2YWxpZGF0aW9uIGFnYWluc3QgdGhlIHBvbGljeS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIFBhc3N3b3JkUG9saWN5SW1wbCBpbXBsZW1lbnRzIFBhc3N3b3JkUG9saWN5SW50ZXJuYWwge1xuICByZWFkb25seSBjdXN0b21TdHJlbmd0aE9wdGlvbnM6IFBhc3N3b3JkUG9saWN5Q3VzdG9tU3RyZW5ndGhPcHRpb25zO1xuICByZWFkb25seSBhbGxvd2VkTm9uQWxwaGFudW1lcmljQ2hhcmFjdGVyczogc3RyaW5nO1xuICByZWFkb25seSBlbmZvcmNlbWVudFN0YXRlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGZvcmNlVXBncmFkZU9uU2lnbmluOiBib29sZWFuO1xuICByZWFkb25seSBzY2hlbWFWZXJzaW9uOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IocmVzcG9uc2U6IEdldFBhc3N3b3JkUG9saWN5UmVzcG9uc2UpIHtcbiAgICAvLyBPbmx5IGluY2x1ZGUgY3VzdG9tIHN0cmVuZ3RoIG9wdGlvbnMgZGVmaW5lZCBpbiB0aGUgcmVzcG9uc2UuXG4gICAgY29uc3QgcmVzcG9uc2VPcHRpb25zID0gcmVzcG9uc2UuY3VzdG9tU3RyZW5ndGhPcHRpb25zO1xuICAgIHRoaXMuY3VzdG9tU3RyZW5ndGhPcHRpb25zID0ge307XG4gICAgLy8gVE9ETzogUmVtb3ZlIG9uY2UgdGhlIGJhY2tlbmQgaXMgdXBkYXRlZCB0byBpbmNsdWRlIHRoZSBtaW5pbXVtIG1pbiBwYXNzd29yZCBsZW5ndGggaW5zdGVhZCBvZiB1bmRlZmluZWQgd2hlbiB0aGVyZSBpcyBubyBtaW5pbXVtIGxlbmd0aCBzZXQuXG4gICAgdGhpcy5jdXN0b21TdHJlbmd0aE9wdGlvbnMubWluUGFzc3dvcmRMZW5ndGggPVxuICAgICAgcmVzcG9uc2VPcHRpb25zLm1pblBhc3N3b3JkTGVuZ3RoID8/IE1JTklNVU1fTUlOX1BBU1NXT1JEX0xFTkdUSDtcbiAgICBpZiAocmVzcG9uc2VPcHRpb25zLm1heFBhc3N3b3JkTGVuZ3RoKSB7XG4gICAgICB0aGlzLmN1c3RvbVN0cmVuZ3RoT3B0aW9ucy5tYXhQYXNzd29yZExlbmd0aCA9XG4gICAgICAgIHJlc3BvbnNlT3B0aW9ucy5tYXhQYXNzd29yZExlbmd0aDtcbiAgICB9XG4gICAgaWYgKHJlc3BvbnNlT3B0aW9ucy5jb250YWluc0xvd2VyY2FzZUNoYXJhY3RlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmN1c3RvbVN0cmVuZ3RoT3B0aW9ucy5jb250YWluc0xvd2VyY2FzZUxldHRlciA9XG4gICAgICAgIHJlc3BvbnNlT3B0aW9ucy5jb250YWluc0xvd2VyY2FzZUNoYXJhY3RlcjtcbiAgICB9XG4gICAgaWYgKHJlc3BvbnNlT3B0aW9ucy5jb250YWluc1VwcGVyY2FzZUNoYXJhY3RlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmN1c3RvbVN0cmVuZ3RoT3B0aW9ucy5jb250YWluc1VwcGVyY2FzZUxldHRlciA9XG4gICAgICAgIHJlc3BvbnNlT3B0aW9ucy5jb250YWluc1VwcGVyY2FzZUNoYXJhY3RlcjtcbiAgICB9XG4gICAgaWYgKHJlc3BvbnNlT3B0aW9ucy5jb250YWluc051bWVyaWNDaGFyYWN0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jdXN0b21TdHJlbmd0aE9wdGlvbnMuY29udGFpbnNOdW1lcmljQ2hhcmFjdGVyID1cbiAgICAgICAgcmVzcG9uc2VPcHRpb25zLmNvbnRhaW5zTnVtZXJpY0NoYXJhY3RlcjtcbiAgICB9XG4gICAgaWYgKHJlc3BvbnNlT3B0aW9ucy5jb250YWluc05vbkFscGhhbnVtZXJpY0NoYXJhY3RlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmN1c3RvbVN0cmVuZ3RoT3B0aW9ucy5jb250YWluc05vbkFscGhhbnVtZXJpY0NoYXJhY3RlciA9XG4gICAgICAgIHJlc3BvbnNlT3B0aW9ucy5jb250YWluc05vbkFscGhhbnVtZXJpY0NoYXJhY3RlcjtcbiAgICB9XG5cbiAgICB0aGlzLmVuZm9yY2VtZW50U3RhdGUgPSByZXNwb25zZS5lbmZvcmNlbWVudFN0YXRlO1xuICAgIGlmICh0aGlzLmVuZm9yY2VtZW50U3RhdGUgPT09ICdFTkZPUkNFTUVOVF9TVEFURV9VTlNQRUNJRklFRCcpIHtcbiAgICAgIHRoaXMuZW5mb3JjZW1lbnRTdGF0ZSA9ICdPRkYnO1xuICAgIH1cblxuICAgIC8vIFVzZSBhbiBlbXB0eSBzdHJpbmcgaWYgbm8gbm9uLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIGFyZSBzcGVjaWZpZWQgaW4gdGhlIHJlc3BvbnNlLlxuICAgIHRoaXMuYWxsb3dlZE5vbkFscGhhbnVtZXJpY0NoYXJhY3RlcnMgPVxuICAgICAgcmVzcG9uc2UuYWxsb3dlZE5vbkFscGhhbnVtZXJpY0NoYXJhY3RlcnM/LmpvaW4oJycpID8/ICcnO1xuXG4gICAgdGhpcy5mb3JjZVVwZ3JhZGVPblNpZ25pbiA9IHJlc3BvbnNlLmZvcmNlVXBncmFkZU9uU2lnbmluID8/IGZhbHNlO1xuICAgIHRoaXMuc2NoZW1hVmVyc2lvbiA9IHJlc3BvbnNlLnNjaGVtYVZlcnNpb247XG4gIH1cblxuICB2YWxpZGF0ZVBhc3N3b3JkKHBhc3N3b3JkOiBzdHJpbmcpOiBQYXNzd29yZFZhbGlkYXRpb25TdGF0dXMge1xuICAgIGNvbnN0IHN0YXR1czogUGFzc3dvcmRWYWxpZGF0aW9uU3RhdHVzSW50ZXJuYWwgPSB7XG4gICAgICBpc1ZhbGlkOiB0cnVlLFxuICAgICAgcGFzc3dvcmRQb2xpY3k6IHRoaXNcbiAgICB9O1xuXG4gICAgLy8gQ2hlY2sgdGhlIHBhc3N3b3JkIGxlbmd0aCBhbmQgY2hhcmFjdGVyIG9wdGlvbnMuXG4gICAgdGhpcy52YWxpZGF0ZVBhc3N3b3JkTGVuZ3RoT3B0aW9ucyhwYXNzd29yZCwgc3RhdHVzKTtcbiAgICB0aGlzLnZhbGlkYXRlUGFzc3dvcmRDaGFyYWN0ZXJPcHRpb25zKHBhc3N3b3JkLCBzdGF0dXMpO1xuXG4gICAgLy8gQ29tYmluZSB0aGUgc3RhdHVzIGludG8gc2luZ2xlIGlzVmFsaWQgcHJvcGVydHkuXG4gICAgc3RhdHVzLmlzVmFsaWQgJiY9IHN0YXR1cy5tZWV0c01pblBhc3N3b3JkTGVuZ3RoID8/IHRydWU7XG4gICAgc3RhdHVzLmlzVmFsaWQgJiY9IHN0YXR1cy5tZWV0c01heFBhc3N3b3JkTGVuZ3RoID8/IHRydWU7XG4gICAgc3RhdHVzLmlzVmFsaWQgJiY9IHN0YXR1cy5jb250YWluc0xvd2VyY2FzZUxldHRlciA/PyB0cnVlO1xuICAgIHN0YXR1cy5pc1ZhbGlkICYmPSBzdGF0dXMuY29udGFpbnNVcHBlcmNhc2VMZXR0ZXIgPz8gdHJ1ZTtcbiAgICBzdGF0dXMuaXNWYWxpZCAmJj0gc3RhdHVzLmNvbnRhaW5zTnVtZXJpY0NoYXJhY3RlciA/PyB0cnVlO1xuICAgIHN0YXR1cy5pc1ZhbGlkICYmPSBzdGF0dXMuY29udGFpbnNOb25BbHBoYW51bWVyaWNDaGFyYWN0ZXIgPz8gdHJ1ZTtcblxuICAgIHJldHVybiBzdGF0dXM7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoYXQgdGhlIHBhc3N3b3JkIG1lZXRzIHRoZSBsZW5ndGggb3B0aW9ucyBmb3IgdGhlIHBvbGljeS5cbiAgICpcbiAgICogQHBhcmFtIHBhc3N3b3JkIFBhc3N3b3JkIHRvIHZhbGlkYXRlLlxuICAgKiBAcGFyYW0gc3RhdHVzIFZhbGlkYXRpb24gc3RhdHVzLlxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVBhc3N3b3JkTGVuZ3RoT3B0aW9ucyhcbiAgICBwYXNzd29yZDogc3RyaW5nLFxuICAgIHN0YXR1czogUGFzc3dvcmRWYWxpZGF0aW9uU3RhdHVzSW50ZXJuYWxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgbWluUGFzc3dvcmRMZW5ndGggPSB0aGlzLmN1c3RvbVN0cmVuZ3RoT3B0aW9ucy5taW5QYXNzd29yZExlbmd0aDtcbiAgICBjb25zdCBtYXhQYXNzd29yZExlbmd0aCA9IHRoaXMuY3VzdG9tU3RyZW5ndGhPcHRpb25zLm1heFBhc3N3b3JkTGVuZ3RoO1xuICAgIGlmIChtaW5QYXNzd29yZExlbmd0aCkge1xuICAgICAgc3RhdHVzLm1lZXRzTWluUGFzc3dvcmRMZW5ndGggPSBwYXNzd29yZC5sZW5ndGggPj0gbWluUGFzc3dvcmRMZW5ndGg7XG4gICAgfVxuICAgIGlmIChtYXhQYXNzd29yZExlbmd0aCkge1xuICAgICAgc3RhdHVzLm1lZXRzTWF4UGFzc3dvcmRMZW5ndGggPSBwYXNzd29yZC5sZW5ndGggPD0gbWF4UGFzc3dvcmRMZW5ndGg7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGF0IHRoZSBwYXNzd29yZCBtZWV0cyB0aGUgY2hhcmFjdGVyIG9wdGlvbnMgZm9yIHRoZSBwb2xpY3kuXG4gICAqXG4gICAqIEBwYXJhbSBwYXNzd29yZCBQYXNzd29yZCB0byB2YWxpZGF0ZS5cbiAgICogQHBhcmFtIHN0YXR1cyBWYWxpZGF0aW9uIHN0YXR1cy5cbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVQYXNzd29yZENoYXJhY3Rlck9wdGlvbnMoXG4gICAgcGFzc3dvcmQ6IHN0cmluZyxcbiAgICBzdGF0dXM6IFBhc3N3b3JkVmFsaWRhdGlvblN0YXR1c0ludGVybmFsXG4gICk6IHZvaWQge1xuICAgIC8vIEFzc2lnbiBzdGF0dXNlcyBmb3IgcmVxdWlyZW1lbnRzIGV2ZW4gaWYgdGhlIHBhc3N3b3JkIGlzIGFuIGVtcHR5IHN0cmluZy5cbiAgICB0aGlzLnVwZGF0ZVBhc3N3b3JkQ2hhcmFjdGVyT3B0aW9uc1N0YXR1c2VzKFxuICAgICAgc3RhdHVzLFxuICAgICAgLyogY29udGFpbnNMb3dlcmNhc2VDaGFyYWN0ZXI9ICovIGZhbHNlLFxuICAgICAgLyogY29udGFpbnNVcHBlcmNhc2VDaGFyYWN0ZXI9ICovIGZhbHNlLFxuICAgICAgLyogY29udGFpbnNOdW1lcmljQ2hhcmFjdGVyPSAqLyBmYWxzZSxcbiAgICAgIC8qIGNvbnRhaW5zTm9uQWxwaGFudW1lcmljQ2hhcmFjdGVyPSAqLyBmYWxzZVxuICAgICk7XG5cbiAgICBsZXQgcGFzc3dvcmRDaGFyO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFzc3dvcmQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHBhc3N3b3JkQ2hhciA9IHBhc3N3b3JkLmNoYXJBdChpKTtcbiAgICAgIHRoaXMudXBkYXRlUGFzc3dvcmRDaGFyYWN0ZXJPcHRpb25zU3RhdHVzZXMoXG4gICAgICAgIHN0YXR1cyxcbiAgICAgICAgLyogY29udGFpbnNMb3dlcmNhc2VDaGFyYWN0ZXI9ICovIHBhc3N3b3JkQ2hhciA+PSAnYScgJiZcbiAgICAgICAgICBwYXNzd29yZENoYXIgPD0gJ3onLFxuICAgICAgICAvKiBjb250YWluc1VwcGVyY2FzZUNoYXJhY3Rlcj0gKi8gcGFzc3dvcmRDaGFyID49ICdBJyAmJlxuICAgICAgICAgIHBhc3N3b3JkQ2hhciA8PSAnWicsXG4gICAgICAgIC8qIGNvbnRhaW5zTnVtZXJpY0NoYXJhY3Rlcj0gKi8gcGFzc3dvcmRDaGFyID49ICcwJyAmJlxuICAgICAgICAgIHBhc3N3b3JkQ2hhciA8PSAnOScsXG4gICAgICAgIC8qIGNvbnRhaW5zTm9uQWxwaGFudW1lcmljQ2hhcmFjdGVyPSAqLyB0aGlzLmFsbG93ZWROb25BbHBoYW51bWVyaWNDaGFyYWN0ZXJzLmluY2x1ZGVzKFxuICAgICAgICAgIHBhc3N3b3JkQ2hhclxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBydW5uaW5nIHZhbGlkYXRpb24gc3RhdHVzIHdpdGggdGhlIHN0YXR1c2VzIGZvciB0aGUgY2hhcmFjdGVyIG9wdGlvbnMuXG4gICAqIEV4cGVjdGVkIHRvIGJlIGNhbGxlZCBlYWNoIHRpbWUgYSBjaGFyYWN0ZXIgaXMgcHJvY2Vzc2VkIHRvIHVwZGF0ZSBlYWNoIG9wdGlvbiBzdGF0dXNcbiAgICogYmFzZWQgb24gdGhlIGN1cnJlbnQgY2hhcmFjdGVyLlxuICAgKlxuICAgKiBAcGFyYW0gc3RhdHVzIFZhbGlkYXRpb24gc3RhdHVzLlxuICAgKiBAcGFyYW0gY29udGFpbnNMb3dlcmNhc2VDaGFyYWN0ZXIgV2hldGhlciB0aGUgY2hhcmFjdGVyIGlzIGEgbG93ZXJjYXNlIGxldHRlci5cbiAgICogQHBhcmFtIGNvbnRhaW5zVXBwZXJjYXNlQ2hhcmFjdGVyIFdoZXRoZXIgdGhlIGNoYXJhY3RlciBpcyBhbiB1cHBlcmNhc2UgbGV0dGVyLlxuICAgKiBAcGFyYW0gY29udGFpbnNOdW1lcmljQ2hhcmFjdGVyIFdoZXRoZXIgdGhlIGNoYXJhY3RlciBpcyBhIG51bWVyaWMgY2hhcmFjdGVyLlxuICAgKiBAcGFyYW0gY29udGFpbnNOb25BbHBoYW51bWVyaWNDaGFyYWN0ZXIgV2hldGhlciB0aGUgY2hhcmFjdGVyIGlzIGEgbm9uLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXIuXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZVBhc3N3b3JkQ2hhcmFjdGVyT3B0aW9uc1N0YXR1c2VzKFxuICAgIHN0YXR1czogUGFzc3dvcmRWYWxpZGF0aW9uU3RhdHVzSW50ZXJuYWwsXG4gICAgY29udGFpbnNMb3dlcmNhc2VDaGFyYWN0ZXI6IGJvb2xlYW4sXG4gICAgY29udGFpbnNVcHBlcmNhc2VDaGFyYWN0ZXI6IGJvb2xlYW4sXG4gICAgY29udGFpbnNOdW1lcmljQ2hhcmFjdGVyOiBib29sZWFuLFxuICAgIGNvbnRhaW5zTm9uQWxwaGFudW1lcmljQ2hhcmFjdGVyOiBib29sZWFuXG4gICk6IHZvaWQge1xuICAgIGlmICh0aGlzLmN1c3RvbVN0cmVuZ3RoT3B0aW9ucy5jb250YWluc0xvd2VyY2FzZUxldHRlcikge1xuICAgICAgc3RhdHVzLmNvbnRhaW5zTG93ZXJjYXNlTGV0dGVyIHx8PSBjb250YWluc0xvd2VyY2FzZUNoYXJhY3RlcjtcbiAgICB9XG4gICAgaWYgKHRoaXMuY3VzdG9tU3RyZW5ndGhPcHRpb25zLmNvbnRhaW5zVXBwZXJjYXNlTGV0dGVyKSB7XG4gICAgICBzdGF0dXMuY29udGFpbnNVcHBlcmNhc2VMZXR0ZXIgfHw9IGNvbnRhaW5zVXBwZXJjYXNlQ2hhcmFjdGVyO1xuICAgIH1cbiAgICBpZiAodGhpcy5jdXN0b21TdHJlbmd0aE9wdGlvbnMuY29udGFpbnNOdW1lcmljQ2hhcmFjdGVyKSB7XG4gICAgICBzdGF0dXMuY29udGFpbnNOdW1lcmljQ2hhcmFjdGVyIHx8PSBjb250YWluc051bWVyaWNDaGFyYWN0ZXI7XG4gICAgfVxuICAgIGlmICh0aGlzLmN1c3RvbVN0cmVuZ3RoT3B0aW9ucy5jb250YWluc05vbkFscGhhbnVtZXJpY0NoYXJhY3Rlcikge1xuICAgICAgc3RhdHVzLmNvbnRhaW5zTm9uQWxwaGFudW1lcmljQ2hhcmFjdGVyIHx8PVxuICAgICAgICBjb250YWluc05vbkFscGhhbnVtZXJpY0NoYXJhY3RlcjtcbiAgICB9XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBfRmlyZWJhc2VTZXJ2aWNlLCBGaXJlYmFzZUFwcCB9IGZyb20gJ0BmaXJlYmFzZS9hcHAnO1xuaW1wb3J0IHsgUHJvdmlkZXIgfSBmcm9tICdAZmlyZWJhc2UvY29tcG9uZW50JztcbmltcG9ydCB7IEFwcENoZWNrSW50ZXJuYWxDb21wb25lbnROYW1lIH0gZnJvbSAnQGZpcmViYXNlL2FwcC1jaGVjay1pbnRlcm9wLXR5cGVzJztcbmltcG9ydCB7XG4gIEF1dGgsXG4gIEF1dGhFcnJvck1hcCxcbiAgQXV0aFNldHRpbmdzLFxuICBFbXVsYXRvckNvbmZpZyxcbiAgTmV4dE9yT2JzZXJ2ZXIsXG4gIFBlcnNpc3RlbmNlLFxuICBQb3B1cFJlZGlyZWN0UmVzb2x2ZXIsXG4gIFVzZXIsXG4gIFVzZXJDcmVkZW50aWFsLFxuICBDb21wbGV0ZUZuLFxuICBFcnJvckZuLFxuICBOZXh0Rm4sXG4gIFVuc3Vic2NyaWJlLFxuICBQYXNzd29yZFZhbGlkYXRpb25TdGF0dXNcbn0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcbmltcG9ydCB7XG4gIGNyZWF0ZVN1YnNjcmliZSxcbiAgRXJyb3JGYWN0b3J5LFxuICBGaXJlYmFzZUVycm9yLFxuICBnZXRNb2R1bGFySW5zdGFuY2UsXG4gIE9ic2VydmVyLFxuICBTdWJzY3JpYmVcbn0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuXG5pbXBvcnQgeyBBdXRoSW50ZXJuYWwsIENvbmZpZ0ludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvYXV0aCc7XG5pbXBvcnQgeyBQb3B1cFJlZGlyZWN0UmVzb2x2ZXJJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL3BvcHVwX3JlZGlyZWN0JztcbmltcG9ydCB7IFVzZXJJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL3VzZXInO1xuaW1wb3J0IHtcbiAgQXV0aEVycm9yQ29kZSxcbiAgQXV0aEVycm9yUGFyYW1zLFxuICBFcnJvck1hcFJldHJpZXZlcixcbiAgX0RFRkFVTFRfQVVUSF9FUlJPUl9GQUNUT1JZXG59IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBQZXJzaXN0ZW5jZUludGVybmFsIH0gZnJvbSAnLi4vcGVyc2lzdGVuY2UnO1xuaW1wb3J0IHtcbiAgS2V5TmFtZSxcbiAgUGVyc2lzdGVuY2VVc2VyTWFuYWdlclxufSBmcm9tICcuLi9wZXJzaXN0ZW5jZS9wZXJzaXN0ZW5jZV91c2VyX21hbmFnZXInO1xuaW1wb3J0IHsgX3JlbG9hZFdpdGhvdXRTYXZpbmcgfSBmcm9tICcuLi91c2VyL3JlbG9hZCc7XG5pbXBvcnQgeyBfYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQnO1xuaW1wb3J0IHsgX2dldEluc3RhbmNlIH0gZnJvbSAnLi4vdXRpbC9pbnN0YW50aWF0b3InO1xuaW1wb3J0IHsgX2dldFVzZXJMYW5ndWFnZSB9IGZyb20gJy4uL3V0aWwvbmF2aWdhdG9yJztcbmltcG9ydCB7IF9nZXRDbGllbnRWZXJzaW9uIH0gZnJvbSAnLi4vdXRpbC92ZXJzaW9uJztcbmltcG9ydCB7IEh0dHBIZWFkZXIgfSBmcm9tICcuLi8uLi9hcGknO1xuaW1wb3J0IHsgQXV0aE1pZGRsZXdhcmVRdWV1ZSB9IGZyb20gJy4vbWlkZGxld2FyZSc7XG5pbXBvcnQgeyBSZWNhcHRjaGFDb25maWcgfSBmcm9tICcuLi8uLi9wbGF0Zm9ybV9icm93c2VyL3JlY2FwdGNoYS9yZWNhcHRjaGEnO1xuaW1wb3J0IHsgX2xvZ1dhcm4gfSBmcm9tICcuLi91dGlsL2xvZyc7XG5pbXBvcnQgeyBfZ2V0UGFzc3dvcmRQb2xpY3kgfSBmcm9tICcuLi8uLi9hcGkvcGFzc3dvcmRfcG9saWN5L2dldF9wYXNzd29yZF9wb2xpY3knO1xuaW1wb3J0IHsgUGFzc3dvcmRQb2xpY3lJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL3Bhc3N3b3JkX3BvbGljeSc7XG5pbXBvcnQgeyBQYXNzd29yZFBvbGljeUltcGwgfSBmcm9tICcuL3Bhc3N3b3JkX3BvbGljeV9pbXBsJztcblxuaW50ZXJmYWNlIEFzeW5jQWN0aW9uIHtcbiAgKCk6IFByb21pc2U8dm9pZD47XG59XG5cbmV4cG9ydCBjb25zdCBlbnVtIERlZmF1bHRDb25maWcge1xuICBUT0tFTl9BUElfSE9TVCA9ICdzZWN1cmV0b2tlbi5nb29nbGVhcGlzLmNvbScsXG4gIEFQSV9IT1NUID0gJ2lkZW50aXR5dG9vbGtpdC5nb29nbGVhcGlzLmNvbScsXG4gIEFQSV9TQ0hFTUUgPSAnaHR0cHMnXG59XG5cbmV4cG9ydCBjbGFzcyBBdXRoSW1wbCBpbXBsZW1lbnRzIEF1dGhJbnRlcm5hbCwgX0ZpcmViYXNlU2VydmljZSB7XG4gIGN1cnJlbnRVc2VyOiBVc2VyIHwgbnVsbCA9IG51bGw7XG4gIGVtdWxhdG9yQ29uZmlnOiBFbXVsYXRvckNvbmZpZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG9wZXJhdGlvbnMgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgcHJpdmF0ZSBwZXJzaXN0ZW5jZU1hbmFnZXI/OiBQZXJzaXN0ZW5jZVVzZXJNYW5hZ2VyO1xuICBwcml2YXRlIHJlZGlyZWN0UGVyc2lzdGVuY2VNYW5hZ2VyPzogUGVyc2lzdGVuY2VVc2VyTWFuYWdlcjtcbiAgcHJpdmF0ZSBhdXRoU3RhdGVTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uPFVzZXI+KHRoaXMpO1xuICBwcml2YXRlIGlkVG9rZW5TdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uPFVzZXI+KHRoaXMpO1xuICBwcml2YXRlIHJlYWRvbmx5IGJlZm9yZVN0YXRlUXVldWUgPSBuZXcgQXV0aE1pZGRsZXdhcmVRdWV1ZSh0aGlzKTtcbiAgcHJpdmF0ZSByZWRpcmVjdFVzZXI6IFVzZXJJbnRlcm5hbCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGlzUHJvYWN0aXZlUmVmcmVzaEVuYWJsZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBFWFBFQ1RFRF9QQVNTV09SRF9QT0xJQ1lfU0NIRU1BX1ZFUlNJT046IG51bWJlciA9IDE7XG5cbiAgLy8gQW55IG5ldHdvcmsgY2FsbHMgd2lsbCBzZXQgdGhpcyB0byB0cnVlIGFuZCBwcmV2ZW50IHN1YnNlcXVlbnQgZW11bGF0b3JcbiAgLy8gaW5pdGlhbGl6YXRpb25cbiAgX2NhbkluaXRFbXVsYXRvciA9IHRydWU7XG4gIF9pc0luaXRpYWxpemVkID0gZmFsc2U7XG4gIF9kZWxldGVkID0gZmFsc2U7XG4gIF9pbml0aWFsaXphdGlvblByb21pc2U6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcbiAgX3BvcHVwUmVkaXJlY3RSZXNvbHZlcjogUG9wdXBSZWRpcmVjdFJlc29sdmVySW50ZXJuYWwgfCBudWxsID0gbnVsbDtcbiAgX2Vycm9yRmFjdG9yeTogRXJyb3JGYWN0b3J5PEF1dGhFcnJvckNvZGUsIEF1dGhFcnJvclBhcmFtcz4gPVxuICAgIF9ERUZBVUxUX0FVVEhfRVJST1JfRkFDVE9SWTtcbiAgX2FnZW50UmVjYXB0Y2hhQ29uZmlnOiBSZWNhcHRjaGFDb25maWcgfCBudWxsID0gbnVsbDtcbiAgX3RlbmFudFJlY2FwdGNoYUNvbmZpZ3M6IFJlY29yZDxzdHJpbmcsIFJlY2FwdGNoYUNvbmZpZz4gPSB7fTtcbiAgX3Byb2plY3RQYXNzd29yZFBvbGljeTogUGFzc3dvcmRQb2xpY3lJbnRlcm5hbCB8IG51bGwgPSBudWxsO1xuICBfdGVuYW50UGFzc3dvcmRQb2xpY2llczogUmVjb3JkPHN0cmluZywgUGFzc3dvcmRQb2xpY3lJbnRlcm5hbD4gPSB7fTtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8vIFRyYWNrcyB0aGUgbGFzdCBub3RpZmllZCBVSUQgZm9yIHN0YXRlIGNoYW5nZSBsaXN0ZW5lcnMgdG8gcHJldmVudFxuICAvLyByZXBlYXRlZCBjYWxscyB0byB0aGUgY2FsbGJhY2tzLiBVbmRlZmluZWQgbWVhbnMgaXQncyBuZXZlciBiZWVuXG4gIC8vIGNhbGxlZCwgd2hlcmVhcyBudWxsIG1lYW5zIGl0J3MgYmVlbiBjYWxsZWQgd2l0aCBhIHNpZ25lZCBvdXQgdXNlclxuICBwcml2YXRlIGxhc3ROb3RpZmllZFVpZDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICBsYW5ndWFnZUNvZGU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICB0ZW5hbnRJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHNldHRpbmdzOiBBdXRoU2V0dGluZ3MgPSB7IGFwcFZlcmlmaWNhdGlvbkRpc2FibGVkRm9yVGVzdGluZzogZmFsc2UgfTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgYXBwOiBGaXJlYmFzZUFwcCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGhlYXJ0YmVhdFNlcnZpY2VQcm92aWRlcjogUHJvdmlkZXI8J2hlYXJ0YmVhdCc+LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYXBwQ2hlY2tTZXJ2aWNlUHJvdmlkZXI6IFByb3ZpZGVyPEFwcENoZWNrSW50ZXJuYWxDb21wb25lbnROYW1lPixcbiAgICBwdWJsaWMgcmVhZG9ubHkgY29uZmlnOiBDb25maWdJbnRlcm5hbFxuICApIHtcbiAgICB0aGlzLm5hbWUgPSBhcHAubmFtZTtcbiAgICB0aGlzLmNsaWVudFZlcnNpb24gPSBjb25maWcuc2RrQ2xpZW50VmVyc2lvbjtcbiAgfVxuXG4gIF9pbml0aWFsaXplV2l0aFBlcnNpc3RlbmNlKFxuICAgIHBlcnNpc3RlbmNlSGllcmFyY2h5OiBQZXJzaXN0ZW5jZUludGVybmFsW10sXG4gICAgcG9wdXBSZWRpcmVjdFJlc29sdmVyPzogUG9wdXBSZWRpcmVjdFJlc29sdmVyXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChwb3B1cFJlZGlyZWN0UmVzb2x2ZXIpIHtcbiAgICAgIHRoaXMuX3BvcHVwUmVkaXJlY3RSZXNvbHZlciA9IF9nZXRJbnN0YW5jZShwb3B1cFJlZGlyZWN0UmVzb2x2ZXIpO1xuICAgIH1cblxuICAgIC8vIEhhdmUgdG8gY2hlY2sgZm9yIGFwcCBkZWxldGlvbiB0aHJvdWdob3V0IGluaXRpYWxpemF0aW9uIChhZnRlciBlYWNoXG4gICAgLy8gcHJvbWlzZSByZXNvbHV0aW9uKVxuICAgIHRoaXMuX2luaXRpYWxpemF0aW9uUHJvbWlzZSA9IHRoaXMucXVldWUoYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX2RlbGV0ZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnBlcnNpc3RlbmNlTWFuYWdlciA9IGF3YWl0IFBlcnNpc3RlbmNlVXNlck1hbmFnZXIuY3JlYXRlKFxuICAgICAgICB0aGlzLFxuICAgICAgICBwZXJzaXN0ZW5jZUhpZXJhcmNoeVxuICAgICAgKTtcblxuICAgICAgaWYgKHRoaXMuX2RlbGV0ZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBJbml0aWFsaXplIHRoZSByZXNvbHZlciBlYXJseSBpZiBuZWNlc3NhcnkgKG9ubHkgYXBwbGljYWJsZSB0byB3ZWI6XG4gICAgICAvLyB0aGlzIHdpbGwgY2F1c2UgdGhlIGlmcmFtZSB0byBsb2FkIGltbWVkaWF0ZWx5IGluIGNlcnRhaW4gY2FzZXMpXG4gICAgICBpZiAodGhpcy5fcG9wdXBSZWRpcmVjdFJlc29sdmVyPy5fc2hvdWxkSW5pdFByb2FjdGl2ZWx5KSB7XG4gICAgICAgIC8vIElmIHRoaXMgZmFpbHMsIGRvbid0IGhhbHQgYXV0aCBsb2FkaW5nXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5fcG9wdXBSZWRpcmVjdFJlc29sdmVyLl9pbml0aWFsaXplKHRoaXMpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLyogSWdub3JlIHRoZSBlcnJvciAqL1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZUN1cnJlbnRVc2VyKHBvcHVwUmVkaXJlY3RSZXNvbHZlcik7XG4gICAgICB0aGlzLmxhc3ROb3RpZmllZFVpZCA9IHRoaXMuY3VycmVudFVzZXI/LnVpZCB8fCBudWxsO1xuXG4gICAgICBpZiAodGhpcy5fZGVsZXRlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2lzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuX2luaXRpYWxpemF0aW9uUHJvbWlzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGUgcGVyc2lzdGVuY2UgaXMgY2hhbmdlZCBpbiBhbm90aGVyIHdpbmRvdywgdGhlIHVzZXIgbWFuYWdlciB3aWxsIGxldCB1cyBrbm93XG4gICAqL1xuICBhc3luYyBfb25TdG9yYWdlRXZlbnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuX2RlbGV0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5hc3NlcnRlZFBlcnNpc3RlbmNlLmdldEN1cnJlbnRVc2VyKCk7XG5cbiAgICBpZiAoIXRoaXMuY3VycmVudFVzZXIgJiYgIXVzZXIpIHtcbiAgICAgIC8vIE5vIGNoYW5nZSwgZG8gbm90aGluZyAod2FzIHNpZ25lZCBvdXQgYW5kIHJlbWFpbmVkIHNpZ25lZCBvdXQpLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBzYW1lIHVzZXIgaXMgdG8gYmUgc3luY2hyb25pemVkLlxuICAgIGlmICh0aGlzLmN1cnJlbnRVc2VyICYmIHVzZXIgJiYgdGhpcy5jdXJyZW50VXNlci51aWQgPT09IHVzZXIudWlkKSB7XG4gICAgICAvLyBEYXRhIHVwZGF0ZSwgc2ltcGx5IGNvcHkgZGF0YSBjaGFuZ2VzLlxuICAgICAgdGhpcy5fY3VycmVudFVzZXIuX2Fzc2lnbih1c2VyKTtcbiAgICAgIC8vIElmIHRva2VucyBjaGFuZ2VkIGZyb20gcHJldmlvdXMgdXNlciB0b2tlbnMsIHRoaXMgd2lsbCB0cmlnZ2VyXG4gICAgICAvLyBub3RpZnlBdXRoTGlzdGVuZXJzXy5cbiAgICAgIGF3YWl0IHRoaXMuY3VycmVudFVzZXIuZ2V0SWRUb2tlbigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBjdXJyZW50IEF1dGggc3RhdGUuIEVpdGhlciBhIG5ldyBsb2dpbiBvciBsb2dvdXQuXG4gICAgLy8gU2tpcCBibG9ja2luZyBjYWxsYmFja3MsIHRoZXkgc2hvdWxkIG5vdCBhcHBseSB0byBhIGNoYW5nZSBpbiBhbm90aGVyIHRhYi5cbiAgICBhd2FpdCB0aGlzLl91cGRhdGVDdXJyZW50VXNlcih1c2VyLCAvKiBza2lwQmVmb3JlU3RhdGVDYWxsYmFja3MgKi8gdHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGluaXRpYWxpemVDdXJyZW50VXNlcihcbiAgICBwb3B1cFJlZGlyZWN0UmVzb2x2ZXI/OiBQb3B1cFJlZGlyZWN0UmVzb2x2ZXJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gRmlyc3QgY2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYSBwZW5kaW5nIHJlZGlyZWN0IGV2ZW50LlxuICAgIGNvbnN0IHByZXZpb3VzbHlTdG9yZWRVc2VyID1cbiAgICAgIChhd2FpdCB0aGlzLmFzc2VydGVkUGVyc2lzdGVuY2UuZ2V0Q3VycmVudFVzZXIoKSkgYXMgVXNlckludGVybmFsIHwgbnVsbDtcbiAgICBsZXQgZnV0dXJlQ3VycmVudFVzZXIgPSBwcmV2aW91c2x5U3RvcmVkVXNlcjtcbiAgICBsZXQgbmVlZHNUb2NoZWNrTWlkZGxld2FyZSA9IGZhbHNlO1xuICAgIGlmIChwb3B1cFJlZGlyZWN0UmVzb2x2ZXIgJiYgdGhpcy5jb25maWcuYXV0aERvbWFpbikge1xuICAgICAgYXdhaXQgdGhpcy5nZXRPckluaXRSZWRpcmVjdFBlcnNpc3RlbmNlTWFuYWdlcigpO1xuICAgICAgY29uc3QgcmVkaXJlY3RVc2VyRXZlbnRJZCA9IHRoaXMucmVkaXJlY3RVc2VyPy5fcmVkaXJlY3RFdmVudElkO1xuICAgICAgY29uc3Qgc3RvcmVkVXNlckV2ZW50SWQgPSBmdXR1cmVDdXJyZW50VXNlcj8uX3JlZGlyZWN0RXZlbnRJZDtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMudHJ5UmVkaXJlY3RTaWduSW4ocG9wdXBSZWRpcmVjdFJlc29sdmVyKTtcblxuICAgICAgLy8gSWYgdGhlIHN0b3JlZCB1c2VyIChpLmUuIHRoZSBvbGQgXCJjdXJyZW50VXNlclwiKSBoYXMgYSByZWRpcmVjdElkIHRoYXRcbiAgICAgIC8vIG1hdGNoZXMgdGhlIHJlZGlyZWN0IHVzZXIsIHRoZW4gd2Ugd2FudCB0byBpbml0aWFsbHkgc2lnbiBpbiB3aXRoIHRoZVxuICAgICAgLy8gbmV3IHVzZXIgb2JqZWN0IGZyb20gcmVzdWx0LlxuICAgICAgLy8gVE9ETyhzYW1naG8pOiBNb3JlIHRob3JvdWdobHkgdGVzdCBhbGwgb2YgdGhpc1xuICAgICAgaWYgKFxuICAgICAgICAoIXJlZGlyZWN0VXNlckV2ZW50SWQgfHwgcmVkaXJlY3RVc2VyRXZlbnRJZCA9PT0gc3RvcmVkVXNlckV2ZW50SWQpICYmXG4gICAgICAgIHJlc3VsdD8udXNlclxuICAgICAgKSB7XG4gICAgICAgIGZ1dHVyZUN1cnJlbnRVc2VyID0gcmVzdWx0LnVzZXIgYXMgVXNlckludGVybmFsO1xuICAgICAgICBuZWVkc1RvY2hlY2tNaWRkbGV3YXJlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiBubyB1c2VyIGluIHBlcnNpc3RlbmNlLCB0aGVyZSBpcyBubyBjdXJyZW50IHVzZXIuIFNldCB0byBudWxsLlxuICAgIGlmICghZnV0dXJlQ3VycmVudFVzZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpcmVjdGx5U2V0Q3VycmVudFVzZXIobnVsbCk7XG4gICAgfVxuXG4gICAgaWYgKCFmdXR1cmVDdXJyZW50VXNlci5fcmVkaXJlY3RFdmVudElkKSB7XG4gICAgICAvLyBUaGlzIGlzbid0IGEgcmVkaXJlY3QgbGluayBvcGVyYXRpb24sIHdlIGNhbiByZWxvYWQgYW5kIGJhaWwuXG4gICAgICAvLyBGaXJzdCB0aG91Z2gsIGVuc3VyZSB0aGF0IHdlIGNoZWNrIHRoZSBtaWRkbGV3YXJlIGlzIGhhcHB5LlxuICAgICAgaWYgKG5lZWRzVG9jaGVja01pZGRsZXdhcmUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmJlZm9yZVN0YXRlUXVldWUucnVuTWlkZGxld2FyZShmdXR1cmVDdXJyZW50VXNlcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBmdXR1cmVDdXJyZW50VXNlciA9IHByZXZpb3VzbHlTdG9yZWRVc2VyO1xuICAgICAgICAgIC8vIFdlIGtub3cgdGhpcyBpcyBhdmFpbGFibGUgc2luY2UgdGhlIGJpdCBpcyBvbmx5IHNldCB3aGVuIHRoZVxuICAgICAgICAgIC8vIHJlc29sdmVyIGlzIGF2YWlsYWJsZVxuICAgICAgICAgIHRoaXMuX3BvcHVwUmVkaXJlY3RSZXNvbHZlciEuX292ZXJyaWRlUmVkaXJlY3RSZXN1bHQodGhpcywgKCkgPT5cbiAgICAgICAgICAgIFByb21pc2UucmVqZWN0KGUpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZnV0dXJlQ3VycmVudFVzZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVsb2FkQW5kU2V0Q3VycmVudFVzZXJPckNsZWFyKGZ1dHVyZUN1cnJlbnRVc2VyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpcmVjdGx5U2V0Q3VycmVudFVzZXIobnVsbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgX2Fzc2VydCh0aGlzLl9wb3B1cFJlZGlyZWN0UmVzb2x2ZXIsIHRoaXMsIEF1dGhFcnJvckNvZGUuQVJHVU1FTlRfRVJST1IpO1xuICAgIGF3YWl0IHRoaXMuZ2V0T3JJbml0UmVkaXJlY3RQZXJzaXN0ZW5jZU1hbmFnZXIoKTtcblxuICAgIC8vIElmIHRoZSByZWRpcmVjdCB1c2VyJ3MgZXZlbnQgSUQgbWF0Y2hlcyB0aGUgY3VycmVudCB1c2VyJ3MgZXZlbnQgSUQsXG4gICAgLy8gRE8gTk9UIHJlbG9hZCB0aGUgY3VycmVudCB1c2VyLCBvdGhlcndpc2UgdGhleSdsbCBiZSBjbGVhcmVkIGZyb20gc3RvcmFnZS5cbiAgICAvLyBUaGlzIGlzIGltcG9ydGFudCBmb3IgdGhlIHJlYXV0aGVudGljYXRlV2l0aFJlZGlyZWN0KCkgZmxvdy5cbiAgICBpZiAoXG4gICAgICB0aGlzLnJlZGlyZWN0VXNlciAmJlxuICAgICAgdGhpcy5yZWRpcmVjdFVzZXIuX3JlZGlyZWN0RXZlbnRJZCA9PT0gZnV0dXJlQ3VycmVudFVzZXIuX3JlZGlyZWN0RXZlbnRJZFxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMuZGlyZWN0bHlTZXRDdXJyZW50VXNlcihmdXR1cmVDdXJyZW50VXNlcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucmVsb2FkQW5kU2V0Q3VycmVudFVzZXJPckNsZWFyKGZ1dHVyZUN1cnJlbnRVc2VyKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdHJ5UmVkaXJlY3RTaWduSW4oXG4gICAgcmVkaXJlY3RSZXNvbHZlcjogUG9wdXBSZWRpcmVjdFJlc29sdmVyXG4gICk6IFByb21pc2U8VXNlckNyZWRlbnRpYWwgfCBudWxsPiB7XG4gICAgLy8gVGhlIHJlZGlyZWN0IHVzZXIgbmVlZHMgdG8gYmUgY2hlY2tlZCAoYW5kIHNpZ25lZCBpbiBpZiBhdmFpbGFibGUpXG4gICAgLy8gZHVyaW5nIGF1dGggaW5pdGlhbGl6YXRpb24uIEFsbCBvZiB0aGUgbm9ybWFsIHNpZ24gaW4gYW5kIGxpbmsvcmVhdXRoXG4gICAgLy8gZmxvd3MgY2FsbCBiYWNrIGludG8gYXV0aCBhbmQgcHVzaCB0aGluZ3Mgb250byB0aGUgcHJvbWlzZSBxdWV1ZS4gV2VcbiAgICAvLyBuZWVkIHRvIGF3YWl0IHRoZSByZXN1bHQgb2YgdGhlIHJlZGlyZWN0IHNpZ24gaW4gKmluc2lkZSB0aGUgcHJvbWlzZVxuICAgIC8vIHF1ZXVlKi4gVGhpcyBwcmVzZW50cyBhIHByb2JsZW06IHdlIHJ1biBpbnRvIGRlYWRsb2NrLiBTZWU6XG4gICAgLy8gICAg4pSMPiBbSW5pdGlhbGl6YXRpb25dIOKUgOKUgOKUgOKUgOKUgOKUkFxuICAgIC8vICAgIOKUjD4gWzxvdGhlciBxdWV1ZSB0YXNrcz5dIOKUglxuICAgIC8vICAgIOKUlOKUgCBbZ2V0UmVkaXJlY3RSZXN1bHRdIDzilIDilJhcbiAgICAvLyAgICB3aGVyZSBbXSBhcmUgdGFza3Mgb24gdGhlIHF1ZXVlIGFuZCBhcnJvd3MgZGVub3RlIGF3YWl0c1xuICAgIC8vIEluaXRpYWxpemF0aW9uIHdpbGwgbmV2ZXIgY29tcGxldGUgYmVjYXVzZSBpdCdzIHdhaXRpbmcgb24gc29tZXRoaW5nXG4gICAgLy8gdGhhdCdzIHdhaXRpbmcgZm9yIGluaXRpYWxpemF0aW9uIHRvIGNvbXBsZXRlIVxuICAgIC8vXG4gICAgLy8gSW5zdGVhZCwgdGhpcyBtZXRob2QgY2FsbHMgZ2V0UmVkaXJlY3RSZXN1bHQoKSAoc3RvcmVkIGluXG4gICAgLy8gX2NvbXBsZXRlUmVkaXJlY3RGbikgd2l0aCBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgdGhhdCBpbnN0cnVjdHMgYWxsIG9mXG4gICAgLy8gdGhlIHVuZGVybHlpbmcgYXV0aCBvcGVyYXRpb25zIHRvIHNraXAgYW55dGhpbmcgdGhhdCBtdXRhdGVzIGF1dGggc3RhdGUuXG5cbiAgICBsZXQgcmVzdWx0OiBVc2VyQ3JlZGVudGlhbCB8IG51bGwgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICAvLyBXZSBrbm93IHRoaXMuX3BvcHVwUmVkaXJlY3RSZXNvbHZlciBpcyBzZXQgc2luY2UgcmVkaXJlY3RSZXNvbHZlclxuICAgICAgLy8gaXMgcGFzc2VkIGluLiBUaGUgX2NvbXBsZXRlUmVkaXJlY3RGbiBleHBlY3RzIHRoZSB1bndyYXBwZWQgZXh0ZXJuLlxuICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5fcG9wdXBSZWRpcmVjdFJlc29sdmVyIS5fY29tcGxldGVSZWRpcmVjdEZuKFxuICAgICAgICB0aGlzLFxuICAgICAgICByZWRpcmVjdFJlc29sdmVyLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIFN3YWxsb3cgYW55IGVycm9ycyBoZXJlOyB0aGUgY29kZSBjYW4gcmV0cmlldmUgdGhlbSBpblxuICAgICAgLy8gZ2V0UmVkaXJlY3RSZXN1bHQoKS5cbiAgICAgIGF3YWl0IHRoaXMuX3NldFJlZGlyZWN0VXNlcihudWxsKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWxvYWRBbmRTZXRDdXJyZW50VXNlck9yQ2xlYXIoXG4gICAgdXNlcjogVXNlckludGVybmFsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBfcmVsb2FkV2l0aG91dFNhdmluZyh1c2VyKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoXG4gICAgICAgIChlIGFzIEZpcmViYXNlRXJyb3IpPy5jb2RlICE9PVxuICAgICAgICBgYXV0aC8ke0F1dGhFcnJvckNvZGUuTkVUV09SS19SRVFVRVNUX0ZBSUxFRH1gXG4gICAgICApIHtcbiAgICAgICAgLy8gU29tZXRoaW5nJ3Mgd3Jvbmcgd2l0aCB0aGUgdXNlcidzIHRva2VuLiBMb2cgdGhlbSBvdXQgYW5kIHJlbW92ZVxuICAgICAgICAvLyB0aGVtIGZyb20gc3RvcmFnZVxuICAgICAgICByZXR1cm4gdGhpcy5kaXJlY3RseVNldEN1cnJlbnRVc2VyKG51bGwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmRpcmVjdGx5U2V0Q3VycmVudFVzZXIodXNlcik7XG4gIH1cblxuICB1c2VEZXZpY2VMYW5ndWFnZSgpOiB2b2lkIHtcbiAgICB0aGlzLmxhbmd1YWdlQ29kZSA9IF9nZXRVc2VyTGFuZ3VhZ2UoKTtcbiAgfVxuXG4gIGFzeW5jIF9kZWxldGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5fZGVsZXRlZCA9IHRydWU7XG4gIH1cblxuICBhc3luYyB1cGRhdGVDdXJyZW50VXNlcih1c2VyRXh0ZXJuOiBVc2VyIHwgbnVsbCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFRoZSBwdWJsaWMgdXBkYXRlQ3VycmVudFVzZXIgbWV0aG9kIG5lZWRzIHRvIG1ha2UgYSBjb3B5IG9mIHRoZSB1c2VyLFxuICAgIC8vIGFuZCBhbHNvIGNoZWNrIHRoYXQgdGhlIHByb2plY3QgbWF0Y2hlc1xuICAgIGNvbnN0IHVzZXIgPSB1c2VyRXh0ZXJuXG4gICAgICA/IChnZXRNb2R1bGFySW5zdGFuY2UodXNlckV4dGVybikgYXMgVXNlckludGVybmFsKVxuICAgICAgOiBudWxsO1xuICAgIGlmICh1c2VyKSB7XG4gICAgICBfYXNzZXJ0KFxuICAgICAgICB1c2VyLmF1dGguY29uZmlnLmFwaUtleSA9PT0gdGhpcy5jb25maWcuYXBpS2V5LFxuICAgICAgICB0aGlzLFxuICAgICAgICBBdXRoRXJyb3JDb2RlLklOVkFMSURfQVVUSFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3VwZGF0ZUN1cnJlbnRVc2VyKHVzZXIgJiYgdXNlci5fY2xvbmUodGhpcykpO1xuICB9XG5cbiAgYXN5bmMgX3VwZGF0ZUN1cnJlbnRVc2VyKFxuICAgIHVzZXI6IFVzZXIgfCBudWxsLFxuICAgIHNraXBCZWZvcmVTdGF0ZUNhbGxiYWNrczogYm9vbGVhbiA9IGZhbHNlXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLl9kZWxldGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh1c2VyKSB7XG4gICAgICBfYXNzZXJ0KFxuICAgICAgICB0aGlzLnRlbmFudElkID09PSB1c2VyLnRlbmFudElkLFxuICAgICAgICB0aGlzLFxuICAgICAgICBBdXRoRXJyb3JDb2RlLlRFTkFOVF9JRF9NSVNNQVRDSFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXNraXBCZWZvcmVTdGF0ZUNhbGxiYWNrcykge1xuICAgICAgYXdhaXQgdGhpcy5iZWZvcmVTdGF0ZVF1ZXVlLnJ1bk1pZGRsZXdhcmUodXNlcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucXVldWUoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5kaXJlY3RseVNldEN1cnJlbnRVc2VyKHVzZXIgYXMgVXNlckludGVybmFsIHwgbnVsbCk7XG4gICAgICB0aGlzLm5vdGlmeUF1dGhMaXN0ZW5lcnMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHNpZ25PdXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gUnVuIGZpcnN0LCB0byBibG9jayBfc2V0UmVkaXJlY3RVc2VyKCkgaWYgYW55IGNhbGxiYWNrcyBmYWlsLlxuICAgIGF3YWl0IHRoaXMuYmVmb3JlU3RhdGVRdWV1ZS5ydW5NaWRkbGV3YXJlKG51bGwpO1xuICAgIC8vIENsZWFyIHRoZSByZWRpcmVjdCB1c2VyIHdoZW4gc2lnbk91dCBpcyBjYWxsZWRcbiAgICBpZiAodGhpcy5yZWRpcmVjdFBlcnNpc3RlbmNlTWFuYWdlciB8fCB0aGlzLl9wb3B1cFJlZGlyZWN0UmVzb2x2ZXIpIHtcbiAgICAgIGF3YWl0IHRoaXMuX3NldFJlZGlyZWN0VXNlcihudWxsKTtcbiAgICB9XG5cbiAgICAvLyBQcmV2ZW50IGNhbGxiYWNrcyBmcm9tIGJlaW5nIGNhbGxlZCBhZ2FpbiBpbiBfdXBkYXRlQ3VycmVudFVzZXIsIGFzXG4gICAgLy8gdGhleSB3ZXJlIGFscmVhZHkgY2FsbGVkIGluIHRoZSBmaXJzdCBsaW5lLlxuICAgIHJldHVybiB0aGlzLl91cGRhdGVDdXJyZW50VXNlcihudWxsLCAvKiBza2lwQmVmb3JlU3RhdGVDYWxsYmFja3MgKi8gdHJ1ZSk7XG4gIH1cblxuICBzZXRQZXJzaXN0ZW5jZShwZXJzaXN0ZW5jZTogUGVyc2lzdGVuY2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5xdWV1ZShhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLmFzc2VydGVkUGVyc2lzdGVuY2Uuc2V0UGVyc2lzdGVuY2UoX2dldEluc3RhbmNlKHBlcnNpc3RlbmNlKSk7XG4gICAgfSk7XG4gIH1cblxuICBfZ2V0UmVjYXB0Y2hhQ29uZmlnKCk6IFJlY2FwdGNoYUNvbmZpZyB8IG51bGwge1xuICAgIGlmICh0aGlzLnRlbmFudElkID09IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLl9hZ2VudFJlY2FwdGNoYUNvbmZpZztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX3RlbmFudFJlY2FwdGNoYUNvbmZpZ3NbdGhpcy50ZW5hbnRJZF07XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgdmFsaWRhdGVQYXNzd29yZChwYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTxQYXNzd29yZFZhbGlkYXRpb25TdGF0dXM+IHtcbiAgICBpZiAoIXRoaXMuX2dldFBhc3N3b3JkUG9saWN5SW50ZXJuYWwoKSkge1xuICAgICAgYXdhaXQgdGhpcy5fdXBkYXRlUGFzc3dvcmRQb2xpY3koKTtcbiAgICB9XG5cbiAgICAvLyBQYXNzd29yZCBwb2xpY3kgd2lsbCBiZSBkZWZpbmVkIGFmdGVyIGZldGNoaW5nLlxuICAgIGNvbnN0IHBhc3N3b3JkUG9saWN5OiBQYXNzd29yZFBvbGljeUludGVybmFsID1cbiAgICAgIHRoaXMuX2dldFBhc3N3b3JkUG9saWN5SW50ZXJuYWwoKSE7XG5cbiAgICAvLyBDaGVjayB0aGF0IHRoZSBwb2xpY3kgc2NoZW1hIHZlcnNpb24gaXMgc3VwcG9ydGVkIGJ5IHRoZSBTREsuXG4gICAgLy8gVE9ETzogVXBkYXRlIHRoaXMgbG9naWMgdG8gdXNlIGEgbWF4IHN1cHBvcnRlZCBwb2xpY3kgc2NoZW1hIHZlcnNpb24gb25jZSB3ZSBoYXZlIG11bHRpcGxlIHNjaGVtYSB2ZXJzaW9ucy5cbiAgICBpZiAoXG4gICAgICBwYXNzd29yZFBvbGljeS5zY2hlbWFWZXJzaW9uICE9PVxuICAgICAgdGhpcy5FWFBFQ1RFRF9QQVNTV09SRF9QT0xJQ1lfU0NIRU1BX1ZFUlNJT05cbiAgICApIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgICAgdGhpcy5fZXJyb3JGYWN0b3J5LmNyZWF0ZShcbiAgICAgICAgICBBdXRoRXJyb3JDb2RlLlVOU1VQUE9SVEVEX1BBU1NXT1JEX1BPTElDWV9TQ0hFTUFfVkVSU0lPTixcbiAgICAgICAgICB7fVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBwYXNzd29yZFBvbGljeS52YWxpZGF0ZVBhc3N3b3JkKHBhc3N3b3JkKTtcbiAgfVxuXG4gIF9nZXRQYXNzd29yZFBvbGljeUludGVybmFsKCk6IFBhc3N3b3JkUG9saWN5SW50ZXJuYWwgfCBudWxsIHtcbiAgICBpZiAodGhpcy50ZW5hbnRJZCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3Byb2plY3RQYXNzd29yZFBvbGljeTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX3RlbmFudFBhc3N3b3JkUG9saWNpZXNbdGhpcy50ZW5hbnRJZF07XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgX3VwZGF0ZVBhc3N3b3JkUG9saWN5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgX2dldFBhc3N3b3JkUG9saWN5KHRoaXMpO1xuXG4gICAgY29uc3QgcGFzc3dvcmRQb2xpY3k6IFBhc3N3b3JkUG9saWN5SW50ZXJuYWwgPSBuZXcgUGFzc3dvcmRQb2xpY3lJbXBsKFxuICAgICAgcmVzcG9uc2VcbiAgICApO1xuXG4gICAgaWYgKHRoaXMudGVuYW50SWQgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuX3Byb2plY3RQYXNzd29yZFBvbGljeSA9IHBhc3N3b3JkUG9saWN5O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl90ZW5hbnRQYXNzd29yZFBvbGljaWVzW3RoaXMudGVuYW50SWRdID0gcGFzc3dvcmRQb2xpY3k7XG4gICAgfVxuICB9XG5cbiAgX2dldFBlcnNpc3RlbmNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYXNzZXJ0ZWRQZXJzaXN0ZW5jZS5wZXJzaXN0ZW5jZS50eXBlO1xuICB9XG5cbiAgX3VwZGF0ZUVycm9yTWFwKGVycm9yTWFwOiBBdXRoRXJyb3JNYXApOiB2b2lkIHtcbiAgICB0aGlzLl9lcnJvckZhY3RvcnkgPSBuZXcgRXJyb3JGYWN0b3J5PEF1dGhFcnJvckNvZGUsIEF1dGhFcnJvclBhcmFtcz4oXG4gICAgICAnYXV0aCcsXG4gICAgICAnRmlyZWJhc2UnLFxuICAgICAgKGVycm9yTWFwIGFzIEVycm9yTWFwUmV0cmlldmVyKSgpXG4gICAgKTtcbiAgfVxuXG4gIG9uQXV0aFN0YXRlQ2hhbmdlZChcbiAgICBuZXh0T3JPYnNlcnZlcjogTmV4dE9yT2JzZXJ2ZXI8VXNlcj4sXG4gICAgZXJyb3I/OiBFcnJvckZuLFxuICAgIGNvbXBsZXRlZD86IENvbXBsZXRlRm5cbiAgKTogVW5zdWJzY3JpYmUge1xuICAgIHJldHVybiB0aGlzLnJlZ2lzdGVyU3RhdGVMaXN0ZW5lcihcbiAgICAgIHRoaXMuYXV0aFN0YXRlU3Vic2NyaXB0aW9uLFxuICAgICAgbmV4dE9yT2JzZXJ2ZXIsXG4gICAgICBlcnJvcixcbiAgICAgIGNvbXBsZXRlZFxuICAgICk7XG4gIH1cblxuICBiZWZvcmVBdXRoU3RhdGVDaGFuZ2VkKFxuICAgIGNhbGxiYWNrOiAodXNlcjogVXNlciB8IG51bGwpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+LFxuICAgIG9uQWJvcnQ/OiAoKSA9PiB2b2lkXG4gICk6IFVuc3Vic2NyaWJlIHtcbiAgICByZXR1cm4gdGhpcy5iZWZvcmVTdGF0ZVF1ZXVlLnB1c2hDYWxsYmFjayhjYWxsYmFjaywgb25BYm9ydCk7XG4gIH1cblxuICBvbklkVG9rZW5DaGFuZ2VkKFxuICAgIG5leHRPck9ic2VydmVyOiBOZXh0T3JPYnNlcnZlcjxVc2VyPixcbiAgICBlcnJvcj86IEVycm9yRm4sXG4gICAgY29tcGxldGVkPzogQ29tcGxldGVGblxuICApOiBVbnN1YnNjcmliZSB7XG4gICAgcmV0dXJuIHRoaXMucmVnaXN0ZXJTdGF0ZUxpc3RlbmVyKFxuICAgICAgdGhpcy5pZFRva2VuU3Vic2NyaXB0aW9uLFxuICAgICAgbmV4dE9yT2JzZXJ2ZXIsXG4gICAgICBlcnJvcixcbiAgICAgIGNvbXBsZXRlZFxuICAgICk7XG4gIH1cblxuICBhdXRoU3RhdGVSZWFkeSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKHRoaXMuY3VycmVudFVzZXIpIHtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdW5zdWJzY3JpYmUgPSB0aGlzLm9uQXV0aFN0YXRlQ2hhbmdlZCgoKSA9PiB7XG4gICAgICAgICAgdW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0sIHJlamVjdCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICB0b0pTT04oKTogb2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgYXBpS2V5OiB0aGlzLmNvbmZpZy5hcGlLZXksXG4gICAgICBhdXRoRG9tYWluOiB0aGlzLmNvbmZpZy5hdXRoRG9tYWluLFxuICAgICAgYXBwTmFtZTogdGhpcy5uYW1lLFxuICAgICAgY3VycmVudFVzZXI6IHRoaXMuX2N1cnJlbnRVc2VyPy50b0pTT04oKVxuICAgIH07XG4gIH1cblxuICBhc3luYyBfc2V0UmVkaXJlY3RVc2VyKFxuICAgIHVzZXI6IFVzZXJJbnRlcm5hbCB8IG51bGwsXG4gICAgcG9wdXBSZWRpcmVjdFJlc29sdmVyPzogUG9wdXBSZWRpcmVjdFJlc29sdmVyXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlZGlyZWN0TWFuYWdlciA9IGF3YWl0IHRoaXMuZ2V0T3JJbml0UmVkaXJlY3RQZXJzaXN0ZW5jZU1hbmFnZXIoXG4gICAgICBwb3B1cFJlZGlyZWN0UmVzb2x2ZXJcbiAgICApO1xuICAgIHJldHVybiB1c2VyID09PSBudWxsXG4gICAgICA/IHJlZGlyZWN0TWFuYWdlci5yZW1vdmVDdXJyZW50VXNlcigpXG4gICAgICA6IHJlZGlyZWN0TWFuYWdlci5zZXRDdXJyZW50VXNlcih1c2VyKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0T3JJbml0UmVkaXJlY3RQZXJzaXN0ZW5jZU1hbmFnZXIoXG4gICAgcG9wdXBSZWRpcmVjdFJlc29sdmVyPzogUG9wdXBSZWRpcmVjdFJlc29sdmVyXG4gICk6IFByb21pc2U8UGVyc2lzdGVuY2VVc2VyTWFuYWdlcj4ge1xuICAgIGlmICghdGhpcy5yZWRpcmVjdFBlcnNpc3RlbmNlTWFuYWdlcikge1xuICAgICAgY29uc3QgcmVzb2x2ZXI6IFBvcHVwUmVkaXJlY3RSZXNvbHZlckludGVybmFsIHwgbnVsbCA9XG4gICAgICAgIChwb3B1cFJlZGlyZWN0UmVzb2x2ZXIgJiYgX2dldEluc3RhbmNlKHBvcHVwUmVkaXJlY3RSZXNvbHZlcikpIHx8XG4gICAgICAgIHRoaXMuX3BvcHVwUmVkaXJlY3RSZXNvbHZlcjtcbiAgICAgIF9hc3NlcnQocmVzb2x2ZXIsIHRoaXMsIEF1dGhFcnJvckNvZGUuQVJHVU1FTlRfRVJST1IpO1xuICAgICAgdGhpcy5yZWRpcmVjdFBlcnNpc3RlbmNlTWFuYWdlciA9IGF3YWl0IFBlcnNpc3RlbmNlVXNlck1hbmFnZXIuY3JlYXRlKFxuICAgICAgICB0aGlzLFxuICAgICAgICBbX2dldEluc3RhbmNlKHJlc29sdmVyLl9yZWRpcmVjdFBlcnNpc3RlbmNlKV0sXG4gICAgICAgIEtleU5hbWUuUkVESVJFQ1RfVVNFUlxuICAgICAgKTtcbiAgICAgIHRoaXMucmVkaXJlY3RVc2VyID1cbiAgICAgICAgYXdhaXQgdGhpcy5yZWRpcmVjdFBlcnNpc3RlbmNlTWFuYWdlci5nZXRDdXJyZW50VXNlcigpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnJlZGlyZWN0UGVyc2lzdGVuY2VNYW5hZ2VyO1xuICB9XG5cbiAgYXN5bmMgX3JlZGlyZWN0VXNlckZvcklkKGlkOiBzdHJpbmcpOiBQcm9taXNlPFVzZXJJbnRlcm5hbCB8IG51bGw+IHtcbiAgICAvLyBNYWtlIHN1cmUgd2UndmUgY2xlYXJlZCBhbnkgcGVuZGluZyBwZXJzaXN0ZW5jZSBhY3Rpb25zIGlmIHdlJ3JlIG5vdCBpblxuICAgIC8vIHRoZSBpbml0aWFsaXplclxuICAgIGlmICh0aGlzLl9pc0luaXRpYWxpemVkKSB7XG4gICAgICBhd2FpdCB0aGlzLnF1ZXVlKGFzeW5jICgpID0+IHt9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY3VycmVudFVzZXI/Ll9yZWRpcmVjdEV2ZW50SWQgPT09IGlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5fY3VycmVudFVzZXI7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVkaXJlY3RVc2VyPy5fcmVkaXJlY3RFdmVudElkID09PSBpZCkge1xuICAgICAgcmV0dXJuIHRoaXMucmVkaXJlY3RVc2VyO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgYXN5bmMgX3BlcnNpc3RVc2VySWZDdXJyZW50KHVzZXI6IFVzZXJJbnRlcm5hbCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh1c2VyID09PSB0aGlzLmN1cnJlbnRVc2VyKSB7XG4gICAgICByZXR1cm4gdGhpcy5xdWV1ZShhc3luYyAoKSA9PiB0aGlzLmRpcmVjdGx5U2V0Q3VycmVudFVzZXIodXNlcikpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBOb3RpZmllcyBsaXN0ZW5lcnMgb25seSBpZiB0aGUgdXNlciBpcyBjdXJyZW50ICovXG4gIF9ub3RpZnlMaXN0ZW5lcnNJZkN1cnJlbnQodXNlcjogVXNlckludGVybmFsKTogdm9pZCB7XG4gICAgaWYgKHVzZXIgPT09IHRoaXMuY3VycmVudFVzZXIpIHtcbiAgICAgIHRoaXMubm90aWZ5QXV0aExpc3RlbmVycygpO1xuICAgIH1cbiAgfVxuXG4gIF9rZXkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5jb25maWcuYXV0aERvbWFpbn06JHt0aGlzLmNvbmZpZy5hcGlLZXl9OiR7dGhpcy5uYW1lfWA7XG4gIH1cblxuICBfc3RhcnRQcm9hY3RpdmVSZWZyZXNoKCk6IHZvaWQge1xuICAgIHRoaXMuaXNQcm9hY3RpdmVSZWZyZXNoRW5hYmxlZCA9IHRydWU7XG4gICAgaWYgKHRoaXMuY3VycmVudFVzZXIpIHtcbiAgICAgIHRoaXMuX2N1cnJlbnRVc2VyLl9zdGFydFByb2FjdGl2ZVJlZnJlc2goKTtcbiAgICB9XG4gIH1cblxuICBfc3RvcFByb2FjdGl2ZVJlZnJlc2goKTogdm9pZCB7XG4gICAgdGhpcy5pc1Byb2FjdGl2ZVJlZnJlc2hFbmFibGVkID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuY3VycmVudFVzZXIpIHtcbiAgICAgIHRoaXMuX2N1cnJlbnRVc2VyLl9zdG9wUHJvYWN0aXZlUmVmcmVzaCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBjdXJyZW50IHVzZXIgY2FzdCBhcyB0aGUgaW50ZXJuYWwgdHlwZSAqL1xuICBnZXQgX2N1cnJlbnRVc2VyKCk6IFVzZXJJbnRlcm5hbCB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFVzZXIgYXMgVXNlckludGVybmFsO1xuICB9XG5cbiAgcHJpdmF0ZSBub3RpZnlBdXRoTGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5faXNJbml0aWFsaXplZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaWRUb2tlblN1YnNjcmlwdGlvbi5uZXh0KHRoaXMuY3VycmVudFVzZXIpO1xuXG4gICAgY29uc3QgY3VycmVudFVpZCA9IHRoaXMuY3VycmVudFVzZXI/LnVpZCA/PyBudWxsO1xuICAgIGlmICh0aGlzLmxhc3ROb3RpZmllZFVpZCAhPT0gY3VycmVudFVpZCkge1xuICAgICAgdGhpcy5sYXN0Tm90aWZpZWRVaWQgPSBjdXJyZW50VWlkO1xuICAgICAgdGhpcy5hdXRoU3RhdGVTdWJzY3JpcHRpb24ubmV4dCh0aGlzLmN1cnJlbnRVc2VyKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyU3RhdGVMaXN0ZW5lcihcbiAgICBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjxVc2VyPixcbiAgICBuZXh0T3JPYnNlcnZlcjogTmV4dE9yT2JzZXJ2ZXI8VXNlcj4sXG4gICAgZXJyb3I/OiBFcnJvckZuLFxuICAgIGNvbXBsZXRlZD86IENvbXBsZXRlRm5cbiAgKTogVW5zdWJzY3JpYmUge1xuICAgIGlmICh0aGlzLl9kZWxldGVkKSB7XG4gICAgICByZXR1cm4gKCkgPT4ge307XG4gICAgfVxuXG4gICAgY29uc3QgY2IgPVxuICAgICAgdHlwZW9mIG5leHRPck9ic2VydmVyID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gbmV4dE9yT2JzZXJ2ZXJcbiAgICAgICAgOiBuZXh0T3JPYnNlcnZlci5uZXh0LmJpbmQobmV4dE9yT2JzZXJ2ZXIpO1xuXG4gICAgbGV0IGlzVW5zdWJzY3JpYmVkID0gZmFsc2U7XG5cbiAgICBjb25zdCBwcm9taXNlID0gdGhpcy5faXNJbml0aWFsaXplZFxuICAgICAgPyBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgOiB0aGlzLl9pbml0aWFsaXphdGlvblByb21pc2U7XG4gICAgX2Fzc2VydChwcm9taXNlLCB0aGlzLCBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SKTtcbiAgICAvLyBUaGUgY2FsbGJhY2sgbmVlZHMgdG8gYmUgY2FsbGVkIGFzeW5jaHJvbm91c2x5IHBlciB0aGUgc3BlYy5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWZsb2F0aW5nLXByb21pc2VzXG4gICAgcHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgIGlmIChpc1Vuc3Vic2NyaWJlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjYih0aGlzLmN1cnJlbnRVc2VyKTtcbiAgICB9KTtcblxuICAgIGlmICh0eXBlb2YgbmV4dE9yT2JzZXJ2ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gc3Vic2NyaXB0aW9uLmFkZE9ic2VydmVyKFxuICAgICAgICBuZXh0T3JPYnNlcnZlcixcbiAgICAgICAgZXJyb3IsXG4gICAgICAgIGNvbXBsZXRlZFxuICAgICAgKTtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGlzVW5zdWJzY3JpYmVkID0gdHJ1ZTtcbiAgICAgICAgdW5zdWJzY3JpYmUoKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gc3Vic2NyaXB0aW9uLmFkZE9ic2VydmVyKG5leHRPck9ic2VydmVyKTtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGlzVW5zdWJzY3JpYmVkID0gdHJ1ZTtcbiAgICAgICAgdW5zdWJzY3JpYmUoKTtcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVucHJvdGVjdGVkIChmcm9tIHJhY2UgY29uZGl0aW9ucykgbWV0aG9kIHRvIHNldCB0aGUgY3VycmVudCB1c2VyLiBUaGlzXG4gICAqIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tIHdpdGhpbiBhIHF1ZXVlZCBjYWxsYmFjay4gVGhpcyBpcyBuZWNlc3NhcnlcbiAgICogYmVjYXVzZSB0aGUgcXVldWUgc2hvdWxkbid0IHJlbHkgb24gYW5vdGhlciBxdWV1ZWQgY2FsbGJhY2suXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpcmVjdGx5U2V0Q3VycmVudFVzZXIoXG4gICAgdXNlcjogVXNlckludGVybmFsIHwgbnVsbFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5jdXJyZW50VXNlciAmJiB0aGlzLmN1cnJlbnRVc2VyICE9PSB1c2VyKSB7XG4gICAgICB0aGlzLl9jdXJyZW50VXNlci5fc3RvcFByb2FjdGl2ZVJlZnJlc2goKTtcbiAgICB9XG4gICAgaWYgKHVzZXIgJiYgdGhpcy5pc1Byb2FjdGl2ZVJlZnJlc2hFbmFibGVkKSB7XG4gICAgICB1c2VyLl9zdGFydFByb2FjdGl2ZVJlZnJlc2goKTtcbiAgICB9XG5cbiAgICB0aGlzLmN1cnJlbnRVc2VyID0gdXNlcjtcblxuICAgIGlmICh1c2VyKSB7XG4gICAgICBhd2FpdCB0aGlzLmFzc2VydGVkUGVyc2lzdGVuY2Uuc2V0Q3VycmVudFVzZXIodXNlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuYXNzZXJ0ZWRQZXJzaXN0ZW5jZS5yZW1vdmVDdXJyZW50VXNlcigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcXVldWUoYWN0aW9uOiBBc3luY0FjdGlvbik6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEluIGNhc2Ugc29tZXRoaW5nIGVycm9ycywgdGhlIGNhbGxiYWNrIHN0aWxsIHNob3VsZCBiZSBjYWxsZWQgaW4gb3JkZXJcbiAgICAvLyB0byBrZWVwIHRoZSBwcm9taXNlIGNoYWluIGFsaXZlXG4gICAgdGhpcy5vcGVyYXRpb25zID0gdGhpcy5vcGVyYXRpb25zLnRoZW4oYWN0aW9uLCBhY3Rpb24pO1xuICAgIHJldHVybiB0aGlzLm9wZXJhdGlvbnM7XG4gIH1cblxuICBwcml2YXRlIGdldCBhc3NlcnRlZFBlcnNpc3RlbmNlKCk6IFBlcnNpc3RlbmNlVXNlck1hbmFnZXIge1xuICAgIF9hc3NlcnQodGhpcy5wZXJzaXN0ZW5jZU1hbmFnZXIsIHRoaXMsIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IpO1xuICAgIHJldHVybiB0aGlzLnBlcnNpc3RlbmNlTWFuYWdlcjtcbiAgfVxuXG4gIHByaXZhdGUgZnJhbWV3b3Jrczogc3RyaW5nW10gPSBbXTtcbiAgcHJpdmF0ZSBjbGllbnRWZXJzaW9uOiBzdHJpbmc7XG4gIF9sb2dGcmFtZXdvcmsoZnJhbWV3b3JrOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIWZyYW1ld29yayB8fCB0aGlzLmZyYW1ld29ya3MuaW5jbHVkZXMoZnJhbWV3b3JrKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmZyYW1ld29ya3MucHVzaChmcmFtZXdvcmspO1xuXG4gICAgLy8gU29ydCBhbHBoYWJldGljYWxseSBzbyB0aGF0IFwiRmlyZWJhc2VDb3JlLXdlYixGaXJlYmFzZVVJLXdlYlwiIGFuZFxuICAgIC8vIFwiRmlyZWJhc2VVSS13ZWIsRmlyZWJhc2VDb3JlLXdlYlwiIGFyZW4ndCB2aWV3ZWQgYXMgZGlmZmVyZW50LlxuICAgIHRoaXMuZnJhbWV3b3Jrcy5zb3J0KCk7XG4gICAgdGhpcy5jbGllbnRWZXJzaW9uID0gX2dldENsaWVudFZlcnNpb24oXG4gICAgICB0aGlzLmNvbmZpZy5jbGllbnRQbGF0Zm9ybSxcbiAgICAgIHRoaXMuX2dldEZyYW1ld29ya3MoKVxuICAgICk7XG4gIH1cbiAgX2dldEZyYW1ld29ya3MoKTogcmVhZG9ubHkgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmZyYW1ld29ya3M7XG4gIH1cbiAgYXN5bmMgX2dldEFkZGl0aW9uYWxIZWFkZXJzKCk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4ge1xuICAgIC8vIEFkZGl0aW9uYWwgaGVhZGVycyBvbiBldmVyeSByZXF1ZXN0XG4gICAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIFtIdHRwSGVhZGVyLlhfQ0xJRU5UX1ZFUlNJT05dOiB0aGlzLmNsaWVudFZlcnNpb25cbiAgICB9O1xuXG4gICAgaWYgKHRoaXMuYXBwLm9wdGlvbnMuYXBwSWQpIHtcbiAgICAgIGhlYWRlcnNbSHR0cEhlYWRlci5YX0ZJUkVCQVNFX0dNUElEXSA9IHRoaXMuYXBwLm9wdGlvbnMuYXBwSWQ7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGhlYXJ0YmVhdCBzZXJ2aWNlIGV4aXN0cywgYWRkIHRoZSBoZWFydGJlYXQgc3RyaW5nXG4gICAgY29uc3QgaGVhcnRiZWF0c0hlYWRlciA9IGF3YWl0IHRoaXMuaGVhcnRiZWF0U2VydmljZVByb3ZpZGVyXG4gICAgICAuZ2V0SW1tZWRpYXRlKHtcbiAgICAgICAgb3B0aW9uYWw6IHRydWVcbiAgICAgIH0pXG4gICAgICA/LmdldEhlYXJ0YmVhdHNIZWFkZXIoKTtcbiAgICBpZiAoaGVhcnRiZWF0c0hlYWRlcikge1xuICAgICAgaGVhZGVyc1tIdHRwSGVhZGVyLlhfRklSRUJBU0VfQ0xJRU5UXSA9IGhlYXJ0YmVhdHNIZWFkZXI7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIEFwcCBDaGVjayBzZXJ2aWNlIGV4aXN0cywgYWRkIHRoZSBBcHAgQ2hlY2sgdG9rZW4gaW4gdGhlIGhlYWRlcnNcbiAgICBjb25zdCBhcHBDaGVja1Rva2VuID0gYXdhaXQgdGhpcy5fZ2V0QXBwQ2hlY2tUb2tlbigpO1xuICAgIGlmIChhcHBDaGVja1Rva2VuKSB7XG4gICAgICBoZWFkZXJzW0h0dHBIZWFkZXIuWF9GSVJFQkFTRV9BUFBfQ0hFQ0tdID0gYXBwQ2hlY2tUb2tlbjtcbiAgICB9XG5cbiAgICByZXR1cm4gaGVhZGVycztcbiAgfVxuXG4gIGFzeW5jIF9nZXRBcHBDaGVja1Rva2VuKCk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgYXBwQ2hlY2tUb2tlblJlc3VsdCA9IGF3YWl0IHRoaXMuYXBwQ2hlY2tTZXJ2aWNlUHJvdmlkZXJcbiAgICAgIC5nZXRJbW1lZGlhdGUoeyBvcHRpb25hbDogdHJ1ZSB9KVxuICAgICAgPy5nZXRUb2tlbigpO1xuICAgIGlmIChhcHBDaGVja1Rva2VuUmVzdWx0Py5lcnJvcikge1xuICAgICAgLy8gQ29udGV4dDogYXBwQ2hlY2suZ2V0VG9rZW4oKSB3aWxsIG5ldmVyIHRocm93IGV2ZW4gaWYgYW4gZXJyb3IgaGFwcGVuZWQuXG4gICAgICAvLyBJbiB0aGUgZXJyb3IgY2FzZSwgYSBkdW1teSB0b2tlbiB3aWxsIGJlIHJldHVybmVkIGFsb25nIHdpdGggYW4gZXJyb3IgZmllbGQgZGVzY3JpYmluZ1xuICAgICAgLy8gdGhlIGVycm9yLiBJbiBnZW5lcmFsLCB3ZSBzaG91bGRuJ3QgY2FyZSBhYm91dCB0aGUgZXJyb3IgY29uZGl0aW9uIGFuZCBqdXN0IHVzZVxuICAgICAgLy8gdGhlIHRva2VuIChhY3R1YWwgb3IgZHVtbXkpIHRvIHNlbmQgcmVxdWVzdHMuXG4gICAgICBfbG9nV2FybihcbiAgICAgICAgYEVycm9yIHdoaWxlIHJldHJpZXZpbmcgQXBwIENoZWNrIHRva2VuOiAke2FwcENoZWNrVG9rZW5SZXN1bHQuZXJyb3J9YFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGFwcENoZWNrVG9rZW5SZXN1bHQ/LnRva2VuO1xuICB9XG59XG5cbi8qKlxuICogTWV0aG9kIHRvIGJlIHVzZWQgdG8gY2FzdCBkb3duIHRvIG91ciBwcml2YXRlIGltcGxtZW50YXRpb24gb2YgQXV0aC5cbiAqIEl0IHdpbGwgYWxzbyBoYW5kbGUgdW53cmFwcGluZyBmcm9tIHRoZSBjb21wYXQgdHlwZSBpZiBuZWNlc3NhcnlcbiAqXG4gKiBAcGFyYW0gYXV0aCBBdXRoIG9iamVjdCBwYXNzZWQgaW4gZnJvbSBkZXZlbG9wZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9jYXN0QXV0aChhdXRoOiBBdXRoKTogQXV0aEludGVybmFsIHtcbiAgcmV0dXJuIGdldE1vZHVsYXJJbnN0YW5jZShhdXRoKSBhcyBBdXRoSW50ZXJuYWw7XG59XG5cbi8qKiBIZWxwZXIgY2xhc3MgdG8gd3JhcCBzdWJzY3JpYmVyIGxvZ2ljICovXG5jbGFzcyBTdWJzY3JpcHRpb248VD4ge1xuICBwcml2YXRlIG9ic2VydmVyOiBPYnNlcnZlcjxUIHwgbnVsbD4gfCBudWxsID0gbnVsbDtcbiAgcmVhZG9ubHkgYWRkT2JzZXJ2ZXI6IFN1YnNjcmliZTxUIHwgbnVsbD4gPSBjcmVhdGVTdWJzY3JpYmUoXG4gICAgb2JzZXJ2ZXIgPT4gKHRoaXMub2JzZXJ2ZXIgPSBvYnNlcnZlcilcbiAgKTtcblxuICBjb25zdHJ1Y3RvcihyZWFkb25seSBhdXRoOiBBdXRoSW50ZXJuYWwpIHt9XG5cbiAgZ2V0IG5leHQoKTogTmV4dEZuPFQgfCBudWxsPiB7XG4gICAgX2Fzc2VydCh0aGlzLm9ic2VydmVyLCB0aGlzLmF1dGgsIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IpO1xuICAgIHJldHVybiB0aGlzLm9ic2VydmVyLm5leHQuYmluZCh0aGlzLm9ic2VydmVyKTtcbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi9jb3JlL2Vycm9ycyc7XG5pbXBvcnQgeyBfY3JlYXRlRXJyb3IgfSBmcm9tICcuLi9jb3JlL3V0aWwvYXNzZXJ0JztcblxuZnVuY3Rpb24gZ2V0U2NyaXB0UGFyZW50RWxlbWVudCgpOiBIVE1MRG9jdW1lbnQgfCBIVE1MSGVhZEVsZW1lbnQge1xuICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKT8uWzBdID8/IGRvY3VtZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX2xvYWRKUyh1cmw6IHN0cmluZyk6IFByb21pc2U8RXZlbnQ+IHtcbiAgLy8gVE9ETzogY29uc2lkZXIgYWRkaW5nIHRpbWVvdXQgc3VwcG9ydCAmIGNhbmNlbGxhdGlvblxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgZWwuc2V0QXR0cmlidXRlKCdzcmMnLCB1cmwpO1xuICAgIGVsLm9ubG9hZCA9IHJlc29sdmU7XG4gICAgZWwub25lcnJvciA9IGUgPT4ge1xuICAgICAgY29uc3QgZXJyb3IgPSBfY3JlYXRlRXJyb3IoQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUik7XG4gICAgICBlcnJvci5jdXN0b21EYXRhID0gZSBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICB9O1xuICAgIGVsLnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JztcbiAgICBlbC5jaGFyc2V0ID0gJ1VURi04JztcbiAgICBnZXRTY3JpcHRQYXJlbnRFbGVtZW50KCkuYXBwZW5kQ2hpbGQoZWwpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9nZW5lcmF0ZUNhbGxiYWNrTmFtZShwcmVmaXg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgX18ke3ByZWZpeH0ke01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDAwMDApfWA7XG59XG4iLCAiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0cyAqL1xuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgaXNFbnRlcnByaXNlLCBSZWNhcHRjaGFDb25maWcgfSBmcm9tICcuL3JlY2FwdGNoYSc7XG5pbXBvcnQgeyBnZXRSZWNhcHRjaGFDb25maWcgfSBmcm9tICcuLi8uLi9hcGkvYXV0aGVudGljYXRpb24vcmVjYXB0Y2hhJztcbmltcG9ydCB7XG4gIFJlY2FwdGNoYUNsaWVudFR5cGUsXG4gIFJlY2FwdGNoYVZlcnNpb24sXG4gIFJlY2FwdGNoYUFjdGlvbk5hbWUsXG4gIFJlY2FwdGNoYVByb3ZpZGVyXG59IGZyb20gJy4uLy4uL2FwaSc7XG5cbmltcG9ydCB7IEF1dGggfSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuaW1wb3J0IHsgQXV0aEludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvYXV0aCc7XG5pbXBvcnQgeyBfY2FzdEF1dGggfSBmcm9tICcuLi8uLi9jb3JlL2F1dGgvYXV0aF9pbXBsJztcbmltcG9ydCAqIGFzIGpzSGVscGVycyBmcm9tICcuLi9sb2FkX2pzJztcbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi8uLi9jb3JlL2Vycm9ycyc7XG5cbmNvbnN0IFJFQ0FQVENIQV9FTlRFUlBSSVNFX1VSTCA9XG4gICdodHRwczovL3d3dy5nb29nbGUuY29tL3JlY2FwdGNoYS9lbnRlcnByaXNlLmpzP3JlbmRlcj0nO1xuXG5leHBvcnQgY29uc3QgUkVDQVBUQ0hBX0VOVEVSUFJJU0VfVkVSSUZJRVJfVFlQRSA9ICdyZWNhcHRjaGEtZW50ZXJwcmlzZSc7XG5leHBvcnQgY29uc3QgRkFLRV9UT0tFTiA9ICdOT19SRUNBUFRDSEEnO1xuXG5leHBvcnQgY2xhc3MgUmVjYXB0Y2hhRW50ZXJwcmlzZVZlcmlmaWVyIHtcbiAgLyoqXG4gICAqIElkZW50aWZpZXMgdGhlIHR5cGUgb2YgYXBwbGljYXRpb24gdmVyaWZpZXIgKGUuZy4gXCJyZWNhcHRjaGEtZW50ZXJwcmlzZVwiKS5cbiAgICovXG4gIHJlYWRvbmx5IHR5cGUgPSBSRUNBUFRDSEFfRU5URVJQUklTRV9WRVJJRklFUl9UWVBFO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgYXV0aDogQXV0aEludGVybmFsO1xuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gYXV0aEV4dGVybiAtIFRoZSBjb3JyZXNwb25kaW5nIEZpcmViYXNlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cbiAgICpcbiAgICovXG4gIGNvbnN0cnVjdG9yKGF1dGhFeHRlcm46IEF1dGgpIHtcbiAgICB0aGlzLmF1dGggPSBfY2FzdEF1dGgoYXV0aEV4dGVybik7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZXMgdGhlIHZlcmlmaWNhdGlvbiBwcm9jZXNzLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIFByb21pc2UgZm9yIGEgdG9rZW4gdGhhdCBjYW4gYmUgdXNlZCB0byBhc3NlcnQgdGhlIHZhbGlkaXR5IG9mIGEgcmVxdWVzdC5cbiAgICovXG4gIGFzeW5jIHZlcmlmeShcbiAgICBhY3Rpb246IHN0cmluZyA9ICd2ZXJpZnknLFxuICAgIGZvcmNlUmVmcmVzaCA9IGZhbHNlXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXN5bmMgZnVuY3Rpb24gcmV0cmlldmVTaXRlS2V5KGF1dGg6IEF1dGhJbnRlcm5hbCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICBpZiAoIWZvcmNlUmVmcmVzaCkge1xuICAgICAgICBpZiAoYXV0aC50ZW5hbnRJZCA9PSBudWxsICYmIGF1dGguX2FnZW50UmVjYXB0Y2hhQ29uZmlnICE9IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gYXV0aC5fYWdlbnRSZWNhcHRjaGFDb25maWcuc2l0ZUtleTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgYXV0aC50ZW5hbnRJZCAhPSBudWxsICYmXG4gICAgICAgICAgYXV0aC5fdGVuYW50UmVjYXB0Y2hhQ29uZmlnc1thdXRoLnRlbmFudElkXSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBhdXRoLl90ZW5hbnRSZWNhcHRjaGFDb25maWdzW2F1dGgudGVuYW50SWRdLnNpdGVLZXk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHN0cmluZz4oYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBnZXRSZWNhcHRjaGFDb25maWcoYXV0aCwge1xuICAgICAgICAgIGNsaWVudFR5cGU6IFJlY2FwdGNoYUNsaWVudFR5cGUuV0VCLFxuICAgICAgICAgIHZlcnNpb246IFJlY2FwdGNoYVZlcnNpb24uRU5URVJQUklTRVxuICAgICAgICB9KVxuICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5yZWNhcHRjaGFLZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdyZWNhcHRjaGEgRW50ZXJwcmlzZSBzaXRlIGtleSB1bmRlZmluZWQnKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zdCBjb25maWcgPSBuZXcgUmVjYXB0Y2hhQ29uZmlnKHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgaWYgKGF1dGgudGVuYW50SWQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGF1dGguX2FnZW50UmVjYXB0Y2hhQ29uZmlnID0gY29uZmlnO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGF1dGguX3RlbmFudFJlY2FwdGNoYUNvbmZpZ3NbYXV0aC50ZW5hbnRJZF0gPSBjb25maWc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoY29uZmlnLnNpdGVLZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZXRyaWV2ZVJlY2FwdGNoYVRva2VuKFxuICAgICAgc2l0ZUtleTogc3RyaW5nLFxuICAgICAgcmVzb2x2ZTogKHZhbHVlOiBzdHJpbmcgfCBQcm9taXNlTGlrZTxzdHJpbmc+KSA9PiB2b2lkLFxuICAgICAgcmVqZWN0OiAocmVhc29uPzogdW5rbm93bikgPT4gdm9pZFxuICAgICk6IHZvaWQge1xuICAgICAgY29uc3QgZ3JlY2FwdGNoYSA9IHdpbmRvdy5ncmVjYXB0Y2hhO1xuICAgICAgaWYgKGlzRW50ZXJwcmlzZShncmVjYXB0Y2hhKSkge1xuICAgICAgICBncmVjYXB0Y2hhLmVudGVycHJpc2UucmVhZHkoKCkgPT4ge1xuICAgICAgICAgIGdyZWNhcHRjaGEuZW50ZXJwcmlzZVxuICAgICAgICAgICAgLmV4ZWN1dGUoc2l0ZUtleSwgeyBhY3Rpb24gfSlcbiAgICAgICAgICAgIC50aGVuKHRva2VuID0+IHtcbiAgICAgICAgICAgICAgcmVzb2x2ZSh0b2tlbik7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShGQUtFX1RPS0VOKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlamVjdChFcnJvcignTm8gcmVDQVBUQ0hBIGVudGVycHJpc2Ugc2NyaXB0IGxvYWRlZC4nKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgcmV0cmlldmVTaXRlS2V5KHRoaXMuYXV0aClcbiAgICAgICAgLnRoZW4oc2l0ZUtleSA9PiB7XG4gICAgICAgICAgaWYgKCFmb3JjZVJlZnJlc2ggJiYgaXNFbnRlcnByaXNlKHdpbmRvdy5ncmVjYXB0Y2hhKSkge1xuICAgICAgICAgICAgcmV0cmlldmVSZWNhcHRjaGFUb2tlbihzaXRlS2V5LCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgcmVqZWN0KFxuICAgICAgICAgICAgICAgIG5ldyBFcnJvcignUmVjYXB0Y2hhVmVyaWZpZXIgaXMgb25seSBzdXBwb3J0ZWQgaW4gYnJvd3NlcicpXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGpzSGVscGVyc1xuICAgICAgICAgICAgICAuX2xvYWRKUyhSRUNBUFRDSEFfRU5URVJQUklTRV9VUkwgKyBzaXRlS2V5KVxuICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0cmlldmVSZWNhcHRjaGFUb2tlbihzaXRlS2V5LCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5qZWN0UmVjYXB0Y2hhRmllbGRzPFQ+KFxuICBhdXRoOiBBdXRoSW50ZXJuYWwsXG4gIHJlcXVlc3Q6IFQsXG4gIGFjdGlvbjogUmVjYXB0Y2hhQWN0aW9uTmFtZSxcbiAgY2FwdGNoYVJlc3AgPSBmYWxzZVxuKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IHZlcmlmaWVyID0gbmV3IFJlY2FwdGNoYUVudGVycHJpc2VWZXJpZmllcihhdXRoKTtcbiAgbGV0IGNhcHRjaGFSZXNwb25zZTtcbiAgdHJ5IHtcbiAgICBjYXB0Y2hhUmVzcG9uc2UgPSBhd2FpdCB2ZXJpZmllci52ZXJpZnkoYWN0aW9uKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjYXB0Y2hhUmVzcG9uc2UgPSBhd2FpdCB2ZXJpZmllci52ZXJpZnkoYWN0aW9uLCB0cnVlKTtcbiAgfVxuICBjb25zdCBuZXdSZXF1ZXN0ID0geyAuLi5yZXF1ZXN0IH07XG4gIGlmICghY2FwdGNoYVJlc3ApIHtcbiAgICBPYmplY3QuYXNzaWduKG5ld1JlcXVlc3QsIHsgY2FwdGNoYVJlc3BvbnNlIH0pO1xuICB9IGVsc2Uge1xuICAgIE9iamVjdC5hc3NpZ24obmV3UmVxdWVzdCwgeyAnY2FwdGNoYVJlc3AnOiBjYXB0Y2hhUmVzcG9uc2UgfSk7XG4gIH1cbiAgT2JqZWN0LmFzc2lnbihuZXdSZXF1ZXN0LCB7ICdjbGllbnRUeXBlJzogUmVjYXB0Y2hhQ2xpZW50VHlwZS5XRUIgfSk7XG4gIE9iamVjdC5hc3NpZ24obmV3UmVxdWVzdCwge1xuICAgICdyZWNhcHRjaGFWZXJzaW9uJzogUmVjYXB0Y2hhVmVyc2lvbi5FTlRFUlBSSVNFXG4gIH0pO1xuICByZXR1cm4gbmV3UmVxdWVzdDtcbn1cblxudHlwZSBBY3Rpb25NZXRob2Q8VFJlcXVlc3QsIFRSZXNwb25zZT4gPSAoXG4gIGF1dGg6IEF1dGgsXG4gIHJlcXVlc3Q6IFRSZXF1ZXN0XG4pID0+IFByb21pc2U8VFJlc3BvbnNlPjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhbmRsZVJlY2FwdGNoYUZsb3c8VFJlcXVlc3QsIFRSZXNwb25zZT4oXG4gIGF1dGhJbnN0YW5jZTogQXV0aEludGVybmFsLFxuICByZXF1ZXN0OiBUUmVxdWVzdCxcbiAgYWN0aW9uTmFtZTogUmVjYXB0Y2hhQWN0aW9uTmFtZSxcbiAgYWN0aW9uTWV0aG9kOiBBY3Rpb25NZXRob2Q8VFJlcXVlc3QsIFRSZXNwb25zZT5cbik6IFByb21pc2U8VFJlc3BvbnNlPiB7XG4gIGlmIChcbiAgICBhdXRoSW5zdGFuY2VcbiAgICAgIC5fZ2V0UmVjYXB0Y2hhQ29uZmlnKClcbiAgICAgID8uaXNQcm92aWRlckVuYWJsZWQoUmVjYXB0Y2hhUHJvdmlkZXIuRU1BSUxfUEFTU1dPUkRfUFJPVklERVIpXG4gICkge1xuICAgIGNvbnN0IHJlcXVlc3RXaXRoUmVjYXB0Y2hhID0gYXdhaXQgaW5qZWN0UmVjYXB0Y2hhRmllbGRzKFxuICAgICAgYXV0aEluc3RhbmNlLFxuICAgICAgcmVxdWVzdCxcbiAgICAgIGFjdGlvbk5hbWUsXG4gICAgICBhY3Rpb25OYW1lID09PSBSZWNhcHRjaGFBY3Rpb25OYW1lLkdFVF9PT0JfQ09ERVxuICAgICk7XG4gICAgcmV0dXJuIGFjdGlvbk1ldGhvZChhdXRoSW5zdGFuY2UsIHJlcXVlc3RXaXRoUmVjYXB0Y2hhKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYWN0aW9uTWV0aG9kKGF1dGhJbnN0YW5jZSwgcmVxdWVzdCkuY2F0Y2goYXN5bmMgZXJyb3IgPT4ge1xuICAgICAgaWYgKGVycm9yLmNvZGUgPT09IGBhdXRoLyR7QXV0aEVycm9yQ29kZS5NSVNTSU5HX1JFQ0FQVENIQV9UT0tFTn1gKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGAke2FjdGlvbk5hbWV9IGlzIHByb3RlY3RlZCBieSByZUNBUFRDSEEgRW50ZXJwcmlzZSBmb3IgdGhpcyBwcm9qZWN0LiBBdXRvbWF0aWNhbGx5IHRyaWdnZXJpbmcgdGhlIHJlQ0FQVENIQSBmbG93IGFuZCByZXN0YXJ0aW5nIHRoZSBmbG93LmBcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcmVxdWVzdFdpdGhSZWNhcHRjaGEgPSBhd2FpdCBpbmplY3RSZWNhcHRjaGFGaWVsZHMoXG4gICAgICAgICAgYXV0aEluc3RhbmNlLFxuICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgYWN0aW9uTmFtZSxcbiAgICAgICAgICBhY3Rpb25OYW1lID09PSBSZWNhcHRjaGFBY3Rpb25OYW1lLkdFVF9PT0JfQ09ERVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gYWN0aW9uTWV0aG9kKGF1dGhJbnN0YW5jZSwgcmVxdWVzdFdpdGhSZWNhcHRjaGEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gX2luaXRpYWxpemVSZWNhcHRjaGFDb25maWcoYXV0aDogQXV0aCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhdXRoSW50ZXJuYWwgPSBfY2FzdEF1dGgoYXV0aCk7XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBnZXRSZWNhcHRjaGFDb25maWcoYXV0aEludGVybmFsLCB7XG4gICAgY2xpZW50VHlwZTogUmVjYXB0Y2hhQ2xpZW50VHlwZS5XRUIsXG4gICAgdmVyc2lvbjogUmVjYXB0Y2hhVmVyc2lvbi5FTlRFUlBSSVNFXG4gIH0pO1xuXG4gIGNvbnN0IGNvbmZpZyA9IG5ldyBSZWNhcHRjaGFDb25maWcocmVzcG9uc2UpO1xuICBpZiAoYXV0aEludGVybmFsLnRlbmFudElkID09IG51bGwpIHtcbiAgICBhdXRoSW50ZXJuYWwuX2FnZW50UmVjYXB0Y2hhQ29uZmlnID0gY29uZmlnO1xuICB9IGVsc2Uge1xuICAgIGF1dGhJbnRlcm5hbC5fdGVuYW50UmVjYXB0Y2hhQ29uZmlnc1thdXRoSW50ZXJuYWwudGVuYW50SWRdID0gY29uZmlnO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5pc1Byb3ZpZGVyRW5hYmxlZChSZWNhcHRjaGFQcm92aWRlci5FTUFJTF9QQVNTV09SRF9QUk9WSURFUikpIHtcbiAgICBjb25zdCB2ZXJpZmllciA9IG5ldyBSZWNhcHRjaGFFbnRlcnByaXNlVmVyaWZpZXIoYXV0aEludGVybmFsKTtcbiAgICB2b2lkIHZlcmlmaWVyLnZlcmlmeSgpO1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgX2dldFByb3ZpZGVyLCBGaXJlYmFzZUFwcCB9IGZyb20gJ0BmaXJlYmFzZS9hcHAnO1xuaW1wb3J0IHsgZGVlcEVxdWFsIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuaW1wb3J0IHsgQXV0aCwgRGVwZW5kZW5jaWVzIH0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcblxuaW1wb3J0IHsgQXV0aEVycm9yQ29kZSB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBQZXJzaXN0ZW5jZUludGVybmFsIH0gZnJvbSAnLi4vcGVyc2lzdGVuY2UnO1xuaW1wb3J0IHsgX2ZhaWwgfSBmcm9tICcuLi91dGlsL2Fzc2VydCc7XG5pbXBvcnQgeyBfZ2V0SW5zdGFuY2UgfSBmcm9tICcuLi91dGlsL2luc3RhbnRpYXRvcic7XG5pbXBvcnQgeyBBdXRoSW1wbCB9IGZyb20gJy4vYXV0aF9pbXBsJztcblxuLyoqXG4gKiBJbml0aWFsaXplcyBhbiB7QGxpbmsgQXV0aH0gaW5zdGFuY2Ugd2l0aCBmaW5lLWdyYWluZWQgY29udHJvbCBvdmVyXG4gKiB7QGxpbmsgRGVwZW5kZW5jaWVzfS5cbiAqXG4gKiBAcmVtYXJrc1xuICpcbiAqIFRoaXMgZnVuY3Rpb24gYWxsb3dzIG1vcmUgY29udHJvbCBvdmVyIHRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UgdGhhblxuICoge0BsaW5rIGdldEF1dGh9LiBgZ2V0QXV0aGAgdXNlcyBwbGF0Zm9ybS1zcGVjaWZpYyBkZWZhdWx0cyB0byBzdXBwbHlcbiAqIHRoZSB7QGxpbmsgRGVwZW5kZW5jaWVzfS4gSW4gZ2VuZXJhbCwgYGdldEF1dGhgIGlzIHRoZSBlYXNpZXN0IHdheSB0b1xuICogaW5pdGlhbGl6ZSBBdXRoIGFuZCB3b3JrcyBmb3IgbW9zdCB1c2UgY2FzZXMuIFVzZSBgaW5pdGlhbGl6ZUF1dGhgIGlmIHlvdVxuICogbmVlZCBjb250cm9sIG92ZXIgd2hpY2ggcGVyc2lzdGVuY2UgbGF5ZXIgaXMgdXNlZCwgb3IgdG8gbWluaW1pemUgYnVuZGxlXG4gKiBzaXplIGlmIHlvdSdyZSBub3QgdXNpbmcgZWl0aGVyIGBzaWduSW5XaXRoUG9wdXBgIG9yIGBzaWduSW5XaXRoUmVkaXJlY3RgLlxuICpcbiAqIEZvciBleGFtcGxlLCBpZiB5b3VyIGFwcCBvbmx5IHVzZXMgYW5vbnltb3VzIGFjY291bnRzIGFuZCB5b3Ugb25seSB3YW50XG4gKiBhY2NvdW50cyBzYXZlZCBmb3IgdGhlIGN1cnJlbnQgc2Vzc2lvbiwgaW5pdGlhbGl6ZSBgQXV0aGAgd2l0aDpcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYXV0aCA9IGluaXRpYWxpemVBdXRoKGFwcCwge1xuICogICBwZXJzaXN0ZW5jZTogYnJvd3NlclNlc3Npb25QZXJzaXN0ZW5jZSxcbiAqICAgcG9wdXBSZWRpcmVjdFJlc29sdmVyOiB1bmRlZmluZWQsXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRpYWxpemVBdXRoKGFwcDogRmlyZWJhc2VBcHAsIGRlcHM/OiBEZXBlbmRlbmNpZXMpOiBBdXRoIHtcbiAgY29uc3QgcHJvdmlkZXIgPSBfZ2V0UHJvdmlkZXIoYXBwLCAnYXV0aCcpO1xuXG4gIGlmIChwcm92aWRlci5pc0luaXRpYWxpemVkKCkpIHtcbiAgICBjb25zdCBhdXRoID0gcHJvdmlkZXIuZ2V0SW1tZWRpYXRlKCkgYXMgQXV0aEltcGw7XG4gICAgY29uc3QgaW5pdGlhbE9wdGlvbnMgPSBwcm92aWRlci5nZXRPcHRpb25zKCkgYXMgRGVwZW5kZW5jaWVzO1xuICAgIGlmIChkZWVwRXF1YWwoaW5pdGlhbE9wdGlvbnMsIGRlcHMgPz8ge30pKSB7XG4gICAgICByZXR1cm4gYXV0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgX2ZhaWwoYXV0aCwgQXV0aEVycm9yQ29kZS5BTFJFQURZX0lOSVRJQUxJWkVEKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBhdXRoID0gcHJvdmlkZXIuaW5pdGlhbGl6ZSh7IG9wdGlvbnM6IGRlcHMgfSkgYXMgQXV0aEltcGw7XG5cbiAgcmV0dXJuIGF1dGg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfaW5pdGlhbGl6ZUF1dGhJbnN0YW5jZShcbiAgYXV0aDogQXV0aEltcGwsXG4gIGRlcHM/OiBEZXBlbmRlbmNpZXNcbik6IHZvaWQge1xuICBjb25zdCBwZXJzaXN0ZW5jZSA9IGRlcHM/LnBlcnNpc3RlbmNlIHx8IFtdO1xuICBjb25zdCBoaWVyYXJjaHkgPSAoXG4gICAgQXJyYXkuaXNBcnJheShwZXJzaXN0ZW5jZSkgPyBwZXJzaXN0ZW5jZSA6IFtwZXJzaXN0ZW5jZV1cbiAgKS5tYXA8UGVyc2lzdGVuY2VJbnRlcm5hbD4oX2dldEluc3RhbmNlKTtcbiAgaWYgKGRlcHM/LmVycm9yTWFwKSB7XG4gICAgYXV0aC5fdXBkYXRlRXJyb3JNYXAoZGVwcy5lcnJvck1hcCk7XG4gIH1cblxuICAvLyBUaGlzIHByb21pc2UgaXMgaW50ZW5kZWQgdG8gZmxvYXQ7IGF1dGggaW5pdGlhbGl6YXRpb24gaGFwcGVucyBpbiB0aGVcbiAgLy8gYmFja2dyb3VuZCwgbWVhbndoaWxlIHRoZSBhdXRoIG9iamVjdCBtYXkgYmUgdXNlZCBieSB0aGUgYXBwLlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWZsb2F0aW5nLXByb21pc2VzXG4gIGF1dGguX2luaXRpYWxpemVXaXRoUGVyc2lzdGVuY2UoaGllcmFyY2h5LCBkZXBzPy5wb3B1cFJlZGlyZWN0UmVzb2x2ZXIpO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgeyBBdXRoIH0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgX2Fzc2VydCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0JztcbmltcG9ydCB7IF9jYXN0QXV0aCB9IGZyb20gJy4vYXV0aF9pbXBsJztcblxuLyoqXG4gKiBDaGFuZ2VzIHRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgRmlyZWJhc2UgQXV0aCBFbXVsYXRvciwgaW5zdGVhZCBvZiBwcm9kdWN0aW9uXG4gKiBGaXJlYmFzZSBBdXRoIHNlcnZpY2VzLlxuICpcbiAqIEByZW1hcmtzXG4gKiBUaGlzIG11c3QgYmUgY2FsbGVkIHN5bmNocm9ub3VzbHkgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBmaXJzdCBjYWxsIHRvXG4gKiB7QGxpbmsgaW5pdGlhbGl6ZUF1dGh9LiAgRG8gbm90IHVzZSB3aXRoIHByb2R1Y3Rpb24gY3JlZGVudGlhbHMgYXMgZW11bGF0b3JcbiAqIHRyYWZmaWMgaXMgbm90IGVuY3J5cHRlZC5cbiAqXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGphdmFzY3JpcHRcbiAqIGNvbm5lY3RBdXRoRW11bGF0b3IoYXV0aCwgJ2h0dHA6Ly8xMjcuMC4wLjE6OTA5OScsIHsgZGlzYWJsZVdhcm5pbmdzOiB0cnVlIH0pO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxuICogQHBhcmFtIHVybCAtIFRoZSBVUkwgYXQgd2hpY2ggdGhlIGVtdWxhdG9yIGlzIHJ1bm5pbmcgKGVnLCAnaHR0cDovL2xvY2FsaG9zdDo5MDk5JykuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsLiBgb3B0aW9ucy5kaXNhYmxlV2FybmluZ3NgIGRlZmF1bHRzIHRvIGBmYWxzZWAuIFNldCBpdCB0b1xuICogYHRydWVgIHRvIGRpc2FibGUgdGhlIHdhcm5pbmcgYmFubmVyIGF0dGFjaGVkIHRvIHRoZSBET00uXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gY29ubmVjdEF1dGhFbXVsYXRvcihcbiAgYXV0aDogQXV0aCxcbiAgdXJsOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiB7IGRpc2FibGVXYXJuaW5nczogYm9vbGVhbiB9XG4pOiB2b2lkIHtcbiAgY29uc3QgYXV0aEludGVybmFsID0gX2Nhc3RBdXRoKGF1dGgpO1xuICBfYXNzZXJ0KFxuICAgIGF1dGhJbnRlcm5hbC5fY2FuSW5pdEVtdWxhdG9yLFxuICAgIGF1dGhJbnRlcm5hbCxcbiAgICBBdXRoRXJyb3JDb2RlLkVNVUxBVE9SX0NPTkZJR19GQUlMRURcbiAgKTtcblxuICBfYXNzZXJ0KFxuICAgIC9eaHR0cHM/OlxcL1xcLy8udGVzdCh1cmwpLFxuICAgIGF1dGhJbnRlcm5hbCxcbiAgICBBdXRoRXJyb3JDb2RlLklOVkFMSURfRU1VTEFUT1JfU0NIRU1FXG4gICk7XG5cbiAgY29uc3QgZGlzYWJsZVdhcm5pbmdzID0gISFvcHRpb25zPy5kaXNhYmxlV2FybmluZ3M7XG5cbiAgY29uc3QgcHJvdG9jb2wgPSBleHRyYWN0UHJvdG9jb2wodXJsKTtcbiAgY29uc3QgeyBob3N0LCBwb3J0IH0gPSBleHRyYWN0SG9zdEFuZFBvcnQodXJsKTtcbiAgY29uc3QgcG9ydFN0ciA9IHBvcnQgPT09IG51bGwgPyAnJyA6IGA6JHtwb3J0fWA7XG5cbiAgLy8gQWx3YXlzIHJlcGxhY2UgcGF0aCB3aXRoIFwiL1wiIChldmVuIGlmIGlucHV0IHVybCBoYWQgbm8gcGF0aCBhdCBhbGwsIG9yIGhhZCBhIGRpZmZlcmVudCBvbmUpLlxuICBhdXRoSW50ZXJuYWwuY29uZmlnLmVtdWxhdG9yID0geyB1cmw6IGAke3Byb3RvY29sfS8vJHtob3N0fSR7cG9ydFN0cn0vYCB9O1xuICBhdXRoSW50ZXJuYWwuc2V0dGluZ3MuYXBwVmVyaWZpY2F0aW9uRGlzYWJsZWRGb3JUZXN0aW5nID0gdHJ1ZTtcbiAgYXV0aEludGVybmFsLmVtdWxhdG9yQ29uZmlnID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgaG9zdCxcbiAgICBwb3J0LFxuICAgIHByb3RvY29sOiBwcm90b2NvbC5yZXBsYWNlKCc6JywgJycpLFxuICAgIG9wdGlvbnM6IE9iamVjdC5mcmVlemUoeyBkaXNhYmxlV2FybmluZ3MgfSlcbiAgfSk7XG5cbiAgaWYgKCFkaXNhYmxlV2FybmluZ3MpIHtcbiAgICBlbWl0RW11bGF0b3JXYXJuaW5nKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZXh0cmFjdFByb3RvY29sKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcHJvdG9jb2xFbmQgPSB1cmwuaW5kZXhPZignOicpO1xuICByZXR1cm4gcHJvdG9jb2xFbmQgPCAwID8gJycgOiB1cmwuc3Vic3RyKDAsIHByb3RvY29sRW5kICsgMSk7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RIb3N0QW5kUG9ydCh1cmw6IHN0cmluZyk6IHtcbiAgaG9zdDogc3RyaW5nO1xuICBwb3J0OiBudW1iZXIgfCBudWxsO1xufSB7XG4gIGNvbnN0IHByb3RvY29sID0gZXh0cmFjdFByb3RvY29sKHVybCk7XG4gIGNvbnN0IGF1dGhvcml0eSA9IC8oXFwvXFwvKT8oW14/Iy9dKykvLmV4ZWModXJsLnN1YnN0cihwcm90b2NvbC5sZW5ndGgpKTsgLy8gQmV0d2VlbiAvLyBhbmQgLywgPyBvciAjLlxuICBpZiAoIWF1dGhvcml0eSkge1xuICAgIHJldHVybiB7IGhvc3Q6ICcnLCBwb3J0OiBudWxsIH07XG4gIH1cbiAgY29uc3QgaG9zdEFuZFBvcnQgPSBhdXRob3JpdHlbMl0uc3BsaXQoJ0AnKS5wb3AoKSB8fCAnJzsgLy8gU3RyaXAgb3V0IFwidXNlcm5hbWU6cGFzc3dvcmRAXCIuXG4gIGNvbnN0IGJyYWNrZXRlZElQdjYgPSAvXihcXFtbXlxcXV0rXFxdKSg6fCQpLy5leGVjKGhvc3RBbmRQb3J0KTtcbiAgaWYgKGJyYWNrZXRlZElQdjYpIHtcbiAgICBjb25zdCBob3N0ID0gYnJhY2tldGVkSVB2NlsxXTtcbiAgICByZXR1cm4geyBob3N0LCBwb3J0OiBwYXJzZVBvcnQoaG9zdEFuZFBvcnQuc3Vic3RyKGhvc3QubGVuZ3RoICsgMSkpIH07XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgW2hvc3QsIHBvcnRdID0gaG9zdEFuZFBvcnQuc3BsaXQoJzonKTtcbiAgICByZXR1cm4geyBob3N0LCBwb3J0OiBwYXJzZVBvcnQocG9ydCkgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZVBvcnQocG9ydFN0cjogc3RyaW5nKTogbnVtYmVyIHwgbnVsbCB7XG4gIGlmICghcG9ydFN0cikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHBvcnQgPSBOdW1iZXIocG9ydFN0cik7XG4gIGlmIChpc05hTihwb3J0KSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBwb3J0O1xufVxuXG5mdW5jdGlvbiBlbWl0RW11bGF0b3JXYXJuaW5nKCk6IHZvaWQge1xuICBmdW5jdGlvbiBhdHRhY2hCYW5uZXIoKTogdm9pZCB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7XG4gICAgY29uc3Qgc3R5ID0gZWwuc3R5bGU7XG4gICAgZWwuaW5uZXJUZXh0ID1cbiAgICAgICdSdW5uaW5nIGluIGVtdWxhdG9yIG1vZGUuIERvIG5vdCB1c2Ugd2l0aCBwcm9kdWN0aW9uIGNyZWRlbnRpYWxzLic7XG4gICAgc3R5LnBvc2l0aW9uID0gJ2ZpeGVkJztcbiAgICBzdHkud2lkdGggPSAnMTAwJSc7XG4gICAgc3R5LmJhY2tncm91bmRDb2xvciA9ICcjZmZmZmZmJztcbiAgICBzdHkuYm9yZGVyID0gJy4xZW0gc29saWQgIzAwMDAwMCc7XG4gICAgc3R5LmNvbG9yID0gJyNiNTAwMDAnO1xuICAgIHN0eS5ib3R0b20gPSAnMHB4JztcbiAgICBzdHkubGVmdCA9ICcwcHgnO1xuICAgIHN0eS5tYXJnaW4gPSAnMHB4JztcbiAgICBzdHkuekluZGV4ID0gJzEwMDAwJztcbiAgICBzdHkudGV4dEFsaWduID0gJ2NlbnRlcic7XG4gICAgZWwuY2xhc3NMaXN0LmFkZCgnZmlyZWJhc2UtZW11bGF0b3Itd2FybmluZycpO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZWwpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgY29uc29sZS5pbmZvID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY29uc29sZS5pbmZvKFxuICAgICAgJ1dBUk5JTkc6IFlvdSBhcmUgdXNpbmcgdGhlIEF1dGggRW11bGF0b3IsJyArXG4gICAgICAgICcgd2hpY2ggaXMgaW50ZW5kZWQgZm9yIGxvY2FsIHRlc3Rpbmcgb25seS4gIERvIG5vdCB1c2Ugd2l0aCcgK1xuICAgICAgICAnIHByb2R1Y3Rpb24gY3JlZGVudGlhbHMuJ1xuICAgICk7XG4gIH1cbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2xvYWRpbmcnKSB7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGF0dGFjaEJhbm5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF0dGFjaEJhbm5lcigpO1xuICAgIH1cbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IFBob25lT3JPYXV0aFRva2VuUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9hcGkvYXV0aGVudGljYXRpb24vbWZhJztcbmltcG9ydCB7IEF1dGhJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL2F1dGgnO1xuaW1wb3J0IHsgSWRUb2tlblJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vbW9kZWwvaWRfdG9rZW4nO1xuaW1wb3J0IHsgZGVidWdGYWlsIH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQnO1xuXG4vKipcbiAqIEludGVyZmFjZSB0aGF0IHJlcHJlc2VudHMgdGhlIGNyZWRlbnRpYWxzIHJldHVybmVkIGJ5IGFuIHtAbGluayBBdXRoUHJvdmlkZXJ9LlxuICpcbiAqIEByZW1hcmtzXG4gKiBJbXBsZW1lbnRhdGlvbnMgc3BlY2lmeSB0aGUgZGV0YWlscyBhYm91dCBlYWNoIGF1dGggcHJvdmlkZXIncyBjcmVkZW50aWFsIHJlcXVpcmVtZW50cy5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBBdXRoQ3JlZGVudGlhbCB7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgICAqIFRoZSBhdXRoZW50aWNhdGlvbiBwcm92aWRlciBJRCBmb3IgdGhlIGNyZWRlbnRpYWwuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEZvciBleGFtcGxlLCAnZmFjZWJvb2suY29tJywgb3IgJ2dvb2dsZS5jb20nLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHByb3ZpZGVySWQ6IHN0cmluZyxcbiAgICAvKipcbiAgICAgKiBUaGUgYXV0aGVudGljYXRpb24gc2lnbiBpbiBtZXRob2QgZm9yIHRoZSBjcmVkZW50aWFsLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBGb3IgZXhhbXBsZSwge0BsaW5rIFNpZ25Jbk1ldGhvZH0uRU1BSUxfUEFTU1dPUkQsIG9yXG4gICAgICoge0BsaW5rIFNpZ25Jbk1ldGhvZH0uRU1BSUxfTElOSy4gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgc2lnbi1pbiBtZXRob2RcbiAgICAgKiBpZGVudGlmaWVyIGFzIHJldHVybmVkIGluIHtAbGluayBmZXRjaFNpZ25Jbk1ldGhvZHNGb3JFbWFpbH0uXG4gICAgICovXG4gICAgcmVhZG9ubHkgc2lnbkluTWV0aG9kOiBzdHJpbmdcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgSlNPTi1zZXJpYWxpemFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuXG4gICAqXG4gICAqIEByZXR1cm5zIGEgSlNPTi1zZXJpYWxpemFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuXG4gICAqL1xuICB0b0pTT04oKTogb2JqZWN0IHtcbiAgICByZXR1cm4gZGVidWdGYWlsKCdub3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2dldElkVG9rZW5SZXNwb25zZShfYXV0aDogQXV0aEludGVybmFsKTogUHJvbWlzZTxQaG9uZU9yT2F1dGhUb2tlblJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIGRlYnVnRmFpbCgnbm90IGltcGxlbWVudGVkJyk7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfbGlua1RvSWRUb2tlbihcbiAgICBfYXV0aDogQXV0aEludGVybmFsLFxuICAgIF9pZFRva2VuOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxJZFRva2VuUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gZGVidWdGYWlsKCdub3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxuICAvKiogQGludGVybmFsICovXG4gIF9nZXRSZWF1dGhlbnRpY2F0aW9uUmVzb2x2ZXIoX2F1dGg6IEF1dGhJbnRlcm5hbCk6IFByb21pc2U8SWRUb2tlblJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIGRlYnVnRmFpbCgnbm90IGltcGxlbWVudGVkJyk7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBBY3Rpb25Db2RlT3BlcmF0aW9uLCBBdXRoIH0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcblxuaW1wb3J0IHtcbiAgRW5kcG9pbnQsXG4gIEh0dHBNZXRob2QsXG4gIF9hZGRUaWRJZk5lY2Vzc2FyeSxcbiAgX3BlcmZvcm1BcGlSZXF1ZXN0XG59IGZyb20gJy4uL2luZGV4JztcbmltcG9ydCB7IElkVG9rZW5SZXNwb25zZSB9IGZyb20gJy4uLy4uL21vZGVsL2lkX3Rva2VuJztcbmltcG9ydCB7IE1mYUVucm9sbG1lbnQgfSBmcm9tICcuL21mYSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzZXRQYXNzd29yZFJlcXVlc3Qge1xuICBvb2JDb2RlOiBzdHJpbmc7XG4gIG5ld1Bhc3N3b3JkPzogc3RyaW5nO1xuICB0ZW5hbnRJZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXNldFBhc3N3b3JkUmVzcG9uc2Uge1xuICBlbWFpbDogc3RyaW5nO1xuICBuZXdFbWFpbD86IHN0cmluZztcbiAgcmVxdWVzdFR5cGU/OiBBY3Rpb25Db2RlT3BlcmF0aW9uO1xuICBtZmFJbmZvPzogTWZhRW5yb2xsbWVudDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc2V0UGFzc3dvcmQoXG4gIGF1dGg6IEF1dGgsXG4gIHJlcXVlc3Q6IFJlc2V0UGFzc3dvcmRSZXF1ZXN0XG4pOiBQcm9taXNlPFJlc2V0UGFzc3dvcmRSZXNwb25zZT4ge1xuICByZXR1cm4gX3BlcmZvcm1BcGlSZXF1ZXN0PFJlc2V0UGFzc3dvcmRSZXF1ZXN0LCBSZXNldFBhc3N3b3JkUmVzcG9uc2U+KFxuICAgIGF1dGgsXG4gICAgSHR0cE1ldGhvZC5QT1NULFxuICAgIEVuZHBvaW50LlJFU0VUX1BBU1NXT1JELFxuICAgIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KVxuICApO1xufVxuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVFbWFpbFBhc3N3b3JkUmVxdWVzdCB7XG4gIGlkVG9rZW46IHN0cmluZztcbiAgcmV0dXJuU2VjdXJlVG9rZW4/OiBib29sZWFuO1xuICBlbWFpbD86IHN0cmluZztcbiAgcGFzc3dvcmQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlRW1haWxQYXNzd29yZFJlc3BvbnNlIGV4dGVuZHMgSWRUb2tlblJlc3BvbnNlIHt9XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVFbWFpbFBhc3N3b3JkKFxuICBhdXRoOiBBdXRoLFxuICByZXF1ZXN0OiBVcGRhdGVFbWFpbFBhc3N3b3JkUmVxdWVzdFxuKTogUHJvbWlzZTxVcGRhdGVFbWFpbFBhc3N3b3JkUmVzcG9uc2U+IHtcbiAgcmV0dXJuIF9wZXJmb3JtQXBpUmVxdWVzdDxcbiAgICBVcGRhdGVFbWFpbFBhc3N3b3JkUmVxdWVzdCxcbiAgICBVcGRhdGVFbWFpbFBhc3N3b3JkUmVzcG9uc2VcbiAgPihhdXRoLCBIdHRwTWV0aG9kLlBPU1QsIEVuZHBvaW50LlNFVF9BQ0NPVU5UX0lORk8sIHJlcXVlc3QpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFwcGx5QWN0aW9uQ29kZVJlcXVlc3Qge1xuICBvb2JDb2RlOiBzdHJpbmc7XG4gIHRlbmFudElkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFwcGx5QWN0aW9uQ29kZVJlc3BvbnNlIHt9XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhcHBseUFjdGlvbkNvZGUoXG4gIGF1dGg6IEF1dGgsXG4gIHJlcXVlc3Q6IEFwcGx5QWN0aW9uQ29kZVJlcXVlc3Rcbik6IFByb21pc2U8QXBwbHlBY3Rpb25Db2RlUmVzcG9uc2U+IHtcbiAgcmV0dXJuIF9wZXJmb3JtQXBpUmVxdWVzdDxBcHBseUFjdGlvbkNvZGVSZXF1ZXN0LCBBcHBseUFjdGlvbkNvZGVSZXNwb25zZT4oXG4gICAgYXV0aCxcbiAgICBIdHRwTWV0aG9kLlBPU1QsXG4gICAgRW5kcG9pbnQuU0VUX0FDQ09VTlRfSU5GTyxcbiAgICBfYWRkVGlkSWZOZWNlc3NhcnkoYXV0aCwgcmVxdWVzdClcbiAgKTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBBY3Rpb25Db2RlT3BlcmF0aW9uLCBBdXRoIH0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcblxuaW1wb3J0IHtcbiAgRW5kcG9pbnQsXG4gIEh0dHBNZXRob2QsXG4gIFJlY2FwdGNoYUNsaWVudFR5cGUsXG4gIFJlY2FwdGNoYVZlcnNpb24sXG4gIF9hZGRUaWRJZk5lY2Vzc2FyeSxcbiAgX3BlcmZvcm1BcGlSZXF1ZXN0LFxuICBfcGVyZm9ybVNpZ25JblJlcXVlc3Rcbn0gZnJvbSAnLi4vaW5kZXgnO1xuaW1wb3J0IHsgSWRUb2tlbiwgSWRUb2tlblJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vbW9kZWwvaWRfdG9rZW4nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25JbldpdGhQYXNzd29yZFJlcXVlc3Qge1xuICByZXR1cm5TZWN1cmVUb2tlbj86IGJvb2xlYW47XG4gIGVtYWlsOiBzdHJpbmc7XG4gIHBhc3N3b3JkOiBzdHJpbmc7XG4gIHRlbmFudElkPzogc3RyaW5nO1xuICBjYXB0Y2hhUmVzcG9uc2U/OiBzdHJpbmc7XG4gIGNsaWVudFR5cGU/OiBSZWNhcHRjaGFDbGllbnRUeXBlO1xuICByZWNhcHRjaGFWZXJzaW9uPzogUmVjYXB0Y2hhVmVyc2lvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaWduSW5XaXRoUGFzc3dvcmRSZXNwb25zZSBleHRlbmRzIElkVG9rZW5SZXNwb25zZSB7XG4gIGVtYWlsOiBzdHJpbmc7XG4gIGRpc3BsYXlOYW1lOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzaWduSW5XaXRoUGFzc3dvcmQoXG4gIGF1dGg6IEF1dGgsXG4gIHJlcXVlc3Q6IFNpZ25JbldpdGhQYXNzd29yZFJlcXVlc3Rcbik6IFByb21pc2U8U2lnbkluV2l0aFBhc3N3b3JkUmVzcG9uc2U+IHtcbiAgcmV0dXJuIF9wZXJmb3JtU2lnbkluUmVxdWVzdDxcbiAgICBTaWduSW5XaXRoUGFzc3dvcmRSZXF1ZXN0LFxuICAgIFNpZ25JbldpdGhQYXNzd29yZFJlc3BvbnNlXG4gID4oXG4gICAgYXV0aCxcbiAgICBIdHRwTWV0aG9kLlBPU1QsXG4gICAgRW5kcG9pbnQuU0lHTl9JTl9XSVRIX1BBU1NXT1JELFxuICAgIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KVxuICApO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldE9vYkNvZGVSZXF1ZXN0IHtcbiAgZW1haWw/OiBzdHJpbmc7IC8vIEV2ZXJ5dGhpbmcgZXhjZXB0IFZFUklGWV9BTkRfQ0hBTkdFX0VNQUlMXG4gIGNvbnRpbnVlVXJsPzogc3RyaW5nO1xuICBpT1NCdW5kbGVJZD86IHN0cmluZztcbiAgaW9zQXBwU3RvcmVJZD86IHN0cmluZztcbiAgYW5kcm9pZFBhY2thZ2VOYW1lPzogc3RyaW5nO1xuICBhbmRyb2lkSW5zdGFsbEFwcD86IGJvb2xlYW47XG4gIGFuZHJvaWRNaW5pbXVtVmVyc2lvbkNvZGU/OiBzdHJpbmc7XG4gIGNhbkhhbmRsZUNvZGVJbkFwcD86IGJvb2xlYW47XG4gIGR5bmFtaWNMaW5rRG9tYWluPzogc3RyaW5nO1xuICB0ZW5hbnRJZD86IHN0cmluZztcbiAgdGFyZ2V0UHJvamVjdGlkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZlcmlmeUVtYWlsUmVxdWVzdCBleHRlbmRzIEdldE9vYkNvZGVSZXF1ZXN0IHtcbiAgcmVxdWVzdFR5cGU6IEFjdGlvbkNvZGVPcGVyYXRpb24uVkVSSUZZX0VNQUlMO1xuICBpZFRva2VuOiBJZFRva2VuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhc3N3b3JkUmVzZXRSZXF1ZXN0IGV4dGVuZHMgR2V0T29iQ29kZVJlcXVlc3Qge1xuICByZXF1ZXN0VHlwZTogQWN0aW9uQ29kZU9wZXJhdGlvbi5QQVNTV09SRF9SRVNFVDtcbiAgZW1haWw6IHN0cmluZztcbiAgY2FwdGNoYVJlc3A/OiBzdHJpbmc7XG4gIGNsaWVudFR5cGU/OiBSZWNhcHRjaGFDbGllbnRUeXBlO1xuICByZWNhcHRjaGFWZXJzaW9uPzogUmVjYXB0Y2hhVmVyc2lvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbWFpbFNpZ25JblJlcXVlc3QgZXh0ZW5kcyBHZXRPb2JDb2RlUmVxdWVzdCB7XG4gIHJlcXVlc3RUeXBlOiBBY3Rpb25Db2RlT3BlcmF0aW9uLkVNQUlMX1NJR05JTjtcbiAgZW1haWw6IHN0cmluZztcbiAgY2FwdGNoYVJlc3A/OiBzdHJpbmc7XG4gIGNsaWVudFR5cGU/OiBSZWNhcHRjaGFDbGllbnRUeXBlO1xuICByZWNhcHRjaGFWZXJzaW9uPzogUmVjYXB0Y2hhVmVyc2lvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZXJpZnlBbmRDaGFuZ2VFbWFpbFJlcXVlc3QgZXh0ZW5kcyBHZXRPb2JDb2RlUmVxdWVzdCB7XG4gIHJlcXVlc3RUeXBlOiBBY3Rpb25Db2RlT3BlcmF0aW9uLlZFUklGWV9BTkRfQ0hBTkdFX0VNQUlMO1xuICBpZFRva2VuOiBJZFRva2VuO1xuICBuZXdFbWFpbDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgR2V0T29iQ29kZVJlc3BvbnNlIHtcbiAgZW1haWw6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZXJpZnlFbWFpbFJlc3BvbnNlIGV4dGVuZHMgR2V0T29iQ29kZVJlc3BvbnNlIHt9XG5leHBvcnQgaW50ZXJmYWNlIFBhc3N3b3JkUmVzZXRSZXNwb25zZSBleHRlbmRzIEdldE9vYkNvZGVSZXNwb25zZSB7fVxuZXhwb3J0IGludGVyZmFjZSBFbWFpbFNpZ25JblJlc3BvbnNlIGV4dGVuZHMgR2V0T29iQ29kZVJlc3BvbnNlIHt9XG5leHBvcnQgaW50ZXJmYWNlIFZlcmlmeUFuZENoYW5nZUVtYWlsUmVzcG9uc2UgZXh0ZW5kcyBHZXRPb2JDb2RlUmVxdWVzdCB7fVxuXG5hc3luYyBmdW5jdGlvbiBzZW5kT29iQ29kZShcbiAgYXV0aDogQXV0aCxcbiAgcmVxdWVzdDogR2V0T29iQ29kZVJlcXVlc3Rcbik6IFByb21pc2U8R2V0T29iQ29kZVJlc3BvbnNlPiB7XG4gIHJldHVybiBfcGVyZm9ybUFwaVJlcXVlc3Q8R2V0T29iQ29kZVJlcXVlc3QsIEdldE9vYkNvZGVSZXNwb25zZT4oXG4gICAgYXV0aCxcbiAgICBIdHRwTWV0aG9kLlBPU1QsXG4gICAgRW5kcG9pbnQuU0VORF9PT0JfQ09ERSxcbiAgICBfYWRkVGlkSWZOZWNlc3NhcnkoYXV0aCwgcmVxdWVzdClcbiAgKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlbmRFbWFpbFZlcmlmaWNhdGlvbihcbiAgYXV0aDogQXV0aCxcbiAgcmVxdWVzdDogVmVyaWZ5RW1haWxSZXF1ZXN0XG4pOiBQcm9taXNlPFZlcmlmeUVtYWlsUmVzcG9uc2U+IHtcbiAgcmV0dXJuIHNlbmRPb2JDb2RlKGF1dGgsIHJlcXVlc3QpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VuZFBhc3N3b3JkUmVzZXRFbWFpbChcbiAgYXV0aDogQXV0aCxcbiAgcmVxdWVzdDogUGFzc3dvcmRSZXNldFJlcXVlc3Rcbik6IFByb21pc2U8UGFzc3dvcmRSZXNldFJlc3BvbnNlPiB7XG4gIHJldHVybiBzZW5kT29iQ29kZShhdXRoLCByZXF1ZXN0KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlbmRTaWduSW5MaW5rVG9FbWFpbChcbiAgYXV0aDogQXV0aCxcbiAgcmVxdWVzdDogRW1haWxTaWduSW5SZXF1ZXN0XG4pOiBQcm9taXNlPEVtYWlsU2lnbkluUmVzcG9uc2U+IHtcbiAgcmV0dXJuIHNlbmRPb2JDb2RlKGF1dGgsIHJlcXVlc3QpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdmVyaWZ5QW5kQ2hhbmdlRW1haWwoXG4gIGF1dGg6IEF1dGgsXG4gIHJlcXVlc3Q6IFZlcmlmeUFuZENoYW5nZUVtYWlsUmVxdWVzdFxuKTogUHJvbWlzZTxWZXJpZnlBbmRDaGFuZ2VFbWFpbFJlc3BvbnNlPiB7XG4gIHJldHVybiBzZW5kT29iQ29kZShhdXRoLCByZXF1ZXN0KTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQge1xuICBfcGVyZm9ybVNpZ25JblJlcXVlc3QsXG4gIEVuZHBvaW50LFxuICBIdHRwTWV0aG9kLFxuICBfYWRkVGlkSWZOZWNlc3Nhcnlcbn0gZnJvbSAnLi4vaW5kZXgnO1xuaW1wb3J0IHsgSWRUb2tlblJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vbW9kZWwvaWRfdG9rZW4nO1xuaW1wb3J0IHsgQXV0aCB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbkluV2l0aEVtYWlsTGlua1JlcXVlc3Qge1xuICBlbWFpbDogc3RyaW5nO1xuICBvb2JDb2RlOiBzdHJpbmc7XG4gIHRlbmFudElkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25JbldpdGhFbWFpbExpbmtSZXNwb25zZSBleHRlbmRzIElkVG9rZW5SZXNwb25zZSB7XG4gIGVtYWlsOiBzdHJpbmc7XG4gIGlzTmV3VXNlcjogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNpZ25JbldpdGhFbWFpbExpbmsoXG4gIGF1dGg6IEF1dGgsXG4gIHJlcXVlc3Q6IFNpZ25JbldpdGhFbWFpbExpbmtSZXF1ZXN0XG4pOiBQcm9taXNlPFNpZ25JbldpdGhFbWFpbExpbmtSZXNwb25zZT4ge1xuICByZXR1cm4gX3BlcmZvcm1TaWduSW5SZXF1ZXN0PFxuICAgIFNpZ25JbldpdGhFbWFpbExpbmtSZXF1ZXN0LFxuICAgIFNpZ25JbldpdGhFbWFpbExpbmtSZXNwb25zZVxuICA+KFxuICAgIGF1dGgsXG4gICAgSHR0cE1ldGhvZC5QT1NULFxuICAgIEVuZHBvaW50LlNJR05fSU5fV0lUSF9FTUFJTF9MSU5LLFxuICAgIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KVxuICApO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25JbldpdGhFbWFpbExpbmtGb3JMaW5raW5nUmVxdWVzdFxuICBleHRlbmRzIFNpZ25JbldpdGhFbWFpbExpbmtSZXF1ZXN0IHtcbiAgaWRUb2tlbjogc3RyaW5nO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2lnbkluV2l0aEVtYWlsTGlua0ZvckxpbmtpbmcoXG4gIGF1dGg6IEF1dGgsXG4gIHJlcXVlc3Q6IFNpZ25JbldpdGhFbWFpbExpbmtGb3JMaW5raW5nUmVxdWVzdFxuKTogUHJvbWlzZTxTaWduSW5XaXRoRW1haWxMaW5rUmVzcG9uc2U+IHtcbiAgcmV0dXJuIF9wZXJmb3JtU2lnbkluUmVxdWVzdDxcbiAgICBTaWduSW5XaXRoRW1haWxMaW5rRm9yTGlua2luZ1JlcXVlc3QsXG4gICAgU2lnbkluV2l0aEVtYWlsTGlua1Jlc3BvbnNlXG4gID4oXG4gICAgYXV0aCxcbiAgICBIdHRwTWV0aG9kLlBPU1QsXG4gICAgRW5kcG9pbnQuU0lHTl9JTl9XSVRIX0VNQUlMX0xJTkssXG4gICAgX2FkZFRpZElmTmVjZXNzYXJ5KGF1dGgsIHJlcXVlc3QpXG4gICk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgUHJvdmlkZXJJZCwgU2lnbkluTWV0aG9kIH0gZnJvbSAnLi4vLi4vbW9kZWwvZW51bXMnO1xuXG5pbXBvcnQgeyB1cGRhdGVFbWFpbFBhc3N3b3JkIH0gZnJvbSAnLi4vLi4vYXBpL2FjY291bnRfbWFuYWdlbWVudC9lbWFpbF9hbmRfcGFzc3dvcmQnO1xuaW1wb3J0IHtcbiAgc2lnbkluV2l0aFBhc3N3b3JkLFxuICBTaWduSW5XaXRoUGFzc3dvcmRSZXF1ZXN0XG59IGZyb20gJy4uLy4uL2FwaS9hdXRoZW50aWNhdGlvbi9lbWFpbF9hbmRfcGFzc3dvcmQnO1xuaW1wb3J0IHtcbiAgc2lnbkluV2l0aEVtYWlsTGluayxcbiAgc2lnbkluV2l0aEVtYWlsTGlua0Zvckxpbmtpbmdcbn0gZnJvbSAnLi4vLi4vYXBpL2F1dGhlbnRpY2F0aW9uL2VtYWlsX2xpbmsnO1xuaW1wb3J0IHsgQXV0aEludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvYXV0aCc7XG5pbXBvcnQgeyBJZFRva2VuUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9tb2RlbC9pZF90b2tlbic7XG5pbXBvcnQgeyBBdXRoRXJyb3JDb2RlIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IF9mYWlsIH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQnO1xuaW1wb3J0IHsgQXV0aENyZWRlbnRpYWwgfSBmcm9tICcuL2F1dGhfY3JlZGVudGlhbCc7XG5pbXBvcnQgeyBoYW5kbGVSZWNhcHRjaGFGbG93IH0gZnJvbSAnLi4vLi4vcGxhdGZvcm1fYnJvd3Nlci9yZWNhcHRjaGEvcmVjYXB0Y2hhX2VudGVycHJpc2VfdmVyaWZpZXInO1xuaW1wb3J0IHsgUmVjYXB0Y2hhQWN0aW9uTmFtZSwgUmVjYXB0Y2hhQ2xpZW50VHlwZSB9IGZyb20gJy4uLy4uL2FwaSc7XG4vKipcbiAqIEludGVyZmFjZSB0aGF0IHJlcHJlc2VudHMgdGhlIGNyZWRlbnRpYWxzIHJldHVybmVkIGJ5IHtAbGluayBFbWFpbEF1dGhQcm92aWRlcn0gZm9yXG4gKiB7QGxpbmsgUHJvdmlkZXJJZH0uUEFTU1dPUkRcbiAqXG4gKiBAcmVtYXJrc1xuICogQ292ZXJzIGJvdGgge0BsaW5rIFNpZ25Jbk1ldGhvZH0uRU1BSUxfUEFTU1dPUkQgYW5kXG4gKiB7QGxpbmsgU2lnbkluTWV0aG9kfS5FTUFJTF9MSU5LLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIEVtYWlsQXV0aENyZWRlbnRpYWwgZXh0ZW5kcyBBdXRoQ3JlZGVudGlhbCB7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICAvKiogQGludGVybmFsICovXG4gICAgcmVhZG9ubHkgX2VtYWlsOiBzdHJpbmcsXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHJlYWRvbmx5IF9wYXNzd29yZDogc3RyaW5nLFxuICAgIHNpZ25Jbk1ldGhvZDogU2lnbkluTWV0aG9kLFxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICByZWFkb25seSBfdGVuYW50SWQ6IHN0cmluZyB8IG51bGwgPSBudWxsXG4gICkge1xuICAgIHN1cGVyKFByb3ZpZGVySWQuUEFTU1dPUkQsIHNpZ25Jbk1ldGhvZCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHN0YXRpYyBfZnJvbUVtYWlsQW5kUGFzc3dvcmQoXG4gICAgZW1haWw6IHN0cmluZyxcbiAgICBwYXNzd29yZDogc3RyaW5nXG4gICk6IEVtYWlsQXV0aENyZWRlbnRpYWwge1xuICAgIHJldHVybiBuZXcgRW1haWxBdXRoQ3JlZGVudGlhbChcbiAgICAgIGVtYWlsLFxuICAgICAgcGFzc3dvcmQsXG4gICAgICBTaWduSW5NZXRob2QuRU1BSUxfUEFTU1dPUkRcbiAgICApO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBzdGF0aWMgX2Zyb21FbWFpbEFuZENvZGUoXG4gICAgZW1haWw6IHN0cmluZyxcbiAgICBvb2JDb2RlOiBzdHJpbmcsXG4gICAgdGVuYW50SWQ6IHN0cmluZyB8IG51bGwgPSBudWxsXG4gICk6IEVtYWlsQXV0aENyZWRlbnRpYWwge1xuICAgIHJldHVybiBuZXcgRW1haWxBdXRoQ3JlZGVudGlhbChcbiAgICAgIGVtYWlsLFxuICAgICAgb29iQ29kZSxcbiAgICAgIFNpZ25Jbk1ldGhvZC5FTUFJTF9MSU5LLFxuICAgICAgdGVuYW50SWRcbiAgICApO1xuICB9XG5cbiAgLyoqIHtAaW5oZXJpdGRvYyBBdXRoQ3JlZGVudGlhbC50b0pTT059ICovXG4gIHRvSlNPTigpOiBvYmplY3Qge1xuICAgIHJldHVybiB7XG4gICAgICBlbWFpbDogdGhpcy5fZW1haWwsXG4gICAgICBwYXNzd29yZDogdGhpcy5fcGFzc3dvcmQsXG4gICAgICBzaWduSW5NZXRob2Q6IHRoaXMuc2lnbkluTWV0aG9kLFxuICAgICAgdGVuYW50SWQ6IHRoaXMuX3RlbmFudElkXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0aWMgbWV0aG9kIHRvIGRlc2VyaWFsaXplIGEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiBhbiBvYmplY3QgaW50byBhbiB7QGxpbmsgIEF1dGhDcmVkZW50aWFsfS5cbiAgICpcbiAgICogQHBhcmFtIGpzb24gLSBFaXRoZXIgYG9iamVjdGAgb3IgdGhlIHN0cmluZ2lmaWVkIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBvYmplY3QuIFdoZW4gc3RyaW5nIGlzXG4gICAqIHByb3ZpZGVkLCBgSlNPTi5wYXJzZWAgd291bGQgYmUgY2FsbGVkIGZpcnN0LlxuICAgKlxuICAgKiBAcmV0dXJucyBJZiB0aGUgSlNPTiBpbnB1dCBkb2VzIG5vdCByZXByZXNlbnQgYW4ge0BsaW5rIEF1dGhDcmVkZW50aWFsfSwgbnVsbCBpcyByZXR1cm5lZC5cbiAgICovXG4gIHN0YXRpYyBmcm9tSlNPTihqc29uOiBvYmplY3QgfCBzdHJpbmcpOiBFbWFpbEF1dGhDcmVkZW50aWFsIHwgbnVsbCB7XG4gICAgY29uc3Qgb2JqID0gdHlwZW9mIGpzb24gPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZShqc29uKSA6IGpzb247XG4gICAgaWYgKG9iaj8uZW1haWwgJiYgb2JqPy5wYXNzd29yZCkge1xuICAgICAgaWYgKG9iai5zaWduSW5NZXRob2QgPT09IFNpZ25Jbk1ldGhvZC5FTUFJTF9QQVNTV09SRCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZnJvbUVtYWlsQW5kUGFzc3dvcmQob2JqLmVtYWlsLCBvYmoucGFzc3dvcmQpO1xuICAgICAgfSBlbHNlIGlmIChvYmouc2lnbkluTWV0aG9kID09PSBTaWduSW5NZXRob2QuRU1BSUxfTElOSykge1xuICAgICAgICByZXR1cm4gdGhpcy5fZnJvbUVtYWlsQW5kQ29kZShvYmouZW1haWwsIG9iai5wYXNzd29yZCwgb2JqLnRlbmFudElkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGFzeW5jIF9nZXRJZFRva2VuUmVzcG9uc2UoYXV0aDogQXV0aEludGVybmFsKTogUHJvbWlzZTxJZFRva2VuUmVzcG9uc2U+IHtcbiAgICBzd2l0Y2ggKHRoaXMuc2lnbkluTWV0aG9kKSB7XG4gICAgICBjYXNlIFNpZ25Jbk1ldGhvZC5FTUFJTF9QQVNTV09SRDpcbiAgICAgICAgY29uc3QgcmVxdWVzdDogU2lnbkluV2l0aFBhc3N3b3JkUmVxdWVzdCA9IHtcbiAgICAgICAgICByZXR1cm5TZWN1cmVUb2tlbjogdHJ1ZSxcbiAgICAgICAgICBlbWFpbDogdGhpcy5fZW1haWwsXG4gICAgICAgICAgcGFzc3dvcmQ6IHRoaXMuX3Bhc3N3b3JkLFxuICAgICAgICAgIGNsaWVudFR5cGU6IFJlY2FwdGNoYUNsaWVudFR5cGUuV0VCXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBoYW5kbGVSZWNhcHRjaGFGbG93KFxuICAgICAgICAgIGF1dGgsXG4gICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICBSZWNhcHRjaGFBY3Rpb25OYW1lLlNJR05fSU5fV0lUSF9QQVNTV09SRCxcbiAgICAgICAgICBzaWduSW5XaXRoUGFzc3dvcmRcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgU2lnbkluTWV0aG9kLkVNQUlMX0xJTks6XG4gICAgICAgIHJldHVybiBzaWduSW5XaXRoRW1haWxMaW5rKGF1dGgsIHtcbiAgICAgICAgICBlbWFpbDogdGhpcy5fZW1haWwsXG4gICAgICAgICAgb29iQ29kZTogdGhpcy5fcGFzc3dvcmRcbiAgICAgICAgfSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBfZmFpbChhdXRoLCBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGFzeW5jIF9saW5rVG9JZFRva2VuKFxuICAgIGF1dGg6IEF1dGhJbnRlcm5hbCxcbiAgICBpZFRva2VuOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxJZFRva2VuUmVzcG9uc2U+IHtcbiAgICBzd2l0Y2ggKHRoaXMuc2lnbkluTWV0aG9kKSB7XG4gICAgICBjYXNlIFNpZ25Jbk1ldGhvZC5FTUFJTF9QQVNTV09SRDpcbiAgICAgICAgcmV0dXJuIHVwZGF0ZUVtYWlsUGFzc3dvcmQoYXV0aCwge1xuICAgICAgICAgIGlkVG9rZW4sXG4gICAgICAgICAgcmV0dXJuU2VjdXJlVG9rZW46IHRydWUsXG4gICAgICAgICAgZW1haWw6IHRoaXMuX2VtYWlsLFxuICAgICAgICAgIHBhc3N3b3JkOiB0aGlzLl9wYXNzd29yZFxuICAgICAgICB9KTtcbiAgICAgIGNhc2UgU2lnbkluTWV0aG9kLkVNQUlMX0xJTks6XG4gICAgICAgIHJldHVybiBzaWduSW5XaXRoRW1haWxMaW5rRm9yTGlua2luZyhhdXRoLCB7XG4gICAgICAgICAgaWRUb2tlbixcbiAgICAgICAgICBlbWFpbDogdGhpcy5fZW1haWwsXG4gICAgICAgICAgb29iQ29kZTogdGhpcy5fcGFzc3dvcmRcbiAgICAgICAgfSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBfZmFpbChhdXRoLCBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9nZXRSZWF1dGhlbnRpY2F0aW9uUmVzb2x2ZXIoYXV0aDogQXV0aEludGVybmFsKTogUHJvbWlzZTxJZFRva2VuUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0SWRUb2tlblJlc3BvbnNlKGF1dGgpO1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgRW5kcG9pbnQsXG4gIEh0dHBNZXRob2QsXG4gIF9hZGRUaWRJZk5lY2Vzc2FyeSxcbiAgX3BlcmZvcm1TaWduSW5SZXF1ZXN0XG59IGZyb20gJy4uL2luZGV4JztcbmltcG9ydCB7IElkVG9rZW4sIElkVG9rZW5SZXNwb25zZSB9IGZyb20gJy4uLy4uL21vZGVsL2lkX3Rva2VuJztcbmltcG9ydCB7IEF1dGggfSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25JbldpdGhJZHBSZXF1ZXN0IHtcbiAgcmVxdWVzdFVyaTogc3RyaW5nO1xuICBwb3N0Qm9keT86IHN0cmluZztcbiAgc2Vzc2lvbklkPzogc3RyaW5nO1xuICB0ZW5hbnRJZD86IHN0cmluZztcbiAgcmV0dXJuU2VjdXJlVG9rZW46IGJvb2xlYW47XG4gIHJldHVybklkcENyZWRlbnRpYWw/OiBib29sZWFuO1xuICBpZFRva2VuPzogSWRUb2tlbjtcbiAgYXV0b0NyZWF0ZT86IGJvb2xlYW47XG4gIHBlbmRpbmdUb2tlbj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduSW5XaXRoSWRwUmVzcG9uc2UgZXh0ZW5kcyBJZFRva2VuUmVzcG9uc2Uge1xuICBvYXV0aEFjY2Vzc1Rva2VuPzogc3RyaW5nO1xuICBvYXV0aFRva2VuU2VjcmV0Pzogc3RyaW5nO1xuICBub25jZT86IHN0cmluZztcbiAgb2F1dGhJZFRva2VuPzogc3RyaW5nO1xuICBwZW5kaW5nVG9rZW4/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzaWduSW5XaXRoSWRwKFxuICBhdXRoOiBBdXRoLFxuICByZXF1ZXN0OiBTaWduSW5XaXRoSWRwUmVxdWVzdFxuKTogUHJvbWlzZTxTaWduSW5XaXRoSWRwUmVzcG9uc2U+IHtcbiAgcmV0dXJuIF9wZXJmb3JtU2lnbkluUmVxdWVzdDxTaWduSW5XaXRoSWRwUmVxdWVzdCwgU2lnbkluV2l0aElkcFJlc3BvbnNlPihcbiAgICBhdXRoLFxuICAgIEh0dHBNZXRob2QuUE9TVCxcbiAgICBFbmRwb2ludC5TSUdOX0lOX1dJVEhfSURQLFxuICAgIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KVxuICApO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IHF1ZXJ5c3RyaW5nIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuXG5pbXBvcnQge1xuICBzaWduSW5XaXRoSWRwLFxuICBTaWduSW5XaXRoSWRwUmVxdWVzdFxufSBmcm9tICcuLi8uLi9hcGkvYXV0aGVudGljYXRpb24vaWRwJztcbmltcG9ydCB7IEF1dGhJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL2F1dGgnO1xuaW1wb3J0IHsgSWRUb2tlblJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vbW9kZWwvaWRfdG9rZW4nO1xuaW1wb3J0IHsgQXV0aEVycm9yQ29kZSB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBfZmFpbCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0JztcbmltcG9ydCB7IEF1dGhDcmVkZW50aWFsIH0gZnJvbSAnLi9hdXRoX2NyZWRlbnRpYWwnO1xuXG5jb25zdCBJRFBfUkVRVUVTVF9VUkkgPSAnaHR0cDovL2xvY2FsaG9zdCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgT0F1dGhDcmVkZW50aWFsUGFyYW1zIHtcbiAgLy8gT0F1dGggMiB1c2VzIGVpdGhlciBpZCB0b2tlbiBvciBhY2Nlc3MgdG9rZW5cbiAgaWRUb2tlbj86IHN0cmluZyB8IG51bGw7XG4gIGFjY2Vzc1Rva2VuPzogc3RyaW5nIHwgbnVsbDtcblxuICAvLyBUaGVzZSBmaWVsZHMgYXJlIHVzZWQgd2l0aCBPQXV0aCAxXG4gIG9hdXRoVG9rZW4/OiBzdHJpbmc7XG4gIHNlY3JldD86IHN0cmluZztcbiAgb2F1dGhUb2tlblNlY3JldD86IHN0cmluZztcblxuICAvLyBOb25jZSBpcyBvbmx5IHNldCBpZiBwZW5kaW5nVG9rZW4gaXMgbm90IHByZXNlbnRcbiAgbm9uY2U/OiBzdHJpbmc7XG4gIHBlbmRpbmdUb2tlbj86IHN0cmluZztcblxuICAvLyBVdGlsaXRpZXNcbiAgcHJvdmlkZXJJZDogc3RyaW5nO1xuICBzaWduSW5NZXRob2Q6IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBPQXV0aCBjcmVkZW50aWFscyByZXR1cm5lZCBieSBhbiB7QGxpbmsgT0F1dGhQcm92aWRlcn0uXG4gKlxuICogQHJlbWFya3NcbiAqIEltcGxlbWVudGF0aW9ucyBzcGVjaWZ5IHRoZSBkZXRhaWxzIGFib3V0IGVhY2ggYXV0aCBwcm92aWRlcidzIGNyZWRlbnRpYWwgcmVxdWlyZW1lbnRzLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIE9BdXRoQ3JlZGVudGlhbCBleHRlbmRzIEF1dGhDcmVkZW50aWFsIHtcbiAgLyoqXG4gICAqIFRoZSBPQXV0aCBJRCB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIGNyZWRlbnRpYWwgaWYgaXQgYmVsb25ncyB0byBhbiBPSURDIHByb3ZpZGVyLFxuICAgKiBzdWNoIGFzIGBnb29nbGUuY29tYC5cbiAgICogQHJlYWRvbmx5XG4gICAqL1xuICBpZFRva2VuPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIE9BdXRoIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIGNyZWRlbnRpYWwgaWYgaXQgYmVsb25ncyB0byBhblxuICAgKiB7QGxpbmsgT0F1dGhQcm92aWRlcn0sIHN1Y2ggYXMgYGZhY2Vib29rLmNvbWAsIGB0d2l0dGVyLmNvbWAsIGV0Yy5cbiAgICogQHJlYWRvbmx5XG4gICAqL1xuICBhY2Nlc3NUb2tlbj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBPQXV0aCBhY2Nlc3MgdG9rZW4gc2VjcmV0IGFzc29jaWF0ZWQgd2l0aCB0aGUgY3JlZGVudGlhbCBpZiBpdCBiZWxvbmdzIHRvIGFuIE9BdXRoIDEuMFxuICAgKiBwcm92aWRlciwgc3VjaCBhcyBgdHdpdHRlci5jb21gLlxuICAgKiBAcmVhZG9ubHlcbiAgICovXG4gIHNlY3JldD86IHN0cmluZztcblxuICBwcml2YXRlIG5vbmNlPzogc3RyaW5nO1xuICBwcml2YXRlIHBlbmRpbmdUb2tlbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBzdGF0aWMgX2Zyb21QYXJhbXMocGFyYW1zOiBPQXV0aENyZWRlbnRpYWxQYXJhbXMpOiBPQXV0aENyZWRlbnRpYWwge1xuICAgIGNvbnN0IGNyZWQgPSBuZXcgT0F1dGhDcmVkZW50aWFsKHBhcmFtcy5wcm92aWRlcklkLCBwYXJhbXMuc2lnbkluTWV0aG9kKTtcblxuICAgIGlmIChwYXJhbXMuaWRUb2tlbiB8fCBwYXJhbXMuYWNjZXNzVG9rZW4pIHtcbiAgICAgIC8vIE9BdXRoIDIgYW5kIGVpdGhlciBJRCB0b2tlbiBvciBhY2Nlc3MgdG9rZW4uXG4gICAgICBpZiAocGFyYW1zLmlkVG9rZW4pIHtcbiAgICAgICAgY3JlZC5pZFRva2VuID0gcGFyYW1zLmlkVG9rZW47XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJhbXMuYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgY3JlZC5hY2Nlc3NUb2tlbiA9IHBhcmFtcy5hY2Nlc3NUb2tlbjtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIG5vbmNlIGlmIGF2YWlsYWJsZSBhbmQgbm8gcGVuZGluZ1Rva2VuIGlzIHByZXNlbnQuXG4gICAgICBpZiAocGFyYW1zLm5vbmNlICYmICFwYXJhbXMucGVuZGluZ1Rva2VuKSB7XG4gICAgICAgIGNyZWQubm9uY2UgPSBwYXJhbXMubm9uY2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJhbXMucGVuZGluZ1Rva2VuKSB7XG4gICAgICAgIGNyZWQucGVuZGluZ1Rva2VuID0gcGFyYW1zLnBlbmRpbmdUb2tlbjtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHBhcmFtcy5vYXV0aFRva2VuICYmIHBhcmFtcy5vYXV0aFRva2VuU2VjcmV0KSB7XG4gICAgICAvLyBPQXV0aCAxIGFuZCBPQXV0aCB0b2tlbiB3aXRoIHRva2VuIHNlY3JldFxuICAgICAgY3JlZC5hY2Nlc3NUb2tlbiA9IHBhcmFtcy5vYXV0aFRva2VuO1xuICAgICAgY3JlZC5zZWNyZXQgPSBwYXJhbXMub2F1dGhUb2tlblNlY3JldDtcbiAgICB9IGVsc2Uge1xuICAgICAgX2ZhaWwoQXV0aEVycm9yQ29kZS5BUkdVTUVOVF9FUlJPUik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNyZWQ7XG4gIH1cblxuICAvKioge0Bpbmhlcml0ZG9jIEF1dGhDcmVkZW50aWFsLnRvSlNPTn0gICovXG4gIHRvSlNPTigpOiBvYmplY3Qge1xuICAgIHJldHVybiB7XG4gICAgICBpZFRva2VuOiB0aGlzLmlkVG9rZW4sXG4gICAgICBhY2Nlc3NUb2tlbjogdGhpcy5hY2Nlc3NUb2tlbixcbiAgICAgIHNlY3JldDogdGhpcy5zZWNyZXQsXG4gICAgICBub25jZTogdGhpcy5ub25jZSxcbiAgICAgIHBlbmRpbmdUb2tlbjogdGhpcy5wZW5kaW5nVG9rZW4sXG4gICAgICBwcm92aWRlcklkOiB0aGlzLnByb3ZpZGVySWQsXG4gICAgICBzaWduSW5NZXRob2Q6IHRoaXMuc2lnbkluTWV0aG9kXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0aWMgbWV0aG9kIHRvIGRlc2VyaWFsaXplIGEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiBhbiBvYmplY3QgaW50byBhblxuICAgKiB7QGxpbmsgIEF1dGhDcmVkZW50aWFsfS5cbiAgICpcbiAgICogQHBhcmFtIGpzb24gLSBJbnB1dCBjYW4gYmUgZWl0aGVyIE9iamVjdCBvciB0aGUgc3RyaW5naWZpZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIG9iamVjdC5cbiAgICogV2hlbiBzdHJpbmcgaXMgcHJvdmlkZWQsIEpTT04ucGFyc2Ugd291bGQgYmUgY2FsbGVkIGZpcnN0LlxuICAgKlxuICAgKiBAcmV0dXJucyBJZiB0aGUgSlNPTiBpbnB1dCBkb2VzIG5vdCByZXByZXNlbnQgYW4ge0BsaW5rICBBdXRoQ3JlZGVudGlhbH0sIG51bGwgaXMgcmV0dXJuZWQuXG4gICAqL1xuICBzdGF0aWMgZnJvbUpTT04oanNvbjogc3RyaW5nIHwgb2JqZWN0KTogT0F1dGhDcmVkZW50aWFsIHwgbnVsbCB7XG4gICAgY29uc3Qgb2JqID0gdHlwZW9mIGpzb24gPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZShqc29uKSA6IGpzb247XG4gICAgY29uc3QgeyBwcm92aWRlcklkLCBzaWduSW5NZXRob2QsIC4uLnJlc3QgfTogT0F1dGhDcmVkZW50aWFsUGFyYW1zID0gb2JqO1xuICAgIGlmICghcHJvdmlkZXJJZCB8fCAhc2lnbkluTWV0aG9kKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBjcmVkID0gbmV3IE9BdXRoQ3JlZGVudGlhbChwcm92aWRlcklkLCBzaWduSW5NZXRob2QpO1xuICAgIGNyZWQuaWRUb2tlbiA9IHJlc3QuaWRUb2tlbiB8fCB1bmRlZmluZWQ7XG4gICAgY3JlZC5hY2Nlc3NUb2tlbiA9IHJlc3QuYWNjZXNzVG9rZW4gfHwgdW5kZWZpbmVkO1xuICAgIGNyZWQuc2VjcmV0ID0gcmVzdC5zZWNyZXQ7XG4gICAgY3JlZC5ub25jZSA9IHJlc3Qubm9uY2U7XG4gICAgY3JlZC5wZW5kaW5nVG9rZW4gPSByZXN0LnBlbmRpbmdUb2tlbiB8fCBudWxsO1xuICAgIHJldHVybiBjcmVkO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfZ2V0SWRUb2tlblJlc3BvbnNlKGF1dGg6IEF1dGhJbnRlcm5hbCk6IFByb21pc2U8SWRUb2tlblJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuYnVpbGRSZXF1ZXN0KCk7XG4gICAgcmV0dXJuIHNpZ25JbldpdGhJZHAoYXV0aCwgcmVxdWVzdCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9saW5rVG9JZFRva2VuKFxuICAgIGF1dGg6IEF1dGhJbnRlcm5hbCxcbiAgICBpZFRva2VuOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxJZFRva2VuUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5idWlsZFJlcXVlc3QoKTtcbiAgICByZXF1ZXN0LmlkVG9rZW4gPSBpZFRva2VuO1xuICAgIHJldHVybiBzaWduSW5XaXRoSWRwKGF1dGgsIHJlcXVlc3QpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfZ2V0UmVhdXRoZW50aWNhdGlvblJlc29sdmVyKGF1dGg6IEF1dGhJbnRlcm5hbCk6IFByb21pc2U8SWRUb2tlblJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuYnVpbGRSZXF1ZXN0KCk7XG4gICAgcmVxdWVzdC5hdXRvQ3JlYXRlID0gZmFsc2U7XG4gICAgcmV0dXJuIHNpZ25JbldpdGhJZHAoYXV0aCwgcmVxdWVzdCk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkUmVxdWVzdCgpOiBTaWduSW5XaXRoSWRwUmVxdWVzdCB7XG4gICAgY29uc3QgcmVxdWVzdDogU2lnbkluV2l0aElkcFJlcXVlc3QgPSB7XG4gICAgICByZXF1ZXN0VXJpOiBJRFBfUkVRVUVTVF9VUkksXG4gICAgICByZXR1cm5TZWN1cmVUb2tlbjogdHJ1ZVxuICAgIH07XG5cbiAgICBpZiAodGhpcy5wZW5kaW5nVG9rZW4pIHtcbiAgICAgIHJlcXVlc3QucGVuZGluZ1Rva2VuID0gdGhpcy5wZW5kaW5nVG9rZW47XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHBvc3RCb2R5OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgICBpZiAodGhpcy5pZFRva2VuKSB7XG4gICAgICAgIHBvc3RCb2R5WydpZF90b2tlbiddID0gdGhpcy5pZFRva2VuO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgcG9zdEJvZHlbJ2FjY2Vzc190b2tlbiddID0gdGhpcy5hY2Nlc3NUb2tlbjtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnNlY3JldCkge1xuICAgICAgICBwb3N0Qm9keVsnb2F1dGhfdG9rZW5fc2VjcmV0J10gPSB0aGlzLnNlY3JldDtcbiAgICAgIH1cblxuICAgICAgcG9zdEJvZHlbJ3Byb3ZpZGVySWQnXSA9IHRoaXMucHJvdmlkZXJJZDtcbiAgICAgIGlmICh0aGlzLm5vbmNlICYmICF0aGlzLnBlbmRpbmdUb2tlbikge1xuICAgICAgICBwb3N0Qm9keVsnbm9uY2UnXSA9IHRoaXMubm9uY2U7XG4gICAgICB9XG5cbiAgICAgIHJlcXVlc3QucG9zdEJvZHkgPSBxdWVyeXN0cmluZyhwb3N0Qm9keSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcXVlc3Q7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQge1xuICBFbmRwb2ludCxcbiAgSHR0cE1ldGhvZCxcbiAgX2FkZFRpZElmTmVjZXNzYXJ5LFxuICBfbWFrZVRhZ2dlZEVycm9yLFxuICBfcGVyZm9ybUFwaVJlcXVlc3QsXG4gIF9wZXJmb3JtU2lnbkluUmVxdWVzdFxufSBmcm9tICcuLi9pbmRleCc7XG5pbXBvcnQgeyBBdXRoRXJyb3JDb2RlIH0gZnJvbSAnLi4vLi4vY29yZS9lcnJvcnMnO1xuaW1wb3J0IHsgSWRUb2tlblJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vbW9kZWwvaWRfdG9rZW4nO1xuaW1wb3J0IHsgU2VydmVyRXJyb3IsIFNlcnZlckVycm9yTWFwIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IEF1dGggfSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlbmRQaG9uZVZlcmlmaWNhdGlvbkNvZGVSZXF1ZXN0IHtcbiAgcGhvbmVOdW1iZXI6IHN0cmluZztcbiAgcmVjYXB0Y2hhVG9rZW46IHN0cmluZztcbiAgdGVuYW50SWQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VuZFBob25lVmVyaWZpY2F0aW9uQ29kZVJlc3BvbnNlIHtcbiAgc2Vzc2lvbkluZm86IHN0cmluZztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlbmRQaG9uZVZlcmlmaWNhdGlvbkNvZGUoXG4gIGF1dGg6IEF1dGgsXG4gIHJlcXVlc3Q6IFNlbmRQaG9uZVZlcmlmaWNhdGlvbkNvZGVSZXF1ZXN0XG4pOiBQcm9taXNlPFNlbmRQaG9uZVZlcmlmaWNhdGlvbkNvZGVSZXNwb25zZT4ge1xuICByZXR1cm4gX3BlcmZvcm1BcGlSZXF1ZXN0PFxuICAgIFNlbmRQaG9uZVZlcmlmaWNhdGlvbkNvZGVSZXF1ZXN0LFxuICAgIFNlbmRQaG9uZVZlcmlmaWNhdGlvbkNvZGVSZXNwb25zZVxuICA+KFxuICAgIGF1dGgsXG4gICAgSHR0cE1ldGhvZC5QT1NULFxuICAgIEVuZHBvaW50LlNFTkRfVkVSSUZJQ0FUSU9OX0NPREUsXG4gICAgX2FkZFRpZElmTmVjZXNzYXJ5KGF1dGgsIHJlcXVlc3QpXG4gICk7XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbkluV2l0aFBob25lTnVtYmVyUmVxdWVzdCB7XG4gIHRlbXBvcmFyeVByb29mPzogc3RyaW5nO1xuICBwaG9uZU51bWJlcj86IHN0cmluZztcbiAgc2Vzc2lvbkluZm8/OiBzdHJpbmc7XG4gIGNvZGU/OiBzdHJpbmc7XG4gIHRlbmFudElkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpbmtXaXRoUGhvbmVOdW1iZXJSZXF1ZXN0XG4gIGV4dGVuZHMgU2lnbkluV2l0aFBob25lTnVtYmVyUmVxdWVzdCB7XG4gIGlkVG9rZW46IHN0cmluZztcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduSW5XaXRoUGhvbmVOdW1iZXJSZXNwb25zZSBleHRlbmRzIElkVG9rZW5SZXNwb25zZSB7XG4gIHRlbXBvcmFyeVByb29mPzogc3RyaW5nO1xuICBwaG9uZU51bWJlcj86IHN0cmluZztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNpZ25JbldpdGhQaG9uZU51bWJlcihcbiAgYXV0aDogQXV0aCxcbiAgcmVxdWVzdDogU2lnbkluV2l0aFBob25lTnVtYmVyUmVxdWVzdFxuKTogUHJvbWlzZTxTaWduSW5XaXRoUGhvbmVOdW1iZXJSZXNwb25zZT4ge1xuICByZXR1cm4gX3BlcmZvcm1TaWduSW5SZXF1ZXN0PFxuICAgIFNpZ25JbldpdGhQaG9uZU51bWJlclJlcXVlc3QsXG4gICAgU2lnbkluV2l0aFBob25lTnVtYmVyUmVzcG9uc2VcbiAgPihcbiAgICBhdXRoLFxuICAgIEh0dHBNZXRob2QuUE9TVCxcbiAgICBFbmRwb2ludC5TSUdOX0lOX1dJVEhfUEhPTkVfTlVNQkVSLFxuICAgIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KVxuICApO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlua1dpdGhQaG9uZU51bWJlcihcbiAgYXV0aDogQXV0aCxcbiAgcmVxdWVzdDogTGlua1dpdGhQaG9uZU51bWJlclJlcXVlc3Rcbik6IFByb21pc2U8U2lnbkluV2l0aFBob25lTnVtYmVyUmVzcG9uc2U+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBfcGVyZm9ybVNpZ25JblJlcXVlc3Q8XG4gICAgTGlua1dpdGhQaG9uZU51bWJlclJlcXVlc3QsXG4gICAgU2lnbkluV2l0aFBob25lTnVtYmVyUmVzcG9uc2VcbiAgPihcbiAgICBhdXRoLFxuICAgIEh0dHBNZXRob2QuUE9TVCxcbiAgICBFbmRwb2ludC5TSUdOX0lOX1dJVEhfUEhPTkVfTlVNQkVSLFxuICAgIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KVxuICApO1xuICBpZiAocmVzcG9uc2UudGVtcG9yYXJ5UHJvb2YpIHtcbiAgICB0aHJvdyBfbWFrZVRhZ2dlZEVycm9yKGF1dGgsIEF1dGhFcnJvckNvZGUuTkVFRF9DT05GSVJNQVRJT04sIHJlc3BvbnNlKTtcbiAgfVxuICByZXR1cm4gcmVzcG9uc2U7XG59XG5cbmludGVyZmFjZSBWZXJpZnlQaG9uZU51bWJlckZvckV4aXN0aW5nUmVxdWVzdFxuICBleHRlbmRzIFNpZ25JbldpdGhQaG9uZU51bWJlclJlcXVlc3Qge1xuICBvcGVyYXRpb246ICdSRUFVVEgnO1xufVxuXG5jb25zdCBWRVJJRllfUEhPTkVfTlVNQkVSX0ZPUl9FWElTVElOR19FUlJPUl9NQVBfOiBQYXJ0aWFsPFxuICBTZXJ2ZXJFcnJvck1hcDxTZXJ2ZXJFcnJvcj5cbj4gPSB7XG4gIFtTZXJ2ZXJFcnJvci5VU0VSX05PVF9GT1VORF06IEF1dGhFcnJvckNvZGUuVVNFUl9ERUxFVEVEXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdmVyaWZ5UGhvbmVOdW1iZXJGb3JFeGlzdGluZyhcbiAgYXV0aDogQXV0aCxcbiAgcmVxdWVzdDogU2lnbkluV2l0aFBob25lTnVtYmVyUmVxdWVzdFxuKTogUHJvbWlzZTxTaWduSW5XaXRoUGhvbmVOdW1iZXJSZXNwb25zZT4ge1xuICBjb25zdCBhcGlSZXF1ZXN0OiBWZXJpZnlQaG9uZU51bWJlckZvckV4aXN0aW5nUmVxdWVzdCA9IHtcbiAgICAuLi5yZXF1ZXN0LFxuICAgIG9wZXJhdGlvbjogJ1JFQVVUSCdcbiAgfTtcbiAgcmV0dXJuIF9wZXJmb3JtU2lnbkluUmVxdWVzdDxcbiAgICBWZXJpZnlQaG9uZU51bWJlckZvckV4aXN0aW5nUmVxdWVzdCxcbiAgICBTaWduSW5XaXRoUGhvbmVOdW1iZXJSZXNwb25zZVxuICA+KFxuICAgIGF1dGgsXG4gICAgSHR0cE1ldGhvZC5QT1NULFxuICAgIEVuZHBvaW50LlNJR05fSU5fV0lUSF9QSE9ORV9OVU1CRVIsXG4gICAgX2FkZFRpZElmTmVjZXNzYXJ5KGF1dGgsIGFwaVJlcXVlc3QpLFxuICAgIFZFUklGWV9QSE9ORV9OVU1CRVJfRk9SX0VYSVNUSU5HX0VSUk9SX01BUF9cbiAgKTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBQcm92aWRlcklkLCBTaWduSW5NZXRob2QgfSBmcm9tICcuLi8uLi9tb2RlbC9lbnVtcyc7XG5cbmltcG9ydCB7IFBob25lT3JPYXV0aFRva2VuUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9hcGkvYXV0aGVudGljYXRpb24vbWZhJztcbmltcG9ydCB7XG4gIGxpbmtXaXRoUGhvbmVOdW1iZXIsXG4gIHNpZ25JbldpdGhQaG9uZU51bWJlcixcbiAgU2lnbkluV2l0aFBob25lTnVtYmVyUmVxdWVzdCxcbiAgdmVyaWZ5UGhvbmVOdW1iZXJGb3JFeGlzdGluZ1xufSBmcm9tICcuLi8uLi9hcGkvYXV0aGVudGljYXRpb24vc21zJztcbmltcG9ydCB7IEF1dGhJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL2F1dGgnO1xuaW1wb3J0IHsgSWRUb2tlblJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vbW9kZWwvaWRfdG9rZW4nO1xuaW1wb3J0IHsgQXV0aENyZWRlbnRpYWwgfSBmcm9tICcuL2F1dGhfY3JlZGVudGlhbCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGhvbmVBdXRoQ3JlZGVudGlhbFBhcmFtZXRlcnMge1xuICB2ZXJpZmljYXRpb25JZD86IHN0cmluZztcbiAgdmVyaWZpY2F0aW9uQ29kZT86IHN0cmluZztcbiAgcGhvbmVOdW1iZXI/OiBzdHJpbmc7XG4gIHRlbXBvcmFyeVByb29mPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGNyZWRlbnRpYWxzIHJldHVybmVkIGJ5IHtAbGluayBQaG9uZUF1dGhQcm92aWRlcn0uXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgUGhvbmVBdXRoQ3JlZGVudGlhbCBleHRlbmRzIEF1dGhDcmVkZW50aWFsIHtcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHBhcmFtczogUGhvbmVBdXRoQ3JlZGVudGlhbFBhcmFtZXRlcnMpIHtcbiAgICBzdXBlcihQcm92aWRlcklkLlBIT05FLCBTaWduSW5NZXRob2QuUEhPTkUpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBzdGF0aWMgX2Zyb21WZXJpZmljYXRpb24oXG4gICAgdmVyaWZpY2F0aW9uSWQ6IHN0cmluZyxcbiAgICB2ZXJpZmljYXRpb25Db2RlOiBzdHJpbmdcbiAgKTogUGhvbmVBdXRoQ3JlZGVudGlhbCB7XG4gICAgcmV0dXJuIG5ldyBQaG9uZUF1dGhDcmVkZW50aWFsKHsgdmVyaWZpY2F0aW9uSWQsIHZlcmlmaWNhdGlvbkNvZGUgfSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHN0YXRpYyBfZnJvbVRva2VuUmVzcG9uc2UoXG4gICAgcGhvbmVOdW1iZXI6IHN0cmluZyxcbiAgICB0ZW1wb3JhcnlQcm9vZjogc3RyaW5nXG4gICk6IFBob25lQXV0aENyZWRlbnRpYWwge1xuICAgIHJldHVybiBuZXcgUGhvbmVBdXRoQ3JlZGVudGlhbCh7IHBob25lTnVtYmVyLCB0ZW1wb3JhcnlQcm9vZiB9KTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2dldElkVG9rZW5SZXNwb25zZShhdXRoOiBBdXRoSW50ZXJuYWwpOiBQcm9taXNlPFBob25lT3JPYXV0aFRva2VuUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gc2lnbkluV2l0aFBob25lTnVtYmVyKGF1dGgsIHRoaXMuX21ha2VWZXJpZmljYXRpb25SZXF1ZXN0KCkpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfbGlua1RvSWRUb2tlbihcbiAgICBhdXRoOiBBdXRoSW50ZXJuYWwsXG4gICAgaWRUb2tlbjogc3RyaW5nXG4gICk6IFByb21pc2U8SWRUb2tlblJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIGxpbmtXaXRoUGhvbmVOdW1iZXIoYXV0aCwge1xuICAgICAgaWRUb2tlbixcbiAgICAgIC4uLnRoaXMuX21ha2VWZXJpZmljYXRpb25SZXF1ZXN0KClcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2dldFJlYXV0aGVudGljYXRpb25SZXNvbHZlcihhdXRoOiBBdXRoSW50ZXJuYWwpOiBQcm9taXNlPElkVG9rZW5SZXNwb25zZT4ge1xuICAgIHJldHVybiB2ZXJpZnlQaG9uZU51bWJlckZvckV4aXN0aW5nKGF1dGgsIHRoaXMuX21ha2VWZXJpZmljYXRpb25SZXF1ZXN0KCkpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfbWFrZVZlcmlmaWNhdGlvblJlcXVlc3QoKTogU2lnbkluV2l0aFBob25lTnVtYmVyUmVxdWVzdCB7XG4gICAgY29uc3QgeyB0ZW1wb3JhcnlQcm9vZiwgcGhvbmVOdW1iZXIsIHZlcmlmaWNhdGlvbklkLCB2ZXJpZmljYXRpb25Db2RlIH0gPVxuICAgICAgdGhpcy5wYXJhbXM7XG4gICAgaWYgKHRlbXBvcmFyeVByb29mICYmIHBob25lTnVtYmVyKSB7XG4gICAgICByZXR1cm4geyB0ZW1wb3JhcnlQcm9vZiwgcGhvbmVOdW1iZXIgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc2Vzc2lvbkluZm86IHZlcmlmaWNhdGlvbklkLFxuICAgICAgY29kZTogdmVyaWZpY2F0aW9uQ29kZVxuICAgIH07XG4gIH1cblxuICAvKioge0Bpbmhlcml0ZG9jIEF1dGhDcmVkZW50aWFsLnRvSlNPTn0gKi9cbiAgdG9KU09OKCk6IG9iamVjdCB7XG4gICAgY29uc3Qgb2JqOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgcHJvdmlkZXJJZDogdGhpcy5wcm92aWRlcklkXG4gICAgfTtcbiAgICBpZiAodGhpcy5wYXJhbXMucGhvbmVOdW1iZXIpIHtcbiAgICAgIG9iai5waG9uZU51bWJlciA9IHRoaXMucGFyYW1zLnBob25lTnVtYmVyO1xuICAgIH1cbiAgICBpZiAodGhpcy5wYXJhbXMudGVtcG9yYXJ5UHJvb2YpIHtcbiAgICAgIG9iai50ZW1wb3JhcnlQcm9vZiA9IHRoaXMucGFyYW1zLnRlbXBvcmFyeVByb29mO1xuICAgIH1cbiAgICBpZiAodGhpcy5wYXJhbXMudmVyaWZpY2F0aW9uQ29kZSkge1xuICAgICAgb2JqLnZlcmlmaWNhdGlvbkNvZGUgPSB0aGlzLnBhcmFtcy52ZXJpZmljYXRpb25Db2RlO1xuICAgIH1cbiAgICBpZiAodGhpcy5wYXJhbXMudmVyaWZpY2F0aW9uSWQpIHtcbiAgICAgIG9iai52ZXJpZmljYXRpb25JZCA9IHRoaXMucGFyYW1zLnZlcmlmaWNhdGlvbklkO1xuICAgIH1cblxuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICAvKiogR2VuZXJhdGVzIGEgcGhvbmUgY3JlZGVudGlhbCBiYXNlZCBvbiBhIHBsYWluIG9iamVjdCBvciBhIEpTT04gc3RyaW5nLiAqL1xuICBzdGF0aWMgZnJvbUpTT04oanNvbjogb2JqZWN0IHwgc3RyaW5nKTogUGhvbmVBdXRoQ3JlZGVudGlhbCB8IG51bGwge1xuICAgIGlmICh0eXBlb2YganNvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGpzb24gPSBKU09OLnBhcnNlKGpzb24pO1xuICAgIH1cblxuICAgIGNvbnN0IHsgdmVyaWZpY2F0aW9uSWQsIHZlcmlmaWNhdGlvbkNvZGUsIHBob25lTnVtYmVyLCB0ZW1wb3JhcnlQcm9vZiB9ID1cbiAgICAgIGpzb24gYXMgeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbiAgICBpZiAoXG4gICAgICAhdmVyaWZpY2F0aW9uQ29kZSAmJlxuICAgICAgIXZlcmlmaWNhdGlvbklkICYmXG4gICAgICAhcGhvbmVOdW1iZXIgJiZcbiAgICAgICF0ZW1wb3JhcnlQcm9vZlxuICAgICkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQaG9uZUF1dGhDcmVkZW50aWFsKHtcbiAgICAgIHZlcmlmaWNhdGlvbklkLFxuICAgICAgdmVyaWZpY2F0aW9uQ29kZSxcbiAgICAgIHBob25lTnVtYmVyLFxuICAgICAgdGVtcG9yYXJ5UHJvb2ZcbiAgICB9KTtcbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IGV4dHJhY3RRdWVyeXN0cmluZywgcXVlcnlzdHJpbmdEZWNvZGUgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5pbXBvcnQgeyBBY3Rpb25Db2RlT3BlcmF0aW9uIH0gZnJvbSAnLi4vbW9kZWwvcHVibGljX3R5cGVzJztcbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgeyBfYXNzZXJ0IH0gZnJvbSAnLi91dGlsL2Fzc2VydCc7XG5cbi8qKlxuICogRW51bXMgZm9yIGZpZWxkcyBpbiBVUkwgcXVlcnkgc3RyaW5nLlxuICpcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGVudW0gUXVlcnlGaWVsZCB7XG4gIEFQSV9LRVkgPSAnYXBpS2V5JyxcbiAgQ09ERSA9ICdvb2JDb2RlJyxcbiAgQ09OVElOVUVfVVJMID0gJ2NvbnRpbnVlVXJsJyxcbiAgTEFOR1VBR0VfQ09ERSA9ICdsYW5ndWFnZUNvZGUnLFxuICBNT0RFID0gJ21vZGUnLFxuICBURU5BTlRfSUQgPSAndGVuYW50SWQnXG59XG5cbi8qKlxuICogTWFwcyB0aGUgbW9kZSBzdHJpbmcgaW4gYWN0aW9uIGNvZGUgVVJMIHRvIEFjdGlvbiBDb2RlIEluZm8gb3BlcmF0aW9uLlxuICpcbiAqIEBwYXJhbSBtb2RlXG4gKi9cbmZ1bmN0aW9uIHBhcnNlTW9kZShtb2RlOiBzdHJpbmcgfCBudWxsKTogQWN0aW9uQ29kZU9wZXJhdGlvbiB8IG51bGwge1xuICBzd2l0Y2ggKG1vZGUpIHtcbiAgICBjYXNlICdyZWNvdmVyRW1haWwnOlxuICAgICAgcmV0dXJuIEFjdGlvbkNvZGVPcGVyYXRpb24uUkVDT1ZFUl9FTUFJTDtcbiAgICBjYXNlICdyZXNldFBhc3N3b3JkJzpcbiAgICAgIHJldHVybiBBY3Rpb25Db2RlT3BlcmF0aW9uLlBBU1NXT1JEX1JFU0VUO1xuICAgIGNhc2UgJ3NpZ25Jbic6XG4gICAgICByZXR1cm4gQWN0aW9uQ29kZU9wZXJhdGlvbi5FTUFJTF9TSUdOSU47XG4gICAgY2FzZSAndmVyaWZ5RW1haWwnOlxuICAgICAgcmV0dXJuIEFjdGlvbkNvZGVPcGVyYXRpb24uVkVSSUZZX0VNQUlMO1xuICAgIGNhc2UgJ3ZlcmlmeUFuZENoYW5nZUVtYWlsJzpcbiAgICAgIHJldHVybiBBY3Rpb25Db2RlT3BlcmF0aW9uLlZFUklGWV9BTkRfQ0hBTkdFX0VNQUlMO1xuICAgIGNhc2UgJ3JldmVydFNlY29uZEZhY3RvckFkZGl0aW9uJzpcbiAgICAgIHJldHVybiBBY3Rpb25Db2RlT3BlcmF0aW9uLlJFVkVSVF9TRUNPTkRfRkFDVE9SX0FERElUSU9OO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIEhlbHBlciB0byBwYXJzZSBGREwgbGlua3NcbiAqXG4gKiBAcGFyYW0gdXJsXG4gKi9cbmZ1bmN0aW9uIHBhcnNlRGVlcExpbmsodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBsaW5rID0gcXVlcnlzdHJpbmdEZWNvZGUoZXh0cmFjdFF1ZXJ5c3RyaW5nKHVybCkpWydsaW5rJ107XG5cbiAgLy8gRG91YmxlIGxpbmsgY2FzZSAoYXV0b21hdGljIHJlZGlyZWN0KS5cbiAgY29uc3QgZG91YmxlRGVlcExpbmsgPSBsaW5rXG4gICAgPyBxdWVyeXN0cmluZ0RlY29kZShleHRyYWN0UXVlcnlzdHJpbmcobGluaykpWydkZWVwX2xpbmtfaWQnXVxuICAgIDogbnVsbDtcbiAgLy8gaU9TIGN1c3RvbSBzY2hlbWUgbGlua3MuXG4gIGNvbnN0IGlPU0RlZXBMaW5rID0gcXVlcnlzdHJpbmdEZWNvZGUoZXh0cmFjdFF1ZXJ5c3RyaW5nKHVybCkpW1xuICAgICdkZWVwX2xpbmtfaWQnXG4gIF07XG4gIGNvbnN0IGlPU0RvdWJsZURlZXBMaW5rID0gaU9TRGVlcExpbmtcbiAgICA/IHF1ZXJ5c3RyaW5nRGVjb2RlKGV4dHJhY3RRdWVyeXN0cmluZyhpT1NEZWVwTGluaykpWydsaW5rJ11cbiAgICA6IG51bGw7XG4gIHJldHVybiBpT1NEb3VibGVEZWVwTGluayB8fCBpT1NEZWVwTGluayB8fCBkb3VibGVEZWVwTGluayB8fCBsaW5rIHx8IHVybDtcbn1cblxuLyoqXG4gKiBBIHV0aWxpdHkgY2xhc3MgdG8gcGFyc2UgZW1haWwgYWN0aW9uIFVSTHMgc3VjaCBhcyBwYXNzd29yZCByZXNldCwgZW1haWwgdmVyaWZpY2F0aW9uLFxuICogZW1haWwgbGluayBzaWduIGluLCBldGMuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgQWN0aW9uQ29kZVVSTCB7XG4gIC8qKlxuICAgKiBUaGUgQVBJIGtleSBvZiB0aGUgZW1haWwgYWN0aW9uIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBhcGlLZXk6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBhY3Rpb24gY29kZSBvZiB0aGUgZW1haWwgYWN0aW9uIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBjb2RlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgY29udGludWUgVVJMIG9mIHRoZSBlbWFpbCBhY3Rpb24gbGluay4gTnVsbCBpZiBub3QgcHJvdmlkZWQuXG4gICAqL1xuICByZWFkb25seSBjb250aW51ZVVybDogc3RyaW5nIHwgbnVsbDtcbiAgLyoqXG4gICAqIFRoZSBsYW5ndWFnZSBjb2RlIG9mIHRoZSBlbWFpbCBhY3Rpb24gbGluay4gTnVsbCBpZiBub3QgcHJvdmlkZWQuXG4gICAqL1xuICByZWFkb25seSBsYW5ndWFnZUNvZGU6IHN0cmluZyB8IG51bGw7XG4gIC8qKlxuICAgKiBUaGUgYWN0aW9uIHBlcmZvcm1lZCBieSB0aGUgZW1haWwgYWN0aW9uIGxpbmsuIEl0IHJldHVybnMgZnJvbSBvbmUgb2YgdGhlIHR5cGVzIGZyb21cbiAgICoge0BsaW5rIEFjdGlvbkNvZGVJbmZvfVxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdGVuYW50IElEIG9mIHRoZSBlbWFpbCBhY3Rpb24gbGluay4gTnVsbCBpZiB0aGUgZW1haWwgYWN0aW9uIGlzIGZyb20gdGhlIHBhcmVudCBwcm9qZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgdGVuYW50SWQ6IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBhY3Rpb25MaW5rIC0gVGhlIGxpbmsgZnJvbSB3aGljaCB0byBleHRyYWN0IHRoZSBVUkwuXG4gICAqIEByZXR1cm5zIFRoZSB7QGxpbmsgQWN0aW9uQ29kZVVSTH0gb2JqZWN0LCBvciBudWxsIGlmIHRoZSBsaW5rIGlzIGludmFsaWQuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgY29uc3RydWN0b3IoYWN0aW9uTGluazogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2VhcmNoUGFyYW1zID0gcXVlcnlzdHJpbmdEZWNvZGUoZXh0cmFjdFF1ZXJ5c3RyaW5nKGFjdGlvbkxpbmspKTtcbiAgICBjb25zdCBhcGlLZXkgPSBzZWFyY2hQYXJhbXNbUXVlcnlGaWVsZC5BUElfS0VZXSA/PyBudWxsO1xuICAgIGNvbnN0IGNvZGUgPSBzZWFyY2hQYXJhbXNbUXVlcnlGaWVsZC5DT0RFXSA/PyBudWxsO1xuICAgIGNvbnN0IG9wZXJhdGlvbiA9IHBhcnNlTW9kZShzZWFyY2hQYXJhbXNbUXVlcnlGaWVsZC5NT0RFXSA/PyBudWxsKTtcbiAgICAvLyBWYWxpZGF0ZSBBUEkga2V5LCBjb2RlIGFuZCBtb2RlLlxuICAgIF9hc3NlcnQoYXBpS2V5ICYmIGNvZGUgJiYgb3BlcmF0aW9uLCBBdXRoRXJyb3JDb2RlLkFSR1VNRU5UX0VSUk9SKTtcbiAgICB0aGlzLmFwaUtleSA9IGFwaUtleTtcbiAgICB0aGlzLm9wZXJhdGlvbiA9IG9wZXJhdGlvbjtcbiAgICB0aGlzLmNvZGUgPSBjb2RlO1xuICAgIHRoaXMuY29udGludWVVcmwgPSBzZWFyY2hQYXJhbXNbUXVlcnlGaWVsZC5DT05USU5VRV9VUkxdID8/IG51bGw7XG4gICAgdGhpcy5sYW5ndWFnZUNvZGUgPSBzZWFyY2hQYXJhbXNbUXVlcnlGaWVsZC5MQU5HVUFHRV9DT0RFXSA/PyBudWxsO1xuICAgIHRoaXMudGVuYW50SWQgPSBzZWFyY2hQYXJhbXNbUXVlcnlGaWVsZC5URU5BTlRfSURdID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIHRoZSBlbWFpbCBhY3Rpb24gbGluayBzdHJpbmcgYW5kIHJldHVybnMgYW4ge0BsaW5rIEFjdGlvbkNvZGVVUkx9IGlmIHRoZSBsaW5rIGlzIHZhbGlkLFxuICAgKiBvdGhlcndpc2UgcmV0dXJucyBudWxsLlxuICAgKlxuICAgKiBAcGFyYW0gbGluayAgLSBUaGUgZW1haWwgYWN0aW9uIGxpbmsgc3RyaW5nLlxuICAgKiBAcmV0dXJucyBUaGUge0BsaW5rIEFjdGlvbkNvZGVVUkx9IG9iamVjdCwgb3IgbnVsbCBpZiB0aGUgbGluayBpcyBpbnZhbGlkLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqL1xuICBzdGF0aWMgcGFyc2VMaW5rKGxpbms6IHN0cmluZyk6IEFjdGlvbkNvZGVVUkwgfCBudWxsIHtcbiAgICBjb25zdCBhY3Rpb25MaW5rID0gcGFyc2VEZWVwTGluayhsaW5rKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIG5ldyBBY3Rpb25Db2RlVVJMKGFjdGlvbkxpbmspO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUGFyc2VzIHRoZSBlbWFpbCBhY3Rpb24gbGluayBzdHJpbmcgYW5kIHJldHVybnMgYW4ge0BsaW5rIEFjdGlvbkNvZGVVUkx9IGlmXG4gKiB0aGUgbGluayBpcyB2YWxpZCwgb3RoZXJ3aXNlIHJldHVybnMgbnVsbC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUFjdGlvbkNvZGVVUkwobGluazogc3RyaW5nKTogQWN0aW9uQ29kZVVSTCB8IG51bGwge1xuICByZXR1cm4gQWN0aW9uQ29kZVVSTC5wYXJzZUxpbmsobGluayk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgUHJvdmlkZXJJZCwgU2lnbkluTWV0aG9kIH0gZnJvbSAnLi4vLi4vbW9kZWwvZW51bXMnO1xuaW1wb3J0IHsgQXV0aFByb3ZpZGVyIH0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcblxuaW1wb3J0IHsgQWN0aW9uQ29kZVVSTCB9IGZyb20gJy4uL2FjdGlvbl9jb2RlX3VybCc7XG5pbXBvcnQgeyBFbWFpbEF1dGhDcmVkZW50aWFsIH0gZnJvbSAnLi4vY3JlZGVudGlhbHMvZW1haWwnO1xuaW1wb3J0IHsgQXV0aEVycm9yQ29kZSB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBfYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQnO1xuXG4vKipcbiAqIFByb3ZpZGVyIGZvciBnZW5lcmF0aW5nIHtAbGluayBFbWFpbEF1dGhDcmVkZW50aWFsfS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBFbWFpbEF1dGhQcm92aWRlciBpbXBsZW1lbnRzIEF1dGhQcm92aWRlciB7XG4gIC8qKlxuICAgKiBBbHdheXMgc2V0IHRvIHtAbGluayBQcm92aWRlcklkfS5QQVNTV09SRCwgZXZlbiBmb3IgZW1haWwgbGluay5cbiAgICovXG4gIHN0YXRpYyByZWFkb25seSBQUk9WSURFUl9JRDogJ3Bhc3N3b3JkJyA9IFByb3ZpZGVySWQuUEFTU1dPUkQ7XG4gIC8qKlxuICAgKiBBbHdheXMgc2V0IHRvIHtAbGluayBTaWduSW5NZXRob2R9LkVNQUlMX1BBU1NXT1JELlxuICAgKi9cbiAgc3RhdGljIHJlYWRvbmx5IEVNQUlMX1BBU1NXT1JEX1NJR05fSU5fTUVUSE9EOiAncGFzc3dvcmQnID1cbiAgICBTaWduSW5NZXRob2QuRU1BSUxfUEFTU1dPUkQ7XG4gIC8qKlxuICAgKiBBbHdheXMgc2V0IHRvIHtAbGluayBTaWduSW5NZXRob2R9LkVNQUlMX0xJTksuXG4gICAqL1xuICBzdGF0aWMgcmVhZG9ubHkgRU1BSUxfTElOS19TSUdOX0lOX01FVEhPRDogJ2VtYWlsTGluaycgPVxuICAgIFNpZ25Jbk1ldGhvZC5FTUFJTF9MSU5LO1xuICAvKipcbiAgICogQWx3YXlzIHNldCB0byB7QGxpbmsgUHJvdmlkZXJJZH0uUEFTU1dPUkQsIGV2ZW4gZm9yIGVtYWlsIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBwcm92aWRlcklkID0gRW1haWxBdXRoUHJvdmlkZXIuUFJPVklERVJfSUQ7XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgYW4ge0BsaW5rIEF1dGhDcmVkZW50aWFsfSB1c2luZyBhbiBlbWFpbCBhbmQgcGFzc3dvcmQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYGphdmFzY3JpcHRcbiAgICogY29uc3QgYXV0aENyZWRlbnRpYWwgPSBFbWFpbEF1dGhQcm92aWRlci5jcmVkZW50aWFsKGVtYWlsLCBwYXNzd29yZCk7XG4gICAqIGNvbnN0IHVzZXJDcmVkZW50aWFsID0gYXdhaXQgc2lnbkluV2l0aENyZWRlbnRpYWwoYXV0aCwgYXV0aENyZWRlbnRpYWwpO1xuICAgKiBgYGBcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgamF2YXNjcmlwdFxuICAgKiBjb25zdCB1c2VyQ3JlZGVudGlhbCA9IGF3YWl0IHNpZ25JbldpdGhFbWFpbEFuZFBhc3N3b3JkKGF1dGgsIGVtYWlsLCBwYXNzd29yZCk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gZW1haWwgLSBFbWFpbCBhZGRyZXNzLlxuICAgKiBAcGFyYW0gcGFzc3dvcmQgLSBVc2VyIGFjY291bnQgcGFzc3dvcmQuXG4gICAqIEByZXR1cm5zIFRoZSBhdXRoIHByb3ZpZGVyIGNyZWRlbnRpYWwuXG4gICAqL1xuICBzdGF0aWMgY3JlZGVudGlhbChlbWFpbDogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKTogRW1haWxBdXRoQ3JlZGVudGlhbCB7XG4gICAgcmV0dXJuIEVtYWlsQXV0aENyZWRlbnRpYWwuX2Zyb21FbWFpbEFuZFBhc3N3b3JkKGVtYWlsLCBwYXNzd29yZCk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBhbiB7QGxpbmsgQXV0aENyZWRlbnRpYWx9IHVzaW5nIGFuIGVtYWlsIGFuZCBhbiBlbWFpbCBsaW5rIGFmdGVyIGEgc2lnbiBpbiB3aXRoXG4gICAqIGVtYWlsIGxpbmsgb3BlcmF0aW9uLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBqYXZhc2NyaXB0XG4gICAqIGNvbnN0IGF1dGhDcmVkZW50aWFsID0gRW1haWxBdXRoUHJvdmlkZXIuY3JlZGVudGlhbFdpdGhMaW5rKGF1dGgsIGVtYWlsLCBlbWFpbExpbmspO1xuICAgKiBjb25zdCB1c2VyQ3JlZGVudGlhbCA9IGF3YWl0IHNpZ25JbldpdGhDcmVkZW50aWFsKGF1dGgsIGF1dGhDcmVkZW50aWFsKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYGphdmFzY3JpcHRcbiAgICogYXdhaXQgc2VuZFNpZ25JbkxpbmtUb0VtYWlsKGF1dGgsIGVtYWlsKTtcbiAgICogLy8gT2J0YWluIGVtYWlsTGluayBmcm9tIHVzZXIuXG4gICAqIGNvbnN0IHVzZXJDcmVkZW50aWFsID0gYXdhaXQgc2lnbkluV2l0aEVtYWlsTGluayhhdXRoLCBlbWFpbCwgZW1haWxMaW5rKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZSB1c2VkIHRvIHZlcmlmeSB0aGUgbGluay5cbiAgICogQHBhcmFtIGVtYWlsIC0gRW1haWwgYWRkcmVzcy5cbiAgICogQHBhcmFtIGVtYWlsTGluayAtIFNpZ24taW4gZW1haWwgbGluay5cbiAgICogQHJldHVybnMgLSBUaGUgYXV0aCBwcm92aWRlciBjcmVkZW50aWFsLlxuICAgKi9cbiAgc3RhdGljIGNyZWRlbnRpYWxXaXRoTGluayhcbiAgICBlbWFpbDogc3RyaW5nLFxuICAgIGVtYWlsTGluazogc3RyaW5nXG4gICk6IEVtYWlsQXV0aENyZWRlbnRpYWwge1xuICAgIGNvbnN0IGFjdGlvbkNvZGVVcmwgPSBBY3Rpb25Db2RlVVJMLnBhcnNlTGluayhlbWFpbExpbmspO1xuICAgIF9hc3NlcnQoYWN0aW9uQ29kZVVybCwgQXV0aEVycm9yQ29kZS5BUkdVTUVOVF9FUlJPUik7XG5cbiAgICByZXR1cm4gRW1haWxBdXRoQ3JlZGVudGlhbC5fZnJvbUVtYWlsQW5kQ29kZShcbiAgICAgIGVtYWlsLFxuICAgICAgYWN0aW9uQ29kZVVybC5jb2RlLFxuICAgICAgYWN0aW9uQ29kZVVybC50ZW5hbnRJZFxuICAgICk7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBBdXRoUHJvdmlkZXIgfSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuXG4vKipcbiAqIE1hcCBvZiBPQXV0aCBDdXN0b20gUGFyYW1ldGVycy5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB0eXBlIEN1c3RvbVBhcmFtZXRlcnMgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXG4vKipcbiAqIFRoZSBiYXNlIGNsYXNzIGZvciBhbGwgRmVkZXJhdGVkIHByb3ZpZGVycyAoT0F1dGggKGluY2x1ZGluZyBPSURDKSwgU0FNTCkuXG4gKlxuICogVGhpcyBjbGFzcyBpcyBub3QgbWVhbnQgdG8gYmUgaW5zdGFudGlhdGVkIGRpcmVjdGx5LlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEZlZGVyYXRlZEF1dGhQcm92aWRlciBpbXBsZW1lbnRzIEF1dGhQcm92aWRlciB7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZGVmYXVsdExhbmd1YWdlQ29kZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJpdmF0ZSBjdXN0b21QYXJhbWV0ZXJzOiBDdXN0b21QYXJhbWV0ZXJzID0ge307XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBnZW5lcmljIE9BdXRoIHByb3ZpZGVycy5cbiAgICpcbiAgICogQHBhcmFtIHByb3ZpZGVySWQgLSBQcm92aWRlciBmb3Igd2hpY2ggY3JlZGVudGlhbHMgc2hvdWxkIGJlIGdlbmVyYXRlZC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHJlYWRvbmx5IHByb3ZpZGVySWQ6IHN0cmluZykge31cblxuICAvKipcbiAgICogU2V0IHRoZSBsYW5ndWFnZSBnb2RlLlxuICAgKlxuICAgKiBAcGFyYW0gbGFuZ3VhZ2VDb2RlIC0gbGFuZ3VhZ2UgY29kZVxuICAgKi9cbiAgc2V0RGVmYXVsdExhbmd1YWdlKGxhbmd1YWdlQ29kZTogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuZGVmYXVsdExhbmd1YWdlQ29kZSA9IGxhbmd1YWdlQ29kZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBPQXV0aCBjdXN0b20gcGFyYW1ldGVycyB0byBwYXNzIGluIGFuIE9BdXRoIHJlcXVlc3QgZm9yIHBvcHVwIGFuZCByZWRpcmVjdCBzaWduLWluXG4gICAqIG9wZXJhdGlvbnMuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIEZvciBhIGRldGFpbGVkIGxpc3QsIGNoZWNrIHRoZSByZXNlcnZlZCByZXF1aXJlZCBPQXV0aCAyLjAgcGFyYW1ldGVycyBzdWNoIGFzIGBjbGllbnRfaWRgLFxuICAgKiBgcmVkaXJlY3RfdXJpYCwgYHNjb3BlYCwgYHJlc3BvbnNlX3R5cGVgLCBhbmQgYHN0YXRlYCBhcmUgbm90IGFsbG93ZWQgYW5kIHdpbGwgYmUgaWdub3JlZC5cbiAgICpcbiAgICogQHBhcmFtIGN1c3RvbU9BdXRoUGFyYW1ldGVycyAtIFRoZSBjdXN0b20gT0F1dGggcGFyYW1ldGVycyB0byBwYXNzIGluIHRoZSBPQXV0aCByZXF1ZXN0LlxuICAgKi9cbiAgc2V0Q3VzdG9tUGFyYW1ldGVycyhjdXN0b21PQXV0aFBhcmFtZXRlcnM6IEN1c3RvbVBhcmFtZXRlcnMpOiBBdXRoUHJvdmlkZXIge1xuICAgIHRoaXMuY3VzdG9tUGFyYW1ldGVycyA9IGN1c3RvbU9BdXRoUGFyYW1ldGVycztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBsaXN0IG9mIHtAbGluayBDdXN0b21QYXJhbWV0ZXJzfS5cbiAgICovXG4gIGdldEN1c3RvbVBhcmFtZXRlcnMoKTogQ3VzdG9tUGFyYW1ldGVycyB7XG4gICAgcmV0dXJuIHRoaXMuY3VzdG9tUGFyYW1ldGVycztcbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEF1dGhQcm92aWRlciwgVXNlckNyZWRlbnRpYWwgfSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuXG5pbXBvcnQgeyBfYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQnO1xuaW1wb3J0IHsgQXV0aEVycm9yQ29kZSB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbmltcG9ydCB7IE9BdXRoQ3JlZGVudGlhbCwgT0F1dGhDcmVkZW50aWFsUGFyYW1zIH0gZnJvbSAnLi4vY3JlZGVudGlhbHMvb2F1dGgnO1xuaW1wb3J0IHsgVXNlckNyZWRlbnRpYWxJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL3VzZXInO1xuaW1wb3J0IHsgRmlyZWJhc2VFcnJvciB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcbmltcG9ydCB7IFRhZ2dlZFdpdGhUb2tlblJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vbW9kZWwvaWRfdG9rZW4nO1xuaW1wb3J0IHsgU2lnbkluV2l0aElkcFJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwnO1xuaW1wb3J0IHsgRmVkZXJhdGVkQXV0aFByb3ZpZGVyIH0gZnJvbSAnLi9mZWRlcmF0ZWQnO1xuXG4vKipcbiAqIERlZmluZXMgdGhlIG9wdGlvbnMgZm9yIGluaXRpYWxpemluZyBhbiB7QGxpbmsgT0F1dGhDcmVkZW50aWFsfS5cbiAqXG4gKiBAcmVtYXJrc1xuICogRm9yIElEIHRva2VucyB3aXRoIG5vbmNlIGNsYWltLCB0aGUgcmF3IG5vbmNlIGhhcyB0byBhbHNvIGJlIHByb3ZpZGVkLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPQXV0aENyZWRlbnRpYWxPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBPQXV0aCBJRCB0b2tlbiB1c2VkIHRvIGluaXRpYWxpemUgdGhlIHtAbGluayBPQXV0aENyZWRlbnRpYWx9LlxuICAgKi9cbiAgaWRUb2tlbj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBPQXV0aCBhY2Nlc3MgdG9rZW4gdXNlZCB0byBpbml0aWFsaXplIHRoZSB7QGxpbmsgT0F1dGhDcmVkZW50aWFsfS5cbiAgICovXG4gIGFjY2Vzc1Rva2VuPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHJhdyBub25jZSBhc3NvY2lhdGVkIHdpdGggdGhlIElEIHRva2VuLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBJdCBpcyByZXF1aXJlZCB3aGVuIGFuIElEIHRva2VuIHdpdGggYSBub25jZSBmaWVsZCBpcyBwcm92aWRlZC4gVGhlIFNIQS0yNTYgaGFzaCBvZiB0aGVcbiAgICogcmF3IG5vbmNlIG11c3QgbWF0Y2ggdGhlIG5vbmNlIGZpZWxkIGluIHRoZSBJRCB0b2tlbi5cbiAgICovXG4gIHJhd05vbmNlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbW1vbiBjb2RlIHRvIGFsbCBPQXV0aCBwcm92aWRlcnMuIFRoaXMgaXMgc2VwYXJhdGUgZnJvbSB0aGVcbiAqIHtAbGluayBPQXV0aFByb3ZpZGVyfSBzbyB0aGF0IGNoaWxkIHByb3ZpZGVycyAobGlrZVxuICoge0BsaW5rIEdvb2dsZUF1dGhQcm92aWRlcn0pIGRvbid0IGluaGVyaXQgdGhlIGBjcmVkZW50aWFsYCBpbnN0YW5jZSBtZXRob2QuXG4gKiBJbnN0ZWFkLCB0aGV5IHJlbHkgb24gYSBzdGF0aWMgYGNyZWRlbnRpYWxgIG1ldGhvZC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VPQXV0aFByb3ZpZGVyXG4gIGV4dGVuZHMgRmVkZXJhdGVkQXV0aFByb3ZpZGVyXG4gIGltcGxlbWVudHMgQXV0aFByb3ZpZGVyXG57XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJpdmF0ZSBzY29wZXM6IHN0cmluZ1tdID0gW107XG5cbiAgLyoqXG4gICAqIEFkZCBhbiBPQXV0aCBzY29wZSB0byB0aGUgY3JlZGVudGlhbC5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIC0gUHJvdmlkZXIgT0F1dGggc2NvcGUgdG8gYWRkLlxuICAgKi9cbiAgYWRkU2NvcGUoc2NvcGU6IHN0cmluZyk6IEF1dGhQcm92aWRlciB7XG4gICAgLy8gSWYgbm90IGFscmVhZHkgYWRkZWQsIGFkZCBzY29wZSB0byBsaXN0LlxuICAgIGlmICghdGhpcy5zY29wZXMuaW5jbHVkZXMoc2NvcGUpKSB7XG4gICAgICB0aGlzLnNjb3Blcy5wdXNoKHNjb3BlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgbGlzdCBvZiBPQXV0aCBzY29wZXMuXG4gICAqL1xuICBnZXRTY29wZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5zY29wZXNdO1xuICB9XG59XG5cbi8qKlxuICogUHJvdmlkZXIgZm9yIGdlbmVyYXRpbmcgZ2VuZXJpYyB7QGxpbmsgT0F1dGhDcmVkZW50aWFsfS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgamF2YXNjcmlwdFxuICogLy8gU2lnbiBpbiB1c2luZyBhIHJlZGlyZWN0LlxuICogY29uc3QgcHJvdmlkZXIgPSBuZXcgT0F1dGhQcm92aWRlcignZ29vZ2xlLmNvbScpO1xuICogLy8gU3RhcnQgYSBzaWduIGluIHByb2Nlc3MgZm9yIGFuIHVuYXV0aGVudGljYXRlZCB1c2VyLlxuICogcHJvdmlkZXIuYWRkU2NvcGUoJ3Byb2ZpbGUnKTtcbiAqIHByb3ZpZGVyLmFkZFNjb3BlKCdlbWFpbCcpO1xuICogYXdhaXQgc2lnbkluV2l0aFJlZGlyZWN0KGF1dGgsIHByb3ZpZGVyKTtcbiAqIC8vIFRoaXMgd2lsbCB0cmlnZ2VyIGEgZnVsbCBwYWdlIHJlZGlyZWN0IGF3YXkgZnJvbSB5b3VyIGFwcFxuICpcbiAqIC8vIEFmdGVyIHJldHVybmluZyBmcm9tIHRoZSByZWRpcmVjdCB3aGVuIHlvdXIgYXBwIGluaXRpYWxpemVzIHlvdSBjYW4gb2J0YWluIHRoZSByZXN1bHRcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldFJlZGlyZWN0UmVzdWx0KGF1dGgpO1xuICogaWYgKHJlc3VsdCkge1xuICogICAvLyBUaGlzIGlzIHRoZSBzaWduZWQtaW4gdXNlclxuICogICBjb25zdCB1c2VyID0gcmVzdWx0LnVzZXI7XG4gKiAgIC8vIFRoaXMgZ2l2ZXMgeW91IGEgT0F1dGggQWNjZXNzIFRva2VuIGZvciB0aGUgcHJvdmlkZXIuXG4gKiAgIGNvbnN0IGNyZWRlbnRpYWwgPSBwcm92aWRlci5jcmVkZW50aWFsRnJvbVJlc3VsdChhdXRoLCByZXN1bHQpO1xuICogICBjb25zdCB0b2tlbiA9IGNyZWRlbnRpYWwuYWNjZXNzVG9rZW47XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgamF2YXNjcmlwdFxuICogLy8gU2lnbiBpbiB1c2luZyBhIHBvcHVwLlxuICogY29uc3QgcHJvdmlkZXIgPSBuZXcgT0F1dGhQcm92aWRlcignZ29vZ2xlLmNvbScpO1xuICogcHJvdmlkZXIuYWRkU2NvcGUoJ3Byb2ZpbGUnKTtcbiAqIHByb3ZpZGVyLmFkZFNjb3BlKCdlbWFpbCcpO1xuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgc2lnbkluV2l0aFBvcHVwKGF1dGgsIHByb3ZpZGVyKTtcbiAqXG4gKiAvLyBUaGUgc2lnbmVkLWluIHVzZXIgaW5mby5cbiAqIGNvbnN0IHVzZXIgPSByZXN1bHQudXNlcjtcbiAqIC8vIFRoaXMgZ2l2ZXMgeW91IGEgT0F1dGggQWNjZXNzIFRva2VuIGZvciB0aGUgcHJvdmlkZXIuXG4gKiBjb25zdCBjcmVkZW50aWFsID0gcHJvdmlkZXIuY3JlZGVudGlhbEZyb21SZXN1bHQoYXV0aCwgcmVzdWx0KTtcbiAqIGNvbnN0IHRva2VuID0gY3JlZGVudGlhbC5hY2Nlc3NUb2tlbjtcbiAqIGBgYFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgT0F1dGhQcm92aWRlciBleHRlbmRzIEJhc2VPQXV0aFByb3ZpZGVyIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4ge0BsaW5rIE9BdXRoQ3JlZGVudGlhbH0gZnJvbSBhIEpTT04gc3RyaW5nIG9yIGEgcGxhaW4gb2JqZWN0LlxuICAgKiBAcGFyYW0ganNvbiAtIEEgcGxhaW4gb2JqZWN0IG9yIGEgSlNPTiBzdHJpbmdcbiAgICovXG4gIHN0YXRpYyBjcmVkZW50aWFsRnJvbUpTT04oanNvbjogb2JqZWN0IHwgc3RyaW5nKTogT0F1dGhDcmVkZW50aWFsIHtcbiAgICBjb25zdCBvYmogPSB0eXBlb2YganNvbiA9PT0gJ3N0cmluZycgPyBKU09OLnBhcnNlKGpzb24pIDoganNvbjtcbiAgICBfYXNzZXJ0KFxuICAgICAgJ3Byb3ZpZGVySWQnIGluIG9iaiAmJiAnc2lnbkluTWV0aG9kJyBpbiBvYmosXG4gICAgICBBdXRoRXJyb3JDb2RlLkFSR1VNRU5UX0VSUk9SXG4gICAgKTtcbiAgICByZXR1cm4gT0F1dGhDcmVkZW50aWFsLl9mcm9tUGFyYW1zKG9iaik7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHtAbGluayBPQXV0aENyZWRlbnRpYWx9IGZyb20gYSBnZW5lcmljIE9BdXRoIHByb3ZpZGVyJ3MgYWNjZXNzIHRva2VuIG9yIElEIHRva2VuLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBUaGUgcmF3IG5vbmNlIGlzIHJlcXVpcmVkIHdoZW4gYW4gSUQgdG9rZW4gd2l0aCBhIG5vbmNlIGZpZWxkIGlzIHByb3ZpZGVkLiBUaGUgU0hBLTI1NiBoYXNoIG9mXG4gICAqIHRoZSByYXcgbm9uY2UgbXVzdCBtYXRjaCB0aGUgbm9uY2UgZmllbGQgaW4gdGhlIElEIHRva2VuLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBqYXZhc2NyaXB0XG4gICAqIC8vIGBnb29nbGVVc2VyYCBmcm9tIHRoZSBvbnN1Y2Nlc3MgR29vZ2xlIFNpZ24gSW4gY2FsbGJhY2suXG4gICAqIC8vIEluaXRpYWxpemUgYSBnZW5lcmF0ZSBPQXV0aCBwcm92aWRlciB3aXRoIGEgYGdvb2dsZS5jb21gIHByb3ZpZGVySWQuXG4gICAqIGNvbnN0IHByb3ZpZGVyID0gbmV3IE9BdXRoUHJvdmlkZXIoJ2dvb2dsZS5jb20nKTtcbiAgICogY29uc3QgY3JlZGVudGlhbCA9IHByb3ZpZGVyLmNyZWRlbnRpYWwoe1xuICAgKiAgIGlkVG9rZW46IGdvb2dsZVVzZXIuZ2V0QXV0aFJlc3BvbnNlKCkuaWRfdG9rZW4sXG4gICAqIH0pO1xuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBzaWduSW5XaXRoQ3JlZGVudGlhbChjcmVkZW50aWFsKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBFaXRoZXIgdGhlIG9wdGlvbnMgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIElEIHRva2VuLCBhY2Nlc3MgdG9rZW4gYW5kIHJhdyBub25jZVxuICAgKiBvciB0aGUgSUQgdG9rZW4gc3RyaW5nLlxuICAgKi9cbiAgY3JlZGVudGlhbChwYXJhbXM6IE9BdXRoQ3JlZGVudGlhbE9wdGlvbnMpOiBPQXV0aENyZWRlbnRpYWwge1xuICAgIHJldHVybiB0aGlzLl9jcmVkZW50aWFsKHsgLi4ucGFyYW1zLCBub25jZTogcGFyYW1zLnJhd05vbmNlIH0pO1xuICB9XG5cbiAgLyoqIEFuIGludGVybmFsIGNyZWRlbnRpYWwgbWV0aG9kIHRoYXQgYWNjZXB0cyBtb3JlIHBlcm1pc3NpdmUgb3B0aW9ucyAqL1xuICBwcml2YXRlIF9jcmVkZW50aWFsKFxuICAgIHBhcmFtczogT21pdDxPQXV0aENyZWRlbnRpYWxQYXJhbXMsICdzaWduSW5NZXRob2QnIHwgJ3Byb3ZpZGVySWQnPlxuICApOiBPQXV0aENyZWRlbnRpYWwge1xuICAgIF9hc3NlcnQocGFyYW1zLmlkVG9rZW4gfHwgcGFyYW1zLmFjY2Vzc1Rva2VuLCBBdXRoRXJyb3JDb2RlLkFSR1VNRU5UX0VSUk9SKTtcbiAgICAvLyBGb3IgT0F1dGhDcmVkZW50aWFsLCBzaWduIGluIG1ldGhvZCBpcyBzYW1lIGFzIHByb3ZpZGVySWQuXG4gICAgcmV0dXJuIE9BdXRoQ3JlZGVudGlhbC5fZnJvbVBhcmFtcyh7XG4gICAgICAuLi5wYXJhbXMsXG4gICAgICBwcm92aWRlcklkOiB0aGlzLnByb3ZpZGVySWQsXG4gICAgICBzaWduSW5NZXRob2Q6IHRoaXMucHJvdmlkZXJJZFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gZXh0cmFjdCB0aGUgdW5kZXJseWluZyB7QGxpbmsgT0F1dGhDcmVkZW50aWFsfSBmcm9tIGEge0BsaW5rIFVzZXJDcmVkZW50aWFsfS5cbiAgICpcbiAgICogQHBhcmFtIHVzZXJDcmVkZW50aWFsIC0gVGhlIHVzZXIgY3JlZGVudGlhbC5cbiAgICovXG4gIHN0YXRpYyBjcmVkZW50aWFsRnJvbVJlc3VsdChcbiAgICB1c2VyQ3JlZGVudGlhbDogVXNlckNyZWRlbnRpYWxcbiAgKTogT0F1dGhDcmVkZW50aWFsIHwgbnVsbCB7XG4gICAgcmV0dXJuIE9BdXRoUHJvdmlkZXIub2F1dGhDcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdChcbiAgICAgIHVzZXJDcmVkZW50aWFsIGFzIFVzZXJDcmVkZW50aWFsSW50ZXJuYWxcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiBVc2VkIHRvIGV4dHJhY3QgdGhlIHVuZGVybHlpbmcge0BsaW5rIE9BdXRoQ3JlZGVudGlhbH0gZnJvbSBhIHtAbGluayBBdXRoRXJyb3J9IHdoaWNoIHdhc1xuICAgKiB0aHJvd24gZHVyaW5nIGEgc2lnbi1pbiwgbGluaywgb3IgcmVhdXRoZW50aWNhdGUgb3BlcmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gdXNlckNyZWRlbnRpYWwgLSBUaGUgdXNlciBjcmVkZW50aWFsLlxuICAgKi9cbiAgc3RhdGljIGNyZWRlbnRpYWxGcm9tRXJyb3IoZXJyb3I6IEZpcmViYXNlRXJyb3IpOiBPQXV0aENyZWRlbnRpYWwgfCBudWxsIHtcbiAgICByZXR1cm4gT0F1dGhQcm92aWRlci5vYXV0aENyZWRlbnRpYWxGcm9tVGFnZ2VkT2JqZWN0KFxuICAgICAgKGVycm9yLmN1c3RvbURhdGEgfHwge30pIGFzIFRhZ2dlZFdpdGhUb2tlblJlc3BvbnNlXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIG9hdXRoQ3JlZGVudGlhbEZyb21UYWdnZWRPYmplY3Qoe1xuICAgIF90b2tlblJlc3BvbnNlOiB0b2tlblJlc3BvbnNlXG4gIH06IFRhZ2dlZFdpdGhUb2tlblJlc3BvbnNlKTogT0F1dGhDcmVkZW50aWFsIHwgbnVsbCB7XG4gICAgaWYgKCF0b2tlblJlc3BvbnNlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCB7XG4gICAgICBvYXV0aElkVG9rZW4sXG4gICAgICBvYXV0aEFjY2Vzc1Rva2VuLFxuICAgICAgb2F1dGhUb2tlblNlY3JldCxcbiAgICAgIHBlbmRpbmdUb2tlbixcbiAgICAgIG5vbmNlLFxuICAgICAgcHJvdmlkZXJJZFxuICAgIH0gPSB0b2tlblJlc3BvbnNlIGFzIFNpZ25JbldpdGhJZHBSZXNwb25zZTtcbiAgICBpZiAoXG4gICAgICAhb2F1dGhBY2Nlc3NUb2tlbiAmJlxuICAgICAgIW9hdXRoVG9rZW5TZWNyZXQgJiZcbiAgICAgICFvYXV0aElkVG9rZW4gJiZcbiAgICAgICFwZW5kaW5nVG9rZW5cbiAgICApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICghcHJvdmlkZXJJZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBuZXcgT0F1dGhQcm92aWRlcihwcm92aWRlcklkKS5fY3JlZGVudGlhbCh7XG4gICAgICAgIGlkVG9rZW46IG9hdXRoSWRUb2tlbixcbiAgICAgICAgYWNjZXNzVG9rZW46IG9hdXRoQWNjZXNzVG9rZW4sXG4gICAgICAgIG5vbmNlLFxuICAgICAgICBwZW5kaW5nVG9rZW5cbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IFVzZXJDcmVkZW50aWFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcbmltcG9ydCB7IEZpcmViYXNlRXJyb3IgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5cbmltcG9ydCB7IFRhZ2dlZFdpdGhUb2tlblJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vbW9kZWwvaWRfdG9rZW4nO1xuaW1wb3J0IHsgVXNlckNyZWRlbnRpYWxJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL3VzZXInO1xuaW1wb3J0IHsgT0F1dGhDcmVkZW50aWFsIH0gZnJvbSAnLi4vY3JlZGVudGlhbHMvb2F1dGgnO1xuaW1wb3J0IHsgQmFzZU9BdXRoUHJvdmlkZXIgfSBmcm9tICcuL29hdXRoJztcbmltcG9ydCB7IFByb3ZpZGVySWQsIFNpZ25Jbk1ldGhvZCB9IGZyb20gJy4uLy4uL21vZGVsL2VudW1zJztcblxuLyoqXG4gKiBQcm92aWRlciBmb3IgZ2VuZXJhdGluZyBhbiB7QGxpbmsgT0F1dGhDcmVkZW50aWFsfSBmb3Ige0BsaW5rIFByb3ZpZGVySWR9LkZBQ0VCT09LLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiAvLyBTaWduIGluIHVzaW5nIGEgcmVkaXJlY3QuXG4gKiBjb25zdCBwcm92aWRlciA9IG5ldyBGYWNlYm9va0F1dGhQcm92aWRlcigpO1xuICogLy8gU3RhcnQgYSBzaWduIGluIHByb2Nlc3MgZm9yIGFuIHVuYXV0aGVudGljYXRlZCB1c2VyLlxuICogcHJvdmlkZXIuYWRkU2NvcGUoJ3VzZXJfYmlydGhkYXknKTtcbiAqIGF3YWl0IHNpZ25JbldpdGhSZWRpcmVjdChhdXRoLCBwcm92aWRlcik7XG4gKiAvLyBUaGlzIHdpbGwgdHJpZ2dlciBhIGZ1bGwgcGFnZSByZWRpcmVjdCBhd2F5IGZyb20geW91ciBhcHBcbiAqXG4gKiAvLyBBZnRlciByZXR1cm5pbmcgZnJvbSB0aGUgcmVkaXJlY3Qgd2hlbiB5b3VyIGFwcCBpbml0aWFsaXplcyB5b3UgY2FuIG9idGFpbiB0aGUgcmVzdWx0XG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRSZWRpcmVjdFJlc3VsdChhdXRoKTtcbiAqIGlmIChyZXN1bHQpIHtcbiAqICAgLy8gVGhpcyBpcyB0aGUgc2lnbmVkLWluIHVzZXJcbiAqICAgY29uc3QgdXNlciA9IHJlc3VsdC51c2VyO1xuICogICAvLyBUaGlzIGdpdmVzIHlvdSBhIEZhY2Vib29rIEFjY2VzcyBUb2tlbi5cbiAqICAgY29uc3QgY3JlZGVudGlhbCA9IEZhY2Vib29rQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWxGcm9tUmVzdWx0KHJlc3VsdCk7XG4gKiAgIGNvbnN0IHRva2VuID0gY3JlZGVudGlhbC5hY2Nlc3NUb2tlbjtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiAvLyBTaWduIGluIHVzaW5nIGEgcG9wdXAuXG4gKiBjb25zdCBwcm92aWRlciA9IG5ldyBGYWNlYm9va0F1dGhQcm92aWRlcigpO1xuICogcHJvdmlkZXIuYWRkU2NvcGUoJ3VzZXJfYmlydGhkYXknKTtcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpZ25JbldpdGhQb3B1cChhdXRoLCBwcm92aWRlcik7XG4gKlxuICogLy8gVGhlIHNpZ25lZC1pbiB1c2VyIGluZm8uXG4gKiBjb25zdCB1c2VyID0gcmVzdWx0LnVzZXI7XG4gKiAvLyBUaGlzIGdpdmVzIHlvdSBhIEZhY2Vib29rIEFjY2VzcyBUb2tlbi5cbiAqIGNvbnN0IGNyZWRlbnRpYWwgPSBGYWNlYm9va0F1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVJlc3VsdChyZXN1bHQpO1xuICogY29uc3QgdG9rZW4gPSBjcmVkZW50aWFsLmFjY2Vzc1Rva2VuO1xuICogYGBgXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgRmFjZWJvb2tBdXRoUHJvdmlkZXIgZXh0ZW5kcyBCYXNlT0F1dGhQcm92aWRlciB7XG4gIC8qKiBBbHdheXMgc2V0IHRvIHtAbGluayBTaWduSW5NZXRob2R9LkZBQ0VCT09LLiAqL1xuICBzdGF0aWMgcmVhZG9ubHkgRkFDRUJPT0tfU0lHTl9JTl9NRVRIT0Q6ICdmYWNlYm9vay5jb20nID1cbiAgICBTaWduSW5NZXRob2QuRkFDRUJPT0s7XG4gIC8qKiBBbHdheXMgc2V0IHRvIHtAbGluayBQcm92aWRlcklkfS5GQUNFQk9PSy4gKi9cbiAgc3RhdGljIHJlYWRvbmx5IFBST1ZJREVSX0lEOiAnZmFjZWJvb2suY29tJyA9IFByb3ZpZGVySWQuRkFDRUJPT0s7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoUHJvdmlkZXJJZC5GQUNFQk9PSyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGNyZWRlbnRpYWwgZm9yIEZhY2Vib29rLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBqYXZhc2NyaXB0XG4gICAqIC8vIGBldmVudGAgZnJvbSB0aGUgRmFjZWJvb2sgYXV0aC5hdXRoUmVzcG9uc2VDaGFuZ2UgY2FsbGJhY2suXG4gICAqIGNvbnN0IGNyZWRlbnRpYWwgPSBGYWNlYm9va0F1dGhQcm92aWRlci5jcmVkZW50aWFsKGV2ZW50LmF1dGhSZXNwb25zZS5hY2Nlc3NUb2tlbik7XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpZ25JbldpdGhDcmVkZW50aWFsKGNyZWRlbnRpYWwpO1xuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIGFjY2Vzc1Rva2VuIC0gRmFjZWJvb2sgYWNjZXNzIHRva2VuLlxuICAgKi9cbiAgc3RhdGljIGNyZWRlbnRpYWwoYWNjZXNzVG9rZW46IHN0cmluZyk6IE9BdXRoQ3JlZGVudGlhbCB7XG4gICAgcmV0dXJuIE9BdXRoQ3JlZGVudGlhbC5fZnJvbVBhcmFtcyh7XG4gICAgICBwcm92aWRlcklkOiBGYWNlYm9va0F1dGhQcm92aWRlci5QUk9WSURFUl9JRCxcbiAgICAgIHNpZ25Jbk1ldGhvZDogRmFjZWJvb2tBdXRoUHJvdmlkZXIuRkFDRUJPT0tfU0lHTl9JTl9NRVRIT0QsXG4gICAgICBhY2Nlc3NUb2tlblxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gZXh0cmFjdCB0aGUgdW5kZXJseWluZyB7QGxpbmsgT0F1dGhDcmVkZW50aWFsfSBmcm9tIGEge0BsaW5rIFVzZXJDcmVkZW50aWFsfS5cbiAgICpcbiAgICogQHBhcmFtIHVzZXJDcmVkZW50aWFsIC0gVGhlIHVzZXIgY3JlZGVudGlhbC5cbiAgICovXG4gIHN0YXRpYyBjcmVkZW50aWFsRnJvbVJlc3VsdChcbiAgICB1c2VyQ3JlZGVudGlhbDogVXNlckNyZWRlbnRpYWxcbiAgKTogT0F1dGhDcmVkZW50aWFsIHwgbnVsbCB7XG4gICAgcmV0dXJuIEZhY2Vib29rQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWxGcm9tVGFnZ2VkT2JqZWN0KFxuICAgICAgdXNlckNyZWRlbnRpYWwgYXMgVXNlckNyZWRlbnRpYWxJbnRlcm5hbFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCB0byBleHRyYWN0IHRoZSB1bmRlcmx5aW5nIHtAbGluayBPQXV0aENyZWRlbnRpYWx9IGZyb20gYSB7QGxpbmsgQXV0aEVycm9yfSB3aGljaCB3YXNcbiAgICogdGhyb3duIGR1cmluZyBhIHNpZ24taW4sIGxpbmssIG9yIHJlYXV0aGVudGljYXRlIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHVzZXJDcmVkZW50aWFsIC0gVGhlIHVzZXIgY3JlZGVudGlhbC5cbiAgICovXG4gIHN0YXRpYyBjcmVkZW50aWFsRnJvbUVycm9yKGVycm9yOiBGaXJlYmFzZUVycm9yKTogT0F1dGhDcmVkZW50aWFsIHwgbnVsbCB7XG4gICAgcmV0dXJuIEZhY2Vib29rQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWxGcm9tVGFnZ2VkT2JqZWN0KFxuICAgICAgKGVycm9yLmN1c3RvbURhdGEgfHwge30pIGFzIFRhZ2dlZFdpdGhUb2tlblJlc3BvbnNlXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWRlbnRpYWxGcm9tVGFnZ2VkT2JqZWN0KHtcbiAgICBfdG9rZW5SZXNwb25zZTogdG9rZW5SZXNwb25zZVxuICB9OiBUYWdnZWRXaXRoVG9rZW5SZXNwb25zZSk6IE9BdXRoQ3JlZGVudGlhbCB8IG51bGwge1xuICAgIGlmICghdG9rZW5SZXNwb25zZSB8fCAhKCdvYXV0aEFjY2Vzc1Rva2VuJyBpbiB0b2tlblJlc3BvbnNlKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKCF0b2tlblJlc3BvbnNlLm9hdXRoQWNjZXNzVG9rZW4pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gRmFjZWJvb2tBdXRoUHJvdmlkZXIuY3JlZGVudGlhbCh0b2tlblJlc3BvbnNlLm9hdXRoQWNjZXNzVG9rZW4pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgVXNlckNyZWRlbnRpYWwgfSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuaW1wb3J0IHsgRmlyZWJhc2VFcnJvciB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcblxuaW1wb3J0IHsgU2lnbkluV2l0aElkcFJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vYXBpL2F1dGhlbnRpY2F0aW9uL2lkcCc7XG5pbXBvcnQgeyBUYWdnZWRXaXRoVG9rZW5SZXNwb25zZSB9IGZyb20gJy4uLy4uL21vZGVsL2lkX3Rva2VuJztcbmltcG9ydCB7IFVzZXJDcmVkZW50aWFsSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC91c2VyJztcbmltcG9ydCB7IE9BdXRoQ3JlZGVudGlhbCB9IGZyb20gJy4uL2NyZWRlbnRpYWxzL29hdXRoJztcbmltcG9ydCB7IEJhc2VPQXV0aFByb3ZpZGVyIH0gZnJvbSAnLi9vYXV0aCc7XG5pbXBvcnQgeyBQcm92aWRlcklkLCBTaWduSW5NZXRob2QgfSBmcm9tICcuLi8uLi9tb2RlbC9lbnVtcyc7XG5cbi8qKlxuICogUHJvdmlkZXIgZm9yIGdlbmVyYXRpbmcgYW4gYW4ge0BsaW5rIE9BdXRoQ3JlZGVudGlhbH0gZm9yIHtAbGluayBQcm92aWRlcklkfS5HT09HTEUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGphdmFzY3JpcHRcbiAqIC8vIFNpZ24gaW4gdXNpbmcgYSByZWRpcmVjdC5cbiAqIGNvbnN0IHByb3ZpZGVyID0gbmV3IEdvb2dsZUF1dGhQcm92aWRlcigpO1xuICogLy8gU3RhcnQgYSBzaWduIGluIHByb2Nlc3MgZm9yIGFuIHVuYXV0aGVudGljYXRlZCB1c2VyLlxuICogcHJvdmlkZXIuYWRkU2NvcGUoJ3Byb2ZpbGUnKTtcbiAqIHByb3ZpZGVyLmFkZFNjb3BlKCdlbWFpbCcpO1xuICogYXdhaXQgc2lnbkluV2l0aFJlZGlyZWN0KGF1dGgsIHByb3ZpZGVyKTtcbiAqIC8vIFRoaXMgd2lsbCB0cmlnZ2VyIGEgZnVsbCBwYWdlIHJlZGlyZWN0IGF3YXkgZnJvbSB5b3VyIGFwcFxuICpcbiAqIC8vIEFmdGVyIHJldHVybmluZyBmcm9tIHRoZSByZWRpcmVjdCB3aGVuIHlvdXIgYXBwIGluaXRpYWxpemVzIHlvdSBjYW4gb2J0YWluIHRoZSByZXN1bHRcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldFJlZGlyZWN0UmVzdWx0KGF1dGgpO1xuICogaWYgKHJlc3VsdCkge1xuICogICAvLyBUaGlzIGlzIHRoZSBzaWduZWQtaW4gdXNlclxuICogICBjb25zdCB1c2VyID0gcmVzdWx0LnVzZXI7XG4gKiAgIC8vIFRoaXMgZ2l2ZXMgeW91IGEgR29vZ2xlIEFjY2VzcyBUb2tlbi5cbiAqICAgY29uc3QgY3JlZGVudGlhbCA9IEdvb2dsZUF1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVJlc3VsdChyZXN1bHQpO1xuICogICBjb25zdCB0b2tlbiA9IGNyZWRlbnRpYWwuYWNjZXNzVG9rZW47XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgamF2YXNjcmlwdFxuICogLy8gU2lnbiBpbiB1c2luZyBhIHBvcHVwLlxuICogY29uc3QgcHJvdmlkZXIgPSBuZXcgR29vZ2xlQXV0aFByb3ZpZGVyKCk7XG4gKiBwcm92aWRlci5hZGRTY29wZSgncHJvZmlsZScpO1xuICogcHJvdmlkZXIuYWRkU2NvcGUoJ2VtYWlsJyk7XG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBzaWduSW5XaXRoUG9wdXAoYXV0aCwgcHJvdmlkZXIpO1xuICpcbiAqIC8vIFRoZSBzaWduZWQtaW4gdXNlciBpbmZvLlxuICogY29uc3QgdXNlciA9IHJlc3VsdC51c2VyO1xuICogLy8gVGhpcyBnaXZlcyB5b3UgYSBHb29nbGUgQWNjZXNzIFRva2VuLlxuICogY29uc3QgY3JlZGVudGlhbCA9IEdvb2dsZUF1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVJlc3VsdChyZXN1bHQpO1xuICogY29uc3QgdG9rZW4gPSBjcmVkZW50aWFsLmFjY2Vzc1Rva2VuO1xuICogYGBgXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgR29vZ2xlQXV0aFByb3ZpZGVyIGV4dGVuZHMgQmFzZU9BdXRoUHJvdmlkZXIge1xuICAvKiogQWx3YXlzIHNldCB0byB7QGxpbmsgU2lnbkluTWV0aG9kfS5HT09HTEUuICovXG4gIHN0YXRpYyByZWFkb25seSBHT09HTEVfU0lHTl9JTl9NRVRIT0Q6ICdnb29nbGUuY29tJyA9IFNpZ25Jbk1ldGhvZC5HT09HTEU7XG4gIC8qKiBBbHdheXMgc2V0IHRvIHtAbGluayBQcm92aWRlcklkfS5HT09HTEUuICovXG4gIHN0YXRpYyByZWFkb25seSBQUk9WSURFUl9JRDogJ2dvb2dsZS5jb20nID0gUHJvdmlkZXJJZC5HT09HTEU7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoUHJvdmlkZXJJZC5HT09HTEUpO1xuICAgIHRoaXMuYWRkU2NvcGUoJ3Byb2ZpbGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgY3JlZGVudGlhbCBmb3IgR29vZ2xlLiBBdCBsZWFzdCBvbmUgb2YgSUQgdG9rZW4gYW5kIGFjY2VzcyB0b2tlbiBpcyByZXF1aXJlZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgamF2YXNjcmlwdFxuICAgKiAvLyBcXGBnb29nbGVVc2VyXFxgIGZyb20gdGhlIG9uc3VjY2VzcyBHb29nbGUgU2lnbiBJbiBjYWxsYmFjay5cbiAgICogY29uc3QgY3JlZGVudGlhbCA9IEdvb2dsZUF1dGhQcm92aWRlci5jcmVkZW50aWFsKGdvb2dsZVVzZXIuZ2V0QXV0aFJlc3BvbnNlKCkuaWRfdG9rZW4pO1xuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBzaWduSW5XaXRoQ3JlZGVudGlhbChjcmVkZW50aWFsKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBpZFRva2VuIC0gR29vZ2xlIElEIHRva2VuLlxuICAgKiBAcGFyYW0gYWNjZXNzVG9rZW4gLSBHb29nbGUgYWNjZXNzIHRva2VuLlxuICAgKi9cbiAgc3RhdGljIGNyZWRlbnRpYWwoXG4gICAgaWRUb2tlbj86IHN0cmluZyB8IG51bGwsXG4gICAgYWNjZXNzVG9rZW4/OiBzdHJpbmcgfCBudWxsXG4gICk6IE9BdXRoQ3JlZGVudGlhbCB7XG4gICAgcmV0dXJuIE9BdXRoQ3JlZGVudGlhbC5fZnJvbVBhcmFtcyh7XG4gICAgICBwcm92aWRlcklkOiBHb29nbGVBdXRoUHJvdmlkZXIuUFJPVklERVJfSUQsXG4gICAgICBzaWduSW5NZXRob2Q6IEdvb2dsZUF1dGhQcm92aWRlci5HT09HTEVfU0lHTl9JTl9NRVRIT0QsXG4gICAgICBpZFRva2VuLFxuICAgICAgYWNjZXNzVG9rZW5cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIHRvIGV4dHJhY3QgdGhlIHVuZGVybHlpbmcge0BsaW5rIE9BdXRoQ3JlZGVudGlhbH0gZnJvbSBhIHtAbGluayBVc2VyQ3JlZGVudGlhbH0uXG4gICAqXG4gICAqIEBwYXJhbSB1c2VyQ3JlZGVudGlhbCAtIFRoZSB1c2VyIGNyZWRlbnRpYWwuXG4gICAqL1xuICBzdGF0aWMgY3JlZGVudGlhbEZyb21SZXN1bHQoXG4gICAgdXNlckNyZWRlbnRpYWw6IFVzZXJDcmVkZW50aWFsXG4gICk6IE9BdXRoQ3JlZGVudGlhbCB8IG51bGwge1xuICAgIHJldHVybiBHb29nbGVBdXRoUHJvdmlkZXIuY3JlZGVudGlhbEZyb21UYWdnZWRPYmplY3QoXG4gICAgICB1c2VyQ3JlZGVudGlhbCBhcyBVc2VyQ3JlZGVudGlhbEludGVybmFsXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogVXNlZCB0byBleHRyYWN0IHRoZSB1bmRlcmx5aW5nIHtAbGluayBPQXV0aENyZWRlbnRpYWx9IGZyb20gYSB7QGxpbmsgQXV0aEVycm9yfSB3aGljaCB3YXNcbiAgICogdGhyb3duIGR1cmluZyBhIHNpZ24taW4sIGxpbmssIG9yIHJlYXV0aGVudGljYXRlIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHVzZXJDcmVkZW50aWFsIC0gVGhlIHVzZXIgY3JlZGVudGlhbC5cbiAgICovXG4gIHN0YXRpYyBjcmVkZW50aWFsRnJvbUVycm9yKGVycm9yOiBGaXJlYmFzZUVycm9yKTogT0F1dGhDcmVkZW50aWFsIHwgbnVsbCB7XG4gICAgcmV0dXJuIEdvb2dsZUF1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdChcbiAgICAgIChlcnJvci5jdXN0b21EYXRhIHx8IHt9KSBhcyBUYWdnZWRXaXRoVG9rZW5SZXNwb25zZVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdCh7XG4gICAgX3Rva2VuUmVzcG9uc2U6IHRva2VuUmVzcG9uc2VcbiAgfTogVGFnZ2VkV2l0aFRva2VuUmVzcG9uc2UpOiBPQXV0aENyZWRlbnRpYWwgfCBudWxsIHtcbiAgICBpZiAoIXRva2VuUmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHsgb2F1dGhJZFRva2VuLCBvYXV0aEFjY2Vzc1Rva2VuIH0gPVxuICAgICAgdG9rZW5SZXNwb25zZSBhcyBTaWduSW5XaXRoSWRwUmVzcG9uc2U7XG4gICAgaWYgKCFvYXV0aElkVG9rZW4gJiYgIW9hdXRoQWNjZXNzVG9rZW4pIHtcbiAgICAgIC8vIFRoaXMgY291bGQgYmUgYW4gb2F1dGggMSBjcmVkZW50aWFsIG9yIGEgcGhvbmUgY3JlZGVudGlhbFxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBHb29nbGVBdXRoUHJvdmlkZXIuY3JlZGVudGlhbChvYXV0aElkVG9rZW4sIG9hdXRoQWNjZXNzVG9rZW4pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgVXNlckNyZWRlbnRpYWwgfSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuaW1wb3J0IHsgRmlyZWJhc2VFcnJvciB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcblxuaW1wb3J0IHsgVGFnZ2VkV2l0aFRva2VuUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9tb2RlbC9pZF90b2tlbic7XG5pbXBvcnQgeyBVc2VyQ3JlZGVudGlhbEludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvdXNlcic7XG5pbXBvcnQgeyBPQXV0aENyZWRlbnRpYWwgfSBmcm9tICcuLi9jcmVkZW50aWFscy9vYXV0aCc7XG5pbXBvcnQgeyBCYXNlT0F1dGhQcm92aWRlciB9IGZyb20gJy4vb2F1dGgnO1xuaW1wb3J0IHsgUHJvdmlkZXJJZCwgU2lnbkluTWV0aG9kIH0gZnJvbSAnLi4vLi4vbW9kZWwvZW51bXMnO1xuXG4vKipcbiAqIFByb3ZpZGVyIGZvciBnZW5lcmF0aW5nIGFuIHtAbGluayBPQXV0aENyZWRlbnRpYWx9IGZvciB7QGxpbmsgUHJvdmlkZXJJZH0uR0lUSFVCLlxuICpcbiAqIEByZW1hcmtzXG4gKiBHaXRIdWIgcmVxdWlyZXMgYW4gT0F1dGggMi4wIHJlZGlyZWN0LCBzbyB5b3UgY2FuIGVpdGhlciBoYW5kbGUgdGhlIHJlZGlyZWN0IGRpcmVjdGx5LCBvciB1c2VcbiAqIHRoZSB7QGxpbmsgc2lnbkluV2l0aFBvcHVwfSBoYW5kbGVyOlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiAvLyBTaWduIGluIHVzaW5nIGEgcmVkaXJlY3QuXG4gKiBjb25zdCBwcm92aWRlciA9IG5ldyBHaXRodWJBdXRoUHJvdmlkZXIoKTtcbiAqIC8vIFN0YXJ0IGEgc2lnbiBpbiBwcm9jZXNzIGZvciBhbiB1bmF1dGhlbnRpY2F0ZWQgdXNlci5cbiAqIHByb3ZpZGVyLmFkZFNjb3BlKCdyZXBvJyk7XG4gKiBhd2FpdCBzaWduSW5XaXRoUmVkaXJlY3QoYXV0aCwgcHJvdmlkZXIpO1xuICogLy8gVGhpcyB3aWxsIHRyaWdnZXIgYSBmdWxsIHBhZ2UgcmVkaXJlY3QgYXdheSBmcm9tIHlvdXIgYXBwXG4gKlxuICogLy8gQWZ0ZXIgcmV0dXJuaW5nIGZyb20gdGhlIHJlZGlyZWN0IHdoZW4geW91ciBhcHAgaW5pdGlhbGl6ZXMgeW91IGNhbiBvYnRhaW4gdGhlIHJlc3VsdFxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0UmVkaXJlY3RSZXN1bHQoYXV0aCk7XG4gKiBpZiAocmVzdWx0KSB7XG4gKiAgIC8vIFRoaXMgaXMgdGhlIHNpZ25lZC1pbiB1c2VyXG4gKiAgIGNvbnN0IHVzZXIgPSByZXN1bHQudXNlcjtcbiAqICAgLy8gVGhpcyBnaXZlcyB5b3UgYSBHaXRodWIgQWNjZXNzIFRva2VuLlxuICogICBjb25zdCBjcmVkZW50aWFsID0gR2l0aHViQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWxGcm9tUmVzdWx0KHJlc3VsdCk7XG4gKiAgIGNvbnN0IHRva2VuID0gY3JlZGVudGlhbC5hY2Nlc3NUb2tlbjtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiAvLyBTaWduIGluIHVzaW5nIGEgcG9wdXAuXG4gKiBjb25zdCBwcm92aWRlciA9IG5ldyBHaXRodWJBdXRoUHJvdmlkZXIoKTtcbiAqIHByb3ZpZGVyLmFkZFNjb3BlKCdyZXBvJyk7XG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBzaWduSW5XaXRoUG9wdXAoYXV0aCwgcHJvdmlkZXIpO1xuICpcbiAqIC8vIFRoZSBzaWduZWQtaW4gdXNlciBpbmZvLlxuICogY29uc3QgdXNlciA9IHJlc3VsdC51c2VyO1xuICogLy8gVGhpcyBnaXZlcyB5b3UgYSBHaXRodWIgQWNjZXNzIFRva2VuLlxuICogY29uc3QgY3JlZGVudGlhbCA9IEdpdGh1YkF1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVJlc3VsdChyZXN1bHQpO1xuICogY29uc3QgdG9rZW4gPSBjcmVkZW50aWFsLmFjY2Vzc1Rva2VuO1xuICogYGBgXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBHaXRodWJBdXRoUHJvdmlkZXIgZXh0ZW5kcyBCYXNlT0F1dGhQcm92aWRlciB7XG4gIC8qKiBBbHdheXMgc2V0IHRvIHtAbGluayBTaWduSW5NZXRob2R9LkdJVEhVQi4gKi9cbiAgc3RhdGljIHJlYWRvbmx5IEdJVEhVQl9TSUdOX0lOX01FVEhPRDogJ2dpdGh1Yi5jb20nID0gU2lnbkluTWV0aG9kLkdJVEhVQjtcbiAgLyoqIEFsd2F5cyBzZXQgdG8ge0BsaW5rIFByb3ZpZGVySWR9LkdJVEhVQi4gKi9cbiAgc3RhdGljIHJlYWRvbmx5IFBST1ZJREVSX0lEOiAnZ2l0aHViLmNvbScgPSBQcm92aWRlcklkLkdJVEhVQjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihQcm92aWRlcklkLkdJVEhVQik7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGNyZWRlbnRpYWwgZm9yIEdpdGh1Yi5cbiAgICpcbiAgICogQHBhcmFtIGFjY2Vzc1Rva2VuIC0gR2l0aHViIGFjY2VzcyB0b2tlbi5cbiAgICovXG4gIHN0YXRpYyBjcmVkZW50aWFsKGFjY2Vzc1Rva2VuOiBzdHJpbmcpOiBPQXV0aENyZWRlbnRpYWwge1xuICAgIHJldHVybiBPQXV0aENyZWRlbnRpYWwuX2Zyb21QYXJhbXMoe1xuICAgICAgcHJvdmlkZXJJZDogR2l0aHViQXV0aFByb3ZpZGVyLlBST1ZJREVSX0lELFxuICAgICAgc2lnbkluTWV0aG9kOiBHaXRodWJBdXRoUHJvdmlkZXIuR0lUSFVCX1NJR05fSU5fTUVUSE9ELFxuICAgICAgYWNjZXNzVG9rZW5cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIHRvIGV4dHJhY3QgdGhlIHVuZGVybHlpbmcge0BsaW5rIE9BdXRoQ3JlZGVudGlhbH0gZnJvbSBhIHtAbGluayBVc2VyQ3JlZGVudGlhbH0uXG4gICAqXG4gICAqIEBwYXJhbSB1c2VyQ3JlZGVudGlhbCAtIFRoZSB1c2VyIGNyZWRlbnRpYWwuXG4gICAqL1xuICBzdGF0aWMgY3JlZGVudGlhbEZyb21SZXN1bHQoXG4gICAgdXNlckNyZWRlbnRpYWw6IFVzZXJDcmVkZW50aWFsXG4gICk6IE9BdXRoQ3JlZGVudGlhbCB8IG51bGwge1xuICAgIHJldHVybiBHaXRodWJBdXRoUHJvdmlkZXIuY3JlZGVudGlhbEZyb21UYWdnZWRPYmplY3QoXG4gICAgICB1c2VyQ3JlZGVudGlhbCBhcyBVc2VyQ3JlZGVudGlhbEludGVybmFsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIHRvIGV4dHJhY3QgdGhlIHVuZGVybHlpbmcge0BsaW5rIE9BdXRoQ3JlZGVudGlhbH0gZnJvbSBhIHtAbGluayBBdXRoRXJyb3J9IHdoaWNoIHdhc1xuICAgKiB0aHJvd24gZHVyaW5nIGEgc2lnbi1pbiwgbGluaywgb3IgcmVhdXRoZW50aWNhdGUgb3BlcmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gdXNlckNyZWRlbnRpYWwgLSBUaGUgdXNlciBjcmVkZW50aWFsLlxuICAgKi9cbiAgc3RhdGljIGNyZWRlbnRpYWxGcm9tRXJyb3IoZXJyb3I6IEZpcmViYXNlRXJyb3IpOiBPQXV0aENyZWRlbnRpYWwgfCBudWxsIHtcbiAgICByZXR1cm4gR2l0aHViQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWxGcm9tVGFnZ2VkT2JqZWN0KFxuICAgICAgKGVycm9yLmN1c3RvbURhdGEgfHwge30pIGFzIFRhZ2dlZFdpdGhUb2tlblJlc3BvbnNlXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWRlbnRpYWxGcm9tVGFnZ2VkT2JqZWN0KHtcbiAgICBfdG9rZW5SZXNwb25zZTogdG9rZW5SZXNwb25zZVxuICB9OiBUYWdnZWRXaXRoVG9rZW5SZXNwb25zZSk6IE9BdXRoQ3JlZGVudGlhbCB8IG51bGwge1xuICAgIGlmICghdG9rZW5SZXNwb25zZSB8fCAhKCdvYXV0aEFjY2Vzc1Rva2VuJyBpbiB0b2tlblJlc3BvbnNlKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKCF0b2tlblJlc3BvbnNlLm9hdXRoQWNjZXNzVG9rZW4pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gR2l0aHViQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWwodG9rZW5SZXNwb25zZS5vYXV0aEFjY2Vzc1Rva2VuKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgU0FNTCBjcmVkZW50aWFscyByZXR1cm5lZCBieSBhbiB7QGxpbmsgU0FNTEF1dGhQcm92aWRlcn0uXG4gKlxuICogQHB1YmxpY1xuICovXG5cbmltcG9ydCB7XG4gIHNpZ25JbldpdGhJZHAsXG4gIFNpZ25JbldpdGhJZHBSZXF1ZXN0XG59IGZyb20gJy4uLy4uL2FwaS9hdXRoZW50aWNhdGlvbi9pZHAnO1xuaW1wb3J0IHsgQXV0aEludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvYXV0aCc7XG5pbXBvcnQgeyBJZFRva2VuUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9tb2RlbC9pZF90b2tlbic7XG5pbXBvcnQgeyBBdXRoQ3JlZGVudGlhbCB9IGZyb20gJy4vYXV0aF9jcmVkZW50aWFsJztcblxuY29uc3QgSURQX1JFUVVFU1RfVVJJID0gJ2h0dHA6Ly9sb2NhbGhvc3QnO1xuXG4vKipcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIFNBTUxBdXRoQ3JlZGVudGlhbCBleHRlbmRzIEF1dGhDcmVkZW50aWFsIHtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgIHByb3ZpZGVySWQ6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBlbmRpbmdUb2tlbjogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKHByb3ZpZGVySWQsIHByb3ZpZGVySWQpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfZ2V0SWRUb2tlblJlc3BvbnNlKGF1dGg6IEF1dGhJbnRlcm5hbCk6IFByb21pc2U8SWRUb2tlblJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuYnVpbGRSZXF1ZXN0KCk7XG4gICAgcmV0dXJuIHNpZ25JbldpdGhJZHAoYXV0aCwgcmVxdWVzdCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9saW5rVG9JZFRva2VuKFxuICAgIGF1dGg6IEF1dGhJbnRlcm5hbCxcbiAgICBpZFRva2VuOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxJZFRva2VuUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5idWlsZFJlcXVlc3QoKTtcbiAgICByZXF1ZXN0LmlkVG9rZW4gPSBpZFRva2VuO1xuICAgIHJldHVybiBzaWduSW5XaXRoSWRwKGF1dGgsIHJlcXVlc3QpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfZ2V0UmVhdXRoZW50aWNhdGlvblJlc29sdmVyKGF1dGg6IEF1dGhJbnRlcm5hbCk6IFByb21pc2U8SWRUb2tlblJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuYnVpbGRSZXF1ZXN0KCk7XG4gICAgcmVxdWVzdC5hdXRvQ3JlYXRlID0gZmFsc2U7XG4gICAgcmV0dXJuIHNpZ25JbldpdGhJZHAoYXV0aCwgcmVxdWVzdCk7XG4gIH1cblxuICAvKioge0Bpbmhlcml0ZG9jIEF1dGhDcmVkZW50aWFsLnRvSlNPTn0gICovXG4gIHRvSlNPTigpOiBvYmplY3Qge1xuICAgIHJldHVybiB7XG4gICAgICBzaWduSW5NZXRob2Q6IHRoaXMuc2lnbkluTWV0aG9kLFxuICAgICAgcHJvdmlkZXJJZDogdGhpcy5wcm92aWRlcklkLFxuICAgICAgcGVuZGluZ1Rva2VuOiB0aGlzLnBlbmRpbmdUb2tlblxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU3RhdGljIG1ldGhvZCB0byBkZXNlcmlhbGl6ZSBhIEpTT04gcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0IGludG8gYW5cbiAgICoge0BsaW5rICBBdXRoQ3JlZGVudGlhbH0uXG4gICAqXG4gICAqIEBwYXJhbSBqc29uIC0gSW5wdXQgY2FuIGJlIGVpdGhlciBPYmplY3Qgb3IgdGhlIHN0cmluZ2lmaWVkIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBvYmplY3QuXG4gICAqIFdoZW4gc3RyaW5nIGlzIHByb3ZpZGVkLCBKU09OLnBhcnNlIHdvdWxkIGJlIGNhbGxlZCBmaXJzdC5cbiAgICpcbiAgICogQHJldHVybnMgSWYgdGhlIEpTT04gaW5wdXQgZG9lcyBub3QgcmVwcmVzZW50IGFuIHtAbGluayAgQXV0aENyZWRlbnRpYWx9LCBudWxsIGlzIHJldHVybmVkLlxuICAgKi9cbiAgc3RhdGljIGZyb21KU09OKGpzb246IHN0cmluZyB8IG9iamVjdCk6IFNBTUxBdXRoQ3JlZGVudGlhbCB8IG51bGwge1xuICAgIGNvbnN0IG9iaiA9IHR5cGVvZiBqc29uID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2UoanNvbikgOiBqc29uO1xuICAgIGNvbnN0IHsgcHJvdmlkZXJJZCwgc2lnbkluTWV0aG9kLCBwZW5kaW5nVG9rZW4gfTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9XG4gICAgICBvYmo7XG4gICAgaWYgKFxuICAgICAgIXByb3ZpZGVySWQgfHxcbiAgICAgICFzaWduSW5NZXRob2QgfHxcbiAgICAgICFwZW5kaW5nVG9rZW4gfHxcbiAgICAgIHByb3ZpZGVySWQgIT09IHNpZ25Jbk1ldGhvZFxuICAgICkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBTQU1MQXV0aENyZWRlbnRpYWwocHJvdmlkZXJJZCwgcGVuZGluZ1Rva2VuKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgc3RhdGljIG1ldGhvZCB0byBhdm9pZCBleHBvc2luZyB0aGUgY29uc3RydWN0b3IgdG8gZW5kIHVzZXJzLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHN0YXRpYyBfY3JlYXRlKHByb3ZpZGVySWQ6IHN0cmluZywgcGVuZGluZ1Rva2VuOiBzdHJpbmcpOiBTQU1MQXV0aENyZWRlbnRpYWwge1xuICAgIHJldHVybiBuZXcgU0FNTEF1dGhDcmVkZW50aWFsKHByb3ZpZGVySWQsIHBlbmRpbmdUb2tlbik7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkUmVxdWVzdCgpOiBTaWduSW5XaXRoSWRwUmVxdWVzdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlcXVlc3RVcmk6IElEUF9SRVFVRVNUX1VSSSxcbiAgICAgIHJldHVyblNlY3VyZVRva2VuOiB0cnVlLFxuICAgICAgcGVuZGluZ1Rva2VuOiB0aGlzLnBlbmRpbmdUb2tlblxuICAgIH07XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBGaXJlYmFzZUVycm9yIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuaW1wb3J0IHsgU2lnbkluV2l0aElkcFJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vYXBpL2F1dGhlbnRpY2F0aW9uL2lkcCc7XG5pbXBvcnQgeyBUYWdnZWRXaXRoVG9rZW5SZXNwb25zZSB9IGZyb20gJy4uLy4uL21vZGVsL2lkX3Rva2VuJztcbmltcG9ydCB7IFVzZXJDcmVkZW50aWFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcbmltcG9ydCB7IFVzZXJDcmVkZW50aWFsSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC91c2VyJztcbmltcG9ydCB7IEF1dGhDcmVkZW50aWFsIH0gZnJvbSAnLi4vY3JlZGVudGlhbHMnO1xuaW1wb3J0IHsgU0FNTEF1dGhDcmVkZW50aWFsIH0gZnJvbSAnLi4vY3JlZGVudGlhbHMvc2FtbCc7XG5pbXBvcnQgeyBBdXRoRXJyb3JDb2RlIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IF9hc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydCc7XG5pbXBvcnQgeyBGZWRlcmF0ZWRBdXRoUHJvdmlkZXIgfSBmcm9tICcuL2ZlZGVyYXRlZCc7XG5cbmNvbnN0IFNBTUxfUFJPVklERVJfUFJFRklYID0gJ3NhbWwuJztcblxuLyoqXG4gKiBBbiB7QGxpbmsgQXV0aFByb3ZpZGVyfSBmb3IgU0FNTC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBTQU1MQXV0aFByb3ZpZGVyIGV4dGVuZHMgRmVkZXJhdGVkQXV0aFByb3ZpZGVyIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yLiBUaGUgcHJvdmlkZXJJZCBtdXN0IHN0YXJ0IHdpdGggXCJzYW1sLlwiXG4gICAqIEBwYXJhbSBwcm92aWRlcklkIC0gU0FNTCBwcm92aWRlciBJRC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHByb3ZpZGVySWQ6IHN0cmluZykge1xuICAgIF9hc3NlcnQoXG4gICAgICBwcm92aWRlcklkLnN0YXJ0c1dpdGgoU0FNTF9QUk9WSURFUl9QUkVGSVgpLFxuICAgICAgQXV0aEVycm9yQ29kZS5BUkdVTUVOVF9FUlJPUlxuICAgICk7XG4gICAgc3VwZXIocHJvdmlkZXJJZCk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGFuIHtAbGluayBBdXRoQ3JlZGVudGlhbH0gZnJvbSBhIHtAbGluayBVc2VyQ3JlZGVudGlhbH0gYWZ0ZXIgYVxuICAgKiBzdWNjZXNzZnVsIFNBTUwgZmxvdyBjb21wbGV0ZXMuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqXG4gICAqIEZvciBleGFtcGxlLCB0byBnZXQgYW4ge0BsaW5rIEF1dGhDcmVkZW50aWFsfSwgeW91IGNvdWxkIHdyaXRlIHRoZVxuICAgKiBmb2xsb3dpbmcgY29kZTpcbiAgICpcbiAgICogYGBganNcbiAgICogY29uc3QgdXNlckNyZWRlbnRpYWwgPSBhd2FpdCBzaWduSW5XaXRoUG9wdXAoYXV0aCwgc2FtbFByb3ZpZGVyKTtcbiAgICogY29uc3QgY3JlZGVudGlhbCA9IFNBTUxBdXRoUHJvdmlkZXIuY3JlZGVudGlhbEZyb21SZXN1bHQodXNlckNyZWRlbnRpYWwpO1xuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIHVzZXJDcmVkZW50aWFsIC0gVGhlIHVzZXIgY3JlZGVudGlhbC5cbiAgICovXG4gIHN0YXRpYyBjcmVkZW50aWFsRnJvbVJlc3VsdChcbiAgICB1c2VyQ3JlZGVudGlhbDogVXNlckNyZWRlbnRpYWxcbiAgKTogQXV0aENyZWRlbnRpYWwgfCBudWxsIHtcbiAgICByZXR1cm4gU0FNTEF1dGhQcm92aWRlci5zYW1sQ3JlZGVudGlhbEZyb21UYWdnZWRPYmplY3QoXG4gICAgICB1c2VyQ3JlZGVudGlhbCBhcyBVc2VyQ3JlZGVudGlhbEludGVybmFsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIHRvIGV4dHJhY3QgdGhlIHVuZGVybHlpbmcge0BsaW5rIE9BdXRoQ3JlZGVudGlhbH0gZnJvbSBhIHtAbGluayBBdXRoRXJyb3J9IHdoaWNoIHdhc1xuICAgKiB0aHJvd24gZHVyaW5nIGEgc2lnbi1pbiwgbGluaywgb3IgcmVhdXRoZW50aWNhdGUgb3BlcmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gdXNlckNyZWRlbnRpYWwgLSBUaGUgdXNlciBjcmVkZW50aWFsLlxuICAgKi9cbiAgc3RhdGljIGNyZWRlbnRpYWxGcm9tRXJyb3IoZXJyb3I6IEZpcmViYXNlRXJyb3IpOiBBdXRoQ3JlZGVudGlhbCB8IG51bGwge1xuICAgIHJldHVybiBTQU1MQXV0aFByb3ZpZGVyLnNhbWxDcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdChcbiAgICAgIChlcnJvci5jdXN0b21EYXRhIHx8IHt9KSBhcyBUYWdnZWRXaXRoVG9rZW5SZXNwb25zZVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiB7QGxpbmsgQXV0aENyZWRlbnRpYWx9IGZyb20gYSBKU09OIHN0cmluZyBvciBhIHBsYWluIG9iamVjdC5cbiAgICogQHBhcmFtIGpzb24gLSBBIHBsYWluIG9iamVjdCBvciBhIEpTT04gc3RyaW5nXG4gICAqL1xuICBzdGF0aWMgY3JlZGVudGlhbEZyb21KU09OKGpzb246IHN0cmluZyB8IG9iamVjdCk6IEF1dGhDcmVkZW50aWFsIHtcbiAgICBjb25zdCBjcmVkZW50aWFsID0gU0FNTEF1dGhDcmVkZW50aWFsLmZyb21KU09OKGpzb24pO1xuICAgIF9hc3NlcnQoY3JlZGVudGlhbCwgQXV0aEVycm9yQ29kZS5BUkdVTUVOVF9FUlJPUik7XG4gICAgcmV0dXJuIGNyZWRlbnRpYWw7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBzYW1sQ3JlZGVudGlhbEZyb21UYWdnZWRPYmplY3Qoe1xuICAgIF90b2tlblJlc3BvbnNlOiB0b2tlblJlc3BvbnNlXG4gIH06IFRhZ2dlZFdpdGhUb2tlblJlc3BvbnNlKTogU0FNTEF1dGhDcmVkZW50aWFsIHwgbnVsbCB7XG4gICAgaWYgKCF0b2tlblJlc3BvbnNlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCB7IHBlbmRpbmdUb2tlbiwgcHJvdmlkZXJJZCB9ID0gdG9rZW5SZXNwb25zZSBhcyBTaWduSW5XaXRoSWRwUmVzcG9uc2U7XG5cbiAgICBpZiAoIXBlbmRpbmdUb2tlbiB8fCAhcHJvdmlkZXJJZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBTQU1MQXV0aENyZWRlbnRpYWwuX2NyZWF0ZShwcm92aWRlcklkLCBwZW5kaW5nVG9rZW4pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIFR3aXR0ZXIgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBVc2VyQ3JlZGVudGlhbCB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5pbXBvcnQgeyBGaXJlYmFzZUVycm9yIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuXG5pbXBvcnQgeyBTaWduSW5XaXRoSWRwUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9hcGkvYXV0aGVudGljYXRpb24vaWRwJztcbmltcG9ydCB7IFRhZ2dlZFdpdGhUb2tlblJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vbW9kZWwvaWRfdG9rZW4nO1xuaW1wb3J0IHsgVXNlckNyZWRlbnRpYWxJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL3VzZXInO1xuaW1wb3J0IHsgT0F1dGhDcmVkZW50aWFsIH0gZnJvbSAnLi4vY3JlZGVudGlhbHMvb2F1dGgnO1xuaW1wb3J0IHsgQmFzZU9BdXRoUHJvdmlkZXIgfSBmcm9tICcuL29hdXRoJztcbmltcG9ydCB7IFByb3ZpZGVySWQsIFNpZ25Jbk1ldGhvZCB9IGZyb20gJy4uLy4uL21vZGVsL2VudW1zJztcblxuLyoqXG4gKiBQcm92aWRlciBmb3IgZ2VuZXJhdGluZyBhbiB7QGxpbmsgT0F1dGhDcmVkZW50aWFsfSBmb3Ige0BsaW5rIFByb3ZpZGVySWR9LlRXSVRURVIuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGphdmFzY3JpcHRcbiAqIC8vIFNpZ24gaW4gdXNpbmcgYSByZWRpcmVjdC5cbiAqIGNvbnN0IHByb3ZpZGVyID0gbmV3IFR3aXR0ZXJBdXRoUHJvdmlkZXIoKTtcbiAqIC8vIFN0YXJ0IGEgc2lnbiBpbiBwcm9jZXNzIGZvciBhbiB1bmF1dGhlbnRpY2F0ZWQgdXNlci5cbiAqIGF3YWl0IHNpZ25JbldpdGhSZWRpcmVjdChhdXRoLCBwcm92aWRlcik7XG4gKiAvLyBUaGlzIHdpbGwgdHJpZ2dlciBhIGZ1bGwgcGFnZSByZWRpcmVjdCBhd2F5IGZyb20geW91ciBhcHBcbiAqXG4gKiAvLyBBZnRlciByZXR1cm5pbmcgZnJvbSB0aGUgcmVkaXJlY3Qgd2hlbiB5b3VyIGFwcCBpbml0aWFsaXplcyB5b3UgY2FuIG9idGFpbiB0aGUgcmVzdWx0XG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRSZWRpcmVjdFJlc3VsdChhdXRoKTtcbiAqIGlmIChyZXN1bHQpIHtcbiAqICAgLy8gVGhpcyBpcyB0aGUgc2lnbmVkLWluIHVzZXJcbiAqICAgY29uc3QgdXNlciA9IHJlc3VsdC51c2VyO1xuICogICAvLyBUaGlzIGdpdmVzIHlvdSBhIFR3aXR0ZXIgQWNjZXNzIFRva2VuIGFuZCBTZWNyZXQuXG4gKiAgIGNvbnN0IGNyZWRlbnRpYWwgPSBUd2l0dGVyQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWxGcm9tUmVzdWx0KHJlc3VsdCk7XG4gKiAgIGNvbnN0IHRva2VuID0gY3JlZGVudGlhbC5hY2Nlc3NUb2tlbjtcbiAqICAgY29uc3Qgc2VjcmV0ID0gY3JlZGVudGlhbC5zZWNyZXQ7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgamF2YXNjcmlwdFxuICogLy8gU2lnbiBpbiB1c2luZyBhIHBvcHVwLlxuICogY29uc3QgcHJvdmlkZXIgPSBuZXcgVHdpdHRlckF1dGhQcm92aWRlcigpO1xuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgc2lnbkluV2l0aFBvcHVwKGF1dGgsIHByb3ZpZGVyKTtcbiAqXG4gKiAvLyBUaGUgc2lnbmVkLWluIHVzZXIgaW5mby5cbiAqIGNvbnN0IHVzZXIgPSByZXN1bHQudXNlcjtcbiAqIC8vIFRoaXMgZ2l2ZXMgeW91IGEgVHdpdHRlciBBY2Nlc3MgVG9rZW4gYW5kIFNlY3JldC5cbiAqIGNvbnN0IGNyZWRlbnRpYWwgPSBUd2l0dGVyQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWxGcm9tUmVzdWx0KHJlc3VsdCk7XG4gKiBjb25zdCB0b2tlbiA9IGNyZWRlbnRpYWwuYWNjZXNzVG9rZW47XG4gKiBjb25zdCBzZWNyZXQgPSBjcmVkZW50aWFsLnNlY3JldDtcbiAqIGBgYFxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIFR3aXR0ZXJBdXRoUHJvdmlkZXIgZXh0ZW5kcyBCYXNlT0F1dGhQcm92aWRlciB7XG4gIC8qKiBBbHdheXMgc2V0IHRvIHtAbGluayBTaWduSW5NZXRob2R9LlRXSVRURVIuICovXG4gIHN0YXRpYyByZWFkb25seSBUV0lUVEVSX1NJR05fSU5fTUVUSE9EOiAndHdpdHRlci5jb20nID0gU2lnbkluTWV0aG9kLlRXSVRURVI7XG4gIC8qKiBBbHdheXMgc2V0IHRvIHtAbGluayBQcm92aWRlcklkfS5UV0lUVEVSLiAqL1xuICBzdGF0aWMgcmVhZG9ubHkgUFJPVklERVJfSUQ6ICd0d2l0dGVyLmNvbScgPSBQcm92aWRlcklkLlRXSVRURVI7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoUHJvdmlkZXJJZC5UV0lUVEVSKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgY3JlZGVudGlhbCBmb3IgVHdpdHRlci5cbiAgICpcbiAgICogQHBhcmFtIHRva2VuIC0gVHdpdHRlciBhY2Nlc3MgdG9rZW4uXG4gICAqIEBwYXJhbSBzZWNyZXQgLSBUd2l0dGVyIHNlY3JldC5cbiAgICovXG4gIHN0YXRpYyBjcmVkZW50aWFsKHRva2VuOiBzdHJpbmcsIHNlY3JldDogc3RyaW5nKTogT0F1dGhDcmVkZW50aWFsIHtcbiAgICByZXR1cm4gT0F1dGhDcmVkZW50aWFsLl9mcm9tUGFyYW1zKHtcbiAgICAgIHByb3ZpZGVySWQ6IFR3aXR0ZXJBdXRoUHJvdmlkZXIuUFJPVklERVJfSUQsXG4gICAgICBzaWduSW5NZXRob2Q6IFR3aXR0ZXJBdXRoUHJvdmlkZXIuVFdJVFRFUl9TSUdOX0lOX01FVEhPRCxcbiAgICAgIG9hdXRoVG9rZW46IHRva2VuLFxuICAgICAgb2F1dGhUb2tlblNlY3JldDogc2VjcmV0XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCB0byBleHRyYWN0IHRoZSB1bmRlcmx5aW5nIHtAbGluayBPQXV0aENyZWRlbnRpYWx9IGZyb20gYSB7QGxpbmsgVXNlckNyZWRlbnRpYWx9LlxuICAgKlxuICAgKiBAcGFyYW0gdXNlckNyZWRlbnRpYWwgLSBUaGUgdXNlciBjcmVkZW50aWFsLlxuICAgKi9cbiAgc3RhdGljIGNyZWRlbnRpYWxGcm9tUmVzdWx0KFxuICAgIHVzZXJDcmVkZW50aWFsOiBVc2VyQ3JlZGVudGlhbFxuICApOiBPQXV0aENyZWRlbnRpYWwgfCBudWxsIHtcbiAgICByZXR1cm4gVHdpdHRlckF1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdChcbiAgICAgIHVzZXJDcmVkZW50aWFsIGFzIFVzZXJDcmVkZW50aWFsSW50ZXJuYWxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gZXh0cmFjdCB0aGUgdW5kZXJseWluZyB7QGxpbmsgT0F1dGhDcmVkZW50aWFsfSBmcm9tIGEge0BsaW5rIEF1dGhFcnJvcn0gd2hpY2ggd2FzXG4gICAqIHRocm93biBkdXJpbmcgYSBzaWduLWluLCBsaW5rLCBvciByZWF1dGhlbnRpY2F0ZSBvcGVyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB1c2VyQ3JlZGVudGlhbCAtIFRoZSB1c2VyIGNyZWRlbnRpYWwuXG4gICAqL1xuICBzdGF0aWMgY3JlZGVudGlhbEZyb21FcnJvcihlcnJvcjogRmlyZWJhc2VFcnJvcik6IE9BdXRoQ3JlZGVudGlhbCB8IG51bGwge1xuICAgIHJldHVybiBUd2l0dGVyQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWxGcm9tVGFnZ2VkT2JqZWN0KFxuICAgICAgKGVycm9yLmN1c3RvbURhdGEgfHwge30pIGFzIFRhZ2dlZFdpdGhUb2tlblJlc3BvbnNlXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWRlbnRpYWxGcm9tVGFnZ2VkT2JqZWN0KHtcbiAgICBfdG9rZW5SZXNwb25zZTogdG9rZW5SZXNwb25zZVxuICB9OiBUYWdnZWRXaXRoVG9rZW5SZXNwb25zZSk6IE9BdXRoQ3JlZGVudGlhbCB8IG51bGwge1xuICAgIGlmICghdG9rZW5SZXNwb25zZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHsgb2F1dGhBY2Nlc3NUb2tlbiwgb2F1dGhUb2tlblNlY3JldCB9ID1cbiAgICAgIHRva2VuUmVzcG9uc2UgYXMgU2lnbkluV2l0aElkcFJlc3BvbnNlO1xuICAgIGlmICghb2F1dGhBY2Nlc3NUb2tlbiB8fCAhb2F1dGhUb2tlblNlY3JldCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBUd2l0dGVyQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWwob2F1dGhBY2Nlc3NUb2tlbiwgb2F1dGhUb2tlblNlY3JldCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQge1xuICBFbmRwb2ludCxcbiAgSHR0cE1ldGhvZCxcbiAgUmVjYXB0Y2hhQ2xpZW50VHlwZSxcbiAgUmVjYXB0Y2hhVmVyc2lvbixcbiAgX2FkZFRpZElmTmVjZXNzYXJ5LFxuICBfcGVyZm9ybVNpZ25JblJlcXVlc3Rcbn0gZnJvbSAnLi4vaW5kZXgnO1xuaW1wb3J0IHsgSWRUb2tlblJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vbW9kZWwvaWRfdG9rZW4nO1xuaW1wb3J0IHsgQXV0aCB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2lnblVwUmVxdWVzdCB7XG4gIHJldHVyblNlY3VyZVRva2VuPzogYm9vbGVhbjtcbiAgZW1haWw/OiBzdHJpbmc7XG4gIHBhc3N3b3JkPzogc3RyaW5nO1xuICB0ZW5hbnRJZD86IHN0cmluZztcbiAgY2FwdGNoYVJlc3BvbnNlPzogc3RyaW5nO1xuICBjbGllbnRUeXBlPzogUmVjYXB0Y2hhQ2xpZW50VHlwZTtcbiAgcmVjYXB0Y2hhVmVyc2lvbj86IFJlY2FwdGNoYVZlcnNpb247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2lnblVwUmVzcG9uc2UgZXh0ZW5kcyBJZFRva2VuUmVzcG9uc2Uge1xuICBkaXNwbGF5TmFtZT86IHN0cmluZztcbiAgZW1haWw/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzaWduVXAoXG4gIGF1dGg6IEF1dGgsXG4gIHJlcXVlc3Q6IFNpZ25VcFJlcXVlc3Rcbik6IFByb21pc2U8U2lnblVwUmVzcG9uc2U+IHtcbiAgcmV0dXJuIF9wZXJmb3JtU2lnbkluUmVxdWVzdDxTaWduVXBSZXF1ZXN0LCBTaWduVXBSZXNwb25zZT4oXG4gICAgYXV0aCxcbiAgICBIdHRwTWV0aG9kLlBPU1QsXG4gICAgRW5kcG9pbnQuU0lHTl9VUCxcbiAgICBfYWRkVGlkSWZOZWNlc3NhcnkoYXV0aCwgcmVxdWVzdClcbiAgKTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBQaG9uZU9yT2F1dGhUb2tlblJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vYXBpL2F1dGhlbnRpY2F0aW9uL21mYSc7XG5pbXBvcnQgeyBJZFRva2VuUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9tb2RlbC9pZF90b2tlbic7XG5pbXBvcnQgeyBVc2VySW50ZXJuYWwsIFVzZXJDcmVkZW50aWFsSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC91c2VyJztcbmltcG9ydCB7IFVzZXJJbXBsIH0gZnJvbSAnLi91c2VyX2ltcGwnO1xuaW1wb3J0IHsgQXV0aEludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvYXV0aCc7XG5pbXBvcnQgeyBPcGVyYXRpb25UeXBlLCBQcm92aWRlcklkIH0gZnJvbSAnLi4vLi4vbW9kZWwvZW51bXMnO1xuXG5pbnRlcmZhY2UgVXNlckNyZWRlbnRpYWxQYXJhbXMge1xuICByZWFkb25seSB1c2VyOiBVc2VySW50ZXJuYWw7XG4gIHJlYWRvbmx5IHByb3ZpZGVySWQ6IFByb3ZpZGVySWQgfCBzdHJpbmcgfCBudWxsO1xuICByZWFkb25seSBfdG9rZW5SZXNwb25zZT86IFBob25lT3JPYXV0aFRva2VuUmVzcG9uc2U7XG4gIHJlYWRvbmx5IG9wZXJhdGlvblR5cGU6IE9wZXJhdGlvblR5cGU7XG59XG5cbmV4cG9ydCBjbGFzcyBVc2VyQ3JlZGVudGlhbEltcGxcbiAgaW1wbGVtZW50cyBVc2VyQ3JlZGVudGlhbEludGVybmFsLCBVc2VyQ3JlZGVudGlhbFBhcmFtc1xue1xuICByZWFkb25seSB1c2VyOiBVc2VySW50ZXJuYWw7XG4gIHJlYWRvbmx5IHByb3ZpZGVySWQ6IFByb3ZpZGVySWQgfCBzdHJpbmcgfCBudWxsO1xuICByZWFkb25seSBfdG9rZW5SZXNwb25zZTogUGhvbmVPck9hdXRoVG9rZW5SZXNwb25zZSB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgb3BlcmF0aW9uVHlwZTogT3BlcmF0aW9uVHlwZTtcblxuICBjb25zdHJ1Y3RvcihwYXJhbXM6IFVzZXJDcmVkZW50aWFsUGFyYW1zKSB7XG4gICAgdGhpcy51c2VyID0gcGFyYW1zLnVzZXI7XG4gICAgdGhpcy5wcm92aWRlcklkID0gcGFyYW1zLnByb3ZpZGVySWQ7XG4gICAgdGhpcy5fdG9rZW5SZXNwb25zZSA9IHBhcmFtcy5fdG9rZW5SZXNwb25zZTtcbiAgICB0aGlzLm9wZXJhdGlvblR5cGUgPSBwYXJhbXMub3BlcmF0aW9uVHlwZTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBfZnJvbUlkVG9rZW5SZXNwb25zZShcbiAgICBhdXRoOiBBdXRoSW50ZXJuYWwsXG4gICAgb3BlcmF0aW9uVHlwZTogT3BlcmF0aW9uVHlwZSxcbiAgICBpZFRva2VuUmVzcG9uc2U6IElkVG9rZW5SZXNwb25zZSxcbiAgICBpc0Fub255bW91czogYm9vbGVhbiA9IGZhbHNlXG4gICk6IFByb21pc2U8VXNlckNyZWRlbnRpYWxJbnRlcm5hbD4ge1xuICAgIGNvbnN0IHVzZXIgPSBhd2FpdCBVc2VySW1wbC5fZnJvbUlkVG9rZW5SZXNwb25zZShcbiAgICAgIGF1dGgsXG4gICAgICBpZFRva2VuUmVzcG9uc2UsXG4gICAgICBpc0Fub255bW91c1xuICAgICk7XG4gICAgY29uc3QgcHJvdmlkZXJJZCA9IHByb3ZpZGVySWRGb3JSZXNwb25zZShpZFRva2VuUmVzcG9uc2UpO1xuICAgIGNvbnN0IHVzZXJDcmVkID0gbmV3IFVzZXJDcmVkZW50aWFsSW1wbCh7XG4gICAgICB1c2VyLFxuICAgICAgcHJvdmlkZXJJZCxcbiAgICAgIF90b2tlblJlc3BvbnNlOiBpZFRva2VuUmVzcG9uc2UsXG4gICAgICBvcGVyYXRpb25UeXBlXG4gICAgfSk7XG4gICAgcmV0dXJuIHVzZXJDcmVkO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIF9mb3JPcGVyYXRpb24oXG4gICAgdXNlcjogVXNlckludGVybmFsLFxuICAgIG9wZXJhdGlvblR5cGU6IE9wZXJhdGlvblR5cGUsXG4gICAgcmVzcG9uc2U6IFBob25lT3JPYXV0aFRva2VuUmVzcG9uc2VcbiAgKTogUHJvbWlzZTxVc2VyQ3JlZGVudGlhbEltcGw+IHtcbiAgICBhd2FpdCB1c2VyLl91cGRhdGVUb2tlbnNJZk5lY2Vzc2FyeShyZXNwb25zZSwgLyogcmVsb2FkICovIHRydWUpO1xuICAgIGNvbnN0IHByb3ZpZGVySWQgPSBwcm92aWRlcklkRm9yUmVzcG9uc2UocmVzcG9uc2UpO1xuICAgIHJldHVybiBuZXcgVXNlckNyZWRlbnRpYWxJbXBsKHtcbiAgICAgIHVzZXIsXG4gICAgICBwcm92aWRlcklkLFxuICAgICAgX3Rva2VuUmVzcG9uc2U6IHJlc3BvbnNlLFxuICAgICAgb3BlcmF0aW9uVHlwZVxuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIHByb3ZpZGVySWRGb3JSZXNwb25zZShcbiAgcmVzcG9uc2U6IElkVG9rZW5SZXNwb25zZVxuKTogUHJvdmlkZXJJZCB8IHN0cmluZyB8IG51bGwge1xuICBpZiAocmVzcG9uc2UucHJvdmlkZXJJZCkge1xuICAgIHJldHVybiByZXNwb25zZS5wcm92aWRlcklkO1xuICB9XG5cbiAgaWYgKCdwaG9uZU51bWJlcicgaW4gcmVzcG9uc2UpIHtcbiAgICByZXR1cm4gUHJvdmlkZXJJZC5QSE9ORTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEF1dGgsIFVzZXJDcmVkZW50aWFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcbmltcG9ydCB7IHNpZ25VcCB9IGZyb20gJy4uLy4uL2FwaS9hdXRoZW50aWNhdGlvbi9zaWduX3VwJztcbmltcG9ydCB7IFVzZXJJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL3VzZXInO1xuaW1wb3J0IHsgVXNlckNyZWRlbnRpYWxJbXBsIH0gZnJvbSAnLi4vdXNlci91c2VyX2NyZWRlbnRpYWxfaW1wbCc7XG5pbXBvcnQgeyBfY2FzdEF1dGggfSBmcm9tICcuLi9hdXRoL2F1dGhfaW1wbCc7XG5pbXBvcnQgeyBPcGVyYXRpb25UeXBlIH0gZnJvbSAnLi4vLi4vbW9kZWwvZW51bXMnO1xuXG4vKipcbiAqIEFzeW5jaHJvbm91c2x5IHNpZ25zIGluIGFzIGFuIGFub255bW91cyB1c2VyLlxuICpcbiAqIEByZW1hcmtzXG4gKiBJZiB0aGVyZSBpcyBhbHJlYWR5IGFuIGFub255bW91cyB1c2VyIHNpZ25lZCBpbiwgdGhhdCB1c2VyIHdpbGwgYmUgcmV0dXJuZWQ7IG90aGVyd2lzZSwgYVxuICogbmV3IGFub255bW91cyB1c2VyIGlkZW50aXR5IHdpbGwgYmUgY3JlYXRlZCBhbmQgcmV0dXJuZWQuXG4gKlxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNpZ25JbkFub255bW91c2x5KGF1dGg6IEF1dGgpOiBQcm9taXNlPFVzZXJDcmVkZW50aWFsPiB7XG4gIGNvbnN0IGF1dGhJbnRlcm5hbCA9IF9jYXN0QXV0aChhdXRoKTtcbiAgYXdhaXQgYXV0aEludGVybmFsLl9pbml0aWFsaXphdGlvblByb21pc2U7XG4gIGlmIChhdXRoSW50ZXJuYWwuY3VycmVudFVzZXI/LmlzQW5vbnltb3VzKSB7XG4gICAgLy8gSWYgYW4gYW5vbnltb3VzIHVzZXIgaXMgYWxyZWFkeSBzaWduZWQgaW4sIG5vIG5lZWQgdG8gc2lnbiB0aGVtIGluIGFnYWluLlxuICAgIHJldHVybiBuZXcgVXNlckNyZWRlbnRpYWxJbXBsKHtcbiAgICAgIHVzZXI6IGF1dGhJbnRlcm5hbC5jdXJyZW50VXNlciBhcyBVc2VySW50ZXJuYWwsXG4gICAgICBwcm92aWRlcklkOiBudWxsLFxuICAgICAgb3BlcmF0aW9uVHlwZTogT3BlcmF0aW9uVHlwZS5TSUdOX0lOXG4gICAgfSk7XG4gIH1cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzaWduVXAoYXV0aEludGVybmFsLCB7XG4gICAgcmV0dXJuU2VjdXJlVG9rZW46IHRydWVcbiAgfSk7XG4gIGNvbnN0IHVzZXJDcmVkZW50aWFsID0gYXdhaXQgVXNlckNyZWRlbnRpYWxJbXBsLl9mcm9tSWRUb2tlblJlc3BvbnNlKFxuICAgIGF1dGhJbnRlcm5hbCxcbiAgICBPcGVyYXRpb25UeXBlLlNJR05fSU4sXG4gICAgcmVzcG9uc2UsXG4gICAgdHJ1ZVxuICApO1xuICBhd2FpdCBhdXRoSW50ZXJuYWwuX3VwZGF0ZUN1cnJlbnRVc2VyKHVzZXJDcmVkZW50aWFsLnVzZXIpO1xuICByZXR1cm4gdXNlckNyZWRlbnRpYWw7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgTXVsdGlGYWN0b3JFcnJvciBhcyBNdWx0aUZhY3RvckVycm9yUHVibGljIH0gZnJvbSAnLi4vbW9kZWwvcHVibGljX3R5cGVzJztcbmltcG9ydCB7IEZpcmViYXNlRXJyb3IgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5pbXBvcnQgeyBBdXRoSW50ZXJuYWwgfSBmcm9tICcuLi9tb2RlbC9hdXRoJztcbmltcG9ydCB7IElkVG9rZW5SZXNwb25zZSB9IGZyb20gJy4uL21vZGVsL2lkX3Rva2VuJztcbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi9jb3JlL2Vycm9ycyc7XG5pbXBvcnQgeyBVc2VySW50ZXJuYWwgfSBmcm9tICcuLi9tb2RlbC91c2VyJztcbmltcG9ydCB7IEF1dGhDcmVkZW50aWFsIH0gZnJvbSAnLi4vY29yZS9jcmVkZW50aWFscyc7XG5pbXBvcnQgeyBJZFRva2VuTWZhUmVzcG9uc2UgfSBmcm9tICcuLi9hcGkvYXV0aGVudGljYXRpb24vbWZhJztcbmltcG9ydCB7IE9wZXJhdGlvblR5cGUgfSBmcm9tICcuLi9tb2RlbC9lbnVtcyc7XG5cbmV4cG9ydCB0eXBlIE11bHRpRmFjdG9yRXJyb3JEYXRhID0gTXVsdGlGYWN0b3JFcnJvclB1YmxpY1snY3VzdG9tRGF0YSddICYge1xuICBfc2VydmVyUmVzcG9uc2U6IElkVG9rZW5NZmFSZXNwb25zZTtcbn07XG5cbmV4cG9ydCBjbGFzcyBNdWx0aUZhY3RvckVycm9yXG4gIGV4dGVuZHMgRmlyZWJhc2VFcnJvclxuICBpbXBsZW1lbnRzIE11bHRpRmFjdG9yRXJyb3JQdWJsaWNcbntcbiAgcmVhZG9ubHkgY3VzdG9tRGF0YTogTXVsdGlGYWN0b3JFcnJvckRhdGE7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICBhdXRoOiBBdXRoSW50ZXJuYWwsXG4gICAgZXJyb3I6IEZpcmViYXNlRXJyb3IsXG4gICAgcmVhZG9ubHkgb3BlcmF0aW9uVHlwZTogT3BlcmF0aW9uVHlwZSxcbiAgICByZWFkb25seSB1c2VyPzogVXNlckludGVybmFsXG4gICkge1xuICAgIHN1cGVyKGVycm9yLmNvZGUsIGVycm9yLm1lc3NhZ2UpO1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvVHlwZVNjcmlwdC13aWtpL2Jsb2IvbWFzdGVyL0JyZWFraW5nLUNoYW5nZXMubWQjZXh0ZW5kaW5nLWJ1aWx0LWlucy1saWtlLWVycm9yLWFycmF5LWFuZC1tYXAtbWF5LW5vLWxvbmdlci13b3JrXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIE11bHRpRmFjdG9yRXJyb3IucHJvdG90eXBlKTtcbiAgICB0aGlzLmN1c3RvbURhdGEgPSB7XG4gICAgICBhcHBOYW1lOiBhdXRoLm5hbWUsXG4gICAgICB0ZW5hbnRJZDogYXV0aC50ZW5hbnRJZCA/PyB1bmRlZmluZWQsXG4gICAgICBfc2VydmVyUmVzcG9uc2U6IGVycm9yLmN1c3RvbURhdGEhLl9zZXJ2ZXJSZXNwb25zZSBhcyBJZFRva2VuTWZhUmVzcG9uc2UsXG4gICAgICBvcGVyYXRpb25UeXBlXG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBfZnJvbUVycm9yQW5kT3BlcmF0aW9uKFxuICAgIGF1dGg6IEF1dGhJbnRlcm5hbCxcbiAgICBlcnJvcjogRmlyZWJhc2VFcnJvcixcbiAgICBvcGVyYXRpb25UeXBlOiBPcGVyYXRpb25UeXBlLFxuICAgIHVzZXI/OiBVc2VySW50ZXJuYWxcbiAgKTogTXVsdGlGYWN0b3JFcnJvciB7XG4gICAgcmV0dXJuIG5ldyBNdWx0aUZhY3RvckVycm9yKGF1dGgsIGVycm9yLCBvcGVyYXRpb25UeXBlLCB1c2VyKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX3Byb2Nlc3NDcmVkZW50aWFsU2F2aW5nTWZhQ29udGV4dElmTmVjZXNzYXJ5KFxuICBhdXRoOiBBdXRoSW50ZXJuYWwsXG4gIG9wZXJhdGlvblR5cGU6IE9wZXJhdGlvblR5cGUsXG4gIGNyZWRlbnRpYWw6IEF1dGhDcmVkZW50aWFsLFxuICB1c2VyPzogVXNlckludGVybmFsXG4pOiBQcm9taXNlPElkVG9rZW5SZXNwb25zZT4ge1xuICBjb25zdCBpZFRva2VuUHJvdmlkZXIgPVxuICAgIG9wZXJhdGlvblR5cGUgPT09IE9wZXJhdGlvblR5cGUuUkVBVVRIRU5USUNBVEVcbiAgICAgID8gY3JlZGVudGlhbC5fZ2V0UmVhdXRoZW50aWNhdGlvblJlc29sdmVyKGF1dGgpXG4gICAgICA6IGNyZWRlbnRpYWwuX2dldElkVG9rZW5SZXNwb25zZShhdXRoKTtcblxuICByZXR1cm4gaWRUb2tlblByb3ZpZGVyLmNhdGNoKGVycm9yID0+IHtcbiAgICBpZiAoZXJyb3IuY29kZSA9PT0gYGF1dGgvJHtBdXRoRXJyb3JDb2RlLk1GQV9SRVFVSVJFRH1gKSB7XG4gICAgICB0aHJvdyBNdWx0aUZhY3RvckVycm9yLl9mcm9tRXJyb3JBbmRPcGVyYXRpb24oXG4gICAgICAgIGF1dGgsXG4gICAgICAgIGVycm9yLFxuICAgICAgICBvcGVyYXRpb25UeXBlLFxuICAgICAgICB1c2VyXG4gICAgICApO1xuICAgIH1cblxuICAgIHRocm93IGVycm9yO1xuICB9KTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5leHBvcnQgaW50ZXJmYWNlIFByb3ZpZGVyQXNzb2NpYXRlZE9iamVjdCB7XG4gIHByb3ZpZGVySWQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGFrZXMgYSBzZXQgb2YgVXNlckluZm8gcHJvdmlkZXIgZGF0YSBhbmQgY29udmVydHMgaXQgdG8gYSBzZXQgb2YgbmFtZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVyRGF0YUFzTmFtZXM8VCBleHRlbmRzIFByb3ZpZGVyQXNzb2NpYXRlZE9iamVjdD4oXG4gIHByb3ZpZGVyRGF0YTogVFtdXG4pOiBTZXQ8c3RyaW5nPiB7XG4gIHJldHVybiBuZXcgU2V0KFxuICAgIHByb3ZpZGVyRGF0YVxuICAgICAgLm1hcCgoeyBwcm92aWRlcklkIH0pID0+IHByb3ZpZGVySWQpXG4gICAgICAuZmlsdGVyKHBpZCA9PiAhIXBpZCkgYXMgc3RyaW5nW11cbiAgKTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcblxuaW1wb3J0IHsgZGVsZXRlTGlua2VkQWNjb3VudHMgfSBmcm9tICcuLi8uLi9hcGkvYWNjb3VudF9tYW5hZ2VtZW50L2FjY291bnQnO1xuaW1wb3J0IHsgVXNlckludGVybmFsLCBVc2VyQ3JlZGVudGlhbEludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvdXNlcic7XG5pbXBvcnQgeyBBdXRoQ3JlZGVudGlhbCB9IGZyb20gJy4uL2NyZWRlbnRpYWxzJztcbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgX2Fzc2VydCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0JztcbmltcG9ydCB7IHByb3ZpZGVyRGF0YUFzTmFtZXMgfSBmcm9tICcuLi91dGlsL3Byb3ZpZGVycyc7XG5pbXBvcnQgeyBfbG9nb3V0SWZJbnZhbGlkYXRlZCB9IGZyb20gJy4vaW52YWxpZGF0aW9uJztcbmltcG9ydCB7IF9yZWxvYWRXaXRob3V0U2F2aW5nIH0gZnJvbSAnLi9yZWxvYWQnO1xuaW1wb3J0IHsgVXNlckNyZWRlbnRpYWxJbXBsIH0gZnJvbSAnLi91c2VyX2NyZWRlbnRpYWxfaW1wbCc7XG5pbXBvcnQgeyBnZXRNb2R1bGFySW5zdGFuY2UgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5pbXBvcnQgeyBPcGVyYXRpb25UeXBlLCBQcm92aWRlcklkIH0gZnJvbSAnLi4vLi4vbW9kZWwvZW51bXMnO1xuXG4vKipcbiAqIFVubGlua3MgYSBwcm92aWRlciBmcm9tIGEgdXNlciBhY2NvdW50LlxuICpcbiAqIEBwYXJhbSB1c2VyIC0gVGhlIHVzZXIuXG4gKiBAcGFyYW0gcHJvdmlkZXJJZCAtIFRoZSBwcm92aWRlciB0byB1bmxpbmsuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdW5saW5rKHVzZXI6IFVzZXIsIHByb3ZpZGVySWQ6IHN0cmluZyk6IFByb21pc2U8VXNlcj4ge1xuICBjb25zdCB1c2VySW50ZXJuYWwgPSBnZXRNb2R1bGFySW5zdGFuY2UodXNlcikgYXMgVXNlckludGVybmFsO1xuICBhd2FpdCBfYXNzZXJ0TGlua2VkU3RhdHVzKHRydWUsIHVzZXJJbnRlcm5hbCwgcHJvdmlkZXJJZCk7XG4gIGNvbnN0IHsgcHJvdmlkZXJVc2VySW5mbyB9ID0gYXdhaXQgZGVsZXRlTGlua2VkQWNjb3VudHModXNlckludGVybmFsLmF1dGgsIHtcbiAgICBpZFRva2VuOiBhd2FpdCB1c2VySW50ZXJuYWwuZ2V0SWRUb2tlbigpLFxuICAgIGRlbGV0ZVByb3ZpZGVyOiBbcHJvdmlkZXJJZF1cbiAgfSk7XG5cbiAgY29uc3QgcHJvdmlkZXJzTGVmdCA9IHByb3ZpZGVyRGF0YUFzTmFtZXMocHJvdmlkZXJVc2VySW5mbyB8fCBbXSk7XG5cbiAgdXNlckludGVybmFsLnByb3ZpZGVyRGF0YSA9IHVzZXJJbnRlcm5hbC5wcm92aWRlckRhdGEuZmlsdGVyKHBkID0+XG4gICAgcHJvdmlkZXJzTGVmdC5oYXMocGQucHJvdmlkZXJJZClcbiAgKTtcbiAgaWYgKCFwcm92aWRlcnNMZWZ0LmhhcyhQcm92aWRlcklkLlBIT05FKSkge1xuICAgIHVzZXJJbnRlcm5hbC5waG9uZU51bWJlciA9IG51bGw7XG4gIH1cblxuICBhd2FpdCB1c2VySW50ZXJuYWwuYXV0aC5fcGVyc2lzdFVzZXJJZkN1cnJlbnQodXNlckludGVybmFsKTtcbiAgcmV0dXJuIHVzZXJJbnRlcm5hbDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIF9saW5rKFxuICB1c2VyOiBVc2VySW50ZXJuYWwsXG4gIGNyZWRlbnRpYWw6IEF1dGhDcmVkZW50aWFsLFxuICBieXBhc3NBdXRoU3RhdGUgPSBmYWxzZVxuKTogUHJvbWlzZTxVc2VyQ3JlZGVudGlhbEludGVybmFsPiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgX2xvZ291dElmSW52YWxpZGF0ZWQoXG4gICAgdXNlcixcbiAgICBjcmVkZW50aWFsLl9saW5rVG9JZFRva2VuKHVzZXIuYXV0aCwgYXdhaXQgdXNlci5nZXRJZFRva2VuKCkpLFxuICAgIGJ5cGFzc0F1dGhTdGF0ZVxuICApO1xuICByZXR1cm4gVXNlckNyZWRlbnRpYWxJbXBsLl9mb3JPcGVyYXRpb24odXNlciwgT3BlcmF0aW9uVHlwZS5MSU5LLCByZXNwb25zZSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBfYXNzZXJ0TGlua2VkU3RhdHVzKFxuICBleHBlY3RlZDogYm9vbGVhbixcbiAgdXNlcjogVXNlckludGVybmFsLFxuICBwcm92aWRlcjogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgX3JlbG9hZFdpdGhvdXRTYXZpbmcodXNlcik7XG4gIGNvbnN0IHByb3ZpZGVySWRzID0gcHJvdmlkZXJEYXRhQXNOYW1lcyh1c2VyLnByb3ZpZGVyRGF0YSk7XG5cbiAgY29uc3QgY29kZSA9XG4gICAgZXhwZWN0ZWQgPT09IGZhbHNlXG4gICAgICA/IEF1dGhFcnJvckNvZGUuUFJPVklERVJfQUxSRUFEWV9MSU5LRURcbiAgICAgIDogQXV0aEVycm9yQ29kZS5OT19TVUNIX1BST1ZJREVSO1xuICBfYXNzZXJ0KHByb3ZpZGVySWRzLmhhcyhwcm92aWRlcikgPT09IGV4cGVjdGVkLCB1c2VyLmF1dGgsIGNvZGUpO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEZpcmViYXNlRXJyb3IgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5pbXBvcnQgeyBfcHJvY2Vzc0NyZWRlbnRpYWxTYXZpbmdNZmFDb250ZXh0SWZOZWNlc3NhcnkgfSBmcm9tICcuLi8uLi9tZmEvbWZhX2Vycm9yJztcbmltcG9ydCB7IE9wZXJhdGlvblR5cGUgfSBmcm9tICcuLi8uLi9tb2RlbC9lbnVtcyc7XG5pbXBvcnQgeyBVc2VySW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC91c2VyJztcbmltcG9ydCB7IEF1dGhDcmVkZW50aWFsIH0gZnJvbSAnLi4vY3JlZGVudGlhbHMnO1xuaW1wb3J0IHsgQXV0aEVycm9yQ29kZSB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBfYXNzZXJ0LCBfZmFpbCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0JztcbmltcG9ydCB7IF9wYXJzZVRva2VuIH0gZnJvbSAnLi9pZF90b2tlbl9yZXN1bHQnO1xuaW1wb3J0IHsgX2xvZ291dElmSW52YWxpZGF0ZWQgfSBmcm9tICcuL2ludmFsaWRhdGlvbic7XG5pbXBvcnQgeyBVc2VyQ3JlZGVudGlhbEltcGwgfSBmcm9tICcuL3VzZXJfY3JlZGVudGlhbF9pbXBsJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIF9yZWF1dGhlbnRpY2F0ZShcbiAgdXNlcjogVXNlckludGVybmFsLFxuICBjcmVkZW50aWFsOiBBdXRoQ3JlZGVudGlhbCxcbiAgYnlwYXNzQXV0aFN0YXRlID0gZmFsc2Vcbik6IFByb21pc2U8VXNlckNyZWRlbnRpYWxJbXBsPiB7XG4gIGNvbnN0IHsgYXV0aCB9ID0gdXNlcjtcbiAgY29uc3Qgb3BlcmF0aW9uVHlwZSA9IE9wZXJhdGlvblR5cGUuUkVBVVRIRU5USUNBVEU7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IF9sb2dvdXRJZkludmFsaWRhdGVkKFxuICAgICAgdXNlcixcbiAgICAgIF9wcm9jZXNzQ3JlZGVudGlhbFNhdmluZ01mYUNvbnRleHRJZk5lY2Vzc2FyeShcbiAgICAgICAgYXV0aCxcbiAgICAgICAgb3BlcmF0aW9uVHlwZSxcbiAgICAgICAgY3JlZGVudGlhbCxcbiAgICAgICAgdXNlclxuICAgICAgKSxcbiAgICAgIGJ5cGFzc0F1dGhTdGF0ZVxuICAgICk7XG4gICAgX2Fzc2VydChyZXNwb25zZS5pZFRva2VuLCBhdXRoLCBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SKTtcbiAgICBjb25zdCBwYXJzZWQgPSBfcGFyc2VUb2tlbihyZXNwb25zZS5pZFRva2VuKTtcbiAgICBfYXNzZXJ0KHBhcnNlZCwgYXV0aCwgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUik7XG5cbiAgICBjb25zdCB7IHN1YjogbG9jYWxJZCB9ID0gcGFyc2VkO1xuICAgIF9hc3NlcnQodXNlci51aWQgPT09IGxvY2FsSWQsIGF1dGgsIEF1dGhFcnJvckNvZGUuVVNFUl9NSVNNQVRDSCk7XG5cbiAgICByZXR1cm4gVXNlckNyZWRlbnRpYWxJbXBsLl9mb3JPcGVyYXRpb24odXNlciwgb3BlcmF0aW9uVHlwZSwgcmVzcG9uc2UpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gQ29udmVydCB1c2VyIGRlbGV0ZWQgZXJyb3IgaW50byB1c2VyIG1pc21hdGNoXG4gICAgaWYgKChlIGFzIEZpcmViYXNlRXJyb3IpPy5jb2RlID09PSBgYXV0aC8ke0F1dGhFcnJvckNvZGUuVVNFUl9ERUxFVEVEfWApIHtcbiAgICAgIF9mYWlsKGF1dGgsIEF1dGhFcnJvckNvZGUuVVNFUl9NSVNNQVRDSCk7XG4gICAgfVxuICAgIHRocm93IGU7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBVc2VyQ3JlZGVudGlhbCwgQXV0aCwgVXNlciB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5cbmltcG9ydCB7IF9wcm9jZXNzQ3JlZGVudGlhbFNhdmluZ01mYUNvbnRleHRJZk5lY2Vzc2FyeSB9IGZyb20gJy4uLy4uL21mYS9tZmFfZXJyb3InO1xuaW1wb3J0IHsgQXV0aEludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvYXV0aCc7XG5pbXBvcnQgeyBVc2VySW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC91c2VyJztcbmltcG9ydCB7IEF1dGhDcmVkZW50aWFsIH0gZnJvbSAnLi4vY3JlZGVudGlhbHMnO1xuaW1wb3J0IHsgX2Fzc2VydExpbmtlZFN0YXR1cywgX2xpbmsgfSBmcm9tICcuLi91c2VyL2xpbmtfdW5saW5rJztcbmltcG9ydCB7IF9yZWF1dGhlbnRpY2F0ZSB9IGZyb20gJy4uL3VzZXIvcmVhdXRoZW50aWNhdGUnO1xuaW1wb3J0IHsgVXNlckNyZWRlbnRpYWxJbXBsIH0gZnJvbSAnLi4vdXNlci91c2VyX2NyZWRlbnRpYWxfaW1wbCc7XG5pbXBvcnQgeyBfY2FzdEF1dGggfSBmcm9tICcuLi9hdXRoL2F1dGhfaW1wbCc7XG5pbXBvcnQgeyBnZXRNb2R1bGFySW5zdGFuY2UgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5pbXBvcnQgeyBPcGVyYXRpb25UeXBlIH0gZnJvbSAnLi4vLi4vbW9kZWwvZW51bXMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gX3NpZ25JbldpdGhDcmVkZW50aWFsKFxuICBhdXRoOiBBdXRoSW50ZXJuYWwsXG4gIGNyZWRlbnRpYWw6IEF1dGhDcmVkZW50aWFsLFxuICBieXBhc3NBdXRoU3RhdGUgPSBmYWxzZVxuKTogUHJvbWlzZTxVc2VyQ3JlZGVudGlhbD4ge1xuICBjb25zdCBvcGVyYXRpb25UeXBlID0gT3BlcmF0aW9uVHlwZS5TSUdOX0lOO1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IF9wcm9jZXNzQ3JlZGVudGlhbFNhdmluZ01mYUNvbnRleHRJZk5lY2Vzc2FyeShcbiAgICBhdXRoLFxuICAgIG9wZXJhdGlvblR5cGUsXG4gICAgY3JlZGVudGlhbFxuICApO1xuICBjb25zdCB1c2VyQ3JlZGVudGlhbCA9IGF3YWl0IFVzZXJDcmVkZW50aWFsSW1wbC5fZnJvbUlkVG9rZW5SZXNwb25zZShcbiAgICBhdXRoLFxuICAgIG9wZXJhdGlvblR5cGUsXG4gICAgcmVzcG9uc2VcbiAgKTtcblxuICBpZiAoIWJ5cGFzc0F1dGhTdGF0ZSkge1xuICAgIGF3YWl0IGF1dGguX3VwZGF0ZUN1cnJlbnRVc2VyKHVzZXJDcmVkZW50aWFsLnVzZXIpO1xuICB9XG4gIHJldHVybiB1c2VyQ3JlZGVudGlhbDtcbn1cblxuLyoqXG4gKiBBc3luY2hyb25vdXNseSBzaWducyBpbiB3aXRoIHRoZSBnaXZlbiBjcmVkZW50aWFscy5cbiAqXG4gKiBAcmVtYXJrc1xuICogQW4ge0BsaW5rIEF1dGhQcm92aWRlcn0gY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGNyZWRlbnRpYWwuXG4gKlxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxuICogQHBhcmFtIGNyZWRlbnRpYWwgLSBUaGUgYXV0aCBjcmVkZW50aWFsLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNpZ25JbldpdGhDcmVkZW50aWFsKFxuICBhdXRoOiBBdXRoLFxuICBjcmVkZW50aWFsOiBBdXRoQ3JlZGVudGlhbFxuKTogUHJvbWlzZTxVc2VyQ3JlZGVudGlhbD4ge1xuICByZXR1cm4gX3NpZ25JbldpdGhDcmVkZW50aWFsKF9jYXN0QXV0aChhdXRoKSwgY3JlZGVudGlhbCk7XG59XG5cbi8qKlxuICogTGlua3MgdGhlIHVzZXIgYWNjb3VudCB3aXRoIHRoZSBnaXZlbiBjcmVkZW50aWFscy5cbiAqXG4gKiBAcmVtYXJrc1xuICogQW4ge0BsaW5rIEF1dGhQcm92aWRlcn0gY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGNyZWRlbnRpYWwuXG4gKlxuICogQHBhcmFtIHVzZXIgLSBUaGUgdXNlci5cbiAqIEBwYXJhbSBjcmVkZW50aWFsIC0gVGhlIGF1dGggY3JlZGVudGlhbC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaW5rV2l0aENyZWRlbnRpYWwoXG4gIHVzZXI6IFVzZXIsXG4gIGNyZWRlbnRpYWw6IEF1dGhDcmVkZW50aWFsXG4pOiBQcm9taXNlPFVzZXJDcmVkZW50aWFsPiB7XG4gIGNvbnN0IHVzZXJJbnRlcm5hbCA9IGdldE1vZHVsYXJJbnN0YW5jZSh1c2VyKSBhcyBVc2VySW50ZXJuYWw7XG5cbiAgYXdhaXQgX2Fzc2VydExpbmtlZFN0YXR1cyhmYWxzZSwgdXNlckludGVybmFsLCBjcmVkZW50aWFsLnByb3ZpZGVySWQpO1xuXG4gIHJldHVybiBfbGluayh1c2VySW50ZXJuYWwsIGNyZWRlbnRpYWwpO1xufVxuXG4vKipcbiAqIFJlLWF1dGhlbnRpY2F0ZXMgYSB1c2VyIHVzaW5nIGEgZnJlc2ggY3JlZGVudGlhbC5cbiAqXG4gKiBAcmVtYXJrc1xuICogVXNlIGJlZm9yZSBvcGVyYXRpb25zIHN1Y2ggYXMge0BsaW5rIHVwZGF0ZVBhc3N3b3JkfSB0aGF0IHJlcXVpcmUgdG9rZW5zIGZyb20gcmVjZW50IHNpZ24taW5cbiAqIGF0dGVtcHRzLiBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byByZWNvdmVyIGZyb20gYSBgQ1JFREVOVElBTF9UT09fT0xEX0xPR0lOX0FHQUlOYCBlcnJvclxuICogb3IgYSBgVE9LRU5fRVhQSVJFRGAgZXJyb3IuXG4gKlxuICogQHBhcmFtIHVzZXIgLSBUaGUgdXNlci5cbiAqIEBwYXJhbSBjcmVkZW50aWFsIC0gVGhlIGF1dGggY3JlZGVudGlhbC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWF1dGhlbnRpY2F0ZVdpdGhDcmVkZW50aWFsKFxuICB1c2VyOiBVc2VyLFxuICBjcmVkZW50aWFsOiBBdXRoQ3JlZGVudGlhbFxuKTogUHJvbWlzZTxVc2VyQ3JlZGVudGlhbD4ge1xuICByZXR1cm4gX3JlYXV0aGVudGljYXRlKGdldE1vZHVsYXJJbnN0YW5jZSh1c2VyKSBhcyBVc2VySW50ZXJuYWwsIGNyZWRlbnRpYWwpO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7XG4gIEVuZHBvaW50LFxuICBIdHRwTWV0aG9kLFxuICBfYWRkVGlkSWZOZWNlc3NhcnksXG4gIF9wZXJmb3JtU2lnbkluUmVxdWVzdFxufSBmcm9tICcuLi9pbmRleCc7XG5pbXBvcnQgeyBJZFRva2VuUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9tb2RlbC9pZF90b2tlbic7XG5pbXBvcnQgeyBBdXRoIH0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBTaWduSW5XaXRoQ3VzdG9tVG9rZW5SZXF1ZXN0IHtcbiAgdG9rZW46IHN0cmluZztcbiAgcmV0dXJuU2VjdXJlVG9rZW46IGJvb2xlYW47XG4gIHRlbmFudElkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25JbldpdGhDdXN0b21Ub2tlblJlc3BvbnNlIGV4dGVuZHMgSWRUb2tlblJlc3BvbnNlIHt9XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzaWduSW5XaXRoQ3VzdG9tVG9rZW4oXG4gIGF1dGg6IEF1dGgsXG4gIHJlcXVlc3Q6IFNpZ25JbldpdGhDdXN0b21Ub2tlblJlcXVlc3Rcbik6IFByb21pc2U8U2lnbkluV2l0aEN1c3RvbVRva2VuUmVzcG9uc2U+IHtcbiAgcmV0dXJuIF9wZXJmb3JtU2lnbkluUmVxdWVzdDxcbiAgICBTaWduSW5XaXRoQ3VzdG9tVG9rZW5SZXF1ZXN0LFxuICAgIFNpZ25JbldpdGhDdXN0b21Ub2tlblJlc3BvbnNlXG4gID4oXG4gICAgYXV0aCxcbiAgICBIdHRwTWV0aG9kLlBPU1QsXG4gICAgRW5kcG9pbnQuU0lHTl9JTl9XSVRIX0NVU1RPTV9UT0tFTixcbiAgICBfYWRkVGlkSWZOZWNlc3NhcnkoYXV0aCwgcmVxdWVzdClcbiAgKTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBBdXRoLCBVc2VyQ3JlZGVudGlhbCB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5cbmltcG9ydCB7IHNpZ25JbldpdGhDdXN0b21Ub2tlbiBhcyBnZXRJZFRva2VuUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9hcGkvYXV0aGVudGljYXRpb24vY3VzdG9tX3Rva2VuJztcbmltcG9ydCB7IElkVG9rZW5SZXNwb25zZSB9IGZyb20gJy4uLy4uL21vZGVsL2lkX3Rva2VuJztcbmltcG9ydCB7IFVzZXJDcmVkZW50aWFsSW1wbCB9IGZyb20gJy4uL3VzZXIvdXNlcl9jcmVkZW50aWFsX2ltcGwnO1xuaW1wb3J0IHsgX2Nhc3RBdXRoIH0gZnJvbSAnLi4vYXV0aC9hdXRoX2ltcGwnO1xuaW1wb3J0IHsgT3BlcmF0aW9uVHlwZSB9IGZyb20gJy4uLy4uL21vZGVsL2VudW1zJztcblxuLyoqXG4gKiBBc3luY2hyb25vdXNseSBzaWducyBpbiB1c2luZyBhIGN1c3RvbSB0b2tlbi5cbiAqXG4gKiBAcmVtYXJrc1xuICogQ3VzdG9tIHRva2VucyBhcmUgdXNlZCB0byBpbnRlZ3JhdGUgRmlyZWJhc2UgQXV0aCB3aXRoIGV4aXN0aW5nIGF1dGggc3lzdGVtcywgYW5kIG11c3RcbiAqIGJlIGdlbmVyYXRlZCBieSBhbiBhdXRoIGJhY2tlbmQgdXNpbmcgdGhlXG4gKiB7QGxpbmsgaHR0cHM6Ly9maXJlYmFzZS5nb29nbGUuY29tL2RvY3MvcmVmZXJlbmNlL2FkbWluL25vZGUvYWRtaW4uYXV0aC5BdXRoI2NyZWF0ZWN1c3RvbXRva2VuIHwgY3JlYXRlQ3VzdG9tVG9rZW59XG4gKiBtZXRob2QgaW4gdGhlIHtAbGluayBodHRwczovL2ZpcmViYXNlLmdvb2dsZS5jb20vZG9jcy9hdXRoL2FkbWluIHwgQWRtaW4gU0RLfSAuXG4gKlxuICogRmFpbHMgd2l0aCBhbiBlcnJvciBpZiB0aGUgdG9rZW4gaXMgaW52YWxpZCwgZXhwaXJlZCwgb3Igbm90IGFjY2VwdGVkIGJ5IHRoZSBGaXJlYmFzZSBBdXRoIHNlcnZpY2UuXG4gKlxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxuICogQHBhcmFtIGN1c3RvbVRva2VuIC0gVGhlIGN1c3RvbSB0b2tlbiB0byBzaWduIGluIHdpdGguXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2lnbkluV2l0aEN1c3RvbVRva2VuKFxuICBhdXRoOiBBdXRoLFxuICBjdXN0b21Ub2tlbjogc3RyaW5nXG4pOiBQcm9taXNlPFVzZXJDcmVkZW50aWFsPiB7XG4gIGNvbnN0IGF1dGhJbnRlcm5hbCA9IF9jYXN0QXV0aChhdXRoKTtcbiAgY29uc3QgcmVzcG9uc2U6IElkVG9rZW5SZXNwb25zZSA9IGF3YWl0IGdldElkVG9rZW5SZXNwb25zZShhdXRoSW50ZXJuYWwsIHtcbiAgICB0b2tlbjogY3VzdG9tVG9rZW4sXG4gICAgcmV0dXJuU2VjdXJlVG9rZW46IHRydWVcbiAgfSk7XG4gIGNvbnN0IGNyZWQgPSBhd2FpdCBVc2VyQ3JlZGVudGlhbEltcGwuX2Zyb21JZFRva2VuUmVzcG9uc2UoXG4gICAgYXV0aEludGVybmFsLFxuICAgIE9wZXJhdGlvblR5cGUuU0lHTl9JTixcbiAgICByZXNwb25zZVxuICApO1xuICBhd2FpdCBhdXRoSW50ZXJuYWwuX3VwZGF0ZUN1cnJlbnRVc2VyKGNyZWQudXNlcik7XG4gIHJldHVybiBjcmVkO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7XG4gIEZhY3RvcklkLFxuICBNdWx0aUZhY3RvckluZm8sXG4gIFBob25lTXVsdGlGYWN0b3JJbmZvLFxuICBUb3RwTXVsdGlGYWN0b3JJbmZvXG59IGZyb20gJy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5pbXBvcnQge1xuICBQaG9uZU1mYUVucm9sbG1lbnQsXG4gIE1mYUVucm9sbG1lbnQsXG4gIFRvdHBNZmFFbnJvbGxtZW50XG59IGZyb20gJy4uL2FwaS9hY2NvdW50X21hbmFnZW1lbnQvbWZhJztcbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi9jb3JlL2Vycm9ycyc7XG5pbXBvcnQgeyBfZmFpbCB9IGZyb20gJy4uL2NvcmUvdXRpbC9hc3NlcnQnO1xuaW1wb3J0IHsgQXV0aEludGVybmFsIH0gZnJvbSAnLi4vbW9kZWwvYXV0aCc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBNdWx0aUZhY3RvckluZm9JbXBsIGltcGxlbWVudHMgTXVsdGlGYWN0b3JJbmZvIHtcbiAgcmVhZG9ubHkgdWlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRpc3BsYXlOYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgcmVhZG9ubHkgZW5yb2xsbWVudFRpbWU6IHN0cmluZztcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IocmVhZG9ubHkgZmFjdG9ySWQ6IEZhY3RvcklkLCByZXNwb25zZTogTWZhRW5yb2xsbWVudCkge1xuICAgIHRoaXMudWlkID0gcmVzcG9uc2UubWZhRW5yb2xsbWVudElkO1xuICAgIHRoaXMuZW5yb2xsbWVudFRpbWUgPSBuZXcgRGF0ZShyZXNwb25zZS5lbnJvbGxlZEF0KS50b1VUQ1N0cmluZygpO1xuICAgIHRoaXMuZGlzcGxheU5hbWUgPSByZXNwb25zZS5kaXNwbGF5TmFtZTtcbiAgfVxuXG4gIHN0YXRpYyBfZnJvbVNlcnZlclJlc3BvbnNlKFxuICAgIGF1dGg6IEF1dGhJbnRlcm5hbCxcbiAgICBlbnJvbGxtZW50OiBNZmFFbnJvbGxtZW50XG4gICk6IE11bHRpRmFjdG9ySW5mb0ltcGwge1xuICAgIGlmICgncGhvbmVJbmZvJyBpbiBlbnJvbGxtZW50KSB7XG4gICAgICByZXR1cm4gUGhvbmVNdWx0aUZhY3RvckluZm9JbXBsLl9mcm9tU2VydmVyUmVzcG9uc2UoYXV0aCwgZW5yb2xsbWVudCk7XG4gICAgfSBlbHNlIGlmICgndG90cEluZm8nIGluIGVucm9sbG1lbnQpIHtcbiAgICAgIHJldHVybiBUb3RwTXVsdGlGYWN0b3JJbmZvSW1wbC5fZnJvbVNlcnZlclJlc3BvbnNlKGF1dGgsIGVucm9sbG1lbnQpO1xuICAgIH1cbiAgICByZXR1cm4gX2ZhaWwoYXV0aCwgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUik7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFBob25lTXVsdGlGYWN0b3JJbmZvSW1wbFxuICBleHRlbmRzIE11bHRpRmFjdG9ySW5mb0ltcGxcbiAgaW1wbGVtZW50cyBQaG9uZU11bHRpRmFjdG9ySW5mb1xue1xuICByZWFkb25seSBwaG9uZU51bWJlcjogc3RyaW5nO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IocmVzcG9uc2U6IFBob25lTWZhRW5yb2xsbWVudCkge1xuICAgIHN1cGVyKEZhY3RvcklkLlBIT05FLCByZXNwb25zZSk7XG4gICAgdGhpcy5waG9uZU51bWJlciA9IHJlc3BvbnNlLnBob25lSW5mbztcbiAgfVxuXG4gIHN0YXRpYyBfZnJvbVNlcnZlclJlc3BvbnNlKFxuICAgIF9hdXRoOiBBdXRoSW50ZXJuYWwsXG4gICAgZW5yb2xsbWVudDogTWZhRW5yb2xsbWVudFxuICApOiBQaG9uZU11bHRpRmFjdG9ySW5mb0ltcGwge1xuICAgIHJldHVybiBuZXcgUGhvbmVNdWx0aUZhY3RvckluZm9JbXBsKGVucm9sbG1lbnQgYXMgUGhvbmVNZmFFbnJvbGxtZW50KTtcbiAgfVxufVxuZXhwb3J0IGNsYXNzIFRvdHBNdWx0aUZhY3RvckluZm9JbXBsXG4gIGV4dGVuZHMgTXVsdGlGYWN0b3JJbmZvSW1wbFxuICBpbXBsZW1lbnRzIFRvdHBNdWx0aUZhY3RvckluZm9cbntcbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihyZXNwb25zZTogVG90cE1mYUVucm9sbG1lbnQpIHtcbiAgICBzdXBlcihGYWN0b3JJZC5UT1RQLCByZXNwb25zZSk7XG4gIH1cblxuICBzdGF0aWMgX2Zyb21TZXJ2ZXJSZXNwb25zZShcbiAgICBfYXV0aDogQXV0aEludGVybmFsLFxuICAgIGVucm9sbG1lbnQ6IE1mYUVucm9sbG1lbnRcbiAgKTogVG90cE11bHRpRmFjdG9ySW5mb0ltcGwge1xuICAgIHJldHVybiBuZXcgVG90cE11bHRpRmFjdG9ySW5mb0ltcGwoZW5yb2xsbWVudCBhcyBUb3RwTWZhRW5yb2xsbWVudCk7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBBY3Rpb25Db2RlU2V0dGluZ3MsIEF1dGggfSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuXG5pbXBvcnQgeyBHZXRPb2JDb2RlUmVxdWVzdCB9IGZyb20gJy4uLy4uL2FwaS9hdXRoZW50aWNhdGlvbi9lbWFpbF9hbmRfcGFzc3dvcmQnO1xuaW1wb3J0IHsgQXV0aEVycm9yQ29kZSB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBfYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQnO1xuXG5leHBvcnQgZnVuY3Rpb24gX3NldEFjdGlvbkNvZGVTZXR0aW5nc09uUmVxdWVzdChcbiAgYXV0aDogQXV0aCxcbiAgcmVxdWVzdDogR2V0T29iQ29kZVJlcXVlc3QsXG4gIGFjdGlvbkNvZGVTZXR0aW5nczogQWN0aW9uQ29kZVNldHRpbmdzXG4pOiB2b2lkIHtcbiAgX2Fzc2VydChcbiAgICBhY3Rpb25Db2RlU2V0dGluZ3MudXJsPy5sZW5ndGggPiAwLFxuICAgIGF1dGgsXG4gICAgQXV0aEVycm9yQ29kZS5JTlZBTElEX0NPTlRJTlVFX1VSSVxuICApO1xuICBfYXNzZXJ0KFxuICAgIHR5cGVvZiBhY3Rpb25Db2RlU2V0dGluZ3MuZHluYW1pY0xpbmtEb21haW4gPT09ICd1bmRlZmluZWQnIHx8XG4gICAgICBhY3Rpb25Db2RlU2V0dGluZ3MuZHluYW1pY0xpbmtEb21haW4ubGVuZ3RoID4gMCxcbiAgICBhdXRoLFxuICAgIEF1dGhFcnJvckNvZGUuSU5WQUxJRF9EWU5BTUlDX0xJTktfRE9NQUlOXG4gICk7XG5cbiAgcmVxdWVzdC5jb250aW51ZVVybCA9IGFjdGlvbkNvZGVTZXR0aW5ncy51cmw7XG4gIHJlcXVlc3QuZHluYW1pY0xpbmtEb21haW4gPSBhY3Rpb25Db2RlU2V0dGluZ3MuZHluYW1pY0xpbmtEb21haW47XG4gIHJlcXVlc3QuY2FuSGFuZGxlQ29kZUluQXBwID0gYWN0aW9uQ29kZVNldHRpbmdzLmhhbmRsZUNvZGVJbkFwcDtcblxuICBpZiAoYWN0aW9uQ29kZVNldHRpbmdzLmlPUykge1xuICAgIF9hc3NlcnQoXG4gICAgICBhY3Rpb25Db2RlU2V0dGluZ3MuaU9TLmJ1bmRsZUlkLmxlbmd0aCA+IDAsXG4gICAgICBhdXRoLFxuICAgICAgQXV0aEVycm9yQ29kZS5NSVNTSU5HX0lPU19CVU5ETEVfSURcbiAgICApO1xuICAgIHJlcXVlc3QuaU9TQnVuZGxlSWQgPSBhY3Rpb25Db2RlU2V0dGluZ3MuaU9TLmJ1bmRsZUlkO1xuICB9XG5cbiAgaWYgKGFjdGlvbkNvZGVTZXR0aW5ncy5hbmRyb2lkKSB7XG4gICAgX2Fzc2VydChcbiAgICAgIGFjdGlvbkNvZGVTZXR0aW5ncy5hbmRyb2lkLnBhY2thZ2VOYW1lLmxlbmd0aCA+IDAsXG4gICAgICBhdXRoLFxuICAgICAgQXV0aEVycm9yQ29kZS5NSVNTSU5HX0FORFJPSURfUEFDS0FHRV9OQU1FXG4gICAgKTtcbiAgICByZXF1ZXN0LmFuZHJvaWRJbnN0YWxsQXBwID0gYWN0aW9uQ29kZVNldHRpbmdzLmFuZHJvaWQuaW5zdGFsbEFwcDtcbiAgICByZXF1ZXN0LmFuZHJvaWRNaW5pbXVtVmVyc2lvbkNvZGUgPVxuICAgICAgYWN0aW9uQ29kZVNldHRpbmdzLmFuZHJvaWQubWluaW11bVZlcnNpb247XG4gICAgcmVxdWVzdC5hbmRyb2lkUGFja2FnZU5hbWUgPSBhY3Rpb25Db2RlU2V0dGluZ3MuYW5kcm9pZC5wYWNrYWdlTmFtZTtcbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7XG4gIEFjdGlvbkNvZGVJbmZvLFxuICBBY3Rpb25Db2RlT3BlcmF0aW9uLFxuICBBY3Rpb25Db2RlU2V0dGluZ3MsXG4gIEF1dGgsXG4gIFVzZXJDcmVkZW50aWFsXG59IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5cbmltcG9ydCAqIGFzIGFjY291bnQgZnJvbSAnLi4vLi4vYXBpL2FjY291bnRfbWFuYWdlbWVudC9lbWFpbF9hbmRfcGFzc3dvcmQnO1xuaW1wb3J0ICogYXMgYXV0aGVudGljYXRpb24gZnJvbSAnLi4vLi4vYXBpL2F1dGhlbnRpY2F0aW9uL2VtYWlsX2FuZF9wYXNzd29yZCc7XG5pbXBvcnQgeyBzaWduVXAsIFNpZ25VcFJlcXVlc3QgfSBmcm9tICcuLi8uLi9hcGkvYXV0aGVudGljYXRpb24vc2lnbl91cCc7XG5pbXBvcnQgeyBNdWx0aUZhY3RvckluZm9JbXBsIH0gZnJvbSAnLi4vLi4vbWZhL21mYV9pbmZvJztcbmltcG9ydCB7IEVtYWlsQXV0aFByb3ZpZGVyIH0gZnJvbSAnLi4vcHJvdmlkZXJzL2VtYWlsJztcbmltcG9ydCB7IFVzZXJDcmVkZW50aWFsSW1wbCB9IGZyb20gJy4uL3VzZXIvdXNlcl9jcmVkZW50aWFsX2ltcGwnO1xuaW1wb3J0IHsgX2Fzc2VydCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0JztcbmltcG9ydCB7IF9zZXRBY3Rpb25Db2RlU2V0dGluZ3NPblJlcXVlc3QgfSBmcm9tICcuL2FjdGlvbl9jb2RlX3NldHRpbmdzJztcbmltcG9ydCB7IHNpZ25JbldpdGhDcmVkZW50aWFsIH0gZnJvbSAnLi9jcmVkZW50aWFsJztcbmltcG9ydCB7IF9jYXN0QXV0aCB9IGZyb20gJy4uL2F1dGgvYXV0aF9pbXBsJztcbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgZ2V0TW9kdWxhckluc3RhbmNlIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuaW1wb3J0IHsgT3BlcmF0aW9uVHlwZSB9IGZyb20gJy4uLy4uL21vZGVsL2VudW1zJztcbmltcG9ydCB7IGhhbmRsZVJlY2FwdGNoYUZsb3cgfSBmcm9tICcuLi8uLi9wbGF0Zm9ybV9icm93c2VyL3JlY2FwdGNoYS9yZWNhcHRjaGFfZW50ZXJwcmlzZV92ZXJpZmllcic7XG5pbXBvcnQgeyBJZFRva2VuUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9tb2RlbC9pZF90b2tlbic7XG5pbXBvcnQgeyBSZWNhcHRjaGFBY3Rpb25OYW1lLCBSZWNhcHRjaGFDbGllbnRUeXBlIH0gZnJvbSAnLi4vLi4vYXBpJztcblxuLyoqXG4gKiBVcGRhdGVzIHRoZSBwYXNzd29yZCBwb2xpY3kgY2FjaGVkIGluIHRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UgaWYgYSBwb2xpY3kgaXMgYWxyZWFkeVxuICogY2FjaGVkIGZvciB0aGUgcHJvamVjdCBvciB0ZW5hbnQuXG4gKlxuICogQHJlbWFya3NcbiAqIFdlIG9ubHkgZmV0Y2ggdGhlIHBhc3N3b3JkIHBvbGljeSBpZiB0aGUgcGFzc3dvcmQgZGlkIG5vdCBtZWV0IHBvbGljeSByZXF1aXJlbWVudHMgYW5kXG4gKiB0aGVyZSBpcyBhbiBleGlzdGluZyBwb2xpY3kgY2FjaGVkLiBBIGRldmVsb3BlciBtdXN0IGNhbGwgdmFsaWRhdGVQYXNzd29yZCBhdCBsZWFzdFxuICogb25jZSBmb3IgdGhlIGNhY2hlIHRvIGJlIGF1dG9tYXRpY2FsbHkgdXBkYXRlZC5cbiAqXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVjYWNoZVBhc3N3b3JkUG9saWN5KGF1dGg6IEF1dGgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYXV0aEludGVybmFsID0gX2Nhc3RBdXRoKGF1dGgpO1xuICBpZiAoYXV0aEludGVybmFsLl9nZXRQYXNzd29yZFBvbGljeUludGVybmFsKCkpIHtcbiAgICBhd2FpdCBhdXRoSW50ZXJuYWwuX3VwZGF0ZVBhc3N3b3JkUG9saWN5KCk7XG4gIH1cbn1cblxuLyoqXG4gKiBTZW5kcyBhIHBhc3N3b3JkIHJlc2V0IGVtYWlsIHRvIHRoZSBnaXZlbiBlbWFpbCBhZGRyZXNzLlxuICpcbiAqIEByZW1hcmtzXG4gKiBUbyBjb21wbGV0ZSB0aGUgcGFzc3dvcmQgcmVzZXQsIGNhbGwge0BsaW5rIGNvbmZpcm1QYXNzd29yZFJlc2V0fSB3aXRoIHRoZSBjb2RlIHN1cHBsaWVkIGluXG4gKiB0aGUgZW1haWwgc2VudCB0byB0aGUgdXNlciwgYWxvbmcgd2l0aCB0aGUgbmV3IHBhc3N3b3JkIHNwZWNpZmllZCBieSB0aGUgdXNlci5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgamF2YXNjcmlwdFxuICogY29uc3QgYWN0aW9uQ29kZVNldHRpbmdzID0ge1xuICogICB1cmw6ICdodHRwczovL3d3dy5leGFtcGxlLmNvbS8/ZW1haWw9dXNlckBleGFtcGxlLmNvbScsXG4gKiAgIGlPUzoge1xuICogICAgICBidW5kbGVJZDogJ2NvbS5leGFtcGxlLmlvcydcbiAqICAgfSxcbiAqICAgYW5kcm9pZDoge1xuICogICAgIHBhY2thZ2VOYW1lOiAnY29tLmV4YW1wbGUuYW5kcm9pZCcsXG4gKiAgICAgaW5zdGFsbEFwcDogdHJ1ZSxcbiAqICAgICBtaW5pbXVtVmVyc2lvbjogJzEyJ1xuICogICB9LFxuICogICBoYW5kbGVDb2RlSW5BcHA6IHRydWVcbiAqIH07XG4gKiBhd2FpdCBzZW5kUGFzc3dvcmRSZXNldEVtYWlsKGF1dGgsICd1c2VyQGV4YW1wbGUuY29tJywgYWN0aW9uQ29kZVNldHRpbmdzKTtcbiAqIC8vIE9idGFpbiBjb2RlIGZyb20gdXNlci5cbiAqIGF3YWl0IGNvbmZpcm1QYXNzd29yZFJlc2V0KCd1c2VyQGV4YW1wbGUuY29tJywgY29kZSk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXG4gKiBAcGFyYW0gZW1haWwgLSBUaGUgdXNlcidzIGVtYWlsIGFkZHJlc3MuXG4gKiBAcGFyYW0gYWN0aW9uQ29kZVNldHRpbmdzIC0gVGhlIHtAbGluayBBY3Rpb25Db2RlU2V0dGluZ3N9LlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlbmRQYXNzd29yZFJlc2V0RW1haWwoXG4gIGF1dGg6IEF1dGgsXG4gIGVtYWlsOiBzdHJpbmcsXG4gIGFjdGlvbkNvZGVTZXR0aW5ncz86IEFjdGlvbkNvZGVTZXR0aW5nc1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGF1dGhJbnRlcm5hbCA9IF9jYXN0QXV0aChhdXRoKTtcbiAgY29uc3QgcmVxdWVzdDogYXV0aGVudGljYXRpb24uUGFzc3dvcmRSZXNldFJlcXVlc3QgPSB7XG4gICAgcmVxdWVzdFR5cGU6IEFjdGlvbkNvZGVPcGVyYXRpb24uUEFTU1dPUkRfUkVTRVQsXG4gICAgZW1haWwsXG4gICAgY2xpZW50VHlwZTogUmVjYXB0Y2hhQ2xpZW50VHlwZS5XRUJcbiAgfTtcbiAgaWYgKGFjdGlvbkNvZGVTZXR0aW5ncykge1xuICAgIF9zZXRBY3Rpb25Db2RlU2V0dGluZ3NPblJlcXVlc3QoYXV0aEludGVybmFsLCByZXF1ZXN0LCBhY3Rpb25Db2RlU2V0dGluZ3MpO1xuICB9XG4gIGF3YWl0IGhhbmRsZVJlY2FwdGNoYUZsb3coXG4gICAgYXV0aEludGVybmFsLFxuICAgIHJlcXVlc3QsXG4gICAgUmVjYXB0Y2hhQWN0aW9uTmFtZS5HRVRfT09CX0NPREUsXG4gICAgYXV0aGVudGljYXRpb24uc2VuZFBhc3N3b3JkUmVzZXRFbWFpbFxuICApO1xufVxuXG4vKipcbiAqIENvbXBsZXRlcyB0aGUgcGFzc3dvcmQgcmVzZXQgcHJvY2VzcywgZ2l2ZW4gYSBjb25maXJtYXRpb24gY29kZSBhbmQgbmV3IHBhc3N3b3JkLlxuICpcbiAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cbiAqIEBwYXJhbSBvb2JDb2RlIC0gQSBjb25maXJtYXRpb24gY29kZSBzZW50IHRvIHRoZSB1c2VyLlxuICogQHBhcmFtIG5ld1Bhc3N3b3JkIC0gVGhlIG5ldyBwYXNzd29yZC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb25maXJtUGFzc3dvcmRSZXNldChcbiAgYXV0aDogQXV0aCxcbiAgb29iQ29kZTogc3RyaW5nLFxuICBuZXdQYXNzd29yZDogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgYWNjb3VudFxuICAgIC5yZXNldFBhc3N3b3JkKGdldE1vZHVsYXJJbnN0YW5jZShhdXRoKSwge1xuICAgICAgb29iQ29kZSxcbiAgICAgIG5ld1Bhc3N3b3JkXG4gICAgfSlcbiAgICAuY2F0Y2goYXN5bmMgZXJyb3IgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBlcnJvci5jb2RlID09PVxuICAgICAgICBgYXV0aC8ke0F1dGhFcnJvckNvZGUuUEFTU1dPUkRfRE9FU19OT1RfTUVFVF9SRVFVSVJFTUVOVFN9YFxuICAgICAgKSB7XG4gICAgICAgIHZvaWQgcmVjYWNoZVBhc3N3b3JkUG9saWN5KGF1dGgpO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbiAgLy8gRG8gbm90IHJldHVybiB0aGUgZW1haWwuXG59XG5cbi8qKlxuICogQXBwbGllcyBhIHZlcmlmaWNhdGlvbiBjb2RlIHNlbnQgdG8gdGhlIHVzZXIgYnkgZW1haWwgb3Igb3RoZXIgb3V0LW9mLWJhbmQgbWVjaGFuaXNtLlxuICpcbiAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cbiAqIEBwYXJhbSBvb2JDb2RlIC0gQSB2ZXJpZmljYXRpb24gY29kZSBzZW50IHRvIHRoZSB1c2VyLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFwcGx5QWN0aW9uQ29kZShcbiAgYXV0aDogQXV0aCxcbiAgb29iQ29kZTogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgYWNjb3VudC5hcHBseUFjdGlvbkNvZGUoZ2V0TW9kdWxhckluc3RhbmNlKGF1dGgpLCB7IG9vYkNvZGUgfSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGEgdmVyaWZpY2F0aW9uIGNvZGUgc2VudCB0byB0aGUgdXNlciBieSBlbWFpbCBvciBvdGhlciBvdXQtb2YtYmFuZCBtZWNoYW5pc20uXG4gKlxuICogQHJldHVybnMgbWV0YWRhdGEgYWJvdXQgdGhlIGNvZGUuXG4gKlxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxuICogQHBhcmFtIG9vYkNvZGUgLSBBIHZlcmlmaWNhdGlvbiBjb2RlIHNlbnQgdG8gdGhlIHVzZXIuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hlY2tBY3Rpb25Db2RlKFxuICBhdXRoOiBBdXRoLFxuICBvb2JDb2RlOiBzdHJpbmdcbik6IFByb21pc2U8QWN0aW9uQ29kZUluZm8+IHtcbiAgY29uc3QgYXV0aE1vZHVsYXIgPSBnZXRNb2R1bGFySW5zdGFuY2UoYXV0aCk7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYWNjb3VudC5yZXNldFBhc3N3b3JkKGF1dGhNb2R1bGFyLCB7IG9vYkNvZGUgfSk7XG5cbiAgLy8gRW1haWwgY291bGQgYmUgZW1wdHkgb25seSBpZiB0aGUgcmVxdWVzdCB0eXBlIGlzIEVNQUlMX1NJR05JTiBvclxuICAvLyBWRVJJRllfQU5EX0NIQU5HRV9FTUFJTC5cbiAgLy8gTmV3IGVtYWlsIHNob3VsZCBub3QgYmUgZW1wdHkgaWYgdGhlIHJlcXVlc3QgdHlwZSBpc1xuICAvLyBWRVJJRllfQU5EX0NIQU5HRV9FTUFJTC5cbiAgLy8gTXVsdGktZmFjdG9yIGluZm8gY291bGQgbm90IGJlIGVtcHR5IGlmIHRoZSByZXF1ZXN0IHR5cGUgaXNcbiAgLy8gUkVWRVJUX1NFQ09ORF9GQUNUT1JfQURESVRJT04uXG4gIGNvbnN0IG9wZXJhdGlvbiA9IHJlc3BvbnNlLnJlcXVlc3RUeXBlO1xuICBfYXNzZXJ0KG9wZXJhdGlvbiwgYXV0aE1vZHVsYXIsIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IpO1xuICBzd2l0Y2ggKG9wZXJhdGlvbikge1xuICAgIGNhc2UgQWN0aW9uQ29kZU9wZXJhdGlvbi5FTUFJTF9TSUdOSU46XG4gICAgICBicmVhaztcbiAgICBjYXNlIEFjdGlvbkNvZGVPcGVyYXRpb24uVkVSSUZZX0FORF9DSEFOR0VfRU1BSUw6XG4gICAgICBfYXNzZXJ0KHJlc3BvbnNlLm5ld0VtYWlsLCBhdXRoTW9kdWxhciwgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUik7XG4gICAgICBicmVhaztcbiAgICBjYXNlIEFjdGlvbkNvZGVPcGVyYXRpb24uUkVWRVJUX1NFQ09ORF9GQUNUT1JfQURESVRJT046XG4gICAgICBfYXNzZXJ0KHJlc3BvbnNlLm1mYUluZm8sIGF1dGhNb2R1bGFyLCBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SKTtcbiAgICAvLyBmYWxsIHRocm91Z2hcbiAgICBkZWZhdWx0OlxuICAgICAgX2Fzc2VydChyZXNwb25zZS5lbWFpbCwgYXV0aE1vZHVsYXIsIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IpO1xuICB9XG5cbiAgLy8gVGhlIG11bHRpLWZhY3RvciBpbmZvIGZvciByZXZlcnQgc2Vjb25kIGZhY3RvciBhZGRpdGlvblxuICBsZXQgbXVsdGlGYWN0b3JJbmZvOiBNdWx0aUZhY3RvckluZm9JbXBsIHwgbnVsbCA9IG51bGw7XG4gIGlmIChyZXNwb25zZS5tZmFJbmZvKSB7XG4gICAgbXVsdGlGYWN0b3JJbmZvID0gTXVsdGlGYWN0b3JJbmZvSW1wbC5fZnJvbVNlcnZlclJlc3BvbnNlKFxuICAgICAgX2Nhc3RBdXRoKGF1dGhNb2R1bGFyKSxcbiAgICAgIHJlc3BvbnNlLm1mYUluZm9cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBkYXRhOiB7XG4gICAgICBlbWFpbDpcbiAgICAgICAgKHJlc3BvbnNlLnJlcXVlc3RUeXBlID09PSBBY3Rpb25Db2RlT3BlcmF0aW9uLlZFUklGWV9BTkRfQ0hBTkdFX0VNQUlMXG4gICAgICAgICAgPyByZXNwb25zZS5uZXdFbWFpbFxuICAgICAgICAgIDogcmVzcG9uc2UuZW1haWwpIHx8IG51bGwsXG4gICAgICBwcmV2aW91c0VtYWlsOlxuICAgICAgICAocmVzcG9uc2UucmVxdWVzdFR5cGUgPT09IEFjdGlvbkNvZGVPcGVyYXRpb24uVkVSSUZZX0FORF9DSEFOR0VfRU1BSUxcbiAgICAgICAgICA/IHJlc3BvbnNlLmVtYWlsXG4gICAgICAgICAgOiByZXNwb25zZS5uZXdFbWFpbCkgfHwgbnVsbCxcbiAgICAgIG11bHRpRmFjdG9ySW5mb1xuICAgIH0sXG4gICAgb3BlcmF0aW9uXG4gIH07XG59XG5cbi8qKlxuICogQ2hlY2tzIGEgcGFzc3dvcmQgcmVzZXQgY29kZSBzZW50IHRvIHRoZSB1c2VyIGJ5IGVtYWlsIG9yIG90aGVyIG91dC1vZi1iYW5kIG1lY2hhbmlzbS5cbiAqXG4gKiBAcmV0dXJucyB0aGUgdXNlcidzIGVtYWlsIGFkZHJlc3MgaWYgdmFsaWQuXG4gKlxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxuICogQHBhcmFtIGNvZGUgLSBBIHZlcmlmaWNhdGlvbiBjb2RlIHNlbnQgdG8gdGhlIHVzZXIuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdmVyaWZ5UGFzc3dvcmRSZXNldENvZGUoXG4gIGF1dGg6IEF1dGgsXG4gIGNvZGU6IHN0cmluZ1xuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCBjaGVja0FjdGlvbkNvZGUoZ2V0TW9kdWxhckluc3RhbmNlKGF1dGgpLCBjb2RlKTtcbiAgLy8gRW1haWwgc2hvdWxkIGFsd2F5cyBiZSBwcmVzZW50IHNpbmNlIGEgY29kZSB3YXMgc2VudCB0byBpdFxuICByZXR1cm4gZGF0YS5lbWFpbCE7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB1c2VyIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgZW1haWwgYWRkcmVzcyBhbmQgcGFzc3dvcmQuXG4gKlxuICogQHJlbWFya3NcbiAqIE9uIHN1Y2Nlc3NmdWwgY3JlYXRpb24gb2YgdGhlIHVzZXIgYWNjb3VudCwgdGhpcyB1c2VyIHdpbGwgYWxzbyBiZSBzaWduZWQgaW4gdG8geW91ciBhcHBsaWNhdGlvbi5cbiAqXG4gKiBVc2VyIGFjY291bnQgY3JlYXRpb24gY2FuIGZhaWwgaWYgdGhlIGFjY291bnQgYWxyZWFkeSBleGlzdHMgb3IgdGhlIHBhc3N3b3JkIGlzIGludmFsaWQuXG4gKlxuICogTm90ZTogVGhlIGVtYWlsIGFkZHJlc3MgYWN0cyBhcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgdXNlciBhbmQgZW5hYmxlcyBhbiBlbWFpbC1iYXNlZFxuICogcGFzc3dvcmQgcmVzZXQuIFRoaXMgZnVuY3Rpb24gd2lsbCBjcmVhdGUgYSBuZXcgdXNlciBhY2NvdW50IGFuZCBzZXQgdGhlIGluaXRpYWwgdXNlciBwYXNzd29yZC5cbiAqXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXG4gKiBAcGFyYW0gZW1haWwgLSBUaGUgdXNlcidzIGVtYWlsIGFkZHJlc3MuXG4gKiBAcGFyYW0gcGFzc3dvcmQgLSBUaGUgdXNlcidzIGNob3NlbiBwYXNzd29yZC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVVc2VyV2l0aEVtYWlsQW5kUGFzc3dvcmQoXG4gIGF1dGg6IEF1dGgsXG4gIGVtYWlsOiBzdHJpbmcsXG4gIHBhc3N3b3JkOiBzdHJpbmdcbik6IFByb21pc2U8VXNlckNyZWRlbnRpYWw+IHtcbiAgY29uc3QgYXV0aEludGVybmFsID0gX2Nhc3RBdXRoKGF1dGgpO1xuICBjb25zdCByZXF1ZXN0OiBTaWduVXBSZXF1ZXN0ID0ge1xuICAgIHJldHVyblNlY3VyZVRva2VuOiB0cnVlLFxuICAgIGVtYWlsLFxuICAgIHBhc3N3b3JkLFxuICAgIGNsaWVudFR5cGU6IFJlY2FwdGNoYUNsaWVudFR5cGUuV0VCXG4gIH07XG4gIGNvbnN0IHNpZ25VcFJlc3BvbnNlOiBQcm9taXNlPElkVG9rZW5SZXNwb25zZT4gPSBoYW5kbGVSZWNhcHRjaGFGbG93KFxuICAgIGF1dGhJbnRlcm5hbCxcbiAgICByZXF1ZXN0LFxuICAgIFJlY2FwdGNoYUFjdGlvbk5hbWUuU0lHTl9VUF9QQVNTV09SRCxcbiAgICBzaWduVXBcbiAgKTtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzaWduVXBSZXNwb25zZS5jYXRjaChlcnJvciA9PiB7XG4gICAgaWYgKFxuICAgICAgZXJyb3IuY29kZSA9PT0gYGF1dGgvJHtBdXRoRXJyb3JDb2RlLlBBU1NXT1JEX0RPRVNfTk9UX01FRVRfUkVRVUlSRU1FTlRTfWBcbiAgICApIHtcbiAgICAgIHZvaWQgcmVjYWNoZVBhc3N3b3JkUG9saWN5KGF1dGgpO1xuICAgIH1cblxuICAgIHRocm93IGVycm9yO1xuICB9KTtcblxuICBjb25zdCB1c2VyQ3JlZGVudGlhbCA9IGF3YWl0IFVzZXJDcmVkZW50aWFsSW1wbC5fZnJvbUlkVG9rZW5SZXNwb25zZShcbiAgICBhdXRoSW50ZXJuYWwsXG4gICAgT3BlcmF0aW9uVHlwZS5TSUdOX0lOLFxuICAgIHJlc3BvbnNlXG4gICk7XG4gIGF3YWl0IGF1dGhJbnRlcm5hbC5fdXBkYXRlQ3VycmVudFVzZXIodXNlckNyZWRlbnRpYWwudXNlcik7XG5cbiAgcmV0dXJuIHVzZXJDcmVkZW50aWFsO1xufVxuXG4vKipcbiAqIEFzeW5jaHJvbm91c2x5IHNpZ25zIGluIHVzaW5nIGFuIGVtYWlsIGFuZCBwYXNzd29yZC5cbiAqXG4gKiBAcmVtYXJrc1xuICogRmFpbHMgd2l0aCBhbiBlcnJvciBpZiB0aGUgZW1haWwgYWRkcmVzcyBhbmQgcGFzc3dvcmQgZG8gbm90IG1hdGNoLlxuICpcbiAqIE5vdGU6IFRoZSB1c2VyJ3MgcGFzc3dvcmQgaXMgTk9UIHRoZSBwYXNzd29yZCB1c2VkIHRvIGFjY2VzcyB0aGUgdXNlcidzIGVtYWlsIGFjY291bnQuIFRoZVxuICogZW1haWwgYWRkcmVzcyBzZXJ2ZXMgYXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHVzZXIsIGFuZCB0aGUgcGFzc3dvcmQgaXMgdXNlZCB0byBhY2Nlc3NcbiAqIHRoZSB1c2VyJ3MgYWNjb3VudCBpbiB5b3VyIEZpcmViYXNlIHByb2plY3QuIFNlZSBhbHNvOiB7QGxpbmsgY3JlYXRlVXNlcldpdGhFbWFpbEFuZFBhc3N3b3JkfS5cbiAqXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXG4gKiBAcGFyYW0gZW1haWwgLSBUaGUgdXNlcnMgZW1haWwgYWRkcmVzcy5cbiAqIEBwYXJhbSBwYXNzd29yZCAtIFRoZSB1c2VycyBwYXNzd29yZC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaWduSW5XaXRoRW1haWxBbmRQYXNzd29yZChcbiAgYXV0aDogQXV0aCxcbiAgZW1haWw6IHN0cmluZyxcbiAgcGFzc3dvcmQ6IHN0cmluZ1xuKTogUHJvbWlzZTxVc2VyQ3JlZGVudGlhbD4ge1xuICByZXR1cm4gc2lnbkluV2l0aENyZWRlbnRpYWwoXG4gICAgZ2V0TW9kdWxhckluc3RhbmNlKGF1dGgpLFxuICAgIEVtYWlsQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWwoZW1haWwsIHBhc3N3b3JkKVxuICApLmNhdGNoKGFzeW5jIGVycm9yID0+IHtcbiAgICBpZiAoXG4gICAgICBlcnJvci5jb2RlID09PSBgYXV0aC8ke0F1dGhFcnJvckNvZGUuUEFTU1dPUkRfRE9FU19OT1RfTUVFVF9SRVFVSVJFTUVOVFN9YFxuICAgICkge1xuICAgICAgdm9pZCByZWNhY2hlUGFzc3dvcmRQb2xpY3koYXV0aCk7XG4gICAgfVxuXG4gICAgdGhyb3cgZXJyb3I7XG4gIH0pO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7XG4gIEFjdGlvbkNvZGVPcGVyYXRpb24sXG4gIEFjdGlvbkNvZGVTZXR0aW5ncyxcbiAgQXV0aCxcbiAgVXNlckNyZWRlbnRpYWxcbn0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcblxuaW1wb3J0ICogYXMgYXBpIGZyb20gJy4uLy4uL2FwaS9hdXRoZW50aWNhdGlvbi9lbWFpbF9hbmRfcGFzc3dvcmQnO1xuaW1wb3J0IHsgQWN0aW9uQ29kZVVSTCB9IGZyb20gJy4uL2FjdGlvbl9jb2RlX3VybCc7XG5pbXBvcnQgeyBFbWFpbEF1dGhQcm92aWRlciB9IGZyb20gJy4uL3Byb3ZpZGVycy9lbWFpbCc7XG5pbXBvcnQgeyBfZ2V0Q3VycmVudFVybCB9IGZyb20gJy4uL3V0aWwvbG9jYXRpb24nO1xuaW1wb3J0IHsgX3NldEFjdGlvbkNvZGVTZXR0aW5nc09uUmVxdWVzdCB9IGZyb20gJy4vYWN0aW9uX2NvZGVfc2V0dGluZ3MnO1xuaW1wb3J0IHsgc2lnbkluV2l0aENyZWRlbnRpYWwgfSBmcm9tICcuL2NyZWRlbnRpYWwnO1xuaW1wb3J0IHsgQXV0aEVycm9yQ29kZSB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBfYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQnO1xuaW1wb3J0IHsgZ2V0TW9kdWxhckluc3RhbmNlIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuaW1wb3J0IHsgX2Nhc3RBdXRoIH0gZnJvbSAnLi4vYXV0aC9hdXRoX2ltcGwnO1xuaW1wb3J0IHsgaGFuZGxlUmVjYXB0Y2hhRmxvdyB9IGZyb20gJy4uLy4uL3BsYXRmb3JtX2Jyb3dzZXIvcmVjYXB0Y2hhL3JlY2FwdGNoYV9lbnRlcnByaXNlX3ZlcmlmaWVyJztcbmltcG9ydCB7IFJlY2FwdGNoYUFjdGlvbk5hbWUsIFJlY2FwdGNoYUNsaWVudFR5cGUgfSBmcm9tICcuLi8uLi9hcGknO1xuXG4vKipcbiAqIFNlbmRzIGEgc2lnbi1pbiBlbWFpbCBsaW5rIHRvIHRoZSB1c2VyIHdpdGggdGhlIHNwZWNpZmllZCBlbWFpbC5cbiAqXG4gKiBAcmVtYXJrc1xuICogVGhlIHNpZ24taW4gb3BlcmF0aW9uIGhhcyB0byBhbHdheXMgYmUgY29tcGxldGVkIGluIHRoZSBhcHAgdW5saWtlIG90aGVyIG91dCBvZiBiYW5kIGVtYWlsXG4gKiBhY3Rpb25zIChwYXNzd29yZCByZXNldCBhbmQgZW1haWwgdmVyaWZpY2F0aW9ucykuIFRoaXMgaXMgYmVjYXVzZSwgYXQgdGhlIGVuZCBvZiB0aGUgZmxvdyxcbiAqIHRoZSB1c2VyIGlzIGV4cGVjdGVkIHRvIGJlIHNpZ25lZCBpbiBhbmQgdGhlaXIgQXV0aCBzdGF0ZSBwZXJzaXN0ZWQgd2l0aGluIHRoZSBhcHAuXG4gKlxuICogVG8gY29tcGxldGUgc2lnbiBpbiB3aXRoIHRoZSBlbWFpbCBsaW5rLCBjYWxsIHtAbGluayBzaWduSW5XaXRoRW1haWxMaW5rfSB3aXRoIHRoZSBlbWFpbFxuICogYWRkcmVzcyBhbmQgdGhlIGVtYWlsIGxpbmsgc3VwcGxpZWQgaW4gdGhlIGVtYWlsIHNlbnQgdG8gdGhlIHVzZXIuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGphdmFzY3JpcHRcbiAqIGNvbnN0IGFjdGlvbkNvZGVTZXR0aW5ncyA9IHtcbiAqICAgdXJsOiAnaHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vP2VtYWlsPXVzZXJAZXhhbXBsZS5jb20nLFxuICogICBpT1M6IHtcbiAqICAgICAgYnVuZGxlSWQ6ICdjb20uZXhhbXBsZS5pb3MnXG4gKiAgIH0sXG4gKiAgIGFuZHJvaWQ6IHtcbiAqICAgICBwYWNrYWdlTmFtZTogJ2NvbS5leGFtcGxlLmFuZHJvaWQnLFxuICogICAgIGluc3RhbGxBcHA6IHRydWUsXG4gKiAgICAgbWluaW11bVZlcnNpb246ICcxMidcbiAqICAgfSxcbiAqICAgaGFuZGxlQ29kZUluQXBwOiB0cnVlXG4gKiB9O1xuICogYXdhaXQgc2VuZFNpZ25JbkxpbmtUb0VtYWlsKGF1dGgsICd1c2VyQGV4YW1wbGUuY29tJywgYWN0aW9uQ29kZVNldHRpbmdzKTtcbiAqIC8vIE9idGFpbiBlbWFpbExpbmsgZnJvbSB0aGUgdXNlci5cbiAqIGlmKGlzU2lnbkluV2l0aEVtYWlsTGluayhhdXRoLCBlbWFpbExpbmspKSB7XG4gKiAgIGF3YWl0IHNpZ25JbldpdGhFbWFpbExpbmsoYXV0aCwgJ3VzZXJAZXhhbXBsZS5jb20nLCBlbWFpbExpbmspO1xuICogfVxuICogYGBgXG4gKlxuICogQHBhcmFtIGF1dGhJbnRlcm5hbCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXG4gKiBAcGFyYW0gZW1haWwgLSBUaGUgdXNlcidzIGVtYWlsIGFkZHJlc3MuXG4gKiBAcGFyYW0gYWN0aW9uQ29kZVNldHRpbmdzIC0gVGhlIHtAbGluayBBY3Rpb25Db2RlU2V0dGluZ3N9LlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlbmRTaWduSW5MaW5rVG9FbWFpbChcbiAgYXV0aDogQXV0aCxcbiAgZW1haWw6IHN0cmluZyxcbiAgYWN0aW9uQ29kZVNldHRpbmdzOiBBY3Rpb25Db2RlU2V0dGluZ3Ncbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhdXRoSW50ZXJuYWwgPSBfY2FzdEF1dGgoYXV0aCk7XG4gIGNvbnN0IHJlcXVlc3Q6IGFwaS5FbWFpbFNpZ25JblJlcXVlc3QgPSB7XG4gICAgcmVxdWVzdFR5cGU6IEFjdGlvbkNvZGVPcGVyYXRpb24uRU1BSUxfU0lHTklOLFxuICAgIGVtYWlsLFxuICAgIGNsaWVudFR5cGU6IFJlY2FwdGNoYUNsaWVudFR5cGUuV0VCXG4gIH07XG4gIGZ1bmN0aW9uIHNldEFjdGlvbkNvZGVTZXR0aW5ncyhcbiAgICByZXF1ZXN0OiBhcGkuRW1haWxTaWduSW5SZXF1ZXN0LFxuICAgIGFjdGlvbkNvZGVTZXR0aW5nczogQWN0aW9uQ29kZVNldHRpbmdzXG4gICk6IHZvaWQge1xuICAgIF9hc3NlcnQoXG4gICAgICBhY3Rpb25Db2RlU2V0dGluZ3MuaGFuZGxlQ29kZUluQXBwLFxuICAgICAgYXV0aEludGVybmFsLFxuICAgICAgQXV0aEVycm9yQ29kZS5BUkdVTUVOVF9FUlJPUlxuICAgICk7XG4gICAgaWYgKGFjdGlvbkNvZGVTZXR0aW5ncykge1xuICAgICAgX3NldEFjdGlvbkNvZGVTZXR0aW5nc09uUmVxdWVzdChcbiAgICAgICAgYXV0aEludGVybmFsLFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICBhY3Rpb25Db2RlU2V0dGluZ3NcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHNldEFjdGlvbkNvZGVTZXR0aW5ncyhyZXF1ZXN0LCBhY3Rpb25Db2RlU2V0dGluZ3MpO1xuICBhd2FpdCBoYW5kbGVSZWNhcHRjaGFGbG93KFxuICAgIGF1dGhJbnRlcm5hbCxcbiAgICByZXF1ZXN0LFxuICAgIFJlY2FwdGNoYUFjdGlvbk5hbWUuR0VUX09PQl9DT0RFLFxuICAgIGFwaS5zZW5kU2lnbkluTGlua1RvRW1haWxcbiAgKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYW4gaW5jb21pbmcgbGluayBpcyBhIHNpZ24taW4gd2l0aCBlbWFpbCBsaW5rIHN1aXRhYmxlIGZvciB7QGxpbmsgc2lnbkluV2l0aEVtYWlsTGlua30uXG4gKlxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxuICogQHBhcmFtIGVtYWlsTGluayAtIFRoZSBsaW5rIHNlbnQgdG8gdGhlIHVzZXIncyBlbWFpbCBhZGRyZXNzLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2lnbkluV2l0aEVtYWlsTGluayhhdXRoOiBBdXRoLCBlbWFpbExpbms6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBhY3Rpb25Db2RlVXJsID0gQWN0aW9uQ29kZVVSTC5wYXJzZUxpbmsoZW1haWxMaW5rKTtcbiAgcmV0dXJuIGFjdGlvbkNvZGVVcmw/Lm9wZXJhdGlvbiA9PT0gQWN0aW9uQ29kZU9wZXJhdGlvbi5FTUFJTF9TSUdOSU47XG59XG5cbi8qKlxuICogQXN5bmNocm9ub3VzbHkgc2lnbnMgaW4gdXNpbmcgYW4gZW1haWwgYW5kIHNpZ24taW4gZW1haWwgbGluay5cbiAqXG4gKiBAcmVtYXJrc1xuICogSWYgbm8gbGluayBpcyBwYXNzZWQsIHRoZSBsaW5rIGlzIGluZmVycmVkIGZyb20gdGhlIGN1cnJlbnQgVVJMLlxuICpcbiAqIEZhaWxzIHdpdGggYW4gZXJyb3IgaWYgdGhlIGVtYWlsIGFkZHJlc3MgaXMgaW52YWxpZCBvciBPVFAgaW4gZW1haWwgbGluayBleHBpcmVzLlxuICpcbiAqIE5vdGU6IENvbmZpcm0gdGhlIGxpbmsgaXMgYSBzaWduLWluIGVtYWlsIGxpbmsgYmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2QgZmlyZWJhc2UuYXV0aC5BdXRoLmlzU2lnbkluV2l0aEVtYWlsTGluay5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgamF2YXNjcmlwdFxuICogY29uc3QgYWN0aW9uQ29kZVNldHRpbmdzID0ge1xuICogICB1cmw6ICdodHRwczovL3d3dy5leGFtcGxlLmNvbS8/ZW1haWw9dXNlckBleGFtcGxlLmNvbScsXG4gKiAgIGlPUzoge1xuICogICAgICBidW5kbGVJZDogJ2NvbS5leGFtcGxlLmlvcydcbiAqICAgfSxcbiAqICAgYW5kcm9pZDoge1xuICogICAgIHBhY2thZ2VOYW1lOiAnY29tLmV4YW1wbGUuYW5kcm9pZCcsXG4gKiAgICAgaW5zdGFsbEFwcDogdHJ1ZSxcbiAqICAgICBtaW5pbXVtVmVyc2lvbjogJzEyJ1xuICogICB9LFxuICogICBoYW5kbGVDb2RlSW5BcHA6IHRydWVcbiAqIH07XG4gKiBhd2FpdCBzZW5kU2lnbkluTGlua1RvRW1haWwoYXV0aCwgJ3VzZXJAZXhhbXBsZS5jb20nLCBhY3Rpb25Db2RlU2V0dGluZ3MpO1xuICogLy8gT2J0YWluIGVtYWlsTGluayBmcm9tIHRoZSB1c2VyLlxuICogaWYoaXNTaWduSW5XaXRoRW1haWxMaW5rKGF1dGgsIGVtYWlsTGluaykpIHtcbiAqICAgYXdhaXQgc2lnbkluV2l0aEVtYWlsTGluayhhdXRoLCAndXNlckBleGFtcGxlLmNvbScsIGVtYWlsTGluayk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXG4gKiBAcGFyYW0gZW1haWwgLSBUaGUgdXNlcidzIGVtYWlsIGFkZHJlc3MuXG4gKiBAcGFyYW0gZW1haWxMaW5rIC0gVGhlIGxpbmsgc2VudCB0byB0aGUgdXNlcidzIGVtYWlsIGFkZHJlc3MuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2lnbkluV2l0aEVtYWlsTGluayhcbiAgYXV0aDogQXV0aCxcbiAgZW1haWw6IHN0cmluZyxcbiAgZW1haWxMaW5rPzogc3RyaW5nXG4pOiBQcm9taXNlPFVzZXJDcmVkZW50aWFsPiB7XG4gIGNvbnN0IGF1dGhNb2R1bGFyID0gZ2V0TW9kdWxhckluc3RhbmNlKGF1dGgpO1xuICBjb25zdCBjcmVkZW50aWFsID0gRW1haWxBdXRoUHJvdmlkZXIuY3JlZGVudGlhbFdpdGhMaW5rKFxuICAgIGVtYWlsLFxuICAgIGVtYWlsTGluayB8fCBfZ2V0Q3VycmVudFVybCgpXG4gICk7XG4gIC8vIENoZWNrIGlmIHRoZSB0ZW5hbnQgSUQgaW4gdGhlIGVtYWlsIGxpbmsgbWF0Y2hlcyB0aGUgdGVuYW50IElEIG9uIEF1dGhcbiAgLy8gaW5zdGFuY2UuXG4gIF9hc3NlcnQoXG4gICAgY3JlZGVudGlhbC5fdGVuYW50SWQgPT09IChhdXRoTW9kdWxhci50ZW5hbnRJZCB8fCBudWxsKSxcbiAgICBhdXRoTW9kdWxhcixcbiAgICBBdXRoRXJyb3JDb2RlLlRFTkFOVF9JRF9NSVNNQVRDSFxuICApO1xuICByZXR1cm4gc2lnbkluV2l0aENyZWRlbnRpYWwoYXV0aE1vZHVsYXIsIGNyZWRlbnRpYWwpO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7XG4gIEVuZHBvaW50LFxuICBIdHRwTWV0aG9kLFxuICBfYWRkVGlkSWZOZWNlc3NhcnksXG4gIF9wZXJmb3JtQXBpUmVxdWVzdFxufSBmcm9tICcuLi9pbmRleCc7XG5pbXBvcnQgeyBBdXRoIH0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVBdXRoVXJpUmVxdWVzdCB7XG4gIGlkZW50aWZpZXI6IHN0cmluZztcbiAgY29udGludWVVcmk6IHN0cmluZztcbiAgdGVuYW50SWQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlQXV0aFVyaVJlc3BvbnNlIHtcbiAgc2lnbmluTWV0aG9kczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVBdXRoVXJpKFxuICBhdXRoOiBBdXRoLFxuICByZXF1ZXN0OiBDcmVhdGVBdXRoVXJpUmVxdWVzdFxuKTogUHJvbWlzZTxDcmVhdGVBdXRoVXJpUmVzcG9uc2U+IHtcbiAgcmV0dXJuIF9wZXJmb3JtQXBpUmVxdWVzdDxDcmVhdGVBdXRoVXJpUmVxdWVzdCwgQ3JlYXRlQXV0aFVyaVJlc3BvbnNlPihcbiAgICBhdXRoLFxuICAgIEh0dHBNZXRob2QuUE9TVCxcbiAgICBFbmRwb2ludC5DUkVBVEVfQVVUSF9VUkksXG4gICAgX2FkZFRpZElmTmVjZXNzYXJ5KGF1dGgsIHJlcXVlc3QpXG4gICk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgQWN0aW9uQ29kZU9wZXJhdGlvbixcbiAgQWN0aW9uQ29kZVNldHRpbmdzLFxuICBBdXRoLFxuICBVc2VyXG59IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5cbmltcG9ydCB7XG4gIGNyZWF0ZUF1dGhVcmksXG4gIENyZWF0ZUF1dGhVcmlSZXF1ZXN0XG59IGZyb20gJy4uLy4uL2FwaS9hdXRoZW50aWNhdGlvbi9jcmVhdGVfYXV0aF91cmknO1xuaW1wb3J0ICogYXMgYXBpIGZyb20gJy4uLy4uL2FwaS9hdXRoZW50aWNhdGlvbi9lbWFpbF9hbmRfcGFzc3dvcmQnO1xuaW1wb3J0IHsgVXNlckludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvdXNlcic7XG5pbXBvcnQgeyBfZ2V0Q3VycmVudFVybCwgX2lzSHR0cE9ySHR0cHMgfSBmcm9tICcuLi91dGlsL2xvY2F0aW9uJztcbmltcG9ydCB7IF9zZXRBY3Rpb25Db2RlU2V0dGluZ3NPblJlcXVlc3QgfSBmcm9tICcuL2FjdGlvbl9jb2RlX3NldHRpbmdzJztcbmltcG9ydCB7IGdldE1vZHVsYXJJbnN0YW5jZSB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcblxuLyoqXG4gKiBHZXRzIHRoZSBsaXN0IG9mIHBvc3NpYmxlIHNpZ24gaW4gbWV0aG9kcyBmb3IgdGhlIGdpdmVuIGVtYWlsIGFkZHJlc3MuXG4gKlxuICogQHJlbWFya3NcbiAqIFRoaXMgaXMgdXNlZnVsIHRvIGRpZmZlcmVudGlhdGUgbWV0aG9kcyBvZiBzaWduLWluIGZvciB0aGUgc2FtZSBwcm92aWRlciwgZWcuXG4gKiB7QGxpbmsgRW1haWxBdXRoUHJvdmlkZXJ9IHdoaWNoIGhhcyAyIG1ldGhvZHMgb2Ygc2lnbi1pbixcbiAqIHtAbGluayBTaWduSW5NZXRob2R9LkVNQUlMX1BBU1NXT1JEIGFuZFxuICoge0BsaW5rIFNpZ25Jbk1ldGhvZH0uRU1BSUxfTElOSy5cbiAqXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXG4gKiBAcGFyYW0gZW1haWwgLSBUaGUgdXNlcidzIGVtYWlsIGFkZHJlc3MuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hTaWduSW5NZXRob2RzRm9yRW1haWwoXG4gIGF1dGg6IEF1dGgsXG4gIGVtYWlsOiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgLy8gY3JlYXRlQXV0aFVyaSByZXR1cm5zIGFuIGVycm9yIGlmIGNvbnRpbnVlIFVSSSBpcyBub3QgaHR0cCBvciBodHRwcy5cbiAgLy8gRm9yIGVudmlyb25tZW50cyBsaWtlIENvcmRvdmEsIENocm9tZSBleHRlbnNpb25zLCBuYXRpdmUgZnJhbWV3b3JrcywgZmlsZVxuICAvLyBzeXN0ZW1zLCBldGMsIHVzZSBodHRwOi8vbG9jYWxob3N0IGFzIGNvbnRpbnVlIFVSTC5cbiAgY29uc3QgY29udGludWVVcmkgPSBfaXNIdHRwT3JIdHRwcygpID8gX2dldEN1cnJlbnRVcmwoKSA6ICdodHRwOi8vbG9jYWxob3N0JztcbiAgY29uc3QgcmVxdWVzdDogQ3JlYXRlQXV0aFVyaVJlcXVlc3QgPSB7XG4gICAgaWRlbnRpZmllcjogZW1haWwsXG4gICAgY29udGludWVVcmlcbiAgfTtcblxuICBjb25zdCB7IHNpZ25pbk1ldGhvZHMgfSA9IGF3YWl0IGNyZWF0ZUF1dGhVcmkoXG4gICAgZ2V0TW9kdWxhckluc3RhbmNlKGF1dGgpLFxuICAgIHJlcXVlc3RcbiAgKTtcblxuICByZXR1cm4gc2lnbmluTWV0aG9kcyB8fCBbXTtcbn1cblxuLyoqXG4gKiBTZW5kcyBhIHZlcmlmaWNhdGlvbiBlbWFpbCB0byBhIHVzZXIuXG4gKlxuICogQHJlbWFya3NcbiAqIFRoZSB2ZXJpZmljYXRpb24gcHJvY2VzcyBpcyBjb21wbGV0ZWQgYnkgY2FsbGluZyB7QGxpbmsgYXBwbHlBY3Rpb25Db2RlfS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgamF2YXNjcmlwdFxuICogY29uc3QgYWN0aW9uQ29kZVNldHRpbmdzID0ge1xuICogICB1cmw6ICdodHRwczovL3d3dy5leGFtcGxlLmNvbS8/ZW1haWw9dXNlckBleGFtcGxlLmNvbScsXG4gKiAgIGlPUzoge1xuICogICAgICBidW5kbGVJZDogJ2NvbS5leGFtcGxlLmlvcydcbiAqICAgfSxcbiAqICAgYW5kcm9pZDoge1xuICogICAgIHBhY2thZ2VOYW1lOiAnY29tLmV4YW1wbGUuYW5kcm9pZCcsXG4gKiAgICAgaW5zdGFsbEFwcDogdHJ1ZSxcbiAqICAgICBtaW5pbXVtVmVyc2lvbjogJzEyJ1xuICogICB9LFxuICogICBoYW5kbGVDb2RlSW5BcHA6IHRydWVcbiAqIH07XG4gKiBhd2FpdCBzZW5kRW1haWxWZXJpZmljYXRpb24odXNlciwgYWN0aW9uQ29kZVNldHRpbmdzKTtcbiAqIC8vIE9idGFpbiBjb2RlIGZyb20gdGhlIHVzZXIuXG4gKiBhd2FpdCBhcHBseUFjdGlvbkNvZGUoYXV0aCwgY29kZSk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdXNlciAtIFRoZSB1c2VyLlxuICogQHBhcmFtIGFjdGlvbkNvZGVTZXR0aW5ncyAtIFRoZSB7QGxpbmsgQWN0aW9uQ29kZVNldHRpbmdzfS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZW5kRW1haWxWZXJpZmljYXRpb24oXG4gIHVzZXI6IFVzZXIsXG4gIGFjdGlvbkNvZGVTZXR0aW5ncz86IEFjdGlvbkNvZGVTZXR0aW5ncyB8IG51bGxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB1c2VySW50ZXJuYWwgPSBnZXRNb2R1bGFySW5zdGFuY2UodXNlcikgYXMgVXNlckludGVybmFsO1xuICBjb25zdCBpZFRva2VuID0gYXdhaXQgdXNlci5nZXRJZFRva2VuKCk7XG4gIGNvbnN0IHJlcXVlc3Q6IGFwaS5WZXJpZnlFbWFpbFJlcXVlc3QgPSB7XG4gICAgcmVxdWVzdFR5cGU6IEFjdGlvbkNvZGVPcGVyYXRpb24uVkVSSUZZX0VNQUlMLFxuICAgIGlkVG9rZW5cbiAgfTtcbiAgaWYgKGFjdGlvbkNvZGVTZXR0aW5ncykge1xuICAgIF9zZXRBY3Rpb25Db2RlU2V0dGluZ3NPblJlcXVlc3QoXG4gICAgICB1c2VySW50ZXJuYWwuYXV0aCxcbiAgICAgIHJlcXVlc3QsXG4gICAgICBhY3Rpb25Db2RlU2V0dGluZ3NcbiAgICApO1xuICB9XG5cbiAgY29uc3QgeyBlbWFpbCB9ID0gYXdhaXQgYXBpLnNlbmRFbWFpbFZlcmlmaWNhdGlvbih1c2VySW50ZXJuYWwuYXV0aCwgcmVxdWVzdCk7XG5cbiAgaWYgKGVtYWlsICE9PSB1c2VyLmVtYWlsKSB7XG4gICAgYXdhaXQgdXNlci5yZWxvYWQoKTtcbiAgfVxufVxuXG4vKipcbiAqIFNlbmRzIGEgdmVyaWZpY2F0aW9uIGVtYWlsIHRvIGEgbmV3IGVtYWlsIGFkZHJlc3MuXG4gKlxuICogQHJlbWFya3NcbiAqIFRoZSB1c2VyJ3MgZW1haWwgd2lsbCBiZSB1cGRhdGVkIHRvIHRoZSBuZXcgb25lIGFmdGVyIGJlaW5nIHZlcmlmaWVkLlxuICpcbiAqIElmIHlvdSBoYXZlIGEgY3VzdG9tIGVtYWlsIGFjdGlvbiBoYW5kbGVyLCB5b3UgY2FuIGNvbXBsZXRlIHRoZSB2ZXJpZmljYXRpb24gcHJvY2VzcyBieSBjYWxsaW5nXG4gKiB7QGxpbmsgYXBwbHlBY3Rpb25Db2RlfS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgamF2YXNjcmlwdFxuICogY29uc3QgYWN0aW9uQ29kZVNldHRpbmdzID0ge1xuICogICB1cmw6ICdodHRwczovL3d3dy5leGFtcGxlLmNvbS8/ZW1haWw9dXNlckBleGFtcGxlLmNvbScsXG4gKiAgIGlPUzoge1xuICogICAgICBidW5kbGVJZDogJ2NvbS5leGFtcGxlLmlvcydcbiAqICAgfSxcbiAqICAgYW5kcm9pZDoge1xuICogICAgIHBhY2thZ2VOYW1lOiAnY29tLmV4YW1wbGUuYW5kcm9pZCcsXG4gKiAgICAgaW5zdGFsbEFwcDogdHJ1ZSxcbiAqICAgICBtaW5pbXVtVmVyc2lvbjogJzEyJ1xuICogICB9LFxuICogICBoYW5kbGVDb2RlSW5BcHA6IHRydWVcbiAqIH07XG4gKiBhd2FpdCB2ZXJpZnlCZWZvcmVVcGRhdGVFbWFpbCh1c2VyLCAnbmV3ZW1haWxAZXhhbXBsZS5jb20nLCBhY3Rpb25Db2RlU2V0dGluZ3MpO1xuICogLy8gT2J0YWluIGNvZGUgZnJvbSB0aGUgdXNlci5cbiAqIGF3YWl0IGFwcGx5QWN0aW9uQ29kZShhdXRoLCBjb2RlKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB1c2VyIC0gVGhlIHVzZXIuXG4gKiBAcGFyYW0gbmV3RW1haWwgLSBUaGUgbmV3IGVtYWlsIGFkZHJlc3MgdG8gYmUgdmVyaWZpZWQgYmVmb3JlIHVwZGF0ZS5cbiAqIEBwYXJhbSBhY3Rpb25Db2RlU2V0dGluZ3MgLSBUaGUge0BsaW5rIEFjdGlvbkNvZGVTZXR0aW5nc30uXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdmVyaWZ5QmVmb3JlVXBkYXRlRW1haWwoXG4gIHVzZXI6IFVzZXIsXG4gIG5ld0VtYWlsOiBzdHJpbmcsXG4gIGFjdGlvbkNvZGVTZXR0aW5ncz86IEFjdGlvbkNvZGVTZXR0aW5ncyB8IG51bGxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB1c2VySW50ZXJuYWwgPSBnZXRNb2R1bGFySW5zdGFuY2UodXNlcikgYXMgVXNlckludGVybmFsO1xuICBjb25zdCBpZFRva2VuID0gYXdhaXQgdXNlci5nZXRJZFRva2VuKCk7XG4gIGNvbnN0IHJlcXVlc3Q6IGFwaS5WZXJpZnlBbmRDaGFuZ2VFbWFpbFJlcXVlc3QgPSB7XG4gICAgcmVxdWVzdFR5cGU6IEFjdGlvbkNvZGVPcGVyYXRpb24uVkVSSUZZX0FORF9DSEFOR0VfRU1BSUwsXG4gICAgaWRUb2tlbixcbiAgICBuZXdFbWFpbFxuICB9O1xuICBpZiAoYWN0aW9uQ29kZVNldHRpbmdzKSB7XG4gICAgX3NldEFjdGlvbkNvZGVTZXR0aW5nc09uUmVxdWVzdChcbiAgICAgIHVzZXJJbnRlcm5hbC5hdXRoLFxuICAgICAgcmVxdWVzdCxcbiAgICAgIGFjdGlvbkNvZGVTZXR0aW5nc1xuICAgICk7XG4gIH1cblxuICBjb25zdCB7IGVtYWlsIH0gPSBhd2FpdCBhcGkudmVyaWZ5QW5kQ2hhbmdlRW1haWwodXNlckludGVybmFsLmF1dGgsIHJlcXVlc3QpO1xuXG4gIGlmIChlbWFpbCAhPT0gdXNlci5lbWFpbCkge1xuICAgIC8vIElmIHRoZSBsb2NhbCBjb3B5IG9mIHRoZSBlbWFpbCBvbiB1c2VyIGlzIG91dGRhdGVkLCByZWxvYWQgdGhlXG4gICAgLy8gdXNlci5cbiAgICBhd2FpdCB1c2VyLnJlbG9hZCgpO1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgRW5kcG9pbnQsIEh0dHBNZXRob2QsIF9wZXJmb3JtQXBpUmVxdWVzdCB9IGZyb20gJy4uL2luZGV4JztcbmltcG9ydCB7IElkVG9rZW5SZXNwb25zZSB9IGZyb20gJy4uLy4uL21vZGVsL2lkX3Rva2VuJztcbmltcG9ydCB7IEF1dGggfSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZVByb2ZpbGVSZXF1ZXN0IHtcbiAgaWRUb2tlbjogc3RyaW5nO1xuICBkaXNwbGF5TmFtZT86IHN0cmluZyB8IG51bGw7XG4gIHBob3RvVXJsPzogc3RyaW5nIHwgbnVsbDtcbiAgcmV0dXJuU2VjdXJlVG9rZW46IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlUHJvZmlsZVJlc3BvbnNlIGV4dGVuZHMgSWRUb2tlblJlc3BvbnNlIHtcbiAgZGlzcGxheU5hbWU/OiBzdHJpbmcgfCBudWxsO1xuICBwaG90b1VybD86IHN0cmluZyB8IG51bGw7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVQcm9maWxlKFxuICBhdXRoOiBBdXRoLFxuICByZXF1ZXN0OiBVcGRhdGVQcm9maWxlUmVxdWVzdFxuKTogUHJvbWlzZTxVcGRhdGVQcm9maWxlUmVzcG9uc2U+IHtcbiAgcmV0dXJuIF9wZXJmb3JtQXBpUmVxdWVzdDxVcGRhdGVQcm9maWxlUmVxdWVzdCwgVXBkYXRlUHJvZmlsZVJlc3BvbnNlPihcbiAgICBhdXRoLFxuICAgIEh0dHBNZXRob2QuUE9TVCxcbiAgICBFbmRwb2ludC5TRVRfQUNDT1VOVF9JTkZPLFxuICAgIHJlcXVlc3RcbiAgKTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcblxuaW1wb3J0IHtcbiAgdXBkYXRlRW1haWxQYXNzd29yZCBhcyBhcGlVcGRhdGVFbWFpbFBhc3N3b3JkLFxuICBVcGRhdGVFbWFpbFBhc3N3b3JkUmVxdWVzdFxufSBmcm9tICcuLi8uLi9hcGkvYWNjb3VudF9tYW5hZ2VtZW50L2VtYWlsX2FuZF9wYXNzd29yZCc7XG5pbXBvcnQgeyB1cGRhdGVQcm9maWxlIGFzIGFwaVVwZGF0ZVByb2ZpbGUgfSBmcm9tICcuLi8uLi9hcGkvYWNjb3VudF9tYW5hZ2VtZW50L3Byb2ZpbGUnO1xuaW1wb3J0IHsgVXNlckludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvdXNlcic7XG5pbXBvcnQgeyBfbG9nb3V0SWZJbnZhbGlkYXRlZCB9IGZyb20gJy4vaW52YWxpZGF0aW9uJztcbmltcG9ydCB7IGdldE1vZHVsYXJJbnN0YW5jZSB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcbmltcG9ydCB7IFByb3ZpZGVySWQgfSBmcm9tICcuLi8uLi9tb2RlbC9lbnVtcyc7XG5cbi8qKlxuICogVXBkYXRlcyBhIHVzZXIncyBwcm9maWxlIGRhdGEuXG4gKlxuICogQHBhcmFtIHVzZXIgLSBUaGUgdXNlci5cbiAqIEBwYXJhbSBwcm9maWxlIC0gVGhlIHByb2ZpbGUncyBgZGlzcGxheU5hbWVgIGFuZCBgcGhvdG9VUkxgIHRvIHVwZGF0ZS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVQcm9maWxlKFxuICB1c2VyOiBVc2VyLFxuICB7XG4gICAgZGlzcGxheU5hbWUsXG4gICAgcGhvdG9VUkw6IHBob3RvVXJsXG4gIH06IHsgZGlzcGxheU5hbWU/OiBzdHJpbmcgfCBudWxsOyBwaG90b1VSTD86IHN0cmluZyB8IG51bGwgfVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChkaXNwbGF5TmFtZSA9PT0gdW5kZWZpbmVkICYmIHBob3RvVXJsID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB1c2VySW50ZXJuYWwgPSBnZXRNb2R1bGFySW5zdGFuY2UodXNlcikgYXMgVXNlckludGVybmFsO1xuICBjb25zdCBpZFRva2VuID0gYXdhaXQgdXNlckludGVybmFsLmdldElkVG9rZW4oKTtcbiAgY29uc3QgcHJvZmlsZVJlcXVlc3QgPSB7XG4gICAgaWRUb2tlbixcbiAgICBkaXNwbGF5TmFtZSxcbiAgICBwaG90b1VybCxcbiAgICByZXR1cm5TZWN1cmVUb2tlbjogdHJ1ZVxuICB9O1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IF9sb2dvdXRJZkludmFsaWRhdGVkKFxuICAgIHVzZXJJbnRlcm5hbCxcbiAgICBhcGlVcGRhdGVQcm9maWxlKHVzZXJJbnRlcm5hbC5hdXRoLCBwcm9maWxlUmVxdWVzdClcbiAgKTtcblxuICB1c2VySW50ZXJuYWwuZGlzcGxheU5hbWUgPSByZXNwb25zZS5kaXNwbGF5TmFtZSB8fCBudWxsO1xuICB1c2VySW50ZXJuYWwucGhvdG9VUkwgPSByZXNwb25zZS5waG90b1VybCB8fCBudWxsO1xuXG4gIC8vIFVwZGF0ZSB0aGUgcGFzc3dvcmQgcHJvdmlkZXIgYXMgd2VsbFxuICBjb25zdCBwYXNzd29yZFByb3ZpZGVyID0gdXNlckludGVybmFsLnByb3ZpZGVyRGF0YS5maW5kKFxuICAgICh7IHByb3ZpZGVySWQgfSkgPT4gcHJvdmlkZXJJZCA9PT0gUHJvdmlkZXJJZC5QQVNTV09SRFxuICApO1xuICBpZiAocGFzc3dvcmRQcm92aWRlcikge1xuICAgIHBhc3N3b3JkUHJvdmlkZXIuZGlzcGxheU5hbWUgPSB1c2VySW50ZXJuYWwuZGlzcGxheU5hbWU7XG4gICAgcGFzc3dvcmRQcm92aWRlci5waG90b1VSTCA9IHVzZXJJbnRlcm5hbC5waG90b1VSTDtcbiAgfVxuXG4gIGF3YWl0IHVzZXJJbnRlcm5hbC5fdXBkYXRlVG9rZW5zSWZOZWNlc3NhcnkocmVzcG9uc2UpO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIHVzZXIncyBlbWFpbCBhZGRyZXNzLlxuICpcbiAqIEByZW1hcmtzXG4gKiBBbiBlbWFpbCB3aWxsIGJlIHNlbnQgdG8gdGhlIG9yaWdpbmFsIGVtYWlsIGFkZHJlc3MgKGlmIGl0IHdhcyBzZXQpIHRoYXQgYWxsb3dzIHRvIHJldm9rZSB0aGVcbiAqIGVtYWlsIGFkZHJlc3MgY2hhbmdlLCBpbiBvcmRlciB0byBwcm90ZWN0IHRoZW0gZnJvbSBhY2NvdW50IGhpamFja2luZy5cbiAqXG4gKiBJbXBvcnRhbnQ6IHRoaXMgaXMgYSBzZWN1cml0eSBzZW5zaXRpdmUgb3BlcmF0aW9uIHRoYXQgcmVxdWlyZXMgdGhlIHVzZXIgdG8gaGF2ZSByZWNlbnRseSBzaWduZWRcbiAqIGluLiBJZiB0aGlzIHJlcXVpcmVtZW50IGlzbid0IG1ldCwgYXNrIHRoZSB1c2VyIHRvIGF1dGhlbnRpY2F0ZSBhZ2FpbiBhbmQgdGhlbiBjYWxsXG4gKiB7QGxpbmsgcmVhdXRoZW50aWNhdGVXaXRoQ3JlZGVudGlhbH0uXG4gKlxuICogQHBhcmFtIHVzZXIgLSBUaGUgdXNlci5cbiAqIEBwYXJhbSBuZXdFbWFpbCAtIFRoZSBuZXcgZW1haWwgYWRkcmVzcy5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVFbWFpbCh1c2VyOiBVc2VyLCBuZXdFbWFpbDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiB1cGRhdGVFbWFpbE9yUGFzc3dvcmQoXG4gICAgZ2V0TW9kdWxhckluc3RhbmNlKHVzZXIpIGFzIFVzZXJJbnRlcm5hbCxcbiAgICBuZXdFbWFpbCxcbiAgICBudWxsXG4gICk7XG59XG5cbi8qKlxuICogVXBkYXRlcyB0aGUgdXNlcidzIHBhc3N3b3JkLlxuICpcbiAqIEByZW1hcmtzXG4gKiBJbXBvcnRhbnQ6IHRoaXMgaXMgYSBzZWN1cml0eSBzZW5zaXRpdmUgb3BlcmF0aW9uIHRoYXQgcmVxdWlyZXMgdGhlIHVzZXIgdG8gaGF2ZSByZWNlbnRseSBzaWduZWRcbiAqIGluLiBJZiB0aGlzIHJlcXVpcmVtZW50IGlzbid0IG1ldCwgYXNrIHRoZSB1c2VyIHRvIGF1dGhlbnRpY2F0ZSBhZ2FpbiBhbmQgdGhlbiBjYWxsXG4gKiB7QGxpbmsgcmVhdXRoZW50aWNhdGVXaXRoQ3JlZGVudGlhbH0uXG4gKlxuICogQHBhcmFtIHVzZXIgLSBUaGUgdXNlci5cbiAqIEBwYXJhbSBuZXdQYXNzd29yZCAtIFRoZSBuZXcgcGFzc3dvcmQuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlUGFzc3dvcmQodXNlcjogVXNlciwgbmV3UGFzc3dvcmQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gdXBkYXRlRW1haWxPclBhc3N3b3JkKFxuICAgIGdldE1vZHVsYXJJbnN0YW5jZSh1c2VyKSBhcyBVc2VySW50ZXJuYWwsXG4gICAgbnVsbCxcbiAgICBuZXdQYXNzd29yZFxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVFbWFpbE9yUGFzc3dvcmQoXG4gIHVzZXI6IFVzZXJJbnRlcm5hbCxcbiAgZW1haWw6IHN0cmluZyB8IG51bGwsXG4gIHBhc3N3b3JkOiBzdHJpbmcgfCBudWxsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBhdXRoIH0gPSB1c2VyO1xuICBjb25zdCBpZFRva2VuID0gYXdhaXQgdXNlci5nZXRJZFRva2VuKCk7XG4gIGNvbnN0IHJlcXVlc3Q6IFVwZGF0ZUVtYWlsUGFzc3dvcmRSZXF1ZXN0ID0ge1xuICAgIGlkVG9rZW4sXG4gICAgcmV0dXJuU2VjdXJlVG9rZW46IHRydWVcbiAgfTtcblxuICBpZiAoZW1haWwpIHtcbiAgICByZXF1ZXN0LmVtYWlsID0gZW1haWw7XG4gIH1cblxuICBpZiAocGFzc3dvcmQpIHtcbiAgICByZXF1ZXN0LnBhc3N3b3JkID0gcGFzc3dvcmQ7XG4gIH1cblxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IF9sb2dvdXRJZkludmFsaWRhdGVkKFxuICAgIHVzZXIsXG4gICAgYXBpVXBkYXRlRW1haWxQYXNzd29yZChhdXRoLCByZXF1ZXN0KVxuICApO1xuICBhd2FpdCB1c2VyLl91cGRhdGVUb2tlbnNJZk5lY2Vzc2FyeShyZXNwb25zZSwgLyogcmVsb2FkICovIHRydWUpO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEFkZGl0aW9uYWxVc2VySW5mbywgVXNlckNyZWRlbnRpYWwgfSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuaW1wb3J0IHsgSWRUb2tlblJlc3BvbnNlLCBJZFRva2VuUmVzcG9uc2VLaW5kIH0gZnJvbSAnLi4vLi4vbW9kZWwvaWRfdG9rZW4nO1xuaW1wb3J0IHsgX3BhcnNlVG9rZW4gfSBmcm9tICcuL2lkX3Rva2VuX3Jlc3VsdCc7XG5pbXBvcnQgeyBVc2VyQ3JlZGVudGlhbEludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvdXNlcic7XG5pbXBvcnQgeyBQcm92aWRlcklkIH0gZnJvbSAnLi4vLi4vbW9kZWwvZW51bXMnO1xuXG4vKipcbiAqIFBhcnNlIHRoZSBgQWRkaXRpb25hbFVzZXJJbmZvYCBmcm9tIHRoZSBJRCB0b2tlbiByZXNwb25zZS5cbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfZnJvbUlkVG9rZW5SZXNwb25zZShcbiAgaWRUb2tlblJlc3BvbnNlPzogSWRUb2tlblJlc3BvbnNlXG4pOiBBZGRpdGlvbmFsVXNlckluZm8gfCBudWxsIHtcbiAgaWYgKCFpZFRva2VuUmVzcG9uc2UpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCB7IHByb3ZpZGVySWQgfSA9IGlkVG9rZW5SZXNwb25zZTtcbiAgY29uc3QgcHJvZmlsZSA9IGlkVG9rZW5SZXNwb25zZS5yYXdVc2VySW5mb1xuICAgID8gSlNPTi5wYXJzZShpZFRva2VuUmVzcG9uc2UucmF3VXNlckluZm8pXG4gICAgOiB7fTtcbiAgY29uc3QgaXNOZXdVc2VyID1cbiAgICBpZFRva2VuUmVzcG9uc2UuaXNOZXdVc2VyIHx8XG4gICAgaWRUb2tlblJlc3BvbnNlLmtpbmQgPT09IElkVG9rZW5SZXNwb25zZUtpbmQuU2lnbnVwTmV3VXNlcjtcbiAgaWYgKCFwcm92aWRlcklkICYmIGlkVG9rZW5SZXNwb25zZT8uaWRUb2tlbikge1xuICAgIGNvbnN0IHNpZ25JblByb3ZpZGVyID0gX3BhcnNlVG9rZW4oaWRUb2tlblJlc3BvbnNlLmlkVG9rZW4pPy5maXJlYmFzZT8uW1xuICAgICAgJ3NpZ25faW5fcHJvdmlkZXInXG4gICAgXTtcbiAgICBpZiAoc2lnbkluUHJvdmlkZXIpIHtcbiAgICAgIGNvbnN0IGZpbHRlcmVkUHJvdmlkZXJJZCA9XG4gICAgICAgIHNpZ25JblByb3ZpZGVyICE9PSBQcm92aWRlcklkLkFOT05ZTU9VUyAmJlxuICAgICAgICBzaWduSW5Qcm92aWRlciAhPT0gUHJvdmlkZXJJZC5DVVNUT01cbiAgICAgICAgICA/IChzaWduSW5Qcm92aWRlciBhcyBQcm92aWRlcklkKVxuICAgICAgICAgIDogbnVsbDtcbiAgICAgIC8vIFVzZXMgZ2VuZXJpYyBjbGFzcyBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIGxlZ2FjeSBTREsuXG4gICAgICByZXR1cm4gbmV3IEdlbmVyaWNBZGRpdGlvbmFsVXNlckluZm8oaXNOZXdVc2VyLCBmaWx0ZXJlZFByb3ZpZGVySWQpO1xuICAgIH1cbiAgfVxuICBpZiAoIXByb3ZpZGVySWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBzd2l0Y2ggKHByb3ZpZGVySWQpIHtcbiAgICBjYXNlIFByb3ZpZGVySWQuRkFDRUJPT0s6XG4gICAgICByZXR1cm4gbmV3IEZhY2Vib29rQWRkaXRpb25hbFVzZXJJbmZvKGlzTmV3VXNlciwgcHJvZmlsZSk7XG4gICAgY2FzZSBQcm92aWRlcklkLkdJVEhVQjpcbiAgICAgIHJldHVybiBuZXcgR2l0aHViQWRkaXRpb25hbFVzZXJJbmZvKGlzTmV3VXNlciwgcHJvZmlsZSk7XG4gICAgY2FzZSBQcm92aWRlcklkLkdPT0dMRTpcbiAgICAgIHJldHVybiBuZXcgR29vZ2xlQWRkaXRpb25hbFVzZXJJbmZvKGlzTmV3VXNlciwgcHJvZmlsZSk7XG4gICAgY2FzZSBQcm92aWRlcklkLlRXSVRURVI6XG4gICAgICByZXR1cm4gbmV3IFR3aXR0ZXJBZGRpdGlvbmFsVXNlckluZm8oXG4gICAgICAgIGlzTmV3VXNlcixcbiAgICAgICAgcHJvZmlsZSxcbiAgICAgICAgaWRUb2tlblJlc3BvbnNlLnNjcmVlbk5hbWUgfHwgbnVsbFxuICAgICAgKTtcbiAgICBjYXNlIFByb3ZpZGVySWQuQ1VTVE9NOlxuICAgIGNhc2UgUHJvdmlkZXJJZC5BTk9OWU1PVVM6XG4gICAgICByZXR1cm4gbmV3IEdlbmVyaWNBZGRpdGlvbmFsVXNlckluZm8oaXNOZXdVc2VyLCBudWxsKTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG5ldyBHZW5lcmljQWRkaXRpb25hbFVzZXJJbmZvKGlzTmV3VXNlciwgcHJvdmlkZXJJZCwgcHJvZmlsZSk7XG4gIH1cbn1cblxuY2xhc3MgR2VuZXJpY0FkZGl0aW9uYWxVc2VySW5mbyBpbXBsZW1lbnRzIEFkZGl0aW9uYWxVc2VySW5mbyB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IGlzTmV3VXNlcjogYm9vbGVhbixcbiAgICByZWFkb25seSBwcm92aWRlcklkOiBQcm92aWRlcklkIHwgc3RyaW5nIHwgbnVsbCxcbiAgICByZWFkb25seSBwcm9maWxlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9XG4gICkge31cbn1cblxuY2xhc3MgRmVkZXJhdGVkQWRkaXRpb25hbFVzZXJJbmZvV2l0aFVzZXJuYW1lIGV4dGVuZHMgR2VuZXJpY0FkZGl0aW9uYWxVc2VySW5mbyB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIGlzTmV3VXNlcjogYm9vbGVhbixcbiAgICBwcm92aWRlcklkOiBQcm92aWRlcklkLFxuICAgIHByb2ZpbGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIHJlYWRvbmx5IHVzZXJuYW1lOiBzdHJpbmcgfCBudWxsXG4gICkge1xuICAgIHN1cGVyKGlzTmV3VXNlciwgcHJvdmlkZXJJZCwgcHJvZmlsZSk7XG4gIH1cbn1cblxuY2xhc3MgRmFjZWJvb2tBZGRpdGlvbmFsVXNlckluZm8gZXh0ZW5kcyBHZW5lcmljQWRkaXRpb25hbFVzZXJJbmZvIHtcbiAgY29uc3RydWN0b3IoaXNOZXdVc2VyOiBib29sZWFuLCBwcm9maWxlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikge1xuICAgIHN1cGVyKGlzTmV3VXNlciwgUHJvdmlkZXJJZC5GQUNFQk9PSywgcHJvZmlsZSk7XG4gIH1cbn1cblxuY2xhc3MgR2l0aHViQWRkaXRpb25hbFVzZXJJbmZvIGV4dGVuZHMgRmVkZXJhdGVkQWRkaXRpb25hbFVzZXJJbmZvV2l0aFVzZXJuYW1lIHtcbiAgY29uc3RydWN0b3IoaXNOZXdVc2VyOiBib29sZWFuLCBwcm9maWxlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikge1xuICAgIHN1cGVyKFxuICAgICAgaXNOZXdVc2VyLFxuICAgICAgUHJvdmlkZXJJZC5HSVRIVUIsXG4gICAgICBwcm9maWxlLFxuICAgICAgdHlwZW9mIHByb2ZpbGU/LmxvZ2luID09PSAnc3RyaW5nJyA/IHByb2ZpbGU/LmxvZ2luIDogbnVsbFxuICAgICk7XG4gIH1cbn1cblxuY2xhc3MgR29vZ2xlQWRkaXRpb25hbFVzZXJJbmZvIGV4dGVuZHMgR2VuZXJpY0FkZGl0aW9uYWxVc2VySW5mbyB7XG4gIGNvbnN0cnVjdG9yKGlzTmV3VXNlcjogYm9vbGVhbiwgcHJvZmlsZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHtcbiAgICBzdXBlcihpc05ld1VzZXIsIFByb3ZpZGVySWQuR09PR0xFLCBwcm9maWxlKTtcbiAgfVxufVxuXG5jbGFzcyBUd2l0dGVyQWRkaXRpb25hbFVzZXJJbmZvIGV4dGVuZHMgRmVkZXJhdGVkQWRkaXRpb25hbFVzZXJJbmZvV2l0aFVzZXJuYW1lIHtcbiAgY29uc3RydWN0b3IoXG4gICAgaXNOZXdVc2VyOiBib29sZWFuLFxuICAgIHByb2ZpbGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIHNjcmVlbk5hbWU6IHN0cmluZyB8IG51bGxcbiAgKSB7XG4gICAgc3VwZXIoaXNOZXdVc2VyLCBQcm92aWRlcklkLlRXSVRURVIsIHByb2ZpbGUsIHNjcmVlbk5hbWUpO1xuICB9XG59XG5cbi8qKlxuICogRXh0cmFjdHMgcHJvdmlkZXIgc3BlY2lmaWMge0BsaW5rIEFkZGl0aW9uYWxVc2VySW5mb30gZm9yIHRoZSBnaXZlbiBjcmVkZW50aWFsLlxuICpcbiAqIEBwYXJhbSB1c2VyQ3JlZGVudGlhbCAtIFRoZSB1c2VyIGNyZWRlbnRpYWwuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWRkaXRpb25hbFVzZXJJbmZvKFxuICB1c2VyQ3JlZGVudGlhbDogVXNlckNyZWRlbnRpYWxcbik6IEFkZGl0aW9uYWxVc2VySW5mbyB8IG51bGwge1xuICBjb25zdCB7IHVzZXIsIF90b2tlblJlc3BvbnNlIH0gPSB1c2VyQ3JlZGVudGlhbCBhcyBVc2VyQ3JlZGVudGlhbEludGVybmFsO1xuICBpZiAodXNlci5pc0Fub255bW91cyAmJiAhX3Rva2VuUmVzcG9uc2UpIHtcbiAgICAvLyBIYW5kbGUgdGhlIHNwZWNpYWwgY2FzZSB3aGVyZSBzaWduSW5Bbm9ueW1vdXNseSgpIGdldHMgY2FsbGVkIHR3aWNlLlxuICAgIC8vIE5vIG5ldHdvcmsgY2FsbCBpcyBtYWRlIHNvIHRoZXJlJ3Mgbm90aGluZyB0byBhY3R1YWxseSBmaWxsIHRoaXMgaW5cbiAgICByZXR1cm4ge1xuICAgICAgcHJvdmlkZXJJZDogbnVsbCxcbiAgICAgIGlzTmV3VXNlcjogZmFsc2UsXG4gICAgICBwcm9maWxlOiBudWxsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBfZnJvbUlkVG9rZW5SZXNwb25zZShfdG9rZW5SZXNwb25zZSk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgZ2V0TW9kdWxhckluc3RhbmNlIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuaW1wb3J0IHtcbiAgQXV0aCxcbiAgTmV4dE9yT2JzZXJ2ZXIsXG4gIFBlcnNpc3RlbmNlLFxuICBVc2VyLFxuICBDb21wbGV0ZUZuLFxuICBFcnJvckZuLFxuICBVbnN1YnNjcmliZSxcbiAgUGFzc3dvcmRWYWxpZGF0aW9uU3RhdHVzXG59IGZyb20gJy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5pbXBvcnQgeyBfaW5pdGlhbGl6ZVJlY2FwdGNoYUNvbmZpZyB9IGZyb20gJy4uL3BsYXRmb3JtX2Jyb3dzZXIvcmVjYXB0Y2hhL3JlY2FwdGNoYV9lbnRlcnByaXNlX3ZlcmlmaWVyJztcbmltcG9ydCB7IF9jYXN0QXV0aCB9IGZyb20gJy4uL2NvcmUvYXV0aC9hdXRoX2ltcGwnO1xuXG5leHBvcnQge1xuICBkZWJ1Z0Vycm9yTWFwLFxuICBwcm9kRXJyb3JNYXAsXG4gIEFVVEhfRVJST1JfQ09ERVNfTUFQX0RPX05PVF9VU0VfSU5URVJOQUxMWSBhcyBBdXRoRXJyb3JDb2Rlc1xufSBmcm9tICcuL2Vycm9ycyc7XG5cbi8vIE5vbi1vcHRpb25hbCBhdXRoIG1ldGhvZHMuXG4vKipcbiAqIENoYW5nZXMgdGhlIHR5cGUgb2YgcGVyc2lzdGVuY2Ugb24gdGhlIHtAbGluayBBdXRofSBpbnN0YW5jZSBmb3IgdGhlIGN1cnJlbnRseSBzYXZlZFxuICogYEF1dGhgIHNlc3Npb24gYW5kIGFwcGxpZXMgdGhpcyB0eXBlIG9mIHBlcnNpc3RlbmNlIGZvciBmdXR1cmUgc2lnbi1pbiByZXF1ZXN0cywgaW5jbHVkaW5nXG4gKiBzaWduLWluIHdpdGggcmVkaXJlY3QgcmVxdWVzdHMuXG4gKlxuICogQHJlbWFya3NcbiAqIFRoaXMgbWFrZXMgaXQgZWFzeSBmb3IgYSB1c2VyIHNpZ25pbmcgaW4gdG8gc3BlY2lmeSB3aGV0aGVyIHRoZWlyIHNlc3Npb24gc2hvdWxkIGJlXG4gKiByZW1lbWJlcmVkIG9yIG5vdC4gSXQgYWxzbyBtYWtlcyBpdCBlYXNpZXIgdG8gbmV2ZXIgcGVyc2lzdCB0aGUgYEF1dGhgIHN0YXRlIGZvciBhcHBsaWNhdGlvbnNcbiAqIHRoYXQgYXJlIHNoYXJlZCBieSBvdGhlciB1c2VycyBvciBoYXZlIHNlbnNpdGl2ZSBkYXRhLlxuICpcbiAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHdvcmsgaW4gYSBOb2RlLmpzIGVudmlyb25tZW50LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiBzZXRQZXJzaXN0ZW5jZShhdXRoLCBicm93c2VyU2Vzc2lvblBlcnNpc3RlbmNlKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwZXJzaXN0ZW5jZSAtIFRoZSB7QGxpbmsgUGVyc2lzdGVuY2V9IHRvIHVzZS5cbiAqIEByZXR1cm5zIEEgYFByb21pc2VgIHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgcGVyc2lzdGVuY2UgY2hhbmdlIGhhcyBjb21wbGV0ZWRcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRQZXJzaXN0ZW5jZShcbiAgYXV0aDogQXV0aCxcbiAgcGVyc2lzdGVuY2U6IFBlcnNpc3RlbmNlXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGdldE1vZHVsYXJJbnN0YW5jZShhdXRoKS5zZXRQZXJzaXN0ZW5jZShwZXJzaXN0ZW5jZSk7XG59XG5cbi8qKlxuICogTG9hZHMgdGhlIHJlQ0FQVENIQSBjb25maWd1cmF0aW9uIGludG8gdGhlIGBBdXRoYCBpbnN0YW5jZS5cbiAqXG4gKiBAcmVtYXJrc1xuICogVGhpcyB3aWxsIGxvYWQgdGhlIHJlQ0FQVENIQSBjb25maWcsIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIHRoZSByZUNBUFRDSEFcbiAqIHZlcmlmaWNhdGlvbiBmbG93IHNob3VsZCBiZSB0cmlnZ2VyZWQgZm9yIGVhY2ggYXV0aCBwcm92aWRlciwgaW50byB0aGVcbiAqIGN1cnJlbnQgQXV0aCBzZXNzaW9uLlxuICpcbiAqIElmIGluaXRpYWxpemVSZWNhcHRjaGFDb25maWcoKSBpcyBub3QgaW52b2tlZCwgdGhlIGF1dGggZmxvdyB3aWxsIGFsd2F5cyBzdGFydFxuICogd2l0aG91dCByZUNBUFRDSEEgdmVyaWZpY2F0aW9uLiBJZiB0aGUgcHJvdmlkZXIgaXMgY29uZmlndXJlZCB0byByZXF1aXJlIHJlQ0FQVENIQVxuICogdmVyaWZpY2F0aW9uLCB0aGUgU0RLIHdpbGwgdHJhbnNwYXJlbnRseSBsb2FkIHRoZSByZUNBUFRDSEEgY29uZmlnIGFuZCByZXN0YXJ0IHRoZVxuICogYXV0aCBmbG93cy5cbiAqXG4gKiBUaHVzLCBieSBjYWxsaW5nIHRoaXMgb3B0aW9uYWwgbWV0aG9kLCB5b3Ugd2lsbCByZWR1Y2UgdGhlIGxhdGVuY3kgb2YgZnV0dXJlIGF1dGggZmxvd3MuXG4gKiBMb2FkaW5nIHRoZSByZUNBUFRDSEEgY29uZmlnIGVhcmx5IHdpbGwgYWxzbyBlbmhhbmNlIHRoZSBzaWduYWwgY29sbGVjdGVkIGJ5IHJlQ0FQVENIQS5cbiAqXG4gKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCB3b3JrIGluIGEgTm9kZS5qcyBlbnZpcm9ubWVudC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgamF2YXNjcmlwdFxuICogaW5pdGlhbGl6ZVJlY2FwdGNoYUNvbmZpZyhhdXRoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0aWFsaXplUmVjYXB0Y2hhQ29uZmlnKGF1dGg6IEF1dGgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIF9pbml0aWFsaXplUmVjYXB0Y2hhQ29uZmlnKGF1dGgpO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlcyB0aGUgcGFzc3dvcmQgYWdhaW5zdCB0aGUgcGFzc3dvcmQgcG9saWN5IGNvbmZpZ3VyZWQgZm9yIHRoZSBwcm9qZWN0IG9yIHRlbmFudC5cbiAqXG4gKiBAcmVtYXJrc1xuICogSWYgbm8gdGVuYW50IElEIGlzIHNldCBvbiB0aGUgYEF1dGhgIGluc3RhbmNlLCB0aGVuIHRoaXMgbWV0aG9kIHdpbGwgdXNlIHRoZSBwYXNzd29yZFxuICogcG9saWN5IGNvbmZpZ3VyZWQgZm9yIHRoZSBwcm9qZWN0LiBPdGhlcndpc2UsIHRoaXMgbWV0aG9kIHdpbGwgdXNlIHRoZSBwb2xpY3kgY29uZmlndXJlZFxuICogZm9yIHRoZSB0ZW5hbnQuIElmIGEgcGFzc3dvcmQgcG9saWN5IGhhcyBub3QgYmVlbiBjb25maWd1cmVkLCB0aGVuIHRoZSBkZWZhdWx0IHBvbGljeVxuICogY29uZmlndXJlZCBmb3IgYWxsIHByb2plY3RzIHdpbGwgYmUgdXNlZC5cbiAqXG4gKiBJZiBhbiBhdXRoIGZsb3cgZmFpbHMgYmVjYXVzZSBhIHN1Ym1pdHRlZCBwYXNzd29yZCBkb2VzIG5vdCBtZWV0IHRoZSBwYXNzd29yZCBwb2xpY3lcbiAqIHJlcXVpcmVtZW50cyBhbmQgdGhpcyBtZXRob2QgaGFzIHByZXZpb3VzbHkgYmVlbiBjYWxsZWQsIHRoZW4gdGhpcyBtZXRob2Qgd2lsbCB1c2UgdGhlXG4gKiBtb3N0IHJlY2VudCBwb2xpY3kgYXZhaWxhYmxlIHdoZW4gY2FsbGVkIGFnYWluLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiB2YWxpZGF0ZVBhc3N3b3JkKGF1dGgsICdzb21lLXBhc3N3b3JkJyk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gYXV0aCBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxuICogQHBhcmFtIHBhc3N3b3JkIFRoZSBwYXNzd29yZCB0byB2YWxpZGF0ZS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2YWxpZGF0ZVBhc3N3b3JkKFxuICBhdXRoOiBBdXRoLFxuICBwYXNzd29yZDogc3RyaW5nXG4pOiBQcm9taXNlPFBhc3N3b3JkVmFsaWRhdGlvblN0YXR1cz4ge1xuICBjb25zdCBhdXRoSW50ZXJuYWwgPSBfY2FzdEF1dGgoYXV0aCk7XG4gIHJldHVybiBhdXRoSW50ZXJuYWwudmFsaWRhdGVQYXNzd29yZChwYXNzd29yZCk7XG59XG5cbi8qKlxuICogQWRkcyBhbiBvYnNlcnZlciBmb3IgY2hhbmdlcyB0byB0aGUgc2lnbmVkLWluIHVzZXIncyBJRCB0b2tlbi5cbiAqXG4gKiBAcmVtYXJrc1xuICogVGhpcyBpbmNsdWRlcyBzaWduLWluLCBzaWduLW91dCwgYW5kIHRva2VuIHJlZnJlc2ggZXZlbnRzLlxuICogVGhpcyB3aWxsIG5vdCBiZSB0cmlnZ2VyZWQgYXV0b21hdGljYWxseSB1cG9uIElEIHRva2VuIGV4cGlyYXRpb24uIFVzZSB7QGxpbmsgVXNlci5nZXRJZFRva2VufSB0byByZWZyZXNoIHRoZSBJRCB0b2tlbi5cbiAqXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXG4gKiBAcGFyYW0gbmV4dE9yT2JzZXJ2ZXIgLSBjYWxsYmFjayB0cmlnZ2VyZWQgb24gY2hhbmdlLlxuICogQHBhcmFtIGVycm9yIC0gRGVwcmVjYXRlZC4gVGhpcyBjYWxsYmFjayBpcyBuZXZlciB0cmlnZ2VyZWQuIEVycm9yc1xuICogb24gc2lnbmluZyBpbi9vdXQgY2FuIGJlIGNhdWdodCBpbiBwcm9taXNlcyByZXR1cm5lZCBmcm9tXG4gKiBzaWduLWluL3NpZ24tb3V0IGZ1bmN0aW9ucy5cbiAqIEBwYXJhbSBjb21wbGV0ZWQgLSBEZXByZWNhdGVkLiBUaGlzIGNhbGxiYWNrIGlzIG5ldmVyIHRyaWdnZXJlZC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbklkVG9rZW5DaGFuZ2VkKFxuICBhdXRoOiBBdXRoLFxuICBuZXh0T3JPYnNlcnZlcjogTmV4dE9yT2JzZXJ2ZXI8VXNlcj4sXG4gIGVycm9yPzogRXJyb3JGbixcbiAgY29tcGxldGVkPzogQ29tcGxldGVGblxuKTogVW5zdWJzY3JpYmUge1xuICByZXR1cm4gZ2V0TW9kdWxhckluc3RhbmNlKGF1dGgpLm9uSWRUb2tlbkNoYW5nZWQoXG4gICAgbmV4dE9yT2JzZXJ2ZXIsXG4gICAgZXJyb3IsXG4gICAgY29tcGxldGVkXG4gICk7XG59XG4vKipcbiAqIEFkZHMgYSBibG9ja2luZyBjYWxsYmFjayB0aGF0IHJ1bnMgYmVmb3JlIGFuIGF1dGggc3RhdGUgY2hhbmdlXG4gKiBzZXRzIGEgbmV3IHVzZXIuXG4gKlxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxuICogQHBhcmFtIGNhbGxiYWNrIC0gY2FsbGJhY2sgdHJpZ2dlcmVkIGJlZm9yZSBuZXcgdXNlciB2YWx1ZSBpcyBzZXQuXG4gKiAgIElmIHRoaXMgdGhyb3dzLCBpdCBibG9ja3MgdGhlIHVzZXIgZnJvbSBiZWluZyBzZXQuXG4gKiBAcGFyYW0gb25BYm9ydCAtIGNhbGxiYWNrIHRyaWdnZXJlZCBpZiBhIGxhdGVyIGBiZWZvcmVBdXRoU3RhdGVDaGFuZ2VkKClgXG4gKiAgIGNhbGxiYWNrIHRocm93cywgYWxsb3dpbmcgeW91IHRvIHVuZG8gYW55IHNpZGUgZWZmZWN0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJlZm9yZUF1dGhTdGF0ZUNoYW5nZWQoXG4gIGF1dGg6IEF1dGgsXG4gIGNhbGxiYWNrOiAodXNlcjogVXNlciB8IG51bGwpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+LFxuICBvbkFib3J0PzogKCkgPT4gdm9pZFxuKTogVW5zdWJzY3JpYmUge1xuICByZXR1cm4gZ2V0TW9kdWxhckluc3RhbmNlKGF1dGgpLmJlZm9yZUF1dGhTdGF0ZUNoYW5nZWQoY2FsbGJhY2ssIG9uQWJvcnQpO1xufVxuLyoqXG4gKiBBZGRzIGFuIG9ic2VydmVyIGZvciBjaGFuZ2VzIHRvIHRoZSB1c2VyJ3Mgc2lnbi1pbiBzdGF0ZS5cbiAqXG4gKiBAcmVtYXJrc1xuICogVG8ga2VlcCB0aGUgb2xkIGJlaGF2aW9yLCBzZWUge0BsaW5rIG9uSWRUb2tlbkNoYW5nZWR9LlxuICpcbiAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cbiAqIEBwYXJhbSBuZXh0T3JPYnNlcnZlciAtIGNhbGxiYWNrIHRyaWdnZXJlZCBvbiBjaGFuZ2UuXG4gKiBAcGFyYW0gZXJyb3IgLSBEZXByZWNhdGVkLiBUaGlzIGNhbGxiYWNrIGlzIG5ldmVyIHRyaWdnZXJlZC4gRXJyb3JzXG4gKiBvbiBzaWduaW5nIGluL291dCBjYW4gYmUgY2F1Z2h0IGluIHByb21pc2VzIHJldHVybmVkIGZyb21cbiAqIHNpZ24taW4vc2lnbi1vdXQgZnVuY3Rpb25zLlxuICogQHBhcmFtIGNvbXBsZXRlZCAtIERlcHJlY2F0ZWQuIFRoaXMgY2FsbGJhY2sgaXMgbmV2ZXIgdHJpZ2dlcmVkLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uQXV0aFN0YXRlQ2hhbmdlZChcbiAgYXV0aDogQXV0aCxcbiAgbmV4dE9yT2JzZXJ2ZXI6IE5leHRPck9ic2VydmVyPFVzZXI+LFxuICBlcnJvcj86IEVycm9yRm4sXG4gIGNvbXBsZXRlZD86IENvbXBsZXRlRm5cbik6IFVuc3Vic2NyaWJlIHtcbiAgcmV0dXJuIGdldE1vZHVsYXJJbnN0YW5jZShhdXRoKS5vbkF1dGhTdGF0ZUNoYW5nZWQoXG4gICAgbmV4dE9yT2JzZXJ2ZXIsXG4gICAgZXJyb3IsXG4gICAgY29tcGxldGVkXG4gICk7XG59XG4vKipcbiAqIFNldHMgdGhlIGN1cnJlbnQgbGFuZ3VhZ2UgdG8gdGhlIGRlZmF1bHQgZGV2aWNlL2Jyb3dzZXIgcHJlZmVyZW5jZS5cbiAqXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlRGV2aWNlTGFuZ3VhZ2UoYXV0aDogQXV0aCk6IHZvaWQge1xuICBnZXRNb2R1bGFySW5zdGFuY2UoYXV0aCkudXNlRGV2aWNlTGFuZ3VhZ2UoKTtcbn1cbi8qKlxuICogQXN5bmNocm9ub3VzbHkgc2V0cyB0aGUgcHJvdmlkZWQgdXNlciBhcyB7QGxpbmsgQXV0aC5jdXJyZW50VXNlcn0gb24gdGhlXG4gKiB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXG4gKlxuICogQHJlbWFya3NcbiAqIEEgbmV3IGluc3RhbmNlIGNvcHkgb2YgdGhlIHVzZXIgcHJvdmlkZWQgd2lsbCBiZSBtYWRlIGFuZCBzZXQgYXMgY3VycmVudFVzZXIuXG4gKlxuICogVGhpcyB3aWxsIHRyaWdnZXIge0BsaW5rIG9uQXV0aFN0YXRlQ2hhbmdlZH0gYW5kIHtAbGluayBvbklkVG9rZW5DaGFuZ2VkfSBsaXN0ZW5lcnNcbiAqIGxpa2Ugb3RoZXIgc2lnbiBpbiBtZXRob2RzLlxuICpcbiAqIFRoZSBvcGVyYXRpb24gZmFpbHMgd2l0aCBhbiBlcnJvciBpZiB0aGUgdXNlciB0byBiZSB1cGRhdGVkIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgRmlyZWJhc2VcbiAqIHByb2plY3QuXG4gKlxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxuICogQHBhcmFtIHVzZXIgLSBUaGUgbmV3IHtAbGluayBVc2VyfS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVDdXJyZW50VXNlcihcbiAgYXV0aDogQXV0aCxcbiAgdXNlcjogVXNlciB8IG51bGxcbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gZ2V0TW9kdWxhckluc3RhbmNlKGF1dGgpLnVwZGF0ZUN1cnJlbnRVc2VyKHVzZXIpO1xufVxuLyoqXG4gKiBTaWducyBvdXQgdGhlIGN1cnJlbnQgdXNlci5cbiAqXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2lnbk91dChhdXRoOiBBdXRoKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBnZXRNb2R1bGFySW5zdGFuY2UoYXV0aCkuc2lnbk91dCgpO1xufVxuXG5leHBvcnQgeyBpbml0aWFsaXplQXV0aCB9IGZyb20gJy4vYXV0aC9pbml0aWFsaXplJztcbmV4cG9ydCB7IGNvbm5lY3RBdXRoRW11bGF0b3IgfSBmcm9tICcuL2F1dGgvZW11bGF0b3InO1xuXG4vLyBjcmVkZW50aWFsc1xuZXhwb3J0IHsgQXV0aENyZWRlbnRpYWwgfSBmcm9tICcuL2NyZWRlbnRpYWxzJztcbmV4cG9ydCB7IEVtYWlsQXV0aENyZWRlbnRpYWwgfSBmcm9tICcuL2NyZWRlbnRpYWxzL2VtYWlsJztcbmV4cG9ydCB7IE9BdXRoQ3JlZGVudGlhbCB9IGZyb20gJy4vY3JlZGVudGlhbHMvb2F1dGgnO1xuZXhwb3J0IHsgUGhvbmVBdXRoQ3JlZGVudGlhbCB9IGZyb20gJy4vY3JlZGVudGlhbHMvcGhvbmUnO1xuXG4vLyBwZXJzaXN0ZW5jZVxuZXhwb3J0IHsgaW5NZW1vcnlQZXJzaXN0ZW5jZSB9IGZyb20gJy4vcGVyc2lzdGVuY2UvaW5fbWVtb3J5JztcblxuLy8gcHJvdmlkZXJzXG5leHBvcnQgeyBFbWFpbEF1dGhQcm92aWRlciB9IGZyb20gJy4vcHJvdmlkZXJzL2VtYWlsJztcbmV4cG9ydCB7IEZhY2Vib29rQXV0aFByb3ZpZGVyIH0gZnJvbSAnLi9wcm92aWRlcnMvZmFjZWJvb2snO1xuZXhwb3J0IHsgQ3VzdG9tUGFyYW1ldGVycyB9IGZyb20gJy4vcHJvdmlkZXJzL2ZlZGVyYXRlZCc7XG5leHBvcnQgeyBHb29nbGVBdXRoUHJvdmlkZXIgfSBmcm9tICcuL3Byb3ZpZGVycy9nb29nbGUnO1xuZXhwb3J0IHsgR2l0aHViQXV0aFByb3ZpZGVyIH0gZnJvbSAnLi9wcm92aWRlcnMvZ2l0aHViJztcbmV4cG9ydCB7IE9BdXRoUHJvdmlkZXIsIE9BdXRoQ3JlZGVudGlhbE9wdGlvbnMgfSBmcm9tICcuL3Byb3ZpZGVycy9vYXV0aCc7XG5leHBvcnQgeyBTQU1MQXV0aFByb3ZpZGVyIH0gZnJvbSAnLi9wcm92aWRlcnMvc2FtbCc7XG5leHBvcnQgeyBUd2l0dGVyQXV0aFByb3ZpZGVyIH0gZnJvbSAnLi9wcm92aWRlcnMvdHdpdHRlcic7XG5cbi8vIHN0cmF0ZWdpZXNcbmV4cG9ydCB7IHNpZ25JbkFub255bW91c2x5IH0gZnJvbSAnLi9zdHJhdGVnaWVzL2Fub255bW91cyc7XG5leHBvcnQge1xuICBzaWduSW5XaXRoQ3JlZGVudGlhbCxcbiAgbGlua1dpdGhDcmVkZW50aWFsLFxuICByZWF1dGhlbnRpY2F0ZVdpdGhDcmVkZW50aWFsXG59IGZyb20gJy4vc3RyYXRlZ2llcy9jcmVkZW50aWFsJztcbmV4cG9ydCB7IHNpZ25JbldpdGhDdXN0b21Ub2tlbiB9IGZyb20gJy4vc3RyYXRlZ2llcy9jdXN0b21fdG9rZW4nO1xuZXhwb3J0IHtcbiAgc2VuZFBhc3N3b3JkUmVzZXRFbWFpbCxcbiAgY29uZmlybVBhc3N3b3JkUmVzZXQsXG4gIGFwcGx5QWN0aW9uQ29kZSxcbiAgY2hlY2tBY3Rpb25Db2RlLFxuICB2ZXJpZnlQYXNzd29yZFJlc2V0Q29kZSxcbiAgY3JlYXRlVXNlcldpdGhFbWFpbEFuZFBhc3N3b3JkLFxuICBzaWduSW5XaXRoRW1haWxBbmRQYXNzd29yZFxufSBmcm9tICcuL3N0cmF0ZWdpZXMvZW1haWxfYW5kX3Bhc3N3b3JkJztcbmV4cG9ydCB7XG4gIHNlbmRTaWduSW5MaW5rVG9FbWFpbCxcbiAgaXNTaWduSW5XaXRoRW1haWxMaW5rLFxuICBzaWduSW5XaXRoRW1haWxMaW5rXG59IGZyb20gJy4vc3RyYXRlZ2llcy9lbWFpbF9saW5rJztcbmV4cG9ydCB7XG4gIGZldGNoU2lnbkluTWV0aG9kc0ZvckVtYWlsLFxuICBzZW5kRW1haWxWZXJpZmljYXRpb24sXG4gIHZlcmlmeUJlZm9yZVVwZGF0ZUVtYWlsXG59IGZyb20gJy4vc3RyYXRlZ2llcy9lbWFpbCc7XG5cbi8vIGNvcmVcbmV4cG9ydCB7IEFjdGlvbkNvZGVVUkwsIHBhcnNlQWN0aW9uQ29kZVVSTCB9IGZyb20gJy4vYWN0aW9uX2NvZGVfdXJsJztcblxuLy8gdXNlclxuZXhwb3J0IHtcbiAgdXBkYXRlUHJvZmlsZSxcbiAgdXBkYXRlRW1haWwsXG4gIHVwZGF0ZVBhc3N3b3JkXG59IGZyb20gJy4vdXNlci9hY2NvdW50X2luZm8nO1xuZXhwb3J0IHsgZ2V0SWRUb2tlbiwgZ2V0SWRUb2tlblJlc3VsdCB9IGZyb20gJy4vdXNlci9pZF90b2tlbl9yZXN1bHQnO1xuZXhwb3J0IHsgdW5saW5rIH0gZnJvbSAnLi91c2VyL2xpbmtfdW5saW5rJztcbmV4cG9ydCB7IGdldEFkZGl0aW9uYWxVc2VySW5mbyB9IGZyb20gJy4vdXNlci9hZGRpdGlvbmFsX3VzZXJfaW5mbyc7XG5cbi8vIE5vbi1vcHRpb25hbCB1c2VyIG1ldGhvZHMuXG5leHBvcnQgeyByZWxvYWQgfSBmcm9tICcuL3VzZXIvcmVsb2FkJztcbi8qKlxuICogRGVsZXRlcyBhbmQgc2lnbnMgb3V0IHRoZSB1c2VyLlxuICpcbiAqIEByZW1hcmtzXG4gKiBJbXBvcnRhbnQ6IHRoaXMgaXMgYSBzZWN1cml0eS1zZW5zaXRpdmUgb3BlcmF0aW9uIHRoYXQgcmVxdWlyZXMgdGhlIHVzZXIgdG8gaGF2ZSByZWNlbnRseVxuICogc2lnbmVkIGluLiBJZiB0aGlzIHJlcXVpcmVtZW50IGlzbid0IG1ldCwgYXNrIHRoZSB1c2VyIHRvIGF1dGhlbnRpY2F0ZSBhZ2FpbiBhbmQgdGhlbiBjYWxsXG4gKiB7QGxpbmsgcmVhdXRoZW50aWNhdGVXaXRoQ3JlZGVudGlhbH0uXG4gKlxuICogQHBhcmFtIHVzZXIgLSBUaGUgdXNlci5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVVc2VyKHVzZXI6IFVzZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGdldE1vZHVsYXJJbnN0YW5jZSh1c2VyKS5kZWxldGUoKTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBVc2VySW50ZXJuYWwgfSBmcm9tICcuLi9tb2RlbC91c2VyJztcbmltcG9ydCB7IE11bHRpRmFjdG9yU2Vzc2lvbiB9IGZyb20gJy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBlbnVtIE11bHRpRmFjdG9yU2Vzc2lvblR5cGUge1xuICBFTlJPTEwgPSAnZW5yb2xsJyxcbiAgU0lHTl9JTiA9ICdzaWduaW4nXG59XG5cbmludGVyZmFjZSBTZXJpYWxpemVkTXVsdGlGYWN0b3JTZXNzaW9uIHtcbiAgbXVsdGlGYWN0b3JTZXNzaW9uOiB7XG4gICAgaWRUb2tlbj86IHN0cmluZztcbiAgICBwZW5kaW5nQ3JlZGVudGlhbD86IHN0cmluZztcbiAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIE11bHRpRmFjdG9yU2Vzc2lvbkltcGwgaW1wbGVtZW50cyBNdWx0aUZhY3RvclNlc3Npb24ge1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IHR5cGU6IE11bHRpRmFjdG9yU2Vzc2lvblR5cGUsXG4gICAgcmVhZG9ubHkgY3JlZGVudGlhbDogc3RyaW5nLFxuICAgIHJlYWRvbmx5IHVzZXI/OiBVc2VySW50ZXJuYWxcbiAgKSB7fVxuXG4gIHN0YXRpYyBfZnJvbUlkdG9rZW4oXG4gICAgaWRUb2tlbjogc3RyaW5nLFxuICAgIHVzZXI/OiBVc2VySW50ZXJuYWxcbiAgKTogTXVsdGlGYWN0b3JTZXNzaW9uSW1wbCB7XG4gICAgcmV0dXJuIG5ldyBNdWx0aUZhY3RvclNlc3Npb25JbXBsKFxuICAgICAgTXVsdGlGYWN0b3JTZXNzaW9uVHlwZS5FTlJPTEwsXG4gICAgICBpZFRva2VuLFxuICAgICAgdXNlclxuICAgICk7XG4gIH1cblxuICBzdGF0aWMgX2Zyb21NZmFQZW5kaW5nQ3JlZGVudGlhbChcbiAgICBtZmFQZW5kaW5nQ3JlZGVudGlhbDogc3RyaW5nXG4gICk6IE11bHRpRmFjdG9yU2Vzc2lvbkltcGwge1xuICAgIHJldHVybiBuZXcgTXVsdGlGYWN0b3JTZXNzaW9uSW1wbChcbiAgICAgIE11bHRpRmFjdG9yU2Vzc2lvblR5cGUuU0lHTl9JTixcbiAgICAgIG1mYVBlbmRpbmdDcmVkZW50aWFsXG4gICAgKTtcbiAgfVxuXG4gIHRvSlNPTigpOiBTZXJpYWxpemVkTXVsdGlGYWN0b3JTZXNzaW9uIHtcbiAgICBjb25zdCBrZXkgPVxuICAgICAgdGhpcy50eXBlID09PSBNdWx0aUZhY3RvclNlc3Npb25UeXBlLkVOUk9MTFxuICAgICAgICA/ICdpZFRva2VuJ1xuICAgICAgICA6ICdwZW5kaW5nQ3JlZGVudGlhbCc7XG4gICAgcmV0dXJuIHtcbiAgICAgIG11bHRpRmFjdG9yU2Vzc2lvbjoge1xuICAgICAgICBba2V5XTogdGhpcy5jcmVkZW50aWFsXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tSlNPTihcbiAgICBvYmo6IFBhcnRpYWw8U2VyaWFsaXplZE11bHRpRmFjdG9yU2Vzc2lvbj5cbiAgKTogTXVsdGlGYWN0b3JTZXNzaW9uSW1wbCB8IG51bGwge1xuICAgIGlmIChvYmo/Lm11bHRpRmFjdG9yU2Vzc2lvbikge1xuICAgICAgaWYgKG9iai5tdWx0aUZhY3RvclNlc3Npb24/LnBlbmRpbmdDcmVkZW50aWFsKSB7XG4gICAgICAgIHJldHVybiBNdWx0aUZhY3RvclNlc3Npb25JbXBsLl9mcm9tTWZhUGVuZGluZ0NyZWRlbnRpYWwoXG4gICAgICAgICAgb2JqLm11bHRpRmFjdG9yU2Vzc2lvbi5wZW5kaW5nQ3JlZGVudGlhbFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChvYmoubXVsdGlGYWN0b3JTZXNzaW9uPy5pZFRva2VuKSB7XG4gICAgICAgIHJldHVybiBNdWx0aUZhY3RvclNlc3Npb25JbXBsLl9mcm9tSWR0b2tlbihcbiAgICAgICAgICBvYmoubXVsdGlGYWN0b3JTZXNzaW9uLmlkVG9rZW5cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQge1xuICBBdXRoLFxuICBNdWx0aUZhY3RvclJlc29sdmVyLFxuICBVc2VyQ3JlZGVudGlhbCxcbiAgTXVsdGlGYWN0b3JFcnJvclxufSBmcm9tICcuLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuXG5pbXBvcnQgeyBfY2FzdEF1dGggfSBmcm9tICcuLi9jb3JlL2F1dGgvYXV0aF9pbXBsJztcbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi9jb3JlL2Vycm9ycyc7XG5pbXBvcnQgeyBVc2VyQ3JlZGVudGlhbEltcGwgfSBmcm9tICcuLi9jb3JlL3VzZXIvdXNlcl9jcmVkZW50aWFsX2ltcGwnO1xuaW1wb3J0IHsgX2Fzc2VydCwgX2ZhaWwgfSBmcm9tICcuLi9jb3JlL3V0aWwvYXNzZXJ0JztcbmltcG9ydCB7IFVzZXJDcmVkZW50aWFsSW50ZXJuYWwgfSBmcm9tICcuLi9tb2RlbC91c2VyJztcbmltcG9ydCB7IE11bHRpRmFjdG9yQXNzZXJ0aW9uSW1wbCB9IGZyb20gJy4vbWZhX2Fzc2VydGlvbic7XG5pbXBvcnQgeyBNdWx0aUZhY3RvckVycm9yIGFzIE11bHRpRmFjdG9yRXJyb3JJbnRlcm5hbCB9IGZyb20gJy4vbWZhX2Vycm9yJztcbmltcG9ydCB7IE11bHRpRmFjdG9ySW5mb0ltcGwgfSBmcm9tICcuL21mYV9pbmZvJztcbmltcG9ydCB7IE11bHRpRmFjdG9yU2Vzc2lvbkltcGwgfSBmcm9tICcuL21mYV9zZXNzaW9uJztcbmltcG9ydCB7IGdldE1vZHVsYXJJbnN0YW5jZSB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcbmltcG9ydCB7IE9wZXJhdGlvblR5cGUgfSBmcm9tICcuLi9tb2RlbC9lbnVtcyc7XG5cbmV4cG9ydCBjbGFzcyBNdWx0aUZhY3RvclJlc29sdmVySW1wbCBpbXBsZW1lbnRzIE11bHRpRmFjdG9yUmVzb2x2ZXIge1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IHNlc3Npb246IE11bHRpRmFjdG9yU2Vzc2lvbkltcGwsXG4gICAgcmVhZG9ubHkgaGludHM6IE11bHRpRmFjdG9ySW5mb0ltcGxbXSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNpZ25JblJlc29sdmVyOiAoXG4gICAgICBhc3NlcnRpb246IE11bHRpRmFjdG9yQXNzZXJ0aW9uSW1wbFxuICAgICkgPT4gUHJvbWlzZTxVc2VyQ3JlZGVudGlhbEludGVybmFsPlxuICApIHt9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBzdGF0aWMgX2Zyb21FcnJvcihcbiAgICBhdXRoRXh0ZXJuOiBBdXRoLFxuICAgIGVycm9yOiBNdWx0aUZhY3RvckVycm9ySW50ZXJuYWxcbiAgKTogTXVsdGlGYWN0b3JSZXNvbHZlckltcGwge1xuICAgIGNvbnN0IGF1dGggPSBfY2FzdEF1dGgoYXV0aEV4dGVybik7XG4gICAgY29uc3Qgc2VydmVyUmVzcG9uc2UgPSBlcnJvci5jdXN0b21EYXRhLl9zZXJ2ZXJSZXNwb25zZTtcbiAgICBjb25zdCBoaW50cyA9IChzZXJ2ZXJSZXNwb25zZS5tZmFJbmZvIHx8IFtdKS5tYXAoZW5yb2xsbWVudCA9PlxuICAgICAgTXVsdGlGYWN0b3JJbmZvSW1wbC5fZnJvbVNlcnZlclJlc3BvbnNlKGF1dGgsIGVucm9sbG1lbnQpXG4gICAgKTtcblxuICAgIF9hc3NlcnQoXG4gICAgICBzZXJ2ZXJSZXNwb25zZS5tZmFQZW5kaW5nQ3JlZGVudGlhbCxcbiAgICAgIGF1dGgsXG4gICAgICBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SXG4gICAgKTtcbiAgICBjb25zdCBzZXNzaW9uID0gTXVsdGlGYWN0b3JTZXNzaW9uSW1wbC5fZnJvbU1mYVBlbmRpbmdDcmVkZW50aWFsKFxuICAgICAgc2VydmVyUmVzcG9uc2UubWZhUGVuZGluZ0NyZWRlbnRpYWxcbiAgICApO1xuXG4gICAgcmV0dXJuIG5ldyBNdWx0aUZhY3RvclJlc29sdmVySW1wbChcbiAgICAgIHNlc3Npb24sXG4gICAgICBoaW50cyxcbiAgICAgIGFzeW5jIChcbiAgICAgICAgYXNzZXJ0aW9uOiBNdWx0aUZhY3RvckFzc2VydGlvbkltcGxcbiAgICAgICk6IFByb21pc2U8VXNlckNyZWRlbnRpYWxJbnRlcm5hbD4gPT4ge1xuICAgICAgICBjb25zdCBtZmFSZXNwb25zZSA9IGF3YWl0IGFzc2VydGlvbi5fcHJvY2VzcyhhdXRoLCBzZXNzaW9uKTtcbiAgICAgICAgLy8gQ2xlYXIgb3V0IHRoZSB1bm5lZWRlZCBmaWVsZHMgZnJvbSB0aGUgb2xkIGxvZ2luIHJlc3BvbnNlXG4gICAgICAgIGRlbGV0ZSBzZXJ2ZXJSZXNwb25zZS5tZmFJbmZvO1xuICAgICAgICBkZWxldGUgc2VydmVyUmVzcG9uc2UubWZhUGVuZGluZ0NyZWRlbnRpYWw7XG5cbiAgICAgICAgLy8gVXNlIGluIHRoZSBuZXcgdG9rZW4gJiByZWZyZXNoIHRva2VuIGluIHRoZSBvbGQgcmVzcG9uc2VcbiAgICAgICAgY29uc3QgaWRUb2tlblJlc3BvbnNlID0ge1xuICAgICAgICAgIC4uLnNlcnZlclJlc3BvbnNlLFxuICAgICAgICAgIGlkVG9rZW46IG1mYVJlc3BvbnNlLmlkVG9rZW4sXG4gICAgICAgICAgcmVmcmVzaFRva2VuOiBtZmFSZXNwb25zZS5yZWZyZXNoVG9rZW5cbiAgICAgICAgfTtcblxuICAgICAgICAvLyBUT0RPOiB3ZSBzaG91bGQgY29sbGFwc2UgdGhpcyBzd2l0Y2ggc3RhdGVtZW50IGludG8gVXNlckNyZWRlbnRpYWxJbXBsLl9mb3JPcGVyYXRpb24gYW5kIGhhdmUgaXQgc3VwcG9ydCB0aGUgU0lHTl9JTiBjYXNlXG4gICAgICAgIHN3aXRjaCAoZXJyb3Iub3BlcmF0aW9uVHlwZSkge1xuICAgICAgICAgIGNhc2UgT3BlcmF0aW9uVHlwZS5TSUdOX0lOOlxuICAgICAgICAgICAgY29uc3QgdXNlckNyZWRlbnRpYWwgPVxuICAgICAgICAgICAgICBhd2FpdCBVc2VyQ3JlZGVudGlhbEltcGwuX2Zyb21JZFRva2VuUmVzcG9uc2UoXG4gICAgICAgICAgICAgICAgYXV0aCxcbiAgICAgICAgICAgICAgICBlcnJvci5vcGVyYXRpb25UeXBlLFxuICAgICAgICAgICAgICAgIGlkVG9rZW5SZXNwb25zZVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgYXdhaXQgYXV0aC5fdXBkYXRlQ3VycmVudFVzZXIodXNlckNyZWRlbnRpYWwudXNlcik7XG4gICAgICAgICAgICByZXR1cm4gdXNlckNyZWRlbnRpYWw7XG4gICAgICAgICAgY2FzZSBPcGVyYXRpb25UeXBlLlJFQVVUSEVOVElDQVRFOlxuICAgICAgICAgICAgX2Fzc2VydChlcnJvci51c2VyLCBhdXRoLCBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SKTtcbiAgICAgICAgICAgIHJldHVybiBVc2VyQ3JlZGVudGlhbEltcGwuX2Zvck9wZXJhdGlvbihcbiAgICAgICAgICAgICAgZXJyb3IudXNlcixcbiAgICAgICAgICAgICAgZXJyb3Iub3BlcmF0aW9uVHlwZSxcbiAgICAgICAgICAgICAgaWRUb2tlblJlc3BvbnNlXG4gICAgICAgICAgICApO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBfZmFpbChhdXRoLCBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBhc3luYyByZXNvbHZlU2lnbkluKFxuICAgIGFzc2VydGlvbkV4dGVybjogTXVsdGlGYWN0b3JBc3NlcnRpb25JbXBsXG4gICk6IFByb21pc2U8VXNlckNyZWRlbnRpYWw+IHtcbiAgICBjb25zdCBhc3NlcnRpb24gPSBhc3NlcnRpb25FeHRlcm4gYXMgTXVsdGlGYWN0b3JBc3NlcnRpb25JbXBsO1xuICAgIHJldHVybiB0aGlzLnNpZ25JblJlc29sdmVyKGFzc2VydGlvbik7XG4gIH1cbn1cblxuLyoqXG4gKiBQcm92aWRlcyBhIHtAbGluayBNdWx0aUZhY3RvclJlc29sdmVyfSBzdWl0YWJsZSBmb3IgY29tcGxldGlvbiBvZiBhXG4gKiBtdWx0aS1mYWN0b3IgZmxvdy5cbiAqXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXG4gKiBAcGFyYW0gZXJyb3IgLSBUaGUge0BsaW5rIE11bHRpRmFjdG9yRXJyb3J9IHJhaXNlZCBkdXJpbmcgYSBzaWduLWluLCBvclxuICogcmVhdXRoZW50aWNhdGlvbiBvcGVyYXRpb24uXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TXVsdGlGYWN0b3JSZXNvbHZlcihcbiAgYXV0aDogQXV0aCxcbiAgZXJyb3I6IE11bHRpRmFjdG9yRXJyb3Jcbik6IE11bHRpRmFjdG9yUmVzb2x2ZXIge1xuICBjb25zdCBhdXRoTW9kdWxhciA9IGdldE1vZHVsYXJJbnN0YW5jZShhdXRoKTtcbiAgY29uc3QgZXJyb3JJbnRlcm5hbCA9IGVycm9yIGFzIE11bHRpRmFjdG9yRXJyb3JJbnRlcm5hbDtcbiAgX2Fzc2VydChcbiAgICBlcnJvci5jdXN0b21EYXRhLm9wZXJhdGlvblR5cGUsXG4gICAgYXV0aE1vZHVsYXIsXG4gICAgQXV0aEVycm9yQ29kZS5BUkdVTUVOVF9FUlJPUlxuICApO1xuICBfYXNzZXJ0KFxuICAgIGVycm9ySW50ZXJuYWwuY3VzdG9tRGF0YS5fc2VydmVyUmVzcG9uc2U/Lm1mYVBlbmRpbmdDcmVkZW50aWFsLFxuICAgIGF1dGhNb2R1bGFyLFxuICAgIEF1dGhFcnJvckNvZGUuQVJHVU1FTlRfRVJST1JcbiAgKTtcblxuICByZXR1cm4gTXVsdGlGYWN0b3JSZXNvbHZlckltcGwuX2Zyb21FcnJvcihhdXRoTW9kdWxhciwgZXJyb3JJbnRlcm5hbCk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgRW5kcG9pbnQsXG4gIEh0dHBNZXRob2QsXG4gIF9hZGRUaWRJZk5lY2Vzc2FyeSxcbiAgX3BlcmZvcm1BcGlSZXF1ZXN0XG59IGZyb20gJy4uL2luZGV4JztcbmltcG9ydCB7IFNpZ25JbldpdGhQaG9uZU51bWJlclJlcXVlc3QgfSBmcm9tICcuLi9hdXRoZW50aWNhdGlvbi9zbXMnO1xuaW1wb3J0IHsgRmluYWxpemVNZmFSZXNwb25zZSB9IGZyb20gJy4uL2F1dGhlbnRpY2F0aW9uL21mYSc7XG5pbXBvcnQgeyBBdXRoSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC9hdXRoJztcblxuLyoqXG4gKiBNRkEgSW5mbyBhcyByZXR1cm5lZCBieSB0aGUgQVBJLlxuICovXG5pbnRlcmZhY2UgQmFzZU1mYUVucm9sbG1lbnQge1xuICBtZmFFbnJvbGxtZW50SWQ6IHN0cmluZztcbiAgZW5yb2xsZWRBdDogbnVtYmVyO1xuICBkaXNwbGF5TmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBbiBNRkEgcHJvdmlkZWQgYnkgU01TIHZlcmlmaWNhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQaG9uZU1mYUVucm9sbG1lbnQgZXh0ZW5kcyBCYXNlTWZhRW5yb2xsbWVudCB7XG4gIHBob25lSW5mbzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEFuIE1GQSBwcm92aWRlZCBieSBUT1RQIChUaW1lLWJhc2VkIE9uZSBUaW1lIFBhc3N3b3JkKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb3RwTWZhRW5yb2xsbWVudCBleHRlbmRzIEJhc2VNZmFFbnJvbGxtZW50IHt9XG5cbi8qKlxuICogTWZhRW5yb2xsbWVudCBjYW4gYmUgYW55IHN1YnR5cGUgb2YgQmFzZU1mYUVucm9sbG1lbnQsIGN1cnJlbnRseSBvbmx5IFBob25lTWZhRW5yb2xsbWVudCBhbmQgVG90cE1mYUVucm9sbG1lbnQgYXJlIHN1cHBvcnRlZC5cbiAqL1xuZXhwb3J0IHR5cGUgTWZhRW5yb2xsbWVudCA9IFBob25lTWZhRW5yb2xsbWVudCB8IFRvdHBNZmFFbnJvbGxtZW50O1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXJ0UGhvbmVNZmFFbnJvbGxtZW50UmVxdWVzdCB7XG4gIGlkVG9rZW46IHN0cmluZztcbiAgcGhvbmVFbnJvbGxtZW50SW5mbzoge1xuICAgIHBob25lTnVtYmVyOiBzdHJpbmc7XG4gICAgcmVjYXB0Y2hhVG9rZW46IHN0cmluZztcbiAgfTtcbiAgdGVuYW50SWQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhcnRQaG9uZU1mYUVucm9sbG1lbnRSZXNwb25zZSB7XG4gIHBob25lU2Vzc2lvbkluZm86IHtcbiAgICBzZXNzaW9uSW5mbzogc3RyaW5nO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RhcnRFbnJvbGxQaG9uZU1mYShcbiAgYXV0aDogQXV0aEludGVybmFsLFxuICByZXF1ZXN0OiBTdGFydFBob25lTWZhRW5yb2xsbWVudFJlcXVlc3Rcbik6IFByb21pc2U8U3RhcnRQaG9uZU1mYUVucm9sbG1lbnRSZXNwb25zZT4ge1xuICByZXR1cm4gX3BlcmZvcm1BcGlSZXF1ZXN0PFxuICAgIFN0YXJ0UGhvbmVNZmFFbnJvbGxtZW50UmVxdWVzdCxcbiAgICBTdGFydFBob25lTWZhRW5yb2xsbWVudFJlc3BvbnNlXG4gID4oXG4gICAgYXV0aCxcbiAgICBIdHRwTWV0aG9kLlBPU1QsXG4gICAgRW5kcG9pbnQuU1RBUlRfTUZBX0VOUk9MTE1FTlQsXG4gICAgX2FkZFRpZElmTmVjZXNzYXJ5KGF1dGgsIHJlcXVlc3QpXG4gICk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmluYWxpemVQaG9uZU1mYUVucm9sbG1lbnRSZXF1ZXN0IHtcbiAgaWRUb2tlbjogc3RyaW5nO1xuICBwaG9uZVZlcmlmaWNhdGlvbkluZm86IFNpZ25JbldpdGhQaG9uZU51bWJlclJlcXVlc3Q7XG4gIGRpc3BsYXlOYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgdGVuYW50SWQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmluYWxpemVQaG9uZU1mYUVucm9sbG1lbnRSZXNwb25zZVxuICBleHRlbmRzIEZpbmFsaXplTWZhUmVzcG9uc2Uge31cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmFsaXplRW5yb2xsUGhvbmVNZmEoXG4gIGF1dGg6IEF1dGhJbnRlcm5hbCxcbiAgcmVxdWVzdDogRmluYWxpemVQaG9uZU1mYUVucm9sbG1lbnRSZXF1ZXN0XG4pOiBQcm9taXNlPEZpbmFsaXplUGhvbmVNZmFFbnJvbGxtZW50UmVzcG9uc2U+IHtcbiAgcmV0dXJuIF9wZXJmb3JtQXBpUmVxdWVzdDxcbiAgICBGaW5hbGl6ZVBob25lTWZhRW5yb2xsbWVudFJlcXVlc3QsXG4gICAgRmluYWxpemVQaG9uZU1mYUVucm9sbG1lbnRSZXNwb25zZVxuICA+KFxuICAgIGF1dGgsXG4gICAgSHR0cE1ldGhvZC5QT1NULFxuICAgIEVuZHBvaW50LkZJTkFMSVpFX01GQV9FTlJPTExNRU5ULFxuICAgIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KVxuICApO1xufVxuZXhwb3J0IGludGVyZmFjZSBTdGFydFRvdHBNZmFFbnJvbGxtZW50UmVxdWVzdCB7XG4gIGlkVG9rZW46IHN0cmluZztcbiAgdG90cEVucm9sbG1lbnRJbmZvOiB7fTtcbiAgdGVuYW50SWQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhcnRUb3RwTWZhRW5yb2xsbWVudFJlc3BvbnNlIHtcbiAgdG90cFNlc3Npb25JbmZvOiB7XG4gICAgc2hhcmVkU2VjcmV0S2V5OiBzdHJpbmc7XG4gICAgdmVyaWZpY2F0aW9uQ29kZUxlbmd0aDogbnVtYmVyO1xuICAgIGhhc2hpbmdBbGdvcml0aG06IHN0cmluZztcbiAgICBwZXJpb2RTZWM6IG51bWJlcjtcbiAgICBzZXNzaW9uSW5mbzogc3RyaW5nO1xuICAgIGZpbmFsaXplRW5yb2xsbWVudFRpbWU6IG51bWJlcjtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0RW5yb2xsVG90cE1mYShcbiAgYXV0aDogQXV0aEludGVybmFsLFxuICByZXF1ZXN0OiBTdGFydFRvdHBNZmFFbnJvbGxtZW50UmVxdWVzdFxuKTogUHJvbWlzZTxTdGFydFRvdHBNZmFFbnJvbGxtZW50UmVzcG9uc2U+IHtcbiAgcmV0dXJuIF9wZXJmb3JtQXBpUmVxdWVzdDxcbiAgICBTdGFydFRvdHBNZmFFbnJvbGxtZW50UmVxdWVzdCxcbiAgICBTdGFydFRvdHBNZmFFbnJvbGxtZW50UmVzcG9uc2VcbiAgPihcbiAgICBhdXRoLFxuICAgIEh0dHBNZXRob2QuUE9TVCxcbiAgICBFbmRwb2ludC5TVEFSVF9NRkFfRU5ST0xMTUVOVCxcbiAgICBfYWRkVGlkSWZOZWNlc3NhcnkoYXV0aCwgcmVxdWVzdClcbiAgKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUb3RwVmVyaWZpY2F0aW9uSW5mbyB7XG4gIHNlc3Npb25JbmZvOiBzdHJpbmc7XG4gIHZlcmlmaWNhdGlvbkNvZGU6IHN0cmluZztcbn1cbmV4cG9ydCBpbnRlcmZhY2UgRmluYWxpemVUb3RwTWZhRW5yb2xsbWVudFJlcXVlc3Qge1xuICBpZFRva2VuOiBzdHJpbmc7XG4gIHRvdHBWZXJpZmljYXRpb25JbmZvOiBUb3RwVmVyaWZpY2F0aW9uSW5mbztcbiAgZGlzcGxheU5hbWU/OiBzdHJpbmcgfCBudWxsO1xuICB0ZW5hbnRJZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaW5hbGl6ZVRvdHBNZmFFbnJvbGxtZW50UmVzcG9uc2VcbiAgZXh0ZW5kcyBGaW5hbGl6ZU1mYVJlc3BvbnNlIHt9XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5hbGl6ZUVucm9sbFRvdHBNZmEoXG4gIGF1dGg6IEF1dGhJbnRlcm5hbCxcbiAgcmVxdWVzdDogRmluYWxpemVUb3RwTWZhRW5yb2xsbWVudFJlcXVlc3Rcbik6IFByb21pc2U8RmluYWxpemVUb3RwTWZhRW5yb2xsbWVudFJlc3BvbnNlPiB7XG4gIHJldHVybiBfcGVyZm9ybUFwaVJlcXVlc3Q8XG4gICAgRmluYWxpemVUb3RwTWZhRW5yb2xsbWVudFJlcXVlc3QsXG4gICAgRmluYWxpemVUb3RwTWZhRW5yb2xsbWVudFJlc3BvbnNlXG4gID4oXG4gICAgYXV0aCxcbiAgICBIdHRwTWV0aG9kLlBPU1QsXG4gICAgRW5kcG9pbnQuRklOQUxJWkVfTUZBX0VOUk9MTE1FTlQsXG4gICAgX2FkZFRpZElmTmVjZXNzYXJ5KGF1dGgsIHJlcXVlc3QpXG4gICk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2l0aGRyYXdNZmFSZXF1ZXN0IHtcbiAgaWRUb2tlbjogc3RyaW5nO1xuICBtZmFFbnJvbGxtZW50SWQ6IHN0cmluZztcbiAgdGVuYW50SWQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2l0aGRyYXdNZmFSZXNwb25zZSBleHRlbmRzIEZpbmFsaXplTWZhUmVzcG9uc2Uge31cblxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhkcmF3TWZhKFxuICBhdXRoOiBBdXRoSW50ZXJuYWwsXG4gIHJlcXVlc3Q6IFdpdGhkcmF3TWZhUmVxdWVzdFxuKTogUHJvbWlzZTxXaXRoZHJhd01mYVJlc3BvbnNlPiB7XG4gIHJldHVybiBfcGVyZm9ybUFwaVJlcXVlc3Q8V2l0aGRyYXdNZmFSZXF1ZXN0LCBXaXRoZHJhd01mYVJlc3BvbnNlPihcbiAgICBhdXRoLFxuICAgIEh0dHBNZXRob2QuUE9TVCxcbiAgICBFbmRwb2ludC5XSVRIRFJBV19NRkEsXG4gICAgX2FkZFRpZElmTmVjZXNzYXJ5KGF1dGgsIHJlcXVlc3QpXG4gICk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7XG4gIE11bHRpRmFjdG9yQXNzZXJ0aW9uLFxuICBNdWx0aUZhY3RvckluZm8sXG4gIE11bHRpRmFjdG9yU2Vzc2lvbixcbiAgTXVsdGlGYWN0b3JVc2VyLFxuICBVc2VyXG59IGZyb20gJy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5cbmltcG9ydCB7IHdpdGhkcmF3TWZhIH0gZnJvbSAnLi4vYXBpL2FjY291bnRfbWFuYWdlbWVudC9tZmEnO1xuaW1wb3J0IHsgX2xvZ291dElmSW52YWxpZGF0ZWQgfSBmcm9tICcuLi9jb3JlL3VzZXIvaW52YWxpZGF0aW9uJztcbmltcG9ydCB7IFVzZXJJbnRlcm5hbCB9IGZyb20gJy4uL21vZGVsL3VzZXInO1xuaW1wb3J0IHsgTXVsdGlGYWN0b3JBc3NlcnRpb25JbXBsIH0gZnJvbSAnLi9tZmFfYXNzZXJ0aW9uJztcbmltcG9ydCB7IE11bHRpRmFjdG9ySW5mb0ltcGwgfSBmcm9tICcuL21mYV9pbmZvJztcbmltcG9ydCB7IE11bHRpRmFjdG9yU2Vzc2lvbkltcGwgfSBmcm9tICcuL21mYV9zZXNzaW9uJztcbmltcG9ydCB7IGdldE1vZHVsYXJJbnN0YW5jZSB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcblxuZXhwb3J0IGNsYXNzIE11bHRpRmFjdG9yVXNlckltcGwgaW1wbGVtZW50cyBNdWx0aUZhY3RvclVzZXIge1xuICBlbnJvbGxlZEZhY3RvcnM6IE11bHRpRmFjdG9ySW5mb1tdID0gW107XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihyZWFkb25seSB1c2VyOiBVc2VySW50ZXJuYWwpIHtcbiAgICB1c2VyLl9vblJlbG9hZCh1c2VySW5mbyA9PiB7XG4gICAgICBpZiAodXNlckluZm8ubWZhSW5mbykge1xuICAgICAgICB0aGlzLmVucm9sbGVkRmFjdG9ycyA9IHVzZXJJbmZvLm1mYUluZm8ubWFwKGVucm9sbG1lbnQgPT5cbiAgICAgICAgICBNdWx0aUZhY3RvckluZm9JbXBsLl9mcm9tU2VydmVyUmVzcG9uc2UodXNlci5hdXRoLCBlbnJvbGxtZW50KVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIF9mcm9tVXNlcih1c2VyOiBVc2VySW50ZXJuYWwpOiBNdWx0aUZhY3RvclVzZXJJbXBsIHtcbiAgICByZXR1cm4gbmV3IE11bHRpRmFjdG9yVXNlckltcGwodXNlcik7XG4gIH1cblxuICBhc3luYyBnZXRTZXNzaW9uKCk6IFByb21pc2U8TXVsdGlGYWN0b3JTZXNzaW9uPiB7XG4gICAgcmV0dXJuIE11bHRpRmFjdG9yU2Vzc2lvbkltcGwuX2Zyb21JZHRva2VuKFxuICAgICAgYXdhaXQgdGhpcy51c2VyLmdldElkVG9rZW4oKSxcbiAgICAgIHRoaXMudXNlclxuICAgICk7XG4gIH1cblxuICBhc3luYyBlbnJvbGwoXG4gICAgYXNzZXJ0aW9uRXh0ZXJuOiBNdWx0aUZhY3RvckFzc2VydGlvbixcbiAgICBkaXNwbGF5TmFtZT86IHN0cmluZyB8IG51bGxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYXNzZXJ0aW9uID0gYXNzZXJ0aW9uRXh0ZXJuIGFzIE11bHRpRmFjdG9yQXNzZXJ0aW9uSW1wbDtcbiAgICBjb25zdCBzZXNzaW9uID0gKGF3YWl0IHRoaXMuZ2V0U2Vzc2lvbigpKSBhcyBNdWx0aUZhY3RvclNlc3Npb25JbXBsO1xuICAgIGNvbnN0IGZpbmFsaXplTWZhUmVzcG9uc2UgPSBhd2FpdCBfbG9nb3V0SWZJbnZhbGlkYXRlZChcbiAgICAgIHRoaXMudXNlcixcbiAgICAgIGFzc2VydGlvbi5fcHJvY2Vzcyh0aGlzLnVzZXIuYXV0aCwgc2Vzc2lvbiwgZGlzcGxheU5hbWUpXG4gICAgKTtcbiAgICAvLyBOZXcgdG9rZW5zIHdpbGwgYmUgaXNzdWVkIGFmdGVyIGVucm9sbG1lbnQgb2YgdGhlIG5ldyBzZWNvbmQgZmFjdG9ycy5cbiAgICAvLyBUaGV5IG5lZWQgdG8gYmUgdXBkYXRlZCBvbiB0aGUgdXNlci5cbiAgICBhd2FpdCB0aGlzLnVzZXIuX3VwZGF0ZVRva2Vuc0lmTmVjZXNzYXJ5KGZpbmFsaXplTWZhUmVzcG9uc2UpO1xuICAgIC8vIFRoZSB1c2VyIG5lZWRzIHRvIGJlIHJlbG9hZGVkIHRvIGdldCB0aGUgbmV3IG11bHRpLWZhY3RvciBpbmZvcm1hdGlvblxuICAgIC8vIGZyb20gc2VydmVyLiBVU0VSX1JFTE9BREVEIGV2ZW50IHdpbGwgYmUgdHJpZ2dlcmVkIGFuZCBgZW5yb2xsZWRGYWN0b3JzYFxuICAgIC8vIHdpbGwgYmUgdXBkYXRlZC5cbiAgICByZXR1cm4gdGhpcy51c2VyLnJlbG9hZCgpO1xuICB9XG5cbiAgYXN5bmMgdW5lbnJvbGwoaW5mb09yVWlkOiBNdWx0aUZhY3RvckluZm8gfCBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBtZmFFbnJvbGxtZW50SWQgPVxuICAgICAgdHlwZW9mIGluZm9PclVpZCA9PT0gJ3N0cmluZycgPyBpbmZvT3JVaWQgOiBpbmZvT3JVaWQudWlkO1xuICAgIGNvbnN0IGlkVG9rZW4gPSBhd2FpdCB0aGlzLnVzZXIuZ2V0SWRUb2tlbigpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBpZFRva2VuUmVzcG9uc2UgPSBhd2FpdCBfbG9nb3V0SWZJbnZhbGlkYXRlZChcbiAgICAgICAgdGhpcy51c2VyLFxuICAgICAgICB3aXRoZHJhd01mYSh0aGlzLnVzZXIuYXV0aCwge1xuICAgICAgICAgIGlkVG9rZW4sXG4gICAgICAgICAgbWZhRW5yb2xsbWVudElkXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgLy8gUmVtb3ZlIHRoZSBzZWNvbmQgZmFjdG9yIGZyb20gdGhlIHVzZXIncyBsaXN0LlxuICAgICAgdGhpcy5lbnJvbGxlZEZhY3RvcnMgPSB0aGlzLmVucm9sbGVkRmFjdG9ycy5maWx0ZXIoXG4gICAgICAgICh7IHVpZCB9KSA9PiB1aWQgIT09IG1mYUVucm9sbG1lbnRJZFxuICAgICAgKTtcbiAgICAgIC8vIERlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBiYWNrZW5kIGRlY2lkZWQgdG8gcmV2b2tlIHRoZSB1c2VyJ3Mgc2Vzc2lvbixcbiAgICAgIC8vIHRoZSB0b2tlblJlc3BvbnNlIG1heSBiZSBlbXB0eS4gSWYgdGhlIHRva2VucyB3ZXJlIG5vdCB1cGRhdGVkIChhbmQgdGhleVxuICAgICAgLy8gYXJlIG5vdyBpbnZhbGlkKSwgcmVsb2FkaW5nIHRoZSB1c2VyIHdpbGwgZGlzY292ZXIgdGhpcyBhbmQgaW52YWxpZGF0ZVxuICAgICAgLy8gdGhlIHVzZXIncyBzdGF0ZSBhY2NvcmRpbmdseS5cbiAgICAgIGF3YWl0IHRoaXMudXNlci5fdXBkYXRlVG9rZW5zSWZOZWNlc3NhcnkoaWRUb2tlblJlc3BvbnNlKTtcbiAgICAgIGF3YWl0IHRoaXMudXNlci5yZWxvYWQoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxufVxuXG5jb25zdCBtdWx0aUZhY3RvclVzZXJDYWNoZSA9IG5ldyBXZWFrTWFwPFVzZXIsIE11bHRpRmFjdG9yVXNlcj4oKTtcblxuLyoqXG4gKiBUaGUge0BsaW5rIE11bHRpRmFjdG9yVXNlcn0gY29ycmVzcG9uZGluZyB0byB0aGUgdXNlci5cbiAqXG4gKiBAcmVtYXJrc1xuICogVGhpcyBpcyB1c2VkIHRvIGFjY2VzcyBhbGwgbXVsdGktZmFjdG9yIHByb3BlcnRpZXMgYW5kIG9wZXJhdGlvbnMgcmVsYXRlZCB0byB0aGUgdXNlci5cbiAqXG4gKiBAcGFyYW0gdXNlciAtIFRoZSB1c2VyLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG11bHRpRmFjdG9yKHVzZXI6IFVzZXIpOiBNdWx0aUZhY3RvclVzZXIge1xuICBjb25zdCB1c2VyTW9kdWxhciA9IGdldE1vZHVsYXJJbnN0YW5jZSh1c2VyKTtcbiAgaWYgKCFtdWx0aUZhY3RvclVzZXJDYWNoZS5oYXModXNlck1vZHVsYXIpKSB7XG4gICAgbXVsdGlGYWN0b3JVc2VyQ2FjaGUuc2V0KFxuICAgICAgdXNlck1vZHVsYXIsXG4gICAgICBNdWx0aUZhY3RvclVzZXJJbXBsLl9mcm9tVXNlcih1c2VyTW9kdWxhciBhcyBVc2VySW50ZXJuYWwpXG4gICAgKTtcbiAgfVxuICByZXR1cm4gbXVsdGlGYWN0b3JVc2VyQ2FjaGUuZ2V0KHVzZXJNb2R1bGFyKSE7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IFBlcnNpc3RlbmNlIH0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IGVudW0gUGVyc2lzdGVuY2VUeXBlIHtcbiAgU0VTU0lPTiA9ICdTRVNTSU9OJyxcbiAgTE9DQUwgPSAnTE9DQUwnLFxuICBOT05FID0gJ05PTkUnXG59XG5cbmV4cG9ydCB0eXBlIFBlcnNpc3RlZEJsb2IgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuZXhwb3J0IGludGVyZmFjZSBJbnN0YW50aWF0b3I8VD4ge1xuICAoYmxvYjogUGVyc2lzdGVkQmxvYik6IFQ7XG59XG5cbmV4cG9ydCB0eXBlIFBlcnNpc3RlbmNlVmFsdWUgPSBQZXJzaXN0ZWRCbG9iIHwgc3RyaW5nO1xuXG5leHBvcnQgY29uc3QgU1RPUkFHRV9BVkFJTEFCTEVfS0VZID0gJ19fc2FrJztcblxuZXhwb3J0IGludGVyZmFjZSBTdG9yYWdlRXZlbnRMaXN0ZW5lciB7XG4gICh2YWx1ZTogUGVyc2lzdGVuY2VWYWx1ZSB8IG51bGwpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBlcnNpc3RlbmNlSW50ZXJuYWwgZXh0ZW5kcyBQZXJzaXN0ZW5jZSB7XG4gIHR5cGU6IFBlcnNpc3RlbmNlVHlwZTtcbiAgX2lzQXZhaWxhYmxlKCk6IFByb21pc2U8Ym9vbGVhbj47XG4gIF9zZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBQZXJzaXN0ZW5jZVZhbHVlKTogUHJvbWlzZTx2b2lkPjtcbiAgX2dldDxUIGV4dGVuZHMgUGVyc2lzdGVuY2VWYWx1ZT4oa2V5OiBzdHJpbmcpOiBQcm9taXNlPFQgfCBudWxsPjtcbiAgX3JlbW92ZShrZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG4gIF9hZGRMaXN0ZW5lcihrZXk6IHN0cmluZywgbGlzdGVuZXI6IFN0b3JhZ2VFdmVudExpc3RlbmVyKTogdm9pZDtcbiAgX3JlbW92ZUxpc3RlbmVyKGtleTogc3RyaW5nLCBsaXN0ZW5lcjogU3RvcmFnZUV2ZW50TGlzdGVuZXIpOiB2b2lkO1xuICAvLyBTaG91bGQgdGhpcyBwZXJzaXN0ZW5jZSBhbGxvdyBtaWdyYXRpb24gdXAgdGhlIGNob3NlbiBoaWVyYXJjaHk/XG4gIF9zaG91bGRBbGxvd01pZ3JhdGlvbj86IGJvb2xlYW47XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgUGVyc2lzdGVuY2VWYWx1ZSxcbiAgU1RPUkFHRV9BVkFJTEFCTEVfS0VZLFxuICBQZXJzaXN0ZW5jZVR5cGVcbn0gZnJvbSAnLi4vLi4vY29yZS9wZXJzaXN0ZW5jZSc7XG5cbi8vIFRoZXJlIGFyZSB0d28gZGlmZmVyZW50IGJyb3dzZXIgcGVyc2lzdGVuY2UgdHlwZXM6IGxvY2FsIGFuZCBzZXNzaW9uLlxuLy8gQm90aCBoYXZlIHRoZSBzYW1lIGltcGxlbWVudGF0aW9uIGJ1dCB1c2UgYSBkaWZmZXJlbnQgdW5kZXJseWluZyBzdG9yYWdlXG4vLyBvYmplY3QuXG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCcm93c2VyUGVyc2lzdGVuY2VDbGFzcyB7XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgc3RvcmFnZVJldHJpZXZlcjogKCkgPT4gU3RvcmFnZSxcbiAgICByZWFkb25seSB0eXBlOiBQZXJzaXN0ZW5jZVR5cGVcbiAgKSB7fVxuXG4gIF9pc0F2YWlsYWJsZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgaWYgKCF0aGlzLnN0b3JhZ2UpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG4gICAgICB9XG4gICAgICB0aGlzLnN0b3JhZ2Uuc2V0SXRlbShTVE9SQUdFX0FWQUlMQUJMRV9LRVksICcxJyk7XG4gICAgICB0aGlzLnN0b3JhZ2UucmVtb3ZlSXRlbShTVE9SQUdFX0FWQUlMQUJMRV9LRVkpO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIF9zZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBQZXJzaXN0ZW5jZVZhbHVlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5zdG9yYWdlLnNldEl0ZW0oa2V5LCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuXG4gIF9nZXQ8VCBleHRlbmRzIFBlcnNpc3RlbmNlVmFsdWU+KGtleTogc3RyaW5nKTogUHJvbWlzZTxUIHwgbnVsbD4ge1xuICAgIGNvbnN0IGpzb24gPSB0aGlzLnN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoanNvbiA/IEpTT04ucGFyc2UoanNvbikgOiBudWxsKTtcbiAgfVxuXG4gIF9yZW1vdmUoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgc3RvcmFnZSgpOiBTdG9yYWdlIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yYWdlUmV0cmlldmVyKCk7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBQZXJzaXN0ZW5jZSB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5cbmltcG9ydCB7IGdldFVBIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuaW1wb3J0IHtcbiAgX2lzU2FmYXJpLFxuICBfaXNJT1MsXG4gIF9pc0lmcmFtZSxcbiAgX2lzTW9iaWxlQnJvd3NlcixcbiAgX2lzSUUxMFxufSBmcm9tICcuLi8uLi9jb3JlL3V0aWwvYnJvd3Nlcic7XG5pbXBvcnQge1xuICBQZXJzaXN0ZW5jZUludGVybmFsIGFzIEludGVybmFsUGVyc2lzdGVuY2UsXG4gIFBlcnNpc3RlbmNlVHlwZSxcbiAgUGVyc2lzdGVuY2VWYWx1ZSxcbiAgU3RvcmFnZUV2ZW50TGlzdGVuZXJcbn0gZnJvbSAnLi4vLi4vY29yZS9wZXJzaXN0ZW5jZSc7XG5pbXBvcnQgeyBCcm93c2VyUGVyc2lzdGVuY2VDbGFzcyB9IGZyb20gJy4vYnJvd3Nlcic7XG5cbmZ1bmN0aW9uIF9pZnJhbWVDYW5ub3RTeW5jV2ViU3RvcmFnZSgpOiBib29sZWFuIHtcbiAgY29uc3QgdWEgPSBnZXRVQSgpO1xuICByZXR1cm4gX2lzU2FmYXJpKHVhKSB8fCBfaXNJT1ModWEpO1xufVxuXG4vLyBUaGUgcG9sbGluZyBwZXJpb2QgaW4gY2FzZSBldmVudHMgYXJlIG5vdCBzdXBwb3J0ZWRcbmV4cG9ydCBjb25zdCBfUE9MTElOR19JTlRFUlZBTF9NUyA9IDEwMDA7XG5cbi8vIFRoZSBJRSAxMCBsb2NhbFN0b3JhZ2UgY3Jvc3MgdGFiIHN5bmNocm9uaXphdGlvbiBkZWxheSBpbiBtaWxsaXNlY29uZHNcbmNvbnN0IElFMTBfTE9DQUxfU1RPUkFHRV9TWU5DX0RFTEFZID0gMTA7XG5cbmNsYXNzIEJyb3dzZXJMb2NhbFBlcnNpc3RlbmNlXG4gIGV4dGVuZHMgQnJvd3NlclBlcnNpc3RlbmNlQ2xhc3NcbiAgaW1wbGVtZW50cyBJbnRlcm5hbFBlcnNpc3RlbmNlXG57XG4gIHN0YXRpYyB0eXBlOiAnTE9DQUwnID0gJ0xPQ0FMJztcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigoKSA9PiB3aW5kb3cubG9jYWxTdG9yYWdlLCBQZXJzaXN0ZW5jZVR5cGUuTE9DQUwpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBib3VuZEV2ZW50SGFuZGxlciA9IChcbiAgICBldmVudDogU3RvcmFnZUV2ZW50LFxuICAgIHBvbGw/OiBib29sZWFuXG4gICk6IHZvaWQgPT4gdGhpcy5vblN0b3JhZ2VFdmVudChldmVudCwgcG9sbCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbGlzdGVuZXJzOiBSZWNvcmQ8c3RyaW5nLCBTZXQ8U3RvcmFnZUV2ZW50TGlzdGVuZXI+PiA9IHt9O1xuICBwcml2YXRlIHJlYWRvbmx5IGxvY2FsQ2FjaGU6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGw+ID0ge307XG4gIC8vIHNldFRpbWVvdXQgcmV0dXJuIHZhbHVlIGlzIHBsYXRmb3JtIHNwZWNpZmljXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHByaXZhdGUgcG9sbFRpbWVyOiBhbnkgfCBudWxsID0gbnVsbDtcblxuICAvLyBTYWZhcmkgb3IgaU9TIGJyb3dzZXIgYW5kIGVtYmVkZGVkIGluIGFuIGlmcmFtZS5cbiAgcHJpdmF0ZSByZWFkb25seSBzYWZhcmlMb2NhbFN0b3JhZ2VOb3RTeW5jZWQgPVxuICAgIF9pZnJhbWVDYW5ub3RTeW5jV2ViU3RvcmFnZSgpICYmIF9pc0lmcmFtZSgpO1xuICAvLyBXaGV0aGVyIHRvIHVzZSBwb2xsaW5nIGluc3RlYWQgb2YgZGVwZW5kaW5nIG9uIHdpbmRvdyBldmVudHNcbiAgcHJpdmF0ZSByZWFkb25seSBmYWxsYmFja1RvUG9sbGluZyA9IF9pc01vYmlsZUJyb3dzZXIoKTtcbiAgcmVhZG9ubHkgX3Nob3VsZEFsbG93TWlncmF0aW9uID0gdHJ1ZTtcblxuICBwcml2YXRlIGZvckFsbENoYW5nZWRLZXlzKFxuICAgIGNiOiAoa2V5OiBzdHJpbmcsIG9sZFZhbHVlOiBzdHJpbmcgfCBudWxsLCBuZXdWYWx1ZTogc3RyaW5nIHwgbnVsbCkgPT4gdm9pZFxuICApOiB2b2lkIHtcbiAgICAvLyBDaGVjayBhbGwga2V5cyB3aXRoIGxpc3RlbmVycyBvbiB0aGVtLlxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMubGlzdGVuZXJzKSkge1xuICAgICAgLy8gR2V0IHZhbHVlIGZyb20gbG9jYWxTdG9yYWdlLlxuICAgICAgY29uc3QgbmV3VmFsdWUgPSB0aGlzLnN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuICAgICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLmxvY2FsQ2FjaGVba2V5XTtcbiAgICAgIC8vIElmIGxvY2FsIG1hcCB2YWx1ZSBkb2VzIG5vdCBtYXRjaCwgdHJpZ2dlciBsaXN0ZW5lciB3aXRoIHN0b3JhZ2UgZXZlbnQuXG4gICAgICAvLyBEaWZmZXJlbnRpYXRlIHRoaXMgc2ltdWxhdGVkIGV2ZW50IGZyb20gdGhlIHJlYWwgc3RvcmFnZSBldmVudC5cbiAgICAgIGlmIChuZXdWYWx1ZSAhPT0gb2xkVmFsdWUpIHtcbiAgICAgICAgY2Ioa2V5LCBvbGRWYWx1ZSwgbmV3VmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25TdG9yYWdlRXZlbnQoZXZlbnQ6IFN0b3JhZ2VFdmVudCwgcG9sbCA9IGZhbHNlKTogdm9pZCB7XG4gICAgLy8gS2V5IHdvdWxkIGJlIG51bGwgaW4gc29tZSBzaXR1YXRpb25zLCBsaWtlIHdoZW4gbG9jYWxTdG9yYWdlIGlzIGNsZWFyZWRcbiAgICBpZiAoIWV2ZW50LmtleSkge1xuICAgICAgdGhpcy5mb3JBbGxDaGFuZ2VkS2V5cyhcbiAgICAgICAgKGtleTogc3RyaW5nLCBfb2xkVmFsdWU6IHN0cmluZyB8IG51bGwsIG5ld1ZhbHVlOiBzdHJpbmcgfCBudWxsKSA9PiB7XG4gICAgICAgICAgdGhpcy5ub3RpZnlMaXN0ZW5lcnMoa2V5LCBuZXdWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qga2V5ID0gZXZlbnQua2V5O1xuXG4gICAgLy8gQ2hlY2sgdGhlIG1lY2hhbmlzbSBob3cgdGhpcyBldmVudCB3YXMgZGV0ZWN0ZWQuXG4gICAgLy8gVGhlIGZpcnN0IGV2ZW50IHdpbGwgZGljdGF0ZSB0aGUgbWVjaGFuaXNtIHRvIGJlIHVzZWQuXG4gICAgaWYgKHBvbGwpIHtcbiAgICAgIC8vIEVudmlyb25tZW50IGRldGVjdHMgc3RvcmFnZSBjaGFuZ2VzIHZpYSBwb2xsaW5nLlxuICAgICAgLy8gUmVtb3ZlIHN0b3JhZ2UgZXZlbnQgbGlzdGVuZXIgdG8gcHJldmVudCBwb3NzaWJsZSBldmVudCBkdXBsaWNhdGlvbi5cbiAgICAgIHRoaXMuZGV0YWNoTGlzdGVuZXIoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRW52aXJvbm1lbnQgZGV0ZWN0cyBzdG9yYWdlIGNoYW5nZXMgdmlhIHN0b3JhZ2UgZXZlbnQgbGlzdGVuZXIuXG4gICAgICAvLyBSZW1vdmUgcG9sbGluZyBsaXN0ZW5lciB0byBwcmV2ZW50IHBvc3NpYmxlIGV2ZW50IGR1cGxpY2F0aW9uLlxuICAgICAgdGhpcy5zdG9wUG9sbGluZygpO1xuICAgIH1cblxuICAgIC8vIFNhZmFyaSBlbWJlZGRlZCBpZnJhbWUuIFN0b3JhZ2UgZXZlbnQgd2lsbCB0cmlnZ2VyIHdpdGggdGhlIGRlbHRhXG4gICAgLy8gY2hhbmdlcyBidXQgbm8gY2hhbmdlcyB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIGlmcmFtZSBsb2NhbFN0b3JhZ2UuXG4gICAgaWYgKHRoaXMuc2FmYXJpTG9jYWxTdG9yYWdlTm90U3luY2VkKSB7XG4gICAgICAvLyBHZXQgY3VycmVudCBpZnJhbWUgcGFnZSB2YWx1ZS5cbiAgICAgIGNvbnN0IHN0b3JlZFZhbHVlID0gdGhpcy5zdG9yYWdlLmdldEl0ZW0oa2V5KTtcbiAgICAgIC8vIFZhbHVlIG5vdCBzeW5jaHJvbml6ZWQsIHN5bmNocm9uaXplIG1hbnVhbGx5LlxuICAgICAgaWYgKGV2ZW50Lm5ld1ZhbHVlICE9PSBzdG9yZWRWYWx1ZSkge1xuICAgICAgICBpZiAoZXZlbnQubmV3VmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBWYWx1ZSBjaGFuZ2VkIGZyb20gY3VycmVudCB2YWx1ZS5cbiAgICAgICAgICB0aGlzLnN0b3JhZ2Uuc2V0SXRlbShrZXksIGV2ZW50Lm5ld1ZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBDdXJyZW50IHZhbHVlIGRlbGV0ZWQuXG4gICAgICAgICAgdGhpcy5zdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmxvY2FsQ2FjaGVba2V5XSA9PT0gZXZlbnQubmV3VmFsdWUgJiYgIXBvbGwpIHtcbiAgICAgICAgLy8gQWxyZWFkeSBkZXRlY3RlZCBhbmQgcHJvY2Vzc2VkLCBkbyBub3QgdHJpZ2dlciBsaXN0ZW5lcnMgYWdhaW4uXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB0cmlnZ2VyTGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgLy8gS2VlcCBsb2NhbCBtYXAgdXAgdG8gZGF0ZSBpbiBjYXNlIHN0b3JhZ2UgZXZlbnQgaXMgdHJpZ2dlcmVkIGJlZm9yZVxuICAgICAgLy8gcG9sbC5cbiAgICAgIGNvbnN0IHN0b3JlZFZhbHVlID0gdGhpcy5zdG9yYWdlLmdldEl0ZW0oa2V5KTtcbiAgICAgIGlmICghcG9sbCAmJiB0aGlzLmxvY2FsQ2FjaGVba2V5XSA9PT0gc3RvcmVkVmFsdWUpIHtcbiAgICAgICAgLy8gUmVhbCBzdG9yYWdlIGV2ZW50IHdoaWNoIGhhcyBhbHJlYWR5IGJlZW4gZGV0ZWN0ZWQsIGRvIG5vdGhpbmcuXG4gICAgICAgIC8vIFRoaXMgc2VlbXMgdG8gdHJpZ2dlciBpbiBzb21lIElFIGJyb3dzZXJzIGZvciBzb21lIHJlYXNvbi5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5ub3RpZnlMaXN0ZW5lcnMoa2V5LCBzdG9yZWRWYWx1ZSk7XG4gICAgfTtcblxuICAgIGNvbnN0IHN0b3JlZFZhbHVlID0gdGhpcy5zdG9yYWdlLmdldEl0ZW0oa2V5KTtcbiAgICBpZiAoXG4gICAgICBfaXNJRTEwKCkgJiZcbiAgICAgIHN0b3JlZFZhbHVlICE9PSBldmVudC5uZXdWYWx1ZSAmJlxuICAgICAgZXZlbnQubmV3VmFsdWUgIT09IGV2ZW50Lm9sZFZhbHVlXG4gICAgKSB7XG4gICAgICAvLyBJRSAxMCBoYXMgdGhpcyB3ZWlyZCBidWcgd2hlcmUgYSBzdG9yYWdlIGV2ZW50IHdvdWxkIHRyaWdnZXIgd2l0aCB0aGVcbiAgICAgIC8vIGNvcnJlY3Qga2V5LCBvbGRWYWx1ZSBhbmQgbmV3VmFsdWUgYnV0IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSkgZG9lc1xuICAgICAgLy8gbm90IHlpZWxkIHRoZSB1cGRhdGVkIHZhbHVlIHVudGlsIGEgZmV3IG1pbGxpc2Vjb25kcy4gVGhpcyBlbnN1cmVzXG4gICAgICAvLyB0aGlzIHJlY292ZXJzIGZyb20gdGhhdCBzaXR1YXRpb24uXG4gICAgICBzZXRUaW1lb3V0KHRyaWdnZXJMaXN0ZW5lcnMsIElFMTBfTE9DQUxfU1RPUkFHRV9TWU5DX0RFTEFZKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHJpZ2dlckxpc3RlbmVycygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbm90aWZ5TGlzdGVuZXJzKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMubG9jYWxDYWNoZVtrZXldID0gdmFsdWU7XG4gICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lcnNba2V5XTtcbiAgICBpZiAobGlzdGVuZXJzKSB7XG4gICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIEFycmF5LmZyb20obGlzdGVuZXJzKSkge1xuICAgICAgICBsaXN0ZW5lcih2YWx1ZSA/IEpTT04ucGFyc2UodmFsdWUpIDogdmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRQb2xsaW5nKCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcFBvbGxpbmcoKTtcblxuICAgIHRoaXMucG9sbFRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgdGhpcy5mb3JBbGxDaGFuZ2VkS2V5cyhcbiAgICAgICAgKGtleTogc3RyaW5nLCBvbGRWYWx1ZTogc3RyaW5nIHwgbnVsbCwgbmV3VmFsdWU6IHN0cmluZyB8IG51bGwpID0+IHtcbiAgICAgICAgICB0aGlzLm9uU3RvcmFnZUV2ZW50KFxuICAgICAgICAgICAgbmV3IFN0b3JhZ2VFdmVudCgnc3RvcmFnZScsIHtcbiAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICBvbGRWYWx1ZSxcbiAgICAgICAgICAgICAgbmV3VmFsdWVcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgLyogcG9sbCAqLyB0cnVlXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9LCBfUE9MTElOR19JTlRFUlZBTF9NUyk7XG4gIH1cblxuICBwcml2YXRlIHN0b3BQb2xsaW5nKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBvbGxUaW1lcikge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnBvbGxUaW1lcik7XG4gICAgICB0aGlzLnBvbGxUaW1lciA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhdHRhY2hMaXN0ZW5lcigpOiB2b2lkIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc3RvcmFnZScsIHRoaXMuYm91bmRFdmVudEhhbmRsZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSBkZXRhY2hMaXN0ZW5lcigpOiB2b2lkIHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignc3RvcmFnZScsIHRoaXMuYm91bmRFdmVudEhhbmRsZXIpO1xuICB9XG5cbiAgX2FkZExpc3RlbmVyKGtleTogc3RyaW5nLCBsaXN0ZW5lcjogU3RvcmFnZUV2ZW50TGlzdGVuZXIpOiB2b2lkIHtcbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5saXN0ZW5lcnMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gV2hldGhlciBicm93c2VyIGNhbiBkZXRlY3Qgc3RvcmFnZSBldmVudCB3aGVuIGl0IGhhZCBhbHJlYWR5IGJlZW4gcHVzaGVkIHRvIHRoZSBiYWNrZ3JvdW5kLlxuICAgICAgLy8gVGhpcyBtYXkgaGFwcGVuIGluIHNvbWUgbW9iaWxlIGJyb3dzZXJzLiBBIGxvY2FsU3RvcmFnZSBjaGFuZ2UgaW4gdGhlIGZvcmVncm91bmQgd2luZG93XG4gICAgICAvLyB3aWxsIG5vdCBiZSBkZXRlY3RlZCBpbiB0aGUgYmFja2dyb3VuZCB3aW5kb3cgdmlhIHRoZSBzdG9yYWdlIGV2ZW50LlxuICAgICAgLy8gVGhpcyB3YXMgZGV0ZWN0ZWQgaW4gaU9TIDcueCBtb2JpbGUgYnJvd3NlcnNcbiAgICAgIGlmICh0aGlzLmZhbGxiYWNrVG9Qb2xsaW5nKSB7XG4gICAgICAgIHRoaXMuc3RhcnRQb2xsaW5nKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmF0dGFjaExpc3RlbmVyKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghdGhpcy5saXN0ZW5lcnNba2V5XSkge1xuICAgICAgdGhpcy5saXN0ZW5lcnNba2V5XSA9IG5ldyBTZXQoKTtcbiAgICAgIC8vIFBvcHVsYXRlIHRoZSBjYWNoZSB0byBhdm9pZCBzcHVyaW91c2x5IHRyaWdnZXJpbmcgb24gZmlyc3QgcG9sbC5cbiAgICAgIHRoaXMubG9jYWxDYWNoZVtrZXldID0gdGhpcy5zdG9yYWdlLmdldEl0ZW0oa2V5KTtcbiAgICB9XG4gICAgdGhpcy5saXN0ZW5lcnNba2V5XS5hZGQobGlzdGVuZXIpO1xuICB9XG5cbiAgX3JlbW92ZUxpc3RlbmVyKGtleTogc3RyaW5nLCBsaXN0ZW5lcjogU3RvcmFnZUV2ZW50TGlzdGVuZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5saXN0ZW5lcnNba2V5XSkge1xuICAgICAgdGhpcy5saXN0ZW5lcnNba2V5XS5kZWxldGUobGlzdGVuZXIpO1xuXG4gICAgICBpZiAodGhpcy5saXN0ZW5lcnNba2V5XS5zaXplID09PSAwKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmxpc3RlbmVyc1trZXldO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLmxpc3RlbmVycykubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmRldGFjaExpc3RlbmVyKCk7XG4gICAgICB0aGlzLnN0b3BQb2xsaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gVXBkYXRlIGxvY2FsIGNhY2hlIG9uIGJhc2Ugb3BlcmF0aW9uczpcblxuICBhc3luYyBfc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogUGVyc2lzdGVuY2VWYWx1ZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHN1cGVyLl9zZXQoa2V5LCB2YWx1ZSk7XG4gICAgdGhpcy5sb2NhbENhY2hlW2tleV0gPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gIH1cblxuICBhc3luYyBfZ2V0PFQgZXh0ZW5kcyBQZXJzaXN0ZW5jZVZhbHVlPihrZXk6IHN0cmluZyk6IFByb21pc2U8VCB8IG51bGw+IHtcbiAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHN1cGVyLl9nZXQ8VD4oa2V5KTtcbiAgICB0aGlzLmxvY2FsQ2FjaGVba2V5XSA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBhc3luYyBfcmVtb3ZlKGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgc3VwZXIuX3JlbW92ZShrZXkpO1xuICAgIGRlbGV0ZSB0aGlzLmxvY2FsQ2FjaGVba2V5XTtcbiAgfVxufVxuXG4vKipcbiAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBQZXJzaXN0ZW5jZX0gb2YgdHlwZSBgTE9DQUxgIHVzaW5nIGBsb2NhbFN0b3JhZ2VgXG4gKiBmb3IgdGhlIHVuZGVybHlpbmcgc3RvcmFnZS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBicm93c2VyTG9jYWxQZXJzaXN0ZW5jZTogUGVyc2lzdGVuY2UgPSBCcm93c2VyTG9jYWxQZXJzaXN0ZW5jZTtcbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBQZXJzaXN0ZW5jZSB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5cbmltcG9ydCB7XG4gIFBlcnNpc3RlbmNlSW50ZXJuYWwgYXMgSW50ZXJuYWxQZXJzaXN0ZW5jZSxcbiAgUGVyc2lzdGVuY2VUeXBlLFxuICBTdG9yYWdlRXZlbnRMaXN0ZW5lclxufSBmcm9tICcuLi8uLi9jb3JlL3BlcnNpc3RlbmNlJztcbmltcG9ydCB7IEJyb3dzZXJQZXJzaXN0ZW5jZUNsYXNzIH0gZnJvbSAnLi9icm93c2VyJztcblxuY2xhc3MgQnJvd3NlclNlc3Npb25QZXJzaXN0ZW5jZVxuICBleHRlbmRzIEJyb3dzZXJQZXJzaXN0ZW5jZUNsYXNzXG4gIGltcGxlbWVudHMgSW50ZXJuYWxQZXJzaXN0ZW5jZVxue1xuICBzdGF0aWMgdHlwZTogJ1NFU1NJT04nID0gJ1NFU1NJT04nO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCgpID0+IHdpbmRvdy5zZXNzaW9uU3RvcmFnZSwgUGVyc2lzdGVuY2VUeXBlLlNFU1NJT04pO1xuICB9XG5cbiAgX2FkZExpc3RlbmVyKF9rZXk6IHN0cmluZywgX2xpc3RlbmVyOiBTdG9yYWdlRXZlbnRMaXN0ZW5lcik6IHZvaWQge1xuICAgIC8vIExpc3RlbmVycyBhcmUgbm90IHN1cHBvcnRlZCBmb3Igc2Vzc2lvbiBzdG9yYWdlIHNpbmNlIGl0IGNhbm5vdCBiZSBzaGFyZWQgYWNyb3NzIHdpbmRvd3NcbiAgICByZXR1cm47XG4gIH1cblxuICBfcmVtb3ZlTGlzdGVuZXIoX2tleTogc3RyaW5nLCBfbGlzdGVuZXI6IFN0b3JhZ2VFdmVudExpc3RlbmVyKTogdm9pZCB7XG4gICAgLy8gTGlzdGVuZXJzIGFyZSBub3Qgc3VwcG9ydGVkIGZvciBzZXNzaW9uIHN0b3JhZ2Ugc2luY2UgaXQgY2Fubm90IGJlIHNoYXJlZCBhY3Jvc3Mgd2luZG93c1xuICAgIHJldHVybjtcbiAgfVxufVxuXG4vKipcbiAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBQZXJzaXN0ZW5jZX0gb2YgYFNFU1NJT05gIHVzaW5nIGBzZXNzaW9uU3RvcmFnZWBcbiAqIGZvciB0aGUgdW5kZXJseWluZyBzdG9yYWdlLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGJyb3dzZXJTZXNzaW9uUGVyc2lzdGVuY2U6IFBlcnNpc3RlbmNlID0gQnJvd3NlclNlc3Npb25QZXJzaXN0ZW5jZTtcbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4vKiogVE9ETzogcmVtb3ZlIHRoaXMgb25jZSB0c2xpYiBoYXMgYSBwb2x5ZmlsbCBmb3IgUHJvbWlzZS5hbGxTZXR0bGVkICovXG5pbnRlcmZhY2UgUHJvbWlzZUZ1bGZpbGxlZFJlc3VsdDxUPiB7XG4gIGZ1bGZpbGxlZDogdHJ1ZTtcbiAgdmFsdWU6IFQ7XG59XG5cbmludGVyZmFjZSBQcm9taXNlUmVqZWN0ZWRSZXN1bHQge1xuICBmdWxmaWxsZWQ6IGZhbHNlO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICByZWFzb246IGFueTtcbn1cblxuZXhwb3J0IHR5cGUgUHJvbWlzZVNldHRsZWRSZXN1bHQ8VD4gPVxuICB8IFByb21pc2VGdWxmaWxsZWRSZXN1bHQ8VD5cbiAgfCBQcm9taXNlUmVqZWN0ZWRSZXN1bHQ7XG5cbi8qKlxuICogU2hpbSBmb3IgUHJvbWlzZS5hbGxTZXR0bGVkLCBub3RlIHRoZSBzbGlnaHRseSBkaWZmZXJlbnQgZm9ybWF0IG9mIGBmdWxmaWxsZWRgIHZzIGBzdGF0dXNgLlxuICpcbiAqIEBwYXJhbSBwcm9taXNlcyAtIEFycmF5IG9mIHByb21pc2VzIHRvIHdhaXQgb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfYWxsU2V0dGxlZDxUPihcbiAgcHJvbWlzZXM6IEFycmF5PFByb21pc2U8VD4+XG4pOiBQcm9taXNlPEFycmF5PFByb21pc2VTZXR0bGVkUmVzdWx0PFQ+Pj4ge1xuICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgcHJvbWlzZXMubWFwKGFzeW5jIHByb21pc2UgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBwcm9taXNlO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGZ1bGZpbGxlZDogdHJ1ZSxcbiAgICAgICAgICB2YWx1ZVxuICAgICAgICB9IGFzIFByb21pc2VGdWxmaWxsZWRSZXN1bHQ8VD47XG4gICAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBmdWxmaWxsZWQ6IGZhbHNlLFxuICAgICAgICAgIHJlYXNvblxuICAgICAgICB9IGFzIFByb21pc2VSZWplY3RlZFJlc3VsdDtcbiAgICAgIH1cbiAgICB9KVxuICApO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7XG4gIFJlY2VpdmVySGFuZGxlcixcbiAgX0V2ZW50VHlwZSxcbiAgX1JlY2VpdmVyUmVzcG9uc2UsXG4gIFNlbmRlck1lc3NhZ2VFdmVudCxcbiAgX1N0YXR1cyxcbiAgX1NlbmRlclJlcXVlc3Rcbn0gZnJvbSAnLi9pbmRleCc7XG5pbXBvcnQgeyBfYWxsU2V0dGxlZCB9IGZyb20gJy4vcHJvbWlzZSc7XG5cbi8qKlxuICogSW50ZXJmYWNlIGNsYXNzIGZvciByZWNlaXZpbmcgbWVzc2FnZXMuXG4gKlxuICovXG5leHBvcnQgY2xhc3MgUmVjZWl2ZXIge1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSByZWNlaXZlcnM6IFJlY2VpdmVyW10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBib3VuZEV2ZW50SGFuZGxlcjogRXZlbnRMaXN0ZW5lcjtcblxuICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZXJzTWFwOiB7XG4gICAgLy8gVHlwZXNjcmlwdCBkb2Vzbid0IGhhdmUgZXhpc3RlbnRpYWwgdHlwZXMgOihcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIFtldmVudFR5cGU6IHN0cmluZ106IFNldDxSZWNlaXZlckhhbmRsZXI8YW55LCBhbnk+PjtcbiAgfSA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZXZlbnRUYXJnZXQ6IEV2ZW50VGFyZ2V0KSB7XG4gICAgdGhpcy5ib3VuZEV2ZW50SGFuZGxlciA9IHRoaXMuaGFuZGxlRXZlbnQuYmluZCh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnRhaW4gYW4gaW5zdGFuY2Ugb2YgYSBSZWNlaXZlciBmb3IgYSBnaXZlbiBldmVudCB0YXJnZXQsIGlmIG5vbmUgZXhpc3RzIGl0IHdpbGwgYmUgY3JlYXRlZC5cbiAgICpcbiAgICogQHBhcmFtIGV2ZW50VGFyZ2V0IC0gQW4gZXZlbnQgdGFyZ2V0IChzdWNoIGFzIHdpbmRvdyBvciBzZWxmKSB0aHJvdWdoIHdoaWNoIHRoZSB1bmRlcmx5aW5nXG4gICAqIG1lc3NhZ2VzIHdpbGwgYmUgcmVjZWl2ZWQuXG4gICAqL1xuICBzdGF0aWMgX2dldEluc3RhbmNlKGV2ZW50VGFyZ2V0OiBFdmVudFRhcmdldCk6IFJlY2VpdmVyIHtcbiAgICAvLyBUaGUgcmVzdWx0cyBhcmUgc3RvcmVkIGluIGFuIGFycmF5IHNpbmNlIG9iamVjdHMgY2FuJ3QgYmUga2V5cyBmb3Igb3RoZXJcbiAgICAvLyBvYmplY3RzLiBJbiBhZGRpdGlvbiwgc2V0dGluZyBhIHVuaXF1ZSBwcm9wZXJ0eSBvbiBhbiBldmVudCB0YXJnZXQgYXMgYVxuICAgIC8vIGhhc2ggbWFwIGtleSBtYXkgbm90IGJlIGFsbG93ZWQgZHVlIHRvIENPUlMgcmVzdHJpY3Rpb25zLlxuICAgIGNvbnN0IGV4aXN0aW5nSW5zdGFuY2UgPSB0aGlzLnJlY2VpdmVycy5maW5kKHJlY2VpdmVyID0+XG4gICAgICByZWNlaXZlci5pc0xpc3RlbmluZ3RvKGV2ZW50VGFyZ2V0KVxuICAgICk7XG4gICAgaWYgKGV4aXN0aW5nSW5zdGFuY2UpIHtcbiAgICAgIHJldHVybiBleGlzdGluZ0luc3RhbmNlO1xuICAgIH1cbiAgICBjb25zdCBuZXdJbnN0YW5jZSA9IG5ldyBSZWNlaXZlcihldmVudFRhcmdldCk7XG4gICAgdGhpcy5yZWNlaXZlcnMucHVzaChuZXdJbnN0YW5jZSk7XG4gICAgcmV0dXJuIG5ld0luc3RhbmNlO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0xpc3RlbmluZ3RvKGV2ZW50VGFyZ2V0OiBFdmVudFRhcmdldCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmV2ZW50VGFyZ2V0ID09PSBldmVudFRhcmdldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGYW5zIG91dCBhIE1lc3NhZ2VFdmVudCB0byB0aGUgYXBwcm9wcmlhdGUgbGlzdGVuZXJzLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBTZW5kcyBhbiB7QGxpbmsgU3RhdHVzLkFDS30gdXBvbiByZWNlaXB0IGFuZCBhIHtAbGluayBTdGF0dXMuRE9ORX0gb25jZSBhbGwgaGFuZGxlcnMgaGF2ZVxuICAgKiBmaW5pc2hlZCBwcm9jZXNzaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnQgLSBUaGUgTWVzc2FnZUV2ZW50LlxuICAgKlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVFdmVudDxcbiAgICBUIGV4dGVuZHMgX1JlY2VpdmVyUmVzcG9uc2UsXG4gICAgUyBleHRlbmRzIF9TZW5kZXJSZXF1ZXN0XG4gID4oZXZlbnQ6IEV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbWVzc2FnZUV2ZW50ID0gZXZlbnQgYXMgTWVzc2FnZUV2ZW50PFNlbmRlck1lc3NhZ2VFdmVudDxTPj47XG4gICAgY29uc3QgeyBldmVudElkLCBldmVudFR5cGUsIGRhdGEgfSA9IG1lc3NhZ2VFdmVudC5kYXRhO1xuXG4gICAgY29uc3QgaGFuZGxlcnM6IFNldDxSZWNlaXZlckhhbmRsZXI8VCwgUz4+IHwgdW5kZWZpbmVkID1cbiAgICAgIHRoaXMuaGFuZGxlcnNNYXBbZXZlbnRUeXBlXTtcbiAgICBpZiAoIWhhbmRsZXJzPy5zaXplKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbWVzc2FnZUV2ZW50LnBvcnRzWzBdLnBvc3RNZXNzYWdlKHtcbiAgICAgIHN0YXR1czogX1N0YXR1cy5BQ0ssXG4gICAgICBldmVudElkLFxuICAgICAgZXZlbnRUeXBlXG4gICAgfSk7XG5cbiAgICBjb25zdCBwcm9taXNlcyA9IEFycmF5LmZyb20oaGFuZGxlcnMpLm1hcChhc3luYyBoYW5kbGVyID0+XG4gICAgICBoYW5kbGVyKG1lc3NhZ2VFdmVudC5vcmlnaW4sIGRhdGEpXG4gICAgKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IF9hbGxTZXR0bGVkKHByb21pc2VzKTtcbiAgICBtZXNzYWdlRXZlbnQucG9ydHNbMF0ucG9zdE1lc3NhZ2Uoe1xuICAgICAgc3RhdHVzOiBfU3RhdHVzLkRPTkUsXG4gICAgICBldmVudElkLFxuICAgICAgZXZlbnRUeXBlLFxuICAgICAgcmVzcG9uc2VcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgYW4gZXZlbnQgaGFuZGxlciBmb3IgYSBwYXJ0aWN1bGFyIGV2ZW50LlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnRUeXBlIC0gRXZlbnQgbmFtZSB0byBzdWJzY3JpYmUgdG8uXG4gICAqIEBwYXJhbSBldmVudEhhbmRsZXIgLSBUaGUgZXZlbnQgaGFuZGxlciB3aGljaCBzaG91bGQgcmVjZWl2ZSB0aGUgZXZlbnRzLlxuICAgKlxuICAgKi9cbiAgX3N1YnNjcmliZTxUIGV4dGVuZHMgX1JlY2VpdmVyUmVzcG9uc2UsIFMgZXh0ZW5kcyBfU2VuZGVyUmVxdWVzdD4oXG4gICAgZXZlbnRUeXBlOiBfRXZlbnRUeXBlLFxuICAgIGV2ZW50SGFuZGxlcjogUmVjZWl2ZXJIYW5kbGVyPFQsIFM+XG4gICk6IHZvaWQge1xuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLmhhbmRsZXJzTWFwKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuZXZlbnRUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMuYm91bmRFdmVudEhhbmRsZXIpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5oYW5kbGVyc01hcFtldmVudFR5cGVdKSB7XG4gICAgICB0aGlzLmhhbmRsZXJzTWFwW2V2ZW50VHlwZV0gPSBuZXcgU2V0KCk7XG4gICAgfVxuXG4gICAgdGhpcy5oYW5kbGVyc01hcFtldmVudFR5cGVdLmFkZChldmVudEhhbmRsZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVuc3Vic2NyaWJlIGFuIGV2ZW50IGhhbmRsZXIgZnJvbSBhIHBhcnRpY3VsYXIgZXZlbnQuXG4gICAqXG4gICAqIEBwYXJhbSBldmVudFR5cGUgLSBFdmVudCBuYW1lIHRvIHVuc3Vic2NyaWJlIGZyb20uXG4gICAqIEBwYXJhbSBldmVudEhhbmRsZXIgLSBPcHRpbm9hbCBldmVudCBoYW5kbGVyLCBpZiBub25lIHByb3ZpZGVkLCB1bnN1YnNjcmliZSBhbGwgaGFuZGxlcnMgb24gdGhpcyBldmVudC5cbiAgICpcbiAgICovXG4gIF91bnN1YnNjcmliZTxUIGV4dGVuZHMgX1JlY2VpdmVyUmVzcG9uc2UsIFMgZXh0ZW5kcyBfU2VuZGVyUmVxdWVzdD4oXG4gICAgZXZlbnRUeXBlOiBfRXZlbnRUeXBlLFxuICAgIGV2ZW50SGFuZGxlcj86IFJlY2VpdmVySGFuZGxlcjxULCBTPlxuICApOiB2b2lkIHtcbiAgICBpZiAodGhpcy5oYW5kbGVyc01hcFtldmVudFR5cGVdICYmIGV2ZW50SGFuZGxlcikge1xuICAgICAgdGhpcy5oYW5kbGVyc01hcFtldmVudFR5cGVdLmRlbGV0ZShldmVudEhhbmRsZXIpO1xuICAgIH1cbiAgICBpZiAoIWV2ZW50SGFuZGxlciB8fCB0aGlzLmhhbmRsZXJzTWFwW2V2ZW50VHlwZV0uc2l6ZSA9PT0gMCkge1xuICAgICAgZGVsZXRlIHRoaXMuaGFuZGxlcnNNYXBbZXZlbnRUeXBlXTtcbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5oYW5kbGVyc01hcCkubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmV2ZW50VGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLmJvdW5kRXZlbnRIYW5kbGVyKTtcbiAgICB9XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gX2dlbmVyYXRlRXZlbnRJZChwcmVmaXggPSAnJywgZGlnaXRzID0gMTApOiBzdHJpbmcge1xuICBsZXQgcmFuZG9tID0gJyc7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGlnaXRzOyBpKyspIHtcbiAgICByYW5kb20gKz0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTApO1xuICB9XG4gIHJldHVybiBwcmVmaXggKyByYW5kb207XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgX2dlbmVyYXRlRXZlbnRJZCB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbC9ldmVudF9pZCc7XG5pbXBvcnQge1xuICBfU2VuZGVyUmVxdWVzdCxcbiAgX0V2ZW50VHlwZSxcbiAgUmVjZWl2ZXJNZXNzYWdlRXZlbnQsXG4gIF9NZXNzYWdlRXJyb3IsXG4gIFNlbmRlck1lc3NhZ2VFdmVudCxcbiAgX1N0YXR1cyxcbiAgX1JlY2VpdmVyTWVzc2FnZVJlc3BvbnNlLFxuICBfUmVjZWl2ZXJSZXNwb25zZSxcbiAgX1RpbWVvdXREdXJhdGlvblxufSBmcm9tICcuL2luZGV4JztcblxuaW50ZXJmYWNlIE1lc3NhZ2VIYW5kbGVyIHtcbiAgbWVzc2FnZUNoYW5uZWw6IE1lc3NhZ2VDaGFubmVsO1xuICBvbk1lc3NhZ2U6IEV2ZW50TGlzdGVuZXJPckV2ZW50TGlzdGVuZXJPYmplY3Q7XG59XG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciBzZW5kaW5nIG1lc3NhZ2VzIGFuZCB3YWl0aW5nIGZvciBhIGNvbXBsZXRpb24gcmVzcG9uc2UuXG4gKlxuICovXG5leHBvcnQgY2xhc3MgU2VuZGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBoYW5kbGVycyA9IG5ldyBTZXQ8TWVzc2FnZUhhbmRsZXI+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSB0YXJnZXQ6IFNlcnZpY2VXb3JrZXIpIHt9XG5cbiAgLyoqXG4gICAqIFVuc3Vic2NyaWJlIHRoZSBoYW5kbGVyIGFuZCByZW1vdmUgaXQgZnJvbSBvdXIgdHJhY2tpbmcgU2V0LlxuICAgKlxuICAgKiBAcGFyYW0gaGFuZGxlciAtIFRoZSBoYW5kbGVyIHRvIHVuc3Vic2NyaWJlLlxuICAgKi9cbiAgcHJpdmF0ZSByZW1vdmVNZXNzYWdlSGFuZGxlcihoYW5kbGVyOiBNZXNzYWdlSGFuZGxlcik6IHZvaWQge1xuICAgIGlmIChoYW5kbGVyLm1lc3NhZ2VDaGFubmVsKSB7XG4gICAgICBoYW5kbGVyLm1lc3NhZ2VDaGFubmVsLnBvcnQxLnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICAgICdtZXNzYWdlJyxcbiAgICAgICAgaGFuZGxlci5vbk1lc3NhZ2VcbiAgICAgICk7XG4gICAgICBoYW5kbGVyLm1lc3NhZ2VDaGFubmVsLnBvcnQxLmNsb3NlKCk7XG4gICAgfVxuICAgIHRoaXMuaGFuZGxlcnMuZGVsZXRlKGhhbmRsZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgYSBtZXNzYWdlIHRvIHRoZSBSZWNlaXZlciBsb2NhdGVkIGF0IHtAbGluayB0YXJnZXR9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBXZSdsbCBmaXJzdCB3YWl0IGEgYml0IGZvciBhbiBBQ0sgLCBpZiB3ZSBnZXQgb25lIHdlIHdpbGwgd2FpdCBzaWduaWZpY2FudGx5IGxvbmdlciB1bnRpbCB0aGVcbiAgICogcmVjZWl2ZXIgaGFzIGhhZCBhIGNoYW5jZSB0byBmdWxseSBwcm9jZXNzIHRoZSBldmVudC5cbiAgICpcbiAgICogQHBhcmFtIGV2ZW50VHlwZSAtIFR5cGUgb2YgZXZlbnQgdG8gc2VuZC5cbiAgICogQHBhcmFtIGRhdGEgLSBUaGUgcGF5bG9hZCBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSB0aW1lb3V0IC0gVGltZW91dCBmb3Igd2FpdGluZyBvbiBhbiBBQ0sgZnJvbSB0aGUgcmVjZWl2ZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHNldHRsZWQgcHJvbWlzZXMgZnJvbSBhbGwgdGhlIGhhbmRsZXJzIHRoYXQgd2VyZSBsaXN0ZW5pbmcgb24gdGhlIHJlY2VpdmVyLlxuICAgKi9cbiAgYXN5bmMgX3NlbmQ8VCBleHRlbmRzIF9SZWNlaXZlclJlc3BvbnNlLCBTIGV4dGVuZHMgX1NlbmRlclJlcXVlc3Q+KFxuICAgIGV2ZW50VHlwZTogX0V2ZW50VHlwZSxcbiAgICBkYXRhOiBTLFxuICAgIHRpbWVvdXQgPSBfVGltZW91dER1cmF0aW9uLkFDS1xuICApOiBQcm9taXNlPF9SZWNlaXZlck1lc3NhZ2VSZXNwb25zZTxUPj4ge1xuICAgIGNvbnN0IG1lc3NhZ2VDaGFubmVsID1cbiAgICAgIHR5cGVvZiBNZXNzYWdlQ2hhbm5lbCAhPT0gJ3VuZGVmaW5lZCcgPyBuZXcgTWVzc2FnZUNoYW5uZWwoKSA6IG51bGw7XG4gICAgaWYgKCFtZXNzYWdlQ2hhbm5lbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKF9NZXNzYWdlRXJyb3IuQ09OTkVDVElPTl9VTkFWQUlMQUJMRSk7XG4gICAgfVxuICAgIC8vIE5vZGUgdGltZXJzIGFuZCBicm93c2VyIHRpbWVycyByZXR1cm4gZnVuZGFtZW50YWxseSBkaWZmZXJlbnQgdHlwZXMuXG4gICAgLy8gV2UgZG9uJ3QgYWN0dWFsbHkgY2FyZSB3aGF0IHRoZSB2YWx1ZSBpcyBidXQgVFMgd29uJ3QgYWNjZXB0IHVua25vd24gYW5kXG4gICAgLy8gd2UgY2FuJ3QgY2FzdCBwcm9wZXJseSBpbiBib3RoIGVudmlyb25tZW50cy5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGxldCBjb21wbGV0aW9uVGltZXI6IGFueTtcbiAgICBsZXQgaGFuZGxlcjogTWVzc2FnZUhhbmRsZXI7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPF9SZWNlaXZlck1lc3NhZ2VSZXNwb25zZTxUPj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgZXZlbnRJZCA9IF9nZW5lcmF0ZUV2ZW50SWQoJycsIDIwKTtcbiAgICAgIG1lc3NhZ2VDaGFubmVsLnBvcnQxLnN0YXJ0KCk7XG4gICAgICBjb25zdCBhY2tUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKF9NZXNzYWdlRXJyb3IuVU5TVVBQT1JURURfRVZFTlQpKTtcbiAgICAgIH0sIHRpbWVvdXQpO1xuICAgICAgaGFuZGxlciA9IHtcbiAgICAgICAgbWVzc2FnZUNoYW5uZWwsXG4gICAgICAgIG9uTWVzc2FnZShldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgICBjb25zdCBtZXNzYWdlRXZlbnQgPSBldmVudCBhcyBNZXNzYWdlRXZlbnQ8UmVjZWl2ZXJNZXNzYWdlRXZlbnQ8VD4+O1xuICAgICAgICAgIGlmIChtZXNzYWdlRXZlbnQuZGF0YS5ldmVudElkICE9PSBldmVudElkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHN3aXRjaCAobWVzc2FnZUV2ZW50LmRhdGEuc3RhdHVzKSB7XG4gICAgICAgICAgICBjYXNlIF9TdGF0dXMuQUNLOlxuICAgICAgICAgICAgICAvLyBUaGUgcmVjZWl2ZXIgc2hvdWxkIEFDSyBmaXJzdC5cbiAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFja1RpbWVyKTtcbiAgICAgICAgICAgICAgY29tcGxldGlvblRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihfTWVzc2FnZUVycm9yLlRJTUVPVVQpKTtcbiAgICAgICAgICAgICAgfSwgX1RpbWVvdXREdXJhdGlvbi5DT01QTEVUSU9OKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIF9TdGF0dXMuRE9ORTpcbiAgICAgICAgICAgICAgLy8gT25jZSB0aGUgcmVjZWl2ZXIncyBoYW5kbGVycyBhcmUgZmluaXNoZWQgd2Ugd2lsbCBnZXQgdGhlIHJlc3VsdHMuXG4gICAgICAgICAgICAgIGNsZWFyVGltZW91dChjb21wbGV0aW9uVGltZXIpO1xuICAgICAgICAgICAgICByZXNvbHZlKG1lc3NhZ2VFdmVudC5kYXRhLnJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoYWNrVGltZXIpO1xuICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoY29tcGxldGlvblRpbWVyKTtcbiAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihfTWVzc2FnZUVycm9yLklOVkFMSURfUkVTUE9OU0UpKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdGhpcy5oYW5kbGVycy5hZGQoaGFuZGxlcik7XG4gICAgICBtZXNzYWdlQ2hhbm5lbC5wb3J0MS5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgaGFuZGxlci5vbk1lc3NhZ2UpO1xuICAgICAgdGhpcy50YXJnZXQucG9zdE1lc3NhZ2UoXG4gICAgICAgIHtcbiAgICAgICAgICBldmVudFR5cGUsXG4gICAgICAgICAgZXZlbnRJZCxcbiAgICAgICAgICBkYXRhXG4gICAgICAgIH0gYXMgU2VuZGVyTWVzc2FnZUV2ZW50PFM+LFxuICAgICAgICBbbWVzc2FnZUNoYW5uZWwucG9ydDJdXG4gICAgICApO1xuICAgIH0pLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVNZXNzYWdlSGFuZGxlcihoYW5kbGVyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IFJlY2FwdGNoYSwgR3JlQ0FQVENIQVRvcExldmVsIH0gZnJvbSAnLi9yZWNhcHRjaGEvcmVjYXB0Y2hhJztcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHdpbmRvdyB0eXBlIHRoYXQgbWVsZHMgdGhlIG5vcm1hbCB3aW5kb3cgdHlwZSBwbHVzIHRoZVxuICogdmFyaW91cyBiaXRzIHdlIG5lZWQuIFRoZSB0aHJlZSBkaWZmZXJlbnQgYmxvY2tzIHRoYXQgYXJlICYnZCB0b2dldGhlclxuICogY2FudCBiZSBkZWZpbmVkIGluIHRoZSBzYW1lIGJsb2NrIHRvZ2V0aGVyLlxuICovXG5leHBvcnQgdHlwZSBBdXRoV2luZG93ID0ge1xuICAvLyBTdGFuZGFyZCB3aW5kb3cgdHlwZXNcbiAgW1QgaW4ga2V5b2YgV2luZG93XTogV2luZG93W1RdO1xufSAmIHtcbiAgLy8gQW55IGtub3duIC8gbmFtZWQgcHJvcGVydGllcyB3ZSB3YW50IHRvIGFkZFxuICBncmVjYXB0Y2hhPzogUmVjYXB0Y2hhIHwgR3JlQ0FQVENIQVRvcExldmVsO1xuICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuICBfX19qc2w/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICBnYXBpPzogdHlwZW9mIGdhcGk7XG59ICYge1xuICAvLyBBIGZpbmFsIGNhdGNoLWFsbCBmb3IgY2FsbGJhY2tzICh3aGljaCB3aWxsIGhhdmUgcmFuZG9tIG5hbWVzKSB0aGF0XG4gIC8vIHdlIHdpbGwgc3RpY2sgb24gdGhlIHdpbmRvdy5cbiAgW2NhbGxiYWNrOiBzdHJpbmddOiAoLi4uYXJnczogdW5rbm93bltdKSA9PiB2b2lkO1xufTtcblxuLyoqXG4gKiBMYXp5IGFjY2Vzc29yIGZvciB3aW5kb3csIHNpbmNlIHRoZSBjb21wYXQgbGF5ZXIgd29uJ3QgdHJlZSBzaGFrZSB0aGlzIG91dCxcbiAqIHdlIG5lZWQgdG8gbWFrZSBzdXJlIG5vdCB0byBtZXNzIHdpdGggd2luZG93IHVubGVzcyB3ZSBoYXZlIHRvXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfd2luZG93KCk6IEF1dGhXaW5kb3cge1xuICByZXR1cm4gd2luZG93IGFzIHVua25vd24gYXMgQXV0aFdpbmRvdztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9zZXRXaW5kb3dMb2NhdGlvbih1cmw6IHN0cmluZyk6IHZvaWQge1xuICBfd2luZG93KCkubG9jYXRpb24uaHJlZiA9IHVybDtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgX3dpbmRvdyB9IGZyb20gJy4uL2F1dGhfd2luZG93JztcblxuZXhwb3J0IGZ1bmN0aW9uIF9pc1dvcmtlcigpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgX3dpbmRvdygpWydXb3JrZXJHbG9iYWxTY29wZSddICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIHR5cGVvZiBfd2luZG93KClbJ2ltcG9ydFNjcmlwdHMnXSA9PT0gJ2Z1bmN0aW9uJ1xuICApO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gX2dldEFjdGl2ZVNlcnZpY2VXb3JrZXIoKTogUHJvbWlzZTxTZXJ2aWNlV29ya2VyIHwgbnVsbD4ge1xuICBpZiAoIW5hdmlnYXRvcj8uc2VydmljZVdvcmtlcikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgcmVnaXN0cmF0aW9uID0gYXdhaXQgbmF2aWdhdG9yLnNlcnZpY2VXb3JrZXIucmVhZHk7XG4gICAgcmV0dXJuIHJlZ2lzdHJhdGlvbi5hY3RpdmU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfZ2V0U2VydmljZVdvcmtlckNvbnRyb2xsZXIoKTogU2VydmljZVdvcmtlciB8IG51bGwge1xuICByZXR1cm4gbmF2aWdhdG9yPy5zZXJ2aWNlV29ya2VyPy5jb250cm9sbGVyIHx8IG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfZ2V0V29ya2VyR2xvYmFsU2NvcGUoKTogU2VydmljZVdvcmtlciB8IG51bGwge1xuICByZXR1cm4gX2lzV29ya2VyKCkgPyAoc2VsZiBhcyB1bmtub3duIGFzIFNlcnZpY2VXb3JrZXIpIDogbnVsbDtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBQZXJzaXN0ZW5jZSB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5pbXBvcnQge1xuICBQZXJzaXN0ZWRCbG9iLFxuICBQZXJzaXN0ZW5jZUludGVybmFsIGFzIEludGVybmFsUGVyc2lzdGVuY2UsXG4gIFBlcnNpc3RlbmNlVHlwZSxcbiAgUGVyc2lzdGVuY2VWYWx1ZSxcbiAgU3RvcmFnZUV2ZW50TGlzdGVuZXIsXG4gIFNUT1JBR0VfQVZBSUxBQkxFX0tFWVxufSBmcm9tICcuLi8uLi9jb3JlL3BlcnNpc3RlbmNlLyc7XG5pbXBvcnQge1xuICBfRXZlbnRUeXBlLFxuICBfUGluZ1Jlc3BvbnNlLFxuICBLZXlDaGFuZ2VkUmVzcG9uc2UsXG4gIEtleUNoYW5nZWRSZXF1ZXN0LFxuICBQaW5nUmVxdWVzdCxcbiAgX1RpbWVvdXREdXJhdGlvblxufSBmcm9tICcuLi9tZXNzYWdlY2hhbm5lbC9pbmRleCc7XG5pbXBvcnQgeyBSZWNlaXZlciB9IGZyb20gJy4uL21lc3NhZ2VjaGFubmVsL3JlY2VpdmVyJztcbmltcG9ydCB7IFNlbmRlciB9IGZyb20gJy4uL21lc3NhZ2VjaGFubmVsL3NlbmRlcic7XG5pbXBvcnQge1xuICBfaXNXb3JrZXIsXG4gIF9nZXRBY3RpdmVTZXJ2aWNlV29ya2VyLFxuICBfZ2V0U2VydmljZVdvcmtlckNvbnRyb2xsZXIsXG4gIF9nZXRXb3JrZXJHbG9iYWxTY29wZVxufSBmcm9tICcuLi91dGlsL3dvcmtlcic7XG5cbmV4cG9ydCBjb25zdCBEQl9OQU1FID0gJ2ZpcmViYXNlTG9jYWxTdG9yYWdlRGInO1xuY29uc3QgREJfVkVSU0lPTiA9IDE7XG5jb25zdCBEQl9PQkpFQ1RTVE9SRV9OQU1FID0gJ2ZpcmViYXNlTG9jYWxTdG9yYWdlJztcbmNvbnN0IERCX0RBVEFfS0VZUEFUSCA9ICdmYmFzZV9rZXknO1xuXG5pbnRlcmZhY2UgREJPYmplY3Qge1xuICBbREJfREFUQV9LRVlQQVRIXTogc3RyaW5nO1xuICB2YWx1ZTogUGVyc2lzdGVkQmxvYjtcbn1cblxuLyoqXG4gKiBQcm9taXNlIHdyYXBwZXIgZm9yIElEQlJlcXVlc3RcbiAqXG4gKiBVbmZvcnR1bmF0ZWx5IHdlIGNhbid0IGNsZWFubHkgZXh0ZW5kIFByb21pc2U8VD4gc2luY2UgcHJvbWlzZXMgYXJlIG5vdCBjYWxsYWJsZSBpbiBFUzZcbiAqXG4gKi9cbmNsYXNzIERCUHJvbWlzZTxUPiB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcmVxdWVzdDogSURCUmVxdWVzdCkge31cblxuICB0b1Byb21pc2UoKTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPFQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMucmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCdzdWNjZXNzJywgKCkgPT4ge1xuICAgICAgICByZXNvbHZlKHRoaXMucmVxdWVzdC5yZXN1bHQpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoKSA9PiB7XG4gICAgICAgIHJlamVjdCh0aGlzLnJlcXVlc3QuZXJyb3IpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0T2JqZWN0U3RvcmUoZGI6IElEQkRhdGFiYXNlLCBpc1JlYWRXcml0ZTogYm9vbGVhbik6IElEQk9iamVjdFN0b3JlIHtcbiAgcmV0dXJuIGRiXG4gICAgLnRyYW5zYWN0aW9uKFtEQl9PQkpFQ1RTVE9SRV9OQU1FXSwgaXNSZWFkV3JpdGUgPyAncmVhZHdyaXRlJyA6ICdyZWFkb25seScpXG4gICAgLm9iamVjdFN0b3JlKERCX09CSkVDVFNUT1JFX05BTUUpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gX2NsZWFyRGF0YWJhc2UoZGI6IElEQkRhdGFiYXNlKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IG9iamVjdFN0b3JlID0gZ2V0T2JqZWN0U3RvcmUoZGIsIHRydWUpO1xuICByZXR1cm4gbmV3IERCUHJvbWlzZTx2b2lkPihvYmplY3RTdG9yZS5jbGVhcigpKS50b1Byb21pc2UoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9kZWxldGVEYXRhYmFzZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVxdWVzdCA9IGluZGV4ZWREQi5kZWxldGVEYXRhYmFzZShEQl9OQU1FKTtcbiAgcmV0dXJuIG5ldyBEQlByb21pc2U8dm9pZD4ocmVxdWVzdCkudG9Qcm9taXNlKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfb3BlbkRhdGFiYXNlKCk6IFByb21pc2U8SURCRGF0YWJhc2U+IHtcbiAgY29uc3QgcmVxdWVzdCA9IGluZGV4ZWREQi5vcGVuKERCX05BTUUsIERCX1ZFUlNJT04pO1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoKSA9PiB7XG4gICAgICByZWplY3QocmVxdWVzdC5lcnJvcik7XG4gICAgfSk7XG5cbiAgICByZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoJ3VwZ3JhZGVuZWVkZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkYiA9IHJlcXVlc3QucmVzdWx0O1xuXG4gICAgICB0cnkge1xuICAgICAgICBkYi5jcmVhdGVPYmplY3RTdG9yZShEQl9PQkpFQ1RTVE9SRV9OQU1FLCB7IGtleVBhdGg6IERCX0RBVEFfS0VZUEFUSCB9KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCdzdWNjZXNzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZGI6IElEQkRhdGFiYXNlID0gcmVxdWVzdC5yZXN1bHQ7XG4gICAgICAvLyBTdHJhbmdlIGJ1ZyB0aGF0IG9jY3VycyBpbiBGaXJlZm94IHdoZW4gbXVsdGlwbGUgdGFicyBhcmUgb3BlbmVkIGF0IHRoZVxuICAgICAgLy8gc2FtZSB0aW1lLiBUaGUgb25seSB3YXkgdG8gcmVjb3ZlciBzZWVtcyB0byBiZSBkZWxldGluZyB0aGUgZGF0YWJhc2VcbiAgICAgIC8vIGFuZCByZS1pbml0aWFsaXppbmcgaXQuXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmlyZWJhc2UvZmlyZWJhc2UtanMtc2RrL2lzc3Vlcy82MzRcblxuICAgICAgaWYgKCFkYi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKERCX09CSkVDVFNUT1JFX05BTUUpKSB7XG4gICAgICAgIC8vIE5lZWQgdG8gY2xvc2UgdGhlIGRhdGFiYXNlIG9yIGVsc2UgeW91IGdldCBhIGBibG9ja2VkYCBldmVudFxuICAgICAgICBkYi5jbG9zZSgpO1xuICAgICAgICBhd2FpdCBfZGVsZXRlRGF0YWJhc2UoKTtcbiAgICAgICAgcmVzb2x2ZShhd2FpdCBfb3BlbkRhdGFiYXNlKCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZShkYik7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gX3B1dE9iamVjdChcbiAgZGI6IElEQkRhdGFiYXNlLFxuICBrZXk6IHN0cmluZyxcbiAgdmFsdWU6IFBlcnNpc3RlbmNlVmFsdWUgfCBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZXF1ZXN0ID0gZ2V0T2JqZWN0U3RvcmUoZGIsIHRydWUpLnB1dCh7XG4gICAgW0RCX0RBVEFfS0VZUEFUSF06IGtleSxcbiAgICB2YWx1ZVxuICB9KTtcbiAgcmV0dXJuIG5ldyBEQlByb21pc2U8dm9pZD4ocmVxdWVzdCkudG9Qcm9taXNlKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldE9iamVjdChcbiAgZGI6IElEQkRhdGFiYXNlLFxuICBrZXk6IHN0cmluZ1xuKTogUHJvbWlzZTxQZXJzaXN0ZWRCbG9iIHwgbnVsbD4ge1xuICBjb25zdCByZXF1ZXN0ID0gZ2V0T2JqZWN0U3RvcmUoZGIsIGZhbHNlKS5nZXQoa2V5KTtcbiAgY29uc3QgZGF0YSA9IGF3YWl0IG5ldyBEQlByb21pc2U8REJPYmplY3QgfCB1bmRlZmluZWQ+KHJlcXVlc3QpLnRvUHJvbWlzZSgpO1xuICByZXR1cm4gZGF0YSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRhdGEudmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfZGVsZXRlT2JqZWN0KGRiOiBJREJEYXRhYmFzZSwga2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVxdWVzdCA9IGdldE9iamVjdFN0b3JlKGRiLCB0cnVlKS5kZWxldGUoa2V5KTtcbiAgcmV0dXJuIG5ldyBEQlByb21pc2U8dm9pZD4ocmVxdWVzdCkudG9Qcm9taXNlKCk7XG59XG5cbmV4cG9ydCBjb25zdCBfUE9MTElOR19JTlRFUlZBTF9NUyA9IDgwMDtcbmV4cG9ydCBjb25zdCBfVFJBTlNBQ1RJT05fUkVUUllfQ09VTlQgPSAzO1xuXG5jbGFzcyBJbmRleGVkREJMb2NhbFBlcnNpc3RlbmNlIGltcGxlbWVudHMgSW50ZXJuYWxQZXJzaXN0ZW5jZSB7XG4gIHN0YXRpYyB0eXBlOiAnTE9DQUwnID0gJ0xPQ0FMJztcblxuICB0eXBlID0gUGVyc2lzdGVuY2VUeXBlLkxPQ0FMO1xuICBkYj86IElEQkRhdGFiYXNlO1xuICByZWFkb25seSBfc2hvdWxkQWxsb3dNaWdyYXRpb24gPSB0cnVlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbGlzdGVuZXJzOiBSZWNvcmQ8c3RyaW5nLCBTZXQ8U3RvcmFnZUV2ZW50TGlzdGVuZXI+PiA9IHt9O1xuICBwcml2YXRlIHJlYWRvbmx5IGxvY2FsQ2FjaGU6IFJlY29yZDxzdHJpbmcsIFBlcnNpc3RlbmNlVmFsdWUgfCBudWxsPiA9IHt9O1xuICAvLyBzZXRUaW1lb3V0IHJldHVybiB2YWx1ZSBpcyBwbGF0Zm9ybSBzcGVjaWZpY1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwcml2YXRlIHBvbGxUaW1lcjogYW55IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcGVuZGluZ1dyaXRlcyA9IDA7XG5cbiAgcHJpdmF0ZSByZWNlaXZlcjogUmVjZWl2ZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzZW5kZXI6IFNlbmRlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNlcnZpY2VXb3JrZXJSZWNlaXZlckF2YWlsYWJsZSA9IGZhbHNlO1xuICBwcml2YXRlIGFjdGl2ZVNlcnZpY2VXb3JrZXI6IFNlcnZpY2VXb3JrZXIgfCBudWxsID0gbnVsbDtcbiAgLy8gVmlzaWJsZSBmb3IgdGVzdGluZyBvbmx5XG4gIHJlYWRvbmx5IF93b3JrZXJJbml0aWFsaXphdGlvblByb21pc2U6IFByb21pc2U8dm9pZD47XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gRmlyZSAmIGZvcmdldCB0aGUgc2VydmljZSB3b3JrZXIgcmVnaXN0cmF0aW9uIGFzIGl0IG1heSBuZXZlciByZXNvbHZlXG4gICAgdGhpcy5fd29ya2VySW5pdGlhbGl6YXRpb25Qcm9taXNlID1cbiAgICAgIHRoaXMuaW5pdGlhbGl6ZVNlcnZpY2VXb3JrZXJNZXNzYWdpbmcoKS50aGVuKFxuICAgICAgICAoKSA9PiB7fSxcbiAgICAgICAgKCkgPT4ge31cbiAgICAgICk7XG4gIH1cblxuICBhc3luYyBfb3BlbkRiKCk6IFByb21pc2U8SURCRGF0YWJhc2U+IHtcbiAgICBpZiAodGhpcy5kYikge1xuICAgICAgcmV0dXJuIHRoaXMuZGI7XG4gICAgfVxuICAgIHRoaXMuZGIgPSBhd2FpdCBfb3BlbkRhdGFiYXNlKCk7XG4gICAgcmV0dXJuIHRoaXMuZGI7XG4gIH1cblxuICBhc3luYyBfd2l0aFJldHJpZXM8VD4ob3A6IChkYjogSURCRGF0YWJhc2UpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICBsZXQgbnVtQXR0ZW1wdHMgPSAwO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGRiID0gYXdhaXQgdGhpcy5fb3BlbkRiKCk7XG4gICAgICAgIHJldHVybiBhd2FpdCBvcChkYik7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChudW1BdHRlbXB0cysrID4gX1RSQU5TQUNUSU9OX1JFVFJZX0NPVU5UKSB7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kYikge1xuICAgICAgICAgIHRoaXMuZGIuY2xvc2UoKTtcbiAgICAgICAgICB0aGlzLmRiID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRPRE86IGNvbnNpZGVyIGFkZGluZyBleHBvbmVudGlhbCBiYWNrb2ZmXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluZGV4ZWREQiBldmVudHMgZG8gbm90IHByb3BhZ2F0ZSBmcm9tIHRoZSBtYWluIHdpbmRvdyB0byB0aGUgd29ya2VyIGNvbnRleHQuICBXZSByZWx5IG9uIGFcbiAgICogcG9zdE1lc3NhZ2UgaW50ZXJmYWNlIHRvIHNlbmQgdGhlc2UgZXZlbnRzIHRvIHRoZSB3b3JrZXIgb3Vyc2VsdmVzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplU2VydmljZVdvcmtlck1lc3NhZ2luZygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gX2lzV29ya2VyKCkgPyB0aGlzLmluaXRpYWxpemVSZWNlaXZlcigpIDogdGhpcy5pbml0aWFsaXplU2VuZGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQXMgdGhlIHdvcmtlciB3ZSBzaG91bGQgbGlzdGVuIHRvIGV2ZW50cyBmcm9tIHRoZSBtYWluIHdpbmRvdy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaW5pdGlhbGl6ZVJlY2VpdmVyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMucmVjZWl2ZXIgPSBSZWNlaXZlci5fZ2V0SW5zdGFuY2UoX2dldFdvcmtlckdsb2JhbFNjb3BlKCkhKTtcbiAgICAvLyBSZWZyZXNoIGZyb20gcGVyc2lzdGVuY2UgaWYgd2UgcmVjZWl2ZSBhIEtleUNoYW5nZWQgbWVzc2FnZS5cbiAgICB0aGlzLnJlY2VpdmVyLl9zdWJzY3JpYmUoXG4gICAgICBfRXZlbnRUeXBlLktFWV9DSEFOR0VELFxuICAgICAgYXN5bmMgKF9vcmlnaW46IHN0cmluZywgZGF0YTogS2V5Q2hhbmdlZFJlcXVlc3QpID0+IHtcbiAgICAgICAgY29uc3Qga2V5cyA9IGF3YWl0IHRoaXMuX3BvbGwoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBrZXlQcm9jZXNzZWQ6IGtleXMuaW5jbHVkZXMoZGF0YS5rZXkpXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgKTtcbiAgICAvLyBMZXQgdGhlIHNlbmRlciBrbm93IHRoYXQgd2UgYXJlIGxpc3RlbmluZyBzbyB0aGV5IGdpdmUgdXMgbW9yZSB0aW1lb3V0LlxuICAgIHRoaXMucmVjZWl2ZXIuX3N1YnNjcmliZShcbiAgICAgIF9FdmVudFR5cGUuUElORyxcbiAgICAgIGFzeW5jIChfb3JpZ2luOiBzdHJpbmcsIF9kYXRhOiBQaW5nUmVxdWVzdCkgPT4ge1xuICAgICAgICByZXR1cm4gW19FdmVudFR5cGUuS0VZX0NIQU5HRURdO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQXMgdGhlIG1haW4gd2luZG93LCB3ZSBzaG91bGQgbGV0IHRoZSB3b3JrZXIga25vdyB3aGVuIGtleXMgY2hhbmdlIChzZXQgYW5kIHJlbW92ZSkuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvU2VydmljZVdvcmtlckNvbnRhaW5lci9yZWFkeSB8IFNlcnZpY2VXb3JrZXJDb250YWluZXIucmVhZHl9XG4gICAqIG1heSBub3QgcmVzb2x2ZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaW5pdGlhbGl6ZVNlbmRlcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlcmUncyBhbiBhY3RpdmUgc2VydmljZSB3b3JrZXIuXG4gICAgdGhpcy5hY3RpdmVTZXJ2aWNlV29ya2VyID0gYXdhaXQgX2dldEFjdGl2ZVNlcnZpY2VXb3JrZXIoKTtcbiAgICBpZiAoIXRoaXMuYWN0aXZlU2VydmljZVdvcmtlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNlbmRlciA9IG5ldyBTZW5kZXIodGhpcy5hY3RpdmVTZXJ2aWNlV29ya2VyKTtcbiAgICAvLyBQaW5nIHRoZSBzZXJ2aWNlIHdvcmtlciB0byBjaGVjayB3aGF0IGV2ZW50cyB0aGV5IGNhbiBoYW5kbGUuXG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuc2VuZGVyLl9zZW5kPF9QaW5nUmVzcG9uc2UsIFBpbmdSZXF1ZXN0PihcbiAgICAgIF9FdmVudFR5cGUuUElORyxcbiAgICAgIHt9LFxuICAgICAgX1RpbWVvdXREdXJhdGlvbi5MT05HX0FDS1xuICAgICk7XG4gICAgaWYgKCFyZXN1bHRzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHJlc3VsdHNbMF0/LmZ1bGZpbGxlZCAmJlxuICAgICAgcmVzdWx0c1swXT8udmFsdWUuaW5jbHVkZXMoX0V2ZW50VHlwZS5LRVlfQ0hBTkdFRClcbiAgICApIHtcbiAgICAgIHRoaXMuc2VydmljZVdvcmtlclJlY2VpdmVyQXZhaWxhYmxlID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGV0IHRoZSB3b3JrZXIga25vdyBhYm91dCBhIGNoYW5nZWQga2V5LCB0aGUgZXhhY3Qga2V5IGRvZXNuJ3QgdGVjaG5pY2FsbHkgbWF0dGVyIHNpbmNlIHRoZVxuICAgKiB3b3JrZXIgd2lsbCBqdXN0IHRyaWdnZXIgYSBmdWxsIHN5bmMgYW55d2F5LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBGb3Igbm93LCB3ZSBvbmx5IHN1cHBvcnQgb25lIHNlcnZpY2Ugd29ya2VyIHBlciBwYWdlLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IC0gU3RvcmFnZSBrZXkgd2hpY2ggY2hhbmdlZC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbm90aWZ5U2VydmljZVdvcmtlcihrZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChcbiAgICAgICF0aGlzLnNlbmRlciB8fFxuICAgICAgIXRoaXMuYWN0aXZlU2VydmljZVdvcmtlciB8fFxuICAgICAgX2dldFNlcnZpY2VXb3JrZXJDb250cm9sbGVyKCkgIT09IHRoaXMuYWN0aXZlU2VydmljZVdvcmtlclxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5zZW5kZXIuX3NlbmQ8S2V5Q2hhbmdlZFJlc3BvbnNlLCBLZXlDaGFuZ2VkUmVxdWVzdD4oXG4gICAgICAgIF9FdmVudFR5cGUuS0VZX0NIQU5HRUQsXG4gICAgICAgIHsga2V5IH0sXG4gICAgICAgIC8vIFVzZSBsb25nIHRpbWVvdXQgaWYgcmVjZWl2ZXIgaGFzIHByZXZpb3VzbHkgcmVzcG9uZGVkIHRvIGEgcGluZyBmcm9tIHVzLlxuICAgICAgICB0aGlzLnNlcnZpY2VXb3JrZXJSZWNlaXZlckF2YWlsYWJsZVxuICAgICAgICAgID8gX1RpbWVvdXREdXJhdGlvbi5MT05HX0FDS1xuICAgICAgICAgIDogX1RpbWVvdXREdXJhdGlvbi5BQ0tcbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBUaGlzIGlzIGEgYmVzdCBlZmZvcnQgYXBwcm9hY2guIElnbm9yZSBlcnJvcnMuXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgX2lzQXZhaWxhYmxlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIWluZGV4ZWREQikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCBkYiA9IGF3YWl0IF9vcGVuRGF0YWJhc2UoKTtcbiAgICAgIGF3YWl0IF9wdXRPYmplY3QoZGIsIFNUT1JBR0VfQVZBSUxBQkxFX0tFWSwgJzEnKTtcbiAgICAgIGF3YWl0IF9kZWxldGVPYmplY3QoZGIsIFNUT1JBR0VfQVZBSUxBQkxFX0tFWSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIHt9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfd2l0aFBlbmRpbmdXcml0ZSh3cml0ZTogKCkgPT4gUHJvbWlzZTx2b2lkPik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMucGVuZGluZ1dyaXRlcysrO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB3cml0ZSgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnBlbmRpbmdXcml0ZXMtLTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBfc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogUGVyc2lzdGVuY2VWYWx1ZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl93aXRoUGVuZGluZ1dyaXRlKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuX3dpdGhSZXRyaWVzKChkYjogSURCRGF0YWJhc2UpID0+IF9wdXRPYmplY3QoZGIsIGtleSwgdmFsdWUpKTtcbiAgICAgIHRoaXMubG9jYWxDYWNoZVtrZXldID0gdmFsdWU7XG4gICAgICByZXR1cm4gdGhpcy5ub3RpZnlTZXJ2aWNlV29ya2VyKGtleSk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBfZ2V0PFQgZXh0ZW5kcyBQZXJzaXN0ZW5jZVZhbHVlPihrZXk6IHN0cmluZyk6IFByb21pc2U8VCB8IG51bGw+IHtcbiAgICBjb25zdCBvYmogPSAoYXdhaXQgdGhpcy5fd2l0aFJldHJpZXMoKGRiOiBJREJEYXRhYmFzZSkgPT5cbiAgICAgIGdldE9iamVjdChkYiwga2V5KVxuICAgICkpIGFzIFQ7XG4gICAgdGhpcy5sb2NhbENhY2hlW2tleV0gPSBvYmo7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIGFzeW5jIF9yZW1vdmUoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd2l0aFBlbmRpbmdXcml0ZShhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLl93aXRoUmV0cmllcygoZGI6IElEQkRhdGFiYXNlKSA9PiBfZGVsZXRlT2JqZWN0KGRiLCBrZXkpKTtcbiAgICAgIGRlbGV0ZSB0aGlzLmxvY2FsQ2FjaGVba2V5XTtcbiAgICAgIHJldHVybiB0aGlzLm5vdGlmeVNlcnZpY2VXb3JrZXIoa2V5KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX3BvbGwoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIC8vIFRPRE86IGNoZWNrIGlmIHdlIG5lZWQgdG8gZmFsbGJhY2sgaWYgZ2V0QWxsIGlzIG5vdCBzdXBwb3J0ZWRcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLl93aXRoUmV0cmllcygoZGI6IElEQkRhdGFiYXNlKSA9PiB7XG4gICAgICBjb25zdCBnZXRBbGxSZXF1ZXN0ID0gZ2V0T2JqZWN0U3RvcmUoZGIsIGZhbHNlKS5nZXRBbGwoKTtcbiAgICAgIHJldHVybiBuZXcgREJQcm9taXNlPERCT2JqZWN0W10gfCBudWxsPihnZXRBbGxSZXF1ZXN0KS50b1Byb21pc2UoKTtcbiAgICB9KTtcblxuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8gSWYgd2UgaGF2ZSBwZW5kaW5nIHdyaXRlcyBpbiBwcm9ncmVzcyBhYm9ydCwgd2UnbGwgZ2V0IHBpY2tlZCB1cCBvbiB0aGUgbmV4dCBwb2xsXG4gICAgaWYgKHRoaXMucGVuZGluZ1dyaXRlcyAhPT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGtleXMgPSBbXTtcbiAgICBjb25zdCBrZXlzSW5SZXN1bHQgPSBuZXcgU2V0KCk7XG4gICAgZm9yIChjb25zdCB7IGZiYXNlX2tleToga2V5LCB2YWx1ZSB9IG9mIHJlc3VsdCkge1xuICAgICAga2V5c0luUmVzdWx0LmFkZChrZXkpO1xuICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KHRoaXMubG9jYWxDYWNoZVtrZXldKSAhPT0gSlNPTi5zdHJpbmdpZnkodmFsdWUpKSB7XG4gICAgICAgIHRoaXMubm90aWZ5TGlzdGVuZXJzKGtleSwgdmFsdWUgYXMgUGVyc2lzdGVuY2VWYWx1ZSk7XG4gICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGxvY2FsS2V5IG9mIE9iamVjdC5rZXlzKHRoaXMubG9jYWxDYWNoZSkpIHtcbiAgICAgIGlmICh0aGlzLmxvY2FsQ2FjaGVbbG9jYWxLZXldICYmICFrZXlzSW5SZXN1bHQuaGFzKGxvY2FsS2V5KSkge1xuICAgICAgICAvLyBEZWxldGVkXG4gICAgICAgIHRoaXMubm90aWZ5TGlzdGVuZXJzKGxvY2FsS2V5LCBudWxsKTtcbiAgICAgICAga2V5cy5wdXNoKGxvY2FsS2V5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGtleXM7XG4gIH1cblxuICBwcml2YXRlIG5vdGlmeUxpc3RlbmVycyhcbiAgICBrZXk6IHN0cmluZyxcbiAgICBuZXdWYWx1ZTogUGVyc2lzdGVuY2VWYWx1ZSB8IG51bGxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5sb2NhbENhY2hlW2tleV0gPSBuZXdWYWx1ZTtcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVyc1trZXldO1xuICAgIGlmIChsaXN0ZW5lcnMpIHtcbiAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgQXJyYXkuZnJvbShsaXN0ZW5lcnMpKSB7XG4gICAgICAgIGxpc3RlbmVyKG5ld1ZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0UG9sbGluZygpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3BQb2xsaW5nKCk7XG5cbiAgICB0aGlzLnBvbGxUaW1lciA9IHNldEludGVydmFsKFxuICAgICAgYXN5bmMgKCkgPT4gdGhpcy5fcG9sbCgpLFxuICAgICAgX1BPTExJTkdfSU5URVJWQUxfTVNcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9wUG9sbGluZygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wb2xsVGltZXIpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5wb2xsVGltZXIpO1xuICAgICAgdGhpcy5wb2xsVGltZXIgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIF9hZGRMaXN0ZW5lcihrZXk6IHN0cmluZywgbGlzdGVuZXI6IFN0b3JhZ2VFdmVudExpc3RlbmVyKTogdm9pZCB7XG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMubGlzdGVuZXJzKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuc3RhcnRQb2xsaW5nKCk7XG4gICAgfVxuICAgIGlmICghdGhpcy5saXN0ZW5lcnNba2V5XSkge1xuICAgICAgdGhpcy5saXN0ZW5lcnNba2V5XSA9IG5ldyBTZXQoKTtcbiAgICAgIC8vIFBvcHVsYXRlIHRoZSBjYWNoZSB0byBhdm9pZCBzcHVyaW91c2x5IHRyaWdnZXJpbmcgb24gZmlyc3QgcG9sbC5cbiAgICAgIHZvaWQgdGhpcy5fZ2V0KGtleSk7IC8vIFRoaXMgY2FuIGhhcHBlbiBpbiB0aGUgYmFja2dyb3VuZCBhc3luYyBhbmQgd2UgY2FuIHJldHVybiBpbW1lZGlhdGVseS5cbiAgICB9XG4gICAgdGhpcy5saXN0ZW5lcnNba2V5XS5hZGQobGlzdGVuZXIpO1xuICB9XG5cbiAgX3JlbW92ZUxpc3RlbmVyKGtleTogc3RyaW5nLCBsaXN0ZW5lcjogU3RvcmFnZUV2ZW50TGlzdGVuZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5saXN0ZW5lcnNba2V5XSkge1xuICAgICAgdGhpcy5saXN0ZW5lcnNba2V5XS5kZWxldGUobGlzdGVuZXIpO1xuXG4gICAgICBpZiAodGhpcy5saXN0ZW5lcnNba2V5XS5zaXplID09PSAwKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmxpc3RlbmVyc1trZXldO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLmxpc3RlbmVycykubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnN0b3BQb2xsaW5nKCk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQW4gaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFBlcnNpc3RlbmNlfSBvZiB0eXBlIGBMT0NBTGAgdXNpbmcgYGluZGV4ZWREQmBcbiAqIGZvciB0aGUgdW5kZXJseWluZyBzdG9yYWdlLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGluZGV4ZWREQkxvY2FsUGVyc2lzdGVuY2U6IFBlcnNpc3RlbmNlID0gSW5kZXhlZERCTG9jYWxQZXJzaXN0ZW5jZTtcbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQge1xuICBfcGVyZm9ybUFwaVJlcXVlc3QsXG4gIEVuZHBvaW50LFxuICBIdHRwTWV0aG9kLFxuICBfYWRkVGlkSWZOZWNlc3Nhcnlcbn0gZnJvbSAnLi4vaW5kZXgnO1xuaW1wb3J0IHsgQXV0aCB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5pbXBvcnQgeyBJZFRva2VuUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9tb2RlbC9pZF90b2tlbic7XG5pbXBvcnQgeyBNZmFFbnJvbGxtZW50IH0gZnJvbSAnLi4vYWNjb3VudF9tYW5hZ2VtZW50L21mYSc7XG5pbXBvcnQgeyBTaWduSW5XaXRoSWRwUmVzcG9uc2UgfSBmcm9tICcuL2lkcCc7XG5pbXBvcnQge1xuICBTaWduSW5XaXRoUGhvbmVOdW1iZXJSZXF1ZXN0LFxuICBTaWduSW5XaXRoUGhvbmVOdW1iZXJSZXNwb25zZVxufSBmcm9tICcuL3Ntcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmluYWxpemVNZmFSZXNwb25zZSB7XG4gIGlkVG9rZW46IHN0cmluZztcbiAgcmVmcmVzaFRva2VuOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRUb2tlbk1mYVJlc3BvbnNlIGV4dGVuZHMgSWRUb2tlblJlc3BvbnNlIHtcbiAgbWZhUGVuZGluZ0NyZWRlbnRpYWw/OiBzdHJpbmc7XG4gIG1mYUluZm8/OiBNZmFFbnJvbGxtZW50W107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhcnRQaG9uZU1mYVNpZ25JblJlcXVlc3Qge1xuICBtZmFQZW5kaW5nQ3JlZGVudGlhbDogc3RyaW5nO1xuICBtZmFFbnJvbGxtZW50SWQ6IHN0cmluZztcbiAgcGhvbmVTaWduSW5JbmZvOiB7XG4gICAgcmVjYXB0Y2hhVG9rZW46IHN0cmluZztcbiAgfTtcbiAgdGVuYW50SWQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhcnRQaG9uZU1mYVNpZ25JblJlc3BvbnNlIHtcbiAgcGhvbmVSZXNwb25zZUluZm86IHtcbiAgICBzZXNzaW9uSW5mbzogc3RyaW5nO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RhcnRTaWduSW5QaG9uZU1mYShcbiAgYXV0aDogQXV0aCxcbiAgcmVxdWVzdDogU3RhcnRQaG9uZU1mYVNpZ25JblJlcXVlc3Rcbik6IFByb21pc2U8U3RhcnRQaG9uZU1mYVNpZ25JblJlc3BvbnNlPiB7XG4gIHJldHVybiBfcGVyZm9ybUFwaVJlcXVlc3Q8XG4gICAgU3RhcnRQaG9uZU1mYVNpZ25JblJlcXVlc3QsXG4gICAgU3RhcnRQaG9uZU1mYVNpZ25JblJlc3BvbnNlXG4gID4oXG4gICAgYXV0aCxcbiAgICBIdHRwTWV0aG9kLlBPU1QsXG4gICAgRW5kcG9pbnQuU1RBUlRfTUZBX1NJR05fSU4sXG4gICAgX2FkZFRpZElmTmVjZXNzYXJ5KGF1dGgsIHJlcXVlc3QpXG4gICk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmluYWxpemVQaG9uZU1mYVNpZ25JblJlcXVlc3Qge1xuICBtZmFQZW5kaW5nQ3JlZGVudGlhbDogc3RyaW5nO1xuICBwaG9uZVZlcmlmaWNhdGlvbkluZm86IFNpZ25JbldpdGhQaG9uZU51bWJlclJlcXVlc3Q7XG4gIHRlbmFudElkPzogc3RyaW5nO1xufVxuXG4vLyBUT1RQIE1GQSBTaWduIGluIG9ubHkgaGFzIGEgZmluYWxpemUgcGhhc2UuIFBob25lIE1GQSBoYXMgYSBzdGFydCBwaGFzZSB0byBpbml0aWF0ZSBzZW5kaW5nIGFuXG4vLyBTTVMgYW5kIGEgZmluYWxpemUgcGhhc2UgdG8gY29tcGxldGUgc2lnbiBpbi4gV2l0aCBUT1RQLCB0aGUgdXNlciBhbHJlYWR5IGhhcyB0aGUgT1RQIGluIHRoZVxuLy8gVE9UUC9BdXRoZW50aWNhdG9yIGFwcC5cbmV4cG9ydCBpbnRlcmZhY2UgRmluYWxpemVUb3RwTWZhU2lnbkluUmVxdWVzdCB7XG4gIG1mYVBlbmRpbmdDcmVkZW50aWFsOiBzdHJpbmc7XG4gIHRvdHBWZXJpZmljYXRpb25JbmZvOiB7IHZlcmlmaWNhdGlvbkNvZGU6IHN0cmluZyB9O1xuICB0ZW5hbnRJZD86IHN0cmluZztcbiAgbWZhRW5yb2xsbWVudElkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmluYWxpemVQaG9uZU1mYVNpZ25JblJlc3BvbnNlIGV4dGVuZHMgRmluYWxpemVNZmFSZXNwb25zZSB7fVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbmFsaXplVG90cE1mYVNpZ25JblJlc3BvbnNlIGV4dGVuZHMgRmluYWxpemVNZmFSZXNwb25zZSB7fVxuXG5leHBvcnQgZnVuY3Rpb24gZmluYWxpemVTaWduSW5QaG9uZU1mYShcbiAgYXV0aDogQXV0aCxcbiAgcmVxdWVzdDogRmluYWxpemVQaG9uZU1mYVNpZ25JblJlcXVlc3Rcbik6IFByb21pc2U8RmluYWxpemVQaG9uZU1mYVNpZ25JblJlc3BvbnNlPiB7XG4gIHJldHVybiBfcGVyZm9ybUFwaVJlcXVlc3Q8XG4gICAgRmluYWxpemVQaG9uZU1mYVNpZ25JblJlcXVlc3QsXG4gICAgRmluYWxpemVQaG9uZU1mYVNpZ25JblJlc3BvbnNlXG4gID4oXG4gICAgYXV0aCxcbiAgICBIdHRwTWV0aG9kLlBPU1QsXG4gICAgRW5kcG9pbnQuRklOQUxJWkVfTUZBX1NJR05fSU4sXG4gICAgX2FkZFRpZElmTmVjZXNzYXJ5KGF1dGgsIHJlcXVlc3QpXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5hbGl6ZVNpZ25JblRvdHBNZmEoXG4gIGF1dGg6IEF1dGgsXG4gIHJlcXVlc3Q6IEZpbmFsaXplVG90cE1mYVNpZ25JblJlcXVlc3Rcbik6IFByb21pc2U8RmluYWxpemVUb3RwTWZhU2lnbkluUmVzcG9uc2U+IHtcbiAgcmV0dXJuIF9wZXJmb3JtQXBpUmVxdWVzdDxcbiAgICBGaW5hbGl6ZVRvdHBNZmFTaWduSW5SZXF1ZXN0LFxuICAgIEZpbmFsaXplVG90cE1mYVNpZ25JblJlc3BvbnNlXG4gID4oXG4gICAgYXV0aCxcbiAgICBIdHRwTWV0aG9kLlBPU1QsXG4gICAgRW5kcG9pbnQuRklOQUxJWkVfTUZBX1NJR05fSU4sXG4gICAgX2FkZFRpZElmTmVjZXNzYXJ5KGF1dGgsIHJlcXVlc3QpXG4gICk7XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCB0eXBlIFBob25lT3JPYXV0aFRva2VuUmVzcG9uc2UgPVxuICB8IFNpZ25JbldpdGhQaG9uZU51bWJlclJlc3BvbnNlXG4gIHwgU2lnbkluV2l0aElkcFJlc3BvbnNlXG4gIHwgSWRUb2tlblJlc3BvbnNlO1xuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi8uLi9jb3JlL2Vycm9ycyc7XG5pbXBvcnQgeyBfYXNzZXJ0IH0gZnJvbSAnLi4vLi4vY29yZS91dGlsL2Fzc2VydCc7XG5pbXBvcnQgeyBBdXRoSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC9hdXRoJztcbmltcG9ydCB7IFJlY2FwdGNoYVBhcmFtZXRlcnMgfSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuaW1wb3J0IHtcbiAgUmVjYXB0Y2hhLFxuICBHcmVDQVBUQ0hBVG9wTGV2ZWwsXG4gIEdyZUNBUFRDSEFSZW5kZXJPcHRpb24sXG4gIEdyZUNBUFRDSEFcbn0gZnJvbSAnLi9yZWNhcHRjaGEnO1xuXG5leHBvcnQgY29uc3QgX1NPTFZFX1RJTUVfTVMgPSA1MDA7XG5leHBvcnQgY29uc3QgX0VYUElSQVRJT05fVElNRV9NUyA9IDYwXzAwMDtcbmV4cG9ydCBjb25zdCBfV0lER0VUX0lEX1NUQVJUID0gMV8wMDBfMDAwXzAwMF8wMDA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2lkZ2V0IHtcbiAgZ2V0UmVzcG9uc2U6ICgpID0+IHN0cmluZyB8IG51bGw7XG4gIGRlbGV0ZTogKCkgPT4gdm9pZDtcbiAgZXhlY3V0ZTogKCkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGNsYXNzIE1vY2tSZUNhcHRjaGEgaW1wbGVtZW50cyBSZWNhcHRjaGEge1xuICBwcml2YXRlIGNvdW50ZXIgPSBfV0lER0VUX0lEX1NUQVJUO1xuICBfd2lkZ2V0cyA9IG5ldyBNYXA8bnVtYmVyLCBXaWRnZXQ+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBhdXRoOiBBdXRoSW50ZXJuYWwpIHt9XG5cbiAgcmVuZGVyKFxuICAgIGNvbnRhaW5lcjogc3RyaW5nIHwgSFRNTEVsZW1lbnQsXG4gICAgcGFyYW1ldGVycz86IFJlY2FwdGNoYVBhcmFtZXRlcnNcbiAgKTogbnVtYmVyIHtcbiAgICBjb25zdCBpZCA9IHRoaXMuY291bnRlcjtcbiAgICB0aGlzLl93aWRnZXRzLnNldChcbiAgICAgIGlkLFxuICAgICAgbmV3IE1vY2tXaWRnZXQoY29udGFpbmVyLCB0aGlzLmF1dGgubmFtZSwgcGFyYW1ldGVycyB8fCB7fSlcbiAgICApO1xuICAgIHRoaXMuY291bnRlcisrO1xuICAgIHJldHVybiBpZDtcbiAgfVxuXG4gIHJlc2V0KG9wdFdpZGdldElkPzogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgaWQgPSBvcHRXaWRnZXRJZCB8fCBfV0lER0VUX0lEX1NUQVJUO1xuICAgIHZvaWQgdGhpcy5fd2lkZ2V0cy5nZXQoaWQpPy5kZWxldGUoKTtcbiAgICB0aGlzLl93aWRnZXRzLmRlbGV0ZShpZCk7XG4gIH1cblxuICBnZXRSZXNwb25zZShvcHRXaWRnZXRJZD86IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgaWQgPSBvcHRXaWRnZXRJZCB8fCBfV0lER0VUX0lEX1NUQVJUO1xuICAgIHJldHVybiB0aGlzLl93aWRnZXRzLmdldChpZCk/LmdldFJlc3BvbnNlKCkgfHwgJyc7XG4gIH1cblxuICBhc3luYyBleGVjdXRlKG9wdFdpZGdldElkPzogbnVtYmVyIHwgc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBpZDogbnVtYmVyID0gKG9wdFdpZGdldElkIGFzIG51bWJlcikgfHwgX1dJREdFVF9JRF9TVEFSVDtcbiAgICB2b2lkIHRoaXMuX3dpZGdldHMuZ2V0KGlkKT8uZXhlY3V0ZSgpO1xuICAgIHJldHVybiAnJztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTW9ja0dyZUNBUFRDSEFUb3BMZXZlbCBpbXBsZW1lbnRzIEdyZUNBUFRDSEFUb3BMZXZlbCB7XG4gIGVudGVycHJpc2U6IEdyZUNBUFRDSEEgPSBuZXcgTW9ja0dyZUNBUFRDSEEoKTtcbiAgcmVhZHkoY2FsbGJhY2s6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBjYWxsYmFjaygpO1xuICB9XG5cbiAgZXhlY3V0ZShcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgX3NpdGVLZXk6IHN0cmluZyxcbiAgICBfb3B0aW9uczogeyBhY3Rpb246IHN0cmluZyB9XG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgndG9rZW4nKTtcbiAgfVxuICByZW5kZXIoXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9jb250YWluZXI6IHN0cmluZyB8IEhUTUxFbGVtZW50LFxuICAgIF9wYXJhbWV0ZXJzOiBHcmVDQVBUQ0hBUmVuZGVyT3B0aW9uXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuICcnO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNb2NrR3JlQ0FQVENIQSBpbXBsZW1lbnRzIEdyZUNBUFRDSEEge1xuICByZWFkeShjYWxsYmFjazogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIGNhbGxiYWNrKCk7XG4gIH1cblxuICBleGVjdXRlKFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfc2l0ZUtleTogc3RyaW5nLFxuICAgIF9vcHRpb25zOiB7IGFjdGlvbjogc3RyaW5nIH1cbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCd0b2tlbicpO1xuICB9XG4gIHJlbmRlcihcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgX2NvbnRhaW5lcjogc3RyaW5nIHwgSFRNTEVsZW1lbnQsXG4gICAgX3BhcmFtZXRlcnM6IEdyZUNBUFRDSEFSZW5kZXJPcHRpb25cbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1vY2tXaWRnZXQge1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgaXNWaXNpYmxlOiBib29sZWFuO1xuICBwcml2YXRlIHRpbWVySWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGRlbGV0ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZXNwb25zZVRva2VuOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBjbGlja0hhbmRsZXIgPSAoKTogdm9pZCA9PiB7XG4gICAgdGhpcy5leGVjdXRlKCk7XG4gIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgY29udGFpbmVyT3JJZDogc3RyaW5nIHwgSFRNTEVsZW1lbnQsXG4gICAgYXBwTmFtZTogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFyYW1zOiBSZWNhcHRjaGFQYXJhbWV0ZXJzXG4gICkge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9XG4gICAgICB0eXBlb2YgY29udGFpbmVyT3JJZCA9PT0gJ3N0cmluZydcbiAgICAgICAgPyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjb250YWluZXJPcklkKVxuICAgICAgICA6IGNvbnRhaW5lck9ySWQ7XG4gICAgX2Fzc2VydChjb250YWluZXIsIEF1dGhFcnJvckNvZGUuQVJHVU1FTlRfRVJST1IsIHsgYXBwTmFtZSB9KTtcblxuICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyO1xuICAgIHRoaXMuaXNWaXNpYmxlID0gdGhpcy5wYXJhbXMuc2l6ZSAhPT0gJ2ludmlzaWJsZSc7XG4gICAgaWYgKHRoaXMuaXNWaXNpYmxlKSB7XG4gICAgICB0aGlzLmV4ZWN1dGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmNsaWNrSGFuZGxlcik7XG4gICAgfVxuICB9XG5cbiAgZ2V0UmVzcG9uc2UoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgdGhpcy5jaGVja0lmRGVsZXRlZCgpO1xuICAgIHJldHVybiB0aGlzLnJlc3BvbnNlVG9rZW47XG4gIH1cblxuICBkZWxldGUoKTogdm9pZCB7XG4gICAgdGhpcy5jaGVja0lmRGVsZXRlZCgpO1xuICAgIHRoaXMuZGVsZXRlZCA9IHRydWU7XG4gICAgaWYgKHRoaXMudGltZXJJZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZXJJZCk7XG4gICAgICB0aGlzLnRpbWVySWQgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuY2xpY2tIYW5kbGVyKTtcbiAgfVxuXG4gIGV4ZWN1dGUoKTogdm9pZCB7XG4gICAgdGhpcy5jaGVja0lmRGVsZXRlZCgpO1xuICAgIGlmICh0aGlzLnRpbWVySWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnRpbWVySWQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnJlc3BvbnNlVG9rZW4gPSBnZW5lcmF0ZVJhbmRvbUFscGhhTnVtZXJpY1N0cmluZyg1MCk7XG4gICAgICBjb25zdCB7IGNhbGxiYWNrLCAnZXhwaXJlZC1jYWxsYmFjayc6IGV4cGlyZWRDYWxsYmFjayB9ID0gdGhpcy5wYXJhbXM7XG4gICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjYWxsYmFjayh0aGlzLnJlc3BvbnNlVG9rZW4pO1xuICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgfVxuXG4gICAgICB0aGlzLnRpbWVySWQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMudGltZXJJZCA9IG51bGw7XG4gICAgICAgIHRoaXMucmVzcG9uc2VUb2tlbiA9IG51bGw7XG4gICAgICAgIGlmIChleHBpcmVkQ2FsbGJhY2spIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgZXhwaXJlZENhbGxiYWNrKCk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzVmlzaWJsZSkge1xuICAgICAgICAgIHRoaXMuZXhlY3V0ZSgpO1xuICAgICAgICB9XG4gICAgICB9LCBfRVhQSVJBVElPTl9USU1FX01TKTtcbiAgICB9LCBfU09MVkVfVElNRV9NUyk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrSWZEZWxldGVkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRlbGV0ZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncmVDQVBUQ0hBIG1vY2sgd2FzIGFscmVhZHkgZGVsZXRlZCEnKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVSYW5kb21BbHBoYU51bWVyaWNTdHJpbmcobGVuOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBjaGFycyA9IFtdO1xuICBjb25zdCBhbGxvd2VkQ2hhcnMgPVxuICAgICcxMjM0NTY3ODkwYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWic7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBjaGFycy5wdXNoKFxuICAgICAgYWxsb3dlZENoYXJzLmNoYXJBdChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBhbGxvd2VkQ2hhcnMubGVuZ3RoKSlcbiAgICApO1xuICB9XG4gIHJldHVybiBjaGFycy5qb2luKCcnKTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBxdWVyeXN0cmluZyB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcblxuaW1wb3J0IHsgQXV0aEVycm9yQ29kZSB9IGZyb20gJy4uLy4uL2NvcmUvZXJyb3JzJztcbmltcG9ydCB7IF9hc3NlcnQsIF9jcmVhdGVFcnJvciB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbC9hc3NlcnQnO1xuaW1wb3J0IHsgRGVsYXkgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWwvZGVsYXknO1xuaW1wb3J0IHsgQXV0aEludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvYXV0aCc7XG5pbXBvcnQgeyBfd2luZG93IH0gZnJvbSAnLi4vYXV0aF93aW5kb3cnO1xuaW1wb3J0ICogYXMganNIZWxwZXJzIGZyb20gJy4uL2xvYWRfanMnO1xuaW1wb3J0IHsgUmVjYXB0Y2hhLCBpc1YyIH0gZnJvbSAnLi9yZWNhcHRjaGEnO1xuaW1wb3J0IHsgTW9ja1JlQ2FwdGNoYSB9IGZyb20gJy4vcmVjYXB0Y2hhX21vY2snO1xuXG4vLyBSZUNhcHRjaGEgd2lsbCBsb2FkIHVzaW5nIHRoZSBzYW1lIGNhbGxiYWNrLCBzbyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gbmVlZHNcbi8vIHRvIGJlIGtlcHQgYXJvdW5kXG5leHBvcnQgY29uc3QgX0pTTE9BRF9DQUxMQkFDSyA9IGpzSGVscGVycy5fZ2VuZXJhdGVDYWxsYmFja05hbWUoJ3JjYicpO1xuY29uc3QgTkVUV09SS19USU1FT1VUX0RFTEFZID0gbmV3IERlbGF5KDMwMDAwLCA2MDAwMCk7XG5jb25zdCBSRUNBUFRDSEFfQkFTRSA9ICdodHRwczovL3d3dy5nb29nbGUuY29tL3JlY2FwdGNoYS9hcGkuanM/JztcblxuLyoqXG4gKiBXZSBuZWVkIHRvIG1hcmsgdGhpcyBpbnRlcmZhY2UgYXMgaW50ZXJuYWwgZXhwbGljaXRseSB0byBleGNsdWRlIGl0IGluIHRoZSBwdWJsaWMgdHlwaW5ncywgYmVjYXVzZVxuICogaXQgcmVmZXJlbmNlcyBBdXRoSW50ZXJuYWwgd2hpY2ggaGFzIGEgY2lyY3VsYXIgZGVwZW5kZW5jeSB3aXRoIFVzZXJJbnRlcm5hbC5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZUNhcHRjaGFMb2FkZXIge1xuICBsb2FkKGF1dGg6IEF1dGhJbnRlcm5hbCwgaGw/OiBzdHJpbmcpOiBQcm9taXNlPFJlY2FwdGNoYT47XG4gIGNsZWFyZWRPbmVJbnN0YW5jZSgpOiB2b2lkO1xufVxuXG4vKipcbiAqIExvYWRlciBmb3IgdGhlIEdSZUNhcHRjaGEgbGlicmFyeS4gVGhlcmUgc2hvdWxkIG9ubHkgZXZlciBiZSBvbmUgb2YgdGhpcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlQ2FwdGNoYUxvYWRlckltcGwgaW1wbGVtZW50cyBSZUNhcHRjaGFMb2FkZXIge1xuICBwcml2YXRlIGhvc3RMYW5ndWFnZSA9ICcnO1xuICBwcml2YXRlIGNvdW50ZXIgPSAwO1xuICAvKipcbiAgICogQ2hlY2sgZm9yIGByZW5kZXIoKWAgbWV0aG9kLiBgd2luZG93LmdyZWNhcHRjaGFgIHdpbGwgZXhpc3QgaWYgdGhlIEVudGVycHJpc2VcbiAgICogdmVyc2lvbiBvZiB0aGUgUmVDQVBUQ0hBIHNjcmlwdCB3YXMgbG9hZGVkIGJ5IHNvbWVvbmUgZWxzZSAoZS5nLiBBcHAgQ2hlY2spIGJ1dFxuICAgKiBgd2luZG93LmdyZWNhcHRjaGEucmVuZGVyKClgIHdpbGwgbm90LiBBbm90aGVyIGxvYWQgd2lsbCBhZGQgaXQuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGxpYnJhcnlTZXBhcmF0ZWx5TG9hZGVkID0gISFfd2luZG93KCkuZ3JlY2FwdGNoYT8ucmVuZGVyO1xuXG4gIGxvYWQoYXV0aDogQXV0aEludGVybmFsLCBobCA9ICcnKTogUHJvbWlzZTxSZWNhcHRjaGE+IHtcbiAgICBfYXNzZXJ0KGlzSG9zdExhbmd1YWdlVmFsaWQoaGwpLCBhdXRoLCBBdXRoRXJyb3JDb2RlLkFSR1VNRU5UX0VSUk9SKTtcblxuICAgIGlmICh0aGlzLnNob3VsZFJlc29sdmVJbW1lZGlhdGVseShobCkgJiYgaXNWMihfd2luZG93KCkuZ3JlY2FwdGNoYSkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoX3dpbmRvdygpLmdyZWNhcHRjaGEhIGFzIFJlY2FwdGNoYSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxSZWNhcHRjaGE+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IG5ldHdvcmtUaW1lb3V0ID0gX3dpbmRvdygpLnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICByZWplY3QoX2NyZWF0ZUVycm9yKGF1dGgsIEF1dGhFcnJvckNvZGUuTkVUV09SS19SRVFVRVNUX0ZBSUxFRCkpO1xuICAgICAgfSwgTkVUV09SS19USU1FT1VUX0RFTEFZLmdldCgpKTtcblxuICAgICAgX3dpbmRvdygpW19KU0xPQURfQ0FMTEJBQ0tdID0gKCkgPT4ge1xuICAgICAgICBfd2luZG93KCkuY2xlYXJUaW1lb3V0KG5ldHdvcmtUaW1lb3V0KTtcbiAgICAgICAgZGVsZXRlIF93aW5kb3coKVtfSlNMT0FEX0NBTExCQUNLXTtcblxuICAgICAgICBjb25zdCByZWNhcHRjaGEgPSBfd2luZG93KCkuZ3JlY2FwdGNoYSBhcyBSZWNhcHRjaGE7XG5cbiAgICAgICAgaWYgKCFyZWNhcHRjaGEgfHwgIWlzVjIocmVjYXB0Y2hhKSkge1xuICAgICAgICAgIHJlamVjdChfY3JlYXRlRXJyb3IoYXV0aCwgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUikpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdyYXAgdGhlIGdyZXB0Y2hhIHJlbmRlciBmdW5jdGlvbiBzbyB0aGF0IHdlIGtub3cgaWYgdGhlIGRldmVsb3BlciBoYXNcbiAgICAgICAgLy8gY2FsbGVkIGl0IHNlcGFyYXRlbHlcbiAgICAgICAgY29uc3QgcmVuZGVyID0gcmVjYXB0Y2hhLnJlbmRlcjtcbiAgICAgICAgcmVjYXB0Y2hhLnJlbmRlciA9IChjb250YWluZXIsIHBhcmFtcykgPT4ge1xuICAgICAgICAgIGNvbnN0IHdpZGdldElkID0gcmVuZGVyKGNvbnRhaW5lciwgcGFyYW1zKTtcbiAgICAgICAgICB0aGlzLmNvdW50ZXIrKztcbiAgICAgICAgICByZXR1cm4gd2lkZ2V0SWQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5ob3N0TGFuZ3VhZ2UgPSBobDtcbiAgICAgICAgcmVzb2x2ZShyZWNhcHRjaGEpO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgdXJsID0gYCR7UkVDQVBUQ0hBX0JBU0V9PyR7cXVlcnlzdHJpbmcoe1xuICAgICAgICBvbmxvYWQ6IF9KU0xPQURfQ0FMTEJBQ0ssXG4gICAgICAgIHJlbmRlcjogJ2V4cGxpY2l0JyxcbiAgICAgICAgaGxcbiAgICAgIH0pfWA7XG5cbiAgICAgIGpzSGVscGVycy5fbG9hZEpTKHVybCkuY2F0Y2goKCkgPT4ge1xuICAgICAgICBjbGVhclRpbWVvdXQobmV0d29ya1RpbWVvdXQpO1xuICAgICAgICByZWplY3QoX2NyZWF0ZUVycm9yKGF1dGgsIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgY2xlYXJlZE9uZUluc3RhbmNlKCk6IHZvaWQge1xuICAgIHRoaXMuY291bnRlci0tO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRSZXNvbHZlSW1tZWRpYXRlbHkoaGw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIC8vIFdlIGNhbiByZXNvbHZlIGltbWVkaWF0ZWx5IGlmOlxuICAgIC8vICAg4oCiIGdyZWNhcHRjaGEgaXMgYWxyZWFkeSBkZWZpbmVkIEFORCAoXG4gICAgLy8gICAgIDEuIHRoZSByZXF1ZXN0ZWQgbGFuZ3VhZ2UgY29kZXMgYXJlIHRoZSBzYW1lIE9SXG4gICAgLy8gICAgIDIuIHRoZXJlIGV4aXN0cyBhbHJlYWR5IGEgUmVDYXB0Y2hhIG9uIHRoZSBwYWdlXG4gICAgLy8gICAgIDMuIHRoZSBsaWJyYXJ5IHdhcyBhbHJlYWR5IGxvYWRlZCBieSB0aGUgYXBwXG4gICAgLy8gSW4gY2FzZXMgKDIpIGFuZCAoMyksIHdlIF9jYW4ndF8gcmVsb2FkIGFzIGl0IHdvdWxkIGJyZWFrIHRoZSByZWNhcHRjaGFzXG4gICAgLy8gdGhhdCBhcmUgYWxyZWFkeSBpbiB0aGUgcGFnZVxuICAgIHJldHVybiAoXG4gICAgICAhIV93aW5kb3coKS5ncmVjYXB0Y2hhPy5yZW5kZXIgJiZcbiAgICAgIChobCA9PT0gdGhpcy5ob3N0TGFuZ3VhZ2UgfHxcbiAgICAgICAgdGhpcy5jb3VudGVyID4gMCB8fFxuICAgICAgICB0aGlzLmxpYnJhcnlTZXBhcmF0ZWx5TG9hZGVkKVxuICAgICk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNIb3N0TGFuZ3VhZ2VWYWxpZChobDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBobC5sZW5ndGggPD0gNiAmJiAvXlxccypbYS16QS1aMC05XFwtXSpcXHMqJC8udGVzdChobCk7XG59XG5cbmV4cG9ydCBjbGFzcyBNb2NrUmVDYXB0Y2hhTG9hZGVySW1wbCBpbXBsZW1lbnRzIFJlQ2FwdGNoYUxvYWRlciB7XG4gIGFzeW5jIGxvYWQoYXV0aDogQXV0aEludGVybmFsKTogUHJvbWlzZTxSZWNhcHRjaGE+IHtcbiAgICByZXR1cm4gbmV3IE1vY2tSZUNhcHRjaGEoYXV0aCk7XG4gIH1cblxuICBjbGVhcmVkT25lSW5zdGFuY2UoKTogdm9pZCB7fVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEF1dGgsIFJlY2FwdGNoYVBhcmFtZXRlcnMgfSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuaW1wb3J0IHsgZ2V0UmVjYXB0Y2hhUGFyYW1zIH0gZnJvbSAnLi4vLi4vYXBpL2F1dGhlbnRpY2F0aW9uL3JlY2FwdGNoYSc7XG5pbXBvcnQgeyBfY2FzdEF1dGggfSBmcm9tICcuLi8uLi9jb3JlL2F1dGgvYXV0aF9pbXBsJztcbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi8uLi9jb3JlL2Vycm9ycyc7XG5pbXBvcnQgeyBfYXNzZXJ0IH0gZnJvbSAnLi4vLi4vY29yZS91dGlsL2Fzc2VydCc7XG5pbXBvcnQgeyBfaXNIdHRwT3JIdHRwcyB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbC9sb2NhdGlvbic7XG5pbXBvcnQgeyBBcHBsaWNhdGlvblZlcmlmaWVySW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC9hcHBsaWNhdGlvbl92ZXJpZmllcic7XG5pbXBvcnQgeyBBdXRoSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC9hdXRoJztcbmltcG9ydCB7IF93aW5kb3cgfSBmcm9tICcuLi9hdXRoX3dpbmRvdyc7XG5pbXBvcnQgeyBfaXNXb3JrZXIgfSBmcm9tICcuLi91dGlsL3dvcmtlcic7XG5pbXBvcnQgeyBSZWNhcHRjaGEgfSBmcm9tICcuL3JlY2FwdGNoYSc7XG5pbXBvcnQge1xuICBNb2NrUmVDYXB0Y2hhTG9hZGVySW1wbCxcbiAgUmVDYXB0Y2hhTG9hZGVyLFxuICBSZUNhcHRjaGFMb2FkZXJJbXBsXG59IGZyb20gJy4vcmVjYXB0Y2hhX2xvYWRlcic7XG5cbmV4cG9ydCBjb25zdCBSRUNBUFRDSEFfVkVSSUZJRVJfVFlQRSA9ICdyZWNhcHRjaGEnO1xuXG5jb25zdCBERUZBVUxUX1BBUkFNUzogUmVjYXB0Y2hhUGFyYW1ldGVycyA9IHtcbiAgdGhlbWU6ICdsaWdodCcsXG4gIHR5cGU6ICdpbWFnZSdcbn07XG5cbnR5cGUgVG9rZW5DYWxsYmFjayA9ICh0b2tlbjogc3RyaW5nKSA9PiB2b2lkO1xuXG4vKipcbiAqIEFuIHtAbGluayBodHRwczovL3d3dy5nb29nbGUuY29tL3JlY2FwdGNoYS8gfCByZUNBUFRDSEF9LWJhc2VkIGFwcGxpY2F0aW9uIHZlcmlmaWVyLlxuICpcbiAqIEByZW1hcmtzXG4gKiBgUmVjYXB0Y2hhVmVyaWZpZXJgIGRvZXMgbm90IHdvcmsgaW4gYSBOb2RlLmpzIGVudmlyb25tZW50LlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIFJlY2FwdGNoYVZlcmlmaWVyIGltcGxlbWVudHMgQXBwbGljYXRpb25WZXJpZmllckludGVybmFsIHtcbiAgLyoqXG4gICAqIFRoZSBhcHBsaWNhdGlvbiB2ZXJpZmllciB0eXBlLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBGb3IgYSByZUNBUFRDSEEgdmVyaWZpZXIsIHRoaXMgaXMgJ3JlY2FwdGNoYScuXG4gICAqL1xuICByZWFkb25seSB0eXBlID0gUkVDQVBUQ0hBX1ZFUklGSUVSX1RZUEU7XG4gIHByaXZhdGUgZGVzdHJveWVkID0gZmFsc2U7XG4gIHByaXZhdGUgd2lkZ2V0SWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgaXNJbnZpc2libGU6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgdG9rZW5DaGFuZ2VMaXN0ZW5lcnMgPSBuZXcgU2V0PFRva2VuQ2FsbGJhY2s+KCk7XG4gIHByaXZhdGUgcmVuZGVyUHJvbWlzZTogUHJvbWlzZTxudW1iZXI+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXV0aDogQXV0aEludGVybmFsO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcmVhZG9ubHkgX3JlY2FwdGNoYUxvYWRlcjogUmVDYXB0Y2hhTG9hZGVyO1xuICBwcml2YXRlIHJlY2FwdGNoYTogUmVjYXB0Y2hhIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBhdXRoRXh0ZXJuIC0gVGhlIGNvcnJlc3BvbmRpbmcgRmlyZWJhc2Uge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gY29udGFpbmVyT3JJZCAtIFRoZSByZUNBUFRDSEEgY29udGFpbmVyIHBhcmFtZXRlci5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogVGhpcyBoYXMgZGlmZmVyZW50IG1lYW5pbmcgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIHJlQ0FQVENIQSBpcyBoaWRkZW4gb3IgdmlzaWJsZS4gRm9yIGFcbiAgICogdmlzaWJsZSByZUNBUFRDSEEgdGhlIGNvbnRhaW5lciBtdXN0IGJlIGVtcHR5LiBJZiBhIHN0cmluZyBpcyB1c2VkLCBpdCBoYXMgdG8gY29ycmVzcG9uZCB0b1xuICAgKiBhbiBlbGVtZW50IElELiBUaGUgY29ycmVzcG9uZGluZyBlbGVtZW50IG11c3QgYWxzbyBtdXN0IGJlIGluIHRoZSBET00gYXQgdGhlIHRpbWUgb2ZcbiAgICogaW5pdGlhbGl6YXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbWV0ZXJzIC0gVGhlIG9wdGlvbmFsIHJlQ0FQVENIQSBwYXJhbWV0ZXJzLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBDaGVjayB0aGUgcmVDQVBUQ0hBIGRvY3MgZm9yIGEgY29tcHJlaGVuc2l2ZSBsaXN0LiBBbGwgcGFyYW1ldGVycyBhcmUgYWNjZXB0ZWQgZXhjZXB0IGZvclxuICAgKiB0aGUgc2l0ZWtleS4gRmlyZWJhc2UgQXV0aCBiYWNrZW5kIHByb3Zpc2lvbnMgYSByZUNBUFRDSEEgZm9yIGVhY2ggcHJvamVjdCBhbmQgd2lsbFxuICAgKiBjb25maWd1cmUgdGhpcyB1cG9uIHJlbmRlcmluZy4gRm9yIGFuIGludmlzaWJsZSByZUNBUFRDSEEsIGEgc2l6ZSBrZXkgbXVzdCBoYXZlIHRoZSB2YWx1ZVxuICAgKiAnaW52aXNpYmxlJy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIGF1dGhFeHRlcm46IEF1dGgsXG4gICAgY29udGFpbmVyT3JJZDogSFRNTEVsZW1lbnQgfCBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBwYXJhbWV0ZXJzOiBSZWNhcHRjaGFQYXJhbWV0ZXJzID0ge1xuICAgICAgLi4uREVGQVVMVF9QQVJBTVNcbiAgICB9XG4gICkge1xuICAgIHRoaXMuYXV0aCA9IF9jYXN0QXV0aChhdXRoRXh0ZXJuKTtcbiAgICB0aGlzLmlzSW52aXNpYmxlID0gdGhpcy5wYXJhbWV0ZXJzLnNpemUgPT09ICdpbnZpc2libGUnO1xuICAgIF9hc3NlcnQoXG4gICAgICB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnLFxuICAgICAgdGhpcy5hdXRoLFxuICAgICAgQXV0aEVycm9yQ29kZS5PUEVSQVRJT05fTk9UX1NVUFBPUlRFRFxuICAgICk7XG4gICAgY29uc3QgY29udGFpbmVyID1cbiAgICAgIHR5cGVvZiBjb250YWluZXJPcklkID09PSAnc3RyaW5nJ1xuICAgICAgICA/IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNvbnRhaW5lck9ySWQpXG4gICAgICAgIDogY29udGFpbmVyT3JJZDtcbiAgICBfYXNzZXJ0KGNvbnRhaW5lciwgdGhpcy5hdXRoLCBBdXRoRXJyb3JDb2RlLkFSR1VNRU5UX0VSUk9SKTtcblxuICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyO1xuICAgIHRoaXMucGFyYW1ldGVycy5jYWxsYmFjayA9IHRoaXMubWFrZVRva2VuQ2FsbGJhY2sodGhpcy5wYXJhbWV0ZXJzLmNhbGxiYWNrKTtcblxuICAgIHRoaXMuX3JlY2FwdGNoYUxvYWRlciA9IHRoaXMuYXV0aC5zZXR0aW5ncy5hcHBWZXJpZmljYXRpb25EaXNhYmxlZEZvclRlc3RpbmdcbiAgICAgID8gbmV3IE1vY2tSZUNhcHRjaGFMb2FkZXJJbXBsKClcbiAgICAgIDogbmV3IFJlQ2FwdGNoYUxvYWRlckltcGwoKTtcblxuICAgIHRoaXMudmFsaWRhdGVTdGFydGluZ1N0YXRlKCk7XG4gICAgLy8gVE9ETzogRmlndXJlIG91dCBpZiBzZGsgdmVyc2lvbiBpcyBuZWVkZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0cyBmb3IgdGhlIHVzZXIgdG8gc29sdmUgdGhlIHJlQ0FQVENIQSBhbmQgcmVzb2x2ZXMgd2l0aCB0aGUgcmVDQVBUQ0hBIHRva2VuLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIFByb21pc2UgZm9yIHRoZSByZUNBUFRDSEEgdG9rZW4uXG4gICAqL1xuICBhc3luYyB2ZXJpZnkoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICB0aGlzLmFzc2VydE5vdERlc3Ryb3llZCgpO1xuICAgIGNvbnN0IGlkID0gYXdhaXQgdGhpcy5yZW5kZXIoKTtcbiAgICBjb25zdCByZWNhcHRjaGEgPSB0aGlzLmdldEFzc2VydGVkUmVjYXB0Y2hhKCk7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IHJlY2FwdGNoYS5nZXRSZXNwb25zZShpZCk7XG4gICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHN0cmluZz4ocmVzb2x2ZSA9PiB7XG4gICAgICBjb25zdCB0b2tlbkNoYW5nZSA9ICh0b2tlbjogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgICByZXR1cm47IC8vIElnbm9yZSB0b2tlbiBleHBpcmF0aW9ucy5cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRva2VuQ2hhbmdlTGlzdGVuZXJzLmRlbGV0ZSh0b2tlbkNoYW5nZSk7XG4gICAgICAgIHJlc29sdmUodG9rZW4pO1xuICAgICAgfTtcblxuICAgICAgdGhpcy50b2tlbkNoYW5nZUxpc3RlbmVycy5hZGQodG9rZW5DaGFuZ2UpO1xuICAgICAgaWYgKHRoaXMuaXNJbnZpc2libGUpIHtcbiAgICAgICAgcmVjYXB0Y2hhLmV4ZWN1dGUoaWQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIHJlQ0FQVENIQSB3aWRnZXQgb24gdGhlIHBhZ2UuXG4gICAqXG4gICAqIEByZXR1cm5zIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHJlQ0FQVENIQSB3aWRnZXQgSUQuXG4gICAqL1xuICByZW5kZXIoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5hc3NlcnROb3REZXN0cm95ZWQoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBUaGlzIG1ldGhvZCByZXR1cm5zIGEgcHJvbWlzZS4gU2luY2UgaXQncyBub3QgYXN5bmMgKHdlIHdhbnQgdG8gcmV0dXJuIHRoZVxuICAgICAgLy8gX3NhbWVfIHByb21pc2UgaWYgcmVuZGVyaW5nIGlzIHN0aWxsIG9jY3VycmluZyksIHRoZSBBUEkgc3VyZmFjZSBzaG91bGRcbiAgICAgIC8vIHJlamVjdCB3aXRoIHRoZSBlcnJvciByYXRoZXIgdGhhbiBqdXN0IHRocm93XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVuZGVyUHJvbWlzZSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVuZGVyUHJvbWlzZTtcbiAgICB9XG5cbiAgICB0aGlzLnJlbmRlclByb21pc2UgPSB0aGlzLm1ha2VSZW5kZXJQcm9taXNlKCkuY2F0Y2goZSA9PiB7XG4gICAgICB0aGlzLnJlbmRlclByb21pc2UgPSBudWxsO1xuICAgICAgdGhyb3cgZTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLnJlbmRlclByb21pc2U7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9yZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLmFzc2VydE5vdERlc3Ryb3llZCgpO1xuICAgIGlmICh0aGlzLndpZGdldElkICE9PSBudWxsKSB7XG4gICAgICB0aGlzLmdldEFzc2VydGVkUmVjYXB0Y2hhKCkucmVzZXQodGhpcy53aWRnZXRJZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyB0aGUgcmVDQVBUQ0hBIHdpZGdldCBmcm9tIHRoZSBwYWdlIGFuZCBkZXN0cm95cyB0aGUgaW5zdGFuY2UuXG4gICAqL1xuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLmFzc2VydE5vdERlc3Ryb3llZCgpO1xuICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTtcbiAgICB0aGlzLl9yZWNhcHRjaGFMb2FkZXIuY2xlYXJlZE9uZUluc3RhbmNlKCk7XG4gICAgaWYgKCF0aGlzLmlzSW52aXNpYmxlKSB7XG4gICAgICB0aGlzLmNvbnRhaW5lci5jaGlsZE5vZGVzLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgIHRoaXMuY29udGFpbmVyLnJlbW92ZUNoaWxkKG5vZGUpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZVN0YXJ0aW5nU3RhdGUoKTogdm9pZCB7XG4gICAgX2Fzc2VydCghdGhpcy5wYXJhbWV0ZXJzLnNpdGVrZXksIHRoaXMuYXV0aCwgQXV0aEVycm9yQ29kZS5BUkdVTUVOVF9FUlJPUik7XG4gICAgX2Fzc2VydChcbiAgICAgIHRoaXMuaXNJbnZpc2libGUgfHwgIXRoaXMuY29udGFpbmVyLmhhc0NoaWxkTm9kZXMoKSxcbiAgICAgIHRoaXMuYXV0aCxcbiAgICAgIEF1dGhFcnJvckNvZGUuQVJHVU1FTlRfRVJST1JcbiAgICApO1xuICAgIF9hc3NlcnQoXG4gICAgICB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnLFxuICAgICAgdGhpcy5hdXRoLFxuICAgICAgQXV0aEVycm9yQ29kZS5PUEVSQVRJT05fTk9UX1NVUFBPUlRFRFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIG1ha2VUb2tlbkNhbGxiYWNrKFxuICAgIGV4aXN0aW5nOiBUb2tlbkNhbGxiYWNrIHwgc3RyaW5nIHwgdW5kZWZpbmVkXG4gICk6IFRva2VuQ2FsbGJhY2sge1xuICAgIHJldHVybiB0b2tlbiA9PiB7XG4gICAgICB0aGlzLnRva2VuQ2hhbmdlTGlzdGVuZXJzLmZvckVhY2gobGlzdGVuZXIgPT4gbGlzdGVuZXIodG9rZW4pKTtcbiAgICAgIGlmICh0eXBlb2YgZXhpc3RpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZXhpc3RpbmcodG9rZW4pO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZXhpc3RpbmcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnN0IGdsb2JhbEZ1bmMgPSBfd2luZG93KClbZXhpc3RpbmddO1xuICAgICAgICBpZiAodHlwZW9mIGdsb2JhbEZ1bmMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBnbG9iYWxGdW5jKHRva2VuKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzc2VydE5vdERlc3Ryb3llZCgpOiB2b2lkIHtcbiAgICBfYXNzZXJ0KCF0aGlzLmRlc3Ryb3llZCwgdGhpcy5hdXRoLCBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbWFrZVJlbmRlclByb21pc2UoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICBpZiAoIXRoaXMud2lkZ2V0SWQpIHtcbiAgICAgIGxldCBjb250YWluZXIgPSB0aGlzLmNvbnRhaW5lcjtcbiAgICAgIGlmICghdGhpcy5pc0ludmlzaWJsZSkge1xuICAgICAgICBjb25zdCBndWFyYW50ZWVkRW1wdHkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGd1YXJhbnRlZWRFbXB0eSk7XG4gICAgICAgIGNvbnRhaW5lciA9IGd1YXJhbnRlZWRFbXB0eTtcbiAgICAgIH1cblxuICAgICAgdGhpcy53aWRnZXRJZCA9IHRoaXMuZ2V0QXNzZXJ0ZWRSZWNhcHRjaGEoKS5yZW5kZXIoXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgdGhpcy5wYXJhbWV0ZXJzXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLndpZGdldElkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpbml0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIF9hc3NlcnQoXG4gICAgICBfaXNIdHRwT3JIdHRwcygpICYmICFfaXNXb3JrZXIoKSxcbiAgICAgIHRoaXMuYXV0aCxcbiAgICAgIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1JcbiAgICApO1xuXG4gICAgYXdhaXQgZG9tUmVhZHkoKTtcbiAgICB0aGlzLnJlY2FwdGNoYSA9IGF3YWl0IHRoaXMuX3JlY2FwdGNoYUxvYWRlci5sb2FkKFxuICAgICAgdGhpcy5hdXRoLFxuICAgICAgdGhpcy5hdXRoLmxhbmd1YWdlQ29kZSB8fCB1bmRlZmluZWRcbiAgICApO1xuXG4gICAgY29uc3Qgc2l0ZUtleSA9IGF3YWl0IGdldFJlY2FwdGNoYVBhcmFtcyh0aGlzLmF1dGgpO1xuICAgIF9hc3NlcnQoc2l0ZUtleSwgdGhpcy5hdXRoLCBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SKTtcbiAgICB0aGlzLnBhcmFtZXRlcnMuc2l0ZWtleSA9IHNpdGVLZXk7XG4gIH1cblxuICBwcml2YXRlIGdldEFzc2VydGVkUmVjYXB0Y2hhKCk6IFJlY2FwdGNoYSB7XG4gICAgX2Fzc2VydCh0aGlzLnJlY2FwdGNoYSwgdGhpcy5hdXRoLCBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SKTtcbiAgICByZXR1cm4gdGhpcy5yZWNhcHRjaGE7XG4gIH1cbn1cblxuZnVuY3Rpb24gZG9tUmVhZHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGxldCByZXNvbHZlcjogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPihyZXNvbHZlID0+IHtcbiAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIERvY3VtZW50IG5vdCByZWFkeSwgd2FpdCBmb3IgbG9hZCBiZWZvcmUgcmVzb2x2aW5nLlxuICAgIC8vIFNhdmUgcmVzb2x2ZXIsIHNvIHdlIGNhbiByZW1vdmUgbGlzdGVuZXIgaW4gY2FzZSBpdCB3YXMgZXh0ZXJuYWxseVxuICAgIC8vIGNhbmNlbGxlZC5cbiAgICByZXNvbHZlciA9ICgpID0+IHJlc29sdmUoKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIHJlc29sdmVyKTtcbiAgfSkuY2F0Y2goZSA9PiB7XG4gICAgaWYgKHJlc29sdmVyKSB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9hZCcsIHJlc29sdmVyKTtcbiAgICB9XG5cbiAgICB0aHJvdyBlO1xuICB9KTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQge1xuICBBcHBsaWNhdGlvblZlcmlmaWVyLFxuICBBdXRoLFxuICBDb25maXJtYXRpb25SZXN1bHQsXG4gIFBob25lSW5mb09wdGlvbnMsXG4gIFVzZXIsXG4gIFVzZXJDcmVkZW50aWFsXG59IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5cbmltcG9ydCB7IHN0YXJ0RW5yb2xsUGhvbmVNZmEgfSBmcm9tICcuLi8uLi9hcGkvYWNjb3VudF9tYW5hZ2VtZW50L21mYSc7XG5pbXBvcnQgeyBzdGFydFNpZ25JblBob25lTWZhIH0gZnJvbSAnLi4vLi4vYXBpL2F1dGhlbnRpY2F0aW9uL21mYSc7XG5pbXBvcnQgeyBzZW5kUGhvbmVWZXJpZmljYXRpb25Db2RlIH0gZnJvbSAnLi4vLi4vYXBpL2F1dGhlbnRpY2F0aW9uL3Ntcyc7XG5pbXBvcnQgeyBBcHBsaWNhdGlvblZlcmlmaWVySW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC9hcHBsaWNhdGlvbl92ZXJpZmllcic7XG5pbXBvcnQgeyBQaG9uZUF1dGhDcmVkZW50aWFsIH0gZnJvbSAnLi4vLi4vY29yZS9jcmVkZW50aWFscy9waG9uZSc7XG5pbXBvcnQgeyBBdXRoRXJyb3JDb2RlIH0gZnJvbSAnLi4vLi4vY29yZS9lcnJvcnMnO1xuaW1wb3J0IHsgX2Fzc2VydExpbmtlZFN0YXR1cywgX2xpbmsgfSBmcm9tICcuLi8uLi9jb3JlL3VzZXIvbGlua191bmxpbmsnO1xuaW1wb3J0IHsgX2Fzc2VydCB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbC9hc3NlcnQnO1xuaW1wb3J0IHsgQXV0aEludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvYXV0aCc7XG5pbXBvcnQge1xuICBsaW5rV2l0aENyZWRlbnRpYWwsXG4gIHJlYXV0aGVudGljYXRlV2l0aENyZWRlbnRpYWwsXG4gIHNpZ25JbldpdGhDcmVkZW50aWFsXG59IGZyb20gJy4uLy4uL2NvcmUvc3RyYXRlZ2llcy9jcmVkZW50aWFsJztcbmltcG9ydCB7XG4gIE11bHRpRmFjdG9yU2Vzc2lvbkltcGwsXG4gIE11bHRpRmFjdG9yU2Vzc2lvblR5cGVcbn0gZnJvbSAnLi4vLi4vbWZhL21mYV9zZXNzaW9uJztcbmltcG9ydCB7IFVzZXJJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL3VzZXInO1xuaW1wb3J0IHsgUkVDQVBUQ0hBX1ZFUklGSUVSX1RZUEUgfSBmcm9tICcuLi9yZWNhcHRjaGEvcmVjYXB0Y2hhX3ZlcmlmaWVyJztcbmltcG9ydCB7IF9jYXN0QXV0aCB9IGZyb20gJy4uLy4uL2NvcmUvYXV0aC9hdXRoX2ltcGwnO1xuaW1wb3J0IHsgZ2V0TW9kdWxhckluc3RhbmNlIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuaW1wb3J0IHsgUHJvdmlkZXJJZCB9IGZyb20gJy4uLy4uL21vZGVsL2VudW1zJztcblxuaW50ZXJmYWNlIE9uQ29uZmlybWF0aW9uQ2FsbGJhY2sge1xuICAoY3JlZGVudGlhbDogUGhvbmVBdXRoQ3JlZGVudGlhbCk6IFByb21pc2U8VXNlckNyZWRlbnRpYWw+O1xufVxuXG5jbGFzcyBDb25maXJtYXRpb25SZXN1bHRJbXBsIGltcGxlbWVudHMgQ29uZmlybWF0aW9uUmVzdWx0IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkgdmVyaWZpY2F0aW9uSWQ6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9uQ29uZmlybWF0aW9uOiBPbkNvbmZpcm1hdGlvbkNhbGxiYWNrXG4gICkge31cblxuICBjb25maXJtKHZlcmlmaWNhdGlvbkNvZGU6IHN0cmluZyk6IFByb21pc2U8VXNlckNyZWRlbnRpYWw+IHtcbiAgICBjb25zdCBhdXRoQ3JlZGVudGlhbCA9IFBob25lQXV0aENyZWRlbnRpYWwuX2Zyb21WZXJpZmljYXRpb24oXG4gICAgICB0aGlzLnZlcmlmaWNhdGlvbklkLFxuICAgICAgdmVyaWZpY2F0aW9uQ29kZVxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMub25Db25maXJtYXRpb24oYXV0aENyZWRlbnRpYWwpO1xuICB9XG59XG5cbi8qKlxuICogQXN5bmNocm9ub3VzbHkgc2lnbnMgaW4gdXNpbmcgYSBwaG9uZSBudW1iZXIuXG4gKlxuICogQHJlbWFya3NcbiAqIFRoaXMgbWV0aG9kIHNlbmRzIGEgY29kZSB2aWEgU01TIHRvIHRoZSBnaXZlblxuICogcGhvbmUgbnVtYmVyLCBhbmQgcmV0dXJucyBhIHtAbGluayBDb25maXJtYXRpb25SZXN1bHR9LiBBZnRlciB0aGUgdXNlclxuICogcHJvdmlkZXMgdGhlIGNvZGUgc2VudCB0byB0aGVpciBwaG9uZSwgY2FsbCB7QGxpbmsgQ29uZmlybWF0aW9uUmVzdWx0LmNvbmZpcm19XG4gKiB3aXRoIHRoZSBjb2RlIHRvIHNpZ24gdGhlIHVzZXIgaW4uXG4gKlxuICogRm9yIGFidXNlIHByZXZlbnRpb24sIHRoaXMgbWV0aG9kIGFsc28gcmVxdWlyZXMgYSB7QGxpbmsgQXBwbGljYXRpb25WZXJpZmllcn0uXG4gKiBUaGlzIFNESyBpbmNsdWRlcyBhIHJlQ0FQVENIQS1iYXNlZCBpbXBsZW1lbnRhdGlvbiwge0BsaW5rIFJlY2FwdGNoYVZlcmlmaWVyfS5cbiAqIFRoaXMgZnVuY3Rpb24gY2FuIHdvcmsgb24gb3RoZXIgcGxhdGZvcm1zIHRoYXQgZG8gbm90IHN1cHBvcnQgdGhlXG4gKiB7QGxpbmsgUmVjYXB0Y2hhVmVyaWZpZXJ9IChsaWtlIFJlYWN0IE5hdGl2ZSksIGJ1dCB5b3UgbmVlZCB0byB1c2UgYVxuICogdGhpcmQtcGFydHkge0BsaW5rIEFwcGxpY2F0aW9uVmVyaWZpZXJ9IGltcGxlbWVudGF0aW9uLlxuICpcbiAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHdvcmsgaW4gYSBOb2RlLmpzIGVudmlyb25tZW50LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiAvLyAncmVjYXB0Y2hhLWNvbnRhaW5lcicgaXMgdGhlIElEIG9mIGFuIGVsZW1lbnQgaW4gdGhlIERPTS5cbiAqIGNvbnN0IGFwcGxpY2F0aW9uVmVyaWZpZXIgPSBuZXcgZmlyZWJhc2UuYXV0aC5SZWNhcHRjaGFWZXJpZmllcigncmVjYXB0Y2hhLWNvbnRhaW5lcicpO1xuICogY29uc3QgY29uZmlybWF0aW9uUmVzdWx0ID0gYXdhaXQgc2lnbkluV2l0aFBob25lTnVtYmVyKGF1dGgsIHBob25lTnVtYmVyLCBhcHBsaWNhdGlvblZlcmlmaWVyKTtcbiAqIC8vIE9idGFpbiBhIHZlcmlmaWNhdGlvbkNvZGUgZnJvbSB0aGUgdXNlci5cbiAqIGNvbnN0IGNyZWRlbnRpYWwgPSBhd2FpdCBjb25maXJtYXRpb25SZXN1bHQuY29uZmlybSh2ZXJpZmljYXRpb25Db2RlKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwaG9uZU51bWJlciAtIFRoZSB1c2VyJ3MgcGhvbmUgbnVtYmVyIGluIEUuMTY0IGZvcm1hdCAoZS5nLiArMTY1MDU1NTAxMDEpLlxuICogQHBhcmFtIGFwcFZlcmlmaWVyIC0gVGhlIHtAbGluayBBcHBsaWNhdGlvblZlcmlmaWVyfS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzaWduSW5XaXRoUGhvbmVOdW1iZXIoXG4gIGF1dGg6IEF1dGgsXG4gIHBob25lTnVtYmVyOiBzdHJpbmcsXG4gIGFwcFZlcmlmaWVyOiBBcHBsaWNhdGlvblZlcmlmaWVyXG4pOiBQcm9taXNlPENvbmZpcm1hdGlvblJlc3VsdD4ge1xuICBjb25zdCBhdXRoSW50ZXJuYWwgPSBfY2FzdEF1dGgoYXV0aCk7XG4gIGNvbnN0IHZlcmlmaWNhdGlvbklkID0gYXdhaXQgX3ZlcmlmeVBob25lTnVtYmVyKFxuICAgIGF1dGhJbnRlcm5hbCxcbiAgICBwaG9uZU51bWJlcixcbiAgICBnZXRNb2R1bGFySW5zdGFuY2UoYXBwVmVyaWZpZXIgYXMgQXBwbGljYXRpb25WZXJpZmllckludGVybmFsKVxuICApO1xuICByZXR1cm4gbmV3IENvbmZpcm1hdGlvblJlc3VsdEltcGwodmVyaWZpY2F0aW9uSWQsIGNyZWQgPT5cbiAgICBzaWduSW5XaXRoQ3JlZGVudGlhbChhdXRoSW50ZXJuYWwsIGNyZWQpXG4gICk7XG59XG5cbi8qKlxuICogTGlua3MgdGhlIHVzZXIgYWNjb3VudCB3aXRoIHRoZSBnaXZlbiBwaG9uZSBudW1iZXIuXG4gKlxuICogQHJlbWFya3NcbiAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHdvcmsgaW4gYSBOb2RlLmpzIGVudmlyb25tZW50LlxuICpcbiAqIEBwYXJhbSB1c2VyIC0gVGhlIHVzZXIuXG4gKiBAcGFyYW0gcGhvbmVOdW1iZXIgLSBUaGUgdXNlcidzIHBob25lIG51bWJlciBpbiBFLjE2NCBmb3JtYXQgKGUuZy4gKzE2NTA1NTUwMTAxKS5cbiAqIEBwYXJhbSBhcHBWZXJpZmllciAtIFRoZSB7QGxpbmsgQXBwbGljYXRpb25WZXJpZmllcn0uXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlua1dpdGhQaG9uZU51bWJlcihcbiAgdXNlcjogVXNlcixcbiAgcGhvbmVOdW1iZXI6IHN0cmluZyxcbiAgYXBwVmVyaWZpZXI6IEFwcGxpY2F0aW9uVmVyaWZpZXJcbik6IFByb21pc2U8Q29uZmlybWF0aW9uUmVzdWx0PiB7XG4gIGNvbnN0IHVzZXJJbnRlcm5hbCA9IGdldE1vZHVsYXJJbnN0YW5jZSh1c2VyKSBhcyBVc2VySW50ZXJuYWw7XG4gIGF3YWl0IF9hc3NlcnRMaW5rZWRTdGF0dXMoZmFsc2UsIHVzZXJJbnRlcm5hbCwgUHJvdmlkZXJJZC5QSE9ORSk7XG4gIGNvbnN0IHZlcmlmaWNhdGlvbklkID0gYXdhaXQgX3ZlcmlmeVBob25lTnVtYmVyKFxuICAgIHVzZXJJbnRlcm5hbC5hdXRoLFxuICAgIHBob25lTnVtYmVyLFxuICAgIGdldE1vZHVsYXJJbnN0YW5jZShhcHBWZXJpZmllciBhcyBBcHBsaWNhdGlvblZlcmlmaWVySW50ZXJuYWwpXG4gICk7XG4gIHJldHVybiBuZXcgQ29uZmlybWF0aW9uUmVzdWx0SW1wbCh2ZXJpZmljYXRpb25JZCwgY3JlZCA9PlxuICAgIGxpbmtXaXRoQ3JlZGVudGlhbCh1c2VySW50ZXJuYWwsIGNyZWQpXG4gICk7XG59XG5cbi8qKlxuICogUmUtYXV0aGVudGljYXRlcyBhIHVzZXIgdXNpbmcgYSBmcmVzaCBwaG9uZSBjcmVkZW50aWFsLlxuICpcbiAqIEByZW1hcmtzXG4gKiBVc2UgYmVmb3JlIG9wZXJhdGlvbnMgc3VjaCBhcyB7QGxpbmsgdXBkYXRlUGFzc3dvcmR9IHRoYXQgcmVxdWlyZSB0b2tlbnMgZnJvbSByZWNlbnQgc2lnbi1pbiBhdHRlbXB0cy5cbiAqXG4gKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCB3b3JrIGluIGEgTm9kZS5qcyBlbnZpcm9ubWVudC5cbiAqXG4gKiBAcGFyYW0gdXNlciAtIFRoZSB1c2VyLlxuICogQHBhcmFtIHBob25lTnVtYmVyIC0gVGhlIHVzZXIncyBwaG9uZSBudW1iZXIgaW4gRS4xNjQgZm9ybWF0IChlLmcuICsxNjUwNTU1MDEwMSkuXG4gKiBAcGFyYW0gYXBwVmVyaWZpZXIgLSBUaGUge0BsaW5rIEFwcGxpY2F0aW9uVmVyaWZpZXJ9LlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYXV0aGVudGljYXRlV2l0aFBob25lTnVtYmVyKFxuICB1c2VyOiBVc2VyLFxuICBwaG9uZU51bWJlcjogc3RyaW5nLFxuICBhcHBWZXJpZmllcjogQXBwbGljYXRpb25WZXJpZmllclxuKTogUHJvbWlzZTxDb25maXJtYXRpb25SZXN1bHQ+IHtcbiAgY29uc3QgdXNlckludGVybmFsID0gZ2V0TW9kdWxhckluc3RhbmNlKHVzZXIpIGFzIFVzZXJJbnRlcm5hbDtcbiAgY29uc3QgdmVyaWZpY2F0aW9uSWQgPSBhd2FpdCBfdmVyaWZ5UGhvbmVOdW1iZXIoXG4gICAgdXNlckludGVybmFsLmF1dGgsXG4gICAgcGhvbmVOdW1iZXIsXG4gICAgZ2V0TW9kdWxhckluc3RhbmNlKGFwcFZlcmlmaWVyIGFzIEFwcGxpY2F0aW9uVmVyaWZpZXJJbnRlcm5hbClcbiAgKTtcbiAgcmV0dXJuIG5ldyBDb25maXJtYXRpb25SZXN1bHRJbXBsKHZlcmlmaWNhdGlvbklkLCBjcmVkID0+XG4gICAgcmVhdXRoZW50aWNhdGVXaXRoQ3JlZGVudGlhbCh1c2VySW50ZXJuYWwsIGNyZWQpXG4gICk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHZlcmlmaWNhdGlvbiBJRCB0byBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFNNUyBjb2RlIHRoYXQgaXMgc2VudC5cbiAqXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBfdmVyaWZ5UGhvbmVOdW1iZXIoXG4gIGF1dGg6IEF1dGhJbnRlcm5hbCxcbiAgb3B0aW9uczogUGhvbmVJbmZvT3B0aW9ucyB8IHN0cmluZyxcbiAgdmVyaWZpZXI6IEFwcGxpY2F0aW9uVmVyaWZpZXJJbnRlcm5hbFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgcmVjYXB0Y2hhVG9rZW4gPSBhd2FpdCB2ZXJpZmllci52ZXJpZnkoKTtcblxuICB0cnkge1xuICAgIF9hc3NlcnQoXG4gICAgICB0eXBlb2YgcmVjYXB0Y2hhVG9rZW4gPT09ICdzdHJpbmcnLFxuICAgICAgYXV0aCxcbiAgICAgIEF1dGhFcnJvckNvZGUuQVJHVU1FTlRfRVJST1JcbiAgICApO1xuICAgIF9hc3NlcnQoXG4gICAgICB2ZXJpZmllci50eXBlID09PSBSRUNBUFRDSEFfVkVSSUZJRVJfVFlQRSxcbiAgICAgIGF1dGgsXG4gICAgICBBdXRoRXJyb3JDb2RlLkFSR1VNRU5UX0VSUk9SXG4gICAgKTtcblxuICAgIGxldCBwaG9uZUluZm9PcHRpb25zOiBQaG9uZUluZm9PcHRpb25zO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgcGhvbmVJbmZvT3B0aW9ucyA9IHtcbiAgICAgICAgcGhvbmVOdW1iZXI6IG9wdGlvbnNcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHBob25lSW5mb09wdGlvbnMgPSBvcHRpb25zO1xuICAgIH1cblxuICAgIGlmICgnc2Vzc2lvbicgaW4gcGhvbmVJbmZvT3B0aW9ucykge1xuICAgICAgY29uc3Qgc2Vzc2lvbiA9IHBob25lSW5mb09wdGlvbnMuc2Vzc2lvbiBhcyBNdWx0aUZhY3RvclNlc3Npb25JbXBsO1xuXG4gICAgICBpZiAoJ3Bob25lTnVtYmVyJyBpbiBwaG9uZUluZm9PcHRpb25zKSB7XG4gICAgICAgIF9hc3NlcnQoXG4gICAgICAgICAgc2Vzc2lvbi50eXBlID09PSBNdWx0aUZhY3RvclNlc3Npb25UeXBlLkVOUk9MTCxcbiAgICAgICAgICBhdXRoLFxuICAgICAgICAgIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1JcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzdGFydEVucm9sbFBob25lTWZhKGF1dGgsIHtcbiAgICAgICAgICBpZFRva2VuOiBzZXNzaW9uLmNyZWRlbnRpYWwsXG4gICAgICAgICAgcGhvbmVFbnJvbGxtZW50SW5mbzoge1xuICAgICAgICAgICAgcGhvbmVOdW1iZXI6IHBob25lSW5mb09wdGlvbnMucGhvbmVOdW1iZXIsXG4gICAgICAgICAgICByZWNhcHRjaGFUb2tlblxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXNwb25zZS5waG9uZVNlc3Npb25JbmZvLnNlc3Npb25JbmZvO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX2Fzc2VydChcbiAgICAgICAgICBzZXNzaW9uLnR5cGUgPT09IE11bHRpRmFjdG9yU2Vzc2lvblR5cGUuU0lHTl9JTixcbiAgICAgICAgICBhdXRoLFxuICAgICAgICAgIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1JcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgbWZhRW5yb2xsbWVudElkID1cbiAgICAgICAgICBwaG9uZUluZm9PcHRpb25zLm11bHRpRmFjdG9ySGludD8udWlkIHx8XG4gICAgICAgICAgcGhvbmVJbmZvT3B0aW9ucy5tdWx0aUZhY3RvclVpZDtcbiAgICAgICAgX2Fzc2VydChtZmFFbnJvbGxtZW50SWQsIGF1dGgsIEF1dGhFcnJvckNvZGUuTUlTU0lOR19NRkFfSU5GTyk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc3RhcnRTaWduSW5QaG9uZU1mYShhdXRoLCB7XG4gICAgICAgICAgbWZhUGVuZGluZ0NyZWRlbnRpYWw6IHNlc3Npb24uY3JlZGVudGlhbCxcbiAgICAgICAgICBtZmFFbnJvbGxtZW50SWQsXG4gICAgICAgICAgcGhvbmVTaWduSW5JbmZvOiB7XG4gICAgICAgICAgICByZWNhcHRjaGFUb2tlblxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXNwb25zZS5waG9uZVJlc3BvbnNlSW5mby5zZXNzaW9uSW5mbztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgeyBzZXNzaW9uSW5mbyB9ID0gYXdhaXQgc2VuZFBob25lVmVyaWZpY2F0aW9uQ29kZShhdXRoLCB7XG4gICAgICAgIHBob25lTnVtYmVyOiBwaG9uZUluZm9PcHRpb25zLnBob25lTnVtYmVyLFxuICAgICAgICByZWNhcHRjaGFUb2tlblxuICAgICAgfSk7XG4gICAgICByZXR1cm4gc2Vzc2lvbkluZm87XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIHZlcmlmaWVyLl9yZXNldCgpO1xuICB9XG59XG5cbi8qKlxuICogVXBkYXRlcyB0aGUgdXNlcidzIHBob25lIG51bWJlci5cbiAqXG4gKiBAcmVtYXJrc1xuICogVGhpcyBtZXRob2QgZG9lcyBub3Qgd29yayBpbiBhIE5vZGUuanMgZW52aXJvbm1lbnQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYFxuICogLy8gJ3JlY2FwdGNoYS1jb250YWluZXInIGlzIHRoZSBJRCBvZiBhbiBlbGVtZW50IGluIHRoZSBET00uXG4gKiBjb25zdCBhcHBsaWNhdGlvblZlcmlmaWVyID0gbmV3IFJlY2FwdGNoYVZlcmlmaWVyKCdyZWNhcHRjaGEtY29udGFpbmVyJyk7XG4gKiBjb25zdCBwcm92aWRlciA9IG5ldyBQaG9uZUF1dGhQcm92aWRlcihhdXRoKTtcbiAqIGNvbnN0IHZlcmlmaWNhdGlvbklkID0gYXdhaXQgcHJvdmlkZXIudmVyaWZ5UGhvbmVOdW1iZXIoJysxNjUwNTU1MDEwMScsIGFwcGxpY2F0aW9uVmVyaWZpZXIpO1xuICogLy8gT2J0YWluIHRoZSB2ZXJpZmljYXRpb25Db2RlIGZyb20gdGhlIHVzZXIuXG4gKiBjb25zdCBwaG9uZUNyZWRlbnRpYWwgPSBQaG9uZUF1dGhQcm92aWRlci5jcmVkZW50aWFsKHZlcmlmaWNhdGlvbklkLCB2ZXJpZmljYXRpb25Db2RlKTtcbiAqIGF3YWl0IHVwZGF0ZVBob25lTnVtYmVyKHVzZXIsIHBob25lQ3JlZGVudGlhbCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdXNlciAtIFRoZSB1c2VyLlxuICogQHBhcmFtIGNyZWRlbnRpYWwgLSBBIGNyZWRlbnRpYWwgYXV0aGVudGljYXRpbmcgdGhlIG5ldyBwaG9uZSBudW1iZXIuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlUGhvbmVOdW1iZXIoXG4gIHVzZXI6IFVzZXIsXG4gIGNyZWRlbnRpYWw6IFBob25lQXV0aENyZWRlbnRpYWxcbik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBfbGluayhnZXRNb2R1bGFySW5zdGFuY2UodXNlcikgYXMgVXNlckludGVybmFsLCBjcmVkZW50aWFsKTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQge1xuICBBdXRoLFxuICBQaG9uZUluZm9PcHRpb25zLFxuICBBcHBsaWNhdGlvblZlcmlmaWVyLFxuICBVc2VyQ3JlZGVudGlhbFxufSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuXG5pbXBvcnQgeyBTaWduSW5XaXRoUGhvbmVOdW1iZXJSZXNwb25zZSB9IGZyb20gJy4uLy4uL2FwaS9hdXRoZW50aWNhdGlvbi9zbXMnO1xuaW1wb3J0IHsgQXBwbGljYXRpb25WZXJpZmllckludGVybmFsIGFzIEFwcGxpY2F0aW9uVmVyaWZpZXJJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL2FwcGxpY2F0aW9uX3ZlcmlmaWVyJztcbmltcG9ydCB7IEF1dGhJbnRlcm5hbCBhcyBBdXRoSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC9hdXRoJztcbmltcG9ydCB7IFVzZXJDcmVkZW50aWFsSW50ZXJuYWwgYXMgVXNlckNyZWRlbnRpYWxJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL3VzZXInO1xuaW1wb3J0IHsgUGhvbmVBdXRoQ3JlZGVudGlhbCB9IGZyb20gJy4uLy4uL2NvcmUvY3JlZGVudGlhbHMvcGhvbmUnO1xuaW1wb3J0IHsgX3ZlcmlmeVBob25lTnVtYmVyIH0gZnJvbSAnLi4vc3RyYXRlZ2llcy9waG9uZSc7XG5pbXBvcnQgeyBfY2FzdEF1dGggfSBmcm9tICcuLi8uLi9jb3JlL2F1dGgvYXV0aF9pbXBsJztcbmltcG9ydCB7IEF1dGhDcmVkZW50aWFsIH0gZnJvbSAnLi4vLi4vY29yZSc7XG5pbXBvcnQgeyBGaXJlYmFzZUVycm9yLCBnZXRNb2R1bGFySW5zdGFuY2UgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5pbXBvcnQgeyBUYWdnZWRXaXRoVG9rZW5SZXNwb25zZSB9IGZyb20gJy4uLy4uL21vZGVsL2lkX3Rva2VuJztcbmltcG9ydCB7IFByb3ZpZGVySWQsIFNpZ25Jbk1ldGhvZCB9IGZyb20gJy4uLy4uL21vZGVsL2VudW1zJztcblxuLyoqXG4gKiBQcm92aWRlciBmb3IgZ2VuZXJhdGluZyBhbiB7QGxpbmsgUGhvbmVBdXRoQ3JlZGVudGlhbH0uXG4gKlxuICogQHJlbWFya3NcbiAqIGBQaG9uZUF1dGhQcm92aWRlcmAgZG9lcyBub3Qgd29yayBpbiBhIE5vZGUuanMgZW52aXJvbm1lbnQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGphdmFzY3JpcHRcbiAqIC8vICdyZWNhcHRjaGEtY29udGFpbmVyJyBpcyB0aGUgSUQgb2YgYW4gZWxlbWVudCBpbiB0aGUgRE9NLlxuICogY29uc3QgYXBwbGljYXRpb25WZXJpZmllciA9IG5ldyBSZWNhcHRjaGFWZXJpZmllcigncmVjYXB0Y2hhLWNvbnRhaW5lcicpO1xuICogY29uc3QgcHJvdmlkZXIgPSBuZXcgUGhvbmVBdXRoUHJvdmlkZXIoYXV0aCk7XG4gKiBjb25zdCB2ZXJpZmljYXRpb25JZCA9IGF3YWl0IHByb3ZpZGVyLnZlcmlmeVBob25lTnVtYmVyKCcrMTY1MDU1NTAxMDEnLCBhcHBsaWNhdGlvblZlcmlmaWVyKTtcbiAqIC8vIE9idGFpbiB0aGUgdmVyaWZpY2F0aW9uQ29kZSBmcm9tIHRoZSB1c2VyLlxuICogY29uc3QgcGhvbmVDcmVkZW50aWFsID0gUGhvbmVBdXRoUHJvdmlkZXIuY3JlZGVudGlhbCh2ZXJpZmljYXRpb25JZCwgdmVyaWZpY2F0aW9uQ29kZSk7XG4gKiBjb25zdCB1c2VyQ3JlZGVudGlhbCA9IGF3YWl0IHNpZ25JbldpdGhDcmVkZW50aWFsKGF1dGgsIHBob25lQ3JlZGVudGlhbCk7XG4gKiBgYGBcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBQaG9uZUF1dGhQcm92aWRlciB7XG4gIC8qKiBBbHdheXMgc2V0IHRvIHtAbGluayBQcm92aWRlcklkfS5QSE9ORS4gKi9cbiAgc3RhdGljIHJlYWRvbmx5IFBST1ZJREVSX0lEOiAncGhvbmUnID0gUHJvdmlkZXJJZC5QSE9ORTtcbiAgLyoqIEFsd2F5cyBzZXQgdG8ge0BsaW5rIFNpZ25Jbk1ldGhvZH0uUEhPTkUuICovXG4gIHN0YXRpYyByZWFkb25seSBQSE9ORV9TSUdOX0lOX01FVEhPRDogJ3Bob25lJyA9IFNpZ25Jbk1ldGhvZC5QSE9ORTtcblxuICAvKiogQWx3YXlzIHNldCB0byB7QGxpbmsgUHJvdmlkZXJJZH0uUEhPTkUuICovXG4gIHJlYWRvbmx5IHByb3ZpZGVySWQgPSBQaG9uZUF1dGhQcm92aWRlci5QUk9WSURFUl9JRDtcbiAgcHJpdmF0ZSByZWFkb25seSBhdXRoOiBBdXRoSW50ZXJuYWw7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBhdXRoIC0gVGhlIEZpcmViYXNlIHtAbGluayBBdXRofSBpbnN0YW5jZSBpbiB3aGljaCBzaWduLWlucyBzaG91bGQgb2NjdXIuXG4gICAqXG4gICAqL1xuICBjb25zdHJ1Y3RvcihhdXRoOiBBdXRoKSB7XG4gICAgdGhpcy5hdXRoID0gX2Nhc3RBdXRoKGF1dGgpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIFN0YXJ0cyBhIHBob25lIG51bWJlciBhdXRoZW50aWNhdGlvbiBmbG93IGJ5IHNlbmRpbmcgYSB2ZXJpZmljYXRpb24gY29kZSB0byB0aGUgZ2l2ZW4gcGhvbmVcbiAgICogbnVtYmVyLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBqYXZhc2NyaXB0XG4gICAqIGNvbnN0IHByb3ZpZGVyID0gbmV3IFBob25lQXV0aFByb3ZpZGVyKGF1dGgpO1xuICAgKiBjb25zdCB2ZXJpZmljYXRpb25JZCA9IGF3YWl0IHByb3ZpZGVyLnZlcmlmeVBob25lTnVtYmVyKHBob25lTnVtYmVyLCBhcHBsaWNhdGlvblZlcmlmaWVyKTtcbiAgICogLy8gT2J0YWluIHZlcmlmaWNhdGlvbkNvZGUgZnJvbSB0aGUgdXNlci5cbiAgICogY29uc3QgYXV0aENyZWRlbnRpYWwgPSBQaG9uZUF1dGhQcm92aWRlci5jcmVkZW50aWFsKHZlcmlmaWNhdGlvbklkLCB2ZXJpZmljYXRpb25Db2RlKTtcbiAgICogY29uc3QgdXNlckNyZWRlbnRpYWwgPSBhd2FpdCBzaWduSW5XaXRoQ3JlZGVudGlhbChhdXRoLCBhdXRoQ3JlZGVudGlhbCk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBBbiBhbHRlcm5hdGl2ZSBmbG93IGlzIHByb3ZpZGVkIHVzaW5nIHRoZSBgc2lnbkluV2l0aFBob25lTnVtYmVyYCBtZXRob2QuXG4gICAqIGBgYGphdmFzY3JpcHRcbiAgICogY29uc3QgY29uZmlybWF0aW9uUmVzdWx0ID0gc2lnbkluV2l0aFBob25lTnVtYmVyKGF1dGgsIHBob25lTnVtYmVyLCBhcHBsaWNhdGlvblZlcmlmaWVyKTtcbiAgICogLy8gT2J0YWluIHZlcmlmaWNhdGlvbkNvZGUgZnJvbSB0aGUgdXNlci5cbiAgICogY29uc3QgdXNlckNyZWRlbnRpYWwgPSBjb25maXJtYXRpb25SZXN1bHQuY29uZmlybSh2ZXJpZmljYXRpb25Db2RlKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBwaG9uZUluZm9PcHRpb25zIC0gVGhlIHVzZXIncyB7QGxpbmsgUGhvbmVJbmZvT3B0aW9uc30uIFRoZSBwaG9uZSBudW1iZXIgc2hvdWxkIGJlIGluXG4gICAqIEUuMTY0IGZvcm1hdCAoZS5nLiArMTY1MDU1NTAxMDEpLlxuICAgKiBAcGFyYW0gYXBwbGljYXRpb25WZXJpZmllciAtIEZvciBhYnVzZSBwcmV2ZW50aW9uLCB0aGlzIG1ldGhvZCBhbHNvIHJlcXVpcmVzIGFcbiAgICoge0BsaW5rIEFwcGxpY2F0aW9uVmVyaWZpZXJ9LiBUaGlzIFNESyBpbmNsdWRlcyBhIHJlQ0FQVENIQS1iYXNlZCBpbXBsZW1lbnRhdGlvbixcbiAgICoge0BsaW5rIFJlY2FwdGNoYVZlcmlmaWVyfS5cbiAgICpcbiAgICogQHJldHVybnMgQSBQcm9taXNlIGZvciBhIHZlcmlmaWNhdGlvbiBJRCB0aGF0IGNhbiBiZSBwYXNzZWQgdG9cbiAgICoge0BsaW5rIFBob25lQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWx9IHRvIGlkZW50aWZ5IHRoaXMgZmxvdy4uXG4gICAqL1xuICB2ZXJpZnlQaG9uZU51bWJlcihcbiAgICBwaG9uZU9wdGlvbnM6IFBob25lSW5mb09wdGlvbnMgfCBzdHJpbmcsXG4gICAgYXBwbGljYXRpb25WZXJpZmllcjogQXBwbGljYXRpb25WZXJpZmllclxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBfdmVyaWZ5UGhvbmVOdW1iZXIoXG4gICAgICB0aGlzLmF1dGgsXG4gICAgICBwaG9uZU9wdGlvbnMsXG4gICAgICBnZXRNb2R1bGFySW5zdGFuY2UoYXBwbGljYXRpb25WZXJpZmllciBhcyBBcHBsaWNhdGlvblZlcmlmaWVySW50ZXJuYWwpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgcGhvbmUgYXV0aCBjcmVkZW50aWFsLCBnaXZlbiB0aGUgdmVyaWZpY2F0aW9uIElEIGZyb21cbiAgICoge0BsaW5rIFBob25lQXV0aFByb3ZpZGVyLnZlcmlmeVBob25lTnVtYmVyfSBhbmQgdGhlIGNvZGUgdGhhdCB3YXMgc2VudCB0byB0aGUgdXNlcidzXG4gICAqIG1vYmlsZSBkZXZpY2UuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYGphdmFzY3JpcHRcbiAgICogY29uc3QgcHJvdmlkZXIgPSBuZXcgUGhvbmVBdXRoUHJvdmlkZXIoYXV0aCk7XG4gICAqIGNvbnN0IHZlcmlmaWNhdGlvbklkID0gcHJvdmlkZXIudmVyaWZ5UGhvbmVOdW1iZXIocGhvbmVOdW1iZXIsIGFwcGxpY2F0aW9uVmVyaWZpZXIpO1xuICAgKiAvLyBPYnRhaW4gdmVyaWZpY2F0aW9uQ29kZSBmcm9tIHRoZSB1c2VyLlxuICAgKiBjb25zdCBhdXRoQ3JlZGVudGlhbCA9IFBob25lQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWwodmVyaWZpY2F0aW9uSWQsIHZlcmlmaWNhdGlvbkNvZGUpO1xuICAgKiBjb25zdCB1c2VyQ3JlZGVudGlhbCA9IHNpZ25JbldpdGhDcmVkZW50aWFsKGF1dGgsIGF1dGhDcmVkZW50aWFsKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIEFuIGFsdGVybmF0aXZlIGZsb3cgaXMgcHJvdmlkZWQgdXNpbmcgdGhlIGBzaWduSW5XaXRoUGhvbmVOdW1iZXJgIG1ldGhvZC5cbiAgICogYGBgamF2YXNjcmlwdFxuICAgKiBjb25zdCBjb25maXJtYXRpb25SZXN1bHQgPSBhd2FpdCBzaWduSW5XaXRoUGhvbmVOdW1iZXIoYXV0aCwgcGhvbmVOdW1iZXIsIGFwcGxpY2F0aW9uVmVyaWZpZXIpO1xuICAgKiAvLyBPYnRhaW4gdmVyaWZpY2F0aW9uQ29kZSBmcm9tIHRoZSB1c2VyLlxuICAgKiBjb25zdCB1c2VyQ3JlZGVudGlhbCA9IGF3YWl0IGNvbmZpcm1hdGlvblJlc3VsdC5jb25maXJtKHZlcmlmaWNhdGlvbkNvZGUpO1xuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIHZlcmlmaWNhdGlvbklkIC0gVGhlIHZlcmlmaWNhdGlvbiBJRCByZXR1cm5lZCBmcm9tIHtAbGluayBQaG9uZUF1dGhQcm92aWRlci52ZXJpZnlQaG9uZU51bWJlcn0uXG4gICAqIEBwYXJhbSB2ZXJpZmljYXRpb25Db2RlIC0gVGhlIHZlcmlmaWNhdGlvbiBjb2RlIHNlbnQgdG8gdGhlIHVzZXIncyBtb2JpbGUgZGV2aWNlLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgYXV0aCBwcm92aWRlciBjcmVkZW50aWFsLlxuICAgKi9cbiAgc3RhdGljIGNyZWRlbnRpYWwoXG4gICAgdmVyaWZpY2F0aW9uSWQ6IHN0cmluZyxcbiAgICB2ZXJpZmljYXRpb25Db2RlOiBzdHJpbmdcbiAgKTogUGhvbmVBdXRoQ3JlZGVudGlhbCB7XG4gICAgcmV0dXJuIFBob25lQXV0aENyZWRlbnRpYWwuX2Zyb21WZXJpZmljYXRpb24oXG4gICAgICB2ZXJpZmljYXRpb25JZCxcbiAgICAgIHZlcmlmaWNhdGlvbkNvZGVcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhbiB7QGxpbmsgQXV0aENyZWRlbnRpYWx9IGZyb20gYSB7QGxpbmsgVXNlckNyZWRlbnRpYWx9LlxuICAgKiBAcGFyYW0gdXNlckNyZWRlbnRpYWwgLSBUaGUgdXNlciBjcmVkZW50aWFsLlxuICAgKi9cbiAgc3RhdGljIGNyZWRlbnRpYWxGcm9tUmVzdWx0KFxuICAgIHVzZXJDcmVkZW50aWFsOiBVc2VyQ3JlZGVudGlhbFxuICApOiBBdXRoQ3JlZGVudGlhbCB8IG51bGwge1xuICAgIGNvbnN0IGNyZWRlbnRpYWwgPSB1c2VyQ3JlZGVudGlhbCBhcyBVc2VyQ3JlZGVudGlhbEludGVybmFsO1xuICAgIHJldHVybiBQaG9uZUF1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdChjcmVkZW50aWFsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIHtAbGluayBBdXRoQ3JlZGVudGlhbH0gd2hlbiBwYXNzZWQgYW4gZXJyb3IuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIHdvcmtzIGZvciBlcnJvcnMgbGlrZVxuICAgKiBgYXV0aC9hY2NvdW50LWV4aXN0cy13aXRoLWRpZmZlcmVudC1jcmVkZW50aWFsc2AuIFRoaXMgaXMgdXNlZnVsIGZvclxuICAgKiByZWNvdmVyaW5nIHdoZW4gYXR0ZW1wdGluZyB0byBzZXQgYSB1c2VyJ3MgcGhvbmUgbnVtYmVyIGJ1dCB0aGUgbnVtYmVyXG4gICAqIGluIHF1ZXN0aW9uIGlzIGFscmVhZHkgdGllZCB0byBhbm90aGVyIGFjY291bnQuIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nXG4gICAqIGNvZGUgdHJpZXMgdG8gdXBkYXRlIHRoZSBjdXJyZW50IHVzZXIncyBwaG9uZSBudW1iZXIsIGFuZCBpZiB0aGF0XG4gICAqIGZhaWxzLCBsaW5rcyB0aGUgdXNlciB3aXRoIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGF0IG51bWJlcjpcbiAgICpcbiAgICogYGBganNcbiAgICogY29uc3QgcHJvdmlkZXIgPSBuZXcgUGhvbmVBdXRoUHJvdmlkZXIoYXV0aCk7XG4gICAqIGNvbnN0IHZlcmlmaWNhdGlvbklkID0gYXdhaXQgcHJvdmlkZXIudmVyaWZ5UGhvbmVOdW1iZXIobnVtYmVyLCB2ZXJpZmllcik7XG4gICAqIHRyeSB7XG4gICAqICAgY29uc3QgY29kZSA9ICcnOyAvLyBQcm9tcHQgdGhlIHVzZXIgZm9yIHRoZSB2ZXJpZmljYXRpb24gY29kZVxuICAgKiAgIGF3YWl0IHVwZGF0ZVBob25lTnVtYmVyKFxuICAgKiAgICAgICBhdXRoLmN1cnJlbnRVc2VyLFxuICAgKiAgICAgICBQaG9uZUF1dGhQcm92aWRlci5jcmVkZW50aWFsKHZlcmlmaWNhdGlvbklkLCBjb2RlKSk7XG4gICAqIH0gY2F0Y2ggKGUpIHtcbiAgICogICBpZiAoKGUgYXMgRmlyZWJhc2VFcnJvcik/LmNvZGUgPT09ICdhdXRoL2FjY291bnQtZXhpc3RzLXdpdGgtZGlmZmVyZW50LWNyZWRlbnRpYWwnKSB7XG4gICAqICAgICBjb25zdCBjcmVkID0gUGhvbmVBdXRoUHJvdmlkZXIuY3JlZGVudGlhbEZyb21FcnJvcihlKTtcbiAgICogICAgIGF3YWl0IGxpbmtXaXRoQ3JlZGVudGlhbChhdXRoLmN1cnJlbnRVc2VyLCBjcmVkKTtcbiAgICogICB9XG4gICAqIH1cbiAgICpcbiAgICogLy8gQXQgdGhpcyBwb2ludCwgYXV0aC5jdXJyZW50VXNlci5waG9uZU51bWJlciA9PT0gbnVtYmVyLlxuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIGVycm9yIC0gVGhlIGVycm9yIHRvIGdlbmVyYXRlIGEgY3JlZGVudGlhbCBmcm9tLlxuICAgKi9cbiAgc3RhdGljIGNyZWRlbnRpYWxGcm9tRXJyb3IoZXJyb3I6IEZpcmViYXNlRXJyb3IpOiBBdXRoQ3JlZGVudGlhbCB8IG51bGwge1xuICAgIHJldHVybiBQaG9uZUF1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdChcbiAgICAgIChlcnJvci5jdXN0b21EYXRhIHx8IHt9KSBhcyBUYWdnZWRXaXRoVG9rZW5SZXNwb25zZVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdCh7XG4gICAgX3Rva2VuUmVzcG9uc2U6IHRva2VuUmVzcG9uc2VcbiAgfTogVGFnZ2VkV2l0aFRva2VuUmVzcG9uc2UpOiBBdXRoQ3JlZGVudGlhbCB8IG51bGwge1xuICAgIGlmICghdG9rZW5SZXNwb25zZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHsgcGhvbmVOdW1iZXIsIHRlbXBvcmFyeVByb29mIH0gPVxuICAgICAgdG9rZW5SZXNwb25zZSBhcyBTaWduSW5XaXRoUGhvbmVOdW1iZXJSZXNwb25zZTtcbiAgICBpZiAocGhvbmVOdW1iZXIgJiYgdGVtcG9yYXJ5UHJvb2YpIHtcbiAgICAgIHJldHVybiBQaG9uZUF1dGhDcmVkZW50aWFsLl9mcm9tVG9rZW5SZXNwb25zZShcbiAgICAgICAgcGhvbmVOdW1iZXIsXG4gICAgICAgIHRlbXBvcmFyeVByb29mXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IFBvcHVwUmVkaXJlY3RSZXNvbHZlciB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5pbXBvcnQgeyBBdXRoSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC9hdXRoJztcbmltcG9ydCB7IFBvcHVwUmVkaXJlY3RSZXNvbHZlckludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvcG9wdXBfcmVkaXJlY3QnO1xuaW1wb3J0IHsgQXV0aEVycm9yQ29kZSB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBfYXNzZXJ0IH0gZnJvbSAnLi9hc3NlcnQnO1xuaW1wb3J0IHsgX2dldEluc3RhbmNlIH0gZnJvbSAnLi9pbnN0YW50aWF0b3InO1xuXG4vKipcbiAqIENob29zZXMgYSBwb3B1cC9yZWRpcmVjdCByZXNvbHZlciB0byB1c2UuIFRoaXMgcHJlZmVycyB0aGUgb3ZlcnJpZGUgKHdoaWNoXG4gKiBpcyBkaXJlY3RseSBwYXNzZWQgaW4pLCBhbmQgZmFsbHMgYmFjayB0byB0aGUgcHJvcGVydHkgc2V0IG9uIHRoZSBhdXRoXG4gKiBvYmplY3QuIElmIG5laXRoZXIgYXJlIGF2YWlsYWJsZSwgdGhpcyBmdW5jdGlvbiBlcnJvcnMgdy8gYW4gYXJndW1lbnQgZXJyb3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfd2l0aERlZmF1bHRSZXNvbHZlcihcbiAgYXV0aDogQXV0aEludGVybmFsLFxuICByZXNvbHZlck92ZXJyaWRlOiBQb3B1cFJlZGlyZWN0UmVzb2x2ZXIgfCB1bmRlZmluZWRcbik6IFBvcHVwUmVkaXJlY3RSZXNvbHZlckludGVybmFsIHtcbiAgaWYgKHJlc29sdmVyT3ZlcnJpZGUpIHtcbiAgICByZXR1cm4gX2dldEluc3RhbmNlKHJlc29sdmVyT3ZlcnJpZGUpO1xuICB9XG5cbiAgX2Fzc2VydChhdXRoLl9wb3B1cFJlZGlyZWN0UmVzb2x2ZXIsIGF1dGgsIEF1dGhFcnJvckNvZGUuQVJHVU1FTlRfRVJST1IpO1xuXG4gIHJldHVybiBhdXRoLl9wb3B1cFJlZGlyZWN0UmVzb2x2ZXI7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgc2lnbkluV2l0aElkcCxcbiAgU2lnbkluV2l0aElkcFJlcXVlc3Rcbn0gZnJvbSAnLi4vLi4vYXBpL2F1dGhlbnRpY2F0aW9uL2lkcCc7XG5pbXBvcnQgeyBQaG9uZU9yT2F1dGhUb2tlblJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vYXBpL2F1dGhlbnRpY2F0aW9uL21mYSc7XG5pbXBvcnQgeyBBdXRoSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC9hdXRoJztcbmltcG9ydCB7IElkVG9rZW5SZXNwb25zZSB9IGZyb20gJy4uLy4uL21vZGVsL2lkX3Rva2VuJztcbmltcG9ydCB7IFVzZXJJbnRlcm5hbCwgVXNlckNyZWRlbnRpYWxJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL3VzZXInO1xuaW1wb3J0IHsgQXV0aENyZWRlbnRpYWwgfSBmcm9tICcuLi9jcmVkZW50aWFscyc7XG5pbXBvcnQgeyBfbGluayBhcyBfbGlua1VzZXIgfSBmcm9tICcuLi91c2VyL2xpbmtfdW5saW5rJztcbmltcG9ydCB7IF9yZWF1dGhlbnRpY2F0ZSB9IGZyb20gJy4uL3VzZXIvcmVhdXRoZW50aWNhdGUnO1xuaW1wb3J0IHsgX2Fzc2VydCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0JztcbmltcG9ydCB7IF9zaWduSW5XaXRoQ3JlZGVudGlhbCB9IGZyb20gJy4vY3JlZGVudGlhbCc7XG5pbXBvcnQgeyBBdXRoRXJyb3JDb2RlIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IFByb3ZpZGVySWQgfSBmcm9tICcuLi8uLi9tb2RlbC9lbnVtcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSWRwVGFza1BhcmFtcyB7XG4gIGF1dGg6IEF1dGhJbnRlcm5hbDtcbiAgcmVxdWVzdFVyaTogc3RyaW5nO1xuICBzZXNzaW9uSWQ/OiBzdHJpbmc7XG4gIHRlbmFudElkPzogc3RyaW5nO1xuICBwb3N0Qm9keT86IHN0cmluZztcbiAgcGVuZGluZ1Rva2VuPzogc3RyaW5nO1xuICB1c2VyPzogVXNlckludGVybmFsO1xuICBieXBhc3NBdXRoU3RhdGU/OiBib29sZWFuO1xufVxuXG5leHBvcnQgdHlwZSBJZHBUYXNrID0gKFxuICBwYXJhbXM6IElkcFRhc2tQYXJhbXNcbikgPT4gUHJvbWlzZTxVc2VyQ3JlZGVudGlhbEludGVybmFsPjtcblxuY2xhc3MgSWRwQ3JlZGVudGlhbCBleHRlbmRzIEF1dGhDcmVkZW50aWFsIHtcbiAgY29uc3RydWN0b3IocmVhZG9ubHkgcGFyYW1zOiBJZHBUYXNrUGFyYW1zKSB7XG4gICAgc3VwZXIoUHJvdmlkZXJJZC5DVVNUT00sIFByb3ZpZGVySWQuQ1VTVE9NKTtcbiAgfVxuXG4gIF9nZXRJZFRva2VuUmVzcG9uc2UoYXV0aDogQXV0aEludGVybmFsKTogUHJvbWlzZTxQaG9uZU9yT2F1dGhUb2tlblJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHNpZ25JbldpdGhJZHAoYXV0aCwgdGhpcy5fYnVpbGRJZHBSZXF1ZXN0KCkpO1xuICB9XG5cbiAgX2xpbmtUb0lkVG9rZW4oXG4gICAgYXV0aDogQXV0aEludGVybmFsLFxuICAgIGlkVG9rZW46IHN0cmluZ1xuICApOiBQcm9taXNlPElkVG9rZW5SZXNwb25zZT4ge1xuICAgIHJldHVybiBzaWduSW5XaXRoSWRwKGF1dGgsIHRoaXMuX2J1aWxkSWRwUmVxdWVzdChpZFRva2VuKSk7XG4gIH1cblxuICBfZ2V0UmVhdXRoZW50aWNhdGlvblJlc29sdmVyKGF1dGg6IEF1dGhJbnRlcm5hbCk6IFByb21pc2U8SWRUb2tlblJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHNpZ25JbldpdGhJZHAoYXV0aCwgdGhpcy5fYnVpbGRJZHBSZXF1ZXN0KCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfYnVpbGRJZHBSZXF1ZXN0KGlkVG9rZW4/OiBzdHJpbmcpOiBTaWduSW5XaXRoSWRwUmVxdWVzdCB7XG4gICAgY29uc3QgcmVxdWVzdDogU2lnbkluV2l0aElkcFJlcXVlc3QgPSB7XG4gICAgICByZXF1ZXN0VXJpOiB0aGlzLnBhcmFtcy5yZXF1ZXN0VXJpLFxuICAgICAgc2Vzc2lvbklkOiB0aGlzLnBhcmFtcy5zZXNzaW9uSWQsXG4gICAgICBwb3N0Qm9keTogdGhpcy5wYXJhbXMucG9zdEJvZHksXG4gICAgICB0ZW5hbnRJZDogdGhpcy5wYXJhbXMudGVuYW50SWQsXG4gICAgICBwZW5kaW5nVG9rZW46IHRoaXMucGFyYW1zLnBlbmRpbmdUb2tlbixcbiAgICAgIHJldHVyblNlY3VyZVRva2VuOiB0cnVlLFxuICAgICAgcmV0dXJuSWRwQ3JlZGVudGlhbDogdHJ1ZVxuICAgIH07XG5cbiAgICBpZiAoaWRUb2tlbikge1xuICAgICAgcmVxdWVzdC5pZFRva2VuID0gaWRUb2tlbjtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVxdWVzdDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX3NpZ25JbihcbiAgcGFyYW1zOiBJZHBUYXNrUGFyYW1zXG4pOiBQcm9taXNlPFVzZXJDcmVkZW50aWFsSW50ZXJuYWw+IHtcbiAgcmV0dXJuIF9zaWduSW5XaXRoQ3JlZGVudGlhbChcbiAgICBwYXJhbXMuYXV0aCxcbiAgICBuZXcgSWRwQ3JlZGVudGlhbChwYXJhbXMpLFxuICAgIHBhcmFtcy5ieXBhc3NBdXRoU3RhdGVcbiAgKSBhcyBQcm9taXNlPFVzZXJDcmVkZW50aWFsSW50ZXJuYWw+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX3JlYXV0aChcbiAgcGFyYW1zOiBJZHBUYXNrUGFyYW1zXG4pOiBQcm9taXNlPFVzZXJDcmVkZW50aWFsSW50ZXJuYWw+IHtcbiAgY29uc3QgeyBhdXRoLCB1c2VyIH0gPSBwYXJhbXM7XG4gIF9hc3NlcnQodXNlciwgYXV0aCwgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUik7XG4gIHJldHVybiBfcmVhdXRoZW50aWNhdGUoXG4gICAgdXNlcixcbiAgICBuZXcgSWRwQ3JlZGVudGlhbChwYXJhbXMpLFxuICAgIHBhcmFtcy5ieXBhc3NBdXRoU3RhdGVcbiAgKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIF9saW5rKFxuICBwYXJhbXM6IElkcFRhc2tQYXJhbXNcbik6IFByb21pc2U8VXNlckNyZWRlbnRpYWxJbnRlcm5hbD4ge1xuICBjb25zdCB7IGF1dGgsIHVzZXIgfSA9IHBhcmFtcztcbiAgX2Fzc2VydCh1c2VyLCBhdXRoLCBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SKTtcbiAgcmV0dXJuIF9saW5rVXNlcih1c2VyLCBuZXcgSWRwQ3JlZGVudGlhbChwYXJhbXMpLCBwYXJhbXMuYnlwYXNzQXV0aFN0YXRlKTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBGaXJlYmFzZUVycm9yIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuXG5pbXBvcnQge1xuICBBdXRoRXZlbnQsXG4gIEF1dGhFdmVudENvbnN1bWVyLFxuICBBdXRoRXZlbnRUeXBlLFxuICBFdmVudE1hbmFnZXIsXG4gIFBvcHVwUmVkaXJlY3RSZXNvbHZlckludGVybmFsXG59IGZyb20gJy4uLy4uL21vZGVsL3BvcHVwX3JlZGlyZWN0JztcbmltcG9ydCB7IFVzZXJJbnRlcm5hbCwgVXNlckNyZWRlbnRpYWxJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL3VzZXInO1xuaW1wb3J0IHsgQXV0aEVycm9yQ29kZSB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBkZWJ1Z0Fzc2VydCwgX2ZhaWwgfSBmcm9tICcuLi91dGlsL2Fzc2VydCc7XG5pbXBvcnQge1xuICBfbGluayxcbiAgX3JlYXV0aCxcbiAgX3NpZ25JbixcbiAgSWRwVGFzayxcbiAgSWRwVGFza1BhcmFtc1xufSBmcm9tICcuLi9zdHJhdGVnaWVzL2lkcCc7XG5pbXBvcnQgeyBBdXRoSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC9hdXRoJztcblxuaW50ZXJmYWNlIFBlbmRpbmdQcm9taXNlIHtcbiAgcmVzb2x2ZTogKGNyZWQ6IFVzZXJDcmVkZW50aWFsSW50ZXJuYWwgfCBudWxsKSA9PiB2b2lkO1xuICByZWplY3Q6IChlcnJvcjogRXJyb3IpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogUG9wdXAgZXZlbnQgbWFuYWdlci4gSGFuZGxlcyB0aGUgcG9wdXAncyBlbnRpcmUgbGlmZWN5Y2xlOyBsaXN0ZW5zIHRvIGF1dGhcbiAqIGV2ZW50c1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQb3B1cFJlZGlyZWN0T3BlcmF0aW9uXG4gIGltcGxlbWVudHMgQXV0aEV2ZW50Q29uc3VtZXJcbntcbiAgcHJpdmF0ZSBwZW5kaW5nUHJvbWlzZTogUGVuZGluZ1Byb21pc2UgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBldmVudE1hbmFnZXI6IEV2ZW50TWFuYWdlciB8IG51bGwgPSBudWxsO1xuICByZWFkb25seSBmaWx0ZXI6IEF1dGhFdmVudFR5cGVbXTtcblxuICBhYnN0cmFjdCBldmVudElkOiBzdHJpbmcgfCBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCByZWFkb25seSBhdXRoOiBBdXRoSW50ZXJuYWwsXG4gICAgZmlsdGVyOiBBdXRoRXZlbnRUeXBlIHwgQXV0aEV2ZW50VHlwZVtdLFxuICAgIHByb3RlY3RlZCByZWFkb25seSByZXNvbHZlcjogUG9wdXBSZWRpcmVjdFJlc29sdmVySW50ZXJuYWwsXG4gICAgcHJvdGVjdGVkIHVzZXI/OiBVc2VySW50ZXJuYWwsXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGJ5cGFzc0F1dGhTdGF0ZSA9IGZhbHNlXG4gICkge1xuICAgIHRoaXMuZmlsdGVyID0gQXJyYXkuaXNBcnJheShmaWx0ZXIpID8gZmlsdGVyIDogW2ZpbHRlcl07XG4gIH1cblxuICBhYnN0cmFjdCBvbkV4ZWN1dGlvbigpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIGV4ZWN1dGUoKTogUHJvbWlzZTxVc2VyQ3JlZGVudGlhbEludGVybmFsIHwgbnVsbD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxVc2VyQ3JlZGVudGlhbEludGVybmFsIHwgbnVsbD4oXG4gICAgICBhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHRoaXMucGVuZGluZ1Byb21pc2UgPSB7IHJlc29sdmUsIHJlamVjdCB9O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5ldmVudE1hbmFnZXIgPSBhd2FpdCB0aGlzLnJlc29sdmVyLl9pbml0aWFsaXplKHRoaXMuYXV0aCk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5vbkV4ZWN1dGlvbigpO1xuICAgICAgICAgIHRoaXMuZXZlbnRNYW5hZ2VyLnJlZ2lzdGVyQ29uc3VtZXIodGhpcyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0aGlzLnJlamVjdChlIGFzIEVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBhc3luYyBvbkF1dGhFdmVudChldmVudDogQXV0aEV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyB1cmxSZXNwb25zZSwgc2Vzc2lvbklkLCBwb3N0Qm9keSwgdGVuYW50SWQsIGVycm9yLCB0eXBlIH0gPSBldmVudDtcbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIHRoaXMucmVqZWN0KGVycm9yKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJhbXM6IElkcFRhc2tQYXJhbXMgPSB7XG4gICAgICBhdXRoOiB0aGlzLmF1dGgsXG4gICAgICByZXF1ZXN0VXJpOiB1cmxSZXNwb25zZSEsXG4gICAgICBzZXNzaW9uSWQ6IHNlc3Npb25JZCEsXG4gICAgICB0ZW5hbnRJZDogdGVuYW50SWQgfHwgdW5kZWZpbmVkLFxuICAgICAgcG9zdEJvZHk6IHBvc3RCb2R5IHx8IHVuZGVmaW5lZCxcbiAgICAgIHVzZXI6IHRoaXMudXNlcixcbiAgICAgIGJ5cGFzc0F1dGhTdGF0ZTogdGhpcy5ieXBhc3NBdXRoU3RhdGVcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMucmVzb2x2ZShhd2FpdCB0aGlzLmdldElkcFRhc2sodHlwZSkocGFyYW1zKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5yZWplY3QoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgb25FcnJvcihlcnJvcjogRmlyZWJhc2VFcnJvcik6IHZvaWQge1xuICAgIHRoaXMucmVqZWN0KGVycm9yKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0SWRwVGFzayh0eXBlOiBBdXRoRXZlbnRUeXBlKTogSWRwVGFzayB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIEF1dGhFdmVudFR5cGUuU0lHTl9JTl9WSUFfUE9QVVA6XG4gICAgICBjYXNlIEF1dGhFdmVudFR5cGUuU0lHTl9JTl9WSUFfUkVESVJFQ1Q6XG4gICAgICAgIHJldHVybiBfc2lnbkluO1xuICAgICAgY2FzZSBBdXRoRXZlbnRUeXBlLkxJTktfVklBX1BPUFVQOlxuICAgICAgY2FzZSBBdXRoRXZlbnRUeXBlLkxJTktfVklBX1JFRElSRUNUOlxuICAgICAgICByZXR1cm4gX2xpbms7XG4gICAgICBjYXNlIEF1dGhFdmVudFR5cGUuUkVBVVRIX1ZJQV9QT1BVUDpcbiAgICAgIGNhc2UgQXV0aEV2ZW50VHlwZS5SRUFVVEhfVklBX1JFRElSRUNUOlxuICAgICAgICByZXR1cm4gX3JlYXV0aDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIF9mYWlsKHRoaXMuYXV0aCwgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUik7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHJlc29sdmUoY3JlZDogVXNlckNyZWRlbnRpYWxJbnRlcm5hbCB8IG51bGwpOiB2b2lkIHtcbiAgICBkZWJ1Z0Fzc2VydCh0aGlzLnBlbmRpbmdQcm9taXNlLCAnUGVuZGluZyBwcm9taXNlIHdhcyBuZXZlciBzZXQnKTtcbiAgICB0aGlzLnBlbmRpbmdQcm9taXNlLnJlc29sdmUoY3JlZCk7XG4gICAgdGhpcy51bnJlZ2lzdGVyQW5kQ2xlYW5VcCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlamVjdChlcnJvcjogRXJyb3IpOiB2b2lkIHtcbiAgICBkZWJ1Z0Fzc2VydCh0aGlzLnBlbmRpbmdQcm9taXNlLCAnUGVuZGluZyBwcm9taXNlIHdhcyBuZXZlciBzZXQnKTtcbiAgICB0aGlzLnBlbmRpbmdQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgdGhpcy51bnJlZ2lzdGVyQW5kQ2xlYW5VcCgpO1xuICB9XG5cbiAgcHJpdmF0ZSB1bnJlZ2lzdGVyQW5kQ2xlYW5VcCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5ldmVudE1hbmFnZXIpIHtcbiAgICAgIHRoaXMuZXZlbnRNYW5hZ2VyLnVucmVnaXN0ZXJDb25zdW1lcih0aGlzKTtcbiAgICB9XG5cbiAgICB0aGlzLnBlbmRpbmdQcm9taXNlID0gbnVsbDtcbiAgICB0aGlzLmNsZWFuVXAoKTtcbiAgfVxuXG4gIGFic3RyYWN0IGNsZWFuVXAoKTogdm9pZDtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQge1xuICBBdXRoLFxuICBBdXRoUHJvdmlkZXIsXG4gIFBvcHVwUmVkaXJlY3RSZXNvbHZlcixcbiAgVXNlcixcbiAgVXNlckNyZWRlbnRpYWxcbn0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcblxuaW1wb3J0IHsgX2Nhc3RBdXRoIH0gZnJvbSAnLi4vLi4vY29yZS9hdXRoL2F1dGhfaW1wbCc7XG5pbXBvcnQgeyBBdXRoRXJyb3JDb2RlIH0gZnJvbSAnLi4vLi4vY29yZS9lcnJvcnMnO1xuaW1wb3J0IHtcbiAgX2Fzc2VydCxcbiAgZGVidWdBc3NlcnQsXG4gIF9jcmVhdGVFcnJvcixcbiAgX2Fzc2VydEluc3RhbmNlT2Zcbn0gZnJvbSAnLi4vLi4vY29yZS91dGlsL2Fzc2VydCc7XG5pbXBvcnQgeyBEZWxheSB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbC9kZWxheSc7XG5pbXBvcnQgeyBfZ2VuZXJhdGVFdmVudElkIH0gZnJvbSAnLi4vLi4vY29yZS91dGlsL2V2ZW50X2lkJztcbmltcG9ydCB7IEF1dGhJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL2F1dGgnO1xuaW1wb3J0IHtcbiAgQXV0aEV2ZW50VHlwZSxcbiAgUG9wdXBSZWRpcmVjdFJlc29sdmVySW50ZXJuYWxcbn0gZnJvbSAnLi4vLi4vbW9kZWwvcG9wdXBfcmVkaXJlY3QnO1xuaW1wb3J0IHsgVXNlckludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvdXNlcic7XG5pbXBvcnQgeyBfd2l0aERlZmF1bHRSZXNvbHZlciB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbC9yZXNvbHZlcic7XG5pbXBvcnQgeyBBdXRoUG9wdXAgfSBmcm9tICcuLi91dGlsL3BvcHVwJztcbmltcG9ydCB7IEFic3RyYWN0UG9wdXBSZWRpcmVjdE9wZXJhdGlvbiB9IGZyb20gJy4uLy4uL2NvcmUvc3RyYXRlZ2llcy9hYnN0cmFjdF9wb3B1cF9yZWRpcmVjdF9vcGVyYXRpb24nO1xuaW1wb3J0IHsgRmVkZXJhdGVkQXV0aFByb3ZpZGVyIH0gZnJvbSAnLi4vLi4vY29yZS9wcm92aWRlcnMvZmVkZXJhdGVkJztcbmltcG9ydCB7IGdldE1vZHVsYXJJbnN0YW5jZSB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcblxuLypcbiAqIFRoZSBldmVudCB0aW1lb3V0IGlzIHRoZSBzYW1lIG9uIG1vYmlsZSBhbmQgZGVza3RvcCwgbm8gbmVlZCBmb3IgRGVsYXkuIFNldCB0aGlzIHRvIDhzIHNpbmNlXG4gKiBibG9ja2luZyBmdW5jdGlvbnMgY2FuIHRha2UgdXB0byA3cyB0byBjb21wbGV0ZSBzaWduIGluLCBhcyBkb2N1bWVudGVkIGluOlxuICogaHR0cHM6Ly9jbG91ZC5nb29nbGUuY29tL2lkZW50aXR5LXBsYXRmb3JtL2RvY3MvYmxvY2tpbmctZnVuY3Rpb25zI3VuZGVyc3RhbmRpbmdfYmxvY2tpbmdfZnVuY3Rpb25zXG4gKiBodHRwczovL2ZpcmViYXNlLmdvb2dsZS5jb20vZG9jcy9hdXRoL2V4dGVuZC13aXRoLWJsb2NraW5nLWZ1bmN0aW9ucyN1bmRlcnN0YW5kaW5nX2Jsb2NraW5nX2Z1bmN0aW9uc1xuICovXG5leHBvcnQgY29uc3QgZW51bSBfVGltZW91dCB7XG4gIEFVVEhfRVZFTlQgPSA4MDAwXG59XG5leHBvcnQgY29uc3QgX1BPTExfV0lORE9XX0NMT1NFX1RJTUVPVVQgPSBuZXcgRGVsYXkoMjAwMCwgMTAwMDApO1xuXG4vKipcbiAqIEF1dGhlbnRpY2F0ZXMgYSBGaXJlYmFzZSBjbGllbnQgdXNpbmcgYSBwb3B1cC1iYXNlZCBPQXV0aCBhdXRoZW50aWNhdGlvbiBmbG93LlxuICpcbiAqIEByZW1hcmtzXG4gKiBJZiBzdWNjZWVkcywgcmV0dXJucyB0aGUgc2lnbmVkIGluIHVzZXIgYWxvbmcgd2l0aCB0aGUgcHJvdmlkZXIncyBjcmVkZW50aWFsLiBJZiBzaWduIGluIHdhc1xuICogdW5zdWNjZXNzZnVsLCByZXR1cm5zIGFuIGVycm9yIG9iamVjdCBjb250YWluaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVycm9yLlxuICpcbiAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHdvcmsgaW4gYSBOb2RlLmpzIGVudmlyb25tZW50LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiAvLyBTaWduIGluIHVzaW5nIGEgcG9wdXAuXG4gKiBjb25zdCBwcm92aWRlciA9IG5ldyBGYWNlYm9va0F1dGhQcm92aWRlcigpO1xuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgc2lnbkluV2l0aFBvcHVwKGF1dGgsIHByb3ZpZGVyKTtcbiAqXG4gKiAvLyBUaGUgc2lnbmVkLWluIHVzZXIgaW5mby5cbiAqIGNvbnN0IHVzZXIgPSByZXN1bHQudXNlcjtcbiAqIC8vIFRoaXMgZ2l2ZXMgeW91IGEgRmFjZWJvb2sgQWNjZXNzIFRva2VuLlxuICogY29uc3QgY3JlZGVudGlhbCA9IHByb3ZpZGVyLmNyZWRlbnRpYWxGcm9tUmVzdWx0KGF1dGgsIHJlc3VsdCk7XG4gKiBjb25zdCB0b2tlbiA9IGNyZWRlbnRpYWwuYWNjZXNzVG9rZW47XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcHJvdmlkZXIgLSBUaGUgcHJvdmlkZXIgdG8gYXV0aGVudGljYXRlLiBUaGUgcHJvdmlkZXIgaGFzIHRvIGJlIGFuIHtAbGluayBPQXV0aFByb3ZpZGVyfS5cbiAqIE5vbi1PQXV0aCBwcm92aWRlcnMgbGlrZSB7QGxpbmsgRW1haWxBdXRoUHJvdmlkZXJ9IHdpbGwgdGhyb3cgYW4gZXJyb3IuXG4gKiBAcGFyYW0gcmVzb2x2ZXIgLSBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgUG9wdXBSZWRpcmVjdFJlc29sdmVyfSwgb3B0aW9uYWxcbiAqIGlmIGFscmVhZHkgc3VwcGxpZWQgdG8ge0BsaW5rIGluaXRpYWxpemVBdXRofSBvciBwcm92aWRlZCBieSB7QGxpbmsgZ2V0QXV0aH0uXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2lnbkluV2l0aFBvcHVwKFxuICBhdXRoOiBBdXRoLFxuICBwcm92aWRlcjogQXV0aFByb3ZpZGVyLFxuICByZXNvbHZlcj86IFBvcHVwUmVkaXJlY3RSZXNvbHZlclxuKTogUHJvbWlzZTxVc2VyQ3JlZGVudGlhbD4ge1xuICBjb25zdCBhdXRoSW50ZXJuYWwgPSBfY2FzdEF1dGgoYXV0aCk7XG4gIF9hc3NlcnRJbnN0YW5jZU9mKGF1dGgsIHByb3ZpZGVyLCBGZWRlcmF0ZWRBdXRoUHJvdmlkZXIpO1xuICBjb25zdCByZXNvbHZlckludGVybmFsID0gX3dpdGhEZWZhdWx0UmVzb2x2ZXIoYXV0aEludGVybmFsLCByZXNvbHZlcik7XG4gIGNvbnN0IGFjdGlvbiA9IG5ldyBQb3B1cE9wZXJhdGlvbihcbiAgICBhdXRoSW50ZXJuYWwsXG4gICAgQXV0aEV2ZW50VHlwZS5TSUdOX0lOX1ZJQV9QT1BVUCxcbiAgICBwcm92aWRlcixcbiAgICByZXNvbHZlckludGVybmFsXG4gICk7XG4gIHJldHVybiBhY3Rpb24uZXhlY3V0ZU5vdE51bGwoKTtcbn1cblxuLyoqXG4gKiBSZWF1dGhlbnRpY2F0ZXMgdGhlIGN1cnJlbnQgdXNlciB3aXRoIHRoZSBzcGVjaWZpZWQge0BsaW5rIE9BdXRoUHJvdmlkZXJ9IHVzaW5nIGEgcG9wLXVwIGJhc2VkXG4gKiBPQXV0aCBmbG93LlxuICpcbiAqIEByZW1hcmtzXG4gKiBJZiB0aGUgcmVhdXRoZW50aWNhdGlvbiBpcyBzdWNjZXNzZnVsLCB0aGUgcmV0dXJuZWQgcmVzdWx0IHdpbGwgY29udGFpbiB0aGUgdXNlciBhbmQgdGhlXG4gKiBwcm92aWRlcidzIGNyZWRlbnRpYWwuXG4gKlxuICogVGhpcyBtZXRob2QgZG9lcyBub3Qgd29yayBpbiBhIE5vZGUuanMgZW52aXJvbm1lbnQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGphdmFzY3JpcHRcbiAqIC8vIFNpZ24gaW4gdXNpbmcgYSBwb3B1cC5cbiAqIGNvbnN0IHByb3ZpZGVyID0gbmV3IEZhY2Vib29rQXV0aFByb3ZpZGVyKCk7XG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBzaWduSW5XaXRoUG9wdXAoYXV0aCwgcHJvdmlkZXIpO1xuICogLy8gUmVhdXRoZW50aWNhdGUgdXNpbmcgYSBwb3B1cC5cbiAqIGF3YWl0IHJlYXV0aGVudGljYXRlV2l0aFBvcHVwKHJlc3VsdC51c2VyLCBwcm92aWRlcik7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdXNlciAtIFRoZSB1c2VyLlxuICogQHBhcmFtIHByb3ZpZGVyIC0gVGhlIHByb3ZpZGVyIHRvIGF1dGhlbnRpY2F0ZS4gVGhlIHByb3ZpZGVyIGhhcyB0byBiZSBhbiB7QGxpbmsgT0F1dGhQcm92aWRlcn0uXG4gKiBOb24tT0F1dGggcHJvdmlkZXJzIGxpa2Uge0BsaW5rIEVtYWlsQXV0aFByb3ZpZGVyfSB3aWxsIHRocm93IGFuIGVycm9yLlxuICogQHBhcmFtIHJlc29sdmVyIC0gQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFBvcHVwUmVkaXJlY3RSZXNvbHZlcn0sIG9wdGlvbmFsXG4gKiBpZiBhbHJlYWR5IHN1cHBsaWVkIHRvIHtAbGluayBpbml0aWFsaXplQXV0aH0gb3IgcHJvdmlkZWQgYnkge0BsaW5rIGdldEF1dGh9LlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYXV0aGVudGljYXRlV2l0aFBvcHVwKFxuICB1c2VyOiBVc2VyLFxuICBwcm92aWRlcjogQXV0aFByb3ZpZGVyLFxuICByZXNvbHZlcj86IFBvcHVwUmVkaXJlY3RSZXNvbHZlclxuKTogUHJvbWlzZTxVc2VyQ3JlZGVudGlhbD4ge1xuICBjb25zdCB1c2VySW50ZXJuYWwgPSBnZXRNb2R1bGFySW5zdGFuY2UodXNlcikgYXMgVXNlckludGVybmFsO1xuICBfYXNzZXJ0SW5zdGFuY2VPZih1c2VySW50ZXJuYWwuYXV0aCwgcHJvdmlkZXIsIEZlZGVyYXRlZEF1dGhQcm92aWRlcik7XG4gIGNvbnN0IHJlc29sdmVySW50ZXJuYWwgPSBfd2l0aERlZmF1bHRSZXNvbHZlcih1c2VySW50ZXJuYWwuYXV0aCwgcmVzb2x2ZXIpO1xuICBjb25zdCBhY3Rpb24gPSBuZXcgUG9wdXBPcGVyYXRpb24oXG4gICAgdXNlckludGVybmFsLmF1dGgsXG4gICAgQXV0aEV2ZW50VHlwZS5SRUFVVEhfVklBX1BPUFVQLFxuICAgIHByb3ZpZGVyLFxuICAgIHJlc29sdmVySW50ZXJuYWwsXG4gICAgdXNlckludGVybmFsXG4gICk7XG4gIHJldHVybiBhY3Rpb24uZXhlY3V0ZU5vdE51bGwoKTtcbn1cblxuLyoqXG4gKiBMaW5rcyB0aGUgYXV0aGVudGljYXRlZCBwcm92aWRlciB0byB0aGUgdXNlciBhY2NvdW50IHVzaW5nIGEgcG9wLXVwIGJhc2VkIE9BdXRoIGZsb3cuXG4gKlxuICogQHJlbWFya3NcbiAqIElmIHRoZSBsaW5raW5nIGlzIHN1Y2Nlc3NmdWwsIHRoZSByZXR1cm5lZCByZXN1bHQgd2lsbCBjb250YWluIHRoZSB1c2VyIGFuZCB0aGUgcHJvdmlkZXIncyBjcmVkZW50aWFsLlxuICpcbiAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHdvcmsgaW4gYSBOb2RlLmpzIGVudmlyb25tZW50LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiAvLyBTaWduIGluIHVzaW5nIHNvbWUgb3RoZXIgcHJvdmlkZXIuXG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBzaWduSW5XaXRoRW1haWxBbmRQYXNzd29yZChhdXRoLCBlbWFpbCwgcGFzc3dvcmQpO1xuICogLy8gTGluayB1c2luZyBhIHBvcHVwLlxuICogY29uc3QgcHJvdmlkZXIgPSBuZXcgRmFjZWJvb2tBdXRoUHJvdmlkZXIoKTtcbiAqIGF3YWl0IGxpbmtXaXRoUG9wdXAocmVzdWx0LnVzZXIsIHByb3ZpZGVyKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB1c2VyIC0gVGhlIHVzZXIuXG4gKiBAcGFyYW0gcHJvdmlkZXIgLSBUaGUgcHJvdmlkZXIgdG8gYXV0aGVudGljYXRlLiBUaGUgcHJvdmlkZXIgaGFzIHRvIGJlIGFuIHtAbGluayBPQXV0aFByb3ZpZGVyfS5cbiAqIE5vbi1PQXV0aCBwcm92aWRlcnMgbGlrZSB7QGxpbmsgRW1haWxBdXRoUHJvdmlkZXJ9IHdpbGwgdGhyb3cgYW4gZXJyb3IuXG4gKiBAcGFyYW0gcmVzb2x2ZXIgLSBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgUG9wdXBSZWRpcmVjdFJlc29sdmVyfSwgb3B0aW9uYWxcbiAqIGlmIGFscmVhZHkgc3VwcGxpZWQgdG8ge0BsaW5rIGluaXRpYWxpemVBdXRofSBvciBwcm92aWRlZCBieSB7QGxpbmsgZ2V0QXV0aH0uXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlua1dpdGhQb3B1cChcbiAgdXNlcjogVXNlcixcbiAgcHJvdmlkZXI6IEF1dGhQcm92aWRlcixcbiAgcmVzb2x2ZXI/OiBQb3B1cFJlZGlyZWN0UmVzb2x2ZXJcbik6IFByb21pc2U8VXNlckNyZWRlbnRpYWw+IHtcbiAgY29uc3QgdXNlckludGVybmFsID0gZ2V0TW9kdWxhckluc3RhbmNlKHVzZXIpIGFzIFVzZXJJbnRlcm5hbDtcbiAgX2Fzc2VydEluc3RhbmNlT2YodXNlckludGVybmFsLmF1dGgsIHByb3ZpZGVyLCBGZWRlcmF0ZWRBdXRoUHJvdmlkZXIpO1xuICBjb25zdCByZXNvbHZlckludGVybmFsID0gX3dpdGhEZWZhdWx0UmVzb2x2ZXIodXNlckludGVybmFsLmF1dGgsIHJlc29sdmVyKTtcblxuICBjb25zdCBhY3Rpb24gPSBuZXcgUG9wdXBPcGVyYXRpb24oXG4gICAgdXNlckludGVybmFsLmF1dGgsXG4gICAgQXV0aEV2ZW50VHlwZS5MSU5LX1ZJQV9QT1BVUCxcbiAgICBwcm92aWRlcixcbiAgICByZXNvbHZlckludGVybmFsLFxuICAgIHVzZXJJbnRlcm5hbFxuICApO1xuICByZXR1cm4gYWN0aW9uLmV4ZWN1dGVOb3ROdWxsKCk7XG59XG5cbi8qKlxuICogUG9wdXAgZXZlbnQgbWFuYWdlci4gSGFuZGxlcyB0aGUgcG9wdXAncyBlbnRpcmUgbGlmZWN5Y2xlOyBsaXN0ZW5zIHRvIGF1dGhcbiAqIGV2ZW50c1xuICpcbiAqL1xuY2xhc3MgUG9wdXBPcGVyYXRpb24gZXh0ZW5kcyBBYnN0cmFjdFBvcHVwUmVkaXJlY3RPcGVyYXRpb24ge1xuICAvLyBPbmx5IG9uZSBwb3B1cCBpcyBldmVyIHNob3duIGF0IG9uY2UuIFRoZSBsaWZlY3ljbGUgb2YgdGhlIGN1cnJlbnQgcG9wdXBcbiAgLy8gY2FuIGJlIG1hbmFnZWQgLyBjYW5jZWxsZWQgYnkgdGhlIGNvbnN0cnVjdG9yLlxuICBwcml2YXRlIHN0YXRpYyBjdXJyZW50UG9wdXBBY3Rpb246IFBvcHVwT3BlcmF0aW9uIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgYXV0aFdpbmRvdzogQXV0aFBvcHVwIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcG9sbElkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBhdXRoOiBBdXRoSW50ZXJuYWwsXG4gICAgZmlsdGVyOiBBdXRoRXZlbnRUeXBlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJvdmlkZXI6IEF1dGhQcm92aWRlcixcbiAgICByZXNvbHZlcjogUG9wdXBSZWRpcmVjdFJlc29sdmVySW50ZXJuYWwsXG4gICAgdXNlcj86IFVzZXJJbnRlcm5hbFxuICApIHtcbiAgICBzdXBlcihhdXRoLCBmaWx0ZXIsIHJlc29sdmVyLCB1c2VyKTtcbiAgICBpZiAoUG9wdXBPcGVyYXRpb24uY3VycmVudFBvcHVwQWN0aW9uKSB7XG4gICAgICBQb3B1cE9wZXJhdGlvbi5jdXJyZW50UG9wdXBBY3Rpb24uY2FuY2VsKCk7XG4gICAgfVxuXG4gICAgUG9wdXBPcGVyYXRpb24uY3VycmVudFBvcHVwQWN0aW9uID0gdGhpcztcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGVOb3ROdWxsKCk6IFByb21pc2U8VXNlckNyZWRlbnRpYWw+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGUoKTtcbiAgICBfYXNzZXJ0KHJlc3VsdCwgdGhpcy5hdXRoLCBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgYXN5bmMgb25FeGVjdXRpb24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZGVidWdBc3NlcnQoXG4gICAgICB0aGlzLmZpbHRlci5sZW5ndGggPT09IDEsXG4gICAgICAnUG9wdXAgb3BlcmF0aW9ucyBvbmx5IGhhbmRsZSBvbmUgZXZlbnQnXG4gICAgKTtcbiAgICBjb25zdCBldmVudElkID0gX2dlbmVyYXRlRXZlbnRJZCgpO1xuICAgIHRoaXMuYXV0aFdpbmRvdyA9IGF3YWl0IHRoaXMucmVzb2x2ZXIuX29wZW5Qb3B1cChcbiAgICAgIHRoaXMuYXV0aCxcbiAgICAgIHRoaXMucHJvdmlkZXIsXG4gICAgICB0aGlzLmZpbHRlclswXSwgLy8gVGhlcmUncyBhbHdheXMgb25lLCBzZWUgY29uc3RydWN0b3JcbiAgICAgIGV2ZW50SWRcbiAgICApO1xuICAgIHRoaXMuYXV0aFdpbmRvdy5hc3NvY2lhdGVkRXZlbnQgPSBldmVudElkO1xuXG4gICAgLy8gQ2hlY2sgZm9yIHdlYiBzdG9yYWdlIHN1cHBvcnQgYW5kIG9yaWdpbiB2YWxpZGF0aW9uIF9hZnRlcl8gdGhlIHBvcHVwIGlzXG4gICAgLy8gbG9hZGVkLiBUaGVzZSBvcGVyYXRpb25zIGFyZSBzbG93ICh+MSBzZWNvbmQgb3Igc28pIFJhdGhlciB0aGFuXG4gICAgLy8gd2FpdGluZyBvbiB0aGVtIGJlZm9yZSBvcGVuaW5nIHRoZSB3aW5kb3csIG9wdGltaXN0aWNhbGx5IG9wZW4gdGhlIHBvcHVwXG4gICAgLy8gYW5kIGNoZWNrIGZvciBzdG9yYWdlIHN1cHBvcnQgYXQgdGhlIHNhbWUgdGltZS4gSWYgc3RvcmFnZSBzdXBwb3J0IGlzXG4gICAgLy8gbm90IGF2YWlsYWJsZSwgdGhpcyB3aWxsIGNhdXNlIHRoZSB3aG9sZSB0aGluZyB0byByZWplY3QgcHJvcGVybHkuIEl0XG4gICAgLy8gd2lsbCBhbHNvIGNsb3NlIHRoZSBwb3B1cCwgYnV0IHNpbmNlIHRoZSBwcm9taXNlIGhhcyBhbHJlYWR5IHJlamVjdGVkLFxuICAgIC8vIHRoZSBwb3B1cCBjbG9zZWQgYnkgdXNlciBwb2xsIHdpbGwgcmVqZWN0IGludG8gdGhlIHZvaWQuXG4gICAgdGhpcy5yZXNvbHZlci5fb3JpZ2luVmFsaWRhdGlvbih0aGlzLmF1dGgpLmNhdGNoKGUgPT4ge1xuICAgICAgdGhpcy5yZWplY3QoZSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlc29sdmVyLl9pc0lmcmFtZVdlYlN0b3JhZ2VTdXBwb3J0ZWQodGhpcy5hdXRoLCBpc1N1cHBvcnRlZCA9PiB7XG4gICAgICBpZiAoIWlzU3VwcG9ydGVkKSB7XG4gICAgICAgIHRoaXMucmVqZWN0KFxuICAgICAgICAgIF9jcmVhdGVFcnJvcih0aGlzLmF1dGgsIEF1dGhFcnJvckNvZGUuV0VCX1NUT1JBR0VfVU5TVVBQT1JURUQpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBIYW5kbGUgdXNlciBjbG9zdXJlLiBOb3RpY2UgdGhpcyBkb2VzICpub3QqIHVzZSBhd2FpdFxuICAgIHRoaXMucG9sbFVzZXJDYW5jZWxsYXRpb24oKTtcbiAgfVxuXG4gIGdldCBldmVudElkKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmF1dGhXaW5kb3c/LmFzc29jaWF0ZWRFdmVudCB8fCBudWxsO1xuICB9XG5cbiAgY2FuY2VsKCk6IHZvaWQge1xuICAgIHRoaXMucmVqZWN0KF9jcmVhdGVFcnJvcih0aGlzLmF1dGgsIEF1dGhFcnJvckNvZGUuRVhQSVJFRF9QT1BVUF9SRVFVRVNUKSk7XG4gIH1cblxuICBjbGVhblVwKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmF1dGhXaW5kb3cpIHtcbiAgICAgIHRoaXMuYXV0aFdpbmRvdy5jbG9zZSgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBvbGxJZCkge1xuICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnBvbGxJZCk7XG4gICAgfVxuXG4gICAgdGhpcy5hdXRoV2luZG93ID0gbnVsbDtcbiAgICB0aGlzLnBvbGxJZCA9IG51bGw7XG4gICAgUG9wdXBPcGVyYXRpb24uY3VycmVudFBvcHVwQWN0aW9uID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgcG9sbFVzZXJDYW5jZWxsYXRpb24oKTogdm9pZCB7XG4gICAgY29uc3QgcG9sbCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmICh0aGlzLmF1dGhXaW5kb3c/LndpbmRvdz8uY2xvc2VkKSB7XG4gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZXJlIGlzIHN1ZmZpY2llbnQgdGltZSBmb3Igd2hhdGV2ZXIgYWN0aW9uIHRvXG4gICAgICAgIC8vIGNvbXBsZXRlLiBUaGUgd2luZG93IGNvdWxkIGhhdmUgY2xvc2VkIGJ1dCB0aGUgc2lnbiBpbiBuZXR3b3JrXG4gICAgICAgIC8vIGNhbGwgY291bGQgc3RpbGwgYmUgaW4gZmxpZ2h0LiBUaGlzIGlzIHNwZWNpZmljYWxseSB0cnVlIGZvclxuICAgICAgICAvLyBGaXJlZm94IG9yIGlmIHRoZSBvcGVuZXIgaXMgaW4gYW4gaWZyYW1lLCBpbiB3aGljaCBjYXNlIHRoZSBvYXV0aFxuICAgICAgICAvLyBoZWxwZXIgY2xvc2VzIHRoZSBwb3B1cC5cbiAgICAgICAgdGhpcy5wb2xsSWQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5wb2xsSWQgPSBudWxsO1xuICAgICAgICAgIHRoaXMucmVqZWN0KFxuICAgICAgICAgICAgX2NyZWF0ZUVycm9yKHRoaXMuYXV0aCwgQXV0aEVycm9yQ29kZS5QT1BVUF9DTE9TRURfQllfVVNFUilcbiAgICAgICAgICApO1xuICAgICAgICB9LCBfVGltZW91dC5BVVRIX0VWRU5UKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnBvbGxJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KHBvbGwsIF9QT0xMX1dJTkRPV19DTE9TRV9USU1FT1VULmdldCgpKTtcbiAgICB9O1xuXG4gICAgcG9sbCgpO1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgQXV0aEludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvYXV0aCc7XG5pbXBvcnQge1xuICBBdXRoRXZlbnQsXG4gIEF1dGhFdmVudFR5cGUsXG4gIFBvcHVwUmVkaXJlY3RSZXNvbHZlckludGVybmFsXG59IGZyb20gJy4uLy4uL21vZGVsL3BvcHVwX3JlZGlyZWN0JztcbmltcG9ydCB7IFVzZXJDcmVkZW50aWFsSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC91c2VyJztcbmltcG9ydCB7IFBlcnNpc3RlbmNlSW50ZXJuYWwgfSBmcm9tICcuLi9wZXJzaXN0ZW5jZSc7XG5pbXBvcnQgeyBfcGVyc2lzdGVuY2VLZXlOYW1lIH0gZnJvbSAnLi4vcGVyc2lzdGVuY2UvcGVyc2lzdGVuY2VfdXNlcl9tYW5hZ2VyJztcbmltcG9ydCB7IF9nZXRJbnN0YW5jZSB9IGZyb20gJy4uL3V0aWwvaW5zdGFudGlhdG9yJztcbmltcG9ydCB7IEFic3RyYWN0UG9wdXBSZWRpcmVjdE9wZXJhdGlvbiB9IGZyb20gJy4vYWJzdHJhY3RfcG9wdXBfcmVkaXJlY3Rfb3BlcmF0aW9uJztcblxuY29uc3QgUEVORElOR19SRURJUkVDVF9LRVkgPSAncGVuZGluZ1JlZGlyZWN0JztcblxuLy8gV2Ugb25seSBnZXQgb25lIHJlZGlyZWN0IG91dGNvbWUgZm9yIGFueSBvbmUgYXV0aCwgc28ganVzdCBzdG9yZSBpdFxuLy8gaW4gaGVyZS5cbmNvbnN0IHJlZGlyZWN0T3V0Y29tZU1hcDogTWFwPFxuICBzdHJpbmcsXG4gICgpID0+IFByb21pc2U8VXNlckNyZWRlbnRpYWxJbnRlcm5hbCB8IG51bGw+XG4+ID0gbmV3IE1hcCgpO1xuXG5leHBvcnQgY2xhc3MgUmVkaXJlY3RBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFBvcHVwUmVkaXJlY3RPcGVyYXRpb24ge1xuICBldmVudElkID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBhdXRoOiBBdXRoSW50ZXJuYWwsXG4gICAgcmVzb2x2ZXI6IFBvcHVwUmVkaXJlY3RSZXNvbHZlckludGVybmFsLFxuICAgIGJ5cGFzc0F1dGhTdGF0ZSA9IGZhbHNlXG4gICkge1xuICAgIHN1cGVyKFxuICAgICAgYXV0aCxcbiAgICAgIFtcbiAgICAgICAgQXV0aEV2ZW50VHlwZS5TSUdOX0lOX1ZJQV9SRURJUkVDVCxcbiAgICAgICAgQXV0aEV2ZW50VHlwZS5MSU5LX1ZJQV9SRURJUkVDVCxcbiAgICAgICAgQXV0aEV2ZW50VHlwZS5SRUFVVEhfVklBX1JFRElSRUNULFxuICAgICAgICBBdXRoRXZlbnRUeXBlLlVOS05PV05cbiAgICAgIF0sXG4gICAgICByZXNvbHZlcixcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGJ5cGFzc0F1dGhTdGF0ZVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgdGhlIGV4ZWN1dGUgZnVuY3Rpb247IGlmIHdlIGFscmVhZHkgaGF2ZSBhIHJlZGlyZWN0IHJlc3VsdCwgdGhlblxuICAgKiBqdXN0IHJldHVybiBpdC5cbiAgICovXG4gIGFzeW5jIGV4ZWN1dGUoKTogUHJvbWlzZTxVc2VyQ3JlZGVudGlhbEludGVybmFsIHwgbnVsbD4ge1xuICAgIGxldCByZWFkeU91dGNvbWUgPSByZWRpcmVjdE91dGNvbWVNYXAuZ2V0KHRoaXMuYXV0aC5fa2V5KCkpO1xuICAgIGlmICghcmVhZHlPdXRjb21lKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBoYXNQZW5kaW5nUmVkaXJlY3QgPSBhd2FpdCBfZ2V0QW5kQ2xlYXJQZW5kaW5nUmVkaXJlY3RTdGF0dXMoXG4gICAgICAgICAgdGhpcy5yZXNvbHZlcixcbiAgICAgICAgICB0aGlzLmF1dGhcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gaGFzUGVuZGluZ1JlZGlyZWN0ID8gYXdhaXQgc3VwZXIuZXhlY3V0ZSgpIDogbnVsbDtcbiAgICAgICAgcmVhZHlPdXRjb21lID0gKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlYWR5T3V0Y29tZSA9ICgpID0+IFByb21pc2UucmVqZWN0KGUpO1xuICAgICAgfVxuXG4gICAgICByZWRpcmVjdE91dGNvbWVNYXAuc2V0KHRoaXMuYXV0aC5fa2V5KCksIHJlYWR5T3V0Y29tZSk7XG4gICAgfVxuXG4gICAgLy8gSWYgd2UncmUgbm90IGJ5cGFzc2luZyBhdXRoIHN0YXRlLCB0aGUgcmVhZHkgb3V0Y29tZSBzaG91bGQgYmUgc2V0IHRvXG4gICAgLy8gbnVsbC5cbiAgICBpZiAoIXRoaXMuYnlwYXNzQXV0aFN0YXRlKSB7XG4gICAgICByZWRpcmVjdE91dGNvbWVNYXAuc2V0KHRoaXMuYXV0aC5fa2V5KCksICgpID0+IFByb21pc2UucmVzb2x2ZShudWxsKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlYWR5T3V0Y29tZSgpO1xuICB9XG5cbiAgYXN5bmMgb25BdXRoRXZlbnQoZXZlbnQ6IEF1dGhFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChldmVudC50eXBlID09PSBBdXRoRXZlbnRUeXBlLlNJR05fSU5fVklBX1JFRElSRUNUKSB7XG4gICAgICByZXR1cm4gc3VwZXIub25BdXRoRXZlbnQoZXZlbnQpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQudHlwZSA9PT0gQXV0aEV2ZW50VHlwZS5VTktOT1dOKSB7XG4gICAgICAvLyBUaGlzIGlzIGEgc2VudGluZWwgdmFsdWUgaW5kaWNhdGluZyB0aGVyZSdzIG5vIHBlbmRpbmcgcmVkaXJlY3RcbiAgICAgIHRoaXMucmVzb2x2ZShudWxsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQuZXZlbnRJZCkge1xuICAgICAgY29uc3QgdXNlciA9IGF3YWl0IHRoaXMuYXV0aC5fcmVkaXJlY3RVc2VyRm9ySWQoZXZlbnQuZXZlbnRJZCk7XG4gICAgICBpZiAodXNlcikge1xuICAgICAgICB0aGlzLnVzZXIgPSB1c2VyO1xuICAgICAgICByZXR1cm4gc3VwZXIub25BdXRoRXZlbnQoZXZlbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZXNvbHZlKG51bGwpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG9uRXhlY3V0aW9uKCk6IFByb21pc2U8dm9pZD4ge31cblxuICBjbGVhblVwKCk6IHZvaWQge31cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIF9nZXRBbmRDbGVhclBlbmRpbmdSZWRpcmVjdFN0YXR1cyhcbiAgcmVzb2x2ZXI6IFBvcHVwUmVkaXJlY3RSZXNvbHZlckludGVybmFsLFxuICBhdXRoOiBBdXRoSW50ZXJuYWxcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBrZXkgPSBwZW5kaW5nUmVkaXJlY3RLZXkoYXV0aCk7XG4gIGNvbnN0IHBlcnNpc3RlbmNlID0gcmVzb2x2ZXJQZXJzaXN0ZW5jZShyZXNvbHZlcik7XG4gIGlmICghKGF3YWl0IHBlcnNpc3RlbmNlLl9pc0F2YWlsYWJsZSgpKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBoYXNQZW5kaW5nUmVkaXJlY3QgPSAoYXdhaXQgcGVyc2lzdGVuY2UuX2dldChrZXkpKSA9PT0gJ3RydWUnO1xuICBhd2FpdCBwZXJzaXN0ZW5jZS5fcmVtb3ZlKGtleSk7XG4gIHJldHVybiBoYXNQZW5kaW5nUmVkaXJlY3Q7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBfc2V0UGVuZGluZ1JlZGlyZWN0U3RhdHVzKFxuICByZXNvbHZlcjogUG9wdXBSZWRpcmVjdFJlc29sdmVySW50ZXJuYWwsXG4gIGF1dGg6IEF1dGhJbnRlcm5hbFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiByZXNvbHZlclBlcnNpc3RlbmNlKHJlc29sdmVyKS5fc2V0KHBlbmRpbmdSZWRpcmVjdEtleShhdXRoKSwgJ3RydWUnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9jbGVhclJlZGlyZWN0T3V0Y29tZXMoKTogdm9pZCB7XG4gIHJlZGlyZWN0T3V0Y29tZU1hcC5jbGVhcigpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX292ZXJyaWRlUmVkaXJlY3RSZXN1bHQoXG4gIGF1dGg6IEF1dGhJbnRlcm5hbCxcbiAgcmVzdWx0OiAoKSA9PiBQcm9taXNlPFVzZXJDcmVkZW50aWFsSW50ZXJuYWwgfCBudWxsPlxuKTogdm9pZCB7XG4gIHJlZGlyZWN0T3V0Y29tZU1hcC5zZXQoYXV0aC5fa2V5KCksIHJlc3VsdCk7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVyUGVyc2lzdGVuY2UoXG4gIHJlc29sdmVyOiBQb3B1cFJlZGlyZWN0UmVzb2x2ZXJJbnRlcm5hbFxuKTogUGVyc2lzdGVuY2VJbnRlcm5hbCB7XG4gIHJldHVybiBfZ2V0SW5zdGFuY2UocmVzb2x2ZXIuX3JlZGlyZWN0UGVyc2lzdGVuY2UpO1xufVxuXG5mdW5jdGlvbiBwZW5kaW5nUmVkaXJlY3RLZXkoYXV0aDogQXV0aEludGVybmFsKTogc3RyaW5nIHtcbiAgcmV0dXJuIF9wZXJzaXN0ZW5jZUtleU5hbWUoXG4gICAgUEVORElOR19SRURJUkVDVF9LRVksXG4gICAgYXV0aC5jb25maWcuYXBpS2V5LFxuICAgIGF1dGgubmFtZVxuICApO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7XG4gIEF1dGgsXG4gIEF1dGhQcm92aWRlcixcbiAgUG9wdXBSZWRpcmVjdFJlc29sdmVyLFxuICBVc2VyLFxuICBVc2VyQ3JlZGVudGlhbFxufSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuXG5pbXBvcnQgeyBfY2FzdEF1dGggfSBmcm9tICcuLi8uLi9jb3JlL2F1dGgvYXV0aF9pbXBsJztcbmltcG9ydCB7IF9hc3NlcnRMaW5rZWRTdGF0dXMgfSBmcm9tICcuLi8uLi9jb3JlL3VzZXIvbGlua191bmxpbmsnO1xuaW1wb3J0IHsgX2Fzc2VydEluc3RhbmNlT2YgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWwvYXNzZXJ0JztcbmltcG9ydCB7IF9nZW5lcmF0ZUV2ZW50SWQgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWwvZXZlbnRfaWQnO1xuaW1wb3J0IHsgQXV0aEV2ZW50VHlwZSB9IGZyb20gJy4uLy4uL21vZGVsL3BvcHVwX3JlZGlyZWN0JztcbmltcG9ydCB7IFVzZXJJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL3VzZXInO1xuaW1wb3J0IHsgX3dpdGhEZWZhdWx0UmVzb2x2ZXIgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWwvcmVzb2x2ZXInO1xuaW1wb3J0IHtcbiAgUmVkaXJlY3RBY3Rpb24sXG4gIF9zZXRQZW5kaW5nUmVkaXJlY3RTdGF0dXNcbn0gZnJvbSAnLi4vLi4vY29yZS9zdHJhdGVnaWVzL3JlZGlyZWN0JztcbmltcG9ydCB7IEZlZGVyYXRlZEF1dGhQcm92aWRlciB9IGZyb20gJy4uLy4uL2NvcmUvcHJvdmlkZXJzL2ZlZGVyYXRlZCc7XG5pbXBvcnQgeyBnZXRNb2R1bGFySW5zdGFuY2UgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5cbi8qKlxuICogQXV0aGVudGljYXRlcyBhIEZpcmViYXNlIGNsaWVudCB1c2luZyBhIGZ1bGwtcGFnZSByZWRpcmVjdCBmbG93LlxuICpcbiAqIEByZW1hcmtzXG4gKiBUbyBoYW5kbGUgdGhlIHJlc3VsdHMgYW5kIGVycm9ycyBmb3IgdGhpcyBvcGVyYXRpb24sIHJlZmVyIHRvIHtAbGluayBnZXRSZWRpcmVjdFJlc3VsdH0uXG4gKiBGb2xsb3cgdGhlIHtAbGluayBodHRwczovL2ZpcmViYXNlLmdvb2dsZS5jb20vZG9jcy9hdXRoL3dlYi9yZWRpcmVjdC1iZXN0LXByYWN0aWNlc1xuICogfCBiZXN0IHByYWN0aWNlc30gd2hlbiB1c2luZyB7QGxpbmsgc2lnbkluV2l0aFJlZGlyZWN0fS5cbiAqXG4gKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCB3b3JrIGluIGEgTm9kZS5qcyBlbnZpcm9ubWVudC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgamF2YXNjcmlwdFxuICogLy8gU2lnbiBpbiB1c2luZyBhIHJlZGlyZWN0LlxuICogY29uc3QgcHJvdmlkZXIgPSBuZXcgRmFjZWJvb2tBdXRoUHJvdmlkZXIoKTtcbiAqIC8vIFlvdSBjYW4gYWRkIGFkZGl0aW9uYWwgc2NvcGVzIHRvIHRoZSBwcm92aWRlcjpcbiAqIHByb3ZpZGVyLmFkZFNjb3BlKCd1c2VyX2JpcnRoZGF5Jyk7XG4gKiAvLyBTdGFydCBhIHNpZ24gaW4gcHJvY2VzcyBmb3IgYW4gdW5hdXRoZW50aWNhdGVkIHVzZXIuXG4gKiBhd2FpdCBzaWduSW5XaXRoUmVkaXJlY3QoYXV0aCwgcHJvdmlkZXIpO1xuICogLy8gVGhpcyB3aWxsIHRyaWdnZXIgYSBmdWxsIHBhZ2UgcmVkaXJlY3QgYXdheSBmcm9tIHlvdXIgYXBwXG4gKlxuICogLy8gQWZ0ZXIgcmV0dXJuaW5nIGZyb20gdGhlIHJlZGlyZWN0IHdoZW4geW91ciBhcHAgaW5pdGlhbGl6ZXMgeW91IGNhbiBvYnRhaW4gdGhlIHJlc3VsdFxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0UmVkaXJlY3RSZXN1bHQoYXV0aCk7XG4gKiBpZiAocmVzdWx0KSB7XG4gKiAgIC8vIFRoaXMgaXMgdGhlIHNpZ25lZC1pbiB1c2VyXG4gKiAgIGNvbnN0IHVzZXIgPSByZXN1bHQudXNlcjtcbiAqICAgLy8gVGhpcyBnaXZlcyB5b3UgYSBGYWNlYm9vayBBY2Nlc3MgVG9rZW4uXG4gKiAgIGNvbnN0IGNyZWRlbnRpYWwgPSBwcm92aWRlci5jcmVkZW50aWFsRnJvbVJlc3VsdChhdXRoLCByZXN1bHQpO1xuICogICBjb25zdCB0b2tlbiA9IGNyZWRlbnRpYWwuYWNjZXNzVG9rZW47XG4gKiB9XG4gKiAvLyBBcyB0aGlzIEFQSSBjYW4gYmUgdXNlZCBmb3Igc2lnbi1pbiwgbGlua2luZyBhbmQgcmVhdXRoZW50aWNhdGlvbixcbiAqIC8vIGNoZWNrIHRoZSBvcGVyYXRpb25UeXBlIHRvIGRldGVybWluZSB3aGF0IHRyaWdnZXJlZCB0aGlzIHJlZGlyZWN0XG4gKiAvLyBvcGVyYXRpb24uXG4gKiBjb25zdCBvcGVyYXRpb25UeXBlID0gcmVzdWx0Lm9wZXJhdGlvblR5cGU7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcHJvdmlkZXIgLSBUaGUgcHJvdmlkZXIgdG8gYXV0aGVudGljYXRlLiBUaGUgcHJvdmlkZXIgaGFzIHRvIGJlIGFuIHtAbGluayBPQXV0aFByb3ZpZGVyfS5cbiAqIE5vbi1PQXV0aCBwcm92aWRlcnMgbGlrZSB7QGxpbmsgRW1haWxBdXRoUHJvdmlkZXJ9IHdpbGwgdGhyb3cgYW4gZXJyb3IuXG4gKiBAcGFyYW0gcmVzb2x2ZXIgLSBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgUG9wdXBSZWRpcmVjdFJlc29sdmVyfSwgb3B0aW9uYWxcbiAqIGlmIGFscmVhZHkgc3VwcGxpZWQgdG8ge0BsaW5rIGluaXRpYWxpemVBdXRofSBvciBwcm92aWRlZCBieSB7QGxpbmsgZ2V0QXV0aH0uXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2lnbkluV2l0aFJlZGlyZWN0KFxuICBhdXRoOiBBdXRoLFxuICBwcm92aWRlcjogQXV0aFByb3ZpZGVyLFxuICByZXNvbHZlcj86IFBvcHVwUmVkaXJlY3RSZXNvbHZlclxuKTogUHJvbWlzZTxuZXZlcj4ge1xuICByZXR1cm4gX3NpZ25JbldpdGhSZWRpcmVjdChhdXRoLCBwcm92aWRlciwgcmVzb2x2ZXIpIGFzIFByb21pc2U8bmV2ZXI+O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gX3NpZ25JbldpdGhSZWRpcmVjdChcbiAgYXV0aDogQXV0aCxcbiAgcHJvdmlkZXI6IEF1dGhQcm92aWRlcixcbiAgcmVzb2x2ZXI/OiBQb3B1cFJlZGlyZWN0UmVzb2x2ZXJcbik6IFByb21pc2U8dm9pZCB8IG5ldmVyPiB7XG4gIGNvbnN0IGF1dGhJbnRlcm5hbCA9IF9jYXN0QXV0aChhdXRoKTtcbiAgX2Fzc2VydEluc3RhbmNlT2YoYXV0aCwgcHJvdmlkZXIsIEZlZGVyYXRlZEF1dGhQcm92aWRlcik7XG4gIC8vIFdhaXQgZm9yIGF1dGggaW5pdGlhbGl6YXRpb24gdG8gY29tcGxldGUsIHRoaXMgd2lsbCBwcm9jZXNzIHBlbmRpbmcgcmVkaXJlY3RzIGFuZCBjbGVhciB0aGVcbiAgLy8gUEVORElOR19SRURJUkVDVF9LRVkgaW4gcGVyc2lzdGVuY2UuIFRoaXMgc2hvdWxkIGJlIGNvbXBsZXRlZCBiZWZvcmUgc3RhcnRpbmcgYSBuZXdcbiAgLy8gcmVkaXJlY3QgYW5kIGNyZWF0aW5nIGEgUEVORElOR19SRURJUkVDVF9LRVkgZW50cnkuXG4gIGF3YWl0IGF1dGhJbnRlcm5hbC5faW5pdGlhbGl6YXRpb25Qcm9taXNlO1xuICBjb25zdCByZXNvbHZlckludGVybmFsID0gX3dpdGhEZWZhdWx0UmVzb2x2ZXIoYXV0aEludGVybmFsLCByZXNvbHZlcik7XG4gIGF3YWl0IF9zZXRQZW5kaW5nUmVkaXJlY3RTdGF0dXMocmVzb2x2ZXJJbnRlcm5hbCwgYXV0aEludGVybmFsKTtcblxuICByZXR1cm4gcmVzb2x2ZXJJbnRlcm5hbC5fb3BlblJlZGlyZWN0KFxuICAgIGF1dGhJbnRlcm5hbCxcbiAgICBwcm92aWRlcixcbiAgICBBdXRoRXZlbnRUeXBlLlNJR05fSU5fVklBX1JFRElSRUNUXG4gICk7XG59XG5cbi8qKlxuICogUmVhdXRoZW50aWNhdGVzIHRoZSBjdXJyZW50IHVzZXIgd2l0aCB0aGUgc3BlY2lmaWVkIHtAbGluayBPQXV0aFByb3ZpZGVyfSB1c2luZyBhIGZ1bGwtcGFnZSByZWRpcmVjdCBmbG93LlxuICogQHJlbWFya3NcbiAqIFRvIGhhbmRsZSB0aGUgcmVzdWx0cyBhbmQgZXJyb3JzIGZvciB0aGlzIG9wZXJhdGlvbiwgcmVmZXIgdG8ge0BsaW5rIGdldFJlZGlyZWN0UmVzdWx0fS5cbiAqIEZvbGxvdyB0aGUge0BsaW5rIGh0dHBzOi8vZmlyZWJhc2UuZ29vZ2xlLmNvbS9kb2NzL2F1dGgvd2ViL3JlZGlyZWN0LWJlc3QtcHJhY3RpY2VzXG4gKiB8IGJlc3QgcHJhY3RpY2VzfSB3aGVuIHVzaW5nIHtAbGluayByZWF1dGhlbnRpY2F0ZVdpdGhSZWRpcmVjdH0uXG4gKlxuICogVGhpcyBtZXRob2QgZG9lcyBub3Qgd29yayBpbiBhIE5vZGUuanMgZW52aXJvbm1lbnQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGphdmFzY3JpcHRcbiAqIC8vIFNpZ24gaW4gdXNpbmcgYSByZWRpcmVjdC5cbiAqIGNvbnN0IHByb3ZpZGVyID0gbmV3IEZhY2Vib29rQXV0aFByb3ZpZGVyKCk7XG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBzaWduSW5XaXRoUmVkaXJlY3QoYXV0aCwgcHJvdmlkZXIpO1xuICogLy8gVGhpcyB3aWxsIHRyaWdnZXIgYSBmdWxsIHBhZ2UgcmVkaXJlY3QgYXdheSBmcm9tIHlvdXIgYXBwXG4gKlxuICogLy8gQWZ0ZXIgcmV0dXJuaW5nIGZyb20gdGhlIHJlZGlyZWN0IHdoZW4geW91ciBhcHAgaW5pdGlhbGl6ZXMgeW91IGNhbiBvYnRhaW4gdGhlIHJlc3VsdFxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0UmVkaXJlY3RSZXN1bHQoYXV0aCk7XG4gKiAvLyBSZWF1dGhlbnRpY2F0ZSB1c2luZyBhIHJlZGlyZWN0LlxuICogYXdhaXQgcmVhdXRoZW50aWNhdGVXaXRoUmVkaXJlY3QocmVzdWx0LnVzZXIsIHByb3ZpZGVyKTtcbiAqIC8vIFRoaXMgd2lsbCBhZ2FpbiB0cmlnZ2VyIGEgZnVsbCBwYWdlIHJlZGlyZWN0IGF3YXkgZnJvbSB5b3VyIGFwcFxuICpcbiAqIC8vIEFmdGVyIHJldHVybmluZyBmcm9tIHRoZSByZWRpcmVjdCB3aGVuIHlvdXIgYXBwIGluaXRpYWxpemVzIHlvdSBjYW4gb2J0YWluIHRoZSByZXN1bHRcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldFJlZGlyZWN0UmVzdWx0KGF1dGgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHVzZXIgLSBUaGUgdXNlci5cbiAqIEBwYXJhbSBwcm92aWRlciAtIFRoZSBwcm92aWRlciB0byBhdXRoZW50aWNhdGUuIFRoZSBwcm92aWRlciBoYXMgdG8gYmUgYW4ge0BsaW5rIE9BdXRoUHJvdmlkZXJ9LlxuICogTm9uLU9BdXRoIHByb3ZpZGVycyBsaWtlIHtAbGluayBFbWFpbEF1dGhQcm92aWRlcn0gd2lsbCB0aHJvdyBhbiBlcnJvci5cbiAqIEBwYXJhbSByZXNvbHZlciAtIEFuIGluc3RhbmNlIG9mIHtAbGluayBQb3B1cFJlZGlyZWN0UmVzb2x2ZXJ9LCBvcHRpb25hbFxuICogaWYgYWxyZWFkeSBzdXBwbGllZCB0byB7QGxpbmsgaW5pdGlhbGl6ZUF1dGh9IG9yIHByb3ZpZGVkIGJ5IHtAbGluayBnZXRBdXRofS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWF1dGhlbnRpY2F0ZVdpdGhSZWRpcmVjdChcbiAgdXNlcjogVXNlcixcbiAgcHJvdmlkZXI6IEF1dGhQcm92aWRlcixcbiAgcmVzb2x2ZXI/OiBQb3B1cFJlZGlyZWN0UmVzb2x2ZXJcbik6IFByb21pc2U8bmV2ZXI+IHtcbiAgcmV0dXJuIF9yZWF1dGhlbnRpY2F0ZVdpdGhSZWRpcmVjdChcbiAgICB1c2VyLFxuICAgIHByb3ZpZGVyLFxuICAgIHJlc29sdmVyXG4gICkgYXMgUHJvbWlzZTxuZXZlcj47XG59XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gX3JlYXV0aGVudGljYXRlV2l0aFJlZGlyZWN0KFxuICB1c2VyOiBVc2VyLFxuICBwcm92aWRlcjogQXV0aFByb3ZpZGVyLFxuICByZXNvbHZlcj86IFBvcHVwUmVkaXJlY3RSZXNvbHZlclxuKTogUHJvbWlzZTx2b2lkIHwgbmV2ZXI+IHtcbiAgY29uc3QgdXNlckludGVybmFsID0gZ2V0TW9kdWxhckluc3RhbmNlKHVzZXIpIGFzIFVzZXJJbnRlcm5hbDtcbiAgX2Fzc2VydEluc3RhbmNlT2YodXNlckludGVybmFsLmF1dGgsIHByb3ZpZGVyLCBGZWRlcmF0ZWRBdXRoUHJvdmlkZXIpO1xuICAvLyBXYWl0IGZvciBhdXRoIGluaXRpYWxpemF0aW9uIHRvIGNvbXBsZXRlLCB0aGlzIHdpbGwgcHJvY2VzcyBwZW5kaW5nIHJlZGlyZWN0cyBhbmQgY2xlYXIgdGhlXG4gIC8vIFBFTkRJTkdfUkVESVJFQ1RfS0VZIGluIHBlcnNpc3RlbmNlLiBUaGlzIHNob3VsZCBiZSBjb21wbGV0ZWQgYmVmb3JlIHN0YXJ0aW5nIGEgbmV3XG4gIC8vIHJlZGlyZWN0IGFuZCBjcmVhdGluZyBhIFBFTkRJTkdfUkVESVJFQ1RfS0VZIGVudHJ5LlxuICBhd2FpdCB1c2VySW50ZXJuYWwuYXV0aC5faW5pdGlhbGl6YXRpb25Qcm9taXNlO1xuICAvLyBBbGxvdyB0aGUgcmVzb2x2ZXIgdG8gZXJyb3IgYmVmb3JlIHBlcnNpc3RpbmcgdGhlIHJlZGlyZWN0IHVzZXJcbiAgY29uc3QgcmVzb2x2ZXJJbnRlcm5hbCA9IF93aXRoRGVmYXVsdFJlc29sdmVyKHVzZXJJbnRlcm5hbC5hdXRoLCByZXNvbHZlcik7XG4gIGF3YWl0IF9zZXRQZW5kaW5nUmVkaXJlY3RTdGF0dXMocmVzb2x2ZXJJbnRlcm5hbCwgdXNlckludGVybmFsLmF1dGgpO1xuXG4gIGNvbnN0IGV2ZW50SWQgPSBhd2FpdCBwcmVwYXJlVXNlckZvclJlZGlyZWN0KHVzZXJJbnRlcm5hbCk7XG4gIHJldHVybiByZXNvbHZlckludGVybmFsLl9vcGVuUmVkaXJlY3QoXG4gICAgdXNlckludGVybmFsLmF1dGgsXG4gICAgcHJvdmlkZXIsXG4gICAgQXV0aEV2ZW50VHlwZS5SRUFVVEhfVklBX1JFRElSRUNULFxuICAgIGV2ZW50SWRcbiAgKTtcbn1cblxuLyoqXG4gKiBMaW5rcyB0aGUge0BsaW5rIE9BdXRoUHJvdmlkZXJ9IHRvIHRoZSB1c2VyIGFjY291bnQgdXNpbmcgYSBmdWxsLXBhZ2UgcmVkaXJlY3QgZmxvdy5cbiAqIEByZW1hcmtzXG4gKiBUbyBoYW5kbGUgdGhlIHJlc3VsdHMgYW5kIGVycm9ycyBmb3IgdGhpcyBvcGVyYXRpb24sIHJlZmVyIHRvIHtAbGluayBnZXRSZWRpcmVjdFJlc3VsdH0uXG4gKiBGb2xsb3cgdGhlIHtAbGluayBodHRwczovL2ZpcmViYXNlLmdvb2dsZS5jb20vZG9jcy9hdXRoL3dlYi9yZWRpcmVjdC1iZXN0LXByYWN0aWNlc1xuICogfCBiZXN0IHByYWN0aWNlc30gd2hlbiB1c2luZyB7QGxpbmsgbGlua1dpdGhSZWRpcmVjdH0uXG4gKlxuICogVGhpcyBtZXRob2QgZG9lcyBub3Qgd29yayBpbiBhIE5vZGUuanMgZW52aXJvbm1lbnQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGphdmFzY3JpcHRcbiAqIC8vIFNpZ24gaW4gdXNpbmcgc29tZSBvdGhlciBwcm92aWRlci5cbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpZ25JbldpdGhFbWFpbEFuZFBhc3N3b3JkKGF1dGgsIGVtYWlsLCBwYXNzd29yZCk7XG4gKiAvLyBMaW5rIHVzaW5nIGEgcmVkaXJlY3QuXG4gKiBjb25zdCBwcm92aWRlciA9IG5ldyBGYWNlYm9va0F1dGhQcm92aWRlcigpO1xuICogYXdhaXQgbGlua1dpdGhSZWRpcmVjdChyZXN1bHQudXNlciwgcHJvdmlkZXIpO1xuICogLy8gVGhpcyB3aWxsIHRyaWdnZXIgYSBmdWxsIHBhZ2UgcmVkaXJlY3QgYXdheSBmcm9tIHlvdXIgYXBwXG4gKlxuICogLy8gQWZ0ZXIgcmV0dXJuaW5nIGZyb20gdGhlIHJlZGlyZWN0IHdoZW4geW91ciBhcHAgaW5pdGlhbGl6ZXMgeW91IGNhbiBvYnRhaW4gdGhlIHJlc3VsdFxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0UmVkaXJlY3RSZXN1bHQoYXV0aCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdXNlciAtIFRoZSB1c2VyLlxuICogQHBhcmFtIHByb3ZpZGVyIC0gVGhlIHByb3ZpZGVyIHRvIGF1dGhlbnRpY2F0ZS4gVGhlIHByb3ZpZGVyIGhhcyB0byBiZSBhbiB7QGxpbmsgT0F1dGhQcm92aWRlcn0uXG4gKiBOb24tT0F1dGggcHJvdmlkZXJzIGxpa2Uge0BsaW5rIEVtYWlsQXV0aFByb3ZpZGVyfSB3aWxsIHRocm93IGFuIGVycm9yLlxuICogQHBhcmFtIHJlc29sdmVyIC0gQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFBvcHVwUmVkaXJlY3RSZXNvbHZlcn0sIG9wdGlvbmFsXG4gKiBpZiBhbHJlYWR5IHN1cHBsaWVkIHRvIHtAbGluayBpbml0aWFsaXplQXV0aH0gb3IgcHJvdmlkZWQgYnkge0BsaW5rIGdldEF1dGh9LlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpbmtXaXRoUmVkaXJlY3QoXG4gIHVzZXI6IFVzZXIsXG4gIHByb3ZpZGVyOiBBdXRoUHJvdmlkZXIsXG4gIHJlc29sdmVyPzogUG9wdXBSZWRpcmVjdFJlc29sdmVyXG4pOiBQcm9taXNlPG5ldmVyPiB7XG4gIHJldHVybiBfbGlua1dpdGhSZWRpcmVjdCh1c2VyLCBwcm92aWRlciwgcmVzb2x2ZXIpIGFzIFByb21pc2U8bmV2ZXI+O1xufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIF9saW5rV2l0aFJlZGlyZWN0KFxuICB1c2VyOiBVc2VyLFxuICBwcm92aWRlcjogQXV0aFByb3ZpZGVyLFxuICByZXNvbHZlcj86IFBvcHVwUmVkaXJlY3RSZXNvbHZlclxuKTogUHJvbWlzZTx2b2lkIHwgbmV2ZXI+IHtcbiAgY29uc3QgdXNlckludGVybmFsID0gZ2V0TW9kdWxhckluc3RhbmNlKHVzZXIpIGFzIFVzZXJJbnRlcm5hbDtcbiAgX2Fzc2VydEluc3RhbmNlT2YodXNlckludGVybmFsLmF1dGgsIHByb3ZpZGVyLCBGZWRlcmF0ZWRBdXRoUHJvdmlkZXIpO1xuICAvLyBXYWl0IGZvciBhdXRoIGluaXRpYWxpemF0aW9uIHRvIGNvbXBsZXRlLCB0aGlzIHdpbGwgcHJvY2VzcyBwZW5kaW5nIHJlZGlyZWN0cyBhbmQgY2xlYXIgdGhlXG4gIC8vIFBFTkRJTkdfUkVESVJFQ1RfS0VZIGluIHBlcnNpc3RlbmNlLiBUaGlzIHNob3VsZCBiZSBjb21wbGV0ZWQgYmVmb3JlIHN0YXJ0aW5nIGEgbmV3XG4gIC8vIHJlZGlyZWN0IGFuZCBjcmVhdGluZyBhIFBFTkRJTkdfUkVESVJFQ1RfS0VZIGVudHJ5LlxuICBhd2FpdCB1c2VySW50ZXJuYWwuYXV0aC5faW5pdGlhbGl6YXRpb25Qcm9taXNlO1xuICAvLyBBbGxvdyB0aGUgcmVzb2x2ZXIgdG8gZXJyb3IgYmVmb3JlIHBlcnNpc3RpbmcgdGhlIHJlZGlyZWN0IHVzZXJcbiAgY29uc3QgcmVzb2x2ZXJJbnRlcm5hbCA9IF93aXRoRGVmYXVsdFJlc29sdmVyKHVzZXJJbnRlcm5hbC5hdXRoLCByZXNvbHZlcik7XG4gIGF3YWl0IF9hc3NlcnRMaW5rZWRTdGF0dXMoZmFsc2UsIHVzZXJJbnRlcm5hbCwgcHJvdmlkZXIucHJvdmlkZXJJZCk7XG4gIGF3YWl0IF9zZXRQZW5kaW5nUmVkaXJlY3RTdGF0dXMocmVzb2x2ZXJJbnRlcm5hbCwgdXNlckludGVybmFsLmF1dGgpO1xuXG4gIGNvbnN0IGV2ZW50SWQgPSBhd2FpdCBwcmVwYXJlVXNlckZvclJlZGlyZWN0KHVzZXJJbnRlcm5hbCk7XG4gIHJldHVybiByZXNvbHZlckludGVybmFsLl9vcGVuUmVkaXJlY3QoXG4gICAgdXNlckludGVybmFsLmF1dGgsXG4gICAgcHJvdmlkZXIsXG4gICAgQXV0aEV2ZW50VHlwZS5MSU5LX1ZJQV9SRURJUkVDVCxcbiAgICBldmVudElkXG4gICk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHtAbGluayBVc2VyQ3JlZGVudGlhbH0gZnJvbSB0aGUgcmVkaXJlY3QtYmFzZWQgc2lnbi1pbiBmbG93LlxuICpcbiAqIEByZW1hcmtzXG4gKiBJZiBzaWduLWluIHN1Y2NlZWRlZCwgcmV0dXJucyB0aGUgc2lnbmVkIGluIHVzZXIuIElmIHNpZ24taW4gd2FzIHVuc3VjY2Vzc2Z1bCwgZmFpbHMgd2l0aCBhblxuICogZXJyb3IuIElmIG5vIHJlZGlyZWN0IG9wZXJhdGlvbiB3YXMgY2FsbGVkLCByZXR1cm5zIGBudWxsYC5cbiAqXG4gKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCB3b3JrIGluIGEgTm9kZS5qcyBlbnZpcm9ubWVudC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgamF2YXNjcmlwdFxuICogLy8gU2lnbiBpbiB1c2luZyBhIHJlZGlyZWN0LlxuICogY29uc3QgcHJvdmlkZXIgPSBuZXcgRmFjZWJvb2tBdXRoUHJvdmlkZXIoKTtcbiAqIC8vIFlvdSBjYW4gYWRkIGFkZGl0aW9uYWwgc2NvcGVzIHRvIHRoZSBwcm92aWRlcjpcbiAqIHByb3ZpZGVyLmFkZFNjb3BlKCd1c2VyX2JpcnRoZGF5Jyk7XG4gKiAvLyBTdGFydCBhIHNpZ24gaW4gcHJvY2VzcyBmb3IgYW4gdW5hdXRoZW50aWNhdGVkIHVzZXIuXG4gKiBhd2FpdCBzaWduSW5XaXRoUmVkaXJlY3QoYXV0aCwgcHJvdmlkZXIpO1xuICogLy8gVGhpcyB3aWxsIHRyaWdnZXIgYSBmdWxsIHBhZ2UgcmVkaXJlY3QgYXdheSBmcm9tIHlvdXIgYXBwXG4gKlxuICogLy8gQWZ0ZXIgcmV0dXJuaW5nIGZyb20gdGhlIHJlZGlyZWN0IHdoZW4geW91ciBhcHAgaW5pdGlhbGl6ZXMgeW91IGNhbiBvYnRhaW4gdGhlIHJlc3VsdFxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0UmVkaXJlY3RSZXN1bHQoYXV0aCk7XG4gKiBpZiAocmVzdWx0KSB7XG4gKiAgIC8vIFRoaXMgaXMgdGhlIHNpZ25lZC1pbiB1c2VyXG4gKiAgIGNvbnN0IHVzZXIgPSByZXN1bHQudXNlcjtcbiAqICAgLy8gVGhpcyBnaXZlcyB5b3UgYSBGYWNlYm9vayBBY2Nlc3MgVG9rZW4uXG4gKiAgIGNvbnN0IGNyZWRlbnRpYWwgPSBwcm92aWRlci5jcmVkZW50aWFsRnJvbVJlc3VsdChhdXRoLCByZXN1bHQpO1xuICogICBjb25zdCB0b2tlbiA9IGNyZWRlbnRpYWwuYWNjZXNzVG9rZW47XG4gKiB9XG4gKiAvLyBBcyB0aGlzIEFQSSBjYW4gYmUgdXNlZCBmb3Igc2lnbi1pbiwgbGlua2luZyBhbmQgcmVhdXRoZW50aWNhdGlvbixcbiAqIC8vIGNoZWNrIHRoZSBvcGVyYXRpb25UeXBlIHRvIGRldGVybWluZSB3aGF0IHRyaWdnZXJlZCB0aGlzIHJlZGlyZWN0XG4gKiAvLyBvcGVyYXRpb24uXG4gKiBjb25zdCBvcGVyYXRpb25UeXBlID0gcmVzdWx0Lm9wZXJhdGlvblR5cGU7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcmVzb2x2ZXIgLSBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgUG9wdXBSZWRpcmVjdFJlc29sdmVyfSwgb3B0aW9uYWxcbiAqIGlmIGFscmVhZHkgc3VwcGxpZWQgdG8ge0BsaW5rIGluaXRpYWxpemVBdXRofSBvciBwcm92aWRlZCBieSB7QGxpbmsgZ2V0QXV0aH0uXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UmVkaXJlY3RSZXN1bHQoXG4gIGF1dGg6IEF1dGgsXG4gIHJlc29sdmVyPzogUG9wdXBSZWRpcmVjdFJlc29sdmVyXG4pOiBQcm9taXNlPFVzZXJDcmVkZW50aWFsIHwgbnVsbD4ge1xuICBhd2FpdCBfY2FzdEF1dGgoYXV0aCkuX2luaXRpYWxpemF0aW9uUHJvbWlzZTtcbiAgcmV0dXJuIF9nZXRSZWRpcmVjdFJlc3VsdChhdXRoLCByZXNvbHZlciwgZmFsc2UpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gX2dldFJlZGlyZWN0UmVzdWx0KFxuICBhdXRoOiBBdXRoLFxuICByZXNvbHZlckV4dGVybj86IFBvcHVwUmVkaXJlY3RSZXNvbHZlcixcbiAgYnlwYXNzQXV0aFN0YXRlID0gZmFsc2Vcbik6IFByb21pc2U8VXNlckNyZWRlbnRpYWwgfCBudWxsPiB7XG4gIGNvbnN0IGF1dGhJbnRlcm5hbCA9IF9jYXN0QXV0aChhdXRoKTtcbiAgY29uc3QgcmVzb2x2ZXIgPSBfd2l0aERlZmF1bHRSZXNvbHZlcihhdXRoSW50ZXJuYWwsIHJlc29sdmVyRXh0ZXJuKTtcbiAgY29uc3QgYWN0aW9uID0gbmV3IFJlZGlyZWN0QWN0aW9uKGF1dGhJbnRlcm5hbCwgcmVzb2x2ZXIsIGJ5cGFzc0F1dGhTdGF0ZSk7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFjdGlvbi5leGVjdXRlKCk7XG5cbiAgaWYgKHJlc3VsdCAmJiAhYnlwYXNzQXV0aFN0YXRlKSB7XG4gICAgZGVsZXRlIHJlc3VsdC51c2VyLl9yZWRpcmVjdEV2ZW50SWQ7XG4gICAgYXdhaXQgYXV0aEludGVybmFsLl9wZXJzaXN0VXNlcklmQ3VycmVudChyZXN1bHQudXNlciBhcyBVc2VySW50ZXJuYWwpO1xuICAgIGF3YWl0IGF1dGhJbnRlcm5hbC5fc2V0UmVkaXJlY3RVc2VyKG51bGwsIHJlc29sdmVyRXh0ZXJuKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByZXBhcmVVc2VyRm9yUmVkaXJlY3QodXNlcjogVXNlckludGVybmFsKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZXZlbnRJZCA9IF9nZW5lcmF0ZUV2ZW50SWQoYCR7dXNlci51aWR9Ojo6YCk7XG4gIHVzZXIuX3JlZGlyZWN0RXZlbnRJZCA9IGV2ZW50SWQ7XG4gIGF3YWl0IHVzZXIuYXV0aC5fc2V0UmVkaXJlY3RVc2VyKHVzZXIpO1xuICBhd2FpdCB1c2VyLmF1dGguX3BlcnNpc3RVc2VySWZDdXJyZW50KHVzZXIpO1xuICByZXR1cm4gZXZlbnRJZDtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQge1xuICBBdXRoRXZlbnQsXG4gIEF1dGhFdmVudENvbnN1bWVyLFxuICBBdXRoRXZlbnRUeXBlLFxuICBFdmVudE1hbmFnZXJcbn0gZnJvbSAnLi4vLi4vbW9kZWwvcG9wdXBfcmVkaXJlY3QnO1xuaW1wb3J0IHsgQXV0aEVycm9yQ29kZSB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBBdXRoSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC9hdXRoJztcbmltcG9ydCB7IF9jcmVhdGVFcnJvciB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0JztcblxuLy8gVGhlIGFtb3VudCBvZiB0aW1lIHRvIHN0b3JlIHRoZSBVSURzIG9mIHNlZW4gZXZlbnRzOyB0aGlzIGlzXG4vLyBzZXQgdG8gMTAgbWluIGJ5IGRlZmF1bHRcbmNvbnN0IEVWRU5UX0RVUExJQ0FUSU9OX0NBQ0hFX0RVUkFUSU9OX01TID0gMTAgKiA2MCAqIDEwMDA7XG5cbmV4cG9ydCBjbGFzcyBBdXRoRXZlbnRNYW5hZ2VyIGltcGxlbWVudHMgRXZlbnRNYW5hZ2VyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBjYWNoZWRFdmVudFVpZHM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbnN1bWVyczogU2V0PEF1dGhFdmVudENvbnN1bWVyPiA9IG5ldyBTZXQoKTtcbiAgcHJvdGVjdGVkIHF1ZXVlZFJlZGlyZWN0RXZlbnQ6IEF1dGhFdmVudCB8IG51bGwgPSBudWxsO1xuICBwcm90ZWN0ZWQgaGFzSGFuZGxlZFBvdGVudGlhbFJlZGlyZWN0ID0gZmFsc2U7XG4gIHByaXZhdGUgbGFzdFByb2Nlc3NlZEV2ZW50VGltZSA9IERhdGUubm93KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBhdXRoOiBBdXRoSW50ZXJuYWwpIHt9XG5cbiAgcmVnaXN0ZXJDb25zdW1lcihhdXRoRXZlbnRDb25zdW1lcjogQXV0aEV2ZW50Q29uc3VtZXIpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnN1bWVycy5hZGQoYXV0aEV2ZW50Q29uc3VtZXIpO1xuXG4gICAgaWYgKFxuICAgICAgdGhpcy5xdWV1ZWRSZWRpcmVjdEV2ZW50ICYmXG4gICAgICB0aGlzLmlzRXZlbnRGb3JDb25zdW1lcih0aGlzLnF1ZXVlZFJlZGlyZWN0RXZlbnQsIGF1dGhFdmVudENvbnN1bWVyKVxuICAgICkge1xuICAgICAgdGhpcy5zZW5kVG9Db25zdW1lcih0aGlzLnF1ZXVlZFJlZGlyZWN0RXZlbnQsIGF1dGhFdmVudENvbnN1bWVyKTtcbiAgICAgIHRoaXMuc2F2ZUV2ZW50VG9DYWNoZSh0aGlzLnF1ZXVlZFJlZGlyZWN0RXZlbnQpO1xuICAgICAgdGhpcy5xdWV1ZWRSZWRpcmVjdEV2ZW50ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICB1bnJlZ2lzdGVyQ29uc3VtZXIoYXV0aEV2ZW50Q29uc3VtZXI6IEF1dGhFdmVudENvbnN1bWVyKTogdm9pZCB7XG4gICAgdGhpcy5jb25zdW1lcnMuZGVsZXRlKGF1dGhFdmVudENvbnN1bWVyKTtcbiAgfVxuXG4gIG9uRXZlbnQoZXZlbnQ6IEF1dGhFdmVudCk6IGJvb2xlYW4ge1xuICAgIC8vIENoZWNrIGlmIHRoZSBldmVudCBoYXMgYWxyZWFkeSBiZWVuIGhhbmRsZWRcbiAgICBpZiAodGhpcy5oYXNFdmVudEJlZW5IYW5kbGVkKGV2ZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGxldCBoYW5kbGVkID0gZmFsc2U7XG4gICAgdGhpcy5jb25zdW1lcnMuZm9yRWFjaChjb25zdW1lciA9PiB7XG4gICAgICBpZiAodGhpcy5pc0V2ZW50Rm9yQ29uc3VtZXIoZXZlbnQsIGNvbnN1bWVyKSkge1xuICAgICAgICBoYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zZW5kVG9Db25zdW1lcihldmVudCwgY29uc3VtZXIpO1xuICAgICAgICB0aGlzLnNhdmVFdmVudFRvQ2FjaGUoZXZlbnQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuaGFzSGFuZGxlZFBvdGVudGlhbFJlZGlyZWN0IHx8ICFpc1JlZGlyZWN0RXZlbnQoZXZlbnQpKSB7XG4gICAgICAvLyBJZiB3ZSd2ZSBhbHJlYWR5IHNlZW4gYSByZWRpcmVjdCBiZWZvcmUsIG9yIHRoaXMgaXMgYSBwb3B1cCBldmVudCxcbiAgICAgIC8vIGJhaWwgbm93XG4gICAgICByZXR1cm4gaGFuZGxlZDtcbiAgICB9XG5cbiAgICB0aGlzLmhhc0hhbmRsZWRQb3RlbnRpYWxSZWRpcmVjdCA9IHRydWU7XG5cbiAgICAvLyBJZiB0aGUgcmVkaXJlY3Qgd2Fzbid0IGhhbmRsZWQsIGhhbmcgb24gdG8gaXRcbiAgICBpZiAoIWhhbmRsZWQpIHtcbiAgICAgIHRoaXMucXVldWVkUmVkaXJlY3RFdmVudCA9IGV2ZW50O1xuICAgICAgaGFuZGxlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGhhbmRsZWQ7XG4gIH1cblxuICBwcml2YXRlIHNlbmRUb0NvbnN1bWVyKGV2ZW50OiBBdXRoRXZlbnQsIGNvbnN1bWVyOiBBdXRoRXZlbnRDb25zdW1lcik6IHZvaWQge1xuICAgIGlmIChldmVudC5lcnJvciAmJiAhaXNOdWxsUmVkaXJlY3RFdmVudChldmVudCkpIHtcbiAgICAgIGNvbnN0IGNvZGUgPVxuICAgICAgICAoZXZlbnQuZXJyb3IuY29kZT8uc3BsaXQoJ2F1dGgvJylbMV0gYXMgQXV0aEVycm9yQ29kZSkgfHxcbiAgICAgICAgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUjtcbiAgICAgIGNvbnN1bWVyLm9uRXJyb3IoX2NyZWF0ZUVycm9yKHRoaXMuYXV0aCwgY29kZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdW1lci5vbkF1dGhFdmVudChldmVudCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc0V2ZW50Rm9yQ29uc3VtZXIoXG4gICAgZXZlbnQ6IEF1dGhFdmVudCxcbiAgICBjb25zdW1lcjogQXV0aEV2ZW50Q29uc3VtZXJcbiAgKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZXZlbnRJZE1hdGNoZXMgPVxuICAgICAgY29uc3VtZXIuZXZlbnRJZCA9PT0gbnVsbCB8fFxuICAgICAgKCEhZXZlbnQuZXZlbnRJZCAmJiBldmVudC5ldmVudElkID09PSBjb25zdW1lci5ldmVudElkKTtcbiAgICByZXR1cm4gY29uc3VtZXIuZmlsdGVyLmluY2x1ZGVzKGV2ZW50LnR5cGUpICYmIGV2ZW50SWRNYXRjaGVzO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNFdmVudEJlZW5IYW5kbGVkKGV2ZW50OiBBdXRoRXZlbnQpOiBib29sZWFuIHtcbiAgICBpZiAoXG4gICAgICBEYXRlLm5vdygpIC0gdGhpcy5sYXN0UHJvY2Vzc2VkRXZlbnRUaW1lID49XG4gICAgICBFVkVOVF9EVVBMSUNBVElPTl9DQUNIRV9EVVJBVElPTl9NU1xuICAgICkge1xuICAgICAgdGhpcy5jYWNoZWRFdmVudFVpZHMuY2xlYXIoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jYWNoZWRFdmVudFVpZHMuaGFzKGV2ZW50VWlkKGV2ZW50KSk7XG4gIH1cblxuICBwcml2YXRlIHNhdmVFdmVudFRvQ2FjaGUoZXZlbnQ6IEF1dGhFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuY2FjaGVkRXZlbnRVaWRzLmFkZChldmVudFVpZChldmVudCkpO1xuICAgIHRoaXMubGFzdFByb2Nlc3NlZEV2ZW50VGltZSA9IERhdGUubm93KCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZXZlbnRVaWQoZTogQXV0aEV2ZW50KTogc3RyaW5nIHtcbiAgcmV0dXJuIFtlLnR5cGUsIGUuZXZlbnRJZCwgZS5zZXNzaW9uSWQsIGUudGVuYW50SWRdLmZpbHRlcih2ID0+IHYpLmpvaW4oJy0nKTtcbn1cblxuZnVuY3Rpb24gaXNOdWxsUmVkaXJlY3RFdmVudCh7IHR5cGUsIGVycm9yIH06IEF1dGhFdmVudCk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIHR5cGUgPT09IEF1dGhFdmVudFR5cGUuVU5LTk9XTiAmJlxuICAgIGVycm9yPy5jb2RlID09PSBgYXV0aC8ke0F1dGhFcnJvckNvZGUuTk9fQVVUSF9FVkVOVH1gXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzUmVkaXJlY3RFdmVudChldmVudDogQXV0aEV2ZW50KTogYm9vbGVhbiB7XG4gIHN3aXRjaCAoZXZlbnQudHlwZSkge1xuICAgIGNhc2UgQXV0aEV2ZW50VHlwZS5TSUdOX0lOX1ZJQV9SRURJUkVDVDpcbiAgICBjYXNlIEF1dGhFdmVudFR5cGUuTElOS19WSUFfUkVESVJFQ1Q6XG4gICAgY2FzZSBBdXRoRXZlbnRUeXBlLlJFQVVUSF9WSUFfUkVESVJFQ1Q6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBjYXNlIEF1dGhFdmVudFR5cGUuVU5LTk9XTjpcbiAgICAgIHJldHVybiBpc051bGxSZWRpcmVjdEV2ZW50KGV2ZW50KTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgX3BlcmZvcm1BcGlSZXF1ZXN0LCBFbmRwb2ludCwgSHR0cE1ldGhvZCB9IGZyb20gJy4uL2luZGV4JztcbmltcG9ydCB7IEF1dGggfSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEdldFByb2plY3RDb25maWdSZXF1ZXN0IHtcbiAgYW5kcm9pZFBhY2thZ2VOYW1lPzogc3RyaW5nO1xuICBpb3NCdW5kbGVJZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXRQcm9qZWN0Q29uZmlnUmVzcG9uc2Uge1xuICBhdXRob3JpemVkRG9tYWluczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBfZ2V0UHJvamVjdENvbmZpZyhcbiAgYXV0aDogQXV0aCxcbiAgcmVxdWVzdDogR2V0UHJvamVjdENvbmZpZ1JlcXVlc3QgPSB7fVxuKTogUHJvbWlzZTxHZXRQcm9qZWN0Q29uZmlnUmVzcG9uc2U+IHtcbiAgcmV0dXJuIF9wZXJmb3JtQXBpUmVxdWVzdDxHZXRQcm9qZWN0Q29uZmlnUmVxdWVzdCwgR2V0UHJvamVjdENvbmZpZ1Jlc3BvbnNlPihcbiAgICBhdXRoLFxuICAgIEh0dHBNZXRob2QuR0VULFxuICAgIEVuZHBvaW50LkdFVF9QUk9KRUNUX0NPTkZJRyxcbiAgICByZXF1ZXN0XG4gICk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgX2dldFByb2plY3RDb25maWcgfSBmcm9tICcuLi8uLi9hcGkvcHJvamVjdF9jb25maWcvZ2V0X3Byb2plY3RfY29uZmlnJztcbmltcG9ydCB7IEF1dGhJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL2F1dGgnO1xuaW1wb3J0IHsgQXV0aEVycm9yQ29kZSB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBfZmFpbCB9IGZyb20gJy4vYXNzZXJ0JztcbmltcG9ydCB7IF9nZXRDdXJyZW50VXJsIH0gZnJvbSAnLi9sb2NhdGlvbic7XG5cbmNvbnN0IElQX0FERFJFU1NfUkVHRVggPSAvXlxcZHsxLDN9XFwuXFxkezEsM31cXC5cXGR7MSwzfVxcLlxcZHsxLDN9JC87XG5jb25zdCBIVFRQX1JFR0VYID0gL15odHRwcz8vO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gX3ZhbGlkYXRlT3JpZ2luKGF1dGg6IEF1dGhJbnRlcm5hbCk6IFByb21pc2U8dm9pZD4ge1xuICAvLyBTa2lwIG9yaWdpbiB2YWxpZGF0aW9uIGlmIHdlIGFyZSBpbiBhbiBlbXVsYXRlZCBlbnZpcm9ubWVudFxuICBpZiAoYXV0aC5jb25maWcuZW11bGF0b3IpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB7IGF1dGhvcml6ZWREb21haW5zIH0gPSBhd2FpdCBfZ2V0UHJvamVjdENvbmZpZyhhdXRoKTtcblxuICBmb3IgKGNvbnN0IGRvbWFpbiBvZiBhdXRob3JpemVkRG9tYWlucykge1xuICAgIHRyeSB7XG4gICAgICBpZiAobWF0Y2hEb21haW4oZG9tYWluKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBEbyBub3RoaW5nIGlmIHRoZXJlJ3MgYSBVUkwgZXJyb3I7IGp1c3QgY29udGludWUgc2VhcmNoaW5nXG4gICAgfVxuICB9XG5cbiAgLy8gSW4gdGhlIG9sZCBTREssIHRoaXMgZXJyb3IgYWxzbyBwcm92aWRlcyBoZWxwZnVsIG1lc3NhZ2VzLlxuICBfZmFpbChhdXRoLCBBdXRoRXJyb3JDb2RlLklOVkFMSURfT1JJR0lOKTtcbn1cblxuZnVuY3Rpb24gbWF0Y2hEb21haW4oZXhwZWN0ZWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBjdXJyZW50VXJsID0gX2dldEN1cnJlbnRVcmwoKTtcbiAgY29uc3QgeyBwcm90b2NvbCwgaG9zdG5hbWUgfSA9IG5ldyBVUkwoY3VycmVudFVybCk7XG4gIGlmIChleHBlY3RlZC5zdGFydHNXaXRoKCdjaHJvbWUtZXh0ZW5zaW9uOi8vJykpIHtcbiAgICBjb25zdCBjZVVybCA9IG5ldyBVUkwoZXhwZWN0ZWQpO1xuXG4gICAgaWYgKGNlVXJsLmhvc3RuYW1lID09PSAnJyAmJiBob3N0bmFtZSA9PT0gJycpIHtcbiAgICAgIC8vIEZvciBzb21lIHJlYXNvbiB3ZSdyZSBub3QgcGFyc2luZyBjaHJvbWUgVVJMcyBwcm9wZXJseVxuICAgICAgcmV0dXJuIChcbiAgICAgICAgcHJvdG9jb2wgPT09ICdjaHJvbWUtZXh0ZW5zaW9uOicgJiZcbiAgICAgICAgZXhwZWN0ZWQucmVwbGFjZSgnY2hyb21lLWV4dGVuc2lvbjovLycsICcnKSA9PT1cbiAgICAgICAgICBjdXJyZW50VXJsLnJlcGxhY2UoJ2Nocm9tZS1leHRlbnNpb246Ly8nLCAnJylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb3RvY29sID09PSAnY2hyb21lLWV4dGVuc2lvbjonICYmIGNlVXJsLmhvc3RuYW1lID09PSBob3N0bmFtZTtcbiAgfVxuXG4gIGlmICghSFRUUF9SRUdFWC50ZXN0KHByb3RvY29sKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChJUF9BRERSRVNTX1JFR0VYLnRlc3QoZXhwZWN0ZWQpKSB7XG4gICAgLy8gVGhlIGRvbWFpbiBoYXMgdG8gYmUgZXhhY3RseSBlcXVhbCB0byB0aGUgcGF0dGVybiwgYXMgYW4gSVAgZG9tYWluIHdpbGxcbiAgICAvLyBvbmx5IGNvbnRhaW4gdGhlIElQLCBubyBleHRyYSBjaGFyYWN0ZXIuXG4gICAgcmV0dXJuIGhvc3RuYW1lID09PSBleHBlY3RlZDtcbiAgfVxuXG4gIC8vIERvdHMgaW4gcGF0dGVybiBzaG91bGQgYmUgZXNjYXBlZC5cbiAgY29uc3QgZXNjYXBlZERvbWFpblBhdHRlcm4gPSBleHBlY3RlZC5yZXBsYWNlKC9cXC4vZywgJ1xcXFwuJyk7XG4gIC8vIE5vbiBpcCBhZGRyZXNzIGRvbWFpbnMuXG4gIC8vIGRvbWFpbi5jb20gPSAqLmRvbWFpbi5jb20gT1IgZG9tYWluLmNvbVxuICBjb25zdCByZSA9IG5ldyBSZWdFeHAoXG4gICAgJ14oLitcXFxcLicgKyBlc2NhcGVkRG9tYWluUGF0dGVybiArICd8JyArIGVzY2FwZWREb21haW5QYXR0ZXJuICsgJykkJyxcbiAgICAnaSdcbiAgKTtcbiAgcmV0dXJuIHJlLnRlc3QoaG9zdG5hbWUpO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBBdXRoRXJyb3JDb2RlIH0gZnJvbSAnLi4vLi4vY29yZS9lcnJvcnMnO1xuaW1wb3J0IHsgX2NyZWF0ZUVycm9yIH0gZnJvbSAnLi4vLi4vY29yZS91dGlsL2Fzc2VydCc7XG5pbXBvcnQgeyBEZWxheSB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbC9kZWxheSc7XG5pbXBvcnQgeyBBdXRoSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC9hdXRoJztcbmltcG9ydCB7IF93aW5kb3cgfSBmcm9tICcuLi9hdXRoX3dpbmRvdyc7XG5pbXBvcnQgKiBhcyBqcyBmcm9tICcuLi9sb2FkX2pzJztcblxuY29uc3QgTkVUV09SS19USU1FT1VUID0gbmV3IERlbGF5KDMwMDAwLCA2MDAwMCk7XG5cbi8qKlxuICogUmVzZXQgdW5sYW9kZWQgR0FwaSBtb2R1bGVzLiBJZiBnYXBpLmxvYWQgZmFpbHMgZHVlIHRvIGEgbmV0d29yayBlcnJvcixcbiAqIGl0IHdpbGwgc3RvcCB3b3JraW5nIGFmdGVyIGEgcmV0cmlhbC4gVGhpcyBpcyBhIGhhY2sgdG8gZml4IHRoaXMgaXNzdWUuXG4gKi9cbmZ1bmN0aW9uIHJlc2V0VW5sb2FkZWRHYXBpTW9kdWxlcygpOiB2b2lkIHtcbiAgLy8gQ2xlYXIgbGFzdCBmYWlsZWQgZ2FwaS5sb2FkIHN0YXRlIHRvIGZvcmNlIG5leHQgZ2FwaS5sb2FkIHRvIGZpcnN0XG4gIC8vIGxvYWQgdGhlIGZhaWxlZCBnYXBpLmlmcmFtZXMgbW9kdWxlLlxuICAvLyBHZXQgZ2FwaXguYmVhY29uIGNvbnRleHQuXG4gIGNvbnN0IGJlYWNvbiA9IF93aW5kb3coKS5fX19qc2w7XG4gIC8vIEdldCBjdXJyZW50IGhpbnQuXG4gIGlmIChiZWFjb24/LkgpIHtcbiAgICAvLyBHZXQgZ2FwaSBoaW50LlxuICAgIGZvciAoY29uc3QgaGludCBvZiBPYmplY3Qua2V5cyhiZWFjb24uSCkpIHtcbiAgICAgIC8vIFJlcXVlc3RlZCBtb2R1bGVzLlxuICAgICAgYmVhY29uLkhbaGludF0uciA9IGJlYWNvbi5IW2hpbnRdLnIgfHwgW107XG4gICAgICAvLyBMb2FkZWQgbW9kdWxlcy5cbiAgICAgIGJlYWNvbi5IW2hpbnRdLkwgPSBiZWFjb24uSFtoaW50XS5MIHx8IFtdO1xuICAgICAgLy8gU2V0IHJlcXVlc3RlZCBtb2R1bGVzIHRvIGEgY29weSBvZiB0aGUgbG9hZGVkIG1vZHVsZXMuXG4gICAgICBiZWFjb24uSFtoaW50XS5yID0gWy4uLmJlYWNvbi5IW2hpbnRdLkxdO1xuICAgICAgLy8gQ2xlYXIgcGVuZGluZyBjYWxsYmFja3MuXG4gICAgICBpZiAoYmVhY29uLkNQKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmVhY29uLkNQLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgLy8gUmVtb3ZlIGFsbCBmYWlsZWQgcGVuZGluZyBjYWxsYmFja3MuXG4gICAgICAgICAgYmVhY29uLkNQW2ldID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBsb2FkR2FwaShhdXRoOiBBdXRoSW50ZXJuYWwpOiBQcm9taXNlPGdhcGkuaWZyYW1lcy5Db250ZXh0PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZTxnYXBpLmlmcmFtZXMuQ29udGV4dD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIC8vIEZ1bmN0aW9uIHRvIHJ1biB3aGVuIGdhcGkubG9hZCBpcyByZWFkeS5cbiAgICBmdW5jdGlvbiBsb2FkR2FwaUlmcmFtZSgpOiB2b2lkIHtcbiAgICAgIC8vIFRoZSBkZXZlbG9wZXIgbWF5IGhhdmUgdHJpZWQgdG8gcHJldmlvdXNseSBydW4gZ2FwaS5sb2FkIGFuZCBmYWlsZWQuXG4gICAgICAvLyBSdW4gdGhpcyB0byBmaXggdGhhdC5cbiAgICAgIHJlc2V0VW5sb2FkZWRHYXBpTW9kdWxlcygpO1xuICAgICAgZ2FwaS5sb2FkKCdnYXBpLmlmcmFtZXMnLCB7XG4gICAgICAgIGNhbGxiYWNrOiAoKSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZShnYXBpLmlmcmFtZXMuZ2V0Q29udGV4dCgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgb250aW1lb3V0OiAoKSA9PiB7XG4gICAgICAgICAgLy8gVGhlIGFib3ZlIHJlc2V0IG1heSBiZSBzdWZmaWNpZW50LCBidXQgaGF2aW5nIHRoaXMgcmVzZXQgYWZ0ZXJcbiAgICAgICAgICAvLyBmYWlsdXJlIGVuc3VyZXMgdGhhdCBpZiB0aGUgZGV2ZWxvcGVyIGNhbGxzIGdhcGkubG9hZCBhZnRlciB0aGVcbiAgICAgICAgICAvLyBjb25uZWN0aW9uIGlzIHJlLWVzdGFibGlzaGVkIGFuZCBiZWZvcmUgYW5vdGhlciBhdHRlbXB0IHRvIGVtYmVkXG4gICAgICAgICAgLy8gdGhlIGlmcmFtZSwgaXQgd291bGQgd29yayBhbmQgd291bGQgbm90IGJlIGJyb2tlbiBiZWNhdXNlIG9mIG91clxuICAgICAgICAgIC8vIGZhaWxlZCBhdHRlbXB0LlxuICAgICAgICAgIC8vIFRpbWVvdXQgd2hlbiBnYXBpLmlmcmFtZXMuSWZyYW1lIG5vdCBsb2FkZWQuXG4gICAgICAgICAgcmVzZXRVbmxvYWRlZEdhcGlNb2R1bGVzKCk7XG4gICAgICAgICAgcmVqZWN0KF9jcmVhdGVFcnJvcihhdXRoLCBBdXRoRXJyb3JDb2RlLk5FVFdPUktfUkVRVUVTVF9GQUlMRUQpKTtcbiAgICAgICAgfSxcbiAgICAgICAgdGltZW91dDogTkVUV09SS19USU1FT1VULmdldCgpXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoX3dpbmRvdygpLmdhcGk/LmlmcmFtZXM/LklmcmFtZSkge1xuICAgICAgLy8gSWYgZ2FwaS5pZnJhbWVzLklmcmFtZSBhdmFpbGFibGUsIHJlc29sdmUuXG4gICAgICByZXNvbHZlKGdhcGkuaWZyYW1lcy5nZXRDb250ZXh0KCkpO1xuICAgIH0gZWxzZSBpZiAoISFfd2luZG93KCkuZ2FwaT8ubG9hZCkge1xuICAgICAgLy8gR2FwaSBsb2FkZXIgcmVhZHksIGxvYWQgZ2FwaS5pZnJhbWVzLlxuICAgICAgbG9hZEdhcGlJZnJhbWUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ3JlYXRlIGEgbmV3IGlmcmFtZSBjYWxsYmFjayB3aGVuIHRoaXMgaXMgY2FsbGVkIHNvIGFzIG5vdCB0byBvdmVyd3JpdGVcbiAgICAgIC8vIGFueSBwcmV2aW91cyBkZWZpbmVkIGNhbGxiYWNrLiBUaGlzIGhhcHBlbnMgaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkXG4gICAgICAvLyBtdWx0aXBsZSB0aW1lcyBpbiBwYXJhbGxlbCBhbmQgY291bGQgcmVzdWx0IGluIHRoZSBsYXRlciBjYWxsYmFja1xuICAgICAgLy8gb3ZlcndyaXRpbmcgdGhlIHByZXZpb3VzIG9uZS4gVGhpcyB3b3VsZCBlbmQgdXAgd2l0aCBhIGlmcmFtZVxuICAgICAgLy8gdGltZW91dC5cbiAgICAgIGNvbnN0IGNiTmFtZSA9IGpzLl9nZW5lcmF0ZUNhbGxiYWNrTmFtZSgnaWZyYW1lZmNiJyk7XG4gICAgICAvLyBHQXBpIGxvYWRlciBub3QgYXZhaWxhYmxlLCBkeW5hbWljYWxseSBsb2FkIHBsYXRmb3JtLmpzLlxuICAgICAgX3dpbmRvdygpW2NiTmFtZV0gPSAoKSA9PiB7XG4gICAgICAgIC8vIEdBcGkgbG9hZGVyIHNob3VsZCBiZSByZWFkeS5cbiAgICAgICAgaWYgKCEhZ2FwaS5sb2FkKSB7XG4gICAgICAgICAgbG9hZEdhcGlJZnJhbWUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBHYXBpIGxvYWRlciBmYWlsZWQsIHRocm93IGVycm9yLlxuICAgICAgICAgIHJlamVjdChfY3JlYXRlRXJyb3IoYXV0aCwgQXV0aEVycm9yQ29kZS5ORVRXT1JLX1JFUVVFU1RfRkFJTEVEKSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICAvLyBMb2FkIEdBcGkgbG9hZGVyLlxuICAgICAgcmV0dXJuIGpzXG4gICAgICAgIC5fbG9hZEpTKGBodHRwczovL2FwaXMuZ29vZ2xlLmNvbS9qcy9hcGkuanM/b25sb2FkPSR7Y2JOYW1lfWApXG4gICAgICAgIC5jYXRjaChlID0+IHJlamVjdChlKSk7XG4gICAgfVxuICB9KS5jYXRjaChlcnJvciA9PiB7XG4gICAgLy8gUmVzZXQgY2FjaGVkIHByb21pc2UgdG8gYWxsb3cgZm9yIHJldHJpYWwuXG4gICAgY2FjaGVkR0FwaUxvYWRlciA9IG51bGw7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH0pO1xufVxuXG5sZXQgY2FjaGVkR0FwaUxvYWRlcjogUHJvbWlzZTxnYXBpLmlmcmFtZXMuQ29udGV4dD4gfCBudWxsID0gbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiBfbG9hZEdhcGkoYXV0aDogQXV0aEludGVybmFsKTogUHJvbWlzZTxnYXBpLmlmcmFtZXMuQ29udGV4dD4ge1xuICBjYWNoZWRHQXBpTG9hZGVyID0gY2FjaGVkR0FwaUxvYWRlciB8fCBsb2FkR2FwaShhdXRoKTtcbiAgcmV0dXJuIGNhY2hlZEdBcGlMb2FkZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfcmVzZXRMb2FkZXIoKTogdm9pZCB7XG4gIGNhY2hlZEdBcGlMb2FkZXIgPSBudWxsO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBTREtfVkVSU0lPTiB9IGZyb20gJ0BmaXJlYmFzZS9hcHAnO1xuaW1wb3J0IHsgcXVlcnlzdHJpbmcgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5pbXBvcnQgeyBEZWZhdWx0Q29uZmlnIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwnO1xuXG5pbXBvcnQgeyBBdXRoRXJyb3JDb2RlIH0gZnJvbSAnLi4vLi4vY29yZS9lcnJvcnMnO1xuaW1wb3J0IHsgX2Fzc2VydCwgX2NyZWF0ZUVycm9yIH0gZnJvbSAnLi4vLi4vY29yZS91dGlsL2Fzc2VydCc7XG5pbXBvcnQgeyBEZWxheSB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbC9kZWxheSc7XG5pbXBvcnQgeyBfZW11bGF0b3JVcmwgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWwvZW11bGF0b3InO1xuaW1wb3J0IHsgQXV0aEludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvYXV0aCc7XG5pbXBvcnQgeyBfd2luZG93IH0gZnJvbSAnLi4vYXV0aF93aW5kb3cnO1xuaW1wb3J0ICogYXMgZ2FwaUxvYWRlciBmcm9tICcuL2dhcGknO1xuXG5jb25zdCBQSU5HX1RJTUVPVVQgPSBuZXcgRGVsYXkoNTAwMCwgMTUwMDApO1xuY29uc3QgSUZSQU1FX1BBVEggPSAnX18vYXV0aC9pZnJhbWUnO1xuY29uc3QgRU1VTEFURURfSUZSQU1FX1BBVEggPSAnZW11bGF0b3IvYXV0aC9pZnJhbWUnO1xuXG5jb25zdCBJRlJBTUVfQVRUUklCVVRFUyA9IHtcbiAgc3R5bGU6IHtcbiAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICB0b3A6ICctMTAwcHgnLFxuICAgIHdpZHRoOiAnMXB4JyxcbiAgICBoZWlnaHQ6ICcxcHgnXG4gIH0sXG4gICdhcmlhLWhpZGRlbic6ICd0cnVlJyxcbiAgdGFiaW5kZXg6ICctMSdcbn07XG5cbi8vIE1hcCBmcm9tIGFwaUhvc3QgdG8gZW5kcG9pbnQgSUQgZm9yIHBhc3NpbmcgaW50byBpZnJhbWUuIEluIGN1cnJlbnQgU0RLLCBhcGlIb3N0IGNhbiBiZSBzZXQgdG9cbi8vIGFueXRoaW5nIChub3QgZnJvbSBhIGxpc3Qgb2YgZW5kcG9pbnRzIHdpdGggSURzIGFzIGluIGxlZ2FjeSksIHNvIHRoaXMgaXMgdGhlIGNsb3Nlc3Qgd2UgY2FuIGdldC5cbmNvbnN0IEVJRF9GUk9NX0FQSUhPU1QgPSBuZXcgTWFwKFtcbiAgW0RlZmF1bHRDb25maWcuQVBJX0hPU1QsICdwJ10sIC8vIHByb2R1Y3Rpb25cbiAgWydzdGFnaW5nLWlkZW50aXR5dG9vbGtpdC5zYW5kYm94Lmdvb2dsZWFwaXMuY29tJywgJ3MnXSwgLy8gc3RhZ2luZ1xuICBbJ3Rlc3QtaWRlbnRpdHl0b29sa2l0LnNhbmRib3guZ29vZ2xlYXBpcy5jb20nLCAndCddIC8vIHRlc3Rcbl0pO1xuXG5mdW5jdGlvbiBnZXRJZnJhbWVVcmwoYXV0aDogQXV0aEludGVybmFsKTogc3RyaW5nIHtcbiAgY29uc3QgY29uZmlnID0gYXV0aC5jb25maWc7XG4gIF9hc3NlcnQoY29uZmlnLmF1dGhEb21haW4sIGF1dGgsIEF1dGhFcnJvckNvZGUuTUlTU0lOR19BVVRIX0RPTUFJTik7XG4gIGNvbnN0IHVybCA9IGNvbmZpZy5lbXVsYXRvclxuICAgID8gX2VtdWxhdG9yVXJsKGNvbmZpZywgRU1VTEFURURfSUZSQU1FX1BBVEgpXG4gICAgOiBgaHR0cHM6Ly8ke2F1dGguY29uZmlnLmF1dGhEb21haW59LyR7SUZSQU1FX1BBVEh9YDtcblxuICBjb25zdCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgYXBpS2V5OiBjb25maWcuYXBpS2V5LFxuICAgIGFwcE5hbWU6IGF1dGgubmFtZSxcbiAgICB2OiBTREtfVkVSU0lPTlxuICB9O1xuICBjb25zdCBlaWQgPSBFSURfRlJPTV9BUElIT1NULmdldChhdXRoLmNvbmZpZy5hcGlIb3N0KTtcbiAgaWYgKGVpZCkge1xuICAgIHBhcmFtcy5laWQgPSBlaWQ7XG4gIH1cbiAgY29uc3QgZnJhbWV3b3JrcyA9IGF1dGguX2dldEZyYW1ld29ya3MoKTtcbiAgaWYgKGZyYW1ld29ya3MubGVuZ3RoKSB7XG4gICAgcGFyYW1zLmZ3ID0gZnJhbWV3b3Jrcy5qb2luKCcsJyk7XG4gIH1cbiAgcmV0dXJuIGAke3VybH0/JHtxdWVyeXN0cmluZyhwYXJhbXMpLnNsaWNlKDEpfWA7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBfb3BlbklmcmFtZShcbiAgYXV0aDogQXV0aEludGVybmFsXG4pOiBQcm9taXNlPGdhcGkuaWZyYW1lcy5JZnJhbWU+IHtcbiAgY29uc3QgY29udGV4dCA9IGF3YWl0IGdhcGlMb2FkZXIuX2xvYWRHYXBpKGF1dGgpO1xuICBjb25zdCBnYXBpID0gX3dpbmRvdygpLmdhcGk7XG4gIF9hc3NlcnQoZ2FwaSwgYXV0aCwgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUik7XG4gIHJldHVybiBjb250ZXh0Lm9wZW4oXG4gICAge1xuICAgICAgd2hlcmU6IGRvY3VtZW50LmJvZHksXG4gICAgICB1cmw6IGdldElmcmFtZVVybChhdXRoKSxcbiAgICAgIG1lc3NhZ2VIYW5kbGVyc0ZpbHRlcjogZ2FwaS5pZnJhbWVzLkNST1NTX09SSUdJTl9JRlJBTUVTX0ZJTFRFUixcbiAgICAgIGF0dHJpYnV0ZXM6IElGUkFNRV9BVFRSSUJVVEVTLFxuICAgICAgZG9udGNsZWFyOiB0cnVlXG4gICAgfSxcbiAgICAoaWZyYW1lOiBnYXBpLmlmcmFtZXMuSWZyYW1lKSA9PlxuICAgICAgbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBhd2FpdCBpZnJhbWUucmVzdHlsZSh7XG4gICAgICAgICAgLy8gUHJldmVudCBpZnJhbWUgZnJvbSBjbG9zaW5nIG9uIG1vdXNlIG91dC5cbiAgICAgICAgICBzZXRIaWRlT25MZWF2ZTogZmFsc2VcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgbmV0d29ya0Vycm9yID0gX2NyZWF0ZUVycm9yKFxuICAgICAgICAgIGF1dGgsXG4gICAgICAgICAgQXV0aEVycm9yQ29kZS5ORVRXT1JLX1JFUVVFU1RfRkFJTEVEXG4gICAgICAgICk7XG4gICAgICAgIC8vIENvbmZpcm0gaWZyYW1lIGlzIGNvcnJlY3RseSBsb2FkZWQuXG4gICAgICAgIC8vIFRvIGZhbGxiYWNrIG9uIGZhaWx1cmUsIHNldCBhIHRpbWVvdXQuXG4gICAgICAgIGNvbnN0IG5ldHdvcmtFcnJvclRpbWVyID0gX3dpbmRvdygpLnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHJlamVjdChuZXR3b3JrRXJyb3IpO1xuICAgICAgICB9LCBQSU5HX1RJTUVPVVQuZ2V0KCkpO1xuICAgICAgICAvLyBDbGVhciB0aW1lciBhbmQgcmVzb2x2ZSBwZW5kaW5nIGlmcmFtZSByZWFkeSBwcm9taXNlLlxuICAgICAgICBmdW5jdGlvbiBjbGVhclRpbWVyQW5kUmVzb2x2ZSgpOiB2b2lkIHtcbiAgICAgICAgICBfd2luZG93KCkuY2xlYXJUaW1lb3V0KG5ldHdvcmtFcnJvclRpbWVyKTtcbiAgICAgICAgICByZXNvbHZlKGlmcmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhpcyByZXR1cm5zIGFuIElUaGVuYWJsZS4gSG93ZXZlciB0aGUgcmVqZWN0IHBhcnQgZG9lcyBub3QgY2FsbFxuICAgICAgICAvLyB3aGVuIHRoZSBpZnJhbWUgaXMgbm90IGxvYWRlZC5cbiAgICAgICAgaWZyYW1lLnBpbmcoY2xlYXJUaW1lckFuZFJlc29sdmUpLnRoZW4oY2xlYXJUaW1lckFuZFJlc29sdmUsICgpID0+IHtcbiAgICAgICAgICByZWplY3QobmV0d29ya0Vycm9yKTtcbiAgICAgICAgfSk7XG4gICAgICB9KVxuICApO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBnZXRVQSB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcblxuaW1wb3J0IHsgQXV0aEVycm9yQ29kZSB9IGZyb20gJy4uLy4uL2NvcmUvZXJyb3JzJztcbmltcG9ydCB7IF9hc3NlcnQgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWwvYXNzZXJ0JztcbmltcG9ydCB7XG4gIF9pc0Nocm9tZUlPUyxcbiAgX2lzRmlyZWZveCxcbiAgX2lzSU9TU3RhbmRhbG9uZVxufSBmcm9tICcuLi8uLi9jb3JlL3V0aWwvYnJvd3Nlcic7XG5pbXBvcnQgeyBBdXRoSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC9hdXRoJztcblxuY29uc3QgQkFTRV9QT1BVUF9PUFRJT05TID0ge1xuICBsb2NhdGlvbjogJ3llcycsXG4gIHJlc2l6YWJsZTogJ3llcycsXG4gIHN0YXR1c2JhcjogJ3llcycsXG4gIHRvb2xiYXI6ICdubydcbn07XG5cbmNvbnN0IERFRkFVTFRfV0lEVEggPSA1MDA7XG5jb25zdCBERUZBVUxUX0hFSUdIVCA9IDYwMDtcbmNvbnN0IFRBUkdFVF9CTEFOSyA9ICdfYmxhbmsnO1xuXG5jb25zdCBGSVJFRk9YX0VNUFRZX1VSTCA9ICdodHRwOi8vbG9jYWxob3N0JztcblxuZXhwb3J0IGNsYXNzIEF1dGhQb3B1cCB7XG4gIGFzc29jaWF0ZWRFdmVudDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IocmVhZG9ubHkgd2luZG93OiBXaW5kb3cgfCBudWxsKSB7fVxuXG4gIGNsb3NlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLndpbmRvdykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy53aW5kb3cuY2xvc2UoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfb3BlbihcbiAgYXV0aDogQXV0aEludGVybmFsLFxuICB1cmw/OiBzdHJpbmcsXG4gIG5hbWU/OiBzdHJpbmcsXG4gIHdpZHRoID0gREVGQVVMVF9XSURUSCxcbiAgaGVpZ2h0ID0gREVGQVVMVF9IRUlHSFRcbik6IEF1dGhQb3B1cCB7XG4gIGNvbnN0IHRvcCA9IE1hdGgubWF4KCh3aW5kb3cuc2NyZWVuLmF2YWlsSGVpZ2h0IC0gaGVpZ2h0KSAvIDIsIDApLnRvU3RyaW5nKCk7XG4gIGNvbnN0IGxlZnQgPSBNYXRoLm1heCgod2luZG93LnNjcmVlbi5hdmFpbFdpZHRoIC0gd2lkdGgpIC8gMiwgMCkudG9TdHJpbmcoKTtcbiAgbGV0IHRhcmdldCA9ICcnO1xuXG4gIGNvbnN0IG9wdGlvbnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgLi4uQkFTRV9QT1BVUF9PUFRJT05TLFxuICAgIHdpZHRoOiB3aWR0aC50b1N0cmluZygpLFxuICAgIGhlaWdodDogaGVpZ2h0LnRvU3RyaW5nKCksXG4gICAgdG9wLFxuICAgIGxlZnRcbiAgfTtcblxuICAvLyBDaHJvbWUgaU9TIDcgYW5kIDggaXMgcmV0dXJuaW5nIGFuIHVuZGVmaW5lZCBwb3B1cCB3aW4gd2hlbiB0YXJnZXQgaXNcbiAgLy8gc3BlY2lmaWVkLCBldmVuIHRob3VnaCB0aGUgcG9wdXAgaXMgbm90IG5lY2Vzc2FyaWx5IGJsb2NrZWQuXG4gIGNvbnN0IHVhID0gZ2V0VUEoKS50b0xvd2VyQ2FzZSgpO1xuXG4gIGlmIChuYW1lKSB7XG4gICAgdGFyZ2V0ID0gX2lzQ2hyb21lSU9TKHVhKSA/IFRBUkdFVF9CTEFOSyA6IG5hbWU7XG4gIH1cblxuICBpZiAoX2lzRmlyZWZveCh1YSkpIHtcbiAgICAvLyBGaXJlZm94IGNvbXBsYWlucyB3aGVuIGludmFsaWQgVVJMcyBhcmUgcG9wcGVkIG91dC4gSGFja3kgd2F5IHRvIGJ5cGFzcy5cbiAgICB1cmwgPSB1cmwgfHwgRklSRUZPWF9FTVBUWV9VUkw7XG4gICAgLy8gRmlyZWZveCBkaXNhYmxlcyBieSBkZWZhdWx0IHNjcm9sbGluZyBvbiBwb3B1cCB3aW5kb3dzLCB3aGljaCBjYW4gY3JlYXRlXG4gICAgLy8gaXNzdWVzIHdoZW4gdGhlIHVzZXIgaGFzIG1hbnkgR29vZ2xlIGFjY291bnRzLCBmb3IgaW5zdGFuY2UuXG4gICAgb3B0aW9ucy5zY3JvbGxiYXJzID0gJ3llcyc7XG4gIH1cblxuICBjb25zdCBvcHRpb25zU3RyaW5nID0gT2JqZWN0LmVudHJpZXMob3B0aW9ucykucmVkdWNlKFxuICAgIChhY2N1bSwgW2tleSwgdmFsdWVdKSA9PiBgJHthY2N1bX0ke2tleX09JHt2YWx1ZX0sYCxcbiAgICAnJ1xuICApO1xuXG4gIGlmIChfaXNJT1NTdGFuZGFsb25lKHVhKSAmJiB0YXJnZXQgIT09ICdfc2VsZicpIHtcbiAgICBvcGVuQXNOZXdXaW5kb3dJT1ModXJsIHx8ICcnLCB0YXJnZXQpO1xuICAgIHJldHVybiBuZXcgQXV0aFBvcHVwKG51bGwpO1xuICB9XG5cbiAgLy8gYWJvdXQ6YmxhbmsgZ2V0dGluZyBzYW5pdGl6ZWQgY2F1c2luZyBicm93c2VycyBsaWtlIElFL0VkZ2UgdG8gZGlzcGxheVxuICAvLyBicmllZiBlcnJvciBtZXNzYWdlIGJlZm9yZSByZWRpcmVjdGluZyB0byBoYW5kbGVyLlxuICBjb25zdCBuZXdXaW4gPSB3aW5kb3cub3Blbih1cmwgfHwgJycsIHRhcmdldCwgb3B0aW9uc1N0cmluZyk7XG4gIF9hc3NlcnQobmV3V2luLCBhdXRoLCBBdXRoRXJyb3JDb2RlLlBPUFVQX0JMT0NLRUQpO1xuXG4gIC8vIEZsYWt5IG9uIElFIGVkZ2UsIGVuY2Fwc3VsYXRlIHdpdGggYSB0cnkgYW5kIGNhdGNoLlxuICB0cnkge1xuICAgIG5ld1dpbi5mb2N1cygpO1xuICB9IGNhdGNoIChlKSB7fVxuXG4gIHJldHVybiBuZXcgQXV0aFBvcHVwKG5ld1dpbik7XG59XG5cbmZ1bmN0aW9uIG9wZW5Bc05ld1dpbmRvd0lPUyh1cmw6IHN0cmluZywgdGFyZ2V0OiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gIGVsLmhyZWYgPSB1cmw7XG4gIGVsLnRhcmdldCA9IHRhcmdldDtcbiAgY29uc3QgY2xpY2sgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnTW91c2VFdmVudCcpO1xuICBjbGljay5pbml0TW91c2VFdmVudChcbiAgICAnY2xpY2snLFxuICAgIHRydWUsXG4gICAgdHJ1ZSxcbiAgICB3aW5kb3csXG4gICAgMSxcbiAgICAwLFxuICAgIDAsXG4gICAgMCxcbiAgICAwLFxuICAgIGZhbHNlLFxuICAgIGZhbHNlLFxuICAgIGZhbHNlLFxuICAgIGZhbHNlLFxuICAgIDEsXG4gICAgbnVsbFxuICApO1xuICBlbC5kaXNwYXRjaEV2ZW50KGNsaWNrKTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBTREtfVkVSU0lPTiB9IGZyb20gJ0BmaXJlYmFzZS9hcHAnO1xuaW1wb3J0IHsgQXV0aFByb3ZpZGVyIH0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcbmltcG9ydCB7IEFwaUtleSwgQXBwTmFtZSwgQXV0aEludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvYXV0aCc7XG5pbXBvcnQgeyBBdXRoRXZlbnRUeXBlIH0gZnJvbSAnLi4vLi4vbW9kZWwvcG9wdXBfcmVkaXJlY3QnO1xuaW1wb3J0IHsgQXV0aEVycm9yQ29kZSB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBfYXNzZXJ0IH0gZnJvbSAnLi9hc3NlcnQnO1xuaW1wb3J0IHsgaXNFbXB0eSwgcXVlcnlzdHJpbmcgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5pbXBvcnQgeyBfZW11bGF0b3JVcmwgfSBmcm9tICcuL2VtdWxhdG9yJztcbmltcG9ydCB7IEZlZGVyYXRlZEF1dGhQcm92aWRlciB9IGZyb20gJy4uL3Byb3ZpZGVycy9mZWRlcmF0ZWQnO1xuaW1wb3J0IHsgQmFzZU9BdXRoUHJvdmlkZXIgfSBmcm9tICcuLi9wcm92aWRlcnMvb2F1dGgnO1xuXG4vKipcbiAqIFVSTCBmb3IgQXV0aGVudGljYXRpb24gd2lkZ2V0IHdoaWNoIHdpbGwgaW5pdGlhdGUgdGhlIE9BdXRoIGhhbmRzaGFrZVxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5jb25zdCBXSURHRVRfUEFUSCA9ICdfXy9hdXRoL2hhbmRsZXInO1xuXG4vKipcbiAqIFVSTCBmb3IgZW11bGF0ZWQgZW52aXJvbm1lbnRcbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuY29uc3QgRU1VTEFUT1JfV0lER0VUX1BBVEggPSAnZW11bGF0b3IvYXV0aC9oYW5kbGVyJztcblxuLyoqXG4gKiBGcmFnbWVudCBuYW1lIGZvciB0aGUgQXBwIENoZWNrIHRva2VuIHRoYXQgZ2V0cyBwYXNzZWQgdG8gdGhlIHdpZGdldFxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5jb25zdCBGSVJFQkFTRV9BUFBfQ0hFQ0tfRlJBR01FTlRfSUQgPSBlbmNvZGVVUklDb21wb25lbnQoJ2ZhYycpO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2NvbnNpc3RlbnQtdHlwZS1kZWZpbml0aW9uc1xudHlwZSBXaWRnZXRQYXJhbXMgPSB7XG4gIGFwaUtleTogQXBpS2V5O1xuICBhcHBOYW1lOiBBcHBOYW1lO1xuICBhdXRoVHlwZTogQXV0aEV2ZW50VHlwZTtcbiAgcmVkaXJlY3RVcmw/OiBzdHJpbmc7XG4gIHY6IHN0cmluZztcbiAgcHJvdmlkZXJJZD86IHN0cmluZztcbiAgc2NvcGVzPzogc3RyaW5nO1xuICBjdXN0b21QYXJhbWV0ZXJzPzogc3RyaW5nO1xuICBldmVudElkPzogc3RyaW5nO1xuICB0aWQ/OiBzdHJpbmc7XG59ICYgeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCB1bmRlZmluZWQgfTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIF9nZXRSZWRpcmVjdFVybChcbiAgYXV0aDogQXV0aEludGVybmFsLFxuICBwcm92aWRlcjogQXV0aFByb3ZpZGVyLFxuICBhdXRoVHlwZTogQXV0aEV2ZW50VHlwZSxcbiAgcmVkaXJlY3RVcmw/OiBzdHJpbmcsXG4gIGV2ZW50SWQ/OiBzdHJpbmcsXG4gIGFkZGl0aW9uYWxQYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBfYXNzZXJ0KGF1dGguY29uZmlnLmF1dGhEb21haW4sIGF1dGgsIEF1dGhFcnJvckNvZGUuTUlTU0lOR19BVVRIX0RPTUFJTik7XG4gIF9hc3NlcnQoYXV0aC5jb25maWcuYXBpS2V5LCBhdXRoLCBBdXRoRXJyb3JDb2RlLklOVkFMSURfQVBJX0tFWSk7XG5cbiAgY29uc3QgcGFyYW1zOiBXaWRnZXRQYXJhbXMgPSB7XG4gICAgYXBpS2V5OiBhdXRoLmNvbmZpZy5hcGlLZXksXG4gICAgYXBwTmFtZTogYXV0aC5uYW1lLFxuICAgIGF1dGhUeXBlLFxuICAgIHJlZGlyZWN0VXJsLFxuICAgIHY6IFNES19WRVJTSU9OLFxuICAgIGV2ZW50SWRcbiAgfTtcblxuICBpZiAocHJvdmlkZXIgaW5zdGFuY2VvZiBGZWRlcmF0ZWRBdXRoUHJvdmlkZXIpIHtcbiAgICBwcm92aWRlci5zZXREZWZhdWx0TGFuZ3VhZ2UoYXV0aC5sYW5ndWFnZUNvZGUpO1xuICAgIHBhcmFtcy5wcm92aWRlcklkID0gcHJvdmlkZXIucHJvdmlkZXJJZCB8fCAnJztcbiAgICBpZiAoIWlzRW1wdHkocHJvdmlkZXIuZ2V0Q3VzdG9tUGFyYW1ldGVycygpKSkge1xuICAgICAgcGFyYW1zLmN1c3RvbVBhcmFtZXRlcnMgPSBKU09OLnN0cmluZ2lmeShwcm92aWRlci5nZXRDdXN0b21QYXJhbWV0ZXJzKCkpO1xuICAgIH1cblxuICAgIC8vIFRPRE8gc2V0IGFkZGl0aW9uYWxQYXJhbXMgZnJvbSB0aGUgcHJvdmlkZXIgYXMgd2VsbD9cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhZGRpdGlvbmFsUGFyYW1zIHx8IHt9KSkge1xuICAgICAgcGFyYW1zW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAocHJvdmlkZXIgaW5zdGFuY2VvZiBCYXNlT0F1dGhQcm92aWRlcikge1xuICAgIGNvbnN0IHNjb3BlcyA9IHByb3ZpZGVyLmdldFNjb3BlcygpLmZpbHRlcihzY29wZSA9PiBzY29wZSAhPT0gJycpO1xuICAgIGlmIChzY29wZXMubGVuZ3RoID4gMCkge1xuICAgICAgcGFyYW1zLnNjb3BlcyA9IHNjb3Blcy5qb2luKCcsJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGF1dGgudGVuYW50SWQpIHtcbiAgICBwYXJhbXMudGlkID0gYXV0aC50ZW5hbnRJZDtcbiAgfVxuXG4gIC8vIFRPRE86IG1heWJlIHNldCBlaWQgYXMgZW5kaXBvaW50SWRcbiAgLy8gVE9ETzogbWF5YmUgc2V0IGZ3IGFzIEZyYW1ld29ya3Muam9pbihcIixcIilcblxuICBjb25zdCBwYXJhbXNEaWN0ID0gcGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlcj47XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHBhcmFtc0RpY3QpKSB7XG4gICAgaWYgKHBhcmFtc0RpY3Rba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZWxldGUgcGFyYW1zRGljdFtrZXldO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNldHMgdGhlIEFwcCBDaGVjayB0b2tlbiB0byBwYXNzIHRvIHRoZSB3aWRnZXRcbiAgY29uc3QgYXBwQ2hlY2tUb2tlbiA9IGF3YWl0IGF1dGguX2dldEFwcENoZWNrVG9rZW4oKTtcbiAgY29uc3QgYXBwQ2hlY2tUb2tlbkZyYWdtZW50ID0gYXBwQ2hlY2tUb2tlblxuICAgID8gYCMke0ZJUkVCQVNFX0FQUF9DSEVDS19GUkFHTUVOVF9JRH09JHtlbmNvZGVVUklDb21wb25lbnQoYXBwQ2hlY2tUb2tlbil9YFxuICAgIDogJyc7XG5cbiAgLy8gU3RhcnQgYXQgaW5kZXggMSB0byBza2lwIHRoZSBsZWFkaW5nICcmJyBpbiB0aGUgcXVlcnkgc3RyaW5nXG4gIHJldHVybiBgJHtnZXRIYW5kbGVyQmFzZShhdXRoKX0/JHtxdWVyeXN0cmluZyhwYXJhbXNEaWN0KS5zbGljZShcbiAgICAxXG4gICl9JHthcHBDaGVja1Rva2VuRnJhZ21lbnR9YDtcbn1cblxuZnVuY3Rpb24gZ2V0SGFuZGxlckJhc2UoeyBjb25maWcgfTogQXV0aEludGVybmFsKTogc3RyaW5nIHtcbiAgaWYgKCFjb25maWcuZW11bGF0b3IpIHtcbiAgICByZXR1cm4gYGh0dHBzOi8vJHtjb25maWcuYXV0aERvbWFpbn0vJHtXSURHRVRfUEFUSH1gO1xuICB9XG5cbiAgcmV0dXJuIF9lbXVsYXRvclVybChjb25maWcsIEVNVUxBVE9SX1dJREdFVF9QQVRIKTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBBdXRoUHJvdmlkZXIsIFBvcHVwUmVkaXJlY3RSZXNvbHZlciB9IGZyb20gJy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5cbmltcG9ydCB7IEF1dGhFdmVudE1hbmFnZXIgfSBmcm9tICcuLi9jb3JlL2F1dGgvYXV0aF9ldmVudF9tYW5hZ2VyJztcbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi9jb3JlL2Vycm9ycyc7XG5pbXBvcnQgeyBfYXNzZXJ0LCBkZWJ1Z0Fzc2VydCwgX2ZhaWwgfSBmcm9tICcuLi9jb3JlL3V0aWwvYXNzZXJ0JztcbmltcG9ydCB7IF9nZW5lcmF0ZUV2ZW50SWQgfSBmcm9tICcuLi9jb3JlL3V0aWwvZXZlbnRfaWQnO1xuaW1wb3J0IHsgX2dldEN1cnJlbnRVcmwgfSBmcm9tICcuLi9jb3JlL3V0aWwvbG9jYXRpb24nO1xuaW1wb3J0IHsgX3ZhbGlkYXRlT3JpZ2luIH0gZnJvbSAnLi4vY29yZS91dGlsL3ZhbGlkYXRlX29yaWdpbic7XG5pbXBvcnQgeyBBdXRoSW50ZXJuYWwgfSBmcm9tICcuLi9tb2RlbC9hdXRoJztcbmltcG9ydCB7XG4gIEF1dGhFdmVudFR5cGUsXG4gIEV2ZW50TWFuYWdlcixcbiAgR2FwaUF1dGhFdmVudCxcbiAgR2FwaU91dGNvbWUsXG4gIFBvcHVwUmVkaXJlY3RSZXNvbHZlckludGVybmFsXG59IGZyb20gJy4uL21vZGVsL3BvcHVwX3JlZGlyZWN0JztcbmltcG9ydCB7IF9zZXRXaW5kb3dMb2NhdGlvbiB9IGZyb20gJy4vYXV0aF93aW5kb3cnO1xuaW1wb3J0IHsgX29wZW5JZnJhbWUgfSBmcm9tICcuL2lmcmFtZS9pZnJhbWUnO1xuaW1wb3J0IHsgYnJvd3NlclNlc3Npb25QZXJzaXN0ZW5jZSB9IGZyb20gJy4vcGVyc2lzdGVuY2Uvc2Vzc2lvbl9zdG9yYWdlJztcbmltcG9ydCB7IF9vcGVuLCBBdXRoUG9wdXAgfSBmcm9tICcuL3V0aWwvcG9wdXAnO1xuaW1wb3J0IHsgX2dldFJlZGlyZWN0UmVzdWx0IH0gZnJvbSAnLi9zdHJhdGVnaWVzL3JlZGlyZWN0JztcbmltcG9ydCB7IF9nZXRSZWRpcmVjdFVybCB9IGZyb20gJy4uL2NvcmUvdXRpbC9oYW5kbGVyJztcbmltcG9ydCB7IF9pc0lPUywgX2lzTW9iaWxlQnJvd3NlciwgX2lzU2FmYXJpIH0gZnJvbSAnLi4vY29yZS91dGlsL2Jyb3dzZXInO1xuaW1wb3J0IHsgX292ZXJyaWRlUmVkaXJlY3RSZXN1bHQgfSBmcm9tICcuLi9jb3JlL3N0cmF0ZWdpZXMvcmVkaXJlY3QnO1xuXG4vKipcbiAqIFRoZSBzcGVjaWFsIHdlYiBzdG9yYWdlIGV2ZW50XG4gKlxuICovXG5jb25zdCBXRUJfU1RPUkFHRV9TVVBQT1JUX0tFWSA9ICd3ZWJTdG9yYWdlU3VwcG9ydCc7XG5cbmludGVyZmFjZSBXZWJTdG9yYWdlU3VwcG9ydE1lc3NhZ2UgZXh0ZW5kcyBnYXBpLmlmcmFtZXMuTWVzc2FnZSB7XG4gIFtpbmRleDogbnVtYmVyXTogUmVjb3JkPHN0cmluZywgYm9vbGVhbj47XG59XG5cbmludGVyZmFjZSBNYW5hZ2VyT3JQcm9taXNlIHtcbiAgbWFuYWdlcj86IEV2ZW50TWFuYWdlcjtcbiAgcHJvbWlzZT86IFByb21pc2U8RXZlbnRNYW5hZ2VyPjtcbn1cblxuY2xhc3MgQnJvd3NlclBvcHVwUmVkaXJlY3RSZXNvbHZlciBpbXBsZW1lbnRzIFBvcHVwUmVkaXJlY3RSZXNvbHZlckludGVybmFsIHtcbiAgcHJpdmF0ZSByZWFkb25seSBldmVudE1hbmFnZXJzOiBSZWNvcmQ8c3RyaW5nLCBNYW5hZ2VyT3JQcm9taXNlPiA9IHt9O1xuICBwcml2YXRlIHJlYWRvbmx5IGlmcmFtZXM6IFJlY29yZDxzdHJpbmcsIGdhcGkuaWZyYW1lcy5JZnJhbWU+ID0ge307XG4gIHByaXZhdGUgcmVhZG9ubHkgb3JpZ2luVmFsaWRhdGlvblByb21pc2VzOiBSZWNvcmQ8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PiA9IHt9O1xuXG4gIHJlYWRvbmx5IF9yZWRpcmVjdFBlcnNpc3RlbmNlID0gYnJvd3NlclNlc3Npb25QZXJzaXN0ZW5jZTtcblxuICAvLyBXcmFwcGluZyBpbiBhc3luYyBldmVuIHRob3VnaCB3ZSBkb24ndCBhd2FpdCBhbnl3aGVyZSBpbiBvcmRlclxuICAvLyB0byBtYWtlIHN1cmUgZXJyb3JzIGFyZSByYWlzZWQgYXMgcHJvbWlzZSByZWplY3Rpb25zXG4gIGFzeW5jIF9vcGVuUG9wdXAoXG4gICAgYXV0aDogQXV0aEludGVybmFsLFxuICAgIHByb3ZpZGVyOiBBdXRoUHJvdmlkZXIsXG4gICAgYXV0aFR5cGU6IEF1dGhFdmVudFR5cGUsXG4gICAgZXZlbnRJZD86IHN0cmluZ1xuICApOiBQcm9taXNlPEF1dGhQb3B1cD4ge1xuICAgIGRlYnVnQXNzZXJ0KFxuICAgICAgdGhpcy5ldmVudE1hbmFnZXJzW2F1dGguX2tleSgpXT8ubWFuYWdlcixcbiAgICAgICdfaW5pdGlhbGl6ZSgpIG5vdCBjYWxsZWQgYmVmb3JlIF9vcGVuUG9wdXAoKSdcbiAgICApO1xuXG4gICAgY29uc3QgdXJsID0gYXdhaXQgX2dldFJlZGlyZWN0VXJsKFxuICAgICAgYXV0aCxcbiAgICAgIHByb3ZpZGVyLFxuICAgICAgYXV0aFR5cGUsXG4gICAgICBfZ2V0Q3VycmVudFVybCgpLFxuICAgICAgZXZlbnRJZFxuICAgICk7XG4gICAgcmV0dXJuIF9vcGVuKGF1dGgsIHVybCwgX2dlbmVyYXRlRXZlbnRJZCgpKTtcbiAgfVxuXG4gIGFzeW5jIF9vcGVuUmVkaXJlY3QoXG4gICAgYXV0aDogQXV0aEludGVybmFsLFxuICAgIHByb3ZpZGVyOiBBdXRoUHJvdmlkZXIsXG4gICAgYXV0aFR5cGU6IEF1dGhFdmVudFR5cGUsXG4gICAgZXZlbnRJZD86IHN0cmluZ1xuICApOiBQcm9taXNlPG5ldmVyPiB7XG4gICAgYXdhaXQgdGhpcy5fb3JpZ2luVmFsaWRhdGlvbihhdXRoKTtcbiAgICBjb25zdCB1cmwgPSBhd2FpdCBfZ2V0UmVkaXJlY3RVcmwoXG4gICAgICBhdXRoLFxuICAgICAgcHJvdmlkZXIsXG4gICAgICBhdXRoVHlwZSxcbiAgICAgIF9nZXRDdXJyZW50VXJsKCksXG4gICAgICBldmVudElkXG4gICAgKTtcbiAgICBfc2V0V2luZG93TG9jYXRpb24odXJsKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKCkgPT4ge30pO1xuICB9XG5cbiAgX2luaXRpYWxpemUoYXV0aDogQXV0aEludGVybmFsKTogUHJvbWlzZTxFdmVudE1hbmFnZXI+IHtcbiAgICBjb25zdCBrZXkgPSBhdXRoLl9rZXkoKTtcbiAgICBpZiAodGhpcy5ldmVudE1hbmFnZXJzW2tleV0pIHtcbiAgICAgIGNvbnN0IHsgbWFuYWdlciwgcHJvbWlzZSB9ID0gdGhpcy5ldmVudE1hbmFnZXJzW2tleV07XG4gICAgICBpZiAobWFuYWdlcikge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1hbmFnZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVidWdBc3NlcnQocHJvbWlzZSwgJ0lmIG1hbmFnZXIgaXMgbm90IHNldCwgcHJvbWlzZSBzaG91bGQgYmUnKTtcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcHJvbWlzZSA9IHRoaXMuaW5pdEFuZEdldE1hbmFnZXIoYXV0aCk7XG4gICAgdGhpcy5ldmVudE1hbmFnZXJzW2tleV0gPSB7IHByb21pc2UgfTtcblxuICAgIC8vIElmIHRoZSBwcm9taXNlIGlzIHJlamVjdGVkLCB0aGUga2V5IHNob3VsZCBiZSByZW1vdmVkIHNvIHRoYXQgdGhlXG4gICAgLy8gb3BlcmF0aW9uIGNhbiBiZSByZXRyaWVkIGxhdGVyLlxuICAgIHByb21pc2UuY2F0Y2goKCkgPT4ge1xuICAgICAgZGVsZXRlIHRoaXMuZXZlbnRNYW5hZ2Vyc1trZXldO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGluaXRBbmRHZXRNYW5hZ2VyKGF1dGg6IEF1dGhJbnRlcm5hbCk6IFByb21pc2U8RXZlbnRNYW5hZ2VyPiB7XG4gICAgY29uc3QgaWZyYW1lID0gYXdhaXQgX29wZW5JZnJhbWUoYXV0aCk7XG4gICAgY29uc3QgbWFuYWdlciA9IG5ldyBBdXRoRXZlbnRNYW5hZ2VyKGF1dGgpO1xuICAgIGlmcmFtZS5yZWdpc3RlcjxHYXBpQXV0aEV2ZW50PihcbiAgICAgICdhdXRoRXZlbnQnLFxuICAgICAgKGlmcmFtZUV2ZW50OiBHYXBpQXV0aEV2ZW50IHwgbnVsbCkgPT4ge1xuICAgICAgICBfYXNzZXJ0KGlmcmFtZUV2ZW50Py5hdXRoRXZlbnQsIGF1dGgsIEF1dGhFcnJvckNvZGUuSU5WQUxJRF9BVVRIX0VWRU5UKTtcbiAgICAgICAgLy8gVE9ETzogQ29uc2lkZXIgc3BsaXR0aW5nIHJlZGlyZWN0IGFuZCBwb3B1cCBldmVudHMgZWFybGllciBvblxuXG4gICAgICAgIGNvbnN0IGhhbmRsZWQgPSBtYW5hZ2VyLm9uRXZlbnQoaWZyYW1lRXZlbnQuYXV0aEV2ZW50KTtcbiAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBoYW5kbGVkID8gR2FwaU91dGNvbWUuQUNLIDogR2FwaU91dGNvbWUuRVJST1IgfTtcbiAgICAgIH0sXG4gICAgICBnYXBpLmlmcmFtZXMuQ1JPU1NfT1JJR0lOX0lGUkFNRVNfRklMVEVSXG4gICAgKTtcblxuICAgIHRoaXMuZXZlbnRNYW5hZ2Vyc1thdXRoLl9rZXkoKV0gPSB7IG1hbmFnZXIgfTtcbiAgICB0aGlzLmlmcmFtZXNbYXV0aC5fa2V5KCldID0gaWZyYW1lO1xuICAgIHJldHVybiBtYW5hZ2VyO1xuICB9XG5cbiAgX2lzSWZyYW1lV2ViU3RvcmFnZVN1cHBvcnRlZChcbiAgICBhdXRoOiBBdXRoSW50ZXJuYWwsXG4gICAgY2I6IChzdXBwb3J0ZWQ6IGJvb2xlYW4pID0+IHVua25vd25cbiAgKTogdm9pZCB7XG4gICAgY29uc3QgaWZyYW1lID0gdGhpcy5pZnJhbWVzW2F1dGguX2tleSgpXTtcbiAgICBpZnJhbWUuc2VuZDxnYXBpLmlmcmFtZXMuTWVzc2FnZSwgV2ViU3RvcmFnZVN1cHBvcnRNZXNzYWdlPihcbiAgICAgIFdFQl9TVE9SQUdFX1NVUFBPUlRfS0VZLFxuICAgICAgeyB0eXBlOiBXRUJfU1RPUkFHRV9TVVBQT1JUX0tFWSB9LFxuICAgICAgcmVzdWx0ID0+IHtcbiAgICAgICAgY29uc3QgaXNTdXBwb3J0ZWQgPSByZXN1bHQ/LlswXT8uW1dFQl9TVE9SQUdFX1NVUFBPUlRfS0VZXTtcbiAgICAgICAgaWYgKGlzU3VwcG9ydGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjYighIWlzU3VwcG9ydGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIF9mYWlsKGF1dGgsIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IpO1xuICAgICAgfSxcbiAgICAgIGdhcGkuaWZyYW1lcy5DUk9TU19PUklHSU5fSUZSQU1FU19GSUxURVJcbiAgICApO1xuICB9XG5cbiAgX29yaWdpblZhbGlkYXRpb24oYXV0aDogQXV0aEludGVybmFsKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qga2V5ID0gYXV0aC5fa2V5KCk7XG4gICAgaWYgKCF0aGlzLm9yaWdpblZhbGlkYXRpb25Qcm9taXNlc1trZXldKSB7XG4gICAgICB0aGlzLm9yaWdpblZhbGlkYXRpb25Qcm9taXNlc1trZXldID0gX3ZhbGlkYXRlT3JpZ2luKGF1dGgpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLm9yaWdpblZhbGlkYXRpb25Qcm9taXNlc1trZXldO1xuICB9XG5cbiAgZ2V0IF9zaG91bGRJbml0UHJvYWN0aXZlbHkoKTogYm9vbGVhbiB7XG4gICAgLy8gTW9iaWxlIGJyb3dzZXJzIGFuZCBTYWZhcmkgbmVlZCB0byBvcHRpbWlzdGljYWxseSBpbml0aWFsaXplXG4gICAgcmV0dXJuIF9pc01vYmlsZUJyb3dzZXIoKSB8fCBfaXNTYWZhcmkoKSB8fCBfaXNJT1MoKTtcbiAgfVxuXG4gIF9jb21wbGV0ZVJlZGlyZWN0Rm4gPSBfZ2V0UmVkaXJlY3RSZXN1bHQ7XG5cbiAgX292ZXJyaWRlUmVkaXJlY3RSZXN1bHQgPSBfb3ZlcnJpZGVSZWRpcmVjdFJlc3VsdDtcbn1cblxuLyoqXG4gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgUG9wdXBSZWRpcmVjdFJlc29sdmVyfSBzdWl0YWJsZSBmb3IgYnJvd3NlclxuICogYmFzZWQgYXBwbGljYXRpb25zLlxuICpcbiAqIEByZW1hcmtzXG4gKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCB3b3JrIGluIGEgTm9kZS5qcyBlbnZpcm9ubWVudC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBicm93c2VyUG9wdXBSZWRpcmVjdFJlc29sdmVyOiBQb3B1cFJlZGlyZWN0UmVzb2x2ZXIgPVxuICBCcm93c2VyUG9wdXBSZWRpcmVjdFJlc29sdmVyO1xuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgeyBGYWN0b3JJZCwgTXVsdGlGYWN0b3JBc3NlcnRpb24gfSBmcm9tICcuLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuaW1wb3J0IHsgZGVidWdGYWlsIH0gZnJvbSAnLi4vY29yZS91dGlsL2Fzc2VydCc7XG5pbXBvcnQgeyBNdWx0aUZhY3RvclNlc3Npb25JbXBsLCBNdWx0aUZhY3RvclNlc3Npb25UeXBlIH0gZnJvbSAnLi9tZmFfc2Vzc2lvbic7XG5pbXBvcnQgeyBGaW5hbGl6ZU1mYVJlc3BvbnNlIH0gZnJvbSAnLi4vYXBpL2F1dGhlbnRpY2F0aW9uL21mYSc7XG5pbXBvcnQgeyBBdXRoSW50ZXJuYWwgfSBmcm9tICcuLi9tb2RlbC9hdXRoJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE11bHRpRmFjdG9yQXNzZXJ0aW9uSW1wbCBpbXBsZW1lbnRzIE11bHRpRmFjdG9yQXNzZXJ0aW9uIHtcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHJlYWRvbmx5IGZhY3RvcklkOiBGYWN0b3JJZCkge31cblxuICBfcHJvY2VzcyhcbiAgICBhdXRoOiBBdXRoSW50ZXJuYWwsXG4gICAgc2Vzc2lvbjogTXVsdGlGYWN0b3JTZXNzaW9uSW1wbCxcbiAgICBkaXNwbGF5TmFtZT86IHN0cmluZyB8IG51bGxcbiAgKTogUHJvbWlzZTxGaW5hbGl6ZU1mYVJlc3BvbnNlPiB7XG4gICAgc3dpdGNoIChzZXNzaW9uLnR5cGUpIHtcbiAgICAgIGNhc2UgTXVsdGlGYWN0b3JTZXNzaW9uVHlwZS5FTlJPTEw6XG4gICAgICAgIHJldHVybiB0aGlzLl9maW5hbGl6ZUVucm9sbChhdXRoLCBzZXNzaW9uLmNyZWRlbnRpYWwsIGRpc3BsYXlOYW1lKTtcbiAgICAgIGNhc2UgTXVsdGlGYWN0b3JTZXNzaW9uVHlwZS5TSUdOX0lOOlxuICAgICAgICByZXR1cm4gdGhpcy5fZmluYWxpemVTaWduSW4oYXV0aCwgc2Vzc2lvbi5jcmVkZW50aWFsKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBkZWJ1Z0ZhaWwoJ3VuZXhwZWN0ZWQgTXVsdGlGYWN0b3JTZXNzaW9uVHlwZScpO1xuICAgIH1cbiAgfVxuXG4gIGFic3RyYWN0IF9maW5hbGl6ZUVucm9sbChcbiAgICBhdXRoOiBBdXRoSW50ZXJuYWwsXG4gICAgaWRUb2tlbjogc3RyaW5nLFxuICAgIGRpc3BsYXlOYW1lPzogc3RyaW5nIHwgbnVsbFxuICApOiBQcm9taXNlPEZpbmFsaXplTWZhUmVzcG9uc2U+O1xuICBhYnN0cmFjdCBfZmluYWxpemVTaWduSW4oXG4gICAgYXV0aDogQXV0aEludGVybmFsLFxuICAgIG1mYVBlbmRpbmdDcmVkZW50aWFsOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxGaW5hbGl6ZU1mYVJlc3BvbnNlPjtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHtcbiAgRmFjdG9ySWQsXG4gIFBob25lTXVsdGlGYWN0b3JBc3NlcnRpb25cbn0gZnJvbSAnLi4vLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcblxuaW1wb3J0IHsgTXVsdGlGYWN0b3JBc3NlcnRpb25JbXBsIH0gZnJvbSAnLi4vLi4vLi4vbWZhL21mYV9hc3NlcnRpb24nO1xuaW1wb3J0IHsgQXV0aEludGVybmFsIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWwvYXV0aCc7XG5pbXBvcnQgeyBmaW5hbGl6ZUVucm9sbFBob25lTWZhIH0gZnJvbSAnLi4vLi4vLi4vYXBpL2FjY291bnRfbWFuYWdlbWVudC9tZmEnO1xuaW1wb3J0IHsgUGhvbmVBdXRoQ3JlZGVudGlhbCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvY3JlZGVudGlhbHMvcGhvbmUnO1xuaW1wb3J0IHtcbiAgZmluYWxpemVTaWduSW5QaG9uZU1mYSxcbiAgRmluYWxpemVNZmFSZXNwb25zZVxufSBmcm9tICcuLi8uLi8uLi9hcGkvYXV0aGVudGljYXRpb24vbWZhJztcblxuLyoqXG4gKiB7QGluaGVyaXRkb2MgUGhvbmVNdWx0aUZhY3RvckFzc2VydGlvbn1cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBQaG9uZU11bHRpRmFjdG9yQXNzZXJ0aW9uSW1wbFxuICBleHRlbmRzIE11bHRpRmFjdG9yQXNzZXJ0aW9uSW1wbFxuICBpbXBsZW1lbnRzIFBob25lTXVsdGlGYWN0b3JBc3NlcnRpb25cbntcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGNyZWRlbnRpYWw6IFBob25lQXV0aENyZWRlbnRpYWwpIHtcbiAgICBzdXBlcihGYWN0b3JJZC5QSE9ORSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHN0YXRpYyBfZnJvbUNyZWRlbnRpYWwoXG4gICAgY3JlZGVudGlhbDogUGhvbmVBdXRoQ3JlZGVudGlhbFxuICApOiBQaG9uZU11bHRpRmFjdG9yQXNzZXJ0aW9uSW1wbCB7XG4gICAgcmV0dXJuIG5ldyBQaG9uZU11bHRpRmFjdG9yQXNzZXJ0aW9uSW1wbChjcmVkZW50aWFsKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2ZpbmFsaXplRW5yb2xsKFxuICAgIGF1dGg6IEF1dGhJbnRlcm5hbCxcbiAgICBpZFRva2VuOiBzdHJpbmcsXG4gICAgZGlzcGxheU5hbWU/OiBzdHJpbmcgfCBudWxsXG4gICk6IFByb21pc2U8RmluYWxpemVNZmFSZXNwb25zZT4ge1xuICAgIHJldHVybiBmaW5hbGl6ZUVucm9sbFBob25lTWZhKGF1dGgsIHtcbiAgICAgIGlkVG9rZW4sXG4gICAgICBkaXNwbGF5TmFtZSxcbiAgICAgIHBob25lVmVyaWZpY2F0aW9uSW5mbzogdGhpcy5jcmVkZW50aWFsLl9tYWtlVmVyaWZpY2F0aW9uUmVxdWVzdCgpXG4gICAgfSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9maW5hbGl6ZVNpZ25JbihcbiAgICBhdXRoOiBBdXRoSW50ZXJuYWwsXG4gICAgbWZhUGVuZGluZ0NyZWRlbnRpYWw6IHN0cmluZ1xuICApOiBQcm9taXNlPEZpbmFsaXplTWZhUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gZmluYWxpemVTaWduSW5QaG9uZU1mYShhdXRoLCB7XG4gICAgICBtZmFQZW5kaW5nQ3JlZGVudGlhbCxcbiAgICAgIHBob25lVmVyaWZpY2F0aW9uSW5mbzogdGhpcy5jcmVkZW50aWFsLl9tYWtlVmVyaWZpY2F0aW9uUmVxdWVzdCgpXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBQcm92aWRlciBmb3IgZ2VuZXJhdGluZyBhIHtAbGluayBQaG9uZU11bHRpRmFjdG9yQXNzZXJ0aW9ufS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBQaG9uZU11bHRpRmFjdG9yR2VuZXJhdG9yIHtcbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIGEge0BsaW5rIFBob25lTXVsdGlGYWN0b3JBc3NlcnRpb259IHRvIGNvbmZpcm0gb3duZXJzaGlwIG9mIHRoZSBwaG9uZSBzZWNvbmQgZmFjdG9yLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCB3b3JrIGluIGEgTm9kZS5qcyBlbnZpcm9ubWVudC5cbiAgICpcbiAgICogQHBhcmFtIHBob25lQXV0aENyZWRlbnRpYWwgLSBBIGNyZWRlbnRpYWwgcHJvdmlkZWQgYnkge0BsaW5rIFBob25lQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWx9LlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQaG9uZU11bHRpRmFjdG9yQXNzZXJ0aW9ufSB3aGljaCBjYW4gYmUgdXNlZCB3aXRoXG4gICAqIHtAbGluayBNdWx0aUZhY3RvclJlc29sdmVyLnJlc29sdmVTaWduSW59XG4gICAqL1xuICBzdGF0aWMgYXNzZXJ0aW9uKGNyZWRlbnRpYWw6IFBob25lQXV0aENyZWRlbnRpYWwpOiBQaG9uZU11bHRpRmFjdG9yQXNzZXJ0aW9uIHtcbiAgICByZXR1cm4gUGhvbmVNdWx0aUZhY3RvckFzc2VydGlvbkltcGwuX2Zyb21DcmVkZW50aWFsKGNyZWRlbnRpYWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBwaG9uZSBzZWNvbmQgZmFjdG9yOiBgcGhvbmVgLlxuICAgKi9cbiAgc3RhdGljIEZBQ1RPUl9JRCA9ICdwaG9uZSc7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7XG4gIFRvdHBNdWx0aUZhY3RvckFzc2VydGlvbixcbiAgTXVsdGlGYWN0b3JTZXNzaW9uLFxuICBGYWN0b3JJZFxufSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuaW1wb3J0IHsgQXV0aEludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvYXV0aCc7XG5pbXBvcnQge1xuICBmaW5hbGl6ZUVucm9sbFRvdHBNZmEsXG4gIHN0YXJ0RW5yb2xsVG90cE1mYSxcbiAgU3RhcnRUb3RwTWZhRW5yb2xsbWVudFJlc3BvbnNlLFxuICBUb3RwVmVyaWZpY2F0aW9uSW5mb1xufSBmcm9tICcuLi8uLi9hcGkvYWNjb3VudF9tYW5hZ2VtZW50L21mYSc7XG5pbXBvcnQge1xuICBGaW5hbGl6ZU1mYVJlc3BvbnNlLFxuICBmaW5hbGl6ZVNpZ25JblRvdHBNZmFcbn0gZnJvbSAnLi4vLi4vYXBpL2F1dGhlbnRpY2F0aW9uL21mYSc7XG5pbXBvcnQgeyBNdWx0aUZhY3RvckFzc2VydGlvbkltcGwgfSBmcm9tICcuLi8uLi9tZmEvbWZhX2Fzc2VydGlvbic7XG5pbXBvcnQgeyBNdWx0aUZhY3RvclNlc3Npb25JbXBsIH0gZnJvbSAnLi4vbWZhX3Nlc3Npb24nO1xuaW1wb3J0IHsgQXV0aEVycm9yQ29kZSB9IGZyb20gJy4uLy4uL2NvcmUvZXJyb3JzJztcbmltcG9ydCB7IF9hc3NlcnQgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWwvYXNzZXJ0JztcblxuLyoqXG4gKiBQcm92aWRlciBmb3IgZ2VuZXJhdGluZyBhIHtAbGluayBUb3RwTXVsdGlGYWN0b3JBc3NlcnRpb259LlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIFRvdHBNdWx0aUZhY3RvckdlbmVyYXRvciB7XG4gIC8qKlxuICAgKiBQcm92aWRlcyBhIHtAbGluayBUb3RwTXVsdGlGYWN0b3JBc3NlcnRpb259IHRvIGNvbmZpcm0gb3duZXJzaGlwIG9mXG4gICAqIHRoZSBUT1RQICh0aW1lLWJhc2VkIG9uZS10aW1lIHBhc3N3b3JkKSBzZWNvbmQgZmFjdG9yLlxuICAgKiBUaGlzIGFzc2VydGlvbiBpcyB1c2VkIHRvIGNvbXBsZXRlIGVucm9sbG1lbnQgaW4gVE9UUCBzZWNvbmQgZmFjdG9yLlxuICAgKlxuICAgKiBAcGFyYW0gc2VjcmV0IEEge0BsaW5rIFRvdHBTZWNyZXR9IGNvbnRhaW5pbmcgdGhlIHNoYXJlZCBzZWNyZXQga2V5IGFuZCBvdGhlciBUT1RQIHBhcmFtZXRlcnMuXG4gICAqIEBwYXJhbSBvbmVUaW1lUGFzc3dvcmQgT25lLXRpbWUgcGFzc3dvcmQgZnJvbSBUT1RQIEFwcC5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgVG90cE11bHRpRmFjdG9yQXNzZXJ0aW9ufSB3aGljaCBjYW4gYmUgdXNlZCB3aXRoXG4gICAqIHtAbGluayBNdWx0aUZhY3RvclVzZXIuZW5yb2xsfS5cbiAgICovXG4gIHN0YXRpYyBhc3NlcnRpb25Gb3JFbnJvbGxtZW50KFxuICAgIHNlY3JldDogVG90cFNlY3JldCxcbiAgICBvbmVUaW1lUGFzc3dvcmQ6IHN0cmluZ1xuICApOiBUb3RwTXVsdGlGYWN0b3JBc3NlcnRpb24ge1xuICAgIHJldHVybiBUb3RwTXVsdGlGYWN0b3JBc3NlcnRpb25JbXBsLl9mcm9tU2VjcmV0KHNlY3JldCwgb25lVGltZVBhc3N3b3JkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBhIHtAbGluayBUb3RwTXVsdGlGYWN0b3JBc3NlcnRpb259IHRvIGNvbmZpcm0gb3duZXJzaGlwIG9mIHRoZSBUT1RQIHNlY29uZCBmYWN0b3IuXG4gICAqIFRoaXMgYXNzZXJ0aW9uIGlzIHVzZWQgdG8gY29tcGxldGUgc2lnbkluIHdpdGggVE9UUCBhcyB0aGUgc2Vjb25kIGZhY3Rvci5cbiAgICpcbiAgICogQHBhcmFtIGVucm9sbG1lbnRJZCBpZGVudGlmaWVzIHRoZSBlbnJvbGxlZCBUT1RQIHNlY29uZCBmYWN0b3IuXG4gICAqIEBwYXJhbSBvbmVUaW1lUGFzc3dvcmQgT25lLXRpbWUgcGFzc3dvcmQgZnJvbSBUT1RQIEFwcC5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgVG90cE11bHRpRmFjdG9yQXNzZXJ0aW9ufSB3aGljaCBjYW4gYmUgdXNlZCB3aXRoXG4gICAqIHtAbGluayBNdWx0aUZhY3RvclJlc29sdmVyLnJlc29sdmVTaWduSW59LlxuICAgKi9cbiAgc3RhdGljIGFzc2VydGlvbkZvclNpZ25JbihcbiAgICBlbnJvbGxtZW50SWQ6IHN0cmluZyxcbiAgICBvbmVUaW1lUGFzc3dvcmQ6IHN0cmluZ1xuICApOiBUb3RwTXVsdGlGYWN0b3JBc3NlcnRpb24ge1xuICAgIHJldHVybiBUb3RwTXVsdGlGYWN0b3JBc3NlcnRpb25JbXBsLl9mcm9tRW5yb2xsbWVudElkKFxuICAgICAgZW5yb2xsbWVudElkLFxuICAgICAgb25lVGltZVBhc3N3b3JkXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcHJvbWlzZSB0byB7QGxpbmsgVG90cFNlY3JldH0gd2hpY2ggY29udGFpbnMgdGhlIFRPVFAgc2hhcmVkIHNlY3JldCBrZXkgYW5kIG90aGVyIHBhcmFtZXRlcnMuXG4gICAqIENyZWF0ZXMgYSBUT1RQIHNlY3JldCBhcyBwYXJ0IG9mIGVucm9sbGluZyBhIFRPVFAgc2Vjb25kIGZhY3Rvci5cbiAgICogVXNlZCBmb3IgZ2VuZXJhdGluZyBhIFFSIGNvZGUgVVJMIG9yIGlucHV0dGluZyBpbnRvIGEgVE9UUCBhcHAuXG4gICAqIFRoaXMgbWV0aG9kIHVzZXMgdGhlIGF1dGggaW5zdGFuY2UgY29ycmVzcG9uZGluZyB0byB0aGUgdXNlciBpbiB0aGUgbXVsdGlGYWN0b3JTZXNzaW9uLlxuICAgKlxuICAgKiBAcGFyYW0gc2Vzc2lvbiBUaGUge0BsaW5rIE11bHRpRmFjdG9yU2Vzc2lvbn0gdGhhdCB0aGUgdXNlciBpcyBwYXJ0IG9mLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdG8ge0BsaW5rIFRvdHBTZWNyZXR9LlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGdlbmVyYXRlU2VjcmV0KFxuICAgIHNlc3Npb246IE11bHRpRmFjdG9yU2Vzc2lvblxuICApOiBQcm9taXNlPFRvdHBTZWNyZXQ+IHtcbiAgICBjb25zdCBtZmFTZXNzaW9uID0gc2Vzc2lvbiBhcyBNdWx0aUZhY3RvclNlc3Npb25JbXBsO1xuICAgIF9hc3NlcnQoXG4gICAgICB0eXBlb2YgbWZhU2Vzc2lvbi51c2VyPy5hdXRoICE9PSAndW5kZWZpbmVkJyxcbiAgICAgIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1JcbiAgICApO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc3RhcnRFbnJvbGxUb3RwTWZhKG1mYVNlc3Npb24udXNlci5hdXRoLCB7XG4gICAgICBpZFRva2VuOiBtZmFTZXNzaW9uLmNyZWRlbnRpYWwsXG4gICAgICB0b3RwRW5yb2xsbWVudEluZm86IHt9XG4gICAgfSk7XG4gICAgcmV0dXJuIFRvdHBTZWNyZXQuX2Zyb21TdGFydFRvdHBNZmFFbnJvbGxtZW50UmVzcG9uc2UoXG4gICAgICByZXNwb25zZSxcbiAgICAgIG1mYVNlc3Npb24udXNlci5hdXRoXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgVE9UUCBzZWNvbmQgZmFjdG9yOiBgdG90cGAuXG4gICAqL1xuICBzdGF0aWMgRkFDVE9SX0lEOiAndG90cCcgPSBGYWN0b3JJZC5UT1RQO1xufVxuXG5leHBvcnQgY2xhc3MgVG90cE11bHRpRmFjdG9yQXNzZXJ0aW9uSW1wbFxuICBleHRlbmRzIE11bHRpRmFjdG9yQXNzZXJ0aW9uSW1wbFxuICBpbXBsZW1lbnRzIFRvdHBNdWx0aUZhY3RvckFzc2VydGlvblxue1xuICBjb25zdHJ1Y3RvcihcbiAgICByZWFkb25seSBvdHA6IHN0cmluZyxcbiAgICByZWFkb25seSBlbnJvbGxtZW50SWQ/OiBzdHJpbmcsXG4gICAgcmVhZG9ubHkgc2VjcmV0PzogVG90cFNlY3JldFxuICApIHtcbiAgICBzdXBlcihGYWN0b3JJZC5UT1RQKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgc3RhdGljIF9mcm9tU2VjcmV0KFxuICAgIHNlY3JldDogVG90cFNlY3JldCxcbiAgICBvdHA6IHN0cmluZ1xuICApOiBUb3RwTXVsdGlGYWN0b3JBc3NlcnRpb25JbXBsIHtcbiAgICByZXR1cm4gbmV3IFRvdHBNdWx0aUZhY3RvckFzc2VydGlvbkltcGwob3RwLCB1bmRlZmluZWQsIHNlY3JldCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHN0YXRpYyBfZnJvbUVucm9sbG1lbnRJZChcbiAgICBlbnJvbGxtZW50SWQ6IHN0cmluZyxcbiAgICBvdHA6IHN0cmluZ1xuICApOiBUb3RwTXVsdGlGYWN0b3JBc3NlcnRpb25JbXBsIHtcbiAgICByZXR1cm4gbmV3IFRvdHBNdWx0aUZhY3RvckFzc2VydGlvbkltcGwob3RwLCBlbnJvbGxtZW50SWQpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBhc3luYyBfZmluYWxpemVFbnJvbGwoXG4gICAgYXV0aDogQXV0aEludGVybmFsLFxuICAgIGlkVG9rZW46IHN0cmluZyxcbiAgICBkaXNwbGF5TmFtZT86IHN0cmluZyB8IG51bGxcbiAgKTogUHJvbWlzZTxGaW5hbGl6ZU1mYVJlc3BvbnNlPiB7XG4gICAgX2Fzc2VydChcbiAgICAgIHR5cGVvZiB0aGlzLnNlY3JldCAhPT0gJ3VuZGVmaW5lZCcsXG4gICAgICBhdXRoLFxuICAgICAgQXV0aEVycm9yQ29kZS5BUkdVTUVOVF9FUlJPUlxuICAgICk7XG4gICAgcmV0dXJuIGZpbmFsaXplRW5yb2xsVG90cE1mYShhdXRoLCB7XG4gICAgICBpZFRva2VuLFxuICAgICAgZGlzcGxheU5hbWUsXG4gICAgICB0b3RwVmVyaWZpY2F0aW9uSW5mbzogdGhpcy5zZWNyZXQuX21ha2VUb3RwVmVyaWZpY2F0aW9uSW5mbyh0aGlzLm90cClcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYXN5bmMgX2ZpbmFsaXplU2lnbkluKFxuICAgIGF1dGg6IEF1dGhJbnRlcm5hbCxcbiAgICBtZmFQZW5kaW5nQ3JlZGVudGlhbDogc3RyaW5nXG4gICk6IFByb21pc2U8RmluYWxpemVNZmFSZXNwb25zZT4ge1xuICAgIF9hc3NlcnQoXG4gICAgICB0aGlzLmVucm9sbG1lbnRJZCAhPT0gdW5kZWZpbmVkICYmIHRoaXMub3RwICE9PSB1bmRlZmluZWQsXG4gICAgICBhdXRoLFxuICAgICAgQXV0aEVycm9yQ29kZS5BUkdVTUVOVF9FUlJPUlxuICAgICk7XG4gICAgY29uc3QgdG90cFZlcmlmaWNhdGlvbkluZm8gPSB7IHZlcmlmaWNhdGlvbkNvZGU6IHRoaXMub3RwIH07XG4gICAgcmV0dXJuIGZpbmFsaXplU2lnbkluVG90cE1mYShhdXRoLCB7XG4gICAgICBtZmFQZW5kaW5nQ3JlZGVudGlhbCxcbiAgICAgIG1mYUVucm9sbG1lbnRJZDogdGhpcy5lbnJvbGxtZW50SWQsXG4gICAgICB0b3RwVmVyaWZpY2F0aW9uSW5mb1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogUHJvdmlkZXIgZm9yIGdlbmVyYXRpbmcgYSB7QGxpbmsgVG90cE11bHRpRmFjdG9yQXNzZXJ0aW9ufS5cbiAqXG4gKiBTdG9yZXMgdGhlIHNoYXJlZCBzZWNyZXQga2V5IGFuZCBvdGhlciBwYXJhbWV0ZXJzIHRvIGdlbmVyYXRlIHRpbWUtYmFzZWQgT1RQcy5cbiAqIEltcGxlbWVudHMgbWV0aG9kcyB0byByZXRyaWV2ZSB0aGUgc2hhcmVkIHNlY3JldCBrZXkgYW5kIGdlbmVyYXRlIGEgUVIgY29kZSBVUkwuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBUb3RwU2VjcmV0IHtcbiAgLyoqXG4gICAqIFNoYXJlZCBzZWNyZXQga2V5L3NlZWQgdXNlZCBmb3IgZW5yb2xsaW5nIGluIFRPVFAgTUZBIGFuZCBnZW5lcmF0aW5nIE9UUHMuXG4gICAqL1xuICByZWFkb25seSBzZWNyZXRLZXk6IHN0cmluZztcbiAgLyoqXG4gICAqIEhhc2hpbmcgYWxnb3JpdGhtIHVzZWQuXG4gICAqL1xuICByZWFkb25seSBoYXNoaW5nQWxnb3JpdGhtOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBMZW5ndGggb2YgdGhlIG9uZS10aW1lIHBhc3N3b3JkcyB0byBiZSBnZW5lcmF0ZWQuXG4gICAqL1xuICByZWFkb25seSBjb2RlTGVuZ3RoOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgaW50ZXJ2YWwgKGluIHNlY29uZHMpIHdoZW4gdGhlIE9UUCBjb2RlcyBzaG91bGQgY2hhbmdlLlxuICAgKi9cbiAgcmVhZG9ubHkgY29kZUludGVydmFsU2Vjb25kczogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIHRpbWVzdGFtcCAoVVRDIHN0cmluZykgYnkgd2hpY2ggVE9UUCBlbnJvbGxtZW50IHNob3VsZCBiZSBjb21wbGV0ZWQuXG4gICAqL1xuICAvLyBUaGlzIGNhbiBiZSB1c2VkIGJ5IGNhbGxlcnMgdG8gc2hvdyBhIGNvdW50ZG93biBvZiB3aGVuIHRvIGVudGVyIE9UUCBjb2RlIGJ5LlxuICByZWFkb25seSBlbnJvbGxtZW50Q29tcGxldGlvbkRlYWRsaW5lOiBzdHJpbmc7XG5cbiAgLy8gVGhlIHB1YmxpYyBtZW1iZXJzIGFyZSBkZWNsYXJlZCBvdXRzaWRlIHRoZSBjb25zdHJ1Y3RvciBzbyB0aGUgZG9jcyBjYW4gYmUgZ2VuZXJhdGVkLlxuICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgIHNlY3JldEtleTogc3RyaW5nLFxuICAgIGhhc2hpbmdBbGdvcml0aG06IHN0cmluZyxcbiAgICBjb2RlTGVuZ3RoOiBudW1iZXIsXG4gICAgY29kZUludGVydmFsU2Vjb25kczogbnVtYmVyLFxuICAgIGVucm9sbG1lbnRDb21wbGV0aW9uRGVhZGxpbmU6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNlc3Npb25JbmZvOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBhdXRoOiBBdXRoSW50ZXJuYWxcbiAgKSB7XG4gICAgdGhpcy5zZWNyZXRLZXkgPSBzZWNyZXRLZXk7XG4gICAgdGhpcy5oYXNoaW5nQWxnb3JpdGhtID0gaGFzaGluZ0FsZ29yaXRobTtcbiAgICB0aGlzLmNvZGVMZW5ndGggPSBjb2RlTGVuZ3RoO1xuICAgIHRoaXMuY29kZUludGVydmFsU2Vjb25kcyA9IGNvZGVJbnRlcnZhbFNlY29uZHM7XG4gICAgdGhpcy5lbnJvbGxtZW50Q29tcGxldGlvbkRlYWRsaW5lID0gZW5yb2xsbWVudENvbXBsZXRpb25EZWFkbGluZTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgc3RhdGljIF9mcm9tU3RhcnRUb3RwTWZhRW5yb2xsbWVudFJlc3BvbnNlKFxuICAgIHJlc3BvbnNlOiBTdGFydFRvdHBNZmFFbnJvbGxtZW50UmVzcG9uc2UsXG4gICAgYXV0aDogQXV0aEludGVybmFsXG4gICk6IFRvdHBTZWNyZXQge1xuICAgIHJldHVybiBuZXcgVG90cFNlY3JldChcbiAgICAgIHJlc3BvbnNlLnRvdHBTZXNzaW9uSW5mby5zaGFyZWRTZWNyZXRLZXksXG4gICAgICByZXNwb25zZS50b3RwU2Vzc2lvbkluZm8uaGFzaGluZ0FsZ29yaXRobSxcbiAgICAgIHJlc3BvbnNlLnRvdHBTZXNzaW9uSW5mby52ZXJpZmljYXRpb25Db2RlTGVuZ3RoLFxuICAgICAgcmVzcG9uc2UudG90cFNlc3Npb25JbmZvLnBlcmlvZFNlYyxcbiAgICAgIG5ldyBEYXRlKHJlc3BvbnNlLnRvdHBTZXNzaW9uSW5mby5maW5hbGl6ZUVucm9sbG1lbnRUaW1lKS50b1VUQ1N0cmluZygpLFxuICAgICAgcmVzcG9uc2UudG90cFNlc3Npb25JbmZvLnNlc3Npb25JbmZvLFxuICAgICAgYXV0aFxuICAgICk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9tYWtlVG90cFZlcmlmaWNhdGlvbkluZm8ob3RwOiBzdHJpbmcpOiBUb3RwVmVyaWZpY2F0aW9uSW5mbyB7XG4gICAgcmV0dXJuIHsgc2Vzc2lvbkluZm86IHRoaXMuc2Vzc2lvbkluZm8sIHZlcmlmaWNhdGlvbkNvZGU6IG90cCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBRUiBjb2RlIFVSTCBhcyBkZXNjcmliZWQgaW5cbiAgICogaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9nb29nbGUtYXV0aGVudGljYXRvci93aWtpL0tleS1VcmktRm9ybWF0XG4gICAqIFRoaXMgY2FuIGJlIGRpc3BsYXllZCB0byB0aGUgdXNlciBhcyBhIFFSIGNvZGUgdG8gYmUgc2Nhbm5lZCBpbnRvIGEgVE9UUCBhcHAgbGlrZSBHb29nbGUgQXV0aGVudGljYXRvci5cbiAgICogSWYgdGhlIG9wdGlvbmFsIHBhcmFtZXRlcnMgYXJlIHVuc3BlY2lmaWVkLCBhbiBhY2NvdW50TmFtZSBvZiA8dXNlckVtYWlsPiBhbmQgaXNzdWVyIG9mIDxmaXJlYmFzZUFwcE5hbWU+IGFyZSB1c2VkLlxuICAgKlxuICAgKiBAcGFyYW0gYWNjb3VudE5hbWUgdGhlIG5hbWUgb2YgdGhlIGFjY291bnQvYXBwIGFsb25nIHdpdGggYSB1c2VyIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSBpc3N1ZXIgaXNzdWVyIG9mIHRoZSBUT1RQIChsaWtlbHkgdGhlIGFwcCBuYW1lKS5cbiAgICogQHJldHVybnMgQSBRUiBjb2RlIFVSTCBzdHJpbmcuXG4gICAqL1xuICBnZW5lcmF0ZVFyQ29kZVVybChhY2NvdW50TmFtZT86IHN0cmluZywgaXNzdWVyPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgdXNlRGVmYXVsdHMgPSBmYWxzZTtcbiAgICBpZiAoX2lzRW1wdHlTdHJpbmcoYWNjb3VudE5hbWUpIHx8IF9pc0VtcHR5U3RyaW5nKGlzc3VlcikpIHtcbiAgICAgIHVzZURlZmF1bHRzID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHVzZURlZmF1bHRzKSB7XG4gICAgICBpZiAoX2lzRW1wdHlTdHJpbmcoYWNjb3VudE5hbWUpKSB7XG4gICAgICAgIGFjY291bnROYW1lID0gdGhpcy5hdXRoLmN1cnJlbnRVc2VyPy5lbWFpbCB8fCAndW5rbm93bnVzZXInO1xuICAgICAgfVxuICAgICAgaWYgKF9pc0VtcHR5U3RyaW5nKGlzc3VlcikpIHtcbiAgICAgICAgaXNzdWVyID0gdGhpcy5hdXRoLm5hbWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBgb3RwYXV0aDovL3RvdHAvJHtpc3N1ZXJ9OiR7YWNjb3VudE5hbWV9P3NlY3JldD0ke3RoaXMuc2VjcmV0S2V5fSZpc3N1ZXI9JHtpc3N1ZXJ9JmFsZ29yaXRobT0ke3RoaXMuaGFzaGluZ0FsZ29yaXRobX0mZGlnaXRzPSR7dGhpcy5jb2RlTGVuZ3RofWA7XG4gIH1cbn1cblxuLyoqIEBpbnRlcm5hbCAqL1xuZnVuY3Rpb24gX2lzRW1wdHlTdHJpbmcoaW5wdXQ/OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBpbnB1dCA9PT0gJ3VuZGVmaW5lZCcgfHwgaW5wdXQ/Lmxlbmd0aCA9PT0gMDtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBVbnN1YnNjcmliZSB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcbmltcG9ydCB7IEZpcmViYXNlQXV0aEludGVybmFsIH0gZnJvbSAnQGZpcmViYXNlL2F1dGgtaW50ZXJvcC10eXBlcyc7XG5cbmltcG9ydCB7IEF1dGhJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL2F1dGgnO1xuaW1wb3J0IHsgVXNlckludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvdXNlcic7XG5pbXBvcnQgeyBfYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQnO1xuaW1wb3J0IHsgQXV0aEVycm9yQ29kZSB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbmludGVyZmFjZSBUb2tlbkxpc3RlbmVyIHtcbiAgKHRvazogc3RyaW5nIHwgbnVsbCk6IHVua25vd247XG59XG5cbmV4cG9ydCBjbGFzcyBBdXRoSW50ZXJvcCBpbXBsZW1lbnRzIEZpcmViYXNlQXV0aEludGVybmFsIHtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlcm5hbExpc3RlbmVyczogTWFwPFRva2VuTGlzdGVuZXIsIFVuc3Vic2NyaWJlPiA9XG4gICAgbmV3IE1hcCgpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgYXV0aDogQXV0aEludGVybmFsKSB7fVxuXG4gIGdldFVpZCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICB0aGlzLmFzc2VydEF1dGhDb25maWd1cmVkKCk7XG4gICAgcmV0dXJuIHRoaXMuYXV0aC5jdXJyZW50VXNlcj8udWlkIHx8IG51bGw7XG4gIH1cblxuICBhc3luYyBnZXRUb2tlbihcbiAgICBmb3JjZVJlZnJlc2g/OiBib29sZWFuXG4gICk6IFByb21pc2U8eyBhY2Nlc3NUb2tlbjogc3RyaW5nIH0gfCBudWxsPiB7XG4gICAgdGhpcy5hc3NlcnRBdXRoQ29uZmlndXJlZCgpO1xuICAgIGF3YWl0IHRoaXMuYXV0aC5faW5pdGlhbGl6YXRpb25Qcm9taXNlO1xuICAgIGlmICghdGhpcy5hdXRoLmN1cnJlbnRVc2VyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBhY2Nlc3NUb2tlbiA9IGF3YWl0IHRoaXMuYXV0aC5jdXJyZW50VXNlci5nZXRJZFRva2VuKGZvcmNlUmVmcmVzaCk7XG4gICAgcmV0dXJuIHsgYWNjZXNzVG9rZW4gfTtcbiAgfVxuXG4gIGFkZEF1dGhUb2tlbkxpc3RlbmVyKGxpc3RlbmVyOiBUb2tlbkxpc3RlbmVyKTogdm9pZCB7XG4gICAgdGhpcy5hc3NlcnRBdXRoQ29uZmlndXJlZCgpO1xuICAgIGlmICh0aGlzLmludGVybmFsTGlzdGVuZXJzLmhhcyhsaXN0ZW5lcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB1bnN1YnNjcmliZSA9IHRoaXMuYXV0aC5vbklkVG9rZW5DaGFuZ2VkKHVzZXIgPT4ge1xuICAgICAgbGlzdGVuZXIoXG4gICAgICAgICh1c2VyIGFzIFVzZXJJbnRlcm5hbCB8IG51bGwpPy5zdHNUb2tlbk1hbmFnZXIuYWNjZXNzVG9rZW4gfHwgbnVsbFxuICAgICAgKTtcbiAgICB9KTtcbiAgICB0aGlzLmludGVybmFsTGlzdGVuZXJzLnNldChsaXN0ZW5lciwgdW5zdWJzY3JpYmUpO1xuICAgIHRoaXMudXBkYXRlUHJvYWN0aXZlUmVmcmVzaCgpO1xuICB9XG5cbiAgcmVtb3ZlQXV0aFRva2VuTGlzdGVuZXIobGlzdGVuZXI6IFRva2VuTGlzdGVuZXIpOiB2b2lkIHtcbiAgICB0aGlzLmFzc2VydEF1dGhDb25maWd1cmVkKCk7XG4gICAgY29uc3QgdW5zdWJzY3JpYmUgPSB0aGlzLmludGVybmFsTGlzdGVuZXJzLmdldChsaXN0ZW5lcik7XG4gICAgaWYgKCF1bnN1YnNjcmliZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaW50ZXJuYWxMaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyKTtcbiAgICB1bnN1YnNjcmliZSgpO1xuICAgIHRoaXMudXBkYXRlUHJvYWN0aXZlUmVmcmVzaCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3NlcnRBdXRoQ29uZmlndXJlZCgpOiB2b2lkIHtcbiAgICBfYXNzZXJ0KFxuICAgICAgdGhpcy5hdXRoLl9pbml0aWFsaXphdGlvblByb21pc2UsXG4gICAgICBBdXRoRXJyb3JDb2RlLkRFUEVOREVOVF9TREtfSU5JVF9CRUZPUkVfQVVUSFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVByb2FjdGl2ZVJlZnJlc2goKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaW50ZXJuYWxMaXN0ZW5lcnMuc2l6ZSA+IDApIHtcbiAgICAgIHRoaXMuYXV0aC5fc3RhcnRQcm9hY3RpdmVSZWZyZXNoKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYXV0aC5fc3RvcFByb2FjdGl2ZVJlZnJlc2goKTtcbiAgICB9XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBfcmVnaXN0ZXJDb21wb25lbnQsIHJlZ2lzdGVyVmVyc2lvbiB9IGZyb20gJ0BmaXJlYmFzZS9hcHAnO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBDb21wb25lbnRUeXBlLFxuICBJbnN0YW50aWF0aW9uTW9kZVxufSBmcm9tICdAZmlyZWJhc2UvY29tcG9uZW50JztcblxuaW1wb3J0IHsgbmFtZSwgdmVyc2lvbiB9IGZyb20gJy4uLy4uLy4uL3BhY2thZ2UuanNvbic7XG5pbXBvcnQgeyBBdXRoRXJyb3JDb2RlIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IF9hc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydCc7XG5pbXBvcnQgeyBfZ2V0Q2xpZW50VmVyc2lvbiwgQ2xpZW50UGxhdGZvcm0gfSBmcm9tICcuLi91dGlsL3ZlcnNpb24nO1xuaW1wb3J0IHsgX2Nhc3RBdXRoLCBBdXRoSW1wbCwgRGVmYXVsdENvbmZpZyB9IGZyb20gJy4vYXV0aF9pbXBsJztcbmltcG9ydCB7IEF1dGhJbnRlcm9wIH0gZnJvbSAnLi9maXJlYmFzZV9pbnRlcm5hbCc7XG5pbXBvcnQgeyBDb25maWdJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL2F1dGgnO1xuaW1wb3J0IHsgRGVwZW5kZW5jaWVzIH0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcbmltcG9ydCB7IF9pbml0aWFsaXplQXV0aEluc3RhbmNlIH0gZnJvbSAnLi9pbml0aWFsaXplJztcblxuZXhwb3J0IGNvbnN0IGVudW0gX0NvbXBvbmVudE5hbWUge1xuICBBVVRIID0gJ2F1dGgnLFxuICBBVVRIX0lOVEVSTkFMID0gJ2F1dGgtaW50ZXJuYWwnXG59XG5cbmZ1bmN0aW9uIGdldFZlcnNpb25Gb3JQbGF0Zm9ybShcbiAgY2xpZW50UGxhdGZvcm06IENsaWVudFBsYXRmb3JtXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBzd2l0Y2ggKGNsaWVudFBsYXRmb3JtKSB7XG4gICAgY2FzZSBDbGllbnRQbGF0Zm9ybS5OT0RFOlxuICAgICAgcmV0dXJuICdub2RlJztcbiAgICBjYXNlIENsaWVudFBsYXRmb3JtLlJFQUNUX05BVElWRTpcbiAgICAgIHJldHVybiAncm4nO1xuICAgIGNhc2UgQ2xpZW50UGxhdGZvcm0uV09SS0VSOlxuICAgICAgcmV0dXJuICd3ZWJ3b3JrZXInO1xuICAgIGNhc2UgQ2xpZW50UGxhdGZvcm0uQ09SRE9WQTpcbiAgICAgIHJldHVybiAnY29yZG92YSc7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyQXV0aChjbGllbnRQbGF0Zm9ybTogQ2xpZW50UGxhdGZvcm0pOiB2b2lkIHtcbiAgX3JlZ2lzdGVyQ29tcG9uZW50KFxuICAgIG5ldyBDb21wb25lbnQoXG4gICAgICBfQ29tcG9uZW50TmFtZS5BVVRILFxuICAgICAgKGNvbnRhaW5lciwgeyBvcHRpb25zOiBkZXBzIH06IHsgb3B0aW9ucz86IERlcGVuZGVuY2llcyB9KSA9PiB7XG4gICAgICAgIGNvbnN0IGFwcCA9IGNvbnRhaW5lci5nZXRQcm92aWRlcignYXBwJykuZ2V0SW1tZWRpYXRlKCkhO1xuICAgICAgICBjb25zdCBoZWFydGJlYXRTZXJ2aWNlUHJvdmlkZXIgPVxuICAgICAgICAgIGNvbnRhaW5lci5nZXRQcm92aWRlcjwnaGVhcnRiZWF0Jz4oJ2hlYXJ0YmVhdCcpO1xuICAgICAgICBjb25zdCBhcHBDaGVja1NlcnZpY2VQcm92aWRlciA9XG4gICAgICAgICAgY29udGFpbmVyLmdldFByb3ZpZGVyPCdhcHAtY2hlY2staW50ZXJuYWwnPignYXBwLWNoZWNrLWludGVybmFsJyk7XG4gICAgICAgIGNvbnN0IHsgYXBpS2V5LCBhdXRoRG9tYWluIH0gPSBhcHAub3B0aW9ucztcblxuICAgICAgICBfYXNzZXJ0KFxuICAgICAgICAgIGFwaUtleSAmJiAhYXBpS2V5LmluY2x1ZGVzKCc6JyksXG4gICAgICAgICAgQXV0aEVycm9yQ29kZS5JTlZBTElEX0FQSV9LRVksXG4gICAgICAgICAgeyBhcHBOYW1lOiBhcHAubmFtZSB9XG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgY29uZmlnOiBDb25maWdJbnRlcm5hbCA9IHtcbiAgICAgICAgICBhcGlLZXksXG4gICAgICAgICAgYXV0aERvbWFpbixcbiAgICAgICAgICBjbGllbnRQbGF0Zm9ybSxcbiAgICAgICAgICBhcGlIb3N0OiBEZWZhdWx0Q29uZmlnLkFQSV9IT1NULFxuICAgICAgICAgIHRva2VuQXBpSG9zdDogRGVmYXVsdENvbmZpZy5UT0tFTl9BUElfSE9TVCxcbiAgICAgICAgICBhcGlTY2hlbWU6IERlZmF1bHRDb25maWcuQVBJX1NDSEVNRSxcbiAgICAgICAgICBzZGtDbGllbnRWZXJzaW9uOiBfZ2V0Q2xpZW50VmVyc2lvbihjbGllbnRQbGF0Zm9ybSlcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBhdXRoSW5zdGFuY2UgPSBuZXcgQXV0aEltcGwoXG4gICAgICAgICAgYXBwLFxuICAgICAgICAgIGhlYXJ0YmVhdFNlcnZpY2VQcm92aWRlcixcbiAgICAgICAgICBhcHBDaGVja1NlcnZpY2VQcm92aWRlcixcbiAgICAgICAgICBjb25maWdcbiAgICAgICAgKTtcbiAgICAgICAgX2luaXRpYWxpemVBdXRoSW5zdGFuY2UoYXV0aEluc3RhbmNlLCBkZXBzKTtcblxuICAgICAgICByZXR1cm4gYXV0aEluc3RhbmNlO1xuICAgICAgfSxcbiAgICAgIENvbXBvbmVudFR5cGUuUFVCTElDXG4gICAgKVxuICAgICAgLyoqXG4gICAgICAgKiBBdXRoIGNhbiBvbmx5IGJlIGluaXRpYWxpemVkIGJ5IGV4cGxpY2l0bHkgY2FsbGluZyBnZXRBdXRoKCkgb3IgaW5pdGlhbGl6ZUF1dGgoKVxuICAgICAgICogRm9yIHdoeSB3ZSBkbyB0aGlzLCBTZWUgZ28vZmlyZWJhc2UtbmV4dC1hdXRoLWluaXRcbiAgICAgICAqL1xuICAgICAgLnNldEluc3RhbnRpYXRpb25Nb2RlKEluc3RhbnRpYXRpb25Nb2RlLkVYUExJQ0lUKVxuICAgICAgLyoqXG4gICAgICAgKiBCZWNhdXNlIGFsbCBmaXJlYmFzZSBwcm9kdWN0cyB0aGF0IGRlcGVuZCBvbiBhdXRoIGRlcGVuZCBvbiBhdXRoLWludGVybmFsIGRpcmVjdGx5LFxuICAgICAgICogd2UgbmVlZCB0byBpbml0aWFsaXplIGF1dGgtaW50ZXJuYWwgYWZ0ZXIgYXV0aCBpcyBpbml0aWFsaXplZCB0byBtYWtlIGl0IGF2YWlsYWJsZSB0byBvdGhlciBmaXJlYmFzZSBwcm9kdWN0cy5cbiAgICAgICAqL1xuICAgICAgLnNldEluc3RhbmNlQ3JlYXRlZENhbGxiYWNrKFxuICAgICAgICAoY29udGFpbmVyLCBfaW5zdGFuY2VJZGVudGlmaWVyLCBfaW5zdGFuY2UpID0+IHtcbiAgICAgICAgICBjb25zdCBhdXRoSW50ZXJuYWxQcm92aWRlciA9IGNvbnRhaW5lci5nZXRQcm92aWRlcihcbiAgICAgICAgICAgIF9Db21wb25lbnROYW1lLkFVVEhfSU5URVJOQUxcbiAgICAgICAgICApO1xuICAgICAgICAgIGF1dGhJbnRlcm5hbFByb3ZpZGVyLmluaXRpYWxpemUoKTtcbiAgICAgICAgfVxuICAgICAgKVxuICApO1xuXG4gIF9yZWdpc3RlckNvbXBvbmVudChcbiAgICBuZXcgQ29tcG9uZW50KFxuICAgICAgX0NvbXBvbmVudE5hbWUuQVVUSF9JTlRFUk5BTCxcbiAgICAgIGNvbnRhaW5lciA9PiB7XG4gICAgICAgIGNvbnN0IGF1dGggPSBfY2FzdEF1dGgoXG4gICAgICAgICAgY29udGFpbmVyLmdldFByb3ZpZGVyKF9Db21wb25lbnROYW1lLkFVVEgpLmdldEltbWVkaWF0ZSgpIVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gKGF1dGggPT4gbmV3IEF1dGhJbnRlcm9wKGF1dGgpKShhdXRoKTtcbiAgICAgIH0sXG4gICAgICBDb21wb25lbnRUeXBlLlBSSVZBVEVcbiAgICApLnNldEluc3RhbnRpYXRpb25Nb2RlKEluc3RhbnRpYXRpb25Nb2RlLkVYUExJQ0lUKVxuICApO1xuXG4gIHJlZ2lzdGVyVmVyc2lvbihuYW1lLCB2ZXJzaW9uLCBnZXRWZXJzaW9uRm9yUGxhdGZvcm0oY2xpZW50UGxhdGZvcm0pKTtcbiAgLy8gQlVJTERfVEFSR0VUIHdpbGwgYmUgcmVwbGFjZWQgYnkgdmFsdWVzIGxpa2UgZXNtNSwgZXNtMjAxNywgY2pzNSwgZXRjIGR1cmluZyB0aGUgY29tcGlsYXRpb25cbiAgcmVnaXN0ZXJWZXJzaW9uKG5hbWUsIHZlcnNpb24sICdfX0JVSUxEX1RBUkdFVF9fJyk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgRmlyZWJhc2VBcHAsIGdldEFwcCwgX2dldFByb3ZpZGVyIH0gZnJvbSAnQGZpcmViYXNlL2FwcCc7XG5cbmltcG9ydCB7XG4gIGluaXRpYWxpemVBdXRoLFxuICBiZWZvcmVBdXRoU3RhdGVDaGFuZ2VkLFxuICBvbklkVG9rZW5DaGFuZ2VkLFxuICBjb25uZWN0QXV0aEVtdWxhdG9yXG59IGZyb20gJy4uJztcbmltcG9ydCB7IHJlZ2lzdGVyQXV0aCB9IGZyb20gJy4uL2NvcmUvYXV0aC9yZWdpc3Rlcic7XG5pbXBvcnQgeyBDbGllbnRQbGF0Zm9ybSB9IGZyb20gJy4uL2NvcmUvdXRpbC92ZXJzaW9uJztcbmltcG9ydCB7IGJyb3dzZXJMb2NhbFBlcnNpc3RlbmNlIH0gZnJvbSAnLi9wZXJzaXN0ZW5jZS9sb2NhbF9zdG9yYWdlJztcbmltcG9ydCB7IGJyb3dzZXJTZXNzaW9uUGVyc2lzdGVuY2UgfSBmcm9tICcuL3BlcnNpc3RlbmNlL3Nlc3Npb25fc3RvcmFnZSc7XG5pbXBvcnQgeyBpbmRleGVkREJMb2NhbFBlcnNpc3RlbmNlIH0gZnJvbSAnLi9wZXJzaXN0ZW5jZS9pbmRleGVkX2RiJztcbmltcG9ydCB7IGJyb3dzZXJQb3B1cFJlZGlyZWN0UmVzb2x2ZXIgfSBmcm9tICcuL3BvcHVwX3JlZGlyZWN0JztcbmltcG9ydCB7IEF1dGgsIFVzZXIgfSBmcm9tICcuLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdEVtdWxhdG9ySG9zdCwgZ2V0RXhwZXJpbWVudGFsU2V0dGluZyB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcblxuY29uc3QgREVGQVVMVF9JRF9UT0tFTl9NQVhfQUdFID0gNSAqIDYwO1xuY29uc3QgYXV0aElkVG9rZW5NYXhBZ2UgPVxuICBnZXRFeHBlcmltZW50YWxTZXR0aW5nKCdhdXRoSWRUb2tlbk1heEFnZScpIHx8IERFRkFVTFRfSURfVE9LRU5fTUFYX0FHRTtcblxubGV0IGxhc3RQb3N0ZWRJZFRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsID0gbnVsbDtcblxuY29uc3QgbWludENvb2tpZUZhY3RvcnkgPSAodXJsOiBzdHJpbmcpID0+IGFzeW5jICh1c2VyOiBVc2VyIHwgbnVsbCkgPT4ge1xuICBjb25zdCBpZFRva2VuUmVzdWx0ID0gdXNlciAmJiAoYXdhaXQgdXNlci5nZXRJZFRva2VuUmVzdWx0KCkpO1xuICBjb25zdCBpZFRva2VuQWdlID1cbiAgICBpZFRva2VuUmVzdWx0ICYmXG4gICAgKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gRGF0ZS5wYXJzZShpZFRva2VuUmVzdWx0Lmlzc3VlZEF0VGltZSkpIC8gMV8wMDA7XG4gIGlmIChpZFRva2VuQWdlICYmIGlkVG9rZW5BZ2UgPiBhdXRoSWRUb2tlbk1heEFnZSkge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBTcGVjaWZpY2FsbHkgdHJpcCBudWxsID0+IHVuZGVmaW5lZCB3aGVuIGxvZ2dlZCBvdXQsIHRvIGRlbGV0ZSBhbnkgZXhpc3RpbmcgY29va2llXG4gIGNvbnN0IGlkVG9rZW4gPSBpZFRva2VuUmVzdWx0Py50b2tlbjtcbiAgaWYgKGxhc3RQb3N0ZWRJZFRva2VuID09PSBpZFRva2VuKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxhc3RQb3N0ZWRJZFRva2VuID0gaWRUb2tlbjtcbiAgYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgbWV0aG9kOiBpZFRva2VuID8gJ1BPU1QnIDogJ0RFTEVURScsXG4gICAgaGVhZGVyczogaWRUb2tlblxuICAgICAgPyB7XG4gICAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBgQmVhcmVyICR7aWRUb2tlbn1gXG4gICAgICAgIH1cbiAgICAgIDoge31cbiAgfSk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIEF1dGggaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCB7QGxpbmsgQGZpcmViYXNlL2FwcCNGaXJlYmFzZUFwcH0uXG4gKiBJZiBubyBpbnN0YW5jZSBleGlzdHMsIGluaXRpYWxpemVzIGFuIEF1dGggaW5zdGFuY2Ugd2l0aCBwbGF0Zm9ybS1zcGVjaWZpYyBkZWZhdWx0IGRlcGVuZGVuY2llcy5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIEZpcmViYXNlIEFwcC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBdXRoKGFwcDogRmlyZWJhc2VBcHAgPSBnZXRBcHAoKSk6IEF1dGgge1xuICBjb25zdCBwcm92aWRlciA9IF9nZXRQcm92aWRlcihhcHAsICdhdXRoJyk7XG5cbiAgaWYgKHByb3ZpZGVyLmlzSW5pdGlhbGl6ZWQoKSkge1xuICAgIHJldHVybiBwcm92aWRlci5nZXRJbW1lZGlhdGUoKTtcbiAgfVxuXG4gIGNvbnN0IGF1dGggPSBpbml0aWFsaXplQXV0aChhcHAsIHtcbiAgICBwb3B1cFJlZGlyZWN0UmVzb2x2ZXI6IGJyb3dzZXJQb3B1cFJlZGlyZWN0UmVzb2x2ZXIsXG4gICAgcGVyc2lzdGVuY2U6IFtcbiAgICAgIGluZGV4ZWREQkxvY2FsUGVyc2lzdGVuY2UsXG4gICAgICBicm93c2VyTG9jYWxQZXJzaXN0ZW5jZSxcbiAgICAgIGJyb3dzZXJTZXNzaW9uUGVyc2lzdGVuY2VcbiAgICBdXG4gIH0pO1xuXG4gIGNvbnN0IGF1dGhUb2tlblN5bmNVcmwgPSBnZXRFeHBlcmltZW50YWxTZXR0aW5nKCdhdXRoVG9rZW5TeW5jVVJMJyk7XG4gIGlmIChhdXRoVG9rZW5TeW5jVXJsKSB7XG4gICAgY29uc3QgbWludENvb2tpZSA9IG1pbnRDb29raWVGYWN0b3J5KGF1dGhUb2tlblN5bmNVcmwpO1xuICAgIGJlZm9yZUF1dGhTdGF0ZUNoYW5nZWQoYXV0aCwgbWludENvb2tpZSwgKCkgPT5cbiAgICAgIG1pbnRDb29raWUoYXV0aC5jdXJyZW50VXNlcilcbiAgICApO1xuICAgIG9uSWRUb2tlbkNoYW5nZWQoYXV0aCwgdXNlciA9PiBtaW50Q29va2llKHVzZXIpKTtcbiAgfVxuXG4gIGNvbnN0IGF1dGhFbXVsYXRvckhvc3QgPSBnZXREZWZhdWx0RW11bGF0b3JIb3N0KCdhdXRoJyk7XG4gIGlmIChhdXRoRW11bGF0b3JIb3N0KSB7XG4gICAgY29ubmVjdEF1dGhFbXVsYXRvcihhdXRoLCBgaHR0cDovLyR7YXV0aEVtdWxhdG9ySG9zdH1gKTtcbiAgfVxuXG4gIHJldHVybiBhdXRoO1xufVxuXG5yZWdpc3RlckF1dGgoQ2xpZW50UGxhdGZvcm0uQlJPV1NFUik7XG4iLCAiLyoqIE5vcm1hbCBoeWRyYXRpb24gdGhhdCBhdHRhY2hlcyB0byBhIERPTSB0cmVlIGJ1dCBkb2VzIG5vdCBkaWZmIGl0LiAqL1xuZXhwb3J0IGNvbnN0IE1PREVfSFlEUkFURSA9IDEgPDwgNTtcbi8qKiBTaWduaWZpZXMgdGhpcyBWTm9kZSBzdXNwZW5kZWQgb24gdGhlIHByZXZpb3VzIHJlbmRlciAqL1xuZXhwb3J0IGNvbnN0IE1PREVfU1VTUEVOREVEID0gMSA8PCA3O1xuLyoqIEluZGljYXRlcyB0aGF0IHRoaXMgbm9kZSBuZWVkcyB0byBiZSBpbnNlcnRlZCB3aGlsZSBwYXRjaGluZyBjaGlsZHJlbiAqL1xuZXhwb3J0IGNvbnN0IElOU0VSVF9WTk9ERSA9IDEgPDwgMTY7XG4vKiogSW5kaWNhdGVzIGEgVk5vZGUgaGFzIGJlZW4gbWF0Y2hlZCB3aXRoIGFub3RoZXIgVk5vZGUgaW4gdGhlIGRpZmYgKi9cbmV4cG9ydCBjb25zdCBNQVRDSEVEID0gMSA8PCAxNztcblxuLyoqIFJlc2V0IGFsbCBtb2RlIGZsYWdzICovXG5leHBvcnQgY29uc3QgUkVTRVRfTU9ERSA9IH4oTU9ERV9IWURSQVRFIHwgTU9ERV9TVVNQRU5ERUQpO1xuXG5leHBvcnQgY29uc3QgRU1QVFlfT0JKID0gLyoqIEB0eXBlIHthbnl9ICovICh7fSk7XG5leHBvcnQgY29uc3QgRU1QVFlfQVJSID0gW107XG5leHBvcnQgY29uc3QgSVNfTk9OX0RJTUVOU0lPTkFMID1cblx0L2FjaXR8ZXgoPzpzfGd8bnxwfCQpfHJwaHxncmlkfG93c3xtbmN8bnR3fGluZVtjaF18em9vfF5vcmR8aXRlcmEvaTtcbiIsICJpbXBvcnQgeyBFTVBUWV9BUlIgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbmV4cG9ydCBjb25zdCBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcblxuLyoqXG4gKiBBc3NpZ24gcHJvcGVydGllcyBmcm9tIGBwcm9wc2AgdG8gYG9iamBcbiAqIEB0ZW1wbGF0ZSBPLCBQIFRoZSBvYmogYW5kIHByb3BzIHR5cGVzXG4gKiBAcGFyYW0ge099IG9iaiBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyB0b1xuICogQHBhcmFtIHtQfSBwcm9wcyBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyBmcm9tXG4gKiBAcmV0dXJucyB7TyAmIFB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NpZ24ob2JqLCBwcm9wcykge1xuXHQvLyBAdHMtZXhwZWN0LWVycm9yIFdlIGNoYW5nZSB0aGUgdHlwZSBvZiBgb2JqYCB0byBiZSBgTyAmIFBgXG5cdGZvciAobGV0IGkgaW4gcHJvcHMpIG9ialtpXSA9IHByb3BzW2ldO1xuXHRyZXR1cm4gLyoqIEB0eXBlIHtPICYgUH0gKi8gKG9iaik7XG59XG5cbi8qKlxuICogUmVtb3ZlIGEgY2hpbGQgbm9kZSBmcm9tIGl0cyBwYXJlbnQgaWYgYXR0YWNoZWQuIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvclxuICogSUUxMSB3aGljaCBkb2Vzbid0IHN1cHBvcnQgYEVsZW1lbnQucHJvdG90eXBlLnJlbW92ZSgpYC4gVXNpbmcgdGhpcyBmdW5jdGlvblxuICogaXMgc21hbGxlciB0aGFuIGluY2x1ZGluZyBhIGRlZGljYXRlZCBwb2x5ZmlsbC5cbiAqIEBwYXJhbSB7cHJlYWN0LkNvbnRhaW5lck5vZGV9IG5vZGUgVGhlIG5vZGUgdG8gcmVtb3ZlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVOb2RlKG5vZGUpIHtcblx0bGV0IHBhcmVudE5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG5cdGlmIChwYXJlbnROb2RlKSBwYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpO1xufVxuXG5leHBvcnQgY29uc3Qgc2xpY2UgPSBFTVBUWV9BUlIuc2xpY2U7XG4iLCAiaW1wb3J0IHsgX2NhdGNoRXJyb3IgfSBmcm9tICcuL2RpZmYvY2F0Y2gtZXJyb3InO1xuXG4vKipcbiAqIFRoZSBgb3B0aW9uYCBvYmplY3QgY2FuIHBvdGVudGlhbGx5IGNvbnRhaW4gY2FsbGJhY2sgZnVuY3Rpb25zXG4gKiB0aGF0IGFyZSBjYWxsZWQgZHVyaW5nIHZhcmlvdXMgc3RhZ2VzIG9mIG91ciByZW5kZXJlci4gVGhpcyBpcyB0aGVcbiAqIGZvdW5kYXRpb24gb24gd2hpY2ggYWxsIG91ciBhZGRvbnMgbGlrZSBgcHJlYWN0L2RlYnVnYCwgYHByZWFjdC9jb21wYXRgLFxuICogYW5kIGBwcmVhY3QvaG9va3NgIGFyZSBiYXNlZCBvbi4gU2VlIHRoZSBgT3B0aW9uc2AgdHlwZSBpbiBgaW50ZXJuYWwuZC50c2BcbiAqIGZvciBhIGZ1bGwgbGlzdCBvZiBhdmFpbGFibGUgb3B0aW9uIGhvb2tzIChtb3N0IGVkaXRvcnMvSURFcyBhbGxvdyB5b3UgdG9cbiAqIGN0cmwrY2xpY2sgb3IgY21kK2NsaWNrIG9uIG1hYyB0aGUgdHlwZSBkZWZpbml0aW9uIGJlbG93KS5cbiAqIEB0eXBlIHtPcHRpb25zfVxuICovXG5jb25zdCBvcHRpb25zID0ge1xuXHRfY2F0Y2hFcnJvclxufTtcblxuZXhwb3J0IGRlZmF1bHQgb3B0aW9ucztcbiIsICJpbXBvcnQgeyBzbGljZSB9IGZyb20gJy4vdXRpbCc7XG5pbXBvcnQgb3B0aW9ucyBmcm9tICcuL29wdGlvbnMnO1xuXG5sZXQgdm5vZGVJZCA9IDA7XG5cbi8qKlxuICogQ3JlYXRlIGFuIHZpcnR1YWwgbm9kZSAodXNlZCBmb3IgSlNYKVxuICogQHBhcmFtIHtWTm9kZVtcInR5cGVcIl19IHR5cGUgVGhlIG5vZGUgbmFtZSBvciBDb21wb25lbnQgY29uc3RydWN0b3IgZm9yIHRoaXNcbiAqIHZpcnR1YWwgbm9kZVxuICogQHBhcmFtIHtvYmplY3QgfCBudWxsIHwgdW5kZWZpbmVkfSBbcHJvcHNdIFRoZSBwcm9wZXJ0aWVzIG9mIHRoZSB2aXJ0dWFsIG5vZGVcbiAqIEBwYXJhbSB7QXJyYXk8aW1wb3J0KCcuJykuQ29tcG9uZW50Q2hpbGRyZW4+fSBbY2hpbGRyZW5dIFRoZSBjaGlsZHJlbiBvZiB0aGVcbiAqIHZpcnR1YWwgbm9kZVxuICogQHJldHVybnMge1ZOb2RlfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRWxlbWVudCh0eXBlLCBwcm9wcywgY2hpbGRyZW4pIHtcblx0bGV0IG5vcm1hbGl6ZWRQcm9wcyA9IHt9LFxuXHRcdGtleSxcblx0XHRyZWYsXG5cdFx0aTtcblx0Zm9yIChpIGluIHByb3BzKSB7XG5cdFx0aWYgKGkgPT0gJ2tleScpIGtleSA9IHByb3BzW2ldO1xuXHRcdGVsc2UgaWYgKGkgPT0gJ3JlZicpIHJlZiA9IHByb3BzW2ldO1xuXHRcdGVsc2Ugbm9ybWFsaXplZFByb3BzW2ldID0gcHJvcHNbaV07XG5cdH1cblxuXHRpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDIpIHtcblx0XHRub3JtYWxpemVkUHJvcHMuY2hpbGRyZW4gPVxuXHRcdFx0YXJndW1lbnRzLmxlbmd0aCA+IDMgPyBzbGljZS5jYWxsKGFyZ3VtZW50cywgMikgOiBjaGlsZHJlbjtcblx0fVxuXG5cdC8vIElmIGEgQ29tcG9uZW50IFZOb2RlLCBjaGVjayBmb3IgYW5kIGFwcGx5IGRlZmF1bHRQcm9wc1xuXHQvLyBOb3RlOiB0eXBlIG1heSBiZSB1bmRlZmluZWQgaW4gZGV2ZWxvcG1lbnQsIG11c3QgbmV2ZXIgZXJyb3IgaGVyZS5cblx0aWYgKHR5cGVvZiB0eXBlID09ICdmdW5jdGlvbicgJiYgdHlwZS5kZWZhdWx0UHJvcHMgIT0gbnVsbCkge1xuXHRcdGZvciAoaSBpbiB0eXBlLmRlZmF1bHRQcm9wcykge1xuXHRcdFx0aWYgKG5vcm1hbGl6ZWRQcm9wc1tpXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdG5vcm1hbGl6ZWRQcm9wc1tpXSA9IHR5cGUuZGVmYXVsdFByb3BzW2ldO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBjcmVhdGVWTm9kZSh0eXBlLCBub3JtYWxpemVkUHJvcHMsIGtleSwgcmVmLCBudWxsKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBWTm9kZSAodXNlZCBpbnRlcm5hbGx5IGJ5IFByZWFjdClcbiAqIEBwYXJhbSB7Vk5vZGVbXCJ0eXBlXCJdfSB0eXBlIFRoZSBub2RlIG5hbWUgb3IgQ29tcG9uZW50XG4gKiBDb25zdHJ1Y3RvciBmb3IgdGhpcyB2aXJ0dWFsIG5vZGVcbiAqIEBwYXJhbSB7b2JqZWN0IHwgc3RyaW5nIHwgbnVtYmVyIHwgbnVsbH0gcHJvcHMgVGhlIHByb3BlcnRpZXMgb2YgdGhpcyB2aXJ0dWFsIG5vZGUuXG4gKiBJZiB0aGlzIHZpcnR1YWwgbm9kZSByZXByZXNlbnRzIGEgdGV4dCBub2RlLCB0aGlzIGlzIHRoZSB0ZXh0IG9mIHRoZSBub2RlIChzdHJpbmcgb3IgbnVtYmVyKS5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyIHwgbnVsbH0ga2V5IFRoZSBrZXkgZm9yIHRoaXMgdmlydHVhbCBub2RlLCB1c2VkIHdoZW5cbiAqIGRpZmZpbmcgaXQgYWdhaW5zdCBpdHMgY2hpbGRyZW5cbiAqIEBwYXJhbSB7Vk5vZGVbXCJyZWZcIl19IHJlZiBUaGUgcmVmIHByb3BlcnR5IHRoYXQgd2lsbFxuICogcmVjZWl2ZSBhIHJlZmVyZW5jZSB0byBpdHMgY3JlYXRlZCBjaGlsZFxuICogQHJldHVybnMge1ZOb2RlfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVk5vZGUodHlwZSwgcHJvcHMsIGtleSwgcmVmLCBvcmlnaW5hbCkge1xuXHQvLyBWOCBzZWVtcyB0byBiZSBiZXR0ZXIgYXQgZGV0ZWN0aW5nIHR5cGUgc2hhcGVzIGlmIHRoZSBvYmplY3QgaXMgYWxsb2NhdGVkIGZyb20gdGhlIHNhbWUgY2FsbCBzaXRlXG5cdC8vIERvIG5vdCBpbmxpbmUgaW50byBjcmVhdGVFbGVtZW50IGFuZCBjb2VyY2VUb1ZOb2RlIVxuXHQvKiogQHR5cGUge1ZOb2RlfSAqL1xuXHRjb25zdCB2bm9kZSA9IHtcblx0XHR0eXBlLFxuXHRcdHByb3BzLFxuXHRcdGtleSxcblx0XHRyZWYsXG5cdFx0X2NoaWxkcmVuOiBudWxsLFxuXHRcdF9wYXJlbnQ6IG51bGwsXG5cdFx0X2RlcHRoOiAwLFxuXHRcdF9kb206IG51bGwsXG5cdFx0Ly8gX25leHREb20gbXVzdCBiZSBpbml0aWFsaXplZCB0byB1bmRlZmluZWQgYi9jIGl0IHdpbGwgZXZlbnR1YWxseVxuXHRcdC8vIGJlIHNldCB0byBkb20ubmV4dFNpYmxpbmcgd2hpY2ggY2FuIHJldHVybiBgbnVsbGAgYW5kIGl0IGlzIGltcG9ydGFudFxuXHRcdC8vIHRvIGJlIGFibGUgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBhbiB1bmluaXRpYWxpemVkIF9uZXh0RG9tIGFuZFxuXHRcdC8vIGEgX25leHREb20gdGhhdCBoYXMgYmVlbiBzZXQgdG8gYG51bGxgXG5cdFx0X25leHREb206IHVuZGVmaW5lZCxcblx0XHRfY29tcG9uZW50OiBudWxsLFxuXHRcdGNvbnN0cnVjdG9yOiB1bmRlZmluZWQsXG5cdFx0X29yaWdpbmFsOiBvcmlnaW5hbCA9PSBudWxsID8gKyt2bm9kZUlkIDogb3JpZ2luYWwsXG5cdFx0X2luZGV4OiAtMSxcblx0XHRfZmxhZ3M6IDBcblx0fTtcblxuXHQvLyBPbmx5IGludm9rZSB0aGUgdm5vZGUgaG9vayBpZiB0aGlzIHdhcyAqbm90KiBhIGRpcmVjdCBjb3B5OlxuXHRpZiAob3JpZ2luYWwgPT0gbnVsbCAmJiBvcHRpb25zLnZub2RlICE9IG51bGwpIG9wdGlvbnMudm5vZGUodm5vZGUpO1xuXG5cdHJldHVybiB2bm9kZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlZigpIHtcblx0cmV0dXJuIHsgY3VycmVudDogbnVsbCB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRnJhZ21lbnQocHJvcHMpIHtcblx0cmV0dXJuIHByb3BzLmNoaWxkcmVuO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGEgdGhlIGFyZ3VtZW50IGlzIGEgdmFsaWQgUHJlYWN0IFZOb2RlLlxuICogQHBhcmFtIHsqfSB2bm9kZVxuICogQHJldHVybnMge3Zub2RlIGlzIFZOb2RlfVxuICovXG5leHBvcnQgY29uc3QgaXNWYWxpZEVsZW1lbnQgPSB2bm9kZSA9PlxuXHR2bm9kZSAhPSBudWxsICYmIHZub2RlLmNvbnN0cnVjdG9yID09IHVuZGVmaW5lZDtcbiIsICJpbXBvcnQgeyBhc3NpZ24gfSBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IHsgZGlmZiwgY29tbWl0Um9vdCB9IGZyb20gJy4vZGlmZi9pbmRleCc7XG5pbXBvcnQgb3B0aW9ucyBmcm9tICcuL29wdGlvbnMnO1xuaW1wb3J0IHsgRnJhZ21lbnQgfSBmcm9tICcuL2NyZWF0ZS1lbGVtZW50JztcbmltcG9ydCB7IE1PREVfSFlEUkFURSB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuLyoqXG4gKiBCYXNlIENvbXBvbmVudCBjbGFzcy4gUHJvdmlkZXMgYHNldFN0YXRlKClgIGFuZCBgZm9yY2VVcGRhdGUoKWAsIHdoaWNoXG4gKiB0cmlnZ2VyIHJlbmRlcmluZ1xuICogQHBhcmFtIHtvYmplY3R9IHByb3BzIFRoZSBpbml0aWFsIGNvbXBvbmVudCBwcm9wc1xuICogQHBhcmFtIHtvYmplY3R9IGNvbnRleHQgVGhlIGluaXRpYWwgY29udGV4dCBmcm9tIHBhcmVudCBjb21wb25lbnRzJ1xuICogZ2V0Q2hpbGRDb250ZXh0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBCYXNlQ29tcG9uZW50KHByb3BzLCBjb250ZXh0KSB7XG5cdHRoaXMucHJvcHMgPSBwcm9wcztcblx0dGhpcy5jb250ZXh0ID0gY29udGV4dDtcbn1cblxuLyoqXG4gKiBVcGRhdGUgY29tcG9uZW50IHN0YXRlIGFuZCBzY2hlZHVsZSBhIHJlLXJlbmRlci5cbiAqIEB0aGlzIHtDb21wb25lbnR9XG4gKiBAcGFyYW0ge29iamVjdCB8ICgoczogb2JqZWN0LCBwOiBvYmplY3QpID0+IG9iamVjdCl9IHVwZGF0ZSBBIGhhc2ggb2Ygc3RhdGVcbiAqIHByb3BlcnRpZXMgdG8gdXBkYXRlIHdpdGggbmV3IHZhbHVlcyBvciBhIGZ1bmN0aW9uIHRoYXQgZ2l2ZW4gdGhlIGN1cnJlbnRcbiAqIHN0YXRlIGFuZCBwcm9wcyByZXR1cm5zIGEgbmV3IHBhcnRpYWwgc3RhdGVcbiAqIEBwYXJhbSB7KCkgPT4gdm9pZH0gW2NhbGxiYWNrXSBBIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBvbmNlIGNvbXBvbmVudCBzdGF0ZSBpc1xuICogdXBkYXRlZFxuICovXG5CYXNlQ29tcG9uZW50LnByb3RvdHlwZS5zZXRTdGF0ZSA9IGZ1bmN0aW9uICh1cGRhdGUsIGNhbGxiYWNrKSB7XG5cdC8vIG9ubHkgY2xvbmUgc3RhdGUgd2hlbiBjb3B5aW5nIHRvIG5leHRTdGF0ZSB0aGUgZmlyc3QgdGltZS5cblx0bGV0IHM7XG5cdGlmICh0aGlzLl9uZXh0U3RhdGUgIT0gbnVsbCAmJiB0aGlzLl9uZXh0U3RhdGUgIT09IHRoaXMuc3RhdGUpIHtcblx0XHRzID0gdGhpcy5fbmV4dFN0YXRlO1xuXHR9IGVsc2Uge1xuXHRcdHMgPSB0aGlzLl9uZXh0U3RhdGUgPSBhc3NpZ24oe30sIHRoaXMuc3RhdGUpO1xuXHR9XG5cblx0aWYgKHR5cGVvZiB1cGRhdGUgPT0gJ2Z1bmN0aW9uJykge1xuXHRcdC8vIFNvbWUgbGlicmFyaWVzIGxpa2UgYGltbWVyYCBtYXJrIHRoZSBjdXJyZW50IHN0YXRlIGFzIHJlYWRvbmx5LFxuXHRcdC8vIHByZXZlbnRpbmcgdXMgZnJvbSBtdXRhdGluZyBpdCwgc28gd2UgbmVlZCB0byBjbG9uZSBpdC4gU2VlICMyNzE2XG5cdFx0dXBkYXRlID0gdXBkYXRlKGFzc2lnbih7fSwgcyksIHRoaXMucHJvcHMpO1xuXHR9XG5cblx0aWYgKHVwZGF0ZSkge1xuXHRcdGFzc2lnbihzLCB1cGRhdGUpO1xuXHR9XG5cblx0Ly8gU2tpcCB1cGRhdGUgaWYgdXBkYXRlciBmdW5jdGlvbiByZXR1cm5lZCBudWxsXG5cdGlmICh1cGRhdGUgPT0gbnVsbCkgcmV0dXJuO1xuXG5cdGlmICh0aGlzLl92bm9kZSkge1xuXHRcdGlmIChjYWxsYmFjaykge1xuXHRcdFx0dGhpcy5fc3RhdGVDYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG5cdFx0fVxuXHRcdGVucXVldWVSZW5kZXIodGhpcyk7XG5cdH1cbn07XG5cbi8qKlxuICogSW1tZWRpYXRlbHkgcGVyZm9ybSBhIHN5bmNocm9ub3VzIHJlLXJlbmRlciBvZiB0aGUgY29tcG9uZW50XG4gKiBAdGhpcyB7Q29tcG9uZW50fVxuICogQHBhcmFtIHsoKSA9PiB2b2lkfSBbY2FsbGJhY2tdIEEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGFmdGVyIGNvbXBvbmVudCBpc1xuICogcmUtcmVuZGVyZWRcbiAqL1xuQmFzZUNvbXBvbmVudC5wcm90b3R5cGUuZm9yY2VVcGRhdGUgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcblx0aWYgKHRoaXMuX3Zub2RlKSB7XG5cdFx0Ly8gU2V0IHJlbmRlciBtb2RlIHNvIHRoYXQgd2UgY2FuIGRpZmZlcmVudGlhdGUgd2hlcmUgdGhlIHJlbmRlciByZXF1ZXN0XG5cdFx0Ly8gaXMgY29taW5nIGZyb20uIFdlIG5lZWQgdGhpcyBiZWNhdXNlIGZvcmNlVXBkYXRlIHNob3VsZCBuZXZlciBjYWxsXG5cdFx0Ly8gc2hvdWxkQ29tcG9uZW50VXBkYXRlXG5cdFx0dGhpcy5fZm9yY2UgPSB0cnVlO1xuXHRcdGlmIChjYWxsYmFjaykgdGhpcy5fcmVuZGVyQ2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuXHRcdGVucXVldWVSZW5kZXIodGhpcyk7XG5cdH1cbn07XG5cbi8qKlxuICogQWNjZXB0cyBgcHJvcHNgIGFuZCBgc3RhdGVgLCBhbmQgcmV0dXJucyBhIG5ldyBWaXJ0dWFsIERPTSB0cmVlIHRvIGJ1aWxkLlxuICogVmlydHVhbCBET00gaXMgZ2VuZXJhbGx5IGNvbnN0cnVjdGVkIHZpYSBbSlNYXShodHRwOi8vamFzb25mb3JtYXQuY29tL3d0Zi1pcy1qc3gpLlxuICogQHBhcmFtIHtvYmplY3R9IHByb3BzIFByb3BzIChlZzogSlNYIGF0dHJpYnV0ZXMpIHJlY2VpdmVkIGZyb20gcGFyZW50XG4gKiBlbGVtZW50L2NvbXBvbmVudFxuICogQHBhcmFtIHtvYmplY3R9IHN0YXRlIFRoZSBjb21wb25lbnQncyBjdXJyZW50IHN0YXRlXG4gKiBAcGFyYW0ge29iamVjdH0gY29udGV4dCBDb250ZXh0IG9iamVjdCwgYXMgcmV0dXJuZWQgYnkgdGhlIG5lYXJlc3RcbiAqIGFuY2VzdG9yJ3MgYGdldENoaWxkQ29udGV4dCgpYFxuICogQHJldHVybnMge0NvbXBvbmVudENoaWxkcmVuIHwgdm9pZH1cbiAqL1xuQmFzZUNvbXBvbmVudC5wcm90b3R5cGUucmVuZGVyID0gRnJhZ21lbnQ7XG5cbi8qKlxuICogQHBhcmFtIHtWTm9kZX0gdm5vZGVcbiAqIEBwYXJhbSB7bnVtYmVyIHwgbnVsbH0gW2NoaWxkSW5kZXhdXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREb21TaWJsaW5nKHZub2RlLCBjaGlsZEluZGV4KSB7XG5cdGlmIChjaGlsZEluZGV4ID09IG51bGwpIHtcblx0XHQvLyBVc2UgY2hpbGRJbmRleD09bnVsbCBhcyBhIHNpZ25hbCB0byByZXN1bWUgdGhlIHNlYXJjaCBmcm9tIHRoZSB2bm9kZSdzIHNpYmxpbmdcblx0XHRyZXR1cm4gdm5vZGUuX3BhcmVudFxuXHRcdFx0PyBnZXREb21TaWJsaW5nKHZub2RlLl9wYXJlbnQsIHZub2RlLl9pbmRleCArIDEpXG5cdFx0XHQ6IG51bGw7XG5cdH1cblxuXHRsZXQgc2libGluZztcblx0Zm9yICg7IGNoaWxkSW5kZXggPCB2bm9kZS5fY2hpbGRyZW4ubGVuZ3RoOyBjaGlsZEluZGV4KyspIHtcblx0XHRzaWJsaW5nID0gdm5vZGUuX2NoaWxkcmVuW2NoaWxkSW5kZXhdO1xuXG5cdFx0aWYgKHNpYmxpbmcgIT0gbnVsbCAmJiBzaWJsaW5nLl9kb20gIT0gbnVsbCkge1xuXHRcdFx0Ly8gU2luY2UgdXBkYXRlUGFyZW50RG9tUG9pbnRlcnMga2VlcHMgX2RvbSBwb2ludGVyIGNvcnJlY3QsXG5cdFx0XHQvLyB3ZSBjYW4gcmVseSBvbiBfZG9tIHRvIHRlbGwgdXMgaWYgdGhpcyBzdWJ0cmVlIGNvbnRhaW5zIGFcblx0XHRcdC8vIHJlbmRlcmVkIERPTSBub2RlLCBhbmQgd2hhdCB0aGUgZmlyc3QgcmVuZGVyZWQgRE9NIG5vZGUgaXNcblx0XHRcdHJldHVybiBzaWJsaW5nLl9kb207XG5cdFx0fVxuXHR9XG5cblx0Ly8gSWYgd2UgZ2V0IGhlcmUsIHdlIGhhdmUgbm90IGZvdW5kIGEgRE9NIG5vZGUgaW4gdGhpcyB2bm9kZSdzIGNoaWxkcmVuLlxuXHQvLyBXZSBtdXN0IHJlc3VtZSBmcm9tIHRoaXMgdm5vZGUncyBzaWJsaW5nIChpbiBpdCdzIHBhcmVudCBfY2hpbGRyZW4gYXJyYXkpXG5cdC8vIE9ubHkgY2xpbWIgdXAgYW5kIHNlYXJjaCB0aGUgcGFyZW50IGlmIHdlIGFyZW4ndCBzZWFyY2hpbmcgdGhyb3VnaCBhIERPTVxuXHQvLyBWTm9kZSAobWVhbmluZyB3ZSByZWFjaGVkIHRoZSBET00gcGFyZW50IG9mIHRoZSBvcmlnaW5hbCB2bm9kZSB0aGF0IGJlZ2FuXG5cdC8vIHRoZSBzZWFyY2gpXG5cdHJldHVybiB0eXBlb2Ygdm5vZGUudHlwZSA9PSAnZnVuY3Rpb24nID8gZ2V0RG9tU2libGluZyh2bm9kZSkgOiBudWxsO1xufVxuXG4vKipcbiAqIFRyaWdnZXIgaW4tcGxhY2UgcmUtcmVuZGVyaW5nIG9mIGEgY29tcG9uZW50LlxuICogQHBhcmFtIHtDb21wb25lbnR9IGNvbXBvbmVudCBUaGUgY29tcG9uZW50IHRvIHJlcmVuZGVyXG4gKi9cbmZ1bmN0aW9uIHJlbmRlckNvbXBvbmVudChjb21wb25lbnQpIHtcblx0bGV0IG9sZFZOb2RlID0gY29tcG9uZW50Ll92bm9kZSxcblx0XHRvbGREb20gPSBvbGRWTm9kZS5fZG9tLFxuXHRcdHBhcmVudERvbSA9IGNvbXBvbmVudC5fcGFyZW50RG9tLFxuXHRcdGNvbW1pdFF1ZXVlID0gW10sXG5cdFx0cmVmUXVldWUgPSBbXTtcblxuXHRpZiAocGFyZW50RG9tKSB7XG5cdFx0Y29uc3QgbmV3Vk5vZGUgPSBhc3NpZ24oe30sIG9sZFZOb2RlKTtcblx0XHRuZXdWTm9kZS5fb3JpZ2luYWwgPSBvbGRWTm9kZS5fb3JpZ2luYWwgKyAxO1xuXHRcdGlmIChvcHRpb25zLnZub2RlKSBvcHRpb25zLnZub2RlKG5ld1ZOb2RlKTtcblxuXHRcdGRpZmYoXG5cdFx0XHRwYXJlbnREb20sXG5cdFx0XHRuZXdWTm9kZSxcblx0XHRcdG9sZFZOb2RlLFxuXHRcdFx0Y29tcG9uZW50Ll9nbG9iYWxDb250ZXh0LFxuXHRcdFx0cGFyZW50RG9tLm93bmVyU1ZHRWxlbWVudCAhPT0gdW5kZWZpbmVkLFxuXHRcdFx0b2xkVk5vZGUuX2ZsYWdzICYgTU9ERV9IWURSQVRFID8gW29sZERvbV0gOiBudWxsLFxuXHRcdFx0Y29tbWl0UXVldWUsXG5cdFx0XHRvbGREb20gPT0gbnVsbCA/IGdldERvbVNpYmxpbmcob2xkVk5vZGUpIDogb2xkRG9tLFxuXHRcdFx0ISEob2xkVk5vZGUuX2ZsYWdzICYgTU9ERV9IWURSQVRFKSxcblx0XHRcdHJlZlF1ZXVlXG5cdFx0KTtcblxuXHRcdG5ld1ZOb2RlLl9wYXJlbnQuX2NoaWxkcmVuW25ld1ZOb2RlLl9pbmRleF0gPSBuZXdWTm9kZTtcblx0XHRjb21taXRSb290KGNvbW1pdFF1ZXVlLCBuZXdWTm9kZSwgcmVmUXVldWUpO1xuXG5cdFx0aWYgKG5ld1ZOb2RlLl9kb20gIT0gb2xkRG9tKSB7XG5cdFx0XHR1cGRhdGVQYXJlbnREb21Qb2ludGVycyhuZXdWTm9kZSk7XG5cdFx0fVxuXHR9XG59XG5cbi8qKlxuICogQHBhcmFtIHtWTm9kZX0gdm5vZGVcbiAqL1xuZnVuY3Rpb24gdXBkYXRlUGFyZW50RG9tUG9pbnRlcnModm5vZGUpIHtcblx0aWYgKCh2bm9kZSA9IHZub2RlLl9wYXJlbnQpICE9IG51bGwgJiYgdm5vZGUuX2NvbXBvbmVudCAhPSBudWxsKSB7XG5cdFx0dm5vZGUuX2RvbSA9IHZub2RlLl9jb21wb25lbnQuYmFzZSA9IG51bGw7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB2bm9kZS5fY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcblx0XHRcdGxldCBjaGlsZCA9IHZub2RlLl9jaGlsZHJlbltpXTtcblx0XHRcdGlmIChjaGlsZCAhPSBudWxsICYmIGNoaWxkLl9kb20gIT0gbnVsbCkge1xuXHRcdFx0XHR2bm9kZS5fZG9tID0gdm5vZGUuX2NvbXBvbmVudC5iYXNlID0gY2hpbGQuX2RvbTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHVwZGF0ZVBhcmVudERvbVBvaW50ZXJzKHZub2RlKTtcblx0fVxufVxuXG4vKipcbiAqIFRoZSByZW5kZXIgcXVldWVcbiAqIEB0eXBlIHtBcnJheTxDb21wb25lbnQ+fVxuICovXG5sZXQgcmVyZW5kZXJRdWV1ZSA9IFtdO1xuXG4vKlxuICogVGhlIHZhbHVlIG9mIGBDb21wb25lbnQuZGVib3VuY2VgIG11c3QgYXN5bmNocm9ub3VzbHkgaW52b2tlIHRoZSBwYXNzZWQgaW4gY2FsbGJhY2suIEl0IGlzXG4gKiBpbXBvcnRhbnQgdGhhdCBjb250cmlidXRvcnMgdG8gUHJlYWN0IGNhbiBjb25zaXN0ZW50bHkgcmVhc29uIGFib3V0IHdoYXQgY2FsbHMgdG8gYHNldFN0YXRlYCwgZXRjLlxuICogZG8sIGFuZCB3aGVuIHRoZWlyIGVmZmVjdHMgd2lsbCBiZSBhcHBsaWVkLiBTZWUgdGhlIGxpbmtzIGJlbG93IGZvciBzb21lIGZ1cnRoZXIgcmVhZGluZyBvbiBkZXNpZ25pbmdcbiAqIGFzeW5jaHJvbm91cyBBUElzLlxuICogKiBbRGVzaWduaW5nIEFQSXMgZm9yIEFzeW5jaHJvbnldKGh0dHBzOi8vYmxvZy5penMubWUvMjAxMy8wOC9kZXNpZ25pbmctYXBpcy1mb3ItYXN5bmNocm9ueSlcbiAqICogW0NhbGxiYWNrcyBzeW5jaHJvbm91cyBhbmQgYXN5bmNocm9ub3VzXShodHRwczovL2Jsb2cub21ldGVyLmNvbS8yMDExLzA3LzI0L2NhbGxiYWNrcy1zeW5jaHJvbm91cy1hbmQtYXN5bmNocm9ub3VzLylcbiAqL1xuXG5sZXQgcHJldkRlYm91bmNlO1xuXG5jb25zdCBkZWZlciA9XG5cdHR5cGVvZiBQcm9taXNlID09ICdmdW5jdGlvbidcblx0XHQ/IFByb21pc2UucHJvdG90eXBlLnRoZW4uYmluZChQcm9taXNlLnJlc29sdmUoKSlcblx0XHQ6IHNldFRpbWVvdXQ7XG5cbi8qKlxuICogRW5xdWV1ZSBhIHJlcmVuZGVyIG9mIGEgY29tcG9uZW50XG4gKiBAcGFyYW0ge0NvbXBvbmVudH0gYyBUaGUgY29tcG9uZW50IHRvIHJlcmVuZGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbnF1ZXVlUmVuZGVyKGMpIHtcblx0aWYgKFxuXHRcdCghYy5fZGlydHkgJiZcblx0XHRcdChjLl9kaXJ0eSA9IHRydWUpICYmXG5cdFx0XHRyZXJlbmRlclF1ZXVlLnB1c2goYykgJiZcblx0XHRcdCFwcm9jZXNzLl9yZXJlbmRlckNvdW50KyspIHx8XG5cdFx0cHJldkRlYm91bmNlICE9PSBvcHRpb25zLmRlYm91bmNlUmVuZGVyaW5nXG5cdCkge1xuXHRcdHByZXZEZWJvdW5jZSA9IG9wdGlvbnMuZGVib3VuY2VSZW5kZXJpbmc7XG5cdFx0KHByZXZEZWJvdW5jZSB8fCBkZWZlcikocHJvY2Vzcyk7XG5cdH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge0NvbXBvbmVudH0gYVxuICogQHBhcmFtIHtDb21wb25lbnR9IGJcbiAqL1xuY29uc3QgZGVwdGhTb3J0ID0gKGEsIGIpID0+IGEuX3Zub2RlLl9kZXB0aCAtIGIuX3Zub2RlLl9kZXB0aDtcblxuLyoqIEZsdXNoIHRoZSByZW5kZXIgcXVldWUgYnkgcmVyZW5kZXJpbmcgYWxsIHF1ZXVlZCBjb21wb25lbnRzICovXG5mdW5jdGlvbiBwcm9jZXNzKCkge1xuXHRsZXQgYztcblx0cmVyZW5kZXJRdWV1ZS5zb3J0KGRlcHRoU29ydCk7XG5cdC8vIERvbid0IHVwZGF0ZSBgcmVuZGVyQ291bnRgIHlldC4gS2VlcCBpdHMgdmFsdWUgbm9uLXplcm8gdG8gcHJldmVudCB1bm5lY2Vzc2FyeVxuXHQvLyBwcm9jZXNzKCkgY2FsbHMgZnJvbSBnZXR0aW5nIHNjaGVkdWxlZCB3aGlsZSBgcXVldWVgIGlzIHN0aWxsIGJlaW5nIGNvbnN1bWVkLlxuXHR3aGlsZSAoKGMgPSByZXJlbmRlclF1ZXVlLnNoaWZ0KCkpKSB7XG5cdFx0aWYgKGMuX2RpcnR5KSB7XG5cdFx0XHRsZXQgcmVuZGVyUXVldWVMZW5ndGggPSByZXJlbmRlclF1ZXVlLmxlbmd0aDtcblx0XHRcdHJlbmRlckNvbXBvbmVudChjKTtcblx0XHRcdGlmIChyZXJlbmRlclF1ZXVlLmxlbmd0aCA+IHJlbmRlclF1ZXVlTGVuZ3RoKSB7XG5cdFx0XHRcdC8vIFdoZW4gaS5lLiByZXJlbmRlcmluZyBhIHByb3ZpZGVyIGFkZGl0aW9uYWwgbmV3IGl0ZW1zIGNhbiBiZSBpbmplY3RlZCwgd2Ugd2FudCB0b1xuXHRcdFx0XHQvLyBrZWVwIHRoZSBvcmRlciBmcm9tIHRvcCB0byBib3R0b20gd2l0aCB0aG9zZSBuZXcgaXRlbXMgc28gd2UgY2FuIGhhbmRsZSB0aGVtIGluIGFcblx0XHRcdFx0Ly8gc2luZ2xlIHBhc3Ncblx0XHRcdFx0cmVyZW5kZXJRdWV1ZS5zb3J0KGRlcHRoU29ydCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHByb2Nlc3MuX3JlcmVuZGVyQ291bnQgPSAwO1xufVxuXG5wcm9jZXNzLl9yZXJlbmRlckNvdW50ID0gMDtcbiIsICJpbXBvcnQgeyBlbnF1ZXVlUmVuZGVyIH0gZnJvbSAnLi9jb21wb25lbnQnO1xuXG5leHBvcnQgbGV0IGkgPSAwO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29udGV4dChkZWZhdWx0VmFsdWUsIGNvbnRleHRJZCkge1xuXHRjb250ZXh0SWQgPSAnX19jQycgKyBpKys7XG5cblx0Y29uc3QgY29udGV4dCA9IHtcblx0XHRfaWQ6IGNvbnRleHRJZCxcblx0XHRfZGVmYXVsdFZhbHVlOiBkZWZhdWx0VmFsdWUsXG5cdFx0LyoqIEB0eXBlIHtGdW5jdGlvbkNvbXBvbmVudH0gKi9cblx0XHRDb25zdW1lcihwcm9wcywgY29udGV4dFZhbHVlKSB7XG5cdFx0XHQvLyByZXR1cm4gcHJvcHMuY2hpbGRyZW4oXG5cdFx0XHQvLyBcdGNvbnRleHRbY29udGV4dElkXSA/IGNvbnRleHRbY29udGV4dElkXS5wcm9wcy52YWx1ZSA6IGRlZmF1bHRWYWx1ZVxuXHRcdFx0Ly8gKTtcblx0XHRcdHJldHVybiBwcm9wcy5jaGlsZHJlbihjb250ZXh0VmFsdWUpO1xuXHRcdH0sXG5cdFx0LyoqIEB0eXBlIHtGdW5jdGlvbkNvbXBvbmVudH0gKi9cblx0XHRQcm92aWRlcihwcm9wcykge1xuXHRcdFx0aWYgKCF0aGlzLmdldENoaWxkQ29udGV4dCkge1xuXHRcdFx0XHQvKiogQHR5cGUge0NvbXBvbmVudFtdfSAqL1xuXHRcdFx0XHRsZXQgc3VicyA9IFtdO1xuXHRcdFx0XHRsZXQgY3R4ID0ge307XG5cdFx0XHRcdGN0eFtjb250ZXh0SWRdID0gdGhpcztcblxuXHRcdFx0XHR0aGlzLmdldENoaWxkQ29udGV4dCA9ICgpID0+IGN0eDtcblxuXHRcdFx0XHR0aGlzLnNob3VsZENvbXBvbmVudFVwZGF0ZSA9IGZ1bmN0aW9uIChfcHJvcHMpIHtcblx0XHRcdFx0XHRpZiAodGhpcy5wcm9wcy52YWx1ZSAhPT0gX3Byb3BzLnZhbHVlKSB7XG5cdFx0XHRcdFx0XHQvLyBJIHRoaW5rIHRoZSBmb3JjZWQgdmFsdWUgcHJvcGFnYXRpb24gaGVyZSB3YXMgb25seSBuZWVkZWQgd2hlbiBgb3B0aW9ucy5kZWJvdW5jZVJlbmRlcmluZ2Agd2FzIGJlaW5nIGJ5cGFzc2VkOlxuXHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL3ByZWFjdGpzL3ByZWFjdC9jb21taXQvNGQzMzlmYjgwM2JlYTA5ZTlmMTk4YWJmMzhjYTFiZjhlYTRiNzc3MSNkaWZmLTU0NjgyY2UzODA5MzVhNzE3ZTQxYjhiZmM1NDczN2Y2UjM1OFxuXHRcdFx0XHRcdFx0Ly8gSW4gdGhvc2UgY2FzZXMgdGhvdWdoLCBldmVuIHdpdGggdGhlIHZhbHVlIGNvcnJlY3RlZCwgd2UncmUgZG91YmxlLXJlbmRlcmluZyBhbGwgbm9kZXMuXG5cdFx0XHRcdFx0XHQvLyBJdCBtaWdodCBiZSBiZXR0ZXIgdG8ganVzdCB0ZWxsIGZvbGtzIG5vdCB0byB1c2UgZm9yY2Utc3luYyBtb2RlLlxuXHRcdFx0XHRcdFx0Ly8gQ3VycmVudGx5LCB1c2luZyBgdXNlQ29udGV4dCgpYCBpbiBhIGNsYXNzIGNvbXBvbmVudCB3aWxsIG92ZXJ3cml0ZSBpdHMgYHRoaXMuY29udGV4dGAgdmFsdWUuXG5cdFx0XHRcdFx0XHQvLyBzdWJzLnNvbWUoYyA9PiB7XG5cdFx0XHRcdFx0XHQvLyBcdGMuY29udGV4dCA9IF9wcm9wcy52YWx1ZTtcblx0XHRcdFx0XHRcdC8vIFx0ZW5xdWV1ZVJlbmRlcihjKTtcblx0XHRcdFx0XHRcdC8vIH0pO1xuXG5cdFx0XHRcdFx0XHQvLyBzdWJzLnNvbWUoYyA9PiB7XG5cdFx0XHRcdFx0XHQvLyBcdGMuY29udGV4dFtjb250ZXh0SWRdID0gX3Byb3BzLnZhbHVlO1xuXHRcdFx0XHRcdFx0Ly8gXHRlbnF1ZXVlUmVuZGVyKGMpO1xuXHRcdFx0XHRcdFx0Ly8gfSk7XG5cdFx0XHRcdFx0XHRzdWJzLnNvbWUoYyA9PiB7XG5cdFx0XHRcdFx0XHRcdGMuX2ZvcmNlID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0ZW5xdWV1ZVJlbmRlcihjKTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblxuXHRcdFx0XHR0aGlzLnN1YiA9IGMgPT4ge1xuXHRcdFx0XHRcdHN1YnMucHVzaChjKTtcblx0XHRcdFx0XHRsZXQgb2xkID0gYy5jb21wb25lbnRXaWxsVW5tb3VudDtcblx0XHRcdFx0XHRjLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gKCkgPT4ge1xuXHRcdFx0XHRcdFx0c3Vicy5zcGxpY2Uoc3Vicy5pbmRleE9mKGMpLCAxKTtcblx0XHRcdFx0XHRcdGlmIChvbGQpIG9sZC5jYWxsKGMpO1xuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBwcm9wcy5jaGlsZHJlbjtcblx0XHR9XG5cdH07XG5cblx0Ly8gRGV2dG9vbHMgbmVlZHMgYWNjZXNzIHRvIHRoZSBjb250ZXh0IG9iamVjdCB3aGVuIGl0XG5cdC8vIGVuY291bnRlcnMgYSBQcm92aWRlci4gVGhpcyBpcyBuZWNlc3NhcnkgdG8gc3VwcG9ydFxuXHQvLyBzZXR0aW5nIGBkaXNwbGF5TmFtZWAgb24gdGhlIGNvbnRleHQgb2JqZWN0IGluc3RlYWRcblx0Ly8gb2Ygb24gdGhlIGNvbXBvbmVudCBpdHNlbGYuIFNlZTpcblx0Ly8gaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL2NvbnRleHQuaHRtbCNjb250ZXh0ZGlzcGxheW5hbWVcblxuXHRyZXR1cm4gKGNvbnRleHQuUHJvdmlkZXIuX2NvbnRleHRSZWYgPSBjb250ZXh0LkNvbnN1bWVyLmNvbnRleHRUeXBlID1cblx0XHRjb250ZXh0KTtcbn1cbiIsICJpbXBvcnQgeyBkaWZmLCB1bm1vdW50LCBhcHBseVJlZiB9IGZyb20gJy4vaW5kZXgnO1xuaW1wb3J0IHsgY3JlYXRlVk5vZGUsIEZyYWdtZW50IH0gZnJvbSAnLi4vY3JlYXRlLWVsZW1lbnQnO1xuaW1wb3J0IHsgRU1QVFlfT0JKLCBFTVBUWV9BUlIsIElOU0VSVF9WTk9ERSwgTUFUQ0hFRCB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBpc0FycmF5IH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBnZXREb21TaWJsaW5nIH0gZnJvbSAnLi4vY29tcG9uZW50JztcblxuLyoqXG4gKiBEaWZmIHRoZSBjaGlsZHJlbiBvZiBhIHZpcnR1YWwgbm9kZVxuICogQHBhcmFtIHtQcmVhY3RFbGVtZW50fSBwYXJlbnREb20gVGhlIERPTSBlbGVtZW50IHdob3NlIGNoaWxkcmVuIGFyZSBiZWluZ1xuICogZGlmZmVkXG4gKiBAcGFyYW0ge0NvbXBvbmVudENoaWxkcmVuW119IHJlbmRlclJlc3VsdFxuICogQHBhcmFtIHtWTm9kZX0gbmV3UGFyZW50Vk5vZGUgVGhlIG5ldyB2aXJ0dWFsIG5vZGUgd2hvc2UgY2hpbGRyZW4gc2hvdWxkIGJlXG4gKiBkaWZmJ2VkIGFnYWluc3Qgb2xkUGFyZW50Vk5vZGVcbiAqIEBwYXJhbSB7Vk5vZGV9IG9sZFBhcmVudFZOb2RlIFRoZSBvbGQgdmlydHVhbCBub2RlIHdob3NlIGNoaWxkcmVuIHNob3VsZCBiZVxuICogZGlmZidlZCBhZ2FpbnN0IG5ld1BhcmVudFZOb2RlXG4gKiBAcGFyYW0ge29iamVjdH0gZ2xvYmFsQ29udGV4dCBUaGUgY3VycmVudCBjb250ZXh0IG9iamVjdCAtIG1vZGlmaWVkIGJ5XG4gKiBnZXRDaGlsZENvbnRleHRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNTdmcgV2hldGhlciBvciBub3QgdGhpcyBET00gbm9kZSBpcyBhbiBTVkcgbm9kZVxuICogQHBhcmFtIHtBcnJheTxQcmVhY3RFbGVtZW50Pn0gZXhjZXNzRG9tQ2hpbGRyZW5cbiAqIEBwYXJhbSB7QXJyYXk8Q29tcG9uZW50Pn0gY29tbWl0UXVldWUgTGlzdCBvZiBjb21wb25lbnRzIHdoaWNoIGhhdmUgY2FsbGJhY2tzXG4gKiB0byBpbnZva2UgaW4gY29tbWl0Um9vdFxuICogQHBhcmFtIHtQcmVhY3RFbGVtZW50fSBvbGREb20gVGhlIGN1cnJlbnQgYXR0YWNoZWQgRE9NIGVsZW1lbnQgYW55IG5ldyBkb21cbiAqIGVsZW1lbnRzIHNob3VsZCBiZSBwbGFjZWQgYXJvdW5kLiBMaWtlbHkgYG51bGxgIG9uIGZpcnN0IHJlbmRlciAoZXhjZXB0IHdoZW5cbiAqIGh5ZHJhdGluZykuIENhbiBiZSBhIHNpYmxpbmcgRE9NIGVsZW1lbnQgd2hlbiBkaWZmaW5nIEZyYWdtZW50cyB0aGF0IGhhdmVcbiAqIHNpYmxpbmdzLiBJbiBtb3N0IGNhc2VzLCBpdCBzdGFydHMgb3V0IGFzIGBvbGRDaGlsZHJlblswXS5fZG9tYC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNIeWRyYXRpbmcgV2hldGhlciBvciBub3Qgd2UgYXJlIGluIGh5ZHJhdGlvblxuICogQHBhcmFtIHthbnlbXX0gcmVmUXVldWUgYW4gYXJyYXkgb2YgZWxlbWVudHMgbmVlZGVkIHRvIGludm9rZSByZWZzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaWZmQ2hpbGRyZW4oXG5cdHBhcmVudERvbSxcblx0cmVuZGVyUmVzdWx0LFxuXHRuZXdQYXJlbnRWTm9kZSxcblx0b2xkUGFyZW50Vk5vZGUsXG5cdGdsb2JhbENvbnRleHQsXG5cdGlzU3ZnLFxuXHRleGNlc3NEb21DaGlsZHJlbixcblx0Y29tbWl0UXVldWUsXG5cdG9sZERvbSxcblx0aXNIeWRyYXRpbmcsXG5cdHJlZlF1ZXVlXG4pIHtcblx0bGV0IGksXG5cdFx0LyoqIEB0eXBlIHtWTm9kZX0gKi9cblx0XHRvbGRWTm9kZSxcblx0XHQvKiogQHR5cGUge1ZOb2RlfSAqL1xuXHRcdGNoaWxkVk5vZGUsXG5cdFx0LyoqIEB0eXBlIHtQcmVhY3RFbGVtZW50fSAqL1xuXHRcdG5ld0RvbSxcblx0XHQvKiogQHR5cGUge1ByZWFjdEVsZW1lbnR9ICovXG5cdFx0Zmlyc3RDaGlsZERvbTtcblxuXHQvLyBUaGlzIGlzIGEgY29tcHJlc3Npb24gb2Ygb2xkUGFyZW50Vk5vZGUhPW51bGwgJiYgb2xkUGFyZW50Vk5vZGUgIT0gRU1QVFlfT0JKICYmIG9sZFBhcmVudFZOb2RlLl9jaGlsZHJlbiB8fCBFTVBUWV9BUlJcblx0Ly8gYXMgRU1QVFlfT0JKLl9jaGlsZHJlbiBzaG91bGQgYmUgYHVuZGVmaW5lZGAuXG5cdC8qKiBAdHlwZSB7Vk5vZGVbXX0gKi9cblx0bGV0IG9sZENoaWxkcmVuID0gKG9sZFBhcmVudFZOb2RlICYmIG9sZFBhcmVudFZOb2RlLl9jaGlsZHJlbikgfHwgRU1QVFlfQVJSO1xuXG5cdGxldCBuZXdDaGlsZHJlbkxlbmd0aCA9IHJlbmRlclJlc3VsdC5sZW5ndGg7XG5cblx0bmV3UGFyZW50Vk5vZGUuX25leHREb20gPSBvbGREb207XG5cdGNvbnN0cnVjdE5ld0NoaWxkcmVuQXJyYXkobmV3UGFyZW50Vk5vZGUsIHJlbmRlclJlc3VsdCwgb2xkQ2hpbGRyZW4pO1xuXHRvbGREb20gPSBuZXdQYXJlbnRWTm9kZS5fbmV4dERvbTtcblxuXHRmb3IgKGkgPSAwOyBpIDwgbmV3Q2hpbGRyZW5MZW5ndGg7IGkrKykge1xuXHRcdGNoaWxkVk5vZGUgPSBuZXdQYXJlbnRWTm9kZS5fY2hpbGRyZW5baV07XG5cblx0XHRpZiAoXG5cdFx0XHRjaGlsZFZOb2RlID09IG51bGwgfHxcblx0XHRcdHR5cGVvZiBjaGlsZFZOb2RlID09ICdib29sZWFuJyB8fFxuXHRcdFx0dHlwZW9mIGNoaWxkVk5vZGUgPT0gJ2Z1bmN0aW9uJ1xuXHRcdCkge1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0Ly8gQXQgdGhpcyBwb2ludCwgY29uc3RydWN0TmV3Q2hpbGRyZW5BcnJheSBoYXMgYXNzaWduZWQgX2luZGV4IHRvIGJlIHRoZVxuXHRcdC8vIG1hdGNoaW5nSW5kZXggZm9yIHRoaXMgVk5vZGUncyBvbGRWTm9kZSAob3IgLTEgaWYgdGhlcmUgaXMgbm8gb2xkVk5vZGUpLlxuXHRcdGlmIChjaGlsZFZOb2RlLl9pbmRleCA9PT0gLTEpIHtcblx0XHRcdG9sZFZOb2RlID0gRU1QVFlfT0JKO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvbGRWTm9kZSA9IG9sZENoaWxkcmVuW2NoaWxkVk5vZGUuX2luZGV4XSB8fCBFTVBUWV9PQko7XG5cdFx0fVxuXG5cdFx0Ly8gVXBkYXRlIGNoaWxkVk5vZGUuX2luZGV4IHRvIGl0cyBmaW5hbCBpbmRleFxuXHRcdGNoaWxkVk5vZGUuX2luZGV4ID0gaTtcblxuXHRcdC8vIE1vcnBoIHRoZSBvbGQgZWxlbWVudCBpbnRvIHRoZSBuZXcgb25lLCBidXQgZG9uJ3QgYXBwZW5kIGl0IHRvIHRoZSBkb20geWV0XG5cdFx0ZGlmZihcblx0XHRcdHBhcmVudERvbSxcblx0XHRcdGNoaWxkVk5vZGUsXG5cdFx0XHRvbGRWTm9kZSxcblx0XHRcdGdsb2JhbENvbnRleHQsXG5cdFx0XHRpc1N2Zyxcblx0XHRcdGV4Y2Vzc0RvbUNoaWxkcmVuLFxuXHRcdFx0Y29tbWl0UXVldWUsXG5cdFx0XHRvbGREb20sXG5cdFx0XHRpc0h5ZHJhdGluZyxcblx0XHRcdHJlZlF1ZXVlXG5cdFx0KTtcblxuXHRcdC8vIEFkanVzdCBET00gbm9kZXNcblx0XHRuZXdEb20gPSBjaGlsZFZOb2RlLl9kb207XG5cdFx0aWYgKGNoaWxkVk5vZGUucmVmICYmIG9sZFZOb2RlLnJlZiAhPSBjaGlsZFZOb2RlLnJlZikge1xuXHRcdFx0aWYgKG9sZFZOb2RlLnJlZikge1xuXHRcdFx0XHRhcHBseVJlZihvbGRWTm9kZS5yZWYsIG51bGwsIGNoaWxkVk5vZGUpO1xuXHRcdFx0fVxuXHRcdFx0cmVmUXVldWUucHVzaChcblx0XHRcdFx0Y2hpbGRWTm9kZS5yZWYsXG5cdFx0XHRcdGNoaWxkVk5vZGUuX2NvbXBvbmVudCB8fCBuZXdEb20sXG5cdFx0XHRcdGNoaWxkVk5vZGVcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0aWYgKGZpcnN0Q2hpbGREb20gPT0gbnVsbCAmJiBuZXdEb20gIT0gbnVsbCkge1xuXHRcdFx0Zmlyc3RDaGlsZERvbSA9IG5ld0RvbTtcblx0XHR9XG5cblx0XHRpZiAoXG5cdFx0XHRjaGlsZFZOb2RlLl9mbGFncyAmIElOU0VSVF9WTk9ERSB8fFxuXHRcdFx0b2xkVk5vZGUuX2NoaWxkcmVuID09PSBjaGlsZFZOb2RlLl9jaGlsZHJlblxuXHRcdCkge1xuXHRcdFx0b2xkRG9tID0gaW5zZXJ0KGNoaWxkVk5vZGUsIG9sZERvbSwgcGFyZW50RG9tKTtcblx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0dHlwZW9mIGNoaWxkVk5vZGUudHlwZSA9PSAnZnVuY3Rpb24nICYmXG5cdFx0XHRjaGlsZFZOb2RlLl9uZXh0RG9tICE9PSB1bmRlZmluZWRcblx0XHQpIHtcblx0XHRcdC8vIFNpbmNlIEZyYWdtZW50cyBvciBjb21wb25lbnRzIHRoYXQgcmV0dXJuIEZyYWdtZW50IGxpa2UgVk5vZGVzIGNhblxuXHRcdFx0Ly8gY29udGFpbiBtdWx0aXBsZSBET00gbm9kZXMgYXMgdGhlIHNhbWUgbGV2ZWwsIGNvbnRpbnVlIHRoZSBkaWZmIGZyb21cblx0XHRcdC8vIHRoZSBzaWJsaW5nIG9mIGxhc3QgRE9NIGNoaWxkIG9mIHRoaXMgY2hpbGQgVk5vZGVcblx0XHRcdG9sZERvbSA9IGNoaWxkVk5vZGUuX25leHREb207XG5cdFx0fSBlbHNlIGlmIChuZXdEb20pIHtcblx0XHRcdG9sZERvbSA9IG5ld0RvbS5uZXh0U2libGluZztcblx0XHR9XG5cblx0XHQvLyBFYWdlcmx5IGNsZWFudXAgX25leHREb20uIFdlIGRvbid0IG5lZWQgdG8gcGVyc2lzdCB0aGUgdmFsdWUgYmVjYXVzZSBpdFxuXHRcdC8vIGlzIG9ubHkgdXNlZCBieSBgZGlmZkNoaWxkcmVuYCB0byBkZXRlcm1pbmUgd2hlcmUgdG8gcmVzdW1lIHRoZSBkaWZmXG5cdFx0Ly8gYWZ0ZXIgZGlmZmluZyBDb21wb25lbnRzIGFuZCBGcmFnbWVudHMuIE9uY2Ugd2Ugc3RvcmUgaXQgdGhlIG5leHRET01cblx0XHQvLyBsb2NhbCB2YXIsIHdlIGNhbiBjbGVhbiB1cCB0aGUgcHJvcGVydHkuIEFsc28gcHJldmVudHMgdXMgaGFuZ2luZyBvbiB0b1xuXHRcdC8vIERPTSBub2RlcyB0aGF0IG1heSBoYXZlIGJlZW4gdW5tb3VudGVkLlxuXHRcdGNoaWxkVk5vZGUuX25leHREb20gPSB1bmRlZmluZWQ7XG5cblx0XHQvLyBVbnNldCBkaWZmaW5nIGZsYWdzXG5cdFx0Y2hpbGRWTm9kZS5fZmxhZ3MgJj0gfihJTlNFUlRfVk5PREUgfCBNQVRDSEVEKTtcblx0fVxuXG5cdC8vIFRPRE86IFdpdGggbmV3IGNoaWxkIGRpZmZpbmcgYWxnbywgY29uc2lkZXIgYWx0IHdheXMgdG8gZGlmZiBGcmFnbWVudHMuXG5cdC8vIFN1Y2ggYXMgZHJvcHBpbmcgb2xkRG9tIGFuZCBtb3ZpbmcgZnJhZ21lbnRzIGluIHBsYWNlXG5cdC8vXG5cdC8vIEJlY2F1c2UgdGhlIG5ld1BhcmVudFZOb2RlIGlzIEZyYWdtZW50LWxpa2UsIHdlIG5lZWQgdG8gc2V0IGl0J3Ncblx0Ly8gX25leHREb20gcHJvcGVydHkgdG8gdGhlIG5leHRTaWJsaW5nIG9mIGl0cyBsYXN0IGNoaWxkIERPTSBub2RlLlxuXHQvL1xuXHQvLyBgb2xkRG9tYCBjb250YWlucyB0aGUgY29ycmVjdCB2YWx1ZSBoZXJlIGJlY2F1c2UgaWYgdGhlIGxhc3QgY2hpbGRcblx0Ly8gaXMgYSBGcmFnbWVudC1saWtlLCB0aGVuIG9sZERvbSBoYXMgYWxyZWFkeSBiZWVuIHNldCB0byB0aGF0IGNoaWxkJ3MgX25leHREb20uXG5cdC8vIElmIHRoZSBsYXN0IGNoaWxkIGlzIGEgRE9NIFZOb2RlLCB0aGVuIG9sZERvbSB3aWxsIGJlIHNldCB0byB0aGF0IERPTVxuXHQvLyBub2RlJ3MgbmV4dFNpYmxpbmcuXG5cdG5ld1BhcmVudFZOb2RlLl9uZXh0RG9tID0gb2xkRG9tO1xuXHRuZXdQYXJlbnRWTm9kZS5fZG9tID0gZmlyc3RDaGlsZERvbTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge1ZOb2RlfSBuZXdQYXJlbnRWTm9kZVxuICogQHBhcmFtIHtDb21wb25lbnRDaGlsZHJlbltdfSByZW5kZXJSZXN1bHRcbiAqIEBwYXJhbSB7Vk5vZGVbXX0gb2xkQ2hpbGRyZW5cbiAqL1xuZnVuY3Rpb24gY29uc3RydWN0TmV3Q2hpbGRyZW5BcnJheShuZXdQYXJlbnRWTm9kZSwgcmVuZGVyUmVzdWx0LCBvbGRDaGlsZHJlbikge1xuXHQvKiogQHR5cGUge251bWJlcn0gKi9cblx0bGV0IGk7XG5cdC8qKiBAdHlwZSB7Vk5vZGV9ICovXG5cdGxldCBjaGlsZFZOb2RlO1xuXHQvKiogQHR5cGUge1ZOb2RlfSAqL1xuXHRsZXQgb2xkVk5vZGU7XG5cblx0Y29uc3QgbmV3Q2hpbGRyZW5MZW5ndGggPSByZW5kZXJSZXN1bHQubGVuZ3RoO1xuXHRsZXQgb2xkQ2hpbGRyZW5MZW5ndGggPSBvbGRDaGlsZHJlbi5sZW5ndGgsXG5cdFx0cmVtYWluaW5nT2xkQ2hpbGRyZW4gPSBvbGRDaGlsZHJlbkxlbmd0aDtcblxuXHRsZXQgc2tldyA9IDA7XG5cblx0bmV3UGFyZW50Vk5vZGUuX2NoaWxkcmVuID0gW107XG5cdGZvciAoaSA9IDA7IGkgPCBuZXdDaGlsZHJlbkxlbmd0aDsgaSsrKSB7XG5cdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciBXZSBhcmUgcmV1c2luZyB0aGUgY2hpbGRWTm9kZSB2YXJpYWJsZSB0byBob2xkIGJvdGggdGhlXG5cdFx0Ly8gcHJlIGFuZCBwb3N0IG5vcm1hbGl6ZWQgY2hpbGRWTm9kZVxuXHRcdGNoaWxkVk5vZGUgPSByZW5kZXJSZXN1bHRbaV07XG5cblx0XHRpZiAoXG5cdFx0XHRjaGlsZFZOb2RlID09IG51bGwgfHxcblx0XHRcdHR5cGVvZiBjaGlsZFZOb2RlID09ICdib29sZWFuJyB8fFxuXHRcdFx0dHlwZW9mIGNoaWxkVk5vZGUgPT0gJ2Z1bmN0aW9uJ1xuXHRcdCkge1xuXHRcdFx0Y2hpbGRWTm9kZSA9IG5ld1BhcmVudFZOb2RlLl9jaGlsZHJlbltpXSA9IG51bGw7XG5cdFx0fVxuXHRcdC8vIElmIHRoaXMgbmV3Vk5vZGUgaXMgYmVpbmcgcmV1c2VkIChlLmcuIDxkaXY+e3JldXNlfXtyZXVzZX08L2Rpdj4pIGluIHRoZSBzYW1lIGRpZmYsXG5cdFx0Ly8gb3Igd2UgYXJlIHJlbmRlcmluZyBhIGNvbXBvbmVudCAoZS5nLiBzZXRTdGF0ZSkgY29weSB0aGUgb2xkVk5vZGVzIHNvIGl0IGNhbiBoYXZlXG5cdFx0Ly8gaXQncyBvd24gRE9NICYgZXRjLiBwb2ludGVyc1xuXHRcdGVsc2UgaWYgKFxuXHRcdFx0dHlwZW9mIGNoaWxkVk5vZGUgPT0gJ3N0cmluZycgfHxcblx0XHRcdHR5cGVvZiBjaGlsZFZOb2RlID09ICdudW1iZXInIHx8XG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdmFsaWQtdHlwZW9mXG5cdFx0XHR0eXBlb2YgY2hpbGRWTm9kZSA9PSAnYmlnaW50JyB8fFxuXHRcdFx0Y2hpbGRWTm9kZS5jb25zdHJ1Y3RvciA9PSBTdHJpbmdcblx0XHQpIHtcblx0XHRcdGNoaWxkVk5vZGUgPSBuZXdQYXJlbnRWTm9kZS5fY2hpbGRyZW5baV0gPSBjcmVhdGVWTm9kZShcblx0XHRcdFx0bnVsbCxcblx0XHRcdFx0Y2hpbGRWTm9kZSxcblx0XHRcdFx0bnVsbCxcblx0XHRcdFx0bnVsbCxcblx0XHRcdFx0Y2hpbGRWTm9kZVxuXHRcdFx0KTtcblx0XHR9IGVsc2UgaWYgKGlzQXJyYXkoY2hpbGRWTm9kZSkpIHtcblx0XHRcdGNoaWxkVk5vZGUgPSBuZXdQYXJlbnRWTm9kZS5fY2hpbGRyZW5baV0gPSBjcmVhdGVWTm9kZShcblx0XHRcdFx0RnJhZ21lbnQsXG5cdFx0XHRcdHsgY2hpbGRyZW46IGNoaWxkVk5vZGUgfSxcblx0XHRcdFx0bnVsbCxcblx0XHRcdFx0bnVsbCxcblx0XHRcdFx0bnVsbFxuXHRcdFx0KTtcblx0XHR9IGVsc2UgaWYgKGNoaWxkVk5vZGUuY29uc3RydWN0b3IgPT09IHVuZGVmaW5lZCAmJiBjaGlsZFZOb2RlLl9kZXB0aCA+IDApIHtcblx0XHRcdC8vIFZOb2RlIGlzIGFscmVhZHkgaW4gdXNlLCBjbG9uZSBpdC4gVGhpcyBjYW4gaGFwcGVuIGluIHRoZSBmb2xsb3dpbmdcblx0XHRcdC8vIHNjZW5hcmlvOlxuXHRcdFx0Ly8gICBjb25zdCByZXVzZSA9IDxkaXYgLz5cblx0XHRcdC8vICAgPGRpdj57cmV1c2V9PHNwYW4gLz57cmV1c2V9PC9kaXY+XG5cdFx0XHRjaGlsZFZOb2RlID0gbmV3UGFyZW50Vk5vZGUuX2NoaWxkcmVuW2ldID0gY3JlYXRlVk5vZGUoXG5cdFx0XHRcdGNoaWxkVk5vZGUudHlwZSxcblx0XHRcdFx0Y2hpbGRWTm9kZS5wcm9wcyxcblx0XHRcdFx0Y2hpbGRWTm9kZS5rZXksXG5cdFx0XHRcdGNoaWxkVk5vZGUucmVmID8gY2hpbGRWTm9kZS5yZWYgOiBudWxsLFxuXHRcdFx0XHRjaGlsZFZOb2RlLl9vcmlnaW5hbFxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y2hpbGRWTm9kZSA9IG5ld1BhcmVudFZOb2RlLl9jaGlsZHJlbltpXSA9IGNoaWxkVk5vZGU7XG5cdFx0fVxuXG5cdFx0Ly8gSGFuZGxlIHVubW91bnRpbmcgbnVsbCBwbGFjZWhvbGRlcnMsIGkuZS4gVk5vZGUgPT4gbnVsbCBpbiB1bmtleWVkIGNoaWxkcmVuXG5cdFx0aWYgKGNoaWxkVk5vZGUgPT0gbnVsbCkge1xuXHRcdFx0b2xkVk5vZGUgPSBvbGRDaGlsZHJlbltpXTtcblx0XHRcdGlmIChvbGRWTm9kZSAmJiBvbGRWTm9kZS5rZXkgPT0gbnVsbCAmJiBvbGRWTm9kZS5fZG9tKSB7XG5cdFx0XHRcdGlmIChvbGRWTm9kZS5fZG9tID09IG5ld1BhcmVudFZOb2RlLl9uZXh0RG9tKSB7XG5cdFx0XHRcdFx0bmV3UGFyZW50Vk5vZGUuX25leHREb20gPSBnZXREb21TaWJsaW5nKG9sZFZOb2RlKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHVubW91bnQob2xkVk5vZGUsIG9sZFZOb2RlLCBmYWxzZSk7XG5cblx0XHRcdFx0Ly8gRXhwbGljaXRseSBudWxsaWZ5IHRoaXMgcG9zaXRpb24gaW4gb2xkQ2hpbGRyZW4gaW5zdGVhZCBvZiBqdXN0XG5cdFx0XHRcdC8vIHNldHRpbmcgYF9tYXRjaD10cnVlYCB0byBwcmV2ZW50IG90aGVyIHJvdXRpbmVzIChlLmcuXG5cdFx0XHRcdC8vIGBmaW5kTWF0Y2hpbmdJbmRleGAgb3IgYGdldERvbVNpYmxpbmdgKSBmcm9tIHRoaW5raW5nIFZOb2RlcyBvciBET01cblx0XHRcdFx0Ly8gbm9kZXMgaW4gdGhpcyBwb3NpdGlvbiBhcmUgc3RpbGwgYXZhaWxhYmxlIHRvIGJlIHVzZWQgaW4gZGlmZmluZyB3aGVuXG5cdFx0XHRcdC8vIHRoZXkgaGF2ZSBhY3R1YWxseSBhbHJlYWR5IGJlZW4gdW5tb3VudGVkLiBGb3IgZXhhbXBsZSwgYnkgb25seVxuXHRcdFx0XHQvLyBzZXR0aW5nIGBfbWF0Y2g9dHJ1ZWAgaGVyZSwgdGhlIHVubW91bnRpbmcgbG9vcCBsYXRlciB3b3VsZCBhdHRlbXB0XG5cdFx0XHRcdC8vIHRvIHVubW91bnQgdGhpcyBWTm9kZSBhZ2FpbiBzZWVpbmcgYF9tYXRjaD09dHJ1ZWAuICBGdXJ0aGVyLFxuXHRcdFx0XHQvLyBnZXREb21TaWJsaW5nIGRvZXNuJ3Qga25vdyBhYm91dCBfbWF0Y2ggYW5kIHNvIHdvdWxkIGluY29ycmVjdGx5XG5cdFx0XHRcdC8vIGFzc3VtZSBET00gbm9kZXMgaW4gdGhpcyBzdWJ0cmVlIGFyZSBtb3VudGVkIGFuZCB1c2FibGUuXG5cdFx0XHRcdG9sZENoaWxkcmVuW2ldID0gbnVsbDtcblx0XHRcdFx0cmVtYWluaW5nT2xkQ2hpbGRyZW4tLTtcblx0XHRcdH1cblxuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0Y2hpbGRWTm9kZS5fcGFyZW50ID0gbmV3UGFyZW50Vk5vZGU7XG5cdFx0Y2hpbGRWTm9kZS5fZGVwdGggPSBuZXdQYXJlbnRWTm9kZS5fZGVwdGggKyAxO1xuXG5cdFx0Y29uc3Qgc2tld2VkSW5kZXggPSBpICsgc2tldztcblx0XHRjb25zdCBtYXRjaGluZ0luZGV4ID0gZmluZE1hdGNoaW5nSW5kZXgoXG5cdFx0XHRjaGlsZFZOb2RlLFxuXHRcdFx0b2xkQ2hpbGRyZW4sXG5cdFx0XHRza2V3ZWRJbmRleCxcblx0XHRcdHJlbWFpbmluZ09sZENoaWxkcmVuXG5cdFx0KTtcblxuXHRcdC8vIFRlbXBvcmFyaWx5IHN0b3JlIHRoZSBtYXRjaGluZ0luZGV4IG9uIHRoZSBfaW5kZXggcHJvcGVydHkgc28gd2UgY2FuIHB1bGxcblx0XHQvLyBvdXQgdGhlIG9sZFZOb2RlIGluIGRpZmZDaGlsZHJlbi4gV2UnbGwgb3ZlcnJpZGUgdGhpcyB0byB0aGUgVk5vZGUnc1xuXHRcdC8vIGZpbmFsIGluZGV4IGFmdGVyIHVzaW5nIHRoaXMgcHJvcGVydHkgdG8gZ2V0IHRoZSBvbGRWTm9kZVxuXHRcdGNoaWxkVk5vZGUuX2luZGV4ID0gbWF0Y2hpbmdJbmRleDtcblxuXHRcdG9sZFZOb2RlID0gbnVsbDtcblx0XHRpZiAobWF0Y2hpbmdJbmRleCAhPT0gLTEpIHtcblx0XHRcdG9sZFZOb2RlID0gb2xkQ2hpbGRyZW5bbWF0Y2hpbmdJbmRleF07XG5cdFx0XHRyZW1haW5pbmdPbGRDaGlsZHJlbi0tO1xuXHRcdFx0aWYgKG9sZFZOb2RlKSB7XG5cdFx0XHRcdG9sZFZOb2RlLl9mbGFncyB8PSBNQVRDSEVEO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEhlcmUsIHdlIGRlZmluZSBpc01vdW50aW5nIGZvciB0aGUgcHVycG9zZXMgb2YgdGhlIHNrZXcgZGlmZmluZ1xuXHRcdC8vIGFsZ29yaXRobS4gTm9kZXMgdGhhdCBhcmUgdW5zdXNwZW5kaW5nIGFyZSBjb25zaWRlcmVkIG1vdW50aW5nIGFuZCB3ZSBkZXRlY3Rcblx0XHQvLyB0aGlzIGJ5IGNoZWNraW5nIGlmIG9sZFZOb2RlLl9vcmlnaW5hbCA9PT0gbnVsbFxuXHRcdGNvbnN0IGlzTW91bnRpbmcgPSBvbGRWTm9kZSA9PSBudWxsIHx8IG9sZFZOb2RlLl9vcmlnaW5hbCA9PT0gbnVsbDtcblxuXHRcdGlmIChpc01vdW50aW5nKSB7XG5cdFx0XHRpZiAobWF0Y2hpbmdJbmRleCA9PSAtMSkge1xuXHRcdFx0XHRza2V3LS07XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIHdlIGFyZSBtb3VudGluZyBhIERPTSBWTm9kZSwgbWFyayBpdCBmb3IgaW5zZXJ0aW9uXG5cdFx0XHRpZiAodHlwZW9mIGNoaWxkVk5vZGUudHlwZSAhPSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdGNoaWxkVk5vZGUuX2ZsYWdzIHw9IElOU0VSVF9WTk9ERTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKG1hdGNoaW5nSW5kZXggIT09IHNrZXdlZEluZGV4KSB7XG5cdFx0XHRpZiAobWF0Y2hpbmdJbmRleCA9PT0gc2tld2VkSW5kZXggKyAxKSB7XG5cdFx0XHRcdHNrZXcrKztcblx0XHRcdH0gZWxzZSBpZiAobWF0Y2hpbmdJbmRleCA+IHNrZXdlZEluZGV4KSB7XG5cdFx0XHRcdGlmIChyZW1haW5pbmdPbGRDaGlsZHJlbiA+IG5ld0NoaWxkcmVuTGVuZ3RoIC0gc2tld2VkSW5kZXgpIHtcblx0XHRcdFx0XHRza2V3ICs9IG1hdGNoaW5nSW5kZXggLSBza2V3ZWRJbmRleDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyAjIyMgQ2hhbmdlIGZyb20ga2V5ZWQ6IEkgdGhpbmsgdGhpcyB3YXMgbWlzc2luZyBmcm9tIHRoZSBhbGdvLi4uXG5cdFx0XHRcdFx0c2tldy0tO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKG1hdGNoaW5nSW5kZXggPCBza2V3ZWRJbmRleCkge1xuXHRcdFx0XHRpZiAobWF0Y2hpbmdJbmRleCA9PSBza2V3ZWRJbmRleCAtIDEpIHtcblx0XHRcdFx0XHRza2V3ID0gbWF0Y2hpbmdJbmRleCAtIHNrZXdlZEluZGV4O1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHNrZXcgPSAwO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRza2V3ID0gMDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTW92ZSB0aGlzIFZOb2RlJ3MgRE9NIGlmIHRoZSBvcmlnaW5hbCBpbmRleCAobWF0Y2hpbmdJbmRleCkgZG9lc24ndFxuXHRcdFx0Ly8gbWF0Y2ggdGhlIG5ldyBza2V3IGluZGV4IChpICsgbmV3IHNrZXcpXG5cdFx0XHRpZiAobWF0Y2hpbmdJbmRleCAhPT0gaSArIHNrZXcpIHtcblx0XHRcdFx0Y2hpbGRWTm9kZS5fZmxhZ3MgfD0gSU5TRVJUX1ZOT0RFO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIFJlbW92ZSByZW1haW5pbmcgb2xkQ2hpbGRyZW4gaWYgdGhlcmUgYXJlIGFueS4gTG9vcCBmb3J3YXJkcyBzbyB0aGF0IGFzIHdlXG5cdC8vIHVubW91bnQgRE9NIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgb2xkQ2hpbGRyZW4sIHdlIGNhbiBhZGp1c3Qgb2xkRG9tIHRvXG5cdC8vIHBvaW50IHRvIHRoZSBuZXh0IGNoaWxkLCB3aGljaCBuZWVkcyB0byBiZSB0aGUgZmlyc3QgRE9NIG5vZGUgdGhhdCB3b24ndCBiZVxuXHQvLyB1bm1vdW50ZWQuXG5cdGlmIChyZW1haW5pbmdPbGRDaGlsZHJlbikge1xuXHRcdGZvciAoaSA9IDA7IGkgPCBvbGRDaGlsZHJlbkxlbmd0aDsgaSsrKSB7XG5cdFx0XHRvbGRWTm9kZSA9IG9sZENoaWxkcmVuW2ldO1xuXHRcdFx0aWYgKG9sZFZOb2RlICE9IG51bGwgJiYgKG9sZFZOb2RlLl9mbGFncyAmIE1BVENIRUQpID09PSAwKSB7XG5cdFx0XHRcdGlmIChvbGRWTm9kZS5fZG9tID09IG5ld1BhcmVudFZOb2RlLl9uZXh0RG9tKSB7XG5cdFx0XHRcdFx0bmV3UGFyZW50Vk5vZGUuX25leHREb20gPSBnZXREb21TaWJsaW5nKG9sZFZOb2RlKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHVubW91bnQob2xkVk5vZGUsIG9sZFZOb2RlKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge1ZOb2RlfSBwYXJlbnRWTm9kZVxuICogQHBhcmFtIHtQcmVhY3RFbGVtZW50fSBvbGREb21cbiAqIEBwYXJhbSB7UHJlYWN0RWxlbWVudH0gcGFyZW50RG9tXG4gKiBAcmV0dXJucyB7UHJlYWN0RWxlbWVudH1cbiAqL1xuZnVuY3Rpb24gaW5zZXJ0KHBhcmVudFZOb2RlLCBvbGREb20sIHBhcmVudERvbSkge1xuXHQvLyBOb3RlOiBWTm9kZXMgaW4gbmVzdGVkIHN1c3BlbmRlZCB0cmVlcyBtYXkgYmUgbWlzc2luZyBfY2hpbGRyZW4uXG5cblx0aWYgKHR5cGVvZiBwYXJlbnRWTm9kZS50eXBlID09ICdmdW5jdGlvbicpIHtcblx0XHRsZXQgY2hpbGRyZW4gPSBwYXJlbnRWTm9kZS5fY2hpbGRyZW47XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGNoaWxkcmVuICYmIGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuXHRcdFx0aWYgKGNoaWxkcmVuW2ldKSB7XG5cdFx0XHRcdC8vIElmIHdlIGVudGVyIHRoaXMgY29kZSBwYXRoIG9uIHNDVSBiYWlsb3V0LCB3aGVyZSB3ZSBjb3B5XG5cdFx0XHRcdC8vIG9sZFZOb2RlLl9jaGlsZHJlbiB0byBuZXdWTm9kZS5fY2hpbGRyZW4sIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBvbGRcblx0XHRcdFx0Ly8gY2hpbGRyZW4ncyBfcGFyZW50IHBvaW50ZXIgdG8gcG9pbnQgdG8gdGhlIG5ld1ZOb2RlIChwYXJlbnRWTm9kZVxuXHRcdFx0XHQvLyBoZXJlKS5cblx0XHRcdFx0Y2hpbGRyZW5baV0uX3BhcmVudCA9IHBhcmVudFZOb2RlO1xuXHRcdFx0XHRvbGREb20gPSBpbnNlcnQoY2hpbGRyZW5baV0sIG9sZERvbSwgcGFyZW50RG9tKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gb2xkRG9tO1xuXHR9IGVsc2UgaWYgKHBhcmVudFZOb2RlLl9kb20gIT0gb2xkRG9tKSB7XG5cdFx0cGFyZW50RG9tLmluc2VydEJlZm9yZShwYXJlbnRWTm9kZS5fZG9tLCBvbGREb20gfHwgbnVsbCk7XG5cdFx0b2xkRG9tID0gcGFyZW50Vk5vZGUuX2RvbTtcblx0fVxuXG5cdHJldHVybiBvbGREb20gJiYgb2xkRG9tLm5leHRTaWJsaW5nO1xufVxuXG4vKipcbiAqIEZsYXR0ZW4gYW5kIGxvb3AgdGhyb3VnaCB0aGUgY2hpbGRyZW4gb2YgYSB2aXJ0dWFsIG5vZGVcbiAqIEBwYXJhbSB7Q29tcG9uZW50Q2hpbGRyZW59IGNoaWxkcmVuIFRoZSB1bmZsYXR0ZW5lZCBjaGlsZHJlbiBvZiBhIHZpcnR1YWxcbiAqIG5vZGVcbiAqIEByZXR1cm5zIHtWTm9kZVtdfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9DaGlsZEFycmF5KGNoaWxkcmVuLCBvdXQpIHtcblx0b3V0ID0gb3V0IHx8IFtdO1xuXHRpZiAoY2hpbGRyZW4gPT0gbnVsbCB8fCB0eXBlb2YgY2hpbGRyZW4gPT0gJ2Jvb2xlYW4nKSB7XG5cdH0gZWxzZSBpZiAoaXNBcnJheShjaGlsZHJlbikpIHtcblx0XHRjaGlsZHJlbi5zb21lKGNoaWxkID0+IHtcblx0XHRcdHRvQ2hpbGRBcnJheShjaGlsZCwgb3V0KTtcblx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHRvdXQucHVzaChjaGlsZHJlbik7XG5cdH1cblx0cmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge1ZOb2RlfSBjaGlsZFZOb2RlXG4gKiBAcGFyYW0ge1ZOb2RlW119IG9sZENoaWxkcmVuXG4gKiBAcGFyYW0ge251bWJlcn0gc2tld2VkSW5kZXhcbiAqIEBwYXJhbSB7bnVtYmVyfSByZW1haW5pbmdPbGRDaGlsZHJlblxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZnVuY3Rpb24gZmluZE1hdGNoaW5nSW5kZXgoXG5cdGNoaWxkVk5vZGUsXG5cdG9sZENoaWxkcmVuLFxuXHRza2V3ZWRJbmRleCxcblx0cmVtYWluaW5nT2xkQ2hpbGRyZW5cbikge1xuXHRjb25zdCBrZXkgPSBjaGlsZFZOb2RlLmtleTtcblx0Y29uc3QgdHlwZSA9IGNoaWxkVk5vZGUudHlwZTtcblx0bGV0IHggPSBza2V3ZWRJbmRleCAtIDE7XG5cdGxldCB5ID0gc2tld2VkSW5kZXggKyAxO1xuXHRsZXQgb2xkVk5vZGUgPSBvbGRDaGlsZHJlbltza2V3ZWRJbmRleF07XG5cblx0Ly8gV2Ugb25seSBuZWVkIHRvIHBlcmZvcm0gYSBzZWFyY2ggaWYgdGhlcmUgYXJlIG1vcmUgY2hpbGRyZW5cblx0Ly8gKHJlbWFpbmluZ09sZENoaWxkcmVuKSB0byBzZWFyY2guIEhvd2V2ZXIsIGlmIHRoZSBvbGRWTm9kZSB3ZSBqdXN0IGxvb2tlZFxuXHQvLyBhdCBza2V3ZWRJbmRleCB3YXMgbm90IGFscmVhZHkgdXNlZCBpbiB0aGlzIGRpZmYsIHRoZW4gdGhlcmUgbXVzdCBiZSBhdFxuXHQvLyBsZWFzdCAxIG90aGVyIChzbyBncmVhdGVyIHRoYW4gMSkgcmVtYWluaW5nT2xkQ2hpbGRyZW4gdG8gYXR0ZW1wdCB0byBtYXRjaFxuXHQvLyBhZ2FpbnN0LiBTbyB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbiBjaGVja3MgdGhhdCBlbnN1cmluZ1xuXHQvLyByZW1haW5pbmdPbGRDaGlsZHJlbiA+IDEgaWYgdGhlIG9sZFZOb2RlIGlzIG5vdCBhbHJlYWR5IHVzZWQvbWF0Y2hlZC4gRWxzZVxuXHQvLyBpZiB0aGUgb2xkVk5vZGUgd2FzIG51bGwgb3IgbWF0Y2hlZCwgdGhlbiB0aGVyZSBjb3VsZCBuZWVkcyB0byBiZSBhdCBsZWFzdFxuXHQvLyAxIChha2EgYHJlbWFpbmluZ09sZENoaWxkcmVuID4gMGApIGNoaWxkcmVuIHRvIGZpbmQgYW5kIGNvbXBhcmUgYWdhaW5zdC5cblx0bGV0IHNob3VsZFNlYXJjaCA9XG5cdFx0cmVtYWluaW5nT2xkQ2hpbGRyZW4gPlxuXHRcdChvbGRWTm9kZSAhPSBudWxsICYmIChvbGRWTm9kZS5fZmxhZ3MgJiBNQVRDSEVEKSA9PT0gMCA/IDEgOiAwKTtcblxuXHRpZiAoXG5cdFx0b2xkVk5vZGUgPT09IG51bGwgfHxcblx0XHQob2xkVk5vZGUgJiYga2V5ID09IG9sZFZOb2RlLmtleSAmJiB0eXBlID09PSBvbGRWTm9kZS50eXBlKVxuXHQpIHtcblx0XHRyZXR1cm4gc2tld2VkSW5kZXg7XG5cdH0gZWxzZSBpZiAoc2hvdWxkU2VhcmNoKSB7XG5cdFx0d2hpbGUgKHggPj0gMCB8fCB5IDwgb2xkQ2hpbGRyZW4ubGVuZ3RoKSB7XG5cdFx0XHRpZiAoeCA+PSAwKSB7XG5cdFx0XHRcdG9sZFZOb2RlID0gb2xkQ2hpbGRyZW5beF07XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRvbGRWTm9kZSAmJlxuXHRcdFx0XHRcdChvbGRWTm9kZS5fZmxhZ3MgJiBNQVRDSEVEKSA9PT0gMCAmJlxuXHRcdFx0XHRcdGtleSA9PSBvbGRWTm9kZS5rZXkgJiZcblx0XHRcdFx0XHR0eXBlID09PSBvbGRWTm9kZS50eXBlXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdHJldHVybiB4O1xuXHRcdFx0XHR9XG5cdFx0XHRcdHgtLTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHkgPCBvbGRDaGlsZHJlbi5sZW5ndGgpIHtcblx0XHRcdFx0b2xkVk5vZGUgPSBvbGRDaGlsZHJlblt5XTtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdG9sZFZOb2RlICYmXG5cdFx0XHRcdFx0KG9sZFZOb2RlLl9mbGFncyAmIE1BVENIRUQpID09PSAwICYmXG5cdFx0XHRcdFx0a2V5ID09IG9sZFZOb2RlLmtleSAmJlxuXHRcdFx0XHRcdHR5cGUgPT09IG9sZFZOb2RlLnR5cGVcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0cmV0dXJuIHk7XG5cdFx0XHRcdH1cblx0XHRcdFx0eSsrO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiAtMTtcbn1cbiIsICJpbXBvcnQgeyBJU19OT05fRElNRU5TSU9OQUwgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IG9wdGlvbnMgZnJvbSAnLi4vb3B0aW9ucyc7XG5cbmZ1bmN0aW9uIHNldFN0eWxlKHN0eWxlLCBrZXksIHZhbHVlKSB7XG5cdGlmIChrZXlbMF0gPT09ICctJykge1xuXHRcdHN0eWxlLnNldFByb3BlcnR5KGtleSwgdmFsdWUgPT0gbnVsbCA/ICcnIDogdmFsdWUpO1xuXHR9IGVsc2UgaWYgKHZhbHVlID09IG51bGwpIHtcblx0XHRzdHlsZVtrZXldID0gJyc7XG5cdH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlICE9ICdudW1iZXInIHx8IElTX05PTl9ESU1FTlNJT05BTC50ZXN0KGtleSkpIHtcblx0XHRzdHlsZVtrZXldID0gdmFsdWU7XG5cdH0gZWxzZSB7XG5cdFx0c3R5bGVba2V5XSA9IHZhbHVlICsgJ3B4Jztcblx0fVxufVxuXG4vKipcbiAqIFNldCBhIHByb3BlcnR5IHZhbHVlIG9uIGEgRE9NIG5vZGVcbiAqIEBwYXJhbSB7UHJlYWN0RWxlbWVudH0gZG9tIFRoZSBET00gbm9kZSB0byBtb2RpZnlcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXRcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldCB0aGUgcHJvcGVydHkgdG9cbiAqIEBwYXJhbSB7Kn0gb2xkVmFsdWUgVGhlIG9sZCB2YWx1ZSB0aGUgcHJvcGVydHkgaGFkXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzU3ZnIFdoZXRoZXIgb3Igbm90IHRoaXMgRE9NIG5vZGUgaXMgYW4gU1ZHIG5vZGUgb3Igbm90XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRQcm9wZXJ0eShkb20sIG5hbWUsIHZhbHVlLCBvbGRWYWx1ZSwgaXNTdmcpIHtcblx0bGV0IHVzZUNhcHR1cmU7XG5cblx0bzogaWYgKG5hbWUgPT09ICdzdHlsZScpIHtcblx0XHRpZiAodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnKSB7XG5cdFx0XHRkb20uc3R5bGUuY3NzVGV4dCA9IHZhbHVlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAodHlwZW9mIG9sZFZhbHVlID09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdGRvbS5zdHlsZS5jc3NUZXh0ID0gb2xkVmFsdWUgPSAnJztcblx0XHRcdH1cblxuXHRcdFx0aWYgKG9sZFZhbHVlKSB7XG5cdFx0XHRcdGZvciAobmFtZSBpbiBvbGRWYWx1ZSkge1xuXHRcdFx0XHRcdGlmICghKHZhbHVlICYmIG5hbWUgaW4gdmFsdWUpKSB7XG5cdFx0XHRcdFx0XHRzZXRTdHlsZShkb20uc3R5bGUsIG5hbWUsICcnKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKHZhbHVlKSB7XG5cdFx0XHRcdGZvciAobmFtZSBpbiB2YWx1ZSkge1xuXHRcdFx0XHRcdGlmICghb2xkVmFsdWUgfHwgdmFsdWVbbmFtZV0gIT09IG9sZFZhbHVlW25hbWVdKSB7XG5cdFx0XHRcdFx0XHRzZXRTdHlsZShkb20uc3R5bGUsIG5hbWUsIHZhbHVlW25hbWVdKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblx0Ly8gQmVuY2htYXJrIGZvciBjb21wYXJpc29uOiBodHRwczovL2VzYmVuY2guY29tL2JlbmNoLzU3NGM5NTRiZGI5NjViOWEwMDk2NWFjNlxuXHRlbHNlIGlmIChuYW1lWzBdID09PSAnbycgJiYgbmFtZVsxXSA9PT0gJ24nKSB7XG5cdFx0dXNlQ2FwdHVyZSA9XG5cdFx0XHRuYW1lICE9PSAobmFtZSA9IG5hbWUucmVwbGFjZSgvKFBvaW50ZXJDYXB0dXJlKSR8Q2FwdHVyZSQvLCAnJDEnKSk7XG5cblx0XHQvLyBJbmZlciBjb3JyZWN0IGNhc2luZyBmb3IgRE9NIGJ1aWx0LWluIGV2ZW50czpcblx0XHRpZiAobmFtZS50b0xvd2VyQ2FzZSgpIGluIGRvbSkgbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKS5zbGljZSgyKTtcblx0XHRlbHNlIG5hbWUgPSBuYW1lLnNsaWNlKDIpO1xuXG5cdFx0aWYgKCFkb20uX2xpc3RlbmVycykgZG9tLl9saXN0ZW5lcnMgPSB7fTtcblx0XHRkb20uX2xpc3RlbmVyc1tuYW1lICsgdXNlQ2FwdHVyZV0gPSB2YWx1ZTtcblxuXHRcdGlmICh2YWx1ZSkge1xuXHRcdFx0aWYgKCFvbGRWYWx1ZSkge1xuXHRcdFx0XHR2YWx1ZS5fYXR0YWNoZWQgPSBEYXRlLm5vdygpO1xuXHRcdFx0XHRjb25zdCBoYW5kbGVyID0gdXNlQ2FwdHVyZSA/IGV2ZW50UHJveHlDYXB0dXJlIDogZXZlbnRQcm94eTtcblx0XHRcdFx0ZG9tLmFkZEV2ZW50TGlzdGVuZXIobmFtZSwgaGFuZGxlciwgdXNlQ2FwdHVyZSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR2YWx1ZS5fYXR0YWNoZWQgPSBvbGRWYWx1ZS5fYXR0YWNoZWQ7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IGhhbmRsZXIgPSB1c2VDYXB0dXJlID8gZXZlbnRQcm94eUNhcHR1cmUgOiBldmVudFByb3h5O1xuXHRcdFx0ZG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZSwgaGFuZGxlciwgdXNlQ2FwdHVyZSk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdGlmIChpc1N2Zykge1xuXHRcdFx0Ly8gTm9ybWFsaXplIGluY29ycmVjdCBwcm9wIHVzYWdlIGZvciBTVkc6XG5cdFx0XHQvLyAtIHhsaW5rOmhyZWYgLyB4bGlua0hyZWYgLS0+IGhyZWYgKHhsaW5rOmhyZWYgd2FzIHJlbW92ZWQgZnJvbSBTVkcgYW5kIGlzbid0IG5lZWRlZClcblx0XHRcdC8vIC0gY2xhc3NOYW1lIC0tPiBjbGFzc1xuXHRcdFx0bmFtZSA9IG5hbWUucmVwbGFjZSgveGxpbmsoSHw6aCkvLCAnaCcpLnJlcGxhY2UoL3NOYW1lJC8sICdzJyk7XG5cdFx0fSBlbHNlIGlmIChcblx0XHRcdG5hbWUgIT09ICd3aWR0aCcgJiZcblx0XHRcdG5hbWUgIT09ICdoZWlnaHQnICYmXG5cdFx0XHRuYW1lICE9PSAnaHJlZicgJiZcblx0XHRcdG5hbWUgIT09ICdsaXN0JyAmJlxuXHRcdFx0bmFtZSAhPT0gJ2Zvcm0nICYmXG5cdFx0XHQvLyBEZWZhdWx0IHZhbHVlIGluIGJyb3dzZXJzIGlzIGAtMWAgYW5kIGFuIGVtcHR5IHN0cmluZyBpc1xuXHRcdFx0Ly8gY2FzdCB0byBgMGAgaW5zdGVhZFxuXHRcdFx0bmFtZSAhPT0gJ3RhYkluZGV4JyAmJlxuXHRcdFx0bmFtZSAhPT0gJ2Rvd25sb2FkJyAmJlxuXHRcdFx0bmFtZSAhPT0gJ3Jvd1NwYW4nICYmXG5cdFx0XHRuYW1lICE9PSAnY29sU3BhbicgJiZcblx0XHRcdG5hbWUgIT09ICdyb2xlJyAmJlxuXHRcdFx0bmFtZSBpbiBkb21cblx0XHQpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGRvbVtuYW1lXSA9IHZhbHVlID09IG51bGwgPyAnJyA6IHZhbHVlO1xuXHRcdFx0XHQvLyBsYWJlbGxlZCBicmVhayBpcyAxYiBzbWFsbGVyIGhlcmUgdGhhbiBhIHJldHVybiBzdGF0ZW1lbnQgKHNvcnJ5KVxuXHRcdFx0XHRicmVhayBvO1xuXHRcdFx0fSBjYXRjaCAoZSkge31cblx0XHR9XG5cblx0XHQvLyBhcmlhLSBhbmQgZGF0YS0gYXR0cmlidXRlcyBoYXZlIG5vIGJvb2xlYW4gcmVwcmVzZW50YXRpb24uXG5cdFx0Ly8gQSBgZmFsc2VgIHZhbHVlIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBhdHRyaWJ1dGUgbm90IGJlaW5nXG5cdFx0Ly8gcHJlc2VudCwgc28gd2UgY2FuJ3QgcmVtb3ZlIGl0LiBGb3Igbm9uLWJvb2xlYW4gYXJpYVxuXHRcdC8vIGF0dHJpYnV0ZXMgd2UgY291bGQgdHJlYXQgZmFsc2UgYXMgYSByZW1vdmFsLCBidXQgdGhlXG5cdFx0Ly8gYW1vdW50IG9mIGV4Y2VwdGlvbnMgd291bGQgY29zdCB0b28gbWFueSBieXRlcy4gT24gdG9wIG9mXG5cdFx0Ly8gdGhhdCBvdGhlciBmcmFtZXdvcmtzIGdlbmVyYWxseSBzdHJpbmdpZnkgYGZhbHNlYC5cblxuXHRcdGlmICh0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0Ly8gbmV2ZXIgc2VyaWFsaXplIGZ1bmN0aW9ucyBhcyBhdHRyaWJ1dGUgdmFsdWVzXG5cdFx0fSBlbHNlIGlmICh2YWx1ZSAhPSBudWxsICYmICh2YWx1ZSAhPT0gZmFsc2UgfHwgbmFtZVs0XSA9PT0gJy0nKSkge1xuXHRcdFx0ZG9tLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRvbS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG5cdFx0fVxuXHR9XG59XG5cbi8qKlxuICogUHJveHkgYW4gZXZlbnQgdG8gaG9va2VkIGV2ZW50IGhhbmRsZXJzXG4gKiBAcGFyYW0ge1ByZWFjdEV2ZW50fSBlIFRoZSBldmVudCBvYmplY3QgZnJvbSB0aGUgYnJvd3NlclxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZXZlbnRQcm94eShlKSB7XG5cdGNvbnN0IGV2ZW50SGFuZGxlciA9IHRoaXMuX2xpc3RlbmVyc1tlLnR5cGUgKyBmYWxzZV07XG5cdC8qKlxuXHQgKiBUaGlzIHRyaWNrIGlzIGluc3BpcmVkIGJ5IFZ1ZSBodHRwczovL2dpdGh1Yi5jb20vdnVlanMvY29yZS9ibG9iL21haW4vcGFja2FnZXMvcnVudGltZS1kb20vc3JjL21vZHVsZXMvZXZlbnRzLnRzI0w5MC1MMTAxXG5cdCAqIHdoZW4gdGhlIGRvbSBwZXJmb3JtcyBhbiBldmVudCBpdCBsZWF2ZXMgbWljcm8tdGlja3MgaW4gYmV0d2VlbiBidWJibGluZyB1cCB3aGljaCBtZWFucyB0aGF0IGFuIGV2ZW50IGNhbiB0cmlnZ2VyIG9uIGEgbmV3bHlcblx0ICogY3JlYXRlZCBET00tbm9kZSB3aGlsZSB0aGUgZXZlbnQgYnViYmxlcyB1cCwgdGhpcyBjYW4gY2F1c2UgcXVpcmt5IGJlaGF2aW9yIGFzIHNlZW4gaW4gaHR0cHM6Ly9naXRodWIuY29tL3ByZWFjdGpzL3ByZWFjdC9pc3N1ZXMvMzkyN1xuXHQgKi9cblx0aWYgKCFlLl9kaXNwYXRjaGVkKSB7XG5cdFx0Ly8gV2hlbiBhbiBldmVudCBoYXMgbm8gX2Rpc3BhdGNoZWQgd2Uga25vdyB0aGlzIGlzIHRoZSBmaXJzdCBldmVudC10YXJnZXQgaW4gdGhlIGNoYWluXG5cdFx0Ly8gc28gd2Ugc2V0IHRoZSBpbml0aWFsIGRpc3BhdGNoZWQgdGltZS5cblx0XHRlLl9kaXNwYXRjaGVkID0gRGF0ZS5ub3coKTtcblx0XHQvLyBXaGVuIHRoZSBfZGlzcGF0Y2hlZCBpcyBzbWFsbGVyIHRoYW4gdGhlIHRpbWUgd2hlbiB0aGUgdGFyZ2V0dGVkIGV2ZW50IGhhbmRsZXIgd2FzIGF0dGFjaGVkXG5cdFx0Ly8gd2Uga25vdyB3ZSBoYXZlIGJ1YmJsZWQgdXAgdG8gYW4gZWxlbWVudCB0aGF0IHdhcyBhZGRlZCBkdXJpbmcgcGF0Y2hpbmcgdGhlIGRvbS5cblx0fSBlbHNlIGlmIChlLl9kaXNwYXRjaGVkIDw9IGV2ZW50SGFuZGxlci5fYXR0YWNoZWQpIHtcblx0XHRyZXR1cm47XG5cdH1cblx0cmV0dXJuIGV2ZW50SGFuZGxlcihvcHRpb25zLmV2ZW50ID8gb3B0aW9ucy5ldmVudChlKSA6IGUpO1xufVxuXG4vKipcbiAqIFByb3h5IGFuIGV2ZW50IHRvIGhvb2tlZCBldmVudCBoYW5kbGVyc1xuICogQHBhcmFtIHtQcmVhY3RFdmVudH0gZSBUaGUgZXZlbnQgb2JqZWN0IGZyb20gdGhlIGJyb3dzZXJcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGV2ZW50UHJveHlDYXB0dXJlKGUpIHtcblx0cmV0dXJuIHRoaXMuX2xpc3RlbmVyc1tlLnR5cGUgKyB0cnVlXShvcHRpb25zLmV2ZW50ID8gb3B0aW9ucy5ldmVudChlKSA6IGUpO1xufVxuIiwgImltcG9ydCB7XG5cdEVNUFRZX09CSixcblx0TU9ERV9IWURSQVRFLFxuXHRNT0RFX1NVU1BFTkRFRCxcblx0UkVTRVRfTU9ERVxufSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgQmFzZUNvbXBvbmVudCwgZ2V0RG9tU2libGluZyB9IGZyb20gJy4uL2NvbXBvbmVudCc7XG5pbXBvcnQgeyBGcmFnbWVudCB9IGZyb20gJy4uL2NyZWF0ZS1lbGVtZW50JztcbmltcG9ydCB7IGRpZmZDaGlsZHJlbiB9IGZyb20gJy4vY2hpbGRyZW4nO1xuaW1wb3J0IHsgc2V0UHJvcGVydHkgfSBmcm9tICcuL3Byb3BzJztcbmltcG9ydCB7IGFzc2lnbiwgaXNBcnJheSwgcmVtb3ZlTm9kZSwgc2xpY2UgfSBmcm9tICcuLi91dGlsJztcbmltcG9ydCBvcHRpb25zIGZyb20gJy4uL29wdGlvbnMnO1xuXG4vKipcbiAqIERpZmYgdHdvIHZpcnR1YWwgbm9kZXMgYW5kIGFwcGx5IHByb3BlciBjaGFuZ2VzIHRvIHRoZSBET01cbiAqIEBwYXJhbSB7UHJlYWN0RWxlbWVudH0gcGFyZW50RG9tIFRoZSBwYXJlbnQgb2YgdGhlIERPTSBlbGVtZW50XG4gKiBAcGFyYW0ge1ZOb2RlfSBuZXdWTm9kZSBUaGUgbmV3IHZpcnR1YWwgbm9kZVxuICogQHBhcmFtIHtWTm9kZX0gb2xkVk5vZGUgVGhlIG9sZCB2aXJ0dWFsIG5vZGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBnbG9iYWxDb250ZXh0IFRoZSBjdXJyZW50IGNvbnRleHQgb2JqZWN0LiBNb2RpZmllZCBieVxuICogZ2V0Q2hpbGRDb250ZXh0XG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzU3ZnIFdoZXRoZXIgb3Igbm90IHRoaXMgZWxlbWVudCBpcyBhbiBTVkcgbm9kZVxuICogQHBhcmFtIHtBcnJheTxQcmVhY3RFbGVtZW50Pn0gZXhjZXNzRG9tQ2hpbGRyZW5cbiAqIEBwYXJhbSB7QXJyYXk8Q29tcG9uZW50Pn0gY29tbWl0UXVldWUgTGlzdCBvZiBjb21wb25lbnRzIHdoaWNoIGhhdmUgY2FsbGJhY2tzXG4gKiB0byBpbnZva2UgaW4gY29tbWl0Um9vdFxuICogQHBhcmFtIHtQcmVhY3RFbGVtZW50fSBvbGREb20gVGhlIGN1cnJlbnQgYXR0YWNoZWQgRE9NIGVsZW1lbnQgYW55IG5ldyBkb21cbiAqIGVsZW1lbnRzIHNob3VsZCBiZSBwbGFjZWQgYXJvdW5kLiBMaWtlbHkgYG51bGxgIG9uIGZpcnN0IHJlbmRlciAoZXhjZXB0IHdoZW5cbiAqIGh5ZHJhdGluZykuIENhbiBiZSBhIHNpYmxpbmcgRE9NIGVsZW1lbnQgd2hlbiBkaWZmaW5nIEZyYWdtZW50cyB0aGF0IGhhdmVcbiAqIHNpYmxpbmdzLiBJbiBtb3N0IGNhc2VzLCBpdCBzdGFydHMgb3V0IGFzIGBvbGRDaGlsZHJlblswXS5fZG9tYC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNIeWRyYXRpbmcgV2hldGhlciBvciBub3Qgd2UgYXJlIGluIGh5ZHJhdGlvblxuICogQHBhcmFtIHthbnlbXX0gcmVmUXVldWUgYW4gYXJyYXkgb2YgZWxlbWVudHMgbmVlZGVkIHRvIGludm9rZSByZWZzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaWZmKFxuXHRwYXJlbnREb20sXG5cdG5ld1ZOb2RlLFxuXHRvbGRWTm9kZSxcblx0Z2xvYmFsQ29udGV4dCxcblx0aXNTdmcsXG5cdGV4Y2Vzc0RvbUNoaWxkcmVuLFxuXHRjb21taXRRdWV1ZSxcblx0b2xkRG9tLFxuXHRpc0h5ZHJhdGluZyxcblx0cmVmUXVldWVcbikge1xuXHQvKiogQHR5cGUge2FueX0gKi9cblx0bGV0IHRtcCxcblx0XHRuZXdUeXBlID0gbmV3Vk5vZGUudHlwZTtcblxuXHQvLyBXaGVuIHBhc3NpbmcgdGhyb3VnaCBjcmVhdGVFbGVtZW50IGl0IGFzc2lnbnMgdGhlIG9iamVjdFxuXHQvLyBjb25zdHJ1Y3RvciBhcyB1bmRlZmluZWQuIFRoaXMgdG8gcHJldmVudCBKU09OLWluamVjdGlvbi5cblx0aWYgKG5ld1ZOb2RlLmNvbnN0cnVjdG9yICE9PSB1bmRlZmluZWQpIHJldHVybiBudWxsO1xuXG5cdC8vIElmIHRoZSBwcmV2aW91cyBkaWZmIGJhaWxlZCBvdXQsIHJlc3VtZSBjcmVhdGluZy9oeWRyYXRpbmcuXG5cdGlmIChvbGRWTm9kZS5fZmxhZ3MgJiBNT0RFX1NVU1BFTkRFRCkge1xuXHRcdGlzSHlkcmF0aW5nID0gISEob2xkVk5vZGUuX2ZsYWdzICYgTU9ERV9IWURSQVRFKTtcblx0XHRvbGREb20gPSBuZXdWTm9kZS5fZG9tID0gb2xkVk5vZGUuX2RvbTtcblx0XHRleGNlc3NEb21DaGlsZHJlbiA9IFtvbGREb21dO1xuXHR9XG5cblx0aWYgKCh0bXAgPSBvcHRpb25zLl9kaWZmKSkgdG1wKG5ld1ZOb2RlKTtcblxuXHRvdXRlcjogaWYgKHR5cGVvZiBuZXdUeXBlID09ICdmdW5jdGlvbicpIHtcblx0XHR0cnkge1xuXHRcdFx0bGV0IGMsIGlzTmV3LCBvbGRQcm9wcywgb2xkU3RhdGUsIHNuYXBzaG90LCBjbGVhclByb2Nlc3NpbmdFeGNlcHRpb247XG5cdFx0XHRsZXQgbmV3UHJvcHMgPSBuZXdWTm9kZS5wcm9wcztcblxuXHRcdFx0Ly8gTmVjZXNzYXJ5IGZvciBjcmVhdGVDb250ZXh0IGFwaS4gU2V0dGluZyB0aGlzIHByb3BlcnR5IHdpbGwgcGFzc1xuXHRcdFx0Ly8gdGhlIGNvbnRleHQgdmFsdWUgYXMgYHRoaXMuY29udGV4dGAganVzdCBmb3IgdGhpcyBjb21wb25lbnQuXG5cdFx0XHR0bXAgPSBuZXdUeXBlLmNvbnRleHRUeXBlO1xuXHRcdFx0bGV0IHByb3ZpZGVyID0gdG1wICYmIGdsb2JhbENvbnRleHRbdG1wLl9pZF07XG5cdFx0XHRsZXQgY29tcG9uZW50Q29udGV4dCA9IHRtcFxuXHRcdFx0XHQ/IHByb3ZpZGVyXG5cdFx0XHRcdFx0PyBwcm92aWRlci5wcm9wcy52YWx1ZVxuXHRcdFx0XHRcdDogdG1wLl9kZWZhdWx0VmFsdWVcblx0XHRcdFx0OiBnbG9iYWxDb250ZXh0O1xuXG5cdFx0XHQvLyBHZXQgY29tcG9uZW50IGFuZCBzZXQgaXQgdG8gYGNgXG5cdFx0XHRpZiAob2xkVk5vZGUuX2NvbXBvbmVudCkge1xuXHRcdFx0XHRjID0gbmV3Vk5vZGUuX2NvbXBvbmVudCA9IG9sZFZOb2RlLl9jb21wb25lbnQ7XG5cdFx0XHRcdGNsZWFyUHJvY2Vzc2luZ0V4Y2VwdGlvbiA9IGMuX3Byb2Nlc3NpbmdFeGNlcHRpb24gPSBjLl9wZW5kaW5nRXJyb3I7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBJbnN0YW50aWF0ZSB0aGUgbmV3IGNvbXBvbmVudFxuXHRcdFx0XHRpZiAoJ3Byb3RvdHlwZScgaW4gbmV3VHlwZSAmJiBuZXdUeXBlLnByb3RvdHlwZS5yZW5kZXIpIHtcblx0XHRcdFx0XHQvLyBAdHMtZXhwZWN0LWVycm9yIFRoZSBjaGVjayBhYm92ZSB2ZXJpZmllcyB0aGF0IG5ld1R5cGUgaXMgc3VwcG9zZSB0byBiZSBjb25zdHJ1Y3RlZFxuXHRcdFx0XHRcdG5ld1ZOb2RlLl9jb21wb25lbnQgPSBjID0gbmV3IG5ld1R5cGUobmV3UHJvcHMsIGNvbXBvbmVudENvbnRleHQpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5ldy1jYXBcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBAdHMtZXhwZWN0LWVycm9yIFRydXN0IG1lLCBDb21wb25lbnQgaW1wbGVtZW50cyB0aGUgaW50ZXJmYWNlIHdlIHdhbnRcblx0XHRcdFx0XHRuZXdWTm9kZS5fY29tcG9uZW50ID0gYyA9IG5ldyBCYXNlQ29tcG9uZW50KFxuXHRcdFx0XHRcdFx0bmV3UHJvcHMsXG5cdFx0XHRcdFx0XHRjb21wb25lbnRDb250ZXh0XG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRjLmNvbnN0cnVjdG9yID0gbmV3VHlwZTtcblx0XHRcdFx0XHRjLnJlbmRlciA9IGRvUmVuZGVyO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChwcm92aWRlcikgcHJvdmlkZXIuc3ViKGMpO1xuXG5cdFx0XHRcdGMucHJvcHMgPSBuZXdQcm9wcztcblx0XHRcdFx0aWYgKCFjLnN0YXRlKSBjLnN0YXRlID0ge307XG5cdFx0XHRcdGMuY29udGV4dCA9IGNvbXBvbmVudENvbnRleHQ7XG5cdFx0XHRcdGMuX2dsb2JhbENvbnRleHQgPSBnbG9iYWxDb250ZXh0O1xuXHRcdFx0XHRpc05ldyA9IGMuX2RpcnR5ID0gdHJ1ZTtcblx0XHRcdFx0Yy5fcmVuZGVyQ2FsbGJhY2tzID0gW107XG5cdFx0XHRcdGMuX3N0YXRlQ2FsbGJhY2tzID0gW107XG5cdFx0XHR9XG5cblx0XHRcdC8vIEludm9rZSBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHNcblx0XHRcdGlmIChjLl9uZXh0U3RhdGUgPT0gbnVsbCkge1xuXHRcdFx0XHRjLl9uZXh0U3RhdGUgPSBjLnN0YXRlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAobmV3VHlwZS5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgIT0gbnVsbCkge1xuXHRcdFx0XHRpZiAoYy5fbmV4dFN0YXRlID09IGMuc3RhdGUpIHtcblx0XHRcdFx0XHRjLl9uZXh0U3RhdGUgPSBhc3NpZ24oe30sIGMuX25leHRTdGF0ZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRhc3NpZ24oXG5cdFx0XHRcdFx0Yy5fbmV4dFN0YXRlLFxuXHRcdFx0XHRcdG5ld1R5cGUuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKG5ld1Byb3BzLCBjLl9uZXh0U3RhdGUpXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdG9sZFByb3BzID0gYy5wcm9wcztcblx0XHRcdG9sZFN0YXRlID0gYy5zdGF0ZTtcblx0XHRcdGMuX3Zub2RlID0gbmV3Vk5vZGU7XG5cblx0XHRcdC8vIEludm9rZSBwcmUtcmVuZGVyIGxpZmVjeWNsZSBtZXRob2RzXG5cdFx0XHRpZiAoaXNOZXcpIHtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdG5ld1R5cGUuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09IG51bGwgJiZcblx0XHRcdFx0XHRjLmNvbXBvbmVudFdpbGxNb3VudCAhPSBudWxsXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdGMuY29tcG9uZW50V2lsbE1vdW50KCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoYy5jb21wb25lbnREaWRNb3VudCAhPSBudWxsKSB7XG5cdFx0XHRcdFx0Yy5fcmVuZGVyQ2FsbGJhY2tzLnB1c2goYy5jb21wb25lbnREaWRNb3VudCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRuZXdUeXBlLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PSBudWxsICYmXG5cdFx0XHRcdFx0bmV3UHJvcHMgIT09IG9sZFByb3BzICYmXG5cdFx0XHRcdFx0Yy5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzICE9IG51bGxcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0Yy5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5ld1Byb3BzLCBjb21wb25lbnRDb250ZXh0KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHQhYy5fZm9yY2UgJiZcblx0XHRcdFx0XHQoKGMuc2hvdWxkQ29tcG9uZW50VXBkYXRlICE9IG51bGwgJiZcblx0XHRcdFx0XHRcdGMuc2hvdWxkQ29tcG9uZW50VXBkYXRlKFxuXHRcdFx0XHRcdFx0XHRuZXdQcm9wcyxcblx0XHRcdFx0XHRcdFx0Yy5fbmV4dFN0YXRlLFxuXHRcdFx0XHRcdFx0XHRjb21wb25lbnRDb250ZXh0XG5cdFx0XHRcdFx0XHQpID09PSBmYWxzZSkgfHxcblx0XHRcdFx0XHRcdG5ld1ZOb2RlLl9vcmlnaW5hbCA9PT0gb2xkVk5vZGUuX29yaWdpbmFsKVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHQvLyBNb3JlIGluZm8gYWJvdXQgdGhpcyBoZXJlOiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9Kb3ZpRGVDcm9vY2svYmVjNWYyY2U5MzU0NGQyZTYwNzBlZjhlMDAzNmU0ZThcblx0XHRcdFx0XHRpZiAobmV3Vk5vZGUuX29yaWdpbmFsICE9PSBvbGRWTm9kZS5fb3JpZ2luYWwpIHtcblx0XHRcdFx0XHRcdC8vIFdoZW4gd2UgYXJlIGRlYWxpbmcgd2l0aCBhIGJhaWwgYmVjYXVzZSBvZiBzQ1Ugd2UgaGF2ZSB0byB1cGRhdGVcblx0XHRcdFx0XHRcdC8vIHRoZSBwcm9wcywgc3RhdGUgYW5kIGRpcnR5LXN0YXRlLlxuXHRcdFx0XHRcdFx0Ly8gd2hlbiB3ZSBhcmUgZGVhbGluZyB3aXRoIHN0cmljdC1lcXVhbGl0eSB3ZSBkb24ndCBhcyB0aGUgY2hpbGQgY291bGQgc3RpbGxcblx0XHRcdFx0XHRcdC8vIGJlIGRpcnRpZWQgc2VlICMzODgzXG5cdFx0XHRcdFx0XHRjLnByb3BzID0gbmV3UHJvcHM7XG5cdFx0XHRcdFx0XHRjLnN0YXRlID0gYy5fbmV4dFN0YXRlO1xuXHRcdFx0XHRcdFx0Yy5fZGlydHkgPSBmYWxzZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRuZXdWTm9kZS5fZG9tID0gb2xkVk5vZGUuX2RvbTtcblx0XHRcdFx0XHRuZXdWTm9kZS5fY2hpbGRyZW4gPSBvbGRWTm9kZS5fY2hpbGRyZW47XG5cdFx0XHRcdFx0bmV3Vk5vZGUuX2NoaWxkcmVuLmZvckVhY2godm5vZGUgPT4ge1xuXHRcdFx0XHRcdFx0aWYgKHZub2RlKSB2bm9kZS5fcGFyZW50ID0gbmV3Vk5vZGU7XG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGMuX3N0YXRlQ2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRjLl9yZW5kZXJDYWxsYmFja3MucHVzaChjLl9zdGF0ZUNhbGxiYWNrc1tpXSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGMuX3N0YXRlQ2FsbGJhY2tzID0gW107XG5cblx0XHRcdFx0XHRpZiAoYy5fcmVuZGVyQ2FsbGJhY2tzLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0Y29tbWl0UXVldWUucHVzaChjKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRicmVhayBvdXRlcjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChjLmNvbXBvbmVudFdpbGxVcGRhdGUgIT0gbnVsbCkge1xuXHRcdFx0XHRcdGMuY29tcG9uZW50V2lsbFVwZGF0ZShuZXdQcm9wcywgYy5fbmV4dFN0YXRlLCBjb21wb25lbnRDb250ZXh0KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChjLmNvbXBvbmVudERpZFVwZGF0ZSAhPSBudWxsKSB7XG5cdFx0XHRcdFx0Yy5fcmVuZGVyQ2FsbGJhY2tzLnB1c2goKCkgPT4ge1xuXHRcdFx0XHRcdFx0Yy5jb21wb25lbnREaWRVcGRhdGUob2xkUHJvcHMsIG9sZFN0YXRlLCBzbmFwc2hvdCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Yy5jb250ZXh0ID0gY29tcG9uZW50Q29udGV4dDtcblx0XHRcdGMucHJvcHMgPSBuZXdQcm9wcztcblx0XHRcdGMuX3BhcmVudERvbSA9IHBhcmVudERvbTtcblx0XHRcdGMuX2ZvcmNlID0gZmFsc2U7XG5cblx0XHRcdGxldCByZW5kZXJIb29rID0gb3B0aW9ucy5fcmVuZGVyLFxuXHRcdFx0XHRjb3VudCA9IDA7XG5cdFx0XHRpZiAoJ3Byb3RvdHlwZScgaW4gbmV3VHlwZSAmJiBuZXdUeXBlLnByb3RvdHlwZS5yZW5kZXIpIHtcblx0XHRcdFx0Yy5zdGF0ZSA9IGMuX25leHRTdGF0ZTtcblx0XHRcdFx0Yy5fZGlydHkgPSBmYWxzZTtcblxuXHRcdFx0XHRpZiAocmVuZGVySG9vaykgcmVuZGVySG9vayhuZXdWTm9kZSk7XG5cblx0XHRcdFx0dG1wID0gYy5yZW5kZXIoYy5wcm9wcywgYy5zdGF0ZSwgYy5jb250ZXh0KTtcblxuXHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGMuX3N0YXRlQ2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0Yy5fcmVuZGVyQ2FsbGJhY2tzLnB1c2goYy5fc3RhdGVDYWxsYmFja3NbaV0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGMuX3N0YXRlQ2FsbGJhY2tzID0gW107XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkbyB7XG5cdFx0XHRcdFx0Yy5fZGlydHkgPSBmYWxzZTtcblx0XHRcdFx0XHRpZiAocmVuZGVySG9vaykgcmVuZGVySG9vayhuZXdWTm9kZSk7XG5cblx0XHRcdFx0XHR0bXAgPSBjLnJlbmRlcihjLnByb3BzLCBjLnN0YXRlLCBjLmNvbnRleHQpO1xuXG5cdFx0XHRcdFx0Ly8gSGFuZGxlIHNldFN0YXRlIGNhbGxlZCBpbiByZW5kZXIsIHNlZSAjMjU1M1xuXHRcdFx0XHRcdGMuc3RhdGUgPSBjLl9uZXh0U3RhdGU7XG5cdFx0XHRcdH0gd2hpbGUgKGMuX2RpcnR5ICYmICsrY291bnQgPCAyNSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEhhbmRsZSBzZXRTdGF0ZSBjYWxsZWQgaW4gcmVuZGVyLCBzZWUgIzI1NTNcblx0XHRcdGMuc3RhdGUgPSBjLl9uZXh0U3RhdGU7XG5cblx0XHRcdGlmIChjLmdldENoaWxkQ29udGV4dCAhPSBudWxsKSB7XG5cdFx0XHRcdGdsb2JhbENvbnRleHQgPSBhc3NpZ24oYXNzaWduKHt9LCBnbG9iYWxDb250ZXh0KSwgYy5nZXRDaGlsZENvbnRleHQoKSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghaXNOZXcgJiYgYy5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSAhPSBudWxsKSB7XG5cdFx0XHRcdHNuYXBzaG90ID0gYy5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZShvbGRQcm9wcywgb2xkU3RhdGUpO1xuXHRcdFx0fVxuXG5cdFx0XHRsZXQgaXNUb3BMZXZlbEZyYWdtZW50ID1cblx0XHRcdFx0dG1wICE9IG51bGwgJiYgdG1wLnR5cGUgPT09IEZyYWdtZW50ICYmIHRtcC5rZXkgPT0gbnVsbDtcblx0XHRcdGxldCByZW5kZXJSZXN1bHQgPSBpc1RvcExldmVsRnJhZ21lbnQgPyB0bXAucHJvcHMuY2hpbGRyZW4gOiB0bXA7XG5cblx0XHRcdGRpZmZDaGlsZHJlbihcblx0XHRcdFx0cGFyZW50RG9tLFxuXHRcdFx0XHRpc0FycmF5KHJlbmRlclJlc3VsdCkgPyByZW5kZXJSZXN1bHQgOiBbcmVuZGVyUmVzdWx0XSxcblx0XHRcdFx0bmV3Vk5vZGUsXG5cdFx0XHRcdG9sZFZOb2RlLFxuXHRcdFx0XHRnbG9iYWxDb250ZXh0LFxuXHRcdFx0XHRpc1N2Zyxcblx0XHRcdFx0ZXhjZXNzRG9tQ2hpbGRyZW4sXG5cdFx0XHRcdGNvbW1pdFF1ZXVlLFxuXHRcdFx0XHRvbGREb20sXG5cdFx0XHRcdGlzSHlkcmF0aW5nLFxuXHRcdFx0XHRyZWZRdWV1ZVxuXHRcdFx0KTtcblxuXHRcdFx0Yy5iYXNlID0gbmV3Vk5vZGUuX2RvbTtcblxuXHRcdFx0Ly8gV2Ugc3VjY2Vzc2Z1bGx5IHJlbmRlcmVkIHRoaXMgVk5vZGUsIHVuc2V0IGFueSBzdG9yZWQgaHlkcmF0aW9uL2JhaWxvdXQgc3RhdGU6XG5cdFx0XHRuZXdWTm9kZS5fZmxhZ3MgJj0gUkVTRVRfTU9ERTtcblxuXHRcdFx0aWYgKGMuX3JlbmRlckNhbGxiYWNrcy5sZW5ndGgpIHtcblx0XHRcdFx0Y29tbWl0UXVldWUucHVzaChjKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGNsZWFyUHJvY2Vzc2luZ0V4Y2VwdGlvbikge1xuXHRcdFx0XHRjLl9wZW5kaW5nRXJyb3IgPSBjLl9wcm9jZXNzaW5nRXhjZXB0aW9uID0gbnVsbDtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRuZXdWTm9kZS5fb3JpZ2luYWwgPSBudWxsO1xuXHRcdFx0Ly8gaWYgaHlkcmF0aW5nIG9yIGNyZWF0aW5nIGluaXRpYWwgdHJlZSwgYmFpbG91dCBwcmVzZXJ2ZXMgRE9NOlxuXHRcdFx0aWYgKGlzSHlkcmF0aW5nIHx8IGV4Y2Vzc0RvbUNoaWxkcmVuICE9IG51bGwpIHtcblx0XHRcdFx0bmV3Vk5vZGUuX2RvbSA9IG9sZERvbTtcblx0XHRcdFx0bmV3Vk5vZGUuX2ZsYWdzIHw9IGlzSHlkcmF0aW5nXG5cdFx0XHRcdFx0PyBNT0RFX0hZRFJBVEUgfCBNT0RFX1NVU1BFTkRFRFxuXHRcdFx0XHRcdDogTU9ERV9IWURSQVRFO1xuXHRcdFx0XHRleGNlc3NEb21DaGlsZHJlbltleGNlc3NEb21DaGlsZHJlbi5pbmRleE9mKG9sZERvbSldID0gbnVsbDtcblx0XHRcdFx0Ly8gXiBjb3VsZCBwb3NzaWJseSBiZSBzaW1wbGlmaWVkIHRvOlxuXHRcdFx0XHQvLyBleGNlc3NEb21DaGlsZHJlbi5sZW5ndGggPSAwO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bmV3Vk5vZGUuX2RvbSA9IG9sZFZOb2RlLl9kb207XG5cdFx0XHRcdG5ld1ZOb2RlLl9jaGlsZHJlbiA9IG9sZFZOb2RlLl9jaGlsZHJlbjtcblx0XHRcdH1cblx0XHRcdG9wdGlvbnMuX2NhdGNoRXJyb3IoZSwgbmV3Vk5vZGUsIG9sZFZOb2RlKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAoXG5cdFx0ZXhjZXNzRG9tQ2hpbGRyZW4gPT0gbnVsbCAmJlxuXHRcdG5ld1ZOb2RlLl9vcmlnaW5hbCA9PT0gb2xkVk5vZGUuX29yaWdpbmFsXG5cdCkge1xuXHRcdG5ld1ZOb2RlLl9jaGlsZHJlbiA9IG9sZFZOb2RlLl9jaGlsZHJlbjtcblx0XHRuZXdWTm9kZS5fZG9tID0gb2xkVk5vZGUuX2RvbTtcblx0fSBlbHNlIHtcblx0XHRuZXdWTm9kZS5fZG9tID0gZGlmZkVsZW1lbnROb2Rlcyhcblx0XHRcdG9sZFZOb2RlLl9kb20sXG5cdFx0XHRuZXdWTm9kZSxcblx0XHRcdG9sZFZOb2RlLFxuXHRcdFx0Z2xvYmFsQ29udGV4dCxcblx0XHRcdGlzU3ZnLFxuXHRcdFx0ZXhjZXNzRG9tQ2hpbGRyZW4sXG5cdFx0XHRjb21taXRRdWV1ZSxcblx0XHRcdGlzSHlkcmF0aW5nLFxuXHRcdFx0cmVmUXVldWVcblx0XHQpO1xuXHR9XG5cblx0aWYgKCh0bXAgPSBvcHRpb25zLmRpZmZlZCkpIHRtcChuZXdWTm9kZSk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtBcnJheTxDb21wb25lbnQ+fSBjb21taXRRdWV1ZSBMaXN0IG9mIGNvbXBvbmVudHNcbiAqIHdoaWNoIGhhdmUgY2FsbGJhY2tzIHRvIGludm9rZSBpbiBjb21taXRSb290XG4gKiBAcGFyYW0ge1ZOb2RlfSByb290XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21taXRSb290KGNvbW1pdFF1ZXVlLCByb290LCByZWZRdWV1ZSkge1xuXHRyb290Ll9uZXh0RG9tID0gdW5kZWZpbmVkO1xuXG5cdGZvciAobGV0IGkgPSAwOyBpIDwgcmVmUXVldWUubGVuZ3RoOyBpKyspIHtcblx0XHRhcHBseVJlZihyZWZRdWV1ZVtpXSwgcmVmUXVldWVbKytpXSwgcmVmUXVldWVbKytpXSk7XG5cdH1cblxuXHRpZiAob3B0aW9ucy5fY29tbWl0KSBvcHRpb25zLl9jb21taXQocm9vdCwgY29tbWl0UXVldWUpO1xuXG5cdGNvbW1pdFF1ZXVlLnNvbWUoYyA9PiB7XG5cdFx0dHJ5IHtcblx0XHRcdC8vIEB0cy1leHBlY3QtZXJyb3IgUmV1c2UgdGhlIGNvbW1pdFF1ZXVlIHZhcmlhYmxlIGhlcmUgc28gdGhlIHR5cGUgY2hhbmdlc1xuXHRcdFx0Y29tbWl0UXVldWUgPSBjLl9yZW5kZXJDYWxsYmFja3M7XG5cdFx0XHRjLl9yZW5kZXJDYWxsYmFja3MgPSBbXTtcblx0XHRcdGNvbW1pdFF1ZXVlLnNvbWUoY2IgPT4ge1xuXHRcdFx0XHQvLyBAdHMtZXhwZWN0LWVycm9yIFNlZSBhYm92ZSBjb21tZW50IG9uIGNvbW1pdFF1ZXVlXG5cdFx0XHRcdGNiLmNhbGwoYyk7XG5cdFx0XHR9KTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRvcHRpb25zLl9jYXRjaEVycm9yKGUsIGMuX3Zub2RlKTtcblx0XHR9XG5cdH0pO1xufVxuXG4vKipcbiAqIERpZmYgdHdvIHZpcnR1YWwgbm9kZXMgcmVwcmVzZW50aW5nIERPTSBlbGVtZW50XG4gKiBAcGFyYW0ge1ByZWFjdEVsZW1lbnR9IGRvbSBUaGUgRE9NIGVsZW1lbnQgcmVwcmVzZW50aW5nIHRoZSB2aXJ0dWFsIG5vZGVzXG4gKiBiZWluZyBkaWZmZWRcbiAqIEBwYXJhbSB7Vk5vZGV9IG5ld1ZOb2RlIFRoZSBuZXcgdmlydHVhbCBub2RlXG4gKiBAcGFyYW0ge1ZOb2RlfSBvbGRWTm9kZSBUaGUgb2xkIHZpcnR1YWwgbm9kZVxuICogQHBhcmFtIHtvYmplY3R9IGdsb2JhbENvbnRleHQgVGhlIGN1cnJlbnQgY29udGV4dCBvYmplY3RcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNTdmcgV2hldGhlciBvciBub3QgdGhpcyBET00gbm9kZSBpcyBhbiBTVkcgbm9kZVxuICogQHBhcmFtIHtBcnJheTxQcmVhY3RFbGVtZW50Pn0gZXhjZXNzRG9tQ2hpbGRyZW5cbiAqIEBwYXJhbSB7QXJyYXk8Q29tcG9uZW50Pn0gY29tbWl0UXVldWUgTGlzdCBvZiBjb21wb25lbnRzIHdoaWNoIGhhdmUgY2FsbGJhY2tzXG4gKiB0byBpbnZva2UgaW4gY29tbWl0Um9vdFxuICogQHBhcmFtIHtib29sZWFufSBpc0h5ZHJhdGluZyBXaGV0aGVyIG9yIG5vdCB3ZSBhcmUgaW4gaHlkcmF0aW9uXG4gKiBAcGFyYW0ge2FueVtdfSByZWZRdWV1ZSBhbiBhcnJheSBvZiBlbGVtZW50cyBuZWVkZWQgdG8gaW52b2tlIHJlZnNcbiAqIEByZXR1cm5zIHtQcmVhY3RFbGVtZW50fVxuICovXG5mdW5jdGlvbiBkaWZmRWxlbWVudE5vZGVzKFxuXHRkb20sXG5cdG5ld1ZOb2RlLFxuXHRvbGRWTm9kZSxcblx0Z2xvYmFsQ29udGV4dCxcblx0aXNTdmcsXG5cdGV4Y2Vzc0RvbUNoaWxkcmVuLFxuXHRjb21taXRRdWV1ZSxcblx0aXNIeWRyYXRpbmcsXG5cdHJlZlF1ZXVlXG4pIHtcblx0bGV0IG9sZFByb3BzID0gb2xkVk5vZGUucHJvcHM7XG5cdGxldCBuZXdQcm9wcyA9IG5ld1ZOb2RlLnByb3BzO1xuXHRsZXQgbm9kZVR5cGUgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKG5ld1ZOb2RlLnR5cGUpO1xuXHQvKiogQHR5cGUge2FueX0gKi9cblx0bGV0IGk7XG5cdC8qKiBAdHlwZSB7eyBfX2h0bWw/OiBzdHJpbmcgfX0gKi9cblx0bGV0IG5ld0h0bWw7XG5cdC8qKiBAdHlwZSB7eyBfX2h0bWw/OiBzdHJpbmcgfX0gKi9cblx0bGV0IG9sZEh0bWw7XG5cdC8qKiBAdHlwZSB7Q29tcG9uZW50Q2hpbGRyZW59ICovXG5cdGxldCBuZXdDaGlsZHJlbjtcblx0bGV0IHZhbHVlO1xuXHRsZXQgaW5wdXRWYWx1ZTtcblx0bGV0IGNoZWNrZWQ7XG5cblx0Ly8gVHJhY2tzIGVudGVyaW5nIGFuZCBleGl0aW5nIFNWRyBuYW1lc3BhY2Ugd2hlbiBkZXNjZW5kaW5nIHRocm91Z2ggdGhlIHRyZWUuXG5cdGlmIChub2RlVHlwZSA9PT0gJ3N2ZycpIGlzU3ZnID0gdHJ1ZTtcblxuXHRpZiAoZXhjZXNzRG9tQ2hpbGRyZW4gIT0gbnVsbCkge1xuXHRcdGZvciAoaSA9IDA7IGkgPCBleGNlc3NEb21DaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFsdWUgPSBleGNlc3NEb21DaGlsZHJlbltpXTtcblxuXHRcdFx0Ly8gaWYgbmV3Vk5vZGUgbWF0Y2hlcyBhbiBlbGVtZW50IGluIGV4Y2Vzc0RvbUNoaWxkcmVuIG9yIHRoZSBgZG9tYFxuXHRcdFx0Ly8gYXJndW1lbnQgbWF0Y2hlcyBhbiBlbGVtZW50IGluIGV4Y2Vzc0RvbUNoaWxkcmVuLCByZW1vdmUgaXQgZnJvbVxuXHRcdFx0Ly8gZXhjZXNzRG9tQ2hpbGRyZW4gc28gaXQgaXNuJ3QgbGF0ZXIgcmVtb3ZlZCBpbiBkaWZmQ2hpbGRyZW5cblx0XHRcdGlmIChcblx0XHRcdFx0dmFsdWUgJiZcblx0XHRcdFx0J3NldEF0dHJpYnV0ZScgaW4gdmFsdWUgPT09ICEhbm9kZVR5cGUgJiZcblx0XHRcdFx0KG5vZGVUeXBlID8gdmFsdWUubG9jYWxOYW1lID09PSBub2RlVHlwZSA6IHZhbHVlLm5vZGVUeXBlID09PSAzKVxuXHRcdFx0KSB7XG5cdFx0XHRcdGRvbSA9IHZhbHVlO1xuXHRcdFx0XHRleGNlc3NEb21DaGlsZHJlbltpXSA9IG51bGw7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGlmIChkb20gPT0gbnVsbCkge1xuXHRcdGlmIChub2RlVHlwZSA9PT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKG5ld1Byb3BzKTtcblx0XHR9XG5cblx0XHRpZiAoaXNTdmcpIHtcblx0XHRcdGRvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCBub2RlVHlwZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobm9kZVR5cGUsIG5ld1Byb3BzLmlzICYmIG5ld1Byb3BzKTtcblx0XHR9XG5cblx0XHQvLyB3ZSBjcmVhdGVkIGEgbmV3IHBhcmVudCwgc28gbm9uZSBvZiB0aGUgcHJldmlvdXNseSBhdHRhY2hlZCBjaGlsZHJlbiBjYW4gYmUgcmV1c2VkOlxuXHRcdGV4Y2Vzc0RvbUNoaWxkcmVuID0gbnVsbDtcblx0XHQvLyB3ZSBhcmUgY3JlYXRpbmcgYSBuZXcgbm9kZSwgc28gd2UgY2FuIGFzc3VtZSB0aGlzIGlzIGEgbmV3IHN1YnRyZWUgKGluXG5cdFx0Ly8gY2FzZSB3ZSBhcmUgaHlkcmF0aW5nKSwgdGhpcyBkZW9wdHMgdGhlIGh5ZHJhdGVcblx0XHRpc0h5ZHJhdGluZyA9IGZhbHNlO1xuXHR9XG5cblx0aWYgKG5vZGVUeXBlID09PSBudWxsKSB7XG5cdFx0Ly8gRHVyaW5nIGh5ZHJhdGlvbiwgd2Ugc3RpbGwgaGF2ZSB0byBzcGxpdCBtZXJnZWQgdGV4dCBmcm9tIFNTUidkIEhUTUwuXG5cdFx0aWYgKG9sZFByb3BzICE9PSBuZXdQcm9wcyAmJiAoIWlzSHlkcmF0aW5nIHx8IGRvbS5kYXRhICE9PSBuZXdQcm9wcykpIHtcblx0XHRcdGRvbS5kYXRhID0gbmV3UHJvcHM7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdC8vIElmIGV4Y2Vzc0RvbUNoaWxkcmVuIHdhcyBub3QgbnVsbCwgcmVwb3B1bGF0ZSBpdCB3aXRoIHRoZSBjdXJyZW50IGVsZW1lbnQncyBjaGlsZHJlbjpcblx0XHRleGNlc3NEb21DaGlsZHJlbiA9IGV4Y2Vzc0RvbUNoaWxkcmVuICYmIHNsaWNlLmNhbGwoZG9tLmNoaWxkTm9kZXMpO1xuXG5cdFx0b2xkUHJvcHMgPSBvbGRWTm9kZS5wcm9wcyB8fCBFTVBUWV9PQko7XG5cblx0XHQvLyBJZiB3ZSBhcmUgaW4gYSBzaXR1YXRpb24gd2hlcmUgd2UgYXJlIG5vdCBoeWRyYXRpbmcgYnV0IGFyZSB1c2luZ1xuXHRcdC8vIGV4aXN0aW5nIERPTSAoZS5nLiByZXBsYWNlTm9kZSkgd2Ugc2hvdWxkIHJlYWQgdGhlIGV4aXN0aW5nIERPTVxuXHRcdC8vIGF0dHJpYnV0ZXMgdG8gZGlmZiB0aGVtXG5cdFx0aWYgKCFpc0h5ZHJhdGluZyAmJiBleGNlc3NEb21DaGlsZHJlbiAhPSBudWxsKSB7XG5cdFx0XHRvbGRQcm9wcyA9IHt9O1xuXHRcdFx0Zm9yIChpID0gMDsgaSA8IGRvbS5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdHZhbHVlID0gZG9tLmF0dHJpYnV0ZXNbaV07XG5cdFx0XHRcdG9sZFByb3BzW3ZhbHVlLm5hbWVdID0gdmFsdWUudmFsdWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Zm9yIChpIGluIG9sZFByb3BzKSB7XG5cdFx0XHR2YWx1ZSA9IG9sZFByb3BzW2ldO1xuXHRcdFx0aWYgKGkgPT0gJ2NoaWxkcmVuJykge1xuXHRcdFx0fSBlbHNlIGlmIChpID09ICdkYW5nZXJvdXNseVNldElubmVySFRNTCcpIHtcblx0XHRcdFx0b2xkSHRtbCA9IHZhbHVlO1xuXHRcdFx0fSBlbHNlIGlmIChpICE9PSAna2V5JyAmJiAhKGkgaW4gbmV3UHJvcHMpKSB7XG5cdFx0XHRcdHNldFByb3BlcnR5KGRvbSwgaSwgbnVsbCwgdmFsdWUsIGlzU3ZnKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBEdXJpbmcgaHlkcmF0aW9uLCBwcm9wcyBhcmUgbm90IGRpZmZlZCBhdCBhbGwgKGluY2x1ZGluZyBkYW5nZXJvdXNseVNldElubmVySFRNTClcblx0XHQvLyBAVE9ETyB3ZSBzaG91bGQgd2FybiBpbiBkZWJ1ZyBtb2RlIHdoZW4gcHJvcHMgZG9uJ3QgbWF0Y2ggaGVyZS5cblx0XHRmb3IgKGkgaW4gbmV3UHJvcHMpIHtcblx0XHRcdHZhbHVlID0gbmV3UHJvcHNbaV07XG5cdFx0XHRpZiAoaSA9PSAnY2hpbGRyZW4nKSB7XG5cdFx0XHRcdG5ld0NoaWxkcmVuID0gdmFsdWU7XG5cdFx0XHR9IGVsc2UgaWYgKGkgPT0gJ2Rhbmdlcm91c2x5U2V0SW5uZXJIVE1MJykge1xuXHRcdFx0XHRuZXdIdG1sID0gdmFsdWU7XG5cdFx0XHR9IGVsc2UgaWYgKGkgPT0gJ3ZhbHVlJykge1xuXHRcdFx0XHRpbnB1dFZhbHVlID0gdmFsdWU7XG5cdFx0XHR9IGVsc2UgaWYgKGkgPT0gJ2NoZWNrZWQnKSB7XG5cdFx0XHRcdGNoZWNrZWQgPSB2YWx1ZTtcblx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdGkgIT09ICdrZXknICYmXG5cdFx0XHRcdCghaXNIeWRyYXRpbmcgfHwgdHlwZW9mIHZhbHVlID09ICdmdW5jdGlvbicpICYmXG5cdFx0XHRcdG9sZFByb3BzW2ldICE9PSB2YWx1ZVxuXHRcdFx0KSB7XG5cdFx0XHRcdHNldFByb3BlcnR5KGRvbSwgaSwgdmFsdWUsIG9sZFByb3BzW2ldLCBpc1N2Zyk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gSWYgdGhlIG5ldyB2bm9kZSBkaWRuJ3QgaGF2ZSBkYW5nZXJvdXNseVNldElubmVySFRNTCwgZGlmZiBpdHMgY2hpbGRyZW5cblx0XHRpZiAobmV3SHRtbCkge1xuXHRcdFx0Ly8gQXZvaWQgcmUtYXBwbHlpbmcgdGhlIHNhbWUgJ19faHRtbCcgaWYgaXQgZGlkIG5vdCBjaGFuZ2VkIGJldHdlZW4gcmUtcmVuZGVyXG5cdFx0XHRpZiAoXG5cdFx0XHRcdCFpc0h5ZHJhdGluZyAmJlxuXHRcdFx0XHQoIW9sZEh0bWwgfHxcblx0XHRcdFx0XHQobmV3SHRtbC5fX2h0bWwgIT09IG9sZEh0bWwuX19odG1sICYmXG5cdFx0XHRcdFx0XHRuZXdIdG1sLl9faHRtbCAhPT0gZG9tLmlubmVySFRNTCkpXG5cdFx0XHQpIHtcblx0XHRcdFx0ZG9tLmlubmVySFRNTCA9IG5ld0h0bWwuX19odG1sO1xuXHRcdFx0fVxuXG5cdFx0XHRuZXdWTm9kZS5fY2hpbGRyZW4gPSBbXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKG9sZEh0bWwpIGRvbS5pbm5lckhUTUwgPSAnJztcblxuXHRcdFx0ZGlmZkNoaWxkcmVuKFxuXHRcdFx0XHRkb20sXG5cdFx0XHRcdGlzQXJyYXkobmV3Q2hpbGRyZW4pID8gbmV3Q2hpbGRyZW4gOiBbbmV3Q2hpbGRyZW5dLFxuXHRcdFx0XHRuZXdWTm9kZSxcblx0XHRcdFx0b2xkVk5vZGUsXG5cdFx0XHRcdGdsb2JhbENvbnRleHQsXG5cdFx0XHRcdGlzU3ZnICYmIG5vZGVUeXBlICE9PSAnZm9yZWlnbk9iamVjdCcsXG5cdFx0XHRcdGV4Y2Vzc0RvbUNoaWxkcmVuLFxuXHRcdFx0XHRjb21taXRRdWV1ZSxcblx0XHRcdFx0ZXhjZXNzRG9tQ2hpbGRyZW5cblx0XHRcdFx0XHQ/IGV4Y2Vzc0RvbUNoaWxkcmVuWzBdXG5cdFx0XHRcdFx0OiBvbGRWTm9kZS5fY2hpbGRyZW4gJiYgZ2V0RG9tU2libGluZyhvbGRWTm9kZSwgMCksXG5cdFx0XHRcdGlzSHlkcmF0aW5nLFxuXHRcdFx0XHRyZWZRdWV1ZVxuXHRcdFx0KTtcblxuXHRcdFx0Ly8gUmVtb3ZlIGNoaWxkcmVuIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIGFueSB2bm9kZS5cblx0XHRcdGlmIChleGNlc3NEb21DaGlsZHJlbiAhPSBudWxsKSB7XG5cdFx0XHRcdGZvciAoaSA9IGV4Y2Vzc0RvbUNoaWxkcmVuLmxlbmd0aDsgaS0tOyApIHtcblx0XHRcdFx0XHRpZiAoZXhjZXNzRG9tQ2hpbGRyZW5baV0gIT0gbnVsbCkgcmVtb3ZlTm9kZShleGNlc3NEb21DaGlsZHJlbltpXSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBBcyBhYm92ZSwgZG9uJ3QgZGlmZiBwcm9wcyBkdXJpbmcgaHlkcmF0aW9uXG5cdFx0aWYgKCFpc0h5ZHJhdGluZykge1xuXHRcdFx0aSA9ICd2YWx1ZSc7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdGlucHV0VmFsdWUgIT09IHVuZGVmaW5lZCAmJlxuXHRcdFx0XHQvLyAjMjc1NiBGb3IgdGhlIDxwcm9ncmVzcz4tZWxlbWVudCB0aGUgaW5pdGlhbCB2YWx1ZSBpcyAwLFxuXHRcdFx0XHQvLyBkZXNwaXRlIHRoZSBhdHRyaWJ1dGUgbm90IGJlaW5nIHByZXNlbnQuIFdoZW4gdGhlIGF0dHJpYnV0ZVxuXHRcdFx0XHQvLyBpcyBtaXNzaW5nIHRoZSBwcm9ncmVzcyBiYXIgaXMgdHJlYXRlZCBhcyBpbmRldGVybWluYXRlLlxuXHRcdFx0XHQvLyBUbyBmaXggdGhhdCB3ZSdsbCBhbHdheXMgdXBkYXRlIGl0IHdoZW4gaXQgaXMgMCBmb3IgcHJvZ3Jlc3MgZWxlbWVudHNcblx0XHRcdFx0KGlucHV0VmFsdWUgIT09IGRvbVtpXSB8fFxuXHRcdFx0XHRcdChub2RlVHlwZSA9PT0gJ3Byb2dyZXNzJyAmJiAhaW5wdXRWYWx1ZSkgfHxcblx0XHRcdFx0XHQvLyBUaGlzIGlzIG9ubHkgZm9yIElFIDExIHRvIGZpeCA8c2VsZWN0PiB2YWx1ZSBub3QgYmVpbmcgdXBkYXRlZC5cblx0XHRcdFx0XHQvLyBUbyBhdm9pZCBhIHN0YWxlIHNlbGVjdCB2YWx1ZSB3ZSBuZWVkIHRvIHNldCB0aGUgb3B0aW9uLnZhbHVlXG5cdFx0XHRcdFx0Ly8gYWdhaW4sIHdoaWNoIHRyaWdnZXJzIElFMTEgdG8gcmUtZXZhbHVhdGUgdGhlIHNlbGVjdCB2YWx1ZVxuXHRcdFx0XHRcdChub2RlVHlwZSA9PT0gJ29wdGlvbicgJiYgaW5wdXRWYWx1ZSAhPT0gb2xkUHJvcHNbaV0pKVxuXHRcdFx0KSB7XG5cdFx0XHRcdHNldFByb3BlcnR5KGRvbSwgaSwgaW5wdXRWYWx1ZSwgb2xkUHJvcHNbaV0sIGZhbHNlKTtcblx0XHRcdH1cblxuXHRcdFx0aSA9ICdjaGVja2VkJztcblx0XHRcdGlmIChjaGVja2VkICE9PSB1bmRlZmluZWQgJiYgY2hlY2tlZCAhPT0gZG9tW2ldKSB7XG5cdFx0XHRcdHNldFByb3BlcnR5KGRvbSwgaSwgY2hlY2tlZCwgb2xkUHJvcHNbaV0sIGZhbHNlKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZG9tO1xufVxuXG4vKipcbiAqIEludm9rZSBvciB1cGRhdGUgYSByZWYsIGRlcGVuZGluZyBvbiB3aGV0aGVyIGl0IGlzIGEgZnVuY3Rpb24gb3Igb2JqZWN0IHJlZi5cbiAqIEBwYXJhbSB7UmVmPGFueT59IHJlZlxuICogQHBhcmFtIHthbnl9IHZhbHVlXG4gKiBAcGFyYW0ge1ZOb2RlfSB2bm9kZVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlSZWYocmVmLCB2YWx1ZSwgdm5vZGUpIHtcblx0dHJ5IHtcblx0XHRpZiAodHlwZW9mIHJlZiA9PSAnZnVuY3Rpb24nKSByZWYodmFsdWUpO1xuXHRcdGVsc2UgcmVmLmN1cnJlbnQgPSB2YWx1ZTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdG9wdGlvbnMuX2NhdGNoRXJyb3IoZSwgdm5vZGUpO1xuXHR9XG59XG5cbi8qKlxuICogVW5tb3VudCBhIHZpcnR1YWwgbm9kZSBmcm9tIHRoZSB0cmVlIGFuZCBhcHBseSBET00gY2hhbmdlc1xuICogQHBhcmFtIHtWTm9kZX0gdm5vZGUgVGhlIHZpcnR1YWwgbm9kZSB0byB1bm1vdW50XG4gKiBAcGFyYW0ge1ZOb2RlfSBwYXJlbnRWTm9kZSBUaGUgcGFyZW50IG9mIHRoZSBWTm9kZSB0aGF0IGluaXRpYXRlZCB0aGUgdW5tb3VudFxuICogQHBhcmFtIHtib29sZWFufSBbc2tpcFJlbW92ZV0gRmxhZyB0aGF0IGluZGljYXRlcyB0aGF0IGEgcGFyZW50IG5vZGUgb2YgdGhlXG4gKiBjdXJyZW50IGVsZW1lbnQgaXMgYWxyZWFkeSBkZXRhY2hlZCBmcm9tIHRoZSBET00uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bm1vdW50KHZub2RlLCBwYXJlbnRWTm9kZSwgc2tpcFJlbW92ZSkge1xuXHRsZXQgcjtcblx0aWYgKG9wdGlvbnMudW5tb3VudCkgb3B0aW9ucy51bm1vdW50KHZub2RlKTtcblxuXHRpZiAoKHIgPSB2bm9kZS5yZWYpKSB7XG5cdFx0aWYgKCFyLmN1cnJlbnQgfHwgci5jdXJyZW50ID09PSB2bm9kZS5fZG9tKSB7XG5cdFx0XHRhcHBseVJlZihyLCBudWxsLCBwYXJlbnRWTm9kZSk7XG5cdFx0fVxuXHR9XG5cblx0aWYgKChyID0gdm5vZGUuX2NvbXBvbmVudCkgIT0gbnVsbCkge1xuXHRcdGlmIChyLmNvbXBvbmVudFdpbGxVbm1vdW50KSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRyLmNvbXBvbmVudFdpbGxVbm1vdW50KCk7XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdG9wdGlvbnMuX2NhdGNoRXJyb3IoZSwgcGFyZW50Vk5vZGUpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHIuYmFzZSA9IHIuX3BhcmVudERvbSA9IG51bGw7XG5cdFx0dm5vZGUuX2NvbXBvbmVudCA9IHVuZGVmaW5lZDtcblx0fVxuXG5cdGlmICgociA9IHZub2RlLl9jaGlsZHJlbikpIHtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHIubGVuZ3RoOyBpKyspIHtcblx0XHRcdGlmIChyW2ldKSB7XG5cdFx0XHRcdHVubW91bnQoXG5cdFx0XHRcdFx0cltpXSxcblx0XHRcdFx0XHRwYXJlbnRWTm9kZSxcblx0XHRcdFx0XHRza2lwUmVtb3ZlIHx8IHR5cGVvZiB2bm9kZS50eXBlICE9PSAnZnVuY3Rpb24nXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0aWYgKCFza2lwUmVtb3ZlICYmIHZub2RlLl9kb20gIT0gbnVsbCkge1xuXHRcdHJlbW92ZU5vZGUodm5vZGUuX2RvbSk7XG5cdH1cblxuXHQvLyBNdXN0IGJlIHNldCB0byBgdW5kZWZpbmVkYCB0byBwcm9wZXJseSBjbGVhbiB1cCBgX25leHREb21gXG5cdC8vIGZvciB3aGljaCBgbnVsbGAgaXMgYSB2YWxpZCB2YWx1ZS4gU2VlIGNvbW1lbnQgaW4gYGNyZWF0ZS1lbGVtZW50LmpzYFxuXHR2bm9kZS5fcGFyZW50ID0gdm5vZGUuX2RvbSA9IHZub2RlLl9uZXh0RG9tID0gdW5kZWZpbmVkO1xufVxuXG4vKiogVGhlIGAucmVuZGVyKClgIG1ldGhvZCBmb3IgYSBQRkMgYmFja2luZyBpbnN0YW5jZS4gKi9cbmZ1bmN0aW9uIGRvUmVuZGVyKHByb3BzLCBzdGF0ZSwgY29udGV4dCkge1xuXHRyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvcihwcm9wcywgY29udGV4dCk7XG59XG4iLCAiaW1wb3J0IHsgRU1QVFlfT0JKIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgY29tbWl0Um9vdCwgZGlmZiB9IGZyb20gJy4vZGlmZi9pbmRleCc7XG5pbXBvcnQgeyBjcmVhdGVFbGVtZW50LCBGcmFnbWVudCB9IGZyb20gJy4vY3JlYXRlLWVsZW1lbnQnO1xuaW1wb3J0IG9wdGlvbnMgZnJvbSAnLi9vcHRpb25zJztcbmltcG9ydCB7IHNsaWNlIH0gZnJvbSAnLi91dGlsJztcblxuLyoqXG4gKiBSZW5kZXIgYSBQcmVhY3QgdmlydHVhbCBub2RlIGludG8gYSBET00gZWxlbWVudFxuICogQHBhcmFtIHtDb21wb25lbnRDaGlsZH0gdm5vZGUgVGhlIHZpcnR1YWwgbm9kZSB0byByZW5kZXJcbiAqIEBwYXJhbSB7UHJlYWN0RWxlbWVudH0gcGFyZW50RG9tIFRoZSBET00gZWxlbWVudCB0byByZW5kZXIgaW50b1xuICogQHBhcmFtIHtQcmVhY3RFbGVtZW50IHwgb2JqZWN0fSBbcmVwbGFjZU5vZGVdIE9wdGlvbmFsOiBBdHRlbXB0IHRvIHJlLXVzZSBhblxuICogZXhpc3RpbmcgRE9NIHRyZWUgcm9vdGVkIGF0IGByZXBsYWNlTm9kZWBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlcih2bm9kZSwgcGFyZW50RG9tLCByZXBsYWNlTm9kZSkge1xuXHRpZiAob3B0aW9ucy5fcm9vdCkgb3B0aW9ucy5fcm9vdCh2bm9kZSwgcGFyZW50RG9tKTtcblxuXHQvLyBXZSBhYnVzZSB0aGUgYHJlcGxhY2VOb2RlYCBwYXJhbWV0ZXIgaW4gYGh5ZHJhdGUoKWAgdG8gc2lnbmFsIGlmIHdlIGFyZSBpblxuXHQvLyBoeWRyYXRpb24gbW9kZSBvciBub3QgYnkgcGFzc2luZyB0aGUgYGh5ZHJhdGVgIGZ1bmN0aW9uIGluc3RlYWQgb2YgYSBET01cblx0Ly8gZWxlbWVudC4uXG5cdGxldCBpc0h5ZHJhdGluZyA9IHR5cGVvZiByZXBsYWNlTm9kZSA9PSAnZnVuY3Rpb24nO1xuXG5cdC8vIFRvIGJlIGFibGUgdG8gc3VwcG9ydCBjYWxsaW5nIGByZW5kZXIoKWAgbXVsdGlwbGUgdGltZXMgb24gdGhlIHNhbWVcblx0Ly8gRE9NIG5vZGUsIHdlIG5lZWQgdG8gb2J0YWluIGEgcmVmZXJlbmNlIHRvIHRoZSBwcmV2aW91cyB0cmVlLiBXZSBkb1xuXHQvLyB0aGlzIGJ5IGFzc2lnbmluZyBhIG5ldyBgX2NoaWxkcmVuYCBwcm9wZXJ0eSB0byBET00gbm9kZXMgd2hpY2ggcG9pbnRzXG5cdC8vIHRvIHRoZSBsYXN0IHJlbmRlcmVkIHRyZWUuIEJ5IGRlZmF1bHQgdGhpcyBwcm9wZXJ0eSBpcyBub3QgcHJlc2VudCwgd2hpY2hcblx0Ly8gbWVhbnMgdGhhdCB3ZSBhcmUgbW91bnRpbmcgYSBuZXcgdHJlZSBmb3IgdGhlIGZpcnN0IHRpbWUuXG5cdGxldCBvbGRWTm9kZSA9IGlzSHlkcmF0aW5nXG5cdFx0PyBudWxsXG5cdFx0OiAocmVwbGFjZU5vZGUgJiYgcmVwbGFjZU5vZGUuX2NoaWxkcmVuKSB8fCBwYXJlbnREb20uX2NoaWxkcmVuO1xuXG5cdHZub2RlID0gKCghaXNIeWRyYXRpbmcgJiYgcmVwbGFjZU5vZGUpIHx8IHBhcmVudERvbSkuX2NoaWxkcmVuID1cblx0XHRjcmVhdGVFbGVtZW50KEZyYWdtZW50LCBudWxsLCBbdm5vZGVdKTtcblxuXHQvLyBMaXN0IG9mIGVmZmVjdHMgdGhhdCBuZWVkIHRvIGJlIGNhbGxlZCBhZnRlciBkaWZmaW5nLlxuXHRsZXQgY29tbWl0UXVldWUgPSBbXSxcblx0XHRyZWZRdWV1ZSA9IFtdO1xuXHRkaWZmKFxuXHRcdHBhcmVudERvbSxcblx0XHQvLyBEZXRlcm1pbmUgdGhlIG5ldyB2bm9kZSB0cmVlIGFuZCBzdG9yZSBpdCBvbiB0aGUgRE9NIGVsZW1lbnQgb25cblx0XHQvLyBvdXIgY3VzdG9tIGBfY2hpbGRyZW5gIHByb3BlcnR5LlxuXHRcdHZub2RlLFxuXHRcdG9sZFZOb2RlIHx8IEVNUFRZX09CSixcblx0XHRFTVBUWV9PQkosXG5cdFx0cGFyZW50RG9tLm93bmVyU1ZHRWxlbWVudCAhPT0gdW5kZWZpbmVkLFxuXHRcdCFpc0h5ZHJhdGluZyAmJiByZXBsYWNlTm9kZVxuXHRcdFx0PyBbcmVwbGFjZU5vZGVdXG5cdFx0XHQ6IG9sZFZOb2RlXG5cdFx0XHQ/IG51bGxcblx0XHRcdDogcGFyZW50RG9tLmZpcnN0Q2hpbGRcblx0XHRcdD8gc2xpY2UuY2FsbChwYXJlbnREb20uY2hpbGROb2Rlcylcblx0XHRcdDogbnVsbCxcblx0XHRjb21taXRRdWV1ZSxcblx0XHQhaXNIeWRyYXRpbmcgJiYgcmVwbGFjZU5vZGVcblx0XHRcdD8gcmVwbGFjZU5vZGVcblx0XHRcdDogb2xkVk5vZGVcblx0XHRcdD8gb2xkVk5vZGUuX2RvbVxuXHRcdFx0OiBwYXJlbnREb20uZmlyc3RDaGlsZCxcblx0XHRpc0h5ZHJhdGluZyxcblx0XHRyZWZRdWV1ZVxuXHQpO1xuXG5cdC8vIEZsdXNoIGFsbCBxdWV1ZWQgZWZmZWN0c1xuXHRjb21taXRSb290KGNvbW1pdFF1ZXVlLCB2bm9kZSwgcmVmUXVldWUpO1xufVxuXG4vKipcbiAqIFVwZGF0ZSBhbiBleGlzdGluZyBET00gZWxlbWVudCB3aXRoIGRhdGEgZnJvbSBhIFByZWFjdCB2aXJ0dWFsIG5vZGVcbiAqIEBwYXJhbSB7Q29tcG9uZW50Q2hpbGR9IHZub2RlIFRoZSB2aXJ0dWFsIG5vZGUgdG8gcmVuZGVyXG4gKiBAcGFyYW0ge1ByZWFjdEVsZW1lbnR9IHBhcmVudERvbSBUaGUgRE9NIGVsZW1lbnQgdG8gdXBkYXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoeWRyYXRlKHZub2RlLCBwYXJlbnREb20pIHtcblx0cmVuZGVyKHZub2RlLCBwYXJlbnREb20sIGh5ZHJhdGUpO1xufVxuIiwgImltcG9ydCB7IGFzc2lnbiwgc2xpY2UgfSBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IHsgY3JlYXRlVk5vZGUgfSBmcm9tICcuL2NyZWF0ZS1lbGVtZW50JztcblxuLyoqXG4gKiBDbG9uZXMgdGhlIGdpdmVuIFZOb2RlLCBvcHRpb25hbGx5IGFkZGluZyBhdHRyaWJ1dGVzL3Byb3BzIGFuZCByZXBsYWNpbmcgaXRzXG4gKiBjaGlsZHJlbi5cbiAqIEBwYXJhbSB7Vk5vZGV9IHZub2RlIFRoZSB2aXJ0dWFsIERPTSBlbGVtZW50IHRvIGNsb25lXG4gKiBAcGFyYW0ge29iamVjdH0gcHJvcHMgQXR0cmlidXRlcy9wcm9wcyB0byBhZGQgd2hlbiBjbG9uaW5nXG4gKiBAcGFyYW0ge0FycmF5PENvbXBvbmVudENoaWxkcmVuPn0gcmVzdCBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgd2lsbCBiZSB1c2VkXG4gKiBhcyByZXBsYWNlbWVudCBjaGlsZHJlbi5cbiAqIEByZXR1cm5zIHtWTm9kZX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsb25lRWxlbWVudCh2bm9kZSwgcHJvcHMsIGNoaWxkcmVuKSB7XG5cdGxldCBub3JtYWxpemVkUHJvcHMgPSBhc3NpZ24oe30sIHZub2RlLnByb3BzKSxcblx0XHRrZXksXG5cdFx0cmVmLFxuXHRcdGk7XG5cblx0bGV0IGRlZmF1bHRQcm9wcztcblxuXHRpZiAodm5vZGUudHlwZSAmJiB2bm9kZS50eXBlLmRlZmF1bHRQcm9wcykge1xuXHRcdGRlZmF1bHRQcm9wcyA9IHZub2RlLnR5cGUuZGVmYXVsdFByb3BzO1xuXHR9XG5cblx0Zm9yIChpIGluIHByb3BzKSB7XG5cdFx0aWYgKGkgPT0gJ2tleScpIGtleSA9IHByb3BzW2ldO1xuXHRcdGVsc2UgaWYgKGkgPT0gJ3JlZicpIHJlZiA9IHByb3BzW2ldO1xuXHRcdGVsc2UgaWYgKHByb3BzW2ldID09PSB1bmRlZmluZWQgJiYgZGVmYXVsdFByb3BzICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdG5vcm1hbGl6ZWRQcm9wc1tpXSA9IGRlZmF1bHRQcm9wc1tpXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bm9ybWFsaXplZFByb3BzW2ldID0gcHJvcHNbaV07XG5cdFx0fVxuXHR9XG5cblx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7XG5cdFx0bm9ybWFsaXplZFByb3BzLmNoaWxkcmVuID1cblx0XHRcdGFyZ3VtZW50cy5sZW5ndGggPiAzID8gc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpIDogY2hpbGRyZW47XG5cdH1cblxuXHRyZXR1cm4gY3JlYXRlVk5vZGUoXG5cdFx0dm5vZGUudHlwZSxcblx0XHRub3JtYWxpemVkUHJvcHMsXG5cdFx0a2V5IHx8IHZub2RlLmtleSxcblx0XHRyZWYgfHwgdm5vZGUucmVmLFxuXHRcdG51bGxcblx0KTtcbn1cbiIsICIvKipcbiAqIEZpbmQgdGhlIGNsb3Nlc3QgZXJyb3IgYm91bmRhcnkgdG8gYSB0aHJvd24gZXJyb3IgYW5kIGNhbGwgaXRcbiAqIEBwYXJhbSB7b2JqZWN0fSBlcnJvciBUaGUgdGhyb3duIHZhbHVlXG4gKiBAcGFyYW0ge1ZOb2RlfSB2bm9kZSBUaGUgdm5vZGUgdGhhdCB0aHJldyB0aGUgZXJyb3IgdGhhdCB3YXMgY2F1Z2h0IChleGNlcHRcbiAqIGZvciB1bm1vdW50aW5nIHdoZW4gdGhpcyBwYXJhbWV0ZXIgaXMgdGhlIGhpZ2hlc3QgcGFyZW50IHRoYXQgd2FzIGJlaW5nXG4gKiB1bm1vdW50ZWQpXG4gKiBAcGFyYW0ge1ZOb2RlfSBbb2xkVk5vZGVdXG4gKiBAcGFyYW0ge0Vycm9ySW5mb30gW2Vycm9ySW5mb11cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9jYXRjaEVycm9yKGVycm9yLCB2bm9kZSwgb2xkVk5vZGUsIGVycm9ySW5mbykge1xuXHQvKiogQHR5cGUge0NvbXBvbmVudH0gKi9cblx0bGV0IGNvbXBvbmVudCxcblx0XHQvKiogQHR5cGUge0NvbXBvbmVudFR5cGV9ICovXG5cdFx0Y3Rvcixcblx0XHQvKiogQHR5cGUge2Jvb2xlYW59ICovXG5cdFx0aGFuZGxlZDtcblxuXHRmb3IgKDsgKHZub2RlID0gdm5vZGUuX3BhcmVudCk7ICkge1xuXHRcdGlmICgoY29tcG9uZW50ID0gdm5vZGUuX2NvbXBvbmVudCkgJiYgIWNvbXBvbmVudC5fcHJvY2Vzc2luZ0V4Y2VwdGlvbikge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y3RvciA9IGNvbXBvbmVudC5jb25zdHJ1Y3RvcjtcblxuXHRcdFx0XHRpZiAoY3RvciAmJiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvciAhPSBudWxsKSB7XG5cdFx0XHRcdFx0Y29tcG9uZW50LnNldFN0YXRlKGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKGVycm9yKSk7XG5cdFx0XHRcdFx0aGFuZGxlZCA9IGNvbXBvbmVudC5fZGlydHk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoY29tcG9uZW50LmNvbXBvbmVudERpZENhdGNoICE9IG51bGwpIHtcblx0XHRcdFx0XHRjb21wb25lbnQuY29tcG9uZW50RGlkQ2F0Y2goZXJyb3IsIGVycm9ySW5mbyB8fCB7fSk7XG5cdFx0XHRcdFx0aGFuZGxlZCA9IGNvbXBvbmVudC5fZGlydHk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBUaGlzIGlzIGFuIGVycm9yIGJvdW5kYXJ5LiBNYXJrIGl0IGFzIGhhdmluZyBiYWlsZWQgb3V0LCBhbmQgd2hldGhlciBpdCB3YXMgbWlkLWh5ZHJhdGlvbi5cblx0XHRcdFx0aWYgKGhhbmRsZWQpIHtcblx0XHRcdFx0XHRyZXR1cm4gKGNvbXBvbmVudC5fcGVuZGluZ0Vycm9yID0gY29tcG9uZW50KTtcblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRlcnJvciA9IGU7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0dGhyb3cgZXJyb3I7XG59XG4iLCAiY29uc3QgRU5DT0RFRF9FTlRJVElFUyA9IC9bXCImPF0vO1xuXG4vKiogQHBhcmFtIHtzdHJpbmd9IHN0ciAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUVudGl0aWVzKHN0cikge1xuXHQvLyBTa2lwIGFsbCB3b3JrIGZvciBzdHJpbmdzIHdpdGggbm8gZW50aXRpZXMgbmVlZGluZyBlbmNvZGluZzpcblx0aWYgKHN0ci5sZW5ndGggPT09IDAgfHwgRU5DT0RFRF9FTlRJVElFUy50ZXN0KHN0cikgPT09IGZhbHNlKSByZXR1cm4gc3RyO1xuXG5cdGxldCBsYXN0ID0gMCxcblx0XHRpID0gMCxcblx0XHRvdXQgPSAnJyxcblx0XHRjaCA9ICcnO1xuXG5cdC8vIFNlZWsgZm9yd2FyZCBpbiBzdHIgdW50aWwgdGhlIG5leHQgZW50aXR5IGNoYXI6XG5cdGZvciAoOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG5cdFx0c3dpdGNoIChzdHIuY2hhckNvZGVBdChpKSkge1xuXHRcdFx0Y2FzZSAzNDpcblx0XHRcdFx0Y2ggPSAnJnF1b3Q7Jztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIDM4OlxuXHRcdFx0XHRjaCA9ICcmYW1wOyc7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSA2MDpcblx0XHRcdFx0Y2ggPSAnJmx0Oyc7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0Y29udGludWU7XG5cdFx0fVxuXHRcdC8vIEFwcGVuZCBza2lwcGVkL2J1ZmZlcmVkIGNoYXJhY3RlcnMgYW5kIHRoZSBlbmNvZGVkIGVudGl0eTpcblx0XHRpZiAoaSAhPT0gbGFzdCkgb3V0ICs9IHN0ci5zbGljZShsYXN0LCBpKTtcblx0XHRvdXQgKz0gY2g7XG5cdFx0Ly8gU3RhcnQgdGhlIG5leHQgc2Vlay9idWZmZXIgYWZ0ZXIgdGhlIGVudGl0eSdzIG9mZnNldDpcblx0XHRsYXN0ID0gaSArIDE7XG5cdH1cblx0aWYgKGkgIT09IGxhc3QpIG91dCArPSBzdHIuc2xpY2UobGFzdCwgaSk7XG5cdHJldHVybiBvdXQ7XG59XG4iLCAiLyoqIE5vcm1hbCBoeWRyYXRpb24gdGhhdCBhdHRhY2hlcyB0byBhIERPTSB0cmVlIGJ1dCBkb2VzIG5vdCBkaWZmIGl0LiAqL1xuZXhwb3J0IGNvbnN0IE1PREVfSFlEUkFURSA9IDEgPDwgNTtcbi8qKiBTaWduaWZpZXMgdGhpcyBWTm9kZSBzdXNwZW5kZWQgb24gdGhlIHByZXZpb3VzIHJlbmRlciAqL1xuZXhwb3J0IGNvbnN0IE1PREVfU1VTUEVOREVEID0gMSA8PCA3O1xuLyoqIEluZGljYXRlcyB0aGF0IHRoaXMgbm9kZSBuZWVkcyB0byBiZSBpbnNlcnRlZCB3aGlsZSBwYXRjaGluZyBjaGlsZHJlbiAqL1xuZXhwb3J0IGNvbnN0IElOU0VSVF9WTk9ERSA9IDEgPDwgMTY7XG4vKiogSW5kaWNhdGVzIGEgVk5vZGUgaGFzIGJlZW4gbWF0Y2hlZCB3aXRoIGFub3RoZXIgVk5vZGUgaW4gdGhlIGRpZmYgKi9cbmV4cG9ydCBjb25zdCBNQVRDSEVEID0gMSA8PCAxNztcblxuLyoqIFJlc2V0IGFsbCBtb2RlIGZsYWdzICovXG5leHBvcnQgY29uc3QgUkVTRVRfTU9ERSA9IH4oTU9ERV9IWURSQVRFIHwgTU9ERV9TVVNQRU5ERUQpO1xuXG5leHBvcnQgY29uc3QgRU1QVFlfT0JKID0gLyoqIEB0eXBlIHthbnl9ICovICh7fSk7XG5leHBvcnQgY29uc3QgRU1QVFlfQVJSID0gW107XG5leHBvcnQgY29uc3QgSVNfTk9OX0RJTUVOU0lPTkFMID1cblx0L2FjaXR8ZXgoPzpzfGd8bnxwfCQpfHJwaHxncmlkfG93c3xtbmN8bnR3fGluZVtjaF18em9vfF5vcmR8aXRlcmEvaTtcbiIsICJpbXBvcnQgeyBvcHRpb25zLCBGcmFnbWVudCB9IGZyb20gJ3ByZWFjdCc7XG5pbXBvcnQgeyBlbmNvZGVFbnRpdGllcyB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgSVNfTk9OX0RJTUVOU0lPTkFMIH0gZnJvbSAnLi4vLi4vc3JjL2NvbnN0YW50cyc7XG5cbmxldCB2bm9kZUlkID0gMDtcblxuY29uc3QgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5cbi8qKlxuICogQGZpbGVvdmVydmlld1xuICogVGhpcyBmaWxlIGV4cG9ydHMgdmFyaW91cyBtZXRob2RzIHRoYXQgaW1wbGVtZW50IEJhYmVsJ3MgXCJhdXRvbWF0aWNcIiBKU1ggcnVudGltZSBBUEk6XG4gKiAtIGpzeCh0eXBlLCBwcm9wcywga2V5KVxuICogLSBqc3hzKHR5cGUsIHByb3BzLCBrZXkpXG4gKiAtIGpzeERFVih0eXBlLCBwcm9wcywga2V5LCBfX3NvdXJjZSwgX19zZWxmKVxuICpcbiAqIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiBjcmVhdGVWTm9kZSBoZXJlIGlzIG9wdGltaXplZCBmb3IgcGVyZm9ybWFuY2UuXG4gKiBCZW5jaG1hcmtzOiBodHRwczovL2VzYmVuY2guY29tL2JlbmNoLzVmNmI1NGEwYjQ2MzIxMDBhN2RjZDJiM1xuICovXG5cbi8qKlxuICogSlNYLkVsZW1lbnQgZmFjdG9yeSB1c2VkIGJ5IEJhYmVsJ3Mge3J1bnRpbWU6XCJhdXRvbWF0aWNcIn0gSlNYIHRyYW5zZm9ybVxuICogQHBhcmFtIHtWTm9kZVsndHlwZSddfSB0eXBlXG4gKiBAcGFyYW0ge1ZOb2RlWydwcm9wcyddfSBwcm9wc1xuICogQHBhcmFtIHtWTm9kZVsna2V5J119IFtrZXldXG4gKiBAcGFyYW0ge3Vua25vd259IFtpc1N0YXRpY0NoaWxkcmVuXVxuICogQHBhcmFtIHt1bmtub3dufSBbX19zb3VyY2VdXG4gKiBAcGFyYW0ge3Vua25vd259IFtfX3NlbGZdXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVZOb2RlKHR5cGUsIHByb3BzLCBrZXksIGlzU3RhdGljQ2hpbGRyZW4sIF9fc291cmNlLCBfX3NlbGYpIHtcblx0Ly8gV2UnbGwgd2FudCB0byBwcmVzZXJ2ZSBgcmVmYCBpbiBwcm9wcyB0byBnZXQgcmlkIG9mIHRoZSBuZWVkIGZvclxuXHQvLyBmb3J3YXJkUmVmIGNvbXBvbmVudHMgaW4gdGhlIGZ1dHVyZSwgYnV0IHRoYXQgc2hvdWxkIGhhcHBlbiB2aWFcblx0Ly8gYSBzZXBhcmF0ZSBQUi5cblx0bGV0IG5vcm1hbGl6ZWRQcm9wcyA9IHt9LFxuXHRcdHJlZixcblx0XHRpO1xuXHRmb3IgKGkgaW4gcHJvcHMpIHtcblx0XHRpZiAoaSA9PSAncmVmJykge1xuXHRcdFx0cmVmID0gcHJvcHNbaV07XG5cdFx0fSBlbHNlIHtcblx0XHRcdG5vcm1hbGl6ZWRQcm9wc1tpXSA9IHByb3BzW2ldO1xuXHRcdH1cblx0fVxuXG5cdC8qKiBAdHlwZSB7Vk5vZGUgJiB7IF9fc291cmNlOiBhbnk7IF9fc2VsZjogYW55IH19ICovXG5cdGNvbnN0IHZub2RlID0ge1xuXHRcdHR5cGUsXG5cdFx0cHJvcHM6IG5vcm1hbGl6ZWRQcm9wcyxcblx0XHRrZXksXG5cdFx0cmVmLFxuXHRcdF9jaGlsZHJlbjogbnVsbCxcblx0XHRfcGFyZW50OiBudWxsLFxuXHRcdF9kZXB0aDogMCxcblx0XHRfZG9tOiBudWxsLFxuXHRcdF9uZXh0RG9tOiB1bmRlZmluZWQsXG5cdFx0X2NvbXBvbmVudDogbnVsbCxcblx0XHRjb25zdHJ1Y3RvcjogdW5kZWZpbmVkLFxuXHRcdF9vcmlnaW5hbDogLS12bm9kZUlkLFxuXHRcdF9pbmRleDogLTEsXG5cdFx0X2ZsYWdzOiAwLFxuXHRcdF9fc291cmNlLFxuXHRcdF9fc2VsZlxuXHR9O1xuXG5cdC8vIElmIGEgQ29tcG9uZW50IFZOb2RlLCBjaGVjayBmb3IgYW5kIGFwcGx5IGRlZmF1bHRQcm9wcy5cblx0Ly8gTm90ZTogYHR5cGVgIGlzIG9mdGVuIGEgU3RyaW5nLCBhbmQgY2FuIGJlIGB1bmRlZmluZWRgIGluIGRldmVsb3BtZW50LlxuXHRpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicgJiYgKHJlZiA9IHR5cGUuZGVmYXVsdFByb3BzKSkge1xuXHRcdGZvciAoaSBpbiByZWYpXG5cdFx0XHRpZiAodHlwZW9mIG5vcm1hbGl6ZWRQcm9wc1tpXSA9PT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdFx0bm9ybWFsaXplZFByb3BzW2ldID0gcmVmW2ldO1xuXHRcdFx0fVxuXHR9XG5cblx0aWYgKG9wdGlvbnMudm5vZGUpIG9wdGlvbnMudm5vZGUodm5vZGUpO1xuXHRyZXR1cm4gdm5vZGU7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgdGVtcGxhdGUgdm5vZGUuIFRoaXMgZnVuY3Rpb24gaXMgbm90IGV4cGVjdGVkIHRvIGJlXG4gKiB1c2VkIGRpcmVjdGx5LCBidXQgcmF0aGVyIHRocm91Z2ggYSBwcmVjb21waWxlIEpTWCB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7c3RyaW5nW119IHRlbXBsYXRlc1xuICogQHBhcmFtICB7QXJyYXk8c3RyaW5nIHwgbnVsbCB8IFZOb2RlPn0gZXhwcnNcbiAqIEByZXR1cm5zIHtWTm9kZX1cbiAqL1xuZnVuY3Rpb24ganN4VGVtcGxhdGUodGVtcGxhdGVzLCAuLi5leHBycykge1xuXHRjb25zdCB2bm9kZSA9IGNyZWF0ZVZOb2RlKEZyYWdtZW50LCB7IHRwbDogdGVtcGxhdGVzLCBleHBycyB9KTtcblx0Ly8gQnlwYXNzIHJlbmRlciB0byBzdHJpbmcgdG9wIGxldmVsIEZyYWdtZW50IG9wdGltaXphdGlvblxuXHR2bm9kZS5rZXkgPSB2bm9kZS5fdm5vZGU7XG5cdHJldHVybiB2bm9kZTtcbn1cblxuY29uc3QgSlNfVE9fQ1NTID0ge307XG5jb25zdCBDU1NfUkVHRVggPSAvW0EtWl0vZztcblxuLyoqXG4gKiBTZXJpYWxpemUgYW4gSFRNTCBhdHRyaWJ1dGUgdG8gYSBzdHJpbmcuIFRoaXMgZnVuY3Rpb24gaXMgbm90XG4gKiBleHBlY3RlZCB0byBiZSB1c2VkIGRpcmVjdGx5LCBidXQgcmF0aGVyIHRocm91Z2ggYSBwcmVjb21waWxlXG4gKiBKU1ggdHJhbnNmb3JtXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgYXR0cmlidXRlIG5hbWVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIGF0dHJpYnV0ZSB2YWx1ZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24ganN4QXR0cihuYW1lLCB2YWx1ZSkge1xuXHRpZiAob3B0aW9ucy5hdHRyKSB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gb3B0aW9ucy5hdHRyKG5hbWUsIHZhbHVlKTtcblx0XHRpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycpIHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRpZiAobmFtZSA9PT0gJ3JlZicgfHwgbmFtZSA9PT0gJ2tleScpIHJldHVybiAnJztcblx0aWYgKG5hbWUgPT09ICdzdHlsZScgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuXHRcdGxldCBzdHIgPSAnJztcblx0XHRmb3IgKGxldCBwcm9wIGluIHZhbHVlKSB7XG5cdFx0XHRsZXQgdmFsID0gdmFsdWVbcHJvcF07XG5cdFx0XHRpZiAodmFsICE9IG51bGwgJiYgdmFsICE9PSAnJykge1xuXHRcdFx0XHRjb25zdCBuYW1lID1cblx0XHRcdFx0XHRwcm9wWzBdID09ICctJ1xuXHRcdFx0XHRcdFx0PyBwcm9wXG5cdFx0XHRcdFx0XHQ6IEpTX1RPX0NTU1twcm9wXSB8fFxuXHRcdFx0XHRcdFx0ICAoSlNfVE9fQ1NTW3Byb3BdID0gcHJvcC5yZXBsYWNlKENTU19SRUdFWCwgJy0kJicpLnRvTG93ZXJDYXNlKCkpO1xuXG5cdFx0XHRcdGxldCBzdWZmaXggPSAnOyc7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHR0eXBlb2YgdmFsID09PSAnbnVtYmVyJyAmJlxuXHRcdFx0XHRcdC8vIEV4Y2x1ZGUgY3VzdG9tLWF0dHJpYnV0ZXNcblx0XHRcdFx0XHQhbmFtZS5zdGFydHNXaXRoKCctLScpICYmXG5cdFx0XHRcdFx0IUlTX05PTl9ESU1FTlNJT05BTC50ZXN0KG5hbWUpXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdHN1ZmZpeCA9ICdweDsnO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHN0ciA9IHN0ciArIG5hbWUgKyAnOicgKyB2YWwgKyBzdWZmaXg7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBuYW1lICsgJz1cIicgKyBzdHIgKyAnXCInO1xuXHR9XG5cblx0aWYgKFxuXHRcdHZhbHVlID09IG51bGwgfHxcblx0XHR2YWx1ZSA9PT0gZmFsc2UgfHxcblx0XHR0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicgfHxcblx0XHR0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnXG5cdCkge1xuXHRcdHJldHVybiAnJztcblx0fSBlbHNlIGlmICh2YWx1ZSA9PT0gdHJ1ZSkgcmV0dXJuIG5hbWU7XG5cblx0cmV0dXJuIG5hbWUgKyAnPVwiJyArIGVuY29kZUVudGl0aWVzKHZhbHVlKSArICdcIic7XG59XG5cbi8qKlxuICogRXNjYXBlIGEgZHluYW1pYyBjaGlsZCBwYXNzZWQgdG8gYGpzeFRlbXBsYXRlYC4gVGhpcyBmdW5jdGlvblxuICogaXMgbm90IGV4cGVjdGVkIHRvIGJlIHVzZWQgZGlyZWN0bHksIGJ1dCByYXRoZXIgdGhyb3VnaCBhXG4gKiBwcmVjb21waWxlIEpTWCB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEByZXR1cm5zIHtzdHJpbmcgfCBudWxsIHwgVk5vZGUgfCBBcnJheTxzdHJpbmcgfCBudWxsIHwgVk5vZGU+fVxuICovXG5mdW5jdGlvbiBqc3hFc2NhcGUodmFsdWUpIHtcblx0aWYgKFxuXHRcdHZhbHVlID09IG51bGwgfHxcblx0XHR0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyB8fFxuXHRcdHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJ1xuXHQpIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG5cdFx0Ly8gQ2hlY2sgZm9yIFZOb2RlXG5cdFx0aWYgKHZhbHVlLmNvbnN0cnVjdG9yID09PSB1bmRlZmluZWQpIHJldHVybiB2YWx1ZTtcblxuXHRcdGlmIChpc0FycmF5KHZhbHVlKSkge1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHR2YWx1ZVtpXSA9IGpzeEVzY2FwZSh2YWx1ZVtpXSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGVuY29kZUVudGl0aWVzKCcnICsgdmFsdWUpO1xufVxuXG5leHBvcnQge1xuXHRjcmVhdGVWTm9kZSBhcyBqc3gsXG5cdGNyZWF0ZVZOb2RlIGFzIGpzeHMsXG5cdGNyZWF0ZVZOb2RlIGFzIGpzeERFVixcblx0RnJhZ21lbnQsXG5cdC8vIHByZWNvbXBpbGVkIEpTWCB0cmFuc2Zvcm1cblx0anN4VGVtcGxhdGUsXG5cdGpzeEF0dHIsXG5cdGpzeEVzY2FwZVxufTtcbiIsICJpbXBvcnQge0ZpcmViYXNlQXBwLCBpbml0aWFsaXplQXBwfSBmcm9tICdmaXJlYmFzZS9hcHAnO1xuaW1wb3J0IHtHb29nbGVBdXRoUHJvdmlkZXIsIHNpZ25JbldpdGhQb3B1cH0gZnJvbSAnZmlyZWJhc2UvYXV0aCc7XG5pbXBvcnQge0F1dGgsIGdldEF1dGh9IGZyb20gJ2ZpcmViYXNlL2F1dGgnO1xuaW1wb3J0IHtyZW5kZXJ9IGZyb20gJ3ByZWFjdCc7XG5pbXBvcnQgJy4vc3R5bGVzL2dsb2JhbC5jc3MnO1xuaW1wb3J0ICcuL3N0eWxlcy9zaWduaW4uY3NzJztcblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgV2luZG93IHtcbiAgICBfX1JPT1RfQ1RYOiB7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICBmaXJlYmFzZUNvbmZpZzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICB9O1xuICAgIGZpcmViYXNlOiB7XG4gICAgICBhcHA6IEZpcmViYXNlQXBwO1xuICAgICAgYXV0aDogQXV0aDtcbiAgICB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIFNpZ25JbigpIHtcbiAgY29uc3QgdGl0bGUgPSB3aW5kb3cuX19ST09UX0NUWC5uYW1lO1xuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwic2lnbmluXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInNpZ25pbl9faGVhZGxpbmVcIj5cbiAgICAgICAge3RpdGxlICYmIDxoMSBjbGFzc05hbWU9XCJzaWduaW5fX2hlYWRsaW5lX190aXRsZVwiPnt0aXRsZX08L2gxPn1cbiAgICAgICAgPHAgY2xhc3NOYW1lPVwic2lnbmluX19oZWFkbGluZV9fYm9keVwiPlxuICAgICAgICAgIHt0aXRsZSA/IGBTaWduIGluIHRvIGNvbnRpbnVlIHRvICR7dGl0bGV9YCA6ICdTaWduIGluIHRvIGNvbnRpbnVlJ31cbiAgICAgICAgPC9wPlxuICAgICAgPC9kaXY+XG4gICAgICA8U2lnbkluLkJ1dHRvbiAvPlxuICAgIDwvZGl2PlxuICApO1xufVxuXG5TaWduSW4uQnV0dG9uID0gKCkgPT4ge1xuICBhc3luYyBmdW5jdGlvbiBzaWduSW4oKSB7XG4gICAgY29uc3QgcHJvdmlkZXIgPSBuZXcgR29vZ2xlQXV0aFByb3ZpZGVyKCk7XG4gICAgcHJvdmlkZXIuYWRkU2NvcGUoJ3Byb2ZpbGUnKTtcbiAgICBwcm92aWRlci5hZGRTY29wZSgnZW1haWwnKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzaWduSW5XaXRoUG9wdXAod2luZG93LmZpcmViYXNlLmF1dGgsIHByb3ZpZGVyKTtcbiAgICBjb25zdCB1c2VyID0gcmVzdWx0LnVzZXI7XG4gICAgY29uc3QgaWRUb2tlbiA9IGF3YWl0IHVzZXIuZ2V0SWRUb2tlbigpO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvY21zL2xvZ2luJywge1xuICAgICAgbWV0aG9kOiAnUFVUJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7aWRUb2tlbn0pLFxuICAgIH0pO1xuICAgIGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ2xvZ2luIGZhaWxlZCcpO1xuICAgICAgY29uc29sZS5sb2cocmVzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgaWYgKCFkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ2xvZ2luIGZhaWxlZCcpO1xuICAgICAgY29uc29sZS5sb2cocmVzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbG9naW5TdWNjZXNzUmVkaXJlY3QoKTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGJ1dHRvbiBjbGFzc05hbWU9XCJzaWduaW5fX2J1dHRvblwiIG9uQ2xpY2s9e3NpZ25Jbn0+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInNpZ25pbl9fYnV0dG9uX19pY29uXCI+XG4gICAgICAgIDxTaWduSW4uR0xvZ28gLz5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJzaWduaW5fX2J1dHRvbl9fbGFiZWxcIj5TaWduIGluIHdpdGggR29vZ2xlPC9kaXY+XG4gICAgPC9idXR0b24+XG4gICk7XG59O1xuXG5TaWduSW4uR0xvZ28gPSAoKSA9PiAoXG4gIDxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDQ4IDQ4XCI+XG4gICAgPGc+XG4gICAgICA8cGF0aFxuICAgICAgICBmaWxsPVwiI0VBNDMzNVwiXG4gICAgICAgIGQ9XCJNMjQgOS41YzMuNTQgMCA2LjcxIDEuMjIgOS4yMSAzLjZsNi44NS02Ljg1QzM1LjkgMi4zOCAzMC40NyAwIDI0IDAgMTQuNjIgMCA2LjUxIDUuMzggMi41NiAxMy4yMmw3Ljk4IDYuMTlDMTIuNDMgMTMuNzIgMTcuNzQgOS41IDI0IDkuNXpcIlxuICAgICAgPjwvcGF0aD5cbiAgICAgIDxwYXRoXG4gICAgICAgIGZpbGw9XCIjNDI4NUY0XCJcbiAgICAgICAgZD1cIk00Ni45OCAyNC41NWMwLTEuNTctLjE1LTMuMDktLjM4LTQuNTVIMjR2OS4wMmgxMi45NGMtLjU4IDIuOTYtMi4yNiA1LjQ4LTQuNzggNy4xOGw3LjczIDZjNC41MS00LjE4IDcuMDktMTAuMzYgNy4wOS0xNy42NXpcIlxuICAgICAgPjwvcGF0aD5cbiAgICAgIDxwYXRoXG4gICAgICAgIGZpbGw9XCIjRkJCQzA1XCJcbiAgICAgICAgZD1cIk0xMC41MyAyOC41OWMtLjQ4LTEuNDUtLjc2LTIuOTktLjc2LTQuNTlzLjI3LTMuMTQuNzYtNC41OWwtNy45OC02LjE5Qy45MiAxNi40NiAwIDIwLjEyIDAgMjRjMCAzLjg4LjkyIDcuNTQgMi41NiAxMC43OGw3Ljk3LTYuMTl6XCJcbiAgICAgID48L3BhdGg+XG4gICAgICA8cGF0aFxuICAgICAgICBmaWxsPVwiIzM0QTg1M1wiXG4gICAgICAgIGQ9XCJNMjQgNDhjNi40OCAwIDExLjkzLTIuMTMgMTUuODktNS44MWwtNy43My02Yy0yLjE1IDEuNDUtNC45MiAyLjMtOC4xNiAyLjMtNi4yNiAwLTExLjU3LTQuMjItMTMuNDctOS45MWwtNy45OCA2LjE5QzYuNTEgNDIuNjIgMTQuNjIgNDggMjQgNDh6XCJcbiAgICAgID48L3BhdGg+XG4gICAgICA8cGF0aCBmaWxsPVwibm9uZVwiIGQ9XCJNMCAwaDQ4djQ4SDB6XCI+PC9wYXRoPlxuICAgIDwvZz5cbiAgPC9zdmc+XG4pO1xuXG5mdW5jdGlvbiBsb2dpblN1Y2Nlc3NSZWRpcmVjdCgpIHtcbiAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcbiAgbGV0IHJlZGlyZWN0VXJsID0gcGFyYW1zLmdldCgnY29udGludWUnKTtcbiAgaWYgKFxuICAgICFyZWRpcmVjdFVybCB8fFxuICAgICFyZWRpcmVjdFVybC5zdGFydHNXaXRoKCcvJykgfHxcbiAgICByZWRpcmVjdFVybC5zdGFydHNXaXRoKCcvY21zL2xvZ2luJylcbiAgKSB7XG4gICAgcmVkaXJlY3RVcmwgPSAnL2Ntcyc7XG4gIH1cbiAgd2luZG93LmxvY2F0aW9uLnJlcGxhY2UocmVkaXJlY3RVcmwpO1xufVxuXG5jb25zdCBhcHAgPSBpbml0aWFsaXplQXBwKHdpbmRvdy5fX1JPT1RfQ1RYLmZpcmViYXNlQ29uZmlnKTtcbmNvbnN0IGF1dGggPSBnZXRBdXRoKGFwcCk7XG53aW5kb3cuZmlyZWJhc2UgPSB7YXBwLCBhdXRofTtcbmNvbnN0IHJvb3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncm9vdCcpITtcbnJvb3QuaW5uZXJIVE1MID0gJyc7XG5yZW5kZXIoPFNpZ25JbiAvPiwgcm9vdCk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7QUVpQkEsTUFBTUEsc0JBQW9CLFNBQVUsS0FBVztBQUU3QyxVQUFNLE1BQWdCLENBQUE7QUFDdEIsUUFBSUMsS0FBSTtBQUNSLGFBQVNDLEtBQUksR0FBR0EsS0FBSSxJQUFJLFFBQVFBLE1BQUs7QUFDbkMsVUFBSUMsS0FBSSxJQUFJLFdBQVdELEVBQUM7QUFDeEIsVUFBSUMsS0FBSSxLQUFLO0FBQ1gsWUFBSUYsSUFBRyxJQUFJRTtNQUNaLFdBQVVBLEtBQUksTUFBTTtBQUNuQixZQUFJRixJQUFHLElBQUtFLE1BQUssSUFBSztBQUN0QixZQUFJRixJQUFHLElBQUtFLEtBQUksS0FBTTtNQUN2QixZQUNFQSxLQUFJLFdBQVksU0FDakJELEtBQUksSUFBSSxJQUFJLFdBQ1gsSUFBSSxXQUFXQSxLQUFJLENBQUMsSUFBSSxXQUFZLE9BQ3JDO0FBRUEsUUFBQUMsS0FBSSxVQUFZQSxLQUFJLFNBQVcsT0FBTyxJQUFJLFdBQVcsRUFBRUQsRUFBQyxJQUFJO0FBQzVELFlBQUlELElBQUcsSUFBS0UsTUFBSyxLQUFNO0FBQ3ZCLFlBQUlGLElBQUcsSUFBTUUsTUFBSyxLQUFNLEtBQU07QUFDOUIsWUFBSUYsSUFBRyxJQUFNRSxNQUFLLElBQUssS0FBTTtBQUM3QixZQUFJRixJQUFHLElBQUtFLEtBQUksS0FBTTtNQUN2QixPQUFNO0FBQ0wsWUFBSUYsSUFBRyxJQUFLRSxNQUFLLEtB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QU8sV0FBVyxFQUFDLEtBQUssS0FBSTtBQUM1QixNQUFNLE9BQU8sU0FBUyxlQUFlLE1BQU07QUFDM0MsT0FBSyxZQUFZO0FBQ2pCLElBQU8sZ0JBQUFBLEdBQUMsVUFBTyxHQUFJLElBQUk7IiwKICAibmFtZXMiOiBbInN0cmluZ1RvQnl0ZUFycmF5IiwgInAiLCAiaSIsICJjIiwgImMyIiwgInUiLCAiZSIsICJlIiwgIm5hbWUiLCAiZSIsICJhIiwgImIiLCAiayIsICJxdWVyeXN0cmluZyIsICJlIiwgImkiLCAibmFtZSIsICJlIiwgIkxvZ0xldmVsIiwgIm5hbWUiLCAiYyIsICJuYW1lIiwgInZlcnNpb24iLCAidGFyZ2V0IiwgIkRFRkFVTFRfRU5UUllfTkFNRSIsICJhcHBOYW1lIiwgImFwcENvbXBhdE5hbWUiLCAiYW5hbHl0aWNzTmFtZSIsICJhbmFseXRpY3NDb21wYXROYW1lIiwgImFwcENoZWNrTmFtZSIsICJhcHBDaGVja0NvbXBhdE5hbWUiLCAiYXV0aE5hbWUiLCAiYXV0aENvbXBhdE5hbWUiLCAiZGF0YWJhc2VOYW1lIiwgImRhdGFiYXNlQ29tcGF0TmFtZSIsICJmdW5jdGlvbnNOYW1lIiwgImZ1bmN0aW9uc0NvbXBhdE5hbWUiLCAiaW5zdGFsbGF0aW9uc05hbWUiLCAiaW5zdGFsbGF0aW9uc0NvbXBhdE5hbWUiLCAibWVzc2FnaW5nTmFtZSIsICJtZXNzYWdpbmdDb21wYXROYW1lIiwgInBlcmZvcm1hbmNlTmFtZSIsICJwZXJmb3JtYW5jZUNvbXBhdE5hbWUiLCAicmVtb3RlQ29uZmlnTmFtZSIsICJyZW1vdGVDb25maWdDb21wYXROYW1lIiwgInN0b3JhZ2VOYW1lIiwgInN0b3JhZ2VDb21wYXROYW1lIiwgImZpcmVzdG9yZU5hbWUiLCAiZmlyZXN0b3JlQ29tcGF0TmFtZSIsICJwYWNrYWdlTmFtZSIsICJhcHAiLCAiZSIsICJhcHAiLCAibmFtZSIsICJuYW1lIiwgIkRFRkFVTFRfRU5UUllfTkFNRSIsICJhcHAiLCAidmVyc2lvbiIsICJlIiwgImFwcCIsICJuYW1lIiwgInZlcnNpb24iLCAibmFtZSIsICJ2ZXJzaW9uIiwgInMiLCAiZSIsICJ0IiwgInAiLCAiaSIsICJhdXRoIiwgImUiLCAiYXV0aCIsICJhdXRoIiwgImUiLCAiZSIsICJhdXRoIiwgIm8iLCAibiIsICJyZWxvYWQiLCAibmFtZSIsICJwIiwgImUiLCAiYXV0aCIsICJpIiwgImFwcCIsICJqc0hlbHBlcnNcclxuICAgICAgICAgICAgICAgICAgICAgICAgLl9sb2FkSlMiLCAiYXBwIiwgImF1dGgiLCAiYXV0aCIsICJhdXRoIiwgInNpZ25JbldpdGhFbWFpbExpbmsiLCAiYXV0aCIsICJJRFBfUkVRVUVTVF9VUkkiLCAic2lnbkluV2l0aFBob25lTnVtYmVyIiwgImxpbmtXaXRoUGhvbmVOdW1iZXIiLCAiYXV0aCIsICJhdXRoIiwgIl9saW5rIiwgImF1dGgiLCAiZSIsICJhdXRoIiwgImF1dGgiLCAiX1BPTExJTkdfSU5URVJWQUxfTVMiLCAia2V5IiwgInN0b3JlZFZhbHVlIiwgImkiLCAiREJfTkFNRSIsICJEQl9WRVJTSU9OIiwgImUiLCAiYXV0aCIsICJqc0hlbHBlcnMuX2dlbmVyYXRlQ2FsbGJhY2tOYW1lIiwgImF1dGgiLCAiYXV0aCIsICJfbGlua1VzZXIiLCAiZSIsICJhdXRoIiwgImUiLCAiYXV0aCIsICJhdXRoIiwgImF1dGgiLCAiZSIsICJ2IiwgImkiLCAianMuX2dlbmVyYXRlQ2FsbGJhY2tOYW1lIiwgImpzXHJcbiAgICAgICAgICAgICAgICAuX2xvYWRKUyIsICJnYXBpTG9hZGVyLl9sb2FkR2FwaSIsICJnYXBpIiwgIndpbmRvdyIsICJuYW1lIiwgInByb21pc2UiLCAiYXBwIiwgInZlcnNpb24iLCAiTU9ERV9IWURSQVRFIiwgInNsaWNlIiwgIm9wdGlvbnMiLCAidm5vZGVJZCIsICJpc1ZhbGlkRWxlbWVudCIsICJyZXJlbmRlclF1ZXVlIiwgInByZXZEZWJvdW5jZSIsICJkZWZlciIsICJkZXB0aFNvcnQiLCAiaSIsICJFTVBUWV9PQkoiLCAiRU1QVFlfQVJSIiwgIklTX05PTl9ESU1FTlNJT05BTCIsICJpc0FycmF5IiwgIkFycmF5IiwgImFzc2lnbiIsICJvYmoiLCAicHJvcHMiLCAicmVtb3ZlTm9kZSIsICJub2RlIiwgInBhcmVudE5vZGUiLCAicmVtb3ZlQ2hpbGQiLCAiY3JlYXRlRWxlbWVudCIsICJ0eXBlIiwgImNoaWxkcmVuIiwgImtleSIsICJyZWYiLCAibm9ybWFsaXplZFByb3BzIiwgImFyZ3VtZW50cyIsICJsZW5ndGgiLCAiY2FsbCIsICJkZWZhdWx0UHJvcHMiLCAiY3JlYXRlVk5vZGUiLCAib3JpZ2luYWwiLCAidm5vZGUiLCAiX19rIiwgIl9fIiwgIl9fYiIsICJfX2UiLCAiX19kIiwgIl9fYyIsICJjb25zdHJ1Y3RvciIsICJfX3YiLCAiX19pIiwgIl9fdSIsICJGcmFnbWVudCIsICJwcm9wcyIsICJjaGlsZHJlbiIsICJCYXNlQ29tcG9uZW50IiwgImNvbnRleHQiLCAidGhpcyIsICJnZXREb21TaWJsaW5nIiwgInZub2RlIiwgImNoaWxkSW5kZXgiLCAiX18iLCAic2libGluZyIsICJfX2siLCAibGVuZ3RoIiwgIl9fZSIsICJ0eXBlIiwgInVwZGF0ZVBhcmVudERvbVBvaW50ZXJzIiwgImkiLCAiY2hpbGQiLCAiX19jIiwgImJhc2UiLCAiZW5xdWV1ZVJlbmRlciIsICJjIiwgIl9fZCIsICJyZXJlbmRlclF1ZXVlIiwgInB1c2giLCAicHJvY2VzcyIsICJwcmV2RGVib3VuY2UiLCAib3B0aW9ucyIsICJkZWJvdW5jZVJlbmRlcmluZyIsICJkZWZlciIsICJyZW5kZXJRdWV1ZUxlbmd0aCIsICJjb21wb25lbnQiLCAibmV3Vk5vZGUiLCAib2xkVk5vZGUiLCAib2xkRG9tIiwgInBhcmVudERvbSIsICJjb21taXRRdWV1ZSIsICJyZWZRdWV1ZSIsICJzb3J0IiwgImRlcHRoU29ydCIsICJzaGlmdCIsICJfX3YiLCAiX19QIiwgImFzc2lnbiIsICJkaWZmIiwgIl9fbiIsICJvd25lclNWR0VsZW1lbnQiLCAiX191IiwgIl9faSIsICJjb21taXRSb290IiwgImRpZmZDaGlsZHJlbiIsICJyZW5kZXJSZXN1bHQiLCAibmV3UGFyZW50Vk5vZGUiLCAib2xkUGFyZW50Vk5vZGUiLCAiZ2xvYmFsQ29udGV4dCIsICJpc1N2ZyIsICJleGNlc3NEb21DaGlsZHJlbiIsICJpc0h5ZHJhdGluZyIsICJjaGlsZFZOb2RlIiwgIm5ld0RvbSIsICJmaXJzdENoaWxkRG9tIiwgIm9sZENoaWxkcmVuIiwgIkVNUFRZX0FSUiIsICJuZXdDaGlsZHJlbkxlbmd0aCIsICJjb25zdHJ1Y3ROZXdDaGlsZHJlbkFycmF5IiwgIkVNUFRZX09CSiIsICJyZWYiLCAiYXBwbHlSZWYiLCAiaW5zZXJ0IiwgIm5leHRTaWJsaW5nIiwgInNrZXdlZEluZGV4IiwgIm1hdGNoaW5nSW5kZXgiLCAib2xkQ2hpbGRyZW5MZW5ndGgiLCAicmVtYWluaW5nT2xkQ2hpbGRyZW4iLCAic2tldyIsICJjb25zdHJ1Y3RvciIsICJTdHJpbmciLCAiY3JlYXRlVk5vZGUiLCAiaXNBcnJheSIsICJrZXkiLCAiX19iIiwgImZpbmRNYXRjaGluZ0luZGV4IiwgInVubW91bnQiLCAicGFyZW50Vk5vZGUiLCAiaW5zZXJ0QmVmb3JlIiwgImZpbmRNYXRjaGluZ0luZGV4IiwgImNoaWxkVk5vZGUiLCAib2xkQ2hpbGRyZW4iLCAic2tld2VkSW5kZXgiLCAicmVtYWluaW5nT2xkQ2hpbGRyZW4iLCAia2V5IiwgInR5cGUiLCAieCIsICJ5IiwgIm9sZFZOb2RlIiwgImxlbmd0aCIsICJfX3UiLCAic2V0U3R5bGUiLCAic3R5bGUiLCAidmFsdWUiLCAic2V0UHJvcGVydHkiLCAiSVNfTk9OX0RJTUVOU0lPTkFMIiwgInRlc3QiLCAiZG9tIiwgIm5hbWUiLCAib2xkVmFsdWUiLCAiaXNTdmciLCAidXNlQ2FwdHVyZSIsICJvIiwgImNzc1RleHQiLCAicmVwbGFjZSIsICJ0b0xvd2VyQ2FzZSIsICJzbGljZSIsICJsIiwgIl9hdHRhY2hlZCIsICJEYXRlIiwgIm5vdyIsICJhZGRFdmVudExpc3RlbmVyIiwgImV2ZW50UHJveHlDYXB0dXJlIiwgImV2ZW50UHJveHkiLCAicmVtb3ZlRXZlbnRMaXN0ZW5lciIsICJlIiwgInJlbW92ZUF0dHJpYnV0ZSIsICJzZXRBdHRyaWJ1dGUiLCAiZXZlbnRIYW5kbGVyIiwgInRoaXMiLCAiX2Rpc3BhdGNoZWQiLCAib3B0aW9ucyIsICJldmVudCIsICJkaWZmIiwgInBhcmVudERvbSIsICJuZXdWTm9kZSIsICJnbG9iYWxDb250ZXh0IiwgImV4Y2Vzc0RvbUNoaWxkcmVuIiwgImNvbW1pdFF1ZXVlIiwgIm9sZERvbSIsICJpc0h5ZHJhdGluZyIsICJyZWZRdWV1ZSIsICJ0bXAiLCAiYyIsICJpc05ldyIsICJvbGRQcm9wcyIsICJvbGRTdGF0ZSIsICJzbmFwc2hvdCIsICJjbGVhclByb2Nlc3NpbmdFeGNlcHRpb24iLCAibmV3UHJvcHMiLCAicHJvdmlkZXIiLCAiY29tcG9uZW50Q29udGV4dCIsICJpIiwgInJlbmRlckhvb2siLCAiY291bnQiLCAicmVuZGVyUmVzdWx0IiwgIm5ld1R5cGUiLCAiY29uc3RydWN0b3IiLCAiX19lIiwgIl9fYiIsICJvdXRlciIsICJwcm9wcyIsICJjb250ZXh0VHlwZSIsICJfX2MiLCAiX18iLCAiX19FIiwgInByb3RvdHlwZSIsICJyZW5kZXIiLCAiQmFzZUNvbXBvbmVudCIsICJkb1JlbmRlciIsICJzdWIiLCAic3RhdGUiLCAiY29udGV4dCIsICJfX24iLCAiX19kIiwgIl9faCIsICJfc2IiLCAiX19zIiwgImdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyIsICJhc3NpZ24iLCAiX192IiwgImNvbXBvbmVudFdpbGxNb3VudCIsICJjb21wb25lbnREaWRNb3VudCIsICJwdXNoIiwgImNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMiLCAic2hvdWxkQ29tcG9uZW50VXBkYXRlIiwgIl9fayIsICJmb3JFYWNoIiwgInZub2RlIiwgImNvbXBvbmVudFdpbGxVcGRhdGUiLCAiY29tcG9uZW50RGlkVXBkYXRlIiwgIl9fUCIsICJfX3IiLCAiZ2V0Q2hpbGRDb250ZXh0IiwgImdldFNuYXBzaG90QmVmb3JlVXBkYXRlIiwgImRpZmZDaGlsZHJlbiIsICJpc0FycmF5IiwgIkZyYWdtZW50IiwgImNoaWxkcmVuIiwgImJhc2UiLCAiTU9ERV9IWURSQVRFIiwgImluZGV4T2YiLCAiZGlmZkVsZW1lbnROb2RlcyIsICJkaWZmZWQiLCAiY29tbWl0Um9vdCIsICJyb290IiwgImFwcGx5UmVmIiwgInNvbWUiLCAiY2IiLCAiY2FsbCIsICJuZXdIdG1sIiwgIm9sZEh0bWwiLCAibmV3Q2hpbGRyZW4iLCAiaW5wdXRWYWx1ZSIsICJjaGVja2VkIiwgIm5vZGVUeXBlIiwgImxvY2FsTmFtZSIsICJkb2N1bWVudCIsICJjcmVhdGVUZXh0Tm9kZSIsICJjcmVhdGVFbGVtZW50TlMiLCAiY3JlYXRlRWxlbWVudCIsICJpcyIsICJkYXRhIiwgImNoaWxkTm9kZXMiLCAiRU1QVFlfT0JKIiwgImF0dHJpYnV0ZXMiLCAiX19odG1sIiwgImlubmVySFRNTCIsICJnZXREb21TaWJsaW5nIiwgInJlbW92ZU5vZGUiLCAicmVmIiwgImN1cnJlbnQiLCAidW5tb3VudCIsICJwYXJlbnRWTm9kZSIsICJza2lwUmVtb3ZlIiwgInIiLCAiY29tcG9uZW50V2lsbFVubW91bnQiLCAicmVwbGFjZU5vZGUiLCAib3duZXJTVkdFbGVtZW50IiwgImZpcnN0Q2hpbGQiLCAic2xpY2UiLCAiRU1QVFlfQVJSIiwgIm9wdGlvbnMiLCAiX19lIiwgImVycm9yIiwgInZub2RlIiwgIm9sZFZOb2RlIiwgImVycm9ySW5mbyIsICJjb21wb25lbnQiLCAiY3RvciIsICJoYW5kbGVkIiwgIl9fIiwgIl9fYyIsICJjb25zdHJ1Y3RvciIsICJnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IiLCAic2V0U3RhdGUiLCAiX19kIiwgImNvbXBvbmVudERpZENhdGNoIiwgIl9fRSIsICJlIiwgInZub2RlSWQiLCAiaXNWYWxpZEVsZW1lbnQiLCAidW5kZWZpbmVkIiwgIkJhc2VDb21wb25lbnQiLCAicHJvdG90eXBlIiwgInVwZGF0ZSIsICJjYWxsYmFjayIsICJzIiwgInRoaXMiLCAiX19zIiwgInN0YXRlIiwgImFzc2lnbiIsICJwcm9wcyIsICJfX3YiLCAiX3NiIiwgInB1c2giLCAiZW5xdWV1ZVJlbmRlciIsICJmb3JjZVVwZGF0ZSIsICJfX2giLCAicmVuZGVyIiwgIkZyYWdtZW50IiwgInJlcmVuZGVyUXVldWUiLCAiZGVmZXIiLCAiUHJvbWlzZSIsICJ0aGVuIiwgImJpbmQiLCAicmVzb2x2ZSIsICJzZXRUaW1lb3V0IiwgImRlcHRoU29ydCIsICJhIiwgImIiLCAiX19iIiwgInByb2Nlc3MiLCAiX19yIiwgImkiLCAidm5vZGVJZCIsICJpc0FycmF5IiwgIkFycmF5IiwgImNyZWF0ZVZOb2RlIiwgInR5cGUiLCAicHJvcHMiLCAia2V5IiwgImlzU3RhdGljQ2hpbGRyZW4iLCAiX19zb3VyY2UiLCAiX19zZWxmIiwgInJlZiIsICJpIiwgIm5vcm1hbGl6ZWRQcm9wcyIsICJ2bm9kZSIsICJfX2siLCAiX18iLCAiX19iIiwgIl9fZSIsICJfX2QiLCAiX19jIiwgImNvbnN0cnVjdG9yIiwgIl9fdiIsICJfX2kiLCAiX191IiwgImRlZmF1bHRQcm9wcyIsICJvcHRpb25zIiwgInUiXQp9Cg==