appium-android-driver 5.4.1 → 5.4.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/android-helpers.js +12 -3
- package/build/lib/android-helpers.js.map +1 -0
- package/build/lib/bootstrap.js.map +1 -0
- package/build/lib/commands/actions.js.map +1 -0
- package/build/lib/commands/alert.js.map +1 -0
- package/build/lib/commands/app-management.js.map +1 -0
- package/build/lib/commands/context.js.map +1 -0
- package/build/lib/commands/coverage.js.map +1 -0
- package/build/lib/commands/element.js.map +1 -0
- package/build/lib/commands/emu-console.js.map +1 -0
- package/build/lib/commands/execute.js.map +1 -0
- package/build/lib/commands/file-actions.js.map +1 -0
- package/build/lib/commands/find.js.map +1 -0
- package/build/lib/commands/general.js.map +1 -0
- package/build/lib/commands/ime.js.map +1 -0
- package/build/lib/commands/index.js.map +1 -0
- package/build/lib/commands/intent.js.map +1 -0
- package/build/lib/commands/log.js.map +1 -0
- package/build/lib/commands/media-projection.js.map +1 -0
- package/build/lib/commands/network.js.map +1 -0
- package/build/lib/commands/performance.js.map +1 -0
- package/build/lib/commands/recordscreen.js.map +1 -0
- package/build/lib/commands/shell.js.map +1 -0
- package/build/lib/commands/streamscreen.js.map +1 -0
- package/build/lib/commands/system-bars.js.map +1 -0
- package/build/lib/commands/touch.js.map +1 -0
- package/build/lib/desired-caps.js.map +1 -0
- package/build/lib/driver.js.map +1 -0
- package/build/lib/logger.js.map +1 -0
- package/build/lib/uiautomator.js.map +1 -0
- package/build/lib/unlock-helpers.js.map +1 -0
- package/build/lib/utils.js.map +1 -0
- package/build/lib/webview-helpers.js.map +1 -0
- package/lib/android-helpers.js +8 -2
- package/package.json +2 -2
|
@@ -189,10 +189,19 @@ helpers.prepareEmulator = async function prepareEmulator(adb, opts) {
|
|
|
189
189
|
}
|
|
190
190
|
|
|
191
191
|
const avdName = avd.replace('@', '');
|
|
192
|
-
|
|
192
|
+
let isEmulatorRunning = true;
|
|
193
|
+
|
|
194
|
+
try {
|
|
195
|
+
await adb.getRunningAVDWithRetry(avdName, 5000);
|
|
196
|
+
} catch (e) {
|
|
197
|
+
_logger.default.debug(`Emulator '${avdName}' is not running: ${e.message}`);
|
|
198
|
+
|
|
199
|
+
isEmulatorRunning = false;
|
|
200
|
+
}
|
|
201
|
+
|
|
193
202
|
const args = prepareAvdArgs(adb, opts);
|
|
194
203
|
|
|
195
|
-
if (
|
|
204
|
+
if (isEmulatorRunning) {
|
|
196
205
|
if (args.includes('-wipe-data')) {
|
|
197
206
|
_logger.default.debug(`Killing '${avdName}' because it needs to be wiped at start.`);
|
|
198
207
|
|
|
@@ -983,4 +992,4 @@ helpers.bootstrap = _bootstrap.default;
|
|
|
983
992
|
helpers.unlocker = _unlockHelpers.default;
|
|
984
993
|
var _default = helpers;
|
|
985
994
|
exports.default = _default;
|
|
986
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNT0NLX0FQUF9JRFNfU1RPUkUiLCJQQUNLQUdFX0lOU1RBTExfVElNRU9VVCIsIkNIUk9NRV9CUk9XU0VSX1BBQ0tBR0VfQUNUSVZJVFkiLCJjaHJvbWUiLCJwa2ciLCJhY3Rpdml0eSIsImNocm9taXVtIiwiY2hyb21lYmV0YSIsImJyb3dzZXIiLCJkZWZhdWx0IiwiU0VUVElOR1NfSEVMUEVSX1BLR19JRCIsIlNFVFRJTkdTX0hFTFBFUl9VTkxPQ0tfQUNUSVZJVFkiLCJFTVVMQVRPUl9QQVRURVJOIiwiQVBQX1NUQVRFIiwiT2JqZWN0IiwiZnJlZXplIiwiTk9UX0lOU1RBTExFRCIsIk5PVF9SVU5OSU5HIiwiUlVOTklOR19JTl9CQUNLR1JPVU5EIiwiUlVOTklOR19JTl9GT1JFR1JPVU5EIiwiZW5zdXJlTmV0d29ya1NwZWVkIiwiYWRiIiwibmV0d29ya1NwZWVkIiwiXyIsInZhbHVlcyIsIk5FVFdPUktfU1BFRUQiLCJpbmNsdWRlcyIsImxvZ2dlciIsIndhcm4iLCJGVUxMIiwicHJlcGFyZUF2ZEFyZ3MiLCJvcHRzIiwiaXNIZWFkbGVzcyIsImF2ZEFyZ3MiLCJyZXN1bHQiLCJpc0FycmF5IiwicHVzaCIsInV0aWwiLCJzaGVsbFBhcnNlIiwidG9DcmVkZW50aWFsVHlwZSIsInVubG9ja1R5cGUiLCJQSU5fVU5MT0NLIiwiUElOX1VOTE9DS19LRVlfRVZFTlQiLCJQQVNTV09SRF9VTkxPQ0siLCJQQVRURVJOX1VOTE9DSyIsIkVycm9yIiwiaGVscGVycyIsImNyZWF0ZUJhc2VBREIiLCJhZGJQb3J0Iiwic3VwcHJlc3NLaWxsU2VydmVyIiwicmVtb3RlQWRiSG9zdCIsImNsZWFyRGV2aWNlTG9nc09uU3RhcnQiLCJhZGJFeGVjVGltZW91dCIsInVzZUtleXN0b3JlIiwia2V5c3RvcmVQYXRoIiwia2V5c3RvcmVQYXNzd29yZCIsImtleUFsaWFzIiwia2V5UGFzc3dvcmQiLCJyZW1vdGVBcHBzQ2FjaGVMaW1pdCIsImJ1aWxkVG9vbHNWZXJzaW9uIiwiYWxsb3dPZmZsaW5lRGV2aWNlcyIsImFsbG93RGVsYXlBZGIiLCJBREIiLCJjcmVhdGVBREIiLCJwcmVwYXJlRW11bGF0b3IiLCJhdmQiLCJhdmRFbnYiLCJlbnYiLCJsYW5ndWFnZSIsImxvY2FsZSIsImNvdW50cnkiLCJhdmRMYXVuY2hUaW1lb3V0IiwibGF1bmNoVGltZW91dCIsImF2ZFJlYWR5VGltZW91dCIsInJlYWR5VGltZW91dCIsImF2ZE5hbWUiLCJyZXBsYWNlIiwicnVubmluZ0FWRCIsImdldFJ1bm5pbmdBVkRXaXRoUmV0cnkiLCJhcmdzIiwiZGVidWciLCJraWxsRW11bGF0b3IiLCJsYXVuY2hBVkQiLCJlbnN1cmVEZXZpY2VMb2NhbGUiLCJzY3JpcHQiLCJpc1N0cmluZyIsInNldERldmljZUxhbmd1YWdlQ291bnRyeSIsImVuc3VyZUN1cnJlbnRMb2NhbGUiLCJtZXNzYWdlIiwiZ2V0RGV2aWNlSW5mb0Zyb21DYXBzIiwidWRpZCIsImVtUG9ydCIsImN1ckRldmljZUlkIiwiZW11bGF0b3JQb3J0IiwiaW5mbyIsImRldmljZXMiLCJnZXREZXZpY2VzV2l0aFJldHJ5IiwibWFwIiwiZXJyb3JBbmRUaHJvdyIsImdldFBvcnRGcm9tRW11bGF0b3JTdHJpbmciLCJwbGF0Zm9ybVZlcnNpb24iLCJ0cmltIiwic2VtdmVyIiwiY29lcmNlIiwiYXZhaWxEZXZpY2VzIiwicGFydGlhbE1hdGNoQ2FuZGlkYXRlIiwiZGV2aWNlIiwic2V0RGV2aWNlSWQiLCJyYXdEZXZpY2VPUyIsImdldFBsYXRmb3JtVmVyc2lvbiIsImRldmljZU9TIiwiYm90aFZlcnNpb25zQ2FuQmVDb2VyY2VkIiwidmFsaWQiLCJib3RoVmVyc2lvbnNBcmVTdHJpbmdzIiwidmVyc2lvbiIsInRvTG93ZXIiLCJtYWpvciIsIm1pbm9yIiwiZ3QiLCJrZXlzIiwiam9pbiIsInNldEVtdWxhdG9yUG9ydCIsInZhbGlkYXRlUGFja2FnZUFjdGl2aXR5TmFtZXMiLCJrZXkiLCJuYW1lIiwibWF0Y2giLCJleGVjIiwiaW5kZXgiLCJzdWJzdHJpbmciLCJnZXRMYXVuY2hJbmZvIiwiYXBwIiwiYXBwUGFja2FnZSIsImFwcEFjdGl2aXR5IiwiYXBwV2FpdFBhY2thZ2UiLCJhcHBXYWl0QWN0aXZpdHkiLCJhcGtQYWNrYWdlIiwiYXBrQWN0aXZpdHkiLCJwYWNrYWdlQW5kTGF1bmNoQWN0aXZpdHlGcm9tTWFuaWZlc3QiLCJyZXNldEFwcCIsImZhc3RSZXNldCIsImZ1bGxSZXNldCIsImFuZHJvaWRJbnN0YWxsVGltZW91dCIsImF1dG9HcmFudFBlcm1pc3Npb25zIiwiYWxsb3dUZXN0UGFja2FnZXMiLCJpc0luc3RhbGxlZCIsImlzQXBwSW5zdGFsbGVkIiwiZm9yY2VTdG9wIiwiaWduIiwib3V0cHV0IiwiY2xlYXIiLCJ0b0xvd2VyQ2FzZSIsImdyYW50QWxsUGVybWlzc2lvbnMiLCJlcnJvciIsInVuaW5zdGFsbEFwayIsImluc3RhbGwiLCJncmFudFBlcm1pc3Npb25zIiwidGltZW91dCIsImluc3RhbGxBcGsiLCJlbmZvcmNlQXBwSW5zdGFsbCIsImFwcFN0YXRlIiwid2FzVW5pbnN0YWxsZWQiLCJpbnN0YWxsT3JVcGdyYWRlIiwiZW5mb3JjZUN1cnJlbnRCdWlsZCIsImlzSW5zdGFsbGVkT3ZlckV4aXN0aW5nQXBwIiwiQVBQX0lOU1RBTExfU1RBVEUiLCJpbnN0YWxsT3RoZXJBcGtzIiwib3RoZXJBcHBzIiwiQiIsImFsbCIsIm90aGVyQXBwIiwidW5pbnN0YWxsT3RoZXJQYWNrYWdlcyIsImFwcFBhY2thZ2VzIiwiZmlsdGVyUGFja2FnZXMiLCJnZXRUaGlyZFBhcnR5UGFja2FnZXMiLCJwYWNrYWdlc1N0cmluZyIsInNoZWxsIiwiYXBwUGFja2FnZXNBcnJheSIsInNwbGl0IiwiRU9MIiwiZGlmZmVyZW5jZSIsImVyciIsImluaXRVbmljb2RlS2V5Ym9hcmQiLCJkZWZhdWx0SU1FIiwiYXBwaXVtSU1FIiwiZW5hYmxlSU1FIiwic2V0SU1FIiwic2V0TW9ja0xvY2F0aW9uQXBwIiwiZ2V0QXBpTGV2ZWwiLCJwa2dJZHMiLCJmaWxlRXhpc3RzIiwiSlNPTiIsInBhcnNlIiwidG1wUm9vdCIsInRlbXBEaXIiLCJvcGVuRGlyIiwic3JjUGF0aCIsInBhdGgiLCJwb3NpeCIsImJhc2VuYW1lIiwiZnMiLCJ3cml0ZUZpbGUiLCJzdHJpbmdpZnkiLCJwdXNoRmlsZSIsInJpbXJhZiIsImUiLCJyZXNldE1vY2tMb2NhdGlvbiIsInRoaXJkUGFydHlQa2dJZHNQcm9taXNlIiwidGhpcmRQYXJ0eVBrZ0lkcyIsInJlc3VsdFBrZ3MiLCJpbnRlcnNlY3Rpb24iLCJzaXplIiwicGtnSWQiLCJpbnN0YWxsSGVscGVyQXBwIiwiYXBrUGF0aCIsInBhY2thZ2VJZCIsInJldHJ5IiwicmV0cnlJbnN0YWxsSGVscGVyQXBwIiwicHVzaFNldHRpbmdzQXBwIiwidGhyb3dFcnJvciIsInNldHRpbmdzQXBrUGF0aCIsInByb2Nlc3NFeGlzdHMiLCJhcGlMZXZlbCIsInBlcm1zIiwieCIsInJlcXVpcmVSdW5uaW5nU2V0dGluZ3NBcHAiLCJpc0VtdWxhdG9yIiwicHVzaFN0cmluZ3MiLCJyZW1vdGVEaXIiLCJzdHJpbmdzSnNvbiIsInJlbW90ZUZpbGUiLCJyZXNvbHZlIiwicHVsbEFwayIsInRtcERpciIsImlzRW1wdHkiLCJleGlzdHMiLCJzdHJpbmdzVG1wRGlyIiwiYXBrU3RyaW5ncyIsImxvY2FsUGF0aCIsImV4dHJhY3RTdHJpbmdzRnJvbUFwayIsInVubG9ja1dpdGhIZWxwZXJBcHAiLCJmaXJzdFJ1biIsImxhdW5jaEhlbHBlciIsImlzU2NyZWVuTG9ja2VkIiwiZGVsYXkiLCJ1bmxvY2siLCJkcml2ZXIiLCJjYXBhYmlsaXRpZXMiLCJ1bmxvY2tLZXkiLCJ1bmxvY2tTdHJhdGVneSIsInVubG9ja1N1Y2Nlc3NUaW1lb3V0IiwidW5sb2NrZXIiLCJ2YWxpZGF0ZVVubG9ja0NhcGFiaWxpdGllcyIsIkZJTkdFUlBSSU5UX1VOTE9DSyIsImlzTmlsIiwiaXNMb2NrTWFuYWdlbWVudFN1cHBvcnRlZCIsImZhc3RVbmxvY2siLCJjcmVkZW50aWFsIiwiY3JlZGVudGlhbFR5cGUiLCJ1bmxvY2tNZXRob2QiLCJwaW5VbmxvY2siLCJwaW5VbmxvY2tXaXRoS2V5RXZlbnQiLCJwYXNzd29yZFVubG9jayIsInBhdHRlcm5VbmxvY2siLCJmaW5nZXJwcmludFVubG9jayIsInZlcmlmeVVubG9jayIsInRpbWVvdXRNcyIsIndhaXRGb3JDb25kaXRpb24iLCJ3YWl0TXMiLCJpbnRlcnZhbE1zIiwiaW5pdERldmljZSIsInNraXBEZXZpY2VJbml0aWFsaXphdGlvbiIsImxvY2FsZVNjcmlwdCIsInVuaWNvZGVLZXlib2FyZCIsImRpc2FibGVXaW5kb3dBbmltYXRpb24iLCJza2lwVW5sb2NrIiwibW9ja0xvY2F0aW9uQXBwIiwic2tpcExvZ2NhdENhcHR1cmUiLCJsb2djYXRGb3JtYXQiLCJsb2djYXRGaWx0ZXJTcGVjcyIsIndhaXRGb3JEZXZpY2UiLCJzaG91bGRUaHJvd0Vycm9yIiwiaXNVbmRlZmluZWQiLCJzdGFydExvZ2NhdCIsImZvcm1hdCIsImZpbHRlclNwZWNzIiwicmVtb3ZlTnVsbFByb3BlcnRpZXMiLCJvYmoiLCJpc051bGwiLCJ0cnVuY2F0ZURlY2ltYWxzIiwibnVtYmVyIiwiZGlnaXRzIiwibXVsdGlwbGllciIsIk1hdGgiLCJwb3ciLCJhZGp1c3RlZE51bSIsInRydW5jYXRlZE51bSIsImlzQ2hyb21lQnJvd3NlciIsImdldENocm9tZVBrZyIsInJlbW92ZUFsbFNlc3Npb25XZWJTb2NrZXRIYW5kbGVycyIsInNlcnZlciIsInNlc3Npb25JZCIsImlzRnVuY3Rpb24iLCJnZXRXZWJTb2NrZXRIYW5kbGVycyIsImFjdGl2ZUhhbmRsZXJzIiwicGF0aG5hbWUiLCJyZW1vdmVXZWJTb2NrZXRIYW5kbGVyIiwicGFyc2VBcnJheSIsImNhcCIsInBhcnNlZENhcHMiLCJ2YWxpZGF0ZURlc2lyZWRDYXBzIiwiY2FwcyIsImJyb3dzZXJOYW1lIiwiYWRqdXN0QnJvd3NlclNlc3Npb25DYXBzIiwicG9zc2libGVOYW1lcyIsInNvbWUiLCJ0ZXN0IiwiYm9vdHN0cmFwIiwiQm9vdHN0cmFwIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL2FuZHJvaWQtaGVscGVycy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyByZXRyeSwgd2FpdEZvckNvbmRpdGlvbiB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCBsb2dnZXIgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHsgZnMsIHV0aWwsIHRlbXBEaXIgfSBmcm9tICdhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyBwYXRoIGFzIHNldHRpbmdzQXBrUGF0aCB9IGZyb20gJ2lvLmFwcGl1bS5zZXR0aW5ncyc7XG5pbXBvcnQgQm9vdHN0cmFwIGZyb20gJy4vYm9vdHN0cmFwJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCBBREIgZnJvbSAnYXBwaXVtLWFkYic7XG5pbXBvcnQge1xuICBkZWZhdWx0IGFzIHVubG9ja2VyLCBQSU5fVU5MT0NLLCBQSU5fVU5MT0NLX0tFWV9FVkVOVCxcbiAgUEFTU1dPUkRfVU5MT0NLLCBQQVRURVJOX1VOTE9DSywgRklOR0VSUFJJTlRfVU5MT0NLXG59IGZyb20gJy4vdW5sb2NrLWhlbHBlcnMnO1xuaW1wb3J0IHsgRU9MIH0gZnJvbSAnb3MnO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuXG5jb25zdCBNT0NLX0FQUF9JRFNfU1RPUkUgPSAnL2RhdGEvbG9jYWwvdG1wL21vY2tfYXBwcy5qc29uJztcbmNvbnN0IFBBQ0tBR0VfSU5TVEFMTF9USU1FT1VUID0gOTAwMDA7IC8vIG1pbGxpc2Vjb25kc1xuLy8gaHR0cHM6Ly9jcy5jaHJvbWl1bS5vcmcvY2hyb21pdW0vc3JjL2Nocm9tZS9icm93c2VyL2RldnRvb2xzL2RldmljZS9hbmRyb2lkX2RldmljZV9pbmZvX3F1ZXJ5LmNjXG5jb25zdCBDSFJPTUVfQlJPV1NFUl9QQUNLQUdFX0FDVElWSVRZID0ge1xuICBjaHJvbWU6IHtcbiAgICBwa2c6ICdjb20uYW5kcm9pZC5jaHJvbWUnLFxuICAgIGFjdGl2aXR5OiAnY29tLmdvb2dsZS5hbmRyb2lkLmFwcHMuY2hyb21lLk1haW4nLFxuICB9LFxuICBjaHJvbWl1bToge1xuICAgIHBrZzogJ29yZy5jaHJvbWl1bS5jaHJvbWUuc2hlbGwnLFxuICAgIGFjdGl2aXR5OiAnLkNocm9tZVNoZWxsQWN0aXZpdHknLFxuICB9LFxuICBjaHJvbWViZXRhOiB7XG4gICAgcGtnOiAnY29tLmNocm9tZS5iZXRhJyxcbiAgICBhY3Rpdml0eTogJ2NvbS5nb29nbGUuYW5kcm9pZC5hcHBzLmNocm9tZS5NYWluJyxcbiAgfSxcbiAgYnJvd3Nlcjoge1xuICAgIHBrZzogJ2NvbS5hbmRyb2lkLmJyb3dzZXInLFxuICAgIGFjdGl2aXR5OiAnY29tLmFuZHJvaWQuYnJvd3Nlci5Ccm93c2VyQWN0aXZpdHknLFxuICB9LFxuICAnY2hyb21pdW0tYnJvd3Nlcic6IHtcbiAgICBwa2c6ICdvcmcuY2hyb21pdW0uY2hyb21lJyxcbiAgICBhY3Rpdml0eTogJ2NvbS5nb29nbGUuYW5kcm9pZC5hcHBzLmNocm9tZS5NYWluJyxcbiAgfSxcbiAgJ2Nocm9taXVtLXdlYnZpZXcnOiB7XG4gICAgcGtnOiAnb3JnLmNocm9taXVtLndlYnZpZXdfc2hlbGwnLFxuICAgIGFjdGl2aXR5OiAnb3JnLmNocm9taXVtLndlYnZpZXdfc2hlbGwuV2ViVmlld0Jyb3dzZXJBY3Rpdml0eScsXG4gIH0sXG4gIGRlZmF1bHQ6IHtcbiAgICBwa2c6ICdjb20uYW5kcm9pZC5jaHJvbWUnLFxuICAgIGFjdGl2aXR5OiAnY29tLmdvb2dsZS5hbmRyb2lkLmFwcHMuY2hyb21lLk1haW4nLFxuICB9LFxufTtcbmNvbnN0IFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQgPSAnaW8uYXBwaXVtLnNldHRpbmdzJztcbmNvbnN0IFNFVFRJTkdTX0hFTFBFUl9VTkxPQ0tfQUNUSVZJVFkgPSAnLlVubG9jayc7XG5jb25zdCBFTVVMQVRPUl9QQVRURVJOID0gL1xcYmVtdWxhdG9yXFxiL2k7XG4vLyBUaGVzZSBjb25zdGFudHMgYXJlIGluIHN5bmMgd2l0aFxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2RvY3VtZW50YXRpb24veGN0ZXN0L3hjdWlhcHBsaWNhdGlvbnN0YXRlL3hjdWlhcHBsaWNhdGlvbnN0YXRlcnVubmluZ2JhY2tncm91bmQ/bGFuZ3VhZ2U9b2JqY1xuY29uc3QgQVBQX1NUQVRFID0gT2JqZWN0LmZyZWV6ZSh7XG4gIE5PVF9JTlNUQUxMRUQ6IDAsXG4gIE5PVF9SVU5OSU5HOiAxLFxuICBSVU5OSU5HX0lOX0JBQ0tHUk9VTkQ6IDMsXG4gIFJVTk5JTkdfSU5fRk9SRUdST1VORDogNFxufSk7XG5cblxuZnVuY3Rpb24gZW5zdXJlTmV0d29ya1NwZWVkIChhZGIsIG5ldHdvcmtTcGVlZCkge1xuICBpZiAoXy52YWx1ZXMoYWRiLk5FVFdPUktfU1BFRUQpLmluY2x1ZGVzKG5ldHdvcmtTcGVlZCkpIHtcbiAgICByZXR1cm4gbmV0d29ya1NwZWVkO1xuICB9XG4gIGxvZ2dlci53YXJuKGBXcm9uZyBuZXR3b3JrIHNwZWVkIHBhcmFtICcke25ldHdvcmtTcGVlZH0nLCB1c2luZyBkZWZhdWx0OiAke2FkYi5ORVRXT1JLX1NQRUVELkZVTEx9LiBgICtcbiAgICBgU3VwcG9ydGVkIHZhbHVlczogJHtfLnZhbHVlcyhhZGIuTkVUV09SS19TUEVFRCl9YCk7XG4gIHJldHVybiBhZGIuTkVUV09SS19TUEVFRC5GVUxMO1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlQXZkQXJncyAoYWRiLCBvcHRzKSB7XG4gIGNvbnN0IHtcbiAgICBuZXR3b3JrU3BlZWQsXG4gICAgaXNIZWFkbGVzcyxcbiAgICBhdmRBcmdzLFxuICB9ID0gb3B0cztcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGlmIChhdmRBcmdzKSB7XG4gICAgaWYgKF8uaXNBcnJheShhdmRBcmdzKSkge1xuICAgICAgcmVzdWx0LnB1c2goLi4uYXZkQXJncyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5wdXNoKC4uLih1dGlsLnNoZWxsUGFyc2UoYCR7YXZkQXJnc31gKSkpO1xuICAgIH1cbiAgfVxuICBpZiAobmV0d29ya1NwZWVkKSB7XG4gICAgcmVzdWx0LnB1c2goJy1uZXRzcGVlZCcsIGVuc3VyZU5ldHdvcmtTcGVlZChhZGIsIG5ldHdvcmtTcGVlZCkpO1xuICB9XG4gIGlmIChpc0hlYWRsZXNzKSB7XG4gICAgcmVzdWx0LnB1c2goJy1uby13aW5kb3cnKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiB0b0NyZWRlbnRpYWxUeXBlICh1bmxvY2tUeXBlKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICBbUElOX1VOTE9DS106ICdwaW4nLFxuICAgIFtQSU5fVU5MT0NLX0tFWV9FVkVOVF06ICdwaW4nLFxuICAgIFtQQVNTV09SRF9VTkxPQ0tdOiAncGFzc3dvcmQnLFxuICAgIFtQQVRURVJOX1VOTE9DS106ICdwYXR0ZXJuJyxcbiAgfVt1bmxvY2tUeXBlXTtcbiAgaWYgKHJlc3VsdCkge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBVbmxvY2sgdHlwZSAnJHt1bmxvY2tUeXBlfScgaXMgbm90IGtub3duYCk7XG59XG5cblxuY29uc3QgaGVscGVycyA9IHt9O1xuXG5oZWxwZXJzLmNyZWF0ZUJhc2VBREIgPSBhc3luYyBmdW5jdGlvbiBjcmVhdGVCYXNlQURCIChvcHRzID0ge30pIHtcbiAgLy8gZmlsdGVyIG91dCBhbnkgdW53YW50ZWQgb3B0aW9ucyBzZW50IGluXG4gIC8vIHRoaXMgbGlzdCBzaG91bGQgYmUgdXBkYXRlZCBhcyBBREIgdGFrZXMgbW9yZSBhcmd1bWVudHNcbiAgY29uc3Qge1xuICAgIGFkYlBvcnQsXG4gICAgc3VwcHJlc3NLaWxsU2VydmVyLFxuICAgIHJlbW90ZUFkYkhvc3QsXG4gICAgY2xlYXJEZXZpY2VMb2dzT25TdGFydCxcbiAgICBhZGJFeGVjVGltZW91dCxcbiAgICB1c2VLZXlzdG9yZSxcbiAgICBrZXlzdG9yZVBhdGgsXG4gICAga2V5c3RvcmVQYXNzd29yZCxcbiAgICBrZXlBbGlhcyxcbiAgICBrZXlQYXNzd29yZCxcbiAgICByZW1vdGVBcHBzQ2FjaGVMaW1pdCxcbiAgICBidWlsZFRvb2xzVmVyc2lvbixcbiAgICBhbGxvd09mZmxpbmVEZXZpY2VzLFxuICAgIGFsbG93RGVsYXlBZGIsXG4gIH0gPSBvcHRzO1xuICByZXR1cm4gYXdhaXQgQURCLmNyZWF0ZUFEQih7XG4gICAgYWRiUG9ydCxcbiAgICBzdXBwcmVzc0tpbGxTZXJ2ZXIsXG4gICAgcmVtb3RlQWRiSG9zdCxcbiAgICBjbGVhckRldmljZUxvZ3NPblN0YXJ0LFxuICAgIGFkYkV4ZWNUaW1lb3V0LFxuICAgIHVzZUtleXN0b3JlLFxuICAgIGtleXN0b3JlUGF0aCxcbiAgICBrZXlzdG9yZVBhc3N3b3JkLFxuICAgIGtleUFsaWFzLFxuICAgIGtleVBhc3N3b3JkLFxuICAgIHJlbW90ZUFwcHNDYWNoZUxpbWl0LFxuICAgIGJ1aWxkVG9vbHNWZXJzaW9uLFxuICAgIGFsbG93T2ZmbGluZURldmljZXMsXG4gICAgYWxsb3dEZWxheUFkYixcbiAgfSk7XG59O1xuXG5oZWxwZXJzLnByZXBhcmVFbXVsYXRvciA9IGFzeW5jIGZ1bmN0aW9uIHByZXBhcmVFbXVsYXRvciAoYWRiLCBvcHRzKSB7XG4gIGNvbnN0IHtcbiAgICBhdmQsXG4gICAgYXZkRW52OiBlbnYsXG4gICAgbGFuZ3VhZ2UsXG4gICAgbG9jYWxlOiBjb3VudHJ5LFxuICAgIGF2ZExhdW5jaFRpbWVvdXQ6IGxhdW5jaFRpbWVvdXQsXG4gICAgYXZkUmVhZHlUaW1lb3V0OiByZWFkeVRpbWVvdXQsXG4gIH0gPSBvcHRzO1xuICBpZiAoIWF2ZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGxhdW5jaCBBVkQgd2l0aG91dCBBVkQgbmFtZScpO1xuICB9XG5cbiAgY29uc3QgYXZkTmFtZSA9IGF2ZC5yZXBsYWNlKCdAJywgJycpO1xuICBjb25zdCBydW5uaW5nQVZEID0gYXdhaXQgYWRiLmdldFJ1bm5pbmdBVkRXaXRoUmV0cnkoYXZkTmFtZSk7XG4gIGNvbnN0IGFyZ3MgPSBwcmVwYXJlQXZkQXJncyhhZGIsIG9wdHMpO1xuICBpZiAocnVubmluZ0FWRCkge1xuICAgIGlmIChhcmdzLmluY2x1ZGVzKCctd2lwZS1kYXRhJykpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgS2lsbGluZyAnJHthdmROYW1lfScgYmVjYXVzZSBpdCBuZWVkcyB0byBiZSB3aXBlZCBhdCBzdGFydC5gKTtcbiAgICAgIGF3YWl0IGFkYi5raWxsRW11bGF0b3IoYXZkTmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnTm90IGxhdW5jaGluZyBBVkQgYmVjYXVzZSBpdCBpcyBhbHJlYWR5IHJ1bm5pbmcuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG4gIGF3YWl0IGFkYi5sYXVuY2hBVkQoYXZkLCB7XG4gICAgYXJncyxcbiAgICBlbnYsXG4gICAgbGFuZ3VhZ2UsXG4gICAgY291bnRyeSxcbiAgICBsYXVuY2hUaW1lb3V0LFxuICAgIHJlYWR5VGltZW91dCxcbiAgfSk7XG59O1xuXG4vKipcbiAqIFNldCBhbmQgZW5zdXJlIHRoZSBsb2NhbGUgbmFtZSBvZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGFkYiAtIFRoZSBhZGIgbW9kdWxlIGluc3RhbmNlLlxuICogQHBhcmFtIHtzdHJpbmd9IGxhbmd1YWdlIC0gTGFuZ3VhZ2UuIFRoZSBsYW5ndWFnZSBmaWVsZCBpcyBjYXNlIGluc2Vuc2l0aXZlLCBidXQgTG9jYWxlIGFsd2F5cyBjYW5vbmljYWxpemVzIHRvIGxvd2VyIGNhc2UuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6IFthLXpBLVpdezIsOH0uIGUuZy4gZW4sIGphIDogaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2phdmEvdXRpbC9Mb2NhbGUuaHRtbFxuICogQHBhcmFtIHtzdHJpbmd9IGNvdW50cnkgLSBDb3VudHJ5LiBUaGUgY291bnRyeSAocmVnaW9uKSBmaWVsZCBpcyBjYXNlIGluc2Vuc2l0aXZlLCBidXQgTG9jYWxlIGFsd2F5cyBjYW5vbmljYWxpemVzIHRvIHVwcGVyIGNhc2UuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6IFthLXpBLVpdezJ9IHwgWzAtOV17M30uIGUuZy4gVVMsIEpQIDogaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2phdmEvdXRpbC9Mb2NhbGUuaHRtbFxuICogQHBhcmFtIHs/c3RyaW5nfSBzY3JpcHQgLSBTY3JpcHQuIFRoZSBzY3JpcHQgZmllbGQgaXMgY2FzZSBpbnNlbnNpdGl2ZSBidXQgTG9jYWxlIGFsd2F5cyBjYW5vbmljYWxpemVzIHRvIHRpdGxlIGNhc2UuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6IFthLXpBLVpdezR9LiBlLmcuIEhhbnMgaW4gemgtSGFucy1DTiA6IGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9qYXZhL3V0aWwvTG9jYWxlLmh0bWxcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBpdCBmYWlsZWQgdG8gc2V0IGxvY2FsZSBwcm9wZXJseVxuICovXG5oZWxwZXJzLmVuc3VyZURldmljZUxvY2FsZSA9IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZURldmljZUxvY2FsZSAoYWRiLCBsYW5ndWFnZSwgY291bnRyeSwgc2NyaXB0ID0gbnVsbCkge1xuICBpZiAoIV8uaXNTdHJpbmcobGFuZ3VhZ2UpICYmICFfLmlzU3RyaW5nKGNvdW50cnkpKSB7XG4gICAgbG9nZ2VyLndhcm4oYHNldERldmljZUxhbmd1YWdlQ291bnRyeSByZXF1aXJlcyBsYW5ndWFnZSBvciBjb3VudHJ5LmApO1xuICAgIGxvZ2dlci53YXJuKGBHb3QgbGFuZ3VhZ2U6ICcke2xhbmd1YWdlfScgYW5kIGNvdW50cnk6ICcke2NvdW50cnl9J2ApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IGFkYi5zZXREZXZpY2VMYW5ndWFnZUNvdW50cnkobGFuZ3VhZ2UsIGNvdW50cnksIHNjcmlwdCk7XG5cbiAgaWYgKCFhd2FpdCBhZGIuZW5zdXJlQ3VycmVudExvY2FsZShsYW5ndWFnZSwgY291bnRyeSwgc2NyaXB0KSkge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBzY3JpcHQgPyBgbGFuZ3VhZ2U6ICR7bGFuZ3VhZ2V9LCBjb3VudHJ5OiAke2NvdW50cnl9IGFuZCBzY3JpcHQ6ICR7c2NyaXB0fWAgOiBgbGFuZ3VhZ2U6ICR7bGFuZ3VhZ2V9IGFuZCBjb3VudHJ5OiAke2NvdW50cnl9YDtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBzZXQgJHttZXNzYWdlfWApO1xuICB9XG59O1xuXG5oZWxwZXJzLmdldERldmljZUluZm9Gcm9tQ2FwcyA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZUluZm9Gcm9tQ2FwcyAob3B0cyA9IHt9KSB7XG4gIC8vIHdlIGNhbiBjcmVhdGUgYSB0aHJvd2F3YXkgQURCIGluc3RhbmNlIGhlcmUsIHNvIHRoZXJlIGlzIG5vIGRlcGVuZGVuY3lcbiAgLy8gb24gaW5zdGFudGlhdGluZyBvbiBlYXJsaWVyIChhdCB0aGlzIHBvaW50LCB3ZSBoYXZlIG5vIHVkaWQpXG4gIC8vIHdlIGNhbiBvbmx5IHVzZSB0aGlzIEFEQiBvYmplY3QgZm9yIGNvbW1hbmRzIHRoYXQgd291bGQgbm90IGJlIGNvbmZ1c2VkXG4gIC8vIGlmIG11bHRpcGxlIGRldmljZXMgYXJlIGNvbm5lY3RlZFxuICBjb25zdCBhZGIgPSBhd2FpdCBoZWxwZXJzLmNyZWF0ZUJhc2VBREIob3B0cyk7XG4gIGxldCB1ZGlkID0gb3B0cy51ZGlkO1xuICBsZXQgZW1Qb3J0ID0gbnVsbDtcblxuICAvLyBhIHNwZWNpZmljIGF2ZCBuYW1lIHdhcyBnaXZlbi4gdHJ5IHRvIGluaXRpYWxpemUgd2l0aCB0aGF0XG4gIGlmIChvcHRzLmF2ZCkge1xuICAgIGF3YWl0IGhlbHBlcnMucHJlcGFyZUVtdWxhdG9yKGFkYiwgb3B0cyk7XG4gICAgdWRpZCA9IGFkYi5jdXJEZXZpY2VJZDtcbiAgICBlbVBvcnQgPSBhZGIuZW11bGF0b3JQb3J0O1xuICB9IGVsc2Uge1xuICAgIC8vIG5vIGF2ZCBnaXZlbi4gbGV0cyB0cnkgd2hhdGV2ZXIncyBwbHVnZ2VkIGluIGRldmljZXMvZW11bGF0b3JzXG4gICAgbG9nZ2VyLmluZm8oJ1JldHJpZXZpbmcgZGV2aWNlIGxpc3QnKTtcbiAgICBsZXQgZGV2aWNlcyA9IGF3YWl0IGFkYi5nZXREZXZpY2VzV2l0aFJldHJ5KCk7XG5cbiAgICAvLyB1ZGlkIHdhcyBnaXZlbiwgbGV0cyB0cnkgdG8gaW5pdCB3aXRoIHRoYXQgZGV2aWNlXG4gICAgaWYgKHVkaWQpIHtcbiAgICAgIGlmICghXy5pbmNsdWRlcyhfLm1hcChkZXZpY2VzLCAndWRpZCcpLCB1ZGlkKSkge1xuICAgICAgICBsb2dnZXIuZXJyb3JBbmRUaHJvdyhgRGV2aWNlICR7dWRpZH0gd2FzIG5vdCBpbiB0aGUgbGlzdCBvZiBjb25uZWN0ZWQgZGV2aWNlc2ApO1xuICAgICAgfVxuICAgICAgZW1Qb3J0ID0gYWRiLmdldFBvcnRGcm9tRW11bGF0b3JTdHJpbmcodWRpZCk7XG4gICAgfSBlbHNlIGlmIChvcHRzLnBsYXRmb3JtVmVyc2lvbikge1xuICAgICAgb3B0cy5wbGF0Zm9ybVZlcnNpb24gPSBgJHtvcHRzLnBsYXRmb3JtVmVyc2lvbn1gLnRyaW0oKTtcblxuICAgICAgLy8gYSBwbGF0Zm9ybSB2ZXJzaW9uIHdhcyBnaXZlbi4gbGV0cyB0cnkgdG8gZmluZCBhIGRldmljZSB3aXRoIHRoZSBzYW1lIG9zXG4gICAgICBjb25zdCBwbGF0Zm9ybVZlcnNpb24gPSBzZW12ZXIuY29lcmNlKG9wdHMucGxhdGZvcm1WZXJzaW9uKSB8fCBvcHRzLnBsYXRmb3JtVmVyc2lvbjtcbiAgICAgIGxvZ2dlci5pbmZvKGBMb29raW5nIGZvciBhIGRldmljZSB3aXRoIEFuZHJvaWQgJyR7cGxhdGZvcm1WZXJzaW9ufSdgKTtcblxuICAgICAgLy8gaW4gY2FzZSB3ZSBmYWlsIHRvIGZpbmQgc29tZXRoaW5nLCBnaXZlIHRoZSB1c2VyIGEgdXNlZnVsIGxvZyB0aGF0IGhhc1xuICAgICAgLy8gdGhlIGRldmljZSB1ZGlkcyBhbmQgb3MgdmVyc2lvbnMgc28gdGhleSBrbm93IHdoYXQncyBhdmFpbGFibGVcbiAgICAgIGNvbnN0IGF2YWlsRGV2aWNlcyA9IFtdO1xuICAgICAgbGV0IHBhcnRpYWxNYXRjaENhbmRpZGF0ZSA9IG51bGw7XG4gICAgICAvLyBmaXJzdCB0cnkgc3RhcnRlZCBkZXZpY2VzL2VtdWxhdG9yc1xuICAgICAgZm9yIChjb25zdCBkZXZpY2Ugb2YgZGV2aWNlcykge1xuICAgICAgICAvLyBkaXJlY3QgYWRiIGNhbGxzIHRvIHRoZSBzcGVjaWZpYyBkZXZpY2VcbiAgICAgICAgYXdhaXQgYWRiLnNldERldmljZUlkKGRldmljZS51ZGlkKTtcbiAgICAgICAgY29uc3QgcmF3RGV2aWNlT1MgPSBhd2FpdCBhZGIuZ2V0UGxhdGZvcm1WZXJzaW9uKCk7XG4gICAgICAgIC8vIFRoZSBkZXZpY2UgT1MgY291bGQgZWl0aGVyIGJlIGEgbnVtYmVyLCBsaWtlIGA2LjBgXG4gICAgICAgIC8vIG9yIGFuIGFiYnJldmlhdGlvbiwgbGlrZSBgUmBcbiAgICAgICAgYXZhaWxEZXZpY2VzLnB1c2goYCR7ZGV2aWNlLnVkaWR9ICgke3Jhd0RldmljZU9TfSlgKTtcbiAgICAgICAgY29uc3QgZGV2aWNlT1MgPSBzZW12ZXIuY29lcmNlKHJhd0RldmljZU9TKSB8fCByYXdEZXZpY2VPUztcbiAgICAgICAgaWYgKCFkZXZpY2VPUykge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYm90aFZlcnNpb25zQ2FuQmVDb2VyY2VkID0gc2VtdmVyLnZhbGlkKGRldmljZU9TKSAmJiBzZW12ZXIudmFsaWQocGxhdGZvcm1WZXJzaW9uKTtcbiAgICAgICAgY29uc3QgYm90aFZlcnNpb25zQXJlU3RyaW5ncyA9IF8uaXNTdHJpbmcoZGV2aWNlT1MpICYmIF8uaXNTdHJpbmcocGxhdGZvcm1WZXJzaW9uKTtcbiAgICAgICAgaWYgKGJvdGhWZXJzaW9uc0NhbkJlQ29lcmNlZCAmJiBkZXZpY2VPUy52ZXJzaW9uID09PSBwbGF0Zm9ybVZlcnNpb24udmVyc2lvblxuICAgICAgICAgICAgfHwgYm90aFZlcnNpb25zQXJlU3RyaW5ncyAmJiBfLnRvTG93ZXIoZGV2aWNlT1MpID09PSBfLnRvTG93ZXIocGxhdGZvcm1WZXJzaW9uKSkge1xuICAgICAgICAgIC8vIEdvdCBhbiBleGFjdCBtYXRjaCAtIHByb2NlZWQgaW1tZWRpYXRlbHlcbiAgICAgICAgICB1ZGlkID0gZGV2aWNlLnVkaWQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSBpZiAoIWJvdGhWZXJzaW9uc0NhbkJlQ29lcmNlZCkge1xuICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIHBvaW50IHRvIGNoZWNrIGZvciBwYXJ0aWFsIG1hdGNoIGlmIGVpdGhlciBvZiB2ZXJzaW9uIG51bWJlcnMgaXMgbm90IGNvZXJjaWJsZVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCghXy5pbmNsdWRlcyhvcHRzLnBsYXRmb3JtVmVyc2lvbiwgJy4nKSAmJiBwbGF0Zm9ybVZlcnNpb24ubWFqb3IgPT09IGRldmljZU9TLm1ham9yXG4gICAgICAgICAgICB8fCBwbGF0Zm9ybVZlcnNpb24ubWFqb3IgPT09IGRldmljZU9TLm1ham9yICYmIHBsYXRmb3JtVmVyc2lvbi5taW5vciA9PT0gZGV2aWNlT1MubWlub3IpXG4gICAgICAgICAgICAvLyBHb3QgYSBwYXJ0aWFsIG1hdGNoIC0gbWFrZSBzdXJlIHdlIGNvbnNpZGVyIHRoZSBtb3N0IHJlY2VudFxuICAgICAgICAgICAgLy8gZGV2aWNlIHZlcnNpb24gYXZhaWxhYmxlIG9uIHRoZSBob3N0IHN5c3RlbVxuICAgICAgICAgICAgJiYgKHBhcnRpYWxNYXRjaENhbmRpZGF0ZSAmJiBzZW12ZXIuZ3QoZGV2aWNlT1MsIF8udmFsdWVzKHBhcnRpYWxNYXRjaENhbmRpZGF0ZSlbMF0pXG4gICAgICAgICAgICAgICAgfHwgIXBhcnRpYWxNYXRjaENhbmRpZGF0ZSkpIHtcbiAgICAgICAgICBwYXJ0aWFsTWF0Y2hDYW5kaWRhdGUgPSB7W2RldmljZS51ZGlkXTogZGV2aWNlT1N9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIXVkaWQgJiYgcGFydGlhbE1hdGNoQ2FuZGlkYXRlKSB7XG4gICAgICAgIHVkaWQgPSBfLmtleXMocGFydGlhbE1hdGNoQ2FuZGlkYXRlKVswXTtcbiAgICAgICAgYXdhaXQgYWRiLnNldERldmljZUlkKHVkaWQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXVkaWQpIHtcbiAgICAgICAgLy8gd2UgY291bGRuJ3QgZmluZCBhbnl0aGluZyEgcXVpdFxuICAgICAgICBsb2dnZXIuZXJyb3JBbmRUaHJvdyhgVW5hYmxlIHRvIGZpbmQgYW4gYWN0aXZlIGRldmljZSBvciBlbXVsYXRvciBgICtcbiAgICAgICAgICBgd2l0aCBPUyAke29wdHMucGxhdGZvcm1WZXJzaW9ufS4gVGhlIGZvbGxvd2luZyBhcmUgYXZhaWxhYmxlOiBgICtcbiAgICAgICAgICBhdmFpbERldmljZXMuam9pbignLCAnKSk7XG4gICAgICB9XG5cbiAgICAgIGVtUG9ydCA9IGFkYi5nZXRQb3J0RnJvbUVtdWxhdG9yU3RyaW5nKHVkaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBhIHVkaWQgd2FzIG5vdCBnaXZlbiwgZ3JhYiB0aGUgZmlyc3QgZGV2aWNlIHdlIHNlZVxuICAgICAgdWRpZCA9IGRldmljZXNbMF0udWRpZDtcbiAgICAgIGVtUG9ydCA9IGFkYi5nZXRQb3J0RnJvbUVtdWxhdG9yU3RyaW5nKHVkaWQpO1xuICAgIH1cbiAgfVxuXG4gIGxvZ2dlci5pbmZvKGBVc2luZyBkZXZpY2U6ICR7dWRpZH1gKTtcbiAgcmV0dXJuIHt1ZGlkLCBlbVBvcnR9O1xufTtcblxuLy8gcmV0dXJucyBhIG5ldyBhZGIgaW5zdGFuY2Ugd2l0aCBkZXZpY2VJZCBzZXRcbmhlbHBlcnMuY3JlYXRlQURCID0gYXN5bmMgZnVuY3Rpb24gY3JlYXRlQURCIChvcHRzID0ge30pIHtcbiAgY29uc3Qge3VkaWQsIGVtUG9ydH0gPSBvcHRzO1xuICBjb25zdCBhZGIgPSBhd2FpdCBoZWxwZXJzLmNyZWF0ZUJhc2VBREIob3B0cyk7XG4gIGFkYi5zZXREZXZpY2VJZCh1ZGlkKTtcbiAgaWYgKGVtUG9ydCkge1xuICAgIGFkYi5zZXRFbXVsYXRvclBvcnQoZW1Qb3J0KTtcbiAgfVxuXG4gIHJldHVybiBhZGI7XG59O1xuXG5oZWxwZXJzLnZhbGlkYXRlUGFja2FnZUFjdGl2aXR5TmFtZXMgPSBmdW5jdGlvbiB2YWxpZGF0ZVBhY2thZ2VBY3Rpdml0eU5hbWVzIChvcHRzKSB7XG4gIGZvciAoY29uc3Qga2V5IG9mIFsnYXBwUGFja2FnZScsICdhcHBBY3Rpdml0eScsICdhcHBXYWl0UGFja2FnZScsICdhcHBXYWl0QWN0aXZpdHknXSkge1xuICAgIGNvbnN0IG5hbWUgPSBvcHRzW2tleV07XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXRjaCA9IC8oW15cXHcuKixdKSsvLmV4ZWMobmFtZSk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgbG9nZ2VyLndhcm4oYENhcGFiaWxpdHkgJyR7a2V5fScgaXMgZXhwZWN0ZWQgdG8gb25seSBpbmNsdWRlIGxhdGluIGxldHRlcnMsIGRpZ2l0cywgdW5kZXJzY29yZSwgZG90LCBjb21tYSBhbmQgYXN0ZXJpc2sgY2hhcmFjdGVycy5gKTtcbiAgICBsb2dnZXIud2FybihgQ3VycmVudCB2YWx1ZSAnJHtuYW1lfScgaGFzIG5vbi1tYXRjaGluZyBjaGFyYWN0ZXIgYXQgaW5kZXggJHttYXRjaC5pbmRleH06ICcke25hbWUuc3Vic3RyaW5nKDAsIG1hdGNoLmluZGV4ICsgMSl9J2ApO1xuICB9XG59O1xuXG5oZWxwZXJzLmdldExhdW5jaEluZm8gPSBhc3luYyBmdW5jdGlvbiBnZXRMYXVuY2hJbmZvIChhZGIsIG9wdHMpIHtcbiAgbGV0IHthcHAsIGFwcFBhY2thZ2UsIGFwcEFjdGl2aXR5LCBhcHBXYWl0UGFja2FnZSwgYXBwV2FpdEFjdGl2aXR5fSA9IG9wdHM7XG4gIGlmICghYXBwKSB7XG4gICAgbG9nZ2VyLndhcm4oJ05vIGFwcCBzZW50IGluLCBub3QgcGFyc2luZyBwYWNrYWdlL2FjdGl2aXR5Jyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhpcy52YWxpZGF0ZVBhY2thZ2VBY3Rpdml0eU5hbWVzKG9wdHMpO1xuXG4gIGlmIChhcHBQYWNrYWdlICYmIGFwcEFjdGl2aXR5KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbG9nZ2VyLmRlYnVnKCdQYXJzaW5nIHBhY2thZ2UgYW5kIGFjdGl2aXR5IGZyb20gYXBwIG1hbmlmZXN0Jyk7XG4gIGxldCB7YXBrUGFja2FnZSwgYXBrQWN0aXZpdHl9ID1cbiAgICBhd2FpdCBhZGIucGFja2FnZUFuZExhdW5jaEFjdGl2aXR5RnJvbU1hbmlmZXN0KGFwcCk7XG4gIGlmIChhcGtQYWNrYWdlICYmICFhcHBQYWNrYWdlKSB7XG4gICAgYXBwUGFja2FnZSA9IGFwa1BhY2thZ2U7XG4gIH1cbiAgaWYgKCFhcHBXYWl0UGFja2FnZSkge1xuICAgIGFwcFdhaXRQYWNrYWdlID0gYXBwUGFja2FnZTtcbiAgfVxuICBpZiAoYXBrQWN0aXZpdHkgJiYgIWFwcEFjdGl2aXR5KSB7XG4gICAgYXBwQWN0aXZpdHkgPSBhcGtBY3Rpdml0eTtcbiAgfVxuICBpZiAoIWFwcFdhaXRBY3Rpdml0eSkge1xuICAgIGFwcFdhaXRBY3Rpdml0eSA9IGFwcEFjdGl2aXR5O1xuICB9XG4gIGxvZ2dlci5kZWJ1ZyhgUGFyc2VkIHBhY2thZ2UgYW5kIGFjdGl2aXR5IGFyZTogJHthcGtQYWNrYWdlfS8ke2Fwa0FjdGl2aXR5fWApO1xuICByZXR1cm4ge2FwcFBhY2thZ2UsIGFwcFdhaXRQYWNrYWdlLCBhcHBBY3Rpdml0eSwgYXBwV2FpdEFjdGl2aXR5fTtcbn07XG5cbmhlbHBlcnMucmVzZXRBcHAgPSBhc3luYyBmdW5jdGlvbiByZXNldEFwcCAoYWRiLCBvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBhcHBQYWNrYWdlLFxuICAgIGZhc3RSZXNldCxcbiAgICBmdWxsUmVzZXQsXG4gICAgYW5kcm9pZEluc3RhbGxUaW1lb3V0ID0gUEFDS0FHRV9JTlNUQUxMX1RJTUVPVVQsXG4gICAgYXV0b0dyYW50UGVybWlzc2lvbnMsXG4gICAgYWxsb3dUZXN0UGFja2FnZXNcbiAgfSA9IG9wdHM7XG5cbiAgaWYgKCFhcHBQYWNrYWdlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiJ2FwcFBhY2thZ2UnIG9wdGlvbiBpcyByZXF1aXJlZFwiKTtcbiAgfVxuXG4gIGNvbnN0IGlzSW5zdGFsbGVkID0gYXdhaXQgYWRiLmlzQXBwSW5zdGFsbGVkKGFwcFBhY2thZ2UpO1xuXG4gIGlmIChpc0luc3RhbGxlZCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBhZGIuZm9yY2VTdG9wKGFwcFBhY2thZ2UpO1xuICAgIH0gY2F0Y2ggKGlnbikge31cbiAgICAvLyBmdWxsUmVzZXQgaGFzIHByaW9yaXR5IG92ZXIgZmFzdFJlc2V0XG4gICAgaWYgKCFmdWxsUmVzZXQgJiYgZmFzdFJlc2V0KSB7XG4gICAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCBhZGIuY2xlYXIoYXBwUGFja2FnZSk7XG4gICAgICBpZiAoXy5pc1N0cmluZyhvdXRwdXQpICYmIG91dHB1dC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdmYWlsZWQnKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjbGVhciB0aGUgYXBwbGljYXRpb24gZGF0YSBvZiAnJHthcHBQYWNrYWdlfScuIE9yaWdpbmFsIGVycm9yOiAke291dHB1dH1gKTtcbiAgICAgIH1cbiAgICAgIC8vIGV4ZWN1dGluZyBgc2hlbGwgcG0gY2xlYXJgIHJlc2V0cyBwcmV2aW91c2x5IGFzc2lnbmVkIGFwcGxpY2F0aW9uIHBlcm1pc3Npb25zIGFzIHdlbGxcbiAgICAgIGlmIChhdXRvR3JhbnRQZXJtaXNzaW9ucykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGFkYi5ncmFudEFsbFBlcm1pc3Npb25zKGFwcFBhY2thZ2UpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcihgVW5hYmxlIHRvIGdyYW50IHBlcm1pc3Npb25zIHJlcXVlc3RlZC4gT3JpZ2luYWwgZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbG9nZ2VyLmRlYnVnKGBQZXJmb3JtZWQgZmFzdCByZXNldCBvbiB0aGUgaW5zdGFsbGVkICcke2FwcFBhY2thZ2V9JyBhcHBsaWNhdGlvbiAoc3RvcCBhbmQgY2xlYXIpYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaWYgKCFhcHApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCInYXBwJyBvcHRpb24gaXMgcmVxdWlyZWQgZm9yIHJlaW5zdGFsbFwiKTtcbiAgfVxuXG4gIGxvZ2dlci5kZWJ1ZyhgUnVubmluZyBmdWxsIHJlc2V0IG9uICcke2FwcFBhY2thZ2V9JyAocmVpbnN0YWxsKWApO1xuICBpZiAoaXNJbnN0YWxsZWQpIHtcbiAgICBhd2FpdCBhZGIudW5pbnN0YWxsQXBrKGFwcFBhY2thZ2UpO1xuICB9XG4gIGF3YWl0IGFkYi5pbnN0YWxsKGFwcCwge1xuICAgIGdyYW50UGVybWlzc2lvbnM6IGF1dG9HcmFudFBlcm1pc3Npb25zLFxuICAgIHRpbWVvdXQ6IGFuZHJvaWRJbnN0YWxsVGltZW91dCxcbiAgICBhbGxvd1Rlc3RQYWNrYWdlcyxcbiAgfSk7XG59O1xuXG5oZWxwZXJzLmluc3RhbGxBcGsgPSBhc3luYyBmdW5jdGlvbiBpbnN0YWxsQXBrIChhZGIsIG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGFwcFBhY2thZ2UsXG4gICAgZmFzdFJlc2V0LFxuICAgIGZ1bGxSZXNldCxcbiAgICBhbmRyb2lkSW5zdGFsbFRpbWVvdXQgPSBQQUNLQUdFX0lOU1RBTExfVElNRU9VVCxcbiAgICBhdXRvR3JhbnRQZXJtaXNzaW9ucyxcbiAgICBhbGxvd1Rlc3RQYWNrYWdlcyxcbiAgICBlbmZvcmNlQXBwSW5zdGFsbCxcbiAgfSA9IG9wdHM7XG5cbiAgaWYgKCFhcHAgfHwgIWFwcFBhY2thZ2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCInYXBwJyBhbmQgJ2FwcFBhY2thZ2UnIG9wdGlvbnMgYXJlIHJlcXVpcmVkXCIpO1xuICB9XG5cbiAgaWYgKGZ1bGxSZXNldCkge1xuICAgIGF3YWl0IHRoaXMucmVzZXRBcHAoYWRiLCBvcHRzKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB7XG4gICAgYXBwU3RhdGUsXG4gICAgd2FzVW5pbnN0YWxsZWRcbiAgfSA9IGF3YWl0IGFkYi5pbnN0YWxsT3JVcGdyYWRlKGFwcCwgYXBwUGFja2FnZSwge1xuICAgIGdyYW50UGVybWlzc2lvbnM6IGF1dG9HcmFudFBlcm1pc3Npb25zLFxuICAgIHRpbWVvdXQ6IGFuZHJvaWRJbnN0YWxsVGltZW91dCxcbiAgICBhbGxvd1Rlc3RQYWNrYWdlcyxcbiAgICBlbmZvcmNlQ3VycmVudEJ1aWxkOiBlbmZvcmNlQXBwSW5zdGFsbCxcbiAgfSk7XG5cbiAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXNldCB0aGUgbmV3bHkgaW5zdGFsbGVkIGFwcFxuICBjb25zdCBpc0luc3RhbGxlZE92ZXJFeGlzdGluZ0FwcCA9ICF3YXNVbmluc3RhbGxlZFxuICAgICYmIGFwcFN0YXRlICE9PSBhZGIuQVBQX0lOU1RBTExfU1RBVEUuTk9UX0lOU1RBTExFRDtcbiAgaWYgKGZhc3RSZXNldCAmJiBpc0luc3RhbGxlZE92ZXJFeGlzdGluZ0FwcCkge1xuICAgIGxvZ2dlci5pbmZvKGBQZXJmb3JtaW5nIGZhc3QgcmVzZXQgb24gJyR7YXBwUGFja2FnZX0nYCk7XG4gICAgYXdhaXQgdGhpcy5yZXNldEFwcChhZGIsIG9wdHMpO1xuICB9XG59O1xuXG4vKipcbiAqIEluc3RhbGxzIGFuIGFycmF5IG9mIGFwa3NcbiAqIEBwYXJhbSB7QURCfSBhZGIgSW5zdGFuY2Ugb2YgQXBwaXVtIEFEQiBvYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIE9wdHMgZGVmaW5lZCBpbiBkcml2ZXIuanNcbiAqL1xuaGVscGVycy5pbnN0YWxsT3RoZXJBcGtzID0gYXN5bmMgZnVuY3Rpb24gaW5zdGFsbE90aGVyQXBrcyAob3RoZXJBcHBzLCBhZGIsIG9wdHMpIHtcbiAgbGV0IHtcbiAgICBhbmRyb2lkSW5zdGFsbFRpbWVvdXQgPSBQQUNLQUdFX0lOU1RBTExfVElNRU9VVCxcbiAgICBhdXRvR3JhbnRQZXJtaXNzaW9ucyxcbiAgICBhbGxvd1Rlc3RQYWNrYWdlc1xuICB9ID0gb3B0cztcblxuICAvLyBJbnN0YWxsIGFsbCBvZiB0aGUgQVBLJ3MgYXN5bmNocm9ub3VzbHlcbiAgYXdhaXQgQi5hbGwob3RoZXJBcHBzLm1hcCgob3RoZXJBcHApID0+IHtcbiAgICBsb2dnZXIuZGVidWcoYEluc3RhbGxpbmcgYXBwOiAke290aGVyQXBwfWApO1xuICAgIHJldHVybiBhZGIuaW5zdGFsbE9yVXBncmFkZShvdGhlckFwcCwgbnVsbCwge1xuICAgICAgZ3JhbnRQZXJtaXNzaW9uczogYXV0b0dyYW50UGVybWlzc2lvbnMsXG4gICAgICB0aW1lb3V0OiBhbmRyb2lkSW5zdGFsbFRpbWVvdXQsXG4gICAgICBhbGxvd1Rlc3RQYWNrYWdlcyxcbiAgICB9KTtcbiAgfSkpO1xufTtcblxuLyoqXG4gKiBVbmluc3RhbGwgYW4gYXJyYXkgb2YgcGFja2FnZXNcbiAqIEBwYXJhbSB7QURCfSBhZGIgSW5zdGFuY2Ugb2YgQXBwaXVtIEFEQiBvYmplY3RcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gYXBwUGFja2FnZXMgQW4gYXJyYXkgb2YgcGFja2FnZSBuYW1lcyB0byB1bmluc3RhbGwuIElmIHRoaXMgaW5jbHVkZXMgYCcqJ2AsIHVuaW5zdGFsbCBhbGwgb2YgM3JkIHBhcnR5IGFwcHNcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gZmlsdGVyUGFja2FnZXMgQW4gYXJyYXkgb2YgcGFja2FnZXMgZG9lcyBub3QgdW5pbnN0YWxsIHdoZW4gYCpgIGlzIHByb3ZpZGVkIGFzIGBhcHBQYWNrYWdlc2BcbiAqL1xuaGVscGVycy51bmluc3RhbGxPdGhlclBhY2thZ2VzID0gYXN5bmMgZnVuY3Rpb24gdW5pbnN0YWxsT3RoZXJQYWNrYWdlcyAoYWRiLCBhcHBQYWNrYWdlcywgZmlsdGVyUGFja2FnZXMgPSBbXSkge1xuICBpZiAoYXBwUGFja2FnZXMuaW5jbHVkZXMoJyonKSkge1xuICAgIGxvZ2dlci5kZWJ1ZygnVW5pbnN0YWxsIHRoaXJkIHBhcnR5IHBhY2thZ2VzJyk7XG4gICAgYXBwUGFja2FnZXMgPSBhd2FpdCB0aGlzLmdldFRoaXJkUGFydHlQYWNrYWdlcyhhZGIsIGZpbHRlclBhY2thZ2VzKTtcbiAgfVxuXG4gIGxvZ2dlci5kZWJ1ZyhgVW5pbnN0YWxsaW5nIHBhY2thZ2VzOiAke2FwcFBhY2thZ2VzfWApO1xuICBhd2FpdCBCLmFsbChhcHBQYWNrYWdlcy5tYXAoKGFwcFBhY2thZ2UpID0+IGFkYi51bmluc3RhbGxBcGsoYXBwUGFja2FnZSkpKTtcbn07XG5cbi8qKlxuICogR2V0IHRoaXJkIHBhcnR5IHBhY2thZ2VzIGZpbHRlcmVkIHdpdGggYGZpbHRlclBhY2thZ2VzYFxuICogQHBhcmFtIHtBREJ9IGFkYiBJbnN0YW5jZSBvZiBBcHBpdW0gQURCIG9iamVjdFxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBmaWx0ZXJQYWNrYWdlcyBBbiBhcnJheSBvZiBwYWNrYWdlcyBkb2VzIG5vdCB1bmluc3RhbGwgd2hlbiBgKmAgaXMgcHJvdmlkZWQgYXMgYGFwcFBhY2thZ2VzYFxuICogQHJldHVybnMge0FycmF5PHN0cmluZz59IEFuIGFycmF5IG9mIGluc3RhbGxlZCB0aGlyZCBwYXJ5IHBhY2thZ2VzXG4gKi9cbmhlbHBlcnMuZ2V0VGhpcmRQYXJ0eVBhY2thZ2VzID0gYXN5bmMgZnVuY3Rpb24gZ2V0VGhpcmRQYXJ0eVBhY2thZ2VzIChhZGIsIGZpbHRlclBhY2thZ2VzID0gW10pIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYWNrYWdlc1N0cmluZyA9IGF3YWl0IGFkYi5zaGVsbChbJ3BtJywgJ2xpc3QnLCAncGFja2FnZXMnLCAnLTMnXSk7XG4gICAgY29uc3QgYXBwUGFja2FnZXNBcnJheSA9IHBhY2thZ2VzU3RyaW5nLnRyaW0oKS5yZXBsYWNlKC9wYWNrYWdlOi9nLCAnJykuc3BsaXQoRU9MKTtcbiAgICBsb2dnZXIuZGVidWcoYCcke2FwcFBhY2thZ2VzQXJyYXl9JyBmaWx0ZXJlZCB3aXRoICcke2ZpbHRlclBhY2thZ2VzfSdgKTtcbiAgICByZXR1cm4gXy5kaWZmZXJlbmNlKGFwcFBhY2thZ2VzQXJyYXksIGZpbHRlclBhY2thZ2VzKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oYFVuYWJsZSB0byBnZXQgcGFja2FnZXMgd2l0aCAnYWRiIHNoZWxsIHBtIGxpc3QgcGFja2FnZXMgLTMnOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIHJldHVybiBbXTtcbiAgfVxufTtcblxuaGVscGVycy5pbml0VW5pY29kZUtleWJvYXJkID0gYXN5bmMgZnVuY3Rpb24gaW5pdFVuaWNvZGVLZXlib2FyZCAoYWRiKSB7XG4gIGxvZ2dlci5kZWJ1ZygnRW5hYmxpbmcgVW5pY29kZSBrZXlib2FyZCBzdXBwb3J0Jyk7XG5cbiAgLy8gZ2V0IHRoZSBkZWZhdWx0IElNRSBzbyB3ZSBjYW4gcmV0dXJuIGJhY2sgdG8gaXQgbGF0ZXIgaWYgd2Ugd2FudFxuICBsZXQgZGVmYXVsdElNRSA9IGF3YWl0IGFkYi5kZWZhdWx0SU1FKCk7XG5cbiAgbG9nZ2VyLmRlYnVnKGBVbnNldHRpbmcgcHJldmlvdXMgSU1FICR7ZGVmYXVsdElNRX1gKTtcbiAgY29uc3QgYXBwaXVtSU1FID0gYCR7U0VUVElOR1NfSEVMUEVSX1BLR19JRH0vLlVuaWNvZGVJTUVgO1xuICBsb2dnZXIuZGVidWcoYFNldHRpbmcgSU1FIHRvICcke2FwcGl1bUlNRX0nYCk7XG4gIGF3YWl0IGFkYi5lbmFibGVJTUUoYXBwaXVtSU1FKTtcbiAgYXdhaXQgYWRiLnNldElNRShhcHBpdW1JTUUpO1xuICByZXR1cm4gZGVmYXVsdElNRTtcbn07XG5cbmhlbHBlcnMuc2V0TW9ja0xvY2F0aW9uQXBwID0gYXN5bmMgZnVuY3Rpb24gc2V0TW9ja0xvY2F0aW9uQXBwIChhZGIsIGFwcCkge1xuICB0cnkge1xuICAgIGlmIChhd2FpdCBhZGIuZ2V0QXBpTGV2ZWwoKSA8IDIzKSB7XG4gICAgICBhd2FpdCBhZGIuc2hlbGwoWydzZXR0aW5ncycsICdwdXQnLCAnc2VjdXJlJywgJ21vY2tfbG9jYXRpb24nLCAnMSddKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgYWRiLnNoZWxsKFsnYXBwb3BzJywgJ3NldCcsIGFwcCwgJ2FuZHJvaWQ6bW9ja19sb2NhdGlvbicsICdhbGxvdyddKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKGBVbmFibGUgdG8gc2V0IG1vY2sgbG9jYXRpb24gZm9yIGFwcCAnJHthcHB9JzogJHtlcnIubWVzc2FnZX1gKTtcbiAgICByZXR1cm47XG4gIH1cbiAgdHJ5IHtcbiAgICBsZXQgcGtnSWRzID0gW107XG4gICAgaWYgKGF3YWl0IGFkYi5maWxlRXhpc3RzKE1PQ0tfQVBQX0lEU19TVE9SRSkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHBrZ0lkcyA9IEpTT04ucGFyc2UoYXdhaXQgYWRiLnNoZWxsKFsnY2F0JywgTU9DS19BUFBfSURTX1NUT1JFXSkpO1xuICAgICAgfSBjYXRjaCAoaWduKSB7fVxuICAgIH1cbiAgICBpZiAocGtnSWRzLmluY2x1ZGVzKGFwcCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcGtnSWRzLnB1c2goYXBwKTtcbiAgICBjb25zdCB0bXBSb290ID0gYXdhaXQgdGVtcERpci5vcGVuRGlyKCk7XG4gICAgY29uc3Qgc3JjUGF0aCA9IHBhdGgucG9zaXguam9pbih0bXBSb290LCBwYXRoLnBvc2l4LmJhc2VuYW1lKE1PQ0tfQVBQX0lEU19TVE9SRSkpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmcy53cml0ZUZpbGUoc3JjUGF0aCwgSlNPTi5zdHJpbmdpZnkocGtnSWRzKSwgJ3V0ZjgnKTtcbiAgICAgIGF3YWl0IGFkYi5wdXNoRmlsZShzcmNQYXRoLCBNT0NLX0FQUF9JRFNfU1RPUkUpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBmcy5yaW1yYWYodG1wUm9vdCk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nZ2VyLndhcm4oYFVuYWJsZSB0byBwZXJzaXN0IG1vY2sgbG9jYXRpb24gYXBwIGlkICcke2FwcH0nOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuaGVscGVycy5yZXNldE1vY2tMb2NhdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIHJlc2V0TW9ja0xvY2F0aW9uIChhZGIpIHtcbiAgdHJ5IHtcbiAgICBpZiAoYXdhaXQgYWRiLmdldEFwaUxldmVsKCkgPCAyMykge1xuICAgICAgYXdhaXQgYWRiLnNoZWxsKFsnc2V0dGluZ3MnLCAncHV0JywgJ3NlY3VyZScsICdtb2NrX2xvY2F0aW9uJywgJzAnXSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdGhpcmRQYXJ0eVBrZ0lkc1Byb21pc2UgPSBoZWxwZXJzLmdldFRoaXJkUGFydHlQYWNrYWdlcyhhZGIpO1xuICAgIGxldCBwa2dJZHMgPSBbXTtcbiAgICBpZiAoYXdhaXQgYWRiLmZpbGVFeGlzdHMoTU9DS19BUFBfSURTX1NUT1JFKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcGtnSWRzID0gSlNPTi5wYXJzZShhd2FpdCBhZGIuc2hlbGwoWydjYXQnLCBNT0NLX0FQUF9JRFNfU1RPUkVdKSk7XG4gICAgICB9IGNhdGNoIChpZ24pIHt9XG4gICAgfVxuICAgIGNvbnN0IHRoaXJkUGFydHlQa2dJZHMgPSBhd2FpdCB0aGlyZFBhcnR5UGtnSWRzUHJvbWlzZTtcbiAgICAvLyBPbmx5IGluY2x1ZGUgY3VycmVudGx5IGluc3RhbGxlZCBwYWNrYWdlc1xuICAgIGNvbnN0IHJlc3VsdFBrZ3MgPSBfLmludGVyc2VjdGlvbihwa2dJZHMsIHRoaXJkUGFydHlQa2dJZHMpO1xuICAgIGlmIChfLnNpemUocmVzdWx0UGtncykgPD0gMSkge1xuICAgICAgYXdhaXQgYWRiLnNoZWxsKFsnYXBwb3BzJywgJ3NldCcsIHJlc3VsdFBrZ3NbMF0gPz8gU0VUVElOR1NfSEVMUEVSX1BLR19JRCwgJ2FuZHJvaWQ6bW9ja19sb2NhdGlvbicsICdkZW55J10pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxvZ2dlci5kZWJ1ZyhgUmVzZXR0aW5nIG1vY2tfbG9jYXRpb24gcGVybWlzc2lvbiBmb3IgdGhlIGZvbGxvd2luZyBhcHBzOiAke3Jlc3VsdFBrZ3N9YCk7XG4gICAgYXdhaXQgQi5hbGwocmVzdWx0UGtncy5tYXAoKHBrZ0lkKSA9PiAoYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgYWRiLnNoZWxsKFsnYXBwb3BzJywgJ3NldCcsIHBrZ0lkLCAnYW5kcm9pZDptb2NrX2xvY2F0aW9uJywgJ2RlbnknXSk7XG4gICAgICB9IGNhdGNoIChpZ24pIHt9XG4gICAgfSkoKSkpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybihgVW5hYmxlIHRvIHJlc2V0IG1vY2sgbG9jYXRpb246ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbmhlbHBlcnMuaW5zdGFsbEhlbHBlckFwcCA9IGFzeW5jIGZ1bmN0aW9uIGluc3RhbGxIZWxwZXJBcHAgKGFkYiwgYXBrUGF0aCwgcGFja2FnZUlkKSB7XG4gIC8vIFNvbWV0aW1lcyBhZGIgcHVzaCBvciBhZGIgaW5zdGFsIHRha2UgbW9yZSB0aW1lIHRoYW4gZXhwZWN0ZWQgdG8gaW5zdGFsbCBhbiBhcHBcbiAgLy8gZS5nLiBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2lvLmFwcGl1bS5zZXR0aW5ncy9pc3N1ZXMvNDAjaXNzdWVjb21tZW50LTQ3NjU5MzE3NFxuICBhd2FpdCByZXRyeSgyLCBhc3luYyBmdW5jdGlvbiByZXRyeUluc3RhbGxIZWxwZXJBcHAgKCkge1xuICAgIGF3YWl0IGFkYi5pbnN0YWxsT3JVcGdyYWRlKGFwa1BhdGgsIHBhY2thZ2VJZCwge2dyYW50UGVybWlzc2lvbnM6IHRydWV9KTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIFB1c2hlcyBhbmQgaW5zdGFsbHMgaW8uYXBwaXVtLnNldHRpbmdzIGFwcC5cbiAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgc2V0dGluZyBhcHAgaXMgcmVxdWlyZWRcbiAqXG4gKiBAcGFyYW0ge0FkYn0gYWRiIC0gVGhlIGFkYiBtb2R1bGUgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIERyaXZlciBvcHRpb25zIGRpY3Rpb25hcnkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHRocm93RXJyb3IgW2ZhbHNlXSAtIFdoZXRoZXIgdGhyb3cgYW4gZXJyb3IgaWYgU2V0dGluZ3MgYXBwIGZhaWxzIHRvIHN0YXJ0XG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhyb3dFcnJvciBpcyB0cnVlIGFuZCBzb21ldGhpbmcgaGFwcGVucyBpbiBpbnN0YWxsYXRpb24gc3RlcFxuICovXG5oZWxwZXJzLnB1c2hTZXR0aW5nc0FwcCA9IGFzeW5jIGZ1bmN0aW9uIHB1c2hTZXR0aW5nc0FwcCAoYWRiLCB0aHJvd0Vycm9yID0gZmFsc2UsIG9wdHMgPSB7fSkge1xuICBsb2dnZXIuZGVidWcoJ1B1c2hpbmcgc2V0dGluZ3MgYXBrIHRvIGRldmljZS4uLicpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgaGVscGVycy5pbnN0YWxsSGVscGVyQXBwKGFkYiwgc2V0dGluZ3NBcGtQYXRoLCBTRVRUSU5HU19IRUxQRVJfUEtHX0lELCB0aHJvd0Vycm9yKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKHRocm93RXJyb3IpIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG5cbiAgICBsb2dnZXIud2FybihgSWdub3JlZCBlcnJvciB3aGlsZSBpbnN0YWxsaW5nICcke3NldHRpbmdzQXBrUGF0aH0nOiBgICtcbiAgICAgICAgICAgICAgICBgJyR7ZXJyLm1lc3NhZ2V9Jy4gRmVhdHVyZXMgdGhhdCByZWx5IG9uIHRoaXMgaGVscGVyIGAgK1xuICAgICAgICAgICAgICAgICdyZXF1aXJlIHRoZSBhcGsgc3VjaCBhcyB0b2dnbGUgV2lGaSBhbmQgZ2V0dGluZyBsb2NhdGlvbiAnICtcbiAgICAgICAgICAgICAgICAnd2lsbCByYWlzZSBhbiBlcnJvciBpZiB5b3UgdHJ5IHRvIHVzZSB0aGVtLicpO1xuICB9XG5cbiAgLy8gUmVpbnN0YWxsIHdvdWxkIHN0b3AgdGhlIHNldHRpbmdzIGhlbHBlciBwcm9jZXNzIGFueXdheSwgc29cbiAgLy8gdGhlcmUgaXMgbm8gbmVlZCB0byBjb250aW51ZSBpZiB0aGUgYXBwbGljYXRpb24gaXMgc3RpbGwgcnVubmluZ1xuICBpZiAoYXdhaXQgYWRiLnByb2Nlc3NFeGlzdHMoU0VUVElOR1NfSEVMUEVSX1BLR19JRCkpIHtcbiAgICBsb2dnZXIuZGVidWcoYCR7U0VUVElOR1NfSEVMUEVSX1BLR19JRH0gaXMgYWxyZWFkeSBydW5uaW5nLiBgICtcbiAgICAgIGBUaGVyZSBpcyBubyBuZWVkIHRvIHJlc2V0IGl0cyBwZXJtaXNzaW9ucy5gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBhcGlMZXZlbCA9IGF3YWl0IGFkYi5nZXRBcGlMZXZlbCgpO1xuICBpZiAoYXBpTGV2ZWwgPj0gMjkpIHtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2lvLmFwcGl1bS5zZXR0aW5ncyNpbnRlcm5hbC1hdWRpby0tdmlkZW8tcmVjb3JkaW5nXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGFkYi5zaGVsbChbJ2FwcG9wcycsICdzZXQnLCBTRVRUSU5HU19IRUxQRVJfUEtHX0lELCAnUFJPSkVDVF9NRURJQScsICdhbGxvdyddKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhlcnIpO1xuICAgIH1cbiAgfVxuICBpZiAoYXBpTGV2ZWwgPD0gMjMpIHsgLy8gQW5kcm9pZCA2LSBkZXZpY2VzIHNob3VsZCBoYXZlIGdyYW50ZWQgcGVybWlzc2lvbnNcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9wdWxsLzExNjQwI2lzc3VlY29tbWVudC00MzgyNjA0NzdcbiAgICBjb25zdCBwZXJtcyA9IFsnU0VUX0FOSU1BVElPTl9TQ0FMRScsICdDSEFOR0VfQ09ORklHVVJBVElPTicsICdBQ0NFU1NfRklORV9MT0NBVElPTiddO1xuICAgIGxvZ2dlci5pbmZvKGBHcmFudGluZyBwZXJtaXNzaW9ucyAke3Blcm1zfSB0byAnJHtTRVRUSU5HU19IRUxQRVJfUEtHX0lEfSdgKTtcbiAgICBhd2FpdCBhZGIuZ3JhbnRQZXJtaXNzaW9ucyhTRVRUSU5HU19IRUxQRVJfUEtHX0lELCBwZXJtcy5tYXAoKHgpID0+IGBhbmRyb2lkLnBlcm1pc3Npb24uJHt4fWApKTtcbiAgfVxuXG4gIC8vIGxhdW5jaCBpby5hcHBpdW0uc2V0dGluZ3MgYXBwIGR1ZSB0byBzZXR0aW5ncyBmYWlsaW5nIHRvIGJlIHNldFxuICAvLyBpZiB0aGUgYXBwIGlzIG5vdCBsYXVuY2hlZCBwcmlvciB0byBzdGFydCB0aGUgc2Vzc2lvbiBvbiBhbmRyb2lkIDcrXG4gIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9pc3N1ZXMvODk1N1xuICB0cnkge1xuICAgIGF3YWl0IGFkYi5yZXF1aXJlUnVubmluZ1NldHRpbmdzQXBwKHtcbiAgICAgIHRpbWVvdXQ6IGhlbHBlcnMuaXNFbXVsYXRvcihhZGIsIG9wdHMpID8gMzAwMDAgOiA1MDAwXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci5kZWJ1ZyhlcnIpO1xuICAgIGlmICh0aHJvd0Vycm9yKSB7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEV4dHJhY3RzIHN0cmluZy54bWwgYW5kIGNvbnZlcnRzIGl0IHRvIHN0cmluZy5qc29uIGFuZCBwdXNoZXNcbiAqIGl0IHRvIC9kYXRhL2xvY2FsL3RtcC9zdHJpbmcuanNvbiBvbiBmb3IgdXNlIG9mIGJvb3RzdHJhcFxuICogSWYgYXBwIGlzIG5vdCBwcmVzZW50IHRvIGV4dHJhY3Qgc3RyaW5nLnhtbCBpdCBkZWxldGVzIHJlbW90ZSBzdHJpbmdzLmpzb25cbiAqIElmIGFwcCBkb2VzIG5vdCBoYXZlIHN0cmluZ3MueG1sIHdlIHB1c2ggYW4gZW1wdHkganNvbiBvYmplY3QgdG8gcmVtb3RlXG4gKlxuICogQHBhcmFtIHs/c3RyaW5nfSBsYW5ndWFnZSAtIExhbmd1YWdlIGFiYnJldmlhdGlvbiwgZm9yIGV4YW1wbGUgJ2ZyJy4gVGhlIGRlZmF1bHQgbGFuZ3VhZ2VcbiAqIGlzIHVzZWQgaWYgdGhpcyBhcmd1bWVudCBpcyBub3QgZGVmaW5lZC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBhZGIgLSBUaGUgYWRiIG1vZHVsZSBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gRHJpdmVyIG9wdGlvbnMgZGljdGlvbmFyeS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBkaWN0aW9uYXJ5LCB3aGVyZSBzdHJpbmcgcmVzb3VyY2UgaWRlbnRpZmllcnMgYXJlIGtleXNcbiAqIGFsb25nIHdpdGggdGhlaXIgY29ycmVzcG9uZGluZyB2YWx1ZXMgZm9yIHRoZSBnaXZlbiBsYW5ndWFnZSBvciBhbiBlbXB0eSBvYmplY3RcbiAqIGlmIG5vIG1hdGNoaW5nIHJlc291cmNlcyB3ZXJlIGV4dHJhY3RlZC5cbiAqL1xuaGVscGVycy5wdXNoU3RyaW5ncyA9IGFzeW5jIGZ1bmN0aW9uIHB1c2hTdHJpbmdzIChsYW5ndWFnZSwgYWRiLCBvcHRzKSB7XG4gIGNvbnN0IHJlbW90ZURpciA9ICcvZGF0YS9sb2NhbC90bXAnO1xuICBjb25zdCBzdHJpbmdzSnNvbiA9ICdzdHJpbmdzLmpzb24nO1xuICBjb25zdCByZW1vdGVGaWxlID0gcGF0aC5wb3NpeC5yZXNvbHZlKHJlbW90ZURpciwgc3RyaW5nc0pzb24pO1xuXG4gIC8vIGNsZWFuIHVwIHJlbW90ZSBzdHJpbmcuanNvbiBpZiBwcmVzZW50XG4gIGF3YWl0IGFkYi5yaW1yYWYocmVtb3RlRmlsZSk7XG5cbiAgbGV0IGFwcDtcbiAgdHJ5IHtcbiAgICBhcHAgPSBvcHRzLmFwcCB8fCBhd2FpdCBhZGIucHVsbEFwayhvcHRzLmFwcFBhY2thZ2UsIG9wdHMudG1wRGlyKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLmluZm8oYEZhaWxlZCB0byBwdWxsIGFuIGFwayBmcm9tICcke29wdHMuYXBwUGFja2FnZX0nIHRvICcke29wdHMudG1wRGlyfScuIE9yaWdpbmFsIGVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICB9XG5cbiAgaWYgKF8uaXNFbXB0eShvcHRzLmFwcFBhY2thZ2UpIHx8ICEoYXdhaXQgZnMuZXhpc3RzKGFwcCkpKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGBObyBhcHAgb3IgcGFja2FnZSBzcGVjaWZpZWQuIFJldHVybmluZyBlbXB0eSBzdHJpbmdzYCk7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgY29uc3Qgc3RyaW5nc1RtcERpciA9IHBhdGgucmVzb2x2ZShvcHRzLnRtcERpciwgb3B0cy5hcHBQYWNrYWdlKTtcbiAgdHJ5IHtcbiAgICBsb2dnZXIuZGVidWcoJ0V4dHJhY3Rpbmcgc3RyaW5ncyBmcm9tIGFwaycsIGFwcCwgbGFuZ3VhZ2UsIHN0cmluZ3NUbXBEaXIpO1xuICAgIGNvbnN0IHthcGtTdHJpbmdzLCBsb2NhbFBhdGh9ID0gYXdhaXQgYWRiLmV4dHJhY3RTdHJpbmdzRnJvbUFwayhhcHAsIGxhbmd1YWdlLCBzdHJpbmdzVG1wRGlyKTtcbiAgICBhd2FpdCBhZGIucHVzaChsb2NhbFBhdGgsIHJlbW90ZURpcik7XG4gICAgcmV0dXJuIGFwa1N0cmluZ3M7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKGBDb3VsZCBub3QgZ2V0IHN0cmluZ3MsIGNvbnRpbnVpbmcgYW55d2F5LiBPcmlnaW5hbCBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICBhd2FpdCBhZGIuc2hlbGwoJ2VjaG8nLCBbYCd7fScgPiAke3JlbW90ZUZpbGV9YF0pO1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IGZzLnJpbXJhZihzdHJpbmdzVG1wRGlyKTtcbiAgfVxuICByZXR1cm4ge307XG59O1xuXG5oZWxwZXJzLnVubG9ja1dpdGhIZWxwZXJBcHAgPSBhc3luYyBmdW5jdGlvbiB1bmxvY2tXaXRoSGVscGVyQXBwIChhZGIpIHtcbiAgbG9nZ2VyLmluZm8oJ1VubG9ja2luZyBzY3JlZW4nKTtcblxuICAvLyBVbmxvY2sgc3VjY2VlZCB3aXRoIGEgY291cGxlIG9mIHJldHJpZXMuXG4gIGxldCBmaXJzdFJ1biA9IHRydWU7XG4gIGF3YWl0IHJldHJ5KDMsIGFzeW5jIGZ1bmN0aW9uIGxhdW5jaEhlbHBlciAoKSB7XG4gICAgLy8gVG8gcmVkdWNlIGEgdGltZSB0byBjYWxsIGFkYi5pc1NjcmVlbkxvY2tlZCgpIHNpbmNlIGBhZGIgc2hlbGwgZHVtcHN5cyB3aW5kb3dgIGlzIGVhc3kgdG8gaGFuZyBhZGIgY29tbWFuZHNcbiAgICBpZiAoZmlyc3RSdW4pIHtcbiAgICAgIGZpcnN0UnVuID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghKGF3YWl0IGFkYi5pc1NjcmVlbkxvY2tlZCgpKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dnZXIud2FybihgRXJyb3IgaW4gaXNTY3JlZW5Mb2NrZWQ6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgICBsb2dnZXIud2FybignXCJhZGIgc2hlbGwgZHVtcHN5cyB3aW5kb3dcIiBjb21tYW5kIGhhcyB0aW1lZCBvdXQuJyk7XG4gICAgICAgIGxvZ2dlci53YXJuKCdUaGUgcmVhc29uIG9mIHRoaXMgdGltZW91dCBpcyB0aGUgZGVsYXllZCBhZGIgcmVzcG9uc2UuIFJlc2V0dGluZyBhZGIgc2VydmVyIGNhbiBpbXByb3ZlIGl0LicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxvZ2dlci5pbmZvKGBMYXVuY2hpbmcgJHtTRVRUSU5HU19IRUxQRVJfVU5MT0NLX0FDVElWSVRZfWApO1xuICAgIGF3YWl0IGFkYi5zaGVsbChbXG4gICAgICAnYW0nLCAnc3RhcnQnLFxuICAgICAgJy1uJywgYCR7U0VUVElOR1NfSEVMUEVSX1BLR19JRH0vJHtTRVRUSU5HU19IRUxQRVJfVU5MT0NLX0FDVElWSVRZfWAsXG4gICAgICAnLWMnLCAnYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVInLFxuICAgICAgJy1hJywgJ2FuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOJyxcbiAgICAgICctZicsICcweDEwMjAwMDAwJyxcbiAgICBdKTtcbiAgICBhd2FpdCBCLmRlbGF5KDEwMDApO1xuICB9KTtcbn07XG5cbmhlbHBlcnMudW5sb2NrID0gYXN5bmMgZnVuY3Rpb24gdW5sb2NrIChkcml2ZXIsIGFkYiwgY2FwYWJpbGl0aWVzKSB7XG4gIGlmICghKGF3YWl0IGFkYi5pc1NjcmVlbkxvY2tlZCgpKSkge1xuICAgIGxvZ2dlci5pbmZvKCdTY3JlZW4gYWxyZWFkeSB1bmxvY2tlZCwgZG9pbmcgbm90aGluZycpO1xuICAgIHJldHVybjtcbiAgfVxuICBsb2dnZXIuZGVidWcoJ1NjcmVlbiBpcyBsb2NrZWQsIHRyeWluZyB0byB1bmxvY2snKTtcblxuICBpZiAoIWNhcGFiaWxpdGllcy51bmxvY2tUeXBlICYmICFjYXBhYmlsaXRpZXMudW5sb2NrS2V5KSB7XG4gICAgbG9nZ2VyLndhcm4oJ1VzaW5nIGFwcCB1bmxvY2ssIHRoaXMgaXMgZ29pbmcgdG8gYmUgZGVwcmVjYXRlZCEnKTtcbiAgICBhd2FpdCBoZWxwZXJzLnVubG9ja1dpdGhIZWxwZXJBcHAoYWRiKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB7XG4gICAgdW5sb2NrVHlwZSxcbiAgICB1bmxvY2tLZXksXG4gICAgdW5sb2NrU3RyYXRlZ3ksXG4gICAgdW5sb2NrU3VjY2Vzc1RpbWVvdXQsXG4gIH0gPSB1bmxvY2tlci52YWxpZGF0ZVVubG9ja0NhcGFiaWxpdGllcyhjYXBhYmlsaXRpZXMpO1xuICBpZiAodW5sb2NrS2V5ICYmIHVubG9ja1R5cGUgIT09IEZJTkdFUlBSSU5UX1VOTE9DS1xuICAgICAgJiYgKF8uaXNOaWwodW5sb2NrU3RyYXRlZ3kpIHx8IF8udG9Mb3dlcih1bmxvY2tTdHJhdGVneSkgPT09ICdsb2Nrc2V0dGluZ3MnKVxuICAgICAgJiYgYXdhaXQgYWRiLmlzTG9ja01hbmFnZW1lbnRTdXBwb3J0ZWQoKSkge1xuICAgIGF3YWl0IHVubG9ja2VyLmZhc3RVbmxvY2soYWRiLCB7XG4gICAgICBjcmVkZW50aWFsOiB1bmxvY2tLZXksXG4gICAgICBjcmVkZW50aWFsVHlwZTogdG9DcmVkZW50aWFsVHlwZSh1bmxvY2tUeXBlKSxcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB1bmxvY2tNZXRob2QgPSB7XG4gICAgICBbUElOX1VOTE9DS106IHVubG9ja2VyLnBpblVubG9jayxcbiAgICAgIFtQSU5fVU5MT0NLX0tFWV9FVkVOVF06IHVubG9ja2VyLnBpblVubG9ja1dpdGhLZXlFdmVudCxcbiAgICAgIFtQQVNTV09SRF9VTkxPQ0tdOiB1bmxvY2tlci5wYXNzd29yZFVubG9jayxcbiAgICAgIFtQQVRURVJOX1VOTE9DS106IHVubG9ja2VyLnBhdHRlcm5VbmxvY2ssXG4gICAgICBbRklOR0VSUFJJTlRfVU5MT0NLXTogdW5sb2NrZXIuZmluZ2VycHJpbnRVbmxvY2ssXG4gICAgfVt1bmxvY2tUeXBlXTtcbiAgICBhd2FpdCB1bmxvY2tNZXRob2QoYWRiLCBkcml2ZXIsIGNhcGFiaWxpdGllcyk7XG4gIH1cbiAgYXdhaXQgaGVscGVycy52ZXJpZnlVbmxvY2soYWRiLCB1bmxvY2tTdWNjZXNzVGltZW91dCk7XG59O1xuXG5oZWxwZXJzLnZlcmlmeVVubG9jayA9IGFzeW5jIGZ1bmN0aW9uIHZlcmlmeVVubG9jayAoYWRiLCB0aW1lb3V0TXMgPSBudWxsKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbihhc3luYyAoKSA9PiAhKGF3YWl0IGFkYi5pc1NjcmVlbkxvY2tlZCgpKSwge1xuICAgICAgd2FpdE1zOiB0aW1lb3V0TXMgPz8gMjAwMCxcbiAgICAgIGludGVydmFsTXM6IDUwMCxcbiAgICB9KTtcbiAgfSBjYXRjaCAoaWduKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgZGV2aWNlIGhhcyBmYWlsZWQgdG8gYmUgdW5sb2NrZWQnKTtcbiAgfVxuICBsb2dnZXIuaW5mbygnVGhlIGRldmljZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgdW5sb2NrZWQnKTtcbn07XG5cbmhlbHBlcnMuaW5pdERldmljZSA9IGFzeW5jIGZ1bmN0aW9uIGluaXREZXZpY2UgKGFkYiwgb3B0cykge1xuICBjb25zdCB7XG4gICAgc2tpcERldmljZUluaXRpYWxpemF0aW9uLFxuICAgIGxvY2FsZSxcbiAgICBsYW5ndWFnZSxcbiAgICBsb2NhbGVTY3JpcHQsXG4gICAgdW5pY29kZUtleWJvYXJkLFxuICAgIGRpc2FibGVXaW5kb3dBbmltYXRpb24sXG4gICAgc2tpcFVubG9jayxcbiAgICBtb2NrTG9jYXRpb25BcHAsXG4gICAgc2tpcExvZ2NhdENhcHR1cmUsXG4gICAgbG9nY2F0Rm9ybWF0LFxuICAgIGxvZ2NhdEZpbHRlclNwZWNzLFxuICB9ID0gb3B0cztcblxuICBpZiAoc2tpcERldmljZUluaXRpYWxpemF0aW9uKSB7XG4gICAgbG9nZ2VyLmluZm8oYCdza2lwRGV2aWNlSW5pdGlhbGl6YXRpb24nIGlzIHNldC4gU2tpcHBpbmcgZGV2aWNlIGluaXRpYWxpemF0aW9uLmApO1xuICB9IGVsc2Uge1xuICAgIGF3YWl0IGFkYi53YWl0Rm9yRGV2aWNlKCk7XG4gICAgLy8gcHVzaFNldHRpbmdzQXBwIHJlcXVpcmVkIGJlZm9yZSBjYWxsaW5nIGVuc3VyZURldmljZUxvY2FsZSBmb3IgQVBJIExldmVsIDI0K1xuXG4gICAgLy8gU29tZSBmZWF0dXJlIHN1Y2ggYXMgbG9jYXRpb24vd2lmaSBhcmUgbm90IG5lY2Vzc2FyeSBmb3IgYWxsIHVzZXJzLFxuICAgIC8vIGJ1dCB0aGV5IHJlcXVpcmUgdGhlIHNldHRpbmdzIGFwcC4gU28sIHRyeSB0byBjb25maWd1cmUgaXQgd2hpbGUgQXBwaXVtXG4gICAgLy8gZG9lcyBub3QgdGhyb3cgZXJyb3IgZXZlbiBpZiB0aGV5IGZhaWwuXG4gICAgY29uc3Qgc2hvdWxkVGhyb3dFcnJvciA9IGxhbmd1YWdlXG4gICAgICB8fCBsb2NhbGVcbiAgICAgIHx8IGxvY2FsZVNjcmlwdFxuICAgICAgfHwgdW5pY29kZUtleWJvYXJkXG4gICAgICB8fCBkaXNhYmxlV2luZG93QW5pbWF0aW9uXG4gICAgICB8fCAhc2tpcFVubG9jaztcbiAgICBhd2FpdCBoZWxwZXJzLnB1c2hTZXR0aW5nc0FwcChhZGIsIHNob3VsZFRocm93RXJyb3IsIG9wdHMpO1xuICB9XG5cbiAgaWYgKCFoZWxwZXJzLmlzRW11bGF0b3IoYWRiLCBvcHRzKSkge1xuICAgIGlmIChtb2NrTG9jYXRpb25BcHAgfHwgXy5pc1VuZGVmaW5lZChtb2NrTG9jYXRpb25BcHApKSB7XG4gICAgICBhd2FpdCBoZWxwZXJzLnNldE1vY2tMb2NhdGlvbkFwcChhZGIsIG1vY2tMb2NhdGlvbkFwcCB8fCBTRVRUSU5HU19IRUxQRVJfUEtHX0lEKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgaGVscGVycy5yZXNldE1vY2tMb2NhdGlvbihhZGIpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChsYW5ndWFnZSB8fCBsb2NhbGUpIHtcbiAgICBhd2FpdCBoZWxwZXJzLmVuc3VyZURldmljZUxvY2FsZShhZGIsIGxhbmd1YWdlLCBsb2NhbGUsIGxvY2FsZVNjcmlwdCk7XG4gIH1cblxuICBpZiAoc2tpcExvZ2NhdENhcHR1cmUpIHtcbiAgICBsb2dnZXIuaW5mbyhgJ3NraXBMb2djYXRDYXB0dXJlJyBpcyBzZXQuIFNraXBwaW5nIHN0YXJ0aW5nIGxvZ2NhdCBjYXB0dXJlLmApO1xuICB9IGVsc2Uge1xuICAgIGF3YWl0IGFkYi5zdGFydExvZ2NhdCh7XG4gICAgICBmb3JtYXQ6IGxvZ2NhdEZvcm1hdCxcbiAgICAgIGZpbHRlclNwZWNzOiBsb2djYXRGaWx0ZXJTcGVjcyxcbiAgICB9KTtcbiAgfVxuXG4gIGlmICh1bmljb2RlS2V5Ym9hcmQpIHtcbiAgICByZXR1cm4gYXdhaXQgaGVscGVycy5pbml0VW5pY29kZUtleWJvYXJkKGFkYik7XG4gIH1cbn07XG5cbmhlbHBlcnMucmVtb3ZlTnVsbFByb3BlcnRpZXMgPSBmdW5jdGlvbiByZW1vdmVOdWxsUHJvcGVydGllcyAob2JqKSB7XG4gIGZvciAobGV0IGtleSBvZiBfLmtleXMob2JqKSkge1xuICAgIGlmIChfLmlzTnVsbChvYmpba2V5XSkgfHwgXy5pc1VuZGVmaW5lZChvYmpba2V5XSkpIHtcbiAgICAgIGRlbGV0ZSBvYmpba2V5XTtcbiAgICB9XG4gIH1cbn07XG5cbmhlbHBlcnMudHJ1bmNhdGVEZWNpbWFscyA9IGZ1bmN0aW9uIHRydW5jYXRlRGVjaW1hbHMgKG51bWJlciwgZGlnaXRzKSB7XG4gIGxldCBtdWx0aXBsaWVyID0gTWF0aC5wb3coMTAsIGRpZ2l0cyksXG4gICAgICBhZGp1c3RlZE51bSA9IG51bWJlciAqIG11bHRpcGxpZXIsXG4gICAgICB0cnVuY2F0ZWROdW0gPSBNYXRoW2FkanVzdGVkTnVtIDwgMCA/ICdjZWlsJyA6ICdmbG9vciddKGFkanVzdGVkTnVtKTtcblxuICByZXR1cm4gdHJ1bmNhdGVkTnVtIC8gbXVsdGlwbGllcjtcbn07XG5cbmhlbHBlcnMuaXNDaHJvbWVCcm93c2VyID0gZnVuY3Rpb24gaXNDaHJvbWVCcm93c2VyIChicm93c2VyKSB7XG4gIHJldHVybiBfLmluY2x1ZGVzKE9iamVjdC5rZXlzKENIUk9NRV9CUk9XU0VSX1BBQ0tBR0VfQUNUSVZJVFkpLCAoYnJvd3NlciB8fCAnJykudG9Mb3dlckNhc2UoKSk7XG59O1xuXG5oZWxwZXJzLmdldENocm9tZVBrZyA9IGZ1bmN0aW9uIGdldENocm9tZVBrZyAoYnJvd3Nlcikge1xuICByZXR1cm4gQ0hST01FX0JST1dTRVJfUEFDS0FHRV9BQ1RJVklUWVticm93c2VyLnRvTG93ZXJDYXNlKCldIHx8IENIUk9NRV9CUk9XU0VSX1BBQ0tBR0VfQUNUSVZJVFkuZGVmYXVsdDtcbn07XG5cbmhlbHBlcnMucmVtb3ZlQWxsU2Vzc2lvbldlYlNvY2tldEhhbmRsZXJzID0gYXN5bmMgZnVuY3Rpb24gcmVtb3ZlQWxsU2Vzc2lvbldlYlNvY2tldEhhbmRsZXJzIChzZXJ2ZXIsIHNlc3Npb25JZCkge1xuICBpZiAoIXNlcnZlciB8fCAhXy5pc0Z1bmN0aW9uKHNlcnZlci5nZXRXZWJTb2NrZXRIYW5kbGVycykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBhY3RpdmVIYW5kbGVycyA9IGF3YWl0IHNlcnZlci5nZXRXZWJTb2NrZXRIYW5kbGVycyhzZXNzaW9uSWQpO1xuICBmb3IgKGNvbnN0IHBhdGhuYW1lIG9mIF8ua2V5cyhhY3RpdmVIYW5kbGVycykpIHtcbiAgICBhd2FpdCBzZXJ2ZXIucmVtb3ZlV2ViU29ja2V0SGFuZGxlcihwYXRobmFtZSk7XG4gIH1cbn07XG5cbi8qKlxuICogVGFrZXMgYSBkZXNpcmVkIGNhcGFiaWxpdHkgYW5kIHRyaWVzIHRvIEpTT04ucGFyc2UgaXQgYXMgYW4gYXJyYXksXG4gKiBhbmQgZWl0aGVyIHJldHVybnMgdGhlIHBhcnNlZCBhcnJheSBvciBhIHNpbmdsZXRvbiBhcnJheS5cbiAqXG4gKiBAcGFyYW0ge2FueX0gY2FwIEEgZGVzaXJlZCBjYXBhYmlsaXR5XG4gKi9cbmhlbHBlcnMucGFyc2VBcnJheSA9IGZ1bmN0aW9uIHBhcnNlQXJyYXkgKGNhcCkge1xuICBsZXQgcGFyc2VkQ2FwcztcbiAgdHJ5IHtcbiAgICBwYXJzZWRDYXBzID0gSlNPTi5wYXJzZShjYXApO1xuICB9IGNhdGNoIChpZ24pIHsgfVxuXG4gIGlmIChfLmlzQXJyYXkocGFyc2VkQ2FwcykpIHtcbiAgICByZXR1cm4gcGFyc2VkQ2FwcztcbiAgfSBlbHNlIGlmIChfLmlzU3RyaW5nKGNhcCkpIHtcbiAgICByZXR1cm4gW2NhcF07XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYG11c3QgcHJvdmlkZSBhIHN0cmluZyBvciBKU09OIEFycmF5OyByZWNlaXZlZCAke2NhcH1gKTtcbn07XG5cbi8qKlxuICogVmFsaWRhdGUgZGVzaXJlZCBjYXBhYmlsaXRpZXMuIFJldHVybnMgdHJ1ZSBpZiBjYXBhYmlsaXR5IGlzIHZhbGlkXG4gKlxuICogQHBhcmFtIHsqfSBjYXAgQSBkZXNpcmVkIGNhcGFiaWxpdHlcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiB0aGUgY2FwYWJpbGl0eSBpcyB2YWxpZFxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBjYXBzIGhhcyBpbnZhbGlkIGNhcGFiaWxpdHlcbiAqL1xuaGVscGVycy52YWxpZGF0ZURlc2lyZWRDYXBzID0gZnVuY3Rpb24gdmFsaWRhdGVEZXNpcmVkQ2FwcyAoY2Fwcykge1xuICBpZiAoY2Fwcy5icm93c2VyTmFtZSkge1xuICAgIGlmIChjYXBzLmFwcCkge1xuICAgICAgLy8gd2FybiBpZiB0aGUgY2FwYWJpbGl0aWVzIGhhdmUgYm90aCBgYXBwYCBhbmQgYGJyb3dzZXIsIGFsdGhvdWdoIHRoaXMgaXMgY29tbW9uIHdpdGggc2VsZW5pdW0gZ3JpZFxuICAgICAgbG9nZ2VyLndhcm4oYFRoZSBkZXNpcmVkIGNhcGFiaWxpdGllcyBzaG91bGQgZ2VuZXJhbGx5IG5vdCBpbmNsdWRlIGJvdGggYW4gJ2FwcCcgYW5kIGEgJ2Jyb3dzZXJOYW1lJ2ApO1xuICAgIH1cbiAgICBpZiAoY2Fwcy5hcHBQYWNrYWdlKSB7XG4gICAgICBsb2dnZXIuZXJyb3JBbmRUaHJvdyhgVGhlIGRlc2lyZWQgc2hvdWxkIG5vdCBpbmNsdWRlIGJvdGggb2YgYW4gJ2FwcFBhY2thZ2UnIGFuZCBhICdicm93c2VyTmFtZSdgKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY2Fwcy51bmluc3RhbGxPdGhlclBhY2thZ2VzKSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMucGFyc2VBcnJheShjYXBzLnVuaW5zdGFsbE90aGVyUGFja2FnZXMpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZ2dlci5lcnJvckFuZFRocm93KGBDb3VsZCBub3QgcGFyc2UgXCJ1bmluc3RhbGxPdGhlclBhY2thZ2VzXCIgY2FwYWJpbGl0eTogJHtlLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG4vKipcbiAqIEFkanVzdCB0aGUgY2FwYWJpbGl0aWVzIGZvciBhIGJyb3dzZXIgc2Vzc2lvblxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBjYXBzIC0gQ3VycmVudCBjYXBhYmlsaXRpZXMgb2JqZWN0XG4gKiAhISEgVGhlIG9iamVjdCBpcyBtdXRhdGVkIGJ5IHRoaXMgbWV0aG9kIGNhbGwgISEhXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgc2FtZSBwb3NzaWJseSBtdXRhdGVkIGBvcHRzYCBpbnN0YW5jZS5cbiAqIE5vIG11dGF0aW9uIGlzIGhhcHBlbmluZyBpcyB0aGUgY3VycmVudCBzZXNzaW9uIGlmXG4gKiBhcHBQYWNrYWdlL2FwcEFjdGl2aXR5IGNhcHMgaGF2ZSBhbHJlYWR5IGJlZW4gcHJvdmlkZWQuXG4gKi9cbmhlbHBlcnMuYWRqdXN0QnJvd3NlclNlc3Npb25DYXBzID0gZnVuY3Rpb24gYWRqdXN0QnJvd3NlclNlc3Npb25DYXBzIChjYXBzID0ge30pIHtcbiAgY29uc3QgeyBicm93c2VyTmFtZSB9ID0gY2FwcztcbiAgbG9nZ2VyLmluZm8oYFRoZSBjdXJyZW50IHNlc3Npb24gaXMgY29uc2lkZXJlZCBicm93c2VyLWJhc2VkYCk7XG4gIGxvZ2dlci5pbmZvKGBTdXBwb3J0ZWQgYnJvd3NlciBuYW1lczogJHtKU09OLnN0cmluZ2lmeShfLmtleXMoQ0hST01FX0JST1dTRVJfUEFDS0FHRV9BQ1RJVklUWSkpfWApO1xuICBpZiAoY2Fwcy5hcHBQYWNrYWdlIHx8IGNhcHMuYXBwQWN0aXZpdHkpIHtcbiAgICBsb2dnZXIuaW5mbyhgTm90IG92ZXJyaWRpbmcgYXBwUGFja2FnZS9hcHBBY3Rpdml0eSBjYXBhYmlsaXR5IHZhbHVlcyBmb3IgJyR7YnJvd3Nlck5hbWV9JyBgICtcbiAgICAgICdiZWNhdXNlIHNvbWUgb2YgdGhlbSBoYXZlIGJlZW4gYWxyZWFkeSBwcm92aWRlZCcpO1xuICAgIHJldHVybiBjYXBzO1xuICB9XG5cbiAgY29uc3Qge3BrZywgYWN0aXZpdHl9ID0gdGhpcy5nZXRDaHJvbWVQa2coYnJvd3Nlck5hbWUpO1xuICBjYXBzLmFwcFBhY2thZ2UgPSBwa2c7XG4gIGNhcHMuYXBwQWN0aXZpdHkgPSBhY3Rpdml0eTtcbiAgbG9nZ2VyLmluZm8oYGFwcFBhY2thZ2UvYXBwQWN0aXZpdHkgY2FwYWJpbGl0aWVzIGhhdmUgYmVlbiBhdXRvbWF0aWNhbGx5IHNldCB0byAke3BrZ30vJHthY3Rpdml0eX0gYCArXG4gICAgYGZvciAnJHticm93c2VyTmFtZX0nYCk7XG4gIGxvZ2dlci5pbmZvKGBDb25zaWRlciBjaGFuZ2luZyB0aGUgYnJvd3Nlck5hbWUgdG8gdGhlIG9uZSBmcm9tIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBicm93c2VyIG5hbWVzIGAgK1xuICAgIGBvciBwcm92aWRlIGN1c3RvbSBhcHBQYWNrYWdlL2FwcEFjdGl2aXR5IGNhcGFiaWxpdHkgdmFsdWVzIGlmIHRoZSBhdXRvbWF0aWNhbGx5IGFzc2lnbmVkIG9uZXMgZG8gYCArXG4gICAgYG5vdCBtYWtlIHNlbnNlYCk7XG4gIHJldHVybiBjYXBzO1xufTtcblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgY3VycmVudCBkZXZpY2UgdW5kZXIgdGVzdCBpcyBhbiBlbXVsYXRvclxuICpcbiAqIEBwYXJhbSB7QURCfSBhZGIgLSBhcHBpdW0tYWRiIGluc3RhbmNlXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIGRyaXZlciBvcHRpb25zIG1hcHBpbmdcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIGRldmljZSBpcyBhbiBBbmRyb2lkIGVtdWxhdG9yXG4gKi9cbmhlbHBlcnMuaXNFbXVsYXRvciA9IGZ1bmN0aW9uIGlzRW11bGF0b3IgKGFkYiwgb3B0cykge1xuICBjb25zdCBwb3NzaWJsZU5hbWVzID0gW29wdHMudWRpZCwgYWRiPy5jdXJEZXZpY2VJZF07XG4gIHJldHVybiAhIW9wdHMuYXZkIHx8IHBvc3NpYmxlTmFtZXMuc29tZSgoeCkgPT4gRU1VTEFUT1JfUEFUVEVSTi50ZXN0KHgpKTtcbn07XG5cbmhlbHBlcnMuYm9vdHN0cmFwID0gQm9vdHN0cmFwO1xuaGVscGVycy51bmxvY2tlciA9IHVubG9ja2VyO1xuXG5leHBvcnQgeyBoZWxwZXJzLCBTRVRUSU5HU19IRUxQRVJfUEtHX0lELCBBUFBfU1RBVEUsIHByZXBhcmVBdmRBcmdzLCBlbnN1cmVOZXR3b3JrU3BlZWQgfTtcbmV4cG9ydCBkZWZhdWx0IGhlbHBlcnM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBSUE7O0FB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
|
|
995
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNT0NLX0FQUF9JRFNfU1RPUkUiLCJQQUNLQUdFX0lOU1RBTExfVElNRU9VVCIsIkNIUk9NRV9CUk9XU0VSX1BBQ0tBR0VfQUNUSVZJVFkiLCJjaHJvbWUiLCJwa2ciLCJhY3Rpdml0eSIsImNocm9taXVtIiwiY2hyb21lYmV0YSIsImJyb3dzZXIiLCJkZWZhdWx0IiwiU0VUVElOR1NfSEVMUEVSX1BLR19JRCIsIlNFVFRJTkdTX0hFTFBFUl9VTkxPQ0tfQUNUSVZJVFkiLCJFTVVMQVRPUl9QQVRURVJOIiwiQVBQX1NUQVRFIiwiT2JqZWN0IiwiZnJlZXplIiwiTk9UX0lOU1RBTExFRCIsIk5PVF9SVU5OSU5HIiwiUlVOTklOR19JTl9CQUNLR1JPVU5EIiwiUlVOTklOR19JTl9GT1JFR1JPVU5EIiwiZW5zdXJlTmV0d29ya1NwZWVkIiwiYWRiIiwibmV0d29ya1NwZWVkIiwiXyIsInZhbHVlcyIsIk5FVFdPUktfU1BFRUQiLCJpbmNsdWRlcyIsImxvZ2dlciIsIndhcm4iLCJGVUxMIiwicHJlcGFyZUF2ZEFyZ3MiLCJvcHRzIiwiaXNIZWFkbGVzcyIsImF2ZEFyZ3MiLCJyZXN1bHQiLCJpc0FycmF5IiwicHVzaCIsInV0aWwiLCJzaGVsbFBhcnNlIiwidG9DcmVkZW50aWFsVHlwZSIsInVubG9ja1R5cGUiLCJQSU5fVU5MT0NLIiwiUElOX1VOTE9DS19LRVlfRVZFTlQiLCJQQVNTV09SRF9VTkxPQ0siLCJQQVRURVJOX1VOTE9DSyIsIkVycm9yIiwiaGVscGVycyIsImNyZWF0ZUJhc2VBREIiLCJhZGJQb3J0Iiwic3VwcHJlc3NLaWxsU2VydmVyIiwicmVtb3RlQWRiSG9zdCIsImNsZWFyRGV2aWNlTG9nc09uU3RhcnQiLCJhZGJFeGVjVGltZW91dCIsInVzZUtleXN0b3JlIiwia2V5c3RvcmVQYXRoIiwia2V5c3RvcmVQYXNzd29yZCIsImtleUFsaWFzIiwia2V5UGFzc3dvcmQiLCJyZW1vdGVBcHBzQ2FjaGVMaW1pdCIsImJ1aWxkVG9vbHNWZXJzaW9uIiwiYWxsb3dPZmZsaW5lRGV2aWNlcyIsImFsbG93RGVsYXlBZGIiLCJBREIiLCJjcmVhdGVBREIiLCJwcmVwYXJlRW11bGF0b3IiLCJhdmQiLCJhdmRFbnYiLCJlbnYiLCJsYW5ndWFnZSIsImxvY2FsZSIsImNvdW50cnkiLCJhdmRMYXVuY2hUaW1lb3V0IiwibGF1bmNoVGltZW91dCIsImF2ZFJlYWR5VGltZW91dCIsInJlYWR5VGltZW91dCIsImF2ZE5hbWUiLCJyZXBsYWNlIiwiaXNFbXVsYXRvclJ1bm5pbmciLCJnZXRSdW5uaW5nQVZEV2l0aFJldHJ5IiwiZSIsImRlYnVnIiwibWVzc2FnZSIsImFyZ3MiLCJraWxsRW11bGF0b3IiLCJsYXVuY2hBVkQiLCJlbnN1cmVEZXZpY2VMb2NhbGUiLCJzY3JpcHQiLCJpc1N0cmluZyIsInNldERldmljZUxhbmd1YWdlQ291bnRyeSIsImVuc3VyZUN1cnJlbnRMb2NhbGUiLCJnZXREZXZpY2VJbmZvRnJvbUNhcHMiLCJ1ZGlkIiwiZW1Qb3J0IiwiY3VyRGV2aWNlSWQiLCJlbXVsYXRvclBvcnQiLCJpbmZvIiwiZGV2aWNlcyIsImdldERldmljZXNXaXRoUmV0cnkiLCJtYXAiLCJlcnJvckFuZFRocm93IiwiZ2V0UG9ydEZyb21FbXVsYXRvclN0cmluZyIsInBsYXRmb3JtVmVyc2lvbiIsInRyaW0iLCJzZW12ZXIiLCJjb2VyY2UiLCJhdmFpbERldmljZXMiLCJwYXJ0aWFsTWF0Y2hDYW5kaWRhdGUiLCJkZXZpY2UiLCJzZXREZXZpY2VJZCIsInJhd0RldmljZU9TIiwiZ2V0UGxhdGZvcm1WZXJzaW9uIiwiZGV2aWNlT1MiLCJib3RoVmVyc2lvbnNDYW5CZUNvZXJjZWQiLCJ2YWxpZCIsImJvdGhWZXJzaW9uc0FyZVN0cmluZ3MiLCJ2ZXJzaW9uIiwidG9Mb3dlciIsIm1ham9yIiwibWlub3IiLCJndCIsImtleXMiLCJqb2luIiwic2V0RW11bGF0b3JQb3J0IiwidmFsaWRhdGVQYWNrYWdlQWN0aXZpdHlOYW1lcyIsImtleSIsIm5hbWUiLCJtYXRjaCIsImV4ZWMiLCJpbmRleCIsInN1YnN0cmluZyIsImdldExhdW5jaEluZm8iLCJhcHAiLCJhcHBQYWNrYWdlIiwiYXBwQWN0aXZpdHkiLCJhcHBXYWl0UGFja2FnZSIsImFwcFdhaXRBY3Rpdml0eSIsImFwa1BhY2thZ2UiLCJhcGtBY3Rpdml0eSIsInBhY2thZ2VBbmRMYXVuY2hBY3Rpdml0eUZyb21NYW5pZmVzdCIsInJlc2V0QXBwIiwiZmFzdFJlc2V0IiwiZnVsbFJlc2V0IiwiYW5kcm9pZEluc3RhbGxUaW1lb3V0IiwiYXV0b0dyYW50UGVybWlzc2lvbnMiLCJhbGxvd1Rlc3RQYWNrYWdlcyIsImlzSW5zdGFsbGVkIiwiaXNBcHBJbnN0YWxsZWQiLCJmb3JjZVN0b3AiLCJpZ24iLCJvdXRwdXQiLCJjbGVhciIsInRvTG93ZXJDYXNlIiwiZ3JhbnRBbGxQZXJtaXNzaW9ucyIsImVycm9yIiwidW5pbnN0YWxsQXBrIiwiaW5zdGFsbCIsImdyYW50UGVybWlzc2lvbnMiLCJ0aW1lb3V0IiwiaW5zdGFsbEFwayIsImVuZm9yY2VBcHBJbnN0YWxsIiwiYXBwU3RhdGUiLCJ3YXNVbmluc3RhbGxlZCIsImluc3RhbGxPclVwZ3JhZGUiLCJlbmZvcmNlQ3VycmVudEJ1aWxkIiwiaXNJbnN0YWxsZWRPdmVyRXhpc3RpbmdBcHAiLCJBUFBfSU5TVEFMTF9TVEFURSIsImluc3RhbGxPdGhlckFwa3MiLCJvdGhlckFwcHMiLCJCIiwiYWxsIiwib3RoZXJBcHAiLCJ1bmluc3RhbGxPdGhlclBhY2thZ2VzIiwiYXBwUGFja2FnZXMiLCJmaWx0ZXJQYWNrYWdlcyIsImdldFRoaXJkUGFydHlQYWNrYWdlcyIsInBhY2thZ2VzU3RyaW5nIiwic2hlbGwiLCJhcHBQYWNrYWdlc0FycmF5Iiwic3BsaXQiLCJFT0wiLCJkaWZmZXJlbmNlIiwiZXJyIiwiaW5pdFVuaWNvZGVLZXlib2FyZCIsImRlZmF1bHRJTUUiLCJhcHBpdW1JTUUiLCJlbmFibGVJTUUiLCJzZXRJTUUiLCJzZXRNb2NrTG9jYXRpb25BcHAiLCJnZXRBcGlMZXZlbCIsInBrZ0lkcyIsImZpbGVFeGlzdHMiLCJKU09OIiwicGFyc2UiLCJ0bXBSb290IiwidGVtcERpciIsIm9wZW5EaXIiLCJzcmNQYXRoIiwicGF0aCIsInBvc2l4IiwiYmFzZW5hbWUiLCJmcyIsIndyaXRlRmlsZSIsInN0cmluZ2lmeSIsInB1c2hGaWxlIiwicmltcmFmIiwicmVzZXRNb2NrTG9jYXRpb24iLCJ0aGlyZFBhcnR5UGtnSWRzUHJvbWlzZSIsInRoaXJkUGFydHlQa2dJZHMiLCJyZXN1bHRQa2dzIiwiaW50ZXJzZWN0aW9uIiwic2l6ZSIsInBrZ0lkIiwiaW5zdGFsbEhlbHBlckFwcCIsImFwa1BhdGgiLCJwYWNrYWdlSWQiLCJyZXRyeSIsInJldHJ5SW5zdGFsbEhlbHBlckFwcCIsInB1c2hTZXR0aW5nc0FwcCIsInRocm93RXJyb3IiLCJzZXR0aW5nc0Fwa1BhdGgiLCJwcm9jZXNzRXhpc3RzIiwiYXBpTGV2ZWwiLCJwZXJtcyIsIngiLCJyZXF1aXJlUnVubmluZ1NldHRpbmdzQXBwIiwiaXNFbXVsYXRvciIsInB1c2hTdHJpbmdzIiwicmVtb3RlRGlyIiwic3RyaW5nc0pzb24iLCJyZW1vdGVGaWxlIiwicmVzb2x2ZSIsInB1bGxBcGsiLCJ0bXBEaXIiLCJpc0VtcHR5IiwiZXhpc3RzIiwic3RyaW5nc1RtcERpciIsImFwa1N0cmluZ3MiLCJsb2NhbFBhdGgiLCJleHRyYWN0U3RyaW5nc0Zyb21BcGsiLCJ1bmxvY2tXaXRoSGVscGVyQXBwIiwiZmlyc3RSdW4iLCJsYXVuY2hIZWxwZXIiLCJpc1NjcmVlbkxvY2tlZCIsImRlbGF5IiwidW5sb2NrIiwiZHJpdmVyIiwiY2FwYWJpbGl0aWVzIiwidW5sb2NrS2V5IiwidW5sb2NrU3RyYXRlZ3kiLCJ1bmxvY2tTdWNjZXNzVGltZW91dCIsInVubG9ja2VyIiwidmFsaWRhdGVVbmxvY2tDYXBhYmlsaXRpZXMiLCJGSU5HRVJQUklOVF9VTkxPQ0siLCJpc05pbCIsImlzTG9ja01hbmFnZW1lbnRTdXBwb3J0ZWQiLCJmYXN0VW5sb2NrIiwiY3JlZGVudGlhbCIsImNyZWRlbnRpYWxUeXBlIiwidW5sb2NrTWV0aG9kIiwicGluVW5sb2NrIiwicGluVW5sb2NrV2l0aEtleUV2ZW50IiwicGFzc3dvcmRVbmxvY2siLCJwYXR0ZXJuVW5sb2NrIiwiZmluZ2VycHJpbnRVbmxvY2siLCJ2ZXJpZnlVbmxvY2siLCJ0aW1lb3V0TXMiLCJ3YWl0Rm9yQ29uZGl0aW9uIiwid2FpdE1zIiwiaW50ZXJ2YWxNcyIsImluaXREZXZpY2UiLCJza2lwRGV2aWNlSW5pdGlhbGl6YXRpb24iLCJsb2NhbGVTY3JpcHQiLCJ1bmljb2RlS2V5Ym9hcmQiLCJkaXNhYmxlV2luZG93QW5pbWF0aW9uIiwic2tpcFVubG9jayIsIm1vY2tMb2NhdGlvbkFwcCIsInNraXBMb2djYXRDYXB0dXJlIiwibG9nY2F0Rm9ybWF0IiwibG9nY2F0RmlsdGVyU3BlY3MiLCJ3YWl0Rm9yRGV2aWNlIiwic2hvdWxkVGhyb3dFcnJvciIsImlzVW5kZWZpbmVkIiwic3RhcnRMb2djYXQiLCJmb3JtYXQiLCJmaWx0ZXJTcGVjcyIsInJlbW92ZU51bGxQcm9wZXJ0aWVzIiwib2JqIiwiaXNOdWxsIiwidHJ1bmNhdGVEZWNpbWFscyIsIm51bWJlciIsImRpZ2l0cyIsIm11bHRpcGxpZXIiLCJNYXRoIiwicG93IiwiYWRqdXN0ZWROdW0iLCJ0cnVuY2F0ZWROdW0iLCJpc0Nocm9tZUJyb3dzZXIiLCJnZXRDaHJvbWVQa2ciLCJyZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnMiLCJzZXJ2ZXIiLCJzZXNzaW9uSWQiLCJpc0Z1bmN0aW9uIiwiZ2V0V2ViU29ja2V0SGFuZGxlcnMiLCJhY3RpdmVIYW5kbGVycyIsInBhdGhuYW1lIiwicmVtb3ZlV2ViU29ja2V0SGFuZGxlciIsInBhcnNlQXJyYXkiLCJjYXAiLCJwYXJzZWRDYXBzIiwidmFsaWRhdGVEZXNpcmVkQ2FwcyIsImNhcHMiLCJicm93c2VyTmFtZSIsImFkanVzdEJyb3dzZXJTZXNzaW9uQ2FwcyIsInBvc3NpYmxlTmFtZXMiLCJzb21lIiwidGVzdCIsImJvb3RzdHJhcCIsIkJvb3RzdHJhcCJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9hbmRyb2lkLWhlbHBlcnMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgcmV0cnksIHdhaXRGb3JDb25kaXRpb24gfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCB7IGZzLCB1dGlsLCB0ZW1wRGlyIH0gZnJvbSAnYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHsgcGF0aCBhcyBzZXR0aW5nc0Fwa1BhdGggfSBmcm9tICdpby5hcHBpdW0uc2V0dGluZ3MnO1xuaW1wb3J0IEJvb3RzdHJhcCBmcm9tICcuL2Jvb3RzdHJhcCc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgQURCIGZyb20gJ2FwcGl1bS1hZGInO1xuaW1wb3J0IHtcbiAgZGVmYXVsdCBhcyB1bmxvY2tlciwgUElOX1VOTE9DSywgUElOX1VOTE9DS19LRVlfRVZFTlQsXG4gIFBBU1NXT1JEX1VOTE9DSywgUEFUVEVSTl9VTkxPQ0ssIEZJTkdFUlBSSU5UX1VOTE9DS1xufSBmcm9tICcuL3VubG9jay1oZWxwZXJzJztcbmltcG9ydCB7IEVPTCB9IGZyb20gJ29zJztcbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcblxuY29uc3QgTU9DS19BUFBfSURTX1NUT1JFID0gJy9kYXRhL2xvY2FsL3RtcC9tb2NrX2FwcHMuanNvbic7XG5jb25zdCBQQUNLQUdFX0lOU1RBTExfVElNRU9VVCA9IDkwMDAwOyAvLyBtaWxsaXNlY29uZHNcbi8vIGh0dHBzOi8vY3MuY2hyb21pdW0ub3JnL2Nocm9taXVtL3NyYy9jaHJvbWUvYnJvd3Nlci9kZXZ0b29scy9kZXZpY2UvYW5kcm9pZF9kZXZpY2VfaW5mb19xdWVyeS5jY1xuY29uc3QgQ0hST01FX0JST1dTRVJfUEFDS0FHRV9BQ1RJVklUWSA9IHtcbiAgY2hyb21lOiB7XG4gICAgcGtnOiAnY29tLmFuZHJvaWQuY2hyb21lJyxcbiAgICBhY3Rpdml0eTogJ2NvbS5nb29nbGUuYW5kcm9pZC5hcHBzLmNocm9tZS5NYWluJyxcbiAgfSxcbiAgY2hyb21pdW06IHtcbiAgICBwa2c6ICdvcmcuY2hyb21pdW0uY2hyb21lLnNoZWxsJyxcbiAgICBhY3Rpdml0eTogJy5DaHJvbWVTaGVsbEFjdGl2aXR5JyxcbiAgfSxcbiAgY2hyb21lYmV0YToge1xuICAgIHBrZzogJ2NvbS5jaHJvbWUuYmV0YScsXG4gICAgYWN0aXZpdHk6ICdjb20uZ29vZ2xlLmFuZHJvaWQuYXBwcy5jaHJvbWUuTWFpbicsXG4gIH0sXG4gIGJyb3dzZXI6IHtcbiAgICBwa2c6ICdjb20uYW5kcm9pZC5icm93c2VyJyxcbiAgICBhY3Rpdml0eTogJ2NvbS5hbmRyb2lkLmJyb3dzZXIuQnJvd3NlckFjdGl2aXR5JyxcbiAgfSxcbiAgJ2Nocm9taXVtLWJyb3dzZXInOiB7XG4gICAgcGtnOiAnb3JnLmNocm9taXVtLmNocm9tZScsXG4gICAgYWN0aXZpdHk6ICdjb20uZ29vZ2xlLmFuZHJvaWQuYXBwcy5jaHJvbWUuTWFpbicsXG4gIH0sXG4gICdjaHJvbWl1bS13ZWJ2aWV3Jzoge1xuICAgIHBrZzogJ29yZy5jaHJvbWl1bS53ZWJ2aWV3X3NoZWxsJyxcbiAgICBhY3Rpdml0eTogJ29yZy5jaHJvbWl1bS53ZWJ2aWV3X3NoZWxsLldlYlZpZXdCcm93c2VyQWN0aXZpdHknLFxuICB9LFxuICBkZWZhdWx0OiB7XG4gICAgcGtnOiAnY29tLmFuZHJvaWQuY2hyb21lJyxcbiAgICBhY3Rpdml0eTogJ2NvbS5nb29nbGUuYW5kcm9pZC5hcHBzLmNocm9tZS5NYWluJyxcbiAgfSxcbn07XG5jb25zdCBTRVRUSU5HU19IRUxQRVJfUEtHX0lEID0gJ2lvLmFwcGl1bS5zZXR0aW5ncyc7XG5jb25zdCBTRVRUSU5HU19IRUxQRVJfVU5MT0NLX0FDVElWSVRZID0gJy5VbmxvY2snO1xuY29uc3QgRU1VTEFUT1JfUEFUVEVSTiA9IC9cXGJlbXVsYXRvclxcYi9pO1xuLy8gVGhlc2UgY29uc3RhbnRzIGFyZSBpbiBzeW5jIHdpdGhcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9kb2N1bWVudGF0aW9uL3hjdGVzdC94Y3VpYXBwbGljYXRpb25zdGF0ZS94Y3VpYXBwbGljYXRpb25zdGF0ZXJ1bm5pbmdiYWNrZ3JvdW5kP2xhbmd1YWdlPW9iamNcbmNvbnN0IEFQUF9TVEFURSA9IE9iamVjdC5mcmVlemUoe1xuICBOT1RfSU5TVEFMTEVEOiAwLFxuICBOT1RfUlVOTklORzogMSxcbiAgUlVOTklOR19JTl9CQUNLR1JPVU5EOiAzLFxuICBSVU5OSU5HX0lOX0ZPUkVHUk9VTkQ6IDRcbn0pO1xuXG5cbmZ1bmN0aW9uIGVuc3VyZU5ldHdvcmtTcGVlZCAoYWRiLCBuZXR3b3JrU3BlZWQpIHtcbiAgaWYgKF8udmFsdWVzKGFkYi5ORVRXT1JLX1NQRUVEKS5pbmNsdWRlcyhuZXR3b3JrU3BlZWQpKSB7XG4gICAgcmV0dXJuIG5ldHdvcmtTcGVlZDtcbiAgfVxuICBsb2dnZXIud2FybihgV3JvbmcgbmV0d29yayBzcGVlZCBwYXJhbSAnJHtuZXR3b3JrU3BlZWR9JywgdXNpbmcgZGVmYXVsdDogJHthZGIuTkVUV09SS19TUEVFRC5GVUxMfS4gYCArXG4gICAgYFN1cHBvcnRlZCB2YWx1ZXM6ICR7Xy52YWx1ZXMoYWRiLk5FVFdPUktfU1BFRUQpfWApO1xuICByZXR1cm4gYWRiLk5FVFdPUktfU1BFRUQuRlVMTDtcbn1cblxuZnVuY3Rpb24gcHJlcGFyZUF2ZEFyZ3MgKGFkYiwgb3B0cykge1xuICBjb25zdCB7XG4gICAgbmV0d29ya1NwZWVkLFxuICAgIGlzSGVhZGxlc3MsXG4gICAgYXZkQXJncyxcbiAgfSA9IG9wdHM7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBpZiAoYXZkQXJncykge1xuICAgIGlmIChfLmlzQXJyYXkoYXZkQXJncykpIHtcbiAgICAgIHJlc3VsdC5wdXNoKC4uLmF2ZEFyZ3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQucHVzaCguLi4odXRpbC5zaGVsbFBhcnNlKGAke2F2ZEFyZ3N9YCkpKTtcbiAgICB9XG4gIH1cbiAgaWYgKG5ldHdvcmtTcGVlZCkge1xuICAgIHJlc3VsdC5wdXNoKCctbmV0c3BlZWQnLCBlbnN1cmVOZXR3b3JrU3BlZWQoYWRiLCBuZXR3b3JrU3BlZWQpKTtcbiAgfVxuICBpZiAoaXNIZWFkbGVzcykge1xuICAgIHJlc3VsdC5wdXNoKCctbm8td2luZG93Jyk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gdG9DcmVkZW50aWFsVHlwZSAodW5sb2NrVHlwZSkge1xuICBjb25zdCByZXN1bHQgPSB7XG4gICAgW1BJTl9VTkxPQ0tdOiAncGluJyxcbiAgICBbUElOX1VOTE9DS19LRVlfRVZFTlRdOiAncGluJyxcbiAgICBbUEFTU1dPUkRfVU5MT0NLXTogJ3Bhc3N3b3JkJyxcbiAgICBbUEFUVEVSTl9VTkxPQ0tdOiAncGF0dGVybicsXG4gIH1bdW5sb2NrVHlwZV07XG4gIGlmIChyZXN1bHQpIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgVW5sb2NrIHR5cGUgJyR7dW5sb2NrVHlwZX0nIGlzIG5vdCBrbm93bmApO1xufVxuXG5cbmNvbnN0IGhlbHBlcnMgPSB7fTtcblxuaGVscGVycy5jcmVhdGVCYXNlQURCID0gYXN5bmMgZnVuY3Rpb24gY3JlYXRlQmFzZUFEQiAob3B0cyA9IHt9KSB7XG4gIC8vIGZpbHRlciBvdXQgYW55IHVud2FudGVkIG9wdGlvbnMgc2VudCBpblxuICAvLyB0aGlzIGxpc3Qgc2hvdWxkIGJlIHVwZGF0ZWQgYXMgQURCIHRha2VzIG1vcmUgYXJndW1lbnRzXG4gIGNvbnN0IHtcbiAgICBhZGJQb3J0LFxuICAgIHN1cHByZXNzS2lsbFNlcnZlcixcbiAgICByZW1vdGVBZGJIb3N0LFxuICAgIGNsZWFyRGV2aWNlTG9nc09uU3RhcnQsXG4gICAgYWRiRXhlY1RpbWVvdXQsXG4gICAgdXNlS2V5c3RvcmUsXG4gICAga2V5c3RvcmVQYXRoLFxuICAgIGtleXN0b3JlUGFzc3dvcmQsXG4gICAga2V5QWxpYXMsXG4gICAga2V5UGFzc3dvcmQsXG4gICAgcmVtb3RlQXBwc0NhY2hlTGltaXQsXG4gICAgYnVpbGRUb29sc1ZlcnNpb24sXG4gICAgYWxsb3dPZmZsaW5lRGV2aWNlcyxcbiAgICBhbGxvd0RlbGF5QWRiLFxuICB9ID0gb3B0cztcbiAgcmV0dXJuIGF3YWl0IEFEQi5jcmVhdGVBREIoe1xuICAgIGFkYlBvcnQsXG4gICAgc3VwcHJlc3NLaWxsU2VydmVyLFxuICAgIHJlbW90ZUFkYkhvc3QsXG4gICAgY2xlYXJEZXZpY2VMb2dzT25TdGFydCxcbiAgICBhZGJFeGVjVGltZW91dCxcbiAgICB1c2VLZXlzdG9yZSxcbiAgICBrZXlzdG9yZVBhdGgsXG4gICAga2V5c3RvcmVQYXNzd29yZCxcbiAgICBrZXlBbGlhcyxcbiAgICBrZXlQYXNzd29yZCxcbiAgICByZW1vdGVBcHBzQ2FjaGVMaW1pdCxcbiAgICBidWlsZFRvb2xzVmVyc2lvbixcbiAgICBhbGxvd09mZmxpbmVEZXZpY2VzLFxuICAgIGFsbG93RGVsYXlBZGIsXG4gIH0pO1xufTtcblxuaGVscGVycy5wcmVwYXJlRW11bGF0b3IgPSBhc3luYyBmdW5jdGlvbiBwcmVwYXJlRW11bGF0b3IgKGFkYiwgb3B0cykge1xuICBjb25zdCB7XG4gICAgYXZkLFxuICAgIGF2ZEVudjogZW52LFxuICAgIGxhbmd1YWdlLFxuICAgIGxvY2FsZTogY291bnRyeSxcbiAgICBhdmRMYXVuY2hUaW1lb3V0OiBsYXVuY2hUaW1lb3V0LFxuICAgIGF2ZFJlYWR5VGltZW91dDogcmVhZHlUaW1lb3V0LFxuICB9ID0gb3B0cztcbiAgaWYgKCFhdmQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBsYXVuY2ggQVZEIHdpdGhvdXQgQVZEIG5hbWUnKTtcbiAgfVxuXG4gIGNvbnN0IGF2ZE5hbWUgPSBhdmQucmVwbGFjZSgnQCcsICcnKTtcbiAgbGV0IGlzRW11bGF0b3JSdW5uaW5nID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBhZGIuZ2V0UnVubmluZ0FWRFdpdGhSZXRyeShhdmROYW1lLCA1MDAwKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgRW11bGF0b3IgJyR7YXZkTmFtZX0nIGlzIG5vdCBydW5uaW5nOiAke2UubWVzc2FnZX1gKTtcbiAgICBpc0VtdWxhdG9yUnVubmluZyA9IGZhbHNlO1xuICB9XG4gIGNvbnN0IGFyZ3MgPSBwcmVwYXJlQXZkQXJncyhhZGIsIG9wdHMpO1xuICBpZiAoaXNFbXVsYXRvclJ1bm5pbmcpIHtcbiAgICBpZiAoYXJncy5pbmNsdWRlcygnLXdpcGUtZGF0YScpKSB7XG4gICAgICBsb2dnZXIuZGVidWcoYEtpbGxpbmcgJyR7YXZkTmFtZX0nIGJlY2F1c2UgaXQgbmVlZHMgdG8gYmUgd2lwZWQgYXQgc3RhcnQuYCk7XG4gICAgICBhd2FpdCBhZGIua2lsbEVtdWxhdG9yKGF2ZE5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2dnZXIuZGVidWcoJ05vdCBsYXVuY2hpbmcgQVZEIGJlY2F1c2UgaXQgaXMgYWxyZWFkeSBydW5uaW5nLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuICBhd2FpdCBhZGIubGF1bmNoQVZEKGF2ZCwge1xuICAgIGFyZ3MsXG4gICAgZW52LFxuICAgIGxhbmd1YWdlLFxuICAgIGNvdW50cnksXG4gICAgbGF1bmNoVGltZW91dCxcbiAgICByZWFkeVRpbWVvdXQsXG4gIH0pO1xufTtcblxuLyoqXG4gKiBTZXQgYW5kIGVuc3VyZSB0aGUgbG9jYWxlIG5hbWUgb2YgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBhZGIgLSBUaGUgYWRiIG1vZHVsZSBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBsYW5ndWFnZSAtIExhbmd1YWdlLiBUaGUgbGFuZ3VhZ2UgZmllbGQgaXMgY2FzZSBpbnNlbnNpdGl2ZSwgYnV0IExvY2FsZSBhbHdheXMgY2Fub25pY2FsaXplcyB0byBsb3dlciBjYXNlLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0OiBbYS16QS1aXXsyLDh9LiBlLmcuIGVuLCBqYSA6IGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9qYXZhL3V0aWwvTG9jYWxlLmh0bWxcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb3VudHJ5IC0gQ291bnRyeS4gVGhlIGNvdW50cnkgKHJlZ2lvbikgZmllbGQgaXMgY2FzZSBpbnNlbnNpdGl2ZSwgYnV0IExvY2FsZSBhbHdheXMgY2Fub25pY2FsaXplcyB0byB1cHBlciBjYXNlLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0OiBbYS16QS1aXXsyfSB8IFswLTldezN9LiBlLmcuIFVTLCBKUCA6IGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9qYXZhL3V0aWwvTG9jYWxlLmh0bWxcbiAqIEBwYXJhbSB7P3N0cmluZ30gc2NyaXB0IC0gU2NyaXB0LiBUaGUgc2NyaXB0IGZpZWxkIGlzIGNhc2UgaW5zZW5zaXRpdmUgYnV0IExvY2FsZSBhbHdheXMgY2Fub25pY2FsaXplcyB0byB0aXRsZSBjYXNlLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0OiBbYS16QS1aXXs0fS4gZS5nLiBIYW5zIGluIHpoLUhhbnMtQ04gOiBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvamF2YS91dGlsL0xvY2FsZS5odG1sXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgaXQgZmFpbGVkIHRvIHNldCBsb2NhbGUgcHJvcGVybHlcbiAqL1xuaGVscGVycy5lbnN1cmVEZXZpY2VMb2NhbGUgPSBhc3luYyBmdW5jdGlvbiBlbnN1cmVEZXZpY2VMb2NhbGUgKGFkYiwgbGFuZ3VhZ2UsIGNvdW50cnksIHNjcmlwdCA9IG51bGwpIHtcbiAgaWYgKCFfLmlzU3RyaW5nKGxhbmd1YWdlKSAmJiAhXy5pc1N0cmluZyhjb3VudHJ5KSkge1xuICAgIGxvZ2dlci53YXJuKGBzZXREZXZpY2VMYW5ndWFnZUNvdW50cnkgcmVxdWlyZXMgbGFuZ3VhZ2Ugb3IgY291bnRyeS5gKTtcbiAgICBsb2dnZXIud2FybihgR290IGxhbmd1YWdlOiAnJHtsYW5ndWFnZX0nIGFuZCBjb3VudHJ5OiAnJHtjb3VudHJ5fSdgKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBhd2FpdCBhZGIuc2V0RGV2aWNlTGFuZ3VhZ2VDb3VudHJ5KGxhbmd1YWdlLCBjb3VudHJ5LCBzY3JpcHQpO1xuXG4gIGlmICghYXdhaXQgYWRiLmVuc3VyZUN1cnJlbnRMb2NhbGUobGFuZ3VhZ2UsIGNvdW50cnksIHNjcmlwdCkpIHtcbiAgICBjb25zdCBtZXNzYWdlID0gc2NyaXB0ID8gYGxhbmd1YWdlOiAke2xhbmd1YWdlfSwgY291bnRyeTogJHtjb3VudHJ5fSBhbmQgc2NyaXB0OiAke3NjcmlwdH1gIDogYGxhbmd1YWdlOiAke2xhbmd1YWdlfSBhbmQgY291bnRyeTogJHtjb3VudHJ5fWA7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gc2V0ICR7bWVzc2FnZX1gKTtcbiAgfVxufTtcblxuaGVscGVycy5nZXREZXZpY2VJbmZvRnJvbUNhcHMgPSBhc3luYyBmdW5jdGlvbiBnZXREZXZpY2VJbmZvRnJvbUNhcHMgKG9wdHMgPSB7fSkge1xuICAvLyB3ZSBjYW4gY3JlYXRlIGEgdGhyb3dhd2F5IEFEQiBpbnN0YW5jZSBoZXJlLCBzbyB0aGVyZSBpcyBubyBkZXBlbmRlbmN5XG4gIC8vIG9uIGluc3RhbnRpYXRpbmcgb24gZWFybGllciAoYXQgdGhpcyBwb2ludCwgd2UgaGF2ZSBubyB1ZGlkKVxuICAvLyB3ZSBjYW4gb25seSB1c2UgdGhpcyBBREIgb2JqZWN0IGZvciBjb21tYW5kcyB0aGF0IHdvdWxkIG5vdCBiZSBjb25mdXNlZFxuICAvLyBpZiBtdWx0aXBsZSBkZXZpY2VzIGFyZSBjb25uZWN0ZWRcbiAgY29uc3QgYWRiID0gYXdhaXQgaGVscGVycy5jcmVhdGVCYXNlQURCKG9wdHMpO1xuICBsZXQgdWRpZCA9IG9wdHMudWRpZDtcbiAgbGV0IGVtUG9ydCA9IG51bGw7XG5cbiAgLy8gYSBzcGVjaWZpYyBhdmQgbmFtZSB3YXMgZ2l2ZW4uIHRyeSB0byBpbml0aWFsaXplIHdpdGggdGhhdFxuICBpZiAob3B0cy5hdmQpIHtcbiAgICBhd2FpdCBoZWxwZXJzLnByZXBhcmVFbXVsYXRvcihhZGIsIG9wdHMpO1xuICAgIHVkaWQgPSBhZGIuY3VyRGV2aWNlSWQ7XG4gICAgZW1Qb3J0ID0gYWRiLmVtdWxhdG9yUG9ydDtcbiAgfSBlbHNlIHtcbiAgICAvLyBubyBhdmQgZ2l2ZW4uIGxldHMgdHJ5IHdoYXRldmVyJ3MgcGx1Z2dlZCBpbiBkZXZpY2VzL2VtdWxhdG9yc1xuICAgIGxvZ2dlci5pbmZvKCdSZXRyaWV2aW5nIGRldmljZSBsaXN0Jyk7XG4gICAgbGV0IGRldmljZXMgPSBhd2FpdCBhZGIuZ2V0RGV2aWNlc1dpdGhSZXRyeSgpO1xuXG4gICAgLy8gdWRpZCB3YXMgZ2l2ZW4sIGxldHMgdHJ5IHRvIGluaXQgd2l0aCB0aGF0IGRldmljZVxuICAgIGlmICh1ZGlkKSB7XG4gICAgICBpZiAoIV8uaW5jbHVkZXMoXy5tYXAoZGV2aWNlcywgJ3VkaWQnKSwgdWRpZCkpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coYERldmljZSAke3VkaWR9IHdhcyBub3QgaW4gdGhlIGxpc3Qgb2YgY29ubmVjdGVkIGRldmljZXNgKTtcbiAgICAgIH1cbiAgICAgIGVtUG9ydCA9IGFkYi5nZXRQb3J0RnJvbUVtdWxhdG9yU3RyaW5nKHVkaWQpO1xuICAgIH0gZWxzZSBpZiAob3B0cy5wbGF0Zm9ybVZlcnNpb24pIHtcbiAgICAgIG9wdHMucGxhdGZvcm1WZXJzaW9uID0gYCR7b3B0cy5wbGF0Zm9ybVZlcnNpb259YC50cmltKCk7XG5cbiAgICAgIC8vIGEgcGxhdGZvcm0gdmVyc2lvbiB3YXMgZ2l2ZW4uIGxldHMgdHJ5IHRvIGZpbmQgYSBkZXZpY2Ugd2l0aCB0aGUgc2FtZSBvc1xuICAgICAgY29uc3QgcGxhdGZvcm1WZXJzaW9uID0gc2VtdmVyLmNvZXJjZShvcHRzLnBsYXRmb3JtVmVyc2lvbikgfHwgb3B0cy5wbGF0Zm9ybVZlcnNpb247XG4gICAgICBsb2dnZXIuaW5mbyhgTG9va2luZyBmb3IgYSBkZXZpY2Ugd2l0aCBBbmRyb2lkICcke3BsYXRmb3JtVmVyc2lvbn0nYCk7XG5cbiAgICAgIC8vIGluIGNhc2Ugd2UgZmFpbCB0byBmaW5kIHNvbWV0aGluZywgZ2l2ZSB0aGUgdXNlciBhIHVzZWZ1bCBsb2cgdGhhdCBoYXNcbiAgICAgIC8vIHRoZSBkZXZpY2UgdWRpZHMgYW5kIG9zIHZlcnNpb25zIHNvIHRoZXkga25vdyB3aGF0J3MgYXZhaWxhYmxlXG4gICAgICBjb25zdCBhdmFpbERldmljZXMgPSBbXTtcbiAgICAgIGxldCBwYXJ0aWFsTWF0Y2hDYW5kaWRhdGUgPSBudWxsO1xuICAgICAgLy8gZmlyc3QgdHJ5IHN0YXJ0ZWQgZGV2aWNlcy9lbXVsYXRvcnNcbiAgICAgIGZvciAoY29uc3QgZGV2aWNlIG9mIGRldmljZXMpIHtcbiAgICAgICAgLy8gZGlyZWN0IGFkYiBjYWxscyB0byB0aGUgc3BlY2lmaWMgZGV2aWNlXG4gICAgICAgIGF3YWl0IGFkYi5zZXREZXZpY2VJZChkZXZpY2UudWRpZCk7XG4gICAgICAgIGNvbnN0IHJhd0RldmljZU9TID0gYXdhaXQgYWRiLmdldFBsYXRmb3JtVmVyc2lvbigpO1xuICAgICAgICAvLyBUaGUgZGV2aWNlIE9TIGNvdWxkIGVpdGhlciBiZSBhIG51bWJlciwgbGlrZSBgNi4wYFxuICAgICAgICAvLyBvciBhbiBhYmJyZXZpYXRpb24sIGxpa2UgYFJgXG4gICAgICAgIGF2YWlsRGV2aWNlcy5wdXNoKGAke2RldmljZS51ZGlkfSAoJHtyYXdEZXZpY2VPU30pYCk7XG4gICAgICAgIGNvbnN0IGRldmljZU9TID0gc2VtdmVyLmNvZXJjZShyYXdEZXZpY2VPUykgfHwgcmF3RGV2aWNlT1M7XG4gICAgICAgIGlmICghZGV2aWNlT1MpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJvdGhWZXJzaW9uc0NhbkJlQ29lcmNlZCA9IHNlbXZlci52YWxpZChkZXZpY2VPUykgJiYgc2VtdmVyLnZhbGlkKHBsYXRmb3JtVmVyc2lvbik7XG4gICAgICAgIGNvbnN0IGJvdGhWZXJzaW9uc0FyZVN0cmluZ3MgPSBfLmlzU3RyaW5nKGRldmljZU9TKSAmJiBfLmlzU3RyaW5nKHBsYXRmb3JtVmVyc2lvbik7XG4gICAgICAgIGlmIChib3RoVmVyc2lvbnNDYW5CZUNvZXJjZWQgJiYgZGV2aWNlT1MudmVyc2lvbiA9PT0gcGxhdGZvcm1WZXJzaW9uLnZlcnNpb25cbiAgICAgICAgICAgIHx8IGJvdGhWZXJzaW9uc0FyZVN0cmluZ3MgJiYgXy50b0xvd2VyKGRldmljZU9TKSA9PT0gXy50b0xvd2VyKHBsYXRmb3JtVmVyc2lvbikpIHtcbiAgICAgICAgICAvLyBHb3QgYW4gZXhhY3QgbWF0Y2ggLSBwcm9jZWVkIGltbWVkaWF0ZWx5XG4gICAgICAgICAgdWRpZCA9IGRldmljZS51ZGlkO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2UgaWYgKCFib3RoVmVyc2lvbnNDYW5CZUNvZXJjZWQpIHtcbiAgICAgICAgICAvLyBUaGVyZSBpcyBubyBwb2ludCB0byBjaGVjayBmb3IgcGFydGlhbCBtYXRjaCBpZiBlaXRoZXIgb2YgdmVyc2lvbiBudW1iZXJzIGlzIG5vdCBjb2VyY2libGVcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgoIV8uaW5jbHVkZXMob3B0cy5wbGF0Zm9ybVZlcnNpb24sICcuJykgJiYgcGxhdGZvcm1WZXJzaW9uLm1ham9yID09PSBkZXZpY2VPUy5tYWpvclxuICAgICAgICAgICAgfHwgcGxhdGZvcm1WZXJzaW9uLm1ham9yID09PSBkZXZpY2VPUy5tYWpvciAmJiBwbGF0Zm9ybVZlcnNpb24ubWlub3IgPT09IGRldmljZU9TLm1pbm9yKVxuICAgICAgICAgICAgLy8gR290IGEgcGFydGlhbCBtYXRjaCAtIG1ha2Ugc3VyZSB3ZSBjb25zaWRlciB0aGUgbW9zdCByZWNlbnRcbiAgICAgICAgICAgIC8vIGRldmljZSB2ZXJzaW9uIGF2YWlsYWJsZSBvbiB0aGUgaG9zdCBzeXN0ZW1cbiAgICAgICAgICAgICYmIChwYXJ0aWFsTWF0Y2hDYW5kaWRhdGUgJiYgc2VtdmVyLmd0KGRldmljZU9TLCBfLnZhbHVlcyhwYXJ0aWFsTWF0Y2hDYW5kaWRhdGUpWzBdKVxuICAgICAgICAgICAgICAgIHx8ICFwYXJ0aWFsTWF0Y2hDYW5kaWRhdGUpKSB7XG4gICAgICAgICAgcGFydGlhbE1hdGNoQ2FuZGlkYXRlID0ge1tkZXZpY2UudWRpZF06IGRldmljZU9TfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCF1ZGlkICYmIHBhcnRpYWxNYXRjaENhbmRpZGF0ZSkge1xuICAgICAgICB1ZGlkID0gXy5rZXlzKHBhcnRpYWxNYXRjaENhbmRpZGF0ZSlbMF07XG4gICAgICAgIGF3YWl0IGFkYi5zZXREZXZpY2VJZCh1ZGlkKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF1ZGlkKSB7XG4gICAgICAgIC8vIHdlIGNvdWxkbid0IGZpbmQgYW55dGhpbmchIHF1aXRcbiAgICAgICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coYFVuYWJsZSB0byBmaW5kIGFuIGFjdGl2ZSBkZXZpY2Ugb3IgZW11bGF0b3IgYCArXG4gICAgICAgICAgYHdpdGggT1MgJHtvcHRzLnBsYXRmb3JtVmVyc2lvbn0uIFRoZSBmb2xsb3dpbmcgYXJlIGF2YWlsYWJsZTogYCArXG4gICAgICAgICAgYXZhaWxEZXZpY2VzLmpvaW4oJywgJykpO1xuICAgICAgfVxuXG4gICAgICBlbVBvcnQgPSBhZGIuZ2V0UG9ydEZyb21FbXVsYXRvclN0cmluZyh1ZGlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gYSB1ZGlkIHdhcyBub3QgZ2l2ZW4sIGdyYWIgdGhlIGZpcnN0IGRldmljZSB3ZSBzZWVcbiAgICAgIHVkaWQgPSBkZXZpY2VzWzBdLnVkaWQ7XG4gICAgICBlbVBvcnQgPSBhZGIuZ2V0UG9ydEZyb21FbXVsYXRvclN0cmluZyh1ZGlkKTtcbiAgICB9XG4gIH1cblxuICBsb2dnZXIuaW5mbyhgVXNpbmcgZGV2aWNlOiAke3VkaWR9YCk7XG4gIHJldHVybiB7dWRpZCwgZW1Qb3J0fTtcbn07XG5cbi8vIHJldHVybnMgYSBuZXcgYWRiIGluc3RhbmNlIHdpdGggZGV2aWNlSWQgc2V0XG5oZWxwZXJzLmNyZWF0ZUFEQiA9IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUFEQiAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHt1ZGlkLCBlbVBvcnR9ID0gb3B0cztcbiAgY29uc3QgYWRiID0gYXdhaXQgaGVscGVycy5jcmVhdGVCYXNlQURCKG9wdHMpO1xuICBhZGIuc2V0RGV2aWNlSWQodWRpZCk7XG4gIGlmIChlbVBvcnQpIHtcbiAgICBhZGIuc2V0RW11bGF0b3JQb3J0KGVtUG9ydCk7XG4gIH1cblxuICByZXR1cm4gYWRiO1xufTtcblxuaGVscGVycy52YWxpZGF0ZVBhY2thZ2VBY3Rpdml0eU5hbWVzID0gZnVuY3Rpb24gdmFsaWRhdGVQYWNrYWdlQWN0aXZpdHlOYW1lcyAob3B0cykge1xuICBmb3IgKGNvbnN0IGtleSBvZiBbJ2FwcFBhY2thZ2UnLCAnYXBwQWN0aXZpdHknLCAnYXBwV2FpdFBhY2thZ2UnLCAnYXBwV2FpdEFjdGl2aXR5J10pIHtcbiAgICBjb25zdCBuYW1lID0gb3B0c1trZXldO1xuICAgIGlmICghbmFtZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgbWF0Y2ggPSAvKFteXFx3LiosXSkrLy5leGVjKG5hbWUpO1xuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGxvZ2dlci53YXJuKGBDYXBhYmlsaXR5ICcke2tleX0nIGlzIGV4cGVjdGVkIHRvIG9ubHkgaW5jbHVkZSBsYXRpbiBsZXR0ZXJzLCBkaWdpdHMsIHVuZGVyc2NvcmUsIGRvdCwgY29tbWEgYW5kIGFzdGVyaXNrIGNoYXJhY3RlcnMuYCk7XG4gICAgbG9nZ2VyLndhcm4oYEN1cnJlbnQgdmFsdWUgJyR7bmFtZX0nIGhhcyBub24tbWF0Y2hpbmcgY2hhcmFjdGVyIGF0IGluZGV4ICR7bWF0Y2guaW5kZXh9OiAnJHtuYW1lLnN1YnN0cmluZygwLCBtYXRjaC5pbmRleCArIDEpfSdgKTtcbiAgfVxufTtcblxuaGVscGVycy5nZXRMYXVuY2hJbmZvID0gYXN5bmMgZnVuY3Rpb24gZ2V0TGF1bmNoSW5mbyAoYWRiLCBvcHRzKSB7XG4gIGxldCB7YXBwLCBhcHBQYWNrYWdlLCBhcHBBY3Rpdml0eSwgYXBwV2FpdFBhY2thZ2UsIGFwcFdhaXRBY3Rpdml0eX0gPSBvcHRzO1xuICBpZiAoIWFwcCkge1xuICAgIGxvZ2dlci53YXJuKCdObyBhcHAgc2VudCBpbiwgbm90IHBhcnNpbmcgcGFja2FnZS9hY3Rpdml0eScpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMudmFsaWRhdGVQYWNrYWdlQWN0aXZpdHlOYW1lcyhvcHRzKTtcblxuICBpZiAoYXBwUGFja2FnZSAmJiBhcHBBY3Rpdml0eSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxvZ2dlci5kZWJ1ZygnUGFyc2luZyBwYWNrYWdlIGFuZCBhY3Rpdml0eSBmcm9tIGFwcCBtYW5pZmVzdCcpO1xuICBsZXQge2Fwa1BhY2thZ2UsIGFwa0FjdGl2aXR5fSA9XG4gICAgYXdhaXQgYWRiLnBhY2thZ2VBbmRMYXVuY2hBY3Rpdml0eUZyb21NYW5pZmVzdChhcHApO1xuICBpZiAoYXBrUGFja2FnZSAmJiAhYXBwUGFja2FnZSkge1xuICAgIGFwcFBhY2thZ2UgPSBhcGtQYWNrYWdlO1xuICB9XG4gIGlmICghYXBwV2FpdFBhY2thZ2UpIHtcbiAgICBhcHBXYWl0UGFja2FnZSA9IGFwcFBhY2thZ2U7XG4gIH1cbiAgaWYgKGFwa0FjdGl2aXR5ICYmICFhcHBBY3Rpdml0eSkge1xuICAgIGFwcEFjdGl2aXR5ID0gYXBrQWN0aXZpdHk7XG4gIH1cbiAgaWYgKCFhcHBXYWl0QWN0aXZpdHkpIHtcbiAgICBhcHBXYWl0QWN0aXZpdHkgPSBhcHBBY3Rpdml0eTtcbiAgfVxuICBsb2dnZXIuZGVidWcoYFBhcnNlZCBwYWNrYWdlIGFuZCBhY3Rpdml0eSBhcmU6ICR7YXBrUGFja2FnZX0vJHthcGtBY3Rpdml0eX1gKTtcbiAgcmV0dXJuIHthcHBQYWNrYWdlLCBhcHBXYWl0UGFja2FnZSwgYXBwQWN0aXZpdHksIGFwcFdhaXRBY3Rpdml0eX07XG59O1xuXG5oZWxwZXJzLnJlc2V0QXBwID0gYXN5bmMgZnVuY3Rpb24gcmVzZXRBcHAgKGFkYiwgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgYXBwUGFja2FnZSxcbiAgICBmYXN0UmVzZXQsXG4gICAgZnVsbFJlc2V0LFxuICAgIGFuZHJvaWRJbnN0YWxsVGltZW91dCA9IFBBQ0tBR0VfSU5TVEFMTF9USU1FT1VULFxuICAgIGF1dG9HcmFudFBlcm1pc3Npb25zLFxuICAgIGFsbG93VGVzdFBhY2thZ2VzXG4gIH0gPSBvcHRzO1xuXG4gIGlmICghYXBwUGFja2FnZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIidhcHBQYWNrYWdlJyBvcHRpb24gaXMgcmVxdWlyZWRcIik7XG4gIH1cblxuICBjb25zdCBpc0luc3RhbGxlZCA9IGF3YWl0IGFkYi5pc0FwcEluc3RhbGxlZChhcHBQYWNrYWdlKTtcblxuICBpZiAoaXNJbnN0YWxsZWQpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgYWRiLmZvcmNlU3RvcChhcHBQYWNrYWdlKTtcbiAgICB9IGNhdGNoIChpZ24pIHt9XG4gICAgLy8gZnVsbFJlc2V0IGhhcyBwcmlvcml0eSBvdmVyIGZhc3RSZXNldFxuICAgIGlmICghZnVsbFJlc2V0ICYmIGZhc3RSZXNldCkge1xuICAgICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgYWRiLmNsZWFyKGFwcFBhY2thZ2UpO1xuICAgICAgaWYgKF8uaXNTdHJpbmcob3V0cHV0KSAmJiBvdXRwdXQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnZmFpbGVkJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY2xlYXIgdGhlIGFwcGxpY2F0aW9uIGRhdGEgb2YgJyR7YXBwUGFja2FnZX0nLiBPcmlnaW5hbCBlcnJvcjogJHtvdXRwdXR9YCk7XG4gICAgICB9XG4gICAgICAvLyBleGVjdXRpbmcgYHNoZWxsIHBtIGNsZWFyYCByZXNldHMgcHJldmlvdXNseSBhc3NpZ25lZCBhcHBsaWNhdGlvbiBwZXJtaXNzaW9ucyBhcyB3ZWxsXG4gICAgICBpZiAoYXV0b0dyYW50UGVybWlzc2lvbnMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBhZGIuZ3JhbnRBbGxQZXJtaXNzaW9ucyhhcHBQYWNrYWdlKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoYFVuYWJsZSB0byBncmFudCBwZXJtaXNzaW9ucyByZXF1ZXN0ZWQuIE9yaWdpbmFsIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxvZ2dlci5kZWJ1ZyhgUGVyZm9ybWVkIGZhc3QgcmVzZXQgb24gdGhlIGluc3RhbGxlZCAnJHthcHBQYWNrYWdlfScgYXBwbGljYXRpb24gKHN0b3AgYW5kIGNsZWFyKWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGlmICghYXBwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiJ2FwcCcgb3B0aW9uIGlzIHJlcXVpcmVkIGZvciByZWluc3RhbGxcIik7XG4gIH1cblxuICBsb2dnZXIuZGVidWcoYFJ1bm5pbmcgZnVsbCByZXNldCBvbiAnJHthcHBQYWNrYWdlfScgKHJlaW5zdGFsbClgKTtcbiAgaWYgKGlzSW5zdGFsbGVkKSB7XG4gICAgYXdhaXQgYWRiLnVuaW5zdGFsbEFwayhhcHBQYWNrYWdlKTtcbiAgfVxuICBhd2FpdCBhZGIuaW5zdGFsbChhcHAsIHtcbiAgICBncmFudFBlcm1pc3Npb25zOiBhdXRvR3JhbnRQZXJtaXNzaW9ucyxcbiAgICB0aW1lb3V0OiBhbmRyb2lkSW5zdGFsbFRpbWVvdXQsXG4gICAgYWxsb3dUZXN0UGFja2FnZXMsXG4gIH0pO1xufTtcblxuaGVscGVycy5pbnN0YWxsQXBrID0gYXN5bmMgZnVuY3Rpb24gaW5zdGFsbEFwayAoYWRiLCBvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBhcHBQYWNrYWdlLFxuICAgIGZhc3RSZXNldCxcbiAgICBmdWxsUmVzZXQsXG4gICAgYW5kcm9pZEluc3RhbGxUaW1lb3V0ID0gUEFDS0FHRV9JTlNUQUxMX1RJTUVPVVQsXG4gICAgYXV0b0dyYW50UGVybWlzc2lvbnMsXG4gICAgYWxsb3dUZXN0UGFja2FnZXMsXG4gICAgZW5mb3JjZUFwcEluc3RhbGwsXG4gIH0gPSBvcHRzO1xuXG4gIGlmICghYXBwIHx8ICFhcHBQYWNrYWdlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiJ2FwcCcgYW5kICdhcHBQYWNrYWdlJyBvcHRpb25zIGFyZSByZXF1aXJlZFwiKTtcbiAgfVxuXG4gIGlmIChmdWxsUmVzZXQpIHtcbiAgICBhd2FpdCB0aGlzLnJlc2V0QXBwKGFkYiwgb3B0cyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qge1xuICAgIGFwcFN0YXRlLFxuICAgIHdhc1VuaW5zdGFsbGVkXG4gIH0gPSBhd2FpdCBhZGIuaW5zdGFsbE9yVXBncmFkZShhcHAsIGFwcFBhY2thZ2UsIHtcbiAgICBncmFudFBlcm1pc3Npb25zOiBhdXRvR3JhbnRQZXJtaXNzaW9ucyxcbiAgICB0aW1lb3V0OiBhbmRyb2lkSW5zdGFsbFRpbWVvdXQsXG4gICAgYWxsb3dUZXN0UGFja2FnZXMsXG4gICAgZW5mb3JjZUN1cnJlbnRCdWlsZDogZW5mb3JjZUFwcEluc3RhbGwsXG4gIH0pO1xuXG4gIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmVzZXQgdGhlIG5ld2x5IGluc3RhbGxlZCBhcHBcbiAgY29uc3QgaXNJbnN0YWxsZWRPdmVyRXhpc3RpbmdBcHAgPSAhd2FzVW5pbnN0YWxsZWRcbiAgICAmJiBhcHBTdGF0ZSAhPT0gYWRiLkFQUF9JTlNUQUxMX1NUQVRFLk5PVF9JTlNUQUxMRUQ7XG4gIGlmIChmYXN0UmVzZXQgJiYgaXNJbnN0YWxsZWRPdmVyRXhpc3RpbmdBcHApIHtcbiAgICBsb2dnZXIuaW5mbyhgUGVyZm9ybWluZyBmYXN0IHJlc2V0IG9uICcke2FwcFBhY2thZ2V9J2ApO1xuICAgIGF3YWl0IHRoaXMucmVzZXRBcHAoYWRiLCBvcHRzKTtcbiAgfVxufTtcblxuLyoqXG4gKiBJbnN0YWxscyBhbiBhcnJheSBvZiBhcGtzXG4gKiBAcGFyYW0ge0FEQn0gYWRiIEluc3RhbmNlIG9mIEFwcGl1bSBBREIgb2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyBPcHRzIGRlZmluZWQgaW4gZHJpdmVyLmpzXG4gKi9cbmhlbHBlcnMuaW5zdGFsbE90aGVyQXBrcyA9IGFzeW5jIGZ1bmN0aW9uIGluc3RhbGxPdGhlckFwa3MgKG90aGVyQXBwcywgYWRiLCBvcHRzKSB7XG4gIGxldCB7XG4gICAgYW5kcm9pZEluc3RhbGxUaW1lb3V0ID0gUEFDS0FHRV9JTlNUQUxMX1RJTUVPVVQsXG4gICAgYXV0b0dyYW50UGVybWlzc2lvbnMsXG4gICAgYWxsb3dUZXN0UGFja2FnZXNcbiAgfSA9IG9wdHM7XG5cbiAgLy8gSW5zdGFsbCBhbGwgb2YgdGhlIEFQSydzIGFzeW5jaHJvbm91c2x5XG4gIGF3YWl0IEIuYWxsKG90aGVyQXBwcy5tYXAoKG90aGVyQXBwKSA9PiB7XG4gICAgbG9nZ2VyLmRlYnVnKGBJbnN0YWxsaW5nIGFwcDogJHtvdGhlckFwcH1gKTtcbiAgICByZXR1cm4gYWRiLmluc3RhbGxPclVwZ3JhZGUob3RoZXJBcHAsIG51bGwsIHtcbiAgICAgIGdyYW50UGVybWlzc2lvbnM6IGF1dG9HcmFudFBlcm1pc3Npb25zLFxuICAgICAgdGltZW91dDogYW5kcm9pZEluc3RhbGxUaW1lb3V0LFxuICAgICAgYWxsb3dUZXN0UGFja2FnZXMsXG4gICAgfSk7XG4gIH0pKTtcbn07XG5cbi8qKlxuICogVW5pbnN0YWxsIGFuIGFycmF5IG9mIHBhY2thZ2VzXG4gKiBAcGFyYW0ge0FEQn0gYWRiIEluc3RhbmNlIG9mIEFwcGl1bSBBREIgb2JqZWN0XG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGFwcFBhY2thZ2VzIEFuIGFycmF5IG9mIHBhY2thZ2UgbmFtZXMgdG8gdW5pbnN0YWxsLiBJZiB0aGlzIGluY2x1ZGVzIGAnKidgLCB1bmluc3RhbGwgYWxsIG9mIDNyZCBwYXJ0eSBhcHBzXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGZpbHRlclBhY2thZ2VzIEFuIGFycmF5IG9mIHBhY2thZ2VzIGRvZXMgbm90IHVuaW5zdGFsbCB3aGVuIGAqYCBpcyBwcm92aWRlZCBhcyBgYXBwUGFja2FnZXNgXG4gKi9cbmhlbHBlcnMudW5pbnN0YWxsT3RoZXJQYWNrYWdlcyA9IGFzeW5jIGZ1bmN0aW9uIHVuaW5zdGFsbE90aGVyUGFja2FnZXMgKGFkYiwgYXBwUGFja2FnZXMsIGZpbHRlclBhY2thZ2VzID0gW10pIHtcbiAgaWYgKGFwcFBhY2thZ2VzLmluY2x1ZGVzKCcqJykpIHtcbiAgICBsb2dnZXIuZGVidWcoJ1VuaW5zdGFsbCB0aGlyZCBwYXJ0eSBwYWNrYWdlcycpO1xuICAgIGFwcFBhY2thZ2VzID0gYXdhaXQgdGhpcy5nZXRUaGlyZFBhcnR5UGFja2FnZXMoYWRiLCBmaWx0ZXJQYWNrYWdlcyk7XG4gIH1cblxuICBsb2dnZXIuZGVidWcoYFVuaW5zdGFsbGluZyBwYWNrYWdlczogJHthcHBQYWNrYWdlc31gKTtcbiAgYXdhaXQgQi5hbGwoYXBwUGFja2FnZXMubWFwKChhcHBQYWNrYWdlKSA9PiBhZGIudW5pbnN0YWxsQXBrKGFwcFBhY2thZ2UpKSk7XG59O1xuXG4vKipcbiAqIEdldCB0aGlyZCBwYXJ0eSBwYWNrYWdlcyBmaWx0ZXJlZCB3aXRoIGBmaWx0ZXJQYWNrYWdlc2BcbiAqIEBwYXJhbSB7QURCfSBhZGIgSW5zdGFuY2Ugb2YgQXBwaXVtIEFEQiBvYmplY3RcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gZmlsdGVyUGFja2FnZXMgQW4gYXJyYXkgb2YgcGFja2FnZXMgZG9lcyBub3QgdW5pbnN0YWxsIHdoZW4gYCpgIGlzIHByb3ZpZGVkIGFzIGBhcHBQYWNrYWdlc2BcbiAqIEByZXR1cm5zIHtBcnJheTxzdHJpbmc+fSBBbiBhcnJheSBvZiBpbnN0YWxsZWQgdGhpcmQgcGFyeSBwYWNrYWdlc1xuICovXG5oZWxwZXJzLmdldFRoaXJkUGFydHlQYWNrYWdlcyA9IGFzeW5jIGZ1bmN0aW9uIGdldFRoaXJkUGFydHlQYWNrYWdlcyAoYWRiLCBmaWx0ZXJQYWNrYWdlcyA9IFtdKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFja2FnZXNTdHJpbmcgPSBhd2FpdCBhZGIuc2hlbGwoWydwbScsICdsaXN0JywgJ3BhY2thZ2VzJywgJy0zJ10pO1xuICAgIGNvbnN0IGFwcFBhY2thZ2VzQXJyYXkgPSBwYWNrYWdlc1N0cmluZy50cmltKCkucmVwbGFjZSgvcGFja2FnZTovZywgJycpLnNwbGl0KEVPTCk7XG4gICAgbG9nZ2VyLmRlYnVnKGAnJHthcHBQYWNrYWdlc0FycmF5fScgZmlsdGVyZWQgd2l0aCAnJHtmaWx0ZXJQYWNrYWdlc30nYCk7XG4gICAgcmV0dXJuIF8uZGlmZmVyZW5jZShhcHBQYWNrYWdlc0FycmF5LCBmaWx0ZXJQYWNrYWdlcyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKGBVbmFibGUgdG8gZ2V0IHBhY2thZ2VzIHdpdGggJ2FkYiBzaGVsbCBwbSBsaXN0IHBhY2thZ2VzIC0zJzogJHtlcnIubWVzc2FnZX1gKTtcbiAgICByZXR1cm4gW107XG4gIH1cbn07XG5cbmhlbHBlcnMuaW5pdFVuaWNvZGVLZXlib2FyZCA9IGFzeW5jIGZ1bmN0aW9uIGluaXRVbmljb2RlS2V5Ym9hcmQgKGFkYikge1xuICBsb2dnZXIuZGVidWcoJ0VuYWJsaW5nIFVuaWNvZGUga2V5Ym9hcmQgc3VwcG9ydCcpO1xuXG4gIC8vIGdldCB0aGUgZGVmYXVsdCBJTUUgc28gd2UgY2FuIHJldHVybiBiYWNrIHRvIGl0IGxhdGVyIGlmIHdlIHdhbnRcbiAgbGV0IGRlZmF1bHRJTUUgPSBhd2FpdCBhZGIuZGVmYXVsdElNRSgpO1xuXG4gIGxvZ2dlci5kZWJ1ZyhgVW5zZXR0aW5nIHByZXZpb3VzIElNRSAke2RlZmF1bHRJTUV9YCk7XG4gIGNvbnN0IGFwcGl1bUlNRSA9IGAke1NFVFRJTkdTX0hFTFBFUl9QS0dfSUR9Ly5Vbmljb2RlSU1FYDtcbiAgbG9nZ2VyLmRlYnVnKGBTZXR0aW5nIElNRSB0byAnJHthcHBpdW1JTUV9J2ApO1xuICBhd2FpdCBhZGIuZW5hYmxlSU1FKGFwcGl1bUlNRSk7XG4gIGF3YWl0IGFkYi5zZXRJTUUoYXBwaXVtSU1FKTtcbiAgcmV0dXJuIGRlZmF1bHRJTUU7XG59O1xuXG5oZWxwZXJzLnNldE1vY2tMb2NhdGlvbkFwcCA9IGFzeW5jIGZ1bmN0aW9uIHNldE1vY2tMb2NhdGlvbkFwcCAoYWRiLCBhcHApIHtcbiAgdHJ5IHtcbiAgICBpZiAoYXdhaXQgYWRiLmdldEFwaUxldmVsKCkgPCAyMykge1xuICAgICAgYXdhaXQgYWRiLnNoZWxsKFsnc2V0dGluZ3MnLCAncHV0JywgJ3NlY3VyZScsICdtb2NrX2xvY2F0aW9uJywgJzEnXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IGFkYi5zaGVsbChbJ2FwcG9wcycsICdzZXQnLCBhcHAsICdhbmRyb2lkOm1vY2tfbG9jYXRpb24nLCAnYWxsb3cnXSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybihgVW5hYmxlIHRvIHNldCBtb2NrIGxvY2F0aW9uIGZvciBhcHAgJyR7YXBwfSc6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRyeSB7XG4gICAgbGV0IHBrZ0lkcyA9IFtdO1xuICAgIGlmIChhd2FpdCBhZGIuZmlsZUV4aXN0cyhNT0NLX0FQUF9JRFNfU1RPUkUpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBwa2dJZHMgPSBKU09OLnBhcnNlKGF3YWl0IGFkYi5zaGVsbChbJ2NhdCcsIE1PQ0tfQVBQX0lEU19TVE9SRV0pKTtcbiAgICAgIH0gY2F0Y2ggKGlnbikge31cbiAgICB9XG4gICAgaWYgKHBrZ0lkcy5pbmNsdWRlcyhhcHApKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHBrZ0lkcy5wdXNoKGFwcCk7XG4gICAgY29uc3QgdG1wUm9vdCA9IGF3YWl0IHRlbXBEaXIub3BlbkRpcigpO1xuICAgIGNvbnN0IHNyY1BhdGggPSBwYXRoLnBvc2l4LmpvaW4odG1wUm9vdCwgcGF0aC5wb3NpeC5iYXNlbmFtZShNT0NLX0FQUF9JRFNfU1RPUkUpKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKHNyY1BhdGgsIEpTT04uc3RyaW5naWZ5KHBrZ0lkcyksICd1dGY4Jyk7XG4gICAgICBhd2FpdCBhZGIucHVzaEZpbGUoc3JjUGF0aCwgTU9DS19BUFBfSURTX1NUT1JFKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgZnMucmltcmFmKHRtcFJvb3QpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZ2dlci53YXJuKGBVbmFibGUgdG8gcGVyc2lzdCBtb2NrIGxvY2F0aW9uIGFwcCBpZCAnJHthcHB9JzogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbmhlbHBlcnMucmVzZXRNb2NrTG9jYXRpb24gPSBhc3luYyBmdW5jdGlvbiByZXNldE1vY2tMb2NhdGlvbiAoYWRiKSB7XG4gIHRyeSB7XG4gICAgaWYgKGF3YWl0IGFkYi5nZXRBcGlMZXZlbCgpIDwgMjMpIHtcbiAgICAgIGF3YWl0IGFkYi5zaGVsbChbJ3NldHRpbmdzJywgJ3B1dCcsICdzZWN1cmUnLCAnbW9ja19sb2NhdGlvbicsICcwJ10pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRoaXJkUGFydHlQa2dJZHNQcm9taXNlID0gaGVscGVycy5nZXRUaGlyZFBhcnR5UGFja2FnZXMoYWRiKTtcbiAgICBsZXQgcGtnSWRzID0gW107XG4gICAgaWYgKGF3YWl0IGFkYi5maWxlRXhpc3RzKE1PQ0tfQVBQX0lEU19TVE9SRSkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHBrZ0lkcyA9IEpTT04ucGFyc2UoYXdhaXQgYWRiLnNoZWxsKFsnY2F0JywgTU9DS19BUFBfSURTX1NUT1JFXSkpO1xuICAgICAgfSBjYXRjaCAoaWduKSB7fVxuICAgIH1cbiAgICBjb25zdCB0aGlyZFBhcnR5UGtnSWRzID0gYXdhaXQgdGhpcmRQYXJ0eVBrZ0lkc1Byb21pc2U7XG4gICAgLy8gT25seSBpbmNsdWRlIGN1cnJlbnRseSBpbnN0YWxsZWQgcGFja2FnZXNcbiAgICBjb25zdCByZXN1bHRQa2dzID0gXy5pbnRlcnNlY3Rpb24ocGtnSWRzLCB0aGlyZFBhcnR5UGtnSWRzKTtcbiAgICBpZiAoXy5zaXplKHJlc3VsdFBrZ3MpIDw9IDEpIHtcbiAgICAgIGF3YWl0IGFkYi5zaGVsbChbJ2FwcG9wcycsICdzZXQnLCByZXN1bHRQa2dzWzBdID8/IFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQsICdhbmRyb2lkOm1vY2tfbG9jYXRpb24nLCAnZGVueSddKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2dnZXIuZGVidWcoYFJlc2V0dGluZyBtb2NrX2xvY2F0aW9uIHBlcm1pc3Npb24gZm9yIHRoZSBmb2xsb3dpbmcgYXBwczogJHtyZXN1bHRQa2dzfWApO1xuICAgIGF3YWl0IEIuYWxsKHJlc3VsdFBrZ3MubWFwKChwa2dJZCkgPT4gKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGFkYi5zaGVsbChbJ2FwcG9wcycsICdzZXQnLCBwa2dJZCwgJ2FuZHJvaWQ6bW9ja19sb2NhdGlvbicsICdkZW55J10pO1xuICAgICAgfSBjYXRjaCAoaWduKSB7fVxuICAgIH0pKCkpKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oYFVuYWJsZSB0byByZXNldCBtb2NrIGxvY2F0aW9uOiAke2Vyci5tZXNzYWdlfWApO1xuICB9XG59O1xuXG5oZWxwZXJzLmluc3RhbGxIZWxwZXJBcHAgPSBhc3luYyBmdW5jdGlvbiBpbnN0YWxsSGVscGVyQXBwIChhZGIsIGFwa1BhdGgsIHBhY2thZ2VJZCkge1xuICAvLyBTb21ldGltZXMgYWRiIHB1c2ggb3IgYWRiIGluc3RhbCB0YWtlIG1vcmUgdGltZSB0aGFuIGV4cGVjdGVkIHRvIGluc3RhbGwgYW4gYXBwXG4gIC8vIGUuZy4gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9pby5hcHBpdW0uc2V0dGluZ3MvaXNzdWVzLzQwI2lzc3VlY29tbWVudC00NzY1OTMxNzRcbiAgYXdhaXQgcmV0cnkoMiwgYXN5bmMgZnVuY3Rpb24gcmV0cnlJbnN0YWxsSGVscGVyQXBwICgpIHtcbiAgICBhd2FpdCBhZGIuaW5zdGFsbE9yVXBncmFkZShhcGtQYXRoLCBwYWNrYWdlSWQsIHtncmFudFBlcm1pc3Npb25zOiB0cnVlfSk7XG4gIH0pO1xufTtcblxuLyoqXG4gKiBQdXNoZXMgYW5kIGluc3RhbGxzIGlvLmFwcGl1bS5zZXR0aW5ncyBhcHAuXG4gKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIHNldHRpbmcgYXBwIGlzIHJlcXVpcmVkXG4gKlxuICogQHBhcmFtIHtBZGJ9IGFkYiAtIFRoZSBhZGIgbW9kdWxlIGluc3RhbmNlLlxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBEcml2ZXIgb3B0aW9ucyBkaWN0aW9uYXJ5LlxuICogQHBhcmFtIHtib29sZWFufSB0aHJvd0Vycm9yIFtmYWxzZV0gLSBXaGV0aGVyIHRocm93IGFuIGVycm9yIGlmIFNldHRpbmdzIGFwcCBmYWlscyB0byBzdGFydFxuICogQHRocm93cyB7RXJyb3J9IElmIHRocm93RXJyb3IgaXMgdHJ1ZSBhbmQgc29tZXRoaW5nIGhhcHBlbnMgaW4gaW5zdGFsbGF0aW9uIHN0ZXBcbiAqL1xuaGVscGVycy5wdXNoU2V0dGluZ3NBcHAgPSBhc3luYyBmdW5jdGlvbiBwdXNoU2V0dGluZ3NBcHAgKGFkYiwgdGhyb3dFcnJvciA9IGZhbHNlLCBvcHRzID0ge30pIHtcbiAgbG9nZ2VyLmRlYnVnKCdQdXNoaW5nIHNldHRpbmdzIGFwayB0byBkZXZpY2UuLi4nKTtcblxuICB0cnkge1xuICAgIGF3YWl0IGhlbHBlcnMuaW5zdGFsbEhlbHBlckFwcChhZGIsIHNldHRpbmdzQXBrUGF0aCwgU0VUVElOR1NfSEVMUEVSX1BLR19JRCwgdGhyb3dFcnJvcik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmICh0aHJvd0Vycm9yKSB7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgbG9nZ2VyLndhcm4oYElnbm9yZWQgZXJyb3Igd2hpbGUgaW5zdGFsbGluZyAnJHtzZXR0aW5nc0Fwa1BhdGh9JzogYCArXG4gICAgICAgICAgICAgICAgYCcke2Vyci5tZXNzYWdlfScuIEZlYXR1cmVzIHRoYXQgcmVseSBvbiB0aGlzIGhlbHBlciBgICtcbiAgICAgICAgICAgICAgICAncmVxdWlyZSB0aGUgYXBrIHN1Y2ggYXMgdG9nZ2xlIFdpRmkgYW5kIGdldHRpbmcgbG9jYXRpb24gJyArXG4gICAgICAgICAgICAgICAgJ3dpbGwgcmFpc2UgYW4gZXJyb3IgaWYgeW91IHRyeSB0byB1c2UgdGhlbS4nKTtcbiAgfVxuXG4gIC8vIFJlaW5zdGFsbCB3b3VsZCBzdG9wIHRoZSBzZXR0aW5ncyBoZWxwZXIgcHJvY2VzcyBhbnl3YXksIHNvXG4gIC8vIHRoZXJlIGlzIG5vIG5lZWQgdG8gY29udGludWUgaWYgdGhlIGFwcGxpY2F0aW9uIGlzIHN0aWxsIHJ1bm5pbmdcbiAgaWYgKGF3YWl0IGFkYi5wcm9jZXNzRXhpc3RzKFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQpKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGAke1NFVFRJTkdTX0hFTFBFUl9QS0dfSUR9IGlzIGFscmVhZHkgcnVubmluZy4gYCArXG4gICAgICBgVGhlcmUgaXMgbm8gbmVlZCB0byByZXNldCBpdHMgcGVybWlzc2lvbnMuYCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgYXBpTGV2ZWwgPSBhd2FpdCBhZGIuZ2V0QXBpTGV2ZWwoKTtcbiAgaWYgKGFwaUxldmVsID49IDI5KSB7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9pby5hcHBpdW0uc2V0dGluZ3MjaW50ZXJuYWwtYXVkaW8tLXZpZGVvLXJlY29yZGluZ1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBhZGIuc2hlbGwoWydhcHBvcHMnLCAnc2V0JywgU0VUVElOR1NfSEVMUEVSX1BLR19JRCwgJ1BST0pFQ1RfTUVESUEnLCAnYWxsb3cnXSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2dnZXIuZGVidWcoZXJyKTtcbiAgICB9XG4gIH1cbiAgaWYgKGFwaUxldmVsIDw9IDIzKSB7IC8vIEFuZHJvaWQgNi0gZGV2aWNlcyBzaG91bGQgaGF2ZSBncmFudGVkIHBlcm1pc3Npb25zXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vcHVsbC8xMTY0MCNpc3N1ZWNvbW1lbnQtNDM4MjYwNDc3XG4gICAgY29uc3QgcGVybXMgPSBbJ1NFVF9BTklNQVRJT05fU0NBTEUnLCAnQ0hBTkdFX0NPTkZJR1VSQVRJT04nLCAnQUNDRVNTX0ZJTkVfTE9DQVRJT04nXTtcbiAgICBsb2dnZXIuaW5mbyhgR3JhbnRpbmcgcGVybWlzc2lvbnMgJHtwZXJtc30gdG8gJyR7U0VUVElOR1NfSEVMUEVSX1BLR19JRH0nYCk7XG4gICAgYXdhaXQgYWRiLmdyYW50UGVybWlzc2lvbnMoU0VUVElOR1NfSEVMUEVSX1BLR19JRCwgcGVybXMubWFwKCh4KSA9PiBgYW5kcm9pZC5wZXJtaXNzaW9uLiR7eH1gKSk7XG4gIH1cblxuICAvLyBsYXVuY2ggaW8uYXBwaXVtLnNldHRpbmdzIGFwcCBkdWUgdG8gc2V0dGluZ3MgZmFpbGluZyB0byBiZSBzZXRcbiAgLy8gaWYgdGhlIGFwcCBpcyBub3QgbGF1bmNoZWQgcHJpb3IgdG8gc3RhcnQgdGhlIHNlc3Npb24gb24gYW5kcm9pZCA3K1xuICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzg5NTdcbiAgdHJ5IHtcbiAgICBhd2FpdCBhZGIucmVxdWlyZVJ1bm5pbmdTZXR0aW5nc0FwcCh7XG4gICAgICB0aW1lb3V0OiBoZWxwZXJzLmlzRW11bGF0b3IoYWRiLCBvcHRzKSA/IDMwMDAwIDogNTAwMFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIuZGVidWcoZXJyKTtcbiAgICBpZiAodGhyb3dFcnJvcikge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBFeHRyYWN0cyBzdHJpbmcueG1sIGFuZCBjb252ZXJ0cyBpdCB0byBzdHJpbmcuanNvbiBhbmQgcHVzaGVzXG4gKiBpdCB0byAvZGF0YS9sb2NhbC90bXAvc3RyaW5nLmpzb24gb24gZm9yIHVzZSBvZiBib290c3RyYXBcbiAqIElmIGFwcCBpcyBub3QgcHJlc2VudCB0byBleHRyYWN0IHN0cmluZy54bWwgaXQgZGVsZXRlcyByZW1vdGUgc3RyaW5ncy5qc29uXG4gKiBJZiBhcHAgZG9lcyBub3QgaGF2ZSBzdHJpbmdzLnhtbCB3ZSBwdXNoIGFuIGVtcHR5IGpzb24gb2JqZWN0IHRvIHJlbW90ZVxuICpcbiAqIEBwYXJhbSB7P3N0cmluZ30gbGFuZ3VhZ2UgLSBMYW5ndWFnZSBhYmJyZXZpYXRpb24sIGZvciBleGFtcGxlICdmcicuIFRoZSBkZWZhdWx0IGxhbmd1YWdlXG4gKiBpcyB1c2VkIGlmIHRoaXMgYXJndW1lbnQgaXMgbm90IGRlZmluZWQuXG4gKiBAcGFyYW0ge09iamVjdH0gYWRiIC0gVGhlIGFkYiBtb2R1bGUgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIERyaXZlciBvcHRpb25zIGRpY3Rpb25hcnkuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZGljdGlvbmFyeSwgd2hlcmUgc3RyaW5nIHJlc291cmNlIGlkZW50aWZpZXJzIGFyZSBrZXlzXG4gKiBhbG9uZyB3aXRoIHRoZWlyIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGZvciB0aGUgZ2l2ZW4gbGFuZ3VhZ2Ugb3IgYW4gZW1wdHkgb2JqZWN0XG4gKiBpZiBubyBtYXRjaGluZyByZXNvdXJjZXMgd2VyZSBleHRyYWN0ZWQuXG4gKi9cbmhlbHBlcnMucHVzaFN0cmluZ3MgPSBhc3luYyBmdW5jdGlvbiBwdXNoU3RyaW5ncyAobGFuZ3VhZ2UsIGFkYiwgb3B0cykge1xuICBjb25zdCByZW1vdGVEaXIgPSAnL2RhdGEvbG9jYWwvdG1wJztcbiAgY29uc3Qgc3RyaW5nc0pzb24gPSAnc3RyaW5ncy5qc29uJztcbiAgY29uc3QgcmVtb3RlRmlsZSA9IHBhdGgucG9zaXgucmVzb2x2ZShyZW1vdGVEaXIsIHN0cmluZ3NKc29uKTtcblxuICAvLyBjbGVhbiB1cCByZW1vdGUgc3RyaW5nLmpzb24gaWYgcHJlc2VudFxuICBhd2FpdCBhZGIucmltcmFmKHJlbW90ZUZpbGUpO1xuXG4gIGxldCBhcHA7XG4gIHRyeSB7XG4gICAgYXBwID0gb3B0cy5hcHAgfHwgYXdhaXQgYWRiLnB1bGxBcGsob3B0cy5hcHBQYWNrYWdlLCBvcHRzLnRtcERpcik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci5pbmZvKGBGYWlsZWQgdG8gcHVsbCBhbiBhcGsgZnJvbSAnJHtvcHRzLmFwcFBhY2thZ2V9JyB0byAnJHtvcHRzLnRtcERpcn0nLiBPcmlnaW5hbCBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgfVxuXG4gIGlmIChfLmlzRW1wdHkob3B0cy5hcHBQYWNrYWdlKSB8fCAhKGF3YWl0IGZzLmV4aXN0cyhhcHApKSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgTm8gYXBwIG9yIHBhY2thZ2Ugc3BlY2lmaWVkLiBSZXR1cm5pbmcgZW1wdHkgc3RyaW5nc2ApO1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGNvbnN0IHN0cmluZ3NUbXBEaXIgPSBwYXRoLnJlc29sdmUob3B0cy50bXBEaXIsIG9wdHMuYXBwUGFja2FnZSk7XG4gIHRyeSB7XG4gICAgbG9nZ2VyLmRlYnVnKCdFeHRyYWN0aW5nIHN0cmluZ3MgZnJvbSBhcGsnLCBhcHAsIGxhbmd1YWdlLCBzdHJpbmdzVG1wRGlyKTtcbiAgICBjb25zdCB7YXBrU3RyaW5ncywgbG9jYWxQYXRofSA9IGF3YWl0IGFkYi5leHRyYWN0U3RyaW5nc0Zyb21BcGsoYXBwLCBsYW5ndWFnZSwgc3RyaW5nc1RtcERpcik7XG4gICAgYXdhaXQgYWRiLnB1c2gobG9jYWxQYXRoLCByZW1vdGVEaXIpO1xuICAgIHJldHVybiBhcGtTdHJpbmdzO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybihgQ291bGQgbm90IGdldCBzdHJpbmdzLCBjb250aW51aW5nIGFueXdheS4gT3JpZ2luYWwgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgYXdhaXQgYWRiLnNoZWxsKCdlY2hvJywgW2Ane30nID4gJHtyZW1vdGVGaWxlfWBdKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBmcy5yaW1yYWYoc3RyaW5nc1RtcERpcik7XG4gIH1cbiAgcmV0dXJuIHt9O1xufTtcblxuaGVscGVycy51bmxvY2tXaXRoSGVscGVyQXBwID0gYXN5bmMgZnVuY3Rpb24gdW5sb2NrV2l0aEhlbHBlckFwcCAoYWRiKSB7XG4gIGxvZ2dlci5pbmZvKCdVbmxvY2tpbmcgc2NyZWVuJyk7XG5cbiAgLy8gVW5sb2NrIHN1Y2NlZWQgd2l0aCBhIGNvdXBsZSBvZiByZXRyaWVzLlxuICBsZXQgZmlyc3RSdW4gPSB0cnVlO1xuICBhd2FpdCByZXRyeSgzLCBhc3luYyBmdW5jdGlvbiBsYXVuY2hIZWxwZXIgKCkge1xuICAgIC8vIFRvIHJlZHVjZSBhIHRpbWUgdG8gY2FsbCBhZGIuaXNTY3JlZW5Mb2NrZWQoKSBzaW5jZSBgYWRiIHNoZWxsIGR1bXBzeXMgd2luZG93YCBpcyBlYXN5IHRvIGhhbmcgYWRiIGNvbW1hbmRzXG4gICAgaWYgKGZpcnN0UnVuKSB7XG4gICAgICBmaXJzdFJ1biA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIShhd2FpdCBhZGIuaXNTY3JlZW5Mb2NrZWQoKSkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYEVycm9yIGluIGlzU2NyZWVuTG9ja2VkOiAke2UubWVzc2FnZX1gKTtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1wiYWRiIHNoZWxsIGR1bXBzeXMgd2luZG93XCIgY29tbWFuZCBoYXMgdGltZWQgb3V0LicpO1xuICAgICAgICBsb2dnZXIud2FybignVGhlIHJlYXNvbiBvZiB0aGlzIHRpbWVvdXQgaXMgdGhlIGRlbGF5ZWQgYWRiIHJlc3BvbnNlLiBSZXNldHRpbmcgYWRiIHNlcnZlciBjYW4gaW1wcm92ZSBpdC4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsb2dnZXIuaW5mbyhgTGF1bmNoaW5nICR7U0VUVElOR1NfSEVMUEVSX1VOTE9DS19BQ1RJVklUWX1gKTtcbiAgICBhd2FpdCBhZGIuc2hlbGwoW1xuICAgICAgJ2FtJywgJ3N0YXJ0JyxcbiAgICAgICctbicsIGAke1NFVFRJTkdTX0hFTFBFUl9QS0dfSUR9LyR7U0VUVElOR1NfSEVMUEVSX1VOTE9DS19BQ1RJVklUWX1gLFxuICAgICAgJy1jJywgJ2FuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSJyxcbiAgICAgICctYScsICdhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTicsXG4gICAgICAnLWYnLCAnMHgxMDIwMDAwMCcsXG4gICAgXSk7XG4gICAgYXdhaXQgQi5kZWxheSgxMDAwKTtcbiAgfSk7XG59O1xuXG5oZWxwZXJzLnVubG9jayA9IGFzeW5jIGZ1bmN0aW9uIHVubG9jayAoZHJpdmVyLCBhZGIsIGNhcGFiaWxpdGllcykge1xuICBpZiAoIShhd2FpdCBhZGIuaXNTY3JlZW5Mb2NrZWQoKSkpIHtcbiAgICBsb2dnZXIuaW5mbygnU2NyZWVuIGFscmVhZHkgdW5sb2NrZWQsIGRvaW5nIG5vdGhpbmcnKTtcbiAgICByZXR1cm47XG4gIH1cbiAgbG9nZ2VyLmRlYnVnKCdTY3JlZW4gaXMgbG9ja2VkLCB0cnlpbmcgdG8gdW5sb2NrJyk7XG5cbiAgaWYgKCFjYXBhYmlsaXRpZXMudW5sb2NrVHlwZSAmJiAhY2FwYWJpbGl0aWVzLnVubG9ja0tleSkge1xuICAgIGxvZ2dlci53YXJuKCdVc2luZyBhcHAgdW5sb2NrLCB0aGlzIGlzIGdvaW5nIHRvIGJlIGRlcHJlY2F0ZWQhJyk7XG4gICAgYXdhaXQgaGVscGVycy51bmxvY2tXaXRoSGVscGVyQXBwKGFkYik7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qge1xuICAgIHVubG9ja1R5cGUsXG4gICAgdW5sb2NrS2V5LFxuICAgIHVubG9ja1N0cmF0ZWd5LFxuICAgIHVubG9ja1N1Y2Nlc3NUaW1lb3V0LFxuICB9ID0gdW5sb2NrZXIudmFsaWRhdGVVbmxvY2tDYXBhYmlsaXRpZXMoY2FwYWJpbGl0aWVzKTtcbiAgaWYgKHVubG9ja0tleSAmJiB1bmxvY2tUeXBlICE9PSBGSU5HRVJQUklOVF9VTkxPQ0tcbiAgICAgICYmIChfLmlzTmlsKHVubG9ja1N0cmF0ZWd5KSB8fCBfLnRvTG93ZXIodW5sb2NrU3RyYXRlZ3kpID09PSAnbG9ja3NldHRpbmdzJylcbiAgICAgICYmIGF3YWl0IGFkYi5pc0xvY2tNYW5hZ2VtZW50U3VwcG9ydGVkKCkpIHtcbiAgICBhd2FpdCB1bmxvY2tlci5mYXN0VW5sb2NrKGFkYiwge1xuICAgICAgY3JlZGVudGlhbDogdW5sb2NrS2V5LFxuICAgICAgY3JlZGVudGlhbFR5cGU6IHRvQ3JlZGVudGlhbFR5cGUodW5sb2NrVHlwZSksXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgdW5sb2NrTWV0aG9kID0ge1xuICAgICAgW1BJTl9VTkxPQ0tdOiB1bmxvY2tlci5waW5VbmxvY2ssXG4gICAgICBbUElOX1VOTE9DS19LRVlfRVZFTlRdOiB1bmxvY2tlci5waW5VbmxvY2tXaXRoS2V5RXZlbnQsXG4gICAgICBbUEFTU1dPUkRfVU5MT0NLXTogdW5sb2NrZXIucGFzc3dvcmRVbmxvY2ssXG4gICAgICBbUEFUVEVSTl9VTkxPQ0tdOiB1bmxvY2tlci5wYXR0ZXJuVW5sb2NrLFxuICAgICAgW0ZJTkdFUlBSSU5UX1VOTE9DS106IHVubG9ja2VyLmZpbmdlcnByaW50VW5sb2NrLFxuICAgIH1bdW5sb2NrVHlwZV07XG4gICAgYXdhaXQgdW5sb2NrTWV0aG9kKGFkYiwgZHJpdmVyLCBjYXBhYmlsaXRpZXMpO1xuICB9XG4gIGF3YWl0IGhlbHBlcnMudmVyaWZ5VW5sb2NrKGFkYiwgdW5sb2NrU3VjY2Vzc1RpbWVvdXQpO1xufTtcblxuaGVscGVycy52ZXJpZnlVbmxvY2sgPSBhc3luYyBmdW5jdGlvbiB2ZXJpZnlVbmxvY2sgKGFkYiwgdGltZW91dE1zID0gbnVsbCkge1xuICB0cnkge1xuICAgIGF3YWl0IHdhaXRGb3JDb25kaXRpb24oYXN5bmMgKCkgPT4gIShhd2FpdCBhZGIuaXNTY3JlZW5Mb2NrZWQoKSksIHtcbiAgICAgIHdhaXRNczogdGltZW91dE1zID8/IDIwMDAsXG4gICAgICBpbnRlcnZhbE1zOiA1MDAsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGlnbikge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhlIGRldmljZSBoYXMgZmFpbGVkIHRvIGJlIHVubG9ja2VkJyk7XG4gIH1cbiAgbG9nZ2VyLmluZm8oJ1RoZSBkZXZpY2UgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHVubG9ja2VkJyk7XG59O1xuXG5oZWxwZXJzLmluaXREZXZpY2UgPSBhc3luYyBmdW5jdGlvbiBpbml0RGV2aWNlIChhZGIsIG9wdHMpIHtcbiAgY29uc3Qge1xuICAgIHNraXBEZXZpY2VJbml0aWFsaXphdGlvbixcbiAgICBsb2NhbGUsXG4gICAgbGFuZ3VhZ2UsXG4gICAgbG9jYWxlU2NyaXB0LFxuICAgIHVuaWNvZGVLZXlib2FyZCxcbiAgICBkaXNhYmxlV2luZG93QW5pbWF0aW9uLFxuICAgIHNraXBVbmxvY2ssXG4gICAgbW9ja0xvY2F0aW9uQXBwLFxuICAgIHNraXBMb2djYXRDYXB0dXJlLFxuICAgIGxvZ2NhdEZvcm1hdCxcbiAgICBsb2djYXRGaWx0ZXJTcGVjcyxcbiAgfSA9IG9wdHM7XG5cbiAgaWYgKHNraXBEZXZpY2VJbml0aWFsaXphdGlvbikge1xuICAgIGxvZ2dlci5pbmZvKGAnc2tpcERldmljZUluaXRpYWxpemF0aW9uJyBpcyBzZXQuIFNraXBwaW5nIGRldmljZSBpbml0aWFsaXphdGlvbi5gKTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCBhZGIud2FpdEZvckRldmljZSgpO1xuICAgIC8vIHB1c2hTZXR0aW5nc0FwcCByZXF1aXJlZCBiZWZvcmUgY2FsbGluZyBlbnN1cmVEZXZpY2VMb2NhbGUgZm9yIEFQSSBMZXZlbCAyNCtcblxuICAgIC8vIFNvbWUgZmVhdHVyZSBzdWNoIGFzIGxvY2F0aW9uL3dpZmkgYXJlIG5vdCBuZWNlc3NhcnkgZm9yIGFsbCB1c2VycyxcbiAgICAvLyBidXQgdGhleSByZXF1aXJlIHRoZSBzZXR0aW5ncyBhcHAuIFNvLCB0cnkgdG8gY29uZmlndXJlIGl0IHdoaWxlIEFwcGl1bVxuICAgIC8vIGRvZXMgbm90IHRocm93IGVycm9yIGV2ZW4gaWYgdGhleSBmYWlsLlxuICAgIGNvbnN0IHNob3VsZFRocm93RXJyb3IgPSBsYW5ndWFnZVxuICAgICAgfHwgbG9jYWxlXG4gICAgICB8fCBsb2NhbGVTY3JpcHRcbiAgICAgIHx8IHVuaWNvZGVLZXlib2FyZFxuICAgICAgfHwgZGlzYWJsZVdpbmRvd0FuaW1hdGlvblxuICAgICAgfHwgIXNraXBVbmxvY2s7XG4gICAgYXdhaXQgaGVscGVycy5wdXNoU2V0dGluZ3NBcHAoYWRiLCBzaG91bGRUaHJvd0Vycm9yLCBvcHRzKTtcbiAgfVxuXG4gIGlmICghaGVscGVycy5pc0VtdWxhdG9yKGFkYiwgb3B0cykpIHtcbiAgICBpZiAobW9ja0xvY2F0aW9uQXBwIHx8IF8uaXNVbmRlZmluZWQobW9ja0xvY2F0aW9uQXBwKSkge1xuICAgICAgYXdhaXQgaGVscGVycy5zZXRNb2NrTG9jYXRpb25BcHAoYWRiLCBtb2NrTG9jYXRpb25BcHAgfHwgU0VUVElOR1NfSEVMUEVSX1BLR19JRCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IGhlbHBlcnMucmVzZXRNb2NrTG9jYXRpb24oYWRiKTtcbiAgICB9XG4gIH1cblxuICBpZiAobGFuZ3VhZ2UgfHwgbG9jYWxlKSB7XG4gICAgYXdhaXQgaGVscGVycy5lbnN1cmVEZXZpY2VMb2NhbGUoYWRiLCBsYW5ndWFnZSwgbG9jYWxlLCBsb2NhbGVTY3JpcHQpO1xuICB9XG5cbiAgaWYgKHNraXBMb2djYXRDYXB0dXJlKSB7XG4gICAgbG9nZ2VyLmluZm8oYCdza2lwTG9nY2F0Q2FwdHVyZScgaXMgc2V0LiBTa2lwcGluZyBzdGFydGluZyBsb2djYXQgY2FwdHVyZS5gKTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCBhZGIuc3RhcnRMb2djYXQoe1xuICAgICAgZm9ybWF0OiBsb2djYXRGb3JtYXQsXG4gICAgICBmaWx0ZXJTcGVjczogbG9nY2F0RmlsdGVyU3BlY3MsXG4gICAgfSk7XG4gIH1cblxuICBpZiAodW5pY29kZUtleWJvYXJkKSB7XG4gICAgcmV0dXJuIGF3YWl0IGhlbHBlcnMuaW5pdFVuaWNvZGVLZXlib2FyZChhZGIpO1xuICB9XG59O1xuXG5oZWxwZXJzLnJlbW92ZU51bGxQcm9wZXJ0aWVzID0gZnVuY3Rpb24gcmVtb3ZlTnVsbFByb3BlcnRpZXMgKG9iaikge1xuICBmb3IgKGxldCBrZXkgb2YgXy5rZXlzKG9iaikpIHtcbiAgICBpZiAoXy5pc051bGwob2JqW2tleV0pIHx8IF8uaXNVbmRlZmluZWQob2JqW2tleV0pKSB7XG4gICAgICBkZWxldGUgb2JqW2tleV07XG4gICAgfVxuICB9XG59O1xuXG5oZWxwZXJzLnRydW5jYXRlRGVjaW1hbHMgPSBmdW5jdGlvbiB0cnVuY2F0ZURlY2ltYWxzIChudW1iZXIsIGRpZ2l0cykge1xuICBsZXQgbXVsdGlwbGllciA9IE1hdGgucG93KDEwLCBkaWdpdHMpLFxuICAgICAgYWRqdXN0ZWROdW0gPSBudW1iZXIgKiBtdWx0aXBsaWVyLFxuICAgICAgdHJ1bmNhdGVkTnVtID0gTWF0aFthZGp1c3RlZE51bSA8IDAgPyAnY2VpbCcgOiAnZmxvb3InXShhZGp1c3RlZE51bSk7XG5cbiAgcmV0dXJuIHRydW5jYXRlZE51bSAvIG11bHRpcGxpZXI7XG59O1xuXG5oZWxwZXJzLmlzQ2hyb21lQnJvd3NlciA9IGZ1bmN0aW9uIGlzQ2hyb21lQnJvd3NlciAoYnJvd3Nlcikge1xuICByZXR1cm4gXy5pbmNsdWRlcyhPYmplY3Qua2V5cyhDSFJPTUVfQlJPV1NFUl9QQUNLQUdFX0FDVElWSVRZKSwgKGJyb3dzZXIgfHwgJycpLnRvTG93ZXJDYXNlKCkpO1xufTtcblxuaGVscGVycy5nZXRDaHJvbWVQa2cgPSBmdW5jdGlvbiBnZXRDaHJvbWVQa2cgKGJyb3dzZXIpIHtcbiAgcmV0dXJuIENIUk9NRV9CUk9XU0VSX1BBQ0tBR0VfQUNUSVZJVFlbYnJvd3Nlci50b0xvd2VyQ2FzZSgpXSB8fCBDSFJPTUVfQlJPV1NFUl9QQUNLQUdFX0FDVElWSVRZLmRlZmF1bHQ7XG59O1xuXG5oZWxwZXJzLnJlbW92ZUFsbFNlc3Npb25XZWJTb2NrZXRIYW5kbGVycyA9IGFzeW5jIGZ1bmN0aW9uIHJlbW92ZUFsbFNlc3Npb25XZWJTb2NrZXRIYW5kbGVycyAoc2VydmVyLCBzZXNzaW9uSWQpIHtcbiAgaWYgKCFzZXJ2ZXIgfHwgIV8uaXNGdW5jdGlvbihzZXJ2ZXIuZ2V0V2ViU29ja2V0SGFuZGxlcnMpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgYWN0aXZlSGFuZGxlcnMgPSBhd2FpdCBzZXJ2ZXIuZ2V0V2ViU29ja2V0SGFuZGxlcnMoc2Vzc2lvbklkKTtcbiAgZm9yIChjb25zdCBwYXRobmFtZSBvZiBfLmtleXMoYWN0aXZlSGFuZGxlcnMpKSB7XG4gICAgYXdhaXQgc2VydmVyLnJlbW92ZVdlYlNvY2tldEhhbmRsZXIocGF0aG5hbWUpO1xuICB9XG59O1xuXG4vKipcbiAqIFRha2VzIGEgZGVzaXJlZCBjYXBhYmlsaXR5IGFuZCB0cmllcyB0byBKU09OLnBhcnNlIGl0IGFzIGFuIGFycmF5LFxuICogYW5kIGVpdGhlciByZXR1cm5zIHRoZSBwYXJzZWQgYXJyYXkgb3IgYSBzaW5nbGV0b24gYXJyYXkuXG4gKlxuICogQHBhcmFtIHthbnl9IGNhcCBBIGRlc2lyZWQgY2FwYWJpbGl0eVxuICovXG5oZWxwZXJzLnBhcnNlQXJyYXkgPSBmdW5jdGlvbiBwYXJzZUFycmF5IChjYXApIHtcbiAgbGV0IHBhcnNlZENhcHM7XG4gIHRyeSB7XG4gICAgcGFyc2VkQ2FwcyA9IEpTT04ucGFyc2UoY2FwKTtcbiAgfSBjYXRjaCAoaWduKSB7IH1cblxuICBpZiAoXy5pc0FycmF5KHBhcnNlZENhcHMpKSB7XG4gICAgcmV0dXJuIHBhcnNlZENhcHM7XG4gIH0gZWxzZSBpZiAoXy5pc1N0cmluZyhjYXApKSB7XG4gICAgcmV0dXJuIFtjYXBdO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBtdXN0IHByb3ZpZGUgYSBzdHJpbmcgb3IgSlNPTiBBcnJheTsgcmVjZWl2ZWQgJHtjYXB9YCk7XG59O1xuXG4vKipcbiAqIFZhbGlkYXRlIGRlc2lyZWQgY2FwYWJpbGl0aWVzLiBSZXR1cm5zIHRydWUgaWYgY2FwYWJpbGl0eSBpcyB2YWxpZFxuICpcbiAqIEBwYXJhbSB7Kn0gY2FwIEEgZGVzaXJlZCBjYXBhYmlsaXR5XG4gKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgdGhlIGNhcGFiaWxpdHkgaXMgdmFsaWRcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgY2FwcyBoYXMgaW52YWxpZCBjYXBhYmlsaXR5XG4gKi9cbmhlbHBlcnMudmFsaWRhdGVEZXNpcmVkQ2FwcyA9IGZ1bmN0aW9uIHZhbGlkYXRlRGVzaXJlZENhcHMgKGNhcHMpIHtcbiAgaWYgKGNhcHMuYnJvd3Nlck5hbWUpIHtcbiAgICBpZiAoY2Fwcy5hcHApIHtcbiAgICAgIC8vIHdhcm4gaWYgdGhlIGNhcGFiaWxpdGllcyBoYXZlIGJvdGggYGFwcGAgYW5kIGBicm93c2VyLCBhbHRob3VnaCB0aGlzIGlzIGNvbW1vbiB3aXRoIHNlbGVuaXVtIGdyaWRcbiAgICAgIGxvZ2dlci53YXJuKGBUaGUgZGVzaXJlZCBjYXBhYmlsaXRpZXMgc2hvdWxkIGdlbmVyYWxseSBub3QgaW5jbHVkZSBib3RoIGFuICdhcHAnIGFuZCBhICdicm93c2VyTmFtZSdgKTtcbiAgICB9XG4gICAgaWYgKGNhcHMuYXBwUGFja2FnZSkge1xuICAgICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coYFRoZSBkZXNpcmVkIHNob3VsZCBub3QgaW5jbHVkZSBib3RoIG9mIGFuICdhcHBQYWNrYWdlJyBhbmQgYSAnYnJvd3Nlck5hbWUnYCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNhcHMudW5pbnN0YWxsT3RoZXJQYWNrYWdlcykge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLnBhcnNlQXJyYXkoY2Fwcy51bmluc3RhbGxPdGhlclBhY2thZ2VzKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2dnZXIuZXJyb3JBbmRUaHJvdyhgQ291bGQgbm90IHBhcnNlIFwidW5pbnN0YWxsT3RoZXJQYWNrYWdlc1wiIGNhcGFiaWxpdHk6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBBZGp1c3QgdGhlIGNhcGFiaWxpdGllcyBmb3IgYSBicm93c2VyIHNlc3Npb25cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY2FwcyAtIEN1cnJlbnQgY2FwYWJpbGl0aWVzIG9iamVjdFxuICogISEhIFRoZSBvYmplY3QgaXMgbXV0YXRlZCBieSB0aGlzIG1ldGhvZCBjYWxsICEhIVxuICogQHJldHVybnMge09iamVjdH0gVGhlIHNhbWUgcG9zc2libHkgbXV0YXRlZCBgb3B0c2AgaW5zdGFuY2UuXG4gKiBObyBtdXRhdGlvbiBpcyBoYXBwZW5pbmcgaXMgdGhlIGN1cnJlbnQgc2Vzc2lvbiBpZlxuICogYXBwUGFja2FnZS9hcHBBY3Rpdml0eSBjYXBzIGhhdmUgYWxyZWFkeSBiZWVuIHByb3ZpZGVkLlxuICovXG5oZWxwZXJzLmFkanVzdEJyb3dzZXJTZXNzaW9uQ2FwcyA9IGZ1bmN0aW9uIGFkanVzdEJyb3dzZXJTZXNzaW9uQ2FwcyAoY2FwcyA9IHt9KSB7XG4gIGNvbnN0IHsgYnJvd3Nlck5hbWUgfSA9IGNhcHM7XG4gIGxvZ2dlci5pbmZvKGBUaGUgY3VycmVudCBzZXNzaW9uIGlzIGNvbnNpZGVyZWQgYnJvd3Nlci1iYXNlZGApO1xuICBsb2dnZXIuaW5mbyhgU3VwcG9ydGVkIGJyb3dzZXIgbmFtZXM6ICR7SlNPTi5zdHJpbmdpZnkoXy5rZXlzKENIUk9NRV9CUk9XU0VSX1BBQ0tBR0VfQUNUSVZJVFkpKX1gKTtcbiAgaWYgKGNhcHMuYXBwUGFja2FnZSB8fCBjYXBzLmFwcEFjdGl2aXR5KSB7XG4gICAgbG9nZ2VyLmluZm8oYE5vdCBvdmVycmlkaW5nIGFwcFBhY2thZ2UvYXBwQWN0aXZpdHkgY2FwYWJpbGl0eSB2YWx1ZXMgZm9yICcke2Jyb3dzZXJOYW1lfScgYCArXG4gICAgICAnYmVjYXVzZSBzb21lIG9mIHRoZW0gaGF2ZSBiZWVuIGFscmVhZHkgcHJvdmlkZWQnKTtcbiAgICByZXR1cm4gY2FwcztcbiAgfVxuXG4gIGNvbnN0IHtwa2csIGFjdGl2aXR5fSA9IHRoaXMuZ2V0Q2hyb21lUGtnKGJyb3dzZXJOYW1lKTtcbiAgY2Fwcy5hcHBQYWNrYWdlID0gcGtnO1xuICBjYXBzLmFwcEFjdGl2aXR5ID0gYWN0aXZpdHk7XG4gIGxvZ2dlci5pbmZvKGBhcHBQYWNrYWdlL2FwcEFjdGl2aXR5IGNhcGFiaWxpdGllcyBoYXZlIGJlZW4gYXV0b21hdGljYWxseSBzZXQgdG8gJHtwa2d9LyR7YWN0aXZpdHl9IGAgK1xuICAgIGBmb3IgJyR7YnJvd3Nlck5hbWV9J2ApO1xuICBsb2dnZXIuaW5mbyhgQ29uc2lkZXIgY2hhbmdpbmcgdGhlIGJyb3dzZXJOYW1lIHRvIHRoZSBvbmUgZnJvbSB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgYnJvd3NlciBuYW1lcyBgICtcbiAgICBgb3IgcHJvdmlkZSBjdXN0b20gYXBwUGFja2FnZS9hcHBBY3Rpdml0eSBjYXBhYmlsaXR5IHZhbHVlcyBpZiB0aGUgYXV0b21hdGljYWxseSBhc3NpZ25lZCBvbmVzIGRvIGAgK1xuICAgIGBub3QgbWFrZSBzZW5zZWApO1xuICByZXR1cm4gY2Fwcztcbn07XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIGN1cnJlbnQgZGV2aWNlIHVuZGVyIHRlc3QgaXMgYW4gZW11bGF0b3JcbiAqXG4gKiBAcGFyYW0ge0FEQn0gYWRiIC0gYXBwaXVtLWFkYiBpbnN0YW5jZVxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBkcml2ZXIgb3B0aW9ucyBtYXBwaW5nXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBkZXZpY2UgaXMgYW4gQW5kcm9pZCBlbXVsYXRvclxuICovXG5oZWxwZXJzLmlzRW11bGF0b3IgPSBmdW5jdGlvbiBpc0VtdWxhdG9yIChhZGIsIG9wdHMpIHtcbiAgY29uc3QgcG9zc2libGVOYW1lcyA9IFtvcHRzLnVkaWQsIGFkYj8uY3VyRGV2aWNlSWRdO1xuICByZXR1cm4gISFvcHRzLmF2ZCB8fCBwb3NzaWJsZU5hbWVzLnNvbWUoKHgpID0+IEVNVUxBVE9SX1BBVFRFUk4udGVzdCh4KSk7XG59O1xuXG5oZWxwZXJzLmJvb3RzdHJhcCA9IEJvb3RzdHJhcDtcbmhlbHBlcnMudW5sb2NrZXIgPSB1bmxvY2tlcjtcblxuZXhwb3J0IHsgaGVscGVycywgU0VUVElOR1NfSEVMUEVSX1BLR19JRCwgQVBQX1NUQVRFLCBwcmVwYXJlQXZkQXJncywgZW5zdXJlTmV0d29ya1NwZWVkIH07XG5leHBvcnQgZGVmYXVsdCBoZWxwZXJzO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUlBOztBQUNBOzs7Ozs7QUFFQSxNQUFNQSxrQkFBa0IsR0FBRyxnQ0FBM0I7QUFDQSxNQUFNQyx1QkFBdUIsR0FBRyxLQUFoQztBQUVBLE1BQU1DLCtCQUErQixHQUFHO0VBQ3RDQyxNQUFNLEVBQUU7SUFDTkMsR0FBRyxFQUFFLG9CQURDO0lBRU5DLFFBQVEsRUFBRTtFQUZKLENBRDhCO0VBS3RDQyxRQUFRLEVBQUU7SUFDUkYsR0FBRyxFQUFFLDJCQURHO0lBRVJDLFFBQVEsRUFBRTtFQUZGLENBTDRCO0VBU3RDRSxVQUFVLEVBQUU7SUFDVkgsR0FBRyxFQUFFLGlCQURLO0lBRVZDLFFBQVEsRUFBRTtFQUZBLENBVDBCO0VBYXRDRyxPQUFPLEVBQUU7SUFDUEosR0FBRyxFQUFFLHFCQURFO0lBRVBDLFFBQVEsRUFBRTtFQUZILENBYjZCO0VBaUJ0QyxvQkFBb0I7SUFDbEJELEdBQUcsRUFBRSxxQkFEYTtJQUVsQkMsUUFBUSxFQUFFO0VBRlEsQ0FqQmtCO0VBcUJ0QyxvQkFBb0I7SUFDbEJELEdBQUcsRUFBRSw0QkFEYTtJQUVsQkMsUUFBUSxFQUFFO0VBRlEsQ0FyQmtCO0VBeUJ0Q0ksT0FBTyxFQUFFO0lBQ1BMLEdBQUcsRUFBRSxvQkFERTtJQUVQQyxRQUFRLEVBQUU7RUFGSDtBQXpCNkIsQ0FBeEM7QUE4QkEsTUFBTUssc0JBQXNCLEdBQUcsb0JBQS9COztBQUNBLE1BQU1DLCtCQUErQixHQUFHLFNBQXhDO0FBQ0EsTUFBTUMsZ0JBQWdCLEdBQUcsZUFBekI7QUFHQSxNQUFNQyxTQUFTLEdBQUdDLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjO0VBQzlCQyxhQUFhLEVBQUUsQ0FEZTtFQUU5QkMsV0FBVyxF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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"android-helpers.js","names":["MOCK_APP_IDS_STORE","PACKAGE_INSTALL_TIMEOUT","CHROME_BROWSER_PACKAGE_ACTIVITY","chrome","pkg","activity","chromium","chromebeta","browser","default","SETTINGS_HELPER_PKG_ID","SETTINGS_HELPER_UNLOCK_ACTIVITY","EMULATOR_PATTERN","APP_STATE","Object","freeze","NOT_INSTALLED","NOT_RUNNING","RUNNING_IN_BACKGROUND","RUNNING_IN_FOREGROUND","ensureNetworkSpeed","adb","networkSpeed","_","values","NETWORK_SPEED","includes","logger","warn","FULL","prepareAvdArgs","opts","isHeadless","avdArgs","result","isArray","push","util","shellParse","toCredentialType","unlockType","PIN_UNLOCK","PIN_UNLOCK_KEY_EVENT","PASSWORD_UNLOCK","PATTERN_UNLOCK","Error","helpers","createBaseADB","adbPort","suppressKillServer","remoteAdbHost","clearDeviceLogsOnStart","adbExecTimeout","useKeystore","keystorePath","keystorePassword","keyAlias","keyPassword","remoteAppsCacheLimit","buildToolsVersion","allowOfflineDevices","allowDelayAdb","ADB","createADB","prepareEmulator","avd","avdEnv","env","language","locale","country","avdLaunchTimeout","launchTimeout","avdReadyTimeout","readyTimeout","avdName","replace","isEmulatorRunning","getRunningAVDWithRetry","e","debug","message","args","killEmulator","launchAVD","ensureDeviceLocale","script","isString","setDeviceLanguageCountry","ensureCurrentLocale","getDeviceInfoFromCaps","udid","emPort","curDeviceId","emulatorPort","info","devices","getDevicesWithRetry","map","errorAndThrow","getPortFromEmulatorString","platformVersion","trim","semver","coerce","availDevices","partialMatchCandidate","device","setDeviceId","rawDeviceOS","getPlatformVersion","deviceOS","bothVersionsCanBeCoerced","valid","bothVersionsAreStrings","version","toLower","major","minor","gt","keys","join","setEmulatorPort","validatePackageActivityNames","key","name","match","exec","index","substring","getLaunchInfo","app","appPackage","appActivity","appWaitPackage","appWaitActivity","apkPackage","apkActivity","packageAndLaunchActivityFromManifest","resetApp","fastReset","fullReset","androidInstallTimeout","autoGrantPermissions","allowTestPackages","isInstalled","isAppInstalled","forceStop","ign","output","clear","toLowerCase","grantAllPermissions","error","uninstallApk","install","grantPermissions","timeout","installApk","enforceAppInstall","appState","wasUninstalled","installOrUpgrade","enforceCurrentBuild","isInstalledOverExistingApp","APP_INSTALL_STATE","installOtherApks","otherApps","B","all","otherApp","uninstallOtherPackages","appPackages","filterPackages","getThirdPartyPackages","packagesString","shell","appPackagesArray","split","EOL","difference","err","initUnicodeKeyboard","defaultIME","appiumIME","enableIME","setIME","setMockLocationApp","getApiLevel","pkgIds","fileExists","JSON","parse","tmpRoot","tempDir","openDir","srcPath","path","posix","basename","fs","writeFile","stringify","pushFile","rimraf","resetMockLocation","thirdPartyPkgIdsPromise","thirdPartyPkgIds","resultPkgs","intersection","size","pkgId","installHelperApp","apkPath","packageId","retry","retryInstallHelperApp","pushSettingsApp","throwError","settingsApkPath","processExists","apiLevel","perms","x","requireRunningSettingsApp","isEmulator","pushStrings","remoteDir","stringsJson","remoteFile","resolve","pullApk","tmpDir","isEmpty","exists","stringsTmpDir","apkStrings","localPath","extractStringsFromApk","unlockWithHelperApp","firstRun","launchHelper","isScreenLocked","delay","unlock","driver","capabilities","unlockKey","unlockStrategy","unlockSuccessTimeout","unlocker","validateUnlockCapabilities","FINGERPRINT_UNLOCK","isNil","isLockManagementSupported","fastUnlock","credential","credentialType","unlockMethod","pinUnlock","pinUnlockWithKeyEvent","passwordUnlock","patternUnlock","fingerprintUnlock","verifyUnlock","timeoutMs","waitForCondition","waitMs","intervalMs","initDevice","skipDeviceInitialization","localeScript","unicodeKeyboard","disableWindowAnimation","skipUnlock","mockLocationApp","skipLogcatCapture","logcatFormat","logcatFilterSpecs","waitForDevice","shouldThrowError","isUndefined","startLogcat","format","filterSpecs","removeNullProperties","obj","isNull","truncateDecimals","number","digits","multiplier","Math","pow","adjustedNum","truncatedNum","isChromeBrowser","getChromePkg","removeAllSessionWebSocketHandlers","server","sessionId","isFunction","getWebSocketHandlers","activeHandlers","pathname","removeWebSocketHandler","parseArray","cap","parsedCaps","validateDesiredCaps","caps","browserName","adjustBrowserSessionCaps","possibleNames","some","test","bootstrap","Bootstrap"],"sources":["../../lib/android-helpers.js"],"sourcesContent":["import _ from 'lodash';\nimport path from 'path';\nimport { retry, waitForCondition } from 'asyncbox';\nimport logger from './logger';\nimport { fs, util, tempDir } from 'appium/support';\nimport { path as settingsApkPath } from 'io.appium.settings';\nimport Bootstrap from './bootstrap';\nimport B from 'bluebird';\nimport ADB from 'appium-adb';\nimport {\n default as unlocker, PIN_UNLOCK, PIN_UNLOCK_KEY_EVENT,\n PASSWORD_UNLOCK, PATTERN_UNLOCK, FINGERPRINT_UNLOCK\n} from './unlock-helpers';\nimport { EOL } from 'os';\nimport semver from 'semver';\n\nconst MOCK_APP_IDS_STORE = '/data/local/tmp/mock_apps.json';\nconst PACKAGE_INSTALL_TIMEOUT = 90000; // milliseconds\n// https://cs.chromium.org/chromium/src/chrome/browser/devtools/device/android_device_info_query.cc\nconst CHROME_BROWSER_PACKAGE_ACTIVITY = {\n chrome: {\n pkg: 'com.android.chrome',\n activity: 'com.google.android.apps.chrome.Main',\n },\n chromium: {\n pkg: 'org.chromium.chrome.shell',\n activity: '.ChromeShellActivity',\n },\n chromebeta: {\n pkg: 'com.chrome.beta',\n activity: 'com.google.android.apps.chrome.Main',\n },\n browser: {\n pkg: 'com.android.browser',\n activity: 'com.android.browser.BrowserActivity',\n },\n 'chromium-browser': {\n pkg: 'org.chromium.chrome',\n activity: 'com.google.android.apps.chrome.Main',\n },\n 'chromium-webview': {\n pkg: 'org.chromium.webview_shell',\n activity: 'org.chromium.webview_shell.WebViewBrowserActivity',\n },\n default: {\n pkg: 'com.android.chrome',\n activity: 'com.google.android.apps.chrome.Main',\n },\n};\nconst SETTINGS_HELPER_PKG_ID = 'io.appium.settings';\nconst SETTINGS_HELPER_UNLOCK_ACTIVITY = '.Unlock';\nconst EMULATOR_PATTERN = /\\bemulator\\b/i;\n// These constants are in sync with\n// https://developer.apple.com/documentation/xctest/xcuiapplicationstate/xcuiapplicationstaterunningbackground?language=objc\nconst APP_STATE = Object.freeze({\n NOT_INSTALLED: 0,\n NOT_RUNNING: 1,\n RUNNING_IN_BACKGROUND: 3,\n RUNNING_IN_FOREGROUND: 4\n});\n\n\nfunction ensureNetworkSpeed (adb, networkSpeed) {\n if (_.values(adb.NETWORK_SPEED).includes(networkSpeed)) {\n return networkSpeed;\n }\n logger.warn(`Wrong network speed param '${networkSpeed}', using default: ${adb.NETWORK_SPEED.FULL}. ` +\n `Supported values: ${_.values(adb.NETWORK_SPEED)}`);\n return adb.NETWORK_SPEED.FULL;\n}\n\nfunction prepareAvdArgs (adb, opts) {\n const {\n networkSpeed,\n isHeadless,\n avdArgs,\n } = opts;\n const result = [];\n if (avdArgs) {\n if (_.isArray(avdArgs)) {\n result.push(...avdArgs);\n } else {\n result.push(...(util.shellParse(`${avdArgs}`)));\n }\n }\n if (networkSpeed) {\n result.push('-netspeed', ensureNetworkSpeed(adb, networkSpeed));\n }\n if (isHeadless) {\n result.push('-no-window');\n }\n return result;\n}\n\nfunction toCredentialType (unlockType) {\n const result = {\n [PIN_UNLOCK]: 'pin',\n [PIN_UNLOCK_KEY_EVENT]: 'pin',\n [PASSWORD_UNLOCK]: 'password',\n [PATTERN_UNLOCK]: 'pattern',\n }[unlockType];\n if (result) {\n return result;\n }\n throw new Error(`Unlock type '${unlockType}' is not known`);\n}\n\n\nconst helpers = {};\n\nhelpers.createBaseADB = async function createBaseADB (opts = {}) {\n // filter out any unwanted options sent in\n // this list should be updated as ADB takes more arguments\n const {\n adbPort,\n suppressKillServer,\n remoteAdbHost,\n clearDeviceLogsOnStart,\n adbExecTimeout,\n useKeystore,\n keystorePath,\n keystorePassword,\n keyAlias,\n keyPassword,\n remoteAppsCacheLimit,\n buildToolsVersion,\n allowOfflineDevices,\n allowDelayAdb,\n } = opts;\n return await ADB.createADB({\n adbPort,\n suppressKillServer,\n remoteAdbHost,\n clearDeviceLogsOnStart,\n adbExecTimeout,\n useKeystore,\n keystorePath,\n keystorePassword,\n keyAlias,\n keyPassword,\n remoteAppsCacheLimit,\n buildToolsVersion,\n allowOfflineDevices,\n allowDelayAdb,\n });\n};\n\nhelpers.prepareEmulator = async function prepareEmulator (adb, opts) {\n const {\n avd,\n avdEnv: env,\n language,\n locale: country,\n avdLaunchTimeout: launchTimeout,\n avdReadyTimeout: readyTimeout,\n } = opts;\n if (!avd) {\n throw new Error('Cannot launch AVD without AVD name');\n }\n\n const avdName = avd.replace('@', '');\n let isEmulatorRunning = true;\n try {\n await adb.getRunningAVDWithRetry(avdName, 5000);\n } catch (e) {\n logger.debug(`Emulator '${avdName}' is not running: ${e.message}`);\n isEmulatorRunning = false;\n }\n const args = prepareAvdArgs(adb, opts);\n if (isEmulatorRunning) {\n if (args.includes('-wipe-data')) {\n logger.debug(`Killing '${avdName}' because it needs to be wiped at start.`);\n await adb.killEmulator(avdName);\n } else {\n logger.debug('Not launching AVD because it is already running.');\n return;\n }\n }\n await adb.launchAVD(avd, {\n args,\n env,\n language,\n country,\n launchTimeout,\n readyTimeout,\n });\n};\n\n/**\n * Set and ensure the locale name of the device under test.\n *\n * @param {Object} adb - The adb module instance.\n * @param {string} language - Language. The language field is case insensitive, but Locale always canonicalizes to lower case.\n * format: [a-zA-Z]{2,8}. e.g. en, ja : https://developer.android.com/reference/java/util/Locale.html\n * @param {string} country - Country. The country (region) field is case insensitive, but Locale always canonicalizes to upper case.\n * format: [a-zA-Z]{2} | [0-9]{3}. e.g. US, JP : https://developer.android.com/reference/java/util/Locale.html\n * @param {?string} script - Script. The script field is case insensitive but Locale always canonicalizes to title case.\n * format: [a-zA-Z]{4}. e.g. Hans in zh-Hans-CN : https://developer.android.com/reference/java/util/Locale.html\n * @throws {Error} If it failed to set locale properly\n */\nhelpers.ensureDeviceLocale = async function ensureDeviceLocale (adb, language, country, script = null) {\n if (!_.isString(language) && !_.isString(country)) {\n logger.warn(`setDeviceLanguageCountry requires language or country.`);\n logger.warn(`Got language: '${language}' and country: '${country}'`);\n return;\n }\n\n await adb.setDeviceLanguageCountry(language, country, script);\n\n if (!await adb.ensureCurrentLocale(language, country, script)) {\n const message = script ? `language: ${language}, country: ${country} and script: ${script}` : `language: ${language} and country: ${country}`;\n throw new Error(`Failed to set ${message}`);\n }\n};\n\nhelpers.getDeviceInfoFromCaps = async function getDeviceInfoFromCaps (opts = {}) {\n // we can create a throwaway ADB instance here, so there is no dependency\n // on instantiating on earlier (at this point, we have no udid)\n // we can only use this ADB object for commands that would not be confused\n // if multiple devices are connected\n const adb = await helpers.createBaseADB(opts);\n let udid = opts.udid;\n let emPort = null;\n\n // a specific avd name was given. try to initialize with that\n if (opts.avd) {\n await helpers.prepareEmulator(adb, opts);\n udid = adb.curDeviceId;\n emPort = adb.emulatorPort;\n } else {\n // no avd given. lets try whatever's plugged in devices/emulators\n logger.info('Retrieving device list');\n let devices = await adb.getDevicesWithRetry();\n\n // udid was given, lets try to init with that device\n if (udid) {\n if (!_.includes(_.map(devices, 'udid'), udid)) {\n logger.errorAndThrow(`Device ${udid} was not in the list of connected devices`);\n }\n emPort = adb.getPortFromEmulatorString(udid);\n } else if (opts.platformVersion) {\n opts.platformVersion = `${opts.platformVersion}`.trim();\n\n // a platform version was given. lets try to find a device with the same os\n const platformVersion = semver.coerce(opts.platformVersion) || opts.platformVersion;\n logger.info(`Looking for a device with Android '${platformVersion}'`);\n\n // in case we fail to find something, give the user a useful log that has\n // the device udids and os versions so they know what's available\n const availDevices = [];\n let partialMatchCandidate = null;\n // first try started devices/emulators\n for (const device of devices) {\n // direct adb calls to the specific device\n await adb.setDeviceId(device.udid);\n const rawDeviceOS = await adb.getPlatformVersion();\n // The device OS could either be a number, like `6.0`\n // or an abbreviation, like `R`\n availDevices.push(`${device.udid} (${rawDeviceOS})`);\n const deviceOS = semver.coerce(rawDeviceOS) || rawDeviceOS;\n if (!deviceOS) {\n continue;\n }\n\n const bothVersionsCanBeCoerced = semver.valid(deviceOS) && semver.valid(platformVersion);\n const bothVersionsAreStrings = _.isString(deviceOS) && _.isString(platformVersion);\n if (bothVersionsCanBeCoerced && deviceOS.version === platformVersion.version\n || bothVersionsAreStrings && _.toLower(deviceOS) === _.toLower(platformVersion)) {\n // Got an exact match - proceed immediately\n udid = device.udid;\n break;\n } else if (!bothVersionsCanBeCoerced) {\n // There is no point to check for partial match if either of version numbers is not coercible\n continue;\n }\n\n if ((!_.includes(opts.platformVersion, '.') && platformVersion.major === deviceOS.major\n || platformVersion.major === deviceOS.major && platformVersion.minor === deviceOS.minor)\n // Got a partial match - make sure we consider the most recent\n // device version available on the host system\n && (partialMatchCandidate && semver.gt(deviceOS, _.values(partialMatchCandidate)[0])\n || !partialMatchCandidate)) {\n partialMatchCandidate = {[device.udid]: deviceOS};\n }\n }\n if (!udid && partialMatchCandidate) {\n udid = _.keys(partialMatchCandidate)[0];\n await adb.setDeviceId(udid);\n }\n\n if (!udid) {\n // we couldn't find anything! quit\n logger.errorAndThrow(`Unable to find an active device or emulator ` +\n `with OS ${opts.platformVersion}. The following are available: ` +\n availDevices.join(', '));\n }\n\n emPort = adb.getPortFromEmulatorString(udid);\n } else {\n // a udid was not given, grab the first device we see\n udid = devices[0].udid;\n emPort = adb.getPortFromEmulatorString(udid);\n }\n }\n\n logger.info(`Using device: ${udid}`);\n return {udid, emPort};\n};\n\n// returns a new adb instance with deviceId set\nhelpers.createADB = async function createADB (opts = {}) {\n const {udid, emPort} = opts;\n const adb = await helpers.createBaseADB(opts);\n adb.setDeviceId(udid);\n if (emPort) {\n adb.setEmulatorPort(emPort);\n }\n\n return adb;\n};\n\nhelpers.validatePackageActivityNames = function validatePackageActivityNames (opts) {\n for (const key of ['appPackage', 'appActivity', 'appWaitPackage', 'appWaitActivity']) {\n const name = opts[key];\n if (!name) {\n continue;\n }\n\n const match = /([^\\w.*,])+/.exec(name);\n if (!match) {\n continue;\n }\n\n logger.warn(`Capability '${key}' is expected to only include latin letters, digits, underscore, dot, comma and asterisk characters.`);\n logger.warn(`Current value '${name}' has non-matching character at index ${match.index}: '${name.substring(0, match.index + 1)}'`);\n }\n};\n\nhelpers.getLaunchInfo = async function getLaunchInfo (adb, opts) {\n let {app, appPackage, appActivity, appWaitPackage, appWaitActivity} = opts;\n if (!app) {\n logger.warn('No app sent in, not parsing package/activity');\n return;\n }\n\n this.validatePackageActivityNames(opts);\n\n if (appPackage && appActivity) {\n return;\n }\n\n logger.debug('Parsing package and activity from app manifest');\n let {apkPackage, apkActivity} =\n await adb.packageAndLaunchActivityFromManifest(app);\n if (apkPackage && !appPackage) {\n appPackage = apkPackage;\n }\n if (!appWaitPackage) {\n appWaitPackage = appPackage;\n }\n if (apkActivity && !appActivity) {\n appActivity = apkActivity;\n }\n if (!appWaitActivity) {\n appWaitActivity = appActivity;\n }\n logger.debug(`Parsed package and activity are: ${apkPackage}/${apkActivity}`);\n return {appPackage, appWaitPackage, appActivity, appWaitActivity};\n};\n\nhelpers.resetApp = async function resetApp (adb, opts = {}) {\n const {\n app,\n appPackage,\n fastReset,\n fullReset,\n androidInstallTimeout = PACKAGE_INSTALL_TIMEOUT,\n autoGrantPermissions,\n allowTestPackages\n } = opts;\n\n if (!appPackage) {\n throw new Error(\"'appPackage' option is required\");\n }\n\n const isInstalled = await adb.isAppInstalled(appPackage);\n\n if (isInstalled) {\n try {\n await adb.forceStop(appPackage);\n } catch (ign) {}\n // fullReset has priority over fastReset\n if (!fullReset && fastReset) {\n const output = await adb.clear(appPackage);\n if (_.isString(output) && output.toLowerCase().includes('failed')) {\n throw new Error(`Cannot clear the application data of '${appPackage}'. Original error: ${output}`);\n }\n // executing `shell pm clear` resets previously assigned application permissions as well\n if (autoGrantPermissions) {\n try {\n await adb.grantAllPermissions(appPackage);\n } catch (error) {\n logger.error(`Unable to grant permissions requested. Original error: ${error.message}`);\n }\n }\n logger.debug(`Performed fast reset on the installed '${appPackage}' application (stop and clear)`);\n return;\n }\n }\n\n if (!app) {\n throw new Error(\"'app' option is required for reinstall\");\n }\n\n logger.debug(`Running full reset on '${appPackage}' (reinstall)`);\n if (isInstalled) {\n await adb.uninstallApk(appPackage);\n }\n await adb.install(app, {\n grantPermissions: autoGrantPermissions,\n timeout: androidInstallTimeout,\n allowTestPackages,\n });\n};\n\nhelpers.installApk = async function installApk (adb, opts = {}) {\n const {\n app,\n appPackage,\n fastReset,\n fullReset,\n androidInstallTimeout = PACKAGE_INSTALL_TIMEOUT,\n autoGrantPermissions,\n allowTestPackages,\n enforceAppInstall,\n } = opts;\n\n if (!app || !appPackage) {\n throw new Error(\"'app' and 'appPackage' options are required\");\n }\n\n if (fullReset) {\n await this.resetApp(adb, opts);\n return;\n }\n\n const {\n appState,\n wasUninstalled\n } = await adb.installOrUpgrade(app, appPackage, {\n grantPermissions: autoGrantPermissions,\n timeout: androidInstallTimeout,\n allowTestPackages,\n enforceCurrentBuild: enforceAppInstall,\n });\n\n // There is no need to reset the newly installed app\n const isInstalledOverExistingApp = !wasUninstalled\n && appState !== adb.APP_INSTALL_STATE.NOT_INSTALLED;\n if (fastReset && isInstalledOverExistingApp) {\n logger.info(`Performing fast reset on '${appPackage}'`);\n await this.resetApp(adb, opts);\n }\n};\n\n/**\n * Installs an array of apks\n * @param {ADB} adb Instance of Appium ADB object\n * @param {Object} opts Opts defined in driver.js\n */\nhelpers.installOtherApks = async function installOtherApks (otherApps, adb, opts) {\n let {\n androidInstallTimeout = PACKAGE_INSTALL_TIMEOUT,\n autoGrantPermissions,\n allowTestPackages\n } = opts;\n\n // Install all of the APK's asynchronously\n await B.all(otherApps.map((otherApp) => {\n logger.debug(`Installing app: ${otherApp}`);\n return adb.installOrUpgrade(otherApp, null, {\n grantPermissions: autoGrantPermissions,\n timeout: androidInstallTimeout,\n allowTestPackages,\n });\n }));\n};\n\n/**\n * Uninstall an array of packages\n * @param {ADB} adb Instance of Appium ADB object\n * @param {Array<string>} appPackages An array of package names to uninstall. If this includes `'*'`, uninstall all of 3rd party apps\n * @param {Array<string>} filterPackages An array of packages does not uninstall when `*` is provided as `appPackages`\n */\nhelpers.uninstallOtherPackages = async function uninstallOtherPackages (adb, appPackages, filterPackages = []) {\n if (appPackages.includes('*')) {\n logger.debug('Uninstall third party packages');\n appPackages = await this.getThirdPartyPackages(adb, filterPackages);\n }\n\n logger.debug(`Uninstalling packages: ${appPackages}`);\n await B.all(appPackages.map((appPackage) => adb.uninstallApk(appPackage)));\n};\n\n/**\n * Get third party packages filtered with `filterPackages`\n * @param {ADB} adb Instance of Appium ADB object\n * @param {Array<string>} filterPackages An array of packages does not uninstall when `*` is provided as `appPackages`\n * @returns {Array<string>} An array of installed third pary packages\n */\nhelpers.getThirdPartyPackages = async function getThirdPartyPackages (adb, filterPackages = []) {\n try {\n const packagesString = await adb.shell(['pm', 'list', 'packages', '-3']);\n const appPackagesArray = packagesString.trim().replace(/package:/g, '').split(EOL);\n logger.debug(`'${appPackagesArray}' filtered with '${filterPackages}'`);\n return _.difference(appPackagesArray, filterPackages);\n } catch (err) {\n logger.warn(`Unable to get packages with 'adb shell pm list packages -3': ${err.message}`);\n return [];\n }\n};\n\nhelpers.initUnicodeKeyboard = async function initUnicodeKeyboard (adb) {\n logger.debug('Enabling Unicode keyboard support');\n\n // get the default IME so we can return back to it later if we want\n let defaultIME = await adb.defaultIME();\n\n logger.debug(`Unsetting previous IME ${defaultIME}`);\n const appiumIME = `${SETTINGS_HELPER_PKG_ID}/.UnicodeIME`;\n logger.debug(`Setting IME to '${appiumIME}'`);\n await adb.enableIME(appiumIME);\n await adb.setIME(appiumIME);\n return defaultIME;\n};\n\nhelpers.setMockLocationApp = async function setMockLocationApp (adb, app) {\n try {\n if (await adb.getApiLevel() < 23) {\n await adb.shell(['settings', 'put', 'secure', 'mock_location', '1']);\n } else {\n await adb.shell(['appops', 'set', app, 'android:mock_location', 'allow']);\n }\n } catch (err) {\n logger.warn(`Unable to set mock location for app '${app}': ${err.message}`);\n return;\n }\n try {\n let pkgIds = [];\n if (await adb.fileExists(MOCK_APP_IDS_STORE)) {\n try {\n pkgIds = JSON.parse(await adb.shell(['cat', MOCK_APP_IDS_STORE]));\n } catch (ign) {}\n }\n if (pkgIds.includes(app)) {\n return;\n }\n pkgIds.push(app);\n const tmpRoot = await tempDir.openDir();\n const srcPath = path.posix.join(tmpRoot, path.posix.basename(MOCK_APP_IDS_STORE));\n try {\n await fs.writeFile(srcPath, JSON.stringify(pkgIds), 'utf8');\n await adb.pushFile(srcPath, MOCK_APP_IDS_STORE);\n } finally {\n await fs.rimraf(tmpRoot);\n }\n } catch (e) {\n logger.warn(`Unable to persist mock location app id '${app}': ${e.message}`);\n }\n};\n\nhelpers.resetMockLocation = async function resetMockLocation (adb) {\n try {\n if (await adb.getApiLevel() < 23) {\n await adb.shell(['settings', 'put', 'secure', 'mock_location', '0']);\n return;\n }\n\n const thirdPartyPkgIdsPromise = helpers.getThirdPartyPackages(adb);\n let pkgIds = [];\n if (await adb.fileExists(MOCK_APP_IDS_STORE)) {\n try {\n pkgIds = JSON.parse(await adb.shell(['cat', MOCK_APP_IDS_STORE]));\n } catch (ign) {}\n }\n const thirdPartyPkgIds = await thirdPartyPkgIdsPromise;\n // Only include currently installed packages\n const resultPkgs = _.intersection(pkgIds, thirdPartyPkgIds);\n if (_.size(resultPkgs) <= 1) {\n await adb.shell(['appops', 'set', resultPkgs[0] ?? SETTINGS_HELPER_PKG_ID, 'android:mock_location', 'deny']);\n return;\n }\n\n logger.debug(`Resetting mock_location permission for the following apps: ${resultPkgs}`);\n await B.all(resultPkgs.map((pkgId) => (async () => {\n try {\n await adb.shell(['appops', 'set', pkgId, 'android:mock_location', 'deny']);\n } catch (ign) {}\n })()));\n } catch (err) {\n logger.warn(`Unable to reset mock location: ${err.message}`);\n }\n};\n\nhelpers.installHelperApp = async function installHelperApp (adb, apkPath, packageId) {\n // Sometimes adb push or adb instal take more time than expected to install an app\n // e.g. https://github.com/appium/io.appium.settings/issues/40#issuecomment-476593174\n await retry(2, async function retryInstallHelperApp () {\n await adb.installOrUpgrade(apkPath, packageId, {grantPermissions: true});\n });\n};\n\n/**\n * Pushes and installs io.appium.settings app.\n * Throws an error if the setting app is required\n *\n * @param {Adb} adb - The adb module instance.\n * @param {Object} opts - Driver options dictionary.\n * @param {boolean} throwError [false] - Whether throw an error if Settings app fails to start\n * @throws {Error} If throwError is true and something happens in installation step\n */\nhelpers.pushSettingsApp = async function pushSettingsApp (adb, throwError = false, opts = {}) {\n logger.debug('Pushing settings apk to device...');\n\n try {\n await helpers.installHelperApp(adb, settingsApkPath, SETTINGS_HELPER_PKG_ID, throwError);\n } catch (err) {\n if (throwError) {\n throw err;\n }\n\n logger.warn(`Ignored error while installing '${settingsApkPath}': ` +\n `'${err.message}'. Features that rely on this helper ` +\n 'require the apk such as toggle WiFi and getting location ' +\n 'will raise an error if you try to use them.');\n }\n\n // Reinstall would stop the settings helper process anyway, so\n // there is no need to continue if the application is still running\n if (await adb.processExists(SETTINGS_HELPER_PKG_ID)) {\n logger.debug(`${SETTINGS_HELPER_PKG_ID} is already running. ` +\n `There is no need to reset its permissions.`);\n return;\n }\n\n const apiLevel = await adb.getApiLevel();\n if (apiLevel >= 29) {\n // https://github.com/appium/io.appium.settings#internal-audio--video-recording\n try {\n await adb.shell(['appops', 'set', SETTINGS_HELPER_PKG_ID, 'PROJECT_MEDIA', 'allow']);\n } catch (err) {\n logger.debug(err);\n }\n }\n if (apiLevel <= 23) { // Android 6- devices should have granted permissions\n // https://github.com/appium/appium/pull/11640#issuecomment-438260477\n const perms = ['SET_ANIMATION_SCALE', 'CHANGE_CONFIGURATION', 'ACCESS_FINE_LOCATION'];\n logger.info(`Granting permissions ${perms} to '${SETTINGS_HELPER_PKG_ID}'`);\n await adb.grantPermissions(SETTINGS_HELPER_PKG_ID, perms.map((x) => `android.permission.${x}`));\n }\n\n // launch io.appium.settings app due to settings failing to be set\n // if the app is not launched prior to start the session on android 7+\n // see https://github.com/appium/appium/issues/8957\n try {\n await adb.requireRunningSettingsApp({\n timeout: helpers.isEmulator(adb, opts) ? 30000 : 5000\n });\n } catch (err) {\n logger.debug(err);\n if (throwError) {\n throw err;\n }\n }\n};\n\n/**\n * Extracts string.xml and converts it to string.json and pushes\n * it to /data/local/tmp/string.json on for use of bootstrap\n * If app is not present to extract string.xml it deletes remote strings.json\n * If app does not have strings.xml we push an empty json object to remote\n *\n * @param {?string} language - Language abbreviation, for example 'fr'. The default language\n * is used if this argument is not defined.\n * @param {Object} adb - The adb module instance.\n * @param {Object} opts - Driver options dictionary.\n * @returns {Object} The dictionary, where string resource identifiers are keys\n * along with their corresponding values for the given language or an empty object\n * if no matching resources were extracted.\n */\nhelpers.pushStrings = async function pushStrings (language, adb, opts) {\n const remoteDir = '/data/local/tmp';\n const stringsJson = 'strings.json';\n const remoteFile = path.posix.resolve(remoteDir, stringsJson);\n\n // clean up remote string.json if present\n await adb.rimraf(remoteFile);\n\n let app;\n try {\n app = opts.app || await adb.pullApk(opts.appPackage, opts.tmpDir);\n } catch (err) {\n logger.info(`Failed to pull an apk from '${opts.appPackage}' to '${opts.tmpDir}'. Original error: ${err.message}`);\n }\n\n if (_.isEmpty(opts.appPackage) || !(await fs.exists(app))) {\n logger.debug(`No app or package specified. Returning empty strings`);\n return {};\n }\n\n const stringsTmpDir = path.resolve(opts.tmpDir, opts.appPackage);\n try {\n logger.debug('Extracting strings from apk', app, language, stringsTmpDir);\n const {apkStrings, localPath} = await adb.extractStringsFromApk(app, language, stringsTmpDir);\n await adb.push(localPath, remoteDir);\n return apkStrings;\n } catch (err) {\n logger.warn(`Could not get strings, continuing anyway. Original error: ${err.message}`);\n await adb.shell('echo', [`'{}' > ${remoteFile}`]);\n } finally {\n await fs.rimraf(stringsTmpDir);\n }\n return {};\n};\n\nhelpers.unlockWithHelperApp = async function unlockWithHelperApp (adb) {\n logger.info('Unlocking screen');\n\n // Unlock succeed with a couple of retries.\n let firstRun = true;\n await retry(3, async function launchHelper () {\n // To reduce a time to call adb.isScreenLocked() since `adb shell dumpsys window` is easy to hang adb commands\n if (firstRun) {\n firstRun = false;\n } else {\n try {\n if (!(await adb.isScreenLocked())) {\n return;\n }\n } catch (e) {\n logger.warn(`Error in isScreenLocked: ${e.message}`);\n logger.warn('\"adb shell dumpsys window\" command has timed out.');\n logger.warn('The reason of this timeout is the delayed adb response. Resetting adb server can improve it.');\n }\n }\n\n logger.info(`Launching ${SETTINGS_HELPER_UNLOCK_ACTIVITY}`);\n await adb.shell([\n 'am', 'start',\n '-n', `${SETTINGS_HELPER_PKG_ID}/${SETTINGS_HELPER_UNLOCK_ACTIVITY}`,\n '-c', 'android.intent.category.LAUNCHER',\n '-a', 'android.intent.action.MAIN',\n '-f', '0x10200000',\n ]);\n await B.delay(1000);\n });\n};\n\nhelpers.unlock = async function unlock (driver, adb, capabilities) {\n if (!(await adb.isScreenLocked())) {\n logger.info('Screen already unlocked, doing nothing');\n return;\n }\n logger.debug('Screen is locked, trying to unlock');\n\n if (!capabilities.unlockType && !capabilities.unlockKey) {\n logger.warn('Using app unlock, this is going to be deprecated!');\n await helpers.unlockWithHelperApp(adb);\n return;\n }\n\n const {\n unlockType,\n unlockKey,\n unlockStrategy,\n unlockSuccessTimeout,\n } = unlocker.validateUnlockCapabilities(capabilities);\n if (unlockKey && unlockType !== FINGERPRINT_UNLOCK\n && (_.isNil(unlockStrategy) || _.toLower(unlockStrategy) === 'locksettings')\n && await adb.isLockManagementSupported()) {\n await unlocker.fastUnlock(adb, {\n credential: unlockKey,\n credentialType: toCredentialType(unlockType),\n });\n } else {\n const unlockMethod = {\n [PIN_UNLOCK]: unlocker.pinUnlock,\n [PIN_UNLOCK_KEY_EVENT]: unlocker.pinUnlockWithKeyEvent,\n [PASSWORD_UNLOCK]: unlocker.passwordUnlock,\n [PATTERN_UNLOCK]: unlocker.patternUnlock,\n [FINGERPRINT_UNLOCK]: unlocker.fingerprintUnlock,\n }[unlockType];\n await unlockMethod(adb, driver, capabilities);\n }\n await helpers.verifyUnlock(adb, unlockSuccessTimeout);\n};\n\nhelpers.verifyUnlock = async function verifyUnlock (adb, timeoutMs = null) {\n try {\n await waitForCondition(async () => !(await adb.isScreenLocked()), {\n waitMs: timeoutMs ?? 2000,\n intervalMs: 500,\n });\n } catch (ign) {\n throw new Error('The device has failed to be unlocked');\n }\n logger.info('The device has been successfully unlocked');\n};\n\nhelpers.initDevice = async function initDevice (adb, opts) {\n const {\n skipDeviceInitialization,\n locale,\n language,\n localeScript,\n unicodeKeyboard,\n disableWindowAnimation,\n skipUnlock,\n mockLocationApp,\n skipLogcatCapture,\n logcatFormat,\n logcatFilterSpecs,\n } = opts;\n\n if (skipDeviceInitialization) {\n logger.info(`'skipDeviceInitialization' is set. Skipping device initialization.`);\n } else {\n await adb.waitForDevice();\n // pushSettingsApp required before calling ensureDeviceLocale for API Level 24+\n\n // Some feature such as location/wifi are not necessary for all users,\n // but they require the settings app. So, try to configure it while Appium\n // does not throw error even if they fail.\n const shouldThrowError = language\n || locale\n || localeScript\n || unicodeKeyboard\n || disableWindowAnimation\n || !skipUnlock;\n await helpers.pushSettingsApp(adb, shouldThrowError, opts);\n }\n\n if (!helpers.isEmulator(adb, opts)) {\n if (mockLocationApp || _.isUndefined(mockLocationApp)) {\n await helpers.setMockLocationApp(adb, mockLocationApp || SETTINGS_HELPER_PKG_ID);\n } else {\n await helpers.resetMockLocation(adb);\n }\n }\n\n if (language || locale) {\n await helpers.ensureDeviceLocale(adb, language, locale, localeScript);\n }\n\n if (skipLogcatCapture) {\n logger.info(`'skipLogcatCapture' is set. Skipping starting logcat capture.`);\n } else {\n await adb.startLogcat({\n format: logcatFormat,\n filterSpecs: logcatFilterSpecs,\n });\n }\n\n if (unicodeKeyboard) {\n return await helpers.initUnicodeKeyboard(adb);\n }\n};\n\nhelpers.removeNullProperties = function removeNullProperties (obj) {\n for (let key of _.keys(obj)) {\n if (_.isNull(obj[key]) || _.isUndefined(obj[key])) {\n delete obj[key];\n }\n }\n};\n\nhelpers.truncateDecimals = function truncateDecimals (number, digits) {\n let multiplier = Math.pow(10, digits),\n adjustedNum = number * multiplier,\n truncatedNum = Math[adjustedNum < 0 ? 'ceil' : 'floor'](adjustedNum);\n\n return truncatedNum / multiplier;\n};\n\nhelpers.isChromeBrowser = function isChromeBrowser (browser) {\n return _.includes(Object.keys(CHROME_BROWSER_PACKAGE_ACTIVITY), (browser || '').toLowerCase());\n};\n\nhelpers.getChromePkg = function getChromePkg (browser) {\n return CHROME_BROWSER_PACKAGE_ACTIVITY[browser.toLowerCase()] || CHROME_BROWSER_PACKAGE_ACTIVITY.default;\n};\n\nhelpers.removeAllSessionWebSocketHandlers = async function removeAllSessionWebSocketHandlers (server, sessionId) {\n if (!server || !_.isFunction(server.getWebSocketHandlers)) {\n return;\n }\n\n const activeHandlers = await server.getWebSocketHandlers(sessionId);\n for (const pathname of _.keys(activeHandlers)) {\n await server.removeWebSocketHandler(pathname);\n }\n};\n\n/**\n * Takes a desired capability and tries to JSON.parse it as an array,\n * and either returns the parsed array or a singleton array.\n *\n * @param {any} cap A desired capability\n */\nhelpers.parseArray = function parseArray (cap) {\n let parsedCaps;\n try {\n parsedCaps = JSON.parse(cap);\n } catch (ign) { }\n\n if (_.isArray(parsedCaps)) {\n return parsedCaps;\n } else if (_.isString(cap)) {\n return [cap];\n }\n\n throw new Error(`must provide a string or JSON Array; received ${cap}`);\n};\n\n/**\n * Validate desired capabilities. Returns true if capability is valid\n *\n * @param {*} cap A desired capability\n * @return {boolean} Returns true if the capability is valid\n * @throws {Error} If the caps has invalid capability\n */\nhelpers.validateDesiredCaps = function validateDesiredCaps (caps) {\n if (caps.browserName) {\n if (caps.app) {\n // warn if the capabilities have both `app` and `browser, although this is common with selenium grid\n logger.warn(`The desired capabilities should generally not include both an 'app' and a 'browserName'`);\n }\n if (caps.appPackage) {\n logger.errorAndThrow(`The desired should not include both of an 'appPackage' and a 'browserName'`);\n }\n }\n\n if (caps.uninstallOtherPackages) {\n try {\n this.parseArray(caps.uninstallOtherPackages);\n } catch (e) {\n logger.errorAndThrow(`Could not parse \"uninstallOtherPackages\" capability: ${e.message}`);\n }\n }\n\n return true;\n};\n\n/**\n * Adjust the capabilities for a browser session\n *\n * @param {Object} caps - Current capabilities object\n * !!! The object is mutated by this method call !!!\n * @returns {Object} The same possibly mutated `opts` instance.\n * No mutation is happening is the current session if\n * appPackage/appActivity caps have already been provided.\n */\nhelpers.adjustBrowserSessionCaps = function adjustBrowserSessionCaps (caps = {}) {\n const { browserName } = caps;\n logger.info(`The current session is considered browser-based`);\n logger.info(`Supported browser names: ${JSON.stringify(_.keys(CHROME_BROWSER_PACKAGE_ACTIVITY))}`);\n if (caps.appPackage || caps.appActivity) {\n logger.info(`Not overriding appPackage/appActivity capability values for '${browserName}' ` +\n 'because some of them have been already provided');\n return caps;\n }\n\n const {pkg, activity} = this.getChromePkg(browserName);\n caps.appPackage = pkg;\n caps.appActivity = activity;\n logger.info(`appPackage/appActivity capabilities have been automatically set to ${pkg}/${activity} ` +\n `for '${browserName}'`);\n logger.info(`Consider changing the browserName to the one from the list of supported browser names ` +\n `or provide custom appPackage/appActivity capability values if the automatically assigned ones do ` +\n `not make sense`);\n return caps;\n};\n\n/**\n * Checks whether the current device under test is an emulator\n *\n * @param {ADB} adb - appium-adb instance\n * @param {Object} opts - driver options mapping\n * @returns {boolean} `true` if the device is an Android emulator\n */\nhelpers.isEmulator = function isEmulator (adb, opts) {\n const possibleNames = [opts.udid, adb?.curDeviceId];\n return !!opts.avd || possibleNames.some((x) => EMULATOR_PATTERN.test(x));\n};\n\nhelpers.bootstrap = Bootstrap;\nhelpers.unlocker = unlocker;\n\nexport { helpers, SETTINGS_HELPER_PKG_ID, APP_STATE, prepareAvdArgs, ensureNetworkSpeed };\nexport default helpers;\n"],"mappings":";;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AAIA;;AACA;;;;;;AAEA,MAAMA,kBAAkB,GAAG,gCAA3B;AACA,MAAMC,uBAAuB,GAAG,KAAhC;AAEA,MAAMC,+BAA+B,GAAG;EACtCC,MAAM,EAAE;IACNC,GAAG,EAAE,oBADC;IAENC,QAAQ,EAAE;EAFJ,CAD8B;EAKtCC,QAAQ,EAAE;IACRF,GAAG,EAAE,2BADG;IAERC,QAAQ,EAAE;EAFF,CAL4B;EAStCE,UAAU,EAAE;IACVH,GAAG,EAAE,iBADK;IAEVC,QAAQ,EAAE;EAFA,CAT0B;EAatCG,OAAO,EAAE;IACPJ,GAAG,EAAE,qBADE;IAEPC,QAAQ,EAAE;EAFH,CAb6B;EAiBtC,oBAAoB;IAClBD,GAAG,EAAE,qBADa;IAElBC,QAAQ,EAAE;EAFQ,CAjBkB;EAqBtC,oBAAoB;IAClBD,GAAG,EAAE,4BADa;IAElBC,QAAQ,EAAE;EAFQ,CArBkB;EAyBtCI,OAAO,EAAE;IACPL,GAAG,EAAE,oBADE;IAEPC,QAAQ,EAAE;EAFH;AAzB6B,CAAxC;AA8BA,MAAMK,sBAAsB,GAAG,oBAA/B;;AACA,MAAMC,+BAA+B,GAAG,SAAxC;AACA,MAAMC,gBAAgB,GAAG,eAAzB;AAGA,MAAMC,SAAS,GAAGC,MAAM,CAACC,MAAP,CAAc;EAC9BC,aAAa,EAAE,CADe;EAE9BC,WAAW,EAAE,CAFiB;EAG9BC,qBAAqB,EAAE,CAHO;EAI9BC,qBAAqB,EAAE;AAJO,CAAd,CAAlB;;;AAQA,SAASC,kBAAT,CAA6BC,GAA7B,EAAkCC,YAAlC,EAAgD;EAC9C,IAAIC,eAAA,CAAEC,MAAF,CAASH,GAAG,CAACI,aAAb,EAA4BC,QAA5B,CAAqCJ,YAArC,CAAJ,EAAwD;IACtD,OAAOA,YAAP;EACD;;EACDK,eAAA,CAAOC,IAAP,CAAa,8BAA6BN,YAAa,qBAAoBD,GAAG,CAACI,aAAJ,CAAkBI,IAAK,IAAtF,GACT,qBAAoBN,eAAA,CAAEC,MAAF,CAASH,GAAG,CAACI,aAAb,CAA4B,EADnD;;EAEA,OAAOJ,GAAG,CAACI,aAAJ,CAAkBI,IAAzB;AACD;;AAED,SAASC,cAAT,CAAyBT,GAAzB,EAA8BU,IAA9B,EAAoC;EAClC,MAAM;IACJT,YADI;IAEJU,UAFI;IAGJC;EAHI,IAIFF,IAJJ;EAKA,MAAMG,MAAM,GAAG,EAAf;;EACA,IAAID,OAAJ,EAAa;IACX,IAAIV,eAAA,CAAEY,OAAF,CAAUF,OAAV,CAAJ,EAAwB;MACtBC,MAAM,CAACE,IAAP,CAAY,GAAGH,OAAf;IACD,CAFD,MAEO;MACLC,MAAM,CAACE,IAAP,CAAY,GAAIC,aAAA,CAAKC,UAAL,CAAiB,GAAEL,OAAQ,EAA3B,CAAhB;IACD;EACF;;EACD,IAAIX,YAAJ,EAAkB;IAChBY,MAAM,CAACE,IAAP,CAAY,WAAZ,EAAyBhB,kBAAkB,CAACC,GAAD,EAAMC,YAAN,CAA3C;EACD;;EACD,IAAIU,UAAJ,EAAgB;IACdE,MAAM,CAACE,IAAP,CAAY,YAAZ;EACD;;EACD,OAAOF,MAAP;AACD;;AAED,SAASK,gBAAT,CAA2BC,UAA3B,EAAuC;EACrC,MAAMN,MAAM,GAAG;IACb,CAACO,yBAAD,GAAc,KADD;IAEb,CAACC,mCAAD,GAAwB,KAFX;IAGb,CAACC,8BAAD,GAAmB,UAHN;IAIb,CAACC,6BAAD,GAAkB;EAJL,EAKbJ,UALa,CAAf;;EAMA,IAAIN,MAAJ,EAAY;IACV,OAAOA,MAAP;EACD;;EACD,MAAM,IAAIW,KAAJ,CAAW,gBAAeL,UAAW,gBAArC,CAAN;AACD;;AAGD,MAAMM,OAAO,GAAG,EAAhB;;;AAEAA,OAAO,CAACC,aAAR,GAAwB,eAAeA,aAAf,CAA8BhB,IAAI,GAAG,EAArC,EAAyC;EAG/D,MAAM;IACJiB,OADI;IAEJC,kBAFI;IAGJC,aAHI;IAIJC,sBAJI;IAKJC,cALI;IAMJC,WANI;IAOJC,YAPI;IAQJC,gBARI;IASJC,QATI;IAUJC,WAVI;IAWJC,oBAXI;IAYJC,iBAZI;IAaJC,mBAbI;IAcJC;EAdI,IAeF9B,IAfJ;EAgBA,OAAO,MAAM+B,kBAAA,CAAIC,SAAJ,CAAc;IACzBf,OADyB;IAEzBC,kBAFyB;IAGzBC,aAHyB;IAIzBC,sBAJyB;IAKzBC,cALyB;IAMzBC,WANyB;IAOzBC,YAPyB;IAQzBC,gBARyB;IASzBC,QATyB;IAUzBC,WAVyB;IAWzBC,oBAXyB;IAYzBC,iBAZyB;IAazBC,mBAbyB;IAczBC;EAdyB,CAAd,CAAb;AAgBD,CAnCD;;AAqCAf,OAAO,CAACkB,eAAR,GAA0B,eAAeA,eAAf,CAAgC3C,GAAhC,EAAqCU,IAArC,EAA2C;EACnE,MAAM;IACJkC,GADI;IAEJC,MAAM,EAAEC,GAFJ;IAGJC,QAHI;IAIJC,MAAM,EAAEC,OAJJ;IAKJC,gBAAgB,EAAEC,aALd;IAMJC,eAAe,EAAEC;EANb,IAOF3C,IAPJ;;EAQA,IAAI,CAACkC,GAAL,EAAU;IACR,MAAM,IAAIpB,KAAJ,CAAU,oCAAV,CAAN;EACD;;EAED,MAAM8B,OAAO,GAAGV,GAAG,CAACW,OAAJ,CAAY,GAAZ,EAAiB,EAAjB,CAAhB;EACA,IAAIC,iBAAiB,GAAG,IAAxB;;EACA,IAAI;IACF,MAAMxD,GAAG,CAACyD,sBAAJ,CAA2BH,OAA3B,EAAoC,IAApC,CAAN;EACD,CAFD,CAEE,OAAOI,CAAP,EAAU;IACVpD,eAAA,CAAOqD,KAAP,CAAc,aAAYL,OAAQ,qBAAoBI,CAAC,CAACE,OAAQ,EAAhE;;IACAJ,iBAAiB,GAAG,KAApB;EACD;;EACD,MAAMK,IAAI,GAAGpD,cAAc,CAACT,GAAD,EAAMU,IAAN,CAA3B;;EACA,IAAI8C,iBAAJ,EAAuB;IACrB,IAAIK,IAAI,CAACxD,QAAL,CAAc,YAAd,CAAJ,EAAiC;MAC/BC,eAAA,CAAOqD,KAAP,CAAc,YAAWL,OAAQ,0CAAjC;;MACA,MAAMtD,GAAG,CAAC8D,YAAJ,CAAiBR,OAAjB,CAAN;IACD,CAHD,MAGO;MACLhD,eAAA,CAAOqD,KAAP,CAAa,kDAAb;;MACA;IACD;EACF;;EACD,MAAM3D,GAAG,CAAC+D,SAAJ,CAAcnB,GAAd,EAAmB;IACvBiB,IADuB;IAEvBf,GAFuB;IAGvBC,QAHuB;IAIvBE,OAJuB;IAKvBE,aALuB;IAMvBE;EANuB,CAAnB,CAAN;AAQD,CAvCD;;AAqDA5B,OAAO,CAACuC,kBAAR,GAA6B,eAAeA,kBAAf,CAAmChE,GAAnC,EAAwC+C,QAAxC,EAAkDE,OAAlD,EAA2DgB,MAAM,GAAG,IAApE,EAA0E;EACrG,IAAI,CAAC/D,eAAA,CAAEgE,QAAF,CAAWnB,QAAX,CAAD,IAAyB,CAAC7C,eAAA,CAAEgE,QAAF,CAAWjB,OAAX,CAA9B,EAAmD;IACjD3C,eAAA,CAAOC,IAAP,CAAa,wDAAb;;IACAD,eAAA,CAAOC,IAAP,CAAa,kBAAiBwC,QAAS,mBAAkBE,OAAQ,GAAjE;;IACA;EACD;;EAED,MAAMjD,GAAG,CAACmE,wBAAJ,CAA6BpB,QAA7B,EAAuCE,OAAvC,EAAgDgB,MAAhD,CAAN;;EAEA,IAAI,EAAC,MAAMjE,GAAG,CAACoE,mBAAJ,CAAwBrB,QAAxB,EAAkCE,OAAlC,EAA2CgB,MAA3C,CAAP,CAAJ,EAA+D;IAC7D,MAAML,OAAO,GAAGK,MAAM,GAAI,aAAYlB,QAAS,cAAaE,OAAQ,gBAAegB,MAAO,EAApE,GAAyE,aAAYlB,QAAS,iBAAgBE,OAAQ,EAA5I;IACA,MAAM,IAAIzB,KAAJ,CAAW,iBAAgBoC,OAAQ,EAAnC,CAAN;EACD;AACF,CAbD;;AAeAnC,OAAO,CAAC4C,qBAAR,GAAgC,eAAeA,qBAAf,CAAsC3D,IAAI,GAAG,EAA7C,EAAiD;EAK/E,MAAMV,GAAG,GAAG,MAAMyB,OAAO,CAACC,aAAR,CAAsBhB,IAAtB,CAAlB;EACA,IAAI4D,IAAI,GAAG5D,IAAI,CAAC4D,IAAhB;EACA,IAAIC,MAAM,GAAG,IAAb;;EAGA,IAAI7D,IAAI,CAACkC,GAAT,EAAc;IACZ,MAAMnB,OAAO,CAACkB,eAAR,CAAwB3C,GAAxB,EAA6BU,IAA7B,CAAN;IACA4D,IAAI,GAAGtE,GAAG,CAACwE,WAAX;IACAD,MAAM,GAAGvE,GAAG,CAACyE,YAAb;EACD,CAJD,MAIO;IAELnE,eAAA,CAAOoE,IAAP,CAAY,wBAAZ;;IACA,IAAIC,OAAO,GAAG,MAAM3E,GAAG,CAAC4E,mBAAJ,EAApB;;IAGA,IAAIN,IAAJ,EAAU;MACR,IAAI,CAACpE,eAAA,CAAEG,QAAF,CAAWH,eAAA,CAAE2E,GAAF,CAAMF,OAAN,EAAe,MAAf,CAAX,EAAmCL,IAAnC,CAAL,EAA+C;QAC7ChE,eAAA,CAAOwE,aAAP,CAAsB,UAASR,IAAK,2CAApC;MACD;;MACDC,MAAM,GAAGvE,GAAG,CAAC+E,yBAAJ,CAA8BT,IAA9B,CAAT;IACD,CALD,MAKO,IAAI5D,IAAI,CAACsE,eAAT,EAA0B;MAC/BtE,IAAI,CAACsE,eAAL,GAAwB,GAAEtE,IAAI,CAACsE,eAAgB,EAAxB,CAA0BC,IAA1B,EAAvB;MAGA,MAAMD,eAAe,GAAGE,eAAA,CAAOC,MAAP,CAAczE,IAAI,CAACsE,eAAnB,KAAuCtE,IAAI,CAACsE,eAApE;;MACA1E,eAAA,CAAOoE,IAAP,CAAa,sCAAqCM,eAAgB,GAAlE;;MAIA,MAAMI,YAAY,GAAG,EAArB;MACA,IAAIC,qBAAqB,GAAG,IAA5B;;MAEA,KAAK,MAAMC,MAAX,IAAqBX,OAArB,EAA8B;QAE5B,MAAM3E,GAAG,CAACuF,WAAJ,CAAgBD,MAAM,CAAChB,IAAvB,CAAN;QACA,MAAMkB,WAAW,GAAG,MAAMxF,GAAG,CAACyF,kBAAJ,EAA1B;QAGAL,YAAY,CAACrE,IAAb,CAAmB,GAAEuE,MAAM,CAAChB,IAAK,KAAIkB,WAAY,GAAjD;QACA,MAAME,QAAQ,GAAGR,eAAA,CAAOC,MAAP,CAAcK,WAAd,KAA8BA,WAA/C;;QACA,IAAI,CAACE,QAAL,EAAe;UACb;QACD;;QAED,MAAMC,wBAAwB,GAAGT,eAAA,CAAOU,KAAP,CAAaF,QAAb,KAA0BR,eAAA,CAAOU,KAAP,CAAaZ,eAAb,CAA3D;;QACA,MAAMa,sBAAsB,GAAG3F,eAAA,CAAEgE,QAAF,CAAWwB,QAAX,KAAwBxF,eAAA,CAAEgE,QAAF,CAAWc,eAAX,CAAvD;;QACA,IAAIW,wBAAwB,IAAID,QAAQ,CAACI,OAAT,KAAqBd,eAAe,CAACc,OAAjE,IACGD,sBAAsB,IAAI3F,eAAA,CAAE6F,OAAF,CAAUL,QAAV,MAAwBxF,eAAA,CAAE6F,OAAF,CAAUf,eAAV,CADzD,EACqF;UAEnFV,IAAI,GAAGgB,MAAM,CAAChB,IAAd;UACA;QACD,CALD,MAKO,IAAI,CAACqB,wBAAL,EAA+B;UAEpC;QACD;;QAED,IAAI,CAAC,CAACzF,eAAA,CAAEG,QAAF,CAAWK,IAAI,CAACsE,eAAhB,EAAiC,GAAjC,CAAD,IAA0CA,eAAe,CAACgB,KAAhB,KAA0BN,QAAQ,CAACM,KAA7E,IACEhB,eAAe,CAACgB,KAAhB,KAA0BN,QAAQ,CAACM,KAAnC,IAA4ChB,eAAe,CAACiB,KAAhB,KAA0BP,QAAQ,CAACO,KADlF,MAIIZ,qBAAqB,IAAIH,eAAA,CAAOgB,EAAP,CAAUR,QAAV,EAAoBxF,eAAA,CAAEC,MAAF,CAASkF,qBAAT,EAAgC,CAAhC,CAApB,CAAzB,IACG,CAACA,qBALR,CAAJ,EAKoC;UAClCA,qBAAqB,GAAG;YAAC,CAACC,MAAM,CAAChB,IAAR,GAAeoB;UAAhB,CAAxB;QACD;MACF;;MACD,IAAI,CAACpB,IAAD,IAASe,qBAAb,EAAoC;QAClCf,IAAI,GAAGpE,eAAA,CAAEiG,IAAF,CAAOd,qBAAP,EAA8B,CAA9B,CAAP;QACA,MAAMrF,GAAG,CAACuF,WAAJ,CAAgBjB,IAAhB,CAAN;MACD;;MAED,IAAI,CAACA,IAAL,EAAW;QAEThE,eAAA,CAAOwE,aAAP,CAAsB,8CAAD,GAClB,WAAUpE,IAAI,CAACsE,eAAgB,iCADb,GAEnBI,YAAY,CAACgB,IAAb,CAAkB,IAAlB,CAFF;MAGD;;MAED7B,MAAM,GAAGvE,GAAG,CAAC+E,yBAAJ,CAA8BT,IAA9B,CAAT;IACD,CA1DM,MA0DA;MAELA,IAAI,GAAGK,OAAO,CAAC,CAAD,CAAP,CAAWL,IAAlB;MACAC,MAAM,GAAGvE,GAAG,CAAC+E,yBAAJ,CAA8BT,IAA9B,CAAT;IACD;EACF;;EAEDhE,eAAA,CAAOoE,IAAP,CAAa,iBAAgBJ,IAAK,EAAlC;;EACA,OAAO;IAACA,IAAD;IAAOC;EAAP,CAAP;AACD,CA5FD;;AA+FA9C,OAAO,CAACiB,SAAR,GAAoB,eAAeA,SAAf,CAA0BhC,IAAI,GAAG,EAAjC,EAAqC;EACvD,MAAM;IAAC4D,IAAD;IAAOC;EAAP,IAAiB7D,IAAvB;EACA,MAAMV,GAAG,GAAG,MAAMyB,OAAO,CAACC,aAAR,CAAsBhB,IAAtB,CAAlB;EACAV,GAAG,CAACuF,WAAJ,CAAgBjB,IAAhB;;EACA,IAAIC,MAAJ,EAAY;IACVvE,GAAG,CAACqG,eAAJ,CAAoB9B,MAApB;EACD;;EAED,OAAOvE,GAAP;AACD,CATD;;AAWAyB,OAAO,CAAC6E,4BAAR,GAAuC,SAASA,4BAAT,CAAuC5F,IAAvC,EAA6C;EAClF,KAAK,MAAM6F,GAAX,IAAkB,CAAC,YAAD,EAAe,aAAf,EAA8B,gBAA9B,EAAgD,iBAAhD,CAAlB,EAAsF;IACpF,MAAMC,IAAI,GAAG9F,IAAI,CAAC6F,GAAD,CAAjB;;IACA,IAAI,CAACC,IAAL,EAAW;MACT;IACD;;IAED,MAAMC,KAAK,GAAG,cAAcC,IAAd,CAAmBF,IAAnB,CAAd;;IACA,IAAI,CAACC,KAAL,EAAY;MACV;IACD;;IAEDnG,eAAA,CAAOC,IAAP,CAAa,eAAcgG,GAAI,sGAA/B;;IACAjG,eAAA,CAAOC,IAAP,CAAa,kBAAiBiG,IAAK,yCAAwCC,KAAK,CAACE,KAAM,MAAKH,IAAI,CAACI,SAAL,CAAe,CAAf,EAAkBH,KAAK,CAACE,KAAN,GAAc,CAAhC,CAAmC,GAA/H;EACD;AACF,CAfD;;AAiBAlF,OAAO,CAACoF,aAAR,GAAwB,eAAeA,aAAf,CAA8B7G,GAA9B,EAAmCU,IAAnC,EAAyC;EAC/D,IAAI;IAACoG,GAAD;IAAMC,UAAN;IAAkBC,WAAlB;IAA+BC,cAA/B;IAA+CC;EAA/C,IAAkExG,IAAtE;;EACA,IAAI,CAACoG,GAAL,EAAU;IACRxG,eAAA,CAAOC,IAAP,CAAY,8CAAZ;;IACA;EACD;;EAED,KAAK+F,4BAAL,CAAkC5F,IAAlC;;EAEA,IAAIqG,UAAU,IAAIC,WAAlB,EAA+B;IAC7B;EACD;;EAED1G,eAAA,CAAOqD,KAAP,CAAa,gDAAb;;EACA,IAAI;IAACwD,UAAD;IAAaC;EAAb,IACF,MAAMpH,GAAG,CAACqH,oCAAJ,CAAyCP,GAAzC,CADR;;EAEA,IAAIK,UAAU,IAAI,CAACJ,UAAnB,EAA+B;IAC7BA,UAAU,GAAGI,UAAb;EACD;;EACD,IAAI,CAACF,cAAL,EAAqB;IACnBA,cAAc,GAAGF,UAAjB;EACD;;EACD,IAAIK,WAAW,IAAI,CAACJ,WAApB,EAAiC;IAC/BA,WAAW,GAAGI,WAAd;EACD;;EACD,IAAI,CAACF,eAAL,EAAsB;IACpBA,eAAe,GAAGF,WAAlB;EACD;;EACD1G,eAAA,CAAOqD,KAAP,CAAc,oCAAmCwD,UAAW,IAAGC,WAAY,EAA3E;;EACA,OAAO;IAACL,UAAD;IAAaE,cAAb;IAA6BD,WAA7B;IAA0CE;EAA1C,CAAP;AACD,CA9BD;;AAgCAzF,OAAO,CAAC6F,QAAR,GAAmB,eAAeA,QAAf,CAAyBtH,GAAzB,EAA8BU,IAAI,GAAG,EAArC,EAAyC;EAC1D,MAAM;IACJoG,GADI;IAEJC,UAFI;IAGJQ,SAHI;IAIJC,SAJI;IAKJC,qBAAqB,GAAG7I,uBALpB;IAMJ8I,oBANI;IAOJC;EAPI,IAQFjH,IARJ;;EAUA,IAAI,CAACqG,UAAL,EAAiB;IACf,MAAM,IAAIvF,KAAJ,CAAU,iCAAV,CAAN;EACD;;EAED,MAAMoG,WAAW,GAAG,MAAM5H,GAAG,CAAC6H,cAAJ,CAAmBd,UAAnB,CAA1B;;EAEA,IAAIa,WAAJ,EAAiB;IACf,IAAI;MACF,MAAM5H,GAAG,CAAC8H,SAAJ,CAAcf,UAAd,CAAN;IACD,CAFD,CAEE,OAAOgB,GAAP,EAAY,CAAE;;IAEhB,IAAI,CAACP,SAAD,IAAcD,SAAlB,EAA6B;MAC3B,MAAMS,MAAM,GAAG,MAAMhI,GAAG,CAACiI,KAAJ,CAAUlB,UAAV,CAArB;;MACA,IAAI7G,eAAA,CAAEgE,QAAF,CAAW8D,MAAX,KAAsBA,MAAM,CAACE,WAAP,GAAqB7H,QAArB,CAA8B,QAA9B,CAA1B,EAAmE;QACjE,MAAM,IAAImB,KAAJ,CAAW,yCAAwCuF,UAAW,sBAAqBiB,MAAO,EAA1F,CAAN;MACD;;MAED,IAAIN,oBAAJ,EAA0B;QACxB,IAAI;UACF,MAAM1H,GAAG,CAACmI,mBAAJ,CAAwBpB,UAAxB,CAAN;QACD,CAFD,CAEE,OAAOqB,KAAP,EAAc;UACd9H,eAAA,CAAO8H,KAAP,CAAc,0DAAyDA,KAAK,CAACxE,OAAQ,EAArF;QACD;MACF;;MACDtD,eAAA,CAAOqD,KAAP,CAAc,0CAAyCoD,UAAW,gCAAlE;;MACA;IACD;EACF;;EAED,IAAI,CAACD,GAAL,EAAU;IACR,MAAM,IAAItF,KAAJ,CAAU,wCAAV,CAAN;EACD;;EAEDlB,eAAA,CAAOqD,KAAP,CAAc,0BAAyBoD,UAAW,eAAlD;;EACA,IAAIa,WAAJ,EAAiB;IACf,MAAM5H,GAAG,CAACqI,YAAJ,CAAiBtB,UAAjB,CAAN;EACD;;EACD,MAAM/G,GAAG,CAACsI,OAAJ,CAAYxB,GAAZ,EAAiB;IACrByB,gBAAgB,EAAEb,oBADG;IAErBc,OAAO,EAAEf,qBAFY;IAGrBE;EAHqB,CAAjB,CAAN;AAKD,CArDD;;AAuDAlG,OAAO,CAACgH,UAAR,GAAqB,eAAeA,UAAf,CAA2BzI,GAA3B,EAAgCU,IAAI,GAAG,EAAvC,EAA2C;EAC9D,MAAM;IACJoG,GADI;IAEJC,UAFI;IAGJQ,SAHI;IAIJC,SAJI;IAKJC,qBAAqB,GAAG7I,uBALpB;IAMJ8I,oBANI;IAOJC,iBAPI;IAQJe;EARI,IASFhI,IATJ;;EAWA,IAAI,CAACoG,GAAD,IAAQ,CAACC,UAAb,EAAyB;IACvB,MAAM,IAAIvF,KAAJ,CAAU,6CAAV,CAAN;EACD;;EAED,IAAIgG,SAAJ,EAAe;IACb,MAAM,KAAKF,QAAL,CAActH,GAAd,EAAmBU,IAAnB,CAAN;IACA;EACD;;EAED,MAAM;IACJiI,QADI;IAEJC;EAFI,IAGF,MAAM5I,GAAG,CAAC6I,gBAAJ,CAAqB/B,GAArB,EAA0BC,UAA1B,EAAsC;IAC9CwB,gBAAgB,EAAEb,oBAD4B;IAE9Cc,OAAO,EAAEf,qBAFqC;IAG9CE,iBAH8C;IAI9CmB,mBAAmB,EAAEJ;EAJyB,CAAtC,CAHV;EAWA,MAAMK,0BAA0B,GAAG,CAACH,cAAD,IAC9BD,QAAQ,KAAK3I,GAAG,CAACgJ,iBAAJ,CAAsBrJ,aADxC;;EAEA,IAAI4H,SAAS,IAAIwB,0BAAjB,EAA6C;IAC3CzI,eAAA,CAAOoE,IAAP,CAAa,6BAA4BqC,UAAW,GAApD;;IACA,MAAM,KAAKO,QAAL,CAActH,GAAd,EAAmBU,IAAnB,CAAN;EACD;AACF,CAtCD;;AA6CAe,OAAO,CAACwH,gBAAR,GAA2B,eAAeA,gBAAf,CAAiCC,SAAjC,EAA4ClJ,GAA5C,EAAiDU,IAAjD,EAAuD;EAChF,IAAI;IACF+G,qBAAqB,GAAG7I,uBADtB;IAEF8I,oBAFE;IAGFC;EAHE,IAIAjH,IAJJ;EAOA,MAAMyI,iBAAA,CAAEC,GAAF,CAAMF,SAAS,CAACrE,GAAV,CAAewE,QAAD,IAAc;IACtC/I,eAAA,CAAOqD,KAAP,CAAc,mBAAkB0F,QAAS,EAAzC;;IACA,OAAOrJ,GAAG,CAAC6I,gBAAJ,CAAqBQ,QAArB,EAA+B,IAA/B,EAAqC;MAC1Cd,gBAAgB,EAAEb,oBADwB;MAE1Cc,OAAO,EAAEf,qBAFiC;MAG1CE;IAH0C,CAArC,CAAP;EAKD,CAPW,CAAN,CAAN;AAQD,CAhBD;;AAwBAlG,OAAO,CAAC6H,sBAAR,GAAiC,eAAeA,sBAAf,CAAuCtJ,GAAvC,EAA4CuJ,WAA5C,EAAyDC,cAAc,GAAG,EAA1E,EAA8E;EAC7G,IAAID,WAAW,CAAClJ,QAAZ,CAAqB,GAArB,CAAJ,EAA+B;IAC7BC,eAAA,CAAOqD,KAAP,CAAa,gCAAb;;IACA4F,WAAW,GAAG,MAAM,KAAKE,qBAAL,CAA2BzJ,GAA3B,EAAgCwJ,cAAhC,CAApB;EACD;;EAEDlJ,eAAA,CAAOqD,KAAP,CAAc,0BAAyB4F,WAAY,EAAnD;;EACA,MAAMJ,iBAAA,CAAEC,GAAF,CAAMG,WAAW,CAAC1E,GAAZ,CAAiBkC,UAAD,IAAgB/G,GAAG,CAACqI,YAAJ,CAAiBtB,UAAjB,CAAhC,CAAN,CAAN;AACD,CARD;;AAgBAtF,OAAO,CAACgI,qBAAR,GAAgC,eAAeA,qBAAf,CAAsCzJ,GAAtC,EAA2CwJ,cAAc,GAAG,EAA5D,EAAgE;EAC9F,IAAI;IACF,MAAME,cAAc,GAAG,MAAM1J,GAAG,CAAC2J,KAAJ,CAAU,CAAC,IAAD,EAAO,MAAP,EAAe,UAAf,EAA2B,IAA3B,CAAV,CAA7B;IACA,MAAMC,gBAAgB,GAAGF,cAAc,CAACzE,IAAf,GAAsB1B,OAAtB,CAA8B,WAA9B,EAA2C,EAA3C,EAA+CsG,KAA/C,CAAqDC,OAArD,CAAzB;;IACAxJ,eAAA,CAAOqD,KAAP,CAAc,IAAGiG,gBAAiB,oBAAmBJ,cAAe,GAApE;;IACA,OAAOtJ,eAAA,CAAE6J,UAAF,CAAaH,gBAAb,EAA+BJ,cAA/B,CAAP;EACD,CALD,CAKE,OAAOQ,GAAP,EAAY;IACZ1J,eAAA,CAAOC,IAAP,CAAa,gEAA+DyJ,GAAG,CAACpG,OAAQ,EAAxF;;IACA,OAAO,EAAP;EACD;AACF,CAVD;;AAYAnC,OAAO,CAACwI,mBAAR,GAA8B,eAAeA,mBAAf,CAAoCjK,GAApC,EAAyC;EACrEM,eAAA,CAAOqD,KAAP,CAAa,mCAAb;;EAGA,IAAIuG,UAAU,GAAG,MAAMlK,GAAG,CAACkK,UAAJ,EAAvB;;EAEA5J,eAAA,CAAOqD,KAAP,CAAc,0BAAyBuG,UAAW,EAAlD;;EACA,MAAMC,SAAS,GAAI,GAAE9K,sBAAuB,cAA5C;;EACAiB,eAAA,CAAOqD,KAAP,CAAc,mBAAkBwG,SAAU,GAA1C;;EACA,MAAMnK,GAAG,CAACoK,SAAJ,CAAcD,SAAd,CAAN;EACA,MAAMnK,GAAG,CAACqK,MAAJ,CAAWF,SAAX,CAAN;EACA,OAAOD,UAAP;AACD,CAZD;;AAcAzI,OAAO,CAAC6I,kBAAR,GAA6B,eAAeA,kBAAf,CAAmCtK,GAAnC,EAAwC8G,GAAxC,EAA6C;EACxE,IAAI;IACF,IAAI,OAAM9G,GAAG,CAACuK,WAAJ,EAAN,IAA0B,EAA9B,EAAkC;MAChC,MAAMvK,GAAG,CAAC2J,KAAJ,CAAU,CAAC,UAAD,EAAa,KAAb,EAAoB,QAApB,EAA8B,eAA9B,EAA+C,GAA/C,CAAV,CAAN;IACD,CAFD,MAEO;MACL,MAAM3J,GAAG,CAAC2J,KAAJ,CAAU,CAAC,QAAD,EAAW,KAAX,EAAkB7C,GAAlB,EAAuB,uBAAvB,EAAgD,OAAhD,CAAV,CAAN;IACD;EACF,CAND,CAME,OAAOkD,GAAP,EAAY;IACZ1J,eAAA,CAAOC,IAAP,CAAa,wCAAuCuG,GAAI,MAAKkD,GAAG,CAACpG,OAAQ,EAAzE;;IACA;EACD;;EACD,IAAI;IACF,IAAI4G,MAAM,GAAG,EAAb;;IACA,IAAI,MAAMxK,GAAG,CAACyK,UAAJ,CAAe9L,kBAAf,CAAV,EAA8C;MAC5C,IAAI;QACF6L,MAAM,GAAGE,IAAI,CAACC,KAAL,CAAW,MAAM3K,GAAG,CAAC2J,KAAJ,CAAU,CAAC,KAAD,EAAQhL,kBAAR,CAAV,CAAjB,CAAT;MACD,CAFD,CAEE,OAAOoJ,GAAP,EAAY,CAAE;IACjB;;IACD,IAAIyC,MAAM,CAACnK,QAAP,CAAgByG,GAAhB,CAAJ,EAA0B;MACxB;IACD;;IACD0D,MAAM,CAACzJ,IAAP,CAAY+F,GAAZ;IACA,MAAM8D,OAAO,GAAG,MAAMC,gBAAA,CAAQC,OAAR,EAAtB;;IACA,MAAMC,OAAO,GAAGC,aAAA,CAAKC,KAAL,CAAW7E,IAAX,CAAgBwE,OAAhB,EAAyBI,aAAA,CAAKC,KAAL,CAAWC,QAAX,CAAoBvM,kBAApB,CAAzB,CAAhB;;IACA,IAAI;MACF,MAAMwM,WAAA,CAAGC,SAAH,CAAaL,OAAb,EAAsBL,IAAI,CAACW,SAAL,CAAeb,MAAf,CAAtB,EAA8C,MAA9C,CAAN;MACA,MAAMxK,GAAG,CAACsL,QAAJ,CAAaP,OAAb,EAAsBpM,kBAAtB,CAAN;IACD,CAHD,SAGU;MACR,MAAMwM,WAAA,CAAGI,MAAH,CAAUX,OAAV,CAAN;IACD;EACF,CAnBD,CAmBE,OAAOlH,CAAP,EAAU;IACVpD,eAAA,CAAOC,IAAP,CAAa,2CAA0CuG,GAAI,MAAKpD,CAAC,CAACE,OAAQ,EAA1E;EACD;AACF,CAjCD;;AAmCAnC,OAAO,CAAC+J,iBAAR,GAA4B,eAAeA,iBAAf,CAAkCxL,GAAlC,EAAuC;EACjE,IAAI;IACF,IAAI,OAAMA,GAAG,CAACuK,WAAJ,EAAN,IAA0B,EAA9B,EAAkC;MAChC,MAAMvK,GAAG,CAAC2J,KAAJ,CAAU,CAAC,UAAD,EAAa,KAAb,EAAoB,QAApB,EAA8B,eAA9B,EAA+C,GAA/C,CAAV,CAAN;MACA;IACD;;IAED,MAAM8B,uBAAuB,GAAGhK,OAAO,CAACgI,qBAAR,CAA8BzJ,GAA9B,CAAhC;IACA,IAAIwK,MAAM,GAAG,EAAb;;IACA,IAAI,MAAMxK,GAAG,CAACyK,UAAJ,CAAe9L,kBAAf,CAAV,EAA8C;MAC5C,IAAI;QACF6L,MAAM,GAAGE,IAAI,CAACC,KAAL,CAAW,MAAM3K,GAAG,CAAC2J,KAAJ,CAAU,CAAC,KAAD,EAAQhL,kBAAR,CAAV,CAAjB,CAAT;MACD,CAFD,CAEE,OAAOoJ,GAAP,EAAY,CAAE;IACjB;;IACD,MAAM2D,gBAAgB,GAAG,MAAMD,uBAA/B;;IAEA,MAAME,UAAU,GAAGzL,eAAA,CAAE0L,YAAF,CAAepB,MAAf,EAAuBkB,gBAAvB,CAAnB;;IACA,IAAIxL,eAAA,CAAE2L,IAAF,CAAOF,UAAP,KAAsB,CAA1B,EAA6B;MAC3B,MAAM3L,GAAG,CAAC2J,KAAJ,CAAU,CAAC,QAAD,EAAW,KAAX,EAAkBgC,UAAU,CAAC,CAAD,CAAV,IAAiBtM,sBAAnC,EAA2D,uBAA3D,EAAoF,MAApF,CAAV,CAAN;MACA;IACD;;IAEDiB,eAAA,CAAOqD,KAAP,CAAc,8DAA6DgI,UAAW,EAAtF;;IACA,MAAMxC,iBAAA,CAAEC,GAAF,CAAMuC,UAAU,CAAC9G,GAAX,CAAgBiH,KAAD,IAAW,CAAC,YAAY;MACjD,IAAI;QACF,MAAM9L,GAAG,CAAC2J,KAAJ,CAAU,CAAC,QAAD,EAAW,KAAX,EAAkBmC,KAAlB,EAAyB,uBAAzB,EAAkD,MAAlD,CAAV,CAAN;MACD,CAFD,CAEE,OAAO/D,GAAP,EAAY,CAAE;IACjB,CAJqC,GAA1B,CAAN,CAAN;EAKD,CA3BD,CA2BE,OAAOiC,GAAP,EAAY;IACZ1J,eAAA,CAAOC,IAAP,CAAa,kCAAiCyJ,GAAG,CAACpG,OAAQ,EAA1D;EACD;AACF,CA/BD;;AAiCAnC,OAAO,CAACsK,gBAAR,GAA2B,eAAeA,gBAAf,CAAiC/L,GAAjC,EAAsCgM,OAAtC,EAA+CC,SAA/C,EAA0D;EAGnF,MAAM,IAAAC,eAAA,EAAM,CAAN,EAAS,eAAeC,qBAAf,GAAwC;IACrD,MAAMnM,GAAG,CAAC6I,gBAAJ,CAAqBmD,OAArB,EAA8BC,SAA9B,EAAyC;MAAC1D,gBAAgB,EAAE;IAAnB,CAAzC,CAAN;EACD,CAFK,CAAN;AAGD,CAND;;AAiBA9G,OAAO,CAAC2K,eAAR,GAA0B,eAAeA,eAAf,CAAgCpM,GAAhC,EAAqCqM,UAAU,GAAG,KAAlD,EAAyD3L,IAAI,GAAG,EAAhE,EAAoE;EAC5FJ,eAAA,CAAOqD,KAAP,CAAa,mCAAb;;EAEA,IAAI;IACF,MAAMlC,OAAO,CAACsK,gBAAR,CAAyB/L,GAAzB,EAA8BsM,cAA9B,EAA+CjN,sBAA/C,EAAuEgN,UAAvE,CAAN;EACD,CAFD,CAEE,OAAOrC,GAAP,EAAY;IACZ,IAAIqC,UAAJ,EAAgB;MACd,MAAMrC,GAAN;IACD;;IAED1J,eAAA,CAAOC,IAAP,CAAa,mCAAkC+L,cAAgB,KAAnD,GACC,IAAGtC,GAAG,CAACpG,OAAQ,uCADhB,GAEA,2DAFA,GAGA,6CAHZ;EAID;;EAID,IAAI,MAAM5D,GAAG,CAACuM,aAAJ,CAAkBlN,sBAAlB,CAAV,EAAqD;IACnDiB,eAAA,CAAOqD,KAAP,CAAc,GAAEtE,sBAAuB,uBAA1B,GACV,4CADH;;IAEA;EACD;;EAED,MAAMmN,QAAQ,GAAG,MAAMxM,GAAG,CAACuK,WAAJ,EAAvB;;EACA,IAAIiC,QAAQ,IAAI,EAAhB,EAAoB;IAElB,IAAI;MACF,MAAMxM,GAAG,CAAC2J,KAAJ,CAAU,CAAC,QAAD,EAAW,KAAX,EAAkBtK,sBAAlB,EAA0C,eAA1C,EAA2D,OAA3D,CAAV,CAAN;IACD,CAFD,CAEE,OAAO2K,GAAP,EAAY;MACZ1J,eAAA,CAAOqD,KAAP,CAAaqG,GAAb;IACD;EACF;;EACD,IAAIwC,QAAQ,IAAI,EAAhB,EAAoB;IAElB,MAAMC,KAAK,GAAG,CAAC,qBAAD,EAAwB,sBAAxB,EAAgD,sBAAhD,CAAd;;IACAnM,eAAA,CAAOoE,IAAP,CAAa,wBAAuB+H,KAAM,QAAOpN,sBAAuB,GAAxE;;IACA,MAAMW,GAAG,CAACuI,gBAAJ,CAAqBlJ,sBAArB,EAA6CoN,KAAK,CAAC5H,GAAN,CAAW6H,CAAD,IAAQ,sBAAqBA,CAAE,EAAzC,CAA7C,CAAN;EACD;;EAKD,IAAI;IACF,MAAM1M,GAAG,CAAC2M,yBAAJ,CAA8B;MAClCnE,OAAO,EAAE/G,OAAO,CAACmL,UAAR,CAAmB5M,GAAnB,EAAwBU,IAAxB,IAAgC,KAAhC,GAAwC;IADf,CAA9B,CAAN;EAGD,CAJD,CAIE,OAAOsJ,GAAP,EAAY;IACZ1J,eAAA,CAAOqD,KAAP,CAAaqG,GAAb;;IACA,IAAIqC,UAAJ,EAAgB;MACd,MAAMrC,GAAN;IACD;EACF;AACF,CArDD;;AAqEAvI,OAAO,CAACoL,WAAR,GAAsB,eAAeA,WAAf,CAA4B9J,QAA5B,EAAsC/C,GAAtC,EAA2CU,IAA3C,EAAiD;EACrE,MAAMoM,SAAS,GAAG,iBAAlB;EACA,MAAMC,WAAW,GAAG,cAApB;;EACA,MAAMC,UAAU,GAAGhC,aAAA,CAAKC,KAAL,CAAWgC,OAAX,CAAmBH,SAAnB,EAA8BC,WAA9B,CAAnB;;EAGA,MAAM/M,GAAG,CAACuL,MAAJ,CAAWyB,UAAX,CAAN;EAEA,IAAIlG,GAAJ;;EACA,IAAI;IACFA,GAAG,GAAGpG,IAAI,CAACoG,GAAL,KAAY,MAAM9G,GAAG,CAACkN,OAAJ,CAAYxM,IAAI,CAACqG,UAAjB,EAA6BrG,IAAI,CAACyM,MAAlC,CAAlB,CAAN;EACD,CAFD,CAEE,OAAOnD,GAAP,EAAY;IACZ1J,eAAA,CAAOoE,IAAP,CAAa,+BAA8BhE,IAAI,CAACqG,UAAW,SAAQrG,IAAI,CAACyM,MAAO,sBAAqBnD,GAAG,CAACpG,OAAQ,EAAhH;EACD;;EAED,IAAI1D,eAAA,CAAEkN,OAAF,CAAU1M,IAAI,CAACqG,UAAf,KAA8B,EAAE,MAAMoE,WAAA,CAAGkC,MAAH,CAAUvG,GAAV,CAAR,CAAlC,EAA2D;IACzDxG,eAAA,CAAOqD,KAAP,CAAc,sDAAd;;IACA,OAAO,EAAP;EACD;;EAED,MAAM2J,aAAa,GAAGtC,aAAA,CAAKiC,OAAL,CAAavM,IAAI,CAACyM,MAAlB,EAA0BzM,IAAI,CAACqG,UAA/B,CAAtB;;EACA,IAAI;IACFzG,eAAA,CAAOqD,KAAP,CAAa,6BAAb,EAA4CmD,GAA5C,EAAiD/D,QAAjD,EAA2DuK,aAA3D;;IACA,MAAM;MAACC,UAAD;MAAaC;IAAb,IAA0B,MAAMxN,GAAG,CAACyN,qBAAJ,CAA0B3G,GAA1B,EAA+B/D,QAA/B,EAAyCuK,aAAzC,CAAtC;IACA,MAAMtN,GAAG,CAACe,IAAJ,CAASyM,SAAT,EAAoBV,SAApB,CAAN;IACA,OAAOS,UAAP;EACD,CALD,CAKE,OAAOvD,GAAP,EAAY;IACZ1J,eAAA,CAAOC,IAAP,CAAa,6DAA4DyJ,GAAG,CAACpG,OAAQ,EAArF;;IACA,MAAM5D,GAAG,CAAC2J,KAAJ,CAAU,MAAV,EAAkB,CAAE,UAASqD,UAAW,EAAtB,CAAlB,CAAN;EACD,CARD,SAQU;IACR,MAAM7B,WAAA,CAAGI,MAAH,CAAU+B,aAAV,CAAN;EACD;;EACD,OAAO,EAAP;AACD,CAjCD;;AAmCA7L,OAAO,CAACiM,mBAAR,GAA8B,eAAeA,mBAAf,CAAoC1N,GAApC,EAAyC;EACrEM,eAAA,CAAOoE,IAAP,CAAY,kBAAZ;;EAGA,IAAIiJ,QAAQ,GAAG,IAAf;EACA,MAAM,IAAAzB,eAAA,EAAM,CAAN,EAAS,eAAe0B,YAAf,GAA+B;IAE5C,IAAID,QAAJ,EAAc;MACZA,QAAQ,GAAG,KAAX;IACD,CAFD,MAEO;MACL,IAAI;QACF,IAAI,EAAE,MAAM3N,GAAG,CAAC6N,cAAJ,EAAR,CAAJ,EAAmC;UACjC;QACD;MACF,CAJD,CAIE,OAAOnK,CAAP,EAAU;QACVpD,eAAA,CAAOC,IAAP,CAAa,4BAA2BmD,CAAC,CAACE,OAAQ,EAAlD;;QACAtD,eAAA,CAAOC,IAAP,CAAY,mDAAZ;;QACAD,eAAA,CAAOC,IAAP,CAAY,8FAAZ;MACD;IACF;;IAEDD,eAAA,CAAOoE,IAAP,CAAa,aAAYpF,+BAAgC,EAAzD;;IACA,MAAMU,GAAG,CAAC2J,KAAJ,CAAU,CACd,IADc,EACR,OADQ,EAEd,IAFc,EAEP,GAAEtK,sBAAuB,IAAGC,+BAAgC,EAFrD,EAGd,IAHc,EAGR,kCAHQ,EAId,IAJc,EAIR,4BAJQ,EAKd,IALc,EAKR,YALQ,CAAV,CAAN;IAOA,MAAM6J,iBAAA,CAAE2E,KAAF,CAAQ,IAAR,CAAN;EACD,CAzBK,CAAN;AA0BD,CA/BD;;AAiCArM,OAAO,CAACsM,MAAR,GAAiB,eAAeA,MAAf,CAAuBC,MAAvB,EAA+BhO,GAA/B,EAAoCiO,YAApC,EAAkD;EACjE,IAAI,EAAE,MAAMjO,GAAG,CAAC6N,cAAJ,EAAR,CAAJ,EAAmC;IACjCvN,eAAA,CAAOoE,IAAP,CAAY,wCAAZ;;IACA;EACD;;EACDpE,eAAA,CAAOqD,KAAP,CAAa,oCAAb;;EAEA,IAAI,CAACsK,YAAY,CAAC9M,UAAd,IAA4B,CAAC8M,YAAY,CAACC,SAA9C,EAAyD;IACvD5N,eAAA,CAAOC,IAAP,CAAY,mDAAZ;;IACA,MAAMkB,OAAO,CAACiM,mBAAR,CAA4B1N,GAA5B,CAAN;IACA;EACD;;EAED,MAAM;IACJmB,UADI;IAEJ+M,SAFI;IAGJC,cAHI;IAIJC;EAJI,IAKFC,sBAAA,CAASC,0BAAT,CAAoCL,YAApC,CALJ;;EAMA,IAAIC,SAAS,IAAI/M,UAAU,KAAKoN,iCAA5B,KACIrO,eAAA,CAAEsO,KAAF,CAAQL,cAAR,KAA2BjO,eAAA,CAAE6F,OAAF,CAAUoI,cAAV,MAA8B,cAD7D,MAEG,MAAMnO,GAAG,CAACyO,yBAAJ,EAFT,CAAJ,EAE8C;IAC5C,MAAMJ,sBAAA,CAASK,UAAT,CAAoB1O,GAApB,EAAyB;MAC7B2O,UAAU,EAAET,SADiB;MAE7BU,cAAc,EAAE1N,gBAAgB,CAACC,UAAD;IAFH,CAAzB,CAAN;EAID,CAPD,MAOO;IACL,MAAM0N,YAAY,GAAG;MACnB,CAACzN,yBAAD,GAAciN,sBAAA,CAASS,SADJ;MAEnB,CAACzN,mCAAD,GAAwBgN,sBAAA,CAASU,qBAFd;MAGnB,CAACzN,8BAAD,GAAmB+M,sBAAA,CAASW,cAHT;MAInB,CAACzN,6BAAD,GAAkB8M,sBAAA,CAASY,aAJR;MAKnB,CAACV,iCAAD,GAAsBF,sBAAA,CAASa;IALZ,EAMnB/N,UANmB,CAArB;IAOA,MAAM0N,YAAY,CAAC7O,GAAD,EAAMgO,MAAN,EAAcC,YAAd,CAAlB;EACD;;EACD,MAAMxM,OAAO,CAAC0N,YAAR,CAAqBnP,GAArB,EAA0BoO,oBAA1B,CAAN;AACD,CArCD;;AAuCA3M,OAAO,CAAC0N,YAAR,GAAuB,eAAeA,YAAf,CAA6BnP,GAA7B,EAAkCoP,SAAS,GAAG,IAA9C,EAAoD;EACzE,IAAI;IACF,MAAM,IAAAC,0BAAA,EAAiB,YAAY,EAAE,MAAMrP,GAAG,CAAC6N,cAAJ,EAAR,CAA7B,EAA4D;MAChEyB,MAAM,EAAEF,SAAS,IAAI,IAD2C;MAEhEG,UAAU,EAAE;IAFoD,CAA5D,CAAN;EAID,CALD,CAKE,OAAOxH,GAAP,EAAY;IACZ,MAAM,IAAIvG,KAAJ,CAAU,sCAAV,CAAN;EACD;;EACDlB,eAAA,CAAOoE,IAAP,CAAY,2CAAZ;AACD,CAVD;;AAYAjD,OAAO,CAAC+N,UAAR,GAAqB,eAAeA,UAAf,CAA2BxP,GAA3B,EAAgCU,IAAhC,EAAsC;EACzD,MAAM;IACJ+O,wBADI;IAEJzM,MAFI;IAGJD,QAHI;IAIJ2M,YAJI;IAKJC,eALI;IAMJC,sBANI;IAOJC,UAPI;IAQJC,eARI;IASJC,iBATI;IAUJC,YAVI;IAWJC;EAXI,IAYFvP,IAZJ;;EAcA,IAAI+O,wBAAJ,EAA8B;IAC5BnP,eAAA,CAAOoE,IAAP,CAAa,oEAAb;EACD,CAFD,MAEO;IACL,MAAM1E,GAAG,CAACkQ,aAAJ,EAAN;IAMA,MAAMC,gBAAgB,GAAGpN,QAAQ,IAC5BC,MADoB,IAEpB0M,YAFoB,IAGpBC,eAHoB,IAIpBC,sBAJoB,IAKpB,CAACC,UALN;IAMA,MAAMpO,OAAO,CAAC2K,eAAR,CAAwBpM,GAAxB,EAA6BmQ,gBAA7B,EAA+CzP,IAA/C,CAAN;EACD;;EAED,IAAI,CAACe,OAAO,CAACmL,UAAR,CAAmB5M,GAAnB,EAAwBU,IAAxB,CAAL,EAAoC;IAClC,IAAIoP,eAAe,IAAI5P,eAAA,CAAEkQ,WAAF,CAAcN,eAAd,CAAvB,EAAuD;MACrD,MAAMrO,OAAO,CAAC6I,kBAAR,CAA2BtK,GAA3B,EAAgC8P,eAAe,IAAIzQ,sBAAnD,CAAN;IACD,CAFD,MAEO;MACL,MAAMoC,OAAO,CAAC+J,iBAAR,CAA0BxL,GAA1B,CAAN;IACD;EACF;;EAED,IAAI+C,QAAQ,IAAIC,MAAhB,EAAwB;IACtB,MAAMvB,OAAO,CAACuC,kBAAR,CAA2BhE,GAA3B,EAAgC+C,QAAhC,EAA0CC,MAA1C,EAAkD0M,YAAlD,CAAN;EACD;;EAED,IAAIK,iBAAJ,EAAuB;IACrBzP,eAAA,CAAOoE,IAAP,CAAa,+DAAb;EACD,CAFD,MAEO;IACL,MAAM1E,GAAG,CAACqQ,WAAJ,CAAgB;MACpBC,MAAM,EAAEN,YADY;MAEpBO,WAAW,EAAEN;IAFO,CAAhB,CAAN;EAID;;EAED,IAAIN,eAAJ,EAAqB;IACnB,OAAO,MAAMlO,OAAO,CAACwI,mBAAR,CAA4BjK,GAA5B,CAAb;EACD;AACF,CAzDD;;AA2DAyB,OAAO,CAAC+O,oBAAR,GAA+B,SAASA,oBAAT,CAA+BC,GAA/B,EAAoC;EACjE,KAAK,IAAIlK,GAAT,IAAgBrG,eAAA,CAAEiG,IAAF,CAAOsK,GAAP,CAAhB,EAA6B;IAC3B,IAAIvQ,eAAA,CAAEwQ,MAAF,CAASD,GAAG,CAAClK,GAAD,CAAZ,KAAsBrG,eAAA,CAAEkQ,WAAF,CAAcK,GAAG,CAAClK,GAAD,CAAjB,CAA1B,EAAmD;MACjD,OAAOkK,GAAG,CAAClK,GAAD,CAAV;IACD;EACF;AACF,CAND;;AAQA9E,OAAO,CAACkP,gBAAR,GAA2B,SAASA,gBAAT,CAA2BC,MAA3B,EAAmCC,MAAnC,EAA2C;EACpE,IAAIC,UAAU,GAAGC,IAAI,CAACC,GAAL,CAAS,EAAT,EAAaH,MAAb,CAAjB;EAAA,IACII,WAAW,GAAGL,MAAM,GAAGE,UAD3B;EAAA,IAEII,YAAY,GAAGH,IAAI,CAACE,WAAW,GAAG,CAAd,GAAkB,MAAlB,GAA2B,OAA5B,CAAJ,CAAyCA,WAAzC,CAFnB;EAIA,OAAOC,YAAY,GAAGJ,UAAtB;AACD,CAND;;AAQArP,OAAO,CAAC0P,eAAR,GAA0B,SAASA,eAAT,CAA0BhS,OAA1B,EAAmC;EAC3D,OAAOe,eAAA,CAAEG,QAAF,CAAWZ,MAAM,CAAC0G,IAAP,CAAYtH,+BAAZ,CAAX,EAAyD,CAACM,OAAO,IAAI,EAAZ,EAAgB+I,WAAhB,EAAzD,CAAP;AACD,CAFD;;AAIAzG,OAAO,CAAC2P,YAAR,GAAuB,SAASA,YAAT,CAAuBjS,OAAvB,EAAgC;EACrD,OAAON,+BAA+B,CAACM,OAAO,CAAC+I,WAAR,EAAD,CAA/B,IAA0DrJ,+BAA+B,CAACO,OAAjG;AACD,CAFD;;AAIAqC,OAAO,CAAC4P,iCAAR,GAA4C,eAAeA,iCAAf,CAAkDC,MAAlD,EAA0DC,SAA1D,EAAqE;EAC/G,IAAI,CAACD,MAAD,IAAW,CAACpR,eAAA,CAAEsR,UAAF,CAAaF,MAAM,CAACG,oBAApB,CAAhB,EAA2D;IACzD;EACD;;EAED,MAAMC,cAAc,GAAG,MAAMJ,MAAM,CAACG,oBAAP,CAA4BF,SAA5B,CAA7B;;EACA,KAAK,MAAMI,QAAX,IAAuBzR,eAAA,CAAEiG,IAAF,CAAOuL,cAAP,CAAvB,EAA+C;IAC7C,MAAMJ,MAAM,CAACM,sBAAP,CAA8BD,QAA9B,CAAN;EACD;AACF,CATD;;AAiBAlQ,OAAO,CAACoQ,UAAR,GAAqB,SAASA,UAAT,CAAqBC,GAArB,EAA0B;EAC7C,IAAIC,UAAJ;;EACA,IAAI;IACFA,UAAU,GAAGrH,IAAI,CAACC,KAAL,CAAWmH,GAAX,CAAb;EACD,CAFD,CAEE,OAAO/J,GAAP,EAAY,CAAG;;EAEjB,IAAI7H,eAAA,CAAEY,OAAF,CAAUiR,UAAV,CAAJ,EAA2B;IACzB,OAAOA,UAAP;EACD,CAFD,MAEO,IAAI7R,eAAA,CAAEgE,QAAF,CAAW4N,GAAX,CAAJ,EAAqB;IAC1B,OAAO,CAACA,GAAD,CAAP;EACD;;EAED,MAAM,IAAItQ,KAAJ,CAAW,iDAAgDsQ,GAAI,EAA/D,CAAN;AACD,CAbD;;AAsBArQ,OAAO,CAACuQ,mBAAR,GAA8B,SAASA,mBAAT,CAA8BC,IAA9B,EAAoC;EAChE,IAAIA,IAAI,CAACC,WAAT,EAAsB;IACpB,IAAID,IAAI,CAACnL,GAAT,EAAc;MAEZxG,eAAA,CAAOC,IAAP,CAAa,yFAAb;IACD;;IACD,IAAI0R,IAAI,CAAClL,UAAT,EAAqB;MACnBzG,eAAA,CAAOwE,aAAP,CAAsB,4EAAtB;IACD;EACF;;EAED,IAAImN,IAAI,CAAC3I,sBAAT,EAAiC;IAC/B,IAAI;MACF,KAAKuI,UAAL,CAAgBI,IAAI,CAAC3I,sBAArB;IACD,CAFD,CAEE,OAAO5F,CAAP,EAAU;MACVpD,eAAA,CAAOwE,aAAP,CAAsB,wDAAuDpB,CAAC,CAACE,OAAQ,EAAvF;IACD;EACF;;EAED,OAAO,IAAP;AACD,CApBD;;AA+BAnC,OAAO,CAAC0Q,wBAAR,GAAmC,SAASA,wBAAT,CAAmCF,IAAI,GAAG,EAA1C,EAA8C;EAC/E,MAAM;IAAEC;EAAF,IAAkBD,IAAxB;;EACA3R,eAAA,CAAOoE,IAAP,CAAa,iDAAb;;EACApE,eAAA,CAAOoE,IAAP,CAAa,4BAA2BgG,IAAI,CAACW,SAAL,CAAenL,eAAA,CAAEiG,IAAF,CAAOtH,+BAAP,CAAf,CAAwD,EAAhG;;EACA,IAAIoT,IAAI,CAAClL,UAAL,IAAmBkL,IAAI,CAACjL,WAA5B,EAAyC;IACvC1G,eAAA,CAAOoE,IAAP,CAAa,gEAA+DwN,WAAY,IAA5E,GACV,iDADF;;IAEA,OAAOD,IAAP;EACD;;EAED,MAAM;IAAClT,GAAD;IAAMC;EAAN,IAAkB,KAAKoS,YAAL,CAAkBc,WAAlB,CAAxB;EACAD,IAAI,CAAClL,UAAL,GAAkBhI,GAAlB;EACAkT,IAAI,CAACjL,WAAL,GAAmBhI,QAAnB;;EACAsB,eAAA,CAAOoE,IAAP,CAAa,sEAAqE3F,GAAI,IAAGC,QAAS,GAAtF,GACT,QAAOkT,WAAY,GADtB;;EAEA5R,eAAA,CAAOoE,IAAP,CAAa,wFAAD,GACT,mGADS,GAET,gBAFH;;EAGA,OAAOuN,IAAP;AACD,CAnBD;;AA4BAxQ,OAAO,CAACmL,UAAR,GAAqB,SAASA,UAAT,CAAqB5M,GAArB,EAA0BU,IAA1B,EAAgC;EACnD,MAAM0R,aAAa,GAAG,CAAC1R,IAAI,CAAC4D,IAAN,EAAYtE,GAAZ,aAAYA,GAAZ,uBAAYA,GAAG,CAAEwE,WAAjB,CAAtB;EACA,OAAO,CAAC,CAAC9D,IAAI,CAACkC,GAAP,IAAcwP,aAAa,CAACC,IAAd,CAAoB3F,CAAD,IAAOnN,gBAAgB,CAAC+S,IAAjB,CAAsB5F,CAAtB,CAA1B,CAArB;AACD,CAHD;;AAKAjL,OAAO,CAAC8Q,SAAR,GAAoBC,kBAApB;AACA/Q,OAAO,CAAC4M,QAAR,GAAmBA,sBAAnB;eAGe5M,O"}
|