obsidian-integration-testing 12.1.1 → 12.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/dist/lib/cjs/app-config.cjs +137 -0
  2. package/dist/lib/cjs/app-config.d.cts +190 -0
  3. package/dist/lib/cjs/appium-session-config.cjs +9 -1
  4. package/dist/lib/cjs/appium-session-config.d.cts +23 -0
  5. package/dist/lib/cjs/cdp-command-timeout-error.cjs +50 -0
  6. package/dist/lib/cjs/cdp-command-timeout-error.d.cts +48 -0
  7. package/dist/lib/cjs/emulator-arguments.cjs +19 -3
  8. package/dist/lib/cjs/emulator-arguments.d.cts +44 -0
  9. package/dist/lib/cjs/emulator-marker.cjs +169 -0
  10. package/dist/lib/cjs/emulator-marker.d.cts +224 -0
  11. package/dist/lib/cjs/emulator-reaper.cjs +248 -0
  12. package/dist/lib/cjs/emulator-reaper.d.cts +225 -0
  13. package/dist/lib/cjs/emulator-reclaim.cjs +312 -0
  14. package/dist/lib/cjs/emulator-reclaim.d.cts +179 -0
  15. package/dist/lib/cjs/eval-cap-exceeded-error.cjs +61 -0
  16. package/dist/lib/cjs/eval-cap-exceeded-error.d.cts +92 -0
  17. package/dist/lib/cjs/global-setup-core.cjs +2 -3
  18. package/dist/lib/cjs/index.cjs +18 -1
  19. package/dist/lib/cjs/index.d.cts +6 -0
  20. package/dist/lib/cjs/library.cjs +1 -1
  21. package/dist/lib/cjs/mobile-input.cjs +14 -1
  22. package/dist/lib/cjs/mobile-input.d.cts +30 -0
  23. package/dist/lib/cjs/namespace-bootstrap.cjs +9 -1
  24. package/dist/lib/cjs/poll-in-obsidian.cjs +1 -1
  25. package/dist/lib/cjs/poll-in-obsidian.d.cts +6 -2
  26. package/dist/lib/cjs/setup-lock.cjs +56 -8
  27. package/dist/lib/cjs/setup-lock.d.cts +53 -0
  28. package/dist/lib/cjs/transport-appium.cjs +73 -4
  29. package/dist/lib/cjs/transport-appium.d.cts +35 -0
  30. package/dist/lib/cjs/transport-desktop-cdp.cjs +22 -7
  31. package/dist/lib/cjs/transport-factory.cjs +297 -190
  32. package/dist/lib/cjs/transport-factory.d.cts +15 -0
  33. package/dist/lib/cjs/transport-options.cjs +1 -1
  34. package/dist/lib/cjs/transport-options.d.cts +27 -0
  35. package/dist/lib/esm/app-config.d.mts +190 -0
  36. package/dist/lib/esm/app-config.mjs +110 -0
  37. package/dist/lib/esm/appium-session-config.d.mts +23 -0
  38. package/dist/lib/esm/appium-session-config.mjs +7 -1
  39. package/dist/lib/esm/cdp-command-timeout-error.d.mts +48 -0
  40. package/dist/lib/esm/cdp-command-timeout-error.mjs +26 -0
  41. package/dist/lib/esm/emulator-arguments.d.mts +44 -0
  42. package/dist/lib/esm/emulator-arguments.mjs +16 -2
  43. package/dist/lib/esm/emulator-marker.d.mts +224 -0
  44. package/dist/lib/esm/emulator-marker.mjs +134 -0
  45. package/dist/lib/esm/emulator-reaper.d.mts +225 -0
  46. package/dist/lib/esm/emulator-reaper.mjs +211 -0
  47. package/dist/lib/esm/emulator-reclaim.d.mts +179 -0
  48. package/dist/lib/esm/emulator-reclaim.mjs +291 -0
  49. package/dist/lib/esm/eval-cap-exceeded-error.d.mts +92 -0
  50. package/dist/lib/esm/eval-cap-exceeded-error.mjs +36 -0
  51. package/dist/lib/esm/global-setup-core.mjs +6 -4
  52. package/dist/lib/esm/index.d.mts +6 -0
  53. package/dist/lib/esm/index.mjs +19 -1
  54. package/dist/lib/esm/library.mjs +1 -1
  55. package/dist/lib/esm/mobile-input.d.mts +30 -0
  56. package/dist/lib/esm/mobile-input.mjs +12 -1
  57. package/dist/lib/esm/namespace-bootstrap.mjs +9 -1
  58. package/dist/lib/esm/poll-in-obsidian.d.mts +6 -2
  59. package/dist/lib/esm/poll-in-obsidian.mjs +1 -1
  60. package/dist/lib/esm/setup-lock.d.mts +53 -0
  61. package/dist/lib/esm/setup-lock.mjs +52 -7
  62. package/dist/lib/esm/transport-appium.d.mts +35 -0
  63. package/dist/lib/esm/transport-appium.mjs +78 -4
  64. package/dist/lib/esm/transport-desktop-cdp.mjs +22 -7
  65. package/dist/lib/esm/transport-factory.d.mts +15 -0
  66. package/dist/lib/esm/transport-factory.mjs +305 -184
  67. package/dist/lib/esm/transport-options.d.mts +27 -0
  68. package/dist/lib/esm/transport-options.mjs +1 -1
  69. package/package.json +4 -4
@@ -20,7 +20,9 @@ var mobile_input_exports = {};
20
20
  __export(mobile_input_exports, {
21
21
  MOBILE_INPUT_BINDING_NAME: () => MOBILE_INPUT_BINDING_NAME,
22
22
  MOBILE_INPUT_TIMEOUT_IN_MILLISECONDS: () => MOBILE_INPUT_TIMEOUT_IN_MILLISECONDS,
23
+ buildClaimInputExpression: () => buildClaimInputExpression,
23
24
  buildResolveInputExpression: () => buildResolveInputExpression,
25
+ checkInputClaimGranted: () => checkInputClaimGranted,
24
26
  codePointOf: () => codePointOf,
25
27
  toCdpInputCommands: () => toCdpInputCommands,
26
28
  toCdpModifiers: () => toCdpModifiers
@@ -65,9 +67,18 @@ const DIGIT_ZERO_CODE_POINT = codePointOf("0");
65
67
  const DIGIT_NINE_CODE_POINT = codePointOf("9");
66
68
  const UPPERCASE_A_CODE_POINT = codePointOf("A");
67
69
  const UPPERCASE_Z_CODE_POINT = codePointOf("Z");
70
+ function buildClaimInputExpression(id) {
71
+ return `window.__obsidianIntegrationTesting?.claimInput?.(${JSON.stringify(id)})`;
72
+ }
68
73
  function buildResolveInputExpression(id, errorMessage) {
69
74
  return `window.__obsidianIntegrationTesting?.resolveInput?.(${JSON.stringify(id)}, ${JSON.stringify(errorMessage ?? null)})`;
70
75
  }
76
+ function checkInputClaimGranted(result) {
77
+ if (typeof result !== "object" || result === null) {
78
+ return true;
79
+ }
80
+ return result.result?.value !== false;
81
+ }
71
82
  function codePointOf(text) {
72
83
  const codePoint = text.codePointAt(FIRST_CODE_POINT_INDEX);
73
84
  if (codePoint === void 0) {
@@ -165,9 +176,11 @@ function toPointerCommands(request) {
165
176
  0 && (module.exports = {
166
177
  MOBILE_INPUT_BINDING_NAME,
167
178
  MOBILE_INPUT_TIMEOUT_IN_MILLISECONDS,
179
+ buildClaimInputExpression,
168
180
  buildResolveInputExpression,
181
+ checkInputClaimGranted,
169
182
  codePointOf,
170
183
  toCdpInputCommands,
171
184
  toCdpModifiers
172
185
  });
173
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL21vYmlsZS1pbnB1dC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRyYW5zbGF0ZXMgYSBtb2JpbGUgdHJ1c3RlZC1pbnB1dCByZXF1ZXN0IGludG8gdGhlIG9yZGVyZWQgQ2hyb21lIERldlRvb2xzIFByb3RvY29sIGBJbnB1dC4qYCBjb21tYW5kc1xuICogdGhhdCByZWFsaXplIGl0IChzZWUgKipMMzkqKikuXG4gKlxuICogUHVyZSBhbmQgc3luY2hyb25vdXMgYnkgZGVzaWduOiB0aGUgV2ViVmlldyBjb25uZWN0aW9uICh7QGxpbmsgV2ViVmlld0NkcENvbm5lY3Rpb259KSBzZW5kcyB3aGF0ZXZlciB0aGlzXG4gKiByZXR1cm5zLCBzbyBldmVyeSBkZWNpc2lvbiB0aGF0IGlzIHdvcnRoIGEgdGVzdCBcdTIwMTQgdGhlIHRvdWNoIHBhaXIgYSB0YXAgZXhwYW5kcyBpbnRvLCB0aGUgZHdlbGwgYVxuICogbG9uZy1wcmVzcyBhZGRzLCB0aGUgYHJhd0tleURvd25gIFx1MjE5MiBgY2hhcmAgXHUyMTkyIGBrZXlVcGAgc2hhcGUgYSBrZXkgcHJlc3MgbWlycm9ycyBmcm9tIHRoZSBkZXNrdG9wIHR3aW4sIHRoZVxuICogbW9kaWZpZXIgYml0bWFzayBcdTIwMTQgbGl2ZXMgaGVyZSByYXRoZXIgdGhhbiBpbnNpZGUgdGhlIHRyYW5zcG9ydCdzIEkvTyBwYXRoLlxuICpcbiAqIFRoZSByZXF1ZXN0IHRyYXZlbHMgcmVuZGVyZXIgXHUyMTkyIGhvc3QgYXMgSlNPTiAodGhlIHJlbmRlcmVyIGNvbXB1dGVzIHRoZSBjb29yZGluYXRlcywgYmVjYXVzZSBvbmx5IGl0IGNhblxuICogc2VlIHRoZSBET00pLCBzbyBib3RoIHRoZSByZXF1ZXN0IGFuZCB0aGUgY29tbWFuZCBzaGFwZXMgYXJlIGRlbGliZXJhdGVseSBwbGFpbiBkYXRhLlxuICovXG5cbi8qKlxuICogVGhlIG5hbWUgb2YgdGhlIGBSdW50aW1lLmFkZEJpbmRpbmdgIGZ1bmN0aW9uIHRoZSBob3N0IGV4cG9zZXMgb24gdGhlIHBhZ2Ugc28gdGhlIHJlbmRlcmVyIGNhbiBoYW5kIGl0IGFuXG4gKiBpbnB1dCByZXF1ZXN0IG1pZC1jbG9zdXJlLlxuICpcbiAqIEl0IGlzIHBhc3NlZCAqaW50byogdGhlIHNlcmlhbGl6ZWQgYm9vdHN0cmFwIGNsb3N1cmUgYXMgZGF0YSByYXRoZXIgdGhhbiByZWZlcmVuY2VkIGZyb20gaXQsIGJlY2F1c2UgdGhhdFxuICogY2xvc3VyZSBtYXkgbm90IHJlYWQgb3V0ZXIgc2NvcGUgKCoqTDE1KiopIFx1MjAxNCBzbyB0aGlzIHN0YXlzIHRoZSBzaW5nbGUgZGVmaW5pdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IE1PQklMRV9JTlBVVF9CSU5ESU5HX05BTUUgPSAnX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZ0lucHV0JztcblxuLyoqXG4gKiBIb3cgbG9uZyB0aGUgcmVuZGVyZXIgd2FpdHMgZm9yIHRoZSBob3N0IHRvIHNlcnZpY2Ugb25lIGlucHV0IHJlcXVlc3QgYmVmb3JlIGdpdmluZyB1cC5cbiAqXG4gKiBHZW5lcm91cyByZWxhdGl2ZSB0byB0aGUgd29yayAoYSB0YXAgaXMgdHdvIENEUCBjb21tYW5kczsgYSBsb25nLXByZXNzIGFkZHMgYSA2MDBtcyBkd2VsbCk6IHRoZSBwb2ludCBpc1xuICogdG8gZmFpbCB3aXRoIGEgbGVnaWJsZSBlcnJvciByYXRoZXIgdGhhbiBoYW5nIHRoZSBjbG9zdXJlIHVudGlsIHRoZSB3aG9sZSBydW4gdGltZXMgb3V0LiBQYXNzZWQgaW50byB0aGVcbiAqIGJvb3RzdHJhcCBjbG9zdXJlIGFzIGRhdGEsIGZvciB0aGUgc2FtZSByZWFzb24gYXMge0BsaW5rIE1PQklMRV9JTlBVVF9CSU5ESU5HX05BTUV9LlxuICovXG5leHBvcnQgY29uc3QgTU9CSUxFX0lOUFVUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTVfMDAwO1xuXG4vKipcbiAqIEEgc2luZ2xlIENocm9tZSBEZXZUb29scyBQcm90b2NvbCBjb21tYW5kLlxuICpcbiAqIEl0IG9uY2UgYWxzbyBjYXJyaWVkIGEgYGRlbGF5QmVmb3JlSW5NaWxsaXNlY29uZHNgLCBzbyB0aGUgaG9zdCB3b3VsZCBzbGVlcCBiZXR3ZWVuIHRoZSB0d28gaGFsdmVzIG9mIGFcbiAqIGxvbmctcHJlc3MuIFRoYXQgZHdlbGwgaXMgZ29uZTogdGhlIGdlc3R1cmUgaXMgbm93IG9uZSBgSW5wdXQuc3ludGhlc2l6ZVRhcEdlc3R1cmVgIHRoYXQgaG9sZHMgaXRzZWxmXG4gKiBmb3IgaXRzIG93biBgZHVyYXRpb25gLCBzbyBubyBjb21tYW5kIGluIGFueSBzZXF1ZW5jZSBuZWVkcyB0byBiZSBzcGFjZWQgZnJvbSB0aGUgb25lIGJlZm9yZSBpdCwgYW5kIGFcbiAqIGtub2Igbm90aGluZyBzZXRzIGlzIHdvcnNlIHRoYW4gbm8ga25vYi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDZHBJbnB1dENvbW1hbmQge1xuICAvKipcbiAgICogVGhlIENEUCBtZXRob2QgbmFtZSwgZS5nLiBgSW5wdXQuZGlzcGF0Y2hUb3VjaEV2ZW50YC5cbiAgICovXG4gIHJlYWRvbmx5IG1ldGhvZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgQ0RQIG1ldGhvZCBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcmVhZG9ubHkgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLyoqXG4gKiBXaGF0IHRoZSByZW5kZXJlciBoYW5kcyB0byB0aGUgaG9zdCBiaW5kaW5nOiBvbmUgcmVxdWVzdCwgcGx1cyB0aGUgaWQgdG8gYW5zd2VyIGl0IG9uLlxuICpcbiAqIFRoZSByZW5kZXJlciBidWlsZHMgdGhpcyBsaXRlcmFsIGluc2lkZSB0aGUgc2VyaWFsaXplZCBib290c3RyYXAgY2xvc3VyZSwgd2hpY2ggY2Fubm90IGltcG9ydCAoKipMMTUqKiksXG4gKiBzbyB0aGUgc2hhcGUgaXMgZGVjbGFyZWQgaGVyZSBhbmQgbWlycm9yZWQgdGhlcmUuIFRoZXkgYXJlIG9uZSB3aXJlIGZvcm1hdDsgY2hhbmdlIHRoZW0gdG9nZXRoZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9iaWxlSW5wdXRFbnZlbG9wZSB7XG4gIC8qKlxuICAgKiBUaGUgcmVxdWVzdCBpZCB0aGUgcmVuZGVyZXIgaXMgd2FpdGluZyBvbi5cbiAgICovXG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoYXQgdG8gaW5qZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgcmVxdWVzdDogTW9iaWxlSW5wdXRSZXF1ZXN0O1xufVxuXG4vKipcbiAqIEFueXRoaW5nIHRoZSByZW5kZXJlciBjYW4gYXNrIHRoZSBob3N0IHRvIGluamVjdC5cbiAqL1xuZXhwb3J0IHR5cGUgTW9iaWxlSW5wdXRSZXF1ZXN0ID0gTW9iaWxlS2V5SW5wdXRSZXF1ZXN0IHwgTW9iaWxlUG9pbnRlcklucHV0UmVxdWVzdDtcblxuLyoqXG4gKiBBIHRydXN0ZWQga2V5IHByZXNzIHRvIGluamVjdCBvbiBtb2JpbGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9iaWxlS2V5SW5wdXRSZXF1ZXN0IHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgdG8gcHJlc3MsIGluIHRoZSBzYW1lIHNwZWxsaW5nIHRoZSBkZXNrdG9wIHR3aW4gdGFrZXM6IGVpdGhlciBhIG5hbWVkIGtleVxuICAgKiAoYEVudGVyYCwgYEVzY2FwZWAsIGBUYWJgLCBgQmFja3NwYWNlYCwgYERlbGV0ZWAsIGFuIGFycm93KSBvciBhIHNpbmdsZSBwcmludGFibGUgY2hhcmFjdGVyLlxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERpc2NyaW1pbmFudC5cbiAgICovXG4gIHJlYWRvbmx5IGtpbmQ6ICdrZXknO1xuXG4gIC8qKlxuICAgKiBNb2RpZmllcnMgYWxyZWFkeSByZXNvbHZlZCB0byB0aGVpciBwbGF0Zm9ybS1pbmRlcGVuZGVudCBsb3dlcmNhc2UgbmFtZXMgYnkgdGhlIHJlbmRlcmVyJ3NcbiAgICogYHRvRWxlY3Ryb25Nb2RpZmllcnNgIFx1MjAxNCB0aGUgb25lIG1hcHBpbmcgYSBrZXkgcHJlc3MgYW5kIGEgY2xpY2sgc2hhcmUsIHNvIGAnTW9kJ2AgY2Fubm90IG1lYW4gdHdvXG4gICAqIGRpZmZlcmVudCB0aGluZ3MgKCoqTDE3KiopLlxuICAgKi9cbiAgcmVhZG9ubHkgbW9kaWZpZXJzOiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBBIHRydXN0ZWQgcG9pbnRlciBnZXN0dXJlIHRvIGluamVjdCBvbiBtb2JpbGUsIGluIENTUyBwaXhlbHMgd2l0aGluIHRoZSBXZWJWaWV3J3Mgb3duIHZpZXdwb3J0LlxuICpcbiAqIE5vIGRldmljZS1waXhlbCBjb252ZXJzaW9uIGlzIGludm9sdmVkOiBDRFAgdGFrZXMgcGFnZSBjb29yZGluYXRlcywgc28gYGRldmljZVBpeGVsUmF0aW9gIGFuZCB0aGVcbiAqIFdlYlZpZXcncyBvZmZzZXQgdW5kZXIgdGhlIHN0YXR1cyBiYXIgbmV2ZXIgZW50ZXIgdGhlIHBpY3R1cmUgKHRoZXkgd291bGQgZm9yIG5hdGl2ZSBpbmplY3Rpb24pLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vYmlsZVBvaW50ZXJJbnB1dFJlcXVlc3Qge1xuICAvKipcbiAgICogYHRhcGAgaXMgdGhlIHRvdWNoIGFuYWxvZyBvZiBhIGxlZnQgY2xpY2s7IGBsb25nUHJlc3NgIGlzIHRoZSBtb2JpbGUgY29udGV4dC1tZW51IGdlc3R1cmUsIGkuZS4gd2hhdCBhXG4gICAqIGRlc2t0b3AgcmlnaHQgY2xpY2sgbWVhbnMgaGVyZS5cbiAgICovXG4gIHJlYWRvbmx5IGtpbmQ6ICdsb25nUHJlc3MnIHwgJ3RhcCc7XG5cbiAgLyoqXG4gICAqIFNlZSB7QGxpbmsgTW9iaWxlS2V5SW5wdXRSZXF1ZXN0Lm1vZGlmaWVyc30uXG4gICAqL1xuICByZWFkb25seSBtb2RpZmllcnM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgdmlld3BvcnQgeCBjb29yZGluYXRlLCBpbiBDU1MgcGl4ZWxzLlxuICAgKi9cbiAgcmVhZG9ubHkgeDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdmlld3BvcnQgeSBjb29yZGluYXRlLCBpbiBDU1MgcGl4ZWxzLlxuICAgKi9cbiAgcmVhZG9ubHkgeTogbnVtYmVyO1xufVxuXG4vKipcbiAqIEhvdyBsb25nIGEgbG9uZy1wcmVzcyBob2xkcyB0aGUgdG91Y2ggZG93biBiZWZvcmUgcmVsZWFzaW5nIGl0LlxuICpcbiAqIEl0IGhhcyB0byBjbGVhciAqKkFuZHJvaWQncyoqIGxvbmctcHJlc3MgdGhyZXNob2xkLCB3aGljaCBpcyA1MDBtcyBieSBkZWZhdWx0OiB0aGUgZ2VzdHVyZSBpc1xuICogcmVjb2duaXplZCBieSB0aGUgcGxhdGZvcm0sIGFuZCB0aGUgYGNvbnRleHRtZW51YCBPYnNpZGlhbidzIG1lbnVzIGhhbmcgb2ZmIGlzIHdoYXQgdGhlIHJlY29nbml6ZXJcbiAqIGVtaXRzLiA2MDBtcyBjbGVhcnMgdGhhdCB3aXRoIG1hcmdpbiB3aXRob3V0IG1ha2luZyBldmVyeSBsb25nLXByZXNzIHRlc3Qgbm90aWNlYWJseSBzbG93ZXIuXG4gKlxuICogVGhpcyBjb3JyZWN0cyB0aGUgZm9ybWVyIHJlYWRpbmcgXHUyMDE0IHRoYXQgT2JzaWRpYW4gTW9iaWxlIGltcGxlbWVudHMgbG9uZy1wcmVzcyBpdHNlbGYsIG9uIGEgSmF2YVNjcmlwdFxuICogYHRvdWNoc3RhcnRgIHRpbWVyLCBzbyB0aGUgZHdlbGwgb25seSBoYWQgdG8gY2xlYXIgKml0cyogdGhyZXNob2xkLiBNZWFzdXJlZCBhZ2FpbnN0IGEgcmVhbFxuICogYC5uYXYtZmlsZS10aXRsZWAsIGEgNjAwbXMgZHdlbGwgYmV0d2VlbiB0d28gZGlzcGF0Y2hlZCB0b3VjaGVzIG9wZW5lZCB0aGUgbm90ZSBpbnN0ZWFkIG9mIGl0cyBtZW51O1xuICogc2VlIHtAbGluayB0b1BvaW50ZXJDb21tYW5kc30gZm9yIHdoeSB0aGUgZHdlbGwgYWxvbmUgd2FzIG5ldmVyIGdvaW5nIHRvIGJlIGVub3VnaC5cbiAqL1xuY29uc3QgTE9OR19QUkVTU19EV0VMTF9JTl9NSUxMSVNFQ09ORFMgPSA2MDA7XG5cbmNvbnN0IE5PX01PRElGSUVSUyA9IDA7XG5jb25zdCBNT0RJRklFUl9CSVRfQUxUID0gMTtcbmNvbnN0IE1PRElGSUVSX0JJVF9DT05UUk9MID0gMjtcbmNvbnN0IE1PRElGSUVSX0JJVF9NRVRBID0gNDtcbmNvbnN0IE1PRElGSUVSX0JJVF9TSElGVCA9IDg7XG5cbi8qKlxuICogQ0RQJ3MgbW9kaWZpZXIgYml0bWFzaywgd2hpY2ggaXMgbm90IHRoZSBzYW1lIHNwZWxsaW5nIGFzIEVsZWN0cm9uJ3Mgc3RyaW5nIGxpc3QuXG4gKlxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9jaHJvbWVkZXZ0b29scy5naXRodWIuaW8vZGV2dG9vbHMtcHJvdG9jb2wvdG90L0lucHV0LyNtZXRob2QtZGlzcGF0Y2hLZXlFdmVudH1cbiAqL1xuY29uc3QgQ0RQX01PRElGSUVSX0JJVF9CWV9OQU1FID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oW1xuICBbJ2FsdCcsIE1PRElGSUVSX0JJVF9BTFRdLFxuICBbJ2NvbnRyb2wnLCBNT0RJRklFUl9CSVRfQ09OVFJPTF0sXG4gIFsnbWV0YScsIE1PRElGSUVSX0JJVF9NRVRBXSxcbiAgWydzaGlmdCcsIE1PRElGSUVSX0JJVF9TSElGVF1cbl0pO1xuXG5jb25zdCBLRVlfQ09ERV9CQUNLU1BBQ0UgPSA4O1xuY29uc3QgS0VZX0NPREVfVEFCID0gOTtcbmNvbnN0IEtFWV9DT0RFX0VOVEVSID0gMTM7XG5jb25zdCBLRVlfQ09ERV9FU0NBUEUgPSAyNztcbmNvbnN0IEtFWV9DT0RFX0FSUk9XX0xFRlQgPSAzNztcbmNvbnN0IEtFWV9DT0RFX0FSUk9XX1VQID0gMzg7XG5jb25zdCBLRVlfQ09ERV9BUlJPV19SSUdIVCA9IDM5O1xuY29uc3QgS0VZX0NPREVfQVJST1dfRE9XTiA9IDQwO1xuY29uc3QgS0VZX0NPREVfREVMRVRFID0gNDY7XG5cbi8qKlxuICogTmFtZWQga2V5cywgd2l0aCB0aGUgYHRleHRgIGEgcmVhbCBrZXkgcHJlc3Mgd291bGQgcHJvZHVjZSAoYWJzZW50IHdoZW4gaXQgcHJvZHVjZXMgbm9uZSkuXG4gKlxuICogT25seSBrZXlzIHRoZXNlIHN1aXRlcyBhY3R1YWxseSBwcmVzcyBhcmUgbGlzdGVkLCBwbHVzIHRoZSBlZGl0aW5nIGtleXMgYSBjYWxsZXIgd291bGQgcmVhc29uYWJseSByZWFjaFxuICogZm9yIG5leHQuIEFuIHVua25vd24gbXVsdGktY2hhcmFjdGVyIGtleSBpcyBhIGNhbGxlciBlcnJvciwgbm90IGEgc2lsZW50IG5vLW9wIFx1MjAxNCBzZWVcbiAqIHtAbGluayB0b0tleUNvbW1hbmRzfS5cbiAqL1xuY29uc3QgTkFNRURfS0VZUyA9IG5ldyBNYXA8c3RyaW5nLCBOYW1lZEtleT4oW1xuICBbJ0Fycm93RG93bicsIHsgY29kZTogJ0Fycm93RG93bicsIHdpbmRvd3NWaXJ0dWFsS2V5Q29kZTogS0VZX0NPREVfQVJST1dfRE9XTiB9XSxcbiAgWydBcnJvd0xlZnQnLCB7IGNvZGU6ICdBcnJvd0xlZnQnLCB3aW5kb3dzVmlydHVhbEtleUNvZGU6IEtFWV9DT0RFX0FSUk9XX0xFRlQgfV0sXG4gIFsnQXJyb3dSaWdodCcsIHsgY29kZTogJ0Fycm93UmlnaHQnLCB3aW5kb3dzVmlydHVhbEtleUNvZGU6IEtFWV9DT0RFX0FSUk9XX1JJR0hUIH1dLFxuICBbJ0Fycm93VXAnLCB7IGNvZGU6ICdBcnJvd1VwJywgd2luZG93c1ZpcnR1YWxLZXlDb2RlOiBLRVlfQ09ERV9BUlJPV19VUCB9XSxcbiAgWydCYWNrc3BhY2UnLCB7IGNvZGU6ICdCYWNrc3BhY2UnLCB3aW5kb3dzVmlydHVhbEtleUNvZGU6IEtFWV9DT0RFX0JBQ0tTUEFDRSB9XSxcbiAgWydEZWxldGUnLCB7IGNvZGU6ICdEZWxldGUnLCB3aW5kb3dzVmlydHVhbEtleUNvZGU6IEtFWV9DT0RFX0RFTEVURSB9XSxcbiAgWydFbnRlcicsIHsgY29kZTogJ0VudGVyJywgdGV4dDogJ1xccicsIHdpbmRvd3NWaXJ0dWFsS2V5Q29kZTogS0VZX0NPREVfRU5URVIgfV0sXG4gIFsnRXNjYXBlJywgeyBjb2RlOiAnRXNjYXBlJywgd2luZG93c1ZpcnR1YWxLZXlDb2RlOiBLRVlfQ09ERV9FU0NBUEUgfV0sXG4gIFsnVGFiJywgeyBjb2RlOiAnVGFiJywgdGV4dDogJ1xcdCcsIHdpbmRvd3NWaXJ0dWFsS2V5Q29kZTogS0VZX0NPREVfVEFCIH1dXG5dKTtcblxuY29uc3QgRklSU1RfQ09ERV9QT0lOVF9JTkRFWCA9IDA7XG5jb25zdCBESUdJVF9aRVJPX0NPREVfUE9JTlQgPSBjb2RlUG9pbnRPZignMCcpO1xuY29uc3QgRElHSVRfTklORV9DT0RFX1BPSU5UID0gY29kZVBvaW50T2YoJzknKTtcbmNvbnN0IFVQUEVSQ0FTRV9BX0NPREVfUE9JTlQgPSBjb2RlUG9pbnRPZignQScpO1xuY29uc3QgVVBQRVJDQVNFX1pfQ09ERV9QT0lOVCA9IGNvZGVQb2ludE9mKCdaJyk7XG5cbi8qKlxuICogVGhlIENEUCBzcGVsbGluZyBvZiBvbmUgbmFtZWQga2V5LlxuICovXG5pbnRlcmZhY2UgTmFtZWRLZXkge1xuICByZWFkb25seSBjb2RlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRleHQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHdpbmRvd3NWaXJ0dWFsS2V5Q29kZTogbnVtYmVyO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgZXhwcmVzc2lvbiB0aGUgaG9zdCBldmFsdWF0ZXMgdG8gYW5zd2VyIG9uZSBpbnB1dCByZXF1ZXN0LlxuICpcbiAqIE9wdGlvbmFsIGNoYWluaW5nIHRocm91Z2hvdXQ6IGJ5IHRoZSB0aW1lIHRoZSBob3N0IGFuc3dlcnMsIHRoZSBwYWdlIG1heSBoYXZlIG5hdmlnYXRlZCBhbmQgZHJvcHBlZCB0aGVcbiAqIG5hbWVzcGFjZSwgYW5kIGEgYFR5cGVFcnJvcmAgaW5zaWRlIHRoaXMgZXZhbHVhdGUgd291bGQgYmUgcmVwb3J0ZWQgYXMgYW4gaW5qZWN0aW9uIGZhaWx1cmUgdGhhdCBhbHJlYWR5XG4gKiBzdWNjZWVkZWQuXG4gKlxuICogQHBhcmFtIGlkIC0gVGhlIHJlcXVlc3QgaWQgdGhlIHJlbmRlcmVyIGlzIHdhaXRpbmcgb24uXG4gKiBAcGFyYW0gZXJyb3JNZXNzYWdlIC0gV2h5IHRoZSBpbmplY3Rpb24gZmFpbGVkLCB3aGVuIGl0IGRpZC4gT21pdCBvbiBzdWNjZXNzLlxuICogQHJldHVybnMgQSBzZWxmLWNvbnRhaW5lZCBleHByZXNzaW9uIHRvIHBhc3MgdG8gYFJ1bnRpbWUuZXZhbHVhdGVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRSZXNvbHZlSW5wdXRFeHByZXNzaW9uKGlkOiBzdHJpbmcsIGVycm9yTWVzc2FnZT86IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3Rpbmc/LnJlc29sdmVJbnB1dD8uKCR7SlNPTi5zdHJpbmdpZnkoaWQpfSwgJHtKU09OLnN0cmluZ2lmeShlcnJvck1lc3NhZ2UgPz8gbnVsbCl9KWA7XG59XG5cbi8qKlxuICogVGhlIGZpcnN0IGNvZGUgcG9pbnQgb2YgYSBub24tZW1wdHkgc3RyaW5nLlxuICpcbiAqIGBTdHJpbmcucHJvdG90eXBlLmNvZGVQb2ludEF0YCBpcyB0eXBlZCBgbnVtYmVyIHwgdW5kZWZpbmVkYCwgc28gZXZlcnkgY2FsbCBzaXRlIHdvdWxkIG90aGVyd2lzZSBjYXJyeSBhXG4gKiBgPz8gZmFsbGJhY2tgIHRoYXQgbm8gaW5wdXQgY2FuIGV2ZXIgcmVhY2ggXHUyMDE0IGEgZGVhZCBicmFuY2ggdW5kZXIgdGhlIDEwMCUgY292ZXJhZ2UgZ2F0ZS4gVGhyb3dpbmcgaGVyZVxuICoga2VlcHMgdGhhdCBpbXBvc3NpYmxlIGNhc2UgaW4gT05FIHBsYWNlLCB3aGVyZSBhIHVuaXQgdGVzdCBjYW4gcmVhY2ggaXQgZGlyZWN0bHksIGluc3RlYWQgb2Ygc3ByZWFkaW5nXG4gKiB1bnJlYWNoYWJsZSBmYWxsYmFja3MgKG9yIGNvdmVyYWdlIHN1cHByZXNzaW9ucykgYWNyb3NzIHRoZSBtb2R1bGUuXG4gKlxuICogQHBhcmFtIHRleHQgLSBBIG5vbi1lbXB0eSBzdHJpbmcuXG4gKiBAcmV0dXJucyBJdHMgZmlyc3QgY29kZSBwb2ludC5cbiAqIEB0aHJvd3MgV2hlbiBgdGV4dGAgaXMgZW1wdHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2RlUG9pbnRPZih0ZXh0OiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBjb2RlUG9pbnQgPSB0ZXh0LmNvZGVQb2ludEF0KEZJUlNUX0NPREVfUE9JTlRfSU5ERVgpO1xuICBpZiAoY29kZVBvaW50ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvZGVQb2ludE9mIHJlY2VpdmVkIGFuIGVtcHR5IHN0cmluZy4nKTtcbiAgfVxuXG4gIHJldHVybiBjb2RlUG9pbnQ7XG59XG5cbi8qKlxuICogVHJhbnNsYXRlcyBhIG1vYmlsZSBpbnB1dCByZXF1ZXN0IGludG8gdGhlIG9yZGVyZWQgQ0RQIGNvbW1hbmRzIHRoYXQgcmVhbGl6ZSBpdC5cbiAqXG4gKiBAcGFyYW0gcmVxdWVzdCAtIFdoYXQgdGhlIHJlbmRlcmVyIGFza2VkIHRoZSBob3N0IHRvIGluamVjdC5cbiAqIEByZXR1cm5zIFRoZSBjb21tYW5kcyB0byBzZW5kLCBpbiBvcmRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvQ2RwSW5wdXRDb21tYW5kcyhyZXF1ZXN0OiBNb2JpbGVJbnB1dFJlcXVlc3QpOiBDZHBJbnB1dENvbW1hbmRbXSB7XG4gIGlmIChyZXF1ZXN0LmtpbmQgPT09ICdrZXknKSB7XG4gICAgcmV0dXJuIHRvS2V5Q29tbWFuZHMocmVxdWVzdCk7XG4gIH1cblxuICByZXR1cm4gdG9Qb2ludGVyQ29tbWFuZHMocmVxdWVzdCk7XG59XG5cbi8qKlxuICogRm9sZHMgcmVzb2x2ZWQgbW9kaWZpZXIgbmFtZXMgaW50byBDRFAncyBiaXRtYXNrLlxuICpcbiAqIFVua25vd24gbmFtZXMgYXJlIGlnbm9yZWQgcmF0aGVyIHRoYW4gdGhyb3dpbmc6IHRoZSByZW5kZXJlcidzIGB0b0VsZWN0cm9uTW9kaWZpZXJzYCBpcyBleGhhdXN0aXZlIG92ZXJcbiAqIE9ic2lkaWFuJ3MgYE1vZGlmaWVyYCB1bmlvbiwgc28gYW4gdW5rbm93biBuYW1lIGhlcmUgd291bGQgbWVhbiB0aGUgdHdvIGNvcGllcyBoYXZlIGFscmVhZHkgZHJpZnRlZCwgYW5kXG4gKiBmYWlsaW5nIHRoZSB3aG9sZSBnZXN0dXJlIGlzIGEgd29yc2Ugb3V0Y29tZSB0aGFuIHByZXNzaW5nIGl0IHVubW9kaWZpZWQuXG4gKlxuICogQHBhcmFtIG1vZGlmaWVycyAtIFJlc29sdmVkIGxvd2VyY2FzZSBtb2RpZmllciBuYW1lcy5cbiAqIEByZXR1cm5zIFRoZSBDRFAgbW9kaWZpZXIgYml0bWFzay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvQ2RwTW9kaWZpZXJzKG1vZGlmaWVyczogcmVhZG9ubHkgc3RyaW5nW10pOiBudW1iZXIge1xuICAvLyBTdW1taW5nIERJU1RJTkNUIGJpdHMgZXF1YWxzIE9SLWluZyB0aGVtLCBhbmQgdGhlIGBTZXRgIGlzIHdoYXQgbWFrZXMgdGhhdCBob2xkIGV2ZW4gd2hlbiBhIGNhbGxlclxuICAvLyBQYXNzZXMgdGhlIHNhbWUgbW9kaWZpZXIgdHdpY2UgXHUyMDE0IHNvIHRoZSBtYXNrIGlzIGJ1aWx0IHdpdGhvdXQgYSBiaXR3aXNlIG9wZXJhdG9yLlxuICBjb25zdCBiaXRzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gIGZvciAoY29uc3QgbW9kaWZpZXIgb2YgbW9kaWZpZXJzKSB7XG4gICAgY29uc3QgYml0ID0gQ0RQX01PRElGSUVSX0JJVF9CWV9OQU1FLmdldChtb2RpZmllcik7XG4gICAgaWYgKGJpdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBiaXRzLmFkZChiaXQpO1xuICAgIH1cbiAgfVxuXG4gIGxldCBiaXRtYXNrID0gTk9fTU9ESUZJRVJTO1xuICBmb3IgKGNvbnN0IGJpdCBvZiBiaXRzKSB7XG4gICAgYml0bWFzayArPSBiaXQ7XG4gIH1cblxuICByZXR1cm4gYml0bWFzaztcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBhIGtleSBuYW1lIHRvIGl0cyBDRFAgc3BlbGxpbmcuXG4gKlxuICogQHBhcmFtIGtleSAtIEEgbmFtZWQga2V5IG9yIGEgc2luZ2xlIHByaW50YWJsZSBjaGFyYWN0ZXIuXG4gKiBAcmV0dXJucyBUaGUgQ0RQIHNwZWxsaW5nLlxuICovXG5mdW5jdGlvbiByZXNvbHZlS2V5KGtleTogc3RyaW5nKTogTmFtZWRLZXkge1xuICBjb25zdCBuYW1lZEtleSA9IE5BTUVEX0tFWVMuZ2V0KGtleSk7XG4gIGlmIChuYW1lZEtleSkge1xuICAgIHJldHVybiBuYW1lZEtleTtcbiAgfVxuXG4gIC8vIFwiRXhhY3RseSBvbmUgY29kZSBwb2ludFwiLCB0ZXN0ZWQgd2l0aG91dCBzcGxpdHRpbmcgdGhlIHN0cmluZzogYGZyb21Db2RlUG9pbnRgIHJvdW5kLXRyaXBzIG9ubHkgd2hlblxuICAvLyBga2V5YCBpcyB0aGF0IHNpbmdsZSBjb2RlIHBvaW50LCBzbyBhbiBhc3RyYWwtcGxhbmUgY2hhcmFjdGVyIGNvdW50cyBhcyBvbmUgYW5kIGAnQ3RybCtLJ2AgZG9lcyBub3QuXG4gIGNvbnN0IGNvZGVQb2ludCA9IGtleS5jb2RlUG9pbnRBdChGSVJTVF9DT0RFX1BPSU5UX0lOREVYKTtcbiAgaWYgKGNvZGVQb2ludCA9PT0gdW5kZWZpbmVkIHx8IFN0cmluZy5mcm9tQ29kZVBvaW50KGNvZGVQb2ludCkgIT09IGtleSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBwcmVzc0tleSByZWNlaXZlZCBhbiB1bmtub3duIGtleSBuYW1lIG9uIG1vYmlsZTogJHtKU09OLnN0cmluZ2lmeShrZXkpfS4gYFxuICAgICAgICArIGBQYXNzIGEgc2luZ2xlIGNoYXJhY3RlciBvciBvbmUgb2Y6ICR7Wy4uLk5BTUVEX0tFWVMua2V5cygpXS5qb2luKCcsICcpfS5gXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHVwcGVyQ2FzZWRDb2RlUG9pbnQgPSBjb2RlUG9pbnRPZihrZXkudG9VcHBlckNhc2UoKSk7XG4gIHJldHVybiB7XG4gICAgY29kZTogcmVzb2x2ZUtleUNvZGUodXBwZXJDYXNlZENvZGVQb2ludCksXG4gICAgdGV4dDoga2V5LFxuICAgIHdpbmRvd3NWaXJ0dWFsS2V5Q29kZTogdXBwZXJDYXNlZENvZGVQb2ludFxuICB9O1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBwaHlzaWNhbCBgY29kZWAgZm9yIGEgcHJpbnRhYmxlIGNoYXJhY3Rlci5cbiAqXG4gKiBDaGFyYWN0ZXJzIG91dHNpZGUgdGhlIEFTQ0lJIGxldHRlci9kaWdpdCByb3dzIGhhdmUgbm8gc3RhYmxlIHBoeXNpY2FsIGtleSwgc28gdGhleSBnZXQgYW4gZW1wdHlcbiAqIGBjb2RlYCBcdTIwMTQgdGhlIGB0ZXh0YCBzdGlsbCBjYXJyaWVzIHRoZW0sIHdoaWNoIGlzIHdoYXQgYW4gZWRpdG9yIHJlYWRzLlxuICpcbiAqIEBwYXJhbSB1cHBlckNhc2VkQ29kZVBvaW50IC0gVGhlIGNoYXJhY3RlcidzIHVwcGVyLWNhc2VkIGNvZGUgcG9pbnQuXG4gKiBAcmV0dXJucyBUaGUgQ0RQIGBjb2RlYCwgb3IgYW4gZW1wdHkgc3RyaW5nIHdoZW4gdGhlcmUgaXMgbm8gc3RhYmxlIG9uZS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUtleUNvZGUodXBwZXJDYXNlZENvZGVQb2ludDogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKHVwcGVyQ2FzZWRDb2RlUG9pbnQgPj0gVVBQRVJDQVNFX0FfQ09ERV9QT0lOVCAmJiB1cHBlckNhc2VkQ29kZVBvaW50IDw9IFVQUEVSQ0FTRV9aX0NPREVfUE9JTlQpIHtcbiAgICByZXR1cm4gYEtleSR7U3RyaW5nLmZyb21Db2RlUG9pbnQodXBwZXJDYXNlZENvZGVQb2ludCl9YDtcbiAgfVxuXG4gIGlmICh1cHBlckNhc2VkQ29kZVBvaW50ID49IERJR0lUX1pFUk9fQ09ERV9QT0lOVCAmJiB1cHBlckNhc2VkQ29kZVBvaW50IDw9IERJR0lUX05JTkVfQ09ERV9QT0lOVCkge1xuICAgIHJldHVybiBgRGlnaXQke1N0cmluZy5mcm9tQ29kZVBvaW50KHVwcGVyQ2FzZWRDb2RlUG9pbnQpfWA7XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBjb21tYW5kIHNlcXVlbmNlIGZvciBhIGtleSBwcmVzcy5cbiAqXG4gKiBNaXJyb3JzIHRoZSBkZXNrdG9wIHR3aW4ncyB0cnVzdGVkIGBrZXlEb3duYCBcdTIxOTIgYGNoYXJgIFx1MjE5MiBga2V5VXBgIGluIENEUCdzIHNwZWxsaW5nOiBgcmF3S2V5RG93bmAgZmlyZXNcbiAqIGBrZXlkb3duYCBhbG9uZSwgYGNoYXJgIGZpcmVzIGBrZXlwcmVzc2AgLyBgYmVmb3JlaW5wdXRgIC8gYGlucHV0YCwgYGtleVVwYCBmaXJlcyBga2V5dXBgLiBBIGtleSB0aGF0XG4gKiBwcm9kdWNlcyBubyB0ZXh0IChgRXNjYXBlYCkgc2tpcHMgdGhlIGBjaGFyYCwgZXhhY3RseSBhcyBhIHJlYWwgb25lIGRvZXMuXG4gKlxuICogQHBhcmFtIHJlcXVlc3QgLSBUaGUga2V5IHJlcXVlc3QuXG4gKiBAcmV0dXJucyBUaGUgY29tbWFuZHMgdG8gc2VuZCwgaW4gb3JkZXIuXG4gKi9cbmZ1bmN0aW9uIHRvS2V5Q29tbWFuZHMocmVxdWVzdDogTW9iaWxlS2V5SW5wdXRSZXF1ZXN0KTogQ2RwSW5wdXRDb21tYW5kW10ge1xuICBjb25zdCB7IGNvZGUsIHRleHQsIHdpbmRvd3NWaXJ0dWFsS2V5Q29kZSB9ID0gcmVzb2x2ZUtleShyZXF1ZXN0LmtleSk7XG4gIGNvbnN0IG1vZGlmaWVycyA9IHRvQ2RwTW9kaWZpZXJzKHJlcXVlc3QubW9kaWZpZXJzKTtcbiAgY29uc3QgYmFzZSA9IHsgY29kZSwga2V5OiByZXF1ZXN0LmtleSwgbW9kaWZpZXJzLCB3aW5kb3dzVmlydHVhbEtleUNvZGUgfTtcblxuICBjb25zdCBjb21tYW5kczogQ2RwSW5wdXRDb21tYW5kW10gPSBbXG4gICAgeyBtZXRob2Q6ICdJbnB1dC5kaXNwYXRjaEtleUV2ZW50JywgcGFyYW1zOiB7IC4uLmJhc2UsIHR5cGU6ICdyYXdLZXlEb3duJyB9IH1cbiAgXTtcblxuICBpZiAodGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29tbWFuZHMucHVzaCh7IG1ldGhvZDogJ0lucHV0LmRpc3BhdGNoS2V5RXZlbnQnLCBwYXJhbXM6IHsgLi4uYmFzZSwgdGV4dCwgdHlwZTogJ2NoYXInIH0gfSk7XG4gIH1cblxuICBjb21tYW5kcy5wdXNoKHsgbWV0aG9kOiAnSW5wdXQuZGlzcGF0Y2hLZXlFdmVudCcsIHBhcmFtczogeyAuLi5iYXNlLCB0eXBlOiAna2V5VXAnIH0gfSk7XG5cbiAgcmV0dXJuIGNvbW1hbmRzO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgY29tbWFuZCBzZXF1ZW5jZSBmb3IgYSB0YXAgb3IgYSBsb25nLXByZXNzLlxuICpcbiAqICoqVGhlIHR3byBnZXN0dXJlcyB0YWtlIGRpZmZlcmVudCBDRFAgcm91dGVzLCBhbmQgdGhhdCBhc3ltbWV0cnkgaXMgdGhlIHdob2xlIHBvaW50LioqXG4gKlxuICogQSB0YXAgaXMgYSB0cnVzdGVkIHRvdWNoIHBhaXIsIHdoaWNoIGlzIGFsbCBDaHJvbWl1bSBuZWVkcyBcdTIwMTQgaXQgc3ludGhlc2l6ZXMgYHBvaW50ZXJkb3duYCAvXG4gKiBgdG91Y2hzdGFydGAgLyBgcG9pbnRlcnVwYCAvIGB0b3VjaGVuZGAgLyBgY2xpY2tgIGZyb20gaXQsIGV2ZXJ5IG9uZSBgaXNUcnVzdGVkYC4gVGhlIHJlbGVhc2UgY2Fycmllc1xuICogYW4gZW1wdHkgYHRvdWNoUG9pbnRzYCBsaXN0LCB3aGljaCBpcyBDRFAncyBzcGVsbGluZyBmb3IgXCJhbGwgZmluZ2VycyBsaWZ0ZWRcIi5cbiAqXG4gKiBBIGxvbmctcHJlc3MgY2Fubm90IGJlIHRoYXQgc2FtZSBwYWlyIGhlbGQgYXBhcnQgYnkgYSBkd2VsbCwgYmVjYXVzZSBgSW5wdXQuZGlzcGF0Y2hUb3VjaEV2ZW50YCBpbmplY3RzXG4gKiBhIGBXZWJUb3VjaEV2ZW50YCAqKnBhc3QqKiBBbmRyb2lkJ3MgZ2VzdHVyZSByZWNvZ25pemVyOiBubyByZWNvZ25pemVyIHNlZXMgdGhlIGhvbGQsIHNvIG5vIGxvbmctcHJlc3NcbiAqIGdlc3R1cmUgaXMgZXZlciBwcm9kdWNlZCBhbmQgdGhlIHBhaXIgaXMgY2xhc3NpZmllZCBhcyBhIHRhcCBob3dldmVyIGxvbmcgdGhlIGR3ZWxsIGlzLlxuICogYElucHV0LnN5bnRoZXNpemVUYXBHZXN0dXJlYCBpbnN0ZWFkIGdvZXMgdGhyb3VnaCBDaHJvbWl1bSdzIHN5bnRoZXRpYy1nZXN0dXJlIGNvbnRyb2xsZXIsIHdoaWNoIGJ1aWxkc1xuICogcmVhbCBgTW90aW9uRXZlbnRgcyBhbmQgZmVlZHMgdGhlbSB0byB0aGUgcGxhdGZvcm0gcmVjb2duaXplciBcdTIwMTQgdGhlIHN0ZXAgdGhlIGRpc3BhdGNoIHJvdXRlIHNraXBzLlxuICpcbiAqIE1lYXN1cmVkIG9uIGEgbGl2ZSBlbXVsYXRvciAoMjAyNi0wOS0wOCk6IHRoZSBkaXNwYXRjaCBwYWlyIHdpdGggYSA2MDBtcyBkd2VsbCwgYWltZWQgYXQgYSAqKnJlYWwqKlxuICogYC5uYXYtZmlsZS10aXRsZWAgaW4gdGhlIGZpbGUgZXhwbG9yZXIsIHByb2R1Y2VkIGBwb2ludGVyZG93bmAgLyBgdG91Y2hzdGFydGAgLyBgdG91Y2hlbmRgIC8gYGNsaWNrYCBhbmRcbiAqICoqb3BlbmVkIHRoZSBub3RlKiogXHUyMDE0IGEgdGFwLiBObyBgY29udGV4dG1lbnVgLCBhbmQgbm8gT2JzaWRpYW4gbWVudS5cbiAqXG4gKiBAcGFyYW0gcmVxdWVzdCAtIFRoZSBwb2ludGVyIHJlcXVlc3QuXG4gKiBAcmV0dXJucyBUaGUgY29tbWFuZHMgdG8gc2VuZCwgaW4gb3JkZXIuXG4gKi9cbmZ1bmN0aW9uIHRvUG9pbnRlckNvbW1hbmRzKHJlcXVlc3Q6IE1vYmlsZVBvaW50ZXJJbnB1dFJlcXVlc3QpOiBDZHBJbnB1dENvbW1hbmRbXSB7XG4gIGNvbnN0IG1vZGlmaWVycyA9IHRvQ2RwTW9kaWZpZXJzKHJlcXVlc3QubW9kaWZpZXJzKTtcblxuICBpZiAocmVxdWVzdC5raW5kID09PSAnbG9uZ1ByZXNzJykge1xuICAgIC8vIGBzeW50aGVzaXplVGFwR2VzdHVyZWAgdGFrZXMgbm8gbW9kaWZpZXIgYml0bWFzayBcdTIwMTQgQ0RQJ3MgZ2VzdHVyZSBBUEkgaGFzIG5vIHBhcmFtZXRlciBmb3Igb25lIFx1MjAxNCBhbmRcbiAgICAvLyBBIHRvdWNoIHNjcmVlbiBoYXMgbm8gbW9kaWZpZXIga2V5cyB0byBob2xkIGR1cmluZyBhIHByZXNzLCBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIGNhcnJ5IGhlcmUuXG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgbWV0aG9kOiAnSW5wdXQuc3ludGhlc2l6ZVRhcEdlc3R1cmUnLFxuICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICBkdXJhdGlvbjogTE9OR19QUkVTU19EV0VMTF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICAgICAgZ2VzdHVyZVNvdXJjZVR5cGU6ICd0b3VjaCcsXG4gICAgICAgICAgeDogcmVxdWVzdC54LFxuICAgICAgICAgIHk6IHJlcXVlc3QueVxuICAgICAgICB9XG4gICAgICB9XG4gICAgXTtcbiAgfVxuXG4gIHJldHVybiBbXG4gICAge1xuICAgICAgbWV0aG9kOiAnSW5wdXQuZGlzcGF0Y2hUb3VjaEV2ZW50JyxcbiAgICAgIHBhcmFtczogeyBtb2RpZmllcnMsIHRvdWNoUG9pbnRzOiBbeyB4OiByZXF1ZXN0LngsIHk6IHJlcXVlc3QueSB9XSwgdHlwZTogJ3RvdWNoU3RhcnQnIH1cbiAgICB9LFxuICAgIHtcbiAgICAgIG1ldGhvZDogJ0lucHV0LmRpc3BhdGNoVG91Y2hFdmVudCcsXG4gICAgICBwYXJhbXM6IHsgbW9kaWZpZXJzLCB0b3VjaFBvaW50czogW10sIHR5cGU6ICd0b3VjaEVuZCcgfVxuICAgIH1cbiAgXTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBc0JPLE1BQU0sNEJBQTRCO0FBU2xDLE1BQU0sdUNBQXVDO0FBNkdwRCxNQUFNLG1DQUFtQztBQUV6QyxNQUFNLGVBQWU7QUFDckIsTUFBTSxtQkFBbUI7QUFDekIsTUFBTSx1QkFBdUI7QUFDN0IsTUFBTSxvQkFBb0I7QUFDMUIsTUFBTSxxQkFBcUI7QUFPM0IsTUFBTSwyQkFBMkIsb0JBQUksSUFBb0I7QUFBQSxFQUN2RCxDQUFDLE9BQU8sZ0JBQWdCO0FBQUEsRUFDeEIsQ0FBQyxXQUFXLG9CQUFvQjtBQUFBLEVBQ2hDLENBQUMsUUFBUSxpQkFBaUI7QUFBQSxFQUMxQixDQUFDLFNBQVMsa0JBQWtCO0FBQzlCLENBQUM7QUFFRCxNQUFNLHFCQUFxQjtBQUMzQixNQUFNLGVBQWU7QUFDckIsTUFBTSxpQkFBaUI7QUFDdkIsTUFBTSxrQkFBa0I7QUFDeEIsTUFBTSxzQkFBc0I7QUFDNUIsTUFBTSxvQkFBb0I7QUFDMUIsTUFBTSx1QkFBdUI7QUFDN0IsTUFBTSxzQkFBc0I7QUFDNUIsTUFBTSxrQkFBa0I7QUFTeEIsTUFBTSxhQUFhLG9CQUFJLElBQXNCO0FBQUEsRUFDM0MsQ0FBQyxhQUFhLEVBQUUsTUFBTSxhQUFhLHVCQUF1QixvQkFBb0IsQ0FBQztBQUFBLEVBQy9FLENBQUMsYUFBYSxFQUFFLE1BQU0sYUFBYSx1QkFBdUIsb0JBQW9CLENBQUM7QUFBQSxFQUMvRSxDQUFDLGNBQWMsRUFBRSxNQUFNLGNBQWMsdUJBQXVCLHFCQUFxQixDQUFDO0FBQUEsRUFDbEYsQ0FBQyxXQUFXLEVBQUUsTUFBTSxXQUFXLHVCQUF1QixrQkFBa0IsQ0FBQztBQUFBLEVBQ3pFLENBQUMsYUFBYSxFQUFFLE1BQU0sYUFBYSx1QkFBdUIsbUJBQW1C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
186
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL21vYmlsZS1pbnB1dC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRyYW5zbGF0ZXMgYSBtb2JpbGUgdHJ1c3RlZC1pbnB1dCByZXF1ZXN0IGludG8gdGhlIG9yZGVyZWQgQ2hyb21lIERldlRvb2xzIFByb3RvY29sIGBJbnB1dC4qYCBjb21tYW5kc1xuICogdGhhdCByZWFsaXplIGl0IChzZWUgKipMMzkqKikuXG4gKlxuICogUHVyZSBhbmQgc3luY2hyb25vdXMgYnkgZGVzaWduOiB0aGUgV2ViVmlldyBjb25uZWN0aW9uICh7QGxpbmsgV2ViVmlld0NkcENvbm5lY3Rpb259KSBzZW5kcyB3aGF0ZXZlciB0aGlzXG4gKiByZXR1cm5zLCBzbyBldmVyeSBkZWNpc2lvbiB0aGF0IGlzIHdvcnRoIGEgdGVzdCBcdTIwMTQgdGhlIHRvdWNoIHBhaXIgYSB0YXAgZXhwYW5kcyBpbnRvLCB0aGUgZHdlbGwgYVxuICogbG9uZy1wcmVzcyBhZGRzLCB0aGUgYHJhd0tleURvd25gIFx1MjE5MiBgY2hhcmAgXHUyMTkyIGBrZXlVcGAgc2hhcGUgYSBrZXkgcHJlc3MgbWlycm9ycyBmcm9tIHRoZSBkZXNrdG9wIHR3aW4sIHRoZVxuICogbW9kaWZpZXIgYml0bWFzayBcdTIwMTQgbGl2ZXMgaGVyZSByYXRoZXIgdGhhbiBpbnNpZGUgdGhlIHRyYW5zcG9ydCdzIEkvTyBwYXRoLlxuICpcbiAqIFRoZSByZXF1ZXN0IHRyYXZlbHMgcmVuZGVyZXIgXHUyMTkyIGhvc3QgYXMgSlNPTiAodGhlIHJlbmRlcmVyIGNvbXB1dGVzIHRoZSBjb29yZGluYXRlcywgYmVjYXVzZSBvbmx5IGl0IGNhblxuICogc2VlIHRoZSBET00pLCBzbyBib3RoIHRoZSByZXF1ZXN0IGFuZCB0aGUgY29tbWFuZCBzaGFwZXMgYXJlIGRlbGliZXJhdGVseSBwbGFpbiBkYXRhLlxuICovXG5cbi8qKlxuICogVGhlIG5hbWUgb2YgdGhlIGBSdW50aW1lLmFkZEJpbmRpbmdgIGZ1bmN0aW9uIHRoZSBob3N0IGV4cG9zZXMgb24gdGhlIHBhZ2Ugc28gdGhlIHJlbmRlcmVyIGNhbiBoYW5kIGl0IGFuXG4gKiBpbnB1dCByZXF1ZXN0IG1pZC1jbG9zdXJlLlxuICpcbiAqIEl0IGlzIHBhc3NlZCAqaW50byogdGhlIHNlcmlhbGl6ZWQgYm9vdHN0cmFwIGNsb3N1cmUgYXMgZGF0YSByYXRoZXIgdGhhbiByZWZlcmVuY2VkIGZyb20gaXQsIGJlY2F1c2UgdGhhdFxuICogY2xvc3VyZSBtYXkgbm90IHJlYWQgb3V0ZXIgc2NvcGUgKCoqTDE1KiopIFx1MjAxNCBzbyB0aGlzIHN0YXlzIHRoZSBzaW5nbGUgZGVmaW5pdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IE1PQklMRV9JTlBVVF9CSU5ESU5HX05BTUUgPSAnX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZ0lucHV0JztcblxuLyoqXG4gKiBIb3cgbG9uZyB0aGUgcmVuZGVyZXIgd2FpdHMgZm9yIHRoZSBob3N0IHRvIHNlcnZpY2Ugb25lIGlucHV0IHJlcXVlc3QgYmVmb3JlIGdpdmluZyB1cC5cbiAqXG4gKiBHZW5lcm91cyByZWxhdGl2ZSB0byB0aGUgd29yayAoYSB0YXAgaXMgdHdvIENEUCBjb21tYW5kczsgYSBsb25nLXByZXNzIGFkZHMgYSA2MDBtcyBkd2VsbCk6IHRoZSBwb2ludCBpc1xuICogdG8gZmFpbCB3aXRoIGEgbGVnaWJsZSBlcnJvciByYXRoZXIgdGhhbiBoYW5nIHRoZSBjbG9zdXJlIHVudGlsIHRoZSB3aG9sZSBydW4gdGltZXMgb3V0LiBQYXNzZWQgaW50byB0aGVcbiAqIGJvb3RzdHJhcCBjbG9zdXJlIGFzIGRhdGEsIGZvciB0aGUgc2FtZSByZWFzb24gYXMge0BsaW5rIE1PQklMRV9JTlBVVF9CSU5ESU5HX05BTUV9LlxuICovXG5leHBvcnQgY29uc3QgTU9CSUxFX0lOUFVUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTVfMDAwO1xuXG4vKipcbiAqIEEgc2luZ2xlIENocm9tZSBEZXZUb29scyBQcm90b2NvbCBjb21tYW5kLlxuICpcbiAqIEl0IG9uY2UgYWxzbyBjYXJyaWVkIGEgYGRlbGF5QmVmb3JlSW5NaWxsaXNlY29uZHNgLCBzbyB0aGUgaG9zdCB3b3VsZCBzbGVlcCBiZXR3ZWVuIHRoZSB0d28gaGFsdmVzIG9mIGFcbiAqIGxvbmctcHJlc3MuIFRoYXQgZHdlbGwgaXMgZ29uZTogdGhlIGdlc3R1cmUgaXMgbm93IG9uZSBgSW5wdXQuc3ludGhlc2l6ZVRhcEdlc3R1cmVgIHRoYXQgaG9sZHMgaXRzZWxmXG4gKiBmb3IgaXRzIG93biBgZHVyYXRpb25gLCBzbyBubyBjb21tYW5kIGluIGFueSBzZXF1ZW5jZSBuZWVkcyB0byBiZSBzcGFjZWQgZnJvbSB0aGUgb25lIGJlZm9yZSBpdCwgYW5kIGFcbiAqIGtub2Igbm90aGluZyBzZXRzIGlzIHdvcnNlIHRoYW4gbm8ga25vYi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDZHBJbnB1dENvbW1hbmQge1xuICAvKipcbiAgICogVGhlIENEUCBtZXRob2QgbmFtZSwgZS5nLiBgSW5wdXQuZGlzcGF0Y2hUb3VjaEV2ZW50YC5cbiAgICovXG4gIHJlYWRvbmx5IG1ldGhvZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgQ0RQIG1ldGhvZCBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcmVhZG9ubHkgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLyoqXG4gKiBXaGF0IHRoZSByZW5kZXJlciBoYW5kcyB0byB0aGUgaG9zdCBiaW5kaW5nOiBvbmUgcmVxdWVzdCwgcGx1cyB0aGUgaWQgdG8gYW5zd2VyIGl0IG9uLlxuICpcbiAqIFRoZSByZW5kZXJlciBidWlsZHMgdGhpcyBsaXRlcmFsIGluc2lkZSB0aGUgc2VyaWFsaXplZCBib290c3RyYXAgY2xvc3VyZSwgd2hpY2ggY2Fubm90IGltcG9ydCAoKipMMTUqKiksXG4gKiBzbyB0aGUgc2hhcGUgaXMgZGVjbGFyZWQgaGVyZSBhbmQgbWlycm9yZWQgdGhlcmUuIFRoZXkgYXJlIG9uZSB3aXJlIGZvcm1hdDsgY2hhbmdlIHRoZW0gdG9nZXRoZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9iaWxlSW5wdXRFbnZlbG9wZSB7XG4gIC8qKlxuICAgKiBUaGUgcmVxdWVzdCBpZCB0aGUgcmVuZGVyZXIgaXMgd2FpdGluZyBvbi5cbiAgICovXG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoYXQgdG8gaW5qZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgcmVxdWVzdDogTW9iaWxlSW5wdXRSZXF1ZXN0O1xufVxuXG4vKipcbiAqIEFueXRoaW5nIHRoZSByZW5kZXJlciBjYW4gYXNrIHRoZSBob3N0IHRvIGluamVjdC5cbiAqL1xuZXhwb3J0IHR5cGUgTW9iaWxlSW5wdXRSZXF1ZXN0ID0gTW9iaWxlS2V5SW5wdXRSZXF1ZXN0IHwgTW9iaWxlUG9pbnRlcklucHV0UmVxdWVzdDtcblxuLyoqXG4gKiBBIHRydXN0ZWQga2V5IHByZXNzIHRvIGluamVjdCBvbiBtb2JpbGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9iaWxlS2V5SW5wdXRSZXF1ZXN0IHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgdG8gcHJlc3MsIGluIHRoZSBzYW1lIHNwZWxsaW5nIHRoZSBkZXNrdG9wIHR3aW4gdGFrZXM6IGVpdGhlciBhIG5hbWVkIGtleVxuICAgKiAoYEVudGVyYCwgYEVzY2FwZWAsIGBUYWJgLCBgQmFja3NwYWNlYCwgYERlbGV0ZWAsIGFuIGFycm93KSBvciBhIHNpbmdsZSBwcmludGFibGUgY2hhcmFjdGVyLlxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERpc2NyaW1pbmFudC5cbiAgICovXG4gIHJlYWRvbmx5IGtpbmQ6ICdrZXknO1xuXG4gIC8qKlxuICAgKiBNb2RpZmllcnMgYWxyZWFkeSByZXNvbHZlZCB0byB0aGVpciBwbGF0Zm9ybS1pbmRlcGVuZGVudCBsb3dlcmNhc2UgbmFtZXMgYnkgdGhlIHJlbmRlcmVyJ3NcbiAgICogYHRvRWxlY3Ryb25Nb2RpZmllcnNgIFx1MjAxNCB0aGUgb25lIG1hcHBpbmcgYSBrZXkgcHJlc3MgYW5kIGEgY2xpY2sgc2hhcmUsIHNvIGAnTW9kJ2AgY2Fubm90IG1lYW4gdHdvXG4gICAqIGRpZmZlcmVudCB0aGluZ3MgKCoqTDE3KiopLlxuICAgKi9cbiAgcmVhZG9ubHkgbW9kaWZpZXJzOiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBBIHRydXN0ZWQgcG9pbnRlciBnZXN0dXJlIHRvIGluamVjdCBvbiBtb2JpbGUsIGluIENTUyBwaXhlbHMgd2l0aGluIHRoZSBXZWJWaWV3J3Mgb3duIHZpZXdwb3J0LlxuICpcbiAqIE5vIGRldmljZS1waXhlbCBjb252ZXJzaW9uIGlzIGludm9sdmVkOiBDRFAgdGFrZXMgcGFnZSBjb29yZGluYXRlcywgc28gYGRldmljZVBpeGVsUmF0aW9gIGFuZCB0aGVcbiAqIFdlYlZpZXcncyBvZmZzZXQgdW5kZXIgdGhlIHN0YXR1cyBiYXIgbmV2ZXIgZW50ZXIgdGhlIHBpY3R1cmUgKHRoZXkgd291bGQgZm9yIG5hdGl2ZSBpbmplY3Rpb24pLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vYmlsZVBvaW50ZXJJbnB1dFJlcXVlc3Qge1xuICAvKipcbiAgICogYHRhcGAgaXMgdGhlIHRvdWNoIGFuYWxvZyBvZiBhIGxlZnQgY2xpY2s7IGBsb25nUHJlc3NgIGlzIHRoZSBtb2JpbGUgY29udGV4dC1tZW51IGdlc3R1cmUsIGkuZS4gd2hhdCBhXG4gICAqIGRlc2t0b3AgcmlnaHQgY2xpY2sgbWVhbnMgaGVyZS5cbiAgICovXG4gIHJlYWRvbmx5IGtpbmQ6ICdsb25nUHJlc3MnIHwgJ3RhcCc7XG5cbiAgLyoqXG4gICAqIFNlZSB7QGxpbmsgTW9iaWxlS2V5SW5wdXRSZXF1ZXN0Lm1vZGlmaWVyc30uXG4gICAqL1xuICByZWFkb25seSBtb2RpZmllcnM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgdmlld3BvcnQgeCBjb29yZGluYXRlLCBpbiBDU1MgcGl4ZWxzLlxuICAgKi9cbiAgcmVhZG9ubHkgeDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdmlld3BvcnQgeSBjb29yZGluYXRlLCBpbiBDU1MgcGl4ZWxzLlxuICAgKi9cbiAgcmVhZG9ubHkgeTogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRoZSBDRFAgYFJlbW90ZU9iamVjdGAgYW4gZXZhbHVhdGUgcmV0dXJucywgcmVkdWNlZCB0byB0aGUgb25lIGZpZWxkIHRoaXMgbW9kdWxlIHJlYWRzLlxuICovXG5pbnRlcmZhY2UgRXZhbHVhdGVSZW1vdGVPYmplY3Qge1xuICByZWFkb25seSB2YWx1ZT86IHVua25vd247XG59XG5cbi8qKlxuICogVGhlIHBhcnQgb2YgYSBDRFAgYFJ1bnRpbWUuZXZhbHVhdGVgIHJlcGx5IHRoaXMgbW9kdWxlIHJlYWRzLlxuICpcbiAqIERlY2xhcmVkIHJhdGhlciB0aGFuIGltcG9ydGVkOiB0aGUgaGFybmVzcyB0YWxrcyB0byB0aGUgV2ViVmlldyBkZWJ1Z2dlciBvdmVyIGEgcmF3IHNvY2tldCwgc28gdGhlcmVcbiAqIGlzIG5vIGdlbmVyYXRlZCBwcm90b2NvbCB0eXBlIHRvIHJlYWNoIGZvciwgYW5kIG9ubHkgdGhlIHJldHVybmVkIHZhbHVlIG1hdHRlcnMgaGVyZS5cbiAqL1xuaW50ZXJmYWNlIEV2YWx1YXRlUmVzdWx0IHtcbiAgcmVhZG9ubHkgcmVzdWx0PzogRXZhbHVhdGVSZW1vdGVPYmplY3Q7XG59XG5cbi8qKlxuICogSG93IGxvbmcgYSBsb25nLXByZXNzIGhvbGRzIHRoZSB0b3VjaCBkb3duIGJlZm9yZSByZWxlYXNpbmcgaXQuXG4gKlxuICogSXQgaGFzIHRvIGNsZWFyICoqQW5kcm9pZCdzKiogbG9uZy1wcmVzcyB0aHJlc2hvbGQsIHdoaWNoIGlzIDUwMG1zIGJ5IGRlZmF1bHQ6IHRoZSBnZXN0dXJlIGlzXG4gKiByZWNvZ25pemVkIGJ5IHRoZSBwbGF0Zm9ybSwgYW5kIHRoZSBgY29udGV4dG1lbnVgIE9ic2lkaWFuJ3MgbWVudXMgaGFuZyBvZmYgaXMgd2hhdCB0aGUgcmVjb2duaXplclxuICogZW1pdHMuIDYwMG1zIGNsZWFycyB0aGF0IHdpdGggbWFyZ2luIHdpdGhvdXQgbWFraW5nIGV2ZXJ5IGxvbmctcHJlc3MgdGVzdCBub3RpY2VhYmx5IHNsb3dlci5cbiAqXG4gKiBUaGlzIGNvcnJlY3RzIHRoZSBmb3JtZXIgcmVhZGluZyBcdTIwMTQgdGhhdCBPYnNpZGlhbiBNb2JpbGUgaW1wbGVtZW50cyBsb25nLXByZXNzIGl0c2VsZiwgb24gYSBKYXZhU2NyaXB0XG4gKiBgdG91Y2hzdGFydGAgdGltZXIsIHNvIHRoZSBkd2VsbCBvbmx5IGhhZCB0byBjbGVhciAqaXRzKiB0aHJlc2hvbGQuIE1lYXN1cmVkIGFnYWluc3QgYSByZWFsXG4gKiBgLm5hdi1maWxlLXRpdGxlYCwgYSA2MDBtcyBkd2VsbCBiZXR3ZWVuIHR3byBkaXNwYXRjaGVkIHRvdWNoZXMgb3BlbmVkIHRoZSBub3RlIGluc3RlYWQgb2YgaXRzIG1lbnU7XG4gKiBzZWUge0BsaW5rIHRvUG9pbnRlckNvbW1hbmRzfSBmb3Igd2h5IHRoZSBkd2VsbCBhbG9uZSB3YXMgbmV2ZXIgZ29pbmcgdG8gYmUgZW5vdWdoLlxuICovXG5jb25zdCBMT05HX1BSRVNTX0RXRUxMX0lOX01JTExJU0VDT05EUyA9IDYwMDtcblxuY29uc3QgTk9fTU9ESUZJRVJTID0gMDtcbmNvbnN0IE1PRElGSUVSX0JJVF9BTFQgPSAxO1xuY29uc3QgTU9ESUZJRVJfQklUX0NPTlRST0wgPSAyO1xuY29uc3QgTU9ESUZJRVJfQklUX01FVEEgPSA0O1xuY29uc3QgTU9ESUZJRVJfQklUX1NISUZUID0gODtcblxuLyoqXG4gKiBDRFAncyBtb2RpZmllciBiaXRtYXNrLCB3aGljaCBpcyBub3QgdGhlIHNhbWUgc3BlbGxpbmcgYXMgRWxlY3Ryb24ncyBzdHJpbmcgbGlzdC5cbiAqXG4gKiBAc2VlIHtAbGluayBodHRwczovL2Nocm9tZWRldnRvb2xzLmdpdGh1Yi5pby9kZXZ0b29scy1wcm90b2NvbC90b3QvSW5wdXQvI21ldGhvZC1kaXNwYXRjaEtleUV2ZW50fVxuICovXG5jb25zdCBDRFBfTU9ESUZJRVJfQklUX0JZX05BTUUgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPihbXG4gIFsnYWx0JywgTU9ESUZJRVJfQklUX0FMVF0sXG4gIFsnY29udHJvbCcsIE1PRElGSUVSX0JJVF9DT05UUk9MXSxcbiAgWydtZXRhJywgTU9ESUZJRVJfQklUX01FVEFdLFxuICBbJ3NoaWZ0JywgTU9ESUZJRVJfQklUX1NISUZUXVxuXSk7XG5cbmNvbnN0IEtFWV9DT0RFX0JBQ0tTUEFDRSA9IDg7XG5jb25zdCBLRVlfQ09ERV9UQUIgPSA5O1xuY29uc3QgS0VZX0NPREVfRU5URVIgPSAxMztcbmNvbnN0IEtFWV9DT0RFX0VTQ0FQRSA9IDI3O1xuY29uc3QgS0VZX0NPREVfQVJST1dfTEVGVCA9IDM3O1xuY29uc3QgS0VZX0NPREVfQVJST1dfVVAgPSAzODtcbmNvbnN0IEtFWV9DT0RFX0FSUk9XX1JJR0hUID0gMzk7XG5jb25zdCBLRVlfQ09ERV9BUlJPV19ET1dOID0gNDA7XG5jb25zdCBLRVlfQ09ERV9ERUxFVEUgPSA0NjtcblxuLyoqXG4gKiBOYW1lZCBrZXlzLCB3aXRoIHRoZSBgdGV4dGAgYSByZWFsIGtleSBwcmVzcyB3b3VsZCBwcm9kdWNlIChhYnNlbnQgd2hlbiBpdCBwcm9kdWNlcyBub25lKS5cbiAqXG4gKiBPbmx5IGtleXMgdGhlc2Ugc3VpdGVzIGFjdHVhbGx5IHByZXNzIGFyZSBsaXN0ZWQsIHBsdXMgdGhlIGVkaXRpbmcga2V5cyBhIGNhbGxlciB3b3VsZCByZWFzb25hYmx5IHJlYWNoXG4gKiBmb3IgbmV4dC4gQW4gdW5rbm93biBtdWx0aS1jaGFyYWN0ZXIga2V5IGlzIGEgY2FsbGVyIGVycm9yLCBub3QgYSBzaWxlbnQgbm8tb3AgXHUyMDE0IHNlZVxuICoge0BsaW5rIHRvS2V5Q29tbWFuZHN9LlxuICovXG5jb25zdCBOQU1FRF9LRVlTID0gbmV3IE1hcDxzdHJpbmcsIE5hbWVkS2V5PihbXG4gIFsnQXJyb3dEb3duJywgeyBjb2RlOiAnQXJyb3dEb3duJywgd2luZG93c1ZpcnR1YWxLZXlDb2RlOiBLRVlfQ09ERV9BUlJPV19ET1dOIH1dLFxuICBbJ0Fycm93TGVmdCcsIHsgY29kZTogJ0Fycm93TGVmdCcsIHdpbmRvd3NWaXJ0dWFsS2V5Q29kZTogS0VZX0NPREVfQVJST1dfTEVGVCB9XSxcbiAgWydBcnJvd1JpZ2h0JywgeyBjb2RlOiAnQXJyb3dSaWdodCcsIHdpbmRvd3NWaXJ0dWFsS2V5Q29kZTogS0VZX0NPREVfQVJST1dfUklHSFQgfV0sXG4gIFsnQXJyb3dVcCcsIHsgY29kZTogJ0Fycm93VXAnLCB3aW5kb3dzVmlydHVhbEtleUNvZGU6IEtFWV9DT0RFX0FSUk9XX1VQIH1dLFxuICBbJ0JhY2tzcGFjZScsIHsgY29kZTogJ0JhY2tzcGFjZScsIHdpbmRvd3NWaXJ0dWFsS2V5Q29kZTogS0VZX0NPREVfQkFDS1NQQUNFIH1dLFxuICBbJ0RlbGV0ZScsIHsgY29kZTogJ0RlbGV0ZScsIHdpbmRvd3NWaXJ0dWFsS2V5Q29kZTogS0VZX0NPREVfREVMRVRFIH1dLFxuICBbJ0VudGVyJywgeyBjb2RlOiAnRW50ZXInLCB0ZXh0OiAnXFxyJywgd2luZG93c1ZpcnR1YWxLZXlDb2RlOiBLRVlfQ09ERV9FTlRFUiB9XSxcbiAgWydFc2NhcGUnLCB7IGNvZGU6ICdFc2NhcGUnLCB3aW5kb3dzVmlydHVhbEtleUNvZGU6IEtFWV9DT0RFX0VTQ0FQRSB9XSxcbiAgWydUYWInLCB7IGNvZGU6ICdUYWInLCB0ZXh0OiAnXFx0Jywgd2luZG93c1ZpcnR1YWxLZXlDb2RlOiBLRVlfQ09ERV9UQUIgfV1cbl0pO1xuXG5jb25zdCBGSVJTVF9DT0RFX1BPSU5UX0lOREVYID0gMDtcbmNvbnN0IERJR0lUX1pFUk9fQ09ERV9QT0lOVCA9IGNvZGVQb2ludE9mKCcwJyk7XG5jb25zdCBESUdJVF9OSU5FX0NPREVfUE9JTlQgPSBjb2RlUG9pbnRPZignOScpO1xuY29uc3QgVVBQRVJDQVNFX0FfQ09ERV9QT0lOVCA9IGNvZGVQb2ludE9mKCdBJyk7XG5jb25zdCBVUFBFUkNBU0VfWl9DT0RFX1BPSU5UID0gY29kZVBvaW50T2YoJ1onKTtcblxuLyoqXG4gKiBUaGUgQ0RQIHNwZWxsaW5nIG9mIG9uZSBuYW1lZCBrZXkuXG4gKi9cbmludGVyZmFjZSBOYW1lZEtleSB7XG4gIHJlYWRvbmx5IGNvZGU6IHN0cmluZztcbiAgcmVhZG9ubHkgdGV4dD86IHN0cmluZztcbiAgcmVhZG9ubHkgd2luZG93c1ZpcnR1YWxLZXlDb2RlOiBudW1iZXI7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBleHByZXNzaW9uIHRoZSBob3N0IGV2YWx1YXRlcyB0byBjbGFpbSBvbmUgaW5wdXQgcmVxdWVzdCBiZWZvcmUgaW5qZWN0aW5nIGl0LlxuICpcbiAqIENEUCBkZWxpdmVycyBgUnVudGltZS5iaW5kaW5nQ2FsbGVkYCB0byAqKmV2ZXJ5KiogYXR0YWNoZWQgc2Vzc2lvbiwgc28gZWFjaCBOb2RlIHByb2Nlc3MgaG9sZGluZyBhblxuICogaW5wdXQgY2hhbm5lbCB0byB0aGlzIFdlYlZpZXcgc2VydmljZXMgdGhlIHNhbWUgcmVxdWVzdCBhbmQgaW5qZWN0cyB0aGUgc2FtZSBnZXN0dXJlLiBUaGUgY2xhaW0gaXNcbiAqIHdoYXQgbWFrZXMgdGhlIGluamVjdGlvbiBleGFjdGx5LW9uY2UgYWNyb3NzIGFsbCBvZiB0aGVtOiB0aGUgcGFnZSBpcyB0aGUgb25seSB0aGluZyBldmVyeSBob3N0XG4gKiBzaGFyZXMsIGFuZCBpdCBydW5zIHRoZSByYWNpbmcgZXZhbHVhdGVzIG9uZSBhZnRlciBhbm90aGVyIG9uIGl0cyBzaW5nbGUgdGhyZWFkLCBzbyBleGFjdGx5IG9uZSBvZlxuICogdGhlbSBnZXRzIGB0cnVlYC5cbiAqXG4gKiBPcHRpb25hbCBjaGFpbmluZyBmb3IgdGhlIHNhbWUgcmVhc29uIGFzIHtAbGluayBidWlsZFJlc29sdmVJbnB1dEV4cHJlc3Npb259LCBhbmQgaXQgaXMgd2h5XG4gKiB7QGxpbmsgY2hlY2tJbnB1dENsYWltR3JhbnRlZH0gdHJlYXRzIGEgbm9uLWBmYWxzZWAgcmVzdWx0IGFzIGNsYWltZWQ6IGEgcGFnZSB0aGF0IGhhcyBkcm9wcGVkIHRoZVxuICogbmFtZXNwYWNlIHlpZWxkcyBgdW5kZWZpbmVkYCwgYW5kIGluamVjdGluZyB0d2ljZSBpcyBhIGZhciBiZXR0ZXIgZmFpbHVyZSB0aGFuIG5ldmVyIGluamVjdGluZy5cbiAqXG4gKiBAcGFyYW0gaWQgLSBUaGUgcmVxdWVzdCBpZCB0byBjbGFpbS5cbiAqIEByZXR1cm5zIEEgc2VsZi1jb250YWluZWQgZXhwcmVzc2lvbiB0byBwYXNzIHRvIGBSdW50aW1lLmV2YWx1YXRlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ2xhaW1JbnB1dEV4cHJlc3Npb24oaWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3Rpbmc/LmNsYWltSW5wdXQ/Ligke0pTT04uc3RyaW5naWZ5KGlkKX0pYDtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGV4cHJlc3Npb24gdGhlIGhvc3QgZXZhbHVhdGVzIHRvIGFuc3dlciBvbmUgaW5wdXQgcmVxdWVzdC5cbiAqXG4gKiBPcHRpb25hbCBjaGFpbmluZyB0aHJvdWdob3V0OiBieSB0aGUgdGltZSB0aGUgaG9zdCBhbnN3ZXJzLCB0aGUgcGFnZSBtYXkgaGF2ZSBuYXZpZ2F0ZWQgYW5kIGRyb3BwZWQgdGhlXG4gKiBuYW1lc3BhY2UsIGFuZCBhIGBUeXBlRXJyb3JgIGluc2lkZSB0aGlzIGV2YWx1YXRlIHdvdWxkIGJlIHJlcG9ydGVkIGFzIGFuIGluamVjdGlvbiBmYWlsdXJlIHRoYXQgYWxyZWFkeVxuICogc3VjY2VlZGVkLlxuICpcbiAqIEBwYXJhbSBpZCAtIFRoZSByZXF1ZXN0IGlkIHRoZSByZW5kZXJlciBpcyB3YWl0aW5nIG9uLlxuICogQHBhcmFtIGVycm9yTWVzc2FnZSAtIFdoeSB0aGUgaW5qZWN0aW9uIGZhaWxlZCwgd2hlbiBpdCBkaWQuIE9taXQgb24gc3VjY2Vzcy5cbiAqIEByZXR1cm5zIEEgc2VsZi1jb250YWluZWQgZXhwcmVzc2lvbiB0byBwYXNzIHRvIGBSdW50aW1lLmV2YWx1YXRlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUmVzb2x2ZUlucHV0RXhwcmVzc2lvbihpZDogc3RyaW5nLCBlcnJvck1lc3NhZ2U/OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nPy5yZXNvbHZlSW5wdXQ/Ligke0pTT04uc3RyaW5naWZ5KGlkKX0sICR7SlNPTi5zdHJpbmdpZnkoZXJyb3JNZXNzYWdlID8/IG51bGwpfSlgO1xufVxuXG4vKipcbiAqIFJlYWRzIGEgYFJ1bnRpbWUuZXZhbHVhdGVgIHJlc3VsdCBmb3Ige0BsaW5rIGJ1aWxkQ2xhaW1JbnB1dEV4cHJlc3Npb259IGFuZCBzYXlzIHdoZXRoZXIgdG8gaW5qZWN0LlxuICpcbiAqICoqRGVsaWJlcmF0ZWx5IGZhaWxzIE9QRU4uKiogT25seSBhIGxpdGVyYWwgYGZhbHNlYCBcdTIwMTQgdGhlIHBhZ2UgYWN0aXZlbHkgc2F5aW5nIGFub3RoZXIgaG9zdCBhbHJlYWR5XG4gKiBjbGFpbWVkIHRoaXMgaWQgXHUyMDE0IHN0b3BzIHRoZSBpbmplY3Rpb24uIEEgbWlzc2luZyBuYW1lc3BhY2UsIGEgcGFnZSBtaWQtbmF2aWdhdGlvbiwgb3IgYW55IHJlc3VsdFxuICogc2hhcGUgdGhpcyBkb2VzIG5vdCByZWNvZ25pemUgeWllbGRzIGB0cnVlYCwgYmVjYXVzZSBhIGdlc3R1cmUgaW5qZWN0ZWQgdHdpY2UgaXMgYSBmYXIgYmV0dGVyXG4gKiBmYWlsdXJlIHRoYW4gYSBnZXN0dXJlIG5ldmVyIGluamVjdGVkIGF0IGFsbDogdGhlIGZpcnN0IGlzIGEgZG91YmxlZCB0YXAsIHRoZSBzZWNvbmQgaXMgYSB0ZXN0IHRoYXRcbiAqIGhhbmdzIHVudGlsIHRoZSByZW5kZXJlcidzIHRpbWVvdXQgYW5kIHJlcG9ydHMgbm90aGluZyB1c2VmdWwuXG4gKlxuICogQHBhcmFtIHJlc3VsdCAtIFRoZSByYXcgYFJ1bnRpbWUuZXZhbHVhdGVgIHJlc3VsdCBvYmplY3QuXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoaXMgaG9zdCBzaG91bGQgcGVyZm9ybSB0aGUgaW5qZWN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tJbnB1dENsYWltR3JhbnRlZChyZXN1bHQ6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKHR5cGVvZiByZXN1bHQgIT09ICdvYmplY3QnIHx8IHJlc3VsdCA9PT0gbnVsbCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIChyZXN1bHQgYXMgRXZhbHVhdGVSZXN1bHQpLnJlc3VsdD8udmFsdWUgIT09IGZhbHNlO1xufVxuXG4vKipcbiAqIFRoZSBmaXJzdCBjb2RlIHBvaW50IG9mIGEgbm9uLWVtcHR5IHN0cmluZy5cbiAqXG4gKiBgU3RyaW5nLnByb3RvdHlwZS5jb2RlUG9pbnRBdGAgaXMgdHlwZWQgYG51bWJlciB8IHVuZGVmaW5lZGAsIHNvIGV2ZXJ5IGNhbGwgc2l0ZSB3b3VsZCBvdGhlcndpc2UgY2FycnkgYVxuICogYD8/IGZhbGxiYWNrYCB0aGF0IG5vIGlucHV0IGNhbiBldmVyIHJlYWNoIFx1MjAxNCBhIGRlYWQgYnJhbmNoIHVuZGVyIHRoZSAxMDAlIGNvdmVyYWdlIGdhdGUuIFRocm93aW5nIGhlcmVcbiAqIGtlZXBzIHRoYXQgaW1wb3NzaWJsZSBjYXNlIGluIE9ORSBwbGFjZSwgd2hlcmUgYSB1bml0IHRlc3QgY2FuIHJlYWNoIGl0IGRpcmVjdGx5LCBpbnN0ZWFkIG9mIHNwcmVhZGluZ1xuICogdW5yZWFjaGFibGUgZmFsbGJhY2tzIChvciBjb3ZlcmFnZSBzdXBwcmVzc2lvbnMpIGFjcm9zcyB0aGUgbW9kdWxlLlxuICpcbiAqIEBwYXJhbSB0ZXh0IC0gQSBub24tZW1wdHkgc3RyaW5nLlxuICogQHJldHVybnMgSXRzIGZpcnN0IGNvZGUgcG9pbnQuXG4gKiBAdGhyb3dzIFdoZW4gYHRleHRgIGlzIGVtcHR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29kZVBvaW50T2YodGV4dDogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgY29kZVBvaW50ID0gdGV4dC5jb2RlUG9pbnRBdChGSVJTVF9DT0RFX1BPSU5UX0lOREVYKTtcbiAgaWYgKGNvZGVQb2ludCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjb2RlUG9pbnRPZiByZWNlaXZlZCBhbiBlbXB0eSBzdHJpbmcuJyk7XG4gIH1cblxuICByZXR1cm4gY29kZVBvaW50O1xufVxuXG4vKipcbiAqIFRyYW5zbGF0ZXMgYSBtb2JpbGUgaW5wdXQgcmVxdWVzdCBpbnRvIHRoZSBvcmRlcmVkIENEUCBjb21tYW5kcyB0aGF0IHJlYWxpemUgaXQuXG4gKlxuICogQHBhcmFtIHJlcXVlc3QgLSBXaGF0IHRoZSByZW5kZXJlciBhc2tlZCB0aGUgaG9zdCB0byBpbmplY3QuXG4gKiBAcmV0dXJucyBUaGUgY29tbWFuZHMgdG8gc2VuZCwgaW4gb3JkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0NkcElucHV0Q29tbWFuZHMocmVxdWVzdDogTW9iaWxlSW5wdXRSZXF1ZXN0KTogQ2RwSW5wdXRDb21tYW5kW10ge1xuICBpZiAocmVxdWVzdC5raW5kID09PSAna2V5Jykge1xuICAgIHJldHVybiB0b0tleUNvbW1hbmRzKHJlcXVlc3QpO1xuICB9XG5cbiAgcmV0dXJuIHRvUG9pbnRlckNvbW1hbmRzKHJlcXVlc3QpO1xufVxuXG4vKipcbiAqIEZvbGRzIHJlc29sdmVkIG1vZGlmaWVyIG5hbWVzIGludG8gQ0RQJ3MgYml0bWFzay5cbiAqXG4gKiBVbmtub3duIG5hbWVzIGFyZSBpZ25vcmVkIHJhdGhlciB0aGFuIHRocm93aW5nOiB0aGUgcmVuZGVyZXIncyBgdG9FbGVjdHJvbk1vZGlmaWVyc2AgaXMgZXhoYXVzdGl2ZSBvdmVyXG4gKiBPYnNpZGlhbidzIGBNb2RpZmllcmAgdW5pb24sIHNvIGFuIHVua25vd24gbmFtZSBoZXJlIHdvdWxkIG1lYW4gdGhlIHR3byBjb3BpZXMgaGF2ZSBhbHJlYWR5IGRyaWZ0ZWQsIGFuZFxuICogZmFpbGluZyB0aGUgd2hvbGUgZ2VzdHVyZSBpcyBhIHdvcnNlIG91dGNvbWUgdGhhbiBwcmVzc2luZyBpdCB1bm1vZGlmaWVkLlxuICpcbiAqIEBwYXJhbSBtb2RpZmllcnMgLSBSZXNvbHZlZCBsb3dlcmNhc2UgbW9kaWZpZXIgbmFtZXMuXG4gKiBAcmV0dXJucyBUaGUgQ0RQIG1vZGlmaWVyIGJpdG1hc2suXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0NkcE1vZGlmaWVycyhtb2RpZmllcnM6IHJlYWRvbmx5IHN0cmluZ1tdKTogbnVtYmVyIHtcbiAgLy8gU3VtbWluZyBESVNUSU5DVCBiaXRzIGVxdWFscyBPUi1pbmcgdGhlbSwgYW5kIHRoZSBgU2V0YCBpcyB3aGF0IG1ha2VzIHRoYXQgaG9sZCBldmVuIHdoZW4gYSBjYWxsZXJcbiAgLy8gUGFzc2VzIHRoZSBzYW1lIG1vZGlmaWVyIHR3aWNlIFx1MjAxNCBzbyB0aGUgbWFzayBpcyBidWlsdCB3aXRob3V0IGEgYml0d2lzZSBvcGVyYXRvci5cbiAgY29uc3QgYml0cyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICBmb3IgKGNvbnN0IG1vZGlmaWVyIG9mIG1vZGlmaWVycykge1xuICAgIGNvbnN0IGJpdCA9IENEUF9NT0RJRklFUl9CSVRfQllfTkFNRS5nZXQobW9kaWZpZXIpO1xuICAgIGlmIChiaXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYml0cy5hZGQoYml0KTtcbiAgICB9XG4gIH1cblxuICBsZXQgYml0bWFzayA9IE5PX01PRElGSUVSUztcbiAgZm9yIChjb25zdCBiaXQgb2YgYml0cykge1xuICAgIGJpdG1hc2sgKz0gYml0O1xuICB9XG5cbiAgcmV0dXJuIGJpdG1hc2s7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgYSBrZXkgbmFtZSB0byBpdHMgQ0RQIHNwZWxsaW5nLlxuICpcbiAqIEBwYXJhbSBrZXkgLSBBIG5hbWVkIGtleSBvciBhIHNpbmdsZSBwcmludGFibGUgY2hhcmFjdGVyLlxuICogQHJldHVybnMgVGhlIENEUCBzcGVsbGluZy5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUtleShrZXk6IHN0cmluZyk6IE5hbWVkS2V5IHtcbiAgY29uc3QgbmFtZWRLZXkgPSBOQU1FRF9LRVlTLmdldChrZXkpO1xuICBpZiAobmFtZWRLZXkpIHtcbiAgICByZXR1cm4gbmFtZWRLZXk7XG4gIH1cblxuICAvLyBcIkV4YWN0bHkgb25lIGNvZGUgcG9pbnRcIiwgdGVzdGVkIHdpdGhvdXQgc3BsaXR0aW5nIHRoZSBzdHJpbmc6IGBmcm9tQ29kZVBvaW50YCByb3VuZC10cmlwcyBvbmx5IHdoZW5cbiAgLy8gYGtleWAgaXMgdGhhdCBzaW5nbGUgY29kZSBwb2ludCwgc28gYW4gYXN0cmFsLXBsYW5lIGNoYXJhY3RlciBjb3VudHMgYXMgb25lIGFuZCBgJ0N0cmwrSydgIGRvZXMgbm90LlxuICBjb25zdCBjb2RlUG9pbnQgPSBrZXkuY29kZVBvaW50QXQoRklSU1RfQ09ERV9QT0lOVF9JTkRFWCk7XG4gIGlmIChjb2RlUG9pbnQgPT09IHVuZGVmaW5lZCB8fCBTdHJpbmcuZnJvbUNvZGVQb2ludChjb2RlUG9pbnQpICE9PSBrZXkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgcHJlc3NLZXkgcmVjZWl2ZWQgYW4gdW5rbm93biBrZXkgbmFtZSBvbiBtb2JpbGU6ICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0uIGBcbiAgICAgICAgKyBgUGFzcyBhIHNpbmdsZSBjaGFyYWN0ZXIgb3Igb25lIG9mOiAke1suLi5OQU1FRF9LRVlTLmtleXMoKV0uam9pbignLCAnKX0uYFxuICAgICk7XG4gIH1cblxuICBjb25zdCB1cHBlckNhc2VkQ29kZVBvaW50ID0gY29kZVBvaW50T2Yoa2V5LnRvVXBwZXJDYXNlKCkpO1xuICByZXR1cm4ge1xuICAgIGNvZGU6IHJlc29sdmVLZXlDb2RlKHVwcGVyQ2FzZWRDb2RlUG9pbnQpLFxuICAgIHRleHQ6IGtleSxcbiAgICB3aW5kb3dzVmlydHVhbEtleUNvZGU6IHVwcGVyQ2FzZWRDb2RlUG9pbnRcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgcGh5c2ljYWwgYGNvZGVgIGZvciBhIHByaW50YWJsZSBjaGFyYWN0ZXIuXG4gKlxuICogQ2hhcmFjdGVycyBvdXRzaWRlIHRoZSBBU0NJSSBsZXR0ZXIvZGlnaXQgcm93cyBoYXZlIG5vIHN0YWJsZSBwaHlzaWNhbCBrZXksIHNvIHRoZXkgZ2V0IGFuIGVtcHR5XG4gKiBgY29kZWAgXHUyMDE0IHRoZSBgdGV4dGAgc3RpbGwgY2FycmllcyB0aGVtLCB3aGljaCBpcyB3aGF0IGFuIGVkaXRvciByZWFkcy5cbiAqXG4gKiBAcGFyYW0gdXBwZXJDYXNlZENvZGVQb2ludCAtIFRoZSBjaGFyYWN0ZXIncyB1cHBlci1jYXNlZCBjb2RlIHBvaW50LlxuICogQHJldHVybnMgVGhlIENEUCBgY29kZWAsIG9yIGFuIGVtcHR5IHN0cmluZyB3aGVuIHRoZXJlIGlzIG5vIHN0YWJsZSBvbmUuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVLZXlDb2RlKHVwcGVyQ2FzZWRDb2RlUG9pbnQ6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmICh1cHBlckNhc2VkQ29kZVBvaW50ID49IFVQUEVSQ0FTRV9BX0NPREVfUE9JTlQgJiYgdXBwZXJDYXNlZENvZGVQb2ludCA8PSBVUFBFUkNBU0VfWl9DT0RFX1BPSU5UKSB7XG4gICAgcmV0dXJuIGBLZXkke1N0cmluZy5mcm9tQ29kZVBvaW50KHVwcGVyQ2FzZWRDb2RlUG9pbnQpfWA7XG4gIH1cblxuICBpZiAodXBwZXJDYXNlZENvZGVQb2ludCA+PSBESUdJVF9aRVJPX0NPREVfUE9JTlQgJiYgdXBwZXJDYXNlZENvZGVQb2ludCA8PSBESUdJVF9OSU5FX0NPREVfUE9JTlQpIHtcbiAgICByZXR1cm4gYERpZ2l0JHtTdHJpbmcuZnJvbUNvZGVQb2ludCh1cHBlckNhc2VkQ29kZVBvaW50KX1gO1xuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgY29tbWFuZCBzZXF1ZW5jZSBmb3IgYSBrZXkgcHJlc3MuXG4gKlxuICogTWlycm9ycyB0aGUgZGVza3RvcCB0d2luJ3MgdHJ1c3RlZCBga2V5RG93bmAgXHUyMTkyIGBjaGFyYCBcdTIxOTIgYGtleVVwYCBpbiBDRFAncyBzcGVsbGluZzogYHJhd0tleURvd25gIGZpcmVzXG4gKiBga2V5ZG93bmAgYWxvbmUsIGBjaGFyYCBmaXJlcyBga2V5cHJlc3NgIC8gYGJlZm9yZWlucHV0YCAvIGBpbnB1dGAsIGBrZXlVcGAgZmlyZXMgYGtleXVwYC4gQSBrZXkgdGhhdFxuICogcHJvZHVjZXMgbm8gdGV4dCAoYEVzY2FwZWApIHNraXBzIHRoZSBgY2hhcmAsIGV4YWN0bHkgYXMgYSByZWFsIG9uZSBkb2VzLlxuICpcbiAqIEBwYXJhbSByZXF1ZXN0IC0gVGhlIGtleSByZXF1ZXN0LlxuICogQHJldHVybnMgVGhlIGNvbW1hbmRzIHRvIHNlbmQsIGluIG9yZGVyLlxuICovXG5mdW5jdGlvbiB0b0tleUNvbW1hbmRzKHJlcXVlc3Q6IE1vYmlsZUtleUlucHV0UmVxdWVzdCk6IENkcElucHV0Q29tbWFuZFtdIHtcbiAgY29uc3QgeyBjb2RlLCB0ZXh0LCB3aW5kb3dzVmlydHVhbEtleUNvZGUgfSA9IHJlc29sdmVLZXkocmVxdWVzdC5rZXkpO1xuICBjb25zdCBtb2RpZmllcnMgPSB0b0NkcE1vZGlmaWVycyhyZXF1ZXN0Lm1vZGlmaWVycyk7XG4gIGNvbnN0IGJhc2UgPSB7IGNvZGUsIGtleTogcmVxdWVzdC5rZXksIG1vZGlmaWVycywgd2luZG93c1ZpcnR1YWxLZXlDb2RlIH07XG5cbiAgY29uc3QgY29tbWFuZHM6IENkcElucHV0Q29tbWFuZFtdID0gW1xuICAgIHsgbWV0aG9kOiAnSW5wdXQuZGlzcGF0Y2hLZXlFdmVudCcsIHBhcmFtczogeyAuLi5iYXNlLCB0eXBlOiAncmF3S2V5RG93bicgfSB9XG4gIF07XG5cbiAgaWYgKHRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbW1hbmRzLnB1c2goeyBtZXRob2Q6ICdJbnB1dC5kaXNwYXRjaEtleUV2ZW50JywgcGFyYW1zOiB7IC4uLmJhc2UsIHRleHQsIHR5cGU6ICdjaGFyJyB9IH0pO1xuICB9XG5cbiAgY29tbWFuZHMucHVzaCh7IG1ldGhvZDogJ0lucHV0LmRpc3BhdGNoS2V5RXZlbnQnLCBwYXJhbXM6IHsgLi4uYmFzZSwgdHlwZTogJ2tleVVwJyB9IH0pO1xuXG4gIHJldHVybiBjb21tYW5kcztcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGNvbW1hbmQgc2VxdWVuY2UgZm9yIGEgdGFwIG9yIGEgbG9uZy1wcmVzcy5cbiAqXG4gKiAqKlRoZSB0d28gZ2VzdHVyZXMgdGFrZSBkaWZmZXJlbnQgQ0RQIHJvdXRlcywgYW5kIHRoYXQgYXN5bW1ldHJ5IGlzIHRoZSB3aG9sZSBwb2ludC4qKlxuICpcbiAqIEEgdGFwIGlzIGEgdHJ1c3RlZCB0b3VjaCBwYWlyLCB3aGljaCBpcyBhbGwgQ2hyb21pdW0gbmVlZHMgXHUyMDE0IGl0IHN5bnRoZXNpemVzIGBwb2ludGVyZG93bmAgL1xuICogYHRvdWNoc3RhcnRgIC8gYHBvaW50ZXJ1cGAgLyBgdG91Y2hlbmRgIC8gYGNsaWNrYCBmcm9tIGl0LCBldmVyeSBvbmUgYGlzVHJ1c3RlZGAuIFRoZSByZWxlYXNlIGNhcnJpZXNcbiAqIGFuIGVtcHR5IGB0b3VjaFBvaW50c2AgbGlzdCwgd2hpY2ggaXMgQ0RQJ3Mgc3BlbGxpbmcgZm9yIFwiYWxsIGZpbmdlcnMgbGlmdGVkXCIuXG4gKlxuICogQSBsb25nLXByZXNzIGNhbm5vdCBiZSB0aGF0IHNhbWUgcGFpciBoZWxkIGFwYXJ0IGJ5IGEgZHdlbGwsIGJlY2F1c2UgYElucHV0LmRpc3BhdGNoVG91Y2hFdmVudGAgaW5qZWN0c1xuICogYSBgV2ViVG91Y2hFdmVudGAgKipwYXN0KiogQW5kcm9pZCdzIGdlc3R1cmUgcmVjb2duaXplcjogbm8gcmVjb2duaXplciBzZWVzIHRoZSBob2xkLCBzbyBubyBsb25nLXByZXNzXG4gKiBnZXN0dXJlIGlzIGV2ZXIgcHJvZHVjZWQgYW5kIHRoZSBwYWlyIGlzIGNsYXNzaWZpZWQgYXMgYSB0YXAgaG93ZXZlciBsb25nIHRoZSBkd2VsbCBpcy5cbiAqIGBJbnB1dC5zeW50aGVzaXplVGFwR2VzdHVyZWAgaW5zdGVhZCBnb2VzIHRocm91Z2ggQ2hyb21pdW0ncyBzeW50aGV0aWMtZ2VzdHVyZSBjb250cm9sbGVyLCB3aGljaCBidWlsZHNcbiAqIHJlYWwgYE1vdGlvbkV2ZW50YHMgYW5kIGZlZWRzIHRoZW0gdG8gdGhlIHBsYXRmb3JtIHJlY29nbml6ZXIgXHUyMDE0IHRoZSBzdGVwIHRoZSBkaXNwYXRjaCByb3V0ZSBza2lwcy5cbiAqXG4gKiBNZWFzdXJlZCBvbiBhIGxpdmUgZW11bGF0b3IgKDIwMjYtMDktMDgpOiB0aGUgZGlzcGF0Y2ggcGFpciB3aXRoIGEgNjAwbXMgZHdlbGwsIGFpbWVkIGF0IGEgKipyZWFsKipcbiAqIGAubmF2LWZpbGUtdGl0bGVgIGluIHRoZSBmaWxlIGV4cGxvcmVyLCBwcm9kdWNlZCBgcG9pbnRlcmRvd25gIC8gYHRvdWNoc3RhcnRgIC8gYHRvdWNoZW5kYCAvIGBjbGlja2AgYW5kXG4gKiAqKm9wZW5lZCB0aGUgbm90ZSoqIFx1MjAxNCBhIHRhcC4gTm8gYGNvbnRleHRtZW51YCwgYW5kIG5vIE9ic2lkaWFuIG1lbnUuXG4gKlxuICogQHBhcmFtIHJlcXVlc3QgLSBUaGUgcG9pbnRlciByZXF1ZXN0LlxuICogQHJldHVybnMgVGhlIGNvbW1hbmRzIHRvIHNlbmQsIGluIG9yZGVyLlxuICovXG5mdW5jdGlvbiB0b1BvaW50ZXJDb21tYW5kcyhyZXF1ZXN0OiBNb2JpbGVQb2ludGVySW5wdXRSZXF1ZXN0KTogQ2RwSW5wdXRDb21tYW5kW10ge1xuICBjb25zdCBtb2RpZmllcnMgPSB0b0NkcE1vZGlmaWVycyhyZXF1ZXN0Lm1vZGlmaWVycyk7XG5cbiAgaWYgKHJlcXVlc3Qua2luZCA9PT0gJ2xvbmdQcmVzcycpIHtcbiAgICAvLyBgc3ludGhlc2l6ZVRhcEdlc3R1cmVgIHRha2VzIG5vIG1vZGlmaWVyIGJpdG1hc2sgXHUyMDE0IENEUCdzIGdlc3R1cmUgQVBJIGhhcyBubyBwYXJhbWV0ZXIgZm9yIG9uZSBcdTIwMTQgYW5kXG4gICAgLy8gQSB0b3VjaCBzY3JlZW4gaGFzIG5vIG1vZGlmaWVyIGtleXMgdG8gaG9sZCBkdXJpbmcgYSBwcmVzcywgc28gdGhlcmUgaXMgbm90aGluZyB0byBjYXJyeSBoZXJlLlxuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIG1ldGhvZDogJ0lucHV0LnN5bnRoZXNpemVUYXBHZXN0dXJlJyxcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgZHVyYXRpb246IExPTkdfUFJFU1NfRFdFTExfSU5fTUlMTElTRUNPTkRTLFxuICAgICAgICAgIGdlc3R1cmVTb3VyY2VUeXBlOiAndG91Y2gnLFxuICAgICAgICAgIHg6IHJlcXVlc3QueCxcbiAgICAgICAgICB5OiByZXF1ZXN0LnlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIF07XG4gIH1cblxuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIG1ldGhvZDogJ0lucHV0LmRpc3BhdGNoVG91Y2hFdmVudCcsXG4gICAgICBwYXJhbXM6IHsgbW9kaWZpZXJzLCB0b3VjaFBvaW50czogW3sgeDogcmVxdWVzdC54LCB5OiByZXF1ZXN0LnkgfV0sIHR5cGU6ICd0b3VjaFN0YXJ0JyB9XG4gICAgfSxcbiAgICB7XG4gICAgICBtZXRob2Q6ICdJbnB1dC5kaXNwYXRjaFRvdWNoRXZlbnQnLFxuICAgICAgcGFyYW1zOiB7IG1vZGlmaWVycywgdG91Y2hQb2ludHM6IFtdLCB0eXBlOiAndG91Y2hFbmQnIH1cbiAgICB9XG4gIF07XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtB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
@@ -111,6 +111,23 @@ export interface MobilePointerInputRequest {
111
111
  */
112
112
  readonly y: number;
113
113
  }
114
+ /**
115
+ * Builds the expression the host evaluates to claim one input request before injecting it.
116
+ *
117
+ * CDP delivers `Runtime.bindingCalled` to **every** attached session, so each Node process holding an
118
+ * input channel to this WebView services the same request and injects the same gesture. The claim is
119
+ * what makes the injection exactly-once across all of them: the page is the only thing every host
120
+ * shares, and it runs the racing evaluates one after another on its single thread, so exactly one of
121
+ * them gets `true`.
122
+ *
123
+ * Optional chaining for the same reason as {@link buildResolveInputExpression}, and it is why
124
+ * {@link checkInputClaimGranted} treats a non-`false` result as claimed: a page that has dropped the
125
+ * namespace yields `undefined`, and injecting twice is a far better failure than never injecting.
126
+ *
127
+ * @param id - The request id to claim.
128
+ * @returns A self-contained expression to pass to `Runtime.evaluate`.
129
+ */
130
+ export declare function buildClaimInputExpression(id: string): string;
114
131
  /**
115
132
  * Builds the expression the host evaluates to answer one input request.
116
133
  *
@@ -123,6 +140,19 @@ export interface MobilePointerInputRequest {
123
140
  * @returns A self-contained expression to pass to `Runtime.evaluate`.
124
141
  */
125
142
  export declare function buildResolveInputExpression(id: string, errorMessage?: string): string;
143
+ /**
144
+ * Reads a `Runtime.evaluate` result for {@link buildClaimInputExpression} and says whether to inject.
145
+ *
146
+ * **Deliberately fails OPEN.** Only a literal `false` — the page actively saying another host already
147
+ * claimed this id — stops the injection. A missing namespace, a page mid-navigation, or any result
148
+ * shape this does not recognize yields `true`, because a gesture injected twice is a far better
149
+ * failure than a gesture never injected at all: the first is a doubled tap, the second is a test that
150
+ * hangs until the renderer's timeout and reports nothing useful.
151
+ *
152
+ * @param result - The raw `Runtime.evaluate` result object.
153
+ * @returns Whether this host should perform the injection.
154
+ */
155
+ export declare function checkInputClaimGranted(result: unknown): boolean;
126
156
  /**
127
157
  * The first code point of a non-empty string.
128
158
  *
@@ -61,10 +61,18 @@ function bootstrapNamespace(bootstrapParams) {
61
61
  let hasWarnedMissingObsidianModule = false;
62
62
  const pendingInputs = /* @__PURE__ */ new Map();
63
63
  let nextInputId = 0;
64
+ const claimedInputIds = /* @__PURE__ */ new Set();
64
65
  const ns = {
65
66
  get app() {
66
67
  return globalThis.app;
67
68
  },
69
+ claimInput(id) {
70
+ if (claimedInputIds.has(id)) {
71
+ return false;
72
+ }
73
+ claimedInputIds.add(id);
74
+ return true;
75
+ },
68
76
  contexts: existingContexts,
69
77
  async destroyCurrentWindow() {
70
78
  await this.ensureLayoutReady();
@@ -488,4 +496,4 @@ ${generateStackTraceLine(line)}`;
488
496
  0 && (module.exports = {
489
497
  ensureNamespaceBootstrapped
490
498
  });
491
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL25hbWVzcGFjZS1ib290c3RyYXAudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBCb290c3RyYXBzIHRoZSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIG5hbWVzcGFjZSBpbiB0aGVcbiAqIE9ic2lkaWFuIHByb2Nlc3MuIEV4dHJhY3RlZCB0byBpdHMgb3duIG1vZHVsZSB0byBhdm9pZCBkZXBlbmRlbmN5IGN5Y2xlc1xuICogYmV0d2VlbiBgZXZhbC1pbi1vYnNpZGlhbi50c2AgYW5kIHRoZSB0cmFuc3BvcnQgbW9kdWxlcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgTW9kaWZpZXIsXG4gIFRGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUge1xuICBDbGlja0VsZW1lbnRQYXJhbXMsXG4gIENsaWNrTW91c2VQYXJhbXMsXG4gIENyZWF0ZU5vdGVQYXJhbXMsXG4gIEhvdmVyRWxlbWVudFBhcmFtcyxcbiAgTW92ZU1vdXNlUGFyYW1zLFxuICBPcGVuU2V0dGluZ3NUYWJQYXJhbXMsXG4gIFByZXNzS2V5UGFyYW1zLFxuICBUeXBlSW50b0VkaXRvclBhcmFtcyxcbiAgVW5ob3ZlckVsZW1lbnRQYXJhbXMsXG4gIFdhaXRVbnRpbFBhcmFtc1xufSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4uY2pzJztcbmltcG9ydCB0eXBlIHsgR2VuZXJhdGVGdW5jdGlvbkNhbGxQYXJhbXMgfSBmcm9tICcuL2dlbmVyYXRlLWZ1bmN0aW9uLWNhbGwuY2pzJztcbmltcG9ydCB0eXBlIHsgTGliUmVzb2x2ZXIgfSBmcm9tICcuL2xpYi1yZWdpc3RyeS5janMnO1xuaW1wb3J0IHR5cGUge1xuICBPYnNpZGlhblRyYW5zcG9ydCxcbiAgVHJhbnNwb3J0RXZhbE9wdGlvbnNcbn0gZnJvbSAnLi90cmFuc3BvcnQuY2pzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVGdW5jdGlvbkNhbGwgfSBmcm9tICcuL2dlbmVyYXRlLWZ1bmN0aW9uLWNhbGwuY2pzJztcbmltcG9ydCB7XG4gIGdldEJvb3RzdHJhcFZlcnNpb24sXG4gIGdldFJlZ2lzdGVyZWRMaWJSZXNvbHZlcnNcbn0gZnJvbSAnLi9saWItcmVnaXN0cnkuY2pzJztcbmltcG9ydCB7XG4gIE1PQklMRV9JTlBVVF9CSU5ESU5HX05BTUUsXG4gIE1PQklMRV9JTlBVVF9USU1FT1VUX0lOX01JTExJU0VDT05EU1xufSBmcm9tICcuL21vYmlsZS1pbnB1dC5janMnO1xuXG5pbnRlcmZhY2UgQm9vdHN0cmFwTmFtZXNwYWNlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBob3N0LWluc3RhbGxlZCBgUnVudGltZS5hZGRCaW5kaW5nYCBmdW5jdGlvbiB0aGUgbW9iaWxlIHRydXN0ZWQtaW5wdXQgcGF0aCBjYWxscy5cbiAgICpcbiAgICogUGFzc2VkIGluIGFzIGRhdGEgYmVjYXVzZSB0aGUgYm9vdHN0cmFwIGNsb3N1cmUgbWF5IG5vdCByZWFkIG91dGVyIHNjb3BlICgqKkwxNSoqKSwgc28gaXQgY2Fubm90XG4gICAqIGltcG9ydCB7QGxpbmsgTU9CSUxFX0lOUFVUX0JJTkRJTkdfTkFNRX0gZGlyZWN0bHkuXG4gICAqL1xuICByZWFkb25seSBpbnB1dEJpbmRpbmdOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEhvdyBsb25nIHRoZSBtb2JpbGUgdHJ1c3RlZC1pbnB1dCBwYXRoIHdhaXRzIGZvciB0aGUgaG9zdCB0byBhbnN3ZXIgb25lIHJlcXVlc3QuXG4gICAqL1xuICByZWFkb25seSBpbnB1dFRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIHJlYWRvbmx5IGxpYlJlc29sdmVyczogTGliUmVzb2x2ZXJbXTtcbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEVuc3VyZXMgdGhlIGB3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZ2AgbmFtZXNwYWNlIGlzIGJvb3RzdHJhcHBlZFxuICogaW4gdGhlIE9ic2lkaWFuIHByb2Nlc3Mgd2l0aCB0aGUgY3VycmVudCBsaWJyYXJ5IHZlcnNpb24uXG4gKlxuICogUGVyZm9ybXMgYSBsaWdodHdlaWdodCB2ZXJzaW9uIGNoZWNrIHZpYSB0aGUgdHJhbnNwb3J0LiBJZiB0aGUgbmFtZXNwYWNlXG4gKiBkb2Vzbid0IGV4aXN0IG9yIGhhcyBhIGRpZmZlcmVudCB2ZXJzaW9uLCBzZW5kcyB0aGUgZnVsbCBib290c3RyYXAgZXhwcmVzc2lvblxuICogdG8gcmVnaXN0ZXIgYWxsIGhlbHBlciBmdW5jdGlvbnMuXG4gKlxuICogQHBhcmFtIHRyYW5zcG9ydCAtIFRoZSB0cmFuc3BvcnQgdG8gdXNlIGZvciBldmFsdWF0aW9uLlxuICogQHBhcmFtIGN3ZCAtIFRoZSB3b3JraW5nIGRpcmVjdG9yeSAodmF1bHQgcGF0aCkuXG4gKiBAcGFyYW0gdGltZW91dEluTWlsbGlzZWNvbmRzIC0gT3B0aW9uYWwgcGVyLWV2YWwgdGltZW91dC4gRm9yd2FyZGVkIHRvIGJvdGhcbiAqICAgdGhlIHZlcnNpb24gY2hlY2sgYW5kIHRoZSBib290c3RyYXAgZXZhbCBzbyBhIGh1bmcgYG9ic2lkaWFuIGV2YWxgIHJlamVjdHNcbiAqICAgaW5zdGVhZCBvZiBibG9ja2luZyB0aGUgY2FsbGVyIGluZGVmaW5pdGVseS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCh0cmFuc3BvcnQ6IE9ic2lkaWFuVHJhbnNwb3J0LCBjd2Q6IHN0cmluZywgdGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGV2YWxPcHRpb25zOiBUcmFuc3BvcnRFdmFsT3B0aW9ucyA9IHtcbiAgICBjd2QsXG4gICAgLi4uKHRpbWVvdXRJbk1pbGxpc2Vjb25kcyAhPT0gdW5kZWZpbmVkICYmIHsgdGltZW91dEluTWlsbGlzZWNvbmRzIH0pXG4gIH07XG4gIGNvbnN0IGJvb3RzdHJhcFZlcnNpb24gPSBnZXRCb290c3RyYXBWZXJzaW9uKCk7XG4gIGNvbnN0IHZlcnNpb25Kc29uID0gSlNPTi5zdHJpbmdpZnkoYm9vdHN0cmFwVmVyc2lvbik7XG4gIGNvbnN0IHZlcnNpb25NYXRjaEpzb24gPSBhd2FpdCB0cmFuc3BvcnQuZXZhbHVhdGUoXG4gICAgYEpTT04uc3RyaW5naWZ5KHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nPy52ZXJzaW9uID09PSAke3ZlcnNpb25Kc29ufSlgLFxuICAgIGV2YWxPcHRpb25zXG4gICk7XG5cbiAgaWYgKHZlcnNpb25NYXRjaEpzb24gPT09ICd0cnVlJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGJvb3RzdHJhcEV4cHJlc3Npb24gPSBnZW5lcmF0ZUZ1bmN0aW9uQ2FsbChib290c3RyYXBOYW1lc3BhY2UsIHtcbiAgICBpbnB1dEJpbmRpbmdOYW1lOiBNT0JJTEVfSU5QVVRfQklORElOR19OQU1FLFxuICAgIGlucHV0VGltZW91dEluTWlsbGlzZWNvbmRzOiBNT0JJTEVfSU5QVVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgbGliUmVzb2x2ZXJzOiBbLi4uZ2V0UmVnaXN0ZXJlZExpYlJlc29sdmVycygpXSxcbiAgICB2ZXJzaW9uOiBib290c3RyYXBWZXJzaW9uXG4gIH0pO1xuICBhd2FpdCB0cmFuc3BvcnQuZXZhbHVhdGUoYm9vdHN0cmFwRXhwcmVzc2lvbiwgZXZhbE9wdGlvbnMpO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gU2VyaWFsaXplZCB2aWEgdG9TdHJpbmcoKSBhbmQgZXhlY3V0ZWQgaW5zaWRlIHRoZSBPYnNpZGlhbiBwcm9jZXNzLCBub3QgaW4gTm9kZS4gQ292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cy4gKi9cblxuLyoqXG4gKiBCb290c3RyYXBzIHRoZSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIG5hbWVzcGFjZSB3aXRoIGFsbFxuICogaGVscGVyIGZ1bmN0aW9ucy4gU2VyaWFsaXplZCB2aWEgYHRvU3RyaW5nKClgIGFuZCBzZW50IHRvIE9ic2lkaWFuIG9uY2VcbiAqIHBlciBsaWJyYXJ5IHZlcnNpb24uXG4gKlxuICogUHJlc2VydmVzIGBjb250ZXh0c2AgYWNyb3NzIHZlcnNpb24gdXBncmFkZXMgc28gbGl2ZSB7QGxpbmsgQ29udGV4dElkfVxuICogcmVmZXJlbmNlcyBzdXJ2aXZlLlxuICpcbiAqIE11c3QgTk9UIHJlZmVyZW5jZSBhbnkgb3V0ZXIgc2NvcGUgXHUyMDE0IGl0IGlzIHNlcmlhbGl6ZWQgdmlhIGB0b1N0cmluZygpYC5cbiAqXG4gKiBAcGFyYW0gYm9vdHN0cmFwUGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgaW5jbHVkaW5nIHRoZSBsaWJyYXJ5IHZlcnNpb24uXG4gKi9cbmZ1bmN0aW9uIGJvb3RzdHJhcE5hbWVzcGFjZShib290c3RyYXBQYXJhbXM6IEdlbmVyYXRlRnVuY3Rpb25DYWxsUGFyYW1zPEJvb3RzdHJhcE5hbWVzcGFjZVBhcmFtcz4pOiB2b2lkIHtcbiAgaW50ZXJmYWNlIEludGVncmF0aW9uVGVzdGluZ0hvbGRlciB7XG4gICAgX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZzogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGU7XG4gIH1cblxuICBpbnRlcmZhY2UgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGUge1xuICAgIGNvbnRleHRzOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG4gICAgbGliUmVzb2x2ZXJzOiBMaWJSZXNvbHZlcltdO1xuICAgIG9ic2lkaWFuTW9kdWxlPzogdW5rbm93bjtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH1cblxuICBpbnRlcmZhY2UgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlIGV4dGVuZHMgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGUge1xuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cml2aWFsIFx1MjAxNCByZWFkc1xuICAgICAqIGB3aW5kb3cuYXBwYCwgd2hpY2ggZXZlcnkgY2xvc3VyZSBhbHJlYWR5IHJlY2VpdmVzIGRpcmVjdGx5IGFzIGl0cyBgYXBwYFxuICAgICAqIGFyZywgc28gdGhlcmUgaXMgbm90aGluZyBnZW5lcmFsLXB1cnBvc2UgdG8gc2hhcmUuXG4gICAgICovXG4gICAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgICAvKipcbiAgICAgKiBJbnRlbnRpb25hbGx5IE5PVCBtaWdyYXRlZCB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYDogdHJhbnNwb3J0LW9ubHkuIEl0XG4gICAgICogb3ducyB0aGUgaGFybmVzcyB0ZXN0IHdpbmRvdydzIGxpZmVjeWNsZSB2aWEgRWxlY3Ryb24gKGB3aW5kb3cuZWxlY3Ryb25XaW5kb3dgKSxcbiAgICAgKiB3aGljaCBpcyB0aGUgaGFybmVzcydzIGNvbmNlcm4sIG5vdCBhIGdlbmVyYWwgdXRpbGl0eS5cbiAgICAgKi9cbiAgICBkZXN0cm95Q3VycmVudFdpbmRvdygpOiBQcm9taXNlPHZvaWQ+O1xuXG4gICAgLyoqXG4gICAgICogU3luY2VkIHdpdGggYG9ic2lkaWFuLWRldi11dGlsc2AgKG1pcnJvciBgd29ya3NwYWNlLnRzYCkgXHUyMDE0IHNlZSBMMTcuXG4gICAgICovXG4gICAgZW5zdXJlTGF5b3V0UmVhZHkoKTogUHJvbWlzZTx2b2lkPjtcblxuICAgIC8qKlxuICAgICAqIFN5bmNlZCB3aXRoIGBvYnNpZGlhbi1kZXYtdXRpbHNgIChtaXJyb3IgYGVycm9yLnRzYCkgXHUyMDE0IHNlZSBMMTcuXG4gICAgICovXG4gICAgZXJyb3JUb1N0cmluZyhlcnJvcjogdW5rbm93bik6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cmFuc3BvcnQtb25seS4gVGhpc1xuICAgICAqIGlzIHRoZSBoYXJuZXNzJ3Mgb3duIGV2YWwgcGx1bWJpbmcgKGJ1aWxkcyB0aGUgYGxpYmAgYmFnLCByZXNvbHZlcyB0aGVcbiAgICAgKiBtb2R1bGUsIGludm9rZXMgdGhlIGNsb3N1cmUsIGVudmVsb3BlcyB0aGUgcmVzdWx0KSBcdTIwMTQgbWVhbmluZ2xlc3Mgb3V0c2lkZVxuICAgICAqIHRoZSBoYXJuZXNzLlxuICAgICAqL1xuICAgIGV2YWxXcmFwcGVyKG5zUGFyYW1zOiBFdmFsV3JhcHBlclBhcmFtcyk6IFByb21pc2U8c3RyaW5nPjtcblxuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cmFuc3BvcnQtb25seS4gSXQgaXNcbiAgICAgKiB0aGUgaGFybmVzcydzIG9uZS10aW1lIGJvb3RzdHJhcCB0aGF0IHJlc29sdmVzIHRoZSBgb2JzaWRpYW5gIG1vZHVsZSBmb3JcbiAgICAgKiB0aGUgcHJvY2VzczsgY2xvc3VyZXMgb2J0YWluIGl0IGRpcmVjdGx5IHZpYSB0aGVpciBgb2JzaWRpYW5Nb2R1bGVgIGFyZy5cbiAgICAgKi9cbiAgICBnZXRPYnNpZGlhbk1vZHVsZSgpOiBQcm9taXNlPHVua25vd24+O1xuXG4gICAgLyoqXG4gICAgICogSW50ZW50aW9uYWxseSBOT1QgbWlncmF0ZWQgdG8gYG9ic2lkaWFuLWRldi11dGlsc2A6IHRyYW5zcG9ydC1vbmx5LiBSYXdcbiAgICAgKiBFbGVjdHJvbiBJUEMgKGB3aW5kb3cuZWxlY3Ryb24uaXBjUmVuZGVyZXIuc2VuZFN5bmNgKSBpcyBhIGhhcm5lc3MvdHJhbnNwb3J0XG4gICAgICogcHJpbWl0aXZlLCBub3QgYSBnZW5lcmFsLXB1cnBvc2UgaGVscGVyLlxuICAgICAqL1xuICAgIGlwY1NlbmRTeW5jKG5zUGFyYW1zOiBJcGNTZW5kU3luY1BhcmFtcyk6IFByb21pc2U8dm9pZD47XG5cbiAgICAvKipcbiAgICAgKiBJbnRlbnRpb25hbGx5IE5PVCBtaWdyYXRlZCB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYDogdHJhbnNwb3J0LW9ubHkuIEl0IGlzXG4gICAgICogcGFydCBvZiB0aGUgaGFybmVzcydzIHZhdWx0LXBhdGggaGFuZHNoYWtlIHdpdGggdGhlIE5vZGUgc2lkZSwgbm90IGFcbiAgICAgKiBnZW5lcmFsIHV0aWxpdHkuXG4gICAgICovXG4gICAgcG9sbFZhdWx0QmFzZVBhdGgoKTogUHJvbWlzZTxzdHJpbmc+O1xuXG4gICAgLyoqXG4gICAgICogSW50ZW50aW9uYWxseSBOT1QgbWlncmF0ZWQgdG8gYG9ic2lkaWFuLWRldi11dGlsc2A6IHRyYW5zcG9ydC1vbmx5LiBJdCBpcyB0aGUgcmVuZGVyZXIgZW5kIG9mIHRoZVxuICAgICAqIG1vYmlsZSB0cnVzdGVkLWlucHV0IGNoYW5uZWwgKCoqTDM5KiopIFx1MjAxNCB0aGUgaG9zdCBjYWxscyBpdCBvdmVyIENEUCB0byBhbnN3ZXIgYSByZXF1ZXN0IHRoaXNcbiAgICAgKiBjbG9zdXJlIGlzIGF3YWl0aW5nLCBzbyBpdCBpcyBtZWFuaW5nbGVzcyBvdXRzaWRlIHRoZSBoYXJuZXNzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGlkIC0gVGhlIHJlcXVlc3QgaWQgYmVpbmcgYW5zd2VyZWQuXG4gICAgICogQHBhcmFtIGVycm9yTWVzc2FnZSAtIFdoeSB0aGUgaW5qZWN0aW9uIGZhaWxlZCwgb3IgYG51bGxgIG9uIHN1Y2Nlc3MuXG4gICAgICovXG4gICAgcmVzb2x2ZUlucHV0KGlkOiBzdHJpbmcsIGVycm9yTWVzc2FnZTogbnVsbCB8IHN0cmluZyk6IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiBJbnRlbnRpb25hbGx5IE5PVCBtaWdyYXRlZCB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYDogbmljaGUvdHJpdmlhbCBcdTIwMTQgYVxuICAgICAqIG9uZS1saW5lIGBsb2NhbFN0b3JhZ2Uuc2V0SXRlbWAgd3JhcHBlciB1c2VkIG9ubHkgYnkgdGhlIGhhcm5lc3MuXG4gICAgICovXG4gICAgc2V0TG9jYWxTdG9yYWdlSXRlbShuc1BhcmFtczogU2V0TG9jYWxTdG9yYWdlSXRlbVBhcmFtcyk6IFByb21pc2U8dm9pZD47XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZGVsaWJlcmF0ZSBzZWFtIGBvYnNpZGlhbi1kZXYtdXRpbHNgIHJlYWRzIG9uIG1vYmlsZSBcdTIwMTQgdGhlIG9uZSBuYW1lc3BhY2UgbWVtYmVyIHRoYXQgZXhpc3RzIGZvclxuICAgICAqIGFub3RoZXIgcGFja2FnZSByYXRoZXIgdGhhbiBmb3IgdGhlIGhhcm5lc3MuIEl0cyAqKkwxNyoqIG1pcnJvciAoYGRlc2t0b3AtdHJ1c3RlZC1pbnB1dC50c2ApIGNhblxuICAgICAqIHJlYWNoIGEgdHJ1c3RlZCBldmVudCBvbiBkZXNrdG9wIGJ5IGl0c2VsZiwgYnV0IG9uIG1vYmlsZSB0aGUgaW5qZWN0aW9uIGhhcyB0byBjb21lIGZyb20gdGhlIE5vZGVcbiAgICAgKiBzaWRlIG92ZXIgdGhlIGhhcm5lc3MncyBDRFAgY2hhbm5lbCAoKipMMzkqKiksIGFuZCBgb2JzaWRpYW4tZGV2LXV0aWxzYCBtdXN0IG5ldmVyIGltcG9ydCB0aGlzXG4gICAgICogcGFja2FnZSBhdCBydW50aW1lIChpdHMgb3duIHBlZXItZGVwZW5kZW5jeSBydWxlKS4gU28gaXQgcmVhZHMgdGhlc2Ugb2ZmXG4gICAgICogYHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nYCBpbnN0ZWFkLCBkZWNsYXJpbmcgdGhlIHNoYXBlIGxvY2FsbHkuXG4gICAgICpcbiAgICAgKiBUaGVzZSBhcmUgdGhlICoqc2FtZSBmdW5jdGlvbiBvYmplY3RzKiogYGV2YWxXcmFwcGVyYCBwdXRzIGluIGEgY2xvc3VyZSdzIGBsaWJgIGJhZywgbm90IHdyYXBwZXJzOlxuICAgICAqIGVhY2ggYWxyZWFkeSBicmFuY2hlcyBvbiBgUGxhdGZvcm0uaXNNb2JpbGVgIGludGVybmFsbHksIHNvIHRoZSBtb2JpbGUgc2VtYW50aWNzIGxpdmUgaW4gZXhhY3RseSBvbmVcbiAgICAgKiBwbGFjZSBhbmQgb25lIHNlYW0gc2VydmVzIGJvdGggcGxhdGZvcm1zLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHRydXN0ZWRJbnB1dDogVHJ1c3RlZElucHV0SGVscGVycztcbiAgfVxuXG4gIGludGVyZmFjZSBFdmFsV3JhcHBlclBhcmFtcyB7XG4gICAgY2FsbGJhY2soZnVuY3Rpb25Bcmd1bWVudHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdW5rbm93bjtcbiAgICByZWFkb25seSBjb250ZXh0SWQ/OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgaW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9XG5cbiAgaW50ZXJmYWNlIEZpbGVTeXN0ZW1BZGFwdGVyTGlrZSB7XG4gICAgYmFzZVBhdGg/OiBzdHJpbmc7XG4gICAgZ2V0QmFzZVBhdGg/OiAoKSA9PiBzdHJpbmc7XG4gIH1cblxuICBpbnRlcmZhY2UgSXBjU2VuZFN5bmNQYXJhbXMge1xuICAgIHJlYWRvbmx5IGNoYW5uZWw6IHN0cmluZztcbiAgICByZWFkb25seSBjaGFubmVsQXJndW1lbnRzOiB1bmtub3duW107XG4gIH1cblxuICAvLyBDb21tdW5pdHktcGx1Z2luIEFQSSBtZW1iZXJzIHRoYXQgb2xkIE9ic2lkaWFuIHZlcnNpb25zIChlLmcuIDAuNi54KSBsYWNrLlxuICAvLyBgb2JzaWRpYW4tdHlwaW5nc2AgZGVjbGFyZXMgdGhlbSBhcyBhbHdheXMtcHJlc2VudCwgc28gcHJvYmUgdGhyb3VnaCB0aGlzXG4gIC8vIE9wdGlvbmFsLW1lbWJlciB2aWV3IHRvIGRldGVjdCB0aGVpciBydW50aW1lIGFic2VuY2Ugd2l0aG91dCBhIGZhbHNlXG4gIC8vIGBuby11bm5lY2Vzc2FyeS1jb25kaXRpb25gLlxuICBpbnRlcmZhY2UgUGx1Z2luc0xpa2Uge1xuICAgIGlzRW5hYmxlZD86ICgpID0+IGJvb2xlYW47XG4gICAgbG9hZFBsdWdpbj86IChpZDogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAgIG1hbmlmZXN0cz86IHVua25vd247XG4gICAgdW5pbnN0YWxsUGx1Z2luPzogKGlkOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD47XG4gIH1cblxuICBpbnRlcmZhY2UgU2V0TG9jYWxTdG9yYWdlSXRlbVBhcmFtcyB7XG4gICAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgdmFsdWU6IHN0cmluZztcbiAgfVxuXG4gIC8vIFRoZSBzaGFwZSBvZiB0aGUgYHRydXN0ZWRJbnB1dGAgc2VhbS4gRXZlcnkgbWVtYmVyIGlzIG9uZSBvZiB0aGUgTDE3LXN5bmNlZCBoZWxwZXJzLCBleHBvc2VkIGFzIHRoZVxuICAvLyBTYW1lIGZ1bmN0aW9uIG9iamVjdCBgZXZhbFdyYXBwZXJgIHB1dHMgaW4gYSBjbG9zdXJlJ3MgYGxpYmAgYmFnLlxuICBpbnRlcmZhY2UgVHJ1c3RlZElucHV0SGVscGVycyB7XG4gICAgY2xpY2tFbGVtZW50KGNsaWNrUGFyYW1zOiBDbGlja0VsZW1lbnRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+O1xuICAgIGNsaWNrTW91c2UoY2xpY2tQYXJhbXM6IENsaWNrTW91c2VQYXJhbXMpOiBQcm9taXNlPHZvaWQ+O1xuICAgIGhvdmVyRWxlbWVudChob3ZlclBhcmFtczogSG92ZXJFbGVtZW50UGFyYW1zKTogUHJvbWlzZTx2b2lkPjtcbiAgICBtb3ZlTW91c2UobW92ZVBhcmFtczogTW92ZU1vdXNlUGFyYW1zKTogUHJvbWlzZTx2b2lkPjtcbiAgICBwcmVzc0tleShwcmVzc1BhcmFtczogUHJlc3NLZXlQYXJhbXMpOiBQcm9taXNlPHZvaWQ+O1xuICAgIHR5cGVJbnRvRWRpdG9yKHR5cGVQYXJhbXM6IFR5cGVJbnRvRWRpdG9yUGFyYW1zKTogUHJvbWlzZTx2b2lkPjtcbiAgICB1bmhvdmVyRWxlbWVudCh1bmhvdmVyUGFyYW1zOiBVbmhvdmVyRWxlbWVudFBhcmFtcyk6IFByb21pc2U8dm9pZD47XG4gIH1cblxuICAvLyBgVmF1bHQuY29uZmlnRGlyYCBpcyBkZWNsYXJlZCBhbHdheXMtcHJlc2VudCBieSBgb2JzaWRpYW4tdHlwaW5nc2AsIGJ1dCBvbGRcbiAgLy8gT2JzaWRpYW4gdmVyc2lvbnMgKGUuZy4gMC45LjEwKSBsZWF2ZSBpdCB1bmRlZmluZWQgYXQgcnVudGltZS4gUHJvYmUgdGhyb3VnaFxuICAvLyBUaGlzIG9wdGlvbmFsLW1lbWJlciB2aWV3IHNvIGEgYD8/ICcub2JzaWRpYW4nYCBkZWZhdWx0IGlzIG5vdCBmbGFnZ2VkIGFzIGFuXG4gIC8vIFVubmVjZXNzYXJ5IGNvbmRpdGlvbi5cbiAgaW50ZXJmYWNlIFZhdWx0TGlrZSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbmFtZS1yZXBsYWNlbWVudHMgLS0gU3RydWN0dXJhbCBtaXJyb3Igb2YgT2JzaWRpYW4ncyBvd24gYFZhdWx0LmNvbmZpZ0RpcmA7IHRoZSBuYW1lIGhhcyB0byBtYXRjaCBmb3IgdGhlIHByb2JlIHRvIHJlYWQgaXQuXG4gICAgY29uZmlnRGlyPzogc3RyaW5nO1xuICB9XG5cbiAgLy8gYHdpbmRvdy5hcHBgIC8gYGFwcC53b3Jrc3BhY2VgIGFyZSBkZWNsYXJlZCBhbHdheXMtcHJlc2VudCwgYnV0IGFyZSB0cmFuc2llbnRseVxuICAvLyBVbmRlZmluZWQgZHVyaW5nIGJvb3QgYW5kIGFmdGVyIGFuIG93bmVkLXdpbmRvdyByZWxvYWQuIFByb2JlIHRocm91Z2ggdGhlc2VcbiAgLy8gT3B0aW9uYWwtbWVtYmVyIHZpZXdzIHNvIHRoZSByZWFkaW5lc3MgY2hlY2sgY2FuIGd1YXJkIHRoZW0gd2l0aG91dCBhIGZhbHNlXG4gIC8vIGBuby11bm5lY2Vzc2FyeS1jb25kaXRpb25gLlxuICBpbnRlcmZhY2UgV29ya3NwYWNlTGlrZSB7XG4gICAgbGF5b3V0UmVhZHk/OiBib29sZWFuO1xuICB9XG5cbiAgaW50ZXJmYWNlIEFwcExpa2Uge1xuICAgIHdvcmtzcGFjZT86IFdvcmtzcGFjZUxpa2U7XG4gIH1cblxuICB0eXBlIEN1cnJlbnRXZWJDb250ZW50cyA9IFJldHVyblR5cGU8V2luZG93WydlbGVjdHJvbiddWydyZW1vdGUnXVsnZ2V0Q3VycmVudFdlYkNvbnRlbnRzJ10+O1xuXG4gIC8vIFRoZSBFbGVjdHJvbiBtb2RpZmllci1rZXkgbmFtZXMgYHNlbmRJbnB1dEV2ZW50YCBhY2NlcHRzIChlLmcuICdtZXRhJywgJ2NvbnRyb2wnLCAnc2hpZnQnLCAnYWx0JykuXG4gIC8vIERlcml2ZWQgZnJvbSB0aGUgd2ViLWNvbnRlbnRzIHR5cGUgc28gaXQgc3RheXMgaW4gc3luYyB3aXRoIHRoZSBFbGVjdHJvbiB0eXBpbmdzLlxuICB0eXBlIEVsZWN0cm9uTW9kaWZpZXIgPSBOb25OdWxsYWJsZTxQYXJhbWV0ZXJzPEN1cnJlbnRXZWJDb250ZW50c1snc2VuZElucHV0RXZlbnQnXT5bMF1bJ21vZGlmaWVycyddPltudW1iZXJdO1xuXG4gIGludGVyZmFjZSBPYnNpZGlhbk1vZHVsZVdpdGhQbGF0Zm9ybSB7XG4gICAgUGxhdGZvcm06IE9ic2lkaWFuUGxhdGZvcm07XG4gIH1cblxuICBpbnRlcmZhY2UgT2JzaWRpYW5QbGF0Zm9ybSB7XG4gICAgaXNNYWNPUzogYm9vbGVhbjtcbiAgICBpc01vYmlsZTogYm9vbGVhbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHRydXN0ZWQtaW5wdXQgcmVxdWVzdCBoYW5kZWQgdG8gdGhlIGhvc3Qgb3ZlciB0aGUgYFJ1bnRpbWUuYWRkQmluZGluZ2AgY2hhbm5lbC5cbiAgICpcbiAgICogU3RydWN0dXJhbGx5IGlkZW50aWNhbCB0byBgTW9iaWxlSW5wdXRSZXF1ZXN0YCBpbiBgbW9iaWxlLWlucHV0LnRzYCwgcmVkZWNsYXJlZCBoZXJlIGJlY2F1c2UgdGhpc1xuICAgKiBjbG9zdXJlIGlzIHNlcmlhbGl6ZWQgdmlhIGB0b1N0cmluZygpYCBhbmQgY2Fubm90IGltcG9ydCAoKipMMTUqKikuIFRoZSB0d28gYXJlIG9uZSB3aXJlIGZvcm1hdDsgY2hhbmdlXG4gICAqIHRoZW0gdG9nZXRoZXIuXG4gICAqL1xuICB0eXBlIE1vYmlsZUlucHV0UmVxdWVzdCA9IE1vYmlsZUtleUlucHV0UmVxdWVzdCB8IE1vYmlsZVBvaW50ZXJJbnB1dFJlcXVlc3Q7XG5cbiAgaW50ZXJmYWNlIE1vYmlsZUtleUlucHV0UmVxdWVzdCB7XG4gICAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkga2luZDogJ2tleSc7XG4gICAgcmVhZG9ubHkgbW9kaWZpZXJzOiByZWFkb25seSBzdHJpbmdbXTtcbiAgfVxuXG4gIGludGVyZmFjZSBNb2JpbGVQb2ludGVySW5wdXRSZXF1ZXN0IHtcbiAgICByZWFkb25seSBraW5kOiAnbG9uZ1ByZXNzJyB8ICd0YXAnO1xuICAgIHJlYWRvbmx5IG1vZGlmaWVyczogcmVhZG9ubHkgc3RyaW5nW107XG4gICAgcmVhZG9ubHkgeDogbnVtYmVyO1xuICAgIHJlYWRvbmx5IHk6IG51bWJlcjtcbiAgfVxuXG4gIGludGVyZmFjZSBQZW5kaW5nSW5wdXQge1xuICAgIHJlamVjdChlcnJvcjogRXJyb3IpOiB2b2lkO1xuICAgIHJlc29sdmUoKTogdm9pZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxheSAoaW4gbXMpIGJlZm9yZSBpbnZva2luZyBgZWxlY3Ryb25XaW5kb3cuZGVzdHJveSgpYCBzbyB0aGUgZXZhbCB0aGF0XG4gICAqIHRyaWdnZXJlZCB0aGUgY2FsbCBoYXMgdGltZSB0byByZXR1cm4gaXRzIHJlc3VsdCB0byB0aGUgY2FsbGVyLiBXaXRob3V0XG4gICAqIGl0IHRoZSByZW5kZXJlciBkaWVzIGJlZm9yZSB0aGUgSVBDIHJlcGx5IHNoaXBzLCB0aGUgY2FsbGVyIHdhaXRzIGZvciB0aGVcbiAgICogZnVsbCBldmFsIHRpbWVvdXQsIGFuZCBzdGFsZSBgQnJvd3NlcldpbmRvd2AgZW50cmllcyBwaWxlIHVwLlxuICAgKi9cbiAgY29uc3QgREVTVFJPWV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMgPSA1MDtcblxuICAvKipcbiAgICogSW50ZXJ2YWwgKGluIG1zKSBiZXR3ZWVuIHBvbGxzIHdoaWxlIHdhaXRpbmcgZm9yIGEgdHJ1c3RlZCBpbnB1dCBldmVudCB0b1xuICAgKiB0YWtlIGVmZmVjdCAodGhlIGVkaXRvciBkb2N1bWVudCB1cGRhdGVzLCBvciBhbiBlbGVtZW50J3MgYDpob3ZlcmAgc3RhdGVcbiAgICogZmxpcHMpLiBTaGFyZWQgYnkgZXZlcnkgdHJ1c3RlZC1pbnB1dCBoZWxwZXIuXG4gICAqL1xuICBjb25zdCBJTlBVVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwO1xuXG4gIC8qKlxuICAgKiBNYXhpbXVtIHRpbWUgKGluIG1zKSB0byB3YWl0IGZvciBhIHRydXN0ZWQgaW5wdXQgZXZlbnQgdG8gdGFrZSBlZmZlY3RcbiAgICogYmVmb3JlIGdpdmluZyB1cCAodGhlIGV4cGVjdGVkIG91dGNvbWUgd2hlbiB0aGUgaW5wdXQgaXMgcmVqZWN0ZWQgXHUyMDE0IGUuZy4gYVxuICAgKiByZWFkLW9ubHkgZWRpdG9yLCBvciBhIHBvaW50ZXIgbW92ZSB0aGF0IG5ldmVyIGxhbmRzIG9uIHRoZSBlbGVtZW50KS5cbiAgICovXG4gIGNvbnN0IElOUFVUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcblxuICAvKipcbiAgICogRGVmYXVsdCBtYXhpbXVtIHRpbWUgKGluIG1zKSB7QGxpbmsgb3BlblNldHRpbmdzVGFifSB3YWl0cyBmb3IgdGhlIHNldHRpbmdzXG4gICAqIG1vZGFsIHRvIG9wZW4gYW5kIGZvciB0aGUgcmVxdWVzdGVkIHRhYiB0byByZW5kZXIsIHdoZW4gdGhlIGNhbGxlciBkb2VzIG5vdFxuICAgKiBvdmVycmlkZSBpdC5cbiAgICovXG4gIGNvbnN0IFNFVFRJTkdTX1RBQl9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgaW50ZXJ2YWwgKGluIG1zKSBiZXR3ZWVuIHtAbGluayB3YWl0VW50aWx9IHByZWRpY2F0ZSBjaGVja3Mgd2hlbiB0aGVcbiAgICogY2FsbGVyIGRvZXMgbm90IG92ZXJyaWRlIGl0LlxuICAgKi9cbiAgY29uc3QgV0FJVF9VTlRJTF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IG1heGltdW0gdGltZSAoaW4gbXMpIHtAbGluayB3YWl0VW50aWx9IHdhaXRzIGZvciBpdHMgcHJlZGljYXRlIHRvXG4gICAqIGJlY29tZSB0cnV0aHkgYmVmb3JlIHJlamVjdGluZywgd2hlbiB0aGUgY2FsbGVyIGRvZXMgbm90IG92ZXJyaWRlIGl0LlxuICAgKi9cbiAgY29uc3QgV0FJVF9VTlRJTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5cbiAgLyoqXG4gICAqIEhvdyBtYW55IHRpbWVzIHtAbGluayBjcmVhdGVOb3RlfSByZXdyaXRlcyBhIG5vdGUgd2hvc2UgY29udGVudCBkaWQgbm90XG4gICAqIHJlYWNoIHRoZSBmaWxlc3lzdGVtIGJlZm9yZSBnaXZpbmcgdXAuXG4gICAqXG4gICAqIFRoZSBBbmRyb2lkIGVtdWxhdG9yIGxvc2VzIHJvdWdobHkgMSB3cml0ZSBpbiAxMTAsIHNvIGEgc2luZ2xlIHJlcGFpclxuICAgKiBhbHJlYWR5IG1ha2VzIGEgbG9zdCBub3RlIGFzdHJvbm9taWNhbGx5IHVubGlrZWx5OyB0aGUgZXh0cmEgYXR0ZW1wdHMgY29zdFxuICAgKiBub3RoaW5nIHdoZW4gbm90aGluZyBpcyBsb3N0LCBhbmQgdGhlIGNhcCBpcyB3aGF0IGtlZXBzIGEgZ2VudWluZWx5IGJyb2tlblxuICAgKiB3cml0ZSBmcm9tIGJlaW5nIHJldHJpZWQgZm9yZXZlciBpbnN0ZWFkIG9mIGZhaWxpbmcgd2l0aCBhIHJlYWRhYmxlIGVycm9yLlxuICAgKi9cbiAgY29uc3QgQ1JFQVRFX05PVEVfUkVQQUlSX0FUVEVNUFRfQ09VTlQgPSAzO1xuXG4gIC8qKlxuICAgKiBQcmVmaXggdXNlZCBieSB7QGxpbmsgZXJyb3JUb1N0cmluZ30ncyBuZXN0ZWQtZXJyb3Igc2VwYXJhdG9yIGxpbmVzLCBtYXRjaGluZ1xuICAgKiB0aGUgYCAgICBhdGAgcHJlZml4IG9mIGEgVjggc3RhY2stdHJhY2UgZnJhbWUgc28gdGhlIHNlcGFyYXRvcnMgYmxlbmQgaW50b1xuICAgKiB0aGUgc3Vycm91bmRpbmcgc3RhY2suIEtlcHQgaWRlbnRpY2FsIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgJyBgZXJyb3JUb1N0cmluZ2AuXG4gICAqL1xuICBjb25zdCBTVEFDS19UUkFDRV9QUkVGSVggPSAnICAgIGF0JztcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXggLS0gQXBwcm92ZWQgZG91YmxlIGNhc3Q6IGBfX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nYCBpcyBvdXIgaW50ZXJuYWwgV2luZG93IGF1Z21lbnRhdGlvbiwgaW50ZW50aW9uYWxseSBrZXB0IGxvY2FsIChub3QgZGVjbGFyZWQgZ2xvYmFsbHkpIHRvIGF2b2lkIGxlYWtpbmcgaW50byBjb25zdW1lciB0eXBlcy5cbiAgY29uc3QgaG9sZGVyID0gZ2xvYmFsVGhpcyBhcyB1bmtub3duIGFzIFBhcnRpYWw8SW50ZWdyYXRpb25UZXN0aW5nSG9sZGVyPjtcbiAgY29uc3QgZXhpc3RpbmdDb250ZXh0cyA9IGhvbGRlci5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nPy5jb250ZXh0cyA/PyB7fTtcbiAgY29uc3QgZXhpc3RpbmdPYnNpZGlhbk1vZHVsZSA9IGhvbGRlci5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nPy5vYnNpZGlhbk1vZHVsZTtcbiAgLy8gV2FybiBhdCBtb3N0IG9uY2UgcGVyIGJvb3RzdHJhcCB0aGF0IGBvYnNpZGlhbk1vZHVsZWAgaXMgYG51bGxgIG9uIHRoaXMgdmVyc2lvbi5cbiAgbGV0IGhhc1dhcm5lZE1pc3NpbmdPYnNpZGlhbk1vZHVsZSA9IGZhbHNlO1xuXG4gIC8vIEluLWZsaWdodCBtb2JpbGUgaW5wdXQgcmVxdWVzdHMsIGtleWVkIGJ5IHJlcXVlc3QgaWQsIGF3YWl0aW5nIHRoZSBob3N0J3MgYW5zd2VyIHZpYSBgcmVzb2x2ZUlucHV0YC5cbiAgY29uc3QgcGVuZGluZ0lucHV0cyA9IG5ldyBNYXA8c3RyaW5nLCBQZW5kaW5nSW5wdXQ+KCk7XG4gIGxldCBuZXh0SW5wdXRJZCA9IDA7XG5cbiAgY29uc3QgbnM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSA9IHtcbiAgICBnZXQgYXBwKCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1kZXByZWNhdGVkIC0tIGBhcHBgIGdldHRlciByZWFkcyBgd2luZG93LmFwcGAgd2hpY2ggaXMgc2V0IGJ5IE9ic2lkaWFuLlxuICAgICAgcmV0dXJuIGdsb2JhbFRoaXMuYXBwO1xuICAgIH0sXG5cbiAgICBjb250ZXh0czogZXhpc3RpbmdDb250ZXh0cyxcblxuICAgIGFzeW5jIGRlc3Ryb3lDdXJyZW50V2luZG93KHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgYXdhaXQgdGhpcy5lbnN1cmVMYXlvdXRSZWFkeSgpO1xuICAgICAgYXdhaXQgc2xlZXAoMCk7XG4gICAgICBjb25zdCBlbGVjdHJvbldpbmRvdyA9IGdsb2JhbFRoaXMuZWxlY3Ryb25XaW5kb3c7XG4gICAgICBnbG9iYWxUaGlzLnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBlbGVjdHJvbldpbmRvdy5kZXN0cm95KCk7XG4gICAgICB9LCBERVNUUk9ZX0RFTEFZX0lOX01JTExJU0VDT05EUyk7XG4gICAgfSxcblxuICAgIGFzeW5jIGVuc3VyZUxheW91dFJlYWR5KHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgdGhpcy5hcHAud29ya3NwYWNlLm9uTGF5b3V0UmVhZHkocmVzb2x2ZSk7XG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgZXJyb3JUb1N0cmluZyh0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UsIGVycm9yOiB1bmtub3duKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBlcnJvclRvU3RyaW5nSW1wbChlcnJvcik7XG4gICAgfSxcblxuICAgIGFzeW5jIGV2YWxXcmFwcGVyKHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSwgcGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgIC8vIE9sZCBPYnNpZGlhbiAoZS5nLiAwLjYueCkgcHJlZGF0ZXMgdGhlIGNvbW11bml0eS1wbHVnaW4gQVBJOiBgcGx1Z2luc2BcbiAgICAgIC8vIEV4aXN0cyBidXQgaGFzIG5vIGBpc0VuYWJsZWRgL2BzZXRFbmFibGVgLCBhbmQgdGhlcmUgYXJlIG5vIHRoaXJkLXBhcnR5XG4gICAgICAvLyBQbHVnaW5zIHRvIGVuYWJsZSwgc28gc2tpcCB0aGlzIHN0ZXAgd2hlbiB0aGUgQVBJIGlzIGFic2VudC5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBwcm9iZSB0aGUgcnVudGltZS1vcHRpb25hbCBjb21tdW5pdHktcGx1Z2luIEFQSS5cbiAgICAgIGNvbnN0IHBsdWdpbnMgPSB0aGlzLmFwcC5wbHVnaW5zIGFzIHVua25vd24gYXMgUGx1Z2luc0xpa2U7XG4gICAgICBpZiAocGx1Z2lucy5pc0VuYWJsZWQgJiYgIXBsdWdpbnMuaXNFbmFibGVkKCkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hcHAucGx1Z2lucy5zZXRFbmFibGUodHJ1ZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBvYnNpZGlhbk1vZHVsZSA9IGF3YWl0IHRoaXMuZ2V0T2JzaWRpYW5Nb2R1bGUoKTtcbiAgICAgIC8vIEF2b2lkIGA/Pz1gOiBvbGQgT2JzaWRpYW4ncyBDaHJvbWl1bSAoZS5nLiAwLjYueCBvbiBDaHJvbWl1bSA4MCkgcHJlZGF0ZXNcbiAgICAgIC8vIEVTMjAyMSBsb2dpY2FsLWFzc2lnbm1lbnQgYW5kIGNhbm5vdCBwYXJzZSBpdCBpbiB0aGlzIHNlcmlhbGl6ZWQgYm9vdHN0cmFwLlxuICAgICAgbGV0IGNvbnRleHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgICBpZiAocGFyYW1zLmNvbnRleHRJZCkge1xuICAgICAgICBjb25zdCBleGlzdGluZ0NvbnRleHQgPSB0aGlzLmNvbnRleHRzW3BhcmFtcy5jb250ZXh0SWRdO1xuICAgICAgICBpZiAoZXhpc3RpbmdDb250ZXh0KSB7XG4gICAgICAgICAgY29udGV4dCA9IGV4aXN0aW5nQ29udGV4dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmNvbnRleHRzW3BhcmFtcy5jb250ZXh0SWRdID0gY29udGV4dDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gVGhlIGluamVjdGVkIGBsaWJgIGJhZzogYmFzZSBoZWxwZXJzIGZyb20gdGhlIGhhcm5lc3MsIHRoZW4gcHJvdmlkZXJzIG9uIHRvcC5cbiAgICAgIC8vIFJlc29sdmVycyBydW4gaW4tcmVuZGVyZXIgKHRoZXkgcmVhZCByZW5kZXJlciBnbG9iYWxzIGEgcHJvdmlkZXIgcHVibGlzaGVkKS5cbiAgICAgIC8vIFJlYnVpbGRpbmcgcGVyIGV2YWwga2VlcHMgYGxpYmAgZnJlc2ggYW5kIHRvbGVyYW50IG9mIGEgbGF0ZS1sb2FkZWQgcHJvdmlkZXIuXG4gICAgICBjb25zdCBsaWIgPSB7XG4gICAgICAgIGNsaWNrRWxlbWVudCxcbiAgICAgICAgY2xpY2tNb3VzZSxcbiAgICAgICAgY3JlYXRlTm90ZSxcbiAgICAgICAgaG92ZXJFbGVtZW50LFxuICAgICAgICBtb3ZlTW91c2UsXG4gICAgICAgIG9wZW5TZXR0aW5nc1RhYixcbiAgICAgICAgcHJlc3NLZXksXG4gICAgICAgIHR5cGVJbnRvRWRpdG9yLFxuICAgICAgICB1bmhvdmVyRWxlbWVudCxcbiAgICAgICAgd2FpdFVudGlsXG4gICAgICB9O1xuICAgICAgZm9yIChjb25zdCByZXNvbHZlTGliIG9mIHRoaXMubGliUmVzb2x2ZXJzKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24obGliLCByZXNvbHZlTGliKCkpO1xuICAgICAgfVxuICAgICAgY29uc3QgZnVsbEFyZ3VtZW50cyA9IHsgLi4ucGFyYW1zLmlucHV0LCBhcHA6IHRoaXMuYXBwLCBjb250ZXh0LCBsaWIsIG9ic2lkaWFuTW9kdWxlIH07XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYXJhbXMuY2FsbGJhY2soZnVsbEFyZ3VtZW50cyk7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7IHR5cGU6ICd1bmRlZmluZWQnIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7IHZhbHVlOiByZXN1bHQgfSk7XG4gICAgICB9IGNhdGNoIChldmFsRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHsgdHlwZTogJ2Vycm9yJywgdmFsdWU6IHRoaXMuZXJyb3JUb1N0cmluZyhldmFsRXJyb3IpIH0pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRPYnNpZGlhbk1vZHVsZSh0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAgIGlmICh0aGlzLm9ic2lkaWFuTW9kdWxlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9ic2lkaWFuTW9kdWxlO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGUgdGVtcC1wbHVnaW4gdHJpY2sgYmVsb3cgcmVzb2x2ZXMgYHJlcXVpcmUoJ29ic2lkaWFuJylgLCB3aGljaCBvbmx5XG4gICAgICAvLyBXb3JrcyBpbnNpZGUgYSBwbHVnaW4tbG9hZCBjb250ZXh0LiBJdCBuZWVkcyB0aGUgY29tbXVuaXR5LXBsdWdpbiByZWdpc3RyeVxuICAgICAgLy8gKGBsb2FkUGx1Z2luYCArIGBtYW5pZmVzdHNgKSwgd2hpY2ggRklSU1QgYXBwZWFycyBpbiBPYnNpZGlhbiAwLjkuNzsgdGhlXG4gICAgICAvLyAwLjYuNC0wLjkuNiBiYW5kIGhhcyBubyByZWdpc3RyeSBhbmQgY2Fubm90IHJ1biBpdCwgc28gcmV0dXJuIGBudWxsYCAobm90XG4gICAgICAvLyBgdW5kZWZpbmVkYCkgLSBhcHAtb25seSBjbG9zdXJlcyAoYGNhbGxiYWNrKHsgYXBwIH0pYCkgc3RpbGwgcnVuLlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIHByb2JlIHRoZSBydW50aW1lLW9wdGlvbmFsIGNvbW11bml0eS1wbHVnaW4gQVBJLlxuICAgICAgY29uc3QgcGx1Z2lucyA9IHRoaXMuYXBwLnBsdWdpbnMgYXMgdW5rbm93biBhcyBQbHVnaW5zTGlrZTtcbiAgICAgIGlmICghcGx1Z2lucy5sb2FkUGx1Z2luIHx8ICFwbHVnaW5zLm1hbmlmZXN0cykge1xuICAgICAgICBpZiAoIWhhc1dhcm5lZE1pc3NpbmdPYnNpZGlhbk1vZHVsZSkge1xuICAgICAgICAgIGhhc1dhcm5lZE1pc3NpbmdPYnNpZGlhbk1vZHVsZSA9IHRydWU7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdbb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZ10gYG9ic2lkaWFuTW9kdWxlYCBpcyBgbnVsbGA6IHRoaXMgT2JzaWRpYW4gdmVyc2lvbiBwcmVkYXRlcyB0aGUgY29tbXVuaXR5LXBsdWdpbiBBUEkgKGFkZGVkIGluIDAuOS43KSwgc28gdGhlIGBvYnNpZGlhbmAgbW9kdWxlIGNhbm5vdCBiZSByZXNvbHZlZC4gQXBwLW9ubHkgY2xvc3VyZXMgKGBjYWxsYmFjayh7IGFwcCB9KWApIHN0aWxsIHdvcmsuJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IFNMSUNFX1NUQVJUID0gMjtcbiAgICAgIGNvbnN0IHJhbmRvbVN1ZmZpeCA9IFN0cmluZyhNYXRoLnJhbmRvbSgpKS5zbGljZShTTElDRV9TVEFSVCk7XG4gICAgICBjb25zdCB0ZW1wb3JhcnlNb2R1bGVOYW1lID0gYGdldC1vYnNpZGlhbi1tb2R1bGUtJHtyYW5kb21TdWZmaXh9YDtcbiAgICAgIC8vIE9sZCB2ZXJzaW9ucyAoZS5nLiAwLjkuMTApIGxlYXZlIGB2YXVsdC5jb25maWdEaXJgIHVuZGVmaW5lZDsgZmFsbCBiYWNrIHRvXG4gICAgICAvLyBPYnNpZGlhbidzIGRlZmF1bHQgY29uZmlnIGRpciBzbyB0aGUgdGVtcCBwbHVnaW4gc3RpbGwgZ2V0cyBhIHZhbGlkIHBhdGgsXG4gICAgICAvLyBMb2FkcywgYW5kIGl0cyBgcmVxdWlyZSgnb2JzaWRpYW4nKWAgcmVzb2x2ZXMgdGhlIG1vZHVsZS5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBjb25maWdEaXIgaXMgcnVudGltZS1vcHRpb25hbCBvbiBvbGQgdmVyc2lvbnMuXG4gICAgICBjb25zdCBjb25maWdEaXJlY3RvcnkgPSAodGhpcy5hcHAudmF1bHQgYXMgdW5rbm93biBhcyBWYXVsdExpa2UpLmNvbmZpZ0RpciA/PyAnLm9ic2lkaWFuJztcbiAgICAgIGNvbnN0IHBsdWdpbnNEaXJlY3RvcnkgPSBgJHtjb25maWdEaXJlY3Rvcnl9L3BsdWdpbnNgO1xuICAgICAgY29uc3QgZGlyZWN0b3J5ID0gYCR7cGx1Z2luc0RpcmVjdG9yeX0vJHt0ZW1wb3JhcnlNb2R1bGVOYW1lfWA7XG4gICAgICB0aGlzLmFwcC5wbHVnaW5zLm1hbmlmZXN0c1t0ZW1wb3JhcnlNb2R1bGVOYW1lXSA9IHtcbiAgICAgICAgYXV0aG9yOiAnJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uYW1lLXJlcGxhY2VtZW50cyAtLSBgZGlyYCBpcyBPYnNpZGlhbidzIG93biBgUGx1Z2luTWFuaWZlc3RgIG1lbWJlciBuYW1lLlxuICAgICAgICBkaXI6IGRpcmVjdG9yeSxcbiAgICAgICAgaWQ6IHRlbXBvcmFyeU1vZHVsZU5hbWUsXG4gICAgICAgIGlzRGVza3RvcE9ubHk6IGZhbHNlLFxuICAgICAgICBtaW5BcHBWZXJzaW9uOiAnJyxcbiAgICAgICAgbmFtZTogdGVtcG9yYXJ5TW9kdWxlTmFtZSxcbiAgICAgICAgdmVyc2lvbjogJydcbiAgICAgIH07XG4gICAgICAvLyBgYWRhcHRlci5ta2RpcmAgaXMgbm90IHJlY3Vyc2l2ZSwgYW5kIGFuIG9sZCB2ZXJzaW9uIG9uIGEgZnJlc2ggdmF1bHQgbWF5IG5vdFxuICAgICAgLy8gSGF2ZSB0aGUgY29uZmlnL3BsdWdpbnMgZGlycyB5ZXQgXHUyMDE0IGNyZWF0ZSB0aGUgY2hhaW4gc28gYGxvYWRQbHVnaW5gIGZpbmRzIHRoZVxuICAgICAgLy8gVGVtcCBwbHVnaW4gYXQgYDxjb25maWdEaXI+L3BsdWdpbnMvPGlkPmAuXG4gICAgICBpZiAoIShhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLmV4aXN0cyhjb25maWdEaXJlY3RvcnkpKSkge1xuICAgICAgICBhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLm1rZGlyKGNvbmZpZ0RpcmVjdG9yeSk7XG4gICAgICB9XG4gICAgICBpZiAoIShhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLmV4aXN0cyhwbHVnaW5zRGlyZWN0b3J5KSkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hcHAudmF1bHQuYWRhcHRlci5ta2RpcihwbHVnaW5zRGlyZWN0b3J5KTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIubWtkaXIoZGlyZWN0b3J5KTtcblxuICAgICAgY29uc3QgcGx1Z2luRnVuY3Rpb25Cb2R5ID0gJ2NvbnN0IHI9cmVxdWlyZSxlPWV4cG9ydHM7Y29uc3QgbT1yKFxcJ29ic2lkaWFuXFwnKTt3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZy5vYnNpZGlhbk1vZHVsZT1tO2UuZGVmYXVsdD1tLlBsdWdpbjsnO1xuICAgICAgYXdhaXQgdGhpcy5hcHAudmF1bHQuYWRhcHRlci53cml0ZShgJHtkaXJlY3Rvcnl9L21haW4uanNgLCBwbHVnaW5GdW5jdGlvbkJvZHkpO1xuXG4gICAgICBhd2FpdCB0aGlzLmFwcC5wbHVnaW5zLmxvYWRQbHVnaW4odGVtcG9yYXJ5TW9kdWxlTmFtZSk7XG4gICAgICAvLyBgdW5pbnN0YWxsUGx1Z2luYCBhcnJpdmVkIGFmdGVyIHRoZSBwbHVnaW4gQVBJIGl0c2VsZiwgc28gaXQgaXMgYWJzZW50IG9uXG4gICAgICAvLyAwLjkuNyAtIHRoZSBGSVJTVCB2ZXJzaW9uIHRvIGV4cG9zZSBgbG9hZFBsdWdpbmAvYG1hbmlmZXN0c2AgKDAuOS42IGFuZCBiZWxvd1xuICAgICAgLy8gSGF2ZSBuZWl0aGVyLCBhbmQgcmV0dXJuIGB1bmRlZmluZWRgIGFib3ZlKS4gVGhlIG1vZHVsZSBpcyBhbHJlYWR5IGNhcHR1cmVkIGJ5XG4gICAgICAvLyBUaGUgcGx1Z2luJ3MgYG1haW4uanNgIGF0IHRoaXMgcG9pbnQsIHNvIG9ubHkgdW5pbnN0YWxsIHdoZW4gdGhlIG1ldGhvZCBleGlzdHM7XG4gICAgICAvLyBPbiAwLjkuNyB0aGUgdGVtcCBwbHVnaW4gbGluZ2VycyBoYXJtbGVzc2x5IGluIHRoZSBlcGhlbWVyYWwgb3duZWQgdmF1bHQuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXggLS0gdW5pbnN0YWxsUGx1Z2luIGlzIHJ1bnRpbWUtb3B0aW9uYWwgb24gb2xkIHZlcnNpb25zLlxuICAgICAgY29uc3QgcGx1Z2luc0ZvckNsZWFudXAgPSB0aGlzLmFwcC5wbHVnaW5zIGFzIHVua25vd24gYXMgUGx1Z2luc0xpa2U7XG4gICAgICBpZiAocGx1Z2luc0ZvckNsZWFudXAudW5pbnN0YWxsUGx1Z2luKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYXBwLnBsdWdpbnMudW5pbnN0YWxsUGx1Z2luKHRlbXBvcmFyeU1vZHVsZU5hbWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vYnNpZGlhbk1vZHVsZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5vYnNpZGlhbk1vZHVsZTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gbG9hZCBvYnNpZGlhbiBtb2R1bGUnKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgaXBjU2VuZFN5bmModGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlLCBwYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGF3YWl0IHRoaXMuZW5zdXJlTGF5b3V0UmVhZHkoKTtcbiAgICAgIGdsb2JhbFRoaXMuZWxlY3Ryb24uaXBjUmVuZGVyZXIuc2VuZFN5bmMocGFyYW1zLmNoYW5uZWwsIC4uLnBhcmFtcy5jaGFubmVsQXJndW1lbnRzKTtcbiAgICB9LFxuXG4gICAgbGliUmVzb2x2ZXJzOiBib290c3RyYXBQYXJhbXMubGliUmVzb2x2ZXJzLFxuXG4gICAgb2JzaWRpYW5Nb2R1bGU6IGV4aXN0aW5nT2JzaWRpYW5Nb2R1bGUsXG5cbiAgICBhc3luYyBwb2xsVmF1bHRCYXNlUGF0aCh0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgLy8gYHdpbmRvdy5hcHBgLCBpdHMgYHdvcmtzcGFjZWAsIGFuZCBsYXlvdXQgY2FuIGFsbCBiZSB0cmFuc2llbnRseVxuICAgICAgLy8gVW5hdmFpbGFibGUgZHVyaW5nIGJvb3Qgb3IgcmlnaHQgYWZ0ZXIgYW4gb3duZWQtd2luZG93IHJlbG9hZCwgYW5kIG9sZFxuICAgICAgLy8gT2JzaWRpYW4gcHJlZGF0ZXMgYFdvcmtzcGFjZS5vbkxheW91dFJlYWR5YC4gVGhpcyBydW5zIGluc2lkZSB0aGUgdHJhbnNwb3J0J3NcbiAgICAgIC8vIFJlYWRpbmVzcyBwb2xsLCB3aGljaCByZXRyaWVzIG9uIHRocm93LCBzbyBjaGVjayBgd2luZG93LmFwcGAgRklSU1QgYW5kIGJhaWxcbiAgICAgIC8vIENsZWFubHkgdW50aWwgaXQsIGl0cyB3b3Jrc3BhY2UsIGFuZCBsYXlvdXQgYXJlIGFsbCByZWFkeSBcdTIwMTQgbmV2ZXIgZGVyZWZlcmVuY2VcbiAgICAgIC8vIEFuIHVuZGVmaW5lZCBgd2luZG93LmFwcGAuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXggLS0gd2luZG93LmFwcC93b3Jrc3BhY2UgYXJlIHJ1bnRpbWUtb3B0aW9uYWwgZHVyaW5nIGJvb3QuXG4gICAgICBjb25zdCBhcHAgPSB0aGlzLmFwcCBhcyB1bmtub3duIGFzIEFwcExpa2UgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoIWFwcD8ud29ya3NwYWNlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignT3duZWQgdmF1bHQgaXMgbm90IHJlYWR5IHlldCAod2luZG93LmFwcC93b3Jrc3BhY2Ugbm90IGluaXRpYWxpemVkKS4nKTtcbiAgICAgIH1cbiAgICAgIC8vIE9sZCBPYnNpZGlhbiBwcmVkYXRlcyBgV29ya3NwYWNlLm9uTGF5b3V0UmVhZHlgIGJ1dCBoYXMgYGxheW91dFJlYWR5ID09PSB0cnVlYFxuICAgICAgLy8gQnkgdGhlIHRpbWUgYSB3aW5kb3cgaXMgdXA7IG9ubHkgd2FpdCB2aWEgYGVuc3VyZUxheW91dFJlYWR5YCB3aGVuIGl0IGlzIG5vdFxuICAgICAgLy8gWWV0IHJlYWR5IChtb2Rlcm4gdmVyc2lvbnMgZWFybHkgaW4gYm9vdCksIHNvIHRoZSBtaXNzaW5nIG1ldGhvZCBpcyBuZXZlciBoaXQuXG4gICAgICBpZiAoIWFwcC53b3Jrc3BhY2UubGF5b3V0UmVhZHkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVMYXlvdXRSZWFkeSgpO1xuICAgICAgfVxuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXggLS0gRGF0YUFkYXB0ZXIgaXMgYWN0dWFsbHkgRmlsZVN5c3RlbUFkYXB0ZXIgYXQgcnVudGltZSBvbiBkZXNrdG9wLlxuICAgICAgY29uc3QgYWRhcHRlciA9IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIgYXMgdW5rbm93biBhcyBGaWxlU3lzdGVtQWRhcHRlckxpa2U7XG4gICAgICAvLyBPbGQgT2JzaWRpYW4gdmVyc2lvbnMgKGUuZy4gMC42LngpIHByZWRhdGUgdGhlIGBnZXRCYXNlUGF0aCgpYCBtZXRob2QgYnV0XG4gICAgICAvLyBFeHBvc2UgdGhlIGBiYXNlUGF0aGAgcHJvcGVydHk7IHRoZSBtZXRob2QgZXhpc3RzIGZyb20gfjAuOS4yMCBvbndhcmQuXG4gICAgICBjb25zdCBiYXNlUGF0aCA9IGFkYXB0ZXIuZ2V0QmFzZVBhdGggPyBhZGFwdGVyLmdldEJhc2VQYXRoKCkgOiAoYWRhcHRlci5iYXNlUGF0aCA/PyAnJyk7XG4gICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYmFzZVBhdGgpO1xuICAgIH0sXG5cbiAgICByZXNvbHZlSW5wdXQodGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlLCBpZDogc3RyaW5nLCBlcnJvck1lc3NhZ2U6IG51bGwgfCBzdHJpbmcpOiB2b2lkIHtcbiAgICAgIGNvbnN0IHBlbmRpbmcgPSBwZW5kaW5nSW5wdXRzLmdldChpZCk7XG4gICAgICBpZiAoIXBlbmRpbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBwZW5kaW5nSW5wdXRzLmRlbGV0ZShpZCk7XG4gICAgICBpZiAoZXJyb3JNZXNzYWdlID09PSBudWxsKSB7XG4gICAgICAgIHBlbmRpbmcucmVzb2x2ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHBlbmRpbmcucmVqZWN0KG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgc2V0TG9jYWxTdG9yYWdlSXRlbSh0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UsIHBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgYXdhaXQgdGhpcy5lbnN1cmVMYXlvdXRSZWFkeSgpO1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0ocGFyYW1zLmtleSwgcGFyYW1zLnZhbHVlKTtcbiAgICB9LFxuXG4gICAgLy8gVGhlIHNhbWUgZnVuY3Rpb24gb2JqZWN0cyBgZXZhbFdyYXBwZXJgIHB1dHMgaW4gYSBjbG9zdXJlJ3MgYGxpYmAgYmFnIFx1MjAxNCBkZWxpYmVyYXRlbHkgbm90IHJlLWRlcml2ZWRcbiAgICAvLyBBbmQgbm90IHdyYXBwZWQsIHNvIGBvYnNpZGlhbi1kZXYtdXRpbHNgIGdldHMgZXhhY3RseSB0aGUgaGFybmVzcydzIGJlaGF2aW9yIG9uIGJvdGggcGxhdGZvcm1zLlxuICAgIHRydXN0ZWRJbnB1dDoge1xuICAgICAgY2xpY2tFbGVtZW50LFxuICAgICAgY2xpY2tNb3VzZSxcbiAgICAgIGhvdmVyRWxlbWVudCxcbiAgICAgIG1vdmVNb3VzZSxcbiAgICAgIHByZXNzS2V5LFxuICAgICAgdHlwZUludG9FZGl0b3IsXG4gICAgICB1bmhvdmVyRWxlbWVudFxuICAgIH0sXG5cbiAgICB2ZXJzaW9uOiBib290c3RyYXBQYXJhbXMudmVyc2lvblxuICB9O1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBBcHByb3ZlZCBkb3VibGUgY2FzdDogYF9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIGlzIG91ciBpbnRlcm5hbCBXaW5kb3cgYXVnbWVudGF0aW9uLCBpbnRlbnRpb25hbGx5IGtlcHQgbG9jYWwgKG5vdCBkZWNsYXJlZCBnbG9iYWxseSkgdG8gYXZvaWQgbGVha2luZyBpbnRvIGNvbnN1bWVyIHR5cGVzLlxuICAoZ2xvYmFsVGhpcyBhcyB1bmtub3duIGFzIFBhcnRpYWw8SW50ZWdyYXRpb25UZXN0aW5nSG9sZGVyPikuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZyA9IG5zO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIHR5cGVJbnRvRWRpdG9yKHR5cGVQYXJhbXM6IFR5cGVJbnRvRWRpdG9yUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgRk9DVVNfU0VUVExFX0RFTEFZX0lOX01JTExJU0VDT05EUyA9IDMwMDtcblxuICAgIGNvbnN0IHsgZWRpdG9yLCB0ZXh0IH0gPSB0eXBlUGFyYW1zO1xuICAgIGNvbnN0IHZhbHVlQmVmb3JlVHlwaW5nID0gZWRpdG9yLmdldFZhbHVlKCk7XG5cbiAgICAvLyBGb2N1cyB0aGUgZWRpdG9yIGFuZCBwbGFjZSB0aGUgY2FyZXQgYXQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQuXG4gICAgZWRpdG9yLmZvY3VzKCk7XG4gICAgY29uc3QgbGFzdExpbmUgPSBlZGl0b3IubGFzdExpbmUoKTtcbiAgICBlZGl0b3Iuc2V0Q3Vyc29yKGxhc3RMaW5lLCBlZGl0b3IuZ2V0TGluZShsYXN0TGluZSkubGVuZ3RoKTtcblxuICAgIC8vIExldCBhbnkgZm9jdXMgdHJhcCAoYSBgc2V0VGltZW91dCgwKWAgcmUtZm9jdXMpIGZpcmUgYmVmb3JlIHR5cGluZywgc28gc3RvbGVuIGZvY3VzIGlzIGRldGVjdGVkLlxuICAgIGF3YWl0IHNsZWVwKEZPQ1VTX1NFVFRMRV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMpO1xuXG4gICAgLy8gVHlwaW5nIGlzIHByZXNzaW5nIGVhY2ggY2hhcmFjdGVyIGtleSBpbiB0dXJuOiBgcHJlc3NLZXlgIGluamVjdHMgdGhlIHNhbWUgdHJ1c3RlZFxuICAgIC8vIGBrZXlEb3duYCAtPiBgY2hhcmAgLT4gYGtleVVwYCBhIHJlYWwgdXNlciBwcm9kdWNlcyBcdTIwMTQgdGV4dCBsYW5kcyBvbmx5IGlmIHRoZSBlZGl0b3IgaG9sZHMgZm9jdXMuXG4gICAgZm9yIChjb25zdCBjaGFyIG9mIHRleHQpIHtcbiAgICAgIGF3YWl0IHByZXNzS2V5KHsga2V5OiBjaGFyIH0pO1xuICAgIH1cblxuICAgIC8vIFBvbGwgdW50aWwgdGhlIGRvY3VtZW50IHJlZmxlY3RzIHRoZSBpbnB1dCBvciB0aGUgdGltZW91dCBlbGFwc2VzLCBpbnN0ZWFkIG9mIGEgZml4ZWQgc2V0dGxlLlxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgd2hpbGUgKGVkaXRvci5nZXRWYWx1ZSgpID09PSB2YWx1ZUJlZm9yZVR5cGluZyAmJiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lIDwgSU5QVVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpIHtcbiAgICAgIGF3YWl0IHNsZWVwKElOUFVUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG4gIH1cblxuICAvLyBUcnVlIHdoZW4gdGhpcyBjbG9zdXJlIGlzIHJ1bm5pbmcgaW4gT2JzaWRpYW4gTW9iaWxlIHJhdGhlciB0aGFuIHRoZSBFbGVjdHJvbiBkZXNrdG9wIGFwcC5cbiAgLy8gUmVhZGluZyBgUGxhdGZvcm1gIG9mZiB0aGUgcmVzb2x2ZWQgb2JzaWRpYW4gbW9kdWxlIGlzIHNhZmUgaGVyZTogYGV2YWxXcmFwcGVyYCBhbHdheXMgcmVzb2x2ZXMgdGhhdFxuICAvLyBNb2R1bGUgYmVmb3JlIGFueSBjYWxsYmFjayBjYW4gcnVuLCB3aGljaCBpcyB0aGUgc2FtZSBndWFyYW50ZWUgYHRvRWxlY3Ryb25Nb2RpZmllcnNgIHJlbGllcyBvbi5cbiAgZnVuY3Rpb24gY2hlY2tJc01vYmlsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKG5zLm9ic2lkaWFuTW9kdWxlIGFzIE9ic2lkaWFuTW9kdWxlV2l0aFBsYXRmb3JtKS5QbGF0Zm9ybS5pc01vYmlsZTtcbiAgfVxuXG4gIC8vIEhhbmRzIG9uZSB0cnVzdGVkLWlucHV0IHJlcXVlc3QgdG8gdGhlIGhvc3QgYW5kIHdhaXRzIGZvciBpdCB0byBiZSBpbmplY3RlZC5cbiAgLy9cbiAgLy8gTW9iaWxlIGhhcyBubyBpbi1yZW5kZXJlciByb3V0ZSB0byBhIHRydXN0ZWQgZXZlbnQgYXQgYWxsIFx1MjAxNCBgZGlzcGF0Y2hFdmVudGAgYW5kIGBlbGVtZW50LmNsaWNrKClgIGFyZVxuICAvLyBgaXNUcnVzdGVkID09PSBmYWxzZWAgYnkgc3BlYyBcdTIwMTQgc28gdGhlIGluamVjdGlvbiBoYXMgdG8gaGFwcGVuIGZyb20gdGhlIE5vZGUgc2lkZSwgb3ZlciBhIENEUFxuICAvLyBDb25uZWN0aW9uIGluZGVwZW5kZW50IG9mIHRoZSBBcHBpdW0gc2Vzc2lvbiB0aGF0IGlzIGN1cnJlbnRseSBibG9ja2VkIGF3YWl0aW5nIHRoaXMgdmVyeSBjbG9zdXJlXG4gIC8vIChzZWUgTDM5KS4gYGJpbmRpbmdOYW1lYCBpcyBhIGhvc3QtaW5zdGFsbGVkIGdsb2JhbDsgY2FsbGluZyBpdCBkZWxpdmVycyB0aGUgcmVxdWVzdCwgYW5kIHRoZSBob3N0XG4gIC8vIEFuc3dlcnMgYnkgY2FsbGluZyBgbnMucmVzb2x2ZUlucHV0YC5cbiAgYXN5bmMgZnVuY3Rpb24gcmVxdWVzdEhvc3RJbnB1dChyZXF1ZXN0OiBNb2JpbGVJbnB1dFJlcXVlc3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBiaW5kaW5nTmFtZSA9IGJvb3RzdHJhcFBhcmFtcy5pbnB1dEJpbmRpbmdOYW1lO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBBcHByb3ZlZCBjYXN0OiB0aGUgYmluZGluZyBpcyBpbnN0YWxsZWQgYnkgdGhlIGhvc3QgYXQgcnVudGltZSB2aWEgYFJ1bnRpbWUuYWRkQmluZGluZ2AsIHNvIGl0IGNhbm5vdCBiZSBkZWNsYXJlZCBvbiBgV2luZG93YC5cbiAgICBjb25zdCBiaW5kaW5nID0gKGdsb2JhbFRoaXMgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbYmluZGluZ05hbWVdIGFzICgocGF5bG9hZDogc3RyaW5nKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZW9mIGJpbmRpbmcgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgIGBUcnVzdGVkIGlucHV0IGlzIHVuYXZhaWxhYmxlOiB0aGUgaG9zdCBoYXMgbm90IGluc3RhbGxlZCB0aGUgXFxgJHtiaW5kaW5nTmFtZX1cXGAgY2hhbm5lbC4gYFxuICAgICAgICAgICsgJ09uIG1vYmlsZSB0aGVzZSBoZWxwZXJzIHJlcXVpcmUgdGhlIG9ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmcgQXBwaXVtIHRyYW5zcG9ydC4nXG4gICAgICApO1xuICAgIH1cblxuICAgIG5leHRJbnB1dElkKys7XG4gICAgY29uc3QgaWQgPSBTdHJpbmcobmV4dElucHV0SWQpO1xuXG4gICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgcGVuZGluZ0lucHV0cy5zZXQoaWQsIHsgcmVqZWN0LCByZXNvbHZlIH0pO1xuICAgICAgZ2xvYmFsVGhpcy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKCFwZW5kaW5nSW5wdXRzLmhhcyhpZCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBwZW5kaW5nSW5wdXRzLmRlbGV0ZShpZCk7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFRoZSBob3N0IGRpZCBub3Qgc2VydmljZSB0aGUgdHJ1c3RlZCBpbnB1dCByZXF1ZXN0IHdpdGhpbiAke1N0cmluZyhib290c3RyYXBQYXJhbXMuaW5wdXRUaW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zLmApKTtcbiAgICAgIH0sIGJvb3RzdHJhcFBhcmFtcy5pbnB1dFRpbWVvdXRJbk1pbGxpc2Vjb25kcyk7XG5cbiAgICAgIGJpbmRpbmcoSlNPTi5zdHJpbmdpZnkoeyBpZCwgcmVxdWVzdCB9KSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBBIHBvaW50ZXIgaGVscGVyIHRoYXQgaGFzIG5vIHRvdWNoIGFuYWxvZyBpcyBhIGhhcmQgZXJyb3IsIG5ldmVyIGEgc2lsZW50IG5vLW9wOiBgOmhvdmVyYCBkb2VzIG5vdFxuICAvLyBFeGlzdCBvbiB0b3VjaCwgc28gYSB0ZXN0IHRoYXQgXCJob3ZlcmVkXCIgYW5kIHRoZW4gYXNzZXJ0ZWQgd291bGQgcGFzcyB3aGlsZSBleGVyY2lzaW5nIG5vdGhpbmcgXHUyMDE0XG4gIC8vIEV4YWN0bHkgdGhlIGZhbHNlLWNvbmZpZGVuY2UgZmFpbHVyZSB0aGUgdHJ1c3RlZC1pbnB1dCB3b3JrIGV4aXN0cyB0byBlbmQuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL2NvbnNpc3RlbnQtZnVuY3Rpb24tc2NvcGluZyAtLSBJdCBjYW5ub3QgbW92ZSB0byB0aGUgb3V0ZXIgc2NvcGU6IHRoaXMgd2hvbGUgZnVuY3Rpb24gaXMgc2VyaWFsaXplZCB2aWEgYHRvU3RyaW5nKClgIGFuZCBtYXkgbm90IHJlZmVyZW5jZSBhbnl0aGluZyBvdXRzaWRlIGl0c2VsZiAoTDE1KS5cbiAgZnVuY3Rpb24gdGhyb3dVbnN1cHBvcnRlZE9uTW9iaWxlKGhlbHBlck5hbWU6IHN0cmluZyk6IG5ldmVyIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgXFxgJHtoZWxwZXJOYW1lfVxcYCBoYXMgbm8gbWVhbmluZyBvbiBtb2JpbGU6IHRvdWNoIGlucHV0IGhhcyBubyBob3ZlciBzdGF0ZS4gYFxuICAgICAgICArICdCcmFuY2ggb24gYFBsYXRmb3JtLmlzRGVza3RvcEFwcGAsIG9yIGRyaXZlIHRoZSBlbGVtZW50IHdpdGggYGNsaWNrRWxlbWVudGAgaW5zdGVhZC4nXG4gICAgKTtcbiAgfVxuXG4gIC8vIE1hcHMgT2JzaWRpYW4ncyBgTW9kaWZpZXJgIG5hbWVzIHRvIEVsZWN0cm9uJ3MgbG93ZXJjYXNlIGBzZW5kSW5wdXRFdmVudGAgbW9kaWZpZXIgbmFtZXMuXG4gIC8vIE5hbWVzICdNZXRhJywgJ0FsdCcsICdTaGlmdCcgbG93ZXJjYXNlIGRpcmVjdGx5OyAnQ3RybCcgLT4gJ2NvbnRyb2wnOyAnTW9kJyByZXNvbHZlcyBwZXItcGxhdGZvcm0uXG4gIC8vIFNoYXJlZCBieSBldmVyeSB0cnVzdGVkLWlucHV0IGhlbHBlciwgc28gYSBrZXkgcHJlc3MgYW5kIGEgY2xpY2sgY2Fubm90IGRpc2FncmVlIG9uIGAnTW9kJ2AuXG4gIGZ1bmN0aW9uIHRvRWxlY3Ryb25Nb2RpZmllcnMobW9kaWZpZXJzOiByZWFkb25seSBNb2RpZmllcltdKTogRWxlY3Ryb25Nb2RpZmllcltdIHtcbiAgICAvLyAnTW9kJyBpcyBPYnNpZGlhbidzIHBsYXRmb3JtLWFnbm9zdGljIG1vZGlmaWVyOiBDbWQgKG1ldGEpIG9uIG1hY09TLCBDdHJsIGVsc2V3aGVyZS5cbiAgICAvLyBSZWFkaW5nIGBQbGF0Zm9ybS5pc01hY09TYCBvZmYgdGhlIHJlc29sdmVkIG9ic2lkaWFuIG1vZHVsZSBpcyBzYWZlIGhlcmU6XG4gICAgLy8gYGV2YWxXcmFwcGVyYCBhbHdheXMgcmVzb2x2ZXMgdGhhdCBtb2R1bGUgYmVmb3JlIGFueSBjYWxsYmFjayBjYW4gcnVuLlxuICAgIGNvbnN0IGlzTWFjT1MgPSAobnMub2JzaWRpYW5Nb2R1bGUgYXMgT2JzaWRpYW5Nb2R1bGVXaXRoUGxhdGZvcm0pLlBsYXRmb3JtLmlzTWFjT1M7XG5cbiAgICByZXR1cm4gbW9kaWZpZXJzLm1hcCgobW9kaWZpZXIpOiBFbGVjdHJvbk1vZGlmaWVyID0+IHtcbiAgICAgIHN3aXRjaCAobW9kaWZpZXIpIHtcbiAgICAgICAgY2FzZSAnQWx0Jzoge1xuICAgICAgICAgIHJldHVybiAnYWx0JztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdDdHJsJzoge1xuICAgICAgICAgIHJldHVybiAnY29udHJvbCc7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnTWV0YSc6IHtcbiAgICAgICAgICByZXR1cm4gJ21ldGEnO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ01vZCc6IHtcbiAgICAgICAgICByZXR1cm4gaXNNYWNPUyA/ICdtZXRhJyA6ICdjb250cm9sJztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdTaGlmdCc6IHtcbiAgICAgICAgICByZXR1cm4gJ3NoaWZ0JztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgLy8gRXhoYXVzdGl2ZW5lc3MgZ3VhcmQ6IGFkZGluZyBhIGBNb2RpZmllcmAgbWVtYmVyIHdpdGhvdXQgYSBjYXNlIGFib3ZlIGJlY29tZXMgYSBjb21waWxlIGVycm9yLlxuICAgICAgICAgIGNvbnN0IHVua25vd25Nb2RpZmllcjogbmV2ZXIgPSBtb2RpZmllcjtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbW9kaWZpZXI6ICR7U3RyaW5nKHVua25vd25Nb2RpZmllcil9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGNsaWNrTW91c2UoY2xpY2tQYXJhbXM6IENsaWNrTW91c2VQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBTSU5HTEVfQ0xJQ0tfQ09VTlQgPSAxO1xuXG4gICAgY29uc3QgeyBidXR0b24gPSAnbGVmdCcsIG1vZGlmaWVycyA9IFtdLCB4LCB5IH0gPSBjbGlja1BhcmFtcztcblxuICAgIGNvbnN0IGVsZWN0cm9uTW9kaWZpZXJzID0gdG9FbGVjdHJvbk1vZGlmaWVycyhtb2RpZmllcnMpO1xuICAgIGNvbnN0IHJvdW5kZWRYID0gTWF0aC5yb3VuZCh4KTtcbiAgICBjb25zdCByb3VuZGVkWSA9IE1hdGgucm91bmQoeSk7XG5cbiAgICBpZiAoY2hlY2tJc01vYmlsZSgpKSB7XG4gICAgICAvLyBUb3VjaCBoYXMgbm8gYnV0dG9ucy4gQSBsZWZ0IGNsaWNrIGlzIGEgdGFwOyBhIHJpZ2h0IGNsaWNrIGlzIHRoZSBsb25nLXByZXNzIHRoYXQgb3BlbnMgT2JzaWRpYW5cbiAgICAgIC8vIE1vYmlsZSdzIGNvbnRleHQgbWVudSwgc28gaXQgaXMgaGlkZGVuIGJlaGluZCB0aGUgc2FtZSBuYW1lIHJhdGhlciB0aGFuIGEgc2VwYXJhdGUgaGVscGVyLiBBXG4gICAgICAvLyBNaWRkbGUgY2xpY2sgaGFzIG5vIGdlc3R1cmUgYXQgYWxsLCBhbmQgaW52ZW50aW5nIG9uZSB3b3VsZCBiZSB3b3JzZSB0aGFuIHNheWluZyBzby5cbiAgICAgIGlmIChidXR0b24gPT09ICdtaWRkbGUnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignYGNsaWNrTW91c2UoeyBidXR0b246IFxcJ21pZGRsZVxcJyB9KWAgaGFzIG5vIG1lYW5pbmcgb24gbW9iaWxlOiB0b3VjaCBpbnB1dCBoYXMgbm8gbWlkZGxlIGJ1dHRvbi4nKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgcmVxdWVzdEhvc3RJbnB1dCh7XG4gICAgICAgIGtpbmQ6IGJ1dHRvbiA9PT0gJ3JpZ2h0JyA/ICdsb25nUHJlc3MnIDogJ3RhcCcsXG4gICAgICAgIG1vZGlmaWVyczogZWxlY3Ryb25Nb2RpZmllcnMsXG4gICAgICAgIHg6IHJvdW5kZWRYLFxuICAgICAgICB5OiByb3VuZGVkWVxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgd2ViQ29udGVudHMgPSBnbG9iYWxUaGlzLmVsZWN0cm9uLnJlbW90ZS5nZXRDdXJyZW50V2ViQ29udGVudHMoKTtcblxuICAgIC8vIEEgdHJ1c3RlZCBjbGljayBpcyBtb3VzZU1vdmUgLT4gbW91c2VEb3duIC0+IG1vdXNlVXAgYXQgb25lIHBvaW50LlxuICAgIC8vIENocm9taXVtIHN5bnRoZXNpemVzIHRoZSBgY2xpY2tgIChvciBgY29udGV4dG1lbnVgKSBET00gZXZlbnQgZnJvbSB0aGF0IHNlcXVlbmNlLlxuICAgIC8vIFRoZSBsZWFkaW5nIG1vdmUgaXMgd2hhdCBwdXRzIHRoZSBwb2ludGVyIG92ZXIgdGhlIGhpdC10ZXN0IHRhcmdldCBiZWZvcmUgdGhlIGJ1dHRvbiBnb2VzIGRvd24uXG4gICAgd2ViQ29udGVudHMuc2VuZElucHV0RXZlbnQoeyBtb2RpZmllcnM6IGVsZWN0cm9uTW9kaWZpZXJzLCB0eXBlOiAnbW91c2VNb3ZlJywgeDogcm91bmRlZFgsIHk6IHJvdW5kZWRZIH0pO1xuICAgIHdlYkNvbnRlbnRzLnNlbmRJbnB1dEV2ZW50KHtcbiAgICAgIGJ1dHRvbixcbiAgICAgIGNsaWNrQ291bnQ6IFNJTkdMRV9DTElDS19DT1VOVCxcbiAgICAgIG1vZGlmaWVyczogZWxlY3Ryb25Nb2RpZmllcnMsXG4gICAgICB0eXBlOiAnbW91c2VEb3duJyxcbiAgICAgIHg6IHJvdW5kZWRYLFxuICAgICAgeTogcm91bmRlZFlcbiAgICB9KTtcbiAgICB3ZWJDb250ZW50cy5zZW5kSW5wdXRFdmVudCh7XG4gICAgICBidXR0b24sXG4gICAgICBjbGlja0NvdW50OiBTSU5HTEVfQ0xJQ0tfQ09VTlQsXG4gICAgICBtb2RpZmllcnM6IGVsZWN0cm9uTW9kaWZpZXJzLFxuICAgICAgdHlwZTogJ21vdXNlVXAnLFxuICAgICAgeDogcm91bmRlZFgsXG4gICAgICB5OiByb3VuZGVkWVxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gY2xpY2tFbGVtZW50KGNsaWNrUGFyYW1zOiBDbGlja0VsZW1lbnRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBDRU5URVJfRElWSVNPUiA9IDI7XG5cbiAgICBjb25zdCB7IGJ1dHRvbiA9ICdsZWZ0JywgZWxlbWVudCwgbW9kaWZpZXJzID0gW10gfSA9IGNsaWNrUGFyYW1zO1xuXG4gICAgLy8gVmlld3BvcnQgY29vcmRzIGVxdWFsIHdlYi1jb250ZW50cyBESVAgY29vcmRzIGZvciB0aGUgZnVsbC13aW5kb3cgYEJyb3dzZXJXaW5kb3dgLCBhbmQgZXF1YWwgQ0RQJ3NcbiAgICAvLyBQYWdlIGNvb3JkaW5hdGVzIGluIHRoZSBtb2JpbGUgV2ViVmlldyBcdTIwMTQgc28gbmVpdGhlciBwYXRoIG5lZWRzIGEgZGV2aWNlLXBpeGVsIGNvbnZlcnNpb24uXG4gICAgY29uc3QgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgYXdhaXQgY2xpY2tNb3VzZSh7XG4gICAgICBidXR0b24sXG4gICAgICBtb2RpZmllcnMsXG4gICAgICB4OiByZWN0LmxlZnQgKyByZWN0LndpZHRoIC8gQ0VOVEVSX0RJVklTT1IsXG4gICAgICB5OiByZWN0LnRvcCArIHJlY3QuaGVpZ2h0IC8gQ0VOVEVSX0RJVklTT1JcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHByZXNzS2V5KHByZXNzUGFyYW1zOiBQcmVzc0tleVBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsga2V5LCBtb2RpZmllcnMgPSBbXSB9ID0gcHJlc3NQYXJhbXM7XG5cbiAgICBjb25zdCBlbGVjdHJvbk1vZGlmaWVycyA9IHRvRWxlY3Ryb25Nb2RpZmllcnMobW9kaWZpZXJzKTtcblxuICAgIGlmIChjaGVja0lzTW9iaWxlKCkpIHtcbiAgICAgIGF3YWl0IHJlcXVlc3RIb3N0SW5wdXQoeyBrZXksIGtpbmQ6ICdrZXknLCBtb2RpZmllcnM6IGVsZWN0cm9uTW9kaWZpZXJzIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHdlYkNvbnRlbnRzID0gZ2xvYmFsVGhpcy5lbGVjdHJvbi5yZW1vdGUuZ2V0Q3VycmVudFdlYkNvbnRlbnRzKCk7XG5cbiAgICAvLyBBIHRydXN0ZWQga2V5IHByZXNzIGlzIGtleURvd24gLT4gY2hhciAtPiBrZXlVcDoga2V5RG93biBmaXJlcyBga2V5ZG93bmAsIGNoYXIgZmlyZXNcbiAgICAvLyBga2V5cHJlc3NgL2BiZWZvcmVpbnB1dGAvYGlucHV0YCwga2V5VXAgZmlyZXMgYGtleXVwYCBcdTIwMTQgdGhlIGZ1bGwgcmVhbCBrZXkgcGlwZWxpbmUuXG4gICAgd2ViQ29udGVudHMuc2VuZElucHV0RXZlbnQoeyBrZXlDb2RlOiBrZXksIG1vZGlmaWVyczogZWxlY3Ryb25Nb2RpZmllcnMsIHR5cGU6ICdrZXlEb3duJyB9KTtcbiAgICB3ZWJDb250ZW50cy5zZW5kSW5wdXRFdmVudCh7IGtleUNvZGU6IGtleSwgbW9kaWZpZXJzOiBlbGVjdHJvbk1vZGlmaWVycywgdHlwZTogJ2NoYXInIH0pO1xuICAgIHdlYkNvbnRlbnRzLnNlbmRJbnB1dEV2ZW50KHsga2V5Q29kZToga2V5LCBtb2RpZmllcnM6IGVsZWN0cm9uTW9kaWZpZXJzLCB0eXBlOiAna2V5VXAnIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gaG92ZXJFbGVtZW50KGhvdmVyUGFyYW1zOiBIb3ZlckVsZW1lbnRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBDRU5URVJfRElWSVNPUiA9IDI7XG5cbiAgICBjb25zdCB7IGVsZW1lbnQgfSA9IGhvdmVyUGFyYW1zO1xuXG4gICAgaWYgKGNoZWNrSXNNb2JpbGUoKSkge1xuICAgICAgdGhyb3dVbnN1cHBvcnRlZE9uTW9iaWxlKCdob3ZlckVsZW1lbnQnKTtcbiAgICB9XG5cbiAgICAvLyBWaWV3cG9ydCBjb29yZHMgZXF1YWwgd2ViLWNvbnRlbnRzIERJUCBjb29yZHMgZm9yIHRoZSBmdWxsLXdpbmRvdyBgQnJvd3NlcldpbmRvd2AuXG4gICAgY29uc3QgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgYXdhaXQgbW92ZU1vdXNlKHsgeDogcmVjdC5sZWZ0ICsgcmVjdC53aWR0aCAvIENFTlRFUl9ESVZJU09SLCB5OiByZWN0LnRvcCArIHJlY3QuaGVpZ2h0IC8gQ0VOVEVSX0RJVklTT1IgfSk7XG5cbiAgICAvLyBQb2xsIHVudGlsIHRoZSByZWFsIGA6aG92ZXJgIHN0YXRlIGhhcyBhY3R1YWxseSB0YWtlbiwgaW5zdGVhZCBvZiBhIGZpeGVkIHNldHRsZS5cbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHdoaWxlICghZWxlbWVudC5tYXRjaGVzKCc6aG92ZXInKSAmJiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lIDwgSU5QVVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpIHtcbiAgICAgIGF3YWl0IHNsZWVwKElOUFVUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3JlcXVpcmUtYXdhaXQgLS0gQXN5bmMgdG8gbWF0Y2ggaXRzIG1vYmlsZS1jYXBhYmxlIHNpYmxpbmdzIGFuZCB0byBrZWVwIG9uZSBgUHJvbWlzZTx2b2lkPmAgc2hhcGUgYWNyb3NzIHRoZSB0cnVzdGVkLWlucHV0IHNldDsgdGhlIGRlc2t0b3AgYm9keSBpcyBnZW51aW5lbHkgc3luY2hyb25vdXMuXG4gIGFzeW5jIGZ1bmN0aW9uIG1vdmVNb3VzZShtb3ZlUGFyYW1zOiBNb3ZlTW91c2VQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoY2hlY2tJc01vYmlsZSgpKSB7XG4gICAgICB0aHJvd1Vuc3VwcG9ydGVkT25Nb2JpbGUoJ21vdmVNb3VzZScpO1xuICAgIH1cblxuICAgIGNvbnN0IHdlYkNvbnRlbnRzID0gZ2xvYmFsVGhpcy5lbGVjdHJvbi5yZW1vdGUuZ2V0Q3VycmVudFdlYkNvbnRlbnRzKCk7XG4gICAgd2ViQ29udGVudHMuc2VuZElucHV0RXZlbnQoeyB0eXBlOiAnbW91c2VNb3ZlJywgeDogTWF0aC5yb3VuZChtb3ZlUGFyYW1zLngpLCB5OiBNYXRoLnJvdW5kKG1vdmVQYXJhbXMueSkgfSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiB1bmhvdmVyRWxlbWVudCh1bmhvdmVyUGFyYW1zOiBVbmhvdmVyRWxlbWVudFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IENFTlRFUl9ESVZJU09SID0gMjtcbiAgICBjb25zdCBPVVRTSURFX09GRlNFVF9JTl9QSVhFTFMgPSAxO1xuXG4gICAgY29uc3QgeyBlbGVtZW50IH0gPSB1bmhvdmVyUGFyYW1zO1xuXG4gICAgaWYgKGNoZWNrSXNNb2JpbGUoKSkge1xuICAgICAgdGhyb3dVbnN1cHBvcnRlZE9uTW9iaWxlKCd1bmhvdmVyRWxlbWVudCcpO1xuICAgIH1cblxuICAgIC8vIE1vdmUgdG8gYSBwb2ludCBqdXN0IG91dHNpZGUgdGhlIGVsZW1lbnQncyBib3guXG4gICAgLy8gV2hlbiBmbHVzaCBhZ2FpbnN0IHRoZSB2aWV3cG9ydCdzIGxlZnQgZWRnZSwgdXNlIGp1c3QgcGFzdCB0aGUgcmlnaHQgZWRnZS5cbiAgICAvLyBBIGZ1bGwtdmlld3BvcnQtd2lkdGggZWxlbWVudCBzaG91bGQgdXNlIGBtb3ZlTW91c2VgIGRpcmVjdGx5IGluc3RlYWQuXG4gICAgY29uc3QgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgeCA9IHJlY3QubGVmdCA+PSBPVVRTSURFX09GRlNFVF9JTl9QSVhFTFMgPyByZWN0LmxlZnQgLSBPVVRTSURFX09GRlNFVF9JTl9QSVhFTFMgOiByZWN0LnJpZ2h0ICsgT1VUU0lERV9PRkZTRVRfSU5fUElYRUxTO1xuICAgIGNvbnN0IHkgPSByZWN0LnRvcCArIHJlY3QuaGVpZ2h0IC8gQ0VOVEVSX0RJVklTT1I7XG4gICAgYXdhaXQgbW92ZU1vdXNlKHsgeCwgeSB9KTtcblxuICAgIC8vIFBvbGwgdW50aWwgdGhlIHJlYWwgYDpob3ZlcmAgc3RhdGUgaGFzIGFjdHVhbGx5IGNsZWFyZWQsIGluc3RlYWQgb2YgYSBmaXhlZCBzZXR0bGUuXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB3aGlsZSAoZWxlbWVudC5tYXRjaGVzKCc6aG92ZXInKSAmJiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lIDwgSU5QVVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpIHtcbiAgICAgIGF3YWl0IHNsZWVwKElOUFVUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBjcmVhdGVOb3RlKG5vdGVQYXJhbXM6IENyZWF0ZU5vdGVQYXJhbXMpOiBQcm9taXNlPFRGaWxlPiB7XG4gICAgY29uc3QgeyBjb250ZW50LCBwYXRoIH0gPSBub3RlUGFyYW1zO1xuXG4gICAgY29uc3QgZmlsZSA9IGF3YWl0IG5zLmFwcC52YXVsdC5jcmVhdGUocGF0aCwgY29udGVudCk7XG5cbiAgICAvLyBSZWFkIHRoZSBmaWxlIGJhY2sgcmF0aGVyIHRoYW4gdHJ1c3RpbmcgYGZpbGUuc3RhdGAuIGBzdGF0YCBpcyBwcmVjaXNlbHlcbiAgICAvLyBUaGUgZmllbGQgdGhhdCBsaWVzIGhlcmU6IG9uIGEgbG9zdCB3cml0ZSBpdCByZXBvcnRzIHRoZSBmdWxsIGJ5dGUgY291bnRcbiAgICAvLyBXaGlsZSB0aGUgZmlsZXN5c3RlbSBob2xkcyB6ZXJvIGJ5dGVzLlxuICAgIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDw9IENSRUFURV9OT1RFX1JFUEFJUl9BVFRFTVBUX0NPVU5UOyBhdHRlbXB0KyspIHtcbiAgICAgIGNvbnN0IGFjdHVhbENvbnRlbnQgPSBhd2FpdCBucy5hcHAudmF1bHQucmVhZChmaWxlKTtcbiAgICAgIGlmIChhY3R1YWxDb250ZW50ID09PSBjb250ZW50KSB7XG4gICAgICAgIHJldHVybiBmaWxlO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXR0ZW1wdCA9PT0gQ1JFQVRFX05PVEVfUkVQQUlSX0FUVEVNUFRfQ09VTlQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBjcmVhdGVOb3RlIGNvdWxkIG5vdCB3cml0ZSBcIiR7cGF0aH1cIjogZXhwZWN0ZWQgJHtTdHJpbmcoY29udGVudC5sZW5ndGgpfSBjaGFyYWN0ZXJzLCBgXG4gICAgICAgICAgICArIGB0aGUgdmF1bHQgaG9sZHMgJHtTdHJpbmcoYWN0dWFsQ29udGVudC5sZW5ndGgpfSBhZnRlciAke1N0cmluZyhDUkVBVEVfTk9URV9SRVBBSVJfQVRURU1QVF9DT1VOVCl9IHJlcGFpciBhdHRlbXB0cy5gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEEgcmV3cml0ZSBvZiB0aGUgc2FtZSBjb250ZW50IGxhbmRzIGNvcnJlY3RseSBcdTIwMTQgbWVhc3VyZWQuIFRoaXMgaXMgdGhlXG4gICAgICAvLyBXaG9sZSB3b3JrYXJvdW5kLlxuICAgICAgYXdhaXQgbnMuYXBwLnZhdWx0Lm1vZGlmeShmaWxlLCBjb250ZW50KTtcbiAgICB9XG5cbiAgICAvLyBVbnJlYWNoYWJsZTogdGhlIGxvb3AgZWl0aGVyIHJldHVybnMgb3IgdGhyb3dzIG9uIGl0cyBsYXN0IGl0ZXJhdGlvbi5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYGNyZWF0ZU5vdGUgY291bGQgbm90IHdyaXRlIFwiJHtwYXRofVwiLmApO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gb3BlblNldHRpbmdzVGFiKG9wZW5QYXJhbXM6IE9wZW5TZXR0aW5nc1RhYlBhcmFtcyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCB7IHRhYklkLCB0aW1lb3V0SW5NaWxsaXNlY29uZHMgPSBTRVRUSU5HU19UQUJfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSA9IG9wZW5QYXJhbXM7XG5cbiAgICBjb25zdCBzZXR0aW5nID0gbnMuYXBwLnNldHRpbmc7XG5cbiAgICAvKlxuICAgICAqIEEgRkFMTEJBQ0sgZm9yIGEgdmF1bHQgdGhhdCBkb2VzIG5vdCBjYXJyeSB0aGUgaGFybmVzcydzIGBzZXR0aW5nc1BvcG91dFdpbmRvdzogZmFsc2VgIGRlZmF1bHQgXHUyMDE0XG4gICAgICogQW5kIGl0IE1VU1QgaGFwcGVuIGJlZm9yZSBgb3BlbigpYC5cbiAgICAgKlxuICAgICAqIFdpdGggdGhlIGRlZmF1bHQgaW4gcGxhY2UgYG9wZW4oKWAgYXR0YWNoZXMgYGNvbnRhaW5lckVsYCB0byB0aGlzIGRvY3VtZW50IGl0c2VsZiwgYW5kIHRoaXMgYnJhbmNoXG4gICAgICogTmV2ZXIgZmlyZXMgKG1lYXN1cmVkLCBgb3duZWQtaW5zdGFuY2Utd29ya2VyLWF0dGFjaC5pbnRlZ3JhdGlvbi50ZXN0LnRzYCkuIFdpdGhvdXQgaXQgT2JzaWRpYW5cbiAgICAgKiBTaGlwcyB0aGUga2V5IGB0cnVlYCwgYHNob3VsZFVzZVBvcG91dCgpYCByZXR1cm5zIGl0LCBhbmQgYG9wZW4oKWAgcHV0cyB0aGUgbW9kYWwgaW4gYSBTRUNPTkRcbiAgICAgKiBFbGVjdHJvbiB3aW5kb3cgaW5zdGVhZCBcdTIwMTQgbGVhdmluZyB0aGlzIGRvY3VtZW50IHdpdGggbm90aGluZyB3aGlsZSByZXR1cm5pbmcgd2l0aG91dCB0aHJvd2luZy5cbiAgICAgKiBQcmUtYXR0YWNoaW5nIGtlZXBzIGBjb250YWluZXJFbGAgcmVhY2hhYmxlIGhlcmUsIHdoaWNoIGlzIGVub3VnaCBmb3IgYSBjYWxsZXIgdGhhdCByZWFkcyByb3dzIG9mZlxuICAgICAqIFRoZSB0YWI7IGl0IGlzIE5PVCBlbm91Z2ggZm9yIGEgc2NyZWVuc2hvdCwgd2hvc2UgZnJhbWUgaXMgb2YgdGhpcyB3aW5kb3cuIE9ubHkgdGhlIHZhdWx0LWxldmVsXG4gICAgICogRGVmYXVsdCBmaXhlcyB0aGF0LCBzbyB0aGlzIGlzIGEgZmxvb3IgcmF0aGVyIHRoYW4gdGhlIGZpeC5cbiAgICAgKlxuICAgICAqIEF0dGFjaGluZyBBRlRFUldBUkRTIGlzIHVzZWxlc3MgZWl0aGVyIHdheTogd2hhdGV2ZXIgdGhlIG1vZGFsIHJlbmRlcmVkIG9uIG9wZW4gaGFzIGFscmVhZHkgZ29uZVxuICAgICAqIFdoZXJlIGl0IHdlbnQuXG4gICAgICovXG4gICAgaWYgKCFkb2N1bWVudC5ib2R5LmNvbnRhaW5zKHNldHRpbmcuY29udGFpbmVyRWwpKSB7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZChzZXR0aW5nLmNvbnRhaW5lckVsKTtcbiAgICB9XG5cbiAgICAvLyBCb3RoIGxpc3RzIGFyZSBwb3B1bGF0ZWQgYmVmb3JlIGBvcGVuKClgLCBzbyBhbiB1bmtub3duIGlkIGNhbiBiZSByZWplY3RlZCB1cCBmcm9udCBcdTIwMTQgd2l0aCB0aGVcbiAgICAvLyBJZHMgdGhhdCBETyBleGlzdCBcdTIwMTQgaW5zdGVhZCBvZiBzcGVuZGluZyB0aGUgd2hvbGUgdGltZW91dCBsb29raW5nIGV4YWN0bHkgbGlrZSB0aGUgbW9kYWwtZG9lcy1cbiAgICAvLyBOb3QtcmVuZGVyIHN5bXB0b20gdGhpcyBoZWxwZXIgZXhpc3RzIHRvIHJ1bGUgb3V0LiBQbHVnaW4gdGFicyBsaXZlIGluIGBwbHVnaW5UYWJzYCwgbm90XG4gICAgLy8gYHNldHRpbmdUYWJzYCwgc28gYm90aCBhcmUgc2VhcmNoZWQuXG4gICAgY29uc3Qga25vd25UYWJzID0gWy4uLnNldHRpbmcuc2V0dGluZ1RhYnMsIC4uLnNldHRpbmcucGx1Z2luVGFic107XG4gICAgaWYgKGtub3duVGFicy5ldmVyeSgodGFiKSA9PiB0YWIuaWQgIT09IHRhYklkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgb3BlblNldHRpbmdzVGFiOiBubyBzZXR0aW5ncyB0YWIgd2l0aCBpZCBcIiR7dGFiSWR9XCIuIEF2YWlsYWJsZSBpZHM6ICR7a25vd25UYWJzLm1hcCgodGFiKSA9PiB0YWIuaWQpLmpvaW4oJywgJyl9LmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgc2V0dGluZy5vcGVuKCk7XG4gICAgc2V0dGluZy5vcGVuVGFiQnlJZCh0YWJJZCk7XG5cbiAgICAvLyBQb2xsIHRoZSBtb2RhbCdzIG93biBzdGF0ZSByYXRoZXIgdGhhbiBzbGVlcGluZzogYSBmaXhlZCBkZWxheSBpcyBlaXRoZXIgdG9vIHNob3J0IG9uIGEgbG9hZGVkXG4gICAgLy8gTWFjaGluZSBvciB3YXN0ZWQgdGltZS4gQSByZW5kZXJlZCB0YWIgaXMgdGhlIHJlcXVlc3RlZCBvbmUgQU5EIGhhcyBjb250ZW50LlxuICAgIGF3YWl0IHdhaXRVbnRpbCh7XG4gICAgICBtZXNzYWdlOiBgdGhlIFwiJHt0YWJJZH1cIiBzZXR0aW5ncyB0YWIgdG8gcmVuZGVyYCxcbiAgICAgIHByZWRpY2F0ZTogKCkgPT4ge1xuICAgICAgICBjb25zdCBjdXJyZW50VGFiID0gc2V0dGluZy5hY3RpdmVUYWI7XG4gICAgICAgIGlmICghY3VycmVudFRhYikge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY3VycmVudFRhYi5pZCA9PT0gdGFiSWQgJiYgY3VycmVudFRhYi5jb250YWluZXJFbC5jaGlsZEVsZW1lbnRDb3VudCA+IDA7XG4gICAgICB9LFxuICAgICAgdGltZW91dEluTWlsbGlzZWNvbmRzXG4gICAgfSk7XG5cbiAgICBjb25zdCBhY3RpdmVUYWIgPSBzZXR0aW5nLmFjdGl2ZVRhYjtcbiAgICBpZiAoIWFjdGl2ZVRhYikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdvcGVuU2V0dGluZ3NUYWI6IHRoZSBzZXR0aW5ncyBtb2RhbCByZXBvcnRlZCBubyBhY3RpdmUgdGFiIGFmdGVyIGl0IHJlbmRlcmVkLicpO1xuICAgIH1cblxuICAgIC8vIE5vdCBldmVyeSB0YWIgcmVuZGVycyBgLnNldHRpbmctaXRlbS1uYW1lYCByb3dzIChIb3RrZXlzIGRvZXMgbm90KSwgc28gYW4gZW1wdHkgYXJyYXkgaXMgYSB2YWxpZFxuICAgIC8vIEFuc3dlciBoZXJlIFx1MjAxNCB0aGUgcmVuZGVyIGl0c2VsZiB3YXMgYWxyZWFkeSBwcm92ZW4gYnkgdGhlIHBvbGwgYWJvdmUuXG4gICAgcmV0dXJuIFsuLi5hY3RpdmVUYWIuY29udGFpbmVyRWwucXVlcnlTZWxlY3RvckFsbCgnLnNldHRpbmctaXRlbS1uYW1lJyldLm1hcCgobmFtZUVsKSA9PiBuYW1lRWwudGV4dENvbnRlbnQpO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gd2FpdFVudGlsKHdhaXRQYXJhbXM6IFdhaXRVbnRpbFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGludGVydmFsSW5NaWxsaXNlY29uZHMgPSBXQUlUX1VOVElMX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIHByZWRpY2F0ZSxcbiAgICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IFdBSVRfVU5USUxfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFNcbiAgICB9ID0gd2FpdFBhcmFtcztcblxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgd2hpbGUgKCEoYXdhaXQgcHJlZGljYXRlKCkpKSB7XG4gICAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSA+PSB0aW1lb3V0SW5NaWxsaXNlY29uZHMpIHtcbiAgICAgICAgY29uc3Qgc3VmZml4ID0gbWVzc2FnZSA9PT0gdW5kZWZpbmVkID8gJycgOiBgOiAke21lc3NhZ2V9YDtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB3YWl0VW50aWwgdGltZWQgb3V0IGFmdGVyICR7U3RyaW5nKHRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9IG1pbGxpc2Vjb25kcyR7c3VmZml4fWApO1xuICAgICAgfVxuICAgICAgYXdhaXQgc2xlZXAoaW50ZXJ2YWxJbk1pbGxpc2Vjb25kcyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZXJyb3JUb1N0cmluZ0ltcGwoZXJyb3I6IHVua25vd24pOiBzdHJpbmcge1xuICAgIGlmICghKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKGVycm9yKTtcbiAgICB9XG5cbiAgICBsZXQgbWVzc2FnZSA9IGVycm9yLnN0YWNrID8/IGAke2Vycm9yLm5hbWV9OiAke2Vycm9yLm1lc3NhZ2V9YDtcbiAgICBpZiAoZXJyb3IuY2F1c2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbWVzc2FnZSA9IGFwcGVuZE5lc3RlZEVycm9yKG1lc3NhZ2UsIGVycm9yLmNhdXNlLCAnQ2F1c2VkIGJ5OicpO1xuICAgIH1cbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBBZ2dyZWdhdGVFcnJvcikge1xuICAgICAgY29uc3QgYWdncmVnYXRlZEVycm9yczogcmVhZG9ubHkgdW5rbm93bltdID0gZXJyb3IuZXJyb3JzO1xuICAgICAgZm9yIChjb25zdCBbaW5kZXgsIGFnZ3JlZ2F0ZWRFcnJvcl0gb2YgYWdncmVnYXRlZEVycm9ycy5lbnRyaWVzKCkpIHtcbiAgICAgICAgbWVzc2FnZSA9IGFwcGVuZE5lc3RlZEVycm9yKG1lc3NhZ2UsIGFnZ3JlZ2F0ZWRFcnJvciwgYEFnZ3JlZ2F0ZWQgZXJyb3IgIyR7U3RyaW5nKGluZGV4ICsgMSl9OmApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWVzc2FnZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFwcGVuZE5lc3RlZEVycm9yKG1lc3NhZ2U6IHN0cmluZywgbmVzdGVkRXJyb3I6IHVua25vd24sIHRpdGxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCByZXN1bHQgPSBgJHttZXNzYWdlfVxcbiR7Z2VuZXJhdGVTdGFja1RyYWNlTGluZSh0aXRsZSl9YDtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgZXJyb3JUb1N0cmluZ0ltcGwobmVzdGVkRXJyb3IpLnNwbGl0KCdcXG4nKSkge1xuICAgICAgaWYgKCFsaW5lLnRyaW0oKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdCArPSBsaW5lLnN0YXJ0c1dpdGgoU1RBQ0tfVFJBQ0VfUFJFRklYKVxuICAgICAgICA/IGBcXG4ke2xpbmV9YFxuICAgICAgICA6IGBcXG4ke2dlbmVyYXRlU3RhY2tUcmFjZUxpbmUobGluZSl9YDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdlbmVyYXRlU3RhY2tUcmFjZUxpbmUodGl0bGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke1NUQUNLX1RSQUNFX1BSRUZJWH0gLS0tICR7dGl0bGV9IC0tLSAoMClgO1xuICB9XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7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
499
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL25hbWVzcGFjZS1ib290c3RyYXAudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBCb290c3RyYXBzIHRoZSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIG5hbWVzcGFjZSBpbiB0aGVcbiAqIE9ic2lkaWFuIHByb2Nlc3MuIEV4dHJhY3RlZCB0byBpdHMgb3duIG1vZHVsZSB0byBhdm9pZCBkZXBlbmRlbmN5IGN5Y2xlc1xuICogYmV0d2VlbiBgZXZhbC1pbi1vYnNpZGlhbi50c2AgYW5kIHRoZSB0cmFuc3BvcnQgbW9kdWxlcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgTW9kaWZpZXIsXG4gIFRGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUge1xuICBDbGlja0VsZW1lbnRQYXJhbXMsXG4gIENsaWNrTW91c2VQYXJhbXMsXG4gIENyZWF0ZU5vdGVQYXJhbXMsXG4gIEhvdmVyRWxlbWVudFBhcmFtcyxcbiAgTW92ZU1vdXNlUGFyYW1zLFxuICBPcGVuU2V0dGluZ3NUYWJQYXJhbXMsXG4gIFByZXNzS2V5UGFyYW1zLFxuICBUeXBlSW50b0VkaXRvclBhcmFtcyxcbiAgVW5ob3ZlckVsZW1lbnRQYXJhbXMsXG4gIFdhaXRVbnRpbFBhcmFtc1xufSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4uY2pzJztcbmltcG9ydCB0eXBlIHsgR2VuZXJhdGVGdW5jdGlvbkNhbGxQYXJhbXMgfSBmcm9tICcuL2dlbmVyYXRlLWZ1bmN0aW9uLWNhbGwuY2pzJztcbmltcG9ydCB0eXBlIHsgTGliUmVzb2x2ZXIgfSBmcm9tICcuL2xpYi1yZWdpc3RyeS5janMnO1xuaW1wb3J0IHR5cGUge1xuICBPYnNpZGlhblRyYW5zcG9ydCxcbiAgVHJhbnNwb3J0RXZhbE9wdGlvbnNcbn0gZnJvbSAnLi90cmFuc3BvcnQuY2pzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVGdW5jdGlvbkNhbGwgfSBmcm9tICcuL2dlbmVyYXRlLWZ1bmN0aW9uLWNhbGwuY2pzJztcbmltcG9ydCB7XG4gIGdldEJvb3RzdHJhcFZlcnNpb24sXG4gIGdldFJlZ2lzdGVyZWRMaWJSZXNvbHZlcnNcbn0gZnJvbSAnLi9saWItcmVnaXN0cnkuY2pzJztcbmltcG9ydCB7XG4gIE1PQklMRV9JTlBVVF9CSU5ESU5HX05BTUUsXG4gIE1PQklMRV9JTlBVVF9USU1FT1VUX0lOX01JTExJU0VDT05EU1xufSBmcm9tICcuL21vYmlsZS1pbnB1dC5janMnO1xuXG5pbnRlcmZhY2UgQm9vdHN0cmFwTmFtZXNwYWNlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBob3N0LWluc3RhbGxlZCBgUnVudGltZS5hZGRCaW5kaW5nYCBmdW5jdGlvbiB0aGUgbW9iaWxlIHRydXN0ZWQtaW5wdXQgcGF0aCBjYWxscy5cbiAgICpcbiAgICogUGFzc2VkIGluIGFzIGRhdGEgYmVjYXVzZSB0aGUgYm9vdHN0cmFwIGNsb3N1cmUgbWF5IG5vdCByZWFkIG91dGVyIHNjb3BlICgqKkwxNSoqKSwgc28gaXQgY2Fubm90XG4gICAqIGltcG9ydCB7QGxpbmsgTU9CSUxFX0lOUFVUX0JJTkRJTkdfTkFNRX0gZGlyZWN0bHkuXG4gICAqL1xuICByZWFkb25seSBpbnB1dEJpbmRpbmdOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEhvdyBsb25nIHRoZSBtb2JpbGUgdHJ1c3RlZC1pbnB1dCBwYXRoIHdhaXRzIGZvciB0aGUgaG9zdCB0byBhbnN3ZXIgb25lIHJlcXVlc3QuXG4gICAqL1xuICByZWFkb25seSBpbnB1dFRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIHJlYWRvbmx5IGxpYlJlc29sdmVyczogTGliUmVzb2x2ZXJbXTtcbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEVuc3VyZXMgdGhlIGB3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZ2AgbmFtZXNwYWNlIGlzIGJvb3RzdHJhcHBlZFxuICogaW4gdGhlIE9ic2lkaWFuIHByb2Nlc3Mgd2l0aCB0aGUgY3VycmVudCBsaWJyYXJ5IHZlcnNpb24uXG4gKlxuICogUGVyZm9ybXMgYSBsaWdodHdlaWdodCB2ZXJzaW9uIGNoZWNrIHZpYSB0aGUgdHJhbnNwb3J0LiBJZiB0aGUgbmFtZXNwYWNlXG4gKiBkb2Vzbid0IGV4aXN0IG9yIGhhcyBhIGRpZmZlcmVudCB2ZXJzaW9uLCBzZW5kcyB0aGUgZnVsbCBib290c3RyYXAgZXhwcmVzc2lvblxuICogdG8gcmVnaXN0ZXIgYWxsIGhlbHBlciBmdW5jdGlvbnMuXG4gKlxuICogQHBhcmFtIHRyYW5zcG9ydCAtIFRoZSB0cmFuc3BvcnQgdG8gdXNlIGZvciBldmFsdWF0aW9uLlxuICogQHBhcmFtIGN3ZCAtIFRoZSB3b3JraW5nIGRpcmVjdG9yeSAodmF1bHQgcGF0aCkuXG4gKiBAcGFyYW0gdGltZW91dEluTWlsbGlzZWNvbmRzIC0gT3B0aW9uYWwgcGVyLWV2YWwgdGltZW91dC4gRm9yd2FyZGVkIHRvIGJvdGhcbiAqICAgdGhlIHZlcnNpb24gY2hlY2sgYW5kIHRoZSBib290c3RyYXAgZXZhbCBzbyBhIGh1bmcgYG9ic2lkaWFuIGV2YWxgIHJlamVjdHNcbiAqICAgaW5zdGVhZCBvZiBibG9ja2luZyB0aGUgY2FsbGVyIGluZGVmaW5pdGVseS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCh0cmFuc3BvcnQ6IE9ic2lkaWFuVHJhbnNwb3J0LCBjd2Q6IHN0cmluZywgdGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGV2YWxPcHRpb25zOiBUcmFuc3BvcnRFdmFsT3B0aW9ucyA9IHtcbiAgICBjd2QsXG4gICAgLi4uKHRpbWVvdXRJbk1pbGxpc2Vjb25kcyAhPT0gdW5kZWZpbmVkICYmIHsgdGltZW91dEluTWlsbGlzZWNvbmRzIH0pXG4gIH07XG4gIGNvbnN0IGJvb3RzdHJhcFZlcnNpb24gPSBnZXRCb290c3RyYXBWZXJzaW9uKCk7XG4gIGNvbnN0IHZlcnNpb25Kc29uID0gSlNPTi5zdHJpbmdpZnkoYm9vdHN0cmFwVmVyc2lvbik7XG4gIGNvbnN0IHZlcnNpb25NYXRjaEpzb24gPSBhd2FpdCB0cmFuc3BvcnQuZXZhbHVhdGUoXG4gICAgYEpTT04uc3RyaW5naWZ5KHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nPy52ZXJzaW9uID09PSAke3ZlcnNpb25Kc29ufSlgLFxuICAgIGV2YWxPcHRpb25zXG4gICk7XG5cbiAgaWYgKHZlcnNpb25NYXRjaEpzb24gPT09ICd0cnVlJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGJvb3RzdHJhcEV4cHJlc3Npb24gPSBnZW5lcmF0ZUZ1bmN0aW9uQ2FsbChib290c3RyYXBOYW1lc3BhY2UsIHtcbiAgICBpbnB1dEJpbmRpbmdOYW1lOiBNT0JJTEVfSU5QVVRfQklORElOR19OQU1FLFxuICAgIGlucHV0VGltZW91dEluTWlsbGlzZWNvbmRzOiBNT0JJTEVfSU5QVVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgbGliUmVzb2x2ZXJzOiBbLi4uZ2V0UmVnaXN0ZXJlZExpYlJlc29sdmVycygpXSxcbiAgICB2ZXJzaW9uOiBib290c3RyYXBWZXJzaW9uXG4gIH0pO1xuICBhd2FpdCB0cmFuc3BvcnQuZXZhbHVhdGUoYm9vdHN0cmFwRXhwcmVzc2lvbiwgZXZhbE9wdGlvbnMpO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gU2VyaWFsaXplZCB2aWEgdG9TdHJpbmcoKSBhbmQgZXhlY3V0ZWQgaW5zaWRlIHRoZSBPYnNpZGlhbiBwcm9jZXNzLCBub3QgaW4gTm9kZS4gQ292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cy4gKi9cblxuLyoqXG4gKiBCb290c3RyYXBzIHRoZSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIG5hbWVzcGFjZSB3aXRoIGFsbFxuICogaGVscGVyIGZ1bmN0aW9ucy4gU2VyaWFsaXplZCB2aWEgYHRvU3RyaW5nKClgIGFuZCBzZW50IHRvIE9ic2lkaWFuIG9uY2VcbiAqIHBlciBsaWJyYXJ5IHZlcnNpb24uXG4gKlxuICogUHJlc2VydmVzIGBjb250ZXh0c2AgYWNyb3NzIHZlcnNpb24gdXBncmFkZXMgc28gbGl2ZSB7QGxpbmsgQ29udGV4dElkfVxuICogcmVmZXJlbmNlcyBzdXJ2aXZlLlxuICpcbiAqIE11c3QgTk9UIHJlZmVyZW5jZSBhbnkgb3V0ZXIgc2NvcGUgXHUyMDE0IGl0IGlzIHNlcmlhbGl6ZWQgdmlhIGB0b1N0cmluZygpYC5cbiAqXG4gKiBAcGFyYW0gYm9vdHN0cmFwUGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgaW5jbHVkaW5nIHRoZSBsaWJyYXJ5IHZlcnNpb24uXG4gKi9cbmZ1bmN0aW9uIGJvb3RzdHJhcE5hbWVzcGFjZShib290c3RyYXBQYXJhbXM6IEdlbmVyYXRlRnVuY3Rpb25DYWxsUGFyYW1zPEJvb3RzdHJhcE5hbWVzcGFjZVBhcmFtcz4pOiB2b2lkIHtcbiAgaW50ZXJmYWNlIEludGVncmF0aW9uVGVzdGluZ0hvbGRlciB7XG4gICAgX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZzogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGU7XG4gIH1cblxuICBpbnRlcmZhY2UgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGUge1xuICAgIGNvbnRleHRzOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG4gICAgbGliUmVzb2x2ZXJzOiBMaWJSZXNvbHZlcltdO1xuICAgIG9ic2lkaWFuTW9kdWxlPzogdW5rbm93bjtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH1cblxuICBpbnRlcmZhY2UgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlIGV4dGVuZHMgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGUge1xuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cml2aWFsIFx1MjAxNCByZWFkc1xuICAgICAqIGB3aW5kb3cuYXBwYCwgd2hpY2ggZXZlcnkgY2xvc3VyZSBhbHJlYWR5IHJlY2VpdmVzIGRpcmVjdGx5IGFzIGl0cyBgYXBwYFxuICAgICAqIGFyZywgc28gdGhlcmUgaXMgbm90aGluZyBnZW5lcmFsLXB1cnBvc2UgdG8gc2hhcmUuXG4gICAgICovXG4gICAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgICAvKipcbiAgICAgKiBJbnRlbnRpb25hbGx5IE5PVCBtaWdyYXRlZCB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYDogdHJhbnNwb3J0LW9ubHkuIEl0IGlzIHRoZSByZW5kZXJlciBoYWxmIG9mXG4gICAgICogdGhlIG1vYmlsZSB0cnVzdGVkLWlucHV0IGNoYW5uZWwncyAqKmV4YWN0bHktb25jZSoqIGd1YXJhbnRlZSAoKipMMzkqKikuXG4gICAgICpcbiAgICAgKiBDRFAgYnJvYWRjYXN0cyBgUnVudGltZS5iaW5kaW5nQ2FsbGVkYCB0byAqKmV2ZXJ5KiogYXR0YWNoZWQgc2Vzc2lvbiwgc28gZXZlcnkgTm9kZSBwcm9jZXNzXG4gICAgICogaG9sZGluZyBhbiBpbnB1dCBjaGFubmVsIHRvIHRoaXMgV2ViVmlldyBzZXJ2aWNlcyB0aGUgc2FtZSByZXF1ZXN0IFx1MjAxNCBhbmQgZWFjaCBvbmUgaW5qZWN0cyB0aGVcbiAgICAgKiBmdWxsIGdlc3R1cmUuIFdpdGggdHdvIHByb2Nlc3NlcyBhdHRhY2hlZCAoYSBWaXRlc3QgbWFpbiBwcm9jZXNzIGFuZCBpdHMgd29ya2VyLCB3aGljaCBpcyB0aGVcbiAgICAgKiBvcmRpbmFyeSBjb25zdW1lciBzaGFwZSkgb25lIGBjbGlja0VsZW1lbnRgIHRoZXJlZm9yZSBhcnJpdmVkIGFzIFRXTyB0YXBzLCBhbmQgb25lIGBwcmVzc0tleWAgYXNcbiAgICAgKiB0d28ga2V5IHByZXNzZXMuIE1lYXN1cmVkIDIwMjYtMDktMTA6IHR3byBwaWRzIHNlcnZpY2luZyByZXF1ZXN0IGBpZD0xYCBpbiB0aGUgc2FtZSBtaWxsaXNlY29uZC5cbiAgICAgKlxuICAgICAqIFRoZSBjbGFpbSBpcyBtYWRlIGluIHRoZSBQQUdFIHJhdGhlciB0aGFuIGluIGFueSBob3N0IGJlY2F1c2UgdGhlIHBhZ2UgaXMgdGhlIG9ubHkgdGhpbmcgYWxsIHRoZVxuICAgICAqIGhvc3RzIHNoYXJlLiBKYXZhU2NyaXB0IGlzIHNpbmdsZS10aHJlYWRlZCwgc28gdHdvIGBSdW50aW1lLmV2YWx1YXRlYCBjYWxscyByYWNpbmcgZm9yIHRoZSBzYW1lXG4gICAgICogaWQgYXJlIHNlcmlhbGl6ZWQgYW5kIGV4YWN0bHkgb25lIHNlZXMgYHRydWVgLlxuICAgICAqXG4gICAgICogQHBhcmFtIGlkIC0gVGhlIHJlcXVlc3QgaWQgdG8gY2xhaW0uXG4gICAgICogQHJldHVybnMgYHRydWVgIGZvciB0aGUgZmlyc3QgY2FsbGVyIHRvIGNsYWltIHRoaXMgaWQsIGBmYWxzZWAgZm9yIGV2ZXJ5IGxhdGVyIG9uZS5cbiAgICAgKi9cbiAgICBjbGFpbUlucHV0KGlkOiBzdHJpbmcpOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogSW50ZW50aW9uYWxseSBOT1QgbWlncmF0ZWQgdG8gYG9ic2lkaWFuLWRldi11dGlsc2A6IHRyYW5zcG9ydC1vbmx5LiBJdFxuICAgICAqIG93bnMgdGhlIGhhcm5lc3MgdGVzdCB3aW5kb3cncyBsaWZlY3ljbGUgdmlhIEVsZWN0cm9uIChgd2luZG93LmVsZWN0cm9uV2luZG93YCksXG4gICAgICogd2hpY2ggaXMgdGhlIGhhcm5lc3MncyBjb25jZXJuLCBub3QgYSBnZW5lcmFsIHV0aWxpdHkuXG4gICAgICovXG4gICAgZGVzdHJveUN1cnJlbnRXaW5kb3coKTogUHJvbWlzZTx2b2lkPjtcblxuICAgIC8qKlxuICAgICAqIFN5bmNlZCB3aXRoIGBvYnNpZGlhbi1kZXYtdXRpbHNgIChtaXJyb3IgYHdvcmtzcGFjZS50c2ApIFx1MjAxNCBzZWUgTDE3LlxuICAgICAqL1xuICAgIGVuc3VyZUxheW91dFJlYWR5KCk6IFByb21pc2U8dm9pZD47XG5cbiAgICAvKipcbiAgICAgKiBTeW5jZWQgd2l0aCBgb2JzaWRpYW4tZGV2LXV0aWxzYCAobWlycm9yIGBlcnJvci50c2ApIFx1MjAxNCBzZWUgTDE3LlxuICAgICAqL1xuICAgIGVycm9yVG9TdHJpbmcoZXJyb3I6IHVua25vd24pOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBJbnRlbnRpb25hbGx5IE5PVCBtaWdyYXRlZCB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYDogdHJhbnNwb3J0LW9ubHkuIFRoaXNcbiAgICAgKiBpcyB0aGUgaGFybmVzcydzIG93biBldmFsIHBsdW1iaW5nIChidWlsZHMgdGhlIGBsaWJgIGJhZywgcmVzb2x2ZXMgdGhlXG4gICAgICogbW9kdWxlLCBpbnZva2VzIHRoZSBjbG9zdXJlLCBlbnZlbG9wZXMgdGhlIHJlc3VsdCkgXHUyMDE0IG1lYW5pbmdsZXNzIG91dHNpZGVcbiAgICAgKiB0aGUgaGFybmVzcy5cbiAgICAgKi9cbiAgICBldmFsV3JhcHBlcihuc1BhcmFtczogRXZhbFdyYXBwZXJQYXJhbXMpOiBQcm9taXNlPHN0cmluZz47XG5cbiAgICAvKipcbiAgICAgKiBJbnRlbnRpb25hbGx5IE5PVCBtaWdyYXRlZCB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYDogdHJhbnNwb3J0LW9ubHkuIEl0IGlzXG4gICAgICogdGhlIGhhcm5lc3MncyBvbmUtdGltZSBib290c3RyYXAgdGhhdCByZXNvbHZlcyB0aGUgYG9ic2lkaWFuYCBtb2R1bGUgZm9yXG4gICAgICogdGhlIHByb2Nlc3M7IGNsb3N1cmVzIG9idGFpbiBpdCBkaXJlY3RseSB2aWEgdGhlaXIgYG9ic2lkaWFuTW9kdWxlYCBhcmcuXG4gICAgICovXG4gICAgZ2V0T2JzaWRpYW5Nb2R1bGUoKTogUHJvbWlzZTx1bmtub3duPjtcblxuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cmFuc3BvcnQtb25seS4gUmF3XG4gICAgICogRWxlY3Ryb24gSVBDIChgd2luZG93LmVsZWN0cm9uLmlwY1JlbmRlcmVyLnNlbmRTeW5jYCkgaXMgYSBoYXJuZXNzL3RyYW5zcG9ydFxuICAgICAqIHByaW1pdGl2ZSwgbm90IGEgZ2VuZXJhbC1wdXJwb3NlIGhlbHBlci5cbiAgICAgKi9cbiAgICBpcGNTZW5kU3luYyhuc1BhcmFtczogSXBjU2VuZFN5bmNQYXJhbXMpOiBQcm9taXNlPHZvaWQ+O1xuXG4gICAgLyoqXG4gICAgICogSW50ZW50aW9uYWxseSBOT1QgbWlncmF0ZWQgdG8gYG9ic2lkaWFuLWRldi11dGlsc2A6IHRyYW5zcG9ydC1vbmx5LiBJdCBpc1xuICAgICAqIHBhcnQgb2YgdGhlIGhhcm5lc3MncyB2YXVsdC1wYXRoIGhhbmRzaGFrZSB3aXRoIHRoZSBOb2RlIHNpZGUsIG5vdCBhXG4gICAgICogZ2VuZXJhbCB1dGlsaXR5LlxuICAgICAqL1xuICAgIHBvbGxWYXVsdEJhc2VQYXRoKCk6IFByb21pc2U8c3RyaW5nPjtcblxuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cmFuc3BvcnQtb25seS4gSXQgaXMgdGhlIHJlbmRlcmVyIGVuZCBvZiB0aGVcbiAgICAgKiBtb2JpbGUgdHJ1c3RlZC1pbnB1dCBjaGFubmVsICgqKkwzOSoqKSBcdTIwMTQgdGhlIGhvc3QgY2FsbHMgaXQgb3ZlciBDRFAgdG8gYW5zd2VyIGEgcmVxdWVzdCB0aGlzXG4gICAgICogY2xvc3VyZSBpcyBhd2FpdGluZywgc28gaXQgaXMgbWVhbmluZ2xlc3Mgb3V0c2lkZSB0aGUgaGFybmVzcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpZCAtIFRoZSByZXF1ZXN0IGlkIGJlaW5nIGFuc3dlcmVkLlxuICAgICAqIEBwYXJhbSBlcnJvck1lc3NhZ2UgLSBXaHkgdGhlIGluamVjdGlvbiBmYWlsZWQsIG9yIGBudWxsYCBvbiBzdWNjZXNzLlxuICAgICAqL1xuICAgIHJlc29sdmVJbnB1dChpZDogc3RyaW5nLCBlcnJvck1lc3NhZ2U6IG51bGwgfCBzdHJpbmcpOiB2b2lkO1xuXG4gICAgLyoqXG4gICAgICogSW50ZW50aW9uYWxseSBOT1QgbWlncmF0ZWQgdG8gYG9ic2lkaWFuLWRldi11dGlsc2A6IG5pY2hlL3RyaXZpYWwgXHUyMDE0IGFcbiAgICAgKiBvbmUtbGluZSBgbG9jYWxTdG9yYWdlLnNldEl0ZW1gIHdyYXBwZXIgdXNlZCBvbmx5IGJ5IHRoZSBoYXJuZXNzLlxuICAgICAqL1xuICAgIHNldExvY2FsU3RvcmFnZUl0ZW0obnNQYXJhbXM6IFNldExvY2FsU3RvcmFnZUl0ZW1QYXJhbXMpOiBQcm9taXNlPHZvaWQ+O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGRlbGliZXJhdGUgc2VhbSBgb2JzaWRpYW4tZGV2LXV0aWxzYCByZWFkcyBvbiBtb2JpbGUgXHUyMDE0IHRoZSBvbmUgbmFtZXNwYWNlIG1lbWJlciB0aGF0IGV4aXN0cyBmb3JcbiAgICAgKiBhbm90aGVyIHBhY2thZ2UgcmF0aGVyIHRoYW4gZm9yIHRoZSBoYXJuZXNzLiBJdHMgKipMMTcqKiBtaXJyb3IgKGBkZXNrdG9wLXRydXN0ZWQtaW5wdXQudHNgKSBjYW5cbiAgICAgKiByZWFjaCBhIHRydXN0ZWQgZXZlbnQgb24gZGVza3RvcCBieSBpdHNlbGYsIGJ1dCBvbiBtb2JpbGUgdGhlIGluamVjdGlvbiBoYXMgdG8gY29tZSBmcm9tIHRoZSBOb2RlXG4gICAgICogc2lkZSBvdmVyIHRoZSBoYXJuZXNzJ3MgQ0RQIGNoYW5uZWwgKCoqTDM5KiopLCBhbmQgYG9ic2lkaWFuLWRldi11dGlsc2AgbXVzdCBuZXZlciBpbXBvcnQgdGhpc1xuICAgICAqIHBhY2thZ2UgYXQgcnVudGltZSAoaXRzIG93biBwZWVyLWRlcGVuZGVuY3kgcnVsZSkuIFNvIGl0IHJlYWRzIHRoZXNlIG9mZlxuICAgICAqIGB3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZ2AgaW5zdGVhZCwgZGVjbGFyaW5nIHRoZSBzaGFwZSBsb2NhbGx5LlxuICAgICAqXG4gICAgICogVGhlc2UgYXJlIHRoZSAqKnNhbWUgZnVuY3Rpb24gb2JqZWN0cyoqIGBldmFsV3JhcHBlcmAgcHV0cyBpbiBhIGNsb3N1cmUncyBgbGliYCBiYWcsIG5vdCB3cmFwcGVyczpcbiAgICAgKiBlYWNoIGFscmVhZHkgYnJhbmNoZXMgb24gYFBsYXRmb3JtLmlzTW9iaWxlYCBpbnRlcm5hbGx5LCBzbyB0aGUgbW9iaWxlIHNlbWFudGljcyBsaXZlIGluIGV4YWN0bHkgb25lXG4gICAgICogcGxhY2UgYW5kIG9uZSBzZWFtIHNlcnZlcyBib3RoIHBsYXRmb3Jtcy5cbiAgICAgKi9cbiAgICByZWFkb25seSB0cnVzdGVkSW5wdXQ6IFRydXN0ZWRJbnB1dEhlbHBlcnM7XG4gIH1cblxuICBpbnRlcmZhY2UgRXZhbFdyYXBwZXJQYXJhbXMge1xuICAgIGNhbGxiYWNrKGZ1bmN0aW9uQXJndW1lbnRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHVua25vd247XG4gICAgcmVhZG9ubHkgY29udGV4dElkPzogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGlucHV0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfVxuXG4gIGludGVyZmFjZSBGaWxlU3lzdGVtQWRhcHRlckxpa2Uge1xuICAgIGJhc2VQYXRoPzogc3RyaW5nO1xuICAgIGdldEJhc2VQYXRoPzogKCkgPT4gc3RyaW5nO1xuICB9XG5cbiAgaW50ZXJmYWNlIElwY1NlbmRTeW5jUGFyYW1zIHtcbiAgICByZWFkb25seSBjaGFubmVsOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgY2hhbm5lbEFyZ3VtZW50czogdW5rbm93bltdO1xuICB9XG5cbiAgLy8gQ29tbXVuaXR5LXBsdWdpbiBBUEkgbWVtYmVycyB0aGF0IG9sZCBPYnNpZGlhbiB2ZXJzaW9ucyAoZS5nLiAwLjYueCkgbGFjay5cbiAgLy8gYG9ic2lkaWFuLXR5cGluZ3NgIGRlY2xhcmVzIHRoZW0gYXMgYWx3YXlzLXByZXNlbnQsIHNvIHByb2JlIHRocm91Z2ggdGhpc1xuICAvLyBPcHRpb25hbC1tZW1iZXIgdmlldyB0byBkZXRlY3QgdGhlaXIgcnVudGltZSBhYnNlbmNlIHdpdGhvdXQgYSBmYWxzZVxuICAvLyBgbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uYC5cbiAgaW50ZXJmYWNlIFBsdWdpbnNMaWtlIHtcbiAgICBpc0VuYWJsZWQ/OiAoKSA9PiBib29sZWFuO1xuICAgIGxvYWRQbHVnaW4/OiAoaWQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICBtYW5pZmVzdHM/OiB1bmtub3duO1xuICAgIHVuaW5zdGFsbFBsdWdpbj86IChpZDogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+O1xuICB9XG5cbiAgaW50ZXJmYWNlIFNldExvY2FsU3RvcmFnZUl0ZW1QYXJhbXMge1xuICAgIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuICAgIHJlYWRvbmx5IHZhbHVlOiBzdHJpbmc7XG4gIH1cblxuICAvLyBUaGUgc2hhcGUgb2YgdGhlIGB0cnVzdGVkSW5wdXRgIHNlYW0uIEV2ZXJ5IG1lbWJlciBpcyBvbmUgb2YgdGhlIEwxNy1zeW5jZWQgaGVscGVycywgZXhwb3NlZCBhcyB0aGVcbiAgLy8gU2FtZSBmdW5jdGlvbiBvYmplY3QgYGV2YWxXcmFwcGVyYCBwdXRzIGluIGEgY2xvc3VyZSdzIGBsaWJgIGJhZy5cbiAgaW50ZXJmYWNlIFRydXN0ZWRJbnB1dEhlbHBlcnMge1xuICAgIGNsaWNrRWxlbWVudChjbGlja1BhcmFtczogQ2xpY2tFbGVtZW50UGFyYW1zKTogUHJvbWlzZTx2b2lkPjtcbiAgICBjbGlja01vdXNlKGNsaWNrUGFyYW1zOiBDbGlja01vdXNlUGFyYW1zKTogUHJvbWlzZTx2b2lkPjtcbiAgICBob3ZlckVsZW1lbnQoaG92ZXJQYXJhbXM6IEhvdmVyRWxlbWVudFBhcmFtcyk6IFByb21pc2U8dm9pZD47XG4gICAgbW92ZU1vdXNlKG1vdmVQYXJhbXM6IE1vdmVNb3VzZVBhcmFtcyk6IFByb21pc2U8dm9pZD47XG4gICAgcHJlc3NLZXkocHJlc3NQYXJhbXM6IFByZXNzS2V5UGFyYW1zKTogUHJvbWlzZTx2b2lkPjtcbiAgICB0eXBlSW50b0VkaXRvcih0eXBlUGFyYW1zOiBUeXBlSW50b0VkaXRvclBhcmFtcyk6IFByb21pc2U8dm9pZD47XG4gICAgdW5ob3ZlckVsZW1lbnQodW5ob3ZlclBhcmFtczogVW5ob3ZlckVsZW1lbnRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+O1xuICB9XG5cbiAgLy8gYFZhdWx0LmNvbmZpZ0RpcmAgaXMgZGVjbGFyZWQgYWx3YXlzLXByZXNlbnQgYnkgYG9ic2lkaWFuLXR5cGluZ3NgLCBidXQgb2xkXG4gIC8vIE9ic2lkaWFuIHZlcnNpb25zIChlLmcuIDAuOS4xMCkgbGVhdmUgaXQgdW5kZWZpbmVkIGF0IHJ1bnRpbWUuIFByb2JlIHRocm91Z2hcbiAgLy8gVGhpcyBvcHRpb25hbC1tZW1iZXIgdmlldyBzbyBhIGA/PyAnLm9ic2lkaWFuJ2AgZGVmYXVsdCBpcyBub3QgZmxhZ2dlZCBhcyBhblxuICAvLyBVbm5lY2Vzc2FyeSBjb25kaXRpb24uXG4gIGludGVyZmFjZSBWYXVsdExpa2Uge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25hbWUtcmVwbGFjZW1lbnRzIC0tIFN0cnVjdHVyYWwgbWlycm9yIG9mIE9ic2lkaWFuJ3Mgb3duIGBWYXVsdC5jb25maWdEaXJgOyB0aGUgbmFtZSBoYXMgdG8gbWF0Y2ggZm9yIHRoZSBwcm9iZSB0byByZWFkIGl0LlxuICAgIGNvbmZpZ0Rpcj86IHN0cmluZztcbiAgfVxuXG4gIC8vIGB3aW5kb3cuYXBwYCAvIGBhcHAud29ya3NwYWNlYCBhcmUgZGVjbGFyZWQgYWx3YXlzLXByZXNlbnQsIGJ1dCBhcmUgdHJhbnNpZW50bHlcbiAgLy8gVW5kZWZpbmVkIGR1cmluZyBib290IGFuZCBhZnRlciBhbiBvd25lZC13aW5kb3cgcmVsb2FkLiBQcm9iZSB0aHJvdWdoIHRoZXNlXG4gIC8vIE9wdGlvbmFsLW1lbWJlciB2aWV3cyBzbyB0aGUgcmVhZGluZXNzIGNoZWNrIGNhbiBndWFyZCB0aGVtIHdpdGhvdXQgYSBmYWxzZVxuICAvLyBgbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uYC5cbiAgaW50ZXJmYWNlIFdvcmtzcGFjZUxpa2Uge1xuICAgIGxheW91dFJlYWR5PzogYm9vbGVhbjtcbiAgfVxuXG4gIGludGVyZmFjZSBBcHBMaWtlIHtcbiAgICB3b3Jrc3BhY2U/OiBXb3Jrc3BhY2VMaWtlO1xuICB9XG5cbiAgdHlwZSBDdXJyZW50V2ViQ29udGVudHMgPSBSZXR1cm5UeXBlPFdpbmRvd1snZWxlY3Ryb24nXVsncmVtb3RlJ11bJ2dldEN1cnJlbnRXZWJDb250ZW50cyddPjtcblxuICAvLyBUaGUgRWxlY3Ryb24gbW9kaWZpZXIta2V5IG5hbWVzIGBzZW5kSW5wdXRFdmVudGAgYWNjZXB0cyAoZS5nLiAnbWV0YScsICdjb250cm9sJywgJ3NoaWZ0JywgJ2FsdCcpLlxuICAvLyBEZXJpdmVkIGZyb20gdGhlIHdlYi1jb250ZW50cyB0eXBlIHNvIGl0IHN0YXlzIGluIHN5bmMgd2l0aCB0aGUgRWxlY3Ryb24gdHlwaW5ncy5cbiAgdHlwZSBFbGVjdHJvbk1vZGlmaWVyID0gTm9uTnVsbGFibGU8UGFyYW1ldGVyczxDdXJyZW50V2ViQ29udGVudHNbJ3NlbmRJbnB1dEV2ZW50J10+WzBdWydtb2RpZmllcnMnXT5bbnVtYmVyXTtcblxuICBpbnRlcmZhY2UgT2JzaWRpYW5Nb2R1bGVXaXRoUGxhdGZvcm0ge1xuICAgIFBsYXRmb3JtOiBPYnNpZGlhblBsYXRmb3JtO1xuICB9XG5cbiAgaW50ZXJmYWNlIE9ic2lkaWFuUGxhdGZvcm0ge1xuICAgIGlzTWFjT1M6IGJvb2xlYW47XG4gICAgaXNNb2JpbGU6IGJvb2xlYW47XG4gIH1cblxuICAvKipcbiAgICogQSB0cnVzdGVkLWlucHV0IHJlcXVlc3QgaGFuZGVkIHRvIHRoZSBob3N0IG92ZXIgdGhlIGBSdW50aW1lLmFkZEJpbmRpbmdgIGNoYW5uZWwuXG4gICAqXG4gICAqIFN0cnVjdHVyYWxseSBpZGVudGljYWwgdG8gYE1vYmlsZUlucHV0UmVxdWVzdGAgaW4gYG1vYmlsZS1pbnB1dC50c2AsIHJlZGVjbGFyZWQgaGVyZSBiZWNhdXNlIHRoaXNcbiAgICogY2xvc3VyZSBpcyBzZXJpYWxpemVkIHZpYSBgdG9TdHJpbmcoKWAgYW5kIGNhbm5vdCBpbXBvcnQgKCoqTDE1KiopLiBUaGUgdHdvIGFyZSBvbmUgd2lyZSBmb3JtYXQ7IGNoYW5nZVxuICAgKiB0aGVtIHRvZ2V0aGVyLlxuICAgKi9cbiAgdHlwZSBNb2JpbGVJbnB1dFJlcXVlc3QgPSBNb2JpbGVLZXlJbnB1dFJlcXVlc3QgfCBNb2JpbGVQb2ludGVySW5wdXRSZXF1ZXN0O1xuXG4gIGludGVyZmFjZSBNb2JpbGVLZXlJbnB1dFJlcXVlc3Qge1xuICAgIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGtpbmQ6ICdrZXknO1xuICAgIHJlYWRvbmx5IG1vZGlmaWVyczogcmVhZG9ubHkgc3RyaW5nW107XG4gIH1cblxuICBpbnRlcmZhY2UgTW9iaWxlUG9pbnRlcklucHV0UmVxdWVzdCB7XG4gICAgcmVhZG9ubHkga2luZDogJ2xvbmdQcmVzcycgfCAndGFwJztcbiAgICByZWFkb25seSBtb2RpZmllcnM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAgIHJlYWRvbmx5IHg6IG51bWJlcjtcbiAgICByZWFkb25seSB5OiBudW1iZXI7XG4gIH1cblxuICBpbnRlcmZhY2UgUGVuZGluZ0lucHV0IHtcbiAgICByZWplY3QoZXJyb3I6IEVycm9yKTogdm9pZDtcbiAgICByZXNvbHZlKCk6IHZvaWQ7XG4gIH1cblxuICAvKipcbiAgICogRGVsYXkgKGluIG1zKSBiZWZvcmUgaW52b2tpbmcgYGVsZWN0cm9uV2luZG93LmRlc3Ryb3koKWAgc28gdGhlIGV2YWwgdGhhdFxuICAgKiB0cmlnZ2VyZWQgdGhlIGNhbGwgaGFzIHRpbWUgdG8gcmV0dXJuIGl0cyByZXN1bHQgdG8gdGhlIGNhbGxlci4gV2l0aG91dFxuICAgKiBpdCB0aGUgcmVuZGVyZXIgZGllcyBiZWZvcmUgdGhlIElQQyByZXBseSBzaGlwcywgdGhlIGNhbGxlciB3YWl0cyBmb3IgdGhlXG4gICAqIGZ1bGwgZXZhbCB0aW1lb3V0LCBhbmQgc3RhbGUgYEJyb3dzZXJXaW5kb3dgIGVudHJpZXMgcGlsZSB1cC5cbiAgICovXG4gIGNvbnN0IERFU1RST1lfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gNTA7XG5cbiAgLyoqXG4gICAqIEludGVydmFsIChpbiBtcykgYmV0d2VlbiBwb2xscyB3aGlsZSB3YWl0aW5nIGZvciBhIHRydXN0ZWQgaW5wdXQgZXZlbnQgdG9cbiAgICogdGFrZSBlZmZlY3QgKHRoZSBlZGl0b3IgZG9jdW1lbnQgdXBkYXRlcywgb3IgYW4gZWxlbWVudCdzIGA6aG92ZXJgIHN0YXRlXG4gICAqIGZsaXBzKS4gU2hhcmVkIGJ5IGV2ZXJ5IHRydXN0ZWQtaW5wdXQgaGVscGVyLlxuICAgKi9cbiAgY29uc3QgSU5QVVRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSA1MDtcblxuICAvKipcbiAgICogTWF4aW11bSB0aW1lIChpbiBtcykgdG8gd2FpdCBmb3IgYSB0cnVzdGVkIGlucHV0IGV2ZW50IHRvIHRha2UgZWZmZWN0XG4gICAqIGJlZm9yZSBnaXZpbmcgdXAgKHRoZSBleHBlY3RlZCBvdXRjb21lIHdoZW4gdGhlIGlucHV0IGlzIHJlamVjdGVkIFx1MjAxNCBlLmcuIGFcbiAgICogcmVhZC1vbmx5IGVkaXRvciwgb3IgYSBwb2ludGVyIG1vdmUgdGhhdCBuZXZlciBsYW5kcyBvbiB0aGUgZWxlbWVudCkuXG4gICAqL1xuICBjb25zdCBJTlBVVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgbWF4aW11bSB0aW1lIChpbiBtcykge0BsaW5rIG9wZW5TZXR0aW5nc1RhYn0gd2FpdHMgZm9yIHRoZSBzZXR0aW5nc1xuICAgKiBtb2RhbCB0byBvcGVuIGFuZCBmb3IgdGhlIHJlcXVlc3RlZCB0YWIgdG8gcmVuZGVyLCB3aGVuIHRoZSBjYWxsZXIgZG9lcyBub3RcbiAgICogb3ZlcnJpZGUgaXQuXG4gICAqL1xuICBjb25zdCBTRVRUSU5HU19UQUJfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSA1MDAwO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IGludGVydmFsIChpbiBtcykgYmV0d2VlbiB7QGxpbmsgd2FpdFVudGlsfSBwcmVkaWNhdGUgY2hlY2tzIHdoZW4gdGhlXG4gICAqIGNhbGxlciBkb2VzIG5vdCBvdmVycmlkZSBpdC5cbiAgICovXG4gIGNvbnN0IFdBSVRfVU5USUxfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSA1MDtcblxuICAvKipcbiAgICogRGVmYXVsdCBtYXhpbXVtIHRpbWUgKGluIG1zKSB7QGxpbmsgd2FpdFVudGlsfSB3YWl0cyBmb3IgaXRzIHByZWRpY2F0ZSB0b1xuICAgKiBiZWNvbWUgdHJ1dGh5IGJlZm9yZSByZWplY3RpbmcsIHdoZW4gdGhlIGNhbGxlciBkb2VzIG5vdCBvdmVycmlkZSBpdC5cbiAgICovXG4gIGNvbnN0IFdBSVRfVU5USUxfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSA1MDAwO1xuXG4gIC8qKlxuICAgKiBIb3cgbWFueSB0aW1lcyB7QGxpbmsgY3JlYXRlTm90ZX0gcmV3cml0ZXMgYSBub3RlIHdob3NlIGNvbnRlbnQgZGlkIG5vdFxuICAgKiByZWFjaCB0aGUgZmlsZXN5c3RlbSBiZWZvcmUgZ2l2aW5nIHVwLlxuICAgKlxuICAgKiBUaGUgQW5kcm9pZCBlbXVsYXRvciBsb3NlcyByb3VnaGx5IDEgd3JpdGUgaW4gMTEwLCBzbyBhIHNpbmdsZSByZXBhaXJcbiAgICogYWxyZWFkeSBtYWtlcyBhIGxvc3Qgbm90ZSBhc3Ryb25vbWljYWxseSB1bmxpa2VseTsgdGhlIGV4dHJhIGF0dGVtcHRzIGNvc3RcbiAgICogbm90aGluZyB3aGVuIG5vdGhpbmcgaXMgbG9zdCwgYW5kIHRoZSBjYXAgaXMgd2hhdCBrZWVwcyBhIGdlbnVpbmVseSBicm9rZW5cbiAgICogd3JpdGUgZnJvbSBiZWluZyByZXRyaWVkIGZvcmV2ZXIgaW5zdGVhZCBvZiBmYWlsaW5nIHdpdGggYSByZWFkYWJsZSBlcnJvci5cbiAgICovXG4gIGNvbnN0IENSRUFURV9OT1RFX1JFUEFJUl9BVFRFTVBUX0NPVU5UID0gMztcblxuICAvKipcbiAgICogUHJlZml4IHVzZWQgYnkge0BsaW5rIGVycm9yVG9TdHJpbmd9J3MgbmVzdGVkLWVycm9yIHNlcGFyYXRvciBsaW5lcywgbWF0Y2hpbmdcbiAgICogdGhlIGAgICAgYXRgIHByZWZpeCBvZiBhIFY4IHN0YWNrLXRyYWNlIGZyYW1lIHNvIHRoZSBzZXBhcmF0b3JzIGJsZW5kIGludG9cbiAgICogdGhlIHN1cnJvdW5kaW5nIHN0YWNrLiBLZXB0IGlkZW50aWNhbCB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYCcgYGVycm9yVG9TdHJpbmdgLlxuICAgKi9cbiAgY29uc3QgU1RBQ0tfVFJBQ0VfUFJFRklYID0gJyAgICBhdCc7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIEFwcHJvdmVkIGRvdWJsZSBjYXN0OiBgX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZ2AgaXMgb3VyIGludGVybmFsIFdpbmRvdyBhdWdtZW50YXRpb24sIGludGVudGlvbmFsbHkga2VwdCBsb2NhbCAobm90IGRlY2xhcmVkIGdsb2JhbGx5KSB0byBhdm9pZCBsZWFraW5nIGludG8gY29uc3VtZXIgdHlwZXMuXG4gIGNvbnN0IGhvbGRlciA9IGdsb2JhbFRoaXMgYXMgdW5rbm93biBhcyBQYXJ0aWFsPEludGVncmF0aW9uVGVzdGluZ0hvbGRlcj47XG4gIGNvbnN0IGV4aXN0aW5nQ29udGV4dHMgPSBob2xkZXIuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZz8uY29udGV4dHMgPz8ge307XG4gIGNvbnN0IGV4aXN0aW5nT2JzaWRpYW5Nb2R1bGUgPSBob2xkZXIuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZz8ub2JzaWRpYW5Nb2R1bGU7XG4gIC8vIFdhcm4gYXQgbW9zdCBvbmNlIHBlciBib290c3RyYXAgdGhhdCBgb2JzaWRpYW5Nb2R1bGVgIGlzIGBudWxsYCBvbiB0aGlzIHZlcnNpb24uXG4gIGxldCBoYXNXYXJuZWRNaXNzaW5nT2JzaWRpYW5Nb2R1bGUgPSBmYWxzZTtcblxuICAvLyBJbi1mbGlnaHQgbW9iaWxlIGlucHV0IHJlcXVlc3RzLCBrZXllZCBieSByZXF1ZXN0IGlkLCBhd2FpdGluZyB0aGUgaG9zdCdzIGFuc3dlciB2aWEgYHJlc29sdmVJbnB1dGAuXG4gIGNvbnN0IHBlbmRpbmdJbnB1dHMgPSBuZXcgTWFwPHN0cmluZywgUGVuZGluZ0lucHV0PigpO1xuICBsZXQgbmV4dElucHV0SWQgPSAwO1xuXG4gIC8vIFJlcXVlc3QgaWRzIGFscmVhZHkgY2xhaW1lZCBieSBzb21lIGhvc3QsIHNvIGEgc2Vjb25kIGF0dGFjaGVkIGhvc3QgZG9lcyBub3QgaW5qZWN0IHRoZSBnZXN0dXJlIGFcbiAgLy8gU2Vjb25kIHRpbWUgXHUyMDE0IHNlZSBgY2xhaW1JbnB1dGAuIElkcyBhcmUgbW9ub3RvbmljIHdpdGhpbiBhIHBhZ2UsIHNvIHRoaXMgb25seSBncm93cyBhcyBmYXN0IGFzIHRoZVxuICAvLyBSdW4gZHJpdmVzIGlucHV0LCBhbmQgaXQgZGllcyB3aXRoIHRoZSBwYWdlLlxuICBjb25zdCBjbGFpbWVkSW5wdXRJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBjb25zdCBuczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlID0ge1xuICAgIGdldCBhcHAoKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWQgLS0gYGFwcGAgZ2V0dGVyIHJlYWRzIGB3aW5kb3cuYXBwYCB3aGljaCBpcyBzZXQgYnkgT2JzaWRpYW4uXG4gICAgICByZXR1cm4gZ2xvYmFsVGhpcy5hcHA7XG4gICAgfSxcblxuICAgIGNsYWltSW5wdXQodGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlLCBpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICBpZiAoY2xhaW1lZElucHV0SWRzLmhhcyhpZCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBjbGFpbWVkSW5wdXRJZHMuYWRkKGlkKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG5cbiAgICBjb250ZXh0czogZXhpc3RpbmdDb250ZXh0cyxcblxuICAgIGFzeW5jIGRlc3Ryb3lDdXJyZW50V2luZG93KHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgYXdhaXQgdGhpcy5lbnN1cmVMYXlvdXRSZWFkeSgpO1xuICAgICAgYXdhaXQgc2xlZXAoMCk7XG4gICAgICBjb25zdCBlbGVjdHJvbldpbmRvdyA9IGdsb2JhbFRoaXMuZWxlY3Ryb25XaW5kb3c7XG4gICAgICBnbG9iYWxUaGlzLnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBlbGVjdHJvbldpbmRvdy5kZXN0cm95KCk7XG4gICAgICB9LCBERVNUUk9ZX0RFTEFZX0lOX01JTExJU0VDT05EUyk7XG4gICAgfSxcblxuICAgIGFzeW5jIGVuc3VyZUxheW91dFJlYWR5KHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgdGhpcy5hcHAud29ya3NwYWNlLm9uTGF5b3V0UmVhZHkocmVzb2x2ZSk7XG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgZXJyb3JUb1N0cmluZyh0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UsIGVycm9yOiB1bmtub3duKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBlcnJvclRvU3RyaW5nSW1wbChlcnJvcik7XG4gICAgfSxcblxuICAgIGFzeW5jIGV2YWxXcmFwcGVyKHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSwgcGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgIC8vIE9sZCBPYnNpZGlhbiAoZS5nLiAwLjYueCkgcHJlZGF0ZXMgdGhlIGNvbW11bml0eS1wbHVnaW4gQVBJOiBgcGx1Z2luc2BcbiAgICAgIC8vIEV4aXN0cyBidXQgaGFzIG5vIGBpc0VuYWJsZWRgL2BzZXRFbmFibGVgLCBhbmQgdGhlcmUgYXJlIG5vIHRoaXJkLXBhcnR5XG4gICAgICAvLyBQbHVnaW5zIHRvIGVuYWJsZSwgc28gc2tpcCB0aGlzIHN0ZXAgd2hlbiB0aGUgQVBJIGlzIGFic2VudC5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBwcm9iZSB0aGUgcnVudGltZS1vcHRpb25hbCBjb21tdW5pdHktcGx1Z2luIEFQSS5cbiAgICAgIGNvbnN0IHBsdWdpbnMgPSB0aGlzLmFwcC5wbHVnaW5zIGFzIHVua25vd24gYXMgUGx1Z2luc0xpa2U7XG4gICAgICBpZiAocGx1Z2lucy5pc0VuYWJsZWQgJiYgIXBsdWdpbnMuaXNFbmFibGVkKCkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hcHAucGx1Z2lucy5zZXRFbmFibGUodHJ1ZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBvYnNpZGlhbk1vZHVsZSA9IGF3YWl0IHRoaXMuZ2V0T2JzaWRpYW5Nb2R1bGUoKTtcbiAgICAgIC8vIEF2b2lkIGA/Pz1gOiBvbGQgT2JzaWRpYW4ncyBDaHJvbWl1bSAoZS5nLiAwLjYueCBvbiBDaHJvbWl1bSA4MCkgcHJlZGF0ZXNcbiAgICAgIC8vIEVTMjAyMSBsb2dpY2FsLWFzc2lnbm1lbnQgYW5kIGNhbm5vdCBwYXJzZSBpdCBpbiB0aGlzIHNlcmlhbGl6ZWQgYm9vdHN0cmFwLlxuICAgICAgbGV0IGNvbnRleHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgICBpZiAocGFyYW1zLmNvbnRleHRJZCkge1xuICAgICAgICBjb25zdCBleGlzdGluZ0NvbnRleHQgPSB0aGlzLmNvbnRleHRzW3BhcmFtcy5jb250ZXh0SWRdO1xuICAgICAgICBpZiAoZXhpc3RpbmdDb250ZXh0KSB7XG4gICAgICAgICAgY29udGV4dCA9IGV4aXN0aW5nQ29udGV4dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmNvbnRleHRzW3BhcmFtcy5jb250ZXh0SWRdID0gY29udGV4dDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gVGhlIGluamVjdGVkIGBsaWJgIGJhZzogYmFzZSBoZWxwZXJzIGZyb20gdGhlIGhhcm5lc3MsIHRoZW4gcHJvdmlkZXJzIG9uIHRvcC5cbiAgICAgIC8vIFJlc29sdmVycyBydW4gaW4tcmVuZGVyZXIgKHRoZXkgcmVhZCByZW5kZXJlciBnbG9iYWxzIGEgcHJvdmlkZXIgcHVibGlzaGVkKS5cbiAgICAgIC8vIFJlYnVpbGRpbmcgcGVyIGV2YWwga2VlcHMgYGxpYmAgZnJlc2ggYW5kIHRvbGVyYW50IG9mIGEgbGF0ZS1sb2FkZWQgcHJvdmlkZXIuXG4gICAgICBjb25zdCBsaWIgPSB7XG4gICAgICAgIGNsaWNrRWxlbWVudCxcbiAgICAgICAgY2xpY2tNb3VzZSxcbiAgICAgICAgY3JlYXRlTm90ZSxcbiAgICAgICAgaG92ZXJFbGVtZW50LFxuICAgICAgICBtb3ZlTW91c2UsXG4gICAgICAgIG9wZW5TZXR0aW5nc1RhYixcbiAgICAgICAgcHJlc3NLZXksXG4gICAgICAgIHR5cGVJbnRvRWRpdG9yLFxuICAgICAgICB1bmhvdmVyRWxlbWVudCxcbiAgICAgICAgd2FpdFVudGlsXG4gICAgICB9O1xuICAgICAgZm9yIChjb25zdCByZXNvbHZlTGliIG9mIHRoaXMubGliUmVzb2x2ZXJzKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24obGliLCByZXNvbHZlTGliKCkpO1xuICAgICAgfVxuICAgICAgY29uc3QgZnVsbEFyZ3VtZW50cyA9IHsgLi4ucGFyYW1zLmlucHV0LCBhcHA6IHRoaXMuYXBwLCBjb250ZXh0LCBsaWIsIG9ic2lkaWFuTW9kdWxlIH07XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYXJhbXMuY2FsbGJhY2soZnVsbEFyZ3VtZW50cyk7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7IHR5cGU6ICd1bmRlZmluZWQnIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7IHZhbHVlOiByZXN1bHQgfSk7XG4gICAgICB9IGNhdGNoIChldmFsRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHsgdHlwZTogJ2Vycm9yJywgdmFsdWU6IHRoaXMuZXJyb3JUb1N0cmluZyhldmFsRXJyb3IpIH0pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRPYnNpZGlhbk1vZHVsZSh0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAgIGlmICh0aGlzLm9ic2lkaWFuTW9kdWxlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9ic2lkaWFuTW9kdWxlO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGUgdGVtcC1wbHVnaW4gdHJpY2sgYmVsb3cgcmVzb2x2ZXMgYHJlcXVpcmUoJ29ic2lkaWFuJylgLCB3aGljaCBvbmx5XG4gICAgICAvLyBXb3JrcyBpbnNpZGUgYSBwbHVnaW4tbG9hZCBjb250ZXh0LiBJdCBuZWVkcyB0aGUgY29tbXVuaXR5LXBsdWdpbiByZWdpc3RyeVxuICAgICAgLy8gKGBsb2FkUGx1Z2luYCArIGBtYW5pZmVzdHNgKSwgd2hpY2ggRklSU1QgYXBwZWFycyBpbiBPYnNpZGlhbiAwLjkuNzsgdGhlXG4gICAgICAvLyAwLjYuNC0wLjkuNiBiYW5kIGhhcyBubyByZWdpc3RyeSBhbmQgY2Fubm90IHJ1biBpdCwgc28gcmV0dXJuIGBudWxsYCAobm90XG4gICAgICAvLyBgdW5kZWZpbmVkYCkgLSBhcHAtb25seSBjbG9zdXJlcyAoYGNhbGxiYWNrKHsgYXBwIH0pYCkgc3RpbGwgcnVuLlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIHByb2JlIHRoZSBydW50aW1lLW9wdGlvbmFsIGNvbW11bml0eS1wbHVnaW4gQVBJLlxuICAgICAgY29uc3QgcGx1Z2lucyA9IHRoaXMuYXBwLnBsdWdpbnMgYXMgdW5rbm93biBhcyBQbHVnaW5zTGlrZTtcbiAgICAgIGlmICghcGx1Z2lucy5sb2FkUGx1Z2luIHx8ICFwbHVnaW5zLm1hbmlmZXN0cykge1xuICAgICAgICBpZiAoIWhhc1dhcm5lZE1pc3NpbmdPYnNpZGlhbk1vZHVsZSkge1xuICAgICAgICAgIGhhc1dhcm5lZE1pc3NpbmdPYnNpZGlhbk1vZHVsZSA9IHRydWU7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdbb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZ10gYG9ic2lkaWFuTW9kdWxlYCBpcyBgbnVsbGA6IHRoaXMgT2JzaWRpYW4gdmVyc2lvbiBwcmVkYXRlcyB0aGUgY29tbXVuaXR5LXBsdWdpbiBBUEkgKGFkZGVkIGluIDAuOS43KSwgc28gdGhlIGBvYnNpZGlhbmAgbW9kdWxlIGNhbm5vdCBiZSByZXNvbHZlZC4gQXBwLW9ubHkgY2xvc3VyZXMgKGBjYWxsYmFjayh7IGFwcCB9KWApIHN0aWxsIHdvcmsuJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IFNMSUNFX1NUQVJUID0gMjtcbiAgICAgIGNvbnN0IHJhbmRvbVN1ZmZpeCA9IFN0cmluZyhNYXRoLnJhbmRvbSgpKS5zbGljZShTTElDRV9TVEFSVCk7XG4gICAgICBjb25zdCB0ZW1wb3JhcnlNb2R1bGVOYW1lID0gYGdldC1vYnNpZGlhbi1tb2R1bGUtJHtyYW5kb21TdWZmaXh9YDtcbiAgICAgIC8vIE9sZCB2ZXJzaW9ucyAoZS5nLiAwLjkuMTApIGxlYXZlIGB2YXVsdC5jb25maWdEaXJgIHVuZGVmaW5lZDsgZmFsbCBiYWNrIHRvXG4gICAgICAvLyBPYnNpZGlhbidzIGRlZmF1bHQgY29uZmlnIGRpciBzbyB0aGUgdGVtcCBwbHVnaW4gc3RpbGwgZ2V0cyBhIHZhbGlkIHBhdGgsXG4gICAgICAvLyBMb2FkcywgYW5kIGl0cyBgcmVxdWlyZSgnb2JzaWRpYW4nKWAgcmVzb2x2ZXMgdGhlIG1vZHVsZS5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBjb25maWdEaXIgaXMgcnVudGltZS1vcHRpb25hbCBvbiBvbGQgdmVyc2lvbnMuXG4gICAgICBjb25zdCBjb25maWdEaXJlY3RvcnkgPSAodGhpcy5hcHAudmF1bHQgYXMgdW5rbm93biBhcyBWYXVsdExpa2UpLmNvbmZpZ0RpciA/PyAnLm9ic2lkaWFuJztcbiAgICAgIGNvbnN0IHBsdWdpbnNEaXJlY3RvcnkgPSBgJHtjb25maWdEaXJlY3Rvcnl9L3BsdWdpbnNgO1xuICAgICAgY29uc3QgZGlyZWN0b3J5ID0gYCR7cGx1Z2luc0RpcmVjdG9yeX0vJHt0ZW1wb3JhcnlNb2R1bGVOYW1lfWA7XG4gICAgICB0aGlzLmFwcC5wbHVnaW5zLm1hbmlmZXN0c1t0ZW1wb3JhcnlNb2R1bGVOYW1lXSA9IHtcbiAgICAgICAgYXV0aG9yOiAnJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uYW1lLXJlcGxhY2VtZW50cyAtLSBgZGlyYCBpcyBPYnNpZGlhbidzIG93biBgUGx1Z2luTWFuaWZlc3RgIG1lbWJlciBuYW1lLlxuICAgICAgICBkaXI6IGRpcmVjdG9yeSxcbiAgICAgICAgaWQ6IHRlbXBvcmFyeU1vZHVsZU5hbWUsXG4gICAgICAgIGlzRGVza3RvcE9ubHk6IGZhbHNlLFxuICAgICAgICBtaW5BcHBWZXJzaW9uOiAnJyxcbiAgICAgICAgbmFtZTogdGVtcG9yYXJ5TW9kdWxlTmFtZSxcbiAgICAgICAgdmVyc2lvbjogJydcbiAgICAgIH07XG4gICAgICAvLyBgYWRhcHRlci5ta2RpcmAgaXMgbm90IHJlY3Vyc2l2ZSwgYW5kIGFuIG9sZCB2ZXJzaW9uIG9uIGEgZnJlc2ggdmF1bHQgbWF5IG5vdFxuICAgICAgLy8gSGF2ZSB0aGUgY29uZmlnL3BsdWdpbnMgZGlycyB5ZXQgXHUyMDE0IGNyZWF0ZSB0aGUgY2hhaW4gc28gYGxvYWRQbHVnaW5gIGZpbmRzIHRoZVxuICAgICAgLy8gVGVtcCBwbHVnaW4gYXQgYDxjb25maWdEaXI+L3BsdWdpbnMvPGlkPmAuXG4gICAgICBpZiAoIShhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLmV4aXN0cyhjb25maWdEaXJlY3RvcnkpKSkge1xuICAgICAgICBhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLm1rZGlyKGNvbmZpZ0RpcmVjdG9yeSk7XG4gICAgICB9XG4gICAgICBpZiAoIShhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLmV4aXN0cyhwbHVnaW5zRGlyZWN0b3J5KSkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hcHAudmF1bHQuYWRhcHRlci5ta2RpcihwbHVnaW5zRGlyZWN0b3J5KTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIubWtkaXIoZGlyZWN0b3J5KTtcblxuICAgICAgY29uc3QgcGx1Z2luRnVuY3Rpb25Cb2R5ID0gJ2NvbnN0IHI9cmVxdWlyZSxlPWV4cG9ydHM7Y29uc3QgbT1yKFxcJ29ic2lkaWFuXFwnKTt3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZy5vYnNpZGlhbk1vZHVsZT1tO2UuZGVmYXVsdD1tLlBsdWdpbjsnO1xuICAgICAgYXdhaXQgdGhpcy5hcHAudmF1bHQuYWRhcHRlci53cml0ZShgJHtkaXJlY3Rvcnl9L21haW4uanNgLCBwbHVnaW5GdW5jdGlvbkJvZHkpO1xuXG4gICAgICBhd2FpdCB0aGlzLmFwcC5wbHVnaW5zLmxvYWRQbHVnaW4odGVtcG9yYXJ5TW9kdWxlTmFtZSk7XG4gICAgICAvLyBgdW5pbnN0YWxsUGx1Z2luYCBhcnJpdmVkIGFmdGVyIHRoZSBwbHVnaW4gQVBJIGl0c2VsZiwgc28gaXQgaXMgYWJzZW50IG9uXG4gICAgICAvLyAwLjkuNyAtIHRoZSBGSVJTVCB2ZXJzaW9uIHRvIGV4cG9zZSBgbG9hZFBsdWdpbmAvYG1hbmlmZXN0c2AgKDAuOS42IGFuZCBiZWxvd1xuICAgICAgLy8gSGF2ZSBuZWl0aGVyLCBhbmQgcmV0dXJuIGB1bmRlZmluZWRgIGFib3ZlKS4gVGhlIG1vZHVsZSBpcyBhbHJlYWR5IGNhcHR1cmVkIGJ5XG4gICAgICAvLyBUaGUgcGx1Z2luJ3MgYG1haW4uanNgIGF0IHRoaXMgcG9pbnQsIHNvIG9ubHkgdW5pbnN0YWxsIHdoZW4gdGhlIG1ldGhvZCBleGlzdHM7XG4gICAgICAvLyBPbiAwLjkuNyB0aGUgdGVtcCBwbHVnaW4gbGluZ2VycyBoYXJtbGVzc2x5IGluIHRoZSBlcGhlbWVyYWwgb3duZWQgdmF1bHQuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXggLS0gdW5pbnN0YWxsUGx1Z2luIGlzIHJ1bnRpbWUtb3B0aW9uYWwgb24gb2xkIHZlcnNpb25zLlxuICAgICAgY29uc3QgcGx1Z2luc0ZvckNsZWFudXAgPSB0aGlzLmFwcC5wbHVnaW5zIGFzIHVua25vd24gYXMgUGx1Z2luc0xpa2U7XG4gICAgICBpZiAocGx1Z2luc0ZvckNsZWFudXAudW5pbnN0YWxsUGx1Z2luKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYXBwLnBsdWdpbnMudW5pbnN0YWxsUGx1Z2luKHRlbXBvcmFyeU1vZHVsZU5hbWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vYnNpZGlhbk1vZHVsZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5vYnNpZGlhbk1vZHVsZTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gbG9hZCBvYnNpZGlhbiBtb2R1bGUnKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgaXBjU2VuZFN5bmModGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlLCBwYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGF3YWl0IHRoaXMuZW5zdXJlTGF5b3V0UmVhZHkoKTtcbiAgICAgIGdsb2JhbFRoaXMuZWxlY3Ryb24uaXBjUmVuZGVyZXIuc2VuZFN5bmMocGFyYW1zLmNoYW5uZWwsIC4uLnBhcmFtcy5jaGFubmVsQXJndW1lbnRzKTtcbiAgICB9LFxuXG4gICAgbGliUmVzb2x2ZXJzOiBib290c3RyYXBQYXJhbXMubGliUmVzb2x2ZXJzLFxuXG4gICAgb2JzaWRpYW5Nb2R1bGU6IGV4aXN0aW5nT2JzaWRpYW5Nb2R1bGUsXG5cbiAgICBhc3luYyBwb2xsVmF1bHRCYXNlUGF0aCh0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgLy8gYHdpbmRvdy5hcHBgLCBpdHMgYHdvcmtzcGFjZWAsIGFuZCBsYXlvdXQgY2FuIGFsbCBiZSB0cmFuc2llbnRseVxuICAgICAgLy8gVW5hdmFpbGFibGUgZHVyaW5nIGJvb3Qgb3IgcmlnaHQgYWZ0ZXIgYW4gb3duZWQtd2luZG93IHJlbG9hZCwgYW5kIG9sZFxuICAgICAgLy8gT2JzaWRpYW4gcHJlZGF0ZXMgYFdvcmtzcGFjZS5vbkxheW91dFJlYWR5YC4gVGhpcyBydW5zIGluc2lkZSB0aGUgdHJhbnNwb3J0J3NcbiAgICAgIC8vIFJlYWRpbmVzcyBwb2xsLCB3aGljaCByZXRyaWVzIG9uIHRocm93LCBzbyBjaGVjayBgd2luZG93LmFwcGAgRklSU1QgYW5kIGJhaWxcbiAgICAgIC8vIENsZWFubHkgdW50aWwgaXQsIGl0cyB3b3Jrc3BhY2UsIGFuZCBsYXlvdXQgYXJlIGFsbCByZWFkeSBcdTIwMTQgbmV2ZXIgZGVyZWZlcmVuY2VcbiAgICAgIC8vIEFuIHVuZGVmaW5lZCBgd2luZG93LmFwcGAuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXggLS0gd2luZG93LmFwcC93b3Jrc3BhY2UgYXJlIHJ1bnRpbWUtb3B0aW9uYWwgZHVyaW5nIGJvb3QuXG4gICAgICBjb25zdCBhcHAgPSB0aGlzLmFwcCBhcyB1bmtub3duIGFzIEFwcExpa2UgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoIWFwcD8ud29ya3NwYWNlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignT3duZWQgdmF1bHQgaXMgbm90IHJlYWR5IHlldCAod2luZG93LmFwcC93b3Jrc3BhY2Ugbm90IGluaXRpYWxpemVkKS4nKTtcbiAgICAgIH1cbiAgICAgIC8vIE9sZCBPYnNpZGlhbiBwcmVkYXRlcyBgV29ya3NwYWNlLm9uTGF5b3V0UmVhZHlgIGJ1dCBoYXMgYGxheW91dFJlYWR5ID09PSB0cnVlYFxuICAgICAgLy8gQnkgdGhlIHRpbWUgYSB3aW5kb3cgaXMgdXA7IG9ubHkgd2FpdCB2aWEgYGVuc3VyZUxheW91dFJlYWR5YCB3aGVuIGl0IGlzIG5vdFxuICAgICAgLy8gWWV0IHJlYWR5IChtb2Rlcm4gdmVyc2lvbnMgZWFybHkgaW4gYm9vdCksIHNvIHRoZSBtaXNzaW5nIG1ldGhvZCBpcyBuZXZlciBoaXQuXG4gICAgICBpZiAoIWFwcC53b3Jrc3BhY2UubGF5b3V0UmVhZHkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVMYXlvdXRSZWFkeSgpO1xuICAgICAgfVxuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXggLS0gRGF0YUFkYXB0ZXIgaXMgYWN0dWFsbHkgRmlsZVN5c3RlbUFkYXB0ZXIgYXQgcnVudGltZSBvbiBkZXNrdG9wLlxuICAgICAgY29uc3QgYWRhcHRlciA9IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIgYXMgdW5rbm93biBhcyBGaWxlU3lzdGVtQWRhcHRlckxpa2U7XG4gICAgICAvLyBPbGQgT2JzaWRpYW4gdmVyc2lvbnMgKGUuZy4gMC42LngpIHByZWRhdGUgdGhlIGBnZXRCYXNlUGF0aCgpYCBtZXRob2QgYnV0XG4gICAgICAvLyBFeHBvc2UgdGhlIGBiYXNlUGF0aGAgcHJvcGVydHk7IHRoZSBtZXRob2QgZXhpc3RzIGZyb20gfjAuOS4yMCBvbndhcmQuXG4gICAgICBjb25zdCBiYXNlUGF0aCA9IGFkYXB0ZXIuZ2V0QmFzZVBhdGggPyBhZGFwdGVyLmdldEJhc2VQYXRoKCkgOiAoYWRhcHRlci5iYXNlUGF0aCA/PyAnJyk7XG4gICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYmFzZVBhdGgpO1xuICAgIH0sXG5cbiAgICByZXNvbHZlSW5wdXQodGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlLCBpZDogc3RyaW5nLCBlcnJvck1lc3NhZ2U6IG51bGwgfCBzdHJpbmcpOiB2b2lkIHtcbiAgICAgIGNvbnN0IHBlbmRpbmcgPSBwZW5kaW5nSW5wdXRzLmdldChpZCk7XG4gICAgICBpZiAoIXBlbmRpbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBwZW5kaW5nSW5wdXRzLmRlbGV0ZShpZCk7XG4gICAgICBpZiAoZXJyb3JNZXNzYWdlID09PSBudWxsKSB7XG4gICAgICAgIHBlbmRpbmcucmVzb2x2ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHBlbmRpbmcucmVqZWN0KG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgc2V0TG9jYWxTdG9yYWdlSXRlbSh0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UsIHBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgYXdhaXQgdGhpcy5lbnN1cmVMYXlvdXRSZWFkeSgpO1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0ocGFyYW1zLmtleSwgcGFyYW1zLnZhbHVlKTtcbiAgICB9LFxuXG4gICAgLy8gVGhlIHNhbWUgZnVuY3Rpb24gb2JqZWN0cyBgZXZhbFdyYXBwZXJgIHB1dHMgaW4gYSBjbG9zdXJlJ3MgYGxpYmAgYmFnIFx1MjAxNCBkZWxpYmVyYXRlbHkgbm90IHJlLWRlcml2ZWRcbiAgICAvLyBBbmQgbm90IHdyYXBwZWQsIHNvIGBvYnNpZGlhbi1kZXYtdXRpbHNgIGdldHMgZXhhY3RseSB0aGUgaGFybmVzcydzIGJlaGF2aW9yIG9uIGJvdGggcGxhdGZvcm1zLlxuICAgIHRydXN0ZWRJbnB1dDoge1xuICAgICAgY2xpY2tFbGVtZW50LFxuICAgICAgY2xpY2tNb3VzZSxcbiAgICAgIGhvdmVyRWxlbWVudCxcbiAgICAgIG1vdmVNb3VzZSxcbiAgICAgIHByZXNzS2V5LFxuICAgICAgdHlwZUludG9FZGl0b3IsXG4gICAgICB1bmhvdmVyRWxlbWVudFxuICAgIH0sXG5cbiAgICB2ZXJzaW9uOiBib290c3RyYXBQYXJhbXMudmVyc2lvblxuICB9O1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBBcHByb3ZlZCBkb3VibGUgY2FzdDogYF9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIGlzIG91ciBpbnRlcm5hbCBXaW5kb3cgYXVnbWVudGF0aW9uLCBpbnRlbnRpb25hbGx5IGtlcHQgbG9jYWwgKG5vdCBkZWNsYXJlZCBnbG9iYWxseSkgdG8gYXZvaWQgbGVha2luZyBpbnRvIGNvbnN1bWVyIHR5cGVzLlxuICAoZ2xvYmFsVGhpcyBhcyB1bmtub3duIGFzIFBhcnRpYWw8SW50ZWdyYXRpb25UZXN0aW5nSG9sZGVyPikuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZyA9IG5zO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIHR5cGVJbnRvRWRpdG9yKHR5cGVQYXJhbXM6IFR5cGVJbnRvRWRpdG9yUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgRk9DVVNfU0VUVExFX0RFTEFZX0lOX01JTExJU0VDT05EUyA9IDMwMDtcblxuICAgIGNvbnN0IHsgZWRpdG9yLCB0ZXh0IH0gPSB0eXBlUGFyYW1zO1xuICAgIGNvbnN0IHZhbHVlQmVmb3JlVHlwaW5nID0gZWRpdG9yLmdldFZhbHVlKCk7XG5cbiAgICAvLyBGb2N1cyB0aGUgZWRpdG9yIGFuZCBwbGFjZSB0aGUgY2FyZXQgYXQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQuXG4gICAgZWRpdG9yLmZvY3VzKCk7XG4gICAgY29uc3QgbGFzdExpbmUgPSBlZGl0b3IubGFzdExpbmUoKTtcbiAgICBlZGl0b3Iuc2V0Q3Vyc29yKGxhc3RMaW5lLCBlZGl0b3IuZ2V0TGluZShsYXN0TGluZSkubGVuZ3RoKTtcblxuICAgIC8vIExldCBhbnkgZm9jdXMgdHJhcCAoYSBgc2V0VGltZW91dCgwKWAgcmUtZm9jdXMpIGZpcmUgYmVmb3JlIHR5cGluZywgc28gc3RvbGVuIGZvY3VzIGlzIGRldGVjdGVkLlxuICAgIGF3YWl0IHNsZWVwKEZPQ1VTX1NFVFRMRV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMpO1xuXG4gICAgLy8gVHlwaW5nIGlzIHByZXNzaW5nIGVhY2ggY2hhcmFjdGVyIGtleSBpbiB0dXJuOiBgcHJlc3NLZXlgIGluamVjdHMgdGhlIHNhbWUgdHJ1c3RlZFxuICAgIC8vIGBrZXlEb3duYCAtPiBgY2hhcmAgLT4gYGtleVVwYCBhIHJlYWwgdXNlciBwcm9kdWNlcyBcdTIwMTQgdGV4dCBsYW5kcyBvbmx5IGlmIHRoZSBlZGl0b3IgaG9sZHMgZm9jdXMuXG4gICAgZm9yIChjb25zdCBjaGFyIG9mIHRleHQpIHtcbiAgICAgIGF3YWl0IHByZXNzS2V5KHsga2V5OiBjaGFyIH0pO1xuICAgIH1cblxuICAgIC8vIFBvbGwgdW50aWwgdGhlIGRvY3VtZW50IHJlZmxlY3RzIHRoZSBpbnB1dCBvciB0aGUgdGltZW91dCBlbGFwc2VzLCBpbnN0ZWFkIG9mIGEgZml4ZWQgc2V0dGxlLlxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgd2hpbGUgKGVkaXRvci5nZXRWYWx1ZSgpID09PSB2YWx1ZUJlZm9yZVR5cGluZyAmJiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lIDwgSU5QVVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpIHtcbiAgICAgIGF3YWl0IHNsZWVwKElOUFVUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG4gIH1cblxuICAvLyBUcnVlIHdoZW4gdGhpcyBjbG9zdXJlIGlzIHJ1bm5pbmcgaW4gT2JzaWRpYW4gTW9iaWxlIHJhdGhlciB0aGFuIHRoZSBFbGVjdHJvbiBkZXNrdG9wIGFwcC5cbiAgLy8gUmVhZGluZyBgUGxhdGZvcm1gIG9mZiB0aGUgcmVzb2x2ZWQgb2JzaWRpYW4gbW9kdWxlIGlzIHNhZmUgaGVyZTogYGV2YWxXcmFwcGVyYCBhbHdheXMgcmVzb2x2ZXMgdGhhdFxuICAvLyBNb2R1bGUgYmVmb3JlIGFueSBjYWxsYmFjayBjYW4gcnVuLCB3aGljaCBpcyB0aGUgc2FtZSBndWFyYW50ZWUgYHRvRWxlY3Ryb25Nb2RpZmllcnNgIHJlbGllcyBvbi5cbiAgZnVuY3Rpb24gY2hlY2tJc01vYmlsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKG5zLm9ic2lkaWFuTW9kdWxlIGFzIE9ic2lkaWFuTW9kdWxlV2l0aFBsYXRmb3JtKS5QbGF0Zm9ybS5pc01vYmlsZTtcbiAgfVxuXG4gIC8vIEhhbmRzIG9uZSB0cnVzdGVkLWlucHV0IHJlcXVlc3QgdG8gdGhlIGhvc3QgYW5kIHdhaXRzIGZvciBpdCB0byBiZSBpbmplY3RlZC5cbiAgLy9cbiAgLy8gTW9iaWxlIGhhcyBubyBpbi1yZW5kZXJlciByb3V0ZSB0byBhIHRydXN0ZWQgZXZlbnQgYXQgYWxsIFx1MjAxNCBgZGlzcGF0Y2hFdmVudGAgYW5kIGBlbGVtZW50LmNsaWNrKClgIGFyZVxuICAvLyBgaXNUcnVzdGVkID09PSBmYWxzZWAgYnkgc3BlYyBcdTIwMTQgc28gdGhlIGluamVjdGlvbiBoYXMgdG8gaGFwcGVuIGZyb20gdGhlIE5vZGUgc2lkZSwgb3ZlciBhIENEUFxuICAvLyBDb25uZWN0aW9uIGluZGVwZW5kZW50IG9mIHRoZSBBcHBpdW0gc2Vzc2lvbiB0aGF0IGlzIGN1cnJlbnRseSBibG9ja2VkIGF3YWl0aW5nIHRoaXMgdmVyeSBjbG9zdXJlXG4gIC8vIChzZWUgTDM5KS4gYGJpbmRpbmdOYW1lYCBpcyBhIGhvc3QtaW5zdGFsbGVkIGdsb2JhbDsgY2FsbGluZyBpdCBkZWxpdmVycyB0aGUgcmVxdWVzdCwgYW5kIHRoZSBob3N0XG4gIC8vIEFuc3dlcnMgYnkgY2FsbGluZyBgbnMucmVzb2x2ZUlucHV0YC5cbiAgYXN5bmMgZnVuY3Rpb24gcmVxdWVzdEhvc3RJbnB1dChyZXF1ZXN0OiBNb2JpbGVJbnB1dFJlcXVlc3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBiaW5kaW5nTmFtZSA9IGJvb3RzdHJhcFBhcmFtcy5pbnB1dEJpbmRpbmdOYW1lO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBBcHByb3ZlZCBjYXN0OiB0aGUgYmluZGluZyBpcyBpbnN0YWxsZWQgYnkgdGhlIGhvc3QgYXQgcnVudGltZSB2aWEgYFJ1bnRpbWUuYWRkQmluZGluZ2AsIHNvIGl0IGNhbm5vdCBiZSBkZWNsYXJlZCBvbiBgV2luZG93YC5cbiAgICBjb25zdCBiaW5kaW5nID0gKGdsb2JhbFRoaXMgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbYmluZGluZ05hbWVdIGFzICgocGF5bG9hZDogc3RyaW5nKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZW9mIGJpbmRpbmcgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgIGBUcnVzdGVkIGlucHV0IGlzIHVuYXZhaWxhYmxlOiB0aGUgaG9zdCBoYXMgbm90IGluc3RhbGxlZCB0aGUgXFxgJHtiaW5kaW5nTmFtZX1cXGAgY2hhbm5lbC4gYFxuICAgICAgICAgICsgJ09uIG1vYmlsZSB0aGVzZSBoZWxwZXJzIHJlcXVpcmUgdGhlIG9ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmcgQXBwaXVtIHRyYW5zcG9ydC4nXG4gICAgICApO1xuICAgIH1cblxuICAgIG5leHRJbnB1dElkKys7XG4gICAgY29uc3QgaWQgPSBTdHJpbmcobmV4dElucHV0SWQpO1xuXG4gICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgcGVuZGluZ0lucHV0cy5zZXQoaWQsIHsgcmVqZWN0LCByZXNvbHZlIH0pO1xuICAgICAgZ2xvYmFsVGhpcy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKCFwZW5kaW5nSW5wdXRzLmhhcyhpZCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBwZW5kaW5nSW5wdXRzLmRlbGV0ZShpZCk7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFRoZSBob3N0IGRpZCBub3Qgc2VydmljZSB0aGUgdHJ1c3RlZCBpbnB1dCByZXF1ZXN0IHdpdGhpbiAke1N0cmluZyhib290c3RyYXBQYXJhbXMuaW5wdXRUaW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zLmApKTtcbiAgICAgIH0sIGJvb3RzdHJhcFBhcmFtcy5pbnB1dFRpbWVvdXRJbk1pbGxpc2Vjb25kcyk7XG5cbiAgICAgIGJpbmRpbmcoSlNPTi5zdHJpbmdpZnkoeyBpZCwgcmVxdWVzdCB9KSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBBIHBvaW50ZXIgaGVscGVyIHRoYXQgaGFzIG5vIHRvdWNoIGFuYWxvZyBpcyBhIGhhcmQgZXJyb3IsIG5ldmVyIGEgc2lsZW50IG5vLW9wOiBgOmhvdmVyYCBkb2VzIG5vdFxuICAvLyBFeGlzdCBvbiB0b3VjaCwgc28gYSB0ZXN0IHRoYXQgXCJob3ZlcmVkXCIgYW5kIHRoZW4gYXNzZXJ0ZWQgd291bGQgcGFzcyB3aGlsZSBleGVyY2lzaW5nIG5vdGhpbmcgXHUyMDE0XG4gIC8vIEV4YWN0bHkgdGhlIGZhbHNlLWNvbmZpZGVuY2UgZmFpbHVyZSB0aGUgdHJ1c3RlZC1pbnB1dCB3b3JrIGV4aXN0cyB0byBlbmQuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL2NvbnNpc3RlbnQtZnVuY3Rpb24tc2NvcGluZyAtLSBJdCBjYW5ub3QgbW92ZSB0byB0aGUgb3V0ZXIgc2NvcGU6IHRoaXMgd2hvbGUgZnVuY3Rpb24gaXMgc2VyaWFsaXplZCB2aWEgYHRvU3RyaW5nKClgIGFuZCBtYXkgbm90IHJlZmVyZW5jZSBhbnl0aGluZyBvdXRzaWRlIGl0c2VsZiAoTDE1KS5cbiAgZnVuY3Rpb24gdGhyb3dVbnN1cHBvcnRlZE9uTW9iaWxlKGhlbHBlck5hbWU6IHN0cmluZyk6IG5ldmVyIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgXFxgJHtoZWxwZXJOYW1lfVxcYCBoYXMgbm8gbWVhbmluZyBvbiBtb2JpbGU6IHRvdWNoIGlucHV0IGhhcyBubyBob3ZlciBzdGF0ZS4gYFxuICAgICAgICArICdCcmFuY2ggb24gYFBsYXRmb3JtLmlzRGVza3RvcEFwcGAsIG9yIGRyaXZlIHRoZSBlbGVtZW50IHdpdGggYGNsaWNrRWxlbWVudGAgaW5zdGVhZC4nXG4gICAgKTtcbiAgfVxuXG4gIC8vIE1hcHMgT2JzaWRpYW4ncyBgTW9kaWZpZXJgIG5hbWVzIHRvIEVsZWN0cm9uJ3MgbG93ZXJjYXNlIGBzZW5kSW5wdXRFdmVudGAgbW9kaWZpZXIgbmFtZXMuXG4gIC8vIE5hbWVzICdNZXRhJywgJ0FsdCcsICdTaGlmdCcgbG93ZXJjYXNlIGRpcmVjdGx5OyAnQ3RybCcgLT4gJ2NvbnRyb2wnOyAnTW9kJyByZXNvbHZlcyBwZXItcGxhdGZvcm0uXG4gIC8vIFNoYXJlZCBieSBldmVyeSB0cnVzdGVkLWlucHV0IGhlbHBlciwgc28gYSBrZXkgcHJlc3MgYW5kIGEgY2xpY2sgY2Fubm90IGRpc2FncmVlIG9uIGAnTW9kJ2AuXG4gIGZ1bmN0aW9uIHRvRWxlY3Ryb25Nb2RpZmllcnMobW9kaWZpZXJzOiByZWFkb25seSBNb2RpZmllcltdKTogRWxlY3Ryb25Nb2RpZmllcltdIHtcbiAgICAvLyAnTW9kJyBpcyBPYnNpZGlhbidzIHBsYXRmb3JtLWFnbm9zdGljIG1vZGlmaWVyOiBDbWQgKG1ldGEpIG9uIG1hY09TLCBDdHJsIGVsc2V3aGVyZS5cbiAgICAvLyBSZWFkaW5nIGBQbGF0Zm9ybS5pc01hY09TYCBvZmYgdGhlIHJlc29sdmVkIG9ic2lkaWFuIG1vZHVsZSBpcyBzYWZlIGhlcmU6XG4gICAgLy8gYGV2YWxXcmFwcGVyYCBhbHdheXMgcmVzb2x2ZXMgdGhhdCBtb2R1bGUgYmVmb3JlIGFueSBjYWxsYmFjayBjYW4gcnVuLlxuICAgIGNvbnN0IGlzTWFjT1MgPSAobnMub2JzaWRpYW5Nb2R1bGUgYXMgT2JzaWRpYW5Nb2R1bGVXaXRoUGxhdGZvcm0pLlBsYXRmb3JtLmlzTWFjT1M7XG5cbiAgICByZXR1cm4gbW9kaWZpZXJzLm1hcCgobW9kaWZpZXIpOiBFbGVjdHJvbk1vZGlmaWVyID0+IHtcbiAgICAgIHN3aXRjaCAobW9kaWZpZXIpIHtcbiAgICAgICAgY2FzZSAnQWx0Jzoge1xuICAgICAgICAgIHJldHVybiAnYWx0JztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdDdHJsJzoge1xuICAgICAgICAgIHJldHVybiAnY29udHJvbCc7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnTWV0YSc6IHtcbiAgICAgICAgICByZXR1cm4gJ21ldGEnO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ01vZCc6IHtcbiAgICAgICAgICByZXR1cm4gaXNNYWNPUyA/ICdtZXRhJyA6ICdjb250cm9sJztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdTaGlmdCc6IHtcbiAgICAgICAgICByZXR1cm4gJ3NoaWZ0JztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgLy8gRXhoYXVzdGl2ZW5lc3MgZ3VhcmQ6IGFkZGluZyBhIGBNb2RpZmllcmAgbWVtYmVyIHdpdGhvdXQgYSBjYXNlIGFib3ZlIGJlY29tZXMgYSBjb21waWxlIGVycm9yLlxuICAgICAgICAgIGNvbnN0IHVua25vd25Nb2RpZmllcjogbmV2ZXIgPSBtb2RpZmllcjtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbW9kaWZpZXI6ICR7U3RyaW5nKHVua25vd25Nb2RpZmllcil9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGNsaWNrTW91c2UoY2xpY2tQYXJhbXM6IENsaWNrTW91c2VQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBTSU5HTEVfQ0xJQ0tfQ09VTlQgPSAxO1xuXG4gICAgY29uc3QgeyBidXR0b24gPSAnbGVmdCcsIG1vZGlmaWVycyA9IFtdLCB4LCB5IH0gPSBjbGlja1BhcmFtcztcblxuICAgIGNvbnN0IGVsZWN0cm9uTW9kaWZpZXJzID0gdG9FbGVjdHJvbk1vZGlmaWVycyhtb2RpZmllcnMpO1xuICAgIGNvbnN0IHJvdW5kZWRYID0gTWF0aC5yb3VuZCh4KTtcbiAgICBjb25zdCByb3VuZGVkWSA9IE1hdGgucm91bmQoeSk7XG5cbiAgICBpZiAoY2hlY2tJc01vYmlsZSgpKSB7XG4gICAgICAvLyBUb3VjaCBoYXMgbm8gYnV0dG9ucy4gQSBsZWZ0IGNsaWNrIGlzIGEgdGFwOyBhIHJpZ2h0IGNsaWNrIGlzIHRoZSBsb25nLXByZXNzIHRoYXQgb3BlbnMgT2JzaWRpYW5cbiAgICAgIC8vIE1vYmlsZSdzIGNvbnRleHQgbWVudSwgc28gaXQgaXMgaGlkZGVuIGJlaGluZCB0aGUgc2FtZSBuYW1lIHJhdGhlciB0aGFuIGEgc2VwYXJhdGUgaGVscGVyLiBBXG4gICAgICAvLyBNaWRkbGUgY2xpY2sgaGFzIG5vIGdlc3R1cmUgYXQgYWxsLCBhbmQgaW52ZW50aW5nIG9uZSB3b3VsZCBiZSB3b3JzZSB0aGFuIHNheWluZyBzby5cbiAgICAgIGlmIChidXR0b24gPT09ICdtaWRkbGUnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignYGNsaWNrTW91c2UoeyBidXR0b246IFxcJ21pZGRsZVxcJyB9KWAgaGFzIG5vIG1lYW5pbmcgb24gbW9iaWxlOiB0b3VjaCBpbnB1dCBoYXMgbm8gbWlkZGxlIGJ1dHRvbi4nKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgcmVxdWVzdEhvc3RJbnB1dCh7XG4gICAgICAgIGtpbmQ6IGJ1dHRvbiA9PT0gJ3JpZ2h0JyA/ICdsb25nUHJlc3MnIDogJ3RhcCcsXG4gICAgICAgIG1vZGlmaWVyczogZWxlY3Ryb25Nb2RpZmllcnMsXG4gICAgICAgIHg6IHJvdW5kZWRYLFxuICAgICAgICB5OiByb3VuZGVkWVxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgd2ViQ29udGVudHMgPSBnbG9iYWxUaGlzLmVsZWN0cm9uLnJlbW90ZS5nZXRDdXJyZW50V2ViQ29udGVudHMoKTtcblxuICAgIC8vIEEgdHJ1c3RlZCBjbGljayBpcyBtb3VzZU1vdmUgLT4gbW91c2VEb3duIC0+IG1vdXNlVXAgYXQgb25lIHBvaW50LlxuICAgIC8vIENocm9taXVtIHN5bnRoZXNpemVzIHRoZSBgY2xpY2tgIChvciBgY29udGV4dG1lbnVgKSBET00gZXZlbnQgZnJvbSB0aGF0IHNlcXVlbmNlLlxuICAgIC8vIFRoZSBsZWFkaW5nIG1vdmUgaXMgd2hhdCBwdXRzIHRoZSBwb2ludGVyIG92ZXIgdGhlIGhpdC10ZXN0IHRhcmdldCBiZWZvcmUgdGhlIGJ1dHRvbiBnb2VzIGRvd24uXG4gICAgd2ViQ29udGVudHMuc2VuZElucHV0RXZlbnQoeyBtb2RpZmllcnM6IGVsZWN0cm9uTW9kaWZpZXJzLCB0eXBlOiAnbW91c2VNb3ZlJywgeDogcm91bmRlZFgsIHk6IHJvdW5kZWRZIH0pO1xuICAgIHdlYkNvbnRlbnRzLnNlbmRJbnB1dEV2ZW50KHtcbiAgICAgIGJ1dHRvbixcbiAgICAgIGNsaWNrQ291bnQ6IFNJTkdMRV9DTElDS19DT1VOVCxcbiAgICAgIG1vZGlmaWVyczogZWxlY3Ryb25Nb2RpZmllcnMsXG4gICAgICB0eXBlOiAnbW91c2VEb3duJyxcbiAgICAgIHg6IHJvdW5kZWRYLFxuICAgICAgeTogcm91bmRlZFlcbiAgICB9KTtcbiAgICB3ZWJDb250ZW50cy5zZW5kSW5wdXRFdmVudCh7XG4gICAgICBidXR0b24sXG4gICAgICBjbGlja0NvdW50OiBTSU5HTEVfQ0xJQ0tfQ09VTlQsXG4gICAgICBtb2RpZmllcnM6IGVsZWN0cm9uTW9kaWZpZXJzLFxuICAgICAgdHlwZTogJ21vdXNlVXAnLFxuICAgICAgeDogcm91bmRlZFgsXG4gICAgICB5OiByb3VuZGVkWVxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gY2xpY2tFbGVtZW50KGNsaWNrUGFyYW1zOiBDbGlja0VsZW1lbnRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBDRU5URVJfRElWSVNPUiA9IDI7XG5cbiAgICBjb25zdCB7IGJ1dHRvbiA9ICdsZWZ0JywgZWxlbWVudCwgbW9kaWZpZXJzID0gW10gfSA9IGNsaWNrUGFyYW1zO1xuXG4gICAgLy8gVmlld3BvcnQgY29vcmRzIGVxdWFsIHdlYi1jb250ZW50cyBESVAgY29vcmRzIGZvciB0aGUgZnVsbC13aW5kb3cgYEJyb3dzZXJXaW5kb3dgLCBhbmQgZXF1YWwgQ0RQJ3NcbiAgICAvLyBQYWdlIGNvb3JkaW5hdGVzIGluIHRoZSBtb2JpbGUgV2ViVmlldyBcdTIwMTQgc28gbmVpdGhlciBwYXRoIG5lZWRzIGEgZGV2aWNlLXBpeGVsIGNvbnZlcnNpb24uXG4gICAgY29uc3QgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgYXdhaXQgY2xpY2tNb3VzZSh7XG4gICAgICBidXR0b24sXG4gICAgICBtb2RpZmllcnMsXG4gICAgICB4OiByZWN0LmxlZnQgKyByZWN0LndpZHRoIC8gQ0VOVEVSX0RJVklTT1IsXG4gICAgICB5OiByZWN0LnRvcCArIHJlY3QuaGVpZ2h0IC8gQ0VOVEVSX0RJVklTT1JcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHByZXNzS2V5KHByZXNzUGFyYW1zOiBQcmVzc0tleVBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsga2V5LCBtb2RpZmllcnMgPSBbXSB9ID0gcHJlc3NQYXJhbXM7XG5cbiAgICBjb25zdCBlbGVjdHJvbk1vZGlmaWVycyA9IHRvRWxlY3Ryb25Nb2RpZmllcnMobW9kaWZpZXJzKTtcblxuICAgIGlmIChjaGVja0lzTW9iaWxlKCkpIHtcbiAgICAgIGF3YWl0IHJlcXVlc3RIb3N0SW5wdXQoeyBrZXksIGtpbmQ6ICdrZXknLCBtb2RpZmllcnM6IGVsZWN0cm9uTW9kaWZpZXJzIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHdlYkNvbnRlbnRzID0gZ2xvYmFsVGhpcy5lbGVjdHJvbi5yZW1vdGUuZ2V0Q3VycmVudFdlYkNvbnRlbnRzKCk7XG5cbiAgICAvLyBBIHRydXN0ZWQga2V5IHByZXNzIGlzIGtleURvd24gLT4gY2hhciAtPiBrZXlVcDoga2V5RG93biBmaXJlcyBga2V5ZG93bmAsIGNoYXIgZmlyZXNcbiAgICAvLyBga2V5cHJlc3NgL2BiZWZvcmVpbnB1dGAvYGlucHV0YCwga2V5VXAgZmlyZXMgYGtleXVwYCBcdTIwMTQgdGhlIGZ1bGwgcmVhbCBrZXkgcGlwZWxpbmUuXG4gICAgd2ViQ29udGVudHMuc2VuZElucHV0RXZlbnQoeyBrZXlDb2RlOiBrZXksIG1vZGlmaWVyczogZWxlY3Ryb25Nb2RpZmllcnMsIHR5cGU6ICdrZXlEb3duJyB9KTtcbiAgICB3ZWJDb250ZW50cy5zZW5kSW5wdXRFdmVudCh7IGtleUNvZGU6IGtleSwgbW9kaWZpZXJzOiBlbGVjdHJvbk1vZGlmaWVycywgdHlwZTogJ2NoYXInIH0pO1xuICAgIHdlYkNvbnRlbnRzLnNlbmRJbnB1dEV2ZW50KHsga2V5Q29kZToga2V5LCBtb2RpZmllcnM6IGVsZWN0cm9uTW9kaWZpZXJzLCB0eXBlOiAna2V5VXAnIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gaG92ZXJFbGVtZW50KGhvdmVyUGFyYW1zOiBIb3ZlckVsZW1lbnRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBDRU5URVJfRElWSVNPUiA9IDI7XG5cbiAgICBjb25zdCB7IGVsZW1lbnQgfSA9IGhvdmVyUGFyYW1zO1xuXG4gICAgaWYgKGNoZWNrSXNNb2JpbGUoKSkge1xuICAgICAgdGhyb3dVbnN1cHBvcnRlZE9uTW9iaWxlKCdob3ZlckVsZW1lbnQnKTtcbiAgICB9XG5cbiAgICAvLyBWaWV3cG9ydCBjb29yZHMgZXF1YWwgd2ViLWNvbnRlbnRzIERJUCBjb29yZHMgZm9yIHRoZSBmdWxsLXdpbmRvdyBgQnJvd3NlcldpbmRvd2AuXG4gICAgY29uc3QgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgYXdhaXQgbW92ZU1vdXNlKHsgeDogcmVjdC5sZWZ0ICsgcmVjdC53aWR0aCAvIENFTlRFUl9ESVZJU09SLCB5OiByZWN0LnRvcCArIHJlY3QuaGVpZ2h0IC8gQ0VOVEVSX0RJVklTT1IgfSk7XG5cbiAgICAvLyBQb2xsIHVudGlsIHRoZSByZWFsIGA6aG92ZXJgIHN0YXRlIGhhcyBhY3R1YWxseSB0YWtlbiwgaW5zdGVhZCBvZiBhIGZpeGVkIHNldHRsZS5cbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHdoaWxlICghZWxlbWVudC5tYXRjaGVzKCc6aG92ZXInKSAmJiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lIDwgSU5QVVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpIHtcbiAgICAgIGF3YWl0IHNsZWVwKElOUFVUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3JlcXVpcmUtYXdhaXQgLS0gQXN5bmMgdG8gbWF0Y2ggaXRzIG1vYmlsZS1jYXBhYmxlIHNpYmxpbmdzIGFuZCB0byBrZWVwIG9uZSBgUHJvbWlzZTx2b2lkPmAgc2hhcGUgYWNyb3NzIHRoZSB0cnVzdGVkLWlucHV0IHNldDsgdGhlIGRlc2t0b3AgYm9keSBpcyBnZW51aW5lbHkgc3luY2hyb25vdXMuXG4gIGFzeW5jIGZ1bmN0aW9uIG1vdmVNb3VzZShtb3ZlUGFyYW1zOiBNb3ZlTW91c2VQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoY2hlY2tJc01vYmlsZSgpKSB7XG4gICAgICB0aHJvd1Vuc3VwcG9ydGVkT25Nb2JpbGUoJ21vdmVNb3VzZScpO1xuICAgIH1cblxuICAgIGNvbnN0IHdlYkNvbnRlbnRzID0gZ2xvYmFsVGhpcy5lbGVjdHJvbi5yZW1vdGUuZ2V0Q3VycmVudFdlYkNvbnRlbnRzKCk7XG4gICAgd2ViQ29udGVudHMuc2VuZElucHV0RXZlbnQoeyB0eXBlOiAnbW91c2VNb3ZlJywgeDogTWF0aC5yb3VuZChtb3ZlUGFyYW1zLngpLCB5OiBNYXRoLnJvdW5kKG1vdmVQYXJhbXMueSkgfSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiB1bmhvdmVyRWxlbWVudCh1bmhvdmVyUGFyYW1zOiBVbmhvdmVyRWxlbWVudFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IENFTlRFUl9ESVZJU09SID0gMjtcbiAgICBjb25zdCBPVVRTSURFX09GRlNFVF9JTl9QSVhFTFMgPSAxO1xuXG4gICAgY29uc3QgeyBlbGVtZW50IH0gPSB1bmhvdmVyUGFyYW1zO1xuXG4gICAgaWYgKGNoZWNrSXNNb2JpbGUoKSkge1xuICAgICAgdGhyb3dVbnN1cHBvcnRlZE9uTW9iaWxlKCd1bmhvdmVyRWxlbWVudCcpO1xuICAgIH1cblxuICAgIC8vIE1vdmUgdG8gYSBwb2ludCBqdXN0IG91dHNpZGUgdGhlIGVsZW1lbnQncyBib3guXG4gICAgLy8gV2hlbiBmbHVzaCBhZ2FpbnN0IHRoZSB2aWV3cG9ydCdzIGxlZnQgZWRnZSwgdXNlIGp1c3QgcGFzdCB0aGUgcmlnaHQgZWRnZS5cbiAgICAvLyBBIGZ1bGwtdmlld3BvcnQtd2lkdGggZWxlbWVudCBzaG91bGQgdXNlIGBtb3ZlTW91c2VgIGRpcmVjdGx5IGluc3RlYWQuXG4gICAgY29uc3QgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgeCA9IHJlY3QubGVmdCA+PSBPVVRTSURFX09GRlNFVF9JTl9QSVhFTFMgPyByZWN0LmxlZnQgLSBPVVRTSURFX09GRlNFVF9JTl9QSVhFTFMgOiByZWN0LnJpZ2h0ICsgT1VUU0lERV9PRkZTRVRfSU5fUElYRUxTO1xuICAgIGNvbnN0IHkgPSByZWN0LnRvcCArIHJlY3QuaGVpZ2h0IC8gQ0VOVEVSX0RJVklTT1I7XG4gICAgYXdhaXQgbW92ZU1vdXNlKHsgeCwgeSB9KTtcblxuICAgIC8vIFBvbGwgdW50aWwgdGhlIHJlYWwgYDpob3ZlcmAgc3RhdGUgaGFzIGFjdHVhbGx5IGNsZWFyZWQsIGluc3RlYWQgb2YgYSBmaXhlZCBzZXR0bGUuXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB3aGlsZSAoZWxlbWVudC5tYXRjaGVzKCc6aG92ZXInKSAmJiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lIDwgSU5QVVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpIHtcbiAgICAgIGF3YWl0IHNsZWVwKElOUFVUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBjcmVhdGVOb3RlKG5vdGVQYXJhbXM6IENyZWF0ZU5vdGVQYXJhbXMpOiBQcm9taXNlPFRGaWxlPiB7XG4gICAgY29uc3QgeyBjb250ZW50LCBwYXRoIH0gPSBub3RlUGFyYW1zO1xuXG4gICAgY29uc3QgZmlsZSA9IGF3YWl0IG5zLmFwcC52YXVsdC5jcmVhdGUocGF0aCwgY29udGVudCk7XG5cbiAgICAvLyBSZWFkIHRoZSBmaWxlIGJhY2sgcmF0aGVyIHRoYW4gdHJ1c3RpbmcgYGZpbGUuc3RhdGAuIGBzdGF0YCBpcyBwcmVjaXNlbHlcbiAgICAvLyBUaGUgZmllbGQgdGhhdCBsaWVzIGhlcmU6IG9uIGEgbG9zdCB3cml0ZSBpdCByZXBvcnRzIHRoZSBmdWxsIGJ5dGUgY291bnRcbiAgICAvLyBXaGlsZSB0aGUgZmlsZXN5c3RlbSBob2xkcyB6ZXJvIGJ5dGVzLlxuICAgIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDw9IENSRUFURV9OT1RFX1JFUEFJUl9BVFRFTVBUX0NPVU5UOyBhdHRlbXB0KyspIHtcbiAgICAgIGNvbnN0IGFjdHVhbENvbnRlbnQgPSBhd2FpdCBucy5hcHAudmF1bHQucmVhZChmaWxlKTtcbiAgICAgIGlmIChhY3R1YWxDb250ZW50ID09PSBjb250ZW50KSB7XG4gICAgICAgIHJldHVybiBmaWxlO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXR0ZW1wdCA9PT0gQ1JFQVRFX05PVEVfUkVQQUlSX0FUVEVNUFRfQ09VTlQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBjcmVhdGVOb3RlIGNvdWxkIG5vdCB3cml0ZSBcIiR7cGF0aH1cIjogZXhwZWN0ZWQgJHtTdHJpbmcoY29udGVudC5sZW5ndGgpfSBjaGFyYWN0ZXJzLCBgXG4gICAgICAgICAgICArIGB0aGUgdmF1bHQgaG9sZHMgJHtTdHJpbmcoYWN0dWFsQ29udGVudC5sZW5ndGgpfSBhZnRlciAke1N0cmluZyhDUkVBVEVfTk9URV9SRVBBSVJfQVRURU1QVF9DT1VOVCl9IHJlcGFpciBhdHRlbXB0cy5gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEEgcmV3cml0ZSBvZiB0aGUgc2FtZSBjb250ZW50IGxhbmRzIGNvcnJlY3RseSBcdTIwMTQgbWVhc3VyZWQuIFRoaXMgaXMgdGhlXG4gICAgICAvLyBXaG9sZSB3b3JrYXJvdW5kLlxuICAgICAgYXdhaXQgbnMuYXBwLnZhdWx0Lm1vZGlmeShmaWxlLCBjb250ZW50KTtcbiAgICB9XG5cbiAgICAvLyBVbnJlYWNoYWJsZTogdGhlIGxvb3AgZWl0aGVyIHJldHVybnMgb3IgdGhyb3dzIG9uIGl0cyBsYXN0IGl0ZXJhdGlvbi5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYGNyZWF0ZU5vdGUgY291bGQgbm90IHdyaXRlIFwiJHtwYXRofVwiLmApO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gb3BlblNldHRpbmdzVGFiKG9wZW5QYXJhbXM6IE9wZW5TZXR0aW5nc1RhYlBhcmFtcyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCB7IHRhYklkLCB0aW1lb3V0SW5NaWxsaXNlY29uZHMgPSBTRVRUSU5HU19UQUJfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSA9IG9wZW5QYXJhbXM7XG5cbiAgICBjb25zdCBzZXR0aW5nID0gbnMuYXBwLnNldHRpbmc7XG5cbiAgICAvKlxuICAgICAqIEEgRkFMTEJBQ0sgZm9yIGEgdmF1bHQgdGhhdCBkb2VzIG5vdCBjYXJyeSB0aGUgaGFybmVzcydzIGBzZXR0aW5nc1BvcG91dFdpbmRvdzogZmFsc2VgIGRlZmF1bHQgXHUyMDE0XG4gICAgICogQW5kIGl0IE1VU1QgaGFwcGVuIGJlZm9yZSBgb3BlbigpYC5cbiAgICAgKlxuICAgICAqIFdpdGggdGhlIGRlZmF1bHQgaW4gcGxhY2UgYG9wZW4oKWAgYXR0YWNoZXMgYGNvbnRhaW5lckVsYCB0byB0aGlzIGRvY3VtZW50IGl0c2VsZiwgYW5kIHRoaXMgYnJhbmNoXG4gICAgICogTmV2ZXIgZmlyZXMgKG1lYXN1cmVkLCBgb3duZWQtaW5zdGFuY2Utd29ya2VyLWF0dGFjaC5pbnRlZ3JhdGlvbi50ZXN0LnRzYCkuIFdpdGhvdXQgaXQgT2JzaWRpYW5cbiAgICAgKiBTaGlwcyB0aGUga2V5IGB0cnVlYCwgYHNob3VsZFVzZVBvcG91dCgpYCByZXR1cm5zIGl0LCBhbmQgYG9wZW4oKWAgcHV0cyB0aGUgbW9kYWwgaW4gYSBTRUNPTkRcbiAgICAgKiBFbGVjdHJvbiB3aW5kb3cgaW5zdGVhZCBcdTIwMTQgbGVhdmluZyB0aGlzIGRvY3VtZW50IHdpdGggbm90aGluZyB3aGlsZSByZXR1cm5pbmcgd2l0aG91dCB0aHJvd2luZy5cbiAgICAgKiBQcmUtYXR0YWNoaW5nIGtlZXBzIGBjb250YWluZXJFbGAgcmVhY2hhYmxlIGhlcmUsIHdoaWNoIGlzIGVub3VnaCBmb3IgYSBjYWxsZXIgdGhhdCByZWFkcyByb3dzIG9mZlxuICAgICAqIFRoZSB0YWI7IGl0IGlzIE5PVCBlbm91Z2ggZm9yIGEgc2NyZWVuc2hvdCwgd2hvc2UgZnJhbWUgaXMgb2YgdGhpcyB3aW5kb3cuIE9ubHkgdGhlIHZhdWx0LWxldmVsXG4gICAgICogRGVmYXVsdCBmaXhlcyB0aGF0LCBzbyB0aGlzIGlzIGEgZmxvb3IgcmF0aGVyIHRoYW4gdGhlIGZpeC5cbiAgICAgKlxuICAgICAqIEF0dGFjaGluZyBBRlRFUldBUkRTIGlzIHVzZWxlc3MgZWl0aGVyIHdheTogd2hhdGV2ZXIgdGhlIG1vZGFsIHJlbmRlcmVkIG9uIG9wZW4gaGFzIGFscmVhZHkgZ29uZVxuICAgICAqIFdoZXJlIGl0IHdlbnQuXG4gICAgICovXG4gICAgaWYgKCFkb2N1bWVudC5ib2R5LmNvbnRhaW5zKHNldHRpbmcuY29udGFpbmVyRWwpKSB7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZChzZXR0aW5nLmNvbnRhaW5lckVsKTtcbiAgICB9XG5cbiAgICAvLyBCb3RoIGxpc3RzIGFyZSBwb3B1bGF0ZWQgYmVmb3JlIGBvcGVuKClgLCBzbyBhbiB1bmtub3duIGlkIGNhbiBiZSByZWplY3RlZCB1cCBmcm9udCBcdTIwMTQgd2l0aCB0aGVcbiAgICAvLyBJZHMgdGhhdCBETyBleGlzdCBcdTIwMTQgaW5zdGVhZCBvZiBzcGVuZGluZyB0aGUgd2hvbGUgdGltZW91dCBsb29raW5nIGV4YWN0bHkgbGlrZSB0aGUgbW9kYWwtZG9lcy1cbiAgICAvLyBOb3QtcmVuZGVyIHN5bXB0b20gdGhpcyBoZWxwZXIgZXhpc3RzIHRvIHJ1bGUgb3V0LiBQbHVnaW4gdGFicyBsaXZlIGluIGBwbHVnaW5UYWJzYCwgbm90XG4gICAgLy8gYHNldHRpbmdUYWJzYCwgc28gYm90aCBhcmUgc2VhcmNoZWQuXG4gICAgY29uc3Qga25vd25UYWJzID0gWy4uLnNldHRpbmcuc2V0dGluZ1RhYnMsIC4uLnNldHRpbmcucGx1Z2luVGFic107XG4gICAgaWYgKGtub3duVGFicy5ldmVyeSgodGFiKSA9PiB0YWIuaWQgIT09IHRhYklkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgb3BlblNldHRpbmdzVGFiOiBubyBzZXR0aW5ncyB0YWIgd2l0aCBpZCBcIiR7dGFiSWR9XCIuIEF2YWlsYWJsZSBpZHM6ICR7a25vd25UYWJzLm1hcCgodGFiKSA9PiB0YWIuaWQpLmpvaW4oJywgJyl9LmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgc2V0dGluZy5vcGVuKCk7XG4gICAgc2V0dGluZy5vcGVuVGFiQnlJZCh0YWJJZCk7XG5cbiAgICAvLyBQb2xsIHRoZSBtb2RhbCdzIG93biBzdGF0ZSByYXRoZXIgdGhhbiBzbGVlcGluZzogYSBmaXhlZCBkZWxheSBpcyBlaXRoZXIgdG9vIHNob3J0IG9uIGEgbG9hZGVkXG4gICAgLy8gTWFjaGluZSBvciB3YXN0ZWQgdGltZS4gQSByZW5kZXJlZCB0YWIgaXMgdGhlIHJlcXVlc3RlZCBvbmUgQU5EIGhhcyBjb250ZW50LlxuICAgIGF3YWl0IHdhaXRVbnRpbCh7XG4gICAgICBtZXNzYWdlOiBgdGhlIFwiJHt0YWJJZH1cIiBzZXR0aW5ncyB0YWIgdG8gcmVuZGVyYCxcbiAgICAgIHByZWRpY2F0ZTogKCkgPT4ge1xuICAgICAgICBjb25zdCBjdXJyZW50VGFiID0gc2V0dGluZy5hY3RpdmVUYWI7XG4gICAgICAgIGlmICghY3VycmVudFRhYikge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY3VycmVudFRhYi5pZCA9PT0gdGFiSWQgJiYgY3VycmVudFRhYi5jb250YWluZXJFbC5jaGlsZEVsZW1lbnRDb3VudCA+IDA7XG4gICAgICB9LFxuICAgICAgdGltZW91dEluTWlsbGlzZWNvbmRzXG4gICAgfSk7XG5cbiAgICBjb25zdCBhY3RpdmVUYWIgPSBzZXR0aW5nLmFjdGl2ZVRhYjtcbiAgICBpZiAoIWFjdGl2ZVRhYikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdvcGVuU2V0dGluZ3NUYWI6IHRoZSBzZXR0aW5ncyBtb2RhbCByZXBvcnRlZCBubyBhY3RpdmUgdGFiIGFmdGVyIGl0IHJlbmRlcmVkLicpO1xuICAgIH1cblxuICAgIC8vIE5vdCBldmVyeSB0YWIgcmVuZGVycyBgLnNldHRpbmctaXRlbS1uYW1lYCByb3dzIChIb3RrZXlzIGRvZXMgbm90KSwgc28gYW4gZW1wdHkgYXJyYXkgaXMgYSB2YWxpZFxuICAgIC8vIEFuc3dlciBoZXJlIFx1MjAxNCB0aGUgcmVuZGVyIGl0c2VsZiB3YXMgYWxyZWFkeSBwcm92ZW4gYnkgdGhlIHBvbGwgYWJvdmUuXG4gICAgcmV0dXJuIFsuLi5hY3RpdmVUYWIuY29udGFpbmVyRWwucXVlcnlTZWxlY3RvckFsbCgnLnNldHRpbmctaXRlbS1uYW1lJyldLm1hcCgobmFtZUVsKSA9PiBuYW1lRWwudGV4dENvbnRlbnQpO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gd2FpdFVudGlsKHdhaXRQYXJhbXM6IFdhaXRVbnRpbFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGludGVydmFsSW5NaWxsaXNlY29uZHMgPSBXQUlUX1VOVElMX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIHByZWRpY2F0ZSxcbiAgICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IFdBSVRfVU5USUxfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFNcbiAgICB9ID0gd2FpdFBhcmFtcztcblxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgd2hpbGUgKCEoYXdhaXQgcHJlZGljYXRlKCkpKSB7XG4gICAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSA+PSB0aW1lb3V0SW5NaWxsaXNlY29uZHMpIHtcbiAgICAgICAgY29uc3Qgc3VmZml4ID0gbWVzc2FnZSA9PT0gdW5kZWZpbmVkID8gJycgOiBgOiAke21lc3NhZ2V9YDtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB3YWl0VW50aWwgdGltZWQgb3V0IGFmdGVyICR7U3RyaW5nKHRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9IG1pbGxpc2Vjb25kcyR7c3VmZml4fWApO1xuICAgICAgfVxuICAgICAgYXdhaXQgc2xlZXAoaW50ZXJ2YWxJbk1pbGxpc2Vjb25kcyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZXJyb3JUb1N0cmluZ0ltcGwoZXJyb3I6IHVua25vd24pOiBzdHJpbmcge1xuICAgIGlmICghKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKGVycm9yKTtcbiAgICB9XG5cbiAgICBsZXQgbWVzc2FnZSA9IGVycm9yLnN0YWNrID8/IGAke2Vycm9yLm5hbWV9OiAke2Vycm9yLm1lc3NhZ2V9YDtcbiAgICBpZiAoZXJyb3IuY2F1c2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbWVzc2FnZSA9IGFwcGVuZE5lc3RlZEVycm9yKG1lc3NhZ2UsIGVycm9yLmNhdXNlLCAnQ2F1c2VkIGJ5OicpO1xuICAgIH1cbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBBZ2dyZWdhdGVFcnJvcikge1xuICAgICAgY29uc3QgYWdncmVnYXRlZEVycm9yczogcmVhZG9ubHkgdW5rbm93bltdID0gZXJyb3IuZXJyb3JzO1xuICAgICAgZm9yIChjb25zdCBbaW5kZXgsIGFnZ3JlZ2F0ZWRFcnJvcl0gb2YgYWdncmVnYXRlZEVycm9ycy5lbnRyaWVzKCkpIHtcbiAgICAgICAgbWVzc2FnZSA9IGFwcGVuZE5lc3RlZEVycm9yKG1lc3NhZ2UsIGFnZ3JlZ2F0ZWRFcnJvciwgYEFnZ3JlZ2F0ZWQgZXJyb3IgIyR7U3RyaW5nKGluZGV4ICsgMSl9OmApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWVzc2FnZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFwcGVuZE5lc3RlZEVycm9yKG1lc3NhZ2U6IHN0cmluZywgbmVzdGVkRXJyb3I6IHVua25vd24sIHRpdGxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCByZXN1bHQgPSBgJHttZXNzYWdlfVxcbiR7Z2VuZXJhdGVTdGFja1RyYWNlTGluZSh0aXRsZSl9YDtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgZXJyb3JUb1N0cmluZ0ltcGwobmVzdGVkRXJyb3IpLnNwbGl0KCdcXG4nKSkge1xuICAgICAgaWYgKCFsaW5lLnRyaW0oKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdCArPSBsaW5lLnN0YXJ0c1dpdGgoU1RBQ0tfVFJBQ0VfUFJFRklYKVxuICAgICAgICA/IGBcXG4ke2xpbmV9YFxuICAgICAgICA6IGBcXG4ke2dlbmVyYXRlU3RhY2tUcmFjZUxpbmUobGluZSl9YDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdlbmVyYXRlU3RhY2tUcmFjZUxpbmUodGl0bGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke1NUQUNLX1RSQUNFX1BSRUZJWH0gLS0tICR7dGl0bGV9IC0tLSAoMClgO1xuICB9XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBaUNBLG9DQUFxQztBQUNyQywwQkFHTztBQUNQLDBCQUdPO0FBa0NQLGVBQXNCLDRCQUE0QixX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