appium-adb 9.8.0 → 9.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -162,8 +162,12 @@ methods.isValidClass = function isValidClass(classString) {
|
|
|
162
162
|
return (0, _helpers.matchComponentName)(classString);
|
|
163
163
|
};
|
|
164
164
|
|
|
165
|
-
methods.resolveLaunchableActivity = async function resolveLaunchableActivity(pkg) {
|
|
166
|
-
|
|
165
|
+
methods.resolveLaunchableActivity = async function resolveLaunchableActivity(pkg, opts = {}) {
|
|
166
|
+
const {
|
|
167
|
+
preferCmd = true
|
|
168
|
+
} = opts;
|
|
169
|
+
|
|
170
|
+
if (!preferCmd || (await this.getApiLevel()) < 24) {
|
|
167
171
|
const stdout = await this.shell(['dumpsys', 'package', pkg]);
|
|
168
172
|
const names = (0, _helpers.parseLaunchableActivityNames)(stdout);
|
|
169
173
|
|
|
@@ -1143,4 +1147,4 @@ var _default = methods;
|
|
|
1143
1147
|
exports.default = _default;require('source-map-support').install();
|
|
1144
1148
|
|
|
1145
1149
|
|
|
1146
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliL3Rvb2xzL2FkYi1jb21tYW5kcy5qcyIsIm5hbWVzIjpbIk1BWF9TSEVMTF9CVUZGRVJfTEVOR1RIIiwiTk9UX0NIQU5HRUFCTEVfUEVSTV9FUlJPUiIsIklHTk9SRURfUEVSTV9FUlJPUlMiLCJNQVhfUEdSRVBfUEFUVEVSTl9MRU4iLCJISURERU5fQVBJX1BPTElDWV9LRVlTIiwiUElEX0NPTFVNTl9USVRMRSIsIlBST0NFU1NfTkFNRV9DT0xVTU5fVElUTEUiLCJQU19USVRMRV9QQVRURVJOIiwiUmVnRXhwIiwiQURCX0lOUFVUX0VTQ0FQRV9QQVRURVJOIiwibWV0aG9kcyIsInNoZWxsQ2h1bmtzIiwiYXJnVHJhbnNmb3JtZXIiLCJhcmdzIiwiY29tbWFuZHMiLCJjbWRDaHVuayIsImFyZyIsIm5leHRDbWQiLCJfIiwiaXNBcnJheSIsIkVycm9yIiwibGFzdCIsInB1c2giLCJqb2luIiwibGVuZ3RoIiwiaXNFbXB0eSIsImxvZyIsImRlYnVnIiwiSlNPTiIsInN0cmluZ2lmeSIsImxhc3RFcnJvciIsImNtZCIsInNoZWxsIiwiZSIsImdldEFkYldpdGhDb3JyZWN0QWRiUGF0aCIsImV4ZWN1dGFibGUiLCJwYXRoIiwiZ2V0U2RrQmluYXJ5UGF0aCIsImFkYiIsImluaXRBYXB0IiwiaW5pdEFhcHQyIiwiaW5pdFppcEFsaWduIiwiaW5pdEJ1bmRsZXRvb2wiLCJiaW5hcmllcyIsImJ1bmRsZXRvb2wiLCJmcyIsIndoaWNoIiwiZXJyIiwiZ2V0QXBpTGV2ZWwiLCJpc0ludGVnZXIiLCJfYXBpTGV2ZWwiLCJzdHJPdXRwdXQiLCJnZXREZXZpY2VQcm9wZXJ0eSIsImFwaUxldmVsIiwicGFyc2VJbnQiLCJ0cmltIiwiY2hhckNvZGVRIiwiY2hhckNvZGVBdCIsImFwaUxldmVsRGlmZiIsImNvZGVuYW1lIiwiU3RyaW5nIiwiZnJvbUNoYXJDb2RlIiwiZ2V0UGxhdGZvcm1WZXJzaW9uIiwidG9Mb3dlckNhc2UiLCJ0b1VwcGVyQ2FzZSIsImlzTmFOIiwibWVzc2FnZSIsImluZm8iLCJpc0RldmljZUNvbm5lY3RlZCIsImRldmljZXMiLCJnZXRDb25uZWN0ZWREZXZpY2VzIiwibWtkaXIiLCJyZW1vdGVQYXRoIiwiaXNWYWxpZENsYXNzIiwiY2xhc3NTdHJpbmciLCJtYXRjaENvbXBvbmVudE5hbWUiLCJyZXNvbHZlTGF1bmNoYWJsZUFjdGl2aXR5IiwicGtnIiwic3Rkb3V0IiwibmFtZXMiLCJwYXJzZUxhdW5jaGFibGVBY3Rpdml0eU5hbWVzIiwidG1wUm9vdCIsInRlbXBEaXIiLCJvcGVuRGlyIiwidG1wQXBwIiwicHVsbEFwayIsImFwa0FjdGl2aXR5IiwicGFja2FnZUFuZExhdW5jaEFjdGl2aXR5RnJvbU1hbmlmZXN0Iiwic3RhY2siLCJ3YXJuIiwicmltcmFmIiwic3RkZXJyIiwib3V0cHV0Rm9ybWF0IiwiRVhFQ19PVVRQVVRfRk9STUFUIiwiRlVMTCIsImxpbmUiLCJzcGxpdCIsIm1hcCIsImZvcmNlU3RvcCIsImtpbGxQYWNrYWdlIiwiY2xlYXIiLCJncmFudEFsbFBlcm1pc3Npb25zIiwiYXBrIiwidGFyZ2V0U2RrIiwiZHVtcHN5c091dHB1dCIsInRhcmdldFNka1ZlcnNpb25Vc2luZ1BLRyIsInRhcmdldFNka1ZlcnNpb25Gcm9tTWFuaWZlc3QiLCJyZXF1ZXN0ZWRQZXJtaXNzaW9ucyIsImdldFJlcVBlcm1pc3Npb25zIiwiZ3JhbnRlZFBlcm1pc3Npb25zIiwiZ2V0R3JhbnRlZFBlcm1pc3Npb25zIiwicGVybWlzc2lvbnNUb0dyYW50IiwiZGlmZmVyZW5jZSIsImdyYW50UGVybWlzc2lvbnMiLCJwZXJtaXNzaW9ucyIsInBlcm0iLCJzb21lIiwicGF0dGVybiIsInRlc3QiLCJncmFudFBlcm1pc3Npb24iLCJwZXJtaXNzaW9uIiwicmV2b2tlUGVybWlzc2lvbiIsImNtZE91dHB1dCIsImV4dHJhY3RNYXRjaGluZ1Blcm1pc3Npb25zIiwiZ2V0RGVuaWVkUGVybWlzc2lvbnMiLCJnZXRMb2NhdGlvblByb3ZpZGVycyIsImdldFNldHRpbmciLCJwIiwiZmlsdGVyIiwiQm9vbGVhbiIsInRvZ2dsZUdQU0xvY2F0aW9uUHJvdmlkZXIiLCJlbmFibGVkIiwic2V0U2V0dGluZyIsInNldEhpZGRlbkFwaVBvbGljeSIsInZhbHVlIiwiaWdub3JlRXJyb3IiLCJrIiwic2V0RGVmYXVsdEhpZGRlbkFwaVBvbGljeSIsInN0b3BBbmRDbGVhciIsImF2YWlsYWJsZUlNRXMiLCJnZXRJTUVMaXN0RnJvbU91dHB1dCIsImVuYWJsZWRJTUVzIiwiZW5hYmxlSU1FIiwiaW1lSWQiLCJkaXNhYmxlSU1FIiwic2V0SU1FIiwiZGVmYXVsdElNRSIsImVuZ2luZSIsImtleWV2ZW50Iiwia2V5Y29kZSIsImNvZGUiLCJpbnB1dFRleHQiLCJ0ZXh0Iiwib3JpZ2luYWxTdHIiLCJlc2NhcGVkVGV4dCIsInJlcGxhY2UiLCJldmVyeSIsImMiLCJpbmNsdWRlcyIsInEiLCJjbGVhclRleHRGaWVsZCIsImkiLCJsb2NrIiwiaXNTY3JlZW5Mb2NrZWQiLCJ0aW1lb3V0TXMiLCJ3YWl0Rm9yQ29uZGl0aW9uIiwid2FpdE1zIiwiaW50ZXJ2YWxNcyIsImJhY2siLCJnb1RvSG9tZSIsImdldEFkYlBhdGgiLCJnZXRTY3JlZW5PcmllbnRhdGlvbiIsImdldFN1cmZhY2VPcmllbnRhdGlvbiIsInNlbmRUZWxuZXRDb21tYW5kIiwiY29tbWFuZCIsImV4ZWNFbXVDb25zb2xlQ29tbWFuZCIsInBvcnQiLCJnZXRFbXVsYXRvclBvcnQiLCJpc0FpcnBsYW5lTW9kZU9uIiwic2V0QWlycGxhbmVNb2RlIiwib24iLCJicm9hZGNhc3RBaXJwbGFuZU1vZGUiLCJpc1dpZmlPbiIsImlzRGF0YU9uIiwic2V0V2lmaUFuZERhdGEiLCJ3aWZpIiwiZGF0YSIsImlzRW11bGF0b3IiLCJ1dGlsIiwiaGFzVmFsdWUiLCJzZXRXaWZpU3RhdGUiLCJzZXREYXRhU3RhdGUiLCJpc0FuaW1hdGlvbk9uIiwiYW5pbWF0b3JfZHVyYXRpb25fc2NhbGUiLCJ0cmFuc2l0aW9uX2FuaW1hdGlvbl9zY2FsZSIsIndpbmRvd19hbmltYXRpb25fc2NhbGUiLCJzZXR0aW5nIiwibG9jYWxQYXRoIiwib3B0cyIsInBvc2l4IiwiZGlybmFtZSIsImFkYkV4ZWMiLCJwdWxsIiwidGltZW91dCIsInByb2Nlc3NFeGlzdHMiLCJwcm9jZXNzTmFtZSIsImdldFBJRHNCeU5hbWUiLCJnZXRGb3J3YXJkTGlzdCIsImNvbm5lY3Rpb25zIiwiRU9MIiwiZm9yd2FyZFBvcnQiLCJzeXN0ZW1Qb3J0IiwiZGV2aWNlUG9ydCIsInJlbW92ZVBvcnRGb3J3YXJkIiwiZ2V0UmV2ZXJzZUxpc3QiLCJyZXZlcnNlUG9ydCIsInJlbW92ZVBvcnRSZXZlcnNlIiwiZm9yd2FyZEFic3RyYWN0UG9ydCIsInBpbmciLCJpbmRleE9mIiwicmVzdGFydCIsInN0b3BMb2djYXQiLCJyZXN0YXJ0QWRiIiwid2FpdEZvckRldmljZSIsInN0YXJ0TG9nY2F0IiwiX2xvZ2NhdFN0YXJ0dXBQYXJhbXMiLCJsb2djYXQiLCJMb2djYXQiLCJkZWJ1Z1RyYWNlIiwiY2xlYXJEZXZpY2VMb2dzT25TdGFydCIsInN0YXJ0Q2FwdHVyZSIsInN0b3BDYXB0dXJlIiwiZ2V0TG9nY2F0TG9ncyIsImdldExvZ3MiLCJzZXRMb2djYXRMaXN0ZW5lciIsImxpc3RlbmVyIiwicmVtb3ZlTG9nY2F0TGlzdGVuZXIiLCJyZW1vdmVMaXN0ZW5lciIsImxpc3RQcm9jZXNzU3RhdHVzIiwiaXNCb29sZWFuIiwiX2RvZXNQc1N1cHBvcnRBT3B0aW9uIiwiZ2V0TmFtZUJ5UGlkIiwicGlkIiwidGl0bGVNYXRjaCIsImV4ZWMiLCJhbGxUaXRsZXMiLCJwaWRJbmRleCIsIm5hbWVPZmZzZXQiLCJwaWRSZWdleCIsIm1hdGNoZWRMaW5lIiwiaXRlbXMiLCJuYW1lIiwiX2lzUGdyZXBBdmFpbGFibGUiLCJwZ3JlcE91dHB1dCIsIl9jYW5QZ3JlcFVzZUZ1bGxDbWRMaW5lU2VhcmNoIiwiX2lzUGlkb2ZBdmFpbGFibGUiLCJzaGVsbENvbW1hbmQiLCJlc2NhcGVSZWdFeHAiLCJzbGljZSIsIngiLCJwaWRzIiwicHJvY2Vzc05hbWVSZWdleCIsImtpbGxQcm9jZXNzZXNCeU5hbWUiLCJCIiwiYWxsIiwia2lsbFByb2Nlc3NCeVBJRCIsIm5vUHJvY2Vzc0ZsYWciLCJwcml2aWxlZ2VkIiwiZTEiLCJicm9hZGNhc3RQcm9jZXNzRW5kIiwiaW50ZW50IiwiYnJvYWRjYXN0Iiwic3RhcnQiLCJEYXRlIiwibm93Iiwic2xlZXAiLCJlbmRBbmRyb2lkQ292ZXJhZ2UiLCJpbnN0cnVtZW50UHJvYyIsImlzUnVubmluZyIsInN0b3AiLCJpbnN0cnVtZW50IiwiYWN0aXZpdHkiLCJpbnN0cnVtZW50V2l0aCIsInBrZ0FjdGl2aXR5IiwiYW5kcm9pZENvdmVyYWdlIiwiaW5zdHJ1bWVudENsYXNzIiwid2FpdFBrZyIsIndhaXRBY3Rpdml0eSIsInJlc29sdmUiLCJyZWplY3QiLCJkZWZhdWx0QXJncyIsImNvbmNhdCIsIlN1YlByb2Nlc3MiLCJ3YWl0Rm9yQWN0aXZpdHkiLCJwcm9wZXJ0eSIsInZhbCIsInNldERldmljZVByb3BlcnR5IiwicHJvcCIsImdldERldmljZVN5c0xhbmd1YWdlIiwiZ2V0RGV2aWNlU3lzQ291bnRyeSIsImdldERldmljZVN5c0xvY2FsZSIsImdldERldmljZVByb2R1Y3RMYW5ndWFnZSIsImdldERldmljZVByb2R1Y3RDb3VudHJ5IiwiZ2V0RGV2aWNlUHJvZHVjdExvY2FsZSIsImdldE1vZGVsIiwiZ2V0TWFudWZhY3R1cmVyIiwiZ2V0U2NyZWVuU2l6ZSIsInNpemUiLCJnZXRTY3JlZW5EZW5zaXR5IiwiZGVuc2l0eSIsImRlbnNpdHlOdW1iZXIiLCJzZXRIdHRwUHJveHkiLCJwcm94eUhvc3QiLCJwcm94eVBvcnQiLCJwcm94eSIsImlzVW5kZWZpbmVkIiwiaHR0cFByb3h5U2V0dGlucyIsInNldHRpbmdLZXkiLCJzZXR0aW5nVmFsdWUiLCJkZWxldGVIdHRwUHJveHkiLCJuYW1lc3BhY2UiLCJidWdyZXBvcnQiLCJzY3JlZW5yZWNvcmQiLCJkZXN0aW5hdGlvbiIsIm9wdGlvbnMiLCJ2aWRlb1NpemUiLCJiaXRSYXRlIiwidGltZUxpbWl0IiwiYnVnUmVwb3J0IiwiZnVsbENtZCIsInF1b3RlIiwicnVuSW5JbWVDb250ZXh0IiwiaW1lIiwiZm4iLCJvcmlnaW5hbEltZSIsImRlbGF5IiwiZ2V0VGltZVpvbmUiLCJsaXN0RmVhdHVyZXMiLCJfbWVtb2l6ZWRGZWF0dXJlcyIsIm1lbW9pemUiLCJjdXJEZXZpY2VJZCIsImlzU3RyZWFtZWRJbnN0YWxsU3VwcG9ydGVkIiwicHJvdG8iLCJPYmplY3QiLCJnZXRQcm90b3R5cGVPZiIsIl9oZWxwT3V0cHV0IiwiaXNJbmNyZW1lbnRhbEluc3RhbGxTdXBwb3J0ZWQiLCJiaW5hcnkiLCJnZXRWZXJzaW9uIiwiY29tcGFyZVZlcnNpb25zIiwidmVyc2lvbiIsImdldERldmljZUlkbGVXaGl0ZWxpc3QiLCJvdXRwdXQiLCJhZGRUb0RldmljZUlkbGVXaGl0ZWxpc3QiLCJwYWNrYWdlcyIsInBsdXJhbGl6ZSJdLCJzb3VyY2VSb290IjoiLi4vLi4vLi4iLCJzb3VyY2VzIjpbImxpYi90b29scy9hZGItY29tbWFuZHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHtcbiAgZ2V0SU1FTGlzdEZyb21PdXRwdXQsIGdldFN1cmZhY2VPcmllbnRhdGlvbiwgZXh0cmFjdE1hdGNoaW5nUGVybWlzc2lvbnMsXG4gIHBhcnNlTGF1bmNoYWJsZUFjdGl2aXR5TmFtZXMsIG1hdGNoQ29tcG9uZW50TmFtZSxcbn0gZnJvbSAnLi4vaGVscGVycy5qcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBmcywgdXRpbCwgdGVtcERpciB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyBFT0wgfSBmcm9tICdvcyc7XG5pbXBvcnQgTG9nY2F0IGZyb20gJy4uL2xvZ2NhdCc7XG5pbXBvcnQgeyBzbGVlcCwgd2FpdEZvckNvbmRpdGlvbiB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IFN1YlByb2Nlc3MgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuXG5jb25zdCBNQVhfU0hFTExfQlVGRkVSX0xFTkdUSCA9IDEwMDA7XG5jb25zdCBOT1RfQ0hBTkdFQUJMRV9QRVJNX0VSUk9SID0gL25vdCBhIGNoYW5nZWFibGUgcGVybWlzc2lvbiB0eXBlL2k7XG5jb25zdCBJR05PUkVEX1BFUk1fRVJST1JTID0gW1xuICBOT1RfQ0hBTkdFQUJMRV9QRVJNX0VSUk9SLFxuICAvVW5rbm93biBwZXJtaXNzaW9uL2ksXG5dO1xuY29uc3QgTUFYX1BHUkVQX1BBVFRFUk5fTEVOID0gMTU7XG5jb25zdCBISURERU5fQVBJX1BPTElDWV9LRVlTID0gW1xuICAnaGlkZGVuX2FwaV9wb2xpY3lfcHJlX3BfYXBwcycsXG4gICdoaWRkZW5fYXBpX3BvbGljeV9wX2FwcHMnLFxuICAnaGlkZGVuX2FwaV9wb2xpY3knXG5dO1xuY29uc3QgUElEX0NPTFVNTl9USVRMRSA9ICdQSUQnO1xuY29uc3QgUFJPQ0VTU19OQU1FX0NPTFVNTl9USVRMRSA9ICdOQU1FJztcbmNvbnN0IFBTX1RJVExFX1BBVFRFUk4gPSBuZXcgUmVnRXhwKGBeKC4qXFxcXGIke1BJRF9DT0xVTU5fVElUTEV9XFxcXGIuKlxcXFxiJHtQUk9DRVNTX05BTUVfQ09MVU1OX1RJVExFfVxcXFxiLiopJGAsICdtJyk7XG4vLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yNTc5MTQyMy9hZGItc2hlbGwtaW5wdXQtdGV4dC1kb2VzLW5vdC10YWtlLWFtcGVyc2FuZC1jaGFyYWN0ZXIvMjU3OTE0OThcbmNvbnN0IEFEQl9JTlBVVF9FU0NBUEVfUEFUVEVSTiA9IC9bKCk8Pnw7JipcXFxcfl5cIiddL2c7XG5cbmNvbnN0IG1ldGhvZHMgPSB7fTtcblxuLyoqXG4gKiBDcmVhdGVzIGNodW5rcyBmb3IgdGhlIGdpdmVuIGFyZ3VtZW50cyBhbmQgZXhlY3V0ZXMgdGhlbSBpbiBgYWRiIHNoZWxsYC5cbiAqIFRoaXMgaXMgZmFzdGVyIHRoYW4gY2FsbGluZyBgYWRiIHNoZWxsYCBzZXBhcmF0ZWx5IGZvciBlYWNoIGFyZywgaG93ZXZlclxuICogdGhlcmUgaXMgYSBsaW1pdCBmb3IgYSBtYXhpbXVtIGxlbmd0aCBvZiBhIHNpbmdsZSBhZGIgY29tbWFuZC4gdGhhdCBpcyB3aHlcbiAqIHdlIG5lZWQgYWxsIHRoaXMgY29tcGxpY2F0ZWQgbG9naWMuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gYXJnVHJhbnNmb3JtZXIgQSBmdW5jdGlvbiwgdGhhdCByZWNlaXZlcyBzaW5nbGUgYXJndW1lbnRcbiAqIGZyb20gdGhlIGBhcmdzYCBhcnJheSBhbmQgdHJhbnNmb3JtcyBpdCBpbnRvIGEgc2hlbGwgY29tbWFuZC4gVGhlIHJlc3VsdFxuICogb2YgdGhlIGZ1bmN0aW9uIG11c3QgYmUgYW4gYXJyYXksIHdoZXJlIGVhY2ggaXRlbSBpcyBhIHBhcnQgb2YgYSBzaW5nbGUgY29tbWFuZC5cbiAqIFRoZSBsYXN0IGl0ZW0gb2YgdGhlIGFycmF5IGNvdWxkIGJlICc7Jy4gSWYgdGhpcyBpcyBub3QgYSBzZW1pY29sb24gdGhlbiBpdCBpcyBnb2luZyB0b1xuICogYmUgYWRkZWQgYXV0b21hdGljYWxseS5cbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyfHN0cmluZz59IGFyZ3MgQXJyYXkgb2YgYXJndW1lbnQgdmFsdWVzIHRvIGNyZWF0ZSBjaHVua3MgZm9yXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgYW55IG9mIHRoZSBjaHVua3MgcmV0dXJucyBub24temVybyBleGl0IGNvZGUgYWZ0ZXIgYmVpbmcgZXhlY3V0ZWRcbiAqL1xubWV0aG9kcy5zaGVsbENodW5rcyA9IGFzeW5jIGZ1bmN0aW9uIHNoZWxsQ2h1bmtzIChhcmdUcmFuc2Zvcm1lciwgYXJncykge1xuICBjb25zdCBjb21tYW5kcyA9IFtdO1xuICBsZXQgY21kQ2h1bmsgPSBbXTtcbiAgZm9yIChjb25zdCBhcmcgb2YgYXJncykge1xuICAgIGNvbnN0IG5leHRDbWQgPSBhcmdUcmFuc2Zvcm1lcihhcmcpO1xuICAgIGlmICghXy5pc0FycmF5KG5leHRDbWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FyZ3VtZW50IHRyYW5zZm9ybWVyIG11c3QgcmVzdWx0IGluIGFuIGFycmF5Jyk7XG4gICAgfVxuICAgIGlmIChfLmxhc3QobmV4dENtZCkgIT09ICc7Jykge1xuICAgICAgbmV4dENtZC5wdXNoKCc7Jyk7XG4gICAgfVxuICAgIGlmIChuZXh0Q21kLmpvaW4oJyAnKS5sZW5ndGggKyBjbWRDaHVuay5qb2luKCcgJykubGVuZ3RoID49IE1BWF9TSEVMTF9CVUZGRVJfTEVOR1RIKSB7XG4gICAgICBjb21tYW5kcy5wdXNoKGNtZENodW5rKTtcbiAgICAgIGNtZENodW5rID0gW107XG4gICAgfVxuICAgIGNtZENodW5rID0gWy4uLmNtZENodW5rLCAuLi5uZXh0Q21kXTtcbiAgfVxuICBpZiAoIV8uaXNFbXB0eShjbWRDaHVuaykpIHtcbiAgICBjb21tYW5kcy5wdXNoKGNtZENodW5rKTtcbiAgfVxuICBsb2cuZGVidWcoYEdvdCB0aGUgZm9sbG93aW5nIGNvbW1hbmQgY2h1bmtzIHRvIGV4ZWN1dGU6ICR7SlNPTi5zdHJpbmdpZnkoY29tbWFuZHMpfWApO1xuICBsZXQgbGFzdEVycm9yID0gbnVsbDtcbiAgZm9yIChjb25zdCBjbWQgb2YgY29tbWFuZHMpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5zaGVsbChjbWQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxhc3RFcnJvciA9IGU7XG4gICAgfVxuICB9XG4gIGlmIChsYXN0RXJyb3IpIHtcbiAgICB0aHJvdyBsYXN0RXJyb3I7XG4gIH1cbn07XG5cbi8qKlxuICogR2V0IHRoZSBwYXRoIHRvIGFkYiBleGVjdXRhYmxlIGFtZCBhc3NpZ24gaXRcbiAqIHRvIHRoaXMuZXhlY3V0YWJsZS5wYXRoIGFuZCB0aGlzLmJpbmFyaWVzLmFkYiBwcm9wZXJ0aWVzLlxuICpcbiAqIEByZXR1cm4ge0FEQn0gQURCIGluc3RhbmNlLlxuICovXG5tZXRob2RzLmdldEFkYldpdGhDb3JyZWN0QWRiUGF0aCA9IGFzeW5jIGZ1bmN0aW9uIGdldEFkYldpdGhDb3JyZWN0QWRiUGF0aCAoKSB7XG4gIHRoaXMuZXhlY3V0YWJsZS5wYXRoID0gYXdhaXQgdGhpcy5nZXRTZGtCaW5hcnlQYXRoKCdhZGInKTtcbiAgcmV0dXJuIHRoaXMuYWRiO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGZ1bGwgcGF0aCB0byBhYXB0IHRvb2wgYW5kIGFzc2lnbiBpdCB0b1xuICogdGhpcy5iaW5hcmllcy5hYXB0IHByb3BlcnR5XG4gKi9cbm1ldGhvZHMuaW5pdEFhcHQgPSBhc3luYyBmdW5jdGlvbiBpbml0QWFwdCAoKSB7XG4gIGF3YWl0IHRoaXMuZ2V0U2RrQmluYXJ5UGF0aCgnYWFwdCcpO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGZ1bGwgcGF0aCB0byBhYXB0MiB0b29sIGFuZCBhc3NpZ24gaXQgdG9cbiAqIHRoaXMuYmluYXJpZXMuYWFwdDIgcHJvcGVydHlcbiAqL1xubWV0aG9kcy5pbml0QWFwdDIgPSBhc3luYyBmdW5jdGlvbiBpbml0QWFwdDIgKCkge1xuICBhd2FpdCB0aGlzLmdldFNka0JpbmFyeVBhdGgoJ2FhcHQyJyk7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgZnVsbCBwYXRoIHRvIHppcGFsaWduIHRvb2wgYW5kIGFzc2lnbiBpdCB0b1xuICogdGhpcy5iaW5hcmllcy56aXBhbGlnbiBwcm9wZXJ0eVxuICovXG5tZXRob2RzLmluaXRaaXBBbGlnbiA9IGFzeW5jIGZ1bmN0aW9uIGluaXRaaXBBbGlnbiAoKSB7XG4gIGF3YWl0IHRoaXMuZ2V0U2RrQmluYXJ5UGF0aCgnemlwYWxpZ24nKTtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBmdWxsIHBhdGggdG8gYnVuZGxldG9vbCBiaW5hcnkgYW5kIGFzc2lnbiBpdCB0b1xuICogdGhpcy5iaW5hcmllcy5idW5kbGV0b29sIHByb3BlcnR5XG4gKi9cbm1ldGhvZHMuaW5pdEJ1bmRsZXRvb2wgPSBhc3luYyBmdW5jdGlvbiBpbml0QnVuZGxldG9vbCAoKSB7XG4gIHRyeSB7XG4gICAgdGhpcy5iaW5hcmllcy5idW5kbGV0b29sID0gYXdhaXQgZnMud2hpY2goJ2J1bmRsZXRvb2wuamFyJyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRocm93IG5ldyBFcnJvcignYnVuZGxldG9vbC5qYXIgYmluYXJ5IGlzIGV4cGVjdGVkIHRvIGJlIHByZXNlbnQgaW4gUEFUSC4gJyArXG4gICAgICAnVmlzaXQgaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9idW5kbGV0b29sIGZvciBtb3JlIGRldGFpbHMuJyk7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIEFQSSBsZXZlbCBvZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgQVBJIGxldmVsIGFzIGludGVnZXIgbnVtYmVyLCBmb3IgZXhhbXBsZSAyMSBmb3JcbiAqICAgICAgICAgICAgICAgICAgQW5kcm9pZCBMb2xsaXBvcC4gVGhlIHJlc3VsdCBvZiB0aGlzIG1ldGhvZCBpcyBjYWNoZWQsIHNvIGFsbCB0aGUgZnVydGhlclxuICogY2FsbHMgcmV0dXJuIHRoZSBzYW1lIHZhbHVlIGFzIHRoZSBmaXJzdCBvbmUuXG4gKi9cbm1ldGhvZHMuZ2V0QXBpTGV2ZWwgPSBhc3luYyBmdW5jdGlvbiBnZXRBcGlMZXZlbCAoKSB7XG4gIGlmICghXy5pc0ludGVnZXIodGhpcy5fYXBpTGV2ZWwpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0ck91dHB1dCA9IGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3JvLmJ1aWxkLnZlcnNpb24uc2RrJyk7XG4gICAgICBsZXQgYXBpTGV2ZWwgPSBwYXJzZUludChzdHJPdXRwdXQudHJpbSgpLCAxMCk7XG5cbiAgICAgIC8vIFdvcmthcm91bmQgZm9yIHByZXZpZXcvYmV0YSBwbGF0Zm9ybSBBUEkgbGV2ZWxcbiAgICAgIGNvbnN0IGNoYXJDb2RlUSA9ICdxJy5jaGFyQ29kZUF0KDApO1xuICAgICAgLy8gMjggaXMgdGhlIGZpcnN0IEFQSSBMZXZlbCwgd2hlcmUgQW5kcm9pZCBTREsgc3RhcnRlZCByZXR1cm5pbmcgbGV0dGVycyBpbiByZXNwb25zZSB0byBnZXRQbGF0Zm9ybVZlcnNpb25cbiAgICAgIGNvbnN0IGFwaUxldmVsRGlmZiA9IGFwaUxldmVsIC0gMjg7XG4gICAgICBjb25zdCBjb2RlbmFtZSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhckNvZGVRICsgYXBpTGV2ZWxEaWZmKTtcbiAgICAgIGlmIChhcGlMZXZlbERpZmYgPj0gMCAmJiAoYXdhaXQgdGhpcy5nZXRQbGF0Zm9ybVZlcnNpb24oKSkudG9Mb3dlckNhc2UoKSA9PT0gY29kZW5hbWUpIHtcbiAgICAgICAgbG9nLmRlYnVnKGBSZWxlYXNlIHZlcnNpb24gaXMgJHtjb2RlbmFtZS50b1VwcGVyQ2FzZSgpfSBidXQgZm91bmQgQVBJIExldmVsICR7YXBpTGV2ZWx9LiBTZXR0aW5nIEFQSSBMZXZlbCB0byAke2FwaUxldmVsICsgMX1gKTtcbiAgICAgICAgYXBpTGV2ZWwrKztcbiAgICAgIH1cblxuICAgICAgdGhpcy5fYXBpTGV2ZWwgPSBhcGlMZXZlbDtcbiAgICAgIGxvZy5kZWJ1ZyhgRGV2aWNlIEFQSSBsZXZlbDogJHt0aGlzLl9hcGlMZXZlbH1gKTtcbiAgICAgIGlmIChpc05hTih0aGlzLl9hcGlMZXZlbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgYWN0dWFsIG91dHB1dCAnJHtzdHJPdXRwdXR9JyBjYW5ub3QgYmUgY29udmVydGVkIHRvIGFuIGludGVnZXJgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGdldHRpbmcgZGV2aWNlIEFQSSBsZXZlbC4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGhpcy5fYXBpTGV2ZWw7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBwbGF0Zm9ybSB2ZXJzaW9uIG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBwbGF0Zm9ybSB2ZXJzaW9uIGFzIGEgc3RyaW5nLCBmb3IgZXhhbXBsZSAnNS4wJyBmb3JcbiAqIEFuZHJvaWQgTG9sbGlwb3AuXG4gKi9cbm1ldGhvZHMuZ2V0UGxhdGZvcm1WZXJzaW9uID0gYXN5bmMgZnVuY3Rpb24gZ2V0UGxhdGZvcm1WZXJzaW9uICgpIHtcbiAgbG9nLmluZm8oJ0dldHRpbmcgZGV2aWNlIHBsYXRmb3JtIHZlcnNpb24nKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncm8uYnVpbGQudmVyc2lvbi5yZWxlYXNlJyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGdldHRpbmcgZGV2aWNlIHBsYXRmb3JtIHZlcnNpb24uIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBWZXJpZnkgd2hldGhlciBhIGRldmljZSBpcyBjb25uZWN0ZWQuXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBhdCBsZWFzdCBvbmUgZGV2aWNlIGlzIHZpc2libGUgdG8gYWRiLlxuICovXG5tZXRob2RzLmlzRGV2aWNlQ29ubmVjdGVkID0gYXN5bmMgZnVuY3Rpb24gaXNEZXZpY2VDb25uZWN0ZWQgKCkge1xuICBsZXQgZGV2aWNlcyA9IGF3YWl0IHRoaXMuZ2V0Q29ubmVjdGVkRGV2aWNlcygpO1xuICByZXR1cm4gZGV2aWNlcy5sZW5ndGggPiAwO1xufTtcblxuLyoqXG4gKiBSZWN1cnNpdmVseSBjcmVhdGUgYSBuZXcgZm9sZGVyIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtb3RlUGF0aCAtIFRoZSBuZXcgcGF0aCB0byBiZSBjcmVhdGVkLlxuICogQHJldHVybiB7c3RyaW5nfSBta2RpciBjb21tYW5kIG91dHB1dC5cbiAqL1xubWV0aG9kcy5ta2RpciA9IGFzeW5jIGZ1bmN0aW9uIG1rZGlyIChyZW1vdGVQYXRoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnNoZWxsKFsnbWtkaXInLCAnLXAnLCByZW1vdGVQYXRoXSk7XG59O1xuXG4vKipcbiAqIFZlcmlmeSB3aGV0aGVyIHRoZSBnaXZlbiBhcmd1bWVudCBpcyBhXG4gKiB2YWxpZCBjbGFzcyBuYW1lLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc1N0cmluZyAtIFRoZSBhY3R1YWwgY2xhc3MgbmFtZSB0byBiZSB2ZXJpZmllZC5cbiAqIEByZXR1cm4gez9BcnJheS48TWF0Y2g+fSBUaGUgcmVzdWx0IG9mIFJlZ2V4cC5leGVjIG9wZXJhdGlvblxuICogICAgICAgICAgICAgICAgICAgICAgICAgIG9yIF9udWxsXyBpZiBubyBtYXRjaGVzIGFyZSBmb3VuZC5cbiAqL1xubWV0aG9kcy5pc1ZhbGlkQ2xhc3MgPSBmdW5jdGlvbiBpc1ZhbGlkQ2xhc3MgKGNsYXNzU3RyaW5nKSB7XG4gIC8vIHNvbWUucGFja2FnZS9zb21lLnBhY2thZ2UuQWN0aXZpdHlcbiAgcmV0dXJuIG1hdGNoQ29tcG9uZW50TmFtZShjbGFzc1N0cmluZyk7XG59O1xuXG4vKipcbiAqIEZldGNoZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBsYXVuY2hhYmxlIGFjdGl2aXR5IGZvciB0aGVcbiAqIGdpdmVuIHBhY2thZ2UuIEl0IGlzIGV4cGVjdGVkIHRoZSBwYWNrYWdlIGlzIGFscmVhZHkgaW5zdGFsbGVkIG9uXG4gKiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSB0YXJnZXQgcGFja2FnZSBpZGVudGlmaWVyXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBsYXVuY2hhYmxlIGFjdGl2aXR5XG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIHJlc29sdmluZyB0aGUgYWN0aXZpdHkgbmFtZVxuICovXG5tZXRob2RzLnJlc29sdmVMYXVuY2hhYmxlQWN0aXZpdHkgPSBhc3luYyBmdW5jdGlvbiByZXNvbHZlTGF1bmNoYWJsZUFjdGl2aXR5IChwa2cpIHtcbiAgaWYgKGF3YWl0IHRoaXMuZ2V0QXBpTGV2ZWwoKSA8IDI0KSB7XG4gICAgY29uc3Qgc3Rkb3V0ID0gYXdhaXQgdGhpcy5zaGVsbChbJ2R1bXBzeXMnLCAncGFja2FnZScsIHBrZ10pO1xuICAgIGNvbnN0IG5hbWVzID0gcGFyc2VMYXVuY2hhYmxlQWN0aXZpdHlOYW1lcyhzdGRvdXQpO1xuICAgIGlmIChfLmlzRW1wdHkobmFtZXMpKSB7XG4gICAgICBsb2cuZGVidWcoc3Rkb3V0KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHJlc29sdmUgdGhlIGxhdW5jaGFibGUgYWN0aXZpdHkgb2YgJyR7cGtnfScuIElzIGl0IGluc3RhbGxlZCBvbiB0aGUgZGV2aWNlP2ApO1xuICAgIH1cbiAgICBpZiAobmFtZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gbmFtZXNbMF07XG4gICAgfVxuXG4gICAgY29uc3QgdG1wUm9vdCA9IGF3YWl0IHRlbXBEaXIub3BlbkRpcigpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0bXBBcHAgPSBhd2FpdCB0aGlzLnB1bGxBcGsocGtnLCB0bXBSb290KTtcbiAgICAgIGNvbnN0IHthcGtBY3Rpdml0eX0gPSBhd2FpdCB0aGlzLnBhY2thZ2VBbmRMYXVuY2hBY3Rpdml0eUZyb21NYW5pZmVzdCh0bXBBcHApO1xuICAgICAgcmV0dXJuIGFwa0FjdGl2aXR5O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZy5kZWJ1ZyhlLnN0YWNrKTtcbiAgICAgIGxvZy53YXJuKGBVbmFibGUgdG8gcmVzb2x2ZSB0aGUgbGF1bmNoYWJsZSBhY3Rpdml0eSBvZiAnJHtwa2d9Jy4gYCArXG4gICAgICAgIGBUaGUgdmVyeSBmaXJzdCBtYXRjaCBvZiB0aGUgZHVtcHN5cyBvdXRwdXQgaXMgZ29pbmcgdG8gYmUgdXNlZC4gYCArXG4gICAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICByZXR1cm4gbmFtZXNbMF07XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGZzLnJpbXJhZih0bXBSb290KTtcbiAgICB9XG4gIH1cbiAgY29uc3Qge3N0ZG91dCwgc3RkZXJyfSA9IGF3YWl0IHRoaXMuc2hlbGwoWydjbWQnLCAncGFja2FnZScsICdyZXNvbHZlLWFjdGl2aXR5JywgJy0tYnJpZWYnLCBwa2ddLCB7XG4gICAgb3V0cHV0Rm9ybWF0OiB0aGlzLkVYRUNfT1VUUFVUX0ZPUk1BVC5GVUxMXG4gIH0pO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgKHN0ZG91dCB8fCAnJykuc3BsaXQoJ1xcbicpLm1hcChfLnRyaW0pKSB7XG4gICAgaWYgKHRoaXMuaXNWYWxpZENsYXNzKGxpbmUpKSB7XG4gICAgICByZXR1cm4gbGluZTtcbiAgICB9XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcmVzb2x2ZSB0aGUgbGF1bmNoYWJsZSBhY3Rpdml0eSBvZiAnJHtwa2d9Jy4gT3JpZ2luYWwgZXJyb3I6ICR7c3RkZXJyIHx8IHN0ZG91dH1gKTtcbn07XG5cbi8qKlxuICogRm9yY2UgYXBwbGljYXRpb24gdG8gc3RvcCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgc3RvcHBlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG91dHB1dCBvZiB0aGUgY29ycmVzcG9uZGluZyBhZGIgY29tbWFuZC5cbiAqL1xubWV0aG9kcy5mb3JjZVN0b3AgPSBhc3luYyBmdW5jdGlvbiBmb3JjZVN0b3AgKHBrZykge1xuICByZXR1cm4gYXdhaXQgdGhpcy5zaGVsbChbJ2FtJywgJ2ZvcmNlLXN0b3AnLCBwa2ddKTtcbn07XG5cbi8qXG4gKiBLaWxsIGFwcGxpY2F0aW9uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgc3RvcHBlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG91dHB1dCBvZiB0aGUgY29ycmVzcG9uZGluZyBhZGIgY29tbWFuZC5cbiAqL1xubWV0aG9kcy5raWxsUGFja2FnZSA9IGFzeW5jIGZ1bmN0aW9uIGtpbGxQYWNrYWdlIChwa2cpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuc2hlbGwoWydhbScsICdraWxsJywgcGtnXSk7XG59O1xuXG4vKipcbiAqIENsZWFyIHRoZSB1c2VyIGRhdGEgb2YgdGhlIHBhcnRpY3VsYXIgYXBwbGljYXRpb24gb24gdGhlIGRldmljZVxuICogdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBjbGVhcmVkLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgb3V0cHV0IG9mIHRoZSBjb3JyZXNwb25kaW5nIGFkYiBjb21tYW5kLlxuICovXG5tZXRob2RzLmNsZWFyID0gYXN5bmMgZnVuY3Rpb24gY2xlYXIgKHBrZykge1xuICByZXR1cm4gYXdhaXQgdGhpcy5zaGVsbChbJ3BtJywgJ2NsZWFyJywgcGtnXSk7XG59O1xuXG4vKipcbiAqIEdyYW50IGFsbCBwZXJtaXNzaW9ucyByZXF1ZXN0ZWQgYnkgdGhlIHBhcnRpY3VsYXIgcGFja2FnZS5cbiAqIFRoaXMgbWV0aG9kIGlzIG9ubHkgdXNlZnVsIG9uIEFuZHJvaWQgNi4wKyBhbmQgZm9yIGFwcGxpY2F0aW9uc1xuICogdGhhdCBzdXBwb3J0IGNvbXBvbmVudHMtYmFzZWQgcGVybWlzc2lvbnMgc2V0dGluZy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBrIC0gVGhlIHBhdGggdG8gdGhlIGFjdHVhbCBhcGsgZmlsZS5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgZ3JhbnRpbmcgcGVybWlzc2lvbnNcbiAqL1xubWV0aG9kcy5ncmFudEFsbFBlcm1pc3Npb25zID0gYXN5bmMgZnVuY3Rpb24gZ3JhbnRBbGxQZXJtaXNzaW9ucyAocGtnLCBhcGspIHtcbiAgY29uc3QgYXBpTGV2ZWwgPSBhd2FpdCB0aGlzLmdldEFwaUxldmVsKCk7XG4gIGxldCB0YXJnZXRTZGsgPSAwO1xuICBsZXQgZHVtcHN5c091dHB1dCA9IG51bGw7XG4gIHRyeSB7XG4gICAgaWYgKCFhcGspIHtcbiAgICAgIC8qKlxuICAgICAgICogSWYgYXBrIG5vdCBwcm92aWRlZCwgY29uc2lkZXJpbmcgYXBrIGFscmVhZHkgaW5zdGFsbGVkIG9uIHRoZSBkZXZpY2VcbiAgICAgICAqIGFuZCBmZXRjaGluZyB0YXJnZXRTZGsgdXNpbmcgcGFja2FnZSBuYW1lLlxuICAgICAgICovXG4gICAgICBkdW1wc3lzT3V0cHV0ID0gYXdhaXQgdGhpcy5zaGVsbChbJ2R1bXBzeXMnLCAncGFja2FnZScsIHBrZ10pO1xuICAgICAgdGFyZ2V0U2RrID0gYXdhaXQgdGhpcy50YXJnZXRTZGtWZXJzaW9uVXNpbmdQS0cocGtnLCBkdW1wc3lzT3V0cHV0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0U2RrID0gYXdhaXQgdGhpcy50YXJnZXRTZGtWZXJzaW9uRnJvbU1hbmlmZXN0KGFwayk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgLy9hdm9pZGluZyBsb2dnaW5nIGVycm9yIHN0YWNrLCBhcyBjYWxsaW5nIGxpYnJhcnkgZnVuY3Rpb24gd291bGQgaGF2ZSBsb2dnZWRcbiAgICBsb2cud2FybihgUmFuIGludG8gcHJvYmxlbSBnZXR0aW5nIHRhcmdldCBTREsgdmVyc2lvbjsgaWdub3JpbmcuLi5gKTtcbiAgfVxuICBpZiAoYXBpTGV2ZWwgPj0gMjMgJiYgdGFyZ2V0U2RrID49IDIzKSB7XG4gICAgLyoqXG4gICAgICogSWYgdGhlIGRldmljZSBpcyBydW5uaW5nIEFuZHJvaWQgNi4wKEFQSSAyMykgb3IgaGlnaGVyLCBhbmQgeW91ciBhcHAncyB0YXJnZXQgU0RLIGlzIDIzIG9yIGhpZ2hlcjpcbiAgICAgKiBUaGUgYXBwIGhhcyB0byBsaXN0IHRoZSBwZXJtaXNzaW9ucyBpbiB0aGUgbWFuaWZlc3QuXG4gICAgICogcmVmZXI6IGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3RyYWluaW5nL3Blcm1pc3Npb25zL3JlcXVlc3RpbmcuaHRtbFxuICAgICAqL1xuICAgIGR1bXBzeXNPdXRwdXQgPSBkdW1wc3lzT3V0cHV0IHx8IGF3YWl0IHRoaXMuc2hlbGwoWydkdW1wc3lzJywgJ3BhY2thZ2UnLCBwa2ddKTtcbiAgICBjb25zdCByZXF1ZXN0ZWRQZXJtaXNzaW9ucyA9IGF3YWl0IHRoaXMuZ2V0UmVxUGVybWlzc2lvbnMocGtnLCBkdW1wc3lzT3V0cHV0KTtcbiAgICBjb25zdCBncmFudGVkUGVybWlzc2lvbnMgPSBhd2FpdCB0aGlzLmdldEdyYW50ZWRQZXJtaXNzaW9ucyhwa2csIGR1bXBzeXNPdXRwdXQpO1xuICAgIGNvbnN0IHBlcm1pc3Npb25zVG9HcmFudCA9IF8uZGlmZmVyZW5jZShyZXF1ZXN0ZWRQZXJtaXNzaW9ucywgZ3JhbnRlZFBlcm1pc3Npb25zKTtcbiAgICBpZiAoXy5pc0VtcHR5KHBlcm1pc3Npb25zVG9HcmFudCkpIHtcbiAgICAgIGxvZy5pbmZvKGAke3BrZ30gY29udGFpbnMgbm8gcGVybWlzc2lvbnMgYXZhaWxhYmxlIGZvciBncmFudGluZ2ApO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLmdyYW50UGVybWlzc2lvbnMocGtnLCBwZXJtaXNzaW9uc1RvR3JhbnQpO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBHcmFudCBtdWx0aXBsZSBwZXJtaXNzaW9ucyBmb3IgdGhlIHBhcnRpY3VsYXIgcGFja2FnZS5cbiAqIFRoaXMgY2FsbCBpcyBtb3JlIHBlcmZvcm1hbnQgdGhhbiBgZ3JhbnRQZXJtaXNzaW9uYCBvbmUsIHNpbmNlIGl0IGNvbWJpbmVzXG4gKiBtdWx0aXBsZSBgYWRiIHNoZWxsYCBjYWxscyBpbnRvIGEgc2luZ2xlIGNvbW1hbmQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBwZXJtaXNzaW9ucyAtIFRoZSBsaXN0IG9mIHBlcm1pc3Npb25zIHRvIGJlIGdyYW50ZWQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGNoYW5naW5nIHBlcm1pc3Npb25zLlxuICovXG5tZXRob2RzLmdyYW50UGVybWlzc2lvbnMgPSBhc3luYyBmdW5jdGlvbiBncmFudFBlcm1pc3Npb25zIChwa2csIHBlcm1pc3Npb25zKSB7XG4gIC8vIEFzIGl0IGNvbnN1bWVzIG1vcmUgdGltZSBmb3IgZ3JhbnRpbmcgZWFjaCBwZXJtaXNzaW9uLFxuICAvLyB0cnlpbmcgdG8gZ3JhbnQgYWxsIHBlcm1pc3Npb24gYnkgZm9ybWluZyBlcXVpdmFsZW50IGNvbW1hbmQuXG4gIC8vIEFsc28sIGl0IGlzIG5lY2Vzc2FyeSB0byBzcGxpdCBsb25nIGNvbW1hbmRzIGludG8gY2h1bmtzLCBzaW5jZSB0aGUgbWF4aW11bSBsZW5ndGggb2ZcbiAgLy8gYWRiIHNoZWxsIGJ1ZmZlciBpcyBsaW1pdGVkXG4gIGxvZy5kZWJ1ZyhgR3JhbnRpbmcgcGVybWlzc2lvbnMgJHtKU09OLnN0cmluZ2lmeShwZXJtaXNzaW9ucyl9IHRvICcke3BrZ30nYCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5zaGVsbENodW5rcygocGVybSkgPT4gWydwbScsICdncmFudCcsIHBrZywgcGVybV0sIHBlcm1pc3Npb25zKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmICghSUdOT1JFRF9QRVJNX0VSUk9SUy5zb21lKChwYXR0ZXJuKSA9PiBwYXR0ZXJuLnRlc3QoZS5zdGRlcnIgfHwgZS5tZXNzYWdlKSkpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEdyYW50IHNpbmdsZSBwZXJtaXNzaW9uIGZvciB0aGUgcGFydGljdWxhciBwYWNrYWdlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwZXJtaXNzaW9uIC0gVGhlIGZ1bGwgbmFtZSBvZiB0aGUgcGVybWlzc2lvbiB0byBiZSBncmFudGVkLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBjaGFuZ2luZyBwZXJtaXNzaW9ucy5cbiAqL1xubWV0aG9kcy5ncmFudFBlcm1pc3Npb24gPSBhc3luYyBmdW5jdGlvbiBncmFudFBlcm1pc3Npb24gKHBrZywgcGVybWlzc2lvbikge1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuc2hlbGwoWydwbScsICdncmFudCcsIHBrZywgcGVybWlzc2lvbl0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKCFOT1RfQ0hBTkdFQUJMRV9QRVJNX0VSUk9SLnRlc3QoZS5zdGRlcnIgfHwgZS5tZXNzYWdlKSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogUmV2b2tlIHNpbmdsZSBwZXJtaXNzaW9uIGZyb20gdGhlIHBhcnRpY3VsYXIgcGFja2FnZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gcGVybWlzc2lvbiAtIFRoZSBmdWxsIG5hbWUgb2YgdGhlIHBlcm1pc3Npb24gdG8gYmUgcmV2b2tlZC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgY2hhbmdpbmcgcGVybWlzc2lvbnMuXG4gKi9cbm1ldGhvZHMucmV2b2tlUGVybWlzc2lvbiA9IGFzeW5jIGZ1bmN0aW9uIHJldm9rZVBlcm1pc3Npb24gKHBrZywgcGVybWlzc2lvbikge1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuc2hlbGwoWydwbScsICdyZXZva2UnLCBwa2csIHBlcm1pc3Npb25dKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmICghTk9UX0NIQU5HRUFCTEVfUEVSTV9FUlJPUi50ZXN0KGUuc3RkZXJyIHx8IGUubWVzc2FnZSkpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBsaXN0IG9mIGdyYW50ZWQgcGVybWlzc2lvbnMgZm9yIHRoZSBwYXJ0aWN1bGFyIHBhY2thZ2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtzdHJpbmd9IGNtZE91dHB1dCBbbnVsbF0gLSBPcHRpb25hbCBwYXJhbWV0ZXIgY29udGFpbmluZyBjb21tYW5kIG91dHB1dCBvZlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZHVtcHN5cyBwYWNrYWdlXyBjb21tYW5kLiBJdCBtYXkgc3BlZWQgdXAgdGhlIG1ldGhvZCBleGVjdXRpb24uXG4gKiBAcmV0dXJuIHtBcnJheTxTdHJpbmc+fSBUaGUgbGlzdCBvZiBncmFudGVkIHBlcm1pc3Npb25zIG9yIGFuIGVtcHR5IGxpc3QuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGNoYW5naW5nIHBlcm1pc3Npb25zLlxuICovXG5tZXRob2RzLmdldEdyYW50ZWRQZXJtaXNzaW9ucyA9IGFzeW5jIGZ1bmN0aW9uIGdldEdyYW50ZWRQZXJtaXNzaW9ucyAocGtnLCBjbWRPdXRwdXQgPSBudWxsKSB7XG4gIGxvZy5kZWJ1ZygnUmV0cmlldmluZyBncmFudGVkIHBlcm1pc3Npb25zJyk7XG4gIGNvbnN0IHN0ZG91dCA9IGNtZE91dHB1dCB8fCBhd2FpdCB0aGlzLnNoZWxsKFsnZHVtcHN5cycsICdwYWNrYWdlJywgcGtnXSk7XG4gIHJldHVybiBleHRyYWN0TWF0Y2hpbmdQZXJtaXNzaW9ucyhzdGRvdXQsIFsnaW5zdGFsbCcsICdydW50aW1lJ10sIHRydWUpO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgbGlzdCBvZiBkZW5pZWQgcGVybWlzc2lvbnMgZm9yIHRoZSBwYXJ0aWN1bGFyIHBhY2thZ2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtzdHJpbmd9IGNtZE91dHB1dCBbbnVsbF0gLSBPcHRpb25hbCBwYXJhbWV0ZXIgY29udGFpbmluZyBjb21tYW5kIG91dHB1dCBvZlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZHVtcHN5cyBwYWNrYWdlXyBjb21tYW5kLiBJdCBtYXkgc3BlZWQgdXAgdGhlIG1ldGhvZCBleGVjdXRpb24uXG4gKiBAcmV0dXJuIHtBcnJheTxTdHJpbmc+fSBUaGUgbGlzdCBvZiBkZW5pZWQgcGVybWlzc2lvbnMgb3IgYW4gZW1wdHkgbGlzdC5cbiAqL1xubWV0aG9kcy5nZXREZW5pZWRQZXJtaXNzaW9ucyA9IGFzeW5jIGZ1bmN0aW9uIGdldERlbmllZFBlcm1pc3Npb25zIChwa2csIGNtZE91dHB1dCA9IG51bGwpIHtcbiAgbG9nLmRlYnVnKCdSZXRyaWV2aW5nIGRlbmllZCBwZXJtaXNzaW9ucycpO1xuICBjb25zdCBzdGRvdXQgPSBjbWRPdXRwdXQgfHwgYXdhaXQgdGhpcy5zaGVsbChbJ2R1bXBzeXMnLCAncGFja2FnZScsIHBrZ10pO1xuICByZXR1cm4gZXh0cmFjdE1hdGNoaW5nUGVybWlzc2lvbnMoc3Rkb3V0LCBbJ2luc3RhbGwnLCAncnVudGltZSddLCBmYWxzZSk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBsaXN0IG9mIHJlcXVlc3RlZCBwZXJtaXNzaW9ucyBmb3IgdGhlIHBhcnRpY3VsYXIgcGFja2FnZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gY21kT3V0cHV0IFtudWxsXSAtIE9wdGlvbmFsIHBhcmFtZXRlciBjb250YWluaW5nIGNvbW1hbmQgb3V0cHV0IG9mXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kdW1wc3lzIHBhY2thZ2VfIGNvbW1hbmQuIEl0IG1heSBzcGVlZCB1cCB0aGUgbWV0aG9kIGV4ZWN1dGlvbi5cbiAqIEByZXR1cm4ge0FycmF5PFN0cmluZz59IFRoZSBsaXN0IG9mIHJlcXVlc3RlZCBwZXJtaXNzaW9ucyBvciBhbiBlbXB0eSBsaXN0LlxuICovXG5tZXRob2RzLmdldFJlcVBlcm1pc3Npb25zID0gYXN5bmMgZnVuY3Rpb24gZ2V0UmVxUGVybWlzc2lvbnMgKHBrZywgY21kT3V0cHV0ID0gbnVsbCkge1xuICBsb2cuZGVidWcoJ1JldHJpZXZpbmcgcmVxdWVzdGVkIHBlcm1pc3Npb25zJyk7XG4gIGNvbnN0IHN0ZG91dCA9IGNtZE91dHB1dCB8fCBhd2FpdCB0aGlzLnNoZWxsKFsnZHVtcHN5cycsICdwYWNrYWdlJywgcGtnXSk7XG4gIHJldHVybiBleHRyYWN0TWF0Y2hpbmdQZXJtaXNzaW9ucyhzdGRvdXQsIFsncmVxdWVzdGVkJ10pO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgbGlzdCBvZiBsb2NhdGlvbiBwcm92aWRlcnMgZm9yIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtBcnJheS48U3RyaW5nPn0gVGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGxvY2F0aW9uIHByb3ZpZGVycyBvciBhbiBlbXB0eSBsaXN0LlxuICovXG5tZXRob2RzLmdldExvY2F0aW9uUHJvdmlkZXJzID0gYXN5bmMgZnVuY3Rpb24gZ2V0TG9jYXRpb25Qcm92aWRlcnMgKCkge1xuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5nZXRTZXR0aW5nKCdzZWN1cmUnLCAnbG9jYXRpb25fcHJvdmlkZXJzX2FsbG93ZWQnKTtcbiAgcmV0dXJuIHN0ZG91dC50cmltKCkuc3BsaXQoJywnKVxuICAgIC5tYXAoKHApID0+IHAudHJpbSgpKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG59O1xuXG4vKipcbiAqIFRvZ2dsZSB0aGUgc3RhdGUgb2YgR1BTIGxvY2F0aW9uIHByb3ZpZGVyLlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gZW5hYmxlZCAtIFdoZXRoZXIgdG8gZW5hYmxlICh0cnVlKSBvciBkaXNhYmxlIChmYWxzZSkgdGhlIEdQUyBwcm92aWRlci5cbiAqL1xubWV0aG9kcy50b2dnbGVHUFNMb2NhdGlvblByb3ZpZGVyID0gYXN5bmMgZnVuY3Rpb24gdG9nZ2xlR1BTTG9jYXRpb25Qcm92aWRlciAoZW5hYmxlZCkge1xuICBhd2FpdCB0aGlzLnNldFNldHRpbmcoJ3NlY3VyZScsICdsb2NhdGlvbl9wcm92aWRlcnNfYWxsb3dlZCcsIGAke2VuYWJsZWQgPyAnKycgOiAnLSd9Z3BzYCk7XG59O1xuXG4vKipcbiAqIFNldCBoaWRkZW4gYXBpIHBvbGljeSB0byBtYW5hZ2UgYWNjZXNzIHRvIG5vbi1TREsgQVBJcy5cbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3ByZXZpZXcvcmVzdHJpY3Rpb25zLW5vbi1zZGstaW50ZXJmYWNlc1xuICpcbiAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gdmFsdWUgLSBUaGUgQVBJIGVuZm9yY2VtZW50IHBvbGljeS5cbiAqICAgICBGb3IgQW5kcm9pZCBQXG4gKiAgICAgMDogRGlzYWJsZSBub24tU0RLIEFQSSB1c2FnZSBkZXRlY3Rpb24uIFRoaXMgd2lsbCBhbHNvIGRpc2FibGUgbG9nZ2luZywgYW5kIGFsc28gYnJlYWsgdGhlIHN0cmljdCBtb2RlIEFQSSxcbiAqICAgICAgICBkZXRlY3ROb25TZGtBcGlVc2FnZSgpLiBOb3QgcmVjb21tZW5kZWQuXG4gKiAgICAgMTogXCJKdXN0IHdhcm5cIiAtIHBlcm1pdCBhY2Nlc3MgdG8gYWxsIG5vbi1TREsgQVBJcywgYnV0IGtlZXAgd2FybmluZ3MgaW4gdGhlIGxvZy5cbiAqICAgICAgICBUaGUgc3RyaWN0IG1vZGUgQVBJIHdpbGwga2VlcCB3b3JraW5nLlxuICogICAgIDI6IERpc2FsbG93IHVzYWdlIG9mIGRhcmsgZ3JleSBhbmQgYmxhY2sgbGlzdGVkIEFQSXMuXG4gKiAgICAgMzogRGlzYWxsb3cgdXNhZ2Ugb2YgYmxhY2tsaXN0ZWQgQVBJcywgYnV0IGFsbG93IHVzYWdlIG9mIGRhcmsgZ3JleSBsaXN0ZWQgQVBJcy5cbiAqXG4gKiAgICAgRm9yIEFuZHJvaWQgUVxuICogICAgIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3ByZXZpZXcvbm9uLXNkay1xI2VuYWJsZS1ub24tc2RrLWFjY2Vzc1xuICogICAgIDA6IERpc2FibGUgYWxsIGRldGVjdGlvbiBvZiBub24tU0RLIGludGVyZmFjZXMuIFVzaW5nIHRoaXMgc2V0dGluZyBkaXNhYmxlcyBhbGwgbG9nIG1lc3NhZ2VzIGZvciBub24tU0RLIGludGVyZmFjZSB1c2FnZVxuICogICAgICAgIGFuZCBwcmV2ZW50cyB5b3UgZnJvbSB0ZXN0aW5nIHlvdXIgYXBwIHVzaW5nIHRoZSBTdHJpY3RNb2RlIEFQSS4gVGhpcyBzZXR0aW5nIGlzIG5vdCByZWNvbW1lbmRlZC5cbiAqICAgICAxOiBFbmFibGUgYWNjZXNzIHRvIGFsbCBub24tU0RLIGludGVyZmFjZXMsIGJ1dCBwcmludCBsb2cgbWVzc2FnZXMgd2l0aCB3YXJuaW5ncyBmb3IgYW55IG5vbi1TREsgaW50ZXJmYWNlIHVzYWdlLlxuICogICAgICAgIFVzaW5nIHRoaXMgc2V0dGluZyBhbHNvIGFsbG93cyB5b3UgdG8gdGVzdCB5b3VyIGFwcCB1c2luZyB0aGUgU3RyaWN0TW9kZSBBUEkuXG4gKiAgICAgMjogRGlzYWxsb3cgdXNhZ2Ugb2Ygbm9uLVNESyBpbnRlcmZhY2VzIHRoYXQgYmVsb25nIHRvIGVpdGhlciB0aGUgYmxhY2sgbGlzdFxuICogICAgICAgIG9yIHRvIGEgcmVzdHJpY3RlZCBncmV5bGlzdCBmb3IgeW91ciB0YXJnZXQgQVBJIGxldmVsLlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlRXJyb3IgW2ZhbHNlXSBXaGV0aGVyIHRvIGlnbm9yZSBhbiBleGNlcHRpb24gaW4gJ2FkYiBzaGVsbCBzZXR0aW5ncyBwdXQgZ2xvYmFsJyBjb21tYW5kXG4gKiBAdGhyb3dzIHtlcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIGFuZCBpZ25vcmVFcnJvciB3YXMgdHJ1ZSB3aGlsZSBleGVjdXRpbmcgJ2FkYiBzaGVsbCBzZXR0aW5ncyBwdXQgZ2xvYmFsJ1xuICogICAgICAgICAgICAgICAgIGNvbW1hbmQgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLnNldEhpZGRlbkFwaVBvbGljeSA9IGFzeW5jIGZ1bmN0aW9uIHNldEhpZGRlbkFwaVBvbGljeSAodmFsdWUsIGlnbm9yZUVycm9yID0gZmFsc2UpIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLnNoZWxsKEhJRERFTl9BUElfUE9MSUNZX0tFWVMubWFwKChrKSA9PiBgc2V0dGluZ3MgcHV0IGdsb2JhbCAke2t9ICR7dmFsdWV9YCkuam9pbignOycpKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmICghaWdub3JlRXJyb3IpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIGxvZy5pbmZvKGBGYWlsZWQgdG8gc2V0IHNldHRpbmcga2V5cyAnJHtISURERU5fQVBJX1BPTElDWV9LRVlTfScgdG8gJyR7dmFsdWV9Jy4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIFJlc2V0IGFjY2VzcyB0byBub24tU0RLIEFQSXMgdG8gaXRzIGRlZmF1bHQgc2V0dGluZy5cbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3ByZXZpZXcvcmVzdHJpY3Rpb25zLW5vbi1zZGstaW50ZXJmYWNlc1xuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlRXJyb3IgW2ZhbHNlXSBXaGV0aGVyIHRvIGlnbm9yZSBhbiBleGNlcHRpb24gaW4gJ2FkYiBzaGVsbCBzZXR0aW5ncyBkZWxldGUgZ2xvYmFsJyBjb21tYW5kXG4gKiBAdGhyb3dzIHtlcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIGFuZCBpZ25vcmVFcnJvciB3YXMgdHJ1ZSB3aGlsZSBleGVjdXRpbmcgJ2FkYiBzaGVsbCBzZXR0aW5ncyBkZWxldGUgZ2xvYmFsJ1xuICogICAgICAgICAgICAgICAgIGNvbW1hbmQgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLnNldERlZmF1bHRIaWRkZW5BcGlQb2xpY3kgPSBhc3luYyBmdW5jdGlvbiBzZXREZWZhdWx0SGlkZGVuQXBpUG9saWN5IChpZ25vcmVFcnJvciA9IGZhbHNlKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5zaGVsbChISURERU5fQVBJX1BPTElDWV9LRVlTLm1hcCgoaykgPT4gYHNldHRpbmdzIGRlbGV0ZSBnbG9iYWwgJHtrfWApLmpvaW4oJzsnKSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoIWlnbm9yZUVycm9yKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICBsb2cuaW5mbyhgRmFpbGVkIHRvIGRlbGV0ZSBrZXlzICcke0hJRERFTl9BUElfUE9MSUNZX0tFWVN9Jy4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIFN0b3AgdGhlIHBhcnRpY3VsYXIgcGFja2FnZSBpZiBpdCBpcyBydW5uaW5nIGFuZCBjbGVhcnMgaXRzIGFwcGxpY2F0aW9uIGRhdGEuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgcHJvY2Vzc2VkLlxuICovXG5tZXRob2RzLnN0b3BBbmRDbGVhciA9IGFzeW5jIGZ1bmN0aW9uIHN0b3BBbmRDbGVhciAocGtnKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5mb3JjZVN0b3AocGtnKTtcbiAgICBhd2FpdCB0aGlzLmNsZWFyKHBrZyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBzdG9wIGFuZCBjbGVhciAke3BrZ30uIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgbGlzdCBvZiBhdmFpbGFibGUgaW5wdXQgbWV0aG9kcyAoSU1FcykgZm9yIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtBcnJheS48U3RyaW5nPn0gVGhlIGxpc3Qgb2YgSU1FIG5hbWVzIG9yIGFuIGVtcHR5IGxpc3QuXG4gKi9cbm1ldGhvZHMuYXZhaWxhYmxlSU1FcyA9IGFzeW5jIGZ1bmN0aW9uIGF2YWlsYWJsZUlNRXMgKCkge1xuICB0cnkge1xuICAgIHJldHVybiBnZXRJTUVMaXN0RnJvbU91dHB1dChhd2FpdCB0aGlzLnNoZWxsKFsnaW1lJywgJ2xpc3QnLCAnLWEnXSkpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBnZXR0aW5nIGF2YWlsYWJsZSBJTUUncy4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBsaXN0IG9mIGVuYWJsZWQgaW5wdXQgbWV0aG9kcyAoSU1FcykgZm9yIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtBcnJheS48U3RyaW5nPn0gVGhlIGxpc3Qgb2YgZW5hYmxlZCBJTUUgbmFtZXMgb3IgYW4gZW1wdHkgbGlzdC5cbiAqL1xubWV0aG9kcy5lbmFibGVkSU1FcyA9IGFzeW5jIGZ1bmN0aW9uIGVuYWJsZWRJTUVzICgpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZ2V0SU1FTGlzdEZyb21PdXRwdXQoYXdhaXQgdGhpcy5zaGVsbChbJ2ltZScsICdsaXN0J10pKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZ2V0dGluZyBlbmFibGVkIElNRSdzLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogRW5hYmxlIHRoZSBwYXJ0aWN1bGFyIGlucHV0IG1ldGhvZCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGltZUlkIC0gT25lIG9mIGV4aXN0aW5nIElNRSBpZHMuXG4gKi9cbm1ldGhvZHMuZW5hYmxlSU1FID0gYXN5bmMgZnVuY3Rpb24gZW5hYmxlSU1FIChpbWVJZCkge1xuICBhd2FpdCB0aGlzLnNoZWxsKFsnaW1lJywgJ2VuYWJsZScsIGltZUlkXSk7XG59O1xuXG4vKipcbiAqIERpc2FibGUgdGhlIHBhcnRpY3VsYXIgaW5wdXQgbWV0aG9kIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaW1lSWQgLSBPbmUgb2YgZXhpc3RpbmcgSU1FIGlkcy5cbiAqL1xubWV0aG9kcy5kaXNhYmxlSU1FID0gYXN5bmMgZnVuY3Rpb24gZGlzYWJsZUlNRSAoaW1lSWQpIHtcbiAgYXdhaXQgdGhpcy5zaGVsbChbJ2ltZScsICdkaXNhYmxlJywgaW1lSWRdKTtcbn07XG5cbi8qKlxuICogU2V0IHRoZSBwYXJ0aWN1bGFyIGlucHV0IG1ldGhvZCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGltZUlkIC0gT25lIG9mIGV4aXN0aW5nIElNRSBpZHMuXG4gKi9cbm1ldGhvZHMuc2V0SU1FID0gYXN5bmMgZnVuY3Rpb24gc2V0SU1FIChpbWVJZCkge1xuICBhd2FpdCB0aGlzLnNoZWxsKFsnaW1lJywgJ3NldCcsIGltZUlkXSk7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgZGVmYXVsdCBpbnB1dCBtZXRob2Qgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4gez9zdHJpbmd9IFRoZSBuYW1lIG9mIHRoZSBkZWZhdWx0IGlucHV0IG1ldGhvZFxuICovXG5tZXRob2RzLmRlZmF1bHRJTUUgPSBhc3luYyBmdW5jdGlvbiBkZWZhdWx0SU1FICgpIHtcbiAgdHJ5IHtcbiAgICBsZXQgZW5naW5lID0gYXdhaXQgdGhpcy5nZXRTZXR0aW5nKCdzZWN1cmUnLCAnZGVmYXVsdF9pbnB1dF9tZXRob2QnKTtcbiAgICBpZiAoZW5naW5lID09PSAnbnVsbCcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZW5naW5lLnRyaW0oKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZ2V0dGluZyBkZWZhdWx0IElNRS4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIFNlbmQgdGhlIHBhcnRpY3VsYXIga2V5Y29kZSB0byB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBrZXljb2RlIC0gVGhlIGFjdHVhbCBrZXkgY29kZSB0byBiZSBzZW50LlxuICovXG5tZXRob2RzLmtleWV2ZW50ID0gYXN5bmMgZnVuY3Rpb24ga2V5ZXZlbnQgKGtleWNvZGUpIHtcbiAgLy8ga2V5Y29kZSBtdXN0IGJlIGFuIGludC5cbiAgbGV0IGNvZGUgPSBwYXJzZUludChrZXljb2RlLCAxMCk7XG4gIGF3YWl0IHRoaXMuc2hlbGwoWydpbnB1dCcsICdrZXlldmVudCcsIGNvZGVdKTtcbn07XG5cbi8qKlxuICogU2VuZCB0aGUgcGFydGljdWxhciB0ZXh0IG9yIGEgbnVtYmVyIHRvIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqIFRoZSB0ZXh0IGdldHMgcHJvcGVybHkgZXNjYXBlZCBiZWZvcmUgYmVpbmcgcGFzc2VkIHRvIEFEQi5cbiAqIE5vb3AgaWYgdGhlIHRleHQgaXMgZW1wdHkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSB0ZXh0IC0gVGhlIGFjdHVhbCB0ZXh0IHRvIGJlIHNlbnQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgaXQgaXMgaW1wb3NzaWJsZSB0byBlc2NhcGUgdGhlIGdpdmVuIHN0cmluZ1xuICovXG5tZXRob2RzLmlucHV0VGV4dCA9IGFzeW5jIGZ1bmN0aW9uIGlucHV0VGV4dCAodGV4dCkge1xuICBpZiAodGV4dCA9PT0gJycpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBvcmlnaW5hbFN0ciA9IGAke3RleHR9YDtcbiAgY29uc3QgZXNjYXBlZFRleHQgPSBvcmlnaW5hbFN0ci5yZXBsYWNlKC9cXCQvZywgJ1xcXFwkJykucmVwbGFjZSgvIC9nLCAnJXMnKTtcbiAgbGV0IGFyZ3MgPSBbJ2lucHV0JywgJ3RleHQnLCBvcmlnaW5hbFN0cl07XG4gIGlmIChlc2NhcGVkVGV4dCAhPT0gb3JpZ2luYWxTdHIgfHwgQURCX0lOUFVUX0VTQ0FQRV9QQVRURVJOLnRlc3Qob3JpZ2luYWxTdHIpKSB7XG4gICAgaWYgKF8uZXZlcnkoWydcIicsIGAnYF0sIChjKSA9PiBvcmlnaW5hbFN0ci5pbmNsdWRlcyhjKSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYERpZCBub3Qga25vdyBob3cgdG8gZXNjYXBlIGEgc3RyaW5nIHRoYXQgY29udGFpbnMgYm90aCB0eXBlcyBvZiBxdW90ZXMgKFwiIGFuZCAnKWBcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHEgPSBvcmlnaW5hbFN0ci5pbmNsdWRlcygnXCInKSA/IGAnYCA6ICdcIic7XG4gICAgYXJncyA9IFtgaW5wdXQgdGV4dCAke3F9JHtlc2NhcGVkVGV4dH0ke3F9YF07XG4gIH1cbiAgYXdhaXQgdGhpcy5zaGVsbChhcmdzKTtcbn07XG5cbi8qKlxuICogQ2xlYXIgdGhlIGFjdGl2ZSB0ZXh0IGZpZWxkIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdCBieSBzZW5kaW5nXG4gKiBzcGVjaWFsIGtleWV2ZW50cyB0byBpdC5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIFsxMDBdIC0gVGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSB0ZXh0IGluIHRoZSBmaWVsZCB0byBiZSBjbGVhcmVkLlxuICovXG5tZXRob2RzLmNsZWFyVGV4dEZpZWxkID0gYXN5bmMgZnVuY3Rpb24gY2xlYXJUZXh0RmllbGQgKGxlbmd0aCA9IDEwMCkge1xuICAvLyBhc3N1bWVzIHRoYXQgdGhlIEVkaXRUZXh0IGZpZWxkIGFscmVhZHkgaGFzIGZvY3VzXG4gIGxvZy5kZWJ1ZyhgQ2xlYXJpbmcgdXAgdG8gJHtsZW5ndGh9IGNoYXJhY3RlcnNgKTtcbiAgaWYgKGxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICBsZXQgYXJncyA9IFsnaW5wdXQnLCAna2V5ZXZlbnQnXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIC8vIHdlIGNhbm5vdCBrbm93IHdoZXJlIHRoZSBjdXJzb3IgaXMgaW4gdGhlIHRleHQgZmllbGQsIHNvIGRlbGV0ZSBib3RoIGJlZm9yZVxuICAgIC8vIGFuZCBhZnRlciBzbyB0aGF0IHdlIGdldCByaWQgb2YgZXZlcnl0aGluZ1xuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL3ZpZXcvS2V5RXZlbnQuaHRtbCNLRVlDT0RFX0RFTFxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL3ZpZXcvS2V5RXZlbnQuaHRtbCNLRVlDT0RFX0ZPUldBUkRfREVMXG4gICAgYXJncy5wdXNoKCc2NycsICcxMTInKTtcbiAgfVxuICBhd2FpdCB0aGlzLnNoZWxsKGFyZ3MpO1xufTtcblxuLyoqXG4gKiBTZW5kIHRoZSBzcGVjaWFsIGtleWNvZGUgdG8gdGhlIGRldmljZSB1bmRlciB0ZXN0IGluIG9yZGVyIHRvIGxvY2sgaXQuXG4gKi9cbm1ldGhvZHMubG9jayA9IGFzeW5jIGZ1bmN0aW9uIGxvY2sgKCkge1xuICBpZiAoYXdhaXQgdGhpcy5pc1NjcmVlbkxvY2tlZCgpKSB7XG4gICAgbG9nLmRlYnVnKCdTY3JlZW4gaXMgYWxyZWFkeSBsb2NrZWQuIERvaW5nIG5vdGhpbmcuJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxvZy5kZWJ1ZygnUHJlc3NpbmcgdGhlIEtFWUNPREVfUE9XRVIgYnV0dG9uIHRvIGxvY2sgc2NyZWVuJyk7XG4gIGF3YWl0IHRoaXMua2V5ZXZlbnQoMjYpO1xuXG4gIGNvbnN0IHRpbWVvdXRNcyA9IDUwMDA7XG4gIHRyeSB7XG4gICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbihhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmlzU2NyZWVuTG9ja2VkKCksIHtcbiAgICAgIHdhaXRNczogdGltZW91dE1zLFxuICAgICAgaW50ZXJ2YWxNczogNTAwLFxuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgZGV2aWNlIHNjcmVlbiBpcyBzdGlsbCBsb2NrZWQgYWZ0ZXIgJHt0aW1lb3V0TXN9bXMgdGltZW91dGApO1xuICB9XG59O1xuXG4vKipcbiAqIFNlbmQgdGhlIHNwZWNpYWwga2V5Y29kZSB0byB0aGUgZGV2aWNlIHVuZGVyIHRlc3QgaW4gb3JkZXIgdG8gZW11bGF0ZVxuICogQmFjayBidXR0b24gdGFwLlxuICovXG5tZXRob2RzLmJhY2sgPSBhc3luYyBmdW5jdGlvbiBiYWNrICgpIHtcbiAgbG9nLmRlYnVnKCdQcmVzc2luZyB0aGUgQkFDSyBidXR0b24nKTtcbiAgYXdhaXQgdGhpcy5rZXlldmVudCg0KTtcbn07XG5cbi8qKlxuICogU2VuZCB0aGUgc3BlY2lhbCBrZXljb2RlIHRvIHRoZSBkZXZpY2UgdW5kZXIgdGVzdCBpbiBvcmRlciB0byBlbXVsYXRlXG4gKiBIb21lIGJ1dHRvbiB0YXAuXG4gKi9cbm1ldGhvZHMuZ29Ub0hvbWUgPSBhc3luYyBmdW5jdGlvbiBnb1RvSG9tZSAoKSB7XG4gIGxvZy5kZWJ1ZygnUHJlc3NpbmcgdGhlIEhPTUUgYnV0dG9uJyk7XG4gIGF3YWl0IHRoaXMua2V5ZXZlbnQoMyk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ30gdGhlIGFjdHVhbCBwYXRoIHRvIGFkYiBleGVjdXRhYmxlLlxuICovXG5tZXRob2RzLmdldEFkYlBhdGggPSBmdW5jdGlvbiBnZXRBZGJQYXRoICgpIHtcbiAgcmV0dXJuIHRoaXMuZXhlY3V0YWJsZS5wYXRoO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSBjdXJyZW50IHNjcmVlbiBvcmllbnRhdGlvbiBvZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgY3VycmVudCBvcmllbnRhdGlvbiBlbmNvZGVkIGFzIGFuIGludGVnZXIgbnVtYmVyLlxuICovXG5tZXRob2RzLmdldFNjcmVlbk9yaWVudGF0aW9uID0gYXN5bmMgZnVuY3Rpb24gZ2V0U2NyZWVuT3JpZW50YXRpb24gKCkge1xuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5zaGVsbChbJ2R1bXBzeXMnLCAnaW5wdXQnXSk7XG4gIHJldHVybiBnZXRTdXJmYWNlT3JpZW50YXRpb24oc3Rkb3V0KTtcbn07XG5cbi8qKlxuICogU2VuZCBhbiBhcmJpdHJhcnkgVGVsbmV0IGNvbW1hbmQgdG8gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb21tYW5kIC0gVGhlIGNvbW1hbmQgdG8gYmUgc2VudC5cbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBhY3R1YWwgb3V0cHV0IG9mIHRoZSBnaXZlbiBjb21tYW5kLlxuICovXG5tZXRob2RzLnNlbmRUZWxuZXRDb21tYW5kID0gYXN5bmMgZnVuY3Rpb24gc2VuZFRlbG5ldENvbW1hbmQgKGNvbW1hbmQpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY0VtdUNvbnNvbGVDb21tYW5kKGNvbW1hbmQsIHtwb3J0OiBhd2FpdCB0aGlzLmdldEVtdWxhdG9yUG9ydCgpfSk7XG59O1xuXG4vKipcbiAqIENoZWNrIHRoZSBzdGF0ZSBvZiBBaXJwbGFuZSBtb2RlIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIEFpcnBsYW5lIG1vZGUgaXMgZW5hYmxlZC5cbiAqL1xubWV0aG9kcy5pc0FpcnBsYW5lTW9kZU9uID0gYXN5bmMgZnVuY3Rpb24gaXNBaXJwbGFuZU1vZGVPbiAoKSB7XG4gIGxldCBzdGRvdXQgPSBhd2FpdCB0aGlzLmdldFNldHRpbmcoJ2dsb2JhbCcsICdhaXJwbGFuZV9tb2RlX29uJyk7XG4gIHJldHVybiBwYXJzZUludChzdGRvdXQsIDEwKSAhPT0gMDtcbn07XG5cbi8qKlxuICogQ2hhbmdlIHRoZSBzdGF0ZSBvZiBBaXJwbGFuZSBtb2RlIGluIFNldHRpbmdzIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG9uIC0gVHJ1ZSB0byBlbmFibGUgdGhlIEFpcnBsYW5lIG1vZGUgaW4gU2V0dGluZ3MgYW5kIGZhbHNlIHRvIGRpc2FibGUgaXQuXG4gKi9cbm1ldGhvZHMuc2V0QWlycGxhbmVNb2RlID0gYXN5bmMgZnVuY3Rpb24gc2V0QWlycGxhbmVNb2RlIChvbikge1xuICBhd2FpdCB0aGlzLnNldFNldHRpbmcoJ2dsb2JhbCcsICdhaXJwbGFuZV9tb2RlX29uJywgb24gPyAxIDogMCk7XG59O1xuXG4vKipcbiAqIEJyb2FkY2FzdCB0aGUgc3RhdGUgb2YgQWlycGxhbmUgbW9kZSBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHtAbGluayAjc2V0QWlycGxhbmVNb2RlfSwgb3RoZXJ3aXNlXG4gKiB0aGUgbW9kZSBjaGFuZ2UgaXMgbm90IGdvaW5nIHRvIGJlIGFwcGxpZWQgZm9yIHRoZSBkZXZpY2UuXG4gKlxuICogQHBhcmFtIHtib29sZWFufSBvbiAtIFRydWUgdG8gYnJvYWRjYXN0IGVuYWJsZSBhbmQgZmFsc2UgdG8gYnJvYWRjYXN0IGRpc2FibGUuXG4gKi9cbm1ldGhvZHMuYnJvYWRjYXN0QWlycGxhbmVNb2RlID0gYXN5bmMgZnVuY3Rpb24gYnJvYWRjYXN0QWlycGxhbmVNb2RlIChvbikge1xuICBhd2FpdCB0aGlzLnNoZWxsKFtcbiAgICAnYW0nLCAnYnJvYWRjYXN0JyxcbiAgICAnLWEnLCAnYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkFJUlBMQU5FX01PREUnLFxuICAgICctLWV6JywgJ3N0YXRlJywgb24gPyAndHJ1ZScgOiAnZmFsc2UnXG4gIF0pO1xufTtcblxuLyoqXG4gKiBDaGVjayB0aGUgc3RhdGUgb2YgV2lGaSBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBXaUZpIGlzIGVuYWJsZWQuXG4gKi9cbm1ldGhvZHMuaXNXaWZpT24gPSBhc3luYyBmdW5jdGlvbiBpc1dpZmlPbiAoKSB7XG4gIGxldCBzdGRvdXQgPSBhd2FpdCB0aGlzLmdldFNldHRpbmcoJ2dsb2JhbCcsICd3aWZpX29uJyk7XG4gIHJldHVybiAocGFyc2VJbnQoc3Rkb3V0LCAxMCkgIT09IDApO1xufTtcblxuLyoqXG4gKiBDaGVjayB0aGUgc3RhdGUgb2YgRGF0YSB0cmFuc2ZlciBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBEYXRhIHRyYW5zZmVyIGlzIGVuYWJsZWQuXG4gKi9cbm1ldGhvZHMuaXNEYXRhT24gPSBhc3luYyBmdW5jdGlvbiBpc0RhdGFPbiAoKSB7XG4gIGxldCBzdGRvdXQgPSBhd2FpdCB0aGlzLmdldFNldHRpbmcoJ2dsb2JhbCcsICdtb2JpbGVfZGF0YScpO1xuICByZXR1cm4gKHBhcnNlSW50KHN0ZG91dCwgMTApICE9PSAwKTtcbn07XG5cbi8qKlxuICogQ2hhbmdlIHRoZSBzdGF0ZSBvZiBXaUZpIGFuZC9vciBEYXRhIHRyYW5zZmVyIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHdpZmkgLSBUcnVlIHRvIGVuYWJsZSBhbmQgZmFsc2UgdG8gZGlzYWJsZSBXaUZpLlxuICogQHBhcmFtIHtib29sZWFufSBkYXRhIC0gVHJ1ZSB0byBlbmFibGUgYW5kIGZhbHNlIHRvIGRpc2FibGUgRGF0YSB0cmFuc2Zlci5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNFbXVsYXRvciBbZmFsc2VdIC0gU2V0IGl0IHRvIHRydWUgaWYgdGhlIGRldmljZSB1bmRlciB0ZXN0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGFuIGVtdWxhdG9yIHJhdGhlciB0aGFuIGEgcmVhbCBkZXZpY2UuXG4gKi9cbm1ldGhvZHMuc2V0V2lmaUFuZERhdGEgPSBhc3luYyBmdW5jdGlvbiBzZXRXaWZpQW5kRGF0YSAoe3dpZmksIGRhdGF9LCBpc0VtdWxhdG9yID0gZmFsc2UpIHtcbiAgaWYgKHV0aWwuaGFzVmFsdWUod2lmaSkpIHtcbiAgICBhd2FpdCB0aGlzLnNldFdpZmlTdGF0ZSh3aWZpLCBpc0VtdWxhdG9yKTtcbiAgfVxuICBpZiAodXRpbC5oYXNWYWx1ZShkYXRhKSkge1xuICAgIGF3YWl0IHRoaXMuc2V0RGF0YVN0YXRlKGRhdGEsIGlzRW11bGF0b3IpO1xuICB9XG59O1xuXG4vKipcbiAqIENoZWNrIHRoZSBzdGF0ZSBvZiBhbmltYXRpb24gb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYXQgbGVhc3Qgb25lIG9mIGFuaW1hdGlvbiBzY2FsZSBzZXR0aW5nc1xuICogICAgICAgICAgICAgICAgICAgaXMgbm90IGVxdWFsIHRvICcwLjAnLlxuICovXG5tZXRob2RzLmlzQW5pbWF0aW9uT24gPSBhc3luYyBmdW5jdGlvbiBpc0FuaW1hdGlvbk9uICgpIHtcbiAgbGV0IGFuaW1hdG9yX2R1cmF0aW9uX3NjYWxlID0gYXdhaXQgdGhpcy5nZXRTZXR0aW5nKCdnbG9iYWwnLCAnYW5pbWF0b3JfZHVyYXRpb25fc2NhbGUnKTtcbiAgbGV0IHRyYW5zaXRpb25fYW5pbWF0aW9uX3NjYWxlID0gYXdhaXQgdGhpcy5nZXRTZXR0aW5nKCdnbG9iYWwnLCAndHJhbnNpdGlvbl9hbmltYXRpb25fc2NhbGUnKTtcbiAgbGV0IHdpbmRvd19hbmltYXRpb25fc2NhbGUgPSBhd2FpdCB0aGlzLmdldFNldHRpbmcoJ2dsb2JhbCcsICd3aW5kb3dfYW5pbWF0aW9uX3NjYWxlJyk7XG4gIHJldHVybiBfLnNvbWUoW2FuaW1hdG9yX2R1cmF0aW9uX3NjYWxlLCB0cmFuc2l0aW9uX2FuaW1hdGlvbl9zY2FsZSwgd2luZG93X2FuaW1hdGlvbl9zY2FsZV0sXG4gICAgICAgICAgICAgICAgKHNldHRpbmcpID0+IHNldHRpbmcgIT09ICcwLjAnKTtcbn07XG5cbi8qKlxuICogRm9yY2VmdWxseSByZWN1cnNpdmVseSByZW1vdmUgYSBwYXRoIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqIEJlIGNhcmVmdWwgd2hpbGUgY2FsbGluZyB0aGlzIG1ldGhvZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFRoZSBwYXRoIHRvIGJlIHJlbW92ZWQgcmVjdXJzaXZlbHkuXG4gKi9cbm1ldGhvZHMucmltcmFmID0gYXN5bmMgZnVuY3Rpb24gcmltcmFmIChwYXRoKSB7XG4gIGF3YWl0IHRoaXMuc2hlbGwoWydybScsICctcmYnLCBwYXRoXSk7XG59O1xuXG4vKipcbiAqIFNlbmQgYSBmaWxlIHRvIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbG9jYWxQYXRoIC0gVGhlIHBhdGggdG8gdGhlIGZpbGUgb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVBhdGggLSBUaGUgZGVzdGluYXRpb24gcGF0aCBvbiB0aGUgcmVtb3RlIGRldmljZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzIC0gQWRkaXRpb25hbCBvcHRpb25zIG1hcHBpbmcuIFNlZVxuICogICAgICAgICAgICAgICAgICAgICAgICBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL25vZGUtdGVlbl9wcm9jZXNzLFxuICogICAgICAgICAgICAgICAgICAgICAgICBfZXhlY18gbWV0aG9kIG9wdGlvbnMsIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGF2YWlsYWJsZVxuICogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLlxuICovXG5tZXRob2RzLnB1c2ggPSBhc3luYyBmdW5jdGlvbiBwdXNoIChsb2NhbFBhdGgsIHJlbW90ZVBhdGgsIG9wdHMpIHtcbiAgYXdhaXQgdGhpcy5ta2RpcihwYXRoLnBvc2l4LmRpcm5hbWUocmVtb3RlUGF0aCkpO1xuICBhd2FpdCB0aGlzLmFkYkV4ZWMoWydwdXNoJywgbG9jYWxQYXRoLCByZW1vdGVQYXRoXSwgb3B0cyk7XG59O1xuXG4vKipcbiAqIFJlY2VpdmUgYSBmaWxlIGZyb20gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByZW1vdGVQYXRoIC0gVGhlIHNvdXJjZSBwYXRoIG9uIHRoZSByZW1vdGUgZGV2aWNlLlxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2FsUGF0aCAtIFRoZSBkZXN0aW5hdGlvbiBwYXRoIHRvIHRoZSBmaWxlIG9uIHRoZSBsb2NhbCBmaWxlIHN5c3RlbS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzIC0gQWRkaXRpb25hbCBvcHRpb25zIG1hcHBpbmcuIFNlZVxuICogICAgICAgICAgICAgICAgICAgICAgICBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL25vZGUtdGVlbl9wcm9jZXNzLFxuICogICAgICAgICAgICAgICAgICAgICAgICBfZXhlY18gbWV0aG9kIG9wdGlvbnMsIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGF2YWlsYWJsZVxuICogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLlxuICovXG5tZXRob2RzLnB1bGwgPSBhc3luYyBmdW5jdGlvbiBwdWxsIChyZW1vdGVQYXRoLCBsb2NhbFBhdGgsIG9wdHMgPSB7fSkge1xuICAvLyBwdWxsIGZvbGRlciBjYW4gdGFrZSBtb3JlIHRpbWUsIGluY3JlYXNpbmcgdGltZSBvdXQgdG8gNjAgc2Vjc1xuICBhd2FpdCB0aGlzLmFkYkV4ZWMoWydwdWxsJywgcmVtb3RlUGF0aCwgbG9jYWxQYXRoXSwgey4uLm9wdHMsIHRpbWVvdXQ6IG9wdHMudGltZW91dCA/PyA2MDAwMH0pO1xufTtcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBwcm9jZXNzIHdpdGggdGhlIHBhcnRpY3VsYXIgbmFtZSBpcyBydW5uaW5nIG9uIHRoZSBkZXZpY2VcbiAqIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHByb2Nlc3NOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb2Nlc3MgdG8gYmUgY2hlY2tlZC5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGdpdmVuIHByb2Nlc3MgaXMgcnVubmluZy5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgZ2l2ZW4gcHJvY2VzcyBuYW1lIGlzIG5vdCBhIHZhbGlkIGNsYXNzIG5hbWUuXG4gKi9cbm1ldGhvZHMucHJvY2Vzc0V4aXN0cyA9IGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NFeGlzdHMgKHByb2Nlc3NOYW1lKSB7XG4gIHJldHVybiAhXy5pc0VtcHR5KGF3YWl0IHRoaXMuZ2V0UElEc0J5TmFtZShwcm9jZXNzTmFtZSkpO1xufTtcblxuLyoqXG4gKiBHZXQgVENQIHBvcnQgZm9yd2FyZGluZyB3aXRoIGFkYiBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKiBAcmV0dXJuIHtBcnJheS48U3RyaW5nPn0gVGhlIG91dHB1dCBvZiB0aGUgY29ycmVzcG9uZGluZyBhZGIgY29tbWFuZC4gQW4gYXJyYXkgY29udGFpbnMgZWFjaCBmb3J3YXJkaW5nIGxpbmUgb2Ygb3V0cHV0XG4gKi9cbm1ldGhvZHMuZ2V0Rm9yd2FyZExpc3QgPSBhc3luYyBmdW5jdGlvbiBnZXRGb3J3YXJkTGlzdCAoKSB7XG4gIGxvZy5kZWJ1ZyhgTGlzdCBmb3J3YXJkaW5nIHBvcnRzYCk7XG4gIGNvbnN0IGNvbm5lY3Rpb25zID0gYXdhaXQgdGhpcy5hZGJFeGVjKFsnZm9yd2FyZCcsICctLWxpc3QnXSk7XG4gIHJldHVybiBjb25uZWN0aW9ucy5zcGxpdChFT0wpLmZpbHRlcigobGluZSkgPT4gQm9vbGVhbihsaW5lLnRyaW0oKSkpO1xufTtcblxuLyoqXG4gKiBTZXR1cCBUQ1AgcG9ydCBmb3J3YXJkaW5nIHdpdGggYWRiIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHN5c3RlbVBvcnQgLSBUaGUgbnVtYmVyIG9mIHRoZSBsb2NhbCBzeXN0ZW0gcG9ydC5cbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gZGV2aWNlUG9ydCAtIFRoZSBudW1iZXIgb2YgdGhlIHJlbW90ZSBkZXZpY2UgcG9ydC5cbiAqL1xubWV0aG9kcy5mb3J3YXJkUG9ydCA9IGFzeW5jIGZ1bmN0aW9uIGZvcndhcmRQb3J0IChzeXN0ZW1Qb3J0LCBkZXZpY2VQb3J0KSB7XG4gIGxvZy5kZWJ1ZyhgRm9yd2FyZGluZyBzeXN0ZW06ICR7c3lzdGVtUG9ydH0gdG8gZGV2aWNlOiAke2RldmljZVBvcnR9YCk7XG4gIGF3YWl0IHRoaXMuYWRiRXhlYyhbJ2ZvcndhcmQnLCBgdGNwOiR7c3lzdGVtUG9ydH1gLCBgdGNwOiR7ZGV2aWNlUG9ydH1gXSk7XG59O1xuXG4vKipcbiAqIFJlbW92ZSBUQ1AgcG9ydCBmb3J3YXJkaW5nIHdpdGggYWRiIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC4gVGhlIGZvcndhcmRpbmdcbiAqIGZvciB0aGUgZ2l2ZW4gcG9ydCBzaG91bGQgYmUgc2V0dXAgd2l0aCB7QGxpbmsgI2ZvcndhcmRQb3J0fSBmaXJzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHN5c3RlbVBvcnQgLSBUaGUgbnVtYmVyIG9mIHRoZSBsb2NhbCBzeXN0ZW0gcG9ydFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gcmVtb3ZlIGZvcndhcmRpbmcgb24uXG4gKi9cbm1ldGhvZHMucmVtb3ZlUG9ydEZvcndhcmQgPSBhc3luYyBmdW5jdGlvbiByZW1vdmVQb3J0Rm9yd2FyZCAoc3lzdGVtUG9ydCkge1xuICBsb2cuZGVidWcoYFJlbW92aW5nIGZvcndhcmRlZCBwb3J0IHNvY2tldCBjb25uZWN0aW9uOiAke3N5c3RlbVBvcnR9IGApO1xuICBhd2FpdCB0aGlzLmFkYkV4ZWMoWydmb3J3YXJkJywgYC0tcmVtb3ZlYCwgYHRjcDoke3N5c3RlbVBvcnR9YF0pO1xufTtcblxuLyoqXG4gKiBHZXQgVENQIHBvcnQgZm9yd2FyZGluZyB3aXRoIGFkYiBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKiBAcmV0dXJuIHtBcnJheS48U3RyaW5nPn0gVGhlIG91dHB1dCBvZiB0aGUgY29ycmVzcG9uZGluZyBhZGIgY29tbWFuZC4gQW4gYXJyYXkgY29udGFpbnMgZWFjaCBmb3J3YXJkaW5nIGxpbmUgb2Ygb3V0cHV0XG4gKi9cbm1ldGhvZHMuZ2V0UmV2ZXJzZUxpc3QgPSBhc3luYyBmdW5jdGlvbiBnZXRSZXZlcnNlTGlzdCAoKSB7XG4gIGxvZy5kZWJ1ZyhgTGlzdCByZXZlcnNlIGZvcndhcmRpbmcgcG9ydHNgKTtcbiAgY29uc3QgY29ubmVjdGlvbnMgPSBhd2FpdCB0aGlzLmFkYkV4ZWMoWydyZXZlcnNlJywgJy0tbGlzdCddKTtcbiAgcmV0dXJuIGNvbm5lY3Rpb25zLnNwbGl0KEVPTCkuZmlsdGVyKChsaW5lKSA9PiBCb29sZWFuKGxpbmUudHJpbSgpKSk7XG59O1xuXG4vKipcbiAqIFNldHVwIFRDUCBwb3J0IGZvcndhcmRpbmcgd2l0aCBhZGIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICogT25seSBhdmFpbGFibGUgZm9yIEFQSSAyMSsuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBkZXZpY2VQb3J0IC0gVGhlIG51bWJlciBvZiB0aGUgcmVtb3RlIGRldmljZSBwb3J0LlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBzeXN0ZW1Qb3J0IC0gVGhlIG51bWJlciBvZiB0aGUgbG9jYWwgc3lzdGVtIHBvcnQuXG4gKi9cbm1ldGhvZHMucmV2ZXJzZVBvcnQgPSBhc3luYyBmdW5jdGlvbiByZXZlcnNlUG9ydCAoZGV2aWNlUG9ydCwgc3lzdGVtUG9ydCkge1xuICBsb2cuZGVidWcoYEZvcndhcmRpbmcgZGV2aWNlOiAke2RldmljZVBvcnR9IHRvIHN5c3RlbTogJHtzeXN0ZW1Qb3J0fWApO1xuICBhd2FpdCB0aGlzLmFkYkV4ZWMoWydyZXZlcnNlJywgYHRjcDoke2RldmljZVBvcnR9YCwgYHRjcDoke3N5c3RlbVBvcnR9YF0pO1xufTtcblxuLyoqXG4gKiBSZW1vdmUgVENQIHBvcnQgZm9yd2FyZGluZyB3aXRoIGFkYiBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuIFRoZSBmb3J3YXJkaW5nXG4gKiBmb3IgdGhlIGdpdmVuIHBvcnQgc2hvdWxkIGJlIHNldHVwIHdpdGgge0BsaW5rICNmb3J3YXJkUG9ydH0gZmlyc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBkZXZpY2VQb3J0IC0gVGhlIG51bWJlciBvZiB0aGUgcmVtb3RlIGRldmljZSBwb3J0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byByZW1vdmUgZm9yd2FyZGluZyBvbi5cbiAqL1xubWV0aG9kcy5yZW1vdmVQb3J0UmV2ZXJzZSA9IGFzeW5jIGZ1bmN0aW9uIHJlbW92ZVBvcnRSZXZlcnNlIChkZXZpY2VQb3J0KSB7XG4gIGxvZy5kZWJ1ZyhgUmVtb3ZpbmcgcmV2ZXJzZSBmb3J3YXJkZWQgcG9ydCBzb2NrZXQgY29ubmVjdGlvbjogJHtkZXZpY2VQb3J0fSBgKTtcbiAgYXdhaXQgdGhpcy5hZGJFeGVjKFsncmV2ZXJzZScsIGAtLXJlbW92ZWAsIGB0Y3A6JHtkZXZpY2VQb3J0fWBdKTtcbn07XG5cbi8qKlxuICogU2V0dXAgVENQIHBvcnQgZm9yd2FyZGluZyB3aXRoIGFkYiBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuIFRoZSBkaWZmZXJlbmNlXG4gKiBiZXR3ZWVuIHtAbGluayAjZm9yd2FyZFBvcnR9IGlzIHRoYXQgdGhpcyBtZXRob2QgZG9lcyBzZXR1cCBmb3IgYW4gYWJzdHJhY3RcbiAqIGxvY2FsIHBvcnQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBzeXN0ZW1Qb3J0IC0gVGhlIG51bWJlciBvZiB0aGUgbG9jYWwgc3lzdGVtIHBvcnQuXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGRldmljZVBvcnQgLSBUaGUgbnVtYmVyIG9mIHRoZSByZW1vdGUgZGV2aWNlIHBvcnQuXG4gKi9cbm1ldGhvZHMuZm9yd2FyZEFic3RyYWN0UG9ydCA9IGFzeW5jIGZ1bmN0aW9uIGZvcndhcmRBYnN0cmFjdFBvcnQgKHN5c3RlbVBvcnQsIGRldmljZVBvcnQpIHtcbiAgbG9nLmRlYnVnKGBGb3J3YXJkaW5nIHN5c3RlbTogJHtzeXN0ZW1Qb3J0fSB0byBhYnN0cmFjdCBkZXZpY2U6ICR7ZGV2aWNlUG9ydH1gKTtcbiAgYXdhaXQgdGhpcy5hZGJFeGVjKFsnZm9yd2FyZCcsIGB0Y3A6JHtzeXN0ZW1Qb3J0fWAsIGBsb2NhbGFic3RyYWN0OiR7ZGV2aWNlUG9ydH1gXSk7XG59O1xuXG4vKipcbiAqIEV4ZWN1dGUgcGluZyBzaGVsbCBjb21tYW5kIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBjb21tYW5kIG91dHB1dCBjb250YWlucyAncGluZycgc3Vic3RyaW5nLlxuICogQHRocm93cyB7ZXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBleGVjdXRpbmcgJ3BpbmcnIGNvbW1hbmQgb24gdGhlXG4gKiAgICAgICAgICAgICAgICAgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbm1ldGhvZHMucGluZyA9IGFzeW5jIGZ1bmN0aW9uIHBpbmcgKCkge1xuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5zaGVsbChbJ2VjaG8nLCAncGluZyddKTtcbiAgaWYgKHN0ZG91dC5pbmRleE9mKCdwaW5nJykgPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYEFEQiBwaW5nIGZhaWxlZCwgcmV0dXJuZWQgJHtzdGRvdXR9YCk7XG59O1xuXG4vKipcbiAqIFJlc3RhcnQgdGhlIGRldmljZSB1bmRlciB0ZXN0IHVzaW5nIGFkYiBjb21tYW5kcy5cbiAqXG4gKiBAdGhyb3dzIHtlcnJvcn0gSWYgc3RhcnQgZmFpbHMuXG4gKi9cbm1ldGhvZHMucmVzdGFydCA9IGFzeW5jIGZ1bmN0aW9uIHJlc3RhcnQgKCkge1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuc3RvcExvZ2NhdCgpO1xuICAgIGF3YWl0IHRoaXMucmVzdGFydEFkYigpO1xuICAgIGF3YWl0IHRoaXMud2FpdEZvckRldmljZSg2MCk7XG4gICAgYXdhaXQgdGhpcy5zdGFydExvZ2NhdCh0aGlzLl9sb2djYXRTdGFydHVwUGFyYW1zKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgUmVzdGFydCBmYWlsZWQuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBMb2djYXRPcHRzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZm9ybWF0IFRoZSBsb2cgcHJpbnQgZm9ybWF0LCB3aGVyZSA8Zm9ybWF0PiBpcyBvbmUgb2Y6XG4gKiAgIGJyaWVmIHByb2Nlc3MgdGFnIHRocmVhZCByYXcgdGltZSB0aHJlYWR0aW1lIGxvbmdcbiAqIGB0aHJlYWR0aW1lYCBpcyB0aGUgZGVmYXVsdCB2YWx1ZS5cbiAqIEBwcm9wZXJ0eSB7QXJyYXk8c3RyaW5nPn0gZmlsdGVyU3BlY3MgU2VyaWVzIG9mIDx0YWc+Wzpwcmlvcml0eV1cbiAqIHdoZXJlIDx0YWc+IGlzIGEgbG9nIGNvbXBvbmVudCB0YWcgKG9yICogZm9yIGFsbCkgYW5kIHByaW9yaXR5IGlzOlxuICogIFYgICAgVmVyYm9zZVxuICogIEQgICAgRGVidWdcbiAqICBJICAgIEluZm9cbiAqICBXICAgIFdhcm5cbiAqICBFICAgIEVycm9yXG4gKiAgRiAgICBGYXRhbFxuICogIFMgICAgU2lsZW50IChzdXByZXNzIGFsbCBvdXRwdXQpXG4gKlxuICogJyonIG1lYW5zICcqOmQnIGFuZCA8dGFnPiBieSBpdHNlbGYgbWVhbnMgPHRhZz46dlxuICpcbiAqIElmIG5vdCBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmRsaW5lLCBmaWx0ZXJzcGVjIGlzIHNldCBmcm9tIEFORFJPSURfTE9HX1RBR1MuXG4gKiBJZiBubyBmaWx0ZXJzcGVjIGlzIGZvdW5kLCBmaWx0ZXIgZGVmYXVsdHMgdG8gJyo6SSdcbiAqL1xuXG4vKipcbiAqIFN0YXJ0IHRoZSBsb2djYXQgcHJvY2VzcyB0byBnYXRoZXIgbG9ncy5cbiAqXG4gKiBAcGFyYW0gez9Mb2djYXRPcHRzfSBvcHRzXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgcmVzdGFydCBmYWlscy5cbiAqL1xubWV0aG9kcy5zdGFydExvZ2NhdCA9IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0TG9nY2F0IChvcHRzID0ge30pIHtcbiAgaWYgKCFfLmlzRW1wdHkodGhpcy5sb2djYXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiVHJ5aW5nIHRvIHN0YXJ0IGxvZ2NhdCBjYXB0dXJlIGJ1dCBpdCdzIGFscmVhZHkgc3RhcnRlZCFcIik7XG4gIH1cblxuICB0aGlzLmxvZ2NhdCA9IG5ldyBMb2djYXQoe1xuICAgIGFkYjogdGhpcy5leGVjdXRhYmxlLFxuICAgIGRlYnVnOiBmYWxzZSxcbiAgICBkZWJ1Z1RyYWNlOiBmYWxzZSxcbiAgICBjbGVhckRldmljZUxvZ3NPblN0YXJ0OiAhIXRoaXMuY2xlYXJEZXZpY2VMb2dzT25TdGFydCxcbiAgfSk7XG4gIGF3YWl0IHRoaXMubG9nY2F0LnN0YXJ0Q2FwdHVyZShvcHRzKTtcbiAgdGhpcy5fbG9nY2F0U3RhcnR1cFBhcmFtcyA9IG9wdHM7XG59O1xuXG4vKipcbiAqIFN0b3AgdGhlIGFjdGl2ZSBsb2djYXQgcHJvY2VzcyB3aGljaCBnYXRoZXJzIGxvZ3MuXG4gKiBUaGUgY2FsbCB3aWxsIGJlIGlnbm9yZWQgaWYgbm8gbG9nY2F0IHByb2Nlc3MgaXMgcnVubmluZy5cbiAqL1xubWV0aG9kcy5zdG9wTG9nY2F0ID0gYXN5bmMgZnVuY3Rpb24gc3RvcExvZ2NhdCAoKSB7XG4gIGlmIChfLmlzRW1wdHkodGhpcy5sb2djYXQpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5sb2djYXQuc3RvcENhcHR1cmUoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICB0aGlzLmxvZ2NhdCA9IG51bGw7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIG91dHB1dCBmcm9tIHRoZSBjdXJyZW50bHkgcnVubmluZyBsb2djYXQgcHJvY2Vzcy5cbiAqIFRoZSBsb2djYXQgcHJvY2VzcyBzaG91bGQgYmUgZXhlY3V0ZWQgYnkgezJsaW5rICNzdGFydExvZ2NhdH0gbWV0aG9kLlxuICpcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGNvbGxlY3RlZCBsb2djYXQgb3V0cHV0LlxuICogQHRocm93cyB7RXJyb3J9IElmIGxvZ2NhdCBwcm9jZXNzIGlzIG5vdCBydW5uaW5nLlxuICovXG5tZXRob2RzLmdldExvZ2NhdExvZ3MgPSBmdW5jdGlvbiBnZXRMb2djYXRMb2dzICgpIHtcbiAgaWYgKF8uaXNFbXB0eSh0aGlzLmxvZ2NhdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBnZXQgbG9nY2F0IGxvZ3Mgc2luY2UgbG9nY2F0IGhhc24ndCBzdGFydGVkXCIpO1xuICB9XG4gIHJldHVybiB0aGlzLmxvZ2NhdC5nZXRMb2dzKCk7XG59O1xuXG4vKipcbiAqIFNldCB0aGUgY2FsbGJhY2sgZm9yIHRoZSBsb2djYXQgb3V0cHV0IGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIC0gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLCB3aGljaCBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVGhlIGFyZ3VtZW50IGlzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgbG9nIHJlY29yZCBvYmplY3Qgd2l0aCBgdGltZXN0YW1wYCwgYGxldmVsYCBhbmQgYG1lc3NhZ2VgIHByb3BlcnRpZXMuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgbG9nY2F0IHByb2Nlc3MgaXMgbm90IHJ1bm5pbmcuXG4gKi9cbm1ldGhvZHMuc2V0TG9nY2F0TGlzdGVuZXIgPSBmdW5jdGlvbiBzZXRMb2djYXRMaXN0ZW5lciAobGlzdGVuZXIpIHtcbiAgaWYgKF8uaXNFbXB0eSh0aGlzLmxvZ2NhdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJMb2djYXQgcHJvY2VzcyBoYXNuJ3QgYmVlbiBzdGFydGVkXCIpO1xuICB9XG4gIHRoaXMubG9nY2F0Lm9uKCdvdXRwdXQnLCBsaXN0ZW5lcik7XG59O1xuXG4vKipcbiAqIFJlbW92ZXMgdGhlIHByZXZpb3VzbHkgc2V0IGNhbGxiYWNrIGZvciB0aGUgbG9nY2F0IG91dHB1dCBldmVudC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciAtIFRoZSBsaXN0ZW5lciBmdW5jdGlvbiwgd2hpY2ggaGFzIGJlZW4gcHJldmlvdXNseVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgdG8gYHNldExvZ2NhdExpc3RlbmVyYFxuICogQHRocm93cyB7RXJyb3J9IElmIGxvZ2NhdCBwcm9jZXNzIGlzIG5vdCBydW5uaW5nLlxuICovXG5tZXRob2RzLnJlbW92ZUxvZ2NhdExpc3RlbmVyID0gZnVuY3Rpb24gcmVtb3ZlTG9nY2F0TGlzdGVuZXIgKGxpc3RlbmVyKSB7XG4gIGlmIChfLmlzRW1wdHkodGhpcy5sb2djYXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTG9nY2F0IHByb2Nlc3MgaGFzbid0IGJlZW4gc3RhcnRlZFwiKTtcbiAgfVxuICB0aGlzLmxvZ2NhdC5yZW1vdmVMaXN0ZW5lcignb3V0cHV0JywgbGlzdGVuZXIpO1xufTtcblxuLyoqXG4gKiBBdCBzb21lIHBvaW50IG9mIHRpbWUgR29vZ2xlIGhhcyBjaGFuZ2VkIHRoZSBkZWZhdWx0IGBwc2AgYmVoYXZpb3VyLCBzbyBpdCBvbmx5XG4gKiBsaXN0cyBwcm9jZXNzZXMgdGhhdCBiZWxvbmcgdG8gdGhlIGN1cnJlbnQgc2hlbGwgdXNlciByYXRoZXIgdG8gYWxsXG4gKiB1c2Vycy4gSXQgaXMgbmVjZXNzYXJ5IHRvIGV4ZWN1dGUgcHMgd2l0aCAtQSBjb21tYW5kIGxpbmUgYXJndW1lbnRcbiAqIHRvIG1pbWljIHRoZSBwcmV2aW91cyBiZWhhdmlvdXIuXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gdGhlIG91dHB1dCBvZiBgcHNgIGNvbW1hbmQgd2hlcmUgYWxsIHByb2Nlc3NlcyBhcmUgaW5jbHVkZWRcbiAqL1xubWV0aG9kcy5saXN0UHJvY2Vzc1N0YXR1cyA9IGFzeW5jIGZ1bmN0aW9uIGxpc3RQcm9jZXNzU3RhdHVzICgpIHtcbiAgaWYgKCFfLmlzQm9vbGVhbih0aGlzLl9kb2VzUHNTdXBwb3J0QU9wdGlvbikpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5fZG9lc1BzU3VwcG9ydEFPcHRpb24gPSAvXi1BXFxiL20udGVzdChhd2FpdCB0aGlzLnNoZWxsKFsncHMnLCAnLS1oZWxwJ10pKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2cuZGVidWcoZS5zdGFjayk7XG4gICAgICB0aGlzLl9kb2VzUHNTdXBwb3J0QU9wdGlvbiA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYXdhaXQgdGhpcy5zaGVsbCh0aGlzLl9kb2VzUHNTdXBwb3J0QU9wdGlvbiA/IFsncHMnLCAnLUEnXSA6IFsncHMnXSk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgcHJvY2VzcyBuYW1lIGZvciB0aGUgZ2l2ZW4gcHJvY2VzcyBpZGVudGlmaWVyXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBwaWQgLSBUaGUgdmFsaWQgcHJvY2VzcyBpZGVudGlmaWVyXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGdpdmVuIFBJRCBpcyBlaXRoZXIgaW52YWxpZCBvciBpcyBub3QgcHJlc2VudFxuICogaW4gdGhlIGFjdGl2ZSBwcm9jZXNzZXMgbGlzdFxuICogQHJldHVybnMge3N0cmluZ30gVGhlIHByb2Nlc3MgbmFtZVxuICovXG5tZXRob2RzLmdldE5hbWVCeVBpZCA9IGFzeW5jIGZ1bmN0aW9uIGdldE5hbWVCeVBpZCAocGlkKSB7XG4gIGlmIChpc05hTihwaWQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgUElEIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBudW1iZXIuICcke3BpZH0nIGlzIGdpdmVuIGluc3RlYWRgKTtcbiAgfVxuICBwaWQgPSBwYXJzZUludChwaWQsIDEwKTtcblxuICBjb25zdCBzdGRvdXQgPSBhd2FpdCB0aGlzLmxpc3RQcm9jZXNzU3RhdHVzKCk7XG4gIGNvbnN0IHRpdGxlTWF0Y2ggPSBQU19USVRMRV9QQVRURVJOLmV4ZWMoc3Rkb3V0KTtcbiAgaWYgKCF0aXRsZU1hdGNoKSB7XG4gICAgbG9nLmRlYnVnKHN0ZG91dCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZ2V0IHRoZSBwcm9jZXNzIG5hbWUgZm9yIFBJRCAnJHtwaWR9J2ApO1xuICB9XG4gIGNvbnN0IGFsbFRpdGxlcyA9IHRpdGxlTWF0Y2hbMV0udHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gIGNvbnN0IHBpZEluZGV4ID0gYWxsVGl0bGVzLmluZGV4T2YoUElEX0NPTFVNTl9USVRMRSk7XG4gIC8vIGl0IG1pZ2h0IG5vdCBiZSBzdGFibGUgdG8gdGFrZSBOQU1FIGJ5IGluZGV4LCBiZWNhdXNlIGRlcGVuZGluZyBvbiB0aGVcbiAgLy8gYWN0dWFsIFNESyB0aGUgcHMgb3V0cHV0IG1pZ2h0IG5vdCBjb250YWluIGFuIGFiYnJldmlhdGlvbiBmb3IgdGhlIFMgZmxhZzpcbiAgLy8gVVNFUiAgICAgUElEICAgUFBJRCAgVlNJWkUgIFJTUyAgICAgV0NIQU4gICAgUEMgICAgICAgIE5BTUVcbiAgLy8gVVNFUiAgICAgUElEICAgUFBJRCAgVlNJWkUgIFJTUyAgICAgV0NIQU4gICAgUEMgICBTICAgIE5BTUVcbiAgY29uc3QgbmFtZU9mZnNldCA9IGFsbFRpdGxlcy5pbmRleE9mKFBST0NFU1NfTkFNRV9DT0xVTU5fVElUTEUpIC0gYWxsVGl0bGVzLmxlbmd0aDtcbiAgY29uc3QgcGlkUmVnZXggPSBuZXcgUmVnRXhwKGBeKC4qXFxcXGIke3BpZH1cXFxcYi4qKSRgLCAnZ20nKTtcbiAgbGV0IG1hdGNoZWRMaW5lO1xuICB3aGlsZSAoKG1hdGNoZWRMaW5lID0gcGlkUmVnZXguZXhlYyhzdGRvdXQpKSkge1xuICAgIGNvbnN0IGl0ZW1zID0gbWF0Y2hlZExpbmVbMV0udHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgaWYgKHBhcnNlSW50KGl0ZW1zW3BpZEluZGV4XSwgMTApID09PSBwaWQgJiYgaXRlbXNbaXRlbXMubGVuZ3RoICsgbmFtZU9mZnNldF0pIHtcbiAgICAgIHJldHVybiBpdGVtc1tpdGVtcy5sZW5ndGggKyBuYW1lT2Zmc2V0XTtcbiAgICB9XG4gIH1cbiAgbG9nLmRlYnVnKHN0ZG91dCk7XG4gIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGdldCB0aGUgcHJvY2VzcyBuYW1lIGZvciBQSUQgJyR7cGlkfSdgKTtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBsaXN0IG9mIHByb2Nlc3MgaWRzIGZvciB0aGUgcGFydGljdWxhciBwcm9jZXNzIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBwYXJ0IG9mIHByb2Nlc3MgbmFtZS5cbiAqIEByZXR1cm4ge0FycmF5LjxudW1iZXI+fSBUaGUgbGlzdCBvZiBtYXRjaGVkIHByb2Nlc3MgSURzIG9yIGFuIGVtcHR5IGxpc3QuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHBhc3NlZCBwcm9jZXNzIG5hbWUgaXMgbm90IGEgdmFsaWQgb25lXG4gKi9cbm1ldGhvZHMuZ2V0UElEc0J5TmFtZSA9IGFzeW5jIGZ1bmN0aW9uIGdldFBJRHNCeU5hbWUgKG5hbWUpIHtcbiAgbG9nLmRlYnVnKGBHZXR0aW5nIElEcyBvZiBhbGwgJyR7bmFtZX0nIHByb2Nlc3Nlc2ApO1xuICBpZiAoIXRoaXMuaXNWYWxpZENsYXNzKG5hbWUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHByb2Nlc3MgbmFtZTogJyR7bmFtZX0nYCk7XG4gIH1cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzEzNTY3XG4gIGlmIChhd2FpdCB0aGlzLmdldEFwaUxldmVsKCkgPj0gMjMpIHtcbiAgICBpZiAoIV8uaXNCb29sZWFuKHRoaXMuX2lzUGdyZXBBdmFpbGFibGUpKSB7XG4gICAgICAvLyBwZ3JlcCBpcyBpbiBwcmlvcml0eSwgc2luY2UgcGlkb2YgaGFzIGJlZW4gcmVwb3J0ZWQgb2YgaGF2aW5nIGJ1Z3Mgb24gc29tZSBwbGF0Zm9ybXNcbiAgICAgIGNvbnN0IHBncmVwT3V0cHV0ID0gXy50cmltKGF3YWl0IHRoaXMuc2hlbGwoWydwZ3JlcCAtLWhlbHA7IGVjaG8gJD8nXSkpO1xuICAgICAgdGhpcy5faXNQZ3JlcEF2YWlsYWJsZSA9IHBhcnNlSW50KF8ubGFzdChwZ3JlcE91dHB1dC5zcGxpdCgvXFxzKy8pKSwgMTApID09PSAwO1xuICAgICAgaWYgKHRoaXMuX2lzUGdyZXBBdmFpbGFibGUpIHtcbiAgICAgICAgdGhpcy5fY2FuUGdyZXBVc2VGdWxsQ21kTGluZVNlYXJjaCA9IC9eLWZcXGIvbS50ZXN0KHBncmVwT3V0cHV0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2lzUGlkb2ZBdmFpbGFibGUgPSBwYXJzZUludChhd2FpdCB0aGlzLnNoZWxsKFsncGlkb2YgLS1oZWxwID4gL2Rldi9udWxsOyBlY2hvICQ/J10pLCAxMCkgPT09IDA7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLl9pc1BncmVwQXZhaWxhYmxlIHx8IHRoaXMuX2lzUGlkb2ZBdmFpbGFibGUpIHtcbiAgICAgIGNvbnN0IHNoZWxsQ29tbWFuZCA9IHRoaXMuX2lzUGdyZXBBdmFpbGFibGVcbiAgICAgICAgPyAodGhpcy5fY2FuUGdyZXBVc2VGdWxsQ21kTGluZVNlYXJjaFxuICAgICAgICAgID8gWydwZ3JlcCcsICctZicsIF8uZXNjYXBlUmVnRXhwKGAoW1s6Ymxhbms6XV18Xikke25hbWV9KFtbOmJsYW5rOl1dfCQpYCldXG4gICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzEzODcyXG4gICAgICAgICAgOiBbYHBncmVwIF4ke18uZXNjYXBlUmVnRXhwKG5hbWUuc2xpY2UoLU1BWF9QR1JFUF9QQVRURVJOX0xFTikpfSQgYCArXG4gICAgICAgICAgICAgIGB8fCBwZ3JlcCBeJHtfLmVzY2FwZVJlZ0V4cChuYW1lLnNsaWNlKDAsIE1BWF9QR1JFUF9QQVRURVJOX0xFTikpfSRgXSlcbiAgICAgICAgOiBbJ3BpZG9mJywgbmFtZV07XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gKGF3YWl0IHRoaXMuc2hlbGwoc2hlbGxDb21tYW5kKSlcbiAgICAgICAgICAuc3BsaXQoL1xccysvKVxuICAgICAgICAgIC5tYXAoKHgpID0+IHBhcnNlSW50KHgsIDEwKSlcbiAgICAgICAgICAuZmlsdGVyKCh4KSA9PiBfLmlzSW50ZWdlcih4KSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIGVycm9yIGNvZGUgMSBpcyByZXR1cm5lZCBpZiB0aGUgdXRpbGl0eSBkaWQgbm90IGZpbmQgYW55IHByb2Nlc3Nlc1xuICAgICAgICAvLyB3aXRoIHRoZSBnaXZlbiBuYW1lXG4gICAgICAgIGlmIChlLmNvZGUgIT09IDEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBleHRyYWN0IHByb2Nlc3MgSUQgb2YgJyR7bmFtZX0nOiAke2UubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXy5pbmNsdWRlcyhlLnN0ZGVyciB8fCBlLnN0ZG91dCwgJ3N5bnRheCBlcnJvcicpKSB7XG4gICAgICAgICAgbG9nLndhcm4oYEdvdCBhbiB1bmV4cGVjdGVkIHJlc3BvbnNlIGZyb20gdGhlIHNoZWxsIGludGVycHJldGVyOiAke2Uuc3RkZXJyIHx8IGUuc3Rkb3V0fWApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGxvZy5kZWJ1ZygnVXNpbmcgcHMtYmFzZWQgUElEIGRldGVjdGlvbicpO1xuICBjb25zdCBzdGRvdXQgPSBhd2FpdCB0aGlzLmxpc3RQcm9jZXNzU3RhdHVzKCk7XG4gIGNvbnN0IHRpdGxlTWF0Y2ggPSBQU19USVRMRV9QQVRURVJOLmV4ZWMoc3Rkb3V0KTtcbiAgaWYgKCF0aXRsZU1hdGNoKSB7XG4gICAgbG9nLmRlYnVnKHN0ZG91dCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZXh0cmFjdCBQSUQgb2YgJyR7bmFtZX0nIGZyb20gcHMgb3V0cHV0YCk7XG4gIH1cbiAgY29uc3QgYWxsVGl0bGVzID0gdGl0bGVNYXRjaFsxXS50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgY29uc3QgcGlkSW5kZXggPSBhbGxUaXRsZXMuaW5kZXhPZihQSURfQ09MVU1OX1RJVExFKTtcbiAgY29uc3QgcGlkcyA9IFtdO1xuICBjb25zdCBwcm9jZXNzTmFtZVJlZ2V4ID0gbmV3IFJlZ0V4cChgXiguKlxcXFxiXFxcXGQrXFxcXGIuKlxcXFxiJHtfLmVzY2FwZVJlZ0V4cChuYW1lKX1cXFxcYi4qKSRgLCAnZ20nKTtcbiAgbGV0IG1hdGNoZWRMaW5lO1xuICB3aGlsZSAoKG1hdGNoZWRMaW5lID0gcHJvY2Vzc05hbWVSZWdleC5leGVjKHN0ZG91dCkpKSB7XG4gICAgY29uc3QgaXRlbXMgPSBtYXRjaGVkTGluZVsxXS50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgICBpZiAocGlkSW5kZXggPj0gYWxsVGl0bGVzLmxlbmd0aCB8fCBpc05hTihpdGVtc1twaWRJbmRleF0pKSB7XG4gICAgICBsb2cuZGVidWcoc3Rkb3V0KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGV4dHJhY3QgUElEIG9mICcke25hbWV9JyBmcm9tICcke21hdGNoZWRMaW5lWzFdLnRyaW0oKX0nYCk7XG4gICAgfVxuICAgIHBpZHMucHVzaChwYXJzZUludChpdGVtc1twaWRJbmRleF0sIDEwKSk7XG4gIH1cbiAgcmV0dXJuIHBpZHM7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgbGlzdCBvZiBwcm9jZXNzIGlkcyBmb3IgdGhlIHBhcnRpY3VsYXIgcHJvY2VzcyBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgcGFydCBvZiBwcm9jZXNzIG5hbWUuXG4gKiBAcmV0dXJuIHtBcnJheS48bnVtYmVyPn0gVGhlIGxpc3Qgb2YgbWF0Y2hlZCBwcm9jZXNzIElEcyBvciBhbiBlbXB0eSBsaXN0LlxuICovXG5tZXRob2RzLmtpbGxQcm9jZXNzZXNCeU5hbWUgPSBhc3luYyBmdW5jdGlvbiBraWxsUHJvY2Vzc2VzQnlOYW1lIChuYW1lKSB7XG4gIHRyeSB7XG4gICAgbG9nLmRlYnVnKGBBdHRlbXB0aW5nIHRvIGtpbGwgYWxsICR7bmFtZX0gcHJvY2Vzc2VzYCk7XG4gICAgY29uc3QgcGlkcyA9IGF3YWl0IHRoaXMuZ2V0UElEc0J5TmFtZShuYW1lKTtcbiAgICBpZiAoXy5pc0VtcHR5KHBpZHMpKSB7XG4gICAgICBsb2cuaW5mbyhgTm8gJyR7bmFtZX0nIHByb2Nlc3MgaGFzIGJlZW4gZm91bmRgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgQi5hbGwocGlkcy5tYXAoKHApID0+IHRoaXMua2lsbFByb2Nlc3NCeVBJRChwKSkpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGtpbGwgJHtuYW1lfSBwcm9jZXNzZXMuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBLaWxsIHRoZSBwYXJ0aWN1bGFyIHByb2Nlc3Mgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICogVGhlIGN1cnJlbnQgdXNlciBpcyBhdXRvbWF0aWNhbGx5IHN3aXRjaGVkIHRvIHJvb3QgaWYgbmVjZXNzYXJ5IGluIG9yZGVyXG4gKiB0byBwcm9wZXJseSBraWxsIHRoZSBwcm9jZXNzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gcGlkIC0gVGhlIElEIG9mIHRoZSBwcm9jZXNzIHRvIGJlIGtpbGxlZC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgcHJvY2VzcyBjYW5ub3QgYmUga2lsbGVkLlxuICovXG5tZXRob2RzLmtpbGxQcm9jZXNzQnlQSUQgPSBhc3luYyBmdW5jdGlvbiBraWxsUHJvY2Vzc0J5UElEIChwaWQpIHtcbiAgbG9nLmRlYnVnKGBBdHRlbXB0aW5nIHRvIGtpbGwgcHJvY2VzcyAke3BpZH1gKTtcbiAgY29uc3Qgbm9Qcm9jZXNzRmxhZyA9ICdObyBzdWNoIHByb2Nlc3MnO1xuICB0cnkge1xuICAgIC8vIENoZWNrIGlmIHRoZSBwcm9jZXNzIGV4aXN0cyBhbmQgdGhyb3cgYW4gZXhjZXB0aW9uIG90aGVyd2lzZVxuICAgIGF3YWl0IHRoaXMuc2hlbGwoWydraWxsJywgcGlkXSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoXy5pbmNsdWRlcyhlLnN0ZGVyciwgbm9Qcm9jZXNzRmxhZykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFfLmluY2x1ZGVzKGUuc3RkZXJyLCAnT3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWQnKSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgbG9nLmluZm8oYENhbm5vdCBraWxsIFBJRCAke3BpZH0gZHVlIHRvIGluc3VmZmljaWVudCBwZXJtaXNzaW9ucy4gUmV0cnlpbmcgYXMgcm9vdGApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnNoZWxsKFsna2lsbCcsIHBpZF0sIHtcbiAgICAgICAgcHJpdmlsZWdlZDogdHJ1ZVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZTEpIHtcbiAgICAgIGlmIChfLmluY2x1ZGVzKGUxLnN0ZGVyciwgbm9Qcm9jZXNzRmxhZykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhyb3cgZTE7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEJyb2FkY2FzdCBwcm9jZXNzIGtpbGxpbmcgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnRlbnQgLSBUaGUgbmFtZSBvZiB0aGUgaW50ZW50IHRvIGJyb2FkY2FzdCB0by5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9jZXNzTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBraWxsZWQgcHJvY2Vzcy5cbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiB0aGUgcHJvY2VzcyB3YXMgbm90IGtpbGxlZC5cbiAqL1xubWV0aG9kcy5icm9hZGNhc3RQcm9jZXNzRW5kID0gYXN5bmMgZnVuY3Rpb24gYnJvYWRjYXN0UHJvY2Vzc0VuZCAoaW50ZW50LCBwcm9jZXNzTmFtZSkge1xuICAvLyBzdGFydCB0aGUgYnJvYWRjYXN0IHdpdGhvdXQgd2FpdGluZyBmb3IgaXQgdG8gZmluaXNoLlxuICB0aGlzLmJyb2FkY2FzdChpbnRlbnQpO1xuICAvLyB3YWl0IGZvciB0aGUgcHJvY2VzcyB0byBlbmRcbiAgbGV0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgbGV0IHRpbWVvdXRNcyA9IDQwMDAwO1xuICB0cnkge1xuICAgIHdoaWxlICgoRGF0ZS5ub3coKSAtIHN0YXJ0KSA8IHRpbWVvdXRNcykge1xuICAgICAgaWYgKGF3YWl0IHRoaXMucHJvY2Vzc0V4aXN0cyhwcm9jZXNzTmFtZSkpIHtcbiAgICAgICAgLy8gY29vbCBkb3duXG4gICAgICAgIGF3YWl0IHNsZWVwKDQwMCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFByb2Nlc3MgbmV2ZXIgZGllZCB3aXRoaW4gJHt0aW1lb3V0TXN9IG1zYCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBicm9hZGNhc3QgcHJvY2VzcyBlbmQuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBCcm9hZGNhc3QgYSBtZXNzYWdlIHRvIHRoZSBnaXZlbiBpbnRlbnQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGludGVudCAtIFRoZSBuYW1lIG9mIHRoZSBpbnRlbnQgdG8gYnJvYWRjYXN0IHRvLlxuICogQHRocm93cyB7ZXJyb3J9IElmIGludGVudCBuYW1lIGlzIG5vdCBhIHZhbGlkIGNsYXNzIG5hbWUuXG4gKi9cbm1ldGhvZHMuYnJvYWRjYXN0ID0gYXN5bmMgZnVuY3Rpb24gYnJvYWRjYXN0IChpbnRlbnQpIHtcbiAgaWYgKCF0aGlzLmlzVmFsaWRDbGFzcyhpbnRlbnQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGludGVudCAke2ludGVudH1gKTtcbiAgfVxuICBsb2cuZGVidWcoYEJyb2FkY2FzdGluZzogJHtpbnRlbnR9YCk7XG4gIGF3YWl0IHRoaXMuc2hlbGwoWydhbScsICdicm9hZGNhc3QnLCAnLWEnLCBpbnRlbnRdKTtcbn07XG5cbi8qKlxuICogS2lsbCBBbmRyb2lkIGluc3RydW1lbnRzIGlmIHRoZXkgYXJlIGN1cnJlbnRseSBydW5uaW5nLlxuICovXG5tZXRob2RzLmVuZEFuZHJvaWRDb3ZlcmFnZSA9IGFzeW5jIGZ1bmN0aW9uIGVuZEFuZHJvaWRDb3ZlcmFnZSAoKSB7XG4gIGlmICh0aGlzLmluc3RydW1lbnRQcm9jICYmIHRoaXMuaW5zdHJ1bWVudFByb2MuaXNSdW5uaW5nKSB7XG4gICAgYXdhaXQgdGhpcy5pbnN0cnVtZW50UHJvYy5zdG9wKCk7XG4gIH1cbn07XG5cbi8qKlxuICogSW5zdHJ1bWVudCB0aGUgcGFydGljdWxhciBhY3Rpdml0eS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgdG8gYmUgaW5zdHJ1bWVudGVkLlxuICogQHBhcmFtIHtzdHJpbmd9IGFjdGl2aXR5IC0gVGhlIG5hbWUgb2YgdGhlIG1haW4gYWN0aXZpdHkgaW4gdGhpcyBwYWNrYWdlLlxuICogQHBhcmFtIHtzdHJpbmd9IGluc3RydW1lbnRXaXRoIC0gVGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgdG8gaW5zdHJ1bWVudFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFjdGl2aXR5IHdpdGguXG4gKiBAdGhyb3dzIHtlcnJvcn0gSWYgYW55IGV4Y2VwdGlvbiBpcyByZXBvcnRlZCBieSBhZGIgc2hlbGwuXG4gKi9cbm1ldGhvZHMuaW5zdHJ1bWVudCA9IGFzeW5jIGZ1bmN0aW9uIGluc3RydW1lbnQgKHBrZywgYWN0aXZpdHksIGluc3RydW1lbnRXaXRoKSB7XG4gIGlmIChhY3Rpdml0eVswXSAhPT0gJy4nKSB7XG4gICAgcGtnID0gJyc7XG4gIH1cbiAgbGV0IHBrZ0FjdGl2aXR5ID0gKHBrZyArIGFjdGl2aXR5KS5yZXBsYWNlKC9cXC4rL2csICcuJyk7IC8vIEZpeCBwa2cuLmFjdGl2aXR5IGVycm9yXG4gIGxldCBzdGRvdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFtcbiAgICAnYW0nLCAnaW5zdHJ1bWVudCcsXG4gICAgJy1lJywgJ21haW5fYWN0aXZpdHknLFxuICAgIHBrZ0FjdGl2aXR5LFxuICAgIGluc3RydW1lbnRXaXRoLFxuICBdKTtcbiAgaWYgKHN0ZG91dC5pbmRleE9mKCdFeGNlcHRpb24nKSAhPT0gLTEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZXhjZXB0aW9uIGR1cmluZyBpbnN0cnVtZW50YXRpb24uIE9yaWdpbmFsIGVycm9yICR7c3Rkb3V0LnNwbGl0KCdcXG4nKVswXX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBDb2xsZWN0IEFuZHJvaWQgY292ZXJhZ2UgYnkgaW5zdHJ1bWVudGluZyB0aGUgcGFydGljdWxhciBhY3Rpdml0eS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5zdHJ1bWVudENsYXNzIC0gVGhlIG5hbWUgb2YgdGhlIGluc3RydW1lbnRhdGlvbiBjbGFzcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSB3YWl0UGtnIC0gVGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgdG8gYmUgaW5zdHJ1bWVudGVkLlxuICogQHBhcmFtIHtzdHJpbmd9IHdhaXRBY3Rpdml0eSAtIFRoZSBuYW1lIG9mIHRoZSBtYWluIGFjdGl2aXR5IGluIHRoaXMgcGFja2FnZS5cbiAqXG4gKiBAcmV0dXJuIHtwcm9taXNlfSBUaGUgcHJvbWlzZSBpcyBzdWNjZXNzZnVsbHkgcmVzb2x2ZWQgaWYgdGhlIGluc3RydW1lbnRhdGlvbiBzdGFydHNcbiAqICAgICAgICAgICAgICAgICAgIHdpdGhvdXQgZXJyb3JzLlxuICovXG5tZXRob2RzLmFuZHJvaWRDb3ZlcmFnZSA9IGFzeW5jIGZ1bmN0aW9uIGFuZHJvaWRDb3ZlcmFnZSAoaW5zdHJ1bWVudENsYXNzLCB3YWl0UGtnLCB3YWl0QWN0aXZpdHkpIHtcbiAgaWYgKCF0aGlzLmlzVmFsaWRDbGFzcyhpbnN0cnVtZW50Q2xhc3MpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNsYXNzICR7aW5zdHJ1bWVudENsYXNzfWApO1xuICB9XG4gIHJldHVybiBhd2FpdCBuZXcgQihhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgbGV0IGFyZ3MgPSB0aGlzLmV4ZWN1dGFibGUuZGVmYXVsdEFyZ3NcbiAgICAgIC5jb25jYXQoWydzaGVsbCcsICdhbScsICdpbnN0cnVtZW50JywgJy1lJywgJ2NvdmVyYWdlJywgJ3RydWUnLCAnLXcnXSlcbiAgICAgIC5jb25jYXQoW2luc3RydW1lbnRDbGFzc10pO1xuICAgIGxvZy5kZWJ1ZyhgQ29sbGVjdGluZyBjb3ZlcmFnZSBkYXRhIHdpdGg6ICR7W3RoaXMuZXhlY3V0YWJsZS5wYXRoXS5jb25jYXQoYXJncykuam9pbignICcpfWApO1xuICAgIHRyeSB7XG4gICAgICAvLyBhbSBpbnN0cnVtZW50IHJ1bnMgZm9yIHRoZSBsaWZlIG9mIHRoZSBhcHAgcHJvY2Vzcy5cbiAgICAgIHRoaXMuaW5zdHJ1bWVudFByb2MgPSBuZXcgU3ViUHJvY2Vzcyh0aGlzLmV4ZWN1dGFibGUucGF0aCwgYXJncyk7XG4gICAgICBhd2FpdCB0aGlzLmluc3RydW1lbnRQcm9jLnN0YXJ0KDApO1xuICAgICAgdGhpcy5pbnN0cnVtZW50UHJvYy5vbignb3V0cHV0JywgKHN0ZG91dCwgc3RkZXJyKSA9PiB7XG4gICAgICAgIGlmIChzdGRlcnIpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBGYWlsZWQgdG8gcnVuIGluc3RydW1lbnRhdGlvbi4gT3JpZ2luYWwgZXJyb3I6ICR7c3RkZXJyfWApKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBhd2FpdCB0aGlzLndhaXRGb3JBY3Rpdml0eSh3YWl0UGtnLCB3YWl0QWN0aXZpdHkpO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJlamVjdChuZXcgRXJyb3IoYEFuZHJvaWQgY292ZXJhZ2UgZmFpbGVkLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCkpO1xuICAgIH1cbiAgfSk7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgcGFydGljdWxhciBwcm9wZXJ0eSBvZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LiBUaGlzIG5hbWUgc2hvdWxkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBrbm93biB0byBfYWRiIHNoZWxsIGdldHByb3BfIHRvb2wuXG4gKlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgdmFsdWUgb2YgdGhlIGdpdmVuIHByb3BlcnR5LlxuICovXG5tZXRob2RzLmdldERldmljZVByb3BlcnR5ID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlUHJvcGVydHkgKHByb3BlcnR5KSB7XG4gIGxldCBzdGRvdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFsnZ2V0cHJvcCcsIHByb3BlcnR5XSk7XG4gIGxldCB2YWwgPSBzdGRvdXQudHJpbSgpO1xuICBsb2cuZGVidWcoYEN1cnJlbnQgZGV2aWNlIHByb3BlcnR5ICcke3Byb3BlcnR5fSc6ICR7dmFsfWApO1xuICByZXR1cm4gdmFsO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBzZXRQcm9wT3B0c1xuICogQHByb3BlcnR5IHtib29sZWFufSBwcml2aWxlZ2VkIC0gRG8gd2UgcnVuIHNldFByb3AgYXMgYSBwcml2aWxlZ2VkIGNvbW1hbmQ/IERlZmF1bHQgdHJ1ZS5cbiAqL1xuXG4vKipcbiAqIFNldCB0aGUgcGFydGljdWxhciBwcm9wZXJ0eSBvZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LiBUaGlzIG5hbWUgc2hvdWxkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBrbm93biB0byBfYWRiIHNoZWxsIHNldHByb3BfIHRvb2wuXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsIC0gVGhlIG5ldyBwcm9wZXJ0eSB2YWx1ZS5cbiAqIEBwYXJhbSB7c2V0UHJvcE9wdHN9IG9wdHNcbiAqXG4gKiBAdGhyb3dzIHtlcnJvcn0gSWYgX3NldHByb3BfIHV0aWxpdHkgZmFpbHMgdG8gY2hhbmdlIHByb3BlcnR5IHZhbHVlLlxuICovXG5tZXRob2RzLnNldERldmljZVByb3BlcnR5ID0gYXN5bmMgZnVuY3Rpb24gc2V0RGV2aWNlUHJvcGVydHkgKHByb3AsIHZhbCwgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtwcml2aWxlZ2VkID0gdHJ1ZX0gPSBvcHRzO1xuICBsb2cuZGVidWcoYFNldHRpbmcgZGV2aWNlIHByb3BlcnR5ICcke3Byb3B9JyB0byAnJHt2YWx9J2ApO1xuICBhd2FpdCB0aGlzLnNoZWxsKFsnc2V0cHJvcCcsIHByb3AsIHZhbF0sIHtcbiAgICBwcml2aWxlZ2VkLFxuICB9KTtcbn07XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfSBDdXJyZW50IHN5c3RlbSBsYW5ndWFnZSBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbm1ldGhvZHMuZ2V0RGV2aWNlU3lzTGFuZ3VhZ2UgPSBhc3luYyBmdW5jdGlvbiBnZXREZXZpY2VTeXNMYW5ndWFnZSAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdwZXJzaXN0LnN5cy5sYW5ndWFnZScpO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEN1cnJlbnQgY291bnRyeSBuYW1lIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xubWV0aG9kcy5nZXREZXZpY2VTeXNDb3VudHJ5ID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlU3lzQ291bnRyeSAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdwZXJzaXN0LnN5cy5jb3VudHJ5Jyk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ30gQ3VycmVudCBzeXN0ZW0gbG9jYWxlIG5hbWUgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLmdldERldmljZVN5c0xvY2FsZSA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZVN5c0xvY2FsZSAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdwZXJzaXN0LnN5cy5sb2NhbGUnKTtcbn07XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfSBDdXJyZW50IHByb2R1Y3QgbGFuZ3VhZ2UgbmFtZSBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbm1ldGhvZHMuZ2V0RGV2aWNlUHJvZHVjdExhbmd1YWdlID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlUHJvZHVjdExhbmd1YWdlICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3JvLnByb2R1Y3QubG9jYWxlLmxhbmd1YWdlJyk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ30gQ3VycmVudCBwcm9kdWN0IGNvdW50cnkgbmFtZSBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbm1ldGhvZHMuZ2V0RGV2aWNlUHJvZHVjdENvdW50cnkgPSBhc3luYyBmdW5jdGlvbiBnZXREZXZpY2VQcm9kdWN0Q291bnRyeSAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdyby5wcm9kdWN0LmxvY2FsZS5yZWdpb24nKTtcbn07XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfSBDdXJyZW50IHByb2R1Y3QgbG9jYWxlIG5hbWUgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLmdldERldmljZVByb2R1Y3RMb2NhbGUgPSBhc3luYyBmdW5jdGlvbiBnZXREZXZpY2VQcm9kdWN0TG9jYWxlICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3JvLnByb2R1Y3QubG9jYWxlJyk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG1vZGVsIG5hbWUgb2YgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLmdldE1vZGVsID0gYXN5bmMgZnVuY3Rpb24gZ2V0TW9kZWwgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncm8ucHJvZHVjdC5tb2RlbCcpO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBtYW51ZmFjdHVyZXIgbmFtZSBvZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbm1ldGhvZHMuZ2V0TWFudWZhY3R1cmVyID0gYXN5bmMgZnVuY3Rpb24gZ2V0TWFudWZhY3R1cmVyICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3JvLnByb2R1Y3QubWFudWZhY3R1cmVyJyk7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgY3VycmVudCBzY3JlZW4gc2l6ZS5cbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IERldmljZSBzY3JlZW4gc2l6ZSBhcyBzdHJpbmcgaW4gZm9ybWF0ICdXeEgnIG9yXG4gKiAgICAgICAgICAgICAgICAgIF9udWxsXyBpZiBpdCBjYW5ub3QgYmUgZGV0ZXJtaW5lZC5cbiAqL1xubWV0aG9kcy5nZXRTY3JlZW5TaXplID0gYXN5bmMgZnVuY3Rpb24gZ2V0U2NyZWVuU2l6ZSAoKSB7XG4gIGxldCBzdGRvdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFsnd20nLCAnc2l6ZSddKTtcbiAgbGV0IHNpemUgPSBuZXcgUmVnRXhwKC9QaHlzaWNhbCBzaXplOiAoW15cXHI/XFxuXSspKi9nKS5leGVjKHN0ZG91dCk7XG4gIGlmIChzaXplICYmIHNpemUubGVuZ3RoID49IDIpIHtcbiAgICByZXR1cm4gc2l6ZVsxXS50cmltKCk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgY3VycmVudCBzY3JlZW4gZGVuc2l0eSBpbiBkcGlcbiAqXG4gKiBAcmV0dXJuIHs/bnVtYmVyfSBEZXZpY2Ugc2NyZWVuIGRlbnNpdHkgYXMgYSBudW1iZXIgb3IgX251bGxfIGlmIGl0XG4gKiAgICAgICAgICAgICAgICAgIGNhbm5vdCBiZSBkZXRlcm1pbmVkXG4gKi9cbm1ldGhvZHMuZ2V0U2NyZWVuRGVuc2l0eSA9IGFzeW5jIGZ1bmN0aW9uIGdldFNjcmVlbkRlbnNpdHkgKCkge1xuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5zaGVsbChbJ3dtJywgJ2RlbnNpdHknXSk7XG4gIGxldCBkZW5zaXR5ID0gbmV3IFJlZ0V4cCgvUGh5c2ljYWwgZGVuc2l0eTogKFteXFxyP1xcbl0rKSovZykuZXhlYyhzdGRvdXQpO1xuICBpZiAoZGVuc2l0eSAmJiBkZW5zaXR5Lmxlbmd0aCA+PSAyKSB7XG4gICAgbGV0IGRlbnNpdHlOdW1iZXIgPSBwYXJzZUludChkZW5zaXR5WzFdLnRyaW0oKSwgMTApO1xuICAgIHJldHVybiBpc05hTihkZW5zaXR5TnVtYmVyKSA/IG51bGwgOiBkZW5zaXR5TnVtYmVyO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxuLyoqXG4gKiBTZXR1cCBIVFRQIHByb3h5IGluIGRldmljZSBnbG9iYWwgc2V0dGluZ3MuXG4gKiBSZWFkIGh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL2ZyYW1ld29ya3MvYmFzZS8rL2FuZHJvaWQtOS4wLjBfcjIxL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzLmphdmEgZm9yIGVhY2ggcHJvcGVydHlcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJveHlIb3N0IC0gVGhlIGhvc3QgbmFtZSBvZiB0aGUgcHJveHkuXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHByb3h5UG9ydCAtIFRoZSBwb3J0IG51bWJlciB0byBiZSBzZXQuXG4gKi9cbm1ldGhvZHMuc2V0SHR0cFByb3h5ID0gYXN5bmMgZnVuY3Rpb24gc2V0SHR0cFByb3h5IChwcm94eUhvc3QsIHByb3h5UG9ydCkge1xuICBsZXQgcHJveHkgPSBgJHtwcm94eUhvc3R9OiR7cHJveHlQb3J0fWA7XG4gIGlmIChfLmlzVW5kZWZpbmVkKHByb3h5SG9zdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbGwgdG8gc2V0SHR0cFByb3h5IG1ldGhvZCB3aXRoIHVuZGVmaW5lZCBwcm94eV9ob3N0OiAke3Byb3h5fWApO1xuICB9XG4gIGlmIChfLmlzVW5kZWZpbmVkKHByb3h5UG9ydCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbGwgdG8gc2V0SHR0cFByb3h5IG1ldGhvZCB3aXRoIHVuZGVmaW5lZCBwcm94eV9wb3J0ICR7cHJveHl9YCk7XG4gIH1cblxuICBjb25zdCBodHRwUHJveHlTZXR0aW5zID0gW1xuICAgIFsnaHR0cF9wcm94eScsIHByb3h5XSxcbiAgICBbJ2dsb2JhbF9odHRwX3Byb3h5X2hvc3QnLCBwcm94eUhvc3RdLFxuICAgIFsnZ2xvYmFsX2h0dHBfcHJveHlfcG9ydCcsIHByb3h5UG9ydF1cbiAgXTtcbiAgZm9yIChjb25zdCBbc2V0dGluZ0tleSwgc2V0dGluZ1ZhbHVlXSBvZiBodHRwUHJveHlTZXR0aW5zKSB7XG4gICAgYXdhaXQgdGhpcy5zZXRTZXR0aW5nKCdnbG9iYWwnLCBzZXR0aW5nS2V5LCBzZXR0aW5nVmFsdWUpO1xuICB9XG59O1xuXG4vKipcbiAqIERlbGV0ZSBIVFRQIHByb3h5IGluIGRldmljZSBnbG9iYWwgc2V0dGluZ3MuXG4gKiBSZWJvb3RpbmcgdGhlIHRlc3QgZGV2aWNlIGlzIG5lY2Vzc2FyeSB0byBhcHBseSB0aGUgY2hhbmdlLlxuICovXG5tZXRob2RzLmRlbGV0ZUh0dHBQcm94eSA9IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUh0dHBQcm94eSAoKSB7XG4gIGNvbnN0IGh0dHBQcm94eVNldHRpbnMgPSBbXG4gICAgJ2h0dHBfcHJveHknLFxuICAgICdnbG9iYWxfaHR0cF9wcm94eV9ob3N0JyxcbiAgICAnZ2xvYmFsX2h0dHBfcHJveHlfcG9ydCcsXG4gICAgJ2dsb2JhbF9odHRwX3Byb3h5X2V4Y2x1c2lvbl9saXN0JyAvLyBgZ2xvYmFsX2h0dHBfcHJveHlfZXhjbHVzaW9uX2xpc3Q9YCB3YXMgZ2VuZXJhdGVkIGJ5IGBzZXR0aW5ncyBnbG9iYWwgaHR0b19wcm94eSB4eHh4YFxuICBdO1xuICBmb3IgKGNvbnN0IHNldHRpbmcgb2YgaHR0cFByb3h5U2V0dGlucykge1xuICAgIGF3YWl0IHRoaXMuc2hlbGwoWydzZXR0aW5ncycsICdkZWxldGUnLCAnZ2xvYmFsJywgc2V0dGluZ10pO1xuICB9XG59O1xuXG4vKipcbiAqIFNldCBkZXZpY2UgcHJvcGVydHkuXG4gKiBbYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nc117QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3MuaHRtbH1cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZXNwYWNlIC0gb25lIG9mIHtzeXN0ZW0sIHNlY3VyZSwgZ2xvYmFsfSwgY2FzZS1pbnNlbnNpdGl2ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzZXR0aW5nIC0gcHJvcGVydHkgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gdmFsdWUgLSBwcm9wZXJ0eSB2YWx1ZS5cbiAqIEByZXR1cm4ge3N0cmluZ30gY29tbWFuZCBvdXRwdXQuXG4gKi9cbm1ldGhvZHMuc2V0U2V0dGluZyA9IGFzeW5jIGZ1bmN0aW9uIHNldFNldHRpbmcgKG5hbWVzcGFjZSwgc2V0dGluZywgdmFsdWUpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuc2hlbGwoWydzZXR0aW5ncycsICdwdXQnLCBuYW1lc3BhY2UsIHNldHRpbmcsIHZhbHVlXSk7XG59O1xuXG4vKipcbiAqIEdldCBkZXZpY2UgcHJvcGVydHkuXG4gKiBbYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nc117QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3MuaHRtbH1cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZXNwYWNlIC0gb25lIG9mIHtzeXN0ZW0sIHNlY3VyZSwgZ2xvYmFsfSwgY2FzZS1pbnNlbnNpdGl2ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzZXR0aW5nIC0gcHJvcGVydHkgbmFtZS5cbiAqIEByZXR1cm4ge3N0cmluZ30gcHJvcGVydHkgdmFsdWUuXG4gKi9cbm1ldGhvZHMuZ2V0U2V0dGluZyA9IGFzeW5jIGZ1bmN0aW9uIGdldFNldHRpbmcgKG5hbWVzcGFjZSwgc2V0dGluZykge1xuICByZXR1cm4gYXdhaXQgdGhpcy5zaGVsbChbJ3NldHRpbmdzJywgJ2dldCcsIG5hbWVzcGFjZSwgc2V0dGluZ10pO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgYGFkYiBidWdyZXBvcnRgIGNvbW1hbmQgb3V0cHV0LiBUaGlzXG4gKiBvcGVyYXRpb24gbWF5IHRha2UgdXAgdG8gc2V2ZXJhbCBtaW51dGVzLlxuICpcbiAqIEBwYXJhbSB7P251bWJlcn0gdGltZW91dCBbMTIwMDAwXSAtIENvbW1hbmQgdGltZW91dCBpbiBtaWxsaXNlY29uZHNcbiAqIEByZXR1cm5zIHtzdHJpbmd9IENvbW1hbmQgc3Rkb3V0XG4gKi9cbm1ldGhvZHMuYnVncmVwb3J0ID0gYXN5bmMgZnVuY3Rpb24gYnVncmVwb3J0ICh0aW1lb3V0ID0gMTIwMDAwKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYkV4ZWMoWydidWdyZXBvcnQnXSwge3RpbWVvdXR9KTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU2NyZWVucmVjb3JkT3B0aW9uc1xuICogQHByb3BlcnR5IHs/c3RyaW5nfSB2aWRlb1NpemUgLSBUaGUgZm9ybWF0IGlzIHdpZHRoeGhlaWdodC5cbiAqICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgdGhlIGRldmljZSdzIG5hdGl2ZSBkaXNwbGF5IHJlc29sdXRpb24gKGlmIHN1cHBvcnRlZCksXG4gKiAgICAgICAgICAgICAgICAgIDEyODB4NzIwIGlmIG5vdC4gRm9yIGJlc3QgcmVzdWx0cyxcbiAqICAgICAgICAgICAgICAgICAgdXNlIGEgc2l6ZSBzdXBwb3J0ZWQgYnkgeW91ciBkZXZpY2UncyBBZHZhbmNlZCBWaWRlbyBDb2RpbmcgKEFWQykgZW5jb2Rlci5cbiAqICAgICAgICAgICAgICAgICAgRm9yIGV4YW1wbGUsIFwiMTI4MHg3MjBcIlxuICogQHByb3BlcnR5IHs/Ym9vbGVhbn0gYnVnUmVwb3J0IC0gU2V0IGl0IHRvIGB0cnVlYCBpbiBvcmRlciB0byBkaXNwbGF5IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gdGhlIHZpZGVvIG92ZXJsYXksXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNoIGFzIGEgdGltZXN0YW1wLCB0aGF0IGlzIGhlbHBmdWwgaW4gdmlkZW9zIGNhcHR1cmVkIHRvIGlsbHVzdHJhdGUgYnVncy5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9uIGlzIG9ubHkgc3VwcG9ydGVkIHNpbmNlIEFQSSBsZXZlbCAyNyAoQW5kcm9pZCBQKS5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ3xudW1iZXJ9IHRpbWVMaW1pdCAtIFRoZSBtYXhpbXVtIHJlY29yZGluZyB0aW1lLCBpbiBzZWNvbmRzLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgKGFuZCBtYXhpbXVtKSB2YWx1ZSBpcyAxODAgKDMgbWludXRlcykuXG4gKiBAcHJvcGVydHkgez9zdHJpbmd8bnVtYmVyfSBiaXRSYXRlIC0gVGhlIHZpZGVvIGJpdCByYXRlIGZvciB0aGUgdmlkZW8sIGluIG1lZ2FiaXRzIHBlciBzZWNvbmQuXG4gKiAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA0LiBZb3UgY2FuIGluY3JlYXNlIHRoZSBiaXQgcmF0ZSB0byBpbXByb3ZlIHZpZGVvIHF1YWxpdHksXG4gKiAgICAgICAgICAgICAgICBidXQgZG9pbmcgc28gcmVzdWx0cyBpbiBsYXJnZXIgbW92aWUgZmlsZXMuXG4gKi9cblxuLyoqXG4gKiBJbml0aWF0ZSBzY3JlZW5yZWNvcmQgdXRpbGl0eSBvbiB0aGUgZGV2aWNlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGRlc3RpbmF0aW9uIC0gRnVsbCBwYXRoIHRvIHRoZSB3cml0YWJsZSBtZWRpYSBmaWxlIGRlc3RpbmF0aW9uXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiB0aGUgZGV2aWNlIGZpbGUgc3lzdGVtLlxuICogQHBhcmFtIHs/U2NyZWVucmVjb3JkT3B0aW9uc30gb3B0aW9ucyBbe31dXG4gKiBAcmV0dXJucyB7U3ViUHJvY2Vzc30gc2NyZWVucmVjb3JkIHByb2Nlc3MsIHdoaWNoIGNhbiBiZSB0aGVuIGNvbnRyb2xsZWQgYnkgdGhlIGNsaWVudCBjb2RlXG4gKi9cbm1ldGhvZHMuc2NyZWVucmVjb3JkID0gZnVuY3Rpb24gc2NyZWVucmVjb3JkIChkZXN0aW5hdGlvbiwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IGNtZCA9IFsnc2NyZWVucmVjb3JkJ107XG4gIGNvbnN0IHtcbiAgICB2aWRlb1NpemUsXG4gICAgYml0UmF0ZSxcbiAgICB0aW1lTGltaXQsXG4gICAgYnVnUmVwb3J0LFxuICB9ID0gb3B0aW9ucztcbiAgaWYgKHV0aWwuaGFzVmFsdWUodmlkZW9TaXplKSkge1xuICAgIGNtZC5wdXNoKCctLXNpemUnLCB2aWRlb1NpemUpO1xuICB9XG4gIGlmICh1dGlsLmhhc1ZhbHVlKHRpbWVMaW1pdCkpIHtcbiAgICBjbWQucHVzaCgnLS10aW1lLWxpbWl0JywgdGltZUxpbWl0KTtcbiAgfVxuICBpZiAodXRpbC5oYXNWYWx1ZShiaXRSYXRlKSkge1xuICAgIGNtZC5wdXNoKCctLWJpdC1yYXRlJywgYml0UmF0ZSk7XG4gIH1cbiAgaWYgKGJ1Z1JlcG9ydCkge1xuICAgIGNtZC5wdXNoKCctLWJ1Z3JlcG9ydCcpO1xuICB9XG4gIGNtZC5wdXNoKGRlc3RpbmF0aW9uKTtcblxuICBjb25zdCBmdWxsQ21kID0gW1xuICAgIC4uLnRoaXMuZXhlY3V0YWJsZS5kZWZhdWx0QXJncyxcbiAgICAnc2hlbGwnLFxuICAgIC4uLmNtZFxuICBdO1xuICBsb2cuZGVidWcoYEJ1aWxkaW5nIHNjcmVlbnJlY29yZCBwcm9jZXNzIHdpdGggdGhlIGNvbW1hbmQgbGluZTogYWRiICR7dXRpbC5xdW90ZShmdWxsQ21kKX1gKTtcbiAgcmV0dXJuIG5ldyBTdWJQcm9jZXNzKHRoaXMuZXhlY3V0YWJsZS5wYXRoLCBmdWxsQ21kKTtcbn07XG5cbi8qKlxuICogRXhlY3V0ZXMgdGhlIGdpdmVuIGZ1bmN0aW9uIHdpdGggdGhlIGdpdmVuIGlucHV0IG1ldGhvZCBjb250ZXh0XG4gKiBhbmQgdGhlbiByZXN0b3JlcyB0aGUgSU1FIHRvIHRoZSBvcmlnaW5hbCB2YWx1ZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbWUgLSBWYWxpZCBJTUUgaWRlbnRpZmllclxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gLSBGdW5jdGlvbiB0byBleGVjdXRlXG4gKiBAcmV0dXJucyB7Kn0gVGhlIHJlc3VsdCBvZiB0aGUgZ2l2ZW4gZnVuY3Rpb25cbiAqL1xubWV0aG9kcy5ydW5JbkltZUNvbnRleHQgPSBhc3luYyBmdW5jdGlvbiBydW5JbkltZUNvbnRleHQgKGltZSwgZm4pIHtcbiAgY29uc3Qgb3JpZ2luYWxJbWUgPSBhd2FpdCB0aGlzLmRlZmF1bHRJTUUoKTtcbiAgaWYgKG9yaWdpbmFsSW1lID09PSBpbWUpIHtcbiAgICBsb2cuZGVidWcoYFRoZSBvcmlnaW5hbCBJTUUgaXMgdGhlIHNhbWUgYXMgJyR7aW1lfScuIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmVzZXQgaXRgKTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCB0aGlzLmVuYWJsZUlNRShpbWUpO1xuICAgIGF3YWl0IHRoaXMuc2V0SU1FKGltZSk7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzE1OTQzXG4gICAgYXdhaXQgQi5kZWxheSg1MDApO1xuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKG9yaWdpbmFsSW1lICE9PSBpbWUpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2V0SU1FKG9yaWdpbmFsSW1lKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogR2V0IHR6IGRhdGFiYXNlIHRpbWUgem9uZSBmb3JtYXR0ZWQgdGltZXpvbmVcbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUWiBkYXRhYmFzZSBUaW1lIFpvbmVzIGZvcm1hdFxuICpcbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiBhbnkgZXhjZXB0aW9uIGlzIHJlcG9ydGVkIGJ5IGFkYiBzaGVsbC5cbiAqL1xubWV0aG9kcy5nZXRUaW1lWm9uZSA9IGFzeW5jIGZ1bmN0aW9uIGdldFRpbWVab25lICgpIHtcbiAgbG9nLmRlYnVnKCdHZXR0aW5nIGN1cnJlbnQgdGltZXpvbmUnKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncGVyc2lzdC5zeXMudGltZXpvbmUnKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZ2V0dGluZyB0aW1lem9uZS4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgbGlzdCBvZiBmZWF0dXJlcyBzdXBwb3J0ZWQgYnkgdGhlIGRldmljZSB1bmRlciB0ZXN0XG4gKlxuICogQHJldHVybnMge0FycmF5PHN0cmluZz59IHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBmZWF0dXJlIG5hbWVzIG9yIGFuIGVtcHR5IGxpc3QuXG4gKiBBbiBleGFtcGxlIGFkYiBjb21tYW5kIG91dHB1dDpcbiAqIGBgYFxuICogY21kXG4gKiBsc192MlxuICogZml4ZWRfcHVzaF9ta2RpclxuICogc2hlbGxfdjJcbiAqIGFiYlxuICogc3RhdF92MlxuICogYXBleFxuICogYWJiX2V4ZWNcbiAqIHJlbW91bnRfc2hlbGxcbiAqIGZpeGVkX3B1c2hfc3ltbGlua190aW1lc3RhbXBcbiAqIGBgYFxuICogQHRocm93cyB7RXJyb3J9IGlmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSByZXRyaWV2aW5nIHRoZSBsaXN0XG4gKi9cbm1ldGhvZHMubGlzdEZlYXR1cmVzID0gYXN5bmMgZnVuY3Rpb24gbGlzdEZlYXR1cmVzICgpIHtcbiAgdGhpcy5fbWVtb2l6ZWRGZWF0dXJlcyA9IHRoaXMuX21lbW9pemVkRmVhdHVyZXNcbiAgICB8fCBfLm1lbW9pemUoYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5hZGJFeGVjKFsnZmVhdHVyZXMnXSksICgpID0+IHRoaXMuY3VyRGV2aWNlSWQpO1xuICB0cnkge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5fbWVtb2l6ZWRGZWF0dXJlcygpKVxuICAgICAgLnNwbGl0KC9cXHMrLylcbiAgICAgIC5tYXAoKHgpID0+IHgudHJpbSgpKVxuICAgICAgLmZpbHRlcihCb29sZWFuKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmIChfLmluY2x1ZGVzKGUuc3RkZXJyLCAndW5rbm93biBjb21tYW5kJykpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgdGhyb3cgZTtcbiAgfVxufTtcblxuLyoqXG4gKiBDaGVja3MgdGhlIHN0YXRlIG9mIHN0cmVhbWVkIGluc3RhbGwgZmVhdHVyZS5cbiAqIFRoaXMgZmVhdHVyZSBhbGxvd3MgdG8gc3BlZWQgdXAgYXBrIGluc3RhbGxhdGlvblxuICogc2luY2UgaXQgZG9lcyBub3QgcmVxdWlyZSB0aGUgb3JpZ2luYWwgYXBrIHRvIGJlIHB1c2hlZCB0b1xuICogdGhlIGRldmljZSB1bmRlciB0ZXN0IGZpcnN0LCB3aGljaCBhbHNvIHNhdmVzIHNwYWNlLlxuICogQWx0aG91Z2gsIGl0IGlzIHJlcXVpcmVkIHRoYXQgYm90aCB0aGUgZGV2aWNlIHVuZGVyIHRlc3RcbiAqIGFuZCB0aGUgYWRiIHNlcnZlciBoYXZlIHRoZSBtZW50aW9uZWQgZnVuY3Rpb25hbGl0eS5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYW9zcC1taXJyb3IvcGxhdGZvcm1fc3lzdGVtX2NvcmUvYmxvYi9tYXN0ZXIvYWRiL2NsaWVudC9hZGJfaW5zdGFsbC5jcHBcbiAqIGZvciBtb3JlIGRldGFpbHNcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSBib3RoIGFkYiBhbmQgdGhlXG4gKiBkZXZpY2UgdW5kZXIgdGVzdFxuICovXG5tZXRob2RzLmlzU3RyZWFtZWRJbnN0YWxsU3VwcG9ydGVkID0gYXN5bmMgZnVuY3Rpb24gaXNTdHJlYW1lZEluc3RhbGxTdXBwb3J0ZWQgKCkge1xuICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKTtcbiAgcHJvdG8uX2hlbHBPdXRwdXQgPSBwcm90by5faGVscE91dHB1dCB8fCBhd2FpdCB0aGlzLmFkYkV4ZWMoWydoZWxwJ10pO1xuICByZXR1cm4gcHJvdG8uX2hlbHBPdXRwdXQuaW5jbHVkZXMoJy0tc3RyZWFtaW5nJylcbiAgICAmJiAoYXdhaXQgdGhpcy5saXN0RmVhdHVyZXMoKSkuaW5jbHVkZXMoJ2NtZCcpO1xufTtcblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBpbmNyZW1lbnRhbCBpbnN0YWxsIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IEFEQi5cbiAqIFJlYWQgaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcHJldmlldy9mZWF0dXJlcyNpbmNyZW1lbnRhbFxuICogZm9yIG1vcmUgZGV0YWlscyBvbiBpdC5cbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSBib3RoIGFkYiBhbmQgdGhlXG4gKiBkZXZpY2UgdW5kZXIgdGVzdFxuICovXG5tZXRob2RzLmlzSW5jcmVtZW50YWxJbnN0YWxsU3VwcG9ydGVkID0gYXN5bmMgZnVuY3Rpb24gaXNJbmNyZW1lbnRhbEluc3RhbGxTdXBwb3J0ZWQgKCkge1xuICBjb25zdCB7YmluYXJ5fSA9IGF3YWl0IHRoaXMuZ2V0VmVyc2lvbigpO1xuICBpZiAoIWJpbmFyeSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdXRpbC5jb21wYXJlVmVyc2lvbnMoYmluYXJ5LnZlcnNpb24sICc+PScsICczMC4wLjEnKVxuICAgICYmIChhd2FpdCB0aGlzLmxpc3RGZWF0dXJlcygpKS5pbmNsdWRlcygnYWJiX2V4ZWMnKTtcbn07XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBsaXN0IG9mIHBhY2thZ2VzIGZyb20gRG96ZSB3aGl0ZWxpc3Qgb24gQW5kcm9pZCA4K1xuICpcbiAqIEByZXR1cm5zIHtBcnJheTxzdHJpbmc+fSBUaGUgbGlzdCBvZiB3aGl0ZWxpc3RlZCBwYWNrYWdlcy4gQW4gZXhhbXBsZSBvdXRwdXQ6XG4gKiBzeXN0ZW0sY29tLmFuZHJvaWQuc2hlbGwsMjAwMFxuICogc3lzdGVtLGNvbS5nb29nbGUuYW5kcm9pZC5jZWxsYnJvYWRjYXN0cmVjZWl2ZXIsMTAxNDNcbiAqIHVzZXIsaW8uYXBwaXVtLnNldHRpbmdzLDEwMTU3XG4gKi9cbm1ldGhvZHMuZ2V0RGV2aWNlSWRsZVdoaXRlbGlzdCA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZUlkbGVXaGl0ZWxpc3QgKCkge1xuICBpZiAoYXdhaXQgdGhpcy5nZXRBcGlMZXZlbCgpIDwgMjMpIHtcbiAgICAvLyBEb3plIG1vZGUgaGFzIG9ubHkgYmVlbiBhZGRlZCBzaW5jZSBBbmRyb2lkIDZcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBsb2cuaW5mbygnTGlzdGluZyBwYWNrYWdlcyBpbiBEb3plIHdoaXRlbGlzdCcpO1xuICBjb25zdCBvdXRwdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFsnZHVtcHN5cycsICdkZXZpY2VpZGxlJywgJ3doaXRlbGlzdCddKTtcbiAgcmV0dXJuIF8udHJpbShvdXRwdXQpLnNwbGl0KC9cXG4vKVxuICAgIC5tYXAoKGxpbmUpID0+IF8udHJpbShsaW5lKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pO1xufTtcblxuLyoqXG4gKiBBZGRzIGFuIGV4aXN0aW5nIHBhY2thZ2UocykgaW50byB0aGUgRG96ZSB3aGl0ZWxpc3Qgb24gQW5kcm9pZCA4K1xuICpcbiAqIEBwYXJhbSAgey4uLnN0cmluZ30gcGFja2FnZXMgT25lIG9yIG1vcmUgcGFja2FnZXMgdG8gYWRkLiBJZiB0aGUgcGFja2FnZVxuICogYWxyZWFkeSBleGlzdHMgaW4gdGhlIHdoaXRlbGlzdCB0aGVuIGl0IGlzIG9ubHkgZ29pbmcgdG8gYmUgYWRkZWQgb25jZS5cbiAqIElmIHRoZSBwYWNrYWdlIHdpdGggdGhlIGdpdmVuIG5hbWUgaXMgbm90IGluc3RhbGxlZC9ub3Qga25vd24gdGhlbiBhbiBlcnJvclxuICogd2lsbCBiZSB0aHJvd24uXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSBjb21tYW5kIHRvIGFkZCBwYWNrYWdlKHMpIGhhcyBiZWVuIGV4ZWN1dGVkXG4gKi9cbm1ldGhvZHMuYWRkVG9EZXZpY2VJZGxlV2hpdGVsaXN0ID0gYXN5bmMgZnVuY3Rpb24gYWRkVG9EZXZpY2VJZGxlV2hpdGVsaXN0ICguLi5wYWNrYWdlcykge1xuICBpZiAoXy5pc0VtcHR5KHBhY2thZ2VzKSB8fCBhd2FpdCB0aGlzLmdldEFwaUxldmVsKCkgPCAyMykge1xuICAgIC8vIERvemUgbW9kZSBoYXMgb25seSBiZWVuIGFkZGVkIHNpbmNlIEFuZHJvaWQgNlxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGxvZy5pbmZvKGBBZGRpbmcgJHt1dGlsLnBsdXJhbGl6ZSgncGFja2FnZScsIHBhY2thZ2VzLmxlbmd0aCl9ICR7SlNPTi5zdHJpbmdpZnkocGFja2FnZXMpfSB0byBEb3plIHdoaXRlbGlzdGApO1xuICBhd2FpdCB0aGlzLnNoZWxsQ2h1bmtzKChwa2cpID0+IFsnZHVtcHN5cycsICdkZXZpY2VpZGxlJywgJ3doaXRlbGlzdCcsIGArJHtwa2d9YF0sIHBhY2thZ2VzKTtcbiAgcmV0dXJuIHRydWU7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBtZXRob2RzO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUlBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLHVCQUF1QixHQUFHLElBQWhDO0FBQ0EsTUFBTUMseUJBQXlCLEdBQUcsbUNBQWxDO0FBQ0EsTUFBTUMsbUJBQW1CLEdBQUcsQ0FDMUJELHlCQUQwQixFQUUxQixxQkFGMEIsQ0FBNUI7QUFJQSxNQUFNRSxxQkFBcUIsR0FBRyxFQUE5QjtBQUNBLE1BQU1DLHNCQUFzQixHQUFHLENBQzdCLDhCQUQ2QixFQUU3QiwwQkFGNkIsRUFHN0IsbUJBSDZCLENBQS9CO0FBS0EsTUFBTUMsZ0JBQWdCLEdBQUcsS0FBekI7QUFDQSxNQUFNQyx5QkFBeUIsR0FBRyxNQUFsQztBQUNBLE1BQU1DLGdCQUFnQixHQUFHLElBQUlDLE1BQUosQ0FBWSxVQUFTSCxnQkFBaUIsV0FBVUMseUJBQTBCLFNBQTFFLEVBQW9GLEdBQXBGLENBQXpCO0FBRUEsTUFBTUcsd0JBQXdCLEdBQUcsbUJBQWpDO0FBRUEsTUFBTUMsT0FBTyxHQUFHLEVBQWhCOztBQWdCQUEsT0FBTyxDQUFDQyxXQUFSLEdBQXNCLGVBQWVBLFdBQWYsQ0FBNEJDLGNBQTVCLEVBQTRDQyxJQUE1QyxFQUFrRDtFQUN0RSxNQUFNQyxRQUFRLEdBQUcsRUFBakI7RUFDQSxJQUFJQyxRQUFRLEdBQUcsRUFBZjs7RUFDQSxLQUFL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
|
|
1150
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliL3Rvb2xzL2FkYi1jb21tYW5kcy5qcyIsIm5hbWVzIjpbIk1BWF9TSEVMTF9CVUZGRVJfTEVOR1RIIiwiTk9UX0NIQU5HRUFCTEVfUEVSTV9FUlJPUiIsIklHTk9SRURfUEVSTV9FUlJPUlMiLCJNQVhfUEdSRVBfUEFUVEVSTl9MRU4iLCJISURERU5fQVBJX1BPTElDWV9LRVlTIiwiUElEX0NPTFVNTl9USVRMRSIsIlBST0NFU1NfTkFNRV9DT0xVTU5fVElUTEUiLCJQU19USVRMRV9QQVRURVJOIiwiUmVnRXhwIiwiQURCX0lOUFVUX0VTQ0FQRV9QQVRURVJOIiwibWV0aG9kcyIsInNoZWxsQ2h1bmtzIiwiYXJnVHJhbnNmb3JtZXIiLCJhcmdzIiwiY29tbWFuZHMiLCJjbWRDaHVuayIsImFyZyIsIm5leHRDbWQiLCJfIiwiaXNBcnJheSIsIkVycm9yIiwibGFzdCIsInB1c2giLCJqb2luIiwibGVuZ3RoIiwiaXNFbXB0eSIsImxvZyIsImRlYnVnIiwiSlNPTiIsInN0cmluZ2lmeSIsImxhc3RFcnJvciIsImNtZCIsInNoZWxsIiwiZSIsImdldEFkYldpdGhDb3JyZWN0QWRiUGF0aCIsImV4ZWN1dGFibGUiLCJwYXRoIiwiZ2V0U2RrQmluYXJ5UGF0aCIsImFkYiIsImluaXRBYXB0IiwiaW5pdEFhcHQyIiwiaW5pdFppcEFsaWduIiwiaW5pdEJ1bmRsZXRvb2wiLCJiaW5hcmllcyIsImJ1bmRsZXRvb2wiLCJmcyIsIndoaWNoIiwiZXJyIiwiZ2V0QXBpTGV2ZWwiLCJpc0ludGVnZXIiLCJfYXBpTGV2ZWwiLCJzdHJPdXRwdXQiLCJnZXREZXZpY2VQcm9wZXJ0eSIsImFwaUxldmVsIiwicGFyc2VJbnQiLCJ0cmltIiwiY2hhckNvZGVRIiwiY2hhckNvZGVBdCIsImFwaUxldmVsRGlmZiIsImNvZGVuYW1lIiwiU3RyaW5nIiwiZnJvbUNoYXJDb2RlIiwiZ2V0UGxhdGZvcm1WZXJzaW9uIiwidG9Mb3dlckNhc2UiLCJ0b1VwcGVyQ2FzZSIsImlzTmFOIiwibWVzc2FnZSIsImluZm8iLCJpc0RldmljZUNvbm5lY3RlZCIsImRldmljZXMiLCJnZXRDb25uZWN0ZWREZXZpY2VzIiwibWtkaXIiLCJyZW1vdGVQYXRoIiwiaXNWYWxpZENsYXNzIiwiY2xhc3NTdHJpbmciLCJtYXRjaENvbXBvbmVudE5hbWUiLCJyZXNvbHZlTGF1bmNoYWJsZUFjdGl2aXR5IiwicGtnIiwib3B0cyIsInByZWZlckNtZCIsInN0ZG91dCIsIm5hbWVzIiwicGFyc2VMYXVuY2hhYmxlQWN0aXZpdHlOYW1lcyIsInRtcFJvb3QiLCJ0ZW1wRGlyIiwib3BlbkRpciIsInRtcEFwcCIsInB1bGxBcGsiLCJhcGtBY3Rpdml0eSIsInBhY2thZ2VBbmRMYXVuY2hBY3Rpdml0eUZyb21NYW5pZmVzdCIsInN0YWNrIiwid2FybiIsInJpbXJhZiIsInN0ZGVyciIsIm91dHB1dEZvcm1hdCIsIkVYRUNfT1VUUFVUX0ZPUk1BVCIsIkZVTEwiLCJsaW5lIiwic3BsaXQiLCJtYXAiLCJmb3JjZVN0b3AiLCJraWxsUGFja2FnZSIsImNsZWFyIiwiZ3JhbnRBbGxQZXJtaXNzaW9ucyIsImFwayIsInRhcmdldFNkayIsImR1bXBzeXNPdXRwdXQiLCJ0YXJnZXRTZGtWZXJzaW9uVXNpbmdQS0ciLCJ0YXJnZXRTZGtWZXJzaW9uRnJvbU1hbmlmZXN0IiwicmVxdWVzdGVkUGVybWlzc2lvbnMiLCJnZXRSZXFQZXJtaXNzaW9ucyIsImdyYW50ZWRQZXJtaXNzaW9ucyIsImdldEdyYW50ZWRQZXJtaXNzaW9ucyIsInBlcm1pc3Npb25zVG9HcmFudCIsImRpZmZlcmVuY2UiLCJncmFudFBlcm1pc3Npb25zIiwicGVybWlzc2lvbnMiLCJwZXJtIiwic29tZSIsInBhdHRlcm4iLCJ0ZXN0IiwiZ3JhbnRQZXJtaXNzaW9uIiwicGVybWlzc2lvbiIsInJldm9rZVBlcm1pc3Npb24iLCJjbWRPdXRwdXQiLCJleHRyYWN0TWF0Y2hpbmdQZXJtaXNzaW9ucyIsImdldERlbmllZFBlcm1pc3Npb25zIiwiZ2V0TG9jYXRpb25Qcm92aWRlcnMiLCJnZXRTZXR0aW5nIiwicCIsImZpbHRlciIsIkJvb2xlYW4iLCJ0b2dnbGVHUFNMb2NhdGlvblByb3ZpZGVyIiwiZW5hYmxlZCIsInNldFNldHRpbmciLCJzZXRIaWRkZW5BcGlQb2xpY3kiLCJ2YWx1ZSIsImlnbm9yZUVycm9yIiwiayIsInNldERlZmF1bHRIaWRkZW5BcGlQb2xpY3kiLCJzdG9wQW5kQ2xlYXIiLCJhdmFpbGFibGVJTUVzIiwiZ2V0SU1FTGlzdEZyb21PdXRwdXQiLCJlbmFibGVkSU1FcyIsImVuYWJsZUlNRSIsImltZUlkIiwiZGlzYWJsZUlNRSIsInNldElNRSIsImRlZmF1bHRJTUUiLCJlbmdpbmUiLCJrZXlldmVudCIsImtleWNvZGUiLCJjb2RlIiwiaW5wdXRUZXh0IiwidGV4dCIsIm9yaWdpbmFsU3RyIiwiZXNjYXBlZFRleHQiLCJyZXBsYWNlIiwiZXZlcnkiLCJjIiwiaW5jbHVkZXMiLCJxIiwiY2xlYXJUZXh0RmllbGQiLCJpIiwibG9jayIsImlzU2NyZWVuTG9ja2VkIiwidGltZW91dE1zIiwid2FpdEZvckNvbmRpdGlvbiIsIndhaXRNcyIsImludGVydmFsTXMiLCJiYWNrIiwiZ29Ub0hvbWUiLCJnZXRBZGJQYXRoIiwiZ2V0U2NyZWVuT3JpZW50YXRpb24iLCJnZXRTdXJmYWNlT3JpZW50YXRpb24iLCJzZW5kVGVsbmV0Q29tbWFuZCIsImNvbW1hbmQiLCJleGVjRW11Q29uc29sZUNvbW1hbmQiLCJwb3J0IiwiZ2V0RW11bGF0b3JQb3J0IiwiaXNBaXJwbGFuZU1vZGVPbiIsInNldEFpcnBsYW5lTW9kZSIsIm9uIiwiYnJvYWRjYXN0QWlycGxhbmVNb2RlIiwiaXNXaWZpT24iLCJpc0RhdGFPbiIsInNldFdpZmlBbmREYXRhIiwid2lmaSIsImRhdGEiLCJpc0VtdWxhdG9yIiwidXRpbCIsImhhc1ZhbHVlIiwic2V0V2lmaVN0YXRlIiwic2V0RGF0YVN0YXRlIiwiaXNBbmltYXRpb25PbiIsImFuaW1hdG9yX2R1cmF0aW9uX3NjYWxlIiwidHJhbnNpdGlvbl9hbmltYXRpb25fc2NhbGUiLCJ3aW5kb3dfYW5pbWF0aW9uX3NjYWxlIiwic2V0dGluZyIsImxvY2FsUGF0aCIsInBvc2l4IiwiZGlybmFtZSIsImFkYkV4ZWMiLCJwdWxsIiwidGltZW91dCIsInByb2Nlc3NFeGlzdHMiLCJwcm9jZXNzTmFtZSIsImdldFBJRHNCeU5hbWUiLCJnZXRGb3J3YXJkTGlzdCIsImNvbm5lY3Rpb25zIiwiRU9MIiwiZm9yd2FyZFBvcnQiLCJzeXN0ZW1Qb3J0IiwiZGV2aWNlUG9ydCIsInJlbW92ZVBvcnRGb3J3YXJkIiwiZ2V0UmV2ZXJzZUxpc3QiLCJyZXZlcnNlUG9ydCIsInJlbW92ZVBvcnRSZXZlcnNlIiwiZm9yd2FyZEFic3RyYWN0UG9ydCIsInBpbmciLCJpbmRleE9mIiwicmVzdGFydCIsInN0b3BMb2djYXQiLCJyZXN0YXJ0QWRiIiwid2FpdEZvckRldmljZSIsInN0YXJ0TG9nY2F0IiwiX2xvZ2NhdFN0YXJ0dXBQYXJhbXMiLCJsb2djYXQiLCJMb2djYXQiLCJkZWJ1Z1RyYWNlIiwiY2xlYXJEZXZpY2VMb2dzT25TdGFydCIsInN0YXJ0Q2FwdHVyZSIsInN0b3BDYXB0dXJlIiwiZ2V0TG9nY2F0TG9ncyIsImdldExvZ3MiLCJzZXRMb2djYXRMaXN0ZW5lciIsImxpc3RlbmVyIiwicmVtb3ZlTG9nY2F0TGlzdGVuZXIiLCJyZW1vdmVMaXN0ZW5lciIsImxpc3RQcm9jZXNzU3RhdHVzIiwiaXNCb29sZWFuIiwiX2RvZXNQc1N1cHBvcnRBT3B0aW9uIiwiZ2V0TmFtZUJ5UGlkIiwicGlkIiwidGl0bGVNYXRjaCIsImV4ZWMiLCJhbGxUaXRsZXMiLCJwaWRJbmRleCIsIm5hbWVPZmZzZXQiLCJwaWRSZWdleCIsIm1hdGNoZWRMaW5lIiwiaXRlbXMiLCJuYW1lIiwiX2lzUGdyZXBBdmFpbGFibGUiLCJwZ3JlcE91dHB1dCIsIl9jYW5QZ3JlcFVzZUZ1bGxDbWRMaW5lU2VhcmNoIiwiX2lzUGlkb2ZBdmFpbGFibGUiLCJzaGVsbENvbW1hbmQiLCJlc2NhcGVSZWdFeHAiLCJzbGljZSIsIngiLCJwaWRzIiwicHJvY2Vzc05hbWVSZWdleCIsImtpbGxQcm9jZXNzZXNCeU5hbWUiLCJCIiwiYWxsIiwia2lsbFByb2Nlc3NCeVBJRCIsIm5vUHJvY2Vzc0ZsYWciLCJwcml2aWxlZ2VkIiwiZTEiLCJicm9hZGNhc3RQcm9jZXNzRW5kIiwiaW50ZW50IiwiYnJvYWRjYXN0Iiwic3RhcnQiLCJEYXRlIiwibm93Iiwic2xlZXAiLCJlbmRBbmRyb2lkQ292ZXJhZ2UiLCJpbnN0cnVtZW50UHJvYyIsImlzUnVubmluZyIsInN0b3AiLCJpbnN0cnVtZW50IiwiYWN0aXZpdHkiLCJpbnN0cnVtZW50V2l0aCIsInBrZ0FjdGl2aXR5IiwiYW5kcm9pZENvdmVyYWdlIiwiaW5zdHJ1bWVudENsYXNzIiwid2FpdFBrZyIsIndhaXRBY3Rpdml0eSIsInJlc29sdmUiLCJyZWplY3QiLCJkZWZhdWx0QXJncyIsImNvbmNhdCIsIlN1YlByb2Nlc3MiLCJ3YWl0Rm9yQWN0aXZpdHkiLCJwcm9wZXJ0eSIsInZhbCIsInNldERldmljZVByb3BlcnR5IiwicHJvcCIsImdldERldmljZVN5c0xhbmd1YWdlIiwiZ2V0RGV2aWNlU3lzQ291bnRyeSIsImdldERldmljZVN5c0xvY2FsZSIsImdldERldmljZVByb2R1Y3RMYW5ndWFnZSIsImdldERldmljZVByb2R1Y3RDb3VudHJ5IiwiZ2V0RGV2aWNlUHJvZHVjdExvY2FsZSIsImdldE1vZGVsIiwiZ2V0TWFudWZhY3R1cmVyIiwiZ2V0U2NyZWVuU2l6ZSIsInNpemUiLCJnZXRTY3JlZW5EZW5zaXR5IiwiZGVuc2l0eSIsImRlbnNpdHlOdW1iZXIiLCJzZXRIdHRwUHJveHkiLCJwcm94eUhvc3QiLCJwcm94eVBvcnQiLCJwcm94eSIsImlzVW5kZWZpbmVkIiwiaHR0cFByb3h5U2V0dGlucyIsInNldHRpbmdLZXkiLCJzZXR0aW5nVmFsdWUiLCJkZWxldGVIdHRwUHJveHkiLCJuYW1lc3BhY2UiLCJidWdyZXBvcnQiLCJzY3JlZW5yZWNvcmQiLCJkZXN0aW5hdGlvbiIsIm9wdGlvbnMiLCJ2aWRlb1NpemUiLCJiaXRSYXRlIiwidGltZUxpbWl0IiwiYnVnUmVwb3J0IiwiZnVsbENtZCIsInF1b3RlIiwicnVuSW5JbWVDb250ZXh0IiwiaW1lIiwiZm4iLCJvcmlnaW5hbEltZSIsImRlbGF5IiwiZ2V0VGltZVpvbmUiLCJsaXN0RmVhdHVyZXMiLCJfbWVtb2l6ZWRGZWF0dXJlcyIsIm1lbW9pemUiLCJjdXJEZXZpY2VJZCIsImlzU3RyZWFtZWRJbnN0YWxsU3VwcG9ydGVkIiwicHJvdG8iLCJPYmplY3QiLCJnZXRQcm90b3R5cGVPZiIsIl9oZWxwT3V0cHV0IiwiaXNJbmNyZW1lbnRhbEluc3RhbGxTdXBwb3J0ZWQiLCJiaW5hcnkiLCJnZXRWZXJzaW9uIiwiY29tcGFyZVZlcnNpb25zIiwidmVyc2lvbiIsImdldERldmljZUlkbGVXaGl0ZWxpc3QiLCJvdXRwdXQiLCJhZGRUb0RldmljZUlkbGVXaGl0ZWxpc3QiLCJwYWNrYWdlcyIsInBsdXJhbGl6ZSJdLCJzb3VyY2VSb290IjoiLi4vLi4vLi4iLCJzb3VyY2VzIjpbImxpYi90b29scy9hZGItY29tbWFuZHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHtcbiAgZ2V0SU1FTGlzdEZyb21PdXRwdXQsIGdldFN1cmZhY2VPcmllbnRhdGlvbiwgZXh0cmFjdE1hdGNoaW5nUGVybWlzc2lvbnMsXG4gIHBhcnNlTGF1bmNoYWJsZUFjdGl2aXR5TmFtZXMsIG1hdGNoQ29tcG9uZW50TmFtZSxcbn0gZnJvbSAnLi4vaGVscGVycy5qcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBmcywgdXRpbCwgdGVtcERpciB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyBFT0wgfSBmcm9tICdvcyc7XG5pbXBvcnQgTG9nY2F0IGZyb20gJy4uL2xvZ2NhdCc7XG5pbXBvcnQgeyBzbGVlcCwgd2FpdEZvckNvbmRpdGlvbiB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IFN1YlByb2Nlc3MgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuXG5jb25zdCBNQVhfU0hFTExfQlVGRkVSX0xFTkdUSCA9IDEwMDA7XG5jb25zdCBOT1RfQ0hBTkdFQUJMRV9QRVJNX0VSUk9SID0gL25vdCBhIGNoYW5nZWFibGUgcGVybWlzc2lvbiB0eXBlL2k7XG5jb25zdCBJR05PUkVEX1BFUk1fRVJST1JTID0gW1xuICBOT1RfQ0hBTkdFQUJMRV9QRVJNX0VSUk9SLFxuICAvVW5rbm93biBwZXJtaXNzaW9uL2ksXG5dO1xuY29uc3QgTUFYX1BHUkVQX1BBVFRFUk5fTEVOID0gMTU7XG5jb25zdCBISURERU5fQVBJX1BPTElDWV9LRVlTID0gW1xuICAnaGlkZGVuX2FwaV9wb2xpY3lfcHJlX3BfYXBwcycsXG4gICdoaWRkZW5fYXBpX3BvbGljeV9wX2FwcHMnLFxuICAnaGlkZGVuX2FwaV9wb2xpY3knXG5dO1xuY29uc3QgUElEX0NPTFVNTl9USVRMRSA9ICdQSUQnO1xuY29uc3QgUFJPQ0VTU19OQU1FX0NPTFVNTl9USVRMRSA9ICdOQU1FJztcbmNvbnN0IFBTX1RJVExFX1BBVFRFUk4gPSBuZXcgUmVnRXhwKGBeKC4qXFxcXGIke1BJRF9DT0xVTU5fVElUTEV9XFxcXGIuKlxcXFxiJHtQUk9DRVNTX05BTUVfQ09MVU1OX1RJVExFfVxcXFxiLiopJGAsICdtJyk7XG4vLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yNTc5MTQyMy9hZGItc2hlbGwtaW5wdXQtdGV4dC1kb2VzLW5vdC10YWtlLWFtcGVyc2FuZC1jaGFyYWN0ZXIvMjU3OTE0OThcbmNvbnN0IEFEQl9JTlBVVF9FU0NBUEVfUEFUVEVSTiA9IC9bKCk8Pnw7JipcXFxcfl5cIiddL2c7XG5cbmNvbnN0IG1ldGhvZHMgPSB7fTtcblxuLyoqXG4gKiBDcmVhdGVzIGNodW5rcyBmb3IgdGhlIGdpdmVuIGFyZ3VtZW50cyBhbmQgZXhlY3V0ZXMgdGhlbSBpbiBgYWRiIHNoZWxsYC5cbiAqIFRoaXMgaXMgZmFzdGVyIHRoYW4gY2FsbGluZyBgYWRiIHNoZWxsYCBzZXBhcmF0ZWx5IGZvciBlYWNoIGFyZywgaG93ZXZlclxuICogdGhlcmUgaXMgYSBsaW1pdCBmb3IgYSBtYXhpbXVtIGxlbmd0aCBvZiBhIHNpbmdsZSBhZGIgY29tbWFuZC4gdGhhdCBpcyB3aHlcbiAqIHdlIG5lZWQgYWxsIHRoaXMgY29tcGxpY2F0ZWQgbG9naWMuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gYXJnVHJhbnNmb3JtZXIgQSBmdW5jdGlvbiwgdGhhdCByZWNlaXZlcyBzaW5nbGUgYXJndW1lbnRcbiAqIGZyb20gdGhlIGBhcmdzYCBhcnJheSBhbmQgdHJhbnNmb3JtcyBpdCBpbnRvIGEgc2hlbGwgY29tbWFuZC4gVGhlIHJlc3VsdFxuICogb2YgdGhlIGZ1bmN0aW9uIG11c3QgYmUgYW4gYXJyYXksIHdoZXJlIGVhY2ggaXRlbSBpcyBhIHBhcnQgb2YgYSBzaW5nbGUgY29tbWFuZC5cbiAqIFRoZSBsYXN0IGl0ZW0gb2YgdGhlIGFycmF5IGNvdWxkIGJlICc7Jy4gSWYgdGhpcyBpcyBub3QgYSBzZW1pY29sb24gdGhlbiBpdCBpcyBnb2luZyB0b1xuICogYmUgYWRkZWQgYXV0b21hdGljYWxseS5cbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyfHN0cmluZz59IGFyZ3MgQXJyYXkgb2YgYXJndW1lbnQgdmFsdWVzIHRvIGNyZWF0ZSBjaHVua3MgZm9yXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgYW55IG9mIHRoZSBjaHVua3MgcmV0dXJucyBub24temVybyBleGl0IGNvZGUgYWZ0ZXIgYmVpbmcgZXhlY3V0ZWRcbiAqL1xubWV0aG9kcy5zaGVsbENodW5rcyA9IGFzeW5jIGZ1bmN0aW9uIHNoZWxsQ2h1bmtzIChhcmdUcmFuc2Zvcm1lciwgYXJncykge1xuICBjb25zdCBjb21tYW5kcyA9IFtdO1xuICBsZXQgY21kQ2h1bmsgPSBbXTtcbiAgZm9yIChjb25zdCBhcmcgb2YgYXJncykge1xuICAgIGNvbnN0IG5leHRDbWQgPSBhcmdUcmFuc2Zvcm1lcihhcmcpO1xuICAgIGlmICghXy5pc0FycmF5KG5leHRDbWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FyZ3VtZW50IHRyYW5zZm9ybWVyIG11c3QgcmVzdWx0IGluIGFuIGFycmF5Jyk7XG4gICAgfVxuICAgIGlmIChfLmxhc3QobmV4dENtZCkgIT09ICc7Jykge1xuICAgICAgbmV4dENtZC5wdXNoKCc7Jyk7XG4gICAgfVxuICAgIGlmIChuZXh0Q21kLmpvaW4oJyAnKS5sZW5ndGggKyBjbWRDaHVuay5qb2luKCcgJykubGVuZ3RoID49IE1BWF9TSEVMTF9CVUZGRVJfTEVOR1RIKSB7XG4gICAgICBjb21tYW5kcy5wdXNoKGNtZENodW5rKTtcbiAgICAgIGNtZENodW5rID0gW107XG4gICAgfVxuICAgIGNtZENodW5rID0gWy4uLmNtZENodW5rLCAuLi5uZXh0Q21kXTtcbiAgfVxuICBpZiAoIV8uaXNFbXB0eShjbWRDaHVuaykpIHtcbiAgICBjb21tYW5kcy5wdXNoKGNtZENodW5rKTtcbiAgfVxuICBsb2cuZGVidWcoYEdvdCB0aGUgZm9sbG93aW5nIGNvbW1hbmQgY2h1bmtzIHRvIGV4ZWN1dGU6ICR7SlNPTi5zdHJpbmdpZnkoY29tbWFuZHMpfWApO1xuICBsZXQgbGFzdEVycm9yID0gbnVsbDtcbiAgZm9yIChjb25zdCBjbWQgb2YgY29tbWFuZHMpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5zaGVsbChjbWQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxhc3RFcnJvciA9IGU7XG4gICAgfVxuICB9XG4gIGlmIChsYXN0RXJyb3IpIHtcbiAgICB0aHJvdyBsYXN0RXJyb3I7XG4gIH1cbn07XG5cbi8qKlxuICogR2V0IHRoZSBwYXRoIHRvIGFkYiBleGVjdXRhYmxlIGFtZCBhc3NpZ24gaXRcbiAqIHRvIHRoaXMuZXhlY3V0YWJsZS5wYXRoIGFuZCB0aGlzLmJpbmFyaWVzLmFkYiBwcm9wZXJ0aWVzLlxuICpcbiAqIEByZXR1cm4ge0FEQn0gQURCIGluc3RhbmNlLlxuICovXG5tZXRob2RzLmdldEFkYldpdGhDb3JyZWN0QWRiUGF0aCA9IGFzeW5jIGZ1bmN0aW9uIGdldEFkYldpdGhDb3JyZWN0QWRiUGF0aCAoKSB7XG4gIHRoaXMuZXhlY3V0YWJsZS5wYXRoID0gYXdhaXQgdGhpcy5nZXRTZGtCaW5hcnlQYXRoKCdhZGInKTtcbiAgcmV0dXJuIHRoaXMuYWRiO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGZ1bGwgcGF0aCB0byBhYXB0IHRvb2wgYW5kIGFzc2lnbiBpdCB0b1xuICogdGhpcy5iaW5hcmllcy5hYXB0IHByb3BlcnR5XG4gKi9cbm1ldGhvZHMuaW5pdEFhcHQgPSBhc3luYyBmdW5jdGlvbiBpbml0QWFwdCAoKSB7XG4gIGF3YWl0IHRoaXMuZ2V0U2RrQmluYXJ5UGF0aCgnYWFwdCcpO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGZ1bGwgcGF0aCB0byBhYXB0MiB0b29sIGFuZCBhc3NpZ24gaXQgdG9cbiAqIHRoaXMuYmluYXJpZXMuYWFwdDIgcHJvcGVydHlcbiAqL1xubWV0aG9kcy5pbml0QWFwdDIgPSBhc3luYyBmdW5jdGlvbiBpbml0QWFwdDIgKCkge1xuICBhd2FpdCB0aGlzLmdldFNka0JpbmFyeVBhdGgoJ2FhcHQyJyk7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgZnVsbCBwYXRoIHRvIHppcGFsaWduIHRvb2wgYW5kIGFzc2lnbiBpdCB0b1xuICogdGhpcy5iaW5hcmllcy56aXBhbGlnbiBwcm9wZXJ0eVxuICovXG5tZXRob2RzLmluaXRaaXBBbGlnbiA9IGFzeW5jIGZ1bmN0aW9uIGluaXRaaXBBbGlnbiAoKSB7XG4gIGF3YWl0IHRoaXMuZ2V0U2RrQmluYXJ5UGF0aCgnemlwYWxpZ24nKTtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBmdWxsIHBhdGggdG8gYnVuZGxldG9vbCBiaW5hcnkgYW5kIGFzc2lnbiBpdCB0b1xuICogdGhpcy5iaW5hcmllcy5idW5kbGV0b29sIHByb3BlcnR5XG4gKi9cbm1ldGhvZHMuaW5pdEJ1bmRsZXRvb2wgPSBhc3luYyBmdW5jdGlvbiBpbml0QnVuZGxldG9vbCAoKSB7XG4gIHRyeSB7XG4gICAgdGhpcy5iaW5hcmllcy5idW5kbGV0b29sID0gYXdhaXQgZnMud2hpY2goJ2J1bmRsZXRvb2wuamFyJyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRocm93IG5ldyBFcnJvcignYnVuZGxldG9vbC5qYXIgYmluYXJ5IGlzIGV4cGVjdGVkIHRvIGJlIHByZXNlbnQgaW4gUEFUSC4gJyArXG4gICAgICAnVmlzaXQgaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9idW5kbGV0b29sIGZvciBtb3JlIGRldGFpbHMuJyk7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIEFQSSBsZXZlbCBvZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgQVBJIGxldmVsIGFzIGludGVnZXIgbnVtYmVyLCBmb3IgZXhhbXBsZSAyMSBmb3JcbiAqICAgICAgICAgICAgICAgICAgQW5kcm9pZCBMb2xsaXBvcC4gVGhlIHJlc3VsdCBvZiB0aGlzIG1ldGhvZCBpcyBjYWNoZWQsIHNvIGFsbCB0aGUgZnVydGhlclxuICogY2FsbHMgcmV0dXJuIHRoZSBzYW1lIHZhbHVlIGFzIHRoZSBmaXJzdCBvbmUuXG4gKi9cbm1ldGhvZHMuZ2V0QXBpTGV2ZWwgPSBhc3luYyBmdW5jdGlvbiBnZXRBcGlMZXZlbCAoKSB7XG4gIGlmICghXy5pc0ludGVnZXIodGhpcy5fYXBpTGV2ZWwpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0ck91dHB1dCA9IGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3JvLmJ1aWxkLnZlcnNpb24uc2RrJyk7XG4gICAgICBsZXQgYXBpTGV2ZWwgPSBwYXJzZUludChzdHJPdXRwdXQudHJpbSgpLCAxMCk7XG5cbiAgICAgIC8vIFdvcmthcm91bmQgZm9yIHByZXZpZXcvYmV0YSBwbGF0Zm9ybSBBUEkgbGV2ZWxcbiAgICAgIGNvbnN0IGNoYXJDb2RlUSA9ICdxJy5jaGFyQ29kZUF0KDApO1xuICAgICAgLy8gMjggaXMgdGhlIGZpcnN0IEFQSSBMZXZlbCwgd2hlcmUgQW5kcm9pZCBTREsgc3RhcnRlZCByZXR1cm5pbmcgbGV0dGVycyBpbiByZXNwb25zZSB0byBnZXRQbGF0Zm9ybVZlcnNpb25cbiAgICAgIGNvbnN0IGFwaUxldmVsRGlmZiA9IGFwaUxldmVsIC0gMjg7XG4gICAgICBjb25zdCBjb2RlbmFtZSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhckNvZGVRICsgYXBpTGV2ZWxEaWZmKTtcbiAgICAgIGlmIChhcGlMZXZlbERpZmYgPj0gMCAmJiAoYXdhaXQgdGhpcy5nZXRQbGF0Zm9ybVZlcnNpb24oKSkudG9Mb3dlckNhc2UoKSA9PT0gY29kZW5hbWUpIHtcbiAgICAgICAgbG9nLmRlYnVnKGBSZWxlYXNlIHZlcnNpb24gaXMgJHtjb2RlbmFtZS50b1VwcGVyQ2FzZSgpfSBidXQgZm91bmQgQVBJIExldmVsICR7YXBpTGV2ZWx9LiBTZXR0aW5nIEFQSSBMZXZlbCB0byAke2FwaUxldmVsICsgMX1gKTtcbiAgICAgICAgYXBpTGV2ZWwrKztcbiAgICAgIH1cblxuICAgICAgdGhpcy5fYXBpTGV2ZWwgPSBhcGlMZXZlbDtcbiAgICAgIGxvZy5kZWJ1ZyhgRGV2aWNlIEFQSSBsZXZlbDogJHt0aGlzLl9hcGlMZXZlbH1gKTtcbiAgICAgIGlmIChpc05hTih0aGlzLl9hcGlMZXZlbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgYWN0dWFsIG91dHB1dCAnJHtzdHJPdXRwdXR9JyBjYW5ub3QgYmUgY29udmVydGVkIHRvIGFuIGludGVnZXJgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGdldHRpbmcgZGV2aWNlIEFQSSBsZXZlbC4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGhpcy5fYXBpTGV2ZWw7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBwbGF0Zm9ybSB2ZXJzaW9uIG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBwbGF0Zm9ybSB2ZXJzaW9uIGFzIGEgc3RyaW5nLCBmb3IgZXhhbXBsZSAnNS4wJyBmb3JcbiAqIEFuZHJvaWQgTG9sbGlwb3AuXG4gKi9cbm1ldGhvZHMuZ2V0UGxhdGZvcm1WZXJzaW9uID0gYXN5bmMgZnVuY3Rpb24gZ2V0UGxhdGZvcm1WZXJzaW9uICgpIHtcbiAgbG9nLmluZm8oJ0dldHRpbmcgZGV2aWNlIHBsYXRmb3JtIHZlcnNpb24nKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncm8uYnVpbGQudmVyc2lvbi5yZWxlYXNlJyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGdldHRpbmcgZGV2aWNlIHBsYXRmb3JtIHZlcnNpb24uIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBWZXJpZnkgd2hldGhlciBhIGRldmljZSBpcyBjb25uZWN0ZWQuXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBhdCBsZWFzdCBvbmUgZGV2aWNlIGlzIHZpc2libGUgdG8gYWRiLlxuICovXG5tZXRob2RzLmlzRGV2aWNlQ29ubmVjdGVkID0gYXN5bmMgZnVuY3Rpb24gaXNEZXZpY2VDb25uZWN0ZWQgKCkge1xuICBsZXQgZGV2aWNlcyA9IGF3YWl0IHRoaXMuZ2V0Q29ubmVjdGVkRGV2aWNlcygpO1xuICByZXR1cm4gZGV2aWNlcy5sZW5ndGggPiAwO1xufTtcblxuLyoqXG4gKiBSZWN1cnNpdmVseSBjcmVhdGUgYSBuZXcgZm9sZGVyIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtb3RlUGF0aCAtIFRoZSBuZXcgcGF0aCB0byBiZSBjcmVhdGVkLlxuICogQHJldHVybiB7c3RyaW5nfSBta2RpciBjb21tYW5kIG91dHB1dC5cbiAqL1xubWV0aG9kcy5ta2RpciA9IGFzeW5jIGZ1bmN0aW9uIG1rZGlyIChyZW1vdGVQYXRoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnNoZWxsKFsnbWtkaXInLCAnLXAnLCByZW1vdGVQYXRoXSk7XG59O1xuXG4vKipcbiAqIFZlcmlmeSB3aGV0aGVyIHRoZSBnaXZlbiBhcmd1bWVudCBpcyBhXG4gKiB2YWxpZCBjbGFzcyBuYW1lLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc1N0cmluZyAtIFRoZSBhY3R1YWwgY2xhc3MgbmFtZSB0byBiZSB2ZXJpZmllZC5cbiAqIEByZXR1cm4gez9BcnJheS48TWF0Y2g+fSBUaGUgcmVzdWx0IG9mIFJlZ2V4cC5leGVjIG9wZXJhdGlvblxuICogICAgICAgICAgICAgICAgICAgICAgICAgIG9yIF9udWxsXyBpZiBubyBtYXRjaGVzIGFyZSBmb3VuZC5cbiAqL1xubWV0aG9kcy5pc1ZhbGlkQ2xhc3MgPSBmdW5jdGlvbiBpc1ZhbGlkQ2xhc3MgKGNsYXNzU3RyaW5nKSB7XG4gIC8vIHNvbWUucGFja2FnZS9zb21lLnBhY2thZ2UuQWN0aXZpdHlcbiAgcmV0dXJuIG1hdGNoQ29tcG9uZW50TmFtZShjbGFzc1N0cmluZyk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFJlc29sdmVBY3Rpdml0eU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbj99IHByZWZlckNtZCBbdHJ1ZV0gV2hldGhlciB0byBwcmVmZXIgYGNtZGAgdG9vbCB1c2FnZSBmb3JcbiAqIGxhdW5jaGFibGUgYWN0aXZpdHkgbmFtZSBkZXRlY3Rpb24uIEl0IG1pZ2h0IGJlIHVzZWZ1bCB0byBkaXNhYmxlIGl0IGlmXG4gKiBgY21kIHBhY2thZ2UgcmVzb2x2ZS1hY3Rpdml0eWAgcmV0dXJucyAnYW5kcm9pZC9jb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuUmVzb2x2ZXJBY3Rpdml0eScsXG4gKiB3aGljaCBtZWFucyB0aGUgYXBwIGhhcyBubyBkZWZhdWx0IGhhbmRsZXIgc2V0IGluIHN5c3RlbSBzZXR0aW5ncy5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9pc3N1ZXMvMTcxMjggZm9yIG1vcmUgZGV0YWlscy5cbiAqIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3QgaWYgdGhlIHRhcmdldCBBbmRyb2lkIHZlcnNpb24gaXMgYmVsb3cgMjQgYXMgdGhlcmVcbiAqIHRoZSBjb3JyZXNwb25kaW5nIGBjbWRgIHN1YmNvbW1hbmQgaXMgbm90IGltcGxlbWVudGVkIGFuZCBkdW1wc3lzIHVzYWdlIGlzIHRoZSBvbmx5XG4gKiBwb3NzaWJsZSB3YXkgdG8gZGV0ZWN0IHRoZSBsYXVuY2hhYmxlIGFjdGl2aXR5IG5hbWUuXG4gKi9cblxuLyoqXG4gKiBGZXRjaGVzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgbGF1bmNoYWJsZSBhY3Rpdml0eSBmb3IgdGhlXG4gKiBnaXZlbiBwYWNrYWdlLiBJdCBpcyBleHBlY3RlZCB0aGUgcGFja2FnZSBpcyBhbHJlYWR5IGluc3RhbGxlZCBvblxuICogdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgdGFyZ2V0IHBhY2thZ2UgaWRlbnRpZmllclxuICogQHBhcmFtIHtSZXNvbHZlQWN0aXZpdHlPcHRpb25zP30gb3B0c1xuICogQHJldHVybiB7c3RyaW5nfSBGdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgbGF1bmNoYWJsZSBhY3Rpdml0eVxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSByZXNvbHZpbmcgdGhlIGFjdGl2aXR5IG5hbWVcbiAqL1xubWV0aG9kcy5yZXNvbHZlTGF1bmNoYWJsZUFjdGl2aXR5ID0gYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUxhdW5jaGFibGVBY3Rpdml0eSAocGtnLCBvcHRzID0ge30pIHtcbiAgY29uc3QgeyBwcmVmZXJDbWQgPSB0cnVlIH0gPSBvcHRzO1xuICBpZiAoIXByZWZlckNtZCB8fCBhd2FpdCB0aGlzLmdldEFwaUxldmVsKCkgPCAyNCkge1xuICAgIGNvbnN0IHN0ZG91dCA9IGF3YWl0IHRoaXMuc2hlbGwoWydkdW1wc3lzJywgJ3BhY2thZ2UnLCBwa2ddKTtcbiAgICBjb25zdCBuYW1lcyA9IHBhcnNlTGF1bmNoYWJsZUFjdGl2aXR5TmFtZXMoc3Rkb3V0KTtcbiAgICBpZiAoXy5pc0VtcHR5KG5hbWVzKSkge1xuICAgICAgbG9nLmRlYnVnKHN0ZG91dCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byByZXNvbHZlIHRoZSBsYXVuY2hhYmxlIGFjdGl2aXR5IG9mICcke3BrZ30nLiBJcyBpdCBpbnN0YWxsZWQgb24gdGhlIGRldmljZT9gKTtcbiAgICB9XG4gICAgaWYgKG5hbWVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIG5hbWVzWzBdO1xuICAgIH1cblxuICAgIGNvbnN0IHRtcFJvb3QgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdG1wQXBwID0gYXdhaXQgdGhpcy5wdWxsQXBrKHBrZywgdG1wUm9vdCk7XG4gICAgICBjb25zdCB7YXBrQWN0aXZpdHl9ID0gYXdhaXQgdGhpcy5wYWNrYWdlQW5kTGF1bmNoQWN0aXZpdHlGcm9tTWFuaWZlc3QodG1wQXBwKTtcbiAgICAgIHJldHVybiBhcGtBY3Rpdml0eTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2cuZGVidWcoZS5zdGFjayk7XG4gICAgICBsb2cud2FybihgVW5hYmxlIHRvIHJlc29sdmUgdGhlIGxhdW5jaGFibGUgYWN0aXZpdHkgb2YgJyR7cGtnfScuIGAgK1xuICAgICAgICBgVGhlIHZlcnkgZmlyc3QgbWF0Y2ggb2YgdGhlIGR1bXBzeXMgb3V0cHV0IGlzIGdvaW5nIHRvIGJlIHVzZWQuIGAgK1xuICAgICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgcmV0dXJuIG5hbWVzWzBdO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBmcy5yaW1yYWYodG1wUm9vdCk7XG4gICAgfVxuICB9XG4gIGNvbnN0IHtzdGRvdXQsIHN0ZGVycn0gPSBhd2FpdCB0aGlzLnNoZWxsKFsnY21kJywgJ3BhY2thZ2UnLCAncmVzb2x2ZS1hY3Rpdml0eScsICctLWJyaWVmJywgcGtnXSwge1xuICAgIG91dHB1dEZvcm1hdDogdGhpcy5FWEVDX09VVFBVVF9GT1JNQVQuRlVMTFxuICB9KTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIChzdGRvdXQgfHwgJycpLnNwbGl0KCdcXG4nKS5tYXAoXy50cmltKSkge1xuICAgIGlmICh0aGlzLmlzVmFsaWRDbGFzcyhsaW5lKSkge1xuICAgICAgcmV0dXJuIGxpbmU7XG4gICAgfVxuICB9XG4gIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHJlc29sdmUgdGhlIGxhdW5jaGFibGUgYWN0aXZpdHkgb2YgJyR7cGtnfScuIE9yaWdpbmFsIGVycm9yOiAke3N0ZGVyciB8fCBzdGRvdXR9YCk7XG59O1xuXG4vKipcbiAqIEZvcmNlIGFwcGxpY2F0aW9uIHRvIHN0b3Agb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIHN0b3BwZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBvdXRwdXQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYWRiIGNvbW1hbmQuXG4gKi9cbm1ldGhvZHMuZm9yY2VTdG9wID0gYXN5bmMgZnVuY3Rpb24gZm9yY2VTdG9wIChwa2cpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuc2hlbGwoWydhbScsICdmb3JjZS1zdG9wJywgcGtnXSk7XG59O1xuXG4vKlxuICogS2lsbCBhcHBsaWNhdGlvblxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIHN0b3BwZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBvdXRwdXQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYWRiIGNvbW1hbmQuXG4gKi9cbm1ldGhvZHMua2lsbFBhY2thZ2UgPSBhc3luYyBmdW5jdGlvbiBraWxsUGFja2FnZSAocGtnKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnNoZWxsKFsnYW0nLCAna2lsbCcsIHBrZ10pO1xufTtcblxuLyoqXG4gKiBDbGVhciB0aGUgdXNlciBkYXRhIG9mIHRoZSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uIG9uIHRoZSBkZXZpY2VcbiAqIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgY2xlYXJlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG91dHB1dCBvZiB0aGUgY29ycmVzcG9uZGluZyBhZGIgY29tbWFuZC5cbiAqL1xubWV0aG9kcy5jbGVhciA9IGFzeW5jIGZ1bmN0aW9uIGNsZWFyIChwa2cpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuc2hlbGwoWydwbScsICdjbGVhcicsIHBrZ10pO1xufTtcblxuLyoqXG4gKiBHcmFudCBhbGwgcGVybWlzc2lvbnMgcmVxdWVzdGVkIGJ5IHRoZSBwYXJ0aWN1bGFyIHBhY2thZ2UuXG4gKiBUaGlzIG1ldGhvZCBpcyBvbmx5IHVzZWZ1bCBvbiBBbmRyb2lkIDYuMCsgYW5kIGZvciBhcHBsaWNhdGlvbnNcbiAqIHRoYXQgc3VwcG9ydCBjb21wb25lbnRzLWJhc2VkIHBlcm1pc3Npb25zIHNldHRpbmcuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtzdHJpbmd9IGFwayAtIFRoZSBwYXRoIHRvIHRoZSBhY3R1YWwgYXBrIGZpbGUuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGdyYW50aW5nIHBlcm1pc3Npb25zXG4gKi9cbm1ldGhvZHMuZ3JhbnRBbGxQZXJtaXNzaW9ucyA9IGFzeW5jIGZ1bmN0aW9uIGdyYW50QWxsUGVybWlzc2lvbnMgKHBrZywgYXBrKSB7XG4gIGNvbnN0IGFwaUxldmVsID0gYXdhaXQgdGhpcy5nZXRBcGlMZXZlbCgpO1xuICBsZXQgdGFyZ2V0U2RrID0gMDtcbiAgbGV0IGR1bXBzeXNPdXRwdXQgPSBudWxsO1xuICB0cnkge1xuICAgIGlmICghYXBrKSB7XG4gICAgICAvKipcbiAgICAgICAqIElmIGFwayBub3QgcHJvdmlkZWQsIGNvbnNpZGVyaW5nIGFwayBhbHJlYWR5IGluc3RhbGxlZCBvbiB0aGUgZGV2aWNlXG4gICAgICAgKiBhbmQgZmV0Y2hpbmcgdGFyZ2V0U2RrIHVzaW5nIHBhY2thZ2UgbmFtZS5cbiAgICAgICAqL1xuICAgICAgZHVtcHN5c091dHB1dCA9IGF3YWl0IHRoaXMuc2hlbGwoWydkdW1wc3lzJywgJ3BhY2thZ2UnLCBwa2ddKTtcbiAgICAgIHRhcmdldFNkayA9IGF3YWl0IHRoaXMudGFyZ2V0U2RrVmVyc2lvblVzaW5nUEtHKHBrZywgZHVtcHN5c091dHB1dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldFNkayA9IGF3YWl0IHRoaXMudGFyZ2V0U2RrVmVyc2lvbkZyb21NYW5pZmVzdChhcGspO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vYXZvaWRpbmcgbG9nZ2luZyBlcnJvciBzdGFjaywgYXMgY2FsbGluZyBsaWJyYXJ5IGZ1bmN0aW9uIHdvdWxkIGhhdmUgbG9nZ2VkXG4gICAgbG9nLndhcm4oYFJhbiBpbnRvIHByb2JsZW0gZ2V0dGluZyB0YXJnZXQgU0RLIHZlcnNpb247IGlnbm9yaW5nLi4uYCk7XG4gIH1cbiAgaWYgKGFwaUxldmVsID49IDIzICYmIHRhcmdldFNkayA+PSAyMykge1xuICAgIC8qKlxuICAgICAqIElmIHRoZSBkZXZpY2UgaXMgcnVubmluZyBBbmRyb2lkIDYuMChBUEkgMjMpIG9yIGhpZ2hlciwgYW5kIHlvdXIgYXBwJ3MgdGFyZ2V0IFNESyBpcyAyMyBvciBoaWdoZXI6XG4gICAgICogVGhlIGFwcCBoYXMgdG8gbGlzdCB0aGUgcGVybWlzc2lvbnMgaW4gdGhlIG1hbmlmZXN0LlxuICAgICAqIHJlZmVyOiBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS90cmFpbmluZy9wZXJtaXNzaW9ucy9yZXF1ZXN0aW5nLmh0bWxcbiAgICAgKi9cbiAgICBkdW1wc3lzT3V0cHV0ID0gZHVtcHN5c091dHB1dCB8fCBhd2FpdCB0aGlzLnNoZWxsKFsnZHVtcHN5cycsICdwYWNrYWdlJywgcGtnXSk7XG4gICAgY29uc3QgcmVxdWVzdGVkUGVybWlzc2lvbnMgPSBhd2FpdCB0aGlzLmdldFJlcVBlcm1pc3Npb25zKHBrZywgZHVtcHN5c091dHB1dCk7XG4gICAgY29uc3QgZ3JhbnRlZFBlcm1pc3Npb25zID0gYXdhaXQgdGhpcy5nZXRHcmFudGVkUGVybWlzc2lvbnMocGtnLCBkdW1wc3lzT3V0cHV0KTtcbiAgICBjb25zdCBwZXJtaXNzaW9uc1RvR3JhbnQgPSBfLmRpZmZlcmVuY2UocmVxdWVzdGVkUGVybWlzc2lvbnMsIGdyYW50ZWRQZXJtaXNzaW9ucyk7XG4gICAgaWYgKF8uaXNFbXB0eShwZXJtaXNzaW9uc1RvR3JhbnQpKSB7XG4gICAgICBsb2cuaW5mbyhgJHtwa2d9IGNvbnRhaW5zIG5vIHBlcm1pc3Npb25zIGF2YWlsYWJsZSBmb3IgZ3JhbnRpbmdgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdGhpcy5ncmFudFBlcm1pc3Npb25zKHBrZywgcGVybWlzc2lvbnNUb0dyYW50KTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogR3JhbnQgbXVsdGlwbGUgcGVybWlzc2lvbnMgZm9yIHRoZSBwYXJ0aWN1bGFyIHBhY2thZ2UuXG4gKiBUaGlzIGNhbGwgaXMgbW9yZSBwZXJmb3JtYW50IHRoYW4gYGdyYW50UGVybWlzc2lvbmAgb25lLCBzaW5jZSBpdCBjb21iaW5lc1xuICogbXVsdGlwbGUgYGFkYiBzaGVsbGAgY2FsbHMgaW50byBhIHNpbmdsZSBjb21tYW5kLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gcGVybWlzc2lvbnMgLSBUaGUgbGlzdCBvZiBwZXJtaXNzaW9ucyB0byBiZSBncmFudGVkLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBjaGFuZ2luZyBwZXJtaXNzaW9ucy5cbiAqL1xubWV0aG9kcy5ncmFudFBlcm1pc3Npb25zID0gYXN5bmMgZnVuY3Rpb24gZ3JhbnRQZXJtaXNzaW9ucyAocGtnLCBwZXJtaXNzaW9ucykge1xuICAvLyBBcyBpdCBjb25zdW1lcyBtb3JlIHRpbWUgZm9yIGdyYW50aW5nIGVhY2ggcGVybWlzc2lvbixcbiAgLy8gdHJ5aW5nIHRvIGdyYW50IGFsbCBwZXJtaXNzaW9uIGJ5IGZvcm1pbmcgZXF1aXZhbGVudCBjb21tYW5kLlxuICAvLyBBbHNvLCBpdCBpcyBuZWNlc3NhcnkgdG8gc3BsaXQgbG9uZyBjb21tYW5kcyBpbnRvIGNodW5rcywgc2luY2UgdGhlIG1heGltdW0gbGVuZ3RoIG9mXG4gIC8vIGFkYiBzaGVsbCBidWZmZXIgaXMgbGltaXRlZFxuICBsb2cuZGVidWcoYEdyYW50aW5nIHBlcm1pc3Npb25zICR7SlNPTi5zdHJpbmdpZnkocGVybWlzc2lvbnMpfSB0byAnJHtwa2d9J2ApO1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuc2hlbGxDaHVua3MoKHBlcm0pID0+IFsncG0nLCAnZ3JhbnQnLCBwa2csIHBlcm1dLCBwZXJtaXNzaW9ucyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoIUlHTk9SRURfUEVSTV9FUlJPUlMuc29tZSgocGF0dGVybikgPT4gcGF0dGVybi50ZXN0KGUuc3RkZXJyIHx8IGUubWVzc2FnZSkpKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBHcmFudCBzaW5nbGUgcGVybWlzc2lvbiBmb3IgdGhlIHBhcnRpY3VsYXIgcGFja2FnZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gcGVybWlzc2lvbiAtIFRoZSBmdWxsIG5hbWUgb2YgdGhlIHBlcm1pc3Npb24gdG8gYmUgZ3JhbnRlZC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgY2hhbmdpbmcgcGVybWlzc2lvbnMuXG4gKi9cbm1ldGhvZHMuZ3JhbnRQZXJtaXNzaW9uID0gYXN5bmMgZnVuY3Rpb24gZ3JhbnRQZXJtaXNzaW9uIChwa2csIHBlcm1pc3Npb24pIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLnNoZWxsKFsncG0nLCAnZ3JhbnQnLCBwa2csIHBlcm1pc3Npb25dKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmICghTk9UX0NIQU5HRUFCTEVfUEVSTV9FUlJPUi50ZXN0KGUuc3RkZXJyIHx8IGUubWVzc2FnZSkpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIFJldm9rZSBzaW5nbGUgcGVybWlzc2lvbiBmcm9tIHRoZSBwYXJ0aWN1bGFyIHBhY2thZ2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtzdHJpbmd9IHBlcm1pc3Npb24gLSBUaGUgZnVsbCBuYW1lIG9mIHRoZSBwZXJtaXNzaW9uIHRvIGJlIHJldm9rZWQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGNoYW5naW5nIHBlcm1pc3Npb25zLlxuICovXG5tZXRob2RzLnJldm9rZVBlcm1pc3Npb24gPSBhc3luYyBmdW5jdGlvbiByZXZva2VQZXJtaXNzaW9uIChwa2csIHBlcm1pc3Npb24pIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLnNoZWxsKFsncG0nLCAncmV2b2tlJywgcGtnLCBwZXJtaXNzaW9uXSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoIU5PVF9DSEFOR0VBQkxFX1BFUk1fRVJST1IudGVzdChlLnN0ZGVyciB8fCBlLm1lc3NhZ2UpKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgbGlzdCBvZiBncmFudGVkIHBlcm1pc3Npb25zIGZvciB0aGUgcGFydGljdWxhciBwYWNrYWdlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjbWRPdXRwdXQgW251bGxdIC0gT3B0aW9uYWwgcGFyYW1ldGVyIGNvbnRhaW5pbmcgY29tbWFuZCBvdXRwdXQgb2ZcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2R1bXBzeXMgcGFja2FnZV8gY29tbWFuZC4gSXQgbWF5IHNwZWVkIHVwIHRoZSBtZXRob2QgZXhlY3V0aW9uLlxuICogQHJldHVybiB7QXJyYXk8U3RyaW5nPn0gVGhlIGxpc3Qgb2YgZ3JhbnRlZCBwZXJtaXNzaW9ucyBvciBhbiBlbXB0eSBsaXN0LlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBjaGFuZ2luZyBwZXJtaXNzaW9ucy5cbiAqL1xubWV0aG9kcy5nZXRHcmFudGVkUGVybWlzc2lvbnMgPSBhc3luYyBmdW5jdGlvbiBnZXRHcmFudGVkUGVybWlzc2lvbnMgKHBrZywgY21kT3V0cHV0ID0gbnVsbCkge1xuICBsb2cuZGVidWcoJ1JldHJpZXZpbmcgZ3JhbnRlZCBwZXJtaXNzaW9ucycpO1xuICBjb25zdCBzdGRvdXQgPSBjbWRPdXRwdXQgfHwgYXdhaXQgdGhpcy5zaGVsbChbJ2R1bXBzeXMnLCAncGFja2FnZScsIHBrZ10pO1xuICByZXR1cm4gZXh0cmFjdE1hdGNoaW5nUGVybWlzc2lvbnMoc3Rkb3V0LCBbJ2luc3RhbGwnLCAncnVudGltZSddLCB0cnVlKTtcbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGxpc3Qgb2YgZGVuaWVkIHBlcm1pc3Npb25zIGZvciB0aGUgcGFydGljdWxhciBwYWNrYWdlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjbWRPdXRwdXQgW251bGxdIC0gT3B0aW9uYWwgcGFyYW1ldGVyIGNvbnRhaW5pbmcgY29tbWFuZCBvdXRwdXQgb2ZcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2R1bXBzeXMgcGFja2FnZV8gY29tbWFuZC4gSXQgbWF5IHNwZWVkIHVwIHRoZSBtZXRob2QgZXhlY3V0aW9uLlxuICogQHJldHVybiB7QXJyYXk8U3RyaW5nPn0gVGhlIGxpc3Qgb2YgZGVuaWVkIHBlcm1pc3Npb25zIG9yIGFuIGVtcHR5IGxpc3QuXG4gKi9cbm1ldGhvZHMuZ2V0RGVuaWVkUGVybWlzc2lvbnMgPSBhc3luYyBmdW5jdGlvbiBnZXREZW5pZWRQZXJtaXNzaW9ucyAocGtnLCBjbWRPdXRwdXQgPSBudWxsKSB7XG4gIGxvZy5kZWJ1ZygnUmV0cmlldmluZyBkZW5pZWQgcGVybWlzc2lvbnMnKTtcbiAgY29uc3Qgc3Rkb3V0ID0gY21kT3V0cHV0IHx8IGF3YWl0IHRoaXMuc2hlbGwoWydkdW1wc3lzJywgJ3BhY2thZ2UnLCBwa2ddKTtcbiAgcmV0dXJuIGV4dHJhY3RNYXRjaGluZ1Blcm1pc3Npb25zKHN0ZG91dCwgWydpbnN0YWxsJywgJ3J1bnRpbWUnXSwgZmFsc2UpO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgbGlzdCBvZiByZXF1ZXN0ZWQgcGVybWlzc2lvbnMgZm9yIHRoZSBwYXJ0aWN1bGFyIHBhY2thZ2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtzdHJpbmd9IGNtZE91dHB1dCBbbnVsbF0gLSBPcHRpb25hbCBwYXJhbWV0ZXIgY29udGFpbmluZyBjb21tYW5kIG91dHB1dCBvZlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZHVtcHN5cyBwYWNrYWdlXyBjb21tYW5kLiBJdCBtYXkgc3BlZWQgdXAgdGhlIG1ldGhvZCBleGVjdXRpb24uXG4gKiBAcmV0dXJuIHtBcnJheTxTdHJpbmc+fSBUaGUgbGlzdCBvZiByZXF1ZXN0ZWQgcGVybWlzc2lvbnMgb3IgYW4gZW1wdHkgbGlzdC5cbiAqL1xubWV0aG9kcy5nZXRSZXFQZXJtaXNzaW9ucyA9IGFzeW5jIGZ1bmN0aW9uIGdldFJlcVBlcm1pc3Npb25zIChwa2csIGNtZE91dHB1dCA9IG51bGwpIHtcbiAgbG9nLmRlYnVnKCdSZXRyaWV2aW5nIHJlcXVlc3RlZCBwZXJtaXNzaW9ucycpO1xuICBjb25zdCBzdGRvdXQgPSBjbWRPdXRwdXQgfHwgYXdhaXQgdGhpcy5zaGVsbChbJ2R1bXBzeXMnLCAncGFja2FnZScsIHBrZ10pO1xuICByZXR1cm4gZXh0cmFjdE1hdGNoaW5nUGVybWlzc2lvbnMoc3Rkb3V0LCBbJ3JlcXVlc3RlZCddKTtcbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGxpc3Qgb2YgbG9jYXRpb24gcHJvdmlkZXJzIGZvciB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7QXJyYXkuPFN0cmluZz59IFRoZSBsaXN0IG9mIGF2YWlsYWJsZSBsb2NhdGlvbiBwcm92aWRlcnMgb3IgYW4gZW1wdHkgbGlzdC5cbiAqL1xubWV0aG9kcy5nZXRMb2NhdGlvblByb3ZpZGVycyA9IGFzeW5jIGZ1bmN0aW9uIGdldExvY2F0aW9uUHJvdmlkZXJzICgpIHtcbiAgbGV0IHN0ZG91dCA9IGF3YWl0IHRoaXMuZ2V0U2V0dGluZygnc2VjdXJlJywgJ2xvY2F0aW9uX3Byb3ZpZGVyc19hbGxvd2VkJyk7XG4gIHJldHVybiBzdGRvdXQudHJpbSgpLnNwbGl0KCcsJylcbiAgICAubWFwKChwKSA9PiBwLnRyaW0oKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pO1xufTtcblxuLyoqXG4gKiBUb2dnbGUgdGhlIHN0YXRlIG9mIEdQUyBsb2NhdGlvbiBwcm92aWRlci5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRvIGVuYWJsZSAodHJ1ZSkgb3IgZGlzYWJsZSAoZmFsc2UpIHRoZSBHUFMgcHJvdmlkZXIuXG4gKi9cbm1ldGhvZHMudG9nZ2xlR1BTTG9jYXRpb25Qcm92aWRlciA9IGFzeW5jIGZ1bmN0aW9uIHRvZ2dsZUdQU0xvY2F0aW9uUHJvdmlkZXIgKGVuYWJsZWQpIHtcbiAgYXdhaXQgdGhpcy5zZXRTZXR0aW5nKCdzZWN1cmUnLCAnbG9jYXRpb25fcHJvdmlkZXJzX2FsbG93ZWQnLCBgJHtlbmFibGVkID8gJysnIDogJy0nfWdwc2ApO1xufTtcblxuLyoqXG4gKiBTZXQgaGlkZGVuIGFwaSBwb2xpY3kgdG8gbWFuYWdlIGFjY2VzcyB0byBub24tU0RLIEFQSXMuXG4gKiBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9wcmV2aWV3L3Jlc3RyaWN0aW9ucy1ub24tc2RrLWludGVyZmFjZXNcbiAqXG4gKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IHZhbHVlIC0gVGhlIEFQSSBlbmZvcmNlbWVudCBwb2xpY3kuXG4gKiAgICAgRm9yIEFuZHJvaWQgUFxuICogICAgIDA6IERpc2FibGUgbm9uLVNESyBBUEkgdXNhZ2UgZGV0ZWN0aW9uLiBUaGlzIHdpbGwgYWxzbyBkaXNhYmxlIGxvZ2dpbmcsIGFuZCBhbHNvIGJyZWFrIHRoZSBzdHJpY3QgbW9kZSBBUEksXG4gKiAgICAgICAgZGV0ZWN0Tm9uU2RrQXBpVXNhZ2UoKS4gTm90IHJlY29tbWVuZGVkLlxuICogICAgIDE6IFwiSnVzdCB3YXJuXCIgLSBwZXJtaXQgYWNjZXNzIHRvIGFsbCBub24tU0RLIEFQSXMsIGJ1dCBrZWVwIHdhcm5pbmdzIGluIHRoZSBsb2cuXG4gKiAgICAgICAgVGhlIHN0cmljdCBtb2RlIEFQSSB3aWxsIGtlZXAgd29ya2luZy5cbiAqICAgICAyOiBEaXNhbGxvdyB1c2FnZSBvZiBkYXJrIGdyZXkgYW5kIGJsYWNrIGxpc3RlZCBBUElzLlxuICogICAgIDM6IERpc2FsbG93IHVzYWdlIG9mIGJsYWNrbGlzdGVkIEFQSXMsIGJ1dCBhbGxvdyB1c2FnZSBvZiBkYXJrIGdyZXkgbGlzdGVkIEFQSXMuXG4gKlxuICogICAgIEZvciBBbmRyb2lkIFFcbiAqICAgICBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9wcmV2aWV3L25vbi1zZGstcSNlbmFibGUtbm9uLXNkay1hY2Nlc3NcbiAqICAgICAwOiBEaXNhYmxlIGFsbCBkZXRlY3Rpb24gb2Ygbm9uLVNESyBpbnRlcmZhY2VzLiBVc2luZyB0aGlzIHNldHRpbmcgZGlzYWJsZXMgYWxsIGxvZyBtZXNzYWdlcyBmb3Igbm9uLVNESyBpbnRlcmZhY2UgdXNhZ2VcbiAqICAgICAgICBhbmQgcHJldmVudHMgeW91IGZyb20gdGVzdGluZyB5b3VyIGFwcCB1c2luZyB0aGUgU3RyaWN0TW9kZSBBUEkuIFRoaXMgc2V0dGluZyBpcyBub3QgcmVjb21tZW5kZWQuXG4gKiAgICAgMTogRW5hYmxlIGFjY2VzcyB0byBhbGwgbm9uLVNESyBpbnRlcmZhY2VzLCBidXQgcHJpbnQgbG9nIG1lc3NhZ2VzIHdpdGggd2FybmluZ3MgZm9yIGFueSBub24tU0RLIGludGVyZmFjZSB1c2FnZS5cbiAqICAgICAgICBVc2luZyB0aGlzIHNldHRpbmcgYWxzbyBhbGxvd3MgeW91IHRvIHRlc3QgeW91ciBhcHAgdXNpbmcgdGhlIFN0cmljdE1vZGUgQVBJLlxuICogICAgIDI6IERpc2FsbG93IHVzYWdlIG9mIG5vbi1TREsgaW50ZXJmYWNlcyB0aGF0IGJlbG9uZyB0byBlaXRoZXIgdGhlIGJsYWNrIGxpc3RcbiAqICAgICAgICBvciB0byBhIHJlc3RyaWN0ZWQgZ3JleWxpc3QgZm9yIHlvdXIgdGFyZ2V0IEFQSSBsZXZlbC5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZUVycm9yIFtmYWxzZV0gV2hldGhlciB0byBpZ25vcmUgYW4gZXhjZXB0aW9uIGluICdhZGIgc2hlbGwgc2V0dGluZ3MgcHV0IGdsb2JhbCcgY29tbWFuZFxuICogQHRocm93cyB7ZXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciBhbmQgaWdub3JlRXJyb3Igd2FzIHRydWUgd2hpbGUgZXhlY3V0aW5nICdhZGIgc2hlbGwgc2V0dGluZ3MgcHV0IGdsb2JhbCdcbiAqICAgICAgICAgICAgICAgICBjb21tYW5kIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xubWV0aG9kcy5zZXRIaWRkZW5BcGlQb2xpY3kgPSBhc3luYyBmdW5jdGlvbiBzZXRIaWRkZW5BcGlQb2xpY3kgKHZhbHVlLCBpZ25vcmVFcnJvciA9IGZhbHNlKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5zaGVsbChISURERU5fQVBJX1BPTElDWV9LRVlTLm1hcCgoaykgPT4gYHNldHRpbmdzIHB1dCBnbG9iYWwgJHtrfSAke3ZhbHVlfWApLmpvaW4oJzsnKSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoIWlnbm9yZUVycm9yKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICBsb2cuaW5mbyhgRmFpbGVkIHRvIHNldCBzZXR0aW5nIGtleXMgJyR7SElEREVOX0FQSV9QT0xJQ1lfS0VZU30nIHRvICcke3ZhbHVlfScuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXNldCBhY2Nlc3MgdG8gbm9uLVNESyBBUElzIHRvIGl0cyBkZWZhdWx0IHNldHRpbmcuXG4gKiBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9wcmV2aWV3L3Jlc3RyaWN0aW9ucy1ub24tc2RrLWludGVyZmFjZXNcbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZUVycm9yIFtmYWxzZV0gV2hldGhlciB0byBpZ25vcmUgYW4gZXhjZXB0aW9uIGluICdhZGIgc2hlbGwgc2V0dGluZ3MgZGVsZXRlIGdsb2JhbCcgY29tbWFuZFxuICogQHRocm93cyB7ZXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciBhbmQgaWdub3JlRXJyb3Igd2FzIHRydWUgd2hpbGUgZXhlY3V0aW5nICdhZGIgc2hlbGwgc2V0dGluZ3MgZGVsZXRlIGdsb2JhbCdcbiAqICAgICAgICAgICAgICAgICBjb21tYW5kIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xubWV0aG9kcy5zZXREZWZhdWx0SGlkZGVuQXBpUG9saWN5ID0gYXN5bmMgZnVuY3Rpb24gc2V0RGVmYXVsdEhpZGRlbkFwaVBvbGljeSAoaWdub3JlRXJyb3IgPSBmYWxzZSkge1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuc2hlbGwoSElEREVOX0FQSV9QT0xJQ1lfS0VZUy5tYXAoKGspID0+IGBzZXR0aW5ncyBkZWxldGUgZ2xvYmFsICR7a31gKS5qb2luKCc7JykpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKCFpZ25vcmVFcnJvcikge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgbG9nLmluZm8oYEZhaWxlZCB0byBkZWxldGUga2V5cyAnJHtISURERU5fQVBJX1BPTElDWV9LRVlTfScuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBTdG9wIHRoZSBwYXJ0aWN1bGFyIHBhY2thZ2UgaWYgaXQgaXMgcnVubmluZyBhbmQgY2xlYXJzIGl0cyBhcHBsaWNhdGlvbiBkYXRhLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIHByb2Nlc3NlZC5cbiAqL1xubWV0aG9kcy5zdG9wQW5kQ2xlYXIgPSBhc3luYyBmdW5jdGlvbiBzdG9wQW5kQ2xlYXIgKHBrZykge1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuZm9yY2VTdG9wKHBrZyk7XG4gICAgYXdhaXQgdGhpcy5jbGVhcihwa2cpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3Qgc3RvcCBhbmQgY2xlYXIgJHtwa2d9LiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGlucHV0IG1ldGhvZHMgKElNRXMpIGZvciB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7QXJyYXkuPFN0cmluZz59IFRoZSBsaXN0IG9mIElNRSBuYW1lcyBvciBhbiBlbXB0eSBsaXN0LlxuICovXG5tZXRob2RzLmF2YWlsYWJsZUlNRXMgPSBhc3luYyBmdW5jdGlvbiBhdmFpbGFibGVJTUVzICgpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZ2V0SU1FTGlzdEZyb21PdXRwdXQoYXdhaXQgdGhpcy5zaGVsbChbJ2ltZScsICdsaXN0JywgJy1hJ10pKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZ2V0dGluZyBhdmFpbGFibGUgSU1FJ3MuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgbGlzdCBvZiBlbmFibGVkIGlucHV0IG1ldGhvZHMgKElNRXMpIGZvciB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7QXJyYXkuPFN0cmluZz59IFRoZSBsaXN0IG9mIGVuYWJsZWQgSU1FIG5hbWVzIG9yIGFuIGVtcHR5IGxpc3QuXG4gKi9cbm1ldGhvZHMuZW5hYmxlZElNRXMgPSBhc3luYyBmdW5jdGlvbiBlbmFibGVkSU1FcyAoKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGdldElNRUxpc3RGcm9tT3V0cHV0KGF3YWl0IHRoaXMuc2hlbGwoWydpbWUnLCAnbGlzdCddKSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGdldHRpbmcgZW5hYmxlZCBJTUUncy4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIEVuYWJsZSB0aGUgcGFydGljdWxhciBpbnB1dCBtZXRob2Qgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbWVJZCAtIE9uZSBvZiBleGlzdGluZyBJTUUgaWRzLlxuICovXG5tZXRob2RzLmVuYWJsZUlNRSA9IGFzeW5jIGZ1bmN0aW9uIGVuYWJsZUlNRSAoaW1lSWQpIHtcbiAgYXdhaXQgdGhpcy5zaGVsbChbJ2ltZScsICdlbmFibGUnLCBpbWVJZF0pO1xufTtcblxuLyoqXG4gKiBEaXNhYmxlIHRoZSBwYXJ0aWN1bGFyIGlucHV0IG1ldGhvZCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGltZUlkIC0gT25lIG9mIGV4aXN0aW5nIElNRSBpZHMuXG4gKi9cbm1ldGhvZHMuZGlzYWJsZUlNRSA9IGFzeW5jIGZ1bmN0aW9uIGRpc2FibGVJTUUgKGltZUlkKSB7XG4gIGF3YWl0IHRoaXMuc2hlbGwoWydpbWUnLCAnZGlzYWJsZScsIGltZUlkXSk7XG59O1xuXG4vKipcbiAqIFNldCB0aGUgcGFydGljdWxhciBpbnB1dCBtZXRob2Qgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbWVJZCAtIE9uZSBvZiBleGlzdGluZyBJTUUgaWRzLlxuICovXG5tZXRob2RzLnNldElNRSA9IGFzeW5jIGZ1bmN0aW9uIHNldElNRSAoaW1lSWQpIHtcbiAgYXdhaXQgdGhpcy5zaGVsbChbJ2ltZScsICdzZXQnLCBpbWVJZF0pO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGRlZmF1bHQgaW5wdXQgbWV0aG9kIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHs/c3RyaW5nfSBUaGUgbmFtZSBvZiB0aGUgZGVmYXVsdCBpbnB1dCBtZXRob2RcbiAqL1xubWV0aG9kcy5kZWZhdWx0SU1FID0gYXN5bmMgZnVuY3Rpb24gZGVmYXVsdElNRSAoKSB7XG4gIHRyeSB7XG4gICAgbGV0IGVuZ2luZSA9IGF3YWl0IHRoaXMuZ2V0U2V0dGluZygnc2VjdXJlJywgJ2RlZmF1bHRfaW5wdXRfbWV0aG9kJyk7XG4gICAgaWYgKGVuZ2luZSA9PT0gJ251bGwnKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGVuZ2luZS50cmltKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGdldHRpbmcgZGVmYXVsdCBJTUUuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBTZW5kIHRoZSBwYXJ0aWN1bGFyIGtleWNvZGUgdG8gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0ga2V5Y29kZSAtIFRoZSBhY3R1YWwga2V5IGNvZGUgdG8gYmUgc2VudC5cbiAqL1xubWV0aG9kcy5rZXlldmVudCA9IGFzeW5jIGZ1bmN0aW9uIGtleWV2ZW50IChrZXljb2RlKSB7XG4gIC8vIGtleWNvZGUgbXVzdCBiZSBhbiBpbnQuXG4gIGxldCBjb2RlID0gcGFyc2VJbnQoa2V5Y29kZSwgMTApO1xuICBhd2FpdCB0aGlzLnNoZWxsKFsnaW5wdXQnLCAna2V5ZXZlbnQnLCBjb2RlXSk7XG59O1xuXG4vKipcbiAqIFNlbmQgdGhlIHBhcnRpY3VsYXIgdGV4dCBvciBhIG51bWJlciB0byB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKiBUaGUgdGV4dCBnZXRzIHByb3Blcmx5IGVzY2FwZWQgYmVmb3JlIGJlaW5nIHBhc3NlZCB0byBBREIuXG4gKiBOb29wIGlmIHRoZSB0ZXh0IGlzIGVtcHR5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gdGV4dCAtIFRoZSBhY3R1YWwgdGV4dCB0byBiZSBzZW50LlxuICogQHRocm93cyB7RXJyb3J9IElmIGl0IGlzIGltcG9zc2libGUgdG8gZXNjYXBlIHRoZSBnaXZlbiBzdHJpbmdcbiAqL1xubWV0aG9kcy5pbnB1dFRleHQgPSBhc3luYyBmdW5jdGlvbiBpbnB1dFRleHQgKHRleHQpIHtcbiAgaWYgKHRleHQgPT09ICcnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgb3JpZ2luYWxTdHIgPSBgJHt0ZXh0fWA7XG4gIGNvbnN0IGVzY2FwZWRUZXh0ID0gb3JpZ2luYWxTdHIucmVwbGFjZSgvXFwkL2csICdcXFxcJCcpLnJlcGxhY2UoLyAvZywgJyVzJyk7XG4gIGxldCBhcmdzID0gWydpbnB1dCcsICd0ZXh0Jywgb3JpZ2luYWxTdHJdO1xuICBpZiAoZXNjYXBlZFRleHQgIT09IG9yaWdpbmFsU3RyIHx8IEFEQl9JTlBVVF9FU0NBUEVfUEFUVEVSTi50ZXN0KG9yaWdpbmFsU3RyKSkge1xuICAgIGlmIChfLmV2ZXJ5KFsnXCInLCBgJ2BdLCAoYykgPT4gb3JpZ2luYWxTdHIuaW5jbHVkZXMoYykpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBEaWQgbm90IGtub3cgaG93IHRvIGVzY2FwZSBhIHN0cmluZyB0aGF0IGNvbnRhaW5zIGJvdGggdHlwZXMgb2YgcXVvdGVzIChcIiBhbmQgJylgXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBxID0gb3JpZ2luYWxTdHIuaW5jbHVkZXMoJ1wiJykgPyBgJ2AgOiAnXCInO1xuICAgIGFyZ3MgPSBbYGlucHV0IHRleHQgJHtxfSR7ZXNjYXBlZFRleHR9JHtxfWBdO1xuICB9XG4gIGF3YWl0IHRoaXMuc2hlbGwoYXJncyk7XG59O1xuXG4vKipcbiAqIENsZWFyIHRoZSBhY3RpdmUgdGV4dCBmaWVsZCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QgYnkgc2VuZGluZ1xuICogc3BlY2lhbCBrZXlldmVudHMgdG8gaXQuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aCBbMTAwXSAtIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgdGV4dCBpbiB0aGUgZmllbGQgdG8gYmUgY2xlYXJlZC5cbiAqL1xubWV0aG9kcy5jbGVhclRleHRGaWVsZCA9IGFzeW5jIGZ1bmN0aW9uIGNsZWFyVGV4dEZpZWxkIChsZW5ndGggPSAxMDApIHtcbiAgLy8gYXNzdW1lcyB0aGF0IHRoZSBFZGl0VGV4dCBmaWVsZCBhbHJlYWR5IGhhcyBmb2N1c1xuICBsb2cuZGVidWcoYENsZWFyaW5nIHVwIHRvICR7bGVuZ3RofSBjaGFyYWN0ZXJzYCk7XG4gIGlmIChsZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgbGV0IGFyZ3MgPSBbJ2lucHV0JywgJ2tleWV2ZW50J107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAvLyB3ZSBjYW5ub3Qga25vdyB3aGVyZSB0aGUgY3Vyc29yIGlzIGluIHRoZSB0ZXh0IGZpZWxkLCBzbyBkZWxldGUgYm90aCBiZWZvcmVcbiAgICAvLyBhbmQgYWZ0ZXIgc28gdGhhdCB3ZSBnZXQgcmlkIG9mIGV2ZXJ5dGhpbmdcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC92aWV3L0tleUV2ZW50Lmh0bWwjS0VZQ09ERV9ERUxcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC92aWV3L0tleUV2ZW50Lmh0bWwjS0VZQ09ERV9GT1JXQVJEX0RFTFxuICAgIGFyZ3MucHVzaCgnNjcnLCAnMTEyJyk7XG4gIH1cbiAgYXdhaXQgdGhpcy5zaGVsbChhcmdzKTtcbn07XG5cbi8qKlxuICogU2VuZCB0aGUgc3BlY2lhbCBrZXljb2RlIHRvIHRoZSBkZXZpY2UgdW5kZXIgdGVzdCBpbiBvcmRlciB0byBsb2NrIGl0LlxuICovXG5tZXRob2RzLmxvY2sgPSBhc3luYyBmdW5jdGlvbiBsb2NrICgpIHtcbiAgaWYgKGF3YWl0IHRoaXMuaXNTY3JlZW5Mb2NrZWQoKSkge1xuICAgIGxvZy5kZWJ1ZygnU2NyZWVuIGlzIGFscmVhZHkgbG9ja2VkLiBEb2luZyBub3RoaW5nLicpO1xuICAgIHJldHVybjtcbiAgfVxuICBsb2cuZGVidWcoJ1ByZXNzaW5nIHRoZSBLRVlDT0RFX1BPV0VSIGJ1dHRvbiB0byBsb2NrIHNjcmVlbicpO1xuICBhd2FpdCB0aGlzLmtleWV2ZW50KDI2KTtcblxuICBjb25zdCB0aW1lb3V0TXMgPSA1MDAwO1xuICB0cnkge1xuICAgIGF3YWl0IHdhaXRGb3JDb25kaXRpb24oYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5pc1NjcmVlbkxvY2tlZCgpLCB7XG4gICAgICB3YWl0TXM6IHRpbWVvdXRNcyxcbiAgICAgIGludGVydmFsTXM6IDUwMCxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGRldmljZSBzY3JlZW4gaXMgc3RpbGwgbG9ja2VkIGFmdGVyICR7dGltZW91dE1zfW1zIHRpbWVvdXRgKTtcbiAgfVxufTtcblxuLyoqXG4gKiBTZW5kIHRoZSBzcGVjaWFsIGtleWNvZGUgdG8gdGhlIGRldmljZSB1bmRlciB0ZXN0IGluIG9yZGVyIHRvIGVtdWxhdGVcbiAqIEJhY2sgYnV0dG9uIHRhcC5cbiAqL1xubWV0aG9kcy5iYWNrID0gYXN5bmMgZnVuY3Rpb24gYmFjayAoKSB7XG4gIGxvZy5kZWJ1ZygnUHJlc3NpbmcgdGhlIEJBQ0sgYnV0dG9uJyk7XG4gIGF3YWl0IHRoaXMua2V5ZXZlbnQoNCk7XG59O1xuXG4vKipcbiAqIFNlbmQgdGhlIHNwZWNpYWwga2V5Y29kZSB0byB0aGUgZGV2aWNlIHVuZGVyIHRlc3QgaW4gb3JkZXIgdG8gZW11bGF0ZVxuICogSG9tZSBidXR0b24gdGFwLlxuICovXG5tZXRob2RzLmdvVG9Ib21lID0gYXN5bmMgZnVuY3Rpb24gZ29Ub0hvbWUgKCkge1xuICBsb2cuZGVidWcoJ1ByZXNzaW5nIHRoZSBIT01FIGJ1dHRvbicpO1xuICBhd2FpdCB0aGlzLmtleWV2ZW50KDMpO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHRoZSBhY3R1YWwgcGF0aCB0byBhZGIgZXhlY3V0YWJsZS5cbiAqL1xubWV0aG9kcy5nZXRBZGJQYXRoID0gZnVuY3Rpb24gZ2V0QWRiUGF0aCAoKSB7XG4gIHJldHVybiB0aGlzLmV4ZWN1dGFibGUucGF0aDtcbn07XG5cbi8qKlxuICogUmV0cmlldmUgY3VycmVudCBzY3JlZW4gb3JpZW50YXRpb24gb2YgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGN1cnJlbnQgb3JpZW50YXRpb24gZW5jb2RlZCBhcyBhbiBpbnRlZ2VyIG51bWJlci5cbiAqL1xubWV0aG9kcy5nZXRTY3JlZW5PcmllbnRhdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIGdldFNjcmVlbk9yaWVudGF0aW9uICgpIHtcbiAgbGV0IHN0ZG91dCA9IGF3YWl0IHRoaXMuc2hlbGwoWydkdW1wc3lzJywgJ2lucHV0J10pO1xuICByZXR1cm4gZ2V0U3VyZmFjZU9yaWVudGF0aW9uKHN0ZG91dCk7XG59O1xuXG4vKipcbiAqIFNlbmQgYW4gYXJiaXRyYXJ5IFRlbG5ldCBjb21tYW5kIHRvIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tbWFuZCAtIFRoZSBjb21tYW5kIHRvIGJlIHNlbnQuXG4gKlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgYWN0dWFsIG91dHB1dCBvZiB0aGUgZ2l2ZW4gY29tbWFuZC5cbiAqL1xubWV0aG9kcy5zZW5kVGVsbmV0Q29tbWFuZCA9IGFzeW5jIGZ1bmN0aW9uIHNlbmRUZWxuZXRDb21tYW5kIChjb21tYW5kKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmV4ZWNFbXVDb25zb2xlQ29tbWFuZChjb21tYW5kLCB7cG9ydDogYXdhaXQgdGhpcy5nZXRFbXVsYXRvclBvcnQoKX0pO1xufTtcblxuLyoqXG4gKiBDaGVjayB0aGUgc3RhdGUgb2YgQWlycGxhbmUgbW9kZSBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBBaXJwbGFuZSBtb2RlIGlzIGVuYWJsZWQuXG4gKi9cbm1ldGhvZHMuaXNBaXJwbGFuZU1vZGVPbiA9IGFzeW5jIGZ1bmN0aW9uIGlzQWlycGxhbmVNb2RlT24gKCkge1xuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5nZXRTZXR0aW5nKCdnbG9iYWwnLCAnYWlycGxhbmVfbW9kZV9vbicpO1xuICByZXR1cm4gcGFyc2VJbnQoc3Rkb3V0LCAxMCkgIT09IDA7XG59O1xuXG4vKipcbiAqIENoYW5nZSB0aGUgc3RhdGUgb2YgQWlycGxhbmUgbW9kZSBpbiBTZXR0aW5ncyBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtib29sZWFufSBvbiAtIFRydWUgdG8gZW5hYmxlIHRoZSBBaXJwbGFuZSBtb2RlIGluIFNldHRpbmdzIGFuZCBmYWxzZSB0byBkaXNhYmxlIGl0LlxuICovXG5tZXRob2RzLnNldEFpcnBsYW5lTW9kZSA9IGFzeW5jIGZ1bmN0aW9uIHNldEFpcnBsYW5lTW9kZSAob24pIHtcbiAgYXdhaXQgdGhpcy5zZXRTZXR0aW5nKCdnbG9iYWwnLCAnYWlycGxhbmVfbW9kZV9vbicsIG9uID8gMSA6IDApO1xufTtcblxuLyoqXG4gKiBCcm9hZGNhc3QgdGhlIHN0YXRlIG9mIEFpcnBsYW5lIG1vZGUgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciB7QGxpbmsgI3NldEFpcnBsYW5lTW9kZX0sIG90aGVyd2lzZVxuICogdGhlIG1vZGUgY2hhbmdlIGlzIG5vdCBnb2luZyB0byBiZSBhcHBsaWVkIGZvciB0aGUgZGV2aWNlLlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gb24gLSBUcnVlIHRvIGJyb2FkY2FzdCBlbmFibGUgYW5kIGZhbHNlIHRvIGJyb2FkY2FzdCBkaXNhYmxlLlxuICovXG5tZXRob2RzLmJyb2FkY2FzdEFpcnBsYW5lTW9kZSA9IGFzeW5jIGZ1bmN0aW9uIGJyb2FkY2FzdEFpcnBsYW5lTW9kZSAob24pIHtcbiAgYXdhaXQgdGhpcy5zaGVsbChbXG4gICAgJ2FtJywgJ2Jyb2FkY2FzdCcsXG4gICAgJy1hJywgJ2FuZHJvaWQuaW50ZW50LmFjdGlvbi5BSVJQTEFORV9NT0RFJyxcbiAgICAnLS1leicsICdzdGF0ZScsIG9uID8gJ3RydWUnIDogJ2ZhbHNlJ1xuICBdKTtcbn07XG5cbi8qKlxuICogQ2hlY2sgdGhlIHN0YXRlIG9mIFdpRmkgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgV2lGaSBpcyBlbmFibGVkLlxuICovXG5tZXRob2RzLmlzV2lmaU9uID0gYXN5bmMgZnVuY3Rpb24gaXNXaWZpT24gKCkge1xuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5nZXRTZXR0aW5nKCdnbG9iYWwnLCAnd2lmaV9vbicpO1xuICByZXR1cm4gKHBhcnNlSW50KHN0ZG91dCwgMTApICE9PSAwKTtcbn07XG5cbi8qKlxuICogQ2hlY2sgdGhlIHN0YXRlIG9mIERhdGEgdHJhbnNmZXIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgRGF0YSB0cmFuc2ZlciBpcyBlbmFibGVkLlxuICovXG5tZXRob2RzLmlzRGF0YU9uID0gYXN5bmMgZnVuY3Rpb24gaXNEYXRhT24gKCkge1xuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5nZXRTZXR0aW5nKCdnbG9iYWwnLCAnbW9iaWxlX2RhdGEnKTtcbiAgcmV0dXJuIChwYXJzZUludChzdGRvdXQsIDEwKSAhPT0gMCk7XG59O1xuXG4vKipcbiAqIENoYW5nZSB0aGUgc3RhdGUgb2YgV2lGaSBhbmQvb3IgRGF0YSB0cmFuc2ZlciBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtib29sZWFufSB3aWZpIC0gVHJ1ZSB0byBlbmFibGUgYW5kIGZhbHNlIHRvIGRpc2FibGUgV2lGaS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gZGF0YSAtIFRydWUgdG8gZW5hYmxlIGFuZCBmYWxzZSB0byBkaXNhYmxlIERhdGEgdHJhbnNmZXIuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzRW11bGF0b3IgW2ZhbHNlXSAtIFNldCBpdCB0byB0cnVlIGlmIHRoZSBkZXZpY2UgdW5kZXIgdGVzdFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBhbiBlbXVsYXRvciByYXRoZXIgdGhhbiBhIHJlYWwgZGV2aWNlLlxuICovXG5tZXRob2RzLnNldFdpZmlBbmREYXRhID0gYXN5bmMgZnVuY3Rpb24gc2V0V2lmaUFuZERhdGEgKHt3aWZpLCBkYXRhfSwgaXNFbXVsYXRvciA9IGZhbHNlKSB7XG4gIGlmICh1dGlsLmhhc1ZhbHVlKHdpZmkpKSB7XG4gICAgYXdhaXQgdGhpcy5zZXRXaWZpU3RhdGUod2lmaSwgaXNFbXVsYXRvcik7XG4gIH1cbiAgaWYgKHV0aWwuaGFzVmFsdWUoZGF0YSkpIHtcbiAgICBhd2FpdCB0aGlzLnNldERhdGFTdGF0ZShkYXRhLCBpc0VtdWxhdG9yKTtcbiAgfVxufTtcblxuLyoqXG4gKiBDaGVjayB0aGUgc3RhdGUgb2YgYW5pbWF0aW9uIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGF0IGxlYXN0IG9uZSBvZiBhbmltYXRpb24gc2NhbGUgc2V0dGluZ3NcbiAqICAgICAgICAgICAgICAgICAgIGlzIG5vdCBlcXVhbCB0byAnMC4wJy5cbiAqL1xubWV0aG9kcy5pc0FuaW1hdGlvbk9uID0gYXN5bmMgZnVuY3Rpb24gaXNBbmltYXRpb25PbiAoKSB7XG4gIGxldCBhbmltYXRvcl9kdXJhdGlvbl9zY2FsZSA9IGF3YWl0IHRoaXMuZ2V0U2V0dGluZygnZ2xvYmFsJywgJ2FuaW1hdG9yX2R1cmF0aW9uX3NjYWxlJyk7XG4gIGxldCB0cmFuc2l0aW9uX2FuaW1hdGlvbl9zY2FsZSA9IGF3YWl0IHRoaXMuZ2V0U2V0dGluZygnZ2xvYmFsJywgJ3RyYW5zaXRpb25fYW5pbWF0aW9uX3NjYWxlJyk7XG4gIGxldCB3aW5kb3dfYW5pbWF0aW9uX3NjYWxlID0gYXdhaXQgdGhpcy5nZXRTZXR0aW5nKCdnbG9iYWwnLCAnd2luZG93X2FuaW1hdGlvbl9zY2FsZScpO1xuICByZXR1cm4gXy5zb21lKFthbmltYXRvcl9kdXJhdGlvbl9zY2FsZSwgdHJhbnNpdGlvbl9hbmltYXRpb25fc2NhbGUsIHdpbmRvd19hbmltYXRpb25fc2NhbGVdLFxuICAgICAgICAgICAgICAgIChzZXR0aW5nKSA9PiBzZXR0aW5nICE9PSAnMC4wJyk7XG59O1xuXG4vKipcbiAqIEZvcmNlZnVsbHkgcmVjdXJzaXZlbHkgcmVtb3ZlIGEgcGF0aCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKiBCZSBjYXJlZnVsIHdoaWxlIGNhbGxpbmcgdGhpcyBtZXRob2QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBUaGUgcGF0aCB0byBiZSByZW1vdmVkIHJlY3Vyc2l2ZWx5LlxuICovXG5tZXRob2RzLnJpbXJhZiA9IGFzeW5jIGZ1bmN0aW9uIHJpbXJhZiAocGF0aCkge1xuICBhd2FpdCB0aGlzLnNoZWxsKFsncm0nLCAnLXJmJywgcGF0aF0pO1xufTtcblxuLyoqXG4gKiBTZW5kIGEgZmlsZSB0byB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2FsUGF0aCAtIFRoZSBwYXRoIHRvIHRoZSBmaWxlIG9uIHRoZSBsb2NhbCBmaWxlIHN5c3RlbS5cbiAqIEBwYXJhbSB7c3RyaW5nfSByZW1vdGVQYXRoIC0gVGhlIGRlc3RpbmF0aW9uIHBhdGggb24gdGhlIHJlbW90ZSBkZXZpY2UuXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0cyAtIEFkZGl0aW9uYWwgb3B0aW9ucyBtYXBwaW5nLiBTZWVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9ub2RlLXRlZW5fcHJvY2VzcyxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgX2V4ZWNfIG1ldGhvZCBvcHRpb25zLCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBhdmFpbGFibGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5cbiAqL1xubWV0aG9kcy5wdXNoID0gYXN5bmMgZnVuY3Rpb24gcHVzaCAobG9jYWxQYXRoLCByZW1vdGVQYXRoLCBvcHRzKSB7XG4gIGF3YWl0IHRoaXMubWtkaXIocGF0aC5wb3NpeC5kaXJuYW1lKHJlbW90ZVBhdGgpKTtcbiAgYXdhaXQgdGhpcy5hZGJFeGVjKFsncHVzaCcsIGxvY2FsUGF0aCwgcmVtb3RlUGF0aF0sIG9wdHMpO1xufTtcblxuLyoqXG4gKiBSZWNlaXZlIGEgZmlsZSBmcm9tIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtb3RlUGF0aCAtIFRoZSBzb3VyY2UgcGF0aCBvbiB0aGUgcmVtb3RlIGRldmljZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhbFBhdGggLSBUaGUgZGVzdGluYXRpb24gcGF0aCB0byB0aGUgZmlsZSBvbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0cyAtIEFkZGl0aW9uYWwgb3B0aW9ucyBtYXBwaW5nLiBTZWVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9ub2RlLXRlZW5fcHJvY2VzcyxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgX2V4ZWNfIG1ldGhvZCBvcHRpb25zLCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBhdmFpbGFibGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5cbiAqL1xubWV0aG9kcy5wdWxsID0gYXN5bmMgZnVuY3Rpb24gcHVsbCAocmVtb3RlUGF0aCwgbG9jYWxQYXRoLCBvcHRzID0ge30pIHtcbiAgLy8gcHVsbCBmb2xkZXIgY2FuIHRha2UgbW9yZSB0aW1lLCBpbmNyZWFzaW5nIHRpbWUgb3V0IHRvIDYwIHNlY3NcbiAgYXdhaXQgdGhpcy5hZGJFeGVjKFsncHVsbCcsIHJlbW90ZVBhdGgsIGxvY2FsUGF0aF0sIHsuLi5vcHRzLCB0aW1lb3V0OiBvcHRzLnRpbWVvdXQgPz8gNjAwMDB9KTtcbn07XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgcHJvY2VzcyB3aXRoIHRoZSBwYXJ0aWN1bGFyIG5hbWUgaXMgcnVubmluZyBvbiB0aGUgZGV2aWNlXG4gKiB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9jZXNzTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9jZXNzIHRvIGJlIGNoZWNrZWQuXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBnaXZlbiBwcm9jZXNzIGlzIHJ1bm5pbmcuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGdpdmVuIHByb2Nlc3MgbmFtZSBpcyBub3QgYSB2YWxpZCBjbGFzcyBuYW1lLlxuICovXG5tZXRob2RzLnByb2Nlc3NFeGlzdHMgPSBhc3luYyBmdW5jdGlvbiBwcm9jZXNzRXhpc3RzIChwcm9jZXNzTmFtZSkge1xuICByZXR1cm4gIV8uaXNFbXB0eShhd2FpdCB0aGlzLmdldFBJRHNCeU5hbWUocHJvY2Vzc05hbWUpKTtcbn07XG5cbi8qKlxuICogR2V0IFRDUCBwb3J0IGZvcndhcmRpbmcgd2l0aCBhZGIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICogQHJldHVybiB7QXJyYXkuPFN0cmluZz59IFRoZSBvdXRwdXQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYWRiIGNvbW1hbmQuIEFuIGFycmF5IGNvbnRhaW5zIGVhY2ggZm9yd2FyZGluZyBsaW5lIG9mIG91dHB1dFxuICovXG5tZXRob2RzLmdldEZvcndhcmRMaXN0ID0gYXN5bmMgZnVuY3Rpb24gZ2V0Rm9yd2FyZExpc3QgKCkge1xuICBsb2cuZGVidWcoYExpc3QgZm9yd2FyZGluZyBwb3J0c2ApO1xuICBjb25zdCBjb25uZWN0aW9ucyA9IGF3YWl0IHRoaXMuYWRiRXhlYyhbJ2ZvcndhcmQnLCAnLS1saXN0J10pO1xuICByZXR1cm4gY29ubmVjdGlvbnMuc3BsaXQoRU9MKS5maWx0ZXIoKGxpbmUpID0+IEJvb2xlYW4obGluZS50cmltKCkpKTtcbn07XG5cbi8qKlxuICogU2V0dXAgVENQIHBvcnQgZm9yd2FyZGluZyB3aXRoIGFkYiBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBzeXN0ZW1Qb3J0IC0gVGhlIG51bWJlciBvZiB0aGUgbG9jYWwgc3lzdGVtIHBvcnQuXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGRldmljZVBvcnQgLSBUaGUgbnVtYmVyIG9mIHRoZSByZW1vdGUgZGV2aWNlIHBvcnQuXG4gKi9cbm1ldGhvZHMuZm9yd2FyZFBvcnQgPSBhc3luYyBmdW5jdGlvbiBmb3J3YXJkUG9ydCAoc3lzdGVtUG9ydCwgZGV2aWNlUG9ydCkge1xuICBsb2cuZGVidWcoYEZvcndhcmRpbmcgc3lzdGVtOiAke3N5c3RlbVBvcnR9IHRvIGRldmljZTogJHtkZXZpY2VQb3J0fWApO1xuICBhd2FpdCB0aGlzLmFkYkV4ZWMoWydmb3J3YXJkJywgYHRjcDoke3N5c3RlbVBvcnR9YCwgYHRjcDoke2RldmljZVBvcnR9YF0pO1xufTtcblxuLyoqXG4gKiBSZW1vdmUgVENQIHBvcnQgZm9yd2FyZGluZyB3aXRoIGFkYiBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuIFRoZSBmb3J3YXJkaW5nXG4gKiBmb3IgdGhlIGdpdmVuIHBvcnQgc2hvdWxkIGJlIHNldHVwIHdpdGgge0BsaW5rICNmb3J3YXJkUG9ydH0gZmlyc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBzeXN0ZW1Qb3J0IC0gVGhlIG51bWJlciBvZiB0aGUgbG9jYWwgc3lzdGVtIHBvcnRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHJlbW92ZSBmb3J3YXJkaW5nIG9uLlxuICovXG5tZXRob2RzLnJlbW92ZVBvcnRGb3J3YXJkID0gYXN5bmMgZnVuY3Rpb24gcmVtb3ZlUG9ydEZvcndhcmQgKHN5c3RlbVBvcnQpIHtcbiAgbG9nLmRlYnVnKGBSZW1vdmluZyBmb3J3YXJkZWQgcG9ydCBzb2NrZXQgY29ubmVjdGlvbjogJHtzeXN0ZW1Qb3J0fSBgKTtcbiAgYXdhaXQgdGhpcy5hZGJFeGVjKFsnZm9yd2FyZCcsIGAtLXJlbW92ZWAsIGB0Y3A6JHtzeXN0ZW1Qb3J0fWBdKTtcbn07XG5cbi8qKlxuICogR2V0IFRDUCBwb3J0IGZvcndhcmRpbmcgd2l0aCBhZGIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICogQHJldHVybiB7QXJyYXkuPFN0cmluZz59IFRoZSBvdXRwdXQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYWRiIGNvbW1hbmQuIEFuIGFycmF5IGNvbnRhaW5zIGVhY2ggZm9yd2FyZGluZyBsaW5lIG9mIG91dHB1dFxuICovXG5tZXRob2RzLmdldFJldmVyc2VMaXN0ID0gYXN5bmMgZnVuY3Rpb24gZ2V0UmV2ZXJzZUxpc3QgKCkge1xuICBsb2cuZGVidWcoYExpc3QgcmV2ZXJzZSBmb3J3YXJkaW5nIHBvcnRzYCk7XG4gIGNvbnN0IGNvbm5lY3Rpb25zID0gYXdhaXQgdGhpcy5hZGJFeGVjKFsncmV2ZXJzZScsICctLWxpc3QnXSk7XG4gIHJldHVybiBjb25uZWN0aW9ucy5zcGxpdChFT0wpLmZpbHRlcigobGluZSkgPT4gQm9vbGVhbihsaW5lLnRyaW0oKSkpO1xufTtcblxuLyoqXG4gKiBTZXR1cCBUQ1AgcG9ydCBmb3J3YXJkaW5nIHdpdGggYWRiIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqIE9ubHkgYXZhaWxhYmxlIGZvciBBUEkgMjErLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gZGV2aWNlUG9ydCAtIFRoZSBudW1iZXIgb2YgdGhlIHJlbW90ZSBkZXZpY2UgcG9ydC5cbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gc3lzdGVtUG9ydCAtIFRoZSBudW1iZXIgb2YgdGhlIGxvY2FsIHN5c3RlbSBwb3J0LlxuICovXG5tZXRob2RzLnJldmVyc2VQb3J0ID0gYXN5bmMgZnVuY3Rpb24gcmV2ZXJzZVBvcnQgKGRldmljZVBvcnQsIHN5c3RlbVBvcnQpIHtcbiAgbG9nLmRlYnVnKGBGb3J3YXJkaW5nIGRldmljZTogJHtkZXZpY2VQb3J0fSB0byBzeXN0ZW06ICR7c3lzdGVtUG9ydH1gKTtcbiAgYXdhaXQgdGhpcy5hZGJFeGVjKFsncmV2ZXJzZScsIGB0Y3A6JHtkZXZpY2VQb3J0fWAsIGB0Y3A6JHtzeXN0ZW1Qb3J0fWBdKTtcbn07XG5cbi8qKlxuICogUmVtb3ZlIFRDUCBwb3J0IGZvcndhcmRpbmcgd2l0aCBhZGIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LiBUaGUgZm9yd2FyZGluZ1xuICogZm9yIHRoZSBnaXZlbiBwb3J0IHNob3VsZCBiZSBzZXR1cCB3aXRoIHtAbGluayAjZm9yd2FyZFBvcnR9IGZpcnN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gZGV2aWNlUG9ydCAtIFRoZSBudW1iZXIgb2YgdGhlIHJlbW90ZSBkZXZpY2UgcG9ydFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gcmVtb3ZlIGZvcndhcmRpbmcgb24uXG4gKi9cbm1ldGhvZHMucmVtb3ZlUG9ydFJldmVyc2UgPSBhc3luYyBmdW5jdGlvbiByZW1vdmVQb3J0UmV2ZXJzZSAoZGV2aWNlUG9ydCkge1xuICBsb2cuZGVidWcoYFJlbW92aW5nIHJldmVyc2UgZm9yd2FyZGVkIHBvcnQgc29ja2V0IGNvbm5lY3Rpb246ICR7ZGV2aWNlUG9ydH0gYCk7XG4gIGF3YWl0IHRoaXMuYWRiRXhlYyhbJ3JldmVyc2UnLCBgLS1yZW1vdmVgLCBgdGNwOiR7ZGV2aWNlUG9ydH1gXSk7XG59O1xuXG4vKipcbiAqIFNldHVwIFRDUCBwb3J0IGZvcndhcmRpbmcgd2l0aCBhZGIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LiBUaGUgZGlmZmVyZW5jZVxuICogYmV0d2VlbiB7QGxpbmsgI2ZvcndhcmRQb3J0fSBpcyB0aGF0IHRoaXMgbWV0aG9kIGRvZXMgc2V0dXAgZm9yIGFuIGFic3RyYWN0XG4gKiBsb2NhbCBwb3J0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gc3lzdGVtUG9ydCAtIFRoZSBudW1iZXIgb2YgdGhlIGxvY2FsIHN5c3RlbSBwb3J0LlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBkZXZpY2VQb3J0IC0gVGhlIG51bWJlciBvZiB0aGUgcmVtb3RlIGRldmljZSBwb3J0LlxuICovXG5tZXRob2RzLmZvcndhcmRBYnN0cmFjdFBvcnQgPSBhc3luYyBmdW5jdGlvbiBmb3J3YXJkQWJzdHJhY3RQb3J0IChzeXN0ZW1Qb3J0LCBkZXZpY2VQb3J0KSB7XG4gIGxvZy5kZWJ1ZyhgRm9yd2FyZGluZyBzeXN0ZW06ICR7c3lzdGVtUG9ydH0gdG8gYWJzdHJhY3QgZGV2aWNlOiAke2RldmljZVBvcnR9YCk7XG4gIGF3YWl0IHRoaXMuYWRiRXhlYyhbJ2ZvcndhcmQnLCBgdGNwOiR7c3lzdGVtUG9ydH1gLCBgbG9jYWxhYnN0cmFjdDoke2RldmljZVBvcnR9YF0pO1xufTtcblxuLyoqXG4gKiBFeGVjdXRlIHBpbmcgc2hlbGwgY29tbWFuZCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgY29tbWFuZCBvdXRwdXQgY29udGFpbnMgJ3BpbmcnIHN1YnN0cmluZy5cbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgZXhlY3V0aW5nICdwaW5nJyBjb21tYW5kIG9uIHRoZVxuICogICAgICAgICAgICAgICAgIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLnBpbmcgPSBhc3luYyBmdW5jdGlvbiBwaW5nICgpIHtcbiAgbGV0IHN0ZG91dCA9IGF3YWl0IHRoaXMuc2hlbGwoWydlY2hvJywgJ3BpbmcnXSk7XG4gIGlmIChzdGRvdXQuaW5kZXhPZigncGluZycpID09PSAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBBREIgcGluZyBmYWlsZWQsIHJldHVybmVkICR7c3Rkb3V0fWApO1xufTtcblxuLyoqXG4gKiBSZXN0YXJ0IHRoZSBkZXZpY2UgdW5kZXIgdGVzdCB1c2luZyBhZGIgY29tbWFuZHMuXG4gKlxuICogQHRocm93cyB7ZXJyb3J9IElmIHN0YXJ0IGZhaWxzLlxuICovXG5tZXRob2RzLnJlc3RhcnQgPSBhc3luYyBmdW5jdGlvbiByZXN0YXJ0ICgpIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLnN0b3BMb2djYXQoKTtcbiAgICBhd2FpdCB0aGlzLnJlc3RhcnRBZGIoKTtcbiAgICBhd2FpdCB0aGlzLndhaXRGb3JEZXZpY2UoNjApO1xuICAgIGF3YWl0IHRoaXMuc3RhcnRMb2djYXQodGhpcy5fbG9nY2F0U3RhcnR1cFBhcmFtcyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFJlc3RhcnQgZmFpbGVkLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTG9nY2F0T3B0c1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGZvcm1hdCBUaGUgbG9nIHByaW50IGZvcm1hdCwgd2hlcmUgPGZvcm1hdD4gaXMgb25lIG9mOlxuICogICBicmllZiBwcm9jZXNzIHRhZyB0aHJlYWQgcmF3IHRpbWUgdGhyZWFkdGltZSBsb25nXG4gKiBgdGhyZWFkdGltZWAgaXMgdGhlIGRlZmF1bHQgdmFsdWUuXG4gKiBAcHJvcGVydHkge0FycmF5PHN0cmluZz59IGZpbHRlclNwZWNzIFNlcmllcyBvZiA8dGFnPls6cHJpb3JpdHldXG4gKiB3aGVyZSA8dGFnPiBpcyBhIGxvZyBjb21wb25lbnQgdGFnIChvciAqIGZvciBhbGwpIGFuZCBwcmlvcml0eSBpczpcbiAqICBWICAgIFZlcmJvc2VcbiAqICBEICAgIERlYnVnXG4gKiAgSSAgICBJbmZvXG4gKiAgVyAgICBXYXJuXG4gKiAgRSAgICBFcnJvclxuICogIEYgICAgRmF0YWxcbiAqICBTICAgIFNpbGVudCAoc3VwcmVzcyBhbGwgb3V0cHV0KVxuICpcbiAqICcqJyBtZWFucyAnKjpkJyBhbmQgPHRhZz4gYnkgaXRzZWxmIG1lYW5zIDx0YWc+OnZcbiAqXG4gKiBJZiBub3Qgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kbGluZSwgZmlsdGVyc3BlYyBpcyBzZXQgZnJvbSBBTkRST0lEX0xPR19UQUdTLlxuICogSWYgbm8gZmlsdGVyc3BlYyBpcyBmb3VuZCwgZmlsdGVyIGRlZmF1bHRzIHRvICcqOkknXG4gKi9cblxuLyoqXG4gKiBTdGFydCB0aGUgbG9nY2F0IHByb2Nlc3MgdG8gZ2F0aGVyIGxvZ3MuXG4gKlxuICogQHBhcmFtIHs/TG9nY2F0T3B0c30gb3B0c1xuICogQHRocm93cyB7RXJyb3J9IElmIHJlc3RhcnQgZmFpbHMuXG4gKi9cbm1ldGhvZHMuc3RhcnRMb2djYXQgPSBhc3luYyBmdW5jdGlvbiBzdGFydExvZ2NhdCAob3B0cyA9IHt9KSB7XG4gIGlmICghXy5pc0VtcHR5KHRoaXMubG9nY2F0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlRyeWluZyB0byBzdGFydCBsb2djYXQgY2FwdHVyZSBidXQgaXQncyBhbHJlYWR5IHN0YXJ0ZWQhXCIpO1xuICB9XG5cbiAgdGhpcy5sb2djYXQgPSBuZXcgTG9nY2F0KHtcbiAgICBhZGI6IHRoaXMuZXhlY3V0YWJsZSxcbiAgICBkZWJ1ZzogZmFsc2UsXG4gICAgZGVidWdUcmFjZTogZmFsc2UsXG4gICAgY2xlYXJEZXZpY2VMb2dzT25TdGFydDogISF0aGlzLmNsZWFyRGV2aWNlTG9nc09uU3RhcnQsXG4gIH0pO1xuICBhd2FpdCB0aGlzLmxvZ2NhdC5zdGFydENhcHR1cmUob3B0cyk7XG4gIHRoaXMuX2xvZ2NhdFN0YXJ0dXBQYXJhbXMgPSBvcHRzO1xufTtcblxuLyoqXG4gKiBTdG9wIHRoZSBhY3RpdmUgbG9nY2F0IHByb2Nlc3Mgd2hpY2ggZ2F0aGVycyBsb2dzLlxuICogVGhlIGNhbGwgd2lsbCBiZSBpZ25vcmVkIGlmIG5vIGxvZ2NhdCBwcm9jZXNzIGlzIHJ1bm5pbmcuXG4gKi9cbm1ldGhvZHMuc3RvcExvZ2NhdCA9IGFzeW5jIGZ1bmN0aW9uIHN0b3BMb2djYXQgKCkge1xuICBpZiAoXy5pc0VtcHR5KHRoaXMubG9nY2F0KSkge1xuICAgIHJldHVybjtcbiAgfVxuICB0cnkge1xuICAgIGF3YWl0IHRoaXMubG9nY2F0LnN0b3BDYXB0dXJlKCk7XG4gIH0gZmluYWxseSB7XG4gICAgdGhpcy5sb2djYXQgPSBudWxsO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBvdXRwdXQgZnJvbSB0aGUgY3VycmVudGx5IHJ1bm5pbmcgbG9nY2F0IHByb2Nlc3MuXG4gKiBUaGUgbG9nY2F0IHByb2Nlc3Mgc2hvdWxkIGJlIGV4ZWN1dGVkIGJ5IHsybGluayAjc3RhcnRMb2djYXR9IG1ldGhvZC5cbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBjb2xsZWN0ZWQgbG9nY2F0IG91dHB1dC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBsb2djYXQgcHJvY2VzcyBpcyBub3QgcnVubmluZy5cbiAqL1xubWV0aG9kcy5nZXRMb2djYXRMb2dzID0gZnVuY3Rpb24gZ2V0TG9nY2F0TG9ncyAoKSB7XG4gIGlmIChfLmlzRW1wdHkodGhpcy5sb2djYXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgZ2V0IGxvZ2NhdCBsb2dzIHNpbmNlIGxvZ2NhdCBoYXNuJ3Qgc3RhcnRlZFwiKTtcbiAgfVxuICByZXR1cm4gdGhpcy5sb2djYXQuZ2V0TG9ncygpO1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIGNhbGxiYWNrIGZvciB0aGUgbG9nY2F0IG91dHB1dCBldmVudC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciAtIFRoZSBsaXN0ZW5lciBmdW5jdGlvbiwgd2hpY2ggYWNjZXB0cyBvbmUgYXJndW1lbnQuIFRoZSBhcmd1bWVudCBpc1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIGxvZyByZWNvcmQgb2JqZWN0IHdpdGggYHRpbWVzdGFtcGAsIGBsZXZlbGAgYW5kIGBtZXNzYWdlYCBwcm9wZXJ0aWVzLlxuICogQHRocm93cyB7RXJyb3J9IElmIGxvZ2NhdCBwcm9jZXNzIGlzIG5vdCBydW5uaW5nLlxuICovXG5tZXRob2RzLnNldExvZ2NhdExpc3RlbmVyID0gZnVuY3Rpb24gc2V0TG9nY2F0TGlzdGVuZXIgKGxpc3RlbmVyKSB7XG4gIGlmIChfLmlzRW1wdHkodGhpcy5sb2djYXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTG9nY2F0IHByb2Nlc3MgaGFzbid0IGJlZW4gc3RhcnRlZFwiKTtcbiAgfVxuICB0aGlzLmxvZ2NhdC5vbignb3V0cHV0JywgbGlzdGVuZXIpO1xufTtcblxuLyoqXG4gKiBSZW1vdmVzIHRoZSBwcmV2aW91c2x5IHNldCBjYWxsYmFjayBmb3IgdGhlIGxvZ2NhdCBvdXRwdXQgZXZlbnQuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgLSBUaGUgbGlzdGVuZXIgZnVuY3Rpb24sIHdoaWNoIGhhcyBiZWVuIHByZXZpb3VzbHlcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkIHRvIGBzZXRMb2djYXRMaXN0ZW5lcmBcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBsb2djYXQgcHJvY2VzcyBpcyBub3QgcnVubmluZy5cbiAqL1xubWV0aG9kcy5yZW1vdmVMb2djYXRMaXN0ZW5lciA9IGZ1bmN0aW9uIHJlbW92ZUxvZ2NhdExpc3RlbmVyIChsaXN0ZW5lcikge1xuICBpZiAoXy5pc0VtcHR5KHRoaXMubG9nY2F0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkxvZ2NhdCBwcm9jZXNzIGhhc24ndCBiZWVuIHN0YXJ0ZWRcIik7XG4gIH1cbiAgdGhpcy5sb2djYXQucmVtb3ZlTGlzdGVuZXIoJ291dHB1dCcsIGxpc3RlbmVyKTtcbn07XG5cbi8qKlxuICogQXQgc29tZSBwb2ludCBvZiB0aW1lIEdvb2dsZSBoYXMgY2hhbmdlZCB0aGUgZGVmYXVsdCBgcHNgIGJlaGF2aW91ciwgc28gaXQgb25seVxuICogbGlzdHMgcHJvY2Vzc2VzIHRoYXQgYmVsb25nIHRvIHRoZSBjdXJyZW50IHNoZWxsIHVzZXIgcmF0aGVyIHRvIGFsbFxuICogdXNlcnMuIEl0IGlzIG5lY2Vzc2FyeSB0byBleGVjdXRlIHBzIHdpdGggLUEgY29tbWFuZCBsaW5lIGFyZ3VtZW50XG4gKiB0byBtaW1pYyB0aGUgcHJldmlvdXMgYmVoYXZpb3VyLlxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBvdXRwdXQgb2YgYHBzYCBjb21tYW5kIHdoZXJlIGFsbCBwcm9jZXNzZXMgYXJlIGluY2x1ZGVkXG4gKi9cbm1ldGhvZHMubGlzdFByb2Nlc3NTdGF0dXMgPSBhc3luYyBmdW5jdGlvbiBsaXN0UHJvY2Vzc1N0YXR1cyAoKSB7XG4gIGlmICghXy5pc0Jvb2xlYW4odGhpcy5fZG9lc1BzU3VwcG9ydEFPcHRpb24pKSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX2RvZXNQc1N1cHBvcnRBT3B0aW9uID0gL14tQVxcYi9tLnRlc3QoYXdhaXQgdGhpcy5zaGVsbChbJ3BzJywgJy0taGVscCddKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nLmRlYnVnKGUuc3RhY2spO1xuICAgICAgdGhpcy5fZG9lc1BzU3VwcG9ydEFPcHRpb24gPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGF3YWl0IHRoaXMuc2hlbGwodGhpcy5fZG9lc1BzU3VwcG9ydEFPcHRpb24gPyBbJ3BzJywgJy1BJ10gOiBbJ3BzJ10pO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHByb2Nlc3MgbmFtZSBmb3IgdGhlIGdpdmVuIHByb2Nlc3MgaWRlbnRpZmllclxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gcGlkIC0gVGhlIHZhbGlkIHByb2Nlc3MgaWRlbnRpZmllclxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBnaXZlbiBQSUQgaXMgZWl0aGVyIGludmFsaWQgb3IgaXMgbm90IHByZXNlbnRcbiAqIGluIHRoZSBhY3RpdmUgcHJvY2Vzc2VzIGxpc3RcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBwcm9jZXNzIG5hbWVcbiAqL1xubWV0aG9kcy5nZXROYW1lQnlQaWQgPSBhc3luYyBmdW5jdGlvbiBnZXROYW1lQnlQaWQgKHBpZCkge1xuICBpZiAoaXNOYU4ocGlkKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIFBJRCB2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgbnVtYmVyLiAnJHtwaWR9JyBpcyBnaXZlbiBpbnN0ZWFkYCk7XG4gIH1cbiAgcGlkID0gcGFyc2VJbnQocGlkLCAxMCk7XG5cbiAgY29uc3Qgc3Rkb3V0ID0gYXdhaXQgdGhpcy5saXN0UHJvY2Vzc1N0YXR1cygpO1xuICBjb25zdCB0aXRsZU1hdGNoID0gUFNfVElUTEVfUEFUVEVSTi5leGVjKHN0ZG91dCk7XG4gIGlmICghdGl0bGVNYXRjaCkge1xuICAgIGxvZy5kZWJ1ZyhzdGRvdXQpO1xuICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGdldCB0aGUgcHJvY2VzcyBuYW1lIGZvciBQSUQgJyR7cGlkfSdgKTtcbiAgfVxuICBjb25zdCBhbGxUaXRsZXMgPSB0aXRsZU1hdGNoWzFdLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICBjb25zdCBwaWRJbmRleCA9IGFsbFRpdGxlcy5pbmRleE9mKFBJRF9DT0xVTU5fVElUTEUpO1xuICAvLyBpdCBtaWdodCBub3QgYmUgc3RhYmxlIHRvIHRha2UgTkFNRSBieSBpbmRleCwgYmVjYXVzZSBkZXBlbmRpbmcgb24gdGhlXG4gIC8vIGFjdHVhbCBTREsgdGhlIHBzIG91dHB1dCBtaWdodCBub3QgY29udGFpbiBhbiBhYmJyZXZpYXRpb24gZm9yIHRoZSBTIGZsYWc6XG4gIC8vIFVTRVIgICAgIFBJRCAgIFBQSUQgIFZTSVpFICBSU1MgICAgIFdDSEFOICAgIFBDICAgICAgICBOQU1FXG4gIC8vIFVTRVIgICAgIFBJRCAgIFBQSUQgIFZTSVpFICBSU1MgICAgIFdDSEFOICAgIFBDICAgUyAgICBOQU1FXG4gIGNvbnN0IG5hbWVPZmZzZXQgPSBhbGxUaXRsZXMuaW5kZXhPZihQUk9DRVNTX05BTUVfQ09MVU1OX1RJVExFKSAtIGFsbFRpdGxlcy5sZW5ndGg7XG4gIGNvbnN0IHBpZFJlZ2V4ID0gbmV3IFJlZ0V4cChgXiguKlxcXFxiJHtwaWR9XFxcXGIuKikkYCwgJ2dtJyk7XG4gIGxldCBtYXRjaGVkTGluZTtcbiAgd2hpbGUgKChtYXRjaGVkTGluZSA9IHBpZFJlZ2V4LmV4ZWMoc3Rkb3V0KSkpIHtcbiAgICBjb25zdCBpdGVtcyA9IG1hdGNoZWRMaW5lWzFdLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICAgIGlmIChwYXJzZUludChpdGVtc1twaWRJbmRleF0sIDEwKSA9PT0gcGlkICYmIGl0ZW1zW2l0ZW1zLmxlbmd0aCArIG5hbWVPZmZzZXRdKSB7XG4gICAgICByZXR1cm4gaXRlbXNbaXRlbXMubGVuZ3RoICsgbmFtZU9mZnNldF07XG4gICAgfVxuICB9XG4gIGxvZy5kZWJ1ZyhzdGRvdXQpO1xuICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBnZXQgdGhlIHByb2Nlc3MgbmFtZSBmb3IgUElEICcke3BpZH0nYCk7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgbGlzdCBvZiBwcm9jZXNzIGlkcyBmb3IgdGhlIHBhcnRpY3VsYXIgcHJvY2VzcyBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgcGFydCBvZiBwcm9jZXNzIG5hbWUuXG4gKiBAcmV0dXJuIHtBcnJheS48bnVtYmVyPn0gVGhlIGxpc3Qgb2YgbWF0Y2hlZCBwcm9jZXNzIElEcyBvciBhbiBlbXB0eSBsaXN0LlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBwYXNzZWQgcHJvY2VzcyBuYW1lIGlzIG5vdCBhIHZhbGlkIG9uZVxuICovXG5tZXRob2RzLmdldFBJRHNCeU5hbWUgPSBhc3luYyBmdW5jdGlvbiBnZXRQSURzQnlOYW1lIChuYW1lKSB7XG4gIGxvZy5kZWJ1ZyhgR2V0dGluZyBJRHMgb2YgYWxsICcke25hbWV9JyBwcm9jZXNzZXNgKTtcbiAgaWYgKCF0aGlzLmlzVmFsaWRDbGFzcyhuYW1lKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwcm9jZXNzIG5hbWU6ICcke25hbWV9J2ApO1xuICB9XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2lzc3Vlcy8xMzU2N1xuICBpZiAoYXdhaXQgdGhpcy5nZXRBcGlMZXZlbCgpID49IDIzKSB7XG4gICAgaWYgKCFfLmlzQm9vbGVhbih0aGlzLl9pc1BncmVwQXZhaWxhYmxlKSkge1xuICAgICAgLy8gcGdyZXAgaXMgaW4gcHJpb3JpdHksIHNpbmNlIHBpZG9mIGhhcyBiZWVuIHJlcG9ydGVkIG9mIGhhdmluZyBidWdzIG9uIHNvbWUgcGxhdGZvcm1zXG4gICAgICBjb25zdCBwZ3JlcE91dHB1dCA9IF8udHJpbShhd2FpdCB0aGlzLnNoZWxsKFsncGdyZXAgLS1oZWxwOyBlY2hvICQ/J10pKTtcbiAgICAgIHRoaXMuX2lzUGdyZXBBdmFpbGFibGUgPSBwYXJzZUludChfLmxhc3QocGdyZXBPdXRwdXQuc3BsaXQoL1xccysvKSksIDEwKSA9PT0gMDtcbiAgICAgIGlmICh0aGlzLl9pc1BncmVwQXZhaWxhYmxlKSB7XG4gICAgICAgIHRoaXMuX2NhblBncmVwVXNlRnVsbENtZExpbmVTZWFyY2ggPSAvXi1mXFxiL20udGVzdChwZ3JlcE91dHB1dCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9pc1BpZG9mQXZhaWxhYmxlID0gcGFyc2VJbnQoYXdhaXQgdGhpcy5zaGVsbChbJ3BpZG9mIC0taGVscCA+IC9kZXYvbnVsbDsgZWNobyAkPyddKSwgMTApID09PSAwO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5faXNQZ3JlcEF2YWlsYWJsZSB8fCB0aGlzLl9pc1BpZG9mQXZhaWxhYmxlKSB7XG4gICAgICBjb25zdCBzaGVsbENvbW1hbmQgPSB0aGlzLl9pc1BncmVwQXZhaWxhYmxlXG4gICAgICAgID8gKHRoaXMuX2NhblBncmVwVXNlRnVsbENtZExpbmVTZWFyY2hcbiAgICAgICAgICA/IFsncGdyZXAnLCAnLWYnLCBfLmVzY2FwZVJlZ0V4cChgKFtbOmJsYW5rOl1dfF4pJHtuYW1lfShbWzpibGFuazpdXXwkKWApXVxuICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2lzc3Vlcy8xMzg3MlxuICAgICAgICAgIDogW2BwZ3JlcCBeJHtfLmVzY2FwZVJlZ0V4cChuYW1lLnNsaWNlKC1NQVhfUEdSRVBfUEFUVEVSTl9MRU4pKX0kIGAgK1xuICAgICAgICAgICAgICBgfHwgcGdyZXAgXiR7Xy5lc2NhcGVSZWdFeHAobmFtZS5zbGljZSgwLCBNQVhfUEdSRVBfUEFUVEVSTl9MRU4pKX0kYF0pXG4gICAgICAgIDogWydwaWRvZicsIG5hbWVdO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLnNoZWxsKHNoZWxsQ29tbWFuZCkpXG4gICAgICAgICAgLnNwbGl0KC9cXHMrLylcbiAgICAgICAgICAubWFwKCh4KSA9PiBwYXJzZUludCh4LCAxMCkpXG4gICAgICAgICAgLmZpbHRlcigoeCkgPT4gXy5pc0ludGVnZXIoeCkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBlcnJvciBjb2RlIDEgaXMgcmV0dXJuZWQgaWYgdGhlIHV0aWxpdHkgZGlkIG5vdCBmaW5kIGFueSBwcm9jZXNzZXNcbiAgICAgICAgLy8gd2l0aCB0aGUgZ2l2ZW4gbmFtZVxuICAgICAgICBpZiAoZS5jb2RlICE9PSAxKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZXh0cmFjdCBwcm9jZXNzIElEIG9mICcke25hbWV9JzogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF8uaW5jbHVkZXMoZS5zdGRlcnIgfHwgZS5zdGRvdXQsICdzeW50YXggZXJyb3InKSkge1xuICAgICAgICAgIGxvZy53YXJuKGBHb3QgYW4gdW5leHBlY3RlZCByZXNwb25zZSBmcm9tIHRoZSBzaGVsbCBpbnRlcnByZXRlcjogJHtlLnN0ZGVyciB8fCBlLnN0ZG91dH1gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBsb2cuZGVidWcoJ1VzaW5nIHBzLWJhc2VkIFBJRCBkZXRlY3Rpb24nKTtcbiAgY29uc3Qgc3Rkb3V0ID0gYXdhaXQgdGhpcy5saXN0UHJvY2Vzc1N0YXR1cygpO1xuICBjb25zdCB0aXRsZU1hdGNoID0gUFNfVElUTEVfUEFUVEVSTi5leGVjKHN0ZG91dCk7XG4gIGlmICghdGl0bGVNYXRjaCkge1xuICAgIGxvZy5kZWJ1ZyhzdGRvdXQpO1xuICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGV4dHJhY3QgUElEIG9mICcke25hbWV9JyBmcm9tIHBzIG91dHB1dGApO1xuICB9XG4gIGNvbnN0IGFsbFRpdGxlcyA9IHRpdGxlTWF0Y2hbMV0udHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gIGNvbnN0IHBpZEluZGV4ID0gYWxsVGl0bGVzLmluZGV4T2YoUElEX0NPTFVNTl9USVRMRSk7XG4gIGNvbnN0IHBpZHMgPSBbXTtcbiAgY29uc3QgcHJvY2Vzc05hbWVSZWdleCA9IG5ldyBSZWdFeHAoYF4oLipcXFxcYlxcXFxkK1xcXFxiLipcXFxcYiR7Xy5lc2NhcGVSZWdFeHAobmFtZSl9XFxcXGIuKikkYCwgJ2dtJyk7XG4gIGxldCBtYXRjaGVkTGluZTtcbiAgd2hpbGUgKChtYXRjaGVkTGluZSA9IHByb2Nlc3NOYW1lUmVnZXguZXhlYyhzdGRvdXQpKSkge1xuICAgIGNvbnN0IGl0ZW1zID0gbWF0Y2hlZExpbmVbMV0udHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgaWYgKHBpZEluZGV4ID49IGFsbFRpdGxlcy5sZW5ndGggfHwgaXNOYU4oaXRlbXNbcGlkSW5kZXhdKSkge1xuICAgICAgbG9nLmRlYnVnKHN0ZG91dCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBleHRyYWN0IFBJRCBvZiAnJHtuYW1lfScgZnJvbSAnJHttYXRjaGVkTGluZVsxXS50cmltKCl9J2ApO1xuICAgIH1cbiAgICBwaWRzLnB1c2gocGFyc2VJbnQoaXRlbXNbcGlkSW5kZXhdLCAxMCkpO1xuICB9XG4gIHJldHVybiBwaWRzO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGxpc3Qgb2YgcHJvY2VzcyBpZHMgZm9yIHRoZSBwYXJ0aWN1bGFyIHByb2Nlc3Mgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIHBhcnQgb2YgcHJvY2VzcyBuYW1lLlxuICogQHJldHVybiB7QXJyYXkuPG51bWJlcj59IFRoZSBsaXN0IG9mIG1hdGNoZWQgcHJvY2VzcyBJRHMgb3IgYW4gZW1wdHkgbGlzdC5cbiAqL1xubWV0aG9kcy5raWxsUHJvY2Vzc2VzQnlOYW1lID0gYXN5bmMgZnVuY3Rpb24ga2lsbFByb2Nlc3Nlc0J5TmFtZSAobmFtZSkge1xuICB0cnkge1xuICAgIGxvZy5kZWJ1ZyhgQXR0ZW1wdGluZyB0byBraWxsIGFsbCAke25hbWV9IHByb2Nlc3Nlc2ApO1xuICAgIGNvbnN0IHBpZHMgPSBhd2FpdCB0aGlzLmdldFBJRHNCeU5hbWUobmFtZSk7XG4gICAgaWYgKF8uaXNFbXB0eShwaWRzKSkge1xuICAgICAgbG9nLmluZm8oYE5vICcke25hbWV9JyBwcm9jZXNzIGhhcyBiZWVuIGZvdW5kYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IEIuYWxsKHBpZHMubWFwKChwKSA9PiB0aGlzLmtpbGxQcm9jZXNzQnlQSUQocCkpKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBraWxsICR7bmFtZX0gcHJvY2Vzc2VzLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogS2lsbCB0aGUgcGFydGljdWxhciBwcm9jZXNzIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqIFRoZSBjdXJyZW50IHVzZXIgaXMgYXV0b21hdGljYWxseSBzd2l0Y2hlZCB0byByb290IGlmIG5lY2Vzc2FyeSBpbiBvcmRlclxuICogdG8gcHJvcGVybHkga2lsbCB0aGUgcHJvY2Vzcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHBpZCAtIFRoZSBJRCBvZiB0aGUgcHJvY2VzcyB0byBiZSBraWxsZWQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHByb2Nlc3MgY2Fubm90IGJlIGtpbGxlZC5cbiAqL1xubWV0aG9kcy5raWxsUHJvY2Vzc0J5UElEID0gYXN5bmMgZnVuY3Rpb24ga2lsbFByb2Nlc3NCeVBJRCAocGlkKSB7XG4gIGxvZy5kZWJ1ZyhgQXR0ZW1wdGluZyB0byBraWxsIHByb2Nlc3MgJHtwaWR9YCk7XG4gIGNvbnN0IG5vUHJvY2Vzc0ZsYWcgPSAnTm8gc3VjaCBwcm9jZXNzJztcbiAgdHJ5IHtcbiAgICAvLyBDaGVjayBpZiB0aGUgcHJvY2VzcyBleGlzdHMgYW5kIHRocm93IGFuIGV4Y2VwdGlvbiBvdGhlcndpc2VcbiAgICBhd2FpdCB0aGlzLnNoZWxsKFsna2lsbCcsIHBpZF0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKF8uaW5jbHVkZXMoZS5zdGRlcnIsIG5vUHJvY2Vzc0ZsYWcpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghXy5pbmNsdWRlcyhlLnN0ZGVyciwgJ09wZXJhdGlvbiBub3QgcGVybWl0dGVkJykpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIGxvZy5pbmZvKGBDYW5ub3Qga2lsbCBQSUQgJHtwaWR9IGR1ZSB0byBpbnN1ZmZpY2llbnQgcGVybWlzc2lvbnMuIFJldHJ5aW5nIGFzIHJvb3RgKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5zaGVsbChbJ2tpbGwnLCBwaWRdLCB7XG4gICAgICAgIHByaXZpbGVnZWQ6IHRydWVcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUxKSB7XG4gICAgICBpZiAoXy5pbmNsdWRlcyhlMS5zdGRlcnIsIG5vUHJvY2Vzc0ZsYWcpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRocm93IGUxO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBCcm9hZGNhc3QgcHJvY2VzcyBraWxsaW5nIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaW50ZW50IC0gVGhlIG5hbWUgb2YgdGhlIGludGVudCB0byBicm9hZGNhc3QgdG8uXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvY2Vzc05hbWUgLSBUaGUgbmFtZSBvZiB0aGUga2lsbGVkIHByb2Nlc3MuXG4gKiBAdGhyb3dzIHtlcnJvcn0gSWYgdGhlIHByb2Nlc3Mgd2FzIG5vdCBraWxsZWQuXG4gKi9cbm1ldGhvZHMuYnJvYWRjYXN0UHJvY2Vzc0VuZCA9IGFzeW5jIGZ1bmN0aW9uIGJyb2FkY2FzdFByb2Nlc3NFbmQgKGludGVudCwgcHJvY2Vzc05hbWUpIHtcbiAgLy8gc3RhcnQgdGhlIGJyb2FkY2FzdCB3aXRob3V0IHdhaXRpbmcgZm9yIGl0IHRvIGZpbmlzaC5cbiAgdGhpcy5icm9hZGNhc3QoaW50ZW50KTtcbiAgLy8gd2FpdCBmb3IgdGhlIHByb2Nlc3MgdG8gZW5kXG4gIGxldCBzdGFydCA9IERhdGUubm93KCk7XG4gIGxldCB0aW1lb3V0TXMgPSA0MDAwMDtcbiAgdHJ5IHtcbiAgICB3aGlsZSAoKERhdGUubm93KCkgLSBzdGFydCkgPCB0aW1lb3V0TXMpIHtcbiAgICAgIGlmIChhd2FpdCB0aGlzLnByb2Nlc3NFeGlzdHMocHJvY2Vzc05hbWUpKSB7XG4gICAgICAgIC8vIGNvb2wgZG93blxuICAgICAgICBhd2FpdCBzbGVlcCg0MDApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBQcm9jZXNzIG5ldmVyIGRpZWQgd2l0aGluICR7dGltZW91dE1zfSBtc2ApO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gYnJvYWRjYXN0IHByb2Nlc3MgZW5kLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogQnJvYWRjYXN0IGEgbWVzc2FnZSB0byB0aGUgZ2l2ZW4gaW50ZW50LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnRlbnQgLSBUaGUgbmFtZSBvZiB0aGUgaW50ZW50IHRvIGJyb2FkY2FzdCB0by5cbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiBpbnRlbnQgbmFtZSBpcyBub3QgYSB2YWxpZCBjbGFzcyBuYW1lLlxuICovXG5tZXRob2RzLmJyb2FkY2FzdCA9IGFzeW5jIGZ1bmN0aW9uIGJyb2FkY2FzdCAoaW50ZW50KSB7XG4gIGlmICghdGhpcy5pc1ZhbGlkQ2xhc3MoaW50ZW50KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBpbnRlbnQgJHtpbnRlbnR9YCk7XG4gIH1cbiAgbG9nLmRlYnVnKGBCcm9hZGNhc3Rpbmc6ICR7aW50ZW50fWApO1xuICBhd2FpdCB0aGlzLnNoZWxsKFsnYW0nLCAnYnJvYWRjYXN0JywgJy1hJywgaW50ZW50XSk7XG59O1xuXG4vKipcbiAqIEtpbGwgQW5kcm9pZCBpbnN0cnVtZW50cyBpZiB0aGV5IGFyZSBjdXJyZW50bHkgcnVubmluZy5cbiAqL1xubWV0aG9kcy5lbmRBbmRyb2lkQ292ZXJhZ2UgPSBhc3luYyBmdW5jdGlvbiBlbmRBbmRyb2lkQ292ZXJhZ2UgKCkge1xuICBpZiAodGhpcy5pbnN0cnVtZW50UHJvYyAmJiB0aGlzLmluc3RydW1lbnRQcm9jLmlzUnVubmluZykge1xuICAgIGF3YWl0IHRoaXMuaW5zdHJ1bWVudFByb2Muc3RvcCgpO1xuICB9XG59O1xuXG4vKipcbiAqIEluc3RydW1lbnQgdGhlIHBhcnRpY3VsYXIgYWN0aXZpdHkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIGJlIGluc3RydW1lbnRlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhY3Rpdml0eSAtIFRoZSBuYW1lIG9mIHRoZSBtYWluIGFjdGl2aXR5IGluIHRoaXMgcGFja2FnZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnN0cnVtZW50V2l0aCAtIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIGluc3RydW1lbnRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBhY3Rpdml0eSB3aXRoLlxuICogQHRocm93cyB7ZXJyb3J9IElmIGFueSBleGNlcHRpb24gaXMgcmVwb3J0ZWQgYnkgYWRiIHNoZWxsLlxuICovXG5tZXRob2RzLmluc3RydW1lbnQgPSBhc3luYyBmdW5jdGlvbiBpbnN0cnVtZW50IChwa2csIGFjdGl2aXR5LCBpbnN0cnVtZW50V2l0aCkge1xuICBpZiAoYWN0aXZpdHlbMF0gIT09ICcuJykge1xuICAgIHBrZyA9ICcnO1xuICB9XG4gIGxldCBwa2dBY3Rpdml0eSA9IChwa2cgKyBhY3Rpdml0eSkucmVwbGFjZSgvXFwuKy9nLCAnLicpOyAvLyBGaXggcGtnLi5hY3Rpdml0eSBlcnJvclxuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5zaGVsbChbXG4gICAgJ2FtJywgJ2luc3RydW1lbnQnLFxuICAgICctZScsICdtYWluX2FjdGl2aXR5JyxcbiAgICBwa2dBY3Rpdml0eSxcbiAgICBpbnN0cnVtZW50V2l0aCxcbiAgXSk7XG4gIGlmIChzdGRvdXQuaW5kZXhPZignRXhjZXB0aW9uJykgIT09IC0xKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGV4Y2VwdGlvbiBkdXJpbmcgaW5zdHJ1bWVudGF0aW9uLiBPcmlnaW5hbCBlcnJvciAke3N0ZG91dC5zcGxpdCgnXFxuJylbMF19YCk7XG4gIH1cbn07XG5cbi8qKlxuICogQ29sbGVjdCBBbmRyb2lkIGNvdmVyYWdlIGJ5IGluc3RydW1lbnRpbmcgdGhlIHBhcnRpY3VsYXIgYWN0aXZpdHkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGluc3RydW1lbnRDbGFzcyAtIFRoZSBuYW1lIG9mIHRoZSBpbnN0cnVtZW50YXRpb24gY2xhc3MuXG4gKiBAcGFyYW0ge3N0cmluZ30gd2FpdFBrZyAtIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIGJlIGluc3RydW1lbnRlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB3YWl0QWN0aXZpdHkgLSBUaGUgbmFtZSBvZiB0aGUgbWFpbiBhY3Rpdml0eSBpbiB0aGlzIHBhY2thZ2UuXG4gKlxuICogQHJldHVybiB7cHJvbWlzZX0gVGhlIHByb21pc2UgaXMgc3VjY2Vzc2Z1bGx5IHJlc29sdmVkIGlmIHRoZSBpbnN0cnVtZW50YXRpb24gc3RhcnRzXG4gKiAgICAgICAgICAgICAgICAgICB3aXRob3V0IGVycm9ycy5cbiAqL1xubWV0aG9kcy5hbmRyb2lkQ292ZXJhZ2UgPSBhc3luYyBmdW5jdGlvbiBhbmRyb2lkQ292ZXJhZ2UgKGluc3RydW1lbnRDbGFzcywgd2FpdFBrZywgd2FpdEFjdGl2aXR5KSB7XG4gIGlmICghdGhpcy5pc1ZhbGlkQ2xhc3MoaW5zdHJ1bWVudENsYXNzKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjbGFzcyAke2luc3RydW1lbnRDbGFzc31gKTtcbiAgfVxuICByZXR1cm4gYXdhaXQgbmV3IEIoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGxldCBhcmdzID0gdGhpcy5leGVjdXRhYmxlLmRlZmF1bHRBcmdzXG4gICAgICAuY29uY2F0KFsnc2hlbGwnLCAnYW0nLCAnaW5zdHJ1bWVudCcsICctZScsICdjb3ZlcmFnZScsICd0cnVlJywgJy13J10pXG4gICAgICAuY29uY2F0KFtpbnN0cnVtZW50Q2xhc3NdKTtcbiAgICBsb2cuZGVidWcoYENvbGxlY3RpbmcgY292ZXJhZ2UgZGF0YSB3aXRoOiAke1t0aGlzLmV4ZWN1dGFibGUucGF0aF0uY29uY2F0KGFyZ3MpLmpvaW4oJyAnKX1gKTtcbiAgICB0cnkge1xuICAgICAgLy8gYW0gaW5zdHJ1bWVudCBydW5zIGZvciB0aGUgbGlmZSBvZiB0aGUgYXBwIHByb2Nlc3MuXG4gICAgICB0aGlzLmluc3RydW1lbnRQcm9jID0gbmV3IFN1YlByb2Nlc3ModGhpcy5leGVjdXRhYmxlLnBhdGgsIGFyZ3MpO1xuICAgICAgYXdhaXQgdGhpcy5pbnN0cnVtZW50UHJvYy5zdGFydCgwKTtcbiAgICAgIHRoaXMuaW5zdHJ1bWVudFByb2Mub24oJ291dHB1dCcsIChzdGRvdXQsIHN0ZGVycikgPT4ge1xuICAgICAgICBpZiAoc3RkZXJyKSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIHJ1biBpbnN0cnVtZW50YXRpb24uIE9yaWdpbmFsIGVycm9yOiAke3N0ZGVycn1gKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yQWN0aXZpdHkod2FpdFBrZywgd2FpdEFjdGl2aXR5KTtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZWplY3QobmV3IEVycm9yKGBBbmRyb2lkIGNvdmVyYWdlIGZhaWxlZC4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApKTtcbiAgICB9XG4gIH0pO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIHBhcnRpY3VsYXIgcHJvcGVydHkgb2YgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS4gVGhpcyBuYW1lIHNob3VsZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUga25vd24gdG8gX2FkYiBzaGVsbCBnZXRwcm9wXyB0b29sLlxuICpcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBwcm9wZXJ0eS5cbiAqL1xubWV0aG9kcy5nZXREZXZpY2VQcm9wZXJ0eSA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZVByb3BlcnR5IChwcm9wZXJ0eSkge1xuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5zaGVsbChbJ2dldHByb3AnLCBwcm9wZXJ0eV0pO1xuICBsZXQgdmFsID0gc3Rkb3V0LnRyaW0oKTtcbiAgbG9nLmRlYnVnKGBDdXJyZW50IGRldmljZSBwcm9wZXJ0eSAnJHtwcm9wZXJ0eX0nOiAke3ZhbH1gKTtcbiAgcmV0dXJuIHZhbDtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gc2V0UHJvcE9wdHNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcHJpdmlsZWdlZCAtIERvIHdlIHJ1biBzZXRQcm9wIGFzIGEgcHJpdmlsZWdlZCBjb21tYW5kPyBEZWZhdWx0IHRydWUuXG4gKi9cblxuLyoqXG4gKiBTZXQgdGhlIHBhcnRpY3VsYXIgcHJvcGVydHkgb2YgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS4gVGhpcyBuYW1lIHNob3VsZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUga25vd24gdG8gX2FkYiBzaGVsbCBzZXRwcm9wXyB0b29sLlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbCAtIFRoZSBuZXcgcHJvcGVydHkgdmFsdWUuXG4gKiBAcGFyYW0ge3NldFByb3BPcHRzfSBvcHRzXG4gKlxuICogQHRocm93cyB7ZXJyb3J9IElmIF9zZXRwcm9wXyB1dGlsaXR5IGZhaWxzIHRvIGNoYW5nZSBwcm9wZXJ0eSB2YWx1ZS5cbiAqL1xubWV0aG9kcy5zZXREZXZpY2VQcm9wZXJ0eSA9IGFzeW5jIGZ1bmN0aW9uIHNldERldmljZVByb3BlcnR5IChwcm9wLCB2YWwsIG9wdHMgPSB7fSkge1xuICBjb25zdCB7cHJpdmlsZWdlZCA9IHRydWV9ID0gb3B0cztcbiAgbG9nLmRlYnVnKGBTZXR0aW5nIGRldmljZSBwcm9wZXJ0eSAnJHtwcm9wfScgdG8gJyR7dmFsfSdgKTtcbiAgYXdhaXQgdGhpcy5zaGVsbChbJ3NldHByb3AnLCBwcm9wLCB2YWxdLCB7XG4gICAgcHJpdmlsZWdlZCxcbiAgfSk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ30gQ3VycmVudCBzeXN0ZW0gbGFuZ3VhZ2Ugb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLmdldERldmljZVN5c0xhbmd1YWdlID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlU3lzTGFuZ3VhZ2UgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncGVyc2lzdC5zeXMubGFuZ3VhZ2UnKTtcbn07XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfSBDdXJyZW50IGNvdW50cnkgbmFtZSBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbm1ldGhvZHMuZ2V0RGV2aWNlU3lzQ291bnRyeSA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZVN5c0NvdW50cnkgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncGVyc2lzdC5zeXMuY291bnRyeScpO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEN1cnJlbnQgc3lzdGVtIGxvY2FsZSBuYW1lIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xubWV0aG9kcy5nZXREZXZpY2VTeXNMb2NhbGUgPSBhc3luYyBmdW5jdGlvbiBnZXREZXZpY2VTeXNMb2NhbGUgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncGVyc2lzdC5zeXMubG9jYWxlJyk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ30gQ3VycmVudCBwcm9kdWN0IGxhbmd1YWdlIG5hbWUgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLmdldERldmljZVByb2R1Y3RMYW5ndWFnZSA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZVByb2R1Y3RMYW5ndWFnZSAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdyby5wcm9kdWN0LmxvY2FsZS5sYW5ndWFnZScpO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEN1cnJlbnQgcHJvZHVjdCBjb3VudHJ5IG5hbWUgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLmdldERldmljZVByb2R1Y3RDb3VudHJ5ID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlUHJvZHVjdENvdW50cnkgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncm8ucHJvZHVjdC5sb2NhbGUucmVnaW9uJyk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ30gQ3VycmVudCBwcm9kdWN0IGxvY2FsZSBuYW1lIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xubWV0aG9kcy5nZXREZXZpY2VQcm9kdWN0TG9jYWxlID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlUHJvZHVjdExvY2FsZSAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdyby5wcm9kdWN0LmxvY2FsZScpO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBtb2RlbCBuYW1lIG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xubWV0aG9kcy5nZXRNb2RlbCA9IGFzeW5jIGZ1bmN0aW9uIGdldE1vZGVsICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3JvLnByb2R1Y3QubW9kZWwnKTtcbn07XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgbWFudWZhY3R1cmVyIG5hbWUgb2YgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLmdldE1hbnVmYWN0dXJlciA9IGFzeW5jIGZ1bmN0aW9uIGdldE1hbnVmYWN0dXJlciAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdyby5wcm9kdWN0Lm1hbnVmYWN0dXJlcicpO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGN1cnJlbnQgc2NyZWVuIHNpemUuXG4gKlxuICogQHJldHVybiB7c3RyaW5nfSBEZXZpY2Ugc2NyZWVuIHNpemUgYXMgc3RyaW5nIGluIGZvcm1hdCAnV3hIJyBvclxuICogICAgICAgICAgICAgICAgICBfbnVsbF8gaWYgaXQgY2Fubm90IGJlIGRldGVybWluZWQuXG4gKi9cbm1ldGhvZHMuZ2V0U2NyZWVuU2l6ZSA9IGFzeW5jIGZ1bmN0aW9uIGdldFNjcmVlblNpemUgKCkge1xuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5zaGVsbChbJ3dtJywgJ3NpemUnXSk7XG4gIGxldCBzaXplID0gbmV3IFJlZ0V4cCgvUGh5c2ljYWwgc2l6ZTogKFteXFxyP1xcbl0rKSovZykuZXhlYyhzdGRvdXQpO1xuICBpZiAoc2l6ZSAmJiBzaXplLmxlbmd0aCA+PSAyKSB7XG4gICAgcmV0dXJuIHNpemVbMV0udHJpbSgpO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGN1cnJlbnQgc2NyZWVuIGRlbnNpdHkgaW4gZHBpXG4gKlxuICogQHJldHVybiB7P251bWJlcn0gRGV2aWNlIHNjcmVlbiBkZW5zaXR5IGFzIGEgbnVtYmVyIG9yIF9udWxsXyBpZiBpdFxuICogICAgICAgICAgICAgICAgICBjYW5ub3QgYmUgZGV0ZXJtaW5lZFxuICovXG5tZXRob2RzLmdldFNjcmVlbkRlbnNpdHkgPSBhc3luYyBmdW5jdGlvbiBnZXRTY3JlZW5EZW5zaXR5ICgpIHtcbiAgbGV0IHN0ZG91dCA9IGF3YWl0IHRoaXMuc2hlbGwoWyd3bScsICdkZW5zaXR5J10pO1xuICBsZXQgZGVuc2l0eSA9IG5ldyBSZWdFeHAoL1BoeXNpY2FsIGRlbnNpdHk6IChbXlxccj9cXG5dKykqL2cpLmV4ZWMoc3Rkb3V0KTtcbiAgaWYgKGRlbnNpdHkgJiYgZGVuc2l0eS5sZW5ndGggPj0gMikge1xuICAgIGxldCBkZW5zaXR5TnVtYmVyID0gcGFyc2VJbnQoZGVuc2l0eVsxXS50cmltKCksIDEwKTtcbiAgICByZXR1cm4gaXNOYU4oZGVuc2l0eU51bWJlcikgPyBudWxsIDogZGVuc2l0eU51bWJlcjtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbi8qKlxuICogU2V0dXAgSFRUUCBwcm94eSBpbiBkZXZpY2UgZ2xvYmFsIHNldHRpbmdzLlxuICogUmVhZCBodHRwczovL2FuZHJvaWQuZ29vZ2xlc291cmNlLmNvbS9wbGF0Zm9ybS9mcmFtZXdvcmtzL2Jhc2UvKy9hbmRyb2lkLTkuMC4wX3IyMS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5ncy5qYXZhIGZvciBlYWNoIHByb3BlcnR5XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHByb3h5SG9zdCAtIFRoZSBob3N0IG5hbWUgb2YgdGhlIHByb3h5LlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBwcm94eVBvcnQgLSBUaGUgcG9ydCBudW1iZXIgdG8gYmUgc2V0LlxuICovXG5tZXRob2RzLnNldEh0dHBQcm94eSA9IGFzeW5jIGZ1bmN0aW9uIHNldEh0dHBQcm94eSAocHJveHlIb3N0LCBwcm94eVBvcnQpIHtcbiAgbGV0IHByb3h5ID0gYCR7cHJveHlIb3N0fToke3Byb3h5UG9ydH1gO1xuICBpZiAoXy5pc1VuZGVmaW5lZChwcm94eUhvc3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYWxsIHRvIHNldEh0dHBQcm94eSBtZXRob2Qgd2l0aCB1bmRlZmluZWQgcHJveHlfaG9zdDogJHtwcm94eX1gKTtcbiAgfVxuICBpZiAoXy5pc1VuZGVmaW5lZChwcm94eVBvcnQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYWxsIHRvIHNldEh0dHBQcm94eSBtZXRob2Qgd2l0aCB1bmRlZmluZWQgcHJveHlfcG9ydCAke3Byb3h5fWApO1xuICB9XG5cbiAgY29uc3QgaHR0cFByb3h5U2V0dGlucyA9IFtcbiAgICBbJ2h0dHBfcHJveHknLCBwcm94eV0sXG4gICAgWydnbG9iYWxfaHR0cF9wcm94eV9ob3N0JywgcHJveHlIb3N0XSxcbiAgICBbJ2dsb2JhbF9odHRwX3Byb3h5X3BvcnQnLCBwcm94eVBvcnRdXG4gIF07XG4gIGZvciAoY29uc3QgW3NldHRpbmdLZXksIHNldHRpbmdWYWx1ZV0gb2YgaHR0cFByb3h5U2V0dGlucykge1xuICAgIGF3YWl0IHRoaXMuc2V0U2V0dGluZygnZ2xvYmFsJywgc2V0dGluZ0tleSwgc2V0dGluZ1ZhbHVlKTtcbiAgfVxufTtcblxuLyoqXG4gKiBEZWxldGUgSFRUUCBwcm94eSBpbiBkZXZpY2UgZ2xvYmFsIHNldHRpbmdzLlxuICogUmVib290aW5nIHRoZSB0ZXN0IGRldmljZSBpcyBuZWNlc3NhcnkgdG8gYXBwbHkgdGhlIGNoYW5nZS5cbiAqL1xubWV0aG9kcy5kZWxldGVIdHRwUHJveHkgPSBhc3luYyBmdW5jdGlvbiBkZWxldGVIdHRwUHJveHkgKCkge1xuICBjb25zdCBodHRwUHJveHlTZXR0aW5zID0gW1xuICAgICdodHRwX3Byb3h5JyxcbiAgICAnZ2xvYmFsX2h0dHBfcHJveHlfaG9zdCcsXG4gICAgJ2dsb2JhbF9odHRwX3Byb3h5X3BvcnQnLFxuICAgICdnbG9iYWxfaHR0cF9wcm94eV9leGNsdXNpb25fbGlzdCcgLy8gYGdsb2JhbF9odHRwX3Byb3h5X2V4Y2x1c2lvbl9saXN0PWAgd2FzIGdlbmVyYXRlZCBieSBgc2V0dGluZ3MgZ2xvYmFsIGh0dG9fcHJveHkgeHh4eGBcbiAgXTtcbiAgZm9yIChjb25zdCBzZXR0aW5nIG9mIGh0dHBQcm94eVNldHRpbnMpIHtcbiAgICBhd2FpdCB0aGlzLnNoZWxsKFsnc2V0dGluZ3MnLCAnZGVsZXRlJywgJ2dsb2JhbCcsIHNldHRpbmddKTtcbiAgfVxufTtcblxuLyoqXG4gKiBTZXQgZGV2aWNlIHByb3BlcnR5LlxuICogW2FuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3Nde0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzLmh0bWx9XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVzcGFjZSAtIG9uZSBvZiB7c3lzdGVtLCBzZWN1cmUsIGdsb2JhbH0sIGNhc2UtaW5zZW5zaXRpdmUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc2V0dGluZyAtIHByb3BlcnR5IG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHZhbHVlIC0gcHJvcGVydHkgdmFsdWUuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IGNvbW1hbmQgb3V0cHV0LlxuICovXG5tZXRob2RzLnNldFNldHRpbmcgPSBhc3luYyBmdW5jdGlvbiBzZXRTZXR0aW5nIChuYW1lc3BhY2UsIHNldHRpbmcsIHZhbHVlKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnNoZWxsKFsnc2V0dGluZ3MnLCAncHV0JywgbmFtZXNwYWNlLCBzZXR0aW5nLCB2YWx1ZV0pO1xufTtcblxuLyoqXG4gKiBHZXQgZGV2aWNlIHByb3BlcnR5LlxuICogW2FuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3Nde0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzLmh0bWx9XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVzcGFjZSAtIG9uZSBvZiB7c3lzdGVtLCBzZWN1cmUsIGdsb2JhbH0sIGNhc2UtaW5zZW5zaXRpdmUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc2V0dGluZyAtIHByb3BlcnR5IG5hbWUuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHByb3BlcnR5IHZhbHVlLlxuICovXG5tZXRob2RzLmdldFNldHRpbmcgPSBhc3luYyBmdW5jdGlvbiBnZXRTZXR0aW5nIChuYW1lc3BhY2UsIHNldHRpbmcpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuc2hlbGwoWydzZXR0aW5ncycsICdnZXQnLCBuYW1lc3BhY2UsIHNldHRpbmddKTtcbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGBhZGIgYnVncmVwb3J0YCBjb21tYW5kIG91dHB1dC4gVGhpc1xuICogb3BlcmF0aW9uIG1heSB0YWtlIHVwIHRvIHNldmVyYWwgbWludXRlcy5cbiAqXG4gKiBAcGFyYW0gez9udW1iZXJ9IHRpbWVvdXQgWzEyMDAwMF0gLSBDb21tYW5kIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBDb21tYW5kIHN0ZG91dFxuICovXG5tZXRob2RzLmJ1Z3JlcG9ydCA9IGFzeW5jIGZ1bmN0aW9uIGJ1Z3JlcG9ydCAodGltZW91dCA9IDEyMDAwMCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGJFeGVjKFsnYnVncmVwb3J0J10sIHt0aW1lb3V0fSk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNjcmVlbnJlY29yZE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdmlkZW9TaXplIC0gVGhlIGZvcm1hdCBpcyB3aWR0aHhoZWlnaHQuXG4gKiAgICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHRoZSBkZXZpY2UncyBuYXRpdmUgZGlzcGxheSByZXNvbHV0aW9uIChpZiBzdXBwb3J0ZWQpLFxuICogICAgICAgICAgICAgICAgICAxMjgweDcyMCBpZiBub3QuIEZvciBiZXN0IHJlc3VsdHMsXG4gKiAgICAgICAgICAgICAgICAgIHVzZSBhIHNpemUgc3VwcG9ydGVkIGJ5IHlvdXIgZGV2aWNlJ3MgQWR2YW5jZWQgVmlkZW8gQ29kaW5nIChBVkMpIGVuY29kZXIuXG4gKiAgICAgICAgICAgICAgICAgIEZvciBleGFtcGxlLCBcIjEyODB4NzIwXCJcbiAqIEBwcm9wZXJ0eSB7P2Jvb2xlYW59IGJ1Z1JlcG9ydCAtIFNldCBpdCB0byBgdHJ1ZWAgaW4gb3JkZXIgdG8gZGlzcGxheSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIHRoZSB2aWRlbyBvdmVybGF5LFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjaCBhcyBhIHRpbWVzdGFtcCwgdGhhdCBpcyBoZWxwZnVsIGluIHZpZGVvcyBjYXB0dXJlZCB0byBpbGx1c3RyYXRlIGJ1Z3MuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG9wdGlvbiBpcyBvbmx5IHN1cHBvcnRlZCBzaW5jZSBBUEkgbGV2ZWwgMjcgKEFuZHJvaWQgUCkuXG4gKiBAcHJvcGVydHkgez9zdHJpbmd8bnVtYmVyfSB0aW1lTGltaXQgLSBUaGUgbWF4aW11bSByZWNvcmRpbmcgdGltZSwgaW4gc2Vjb25kcy5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IChhbmQgbWF4aW11bSkgdmFsdWUgaXMgMTgwICgzIG1pbnV0ZXMpLlxuICogQHByb3BlcnR5IHs/c3RyaW5nfG51bWJlcn0gYml0UmF0ZSAtIFRoZSB2aWRlbyBiaXQgcmF0ZSBmb3IgdGhlIHZpZGVvLCBpbiBtZWdhYml0cyBwZXIgc2Vjb25kLlxuICogICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgNC4gWW91IGNhbiBpbmNyZWFzZSB0aGUgYml0IHJhdGUgdG8gaW1wcm92ZSB2aWRlbyBxdWFsaXR5LFxuICogICAgICAgICAgICAgICAgYnV0IGRvaW5nIHNvIHJlc3VsdHMgaW4gbGFyZ2VyIG1vdmllIGZpbGVzLlxuICovXG5cbi8qKlxuICogSW5pdGlhdGUgc2NyZWVucmVjb3JkIHV0aWxpdHkgb24gdGhlIGRldmljZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZXN0aW5hdGlvbiAtIEZ1bGwgcGF0aCB0byB0aGUgd3JpdGFibGUgbWVkaWEgZmlsZSBkZXN0aW5hdGlvblxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gdGhlIGRldmljZSBmaWxlIHN5c3RlbS5cbiAqIEBwYXJhbSB7P1NjcmVlbnJlY29yZE9wdGlvbnN9IG9wdGlvbnMgW3t9XVxuICogQHJldHVybnMge1N1YlByb2Nlc3N9IHNjcmVlbnJlY29yZCBwcm9jZXNzLCB3aGljaCBjYW4gYmUgdGhlbiBjb250cm9sbGVkIGJ5IHRoZSBjbGllbnQgY29kZVxuICovXG5tZXRob2RzLnNjcmVlbnJlY29yZCA9IGZ1bmN0aW9uIHNjcmVlbnJlY29yZCAoZGVzdGluYXRpb24sIG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCBjbWQgPSBbJ3NjcmVlbnJlY29yZCddO1xuICBjb25zdCB7XG4gICAgdmlkZW9TaXplLFxuICAgIGJpdFJhdGUsXG4gICAgdGltZUxpbWl0LFxuICAgIGJ1Z1JlcG9ydCxcbiAgfSA9IG9wdGlvbnM7XG4gIGlmICh1dGlsLmhhc1ZhbHVlKHZpZGVvU2l6ZSkpIHtcbiAgICBjbWQucHVzaCgnLS1zaXplJywgdmlkZW9TaXplKTtcbiAgfVxuICBpZiAodXRpbC5oYXNWYWx1ZSh0aW1lTGltaXQpKSB7XG4gICAgY21kLnB1c2goJy0tdGltZS1saW1pdCcsIHRpbWVMaW1pdCk7XG4gIH1cbiAgaWYgKHV0aWwuaGFzVmFsdWUoYml0UmF0ZSkpIHtcbiAgICBjbWQucHVzaCgnLS1iaXQtcmF0ZScsIGJpdFJhdGUpO1xuICB9XG4gIGlmIChidWdSZXBvcnQpIHtcbiAgICBjbWQucHVzaCgnLS1idWdyZXBvcnQnKTtcbiAgfVxuICBjbWQucHVzaChkZXN0aW5hdGlvbik7XG5cbiAgY29uc3QgZnVsbENtZCA9IFtcbiAgICAuLi50aGlzLmV4ZWN1dGFibGUuZGVmYXVsdEFyZ3MsXG4gICAgJ3NoZWxsJyxcbiAgICAuLi5jbWRcbiAgXTtcbiAgbG9nLmRlYnVnKGBCdWlsZGluZyBzY3JlZW5yZWNvcmQgcHJvY2VzcyB3aXRoIHRoZSBjb21tYW5kIGxpbmU6IGFkYiAke3V0aWwucXVvdGUoZnVsbENtZCl9YCk7XG4gIHJldHVybiBuZXcgU3ViUHJvY2Vzcyh0aGlzLmV4ZWN1dGFibGUucGF0aCwgZnVsbENtZCk7XG59O1xuXG4vKipcbiAqIEV4ZWN1dGVzIHRoZSBnaXZlbiBmdW5jdGlvbiB3aXRoIHRoZSBnaXZlbiBpbnB1dCBtZXRob2QgY29udGV4dFxuICogYW5kIHRoZW4gcmVzdG9yZXMgdGhlIElNRSB0byB0aGUgb3JpZ2luYWwgdmFsdWVcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaW1lIC0gVmFsaWQgSU1FIGlkZW50aWZpZXJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIC0gRnVuY3Rpb24gdG8gZXhlY3V0ZVxuICogQHJldHVybnMgeyp9IFRoZSByZXN1bHQgb2YgdGhlIGdpdmVuIGZ1bmN0aW9uXG4gKi9cbm1ldGhvZHMucnVuSW5JbWVDb250ZXh0ID0gYXN5bmMgZnVuY3Rpb24gcnVuSW5JbWVDb250ZXh0IChpbWUsIGZuKSB7XG4gIGNvbnN0IG9yaWdpbmFsSW1lID0gYXdhaXQgdGhpcy5kZWZhdWx0SU1FKCk7XG4gIGlmIChvcmlnaW5hbEltZSA9PT0gaW1lKSB7XG4gICAgbG9nLmRlYnVnKGBUaGUgb3JpZ2luYWwgSU1FIGlzIHRoZSBzYW1lIGFzICcke2ltZX0nLiBUaGVyZSBpcyBubyBuZWVkIHRvIHJlc2V0IGl0YCk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgdGhpcy5lbmFibGVJTUUoaW1lKTtcbiAgICBhd2FpdCB0aGlzLnNldElNRShpbWUpO1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2lzc3Vlcy8xNTk0M1xuICAgIGF3YWl0IEIuZGVsYXkoNTAwKTtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChvcmlnaW5hbEltZSAhPT0gaW1lKSB7XG4gICAgICBhd2FpdCB0aGlzLnNldElNRShvcmlnaW5hbEltZSk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEdldCB0eiBkYXRhYmFzZSB0aW1lIHpvbmUgZm9ybWF0dGVkIHRpbWV6b25lXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVFogZGF0YWJhc2UgVGltZSBab25lcyBmb3JtYXRcbiAqXG4gKiBAdGhyb3dzIHtlcnJvcn0gSWYgYW55IGV4Y2VwdGlvbiBpcyByZXBvcnRlZCBieSBhZGIgc2hlbGwuXG4gKi9cbm1ldGhvZHMuZ2V0VGltZVpvbmUgPSBhc3luYyBmdW5jdGlvbiBnZXRUaW1lWm9uZSAoKSB7XG4gIGxvZy5kZWJ1ZygnR2V0dGluZyBjdXJyZW50IHRpbWV6b25lJyk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3BlcnNpc3Quc3lzLnRpbWV6b25lJyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGdldHRpbmcgdGltZXpvbmUuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGxpc3Qgb2YgZmVhdHVyZXMgc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UgdW5kZXIgdGVzdFxuICpcbiAqIEByZXR1cm5zIHtBcnJheTxzdHJpbmc+fSB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgZmVhdHVyZSBuYW1lcyBvciBhbiBlbXB0eSBsaXN0LlxuICogQW4gZXhhbXBsZSBhZGIgY29tbWFuZCBvdXRwdXQ6XG4gKiBgYGBcbiAqIGNtZFxuICogbHNfdjJcbiAqIGZpeGVkX3B1c2hfbWtkaXJcbiAqIHNoZWxsX3YyXG4gKiBhYmJcbiAqIHN0YXRfdjJcbiAqIGFwZXhcbiAqIGFiYl9leGVjXG4gKiByZW1vdW50X3NoZWxsXG4gKiBmaXhlZF9wdXNoX3N5bWxpbmtfdGltZXN0YW1wXG4gKiBgYGBcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgcmV0cmlldmluZyB0aGUgbGlzdFxuICovXG5tZXRob2RzLmxpc3RGZWF0dXJlcyA9IGFzeW5jIGZ1bmN0aW9uIGxpc3RGZWF0dXJlcyAoKSB7XG4gIHRoaXMuX21lbW9pemVkRmVhdHVyZXMgPSB0aGlzLl9tZW1vaXplZEZlYXR1cmVzXG4gICAgfHwgXy5tZW1vaXplKGFzeW5jICgpID0+IGF3YWl0IHRoaXMuYWRiRXhlYyhbJ2ZlYXR1cmVzJ10pLCAoKSA9PiB0aGlzLmN1ckRldmljZUlkKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuX21lbW9pemVkRmVhdHVyZXMoKSlcbiAgICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgICAubWFwKCh4KSA9PiB4LnRyaW0oKSlcbiAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoXy5pbmNsdWRlcyhlLnN0ZGVyciwgJ3Vua25vd24gY29tbWFuZCcpKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHRocm93IGU7XG4gIH1cbn07XG5cbi8qKlxuICogQ2hlY2tzIHRoZSBzdGF0ZSBvZiBzdHJlYW1lZCBpbnN0YWxsIGZlYXR1cmUuXG4gKiBUaGlzIGZlYXR1cmUgYWxsb3dzIHRvIHNwZWVkIHVwIGFwayBpbnN0YWxsYXRpb25cbiAqIHNpbmNlIGl0IGRvZXMgbm90IHJlcXVpcmUgdGhlIG9yaWdpbmFsIGFwayB0byBiZSBwdXNoZWQgdG9cbiAqIHRoZSBkZXZpY2UgdW5kZXIgdGVzdCBmaXJzdCwgd2hpY2ggYWxzbyBzYXZlcyBzcGFjZS5cbiAqIEFsdGhvdWdoLCBpdCBpcyByZXF1aXJlZCB0aGF0IGJvdGggdGhlIGRldmljZSB1bmRlciB0ZXN0XG4gKiBhbmQgdGhlIGFkYiBzZXJ2ZXIgaGF2ZSB0aGUgbWVudGlvbmVkIGZ1bmN0aW9uYWxpdHkuXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2Fvc3AtbWlycm9yL3BsYXRmb3JtX3N5c3RlbV9jb3JlL2Jsb2IvbWFzdGVyL2FkYi9jbGllbnQvYWRiX2luc3RhbGwuY3BwXG4gKiBmb3IgbW9yZSBkZXRhaWxzXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgYm90aCBhZGIgYW5kIHRoZVxuICogZGV2aWNlIHVuZGVyIHRlc3RcbiAqL1xubWV0aG9kcy5pc1N0cmVhbWVkSW5zdGFsbFN1cHBvcnRlZCA9IGFzeW5jIGZ1bmN0aW9uIGlzU3RyZWFtZWRJbnN0YWxsU3VwcG9ydGVkICgpIHtcbiAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcyk7XG4gIHByb3RvLl9oZWxwT3V0cHV0ID0gcHJvdG8uX2hlbHBPdXRwdXQgfHwgYXdhaXQgdGhpcy5hZGJFeGVjKFsnaGVscCddKTtcbiAgcmV0dXJuIHByb3RvLl9oZWxwT3V0cHV0LmluY2x1ZGVzKCctLXN0cmVhbWluZycpXG4gICAgJiYgKGF3YWl0IHRoaXMubGlzdEZlYXR1cmVzKCkpLmluY2x1ZGVzKCdjbWQnKTtcbn07XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgaW5jcmVtZW50YWwgaW5zdGFsbCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSBBREIuXG4gKiBSZWFkIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3ByZXZpZXcvZmVhdHVyZXMjaW5jcmVtZW50YWxcbiAqIGZvciBtb3JlIGRldGFpbHMgb24gaXQuXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgYm90aCBhZGIgYW5kIHRoZVxuICogZGV2aWNlIHVuZGVyIHRlc3RcbiAqL1xubWV0aG9kcy5pc0luY3JlbWVudGFsSW5zdGFsbFN1cHBvcnRlZCA9IGFzeW5jIGZ1bmN0aW9uIGlzSW5jcmVtZW50YWxJbnN0YWxsU3VwcG9ydGVkICgpIHtcbiAgY29uc3Qge2JpbmFyeX0gPSBhd2FpdCB0aGlzLmdldFZlcnNpb24oKTtcbiAgaWYgKCFiaW5hcnkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHV0aWwuY29tcGFyZVZlcnNpb25zKGJpbmFyeS52ZXJzaW9uLCAnPj0nLCAnMzAuMC4xJylcbiAgICAmJiAoYXdhaXQgdGhpcy5saXN0RmVhdHVyZXMoKSkuaW5jbHVkZXMoJ2FiYl9leGVjJyk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgbGlzdCBvZiBwYWNrYWdlcyBmcm9tIERvemUgd2hpdGVsaXN0IG9uIEFuZHJvaWQgOCtcbiAqXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gVGhlIGxpc3Qgb2Ygd2hpdGVsaXN0ZWQgcGFja2FnZXMuIEFuIGV4YW1wbGUgb3V0cHV0OlxuICogc3lzdGVtLGNvbS5hbmRyb2lkLnNoZWxsLDIwMDBcbiAqIHN5c3RlbSxjb20uZ29vZ2xlLmFuZHJvaWQuY2VsbGJyb2FkY2FzdHJlY2VpdmVyLDEwMTQzXG4gKiB1c2VyLGlvLmFwcGl1bS5zZXR0aW5ncywxMDE1N1xuICovXG5tZXRob2RzLmdldERldmljZUlkbGVXaGl0ZWxpc3QgPSBhc3luYyBmdW5jdGlvbiBnZXREZXZpY2VJZGxlV2hpdGVsaXN0ICgpIHtcbiAgaWYgKGF3YWl0IHRoaXMuZ2V0QXBpTGV2ZWwoKSA8IDIzKSB7XG4gICAgLy8gRG96ZSBtb2RlIGhhcyBvbmx5IGJlZW4gYWRkZWQgc2luY2UgQW5kcm9pZCA2XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgbG9nLmluZm8oJ0xpc3RpbmcgcGFja2FnZXMgaW4gRG96ZSB3aGl0ZWxpc3QnKTtcbiAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgdGhpcy5zaGVsbChbJ2R1bXBzeXMnLCAnZGV2aWNlaWRsZScsICd3aGl0ZWxpc3QnXSk7XG4gIHJldHVybiBfLnRyaW0ob3V0cHV0KS5zcGxpdCgvXFxuLylcbiAgICAubWFwKChsaW5lKSA9PiBfLnRyaW0obGluZSkpXG4gICAgLmZpbHRlcihCb29sZWFuKTtcbn07XG5cbi8qKlxuICogQWRkcyBhbiBleGlzdGluZyBwYWNrYWdlKHMpIGludG8gdGhlIERvemUgd2hpdGVsaXN0IG9uIEFuZHJvaWQgOCtcbiAqXG4gKiBAcGFyYW0gIHsuLi5zdHJpbmd9IHBhY2thZ2VzIE9uZSBvciBtb3JlIHBhY2thZ2VzIHRvIGFkZC4gSWYgdGhlIHBhY2thZ2VcbiAqIGFscmVhZHkgZXhpc3RzIGluIHRoZSB3aGl0ZWxpc3QgdGhlbiBpdCBpcyBvbmx5IGdvaW5nIHRvIGJlIGFkZGVkIG9uY2UuXG4gKiBJZiB0aGUgcGFja2FnZSB3aXRoIHRoZSBnaXZlbiBuYW1lIGlzIG5vdCBpbnN0YWxsZWQvbm90IGtub3duIHRoZW4gYW4gZXJyb3JcbiAqIHdpbGwgYmUgdGhyb3duLlxuICogQHJldHVybnMge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgY29tbWFuZCB0byBhZGQgcGFja2FnZShzKSBoYXMgYmVlbiBleGVjdXRlZFxuICovXG5tZXRob2RzLmFkZFRvRGV2aWNlSWRsZVdoaXRlbGlzdCA9IGFzeW5jIGZ1bmN0aW9uIGFkZFRvRGV2aWNlSWRsZVdoaXRlbGlzdCAoLi4ucGFja2FnZXMpIHtcbiAgaWYgKF8uaXNFbXB0eShwYWNrYWdlcykgfHwgYXdhaXQgdGhpcy5nZXRBcGlMZXZlbCgpIDwgMjMpIHtcbiAgICAvLyBEb3plIG1vZGUgaGFzIG9ubHkgYmVlbiBhZGRlZCBzaW5jZSBBbmRyb2lkIDZcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBsb2cuaW5mbyhgQWRkaW5nICR7dXRpbC5wbHVyYWxpemUoJ3BhY2thZ2UnLCBwYWNrYWdlcy5sZW5ndGgpfSAke0pTT04uc3RyaW5naWZ5KHBhY2thZ2VzKX0gdG8gRG96ZSB3aGl0ZWxpc3RgKTtcbiAgYXdhaXQgdGhpcy5zaGVsbENodW5rcygocGtnKSA9PiBbJ2R1bXBzeXMnLCAnZGV2aWNlaWRsZScsICd3aGl0ZWxpc3QnLCBgKyR7cGtnfWBdLCBwYWNrYWdlcyk7XG4gIHJldHVybiB0cnVlO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgbWV0aG9kcztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFJQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSx1QkFBdUIsR0FBRyxJQUFoQztBQUNBLE1BQU1DLHlCQUF5QixHQUFHLG1DQUFsQztBQUNBLE1BQU1DLG1CQUFtQixHQUFHLENBQzFCRCx5QkFEMEIsRUFFMUIscUJBRjBCLENBQTVCO0FBSUEsTUFBTUUscUJBQXFCLEdBQUcsRUFBOUI7QUFDQSxNQUFNQyxzQkFBc0IsR0FBRyxDQUM3Qiw4QkFENkIsRUFFN0IsMEJBRjZCLEVBRzdCLG1CQUg2QixDQUEvQjtBQUtBLE1BQU1DLGdCQUFnQixHQUFHLEtBQXpCO0FBQ0EsTUFBTUMseUJBQXlCLEdBQUcsTUFBbEM7QUFDQSxNQUFNQyxnQkFBZ0IsR0FBRyxJQUFJQyxNQUFKLENBQVksVUFBU0gsZ0JBQWlCLFdBQVVDLHlCQUEwQixTQUExRSxFQUFvRixHQUFwRixDQUF6QjtBQUVBLE1BQU1HLHdCQUF3QixHQUFHLG1CQUFqQztBQUVBLE1BQU1DLE9BQU8sR0FBRyxFQUFoQjs7QUFnQkFBLE9BQU8sQ0FBQ0MsV0FBUixHQUFzQixlQUFlQSxXQUFmLENBQTRCQyxjQUE1QixFQUE0Q0MsSUFBNUMsRUFBa0Q7RUFDdEUsTUFBTUMsUUFBUSxHQUFHLEVBQWpCO0VBQ0EsSUFBSUMsUUFBUSxHQUFHLEVBQWY7O0VBQ0EsS0FBSyxNQUFNQyxHQUFYLElBQWtCSCxJQUFsQixFQUF3QjtJQUN0QixNQUFNSSxPQUFPLEdBQUdMLGNBQWMsQ0FBQ0ksR0FBRCxDQUE5Qjs7SUFDQSxJQUFJLENBQUNFLGVBQUEsQ0FBRUMs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
|
|
@@ -211,17 +211,31 @@ methods.isValidClass = function isValidClass (classString) {
|
|
|
211
211
|
return matchComponentName(classString);
|
|
212
212
|
};
|
|
213
213
|
|
|
214
|
+
/**
|
|
215
|
+
* @typedef {Object} ResolveActivityOptions
|
|
216
|
+
* @property {boolean?} preferCmd [true] Whether to prefer `cmd` tool usage for
|
|
217
|
+
* launchable activity name detection. It might be useful to disable it if
|
|
218
|
+
* `cmd package resolve-activity` returns 'android/com.android.internal.app.ResolverActivity',
|
|
219
|
+
* which means the app has no default handler set in system settings.
|
|
220
|
+
* See https://github.com/appium/appium/issues/17128 for more details.
|
|
221
|
+
* This option has no effect if the target Android version is below 24 as there
|
|
222
|
+
* the corresponding `cmd` subcommand is not implemented and dumpsys usage is the only
|
|
223
|
+
* possible way to detect the launchable activity name.
|
|
224
|
+
*/
|
|
225
|
+
|
|
214
226
|
/**
|
|
215
227
|
* Fetches the fully qualified name of the launchable activity for the
|
|
216
228
|
* given package. It is expected the package is already installed on
|
|
217
229
|
* the device under test.
|
|
218
230
|
*
|
|
219
231
|
* @param {string} pkg - The target package identifier
|
|
232
|
+
* @param {ResolveActivityOptions?} opts
|
|
220
233
|
* @return {string} Fully qualified name of the launchable activity
|
|
221
234
|
* @throws {Error} If there was an error while resolving the activity name
|
|
222
235
|
*/
|
|
223
|
-
methods.resolveLaunchableActivity = async function resolveLaunchableActivity (pkg) {
|
|
224
|
-
|
|
236
|
+
methods.resolveLaunchableActivity = async function resolveLaunchableActivity (pkg, opts = {}) {
|
|
237
|
+
const { preferCmd = true } = opts;
|
|
238
|
+
if (!preferCmd || await this.getApiLevel() < 24) {
|
|
225
239
|
const stdout = await this.shell(['dumpsys', 'package', pkg]);
|
|
226
240
|
const names = parseLaunchableActivityNames(stdout);
|
|
227
241
|
if (_.isEmpty(names)) {
|