UNPKG

appium-adb-test

Version:

Android Debug Bridge interface

406 lines (331 loc) 27 kB
'use strict'; var _regeneratorRuntime = require('babel-runtime/regenerator')['default']; var _interopRequireDefault = require('babel-runtime/helpers/interop-require-default')['default']; var _chai = require('chai'); var _chai2 = _interopRequireDefault(_chai); var _chaiAsPromised = require('chai-as-promised'); var _chaiAsPromised2 = _interopRequireDefault(_chaiAsPromised); var _ = require('../..'); var _2 = _interopRequireDefault(_); var _path = require('path'); var _path2 = _interopRequireDefault(_path); var _libHelpersJs = require('../../lib/helpers.js'); var _asyncbox = require('asyncbox'); _chai2['default'].should(); _chai2['default'].use(_chaiAsPromised2['default']); describe('apk utils', function () { var _this = this; var adb = undefined; var contactManagerPath = _path2['default'].resolve(_libHelpersJs.rootDir, 'test', 'fixtures', 'ContactManager.apk'); var deviceTempPath = '/data/local/tmp/'; var assertPackageAndActivity = function assertPackageAndActivity() { var _ref, appPackage, appActivity; return _regeneratorRuntime.async(function assertPackageAndActivity$(context$2$0) { while (1) switch (context$2$0.prev = context$2$0.next) { case 0: context$2$0.next = 2; return _regeneratorRuntime.awrap(adb.getFocusedPackageAndActivity()); case 2: _ref = context$2$0.sent; appPackage = _ref.appPackage; appActivity = _ref.appActivity; appPackage.should.equal('com.example.android.contactmanager'); appActivity.should.equal('.ContactManager'); case 7: case 'end': return context$2$0.stop(); } }, null, _this); }; this.timeout(60000); before(function callee$1$0() { return _regeneratorRuntime.async(function callee$1$0$(context$2$0) { while (1) switch (context$2$0.prev = context$2$0.next) { case 0: context$2$0.next = 2; return _regeneratorRuntime.awrap(_2['default'].createADB()); case 2: adb = context$2$0.sent; case 3: case 'end': return context$2$0.stop(); } }, null, _this); }); it('should be able to install/remove app and detect its status', function callee$1$0() { return _regeneratorRuntime.async(function callee$1$0$(context$2$0) { while (1) switch (context$2$0.prev = context$2$0.next) { case 0: context$2$0.next = 2; return _regeneratorRuntime.awrap(adb.isAppInstalled('foo')); case 2: context$2$0.sent.should.be['false']; context$2$0.next = 5; return _regeneratorRuntime.awrap(adb.install(contactManagerPath)); case 5: context$2$0.next = 7; return _regeneratorRuntime.awrap(adb.isAppInstalled('com.example.android.contactmanager')); case 7: context$2$0.sent.should.be['true']; context$2$0.next = 10; return _regeneratorRuntime.awrap(adb.uninstallApk('com.example.android.contactmanager')); case 10: context$2$0.sent.should.be['true']; context$2$0.next = 13; return _regeneratorRuntime.awrap(adb.isAppInstalled('com.example.android.contactmanager')); case 13: context$2$0.sent.should.be['false']; context$2$0.next = 16; return _regeneratorRuntime.awrap(adb.uninstallApk('com.example.android.contactmanager')); case 16: context$2$0.sent.should.be['false']; context$2$0.next = 19; return _regeneratorRuntime.awrap(adb.rimraf(deviceTempPath + 'ContactManager.apk')); case 19: context$2$0.next = 21; return _regeneratorRuntime.awrap(adb.push(contactManagerPath, deviceTempPath)); case 21: context$2$0.next = 23; return _regeneratorRuntime.awrap(adb.installFromDevicePath(deviceTempPath + 'ContactManager.apk')); case 23: case 'end': return context$2$0.stop(); } }, null, _this); }); describe('startUri', function callee$1$0() { return _regeneratorRuntime.async(function callee$1$0$(context$2$0) { var _this3 = this; while (1) switch (context$2$0.prev = context$2$0.next) { case 0: it('should be able to start a uri', function callee$2$0() { var res; return _regeneratorRuntime.async(function callee$2$0$(context$3$0) { var _this2 = this; while (1) switch (context$3$0.prev = context$3$0.next) { case 0: context$3$0.next = 2; return _regeneratorRuntime.awrap(adb.goToHome()); case 2: context$3$0.next = 4; return _regeneratorRuntime.awrap(adb.getFocusedPackageAndActivity()); case 4: res = context$3$0.sent; res.appPackage.should.not.equal('com.android.contacts'); context$3$0.next = 8; return _regeneratorRuntime.awrap(adb.install(contactManagerPath)); case 8: context$3$0.next = 10; return _regeneratorRuntime.awrap(adb.startUri('content://contacts/people', 'com.android.contacts')); case 10: context$3$0.next = 12; return _regeneratorRuntime.awrap((0, _asyncbox.retryInterval)(10, 500, function callee$3$0() { var focusRe1, focusRe2; return _regeneratorRuntime.async(function callee$3$0$(context$4$0) { while (1) switch (context$4$0.prev = context$4$0.next) { case 0: context$4$0.next = 2; return _regeneratorRuntime.awrap(adb.shell(['dumpsys', 'window', 'windows'])); case 2: res = context$4$0.sent; focusRe1 = '(mCurrentFocus.+\\.PeopleActivity)'; focusRe2 = '(mFocusedApp.+\\.PeopleActivity)'; res.should.match(new RegExp(focusRe1 + '|' + focusRe2)); case 6: case 'end': return context$4$0.stop(); } }, null, _this2); })); case 12: context$3$0.next = 14; return _regeneratorRuntime.awrap(adb.goToHome()); case 14: case 'end': return context$3$0.stop(); } }, null, _this3); }); case 1: case 'end': return context$2$0.stop(); } }, null, _this); }); describe('startApp', function callee$1$0() { return _regeneratorRuntime.async(function callee$1$0$(context$2$0) { var _this4 = this; while (1) switch (context$2$0.prev = context$2$0.next) { case 0: it('should be able to start', function callee$2$0() { return _regeneratorRuntime.async(function callee$2$0$(context$3$0) { while (1) switch (context$3$0.prev = context$3$0.next) { case 0: context$3$0.next = 2; return _regeneratorRuntime.awrap(adb.install(contactManagerPath)); case 2: context$3$0.next = 4; return _regeneratorRuntime.awrap(adb.startApp({ pkg: 'com.example.android.contactmanager', activity: 'ContactManager' })); case 4: context$3$0.next = 6; return _regeneratorRuntime.awrap(assertPackageAndActivity()); case 6: case 'end': return context$3$0.stop(); } }, null, _this4); }); it('should throw error for wrong activity', function callee$2$0() { return _regeneratorRuntime.async(function callee$2$0$(context$3$0) { while (1) switch (context$3$0.prev = context$3$0.next) { case 0: context$3$0.next = 2; return _regeneratorRuntime.awrap(adb.install(contactManagerPath)); case 2: context$3$0.next = 4; return _regeneratorRuntime.awrap(adb.startApp({ pkg: 'com.example.android.contactmanager', activity: 'ContactManage' }).should.eventually.be.rejectedWith('Activity')); case 4: case 'end': return context$3$0.stop(); } }, null, _this4); }); it('should throw error for wrong wait activity', function callee$2$0() { return _regeneratorRuntime.async(function callee$2$0$(context$3$0) { while (1) switch (context$3$0.prev = context$3$0.next) { case 0: context$3$0.next = 2; return _regeneratorRuntime.awrap(adb.install(contactManagerPath)); case 2: context$3$0.next = 4; return _regeneratorRuntime.awrap(adb.startApp({ pkg: 'com.example.android.contactmanager', activity: 'ContactManager', waitActivity: 'foo', waitDuration: 1000 }).should.eventually.be.rejectedWith('foo')); case 4: case 'end': return context$3$0.stop(); } }, null, _this4); }); it('should start activity with wait activity', function callee$2$0() { return _regeneratorRuntime.async(function callee$2$0$(context$3$0) { while (1) switch (context$3$0.prev = context$3$0.next) { case 0: context$3$0.next = 2; return _regeneratorRuntime.awrap(adb.install(contactManagerPath)); case 2: context$3$0.next = 4; return _regeneratorRuntime.awrap(adb.startApp({ pkg: 'com.example.android.contactmanager', activity: 'ContactManager', waitActivity: '.ContactManager' })); case 4: context$3$0.next = 6; return _regeneratorRuntime.awrap(assertPackageAndActivity()); case 6: case 'end': return context$3$0.stop(); } }, null, _this4); }); case 4: case 'end': return context$2$0.stop(); } }, null, _this); }); it('getFocusedPackageAndActivity should be able get package and activity', function callee$1$0() { return _regeneratorRuntime.async(function callee$1$0$(context$2$0) { while (1) switch (context$2$0.prev = context$2$0.next) { case 0: context$2$0.next = 2; return _regeneratorRuntime.awrap(adb.install(contactManagerPath)); case 2: context$2$0.next = 4; return _regeneratorRuntime.awrap(adb.startApp({ pkg: 'com.example.android.contactmanager', activity: 'ContactManager' })); case 4: context$2$0.next = 6; return _regeneratorRuntime.awrap(assertPackageAndActivity()); case 6: case 'end': return context$2$0.stop(); } }, null, _this); }); it('extractStringsFromApk should get strings for default language', function callee$1$0() { var _ref2, apkStrings; return _regeneratorRuntime.async(function callee$1$0$(context$2$0) { while (1) switch (context$2$0.prev = context$2$0.next) { case 0: context$2$0.next = 2; return _regeneratorRuntime.awrap(adb.extractStringsFromApk(contactManagerPath, null, '/tmp')); case 2: _ref2 = context$2$0.sent; apkStrings = _ref2.apkStrings; apkStrings.save.should.equal('Save'); case 5: case 'end': return context$2$0.stop(); } }, null, _this); }); it('should get device language and country', function callee$1$0() { return _regeneratorRuntime.async(function callee$1$0$(context$2$0) { while (1) switch (context$2$0.prev = context$2$0.next) { case 0: context$2$0.t0 = ['en', 'fr'].should; context$2$0.next = 3; return _regeneratorRuntime.awrap(adb.getDeviceLanguage()); case 3: context$2$0.t1 = context$2$0.sent; context$2$0.t0.contain.call(context$2$0.t0, context$2$0.t1); context$2$0.t2 = ['US', 'EN_US', 'EN', 'FR'].should; context$2$0.next = 8; return _regeneratorRuntime.awrap(adb.getDeviceCountry()); case 8: context$2$0.t3 = context$2$0.sent; context$2$0.t2.contain.call(context$2$0.t2, context$2$0.t3); case 10: case 'end': return context$2$0.stop(); } }, null, _this); }); it('should set device language and country', function callee$1$0() { return _regeneratorRuntime.async(function callee$1$0$(context$2$0) { while (1) switch (context$2$0.prev = context$2$0.next) { case 0: context$2$0.next = 2; return _regeneratorRuntime.awrap(adb.setDeviceLanguage('fr')); case 2: context$2$0.next = 4; return _regeneratorRuntime.awrap(adb.setDeviceCountry('fr')); case 4: context$2$0.next = 6; return _regeneratorRuntime.awrap(adb.reboot()); case 6: context$2$0.next = 8; return _regeneratorRuntime.awrap(adb.getDeviceLanguage().should.eventually.equal('fr')); case 8: context$2$0.next = 10; return _regeneratorRuntime.awrap(adb.getDeviceCountry().should.eventually.equal('FR')); case 10: context$2$0.next = 12; return _regeneratorRuntime.awrap(adb.setDeviceLanguage('en')); case 12: context$2$0.next = 14; return _regeneratorRuntime.awrap(adb.setDeviceCountry('us')); case 14: case 'end': return context$2$0.stop(); } }, null, _this); }); }); // depending on apilevel, app might show up as active in one of these // two dumpsys output formats // cleanup //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvZnVuY3Rpb25hbC9hcGstdXRpbHMtZTJlLXNwZWNzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztvQkFBaUIsTUFBTTs7Ozs4QkFDSSxrQkFBa0I7Ozs7Z0JBQzdCLE9BQU87Ozs7b0JBQ04sTUFBTTs7Ozs0QkFDQyxzQkFBc0I7O3dCQUNoQixVQUFVOztBQUV4QyxrQkFBSyxNQUFNLEVBQUUsQ0FBQztBQUNkLGtCQUFLLEdBQUcsNkJBQWdCLENBQUM7O0FBRXpCLFFBQVEsQ0FBQyxXQUFXLEVBQUUsWUFBWTs7O0FBQ2hDLE1BQUksR0FBRyxZQUFBLENBQUM7QUFDUixNQUFNLGtCQUFrQixHQUFHLGtCQUFLLE9BQU8sd0JBQVUsTUFBTSxFQUNmLFVBQVUsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0FBQzFFLE1BQU0sY0FBYyxHQUFHLGtCQUFrQixDQUFDO0FBQzFDLE1BQU0sd0JBQXdCLEdBQUcsU0FBM0Isd0JBQXdCO2NBQ3ZCLFVBQVUsRUFBRSxXQUFXOzs7Ozs7MkNBQVUsR0FBRyxDQUFDLDRCQUE0QixFQUFFOzs7O0FBQW5FLG9CQUFVLFFBQVYsVUFBVTtBQUFFLHFCQUFXLFFBQVgsV0FBVzs7QUFDNUIsb0JBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7QUFDOUQscUJBQVcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7Ozs7Ozs7R0FDN0MsQ0FBQztBQUNGLE1BQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDcEIsUUFBTSxDQUFDOzs7OzsyQ0FDTyxjQUFJLFNBQVMsRUFBRTs7O0FBQTNCLGFBQUc7Ozs7Ozs7R0FDSixDQUFDLENBQUM7QUFDSCxJQUFFLENBQUMsNERBQTRELEVBQUU7Ozs7OzJDQUN4RCxHQUFHLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQzs7OzJCQUFFLE1BQU0sQ0FBQyxFQUFFOzsyQ0FDckMsR0FBRyxDQUFDLE9BQU8sQ0FB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MkNBQWUsR0FBRyxDQUFDLGdCQUFnQixFQUFFOzs7O3lCQUFwQyxPQUFPOzs7Ozs7O0dBQzNDLENBQUMsQ0FBQztBQUNILElBQUUsQ0FBQyx3Q0FBd0MsRUFBRTs7Ozs7MkNBQ3JDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7Ozs7MkNBQzNCLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUM7Ozs7MkNBQzFCLEdBQUcsQ0FBQyxNQUFNLEVBQUU7Ozs7MkNBQ1osR0FBRyxDQUFDLGlCQUFpQixFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDOzs7OzJDQUNyRCxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7Ozs7MkNBRXBELEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7Ozs7MkNBQzNCLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUM7Ozs7Ozs7R0FDakMsQ0FBQyxDQUFDO0NBQ0osQ0FBQyxDQUFDIiwiZmlsZSI6InRlc3QvZnVuY3Rpb25hbC9hcGstdXRpbHMtZTJlLXNwZWNzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNoYWkgZnJvbSAnY2hhaSc7XHJcbmltcG9ydCBjaGFpQXNQcm9taXNlZCBmcm9tICdjaGFpLWFzLXByb21pc2VkJztcclxuaW1wb3J0IEFEQiBmcm9tICcuLi8uLic7XHJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xyXG5pbXBvcnQgeyByb290RGlyIH0gZnJvbSAnLi4vLi4vbGliL2hlbHBlcnMuanMnO1xyXG5pbXBvcnQgeyByZXRyeUludGVydmFsIH0gZnJvbSAnYXN5bmNib3gnO1xyXG5cclxuY2hhaS5zaG91bGQoKTtcclxuY2hhaS51c2UoY2hhaUFzUHJvbWlzZWQpO1xyXG5cclxuZGVzY3JpYmUoJ2FwayB1dGlscycsIGZ1bmN0aW9uICgpIHtcclxuICBsZXQgYWRiO1xyXG4gIGNvbnN0IGNvbnRhY3RNYW5hZ2VyUGF0aCA9IHBhdGgucmVzb2x2ZShyb290RGlyLCAndGVzdCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmaXh0dXJlcycsICdDb250YWN0TWFuYWdlci5hcGsnKTtcclxuICBjb25zdCBkZXZpY2VUZW1wUGF0aCA9ICcvZGF0YS9sb2NhbC90bXAvJztcclxuICBjb25zdCBhc3NlcnRQYWNrYWdlQW5kQWN0aXZpdHkgPSBhc3luYyAoKSA9PiB7XHJcbiAgICBsZXQge2FwcFBhY2thZ2UsIGFwcEFjdGl2aXR5fSA9IGF3YWl0IGFkYi5nZXRGb2N1c2VkUGFja2FnZUFuZEFjdGl2aXR5KCk7XHJcbiAgICBhcHBQYWNrYWdlLnNob3VsZC5lcXVhbCgnY29tLmV4YW1wbGUuYW5kcm9pZC5jb250YWN0bWFuYWdlcicpO1xyXG4gICAgYXBwQWN0aXZpdHkuc2hvdWxkLmVxdWFsKCcuQ29udGFjdE1hbmFnZXInKTtcclxuICB9O1xyXG4gIHRoaXMudGltZW91dCg2MDAwMCk7XHJcbiAgYmVmb3JlKGFzeW5jICgpID0+IHtcclxuICAgIGFkYiA9IGF3YWl0IEFEQi5jcmVhdGVBREIoKTtcclxuICB9KTtcclxuICBpdCgnc2hvdWxkIGJlIGFibGUgdG8gaW5zdGFsbC9yZW1vdmUgYXBwIGFuZCBkZXRlY3QgaXRzIHN0YXR1cycsIGFzeW5jICgpID0+IHtcclxuICAgIChhd2FpdCBhZGIuaXNBcHBJbnN0YWxsZWQoJ2ZvbycpKS5zaG91bGQuYmUuZmFsc2U7XHJcbiAgICBhd2FpdCBhZGIuaW5zdGFsbChjb250YWN0TWFuYWdlclBhdGgpO1xyXG4gICAgKGF3YWl0IGFkYi5pc0FwcEluc3RhbGxlZCgnY29tLmV4YW1wbGUuYW5kcm9pZC5jb250YWN0bWFuYWdlcicpKS5zaG91bGQuYmUudHJ1ZTtcclxuICAgIChhd2FpdCBhZGIudW5pbnN0YWxsQXBrKCdjb20uZXhhbXBsZS5hbmRyb2lkLmNvbnRhY3RtYW5hZ2VyJykpLnNob3VsZC5iZS50cnVlO1xyXG4gICAgKGF3YWl0IGFkYi5pc0FwcEluc3RhbGxlZCgnY29tLmV4YW1wbGUuYW5kcm9pZC5jb250YWN0bWFuYWdlcicpKS5zaG91bGQuYmUuZmFsc2U7XHJcbiAgICAoYXdhaXQgYWRiLnVuaW5zdGFsbEFwaygnY29tLmV4YW1wbGUuYW5kcm9pZC5jb250YWN0bWFuYWdlcicpKS5zaG91bGQuYmUuZmFsc2U7XHJcbiAgICBhd2FpdCBhZGIucmltcmFmKGRldmljZVRlbXBQYXRoICsgJ0NvbnRhY3RNYW5hZ2VyLmFwaycpO1xyXG4gICAgYXdhaXQgYWRiLnB1c2goY29udGFjdE1hbmFnZXJQYXRoLCBkZXZpY2VUZW1wUGF0aCk7XHJcbiAgICBhd2FpdCBhZGIuaW5zdGFsbEZyb21EZXZpY2VQYXRoKGRldmljZVRlbXBQYXRoICsgJ0NvbnRhY3RNYW5hZ2VyLmFwaycpO1xyXG4gIH0pO1xyXG4gIGRlc2NyaWJlKCdzdGFydFVyaScsIGFzeW5jICgpID0+IHtcclxuICAgIGl0KCdzaG91bGQgYmUgYWJsZSB0byBzdGFydCBhIHVyaScsIGFzeW5jICgpID0+IHtcclxuICAgICAgYXdhaXQgYWRiLmdvVG9Ib21lKCk7XHJcbiAgICAgIGxldCByZXMgPSBhd2FpdCBhZGIuZ2V0Rm9jdXNlZFBhY2thZ2VBbmRBY3Rpdml0eSgpO1xyXG4gICAgICByZXMuYXBwUGFja2FnZS5zaG91bGQubm90LmVxdWFsKCdjb20uYW5kcm9pZC5jb250YWN0cycpO1xyXG4gICAgICBhd2FpdCBhZGIuaW5zdGFsbChjb250YWN0TWFuYWdlclBhdGgpO1xyXG4gICAgICBhd2FpdCBhZGIuc3RhcnRVcmkoJ2NvbnRlbnQ6Ly9jb250YWN0cy9wZW9wbGUnLCAnY29tLmFuZHJvaWQuY29udGFjdHMnKTtcclxuICAgICAgYXdhaXQgcmV0cnlJbnRlcnZhbCgxMCwgNTAwLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgcmVzID0gYXdhaXQgYWRiLnNoZWxsKFsnZHVtcHN5cycsICd3aW5kb3cnLCAnd2luZG93cyddKTtcclxuICAgICAgICAvLyBkZXBlbmRpbmcgb24gYXBpbGV2ZWwsIGFwcCBtaWdodCBzaG93IHVwIGFzIGFjdGl2ZSBpbiBvbmUgb2YgdGhlc2VcclxuICAgICAgICAvLyB0d28gZHVtcHN5cyBvdXRwdXQgZm9ybWF0c1xyXG4gICAgICAgIGxldCBmb2N1c1JlMSA9ICcobUN1cnJlbnRGb2N1cy4rXFxcXC5QZW9wbGVBY3Rpdml0eSknO1xyXG4gICAgICAgIGxldCBmb2N1c1JlMiA9ICcobUZvY3VzZWRBcHAuK1xcXFwuUGVvcGxlQWN0aXZpdHkpJztcclxuICAgICAgICByZXMuc2hvdWxkLm1hdGNoKG5ldyBSZWdFeHAoYCR7Zm9jdXNSZTF9fCR7Zm9jdXNSZTJ9YCkpO1xyXG4gICAgICB9KTtcclxuICAgICAgYXdhaXQgYWRiLmdvVG9Ib21lKCk7XHJcbiAgICB9KTtcclxuICB9KTtcclxuICBkZXNjcmliZSgnc3RhcnRBcHAnLCBhc3luYyAoKSA9PiB7XHJcbiAgICBpdCgnc2hvdWxkIGJlIGFibGUgdG8gc3RhcnQnLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGF3YWl0IGFkYi5pbnN0YWxsKGNvbnRhY3RNYW5hZ2VyUGF0aCk7XHJcbiAgICAgIGF3YWl0IGFkYi5zdGFydEFwcCh7cGtnOiAnY29tLmV4YW1wbGUuYW5kcm9pZC5jb250YWN0bWFuYWdlcicsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHk6ICdDb250YWN0TWFuYWdlcid9KTtcclxuICAgICAgYXdhaXQgYXNzZXJ0UGFja2FnZUFuZEFjdGl2aXR5KCk7XHJcblxyXG4gICAgfSk7XHJcbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciB3cm9uZyBhY3Rpdml0eScsIGFzeW5jICgpID0+IHtcclxuICAgICAgYXdhaXQgYWRiLmluc3RhbGwoY29udGFjdE1hbmFnZXJQYXRoKTtcclxuICAgICAgYXdhaXQgYWRiLnN0YXJ0QXBwKHtwa2c6ICdjb20uZXhhbXBsZS5hbmRyb2lkLmNvbnRhY3RtYW5hZ2VyJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eTogJ0NvbnRhY3RNYW5hZ2UnfSkuc2hvdWxkLmV2ZW50dWFsbHlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYmUucmVqZWN0ZWRXaXRoKCdBY3Rpdml0eScpO1xyXG4gICAgfSk7XHJcbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciB3cm9uZyB3YWl0IGFjdGl2aXR5JywgYXN5bmMgKCkgPT4ge1xyXG4gICAgICBhd2FpdCBhZGIuaW5zdGFsbChjb250YWN0TWFuYWdlclBhdGgpO1xyXG4gICAgICBhd2FpdCBhZGIuc3RhcnRBcHAoe3BrZzogJ2NvbS5leGFtcGxlLmFuZHJvaWQuY29udGFjdG1hbmFnZXInLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5OiAnQ29udGFjdE1hbmFnZXInLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRBY3Rpdml0eTogJ2ZvbycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdER1cmF0aW9uOiAxMDAwfSkuc2hvdWxkLmV2ZW50dWFsbHlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5iZS5yZWplY3RlZFdpdGgoJ2ZvbycpO1xyXG4gICAgfSk7XHJcbiAgICBpdCgnc2hvdWxkIHN0YXJ0IGFjdGl2aXR5IHdpdGggd2FpdCBhY3Rpdml0eScsIGFzeW5jICgpID0+IHtcclxuICAgICAgYXdhaXQgYWRiLmluc3RhbGwoY29udGFjdE1hbmFnZXJQYXRoKTtcclxuICAgICAgYXdhaXQgYWRiLnN0YXJ0QXBwKHtwa2c6ICdjb20uZXhhbXBsZS5hbmRyb2lkLmNvbnRhY3RtYW5hZ2VyJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eTogJ0NvbnRhY3RNYW5hZ2VyJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0QWN0aXZpdHk6ICcuQ29udGFjdE1hbmFnZXInfSk7XHJcbiAgICAgIGF3YWl0IGFzc2VydFBhY2thZ2VBbmRBY3Rpdml0eSgpO1xyXG4gICAgfSk7XHJcblxyXG4gIH0pO1xyXG4gIGl0KCdnZXRGb2N1c2VkUGFja2FnZUFuZEFjdGl2aXR5IHNob3VsZCBiZSBhYmxlIGdldCBwYWNrYWdlIGFuZCBhY3Rpdml0eScsIGFzeW5jICgpID0+IHtcclxuICAgIGF3YWl0IGFkYi5pbnN0YWxsKGNvbnRhY3RNYW5hZ2VyUGF0aCk7XHJcbiAgICBhd2FpdCBhZGIuc3RhcnRBcHAoe3BrZzogJ2NvbS5leGFtcGxlLmFuZHJvaWQuY29udGFjdG1hbmFnZXInLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eTogJ0NvbnRhY3RNYW5hZ2VyJ30pO1xyXG4gICAgYXdhaXQgYXNzZXJ0UGFja2FnZUFuZEFjdGl2aXR5KCk7XHJcbiAgfSk7XHJcbiAgaXQoJ2V4dHJhY3RTdHJpbmdzRnJvbUFwayBzaG91bGQgZ2V0IHN0cmluZ3MgZm9yIGRlZmF1bHQgbGFuZ3VhZ2UnLCBhc3luYyAoKSA9PiB7XHJcbiAgICBsZXQge2Fwa1N0cmluZ3N9ID0gYXdhaXQgYWRiLmV4dHJhY3RTdHJpbmdzRnJvbUFwayhjb250YWN0TWFuYWdlclBhdGgsIG51bGwsICcvdG1wJyk7XHJcbiAgICBhcGtTdHJpbmdzLnNhdmUuc2hvdWxkLmVxdWFsKCdTYXZlJyk7XHJcbiAgfSk7XHJcbiAgaXQoJ3Nob3VsZCBnZXQgZGV2aWNlIGxhbmd1YWdlIGFuZCBjb3VudHJ5JywgYXN5bmMgKCkgPT4ge1xyXG4gICAgWydlbicsICdmciddLnNob3VsZC5jb250YWluKGF3YWl0IGFkYi5nZXREZXZpY2VMYW5ndWFnZSgpKTtcclxuICAgIFsnVVMnLCAnRU5fVVMnLCAnRU4nLCAnRlInXS5zaG91bGQuY29udGFpbihhd2FpdCBhZGIuZ2V0RGV2aWNlQ291bnRyeSgpKTtcclxuICB9KTtcclxuICBpdCgnc2hvdWxkIHNldCBkZXZpY2UgbGFuZ3VhZ2UgYW5kIGNvdW50cnknLCBhc3luYyAoKSA9PiB7XHJcbiAgICBhd2FpdCBhZGIuc2V0RGV2aWNlTGFuZ3VhZ2UoJ2ZyJyk7XHJcbiAgICBhd2FpdCBhZGIuc2V0RGV2aWNlQ291bnRyeSgnZnInKTtcclxuICAgIGF3YWl0IGFkYi5yZWJvb3QoKTtcclxuICAgIGF3YWl0IGFkYi5nZXREZXZpY2VMYW5ndWFnZSgpLnNob3VsZC5ldmVudHVhbGx5LmVxdWFsKCdmcicpO1xyXG4gICAgYXdhaXQgYWRiLmdldERldmljZUNvdW50cnkoKS5zaG91bGQuZXZlbnR1YWxseS5lcXVhbCgnRlInKTtcclxuICAgIC8vIGNsZWFudXBcclxuICAgIGF3YWl0IGFkYi5zZXREZXZpY2VMYW5ndWFnZSgnZW4nKTtcclxuICAgIGF3YWl0IGFkYi5zZXREZXZpY2VDb3VudHJ5KCd1cycpO1xyXG4gIH0pO1xyXG59KTtcclxuIl0sInNvdXJjZVJvb3QiOiIuLlxcLi5cXC4uIn0=