@appium/support 2.55.2 → 2.55.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/lib/image-util.js +13 -6
- package/lib/image-util.js +15 -7
- package/package.json +2 -2
package/build/lib/image-util.js
CHANGED
|
@@ -33,6 +33,8 @@ var _logger = _interopRequireDefault(require("./logger"));
|
|
|
33
33
|
|
|
34
34
|
var _node = require("./node");
|
|
35
35
|
|
|
36
|
+
const OCV_OLD = 'opencv4nodejs';
|
|
37
|
+
const OCV_NEW = '@u4/opencv4nodejs';
|
|
36
38
|
const {
|
|
37
39
|
MIME_JPEG,
|
|
38
40
|
MIME_PNG,
|
|
@@ -94,14 +96,19 @@ async function initOpenCV() {
|
|
|
94
96
|
|
|
95
97
|
_logger.default.debug(`Initializing opencv`);
|
|
96
98
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
99
|
+
for (const ocvPackage of [OCV_OLD, OCV_NEW]) {
|
|
100
|
+
try {
|
|
101
|
+
_logger.default.debug(`Attempting to load '${ocvPackage}'`);
|
|
102
|
+
|
|
103
|
+
cv = await (0, _node.requirePackage)(ocvPackage);
|
|
104
|
+
break;
|
|
105
|
+
} catch (err) {
|
|
106
|
+
_logger.default.warn(`Unable to load '${ocvPackage}': ${err.message}`);
|
|
107
|
+
}
|
|
101
108
|
}
|
|
102
109
|
|
|
103
110
|
if (!cv) {
|
|
104
|
-
throw new Error(`
|
|
111
|
+
throw new Error(`An opencv node module is required to use OpenCV features. ` + `Please install one first (e.g., 'npm i -g ${OCV_NEW}') and restart Appium. ` + 'Read https://github.com/UrielCh/opencv4nodejs#how-to-install for more details on this topic.');
|
|
105
112
|
}
|
|
106
113
|
}
|
|
107
114
|
|
|
@@ -470,4 +477,4 @@ function getRectIntersection(rect, imageSize) {
|
|
|
470
477
|
}require('source-map-support').install();
|
|
471
478
|
|
|
472
479
|
|
|
473
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9pbWFnZS11dGlsLmpzIl0sIm5hbWVzIjpbIk1JTUVfSlBFRyIsIk1JTUVfUE5HIiwiTUlNRV9CTVAiLCJKaW1wIiwiY3YiLCJCWVRFU19JTl9QSVhFTF9CTE9DSyIsIlNDQU5MSU5FX0ZJTFRFUl9NRVRIT0QiLCJERUZBVUxUX01BVENIX1RIUkVTSE9MRCIsIk1BVENIX05FSUdIQk9VUl9USFJFU0hPTEQiLCJBVkFJTEFCTEVfREVURUNUT1JTIiwiQVZBSUxBQkxFX01BVENISU5HX0ZVTkNUSU9OUyIsIk1BVENISU5HX01FVEhPRFMiLCJERUZBVUxUX01BVENISU5HX01FVEhPRCIsInRvTWF0Y2hpbmdNZXRob2QiLCJuYW1lIiwiaW5jbHVkZXMiLCJFcnJvciIsImdldEppbXBJbWFnZSIsImRhdGEiLCJCIiwicmVzb2x2ZSIsInJlamVjdCIsIl8iLCJpc1N0cmluZyIsImlzQnVmZmVyIiwiQnVmZmVyIiwiZnJvbSIsImVyciIsImltZ09iaiIsIl9nZXRCdWZmZXIiLCJnZXRCdWZmZXIiLCJiaW5kIiwicHJvbWlzaWZ5IiwiY29udGV4dCIsImluaXRPcGVuQ1YiLCJsb2ciLCJkZWJ1ZyIsIndhcm4iLCJtZXNzYWdlIiwiZGV0ZWN0QW5kQ29tcHV0ZSIsImltZyIsImRldGVjdG9yIiwia2V5UG9pbnRzIiwiZGV0ZWN0QXN5bmMiLCJkZXNjcmlwdG9yIiwiY29tcHV0ZUFzeW5jIiwiY2FsY3VsYXRlTWF0Y2hlZFJlY3QiLCJtYXRjaGVkUG9pbnRzIiwibGVuZ3RoIiwieCIsInkiLCJ3aWR0aCIsImhlaWdodCIsInBvaW50c1NvcnRlZEJ5RGlzdGFuY2UiLCJtYXAiLCJwb2ludCIsIk1hdGgiLCJzcXJ0Iiwic29ydCIsInBhaXIxIiwicGFpcjIiLCJwYWlyIiwiZmlyc3RQb2ludCIsImhlYWQiLCJsYXN0UG9pbnQiLCJsYXN0IiwidG9wTGVmdFBvaW50IiwiYm90dG9tUmlnaHRQb2ludCIsImhpZ2hsaWdodFJlZ2lvbiIsIm1hdCIsInJlZ2lvbiIsImNvbG9yIiwiVmVjIiwidGhpY2tuZXNzIiwiZHJhd1JlY3RhbmdsZSIsIlJlY3QiLCJMSU5FXzgiLCJnZXRJbWFnZXNNYXRjaGVzIiwiaW1nMURhdGEiLCJpbWcyRGF0YSIsIm9wdGlvbnMiLCJkZXRlY3Rvck5hbWUiLCJ2aXN1YWxpemUiLCJnb29kTWF0Y2hlc0ZhY3RvciIsIm1hdGNoRnVuYyIsIkpTT04iLCJzdHJpbmdpZnkiLCJpbWcxIiwiaW1nMiIsImFsbCIsImltZGVjb2RlQXN5bmMiLCJyZXN1bHQxIiwicmVzdWx0MiIsIm1hdGNoZXMiLCJlIiwidG90YWxDb3VudCIsImlzRnVuY3Rpb24iLCJkaXN0YW5jZXMiLCJtYXRjaCIsImRpc3RhbmNlIiwibWluRGlzdGFuY2UiLCJtaW4iLCJtYXhEaXN0YW5jZSIsIm1heCIsImZpbHRlciIsIm1hdGNoMSIsIm1hdGNoMiIsInNsaWNlIiwiZXh0cmFjdFBvaW50IiwiaW5kZXhQcm9wZXJ0eU5hbWUiLCJwdCIsInBvaW50czEiLCJyZWN0MSIsInBvaW50czIiLCJyZWN0MiIsInJlc3VsdCIsImNvdW50IiwidmlzdWFsaXphdGlvbiIsImRyYXdNYXRjaGVzIiwiY29scyIsImltZW5jb2RlQXN5bmMiLCJnZXRJbWFnZXNTaW1pbGFyaXR5IiwibWV0aG9kIiwidGVtcGxhdGUiLCJyZWZlcmVuY2UiLCJyb3dzIiwiY29udmVydFRvQXN5bmMiLCJDVl84VUMzIiwibWF0Y2hlZCIsIm1hdGNoVGVtcGxhdGVBc3luYyIsIm1pbk1heCIsIm1pbk1heExvY0FzeW5jIiwic2NvcmUiLCJtYXhWYWwiLCJyZXN1bHRNYXQiLCJNYXQiLCJjb3B5VG9Bc3luYyIsImdldFJlZ2lvbiIsIm1hc2siLCJhYnNkaWZmIiwiY3Z0Q29sb3JBc3luYyIsIkNPTE9SX0JHUjJHUkFZIiwiY29udG91cnMiLCJ0aHJlc2hvbGRBc3luYyIsIlRIUkVTSF9CSU5BUlkiLCJUSFJFU0hfT1RTVSIsImZpbmRDb250b3Vyc0FzeW5jIiwiUkVUUl9FWFRFUk5BTCIsIkNIQUlOX0FQUFJPWF9TSU1QTEUiLCJpZ24iLCJjb250b3VyIiwiYm91bmRpbmdSZWN0IiwiZ2V0SW1hZ2VPY2N1cnJlbmNlIiwiZnVsbEltZ0RhdGEiLCJwYXJ0aWFsSW1nRGF0YSIsInRocmVzaG9sZCIsIm11bHRpcGxlIiwibWF0Y2hOZWlnaGJvdXJUaHJlc2hvbGQiLCJmdWxsSW1nIiwicGFydGlhbEltZyIsInJlc3VsdHMiLCJub25aZXJvTWF0Y2hSZXN1bHRzIiwiY29udmVydFRvIiwiQ1ZfOFUiLCJmaW5kTm9uWmVybyIsImZpbHRlck5lYXJNYXRjaGVzIiwicHVzaCIsImF0IiwicmVjdCIsIm1pbkxvYyIsIm1heExvYyIsImlzRW1wdHkiLCJmdWxsSGlnaGxpZ2h0ZWRJbWFnZSIsImNvcHkiLCJzaW5nbGVIaWdobGlnaHRlZEltYWdlIiwicmVkdWNlIiwiYWNjIiwiZWxlbWVudCIsInNvbWUiLCJwb2ludDEiLCJwb2ludDIiLCJhMiIsInBvdyIsImIyIiwiY3JvcEJhc2U2NEltYWdlIiwiYmFzZTY0SW1hZ2UiLCJpbWFnZSIsImJhc2U2NFRvSW1hZ2UiLCJjcm9wSW1hZ2UiLCJpbWFnZVRvQmFzZTY0IiwiaW1hZ2VCdWZmZXIiLCJQTkciLCJmaWx0ZXJUeXBlIiwicGFyc2UiLCJjaHVua3MiLCJwYWNrIiwib24iLCJjaHVuayIsImNvbmNhdCIsInRvU3RyaW5nIiwiaW1hZ2VSZWN0IiwiaW50ZXJSZWN0IiwiZ2V0UmVjdEludGVyc2VjdGlvbiIsImZpcnN0VmVydGljYWxQaXhlbCIsInRvcCIsImxhc3RWZXJ0aWNhbFBpeGVsIiwiZmlyc3RIb3Jpem9udGFsUGl4ZWwiLCJsZWZ0IiwibGFzdEhvcml6b250YWxQaXhlbCIsImNyb3BwZWRBcnJheSIsImZpcnN0Qnl0ZUlkeEluUGl4ZWxCbG9jayIsImJ5dGVJZHgiLCJpbWFnZVNpemUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFHQSxNQUFNO0FBQUVBLEVBQUFBLFNBQUY7QUFBYUMsRUFBQUEsUUFBYjtBQUF1QkMsRUFBQUE7QUFBdkIsSUFBb0NDLGFBQTFDOzs7O0FBQ0EsSUFBSUMsRUFBRSxHQUFHLElBQVQ7QUF3QkEsTUFBTUMsb0JBQW9CLEdBQUcsQ0FBN0I7QUFDQSxNQUFNQyxzQkFBc0IsR0FBRyxDQUEvQjtBQUNBLE1BQU1DLHVCQUF1QixHQUFHLEdBQWhDO0FBQ0EsTUFBTUMseUJBQXlCLEdBQUcsRUFBbEM7QUFFQSxNQUFNQyxtQkFBbUIsR0FBRyxDQUMxQixPQUQwQixFQUUxQixPQUYwQixFQUcxQixPQUgwQixFQUkxQixNQUowQixFQUsxQixNQUwwQixFQU0xQixNQU4wQixFQU8xQixNQVAwQixFQVExQixNQVIwQixFQVMxQixLQVQwQixDQUE1QjtBQVlBLE1BQU1DLDRCQUE0QixHQUFHLENBQ25DLFlBRG1DLEVBRW5DLFlBRm1DLEVBR25DLGNBSG1DLEVBSW5DLG1CQUptQyxFQUtuQyxzQkFMbUMsRUFNbkMsZUFObUMsQ0FBckM7QUFTQSxNQUFNQyxnQkFBZ0IsR0FBRyxDQUN2QixXQUR1QixFQUV2QixrQkFGdUIsRUFHdkIsVUFIdUIsRUFJdkIsaUJBSnVCLEVBS3ZCLFdBTHVCLEVBTXZCLGtCQU51QixDQUF6QjtBQVFBLE1BQU1DLHVCQUF1QixHQUFHLGtCQUFoQzs7QUFXQSxTQUFTQyxnQkFBVCxDQUEyQkMsSUFBM0IsRUFBaUM7QUFDL0IsTUFBSSxDQUFDSCxnQkFBZ0IsQ0FBQ0ksUUFBakIsQ0FBMEJELElBQTFCLENBQUwsRUFBc0M7QUFDcEMsVUFBTSxJQUFJRSxLQUFKLENBQVcsd0JBQXVCRixJQUFLLGdCQUE3QixHQUNiLHNEQUFxREgsZ0JBQWlCLEVBRG5FLENBQU47QUFFRDs7QUFDRCxTQUFPUCxFQUFFLENBQUNVLElBQUQsQ0FBVDtBQUNEOztBQVdELGVBQWVHLFlBQWYsQ0FBNkJDLElBQTdCLEVBQW1DO0FBQ2pDLFNBQU8sTUFBTSxJQUFJQyxpQkFBSixDQUFNLENBQUNDLE9BQUQsRUFBVUMsTUFBVixLQUFxQjtBQUN0QyxRQUFJLENBQUNDLGdCQUFFQyxRQUFGLENBQVdMLElBQVgsQ0FBRCxJQUFxQixDQUFDSSxnQkFBRUUsUUFBRixDQUFXTixJQUFYLENBQTFCLEVBQTRDO0FBQzFDLGFBQU9HLE1BQU0sQ0FBQyxJQUFJTCxLQUFKLENBQVUsbURBQVYsQ0FBRCxDQUFiO0FBQ0Q7O0FBRUQsUUFBSU0sZ0JBQUVDLFFBQUYsQ0FBV0wsSUFBWCxDQUFKLEVBQXNCO0FBQ3BCQSxNQUFBQSxJQUFJLEdBQUdPLGVBQU9DLElBQVAsQ0FBWVIsSUFBWixFQUFrQixRQUFsQixDQUFQO0FBQ0Q7O0FBQ0QsUUFBSWYsYUFBSixDQUFTZSxJQUFULEVBQWUsQ0FBQ1MsR0FBRCxFQUFNQyxNQUFOLEtBQWlCO0FBQzlCLFVBQUlELEdBQUosRUFBUztBQUNQLGVBQU9OLE1BQU0sQ0FBQ00sR0FBRCxDQUFiO0FBQ0Q7O0FBQ0QsVUFBSSxDQUFDQyxNQUFMLEVBQWE7QUFDWCxlQUFPUCxNQUFNLENBQUMsSUFBSUwsS0FBSixDQUFVLDRDQUFWLENBQUQsQ0FBYjtBQUNEOztBQUNEWSxNQUFBQSxNQUFNLENBQUNDLFVBQVAsR0FBb0JELE1BQU0sQ0FBQ0UsU0FBUCxDQUFpQkMsSUFBakIsQ0FBc0JILE1BQXRCLENBQXBCO0FBQ0FBLE1BQUFBLE1BQU0sQ0FBQ0UsU0FBUCxHQUFtQlgsa0JBQUVhLFNBQUYsQ0FBWUosTUFBTSxDQUFDQyxVQUFuQixFQUErQjtBQUFDSSxRQUFBQSxPQUFPLEVBQUVMO0FBQVYsT0FBL0IsQ0FBbkI7QUFDQVIsTUFBQUEsT0FBTyxDQUFDUSxNQUFELENBQVA7QUFDRCxLQVZEO0FBV0QsR0FuQlksQ0FBYjtBQW9CRDs7QUFLRCxlQUFlTSxVQUFmLEdBQTZCO0FBQzNCLE1BQUk5QixFQUFKLEVBQVE7QUFDTjtBQUNEOztBQUVEK0Isa0JBQUlDLEtBQUosQ0FBVyxxQkFBWDs7QUFDQSxNQUFJO0FBQ0ZoQyxJQUFBQSxFQUFFLEdBQUcsTUFBTSwwQkFBZSxlQUFmLENBQVg7QUFDRCxHQUZELENBRUUsT0FBT3VCLEdBQVAsRUFBWTtBQUNaUSxvQkFBSUUsSUFBSixDQUFVLG1DQUFrQ1YsR0FBRyxDQUFDVyxPQUFRLEVBQXhEO0FBQ0Q7O0FBRUQsTUFBSSxDQUFDbEMsRUFBTCxFQUFTO0FBQ1AsVUFBTSxJQUFJWSxLQUFKLENBQVcsNkRBQUQsR0FDQyx5RUFERCxHQUVBLHdHQUZWLENBQU47QUFHRDtBQUNGOztBQW1CRCxlQUFldUIsZ0JBQWYsQ0FBaUNDLEdBQWpDLEVBQXNDQyxRQUF0QyxFQUFnRDtBQUM5QyxRQUFNQyxTQUFTLEdBQUcsTUFBTUQsUUFBUSxDQUFDRSxXQUFULENBQXFCSCxHQUFyQixDQUF4QjtBQUNBLFFBQU1JLFVBQVUsR0FBRyxNQUFNSCxRQUFRLENBQUNJLFlBQVQsQ0FBc0JMLEdBQXRCLEVBQTJCRSxTQUEzQixDQUF6QjtBQUNBLFNBQU87QUFDTEEsSUFBQUEsU0FESztBQUVMRSxJQUFBQTtBQUZLLEdBQVA7QUFJRDs7QUFTRCxTQUFTRSxvQkFBVCxDQUErQkMsYUFBL0IsRUFBOEM7QUFDNUMsTUFBSUEsYUFBYSxDQUFDQyxNQUFkLEdBQXVCLENBQTNCLEVBQThCO0FBQzVCLFdBQU87QUFDTEMsTUFBQUEsQ0FBQyxFQUFFLENBREU7QUFFTEMsTUFBQUEsQ0FBQyxFQUFFLENBRkU7QUFHTEMsTUFBQUEsS0FBSyxFQUFFLENBSEY7QUFJTEMsTUFBQUEsTUFBTSxFQUFFO0FBSkgsS0FBUDtBQU1EOztBQUVELFFBQU1DLHNCQUFzQixHQUFHTixhQUFhLENBQ3pDTyxHQUQ0QixDQUN2QkMsS0FBRCxJQUFXLENBQUNDLElBQUksQ0FBQ0MsSUFBTCxDQUFVRixLQUFLLENBQUNOLENBQU4sR0FBVU0sS0FBSyxDQUFDTixDQUFoQixHQUFvQk0sS0FBSyxDQUFDTCxDQUFOLEdBQVVLLEtBQUssQ0FBQ0wsQ0FBOUMsQ0FBRCxFQUFtREssS0FBbkQsQ0FEYSxFQUU1QkcsSUFGNEIsQ0FFdkIsQ0FBQ0MsS0FBRCxFQUFRQyxLQUFSLEtBQWtCRCxLQUFLLENBQUMsQ0FBRCxDQUFMLElBQVlDLEtBQUssQ0FBQyxDQUFELENBRlosRUFHNUJOLEdBSDRCLENBR3ZCTyxJQUFELElBQVVBLElBQUksQ0FBQyxDQUFELENBSFUsQ0FBL0I7O0FBSUEsUUFBTUMsVUFBVSxHQUFHeEMsZ0JBQUV5QyxJQUFGLENBQU9WLHNCQUFQLENBQW5COztBQUNBLFFBQU1XLFNBQVMsR0FBRzFDLGdCQUFFMkMsSUFBRixDQUFPWixzQkFBUCxDQUFsQjs7QUFDQSxRQUFNYSxZQUFZLEdBQUc7QUFDbkJqQixJQUFBQSxDQUFDLEVBQUVhLFVBQVUsQ0FBQ2IsQ0FBWCxJQUFnQmUsU0FBUyxDQUFDZixDQUExQixHQUE4QmEsVUFBVSxDQUFDYixDQUF6QyxHQUE2Q2UsU0FBUyxDQUFDZixDQUR2QztBQUVuQkMsSUFBQUEsQ0FBQyxFQUFFWSxVQUFVLENBQUNaLENBQVgsSUFBZ0JjLFNBQVMsQ0FBQ2QsQ0FBMUIsR0FBOEJZLFVBQVUsQ0FBQ1osQ0FBekMsR0FBNkNjLFNBQVMsQ0FBQ2Q7QUFGdkMsR0FBckI7QUFJQSxRQUFNaUIsZ0JBQWdCLEdBQUc7QUFDdkJsQixJQUFBQSxDQUFDLEVBQUVhLFVBQVUsQ0FBQ2IsQ0FBWCxJQUFnQmUsU0FBUyxDQUFDZixDQUExQixHQUE4QmEsVUFBVSxDQUFDYixDQUF6QyxHQUE2Q2UsU0FBUyxDQUFDZixDQURuQztBQUV2QkMsSUFBQUEsQ0FBQyxFQUFFWSxVQUFVLENBQUNaLENBQVgsSUFBZ0JjLFNBQVMsQ0FBQ2QsQ0FBMUIsR0FBOEJZLFVBQVUsQ0FBQ1osQ0FBekMsR0FBNkNjLFNBQVMsQ0FBQ2Q7QUFGbkMsR0FBekI7QUFJQSxTQUFPO0FBQ0xELElBQUFBLENBQUMsRUFBRWlCLFlBQVksQ0FBQ2pCLENBRFg7QUFFTEMsSUFBQUEsQ0FBQyxFQUFFZ0IsWUFBWSxDQUFDaEIsQ0FGWDtBQUdMQyxJQUFBQSxLQUFLLEVBQUVnQixnQkFBZ0IsQ0FBQ2xCLENBQWpCLEdBQXFCaUIsWUFBWSxDQUFDakIsQ0FIcEM7QUFJTEcsSUFBQUEsTUFBTSxFQUFFZSxnQkFBZ0IsQ0FBQ2pCLENBQWpCLEdBQXFCZ0IsWUFBWSxDQUFDaEI7QUFKckMsR0FBUDtBQU1EOztBQVVELFNBQVNrQixlQUFULENBQTBCQyxHQUExQixFQUErQkMsTUFBL0IsRUFBdUM7QUFDckMsTUFBSUEsTUFBTSxDQUFDbkIsS0FBUCxJQUFnQixDQUFoQixJQUFxQm1CLE1BQU0sQ0FBQ2xCLE1BQVAsSUFBaUIsQ0FBMUMsRUFBNkM7QUFDM0M7QUFDRDs7QUFHRCxRQUFNbUIsS0FBSyxHQUFHLElBQUluRSxFQUFFLENBQUNvRSxHQUFQLENBQVcsQ0FBWCxFQUFjLENBQWQsRUFBaUIsR0FBakIsQ0FBZDtBQUNBLFFBQU1DLFNBQVMsR0FBRyxDQUFsQjtBQUNBSixFQUFBQSxHQUFHLENBQUNLLGFBQUosQ0FBa0IsSUFBSXRFLEVBQUUsQ0FBQ3VFLElBQVAsQ0FBWUwsTUFBTSxDQUFDckIsQ0FBbkIsRUFBc0JxQixNQUFNLENBQUNwQixDQUE3QixFQUFnQ29CLE1BQU0sQ0FBQ25CLEtBQXZDLEVBQThDbUIsTUFBTSxDQUFDbEIsTUFBckQsQ0FBbEIsRUFBZ0ZtQixLQUFoRixFQUF1RkUsU0FBdkYsRUFBa0dyRSxFQUFFLENBQUN3RSxNQUFyRztBQUNBLFNBQU9QLEdBQVA7QUFDRDs7QUFnREQsZUFBZVEsZ0JBQWYsQ0FBaUNDLFFBQWpDLEVBQTJDQyxRQUEzQyxFQUFxREMsT0FBTyxHQUFHLEVBQS9ELEVBQW1FO0FBQ2pFLFFBQU05QyxVQUFVLEVBQWhCO0FBRUEsUUFBTTtBQUFDK0MsSUFBQUEsWUFBWSxHQUFHLEtBQWhCO0FBQXVCQyxJQUFBQSxTQUFTLEdBQUcsS0FBbkM7QUFDQ0MsSUFBQUEsaUJBREQ7QUFDb0JDLElBQUFBLFNBQVMsR0FBRztBQURoQyxNQUNnREosT0FEdEQ7O0FBRUEsTUFBSSxDQUFDMUQsZ0JBQUVQLFFBQUYsQ0FBV04sbUJBQVgsRUFBZ0N3RSxZQUFoQyxDQUFMLEVBQW9EO0FBQ2xELFVBQU0sSUFBSWpFLEtBQUosQ0FBVyxJQUFHaUUsWUFBYSx5QkFBakIsR0FDQyxRQUFPSSxJQUFJLENBQUNDLFNBQUwsQ0FBZTdFLG1CQUFmLENBQW9DLDJCQUR0RCxDQUFOO0FBRUQ7O0FBQ0QsTUFBSSxDQUFDYSxnQkFBRVAsUUFBRixDQUFXTCw0QkFBWCxFQUF5QzBFLFNBQXpDLENBQUwsRUFBMEQ7QUFDeEQsVUFBTSxJQUFJcEUsS0FBSixDQUFXLElBQUdvRSxTQUFVLGtDQUFkLEdBQ0MsUUFBT0MsSUFBSSxDQUFDQyxTQUFMLENBQWU1RSw0QkFBZixDQUE2QyxvQ0FEL0QsQ0FBTjtBQUVEOztBQUVELFFBQU0rQixRQUFRLEdBQUcsSUFBSXJDLEVBQUUsQ0FBRSxHQUFFNkUsWUFBYSxVQUFqQixDQUFOLEVBQWpCO0FBQ0EsUUFBTSxDQUFDTSxJQUFELEVBQU9DLElBQVAsSUFBZSxNQUFNckUsa0JBQUVzRSxHQUFGLENBQU0sQ0FDL0JyRixFQUFFLENBQUNzRixhQUFILENBQWlCWixRQUFqQixDQUQrQixFQUUvQjFFLEVBQUUsQ0FBQ3NGLGFBQUgsQ0FBaUJYLFFBQWpCLENBRitCLENBQU4sQ0FBM0I7QUFJQSxRQUFNLENBQUNZLE9BQUQsRUFBVUMsT0FBVixJQUFxQixNQUFNekUsa0JBQUVzRSxHQUFGLENBQU0sQ0FDckNsRCxnQkFBZ0IsQ0FBQ2dELElBQUQsRUFBTzlDLFFBQVAsQ0FEcUIsRUFFckNGLGdCQUFnQixDQUFDaUQsSUFBRCxFQUFPL0MsUUFBUCxDQUZxQixDQUFOLENBQWpDO0FBSUEsTUFBSW9ELE9BQU8sR0FBRyxFQUFkOztBQUNBLE1BQUk7QUFDRkEsSUFBQUEsT0FBTyxHQUFHLE1BQU16RixFQUFFLENBQUUsUUFBT2dGLFNBQVUsT0FBbkIsQ0FBRixDQUE2Qk8sT0FBTyxDQUFDL0MsVUFBckMsRUFBaURnRCxPQUFPLENBQUNoRCxVQUF6RCxDQUFoQjtBQUNELEdBRkQsQ0FFRSxPQUFPa0QsQ0FBUCxFQUFVO0FBQ1YsVUFBTSxJQUFJOUUsS0FBSixDQUFXLHFGQUFELEdBQ0Msb0JBQW1COEUsQ0FBRSxFQURoQyxDQUFOO0FBRUQ7O0FBQ0QsUUFBTUMsVUFBVSxHQUFHRixPQUFPLENBQUM3QyxNQUEzQjs7QUFDQSxNQUFJLG9CQUFTbUMsaUJBQVQsQ0FBSixFQUFpQztBQUMvQixRQUFJN0QsZ0JBQUUwRSxVQUFGLENBQWFiLGlCQUFiLENBQUosRUFBcUM7QUFDbkMsWUFBTWMsU0FBUyxHQUFHSixPQUFPLENBQUN2QyxHQUFSLENBQWE0QyxLQUFELElBQVdBLEtBQUssQ0FBQ0MsUUFBN0IsQ0FBbEI7O0FBQ0EsWUFBTUMsV0FBVyxHQUFHOUUsZ0JBQUUrRSxHQUFGLENBQU1KLFNBQU4sQ0FBcEI7O0FBQ0EsWUFBTUssV0FBVyxHQUFHaEYsZ0JBQUVpRixHQUFGLENBQU1OLFNBQU4sQ0FBcEI7O0FBQ0FKLE1BQUFBLE9BQU8sR0FBR0EsT0FBTyxDQUNkVyxNQURPLENBQ0NOLEtBQUQsSUFBV2YsaUJBQWlCLENBQUNlLEtBQUssQ0FBQ0MsUUFBUCxFQUFpQkMsV0FBakIsRUFBOEJFLFdBQTlCLENBRDVCLENBQVY7QUFFRCxLQU5ELE1BTU87QUFDTCxVQUFJVCxPQUFPLENBQUM3QyxNQUFSLEdBQWlCbUMsaUJBQXJCLEVBQXdDO0FBQ3RDVSxRQUFBQSxPQUFPLEdBQUdBLE9BQU8sQ0FDZG5DLElBRE8sQ0FDRixDQUFDK0MsTUFBRCxFQUFTQyxNQUFULEtBQW9CRCxNQUFNLENBQUNOLFFBQVAsR0FBa0JPLE1BQU0sQ0FBQ1AsUUFEM0MsRUFFUFEsS0FGTyxDQUVELENBRkMsRUFFRXhCLGlCQUZGLENBQVY7QUFHRDtBQUNGO0FBQ0Y7O0FBRUQsUUFBTXlCLFlBQVksR0FBRyxDQUFDbEUsU0FBRCxFQUFZbUUsaUJBQVosS0FBbUNYLEtBQUQsSUFBVztBQUNoRSxVQUFNO0FBQUNZLE1BQUFBLEVBQUQ7QUFBS3ZELE1BQUFBO0FBQUwsUUFBY2IsU0FBUyxDQUFDd0QsS0FBSyxDQUFDVyxpQkFBRCxDQUFOLENBQTdCO0FBRUEsV0FBUUMsRUFBRSxJQUFJdkQsS0FBZDtBQUNELEdBSkQ7O0FBS0EsUUFBTXdELE9BQU8sR0FBR2xCLE9BQU8sQ0FBQ3ZDLEdBQVIsQ0FBWXNELFlBQVksQ0FBQ2pCLE9BQU8sQ0FBQ2pELFNBQVQsRUFBb0IsVUFBcEIsQ0FBeEIsQ0FBaEI7QUFDQSxRQUFNc0UsS0FBSyxHQUFHbEUsb0JBQW9CLENBQUNpRSxPQUFELENBQWxDO0FBQ0EsUUFBTUUsT0FBTyxHQUFHcEIsT0FBTyxDQUFDdkMsR0FBUixDQUFZc0QsWUFBWSxDQUFDaEIsT0FBTyxDQUFDbEQsU0FBVCxFQUFvQixVQUFwQixDQUF4QixDQUFoQjtBQUNBLFFBQU13RSxLQUFLLEdBQUdwRSxvQkFBb0IsQ0FBQ21FLE9BQUQsQ0FBbEM7QUFFQSxRQUFNRSxNQUFNLEdBQUc7QUFDYkosSUFBQUEsT0FEYTtBQUViQyxJQUFBQSxLQUZhO0FBR2JDLElBQUFBLE9BSGE7QUFJYkMsSUFBQUEsS0FKYTtBQUtibkIsSUFBQUEsVUFMYTtBQU1icUIsSUFBQUEsS0FBSyxFQUFFdkIsT0FBTyxDQUFDN0M7QUFORixHQUFmOztBQVFBLE1BQUlrQyxTQUFKLEVBQWU7QUFDYixVQUFNbUMsYUFBYSxHQUFHakgsRUFBRSxDQUFDa0gsV0FBSCxDQUFlL0IsSUFBZixFQUFxQkMsSUFBckIsRUFBMkJHLE9BQU8sQ0FBQ2pELFNBQW5DLEVBQThDa0QsT0FBTyxDQUFDbEQsU0FBdEQsRUFBaUVtRCxPQUFqRSxDQUF0QjtBQUNBekIsSUFBQUEsZUFBZSxDQUFDaUQsYUFBRCxFQUFnQkwsS0FBaEIsQ0FBZjtBQUNBNUMsSUFBQUEsZUFBZSxDQUFDaUQsYUFBRCxFQUFnQjtBQUM3QnBFLE1BQUFBLENBQUMsRUFBRXNDLElBQUksQ0FBQ2dDLElBQUwsR0FBWUwsS0FBSyxDQUFDakUsQ0FEUTtBQUU3QkMsTUFBQUEsQ0FBQyxFQUFFZ0UsS0FBSyxDQUFDaEUsQ0FGb0I7QUFHN0JDLE1BQUFBLEtBQUssRUFBRStELEtBQUssQ0FBQy9ELEtBSGdCO0FBSTdCQyxNQUFBQSxNQUFNLEVBQUU4RCxLQUFLLENBQUM5RDtBQUplLEtBQWhCLENBQWY7QUFNQStELElBQUFBLE1BQU0sQ0FBQ0UsYUFBUCxHQUF1QixNQUFNakgsRUFBRSxDQUFDb0gsYUFBSCxDQUFpQixNQUFqQixFQUF5QkgsYUFBekIsQ0FBN0I7QUFDRDs7QUFDRCxTQUFPRixNQUFQO0FBQ0Q7O0FBc0NELGVBQWVNLG1CQUFmLENBQW9DM0MsUUFBcEMsRUFBOENDLFFBQTlDLEVBQXdEQyxPQUFPLEdBQUcsRUFBbEUsRUFBc0U7QUFDcEUsUUFBTTlDLFVBQVUsRUFBaEI7QUFFQSxRQUFNO0FBQ0p3RixJQUFBQSxNQUFNLEdBQUc5Ryx1QkFETDtBQUVKc0UsSUFBQUEsU0FBUyxHQUFHO0FBRlIsTUFHRkYsT0FISjtBQUlBLE1BQUksQ0FBQzJDLFFBQUQsRUFBV0MsU0FBWCxJQUF3QixNQUFNekcsa0JBQUVzRSxHQUFGLENBQU0sQ0FDdENyRixFQUFFLENBQUNzRixhQUFILENBQWlCWixRQUFqQixDQURzQyxFQUV0QzFFLEVBQUUsQ0FBQ3NGLGFBQUgsQ0FBaUJYLFFBQWpCLENBRnNDLENBQU4sQ0FBbEM7O0FBSUEsTUFBSTRDLFFBQVEsQ0FBQ0UsSUFBVCxLQUFrQkQsU0FBUyxDQUFDQyxJQUE1QixJQUFvQ0YsUUFBUSxDQUFDSixJQUFULEtBQWtCSyxTQUFTLENBQUNMLElBQXBFLEVBQTBFO0FBQ3hFLFVBQU0sSUFBSXZHLEtBQUosQ0FBVSxnRUFDQSxpQ0FEVixDQUFOO0FBRUQ7O0FBQ0QsR0FBQzJHLFFBQUQsRUFBV0MsU0FBWCxJQUF3QixNQUFNekcsa0JBQUVzRSxHQUFGLENBQU0sQ0FDbENrQyxRQUFRLENBQUNHLGNBQVQsQ0FBd0IxSCxFQUFFLENBQUMySCxPQUEzQixDQURrQyxFQUVsQ0gsU0FBUyxDQUFDRSxjQUFWLENBQXlCMUgsRUFBRSxDQUFDMkgsT0FBNUIsQ0FGa0MsQ0FBTixDQUE5QjtBQUtBLE1BQUlDLE9BQUo7O0FBQ0EsTUFBSTtBQUNGQSxJQUFBQSxPQUFPLEdBQUcsTUFBTUosU0FBUyxDQUFDSyxrQkFBVixDQUE2Qk4sUUFBN0IsRUFBdUM5RyxnQkFBZ0IsQ0FBQzZHLE1BQUQsQ0FBdkQsQ0FBaEI7QUFDRCxHQUZELENBRUUsT0FBTzVCLENBQVAsRUFBVTtBQUNWLFVBQU0sSUFBSTlFLEtBQUosQ0FBVywwRUFBeUU4RSxDQUFDLENBQUN4RCxPQUFRLEVBQTlGLENBQU47QUFDRDs7QUFDRCxRQUFNNEYsTUFBTSxHQUFHLE1BQU1GLE9BQU8sQ0FBQ0csY0FBUixFQUFyQjtBQUNBLFFBQU1oQixNQUFNLEdBQUc7QUFDYmlCLElBQUFBLEtBQUssRUFBRUYsTUFBTSxDQUFDRztBQURELEdBQWY7O0FBR0EsTUFBSW5ELFNBQUosRUFBZTtBQUNiLFVBQU1vRCxTQUFTLEdBQUcsSUFBSWxJLEVBQUUsQ0FBQ21JLEdBQVAsQ0FBV1osUUFBUSxDQUFDRSxJQUFwQixFQUEwQkYsUUFBUSxDQUFDSixJQUFULEdBQWdCLENBQTFDLEVBQTZDbkgsRUFBRSxDQUFDMkgsT0FBaEQsQ0FBbEI7QUFDQSxVQUFNNUcsa0JBQUVzRSxHQUFGLENBQU0sQ0FDVm1DLFNBQVMsQ0FBQ1ksV0FBVixDQUNFRixTQUFTLENBQUNHLFNBQVYsQ0FBb0IsSUFBSXJJLEVBQUUsQ0FBQ3VFLElBQVAsQ0FBWSxDQUFaLEVBQWUsQ0FBZixFQUFrQmlELFNBQVMsQ0FBQ0wsSUFBNUIsRUFBa0NLLFNBQVMsQ0FBQ0MsSUFBNUMsQ0FBcEIsQ0FERixDQURVLEVBR1ZGLFFBQVEsQ0FBQ2EsV0FBVCxDQUNFRixTQUFTLENBQUNHLFNBQVYsQ0FBb0IsSUFBSXJJLEVBQUUsQ0FBQ3VFLElBQVAsQ0FBWWlELFNBQVMsQ0FBQ0wsSUFBdEIsRUFBNEIsQ0FBNUIsRUFBK0JJLFFBQVEsQ0FBQ0osSUFBeEMsRUFBOENJLFFBQVEsQ0FBQ0UsSUFBdkQsQ0FBcEIsQ0FERixDQUhVLENBQU4sQ0FBTjtBQU1BLFFBQUlhLElBQUksR0FBR2QsU0FBUyxDQUFDZSxPQUFWLENBQWtCaEIsUUFBbEIsQ0FBWDtBQUNBZSxJQUFBQSxJQUFJLEdBQUcsTUFBTUEsSUFBSSxDQUFDRSxhQUFMLENBQW1CeEksRUFBRSxDQUFDeUksY0FBdEIsQ0FBYjtBQUNBLFFBQUlDLFFBQVEsR0FBRyxFQUFmOztBQUNBLFFBQUk7QUFDRkosTUFBQUEsSUFBSSxHQUFHLE1BQU1BLElBQUksQ0FBQ0ssY0FBTCxDQUFvQixHQUFwQixFQUF5QixHQUF6QixFQUE4QjNJLEVBQUUsQ0FBQzRJLGFBQUgsR0FBbUI1SSxFQUFFLENBQUM2SSxXQUFwRCxDQUFiO0FBQ0FILE1BQUFBLFFBQVEsR0FBRyxNQUFNSixJQUFJLENBQUNRLGlCQUFMLENBQXVCOUksRUFBRSxDQUFDK0ksYUFBMUIsRUFBeUMvSSxFQUFFLENBQUNnSixtQkFBNUMsQ0FBakI7QUFDRCxLQUhELENBR0UsT0FBT0MsR0FBUCxFQUFZLENBRWI7O0FBQ0QsU0FBSyxNQUFNQyxPQUFYLElBQXNCUixRQUF0QixFQUFnQztBQUM5QixZQUFNUyxZQUFZLEdBQUdELE9BQU8sQ0FBQ0MsWUFBUixFQUFyQjtBQUNBbkYsTUFBQUEsZUFBZSxDQUFDa0UsU0FBRCxFQUFZaUIsWUFBWixDQUFmO0FBQ0FuRixNQUFBQSxlQUFlLENBQUNrRSxTQUFELEVBQVk7QUFDekJyRixRQUFBQSxDQUFDLEVBQUUyRSxTQUFTLENBQUNMLElBQVYsR0FBaUJnQyxZQUFZLENBQUN0RyxDQURSO0FBRXpCQyxRQUFBQSxDQUFDLEVBQUVxRyxZQUFZLENBQUNyRyxDQUZTO0FBR3pCQyxRQUFBQSxLQUFLLEVBQUVvRyxZQUFZLENBQUNwRyxLQUhLO0FBSXpCQyxRQUFBQSxNQUFNLEVBQUVtRyxZQUFZLENBQUNuRztBQUpJLE9BQVosQ0FBZjtBQU1EOztBQUNEK0QsSUFBQUEsTUFBTSxDQUFDRSxhQUFQLEdBQXVCLE1BQU1qSCxFQUFFLENBQUNvSCxhQUFILENBQWlCLE1BQWpCLEVBQXlCYyxTQUF6QixDQUE3QjtBQUNEOztBQUNELFNBQU9uQixNQUFQO0FBQ0Q7O0FBZ0RELGVBQWVxQyxrQkFBZixDQUFtQ0MsV0FBbkMsRUFBZ0RDLGNBQWhELEVBQWdFMUUsT0FBTyxHQUFHLEVBQTFFLEVBQThFO0FBQzVFLFFBQU05QyxVQUFVLEVBQWhCO0FBRUEsUUFBTTtBQUNKZ0QsSUFBQUEsU0FBUyxHQUFHLEtBRFI7QUFFSnlFLElBQUFBLFNBQVMsR0FBR3BKLHVCQUZSO0FBR0pxSixJQUFBQSxRQUFRLEdBQUcsS0FIUDtBQUlKQyxJQUFBQSx1QkFBdUIsR0FBR3JKLHlCQUp0QjtBQUtKa0gsSUFBQUEsTUFBTSxHQUFHOUc7QUFMTCxNQU1Gb0UsT0FOSjtBQVFBLFFBQU0sQ0FBQzhFLE9BQUQsRUFBVUMsVUFBVixJQUF3QixNQUFNNUksa0JBQUVzRSxHQUFGLENBQU0sQ0FDeENyRixFQUFFLENBQUNzRixhQUFILENBQWlCK0QsV0FBakIsQ0FEd0MsRUFFeENySixFQUFFLENBQUNzRixhQUFILENBQWlCZ0UsY0FBakIsQ0FGd0MsQ0FBTixDQUFwQztBQUlBLFFBQU1NLE9BQU8sR0FBRyxFQUFoQjtBQUNBLE1BQUkzQyxhQUFhLEdBQUcsSUFBcEI7O0FBRUEsTUFBSTtBQUNGLFVBQU1XLE9BQU8sR0FBRyxNQUFNOEIsT0FBTyxDQUFDN0Isa0JBQVIsQ0FBMkI4QixVQUEzQixFQUF1Q2xKLGdCQUFnQixDQUFDNkcsTUFBRCxDQUF2RCxDQUF0QjtBQUNBLFVBQU1RLE1BQU0sR0FBRyxNQUFNRixPQUFPLENBQUNHLGNBQVIsRUFBckI7O0FBRUEsUUFBSXlCLFFBQUosRUFBYztBQUNaLFlBQU1LLG1CQUFtQixHQUFHakMsT0FBTyxDQUFDMkIsU0FBUixDQUFrQkEsU0FBbEIsRUFBNkIsQ0FBN0IsRUFBZ0N2SixFQUFFLENBQUM0SSxhQUFuQyxFQUN6QmtCLFNBRHlCLENBQ2Y5SixFQUFFLENBQUMrSixLQURZLEVBRXpCQyxXQUZ5QixFQUE1QjtBQUdBLFlBQU12RSxPQUFPLEdBQUd3RSxpQkFBaUIsQ0FBQ0osbUJBQUQsRUFBc0JKLHVCQUF0QixDQUFqQzs7QUFFQSxXQUFLLE1BQU07QUFBQzVHLFFBQUFBLENBQUQ7QUFBSUMsUUFBQUE7QUFBSixPQUFYLElBQXFCMkMsT0FBckIsRUFBOEI7QUFDNUJtRSxRQUFBQSxPQUFPLENBQUNNLElBQVIsQ0FBYTtBQUNYbEMsVUFBQUEsS0FBSyxFQUFFSixPQUFPLENBQUN1QyxFQUFSLENBQVdySCxDQUFYLEVBQWNELENBQWQsQ0FESTtBQUVYdUgsVUFBQUEsSUFBSSxFQUFFO0FBQ0p2SCxZQUFBQSxDQURJO0FBQ0RDLFlBQUFBLENBREM7QUFFSkMsWUFBQUEsS0FBSyxFQUFFNEcsVUFBVSxDQUFDeEMsSUFGZDtBQUdKbkUsWUFBQUEsTUFBTSxFQUFFMkcsVUFBVSxDQUFDbEM7QUFIZjtBQUZLLFNBQWI7QUFRRDtBQUNGLEtBaEJELE1BZ0JPLElBQUlLLE1BQU0sQ0FBQ0csTUFBUCxJQUFpQnNCLFNBQXJCLEVBQWdDO0FBQ3JDLFlBQU07QUFBQzFHLFFBQUFBLENBQUQ7QUFBSUMsUUFBQUE7QUFBSixVQUFTd0UsTUFBTSxDQUFDM0csUUFBUCxDQUFnQixRQUFoQixJQUE0Qm1ILE1BQU0sQ0FBQ3VDLE1BQW5DLEdBQTRDdkMsTUFBTSxDQUFDd0MsTUFBbEU7QUFDQVYsTUFBQUEsT0FBTyxDQUFDTSxJQUFSLENBQWE7QUFDWGxDLFFBQUFBLEtBQUssRUFBRUYsTUFBTSxDQUFDRyxNQURIO0FBRVhtQyxRQUFBQSxJQUFJLEVBQUU7QUFDSnZILFVBQUFBLENBREk7QUFDREMsVUFBQUEsQ0FEQztBQUVKQyxVQUFBQSxLQUFLLEVBQUU0RyxVQUFVLENBQUN4QyxJQUZkO0FBR0puRSxVQUFBQSxNQUFNLEVBQUUyRyxVQUFVLENBQUNsQztBQUhmO0FBRkssT0FBYjtBQVFEOztBQUVELFFBQUl2RyxnQkFBRXFKLE9BQUYsQ0FBVVgsT0FBVixDQUFKLEVBQXdCO0FBRXRCLFlBQU0sSUFBSWhKLEtBQUosQ0FBVyxvQkFBbUIySSxTQUFVLHdCQUE5QixHQUNDLGFBQVl6QixNQUFNLENBQUNHLE1BQU8sRUFEckMsQ0FBTjtBQUVEO0FBQ0YsR0FyQ0QsQ0FxQ0UsT0FBT3ZDLENBQVAsRUFBVTtBQUVWLFVBQU0sSUFBSTlFLEtBQUosQ0FBVyxzRUFBRCxHQUNiLG1CQUFrQjhFLENBQUMsQ0FBQ3hELE9BQVEsRUFEekIsQ0FBTjtBQUVEOztBQUVELE1BQUk0QyxTQUFKLEVBQWU7QUFDYixVQUFNMEYsb0JBQW9CLEdBQUdkLE9BQU8sQ0FBQ2UsSUFBUixFQUE3Qjs7QUFFQSxTQUFLLE1BQU0xRCxNQUFYLElBQXFCNkMsT0FBckIsRUFBOEI7QUFDNUIsWUFBTWMsc0JBQXNCLEdBQUdoQixPQUFPLENBQUNlLElBQVIsRUFBL0I7QUFFQXpHLE1BQUFBLGVBQWUsQ0FBQzBHLHNCQUFELEVBQXlCM0QsTUFBTSxDQUFDcUQsSUFBaEMsQ0FBZjtBQUNBcEcsTUFBQUEsZUFBZSxDQUFDd0csb0JBQUQsRUFBdUJ6RCxNQUFNLENBQUNxRCxJQUE5QixDQUFmO0FBQ0FyRCxNQUFBQSxNQUFNLENBQUNFLGFBQVAsR0FBdUIsTUFBTWpILEVBQUUsQ0FBQ29ILGFBQUgsQ0FBaUIsTUFBakIsRUFBeUJzRCxzQkFBekIsQ0FBN0I7QUFDRDs7QUFDRHpELElBQUFBLGFBQWEsR0FBRyxNQUFNakgsRUFBRSxDQUFDb0gsYUFBSCxDQUFpQixNQUFqQixFQUF5Qm9ELG9CQUF6QixDQUF0QjtBQUNEOztBQUVELFNBQU87QUFDTEosSUFBQUEsSUFBSSxFQUFFUixPQUFPLENBQUMsQ0FBRCxDQUFQLENBQVdRLElBRFo7QUFFTHBDLElBQUFBLEtBQUssRUFBRTRCLE9BQU8sQ0FBQyxDQUFELENBQVAsQ0FBVzVCLEtBRmI7QUFHTGYsSUFBQUEsYUFISztBQUlMdUMsSUFBQUEsUUFBUSxFQUFFSTtBQUpMLEdBQVA7QUFNRDs7QUFVRCxTQUFTSyxpQkFBVCxDQUE0QkosbUJBQTVCLEVBQWlESix1QkFBakQsRUFBMEU7QUFDeEUsU0FBT0ksbUJBQW1CLENBQUNjLE1BQXBCLENBQTJCLENBQUNDLEdBQUQsRUFBTUMsT0FBTixLQUFrQjtBQUNsRCxRQUFJLENBQUNELEdBQUcsQ0FBQ0UsSUFBSixDQUFVaEYsS0FBRCxJQUFXQyxRQUFRLENBQUNELEtBQUQsRUFBUStFLE9BQVIsQ0FBUixJQUE0QnBCLHVCQUFoRCxDQUFMLEVBQStFO0FBQzdFbUIsTUFBQUEsR0FBRyxDQUFDVixJQUFKLENBQVNXLE9BQVQ7QUFDRDs7QUFDRCxXQUFPRCxHQUFQO0FBQ0QsR0FMTSxFQUtKLEVBTEksQ0FBUDtBQU1EOztBQVNELFNBQVM3RSxRQUFULENBQW1CZ0YsTUFBbkIsRUFBMkJDLE1BQTNCLEVBQW1DO0FBQ2pDLFFBQU1DLEVBQUUsR0FBRzdILElBQUksQ0FBQzhILEdBQUwsQ0FBVUgsTUFBTSxDQUFDbEksQ0FBUCxHQUFXbUksTUFBTSxDQUFDbkksQ0FBNUIsRUFBZ0MsQ0FBaEMsQ0FBWDtBQUNBLFFBQU1zSSxFQUFFLEdBQUcvSCxJQUFJLENBQUM4SCxHQUFMLENBQVVILE1BQU0sQ0FBQ2pJLENBQVAsR0FBV2tJLE1BQU0sQ0FBQ2xJLENBQTVCLEVBQWdDLENBQWhDLENBQVg7QUFDQSxTQUFPTSxJQUFJLENBQUNDLElBQUwsQ0FBVTRILEVBQUUsR0FBR0UsRUFBZixDQUFQO0FBQ0Q7O0FBU0QsZUFBZUMsZUFBZixDQUFnQ0MsV0FBaEMsRUFBNkNqQixJQUE3QyxFQUFtRDtBQUNqRCxRQUFNa0IsS0FBSyxHQUFHLE1BQU1DLGFBQWEsQ0FBQ0YsV0FBRCxDQUFqQztBQUNBRyxFQUFBQSxTQUFTLENBQUNGLEtBQUQsRUFBUWxCLElBQVIsQ0FBVDtBQUNBLFNBQU8sTUFBTXFCLGFBQWEsQ0FBQ0gsS0FBRCxDQUExQjtBQUNEOztBQVFELGVBQWVDLGFBQWYsQ0FBOEJGLFdBQTlCLEVBQTJDO0FBQ3pDLFFBQU1LLFdBQVcsR0FBR3JLLGVBQU9DLElBQVAsQ0FBWStKLFdBQVosRUFBeUIsUUFBekIsQ0FBcEI7O0FBQ0EsU0FBTyxNQUFNLElBQUl0SyxpQkFBSixDQUFNLENBQUNDLE9BQUQsRUFBVUMsTUFBVixLQUFxQjtBQUN0QyxVQUFNcUssS0FBSyxHQUFHLElBQUlLLFVBQUosQ0FBUTtBQUFDQyxNQUFBQSxVQUFVLEVBQUUxTDtBQUFiLEtBQVIsQ0FBZDtBQUNBb0wsSUFBQUEsS0FBSyxDQUFDTyxLQUFOLENBQVlILFdBQVosRUFBeUIsQ0FBQ25LLEdBQUQsRUFBTStKLEtBQU4sS0FBZ0I7QUFDdkMsVUFBSS9KLEdBQUosRUFBUztBQUNQLGVBQU9OLE1BQU0sQ0FBQ00sR0FBRCxDQUFiO0FBQ0Q7O0FBQ0RQLE1BQUFBLE9BQU8sQ0FBQ3NLLEtBQUQsQ0FBUDtBQUNELEtBTEQ7QUFNRCxHQVJZLENBQWI7QUFTRDs7QUFRRCxlQUFlRyxhQUFmLENBQThCSCxLQUE5QixFQUFxQztBQUNuQyxTQUFPLE1BQU0sSUFBSXZLLGlCQUFKLENBQU0sQ0FBQ0MsT0FBRCxFQUFVQyxNQUFWLEtBQXFCO0FBQ3RDLFVBQU02SyxNQUFNLEdBQUcsRUFBZjtBQUNBUixJQUFBQSxLQUFLLENBQUNTLElBQU4sR0FDQ0MsRUFERCxDQUNJLE1BREosRUFDYUMsS0FBRCxJQUFXSCxNQUFNLENBQUM1QixJQUFQLENBQVkrQixLQUFaLENBRHZCLEVBQzJDRCxFQUQzQyxDQUM4QyxLQUQ5QyxFQUNxRCxNQUFNO0FBQ3pEaEwsTUFBQUEsT0FBTyxDQUFDSyxlQUFPNkssTUFBUCxDQUFjSixNQUFkLEVBQXNCSyxRQUF0QixDQUErQixRQUEvQixDQUFELENBQVA7QUFDRCxLQUhELEVBSUNILEVBSkQsQ0FJSSxPQUpKLEVBSWN6SyxHQUFELElBQVM7QUFDcEJOLE1BQUFBLE1BQU0sQ0FBQ00sR0FBRCxDQUFOO0FBQ0QsS0FORDtBQU9ELEdBVFksQ0FBYjtBQVVEOztBQVFELFNBQVNpSyxTQUFULENBQW9CRixLQUFwQixFQUEyQmxCLElBQTNCLEVBQWlDO0FBQy9CLFFBQU1nQyxTQUFTLEdBQUc7QUFBQ3JKLElBQUFBLEtBQUssRUFBRXVJLEtBQUssQ0FBQ3ZJLEtBQWQ7QUFBcUJDLElBQUFBLE1BQU0sRUFBRXNJLEtBQUssQ0FBQ3RJO0FBQW5DLEdBQWxCO0FBQ0EsUUFBTXFKLFNBQVMsR0FBR0MsbUJBQW1CLENBQUNsQyxJQUFELEVBQU9nQyxTQUFQLENBQXJDOztBQUNBLE1BQUlDLFNBQVMsQ0FBQ3RKLEtBQVYsR0FBa0JxSCxJQUFJLENBQUNySCxLQUF2QixJQUFnQ3NKLFNBQVMsQ0FBQ3JKLE1BQVYsR0FBbUJvSCxJQUFJLENBQUNwSCxNQUE1RCxFQUFvRTtBQUNsRSxVQUFNLElBQUlwQyxLQUFKLENBQVcsZUFBY3FFLElBQUksQ0FBQ0MsU0FBTCxDQUFla0YsSUFBZixDQUFxQixTQUFRbkYsSUFBSSxDQUFDQyxTQUFMLENBQWVrSCxTQUFmLENBQTBCLHFFQUFoRixDQUFOO0FBQ0Q7O0FBRUQsUUFBTUcsa0JBQWtCLEdBQUdGLFNBQVMsQ0FBQ0csR0FBckM7QUFDQSxRQUFNQyxpQkFBaUIsR0FBR0osU0FBUyxDQUFDRyxHQUFWLEdBQWdCSCxTQUFTLENBQUNySixNQUFwRDtBQUVBLFFBQU0wSixvQkFBb0IsR0FBR0wsU0FBUyxDQUFDTSxJQUF2QztBQUNBLFFBQU1DLG1CQUFtQixHQUFHUCxTQUFTLENBQUNNLElBQVYsR0FBaUJOLFNBQVMsQ0FBQ3RKLEtBQXZEO0FBRUEsUUFBTThKLFlBQVksR0FBRyxFQUFyQjs7QUFDQSxPQUFLLElBQUkvSixDQUFDLEdBQUd5SixrQkFBYixFQUFpQ3pKLENBQUMsR0FBRzJKLGlCQUFyQyxFQUF3RDNKLENBQUMsRUFBekQsRUFBNkQ7QUFDM0QsU0FBSyxJQUFJRCxDQUFDLEdBQUc2SixvQkFBYixFQUFtQzdKLENBQUMsR0FBRytKLG1CQUF2QyxFQUE0RC9KLENBQUMsRUFBN0QsRUFBaUU7QUFDL0QsWUFBTWlLLHdCQUF3QixHQUFJVixTQUFTLENBQUNySixLQUFWLEdBQWtCRCxDQUFsQixHQUFzQkQsQ0FBdkIsSUFBNkIsQ0FBOUQ7O0FBQ0EsV0FBSyxJQUFJa0ssT0FBTyxHQUFHLENBQW5CLEVBQXNCQSxPQUFPLEdBQUc5TSxvQkFBaEMsRUFBc0Q4TSxPQUFPLEVBQTdELEVBQWlFO0FBQy9ERixRQUFBQSxZQUFZLENBQUMzQyxJQUFiLENBQWtCb0IsS0FBSyxDQUFDeEssSUFBTixDQUFXZ00sd0JBQXdCLEdBQUdDLE9BQXRDLENBQWxCO0FBQ0Q7QUFDRjtBQUNGOztBQUVEekIsRUFBQUEsS0FBSyxDQUFDeEssSUFBTixHQUFhTyxlQUFPQyxJQUFQLENBQVl1TCxZQUFaLENBQWI7QUFDQXZCLEVBQUFBLEtBQUssQ0FBQ3ZJLEtBQU4sR0FBY3NKLFNBQVMsQ0FBQ3RKLEtBQXhCO0FBQ0F1SSxFQUFBQSxLQUFLLENBQUN0SSxNQUFOLEdBQWVxSixTQUFTLENBQUNySixNQUF6QjtBQUNBLFNBQU9zSSxLQUFQO0FBQ0Q7O0FBRUQsU0FBU2dCLG1CQUFULENBQThCbEMsSUFBOUIsRUFBb0M0QyxTQUFwQyxFQUErQztBQUM3QyxRQUFNTCxJQUFJLEdBQUd2QyxJQUFJLENBQUN1QyxJQUFMLElBQWFLLFNBQVMsQ0FBQ2pLLEtBQXZCLEdBQStCaUssU0FBUyxDQUFDakssS0FBekMsR0FBaURxSCxJQUFJLENBQUN1QyxJQUFuRTtBQUNBLFFBQU1ILEdBQUcsR0FBR3BDLElBQUksQ0FBQ29DLEdBQUwsSUFBWVEsU0FBUyxDQUFDaEssTUFBdEIsR0FBK0JnSyxTQUFTLENBQUNoSyxNQUF6QyxHQUFrRG9ILElBQUksQ0FBQ29DLEdBQW5FO0FBQ0EsUUFBTXpKLEtBQUssR0FBR2lLLFNBQVMsQ0FBQ2pLLEtBQVYsSUFBb0I0SixJQUFJLEdBQUd2QyxJQUFJLENBQUNySCxLQUFoQyxHQUF5Q3FILElBQUksQ0FBQ3JILEtBQTlDLEdBQXVEaUssU0FBUyxDQUFDakssS0FBVixHQUFrQjRKLElBQXZGO0FBQ0EsUUFBTTNKLE1BQU0sR0FBR2dLLFNBQVMsQ0FBQ2hLLE1BQVYsSUFBcUJ3SixHQUFHLEdBQUdwQyxJQUFJLENBQUNwSCxNQUFoQyxHQUEwQ29ILElBQUksQ0FBQ3BILE1BQS9DLEdBQXlEZ0ssU0FBUyxDQUFDaEssTUFBVixHQUFtQndKLEdBQTNGO0FBQ0EsU0FBTztBQUFDRyxJQUFBQSxJQUFEO0FBQU9ILElBQUFBLEdBQVA7QUFBWXpKLElBQUFBLEtBQVo7QUFBbUJDLElBQUFBO0FBQW5CLEdBQVA7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgSmltcCBmcm9tICdqaW1wJztcbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ2J1ZmZlcic7XG5pbXBvcnQgeyBQTkcgfSBmcm9tICdwbmdqcyc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgeyBoYXNWYWx1ZSB9IGZyb20gJy4vdXRpbCc7XG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCB7IHJlcXVpcmVQYWNrYWdlIH0gZnJvbSAnLi9ub2RlJztcblxuXG5jb25zdCB7IE1JTUVfSlBFRywgTUlNRV9QTkcsIE1JTUVfQk1QIH0gPSBKaW1wO1xubGV0IGN2ID0gbnVsbDtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBSZWdpb25cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsZWZ0IC0gVGhlIG9mZnNldCBmcm9tIHRoZSBsZWZ0IHNpZGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0b3AgLSBUaGUgb2Zmc2V0IGZyb20gdGhlIHRvcFxuICogQHByb3BlcnR5IHtudW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoXG4gKiBAcHJvcGVydHkge251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gUG9pbnRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB4IC0gVGhlIHggY29vcmRpbmF0ZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IHkgLSBUaGUgeSBjb29yZGluYXRlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBSZWN0XG4gKiBAcHJvcGVydHkge251bWJlcn0geCAtIFRoZSB0b3AgbGVmdCBjb29yZGluYXRlXG4gKiBAcHJvcGVydHkge251bWJlcn0geSAtIFRoZSBib3R0b20gcmlnaHQgY29vcmRpbmF0ZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoXG4gKiBAcHJvcGVydHkge251bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodFxuICovXG5cbmNvbnN0IEJZVEVTX0lOX1BJWEVMX0JMT0NLID0gNDtcbmNvbnN0IFNDQU5MSU5FX0ZJTFRFUl9NRVRIT0QgPSA0O1xuY29uc3QgREVGQVVMVF9NQVRDSF9USFJFU0hPTEQgPSAwLjU7XG5jb25zdCBNQVRDSF9ORUlHSEJPVVJfVEhSRVNIT0xEID0gMTA7XG5cbmNvbnN0IEFWQUlMQUJMRV9ERVRFQ1RPUlMgPSBbXG4gICdBS0FaRScsXG4gICdBR0FTVCcsXG4gICdCUklTSycsXG4gICdGQVNUJyxcbiAgJ0dGVFQnLFxuICAnS0FaRScsXG4gICdNU0VSJyxcbiAgJ1NJRlQnLFxuICAnT1JCJyxcbl07XG5cbmNvbnN0IEFWQUlMQUJMRV9NQVRDSElOR19GVU5DVElPTlMgPSBbXG4gICdGbGFubkJhc2VkJyxcbiAgJ0JydXRlRm9yY2UnLFxuICAnQnJ1dGVGb3JjZUwxJyxcbiAgJ0JydXRlRm9yY2VIYW1taW5nJyxcbiAgJ0JydXRlRm9yY2VIYW1taW5nTHV0JyxcbiAgJ0JydXRlRm9yY2VTTDInLFxuXTtcblxuY29uc3QgTUFUQ0hJTkdfTUVUSE9EUyA9IFtcbiAgJ1RNX0NDT0VGRicsXG4gICdUTV9DQ09FRkZfTk9STUVEJyxcbiAgJ1RNX0NDT1JSJyxcbiAgJ1RNX0NDT1JSX05PUk1FRCcsXG4gICdUTV9TUURJRkYnLFxuICAnVE1fU1FESUZGX05PUk1FRCcsXG5dO1xuY29uc3QgREVGQVVMVF9NQVRDSElOR19NRVRIT0QgPSAnVE1fQ0NPRUZGX05PUk1FRCc7XG5cbi8qKlxuICogVHJhbnNmb3JtcyBtYXRjaGluZyBtZXRob2QgbmFtZSB0byB0aGUgYWN0dWFsXG4gKiBjb25zdGFudCB2YWx1ZSBmcm9tIE9wZW5DViBsaWJyYXJ5XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgT25lIG9mIHN1cHBvcnRlZCBtZXRob2QgbmFtZXNcbiAqIChzZWUgTUFUQ0hJTkdfTUVUSE9EUyBhcnJheSBhYm92ZSlcbiAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBtZXRob2QgdmFsdWVcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBhbiB1bnN1cHBvcnRlZCBtZXRob2QgbmFtZSBpcyBnaXZlblxuICovXG5mdW5jdGlvbiB0b01hdGNoaW5nTWV0aG9kIChuYW1lKSB7XG4gIGlmICghTUFUQ0hJTkdfTUVUSE9EUy5pbmNsdWRlcyhuYW1lKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIG1hdGNoaW5nIG1ldGhvZCAnJHtuYW1lfScgaXMgdW5rbm93bi4gYCArXG4gICAgICBgT25seSB0aGUgZm9sbG93aW5nIG1hdGNoaW5nIG1ldGhvZHMgYXJlIHN1cHBvcnRlZDogJHtNQVRDSElOR19NRVRIT0RTfWApO1xuICB9XG4gIHJldHVybiBjdltuYW1lXTtcbn1cblxuLyoqXG4gKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGdldCBhIEppbXAgaW1hZ2Ugb2JqZWN0IGZyb20gYnVmZmVyIG9yIGJhc2U2NCBkYXRhLiBKaW1wXG4gKiBpcyBhIGdyZWF0IGxpYnJhcnkgaG93ZXZlciBpdCBkb2VzIElPIGluIHRoZSBjb25zdHJ1Y3RvciBzbyBpdCdzIG5vdFxuICogY29udmVuaWVudCBmb3Igb3VyIGFzeW5jL2F3YWl0IG1vZGVsLlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfHN0cmluZ30gZGF0YSAtIGJpbmFyeSBpbWFnZSBidWZmZXIgb3IgYmFzZTY0LWVuY29kZWQgaW1hZ2VcbiAqIHN0cmluZ1xuICogQHJldHVybnMge0ppbXB9IC0gdGhlIGppbXAgaW1hZ2Ugb2JqZWN0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEppbXBJbWFnZSAoZGF0YSkge1xuICByZXR1cm4gYXdhaXQgbmV3IEIoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGlmICghXy5pc1N0cmluZyhkYXRhKSAmJiAhXy5pc0J1ZmZlcihkYXRhKSkge1xuICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoJ011c3QgaW5pdGlhbGl6ZSBqaW1wIG9iamVjdCB3aXRoIHN0cmluZyBvciBidWZmZXInKSk7XG4gICAgfVxuICAgIC8vIGlmIGRhdGEgaXMgYSBzdHJpbmcsIGFzc3VtZSBpdCBpcyBhIGJhc2U2NC1lbmNvZGVkIGltYWdlXG4gICAgaWYgKF8uaXNTdHJpbmcoZGF0YSkpIHtcbiAgICAgIGRhdGEgPSBCdWZmZXIuZnJvbShkYXRhLCAnYmFzZTY0Jyk7XG4gICAgfVxuICAgIG5ldyBKaW1wKGRhdGEsIChlcnIsIGltZ09iaikgPT4ge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICByZXR1cm4gcmVqZWN0KGVycik7XG4gICAgICB9XG4gICAgICBpZiAoIWltZ09iaikge1xuICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcignQ291bGQgbm90IGNyZWF0ZSBqaW1wIGltYWdlIGZyb20gdGhhdCBkYXRhJykpO1xuICAgICAgfVxuICAgICAgaW1nT2JqLl9nZXRCdWZmZXIgPSBpbWdPYmouZ2V0QnVmZmVyLmJpbmQoaW1nT2JqKTtcbiAgICAgIGltZ09iai5nZXRCdWZmZXIgPSBCLnByb21pc2lmeShpbWdPYmouX2dldEJ1ZmZlciwge2NvbnRleHQ6IGltZ09ian0pO1xuICAgICAgcmVzb2x2ZShpbWdPYmopO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgb3BlbmN2NG5vZGVqcyBtb2R1bGUgaXMgbm90IGluc3RhbGxlZCBvciBjYW5ub3QgYmUgbG9hZGVkXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGluaXRPcGVuQ1YgKCkge1xuICBpZiAoY3YpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsb2cuZGVidWcoYEluaXRpYWxpemluZyBvcGVuY3ZgKTtcbiAgdHJ5IHtcbiAgICBjdiA9IGF3YWl0IHJlcXVpcmVQYWNrYWdlKCdvcGVuY3Y0bm9kZWpzJyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy53YXJuKGBVbmFibGUgdG8gbG9hZCAnb3BlbmN2NG5vZGVqcyc6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gIH1cblxuICBpZiAoIWN2KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAnb3BlbmN2NG5vZGVqcycgbW9kdWxlIGlzIHJlcXVpcmVkIHRvIHVzZSBPcGVuQ1YgZmVhdHVyZXMuIGAgK1xuICAgICAgICAgICAgICAgICAgICBgUGxlYXNlIGluc3RhbGwgaXQgZmlyc3QgKCducG0gaSAtZyBvcGVuY3Y0bm9kZWpzJykgYW5kIHJlc3RhcnQgQXBwaXVtLiBgICtcbiAgICAgICAgICAgICAgICAgICAgJ1JlYWQgaHR0cHM6Ly9naXRodWIuY29tL2p1c3RhZHVkZXdob2hhY2tzL29wZW5jdjRub2RlanMjaG93LXRvLWluc3RhbGwgZm9yIG1vcmUgZGV0YWlscyBvbiB0aGlzIHRvcGljLicpO1xuICB9XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTWF0Y2hDb21wdXRhdGlvblJlc3VsdFxuICogQHByb3BlcnR5IHtjdi5EZXNjcmlwdG9yTWF0Y2h9IGRlc2NpcHRvciAtIE9wZW5DViBtYXRjaCBkZXNjcmlwdG9yXG4gKiBAcHJvcGVydHkge0FycmF5PGN2LktleVBvaW50Pn0ga2V5UG9pbnRzIC0gVGhlIGFycmF5IG9mIGtleSBwb2ludHNcbiAqL1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgYW4gT3BlbkNWIG1hdGNoIGRlc2NyaXB0b3Igb2YgYW4gaW1hZ2UsIHdoaWNoIGNhbiBiZSB1c2VkXG4gKiBmb3IgYnJ1dGUtZm9yY2UgbWF0Y2hpbmcuXG4gKiBSZWFkIGh0dHBzOi8vZG9jcy5vcGVuY3Yub3JnLzMuMC1iZXRhL2RvYy9weV90dXRvcmlhbHMvcHlfZmVhdHVyZTJkL3B5X21hdGNoZXIvcHlfbWF0Y2hlci5odG1sXG4gKiBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIEBwYXJhbSB7Y3YuTWF0fSBpbWcgSW1hZ2UgZGF0YVxuICogQHBhcmFtIHtjdi5GZWF0dXJlRGV0ZWN0b3J9IGRldGVjdG9yIE9wZW5DViBmZWF0dXJlIGRldGVjdG9yIGluc3RhbmNlXG4gKlxuICogQHJldHVybnMge01hdGNoQ29tcHV0YXRpb25SZXN1bHR9XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRldGVjdEFuZENvbXB1dGUgKGltZywgZGV0ZWN0b3IpIHtcbiAgY29uc3Qga2V5UG9pbnRzID0gYXdhaXQgZGV0ZWN0b3IuZGV0ZWN0QXN5bmMoaW1nKTtcbiAgY29uc3QgZGVzY3JpcHRvciA9IGF3YWl0IGRldGVjdG9yLmNvbXB1dGVBc3luYyhpbWcsIGtleVBvaW50cyk7XG4gIHJldHVybiB7XG4gICAga2V5UG9pbnRzLFxuICAgIGRlc2NyaXB0b3JcbiAgfTtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGVkIHRoZSBib3VuZGluZyByZWN0IGNvb3JkaW5hdGVzIGZvciB0aGUgYXJyYXkgb2YgbWF0Y2hpbmcgcG9pbnRzXG4gKlxuICogQHBhcmFtIHtBcnJheTxQb2ludD59IG1hdGNoZWRQb2ludHMgQXJyYXkgb2YgbWF0Y2hpbmcgcG9pbnRzXG4gKiBAcmV0dXJucyB7UmVjdH0gVGhlIG1hdGNoaW5nIGJvdW5kaW5nIHJlY3Qgb3IgYSB6ZXJvIHJlY3QgaWYgbm8gbWF0Y2hcbiAqIGNhbiBiZSBmb3VuZC5cbiAqL1xuZnVuY3Rpb24gY2FsY3VsYXRlTWF0Y2hlZFJlY3QgKG1hdGNoZWRQb2ludHMpIHtcbiAgaWYgKG1hdGNoZWRQb2ludHMubGVuZ3RoIDwgMikge1xuICAgIHJldHVybiB7XG4gICAgICB4OiAwLFxuICAgICAgeTogMCxcbiAgICAgIHdpZHRoOiAwLFxuICAgICAgaGVpZ2h0OiAwXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IHBvaW50c1NvcnRlZEJ5RGlzdGFuY2UgPSBtYXRjaGVkUG9pbnRzXG4gICAgLm1hcCgocG9pbnQpID0+IFtNYXRoLnNxcnQocG9pbnQueCAqIHBvaW50LnggKyBwb2ludC55ICogcG9pbnQueSksIHBvaW50XSlcbiAgICAuc29ydCgocGFpcjEsIHBhaXIyKSA9PiBwYWlyMVswXSA+PSBwYWlyMlswXSlcbiAgICAubWFwKChwYWlyKSA9PiBwYWlyWzFdKTtcbiAgY29uc3QgZmlyc3RQb2ludCA9IF8uaGVhZChwb2ludHNTb3J0ZWRCeURpc3RhbmNlKTtcbiAgY29uc3QgbGFzdFBvaW50ID0gXy5sYXN0KHBvaW50c1NvcnRlZEJ5RGlzdGFuY2UpO1xuICBjb25zdCB0b3BMZWZ0UG9pbnQgPSB7XG4gICAgeDogZmlyc3RQb2ludC54IDw9IGxhc3RQb2ludC54ID8gZmlyc3RQb2ludC54IDogbGFzdFBvaW50LngsXG4gICAgeTogZmlyc3RQb2ludC55IDw9IGxhc3RQb2ludC55ID8gZmlyc3RQb2ludC55IDogbGFzdFBvaW50LnksXG4gIH07XG4gIGNvbnN0IGJvdHRvbVJpZ2h0UG9pbnQgPSB7XG4gICAgeDogZmlyc3RQb2ludC54ID49IGxhc3RQb2ludC54ID8gZmlyc3RQb2ludC54IDogbGFzdFBvaW50LngsXG4gICAgeTogZmlyc3RQb2ludC55ID49IGxhc3RQb2ludC55ID8gZmlyc3RQb2ludC55IDogbGFzdFBvaW50LnksXG4gIH07XG4gIHJldHVybiB7XG4gICAgeDogdG9wTGVmdFBvaW50LngsXG4gICAgeTogdG9wTGVmdFBvaW50LnksXG4gICAgd2lkdGg6IGJvdHRvbVJpZ2h0UG9pbnQueCAtIHRvcExlZnRQb2ludC54LFxuICAgIGhlaWdodDogYm90dG9tUmlnaHRQb2ludC55IC0gdG9wTGVmdFBvaW50LnlcbiAgfTtcbn1cblxuLyoqXG4gKiBEcmF3cyBhIHJlY3Rhbm5nbGUgb24gdGhlIGdpdmVuIGltYWdlIG1hdHJpeFxuICpcbiAqIEBwYXJhbSB7Y3YuTWF0fSBtYXQgVGhlIHNvdXJjZSBpbWFnZVxuICogQHBhcmFtIHtSZWN0fSByZWdpb24gVGhlIHJlZ2lvbiB0byBoaWdobGlnaHRcbiAqXG4gKiBAcmV0dXJucyB7Y3YuTWF0fSBUaGUgc2FtZSBpbWFnZSB3aXRoIHRoZSByZWN0YW5nbGUgb24gaXRcbiAqL1xuZnVuY3Rpb24gaGlnaGxpZ2h0UmVnaW9uIChtYXQsIHJlZ2lvbikge1xuICBpZiAocmVnaW9uLndpZHRoIDw9IDAgfHwgcmVnaW9uLmhlaWdodCA8PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gaGlnaGxpZ2h0IGluIHJlZFxuICBjb25zdCBjb2xvciA9IG5ldyBjdi5WZWMoMCwgMCwgMjU1KTtcbiAgY29uc3QgdGhpY2tuZXNzID0gMjtcbiAgbWF0LmRyYXdSZWN0YW5nbGUobmV3IGN2LlJlY3QocmVnaW9uLngsIHJlZ2lvbi55LCByZWdpb24ud2lkdGgsIHJlZ2lvbi5oZWlnaHQpLCBjb2xvciwgdGhpY2tuZXNzLCBjdi5MSU5FXzgpO1xuICByZXR1cm4gbWF0O1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IE1hdGNoaW5nT3B0aW9uc1xuICogQHByb3BlcnR5IHs/c3RyaW5nfSBkZXRlY3Rvck5hbWUgWydPUkInXSBPbmUgb2YgcG9zc2libGUgT3BlbkNWIGZlYXR1cmUgZGV0ZWN0b3IgbmFtZXNcbiAqIGZyb20gYEFWQUlMQUJMRV9ERVRFQ1RPUlNgIGFycmF5LlxuICogU29tZSBvZiB0aGVzZSBtZXRob2RzIChGQVNULCBBR0FTVCwgR0ZUVCwgRkFTVCwgU0lGVCBhbmQgTVNFUikgYXJlIG5vdCBhdmFpbGFibGVcbiAqIGluIHRoZSBkZWZhdWx0IE9wZW5DViBpbnN0YWxsYXRpb24gYW5kIGhhdmUgdG8gYmUgZW5hYmxlZCBtYW51YWxseSBiZWZvcmVcbiAqIGxpYnJhcnkgY29tcGlsYXRpb24uXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IG1hdGNoRnVuYyBbJ0JydXRlRm9yY2UnXSBUaGUgbmFtZSBvZiB0aGUgbWF0Y2hpbmcgZnVuY3Rpb24uXG4gKiBTaG91bGQgYmUgb25lIG9mIGBBVkFJTEFCTEVfTUFUQ0hJTkdfRlVOQ1RJT05TYCBhcnJheS5cbiAqIEBwcm9wZXJ0eSB7P251bWJlcnxGdW5jdGlvbn0gZ29vZE1hdGNoZXNGYWN0b3IgVGhlIG1heGltdW0gY291bnQgb2YgXCJnb29kXCIgbWF0Y2hlc1xuICogKGUuIGcuIHdpdGggbWluaW1hbCBkaXN0YW5jZXMpIG9yIGEgZnVuY3Rpb24sIHdoaWNoIGFjY2VwdHMgMyBhcmd1bWVudHM6IHRoZSBjdXJyZW50IGRpc3RhbmNlLFxuICogbWluaW1hbCBkaXN0YW5jZSwgbWF4aW11bSBkaXN0YW5jZSBhbmQgcmV0dXJucyB0cnVlIG9yIGZhbHNlIHRvIGluY2x1ZGUgb3IgZXhjbHVkZSB0aGUgbWF0Y2guXG4gKiBAcHJvcGVydHkgez9ib29sZWFufSB2aXN1YWxpemUgW2ZhbHNlXSBXaGV0aGVyIHRvIHJldHVybiB0aGUgcmVzdWx0aW5nIHZpc2FsaXphdGlvblxuICogYXMgYW4gaW1hZ2UgKHVzZWZ1bCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzKVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTWF0Y2hpbmdSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBjb3VudCBUaGUgY291bnQgb2YgbWF0Y2hlZCBlZGdlcyBvbiBib3RoIGltYWdlcy5cbiAqIFRoZSBtb3JlIG1hdGNoaW5nIGVkZ2VzIHRoZXJlIGFyZSBubyBib3RoIGltYWdlcyB0aGUgbW9yZSBzaW1pbGFyIHRoZXkgYXJlLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHRvdGFsQ291bnQgVGhlIHRvdGFsIGNvdW50IG9mIG1hdGNoZWQgZWRnZXMgb24gYm90aCBpbWFnZXMuXG4gKiBJdCBpcyBlcXVhbCB0byBgY291bnRgIGlmIGBnb29kTWF0Y2hlc0ZhY3RvcmAgZG9lcyBub3QgbGltaXQgdGhlIG1hdGNoZXMsXG4gKiBvdGhlcndpc2UgaXQgY29udGFpbnMgdGhlIHRvdGFsIGNvdW50IG9mIG1hdGNoZXMgYmVmb3JlIGBnb29kTWF0Y2hlc0ZhY3RvcmAgaXNcbiAqIGFwcGxpZWQuXG4gKiBAcHJvcGVydHkgez9CdWZmZXJ9IHZpc3VhbGl6YXRpb24gVGhlIHZpc3VhbGl6YXRpb24gb2YgdGhlIG1hdGNoaW5nIHJlc3VsdFxuICogcmVwcmVzZW50ZWQgYXMgUE5HIGltYWdlIGJ1ZmZlci4gVGhpcyB2aXN1YWxpemF0aW9uIGxvb2tzIGxpa2VcbiAqIGh0dHBzOi8vdXNlci1pbWFnZXMuZ2l0aHVidXNlcmNvbnRlbnQuY29tLzMxMTI1NTIxLzI5NzAyNzMxLWM3OWUzMTQyLTg5NzItMTFlNy05NDdlLWRiMTA5ZDQxNTQ2OS5qcGdcbiAqIEBwcm9wZXJ0eSB7QXJyYXk8UG9pbnQ+fSBwb2ludHMxIFRoZSBhcnJheSBvZiBtYXRjaGluZyBwb2ludHMgb24gdGhlIGZpcnN0IGltYWdlXG4gKiBAcHJvcGVydHkge1JlY3R9IHJlY3QxIFRoZSBib3VuZGluZyByZWN0IGZvciB0aGUgYG1hdGNoZWRQb2ludHMxYCBzZXQgb3IgYSB6ZXJvIHJlY3RcbiAqIGlmIG5vdCBlbm91Z2ggbWF0Y2hpbmcgcG9pbnRzIGFyZSBmb3VuZFxuICogQHByb3BlcnR5IHtBcnJheTxQb2ludD59IHBvaW50czIgVGhlIGFycmF5IG9mIG1hdGNoaW5nIHBvaW50cyBvbiB0aGUgc2Vjb25kIGltYWdlXG4gKiBAcHJvcGVydHkge1JlY3R9IHJlY3QyIFRoZSBib3VuZGluZyByZWN0IGZvciB0aGUgYG1hdGNoZWRQb2ludHMyYCBzZXQgb3IgYSB6ZXJvIHJlY3RcbiAqIGlmIG5vdCBlbm91Z2ggbWF0Y2hpbmcgcG9pbnRzIGFyZSBmb3VuZFxuICovXG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgY291bnQgb2YgY29tbW9uIGVkZ2VzIGJldHdlZW4gdHdvIGltYWdlcy5cbiAqIFRoZSBpbWFnZXMgbWlnaHQgYmUgcm90YXRlZCBvciByZXNpemVkIHJlbGF0aXZlbHkgdG8gZWFjaCBvdGhlci5cbiAqXG4gKiBAcGFyYW0ge0J1ZmZlcn0gaW1nMURhdGEgVGhlIGRhdGEgb2YgdGhlIGZpcnN0IGltYWdlIHBhY2tlZCBpbnRvIGEgTm9kZUpTIGJ1ZmZlclxuICogQHBhcmFtIHtCdWZmZXJ9IGltZzJEYXRhIFRoZSBkYXRhIG9mIHRoZSBzZWNvbmQgaW1hZ2UgcGFja2VkIGludG8gYSBOb2RlSlMgYnVmZmVyXG4gKiBAcGFyYW0gez9NYXRjaGluZ09wdGlvbnN9IG9wdGlvbnMgW3t9XSBTZXQgb2YgbWF0Y2hpbmcgb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIHtNYXRjaGluZ1Jlc3VsdH0gTWFjaGluZyByZXN1bHRcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBgZGV0ZWN0b3JOYW1lYCB2YWx1ZSBpcyB1bmtub3duLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRJbWFnZXNNYXRjaGVzIChpbWcxRGF0YSwgaW1nMkRhdGEsIG9wdGlvbnMgPSB7fSkge1xuICBhd2FpdCBpbml0T3BlbkNWKCk7XG5cbiAgY29uc3Qge2RldGVjdG9yTmFtZSA9ICdPUkInLCB2aXN1YWxpemUgPSBmYWxzZSxcbiAgICAgICAgIGdvb2RNYXRjaGVzRmFjdG9yLCBtYXRjaEZ1bmMgPSAnQnJ1dGVGb3JjZSd9ID0gb3B0aW9ucztcbiAgaWYgKCFfLmluY2x1ZGVzKEFWQUlMQUJMRV9ERVRFQ1RPUlMsIGRldGVjdG9yTmFtZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCcke2RldGVjdG9yTmFtZX0nIGRldGVjdG9yIGlzIHVua25vd24uIGAgK1xuICAgICAgICAgICAgICAgICAgICBgT25seSAke0pTT04uc3RyaW5naWZ5KEFWQUlMQUJMRV9ERVRFQ1RPUlMpfSBkZXRlY3RvcnMgYXJlIHN1cHBvcnRlZC5gKTtcbiAgfVxuICBpZiAoIV8uaW5jbHVkZXMoQVZBSUxBQkxFX01BVENISU5HX0ZVTkNUSU9OUywgbWF0Y2hGdW5jKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJyR7bWF0Y2hGdW5jfScgbWF0Y2hpbmcgZnVuY3Rpb24gaXMgdW5rbm93bi4gYCArXG4gICAgICAgICAgICAgICAgICAgIGBPbmx5ICR7SlNPTi5zdHJpbmdpZnkoQVZBSUxBQkxFX01BVENISU5HX0ZVTkNUSU9OUyl9IG1hdGNoaW5nIGZ1bmN0aW9ucyBhcmUgc3VwcG9ydGVkLmApO1xuICB9XG5cbiAgY29uc3QgZGV0ZWN0b3IgPSBuZXcgY3ZbYCR7ZGV0ZWN0b3JOYW1lfURldGVjdG9yYF0oKTtcbiAgY29uc3QgW2ltZzEsIGltZzJdID0gYXdhaXQgQi5hbGwoW1xuICAgIGN2LmltZGVjb2RlQXN5bmMoaW1nMURhdGEpLFxuICAgIGN2LmltZGVjb2RlQXN5bmMoaW1nMkRhdGEpXG4gIF0pO1xuICBjb25zdCBbcmVzdWx0MSwgcmVzdWx0Ml0gPSBhd2FpdCBCLmFsbChbXG4gICAgZGV0ZWN0QW5kQ29tcHV0ZShpbWcxLCBkZXRlY3RvciksXG4gICAgZGV0ZWN0QW5kQ29tcHV0ZShpbWcyLCBkZXRlY3RvcilcbiAgXSk7XG4gIGxldCBtYXRjaGVzID0gW107XG4gIHRyeSB7XG4gICAgbWF0Y2hlcyA9IGF3YWl0IGN2W2BtYXRjaCR7bWF0Y2hGdW5jfUFzeW5jYF0ocmVzdWx0MS5kZXNjcmlwdG9yLCByZXN1bHQyLmRlc2NyaXB0b3IpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZmluZCBhbnkgbWF0Y2hlcyBiZXR3ZWVuIHRoZSBnaXZlbiBpbWFnZXMuIFRyeSBhbm90aGVyIGRldGVjdGlvbiBhbGdvcml0aG0uIGAgK1xuICAgICAgICAgICAgICAgICAgICBgIE9yaWdpbmFsIGVycm9yOiAke2V9YCk7XG4gIH1cbiAgY29uc3QgdG90YWxDb3VudCA9IG1hdGNoZXMubGVuZ3RoO1xuICBpZiAoaGFzVmFsdWUoZ29vZE1hdGNoZXNGYWN0b3IpKSB7XG4gICAgaWYgKF8uaXNGdW5jdGlvbihnb29kTWF0Y2hlc0ZhY3RvcikpIHtcbiAgICAgIGNvbnN0IGRpc3RhbmNlcyA9IG1hdGNoZXMubWFwKChtYXRjaCkgPT4gbWF0Y2guZGlzdGFuY2UpO1xuICAgICAgY29uc3QgbWluRGlzdGFuY2UgPSBfLm1pbihkaXN0YW5jZXMpO1xuICAgICAgY29uc3QgbWF4RGlzdGFuY2UgPSBfLm1heChkaXN0YW5jZXMpO1xuICAgICAgbWF0Y2hlcyA9IG1hdGNoZXNcbiAgICAgICAgLmZpbHRlcigobWF0Y2gpID0+IGdvb2RNYXRjaGVzRmFjdG9yKG1hdGNoLmRpc3RhbmNlLCBtaW5EaXN0YW5jZSwgbWF4RGlzdGFuY2UpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG1hdGNoZXMubGVuZ3RoID4gZ29vZE1hdGNoZXNGYWN0b3IpIHtcbiAgICAgICAgbWF0Y2hlcyA9IG1hdGNoZXNcbiAgICAgICAgICAuc29ydCgobWF0Y2gxLCBtYXRjaDIpID0+IG1hdGNoMS5kaXN0YW5jZSAtIG1hdGNoMi5kaXN0YW5jZSlcbiAgICAgICAgICAuc2xpY2UoMCwgZ29vZE1hdGNoZXNGYWN0b3IpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGV4dHJhY3RQb2ludCA9IChrZXlQb2ludHMsIGluZGV4UHJvcGVydHlOYW1lKSA9PiAobWF0Y2gpID0+IHtcbiAgICBjb25zdCB7cHQsIHBvaW50fSA9IGtleVBvaW50c1ttYXRjaFtpbmRleFByb3BlcnR5TmFtZV1dO1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9qdXN0YWR1ZGV3aG9oYWNrcy9vcGVuY3Y0bm9kZWpzL2lzc3Vlcy81ODRcbiAgICByZXR1cm4gKHB0IHx8IHBvaW50KTtcbiAgfTtcbiAgY29uc3QgcG9pbnRzMSA9IG1hdGNoZXMubWFwKGV4dHJhY3RQb2ludChyZXN1bHQxLmtleVBvaW50cywgJ3F1ZXJ5SWR4JykpO1xuICBjb25zdCByZWN0MSA9IGNhbGN1bGF0ZU1hdGNoZWRSZWN0KHBvaW50czEpO1xuICBjb25zdCBwb2ludHMyID0gbWF0Y2hlcy5tYXAoZXh0cmFjdFBvaW50KHJlc3VsdDIua2V5UG9pbnRzLCAndHJhaW5JZHgnKSk7XG4gIGNvbnN0IHJlY3QyID0gY2FsY3VsYXRlTWF0Y2hlZFJlY3QocG9pbnRzMik7XG5cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIHBvaW50czEsXG4gICAgcmVjdDEsXG4gICAgcG9pbnRzMixcbiAgICByZWN0MixcbiAgICB0b3RhbENvdW50LFxuICAgIGNvdW50OiBtYXRjaGVzLmxlbmd0aCxcbiAgfTtcbiAgaWYgKHZpc3VhbGl6ZSkge1xuICAgIGNvbnN0IHZpc3VhbGl6YXRpb24gPSBjdi5kcmF3TWF0Y2hlcyhpbWcxLCBpbWcyLCByZXN1bHQxLmtleVBvaW50cywgcmVzdWx0Mi5rZXlQb2ludHMsIG1hdGNoZXMpO1xuICAgIGhpZ2hsaWdodFJlZ2lvbih2aXN1YWxpemF0aW9uLCByZWN0MSk7XG4gICAgaGlnaGxpZ2h0UmVnaW9uKHZpc3VhbGl6YXRpb24sIHtcbiAgICAgIHg6IGltZzEuY29scyArIHJlY3QyLngsXG4gICAgICB5OiByZWN0Mi55LFxuICAgICAgd2lkdGg6IHJlY3QyLndpZHRoLFxuICAgICAgaGVpZ2h0OiByZWN0Mi5oZWlnaHRcbiAgICB9KTtcbiAgICByZXN1bHQudmlzdWFsaXphdGlvbiA9IGF3YWl0IGN2LmltZW5jb2RlQXN5bmMoJy5wbmcnLCB2aXN1YWxpemF0aW9uKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNpbWlsYXJpdHlPcHRpb25zXG4gKiBAcHJvcGVydHkgez9ib29sZWFufSB2aXN1YWxpemUgW2ZhbHNlXSBXaGV0aGVyIHRvIHJldHVybiB0aGUgcmVzdWx0aW5nIHZpc2FsaXphdGlvblxuICogYXMgYW4gaW1hZ2UgKHVzZWZ1bCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1ldGhvZCBbVE1fQ0NPRUZGX05PUk1FRF0gVGhlIG5hbWUgb2YgdGhlIHRlbXBsYXRlIG1hdGNoaW5nIG1ldGhvZC5cbiAqIEFjY2VwdGFibGUgdmFsdWVzIGFyZTpcbiAqIC0gVE1fQ0NPRUZGXG4gKiAtIFRNX0NDT0VGRl9OT1JNRUQgKGRlZmF1bHQpXG4gKiAtIFRNX0NDT1JSXG4gKiAtIFRNX0NDT1JSX05PUk1FRFxuICogLSBUTV9TUURJRkZcbiAqIC0gVE1fU1FESUZGX05PUk1FRFxuICogUmVhZCBodHRwczovL2RvY3Mub3BlbmN2Lm9yZy8zLjAtYmV0YS9kb2MvcHlfdHV0b3JpYWxzL3B5X2ltZ3Byb2MvcHlfdGVtcGxhdGVfbWF0Y2hpbmcvcHlfdGVtcGxhdGVfbWF0Y2hpbmcuaHRtbFxuICogZm9yIG1vcmUgZGV0YWlscy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNpbWlsYXJpdHlSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzY29yZSBUaGUgc2ltaWxhcml0eSBzY29yZSBhcyBhIGZsb2F0IG51bWJlciBpbiByYW5nZSBbMC4wLCAxLjBdLlxuICogMS4wIGlzIHRoZSBoaWdoZXN0IHNjb3JlIChtZWFucyBib3RoIGltYWdlcyBhcmUgdG90YWxseSBlcXVhbCkuXG4gKiBAcHJvcGVydHkgez9CdWZmZXJ9IHZpc3VhbGl6YXRpb24gVGhlIHZpc3VhbGl6YXRpb24gb2YgdGhlIG1hdGNoaW5nIHJlc3VsdFxuICogcmVwcmVzZW50ZWQgYXMgUE5HIGltYWdlIGJ1ZmZlci4gVGhpcyBpbWFnZSBpbmNsdWRlcyBib3RoIGlucHV0IHBpY3R1cmVzIHdoZXJlXG4gKiBkaWZmZXJlbmNlIHJlZ2lvbnMgYXJlIGhpZ2hsaWdodGVkIHdpdGggcmVjdGFuZ2xlcy5cbiAqL1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHNpbWlsYXJpdHkgc2NvcmUgYmV0d2VlbiB0d28gaW1hZ2VzLlxuICogSXQgaXMgZXhwZWN0ZWQsIHRoYXQgYm90aCBpbWFnZXMgaGF2ZSB0aGUgc2FtZSByZXNvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfSBpbWcxRGF0YSBUaGUgZGF0YSBvZiB0aGUgZmlyc3QgaW1hZ2UgcGFja2VkIGludG8gYSBOb2RlSlMgYnVmZmVyXG4gKiBAcGFyYW0ge0J1ZmZlcn0gaW1nMkRhdGEgVGhlIGRhdGEgb2YgdGhlIHNlY29uZCBpbWFnZSBwYWNrZWQgaW50byBhIE5vZGVKUyBidWZmZXJcbiAqIEBwYXJhbSB7P1NpbWlsYXJpdHlPcHRpb25zfSBvcHRpb25zIFt7fV0gU2V0IG9mIHNpbWlsYXJpdHkgY2FsY3VsYXRpb24gb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIHtTaW1pbGFyaXR5UmVzdWx0fSBUaGUgY2FsY3VsYXRpb24gcmVzdWx0XG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGdpdmVuIGltYWdlcyBoYXZlIGRpZmZlcmVudCByZXNvbHV0aW9uLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRJbWFnZXNTaW1pbGFyaXR5IChpbWcxRGF0YSwgaW1nMkRhdGEsIG9wdGlvbnMgPSB7fSkge1xuICBhd2FpdCBpbml0T3BlbkNWKCk7XG5cbiAgY29uc3Qge1xuICAgIG1ldGhvZCA9IERFRkFVTFRfTUFUQ0hJTkdfTUVUSE9ELFxuICAgIHZpc3VhbGl6ZSA9IGZhbHNlLFxuICB9ID0gb3B0aW9ucztcbiAgbGV0IFt0ZW1wbGF0ZSwgcmVmZXJlbmNlXSA9IGF3YWl0IEIuYWxsKFtcbiAgICBjdi5pbWRlY29kZUFzeW5jKGltZzFEYXRhKSxcbiAgICBjdi5pbWRlY29kZUFzeW5jKGltZzJEYXRhKVxuICBdKTtcbiAgaWYgKHRlbXBsYXRlLnJvd3MgIT09IHJlZmVyZW5jZS5yb3dzIHx8IHRlbXBsYXRlLmNvbHMgIT09IHJlZmVyZW5jZS5jb2xzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdCb3RoIGltYWdlcyBhcmUgZXhwZWN0ZWQgdG8gaGF2ZSB0aGUgc2FtZSBzaXplIGluIG9yZGVyIHRvICcgK1xuICAgICAgICAgICAgICAgICAgICAnY2FsY3VsYXRlIHRoZSBzaW1pbGFyaXR5IHNjb3JlLicpO1xuICB9XG4gIFt0ZW1wbGF0ZSwgcmVmZXJlbmNlXSA9IGF3YWl0IEIuYWxsKFtcbiAgICB0ZW1wbGF0ZS5jb252ZXJ0VG9Bc3luYyhjdi5DVl84VUMzKSxcbiAgICByZWZlcmVuY2UuY29udmVydFRvQXN5bmMoY3YuQ1ZfOFVDMylcbiAgXSk7XG5cbiAgbGV0IG1hdGNoZWQ7XG4gIHRyeSB7XG4gICAgbWF0Y2hlZCA9IGF3YWl0IHJlZmVyZW5jZS5tYXRjaFRlbXBsYXRlQXN5bmModGVtcGxhdGUsIHRvTWF0Y2hpbmdNZXRob2QobWV0aG9kKSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSByZWZlcmVuY2UgaW1hZ2UgZGlkIG5vdCBtYXRjaCB0byB0aGUgdGVtcGxhdGUgb25lLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbiAgY29uc3QgbWluTWF4ID0gYXdhaXQgbWF0Y2hlZC5taW5NYXhMb2NBc3luYygpO1xuICBjb25zdCByZXN1bHQgPSB7XG4gICAgc2NvcmU6IG1pbk1heC5tYXhWYWxcbiAgfTtcbiAgaWYgKHZpc3VhbGl6ZSkge1xuICAgIGNvbnN0IHJlc3VsdE1hdCA9IG5ldyBjdi5NYXQodGVtcGxhdGUucm93cywgdGVtcGxhdGUuY29scyAqIDIsIGN2LkNWXzhVQzMpO1xuICAgIGF3YWl0IEIuYWxsKFtcbiAgICAgIHJlZmVyZW5jZS5jb3B5VG9Bc3luYyhcbiAgICAgICAgcmVzdWx0TWF0LmdldFJlZ2lvbihuZXcgY3YuUmVjdCgwLCAwLCByZWZlcmVuY2UuY29scywgcmVmZXJlbmNlLnJvd3MpKSksXG4gICAgICB0ZW1wbGF0ZS5jb3B5VG9Bc3luYyhcbiAgICAgICAgcmVzdWx0TWF0LmdldFJlZ2lvbihuZXcgY3YuUmVjdChyZWZlcmVuY2UuY29scywgMCwgdGVtcGxhdGUuY29scywgdGVtcGxhdGUucm93cykpKVxuICAgIF0pO1xuICAgIGxldCBtYXNrID0gcmVmZXJlbmNlLmFic2RpZmYodGVtcGxhdGUpO1xuICAgIG1hc2sgPSBhd2FpdCBtYXNrLmN2dENvbG9yQXN5bmMoY3YuQ09MT1JfQkdSMkdSQVkpO1xuICAgIGxldCBjb250b3VycyA9IFtdO1xuICAgIHRyeSB7XG4gICAgICBtYXNrID0gYXdhaXQgbWFzay50aHJlc2hvbGRBc3luYygxMjgsIDI1NSwgY3YuVEhSRVNIX0JJTkFSWSB8IGN2LlRIUkVTSF9PVFNVKTtcbiAgICAgIGNvbnRvdXJzID0gYXdhaXQgbWFzay5maW5kQ29udG91cnNBc3luYyhjdi5SRVRSX0VYVEVSTkFMLCBjdi5DSEFJTl9BUFBST1hfU0lNUExFKTtcbiAgICB9IGNhdGNoIChpZ24pIHtcbiAgICAgIC8vIE5vIGNvbnRvdXJzIGNhbiBiZSBmb3VuZCwgd2hpY2ggbWVhbnMsIG1vc3QgbGlrZWx5LCB0aGF0IGltYWdlcyBhcmUgZXF1YWxcbiAgICB9XG4gICAgZm9yIChjb25zdCBjb250b3VyIG9mIGNvbnRvdXJzKSB7XG4gICAgICBjb25zdCBib3VuZGluZ1JlY3QgPSBjb250b3VyLmJvdW5kaW5nUmVjdCgpO1xuICAgICAgaGlnaGxpZ2h0UmVnaW9uKHJlc3VsdE1hdCwgYm91bmRpbmdSZWN0KTtcbiAgICAgIGhpZ2hsaWdodFJlZ2lvbihyZXN1bHRNYXQsIHtcbiAgICAgICAgeDogcmVmZXJlbmNlLmNvbHMgKyBib3VuZGluZ1JlY3QueCxcbiAgICAgICAgeTogYm91bmRpbmdSZWN0LnksXG4gICAgICAgIHdpZHRoOiBib3VuZGluZ1JlY3Qud2lkdGgsXG4gICAgICAgIGhlaWdodDogYm91bmRpbmdSZWN0LmhlaWdodFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJlc3VsdC52aXN1YWxpemF0aW9uID0gYXdhaXQgY3YuaW1lbmNvZGVBc3luYygnLnBuZycsIHJlc3VsdE1hdCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBPY2N1cnJlbmNlT3B0aW9uc1xuICogQHByb3BlcnR5IHs/Ym9vbGVhbn0gdmlzdWFsaXplIFtmYWxzZV0gV2hldGhlciB0byByZXR1cm4gdGhlIHJlc3VsdGluZyB2aXNhbGl6YXRpb25cbiAqIGFzIGFuIGltYWdlICh1c2VmdWwgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcylcbiAqIEBwcm9wZXJ0eSB7P2Zsb2F0fSB0aHJlc2hvbGQgWzAuNV0gQXQgd2hhdCBub3JtYWxpemVkIHRocmVzaG9sZCB0byByZWplY3RcbiAqIGEgbWF0Y2hcbiAqIEBwcm9wZXJ0eSB7P2Zsb2F0fSBtdWx0aXBsZSBbZmFsc2VdIGZpbmQgbXVsdGlwbGUgbWF0Y2hlcyBpbiB0aGUgaW1hZ2VcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gbWF0Y2hOZWlnaGJvdXJUaHJlc2hvbGQgWzEwXSBUaGUgcGl4ZWwgZGlzdGFuY2UgYmV0d2VlbiBtYXRjaGVzIHdlIGNvbnNpZGVyXG4gKiB0byBiZSBwYXJ0IG9mIHRoZSBzYW1lIHRlbXBsYXRlIG1hdGNoXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBPY2N1cnJlbmNlUmVzdWx0XG4gKiBAcHJvcGVydHkge1JlY3R9IHJlY3QgVGhlIHJlZ2lvbiBvZiB0aGUgcGFydGlhbCBpbWFnZSBvY2N1cmVuY2VcbiAqIG9uIHRoZSBmdWxsIGltYWdlXG4gKiBAcHJvcGVydHkgez9CdWZmZXJ9IHZpc3VhbGl6YXRpb24gVGhlIHZpc3VhbGl6YXRpb24gb2YgdGhlIG1hdGNoaW5nIHJlc3VsdFxuICogcmVwcmVzZW50ZWQgYXMgUE5HIGltYWdlIGJ1ZmZlci4gT24gdGhpcyBpbWFnZSB0aGUgbWF0Y2hpbmdcbiAqIHJlZ2lvbiBpcyBoaWdobGlnaHRlZCB3aXRoIGEgcmVjdGFuZ2xlLiBJZiB0aGUgbXVsdGlwbGUgb3B0aW9uIGlzIHBhc3NlZCxcbiAqIGFsbCByZXN1bHRzIGFyZSBoaWdobGlnaHRlZCBoZXJlLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHNjb3JlIFRoZSBzaW1pbGFyaXR5IHNjb3JlIGFzIGEgZmxvYXQgbnVtYmVyIGluIHJhbmdlIFswLjAsIDEuMF0uXG4gKiAxLjAgaXMgdGhlIGhpZ2hlc3Qgc2NvcmUgKG1lYW5zIGJvdGggaW1hZ2VzIGFyZSB0b3RhbGx5IGVxdWFsKS5cbiAqIEBwcm9wZXJ0eSB7QXJyYXk8T2NjdXJyZW5jZVJlc3VsdD59IG11bHRpcGxlIFRoZSBhcnJheSBvZiBtYXRjaGluZyBPY2N1cmVuY2VSZXN1bHRzXG4gKiAtIG9ubHkgd2hlbiBtdWx0aXBsZSBvcHRpb24gaXMgcGFzc2VkXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbWV0aG9kIFtUTV9DQ09FRkZfTk9STUVEXSBUaGUgbmFtZSBvZiB0aGUgdGVtcGxhdGUgbWF0Y2hpbmcgbWV0aG9kLlxuICogQWNjZXB0YWJsZSB2YWx1ZXMgYXJlOlxuICogLSBUTV9DQ09FRkZcbiAqIC0gVE1fQ0NPRUZGX05PUk1FRCAoZGVmYXVsdClcbiAqIC0gVE1fQ0NPUlJcbiAqIC0gVE1fQ0NPUlJfTk9STUVEXG4gKiAtIFRNX1NRRElGRlxuICogLSBUTV9TUURJRkZfTk9STUVEXG4gKiBSZWFkIGh0dHBzOi8vZG9jcy5vcGVuY3Yub3JnLzMuMC1iZXRhL2RvYy9weV90dXRvcmlhbHMvcHlfaW1ncHJvYy9weV90ZW1wbGF0ZV9tYXRjaGluZy9weV90ZW1wbGF0ZV9tYXRjaGluZy5odG1sXG4gKiBmb3IgbW9yZSBkZXRhaWxzLlxuICovXG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgb2NjdXJyZW5jZSBwb3NpdGlvbiBvZiBhIHBhcnRpYWwgaW1hZ2UgaW4gdGhlIGZ1bGxcbiAqIGltYWdlLlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfSBmdWxsSW1nRGF0YSBUaGUgZGF0YSBvZiB0aGUgZnVsbCBpbWFnZSBwYWNrZWQgaW50byBhIE5vZGVKUyBidWZmZXJcbiAqIEBwYXJhbSB7QnVmZmVyfSBwYXJ0aWFsSW1nRGF0YSBUaGUgZGF0YSBvZiB0aGUgcGFydGlhbCBpbWFnZSBwYWNrZWQgaW50byBhIE5vZGVKUyBidWZmZXJcbiAqIEBwYXJhbSB7P09jY3VycmVuY2VPcHRpb25zfSBvcHRpb25zIFt7fV0gU2V0IG9mIG9jY3VycmVuY2UgY2FsY3VsYXRpb24gb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIHtPY2N1cnJlbmNlUmVzdWx0fVxuICogQHRocm93cyB7RXJyb3J9IElmIG5vIG9jY3VycmVuY2VzIG9mIHRoZSBwYXJ0aWFsIGltYWdlIGNhbiBiZSBmb3VuZCBpbiB0aGUgZnVsbCBpbWFnZVxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRJbWFnZU9jY3VycmVuY2UgKGZ1bGxJbWdEYXRhLCBwYXJ0aWFsSW1nRGF0YSwgb3B0aW9ucyA9IHt9KSB7XG4gIGF3YWl0IGluaXRPcGVuQ1YoKTtcblxuICBjb25zdCB7XG4gICAgdmlzdWFsaXplID0gZmFsc2UsXG4gICAgdGhyZXNob2xkID0gREVGQVVMVF9NQVRDSF9USFJFU0hPTEQsXG4gICAgbXVsdGlwbGUgPSBmYWxzZSxcbiAgICBtYXRjaE5laWdoYm91clRocmVzaG9sZCA9IE1BVENIX05FSUdIQk9VUl9USFJFU0hPTEQsXG4gICAgbWV0aG9kID0gREVGQVVMVF9NQVRDSElOR19NRVRIT0QsXG4gIH0gPSBvcHRpb25zO1xuXG4gIGNvbnN0IFtmdWxsSW1nLCBwYXJ0aWFsSW1nXSA9IGF3YWl0IEIuYWxsKFtcbiAgICBjdi5pbWRlY29kZUFzeW5jKGZ1bGxJbWdEYXRhKSxcbiAgICBjdi5pbWRlY29kZUFzeW5jKHBhcnRpYWxJbWdEYXRhKVxuICBdKTtcbiAgY29uc3QgcmVzdWx0cyA9IFtdO1xuICBsZXQgdmlzdWFsaXphdGlvbiA9IG51bGw7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBtYXRjaGVkID0gYXdhaXQgZnVsbEltZy5tYXRjaFRlbXBsYXRlQXN5bmMocGFydGlhbEltZywgdG9NYXRjaGluZ01ldGhvZChtZXRob2QpKTtcbiAgICBjb25zdCBtaW5NYXggPSBhd2FpdCBtYXRjaGVkLm1pbk1heExvY0FzeW5jKCk7XG5cbiAgICBpZiAobXVsdGlwbGUpIHtcbiAgICAgIGNvbnN0IG5vblplcm9NYXRjaFJlc3VsdHMgPSBtYXRjaGVkLnRocmVzaG9sZCh0aHJlc2hvbGQsIDEsIGN2LlRIUkVTSF9CSU5BUlkpXG4gICAgICAgIC5jb252ZXJ0VG8oY3YuQ1ZfOFUpXG4gICAgICAgIC5maW5kTm9uWmVybygpO1xuICAgICAgY29uc3QgbWF0Y2hlcyA9IGZpbHRlck5lYXJNYXRjaGVzKG5vblplcm9NYXRjaFJlc3VsdHMsIG1hdGNoTmVpZ2hib3VyVGhyZXNob2xkKTtcblxuICAgICAgZm9yIChjb25zdCB7eCwgeX0gb2YgbWF0Y2hlcykge1xuICAgICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICAgIHNjb3JlOiBtYXRjaGVkLmF0KHksIHgpLFxuICAgICAgICAgIHJlY3Q6IHtcbiAgICAgICAgICAgIHgsIHksXG4gICAgICAgICAgICB3aWR0aDogcGFydGlhbEltZy5jb2xzLFxuICAgICAgICAgICAgaGVpZ2h0OiBwYXJ0aWFsSW1nLnJvd3NcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobWluTWF4Lm1heFZhbCA+PSB0aHJlc2hvbGQpIHtcbiAgICAgIGNvbnN0IHt4LCB5fSA9IG1ldGhvZC5pbmNsdWRlcygnU1FESUZGJykgPyBtaW5NYXgubWluTG9jIDogbWluTWF4Lm1heExvYztcbiAgICAgIHJlc3VsdHMucHVzaCh7XG4gICAgICAgIHNjb3JlOiBtaW5NYXgubWF4VmFsLFxuICAgICAgICByZWN0OiB7XG4gICAgICAgICAgeCwgeSxcbiAgICAgICAgICB3aWR0aDogcGFydGlhbEltZy5jb2xzLFxuICAgICAgICAgIGhlaWdodDogcGFydGlhbEltZy5yb3dzXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChfLmlzRW1wdHkocmVzdWx0cykpIHtcbiAgICAgIC8vIEJlbG93IGVycm9yIG1lc3NhZ2UsIGBDYW5ub3QgZmluZCBhbnkgb2NjdXJyZW5jZXNgIGlzIHJlZmVyZW5jZWQgaW4gZmluZCBieSBpbWFnZVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNYXRjaCB0aHJlc2hvbGQ6ICR7dGhyZXNob2xkfS4gSGlnaGVzdCBtYXRjaCB2YWx1ZSBgICtcbiAgICAgICAgICAgICAgICAgICAgICBgZm91bmQgd2FzICR7bWluTWF4Lm1heFZhbH1gKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBCZWxvdyBlcnJvciBtZXNzYWdlLCBgQ2Fubm90IGZpbmQgYW55IG9jY3VycmVuY2VzYCBpcyByZWZlcmVuY2VkIGluIGZpbmQgYnkgaW1hZ2VcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBmaW5kIGFueSBvY2N1cnJlbmNlcyBvZiB0aGUgcGFydGlhbCBpbWFnZSBpbiB0aGUgZnVsbCBpbWFnZS4gYCArXG4gICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG5cbiAgaWYgKHZpc3VhbGl6ZSkge1xuICAgIGNvbnN0IGZ1bGxIaWdobGlnaHRlZEltYWdlID0gZnVsbEltZy5jb3B5KCk7XG5cbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgICBjb25zdCBzaW5nbGVIaWdobGlnaHRlZEltYWdlID0gZnVsbEltZy5jb3B5KCk7XG5cbiAgICAgIGhpZ2hsaWdodFJlZ2lvbihzaW5nbGVIaWdobGlnaHRlZEltYWdlLCByZXN1bHQucmVjdCk7XG4gICAgICBoaWdobGlnaHRSZWdpb24oZnVsbEhpZ2hsaWdodGVkSW1hZ2UsIHJlc3VsdC5yZWN0KTtcbiAgICAgIHJlc3VsdC52aXN1YWxpemF0aW9uID0gYXdhaXQgY3YuaW1lbmNvZGVBc3luYygnLnBuZycsIHNpbmdsZUhpZ2hsaWdodGVkSW1hZ2UpO1xuICAgIH1cbiAgICB2aXN1YWxpemF0aW9uID0gYXdhaXQgY3YuaW1lbmNvZGVBc3luYygnLnBuZycsIGZ1bGxIaWdobGlnaHRlZEltYWdlKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcmVjdDogcmVzdWx0c1swXS5yZWN0LFxuICAgIHNjb3JlOiByZXN1bHRzWzBdLnNjb3JlLFxuICAgIHZpc3VhbGl6YXRpb24sXG4gICAgbXVsdGlwbGU6IHJlc3VsdHNcbiAgfTtcbn1cblxuLyoqXG4gKiBGaWx0ZXIgb3V0IG1hdGNoIHJlc3VsdHMgd2hpY2ggaGF2ZSBhIG1hdGNoZWQgbmVpZ2hib3VyXG4gKlxuICogQHBhcmFtIHtBcnJheTxQb2ludD59IG5vblplcm9NYXRjaFJlc3VsdHMgbWF0cml4IG9mIGltYWdlIG1hdGNoIHJlc3VsdHNcbiAqIEBwYXJhbSB7bnVtYmVyfSBtYXRjaE5laWdoYm91clRocmVzaG9sZCBUaGUgcGl4ZWwgZGlzdGFuY2Ugd2l0aGluIHdoaWNoIHdlXG4gKiBjb25zaWRlciBhbiBlbGVtZW50IGJlaW5nIGEgbmVpZ2hib3VyIG9mIGFuIGV4aXN0aW5nIG1hdGNoXG4gKiBAcmV0dXJuIHtBcnJheTxQb2ludD59IHRoZSBmaWx0ZXJlZCBhcnJheSBvZiBtYXRjaGVkIHBvaW50c1xuICovXG5mdW5jdGlvbiBmaWx0ZXJOZWFyTWF0Y2hlcyAobm9uWmVyb01hdGNoUmVzdWx0cywgbWF0Y2hOZWlnaGJvdXJUaHJlc2hvbGQpIHtcbiAgcmV0dXJuIG5vblplcm9NYXRjaFJlc3VsdHMucmVkdWNlKChhY2MsIGVsZW1lbnQpID0+IHtcbiAgICBpZiAoIWFjYy5zb21lKChtYXRjaCkgPT4gZGlzdGFuY2UobWF0Y2gsIGVsZW1lbnQpIDw9IG1hdGNoTmVpZ2hib3VyVGhyZXNob2xkKSkge1xuICAgICAgYWNjLnB1c2goZWxlbWVudCk7XG4gICAgfVxuICAgIHJldHVybiBhY2M7XG4gIH0sIFtdKTtcbn1cblxuLyoqXG4gKiBGaW5kIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHR3byBwb2ludHNcbiAqXG4gKiBAcGFyYW0ge1BvaW50fSBwb2ludDEgVGhlIGZpcnN0IHBvaW50XG4gKiBAcGFyYW0ge1BvaW50fSBwb2ludDIgVGhlIHNlY29uZCBwb2ludFxuICogQHJldHVybiB7bnVtYmVyfSB0aGUgZGlzdGFuY2VcbiAqL1xuZnVuY3Rpb24gZGlzdGFuY2UgKHBvaW50MSwgcG9pbnQyKSB7XG4gIGNvbnN0IGEyID0gTWF0aC5wb3coKHBvaW50MS54IC0gcG9pbnQyLngpLCAyKTtcbiAgY29uc3QgYjIgPSBNYXRoLnBvdygocG9pbnQxLnkgLSBwb2ludDIueSksIDIpO1xuICByZXR1cm4gTWF0aC5zcXJ0KGEyICsgYjIpO1xufVxuXG4vKipcbiAqIENyb3AgdGhlIGltYWdlIGJ5IGdpdmVuIHJlY3RhbmdsZSAodXNlIGJhc2U2NCBzdHJpbmcgYXMgaW5wdXQgYW5kIG91dHB1dClcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYmFzZTY0SW1hZ2UgVGhlIHN0cmluZyB3aXRoIGJhc2U2NCBlbmNvZGVkIGltYWdlXG4gKiBAcGFyYW0ge1JlZ2lvbn0gcmVjdCBUaGUgc2VsZWN0ZWQgcmVnaW9uIG9mIGltYWdlXG4gKiBAcmV0dXJuIHtzdHJpbmd9IGJhc2U2NCBlbmNvZGVkIHN0cmluZyBvZiBjcm9wcGVkIGltYWdlXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNyb3BCYXNlNjRJbWFnZSAoYmFzZTY0SW1hZ2UsIHJlY3QpIHtcbiAgY29uc3QgaW1hZ2UgPSBhd2FpdCBiYXNlNjRUb0ltYWdlKGJhc2U2NEltYWdlKTtcbiAgY3JvcEltYWdlKGltYWdlLCByZWN0KTtcbiAgcmV0dXJuIGF3YWl0IGltYWdlVG9CYXNlNjQoaW1hZ2UpO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIHBuZ2pzIGltYWdlIGZyb20gZ2l2ZW4gYmFzZTY0IGltYWdlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGJhc2U2NEltYWdlIFRoZSBzdHJpbmcgd2l0aCBiYXNlNjQgZW5jb2RlZCBpbWFnZVxuICogQHJldHVybiB7UE5HfSBUaGUgaW1hZ2Ugb2JqZWN0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGJhc2U2NFRvSW1hZ2UgKGJhc2U2NEltYWdlKSB7XG4gIGNvbnN0IGltYWdlQnVmZmVyID0gQnVmZmVyLmZyb20oYmFzZTY0SW1hZ2UsICdiYXNlNjQnKTtcbiAgcmV0dXJuIGF3YWl0IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBpbWFnZSA9IG5ldyBQTkcoe2ZpbHRlclR5cGU6IFNDQU5MSU5FX0ZJTFRFUl9NRVRIT0R9KTtcbiAgICBpbWFnZS5wYXJzZShpbWFnZUJ1ZmZlciwgKGVyciwgaW1hZ2UpID0+IHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBwcm9taXNlL3ByZWZlci1hd2FpdC10by1jYWxsYmFja3NcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIHJlamVjdChlcnIpO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZShpbWFnZSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIGJhc2U2NCBzdHJpbmcgZm9yIGdpdmVuIGltYWdlIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7UE5HfSBpbWFnZSBUaGUgaW1hZ2Ugb2JqZWN0XG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBzdHJpbmcgd2l0aCBiYXNlNjQgZW5jb2RlZCBpbWFnZVxuICovXG5hc3luYyBmdW5jdGlvbiBpbWFnZVRvQmFzZTY0IChpbWFnZSkge1xuICByZXR1cm4gYXdhaXQgbmV3IEIoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IGNodW5rcyA9IFtdO1xuICAgIGltYWdlLnBhY2soKVxuICAgIC5vbignZGF0YScsIChjaHVuaykgPT4gY2h1bmtzLnB1c2goY2h1bmspKS5vbignZW5kJywgKCkgPT4ge1xuICAgICAgcmVzb2x2ZShCdWZmZXIuY29uY2F0KGNodW5rcykudG9TdHJpbmcoJ2Jhc2U2NCcpKTtcbiAgICB9KVxuICAgIC5vbignZXJyb3InLCAoZXJyKSA9PiB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcHJvbWlzZS9wcmVmZXItYXdhaXQtdG8tY2FsbGJhY2tzXG4gICAgICByZWplY3QoZXJyKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogQ3JvcCB0aGUgaW1hZ2UgYnkgZ2l2ZW4gcmVjdGFuZ2xlXG4gKlxuICogQHBhcmFtIHtQTkd9IGltYWdlIFRoZSBpbWFnZSB0byBtdXRhdGUgYnkgY3JvcHBpbmdcbiAqIEBwYXJhbSB7UmVnaW9ufSByZWN0IFRoZSBzZWxlY3RlZCByZWdpb24gb2YgaW1hZ2VcbiAqL1xuZnVuY3Rpb24gY3JvcEltYWdlIChpbWFnZSwgcmVjdCkge1xuICBjb25zdCBpbWFnZVJlY3QgPSB7d2lkdGg6IGltYWdlLndpZHRoLCBoZWlnaHQ6IGltYWdlLmhlaWdodH07XG4gIGNvbnN0IGludGVyUmVjdCA9IGdldFJlY3RJbnRlcnNlY3Rpb24ocmVjdCwgaW1hZ2VSZWN0KTtcbiAgaWYgKGludGVyUmVjdC53aWR0aCA8IHJlY3Qud2lkdGggfHwgaW50ZXJSZWN0LmhlaWdodCA8IHJlY3QuaGVpZ2h0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY3JvcCAke0pTT04uc3RyaW5naWZ5KHJlY3QpfSBmcm9tICR7SlNPTi5zdHJpbmdpZnkoaW1hZ2VSZWN0KX0gYmVjYXVzZSB0aGUgaW50ZXJzZWN0aW9uIGJldHdlZW4gdGhlbSB3YXMgbm90IHRoZSBzaXplIG9mIHRoZSByZWN0YCk7XG4gIH1cblxuICBjb25zdCBmaXJzdFZlcnRpY2FsUGl4ZWwgPSBpbnRlclJlY3QudG9wO1xuICBjb25zdCBsYXN0VmVydGljYWxQaXhlbCA9IGludGVyUmVjdC50b3AgKyBpbnRlclJlY3QuaGVpZ2h0O1xuXG4gIGNvbnN0IGZpcnN0SG9yaXpvbnRhbFBpeGVsID0gaW50ZXJSZWN0LmxlZnQ7XG4gIGNvbnN0IGxhc3RIb3Jpem9udGFsUGl4ZWwgPSBpbnRlclJlY3QubGVmdCArIGludGVyUmVjdC53aWR0aDtcblxuICBjb25zdCBjcm9wcGVkQXJyYXkgPSBbXTtcbiAgZm9yIChsZXQgeSA9IGZpcnN0VmVydGljYWxQaXhlbDsgeSA8IGxhc3RWZXJ0aWNhbFBpeGVsOyB5KyspIHtcbiAgICBmb3IgKGxldCB4ID0gZmlyc3RIb3Jpem9udGFsUGl4ZWw7IHggPCBsYXN0SG9yaXpvbnRhbFBpeGVsOyB4KyspIHtcbiAgICAgIGNvbnN0IGZpcnN0Qnl0ZUlkeEluUGl4ZWxCbG9jayA9IChpbWFnZVJlY3Qud2lkdGggKiB5ICsgeCkgPDwgMjtcbiAgICAgIGZvciAobGV0IGJ5dGVJZHggPSAwOyBieXRlSWR4IDwgQllURVNfSU5fUElYRUxfQkxPQ0s7IGJ5dGVJZHgrKykge1xuICAgICAgICBjcm9wcGVkQXJyYXkucHVzaChpbWFnZS5kYXRhW2ZpcnN0Qnl0ZUlkeEluUGl4ZWxCbG9jayArIGJ5dGVJZHhdKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpbWFnZS5kYXRhID0gQnVmZmVyLmZyb20oY3JvcHBlZEFycmF5KTtcbiAgaW1hZ2Uud2lkdGggPSBpbnRlclJlY3Qud2lkdGg7XG4gIGltYWdlLmhlaWdodCA9IGludGVyUmVjdC5oZWlnaHQ7XG4gIHJldHVybiBpbWFnZTtcbn1cblxuZnVuY3Rpb24gZ2V0UmVjdEludGVyc2VjdGlvbiAocmVjdCwgaW1hZ2VTaXplKSB7XG4gIGNvbnN0IGxlZnQgPSByZWN0LmxlZnQgPj0gaW1hZ2VTaXplLndpZHRoID8gaW1hZ2VTaXplLndpZHRoIDogcmVjdC5sZWZ0O1xuICBjb25zdCB0b3AgPSByZWN0LnRvcCA+PSBpbWFnZVNpemUuaGVpZ2h0ID8gaW1hZ2VTaXplLmhlaWdodCA6IHJlY3QudG9wO1xuICBjb25zdCB3aWR0aCA9IGltYWdlU2l6ZS53aWR0aCA+PSAobGVmdCArIHJlY3Qud2lkdGgpID8gcmVjdC53aWR0aCA6IChpbWFnZVNpemUud2lkdGggLSBsZWZ0KTtcbiAgY29uc3QgaGVpZ2h0ID0gaW1hZ2VTaXplLmhlaWdodCA+PSAodG9wICsgcmVjdC5oZWlnaHQpID8gcmVjdC5oZWlnaHQgOiAoaW1hZ2VTaXplLmhlaWdodCAtIHRvcCk7XG4gIHJldHVybiB7bGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0fTtcbn1cblxuZXhwb3J0IHtcbiAgY3JvcEJhc2U2NEltYWdlLCBiYXNlNjRUb0ltYWdlLCBpbWFnZVRvQmFzZTY0LCBjcm9wSW1hZ2UsIGdldEltYWdlc01hdGNoZXMsXG4gIGdldEltYWdlc1NpbWlsYXJpdHksIGdldEltYWdlT2NjdXJyZW5jZSwgZ2V0SmltcEltYWdlLCBNSU1FX0pQRUcsIE1JTUVfUE5HLFxuICBNSU1FX0JNUCxcbn07XG4iXSwiZmlsZSI6ImxpYi9pbWFnZS11dGlsLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
|
|
480
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9pbWFnZS11dGlsLmpzIl0sIm5hbWVzIjpbIk9DVl9PTEQiLCJPQ1ZfTkVXIiwiTUlNRV9KUEVHIiwiTUlNRV9QTkciLCJNSU1FX0JNUCIsIkppbXAiLCJjdiIsIkJZVEVTX0lOX1BJWEVMX0JMT0NLIiwiU0NBTkxJTkVfRklMVEVSX01FVEhPRCIsIkRFRkFVTFRfTUFUQ0hfVEhSRVNIT0xEIiwiTUFUQ0hfTkVJR0hCT1VSX1RIUkVTSE9MRCIsIkFWQUlMQUJMRV9ERVRFQ1RPUlMiLCJBVkFJTEFCTEVfTUFUQ0hJTkdfRlVOQ1RJT05TIiwiTUFUQ0hJTkdfTUVUSE9EUyIsIkRFRkFVTFRfTUFUQ0hJTkdfTUVUSE9EIiwidG9NYXRjaGluZ01ldGhvZCIsIm5hbWUiLCJpbmNsdWRlcyIsIkVycm9yIiwiZ2V0SmltcEltYWdlIiwiZGF0YSIsIkIiLCJyZXNvbHZlIiwicmVqZWN0IiwiXyIsImlzU3RyaW5nIiwiaXNCdWZmZXIiLCJCdWZmZXIiLCJmcm9tIiwiZXJyIiwiaW1nT2JqIiwiX2dldEJ1ZmZlciIsImdldEJ1ZmZlciIsImJpbmQiLCJwcm9taXNpZnkiLCJjb250ZXh0IiwiaW5pdE9wZW5DViIsImxvZyIsImRlYnVnIiwib2N2UGFja2FnZSIsIndhcm4iLCJtZXNzYWdlIiwiZGV0ZWN0QW5kQ29tcHV0ZSIsImltZyIsImRldGVjdG9yIiwia2V5UG9pbnRzIiwiZGV0ZWN0QXN5bmMiLCJkZXNjcmlwdG9yIiwiY29tcHV0ZUFzeW5jIiwiY2FsY3VsYXRlTWF0Y2hlZFJlY3QiLCJtYXRjaGVkUG9pbnRzIiwibGVuZ3RoIiwieCIsInkiLCJ3aWR0aCIsImhlaWdodCIsInBvaW50c1NvcnRlZEJ5RGlzdGFuY2UiLCJtYXAiLCJwb2ludCIsIk1hdGgiLCJzcXJ0Iiwic29ydCIsInBhaXIxIiwicGFpcjIiLCJwYWlyIiwiZmlyc3RQb2ludCIsImhlYWQiLCJsYXN0UG9pbnQiLCJsYXN0IiwidG9wTGVmdFBvaW50IiwiYm90dG9tUmlnaHRQb2ludCIsImhpZ2hsaWdodFJlZ2lvbiIsIm1hdCIsInJlZ2lvbiIsImNvbG9yIiwiVmVjIiwidGhpY2tuZXNzIiwiZHJhd1JlY3RhbmdsZSIsIlJlY3QiLCJMSU5FXzgiLCJnZXRJbWFnZXNNYXRjaGVzIiwiaW1nMURhdGEiLCJpbWcyRGF0YSIsIm9wdGlvbnMiLCJkZXRlY3Rvck5hbWUiLCJ2aXN1YWxpemUiLCJnb29kTWF0Y2hlc0ZhY3RvciIsIm1hdGNoRnVuYyIsIkpTT04iLCJzdHJpbmdpZnkiLCJpbWcxIiwiaW1nMiIsImFsbCIsImltZGVjb2RlQXN5bmMiLCJyZXN1bHQxIiwicmVzdWx0MiIsIm1hdGNoZXMiLCJlIiwidG90YWxDb3VudCIsImlzRnVuY3Rpb24iLCJkaXN0YW5jZXMiLCJtYXRjaCIsImRpc3RhbmNlIiwibWluRGlzdGFuY2UiLCJtaW4iLCJtYXhEaXN0YW5jZSIsIm1heCIsImZpbHRlciIsIm1hdGNoMSIsIm1hdGNoMiIsInNsaWNlIiwiZXh0cmFjdFBvaW50IiwiaW5kZXhQcm9wZXJ0eU5hbWUiLCJwdCIsInBvaW50czEiLCJyZWN0MSIsInBvaW50czIiLCJyZWN0MiIsInJlc3VsdCIsImNvdW50IiwidmlzdWFsaXphdGlvbiIsImRyYXdNYXRjaGVzIiwiY29scyIsImltZW5jb2RlQXN5bmMiLCJnZXRJbWFnZXNTaW1pbGFyaXR5IiwibWV0aG9kIiwidGVtcGxhdGUiLCJyZWZlcmVuY2UiLCJyb3dzIiwiY29udmVydFRvQXN5bmMiLCJDVl84VUMzIiwibWF0Y2hlZCIsIm1hdGNoVGVtcGxhdGVBc3luYyIsIm1pbk1heCIsIm1pbk1heExvY0FzeW5jIiwic2NvcmUiLCJtYXhWYWwiLCJyZXN1bHRNYXQiLCJNYXQiLCJjb3B5VG9Bc3luYyIsImdldFJlZ2lvbiIsIm1hc2siLCJhYnNkaWZmIiwiY3Z0Q29sb3JBc3luYyIsIkNPTE9SX0JHUjJHUkFZIiwiY29udG91cnMiLCJ0aHJlc2hvbGRBc3luYyIsIlRIUkVTSF9CSU5BUlkiLCJUSFJFU0hfT1RTVSIsImZpbmRDb250b3Vyc0FzeW5jIiwiUkVUUl9FWFRFUk5BTCIsIkNIQUlOX0FQUFJPWF9TSU1QTEUiLCJpZ24iLCJjb250b3VyIiwiYm91bmRpbmdSZWN0IiwiZ2V0SW1hZ2VPY2N1cnJlbmNlIiwiZnVsbEltZ0RhdGEiLCJwYXJ0aWFsSW1nRGF0YSIsInRocmVzaG9sZCIsIm11bHRpcGxlIiwibWF0Y2hOZWlnaGJvdXJUaHJlc2hvbGQiLCJmdWxsSW1nIiwicGFydGlhbEltZyIsInJlc3VsdHMiLCJub25aZXJvTWF0Y2hSZXN1bHRzIiwiY29udmVydFRvIiwiQ1ZfOFUiLCJmaW5kTm9uWmVybyIsImZpbHRlck5lYXJNYXRjaGVzIiwicHVzaCIsImF0IiwicmVjdCIsIm1pbkxvYyIsIm1heExvYyIsImlzRW1wdHkiLCJmdWxsSGlnaGxpZ2h0ZWRJbWFnZSIsImNvcHkiLCJzaW5nbGVIaWdobGlnaHRlZEltYWdlIiwicmVkdWNlIiwiYWNjIiwiZWxlbWVudCIsInNvbWUiLCJwb2ludDEiLCJwb2ludDIiLCJhMiIsInBvdyIsImIyIiwiY3JvcEJhc2U2NEltYWdlIiwiYmFzZTY0SW1hZ2UiLCJpbWFnZSIsImJhc2U2NFRvSW1hZ2UiLCJjcm9wSW1hZ2UiLCJpbWFnZVRvQmFzZTY0IiwiaW1hZ2VCdWZmZXIiLCJQTkciLCJmaWx0ZXJUeXBlIiwicGFyc2UiLCJjaHVua3MiLCJwYWNrIiwib24iLCJjaHVuayIsImNvbmNhdCIsInRvU3RyaW5nIiwiaW1hZ2VSZWN0IiwiaW50ZXJSZWN0IiwiZ2V0UmVjdEludGVyc2VjdGlvbiIsImZpcnN0VmVydGljYWxQaXhlbCIsInRvcCIsImxhc3RWZXJ0aWNhbFBpeGVsIiwiZmlyc3RIb3Jpem9udGFsUGl4ZWwiLCJsZWZ0IiwibGFzdEhvcml6b250YWxQaXhlbCIsImNyb3BwZWRBcnJheSIsImZpcnN0Qnl0ZUlkeEluUGl4ZWxCbG9jayIsImJ5dGVJZHgiLCJpbWFnZVNpemUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFD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O0FBQW1CQyxJQUFBQTtBQUFuQixHQUFQO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IEppbXAgZnJvbSAnamltcCc7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdidWZmZXInO1xuaW1wb3J0IHsgUE5HIH0gZnJvbSAncG5nanMnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHsgaGFzVmFsdWUgfSBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgeyByZXF1aXJlUGFja2FnZSB9IGZyb20gJy4vbm9kZSc7XG5cblxuY29uc3QgT0NWX09MRCA9ICdvcGVuY3Y0bm9kZWpzJztcbmNvbnN0IE9DVl9ORVcgPSAnQHU0L29wZW5jdjRub2RlanMnO1xuXG5cbmNvbnN0IHsgTUlNRV9KUEVHLCBNSU1FX1BORywgTUlNRV9CTVAgfSA9IEppbXA7XG5sZXQgY3YgPSBudWxsO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFJlZ2lvblxuICogQHByb3BlcnR5IHtudW1iZXJ9IGxlZnQgLSBUaGUgb2Zmc2V0IGZyb20gdGhlIGxlZnQgc2lkZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IHRvcCAtIFRoZSBvZmZzZXQgZnJvbSB0aGUgdG9wXG4gKiBAcHJvcGVydHkge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGhcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQb2ludFxuICogQHByb3BlcnR5IHtudW1iZXJ9IHggLSBUaGUgeCBjb29yZGluYXRlXG4gKiBAcHJvcGVydHkge251bWJlcn0geSAtIFRoZSB5IGNvb3JkaW5hdGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFJlY3RcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB4IC0gVGhlIHRvcCBsZWZ0IGNvb3JkaW5hdGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB5IC0gVGhlIGJvdHRvbSByaWdodCBjb29yZGluYXRlXG4gKiBAcHJvcGVydHkge251bWJlcn0gd2lkdGggLSBUaGUgd2lkdGhcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0XG4gKi9cblxuY29uc3QgQllURVNfSU5fUElYRUxfQkxPQ0sgPSA0O1xuY29uc3QgU0NBTkxJTkVfRklMVEVSX01FVEhPRCA9IDQ7XG5jb25zdCBERUZBVUxUX01BVENIX1RIUkVTSE9MRCA9IDAuNTtcbmNvbnN0IE1BVENIX05FSUdIQk9VUl9USFJFU0hPTEQgPSAxMDtcblxuY29uc3QgQVZBSUxBQkxFX0RFVEVDVE9SUyA9IFtcbiAgJ0FLQVpFJyxcbiAgJ0FHQVNUJyxcbiAgJ0JSSVNLJyxcbiAgJ0ZBU1QnLFxuICAnR0ZUVCcsXG4gICdLQVpFJyxcbiAgJ01TRVInLFxuICAnU0lGVCcsXG4gICdPUkInLFxuXTtcblxuY29uc3QgQVZBSUxBQkxFX01BVENISU5HX0ZVTkNUSU9OUyA9IFtcbiAgJ0ZsYW5uQmFzZWQnLFxuICAnQnJ1dGVGb3JjZScsXG4gICdCcnV0ZUZvcmNlTDEnLFxuICAnQnJ1dGVGb3JjZUhhbW1pbmcnLFxuICAnQnJ1dGVGb3JjZUhhbW1pbmdMdXQnLFxuICAnQnJ1dGVGb3JjZVNMMicsXG5dO1xuXG5jb25zdCBNQVRDSElOR19NRVRIT0RTID0gW1xuICAnVE1fQ0NPRUZGJyxcbiAgJ1RNX0NDT0VGRl9OT1JNRUQnLFxuICAnVE1fQ0NPUlInLFxuICAnVE1fQ0NPUlJfTk9STUVEJyxcbiAgJ1RNX1NRRElGRicsXG4gICdUTV9TUURJRkZfTk9STUVEJyxcbl07XG5jb25zdCBERUZBVUxUX01BVENISU5HX01FVEhPRCA9ICdUTV9DQ09FRkZfTk9STUVEJztcblxuLyoqXG4gKiBUcmFuc2Zvcm1zIG1hdGNoaW5nIG1ldGhvZCBuYW1lIHRvIHRoZSBhY3R1YWxcbiAqIGNvbnN0YW50IHZhbHVlIGZyb20gT3BlbkNWIGxpYnJhcnlcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBPbmUgb2Ygc3VwcG9ydGVkIG1ldGhvZCBuYW1lc1xuICogKHNlZSBNQVRDSElOR19NRVRIT0RTIGFycmF5IGFib3ZlKVxuICogQHJldHVybnMge251bWJlcn0gVGhlIG1ldGhvZCB2YWx1ZVxuICogQHRocm93cyB7RXJyb3J9IGlmIGFuIHVuc3VwcG9ydGVkIG1ldGhvZCBuYW1lIGlzIGdpdmVuXG4gKi9cbmZ1bmN0aW9uIHRvTWF0Y2hpbmdNZXRob2QgKG5hbWUpIHtcbiAgaWYgKCFNQVRDSElOR19NRVRIT0RTLmluY2x1ZGVzKG5hbWUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgbWF0Y2hpbmcgbWV0aG9kICcke25hbWV9JyBpcyB1bmtub3duLiBgICtcbiAgICAgIGBPbmx5IHRoZSBmb2xsb3dpbmcgbWF0Y2hpbmcgbWV0aG9kcyBhcmUgc3VwcG9ydGVkOiAke01BVENISU5HX01FVEhPRFN9YCk7XG4gIH1cbiAgcmV0dXJuIGN2W25hbWVdO1xufVxuXG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gZ2V0IGEgSmltcCBpbWFnZSBvYmplY3QgZnJvbSBidWZmZXIgb3IgYmFzZTY0IGRhdGEuIEppbXBcbiAqIGlzIGEgZ3JlYXQgbGlicmFyeSBob3dldmVyIGl0IGRvZXMgSU8gaW4gdGhlIGNvbnN0cnVjdG9yIHNvIGl0J3Mgbm90XG4gKiBjb252ZW5pZW50IGZvciBvdXIgYXN5bmMvYXdhaXQgbW9kZWwuXG4gKlxuICogQHBhcmFtIHtCdWZmZXJ8c3RyaW5nfSBkYXRhIC0gYmluYXJ5IGltYWdlIGJ1ZmZlciBvciBiYXNlNjQtZW5jb2RlZCBpbWFnZVxuICogc3RyaW5nXG4gKiBAcmV0dXJucyB7SmltcH0gLSB0aGUgamltcCBpbWFnZSBvYmplY3RcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0SmltcEltYWdlIChkYXRhKSB7XG4gIHJldHVybiBhd2FpdCBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgaWYgKCFfLmlzU3RyaW5nKGRhdGEpICYmICFfLmlzQnVmZmVyKGRhdGEpKSB7XG4gICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcignTXVzdCBpbml0aWFsaXplIGppbXAgb2JqZWN0IHdpdGggc3RyaW5nIG9yIGJ1ZmZlcicpKTtcbiAgICB9XG4gICAgLy8gaWYgZGF0YSBpcyBhIHN0cmluZywgYXNzdW1lIGl0IGlzIGEgYmFzZTY0LWVuY29kZWQgaW1hZ2VcbiAgICBpZiAoXy5pc1N0cmluZyhkYXRhKSkge1xuICAgICAgZGF0YSA9IEJ1ZmZlci5mcm9tKGRhdGEsICdiYXNlNjQnKTtcbiAgICB9XG4gICAgbmV3IEppbXAoZGF0YSwgKGVyciwgaW1nT2JqKSA9PiB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHJldHVybiByZWplY3QoZXJyKTtcbiAgICAgIH1cbiAgICAgIGlmICghaW1nT2JqKSB7XG4gICAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKCdDb3VsZCBub3QgY3JlYXRlIGppbXAgaW1hZ2UgZnJvbSB0aGF0IGRhdGEnKSk7XG4gICAgICB9XG4gICAgICBpbWdPYmouX2dldEJ1ZmZlciA9IGltZ09iai5nZXRCdWZmZXIuYmluZChpbWdPYmopO1xuICAgICAgaW1nT2JqLmdldEJ1ZmZlciA9IEIucHJvbWlzaWZ5KGltZ09iai5fZ2V0QnVmZmVyLCB7Y29udGV4dDogaW1nT2JqfSk7XG4gICAgICByZXNvbHZlKGltZ09iaik7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBvcGVuY3Y0bm9kZWpzIG1vZHVsZSBpcyBub3QgaW5zdGFsbGVkIG9yIGNhbm5vdCBiZSBsb2FkZWRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gaW5pdE9wZW5DViAoKSB7XG4gIGlmIChjdikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxvZy5kZWJ1ZyhgSW5pdGlhbGl6aW5nIG9wZW5jdmApO1xuICBmb3IgKGNvbnN0IG9jdlBhY2thZ2Ugb2YgW09DVl9PTEQsIE9DVl9ORVddKSB7XG4gICAgdHJ5IHtcbiAgICAgIGxvZy5kZWJ1ZyhgQXR0ZW1wdGluZyB0byBsb2FkICcke29jdlBhY2thZ2V9J2ApO1xuICAgICAgY3YgPSBhd2FpdCByZXF1aXJlUGFja2FnZShvY3ZQYWNrYWdlKTtcbiAgICAgIGJyZWFrO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nLndhcm4oYFVuYWJsZSB0byBsb2FkICcke29jdlBhY2thZ2V9JzogJHtlcnIubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWN2KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBBbiBvcGVuY3Ygbm9kZSBtb2R1bGUgaXMgcmVxdWlyZWQgdG8gdXNlIE9wZW5DViBmZWF0dXJlcy4gYCArXG4gICAgICAgICAgICAgICAgICAgIGBQbGVhc2UgaW5zdGFsbCBvbmUgZmlyc3QgKGUuZy4sICducG0gaSAtZyAke09DVl9ORVd9JykgYW5kIHJlc3RhcnQgQXBwaXVtLiBgICtcbiAgICAgICAgICAgICAgICAgICAgJ1JlYWQgaHR0cHM6Ly9naXRodWIuY29tL1VyaWVsQ2gvb3BlbmN2NG5vZGVqcyNob3ctdG8taW5zdGFsbCBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoaXMgdG9waWMuJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBNYXRjaENvbXB1dGF0aW9uUmVzdWx0XG4gKiBAcHJvcGVydHkge2N2LkRlc2NyaXB0b3JNYXRjaH0gZGVzY2lwdG9yIC0gT3BlbkNWIG1hdGNoIGRlc2NyaXB0b3JcbiAqIEBwcm9wZXJ0eSB7QXJyYXk8Y3YuS2V5UG9pbnQ+fSBrZXlQb2ludHMgLSBUaGUgYXJyYXkgb2Yga2V5IHBvaW50c1xuICovXG5cbi8qKlxuICogQ2FsY3VsYXRlcyBhbiBPcGVuQ1YgbWF0Y2ggZGVzY3JpcHRvciBvZiBhbiBpbWFnZSwgd2hpY2ggY2FuIGJlIHVzZWRcbiAqIGZvciBicnV0ZS1mb3JjZSBtYXRjaGluZy5cbiAqIFJlYWQgaHR0cHM6Ly9kb2NzLm9wZW5jdi5vcmcvMy4wLWJldGEvZG9jL3B5X3R1dG9yaWFscy9weV9mZWF0dXJlMmQvcHlfbWF0Y2hlci9weV9tYXRjaGVyLmh0bWxcbiAqIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogQHBhcmFtIHtjdi5NYXR9IGltZyBJbWFnZSBkYXRhXG4gKiBAcGFyYW0ge2N2LkZlYXR1cmVEZXRlY3Rvcn0gZGV0ZWN0b3IgT3BlbkNWIGZlYXR1cmUgZGV0ZWN0b3IgaW5zdGFuY2VcbiAqXG4gKiBAcmV0dXJucyB7TWF0Y2hDb21wdXRhdGlvblJlc3VsdH1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGV0ZWN0QW5kQ29tcHV0ZSAoaW1nLCBkZXRlY3Rvcikge1xuICBjb25zdCBrZXlQb2ludHMgPSBhd2FpdCBkZXRlY3Rvci5kZXRlY3RBc3luYyhpbWcpO1xuICBjb25zdCBkZXNjcmlwdG9yID0gYXdhaXQgZGV0ZWN0b3IuY29tcHV0ZUFzeW5jKGltZywga2V5UG9pbnRzKTtcbiAgcmV0dXJuIHtcbiAgICBrZXlQb2ludHMsXG4gICAgZGVzY3JpcHRvclxuICB9O1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZWQgdGhlIGJvdW5kaW5nIHJlY3QgY29vcmRpbmF0ZXMgZm9yIHRoZSBhcnJheSBvZiBtYXRjaGluZyBwb2ludHNcbiAqXG4gKiBAcGFyYW0ge0FycmF5PFBvaW50Pn0gbWF0Y2hlZFBvaW50cyBBcnJheSBvZiBtYXRjaGluZyBwb2ludHNcbiAqIEByZXR1cm5zIHtSZWN0fSBUaGUgbWF0Y2hpbmcgYm91bmRpbmcgcmVjdCBvciBhIHplcm8gcmVjdCBpZiBubyBtYXRjaFxuICogY2FuIGJlIGZvdW5kLlxuICovXG5mdW5jdGlvbiBjYWxjdWxhdGVNYXRjaGVkUmVjdCAobWF0Y2hlZFBvaW50cykge1xuICBpZiAobWF0Y2hlZFBvaW50cy5sZW5ndGggPCAyKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IDAsXG4gICAgICB5OiAwLFxuICAgICAgd2lkdGg6IDAsXG4gICAgICBoZWlnaHQ6IDBcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgcG9pbnRzU29ydGVkQnlEaXN0YW5jZSA9IG1hdGNoZWRQb2ludHNcbiAgICAubWFwKChwb2ludCkgPT4gW01hdGguc3FydChwb2ludC54ICogcG9pbnQueCArIHBvaW50LnkgKiBwb2ludC55KSwgcG9pbnRdKVxuICAgIC5zb3J0KChwYWlyMSwgcGFpcjIpID0+IHBhaXIxWzBdID49IHBhaXIyWzBdKVxuICAgIC5tYXAoKHBhaXIpID0+IHBhaXJbMV0pO1xuICBjb25zdCBmaXJzdFBvaW50ID0gXy5oZWFkKHBvaW50c1NvcnRlZEJ5RGlzdGFuY2UpO1xuICBjb25zdCBsYXN0UG9pbnQgPSBfLmxhc3QocG9pbnRzU29ydGVkQnlEaXN0YW5jZSk7XG4gIGNvbnN0IHRvcExlZnRQb2ludCA9IHtcbiAgICB4OiBmaXJzdFBvaW50LnggPD0gbGFzdFBvaW50LnggPyBmaXJzdFBvaW50LnggOiBsYXN0UG9pbnQueCxcbiAgICB5OiBmaXJzdFBvaW50LnkgPD0gbGFzdFBvaW50LnkgPyBmaXJzdFBvaW50LnkgOiBsYXN0UG9pbnQueSxcbiAgfTtcbiAgY29uc3QgYm90dG9tUmlnaHRQb2ludCA9IHtcbiAgICB4OiBmaXJzdFBvaW50LnggPj0gbGFzdFBvaW50LnggPyBmaXJzdFBvaW50LnggOiBsYXN0UG9pbnQueCxcbiAgICB5OiBmaXJzdFBvaW50LnkgPj0gbGFzdFBvaW50LnkgPyBmaXJzdFBvaW50LnkgOiBsYXN0UG9pbnQueSxcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICB4OiB0b3BMZWZ0UG9pbnQueCxcbiAgICB5OiB0b3BMZWZ0UG9pbnQueSxcbiAgICB3aWR0aDogYm90dG9tUmlnaHRQb2ludC54IC0gdG9wTGVmdFBvaW50LngsXG4gICAgaGVpZ2h0OiBib3R0b21SaWdodFBvaW50LnkgLSB0b3BMZWZ0UG9pbnQueVxuICB9O1xufVxuXG4vKipcbiAqIERyYXdzIGEgcmVjdGFubmdsZSBvbiB0aGUgZ2l2ZW4gaW1hZ2UgbWF0cml4XG4gKlxuICogQHBhcmFtIHtjdi5NYXR9IG1hdCBUaGUgc291cmNlIGltYWdlXG4gKiBAcGFyYW0ge1JlY3R9IHJlZ2lvbiBUaGUgcmVnaW9uIHRvIGhpZ2hsaWdodFxuICpcbiAqIEByZXR1cm5zIHtjdi5NYXR9IFRoZSBzYW1lIGltYWdlIHdpdGggdGhlIHJlY3RhbmdsZSBvbiBpdFxuICovXG5mdW5jdGlvbiBoaWdobGlnaHRSZWdpb24gKG1hdCwgcmVnaW9uKSB7XG4gIGlmIChyZWdpb24ud2lkdGggPD0gMCB8fCByZWdpb24uaGVpZ2h0IDw9IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBoaWdobGlnaHQgaW4gcmVkXG4gIGNvbnN0IGNvbG9yID0gbmV3IGN2LlZlYygwLCAwLCAyNTUpO1xuICBjb25zdCB0aGlja25lc3MgPSAyO1xuICBtYXQuZHJhd1JlY3RhbmdsZShuZXcgY3YuUmVjdChyZWdpb24ueCwgcmVnaW9uLnksIHJlZ2lvbi53aWR0aCwgcmVnaW9uLmhlaWdodCksIGNvbG9yLCB0aGlja25lc3MsIGN2LkxJTkVfOCk7XG4gIHJldHVybiBtYXQ7XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTWF0Y2hpbmdPcHRpb25zXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGRldGVjdG9yTmFtZSBbJ09SQiddIE9uZSBvZiBwb3NzaWJsZSBPcGVuQ1YgZmVhdHVyZSBkZXRlY3RvciBuYW1lc1xuICogZnJvbSBgQVZBSUxBQkxFX0RFVEVDVE9SU2AgYXJyYXkuXG4gKiBTb21lIG9mIHRoZXNlIG1ldGhvZHMgKEZBU1QsIEFHQVNULCBHRlRULCBGQVNULCBTSUZUIGFuZCBNU0VSKSBhcmUgbm90IGF2YWlsYWJsZVxuICogaW4gdGhlIGRlZmF1bHQgT3BlbkNWIGluc3RhbGxhdGlvbiBhbmQgaGF2ZSB0byBiZSBlbmFibGVkIG1hbnVhbGx5IGJlZm9yZVxuICogbGlicmFyeSBjb21waWxhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gbWF0Y2hGdW5jIFsnQnJ1dGVGb3JjZSddIFRoZSBuYW1lIG9mIHRoZSBtYXRjaGluZyBmdW5jdGlvbi5cbiAqIFNob3VsZCBiZSBvbmUgb2YgYEFWQUlMQUJMRV9NQVRDSElOR19GVU5DVElPTlNgIGFycmF5LlxuICogQHByb3BlcnR5IHs/bnVtYmVyfEZ1bmN0aW9ufSBnb29kTWF0Y2hlc0ZhY3RvciBUaGUgbWF4aW11bSBjb3VudCBvZiBcImdvb2RcIiBtYXRjaGVzXG4gKiAoZS4gZy4gd2l0aCBtaW5pbWFsIGRpc3RhbmNlcykgb3IgYSBmdW5jdGlvbiwgd2hpY2ggYWNjZXB0cyAzIGFyZ3VtZW50czogdGhlIGN1cnJlbnQgZGlzdGFuY2UsXG4gKiBtaW5pbWFsIGRpc3RhbmNlLCBtYXhpbXVtIGRpc3RhbmNlIGFuZCByZXR1cm5zIHRydWUgb3IgZmFsc2UgdG8gaW5jbHVkZSBvciBleGNsdWRlIHRoZSBtYXRjaC5cbiAqIEBwcm9wZXJ0eSB7P2Jvb2xlYW59IHZpc3VhbGl6ZSBbZmFsc2VdIFdoZXRoZXIgdG8gcmV0dXJuIHRoZSByZXN1bHRpbmcgdmlzYWxpemF0aW9uXG4gKiBhcyBhbiBpbWFnZSAodXNlZnVsIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMpXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBNYXRjaGluZ1Jlc3VsdFxuICogQHByb3BlcnR5IHtudW1iZXJ9IGNvdW50IFRoZSBjb3VudCBvZiBtYXRjaGVkIGVkZ2VzIG9uIGJvdGggaW1hZ2VzLlxuICogVGhlIG1vcmUgbWF0Y2hpbmcgZWRnZXMgdGhlcmUgYXJlIG5vIGJvdGggaW1hZ2VzIHRoZSBtb3JlIHNpbWlsYXIgdGhleSBhcmUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gdG90YWxDb3VudCBUaGUgdG90YWwgY291bnQgb2YgbWF0Y2hlZCBlZGdlcyBvbiBib3RoIGltYWdlcy5cbiAqIEl0IGlzIGVxdWFsIHRvIGBjb3VudGAgaWYgYGdvb2RNYXRjaGVzRmFjdG9yYCBkb2VzIG5vdCBsaW1pdCB0aGUgbWF0Y2hlcyxcbiAqIG90aGVyd2lzZSBpdCBjb250YWlucyB0aGUgdG90YWwgY291bnQgb2YgbWF0Y2hlcyBiZWZvcmUgYGdvb2RNYXRjaGVzRmFjdG9yYCBpc1xuICogYXBwbGllZC5cbiAqIEBwcm9wZXJ0eSB7P0J1ZmZlcn0gdmlzdWFsaXphdGlvbiBUaGUgdmlzdWFsaXphdGlvbiBvZiB0aGUgbWF0Y2hpbmcgcmVzdWx0XG4gKiByZXByZXNlbnRlZCBhcyBQTkcgaW1hZ2UgYnVmZmVyLiBUaGlzIHZpc3VhbGl6YXRpb24gbG9va3MgbGlrZVxuICogaHR0cHM6Ly91c2VyLWltYWdlcy5naXRodWJ1c2VyY29udGVudC5jb20vMzExMjU1MjEvMjk3MDI3MzEtYzc5ZTMxNDItODk3Mi0xMWU3LTk0N2UtZGIxMDlkNDE1NDY5LmpwZ1xuICogQHByb3BlcnR5IHtBcnJheTxQb2ludD59IHBvaW50czEgVGhlIGFycmF5IG9mIG1hdGNoaW5nIHBvaW50cyBvbiB0aGUgZmlyc3QgaW1hZ2VcbiAqIEBwcm9wZXJ0eSB7UmVjdH0gcmVjdDEgVGhlIGJvdW5kaW5nIHJlY3QgZm9yIHRoZSBgbWF0Y2hlZFBvaW50czFgIHNldCBvciBhIHplcm8gcmVjdFxuICogaWYgbm90IGVub3VnaCBtYXRjaGluZyBwb2ludHMgYXJlIGZvdW5kXG4gKiBAcHJvcGVydHkge0FycmF5PFBvaW50Pn0gcG9pbnRzMiBUaGUgYXJyYXkgb2YgbWF0Y2hpbmcgcG9pbnRzIG9uIHRoZSBzZWNvbmQgaW1hZ2VcbiAqIEBwcm9wZXJ0eSB7UmVjdH0gcmVjdDIgVGhlIGJvdW5kaW5nIHJlY3QgZm9yIHRoZSBgbWF0Y2hlZFBvaW50czJgIHNldCBvciBhIHplcm8gcmVjdFxuICogaWYgbm90IGVub3VnaCBtYXRjaGluZyBwb2ludHMgYXJlIGZvdW5kXG4gKi9cblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBjb3VudCBvZiBjb21tb24gZWRnZXMgYmV0d2VlbiB0d28gaW1hZ2VzLlxuICogVGhlIGltYWdlcyBtaWdodCBiZSByb3RhdGVkIG9yIHJlc2l6ZWQgcmVsYXRpdmVseSB0byBlYWNoIG90aGVyLlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfSBpbWcxRGF0YSBUaGUgZGF0YSBvZiB0aGUgZmlyc3QgaW1hZ2UgcGFja2VkIGludG8gYSBOb2RlSlMgYnVmZmVyXG4gKiBAcGFyYW0ge0J1ZmZlcn0gaW1nMkRhdGEgVGhlIGRhdGEgb2YgdGhlIHNlY29uZCBpbWFnZSBwYWNrZWQgaW50byBhIE5vZGVKUyBidWZmZXJcbiAqIEBwYXJhbSB7P01hdGNoaW5nT3B0aW9uc30gb3B0aW9ucyBbe31dIFNldCBvZiBtYXRjaGluZyBvcHRpb25zXG4gKlxuICogQHJldHVybnMge01hdGNoaW5nUmVzdWx0fSBNYWNoaW5nIHJlc3VsdFxuICogQHRocm93cyB7RXJyb3J9IElmIGBkZXRlY3Rvck5hbWVgIHZhbHVlIGlzIHVua25vd24uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEltYWdlc01hdGNoZXMgKGltZzFEYXRhLCBpbWcyRGF0YSwgb3B0aW9ucyA9IHt9KSB7XG4gIGF3YWl0IGluaXRPcGVuQ1YoKTtcblxuICBjb25zdCB7ZGV0ZWN0b3JOYW1lID0gJ09SQicsIHZpc3VhbGl6ZSA9IGZhbHNlLFxuICAgICAgICAgZ29vZE1hdGNoZXNGYWN0b3IsIG1hdGNoRnVuYyA9ICdCcnV0ZUZvcmNlJ30gPSBvcHRpb25zO1xuICBpZiAoIV8uaW5jbHVkZXMoQVZBSUxBQkxFX0RFVEVDVE9SUywgZGV0ZWN0b3JOYW1lKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJyR7ZGV0ZWN0b3JOYW1lfScgZGV0ZWN0b3IgaXMgdW5rbm93bi4gYCArXG4gICAgICAgICAgICAgICAgICAgIGBPbmx5ICR7SlNPTi5zdHJpbmdpZnkoQVZBSUxBQkxFX0RFVEVDVE9SUyl9IGRldGVjdG9ycyBhcmUgc3VwcG9ydGVkLmApO1xuICB9XG4gIGlmICghXy5pbmNsdWRlcyhBVkFJTEFCTEVfTUFUQ0hJTkdfRlVOQ1RJT05TLCBtYXRjaEZ1bmMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAnJHttYXRjaEZ1bmN9JyBtYXRjaGluZyBmdW5jdGlvbiBpcyB1bmtub3duLiBgICtcbiAgICAgICAgICAgICAgICAgICAgYE9ubHkgJHtKU09OLnN0cmluZ2lmeShBVkFJTEFCTEVfTUFUQ0hJTkdfRlVOQ1RJT05TKX0gbWF0Y2hpbmcgZnVuY3Rpb25zIGFyZSBzdXBwb3J0ZWQuYCk7XG4gIH1cblxuICBjb25zdCBkZXRlY3RvciA9IG5ldyBjdltgJHtkZXRlY3Rvck5hbWV9RGV0ZWN0b3JgXSgpO1xuICBjb25zdCBbaW1nMSwgaW1nMl0gPSBhd2FpdCBCLmFsbChbXG4gICAgY3YuaW1kZWNvZGVBc3luYyhpbWcxRGF0YSksXG4gICAgY3YuaW1kZWNvZGVBc3luYyhpbWcyRGF0YSlcbiAgXSk7XG4gIGNvbnN0IFtyZXN1bHQxLCByZXN1bHQyXSA9IGF3YWl0IEIuYWxsKFtcbiAgICBkZXRlY3RBbmRDb21wdXRlKGltZzEsIGRldGVjdG9yKSxcbiAgICBkZXRlY3RBbmRDb21wdXRlKGltZzIsIGRldGVjdG9yKVxuICBdKTtcbiAgbGV0IG1hdGNoZXMgPSBbXTtcbiAgdHJ5IHtcbiAgICBtYXRjaGVzID0gYXdhaXQgY3ZbYG1hdGNoJHttYXRjaEZ1bmN9QXN5bmNgXShyZXN1bHQxLmRlc2NyaXB0b3IsIHJlc3VsdDIuZGVzY3JpcHRvcik7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBmaW5kIGFueSBtYXRjaGVzIGJldHdlZW4gdGhlIGdpdmVuIGltYWdlcy4gVHJ5IGFub3RoZXIgZGV0ZWN0aW9uIGFsZ29yaXRobS4gYCArXG4gICAgICAgICAgICAgICAgICAgIGAgT3JpZ2luYWwgZXJyb3I6ICR7ZX1gKTtcbiAgfVxuICBjb25zdCB0b3RhbENvdW50ID0gbWF0Y2hlcy5sZW5ndGg7XG4gIGlmIChoYXNWYWx1ZShnb29kTWF0Y2hlc0ZhY3RvcikpIHtcbiAgICBpZiAoXy5pc0Z1bmN0aW9uKGdvb2RNYXRjaGVzRmFjdG9yKSkge1xuICAgICAgY29uc3QgZGlzdGFuY2VzID0gbWF0Y2hlcy5tYXAoKG1hdGNoKSA9PiBtYXRjaC5kaXN0YW5jZSk7XG4gICAgICBjb25zdCBtaW5EaXN0YW5jZSA9IF8ubWluKGRpc3RhbmNlcyk7XG4gICAgICBjb25zdCBtYXhEaXN0YW5jZSA9IF8ubWF4KGRpc3RhbmNlcyk7XG4gICAgICBtYXRjaGVzID0gbWF0Y2hlc1xuICAgICAgICAuZmlsdGVyKChtYXRjaCkgPT4gZ29vZE1hdGNoZXNGYWN0b3IobWF0Y2guZGlzdGFuY2UsIG1pbkRpc3RhbmNlLCBtYXhEaXN0YW5jZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobWF0Y2hlcy5sZW5ndGggPiBnb29kTWF0Y2hlc0ZhY3Rvcikge1xuICAgICAgICBtYXRjaGVzID0gbWF0Y2hlc1xuICAgICAgICAgIC5zb3J0KChtYXRjaDEsIG1hdGNoMikgPT4gbWF0Y2gxLmRpc3RhbmNlIC0gbWF0Y2gyLmRpc3RhbmNlKVxuICAgICAgICAgIC5zbGljZSgwLCBnb29kTWF0Y2hlc0ZhY3Rvcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZXh0cmFjdFBvaW50ID0gKGtleVBvaW50cywgaW5kZXhQcm9wZXJ0eU5hbWUpID0+IChtYXRjaCkgPT4ge1xuICAgIGNvbnN0IHtwdCwgcG9pbnR9ID0ga2V5UG9pbnRzW21hdGNoW2luZGV4UHJvcGVydHlOYW1lXV07XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2p1c3RhZHVkZXdob2hhY2tzL29wZW5jdjRub2RlanMvaXNzdWVzLzU4NFxuICAgIHJldHVybiAocHQgfHwgcG9pbnQpO1xuICB9O1xuICBjb25zdCBwb2ludHMxID0gbWF0Y2hlcy5tYXAoZXh0cmFjdFBvaW50KHJlc3VsdDEua2V5UG9pbnRzLCAncXVlcnlJZHgnKSk7XG4gIGNvbnN0IHJlY3QxID0gY2FsY3VsYXRlTWF0Y2hlZFJlY3QocG9pbnRzMSk7XG4gIGNvbnN0IHBvaW50czIgPSBtYXRjaGVzLm1hcChleHRyYWN0UG9pbnQocmVzdWx0Mi5rZXlQb2ludHMsICd0cmFpbklkeCcpKTtcbiAgY29uc3QgcmVjdDIgPSBjYWxjdWxhdGVNYXRjaGVkUmVjdChwb2ludHMyKTtcblxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgcG9pbnRzMSxcbiAgICByZWN0MSxcbiAgICBwb2ludHMyLFxuICAgIHJlY3QyLFxuICAgIHRvdGFsQ291bnQsXG4gICAgY291bnQ6IG1hdGNoZXMubGVuZ3RoLFxuICB9O1xuICBpZiAodmlzdWFsaXplKSB7XG4gICAgY29uc3QgdmlzdWFsaXphdGlvbiA9IGN2LmRyYXdNYXRjaGVzKGltZzEsIGltZzIsIHJlc3VsdDEua2V5UG9pbnRzLCByZXN1bHQyLmtleVBvaW50cywgbWF0Y2hlcyk7XG4gICAgaGlnaGxpZ2h0UmVnaW9uKHZpc3VhbGl6YXRpb24sIHJlY3QxKTtcbiAgICBoaWdobGlnaHRSZWdpb24odmlzdWFsaXphdGlvbiwge1xuICAgICAgeDogaW1nMS5jb2xzICsgcmVjdDIueCxcbiAgICAgIHk6IHJlY3QyLnksXG4gICAgICB3aWR0aDogcmVjdDIud2lkdGgsXG4gICAgICBoZWlnaHQ6IHJlY3QyLmhlaWdodFxuICAgIH0pO1xuICAgIHJlc3VsdC52aXN1YWxpemF0aW9uID0gYXdhaXQgY3YuaW1lbmNvZGVBc3luYygnLnBuZycsIHZpc3VhbGl6YXRpb24pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU2ltaWxhcml0eU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7P2Jvb2xlYW59IHZpc3VhbGl6ZSBbZmFsc2VdIFdoZXRoZXIgdG8gcmV0dXJuIHRoZSByZXN1bHRpbmcgdmlzYWxpemF0aW9uXG4gKiBhcyBhbiBpbWFnZSAodXNlZnVsIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMpXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbWV0aG9kIFtUTV9DQ09FRkZfTk9STUVEXSBUaGUgbmFtZSBvZiB0aGUgdGVtcGxhdGUgbWF0Y2hpbmcgbWV0aG9kLlxuICogQWNjZXB0YWJsZSB2YWx1ZXMgYXJlOlxuICogLSBUTV9DQ09FRkZcbiAqIC0gVE1fQ0NPRUZGX05PUk1FRCAoZGVmYXVsdClcbiAqIC0gVE1fQ0NPUlJcbiAqIC0gVE1fQ0NPUlJfTk9STUVEXG4gKiAtIFRNX1NRRElGRlxuICogLSBUTV9TUURJRkZfTk9STUVEXG4gKiBSZWFkIGh0dHBzOi8vZG9jcy5vcGVuY3Yub3JnLzMuMC1iZXRhL2RvYy9weV90dXRvcmlhbHMvcHlfaW1ncHJvYy9weV90ZW1wbGF0ZV9tYXRjaGluZy9weV90ZW1wbGF0ZV9tYXRjaGluZy5odG1sXG4gKiBmb3IgbW9yZSBkZXRhaWxzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU2ltaWxhcml0eVJlc3VsdFxuICogQHByb3BlcnR5IHtudW1iZXJ9IHNjb3JlIFRoZSBzaW1pbGFyaXR5IHNjb3JlIGFzIGEgZmxvYXQgbnVtYmVyIGluIHJhbmdlIFswLjAsIDEuMF0uXG4gKiAxLjAgaXMgdGhlIGhpZ2hlc3Qgc2NvcmUgKG1lYW5zIGJvdGggaW1hZ2VzIGFyZSB0b3RhbGx5IGVxdWFsKS5cbiAqIEBwcm9wZXJ0eSB7P0J1ZmZlcn0gdmlzdWFsaXphdGlvbiBUaGUgdmlzdWFsaXphdGlvbiBvZiB0aGUgbWF0Y2hpbmcgcmVzdWx0XG4gKiByZXByZXNlbnRlZCBhcyBQTkcgaW1hZ2UgYnVmZmVyLiBUaGlzIGltYWdlIGluY2x1ZGVzIGJvdGggaW5wdXQgcGljdHVyZXMgd2hlcmVcbiAqIGRpZmZlcmVuY2UgcmVnaW9ucyBhcmUgaGlnaGxpZ2h0ZWQgd2l0aCByZWN0YW5nbGVzLlxuICovXG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgc2ltaWxhcml0eSBzY29yZSBiZXR3ZWVuIHR3byBpbWFnZXMuXG4gKiBJdCBpcyBleHBlY3RlZCwgdGhhdCBib3RoIGltYWdlcyBoYXZlIHRoZSBzYW1lIHJlc29sdXRpb24uXG4gKlxuICogQHBhcmFtIHtCdWZmZXJ9IGltZzFEYXRhIFRoZSBkYXRhIG9mIHRoZSBmaXJzdCBpbWFnZSBwYWNrZWQgaW50byBhIE5vZGVKUyBidWZmZXJcbiAqIEBwYXJhbSB7QnVmZmVyfSBpbWcyRGF0YSBUaGUgZGF0YSBvZiB0aGUgc2Vjb25kIGltYWdlIHBhY2tlZCBpbnRvIGEgTm9kZUpTIGJ1ZmZlclxuICogQHBhcmFtIHs/U2ltaWxhcml0eU9wdGlvbnN9IG9wdGlvbnMgW3t9XSBTZXQgb2Ygc2ltaWxhcml0eSBjYWxjdWxhdGlvbiBvcHRpb25zXG4gKlxuICogQHJldHVybnMge1NpbWlsYXJpdHlSZXN1bHR9IFRoZSBjYWxjdWxhdGlvbiByZXN1bHRcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgZ2l2ZW4gaW1hZ2VzIGhhdmUgZGlmZmVyZW50IHJlc29sdXRpb24uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEltYWdlc1NpbWlsYXJpdHkgKGltZzFEYXRhLCBpbWcyRGF0YSwgb3B0aW9ucyA9IHt9KSB7XG4gIGF3YWl0IGluaXRPcGVuQ1YoKTtcblxuICBjb25zdCB7XG4gICAgbWV0aG9kID0gREVGQVVMVF9NQVRDSElOR19NRVRIT0QsXG4gICAgdmlzdWFsaXplID0gZmFsc2UsXG4gIH0gPSBvcHRpb25zO1xuICBsZXQgW3RlbXBsYXRlLCByZWZlcmVuY2VdID0gYXdhaXQgQi5hbGwoW1xuICAgIGN2LmltZGVjb2RlQXN5bmMoaW1nMURhdGEpLFxuICAgIGN2LmltZGVjb2RlQXN5bmMoaW1nMkRhdGEpXG4gIF0pO1xuICBpZiAodGVtcGxhdGUucm93cyAhPT0gcmVmZXJlbmNlLnJvd3MgfHwgdGVtcGxhdGUuY29scyAhPT0gcmVmZXJlbmNlLmNvbHMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0JvdGggaW1hZ2VzIGFyZSBleHBlY3RlZCB0byBoYXZlIHRoZSBzYW1lIHNpemUgaW4gb3JkZXIgdG8gJyArXG4gICAgICAgICAgICAgICAgICAgICdjYWxjdWxhdGUgdGhlIHNpbWlsYXJpdHkgc2NvcmUuJyk7XG4gIH1cbiAgW3RlbXBsYXRlLCByZWZlcmVuY2VdID0gYXdhaXQgQi5hbGwoW1xuICAgIHRlbXBsYXRlLmNvbnZlcnRUb0FzeW5jKGN2LkNWXzhVQzMpLFxuICAgIHJlZmVyZW5jZS5jb252ZXJ0VG9Bc3luYyhjdi5DVl84VUMzKVxuICBdKTtcblxuICBsZXQgbWF0Y2hlZDtcbiAgdHJ5IHtcbiAgICBtYXRjaGVkID0gYXdhaXQgcmVmZXJlbmNlLm1hdGNoVGVtcGxhdGVBc3luYyh0ZW1wbGF0ZSwgdG9NYXRjaGluZ01ldGhvZChtZXRob2QpKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHJlZmVyZW5jZSBpbWFnZSBkaWQgbm90IG1hdGNoIHRvIHRoZSB0ZW1wbGF0ZSBvbmUuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxuICBjb25zdCBtaW5NYXggPSBhd2FpdCBtYXRjaGVkLm1pbk1heExvY0FzeW5jKCk7XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICBzY29yZTogbWluTWF4Lm1heFZhbFxuICB9O1xuICBpZiAodmlzdWFsaXplKSB7XG4gICAgY29uc3QgcmVzdWx0TWF0ID0gbmV3IGN2Lk1hdCh0ZW1wbGF0ZS5yb3dzLCB0ZW1wbGF0ZS5jb2xzICogMiwgY3YuQ1ZfOFVDMyk7XG4gICAgYXdhaXQgQi5hbGwoW1xuICAgICAgcmVmZXJlbmNlLmNvcHlUb0FzeW5jKFxuICAgICAgICByZXN1bHRNYXQuZ2V0UmVnaW9uKG5ldyBjdi5SZWN0KDAsIDAsIHJlZmVyZW5jZS5jb2xzLCByZWZlcmVuY2Uucm93cykpKSxcbiAgICAgIHRlbXBsYXRlLmNvcHlUb0FzeW5jKFxuICAgICAgICByZXN1bHRNYXQuZ2V0UmVnaW9uKG5ldyBjdi5SZWN0KHJlZmVyZW5jZS5jb2xzLCAwLCB0ZW1wbGF0ZS5jb2xzLCB0ZW1wbGF0ZS5yb3dzKSkpXG4gICAgXSk7XG4gICAgbGV0IG1hc2sgPSByZWZlcmVuY2UuYWJzZGlmZih0ZW1wbGF0ZSk7XG4gICAgbWFzayA9IGF3YWl0IG1hc2suY3Z0Q29sb3JBc3luYyhjdi5DT0xPUl9CR1IyR1JBWSk7XG4gICAgbGV0IGNvbnRvdXJzID0gW107XG4gICAgdHJ5IHtcbiAgICAgIG1hc2sgPSBhd2FpdCBtYXNrLnRocmVzaG9sZEFzeW5jKDEyOCwgMjU1LCBjdi5USFJFU0hfQklOQVJZIHwgY3YuVEhSRVNIX09UU1UpO1xuICAgICAgY29udG91cnMgPSBhd2FpdCBtYXNrLmZpbmRDb250b3Vyc0FzeW5jKGN2LlJFVFJfRVhURVJOQUwsIGN2LkNIQUlOX0FQUFJPWF9TSU1QTEUpO1xuICAgIH0gY2F0Y2ggKGlnbikge1xuICAgICAgLy8gTm8gY29udG91cnMgY2FuIGJlIGZvdW5kLCB3aGljaCBtZWFucywgbW9zdCBsaWtlbHksIHRoYXQgaW1hZ2VzIGFyZSBlcXVhbFxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGNvbnRvdXIgb2YgY29udG91cnMpIHtcbiAgICAgIGNvbnN0IGJvdW5kaW5nUmVjdCA9IGNvbnRvdXIuYm91bmRpbmdSZWN0KCk7XG4gICAgICBoaWdobGlnaHRSZWdpb24ocmVzdWx0TWF0LCBib3VuZGluZ1JlY3QpO1xuICAgICAgaGlnaGxpZ2h0UmVnaW9uKHJlc3VsdE1hdCwge1xuICAgICAgICB4OiByZWZlcmVuY2UuY29scyArIGJvdW5kaW5nUmVjdC54LFxuICAgICAgICB5OiBib3VuZGluZ1JlY3QueSxcbiAgICAgICAgd2lkdGg6IGJvdW5kaW5nUmVjdC53aWR0aCxcbiAgICAgICAgaGVpZ2h0OiBib3VuZGluZ1JlY3QuaGVpZ2h0XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmVzdWx0LnZpc3VhbGl6YXRpb24gPSBhd2FpdCBjdi5pbWVuY29kZUFzeW5jKCcucG5nJywgcmVzdWx0TWF0KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IE9jY3VycmVuY2VPcHRpb25zXG4gKiBAcHJvcGVydHkgez9ib29sZWFufSB2aXN1YWxpemUgW2ZhbHNlXSBXaGV0aGVyIHRvIHJldHVybiB0aGUgcmVzdWx0aW5nIHZpc2FsaXphdGlvblxuICogYXMgYW4gaW1hZ2UgKHVzZWZ1bCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzKVxuICogQHByb3BlcnR5IHs/ZmxvYXR9IHRocmVzaG9sZCBbMC41XSBBdCB3aGF0IG5vcm1hbGl6ZWQgdGhyZXNob2xkIHRvIHJlamVjdFxuICogYSBtYXRjaFxuICogQHByb3BlcnR5IHs/ZmxvYXR9IG11bHRpcGxlIFtmYWxzZV0gZmluZCBtdWx0aXBsZSBtYXRjaGVzIGluIHRoZSBpbWFnZVxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBtYXRjaE5laWdoYm91clRocmVzaG9sZCBbMTBdIFRoZSBwaXhlbCBkaXN0YW5jZSBiZXR3ZWVuIG1hdGNoZXMgd2UgY29uc2lkZXJcbiAqIHRvIGJlIHBhcnQgb2YgdGhlIHNhbWUgdGVtcGxhdGUgbWF0Y2hcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IE9jY3VycmVuY2VSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7UmVjdH0gcmVjdCBUaGUgcmVnaW9uIG9mIHRoZSBwYXJ0aWFsIGltYWdlIG9jY3VyZW5jZVxuICogb24gdGhlIGZ1bGwgaW1hZ2VcbiAqIEBwcm9wZXJ0eSB7P0J1ZmZlcn0gdmlzdWFsaXphdGlvbiBUaGUgdmlzdWFsaXphdGlvbiBvZiB0aGUgbWF0Y2hpbmcgcmVzdWx0XG4gKiByZXByZXNlbnRlZCBhcyBQTkcgaW1hZ2UgYnVmZmVyLiBPbiB0aGlzIGltYWdlIHRoZSBtYXRjaGluZ1xuICogcmVnaW9uIGlzIGhpZ2hsaWdodGVkIHdpdGggYSByZWN0YW5nbGUuIElmIHRoZSBtdWx0aXBsZSBvcHRpb24gaXMgcGFzc2VkLFxuICogYWxsIHJlc3VsdHMgYXJlIGhpZ2hsaWdodGVkIGhlcmUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gc2NvcmUgVGhlIHNpbWlsYXJpdHkgc2NvcmUgYXMgYSBmbG9hdCBudW1iZXIgaW4gcmFuZ2UgWzAuMCwgMS4wXS5cbiAqIDEuMCBpcyB0aGUgaGlnaGVzdCBzY29yZSAobWVhbnMgYm90aCBpbWFnZXMgYXJlIHRvdGFsbHkgZXF1YWwpLlxuICogQHByb3BlcnR5IHtBcnJheTxPY2N1cnJlbmNlUmVzdWx0Pn0gbXVsdGlwbGUgVGhlIGFycmF5IG9mIG1hdGNoaW5nIE9jY3VyZW5jZVJlc3VsdHNcbiAqIC0gb25seSB3aGVuIG11bHRpcGxlIG9wdGlvbiBpcyBwYXNzZWRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtZXRob2QgW1RNX0NDT0VGRl9OT1JNRURdIFRoZSBuYW1lIG9mIHRoZSB0ZW1wbGF0ZSBtYXRjaGluZyBtZXRob2QuXG4gKiBBY2NlcHRhYmxlIHZhbHVlcyBhcmU6XG4gKiAtIFRNX0NDT0VGRlxuICogLSBUTV9DQ09FRkZfTk9STUVEIChkZWZhdWx0KVxuICogLSBUTV9DQ09SUlxuICogLSBUTV9DQ09SUl9OT1JNRURcbiAqIC0gVE1fU1FESUZGXG4gKiAtIFRNX1NRRElGRl9OT1JNRURcbiAqIFJlYWQgaHR0cHM6Ly9kb2NzLm9wZW5jdi5vcmcvMy4wLWJldGEvZG9jL3B5X3R1dG9yaWFscy9weV9pbWdwcm9jL3B5X3RlbXBsYXRlX21hdGNoaW5nL3B5X3RlbXBsYXRlX21hdGNoaW5nLmh0bWxcbiAqIGZvciBtb3JlIGRldGFpbHMuXG4gKi9cblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBvY2N1cnJlbmNlIHBvc2l0aW9uIG9mIGEgcGFydGlhbCBpbWFnZSBpbiB0aGUgZnVsbFxuICogaW1hZ2UuXG4gKlxuICogQHBhcmFtIHtCdWZmZXJ9IGZ1bGxJbWdEYXRhIFRoZSBkYXRhIG9mIHRoZSBmdWxsIGltYWdlIHBhY2tlZCBpbnRvIGEgTm9kZUpTIGJ1ZmZlclxuICogQHBhcmFtIHtCdWZmZXJ9IHBhcnRpYWxJbWdEYXRhIFRoZSBkYXRhIG9mIHRoZSBwYXJ0aWFsIGltYWdlIHBhY2tlZCBpbnRvIGEgTm9kZUpTIGJ1ZmZlclxuICogQHBhcmFtIHs/T2NjdXJyZW5jZU9wdGlvbnN9IG9wdGlvbnMgW3t9XSBTZXQgb2Ygb2NjdXJyZW5jZSBjYWxjdWxhdGlvbiBvcHRpb25zXG4gKlxuICogQHJldHVybnMge09jY3VycmVuY2VSZXN1bHR9XG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgbm8gb2NjdXJyZW5jZXMgb2YgdGhlIHBhcnRpYWwgaW1hZ2UgY2FuIGJlIGZvdW5kIGluIHRoZSBmdWxsIGltYWdlXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEltYWdlT2NjdXJyZW5jZSAoZnVsbEltZ0RhdGEsIHBhcnRpYWxJbWdEYXRhLCBvcHRpb25zID0ge30pIHtcbiAgYXdhaXQgaW5pdE9wZW5DVigpO1xuXG4gIGNvbnN0IHtcbiAgICB2aXN1YWxpemUgPSBmYWxzZSxcbiAgICB0aHJlc2hvbGQgPSBERUZBVUxUX01BVENIX1RIUkVTSE9MRCxcbiAgICBtdWx0aXBsZSA9IGZhbHNlLFxuICAgIG1hdGNoTmVpZ2hib3VyVGhyZXNob2xkID0gTUFUQ0hfTkVJR0hCT1VSX1RIUkVTSE9MRCxcbiAgICBtZXRob2QgPSBERUZBVUxUX01BVENISU5HX01FVEhPRCxcbiAgfSA9IG9wdGlvbnM7XG5cbiAgY29uc3QgW2Z1bGxJbWcsIHBhcnRpYWxJbWddID0gYXdhaXQgQi5hbGwoW1xuICAgIGN2LmltZGVjb2RlQXN5bmMoZnVsbEltZ0RhdGEpLFxuICAgIGN2LmltZGVjb2RlQXN5bmMocGFydGlhbEltZ0RhdGEpXG4gIF0pO1xuICBjb25zdCByZXN1bHRzID0gW107XG4gIGxldCB2aXN1YWxpemF0aW9uID0gbnVsbDtcblxuICB0cnkge1xuICAgIGNvbnN0IG1hdGNoZWQgPSBhd2FpdCBmdWxsSW1nLm1hdGNoVGVtcGxhdGVBc3luYyhwYXJ0aWFsSW1nLCB0b01hdGNoaW5nTWV0aG9kKG1ldGhvZCkpO1xuICAgIGNvbnN0IG1pbk1heCA9IGF3YWl0IG1hdGNoZWQubWluTWF4TG9jQXN5bmMoKTtcblxuICAgIGlmIChtdWx0aXBsZSkge1xuICAgICAgY29uc3Qgbm9uWmVyb01hdGNoUmVzdWx0cyA9IG1hdGNoZWQudGhyZXNob2xkKHRocmVzaG9sZCwgMSwgY3YuVEhSRVNIX0JJTkFSWSlcbiAgICAgICAgLmNvbnZlcnRUbyhjdi5DVl84VSlcbiAgICAgICAgLmZpbmROb25aZXJvKCk7XG4gICAgICBjb25zdCBtYXRjaGVzID0gZmlsdGVyTmVhck1hdGNoZXMobm9uWmVyb01hdGNoUmVzdWx0cywgbWF0Y2hOZWlnaGJvdXJUaHJlc2hvbGQpO1xuXG4gICAgICBmb3IgKGNvbnN0IHt4LCB5fSBvZiBtYXRjaGVzKSB7XG4gICAgICAgIHJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgc2NvcmU6IG1hdGNoZWQuYXQoeSwgeCksXG4gICAgICAgICAgcmVjdDoge1xuICAgICAgICAgICAgeCwgeSxcbiAgICAgICAgICAgIHdpZHRoOiBwYXJ0aWFsSW1nLmNvbHMsXG4gICAgICAgICAgICBoZWlnaHQ6IHBhcnRpYWxJbWcucm93c1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChtaW5NYXgubWF4VmFsID49IHRocmVzaG9sZCkge1xuICAgICAgY29uc3Qge3gsIHl9ID0gbWV0aG9kLmluY2x1ZGVzKCdTUURJRkYnKSA/IG1pbk1heC5taW5Mb2MgOiBtaW5NYXgubWF4TG9jO1xuICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgc2NvcmU6IG1pbk1heC5tYXhWYWwsXG4gICAgICAgIHJlY3Q6IHtcbiAgICAgICAgICB4LCB5LFxuICAgICAgICAgIHdpZHRoOiBwYXJ0aWFsSW1nLmNvbHMsXG4gICAgICAgICAgaGVpZ2h0OiBwYXJ0aWFsSW1nLnJvd3NcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKF8uaXNFbXB0eShyZXN1bHRzKSkge1xuICAgICAgLy8gQmVsb3cgZXJyb3IgbWVzc2FnZSwgYENhbm5vdCBmaW5kIGFueSBvY2N1cnJlbmNlc2AgaXMgcmVmZXJlbmNlZCBpbiBmaW5kIGJ5IGltYWdlXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1hdGNoIHRocmVzaG9sZDogJHt0aHJlc2hvbGR9LiBIaWdoZXN0IG1hdGNoIHZhbHVlIGAgK1xuICAgICAgICAgICAgICAgICAgICAgIGBmb3VuZCB3YXMgJHttaW5NYXgubWF4VmFsfWApO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIEJlbG93IGVycm9yIG1lc3NhZ2UsIGBDYW5ub3QgZmluZCBhbnkgb2NjdXJyZW5jZXNgIGlzIHJlZmVyZW5jZWQgaW4gZmluZCBieSBpbWFnZVxuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGZpbmQgYW55IG9jY3VycmVuY2VzIG9mIHRoZSBwYXJ0aWFsIGltYWdlIGluIHRoZSBmdWxsIGltYWdlLiBgICtcbiAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cblxuICBpZiAodmlzdWFsaXplKSB7XG4gICAgY29uc3QgZnVsbEhpZ2hsaWdodGVkSW1hZ2UgPSBmdWxsSW1nLmNvcHkoKTtcblxuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgIGNvbnN0IHNpbmdsZUhpZ2hsaWdodGVkSW1hZ2UgPSBmdWxsSW1nLmNvcHkoKTtcblxuICAgICAgaGlnaGxpZ2h0UmVnaW9uKHNpbmdsZUhpZ2hsaWdodGVkSW1hZ2UsIHJlc3VsdC5yZWN0KTtcbiAgICAgIGhpZ2hsaWdodFJlZ2lvbihmdWxsSGlnaGxpZ2h0ZWRJbWFnZSwgcmVzdWx0LnJlY3QpO1xuICAgICAgcmVzdWx0LnZpc3VhbGl6YXRpb24gPSBhd2FpdCBjdi5pbWVuY29kZUFzeW5jKCcucG5nJywgc2luZ2xlSGlnaGxpZ2h0ZWRJbWFnZSk7XG4gICAgfVxuICAgIHZpc3VhbGl6YXRpb24gPSBhd2FpdCBjdi5pbWVuY29kZUFzeW5jKCcucG5nJywgZnVsbEhpZ2hsaWdodGVkSW1hZ2UpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICByZWN0OiByZXN1bHRzWzBdLnJlY3QsXG4gICAgc2NvcmU6IHJlc3VsdHNbMF0uc2NvcmUsXG4gICAgdmlzdWFsaXphdGlvbixcbiAgICBtdWx0aXBsZTogcmVzdWx0c1xuICB9O1xufVxuXG4vKipcbiAqIEZpbHRlciBvdXQgbWF0Y2ggcmVzdWx0cyB3aGljaCBoYXZlIGEgbWF0Y2hlZCBuZWlnaGJvdXJcbiAqXG4gKiBAcGFyYW0ge0FycmF5PFBvaW50Pn0gbm9uWmVyb01hdGNoUmVzdWx0cyBtYXRyaXggb2YgaW1hZ2UgbWF0Y2ggcmVzdWx0c1xuICogQHBhcmFtIHtudW1iZXJ9IG1hdGNoTmVpZ2hib3VyVGhyZXNob2xkIFRoZSBwaXhlbCBkaXN0YW5jZSB3aXRoaW4gd2hpY2ggd2VcbiAqIGNvbnNpZGVyIGFuIGVsZW1lbnQgYmVpbmcgYSBuZWlnaGJvdXIgb2YgYW4gZXhpc3RpbmcgbWF0Y2hcbiAqIEByZXR1cm4ge0FycmF5PFBvaW50Pn0gdGhlIGZpbHRlcmVkIGFycmF5IG9mIG1hdGNoZWQgcG9pbnRzXG4gKi9cbmZ1bmN0aW9uIGZpbHRlck5lYXJNYXRjaGVzIChub25aZXJvTWF0Y2hSZXN1bHRzLCBtYXRjaE5laWdoYm91clRocmVzaG9sZCkge1xuICByZXR1cm4gbm9uWmVyb01hdGNoUmVzdWx0cy5yZWR1Y2UoKGFjYywgZWxlbWVudCkgPT4ge1xuICAgIGlmICghYWNjLnNvbWUoKG1hdGNoKSA9PiBkaXN0YW5jZShtYXRjaCwgZWxlbWVudCkgPD0gbWF0Y2hOZWlnaGJvdXJUaHJlc2hvbGQpKSB7XG4gICAgICBhY2MucHVzaChlbGVtZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIGFjYztcbiAgfSwgW10pO1xufVxuXG4vKipcbiAqIEZpbmQgdGhlIGRpc3RhbmNlIGJldHdlZW4gdHdvIHBvaW50c1xuICpcbiAqIEBwYXJhbSB7UG9pbnR9IHBvaW50MSBUaGUgZmlyc3QgcG9pbnRcbiAqIEBwYXJhbSB7UG9pbnR9IHBvaW50MiBUaGUgc2Vjb25kIHBvaW50XG4gKiBAcmV0dXJuIHtudW1iZXJ9IHRoZSBkaXN0YW5jZVxuICovXG5mdW5jdGlvbiBkaXN0YW5jZSAocG9pbnQxLCBwb2ludDIpIHtcbiAgY29uc3QgYTIgPSBNYXRoLnBvdygocG9pbnQxLnggLSBwb2ludDIueCksIDIpO1xuICBjb25zdCBiMiA9IE1hdGgucG93KChwb2ludDEueSAtIHBvaW50Mi55KSwgMik7XG4gIHJldHVybiBNYXRoLnNxcnQoYTIgKyBiMik7XG59XG5cbi8qKlxuICogQ3JvcCB0aGUgaW1hZ2UgYnkgZ2l2ZW4gcmVjdGFuZ2xlICh1c2UgYmFzZTY0IHN0cmluZyBhcyBpbnB1dCBhbmQgb3V0cHV0KVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlNjRJbWFnZSBUaGUgc3RyaW5nIHdpdGggYmFzZTY0IGVuY29kZWQgaW1hZ2VcbiAqIEBwYXJhbSB7UmVnaW9ufSByZWN0IFRoZSBzZWxlY3RlZCByZWdpb24gb2YgaW1hZ2VcbiAqIEByZXR1cm4ge3N0cmluZ30gYmFzZTY0IGVuY29kZWQgc3RyaW5nIG9mIGNyb3BwZWQgaW1hZ2VcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY3JvcEJhc2U2NEltYWdlIChiYXNlNjRJbWFnZSwgcmVjdCkge1xuICBjb25zdCBpbWFnZSA9IGF3YWl0IGJhc2U2NFRvSW1hZ2UoYmFzZTY0SW1hZ2UpO1xuICBjcm9wSW1hZ2UoaW1hZ2UsIHJlY3QpO1xuICByZXR1cm4gYXdhaXQgaW1hZ2VUb0Jhc2U2NChpbWFnZSk7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgcG5nanMgaW1hZ2UgZnJvbSBnaXZlbiBiYXNlNjQgaW1hZ2VcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYmFzZTY0SW1hZ2UgVGhlIHN0cmluZyB3aXRoIGJhc2U2NCBlbmNvZGVkIGltYWdlXG4gKiBAcmV0dXJuIHtQTkd9IFRoZSBpbWFnZSBvYmplY3RcbiAqL1xuYXN5bmMgZnVuY3Rpb24gYmFzZTY0VG9JbWFnZSAoYmFzZTY0SW1hZ2UpIHtcbiAgY29uc3QgaW1hZ2VCdWZmZXIgPSBCdWZmZXIuZnJvbShiYXNlNjRJbWFnZSwgJ2Jhc2U2NCcpO1xuICByZXR1cm4gYXdhaXQgbmV3IEIoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IGltYWdlID0gbmV3IFBORyh7ZmlsdGVyVHlwZTogU0NBTkxJTkVfRklMVEVSX01FVEhPRH0pO1xuICAgIGltYWdlLnBhcnNlKGltYWdlQnVmZmVyLCAoZXJyLCBpbWFnZSkgPT4geyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHByb21pc2UvcHJlZmVyLWF3YWl0LXRvLWNhbGxiYWNrc1xuICAgICAgaWYgKGVycikge1xuICAgICAgICByZXR1cm4gcmVqZWN0KGVycik7XG4gICAgICB9XG4gICAgICByZXNvbHZlKGltYWdlKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgYmFzZTY0IHN0cmluZyBmb3IgZ2l2ZW4gaW1hZ2Ugb2JqZWN0XG4gKlxuICogQHBhcmFtIHtQTkd9IGltYWdlIFRoZSBpbWFnZSBvYmplY3RcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHN0cmluZyB3aXRoIGJhc2U2NCBlbmNvZGVkIGltYWdlXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGltYWdlVG9CYXNlNjQgKGltYWdlKSB7XG4gIHJldHVybiBhd2FpdCBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgY2h1bmtzID0gW107XG4gICAgaW1hZ2UucGFjaygpXG4gICAgLm9uKCdkYXRhJywgKGNodW5rKSA9PiBjaHVua3MucHVzaChjaHVuaykpLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICByZXNvbHZlKEJ1ZmZlci5jb25jYXQoY2h1bmtzKS50b1N0cmluZygnYmFzZTY0JykpO1xuICAgIH0pXG4gICAgLm9uKCdlcnJvcicsIChlcnIpID0+IHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBwcm9taXNlL3ByZWZlci1hd2FpdC10by1jYWxsYmFja3NcbiAgICAgIHJlamVjdChlcnIpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBDcm9wIHRoZSBpbWFnZSBieSBnaXZlbiByZWN0YW5nbGVcbiAqXG4gKiBAcGFyYW0ge1BOR30gaW1hZ2UgVGhlIGltYWdlIHRvIG11dGF0ZSBieSBjcm9wcGluZ1xuICogQHBhcmFtIHtSZWdpb259IHJlY3QgVGhlIHNlbGVjdGVkIHJlZ2lvbiBvZiBpbWFnZVxuICovXG5mdW5jdGlvbiBjcm9wSW1hZ2UgKGltYWdlLCByZWN0KSB7XG4gIGNvbnN0IGltYWdlUmVjdCA9IHt3aWR0aDogaW1hZ2Uud2lkdGgsIGhlaWdodDogaW1hZ2UuaGVpZ2h0fTtcbiAgY29uc3QgaW50ZXJSZWN0ID0gZ2V0UmVjdEludGVyc2VjdGlvbihyZWN0LCBpbWFnZVJlY3QpO1xuICBpZiAoaW50ZXJSZWN0LndpZHRoIDwgcmVjdC53aWR0aCB8fCBpbnRlclJlY3QuaGVpZ2h0IDwgcmVjdC5oZWlnaHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjcm9wICR7SlNPTi5zdHJpbmdpZnkocmVjdCl9IGZyb20gJHtKU09OLnN0cmluZ2lmeShpbWFnZVJlY3QpfSBiZWNhdXNlIHRoZSBpbnRlcnNlY3Rpb24gYmV0d2VlbiB0aGVtIHdhcyBub3QgdGhlIHNpemUgb2YgdGhlIHJlY3RgKTtcbiAgfVxuXG4gIGNvbnN0IGZpcnN0VmVydGljYWxQaXhlbCA9IGludGVyUmVjdC50b3A7XG4gIGNvbnN0IGxhc3RWZXJ0aWNhbFBpeGVsID0gaW50ZXJSZWN0LnRvcCArIGludGVyUmVjdC5oZWlnaHQ7XG5cbiAgY29uc3QgZmlyc3RIb3Jpem9udGFsUGl4ZWwgPSBpbnRlclJlY3QubGVmdDtcbiAgY29uc3QgbGFzdEhvcml6b250YWxQaXhlbCA9IGludGVyUmVjdC5sZWZ0ICsgaW50ZXJSZWN0LndpZHRoO1xuXG4gIGNvbnN0IGNyb3BwZWRBcnJheSA9IFtdO1xuICBmb3IgKGxldCB5ID0gZmlyc3RWZXJ0aWNhbFBpeGVsOyB5IDwgbGFzdFZlcnRpY2FsUGl4ZWw7IHkrKykge1xuICAgIGZvciAobGV0IHggPSBmaXJzdEhvcml6b250YWxQaXhlbDsgeCA8IGxhc3RIb3Jpem9udGFsUGl4ZWw7IHgrKykge1xuICAgICAgY29uc3QgZmlyc3RCeXRlSWR4SW5QaXhlbEJsb2NrID0gKGltYWdlUmVjdC53aWR0aCAqIHkgKyB4KSA8PCAyO1xuICAgICAgZm9yIChsZXQgYnl0ZUlkeCA9IDA7IGJ5dGVJZHggPCBCWVRFU19JTl9QSVhFTF9CTE9DSzsgYnl0ZUlkeCsrKSB7XG4gICAgICAgIGNyb3BwZWRBcnJheS5wdXNoKGltYWdlLmRhdGFbZmlyc3RCeXRlSWR4SW5QaXhlbEJsb2NrICsgYnl0ZUlkeF0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGltYWdlLmRhdGEgPSBCdWZmZXIuZnJvbShjcm9wcGVkQXJyYXkpO1xuICBpbWFnZS53aWR0aCA9IGludGVyUmVjdC53aWR0aDtcbiAgaW1hZ2UuaGVpZ2h0ID0gaW50ZXJSZWN0LmhlaWdodDtcbiAgcmV0dXJuIGltYWdlO1xufVxuXG5mdW5jdGlvbiBnZXRSZWN0SW50ZXJzZWN0aW9uIChyZWN0LCBpbWFnZVNpemUpIHtcbiAgY29uc3QgbGVmdCA9IHJlY3QubGVmdCA+PSBpbWFnZVNpemUud2lkdGggPyBpbWFnZVNpemUud2lkdGggOiByZWN0LmxlZnQ7XG4gIGNvbnN0IHRvcCA9IHJlY3QudG9wID49IGltYWdlU2l6ZS5oZWlnaHQgPyBpbWFnZVNpemUuaGVpZ2h0IDogcmVjdC50b3A7XG4gIGNvbnN0IHdpZHRoID0gaW1hZ2VTaXplLndpZHRoID49IChsZWZ0ICsgcmVjdC53aWR0aCkgPyByZWN0LndpZHRoIDogKGltYWdlU2l6ZS53aWR0aCAtIGxlZnQpO1xuICBjb25zdCBoZWlnaHQgPSBpbWFnZVNpemUuaGVpZ2h0ID49ICh0b3AgKyByZWN0LmhlaWdodCkgPyByZWN0LmhlaWdodCA6IChpbWFnZVNpemUuaGVpZ2h0IC0gdG9wKTtcbiAgcmV0dXJuIHtsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHR9O1xufVxuXG5leHBvcnQge1xuICBjcm9wQmFzZTY0SW1hZ2UsIGJhc2U2NFRvSW1hZ2UsIGltYWdlVG9CYXNlNjQsIGNyb3BJbWFnZSwgZ2V0SW1hZ2VzTWF0Y2hlcyxcbiAgZ2V0SW1hZ2VzU2ltaWxhcml0eSwgZ2V0SW1hZ2VPY2N1cnJlbmNlLCBnZXRKaW1wSW1hZ2UsIE1JTUVfSlBFRywgTUlNRV9QTkcsXG4gIE1JTUVfQk1QLFxufTtcbiJdLCJmaWxlIjoibGliL2ltYWdlLXV0aWwuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
|
package/lib/image-util.js
CHANGED
|
@@ -8,6 +8,10 @@ import log from './logger';
|
|
|
8
8
|
import { requirePackage } from './node';
|
|
9
9
|
|
|
10
10
|
|
|
11
|
+
const OCV_OLD = 'opencv4nodejs';
|
|
12
|
+
const OCV_NEW = '@u4/opencv4nodejs';
|
|
13
|
+
|
|
14
|
+
|
|
11
15
|
const { MIME_JPEG, MIME_PNG, MIME_BMP } = Jimp;
|
|
12
16
|
let cv = null;
|
|
13
17
|
|
|
@@ -127,16 +131,20 @@ async function initOpenCV () {
|
|
|
127
131
|
}
|
|
128
132
|
|
|
129
133
|
log.debug(`Initializing opencv`);
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
+
for (const ocvPackage of [OCV_OLD, OCV_NEW]) {
|
|
135
|
+
try {
|
|
136
|
+
log.debug(`Attempting to load '${ocvPackage}'`);
|
|
137
|
+
cv = await requirePackage(ocvPackage);
|
|
138
|
+
break;
|
|
139
|
+
} catch (err) {
|
|
140
|
+
log.warn(`Unable to load '${ocvPackage}': ${err.message}`);
|
|
141
|
+
}
|
|
134
142
|
}
|
|
135
143
|
|
|
136
144
|
if (!cv) {
|
|
137
|
-
throw new Error(`
|
|
138
|
-
`Please install
|
|
139
|
-
'Read https://github.com/
|
|
145
|
+
throw new Error(`An opencv node module is required to use OpenCV features. ` +
|
|
146
|
+
`Please install one first (e.g., 'npm i -g ${OCV_NEW}') and restart Appium. ` +
|
|
147
|
+
'Read https://github.com/UrielCh/opencv4nodejs#how-to-install for more details on this topic.');
|
|
140
148
|
}
|
|
141
149
|
}
|
|
142
150
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@appium/support",
|
|
3
|
-
"version": "2.55.
|
|
3
|
+
"version": "2.55.3",
|
|
4
4
|
"description": "Support libs used across appium packages",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"automation",
|
|
@@ -72,5 +72,5 @@
|
|
|
72
72
|
"access": "public"
|
|
73
73
|
},
|
|
74
74
|
"homepage": "https://appium.io",
|
|
75
|
-
"gitHead": "
|
|
75
|
+
"gitHead": "ca90a11813546ab4851e5b1f0406f420a53227e6"
|
|
76
76
|
}
|