appium-espresso-driver 2.0.1 → 2.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -171,7 +171,8 @@ class ServerBuilder {
171
171
 
172
172
  const gradlebuild = new _teen_process.SubProcess(cmd, args, {
173
173
  cwd: this.serverPath,
174
- stdio: ['ignore', 'pipe', 'pipe']
174
+ stdio: ['ignore', 'pipe', 'pipe'],
175
+ windowsVerbatimArguments: true
175
176
  });
176
177
  let buildLastLines = [];
177
178
  const logMsg = `Output from Gradle ${this.showGradleLog ? 'will' : 'will not'} be logged`;
@@ -211,4 +212,4 @@ var _default = ServerBuilder;
211
212
  exports.default = _default;require('source-map-support').install();
212
213
 
213
214
 
214
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zZXJ2ZXItYnVpbGRlci5qcyJdLCJuYW1lcyI6WyJHUkFETEVfVkVSU0lPTl9LRVkiLCJHUkFETEVfVVJMX1BSRUZJWCIsIkdSQURMRV9VUkxfVEVNUExBVEUiLCJHUkFETEVfTUFYX0VSUk9SX0xPR19MSU5FUyIsIkRFUEVOREVOQ1lfUFJPUF9OQU1FUyIsIlZFUlNJT05fS0VZUyIsImdyYWRsZUxvZyIsImxvZ2dlciIsImdldExvZ2dlciIsImJ1aWxkU2VydmVyU2lnbmluZ0NvbmZpZyIsImFyZ3MiLCJ6aXBBbGlnbiIsImtleXN0b3JlRmlsZSIsImtleXN0b3JlUGFzc3dvcmQiLCJrZXlBbGlhcyIsImtleVBhc3N3b3JkIiwiU2VydmVyQnVpbGRlciIsImNvbnN0cnVjdG9yIiwic2VydmVyUGF0aCIsInNob3dHcmFkbGVMb2ciLCJidWlsZENvbmZpZ3VyYXRpb24iLCJ2ZXJzaW9uQ29uZmlndXJhdGlvbiIsInRvb2xzVmVyc2lvbnMiLCJzZXJ2ZXJWZXJzaW9ucyIsIl8iLCJyZWR1Y2UiLCJhY2MiLCJ2YWx1ZSIsImtleSIsImluY2x1ZGVzIiwibG9nIiwid2FybiIsInRlc3RBcHBQYWNrYWdlIiwic2lnbmluZ0NvbmZpZyIsInByb3BOYW1lIiwiYnVpbGQiLCJzZXRHcmFkbGVXcmFwcGVyVmVyc2lvbiIsImluc2VydEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMiLCJydW5CdWlsZFByb2Nlc3MiLCJnZXRDb21tYW5kIiwiY21kIiwic3lzdGVtIiwiaXNXaW5kb3dzIiwiYnVpbGRQcm9wZXJ0eSIsImZpbHRlciIsIm1hcCIsInNlcnZlclZlcnNpb24iLCJncmFkbGVQcm9wZXJ0eSIsImNoYXJBdCIsInRvVXBwZXJDYXNlIiwic2xpY2UiLCJCb29sZWFuIiwicHVzaCIsImtleXMiLCJ1cHBlckZpcnN0IiwiayIsInYiLCJ2ZXJzaW9uIiwicHJvcGVydGllc1BhdGgiLCJwYXRoIiwicmVzb2x2ZSIsIm9yaWdpbmFsUHJvcGVydGllcyIsImZzIiwicmVhZEZpbGUiLCJuZXdQcm9wZXJ0aWVzIiwidXBkYXRlR3JhZGxlRGlzdFVybCIsIndyaXRlRmlsZSIsInByb3BlcnRpZXNDb250ZW50IiwicmVwbGFjZSIsIlJlZ0V4cCIsImVzY2FwZVJlZ0V4cCIsImhhc0FkZGl0aW9uYWxEZXBzIiwiaXNBcnJheSIsIkVycm9yIiwiaXNFbXB0eSIsImxpbmUiLCJ0cmltIiwiZGVwIiwidGVzdCIsImJ1aWxkUGF0aCIsImNvbmZpZ3VyYXRpb24iLCJwcmVmaXgiLCJkZXBzIiwiaW5mbyIsImRlYnVnIiwiam9pbiIsImdyYWRsZWJ1aWxkIiwiU3ViUHJvY2VzcyIsImN3ZCIsInN0ZGlvIiwiYnVpbGRMYXN0TGluZXMiLCJsb2dNc2ciLCJvbiIsInN0YXJ0c1dpdGgiLCJFT0wiLCJsZW5ndGgiLCJzdGFydCIsImVyciIsIm1zZyIsIm1lc3NhZ2UiLCJlcnJvckFuZFRocm93Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsa0JBQWtCLEdBQUcsUUFBM0I7QUFDQSxNQUFNQyxpQkFBaUIsR0FBRyxrQkFBMUI7QUFDQSxNQUFNQyxtQkFBbUIsR0FBRyxvRUFBNUI7O0FBQ0EsTUFBTUMsMEJBQTBCLEdBQUcsRUFBbkM7QUFDQSxNQUFNQyxxQkFBcUIsR0FBRyxDQUFDLDJCQUFELEVBQThCLG1DQUE5QixDQUE5QjtBQUVBLE1BQU1DLFlBQVksR0FBRyxDQUNuQkwsa0JBRG1CLEVBRW5CLHFCQUZtQixFQUduQixZQUhtQixFQUluQixZQUptQixFQUtuQixRQUxtQixFQU1uQixXQU5tQixFQU9uQixRQVBtQixFQVFuQixxQkFSbUIsRUFTbkIscUJBVG1CLEVBVW5CLFdBVm1CLENBQXJCOzs7QUFhQSxNQUFNTSxTQUFTLEdBQUdDLGdCQUFPQyxTQUFQLENBQWlCLFFBQWpCLENBQWxCOztBQUVBLFNBQVNDLHdCQUFULENBQW1DQyxJQUFuQyxFQUF5QztBQUN2QyxTQUFPO0FBQ0xDLElB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cyc7XG5pbXBvcnQgeyBmcywgbG9nZ2VyLCBzeXN0ZW0gfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBsb2cgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBFT0wgfSBmcm9tICdvcyc7XG5pbXBvcnQgeyB1cGRhdGVEZXBlbmRlbmN5TGluZXMgfSBmcm9tICcuL3V0aWxzJztcblxuY29uc3QgR1JBRExFX1ZFUlNJT05fS0VZID0gJ2dyYWRsZSc7XG5jb25zdCBHUkFETEVfVVJMX1BSRUZJWCA9ICdkaXN0cmlidXRpb25Vcmw9JztcbmNvbnN0IEdSQURMRV9VUkxfVEVNUExBVEUgPSAnaHR0cHNcXFxcOi8vc2VydmljZXMuZ3JhZGxlLm9yZy9kaXN0cmlidXRpb25zL2dyYWRsZS1WRVJTSU9OLWFsbC56aXAnO1xuY29uc3QgR1JBRExFX01BWF9FUlJPUl9MT0dfTElORVMgPSAxNTtcbmNvbnN0IERFUEVOREVOQ1lfUFJPUF9OQU1FUyA9IFsnYWRkaXRpb25hbEFwcERlcGVuZGVuY2llcycsICdhZGRpdGlvbmFsQW5kcm9pZFRlc3REZXBlbmRlbmNpZXMnXTtcblxuY29uc3QgVkVSU0lPTl9LRVlTID0gW1xuICBHUkFETEVfVkVSU0lPTl9LRVksXG4gICdhbmRyb2lkR3JhZGxlUGx1Z2luJyxcbiAgJ2NvbXBpbGVTZGsnLFxuICAnYnVpbGRUb29scycsXG4gICdtaW5TZGsnLFxuICAndGFyZ2V0U2RrJyxcbiAgJ2tvdGxpbicsXG4gICdzb3VyY2VDb21wYXRpYmlsaXR5JyxcbiAgJ3RhcmdldENvbXBhdGliaWxpdHknLFxuICAnanZtVGFyZ2V0Jyxcbl07XG5cbmNvbnN0IGdyYWRsZUxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ0dyYWRsZScpO1xuXG5mdW5jdGlvbiBidWlsZFNlcnZlclNpZ25pbmdDb25maWcgKGFyZ3MpIHtcbiAgcmV0dXJuIHtcbiAgICB6aXBBbGlnbjogdHJ1ZSxcbiAgICBrZXlzdG9yZUZpbGU6IGFyZ3Mua2V5c3RvcmVGaWxlLFxuICAgIGtleXN0b3JlUGFzc3dvcmQ6IGFyZ3Mua2V5c3RvcmVQYXNzd29yZCxcbiAgICBrZXlBbGlhczogYXJncy5rZXlBbGlhcyxcbiAgICBrZXlQYXNzd29yZDogYXJncy5rZXlQYXNzd29yZFxuICB9O1xufVxuXG5jbGFzcyBTZXJ2ZXJCdWlsZGVyIHtcbiAgY29uc3RydWN0b3IgKGFyZ3MgPSB7fSkge1xuICAgIHRoaXMuc2VydmVyUGF0aCA9IGFyZ3Muc2VydmVyUGF0aDtcbiAgICB0aGlzLnNob3dHcmFkbGVMb2cgPSBhcmdzLnNob3dHcmFkbGVMb2c7XG5cbiAgICBjb25zdCBidWlsZENvbmZpZ3VyYXRpb24gPSBhcmdzLmJ1aWxkQ29uZmlndXJhdGlvbiB8fCB7fTtcblxuICAgIGNvbnN0IHZlcnNpb25Db25maWd1cmF0aW9uID0gYnVpbGRDb25maWd1cmF0aW9uLnRvb2xzVmVyc2lvbnMgfHwge307XG4gICAgdGhpcy5zZXJ2ZXJWZXJzaW9ucyA9IF8ucmVkdWNlKHZlcnNpb25Db25maWd1cmF0aW9uLCAoYWNjLCB2YWx1ZSwga2V5KSA9PiB7XG4gICAgICBpZiAoVkVSU0lPTl9LRVlTLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgYWNjW2tleV0gPSB2YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZy53YXJuKGBHb3QgdW5leHBlY3RlZCAnJHtrZXl9JyBpbiB0b29sc1ZlcnNpb24gYmxvY2sgb2YgdGhlIGJ1aWxkIGNvbmZpZ3VyYXRpb25gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30pO1xuXG4gICAgdGhpcy50ZXN0QXBwUGFja2FnZSA9IGFyZ3MudGVzdEFwcFBhY2thZ2U7XG4gICAgdGhpcy5zaWduaW5nQ29uZmlnID0gYXJncy5zaWduaW5nQ29uZmlnO1xuXG4gICAgZm9yIChjb25zdCBwcm9wTmFtZSBvZiBERVBFTkRFTkNZX1BST1BfTkFNRVMpIHtcbiAgICAgIHRoaXNbcHJvcE5hbWVdID0gYnVpbGRDb25maWd1cmF0aW9uW3Byb3BOYW1lXSB8fCBbXTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBidWlsZCAoKSB7XG4gICAgaWYgKHRoaXMuc2VydmVyVmVyc2lvbnNbR1JBRExFX1ZFUlNJT05fS0VZXSkge1xuICAgICAgYXdhaXQgdGhpcy5zZXRHcmFkbGVXcmFwcGVyVmVyc2lvbih0aGlzLnNlcnZlclZlcnNpb25zW0dSQURMRV9WRVJTSU9OX0tFWV0pO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuaW5zZXJ0QWRkaXRpb25hbERlcGVuZGVuY2llcygpO1xuXG4gICAgYXdhaXQgdGhpcy5ydW5CdWlsZFByb2Nlc3MoKTtcbiAgfVxuXG4gIGdldENvbW1hbmQgKCkge1xuICAgIGNvbnN0IGNtZCA9IHN5c3RlbS5pc1dpbmRvd3MoKSA/ICdncmFkbGV3LmJhdCcgOiAnLi9ncmFkbGV3JztcbiAgICBjb25zdCBidWlsZFByb3BlcnR5ID0gKGtleSwgdmFsdWUpID0+IHZhbHVlID8gYC1QJHtrZXl9PSR7dmFsdWV9YCA6IG51bGw7XG4gICAgbGV0IGFyZ3MgPSBWRVJTSU9OX0tFWVNcbiAgICAgIC5maWx0ZXIoKGtleSkgPT4ga2V5ICE9PSBHUkFETEVfVkVSU0lPTl9LRVkpXG4gICAgICAubWFwKChrZXkpID0+IHtcbiAgICAgICAgY29uc3Qgc2VydmVyVmVyc2lvbiA9IHRoaXMuc2VydmVyVmVyc2lvbnNba2V5XTtcbiAgICAgICAgY29uc3QgZ3JhZGxlUHJvcGVydHkgPSBgYXBwaXVtJHtrZXkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCl9JHtrZXkuc2xpY2UoMSl9YDtcbiAgICAgICAgcmV0dXJuIGJ1aWxkUHJvcGVydHkoZ3JhZGxlUHJvcGVydHksIHNlcnZlclZlcnNpb24pO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG5cbiAgICBpZiAodGhpcy5zaWduaW5nQ29uZmlnKSB7XG4gICAgICBhcmdzLnB1c2goLi4uKFxuICAgICAgICBfLmtleXModGhpcy5zaWduaW5nQ29uZmlnKVxuICAgICAgICAubWFwKChrZXkpID0+IFtgYXBwaXVtJHtfLnVwcGVyRmlyc3Qoa2V5KX1gLCB0aGlzLnNpZ25pbmdDb25maWdba2V5XV0pXG4gICAgICAgIC5tYXAoKFtrLCB2XSkgPT4gYnVpbGRQcm9wZXJ0eShrLCB2KSlcbiAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgKSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudGVzdEFwcFBhY2thZ2UpIHtcbiAgICAgIGFyZ3MucHVzaChidWlsZFByb3BlcnR5KCdhcHBpdW1UYXJnZXRQYWNrYWdlJywgdGhpcy50ZXN0QXBwUGFja2FnZSkpO1xuICAgIH1cbiAgICBhcmdzLnB1c2goJ2FwcDphc3NlbWJsZUFuZHJvaWRUZXN0Jyk7XG5cbiAgICByZXR1cm4ge2NtZCwgYXJnc307XG4gIH1cblxuICBhc3luYyBzZXRHcmFkbGVXcmFwcGVyVmVyc2lvbiAodmVyc2lvbikge1xuICAgIGNvbnN0IHByb3BlcnRpZXNQYXRoID0gcGF0aC5yZXNvbHZlKHRoaXMuc2VydmVyUGF0aCwgJ2dyYWRsZScsICd3cmFwcGVyJywgJ2dyYWRsZS13cmFwcGVyLnByb3BlcnRpZXMnKTtcbiAgICBjb25zdCBvcmlnaW5hbFByb3BlcnRpZXMgPSBhd2FpdCBmcy5yZWFkRmlsZShwcm9wZXJ0aWVzUGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBuZXdQcm9wZXJ0aWVzID0gdGhpcy51cGRhdGVHcmFkbGVEaXN0VXJsKG9yaWdpbmFsUHJvcGVydGllcywgdmVyc2lvbik7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKHByb3BlcnRpZXNQYXRoLCBuZXdQcm9wZXJ0aWVzLCAndXRmOCcpO1xuICB9XG5cbiAgdXBkYXRlR3JhZGxlRGlzdFVybCAocHJvcGVydGllc0NvbnRlbnQsIHZlcnNpb24pIHtcbiAgICByZXR1cm4gcHJvcGVydGllc0NvbnRlbnQucmVwbGFjZShcbiAgICAgIG5ldyBSZWdFeHAoYF4oJHtfLmVzY2FwZVJlZ0V4cChHUkFETEVfVVJMX1BSRUZJWCl9KS4rJGAsICdnbScpLFxuICAgICAgYCQxJHtHUkFETEVfVVJMX1RFTVBMQVRFLnJlcGxhY2UoJ1ZFUlNJT04nLCB2ZXJzaW9uKX1gXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGluc2VydEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMgKCkge1xuICAgIGxldCBoYXNBZGRpdGlvbmFsRGVwcyA9IGZhbHNlO1xuICAgIGZvciAoY29uc3QgcHJvcE5hbWUgb2YgREVQRU5ERU5DWV9QUk9QX05BTUVTKSB7XG4gICAgICBpZiAoIV8uaXNBcnJheSh0aGlzW3Byb3BOYW1lXSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHtwcm9wTmFtZX0nIG11c3QgYmUgYW4gYXJyYXlgKTtcbiAgICAgIH1cbiAgICAgIGlmIChfLmlzRW1wdHkodGhpc1twcm9wTmFtZV0uZmlsdGVyKChsaW5lKSA9PiBfLnRyaW0obGluZSkpKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBkZXAgb2YgdGhpc1twcm9wTmFtZV0pIHtcbiAgICAgICAgaWYgKC9bXFxzJ1xcXFwkXS8udGVzdChkZXApKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaW5nbGUgcXVvdGVzLCBkb2xsYXIgY2hhcmFjdGVycyBhbmQgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzJyArXG4gICAgICAgICAgICBgIGFyZSBkaXNhbGxvd2VkIGluIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzOiAke2RlcH1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaGFzQWRkaXRpb25hbERlcHMgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoIWhhc0FkZGl0aW9uYWxEZXBzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYnVpbGRQYXRoID0gcGF0aC5yZXNvbHZlKHRoaXMuc2VydmVyUGF0aCwgJ2FwcCcsICdidWlsZC5ncmFkbGUua3RzJyk7XG4gICAgbGV0IGNvbmZpZ3VyYXRpb24gPSBhd2FpdCBmcy5yZWFkRmlsZShidWlsZFBhdGgsICd1dGY4Jyk7XG4gICAgZm9yIChjb25zdCBwcm9wTmFtZSBvZiBERVBFTkRFTkNZX1BST1BfTkFNRVMpIHtcbiAgICAgIGNvbnN0IHByZWZpeCA9IHByb3BOYW1lID09PSBERVBFTkRFTkNZX1BST1BfTkFNRVNbMF1cbiAgICAgICAgPyAnaW1wbGVtZW50YXRpb24nXG4gICAgICAgIDogJ2FuZHJvaWRUZXN0SW1wbGVtZW50YXRpb24nO1xuICAgICAgY29uc3QgZGVwcyA9IHRoaXNbcHJvcE5hbWVdXG4gICAgICAgIC5maWx0ZXIoKGxpbmUpID0+IF8udHJpbShsaW5lKSlcbiAgICAgICAgLm1hcCgobGluZSkgPT4gYCR7cHJlZml4fShcIiR7bGluZX1cIilgKTtcbiAgICAgIGlmIChfLmlzRW1wdHkoZGVwcykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGxvZy5pbmZvKGBBZGRpbmcgdGhlIGZvbGxvd2luZyAke3Byb3BOYW1lfSB0byBidWlsZC5ncmFkbGUua3RzOiAke2RlcHN9YCk7XG4gICAgICBjb25maWd1cmF0aW9uID0gdXBkYXRlRGVwZW5kZW5jeUxpbmVzKGNvbmZpZ3VyYXRpb24sIHByb3BOYW1lLCBkZXBzKTtcbiAgICB9XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKGJ1aWxkUGF0aCwgY29uZmlndXJhdGlvbiwgJ3V0ZjgnKTtcbiAgfVxuXG4gIGFzeW5jIHJ1bkJ1aWxkUHJvY2VzcyAoKSB7XG4gICAgY29uc3Qge2NtZCwgYXJnc30gPSB0aGlzLmdldENvbW1hbmQoKTtcbiAgICBsb2cuZGVidWcoYEJlZ2lubmluZyBidWlsZCB3aXRoIGNvbW1hbmQgJyR7Y21kfSAke2FyZ3Muam9pbignICcpfScgYCArXG4gICAgICBgaW4gZGlyZWN0b3J5ICcke3RoaXMuc2VydmVyUGF0aH0nYCk7XG4gICAgY29uc3QgZ3JhZGxlYnVpbGQgPSBuZXcgU3ViUHJvY2VzcyhjbWQsIGFyZ3MsIHtcbiAgICAgIGN3ZDogdGhpcy5zZXJ2ZXJQYXRoLFxuICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAncGlwZSddLFxuICAgIH0pO1xuICAgIGxldCBidWlsZExhc3RMaW5lcyA9IFtdO1xuXG4gICAgY29uc3QgbG9nTXNnID0gYE91dHB1dCBmcm9tIEdyYWRsZSAke3RoaXMuc2hvd0dyYWRsZUxvZyA/ICd3aWxsJyA6ICd3aWxsIG5vdCd9IGJlIGxvZ2dlZGA7XG4gICAgbG9nLmRlYnVnKGAke2xvZ01zZ30uIFRvIGNoYW5nZSB0aGlzLCB1c2UgJ3Nob3dHcmFkbGVMb2cnIGRlc2lyZWQgY2FwYWJpbGl0eWApO1xuICAgIGdyYWRsZWJ1aWxkLm9uKCdzdHJlYW0tbGluZScsIChsaW5lKSA9PiB7XG4gICAgICBpZiAodGhpcy5zaG93R3JhZGxlTG9nKSB7XG4gICAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoJ1tTVERFUlJdJykpIHtcbiAgICAgICAgICBncmFkbGVMb2cud2FybihsaW5lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBncmFkbGVMb2cuaW5mbyhsaW5lKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYnVpbGRMYXN0TGluZXMucHVzaChgJHtFT0x9JHtsaW5lfWApO1xuICAgICAgaWYgKGJ1aWxkTGFzdExpbmVzLmxlbmd0aCA+IEdSQURMRV9NQVhfRVJST1JfTE9HX0xJTkVTKSB7XG4gICAgICAgIGJ1aWxkTGFzdExpbmVzID0gYnVpbGRMYXN0TGluZXMuc2xpY2UoLUdSQURMRV9NQVhfRVJST1JfTE9HX0xJTkVTKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBncmFkbGVidWlsZC5zdGFydCgpO1xuICAgICAgYXdhaXQgZ3JhZGxlYnVpbGQuam9pbigpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbGV0IG1zZyA9IGBVbmFibGUgdG8gYnVpbGQgRXNwcmVzc28gc2VydmVyIC0gJHtlcnIubWVzc2FnZX1cXG5gICtcbiAgICAgICAgYEdyYWRsZSBlcnJvciBtZXNzYWdlOiR7RU9MfSR7YnVpbGRMYXN0TGluZXN9YDtcbiAgICAgIGxvZy5lcnJvckFuZFRocm93KG1zZyk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB7IFNlcnZlckJ1aWxkZXIsIFZFUlNJT05fS0VZUywgR1JBRExFX1VSTF9URU1QTEFURSwgYnVpbGRTZXJ2ZXJTaWduaW5nQ29uZmlnIH07XG5leHBvcnQgZGVmYXVsdCBTZXJ2ZXJCdWlsZGVyO1xuIl0sImZpbGUiOiJsaWIvc2VydmVyLWJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
215
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zZXJ2ZXItYnVpbGRlci5qcyJdLCJuYW1lcyI6WyJHUkFETEVfVkVSU0lPTl9LRVkiLCJHUkFETEVfVVJMX1BSRUZJWCIsIkdSQURMRV9VUkxfVEVNUExBVEUiLCJHUkFETEVfTUFYX0VSUk9SX0xPR19MSU5FUyIsIkRFUEVOREVOQ1lfUFJPUF9OQU1FUyIsIlZFUlNJT05fS0VZUyIsImdyYWRsZUxvZyIsImxvZ2dlciIsImdldExvZ2dlciIsImJ1aWxkU2VydmVyU2lnbmluZ0NvbmZpZyIsImFyZ3MiLCJ6aXBBbGlnbiIsImtleXN0b3JlRmlsZSIsImtleXN0b3JlUGFzc3dvcmQiLCJrZXlBbGlhcyIsImtleVBhc3N3b3JkIiwiU2VydmVyQnVpbGRlciIsImNvbnN0cnVjdG9yIiwic2VydmVyUGF0aCIsInNob3dHcmFkbGVMb2ciLCJidWlsZENvbmZpZ3VyYXRpb24iLCJ2ZXJzaW9uQ29uZmlndXJhdGlvbiIsInRvb2xzVmVyc2lvbnMiLCJzZXJ2ZXJWZXJzaW9ucyIsIl8iLCJyZWR1Y2UiLCJhY2MiLCJ2YWx1ZSIsImtleSIsImluY2x1ZGVzIiwibG9nIiwid2FybiIsInRlc3RBcHBQYWNrYWdlIiwic2lnbmluZ0NvbmZpZyIsInByb3BOYW1lIiwiYnVpbGQiLCJzZXRHcmFkbGVXcmFwcGVyVmVyc2lvbiIsImluc2VydEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMiLCJydW5CdWlsZFByb2Nlc3MiLCJnZXRDb21tYW5kIiwiY21kIiwic3lzdGVtIiwiaXNXaW5kb3dzIiwiYnVpbGRQcm9wZXJ0eSIsImZpbHRlciIsIm1hcCIsInNlcnZlclZlcnNpb24iLCJncmFkbGVQcm9wZXJ0eSIsImNoYXJBdCIsInRvVXBwZXJDYXNlIiwic2xpY2UiLCJCb29sZWFuIiwicHVzaCIsImtleXMiLCJ1cHBlckZpcnN0IiwiayIsInYiLCJ2ZXJzaW9uIiwicHJvcGVydGllc1BhdGgiLCJwYXRoIiwicmVzb2x2ZSIsIm9yaWdpbmFsUHJvcGVydGllcyIsImZzIiwicmVhZEZpbGUiLCJuZXdQcm9wZXJ0aWVzIiwidXBkYXRlR3JhZGxlRGlzdFVybCIsIndyaXRlRmlsZSIsInByb3BlcnRpZXNDb250ZW50IiwicmVwbGFjZSIsIlJlZ0V4cCIsImVzY2FwZVJlZ0V4cCIsImhhc0FkZGl0aW9uYWxEZXBzIiwiaXNBcnJheSIsIkVycm9yIiwiaXNFbXB0eSIsImxpbmUiLCJ0cmltIiwiZGVwIiwidGVzdCIsImJ1aWxkUGF0aCIsImNvbmZpZ3VyYXRpb24iLCJwcmVmaXgiLCJkZXBzIiwiaW5mbyIsImRlYnVnIiwiam9pbiIsImdyYWRsZWJ1aWxkIiwiU3ViUHJvY2VzcyIsImN3ZCIsInN0ZGlvIiwid2luZG93c1ZlcmJhdGltQXJndW1lbnRzIiwiYnVpbGRMYXN0TGluZXMiLCJsb2dNc2ciLCJvbiIsInN0YXJ0c1dpdGgiLCJFT0wiLCJsZW5ndGgiLCJzdGFydCIsImVyciIsIm1zZyIsIm1lc3NhZ2UiLCJlcnJvckFuZFRocm93Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsa0JBQWtCLEdBQUcsUUFBM0I7QUFDQSxNQUFNQyxpQkFBaUIsR0FBRyxrQkFBMUI7QUFDQSxNQUFNQyxtQkFBbUIsR0FBRyxvRUFBNUI7O0FBQ0EsTUFBTUMsMEJBQTBCLEdBQUcsRUFBbkM7QUFDQSxNQUFNQyxxQkFBcUIsR0FBRyxDQUFDLDJCQUFELEVBQThCLG1DQUE5QixDQUE5QjtBQUVBLE1BQU1DLFlBQVksR0FBRyxDQUNuQkwsa0JBRG1CLEVBRW5CLHFCQUZtQixFQUduQixZQUhtQixFQUluQixZQUptQixFQUtuQixRQUxtQixFQU1uQixXQU5tQixFQU9uQixRQVBtQixFQVFuQixxQkFSbUIsRUFTbkIscUJBVG1CLEVBVW5CLFdBVm1CLENBQXJCOzs7QUFhQSxNQUFNTSxTQUFTLEdBQUdDLGdCQUFPQyxTQUFQLENBQWlCLFFBQWpCLENBQWxCOztBQUVBLFNBQVNDLHdCQUFULENBQW1DQyxJQUFu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Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ViUHJvY2VzcyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5pbXBvcnQgeyBmcywgbG9nZ2VyLCBzeXN0ZW0gfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBsb2cgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBFT0wgfSBmcm9tICdvcyc7XG5pbXBvcnQgeyB1cGRhdGVEZXBlbmRlbmN5TGluZXMgfSBmcm9tICcuL3V0aWxzJztcblxuY29uc3QgR1JBRExFX1ZFUlNJT05fS0VZID0gJ2dyYWRsZSc7XG5jb25zdCBHUkFETEVfVVJMX1BSRUZJWCA9ICdkaXN0cmlidXRpb25Vcmw9JztcbmNvbnN0IEdSQURMRV9VUkxfVEVNUExBVEUgPSAnaHR0cHNcXFxcOi8vc2VydmljZXMuZ3JhZGxlLm9yZy9kaXN0cmlidXRpb25zL2dyYWRsZS1WRVJTSU9OLWFsbC56aXAnO1xuY29uc3QgR1JBRExFX01BWF9FUlJPUl9MT0dfTElORVMgPSAxNTtcbmNvbnN0IERFUEVOREVOQ1lfUFJPUF9OQU1FUyA9IFsnYWRkaXRpb25hbEFwcERlcGVuZGVuY2llcycsICdhZGRpdGlvbmFsQW5kcm9pZFRlc3REZXBlbmRlbmNpZXMnXTtcblxuY29uc3QgVkVSU0lPTl9LRVlTID0gW1xuICBHUkFETEVfVkVSU0lPTl9LRVksXG4gICdhbmRyb2lkR3JhZGxlUGx1Z2luJyxcbiAgJ2NvbXBpbGVTZGsnLFxuICAnYnVpbGRUb29scycsXG4gICdtaW5TZGsnLFxuICAndGFyZ2V0U2RrJyxcbiAgJ2tvdGxpbicsXG4gICdzb3VyY2VDb21wYXRpYmlsaXR5JyxcbiAgJ3RhcmdldENvbXBhdGliaWxpdHknLFxuICAnanZtVGFyZ2V0J1xuXTtcblxuY29uc3QgZ3JhZGxlTG9nID0gbG9nZ2VyLmdldExvZ2dlcignR3JhZGxlJyk7XG5cbmZ1bmN0aW9uIGJ1aWxkU2VydmVyU2lnbmluZ0NvbmZpZyAoYXJncykge1xuICByZXR1cm4ge1xuICAgIHppcEFsaWduOiB0cnVlLFxuICAgIGtleXN0b3JlRmlsZTogYXJncy5rZXlzdG9yZUZpbGUsXG4gICAga2V5c3RvcmVQYXNzd29yZDogYXJncy5rZXlzdG9yZVBhc3N3b3JkLFxuICAgIGtleUFsaWFzOiBhcmdzLmtleUFsaWFzLFxuICAgIGtleVBhc3N3b3JkOiBhcmdzLmtleVBhc3N3b3JkXG4gIH07XG59XG5cbmNsYXNzIFNlcnZlckJ1aWxkZXIge1xuICBjb25zdHJ1Y3RvciAoYXJncyA9IHt9KSB7XG4gICAgdGhpcy5zZXJ2ZXJQYXRoID0gYXJncy5zZXJ2ZXJQYXRoO1xuICAgIHRoaXMuc2hvd0dyYWRsZUxvZyA9IGFyZ3Muc2hvd0dyYWRsZUxvZztcblxuICAgIGNvbnN0IGJ1aWxkQ29uZmlndXJhdGlvbiA9IGFyZ3MuYnVpbGRDb25maWd1cmF0aW9uIHx8IHt9O1xuXG4gICAgY29uc3QgdmVyc2lvbkNvbmZpZ3VyYXRpb24gPSBidWlsZENvbmZpZ3VyYXRpb24udG9vbHNWZXJzaW9ucyB8fCB7fTtcbiAgICB0aGlzLnNlcnZlclZlcnNpb25zID0gXy5yZWR1Y2UodmVyc2lvbkNvbmZpZ3VyYXRpb24sIChhY2MsIHZhbHVlLCBrZXkpID0+IHtcbiAgICAgIGlmIChWRVJTSU9OX0tFWVMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICBhY2Nba2V5XSA9IHZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nLndhcm4oYEdvdCB1bmV4cGVjdGVkICcke2tleX0nIGluIHRvb2xzVmVyc2lvbiBibG9jayBvZiB0aGUgYnVpbGQgY29uZmlndXJhdGlvbmApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSk7XG5cbiAgICB0aGlzLnRlc3RBcHBQYWNrYWdlID0gYXJncy50ZXN0QXBwUGFja2FnZTtcbiAgICB0aGlzLnNpZ25pbmdDb25maWcgPSBhcmdzLnNpZ25pbmdDb25maWc7XG5cbiAgICBmb3IgKGNvbnN0IHByb3BOYW1lIG9mIERFUEVOREVOQ1lfUFJPUF9OQU1FUykge1xuICAgICAgdGhpc1twcm9wTmFtZV0gPSBidWlsZENvbmZpZ3VyYXRpb25bcHJvcE5hbWVdIHx8IFtdO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGJ1aWxkICgpIHtcbiAgICBpZiAodGhpcy5zZXJ2ZXJWZXJzaW9uc1tHUkFETEVfVkVSU0lPTl9LRVldKSB7XG4gICAgICBhd2FpdCB0aGlzLnNldEdyYWRsZVdyYXBwZXJWZXJzaW9uKHRoaXMuc2VydmVyVmVyc2lvbnNbR1JBRExFX1ZFUlNJT05fS0VZXSk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5pbnNlcnRBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKCk7XG5cbiAgICBhd2FpdCB0aGlzLnJ1bkJ1aWxkUHJvY2VzcygpO1xuICB9XG5cbiAgZ2V0Q29tbWFuZCAoKSB7XG4gICAgY29uc3QgY21kID0gc3lzdGVtLmlzV2luZG93cygpID8gJ2dyYWRsZXcuYmF0JyA6ICcuL2dyYWRsZXcnO1xuICAgIGNvbnN0IGJ1aWxkUHJvcGVydHkgPSAoa2V5LCB2YWx1ZSkgPT4gdmFsdWUgPyBgLVAke2tleX09JHt2YWx1ZX1gIDogbnVsbDtcbiAgICBsZXQgYXJncyA9IFZFUlNJT05fS0VZU1xuICAgICAgLmZpbHRlcigoa2V5KSA9PiBrZXkgIT09IEdSQURMRV9WRVJTSU9OX0tFWSlcbiAgICAgIC5tYXAoKGtleSkgPT4ge1xuICAgICAgICBjb25zdCBzZXJ2ZXJWZXJzaW9uID0gdGhpcy5zZXJ2ZXJWZXJzaW9uc1trZXldO1xuICAgICAgICBjb25zdCBncmFkbGVQcm9wZXJ0eSA9IGBhcHBpdW0ke2tleS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKX0ke2tleS5zbGljZSgxKX1gO1xuICAgICAgICByZXR1cm4gYnVpbGRQcm9wZXJ0eShncmFkbGVQcm9wZXJ0eSwgc2VydmVyVmVyc2lvbik7XG4gICAgICB9KVxuICAgICAgLmZpbHRlcihCb29sZWFuKTtcblxuICAgIGlmICh0aGlzLnNpZ25pbmdDb25maWcpIHtcbiAgICAgIGFyZ3MucHVzaCguLi4oXG4gICAgICAgIF8ua2V5cyh0aGlzLnNpZ25pbmdDb25maWcpXG4gICAgICAgIC5tYXAoKGtleSkgPT4gW2BhcHBpdW0ke18udXBwZXJGaXJzdChrZXkpfWAsIHRoaXMuc2lnbmluZ0NvbmZpZ1trZXldXSlcbiAgICAgICAgLm1hcCgoW2ssIHZdKSA9PiBidWlsZFByb3BlcnR5KGssIHYpKVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICApKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50ZXN0QXBwUGFja2FnZSkge1xuICAgICAgYXJncy5wdXNoKGJ1aWxkUHJvcGVydHkoJ2FwcGl1bVRhcmdldFBhY2thZ2UnLCB0aGlzLnRlc3RBcHBQYWNrYWdlKSk7XG4gICAgfVxuICAgIGFyZ3MucHVzaCgnYXBwOmFzc2VtYmxlQW5kcm9pZFRlc3QnKTtcblxuICAgIHJldHVybiB7Y21kLCBhcmdzfTtcbiAgfVxuXG4gIGFzeW5jIHNldEdyYWRsZVdyYXBwZXJWZXJzaW9uICh2ZXJzaW9uKSB7XG4gICAgY29uc3QgcHJvcGVydGllc1BhdGggPSBwYXRoLnJlc29sdmUodGhpcy5zZXJ2ZXJQYXRoLCAnZ3JhZGxlJywgJ3dyYXBwZXInLCAnZ3JhZGxlLXdyYXBwZXIucHJvcGVydGllcycpO1xuICAgIGNvbnN0IG9yaWdpbmFsUHJvcGVydGllcyA9IGF3YWl0IGZzLnJlYWRGaWxlKHByb3BlcnRpZXNQYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IG5ld1Byb3BlcnRpZXMgPSB0aGlzLnVwZGF0ZUdyYWRsZURpc3RVcmwob3JpZ2luYWxQcm9wZXJ0aWVzLCB2ZXJzaW9uKTtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUocHJvcGVydGllc1BhdGgsIG5ld1Byb3BlcnRpZXMsICd1dGY4Jyk7XG4gIH1cblxuICB1cGRhdGVHcmFkbGVEaXN0VXJsIChwcm9wZXJ0aWVzQ29udGVudCwgdmVyc2lvbikge1xuICAgIHJldHVybiBwcm9wZXJ0aWVzQ29udGVudC5yZXBsYWNlKFxuICAgICAgbmV3IFJlZ0V4cChgXigke18uZXNjYXBlUmVnRXhwKEdSQURMRV9VUkxfUFJFRklYKX0pLiskYCwgJ2dtJyksXG4gICAgICBgJDEke0dSQURMRV9VUkxfVEVNUExBVEUucmVwbGFjZSgnVkVSU0lPTicsIHZlcnNpb24pfWBcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgaW5zZXJ0QWRkaXRpb25hbERlcGVuZGVuY2llcyAoKSB7XG4gICAgbGV0IGhhc0FkZGl0aW9uYWxEZXBzID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBwcm9wTmFtZSBvZiBERVBFTkRFTkNZX1BST1BfTkFNRVMpIHtcbiAgICAgIGlmICghXy5pc0FycmF5KHRoaXNbcHJvcE5hbWVdKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke3Byb3BOYW1lfScgbXVzdCBiZSBhbiBhcnJheWApO1xuICAgICAgfVxuICAgICAgaWYgKF8uaXNFbXB0eSh0aGlzW3Byb3BOYW1lXS5maWx0ZXIoKGxpbmUpID0+IF8udHJpbShsaW5lKSkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGRlcCBvZiB0aGlzW3Byb3BOYW1lXSkge1xuICAgICAgICBpZiAoL1tcXHMnXFxcXCRdLy50ZXN0KGRlcCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NpbmdsZSBxdW90ZXMsIGRvbGxhciBjaGFyYWN0ZXJzIGFuZCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMnICtcbiAgICAgICAgICAgIGAgYXJlIGRpc2FsbG93ZWQgaW4gYWRkaXRpb25hbCBkZXBlbmRlbmNpZXM6ICR7ZGVwfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBoYXNBZGRpdGlvbmFsRGVwcyA9IHRydWU7XG4gICAgfVxuICAgIGlmICghaGFzQWRkaXRpb25hbERlcHMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBidWlsZFBhdGggPSBwYXRoLnJlc29sdmUodGhpcy5zZXJ2ZXJQYXRoLCAnYXBwJywgJ2J1aWxkLmdyYWRsZS5rdHMnKTtcbiAgICBsZXQgY29uZmlndXJhdGlvbiA9IGF3YWl0IGZzLnJlYWRGaWxlKGJ1aWxkUGF0aCwgJ3V0ZjgnKTtcbiAgICBmb3IgKGNvbnN0IHByb3BOYW1lIG9mIERFUEVOREVOQ1lfUFJPUF9OQU1FUykge1xuICAgICAgY29uc3QgcHJlZml4ID0gcHJvcE5hbWUgPT09IERFUEVOREVOQ1lfUFJPUF9OQU1FU1swXVxuICAgICAgICA/ICdpbXBsZW1lbnRhdGlvbidcbiAgICAgICAgOiAnYW5kcm9pZFRlc3RJbXBsZW1lbnRhdGlvbic7XG4gICAgICBjb25zdCBkZXBzID0gdGhpc1twcm9wTmFtZV1cbiAgICAgICAgLmZpbHRlcigobGluZSkgPT4gXy50cmltKGxpbmUpKVxuICAgICAgICAubWFwKChsaW5lKSA9PiBgJHtwcmVmaXh9KFwiJHtsaW5lfVwiKWApO1xuICAgICAgaWYgKF8uaXNFbXB0eShkZXBzKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgbG9nLmluZm8oYEFkZGluZyB0aGUgZm9sbG93aW5nICR7cHJvcE5hbWV9IHRvIGJ1aWxkLmdyYWRsZS5rdHM6ICR7ZGVwc31gKTtcbiAgICAgIGNvbmZpZ3VyYXRpb24gPSB1cGRhdGVEZXBlbmRlbmN5TGluZXMoY29uZmlndXJhdGlvbiwgcHJvcE5hbWUsIGRlcHMpO1xuICAgIH1cbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoYnVpbGRQYXRoLCBjb25maWd1cmF0aW9uLCAndXRmOCcpO1xuICB9XG5cbiAgYXN5bmMgcnVuQnVpbGRQcm9jZXNzICgpIHtcbiAgICBjb25zdCB7Y21kLCBhcmdzfSA9IHRoaXMuZ2V0Q29tbWFuZCgpO1xuICAgIGxvZy5kZWJ1ZyhgQmVnaW5uaW5nIGJ1aWxkIHdpdGggY29tbWFuZCAnJHtjbWR9ICR7YXJncy5qb2luKCcgJyl9JyBgICtcbiAgICAgIGBpbiBkaXJlY3RvcnkgJyR7dGhpcy5zZXJ2ZXJQYXRofSdgKTtcbiAgICBjb25zdCBncmFkbGVidWlsZCA9IG5ldyBTdWJQcm9jZXNzKGNtZCwgYXJncywge1xuICAgICAgY3dkOiB0aGlzLnNlcnZlclBhdGgsXG4gICAgICBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdwaXBlJ10sXG4gICAgICB3aW5kb3dzVmVyYmF0aW1Bcmd1bWVudHM6IHRydWVcbiAgICB9KTtcbiAgICBsZXQgYnVpbGRMYXN0TGluZXMgPSBbXTtcblxuICAgIGNvbnN0IGxvZ01zZyA9IGBPdXRwdXQgZnJvbSBHcmFkbGUgJHt0aGlzLnNob3dHcmFkbGVMb2cgPyAnd2lsbCcgOiAnd2lsbCBub3QnfSBiZSBsb2dnZWRgO1xuICAgIGxvZy5kZWJ1ZyhgJHtsb2dNc2d9LiBUbyBjaGFuZ2UgdGhpcywgdXNlICdzaG93R3JhZGxlTG9nJyBkZXNpcmVkIGNhcGFiaWxpdHlgKTtcbiAgICBncmFkbGVidWlsZC5vbignc3RyZWFtLWxpbmUnLCAobGluZSkgPT4ge1xuICAgICAgaWYgKHRoaXMuc2hvd0dyYWRsZUxvZykge1xuICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKCdbU1RERVJSXScpKSB7XG4gICAgICAgICAgZ3JhZGxlTG9nLndhcm4obGluZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZ3JhZGxlTG9nLmluZm8obGluZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJ1aWxkTGFzdExpbmVzLnB1c2goYCR7RU9MfSR7bGluZX1gKTtcbiAgICAgIGlmIChidWlsZExhc3RMaW5lcy5sZW5ndGggPiBHUkFETEVfTUFYX0VSUk9SX0xPR19MSU5FUykge1xuICAgICAgICBidWlsZExhc3RMaW5lcyA9IGJ1aWxkTGFzdExpbmVzLnNsaWNlKC1HUkFETEVfTUFYX0VSUk9SX0xPR19MSU5FUyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZ3JhZGxlYnVpbGQuc3RhcnQoKTtcbiAgICAgIGF3YWl0IGdyYWRsZWJ1aWxkLmpvaW4oKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxldCBtc2cgPSBgVW5hYmxlIHRvIGJ1aWxkIEVzcHJlc3NvIHNlcnZlciAtICR7ZXJyLm1lc3NhZ2V9XFxuYCArXG4gICAgICAgIGBHcmFkbGUgZXJyb3IgbWVzc2FnZToke0VPTH0ke2J1aWxkTGFzdExpbmVzfWA7XG4gICAgICBsb2cuZXJyb3JBbmRUaHJvdyhtc2cpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgeyBTZXJ2ZXJCdWlsZGVyLCBWRVJTSU9OX0tFWVMsIEdSQURMRV9VUkxfVEVNUExBVEUsIGJ1aWxkU2VydmVyU2lnbmluZ0NvbmZpZyB9O1xuZXhwb3J0IGRlZmF1bHQgU2VydmVyQnVpbGRlcjtcbiJdLCJmaWxlIjoibGliL3NlcnZlci1idWlsZGVyLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
@@ -1,18 +1,20 @@
1
1
  {
2
- "version": 2,
2
+ "version": 3,
3
3
  "artifactType": {
4
4
  "type": "APK",
5
5
  "kind": "Directory"
6
6
  },
7
7
  "applicationId": "io.appium.espressoserver.test",
8
- "variantName": "processDebugAndroidTestResources",
8
+ "variantName": "debugAndroidTest",
9
9
  "elements": [
10
10
  {
11
11
  "type": "SINGLE",
12
12
  "filters": [],
13
+ "attributes": [],
13
14
  "versionCode": 0,
14
15
  "versionName": "",
15
16
  "outputFile": "app-debug-androidTest.apk"
16
17
  }
17
- ]
18
+ ],
19
+ "elementType": "File"
18
20
  }
@@ -4,8 +4,8 @@ plugins {
4
4
  }
5
5
 
6
6
  android {
7
- compileSdkVersion(getIntProperty("appiumCompileSdk", 30))
8
- buildToolsVersion(getStringProperty("appiumBuildTools", "30.0.3"))
7
+ compileSdk = getIntProperty("appiumCompileSdk", 30)
8
+ buildToolsVersion = getStringProperty("appiumBuildTools", "30.0.3")
9
9
  defaultConfig {
10
10
  // <instrumentation android:targetPackage=""/>
11
11
  applicationId = getStringProperty("appiumTargetPackage", "io.appium.espressoserver")
@@ -13,8 +13,8 @@ android {
13
13
  testApplicationId = "io.appium.espressoserver.test"
14
14
  testHandleProfiling = false
15
15
  testFunctionalTest = false
16
- minSdkVersion(getIntProperty("appiumMinSdk", 21))
17
- targetSdkVersion(getIntProperty("appiumTargetSdk", 28))
16
+ minSdk = getIntProperty("appiumMinSdk", 21)
17
+ targetSdk = getIntProperty("appiumTargetSdk", 28)
18
18
  versionCode = 1
19
19
  versionName = "1.0"
20
20
  testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
@@ -22,7 +22,7 @@ android {
22
22
 
23
23
  buildTypes {
24
24
  getByName("debug") {
25
- zipAlignEnabled(getBooleanProperty("appiumZipAlign", true))
25
+ isZipAlignEnabled = getBooleanProperty("appiumZipAlign", true)
26
26
  }
27
27
  getByName("release") {
28
28
  isMinifyEnabled = false
@@ -43,19 +43,19 @@ android {
43
43
  signingConfigs {
44
44
  getByName("debug") {
45
45
  findProperty("appiumKeystoreFile")?.also {
46
- storeFile(File(it.toString()))
46
+ storeFile = File(it.toString())
47
47
  }
48
48
 
49
49
  findProperty("appiumKeystorePassword")?.also {
50
- storePassword(it.toString())
50
+ storePassword = it.toString()
51
51
  }
52
52
 
53
53
  findProperty("appiumKeyAlias")?.also {
54
- keyAlias(it.toString())
54
+ keyAlias = it.toString()
55
55
  }
56
56
 
57
57
  findProperty("appiumKeyPassword")?.also {
58
- keyPassword(it.toString())
58
+ keyPassword = it.toString()
59
59
  }
60
60
  }
61
61
  }
@@ -80,7 +80,7 @@ android {
80
80
  }
81
81
 
82
82
  packagingOptions {
83
- exclude("META-INF/**")
83
+ resources.excludes.add("META-INF/**")
84
84
  }
85
85
  }
86
86
 
@@ -140,17 +140,17 @@ tasks.withType<Test> {
140
140
 
141
141
  object Version {
142
142
  const val kotlin = "1.5.10"
143
- const val espresso = "3.3.0"
144
- const val testlib = "1.3.0"
145
- const val mocklib = "1.7.4"
146
- const val gson = "2.8.6"
143
+ const val espresso = "3.4.0"
144
+ const val testlib = "1.4.0"
145
+ const val mocklib = "2.0.9"
146
+ const val gson = "2.8.9"
147
147
  const val uia = "2.2.0"
148
148
  const val nanohttpd = "2.3.1"
149
- const val annotation = "1.1.0"
150
- const val mockito = "2.8.9"
149
+ const val annotation = "1.3.0"
150
+ const val mockito = "4.0.0"
151
151
  const val robolectric = "4.5.1"
152
- const val junit = "4.13"
153
- const val compose = "1.0.0"
152
+ const val junit = "4.13.2"
153
+ const val compose = "1.0.5"
154
154
  }
155
155
 
156
156
  fun Project.getStringProperty(name: String, default: String): String =
@@ -19,7 +19,7 @@ import kotlin.test.assertTrue
19
19
  class `KReflectionUtils Test` {
20
20
 
21
21
  @Test
22
- fun `"invokeMethod" should find methods specific to parameters provided and call it`(){
22
+ fun `'invokeMethod' should find methods specific to parameters provided and call it`(){
23
23
  val obj = TestClass()
24
24
 
25
25
  var methodResult = ReflectionUtils.invokeInstanceMethod(obj, "plus", null, 1)
@@ -36,13 +36,13 @@ class `KReflectionUtils Test` {
36
36
  }
37
37
 
38
38
  @Test
39
- fun `"invokeInstanceMethod" should extract method of an object`() {
39
+ fun `'invokeInstanceMethod' should extract method of an object`() {
40
40
  val methodResult = ReflectionUtils.extractMethod(TestClass::class.java, "plus", Int::class.java, Int::class.java)
41
41
  assertNotNull(methodResult)
42
42
  }
43
43
 
44
44
  @Test
45
- fun `"invokeInstanceMethod" should invoke method on instance of an object`() {
45
+ fun `'invokeInstanceMethod' should invoke method on instance of an object`() {
46
46
  val obj = TestClass()
47
47
  val methodResult = ReflectionUtils.invokeInstanceMethod(obj, "plus", 2, 2)
48
48
  assertTrue(methodResult is Number)
@@ -56,7 +56,7 @@ class `KReflectionUtils Test` {
56
56
  }
57
57
 
58
58
  @Test
59
- fun `should parse Driver Atoms "findElement"`() {
59
+ fun `should parse Driver Atoms 'findElement'`() {
60
60
  val findElementAtom = invokeStaticMethod(DriverAtoms::class.java,
61
61
  "findElement", Locator.ID, "some Identifier")
62
62
  assertTrue(findElementAtom is Atom<*>)
@@ -15,7 +15,7 @@ import kotlin.test.assertEquals
15
15
  class `mobile clickAction test` {
16
16
 
17
17
  @Test
18
- fun `should parse "MobileClickParams" and set defaults if some params not provided` () {
18
+ fun `should parse 'MobileClickParams' and set defaults if some params not provided` () {
19
19
  val jsonElement = JsonObject()
20
20
  val clickActionParams = MobileClickActionParams.MobileClickActionParamsDeserializer()
21
21
  .deserialize(jsonElement, null, null)
@@ -27,7 +27,7 @@ class `mobile clickAction test` {
27
27
  }
28
28
 
29
29
  @Test
30
- fun `should parse "MobileClickParams" and set values if all params provided` () {
30
+ fun `should parse 'MobileClickParams' and set values if all params provided` () {
31
31
  val jsonElement = JsonObject()
32
32
  jsonElement.add("inputDevice", JsonPrimitive(2))
33
33
  jsonElement.add("buttonState", JsonPrimitive("3"))
@@ -15,7 +15,7 @@ import kotlin.test.assertEquals
15
15
  class `mobile swipe test` {
16
16
 
17
17
  @Test
18
- fun `should parse "MobileSwipeActionParams" with 'direction' property` () {
18
+ fun `should parse 'MobileSwipeActionParams' with 'direction' property` () {
19
19
  val jsonElement = JsonObject()
20
20
  jsonElement.add("direction", JsonPrimitive("DOWN"))
21
21
  val mobileSwipeActionParams = MobileSwipeActionParamsDeserializer()
@@ -24,7 +24,7 @@ class `mobile swipe test` {
24
24
  }
25
25
 
26
26
  @Test
27
- fun `should parse "MobileSwipeActionParams" with 'swiper' property and use default parameters` () {
27
+ fun `should parse 'MobileSwipeActionParams' with 'swiper' property and use default parameters` () {
28
28
  val jsonElement = JsonObject()
29
29
  jsonElement.add("swiper", JsonPrimitive("FAST"))
30
30
  val mobileSwipeActionParams = MobileSwipeActionParamsDeserializer()
@@ -36,7 +36,7 @@ class `mobile swipe test` {
36
36
  }
37
37
 
38
38
  @Test
39
- fun `should parse "MobileSwipeActionParams" with 'swiper' property plus other parameters` () {
39
+ fun `should parse 'MobileSwipeActionParams' with 'swiper' property plus other parameters` () {
40
40
  val jsonElement = JsonObject()
41
41
  jsonElement.add("swiper", JsonPrimitive("FAST"))
42
42
  jsonElement.add("startCoordinates", JsonPrimitive("TOP_LEFT"))
@@ -1,11 +1,12 @@
1
1
  // Top-level build file where you can add configuration options common to all sub-projects/modules.
2
2
 
3
3
  buildscript {
4
+
4
5
  val appiumKotlin =
5
6
  properties.getOrDefault("appiumKotlin", "1.5.10")
6
7
 
7
8
  val appiumAndroidGradlePlugin =
8
- properties.getOrDefault("appiumAndroidGradlePlugin", "4.1.1")
9
+ properties.getOrDefault("appiumAndroidGradlePlugin", "7.0.3")
9
10
 
10
11
  repositories {
11
12
  google()
@@ -1,5 +1,5 @@
1
1
  distributionBase=GRADLE_USER_HOME
2
2
  distributionPath=wrapper/dists
3
- distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.3-all.zip
3
+ distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-all.zip
4
4
  zipStoreBase=GRADLE_USER_HOME
5
5
  zipStorePath=wrapper/dists
package/lib/driver.js CHANGED
@@ -1,7 +1,8 @@
1
1
  import _ from 'lodash';
2
+ import path from 'path';
2
3
  import { BaseDriver, errors, isErrorType, DeviceSettings} from '@appium/base-driver';
3
4
  import { EspressoRunner, TEST_APK_PKG } from './espresso-runner';
4
- import { fs } from '@appium/support';
5
+ import { fs, tempDir, zip } from '@appium/support';
5
6
  import logger from './logger';
6
7
  import commands from './commands';
7
8
  import { DEFAULT_ADB_PORT } from 'appium-adb';
@@ -119,8 +120,10 @@ const CHROME_NO_PROXY = [
119
120
  ['POST', new RegExp('^/session/[^/]+/se/log')],
120
121
  ];
121
122
 
122
- const APP_EXTENSION = '.apk';
123
123
 
124
+ const APK_EXT = '.apk';
125
+ const AAB_EXT = '.aab';
126
+ const SUPPORTED_EXTENSIONS = [APK_EXT, AAB_EXT];
124
127
 
125
128
  class EspressoDriver extends BaseDriver {
126
129
  constructor (opts = {}, shouldValidateCaps = true) {
@@ -177,12 +180,12 @@ class EspressoDriver extends BaseDriver {
177
180
 
178
181
  if (this.isChromeSession) {
179
182
  if (this.opts.app) {
180
- logger.warn(`
181
- 'browserName' capability will be ignored.
182
- Chrome browser cannot be run in Espresso sessions because Espresso automation doesn't have permission to access Chrome.
183
- `);
183
+ logger.warn(`'browserName' capability will be ignored`);
184
+ logger.warn(`Chrome browser cannot be run in Espresso sessions because Espresso automation doesn't ` +
185
+ `have permission to access Chrome`);
184
186
  } else {
185
- logger.errorAndThrow(`Chrome browser sessions cannot be run in Espresso because Espresso automation doesn't have permission to access Chrome`);
187
+ logger.errorAndThrow(`Chrome browser sessions cannot be run in Espresso because Espresso ` +
188
+ `automation doesn't have permission to access Chrome`);
186
189
  }
187
190
  }
188
191
 
@@ -191,25 +194,41 @@ class EspressoDriver extends BaseDriver {
191
194
  this.addWipeDataToAvdArgs();
192
195
  }
193
196
 
197
+ this.opts.systemPort = this.opts.systemPort
198
+ || await findAPortNotInUse(SYSTEM_PORT_RANGE[0], SYSTEM_PORT_RANGE[1]);
199
+ this.opts.adbPort = this.opts.adbPort || DEFAULT_ADB_PORT;
200
+ // get device udid for this session
201
+ const {udid, emPort} = await helpers.getDeviceInfoFromCaps(this.opts);
202
+ this.opts.udid = udid;
203
+ this.opts.emPort = emPort;
204
+ // now that we know our java version and device info, we can create our
205
+ // ADB instance
206
+ this.adb = await androidHelpers.createADB(this.opts);
207
+
194
208
  if (this.opts.app) {
195
209
  // find and copy, or download and unzip an app url or path
196
- this.opts.app = await this.helpers.configureApp(this.opts.app, APP_EXTENSION);
197
- await this.checkAppPresent();
210
+ this.opts.app = await this.helpers.configureApp(this.opts.app, {
211
+ onPostProcess: this.onPostConfigureApp.bind(this),
212
+ supportedExtensions: SUPPORTED_EXTENSIONS
213
+ });
198
214
  } else if (this.appOnDevice) {
199
215
  // the app isn't an actual app file but rather something we want to
200
216
  // assume is on the device and just launch via the appPackage
201
217
  logger.info(`App file was not listed, instead we're going to run ` +
202
218
  `${this.opts.appPackage} directly on the device`);
203
- await this.checkPackagePresent();
219
+ if (!await this.adb.isAppInstalled(this.opts.appPackage)) {
220
+ logger.errorAndThrow(`Could not find the package '${this.opts.appPackage}' ` +
221
+ `installed on the device`);
222
+ }
204
223
  }
205
224
 
206
- this.opts.systemPort = this.opts.systemPort || await findAPortNotInUse(SYSTEM_PORT_RANGE[0], SYSTEM_PORT_RANGE[1]);
207
- this.opts.adbPort = this.opts.adbPort || DEFAULT_ADB_PORT;
208
225
  await this.startEspressoSession();
209
226
  return [sessionId, caps];
210
227
  } catch (e) {
211
228
  await this.deleteSession();
212
- e.message += '. Check https://github.com/appium/appium-espresso-driver#troubleshooting regarding advanced session startup troubleshooting.';
229
+ e.message += `${_.endsWith(e.message, '.') ? '' : '.'} Check ` +
230
+ 'https://github.com/appium/appium-espresso-driver#troubleshooting ' +
231
+ 'regarding advanced session startup troubleshooting.';
213
232
  if (isErrorType(e, errors.SessionNotCreatedError)) {
214
233
  throw e;
215
234
  }
@@ -219,6 +238,102 @@ class EspressoDriver extends BaseDriver {
219
238
  }
220
239
  }
221
240
 
241
+ /**
242
+ * Unzip the given app path and return the first package that has SUPPORTED_EXTENSIONS
243
+ * in the archived file.
244
+ *
245
+ * @param {string} appPath The path to app file.
246
+ * @returns {string} Retuns the path to an unzipped app file path.
247
+ * @throws Raise an exception if the zip did not have any SUPPORTED_EXTENSIONS packages.
248
+ */
249
+ async unzipApp (appPath) {
250
+ const useSystemUnzipEnv = process.env.APPIUM_PREFER_SYSTEM_UNZIP;
251
+ const useSystemUnzip = _.isEmpty(useSystemUnzipEnv)
252
+ || !['0', 'false'].includes(_.toLower(useSystemUnzipEnv));
253
+ const tmpRoot = await tempDir.openDir();
254
+ await zip.extractAllTo(appPath, tmpRoot, {useSystemUnzip});
255
+
256
+ const globPattern = `**/*.+(${SUPPORTED_EXTENSIONS.map((ext) => ext.replace(/^\./, '')).join('|')})`;
257
+ const sortedBundleItems = (await fs.glob(globPattern, {
258
+ cwd: tmpRoot,
259
+ strict: false,
260
+ })).sort((a, b) => a.split(path.sep).length - b.split(path.sep).length);
261
+ if (sortedBundleItems.length === 0) {
262
+ // no expected packages in the zip
263
+ logger.errorAndThrow(`${this.opts.app} did not have any of '${SUPPORTED_EXTENSIONS.join(', ')}' ` +
264
+ `extension packages. Please make sure the provided .zip archive contains at least one valid application package.`);
265
+ }
266
+ const unzippedAppPath = path.join(tmpRoot, _.first(sortedBundleItems));
267
+ logger.debug(`'${unzippedAppPath}' is the unzipped file from '${appPath}'`);
268
+ return unzippedAppPath;
269
+ }
270
+
271
+ async onPostConfigureApp ({cachedAppInfo, isUrl, appPath}) {
272
+ const presignApp = async (appLocation) => {
273
+ if (this.opts.noSign) {
274
+ logger.info('Skipping application signing because noSign capability is set to true. ' +
275
+ 'Having the application under test with improper signature/non-signed will cause ' +
276
+ 'Espresso automation startup failure.');
277
+ } else if (!await this.adb.checkApkCert(appLocation, this.opts.appPackage)) {
278
+ await this.adb.sign(appLocation, this.opts.appPackage);
279
+ }
280
+ };
281
+
282
+ const hasApkExt = (appPath) => _.endsWith(_.toLower(appPath), APK_EXT);
283
+ const hasAabExt = (appPath) => _.endsWith(_.toLower(appPath), AAB_EXT);
284
+ const extractUniversalApk = async (shouldExtract, appPath) =>
285
+ shouldExtract ? appPath : await this.adb.extractUniversalApk(appPath);
286
+
287
+ let pathInCache = null;
288
+ let isResultAppPathAlreadyCached = false;
289
+ if (_.isPlainObject(cachedAppInfo)) {
290
+ const packageHash = await fs.hash(appPath);
291
+ if (packageHash === cachedAppInfo.packageHash && await fs.exists(cachedAppInfo.fullPath)) {
292
+ logger.info(`Using '${cachedAppInfo.fullPath}' which is cached from '${appPath}'`);
293
+ isResultAppPathAlreadyCached = true;
294
+ pathInCache = cachedAppInfo.fullPath;
295
+ }
296
+ }
297
+
298
+ // appPath can be .zip, .apk or .aab
299
+ const isApk = hasApkExt(appPath);
300
+ // Only local .apk files that are available in-place should not be cached
301
+ const shouldResultAppPathBeCached = !isApk || (isApk && isUrl);
302
+
303
+ if (!isResultAppPathAlreadyCached) {
304
+ if (shouldResultAppPathBeCached) {
305
+ // .zip, .aab or downloaded .apk
306
+
307
+ let unzippedAppPath;
308
+ let isUnzippedApk = false;
309
+ if (!(hasApkExt(appPath) || hasAabExt(appPath))) {
310
+ unzippedAppPath = await this.unzipApp(appPath);
311
+ isUnzippedApk = hasApkExt(unzippedAppPath);
312
+ }
313
+
314
+ // unzippedAppPath or appPath has SUPPORTED_EXTENSIONS.
315
+ pathInCache = unzippedAppPath
316
+ ? await extractUniversalApk(isUnzippedApk, unzippedAppPath)
317
+ : await extractUniversalApk(isApk, appPath);
318
+
319
+ if (!isApk && isUrl) {
320
+ // Clean up the temporarily downloaded .aab or .zip package
321
+ await fs.rimraf(appPath);
322
+ }
323
+ if (hasAabExt(unzippedAppPath)) {
324
+ // Cleanup the local unzipped .aab file
325
+ await fs.rimraf(unzippedAppPath);
326
+ }
327
+ await presignApp(pathInCache);
328
+ } else if (isApk) {
329
+ // It is probably not the best idea to modify the provided app in-place,
330
+ // but this is how it was always working
331
+ await presignApp(appPath);
332
+ }
333
+ }
334
+ return shouldResultAppPathBeCached ? {appPath: pathInCache} : false;
335
+ }
336
+
222
337
  get driverData () {
223
338
  // TODO fille out resource info here
224
339
  return {};
@@ -257,15 +372,6 @@ class EspressoDriver extends BaseDriver {
257
372
  async startEspressoSession () {
258
373
  logger.info(`EspressoDriver version: ${version}`);
259
374
 
260
- // get device udid for this session
261
- let {udid, emPort} = await helpers.getDeviceInfoFromCaps(this.opts);
262
- this.opts.udid = udid;
263
- this.opts.emPort = emPort;
264
-
265
- // now that we know our java version and device info, we can create our
266
- // ADB instance
267
- this.adb = await androidHelpers.createADB(this.opts);
268
-
269
375
  // Read https://github.com/appium/appium-android-driver/pull/461 what happens if ther is no setHiddenApiPolicy for Android P+
270
376
  if (await this.adb.getApiLevel() >= 28) { // Android P
271
377
  logger.warn('Relaxing hidden api policy');
@@ -438,13 +544,6 @@ class EspressoDriver extends BaseDriver {
438
544
  await this.adb.uninstallApk(this.opts.appPackage);
439
545
  }
440
546
  if (this.opts.app) {
441
- if (this.opts.noSign) {
442
- logger.info('Skipping application signing because noSign capability is set to true. ' +
443
- 'Having the application under test with improper signature/non-signed will cause ' +
444
- 'Espresso automation startup failure.');
445
- } else if (!await this.adb.checkApkCert(this.opts.app, this.opts.appPackage)) {
446
- await this.adb.sign(this.opts.app, this.opts.appPackage);
447
- }
448
547
  await helpers.installApk(this.adb, this.opts);
449
548
  }
450
549
  if (this.opts.skipServerInstallation) {
@@ -525,14 +624,6 @@ class EspressoDriver extends BaseDriver {
525
624
  }
526
625
  }
527
626
 
528
- // TODO method is duplicated from uiautomator2
529
- async checkAppPresent () {
530
- logger.debug('Checking whether app is actually present');
531
- if (!(await fs.exists(this.opts.app))) {
532
- logger.errorAndThrow(`Could not find app apk at '${this.opts.app}'`);
533
- }
534
- }
535
-
536
627
  async onSettingsUpdate () {
537
628
  // intentionally do nothing here, since commands.updateSettings proxies
538
629
  // settings to the espresso server already
@@ -567,6 +658,10 @@ class EspressoDriver extends BaseDriver {
567
658
  get isChromeSession () {
568
659
  return helpers.isChromeBrowser(this.opts.browserName);
569
660
  }
661
+
662
+ get appOnDevice () {
663
+ return !this.opts.app && this.helpers.isPackageOrBundle(this.opts.appPackage);
664
+ }
570
665
  }
571
666
 
572
667
  // first add the android-driver commands which we will fall back to
@@ -22,7 +22,7 @@ const VERSION_KEYS = [
22
22
  'kotlin',
23
23
  'sourceCompatibility',
24
24
  'targetCompatibility',
25
- 'jvmTarget',
25
+ 'jvmTarget'
26
26
  ];
27
27
 
28
28
  const gradleLog = logger.getLogger('Gradle');
@@ -163,6 +163,7 @@ class ServerBuilder {
163
163
  const gradlebuild = new SubProcess(cmd, args, {
164
164
  cwd: this.serverPath,
165
165
  stdio: ['ignore', 'pipe', 'pipe'],
166
+ windowsVerbatimArguments: true
166
167
  });
167
168
  let buildLastLines = [];
168
169