appium-webdriveragent 4.12.0 → 4.12.1

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.
@@ -355,4 +355,4 @@ class WebDriverAgent {
355
355
  exports.WebDriverAgent = WebDriverAgent;
356
356
  var _default = WebDriverAgent;
357
357
  exports.default = _default;
358
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJXREFfTEFVTkNIX1RJTUVPVVQiLCJXREFfQUdFTlRfUE9SVCIsIldEQV9DRl9CVU5ETEVfTkFNRSIsIlNIQVJFRF9SRVNPVVJDRVNfR1VBUkQiLCJBc3luY0xvY2siLCJXZWJEcml2ZXJBZ2VudCIsImNvbnN0cnVjdG9yIiwieGNvZGVWZXJzaW9uIiwiYXJncyIsImxvZyIsIl8iLCJjbG9uZSIsImRlZmF1bHRMb2dnZXIiLCJkZXZpY2UiLCJwbGF0Zm9ybVZlcnNpb24iLCJwbGF0Zm9ybU5hbWUiLCJpb3NTZGtWZXJzaW9uIiwiaG9zdCIsImlzUmVhbERldmljZSIsInJlYWxEZXZpY2UiLCJpZGIiLCJ3ZGFCdW5kbGVQYXRoIiwic2V0V0RBUGF0aHMiLCJib290c3RyYXBQYXRoIiwiYWdlbnRQYXRoIiwid2RhTG9jYWxQb3J0Iiwid2RhUmVtb3RlUG9ydCIsIndkYUJhc2VVcmwiLCJXREFfQkFTRV9VUkwiLCJwcmVidWlsZFdEQSIsIndlYkRyaXZlckFnZW50VXJsIiwic3RhcnRlZCIsIndkYUNvbm5lY3Rpb25UaW1lb3V0IiwidXNlWGN0ZXN0cnVuRmlsZSIsInVzZVByZWJ1aWx0V0RBIiwiZGVyaXZlZERhdGFQYXRoIiwibWpwZWdTZXJ2ZXJQb3J0IiwidXBkYXRlZFdEQUJ1bmRsZUlkIiwieGNvZGVidWlsZCIsIlhjb2RlQnVpbGQiLCJzaG93WGNvZGVMb2ciLCJ4Y29kZUNvbmZpZ0ZpbGUiLCJ4Y29kZU9yZ0lkIiwieGNvZGVTaWduaW5nSWQiLCJrZXljaGFpblBhdGgiLCJrZXljaGFpblBhc3N3b3JkIiwidXNlU2ltcGxlQnVpbGRUZXN0IiwibGF1bmNoVGltZW91dCIsIndkYUxhdW5jaFRpbWVvdXQiLCJhbGxvd1Byb3Zpc2lvbmluZ0RldmljZVJlZ2lzdHJhdGlvbiIsInJlc3VsdEJ1bmRsZVBhdGgiLCJyZXN1bHRCdW5kbGVWZXJzaW9uIiwiQk9PVFNUUkFQX1BBVEgiLCJpbmZvIiwicGF0aCIsInJlc29sdmUiLCJjbGVhbnVwT2Jzb2xldGVQcm9jZXNzZXMiLCJvYnNvbGV0ZVBpZHMiLCJnZXRQSURzTGlzdGVuaW5nT25Qb3J0IiwidXJsIiwicG9ydCIsImNtZExpbmUiLCJpbmNsdWRlcyIsInRvTG93ZXJDYXNlIiwidWRpZCIsImlzRW1wdHkiLCJkZWJ1ZyIsImxlbmd0aCIsImV4ZWMiLCJlIiwid2FybiIsIm1lc3NhZ2UiLCJpc1J1bm5pbmciLCJnZXRTdGF0dXMiLCJiYXNlUGF0aCIsIm5vU2Vzc2lvblByb3h5IiwiTm9TZXNzaW9uUHJveHkiLCJzZXJ2ZXIiLCJob3N0bmFtZSIsImJhc2UiLCJ0aW1lb3V0IiwiY29tbWFuZCIsImVyciIsImhyZWYiLCJ1bmluc3RhbGwiLCJidW5kbGVJZHMiLCJnZXRVc2VySW5zdGFsbGVkQnVuZGxlSWRzQnlCdW5kbGVOYW1lIiwiYnVuZGxlSWQiLCJyZW1vdmVBcHAiLCJfY2xlYW51cFByb2plY3RJZkZyZXNoIiwiaG9tZUZvbGRlciIsInByb2Nlc3MiLCJlbnYiLCJIT01FIiwiY3VycmVudFVwZ3JhZGVUaW1lc3RhbXAiLCJnZXRXREFVcGdyYWRlVGltZXN0YW1wIiwiaXNJbnRlZ2VyIiwidGltZXN0YW1wUGF0aCIsIldEQV9VUEdSQURFX1RJTUVTVEFNUF9QQVRIIiwiZGlkVGltZXN0YW1wRXhpc3QiLCJmcyIsImV4aXN0cyIsImFjY2VzcyIsIldfT0siLCJpZ24iLCJyZWNlbnRVcGdyYWRlVGltZXN0YW1wIiwicGFyc2VJbnQiLCJyZWFkRmlsZSIsIm1rZGlycCIsImRpcm5hbWUiLCJ3cml0ZUZpbGUiLCJjbGVhblByb2plY3QiLCJsYXVuY2giLCJzZXNzaW9uSWQiLCJzZXR1cFByb3hpZXMiLCJFcnJvciIsInN5bmNocm9uaXphdGlvbktleSIsIm5vcm1hbGl6ZSIsImFjcXVpcmUiLCJyZXNldFRlc3RQcm9jZXNzZXMiLCJzdGFydFdpdGhJREIiLCJpbml0IiwicHJlYnVpbGQiLCJzdGFydCIsIndkYUJ1bmRsZUlkIiwidGVzdEJ1bmRsZUlkIiwicHJlcGFyZVdEQSIsIlVTRV9QT1JUIiwiV0RBX1BST0RVQ1RfQlVORExFX0lERU5USUZJRVIiLCJNSlBFR19TRVJWRVJfUE9SVCIsInJ1blhDVUlUZXN0IiwicGFyc2VCdW5kbGVJZCIsImluZm9QbGlzdFBhdGgiLCJqb2luIiwiaW5mb1BsaXN0IiwicGxpc3QiLCJwYXJzZVBsaXN0IiwiQ0ZCdW5kbGVJZGVudGlmaWVyIiwiZmV0Y2hXREFCdW5kbGUiLCJpc0FwcEluc3RhbGxlZCIsImluc3RhbGxBcHAiLCJpbnN0YWxsWENUZXN0QnVuZGxlIiwiYnVuZGxlV0RBU2ltIiwid2RhQnVuZGxlUGF0aHMiLCJnbG9iIiwiV0RBX1JVTk5FUl9BUFAiLCJhYnNvbHV0ZSIsImlzU291cmNlRnJlc2giLCJleGlzdHNQcm9taXNlcyIsInNlcCIsIm1hcCIsInN1YlBhdGgiLCJCIiwiYWxsIiwic29tZSIsInYiLCJwcm94eU9wdHMiLCJrZWVwQWxpdmUiLCJqd3Byb3h5IiwiSldQcm94eSIsInByb3h5UmVxUmVzIiwiYmluZCIsInF1aXQiLCJyZXNldCIsIl91cmwiLCJwYXJzZSIsInByb3RvY29sIiwiZnVsbHlTdGFydGVkIiwicmV0cmlldmVEZXJpdmVkRGF0YVBhdGgiLCJzZXR1cENhY2hpbmciLCJzdGF0dXMiLCJidWlsZCIsInByb2R1Y3RCdW5kbGVJZGVudGlmaWVyIiwidXBncmFkZWRBdCIsInV0aWwiLCJoYXNWYWx1ZSIsIldEQV9SVU5ORVJfQlVORExFX0lEIiwiYWN0dWFsVXBncmFkZVRpbWVzdGFtcCIsInRvTG93ZXIiLCJxdWl0QW5kVW5pbnN0YWxsIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL3dlYmRyaXZlcmFnZW50LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB1cmwgZnJvbSAndXJsJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7IEpXUHJveHkgfSBmcm9tICdAYXBwaXVtL2Jhc2UtZHJpdmVyJztcbmltcG9ydCB7IGZzLCB1dGlsLCBwbGlzdCwgbWtkaXJwIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBkZWZhdWx0TG9nZ2VyIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCB7IE5vU2Vzc2lvblByb3h5IH0gZnJvbSAnLi9uby1zZXNzaW9uLXByb3h5JztcbmltcG9ydCB7XG4gIGdldFdEQVVwZ3JhZGVUaW1lc3RhbXAsIHJlc2V0VGVzdFByb2Nlc3NlcywgZ2V0UElEc0xpc3RlbmluZ09uUG9ydCwgQk9PVFNUUkFQX1BBVEhcbn0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgWGNvZGVCdWlsZCBmcm9tICcuL3hjb2RlYnVpbGQnO1xuaW1wb3J0IEFzeW5jTG9jayBmcm9tICdhc3luYy1sb2NrJztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHsgYnVuZGxlV0RBU2ltIH0gZnJvbSAnLi9jaGVjay1kZXBlbmRlbmNpZXMnO1xuaW1wb3J0IHtcbiAgV0RBX1JVTk5FUl9CVU5ETEVfSUQsIFdEQV9SVU5ORVJfQVBQLCBXREFfQkFTRV9VUkwsIFdEQV9VUEdSQURFX1RJTUVTVEFNUF9QQVRILFxufSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbmNvbnN0IFdEQV9MQVVOQ0hfVElNRU9VVCA9IDYwICogMTAwMDtcbmNvbnN0IFdEQV9BR0VOVF9QT1JUID0gODEwMDtcbmNvbnN0IFdEQV9DRl9CVU5ETEVfTkFNRSA9ICdXZWJEcml2ZXJBZ2VudFJ1bm5lci1SdW5uZXInO1xuY29uc3QgU0hBUkVEX1JFU09VUkNFU19HVUFSRCA9IG5ldyBBc3luY0xvY2soKTtcblxuY2xhc3MgV2ViRHJpdmVyQWdlbnQge1xuICBjb25zdHJ1Y3RvciAoeGNvZGVWZXJzaW9uLCBhcmdzID0ge30sIGxvZyA9IG51bGwpIHtcbiAgICB0aGlzLnhjb2RlVmVyc2lvbiA9IHhjb2RlVmVyc2lvbjtcblxuICAgIHRoaXMuYXJncyA9IF8uY2xvbmUoYXJncyk7XG4gICAgdGhpcy5sb2cgPSBsb2cgPz8gZGVmYXVsdExvZ2dlcjtcblxuICAgIHRoaXMuZGV2aWNlID0gYXJncy5kZXZpY2U7XG4gICAgdGhpcy5wbGF0Zm9ybVZlcnNpb24gPSBhcmdzLnBsYXRmb3JtVmVyc2lvbjtcbiAgICB0aGlzLnBsYXRmb3JtTmFtZSA9IGFyZ3MucGxhdGZvcm1OYW1lO1xuICAgIHRoaXMuaW9zU2RrVmVyc2lvbiA9IGFyZ3MuaW9zU2RrVmVyc2lvbjtcbiAgICB0aGlzLmhvc3QgPSBhcmdzLmhvc3Q7XG4gICAgdGhpcy5pc1JlYWxEZXZpY2UgPSAhIWFyZ3MucmVhbERldmljZTtcbiAgICB0aGlzLmlkYiA9IChhcmdzLmRldmljZSB8fCB7fSkuaWRiO1xuICAgIHRoaXMud2RhQnVuZGxlUGF0aCA9IGFyZ3Mud2RhQnVuZGxlUGF0aDtcblxuICAgIHRoaXMuc2V0V0RBUGF0aHMoYXJncy5ib290c3RyYXBQYXRoLCBhcmdzLmFnZW50UGF0aCk7XG5cbiAgICB0aGlzLndkYUxvY2FsUG9ydCA9IGFyZ3Mud2RhTG9jYWxQb3J0O1xuICAgIHRoaXMud2RhUmVtb3RlUG9ydCA9IGFyZ3Mud2RhTG9jYWxQb3J0IHx8IFdEQV9BR0VOVF9QT1JUO1xuICAgIHRoaXMud2RhQmFzZVVybCA9IGFyZ3Mud2RhQmFzZVVybCB8fCBXREFfQkFTRV9VUkw7XG5cbiAgICB0aGlzLnByZWJ1aWxkV0RBID0gYXJncy5wcmVidWlsZFdEQTtcblxuICAgIHRoaXMud2ViRHJpdmVyQWdlbnRVcmwgPSBhcmdzLndlYkRyaXZlckFnZW50VXJsO1xuXG4gICAgdGhpcy5zdGFydGVkID0gZmFsc2U7XG5cbiAgICB0aGlzLndkYUNvbm5lY3Rpb25UaW1lb3V0ID0gYXJncy53ZGFDb25uZWN0aW9uVGltZW91dDtcblxuICAgIHRoaXMudXNlWGN0ZXN0cnVuRmlsZSA9IGFyZ3MudXNlWGN0ZXN0cnVuRmlsZTtcbiAgICB0aGlzLnVzZVByZWJ1aWx0V0RBID0gYXJncy51c2VQcmVidWlsdFdEQTtcbiAgICB0aGlzLmRlcml2ZWREYXRhUGF0aCA9IGFyZ3MuZGVyaXZlZERhdGFQYXRoO1xuICAgIHRoaXMubWpwZWdTZXJ2ZXJQb3J0ID0gYXJncy5tanBlZ1NlcnZlclBvcnQ7XG5cbiAgICB0aGlzLnVwZGF0ZWRXREFCdW5kbGVJZCA9IGFyZ3MudXBkYXRlZFdEQUJ1bmRsZUlkO1xuXG4gICAgdGhpcy54Y29kZWJ1aWxkID0gbmV3IFhjb2RlQnVpbGQodGhpcy54Y29kZVZlcnNpb24sIHRoaXMuZGV2aWNlLCB7XG4gICAgICBwbGF0Zm9ybVZlcnNpb246IHRoaXMucGxhdGZvcm1WZXJzaW9uLFxuICAgICAgcGxhdGZvcm1OYW1lOiB0aGlzLnBsYXRmb3JtTmFtZSxcbiAgICAgIGlvc1Nka1ZlcnNpb246IHRoaXMuaW9zU2RrVmVyc2lvbixcbiAgICAgIGFnZW50UGF0aDogdGhpcy5hZ2VudFBhdGgsXG4gICAgICBib290c3RyYXBQYXRoOiB0aGlzLmJvb3RzdHJhcFBhdGgsXG4gICAgICByZWFsRGV2aWNlOiB0aGlzLmlzUmVhbERldmljZSxcbiAgICAgIHNob3dYY29kZUxvZzogYXJncy5zaG93WGNvZGVMb2csXG4gICAgICB4Y29kZUNvbmZpZ0ZpbGU6IGFyZ3MueGNvZGVDb25maWdGaWxlLFxuICAgICAgeGNvZGVPcmdJZDogYXJncy54Y29kZU9yZ0lkLFxuICAgICAgeGNvZGVTaWduaW5nSWQ6IGFyZ3MueGNvZGVTaWduaW5nSWQsXG4gICAgICBrZXljaGFpblBhdGg6IGFyZ3Mua2V5Y2hhaW5QYXRoLFxuICAgICAga2V5Y2hhaW5QYXNzd29yZDogYXJncy5rZXljaGFpblBhc3N3b3JkLFxuICAgICAgdXNlU2ltcGxlQnVpbGRUZXN0OiBhcmdzLnVzZVNpbXBsZUJ1aWxkVGVzdCxcbiAgICAgIHVzZVByZWJ1aWx0V0RBOiBhcmdzLnVzZVByZWJ1aWx0V0RBLFxuICAgICAgdXBkYXRlZFdEQUJ1bmRsZUlkOiB0aGlzLnVwZGF0ZWRXREFCdW5kbGVJZCxcbiAgICAgIGxhdW5jaFRpbWVvdXQ6IGFyZ3Mud2RhTGF1bmNoVGltZW91dCB8fCBXREFfTEFVTkNIX1RJTUVPVVQsXG4gICAgICB3ZGFSZW1vdGVQb3J0OiB0aGlzLndkYVJlbW90ZVBvcnQsXG4gICAgICB1c2VYY3Rlc3RydW5GaWxlOiB0aGlzLnVzZVhjdGVzdHJ1bkZpbGUsXG4gICAgICBkZXJpdmVkRGF0YVBhdGg6IGFyZ3MuZGVyaXZlZERhdGFQYXRoLFxuICAgICAgbWpwZWdTZXJ2ZXJQb3J0OiB0aGlzLm1qcGVnU2VydmVyUG9ydCxcbiAgICAgIGFsbG93UHJvdmlzaW9uaW5nRGV2aWNlUmVnaXN0cmF0aW9uOiBhcmdzLmFsbG93UHJvdmlzaW9uaW5nRGV2aWNlUmVnaXN0cmF0aW9uLFxuICAgICAgcmVzdWx0QnVuZGxlUGF0aDogYXJncy5yZXN1bHRCdW5kbGVQYXRoLFxuICAgICAgcmVzdWx0QnVuZGxlVmVyc2lvbjogYXJncy5yZXN1bHRCdW5kbGVWZXJzaW9uLFxuICAgIH0sIHRoaXMubG9nKTtcbiAgfVxuXG4gIHNldFdEQVBhdGhzIChib290c3RyYXBQYXRoLCBhZ2VudFBhdGgpIHtcbiAgICAvLyBhbGxvdyB0aGUgdXNlciB0byBzcGVjaWZ5IGEgcGxhY2UgZm9yIFdEQS4gVGhpcyBpcyB1bmRvY3VtZW50ZWQgYW5kXG4gICAgLy8gb25seSBoZXJlIGZvciB0aGUgcHVycG9zZXMgb2YgdGVzdGluZyBkZXZlbG9wbWVudCBvZiBXREFcbiAgICB0aGlzLmJvb3RzdHJhcFBhdGggPSBib290c3RyYXBQYXRoIHx8IEJPT1RTVFJBUF9QQVRIO1xuICAgIHRoaXMubG9nLmluZm8oYFVzaW5nIFdEQSBwYXRoOiAnJHt0aGlzLmJvb3RzdHJhcFBhdGh9J2ApO1xuXG4gICAgLy8gZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2UgbmVlZCB0byBiZSBhYmxlIHRvIHNwZWNpZnkgYWdlbnRQYXRoIHRvb1xuICAgIHRoaXMuYWdlbnRQYXRoID0gYWdlbnRQYXRoIHx8IHBhdGgucmVzb2x2ZSh0aGlzLmJvb3RzdHJhcFBhdGgsICdXZWJEcml2ZXJBZ2VudC54Y29kZXByb2onKTtcbiAgICB0aGlzLmxvZy5pbmZvKGBVc2luZyBXREEgYWdlbnQ6ICcke3RoaXMuYWdlbnRQYXRofSdgKTtcbiAgfVxuXG4gIGFzeW5jIGNsZWFudXBPYnNvbGV0ZVByb2Nlc3NlcyAoKSB7XG4gICAgY29uc3Qgb2Jzb2xldGVQaWRzID0gYXdhaXQgZ2V0UElEc0xpc3RlbmluZ09uUG9ydCh0aGlzLnVybC5wb3J0LFxuICAgICAgKGNtZExpbmUpID0+IGNtZExpbmUuaW5jbHVkZXMoJy9XZWJEcml2ZXJBZ2VudFJ1bm5lcicpICYmXG4gICAgICAgICFjbWRMaW5lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy5kZXZpY2UudWRpZC50b0xvd2VyQ2FzZSgpKSk7XG5cbiAgICBpZiAoXy5pc0VtcHR5KG9ic29sZXRlUGlkcykpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBObyBvYnNvbGV0ZSBjYWNoZWQgcHJvY2Vzc2VzIGZyb20gcHJldmlvdXMgV0RBIHNlc3Npb25zIGAgK1xuICAgICAgICBgbGlzdGVuaW5nIG9uIHBvcnQgJHt0aGlzLnVybC5wb3J0fSBoYXZlIGJlZW4gZm91bmRgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmxvZy5pbmZvKGBEZXRlY3RlZCAke29ic29sZXRlUGlkcy5sZW5ndGh9IG9ic29sZXRlIGNhY2hlZCBwcm9jZXNzJHtvYnNvbGV0ZVBpZHMubGVuZ3RoID09PSAxID8gJycgOiAnZXMnfSBgICtcbiAgICAgIGBmcm9tIHByZXZpb3VzIFdEQSBzZXNzaW9ucy4gQ2xlYW5pbmcgdGhlbSB1cGApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBleGVjKCdraWxsJywgb2Jzb2xldGVQaWRzKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZy53YXJuKGBGYWlsZWQgdG8ga2lsbCBvYnNvbGV0ZSBjYWNoZWQgcHJvY2VzcyR7b2Jzb2xldGVQaWRzLmxlbmd0aCA9PT0gMSA/ICcnIDogJ2VzJ30gJyR7b2Jzb2xldGVQaWRzfScuIGAgK1xuICAgICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYm9vbGVhbiBpZiBXREEgaXMgcnVubmluZyBvciBub3RcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBXREEgaXMgcnVubmluZ1xuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGludmFsaWQgcmVzcG9uc2UgY29kZSBvciBib2R5XG4gICAqL1xuICBhc3luYyBpc1J1bm5pbmcgKCkge1xuICAgIHJldHVybiAhIShhd2FpdCB0aGlzLmdldFN0YXR1cygpKTtcbiAgfVxuXG4gIGdldCBiYXNlUGF0aCAoKSB7XG4gICAgaWYgKHRoaXMudXJsLnBhdGggPT09ICcvJykge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy51cmwucGF0aCB8fCAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gY3VycmVudCBydW5uaW5nIFdEQSdzIHN0YXR1cyBsaWtlIGJlbG93XG4gICAqIHtcbiAgICogICBcInN0YXRlXCI6IFwic3VjY2Vzc1wiLFxuICAgKiAgIFwib3NcIjoge1xuICAgKiAgICAgXCJuYW1lXCI6IFwiaU9TXCIsXG4gICAqICAgICBcInZlcnNpb25cIjogXCIxMS40XCIsXG4gICAqICAgICBcInNka1ZlcnNpb25cIjogXCIxMS4zXCJcbiAgICogICB9LFxuICAgKiAgIFwiaW9zXCI6IHtcbiAgICogICAgIFwic2ltdWxhdG9yVmVyc2lvblwiOiBcIjExLjRcIixcbiAgICogICAgIFwiaXBcIjogXCIxNzIuMjU0Ljk5LjM0XCJcbiAgICogICB9LFxuICAgKiAgIFwiYnVpbGRcIjoge1xuICAgKiAgICAgXCJ0aW1lXCI6IFwiSnVuIDI0IDIwMTggMTc6MDg6MjFcIixcbiAgICogICAgIFwicHJvZHVjdEJ1bmRsZUlkZW50aWZpZXJcIjogXCJjb20uZmFjZWJvb2suV2ViRHJpdmVyQWdlbnRSdW5uZXJcIlxuICAgKiAgIH1cbiAgICogfVxuICAgKlxuICAgKiBAcmV0dXJuIHs/b2JqZWN0fSBTdGF0ZSBPYmplY3RcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBpbnZhbGlkIHJlc3BvbnNlIGNvZGUgb3IgYm9keVxuICAgKi9cbiAgYXN5bmMgZ2V0U3RhdHVzICgpIHtcbiAgICBjb25zdCBub1Nlc3Npb25Qcm94eSA9IG5ldyBOb1Nlc3Npb25Qcm94eSh7XG4gICAgICBzZXJ2ZXI6IHRoaXMudXJsLmhvc3RuYW1lLFxuICAgICAgcG9ydDogdGhpcy51cmwucG9ydCxcbiAgICAgIGJhc2U6IHRoaXMuYmFzZVBhdGgsXG4gICAgICB0aW1lb3V0OiAzMDAwLFxuICAgIH0pO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgbm9TZXNzaW9uUHJveHkuY29tbWFuZCgnL3N0YXR1cycsICdHRVQnKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBXREEgaXMgbm90IGxpc3RlbmluZyBhdCAnJHt0aGlzLnVybC5ocmVmfSdgKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbmluc3RhbGwgV0RBcyBmcm9tIHRoZSB0ZXN0IGRldmljZS5cbiAgICogT3ZlciBYY29kZSAxMSwgbXVsdGlwbGUgV0RBIGNhbiBiZSBpbiB0aGUgZGV2aWNlIHNpbmNlIFhjb2RlIDExIGdlbmVyYXRlcyBkaWZmZXJlbnQgV0RBLlxuICAgKiBBcHBpdW0gZG9lcyBub3QgZXhwZWN0IG11bHRpcGxlIFdEQXMgYXJlIHJ1bm5pbmcgb24gYSBkZXZpY2UuXG4gICAqL1xuICBhc3luYyB1bmluc3RhbGwgKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBidW5kbGVJZHMgPSBhd2FpdCB0aGlzLmRldmljZS5nZXRVc2VySW5zdGFsbGVkQnVuZGxlSWRzQnlCdW5kbGVOYW1lKFdEQV9DRl9CVU5ETEVfTkFNRSk7XG4gICAgICBpZiAoXy5pc0VtcHR5KGJ1bmRsZUlkcykpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoJ05vIFdEQXMgb24gdGhlIGRldmljZS4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgVW5pbnN0YWxsaW5nIFdEQXM6ICcke2J1bmRsZUlkc30nYCk7XG4gICAgICBmb3IgKGNvbnN0IGJ1bmRsZUlkIG9mIGJ1bmRsZUlkcykge1xuICAgICAgICBhd2FpdCB0aGlzLmRldmljZS5yZW1vdmVBcHAoYnVuZGxlSWQpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGUpO1xuICAgICAgdGhpcy5sb2cud2FybihgV2ViRHJpdmVyQWdlbnQgdW5pbnN0YWxsIGZhaWxlZC4gUGVyaGFwcywgaXQgaXMgYWxyZWFkeSB1bmluc3RhbGxlZD8gYCArXG4gICAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgX2NsZWFudXBQcm9qZWN0SWZGcmVzaCAoKSB7XG4gICAgY29uc3QgaG9tZUZvbGRlciA9IHByb2Nlc3MuZW52LkhPTUU7XG4gICAgaWYgKCFob21lRm9sZGVyKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKCdUaGUgSE9NRSBmb2xkZXIgcGF0aCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRVcGdyYWRlVGltZXN0YW1wID0gYXdhaXQgZ2V0V0RBVXBncmFkZVRpbWVzdGFtcCgpO1xuICAgIGlmICghXy5pc0ludGVnZXIoY3VycmVudFVwZ3JhZGVUaW1lc3RhbXApKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKCdJdCBpcyBpbXBvc3NpYmxlIHRvIGRldGVybWluZSB0aGUgdGltZXN0YW1wIG9mIHRoZSBwYWNrYWdlJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdGltZXN0YW1wUGF0aCA9IHBhdGgucmVzb2x2ZShob21lRm9sZGVyLCBXREFfVVBHUkFERV9USU1FU1RBTVBfUEFUSCk7XG4gICAgY29uc3QgZGlkVGltZXN0YW1wRXhpc3QgPSBhd2FpdCBmcy5leGlzdHModGltZXN0YW1wUGF0aCk7XG4gICAgaWYgKGRpZFRpbWVzdGFtcEV4aXN0KSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmcy5hY2Nlc3ModGltZXN0YW1wUGF0aCwgZnMuV19PSyk7XG4gICAgICB9IGNhdGNoIChpZ24pIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgV2ViRHJpdmVyQWdlbnQgdXBncmFkZSB0aW1lc3RhbXAgYXQgJyR7dGltZXN0YW1wUGF0aH0nIGlzIG5vdCB3cml0ZWFibGUuIGAgK1xuICAgICAgICAgIGBTa2lwcGluZyBzb3VyY2VzIGNsZWFudXBgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVjZW50VXBncmFkZVRpbWVzdGFtcCA9IHBhcnNlSW50KGF3YWl0IGZzLnJlYWRGaWxlKHRpbWVzdGFtcFBhdGgsICd1dGY4JyksIDEwKTtcbiAgICAgIGlmIChfLmlzSW50ZWdlcihyZWNlbnRVcGdyYWRlVGltZXN0YW1wKSkge1xuICAgICAgICBpZiAocmVjZW50VXBncmFkZVRpbWVzdGFtcCA+PSBjdXJyZW50VXBncmFkZVRpbWVzdGFtcCkge1xuICAgICAgICAgIHRoaXMubG9nLmluZm8oYFdlYkRyaXZlckFnZW50IGRvZXMgbm90IG5lZWQgYSBjbGVhbnVwLiBUaGUgc291cmNlcyBhcmUgdXAgdG8gZGF0ZSBgICtcbiAgICAgICAgICAgIGAoJHtyZWNlbnRVcGdyYWRlVGltZXN0YW1wfSA+PSAke2N1cnJlbnRVcGdyYWRlVGltZXN0YW1wfSlgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgV2ViRHJpdmVyQWdlbnQgc291cmNlcyBoYXZlIGJlZW4gdXBncmFkZWQgYCArXG4gICAgICAgICAgYCgke3JlY2VudFVwZ3JhZGVUaW1lc3RhbXB9IDwgJHtjdXJyZW50VXBncmFkZVRpbWVzdGFtcH0pYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBUaGUgcmVjZW50IHVwZ3JhZGUgdGltZXN0YW1wIGF0ICcke3RpbWVzdGFtcFBhdGh9JyBpcyBjb3JydXB0ZWQuIFRyeWluZyB0byBmaXggaXRgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgbWtkaXJwKHBhdGguZGlybmFtZSh0aW1lc3RhbXBQYXRoKSk7XG4gICAgICBhd2FpdCBmcy53cml0ZUZpbGUodGltZXN0YW1wUGF0aCwgYCR7Y3VycmVudFVwZ3JhZGVUaW1lc3RhbXB9YCwgJ3V0ZjgnKTtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTdG9yZWQgdGhlIHJlY2VudCBXZWJEcml2ZXJBZ2VudCB1cGdyYWRlIHRpbWVzdGFtcCAke2N1cnJlbnRVcGdyYWRlVGltZXN0YW1wfSBgICtcbiAgICAgICAgYGF0ICcke3RpbWVzdGFtcFBhdGh9J2ApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oYFVuYWJsZSB0byBjcmVhdGUgdGhlIHJlY2VudCBXZWJEcml2ZXJBZ2VudCB1cGdyYWRlIHRpbWVzdGFtcCBhdCAnJHt0aW1lc3RhbXBQYXRofScuIGAgK1xuICAgICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghZGlkVGltZXN0YW1wRXhpc3QpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oJ1RoZXJlIGlzIG5vIG5lZWQgdG8gcGVyZm9ybSB0aGUgcHJvamVjdCBjbGVhbnVwLiBBIGZyZXNoIGluc3RhbGwgaGFzIGJlZW4gZGV0ZWN0ZWQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy54Y29kZWJ1aWxkLmNsZWFuUHJvamVjdCgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nLndhcm4oYENhbm5vdCBwZXJmb3JtIFdlYkRyaXZlckFnZW50IHByb2plY3QgY2xlYW51cC4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gY3VycmVudCBydW5uaW5nIFdEQSdzIHN0YXR1cyBsaWtlIGJlbG93IGFmdGVyIGxhdW5jaGluZyBXREFcbiAgICoge1xuICAgKiAgIFwic3RhdGVcIjogXCJzdWNjZXNzXCIsXG4gICAqICAgXCJvc1wiOiB7XG4gICAqICAgICBcIm5hbWVcIjogXCJpT1NcIixcbiAgICogICAgIFwidmVyc2lvblwiOiBcIjExLjRcIixcbiAgICogICAgIFwic2RrVmVyc2lvblwiOiBcIjExLjNcIlxuICAgKiAgIH0sXG4gICAqICAgXCJpb3NcIjoge1xuICAgKiAgICAgXCJzaW11bGF0b3JWZXJzaW9uXCI6IFwiMTEuNFwiLFxuICAgKiAgICAgXCJpcFwiOiBcIjE3Mi4yNTQuOTkuMzRcIlxuICAgKiAgIH0sXG4gICAqICAgXCJidWlsZFwiOiB7XG4gICAqICAgICBcInRpbWVcIjogXCJKdW4gMjQgMjAxOCAxNzowODoyMVwiLFxuICAgKiAgICAgXCJwcm9kdWN0QnVuZGxlSWRlbnRpZmllclwiOiBcImNvbS5mYWNlYm9vay5XZWJEcml2ZXJBZ2VudFJ1bm5lclwiXG4gICAqICAgfVxuICAgKiB9XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZXNzaW9uSWQgTGF1bmNoIFdEQSBhbmQgZXN0YWJsaXNoIHRoZSBzZXNzaW9uIHdpdGggdGhpcyBzZXNzaW9uSWRcbiAgICogQHJldHVybiB7P29iamVjdH0gU3RhdGUgT2JqZWN0XG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgaW52YWxpZCByZXNwb25zZSBjb2RlIG9yIGJvZHlcbiAgICovXG4gIGFzeW5jIGxhdW5jaCAoc2Vzc2lvbklkKSB7XG4gICAgaWYgKHRoaXMud2ViRHJpdmVyQWdlbnRVcmwpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oYFVzaW5nIHByb3ZpZGVkIFdlYmRyaXZlckFnZW50IGF0ICcke3RoaXMud2ViRHJpdmVyQWdlbnRVcmx9J2ApO1xuICAgICAgdGhpcy51cmwgPSB0aGlzLndlYkRyaXZlckFnZW50VXJsO1xuICAgICAgdGhpcy5zZXR1cFByb3hpZXMoc2Vzc2lvbklkKTtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdldFN0YXR1cygpO1xuICAgIH1cblxuICAgIHRoaXMubG9nLmluZm8oJ0xhdW5jaGluZyBXZWJEcml2ZXJBZ2VudCBvbiB0aGUgZGV2aWNlJyk7XG5cbiAgICB0aGlzLnNldHVwUHJveGllcyhzZXNzaW9uSWQpO1xuXG4gICAgaWYgKCF0aGlzLnVzZVhjdGVzdHJ1bkZpbGUgJiYgIWF3YWl0IGZzLmV4aXN0cyh0aGlzLmFnZW50UGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVHJ5aW5nIHRvIHVzZSBXZWJEcml2ZXJBZ2VudCBwcm9qZWN0IGF0ICcke3RoaXMuYWdlbnRQYXRofScgYnV0IHRoZSBgICtcbiAgICAgICAgICAgICAgICAgICAgICAnZmlsZSBkb2VzIG5vdCBleGlzdCcpO1xuICAgIH1cblxuICAgIC8vIHVzZVhjdGVzdHJ1bkZpbGUgYW5kIHVzZVByZWJ1aWx0V0RBIHVzZSBleGlzdGluZyBkZXBlbmRlbmNpZXNcbiAgICAvLyBJdCBkZXBlbmRzIG9uIHVzZXIgc2lkZVxuICAgIGlmICh0aGlzLmlkYiB8fCB0aGlzLnVzZVhjdGVzdHJ1bkZpbGUgfHwgKHRoaXMuZGVyaXZlZERhdGFQYXRoICYmIHRoaXMudXNlUHJlYnVpbHRXREEpKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKCdTa2lwcGVkIFdEQSBwcm9qZWN0IGNsZWFudXAgYWNjb3JkaW5nIHRvIHRoZSBwcm92aWRlZCBjYXBhYmlsaXRpZXMnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc3luY2hyb25pemF0aW9uS2V5ID0gcGF0aC5ub3JtYWxpemUodGhpcy5ib290c3RyYXBQYXRoKTtcbiAgICAgIGF3YWl0IFNIQVJFRF9SRVNPVVJDRVNfR1VBUkQuYWNxdWlyZShzeW5jaHJvbml6YXRpb25LZXksXG4gICAgICAgIGFzeW5jICgpID0+IGF3YWl0IHRoaXMuX2NsZWFudXBQcm9qZWN0SWZGcmVzaCgpKTtcbiAgICB9XG5cbiAgICAvLyBXZSBuZWVkIHRvIHByb3ZpZGUgV0RBIGxvY2FsIHBvcnQsIGJlY2F1c2UgaXQgbWlnaHQgYmUgb2NjdXBpZWRcbiAgICBhd2FpdCByZXNldFRlc3RQcm9jZXNzZXModGhpcy5kZXZpY2UudWRpZCwgIXRoaXMuaXNSZWFsRGV2aWNlKTtcblxuICAgIGlmICh0aGlzLmlkYikge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc3RhcnRXaXRoSURCKCk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy54Y29kZWJ1aWxkLmluaXQodGhpcy5ub1Nlc3Npb25Qcm94eSk7XG5cbiAgICAvLyBTdGFydCB0aGUgeGNvZGVidWlsZCBwcm9jZXNzXG4gICAgaWYgKHRoaXMucHJlYnVpbGRXREEpIHtcbiAgICAgIGF3YWl0IHRoaXMueGNvZGVidWlsZC5wcmVidWlsZCgpO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgdGhpcy54Y29kZWJ1aWxkLnN0YXJ0KCk7XG4gIH1cblxuICBhc3luYyBzdGFydFdpdGhJREIgKCkge1xuICAgIHRoaXMubG9nLmluZm8oJ1dpbGwgbGF1bmNoIFdEQSB3aXRoIGlkYiBpbnN0ZWFkIG9mIHhjb2RlYnVpbGQgc2luY2UgdGhlIGNvcnJlc3BvbmRpbmcgZmxhZyBpcyBlbmFibGVkJyk7XG4gICAgY29uc3Qge3dkYUJ1bmRsZUlkLCB0ZXN0QnVuZGxlSWR9ID0gYXdhaXQgdGhpcy5wcmVwYXJlV0RBKCk7XG4gICAgY29uc3QgZW52ID0ge1xuICAgICAgVVNFX1BPUlQ6IHRoaXMud2RhUmVtb3RlUG9ydCxcbiAgICAgIFdEQV9QUk9EVUNUX0JVTkRMRV9JREVOVElGSUVSOiB0aGlzLnVwZGF0ZWRXREFCdW5kbGVJZCxcbiAgICB9O1xuICAgIGlmICh0aGlzLm1qcGVnU2VydmVyUG9ydCkge1xuICAgICAgZW52Lk1KUEVHX1NFUlZFUl9QT1JUID0gdGhpcy5tanBlZ1NlcnZlclBvcnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuaWRiLnJ1blhDVUlUZXN0KHdkYUJ1bmRsZUlkLCB3ZGFCdW5kbGVJZCwgdGVzdEJ1bmRsZUlkLCB7ZW52fSk7XG4gIH1cblxuICBhc3luYyBwYXJzZUJ1bmRsZUlkICh3ZGFCdW5kbGVQYXRoKSB7XG4gICAgY29uc3QgaW5mb1BsaXN0UGF0aCA9IHBhdGguam9pbih3ZGFCdW5kbGVQYXRoLCAnSW5mby5wbGlzdCcpO1xuICAgIGNvbnN0IGluZm9QbGlzdCA9IGF3YWl0IHBsaXN0LnBhcnNlUGxpc3QoYXdhaXQgZnMucmVhZEZpbGUoaW5mb1BsaXN0UGF0aCkpO1xuICAgIGlmICghaW5mb1BsaXN0LkNGQnVuZGxlSWRlbnRpZmllcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBidW5kbGUgaWQgaW4gJyR7aW5mb1BsaXN0UGF0aH0nYCk7XG4gICAgfVxuICAgIHJldHVybiBpbmZvUGxpc3QuQ0ZCdW5kbGVJZGVudGlmaWVyO1xuICB9XG5cbiAgYXN5bmMgcHJlcGFyZVdEQSAoKSB7XG4gICAgY29uc3Qgd2RhQnVuZGxlUGF0aCA9IHRoaXMud2RhQnVuZGxlUGF0aCB8fCBhd2FpdCB0aGlzLmZldGNoV0RBQnVuZGxlKCk7XG4gICAgY29uc3Qgd2RhQnVuZGxlSWQgPSBhd2FpdCB0aGlzLnBhcnNlQnVuZGxlSWQod2RhQnVuZGxlUGF0aCk7XG4gICAgaWYgKCFhd2FpdCB0aGlzLmRldmljZS5pc0FwcEluc3RhbGxlZCh3ZGFCdW5kbGVJZCkpIHtcbiAgICAgIGF3YWl0IHRoaXMuZGV2aWNlLmluc3RhbGxBcHAod2RhQnVuZGxlUGF0aCk7XG4gICAgfVxuICAgIGNvbnN0IHRlc3RCdW5kbGVJZCA9IGF3YWl0IHRoaXMuaWRiLmluc3RhbGxYQ1Rlc3RCdW5kbGUocGF0aC5qb2luKHdkYUJ1bmRsZVBhdGgsICdQbHVnSW5zJywgJ1dlYkRyaXZlckFnZW50UnVubmVyLnhjdGVzdCcpKTtcbiAgICByZXR1cm4ge3dkYUJ1bmRsZUlkLCB0ZXN0QnVuZGxlSWQsIHdkYUJ1bmRsZVBhdGh9O1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hXREFCdW5kbGUgKCkge1xuICAgIGlmICghdGhpcy5kZXJpdmVkRGF0YVBhdGgpIHtcbiAgICAgIHJldHVybiBhd2FpdCBidW5kbGVXREFTaW0odGhpcy54Y29kZWJ1aWxkKTtcbiAgICB9XG4gICAgY29uc3Qgd2RhQnVuZGxlUGF0aHMgPSBhd2FpdCBmcy5nbG9iKGAke3RoaXMuZGVyaXZlZERhdGFQYXRofS8qKi8qJHtXREFfUlVOTkVSX0FQUH0vYCwge1xuICAgICAgYWJzb2x1dGU6IHRydWUsXG4gICAgfSk7XG4gICAgaWYgKF8uaXNFbXB0eSh3ZGFCdW5kbGVQYXRocykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgdGhlIFdEQSBidW5kbGUgaW4gJyR7dGhpcy5kZXJpdmVkRGF0YVBhdGh9J2ApO1xuICAgIH1cbiAgICByZXR1cm4gd2RhQnVuZGxlUGF0aHNbMF07XG4gIH1cblxuICBhc3luYyBpc1NvdXJjZUZyZXNoICgpIHtcbiAgICBjb25zdCBleGlzdHNQcm9taXNlcyA9IFtcbiAgICAgICdSZXNvdXJjZXMnLFxuICAgICAgYFJlc291cmNlcyR7cGF0aC5zZXB9V2ViRHJpdmVyQWdlbnQuYnVuZGxlYCxcbiAgICBdLm1hcCgoc3ViUGF0aCkgPT4gZnMuZXhpc3RzKHBhdGgucmVzb2x2ZSh0aGlzLmJvb3RzdHJhcFBhdGgsIHN1YlBhdGgpKSk7XG4gICAgcmV0dXJuIChhd2FpdCBCLmFsbChleGlzdHNQcm9taXNlcykpLnNvbWUoKHYpID0+IHYgPT09IGZhbHNlKTtcbiAgfVxuXG4gIHNldHVwUHJveGllcyAoc2Vzc2lvbklkKSB7XG4gICAgY29uc3QgcHJveHlPcHRzID0ge1xuICAgICAgbG9nOiB0aGlzLmxvZyxcbiAgICAgIHNlcnZlcjogdGhpcy51cmwuaG9zdG5hbWUsXG4gICAgICBwb3J0OiB0aGlzLnVybC5wb3J0LFxuICAgICAgYmFzZTogdGhpcy5iYXNlUGF0aCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMud2RhQ29ubmVjdGlvblRpbWVvdXQsXG4gICAgICBrZWVwQWxpdmU6IHRydWUsXG4gICAgfTtcblxuICAgIHRoaXMuandwcm94eSA9IG5ldyBKV1Byb3h5KHByb3h5T3B0cyk7XG4gICAgdGhpcy5qd3Byb3h5LnNlc3Npb25JZCA9IHNlc3Npb25JZDtcbiAgICB0aGlzLnByb3h5UmVxUmVzID0gdGhpcy5qd3Byb3h5LnByb3h5UmVxUmVzLmJpbmQodGhpcy5qd3Byb3h5KTtcblxuICAgIHRoaXMubm9TZXNzaW9uUHJveHkgPSBuZXcgTm9TZXNzaW9uUHJveHkocHJveHlPcHRzKTtcbiAgfVxuXG4gIGFzeW5jIHF1aXQgKCkge1xuICAgIHRoaXMubG9nLmluZm8oJ1NodXR0aW5nIGRvd24gc3ViLXByb2Nlc3NlcycpO1xuXG4gICAgYXdhaXQgdGhpcy54Y29kZWJ1aWxkLnF1aXQoKTtcbiAgICBhd2FpdCB0aGlzLnhjb2RlYnVpbGQucmVzZXQoKTtcblxuICAgIGlmICh0aGlzLmp3cHJveHkpIHtcbiAgICAgIHRoaXMuandwcm94eS5zZXNzaW9uSWQgPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMuc3RhcnRlZCA9IGZhbHNlO1xuXG4gICAgaWYgKCF0aGlzLmFyZ3Mud2ViRHJpdmVyQWdlbnRVcmwpIHtcbiAgICAgIC8vIGlmIHdlIHBvcHVsYXRlZCB0aGUgdXJsIG91cnNlbHZlcyAoZHVyaW5nIGBzZXR1cENhY2hpbmdgIGNhbGwsIGZvciBpbnN0YW5jZSlcbiAgICAgIC8vIHRoZW4gY2xlYW4gdGhhdCB1cC4gSWYgdGhlIHVybCB3YXMgc3VwcGxpZWQsIHdlIHdhbnQgdG8ga2VlcCBpdFxuICAgICAgdGhpcy53ZWJEcml2ZXJBZ2VudFVybCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHVybCAoKSB7XG4gICAgaWYgKCF0aGlzLl91cmwpIHtcbiAgICAgIGlmICh0aGlzLndlYkRyaXZlckFnZW50VXJsKSB7XG4gICAgICAgIHRoaXMuX3VybCA9IHVybC5wYXJzZSh0aGlzLndlYkRyaXZlckFnZW50VXJsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHBvcnQgPSB0aGlzLndkYUxvY2FsUG9ydCB8fCBXREFfQUdFTlRfUE9SVDtcbiAgICAgICAgY29uc3Qge3Byb3RvY29sLCBob3N0bmFtZX0gPSB1cmwucGFyc2UodGhpcy53ZGFCYXNlVXJsIHx8IFdEQV9CQVNFX1VSTCk7XG4gICAgICAgIHRoaXMuX3VybCA9IHVybC5wYXJzZShgJHtwcm90b2NvbH0vLyR7aG9zdG5hbWV9OiR7cG9ydH1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3VybDtcbiAgfVxuXG4gIHNldCB1cmwgKF91cmwpIHtcbiAgICB0aGlzLl91cmwgPSB1cmwucGFyc2UoX3VybCk7XG4gIH1cblxuICBnZXQgZnVsbHlTdGFydGVkICgpIHtcbiAgICByZXR1cm4gdGhpcy5zdGFydGVkO1xuICB9XG5cbiAgc2V0IGZ1bGx5U3RhcnRlZCAoc3RhcnRlZCA9IGZhbHNlKSB7XG4gICAgdGhpcy5zdGFydGVkID0gc3RhcnRlZDtcbiAgfVxuXG4gIGFzeW5jIHJldHJpZXZlRGVyaXZlZERhdGFQYXRoICgpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy54Y29kZWJ1aWxkLnJldHJpZXZlRGVyaXZlZERhdGFQYXRoKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV1c2UgcnVubmluZyBXREEgaWYgaXQgaGFzIHRoZSBzYW1lIGJ1bmRsZSBpZCB3aXRoIHVwZGF0ZWRXREFCdW5kbGVJZC5cbiAgICogT3IgcmV1c2UgaXQgaWYgaXQgaGFzIHRoZSBkZWZhdWx0IGlkIHdpdGhvdXQgdXBkYXRlZFdEQUJ1bmRsZUlkLlxuICAgKiBVbmluc3RhbGwgaXQgaWYgdGhlIG1ldGhvZCBmYWNlcyBhbiBleGNlcHRpb24gZm9yIHRoZSBhYm92ZSBzaXR1YXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cGRhdGVkV0RBQnVuZGxlSWQgQnVuZGxlSWQgeW91J2QgbGlrZSB0byB1c2VcbiAgICovXG4gIGFzeW5jIHNldHVwQ2FjaGluZyAoKSB7XG4gICAgY29uc3Qgc3RhdHVzID0gYXdhaXQgdGhpcy5nZXRTdGF0dXMoKTtcbiAgICBpZiAoIXN0YXR1cyB8fCAhc3RhdHVzLmJ1aWxkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZygnV0RBIGlzIGN1cnJlbnRseSBub3QgcnVubmluZy4gVGhlcmUgaXMgbm90aGluZyB0byBjYWNoZScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHtcbiAgICAgIHByb2R1Y3RCdW5kbGVJZGVudGlmaWVyLFxuICAgICAgdXBncmFkZWRBdCxcbiAgICB9ID0gc3RhdHVzLmJ1aWxkO1xuICAgIC8vIGZvciByZWFsIGRldmljZVxuICAgIGlmICh1dGlsLmhhc1ZhbHVlKHByb2R1Y3RCdW5kbGVJZGVudGlmaWVyKSAmJiB1dGlsLmhhc1ZhbHVlKHRoaXMudXBkYXRlZFdEQUJ1bmRsZUlkKSAmJiB0aGlzLnVwZGF0ZWRXREFCdW5kbGVJZCAhPT0gcHJvZHVjdEJ1bmRsZUlkZW50aWZpZXIpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oYFdpbGwgdW5pbnN0YWxsIHJ1bm5pbmcgV0RBIHNpbmNlIGl0IGhhcyBkaWZmZXJlbnQgYnVuZGxlIGlkLiBUaGUgYWN0dWFsIHZhbHVlIGlzICcke3Byb2R1Y3RCdW5kbGVJZGVudGlmaWVyfScuYCk7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy51bmluc3RhbGwoKTtcbiAgICB9XG4gICAgLy8gZm9yIHNpbXVsYXRvclxuICAgIGlmICh1dGlsLmhhc1ZhbHVlKHByb2R1Y3RCdW5kbGVJZGVudGlmaWVyKSAmJiAhdXRpbC5oYXNWYWx1ZSh0aGlzLnVwZGF0ZWRXREFCdW5kbGVJZCkgJiYgV0RBX1JVTk5FUl9CVU5ETEVfSUQgIT09IHByb2R1Y3RCdW5kbGVJZGVudGlmaWVyKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBXaWxsIHVuaW5zdGFsbCBydW5uaW5nIFdEQSBzaW5jZSBpdHMgYnVuZGxlIGlkIGlzIG5vdCBlcXVhbCB0byB0aGUgZGVmYXVsdCB2YWx1ZSAke1dEQV9SVU5ORVJfQlVORExFX0lEfWApO1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudW5pbnN0YWxsKCk7XG4gICAgfVxuXG4gICAgY29uc3QgYWN0dWFsVXBncmFkZVRpbWVzdGFtcCA9IGF3YWl0IGdldFdEQVVwZ3JhZGVUaW1lc3RhbXAoKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgVXBncmFkZSB0aW1lc3RhbXAgb2YgdGhlIGN1cnJlbnRseSBidW5kbGVkIFdEQTogJHthY3R1YWxVcGdyYWRlVGltZXN0YW1wfWApO1xuICAgIHRoaXMubG9nLmRlYnVnKGBVcGdyYWRlIHRpbWVzdGFtcCBvZiB0aGUgV0RBIG9uIHRoZSBkZXZpY2U6ICR7dXBncmFkZWRBdH1gKTtcbiAgICBpZiAoYWN0dWFsVXBncmFkZVRpbWVzdGFtcCAmJiB1cGdyYWRlZEF0ICYmIF8udG9Mb3dlcihgJHthY3R1YWxVcGdyYWRlVGltZXN0YW1wfWApICE9PSBfLnRvTG93ZXIoYCR7dXBncmFkZWRBdH1gKSkge1xuICAgICAgdGhpcy5sb2cuaW5mbygnV2lsbCB1bmluc3RhbGwgcnVubmluZyBXREEgc2luY2UgaXQgaGFzIGRpZmZlcmVudCB2ZXJzaW9uIGluIGNvbXBhcmlzb24gdG8gdGhlIG9uZSAnICtcbiAgICAgICAgYHdoaWNoIGlzIGJ1bmRsZWQgd2l0aCBhcHBpdW0teGN1aXRlc3QtZHJpdmVyIG1vZHVsZSAoJHthY3R1YWxVcGdyYWRlVGltZXN0YW1wfSAhPSAke3VwZ3JhZGVkQXR9KWApO1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudW5pbnN0YWxsKCk7XG4gICAgfVxuXG4gICAgY29uc3QgbWVzc2FnZSA9IHV0aWwuaGFzVmFsdWUocHJvZHVjdEJ1bmRsZUlkZW50aWZpZXIpXG4gICAgICA/IGBXaWxsIHJldXNlIHByZXZpb3VzbHkgY2FjaGVkIFdEQSBpbnN0YW5jZSBhdCAnJHt0aGlzLnVybC5ocmVmfScgd2l0aCAnJHtwcm9kdWN0QnVuZGxlSWRlbnRpZmllcn0nYFxuICAgICAgOiBgV2lsbCByZXVzZSBwcmV2aW91c2x5IGNhY2hlZCBXREEgaW5zdGFuY2UgYXQgJyR7dGhpcy51cmwuaHJlZn0nYDtcbiAgICB0aGlzLmxvZy5pbmZvKGAke21lc3NhZ2V9LiBTZXQgdGhlIHdkYUxvY2FsUG9ydCBjYXBhYmlsaXR5IHRvIGEgdmFsdWUgZGlmZmVyZW50IGZyb20gJHt0aGlzLnVybC5wb3J0fSBpZiB0aGlzIGlzIGFuIHVuZGVzaXJlZCBiZWhhdmlvci5gKTtcbiAgICB0aGlzLndlYkRyaXZlckFnZW50VXJsID0gdGhpcy51cmwuaHJlZjtcbiAgfVxuXG4gIC8qKlxuICAgKiBRdWl0IGFuZCB1bmluc3RhbGwgcnVubmluZyBXREEuXG4gICAqL1xuICBhc3luYyBxdWl0QW5kVW5pbnN0YWxsICgpIHtcbiAgICBhd2FpdCB0aGlzLnF1aXQoKTtcbiAgICBhd2FpdCB0aGlzLnVuaW5zdGFsbCgpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFdlYkRyaXZlckFnZW50O1xuZXhwb3J0IHsgV2ViRHJpdmVyQWdlbnQgfTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUEsTUFBTUEsa0JBQWtCLEdBQUcsRUFBRSxHQUFHLElBQUk7QUFDcEMsTUFBTUMsY0FBYyxHQUFHLElBQUk7QUFDM0IsTUFBTUMsa0JBQWtCLEdBQUcsNkJBQTZCO0FBQ3hELE1BQU1DLHNCQUFzQixHQUFHLElBQUlDLGtCQUFTLEVBQUU7QUFFOUMsTUFBTUMsY0FBYyxDQUFDO0VBQ25CQyxXQUFXLENBQUVDLFlBQVksRUFBRUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFQyxH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
358
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfcGF0aCIsIl91cmwyIiwiX2JsdWViaXJkIiwiX2Jhc2VEcml2ZXIiLCJfc3VwcG9ydCIsIl9sb2dnZXIiLCJfbm9TZXNzaW9uUHJveHkiLCJfdXRpbHMiLCJfeGNvZGVidWlsZCIsIl9hc3luY0xvY2siLCJfdGVlbl9wcm9jZXNzIiwiX2NoZWNrRGVwZW5kZW5jaWVzIiwiX2NvbnN0YW50cyIsIldEQV9MQVVOQ0hfVElNRU9VVCIsIldEQV9BR0VOVF9QT1JUIiwiV0RBX0NGX0JVTkRMRV9OQU1FIiwiU0hBUkVEX1JFU09VUkNFU19HVUFSRCIsIkFzeW5jTG9jayIsIldlYkRyaXZlckFnZW50IiwiY29uc3RydWN0b3IiLCJ4Y29kZVZlcnNpb24iLCJhcmdzIiwibG9nIiwiXyIsImNsb25lIiwiZGVmYXVsdExvZ2dlciIsImRldmljZSIsInBsYXRmb3JtVmVyc2lvbiIsInBsYXRmb3JtTmFtZSIsImlvc1Nka1ZlcnNpb24iLCJob3N0IiwiaXNSZWFsRGV2aWNlIiwicmVhbERldmljZSIsImlkYiIsIndkYUJ1bmRsZVBhdGgiLCJzZXRXREFQYXRocyIsImJvb3RzdHJhcFBhdGgiLCJhZ2VudFBhdGgiLCJ3ZGFMb2NhbFBvcnQiLCJ3ZGFSZW1vdGVQb3J0Iiwid2RhQmFzZVVybCIsIldEQV9CQVNFX1VSTCIsInByZWJ1aWxkV0RBIiwid2ViRHJpdmVyQWdlbnRVcmwiLCJzdGFydGVkIiwid2RhQ29ubmVjdGlvblRpbWVvdXQiLCJ1c2VYY3Rlc3RydW5GaWxlIiwidXNlUHJlYnVpbHRXREEiLCJkZXJpdmVkRGF0YVBhdGgiLCJtanBlZ1NlcnZlclBvcnQiLCJ1cGRhdGVkV0RBQnVuZGxlSWQiLCJ4Y29kZWJ1aWxkIiwiWGNvZGVCdWlsZCIsInNob3dYY29kZUxvZyIsInhjb2RlQ29uZmlnRmlsZSIsInhjb2RlT3JnSWQiLCJ4Y29kZVNpZ25pbmdJZCIsImtleWNoYWluUGF0aCIsImtleWNoYWluUGFzc3dvcmQiLCJ1c2VTaW1wbGVCdWlsZFRlc3QiLCJsYXVuY2hUaW1lb3V0Iiwid2RhTGF1bmNoVGltZW91dCIsImFsbG93UHJvdmlzaW9uaW5nRGV2aWNlUmVnaXN0cmF0aW9uIiwicmVzdWx0QnVuZGxlUGF0aCIsInJlc3VsdEJ1bmRsZVZlcnNpb24iLCJCT09UU1RSQVBfUEFUSCIsImluZm8iLCJwYXRoIiwicmVzb2x2ZSIsImNsZWFudXBPYnNvbGV0ZVByb2Nlc3NlcyIsIm9ic29sZXRlUGlkcyIsImdldFBJRHNMaXN0ZW5pbmdPblBvcnQiLCJ1cmwiLCJwb3J0IiwiY21kTGluZSIsImluY2x1ZGVzIiwidG9Mb3dlckNhc2UiLCJ1ZGlkIiwiaXNFbXB0eSIsImRlYnVnIiwibGVuZ3RoIiwiZXhlYyIsImUiLCJ3YXJuIiwibWVzc2FnZSIsImlzUnVubmluZyIsImdldFN0YXR1cyIsImJhc2VQYXRoIiwibm9TZXNzaW9uUHJveHkiLCJOb1Nlc3Npb25Qcm94eSIsInNlcnZlciIsImhvc3RuYW1lIiwiYmFzZSIsInRpbWVvdXQiLCJjb21tYW5kIiwiZXJyIiwiaHJlZiIsInVuaW5zdGFsbCIsImJ1bmRsZUlkcyIsImdldFVzZXJJbnN0YWxsZWRCdW5kbGVJZHNCeUJ1bmRsZU5hbWUiLCJidW5kbGVJZCIsInJlbW92ZUFwcCIsIl9jbGVhbnVwUHJvamVjdElmRnJlc2giLCJob21lRm9sZGVyIiwicHJvY2VzcyIsImVudiIsIkhPTUUiLCJjdXJyZW50VXBncmFkZVRpbWVzdGFtcCIsImdldFdEQVVwZ3JhZGVUaW1lc3RhbXAiLCJpc0ludGVnZXIiLCJ0aW1lc3RhbXBQYXRoIiwiV0RBX1VQR1JBREVfVElNRVNUQU1QX1BBVEgiLCJkaWRUaW1lc3RhbXBFeGlzdCIsImZzIiwiZXhpc3RzIiwiYWNjZXNzIiwiV19PSyIsImlnbiIsInJlY2VudFVwZ3JhZGVUaW1lc3RhbXAiLCJwYXJzZUludCIsInJlYWRGaWxlIiwibWtkaXJwIiwiZGlybmFtZSIsIndyaXRlRmlsZSIsImNsZWFuUHJvamVjdCIsImxhdW5jaCIsInNlc3Npb25JZCIsInNldHVwUHJveGllcyIsIkVycm9yIiwic3luY2hyb25pemF0aW9uS2V5Iiwibm9ybWFsaXplIiwiYWNxdWlyZSIsInJlc2V0VGVzdFByb2Nlc3NlcyIsInN0YXJ0V2l0aElEQiIsImluaXQiLCJwcmVidWlsZCIsInN0YXJ0Iiwid2RhQnVuZGxlSWQiLCJ0ZXN0QnVuZGxlSWQiLCJwcmVwYXJlV0RBIiwiVVNFX1BPUlQiLCJXREFfUFJPRFVDVF9CVU5ETEVfSURFTlRJRklFUiIsIk1KUEVHX1NFUlZFUl9QT1JUIiwicnVuWENVSVRlc3QiLCJwYXJzZUJ1bmRsZUlkIiwiaW5mb1BsaXN0UGF0aCIsImpvaW4iLCJpbmZvUGxpc3QiLCJwbGlzdCIsInBhcnNlUGxpc3QiLCJDRkJ1bmRsZUlkZW50aWZpZXIiLCJmZXRjaFdEQUJ1bmRsZSIsImlzQXBwSW5zdGFsbGVkIiwiaW5zdGFsbEFwcCIsImluc3RhbGxYQ1Rlc3RCdW5kbGUiLCJidW5kbGVXREFTaW0iLCJ3ZGFCdW5kbGVQYXRocyIsImdsb2IiLCJXREFfUlVOTkVSX0FQUCIsImFic29sdXRlIiwiaXNTb3VyY2VGcmVzaCIsImV4aXN0c1Byb21pc2VzIiwic2VwIiwibWFwIiwic3ViUGF0aCIsIkIiLCJhbGwiLCJzb21lIiwidiIsInByb3h5T3B0cyIsImtlZXBBbGl2ZSIsImp3cHJveHkiLCJKV1Byb3h5IiwicHJveHlSZXFSZXMiLCJiaW5kIiwicXVpdCIsInJlc2V0IiwiX3VybCIsInBhcnNlIiwicHJvdG9jb2wiLCJmdWxseVN0YXJ0ZWQiLCJyZXRyaWV2ZURlcml2ZWREYXRhUGF0aCIsInNldHVwQ2FjaGluZyIsInN0YXR1cyIsImJ1aWxkIiwicHJvZHVjdEJ1bmRsZUlkZW50aWZpZXIiLCJ1cGdyYWRlZEF0IiwidXRpbCIsImhhc1ZhbHVlIiwiV0RBX1JVTk5FUl9CVU5ETEVfSUQiLCJhY3R1YWxVcGdyYWRlVGltZXN0YW1wIiwidG9Mb3dlciIsInF1aXRBbmRVbmluc3RhbGwiLCJleHBvcnRzIiwiX2RlZmF1bHQiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vbGliL3dlYmRyaXZlcmFnZW50LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB1cmwgZnJvbSAndXJsJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7IEpXUHJveHkgfSBmcm9tICdAYXBwaXVtL2Jhc2UtZHJpdmVyJztcbmltcG9ydCB7IGZzLCB1dGlsLCBwbGlzdCwgbWtkaXJwIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBkZWZhdWx0TG9nZ2VyIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCB7IE5vU2Vzc2lvblByb3h5IH0gZnJvbSAnLi9uby1zZXNzaW9uLXByb3h5JztcbmltcG9ydCB7XG4gIGdldFdEQVVwZ3JhZGVUaW1lc3RhbXAsIHJlc2V0VGVzdFByb2Nlc3NlcywgZ2V0UElEc0xpc3RlbmluZ09uUG9ydCwgQk9PVFNUUkFQX1BBVEhcbn0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgWGNvZGVCdWlsZCBmcm9tICcuL3hjb2RlYnVpbGQnO1xuaW1wb3J0IEFzeW5jTG9jayBmcm9tICdhc3luYy1sb2NrJztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHsgYnVuZGxlV0RBU2ltIH0gZnJvbSAnLi9jaGVjay1kZXBlbmRlbmNpZXMnO1xuaW1wb3J0IHtcbiAgV0RBX1JVTk5FUl9CVU5ETEVfSUQsIFdEQV9SVU5ORVJfQVBQLCBXREFfQkFTRV9VUkwsIFdEQV9VUEdSQURFX1RJTUVTVEFNUF9QQVRILFxufSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbmNvbnN0IFdEQV9MQVVOQ0hfVElNRU9VVCA9IDYwICogMTAwMDtcbmNvbnN0IFdEQV9BR0VOVF9QT1JUID0gODEwMDtcbmNvbnN0IFdEQV9DRl9CVU5ETEVfTkFNRSA9ICdXZWJEcml2ZXJBZ2VudFJ1bm5lci1SdW5uZXInO1xuY29uc3QgU0hBUkVEX1JFU09VUkNFU19HVUFSRCA9IG5ldyBBc3luY0xvY2soKTtcblxuY2xhc3MgV2ViRHJpdmVyQWdlbnQge1xuICBjb25zdHJ1Y3RvciAoeGNvZGVWZXJzaW9uLCBhcmdzID0ge30sIGxvZyA9IG51bGwpIHtcbiAgICB0aGlzLnhjb2RlVmVyc2lvbiA9IHhjb2RlVmVyc2lvbjtcblxuICAgIHRoaXMuYXJncyA9IF8uY2xvbmUoYXJncyk7XG4gICAgdGhpcy5sb2cgPSBsb2cgPz8gZGVmYXVsdExvZ2dlcjtcblxuICAgIHRoaXMuZGV2aWNlID0gYXJncy5kZXZpY2U7XG4gICAgdGhpcy5wbGF0Zm9ybVZlcnNpb24gPSBhcmdzLnBsYXRmb3JtVmVyc2lvbjtcbiAgICB0aGlzLnBsYXRmb3JtTmFtZSA9IGFyZ3MucGxhdGZvcm1OYW1lO1xuICAgIHRoaXMuaW9zU2RrVmVyc2lvbiA9IGFyZ3MuaW9zU2RrVmVyc2lvbjtcbiAgICB0aGlzLmhvc3QgPSBhcmdzLmhvc3Q7XG4gICAgdGhpcy5pc1JlYWxEZXZpY2UgPSAhIWFyZ3MucmVhbERldmljZTtcbiAgICB0aGlzLmlkYiA9IChhcmdzLmRldmljZSB8fCB7fSkuaWRiO1xuICAgIHRoaXMud2RhQnVuZGxlUGF0aCA9IGFyZ3Mud2RhQnVuZGxlUGF0aDtcblxuICAgIHRoaXMuc2V0V0RBUGF0aHMoYXJncy5ib290c3RyYXBQYXRoLCBhcmdzLmFnZW50UGF0aCk7XG5cbiAgICB0aGlzLndkYUxvY2FsUG9ydCA9IGFyZ3Mud2RhTG9jYWxQb3J0O1xuICAgIHRoaXMud2RhUmVtb3RlUG9ydCA9IGFyZ3Mud2RhTG9jYWxQb3J0IHx8IFdEQV9BR0VOVF9QT1JUO1xuICAgIHRoaXMud2RhQmFzZVVybCA9IGFyZ3Mud2RhQmFzZVVybCB8fCBXREFfQkFTRV9VUkw7XG5cbiAgICB0aGlzLnByZWJ1aWxkV0RBID0gYXJncy5wcmVidWlsZFdEQTtcblxuICAgIHRoaXMud2ViRHJpdmVyQWdlbnRVcmwgPSBhcmdzLndlYkRyaXZlckFnZW50VXJsO1xuXG4gICAgdGhpcy5zdGFydGVkID0gZmFsc2U7XG5cbiAgICB0aGlzLndkYUNvbm5lY3Rpb25UaW1lb3V0ID0gYXJncy53ZGFDb25uZWN0aW9uVGltZW91dDtcblxuICAgIHRoaXMudXNlWGN0ZXN0cnVuRmlsZSA9IGFyZ3MudXNlWGN0ZXN0cnVuRmlsZTtcbiAgICB0aGlzLnVzZVByZWJ1aWx0V0RBID0gYXJncy51c2VQcmVidWlsdFdEQTtcbiAgICB0aGlzLmRlcml2ZWREYXRhUGF0aCA9IGFyZ3MuZGVyaXZlZERhdGFQYXRoO1xuICAgIHRoaXMubWpwZWdTZXJ2ZXJQb3J0ID0gYXJncy5tanBlZ1NlcnZlclBvcnQ7XG5cbiAgICB0aGlzLnVwZGF0ZWRXREFCdW5kbGVJZCA9IGFyZ3MudXBkYXRlZFdEQUJ1bmRsZUlkO1xuXG4gICAgdGhpcy54Y29kZWJ1aWxkID0gbmV3IFhjb2RlQnVpbGQodGhpcy54Y29kZVZlcnNpb24sIHRoaXMuZGV2aWNlLCB7XG4gICAgICBwbGF0Zm9ybVZlcnNpb246IHRoaXMucGxhdGZvcm1WZXJzaW9uLFxuICAgICAgcGxhdGZvcm1OYW1lOiB0aGlzLnBsYXRmb3JtTmFtZSxcbiAgICAgIGlvc1Nka1ZlcnNpb246IHRoaXMuaW9zU2RrVmVyc2lvbixcbiAgICAgIGFnZW50UGF0aDogdGhpcy5hZ2VudFBhdGgsXG4gICAgICBib290c3RyYXBQYXRoOiB0aGlzLmJvb3RzdHJhcFBhdGgsXG4gICAgICByZWFsRGV2aWNlOiB0aGlzLmlzUmVhbERldmljZSxcbiAgICAgIHNob3dYY29kZUxvZzogYXJncy5zaG93WGNvZGVMb2csXG4gICAgICB4Y29kZUNvbmZpZ0ZpbGU6IGFyZ3MueGNvZGVDb25maWdGaWxlLFxuICAgICAgeGNvZGVPcmdJZDogYXJncy54Y29kZU9yZ0lkLFxuICAgICAgeGNvZGVTaWduaW5nSWQ6IGFyZ3MueGNvZGVTaWduaW5nSWQsXG4gICAgICBrZXljaGFpblBhdGg6IGFyZ3Mua2V5Y2hhaW5QYXRoLFxuICAgICAga2V5Y2hhaW5QYXNzd29yZDogYXJncy5rZXljaGFpblBhc3N3b3JkLFxuICAgICAgdXNlU2ltcGxlQnVpbGRUZXN0OiBhcmdzLnVzZVNpbXBsZUJ1aWxkVGVzdCxcbiAgICAgIHVzZVByZWJ1aWx0V0RBOiBhcmdzLnVzZVByZWJ1aWx0V0RBLFxuICAgICAgdXBkYXRlZFdEQUJ1bmRsZUlkOiB0aGlzLnVwZGF0ZWRXREFCdW5kbGVJZCxcbiAgICAgIGxhdW5jaFRpbWVvdXQ6IGFyZ3Mud2RhTGF1bmNoVGltZW91dCB8fCBXREFfTEFVTkNIX1RJTUVPVVQsXG4gICAgICB3ZGFSZW1vdGVQb3J0OiB0aGlzLndkYVJlbW90ZVBvcnQsXG4gICAgICB1c2VYY3Rlc3RydW5GaWxlOiB0aGlzLnVzZVhjdGVzdHJ1bkZpbGUsXG4gICAgICBkZXJpdmVkRGF0YVBhdGg6IGFyZ3MuZGVyaXZlZERhdGFQYXRoLFxuICAgICAgbWpwZWdTZXJ2ZXJQb3J0OiB0aGlzLm1qcGVnU2VydmVyUG9ydCxcbiAgICAgIGFsbG93UHJvdmlzaW9uaW5nRGV2aWNlUmVnaXN0cmF0aW9uOiBhcmdzLmFsbG93UHJvdmlzaW9uaW5nRGV2aWNlUmVnaXN0cmF0aW9uLFxuICAgICAgcmVzdWx0QnVuZGxlUGF0aDogYXJncy5yZXN1bHRCdW5kbGVQYXRoLFxuICAgICAgcmVzdWx0QnVuZGxlVmVyc2lvbjogYXJncy5yZXN1bHRCdW5kbGVWZXJzaW9uLFxuICAgIH0sIHRoaXMubG9nKTtcbiAgfVxuXG4gIHNldFdEQVBhdGhzIChib290c3RyYXBQYXRoLCBhZ2VudFBhdGgpIHtcbiAgICAvLyBhbGxvdyB0aGUgdXNlciB0byBzcGVjaWZ5IGEgcGxhY2UgZm9yIFdEQS4gVGhpcyBpcyB1bmRvY3VtZW50ZWQgYW5kXG4gICAgLy8gb25seSBoZXJlIGZvciB0aGUgcHVycG9zZXMgb2YgdGVzdGluZyBkZXZlbG9wbWVudCBvZiBXREFcbiAgICB0aGlzLmJvb3RzdHJhcFBhdGggPSBib290c3RyYXBQYXRoIHx8IEJPT1RTVFJBUF9QQVRIO1xuICAgIHRoaXMubG9nLmluZm8oYFVzaW5nIFdEQSBwYXRoOiAnJHt0aGlzLmJvb3RzdHJhcFBhdGh9J2ApO1xuXG4gICAgLy8gZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2UgbmVlZCB0byBiZSBhYmxlIHRvIHNwZWNpZnkgYWdlbnRQYXRoIHRvb1xuICAgIHRoaXMuYWdlbnRQYXRoID0gYWdlbnRQYXRoIHx8IHBhdGgucmVzb2x2ZSh0aGlzLmJvb3RzdHJhcFBhdGgsICdXZWJEcml2ZXJBZ2VudC54Y29kZXByb2onKTtcbiAgICB0aGlzLmxvZy5pbmZvKGBVc2luZyBXREEgYWdlbnQ6ICcke3RoaXMuYWdlbnRQYXRofSdgKTtcbiAgfVxuXG4gIGFzeW5jIGNsZWFudXBPYnNvbGV0ZVByb2Nlc3NlcyAoKSB7XG4gICAgY29uc3Qgb2Jzb2xldGVQaWRzID0gYXdhaXQgZ2V0UElEc0xpc3RlbmluZ09uUG9ydCh0aGlzLnVybC5wb3J0LFxuICAgICAgKGNtZExpbmUpID0+IGNtZExpbmUuaW5jbHVkZXMoJy9XZWJEcml2ZXJBZ2VudFJ1bm5lcicpICYmXG4gICAgICAgICFjbWRMaW5lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy5kZXZpY2UudWRpZC50b0xvd2VyQ2FzZSgpKSk7XG5cbiAgICBpZiAoXy5pc0VtcHR5KG9ic29sZXRlUGlkcykpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBObyBvYnNvbGV0ZSBjYWNoZWQgcHJvY2Vzc2VzIGZyb20gcHJldmlvdXMgV0RBIHNlc3Npb25zIGAgK1xuICAgICAgICBgbGlzdGVuaW5nIG9uIHBvcnQgJHt0aGlzLnVybC5wb3J0fSBoYXZlIGJlZW4gZm91bmRgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmxvZy5pbmZvKGBEZXRlY3RlZCAke29ic29sZXRlUGlkcy5sZW5ndGh9IG9ic29sZXRlIGNhY2hlZCBwcm9jZXNzJHtvYnNvbGV0ZVBpZHMubGVuZ3RoID09PSAxID8gJycgOiAnZXMnfSBgICtcbiAgICAgIGBmcm9tIHByZXZpb3VzIFdEQSBzZXNzaW9ucy4gQ2xlYW5pbmcgdGhlbSB1cGApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBleGVjKCdraWxsJywgb2Jzb2xldGVQaWRzKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZy53YXJuKGBGYWlsZWQgdG8ga2lsbCBvYnNvbGV0ZSBjYWNoZWQgcHJvY2VzcyR7b2Jzb2xldGVQaWRzLmxlbmd0aCA9PT0gMSA/ICcnIDogJ2VzJ30gJyR7b2Jzb2xldGVQaWRzfScuIGAgK1xuICAgICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYm9vbGVhbiBpZiBXREEgaXMgcnVubmluZyBvciBub3RcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBXREEgaXMgcnVubmluZ1xuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGludmFsaWQgcmVzcG9uc2UgY29kZSBvciBib2R5XG4gICAqL1xuICBhc3luYyBpc1J1bm5pbmcgKCkge1xuICAgIHJldHVybiAhIShhd2FpdCB0aGlzLmdldFN0YXR1cygpKTtcbiAgfVxuXG4gIGdldCBiYXNlUGF0aCAoKSB7XG4gICAgaWYgKHRoaXMudXJsLnBhdGggPT09ICcvJykge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy51cmwucGF0aCB8fCAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gY3VycmVudCBydW5uaW5nIFdEQSdzIHN0YXR1cyBsaWtlIGJlbG93XG4gICAqIHtcbiAgICogICBcInN0YXRlXCI6IFwic3VjY2Vzc1wiLFxuICAgKiAgIFwib3NcIjoge1xuICAgKiAgICAgXCJuYW1lXCI6IFwiaU9TXCIsXG4gICAqICAgICBcInZlcnNpb25cIjogXCIxMS40XCIsXG4gICAqICAgICBcInNka1ZlcnNpb25cIjogXCIxMS4zXCJcbiAgICogICB9LFxuICAgKiAgIFwiaW9zXCI6IHtcbiAgICogICAgIFwic2ltdWxhdG9yVmVyc2lvblwiOiBcIjExLjRcIixcbiAgICogICAgIFwiaXBcIjogXCIxNzIuMjU0Ljk5LjM0XCJcbiAgICogICB9LFxuICAgKiAgIFwiYnVpbGRcIjoge1xuICAgKiAgICAgXCJ0aW1lXCI6IFwiSnVuIDI0IDIwMTggMTc6MDg6MjFcIixcbiAgICogICAgIFwicHJvZHVjdEJ1bmRsZUlkZW50aWZpZXJcIjogXCJjb20uZmFjZWJvb2suV2ViRHJpdmVyQWdlbnRSdW5uZXJcIlxuICAgKiAgIH1cbiAgICogfVxuICAgKlxuICAgKiBAcmV0dXJuIHs/b2JqZWN0fSBTdGF0ZSBPYmplY3RcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBpbnZhbGlkIHJlc3BvbnNlIGNvZGUgb3IgYm9keVxuICAgKi9cbiAgYXN5bmMgZ2V0U3RhdHVzICgpIHtcbiAgICBjb25zdCBub1Nlc3Npb25Qcm94eSA9IG5ldyBOb1Nlc3Npb25Qcm94eSh7XG4gICAgICBzZXJ2ZXI6IHRoaXMudXJsLmhvc3RuYW1lLFxuICAgICAgcG9ydDogdGhpcy51cmwucG9ydCxcbiAgICAgIGJhc2U6IHRoaXMuYmFzZVBhdGgsXG4gICAgICB0aW1lb3V0OiAzMDAwLFxuICAgIH0pO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgbm9TZXNzaW9uUHJveHkuY29tbWFuZCgnL3N0YXR1cycsICdHRVQnKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBXREEgaXMgbm90IGxpc3RlbmluZyBhdCAnJHt0aGlzLnVybC5ocmVmfSdgKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbmluc3RhbGwgV0RBcyBmcm9tIHRoZSB0ZXN0IGRldmljZS5cbiAgICogT3ZlciBYY29kZSAxMSwgbXVsdGlwbGUgV0RBIGNhbiBiZSBpbiB0aGUgZGV2aWNlIHNpbmNlIFhjb2RlIDExIGdlbmVyYXRlcyBkaWZmZXJlbnQgV0RBLlxuICAgKiBBcHBpdW0gZG9lcyBub3QgZXhwZWN0IG11bHRpcGxlIFdEQXMgYXJlIHJ1bm5pbmcgb24gYSBkZXZpY2UuXG4gICAqL1xuICBhc3luYyB1bmluc3RhbGwgKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBidW5kbGVJZHMgPSBhd2FpdCB0aGlzLmRldmljZS5nZXRVc2VySW5zdGFsbGVkQnVuZGxlSWRzQnlCdW5kbGVOYW1lKFdEQV9DRl9CVU5ETEVfTkFNRSk7XG4gICAgICBpZiAoXy5pc0VtcHR5KGJ1bmRsZUlkcykpIHtcbiAgICAgICAgdGhpcy5sb2cuZGVidWcoJ05vIFdEQXMgb24gdGhlIGRldmljZS4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgVW5pbnN0YWxsaW5nIFdEQXM6ICcke2J1bmRsZUlkc30nYCk7XG4gICAgICBmb3IgKGNvbnN0IGJ1bmRsZUlkIG9mIGJ1bmRsZUlkcykge1xuICAgICAgICBhd2FpdCB0aGlzLmRldmljZS5yZW1vdmVBcHAoYnVuZGxlSWQpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGUpO1xuICAgICAgdGhpcy5sb2cud2FybihgV2ViRHJpdmVyQWdlbnQgdW5pbnN0YWxsIGZhaWxlZC4gUGVyaGFwcywgaXQgaXMgYWxyZWFkeSB1bmluc3RhbGxlZD8gYCArXG4gICAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgX2NsZWFudXBQcm9qZWN0SWZGcmVzaCAoKSB7XG4gICAgY29uc3QgaG9tZUZvbGRlciA9IHByb2Nlc3MuZW52LkhPTUU7XG4gICAgaWYgKCFob21lRm9sZGVyKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKCdUaGUgSE9NRSBmb2xkZXIgcGF0aCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRVcGdyYWRlVGltZXN0YW1wID0gYXdhaXQgZ2V0V0RBVXBncmFkZVRpbWVzdGFtcCgpO1xuICAgIGlmICghXy5pc0ludGVnZXIoY3VycmVudFVwZ3JhZGVUaW1lc3RhbXApKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKCdJdCBpcyBpbXBvc3NpYmxlIHRvIGRldGVybWluZSB0aGUgdGltZXN0YW1wIG9mIHRoZSBwYWNrYWdlJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdGltZXN0YW1wUGF0aCA9IHBhdGgucmVzb2x2ZShob21lRm9sZGVyLCBXREFfVVBHUkFERV9USU1FU1RBTVBfUEFUSCk7XG4gICAgY29uc3QgZGlkVGltZXN0YW1wRXhpc3QgPSBhd2FpdCBmcy5leGlzdHModGltZXN0YW1wUGF0aCk7XG4gICAgaWYgKGRpZFRpbWVzdGFtcEV4aXN0KSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmcy5hY2Nlc3ModGltZXN0YW1wUGF0aCwgZnMuV19PSyk7XG4gICAgICB9IGNhdGNoIChpZ24pIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgV2ViRHJpdmVyQWdlbnQgdXBncmFkZSB0aW1lc3RhbXAgYXQgJyR7dGltZXN0YW1wUGF0aH0nIGlzIG5vdCB3cml0ZWFibGUuIGAgK1xuICAgICAgICAgIGBTa2lwcGluZyBzb3VyY2VzIGNsZWFudXBgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVjZW50VXBncmFkZVRpbWVzdGFtcCA9IHBhcnNlSW50KGF3YWl0IGZzLnJlYWRGaWxlKHRpbWVzdGFtcFBhdGgsICd1dGY4JyksIDEwKTtcbiAgICAgIGlmIChfLmlzSW50ZWdlcihyZWNlbnRVcGdyYWRlVGltZXN0YW1wKSkge1xuICAgICAgICBpZiAocmVjZW50VXBncmFkZVRpbWVzdGFtcCA+PSBjdXJyZW50VXBncmFkZVRpbWVzdGFtcCkge1xuICAgICAgICAgIHRoaXMubG9nLmluZm8oYFdlYkRyaXZlckFnZW50IGRvZXMgbm90IG5lZWQgYSBjbGVhbnVwLiBUaGUgc291cmNlcyBhcmUgdXAgdG8gZGF0ZSBgICtcbiAgICAgICAgICAgIGAoJHtyZWNlbnRVcGdyYWRlVGltZXN0YW1wfSA+PSAke2N1cnJlbnRVcGdyYWRlVGltZXN0YW1wfSlgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgV2ViRHJpdmVyQWdlbnQgc291cmNlcyBoYXZlIGJlZW4gdXBncmFkZWQgYCArXG4gICAgICAgICAgYCgke3JlY2VudFVwZ3JhZGVUaW1lc3RhbXB9IDwgJHtjdXJyZW50VXBncmFkZVRpbWVzdGFtcH0pYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBUaGUgcmVjZW50IHVwZ3JhZGUgdGltZXN0YW1wIGF0ICcke3RpbWVzdGFtcFBhdGh9JyBpcyBjb3JydXB0ZWQuIFRyeWluZyB0byBmaXggaXRgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgbWtkaXJwKHBhdGguZGlybmFtZSh0aW1lc3RhbXBQYXRoKSk7XG4gICAgICBhd2FpdCBmcy53cml0ZUZpbGUodGltZXN0YW1wUGF0aCwgYCR7Y3VycmVudFVwZ3JhZGVUaW1lc3RhbXB9YCwgJ3V0ZjgnKTtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTdG9yZWQgdGhlIHJlY2VudCBXZWJEcml2ZXJBZ2VudCB1cGdyYWRlIHRpbWVzdGFtcCAke2N1cnJlbnRVcGdyYWRlVGltZXN0YW1wfSBgICtcbiAgICAgICAgYGF0ICcke3RpbWVzdGFtcFBhdGh9J2ApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oYFVuYWJsZSB0byBjcmVhdGUgdGhlIHJlY2VudCBXZWJEcml2ZXJBZ2VudCB1cGdyYWRlIHRpbWVzdGFtcCBhdCAnJHt0aW1lc3RhbXBQYXRofScuIGAgK1xuICAgICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghZGlkVGltZXN0YW1wRXhpc3QpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oJ1RoZXJlIGlzIG5vIG5lZWQgdG8gcGVyZm9ybSB0aGUgcHJvamVjdCBjbGVhbnVwLiBBIGZyZXNoIGluc3RhbGwgaGFzIGJlZW4gZGV0ZWN0ZWQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy54Y29kZWJ1aWxkLmNsZWFuUHJvamVjdCgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nLndhcm4oYENhbm5vdCBwZXJmb3JtIFdlYkRyaXZlckFnZW50IHByb2plY3QgY2xlYW51cC4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gY3VycmVudCBydW5uaW5nIFdEQSdzIHN0YXR1cyBsaWtlIGJlbG93IGFmdGVyIGxhdW5jaGluZyBXREFcbiAgICoge1xuICAgKiAgIFwic3RhdGVcIjogXCJzdWNjZXNzXCIsXG4gICAqICAgXCJvc1wiOiB7XG4gICAqICAgICBcIm5hbWVcIjogXCJpT1NcIixcbiAgICogICAgIFwidmVyc2lvblwiOiBcIjExLjRcIixcbiAgICogICAgIFwic2RrVmVyc2lvblwiOiBcIjExLjNcIlxuICAgKiAgIH0sXG4gICAqICAgXCJpb3NcIjoge1xuICAgKiAgICAgXCJzaW11bGF0b3JWZXJzaW9uXCI6IFwiMTEuNFwiLFxuICAgKiAgICAgXCJpcFwiOiBcIjE3Mi4yNTQuOTkuMzRcIlxuICAgKiAgIH0sXG4gICAqICAgXCJidWlsZFwiOiB7XG4gICAqICAgICBcInRpbWVcIjogXCJKdW4gMjQgMjAxOCAxNzowODoyMVwiLFxuICAgKiAgICAgXCJwcm9kdWN0QnVuZGxlSWRlbnRpZmllclwiOiBcImNvbS5mYWNlYm9vay5XZWJEcml2ZXJBZ2VudFJ1bm5lclwiXG4gICAqICAgfVxuICAgKiB9XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZXNzaW9uSWQgTGF1bmNoIFdEQSBhbmQgZXN0YWJsaXNoIHRoZSBzZXNzaW9uIHdpdGggdGhpcyBzZXNzaW9uSWRcbiAgICogQHJldHVybiB7P29iamVjdH0gU3RhdGUgT2JqZWN0XG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgaW52YWxpZCByZXNwb25zZSBjb2RlIG9yIGJvZHlcbiAgICovXG4gIGFzeW5jIGxhdW5jaCAoc2Vzc2lvbklkKSB7XG4gICAgaWYgKHRoaXMud2ViRHJpdmVyQWdlbnRVcmwpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oYFVzaW5nIHByb3ZpZGVkIFdlYmRyaXZlckFnZW50IGF0ICcke3RoaXMud2ViRHJpdmVyQWdlbnRVcmx9J2ApO1xuICAgICAgdGhpcy51cmwgPSB0aGlzLndlYkRyaXZlckFnZW50VXJsO1xuICAgICAgdGhpcy5zZXR1cFByb3hpZXMoc2Vzc2lvbklkKTtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdldFN0YXR1cygpO1xuICAgIH1cblxuICAgIHRoaXMubG9nLmluZm8oJ0xhdW5jaGluZyBXZWJEcml2ZXJBZ2VudCBvbiB0aGUgZGV2aWNlJyk7XG5cbiAgICB0aGlzLnNldHVwUHJveGllcyhzZXNzaW9uSWQpO1xuXG4gICAgaWYgKCF0aGlzLnVzZVhjdGVzdHJ1bkZpbGUgJiYgIWF3YWl0IGZzLmV4aXN0cyh0aGlzLmFnZW50UGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVHJ5aW5nIHRvIHVzZSBXZWJEcml2ZXJBZ2VudCBwcm9qZWN0IGF0ICcke3RoaXMuYWdlbnRQYXRofScgYnV0IHRoZSBgICtcbiAgICAgICAgICAgICAgICAgICAgICAnZmlsZSBkb2VzIG5vdCBleGlzdCcpO1xuICAgIH1cblxuICAgIC8vIHVzZVhjdGVzdHJ1bkZpbGUgYW5kIHVzZVByZWJ1aWx0V0RBIHVzZSBleGlzdGluZyBkZXBlbmRlbmNpZXNcbiAgICAvLyBJdCBkZXBlbmRzIG9uIHVzZXIgc2lkZVxuICAgIGlmICh0aGlzLmlkYiB8fCB0aGlzLnVzZVhjdGVzdHJ1bkZpbGUgfHwgKHRoaXMuZGVyaXZlZERhdGFQYXRoICYmIHRoaXMudXNlUHJlYnVpbHRXREEpKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKCdTa2lwcGVkIFdEQSBwcm9qZWN0IGNsZWFudXAgYWNjb3JkaW5nIHRvIHRoZSBwcm92aWRlZCBjYXBhYmlsaXRpZXMnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc3luY2hyb25pemF0aW9uS2V5ID0gcGF0aC5ub3JtYWxpemUodGhpcy5ib290c3RyYXBQYXRoKTtcbiAgICAgIGF3YWl0IFNIQVJFRF9SRVNPVVJDRVNfR1VBUkQuYWNxdWlyZShzeW5jaHJvbml6YXRpb25LZXksXG4gICAgICAgIGFzeW5jICgpID0+IGF3YWl0IHRoaXMuX2NsZWFudXBQcm9qZWN0SWZGcmVzaCgpKTtcbiAgICB9XG5cbiAgICAvLyBXZSBuZWVkIHRvIHByb3ZpZGUgV0RBIGxvY2FsIHBvcnQsIGJlY2F1c2UgaXQgbWlnaHQgYmUgb2NjdXBpZWRcbiAgICBhd2FpdCByZXNldFRlc3RQcm9jZXNzZXModGhpcy5kZXZpY2UudWRpZCwgIXRoaXMuaXNSZWFsRGV2aWNlKTtcblxuICAgIGlmICh0aGlzLmlkYikge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc3RhcnRXaXRoSURCKCk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy54Y29kZWJ1aWxkLmluaXQodGhpcy5ub1Nlc3Npb25Qcm94eSk7XG5cbiAgICAvLyBTdGFydCB0aGUgeGNvZGVidWlsZCBwcm9jZXNzXG4gICAgaWYgKHRoaXMucHJlYnVpbGRXREEpIHtcbiAgICAgIGF3YWl0IHRoaXMueGNvZGVidWlsZC5wcmVidWlsZCgpO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgdGhpcy54Y29kZWJ1aWxkLnN0YXJ0KCk7XG4gIH1cblxuICBhc3luYyBzdGFydFdpdGhJREIgKCkge1xuICAgIHRoaXMubG9nLmluZm8oJ1dpbGwgbGF1bmNoIFdEQSB3aXRoIGlkYiBpbnN0ZWFkIG9mIHhjb2RlYnVpbGQgc2luY2UgdGhlIGNvcnJlc3BvbmRpbmcgZmxhZyBpcyBlbmFibGVkJyk7XG4gICAgY29uc3Qge3dkYUJ1bmRsZUlkLCB0ZXN0QnVuZGxlSWR9ID0gYXdhaXQgdGhpcy5wcmVwYXJlV0RBKCk7XG4gICAgY29uc3QgZW52ID0ge1xuICAgICAgVVNFX1BPUlQ6IHRoaXMud2RhUmVtb3RlUG9ydCxcbiAgICAgIFdEQV9QUk9EVUNUX0JVTkRMRV9JREVOVElGSUVSOiB0aGlzLnVwZGF0ZWRXREFCdW5kbGVJZCxcbiAgICB9O1xuICAgIGlmICh0aGlzLm1qcGVnU2VydmVyUG9ydCkge1xuICAgICAgZW52Lk1KUEVHX1NFUlZFUl9QT1JUID0gdGhpcy5tanBlZ1NlcnZlclBvcnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuaWRiLnJ1blhDVUlUZXN0KHdkYUJ1bmRsZUlkLCB3ZGFCdW5kbGVJZCwgdGVzdEJ1bmRsZUlkLCB7ZW52fSk7XG4gIH1cblxuICBhc3luYyBwYXJzZUJ1bmRsZUlkICh3ZGFCdW5kbGVQYXRoKSB7XG4gICAgY29uc3QgaW5mb1BsaXN0UGF0aCA9IHBhdGguam9pbih3ZGFCdW5kbGVQYXRoLCAnSW5mby5wbGlzdCcpO1xuICAgIGNvbnN0IGluZm9QbGlzdCA9IGF3YWl0IHBsaXN0LnBhcnNlUGxpc3QoYXdhaXQgZnMucmVhZEZpbGUoaW5mb1BsaXN0UGF0aCkpO1xuICAgIGlmICghaW5mb1BsaXN0LkNGQnVuZGxlSWRlbnRpZmllcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBidW5kbGUgaWQgaW4gJyR7aW5mb1BsaXN0UGF0aH0nYCk7XG4gICAgfVxuICAgIHJldHVybiBpbmZvUGxpc3QuQ0ZCdW5kbGVJZGVudGlmaWVyO1xuICB9XG5cbiAgYXN5bmMgcHJlcGFyZVdEQSAoKSB7XG4gICAgY29uc3Qgd2RhQnVuZGxlUGF0aCA9IHRoaXMud2RhQnVuZGxlUGF0aCB8fCBhd2FpdCB0aGlzLmZldGNoV0RBQnVuZGxlKCk7XG4gICAgY29uc3Qgd2RhQnVuZGxlSWQgPSBhd2FpdCB0aGlzLnBhcnNlQnVuZGxlSWQod2RhQnVuZGxlUGF0aCk7XG4gICAgaWYgKCFhd2FpdCB0aGlzLmRldmljZS5pc0FwcEluc3RhbGxlZCh3ZGFCdW5kbGVJZCkpIHtcbiAgICAgIGF3YWl0IHRoaXMuZGV2aWNlLmluc3RhbGxBcHAod2RhQnVuZGxlUGF0aCk7XG4gICAgfVxuICAgIGNvbnN0IHRlc3RCdW5kbGVJZCA9IGF3YWl0IHRoaXMuaWRiLmluc3RhbGxYQ1Rlc3RCdW5kbGUocGF0aC5qb2luKHdkYUJ1bmRsZVBhdGgsICdQbHVnSW5zJywgJ1dlYkRyaXZlckFnZW50UnVubmVyLnhjdGVzdCcpKTtcbiAgICByZXR1cm4ge3dkYUJ1bmRsZUlkLCB0ZXN0QnVuZGxlSWQsIHdkYUJ1bmRsZVBhdGh9O1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hXREFCdW5kbGUgKCkge1xuICAgIGlmICghdGhpcy5kZXJpdmVkRGF0YVBhdGgpIHtcbiAgICAgIHJldHVybiBhd2FpdCBidW5kbGVXREFTaW0odGhpcy54Y29kZWJ1aWxkKTtcbiAgICB9XG4gICAgY29uc3Qgd2RhQnVuZGxlUGF0aHMgPSBhd2FpdCBmcy5nbG9iKGAke3RoaXMuZGVyaXZlZERhdGFQYXRofS8qKi8qJHtXREFfUlVOTkVSX0FQUH0vYCwge1xuICAgICAgYWJzb2x1dGU6IHRydWUsXG4gICAgfSk7XG4gICAgaWYgKF8uaXNFbXB0eSh3ZGFCdW5kbGVQYXRocykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgdGhlIFdEQSBidW5kbGUgaW4gJyR7dGhpcy5kZXJpdmVkRGF0YVBhdGh9J2ApO1xuICAgIH1cbiAgICByZXR1cm4gd2RhQnVuZGxlUGF0aHNbMF07XG4gIH1cblxuICBhc3luYyBpc1NvdXJjZUZyZXNoICgpIHtcbiAgICBjb25zdCBleGlzdHNQcm9taXNlcyA9IFtcbiAgICAgICdSZXNvdXJjZXMnLFxuICAgICAgYFJlc291cmNlcyR7cGF0aC5zZXB9V2ViRHJpdmVyQWdlbnQuYnVuZGxlYCxcbiAgICBdLm1hcCgoc3ViUGF0aCkgPT4gZnMuZXhpc3RzKHBhdGgucmVzb2x2ZSh0aGlzLmJvb3RzdHJhcFBhdGgsIHN1YlBhdGgpKSk7XG4gICAgcmV0dXJuIChhd2FpdCBCLmFsbChleGlzdHNQcm9taXNlcykpLnNvbWUoKHYpID0+IHYgPT09IGZhbHNlKTtcbiAgfVxuXG4gIHNldHVwUHJveGllcyAoc2Vzc2lvbklkKSB7XG4gICAgY29uc3QgcHJveHlPcHRzID0ge1xuICAgICAgbG9nOiB0aGlzLmxvZyxcbiAgICAgIHNlcnZlcjogdGhpcy51cmwuaG9zdG5hbWUsXG4gICAgICBwb3J0OiB0aGlzLnVybC5wb3J0LFxuICAgICAgYmFzZTogdGhpcy5iYXNlUGF0aCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMud2RhQ29ubmVjdGlvblRpbWVvdXQsXG4gICAgICBrZWVwQWxpdmU6IHRydWUsXG4gICAgfTtcblxuICAgIHRoaXMuandwcm94eSA9IG5ldyBKV1Byb3h5KHByb3h5T3B0cyk7XG4gICAgdGhpcy5qd3Byb3h5LnNlc3Npb25JZCA9IHNlc3Npb25JZDtcbiAgICB0aGlzLnByb3h5UmVxUmVzID0gdGhpcy5qd3Byb3h5LnByb3h5UmVxUmVzLmJpbmQodGhpcy5qd3Byb3h5KTtcblxuICAgIHRoaXMubm9TZXNzaW9uUHJveHkgPSBuZXcgTm9TZXNzaW9uUHJveHkocHJveHlPcHRzKTtcbiAgfVxuXG4gIGFzeW5jIHF1aXQgKCkge1xuICAgIHRoaXMubG9nLmluZm8oJ1NodXR0aW5nIGRvd24gc3ViLXByb2Nlc3NlcycpO1xuXG4gICAgYXdhaXQgdGhpcy54Y29kZWJ1aWxkLnF1aXQoKTtcbiAgICBhd2FpdCB0aGlzLnhjb2RlYnVpbGQucmVzZXQoKTtcblxuICAgIGlmICh0aGlzLmp3cHJveHkpIHtcbiAgICAgIHRoaXMuandwcm94eS5zZXNzaW9uSWQgPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMuc3RhcnRlZCA9IGZhbHNlO1xuXG4gICAgaWYgKCF0aGlzLmFyZ3Mud2ViRHJpdmVyQWdlbnRVcmwpIHtcbiAgICAgIC8vIGlmIHdlIHBvcHVsYXRlZCB0aGUgdXJsIG91cnNlbHZlcyAoZHVyaW5nIGBzZXR1cENhY2hpbmdgIGNhbGwsIGZvciBpbnN0YW5jZSlcbiAgICAgIC8vIHRoZW4gY2xlYW4gdGhhdCB1cC4gSWYgdGhlIHVybCB3YXMgc3VwcGxpZWQsIHdlIHdhbnQgdG8ga2VlcCBpdFxuICAgICAgdGhpcy53ZWJEcml2ZXJBZ2VudFVybCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHVybCAoKSB7XG4gICAgaWYgKCF0aGlzLl91cmwpIHtcbiAgICAgIGlmICh0aGlzLndlYkRyaXZlckFnZW50VXJsKSB7XG4gICAgICAgIHRoaXMuX3VybCA9IHVybC5wYXJzZSh0aGlzLndlYkRyaXZlckFnZW50VXJsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHBvcnQgPSB0aGlzLndkYUxvY2FsUG9ydCB8fCBXREFfQUdFTlRfUE9SVDtcbiAgICAgICAgY29uc3Qge3Byb3RvY29sLCBob3N0bmFtZX0gPSB1cmwucGFyc2UodGhpcy53ZGFCYXNlVXJsIHx8IFdEQV9CQVNFX1VSTCk7XG4gICAgICAgIHRoaXMuX3VybCA9IHVybC5wYXJzZShgJHtwcm90b2NvbH0vLyR7aG9zdG5hbWV9OiR7cG9ydH1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3VybDtcbiAgfVxuXG4gIHNldCB1cmwgKF91cmwpIHtcbiAgICB0aGlzLl91cmwgPSB1cmwucGFyc2UoX3VybCk7XG4gIH1cblxuICBnZXQgZnVsbHlTdGFydGVkICgpIHtcbiAgICByZXR1cm4gdGhpcy5zdGFydGVkO1xuICB9XG5cbiAgc2V0IGZ1bGx5U3RhcnRlZCAoc3RhcnRlZCA9IGZhbHNlKSB7XG4gICAgdGhpcy5zdGFydGVkID0gc3RhcnRlZDtcbiAgfVxuXG4gIGFzeW5jIHJldHJpZXZlRGVyaXZlZERhdGFQYXRoICgpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy54Y29kZWJ1aWxkLnJldHJpZXZlRGVyaXZlZERhdGFQYXRoKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV1c2UgcnVubmluZyBXREEgaWYgaXQgaGFzIHRoZSBzYW1lIGJ1bmRsZSBpZCB3aXRoIHVwZGF0ZWRXREFCdW5kbGVJZC5cbiAgICogT3IgcmV1c2UgaXQgaWYgaXQgaGFzIHRoZSBkZWZhdWx0IGlkIHdpdGhvdXQgdXBkYXRlZFdEQUJ1bmRsZUlkLlxuICAgKiBVbmluc3RhbGwgaXQgaWYgdGhlIG1ldGhvZCBmYWNlcyBhbiBleGNlcHRpb24gZm9yIHRoZSBhYm92ZSBzaXR1YXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cGRhdGVkV0RBQnVuZGxlSWQgQnVuZGxlSWQgeW91J2QgbGlrZSB0byB1c2VcbiAgICovXG4gIGFzeW5jIHNldHVwQ2FjaGluZyAoKSB7XG4gICAgY29uc3Qgc3RhdHVzID0gYXdhaXQgdGhpcy5nZXRTdGF0dXMoKTtcbiAgICBpZiAoIXN0YXR1cyB8fCAhc3RhdHVzLmJ1aWxkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZygnV0RBIGlzIGN1cnJlbnRseSBub3QgcnVubmluZy4gVGhlcmUgaXMgbm90aGluZyB0byBjYWNoZScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHtcbiAgICAgIHByb2R1Y3RCdW5kbGVJZGVudGlmaWVyLFxuICAgICAgdXBncmFkZWRBdCxcbiAgICB9ID0gc3RhdHVzLmJ1aWxkO1xuICAgIC8vIGZvciByZWFsIGRldmljZVxuICAgIGlmICh1dGlsLmhhc1ZhbHVlKHByb2R1Y3RCdW5kbGVJZGVudGlmaWVyKSAmJiB1dGlsLmhhc1ZhbHVlKHRoaXMudXBkYXRlZFdEQUJ1bmRsZUlkKSAmJiB0aGlzLnVwZGF0ZWRXREFCdW5kbGVJZCAhPT0gcHJvZHVjdEJ1bmRsZUlkZW50aWZpZXIpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oYFdpbGwgdW5pbnN0YWxsIHJ1bm5pbmcgV0RBIHNpbmNlIGl0IGhhcyBkaWZmZXJlbnQgYnVuZGxlIGlkLiBUaGUgYWN0dWFsIHZhbHVlIGlzICcke3Byb2R1Y3RCdW5kbGVJZGVudGlmaWVyfScuYCk7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy51bmluc3RhbGwoKTtcbiAgICB9XG4gICAgLy8gZm9yIHNpbXVsYXRvclxuICAgIGlmICh1dGlsLmhhc1ZhbHVlKHByb2R1Y3RCdW5kbGVJZGVudGlmaWVyKSAmJiAhdXRpbC5oYXNWYWx1ZSh0aGlzLnVwZGF0ZWRXREFCdW5kbGVJZCkgJiYgV0RBX1JVTk5FUl9CVU5ETEVfSUQgIT09IHByb2R1Y3RCdW5kbGVJZGVudGlmaWVyKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBXaWxsIHVuaW5zdGFsbCBydW5uaW5nIFdEQSBzaW5jZSBpdHMgYnVuZGxlIGlkIGlzIG5vdCBlcXVhbCB0byB0aGUgZGVmYXVsdCB2YWx1ZSAke1dEQV9SVU5ORVJfQlVORExFX0lEfWApO1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudW5pbnN0YWxsKCk7XG4gICAgfVxuXG4gICAgY29uc3QgYWN0dWFsVXBncmFkZVRpbWVzdGFtcCA9IGF3YWl0IGdldFdEQVVwZ3JhZGVUaW1lc3RhbXAoKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgVXBncmFkZSB0aW1lc3RhbXAgb2YgdGhlIGN1cnJlbnRseSBidW5kbGVkIFdEQTogJHthY3R1YWxVcGdyYWRlVGltZXN0YW1wfWApO1xuICAgIHRoaXMubG9nLmRlYnVnKGBVcGdyYWRlIHRpbWVzdGFtcCBvZiB0aGUgV0RBIG9uIHRoZSBkZXZpY2U6ICR7dXBncmFkZWRBdH1gKTtcbiAgICBpZiAoYWN0dWFsVXBncmFkZVRpbWVzdGFtcCAmJiB1cGdyYWRlZEF0ICYmIF8udG9Mb3dlcihgJHthY3R1YWxVcGdyYWRlVGltZXN0YW1wfWApICE9PSBfLnRvTG93ZXIoYCR7dXBncmFkZWRBdH1gKSkge1xuICAgICAgdGhpcy5sb2cuaW5mbygnV2lsbCB1bmluc3RhbGwgcnVubmluZyBXREEgc2luY2UgaXQgaGFzIGRpZmZlcmVudCB2ZXJzaW9uIGluIGNvbXBhcmlzb24gdG8gdGhlIG9uZSAnICtcbiAgICAgICAgYHdoaWNoIGlzIGJ1bmRsZWQgd2l0aCBhcHBpdW0teGN1aXRlc3QtZHJpdmVyIG1vZHVsZSAoJHthY3R1YWxVcGdyYWRlVGltZXN0YW1wfSAhPSAke3VwZ3JhZGVkQXR9KWApO1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudW5pbnN0YWxsKCk7XG4gICAgfVxuXG4gICAgY29uc3QgbWVzc2FnZSA9IHV0aWwuaGFzVmFsdWUocHJvZHVjdEJ1bmRsZUlkZW50aWZpZXIpXG4gICAgICA/IGBXaWxsIHJldXNlIHByZXZpb3VzbHkgY2FjaGVkIFdEQSBpbnN0YW5jZSBhdCAnJHt0aGlzLnVybC5ocmVmfScgd2l0aCAnJHtwcm9kdWN0QnVuZGxlSWRlbnRpZmllcn0nYFxuICAgICAgOiBgV2lsbCByZXVzZSBwcmV2aW91c2x5IGNhY2hlZCBXREEgaW5zdGFuY2UgYXQgJyR7dGhpcy51cmwuaHJlZn0nYDtcbiAgICB0aGlzLmxvZy5pbmZvKGAke21lc3NhZ2V9LiBTZXQgdGhlIHdkYUxvY2FsUG9ydCBjYXBhYmlsaXR5IHRvIGEgdmFsdWUgZGlmZmVyZW50IGZyb20gJHt0aGlzLnVybC5wb3J0fSBpZiB0aGlzIGlzIGFuIHVuZGVzaXJlZCBiZWhhdmlvci5gKTtcbiAgICB0aGlzLndlYkRyaXZlckFnZW50VXJsID0gdGhpcy51cmwuaHJlZjtcbiAgfVxuXG4gIC8qKlxuICAgKiBRdWl0IGFuZCB1bmluc3RhbGwgcnVubmluZyBXREEuXG4gICAqL1xuICBhc3luYyBxdWl0QW5kVW5pbnN0YWxsICgpIHtcbiAgICBhd2FpdCB0aGlzLnF1aXQoKTtcbiAgICBhd2FpdCB0aGlzLnVuaW5zdGFsbCgpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFdlYkRyaXZlckFnZW50O1xuZXhwb3J0IHsgV2ViRHJpdmVyQWdlbnQgfTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQSxJQUFBQSxPQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxLQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxLQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRyxTQUFBLEdBQUFKLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSSxXQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxRQUFBLEdBQUFMLE9BQUE7QUFDQSxJQUFBTSxPQUFBLEdBQUFQLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBTyxlQUFBLEdBQUFQLE9BQUE7QUFDQSxJQUFBUSxNQUFBLEdBQUFSLE9BQUE7QUFHQSxJQUFBUyxXQUFBLEdBQUFWLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBVSxVQUFBLEdBQUFYLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBVyxhQUFBLEdBQUFYLE9BQUE7QUFDQSxJQUFBWSxrQkFBQSxHQUFBWixPQUFBO0FBQ0EsSUFBQWEsVUFBQSxHQUFBYixPQUFBO0FBSUEsTUFBTWMsa0JBQWtCLEdBQUcsRUFBRSxHQUFHLElBQUk7QUFDcEMsTUFBTUMsY0FBYyxHQUFHLElBQUk7QUFDM0IsTUFBTUMsa0JBQWtCLEdBQUcsNkJBQTZCO0FBQ3hELE1BQU1DLHNCQUFzQixHQUFHLElBQUlDLGtCQUFTLEVBQUU7QUFFOUMsTUFBTUMsY0FBYyxDQUFDO0VBQ25CQyxXQUFXQSxDQUFFQyxZQUFZLEVBQUVDLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRUMsR0FBRyxHQUFHLElBQUksRUFBRTtJQUNoRCxJQUFJLENBQUNGLFlBQVksR0FBR0EsWUFBWTtJQUVoQyxJQUFJLENBQUNDLElBQUksR0FBR0UsZUFBQyxDQUFDQyxLQUFLLENBQUNILElBQUksQ0FBQztJQUN6QixJQUFJLENBQUNDLEdBQUcsR0FBR0EsR0FBRyxJQUFJRyxlQUFhO0lBRS9CLElBQUksQ0FBQ0MsTUFBTSxHQUFHTCxJQUFJLENBQUNLLE1BQU07SUFDekIsSUFBSSxDQUFDQyxlQUFlLEdBQUdOLElBQUksQ0FBQ00sZUFBZTtJQUMzQyxJQUFJLENBQUNDLFlBQVksR0FBR1AsSUFBSSxDQUFDTyxZQUFZO0lBQ3JDLElBQUksQ0FBQ0MsYUFBYSxHQUFHUixJQUFJLENBQUNRLGFBQWE7SUFDdkMsSUFBSSxDQUFDQyxJQUFJLEdBQUdULElBQUksQ0FBQ1MsSUFBSTtJQUNyQixJQUFJLENBQUNDLFlBQVksR0FBRyxDQUFDLENBQUNWLElBQUksQ0FBQ1csVUFBVTtJQUNyQyxJQUFJLENBQUNDLEdBQUcsR0FBRyxDQUFDWixJQUFJLENBQUNLLE1BQU0sSUFBSSxDQUFDLENBQUMsRUFBRU8sR0FBRztJQUNsQyxJQUFJLENBQUNDLGFBQWEsR0FBR2IsSUFBSSxDQUFDYSxhQUFhO0lBRXZDLElBQUksQ0FBQ0MsV0FBVyxDQUFDZCxJQUFJLENBQUNlLGFBQWEsRUFBRWYsSUFBSSxDQUFDZ0IsU0FBUyxDQUFDO0lBRXBELElBQUksQ0FBQ0MsWUFBWSxHQUFHakIsSUFBSSxDQUFDaUIsWUFBWTtJQUNyQyxJQUFJLENBQUNDLGFBQWEsR0FBR2xCLElBQUksQ0FBQ2lCLFlBQVksSUFBSXhCLGNBQWM7SUFDeEQsSUFBSSxDQUFDMEIsVUFBVSxHQUFHbkIsSUFBSSxDQUFDbUIsVUFBVSxJQUFJQyx1QkFBWTtJQUVqRCxJQUFJLENBQUNDLFdBQVcsR0FBR3JCLElBQUksQ0FBQ3FCLFdBQVc7SUFFbkMsSUFBSSxDQUFDQyxpQkFBaUIsR0FBR3RCLElBQUksQ0FBQ3NCLGlCQUFpQjtJQUUvQyxJQUFJLENBQUNDLE9BQU8sR0FBRyxLQUFLO0lBRXBCLElBQUksQ0FBQ0Msb0JBQW9CLEdBQUd4QixJQUFJLENBQUN3QixvQkFBb0I7SUFFckQsSUFBSSxDQUFDQyxnQkFBZ0IsR0FBR3pCLElBQUksQ0FBQ3lCLGdCQUFnQjtJQUM3QyxJQUFJLENBQUNDLGNBQWMsR0FBRzFCLElBQUksQ0FBQzBCLGNBQWM7SUFDekMsSUFBSSxDQUFDQyxlQUFlLEdBQUczQixJQUFJLENBQUMyQixlQUFlO0lBQzNDLElBQUksQ0FBQ0MsZUFBZSxHQUFHNUIsSUFBSSxDQUFDNEIsZUFBZTtJQUUzQyxJQUFJLENBQUNDLGtCQUFrQixHQUFHN0IsSUFBSSxDQUFDNkIsa0JBQWtCO0lBRWpELElBQUksQ0FBQ0MsVUFBVSxHQUFHLElBQUlDLG1CQUFVLENBQUMsSUFBSSxDQUFDaEMsWUFBWSxFQUFFLElBQUksQ0FBQ00sTUFBTSxFQUFFO01BQy9EQyxlQUFlLEVBQUUsSUFBSSxDQUFDQSxlQUFlO01BQ3JDQyxZQUFZLEVBQUUsSUFBSSxDQUFDQSxZQUFZO01BQy9CQyxhQUFhLEVBQUUsSUFBSSxDQUFDQSxhQUFhO01BQ2pDUSxTQUFTLEVBQUUsSUFBSSxDQUFDQSxTQUFTO01BQ3pCRCxhQUFhLEVBQUUsSUFBSSxDQUFDQSxhQUFhO01BQ2pDSixVQUFVLEVBQUUsSUFBSSxDQUFDRCxZQUFZO01BQzdCc0IsWUFBWSxFQUFFaEMsSUFBSSxDQUFDZ0MsWUFBWTtNQUMvQkMsZUFBZSxFQUFFakMsSUFBSSxDQUFDaUMsZUFBZTtNQUNyQ0MsVUFBVSxFQUFFbEMsSUFBSSxDQUFDa0MsVUFBVTtNQUMzQkMsY0FBYyxFQUFFbkMsSUFBSSxDQUFDbUMsY0FBYztNQUNuQ0MsWUFBWSxFQUFFcEMsSUFBSSxDQUFDb0MsWUFBWTtNQUMvQkMsZ0JBQWdCLEVBQUVyQyxJQUFJLENBQUNxQyxnQkFBZ0I7TUFDdkNDLGtCQUFrQixFQUFFdEMsSUFBSSxDQUFDc0Msa0JBQWtCO01BQzNDWixjQUFjLEVBQUUxQixJQUFJLENBQUMwQixjQUFjO01BQ25DRyxrQkFBa0IsRUFBRSxJQUFJLENBQUNBLGtCQUFrQjtNQUMzQ1UsYUFBYSxFQUFFdkMsSUFBSSxDQUFDd0MsZ0JBQWdCLElBQUloRCxrQkFBa0I7TUFDMUQwQixhQUFhLEVBQUUsSUFBSSxDQUFDQSxhQUFhO01BQ2pDTyxnQkFBZ0IsRUFBRSxJQUFJLENBQUNBLGdCQUFnQjtNQUN2Q0UsZUFBZSxFQUFFM0IsSUFBSSxDQUFDMkIsZUFBZTtNQUNyQ0MsZUFBZSxFQUFFLElBQUksQ0FBQ0EsZUFBZTtNQUNyQ2EsbUNBQW1DLEVBQUV6QyxJQUFJLENBQUN5QyxtQ0FBbUM7TUFDN0VDLGdCQUFnQixFQUFFMUMsSUFBSSxDQUFDMEMsZ0JBQWdCO01BQ3ZDQyxtQkFBbUIsRUFBRTNDLElBQUksQ0FBQzJDO0lBQzVCLENBQUMsRUFBRSxJQUFJLENBQUMxQyxHQUFHLENBQUM7RUFDZDtFQUVBYSxXQUFXQSxDQUFFQyxhQUFhLEVBQUVDLFNBQVMsRUFBRTtJQUdyQyxJQUFJLENBQUNELGFBQWEsR0FBR0EsYUFBYSxJQUFJNkIscUJBQWM7SUFDcEQsSUFBSSxDQUFDM0MsR0FBRyxDQUFDNEMsSUFBSSxDQUFFLG9CQUFtQixJQUFJLENBQUM5QixhQUFjLEdBQUUsQ0FBQztJQUd4RCxJQUFJLENBQUNDLFNBQVMsR0FBR0EsU0FBUyxJQUFJOEIsYUFBSSxDQUFDQyxPQUFPLENBQUMsSUFBSSxDQUFDaEMsYUFBYSxFQUFFLDBCQUEwQixDQUFDO0lBQzFGLElBQUksQ0FBQ2QsR0FBRyxDQUFDNEMsSUFBSSxDQUFFLHFCQUFvQixJQUFJLENBQUM3QixTQUFVLEdBQUUsQ0FBQztFQUN2RDtFQUVBLE1BQU1nQyx3QkFBd0JBLENBQUEsRUFBSTtJQUNoQyxNQUFNQyxZQUFZLEdBQUcsTUFBTSxJQUFBQyw2QkFBc0IsRUFBQyxJQUFJLENBQUNDLEdBQUcsQ0FBQ0MsSUFBSSxFQUM1REMsT0FBTyxJQUFLQSxPQUFPLENBQUNDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxJQUNwRCxDQUFDRCxPQUFPLENBQUNFLFdBQVcsRUFBRSxDQUFDRCxRQUFRLENBQUMsSUFBSSxDQUFDakQsTUFBTSxDQUFDbUQsSUFBSSxDQUFDRCxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBRXBFLElBQUlyRCxlQUFDLENBQUN1RCxPQUFPLENBQUNSLFlBQVksQ0FBQyxFQUFFO01BQzNCLElBQUksQ0FBQ2hELEdBQUcsQ0FBQ3lELEtBQUssQ0FBRSwwREFBeUQsR0FDdEUscUJBQW9CLElBQUksQ0FBQ1AsR0FBRyxDQUFDQyxJQUFLLGtCQUFpQixDQUFDO01BQ3ZEO0lBQ0Y7SUFFQSxJQUFJLENBQUNuRCxHQUFHLENBQUM0QyxJQUFJLENBQUUsWUFBV0ksWUFBWSxDQUFDVSxNQUFPLDJCQUEwQlYsWUFBWSxDQUFDVSxNQUFNLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFLLEdBQUUsR0FDN0csOENBQTZDLENBQUM7SUFDakQsSUFBSTtNQUNGLE1BQU0sSUFBQUMsa0JBQUksRUFBQyxNQUFNLEVBQUVYLFlBQVksQ0FBQztJQUNsQyxDQUFDLENBQUMsT0FBT1ksQ0FBQyxFQUFFO01BQ1YsSUFBSSxDQUFDNUQsR0FBRyxDQUFDNkQsSUFBSSxDQUFFLHlDQUF3Q2IsWUFBWSxDQUFDVSxNQUFNLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFLLEtBQUlWLFlBQWEsS0FBSSxHQUMvRyxtQkFBa0JZLENBQUMsQ0FBQ0UsT0FBUSxFQUFDLENBQUM7SUFDbkM7RUFDRjtFQU9BLE1BQU1DLFNBQVNBLENBQUEsRUFBSTtJQUNqQixPQUFPLENBQUMsRUFBRSxNQUFNLElBQUksQ0FBQ0MsU0FBUyxFQUFFLENBQUM7RUFDbkM7RUFFQSxJQUFJQyxRQUFRQSxDQUFBLEVBQUk7SUFDZCxJQUFJLElBQUksQ0FBQ2YsR0FBRyxDQUFDTCxJQUFJLEtBQUssR0FBRyxFQUFFO01BQ3pCLE9BQU8sRUFBRTtJQUNYO0lBQ0EsT0FBTyxJQUFJLENBQUNLLEdBQUcsQ0FBQ0wsSUFBSSxJQUFJLEVBQUU7RUFDNUI7RUF3QkEsTUFBTW1CLFNBQVNBLENBQUEsRUFBSTtJQUNqQixNQUFNRSxjQUFjLEdBQUcsSUFBSUMsOEJBQWMsQ0FBQztNQUN4Q0MsTUFBTSxFQUFFLElBQUksQ0FBQ2xCLEdBQUcsQ0FBQ21CLFFBQVE7TUFDekJsQixJQUFJLEVBQUUsSUFBSSxDQUFDRCxHQUFHLENBQUNDLElBQUk7TUFDbkJtQixJQUFJLEVBQUUsSUFBSSxDQUFDTCxRQUFRO01BQ25CTSxPQUFPLEVBQUU7SUFDWCxDQUFDLENBQUM7SUFDRixJQUFJO01BQ0YsT0FBTyxNQUFNTCxjQUFjLENBQUNNLE9BQU8sQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDO0lBQ3ZELENBQUMsQ0FBQyxPQUFPQyxHQUFHLEVBQUU7TUFDWixJQUFJLENBQUN6RSxHQUFHLENBQUN5RCxLQUFLLENBQUUsNEJBQTJCLElBQUksQ0FBQ1AsR0FBRyxDQUFDd0IsSUFBSyxHQUFFLENBQUM7TUFDNUQsT0FBTyxJQUFJO0lBQ2I7RUFDRjtFQU9BLE1BQU1DLFNBQVNBLENBQUEsRUFBSTtJQUNqQixJQUFJO01BQ0YsTUFBTUMsU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDeEUsTUFBTSxDQUFDeUUscUNBQXFDLENBQUNwRixrQkFBa0IsQ0FBQztNQUM3RixJQUFJUSxlQUFDLENBQUN1RCxPQUFPLENBQUNvQixTQUFTLENBQUMsRUFBRTtRQUN4QixJQUFJLENBQUM1RSxHQUFHLENBQUN5RCxLQUFLLENBQUMsd0JBQXdCLENBQUM7UUFDeEM7TUFDRjtNQUVBLElBQUksQ0FBQ3pELEdBQUcsQ0FBQ3lELEtBQUssQ0FBRSx1QkFBc0JtQixTQUFVLEdBQUUsQ0FBQztNQUNuRCxLQUFLLE1BQU1FLFFBQVEsSUFBSUYsU0FBUyxFQUFFO1FBQ2hDLE1BQU0sSUFBSSxDQUFDeEUsTUFBTSxDQUFDMkUsU0FBUyxDQUFDRCxRQUFRLENBQUM7TUFDdkM7SUFDRixDQUFDLENBQUMsT0FBT2xCLENBQUMsRUFBRTtNQUNWLElBQUksQ0FBQzVELEdBQUcsQ0FBQ3lELEtBQUssQ0FBQ0csQ0FBQyxDQUFDO01BQ2pCLElBQUksQ0FBQzVELEdBQUcsQ0FBQzZELElBQUksQ0FBRSx1RUFBc0UsR0FDbEYsbUJBQWtCRCxDQUFDLENBQUNFLE9BQVEsRUFBQyxDQUFDO0lBQ25DO0VBQ0Y7RUFFQSxNQUFNa0Isc0JBQXNCQSxDQUFBLEVBQUk7SUFDOUIsTUFBTUMsVUFBVSxHQUFHQyxPQUFPLENBQUNDLEdBQUcsQ0FBQ0MsSUFBSTtJQUNuQyxJQUFJLENBQUNILFVBQVUsRUFBRTtNQUNmLElBQUksQ0FBQ2pGLEdBQUcsQ0FBQzRDLElBQUksQ0FBQywyQ0FBMkMsQ0FBQztNQUMxRDtJQUNGO0lBRUEsTUFBTXlDLHVCQUF1QixHQUFHLE1BQU0sSUFBQUMsNkJBQXNCLEdBQUU7SUFDOUQsSUFBSSxDQUFDckYsZUFBQyxDQUFDc0YsU0FBUyxDQUFDRix1QkFBdUIsQ0FBQyxFQUFFO01BQ3pDLElBQUksQ0FBQ3JGLEdBQUcsQ0FBQzRDLElBQUksQ0FBQyw0REFBNEQsQ0FBQztNQUMzRTtJQUNGO0lBRUEsTUFBTTRDLGFBQWEsR0FBRzNDLGFBQUksQ0FBQ0MsT0FBTyxDQUFDbUMsVUFBVSxFQUFFUSxxQ0FBMEIsQ0FBQztJQUMxRSxNQUFNQyxpQkFBaUIsR0FBRyxNQUFNQyxXQUFFLENBQUNDLE1BQU0sQ0FBQ0osYUFBYSxDQUFDO0lBQ3hELElBQUlFLGlCQUFpQixFQUFFO01BQ3JCLElBQUk7UUFDRixNQUFNQyxXQUFFLENBQUNFLE1BQU0sQ0FBQ0wsYUFBYSxFQUFFRyxXQUFFLENBQUNHLElBQUksQ0FBQztNQUN6QyxDQUFDLENBQUMsT0FBT0MsR0FBRyxFQUFFO1FBQ1osSUFBSSxDQUFDL0YsR0FBRyxDQUFDNEMsSUFBSSxDQUFFLHdDQUF1QzRDLGFBQWMsc0JBQXFCLEdBQ3RGLDBCQUF5QixDQUFDO1FBQzdCO01BQ0Y7TUFDQSxNQUFNUSxzQkFBc0IsR0FBR0MsUUFBUSxDQUFDLE1BQU1OLFdBQUUsQ0FBQ08sUUFBUSxDQUFDVixhQUFhLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDO01BQ3JGLElBQUl2RixlQUFDLENBQUNzRixTQUFTLENBQUNTLHNCQUFzQixDQUFDLEVBQUU7UUFDdkMsSUFBSUEsc0JBQXNCLElBQUlYLHVCQUF1QixFQUFFO1VBQ3JELElBQUksQ0FBQ3JGLEdBQUcsQ0FBQzRDLElBQUksQ0FBRSxxRUFBb0UsR0FDaEYsSUFBR29ELHNCQUF1QixPQUFNWCx1QkFBd0IsR0FBRSxDQUFDO1VBQzlEO1FBQ0Y7UUFDQSxJQUFJLENBQUNyRixHQUFHLENBQUM0QyxJQUFJLENBQUUsNENBQTJDLEdBQ3ZELElBQUdvRCxzQkFBdUIsTUFBS1gsdUJBQXdCLEdBQUUsQ0FBQztNQUMvRCxDQUFDLE1BQU07UUFDTCxJQUFJLENBQUNyRixHQUFHLENBQUM2RCxJQUFJLENBQUUsb0NBQW1DMkIsYUFBYyxrQ0FBaUMsQ0FBQztNQUNwRztJQUNGO0lBRUEsSUFBSTtNQUNGLE1BQU0sSUFBQVcsZUFBTSxFQUFDdEQsYUFBSSxDQUFDdUQsT0FBTyxDQUFDWixhQUFhLENBQUMsQ0FBQztNQUN6QyxNQUFNRyxXQUFFLENBQUNVLFNBQVMsQ0FBQ2IsYUFBYSxFQUFHLEdBQUVILHVCQUF3QixFQUFDLEVBQUUsTUFBTSxDQUFDO01BQ3ZFLElBQUksQ0FBQ3JGLEdBQUcsQ0FBQ3lELEtBQUssQ0FBRSxzREFBcUQ0Qix1QkFBd0IsR0FBRSxHQUM1RixPQUFNRyxhQUFjLEdBQUUsQ0FBQztJQUM1QixDQUFDLENBQUMsT0FBTzVCLENBQUMsRUFBRTtNQUNWLElBQUksQ0FBQzVELEdBQUcsQ0FBQzRDLElBQUksQ0FBRSxvRUFBbUU0QyxhQUFjLEtBQUksR0FDakcsbUJBQWtCNUIsQ0FBQyxDQUFDRSxPQUFRLEVBQUMsQ0FBQztNQUNqQztJQUNGO0lBRUEsSUFBSSxDQUFDNEIsaUJBQWlCLEVBQUU7TUFDdEIsSUFBSSxDQUFDMUYsR0FBRyxDQUFDNEMsSUFBSSxDQUFDLG9GQUFvRixDQUFDO01BQ25HO0lBQ0Y7SUFFQSxJQUFJO01BQ0YsTUFBTSxJQUFJLENBQUNmLFVBQVUsQ0FBQ3lFLFlBQVksRUFBRTtJQUN0QyxDQUFDLENBQUMsT0FBTzFDLENBQUMsRUFBRTtNQUNWLElBQUksQ0FBQzVELEdBQUcsQ0FBQzZELElBQUksQ0FBRSxrRUFBaUVELENBQUMsQ0FBQ0UsT0FBUSxFQUFDLENBQUM7SUFDOUY7RUFDRjtFQXlCQSxNQUFNeUMsTUFBTUEsQ0FBRUMsU0FBUyxFQUFFO0lBQ3ZCLElBQUksSUFBSSxDQUFDbkYsaUJBQWlCLEVBQUU7TUFDMUIsSUFBSSxDQUFDckIsR0FBRyxDQUFDNEMsSUFBSSxDQUFFLHFDQUFvQyxJQUFJLENBQUN2QixpQkFBa0IsR0FBRSxDQUFDO01BQzdFLElBQUksQ0FBQzZCLEdBQUcsR0FBRyxJQUFJLENBQUM3QixpQkFBaUI7TUFDakMsSUFBSSxDQUFDb0YsWUFBWSxDQUFDRCxTQUFTLENBQUM7TUFDNUIsT0FBTyxNQUFNLElBQUksQ0FBQ3hDLFNBQVMsRUFBRTtJQUMvQjtJQUVBLElBQUksQ0FBQ2hFLEdBQUcsQ0FBQzRDLElBQUksQ0FBQyx3Q0FBd0MsQ0FBQztJQUV2RCxJQUFJLENBQUM2RCxZQUFZLENBQUNELFNBQVMsQ0FBQztJQUU1QixJQUFJLENBQUMsSUFBSSxDQUFDaEYsZ0JBQWdCLElBQUksRUFBQyxNQUFNbUUsV0FBRSxDQUFDQyxNQUFNLENBQUMsSUFBSSxDQUFDN0UsU0FBUyxDQUFDLEdBQUU7TUFDOUQsTUFBTSxJQUFJMkYsS0FBSyxDQUFFLDRDQUEyQyxJQUFJLENBQUMzRixTQUFVLFlBQVcsR0FDdEUscUJBQXFCLENBQUM7SUFDeEM7SUFJQSxJQUFJLElBQUksQ0FBQ0osR0FBRyxJQUFJLElBQUksQ0FBQ2EsZ0JBQWdCLElBQUssSUFBSSxDQUFDRSxlQUFlLElBQUksSUFBSSxDQUFDRCxjQUFlLEVBQUU7TUFDdEYsSUFBSSxDQUFDekIsR0FBRyxDQUFDNEMsSUFBSSxDQUFDLG9FQUFvRSxDQUFDO0lBQ3JGLENBQUMsTUFBTTtNQUNMLE1BQU0rRCxrQkFBa0IsR0FBRzlELGFBQUksQ0FBQytELFNBQVMsQ0FBQyxJQUFJLENBQUM5RixhQUFhLENBQUM7TUFDN0QsTUFBTXBCLHNCQUFzQixDQUFDbUgsT0FBTyxDQUFDRixrQkFBa0IsRUFDckQsWUFBWSxNQUFNLElBQUksQ0FBQzNCLHNCQUFzQixFQUFFLENBQUM7SUFDcEQ7SUFHQSxNQUFNLElBQUE4Qix5QkFBa0IsRUFBQyxJQUFJLENBQUMxRyxNQUFNLENBQUNtRCxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUM5QyxZQUFZLENBQUM7SUFFOUQsSUFBSSxJQUFJLENBQUNFLEdBQUcsRUFBRTtNQUNaLE9BQU8sTUFBTSxJQUFJLENBQUNvRyxZQUFZLEVBQUU7SUFDbEM7SUFFQSxNQUFNLElBQUksQ0FBQ2xGLFVBQVUsQ0FBQ21GLElBQUksQ0FBQyxJQUFJLENBQUM5QyxjQUFjLENBQUM7SUFHL0MsSUFBSSxJQUFJLENBQUM5QyxXQUFXLEVBQUU7TUFDcEIsTUFBTSxJQUFJLENBQUNTLFVBQVUsQ0FBQ29GLFFBQVEsRUFBRTtJQUNsQztJQUNBLE9BQU8sTUFBTSxJQUFJLENBQUNwRixVQUFVLENBQUNxRixLQUFLLEVBQUU7RUFDdEM7RUFFQSxNQUFNSCxZQUFZQSxDQUFBLEVBQUk7SUFDcEIsSUFBSSxDQUFDL0csR0FBRyxDQUFDNEMsSUFBSSxDQUFDLHdGQUF3RixDQUFDO0lBQ3ZHLE1BQU07TUFBQ3VFLFdBQVc7TUFBRUM7SUFBWSxDQUFDLEdBQUcsTUFBTSxJQUFJLENBQUNDLFVBQVUsRUFBRTtJQUMzRCxNQUFNbEMsR0FBRyxHQUFHO01BQ1ZtQyxRQUFRLEVBQUUsSUFBSSxDQUFDckcsYUFBYTtNQUM1QnNHLDZCQUE2QixFQUFFLElBQUksQ0FBQzNGO0lBQ3RDLENBQUM7SUFDRCxJQUFJLElBQUksQ0FBQ0QsZUFBZSxFQUFFO01BQ3hCd0QsR0FBRyxDQUFDcUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDN0YsZUFBZTtJQUM5QztJQUVBLE9BQU8sTUFBTSxJQUFJLENBQUNoQixHQUFHLENBQUM4RyxXQUFXLENBQUNOLFdBQVcsRUFBRUEsV0FBVyxFQUFFQyxZQUFZLEVBQUU7TUFBQ2pDO0lBQUcsQ0FBQyxDQUFDO0VBQ2xGO0VBRUEsTUFBTXVDLGFBQWFBLENBQUU5RyxhQUFhLEVBQUU7SUFDbEMsTUFBTStHLGFBQWEsR0FBRzlFLGFBQUksQ0FBQytFLElBQUksQ0FBQ2hILGFBQWEsRUFBRSxZQUFZLENBQUM7SUFDNUQsTUFBTWlILFNBQVMsR0FBRyxNQUFNQyxjQUFLLENBQUNDLFVBQVUsQ0FBQyxNQUFNcEMsV0FBRSxDQUFDTyxRQUFRLENBQUN5QixhQUFhLENBQUMsQ0FBQztJQUMxRSxJQUFJLENBQUNFLFNBQVMsQ0FBQ0csa0JBQWtCLEVBQUU7TUFDakMsTUFBTSxJQUFJdEIsS0FBSyxDQUFFLGdDQUErQmlCLGFBQWMsR0FBRSxDQUFDO0lBQ25FO0lBQ0EsT0FBT0UsU0FBUyxDQUFDRyxrQkFBa0I7RUFDckM7RUFFQSxNQUFNWCxVQUFVQSxDQUFBLEVBQUk7SUFDbEIsTUFBTXpHLGFBQWEsR0FBRyxJQUFJLENBQUNBLGFBQWEsS0FBSSxNQUFNLElBQUksQ0FBQ3FILGNBQWMsRUFBRTtJQUN2RSxNQUFNZCxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUNPLGFBQWEsQ0FBQzlHLGFBQWEsQ0FBQztJQUMzRCxJQUFJLEVBQUMsTUFBTSxJQUFJLENBQUNSLE1BQU0sQ0FBQzhILGNBQWMsQ0FBQ2YsV0FBVyxDQUFDLEdBQUU7TUFDbEQsTUFBTSxJQUFJLENBQUMvRyxNQUFNLENBQUMrSCxVQUFVLENBQUN2SCxhQUFhLENBQUM7SUFDN0M7SUFDQSxNQUFNd0csWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDekcsR0FBRyxDQUFDeUgsbUJBQW1CLENBQUN2RixhQUFJLENBQUMrRSxJQUFJLENBQUNoSCxhQUFhLEVBQUUsU0FBUyxFQUFFLDZCQUE2QixDQUFDLENBQUM7SUFDM0gsT0FBTztNQUFDdUcsV0FBVztNQUFFQyxZQUFZO01BQUV4RztJQUFhLENBQUM7RUFDbkQ7RUFFQSxNQUFNcUgsY0FBY0EsQ0FBQSxFQUFJO0lBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUN2RyxlQUFlLEVBQUU7TUFDekIsT0FBTyxNQUFNLElBQUEyRywrQkFBWSxFQUFDLElBQUksQ0FBQ3hHLFVBQVUsQ0FBQztJQUM1QztJQUNBLE1BQU15RyxjQUFjLEdBQUcsTUFBTTNDLFdBQUUsQ0FBQzRDLElBQUksQ0FBRSxHQUFFLElBQUksQ0FBQzdHLGVBQWdCLFFBQU84Ryx5QkFBZSxHQUFFLEVBQUU7TUFDckZDLFFBQVEsRUFBRTtJQUNaLENBQUMsQ0FBQztJQUNGLElBQUl4SSxlQUFDLENBQUN1RCxPQUFPLENBQUM4RSxjQUFjLENBQUMsRUFBRTtNQUM3QixNQUFNLElBQUk1QixLQUFLLENBQUUscUNBQW9DLElBQUksQ0FBQ2hGLGVBQWdCLEdBQUUsQ0FBQztJQUMvRTtJQUNBLE9BQU80RyxjQUFjLENBQUMsQ0FBQyxDQUFDO0VBQzFCO0VBRUEsTUFBTUksYUFBYUEsQ0FBQSxFQUFJO0lBQ3JCLE1BQU1DLGNBQWMsR0FBRyxDQUNyQixXQUFXLEVBQ1YsWUFBVzlGLGFBQUksQ0FBQytGLEdBQUksdUJBQXNCLENBQzVDLENBQUNDLEdBQUcsQ0FBRUMsT0FBTyxJQUFLbkQsV0FBRSxDQUFDQyxNQUFNLENBQUMvQyxhQUFJLENBQUNDLE9BQU8sQ0FBQyxJQUFJLENBQUNoQyxhQUFhLEVBQUVnSSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ3hFLE9BQU8sQ0FBQyxNQUFNQyxpQkFBQyxDQUFDQyxHQUFHLENBQUNMLGNBQWMsQ0FBQyxFQUFFTSxJQUFJLENBQUVDLENBQUMsSUFBS0EsQ0FBQyxLQUFLLEtBQUssQ0FBQztFQUMvRDtFQUVBekMsWUFBWUEsQ0FBRUQsU0FBUyxFQUFFO0lBQ3ZCLE1BQU0yQyxTQUFTLEdBQUc7TUFDaEJuSixHQUFHLEVBQUUsSUFBSSxDQUFDQSxHQUFHO01BQ2JvRSxNQUFNLEVBQUUsSUFBSSxDQUFDbEIsR0FBRyxDQUFDbUIsUUFBUTtNQUN6QmxCLElBQUksRUFBRSxJQUFJLENBQUNELEdBQUcsQ0FBQ0MsSUFBSTtNQUNuQm1CLElBQUksRUFBRSxJQUFJLENBQUNMLFFBQVE7TUFDbkJNLE9BQU8sRUFBRSxJQUFJLENBQUNoRCxvQkFBb0I7TUFDbEM2SCxTQUFTLEVBQUU7SUFDYixDQUFDO0lBRUQsSUFBSSxDQUFDQyxPQUFPLEdBQUcsSUFBSUMsbUJBQU8sQ0FBQ0gsU0FBUyxDQUFDO0lBQ3JDLElBQUksQ0FBQ0UsT0FBTyxDQUFDN0MsU0FBUyxHQUFHQSxTQUFTO0lBQ2xDLElBQUksQ0FBQytDLFdBQVcsR0FBRyxJQUFJLENBQUNGLE9BQU8sQ0FBQ0UsV0FBVyxDQUFDQyxJQUFJLENBQUMsSUFBSSxDQUFDSCxPQUFPLENBQUM7SUFFOUQsSUFBSSxDQUFDbkYsY0FBYyxHQUFHLElBQUlDLDhCQUFjLENBQUNnRixTQUFTLENBQUM7RUFDckQ7RUFFQSxNQUFNTSxJQUFJQSxDQUFBLEVBQUk7SUFDWixJQUFJLENBQUN6SixHQUFHLENBQUM0QyxJQUFJLENBQUMsNkJBQTZCLENBQUM7SUFFNUMsTUFBTSxJQUFJLENBQUNmLFVBQVUsQ0FBQzRILElBQUksRUFBRTtJQUM1QixNQUFNLElBQUksQ0FBQzVILFVBQVUsQ0FBQzZILEtBQUssRUFBRTtJQUU3QixJQUFJLElBQUksQ0FBQ0wsT0FBTyxFQUFFO01BQ2hCLElBQUksQ0FBQ0EsT0FBTyxDQUFDN0MsU0FBUyxHQUFHLElBQUk7SUFDL0I7SUFFQSxJQUFJLENBQUNsRixPQUFPLEdBQUcsS0FBSztJQUVwQixJQUFJLENBQUMsSUFBSSxDQUFDdkIsSUFBSSxDQUFDc0IsaUJBQWlCLEVBQUU7TUFHaEMsSUFBSSxDQUFDQSxpQkFBaUIsR0FBRyxJQUFJO0lBQy9CO0VBQ0Y7RUFFQSxJQUFJNkIsR0FBR0EsQ0FBQSxFQUFJO0lBQ1QsSUFBSSxDQUFDLElBQUksQ0FBQ3lHLElBQUksRUFBRTtNQUNkLElBQUksSUFBSSxDQUFDdEksaUJBQWlCLEVBQUU7UUFDMUIsSUFBSSxDQUFDc0ksSUFBSSxHQUFHekcsYUFBRyxDQUFDMEcsS0FBSyxDQUFDLElBQUksQ0FBQ3ZJLGlCQUFpQixDQUFDO01BQy9DLENBQUMsTUFBTTtRQUNMLE1BQU04QixJQUFJLEdBQUcsSUFBSSxDQUFDbkMsWUFBWSxJQUFJeEIsY0FBYztRQUNoRCxNQUFNO1VBQUNxSyxRQUFRO1VBQUV4RjtRQUFRLENBQUMsR0FBR25CLGFBQUcsQ0FBQzBHLEtBQUssQ0FBQyxJQUFJLENBQUMxSSxVQUFVLElBQUlDLHVCQUFZLENBQUM7UUFDdkUsSUFBSSxDQUFDd0ksSUFBSSxHQUFHekcsYUFBRyxDQUFDMEcsS0FBSyxDQUFFLEdBQUVDLFFBQVMsS0FBSXhGLFFBQVMsSUFBR2xCLElBQUssRUFBQyxDQUFDO01BQzNEO0lBQ0Y7SUFDQSxPQUFPLElBQUksQ0FBQ3dHLElBQUk7RUFDbEI7RUFFQSxJQUFJekcsR0FBR0EsQ0FBRXlHLElBQUksRUFBRTtJQUNiLElBQUksQ0FBQ0EsSUFBSSxHQUFHekcsYUFBRyxDQUFDMEcsS0FBSyxDQUFDRCxJQUFJLENBQUM7RUFDN0I7RUFFQSxJQUFJRyxZQUFZQSxDQUFBLEVBQUk7SUFDbEIsT0FBTyxJQUFJLENBQUN4SSxPQUFPO0VBQ3JCO0VBRUEsSUFBSXdJLFlBQVlBLENBQUV4SSxPQUFPLEdBQUcsS0FBSyxFQUFFO0lBQ2pDLElBQUksQ0FBQ0EsT0FBTyxHQUFHQSxPQUFPO0VBQ3hCO0VBRUEsTUFBTXlJLHVCQUF1QkEsQ0FBQSxFQUFJO0lBQy9CLE9BQU8sTUFBTSxJQUFJLENBQUNsSSxVQUFVLENBQUNrSSx1QkFBdUIsRUFBRTtFQUN4RDtFQVNBLE1BQU1DLFlBQVlBLENBQUEsRUFBSTtJQUNwQixNQUFNQyxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUNqRyxTQUFTLEVBQUU7SUFDckMsSUFBSSxDQUFDaUcsTUFBTSxJQUFJLENBQUNBLE1BQU0sQ0FBQ0MsS0FBSyxFQUFFO01BQzVCLElBQUksQ0FBQ2xLLEdBQUcsQ0FBQ3lELEtBQUssQ0FBQyx5REFBeUQsQ0FBQztNQUN6RTtJQUNGO0lBRUEsTUFBTTtNQUNKMEcsdUJBQXVCO01BQ3ZCQztJQUNGLENBQUMsR0FBR0gsTUFBTSxDQUFDQyxLQUFLO0lBRWhCLElBQUlHLGFBQUksQ0FBQ0MsUUFBUSxDQUFDSCx1QkFBdUIsQ0FBQyxJQUFJRSxhQUFJLENBQUNDLFFBQVEsQ0FBQyxJQUFJLENBQUMxSSxrQkFBa0IsQ0FBQyxJQUFJLElBQUksQ0FBQ0Esa0JBQWtCLEtBQUt1SSx1QkFBdUIsRUFBRTtNQUMzSSxJQUFJLENBQUNuSyxHQUFHLENBQUM0QyxJQUFJLENBQUUscUZBQW9GdUgsdUJBQXdCLElBQUcsQ0FBQztNQUMvSCxPQUFPLE1BQU0sSUFBSSxDQUFDeEYsU0FBUyxFQUFFO0lBQy9CO0lBRUEsSUFBSTBGLGFBQUksQ0FBQ0MsUUFBUSxDQUFDSCx1QkFBdUIsQ0FBQyxJQUFJLENBQUNFLGFBQUksQ0FBQ0MsUUFBUSxDQUFDLElBQUksQ0FBQzFJLGtCQUFrQixDQUFDLElBQUkySSwrQkFBb0IsS0FBS0osdUJBQXVCLEVBQUU7TUFDekksSUFBSSxDQUFDbkssR0FBRyxDQUFDNEMsSUFBSSxDQUFFLG9GQUFtRjJILCtCQUFxQixFQUFDLENBQUM7TUFDekgsT0FBTyxNQUFNLElBQUksQ0FBQzVGLFNBQVMsRUFBRTtJQUMvQjtJQUVBLE1BQU02RixzQkFBc0IsR0FBRyxNQUFNLElBQUFsRiw2QkFBc0IsR0FBRTtJQUM3RCxJQUFJLENBQUN0RixHQUFHLENBQUN5RCxLQUFLLENBQUUsbURBQWtEK0csc0JBQXVCLEVBQUMsQ0FBQztJQUMzRixJQUFJLENBQUN4SyxHQUFHLENBQUN5RCxLQUFLLENBQUUsK0NBQThDMkcsVUFBVyxFQUFDLENBQUM7SUFDM0UsSUFBSUksc0JBQXNCLElBQUlKLFVBQVUsSUFBSW5LLGVBQUMsQ0FBQ3dLLE9BQU8sQ0FBRSxHQUFFRCxzQkFBdUIsRUFBQyxDQUFDLEtBQUt2SyxlQUFDLENBQUN3SyxPQUFPLENBQUUsR0FBRUwsVUFBVyxFQUFDLENBQUMsRUFBRTtNQUNqSCxJQUFJLENBQUNwSyxHQUFHLENBQUM0QyxJQUFJLENBQUMscUZBQXFGLEdBQ2hHLHdEQUF1RDRILHNCQUF1QixPQUFNSixVQUFXLEdBQUUsQ0FBQztNQUNyRyxPQUFPLE1BQU0sSUFBSSxDQUFDekYsU0FBUyxFQUFFO0lBQy9CO0lBRUEsTUFBTWIsT0FBTyxHQUFHdUcsYUFBSSxDQUFDQyxRQUFRLENBQUNILHVCQUF1QixDQUFDLEdBQ2pELGlEQUFnRCxJQUFJLENBQUNqSCxHQUFHLENBQUN3QixJQUFLLFdBQVV5Rix1QkFBd0IsR0FBRSxHQUNsRyxpREFBZ0QsSUFBSSxDQUFDakgsR0FBRyxDQUFDd0IsSUFBSyxHQUFFO0lBQ3JFLElBQUksQ0FBQzFFLEdBQUcsQ0FBQzRDLElBQUksQ0FBRSxHQUFFa0IsT0FBUSwrREFBOEQsSUFBSSxDQUFDWixHQUFHLENBQUNDLElBQUssb0NBQW1DLENBQUM7SUFDekksSUFBSSxDQUFDOUIsaUJBQWlCLEdBQUcsSUFBSSxDQUFDNkIsR0FBRyxDQUFDd0IsSUFBSTtFQUN4QztFQUtBLE1BQU1nRyxnQkFBZ0JBLENBQUEsRUFBSTtJQUN4QixNQUFNLElBQUksQ0FBQ2pCLElBQUksRUFBRTtJQUNqQixNQUFNLElBQUksQ0FBQzlFLFNBQVMsRUFBRTtFQUN4QjtBQUNGO0FBQUNnRyxPQUFBLENBQUEvSyxjQUFBLEdBQUFBLGNBQUE7QUFBQSxJQUFBZ0wsUUFBQSxHQUVjaEwsY0FBYztBQUFBK0ssT0FBQSxDQUFBRSxPQUFBLEdBQUFELFFBQUEifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"webdriveragent.js","names":["WDA_LAUNCH_TIMEOUT","WDA_AGENT_PORT","WDA_CF_BUNDLE_NAME","SHARED_RESOURCES_GUARD","AsyncLock","WebDriverAgent","constructor","xcodeVersion","args","log","_","clone","defaultLogger","device","platformVersion","platformName","iosSdkVersion","host","isRealDevice","realDevice","idb","wdaBundlePath","setWDAPaths","bootstrapPath","agentPath","wdaLocalPort","wdaRemotePort","wdaBaseUrl","WDA_BASE_URL","prebuildWDA","webDriverAgentUrl","started","wdaConnectionTimeout","useXctestrunFile","usePrebuiltWDA","derivedDataPath","mjpegServerPort","updatedWDABundleId","xcodebuild","XcodeBuild","showXcodeLog","xcodeConfigFile","xcodeOrgId","xcodeSigningId","keychainPath","keychainPassword","useSimpleBuildTest","launchTimeout","wdaLaunchTimeout","allowProvisioningDeviceRegistration","resultBundlePath","resultBundleVersion","BOOTSTRAP_PATH","info","path","resolve","cleanupObsoleteProcesses","obsoletePids","getPIDsListeningOnPort","url","port","cmdLine","includes","toLowerCase","udid","isEmpty","debug","length","exec","e","warn","message","isRunning","getStatus","basePath","noSessionProxy","NoSessionProxy","server","hostname","base","timeout","command","err","href","uninstall","bundleIds","getUserInstalledBundleIdsByBundleName","bundleId","removeApp","_cleanupProjectIfFresh","homeFolder","process","env","HOME","currentUpgradeTimestamp","getWDAUpgradeTimestamp","isInteger","timestampPath","WDA_UPGRADE_TIMESTAMP_PATH","didTimestampExist","fs","exists","access","W_OK","ign","recentUpgradeTimestamp","parseInt","readFile","mkdirp","dirname","writeFile","cleanProject","launch","sessionId","setupProxies","Error","synchronizationKey","normalize","acquire","resetTestProcesses","startWithIDB","init","prebuild","start","wdaBundleId","testBundleId","prepareWDA","USE_PORT","WDA_PRODUCT_BUNDLE_IDENTIFIER","MJPEG_SERVER_PORT","runXCUITest","parseBundleId","infoPlistPath","join","infoPlist","plist","parsePlist","CFBundleIdentifier","fetchWDABundle","isAppInstalled","installApp","installXCTestBundle","bundleWDASim","wdaBundlePaths","glob","WDA_RUNNER_APP","absolute","isSourceFresh","existsPromises","sep","map","subPath","B","all","some","v","proxyOpts","keepAlive","jwproxy","JWProxy","proxyReqRes","bind","quit","reset","_url","parse","protocol","fullyStarted","retrieveDerivedDataPath","setupCaching","status","build","productBundleIdentifier","upgradedAt","util","hasValue","WDA_RUNNER_BUNDLE_ID","actualUpgradeTimestamp","toLower","quitAndUninstall"],"sources":["../../lib/webdriveragent.js"],"sourcesContent":["import _ from 'lodash';\nimport path from 'path';\nimport url from 'url';\nimport B from 'bluebird';\nimport { JWProxy } from '@appium/base-driver';\nimport { fs, util, plist, mkdirp } from '@appium/support';\nimport defaultLogger from './logger';\nimport { NoSessionProxy } from './no-session-proxy';\nimport {\n getWDAUpgradeTimestamp, resetTestProcesses, getPIDsListeningOnPort, BOOTSTRAP_PATH\n} from './utils';\nimport XcodeBuild from './xcodebuild';\nimport AsyncLock from 'async-lock';\nimport { exec } from 'teen_process';\nimport { bundleWDASim } from './check-dependencies';\nimport {\n WDA_RUNNER_BUNDLE_ID, WDA_RUNNER_APP, WDA_BASE_URL, WDA_UPGRADE_TIMESTAMP_PATH,\n} from './constants';\n\nconst WDA_LAUNCH_TIMEOUT = 60 * 1000;\nconst WDA_AGENT_PORT = 8100;\nconst WDA_CF_BUNDLE_NAME = 'WebDriverAgentRunner-Runner';\nconst SHARED_RESOURCES_GUARD = new AsyncLock();\n\nclass WebDriverAgent {\n constructor (xcodeVersion, args = {}, log = null) {\n this.xcodeVersion = xcodeVersion;\n\n this.args = _.clone(args);\n this.log = log ?? defaultLogger;\n\n this.device = args.device;\n this.platformVersion = args.platformVersion;\n this.platformName = args.platformName;\n this.iosSdkVersion = args.iosSdkVersion;\n this.host = args.host;\n this.isRealDevice = !!args.realDevice;\n this.idb = (args.device || {}).idb;\n this.wdaBundlePath = args.wdaBundlePath;\n\n this.setWDAPaths(args.bootstrapPath, args.agentPath);\n\n this.wdaLocalPort = args.wdaLocalPort;\n this.wdaRemotePort = args.wdaLocalPort || WDA_AGENT_PORT;\n this.wdaBaseUrl = args.wdaBaseUrl || WDA_BASE_URL;\n\n this.prebuildWDA = args.prebuildWDA;\n\n this.webDriverAgentUrl = args.webDriverAgentUrl;\n\n this.started = false;\n\n this.wdaConnectionTimeout = args.wdaConnectionTimeout;\n\n this.useXctestrunFile = args.useXctestrunFile;\n this.usePrebuiltWDA = args.usePrebuiltWDA;\n this.derivedDataPath = args.derivedDataPath;\n this.mjpegServerPort = args.mjpegServerPort;\n\n this.updatedWDABundleId = args.updatedWDABundleId;\n\n this.xcodebuild = new XcodeBuild(this.xcodeVersion, this.device, {\n platformVersion: this.platformVersion,\n platformName: this.platformName,\n iosSdkVersion: this.iosSdkVersion,\n agentPath: this.agentPath,\n bootstrapPath: this.bootstrapPath,\n realDevice: this.isRealDevice,\n showXcodeLog: args.showXcodeLog,\n xcodeConfigFile: args.xcodeConfigFile,\n xcodeOrgId: args.xcodeOrgId,\n xcodeSigningId: args.xcodeSigningId,\n keychainPath: args.keychainPath,\n keychainPassword: args.keychainPassword,\n useSimpleBuildTest: args.useSimpleBuildTest,\n usePrebuiltWDA: args.usePrebuiltWDA,\n updatedWDABundleId: this.updatedWDABundleId,\n launchTimeout: args.wdaLaunchTimeout || WDA_LAUNCH_TIMEOUT,\n wdaRemotePort: this.wdaRemotePort,\n useXctestrunFile: this.useXctestrunFile,\n derivedDataPath: args.derivedDataPath,\n mjpegServerPort: this.mjpegServerPort,\n allowProvisioningDeviceRegistration: args.allowProvisioningDeviceRegistration,\n resultBundlePath: args.resultBundlePath,\n resultBundleVersion: args.resultBundleVersion,\n }, this.log);\n }\n\n setWDAPaths (bootstrapPath, agentPath) {\n // allow the user to specify a place for WDA. This is undocumented and\n // only here for the purposes of testing development of WDA\n this.bootstrapPath = bootstrapPath || BOOTSTRAP_PATH;\n this.log.info(`Using WDA path: '${this.bootstrapPath}'`);\n\n // for backward compatibility we need to be able to specify agentPath too\n this.agentPath = agentPath || path.resolve(this.bootstrapPath, 'WebDriverAgent.xcodeproj');\n this.log.info(`Using WDA agent: '${this.agentPath}'`);\n }\n\n async cleanupObsoleteProcesses () {\n const obsoletePids = await getPIDsListeningOnPort(this.url.port,\n (cmdLine) => cmdLine.includes('/WebDriverAgentRunner') &&\n !cmdLine.toLowerCase().includes(this.device.udid.toLowerCase()));\n\n if (_.isEmpty(obsoletePids)) {\n this.log.debug(`No obsolete cached processes from previous WDA sessions ` +\n `listening on port ${this.url.port} have been found`);\n return;\n }\n\n this.log.info(`Detected ${obsoletePids.length} obsolete cached process${obsoletePids.length === 1 ? '' : 'es'} ` +\n `from previous WDA sessions. Cleaning them up`);\n try {\n await exec('kill', obsoletePids);\n } catch (e) {\n this.log.warn(`Failed to kill obsolete cached process${obsoletePids.length === 1 ? '' : 'es'} '${obsoletePids}'. ` +\n `Original error: ${e.message}`);\n }\n }\n\n /**\n * Return boolean if WDA is running or not\n * @return {boolean} True if WDA is running\n * @throws {Error} If there was invalid response code or body\n */\n async isRunning () {\n return !!(await this.getStatus());\n }\n\n get basePath () {\n if (this.url.path === '/') {\n return '';\n }\n return this.url.path || '';\n }\n\n /**\n * Return current running WDA's status like below\n * {\n * \"state\": \"success\",\n * \"os\": {\n * \"name\": \"iOS\",\n * \"version\": \"11.4\",\n * \"sdkVersion\": \"11.3\"\n * },\n * \"ios\": {\n * \"simulatorVersion\": \"11.4\",\n * \"ip\": \"172.254.99.34\"\n * },\n * \"build\": {\n * \"time\": \"Jun 24 2018 17:08:21\",\n * \"productBundleIdentifier\": \"com.facebook.WebDriverAgentRunner\"\n * }\n * }\n *\n * @return {?object} State Object\n * @throws {Error} If there was invalid response code or body\n */\n async getStatus () {\n const noSessionProxy = new NoSessionProxy({\n server: this.url.hostname,\n port: this.url.port,\n base: this.basePath,\n timeout: 3000,\n });\n try {\n return await noSessionProxy.command('/status', 'GET');\n } catch (err) {\n this.log.debug(`WDA is not listening at '${this.url.href}'`);\n return null;\n }\n }\n\n /**\n * Uninstall WDAs from the test device.\n * Over Xcode 11, multiple WDA can be in the device since Xcode 11 generates different WDA.\n * Appium does not expect multiple WDAs are running on a device.\n */\n async uninstall () {\n try {\n const bundleIds = await this.device.getUserInstalledBundleIdsByBundleName(WDA_CF_BUNDLE_NAME);\n if (_.isEmpty(bundleIds)) {\n this.log.debug('No WDAs on the device.');\n return;\n }\n\n this.log.debug(`Uninstalling WDAs: '${bundleIds}'`);\n for (const bundleId of bundleIds) {\n await this.device.removeApp(bundleId);\n }\n } catch (e) {\n this.log.debug(e);\n this.log.warn(`WebDriverAgent uninstall failed. Perhaps, it is already uninstalled? ` +\n `Original error: ${e.message}`);\n }\n }\n\n async _cleanupProjectIfFresh () {\n const homeFolder = process.env.HOME;\n if (!homeFolder) {\n this.log.info('The HOME folder path cannot be determined');\n return;\n }\n\n const currentUpgradeTimestamp = await getWDAUpgradeTimestamp();\n if (!_.isInteger(currentUpgradeTimestamp)) {\n this.log.info('It is impossible to determine the timestamp of the package');\n return;\n }\n\n const timestampPath = path.resolve(homeFolder, WDA_UPGRADE_TIMESTAMP_PATH);\n const didTimestampExist = await fs.exists(timestampPath);\n if (didTimestampExist) {\n try {\n await fs.access(timestampPath, fs.W_OK);\n } catch (ign) {\n this.log.info(`WebDriverAgent upgrade timestamp at '${timestampPath}' is not writeable. ` +\n `Skipping sources cleanup`);\n return;\n }\n const recentUpgradeTimestamp = parseInt(await fs.readFile(timestampPath, 'utf8'), 10);\n if (_.isInteger(recentUpgradeTimestamp)) {\n if (recentUpgradeTimestamp >= currentUpgradeTimestamp) {\n this.log.info(`WebDriverAgent does not need a cleanup. The sources are up to date ` +\n `(${recentUpgradeTimestamp} >= ${currentUpgradeTimestamp})`);\n return;\n }\n this.log.info(`WebDriverAgent sources have been upgraded ` +\n `(${recentUpgradeTimestamp} < ${currentUpgradeTimestamp})`);\n } else {\n this.log.warn(`The recent upgrade timestamp at '${timestampPath}' is corrupted. Trying to fix it`);\n }\n }\n\n try {\n await mkdirp(path.dirname(timestampPath));\n await fs.writeFile(timestampPath, `${currentUpgradeTimestamp}`, 'utf8');\n this.log.debug(`Stored the recent WebDriverAgent upgrade timestamp ${currentUpgradeTimestamp} ` +\n `at '${timestampPath}'`);\n } catch (e) {\n this.log.info(`Unable to create the recent WebDriverAgent upgrade timestamp at '${timestampPath}'. ` +\n `Original error: ${e.message}`);\n return;\n }\n\n if (!didTimestampExist) {\n this.log.info('There is no need to perform the project cleanup. A fresh install has been detected');\n return;\n }\n\n try {\n await this.xcodebuild.cleanProject();\n } catch (e) {\n this.log.warn(`Cannot perform WebDriverAgent project cleanup. Original error: ${e.message}`);\n }\n }\n\n /**\n * Return current running WDA's status like below after launching WDA\n * {\n * \"state\": \"success\",\n * \"os\": {\n * \"name\": \"iOS\",\n * \"version\": \"11.4\",\n * \"sdkVersion\": \"11.3\"\n * },\n * \"ios\": {\n * \"simulatorVersion\": \"11.4\",\n * \"ip\": \"172.254.99.34\"\n * },\n * \"build\": {\n * \"time\": \"Jun 24 2018 17:08:21\",\n * \"productBundleIdentifier\": \"com.facebook.WebDriverAgentRunner\"\n * }\n * }\n *\n * @param {string} sessionId Launch WDA and establish the session with this sessionId\n * @return {?object} State Object\n * @throws {Error} If there was invalid response code or body\n */\n async launch (sessionId) {\n if (this.webDriverAgentUrl) {\n this.log.info(`Using provided WebdriverAgent at '${this.webDriverAgentUrl}'`);\n this.url = this.webDriverAgentUrl;\n this.setupProxies(sessionId);\n return await this.getStatus();\n }\n\n this.log.info('Launching WebDriverAgent on the device');\n\n this.setupProxies(sessionId);\n\n if (!this.useXctestrunFile && !await fs.exists(this.agentPath)) {\n throw new Error(`Trying to use WebDriverAgent project at '${this.agentPath}' but the ` +\n 'file does not exist');\n }\n\n // useXctestrunFile and usePrebuiltWDA use existing dependencies\n // It depends on user side\n if (this.idb || this.useXctestrunFile || (this.derivedDataPath && this.usePrebuiltWDA)) {\n this.log.info('Skipped WDA project cleanup according to the provided capabilities');\n } else {\n const synchronizationKey = path.normalize(this.bootstrapPath);\n await SHARED_RESOURCES_GUARD.acquire(synchronizationKey,\n async () => await this._cleanupProjectIfFresh());\n }\n\n // We need to provide WDA local port, because it might be occupied\n await resetTestProcesses(this.device.udid, !this.isRealDevice);\n\n if (this.idb) {\n return await this.startWithIDB();\n }\n\n await this.xcodebuild.init(this.noSessionProxy);\n\n // Start the xcodebuild process\n if (this.prebuildWDA) {\n await this.xcodebuild.prebuild();\n }\n return await this.xcodebuild.start();\n }\n\n async startWithIDB () {\n this.log.info('Will launch WDA with idb instead of xcodebuild since the corresponding flag is enabled');\n const {wdaBundleId, testBundleId} = await this.prepareWDA();\n const env = {\n USE_PORT: this.wdaRemotePort,\n WDA_PRODUCT_BUNDLE_IDENTIFIER: this.updatedWDABundleId,\n };\n if (this.mjpegServerPort) {\n env.MJPEG_SERVER_PORT = this.mjpegServerPort;\n }\n\n return await this.idb.runXCUITest(wdaBundleId, wdaBundleId, testBundleId, {env});\n }\n\n async parseBundleId (wdaBundlePath) {\n const infoPlistPath = path.join(wdaBundlePath, 'Info.plist');\n const infoPlist = await plist.parsePlist(await fs.readFile(infoPlistPath));\n if (!infoPlist.CFBundleIdentifier) {\n throw new Error(`Could not find bundle id in '${infoPlistPath}'`);\n }\n return infoPlist.CFBundleIdentifier;\n }\n\n async prepareWDA () {\n const wdaBundlePath = this.wdaBundlePath || await this.fetchWDABundle();\n const wdaBundleId = await this.parseBundleId(wdaBundlePath);\n if (!await this.device.isAppInstalled(wdaBundleId)) {\n await this.device.installApp(wdaBundlePath);\n }\n const testBundleId = await this.idb.installXCTestBundle(path.join(wdaBundlePath, 'PlugIns', 'WebDriverAgentRunner.xctest'));\n return {wdaBundleId, testBundleId, wdaBundlePath};\n }\n\n async fetchWDABundle () {\n if (!this.derivedDataPath) {\n return await bundleWDASim(this.xcodebuild);\n }\n const wdaBundlePaths = await fs.glob(`${this.derivedDataPath}/**/*${WDA_RUNNER_APP}/`, {\n absolute: true,\n });\n if (_.isEmpty(wdaBundlePaths)) {\n throw new Error(`Could not find the WDA bundle in '${this.derivedDataPath}'`);\n }\n return wdaBundlePaths[0];\n }\n\n async isSourceFresh () {\n const existsPromises = [\n 'Resources',\n `Resources${path.sep}WebDriverAgent.bundle`,\n ].map((subPath) => fs.exists(path.resolve(this.bootstrapPath, subPath)));\n return (await B.all(existsPromises)).some((v) => v === false);\n }\n\n setupProxies (sessionId) {\n const proxyOpts = {\n log: this.log,\n server: this.url.hostname,\n port: this.url.port,\n base: this.basePath,\n timeout: this.wdaConnectionTimeout,\n keepAlive: true,\n };\n\n this.jwproxy = new JWProxy(proxyOpts);\n this.jwproxy.sessionId = sessionId;\n this.proxyReqRes = this.jwproxy.proxyReqRes.bind(this.jwproxy);\n\n this.noSessionProxy = new NoSessionProxy(proxyOpts);\n }\n\n async quit () {\n this.log.info('Shutting down sub-processes');\n\n await this.xcodebuild.quit();\n await this.xcodebuild.reset();\n\n if (this.jwproxy) {\n this.jwproxy.sessionId = null;\n }\n\n this.started = false;\n\n if (!this.args.webDriverAgentUrl) {\n // if we populated the url ourselves (during `setupCaching` call, for instance)\n // then clean that up. If the url was supplied, we want to keep it\n this.webDriverAgentUrl = null;\n }\n }\n\n get url () {\n if (!this._url) {\n if (this.webDriverAgentUrl) {\n this._url = url.parse(this.webDriverAgentUrl);\n } else {\n const port = this.wdaLocalPort || WDA_AGENT_PORT;\n const {protocol, hostname} = url.parse(this.wdaBaseUrl || WDA_BASE_URL);\n this._url = url.parse(`${protocol}//${hostname}:${port}`);\n }\n }\n return this._url;\n }\n\n set url (_url) {\n this._url = url.parse(_url);\n }\n\n get fullyStarted () {\n return this.started;\n }\n\n set fullyStarted (started = false) {\n this.started = started;\n }\n\n async retrieveDerivedDataPath () {\n return await this.xcodebuild.retrieveDerivedDataPath();\n }\n\n /**\n * Reuse running WDA if it has the same bundle id with updatedWDABundleId.\n * Or reuse it if it has the default id without updatedWDABundleId.\n * Uninstall it if the method faces an exception for the above situation.\n *\n * @param {string} updatedWDABundleId BundleId you'd like to use\n */\n async setupCaching () {\n const status = await this.getStatus();\n if (!status || !status.build) {\n this.log.debug('WDA is currently not running. There is nothing to cache');\n return;\n }\n\n const {\n productBundleIdentifier,\n upgradedAt,\n } = status.build;\n // for real device\n if (util.hasValue(productBundleIdentifier) && util.hasValue(this.updatedWDABundleId) && this.updatedWDABundleId !== productBundleIdentifier) {\n this.log.info(`Will uninstall running WDA since it has different bundle id. The actual value is '${productBundleIdentifier}'.`);\n return await this.uninstall();\n }\n // for simulator\n if (util.hasValue(productBundleIdentifier) && !util.hasValue(this.updatedWDABundleId) && WDA_RUNNER_BUNDLE_ID !== productBundleIdentifier) {\n this.log.info(`Will uninstall running WDA since its bundle id is not equal to the default value ${WDA_RUNNER_BUNDLE_ID}`);\n return await this.uninstall();\n }\n\n const actualUpgradeTimestamp = await getWDAUpgradeTimestamp();\n this.log.debug(`Upgrade timestamp of the currently bundled WDA: ${actualUpgradeTimestamp}`);\n this.log.debug(`Upgrade timestamp of the WDA on the device: ${upgradedAt}`);\n if (actualUpgradeTimestamp && upgradedAt && _.toLower(`${actualUpgradeTimestamp}`) !== _.toLower(`${upgradedAt}`)) {\n this.log.info('Will uninstall running WDA since it has different version in comparison to the one ' +\n `which is bundled with appium-xcuitest-driver module (${actualUpgradeTimestamp} != ${upgradedAt})`);\n return await this.uninstall();\n }\n\n const message = util.hasValue(productBundleIdentifier)\n ? `Will reuse previously cached WDA instance at '${this.url.href}' with '${productBundleIdentifier}'`\n : `Will reuse previously cached WDA instance at '${this.url.href}'`;\n this.log.info(`${message}. Set the wdaLocalPort capability to a value different from ${this.url.port} if this is an undesired behavior.`);\n this.webDriverAgentUrl = this.url.href;\n }\n\n /**\n * Quit and uninstall running WDA.\n */\n async quitAndUninstall () {\n await this.quit();\n await this.uninstall();\n }\n}\n\nexport default WebDriverAgent;\nexport { WebDriverAgent };\n"],"mappings":"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"}
1
+ {"version":3,"file":"webdriveragent.js","names":["_lodash","_interopRequireDefault","require","_path","_url2","_bluebird","_baseDriver","_support","_logger","_noSessionProxy","_utils","_xcodebuild","_asyncLock","_teen_process","_checkDependencies","_constants","WDA_LAUNCH_TIMEOUT","WDA_AGENT_PORT","WDA_CF_BUNDLE_NAME","SHARED_RESOURCES_GUARD","AsyncLock","WebDriverAgent","constructor","xcodeVersion","args","log","_","clone","defaultLogger","device","platformVersion","platformName","iosSdkVersion","host","isRealDevice","realDevice","idb","wdaBundlePath","setWDAPaths","bootstrapPath","agentPath","wdaLocalPort","wdaRemotePort","wdaBaseUrl","WDA_BASE_URL","prebuildWDA","webDriverAgentUrl","started","wdaConnectionTimeout","useXctestrunFile","usePrebuiltWDA","derivedDataPath","mjpegServerPort","updatedWDABundleId","xcodebuild","XcodeBuild","showXcodeLog","xcodeConfigFile","xcodeOrgId","xcodeSigningId","keychainPath","keychainPassword","useSimpleBuildTest","launchTimeout","wdaLaunchTimeout","allowProvisioningDeviceRegistration","resultBundlePath","resultBundleVersion","BOOTSTRAP_PATH","info","path","resolve","cleanupObsoleteProcesses","obsoletePids","getPIDsListeningOnPort","url","port","cmdLine","includes","toLowerCase","udid","isEmpty","debug","length","exec","e","warn","message","isRunning","getStatus","basePath","noSessionProxy","NoSessionProxy","server","hostname","base","timeout","command","err","href","uninstall","bundleIds","getUserInstalledBundleIdsByBundleName","bundleId","removeApp","_cleanupProjectIfFresh","homeFolder","process","env","HOME","currentUpgradeTimestamp","getWDAUpgradeTimestamp","isInteger","timestampPath","WDA_UPGRADE_TIMESTAMP_PATH","didTimestampExist","fs","exists","access","W_OK","ign","recentUpgradeTimestamp","parseInt","readFile","mkdirp","dirname","writeFile","cleanProject","launch","sessionId","setupProxies","Error","synchronizationKey","normalize","acquire","resetTestProcesses","startWithIDB","init","prebuild","start","wdaBundleId","testBundleId","prepareWDA","USE_PORT","WDA_PRODUCT_BUNDLE_IDENTIFIER","MJPEG_SERVER_PORT","runXCUITest","parseBundleId","infoPlistPath","join","infoPlist","plist","parsePlist","CFBundleIdentifier","fetchWDABundle","isAppInstalled","installApp","installXCTestBundle","bundleWDASim","wdaBundlePaths","glob","WDA_RUNNER_APP","absolute","isSourceFresh","existsPromises","sep","map","subPath","B","all","some","v","proxyOpts","keepAlive","jwproxy","JWProxy","proxyReqRes","bind","quit","reset","_url","parse","protocol","fullyStarted","retrieveDerivedDataPath","setupCaching","status","build","productBundleIdentifier","upgradedAt","util","hasValue","WDA_RUNNER_BUNDLE_ID","actualUpgradeTimestamp","toLower","quitAndUninstall","exports","_default","default"],"sources":["../../lib/webdriveragent.js"],"sourcesContent":["import _ from 'lodash';\nimport path from 'path';\nimport url from 'url';\nimport B from 'bluebird';\nimport { JWProxy } from '@appium/base-driver';\nimport { fs, util, plist, mkdirp } from '@appium/support';\nimport defaultLogger from './logger';\nimport { NoSessionProxy } from './no-session-proxy';\nimport {\n getWDAUpgradeTimestamp, resetTestProcesses, getPIDsListeningOnPort, BOOTSTRAP_PATH\n} from './utils';\nimport XcodeBuild from './xcodebuild';\nimport AsyncLock from 'async-lock';\nimport { exec } from 'teen_process';\nimport { bundleWDASim } from './check-dependencies';\nimport {\n WDA_RUNNER_BUNDLE_ID, WDA_RUNNER_APP, WDA_BASE_URL, WDA_UPGRADE_TIMESTAMP_PATH,\n} from './constants';\n\nconst WDA_LAUNCH_TIMEOUT = 60 * 1000;\nconst WDA_AGENT_PORT = 8100;\nconst WDA_CF_BUNDLE_NAME = 'WebDriverAgentRunner-Runner';\nconst SHARED_RESOURCES_GUARD = new AsyncLock();\n\nclass WebDriverAgent {\n constructor (xcodeVersion, args = {}, log = null) {\n this.xcodeVersion = xcodeVersion;\n\n this.args = _.clone(args);\n this.log = log ?? defaultLogger;\n\n this.device = args.device;\n this.platformVersion = args.platformVersion;\n this.platformName = args.platformName;\n this.iosSdkVersion = args.iosSdkVersion;\n this.host = args.host;\n this.isRealDevice = !!args.realDevice;\n this.idb = (args.device || {}).idb;\n this.wdaBundlePath = args.wdaBundlePath;\n\n this.setWDAPaths(args.bootstrapPath, args.agentPath);\n\n this.wdaLocalPort = args.wdaLocalPort;\n this.wdaRemotePort = args.wdaLocalPort || WDA_AGENT_PORT;\n this.wdaBaseUrl = args.wdaBaseUrl || WDA_BASE_URL;\n\n this.prebuildWDA = args.prebuildWDA;\n\n this.webDriverAgentUrl = args.webDriverAgentUrl;\n\n this.started = false;\n\n this.wdaConnectionTimeout = args.wdaConnectionTimeout;\n\n this.useXctestrunFile = args.useXctestrunFile;\n this.usePrebuiltWDA = args.usePrebuiltWDA;\n this.derivedDataPath = args.derivedDataPath;\n this.mjpegServerPort = args.mjpegServerPort;\n\n this.updatedWDABundleId = args.updatedWDABundleId;\n\n this.xcodebuild = new XcodeBuild(this.xcodeVersion, this.device, {\n platformVersion: this.platformVersion,\n platformName: this.platformName,\n iosSdkVersion: this.iosSdkVersion,\n agentPath: this.agentPath,\n bootstrapPath: this.bootstrapPath,\n realDevice: this.isRealDevice,\n showXcodeLog: args.showXcodeLog,\n xcodeConfigFile: args.xcodeConfigFile,\n xcodeOrgId: args.xcodeOrgId,\n xcodeSigningId: args.xcodeSigningId,\n keychainPath: args.keychainPath,\n keychainPassword: args.keychainPassword,\n useSimpleBuildTest: args.useSimpleBuildTest,\n usePrebuiltWDA: args.usePrebuiltWDA,\n updatedWDABundleId: this.updatedWDABundleId,\n launchTimeout: args.wdaLaunchTimeout || WDA_LAUNCH_TIMEOUT,\n wdaRemotePort: this.wdaRemotePort,\n useXctestrunFile: this.useXctestrunFile,\n derivedDataPath: args.derivedDataPath,\n mjpegServerPort: this.mjpegServerPort,\n allowProvisioningDeviceRegistration: args.allowProvisioningDeviceRegistration,\n resultBundlePath: args.resultBundlePath,\n resultBundleVersion: args.resultBundleVersion,\n }, this.log);\n }\n\n setWDAPaths (bootstrapPath, agentPath) {\n // allow the user to specify a place for WDA. This is undocumented and\n // only here for the purposes of testing development of WDA\n this.bootstrapPath = bootstrapPath || BOOTSTRAP_PATH;\n this.log.info(`Using WDA path: '${this.bootstrapPath}'`);\n\n // for backward compatibility we need to be able to specify agentPath too\n this.agentPath = agentPath || path.resolve(this.bootstrapPath, 'WebDriverAgent.xcodeproj');\n this.log.info(`Using WDA agent: '${this.agentPath}'`);\n }\n\n async cleanupObsoleteProcesses () {\n const obsoletePids = await getPIDsListeningOnPort(this.url.port,\n (cmdLine) => cmdLine.includes('/WebDriverAgentRunner') &&\n !cmdLine.toLowerCase().includes(this.device.udid.toLowerCase()));\n\n if (_.isEmpty(obsoletePids)) {\n this.log.debug(`No obsolete cached processes from previous WDA sessions ` +\n `listening on port ${this.url.port} have been found`);\n return;\n }\n\n this.log.info(`Detected ${obsoletePids.length} obsolete cached process${obsoletePids.length === 1 ? '' : 'es'} ` +\n `from previous WDA sessions. Cleaning them up`);\n try {\n await exec('kill', obsoletePids);\n } catch (e) {\n this.log.warn(`Failed to kill obsolete cached process${obsoletePids.length === 1 ? '' : 'es'} '${obsoletePids}'. ` +\n `Original error: ${e.message}`);\n }\n }\n\n /**\n * Return boolean if WDA is running or not\n * @return {boolean} True if WDA is running\n * @throws {Error} If there was invalid response code or body\n */\n async isRunning () {\n return !!(await this.getStatus());\n }\n\n get basePath () {\n if (this.url.path === '/') {\n return '';\n }\n return this.url.path || '';\n }\n\n /**\n * Return current running WDA's status like below\n * {\n * \"state\": \"success\",\n * \"os\": {\n * \"name\": \"iOS\",\n * \"version\": \"11.4\",\n * \"sdkVersion\": \"11.3\"\n * },\n * \"ios\": {\n * \"simulatorVersion\": \"11.4\",\n * \"ip\": \"172.254.99.34\"\n * },\n * \"build\": {\n * \"time\": \"Jun 24 2018 17:08:21\",\n * \"productBundleIdentifier\": \"com.facebook.WebDriverAgentRunner\"\n * }\n * }\n *\n * @return {?object} State Object\n * @throws {Error} If there was invalid response code or body\n */\n async getStatus () {\n const noSessionProxy = new NoSessionProxy({\n server: this.url.hostname,\n port: this.url.port,\n base: this.basePath,\n timeout: 3000,\n });\n try {\n return await noSessionProxy.command('/status', 'GET');\n } catch (err) {\n this.log.debug(`WDA is not listening at '${this.url.href}'`);\n return null;\n }\n }\n\n /**\n * Uninstall WDAs from the test device.\n * Over Xcode 11, multiple WDA can be in the device since Xcode 11 generates different WDA.\n * Appium does not expect multiple WDAs are running on a device.\n */\n async uninstall () {\n try {\n const bundleIds = await this.device.getUserInstalledBundleIdsByBundleName(WDA_CF_BUNDLE_NAME);\n if (_.isEmpty(bundleIds)) {\n this.log.debug('No WDAs on the device.');\n return;\n }\n\n this.log.debug(`Uninstalling WDAs: '${bundleIds}'`);\n for (const bundleId of bundleIds) {\n await this.device.removeApp(bundleId);\n }\n } catch (e) {\n this.log.debug(e);\n this.log.warn(`WebDriverAgent uninstall failed. Perhaps, it is already uninstalled? ` +\n `Original error: ${e.message}`);\n }\n }\n\n async _cleanupProjectIfFresh () {\n const homeFolder = process.env.HOME;\n if (!homeFolder) {\n this.log.info('The HOME folder path cannot be determined');\n return;\n }\n\n const currentUpgradeTimestamp = await getWDAUpgradeTimestamp();\n if (!_.isInteger(currentUpgradeTimestamp)) {\n this.log.info('It is impossible to determine the timestamp of the package');\n return;\n }\n\n const timestampPath = path.resolve(homeFolder, WDA_UPGRADE_TIMESTAMP_PATH);\n const didTimestampExist = await fs.exists(timestampPath);\n if (didTimestampExist) {\n try {\n await fs.access(timestampPath, fs.W_OK);\n } catch (ign) {\n this.log.info(`WebDriverAgent upgrade timestamp at '${timestampPath}' is not writeable. ` +\n `Skipping sources cleanup`);\n return;\n }\n const recentUpgradeTimestamp = parseInt(await fs.readFile(timestampPath, 'utf8'), 10);\n if (_.isInteger(recentUpgradeTimestamp)) {\n if (recentUpgradeTimestamp >= currentUpgradeTimestamp) {\n this.log.info(`WebDriverAgent does not need a cleanup. The sources are up to date ` +\n `(${recentUpgradeTimestamp} >= ${currentUpgradeTimestamp})`);\n return;\n }\n this.log.info(`WebDriverAgent sources have been upgraded ` +\n `(${recentUpgradeTimestamp} < ${currentUpgradeTimestamp})`);\n } else {\n this.log.warn(`The recent upgrade timestamp at '${timestampPath}' is corrupted. Trying to fix it`);\n }\n }\n\n try {\n await mkdirp(path.dirname(timestampPath));\n await fs.writeFile(timestampPath, `${currentUpgradeTimestamp}`, 'utf8');\n this.log.debug(`Stored the recent WebDriverAgent upgrade timestamp ${currentUpgradeTimestamp} ` +\n `at '${timestampPath}'`);\n } catch (e) {\n this.log.info(`Unable to create the recent WebDriverAgent upgrade timestamp at '${timestampPath}'. ` +\n `Original error: ${e.message}`);\n return;\n }\n\n if (!didTimestampExist) {\n this.log.info('There is no need to perform the project cleanup. A fresh install has been detected');\n return;\n }\n\n try {\n await this.xcodebuild.cleanProject();\n } catch (e) {\n this.log.warn(`Cannot perform WebDriverAgent project cleanup. Original error: ${e.message}`);\n }\n }\n\n /**\n * Return current running WDA's status like below after launching WDA\n * {\n * \"state\": \"success\",\n * \"os\": {\n * \"name\": \"iOS\",\n * \"version\": \"11.4\",\n * \"sdkVersion\": \"11.3\"\n * },\n * \"ios\": {\n * \"simulatorVersion\": \"11.4\",\n * \"ip\": \"172.254.99.34\"\n * },\n * \"build\": {\n * \"time\": \"Jun 24 2018 17:08:21\",\n * \"productBundleIdentifier\": \"com.facebook.WebDriverAgentRunner\"\n * }\n * }\n *\n * @param {string} sessionId Launch WDA and establish the session with this sessionId\n * @return {?object} State Object\n * @throws {Error} If there was invalid response code or body\n */\n async launch (sessionId) {\n if (this.webDriverAgentUrl) {\n this.log.info(`Using provided WebdriverAgent at '${this.webDriverAgentUrl}'`);\n this.url = this.webDriverAgentUrl;\n this.setupProxies(sessionId);\n return await this.getStatus();\n }\n\n this.log.info('Launching WebDriverAgent on the device');\n\n this.setupProxies(sessionId);\n\n if (!this.useXctestrunFile && !await fs.exists(this.agentPath)) {\n throw new Error(`Trying to use WebDriverAgent project at '${this.agentPath}' but the ` +\n 'file does not exist');\n }\n\n // useXctestrunFile and usePrebuiltWDA use existing dependencies\n // It depends on user side\n if (this.idb || this.useXctestrunFile || (this.derivedDataPath && this.usePrebuiltWDA)) {\n this.log.info('Skipped WDA project cleanup according to the provided capabilities');\n } else {\n const synchronizationKey = path.normalize(this.bootstrapPath);\n await SHARED_RESOURCES_GUARD.acquire(synchronizationKey,\n async () => await this._cleanupProjectIfFresh());\n }\n\n // We need to provide WDA local port, because it might be occupied\n await resetTestProcesses(this.device.udid, !this.isRealDevice);\n\n if (this.idb) {\n return await this.startWithIDB();\n }\n\n await this.xcodebuild.init(this.noSessionProxy);\n\n // Start the xcodebuild process\n if (this.prebuildWDA) {\n await this.xcodebuild.prebuild();\n }\n return await this.xcodebuild.start();\n }\n\n async startWithIDB () {\n this.log.info('Will launch WDA with idb instead of xcodebuild since the corresponding flag is enabled');\n const {wdaBundleId, testBundleId} = await this.prepareWDA();\n const env = {\n USE_PORT: this.wdaRemotePort,\n WDA_PRODUCT_BUNDLE_IDENTIFIER: this.updatedWDABundleId,\n };\n if (this.mjpegServerPort) {\n env.MJPEG_SERVER_PORT = this.mjpegServerPort;\n }\n\n return await this.idb.runXCUITest(wdaBundleId, wdaBundleId, testBundleId, {env});\n }\n\n async parseBundleId (wdaBundlePath) {\n const infoPlistPath = path.join(wdaBundlePath, 'Info.plist');\n const infoPlist = await plist.parsePlist(await fs.readFile(infoPlistPath));\n if (!infoPlist.CFBundleIdentifier) {\n throw new Error(`Could not find bundle id in '${infoPlistPath}'`);\n }\n return infoPlist.CFBundleIdentifier;\n }\n\n async prepareWDA () {\n const wdaBundlePath = this.wdaBundlePath || await this.fetchWDABundle();\n const wdaBundleId = await this.parseBundleId(wdaBundlePath);\n if (!await this.device.isAppInstalled(wdaBundleId)) {\n await this.device.installApp(wdaBundlePath);\n }\n const testBundleId = await this.idb.installXCTestBundle(path.join(wdaBundlePath, 'PlugIns', 'WebDriverAgentRunner.xctest'));\n return {wdaBundleId, testBundleId, wdaBundlePath};\n }\n\n async fetchWDABundle () {\n if (!this.derivedDataPath) {\n return await bundleWDASim(this.xcodebuild);\n }\n const wdaBundlePaths = await fs.glob(`${this.derivedDataPath}/**/*${WDA_RUNNER_APP}/`, {\n absolute: true,\n });\n if (_.isEmpty(wdaBundlePaths)) {\n throw new Error(`Could not find the WDA bundle in '${this.derivedDataPath}'`);\n }\n return wdaBundlePaths[0];\n }\n\n async isSourceFresh () {\n const existsPromises = [\n 'Resources',\n `Resources${path.sep}WebDriverAgent.bundle`,\n ].map((subPath) => fs.exists(path.resolve(this.bootstrapPath, subPath)));\n return (await B.all(existsPromises)).some((v) => v === false);\n }\n\n setupProxies (sessionId) {\n const proxyOpts = {\n log: this.log,\n server: this.url.hostname,\n port: this.url.port,\n base: this.basePath,\n timeout: this.wdaConnectionTimeout,\n keepAlive: true,\n };\n\n this.jwproxy = new JWProxy(proxyOpts);\n this.jwproxy.sessionId = sessionId;\n this.proxyReqRes = this.jwproxy.proxyReqRes.bind(this.jwproxy);\n\n this.noSessionProxy = new NoSessionProxy(proxyOpts);\n }\n\n async quit () {\n this.log.info('Shutting down sub-processes');\n\n await this.xcodebuild.quit();\n await this.xcodebuild.reset();\n\n if (this.jwproxy) {\n this.jwproxy.sessionId = null;\n }\n\n this.started = false;\n\n if (!this.args.webDriverAgentUrl) {\n // if we populated the url ourselves (during `setupCaching` call, for instance)\n // then clean that up. If the url was supplied, we want to keep it\n this.webDriverAgentUrl = null;\n }\n }\n\n get url () {\n if (!this._url) {\n if (this.webDriverAgentUrl) {\n this._url = url.parse(this.webDriverAgentUrl);\n } else {\n const port = this.wdaLocalPort || WDA_AGENT_PORT;\n const {protocol, hostname} = url.parse(this.wdaBaseUrl || WDA_BASE_URL);\n this._url = url.parse(`${protocol}//${hostname}:${port}`);\n }\n }\n return this._url;\n }\n\n set url (_url) {\n this._url = url.parse(_url);\n }\n\n get fullyStarted () {\n return this.started;\n }\n\n set fullyStarted (started = false) {\n this.started = started;\n }\n\n async retrieveDerivedDataPath () {\n return await this.xcodebuild.retrieveDerivedDataPath();\n }\n\n /**\n * Reuse running WDA if it has the same bundle id with updatedWDABundleId.\n * Or reuse it if it has the default id without updatedWDABundleId.\n * Uninstall it if the method faces an exception for the above situation.\n *\n * @param {string} updatedWDABundleId BundleId you'd like to use\n */\n async setupCaching () {\n const status = await this.getStatus();\n if (!status || !status.build) {\n this.log.debug('WDA is currently not running. There is nothing to cache');\n return;\n }\n\n const {\n productBundleIdentifier,\n upgradedAt,\n } = status.build;\n // for real device\n if (util.hasValue(productBundleIdentifier) && util.hasValue(this.updatedWDABundleId) && this.updatedWDABundleId !== productBundleIdentifier) {\n this.log.info(`Will uninstall running WDA since it has different bundle id. The actual value is '${productBundleIdentifier}'.`);\n return await this.uninstall();\n }\n // for simulator\n if (util.hasValue(productBundleIdentifier) && !util.hasValue(this.updatedWDABundleId) && WDA_RUNNER_BUNDLE_ID !== productBundleIdentifier) {\n this.log.info(`Will uninstall running WDA since its bundle id is not equal to the default value ${WDA_RUNNER_BUNDLE_ID}`);\n return await this.uninstall();\n }\n\n const actualUpgradeTimestamp = await getWDAUpgradeTimestamp();\n this.log.debug(`Upgrade timestamp of the currently bundled WDA: ${actualUpgradeTimestamp}`);\n this.log.debug(`Upgrade timestamp of the WDA on the device: ${upgradedAt}`);\n if (actualUpgradeTimestamp && upgradedAt && _.toLower(`${actualUpgradeTimestamp}`) !== _.toLower(`${upgradedAt}`)) {\n this.log.info('Will uninstall running WDA since it has different version in comparison to the one ' +\n `which is bundled with appium-xcuitest-driver module (${actualUpgradeTimestamp} != ${upgradedAt})`);\n return await this.uninstall();\n }\n\n const message = util.hasValue(productBundleIdentifier)\n ? `Will reuse previously cached WDA instance at '${this.url.href}' with '${productBundleIdentifier}'`\n : `Will reuse previously cached WDA instance at '${this.url.href}'`;\n this.log.info(`${message}. Set the wdaLocalPort capability to a value different from ${this.url.port} if this is an undesired behavior.`);\n this.webDriverAgentUrl = this.url.href;\n }\n\n /**\n * Quit and uninstall running WDA.\n */\n async quitAndUninstall () {\n await this.quit();\n await this.uninstall();\n }\n}\n\nexport default WebDriverAgent;\nexport { WebDriverAgent };\n"],"mappings":"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"}
@@ -315,4 +315,4 @@ class XcodeBuild {
315
315
  exports.XcodeBuild = XcodeBuild;
316
316
  var _default = XcodeBuild;
317
317
  exports.default = _default;
318
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJERUZBVUxUX1NJR05JTkdfSUQiLCJQUkVCVUlMRF9ERUxBWSIsIlJVTk5FUl9TQ0hFTUVfSU9TIiwiTElCX1NDSEVNRV9JT1MiLCJFUlJPUl9XUklUSU5HX0FUVEFDSE1FTlQiLCJFUlJPUl9DT1BZSU5HX0FUVEFDSE1FTlQiLCJJR05PUkVEX0VSUk9SUyIsIlJVTk5FUl9TQ0hFTUVfVFYiLCJMSUJfU0NIRU1FX1RWIiwieGNvZGVMb2ciLCJsb2dnZXIiLCJnZXRMb2dnZXIiLCJYY29kZUJ1aWxkIiwiY29uc3RydWN0b3IiLCJ4Y29kZVZlcnNpb24iLCJkZXZpY2UiLCJhcmdzIiwibG9nIiwiZGVmYXVsdExvZ2dlciIsInJlYWxEZXZpY2UiLCJhZ2VudFBhdGgiLCJib290c3RyYXBQYXRoIiwicGxhdGZvcm1WZXJzaW9uIiwicGxhdGZvcm1OYW1lIiwiaW9zU2RrVmVyc2lvbiIsInNob3dYY29kZUxvZyIsInhjb2RlQ29uZmlnRmlsZSIsInhjb2RlT3JnSWQiLCJ4Y29kZVNpZ25pbmdJZCIsImtleWNoYWluUGF0aCIsImtleWNoYWluUGFzc3dvcmQiLCJwcmVidWlsZFdEQSIsInVzZVByZWJ1aWx0V0RBIiwidXNlU2ltcGxlQnVpbGRUZXN0IiwidXNlWGN0ZXN0cnVuRmlsZSIsImxhdW5jaFRpbWVvdXQiLCJ3ZGFSZW1vdGVQb3J0IiwidXBkYXRlZFdEQUJ1bmRsZUlkIiwiZGVyaXZlZERhdGFQYXRoIiwibWpwZWdTZXJ2ZXJQb3J0IiwicHJlYnVpbGREZWxheSIsIl8iLCJpc051bWJlciIsImFsbG93UHJvdmlzaW9uaW5nRGV2aWNlUmVnaXN0cmF0aW9uIiwicmVzdWx0QnVuZGxlUGF0aCIsInJlc3VsdEJ1bmRsZVZlcnNpb24iLCJpbml0Iiwibm9TZXNzaW9uUHJveHkiLCJkZXZpdmVJbmZvIiwiaXNSZWFsRGV2aWNlIiwidWRpZCIsInhjdGVzdHJ1bkZpbGVQYXRoIiwic2V0WGN0ZXN0cnVuRmlsZSIsInJlc2V0UHJvamVjdEZpbGUiLCJ1cGRhdGVQcm9qZWN0RmlsZSIsInJldHJpZXZlRGVyaXZlZERhdGFQYXRoIiwiX2Rlcml2ZWREYXRhUGF0aFByb21pc2UiLCJzdGRvdXQiLCJleGVjIiwiZXJyIiwid2FybiIsIm1lc3NhZ2UiLCJwYXR0ZXJuIiwibWF0Y2giLCJ0cnVuY2F0ZSIsImxlbmd0aCIsImRlYnVnIiwicGF0aCIsImRpcm5hbWUiLCJub3JtYWxpemUiLCJyZXNldCIsInByZWJ1aWxkIiwic3RhcnQiLCJ4Y29kZWJ1aWxkIiwiQiIsImRlbGF5IiwiY2xlYW5Qcm9qZWN0IiwibGliU2NoZW1lIiwiaXNUdk9TIiwicnVubmVyU2NoZW1lIiwic2NoZW1lIiwiZ2V0Q29tbWFuZCIsImJ1aWxkT25seSIsImNtZCIsImJ1aWxkQ21kIiwidGVzdENtZCIsInB1c2giLCJ2ZXJzaW9uTWF0Y2giLCJSZWdFeHAiLCJwcm9jZXNzIiwiZW52IiwiQVBQSVVNX1hDVUlURVNUX1RSRUFUX1dBUk5JTkdTX0FTX0VSUk9SUyIsImNyZWF0ZVN1YlByb2Nlc3MiLCJzZXRSZWFsRGV2aWNlU2VjdXJpdHkiLCJnZW5lcmF0ZVhjb2RlQ29uZmlnRmlsZSIsImpvaW4iLCJPYmplY3QiLCJhc3NpZ24iLCJVU0VfUE9SVCIsIldEQV9QUk9EVUNUX0JVTkRMRV9JREVOVElGSUVSIiwiV0RBX1JVTk5FUl9CVU5ETEVfSUQiLCJNSlBFR19TRVJWRVJfUE9SVCIsInVwZ3JhZGVUaW1lc3RhbXAiLCJnZXRXREFVcGdyYWRlVGltZXN0YW1wIiwiVVBHUkFERV9USU1FU1RBTVAiLCJTdWJQcm9jZXNzIiwiY3dkIiwiZGV0YWNoZWQiLCJzdGRpbyIsImxvZ1hjb2RlT3V0cHV0IiwibG9nTXNnIiwiaXNCb29sZWFuIiwib24iLCJzdGRlcnIiLCJvdXQiLCJpbmNsdWRlcyIsImxvZ0xvY2F0aW9uIiwiZmlyc3QiLCJyZW1vdmUiLCJ0cmltIiwic3BsaXQiLCJ2Iiwic3RhcnRzV2l0aCIsInNlcCIsImlnbm9yZUVycm9yIiwic29tZSIsIngiLCJfd2RhX2Vycm9yX29jY3VycmVkIiwibGluZSIsIkVPTCIsImVycm9yIiwiX3dkYV9lcnJvcl9tZXNzYWdlIiwicmVzb2x2ZSIsInJlamVjdCIsImNvZGUiLCJzaWduYWwiLCJkYXRhIiwiZnMiLCJyZWFkRmlsZSIsInByb2Nlc3NFeGl0ZWQiLCJFcnJvciIsInRpbWVyIiwidGltaW5nIiwiVGltZXIiLCJzdGF0dXMiLCJ3YWl0Rm9yU3RhcnQiLCJtc2ciLCJjdXJyZW50U3RhdHVzIiwicmV0cmllcyIsInBhcnNlSW50IiwicmV0cnlJbnRlcnZhbCIsInByb3h5VGltZW91dCIsInRpbWVvdXQiLCJjb21tYW5kIiwiaW9zIiwiaXAiLCJhZ2VudFVybCIsIkpTT04iLCJzdHJpbmdpZnkiLCJnZXREdXJhdGlvbiIsImFzTWlsbGlTZWNvbmRzIiwidG9GaXhlZCIsInF1aXQiLCJraWxsUHJvY2VzcyJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi94Y29kZWJ1aWxkLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJldHJ5SW50ZXJ2YWwgfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgeyBTdWJQcm9jZXNzLCBleGVjIH0gZnJvbSAndGVlbl9wcm9jZXNzJztcbmltcG9ydCB7IGZzLCBsb2dnZXIsIHRpbWluZyB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgZGVmYXVsdExvZ2dlciBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQge1xuICBzZXRSZWFsRGV2aWNlU2VjdXJpdHksIGdlbmVyYXRlWGNvZGVDb25maWdGaWxlLCBzZXRYY3Rlc3RydW5GaWxlLFxuICB1cGRhdGVQcm9qZWN0RmlsZSwgcmVzZXRQcm9qZWN0RmlsZSwga2lsbFByb2Nlc3MsXG4gIGdldFdEQVVwZ3JhZGVUaW1lc3RhbXAsIGlzVHZPUyB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgRU9MIH0gZnJvbSAnb3MnO1xuaW1wb3J0IHsgV0RBX1JVTk5FUl9CVU5ETEVfSUQgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cblxuY29uc3QgREVGQVVMVF9TSUdOSU5HX0lEID0gJ2lQaG9uZSBEZXZlbG9wZXInO1xuY29uc3QgUFJFQlVJTERfREVMQVkgPSAwO1xuY29uc3QgUlVOTkVSX1NDSEVNRV9JT1MgPSAnV2ViRHJpdmVyQWdlbnRSdW5uZXInO1xuY29uc3QgTElCX1NDSEVNRV9JT1MgPSAnV2ViRHJpdmVyQWdlbnRMaWInO1xuXG5jb25zdCBFUlJPUl9XUklUSU5HX0FUVEFDSE1FTlQgPSAnRXJyb3Igd3JpdGluZyBhdHRhY2htZW50IGRhdGEgdG8gZmlsZSc7XG5jb25zdCBFUlJPUl9DT1BZSU5HX0FUVEFDSE1FTlQgPSAnRXJyb3IgY29weWluZyB0ZXN0aW5nIGF0dGFjaG1lbnQnO1xuY29uc3QgSUdOT1JFRF9FUlJPUlMgPSBbXG4gIEVSUk9SX1dSSVRJTkdfQVRUQUNITUVOVCxcbiAgRVJST1JfQ09QWUlOR19BVFRBQ0hNRU5ULFxuICAnRmFpbGVkIHRvIHJlbW92ZSBzY3JlZW5zaG90IGF0IHBhdGgnLFxuXTtcblxuY29uc3QgUlVOTkVSX1NDSEVNRV9UViA9ICdXZWJEcml2ZXJBZ2VudFJ1bm5lcl90dk9TJztcbmNvbnN0IExJQl9TQ0hFTUVfVFYgPSAnV2ViRHJpdmVyQWdlbnRMaWJfdHZPUyc7XG5cbmNvbnN0IHhjb2RlTG9nID0gbG9nZ2VyLmdldExvZ2dlcignWGNvZGUnKTtcblxuXG5jbGFzcyBYY29kZUJ1aWxkIHtcbiAgY29uc3RydWN0b3IgKHhjb2RlVmVyc2lvbiwgZGV2aWNlLCBhcmdzID0ge30sIGxvZyA9IG51bGwpIHtcbiAgICB0aGlzLnhjb2RlVmVyc2lvbiA9IHhjb2RlVmVyc2lvbjtcblxuICAgIHRoaXMuZGV2aWNlID0gZGV2aWNlO1xuICAgIHRoaXMubG9nID0gbG9nID8/IGRlZmF1bHRMb2dnZXI7XG5cbiAgICB0aGlzLnJlYWxEZXZpY2UgPSBhcmdzLnJlYWxEZXZpY2U7XG5cbiAgICB0aGlzLmFnZW50UGF0aCA9IGFyZ3MuYWdlbnRQYXRoO1xuICAgIHRoaXMuYm9vdHN0cmFwUGF0aCA9IGFyZ3MuYm9vdHN0cmFwUGF0aDtcblxuICAgIHRoaXMucGxhdGZvcm1WZXJzaW9uID0gYXJncy5wbGF0Zm9ybVZlcnNpb247XG4gICAgdGhpcy5wbGF0Zm9ybU5hbWUgPSBhcmdzLnBsYXRmb3JtTmFtZTtcbiAgICB0aGlzLmlvc1Nka1ZlcnNpb24gPSBhcmdzLmlvc1Nka1ZlcnNpb247XG5cbiAgICB0aGlzLnNob3dYY29kZUxvZyA9IGFyZ3Muc2hvd1hjb2RlTG9nO1xuXG4gICAgdGhpcy54Y29kZUNvbmZpZ0ZpbGUgPSBhcmdzLnhjb2RlQ29uZmlnRmlsZTtcbiAgICB0aGlzLnhjb2RlT3JnSWQgPSBhcmdzLnhjb2RlT3JnSWQ7XG4gICAgdGhpcy54Y29kZVNpZ25pbmdJZCA9IGFyZ3MueGNvZGVTaWduaW5nSWQgfHwgREVGQVVMVF9TSUdOSU5HX0lEO1xuICAgIHRoaXMua2V5Y2hhaW5QYXRoID0gYXJncy5rZXljaGFpblBhdGg7XG4gICAgdGhpcy5rZXljaGFpblBhc3N3b3JkID0gYXJncy5rZXljaGFpblBhc3N3b3JkO1xuXG4gICAgdGhpcy5wcmVidWlsZFdEQSA9IGFyZ3MucHJlYnVpbGRXREE7XG4gICAgdGhpcy51c2VQcmVidWlsdFdEQSA9IGFyZ3MudXNlUHJlYnVpbHRXREE7XG4gICAgdGhpcy51c2VTaW1wbGVCdWlsZFRlc3QgPSBhcmdzLnVzZVNpbXBsZUJ1aWxkVGVzdDtcblxuICAgIHRoaXMudXNlWGN0ZXN0cnVuRmlsZSA9IGFyZ3MudXNlWGN0ZXN0cnVuRmlsZTtcblxuICAgIHRoaXMubGF1bmNoVGltZW91dCA9IGFyZ3MubGF1bmNoVGltZW91dDtcblxuICAgIHRoaXMud2RhUmVtb3RlUG9ydCA9IGFyZ3Mud2RhUmVtb3RlUG9ydDtcblxuICAgIHRoaXMudXBkYXRlZFdEQUJ1bmRsZUlkID0gYXJncy51cGRhdGVkV0RBQnVuZGxlSWQ7XG4gICAgdGhpcy5kZXJpdmVkRGF0YVBhdGggPSBhcmdzLmRlcml2ZWREYXRhUGF0aDtcblxuICAgIHRoaXMubWpwZWdTZXJ2ZXJQb3J0ID0gYXJncy5tanBlZ1NlcnZlclBvcnQ7XG5cbiAgICB0aGlzLnByZWJ1aWxkRGVsYXkgPSBfLmlzTnVtYmVyKGFyZ3MucHJlYnVpbGREZWxheSkgPyBhcmdzLnByZWJ1aWxkRGVsYXkgOiBQUkVCVUlMRF9ERUxBWTtcblxuICAgIHRoaXMuYWxsb3dQcm92aXNpb25pbmdEZXZpY2VSZWdpc3RyYXRpb24gPSBhcmdzLmFsbG93UHJvdmlzaW9uaW5nRGV2aWNlUmVnaXN0cmF0aW9uO1xuXG4gICAgdGhpcy5yZXN1bHRCdW5kbGVQYXRoID0gYXJncy5yZXN1bHRCdW5kbGVQYXRoO1xuICAgIHRoaXMucmVzdWx0QnVuZGxlVmVyc2lvbiA9IGFyZ3MucmVzdWx0QnVuZGxlVmVyc2lvbjtcbiAgfVxuXG4gIGFzeW5jIGluaXQgKG5vU2Vzc2lvblByb3h5KSB7XG4gICAgdGhpcy5ub1Nlc3Npb25Qcm94eSA9IG5vU2Vzc2lvblByb3h5O1xuXG4gICAgaWYgKHRoaXMudXNlWGN0ZXN0cnVuRmlsZSkge1xuICAgICAgY29uc3QgZGV2aXZlSW5mbyA9IHtcbiAgICAgICAgaXNSZWFsRGV2aWNlOiB0aGlzLnJlYWxEZXZpY2UsXG4gICAgICAgIHVkaWQ6IHRoaXMuZGV2aWNlLnVkaWQsXG4gICAgICAgIHBsYXRmb3JtVmVyc2lvbjogdGhpcy5wbGF0Zm9ybVZlcnNpb24sXG4gICAgICAgIHBsYXRmb3JtTmFtZTogdGhpcy5wbGF0Zm9ybU5hbWVcbiAgICAgIH07XG4gICAgICB0aGlzLnhjdGVzdHJ1bkZpbGVQYXRoID0gYXdhaXQgc2V0WGN0ZXN0cnVuRmlsZShkZXZpdmVJbmZvLCB0aGlzLmlvc1Nka1ZlcnNpb24sIHRoaXMuYm9vdHN0cmFwUGF0aCwgdGhpcy53ZGFSZW1vdGVQb3J0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBpZiBuZWNlc3NhcnksIHVwZGF0ZSB0aGUgYnVuZGxlSWQgdG8gdXNlcidzIHNwZWNpZmljYXRpb25cbiAgICBpZiAodGhpcy5yZWFsRGV2aWNlKSB7XG4gICAgICAvLyBJbiBjYXNlIHRoZSBwcm9qZWN0IHN0aWxsIGhhcyB0aGUgdXNlciBzcGVjaWZpYyBidW5kbGUgSUQsIHJlc2V0IHRoZSBwcm9qZWN0IGZpbGUgZmlyc3QuXG4gICAgICAvLyAtIFdlIGRvIHRoaXMgcmVzZXQgZXZlbiBpZiB1cGRhdGVkV0RBQnVuZGxlSWQgaXMgbm90IHNwZWNpZmllZCxcbiAgICAgIC8vICAgc2luY2UgdGhlIHByZXZpb3VzIHVwZGF0ZWRXREFCdW5kbGVJZCB0ZXN0IGhhcyBnZW5lcmF0ZWQgdGhlIHVzZXIgc3BlY2lmaWMgYnVuZGxlIElEIHByb2plY3QgZmlsZS5cbiAgICAgIC8vIC0gV2UgZG9uJ3QgY2FsbCByZXNldFByb2plY3RGaWxlIGZvciBzaW11bGF0b3IsXG4gICAgICAvLyAgIHNpbmNlIHNpbXVsYXRvciB0ZXN0IHJ1biB3aWxsIHdvcmsgd2l0aCBhbnkgdXNlciBzcGVjaWZpYyBidW5kbGUgSUQuXG4gICAgICBhd2FpdCByZXNldFByb2plY3RGaWxlKHRoaXMuYWdlbnRQYXRoKTtcbiAgICAgIGlmICh0aGlzLnVwZGF0ZWRXREFCdW5kbGVJZCkge1xuICAgICAgICBhd2FpdCB1cGRhdGVQcm9qZWN0RmlsZSh0aGlzLmFnZW50UGF0aCwgdGhpcy51cGRhdGVkV0RBQnVuZGxlSWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHJldHJpZXZlRGVyaXZlZERhdGFQYXRoICgpIHtcbiAgICBpZiAodGhpcy5kZXJpdmVkRGF0YVBhdGgpIHtcbiAgICAgIHJldHVybiB0aGlzLmRlcml2ZWREYXRhUGF0aDtcbiAgICB9XG5cbiAgICAvLyBhdm9pZCByYWNlIGNvbmRpdGlvbnNcbiAgICBpZiAodGhpcy5fZGVyaXZlZERhdGFQYXRoUHJvbWlzZSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2Rlcml2ZWREYXRhUGF0aFByb21pc2U7XG4gICAgfVxuXG4gICAgdGhpcy5fZGVyaXZlZERhdGFQYXRoUHJvbWlzZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICBsZXQgc3Rkb3V0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgKHtzdGRvdXR9ID0gYXdhaXQgZXhlYygneGNvZGVidWlsZCcsIFsnLXByb2plY3QnLCB0aGlzLmFnZW50UGF0aCwgJy1zaG93QnVpbGRTZXR0aW5ncyddKSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhpcy5sb2cud2FybihgQ2Fubm90IHJldHJpZXZlIFdEQSBidWlsZCBzZXR0aW5ncy4gT3JpZ2luYWwgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGF0dGVybiA9IC9eXFxzKkJVSUxEX0RJUlxccys9XFxzKyhcXC8uKikvbTtcbiAgICAgIGNvbnN0IG1hdGNoID0gcGF0dGVybi5leGVjKHN0ZG91dCk7XG4gICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgIHRoaXMubG9nLndhcm4oYENhbm5vdCBwYXJzZSBXREEgYnVpbGQgZGlyIGZyb20gJHtfLnRydW5jYXRlKHN0ZG91dCwge2xlbmd0aDogMzAwfSl9YCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMubG9nLmRlYnVnKGBQYXJzZWQgQlVJTERfRElSIGNvbmZpZ3VyYXRpb24gdmFsdWU6ICcke21hdGNoWzFdfSdgKTtcbiAgICAgIC8vIERlcml2ZWQgZGF0YSByb290IGlzIHR3byBsZXZlbHMgaGlnaGVyIG92ZXIgdGhlIGJ1aWxkIGRpclxuICAgICAgdGhpcy5kZXJpdmVkRGF0YVBhdGggPSBwYXRoLmRpcm5hbWUocGF0aC5kaXJuYW1lKHBhdGgubm9ybWFsaXplKG1hdGNoWzFdKSkpO1xuICAgICAgdGhpcy5sb2cuZGVidWcoYEdvdCBkZXJpdmVkIGRhdGEgcm9vdDogJyR7dGhpcy5kZXJpdmVkRGF0YVBhdGh9J2ApO1xuICAgICAgcmV0dXJuIHRoaXMuZGVyaXZlZERhdGFQYXRoO1xuICAgIH0pKCk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX2Rlcml2ZWREYXRhUGF0aFByb21pc2U7XG4gIH1cblxuICBhc3luYyByZXNldCAoKSB7XG4gICAgLy8gaWYgbmVjZXNzYXJ5LCByZXNldCB0aGUgYnVuZGxlSWQgdG8gb3JpZ2luYWwgdmFsdWVcbiAgICBpZiAodGhpcy5yZWFsRGV2aWNlICYmIHRoaXMudXBkYXRlZFdEQUJ1bmRsZUlkKSB7XG4gICAgICBhd2FpdCByZXNldFByb2plY3RGaWxlKHRoaXMuYWdlbnRQYXRoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBwcmVidWlsZCAoKSB7XG4gICAgLy8gZmlyc3QgZG8gYSBidWlsZCBwaGFzZVxuICAgIHRoaXMubG9nLmRlYnVnKCdQcmUtYnVpbGRpbmcgV0RBIGJlZm9yZSBsYXVuY2hpbmcgdGVzdCcpO1xuICAgIHRoaXMudXNlUHJlYnVpbHRXREEgPSB0cnVlO1xuICAgIGF3YWl0IHRoaXMuc3RhcnQodHJ1ZSk7XG5cbiAgICB0aGlzLnhjb2RlYnVpbGQgPSBudWxsO1xuXG4gICAgLy8gcGF1c2UgYSBtb21lbnRcbiAgICBhd2FpdCBCLmRlbGF5KHRoaXMucHJlYnVpbGREZWxheSk7XG4gIH1cblxuICBhc3luYyBjbGVhblByb2plY3QgKCkge1xuICAgIGNvbnN0IGxpYlNjaGVtZSA9IGlzVHZPUyh0aGlzLnBsYXRmb3JtTmFtZSkgPyBMSUJfU0NIRU1FX1RWIDogTElCX1NDSEVNRV9JT1M7XG4gICAgY29uc3QgcnVubmVyU2NoZW1lID0gaXNUdk9TKHRoaXMucGxhdGZvcm1OYW1lKSA/IFJVTk5FUl9TQ0hFTUVfVFYgOiBSVU5ORVJfU0NIRU1FX0lPUztcblxuICAgIGZvciAoY29uc3Qgc2NoZW1lIG9mIFtsaWJTY2hlbWUsIHJ1bm5lclNjaGVtZV0pIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBDbGVhbmluZyB0aGUgcHJvamVjdCBzY2hlbWUgJyR7c2NoZW1lfScgdG8gbWFrZSBzdXJlIHRoZXJlIGFyZSBubyBsZWZ0b3ZlcnMgZnJvbSBwcmV2aW91cyBpbnN0YWxsc2ApO1xuICAgICAgYXdhaXQgZXhlYygneGNvZGVidWlsZCcsIFtcbiAgICAgICAgJ2NsZWFuJyxcbiAgICAgICAgJy1wcm9qZWN0JywgdGhpcy5hZ2VudFBhdGgsXG4gICAgICAgICctc2NoZW1lJywgc2NoZW1lLFxuICAgICAgXSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0Q29tbWFuZCAoYnVpbGRPbmx5ID0gZmFsc2UpIHtcbiAgICBsZXQgY21kID0gJ3hjb2RlYnVpbGQnO1xuICAgIGxldCBhcmdzO1xuXG4gICAgLy8gZmlndXJlIG91dCB0aGUgdGFyZ2V0cyBmb3IgeGNvZGVidWlsZFxuICAgIGNvbnN0IFtidWlsZENtZCwgdGVzdENtZF0gPSB0aGlzLnVzZVNpbXBsZUJ1aWxkVGVzdCA/IFsnYnVpbGQnLCAndGVzdCddIDogWydidWlsZC1mb3ItdGVzdGluZycsICd0ZXN0LXdpdGhvdXQtYnVpbGRpbmcnXTtcbiAgICBpZiAoYnVpbGRPbmx5KSB7XG4gICAgICBhcmdzID0gW2J1aWxkQ21kXTtcbiAgICB9IGVsc2UgaWYgKHRoaXMudXNlUHJlYnVpbHRXREEgfHwgdGhpcy51c2VYY3Rlc3RydW5GaWxlKSB7XG4gICAgICBhcmdzID0gW3Rlc3RDbWRdO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcmdzID0gW2J1aWxkQ21kLCB0ZXN0Q21kXTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5hbGxvd1Byb3Zpc2lvbmluZ0RldmljZVJlZ2lzdHJhdGlvbikge1xuICAgICAgLy8gVG8gLWFsbG93UHJvdmlzaW9uaW5nRGV2aWNlUmVnaXN0cmF0aW9uIGZsYWcgdGFrZXMgZWZmZWN0LCAtYWxsb3dQcm92aXNpb25pbmdVcGRhdGVzIG5lZWRzIHRvIGJlIHBhc3NlZCBhcyB3ZWxsLlxuICAgICAgYXJncy5wdXNoKCctYWxsb3dQcm92aXNpb25pbmdVcGRhdGVzJywgJy1hbGxvd1Byb3Zpc2lvbmluZ0RldmljZVJlZ2lzdHJhdGlvbicpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJlc3VsdEJ1bmRsZVBhdGgpIHtcbiAgICAgIGFyZ3MucHVzaCgnLXJlc3VsdEJ1bmRsZVBhdGgnLCB0aGlzLnJlc3VsdEJ1bmRsZVBhdGgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJlc3VsdEJ1bmRsZVZlcnNpb24pIHtcbiAgICAgIGFyZ3MucHVzaCgnLXJlc3VsdEJ1bmRsZVZlcnNpb24nLCB0aGlzLnJlc3VsdEJ1bmRsZVZlcnNpb24pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnVzZVhjdGVzdHJ1bkZpbGUpIHtcbiAgICAgIGFyZ3MucHVzaCgnLXhjdGVzdHJ1bicsIHRoaXMueGN0ZXN0cnVuRmlsZVBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBydW5uZXJTY2hlbWUgPSBpc1R2T1ModGhpcy5wbGF0Zm9ybU5hbWUpID8gUlVOTkVSX1NDSEVNRV9UViA6IFJVTk5FUl9TQ0hFTUVfSU9TO1xuICAgICAgYXJncy5wdXNoKCctcHJvamVjdCcsIHRoaXMuYWdlbnRQYXRoLCAnLXNjaGVtZScsIHJ1bm5lclNjaGVtZSk7XG4gICAgICBpZiAodGhpcy5kZXJpdmVkRGF0YVBhdGgpIHtcbiAgICAgICAgYXJncy5wdXNoKCctZGVyaXZlZERhdGFQYXRoJywgdGhpcy5kZXJpdmVkRGF0YVBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgICBhcmdzLnB1c2goJy1kZXN0aW5hdGlvbicsIGBpZD0ke3RoaXMuZGV2aWNlLnVkaWR9YCk7XG5cbiAgICBjb25zdCB2ZXJzaW9uTWF0Y2ggPSBuZXcgUmVnRXhwKC9eKFxcZCspXFwuKFxcZCspLykuZXhlYyh0aGlzLnBsYXRmb3JtVmVyc2lvbik7XG4gICAgaWYgKHZlcnNpb25NYXRjaCkge1xuICAgICAgYXJncy5wdXNoKFxuICAgICAgICBgJHtpc1R2T1ModGhpcy5wbGF0Zm9ybU5hbWUpID8gJ1RWJyA6ICdJUEhPTkUnfU9TX0RFUExPWU1FTlRfVEFSR0VUPSR7dmVyc2lvbk1hdGNoWzFdfS4ke3ZlcnNpb25NYXRjaFsyXX1gXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvZy53YXJuKGBDYW5ub3QgcGFyc2UgbWFqb3IgYW5kIG1pbm9yIHZlcnNpb24gbnVtYmVycyBmcm9tIHBsYXRmb3JtVmVyc2lvbiBcIiR7dGhpcy5wbGF0Zm9ybVZlcnNpb259XCIuIGAgK1xuICAgICAgICAnV2lsbCBidWlsZCBmb3IgdGhlIGRlZmF1bHQgcGxhdGZvcm0gaW5zdGVhZCcpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJlYWxEZXZpY2UgJiYgdGhpcy54Y29kZUNvbmZpZ0ZpbGUpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBVc2luZyBYY29kZSBjb25maWd1cmF0aW9uIGZpbGU6ICcke3RoaXMueGNvZGVDb25maWdGaWxlfSdgKTtcbiAgICAgIGFyZ3MucHVzaCgnLXhjY29uZmlnJywgdGhpcy54Y29kZUNvbmZpZ0ZpbGUpO1xuICAgIH1cblxuICAgIGlmICghcHJvY2Vzcy5lbnYuQVBQSVVNX1hDVUlURVNUX1RSRUFUX1dBUk5JTkdTX0FTX0VSUk9SUykge1xuICAgICAgLy8gVGhpcyBzb21ldGltZXMgaGVscHMgdG8gc3Vydml2ZSBYY29kZSB1cGRhdGVzXG4gICAgICBhcmdzLnB1c2goJ0dDQ19UUkVBVF9XQVJOSU5HU19BU19FUlJPUlM9MCcpO1xuICAgIH1cblxuICAgIC8vIEJlbG93IG9wdGlvbiBzbGlnaHRseSByZWR1Y2VzIGJ1aWxkIHRpbWUgaW4gZGVidWcgYnVpbGRcbiAgICAvLyB3aXRoIHByZXZlbnRpbmcgdG8gZ2VuZXJhdGUgYC9JbmRleC9EYXRhU3RvcmVgIHdoaWNoIGlzIHVzZWQgYnkgZGV2ZWxvcG1lbnRcbiAgICBhcmdzLnB1c2goJ0NPTVBJTEVSX0lOREVYX1NUT1JFX0VOQUJMRT1OTycpO1xuXG4gICAgcmV0dXJuIHtjbWQsIGFyZ3N9O1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlU3ViUHJvY2VzcyAoYnVpbGRPbmx5ID0gZmFsc2UpIHtcbiAgICBpZiAoIXRoaXMudXNlWGN0ZXN0cnVuRmlsZSAmJiB0aGlzLnJlYWxEZXZpY2UpIHtcbiAgICAgIGlmICh0aGlzLmtleWNoYWluUGF0aCAmJiB0aGlzLmtleWNoYWluUGFzc3dvcmQpIHtcbiAgICAgICAgYXdhaXQgc2V0UmVhbERldmljZVNlY3VyaXR5KHRoaXMua2V5Y2hhaW5QYXRoLCB0aGlzLmtleWNoYWluUGFzc3dvcmQpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMueGNvZGVPcmdJZCAmJiB0aGlzLnhjb2RlU2lnbmluZ0lkICYmICF0aGlzLnhjb2RlQ29uZmlnRmlsZSkge1xuICAgICAgICB0aGlzLnhjb2RlQ29uZmlnRmlsZSA9IGF3YWl0IGdlbmVyYXRlWGNvZGVDb25maWdGaWxlKHRoaXMueGNvZGVPcmdJZCwgdGhpcy54Y29kZVNpZ25pbmdJZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qge2NtZCwgYXJnc30gPSB0aGlzLmdldENvbW1hbmQoYnVpbGRPbmx5KTtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgQmVnaW5uaW5nICR7YnVpbGRPbmx5ID8gJ2J1aWxkJyA6ICd0ZXN0J30gd2l0aCBjb21tYW5kICcke2NtZH0gJHthcmdzLmpvaW4oJyAnKX0nIGAgK1xuICAgICAgYGluIGRpcmVjdG9yeSAnJHt0aGlzLmJvb3RzdHJhcFBhdGh9J2ApO1xuICAgIGNvbnN0IGVudiA9IE9iamVjdC5hc3NpZ24oe30sIHByb2Nlc3MuZW52LCB7XG4gICAgICBVU0VfUE9SVDogdGhpcy53ZGFSZW1vdGVQb3J0LFxuICAgICAgV0RBX1BST0RVQ1RfQlVORExFX0lERU5USUZJRVI6IHRoaXMudXBkYXRlZFdEQUJ1bmRsZUlkIHx8IFdEQV9SVU5ORVJfQlVORExFX0lELFxuICAgIH0pO1xuICAgIGlmICh0aGlzLm1qcGVnU2VydmVyUG9ydCkge1xuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9XZWJEcml2ZXJBZ2VudC9wdWxsLzEwNVxuICAgICAgZW52Lk1KUEVHX1NFUlZFUl9QT1JUID0gdGhpcy5tanBlZ1NlcnZlclBvcnQ7XG4gICAgfVxuICAgIGNvbnN0IHVwZ3JhZGVUaW1lc3RhbXAgPSBhd2FpdCBnZXRXREFVcGdyYWRlVGltZXN0YW1wKHRoaXMuYm9vdHN0cmFwUGF0aCk7XG4gICAgaWYgKHVwZ3JhZGVUaW1lc3RhbXApIHtcbiAgICAgIGVudi5VUEdSQURFX1RJTUVTVEFNUCA9IHVwZ3JhZGVUaW1lc3RhbXA7XG4gICAgfVxuICAgIGNvbnN0IHhjb2RlYnVpbGQgPSBuZXcgU3ViUHJvY2VzcyhjbWQsIGFyZ3MsIHtcbiAgICAgIGN3ZDogdGhpcy5ib290c3RyYXBQYXRoLFxuICAgICAgZW52LFxuICAgICAgZGV0YWNoZWQ6IHRydWUsXG4gICAgICBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdwaXBlJ10sXG4gICAgfSk7XG5cbiAgICBsZXQgbG9nWGNvZGVPdXRwdXQgPSAhIXRoaXMuc2hvd1hjb2RlTG9nO1xuICAgIGNvbnN0IGxvZ01zZyA9IF8uaXNCb29sZWFuKHRoaXMuc2hvd1hjb2RlTG9nKVxuICAgICAgPyBgT3V0cHV0IGZyb20geGNvZGVidWlsZCAke3RoaXMuc2hvd1hjb2RlTG9nID8gJ3dpbGwnIDogJ3dpbGwgbm90J30gYmUgbG9nZ2VkYFxuICAgICAgOiAnT3V0cHV0IGZyb20geGNvZGVidWlsZCB3aWxsIG9ubHkgYmUgbG9nZ2VkIGlmIGFueSBlcnJvcnMgYXJlIHByZXNlbnQgdGhlcmUnO1xuICAgIHRoaXMubG9nLmRlYnVnKGAke2xvZ01zZ30uIFRvIGNoYW5nZSB0aGlzLCB1c2UgJ3Nob3dYY29kZUxvZycgZGVzaXJlZCBjYXBhYmlsaXR5YCk7XG4gICAgeGNvZGVidWlsZC5vbignb3V0cHV0JywgKHN0ZG91dCwgc3RkZXJyKSA9PiB7XG4gICAgICBsZXQgb3V0ID0gc3Rkb3V0IHx8IHN0ZGVycjtcbiAgICAgIC8vIHdlIHdhbnQgdG8gcHVsbCBvdXQgdGhlIGxvZyBmaWxlIHRoYXQgaXMgY3JlYXRlZCwgYW5kIGhpZ2hsaWdodCBpdFxuICAgICAgLy8gZm9yIGRpYWdub3N0aWMgcHVycG9zZXNcbiAgICAgIGlmIChvdXQuaW5jbHVkZXMoJ1dyaXRpbmcgZGlhZ25vc3RpYyBsb2cgZm9yIHRlc3Qgc2Vzc2lvbiB0bycpKSB7XG4gICAgICAgIC8vIHB1bGwgb3V0IHRoZSBmaXJzdCBsaW5lIHRoYXQgYmVnaW5zIHdpdGggdGhlIHBhdGggc2VwYXJhdG9yXG4gICAgICAgIC8vIHdoaWNoICpzaG91bGQqIGJlIHRoZSBsaW5lIGluZGljYXRpbmcgdGhlIGxvZyBmaWxlIGdlbmVyYXRlZFxuICAgICAgICB4Y29kZWJ1aWxkLmxvZ0xvY2F0aW9uID0gXy5maXJzdChfLnJlbW92ZShvdXQudHJpbSgpLnNwbGl0KCdcXG4nKSwgKHYpID0+IHYuc3RhcnRzV2l0aChwYXRoLnNlcCkpKTtcbiAgICAgICAgeGNvZGVMb2cuZGVidWcoYExvZyBmaWxlIGZvciB4Y29kZWJ1aWxkIHRlc3Q6ICR7eGNvZGVidWlsZC5sb2dMb2NhdGlvbn1gKTtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgd2UgaGF2ZSBhbiBlcnJvciB3ZSB3YW50IHRvIG91dHB1dCB0aGUgbG9nc1xuICAgICAgLy8gb3RoZXJ3aXNlIHRoZSBmYWlsdXJlIGlzIGluc2NydXRpYmxlXG4gICAgICAvLyBidXQgZG8gbm90IGxvZyBwZXJtaXNzaW9uIGVycm9ycyBmcm9tIHRyeWluZyB0byB3cml0ZSB0byBhdHRhY2htZW50cyBmb2xkZXJcbiAgICAgIGNvbnN0IGlnbm9yZUVycm9yID0gSUdOT1JFRF9FUlJPUlMuc29tZSgoeCkgPT4gb3V0LmluY2x1ZGVzKHgpKTtcbiAgICAgIGlmICh0aGlzLnNob3dYY29kZUxvZyAhPT0gZmFsc2UgJiYgb3V0LmluY2x1ZGVzKCdFcnJvciBEb21haW49JykgJiYgIWlnbm9yZUVycm9yKSB7XG4gICAgICAgIGxvZ1hjb2RlT3V0cHV0ID0gdHJ1ZTtcblxuICAgICAgICAvLyB0ZXJyaWJsZSBoYWNrIHRvIGhhbmRsZSBjYXNlIHdoZXJlIHhjb2RlIHJldHVybiAwIGJ1dCBpcyBmYWlsaW5nXG4gICAgICAgIHhjb2RlYnVpbGQuX3dkYV9lcnJvcl9vY2N1cnJlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGRvIG5vdCBsb2cgcGVybWlzc2lvbiBlcnJvcnMgZnJvbSB0cnlpbmcgdG8gd3JpdGUgdG8gYXR0YWNobWVudHMgZm9sZGVyXG4gICAgICBpZiAobG9nWGNvZGVPdXRwdXQgJiYgIWlnbm9yZUVycm9yKSB7XG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBvdXQuc3BsaXQoRU9MKSkge1xuICAgICAgICAgIHhjb2RlTG9nLmVycm9yKGxpbmUpO1xuICAgICAgICAgIGlmIChsaW5lKSB7XG4gICAgICAgICAgICB4Y29kZWJ1aWxkLl93ZGFfZXJyb3JfbWVzc2FnZSArPSBgJHtFT0x9JHtsaW5lfWA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4geGNvZGVidWlsZDtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0IChidWlsZE9ubHkgPSBmYWxzZSkge1xuICAgIHRoaXMueGNvZGVidWlsZCA9IGF3YWl0IHRoaXMuY3JlYXRlU3ViUHJvY2VzcyhidWlsZE9ubHkpO1xuICAgIC8vIFN0b3JlIHhjb2RlYnVpbGQgbWVzc2FnZVxuICAgIHRoaXMueGNvZGVidWlsZC5fd2RhX2Vycm9yX21lc3NhZ2UgPSAnJztcblxuICAgIC8vIHdyYXAgdGhlIHN0YXJ0IHByb2NlZHVyZSBpbiBhIHByb21pc2Ugc28gdGhhdCB3ZSBjYW4gY2F0Y2gsIGFuZCByZXBvcnQsXG4gICAgLy8gYW55IHN0YXJ0dXAgZXJyb3JzIHRoYXQgYXJlIHRocm93biBhcyBldmVudHNcbiAgICByZXR1cm4gYXdhaXQgbmV3IEIoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy54Y29kZWJ1aWxkLm9uKCdleGl0JywgYXN5bmMgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgICB4Y29kZUxvZy5lcnJvcihgeGNvZGVidWlsZCBleGl0ZWQgd2l0aCBjb2RlICcke2NvZGV9JyBhbmQgc2lnbmFsICcke3NpZ25hbH0nYCk7XG4gICAgICAgIC8vIHByaW50IG91dCB0aGUgeGNvZGVidWlsZCBmaWxlIGlmIHVzZXJzIGhhdmUgYXNrZWQgZm9yIGl0XG4gICAgICAgIGlmICh0aGlzLnNob3dYY29kZUxvZyAmJiB0aGlzLnhjb2RlYnVpbGQubG9nTG9jYXRpb24pIHtcbiAgICAgICAgICB4Y29kZUxvZy5lcnJvcihgQ29udGVudHMgb2YgeGNvZGVidWlsZCBsb2cgZmlsZSAnJHt0aGlzLnhjb2RlYnVpbGQubG9nTG9jYXRpb259JzpgKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSBhd2FpdCBmcy5yZWFkRmlsZSh0aGlzLnhjb2RlYnVpbGQubG9nTG9jYXRpb24sICd1dGY4Jyk7XG4gICAgICAgICAgICBmb3IgKGxldCBsaW5lIG9mIGRhdGEuc3BsaXQoJ1xcbicpKSB7XG4gICAgICAgICAgICAgIHhjb2RlTG9nLmVycm9yKGxpbmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgeGNvZGVMb2cuZXJyb3IoYFVuYWJsZSB0byBhY2Nlc3MgeGNvZGVidWlsZCBsb2cgZmlsZTogJyR7ZXJyLm1lc3NhZ2V9J2ApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnhjb2RlYnVpbGQucHJvY2Vzc0V4aXRlZCA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLnhjb2RlYnVpbGQuX3dkYV9lcnJvcl9vY2N1cnJlZCB8fCAoIXNpZ25hbCAmJiBjb2RlICE9PSAwKSkge1xuICAgICAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKGB4Y29kZWJ1aWxkIGZhaWxlZCB3aXRoIGNvZGUgJHtjb2RlfSR7RU9MfWAgK1xuICAgICAgICAgICAgYHhjb2RlYnVpbGQgZXJyb3IgbWVzc2FnZToke0VPTH0ke3RoaXMueGNvZGVidWlsZC5fd2RhX2Vycm9yX21lc3NhZ2V9YCkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGluIHRoZSBjYXNlIG9mIGp1c3QgYnVpbGRpbmcsIHRoZSBwcm9jZXNzIHdpbGwgZXhpdCBhbmQgdGhhdCBpcyBvdXIgZmluaXNoXG4gICAgICAgIGlmIChidWlsZE9ubHkpIHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIChhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgdGltZXIgPSBuZXcgdGltaW5nLlRpbWVyKCkuc3RhcnQoKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLnhjb2RlYnVpbGQuc3RhcnQodHJ1ZSk7XG4gICAgICAgICAgaWYgKCFidWlsZE9ubHkpIHtcbiAgICAgICAgICAgIGxldCBzdGF0dXMgPSBhd2FpdCB0aGlzLndhaXRGb3JTdGFydCh0aW1lcik7XG4gICAgICAgICAgICByZXNvbHZlKHN0YXR1cyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBsZXQgbXNnID0gYFVuYWJsZSB0byBzdGFydCBXZWJEcml2ZXJBZ2VudDogJHtlcnJ9YDtcbiAgICAgICAgICB0aGlzLmxvZy5lcnJvcihtc2cpO1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IobXNnKSk7XG4gICAgICAgIH1cbiAgICAgIH0pKCk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyB3YWl0Rm9yU3RhcnQgKHRpbWVyKSB7XG4gICAgLy8gdHJ5IHRvIGNvbm5lY3Qgb25jZSBldmVyeSAwLjUgc2Vjb25kcywgdW50aWwgYGxhdW5jaFRpbWVvdXRgIGlzIHVwXG4gICAgdGhpcy5sb2cuZGVidWcoYFdhaXRpbmcgdXAgdG8gJHt0aGlzLmxhdW5jaFRpbWVvdXR9bXMgZm9yIFdlYkRyaXZlckFnZW50IHRvIHN0YXJ0YCk7XG4gICAgbGV0IGN1cnJlbnRTdGF0dXMgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICBsZXQgcmV0cmllcyA9IHBhcnNlSW50KHRoaXMubGF1bmNoVGltZW91dCAvIDUwMCwgMTApO1xuICAgICAgYXdhaXQgcmV0cnlJbnRlcnZhbChyZXRyaWVzLCAxMDAwLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnhjb2RlYnVpbGQucHJvY2Vzc0V4aXRlZCkge1xuICAgICAgICAgIC8vIHRoZXJlIGhhcyBiZWVuIGFuIGVycm9yIGVsc2V3aGVyZSBhbmQgd2UgbmVlZCB0byBzaG9ydC1jaXJjdWl0XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb3h5VGltZW91dCA9IHRoaXMubm9TZXNzaW9uUHJveHkudGltZW91dDtcbiAgICAgICAgdGhpcy5ub1Nlc3Npb25Qcm94eS50aW1lb3V0ID0gMTAwMDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjdXJyZW50U3RhdHVzID0gYXdhaXQgdGhpcy5ub1Nlc3Npb25Qcm94eS5jb21tYW5kKCcvc3RhdHVzJywgJ0dFVCcpO1xuICAgICAgICAgIGlmIChjdXJyZW50U3RhdHVzICYmIGN1cnJlbnRTdGF0dXMuaW9zICYmIGN1cnJlbnRTdGF0dXMuaW9zLmlwKSB7XG4gICAgICAgICAgICB0aGlzLmFnZW50VXJsID0gY3VycmVudFN0YXR1cy5pb3MuaXA7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGBXZWJEcml2ZXJBZ2VudCBpbmZvcm1hdGlvbjpgKTtcbiAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhKU09OLnN0cmluZ2lmeShjdXJyZW50U3RhdHVzLCBudWxsLCAyKSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGNvbm5lY3QgdG8gcnVubmluZyBXZWJEcml2ZXJBZ2VudDogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB0aGlzLm5vU2Vzc2lvblByb3h5LnRpbWVvdXQgPSBwcm94eVRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAodGhpcy54Y29kZWJ1aWxkLnByb2Nlc3NFeGl0ZWQpIHtcbiAgICAgICAgLy8gdGhlcmUgaGFzIGJlZW4gYW4gZXJyb3IgZWxzZXdoZXJlIGFuZCB3ZSBuZWVkIHRvIHNob3J0LWNpcmN1aXRcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRTdGF0dXM7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubG9nLmRlYnVnKGBXZWJEcml2ZXJBZ2VudCBzdWNjZXNzZnVsbHkgc3RhcnRlZCBhZnRlciAke3RpbWVyLmdldER1cmF0aW9uKCkuYXNNaWxsaVNlY29uZHMudG9GaXhlZCgwKX1tc2ApO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gYXQgdGhpcyBwb2ludCwgaWYgd2UgaGF2ZSBub3QgaGFkIGFueSBlcnJvcnMgZnJvbSB4Y29kZSBpdHNlbGYgKHJlcG9ydGVkXG4gICAgICAvLyBlbHNld2hlcmUpLCB3ZSBjYW4gbGV0IHRoaXMgZ28gdGhyb3VnaCBhbmQgdHJ5IHRvIGNyZWF0ZSB0aGUgc2Vzc2lvblxuICAgICAgdGhpcy5sb2cuZGVidWcoZXJyLm1lc3NhZ2UpO1xuICAgICAgdGhpcy5sb2cud2FybihgR2V0dGluZyBzdGF0dXMgb2YgV2ViRHJpdmVyQWdlbnQgb24gZGV2aWNlIHRpbWVkIG91dC4gQ29udGludWluZ2ApO1xuICAgIH1cbiAgICByZXR1cm4gY3VycmVudFN0YXR1cztcbiAgfVxuXG4gIGFzeW5jIHF1aXQgKCkge1xuICAgIGF3YWl0IGtpbGxQcm9jZXNzKCd4Y29kZWJ1aWxkJywgdGhpcy54Y29kZWJ1aWxkKTtcbiAgfVxufVxuXG5leHBvcnQgeyBYY29kZUJ1aWxkIH07XG5leHBvcnQgZGVmYXVsdCBYY29kZUJ1aWxkO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBR0EsTUFBTUEsa0JBQWtCLEdBQUcs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
318
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYXN5bmNib3giLCJyZXF1aXJlIiwiX3RlZW5fcHJvY2VzcyIsIl9zdXBwb3J0IiwiX2xvZ2dlciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfYmx1ZWJpcmQiLCJfdXRpbHMiLCJfbG9kYXNoIiwiX3BhdGgiLCJfb3MiLCJfY29uc3RhbnRzIiwiREVGQVVMVF9TSUdOSU5HX0lEIiwiUFJFQlVJTERfREVMQVkiLCJSVU5ORVJfU0NIRU1FX0lPUyIsIkxJQl9TQ0hFTUVfSU9TIiwiRVJST1JfV1JJVElOR19BVFRBQ0hNRU5UIiwiRVJST1JfQ09QWUlOR19BVFRBQ0hNRU5UIiwiSUdOT1JFRF9FUlJPUlMiLCJSVU5ORVJfU0NIRU1FX1RWIiwiTElCX1NDSEVNRV9UViIsInhjb2RlTG9nIiwibG9nZ2VyIiwiZ2V0TG9nZ2VyIiwiWGNvZGVCdWlsZCIsImNvbnN0cnVjdG9yIiwieGNvZGVWZXJzaW9uIiwiZGV2aWNlIiwiYXJncyIsImxvZyIsImRlZmF1bHRMb2dnZXIiLCJyZWFsRGV2aWNlIiwiYWdlbnRQYXRoIiwiYm9vdHN0cmFwUGF0aCIsInBsYXRmb3JtVmVyc2lvbiIsInBsYXRmb3JtTmFtZSIsImlvc1Nka1ZlcnNpb24iLCJzaG93WGNvZGVMb2ciLCJ4Y29kZUNvbmZpZ0ZpbGUiLCJ4Y29kZU9yZ0lkIiwieGNvZGVTaWduaW5nSWQiLCJrZXljaGFpblBhdGgiLCJrZXljaGFpblBhc3N3b3JkIiwicHJlYnVpbGRXREEiLCJ1c2VQcmVidWlsdFdEQSIsInVzZVNpbXBsZUJ1aWxkVGVzdCIsInVzZVhjdGVzdHJ1bkZpbGUiLCJsYXVuY2hUaW1lb3V0Iiwid2RhUmVtb3RlUG9ydCIsInVwZGF0ZWRXREFCdW5kbGVJZCIsImRlcml2ZWREYXRhUGF0aCIsIm1qcGVnU2VydmVyUG9ydCIsInByZWJ1aWxkRGVsYXkiLCJfIiwiaXNOdW1iZXIiLCJhbGxvd1Byb3Zpc2lvbmluZ0RldmljZVJlZ2lzdHJhdGlvbiIsInJlc3VsdEJ1bmRsZVBhdGgiLCJyZXN1bHRCdW5kbGVWZXJzaW9uIiwiaW5pdCIsIm5vU2Vzc2lvblByb3h5IiwiZGV2aXZlSW5mbyIsImlzUmVhbERldmljZSIsInVkaWQiLCJ4Y3Rlc3RydW5GaWxlUGF0aCIsInNldFhjdGVzdHJ1bkZpbGUiLCJyZXNldFByb2plY3RGaWxlIiwidXBkYXRlUHJvamVjdEZpbGUiLCJyZXRyaWV2ZURlcml2ZWREYXRhUGF0aCIsIl9kZXJpdmVkRGF0YVBhdGhQcm9taXNlIiwic3Rkb3V0IiwiZXhlYyIsImVyciIsIndhcm4iLCJtZXNzYWdlIiwicGF0dGVybiIsIm1hdGNoIiwidHJ1bmNhdGUiLCJsZW5ndGgiLCJkZWJ1ZyIsInBhdGgiLCJkaXJuYW1lIiwibm9ybWFsaXplIiwicmVzZXQiLCJwcmVidWlsZCIsInN0YXJ0IiwieGNvZGVidWlsZCIsIkIiLCJkZWxheSIsImNsZWFuUHJvamVjdCIsImxpYlNjaGVtZSIsImlzVHZPUyIsInJ1bm5lclNjaGVtZSIsInNjaGVtZSIsImdldENvbW1hbmQiLCJidWlsZE9ubHkiLCJjbWQiLCJidWlsZENtZCIsInRlc3RDbWQiLCJwdXNoIiwidmVyc2lvbk1hdGNoIiwiUmVnRXhwIiwicHJvY2VzcyIsImVudiIsIkFQUElVTV9YQ1VJVEVTVF9UUkVBVF9XQVJOSU5HU19BU19FUlJPUlMiLCJjcmVhdGVTdWJQcm9jZXNzIiwic2V0UmVhbERldmljZVNlY3VyaXR5IiwiZ2VuZXJhdGVYY29kZUNvbmZpZ0ZpbGUiLCJqb2luIiwiT2JqZWN0IiwiYXNzaWduIiwiVVNFX1BPUlQiLCJXREFfUFJPRFVDVF9CVU5ETEVfSURFTlRJRklFUiIsIldEQV9SVU5ORVJfQlVORExFX0lEIiwiTUpQRUdfU0VSVkVSX1BPUlQiLCJ1cGdyYWRlVGltZXN0YW1wIiwiZ2V0V0RBVXBncmFkZVRpbWVzdGFtcCIsIlVQR1JBREVfVElNRVNUQU1QIiwiU3ViUHJvY2VzcyIsImN3ZCIsImRldGFjaGVkIiwic3RkaW8iLCJsb2dYY29kZU91dHB1dCIsImxvZ01zZyIsImlzQm9vbGVhbiIsIm9uIiwic3RkZXJyIiwib3V0IiwiaW5jbHVkZXMiLCJsb2dMb2NhdGlvbiIsImZpcnN0IiwicmVtb3ZlIiwidHJpbSIsInNwbGl0IiwidiIsInN0YXJ0c1dpdGgiLCJzZXAiLCJpZ25vcmVFcnJvciIsInNvbWUiLCJ4IiwiX3dkYV9lcnJvcl9vY2N1cnJlZCIsImxpbmUiLCJFT0wiLCJlcnJvciIsIl93ZGFfZXJyb3JfbWVzc2FnZSIsInJlc29sdmUiLCJyZWplY3QiLCJjb2RlIiwic2lnbmFsIiwiZGF0YSIsImZzIiwicmVhZEZpbGUiLCJwcm9jZXNzRXhpdGVkIiwiRXJyb3IiLCJ0aW1lciIsInRpbWluZyIsIlRpbWVyIiwic3RhdHVzIiwid2FpdEZvclN0YXJ0IiwibXNnIiwiY3VycmVudFN0YXR1cyIsInJldHJpZXMiLCJwYXJzZUludCIsInJldHJ5SW50ZXJ2YWwiLCJwcm94eVRpbWVvdXQiLCJ0aW1lb3V0IiwiY29tbWFuZCIsImlvcyIsImlwIiwiYWdlbnRVcmwiLCJKU09OIiwic3RyaW5naWZ5IiwiZ2V0RHVyYXRpb24iLCJhc01pbGxpU2Vjb25kcyIsInRvRml4ZWQiLCJxdWl0Iiwia2lsbFByb2Nlc3MiLCJleHBvcnRzIiwiX2RlZmF1bHQiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vbGliL3hjb2RlYnVpbGQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmV0cnlJbnRlcnZhbCB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IFN1YlByb2Nlc3MsIGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHsgZnMsIGxvZ2dlciwgdGltaW5nIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBkZWZhdWx0TG9nZ2VyIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7XG4gIHNldFJlYWxEZXZpY2VTZWN1cml0eSwgZ2VuZXJhdGVYY29kZUNvbmZpZ0ZpbGUsIHNldFhjdGVzdHJ1bkZpbGUsXG4gIHVwZGF0ZVByb2plY3RGaWxlLCByZXNldFByb2plY3RGaWxlLCBraWxsUHJvY2VzcyxcbiAgZ2V0V0RBVXBncmFkZVRpbWVzdGFtcCwgaXNUdk9TIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBFT0wgfSBmcm9tICdvcyc7XG5pbXBvcnQgeyBXREFfUlVOTkVSX0JVTkRMRV9JRCB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuXG5jb25zdCBERUZBVUxUX1NJR05JTkdfSUQgPSAnaVBob25lIERldmVsb3Blcic7XG5jb25zdCBQUkVCVUlMRF9ERUxBWSA9IDA7XG5jb25zdCBSVU5ORVJfU0NIRU1FX0lPUyA9ICdXZWJEcml2ZXJBZ2VudFJ1bm5lcic7XG5jb25zdCBMSUJfU0NIRU1FX0lPUyA9ICdXZWJEcml2ZXJBZ2VudExpYic7XG5cbmNvbnN0IEVSUk9SX1dSSVRJTkdfQVRUQUNITUVOVCA9ICdFcnJvciB3cml0aW5nIGF0dGFjaG1lbnQgZGF0YSB0byBmaWxlJztcbmNvbnN0IEVSUk9SX0NPUFlJTkdfQVRUQUNITUVOVCA9ICdFcnJvciBjb3B5aW5nIHRlc3RpbmcgYXR0YWNobWVudCc7XG5jb25zdCBJR05PUkVEX0VSUk9SUyA9IFtcbiAgRVJST1JfV1JJVElOR19BVFRBQ0hNRU5ULFxuICBFUlJPUl9DT1BZSU5HX0FUVEFDSE1FTlQsXG4gICdGYWlsZWQgdG8gcmVtb3ZlIHNjcmVlbnNob3QgYXQgcGF0aCcsXG5dO1xuXG5jb25zdCBSVU5ORVJfU0NIRU1FX1RWID0gJ1dlYkRyaXZlckFnZW50UnVubmVyX3R2T1MnO1xuY29uc3QgTElCX1NDSEVNRV9UViA9ICdXZWJEcml2ZXJBZ2VudExpYl90dk9TJztcblxuY29uc3QgeGNvZGVMb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdYY29kZScpO1xuXG5cbmNsYXNzIFhjb2RlQnVpbGQge1xuICBjb25zdHJ1Y3RvciAoeGNvZGVWZXJzaW9uLCBkZXZpY2UsIGFyZ3MgPSB7fSwgbG9nID0gbnVsbCkge1xuICAgIHRoaXMueGNvZGVWZXJzaW9uID0geGNvZGVWZXJzaW9uO1xuXG4gICAgdGhpcy5kZXZpY2UgPSBkZXZpY2U7XG4gICAgdGhpcy5sb2cgPSBsb2cgPz8gZGVmYXVsdExvZ2dlcjtcblxuICAgIHRoaXMucmVhbERldmljZSA9IGFyZ3MucmVhbERldmljZTtcblxuICAgIHRoaXMuYWdlbnRQYXRoID0gYXJncy5hZ2VudFBhdGg7XG4gICAgdGhpcy5ib290c3RyYXBQYXRoID0gYXJncy5ib290c3RyYXBQYXRoO1xuXG4gICAgdGhpcy5wbGF0Zm9ybVZlcnNpb24gPSBhcmdzLnBsYXRmb3JtVmVyc2lvbjtcbiAgICB0aGlzLnBsYXRmb3JtTmFtZSA9IGFyZ3MucGxhdGZvcm1OYW1lO1xuICAgIHRoaXMuaW9zU2RrVmVyc2lvbiA9IGFyZ3MuaW9zU2RrVmVyc2lvbjtcblxuICAgIHRoaXMuc2hvd1hjb2RlTG9nID0gYXJncy5zaG93WGNvZGVMb2c7XG5cbiAgICB0aGlzLnhjb2RlQ29uZmlnRmlsZSA9IGFyZ3MueGNvZGVDb25maWdGaWxlO1xuICAgIHRoaXMueGNvZGVPcmdJZCA9IGFyZ3MueGNvZGVPcmdJZDtcbiAgICB0aGlzLnhjb2RlU2lnbmluZ0lkID0gYXJncy54Y29kZVNpZ25pbmdJZCB8fCBERUZBVUxUX1NJR05JTkdfSUQ7XG4gICAgdGhpcy5rZXljaGFpblBhdGggPSBhcmdzLmtleWNoYWluUGF0aDtcbiAgICB0aGlzLmtleWNoYWluUGFzc3dvcmQgPSBhcmdzLmtleWNoYWluUGFzc3dvcmQ7XG5cbiAgICB0aGlzLnByZWJ1aWxkV0RBID0gYXJncy5wcmVidWlsZFdEQTtcbiAgICB0aGlzLnVzZVByZWJ1aWx0V0RBID0gYXJncy51c2VQcmVidWlsdFdEQTtcbiAgICB0aGlzLnVzZVNpbXBsZUJ1aWxkVGVzdCA9IGFyZ3MudXNlU2ltcGxlQnVpbGRUZXN0O1xuXG4gICAgdGhpcy51c2VYY3Rlc3RydW5GaWxlID0gYXJncy51c2VYY3Rlc3RydW5GaWxlO1xuXG4gICAgdGhpcy5sYXVuY2hUaW1lb3V0ID0gYXJncy5sYXVuY2hUaW1lb3V0O1xuXG4gICAgdGhpcy53ZGFSZW1vdGVQb3J0ID0gYXJncy53ZGFSZW1vdGVQb3J0O1xuXG4gICAgdGhpcy51cGRhdGVkV0RBQnVuZGxlSWQgPSBhcmdzLnVwZGF0ZWRXREFCdW5kbGVJZDtcbiAgICB0aGlzLmRlcml2ZWREYXRhUGF0aCA9IGFyZ3MuZGVyaXZlZERhdGFQYXRoO1xuXG4gICAgdGhpcy5tanBlZ1NlcnZlclBvcnQgPSBhcmdzLm1qcGVnU2VydmVyUG9ydDtcblxuICAgIHRoaXMucHJlYnVpbGREZWxheSA9IF8uaXNOdW1iZXIoYXJncy5wcmVidWlsZERlbGF5KSA/IGFyZ3MucHJlYnVpbGREZWxheSA6IFBSRUJVSUxEX0RFTEFZO1xuXG4gICAgdGhpcy5hbGxvd1Byb3Zpc2lvbmluZ0RldmljZVJlZ2lzdHJhdGlvbiA9IGFyZ3MuYWxsb3dQcm92aXNpb25pbmdEZXZpY2VSZWdpc3RyYXRpb247XG5cbiAgICB0aGlzLnJlc3VsdEJ1bmRsZVBhdGggPSBhcmdzLnJlc3VsdEJ1bmRsZVBhdGg7XG4gICAgdGhpcy5yZXN1bHRCdW5kbGVWZXJzaW9uID0gYXJncy5yZXN1bHRCdW5kbGVWZXJzaW9uO1xuICB9XG5cbiAgYXN5bmMgaW5pdCAobm9TZXNzaW9uUHJveHkpIHtcbiAgICB0aGlzLm5vU2Vzc2lvblByb3h5ID0gbm9TZXNzaW9uUHJveHk7XG5cbiAgICBpZiAodGhpcy51c2VYY3Rlc3RydW5GaWxlKSB7XG4gICAgICBjb25zdCBkZXZpdmVJbmZvID0ge1xuICAgICAgICBpc1JlYWxEZXZpY2U6IHRoaXMucmVhbERldmljZSxcbiAgICAgICAgdWRpZDogdGhpcy5kZXZpY2UudWRpZCxcbiAgICAgICAgcGxhdGZvcm1WZXJzaW9uOiB0aGlzLnBsYXRmb3JtVmVyc2lvbixcbiAgICAgICAgcGxhdGZvcm1OYW1lOiB0aGlzLnBsYXRmb3JtTmFtZVxuICAgICAgfTtcbiAgICAgIHRoaXMueGN0ZXN0cnVuRmlsZVBhdGggPSBhd2FpdCBzZXRYY3Rlc3RydW5GaWxlKGRldml2ZUluZm8sIHRoaXMuaW9zU2RrVmVyc2lvbiwgdGhpcy5ib290c3RyYXBQYXRoLCB0aGlzLndkYVJlbW90ZVBvcnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGlmIG5lY2Vzc2FyeSwgdXBkYXRlIHRoZSBidW5kbGVJZCB0byB1c2VyJ3Mgc3BlY2lmaWNhdGlvblxuICAgIGlmICh0aGlzLnJlYWxEZXZpY2UpIHtcbiAgICAgIC8vIEluIGNhc2UgdGhlIHByb2plY3Qgc3RpbGwgaGFzIHRoZSB1c2VyIHNwZWNpZmljIGJ1bmRsZSBJRCwgcmVzZXQgdGhlIHByb2plY3QgZmlsZSBmaXJzdC5cbiAgICAgIC8vIC0gV2UgZG8gdGhpcyByZXNldCBldmVuIGlmIHVwZGF0ZWRXREFCdW5kbGVJZCBpcyBub3Qgc3BlY2lmaWVkLFxuICAgICAgLy8gICBzaW5jZSB0aGUgcHJldmlvdXMgdXBkYXRlZFdEQUJ1bmRsZUlkIHRlc3QgaGFzIGdlbmVyYXRlZCB0aGUgdXNlciBzcGVjaWZpYyBidW5kbGUgSUQgcHJvamVjdCBmaWxlLlxuICAgICAgLy8gLSBXZSBkb24ndCBjYWxsIHJlc2V0UHJvamVjdEZpbGUgZm9yIHNpbXVsYXRvcixcbiAgICAgIC8vICAgc2luY2Ugc2ltdWxhdG9yIHRlc3QgcnVuIHdpbGwgd29yayB3aXRoIGFueSB1c2VyIHNwZWNpZmljIGJ1bmRsZSBJRC5cbiAgICAgIGF3YWl0IHJlc2V0UHJvamVjdEZpbGUodGhpcy5hZ2VudFBhdGgpO1xuICAgICAgaWYgKHRoaXMudXBkYXRlZFdEQUJ1bmRsZUlkKSB7XG4gICAgICAgIGF3YWl0IHVwZGF0ZVByb2plY3RGaWxlKHRoaXMuYWdlbnRQYXRoLCB0aGlzLnVwZGF0ZWRXREFCdW5kbGVJZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcmV0cmlldmVEZXJpdmVkRGF0YVBhdGggKCkge1xuICAgIGlmICh0aGlzLmRlcml2ZWREYXRhUGF0aCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGVyaXZlZERhdGFQYXRoO1xuICAgIH1cblxuICAgIC8vIGF2b2lkIHJhY2UgY29uZGl0aW9uc1xuICAgIGlmICh0aGlzLl9kZXJpdmVkRGF0YVBhdGhQcm9taXNlKSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5fZGVyaXZlZERhdGFQYXRoUHJvbWlzZTtcbiAgICB9XG5cbiAgICB0aGlzLl9kZXJpdmVkRGF0YVBhdGhQcm9taXNlID0gKGFzeW5jICgpID0+IHtcbiAgICAgIGxldCBzdGRvdXQ7XG4gICAgICB0cnkge1xuICAgICAgICAoe3N0ZG91dH0gPSBhd2FpdCBleGVjKCd4Y29kZWJ1aWxkJywgWyctcHJvamVjdCcsIHRoaXMuYWdlbnRQYXRoLCAnLXNob3dCdWlsZFNldHRpbmdzJ10pKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGBDYW5ub3QgcmV0cmlldmUgV0RBIGJ1aWxkIHNldHRpbmdzLiBPcmlnaW5hbCBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXR0ZXJuID0gL15cXHMqQlVJTERfRElSXFxzKz1cXHMrKFxcLy4qKS9tO1xuICAgICAgY29uc3QgbWF0Y2ggPSBwYXR0ZXJuLmV4ZWMoc3Rkb3V0KTtcbiAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgdGhpcy5sb2cud2FybihgQ2Fubm90IHBhcnNlIFdEQSBidWlsZCBkaXIgZnJvbSAke18udHJ1bmNhdGUoc3Rkb3V0LCB7bGVuZ3RoOiAzMDB9KX1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5sb2cuZGVidWcoYFBhcnNlZCBCVUlMRF9ESVIgY29uZmlndXJhdGlvbiB2YWx1ZTogJyR7bWF0Y2hbMV19J2ApO1xuICAgICAgLy8gRGVyaXZlZCBkYXRhIHJvb3QgaXMgdHdvIGxldmVscyBoaWdoZXIgb3ZlciB0aGUgYnVpbGQgZGlyXG4gICAgICB0aGlzLmRlcml2ZWREYXRhUGF0aCA9IHBhdGguZGlybmFtZShwYXRoLmRpcm5hbWUocGF0aC5ub3JtYWxpemUobWF0Y2hbMV0pKSk7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgR290IGRlcml2ZWQgZGF0YSByb290OiAnJHt0aGlzLmRlcml2ZWREYXRhUGF0aH0nYCk7XG4gICAgICByZXR1cm4gdGhpcy5kZXJpdmVkRGF0YVBhdGg7XG4gICAgfSkoKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fZGVyaXZlZERhdGFQYXRoUHJvbWlzZTtcbiAgfVxuXG4gIGFzeW5jIHJlc2V0ICgpIHtcbiAgICAvLyBpZiBuZWNlc3NhcnksIHJlc2V0IHRoZSBidW5kbGVJZCB0byBvcmlnaW5hbCB2YWx1ZVxuICAgIGlmICh0aGlzLnJlYWxEZXZpY2UgJiYgdGhpcy51cGRhdGVkV0RBQnVuZGxlSWQpIHtcbiAgICAgIGF3YWl0IHJlc2V0UHJvamVjdEZpbGUodGhpcy5hZ2VudFBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHByZWJ1aWxkICgpIHtcbiAgICAvLyBmaXJzdCBkbyBhIGJ1aWxkIHBoYXNlXG4gICAgdGhpcy5sb2cuZGVidWcoJ1ByZS1idWlsZGluZyBXREEgYmVmb3JlIGxhdW5jaGluZyB0ZXN0Jyk7XG4gICAgdGhpcy51c2VQcmVidWlsdFdEQSA9IHRydWU7XG4gICAgYXdhaXQgdGhpcy5zdGFydCh0cnVlKTtcblxuICAgIHRoaXMueGNvZGVidWlsZCA9IG51bGw7XG5cbiAgICAvLyBwYXVzZSBhIG1vbWVudFxuICAgIGF3YWl0IEIuZGVsYXkodGhpcy5wcmVidWlsZERlbGF5KTtcbiAgfVxuXG4gIGFzeW5jIGNsZWFuUHJvamVjdCAoKSB7XG4gICAgY29uc3QgbGliU2NoZW1lID0gaXNUdk9TKHRoaXMucGxhdGZvcm1OYW1lKSA/IExJQl9TQ0hFTUVfVFYgOiBMSUJfU0NIRU1FX0lPUztcbiAgICBjb25zdCBydW5uZXJTY2hlbWUgPSBpc1R2T1ModGhpcy5wbGF0Zm9ybU5hbWUpID8gUlVOTkVSX1NDSEVNRV9UViA6IFJVTk5FUl9TQ0hFTUVfSU9TO1xuXG4gICAgZm9yIChjb25zdCBzY2hlbWUgb2YgW2xpYlNjaGVtZSwgcnVubmVyU2NoZW1lXSkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYENsZWFuaW5nIHRoZSBwcm9qZWN0IHNjaGVtZSAnJHtzY2hlbWV9JyB0byBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIGxlZnRvdmVycyBmcm9tIHByZXZpb3VzIGluc3RhbGxzYCk7XG4gICAgICBhd2FpdCBleGVjKCd4Y29kZWJ1aWxkJywgW1xuICAgICAgICAnY2xlYW4nLFxuICAgICAgICAnLXByb2plY3QnLCB0aGlzLmFnZW50UGF0aCxcbiAgICAgICAgJy1zY2hlbWUnLCBzY2hlbWUsXG4gICAgICBdKTtcbiAgICB9XG4gIH1cblxuICBnZXRDb21tYW5kIChidWlsZE9ubHkgPSBmYWxzZSkge1xuICAgIGxldCBjbWQgPSAneGNvZGVidWlsZCc7XG4gICAgbGV0IGFyZ3M7XG5cbiAgICAvLyBmaWd1cmUgb3V0IHRoZSB0YXJnZXRzIGZvciB4Y29kZWJ1aWxkXG4gICAgY29uc3QgW2J1aWxkQ21kLCB0ZXN0Q21kXSA9IHRoaXMudXNlU2ltcGxlQnVpbGRUZXN0ID8gWydidWlsZCcsICd0ZXN0J10gOiBbJ2J1aWxkLWZvci10ZXN0aW5nJywgJ3Rlc3Qtd2l0aG91dC1idWlsZGluZyddO1xuICAgIGlmIChidWlsZE9ubHkpIHtcbiAgICAgIGFyZ3MgPSBbYnVpbGRDbWRdO1xuICAgIH0gZWxzZSBpZiAodGhpcy51c2VQcmVidWlsdFdEQSB8fCB0aGlzLnVzZVhjdGVzdHJ1bkZpbGUpIHtcbiAgICAgIGFyZ3MgPSBbdGVzdENtZF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGFyZ3MgPSBbYnVpbGRDbWQsIHRlc3RDbWRdO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmFsbG93UHJvdmlzaW9uaW5nRGV2aWNlUmVnaXN0cmF0aW9uKSB7XG4gICAgICAvLyBUbyAtYWxsb3dQcm92aXNpb25pbmdEZXZpY2VSZWdpc3RyYXRpb24gZmxhZyB0YWtlcyBlZmZlY3QsIC1hbGxvd1Byb3Zpc2lvbmluZ1VwZGF0ZXMgbmVlZHMgdG8gYmUgcGFzc2VkIGFzIHdlbGwuXG4gICAgICBhcmdzLnB1c2goJy1hbGxvd1Byb3Zpc2lvbmluZ1VwZGF0ZXMnLCAnLWFsbG93UHJvdmlzaW9uaW5nRGV2aWNlUmVnaXN0cmF0aW9uJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVzdWx0QnVuZGxlUGF0aCkge1xuICAgICAgYXJncy5wdXNoKCctcmVzdWx0QnVuZGxlUGF0aCcsIHRoaXMucmVzdWx0QnVuZGxlUGF0aCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVzdWx0QnVuZGxlVmVyc2lvbikge1xuICAgICAgYXJncy5wdXNoKCctcmVzdWx0QnVuZGxlVmVyc2lvbicsIHRoaXMucmVzdWx0QnVuZGxlVmVyc2lvbik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudXNlWGN0ZXN0cnVuRmlsZSkge1xuICAgICAgYXJncy5wdXNoKCcteGN0ZXN0cnVuJywgdGhpcy54Y3Rlc3RydW5GaWxlUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJ1bm5lclNjaGVtZSA9IGlzVHZPUyh0aGlzLnBsYXRmb3JtTmFtZSkgPyBSVU5ORVJfU0NIRU1FX1RWIDogUlVOTkVSX1NDSEVNRV9JT1M7XG4gICAgICBhcmdzLnB1c2goJy1wcm9qZWN0JywgdGhpcy5hZ2VudFBhdGgsICctc2NoZW1lJywgcnVubmVyU2NoZW1lKTtcbiAgICAgIGlmICh0aGlzLmRlcml2ZWREYXRhUGF0aCkge1xuICAgICAgICBhcmdzLnB1c2goJy1kZXJpdmVkRGF0YVBhdGgnLCB0aGlzLmRlcml2ZWREYXRhUGF0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIGFyZ3MucHVzaCgnLWRlc3RpbmF0aW9uJywgYGlkPSR7dGhpcy5kZXZpY2UudWRpZH1gKTtcblxuICAgIGNvbnN0IHZlcnNpb25NYXRjaCA9IG5ldyBSZWdFeHAoL14oXFxkKylcXC4oXFxkKykvKS5leGVjKHRoaXMucGxhdGZvcm1WZXJzaW9uKTtcbiAgICBpZiAodmVyc2lvbk1hdGNoKSB7XG4gICAgICBhcmdzLnB1c2goXG4gICAgICAgIGAke2lzVHZPUyh0aGlzLnBsYXRmb3JtTmFtZSkgPyAnVFYnIDogJ0lQSE9ORSd9T1NfREVQTE9ZTUVOVF9UQVJHRVQ9JHt2ZXJzaW9uTWF0Y2hbMV19LiR7dmVyc2lvbk1hdGNoWzJdfWBcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nLndhcm4oYENhbm5vdCBwYXJzZSBtYWpvciBhbmQgbWlub3IgdmVyc2lvbiBudW1iZXJzIGZyb20gcGxhdGZvcm1WZXJzaW9uIFwiJHt0aGlzLnBsYXRmb3JtVmVyc2lvbn1cIi4gYCArXG4gICAgICAgICdXaWxsIGJ1aWxkIGZvciB0aGUgZGVmYXVsdCBwbGF0Zm9ybSBpbnN0ZWFkJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVhbERldmljZSAmJiB0aGlzLnhjb2RlQ29uZmlnRmlsZSkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFVzaW5nIFhjb2RlIGNvbmZpZ3VyYXRpb24gZmlsZTogJyR7dGhpcy54Y29kZUNvbmZpZ0ZpbGV9J2ApO1xuICAgICAgYXJncy5wdXNoKCcteGNjb25maWcnLCB0aGlzLnhjb2RlQ29uZmlnRmlsZSk7XG4gICAgfVxuXG4gICAgaWYgKCFwcm9jZXNzLmVudi5BUFBJVU1fWENVSVRFU1RfVFJFQVRfV0FSTklOR1NfQVNfRVJST1JTKSB7XG4gICAgICAvLyBUaGlzIHNvbWV0aW1lcyBoZWxwcyB0byBzdXJ2aXZlIFhjb2RlIHVwZGF0ZXNcbiAgICAgIGFyZ3MucHVzaCgnR0NDX1RSRUFUX1dBUk5JTkdTX0FTX0VSUk9SUz0wJyk7XG4gICAgfVxuXG4gICAgLy8gQmVsb3cgb3B0aW9uIHNsaWdodGx5IHJlZHVjZXMgYnVpbGQgdGltZSBpbiBkZWJ1ZyBidWlsZFxuICAgIC8vIHdpdGggcHJldmVudGluZyB0byBnZW5lcmF0ZSBgL0luZGV4L0RhdGFTdG9yZWAgd2hpY2ggaXMgdXNlZCBieSBkZXZlbG9wbWVudFxuICAgIGFyZ3MucHVzaCgnQ09NUElMRVJfSU5ERVhfU1RPUkVfRU5BQkxFPU5PJyk7XG5cbiAgICByZXR1cm4ge2NtZCwgYXJnc307XG4gIH1cblxuICBhc3luYyBjcmVhdGVTdWJQcm9jZXNzIChidWlsZE9ubHkgPSBmYWxzZSkge1xuICAgIGlmICghdGhpcy51c2VYY3Rlc3RydW5GaWxlICYmIHRoaXMucmVhbERldmljZSkge1xuICAgICAgaWYgKHRoaXMua2V5Y2hhaW5QYXRoICYmIHRoaXMua2V5Y2hhaW5QYXNzd29yZCkge1xuICAgICAgICBhd2FpdCBzZXRSZWFsRGV2aWNlU2VjdXJpdHkodGhpcy5rZXljaGFpblBhdGgsIHRoaXMua2V5Y2hhaW5QYXNzd29yZCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy54Y29kZU9yZ0lkICYmIHRoaXMueGNvZGVTaWduaW5nSWQgJiYgIXRoaXMueGNvZGVDb25maWdGaWxlKSB7XG4gICAgICAgIHRoaXMueGNvZGVDb25maWdGaWxlID0gYXdhaXQgZ2VuZXJhdGVYY29kZUNvbmZpZ0ZpbGUodGhpcy54Y29kZU9yZ0lkLCB0aGlzLnhjb2RlU2lnbmluZ0lkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB7Y21kLCBhcmdzfSA9IHRoaXMuZ2V0Q29tbWFuZChidWlsZE9ubHkpO1xuICAgIHRoaXMubG9nLmRlYnVnKGBCZWdpbm5pbmcgJHtidWlsZE9ubHkgPyAnYnVpbGQnIDogJ3Rlc3QnfSB3aXRoIGNvbW1hbmQgJyR7Y21kfSAke2FyZ3Muam9pbignICcpfScgYCArXG4gICAgICBgaW4gZGlyZWN0b3J5ICcke3RoaXMuYm9vdHN0cmFwUGF0aH0nYCk7XG4gICAgY29uc3QgZW52ID0gT2JqZWN0LmFzc2lnbih7fSwgcHJvY2Vzcy5lbnYsIHtcbiAgICAgIFVTRV9QT1JUOiB0aGlzLndkYVJlbW90ZVBvcnQsXG4gICAgICBXREFfUFJPRFVDVF9CVU5ETEVfSURFTlRJRklFUjogdGhpcy51cGRhdGVkV0RBQnVuZGxlSWQgfHwgV0RBX1JVTk5FUl9CVU5ETEVfSUQsXG4gICAgfSk7XG4gICAgaWYgKHRoaXMubWpwZWdTZXJ2ZXJQb3J0KSB7XG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL1dlYkRyaXZlckFnZW50L3B1bGwvMTA1XG4gICAgICBlbnYuTUpQRUdfU0VSVkVSX1BPUlQgPSB0aGlzLm1qcGVnU2VydmVyUG9ydDtcbiAgICB9XG4gICAgY29uc3QgdXBncmFkZVRpbWVzdGFtcCA9IGF3YWl0IGdldFdEQVVwZ3JhZGVUaW1lc3RhbXAodGhpcy5ib290c3RyYXBQYXRoKTtcbiAgICBpZiAodXBncmFkZVRpbWVzdGFtcCkge1xuICAgICAgZW52LlVQR1JBREVfVElNRVNUQU1QID0gdXBncmFkZVRpbWVzdGFtcDtcbiAgICB9XG4gICAgY29uc3QgeGNvZGVidWlsZCA9IG5ldyBTdWJQcm9jZXNzKGNtZCwgYXJncywge1xuICAgICAgY3dkOiB0aGlzLmJvb3RzdHJhcFBhdGgsXG4gICAgICBlbnYsXG4gICAgICBkZXRhY2hlZDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ3BpcGUnXSxcbiAgICB9KTtcblxuICAgIGxldCBsb2dYY29kZU91dHB1dCA9ICEhdGhpcy5zaG93WGNvZGVMb2c7XG4gICAgY29uc3QgbG9nTXNnID0gXy5pc0Jvb2xlYW4odGhpcy5zaG93WGNvZGVMb2cpXG4gICAgICA/IGBPdXRwdXQgZnJvbSB4Y29kZWJ1aWxkICR7dGhpcy5zaG93WGNvZGVMb2cgPyAnd2lsbCcgOiAnd2lsbCBub3QnfSBiZSBsb2dnZWRgXG4gICAgICA6ICdPdXRwdXQgZnJvbSB4Y29kZWJ1aWxkIHdpbGwgb25seSBiZSBsb2dnZWQgaWYgYW55IGVycm9ycyBhcmUgcHJlc2VudCB0aGVyZSc7XG4gICAgdGhpcy5sb2cuZGVidWcoYCR7bG9nTXNnfS4gVG8gY2hhbmdlIHRoaXMsIHVzZSAnc2hvd1hjb2RlTG9nJyBkZXNpcmVkIGNhcGFiaWxpdHlgKTtcbiAgICB4Y29kZWJ1aWxkLm9uKCdvdXRwdXQnLCAoc3Rkb3V0LCBzdGRlcnIpID0+IHtcbiAgICAgIGxldCBvdXQgPSBzdGRvdXQgfHwgc3RkZXJyO1xuICAgICAgLy8gd2Ugd2FudCB0byBwdWxsIG91dCB0aGUgbG9nIGZpbGUgdGhhdCBpcyBjcmVhdGVkLCBhbmQgaGlnaGxpZ2h0IGl0XG4gICAgICAvLyBmb3IgZGlhZ25vc3RpYyBwdXJwb3Nlc1xuICAgICAgaWYgKG91dC5pbmNsdWRlcygnV3JpdGluZyBkaWFnbm9zdGljIGxvZyBmb3IgdGVzdCBzZXNzaW9uIHRvJykpIHtcbiAgICAgICAgLy8gcHVsbCBvdXQgdGhlIGZpcnN0IGxpbmUgdGhhdCBiZWdpbnMgd2l0aCB0aGUgcGF0aCBzZXBhcmF0b3JcbiAgICAgICAgLy8gd2hpY2ggKnNob3VsZCogYmUgdGhlIGxpbmUgaW5kaWNhdGluZyB0aGUgbG9nIGZpbGUgZ2VuZXJhdGVkXG4gICAgICAgIHhjb2RlYnVpbGQubG9nTG9jYXRpb24gPSBfLmZpcnN0KF8ucmVtb3ZlKG91dC50cmltKCkuc3BsaXQoJ1xcbicpLCAodikgPT4gdi5zdGFydHNXaXRoKHBhdGguc2VwKSkpO1xuICAgICAgICB4Y29kZUxvZy5kZWJ1ZyhgTG9nIGZpbGUgZm9yIHhjb2RlYnVpbGQgdGVzdDogJHt4Y29kZWJ1aWxkLmxvZ0xvY2F0aW9ufWApO1xuICAgICAgfVxuXG4gICAgICAvLyBpZiB3ZSBoYXZlIGFuIGVycm9yIHdlIHdhbnQgdG8gb3V0cHV0IHRoZSBsb2dzXG4gICAgICAvLyBvdGhlcndpc2UgdGhlIGZhaWx1cmUgaXMgaW5zY3J1dGlibGVcbiAgICAgIC8vIGJ1dCBkbyBub3QgbG9nIHBlcm1pc3Npb24gZXJyb3JzIGZyb20gdHJ5aW5nIHRvIHdyaXRlIHRvIGF0dGFjaG1lbnRzIGZvbGRlclxuICAgICAgY29uc3QgaWdub3JlRXJyb3IgPSBJR05PUkVEX0VSUk9SUy5zb21lKCh4KSA9PiBvdXQuaW5jbHVkZXMoeCkpO1xuICAgICAgaWYgKHRoaXMuc2hvd1hjb2RlTG9nICE9PSBmYWxzZSAmJiBvdXQuaW5jbHVkZXMoJ0Vycm9yIERvbWFpbj0nKSAmJiAhaWdub3JlRXJyb3IpIHtcbiAgICAgICAgbG9nWGNvZGVPdXRwdXQgPSB0cnVlO1xuXG4gICAgICAgIC8vIHRlcnJpYmxlIGhhY2sgdG8gaGFuZGxlIGNhc2Ugd2hlcmUgeGNvZGUgcmV0dXJuIDAgYnV0IGlzIGZhaWxpbmdcbiAgICAgICAgeGNvZGVidWlsZC5fd2RhX2Vycm9yX29jY3VycmVkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gZG8gbm90IGxvZyBwZXJtaXNzaW9uIGVycm9ycyBmcm9tIHRyeWluZyB0byB3cml0ZSB0byBhdHRhY2htZW50cyBmb2xkZXJcbiAgICAgIGlmIChsb2dYY29kZU91dHB1dCAmJiAhaWdub3JlRXJyb3IpIHtcbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIG91dC5zcGxpdChFT0wpKSB7XG4gICAgICAgICAgeGNvZGVMb2cuZXJyb3IobGluZSk7XG4gICAgICAgICAgaWYgKGxpbmUpIHtcbiAgICAgICAgICAgIHhjb2RlYnVpbGQuX3dkYV9lcnJvcl9tZXNzYWdlICs9IGAke0VPTH0ke2xpbmV9YDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB4Y29kZWJ1aWxkO1xuICB9XG5cbiAgYXN5bmMgc3RhcnQgKGJ1aWxkT25seSA9IGZhbHNlKSB7XG4gICAgdGhpcy54Y29kZWJ1aWxkID0gYXdhaXQgdGhpcy5jcmVhdGVTdWJQcm9jZXNzKGJ1aWxkT25seSk7XG4gICAgLy8gU3RvcmUgeGNvZGVidWlsZCBtZXNzYWdlXG4gICAgdGhpcy54Y29kZWJ1aWxkLl93ZGFfZXJyb3JfbWVzc2FnZSA9ICcnO1xuXG4gICAgLy8gd3JhcCB0aGUgc3RhcnQgcHJvY2VkdXJlIGluIGEgcHJvbWlzZSBzbyB0aGF0IHdlIGNhbiBjYXRjaCwgYW5kIHJlcG9ydCxcbiAgICAvLyBhbnkgc3RhcnR1cCBlcnJvcnMgdGhhdCBhcmUgdGhyb3duIGFzIGV2ZW50c1xuICAgIHJldHVybiBhd2FpdCBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnhjb2RlYnVpbGQub24oJ2V4aXQnLCBhc3luYyAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgICAgIHhjb2RlTG9nLmVycm9yKGB4Y29kZWJ1aWxkIGV4aXRlZCB3aXRoIGNvZGUgJyR7Y29kZX0nIGFuZCBzaWduYWwgJyR7c2lnbmFsfSdgKTtcbiAgICAgICAgLy8gcHJpbnQgb3V0IHRoZSB4Y29kZWJ1aWxkIGZpbGUgaWYgdXNlcnMgaGF2ZSBhc2tlZCBmb3IgaXRcbiAgICAgICAgaWYgKHRoaXMuc2hvd1hjb2RlTG9nICYmIHRoaXMueGNvZGVidWlsZC5sb2dMb2NhdGlvbikge1xuICAgICAgICAgIHhjb2RlTG9nLmVycm9yKGBDb250ZW50cyBvZiB4Y29kZWJ1aWxkIGxvZyBmaWxlICcke3RoaXMueGNvZGVidWlsZC5sb2dMb2NhdGlvbn0nOmApO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IGZzLnJlYWRGaWxlKHRoaXMueGNvZGVidWlsZC5sb2dMb2NhdGlvbiwgJ3V0ZjgnKTtcbiAgICAgICAgICAgIGZvciAobGV0IGxpbmUgb2YgZGF0YS5zcGxpdCgnXFxuJykpIHtcbiAgICAgICAgICAgICAgeGNvZGVMb2cuZXJyb3IobGluZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB4Y29kZUxvZy5lcnJvcihgVW5hYmxlIHRvIGFjY2VzcyB4Y29kZWJ1aWxkIGxvZyBmaWxlOiAnJHtlcnIubWVzc2FnZX0nYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMueGNvZGVidWlsZC5wcm9jZXNzRXhpdGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMueGNvZGVidWlsZC5fd2RhX2Vycm9yX29jY3VycmVkIHx8ICghc2lnbmFsICYmIGNvZGUgIT09IDApKSB7XG4gICAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoYHhjb2RlYnVpbGQgZmFpbGVkIHdpdGggY29kZSAke2NvZGV9JHtFT0x9YCArXG4gICAgICAgICAgICBgeGNvZGVidWlsZCBlcnJvciBtZXNzYWdlOiR7RU9MfSR7dGhpcy54Y29kZWJ1aWxkLl93ZGFfZXJyb3JfbWVzc2FnZX1gKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaW4gdGhlIGNhc2Ugb2YganVzdCBidWlsZGluZywgdGhlIHByb2Nlc3Mgd2lsbCBleGl0IGFuZCB0aGF0IGlzIG91ciBmaW5pc2hcbiAgICAgICAgaWYgKGJ1aWxkT25seSkge1xuICAgICAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gKGFzeW5jICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB0aW1lciA9IG5ldyB0aW1pbmcuVGltZXIoKS5zdGFydCgpO1xuICAgICAgICAgIGF3YWl0IHRoaXMueGNvZGVidWlsZC5zdGFydCh0cnVlKTtcbiAgICAgICAgICBpZiAoIWJ1aWxkT25seSkge1xuICAgICAgICAgICAgbGV0IHN0YXR1cyA9IGF3YWl0IHRoaXMud2FpdEZvclN0YXJ0KHRpbWVyKTtcbiAgICAgICAgICAgIHJlc29sdmUoc3RhdHVzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGxldCBtc2cgPSBgVW5hYmxlIHRvIHN0YXJ0IFdlYkRyaXZlckFnZW50OiAke2Vycn1gO1xuICAgICAgICAgIHRoaXMubG9nLmVycm9yKG1zZyk7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihtc2cpKTtcbiAgICAgICAgfVxuICAgICAgfSkoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHdhaXRGb3JTdGFydCAodGltZXIpIHtcbiAgICAvLyB0cnkgdG8gY29ubmVjdCBvbmNlIGV2ZXJ5IDAuNSBzZWNvbmRzLCB1bnRpbCBgbGF1bmNoVGltZW91dGAgaXMgdXBcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgV2FpdGluZyB1cCB0byAke3RoaXMubGF1bmNoVGltZW91dH1tcyBmb3IgV2ViRHJpdmVyQWdlbnQgdG8gc3RhcnRgKTtcbiAgICBsZXQgY3VycmVudFN0YXR1cyA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIGxldCByZXRyaWVzID0gcGFyc2VJbnQodGhpcy5sYXVuY2hUaW1lb3V0IC8gNTAwLCAxMCk7XG4gICAgICBhd2FpdCByZXRyeUludGVydmFsKHJldHJpZXMsIDEwMDAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMueGNvZGVidWlsZC5wcm9jZXNzRXhpdGVkKSB7XG4gICAgICAgICAgLy8gdGhlcmUgaGFzIGJlZW4gYW4gZXJyb3IgZWxzZXdoZXJlIGFuZCB3ZSBuZWVkIHRvIHNob3J0LWNpcmN1aXRcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJveHlUaW1lb3V0ID0gdGhpcy5ub1Nlc3Npb25Qcm94eS50aW1lb3V0O1xuICAgICAgICB0aGlzLm5vU2Vzc2lvblByb3h5LnRpbWVvdXQgPSAxMDAwO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGN1cnJlbnRTdGF0dXMgPSBhd2FpdCB0aGlzLm5vU2Vzc2lvblByb3h5LmNvbW1hbmQoJy9zdGF0dXMnLCAnR0VUJyk7XG4gICAgICAgICAgaWYgKGN1cnJlbnRTdGF0dXMgJiYgY3VycmVudFN0YXR1cy5pb3MgJiYgY3VycmVudFN0YXR1cy5pb3MuaXApIHtcbiAgICAgICAgICAgIHRoaXMuYWdlbnRVcmwgPSBjdXJyZW50U3RhdHVzLmlvcy5pcDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5sb2cuZGVidWcoYFdlYkRyaXZlckFnZW50IGluZm9ybWF0aW9uOmApO1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKEpTT04uc3RyaW5naWZ5KGN1cnJlbnRTdGF0dXMsIG51bGwsIDIpKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gY29ubmVjdCB0byBydW5uaW5nIFdlYkRyaXZlckFnZW50OiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRoaXMubm9TZXNzaW9uUHJveHkudGltZW91dCA9IHByb3h5VGltZW91dDtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmICh0aGlzLnhjb2RlYnVpbGQucHJvY2Vzc0V4aXRlZCkge1xuICAgICAgICAvLyB0aGVyZSBoYXMgYmVlbiBhbiBlcnJvciBlbHNld2hlcmUgYW5kIHdlIG5lZWQgdG8gc2hvcnQtY2lyY3VpdFxuICAgICAgICByZXR1cm4gY3VycmVudFN0YXR1cztcbiAgICAgIH1cblxuICAgICAgdGhpcy5sb2cuZGVidWcoYFdlYkRyaXZlckFnZW50IHN1Y2Nlc3NmdWxseSBzdGFydGVkIGFmdGVyICR7dGltZXIuZ2V0RHVyYXRpb24oKS5hc01pbGxpU2Vjb25kcy50b0ZpeGVkKDApfW1zYCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBhdCB0aGlzIHBvaW50LCBpZiB3ZSBoYXZlIG5vdCBoYWQgYW55IGVycm9ycyBmcm9tIHhjb2RlIGl0c2VsZiAocmVwb3J0ZWRcbiAgICAgIC8vIGVsc2V3aGVyZSksIHdlIGNhbiBsZXQgdGhpcyBnbyB0aHJvdWdoIGFuZCB0cnkgdG8gY3JlYXRlIHRoZSBzZXNzaW9uXG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhlcnIubWVzc2FnZSk7XG4gICAgICB0aGlzLmxvZy53YXJuKGBHZXR0aW5nIHN0YXR1cyBvZiBXZWJEcml2ZXJBZ2VudCBvbiBkZXZpY2UgdGltZWQgb3V0LiBDb250aW51aW5nYCk7XG4gICAgfVxuICAgIHJldHVybiBjdXJyZW50U3RhdHVzO1xuICB9XG5cbiAgYXN5bmMgcXVpdCAoKSB7XG4gICAgYXdhaXQga2lsbFByb2Nlc3MoJ3hjb2RlYnVpbGQnLCB0aGlzLnhjb2RlYnVpbGQpO1xuICB9XG59XG5cbmV4cG9ydCB7IFhjb2RlQnVpbGQgfTtcbmV4cG9ydCBkZWZhdWx0IFhjb2RlQnVpbGQ7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUEsSUFBQUEsU0FBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsYUFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsUUFBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsT0FBQSxHQUFBQyxzQkFBQSxDQUFBSixPQUFBO0FBQ0EsSUFBQUssU0FBQSxHQUFBRCxzQkFBQSxDQUFBSixPQUFBO0FBQ0EsSUFBQU0sTUFBQSxHQUFBTixPQUFBO0FBSUEsSUFBQU8sT0FBQSxHQUFBSCxzQkFBQSxDQUFBSixPQUFBO0FBQ0EsSUFBQVEsS0FBQSxHQUFBSixzQkFBQSxDQUFBSixPQUFBO0FBQ0EsSUFBQVMsR0FBQSxHQUFBVCxPQUFBO0FBQ0EsSUFBQVUsVUFBQSxHQUFBVixPQUFBO0FBR0EsTUFBTVcsa0JBQWtCLEdBQUcsa0JBQWtCO0FBQzdDLE1BQU1DLGNBQWMsR0FBRyxDQUFDO0FBQ3hCLE1BQU1DLGlCQUFpQixHQUFHLHNCQUFzQjtBQUNoRCxNQUFNQyxjQUFjLEdBQUcsbUJBQW1CO0FBRTFDLE1BQU1DLHdCQUF3QixHQUFHLHVDQUF1QztBQUN4RSxNQUFNQyx3QkFBd0IsR0FBRyxrQ0FBa0M7QUFDbkUsTUFBTUMsY0FBYyxHQUFHLENBQ3JCRix3QkFBd0IsRUFDeEJDLHdCQUF3QixFQUN4QixxQ0FBcUMsQ0FDdEM7QUFFRCxNQUFNRSxnQkFBZ0IsR0FBRywyQkFBMkI7QUFDcEQsTUFBTUMsYUFBYSxHQUFHLHdCQUF3QjtBQUU5QyxNQUFNQyxRQUFRLEdBQUdDLGVBQU0sQ0FBQ0MsU0FBUyxDQUFDLE9BQU8sQ0FBQztBQUcxQyxNQUFNQyxVQUFVLENBQUM7RUFDZkMsV0FBV0EsQ0FBRUMsWUFBWSxFQUFFQyxNQUFNLEVBQUVDLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRUMsR0FBRyxHQUFHLElBQUksRUFBRTtJQUN4RCxJQUFJLENB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