@jsenv/terminal-recorder 1.5.0 → 1.5.2

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 (48) hide show
  1. package/dist/js/terminal_recorder.js +3 -5
  2. package/dist/js/vendors.js +2 -1
  3. package/dist/terminal_recorder_browser.js +0 -3
  4. package/package.json +3 -3
  5. package/src/.jsenv/chrome@130.00/@fs/Users/dmail/Documents/Dev/core/node_modules/@xterm/addon-fit/lib/addon-fit.js +0 -2
  6. package/src/.jsenv/chrome@130.00/@fs/Users/dmail/Documents/Dev/core/node_modules/@xterm/addon-fit/lib/addon-fit.js.map +0 -64
  7. package/src/.jsenv/chrome@130.00/@fs/Users/dmail/Documents/Dev/core/node_modules/@xterm/addon-serialize/lib/addon-serialize.js +0 -2
  8. package/src/.jsenv/chrome@130.00/@fs/Users/dmail/Documents/Dev/core/node_modules/@xterm/addon-serialize/lib/addon-serialize.js.map +0 -434
  9. package/src/.jsenv/chrome@130.00/@fs/Users/dmail/Documents/Dev/core/node_modules/@xterm/addon-serialize/lib/addon-serialize.mjs +0 -749
  10. package/src/.jsenv/chrome@130.00/@fs/Users/dmail/Documents/Dev/core/node_modules/@xterm/addon-serialize/lib/addon-serialize.mjs.map +0 -477
  11. package/src/.jsenv/chrome@130.00/@fs/Users/dmail/Documents/Dev/core/node_modules/@xterm/addon-webgl/lib/addon-webgl.js +0 -2
  12. package/src/.jsenv/chrome@130.00/@fs/Users/dmail/Documents/Dev/core/node_modules/@xterm/addon-webgl/lib/addon-webgl.js.map +0 -1134
  13. package/src/.jsenv/chrome@130.00/@fs/Users/dmail/Documents/Dev/core/node_modules/@xterm/xterm/css/xterm.css +0 -204
  14. package/src/.jsenv/chrome@130.00/@fs/Users/dmail/Documents/Dev/core/node_modules/@xterm/xterm/lib/xterm.js +0 -2
  15. package/src/.jsenv/chrome@130.00/@fs/Users/dmail/Documents/Dev/core/node_modules/@xterm/xterm/lib/xterm.js.map +0 -2558
  16. package/src/.jsenv/chrome@130.00/@fs/Users/dmail/Documents/Dev/core/packages/internal/plugin-supervisor/src/client/supervisor.js +0 -1360
  17. package/src/.jsenv/chrome@130.00/gif_encoder.js +0 -400
  18. package/src/.jsenv/chrome@130.00/gif_encoder.js.map +0 -11
  19. package/src/.jsenv/chrome@130.00/lzw_encoder.js +0 -253
  20. package/src/.jsenv/chrome@130.00/neuquant.js +0 -498
  21. package/src/.jsenv/chrome@130.00/terminal_recorder.js +0 -389
  22. package/src/.jsenv/chrome@130.00/terminal_recorder.js.map +0 -11
  23. package/src/.jsenv/chrome@130.00/xterm.html +0 -46
  24. package/src/.jsenv/chrome@130.00/xterm.html@L14C5-L18C14.js +0 -5
  25. package/src/.jsenv/chrome@130.00/xterm.html@L19C5-L24C14.js +0 -7
  26. package/src/.jsenv/chrome@130.00/xterm.html@L19C5-L24C14.js.map +0 -11
  27. package/src/.jsenv/chrome@131.00/@fs/Users/dmail/Documents/dev/core/node_modules/@xterm/addon-fit/lib/addon-fit.js +0 -2
  28. package/src/.jsenv/chrome@131.00/@fs/Users/dmail/Documents/dev/core/node_modules/@xterm/addon-fit/lib/addon-fit.js.map +0 -64
  29. package/src/.jsenv/chrome@131.00/@fs/Users/dmail/Documents/dev/core/node_modules/@xterm/addon-serialize/lib/addon-serialize.js +0 -2
  30. package/src/.jsenv/chrome@131.00/@fs/Users/dmail/Documents/dev/core/node_modules/@xterm/addon-serialize/lib/addon-serialize.js.map +0 -434
  31. package/src/.jsenv/chrome@131.00/@fs/Users/dmail/Documents/dev/core/node_modules/@xterm/addon-serialize/lib/addon-serialize.mjs +0 -749
  32. package/src/.jsenv/chrome@131.00/@fs/Users/dmail/Documents/dev/core/node_modules/@xterm/addon-serialize/lib/addon-serialize.mjs.map +0 -477
  33. package/src/.jsenv/chrome@131.00/@fs/Users/dmail/Documents/dev/core/node_modules/@xterm/addon-webgl/lib/addon-webgl.js +0 -2
  34. package/src/.jsenv/chrome@131.00/@fs/Users/dmail/Documents/dev/core/node_modules/@xterm/addon-webgl/lib/addon-webgl.js.map +0 -1134
  35. package/src/.jsenv/chrome@131.00/@fs/Users/dmail/Documents/dev/core/node_modules/@xterm/xterm/css/xterm.css +0 -204
  36. package/src/.jsenv/chrome@131.00/@fs/Users/dmail/Documents/dev/core/node_modules/@xterm/xterm/lib/xterm.js +0 -2
  37. package/src/.jsenv/chrome@131.00/@fs/Users/dmail/Documents/dev/core/node_modules/@xterm/xterm/lib/xterm.js.map +0 -2558
  38. package/src/.jsenv/chrome@131.00/@fs/Users/dmail/Documents/dev/core/packages/internal/plugin-supervisor/src/client/supervisor.js +0 -1395
  39. package/src/.jsenv/chrome@131.00/gif_encoder.js +0 -400
  40. package/src/.jsenv/chrome@131.00/gif_encoder.js.map +0 -11
  41. package/src/.jsenv/chrome@131.00/lzw_encoder.js +0 -253
  42. package/src/.jsenv/chrome@131.00/neuquant.js +0 -498
  43. package/src/.jsenv/chrome@131.00/terminal_recorder.js +0 -389
  44. package/src/.jsenv/chrome@131.00/terminal_recorder.js.map +0 -11
  45. package/src/.jsenv/chrome@131.00/xterm.html +0 -46
  46. package/src/.jsenv/chrome@131.00/xterm.html@L14C5-L18C14.js +0 -5
  47. package/src/.jsenv/chrome@131.00/xterm.html@L19C5-L24C14.js +0 -7
  48. package/src/.jsenv/chrome@131.00/xterm.html@L19C5-L24C14.js.map +0 -11
@@ -1501,16 +1501,14 @@ const drawRectangle = (
1501
1501
  { x, y, width, height, radius, fill, stroke, strokeWidth },
1502
1502
  ) => {
1503
1503
  context.beginPath();
1504
- if (radius) {
1504
+ {
1505
1505
  context.roundRect(x, y, width, height, [radius]);
1506
- } else {
1507
- context.rect(x, y, width, height);
1508
1506
  }
1509
- if (fill) {
1507
+ {
1510
1508
  context.fillStyle = fill;
1511
1509
  context.fill();
1512
1510
  }
1513
- if (stroke) {
1511
+ {
1514
1512
  context.strokeWidth = strokeWidth;
1515
1513
  context.strokeStyle = stroke;
1516
1514
  context.stroke();
@@ -463,7 +463,8 @@ function requireHe () {
463
463
  var freeExports = exports;
464
464
 
465
465
  // Detect free variable `module`.
466
- var freeModule = module.exports == freeExports && module;
466
+ var freeModule = module &&
467
+ module.exports == freeExports && module;
467
468
 
468
469
  // Detect free variable `globalThis`, from Node.js or Browserified code,
469
470
  // and use it as `root`.
@@ -106,7 +106,6 @@ const parseAnsi = (ansi) => {
106
106
  italic: false,
107
107
  underline: false,
108
108
  inverse: false,
109
- hidden: false,
110
109
  strikethrough: false,
111
110
  };
112
111
  const decoratorEffects = {
@@ -601,10 +600,8 @@ const renderTerminalSvg = (
601
600
  size: fontSize,
602
601
  width: 8.4013671875,
603
602
  height: 14,
604
- face: fontFace,
605
603
  family: fontFamily,
606
604
  lineHeight,
607
- emHeightAscent: 10.5546875,
608
605
  emHeightDescent: 3.4453125,
609
606
  };
610
607
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jsenv/terminal-recorder",
3
- "version": "1.5.0",
3
+ "version": "1.5.2",
4
4
  "description": "Record terminal output as .svg, .gif, .webm, .mp4",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -37,8 +37,8 @@
37
37
  "prepublishOnly": "npm run build"
38
38
  },
39
39
  "dependencies": {
40
- "@jsenv/humanize": "1.3.0",
41
- "@jsenv/server": "16.0.0",
40
+ "@jsenv/humanize": "1.3.1",
41
+ "@jsenv/server": "16.0.2",
42
42
  "@playwright/browser-chromium": "1.49.1",
43
43
  "ansi-regex": "6.1.0",
44
44
  "he": "1.2.0",
@@ -1,2 +0,0 @@
1
- !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.FitAddon=t():e.FitAddon=t()}(self,(()=>(()=>{"use strict";var e={};return(()=>{var t=e;Object.defineProperty(t,"__esModule",{value:!0}),t.FitAddon=void 0,t.FitAddon=class{activate(e){this._terminal=e}dispose(){}fit(){const e=this.proposeDimensions();if(!e||!this._terminal||isNaN(e.cols)||isNaN(e.rows))return;const t=this._terminal._core;this._terminal.rows===e.rows&&this._terminal.cols===e.cols||(t._renderService.clear(),this._terminal.resize(e.cols,e.rows))}proposeDimensions(){if(!this._terminal)return;if(!this._terminal.element||!this._terminal.element.parentElement)return;const e=this._terminal._core,t=e._renderService.dimensions;if(0===t.css.cell.width||0===t.css.cell.height)return;const r=0===this._terminal.options.scrollback?0:e.viewport.scrollBarWidth,i=window.getComputedStyle(this._terminal.element.parentElement),o=parseInt(i.getPropertyValue("height")),s=Math.max(0,parseInt(i.getPropertyValue("width"))),n=window.getComputedStyle(this._terminal.element),l=o-(parseInt(n.getPropertyValue("padding-top"))+parseInt(n.getPropertyValue("padding-bottom"))),a=s-(parseInt(n.getPropertyValue("padding-right"))+parseInt(n.getPropertyValue("padding-left")))-r;return{cols:Math.max(2,Math.floor(a/t.css.cell.width)),rows:Math.max(1,Math.floor(l/t.css.cell.height))}}}})(),e})()));
2
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkb24tZml0LmpzIiwibWFwcGluZ3MiOiJDQUFBLFNBQTJDQSxFQUFNQyxHQUMxQixpQkFBWkMsU0FBMEMsaUJBQVhDLE9BQ3hDQSxPQUFPRCxRQUFVRCxJQUNRLG1CQUFYRyxRQUF5QkEsT0FBT0MsSUFDOUNELE9BQU8sR0FBSUgsR0FDZSxpQkFBWkMsUUFDZEEsUUFBa0IsU0FBSUQsSUFFdEJELEVBQWUsU0FBSUMsR0FDcEIsQ0FURCxDQVNHSyxNQUFNLEksbUhDZVQsaUJBR1MsUUFBQUMsQ0FBU0MsR0FDZEMsS0FBS0MsVUFBWUYsQ0FDbkIsQ0FFTyxPQUFBRyxHQUFpQixDQUVqQixHQUFBQyxHQUNMLE1BQU1DLEVBQU9KLEtBQUtLLG9CQUNsQixJQUFLRCxJQUFTSixLQUFLQyxXQUFhSyxNQUFNRixFQUFLRyxPQUFTRCxNQUFNRixFQUFLSSxNQUM3RCxPQUlGLE1BQU1DLEVBQVFULEtBQUtDLFVBQWtCUyxNQUdqQ1YsS0FBS0MsVUFBVU8sT0FBU0osRUFBS0ksTUFBUVIsS0FBS0MsVUFBVU0sT0FBU0gsRUFBS0csT0FDcEVFLEVBQUtFLGVBQWVDLFFBQ3BCWixLQUFLQyxVQUFVWSxPQUFPVCxFQUFLRyxLQUFNSCxFQUFLSSxNQUUxQyxDQUVPLGlCQUFBSCxHQUNMLElBQUtMLEtBQUtDLFVBQ1IsT0FHRixJQUFLRCxLQUFLQyxVQUFVYSxVQUFZZCxLQUFLQyxVQUFVYSxRQUFRQyxjQUNyRCxPQUlGLE1BQU1OLEVBQVFULEtBQUtDLFVBQWtCUyxNQUMvQk4sRUFBMEJLLEVBQUtFLGVBQWVLLFdBRXBELEdBQTRCLElBQXhCWixFQUFLYSxJQUFJQyxLQUFLQyxPQUF3QyxJQUF6QmYsRUFBS2EsSUFBSUMsS0FBS0UsT0FDN0MsT0FHRixNQUFNQyxFQUF1RCxJQUF0Q3JCLEtBQUtDLFVBQVVxQixRQUFRQyxXQUM1QyxFQUFJZCxFQUFLZSxTQUFTQyxlQUVkQyxFQUFxQkMsT0FBT0MsaUJBQWlCNUIsS0FBS0MsVUFBVWEsUUFBUUMsZUFDcEVjLEVBQXNCQyxTQUFTSixFQUFtQkssaUJBQWlCLFdBQ25FQyxFQUFxQkMsS0FBS0MsSUFBSSxFQUFHSixTQUFTSixFQUFtQkssaUJBQWlCLFdBQzlFSSxFQUFlUixPQUFPQyxpQkFBaUI1QixLQUFLQyxVQUFVYSxTQVN0RHNCLEVBQWtCUCxHQVBqQkMsU0FBU0ssRUFBYUosaUJBQWlCLGdCQUNwQ0QsU0FBU0ssRUFBYUosaUJBQWlCLG9CQU8zQ00sRUFBaUJMLEdBTmRGLFNBQVNLLEVBQWFKLGlCQUFpQixrQkFDeENELFNBQVNLLEVBQWFKLGlCQUFpQixrQkFLaUJWLEVBS2hFLE1BSmlCLENBQ2ZkLEtBQU0wQixLQUFLQyxJQS9ESSxFQStEY0QsS0FBS0ssTUFBTUQsRUFBaUJqQyxFQUFLYSxJQUFJQyxLQUFLQyxRQUN2RVgsS0FBTXlCLEtBQUtDLElBL0RJLEVBK0RjRCxLQUFLSyxNQUFNRixFQUFrQmhDLEVBQUthLElBQUlDLEtBQUtFLFNBRzVFLEUiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9GaXRBZGRvbi93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJ3ZWJwYWNrOi8vRml0QWRkb24vc3JjL0ZpdEFkZG9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIkZpdEFkZG9uXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIkZpdEFkZG9uXCJdID0gZmFjdG9yeSgpO1xufSkoc2VsZiwgKCkgPT4ge1xucmV0dXJuICIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE3IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBUZXJtaW5hbCwgSVRlcm1pbmFsQWRkb24gfSBmcm9tICdAeHRlcm0veHRlcm0nO1xuaW1wb3J0IHR5cGUgeyBGaXRBZGRvbiBhcyBJRml0QXBpIH0gZnJvbSAnQHh0ZXJtL2FkZG9uLWZpdCc7XG5pbXBvcnQgeyBJUmVuZGVyRGltZW5zaW9ucyB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1R5cGVzJztcblxuaW50ZXJmYWNlIElUZXJtaW5hbERpbWVuc2lvbnMge1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiByb3dzIGluIHRoZSB0ZXJtaW5hbC5cbiAgICovXG4gIHJvd3M6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSB0ZXJtaW5hbC5cbiAgICovXG4gIGNvbHM6IG51bWJlcjtcbn1cblxuY29uc3QgTUlOSU1VTV9DT0xTID0gMjtcbmNvbnN0IE1JTklNVU1fUk9XUyA9IDE7XG5cbmV4cG9ydCBjbGFzcyBGaXRBZGRvbiBpbXBsZW1lbnRzIElUZXJtaW5hbEFkZG9uICwgSUZpdEFwaSB7XG4gIHByaXZhdGUgX3Rlcm1pbmFsOiBUZXJtaW5hbCB8IHVuZGVmaW5lZDtcblxuICBwdWJsaWMgYWN0aXZhdGUodGVybWluYWw6IFRlcm1pbmFsKTogdm9pZCB7XG4gICAgdGhpcy5fdGVybWluYWwgPSB0ZXJtaW5hbDtcbiAgfVxuXG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge31cblxuICBwdWJsaWMgZml0KCk6IHZvaWQge1xuICAgIGNvbnN0IGRpbXMgPSB0aGlzLnByb3Bvc2VEaW1lbnNpb25zKCk7XG4gICAgaWYgKCFkaW1zIHx8ICF0aGlzLl90ZXJtaW5hbCB8fCBpc05hTihkaW1zLmNvbHMpIHx8IGlzTmFOKGRpbXMucm93cykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBSZW1vdmUgcmVsaWFuY2Ugb24gcHJpdmF0ZSBBUElcbiAgICBjb25zdCBjb3JlID0gKHRoaXMuX3Rlcm1pbmFsIGFzIGFueSkuX2NvcmU7XG5cbiAgICAvLyBGb3JjZSBhIGZ1bGwgcmVuZGVyXG4gICAgaWYgKHRoaXMuX3Rlcm1pbmFsLnJvd3MgIT09IGRpbXMucm93cyB8fCB0aGlzLl90ZXJtaW5hbC5jb2xzICE9PSBkaW1zLmNvbHMpIHtcbiAgICAgIGNvcmUuX3JlbmRlclNlcnZpY2UuY2xlYXIoKTtcbiAgICAgIHRoaXMuX3Rlcm1pbmFsLnJlc2l6ZShkaW1zLmNvbHMsIGRpbXMucm93cyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHByb3Bvc2VEaW1lbnNpb25zKCk6IElUZXJtaW5hbERpbWVuc2lvbnMgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5fdGVybWluYWwpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl90ZXJtaW5hbC5lbGVtZW50IHx8ICF0aGlzLl90ZXJtaW5hbC5lbGVtZW50LnBhcmVudEVsZW1lbnQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogUmVtb3ZlIHJlbGlhbmNlIG9uIHByaXZhdGUgQVBJXG4gICAgY29uc3QgY29yZSA9ICh0aGlzLl90ZXJtaW5hbCBhcyBhbnkpLl9jb3JlO1xuICAgIGNvbnN0IGRpbXM6IElSZW5kZXJEaW1lbnNpb25zID0gY29yZS5fcmVuZGVyU2VydmljZS5kaW1lbnNpb25zO1xuXG4gICAgaWYgKGRpbXMuY3NzLmNlbGwud2lkdGggPT09IDAgfHwgZGltcy5jc3MuY2VsbC5oZWlnaHQgPT09IDApIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3Qgc2Nyb2xsYmFyV2lkdGggPSB0aGlzLl90ZXJtaW5hbC5vcHRpb25zLnNjcm9sbGJhY2sgPT09IDAgP1xuICAgICAgMCA6IGNvcmUudmlld3BvcnQuc2Nyb2xsQmFyV2lkdGg7XG5cbiAgICBjb25zdCBwYXJlbnRFbGVtZW50U3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLl90ZXJtaW5hbC5lbGVtZW50LnBhcmVudEVsZW1lbnQpO1xuICAgIGNvbnN0IHBhcmVudEVsZW1lbnRIZWlnaHQgPSBwYXJzZUludChwYXJlbnRFbGVtZW50U3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnaGVpZ2h0JykpO1xuICAgIGNvbnN0IHBhcmVudEVsZW1lbnRXaWR0aCA9IE1hdGgubWF4KDAsIHBhcnNlSW50KHBhcmVudEVsZW1lbnRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCd3aWR0aCcpKSk7XG4gICAgY29uc3QgZWxlbWVudFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5fdGVybWluYWwuZWxlbWVudCk7XG4gICAgY29uc3QgZWxlbWVudFBhZGRpbmcgPSB7XG4gICAgICB0b3A6IHBhcnNlSW50KGVsZW1lbnRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdwYWRkaW5nLXRvcCcpKSxcbiAgICAgIGJvdHRvbTogcGFyc2VJbnQoZWxlbWVudFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3BhZGRpbmctYm90dG9tJykpLFxuICAgICAgcmlnaHQ6IHBhcnNlSW50KGVsZW1lbnRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdwYWRkaW5nLXJpZ2h0JykpLFxuICAgICAgbGVmdDogcGFyc2VJbnQoZWxlbWVudFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3BhZGRpbmctbGVmdCcpKVxuICAgIH07XG4gICAgY29uc3QgZWxlbWVudFBhZGRpbmdWZXIgPSBlbGVtZW50UGFkZGluZy50b3AgKyBlbGVtZW50UGFkZGluZy5ib3R0b207XG4gICAgY29uc3QgZWxlbWVudFBhZGRpbmdIb3IgPSBlbGVtZW50UGFkZGluZy5yaWdodCArIGVsZW1lbnRQYWRkaW5nLmxlZnQ7XG4gICAgY29uc3QgYXZhaWxhYmxlSGVpZ2h0ID0gcGFyZW50RWxlbWVudEhlaWdodCAtIGVsZW1lbnRQYWRkaW5nVmVyO1xuICAgIGNvbnN0IGF2YWlsYWJsZVdpZHRoID0gcGFyZW50RWxlbWVudFdpZHRoIC0gZWxlbWVudFBhZGRpbmdIb3IgLSBzY3JvbGxiYXJXaWR0aDtcbiAgICBjb25zdCBnZW9tZXRyeSA9IHtcbiAgICAgIGNvbHM6IE1hdGgubWF4KE1JTklNVU1fQ09MUywgTWF0aC5mbG9vcihhdmFpbGFibGVXaWR0aCAvIGRpbXMuY3NzLmNlbGwud2lkdGgpKSxcbiAgICAgIHJvd3M6IE1hdGgubWF4KE1JTklNVU1fUk9XUywgTWF0aC5mbG9vcihhdmFpbGFibGVIZWlnaHQgLyBkaW1zLmNzcy5jZWxsLmhlaWdodCkpXG4gICAgfTtcbiAgICByZXR1cm4gZ2VvbWV0cnk7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJyb290IiwiZmFjdG9yeSIsImV4cG9ydHMiLCJtb2R1bGUiLCJkZWZpbmUiLCJhbWQiLCJzZWxmIiwiYWN0aXZhdGUiLCJ0ZXJtaW5hbCIsInRoaXMiLCJfdGVybWluYWwiLCJkaXNwb3NlIiwiZml0IiwiZGltcyIsInByb3Bvc2VEaW1lbnNpb25zIiwiaXNOYU4iLCJjb2xzIiwicm93cyIsImNvcmUiLCJfY29yZSIsIl9yZW5kZXJTZXJ2aWNlIiwiY2xlYXIiLCJyZXNpemUiLCJlbGVtZW50IiwicGFyZW50RWxlbWVudCIsImRpbWVuc2lvbnMiLCJjc3MiLCJjZWxsIiwid2lkdGgiLCJoZWlnaHQiLCJzY3JvbGxiYXJXaWR0aCIsIm9wdGlvbnMiLCJzY3JvbGxiYWNrIiwidmlld3BvcnQiLCJzY3JvbGxCYXJXaWR0aCIsInBhcmVudEVsZW1lbnRTdHlsZSIsIndpbmRvdyIsImdldENvbXB1dGVkU3R5bGUiLCJwYXJlbnRFbGVtZW50SGVpZ2h0IiwicGFyc2VJbnQiLCJnZXRQcm9wZXJ0eVZhbHVlIiwicGFyZW50RWxlbWVudFdpZHRoIiwiTWF0aCIsIm1heCIsImVsZW1lbnRTdHlsZSIsImF2YWlsYWJsZUhlaWdodCIsImF2YWlsYWJsZVdpZHRoIiwiZmxvb3IiXSwic291cmNlUm9vdCI6IiJ9
@@ -1,64 +0,0 @@
1
- {
2
- "version": 3,
3
- "file": "addon-fit.js",
4
- "mappings": "CAAA,SAA2CA,EAAMC,GAC1B,iBAAZC,SAA0C,iBAAXC,OACxCA,OAAOD,QAAUD,IACQ,mBAAXG,QAAyBA,OAAOC,IAC9CD,OAAO,GAAIH,GACe,iBAAZC,QACdA,QAAkB,SAAID,IAEtBD,EAAe,SAAIC,GACpB,CATD,CASGK,MAAM,I,mHCeT,iBAGS,QAAAC,CAASC,GACdC,KAAKC,UAAYF,CACnB,CAEO,OAAAG,GAAiB,CAEjB,GAAAC,GACL,MAAMC,EAAOJ,KAAKK,oBAClB,IAAKD,IAASJ,KAAKC,WAAaK,MAAMF,EAAKG,OAASD,MAAMF,EAAKI,MAC7D,OAIF,MAAMC,EAAQT,KAAKC,UAAkBS,MAGjCV,KAAKC,UAAUO,OAASJ,EAAKI,MAAQR,KAAKC,UAAUM,OAASH,EAAKG,OACpEE,EAAKE,eAAeC,QACpBZ,KAAKC,UAAUY,OAAOT,EAAKG,KAAMH,EAAKI,MAE1C,CAEO,iBAAAH,GACL,IAAKL,KAAKC,UACR,OAGF,IAAKD,KAAKC,UAAUa,UAAYd,KAAKC,UAAUa,QAAQC,cACrD,OAIF,MAAMN,EAAQT,KAAKC,UAAkBS,MAC/BN,EAA0BK,EAAKE,eAAeK,WAEpD,GAA4B,IAAxBZ,EAAKa,IAAIC,KAAKC,OAAwC,IAAzBf,EAAKa,IAAIC,KAAKE,OAC7C,OAGF,MAAMC,EAAuD,IAAtCrB,KAAKC,UAAUqB,QAAQC,WAC5C,EAAId,EAAKe,SAASC,eAEdC,EAAqBC,OAAOC,iBAAiB5B,KAAKC,UAAUa,QAAQC,eACpEc,EAAsBC,SAASJ,EAAmBK,iBAAiB,WACnEC,EAAqBC,KAAKC,IAAI,EAAGJ,SAASJ,EAAmBK,iBAAiB,WAC9EI,EAAeR,OAAOC,iBAAiB5B,KAAKC,UAAUa,SAStDsB,EAAkBP,GAPjBC,SAASK,EAAaJ,iBAAiB,gBACpCD,SAASK,EAAaJ,iBAAiB,oBAO3CM,EAAiBL,GANdF,SAASK,EAAaJ,iBAAiB,kBACxCD,SAASK,EAAaJ,iBAAiB,kBAKiBV,EAKhE,MAJiB,CACfd,KAAM0B,KAAKC,IA/DI,EA+DcD,KAAKK,MAAMD,EAAiBjC,EAAKa,IAAIC,KAAKC,QACvEX,KAAMyB,KAAKC,IA/DI,EA+DcD,KAAKK,MAAMF,EAAkBhC,EAAKa,IAAIC,KAAKE,SAG5E,E",
5
- "sources": [
6
- "webpack://FitAddon/webpack/universalModuleDefinition",
7
- "webpack://FitAddon/src/FitAddon.ts"
8
- ],
9
- "sourcesContent": [
10
- "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"FitAddon\"] = factory();\n\telse\n\t\troot[\"FitAddon\"] = factory();\n})(self, () => {\nreturn ",
11
- "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { Terminal, ITerminalAddon } from '@xterm/xterm';\nimport type { FitAddon as IFitApi } from '@xterm/addon-fit';\nimport { IRenderDimensions } from 'browser/renderer/shared/Types';\n\ninterface ITerminalDimensions {\n /**\n * The number of rows in the terminal.\n */\n rows: number;\n\n /**\n * The number of columns in the terminal.\n */\n cols: number;\n}\n\nconst MINIMUM_COLS = 2;\nconst MINIMUM_ROWS = 1;\n\nexport class FitAddon implements ITerminalAddon , IFitApi {\n private _terminal: Terminal | undefined;\n\n public activate(terminal: Terminal): void {\n this._terminal = terminal;\n }\n\n public dispose(): void {}\n\n public fit(): void {\n const dims = this.proposeDimensions();\n if (!dims || !this._terminal || isNaN(dims.cols) || isNaN(dims.rows)) {\n return;\n }\n\n // TODO: Remove reliance on private API\n const core = (this._terminal as any)._core;\n\n // Force a full render\n if (this._terminal.rows !== dims.rows || this._terminal.cols !== dims.cols) {\n core._renderService.clear();\n this._terminal.resize(dims.cols, dims.rows);\n }\n }\n\n public proposeDimensions(): ITerminalDimensions | undefined {\n if (!this._terminal) {\n return undefined;\n }\n\n if (!this._terminal.element || !this._terminal.element.parentElement) {\n return undefined;\n }\n\n // TODO: Remove reliance on private API\n const core = (this._terminal as any)._core;\n const dims: IRenderDimensions = core._renderService.dimensions;\n\n if (dims.css.cell.width === 0 || dims.css.cell.height === 0) {\n return undefined;\n }\n\n const scrollbarWidth = this._terminal.options.scrollback === 0 ?\n 0 : core.viewport.scrollBarWidth;\n\n const parentElementStyle = window.getComputedStyle(this._terminal.element.parentElement);\n const parentElementHeight = parseInt(parentElementStyle.getPropertyValue('height'));\n const parentElementWidth = Math.max(0, parseInt(parentElementStyle.getPropertyValue('width')));\n const elementStyle = window.getComputedStyle(this._terminal.element);\n const elementPadding = {\n top: parseInt(elementStyle.getPropertyValue('padding-top')),\n bottom: parseInt(elementStyle.getPropertyValue('padding-bottom')),\n right: parseInt(elementStyle.getPropertyValue('padding-right')),\n left: parseInt(elementStyle.getPropertyValue('padding-left'))\n };\n const elementPaddingVer = elementPadding.top + elementPadding.bottom;\n const elementPaddingHor = elementPadding.right + elementPadding.left;\n const availableHeight = parentElementHeight - elementPaddingVer;\n const availableWidth = parentElementWidth - elementPaddingHor - scrollbarWidth;\n const geometry = {\n cols: Math.max(MINIMUM_COLS, Math.floor(availableWidth / dims.css.cell.width)),\n rows: Math.max(MINIMUM_ROWS, Math.floor(availableHeight / dims.css.cell.height))\n };\n return geometry;\n }\n}\n"
12
- ],
13
- "names": [
14
- "root",
15
- "factory",
16
- "exports",
17
- "module",
18
- "define",
19
- "amd",
20
- "self",
21
- "activate",
22
- "terminal",
23
- "this",
24
- "_terminal",
25
- "dispose",
26
- "fit",
27
- "dims",
28
- "proposeDimensions",
29
- "isNaN",
30
- "cols",
31
- "rows",
32
- "core",
33
- "_core",
34
- "_renderService",
35
- "clear",
36
- "resize",
37
- "element",
38
- "parentElement",
39
- "dimensions",
40
- "css",
41
- "cell",
42
- "width",
43
- "height",
44
- "scrollbarWidth",
45
- "options",
46
- "scrollback",
47
- "viewport",
48
- "scrollBarWidth",
49
- "parentElementStyle",
50
- "window",
51
- "getComputedStyle",
52
- "parentElementHeight",
53
- "parseInt",
54
- "getPropertyValue",
55
- "parentElementWidth",
56
- "Math",
57
- "max",
58
- "elementStyle",
59
- "availableHeight",
60
- "availableWidth",
61
- "floor"
62
- ],
63
- "sourceRoot": ""
64
- }
@@ -1,2 +0,0 @@
1
- !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.SerializeAddon=t():e.SerializeAddon=t()}(this,(()=>(()=>{"use strict";var e={930:(e,t,s)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ColorContrastCache=void 0;const r=s(485);t.ColorContrastCache=class{constructor(){this._color=new r.TwoKeyMap,this._css=new r.TwoKeyMap}setCss(e,t,s){this._css.set(e,t,s)}getCss(e,t){return this._css.get(e,t)}setColor(e,t,s){this._color.set(e,t,s)}getColor(e,t){return this._color.get(e,t)}clear(){this._color.clear(),this._css.clear()}}},997:function(e,t,s){var r=this&&this.__decorate||function(e,t,s,r){var o,i=arguments.length,n=i<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,s):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,s,r);else for(var l=e.length-1;l>=0;l--)(o=e[l])&&(n=(i<3?o(n):i>3?o(t,s,n):o(t,s))||n);return i>3&&n&&Object.defineProperty(t,s,n),n},o=this&&this.__param||function(e,t){return function(s,r){t(s,r,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.ThemeService=t.DEFAULT_ANSI_COLORS=void 0;const i=s(930),n=s(160),l=s(345),a=s(859),c=s(97),h=n.css.toColor("#ffffff"),u=n.css.toColor("#000000"),_=n.css.toColor("#ffffff"),d=n.css.toColor("#000000"),C={css:"rgba(255, 255, 255, 0.3)",rgba:4294967117};t.DEFAULT_ANSI_COLORS=Object.freeze((()=>{const e=[n.css.toColor("#2e3436"),n.css.toColor("#cc0000"),n.css.toColor("#4e9a06"),n.css.toColor("#c4a000"),n.css.toColor("#3465a4"),n.css.toColor("#75507b"),n.css.toColor("#06989a"),n.css.toColor("#d3d7cf"),n.css.toColor("#555753"),n.css.toColor("#ef2929"),n.css.toColor("#8ae234"),n.css.toColor("#fce94f"),n.css.toColor("#729fcf"),n.css.toColor("#ad7fa8"),n.css.toColor("#34e2e2"),n.css.toColor("#eeeeec")],t=[0,95,135,175,215,255];for(let s=0;s<216;s++){const r=t[s/36%6|0],o=t[s/6%6|0],i=t[s%6];e.push({css:n.channels.toCss(r,o,i),rgba:n.channels.toRgba(r,o,i)})}for(let t=0;t<24;t++){const s=8+10*t;e.push({css:n.channels.toCss(s,s,s),rgba:n.channels.toRgba(s,s,s)})}return e})());let f=t.ThemeService=class extends a.Disposable{get colors(){return this._colors}constructor(e){super(),this._optionsService=e,this._contrastCache=new i.ColorContrastCache,this._halfContrastCache=new i.ColorContrastCache,this._onChangeColors=this.register(new l.EventEmitter),this.onChangeColors=this._onChangeColors.event,this._colors={foreground:h,background:u,cursor:_,cursorAccent:d,selectionForeground:void 0,selectionBackgroundTransparent:C,selectionBackgroundOpaque:n.color.blend(u,C),selectionInactiveBackgroundTransparent:C,selectionInactiveBackgroundOpaque:n.color.blend(u,C),ansi:t.DEFAULT_ANSI_COLORS.slice(),contrastCache:this._contrastCache,halfContrastCache:this._halfContrastCache},this._updateRestoreColors(),this._setTheme(this._optionsService.rawOptions.theme),this.register(this._optionsService.onSpecificOptionChange("minimumContrastRatio",(()=>this._contrastCache.clear()))),this.register(this._optionsService.onSpecificOptionChange("theme",(()=>this._setTheme(this._optionsService.rawOptions.theme))))}_setTheme(e={}){const s=this._colors;if(s.foreground=g(e.foreground,h),s.background=g(e.background,u),s.cursor=g(e.cursor,_),s.cursorAccent=g(e.cursorAccent,d),s.selectionBackgroundTransparent=g(e.selectionBackground,C),s.selectionBackgroundOpaque=n.color.blend(s.background,s.selectionBackgroundTransparent),s.selectionInactiveBackgroundTransparent=g(e.selectionInactiveBackground,s.selectionBackgroundTransparent),s.selectionInactiveBackgroundOpaque=n.color.blend(s.background,s.selectionInactiveBackgroundTransparent),s.selectionForeground=e.selectionForeground?g(e.selectionForeground,n.NULL_COLOR):void 0,s.selectionForeground===n.NULL_COLOR&&(s.selectionForeground=void 0),n.color.isOpaque(s.selectionBackgroundTransparent)){const e=.3;s.selectionBackgroundTransparent=n.color.opacity(s.selectionBackgroundTransparent,e)}if(n.color.isOpaque(s.selectionInactiveBackgroundTransparent)){const e=.3;s.selectionInactiveBackgroundTransparent=n.color.opacity(s.selectionInactiveBackgroundTransparent,e)}if(s.ansi=t.DEFAULT_ANSI_COLORS.slice(),s.ansi[0]=g(e.black,t.DEFAULT_ANSI_COLORS[0]),s.ansi[1]=g(e.red,t.DEFAULT_ANSI_COLORS[1]),s.ansi[2]=g(e.green,t.DEFAULT_ANSI_COLORS[2]),s.ansi[3]=g(e.yellow,t.DEFAULT_ANSI_COLORS[3]),s.ansi[4]=g(e.blue,t.DEFAULT_ANSI_COLORS[4]),s.ansi[5]=g(e.magenta,t.DEFAULT_ANSI_COLORS[5]),s.ansi[6]=g(e.cyan,t.DEFAULT_ANSI_COLORS[6]),s.ansi[7]=g(e.white,t.DEFAULT_ANSI_COLORS[7]),s.ansi[8]=g(e.brightBlack,t.DEFAULT_ANSI_COLORS[8]),s.ansi[9]=g(e.brightRed,t.DEFAULT_ANSI_COLORS[9]),s.ansi[10]=g(e.brightGreen,t.DEFAULT_ANSI_COLORS[10]),s.ansi[11]=g(e.brightYellow,t.DEFAULT_ANSI_COLORS[11]),s.ansi[12]=g(e.brightBlue,t.DEFAULT_ANSI_COLORS[12]),s.ansi[13]=g(e.brightMagenta,t.DEFAULT_ANSI_COLORS[13]),s.ansi[14]=g(e.brightCyan,t.DEFAULT_ANSI_COLORS[14]),s.ansi[15]=g(e.brightWhite,t.DEFAULT_ANSI_COLORS[15]),e.extendedAnsi){const r=Math.min(s.ansi.length-16,e.extendedAnsi.length);for(let o=0;o<r;o++)s.ansi[o+16]=g(e.extendedAnsi[o],t.DEFAULT_ANSI_COLORS[o+16])}this._contrastCache.clear(),this._halfContrastCache.clear(),this._updateRestoreColors(),this._onChangeColors.fire(this.colors)}restoreColor(e){this._restoreColor(e),this._onChangeColors.fire(this.colors)}_restoreColor(e){if(void 0!==e)switch(e){case 256:this._colors.foreground=this._restoreColors.foreground;break;case 257:this._colors.background=this._restoreColors.background;break;case 258:this._colors.cursor=this._restoreColors.cursor;break;default:this._colors.ansi[e]=this._restoreColors.ansi[e]}else for(let e=0;e<this._restoreColors.ansi.length;++e)this._colors.ansi[e]=this._restoreColors.ansi[e]}modifyColors(e){e(this._colors),this._onChangeColors.fire(this.colors)}_updateRestoreColors(){this._restoreColors={foreground:this._colors.foreground,background:this._colors.background,cursor:this._colors.cursor,ansi:this._colors.ansi.slice()}}};function g(e,t){if(void 0!==e)try{return n.css.toColor(e)}catch{}return t}t.ThemeService=f=r([o(0,c.IOptionsService)],f)},160:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.contrastRatio=t.toPaddedHex=t.rgba=t.rgb=t.css=t.color=t.channels=t.NULL_COLOR=void 0;let s=0,r=0,o=0,i=0;var n,l,a,c,h;function u(e){const t=e.toString(16);return t.length<2?"0"+t:t}function _(e,t){return e<t?(t+.05)/(e+.05):(e+.05)/(t+.05)}t.NULL_COLOR={css:"#00000000",rgba:0},function(e){e.toCss=function(e,t,s,r){return void 0!==r?`#${u(e)}${u(t)}${u(s)}${u(r)}`:`#${u(e)}${u(t)}${u(s)}`},e.toRgba=function(e,t,s,r=255){return(e<<24|t<<16|s<<8|r)>>>0},e.toColor=function(t,s,r,o){return{css:e.toCss(t,s,r,o),rgba:e.toRgba(t,s,r,o)}}}(n||(t.channels=n={})),function(e){function t(e,t){return i=Math.round(255*t),[s,r,o]=h.toChannels(e.rgba),{css:n.toCss(s,r,o,i),rgba:n.toRgba(s,r,o,i)}}e.blend=function(e,t){if(i=(255&t.rgba)/255,1===i)return{css:t.css,rgba:t.rgba};const l=t.rgba>>24&255,a=t.rgba>>16&255,c=t.rgba>>8&255,h=e.rgba>>24&255,u=e.rgba>>16&255,_=e.rgba>>8&255;return s=h+Math.round((l-h)*i),r=u+Math.round((a-u)*i),o=_+Math.round((c-_)*i),{css:n.toCss(s,r,o),rgba:n.toRgba(s,r,o)}},e.isOpaque=function(e){return 255==(255&e.rgba)},e.ensureContrastRatio=function(e,t,s){const r=h.ensureContrastRatio(e.rgba,t.rgba,s);if(r)return n.toColor(r>>24&255,r>>16&255,r>>8&255)},e.opaque=function(e){const t=(255|e.rgba)>>>0;return[s,r,o]=h.toChannels(t),{css:n.toCss(s,r,o),rgba:t}},e.opacity=t,e.multiplyOpacity=function(e,s){return i=255&e.rgba,t(e,i*s/255)},e.toColorRGB=function(e){return[e.rgba>>24&255,e.rgba>>16&255,e.rgba>>8&255]}}(l||(t.color=l={})),function(e){let t,l;try{const e=document.createElement("canvas");e.width=1,e.height=1;const s=e.getContext("2d",{willReadFrequently:!0});s&&(t=s,t.globalCompositeOperation="copy",l=t.createLinearGradient(0,0,1,1))}catch{}e.toColor=function(e){if(e.match(/#[\da-f]{3,8}/i))switch(e.length){case 4:return s=parseInt(e.slice(1,2).repeat(2),16),r=parseInt(e.slice(2,3).repeat(2),16),o=parseInt(e.slice(3,4).repeat(2),16),n.toColor(s,r,o);case 5:return s=parseInt(e.slice(1,2).repeat(2),16),r=parseInt(e.slice(2,3).repeat(2),16),o=parseInt(e.slice(3,4).repeat(2),16),i=parseInt(e.slice(4,5).repeat(2),16),n.toColor(s,r,o,i);case 7:return{css:e,rgba:(parseInt(e.slice(1),16)<<8|255)>>>0};case 9:return{css:e,rgba:parseInt(e.slice(1),16)>>>0}}const a=e.match(/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(,\s*(0|1|\d?\.(\d+))\s*)?\)/);if(a)return s=parseInt(a[1]),r=parseInt(a[2]),o=parseInt(a[3]),i=Math.round(255*(void 0===a[5]?1:parseFloat(a[5]))),n.toColor(s,r,o,i);if(!t||!l)throw new Error("css.toColor: Unsupported css format");if(t.fillStyle=l,t.fillStyle=e,"string"!=typeof t.fillStyle)throw new Error("css.toColor: Unsupported css format");if(t.fillRect(0,0,1,1),[s,r,o,i]=t.getImageData(0,0,1,1).data,255!==i)throw new Error("css.toColor: Unsupported css format");return{rgba:n.toRgba(s,r,o,i),css:e}}}(a||(t.css=a={})),function(e){function t(e,t,s){const r=e/255,o=t/255,i=s/255;return.2126*(r<=.03928?r/12.92:Math.pow((r+.055)/1.055,2.4))+.7152*(o<=.03928?o/12.92:Math.pow((o+.055)/1.055,2.4))+.0722*(i<=.03928?i/12.92:Math.pow((i+.055)/1.055,2.4))}e.relativeLuminance=function(e){return t(e>>16&255,e>>8&255,255&e)},e.relativeLuminance2=t}(c||(t.rgb=c={})),function(e){function t(e,t,s){const r=e>>24&255,o=e>>16&255,i=e>>8&255;let n=t>>24&255,l=t>>16&255,a=t>>8&255,h=_(c.relativeLuminance2(n,l,a),c.relativeLuminance2(r,o,i));for(;h<s&&(n>0||l>0||a>0);)n-=Math.max(0,Math.ceil(.1*n)),l-=Math.max(0,Math.ceil(.1*l)),a-=Math.max(0,Math.ceil(.1*a)),h=_(c.relativeLuminance2(n,l,a),c.relativeLuminance2(r,o,i));return(n<<24|l<<16|a<<8|255)>>>0}function l(e,t,s){const r=e>>24&255,o=e>>16&255,i=e>>8&255;let n=t>>24&255,l=t>>16&255,a=t>>8&255,h=_(c.relativeLuminance2(n,l,a),c.relativeLuminance2(r,o,i));for(;h<s&&(n<255||l<255||a<255);)n=Math.min(255,n+Math.ceil(.1*(255-n))),l=Math.min(255,l+Math.ceil(.1*(255-l))),a=Math.min(255,a+Math.ceil(.1*(255-a))),h=_(c.relativeLuminance2(n,l,a),c.relativeLuminance2(r,o,i));return(n<<24|l<<16|a<<8|255)>>>0}e.blend=function(e,t){if(i=(255&t)/255,1===i)return t;const l=t>>24&255,a=t>>16&255,c=t>>8&255,h=e>>24&255,u=e>>16&255,_=e>>8&255;return s=h+Math.round((l-h)*i),r=u+Math.round((a-u)*i),o=_+Math.round((c-_)*i),n.toRgba(s,r,o)},e.ensureContrastRatio=function(e,s,r){const o=c.relativeLuminance(e>>8),i=c.relativeLuminance(s>>8);if(_(o,i)<r){if(i<o){const i=t(e,s,r),n=_(o,c.relativeLuminance(i>>8));if(n<r){const t=l(e,s,r);return n>_(o,c.relativeLuminance(t>>8))?i:t}return i}const n=l(e,s,r),a=_(o,c.relativeLuminance(n>>8));if(a<r){const i=t(e,s,r);return a>_(o,c.relativeLuminance(i>>8))?n:i}return n}},e.reduceLuminance=t,e.increaseLuminance=l,e.toChannels=function(e){return[e>>24&255,e>>16&255,e>>8&255,255&e]}}(h||(t.rgba=h={})),t.toPaddedHex=u,t.contrastRatio=_},345:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.runAndSubscribe=t.forwardEvent=t.EventEmitter=void 0,t.EventEmitter=class{constructor(){this._listeners=[],this._disposed=!1}get event(){return this._event||(this._event=e=>(this._listeners.push(e),{dispose:()=>{if(!this._disposed)for(let t=0;t<this._listeners.length;t++)if(this._listeners[t]===e)return void this._listeners.splice(t,1)}})),this._event}fire(e,t){const s=[];for(let e=0;e<this._listeners.length;e++)s.push(this._listeners[e]);for(let r=0;r<s.length;r++)s[r].call(void 0,e,t)}dispose(){this.clearListeners(),this._disposed=!0}clearListeners(){this._listeners&&(this._listeners.length=0)}},t.forwardEvent=function(e,t){return e((e=>t.fire(e)))},t.runAndSubscribe=function(e,t){return t(void 0),e((e=>t(e)))}},859:(e,t)=>{function s(e){for(const t of e)t.dispose();e.length=0}Object.defineProperty(t,"__esModule",{value:!0}),t.getDisposeArrayDisposable=t.disposeArray=t.toDisposable=t.MutableDisposable=t.Disposable=void 0,t.Disposable=class{constructor(){this._disposables=[],this._isDisposed=!1}dispose(){this._isDisposed=!0;for(const e of this._disposables)e.dispose();this._disposables.length=0}register(e){return this._disposables.push(e),e}unregister(e){const t=this._disposables.indexOf(e);-1!==t&&this._disposables.splice(t,1)}},t.MutableDisposable=class{constructor(){this._isDisposed=!1}get value(){return this._isDisposed?void 0:this._value}set value(e){this._isDisposed||e===this._value||(this._value?.dispose(),this._value=e)}clear(){this.value=void 0}dispose(){this._isDisposed=!0,this._value?.dispose(),this._value=void 0}},t.toDisposable=function(e){return{dispose:e}},t.disposeArray=s,t.getDisposeArrayDisposable=function(e){return{dispose:()=>s(e)}}},485:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.FourKeyMap=t.TwoKeyMap=void 0;class s{constructor(){this._data={}}set(e,t,s){this._data[e]||(this._data[e]={}),this._data[e][t]=s}get(e,t){return this._data[e]?this._data[e][t]:void 0}clear(){this._data={}}}t.TwoKeyMap=s,t.FourKeyMap=class{constructor(){this._data=new s}set(e,t,r,o,i){this._data.get(e,t)||this._data.set(e,t,new s),this._data.get(e,t).set(r,o,i)}get(e,t,s,r){return this._data.get(e,t)?.get(s,r)}clear(){this._data.clear()}}},726:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.createDecorator=t.getServiceDependencies=t.serviceRegistry=void 0;const s="di$target",r="di$dependencies";t.serviceRegistry=new Map,t.getServiceDependencies=function(e){return e[r]||[]},t.createDecorator=function(e){if(t.serviceRegistry.has(e))return t.serviceRegistry.get(e);const o=function(e,t,i){if(3!==arguments.length)throw new Error("@IServiceName-decorator can only be used to decorate a parameter");!function(e,t,o){t[s]===t?t[r].push({id:e,index:o}):(t[r]=[{id:e,index:o}],t[s]=t)}(o,e,i)};return o.toString=()=>e,t.serviceRegistry.set(e,o),o}},97:(e,t,s)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.IDecorationService=t.IUnicodeService=t.IOscLinkService=t.IOptionsService=t.ILogService=t.LogLevelEnum=t.IInstantiationService=t.ICharsetService=t.ICoreService=t.ICoreMouseService=t.IBufferService=void 0;const r=s(726);var o;t.IBufferService=(0,r.createDecorator)("BufferService"),t.ICoreMouseService=(0,r.createDecorator)("CoreMouseService"),t.ICoreService=(0,r.createDecorator)("CoreService"),t.ICharsetService=(0,r.createDecorator)("CharsetService"),t.IInstantiationService=(0,r.createDecorator)("InstantiationService"),function(e){e[e.TRACE=0]="TRACE",e[e.DEBUG=1]="DEBUG",e[e.INFO=2]="INFO",e[e.WARN=3]="WARN",e[e.ERROR=4]="ERROR",e[e.OFF=5]="OFF"}(o||(t.LogLevelEnum=o={})),t.ILogService=(0,r.createDecorator)("LogService"),t.IOptionsService=(0,r.createDecorator)("OptionsService"),t.IOscLinkService=(0,r.createDecorator)("OscLinkService"),t.IUnicodeService=(0,r.createDecorator)("UnicodeService"),t.IDecorationService=(0,r.createDecorator)("DecorationService")}},t={};function s(r){var o=t[r];if(void 0!==o)return o.exports;var i=t[r]={exports:{}};return e[r].call(i.exports,i,i.exports,s),i.exports}var r={};return(()=>{var e=r;Object.defineProperty(e,"__esModule",{value:!0}),e.HTMLSerializeHandler=e.SerializeAddon=void 0;const t=s(997);function o(e,t,s){return Math.max(t,Math.min(e,s))}class i{constructor(e){this._buffer=e}serialize(e,t){const s=this._buffer.getNullCell(),r=this._buffer.getNullCell();let o=s;const i=e.start.y,n=e.end.y,l=e.start.x,a=e.end.x;this._beforeSerialize(n-i,i,n);for(let t=i;t<=n;t++){const i=this._buffer.getLine(t);if(i){const n=t===e.start.y?l:0,c=t===e.end.y?a:i.length;for(let e=n;e<c;e++){const n=i.getCell(e,o===s?r:s);n?(this._nextCell(n,o,t,e),o=n):console.warn(`Can't get cell at row=${t}, col=${e}`)}}this._rowEnd(t,t===n)}return this._afterSerialize(),this._serializeString(t)}_nextCell(e,t,s,r){}_rowEnd(e,t){}_beforeSerialize(e,t,s){}_afterSerialize(){}_serializeString(e){return""}}function n(e,t){return e.getFgColorMode()===t.getFgColorMode()&&e.getFgColor()===t.getFgColor()}function l(e,t){return e.getBgColorMode()===t.getBgColorMode()&&e.getBgColor()===t.getBgColor()}function a(e,t){return e.isInverse()===t.isInverse()&&e.isBold()===t.isBold()&&e.isUnderline()===t.isUnderline()&&e.isOverline()===t.isOverline()&&e.isBlink()===t.isBlink()&&e.isInvisible()===t.isInvisible()&&e.isItalic()===t.isItalic()&&e.isDim()===t.isDim()&&e.isStrikethrough()===t.isStrikethrough()}class c extends i{constructor(e,t){super(e),this._terminal=t,this._rowIndex=0,this._allRows=new Array,this._allRowSeparators=new Array,this._currentRow="",this._nullCellCount=0,this._cursorStyle=this._buffer.getNullCell(),this._cursorStyleRow=0,this._cursorStyleCol=0,this._backgroundCell=this._buffer.getNullCell(),this._firstRow=0,this._lastCursorRow=0,this._lastCursorCol=0,this._lastContentCursorRow=0,this._lastContentCursorCol=0,this._thisRowLastChar=this._buffer.getNullCell(),this._thisRowLastSecondChar=this._buffer.getNullCell(),this._nextRowFirstChar=this._buffer.getNullCell()}_beforeSerialize(e,t,s){this._allRows=new Array(e),this._lastContentCursorRow=t,this._lastCursorRow=t,this._firstRow=t}_rowEnd(e,t){this._nullCellCount>0&&!l(this._cursorStyle,this._backgroundCell)&&(this._currentRow+=`[${this._nullCellCount}X`);let s="";if(!t){e-this._firstRow>=this._terminal.rows&&this._buffer.getLine(this._cursorStyleRow)?.getCell(this._cursorStyleCol,this._backgroundCell);const t=this._buffer.getLine(e),r=this._buffer.getLine(e+1);if(r.isWrapped){s="";const o=t.getCell(t.length-1,this._thisRowLastChar),i=t.getCell(t.length-2,this._thisRowLastSecondChar),n=r.getCell(0,this._nextRowFirstChar),a=n.getWidth()>1;let c=!1;(n.getChars()&&a?this._nullCellCount<=1:this._nullCellCount<=0)&&((o.getChars()||0===o.getWidth())&&l(o,n)&&(c=!0),a&&(i.getChars()||0===i.getWidth())&&l(o,n)&&l(i,n)&&(c=!0)),c||(s="-".repeat(this._nullCellCount+1),s+="",this._nullCellCount>0&&(s+="",s+=`[${t.length-this._nullCellCount}C`,s+=`[${this._nullCellCount}X`,s+=`[${t.length-this._nullCellCount}D`,s+=""),this._lastContentCursorRow=e+1,this._lastContentCursorCol=0,this._lastCursorRow=e+1,this._lastCursorCol=0)}else s="\r\n",this._lastCursorRow=e+1,this._lastCursorCol=0}this._allRows[this._rowIndex]=this._currentRow,this._allRowSeparators[this._rowIndex++]=s,this._currentRow="",this._nullCellCount=0}_diffStyle(e,t){const s=[],r=!n(e,t),o=!l(e,t),i=!a(e,t);if(r||o||i)if(e.isAttributeDefault())t.isAttributeDefault()||s.push(0);else{if(r){const t=e.getFgColor();e.isFgRGB()?s.push(38,2,t>>>16&255,t>>>8&255,255&t):e.isFgPalette()?t>=16?s.push(38,5,t):s.push(8&t?90+(7&t):30+(7&t)):s.push(39)}if(o){const t=e.getBgColor();e.isBgRGB()?s.push(48,2,t>>>16&255,t>>>8&255,255&t):e.isBgPalette()?t>=16?s.push(48,5,t):s.push(8&t?100+(7&t):40+(7&t)):s.push(49)}i&&(e.isInverse()!==t.isInverse()&&s.push(e.isInverse()?7:27),e.isBold()!==t.isBold()&&s.push(e.isBold()?1:22),e.isUnderline()!==t.isUnderline()&&s.push(e.isUnderline()?4:24),e.isOverline()!==t.isOverline()&&s.push(e.isOverline()?53:55),e.isBlink()!==t.isBlink()&&s.push(e.isBlink()?5:25),e.isInvisible()!==t.isInvisible()&&s.push(e.isInvisible()?8:28),e.isItalic()!==t.isItalic()&&s.push(e.isItalic()?3:23),e.isDim()!==t.isDim()&&s.push(e.isDim()?2:22),e.isStrikethrough()!==t.isStrikethrough()&&s.push(e.isStrikethrough()?9:29))}return s}_nextCell(e,t,s,r){if(0===e.getWidth())return;const o=""===e.getChars(),i=this._diffStyle(e,this._cursorStyle);if(o?!l(this._cursorStyle,e):i.length>0){this._nullCellCount>0&&(l(this._cursorStyle,this._backgroundCell)||(this._currentRow+=`[${this._nullCellCount}X`),this._currentRow+=`[${this._nullCellCount}C`,this._nullCellCount=0),this._lastContentCursorRow=this._lastCursorRow=s,this._lastContentCursorCol=this._lastCursorCol=r,this._currentRow+=`[${i.join(";")}m`;const e=this._buffer.getLine(s);void 0!==e&&(e.getCell(r,this._cursorStyle),this._cursorStyleRow=s,this._cursorStyleCol=r)}o?this._nullCellCount+=e.getWidth():(this._nullCellCount>0&&(l(this._cursorStyle,this._backgroundCell)||(this._currentRow+=`[${this._nullCellCount}X`),this._currentRow+=`[${this._nullCellCount}C`,this._nullCellCount=0),this._currentRow+=e.getChars(),this._lastContentCursorRow=this._lastCursorRow=s,this._lastContentCursorCol=this._lastCursorCol=r+e.getWidth())}_serializeString(e){let t=this._allRows.length;this._buffer.length-this._firstRow<=this._terminal.rows&&(t=this._lastContentCursorRow+1-this._firstRow,this._lastCursorCol=this._lastContentCursorCol,this._lastCursorRow=this._lastContentCursorRow);let s="";for(let e=0;e<t;e++)s+=this._allRows[e],e+1<t&&(s+=this._allRowSeparators[e]);if(!e){const e=this._buffer.baseY+this._buffer.cursorY,t=this._buffer.cursorX,o=e=>{e>0?s+=`[${e}C`:e<0&&(s+=`[${-e}D`)};(e!==this._lastCursorRow||t!==this._lastCursorCol)&&((r=e-this._lastCursorRow)>0?s+=`[${r}B`:r<0&&(s+=`[${-r}A`),o(t-this._lastCursorCol))}var r;const o=this._terminal._core._inputHandler._curAttrData,i=this._diffStyle(o,this._cursorStyle);return i.length>0&&(s+=`[${i.join(";")}m`),s}}e.SerializeAddon=class{activate(e){this._terminal=e}_serializeBufferByScrollback(e,t,s){const r=t.length,i=void 0===s?r:o(s+e.rows,0,r);return this._serializeBufferByRange(e,t,{start:r-i,end:r-1},!1)}_serializeBufferByRange(e,t,s,r){return new c(t,e).serialize({start:{x:0,y:"number"==typeof s.start?s.start:s.start.line},end:{x:e.cols,y:"number"==typeof s.end?s.end:s.end.line}},r)}_serializeBufferAsHTML(e,t){const s=e.buffer.active,r=new h(s,e,t);if(!t.onlySelection){const i=s.length,n=t.scrollback,l=void 0===n?i:o(n+e.rows,0,i);return r.serialize({start:{x:0,y:i-l},end:{x:e.cols,y:i-1}})}const i=this._terminal?.getSelectionPosition();return void 0!==i?r.serialize({start:{x:i.start.x,y:i.start.y},end:{x:i.end.x,y:i.end.y}}):""}_serializeModes(e){let t="";const s=e.modes;if(s.applicationCursorKeysMode&&(t+="[?1h"),s.applicationKeypadMode&&(t+="[?66h"),s.bracketedPasteMode&&(t+="[?2004h"),s.insertMode&&(t+=""),s.originMode&&(t+="[?6h"),s.reverseWraparoundMode&&(t+="[?45h"),s.sendFocusMode&&(t+="[?1004h"),!1===s.wraparoundMode&&(t+="[?7l"),"none"!==s.mouseTrackingMode)switch(s.mouseTrackingMode){case"x10":t+="[?9h";break;case"vt200":t+="[?1000h";break;case"drag":t+="[?1002h";break;case"any":t+="[?1003h"}return t}serialize(e){if(!this._terminal)throw new Error("Cannot use addon until it has been loaded");let t=e?.range?this._serializeBufferByRange(this._terminal,this._terminal.buffer.normal,e.range,!0):this._serializeBufferByScrollback(this._terminal,this._terminal.buffer.normal,e?.scrollback);return e?.excludeAltBuffer||"alternate"!==this._terminal.buffer.active.type||(t+=`[?1049h${this._serializeBufferByScrollback(this._terminal,this._terminal.buffer.alternate,void 0)}`),e?.excludeModes||(t+=this._serializeModes(this._terminal)),t}serializeAsHTML(e){if(!this._terminal)throw new Error("Cannot use addon until it has been loaded");return this._serializeBufferAsHTML(this._terminal,e||{})}dispose(){}};class h extends i{constructor(e,s,r){super(e),this._terminal=s,this._options=r,this._currentRow="",this._htmlContent="",s._core._themeService?this._ansiColors=s._core._themeService.colors.ansi:this._ansiColors=t.DEFAULT_ANSI_COLORS}_padStart(e,t,s){return t>>=0,s=s??" ",e.length>t?e:((t-=e.length)>s.length&&(s+=s.repeat(t/s.length)),s.slice(0,t)+e)}_beforeSerialize(e,t,s){this._htmlContent+="<html><body>\x3c!--StartFragment--\x3e<pre>";let r="#000000",o="#ffffff";this._options.includeGlobalBackground&&(r=this._terminal.options.theme?.foreground??"#ffffff",o=this._terminal.options.theme?.background??"#000000");const i=[];i.push("color: "+r+";"),i.push("background-color: "+o+";"),i.push("font-family: "+this._terminal.options.fontFamily+";"),i.push("font-size: "+this._terminal.options.fontSize+"px;"),this._htmlContent+="<div style='"+i.join(" ")+"'>"}_afterSerialize(){this._htmlContent+="</div>",this._htmlContent+="</pre>\x3c!--EndFragment--\x3e</body></html>"}_rowEnd(e,t){this._htmlContent+="<div><span>"+this._currentRow+"</span></div>",this._currentRow=""}_getHexColor(e,t){const s=t?e.getFgColor():e.getBgColor();return(t?e.isFgRGB():e.isBgRGB())?"#"+[s>>16&255,s>>8&255,255&s].map((e=>this._padStart(e.toString(16),2,"0"))).join(""):(t?e.isFgPalette():e.isBgPalette())?this._ansiColors[s].css:void 0}_diffStyle(e,t){const s=[],r=!n(e,t),o=!l(e,t),i=!a(e,t);if(r||o||i){const t=this._getHexColor(e,!0);t&&s.push("color: "+t+";");const r=this._getHexColor(e,!1);return r&&s.push("background-color: "+r+";"),e.isInverse()&&s.push("color: #000000; background-color: #BFBFBF;"),e.isBold()&&s.push("font-weight: bold;"),e.isUnderline()&&e.isOverline()?s.push("text-decoration: overline underline;"):e.isUnderline()?s.push("text-decoration: underline;"):e.isOverline()&&s.push("text-decoration: overline;"),e.isBlink()&&s.push("text-decoration: blink;"),e.isInvisible()&&s.push("visibility: hidden;"),e.isItalic()&&s.push("font-style: italic;"),e.isDim()&&s.push("opacity: 0.5;"),e.isStrikethrough()&&s.push("text-decoration: line-through;"),s}}_nextCell(e,t,s,r){if(0===e.getWidth())return;const o=""===e.getChars(),i=this._diffStyle(e,t);i&&(this._currentRow+=0===i.length?"</span><span>":"</span><span style='"+i.join(" ")+"'>"),this._currentRow+=o?" ":e.getChars()}_serializeString(){return this._htmlContent}}e.HTMLSerializeHandler=h})(),r})()));
2
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,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LCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9TZXJpYWxpemVBZGRvbi93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJ3ZWJwYWNrOi8vU2VyaWFsaXplQWRkb24vc3JjL2Jyb3dzZXIvQ29sb3JDb250cmFzdENhY2hlLnRzIiwid2VicGFjazovL1NlcmlhbGl6ZUFkZG9uL3NyYy9icm93c2VyL3NlcnZpY2VzL1RoZW1lU2VydmljZS50cyIsIndlYnBhY2s6Ly9TZXJpYWxpemVBZGRvbi9zcmMvY29tbW9uL0NvbG9yLnRzIiwid2VicGFjazovL1NlcmlhbGl6ZUFkZG9uL3NyYy9jb21tb24vRXZlbnRFbWl0dGVyLnRzIiwid2VicGFjazovL1NlcmlhbGl6ZUFkZG9uL3NyYy9jb21tb24vTGlmZWN5Y2xlLnRzIiwid2VicGFjazovL1NlcmlhbGl6ZUFkZG9uL3NyYy9jb21tb24vTXVsdGlLZXlNYXAudHMiLCJ3ZWJwYWNrOi8vU2VyaWFsaXplQWRkb24vc3JjL2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnkudHMiLCJ3ZWJwYWNrOi8vU2VyaWFsaXplQWRkb24vc3JjL2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcy50cyIsIndlYnBhY2s6Ly9TZXJpYWxpemVBZGRvbi93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9TZXJpYWxpemVBZGRvbi9zcmMvU2VyaWFsaXplQWRkb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiU2VyaWFsaXplQWRkb25cIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiU2VyaWFsaXplQWRkb25cIl0gPSBmYWN0b3J5KCk7XG59KSh0aGlzLCAoKSA9PiB7XG5yZXR1cm4gIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJQ29sb3JDb250cmFzdENhY2hlIH0gZnJvbSAnYnJvd3Nlci9UeXBlcyc7XG5pbXBvcnQgeyBJQ29sb3IgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuaW1wb3J0IHsgVHdvS2V5TWFwIH0gZnJvbSAnY29tbW9uL011bHRpS2V5TWFwJztcblxuZXhwb3J0IGNsYXNzIENvbG9yQ29udHJhc3RDYWNoZSBpbXBsZW1lbnRzIElDb2xvckNvbnRyYXN0Q2FjaGUge1xuICBwcml2YXRlIF9jb2xvcjogVHdvS2V5TWFwPC8qIGJnICovbnVtYmVyLCAvKiBmZyAqL251bWJlciwgSUNvbG9yIHwgbnVsbD4gPSBuZXcgVHdvS2V5TWFwKCk7XG4gIHByaXZhdGUgX2NzczogVHdvS2V5TWFwPC8qIGJnICovbnVtYmVyLCAvKiBmZyAqL251bWJlciwgc3RyaW5nIHwgbnVsbD4gPSBuZXcgVHdvS2V5TWFwKCk7XG5cbiAgcHVibGljIHNldENzcyhiZzogbnVtYmVyLCBmZzogbnVtYmVyLCB2YWx1ZTogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuX2Nzcy5zZXQoYmcsIGZnLCB2YWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q3NzKGJnOiBudW1iZXIsIGZnOiBudW1iZXIpOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fY3NzLmdldChiZywgZmcpO1xuICB9XG5cbiAgcHVibGljIHNldENvbG9yKGJnOiBudW1iZXIsIGZnOiBudW1iZXIsIHZhbHVlOiBJQ29sb3IgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5fY29sb3Iuc2V0KGJnLCBmZywgdmFsdWUpO1xuICB9XG5cbiAgcHVibGljIGdldENvbG9yKGJnOiBudW1iZXIsIGZnOiBudW1iZXIpOiBJQ29sb3IgfCBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fY29sb3IuZ2V0KGJnLCBmZyk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5fY29sb3IuY2xlYXIoKTtcbiAgICB0aGlzLl9jc3MuY2xlYXIoKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjIgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBDb2xvckNvbnRyYXN0Q2FjaGUgfSBmcm9tICdicm93c2VyL0NvbG9yQ29udHJhc3RDYWNoZSc7XG5pbXBvcnQgeyBJVGhlbWVTZXJ2aWNlIH0gZnJvbSAnYnJvd3Nlci9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBJQ29sb3JDb250cmFzdENhY2hlLCBJQ29sb3JTZXQsIFJlYWRvbmx5Q29sb3JTZXQgfSBmcm9tICdicm93c2VyL1R5cGVzJztcbmltcG9ydCB7IGNoYW5uZWxzLCBjb2xvciwgY3NzLCBOVUxMX0NPTE9SIH0gZnJvbSAnY29tbW9uL0NvbG9yJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2NvbW1vbi9FdmVudEVtaXR0ZXInO1xuaW1wb3J0IHsgRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9MaWZlY3ljbGUnO1xuaW1wb3J0IHsgSU9wdGlvbnNTZXJ2aWNlLCBJVGhlbWUgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgQWxsQ29sb3JJbmRleCwgSUNvbG9yLCBTcGVjaWFsQ29sb3JJbmRleCB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5cbmludGVyZmFjZSBJUmVzdG9yZUNvbG9yU2V0IHtcbiAgZm9yZWdyb3VuZDogSUNvbG9yO1xuICBiYWNrZ3JvdW5kOiBJQ29sb3I7XG4gIGN1cnNvcjogSUNvbG9yO1xuICBhbnNpOiBJQ29sb3JbXTtcbn1cblxuXG5jb25zdCBERUZBVUxUX0ZPUkVHUk9VTkQgPSBjc3MudG9Db2xvcignI2ZmZmZmZicpO1xuY29uc3QgREVGQVVMVF9CQUNLR1JPVU5EID0gY3NzLnRvQ29sb3IoJyMwMDAwMDAnKTtcbmNvbnN0IERFRkFVTFRfQ1VSU09SID0gY3NzLnRvQ29sb3IoJyNmZmZmZmYnKTtcbmNvbnN0IERFRkFVTFRfQ1VSU09SX0FDQ0VOVCA9IGNzcy50b0NvbG9yKCcjMDAwMDAwJyk7XG5jb25zdCBERUZBVUxUX1NFTEVDVElPTiA9IHtcbiAgY3NzOiAncmdiYSgyNTUsIDI1NSwgMjU1LCAwLjMpJyxcbiAgcmdiYTogMHhGRkZGRkY0RFxufTtcblxuLy8gQW4gSUlGRSB0byBnZW5lcmF0ZSBERUZBVUxUX0FOU0lfQ09MT1JTLlxuZXhwb3J0IGNvbnN0IERFRkFVTFRfQU5TSV9DT0xPUlMgPSBPYmplY3QuZnJlZXplKCgoKSA9PiB7XG4gIGNvbnN0IGNvbG9ycyA9IFtcbiAgICAvLyBkYXJrOlxuICAgIGNzcy50b0NvbG9yKCcjMmUzNDM2JyksXG4gICAgY3NzLnRvQ29sb3IoJyNjYzAwMDAnKSxcbiAgICBjc3MudG9Db2xvcignIzRlOWEwNicpLFxuICAgIGNzcy50b0NvbG9yKCcjYzRhMDAwJyksXG4gICAgY3NzLnRvQ29sb3IoJyMzNDY1YTQnKSxcbiAgICBjc3MudG9Db2xvcignIzc1NTA3YicpLFxuICAgIGNzcy50b0NvbG9yKCcjMDY5ODlhJyksXG4gICAgY3NzLnRvQ29sb3IoJyNkM2Q3Y2YnKSxcbiAgICAvLyBicmlnaHQ6XG4gICAgY3NzLnRvQ29sb3IoJyM1NTU3NTMnKSxcbiAgICBjc3MudG9Db2xvcignI2VmMjkyOScpLFxuICAgIGNzcy50b0NvbG9yKCcjOGFlMjM0JyksXG4gICAgY3NzLnRvQ29sb3IoJyNmY2U5NGYnKSxcbiAgICBjc3MudG9Db2xvcignIzcyOWZjZicpLFxuICAgIGNzcy50b0NvbG9yKCcjYWQ3ZmE4JyksXG4gICAgY3NzLnRvQ29sb3IoJyMzNGUyZTInKSxcbiAgICBjc3MudG9Db2xvcignI2VlZWVlYycpXG4gIF07XG5cbiAgLy8gRmlsbCBpbiB0aGUgcmVtYWluaW5nIDI0MCBBTlNJIGNvbG9ycy5cbiAgLy8gR2VuZXJhdGUgY29sb3JzICgxNi0yMzEpXG4gIGNvbnN0IHYgPSBbMHgwMCwgMHg1ZiwgMHg4NywgMHhhZiwgMHhkNywgMHhmZl07XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgMjE2OyBpKyspIHtcbiAgICBjb25zdCByID0gdlsoaSAvIDM2KSAlIDYgfCAwXTtcbiAgICBjb25zdCBnID0gdlsoaSAvIDYpICUgNiB8IDBdO1xuICAgIGNvbnN0IGIgPSB2W2kgJSA2XTtcbiAgICBjb2xvcnMucHVzaCh7XG4gICAgICBjc3M6IGNoYW5uZWxzLnRvQ3NzKHIsIGcsIGIpLFxuICAgICAgcmdiYTogY2hhbm5lbHMudG9SZ2JhKHIsIGcsIGIpXG4gICAgfSk7XG4gIH1cblxuICAvLyBHZW5lcmF0ZSBncmV5cyAoMjMyLTI1NSlcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCAyNDsgaSsrKSB7XG4gICAgY29uc3QgYyA9IDggKyBpICogMTA7XG4gICAgY29sb3JzLnB1c2goe1xuICAgICAgY3NzOiBjaGFubmVscy50b0NzcyhjLCBjLCBjKSxcbiAgICAgIHJnYmE6IGNoYW5uZWxzLnRvUmdiYShjLCBjLCBjKVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGNvbG9ycztcbn0pKCkpO1xuXG5leHBvcnQgY2xhc3MgVGhlbWVTZXJ2aWNlIGV4dGVuZHMgRGlzcG9zYWJsZSBpbXBsZW1lbnRzIElUaGVtZVNlcnZpY2Uge1xuICBwdWJsaWMgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSBfY29sb3JzOiBJQ29sb3JTZXQ7XG4gIHByaXZhdGUgX2NvbnRyYXN0Q2FjaGU6IElDb2xvckNvbnRyYXN0Q2FjaGUgPSBuZXcgQ29sb3JDb250cmFzdENhY2hlKCk7XG4gIHByaXZhdGUgX2hhbGZDb250cmFzdENhY2hlOiBJQ29sb3JDb250cmFzdENhY2hlID0gbmV3IENvbG9yQ29udHJhc3RDYWNoZSgpO1xuICBwcml2YXRlIF9yZXN0b3JlQ29sb3JzITogSVJlc3RvcmVDb2xvclNldDtcblxuICBwdWJsaWMgZ2V0IGNvbG9ycygpOiBSZWFkb25seUNvbG9yU2V0IHsgcmV0dXJuIHRoaXMuX2NvbG9yczsgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgX29uQ2hhbmdlQ29sb3JzID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPFJlYWRvbmx5Q29sb3JTZXQ+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25DaGFuZ2VDb2xvcnMgPSB0aGlzLl9vbkNoYW5nZUNvbG9ycy5ldmVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASU9wdGlvbnNTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX29wdGlvbnNTZXJ2aWNlOiBJT3B0aW9uc1NlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuX2NvbG9ycyA9IHtcbiAgICAgIGZvcmVncm91bmQ6IERFRkFVTFRfRk9SRUdST1VORCxcbiAgICAgIGJhY2tncm91bmQ6IERFRkFVTFRfQkFDS0dST1VORCxcbiAgICAgIGN1cnNvcjogREVGQVVMVF9DVVJTT1IsXG4gICAgICBjdXJzb3JBY2NlbnQ6IERFRkFVTFRfQ1VSU09SX0FDQ0VOVCxcbiAgICAgIHNlbGVjdGlvbkZvcmVncm91bmQ6IHVuZGVmaW5lZCxcbiAgICAgIHNlbGVjdGlvbkJhY2tncm91bmRUcmFuc3BhcmVudDogREVGQVVMVF9TRUxFQ1RJT04sXG4gICAgICBzZWxlY3Rpb25CYWNrZ3JvdW5kT3BhcXVlOiBjb2xvci5ibGVuZChERUZBVUxUX0JBQ0tHUk9VTkQsIERFRkFVTFRfU0VMRUNUSU9OKSxcbiAgICAgIHNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZFRyYW5zcGFyZW50OiBERUZBVUxUX1NFTEVDVElPTixcbiAgICAgIHNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZE9wYXF1ZTogY29sb3IuYmxlbmQoREVGQVVMVF9CQUNLR1JPVU5ELCBERUZBVUxUX1NFTEVDVElPTiksXG4gICAgICBhbnNpOiBERUZBVUxUX0FOU0lfQ09MT1JTLnNsaWNlKCksXG4gICAgICBjb250cmFzdENhY2hlOiB0aGlzLl9jb250cmFzdENhY2hlLFxuICAgICAgaGFsZkNvbnRyYXN0Q2FjaGU6IHRoaXMuX2hhbGZDb250cmFzdENhY2hlXG4gICAgfTtcbiAgICB0aGlzLl91cGRhdGVSZXN0b3JlQ29sb3JzKCk7XG4gICAgdGhpcy5fc2V0VGhlbWUodGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy50aGVtZSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9uU3BlY2lmaWNPcHRpb25DaGFuZ2UoJ21pbmltdW1Db250cmFzdFJhdGlvJywgKCkgPT4gdGhpcy5fY29udHJhc3RDYWNoZS5jbGVhcigpKSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9vcHRpb25zU2VydmljZS5vblNwZWNpZmljT3B0aW9uQ2hhbmdlKCd0aGVtZScsICgpID0+IHRoaXMuX3NldFRoZW1lKHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMudGhlbWUpKSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgdGVybWluYWwncyB0aGVtZS5cbiAgICogQHBhcmFtIHRoZW1lIFRoZSAgdGhlbWUgdG8gdXNlLiBJZiBhIHBhcnRpYWwgdGhlbWUgaXMgcHJvdmlkZWQgdGhlbiBkZWZhdWx0XG4gICAqIGNvbG9ycyB3aWxsIGJlIHVzZWQgd2hlcmUgY29sb3JzIGFyZSBub3QgZGVmaW5lZC5cbiAgICovXG4gIHByaXZhdGUgX3NldFRoZW1lKHRoZW1lOiBJVGhlbWUgPSB7fSk6IHZvaWQge1xuICAgIGNvbnN0IGNvbG9ycyA9IHRoaXMuX2NvbG9ycztcbiAgICBjb2xvcnMuZm9yZWdyb3VuZCA9IHBhcnNlQ29sb3IodGhlbWUuZm9yZWdyb3VuZCwgREVGQVVMVF9GT1JFR1JPVU5EKTtcbiAgICBjb2xvcnMuYmFja2dyb3VuZCA9IHBhcnNlQ29sb3IodGhlbWUuYmFja2dyb3VuZCwgREVGQVVMVF9CQUNLR1JPVU5EKTtcbiAgICBjb2xvcnMuY3Vyc29yID0gcGFyc2VDb2xvcih0aGVtZS5jdXJzb3IsIERFRkFVTFRfQ1VSU09SKTtcbiAgICBjb2xvcnMuY3Vyc29yQWNjZW50ID0gcGFyc2VDb2xvcih0aGVtZS5jdXJzb3JBY2NlbnQsIERFRkFVTFRfQ1VSU09SX0FDQ0VOVCk7XG4gICAgY29sb3JzLnNlbGVjdGlvbkJhY2tncm91bmRUcmFuc3BhcmVudCA9IHBhcnNlQ29sb3IodGhlbWUuc2VsZWN0aW9uQmFja2dyb3VuZCwgREVGQVVMVF9TRUxFQ1RJT04pO1xuICAgIGNvbG9ycy5zZWxlY3Rpb25CYWNrZ3JvdW5kT3BhcXVlID0gY29sb3IuYmxlbmQoY29sb3JzLmJhY2tncm91bmQsIGNvbG9ycy5zZWxlY3Rpb25CYWNrZ3JvdW5kVHJhbnNwYXJlbnQpO1xuICAgIGNvbG9ycy5zZWxlY3Rpb25JbmFjdGl2ZUJhY2tncm91bmRUcmFuc3BhcmVudCA9IHBhcnNlQ29sb3IodGhlbWUuc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kLCBjb2xvcnMuc2VsZWN0aW9uQmFja2dyb3VuZFRyYW5zcGFyZW50KTtcbiAgICBjb2xvcnMuc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kT3BhcXVlID0gY29sb3IuYmxlbmQoY29sb3JzLmJhY2tncm91bmQsIGNvbG9ycy5zZWxlY3Rpb25JbmFjdGl2ZUJhY2tncm91bmRUcmFuc3BhcmVudCk7XG4gICAgY29sb3JzLnNlbGVjdGlvbkZvcmVncm91bmQgPSB0aGVtZS5zZWxlY3Rpb25Gb3JlZ3JvdW5kID8gcGFyc2VDb2xvcih0aGVtZS5zZWxlY3Rpb25Gb3JlZ3JvdW5kLCBOVUxMX0NPTE9SKSA6IHVuZGVmaW5lZDtcbiAgICBpZiAoY29sb3JzLnNlbGVjdGlvbkZvcmVncm91bmQgPT09IE5VTExfQ09MT1IpIHtcbiAgICAgIGNvbG9ycy5zZWxlY3Rpb25Gb3JlZ3JvdW5kID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIHNlbGVjdGlvbiBjb2xvciBpcyBvcGFxdWUsIGJsZW5kIGl0IHdpdGggYmFja2dyb3VuZCB3aXRoIDAuMyBvcGFjaXR5XG4gICAgICogSXNzdWUgIzI3MzdcbiAgICAgKi9cbiAgICBpZiAoY29sb3IuaXNPcGFxdWUoY29sb3JzLnNlbGVjdGlvbkJhY2tncm91bmRUcmFuc3BhcmVudCkpIHtcbiAgICAgIGNvbnN0IG9wYWNpdHkgPSAwLjM7XG4gICAgICBjb2xvcnMuc2VsZWN0aW9uQmFja2dyb3VuZFRyYW5zcGFyZW50ID0gY29sb3Iub3BhY2l0eShjb2xvcnMuc2VsZWN0aW9uQmFja2dyb3VuZFRyYW5zcGFyZW50LCBvcGFjaXR5KTtcbiAgICB9XG4gICAgaWYgKGNvbG9yLmlzT3BhcXVlKGNvbG9ycy5zZWxlY3Rpb25JbmFjdGl2ZUJhY2tncm91bmRUcmFuc3BhcmVudCkpIHtcbiAgICAgIGNvbnN0IG9wYWNpdHkgPSAwLjM7XG4gICAgICBjb2xvcnMuc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kVHJhbnNwYXJlbnQgPSBjb2xvci5vcGFjaXR5KGNvbG9ycy5zZWxlY3Rpb25JbmFjdGl2ZUJhY2tncm91bmRUcmFuc3BhcmVudCwgb3BhY2l0eSk7XG4gICAgfVxuICAgIGNvbG9ycy5hbnNpID0gREVGQVVMVF9BTlNJX0NPTE9SUy5zbGljZSgpO1xuICAgIGNvbG9ycy5hbnNpWzBdID0gcGFyc2VDb2xvcih0aGVtZS5ibGFjaywgREVGQVVMVF9BTlNJX0NPTE9SU1swXSk7XG4gICAgY29sb3JzLmFuc2lbMV0gPSBwYXJzZUNvbG9yKHRoZW1lLnJlZCwgREVGQVVMVF9BTlNJX0NPTE9SU1sxXSk7XG4gICAgY29sb3JzLmFuc2lbMl0gPSBwYXJzZUNvbG9yKHRoZW1lLmdyZWVuLCBERUZBVUxUX0FOU0lfQ09MT1JTWzJdKTtcbiAgICBjb2xvcnMuYW5zaVszXSA9IHBhcnNlQ29sb3IodGhlbWUueWVsbG93LCBERUZBVUxUX0FOU0lfQ09MT1JTWzNdKTtcbiAgICBjb2xvcnMuYW5zaVs0XSA9IHBhcnNlQ29sb3IodGhlbWUuYmx1ZSwgREVGQVVMVF9BTlNJX0NPTE9SU1s0XSk7XG4gICAgY29sb3JzLmFuc2lbNV0gPSBwYXJzZUNvbG9yKHRoZW1lLm1hZ2VudGEsIERFRkFVTFRfQU5TSV9DT0xPUlNbNV0pO1xuICAgIGNvbG9ycy5hbnNpWzZdID0gcGFyc2VDb2xvcih0aGVtZS5jeWFuLCBERUZBVUxUX0FOU0lfQ09MT1JTWzZdKTtcbiAgICBjb2xvcnMuYW5zaVs3XSA9IHBhcnNlQ29sb3IodGhlbWUud2hpdGUsIERFRkFVTFRfQU5TSV9DT0xPUlNbN10pO1xuICAgIGNvbG9ycy5hbnNpWzhdID0gcGFyc2VDb2xvcih0aGVtZS5icmlnaHRCbGFjaywgREVGQVVMVF9BTlNJX0NPTE9SU1s4XSk7XG4gICAgY29sb3JzLmFuc2lbOV0gPSBwYXJzZUNvbG9yKHRoZW1lLmJyaWdodFJlZCwgREVGQVVMVF9BTlNJX0NPTE9SU1s5XSk7XG4gICAgY29sb3JzLmFuc2lbMTBdID0gcGFyc2VDb2xvcih0aGVtZS5icmlnaHRHcmVlbiwgREVGQVVMVF9BTlNJX0NPTE9SU1sxMF0pO1xuICAgIGNvbG9ycy5hbnNpWzExXSA9IHBhcnNlQ29sb3IodGhlbWUuYnJpZ2h0WWVsbG93LCBERUZBVUxUX0FOU0lfQ09MT1JTWzExXSk7XG4gICAgY29sb3JzLmFuc2lbMTJdID0gcGFyc2VDb2xvcih0aGVtZS5icmlnaHRCbHVlLCBERUZBVUxUX0FOU0lfQ09MT1JTWzEyXSk7XG4gICAgY29sb3JzLmFuc2lbMTNdID0gcGFyc2VDb2xvcih0aGVtZS5icmlnaHRNYWdlbnRhLCBERUZBVUxUX0FOU0lfQ09MT1JTWzEzXSk7XG4gICAgY29sb3JzLmFuc2lbMTRdID0gcGFyc2VDb2xvcih0aGVtZS5icmlnaHRDeWFuLCBERUZBVUxUX0FOU0lfQ09MT1JTWzE0XSk7XG4gICAgY29sb3JzLmFuc2lbMTVdID0gcGFyc2VDb2xvcih0aGVtZS5icmlnaHRXaGl0ZSwgREVGQVVMVF9BTlNJX0NPTE9SU1sxNV0pO1xuICAgIGlmICh0aGVtZS5leHRlbmRlZEFuc2kpIHtcbiAgICAgIGNvbnN0IGNvbG9yQ291bnQgPSBNYXRoLm1pbihjb2xvcnMuYW5zaS5sZW5ndGggLSAxNiwgdGhlbWUuZXh0ZW5kZWRBbnNpLmxlbmd0aCk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbG9yQ291bnQ7IGkrKykge1xuICAgICAgICBjb2xvcnMuYW5zaVtpICsgMTZdID0gcGFyc2VDb2xvcih0aGVtZS5leHRlbmRlZEFuc2lbaV0sIERFRkFVTFRfQU5TSV9DT0xPUlNbaSArIDE2XSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIENsZWFyIG91ciB0aGUgY2FjaGVcbiAgICB0aGlzLl9jb250cmFzdENhY2hlLmNsZWFyKCk7XG4gICAgdGhpcy5faGFsZkNvbnRyYXN0Q2FjaGUuY2xlYXIoKTtcbiAgICB0aGlzLl91cGRhdGVSZXN0b3JlQ29sb3JzKCk7XG4gICAgdGhpcy5fb25DaGFuZ2VDb2xvcnMuZmlyZSh0aGlzLmNvbG9ycyk7XG4gIH1cblxuICBwdWJsaWMgcmVzdG9yZUNvbG9yKHNsb3Q/OiBBbGxDb2xvckluZGV4KTogdm9pZCB7XG4gICAgdGhpcy5fcmVzdG9yZUNvbG9yKHNsb3QpO1xuICAgIHRoaXMuX29uQ2hhbmdlQ29sb3JzLmZpcmUodGhpcy5jb2xvcnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVzdG9yZUNvbG9yKHNsb3Q6IEFsbENvbG9ySW5kZXggfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICAvLyB1bnNldCBzbG90IHJlc3RvcmVzIGFsbCBhbnNpIGNvbG9yc1xuICAgIGlmIChzbG90ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fcmVzdG9yZUNvbG9ycy5hbnNpLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHRoaXMuX2NvbG9ycy5hbnNpW2ldID0gdGhpcy5fcmVzdG9yZUNvbG9ycy5hbnNpW2ldO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzd2l0Y2ggKHNsb3QpIHtcbiAgICAgIGNhc2UgU3BlY2lhbENvbG9ySW5kZXguRk9SRUdST1VORDpcbiAgICAgICAgdGhpcy5fY29sb3JzLmZvcmVncm91bmQgPSB0aGlzLl9yZXN0b3JlQ29sb3JzLmZvcmVncm91bmQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTcGVjaWFsQ29sb3JJbmRleC5CQUNLR1JPVU5EOlxuICAgICAgICB0aGlzLl9jb2xvcnMuYmFja2dyb3VuZCA9IHRoaXMuX3Jlc3RvcmVDb2xvcnMuYmFja2dyb3VuZDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFNwZWNpYWxDb2xvckluZGV4LkNVUlNPUjpcbiAgICAgICAgdGhpcy5fY29sb3JzLmN1cnNvciA9IHRoaXMuX3Jlc3RvcmVDb2xvcnMuY3Vyc29yO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMuX2NvbG9ycy5hbnNpW3Nsb3RdID0gdGhpcy5fcmVzdG9yZUNvbG9ycy5hbnNpW3Nsb3RdO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBtb2RpZnlDb2xvcnMoY2FsbGJhY2s6IChjb2xvcnM6IElDb2xvclNldCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIGNhbGxiYWNrKHRoaXMuX2NvbG9ycyk7XG4gICAgLy8gQXNzdW1lIHRoZSBjaGFuZ2UgaGFwcGVuZWRcbiAgICB0aGlzLl9vbkNoYW5nZUNvbG9ycy5maXJlKHRoaXMuY29sb3JzKTtcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZVJlc3RvcmVDb2xvcnMoKTogdm9pZCB7XG4gICAgdGhpcy5fcmVzdG9yZUNvbG9ycyA9IHtcbiAgICAgIGZvcmVncm91bmQ6IHRoaXMuX2NvbG9ycy5mb3JlZ3JvdW5kLFxuICAgICAgYmFja2dyb3VuZDogdGhpcy5fY29sb3JzLmJhY2tncm91bmQsXG4gICAgICBjdXJzb3I6IHRoaXMuX2NvbG9ycy5jdXJzb3IsXG4gICAgICBhbnNpOiB0aGlzLl9jb2xvcnMuYW5zaS5zbGljZSgpXG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZUNvbG9yKFxuICBjc3NTdHJpbmc6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgZmFsbGJhY2s6IElDb2xvclxuKTogSUNvbG9yIHtcbiAgaWYgKGNzc1N0cmluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBjc3MudG9Db2xvcihjc3NTdHJpbmcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gbm8tb3BcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbGxiYWNrO1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJQ29sb3IsIElDb2xvclJHQiB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5cbmxldCAkciA9IDA7XG5sZXQgJGcgPSAwO1xubGV0ICRiID0gMDtcbmxldCAkYSA9IDA7XG5cbmV4cG9ydCBjb25zdCBOVUxMX0NPTE9SOiBJQ29sb3IgPSB7XG4gIGNzczogJyMwMDAwMDAwMCcsXG4gIHJnYmE6IDBcbn07XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9ucyB3aGVyZSB0aGUgc291cmNlIHR5cGUgaXMgXCJjaGFubmVsc1wiIChpbmRpdmlkdWFsIGNvbG9yIGNoYW5uZWxzIGFzIG51bWJlcnMpLlxuICovXG5leHBvcnQgbmFtZXNwYWNlIGNoYW5uZWxzIHtcbiAgZXhwb3J0IGZ1bmN0aW9uIHRvQ3NzKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIsIGE/OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmIChhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBgIyR7dG9QYWRkZWRIZXgocil9JHt0b1BhZGRlZEhleChnKX0ke3RvUGFkZGVkSGV4KGIpfSR7dG9QYWRkZWRIZXgoYSl9YDtcbiAgICB9XG4gICAgcmV0dXJuIGAjJHt0b1BhZGRlZEhleChyKX0ke3RvUGFkZGVkSGV4KGcpfSR7dG9QYWRkZWRIZXgoYil9YDtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiB0b1JnYmEocjogbnVtYmVyLCBnOiBudW1iZXIsIGI6IG51bWJlciwgYTogbnVtYmVyID0gMHhGRik6IG51bWJlciB7XG4gICAgLy8gTm90ZTogVGhlIGFnZ3JlZ2F0ZWQgbnVtYmVyIGlzIFJHQkEzMiAoQkUpLCB0aHVzIG5lZWRzIHRvIGJlIGNvbnZlcnRlZCB0byBBQkdSMzJcbiAgICAvLyBvbiBMRSBzeXN0ZW1zLCBiZWZvcmUgaXQgY2FuIGJlIHVzZWQgZm9yIGRpcmVjdCAzMi1iaXQgYnVmZmVyIHdyaXRlcy5cbiAgICAvLyA+Pj4gMCBmb3JjZXMgYW4gdW5zaWduZWQgaW50XG4gICAgcmV0dXJuIChyIDw8IDI0IHwgZyA8PCAxNiB8IGIgPDwgOCB8IGEpID4+PiAwO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIHRvQ29sb3IocjogbnVtYmVyLCBnOiBudW1iZXIsIGI6IG51bWJlciwgYT86IG51bWJlcik6IElDb2xvciB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNzczogY2hhbm5lbHMudG9Dc3MociwgZywgYiwgYSksXG4gICAgICByZ2JhOiBjaGFubmVscy50b1JnYmEociwgZywgYiwgYSlcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9ucyB3aGVyZSB0aGUgc291cmNlIHR5cGUgaXMgYElDb2xvcmAuXG4gKi9cbmV4cG9ydCBuYW1lc3BhY2UgY29sb3Ige1xuICBleHBvcnQgZnVuY3Rpb24gYmxlbmQoYmc6IElDb2xvciwgZmc6IElDb2xvcik6IElDb2xvciB7XG4gICAgJGEgPSAoZmcucmdiYSAmIDB4RkYpIC8gMjU1O1xuICAgIGlmICgkYSA9PT0gMSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY3NzOiBmZy5jc3MsXG4gICAgICAgIHJnYmE6IGZnLnJnYmFcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IGZnUiA9IChmZy5yZ2JhID4+IDI0KSAmIDB4RkY7XG4gICAgY29uc3QgZmdHID0gKGZnLnJnYmEgPj4gMTYpICYgMHhGRjtcbiAgICBjb25zdCBmZ0IgPSAoZmcucmdiYSA+PiA4KSAmIDB4RkY7XG4gICAgY29uc3QgYmdSID0gKGJnLnJnYmEgPj4gMjQpICYgMHhGRjtcbiAgICBjb25zdCBiZ0cgPSAoYmcucmdiYSA+PiAxNikgJiAweEZGO1xuICAgIGNvbnN0IGJnQiA9IChiZy5yZ2JhID4+IDgpICYgMHhGRjtcbiAgICAkciA9IGJnUiArIE1hdGgucm91bmQoKGZnUiAtIGJnUikgKiAkYSk7XG4gICAgJGcgPSBiZ0cgKyBNYXRoLnJvdW5kKChmZ0cgLSBiZ0cpICogJGEpO1xuICAgICRiID0gYmdCICsgTWF0aC5yb3VuZCgoZmdCIC0gYmdCKSAqICRhKTtcbiAgICBjb25zdCBjc3MgPSBjaGFubmVscy50b0NzcygkciwgJGcsICRiKTtcbiAgICBjb25zdCByZ2JhID0gY2hhbm5lbHMudG9SZ2JhKCRyLCAkZywgJGIpO1xuICAgIHJldHVybiB7IGNzcywgcmdiYSB9O1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGlzT3BhcXVlKGNvbG9yOiBJQ29sb3IpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKGNvbG9yLnJnYmEgJiAweEZGKSA9PT0gMHhGRjtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBlbnN1cmVDb250cmFzdFJhdGlvKGJnOiBJQ29sb3IsIGZnOiBJQ29sb3IsIHJhdGlvOiBudW1iZXIpOiBJQ29sb3IgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlc3VsdCA9IHJnYmEuZW5zdXJlQ29udHJhc3RSYXRpbyhiZy5yZ2JhLCBmZy5yZ2JhLCByYXRpbyk7XG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBjaGFubmVscy50b0NvbG9yKFxuICAgICAgKHJlc3VsdCA+PiAyNCAmIDB4RkYpLFxuICAgICAgKHJlc3VsdCA+PiAxNiAmIDB4RkYpLFxuICAgICAgKHJlc3VsdCA+PiA4ICAmIDB4RkYpXG4gICAgKTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBvcGFxdWUoY29sb3I6IElDb2xvcik6IElDb2xvciB7XG4gICAgY29uc3QgcmdiYUNvbG9yID0gKGNvbG9yLnJnYmEgfCAweEZGKSA+Pj4gMDtcbiAgICBbJHIsICRnLCAkYl0gPSByZ2JhLnRvQ2hhbm5lbHMocmdiYUNvbG9yKTtcbiAgICByZXR1cm4ge1xuICAgICAgY3NzOiBjaGFubmVscy50b0NzcygkciwgJGcsICRiKSxcbiAgICAgIHJnYmE6IHJnYmFDb2xvclxuICAgIH07XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gb3BhY2l0eShjb2xvcjogSUNvbG9yLCBvcGFjaXR5OiBudW1iZXIpOiBJQ29sb3Ige1xuICAgICRhID0gTWF0aC5yb3VuZChvcGFjaXR5ICogMHhGRik7XG4gICAgWyRyLCAkZywgJGJdID0gcmdiYS50b0NoYW5uZWxzKGNvbG9yLnJnYmEpO1xuICAgIHJldHVybiB7XG4gICAgICBjc3M6IGNoYW5uZWxzLnRvQ3NzKCRyLCAkZywgJGIsICRhKSxcbiAgICAgIHJnYmE6IGNoYW5uZWxzLnRvUmdiYSgkciwgJGcsICRiLCAkYSlcbiAgICB9O1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5T3BhY2l0eShjb2xvcjogSUNvbG9yLCBmYWN0b3I6IG51bWJlcik6IElDb2xvciB7XG4gICAgJGEgPSBjb2xvci5yZ2JhICYgMHhGRjtcbiAgICByZXR1cm4gb3BhY2l0eShjb2xvciwgKCRhICogZmFjdG9yKSAvIDB4RkYpO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIHRvQ29sb3JSR0IoY29sb3I6IElDb2xvcik6IElDb2xvclJHQiB7XG4gICAgcmV0dXJuIFsoY29sb3IucmdiYSA+PiAyNCkgJiAweEZGLCAoY29sb3IucmdiYSA+PiAxNikgJiAweEZGLCAoY29sb3IucmdiYSA+PiA4KSAmIDB4RkZdO1xuICB9XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9ucyB3aGVyZSB0aGUgc291cmNlIHR5cGUgaXMgXCJjc3NcIiAoc3RyaW5nOiAnI3JnYicsICcjcmdiYScsICcjcnJnZ2JiJyxcbiAqICcjcnJnZ2JiYWEnKS5cbiAqL1xuZXhwb3J0IG5hbWVzcGFjZSBjc3Mge1xuICAvLyBBdHRlbXB0IHRvIHNldCBnZXQgdGhlIHNoYXJlZCBjYW52YXMgY29udGV4dFxuICBsZXQgJGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIHwgdW5kZWZpbmVkO1xuICBsZXQgJGxpdG11c0NvbG9yOiBDYW52YXNHcmFkaWVudCB8IHVuZGVmaW5lZDtcbiAgdHJ5IHtcbiAgICAvLyBUaGlzIGlzIGd1YXJhbnRlZWQgdG8gcnVuIGluIHRoZSBmaXJzdCB3aW5kb3csIHNvIGRvY3VtZW50IHNob3VsZCBiZSBjb3JyZWN0XG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgY2FudmFzLndpZHRoID0gMTtcbiAgICBjYW52YXMuaGVpZ2h0ID0gMTtcbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnLCB7XG4gICAgICB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWVcbiAgICB9KTtcbiAgICBpZiAoY3R4KSB7XG4gICAgICAkY3R4ID0gY3R4O1xuICAgICAgJGN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAnY29weSc7XG4gICAgICAkbGl0bXVzQ29sb3IgPSAkY3R4LmNyZWF0ZUxpbmVhckdyYWRpZW50KDAsIDAsIDEsIDEpO1xuICAgIH1cbiAgfVxuICBjYXRjaCB7XG4gICAgLy8gbm9vcFxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgY3NzIHN0cmluZyB0byBhbiBJQ29sb3IsIHRoaXMgc2hvdWxkIGhhbmRsZSBhbGwgdmFsaWQgQ1NTIGNvbG9yIHN0cmluZ3MgYW5kIHdpbGxcbiAgICogdGhyb3cgaWYgaXQncyBpbnZhbGlkLiBUaGUgaWRlYWwgZm9ybWF0IHRvIHVzZSBpcyBgI3JyZ2diYlthYV1gIGFzIGl0J3MgdGhlIGZhc3Rlc3QgdG8gcGFyc2UuXG4gICAqXG4gICAqIE9ubHkgYCNyZ2JbYV1gLCBgI3JyZ2diYlthYV1gLCBgcmdiKClgIGFuZCBgcmdiYSgpYCBmb3JtYXRzIGFyZSBzdXBwb3J0ZWQgd2hlbiBydW4gaW4gYSBOb2RlXG4gICAqIGVudmlyb25tZW50LlxuICAgKi9cbiAgZXhwb3J0IGZ1bmN0aW9uIHRvQ29sb3IoY3NzOiBzdHJpbmcpOiBJQ29sb3Ige1xuICAgIC8vIEZvcm1hdHM6ICNyZ2JbYV0gYW5kICNycmdnYmJbYWFdXG4gICAgaWYgKGNzcy5tYXRjaCgvI1tcXGRhLWZdezMsOH0vaSkpIHtcbiAgICAgIHN3aXRjaCAoY3NzLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDQ6IHsgLy8gI3JnYlxuICAgICAgICAgICRyID0gcGFyc2VJbnQoY3NzLnNsaWNlKDEsIDIpLnJlcGVhdCgyKSwgMTYpO1xuICAgICAgICAgICRnID0gcGFyc2VJbnQoY3NzLnNsaWNlKDIsIDMpLnJlcGVhdCgyKSwgMTYpO1xuICAgICAgICAgICRiID0gcGFyc2VJbnQoY3NzLnNsaWNlKDMsIDQpLnJlcGVhdCgyKSwgMTYpO1xuICAgICAgICAgIHJldHVybiBjaGFubmVscy50b0NvbG9yKCRyLCAkZywgJGIpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgNTogeyAvLyAjcmdiYVxuICAgICAgICAgICRyID0gcGFyc2VJbnQoY3NzLnNsaWNlKDEsIDIpLnJlcGVhdCgyKSwgMTYpO1xuICAgICAgICAgICRnID0gcGFyc2VJbnQoY3NzLnNsaWNlKDIsIDMpLnJlcGVhdCgyKSwgMTYpO1xuICAgICAgICAgICRiID0gcGFyc2VJbnQoY3NzLnNsaWNlKDMsIDQpLnJlcGVhdCgyKSwgMTYpO1xuICAgICAgICAgICRhID0gcGFyc2VJbnQoY3NzLnNsaWNlKDQsIDUpLnJlcGVhdCgyKSwgMTYpO1xuICAgICAgICAgIHJldHVybiBjaGFubmVscy50b0NvbG9yKCRyLCAkZywgJGIsICRhKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIDc6IC8vICNycmdnYmJcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY3NzLFxuICAgICAgICAgICAgcmdiYTogKHBhcnNlSW50KGNzcy5zbGljZSgxKSwgMTYpIDw8IDggfCAweEZGKSA+Pj4gMFxuICAgICAgICAgIH07XG4gICAgICAgIGNhc2UgOTogLy8gI3JyZ2diYmFhXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNzcyxcbiAgICAgICAgICAgIHJnYmE6IHBhcnNlSW50KGNzcy5zbGljZSgxKSwgMTYpID4+PiAwXG4gICAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGb3JtYXRzOiByZ2IoKSBvciByZ2JhKClcbiAgICBjb25zdCByZ2JhTWF0Y2ggPSBjc3MubWF0Y2goL3JnYmE/XFwoXFxzKihcXGR7MSwzfSlcXHMqLFxccyooXFxkezEsM30pXFxzKixcXHMqKFxcZHsxLDN9KVxccyooLFxccyooMHwxfFxcZD9cXC4oXFxkKykpXFxzKik/XFwpLyk7XG4gICAgaWYgKHJnYmFNYXRjaCkge1xuICAgICAgJHIgPSBwYXJzZUludChyZ2JhTWF0Y2hbMV0pO1xuICAgICAgJGcgPSBwYXJzZUludChyZ2JhTWF0Y2hbMl0pO1xuICAgICAgJGIgPSBwYXJzZUludChyZ2JhTWF0Y2hbM10pO1xuICAgICAgJGEgPSBNYXRoLnJvdW5kKChyZ2JhTWF0Y2hbNV0gPT09IHVuZGVmaW5lZCA/IDEgOiBwYXJzZUZsb2F0KHJnYmFNYXRjaFs1XSkpICogMHhGRik7XG4gICAgICByZXR1cm4gY2hhbm5lbHMudG9Db2xvcigkciwgJGcsICRiLCAkYSk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgdGhlIGNvbnRleHQgaXMgYXZhaWxhYmxlIGZvciBjYW52YXMtYmFzZWQgY29sb3IgcGFyc2luZ1xuICAgIGlmICghJGN0eCB8fCAhJGxpdG11c0NvbG9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nzcy50b0NvbG9yOiBVbnN1cHBvcnRlZCBjc3MgZm9ybWF0Jyk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgdGhlIGNvbG9yIHVzaW5nIGNhbnZhcyBmaWxsU3R5bGVcbiAgICAvLyBTZWUgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvY2FudmFzLmh0bWwjZmlsbC1hbmQtc3Ryb2tlLXN0eWxlc1xuICAgICRjdHguZmlsbFN0eWxlID0gJGxpdG11c0NvbG9yO1xuICAgICRjdHguZmlsbFN0eWxlID0gY3NzO1xuICAgIGlmICh0eXBlb2YgJGN0eC5maWxsU3R5bGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nzcy50b0NvbG9yOiBVbnN1cHBvcnRlZCBjc3MgZm9ybWF0Jyk7XG4gICAgfVxuXG4gICAgJGN0eC5maWxsUmVjdCgwLCAwLCAxLCAxKTtcbiAgICBbJHIsICRnLCAkYiwgJGFdID0gJGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgMSwgMSkuZGF0YTtcblxuICAgIC8vIFZhbGlkYXRlIHRoZSBjb2xvciBpcyBub24tdHJhbnNwYXJlbnQgYXMgY29sb3IgaHVlIGdldHMgbG9zdCB3aGVuIGRyYXduIHRvIHRoZSBjYW52YXNcbiAgICBpZiAoJGEgIT09IDB4RkYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY3NzLnRvQ29sb3I6IFVuc3VwcG9ydGVkIGNzcyBmb3JtYXQnKTtcbiAgICB9XG5cbiAgICAvLyBFeHRyYWN0IHRoZSBjb2xvciBmcm9tIHRoZSBjYW52YXMnIGZpbGxTdHlsZSBwcm9wZXJ0eSB3aGljaCBleHBvc2VzIHRoZSBjb2xvciB2YWx1ZSBpbiByZ2JhKClcbiAgICAvLyBmb3JtYXRcbiAgICAvLyBTZWUgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvY2FudmFzLmh0bWwjc2VyaWFsaXNhdGlvbi1vZi1hLWNvbG9yXG4gICAgcmV0dXJuIHtcbiAgICAgIHJnYmE6IGNoYW5uZWxzLnRvUmdiYSgkciwgJGcsICRiLCAkYSksXG4gICAgICBjc3NcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9ucyB3aGVyZSB0aGUgc291cmNlIHR5cGUgaXMgXCJyZ2JcIiAobnVtYmVyOiAweHJyZ2diYikuXG4gKi9cbmV4cG9ydCBuYW1lc3BhY2UgcmdiIHtcbiAgLyoqXG4gICAqIEdldHMgdGhlIHJlbGF0aXZlIGx1bWluYW5jZSBvZiBhbiBSR0IgY29sb3IsIHRoaXMgaXMgdXNlZnVsIGluIGRldGVybWluaW5nIHRoZSBjb250cmFzdCByYXRpb1xuICAgKiBiZXR3ZWVuIHR3byBjb2xvcnMuXG4gICAqIEBwYXJhbSByZ2IgVGhlIGNvbG9yIHRvIHVzZS5cbiAgICogQHNlZSBodHRwczovL3d3dy53My5vcmcvVFIvV0NBRzIwLyNyZWxhdGl2ZWx1bWluYW5jZWRlZlxuICAgKi9cbiAgZXhwb3J0IGZ1bmN0aW9uIHJlbGF0aXZlTHVtaW5hbmNlKHJnYjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gcmVsYXRpdmVMdW1pbmFuY2UyKFxuICAgICAgKHJnYiA+PiAxNikgJiAweEZGLFxuICAgICAgKHJnYiA+PiA4ICkgJiAweEZGLFxuICAgICAgKHJnYiAgICAgICkgJiAweEZGKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSByZWxhdGl2ZSBsdW1pbmFuY2Ugb2YgYW4gUkdCIGNvbG9yLCB0aGlzIGlzIHVzZWZ1bCBpbiBkZXRlcm1pbmluZyB0aGUgY29udHJhc3QgcmF0aW9cbiAgICogYmV0d2VlbiB0d28gY29sb3JzLlxuICAgKiBAcGFyYW0gciBUaGUgcmVkIGNoYW5uZWwgKDB4MDAgdG8gMHhGRikuXG4gICAqIEBwYXJhbSBnIFRoZSBncmVlbiBjaGFubmVsICgweDAwIHRvIDB4RkYpLlxuICAgKiBAcGFyYW0gYiBUaGUgYmx1ZSBjaGFubmVsICgweDAwIHRvIDB4RkYpLlxuICAgKiBAc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9XQ0FHMjAvI3JlbGF0aXZlbHVtaW5hbmNlZGVmXG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gcmVsYXRpdmVMdW1pbmFuY2UyKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHJzID0gciAvIDI1NTtcbiAgICBjb25zdCBncyA9IGcgLyAyNTU7XG4gICAgY29uc3QgYnMgPSBiIC8gMjU1O1xuICAgIGNvbnN0IHJyID0gcnMgPD0gMC4wMzkyOCA/IHJzIC8gMTIuOTIgOiBNYXRoLnBvdygocnMgKyAwLjA1NSkgLyAxLjA1NSwgMi40KTtcbiAgICBjb25zdCByZyA9IGdzIDw9IDAuMDM5MjggPyBncyAvIDEyLjkyIDogTWF0aC5wb3coKGdzICsgMC4wNTUpIC8gMS4wNTUsIDIuNCk7XG4gICAgY29uc3QgcmIgPSBicyA8PSAwLjAzOTI4ID8gYnMgLyAxMi45MiA6IE1hdGgucG93KChicyArIDAuMDU1KSAvIDEuMDU1LCAyLjQpO1xuICAgIHJldHVybiByciAqIDAuMjEyNiArIHJnICogMC43MTUyICsgcmIgKiAwLjA3MjI7XG4gIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb25zIHdoZXJlIHRoZSBzb3VyY2UgdHlwZSBpcyBcInJnYmFcIiAobnVtYmVyOiAweHJyZ2diYmFhKS5cbiAqL1xuZXhwb3J0IG5hbWVzcGFjZSByZ2JhIHtcbiAgZXhwb3J0IGZ1bmN0aW9uIGJsZW5kKGJnOiBudW1iZXIsIGZnOiBudW1iZXIpOiBudW1iZXIge1xuICAgICRhID0gKGZnICYgMHhGRikgLyAweEZGO1xuICAgIGlmICgkYSA9PT0gMSkge1xuICAgICAgcmV0dXJuIGZnO1xuICAgIH1cbiAgICBjb25zdCBmZ1IgPSAoZmcgPj4gMjQpICYgMHhGRjtcbiAgICBjb25zdCBmZ0cgPSAoZmcgPj4gMTYpICYgMHhGRjtcbiAgICBjb25zdCBmZ0IgPSAoZmcgPj4gOCkgJiAweEZGO1xuICAgIGNvbnN0IGJnUiA9IChiZyA+PiAyNCkgJiAweEZGO1xuICAgIGNvbnN0IGJnRyA9IChiZyA+PiAxNikgJiAweEZGO1xuICAgIGNvbnN0IGJnQiA9IChiZyA+PiA4KSAmIDB4RkY7XG4gICAgJHIgPSBiZ1IgKyBNYXRoLnJvdW5kKChmZ1IgLSBiZ1IpICogJGEpO1xuICAgICRnID0gYmdHICsgTWF0aC5yb3VuZCgoZmdHIC0gYmdHKSAqICRhKTtcbiAgICAkYiA9IGJnQiArIE1hdGgucm91bmQoKGZnQiAtIGJnQikgKiAkYSk7XG4gICAgcmV0dXJuIGNoYW5uZWxzLnRvUmdiYSgkciwgJGcsICRiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHaXZlbiBhIGZvcmVncm91bmQgY29sb3IgYW5kIGEgYmFja2dyb3VuZCBjb2xvciwgZWl0aGVyIGluY3JlYXNlIG9yIHJlZHVjZSB0aGUgbHVtaW5hbmNlIG9mIHRoZVxuICAgKiBmb3JlZ3JvdW5kIGNvbG9yIHVudGlsIHRoZSBzcGVjaWZpZWQgY29udHJhc3QgcmF0aW8gaXMgbWV0LiBJZiBwdXJlIHdoaXRlIG9yIGJsYWNrIGlzIGhpdFxuICAgKiB3aXRob3V0IHRoZSBjb250cmFzdCByYXRpbyBiZWluZyBtZXQsIGdvIHRoZSBvdGhlciBkaXJlY3Rpb24gdXNpbmcgdGhlIGJhY2tncm91bmQgY29sb3IgYXMgdGhlXG4gICAqIGZvcmVncm91bmQgY29sb3IgYW5kIHRha2UgZWl0aGVyIHRoZSBmaXJzdCBvciBzZWNvbmQgcmVzdWx0IGRlcGVuZGluZyBvbiB3aGljaCBoYXMgdGhlIGhpZ2hlclxuICAgKiBjb250cmFzdCByYXRpby5cbiAgICpcbiAgICogYHVuZGVmaW5lZGAgd2lsbCBiZSByZXR1cm5lZCBpZiB0aGUgY29udHJhc3QgcmF0aW8gaXMgYWxyZWFkeSBtZXQuXG4gICAqXG4gICAqIEBwYXJhbSBiZ1JnYmEgVGhlIGJhY2tncm91bmQgY29sb3IgaW4gcmdiYSBmb3JtYXQuXG4gICAqIEBwYXJhbSBmZ1JnYmEgVGhlIGZvcmVncm91bmQgY29sb3IgaW4gcmdiYSBmb3JtYXQuXG4gICAqIEBwYXJhbSByYXRpbyBUaGUgY29udHJhc3QgcmF0aW8gdG8gYWNoaWV2ZS5cbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiBlbnN1cmVDb250cmFzdFJhdGlvKGJnUmdiYTogbnVtYmVyLCBmZ1JnYmE6IG51bWJlciwgcmF0aW86IG51bWJlcik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgYmdMID0gcmdiLnJlbGF0aXZlTHVtaW5hbmNlKGJnUmdiYSA+PiA4KTtcbiAgICBjb25zdCBmZ0wgPSByZ2IucmVsYXRpdmVMdW1pbmFuY2UoZmdSZ2JhID4+IDgpO1xuICAgIGNvbnN0IGNyID0gY29udHJhc3RSYXRpbyhiZ0wsIGZnTCk7XG4gICAgaWYgKGNyIDwgcmF0aW8pIHtcbiAgICAgIGlmIChmZ0wgPCBiZ0wpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0QSA9IHJlZHVjZUx1bWluYW5jZShiZ1JnYmEsIGZnUmdiYSwgcmF0aW8pO1xuICAgICAgICBjb25zdCByZXN1bHRBUmF0aW8gPSBjb250cmFzdFJhdGlvKGJnTCwgcmdiLnJlbGF0aXZlTHVtaW5hbmNlKHJlc3VsdEEgPj4gOCkpO1xuICAgICAgICBpZiAocmVzdWx0QVJhdGlvIDwgcmF0aW8pIHtcbiAgICAgICAgICBjb25zdCByZXN1bHRCID0gaW5jcmVhc2VMdW1pbmFuY2UoYmdSZ2JhLCBmZ1JnYmEsIHJhdGlvKTtcbiAgICAgICAgICBjb25zdCByZXN1bHRCUmF0aW8gPSBjb250cmFzdFJhdGlvKGJnTCwgcmdiLnJlbGF0aXZlTHVtaW5hbmNlKHJlc3VsdEIgPj4gOCkpO1xuICAgICAgICAgIHJldHVybiByZXN1bHRBUmF0aW8gPiByZXN1bHRCUmF0aW8gPyByZXN1bHRBIDogcmVzdWx0QjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0QTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3VsdEEgPSBpbmNyZWFzZUx1bWluYW5jZShiZ1JnYmEsIGZnUmdiYSwgcmF0aW8pO1xuICAgICAgY29uc3QgcmVzdWx0QVJhdGlvID0gY29udHJhc3RSYXRpbyhiZ0wsIHJnYi5yZWxhdGl2ZUx1bWluYW5jZShyZXN1bHRBID4+IDgpKTtcbiAgICAgIGlmIChyZXN1bHRBUmF0aW8gPCByYXRpbykge1xuICAgICAgICBjb25zdCByZXN1bHRCID0gcmVkdWNlTHVtaW5hbmNlKGJnUmdiYSwgZmdSZ2JhLCByYXRpbyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdEJSYXRpbyA9IGNvbnRyYXN0UmF0aW8oYmdMLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UocmVzdWx0QiA+PiA4KSk7XG4gICAgICAgIHJldHVybiByZXN1bHRBUmF0aW8gPiByZXN1bHRCUmF0aW8gPyByZXN1bHRBIDogcmVzdWx0QjtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHRBO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIHJlZHVjZUx1bWluYW5jZShiZ1JnYmE6IG51bWJlciwgZmdSZ2JhOiBudW1iZXIsIHJhdGlvOiBudW1iZXIpOiBudW1iZXIge1xuICAgIC8vIFRoaXMgaXMgYSBuYWl2ZSBidXQgZmFzdCBhcHByb2FjaCB0byByZWR1Y2luZyBsdW1pbmFuY2UgYXMgY29udmVydGluZyB0b1xuICAgIC8vIEhTTCBhbmQgYmFjayBpcyBleHBlbnNpdmVcbiAgICBjb25zdCBiZ1IgPSAoYmdSZ2JhID4+IDI0KSAmIDB4RkY7XG4gICAgY29uc3QgYmdHID0gKGJnUmdiYSA+PiAxNikgJiAweEZGO1xuICAgIGNvbnN0IGJnQiA9IChiZ1JnYmEgPj4gIDgpICYgMHhGRjtcbiAgICBsZXQgZmdSID0gKGZnUmdiYSA+PiAyNCkgJiAweEZGO1xuICAgIGxldCBmZ0cgPSAoZmdSZ2JhID4+IDE2KSAmIDB4RkY7XG4gICAgbGV0IGZnQiA9IChmZ1JnYmEgPj4gIDgpICYgMHhGRjtcbiAgICBsZXQgY3IgPSBjb250cmFzdFJhdGlvKHJnYi5yZWxhdGl2ZUx1bWluYW5jZTIoZmdSLCBmZ0csIGZnQiksIHJnYi5yZWxhdGl2ZUx1bWluYW5jZTIoYmdSLCBiZ0csIGJnQikpO1xuICAgIHdoaWxlIChjciA8IHJhdGlvICYmIChmZ1IgPiAwIHx8IGZnRyA+IDAgfHwgZmdCID4gMCkpIHtcbiAgICAgIC8vIFJlZHVjZSBieSAxMCUgdW50aWwgdGhlIHJhdGlvIGlzIGhpdFxuICAgICAgZmdSIC09IE1hdGgubWF4KDAsIE1hdGguY2VpbChmZ1IgKiAwLjEpKTtcbiAgICAgIGZnRyAtPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwoZmdHICogMC4xKSk7XG4gICAgICBmZ0IgLT0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKGZnQiAqIDAuMSkpO1xuICAgICAgY3IgPSBjb250cmFzdFJhdGlvKHJnYi5yZWxhdGl2ZUx1bWluYW5jZTIoZmdSLCBmZ0csIGZnQiksIHJnYi5yZWxhdGl2ZUx1bWluYW5jZTIoYmdSLCBiZ0csIGJnQikpO1xuICAgIH1cbiAgICByZXR1cm4gKGZnUiA8PCAyNCB8IGZnRyA8PCAxNiB8IGZnQiA8PCA4IHwgMHhGRikgPj4+IDA7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gaW5jcmVhc2VMdW1pbmFuY2UoYmdSZ2JhOiBudW1iZXIsIGZnUmdiYTogbnVtYmVyLCByYXRpbzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAvLyBUaGlzIGlzIGEgbmFpdmUgYnV0IGZhc3QgYXBwcm9hY2ggdG8gaW5jcmVhc2luZyBsdW1pbmFuY2UgYXMgY29udmVydGluZyB0b1xuICAgIC8vIEhTTCBhbmQgYmFjayBpcyBleHBlbnNpdmVcbiAgICBjb25zdCBiZ1IgPSAoYmdSZ2JhID4+IDI0KSAmIDB4RkY7XG4gICAgY29uc3QgYmdHID0gKGJnUmdiYSA+PiAxNikgJiAweEZGO1xuICAgIGNvbnN0IGJnQiA9IChiZ1JnYmEgPj4gIDgpICYgMHhGRjtcbiAgICBsZXQgZmdSID0gKGZnUmdiYSA+PiAyNCkgJiAweEZGO1xuICAgIGxldCBmZ0cgPSAoZmdSZ2JhID4+IDE2KSAmIDB4RkY7XG4gICAgbGV0IGZnQiA9IChmZ1JnYmEgPj4gIDgpICYgMHhGRjtcbiAgICBsZXQgY3IgPSBjb250cmFzdFJhdGlvKHJnYi5yZWxhdGl2ZUx1bWluYW5jZTIoZmdSLCBmZ0csIGZnQiksIHJnYi5yZWxhdGl2ZUx1bWluYW5jZTIoYmdSLCBiZ0csIGJnQikpO1xuICAgIHdoaWxlIChjciA8IHJhdGlvICYmIChmZ1IgPCAweEZGIHx8IGZnRyA8IDB4RkYgfHwgZmdCIDwgMHhGRikpIHtcbiAgICAgIC8vIEluY3JlYXNlIGJ5IDEwJSB1bnRpbCB0aGUgcmF0aW8gaXMgaGl0XG4gICAgICBmZ1IgPSBNYXRoLm1pbigweEZGLCBmZ1IgKyBNYXRoLmNlaWwoKDI1NSAtIGZnUikgKiAwLjEpKTtcbiAgICAgIGZnRyA9IE1hdGgubWluKDB4RkYsIGZnRyArIE1hdGguY2VpbCgoMjU1IC0gZmdHKSAqIDAuMSkpO1xuICAgICAgZmdCID0gTWF0aC5taW4oMHhGRiwgZmdCICsgTWF0aC5jZWlsKCgyNTUgLSBmZ0IpICogMC4xKSk7XG4gICAgICBjciA9IGNvbnRyYXN0UmF0aW8ocmdiLnJlbGF0aXZlTHVtaW5hbmNlMihmZ1IsIGZnRywgZmdCKSwgcmdiLnJlbGF0aXZlTHVtaW5hbmNlMihiZ1IsIGJnRywgYmdCKSk7XG4gICAgfVxuICAgIHJldHVybiAoZmdSIDw8IDI0IHwgZmdHIDw8IDE2IHwgZmdCIDw8IDggfCAweEZGKSA+Pj4gMDtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiB0b0NoYW5uZWxzKHZhbHVlOiBudW1iZXIpOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSB7XG4gICAgcmV0dXJuIFsodmFsdWUgPj4gMjQpICYgMHhGRiwgKHZhbHVlID4+IDE2KSAmIDB4RkYsICh2YWx1ZSA+PiA4KSAmIDB4RkYsIHZhbHVlICYgMHhGRl07XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvUGFkZGVkSGV4KGM6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IHMgPSBjLnRvU3RyaW5nKDE2KTtcbiAgcmV0dXJuIHMubGVuZ3RoIDwgMiA/ICcwJyArIHMgOiBzO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGNvbnRyYXN0IHJhdGlvIGJldHdlZW4gdHdvIHJlbGF0aXZlIGx1bWluYW5jZSB2YWx1ZXMuXG4gKiBAcGFyYW0gbDEgVGhlIGZpcnN0IHJlbGF0aXZlIGx1bWluYW5jZS5cbiAqIEBwYXJhbSBsMiBUaGUgZmlyc3QgcmVsYXRpdmUgbHVtaW5hbmNlLlxuICogQHNlZSBodHRwczovL3d3dy53My5vcmcvVFIvV0NBRzIwLyNjb250cmFzdC1yYXRpb2RlZlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udHJhc3RSYXRpbyhsMTogbnVtYmVyLCBsMjogbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKGwxIDwgbDIpIHtcbiAgICByZXR1cm4gKGwyICsgMC4wNSkgLyAobDEgKyAwLjA1KTtcbiAgfVxuICByZXR1cm4gKGwxICsgMC4wNSkgLyAobDIgKyAwLjA1KTtcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSURpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuXG5pbnRlcmZhY2UgSUxpc3RlbmVyPFQsIFUgPSB2b2lkPiB7XG4gIChhcmcxOiBULCBhcmcyOiBVKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRXZlbnQ8VCwgVSA9IHZvaWQ+IHtcbiAgKGxpc3RlbmVyOiAoYXJnMTogVCwgYXJnMjogVSkgPT4gYW55KTogSURpc3Bvc2FibGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUV2ZW50RW1pdHRlcjxULCBVID0gdm9pZD4ge1xuICBldmVudDogSUV2ZW50PFQsIFU+O1xuICBmaXJlKGFyZzE6IFQsIGFyZzI6IFUpOiB2b2lkO1xuICBkaXNwb3NlKCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBFdmVudEVtaXR0ZXI8VCwgVSA9IHZvaWQ+IGltcGxlbWVudHMgSUV2ZW50RW1pdHRlcjxULCBVPiB7XG4gIHByaXZhdGUgX2xpc3RlbmVyczogSUxpc3RlbmVyPFQsIFU+W10gPSBbXTtcbiAgcHJpdmF0ZSBfZXZlbnQ/OiBJRXZlbnQ8VCwgVT47XG4gIHByaXZhdGUgX2Rpc3Bvc2VkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHVibGljIGdldCBldmVudCgpOiBJRXZlbnQ8VCwgVT4ge1xuICAgIGlmICghdGhpcy5fZXZlbnQpIHtcbiAgICAgIHRoaXMuX2V2ZW50ID0gKGxpc3RlbmVyOiAoYXJnMTogVCwgYXJnMjogVSkgPT4gYW55KSA9PiB7XG4gICAgICAgIHRoaXMuX2xpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgICAgICAgY29uc3QgZGlzcG9zYWJsZSA9IHtcbiAgICAgICAgICBkaXNwb3NlOiAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2Rpc3Bvc2VkKSB7XG4gICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2xpc3RlbmVyc1tpXSA9PT0gbGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2xpc3RlbmVycy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gZGlzcG9zYWJsZTtcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9ldmVudDtcbiAgfVxuXG4gIHB1YmxpYyBmaXJlKGFyZzE6IFQsIGFyZzI6IFUpOiB2b2lkIHtcbiAgICBjb25zdCBxdWV1ZTogSUxpc3RlbmVyPFQsIFU+W10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2xpc3RlbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgcXVldWUucHVzaCh0aGlzLl9saXN0ZW5lcnNbaV0pO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBxdWV1ZVtpXS5jYWxsKHVuZGVmaW5lZCwgYXJnMSwgYXJnMik7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhckxpc3RlbmVycygpO1xuICAgIHRoaXMuX2Rpc3Bvc2VkID0gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhckxpc3RlbmVycygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fbGlzdGVuZXJzKSB7XG4gICAgICB0aGlzLl9saXN0ZW5lcnMubGVuZ3RoID0gMDtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcndhcmRFdmVudDxUPihmcm9tOiBJRXZlbnQ8VD4sIHRvOiBJRXZlbnRFbWl0dGVyPFQ+KTogSURpc3Bvc2FibGUge1xuICByZXR1cm4gZnJvbShlID0+IHRvLmZpcmUoZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVuQW5kU3Vic2NyaWJlPFQ+KGV2ZW50OiBJRXZlbnQ8VD4sIGhhbmRsZXI6IChlOiBUIHwgdW5kZWZpbmVkKSA9PiBhbnkpOiBJRGlzcG9zYWJsZSB7XG4gIGhhbmRsZXIodW5kZWZpbmVkKTtcbiAgcmV0dXJuIGV2ZW50KGUgPT4gaGFuZGxlcihlKSk7XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOCBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElEaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcblxuLyoqXG4gKiBBIGJhc2UgY2xhc3MgdGhhdCBjYW4gYmUgZXh0ZW5kZWQgdG8gcHJvdmlkZSBjb252ZW5pZW5jZSBtZXRob2RzIGZvciBtYW5hZ2luZyB0aGUgbGlmZWN5Y2xlIG9mIGFuXG4gKiBvYmplY3QgYW5kIGl0cyBjb21wb25lbnRzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRGlzcG9zYWJsZSBpbXBsZW1lbnRzIElEaXNwb3NhYmxlIHtcbiAgcHJvdGVjdGVkIF9kaXNwb3NhYmxlczogSURpc3Bvc2FibGVbXSA9IFtdO1xuICBwcm90ZWN0ZWQgX2lzRGlzcG9zZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogRGlzcG9zZXMgdGhlIG9iamVjdCwgdHJpZ2dlcmluZyB0aGUgYGRpc3Bvc2VgIG1ldGhvZCBvbiBhbGwgcmVnaXN0ZXJlZCBJRGlzcG9zYWJsZXMuXG4gICAqL1xuICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9pc0Rpc3Bvc2VkID0gdHJ1ZTtcbiAgICBmb3IgKGNvbnN0IGQgb2YgdGhpcy5fZGlzcG9zYWJsZXMpIHtcbiAgICAgIGQuZGlzcG9zZSgpO1xuICAgIH1cbiAgICB0aGlzLl9kaXNwb3NhYmxlcy5sZW5ndGggPSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGRpc3Bvc2FibGUgb2JqZWN0LlxuICAgKiBAcGFyYW0gZCBUaGUgZGlzcG9zYWJsZSB0byByZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIGRpc3Bvc2FibGUuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXI8VCBleHRlbmRzIElEaXNwb3NhYmxlPihkOiBUKTogVCB7XG4gICAgdGhpcy5fZGlzcG9zYWJsZXMucHVzaChkKTtcbiAgICByZXR1cm4gZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIGRpc3Bvc2FibGUgb2JqZWN0IGlmIGl0IGhhcyBiZWVuIHJlZ2lzdGVyZWQsIGlmIG5vdCBkb1xuICAgKiBub3RoaW5nLlxuICAgKiBAcGFyYW0gZCBUaGUgZGlzcG9zYWJsZSB0byB1bnJlZ2lzdGVyLlxuICAgKi9cbiAgcHVibGljIHVucmVnaXN0ZXI8VCBleHRlbmRzIElEaXNwb3NhYmxlPihkOiBUKTogdm9pZCB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9kaXNwb3NhYmxlcy5pbmRleE9mKGQpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIHRoaXMuX2Rpc3Bvc2FibGVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNdXRhYmxlRGlzcG9zYWJsZTxUIGV4dGVuZHMgSURpc3Bvc2FibGU+IGltcGxlbWVudHMgSURpc3Bvc2FibGUge1xuICBwcml2YXRlIF92YWx1ZT86IFQ7XG4gIHByaXZhdGUgX2lzRGlzcG9zZWQgPSBmYWxzZTtcblxuICAvKipcbiAgICogR2V0cyB0aGUgdmFsdWUgaWYgaXQgZXhpc3RzLlxuICAgKi9cbiAgcHVibGljIGdldCB2YWx1ZSgpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5faXNEaXNwb3NlZCA/IHVuZGVmaW5lZCA6IHRoaXMuX3ZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHZhbHVlLCBkaXNwb3Npbmcgb2YgdGhlIG9sZCB2YWx1ZSBpZiBpdCBleGlzdHMuXG4gICAqL1xuICBwdWJsaWMgc2V0IHZhbHVlKHZhbHVlOiBUIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHRoaXMuX2lzRGlzcG9zZWQgfHwgdmFsdWUgPT09IHRoaXMuX3ZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3ZhbHVlPy5kaXNwb3NlKCk7XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIHN0b3JlZCB2YWx1ZSBhbmQgZGlzcG9zZXMgb2YgdGhlIHByZXZpb3VzbHkgc3RvcmVkIHZhbHVlLlxuICAgKi9cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9pc0Rpc3Bvc2VkID0gdHJ1ZTtcbiAgICB0aGlzLl92YWx1ZT8uZGlzcG9zZSgpO1xuICAgIHRoaXMuX3ZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogV3JhcCBhIGZ1bmN0aW9uIGluIGEgZGlzcG9zYWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvRGlzcG9zYWJsZShmOiAoKSA9PiB2b2lkKTogSURpc3Bvc2FibGUge1xuICByZXR1cm4geyBkaXNwb3NlOiBmIH07XG59XG5cbi8qKlxuICogRGlzcG9zZSBvZiBhbGwgZGlzcG9zYWJsZXMgaW4gYW4gYXJyYXkgYW5kIHNldCBpdHMgbGVuZ3RoIHRvIDAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXNwb3NlQXJyYXkoZGlzcG9zYWJsZXM6IElEaXNwb3NhYmxlW10pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBkIG9mIGRpc3Bvc2FibGVzKSB7XG4gICAgZC5kaXNwb3NlKCk7XG4gIH1cbiAgZGlzcG9zYWJsZXMubGVuZ3RoID0gMDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZGlzcG9zYWJsZSB0aGF0IHdpbGwgZGlzcG9zZSBvZiBhbiBhcnJheSBvZiBkaXNwb3NhYmxlcyB3aGVuIGRpc3Bvc2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGlzcG9zZUFycmF5RGlzcG9zYWJsZShhcnJheTogSURpc3Bvc2FibGVbXSk6IElEaXNwb3NhYmxlIHtcbiAgcmV0dXJuIHsgZGlzcG9zZTogKCkgPT4gZGlzcG9zZUFycmF5KGFycmF5KSB9O1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjIgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5leHBvcnQgY2xhc3MgVHdvS2V5TWFwPFRGaXJzdCBleHRlbmRzIHN0cmluZyB8IG51bWJlciwgVFNlY29uZCBleHRlbmRzIHN0cmluZyB8IG51bWJlciwgVFZhbHVlPiB7XG4gIHByaXZhdGUgX2RhdGE6IHsgW2JnOiBzdHJpbmcgfCBudW1iZXJdOiB7IFtmZzogc3RyaW5nIHwgbnVtYmVyXTogVFZhbHVlIHwgdW5kZWZpbmVkIH0gfCB1bmRlZmluZWQgfSA9IHt9O1xuXG4gIHB1YmxpYyBzZXQoZmlyc3Q6IFRGaXJzdCwgc2Vjb25kOiBUU2Vjb25kLCB2YWx1ZTogVFZhbHVlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9kYXRhW2ZpcnN0XSkge1xuICAgICAgdGhpcy5fZGF0YVtmaXJzdF0gPSB7fTtcbiAgICB9XG4gICAgdGhpcy5fZGF0YVtmaXJzdCBhcyBzdHJpbmcgfCBudW1iZXJdIVtzZWNvbmRdID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0KGZpcnN0OiBURmlyc3QsIHNlY29uZDogVFNlY29uZCk6IFRWYWx1ZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFbZmlyc3QgYXMgc3RyaW5nIHwgbnVtYmVyXSA/IHRoaXMuX2RhdGFbZmlyc3QgYXMgc3RyaW5nIHwgbnVtYmVyXSFbc2Vjb25kXSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLl9kYXRhID0ge307XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZvdXJLZXlNYXA8VEZpcnN0IGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyLCBUU2Vjb25kIGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyLCBUVGhpcmQgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIsIFRGb3VydGggZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIsIFRWYWx1ZT4ge1xuICBwcml2YXRlIF9kYXRhOiBUd29LZXlNYXA8VEZpcnN0LCBUU2Vjb25kLCBUd29LZXlNYXA8VFRoaXJkLCBURm91cnRoLCBUVmFsdWU+PiA9IG5ldyBUd29LZXlNYXAoKTtcblxuICBwdWJsaWMgc2V0KGZpcnN0OiBURmlyc3QsIHNlY29uZDogVFNlY29uZCwgdGhpcmQ6IFRUaGlyZCwgZm91cnRoOiBURm91cnRoLCB2YWx1ZTogVFZhbHVlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9kYXRhLmdldChmaXJzdCwgc2Vjb25kKSkge1xuICAgICAgdGhpcy5fZGF0YS5zZXQoZmlyc3QsIHNlY29uZCwgbmV3IFR3b0tleU1hcCgpKTtcbiAgICB9XG4gICAgdGhpcy5fZGF0YS5nZXQoZmlyc3QsIHNlY29uZCkhLnNldCh0aGlyZCwgZm91cnRoLCB2YWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0KGZpcnN0OiBURmlyc3QsIHNlY29uZDogVFNlY29uZCwgdGhpcmQ6IFRUaGlyZCwgZm91cnRoOiBURm91cnRoKTogVFZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YS5nZXQoZmlyc3QsIHNlY29uZCk/LmdldCh0aGlyZCwgZm91cnRoKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLl9kYXRhLmNsZWFyKCk7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKlxuICogVGhpcyB3YXMgaGVhdmlseSBpbnNwaXJlZCBmcm9tIG1pY3Jvc29mdC92c2NvZGUncyBkZXBlbmRlbmN5IGluamVjdGlvbiBzeXN0ZW0gKE1JVCkuXG4gKi9cbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5pbXBvcnQgeyBJU2VydmljZUlkZW50aWZpZXIgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuXG5jb25zdCBESV9UQVJHRVQgPSAnZGkkdGFyZ2V0JztcbmNvbnN0IERJX0RFUEVOREVOQ0lFUyA9ICdkaSRkZXBlbmRlbmNpZXMnO1xuXG5leHBvcnQgY29uc3Qgc2VydmljZVJlZ2lzdHJ5OiBNYXA8c3RyaW5nLCBJU2VydmljZUlkZW50aWZpZXI8YW55Pj4gPSBuZXcgTWFwKCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZXJ2aWNlRGVwZW5kZW5jaWVzKGN0b3I6IGFueSk6IHsgaWQ6IElTZXJ2aWNlSWRlbnRpZmllcjxhbnk+LCBpbmRleDogbnVtYmVyLCBvcHRpb25hbDogYm9vbGVhbiB9W10ge1xuICByZXR1cm4gY3RvcltESV9ERVBFTkRFTkNJRVNdIHx8IFtdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRGVjb3JhdG9yPFQ+KGlkOiBzdHJpbmcpOiBJU2VydmljZUlkZW50aWZpZXI8VD4ge1xuICBpZiAoc2VydmljZVJlZ2lzdHJ5LmhhcyhpZCkpIHtcbiAgICByZXR1cm4gc2VydmljZVJlZ2lzdHJ5LmdldChpZCkhO1xuICB9XG5cbiAgY29uc3QgZGVjb3JhdG9yOiBhbnkgPSBmdW5jdGlvbiAodGFyZ2V0OiBGdW5jdGlvbiwga2V5OiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiBhbnkge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoICE9PSAzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0BJU2VydmljZU5hbWUtZGVjb3JhdG9yIGNhbiBvbmx5IGJlIHVzZWQgdG8gZGVjb3JhdGUgYSBwYXJhbWV0ZXInKTtcbiAgICB9XG5cbiAgICBzdG9yZVNlcnZpY2VEZXBlbmRlbmN5KGRlY29yYXRvciwgdGFyZ2V0LCBpbmRleCk7XG4gIH07XG5cbiAgZGVjb3JhdG9yLnRvU3RyaW5nID0gKCkgPT4gaWQ7XG5cbiAgc2VydmljZVJlZ2lzdHJ5LnNldChpZCwgZGVjb3JhdG9yKTtcbiAgcmV0dXJuIGRlY29yYXRvcjtcbn1cblxuZnVuY3Rpb24gc3RvcmVTZXJ2aWNlRGVwZW5kZW5jeShpZDogRnVuY3Rpb24sIHRhcmdldDogRnVuY3Rpb24sIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgaWYgKCh0YXJnZXQgYXMgYW55KVtESV9UQVJHRVRdID09PSB0YXJnZXQpIHtcbiAgICAodGFyZ2V0IGFzIGFueSlbRElfREVQRU5ERU5DSUVTXS5wdXNoKHsgaWQsIGluZGV4IH0pO1xuICB9IGVsc2Uge1xuICAgICh0YXJnZXQgYXMgYW55KVtESV9ERVBFTkRFTkNJRVNdID0gW3sgaWQsIGluZGV4IH1dO1xuICAgICh0YXJnZXQgYXMgYW55KVtESV9UQVJHRVRdID0gdGFyZ2V0O1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElFdmVudCwgSUV2ZW50RW1pdHRlciB9IGZyb20gJ2NvbW1vbi9FdmVudEVtaXR0ZXInO1xuaW1wb3J0IHsgSUJ1ZmZlciwgSUJ1ZmZlclNldCB9IGZyb20gJ2NvbW1vbi9idWZmZXIvVHlwZXMnO1xuaW1wb3J0IHsgSURlY1ByaXZhdGVNb2RlcywgSUNvcmVNb3VzZUV2ZW50LCBDb3JlTW91c2VFbmNvZGluZywgSUNvcmVNb3VzZVByb3RvY29sLCBDb3JlTW91c2VFdmVudFR5cGUsIElDaGFyc2V0LCBJV2luZG93T3B0aW9ucywgSU1vZGVzLCBJQXR0cmlidXRlRGF0YSwgU2Nyb2xsU291cmNlLCBJRGlzcG9zYWJsZSwgSUNvbG9yLCBDdXJzb3JTdHlsZSwgQ3Vyc29ySW5hY3RpdmVTdHlsZSwgSU9zY0xpbmtEYXRhIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcbmltcG9ydCB7IGNyZWF0ZURlY29yYXRvciB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgSURlY29yYXRpb25PcHRpb25zLCBJRGVjb3JhdGlvbiwgSUxpbmtIYW5kbGVyLCBJV2luZG93c1B0eSwgSUxvZ2dlciB9IGZyb20gJ0B4dGVybS94dGVybSc7XG5cbmV4cG9ydCBjb25zdCBJQnVmZmVyU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJQnVmZmVyU2VydmljZT4oJ0J1ZmZlclNlcnZpY2UnKTtcbmV4cG9ydCBpbnRlcmZhY2UgSUJ1ZmZlclNlcnZpY2Uge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcblxuICByZWFkb25seSBjb2xzOiBudW1iZXI7XG4gIHJlYWRvbmx5IHJvd3M6IG51bWJlcjtcbiAgcmVhZG9ubHkgYnVmZmVyOiBJQnVmZmVyO1xuICByZWFkb25seSBidWZmZXJzOiBJQnVmZmVyU2V0O1xuICBpc1VzZXJTY3JvbGxpbmc6IGJvb2xlYW47XG4gIG9uUmVzaXplOiBJRXZlbnQ8eyBjb2xzOiBudW1iZXIsIHJvd3M6IG51bWJlciB9PjtcbiAgb25TY3JvbGw6IElFdmVudDxudW1iZXI+O1xuICBzY3JvbGwoZXJhc2VBdHRyOiBJQXR0cmlidXRlRGF0YSwgaXNXcmFwcGVkPzogYm9vbGVhbik6IHZvaWQ7XG4gIHNjcm9sbExpbmVzKGRpc3A6IG51bWJlciwgc3VwcHJlc3NTY3JvbGxFdmVudD86IGJvb2xlYW4sIHNvdXJjZT86IFNjcm9sbFNvdXJjZSk6IHZvaWQ7XG4gIHJlc2l6ZShjb2xzOiBudW1iZXIsIHJvd3M6IG51bWJlcik6IHZvaWQ7XG4gIHJlc2V0KCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBjb25zdCBJQ29yZU1vdXNlU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJQ29yZU1vdXNlU2VydmljZT4oJ0NvcmVNb3VzZVNlcnZpY2UnKTtcbmV4cG9ydCBpbnRlcmZhY2UgSUNvcmVNb3VzZVNlcnZpY2Uge1xuICBhY3RpdmVQcm90b2NvbDogc3RyaW5nO1xuICBhY3RpdmVFbmNvZGluZzogc3RyaW5nO1xuICBhcmVNb3VzZUV2ZW50c0FjdGl2ZTogYm9vbGVhbjtcbiAgYWRkUHJvdG9jb2wobmFtZTogc3RyaW5nLCBwcm90b2NvbDogSUNvcmVNb3VzZVByb3RvY29sKTogdm9pZDtcbiAgYWRkRW5jb2RpbmcobmFtZTogc3RyaW5nLCBlbmNvZGluZzogQ29yZU1vdXNlRW5jb2RpbmcpOiB2b2lkO1xuICByZXNldCgpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyBhIG1vdXNlIGV2ZW50IHRvIGJlIHNlbnQuXG4gICAqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZXZlbnQgcGFzc2VkIGFsbCBwcm90b2NvbCByZXN0cmljdGlvbnMgYW5kIGEgcmVwb3J0XG4gICAqIHdhcyBzZW50LCBvdGhlcndpc2UgZmFsc2UuIFRoZSByZXR1cm4gdmFsdWUgbWF5IGJlIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXJcbiAgICogdGhlIGRlZmF1bHQgZXZlbnQgYWN0aW9uIGluIHRoZSBib3dzZXIgY29tcG9uZW50IHNob3VsZCBiZSBvbWl0dGVkLlxuICAgKlxuICAgKiBOb3RlOiBUaGUgbWV0aG9kIHdpbGwgY2hhbmdlIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gZXZlbnQgb2JqZWN0XG4gICAqIHRvIGZ1bGxmaWxsIHByb3RvY29sIGFuZCBlbmNvZGluZyByZXN0cmljdGlvbnMuXG4gICAqL1xuICB0cmlnZ2VyTW91c2VFdmVudChldmVudDogSUNvcmVNb3VzZUV2ZW50KTogYm9vbGVhbjtcblxuICAvKipcbiAgICogRXZlbnQgdG8gYW5ub3VuY2UgY2hhbmdlcyBpbiBtb3VzZSB0cmFja2luZy5cbiAgICovXG4gIG9uUHJvdG9jb2xDaGFuZ2U6IElFdmVudDxDb3JlTW91c2VFdmVudFR5cGU+O1xuXG4gIC8qKlxuICAgKiBIdW1hbiByZWFkYWJsZSB2ZXJzaW9uIG9mIG1vdXNlIGV2ZW50cy5cbiAgICovXG4gIGV4cGxhaW5FdmVudHMoZXZlbnRzOiBDb3JlTW91c2VFdmVudFR5cGUpOiB7IFtldmVudDogc3RyaW5nXTogYm9vbGVhbiB9O1xufVxuXG5leHBvcnQgY29uc3QgSUNvcmVTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElDb3JlU2VydmljZT4oJ0NvcmVTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElDb3JlU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBJbml0aWFsbHkgdGhlIGN1cnNvciB3aWxsIG5vdCBiZSB2aXNpYmxlIHVudGlsIHRoZSBmaXJzdCB0aW1lIHRoZSB0ZXJtaW5hbFxuICAgKiBpcyBmb2N1c2VkLlxuICAgKi9cbiAgaXNDdXJzb3JJbml0aWFsaXplZDogYm9vbGVhbjtcbiAgaXNDdXJzb3JIaWRkZW46IGJvb2xlYW47XG5cbiAgcmVhZG9ubHkgbW9kZXM6IElNb2RlcztcbiAgcmVhZG9ubHkgZGVjUHJpdmF0ZU1vZGVzOiBJRGVjUHJpdmF0ZU1vZGVzO1xuXG4gIHJlYWRvbmx5IG9uRGF0YTogSUV2ZW50PHN0cmluZz47XG4gIHJlYWRvbmx5IG9uVXNlcklucHV0OiBJRXZlbnQ8dm9pZD47XG4gIHJlYWRvbmx5IG9uQmluYXJ5OiBJRXZlbnQ8c3RyaW5nPjtcbiAgcmVhZG9ubHkgb25SZXF1ZXN0U2Nyb2xsVG9Cb3R0b206IElFdmVudDx2b2lkPjtcblxuICByZXNldCgpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyB0aGUgb25EYXRhIGV2ZW50IGluIHRoZSBwdWJsaWMgQVBJLlxuICAgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0aGF0IGlzIGJlaW5nIGVtaXR0ZWQuXG4gICAqIEBwYXJhbSB3YXNVc2VySW5wdXQgV2hldGhlciB0aGUgZGF0YSBvcmlnaW5hdGVkIGZyb20gdGhlIHVzZXIgKGFzIG9wcG9zZWQgdG9cbiAgICogcmVzdWx0aW5nIGZyb20gcGFyc2luZyBpbmNvbWluZyBkYXRhKS4gV2hlbiB0cnVlIHRoaXMgd2lsbCBhbHNvOlxuICAgKiAtIFNjcm9sbCB0byB0aGUgYm90dG9tIG9mIHRoZSBidWZmZXIgaWYgb3B0aW9uIHNjcm9sbE9uVXNlcklucHV0IGlzIHRydWUuXG4gICAqIC0gRmlyZSB0aGUgYG9uVXNlcklucHV0YCBldmVudCAoc28gc2VsZWN0aW9uIGNhbiBiZSBjbGVhcmVkKS5cbiAgICovXG4gIHRyaWdnZXJEYXRhRXZlbnQoZGF0YTogc3RyaW5nLCB3YXNVc2VySW5wdXQ/OiBib29sZWFuKTogdm9pZDtcblxuICAvKipcbiAgICogVHJpZ2dlcnMgdGhlIG9uQmluYXJ5IGV2ZW50IGluIHRoZSBwdWJsaWMgQVBJLlxuICAgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0aGF0IGlzIGJlaW5nIGVtaXR0ZWQuXG4gICAqL1xuICB0cmlnZ2VyQmluYXJ5RXZlbnQoZGF0YTogc3RyaW5nKTogdm9pZDtcbn1cblxuZXhwb3J0IGNvbnN0IElDaGFyc2V0U2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJQ2hhcnNldFNlcnZpY2U+KCdDaGFyc2V0U2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJQ2hhcnNldFNlcnZpY2Uge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcblxuICBjaGFyc2V0OiBJQ2hhcnNldCB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgZ2xldmVsOiBudW1iZXI7XG5cbiAgcmVzZXQoKTogdm9pZDtcblxuICAvKipcbiAgICogU2V0IHRoZSBHIGxldmVsIG9mIHRoZSB0ZXJtaW5hbC5cbiAgICogQHBhcmFtIGdcbiAgICovXG4gIHNldGdMZXZlbChnOiBudW1iZXIpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGNoYXJzZXQgZm9yIHRoZSBnaXZlbiBHIGxldmVsIG9mIHRoZSB0ZXJtaW5hbC5cbiAgICogQHBhcmFtIGdcbiAgICogQHBhcmFtIGNoYXJzZXRcbiAgICovXG4gIHNldGdDaGFyc2V0KGc6IG51bWJlciwgY2hhcnNldDogSUNoYXJzZXQgfCB1bmRlZmluZWQpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTZXJ2aWNlSWRlbnRpZmllcjxUPiB7XG4gICguLi5hcmdzOiBhbnlbXSk6IHZvaWQ7XG4gIHR5cGU6IFQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUJyYW5kZWRTZXJ2aWNlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG59XG5cbnR5cGUgR2V0TGVhZGluZ05vblNlcnZpY2VBcmdzPFRBcmdzIGV4dGVuZHMgYW55W10+ID0gVEFyZ3MgZXh0ZW5kcyBbXSA/IFtdXG4gIDogVEFyZ3MgZXh0ZW5kcyBbLi4uaW5mZXIgVEZpcnN0LCBpbmZlciBUTGFzdF0gPyBUTGFzdCBleHRlbmRzIElCcmFuZGVkU2VydmljZSA/IEdldExlYWRpbmdOb25TZXJ2aWNlQXJnczxURmlyc3Q+IDogVEFyZ3NcbiAgICA6IG5ldmVyO1xuXG5leHBvcnQgY29uc3QgSUluc3RhbnRpYXRpb25TZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElJbnN0YW50aWF0aW9uU2VydmljZT4oJ0luc3RhbnRpYXRpb25TZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElJbnN0YW50aWF0aW9uU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIHNldFNlcnZpY2U8VD4oaWQ6IElTZXJ2aWNlSWRlbnRpZmllcjxUPiwgaW5zdGFuY2U6IFQpOiB2b2lkO1xuICBnZXRTZXJ2aWNlPFQ+KGlkOiBJU2VydmljZUlkZW50aWZpZXI8VD4pOiBUIHwgdW5kZWZpbmVkO1xuICBjcmVhdGVJbnN0YW5jZTxDdG9yIGV4dGVuZHMgbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LCBSIGV4dGVuZHMgSW5zdGFuY2VUeXBlPEN0b3I+Pih0OiBDdG9yLCAuLi5hcmdzOiBHZXRMZWFkaW5nTm9uU2VydmljZUFyZ3M8Q29uc3RydWN0b3JQYXJhbWV0ZXJzPEN0b3I+Pik6IFI7XG59XG5cbmV4cG9ydCBlbnVtIExvZ0xldmVsRW51bSB7XG4gIFRSQUNFID0gMCxcbiAgREVCVUcgPSAxLFxuICBJTkZPID0gMixcbiAgV0FSTiA9IDMsXG4gIEVSUk9SID0gNCxcbiAgT0ZGID0gNVxufVxuXG5leHBvcnQgY29uc3QgSUxvZ1NlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SUxvZ1NlcnZpY2U+KCdMb2dTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElMb2dTZXJ2aWNlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG5cbiAgcmVhZG9ubHkgbG9nTGV2ZWw6IExvZ0xldmVsRW51bTtcblxuICB0cmFjZShtZXNzYWdlOiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQ7XG4gIGRlYnVnKG1lc3NhZ2U6IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZDtcbiAgaW5mbyhtZXNzYWdlOiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQ7XG4gIHdhcm4obWVzc2FnZTogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pOiB2b2lkO1xuICBlcnJvcihtZXNzYWdlOiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQ7XG59XG5cbmV4cG9ydCBjb25zdCBJT3B0aW9uc1NlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SU9wdGlvbnNTZXJ2aWNlPignT3B0aW9uc1NlcnZpY2UnKTtcbmV4cG9ydCBpbnRlcmZhY2UgSU9wdGlvbnNTZXJ2aWNlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFJlYWQgb25seSBhY2Nlc3MgdG8gdGhlIHJhdyBvcHRpb25zIG9iamVjdCwgdGhpcyBpcyBhbiBpbnRlcm5hbC1vbmx5IGZhc3QgcGF0aCBmb3IgYWNjZXNzaW5nXG4gICAqIHNpbmdsZSBvcHRpb25zIHdpdGhvdXQgYW55IHZhbGlkYXRpb24gYXMgd2UgdHJ1c3QgVHlwZVNjcmlwdCB0byBlbmZvcmNlIGNvcnJlY3QgdXNhZ2VcbiAgICogaW50ZXJuYWxseS5cbiAgICovXG4gIHJlYWRvbmx5IHJhd09wdGlvbnM6IFJlcXVpcmVkPElUZXJtaW5hbE9wdGlvbnM+O1xuXG4gIC8qKlxuICAgKiBPcHRpb25zIGFzIGV4cG9zZWQgdGhyb3VnaCB0aGUgcHVibGljIEFQSSwgdGhpcyBwcm9wZXJ0eSB1c2VzIGdldHRlcnMgYW5kIHNldHRlcnMgd2l0aFxuICAgKiB2YWxpZGF0aW9uIHdoaWNoIG1ha2VzIGl0IHNhZmVyIGJ1dCBzbG93ZXIuIHtAbGluayByYXdPcHRpb25zfSBzaG91bGQgYmUgdXNlZCBmb3IgcHJldHR5IG11Y2hcbiAgICogYWxsIGludGVybmFsIHVzYWdlIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgb3B0aW9uczogUmVxdWlyZWQ8SVRlcm1pbmFsT3B0aW9ucz47XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZXZlbnQgbGlzdGVuZXIgZm9yIHdoZW4gYW55IG9wdGlvbiBjaGFuZ2VzLlxuICAgKi9cbiAgcmVhZG9ubHkgb25PcHRpb25DaGFuZ2U6IElFdmVudDxrZXlvZiBJVGVybWluYWxPcHRpb25zPjtcblxuICAvKipcbiAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciBmb3Igd2hlbiBhIHNwZWNpZmljIG9wdGlvbiBjaGFuZ2VzLCB0aGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRoYXQgaXNcbiAgICogcHJlZmVycmVkIG92ZXIge0BsaW5rIG9uT3B0aW9uQ2hhbmdlfSB3aGVuIG9ubHkgYSBzaW5nbGUgb3B0aW9uIGlzIGJlaW5nIGxpc3RlbmVkIHRvLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuICBvblNwZWNpZmljT3B0aW9uQ2hhbmdlPFQgZXh0ZW5kcyBrZXlvZiBJVGVybWluYWxPcHRpb25zPihrZXk6IFQsIGxpc3RlbmVyOiAoYXJnMTogUmVxdWlyZWQ8SVRlcm1pbmFsT3B0aW9ucz5bVF0pID0+IGFueSk6IElEaXNwb3NhYmxlO1xuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIGZvciB3aGVuIGEgc2V0IG9mIHNwZWNpZmljIG9wdGlvbnMgY2hhbmdlLCB0aGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kXG4gICAqIHRoYXQgaXMgcHJlZmVycmVkIG92ZXIge0BsaW5rIG9uT3B0aW9uQ2hhbmdlfSB3aGVuIG11bHRpcGxlIG9wdGlvbnMgYXJlIGJlaW5nIGxpc3RlbmVkIHRvIGFuZFxuICAgKiBoYW5kbGVkIHRoZSBzYW1lIHdheS5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgb25NdWx0aXBsZU9wdGlvbkNoYW5nZShrZXlzOiAoa2V5b2YgSVRlcm1pbmFsT3B0aW9ucylbXSwgbGlzdGVuZXI6ICgpID0+IGFueSk6IElEaXNwb3NhYmxlO1xufVxuXG5leHBvcnQgdHlwZSBGb250V2VpZ2h0ID0gJ25vcm1hbCcgfCAnYm9sZCcgfCAnMTAwJyB8ICcyMDAnIHwgJzMwMCcgfCAnNDAwJyB8ICc1MDAnIHwgJzYwMCcgfCAnNzAwJyB8ICc4MDAnIHwgJzkwMCcgfCBudW1iZXI7XG5leHBvcnQgdHlwZSBMb2dMZXZlbCA9ICd0cmFjZScgfCAnZGVidWcnIHwgJ2luZm8nIHwgJ3dhcm4nIHwgJ2Vycm9yJyB8ICdvZmYnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElUZXJtaW5hbE9wdGlvbnMge1xuICBhbGxvd1Byb3Bvc2VkQXBpPzogYm9vbGVhbjtcbiAgYWxsb3dUcmFuc3BhcmVuY3k/OiBib29sZWFuO1xuICBhbHRDbGlja01vdmVzQ3Vyc29yPzogYm9vbGVhbjtcbiAgY29scz86IG51bWJlcjtcbiAgY29udmVydEVvbD86IGJvb2xlYW47XG4gIGN1cnNvckJsaW5rPzogYm9vbGVhbjtcbiAgY3Vyc29yU3R5bGU/OiBDdXJzb3JTdHlsZTtcbiAgY3Vyc29yV2lkdGg/OiBudW1iZXI7XG4gIGN1cnNvckluYWN0aXZlU3R5bGU/OiBDdXJzb3JJbmFjdGl2ZVN0eWxlO1xuICBjdXN0b21HbHlwaHM/OiBib29sZWFuO1xuICBkaXNhYmxlU3RkaW4/OiBib29sZWFuO1xuICBkb2N1bWVudE92ZXJyaWRlPzogYW55IHwgbnVsbDtcbiAgZHJhd0JvbGRUZXh0SW5CcmlnaHRDb2xvcnM/OiBib29sZWFuO1xuICBmYXN0U2Nyb2xsTW9kaWZpZXI/OiAnbm9uZScgfCAnYWx0JyB8ICdjdHJsJyB8ICdzaGlmdCc7XG4gIGZhc3RTY3JvbGxTZW5zaXRpdml0eT86IG51bWJlcjtcbiAgZm9udFNpemU/OiBudW1iZXI7XG4gIGZvbnRGYW1pbHk/OiBzdHJpbmc7XG4gIGZvbnRXZWlnaHQ/OiBGb250V2VpZ2h0O1xuICBmb250V2VpZ2h0Qm9sZD86IEZvbnRXZWlnaHQ7XG4gIGlnbm9yZUJyYWNrZXRlZFBhc3RlTW9kZT86IGJvb2xlYW47XG4gIGxldHRlclNwYWNpbmc/OiBudW1iZXI7XG4gIGxpbmVIZWlnaHQ/OiBudW1iZXI7XG4gIGxpbmtIYW5kbGVyPzogSUxpbmtIYW5kbGVyIHwgbnVsbDtcbiAgbG9nTGV2ZWw/OiBMb2dMZXZlbDtcbiAgbG9nZ2VyPzogSUxvZ2dlciB8IG51bGw7XG4gIG1hY09wdGlvbklzTWV0YT86IGJvb2xlYW47XG4gIG1hY09wdGlvbkNsaWNrRm9yY2VzU2VsZWN0aW9uPzogYm9vbGVhbjtcbiAgbWluaW11bUNvbnRyYXN0UmF0aW8/OiBudW1iZXI7XG4gIHJlc2NhbGVPdmVybGFwcGluZ0dseXBocz86IGJvb2xlYW47XG4gIHJpZ2h0Q2xpY2tTZWxlY3RzV29yZD86IGJvb2xlYW47XG4gIHJvd3M/OiBudW1iZXI7XG4gIHNjcmVlblJlYWRlck1vZGU/OiBib29sZWFuO1xuICBzY3JvbGxiYWNrPzogbnVtYmVyO1xuICBzY3JvbGxPblVzZXJJbnB1dD86IGJvb2xlYW47XG4gIHNjcm9sbFNlbnNpdGl2aXR5PzogbnVtYmVyO1xuICBzbW9vdGhTY3JvbGxEdXJhdGlvbj86IG51bWJlcjtcbiAgdGFiU3RvcFdpZHRoPzogbnVtYmVyO1xuICB0aGVtZT86IElUaGVtZTtcbiAgd2luZG93c01vZGU/OiBib29sZWFuO1xuICB3aW5kb3dzUHR5PzogSVdpbmRvd3NQdHk7XG4gIHdpbmRvd09wdGlvbnM/OiBJV2luZG93T3B0aW9ucztcbiAgd29yZFNlcGFyYXRvcj86IHN0cmluZztcbiAgb3ZlcnZpZXdSdWxlcldpZHRoPzogbnVtYmVyO1xuXG4gIFtrZXk6IHN0cmluZ106IGFueTtcbiAgY2FuY2VsRXZlbnRzOiBib29sZWFuO1xuICB0ZXJtTmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElUaGVtZSB7XG4gIGZvcmVncm91bmQ/OiBzdHJpbmc7XG4gIGJhY2tncm91bmQ/OiBzdHJpbmc7XG4gIGN1cnNvcj86IHN0cmluZztcbiAgY3Vyc29yQWNjZW50Pzogc3RyaW5nO1xuICBzZWxlY3Rpb25Gb3JlZ3JvdW5kPzogc3RyaW5nO1xuICBzZWxlY3Rpb25CYWNrZ3JvdW5kPzogc3RyaW5nO1xuICBzZWxlY3Rpb25JbmFjdGl2ZUJhY2tncm91bmQ/OiBzdHJpbmc7XG4gIGJsYWNrPzogc3RyaW5nO1xuICByZWQ/OiBzdHJpbmc7XG4gIGdyZWVuPzogc3RyaW5nO1xuICB5ZWxsb3c/OiBzdHJpbmc7XG4gIGJsdWU/OiBzdHJpbmc7XG4gIG1hZ2VudGE/OiBzdHJpbmc7XG4gIGN5YW4/OiBzdHJpbmc7XG4gIHdoaXRlPzogc3RyaW5nO1xuICBicmlnaHRCbGFjaz86IHN0cmluZztcbiAgYnJpZ2h0UmVkPzogc3RyaW5nO1xuICBicmlnaHRHcmVlbj86IHN0cmluZztcbiAgYnJpZ2h0WWVsbG93Pzogc3RyaW5nO1xuICBicmlnaHRCbHVlPzogc3RyaW5nO1xuICBicmlnaHRNYWdlbnRhPzogc3RyaW5nO1xuICBicmlnaHRDeWFuPzogc3RyaW5nO1xuICBicmlnaHRXaGl0ZT86IHN0cmluZztcbiAgZXh0ZW5kZWRBbnNpPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBjb25zdCBJT3NjTGlua1NlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SU9zY0xpbmtTZXJ2aWNlPignT3NjTGlua1NlcnZpY2UnKTtcbmV4cG9ydCBpbnRlcmZhY2UgSU9zY0xpbmtTZXJ2aWNlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBsaW5rIHRvIHRoZSBzZXJ2aWNlLCByZXR1cm5pbmcgdGhlIGxpbmsgSUQuIFRoZSBsaW5rIGRhdGEgaXMgbWFuYWdlZCBieSB0aGlzXG4gICAqIHNlcnZpY2UgYW5kIHdpbGwgYmUgZnJlZWQgd2hlbiB0aGlzIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uIGlzIHRyaW1tZWQgb2ZmIHRoZSBidWZmZXIuXG4gICAqL1xuICByZWdpc3RlckxpbmsobGlua0RhdGE6IElPc2NMaW5rRGF0YSk6IG51bWJlcjtcbiAgLyoqXG4gICAqIEFkZHMgYSBsaW5lIHRvIGEgbGluayBpZiBuZWVkZWQuXG4gICAqL1xuICBhZGRMaW5lVG9MaW5rKGxpbmtJZDogbnVtYmVyLCB5OiBudW1iZXIpOiB2b2lkO1xuICAvKiogR2V0IHRoZSBsaW5rIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGEgbGluayBJRC4gKi9cbiAgZ2V0TGlua0RhdGEobGlua0lkOiBudW1iZXIpOiBJT3NjTGlua0RhdGEgfCB1bmRlZmluZWQ7XG59XG5cbi8qXG4gKiBXaWR0aCBhbmQgR3JhcGhlbWVfQ2x1c3Rlcl9CcmVhayBwcm9wZXJ0aWVzIG9mIGEgY2hhcmFjdGVyIGFzIGEgYml0IG1hc2suXG4gKlxuICogYml0IDA6IHNob3VsZEpvaW4gLSBzaG91bGQgY29tYmluZSB3aXRoIHByZWNlZGluZyBjaGFyYWN0ZXIuXG4gKiBiaXQgMS4uMjogd2N3aWR0aCAtIHNlZSBVbmljb2RlQ2hhcldpZHRoLlxuICogYml0IDMuLjMxOiBjbGFzcyBvZiBjaGFyYWN0ZXIgKGN1cnJlbnRseSBvbmx5IDQgYml0cyBhcmUgdXNlZCkuXG4gKiAgIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmVkIGdyYXBoZW1lIGNsdXN0ZXJpbmcgLSBpLmUuIHdoaWNoIGNvZGVwb2ludHNcbiAqICAgYXJlIHRvIGJlIGNvbWJpbmVkIGludG8gYSBzaW5nbGUgY29tcG91bmQgY2hhcmFjdGVyLlxuICpcbiAqIFVzZSB0aGUgVW5pY29kZVNlcnZpY2Ugc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZVByb3BlcnR5VmFsdWUgdG8gY3JlYXRlIGFcbiAqIFVuaWNvZGVDaGFyUHJvcGVydGllczsgdXNlIGV4dHJhY3RTaG91bGRKb2luLCBleHRyYWN0V2lkdGgsIGFuZFxuICogZXh0cmFjdENoYXJLaW5kIHRvIGV4dHJhY3QgdGhlIGNvbXBvbmVudHMuXG4gKi9cbmV4cG9ydCB0eXBlIFVuaWNvZGVDaGFyUHJvcGVydGllcyA9IG51bWJlcjtcblxuLyoqXG4gKiBXaWR0aCBpbiBjb2x1bW5zIG9mIGEgY2hhcmFjdGVyLlxuICogSW4gYSBDSksgY29udGV4dCwgXCJoYWxmLXdpZHRoXCIgY2hhcmFjdGVycyAoc3VjaCBhcyBMYXRpbikgYXJlIHdpZHRoIDEsXG4gKiB3aGlsZSBcImZ1bGwtd2lkdGhcIiBjaGFyYWN0ZXJzIChzdWNoIGFzIEthbmppKSBhcmUgMiBjb2x1bW5zIHdpZGUuXG4gKiBDb21iaW5pbmcgY2hhcmFjdGVycyAoc3VjaCBhcyBhY2NlbnRzKSBhcmUgd2lkdGggMC5cbiAqL1xuZXhwb3J0IHR5cGUgVW5pY29kZUNoYXJXaWR0aCA9IDAgfCAxIHwgMjtcblxuZXhwb3J0IGNvbnN0IElVbmljb2RlU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJVW5pY29kZVNlcnZpY2U+KCdVbmljb2RlU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJVW5pY29kZVNlcnZpY2Uge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcbiAgLyoqIFJlZ2lzdGVyIGFuIFVuaWNvZGUgdmVyc2lvbiBwcm92aWRlci4gKi9cbiAgcmVnaXN0ZXIocHJvdmlkZXI6IElVbmljb2RlVmVyc2lvblByb3ZpZGVyKTogdm9pZDtcbiAgLyoqIFJlZ2lzdGVyZWQgVW5pY29kZSB2ZXJzaW9ucy4gKi9cbiAgcmVhZG9ubHkgdmVyc2lvbnM6IHN0cmluZ1tdO1xuICAvKiogQ3VycmVudGx5IGFjdGl2ZSB2ZXJzaW9uLiAqL1xuICBhY3RpdmVWZXJzaW9uOiBzdHJpbmc7XG4gIC8qKiBFdmVudCB0cmlnZ2VyZWQsIHdoZW4gYWN0aXZhdGUgdmVyc2lvbiBjaGFuZ2VkLiAqL1xuICByZWFkb25seSBvbkNoYW5nZTogSUV2ZW50PHN0cmluZz47XG5cbiAgLyoqXG4gICAqIFVuaWNvZGUgdmVyc2lvbiBkZXBlbmRlbnRcbiAgICovXG4gIHdjd2lkdGgoY29kZXBvaW50OiBudW1iZXIpOiBVbmljb2RlQ2hhcldpZHRoO1xuICBnZXRTdHJpbmdDZWxsV2lkdGgoczogc3RyaW5nKTogbnVtYmVyO1xuICAvKipcbiAgICogUmV0dXJuIGNoYXJhY3RlciB3aWR0aCBhbmQgdHlwZSBmb3IgZ3JhcGhlbWUgY2x1c3RlcmluZy5cbiAgICogSWYgcHJlY2VkaW5nICE9IDAsIGl0IGlzIHRoZSByZXR1cm4gY29kZSBmcm9tIHRoZSBwcmV2aW91cyBjaGFyYWN0ZXI7XG4gICAqIGluIHRoYXQgY2FzZSB0aGUgcmVzdWx0IHNwZWNpZmllcyBpZiB0aGUgY2hhcmFjdGVycyBzaG91bGQgYmUgam9pbmVkLlxuICAgKi9cbiAgY2hhclByb3BlcnRpZXMoY29kZXBvaW50OiBudW1iZXIsIHByZWNlZGluZzogVW5pY29kZUNoYXJQcm9wZXJ0aWVzKTogVW5pY29kZUNoYXJQcm9wZXJ0aWVzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElVbmljb2RlVmVyc2lvblByb3ZpZGVyIHtcbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xuICB3Y3dpZHRoKHVjczogbnVtYmVyKTogVW5pY29kZUNoYXJXaWR0aDtcbiAgY2hhclByb3BlcnRpZXMoY29kZXBvaW50OiBudW1iZXIsIHByZWNlZGluZzogVW5pY29kZUNoYXJQcm9wZXJ0aWVzKTogVW5pY29kZUNoYXJQcm9wZXJ0aWVzO1xufVxuXG5leHBvcnQgY29uc3QgSURlY29yYXRpb25TZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElEZWNvcmF0aW9uU2VydmljZT4oJ0RlY29yYXRpb25TZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElEZWNvcmF0aW9uU2VydmljZSBleHRlbmRzIElEaXNwb3NhYmxlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IGRlY29yYXRpb25zOiBJdGVyYWJsZUl0ZXJhdG9yPElJbnRlcm5hbERlY29yYXRpb24+O1xuICByZWFkb25seSBvbkRlY29yYXRpb25SZWdpc3RlcmVkOiBJRXZlbnQ8SUludGVybmFsRGVjb3JhdGlvbj47XG4gIHJlYWRvbmx5IG9uRGVjb3JhdGlvblJlbW92ZWQ6IElFdmVudDxJSW50ZXJuYWxEZWNvcmF0aW9uPjtcbiAgcmVnaXN0ZXJEZWNvcmF0aW9uKGRlY29yYXRpb25PcHRpb25zOiBJRGVjb3JhdGlvbk9wdGlvbnMpOiBJRGVjb3JhdGlvbiB8IHVuZGVmaW5lZDtcbiAgcmVzZXQoKTogdm9pZDtcbiAgLyoqXG4gICAqIFRyaWdnZXIgYSBjYWxsYmFjayBvdmVyIHRoZSBkZWNvcmF0aW9uIGF0IGEgY2VsbCAoaW4gbm8gcGFydGljdWxhciBvcmRlcikuIFRoaXMgdXNlcyBhIGNhbGxiYWNrXG4gICAqIGluc3RlYWQgb2YgYW4gaXRlcmF0b3IgYXMgaXQncyB0eXBpY2FsbHkgdXNlZCBpbiBob3QgY29kZSBwYXRocy5cbiAgICovXG4gIGZvckVhY2hEZWNvcmF0aW9uQXRDZWxsKHg6IG51bWJlciwgbGluZTogbnVtYmVyLCBsYXllcjogJ2JvdHRvbScgfCAndG9wJyB8IHVuZGVmaW5lZCwgY2FsbGJhY2s6IChkZWNvcmF0aW9uOiBJSW50ZXJuYWxEZWNvcmF0aW9uKSA9PiB2b2lkKTogdm9pZDtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSUludGVybmFsRGVjb3JhdGlvbiBleHRlbmRzIElEZWNvcmF0aW9uIHtcbiAgcmVhZG9ubHkgb3B0aW9uczogSURlY29yYXRpb25PcHRpb25zO1xuICByZWFkb25seSBiYWNrZ3JvdW5kQ29sb3JSR0I6IElDb2xvciB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgZm9yZWdyb3VuZENvbG9yUkdCOiBJQ29sb3IgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IG9uUmVuZGVyRW1pdHRlcjogSUV2ZW50RW1pdHRlcjxIVE1MRWxlbWVudD47XG59XG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqXG4gKiAoRVhQRVJJTUVOVEFMKSBUaGlzIEFkZG9uIGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50XG4gKi9cblxuaW1wb3J0IHR5cGUgeyBJQnVmZmVyLCBJQnVmZmVyQ2VsbCwgSUJ1ZmZlclJhbmdlLCBJVGVybWluYWxBZGRvbiwgVGVybWluYWwgfSBmcm9tICdAeHRlcm0veHRlcm0nO1xuaW1wb3J0IHR5cGUgeyBJSFRNTFNlcmlhbGl6ZU9wdGlvbnMsIFNlcmlhbGl6ZUFkZG9uIGFzIElTZXJpYWxpemVBcGksIElTZXJpYWxpemVPcHRpb25zLCBJU2VyaWFsaXplUmFuZ2UgfSBmcm9tICdAeHRlcm0vYWRkb24tc2VyaWFsaXplJztcbmltcG9ydCB7IERFRkFVTFRfQU5TSV9DT0xPUlMgfSBmcm9tICdicm93c2VyL3NlcnZpY2VzL1RoZW1lU2VydmljZSc7XG5pbXBvcnQgeyBJQXR0cmlidXRlRGF0YSwgSUNvbG9yIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcblxuZnVuY3Rpb24gY29uc3RyYWluKHZhbHVlOiBudW1iZXIsIGxvdzogbnVtYmVyLCBoaWdoOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5tYXgobG93LCBNYXRoLm1pbih2YWx1ZSwgaGlnaCkpO1xufVxuXG4vLyBUT0RPOiBSZWZpbmUgdGhpcyB0ZW1wbGF0ZSBjbGFzcyBsYXRlclxuYWJzdHJhY3QgY2xhc3MgQmFzZVNlcmlhbGl6ZUhhbmRsZXIge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2J1ZmZlcjogSUJ1ZmZlclxuICApIHtcbiAgfVxuXG4gIHB1YmxpYyBzZXJpYWxpemUocmFuZ2U6IElCdWZmZXJSYW5nZSwgZXhjbHVkZUZpbmFsQ3Vyc29yUG9zaXRpb24/OiBib29sZWFuKTogc3RyaW5nIHtcbiAgICAvLyB3ZSBuZWVkIHR3byBvZiB0aGVtIHRvIGZsaXAgYmV0d2VlbiBvbGQgYW5kIG5ldyBjZWxsXG4gICAgY29uc3QgY2VsbDEgPSB0aGlzLl9idWZmZXIuZ2V0TnVsbENlbGwoKTtcbiAgICBjb25zdCBjZWxsMiA9IHRoaXMuX2J1ZmZlci5nZXROdWxsQ2VsbCgpO1xuICAgIGxldCBvbGRDZWxsID0gY2VsbDE7XG5cbiAgICBjb25zdCBzdGFydFJvdyA9IHJhbmdlLnN0YXJ0Lnk7XG4gICAgY29uc3QgZW5kUm93ID0gcmFuZ2UuZW5kLnk7XG4gICAgY29uc3Qgc3RhcnRDb2x1bW4gPSByYW5nZS5zdGFydC54O1xuICAgIGNvbnN0IGVuZENvbHVtbiA9IHJhbmdlLmVuZC54O1xuXG4gICAgdGhpcy5fYmVmb3JlU2VyaWFsaXplKGVuZFJvdyAtIHN0YXJ0Um93LCBzdGFydFJvdywgZW5kUm93KTtcblxuICAgIGZvciAobGV0IHJvdyA9IHN0YXJ0Um93OyByb3cgPD0gZW5kUm93OyByb3crKykge1xuICAgICAgY29uc3QgbGluZSA9IHRoaXMuX2J1ZmZlci5nZXRMaW5lKHJvdyk7XG4gICAgICBpZiAobGluZSkge1xuICAgICAgICBjb25zdCBzdGFydExpbmVDb2x1bW4gPSByb3cgPT09IHJhbmdlLnN0YXJ0LnkgPyBzdGFydENvbHVtbiA6IDA7XG4gICAgICAgIGNvbnN0IGVuZExpbmVDb2x1bW4gPSByb3cgPT09IHJhbmdlLmVuZC55ID8gZW5kQ29sdW1uOiBsaW5lLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgY29sID0gc3RhcnRMaW5lQ29sdW1uOyBjb2wgPCBlbmRMaW5lQ29sdW1uOyBjb2wrKykge1xuICAgICAgICAgIGNvbnN0IGMgPSBsaW5lLmdldENlbGwoY29sLCBvbGRDZWxsID09PSBjZWxsMSA/IGNlbGwyIDogY2VsbDEpO1xuICAgICAgICAgIGlmICghYykge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBDYW4ndCBnZXQgY2VsbCBhdCByb3c9JHtyb3d9LCBjb2w9JHtjb2x9YCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fbmV4dENlbGwoYywgb2xkQ2VsbCwgcm93LCBjb2wpO1xuICAgICAgICAgIG9sZENlbGwgPSBjO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLl9yb3dFbmQocm93LCByb3cgPT09IGVuZFJvdyk7XG4gICAgfVxuXG4gICAgdGhpcy5fYWZ0ZXJTZXJpYWxpemUoKTtcblxuICAgIHJldHVybiB0aGlzLl9zZXJpYWxpemVTdHJpbmcoZXhjbHVkZUZpbmFsQ3Vyc29yUG9zaXRpb24pO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9uZXh0Q2VsbChjZWxsOiBJQnVmZmVyQ2VsbCwgb2xkQ2VsbDogSUJ1ZmZlckNlbGwsIHJvdzogbnVtYmVyLCBjb2w6IG51bWJlcik6IHZvaWQgeyB9XG4gIHByb3RlY3RlZCBfcm93RW5kKHJvdzogbnVtYmVyLCBpc0xhc3RSb3c6IGJvb2xlYW4pOiB2b2lkIHsgfVxuICBwcm90ZWN0ZWQgX2JlZm9yZVNlcmlhbGl6ZShyb3dzOiBudW1iZXIsIHN0YXJ0Um93OiBudW1iZXIsIGVuZFJvdzogbnVtYmVyKTogdm9pZCB7IH1cbiAgcHJvdGVjdGVkIF9hZnRlclNlcmlhbGl6ZSgpOiB2b2lkIHsgfVxuICBwcm90ZWN0ZWQgX3NlcmlhbGl6ZVN0cmluZyhleGNsdWRlRmluYWxDdXJzb3JQb3NpdGlvbj86IGJvb2xlYW4pOiBzdHJpbmcgeyByZXR1cm4gJyc7IH1cbn1cblxuZnVuY3Rpb24gZXF1YWxGZyhjZWxsMTogSUJ1ZmZlckNlbGwgfCBJQXR0cmlidXRlRGF0YSwgY2VsbDI6IElCdWZmZXJDZWxsKTogYm9vbGVhbiB7XG4gIHJldHVybiBjZWxsMS5nZXRGZ0NvbG9yTW9kZSgpID09PSBjZWxsMi5nZXRGZ0NvbG9yTW9kZSgpXG4gICAgJiYgY2VsbDEuZ2V0RmdDb2xvcigpID09PSBjZWxsMi5nZXRGZ0NvbG9yKCk7XG59XG5cbmZ1bmN0aW9uIGVxdWFsQmcoY2VsbDE6IElCdWZmZXJDZWxsIHwgSUF0dHJpYnV0ZURhdGEsIGNlbGwyOiBJQnVmZmVyQ2VsbCk6IGJvb2xlYW4ge1xuICByZXR1cm4gY2VsbDEuZ2V0QmdDb2xvck1vZGUoKSA9PT0gY2VsbDIuZ2V0QmdDb2xvck1vZGUoKVxuICAgICYmIGNlbGwxLmdldEJnQ29sb3IoKSA9PT0gY2VsbDIuZ2V0QmdDb2xvcigpO1xufVxuXG5mdW5jdGlvbiBlcXVhbEZsYWdzKGNlbGwxOiBJQnVmZmVyQ2VsbCB8IElBdHRyaWJ1dGVEYXRhLCBjZWxsMjogSUJ1ZmZlckNlbGwpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNlbGwxLmlzSW52ZXJzZSgpID09PSBjZWxsMi5pc0ludmVyc2UoKVxuICAgICYmIGNlbGwxLmlzQm9sZCgpID09PSBjZWxsMi5pc0JvbGQoKVxuICAgICYmIGNlbGwxLmlzVW5kZXJsaW5lKCkgPT09IGNlbGwyLmlzVW5kZXJsaW5lKClcbiAgICAmJiBjZWxsMS5pc092ZXJsaW5lKCkgPT09IGNlbGwyLmlzT3ZlcmxpbmUoKVxuICAgICYmIGNlbGwxLmlzQmxpbmsoKSA9PT0gY2VsbDIuaXNCbGluaygpXG4gICAgJiYgY2VsbDEuaXNJbnZpc2libGUoKSA9PT0gY2VsbDIuaXNJbnZpc2libGUoKVxuICAgICYmIGNlbGwxLmlzSXRhbGljKCkgPT09IGNlbGwyLmlzSXRhbGljKClcbiAgICAmJiBjZWxsMS5pc0RpbSgpID09PSBjZWxsMi5pc0RpbSgpXG4gICAgJiYgY2VsbDEuaXNTdHJpa2V0aHJvdWdoKCkgPT09IGNlbGwyLmlzU3RyaWtldGhyb3VnaCgpO1xufVxuXG5jbGFzcyBTdHJpbmdTZXJpYWxpemVIYW5kbGVyIGV4dGVuZHMgQmFzZVNlcmlhbGl6ZUhhbmRsZXIge1xuICBwcml2YXRlIF9yb3dJbmRleDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfYWxsUm93czogc3RyaW5nW10gPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICBwcml2YXRlIF9hbGxSb3dTZXBhcmF0b3JzOiBzdHJpbmdbXSA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gIHByaXZhdGUgX2N1cnJlbnRSb3c6IHN0cmluZyA9ICcnO1xuICBwcml2YXRlIF9udWxsQ2VsbENvdW50OiBudW1iZXIgPSAwO1xuXG4gIC8vIHdlIGNhbiBzZWUgYSBmdWxsIGNvbG9yZWQgY2VsbCBhbmQgYSBudWxsIGNlbGwgdGhhdCBvbmx5IGhhdmUgYmFja2dyb3VuZCB0aGUgc2FtZSBzdHlsZVxuICAvLyBidXQgdGhlIGluZm9ybWF0aW9uIGlzbid0IHByZXNlcnZlZCBieSBudWxsIGNlbGwgaXRzZWxmXG4gIC8vIHNvIHdlZSBuZWVkIHRvIHJlY29yZCBpdCB3aGVuIHJlcXVpcmVkLlxuICBwcml2YXRlIF9jdXJzb3JTdHlsZTogSUJ1ZmZlckNlbGwgPSB0aGlzLl9idWZmZXIuZ2V0TnVsbENlbGwoKTtcblxuICAvLyB3aGVyZSBleGFjdCB0aGUgY3Vyc29yIHN0eWxlcyBjb21lcyBmcm9tXG4gIC8vIGJlY2F1c2Ugd2UgY2FuJ3QgY29weSB0aGUgY2VsbCBkaXJlY3RseVxuICAvLyBzbyB3ZSByZW1lbWJlciB3aGVyZSB0aGUgY29udGVudCBjb21lcyBmcm9tIGluc3RlYWRcbiAgcHJpdmF0ZSBfY3Vyc29yU3R5bGVSb3c6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2N1cnNvclN0eWxlQ29sOiBudW1iZXIgPSAwO1xuXG4gIC8vIHRoaXMgaXMgYSBudWxsIGNlbGwgZm9yIHJlZmVyZW5jZSBmb3IgY2hlY2tpbmcgd2hldGhlciBiYWNrZ3JvdW5kIGlzIGVtcHR5IG9yIG5vdFxuICBwcml2YXRlIF9iYWNrZ3JvdW5kQ2VsbDogSUJ1ZmZlckNlbGwgPSB0aGlzLl9idWZmZXIuZ2V0TnVsbENlbGwoKTtcblxuICBwcml2YXRlIF9maXJzdFJvdzogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfbGFzdEN1cnNvclJvdzogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfbGFzdEN1cnNvckNvbDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfbGFzdENvbnRlbnRDdXJzb3JSb3c6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2xhc3RDb250ZW50Q3Vyc29yQ29sOiBudW1iZXIgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGJ1ZmZlcjogSUJ1ZmZlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90ZXJtaW5hbDogVGVybWluYWxcbiAgKSB7XG4gICAgc3VwZXIoYnVmZmVyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfYmVmb3JlU2VyaWFsaXplKHJvd3M6IG51bWJlciwgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9hbGxSb3dzID0gbmV3IEFycmF5PHN0cmluZz4ocm93cyk7XG4gICAgdGhpcy5fbGFzdENvbnRlbnRDdXJzb3JSb3cgPSBzdGFydDtcbiAgICB0aGlzLl9sYXN0Q3Vyc29yUm93ID0gc3RhcnQ7XG4gICAgdGhpcy5fZmlyc3RSb3cgPSBzdGFydDtcbiAgfVxuXG4gIHByaXZhdGUgX3RoaXNSb3dMYXN0Q2hhcjogSUJ1ZmZlckNlbGwgPSB0aGlzLl9idWZmZXIuZ2V0TnVsbENlbGwoKTtcbiAgcHJpdmF0ZSBfdGhpc1Jvd0xhc3RTZWNvbmRDaGFyOiBJQnVmZmVyQ2VsbCA9IHRoaXMuX2J1ZmZlci5nZXROdWxsQ2VsbCgpO1xuICBwcml2YXRlIF9uZXh0Um93Rmlyc3RDaGFyOiBJQnVmZmVyQ2VsbCA9IHRoaXMuX2J1ZmZlci5nZXROdWxsQ2VsbCgpO1xuICBwcm90ZWN0ZWQgX3Jvd0VuZChyb3c6IG51bWJlciwgaXNMYXN0Um93OiBib29sZWFuKTogdm9pZCB7XG4gICAgLy8gaWYgdGhlcmUgaXMgY29sb3JmdWwgZW1wdHkgY2VsbCBhdCBsaW5lIGVuZCwgd2hlIG11c3QgcGFkIGl0IGJhY2ssIG9yIHRoZSB0aGUgY29sb3IgYmxvY2tcbiAgICAvLyB3aWxsIG1pc3NpbmdcbiAgICBpZiAodGhpcy5fbnVsbENlbGxDb3VudCA+IDAgJiYgIWVxdWFsQmcodGhpcy5fY3Vyc29yU3R5bGUsIHRoaXMuX2JhY2tncm91bmRDZWxsKSkge1xuICAgICAgLy8gdXNlIGNsZWFyIHJpZ2h0IHRvIHNldCBiYWNrZ3JvdW5kLlxuICAgICAgdGhpcy5fY3VycmVudFJvdyArPSBgXFx1MDAxYlske3RoaXMuX251bGxDZWxsQ291bnR9WGA7XG4gICAgfVxuXG4gICAgbGV0IHJvd1NlcGFyYXRvciA9ICcnO1xuXG4gICAgLy8gaGFuZGxlIHJvdyBzZXBhcmF0b3JcbiAgICBpZiAoIWlzTGFzdFJvdykge1xuICAgICAgLy8gRW5hYmxlIEJDRVxuICAgICAgaWYgKHJvdyAtIHRoaXMuX2ZpcnN0Um93ID49IHRoaXMuX3Rlcm1pbmFsLnJvd3MpIHtcbiAgICAgICAgdGhpcy5fYnVmZmVyLmdldExpbmUodGhpcy5fY3Vyc29yU3R5bGVSb3cpPy5nZXRDZWxsKHRoaXMuX2N1cnNvclN0eWxlQ29sLCB0aGlzLl9iYWNrZ3JvdW5kQ2VsbCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEZldGNoIGN1cnJlbnQgbGluZVxuICAgICAgY29uc3QgY3VycmVudExpbmUgPSB0aGlzLl9idWZmZXIuZ2V0TGluZShyb3cpITtcbiAgICAgIC8vIEZldGNoIG5leHQgbGluZVxuICAgICAgY29uc3QgbmV4dExpbmUgPSB0aGlzLl9idWZmZXIuZ2V0TGluZShyb3cgKyAxKSE7XG5cbiAgICAgIGlmICghbmV4dExpbmUuaXNXcmFwcGVkKSB7XG4gICAgICAgIC8vIGp1c3QgaW5zZXJ0IHRoZSBsaW5lIGJyZWFrXG4gICAgICAgIHJvd1NlcGFyYXRvciA9ICdcXHJcXG4nO1xuICAgICAgICAvLyB3ZSBzZW5kZWQgdGhlIGVudGVyXG4gICAgICAgIHRoaXMuX2xhc3RDdXJzb3JSb3cgPSByb3cgKyAxO1xuICAgICAgICB0aGlzLl9sYXN0Q3Vyc29yQ29sID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJvd1NlcGFyYXRvciA9ICcnO1xuICAgICAgICBjb25zdCB0aGlzUm93TGFzdENoYXIgPSBjdXJyZW50TGluZS5nZXRDZWxsKGN1cnJlbnRMaW5lLmxlbmd0aCAtIDEsIHRoaXMuX3RoaXNSb3dMYXN0Q2hhcikhO1xuICAgICAgICBjb25zdCB0aGlzUm93TGFzdFNlY29uZENoYXIgPSBjdXJyZW50TGluZS5nZXRDZWxsKGN1cnJlbnRMaW5lLmxlbmd0aCAtIDIsIHRoaXMuX3RoaXNSb3dMYXN0U2Vjb25kQ2hhcikhO1xuICAgICAgICBjb25zdCBuZXh0Um93Rmlyc3RDaGFyID0gbmV4dExpbmUuZ2V0Q2VsbCgwLCB0aGlzLl9uZXh0Um93Rmlyc3RDaGFyKSE7XG4gICAgICAgIGNvbnN0IGlzTmV4dFJvd0ZpcnN0Q2hhckRvdWJsZVdpZHRoID0gbmV4dFJvd0ZpcnN0Q2hhci5nZXRXaWR0aCgpID4gMTtcblxuICAgICAgICAvLyB2YWxpZGF0ZSB3aGV0aGVyIHRoaXMgbGluZSB3cmFwIGlzIGV2ZXIgcG9zc2libGVcbiAgICAgICAgLy8gd2hpY2ggbWVhbiB3aGV0aGVyIGN1cnNvciBjYW4gcGxhY2VkIGF0IGEgb3ZlcmZsb3cgcG9zaXRpb24gKHggPT09IHJvdykgbmF0dXJhbGx5XG4gICAgICAgIGxldCBpc1ZhbGlkID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIC8vIHlvdSBtdXN0IG91dHB1dCBjaGFyYWN0ZXIgdG8gY2F1c2Ugb3ZlcmZsb3csIGNvbnRyb2wgc2VxdWVuY2UgY2FuJ3QgZG8gdGhpc1xuICAgICAgICAgIG5leHRSb3dGaXJzdENoYXIuZ2V0Q2hhcnMoKSAmJlxuICAgICAgICAgICAgaXNOZXh0Um93Rmlyc3RDaGFyRG91YmxlV2lkdGggPyB0aGlzLl9udWxsQ2VsbENvdW50IDw9IDEgOiB0aGlzLl9udWxsQ2VsbENvdW50IDw9IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgLy8gdGhlIGxhc3QgY2hhcmFjdGVyIGNhbid0IGJlIG51bGwsXG4gICAgICAgICAgICAvLyB5b3UgY2FuJ3QgdXNlIGNvbnRyb2wgc2VxdWVuY2UgdG8gbW92ZSBjdXJzb3IgdG8gKHggPT09IHJvdylcbiAgICAgICAgICAgICh0aGlzUm93TGFzdENoYXIuZ2V0Q2hhcnMoKSB8fCB0aGlzUm93TGFzdENoYXIuZ2V0V2lkdGgoKSA9PT0gMCkgJiZcbiAgICAgICAgICAgIC8vIGNoYW5nZSBiYWNrZ3JvdW5kIG9mIHRoZSBmaXJzdCB3cmFwcGVkIGNlbGwgYWxzbyBhZmZlY3RzIEJDRVxuICAgICAgICAgICAgLy8gc28gd2UgbWFyayBpdCBhcyBpbnZhbGlkIHRvIHNpbXBseSB0aGUgcHJvY2VzcyB0byBkZXRlcm1pbmUgbGluZSBzZXBhcmF0b3JcbiAgICAgICAgICAgIGVxdWFsQmcodGhpc1Jvd0xhc3RDaGFyLCBuZXh0Um93Rmlyc3RDaGFyKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgaXNWYWxpZCA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgLy8gdGhlIHNlY29uZCB0byBsYXN0IGNoYXJhY3RlciBjYW4ndCBiZSBudWxsIGlmIHRoZSBuZXh0IGxpbmUgc3RhcnRzIHdpdGggQ0pLLFxuICAgICAgICAgICAgLy8geW91IGNhbid0IHVzZSBjb250cm9sIHNlcXVlbmNlIHRvIG1vdmUgY3Vyc29yIHRvICh4ID09PSByb3cpXG4gICAgICAgICAgICBpc05leHRSb3dGaXJzdENoYXJEb3VibGVXaWR0aCAmJlxuICAgICAgICAgICAgKHRoaXNSb3dMYXN0U2Vjb25kQ2hhci5nZXRDaGFycygpIHx8IHRoaXNSb3dMYXN0U2Vjb25kQ2hhci5nZXRXaWR0aCgpID09PSAwKSAmJlxuICAgICAgICAgICAgLy8gY2hhbmdlIGJhY2tncm91bmQgb2YgdGhlIGZpcnN0IHdyYXBwZWQgY2VsbCBhbHNvIGFmZmVjdHMgQkNFXG4gICAgICAgICAgICAvLyBzbyB3ZSBtYXJrIGl0IGFzIGludmFsaWQgdG8gc2ltcGx5IHRoZSBwcm9jZXNzIHRvIGRldGVybWluZSBsaW5lIHNlcGFyYXRvclxuICAgICAgICAgICAgZXF1YWxCZyh0aGlzUm93TGFzdENoYXIsIG5leHRSb3dGaXJzdENoYXIpICYmXG4gICAgICAgICAgICBlcXVhbEJnKHRoaXNSb3dMYXN0U2Vjb25kQ2hhciwgbmV4dFJvd0ZpcnN0Q2hhcilcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGlzVmFsaWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgICAgIC8vIGZvcmNlIHRoZSB3cmFwIHdpdGggbWFnaWNcbiAgICAgICAgICAvLyBpbnNlcnQgZW5vdWdoIGNoYXJhY3RlciB0byBmb3JjZSB0aGUgd3JhcFxuICAgICAgICAgIHJvd1NlcGFyYXRvciA9ICctJy5yZXBlYXQodGhpcy5fbnVsbENlbGxDb3VudCArIDEpO1xuICAgICAgICAgIC8vIG1vdmUgYmFjayBhbmQgZXJhc2UgbmV4dCBsaW5lIGhlYWRcbiAgICAgICAgICByb3dTZXBhcmF0b3IgKz0gJ1xcdTAwMWJbMURcXHUwMDFiWzFYJztcblxuICAgICAgICAgIGlmICh0aGlzLl9udWxsQ2VsbENvdW50ID4gMCkge1xuICAgICAgICAgICAgLy8gZG8gdGhlc2UgYmVjYXVzZSB3ZSBmaWxsZWQgdGhlIGxhc3Qgc2V2ZXJhbCBudWxsIHNsb3QsIHdoaWNoIHdlIHNob3VsZG4ndFxuICAgICAgICAgICAgcm93U2VwYXJhdG9yICs9ICdcXHUwMDFiW0EnO1xuICAgICAgICAgICAgcm93U2VwYXJhdG9yICs9IGBcXHUwMDFiWyR7Y3VycmVudExpbmUubGVuZ3RoIC0gdGhpcy5fbnVsbENlbGxDb3VudH1DYDtcbiAgICAgICAgICAgIHJvd1NlcGFyYXRvciArPSBgXFx1MDAxYlske3RoaXMuX251bGxDZWxsQ291bnR9WGA7XG4gICAgICAgICAgICByb3dTZXBhcmF0b3IgKz0gYFxcdTAwMWJbJHtjdXJyZW50TGluZS5sZW5ndGggLSB0aGlzLl9udWxsQ2VsbENvdW50fURgO1xuICAgICAgICAgICAgcm93U2VwYXJhdG9yICs9ICdcXHUwMDFiW0InO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFRoaXMgaXMgY29udGVudCBhbmQgbmVlZCB0aGUgYmUgc2VyaWFsaXplZCBldmVuIGl0IGlzIGludmlzaWJsZS5cbiAgICAgICAgICAvLyB3aXRob3V0IHRoaXMsIHdyYXAgd2lsbCBiZSBtaXNzaW5nIGZyb20gb3V0cHV0cy5cbiAgICAgICAgICB0aGlzLl9sYXN0Q29udGVudEN1cnNvclJvdyA9IHJvdyArIDE7XG4gICAgICAgICAgdGhpcy5fbGFzdENvbnRlbnRDdXJzb3JDb2wgPSAwO1xuXG4gICAgICAgICAgLy8gZm9yY2UgY29tbWl0IHRoZSBjdXJzb3IgcG9zaXRpb25cbiAgICAgICAgICB0aGlzLl9sYXN0Q3Vyc29yUm93ID0gcm93ICsgMTtcbiAgICAgICAgICB0aGlzLl9sYXN0Q3Vyc29yQ29sID0gMDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2FsbFJvd3NbdGhpcy5fcm93SW5kZXhdID0gdGhpcy5fY3VycmVudFJvdztcbiAgICB0aGlzLl9hbGxSb3dTZXBhcmF0b3JzW3RoaXMuX3Jvd0luZGV4KytdID0gcm93U2VwYXJhdG9yO1xuICAgIHRoaXMuX2N1cnJlbnRSb3cgPSAnJztcbiAgICB0aGlzLl9udWxsQ2VsbENvdW50ID0gMDtcbiAgfVxuXG4gIHByaXZhdGUgX2RpZmZTdHlsZShjZWxsOiBJQnVmZmVyQ2VsbCB8IElBdHRyaWJ1dGVEYXRhLCBvbGRDZWxsOiBJQnVmZmVyQ2VsbCk6IG51bWJlcltdIHtcbiAgICBjb25zdCBzZ3JTZXE6IG51bWJlcltdID0gW107XG4gICAgY29uc3QgZmdDaGFuZ2VkID0gIWVxdWFsRmcoY2VsbCwgb2xkQ2VsbCk7XG4gICAgY29uc3QgYmdDaGFuZ2VkID0gIWVxdWFsQmcoY2VsbCwgb2xkQ2VsbCk7XG4gICAgY29uc3QgZmxhZ3NDaGFuZ2VkID0gIWVxdWFsRmxhZ3MoY2VsbCwgb2xkQ2VsbCk7XG5cbiAgICBpZiAoZmdDaGFuZ2VkIHx8IGJnQ2hhbmdlZCB8fCBmbGFnc0NoYW5nZWQpIHtcbiAgICAgIGlmIChjZWxsLmlzQXR0cmlidXRlRGVmYXVsdCgpKSB7XG4gICAgICAgIGlmICghb2xkQ2VsbC5pc0F0dHJpYnV0ZURlZmF1bHQoKSkge1xuICAgICAgICAgIHNnclNlcS5wdXNoKDApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZmdDaGFuZ2VkKSB7XG4gICAgICAgICAgY29uc3QgY29sb3IgPSBjZWxsLmdldEZnQ29sb3IoKTtcbiAgICAgICAgICBpZiAoY2VsbC5pc0ZnUkdCKCkpIHsgc2dyU2VxLnB1c2goMzgsIDIsIChjb2xvciA+Pj4gMTYpICYgMHhGRiwgKGNvbG9yID4+PiA4KSAmIDB4RkYsIGNvbG9yICYgMHhGRik7IH1cbiAgICAgICAgICBlbHNlIGlmIChjZWxsLmlzRmdQYWxldHRlKCkpIHtcbiAgICAgICAgICAgIGlmIChjb2xvciA+PSAxNikgeyBzZ3JTZXEucHVzaCgzOCwgNSwgY29sb3IpOyB9XG4gICAgICAgICAgICBlbHNlIHsgc2dyU2VxLnB1c2goY29sb3IgJiA4ID8gOTAgKyAoY29sb3IgJiA3KSA6IDMwICsgKGNvbG9yICYgNykpOyB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgeyBzZ3JTZXEucHVzaCgzOSk7IH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoYmdDaGFuZ2VkKSB7XG4gICAgICAgICAgY29uc3QgY29sb3IgPSBjZWxsLmdldEJnQ29sb3IoKTtcbiAgICAgICAgICBpZiAoY2VsbC5pc0JnUkdCKCkpIHsgc2dyU2VxLnB1c2goNDgsIDIsIChjb2xvciA+Pj4gMTYpICYgMHhGRiwgKGNvbG9yID4+PiA4KSAmIDB4RkYsIGNvbG9yICYgMHhGRik7IH1cbiAgICAgICAgICBlbHNlIGlmIChjZWxsLmlzQmdQYWxldHRlKCkpIHtcbiAgICAgICAgICAgIGlmIChjb2xvciA+PSAxNikgeyBzZ3JTZXEucHVzaCg0OCwgNSwgY29sb3IpOyB9XG4gICAgICAgICAgICBlbHNlIHsgc2dyU2VxLnB1c2goY29sb3IgJiA4ID8gMTAwICsgKGNvbG9yICYgNykgOiA0MCArIChjb2xvciAmIDcpKTsgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHsgc2dyU2VxLnB1c2goNDkpOyB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZsYWdzQ2hhbmdlZCkge1xuICAgICAgICAgIGlmIChjZWxsLmlzSW52ZXJzZSgpICE9PSBvbGRDZWxsLmlzSW52ZXJzZSgpKSB7IHNnclNlcS5wdXNoKGNlbGwuaXNJbnZlcnNlKCkgPyA3IDogMjcpOyB9XG4gICAgICAgICAgaWYgKGNlbGwuaXNCb2xkKCkgIT09IG9sZENlbGwuaXNCb2xkKCkpIHsgc2dyU2VxLnB1c2goY2VsbC5pc0JvbGQoKSA/IDEgOiAyMik7IH1cbiAgICAgICAgICBpZiAoY2VsbC5pc1VuZGVybGluZSgpICE9PSBvbGRDZWxsLmlzVW5kZXJsaW5lKCkpIHsgc2dyU2VxLnB1c2goY2VsbC5pc1VuZGVybGluZSgpID8gNCA6IDI0KTsgfVxuICAgICAgICAgIGlmIChjZWxsLmlzT3ZlcmxpbmUoKSAhPT0gb2xkQ2VsbC5pc092ZXJsaW5lKCkpIHsgc2dyU2VxLnB1c2goY2VsbC5pc092ZXJsaW5lKCkgPyA1MyA6IDU1KTsgfVxuICAgICAgICAgIGlmIChjZWxsLmlzQmxpbmsoKSAhPT0gb2xkQ2VsbC5pc0JsaW5rKCkpIHsgc2dyU2VxLnB1c2goY2VsbC5pc0JsaW5rKCkgPyA1IDogMjUpOyB9XG4gICAgICAgICAgaWYgKGNlbGwuaXNJbnZpc2libGUoKSAhPT0gb2xkQ2VsbC5pc0ludmlzaWJsZSgpKSB7IHNnclNlcS5wdXNoKGNlbGwuaXNJbnZpc2libGUoKSA/IDggOiAyOCk7IH1cbiAgICAgICAgICBpZiAoY2VsbC5pc0l0YWxpYygpICE9PSBvbGRDZWxsLmlzSXRhbGljKCkpIHsgc2dyU2VxLnB1c2goY2VsbC5pc0l0YWxpYygpID8gMyA6IDIzKTsgfVxuICAgICAgICAgIGlmIChjZWxsLmlzRGltKCkgIT09IG9sZENlbGwuaXNEaW0oKSkgeyBzZ3JTZXEucHVzaChjZWxsLmlzRGltKCkgPyAyIDogMjIpOyB9XG4gICAgICAgICAgaWYgKGNlbGwuaXNTdHJpa2V0aHJvdWdoKCkgIT09IG9sZENlbGwuaXNTdHJpa2V0aHJvdWdoKCkpIHsgc2dyU2VxLnB1c2goY2VsbC5pc1N0cmlrZXRocm91Z2goKSA/IDkgOiAyOSk7IH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzZ3JTZXE7XG4gIH1cblxuICBwcm90ZWN0ZWQgX25leHRDZWxsKGNlbGw6IElCdWZmZXJDZWxsLCBvbGRDZWxsOiBJQnVmZmVyQ2VsbCwgcm93OiBudW1iZXIsIGNvbDogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gYSB3aWR0aCAwIGNlbGwgZG9uJ3QgbmVlZCB0byBiZSBjb3VudCBiZWNhdXNlIGl0IGlzIGp1c3QgYSBwbGFjZWhvbGRlciBhZnRlciBhIENKSyBjaGFyYWN0ZXI7XG4gICAgY29uc3QgaXNQbGFjZUhvbGRlckNlbGwgPSBjZWxsLmdldFdpZHRoKCkgPT09IDA7XG5cbiAgICBpZiAoaXNQbGFjZUhvbGRlckNlbGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyB0aGlzIGNlbGwgZG9uJ3QgaGF2ZSBjb250ZW50XG4gICAgY29uc3QgaXNFbXB0eUNlbGwgPSBjZWxsLmdldENoYXJzKCkgPT09ICcnO1xuXG4gICAgY29uc3Qgc2dyU2VxID0gdGhpcy5fZGlmZlN0eWxlKGNlbGwsIHRoaXMuX2N1cnNvclN0eWxlKTtcblxuICAgIC8vIHRoZSBlbXB0eSBjZWxsIHN0eWxlIGlzIG9ubHkgYXNzdW1lZCB0byBiZSBjaGFuZ2VkIHdoZW4gYmFja2dyb3VuZCBjaGFuZ2VkLCBiZWNhdXNlXG4gICAgLy8gZm9yZWdyb3VuZCBpcyBhbHdheXMgMC5cbiAgICBjb25zdCBzdHlsZUNoYW5nZWQgPSBpc0VtcHR5Q2VsbCA/ICFlcXVhbEJnKHRoaXMuX2N1cnNvclN0eWxlLCBjZWxsKSA6IHNnclNlcS5sZW5ndGggPiAwO1xuXG4gICAgLyoqXG4gICAgICogIGhhbmRsZXMgc3R5bGUgY2hhbmdlXG4gICAgICovXG4gICAgaWYgKHN0eWxlQ2hhbmdlZCkge1xuICAgICAgLy8gYmVmb3JlIHVwZGF0ZSB0aGUgc3R5bGUsIHdlIG5lZWQgdG8gZmlsbCBlbXB0eSBjZWxsIGJhY2tcbiAgICAgIGlmICh0aGlzLl9udWxsQ2VsbENvdW50ID4gMCkge1xuICAgICAgICAvLyB1c2UgY2xlYXIgcmlnaHQgdG8gc2V0IGJhY2tncm91bmQuXG4gICAgICAgIGlmICghZXF1YWxCZyh0aGlzLl9jdXJzb3JTdHlsZSwgdGhpcy5fYmFja2dyb3VuZENlbGwpKSB7XG4gICAgICAgICAgdGhpcy5fY3VycmVudFJvdyArPSBgXFx1MDAxYlske3RoaXMuX251bGxDZWxsQ291bnR9WGA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdXNlIG1vdmUgcmlnaHQgdG8gbW92ZSBjdXJzb3IuXG4gICAgICAgIHRoaXMuX2N1cnJlbnRSb3cgKz0gYFxcdTAwMWJbJHt0aGlzLl9udWxsQ2VsbENvdW50fUNgO1xuICAgICAgICB0aGlzLl9udWxsQ2VsbENvdW50ID0gMDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fbGFzdENvbnRlbnRDdXJzb3JSb3cgPSB0aGlzLl9sYXN0Q3Vyc29yUm93ID0gcm93O1xuICAgICAgdGhpcy5fbGFzdENvbnRlbnRDdXJzb3JDb2wgPSB0aGlzLl9sYXN0Q3Vyc29yQ29sID0gY29sO1xuXG4gICAgICB0aGlzLl9jdXJyZW50Um93ICs9IGBcXHUwMDFiWyR7c2dyU2VxLmpvaW4oJzsnKX1tYDtcblxuICAgICAgLy8gdXBkYXRlIHRoZSBsYXN0IGN1cnNvciBzdHlsZVxuICAgICAgY29uc3QgbGluZSA9IHRoaXMuX2J1ZmZlci5nZXRMaW5lKHJvdyk7XG4gICAgICBpZiAobGluZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxpbmUuZ2V0Q2VsbChjb2wsIHRoaXMuX2N1cnNvclN0eWxlKTtcbiAgICAgICAgdGhpcy5fY3Vyc29yU3R5bGVSb3cgPSByb3c7XG4gICAgICAgIHRoaXMuX2N1cnNvclN0eWxlQ29sID0gY29sO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqICBoYW5kbGVzIGFjdHVhbCBjb250ZW50XG4gICAgICovXG4gICAgaWYgKGlzRW1wdHlDZWxsKSB7XG4gICAgICB0aGlzLl9udWxsQ2VsbENvdW50ICs9IGNlbGwuZ2V0V2lkdGgoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuX251bGxDZWxsQ291bnQgPiAwKSB7XG4gICAgICAgIC8vIHdlIGNhbiBqdXN0IGFzc3VtZSB3ZSBoYXZlIHNhbWUgc3R5bGUgd2l0aCBwcmV2aW91cyBvbmUgaGVyZVxuICAgICAgICAvLyBiZWNhdXNlIHN0eWxlIGNoYW5nZSBpcyBoYW5kbGVkIGJ5IHByZXZpb3VzIHN0YWdlXG4gICAgICAgIC8vIHVzZSBtb3ZlIHJpZ2h0IHdoZW4gYmFja2dyb3VuZCBpcyBlbXB0eSwgdXNlIGNsZWFyIHJpZ2h0IHdoZW4gdGhlcmUgaXMgYmFja2dyb3VuZC5cbiAgICAgICAgaWYgKGVxdWFsQmcodGhpcy5fY3Vyc29yU3R5bGUsIHRoaXMuX2JhY2tncm91bmRDZWxsKSkge1xuICAgICAgICAgIHRoaXMuX2N1cnJlbnRSb3cgKz0gYFxcdTAwMWJbJHt0aGlzLl9udWxsQ2VsbENvdW50fUNgO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX2N1cnJlbnRSb3cgKz0gYFxcdTAwMWJbJHt0aGlzLl9udWxsQ2VsbENvdW50fVhgO1xuICAgICAgICAgIHRoaXMuX2N1cnJlbnRSb3cgKz0gYFxcdTAwMWJbJHt0aGlzLl9udWxsQ2VsbENvdW50fUNgO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX251bGxDZWxsQ291bnQgPSAwO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9jdXJyZW50Um93ICs9IGNlbGwuZ2V0Q2hhcnMoKTtcblxuICAgICAgLy8gdXBkYXRlIGN1cnNvclxuICAgICAgdGhpcy5fbGFzdENvbnRlbnRDdXJzb3JSb3cgPSB0aGlzLl9sYXN0Q3Vyc29yUm93ID0gcm93O1xuICAgICAgdGhpcy5fbGFzdENvbnRlbnRDdXJzb3JDb2wgPSB0aGlzLl9sYXN0Q3Vyc29yQ29sID0gY29sICsgY2VsbC5nZXRXaWR0aCgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBfc2VyaWFsaXplU3RyaW5nKGV4Y2x1ZGVGaW5hbEN1cnNvclBvc2l0aW9uOiBib29sZWFuKTogc3RyaW5nIHtcbiAgICBsZXQgcm93RW5kID0gdGhpcy5fYWxsUm93cy5sZW5ndGg7XG5cbiAgICAvLyB0aGUgZml4dXAgaXMgb25seSByZXF1aXJlZCBmb3IgZGF0YSB3aXRob3V0IHNjcm9sbGJhY2tcbiAgICAvLyBiZWNhdXNlIGl0IHdpbGwgYWx3YXlzIGJlIHBsYWNlZCBhdCBsYXN0IGxpbmUgb3RoZXJ3aXNlXG4gICAgaWYgKHRoaXMuX2J1ZmZlci5sZW5ndGggLSB0aGlzLl9maXJzdFJvdyA8PSB0aGlzLl90ZXJtaW5hbC5yb3dzKSB7XG4gICAgICByb3dFbmQgPSB0aGlzLl9sYXN0Q29udGVudEN1cnNvclJvdyArIDEgLSB0aGlzLl9maXJzdFJvdztcbiAgICAgIHRoaXMuX2xhc3RDdXJzb3JDb2wgPSB0aGlzLl9sYXN0Q29udGVudEN1cnNvckNvbDtcbiAgICAgIHRoaXMuX2xhc3RDdXJzb3JSb3cgPSB0aGlzLl9sYXN0Q29udGVudEN1cnNvclJvdztcbiAgICB9XG5cbiAgICBsZXQgY29udGVudCA9ICcnO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dFbmQ7IGkrKykge1xuICAgICAgY29udGVudCArPSB0aGlzLl9hbGxSb3dzW2ldO1xuICAgICAgaWYgKGkgKyAxIDwgcm93RW5kKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gdGhpcy5fYWxsUm93U2VwYXJhdG9yc1tpXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyByZXN0b3JlIHRoZSBjdXJzb3JcbiAgICBpZiAoIWV4Y2x1ZGVGaW5hbEN1cnNvclBvc2l0aW9uKSB7XG4gICAgICBjb25zdCByZWFsQ3Vyc29yUm93ID0gdGhpcy5fYnVmZmVyLmJhc2VZICsgdGhpcy5fYnVmZmVyLmN1cnNvclk7XG4gICAgICBjb25zdCByZWFsQ3Vyc29yQ29sID0gdGhpcy5fYnVmZmVyLmN1cnNvclg7XG5cbiAgICAgIGNvbnN0IGN1cnNvck1vdmVkID0gKHJlYWxDdXJzb3JSb3cgIT09IHRoaXMuX2xhc3RDdXJzb3JSb3cgfHwgcmVhbEN1cnNvckNvbCAhPT0gdGhpcy5fbGFzdEN1cnNvckNvbCk7XG5cbiAgICAgIGNvbnN0IG1vdmVSaWdodCA9IChvZmZzZXQ6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgICAgICBpZiAob2Zmc2V0ID4gMCkge1xuICAgICAgICAgIGNvbnRlbnQgKz0gYFxcdTAwMWJbJHtvZmZzZXR9Q2A7XG4gICAgICAgIH0gZWxzZSBpZiAob2Zmc2V0IDwgMCkge1xuICAgICAgICAgIGNvbnRlbnQgKz0gYFxcdTAwMWJbJHstb2Zmc2V0fURgO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgY29uc3QgbW92ZURvd24gPSAob2Zmc2V0OiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKG9mZnNldCA+IDApIHtcbiAgICAgICAgICBjb250ZW50ICs9IGBcXHUwMDFiWyR7b2Zmc2V0fUJgO1xuICAgICAgICB9IGVsc2UgaWYgKG9mZnNldCA8IDApIHtcbiAgICAgICAgICBjb250ZW50ICs9IGBcXHUwMDFiWyR7LW9mZnNldH1BYDtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgaWYgKGN1cnNvck1vdmVkKSB7XG4gICAgICAgIG1vdmVEb3duKHJlYWxDdXJzb3JSb3cgLSB0aGlzLl9sYXN0Q3Vyc29yUm93KTtcbiAgICAgICAgbW92ZVJpZ2h0KHJlYWxDdXJzb3JDb2wgLSB0aGlzLl9sYXN0Q3Vyc29yQ29sKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXN0b3JlIHRoZSBjdXJzb3IncyBjdXJyZW50IHN0eWxlLCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3h0ZXJtanMveHRlcm0uanMvaXNzdWVzLzM2NzdcbiAgICAvLyBIQUNLOiBJbnRlcm5hbCBBUEkgYWNjZXNzIHNpbmNlIGl0J3MgYXdrd2FyZCB0byBleHBvc2UgdGhpcyBpbiB0aGUgQVBJIGFuZCBzZXJpYWxpemUgd2lsbFxuICAgIC8vIGxpa2VseSBiZSB0aGUgb25seSBjb25zdW1lclxuICAgIGNvbnN0IGN1ckF0dHJEYXRhOiBJQXR0cmlidXRlRGF0YSA9ICh0aGlzLl90ZXJtaW5hbCBhcyBhbnkpLl9jb3JlLl9pbnB1dEhhbmRsZXIuX2N1ckF0dHJEYXRhO1xuICAgIGNvbnN0IHNnclNlcSA9IHRoaXMuX2RpZmZTdHlsZShjdXJBdHRyRGF0YSwgdGhpcy5fY3Vyc29yU3R5bGUpO1xuICAgIGlmIChzZ3JTZXEubGVuZ3RoID4gMCkge1xuICAgICAgY29udGVudCArPSBgXFx1MDAxYlske3NnclNlcS5qb2luKCc7Jyl9bWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRlbnQ7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNlcmlhbGl6ZUFkZG9uIGltcGxlbWVudHMgSVRlcm1pbmFsQWRkb24gLCBJU2VyaWFsaXplQXBpIHtcbiAgcHJpdmF0ZSBfdGVybWluYWw6IFRlcm1pbmFsIHwgdW5kZWZpbmVkO1xuXG4gIHB1YmxpYyBhY3RpdmF0ZSh0ZXJtaW5hbDogVGVybWluYWwpOiB2b2lkIHtcbiAgICB0aGlzLl90ZXJtaW5hbCA9IHRlcm1pbmFsO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2VyaWFsaXplQnVmZmVyQnlTY3JvbGxiYWNrKHRlcm1pbmFsOiBUZXJtaW5hbCwgYnVmZmVyOiBJQnVmZmVyLCBzY3JvbGxiYWNrPzogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBtYXhSb3dzID0gYnVmZmVyLmxlbmd0aDtcbiAgICBjb25zdCBjb3JyZWN0Um93cyA9IChzY3JvbGxiYWNrID09PSB1bmRlZmluZWQpID8gbWF4Um93cyA6IGNvbnN0cmFpbihzY3JvbGxiYWNrICsgdGVybWluYWwucm93cywgMCwgbWF4Um93cyk7XG4gICAgcmV0dXJuIHRoaXMuX3NlcmlhbGl6ZUJ1ZmZlckJ5UmFuZ2UodGVybWluYWwsIGJ1ZmZlciwge1xuICAgICAgc3RhcnQ6IG1heFJvd3MgLSBjb3JyZWN0Um93cyxcbiAgICAgIGVuZDogbWF4Um93cyAtIDFcbiAgICB9LCBmYWxzZSk7XG4gIH1cblxuICBwcml2YXRlIF9zZXJpYWxpemVCdWZmZXJCeVJhbmdlKHRlcm1pbmFsOiBUZXJtaW5hbCwgYnVmZmVyOiBJQnVmZmVyLCByYW5nZTogSVNlcmlhbGl6ZVJhbmdlLCBleGNsdWRlRmluYWxDdXJzb3JQb3NpdGlvbjogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgY29uc3QgaGFuZGxlciA9IG5ldyBTdHJpbmdTZXJpYWxpemVIYW5kbGVyKGJ1ZmZlciwgdGVybWluYWwpO1xuICAgIHJldHVybiBoYW5kbGVyLnNlcmlhbGl6ZSh7XG4gICAgICBzdGFydDogeyB4OiAwLCAgICAgICAgICAgICB5OiB0eXBlb2YgcmFuZ2Uuc3RhcnQgPT09ICdudW1iZXInID8gcmFuZ2Uuc3RhcnQgOiByYW5nZS5zdGFydC5saW5lIH0sXG4gICAgICBlbmQ6ICAgeyB4OiB0ZXJtaW5hbC5jb2xzLCB5OiB0eXBlb2YgcmFuZ2UuZW5kICAgPT09ICdudW1iZXInID8gcmFuZ2UuZW5kICAgOiByYW5nZS5lbmQubGluZSAgIH1cbiAgICB9LCBleGNsdWRlRmluYWxDdXJzb3JQb3NpdGlvbik7XG4gIH1cblxuICBwcml2YXRlIF9zZXJpYWxpemVCdWZmZXJBc0hUTUwodGVybWluYWw6IFRlcm1pbmFsLCBvcHRpb25zOiBQYXJ0aWFsPElIVE1MU2VyaWFsaXplT3B0aW9ucz4pOiBzdHJpbmcge1xuICAgIGNvbnN0IGJ1ZmZlciA9IHRlcm1pbmFsLmJ1ZmZlci5hY3RpdmU7XG4gICAgY29uc3QgaGFuZGxlciA9IG5ldyBIVE1MU2VyaWFsaXplSGFuZGxlcihidWZmZXIsIHRlcm1pbmFsLCBvcHRpb25zKTtcbiAgICBjb25zdCBvbmx5U2VsZWN0aW9uID0gb3B0aW9ucy5vbmx5U2VsZWN0aW9uID8/IGZhbHNlO1xuICAgIGlmICghb25seVNlbGVjdGlvbikge1xuICAgICAgY29uc3QgbWF4Um93cyA9IGJ1ZmZlci5sZW5ndGg7XG4gICAgICBjb25zdCBzY3JvbGxiYWNrID0gb3B0aW9ucy5zY3JvbGxiYWNrO1xuICAgICAgY29uc3QgY29ycmVjdFJvd3MgPSAoc2Nyb2xsYmFjayA9PT0gdW5kZWZpbmVkKSA/IG1heFJvd3MgOiBjb25zdHJhaW4oc2Nyb2xsYmFjayArIHRlcm1pbmFsLnJvd3MsIDAsIG1heFJvd3MpO1xuICAgICAgcmV0dXJuIGhhbmRsZXIuc2VyaWFsaXplKHtcbiAgICAgICAgc3RhcnQ6IHsgeDogMCwgICAgICAgICAgICAgeTogbWF4Um93cyAtIGNvcnJlY3RSb3dzIH0sXG4gICAgICAgIGVuZDogICB7IHg6IHRlcm1pbmFsLmNvbHMsIHk6IG1heFJvd3MgLSAxICAgICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLl90ZXJtaW5hbD8uZ2V0U2VsZWN0aW9uUG9zaXRpb24oKTtcbiAgICBpZiAoc2VsZWN0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBoYW5kbGVyLnNlcmlhbGl6ZSh7XG4gICAgICAgIHN0YXJ0OiB7IHg6IHNlbGVjdGlvbi5zdGFydC54LCB5OiBzZWxlY3Rpb24uc3RhcnQueSB9LFxuICAgICAgICBlbmQ6ICAgeyB4OiBzZWxlY3Rpb24uZW5kLngsICAgeTogc2VsZWN0aW9uLmVuZC55ICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2VyaWFsaXplTW9kZXModGVybWluYWw6IFRlcm1pbmFsKTogc3RyaW5nIHtcbiAgICBsZXQgY29udGVudCA9ICcnO1xuICAgIGNvbnN0IG1vZGVzID0gdGVybWluYWwubW9kZXM7XG5cbiAgICAvLyBEZWZhdWx0OiBmYWxzZVxuICAgIGlmIChtb2Rlcy5hcHBsaWNhdGlvbkN1cnNvcktleXNNb2RlKSBjb250ZW50ICs9ICdcXHgxYls/MWgnO1xuICAgIGlmIChtb2Rlcy5hcHBsaWNhdGlvbktleXBhZE1vZGUpIGNvbnRlbnQgKz0gJ1xceDFiWz82NmgnO1xuICAgIGlmIChtb2Rlcy5icmFja2V0ZWRQYXN0ZU1vZGUpIGNvbnRlbnQgKz0gJ1xceDFiWz8yMDA0aCc7XG4gICAgaWYgKG1vZGVzLmluc2VydE1vZGUpIGNvbnRlbnQgKz0gJ1xceDFiWzRoJztcbiAgICBpZiAobW9kZXMub3JpZ2luTW9kZSkgY29udGVudCArPSAnXFx4MWJbPzZoJztcbiAgICBpZiAobW9kZXMucmV2ZXJzZVdyYXBhcm91bmRNb2RlKSBjb250ZW50ICs9ICdcXHgxYls/NDVoJztcbiAgICBpZiAobW9kZXMuc2VuZEZvY3VzTW9kZSkgY29udGVudCArPSAnXFx4MWJbPzEwMDRoJztcblxuICAgIC8vIERlZmF1bHQ6IHRydWVcbiAgICBpZiAobW9kZXMud3JhcGFyb3VuZE1vZGUgPT09IGZhbHNlKSBjb250ZW50ICs9ICdcXHgxYls/N2wnO1xuXG4gICAgLy8gRGVmYXVsdDogJ25vbmUnXG4gICAgaWYgKG1vZGVzLm1vdXNlVHJhY2tpbmdNb2RlICE9PSAnbm9uZScpIHtcbiAgICAgIHN3aXRjaCAobW9kZXMubW91c2VUcmFja2luZ01vZGUpIHtcbiAgICAgICAgY2FzZSAneDEwJzogY29udGVudCArPSAnXFx4MWJbPzloJzsgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3Z0MjAwJzogY29udGVudCArPSAnXFx4MWJbPzEwMDBoJzsgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2RyYWcnOiBjb250ZW50ICs9ICdcXHgxYls/MTAwMmgnOyBicmVhaztcbiAgICAgICAgY2FzZSAnYW55JzogY29udGVudCArPSAnXFx4MWJbPzEwMDNoJzsgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2VyaWFsaXplKG9wdGlvbnM/OiBJU2VyaWFsaXplT3B0aW9ucyk6IHN0cmluZyB7XG4gICAgLy8gVE9ETzogQWRkIGNvbWJpbmVkRGF0YSBzdXBwb3J0XG4gICAgaWYgKCF0aGlzLl90ZXJtaW5hbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgdXNlIGFkZG9uIHVudGlsIGl0IGhhcyBiZWVuIGxvYWRlZCcpO1xuICAgIH1cblxuICAgIC8vIE5vcm1hbCBidWZmZXJcbiAgICBsZXQgY29udGVudCA9IG9wdGlvbnM/LnJhbmdlXG4gICAgICA/IHRoaXMuX3NlcmlhbGl6ZUJ1ZmZlckJ5UmFuZ2UodGhpcy5fdGVybWluYWwsIHRoaXMuX3Rlcm1pbmFsLmJ1ZmZlci5ub3JtYWwsIG9wdGlvbnMucmFuZ2UsIHRydWUpXG4gICAgICA6IHRoaXMuX3NlcmlhbGl6ZUJ1ZmZlckJ5U2Nyb2xsYmFjayh0aGlzLl90ZXJtaW5hbCwgdGhpcy5fdGVybWluYWwuYnVmZmVyLm5vcm1hbCwgb3B0aW9ucz8uc2Nyb2xsYmFjayk7XG5cbiAgICAvLyBBbHRlcm5hdGUgYnVmZmVyXG4gICAgaWYgKCFvcHRpb25zPy5leGNsdWRlQWx0QnVmZmVyKSB7XG4gICAgICBpZiAodGhpcy5fdGVybWluYWwuYnVmZmVyLmFjdGl2ZS50eXBlID09PSAnYWx0ZXJuYXRlJykge1xuICAgICAgICBjb25zdCBhbHRlcm5hdGl2ZVNjcmVlbkNvbnRlbnQgPSB0aGlzLl9zZXJpYWxpemVCdWZmZXJCeVNjcm9sbGJhY2sodGhpcy5fdGVybWluYWwsIHRoaXMuX3Rlcm1pbmFsLmJ1ZmZlci5hbHRlcm5hdGUsIHVuZGVmaW5lZCk7XG4gICAgICAgIGNvbnRlbnQgKz0gYFxcdTAwMWJbPzEwNDloXFx1MDAxYltIJHthbHRlcm5hdGl2ZVNjcmVlbkNvbnRlbnR9YDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBNb2Rlc1xuICAgIGlmICghb3B0aW9ucz8uZXhjbHVkZU1vZGVzKSB7XG4gICAgICBjb250ZW50ICs9IHRoaXMuX3NlcmlhbGl6ZU1vZGVzKHRoaXMuX3Rlcm1pbmFsKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuXG4gIHB1YmxpYyBzZXJpYWxpemVBc0hUTUwob3B0aW9ucz86IFBhcnRpYWw8SUhUTUxTZXJpYWxpemVPcHRpb25zPik6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLl90ZXJtaW5hbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgdXNlIGFkZG9uIHVudGlsIGl0IGhhcyBiZWVuIGxvYWRlZCcpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9zZXJpYWxpemVCdWZmZXJBc0hUTUwodGhpcy5fdGVybWluYWwsIG9wdGlvbnMgfHwge30pO1xuICB9XG5cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7IH1cbn1cblxuZXhwb3J0IGNsYXNzIEhUTUxTZXJpYWxpemVIYW5kbGVyIGV4dGVuZHMgQmFzZVNlcmlhbGl6ZUhhbmRsZXIge1xuICBwcml2YXRlIF9jdXJyZW50Um93OiBzdHJpbmcgPSAnJztcblxuICBwcml2YXRlIF9odG1sQ29udGVudCA9ICcnO1xuXG4gIHByaXZhdGUgX2Fuc2lDb2xvcnM6IFJlYWRvbmx5PElDb2xvcltdPjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBidWZmZXI6IElCdWZmZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGVybWluYWw6IFRlcm1pbmFsLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX29wdGlvbnM6IFBhcnRpYWw8SUhUTUxTZXJpYWxpemVPcHRpb25zPlxuICApIHtcbiAgICBzdXBlcihidWZmZXIpO1xuXG4gICAgLy8gRm9yIHh0ZXJtIGhlYWRsZXNzOiBmYWxsYmFjayB0byBhbnNpIGNvbG9yc1xuICAgIGlmICgoX3Rlcm1pbmFsIGFzIGFueSkuX2NvcmUuX3RoZW1lU2VydmljZSkge1xuICAgICAgdGhpcy5fYW5zaUNvbG9ycyA9IChfdGVybWluYWwgYXMgYW55KS5fY29yZS5fdGhlbWVTZXJ2aWNlLmNvbG9ycy5hbnNpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuX2Fuc2lDb2xvcnMgPSBERUZBVUxUX0FOU0lfQ09MT1JTO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3BhZFN0YXJ0KHRhcmdldDogc3RyaW5nLCB0YXJnZXRMZW5ndGg6IG51bWJlciwgcGFkU3RyaW5nOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHRhcmdldExlbmd0aCA9IHRhcmdldExlbmd0aCA+PiAwO1xuICAgIHBhZFN0cmluZyA9IHBhZFN0cmluZyA/PyAnICc7XG4gICAgaWYgKHRhcmdldC5sZW5ndGggPiB0YXJnZXRMZW5ndGgpIHtcbiAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuXG4gICAgdGFyZ2V0TGVuZ3RoIC09IHRhcmdldC5sZW5ndGg7XG4gICAgaWYgKHRhcmdldExlbmd0aCA+IHBhZFN0cmluZy5sZW5ndGgpIHtcbiAgICAgIHBhZFN0cmluZyArPSBwYWRTdHJpbmcucmVwZWF0KHRhcmdldExlbmd0aCAvIHBhZFN0cmluZy5sZW5ndGgpO1xuICAgIH1cbiAgICByZXR1cm4gcGFkU3RyaW5nLnNsaWNlKDAsIHRhcmdldExlbmd0aCkgKyB0YXJnZXQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2JlZm9yZVNlcmlhbGl6ZShyb3dzOiBudW1iZXIsIHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5faHRtbENvbnRlbnQgKz0gJzxodG1sPjxib2R5PjwhLS1TdGFydEZyYWdtZW50LS0+PHByZT4nO1xuXG4gICAgbGV0IGZvcmVncm91bmQgPSAnIzAwMDAwMCc7XG4gICAgbGV0IGJhY2tncm91bmQgPSAnI2ZmZmZmZic7XG4gICAgaWYgKHRoaXMuX29wdGlvbnMuaW5jbHVkZUdsb2JhbEJhY2tncm91bmQgPz8gZmFsc2UpIHtcbiAgICAgIGZvcmVncm91bmQgPSB0aGlzLl90ZXJtaW5hbC5vcHRpb25zLnRoZW1lPy5mb3JlZ3JvdW5kID8/ICcjZmZmZmZmJztcbiAgICAgIGJhY2tncm91bmQgPSB0aGlzLl90ZXJtaW5hbC5vcHRpb25zLnRoZW1lPy5iYWNrZ3JvdW5kID8/ICcjMDAwMDAwJztcbiAgICB9XG5cbiAgICBjb25zdCBnbG9iYWxTdHlsZURlZmluaXRpb25zID0gW107XG4gICAgZ2xvYmFsU3R5bGVEZWZpbml0aW9ucy5wdXNoKCdjb2xvcjogJyArIGZvcmVncm91bmQgKyAnOycpO1xuICAgIGdsb2JhbFN0eWxlRGVmaW5pdGlvbnMucHVzaCgnYmFja2dyb3VuZC1jb2xvcjogJyArIGJhY2tncm91bmQgKyAnOycpO1xuICAgIGdsb2JhbFN0eWxlRGVmaW5pdGlvbnMucHVzaCgnZm9udC1mYW1pbHk6ICcgKyB0aGlzLl90ZXJtaW5hbC5vcHRpb25zLmZvbnRGYW1pbHkgKyAnOycpO1xuICAgIGdsb2JhbFN0eWxlRGVmaW5pdGlvbnMucHVzaCgnZm9udC1zaXplOiAnICsgdGhpcy5fdGVybWluYWwub3B0aW9ucy5mb250U2l6ZSArICdweDsnKTtcbiAgICB0aGlzLl9odG1sQ29udGVudCArPSAnPGRpdiBzdHlsZT1cXCcnICsgZ2xvYmFsU3R5bGVEZWZpbml0aW9ucy5qb2luKCcgJykgKyAnXFwnPic7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2FmdGVyU2VyaWFsaXplKCk6IHZvaWQge1xuICAgIHRoaXMuX2h0bWxDb250ZW50ICs9ICc8L2Rpdj4nO1xuICAgIHRoaXMuX2h0bWxDb250ZW50ICs9ICc8L3ByZT48IS0tRW5kRnJhZ21lbnQtLT48L2JvZHk+PC9odG1sPic7XG4gIH1cblxuICBwcm90ZWN0ZWQgX3Jvd0VuZChyb3c6IG51bWJlciwgaXNMYXN0Um93OiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5faHRtbENvbnRlbnQgKz0gJzxkaXY+PHNwYW4+JyArIHRoaXMuX2N1cnJlbnRSb3cgKyAnPC9zcGFuPjwvZGl2Pic7XG4gICAgdGhpcy5fY3VycmVudFJvdyA9ICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0SGV4Q29sb3IoY2VsbDogSUJ1ZmZlckNlbGwsIGlzRmc6IGJvb2xlYW4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNvbG9yID0gaXNGZyA/IGNlbGwuZ2V0RmdDb2xvcigpIDogY2VsbC5nZXRCZ0NvbG9yKCk7XG4gICAgaWYgKGlzRmcgPyBjZWxsLmlzRmdSR0IoKSA6IGNlbGwuaXNCZ1JHQigpKSB7XG4gICAgICBjb25zdCByZ2IgPSBbXG4gICAgICAgIChjb2xvciA+PiAxNikgJiAyNTUsXG4gICAgICAgIChjb2xvciA+PiAgOCkgJiAyNTUsXG4gICAgICAgIChjb2xvciAgICAgICkgJiAyNTVcbiAgICAgIF07XG4gICAgICByZXR1cm4gJyMnICsgcmdiLm1hcCh4ID0+IHRoaXMuX3BhZFN0YXJ0KHgudG9TdHJpbmcoMTYpLCAyLCAnMCcpKS5qb2luKCcnKTtcbiAgICB9XG4gICAgaWYgKGlzRmcgPyBjZWxsLmlzRmdQYWxldHRlKCkgOiBjZWxsLmlzQmdQYWxldHRlKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9hbnNpQ29sb3JzW2NvbG9yXS5jc3M7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIF9kaWZmU3R5bGUoY2VsbDogSUJ1ZmZlckNlbGwsIG9sZENlbGw6IElCdWZmZXJDZWxsKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNvbnRlbnQ6IHN0cmluZ1tdID0gW107XG5cbiAgICBjb25zdCBmZ0NoYW5nZWQgPSAhZXF1YWxGZyhjZWxsLCBvbGRDZWxsKTtcbiAgICBjb25zdCBiZ0NoYW5nZWQgPSAhZXF1YWxCZyhjZWxsLCBvbGRDZWxsKTtcbiAgICBjb25zdCBmbGFnc0NoYW5nZWQgPSAhZXF1YWxGbGFncyhjZWxsLCBvbGRDZWxsKTtcblxuICAgIGlmIChmZ0NoYW5nZWQgfHwgYmdDaGFuZ2VkIHx8IGZsYWdzQ2hhbmdlZCkge1xuICAgICAgY29uc3QgZmdIZXhDb2xvciA9IHRoaXMuX2dldEhleENvbG9yKGNlbGwsIHRydWUpO1xuICAgICAgaWYgKGZnSGV4Q29sb3IpIHtcbiAgICAgICAgY29udGVudC5wdXNoKCdjb2xvcjogJyArIGZnSGV4Q29sb3IgKyAnOycpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBiZ0hleENvbG9yID0gdGhpcy5fZ2V0SGV4Q29sb3IoY2VsbCwgZmFsc2UpO1xuICAgICAgaWYgKGJnSGV4Q29sb3IpIHtcbiAgICAgICAgY29udGVudC5wdXNoKCdiYWNrZ3JvdW5kLWNvbG9yOiAnICsgYmdIZXhDb2xvciArICc7Jyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjZWxsLmlzSW52ZXJzZSgpKSB7IGNvbnRlbnQucHVzaCgnY29sb3I6ICMwMDAwMDA7IGJhY2tncm91bmQtY29sb3I6ICNCRkJGQkY7Jyk7IH1cbiAgICAgIGlmIChjZWxsLmlzQm9sZCgpKSB7IGNvbnRlbnQucHVzaCgnZm9udC13ZWlnaHQ6IGJvbGQ7Jyk7IH1cbiAgICAgIGlmIChjZWxsLmlzVW5kZXJsaW5lKCkgJiYgY2VsbC5pc092ZXJsaW5lKCkpIHsgY29udGVudC5wdXNoKCd0ZXh0LWRlY29yYXRpb246IG92ZXJsaW5lIHVuZGVybGluZTsnKTsgfVxuICAgICAgZWxzZSBpZiAoY2VsbC5pc1VuZGVybGluZSgpKSB7IGNvbnRlbnQucHVzaCgndGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Jyk7IH1cbiAgICAgIGVsc2UgaWYgKGNlbGwuaXNPdmVybGluZSgpKSB7IGNvbnRlbnQucHVzaCgndGV4dC1kZWNvcmF0aW9uOiBvdmVybGluZTsnKTsgfVxuICAgICAgaWYgKGNlbGwuaXNCbGluaygpKSB7IGNvbnRlbnQucHVzaCgndGV4dC1kZWNvcmF0aW9uOiBibGluazsnKTsgfVxuICAgICAgaWYgKGNlbGwuaXNJbnZpc2libGUoKSkgeyBjb250ZW50LnB1c2goJ3Zpc2liaWxpdHk6IGhpZGRlbjsnKTsgfVxuICAgICAgaWYgKGNlbGwuaXNJdGFsaWMoKSkgeyBjb250ZW50LnB1c2goJ2ZvbnQtc3R5bGU6IGl0YWxpYzsnKTsgfVxuICAgICAgaWYgKGNlbGwuaXNEaW0oKSkgeyBjb250ZW50LnB1c2goJ29wYWNpdHk6IDAuNTsnKTsgfVxuICAgICAgaWYgKGNlbGwuaXNTdHJpa2V0aHJvdWdoKCkpIHsgY29udGVudC5wdXNoKCd0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDsnKTsgfVxuXG4gICAgICByZXR1cm4gY29udGVudDtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9uZXh0Q2VsbChjZWxsOiBJQnVmZmVyQ2VsbCwgb2xkQ2VsbDogSUJ1ZmZlckNlbGwsIHJvdzogbnVtYmVyLCBjb2w6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIGEgd2lkdGggMCBjZWxsIGRvbid0IG5lZWQgdG8gYmUgY291bnQgYmVjYXVzZSBpdCBpcyBqdXN0IGEgcGxhY2Vob2xkZXIgYWZ0ZXIgYSBDSksgY2hhcmFjdGVyO1xuICAgIGNvbnN0IGlzUGxhY2VIb2xkZXJDZWxsID0gY2VsbC5nZXRXaWR0aCgpID09PSAwO1xuICAgIGlmIChpc1BsYWNlSG9sZGVyQ2VsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHRoaXMgY2VsbCBkb24ndCBoYXZlIGNvbnRlbnRcbiAgICBjb25zdCBpc0VtcHR5Q2VsbCA9IGNlbGwuZ2V0Q2hhcnMoKSA9PT0gJyc7XG5cbiAgICBjb25zdCBzdHlsZURlZmluaXRpb25zID0gdGhpcy5fZGlmZlN0eWxlKGNlbGwsIG9sZENlbGwpO1xuXG4gICAgLy8gaGFuZGxlcyBzdHlsZSBjaGFuZ2VcbiAgICBpZiAoc3R5bGVEZWZpbml0aW9ucykge1xuICAgICAgdGhpcy5fY3VycmVudFJvdyArPSBzdHlsZURlZmluaXRpb25zLmxlbmd0aCA9PT0gMCA/XG4gICAgICAgICc8L3NwYW4+PHNwYW4+JyA6XG4gICAgICAgICc8L3NwYW4+PHNwYW4gc3R5bGU9XFwnJyArIHN0eWxlRGVmaW5pdGlvbnMuam9pbignICcpICsgJ1xcJz4nO1xuICAgIH1cblxuICAgIC8vIGhhbmRsZXMgYWN0dWFsIGNvbnRlbnRcbiAgICBpZiAoaXNFbXB0eUNlbGwpIHtcbiAgICAgIHRoaXMuX2N1cnJlbnRSb3cgKz0gJyAnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jdXJyZW50Um93ICs9IGNlbGwuZ2V0Q2hhcnMoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgX3NlcmlhbGl6ZVN0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9odG1sQ29udGVudDtcbiAgfVxufVxuIl0sIm5hbWVzIjpbInJvb3QiLCJmYWN0b3J5IiwiZXhwb3J0cyIsIm1vZHVsZSIsImRlZmluZSIsImFtZCIsInRoaXMiLCJfY29sb3IiLCJUd29LZXlNYXAiLCJfY3NzIiwic2V0Q3NzIiwiYmciLCJmZyIsInZhbHVlIiwic2V0IiwiZ2V0Q3NzIiwiZ2V0Iiwic2V0Q29sb3IiLCJnZXRDb2xvciIsImNsZWFyIiwiREVGQVVMVF9GT1JFR1JPVU5EIiwiY3NzIiwidG9Db2xvciIsIkRFRkFVTFRfQkFDS0dST1VORCIsIkRFRkFVTFRfQ1VSU09SIiwiREVGQVVMVF9DVVJTT1JfQUNDRU5UIiwiREVGQVVMVF9TRUxFQ1RJT04iLCJyZ2JhIiwiREVGQVVMVF9BTlNJX0NPTE9SUyIsIk9iamVjdCIsImZyZWV6ZSIsImNvbG9ycyIsInYiLCJpIiwiciIsImciLCJiIiwicHVzaCIsImNoYW5uZWxzIiwidG9Dc3MiLCJ0b1JnYmEiLCJjIiwiVGhlbWVTZXJ2aWNlIiwiRGlzcG9zYWJsZSIsIl9jb2xvcnMiLCJjb25zdHJ1Y3RvciIsInN1cGVyIiwiX29wdGlvbnNTZXJ2aWNlIiwiX2NvbnRyYXN0Q2FjaGUiLCJDb2xvckNvbnRyYXN0Q2FjaGUiLCJfaGFsZkNvbnRyYXN0Q2FjaGUiLCJfb25DaGFuZ2VDb2xvcnMiLCJyZWdpc3RlciIsIkV2ZW50RW1pdHRlciIsIm9uQ2hhbmdlQ29sb3JzIiwiZXZlbnQiLCJmb3JlZ3JvdW5kIiwiYmFja2dyb3VuZCIsImN1cnNvciIsImN1cnNvckFjY2VudCIsInNlbGVjdGlvbkZvcmVncm91bmQiLCJ1bmRlZmluZWQiLCJzZWxlY3Rpb25CYWNrZ3JvdW5kVHJhbnNwYXJlbnQiLCJzZWxlY3Rpb25CYWNrZ3JvdW5kT3BhcXVlIiwiY29sb3IiLCJibGVuZCIsInNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZFRyYW5zcGFyZW50Iiwic2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kT3BhcXVlIiwiYW5zaSIsInNsaWNlIiwiY29udHJhc3RDYWNoZSIsImhhbGZDb250cmFzdENhY2hlIiwiX3VwZGF0ZVJlc3RvcmVDb2xvcnMiLCJfc2V0VGhlbWUiLCJyYXdPcHRpb25zIiwidGhlbWUiLCJvblNwZWNpZmljT3B0aW9uQ2hhbmdlIiwicGFyc2VDb2xvciIsInNlbGVjdGlvbkJhY2tncm91bmQiLCJzZWxlY3Rpb25JbmFjdGl2ZUJhY2tncm91bmQiLCJOVUxMX0NPTE9SIiwiaXNPcGFxdWUiLCJvcGFjaXR5IiwiYmxhY2siLCJyZWQiLCJncmVlbiIsInllbGxvdyIsImJsdWUiLCJtYWdlbnRhIiwiY3lhbiIsIndoaXRlIiwiYnJpZ2h0QmxhY2siLCJicmlnaHRSZWQiLCJicmlnaHRHcmVlbiIsImJyaWdodFllbGxvdyIsImJyaWdodEJsdWUiLCJicmlnaHRNYWdlbnRhIiwiYnJpZ2h0Q3lhbiIsImJyaWdodFdoaXRlIiwiZXh0ZW5kZWRBbnNpIiwiY29sb3JDb3VudCIsIk1hdGgiLCJtaW4iLCJsZW5ndGgiLCJmaXJlIiwicmVzdG9yZUNvbG9yIiwic2xvdCIsIl9yZXN0b3JlQ29sb3IiLCJfcmVzdG9yZUNvbG9ycyIsIm1vZGlmeUNvbG9ycyIsImNhbGxiYWNrIiwiY3NzU3RyaW5nIiwiZmFsbGJhY2siLCJJT3B0aW9uc1NlcnZpY2UiLCIkciIsIiRnIiwiJGIiLCIkYSIsInJnYiIsInRvUGFkZGVkSGV4IiwicyIsInRvU3RyaW5nIiwiY29udHJhc3RSYXRpbyIsImwxIiwibDIiLCJhIiwicm91bmQiLCJ0b0NoYW5uZWxzIiwiZmdSIiwiZmdHIiwiZmdCIiwiYmdSIiwiYmdHIiwiYmdCIiwiZW5zdXJlQ29udHJhc3RSYXRpbyIsInJhdGlvIiwicmVzdWx0Iiwib3BhcXVlIiwicmdiYUNvbG9yIiwibXVsdGlwbHlPcGFjaXR5IiwiZmFjdG9yIiwidG9Db2xvclJHQiIsIiRjdHgiLCIkbGl0bXVzQ29sb3IiLCJjYW52YXMiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJ3aWR0aCIsImhlaWdodCIsImN0eCIsImdldENvbnRleHQiLCJ3aWxsUmVhZEZyZXF1ZW50bHkiLCJnbG9iYWxDb21wb3NpdGVPcGVyYXRpb24iLCJjcmVhdGVMaW5lYXJHcmFkaWVudCIsIm1hdGNoIiwicGFyc2VJbnQiLCJyZXBlYXQiLCJyZ2JhTWF0Y2giLCJwYXJzZUZsb2F0IiwiRXJyb3IiLCJmaWxsU3R5bGUiLCJmaWxsUmVjdCIsImdldEltYWdlRGF0YSIsImRhdGEiLCJyZWxhdGl2ZUx1bWluYW5jZTIiLCJycyIsImdzIiwiYnMiLCJwb3ciLCJyZWxhdGl2ZUx1bWluYW5jZSIsInJlZHVjZUx1bWluYW5jZSIsImJnUmdiYSIsImZnUmdiYSIsImNyIiwibWF4IiwiY2VpbCIsImluY3JlYXNlTHVtaW5hbmNlIiwiYmdMIiwiZmdMIiwicmVzdWx0QSIsInJlc3VsdEFSYXRpbyIsInJlc3VsdEIiLCJfbGlzdGVuZXJzIiwiX2Rpc3Bvc2VkIiwiX2V2ZW50IiwibGlzdGVuZXIiLCJkaXNwb3NlIiwic3BsaWNlIiwiYXJnMSIsImFyZzIiLCJxdWV1ZSIsImNhbGwiLCJjbGVhckxpc3RlbmVycyIsImZyb20iLCJ0byIsImUiLCJoYW5kbGVyIiwiZGlzcG9zZUFycmF5IiwiZGlzcG9zYWJsZXMiLCJkIiwiX2Rpc3Bvc2FibGVzIiwiX2lzRGlzcG9zZWQiLCJ1bnJlZ2lzdGVyIiwiaW5kZXgiLCJpbmRleE9mIiwiX3ZhbHVlIiwiZiIsImFycmF5IiwiX2RhdGEiLCJmaXJzdCIsInNlY29uZCIsInRoaXJkIiwiZm91cnRoIiwiRElfVEFSR0VUIiwiRElfREVQRU5ERU5DSUVTIiwic2VydmljZVJlZ2lzdHJ5IiwiTWFwIiwiY3RvciIsImlkIiwiaGFzIiwiZGVjb3JhdG9yIiwidGFyZ2V0Iiwia2V5IiwiYXJndW1lbnRzIiwic3RvcmVTZXJ2aWNlRGVwZW5kZW5jeSIsIkxvZ0xldmVsRW51bSIsIklCdWZmZXJTZXJ2aWNlIiwiY3JlYXRlRGVjb3JhdG9yIiwiSUNvcmVNb3VzZVNlcnZpY2UiLCJJQ29yZVNlcnZpY2UiLCJJQ2hhcnNldFNlcnZpY2UiLCJJSW5zdGFudGlhdGlvblNlcnZpY2UiLCJJTG9nU2VydmljZSIsIklPc2NMaW5rU2VydmljZSIsIklVbmljb2RlU2VydmljZSIsIklEZWNvcmF0aW9uU2VydmljZSIsIl9fd2VicGFja19tb2R1bGVfY2FjaGVfXyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImNhY2hlZE1vZHVsZSIsIl9fd2VicGFja19tb2R1bGVzX18iLCJjb25zdHJhaW4iLCJsb3ciLCJoaWdoIiwiQmFzZVNlcmlhbGl6ZUhhbmRsZXIiLCJfYnVmZmVyIiwic2VyaWFsaXplIiwicmFuZ2UiLCJleGNsdWRlRmluYWxDdXJzb3JQb3NpdGlvbiIsImNlbGwxIiwiZ2V0TnVsbENlbGwiLCJjZWxsMiIsIm9sZENlbGwiLCJzdGFydFJvdyIsInN0YXJ0IiwieSIsImVuZFJvdyIsImVuZCIsInN0YXJ0Q29sdW1uIiwieCIsImVuZENvbHVtbiIsIl9iZWZvcmVTZXJpYWxpemUiLCJyb3ciLCJsaW5lIiwiZ2V0TGluZSIsInN0YXJ0TGluZUNvbHVtbiIsImVuZExpbmVDb2x1bW4iLCJjb2wiLCJnZXRDZWxsIiwiX25leHRDZWxsIiwiY29uc29sZSIsIndhcm4iLCJfcm93RW5kIiwiX2FmdGVyU2VyaWFsaXplIiwiX3NlcmlhbGl6ZVN0cmluZyIsImNlbGwiLCJpc0xhc3RSb3ciLCJyb3dzIiwiZXF1YWxGZyIsImdldEZnQ29sb3JNb2RlIiwiZ2V0RmdDb2xvciIsImVxdWFsQmciLCJnZXRCZ0NvbG9yTW9kZSIsImdldEJnQ29sb3IiLCJlcXVhbEZsYWdzIiwiaXNJbnZlcnNlIiwiaXNCb2xkIiwiaXNVbmRlcmxpbmUiLCJpc092ZXJsaW5lIiwiaXNCbGluayIsImlzSW52aXNpYmxlIiwiaXNJdGFsaWMiLCJpc0RpbSIsImlzU3RyaWtldGhyb3VnaCIsIlN0cmluZ1NlcmlhbGl6ZUhhbmRsZXIiLCJidWZmZXIiLCJfdGVybWluYWwiLCJfcm93SW5kZXgiLCJfYWxsUm93cyIsIkFycmF5IiwiX2FsbFJvd1NlcGFyYXRvcnMiLCJfY3VycmVudFJvdyIsIl9udWxsQ2VsbENvdW50IiwiX2N1cnNvclN0eWxlIiwiX2N1cnNvclN0eWxlUm93IiwiX2N1cnNvclN0eWxlQ29sIiwiX2JhY2tncm91bmRDZWxsIiwiX2ZpcnN0Um93IiwiX2xhc3RDdXJzb3JSb3ciLCJfbGFzdEN1cnNvckNvbCIsIl9sYXN0Q29udGVudEN1cnNvclJvdyIsIl9sYXN0Q29udGVudEN1cnNvckNvbCIsIl90aGlzUm93TGFzdENoYXIiLCJfdGhpc1Jvd0xhc3RTZWNvbmRDaGFyIiwiX25leHRSb3dGaXJzdENoYXIiLCJyb3dTZXBhcmF0b3IiLCJjdXJyZW50TGluZSIsIm5leHRMaW5lIiwiaXNXcmFwcGVkIiwidGhpc1Jvd0xhc3RDaGFyIiwidGhpc1Jvd0xhc3RTZWNvbmRDaGFyIiwibmV4dFJvd0ZpcnN0Q2hhciIsImlzTmV4dFJvd0ZpcnN0Q2hhckRvdWJsZVdpZHRoIiwiZ2V0V2lkdGgiLCJpc1ZhbGlkIiwiZ2V0Q2hhcnMiLCJfZGlmZlN0eWxlIiwic2dyU2VxIiwiZmdDaGFuZ2VkIiwiYmdDaGFuZ2VkIiwiZmxhZ3NDaGFuZ2VkIiwiaXNBdHRyaWJ1dGVEZWZhdWx0IiwiaXNGZ1JHQiIsImlzRmdQYWxldHRlIiwiaXNCZ1JHQiIsImlzQmdQYWxldHRlIiwiaXNFbXB0eUNlbGwiLCJqb2luIiwicm93RW5kIiwiY29udGVudCIsInJlYWxDdXJzb3JSb3ciLCJiYXNlWSIsImN1cnNvclkiLCJyZWFsQ3Vyc29yQ29sIiwiY3Vyc29yWCIsIm1vdmVSaWdodCIsIm9mZnNldCIsImN1ckF0dHJEYXRhIiwiX2NvcmUiLCJfaW5wdXRIYW5kbGVyIiwiX2N1ckF0dHJEYXRhIiwiYWN0aXZhdGUiLCJ0ZXJtaW5hbCIsIl9zZXJpYWxpemVCdWZmZXJCeVNjcm9sbGJhY2siLCJzY3JvbGxiYWNrIiwibWF4Um93cyIsImNvcnJlY3RSb3dzIiwiX3NlcmlhbGl6ZUJ1ZmZlckJ5UmFuZ2UiLCJjb2xzIiwiX3NlcmlhbGl6ZUJ1ZmZlckFzSFRNTCIsIm9wdGlvbnMiLCJhY3RpdmUiLCJIVE1MU2VyaWFsaXplSGFuZGxlciIsIm9ubHlTZWxlY3Rpb24iLCJzZWxlY3Rpb24iLCJnZXRTZWxlY3Rpb25Qb3NpdGlvbiIsIl9zZXJpYWxpemVNb2RlcyIsIm1vZGVzIiwiYXBwbGljYXRpb25DdXJzb3JLZXlzTW9kZSIsImFwcGxpY2F0aW9uS2V5cGFkTW9kZSIsImJyYWNrZXRlZFBhc3RlTW9kZSIsImluc2VydE1vZGUiLCJvcmlnaW5Nb2RlIiwicmV2ZXJzZVdyYXBhcm91bmRNb2RlIiwic2VuZEZvY3VzTW9kZSIsIndyYXBhcm91bmRNb2RlIiwibW91c2VUcmFja2luZ01vZGUiLCJub3JtYWwiLCJleGNsdWRlQWx0QnVmZmVyIiwidHlwZSIsImFsdGVybmF0ZSIsImV4Y2x1ZGVNb2RlcyIsInNlcmlhbGl6ZUFzSFRNTCIsIl9vcHRpb25zIiwiX2h0bWxDb250ZW50IiwiX3RoZW1lU2VydmljZSIsIl9hbnNpQ29sb3JzIiwiX3BhZFN0YXJ0IiwidGFyZ2V0TGVuZ3RoIiwicGFkU3RyaW5nIiwiaW5jbHVkZUdsb2JhbEJhY2tncm91bmQiLCJnbG9iYWxTdHlsZURlZmluaXRpb25zIiwiZm9udEZhbWlseSIsImZvbnRTaXplIiwiX2dldEhleENvbG9yIiwiaXNGZyIsIm1hcCIsImZnSGV4Q29sb3IiLCJiZ0hleENvbG9yIiwic3R5bGVEZWZpbml0aW9ucyJdLCJzb3VyY2VSb290IjoiIn0=