appium-android-driver 5.7.1 → 5.7.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/build/index.js +1 -2
  3. package/build/lib/android-helpers.js +3 -27
  4. package/build/lib/android-helpers.js.map +1 -1
  5. package/build/lib/bootstrap.js +2 -9
  6. package/build/lib/bootstrap.js.map +1 -1
  7. package/build/lib/commands/actions.js +2 -3
  8. package/build/lib/commands/actions.js.map +1 -1
  9. package/build/lib/commands/alert.js +1 -2
  10. package/build/lib/commands/alert.js.map +1 -1
  11. package/build/lib/commands/app-management.js +3 -17
  12. package/build/lib/commands/app-management.js.map +1 -1
  13. package/build/lib/commands/context.js +2 -16
  14. package/build/lib/commands/context.js.map +1 -1
  15. package/build/lib/commands/element.js +2 -5
  16. package/build/lib/commands/element.js.map +1 -1
  17. package/build/lib/commands/emu-console.js +1 -3
  18. package/build/lib/commands/emu-console.js.map +1 -1
  19. package/build/lib/commands/file-actions.js +2 -14
  20. package/build/lib/commands/file-actions.js.map +1 -1
  21. package/build/lib/commands/find.js +1 -5
  22. package/build/lib/commands/find.js.map +1 -1
  23. package/build/lib/commands/general.js +2 -15
  24. package/build/lib/commands/general.js.map +1 -1
  25. package/build/lib/commands/index.js +2 -3
  26. package/build/lib/commands/index.js.map +1 -1
  27. package/build/lib/commands/intent.js +1 -5
  28. package/build/lib/commands/intent.js.map +1 -1
  29. package/build/lib/commands/log.js +1 -4
  30. package/build/lib/commands/log.js.map +1 -1
  31. package/build/lib/commands/media-projection.js +2 -6
  32. package/build/lib/commands/media-projection.js.map +1 -1
  33. package/build/lib/commands/network.js +1 -7
  34. package/build/lib/commands/network.js.map +1 -1
  35. package/build/lib/commands/performance.js +1 -8
  36. package/build/lib/commands/performance.js.map +1 -1
  37. package/build/lib/commands/recordscreen.js +2 -4
  38. package/build/lib/commands/recordscreen.js.map +1 -1
  39. package/build/lib/commands/shell.js +2 -2
  40. package/build/lib/commands/shell.js.map +1 -1
  41. package/build/lib/commands/streamscreen.js +5 -10
  42. package/build/lib/commands/streamscreen.js.map +1 -1
  43. package/build/lib/commands/system-bars.js +1 -4
  44. package/build/lib/commands/system-bars.js.map +1 -1
  45. package/build/lib/commands/touch.js +2 -10
  46. package/build/lib/commands/touch.js.map +1 -1
  47. package/build/lib/desired-caps.js +2 -3
  48. package/build/lib/desired-caps.js.map +1 -1
  49. package/build/lib/driver.js +2 -21
  50. package/build/lib/driver.js.map +1 -1
  51. package/build/lib/logger.js +2 -2
  52. package/build/lib/logger.js.map +1 -1
  53. package/build/lib/uiautomator.js +2 -4
  54. package/build/lib/uiautomator.js.map +1 -1
  55. package/build/lib/unlock-helpers.js +2 -4
  56. package/build/lib/unlock-helpers.js.map +1 -1
  57. package/build/lib/webview-helpers.js +2 -14
  58. package/build/lib/webview-helpers.js.map +1 -1
  59. package/lib/android-helpers.js +1 -1
  60. package/lib/bootstrap.js +1 -1
  61. package/lib/commands/actions.js +1 -1
  62. package/lib/commands/app-management.js +1 -1
  63. package/lib/commands/context.js +1 -1
  64. package/lib/commands/element.js +1 -1
  65. package/lib/commands/file-actions.js +1 -1
  66. package/lib/commands/general.js +1 -1
  67. package/lib/commands/media-projection.js +1 -1
  68. package/lib/commands/recordscreen.js +1 -1
  69. package/lib/commands/shell.js +1 -1
  70. package/lib/commands/streamscreen.js +1 -1
  71. package/lib/commands/touch.js +1 -1
  72. package/lib/driver.js +1 -1
  73. package/lib/logger.js +1 -1
  74. package/lib/uiautomator.js +1 -1
  75. package/lib/unlock-helpers.js +1 -1
  76. package/lib/webview-helpers.js +1 -1
  77. package/package.json +3 -2
@@ -1 +1 @@
1
- {"version":3,"file":"app-management.js","names":["APP_EXTENSIONS","RESOLVER_ACTIVITY_NAME","commands","isAppInstalled","appId","adb","mobileIsAppInstalled","opts","requireArgs","queryAppState","log","info","APP_STATE","NOT_INSTALLED","processExists","NOT_RUNNING","appIdRe","RegExp","_","escapeRegExp","line","dumpWindows","split","test","some","x","includes","RUNNING_IN_FOREGROUND","RUNNING_IN_BACKGROUND","mobileQueryAppState","activateApp","debug","apiLevel","getApiLevel","cmd","output","shell","e","errorAndThrow","message","activityName","resolveLaunchableActivity","preferCmd","stdout","Error","mobileActivateApp","removeApp","options","uninstallApk","mobileRemoveApp","terminateApp","forceStop","timeout","util","hasValue","isNaN","parseInt","waitForCondition","waitMs","intervalMs","mobileTerminateApp","installApp","appPath","localPath","helpers","configureApp","install","mobileInstallApp","mobileClearApp","errors","InvalidArgumentError","clear"],"sources":["../../../lib/commands/app-management.js"],"sourcesContent":["import _ from 'lodash';\nimport { waitForCondition } from 'asyncbox';\nimport { util } from 'appium/support';\nimport { APP_STATE } from '../android-helpers';\nimport { errors } from 'appium/driver';\nimport { requireArgs } from '../utils';\n\nconst APP_EXTENSIONS = ['.apk', '.apks'];\nconst RESOLVER_ACTIVITY_NAME = 'android/com.android.internal.app.ResolverActivity';\n\nconst commands = {};\n\n/**\n * Verify whether an application is installed or not\n *\n * @param {string} appId - Application package identifier\n * @returns {boolean} true if the app is installed\n */\ncommands.isAppInstalled = async function isAppInstalled (appId) {\n return await this.adb.isAppInstalled(appId);\n};\n\n/**\n * @typedef {Object} MobileAppInstalledOptions\n * @property {string} appId - Application package identifier. Must be always provided.\n */\n\n/**\n * Verify whether an application is installed or not\n *\n * @param {MobileAppInstalledOptions} opts\n * @returns {boolean} Same as in `isAppInstalled`\n */\ncommands.mobileIsAppInstalled = async function mobileIsAppInstalled (opts = {}) {\n const { appId } = requireArgs('appId', opts);\n return await this.isAppInstalled(appId);\n};\n\n/**\n * Queries the current state of the app.\n *\n * @param {string} appId - Application package identifier\n * @returns {number} The corresponding constant, which describes\n * the current application state:\n * 0 - is the app is not installed\n * 1 - if the app is installed, but is not running\n * 3 - if the app is running in the background\n * 4 - if the app is running in the foreground\n */\ncommands.queryAppState = async function queryAppState (appId) {\n this.log.info(`Querying the state of '${appId}'`);\n if (!await this.adb.isAppInstalled(appId)) {\n return APP_STATE.NOT_INSTALLED;\n }\n if (!await this.adb.processExists(appId)) {\n return APP_STATE.NOT_RUNNING;\n }\n const appIdRe = new RegExp(`\\\\b${_.escapeRegExp(appId)}/`);\n for (const line of (await this.adb.dumpWindows()).split('\\n')) {\n if (appIdRe.test(line) && ['mCurrentFocus', 'mFocusedApp'].some((x) => line.includes(x))) {\n return APP_STATE.RUNNING_IN_FOREGROUND;\n }\n }\n return APP_STATE.RUNNING_IN_BACKGROUND;\n};\n\n/**\n * @typedef {Object} MobileQueryAppStateOptions\n * @property {string} appId - Application package identifier. Must be always provided.\n */\n\n/**\n * Queries the current state of the app.\n *\n * @param {MobileQueryAppStateOptions} opts\n * @returns {number} Same as in `queryAppState`\n */\ncommands.mobileQueryAppState = async function mobileQueryAppState (opts = {}) {\n const { appId } = requireArgs('appId', opts);\n return await this.queryAppState(appId);\n};\n\n/**\n * Activates the given application or launches it if necessary.\n * The action literally simulates\n * clicking the corresponding application icon on the dashboard.\n *\n * @param {string} appId - Application package identifier\n * @throws {Error} If the app cannot be activated\n */\ncommands.activateApp = async function activateApp (appId) {\n this.log.debug(`Activating '${appId}'`);\n const apiLevel = await this.adb.getApiLevel();\n // Fallback to Monkey in older APIs\n if (apiLevel < 24) {\n // The monkey command could raise an issue as https://stackoverflow.com/questions/44860475/how-to-use-the-monkey-command-with-an-android-system-that-doesnt-have-physical\n // but '--pct-syskeys 0' could cause another background process issue. https://github.com/appium/appium/issues/16941#issuecomment-1129837285\n const cmd = ['monkey',\n '-p', appId,\n '-c', 'android.intent.category.LAUNCHER',\n '1'];\n let output = '';\n try {\n output = await this.adb.shell(cmd);\n this.log.debug(`Command stdout: ${output}`);\n } catch (e) {\n this.log.errorAndThrow(`Cannot activate '${appId}'. Original error: ${e.message}`);\n }\n if (output.includes('monkey aborted')) {\n this.log.errorAndThrow(`Cannot activate '${appId}'. Are you sure it is installed?`);\n }\n return;\n }\n\n let activityName = await this.adb.resolveLaunchableActivity(appId);\n if (activityName === RESOLVER_ACTIVITY_NAME) {\n // https://github.com/appium/appium/issues/17128\n this.log.debug(\n `The launchable activity name of '${appId}' was resolved to '${activityName}'. ` +\n `Switching the resolver to not use cmd`\n );\n activityName = await this.adb.resolveLaunchableActivity(appId, {preferCmd: false});\n }\n\n const stdout = await this.adb.shell([\n 'am', (apiLevel < 26) ? 'start' : 'start-activity',\n '-a', 'android.intent.action.MAIN',\n '-c', 'android.intent.category.LAUNCHER',\n // FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_RESET_TASK_IF_NEEDED\n // https://developer.android.com/reference/android/content/Intent#FLAG_ACTIVITY_NEW_TASK\n // https://developer.android.com/reference/android/content/Intent#FLAG_ACTIVITY_RESET_TASK_IF_NEEDED\n '-f', '0x10200000',\n '-n', activityName,\n ]);\n this.log.debug(stdout);\n if (/^error:/mi.test(stdout)) {\n throw new Error(`Cannot activate '${appId}'. Original error: ${stdout}`);\n }\n};\n\n/**\n * @typedef {Object} MobileActivateAppOptions\n * @property {string} appId - Application package identifier. Must be always provided.\n */\n\n/**\n * Activates the given application or launches it if necessary.\n * The action literally simulates\n * clicking the corresponding application icon on the dashboard.\n *\n * @param {MobileActivateAppOptions} opts\n * @throws {Error} If the app cannot be activated\n */\ncommands.mobileActivateApp = async function mobileActivateApp (opts = {}) {\n const { appId } = requireArgs('appId', opts);\n return await this.activateApp(appId);\n};\n\n/**\n * @typedef {Object} UninstallOptions\n * @property {number} timeout [20000] - The count of milliseconds to wait until the\n * app is uninstalled.\n * @property {boolean} keepData [false] - Set to true in order to keep the\n * application data and cache folders after uninstall.\n */\n\n/**\n * Remove the corresponding application if is installed.\n * The call is ignored if the app is not installed.\n *\n * @param {string} appId - Application package identifier\n * @param {?UninstallOptions} options - The set of removal options\n * @returns {boolean} True if the package was found on the device and\n * successfully uninstalled.\n */\ncommands.removeApp = async function removeApp (appId, options = {}) {\n return await this.adb.uninstallApk(appId, options);\n};\n\n/**\n * @typedef {Object} MobileRemoveAppOptions\n * @property {string} appId - Application package identifier. Must be always provided.\n */\n\n/**\n * Remove the corresponding application if is installed.\n * The call is ignored if the app is not installed.\n *\n * @param {MobileRemoveAppOptions} opts\n * @returns {boolean} Same as in `removeApp`\n */\ncommands.mobileRemoveApp = async function mobileRemoveApp (opts = {}) {\n const { appId } = requireArgs('appId', opts);\n return await this.removeApp(appId, opts);\n};\n\n/**\n * @typedef {Object} TerminateOptions\n * @property {number|string} timeout [500] - The count of milliseconds to wait until the\n * app is terminated. The method will skip\n * checking the app state check if the timeout\n * was lower or equal to zero. Then, the return\n * value will be true.\n */\n\n/**\n * Terminates the app if it is running. If the given timeout was lower or equal to zero,\n * it returns true after terminating the app without checking the app state.\n *\n * @param {string} appId - Application package identifier\n * @param {?TerminateOptions} options - The set of application termination options\n * @returns {boolean} True if the app has been successfully terminated.\n * @throws {Error} if the app has not been terminated within the given timeout.\n */\ncommands.terminateApp = async function terminateApp (appId, options = {}) {\n this.log.info(`Terminating '${appId}'`);\n if (!(await this.adb.processExists(appId))) {\n this.log.info(`The app '${appId}' is not running`);\n return false;\n }\n await this.adb.forceStop(appId);\n const timeout = util.hasValue(options.timeout) && !isNaN(options.timeout) ? parseInt(options.timeout, 10) : 500;\n\n if (timeout <= 0) {\n this.log.info(`'${appId}' has been terminated. Skip checking the application process state ` +\n `since the timeout was set as ${timeout}ms`);\n return true;\n }\n\n try {\n await waitForCondition(async () => await this.queryAppState(appId) <= APP_STATE.NOT_RUNNING,\n {waitMs: timeout, intervalMs: 100});\n } catch (e) {\n this.log.errorAndThrow(`'${appId}' is still running after ${timeout}ms timeout`);\n }\n this.log.info(`'${appId}' has been successfully terminated`);\n return true;\n};\n\n/**\n * @typedef {Object} MobileTerminateAppOptions\n * @property {string} appId - Application package identifier. Must be always provided.\n * @property {number|string} timeout [500] - The count of milliseconds to wait until the\n * app is terminated.\n */\n\n/**\n * Terminates the app if it is running.\n *\n * @param {MobileTerminateAppOptions} opts\n * @returns {boolean} Same as in `terminateApp`\n * @throws {Error} if the app has not been terminated within the given timeout.\n */\ncommands.mobileTerminateApp = async function mobileTerminateApp (opts = {}) {\n const { appId } = requireArgs('appId', opts);\n return await this.terminateApp(appId, opts);\n};\n\n/**\n * @typedef {Object} InstallOptions\n * @property {number} timeout [60000] - The count of milliseconds to wait until the\n * app is installed.\n * @property {boolean} allowTestPackages [false] - Set to true in order to allow test\n * packages installation.\n * @property {boolean} useSdcard [false] - Set to true to install the app on sdcard\n * instead of the device memory.\n * @property {boolean} grantPermissions [false] - Set to true in order to grant all the\n * permissions requested in the application's manifest\n * automatically after the installation is completed\n * under Android 6+.\n * @property {boolean} replace [true] - Set it to false if you don't want\n * the application to be upgraded/reinstalled\n * if it is already present on the device.\n */\n\n/**\n * Installs the given application to the device under test\n *\n * @param {string} appPath - The local apk path or a remote url\n * @param {?InstallOptions} options - The set of installation options\n * @throws {Error} if the given apk does not exist or is not reachable\n */\ncommands.installApp = async function installApp (appPath, options = {}) {\n const localPath = await this.helpers.configureApp(appPath, APP_EXTENSIONS);\n await this.adb.install(localPath, options);\n};\n\n/**\n * @typedef {Object} MobileInstallAppOptions\n * @property {string} appPath - The local apk path or a remote url. Must be always provided.\n * @property {number} timeout [60000] - The count of milliseconds to wait until the\n * app is installed.\n * @property {boolean} allowTestPackages [false] - Set to true in order to allow test\n * packages installation.\n * @property {boolean} useSdcard [false] - Set to true to install the app on sdcard\n * instead of the device memory.\n * @property {boolean} grantPermissions [false] - Set to true in order to grant all the\n * permissions requested in the application's manifest\n * automatically after the installation is completed\n * under Android 6+.\n * @property {boolean} replace [true] - Set it to false if you don't want\n * the application to be upgraded/reinstalled\n * if it is already present on the device.\n */\n\n/**\n * Installs the given application to the device under test\n *\n * @param {MobileInstallAppOptions} opts\n * @throws {Error} if the given apk does not exist or is not reachable\n */\ncommands.mobileInstallApp = async function mobileInstallApp (opts = {}) {\n const { appPath } = requireArgs('appPath', opts);\n return await this.installApp(appPath, opts);\n};\n\n/**\n * @typedef {Object} ClearAppOptions\n * @property {!string} appId The identifier of the application package to be cleared\n */\n\n/**\n * Deletes all data associated with a package.\n *\n * @param {ClearAppOptions} opts\n * @throws {Error} If cleaning of the app data fails\n */\ncommands.mobileClearApp = async function mobileClearApp (opts = {}) {\n const {appId} = opts;\n if (!appId) {\n throw new errors.InvalidArgumentError(`The 'appId' argument is required`);\n }\n await this.adb.clear(appId);\n};\n\nexport { commands };\nexport default commands;\n"],"mappings":";;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA,MAAMA,cAAc,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;AACxC,MAAMC,sBAAsB,GAAG,mDAAmD;AAElF,MAAMC,QAAQ,GAAG,CAAC,CAAC;;AAAC;AAQpBA,QAAQ,CAACC,cAAc,GAAG,eAAeA,cAAc,CAAEC,KAAK,EAAE;EAC9D,OAAO,MAAM,IAAI,CAACC,GAAG,CAACF,cAAc,CAACC,KAAK,CAAC;AAC7C,CAAC;;AAaDF,QAAQ,CAACI,oBAAoB,GAAG,eAAeA,oBAAoB,CAAEC,IAAI,GAAG,CAAC,CAAC,EAAE;EAC9E,MAAM;IAAEH;EAAM,CAAC,GAAG,IAAAI,kBAAW,EAAC,OAAO,EAAED,IAAI,CAAC;EAC5C,OAAO,MAAM,IAAI,CAACJ,cAAc,CAACC,KAAK,CAAC;AACzC,CAAC;;AAaDF,QAAQ,CAACO,aAAa,GAAG,eAAeA,aAAa,CAAEL,KAAK,EAAE;EAC5D,IAAI,CAACM,GAAG,CAACC,IAAI,CAAE,0BAAyBP,KAAM,GAAE,CAAC;EACjD,IAAI,EAAC,MAAM,IAAI,CAACC,GAAG,CAACF,cAAc,CAACC,KAAK,CAAC,GAAE;IACzC,OAAOQ,yBAAS,CAACC,aAAa;EAChC;EACA,IAAI,EAAC,MAAM,IAAI,CAACR,GAAG,CAACS,aAAa,CAACV,KAAK,CAAC,GAAE;IACxC,OAAOQ,yBAAS,CAACG,WAAW;EAC9B;EACA,MAAMC,OAAO,GAAG,IAAIC,MAAM,CAAE,MAAKC,eAAC,CAACC,YAAY,CAACf,KAAK,CAAE,GAAE,CAAC;EAC1D,KAAK,MAAMgB,IAAI,IAAI,CAAC,MAAM,IAAI,CAACf,GAAG,CAACgB,WAAW,EAAE,EAAEC,KAAK,CAAC,IAAI,CAAC,EAAE;IAC7D,IAAIN,OAAO,CAACO,IAAI,CAACH,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,aAAa,CAAC,CAACI,IAAI,CAAEC,CAAC,IAAKL,IAAI,CAACM,QAAQ,CAACD,CAAC,CAAC,CAAC,EAAE;MACxF,OAAOb,yBAAS,CAACe,qBAAqB;IACxC;EACF;EACA,OAAOf,yBAAS,CAACgB,qBAAqB;AACxC,CAAC;;AAaD1B,QAAQ,CAAC2B,mBAAmB,GAAG,eAAeA,mBAAmB,CAAEtB,IAAI,GAAG,CAAC,CAAC,EAAE;EAC5E,MAAM;IAAEH;EAAM,CAAC,GAAG,IAAAI,kBAAW,EAAC,OAAO,EAAED,IAAI,CAAC;EAC5C,OAAO,MAAM,IAAI,CAACE,aAAa,CAACL,KAAK,CAAC;AACxC,CAAC;;AAUDF,QAAQ,CAAC4B,WAAW,GAAG,eAAeA,WAAW,CAAE1B,KAAK,EAAE;EACxD,IAAI,CAACM,GAAG,CAACqB,KAAK,CAAE,eAAc3B,KAAM,GAAE,CAAC;EACvC,MAAM4B,QAAQ,GAAG,MAAM,IAAI,CAAC3B,GAAG,CAAC4B,WAAW,EAAE;EAE7C,IAAID,QAAQ,GAAG,EAAE,EAAE;IAGjB,MAAME,GAAG,GAAG,CAAC,QAAQ,EACnB,IAAI,EAAE9B,KAAK,EACX,IAAI,EAAE,kCAAkC,EACxC,GAAG,CAAC;IACN,IAAI+B,MAAM,GAAG,EAAE;IACf,IAAI;MACFA,MAAM,GAAG,MAAM,IAAI,CAAC9B,GAAG,CAAC+B,KAAK,CAACF,GAAG,CAAC;MAClC,IAAI,CAACxB,GAAG,CAACqB,KAAK,CAAE,mBAAkBI,MAAO,EAAC,CAAC;IAC7C,CAAC,CAAC,OAAOE,CAAC,EAAE;MACV,IAAI,CAAC3B,GAAG,CAAC4B,aAAa,CAAE,oBAAmBlC,KAAM,sBAAqBiC,CAAC,CAACE,OAAQ,EAAC,CAAC;IACpF;IACA,IAAIJ,MAAM,CAACT,QAAQ,CAAC,gBAAgB,CAAC,EAAE;MACrC,IAAI,CAAChB,GAAG,CAAC4B,aAAa,CAAE,oBAAmBlC,KAAM,kCAAiC,CAAC;IACrF;IACA;EACF;EAEA,IAAIoC,YAAY,GAAG,MAAM,IAAI,CAACnC,GAAG,CAACoC,yBAAyB,CAACrC,KAAK,CAAC;EAClE,IAAIoC,YAAY,KAAKvC,sBAAsB,EAAE;IAE3C,IAAI,CAACS,GAAG,CAACqB,KAAK,CACX,oCAAmC3B,KAAM,sBAAqBoC,YAAa,KAAI,GAC/E,uCAAsC,CACxC;IACDA,YAAY,GAAG,MAAM,IAAI,CAACnC,GAAG,CAACoC,yBAAyB,CAACrC,KAAK,EAAE;MAACsC,SAAS,EAAE;IAAK,CAAC,CAAC;EACpF;EAEA,MAAMC,MAAM,GAAG,MAAM,IAAI,CAACtC,GAAG,CAAC+B,KAAK,CAAC,CAClC,IAAI,EAAGJ,QAAQ,GAAG,EAAE,GAAI,OAAO,GAAG,gBAAgB,EAClD,IAAI,EAAE,4BAA4B,EAClC,IAAI,EAAE,kCAAkC;EAIxC,IAAI,EAAE,YAAY,EAClB,IAAI,EAAEQ,YAAY,CACnB,CAAC;EACF,IAAI,CAAC9B,GAAG,CAACqB,KAAK,CAACY,MAAM,CAAC;EACtB,IAAI,WAAW,CAACpB,IAAI,CAACoB,MAAM,CAAC,EAAE;IAC5B,MAAM,IAAIC,KAAK,CAAE,oBAAmBxC,KAAM,sBAAqBuC,MAAO,EAAC,CAAC;EAC1E;AACF,CAAC;;AAeDzC,QAAQ,CAAC2C,iBAAiB,GAAG,eAAeA,iBAAiB,CAAEtC,IAAI,GAAG,CAAC,CAAC,EAAE;EACxE,MAAM;IAAEH;EAAM,CAAC,GAAG,IAAAI,kBAAW,EAAC,OAAO,EAAED,IAAI,CAAC;EAC5C,OAAO,MAAM,IAAI,CAACuB,WAAW,CAAC1B,KAAK,CAAC;AACtC,CAAC;;AAmBDF,QAAQ,CAAC4C,SAAS,GAAG,eAAeA,SAAS,CAAE1C,KAAK,EAAE2C,OAAO,GAAG,CAAC,CAAC,EAAE;EAClE,OAAO,MAAM,IAAI,CAAC1C,GAAG,CAAC2C,YAAY,CAAC5C,KAAK,EAAE2C,OAAO,CAAC;AACpD,CAAC;;AAcD7C,QAAQ,CAAC+C,eAAe,GAAG,eAAeA,eAAe,CAAE1C,IAAI,GAAG,CAAC,CAAC,EAAE;EACpE,MAAM;IAAEH;EAAM,CAAC,GAAG,IAAAI,kBAAW,EAAC,OAAO,EAAED,IAAI,CAAC;EAC5C,OAAO,MAAM,IAAI,CAACuC,SAAS,CAAC1C,KAAK,EAAEG,IAAI,CAAC;AAC1C,CAAC;;AAoBDL,QAAQ,CAACgD,YAAY,GAAG,eAAeA,YAAY,CAAE9C,KAAK,EAAE2C,OAAO,GAAG,CAAC,CAAC,EAAE;EACxE,IAAI,CAACrC,GAAG,CAACC,IAAI,CAAE,gBAAeP,KAAM,GAAE,CAAC;EACvC,IAAI,EAAE,MAAM,IAAI,CAACC,GAAG,CAACS,aAAa,CAACV,KAAK,CAAC,CAAC,EAAE;IAC1C,IAAI,CAACM,GAAG,CAACC,IAAI,CAAE,YAAWP,KAAM,kBAAiB,CAAC;IAClD,OAAO,KAAK;EACd;EACA,MAAM,IAAI,CAACC,GAAG,CAAC8C,SAAS,CAAC/C,KAAK,CAAC;EAC/B,MAAMgD,OAAO,GAAGC,aAAI,CAACC,QAAQ,CAACP,OAAO,CAACK,OAAO,CAAC,IAAI,CAACG,KAAK,CAACR,OAAO,CAACK,OAAO,CAAC,GAAGI,QAAQ,CAACT,OAAO,CAACK,OAAO,EAAE,EAAE,CAAC,GAAG,GAAG;EAE/G,IAAIA,OAAO,IAAI,CAAC,EAAE;IAChB,IAAI,CAAC1C,GAAG,CAACC,IAAI,CAAE,IAAGP,KAAM,qEAAoE,GACzF,gCAA+BgD,OAAQ,IAAG,CAAC;IAC9C,OAAO,IAAI;EACb;EAEA,IAAI;IACF,MAAM,IAAAK,0BAAgB,EAAC,YAAY,OAAM,IAAI,CAAChD,aAAa,CAACL,KAAK,CAAC,KAAIQ,yBAAS,CAACG,WAAW,EACzF;MAAC2C,MAAM,EAAEN,OAAO;MAAEO,UAAU,EAAE;IAAG,CAAC,CAAC;EACvC,CAAC,CAAC,OAAOtB,CAAC,EAAE;IACV,IAAI,CAAC3B,GAAG,CAAC4B,aAAa,CAAE,IAAGlC,KAAM,4BAA2BgD,OAAQ,YAAW,CAAC;EAClF;EACA,IAAI,CAAC1C,GAAG,CAACC,IAAI,CAAE,IAAGP,KAAM,oCAAmC,CAAC;EAC5D,OAAO,IAAI;AACb,CAAC;;AAgBDF,QAAQ,CAAC0D,kBAAkB,GAAG,eAAeA,kBAAkB,CAAErD,IAAI,GAAG,CAAC,CAAC,EAAE;EAC1E,MAAM;IAAEH;EAAM,CAAC,GAAG,IAAAI,kBAAW,EAAC,OAAO,EAAED,IAAI,CAAC;EAC5C,OAAO,MAAM,IAAI,CAAC2C,YAAY,CAAC9C,KAAK,EAAEG,IAAI,CAAC;AAC7C,CAAC;;AA0BDL,QAAQ,CAAC2D,UAAU,GAAG,eAAeA,UAAU,CAAEC,OAAO,EAAEf,OAAO,GAAG,CAAC,CAAC,EAAE;EACtE,MAAMgB,SAAS,GAAG,MAAM,IAAI,CAACC,OAAO,CAACC,YAAY,CAACH,OAAO,EAAE9D,cAAc,CAAC;EAC1E,MAAM,IAAI,CAACK,GAAG,CAAC6D,OAAO,CAACH,SAAS,EAAEhB,OAAO,CAAC;AAC5C,CAAC;;AA0BD7C,QAAQ,CAACiE,gBAAgB,GAAG,eAAeA,gBAAgB,CAAE5D,IAAI,GAAG,CAAC,CAAC,EAAE;EACtE,MAAM;IAAEuD;EAAQ,CAAC,GAAG,IAAAtD,kBAAW,EAAC,SAAS,EAAED,IAAI,CAAC;EAChD,OAAO,MAAM,IAAI,CAACsD,UAAU,CAACC,OAAO,EAAEvD,IAAI,CAAC;AAC7C,CAAC;;AAaDL,QAAQ,CAACkE,cAAc,GAAG,eAAeA,cAAc,CAAE7D,IAAI,GAAG,CAAC,CAAC,EAAE;EAClE,MAAM;IAACH;EAAK,CAAC,GAAGG,IAAI;EACpB,IAAI,CAACH,KAAK,EAAE;IACV,MAAM,IAAIiE,cAAM,CAACC,oBAAoB,CAAE,kCAAiC,CAAC;EAC3E;EACA,MAAM,IAAI,CAACjE,GAAG,CAACkE,KAAK,CAACnE,KAAK,CAAC;AAC7B,CAAC;AAAC,eAGaF,QAAQ;AAAA"}
1
+ {"version":3,"file":"app-management.js","names":["APP_EXTENSIONS","RESOLVER_ACTIVITY_NAME","commands","isAppInstalled","appId","adb","mobileIsAppInstalled","opts","requireArgs","queryAppState","log","info","APP_STATE","NOT_INSTALLED","processExists","NOT_RUNNING","appIdRe","RegExp","_","escapeRegExp","line","dumpWindows","split","test","some","x","includes","RUNNING_IN_FOREGROUND","RUNNING_IN_BACKGROUND","mobileQueryAppState","activateApp","debug","apiLevel","getApiLevel","cmd","output","shell","e","errorAndThrow","message","activityName","resolveLaunchableActivity","preferCmd","stdout","Error","mobileActivateApp","removeApp","options","uninstallApk","mobileRemoveApp","terminateApp","forceStop","timeout","util","hasValue","isNaN","parseInt","waitForCondition","waitMs","intervalMs","mobileTerminateApp","installApp","appPath","localPath","helpers","configureApp","install","mobileInstallApp","mobileClearApp","errors","InvalidArgumentError","clear"],"sources":["../../../lib/commands/app-management.js"],"sourcesContent":["import _ from 'lodash';\nimport { waitForCondition } from 'asyncbox';\nimport { util } from '@appium/support';\nimport { APP_STATE } from '../android-helpers';\nimport { errors } from 'appium/driver';\nimport { requireArgs } from '../utils';\n\nconst APP_EXTENSIONS = ['.apk', '.apks'];\nconst RESOLVER_ACTIVITY_NAME = 'android/com.android.internal.app.ResolverActivity';\n\nconst commands = {};\n\n/**\n * Verify whether an application is installed or not\n *\n * @param {string} appId - Application package identifier\n * @returns {boolean} true if the app is installed\n */\ncommands.isAppInstalled = async function isAppInstalled (appId) {\n return await this.adb.isAppInstalled(appId);\n};\n\n/**\n * @typedef {Object} MobileAppInstalledOptions\n * @property {string} appId - Application package identifier. Must be always provided.\n */\n\n/**\n * Verify whether an application is installed or not\n *\n * @param {MobileAppInstalledOptions} opts\n * @returns {boolean} Same as in `isAppInstalled`\n */\ncommands.mobileIsAppInstalled = async function mobileIsAppInstalled (opts = {}) {\n const { appId } = requireArgs('appId', opts);\n return await this.isAppInstalled(appId);\n};\n\n/**\n * Queries the current state of the app.\n *\n * @param {string} appId - Application package identifier\n * @returns {number} The corresponding constant, which describes\n * the current application state:\n * 0 - is the app is not installed\n * 1 - if the app is installed, but is not running\n * 3 - if the app is running in the background\n * 4 - if the app is running in the foreground\n */\ncommands.queryAppState = async function queryAppState (appId) {\n this.log.info(`Querying the state of '${appId}'`);\n if (!await this.adb.isAppInstalled(appId)) {\n return APP_STATE.NOT_INSTALLED;\n }\n if (!await this.adb.processExists(appId)) {\n return APP_STATE.NOT_RUNNING;\n }\n const appIdRe = new RegExp(`\\\\b${_.escapeRegExp(appId)}/`);\n for (const line of (await this.adb.dumpWindows()).split('\\n')) {\n if (appIdRe.test(line) && ['mCurrentFocus', 'mFocusedApp'].some((x) => line.includes(x))) {\n return APP_STATE.RUNNING_IN_FOREGROUND;\n }\n }\n return APP_STATE.RUNNING_IN_BACKGROUND;\n};\n\n/**\n * @typedef {Object} MobileQueryAppStateOptions\n * @property {string} appId - Application package identifier. Must be always provided.\n */\n\n/**\n * Queries the current state of the app.\n *\n * @param {MobileQueryAppStateOptions} opts\n * @returns {number} Same as in `queryAppState`\n */\ncommands.mobileQueryAppState = async function mobileQueryAppState (opts = {}) {\n const { appId } = requireArgs('appId', opts);\n return await this.queryAppState(appId);\n};\n\n/**\n * Activates the given application or launches it if necessary.\n * The action literally simulates\n * clicking the corresponding application icon on the dashboard.\n *\n * @param {string} appId - Application package identifier\n * @throws {Error} If the app cannot be activated\n */\ncommands.activateApp = async function activateApp (appId) {\n this.log.debug(`Activating '${appId}'`);\n const apiLevel = await this.adb.getApiLevel();\n // Fallback to Monkey in older APIs\n if (apiLevel < 24) {\n // The monkey command could raise an issue as https://stackoverflow.com/questions/44860475/how-to-use-the-monkey-command-with-an-android-system-that-doesnt-have-physical\n // but '--pct-syskeys 0' could cause another background process issue. https://github.com/appium/appium/issues/16941#issuecomment-1129837285\n const cmd = ['monkey',\n '-p', appId,\n '-c', 'android.intent.category.LAUNCHER',\n '1'];\n let output = '';\n try {\n output = await this.adb.shell(cmd);\n this.log.debug(`Command stdout: ${output}`);\n } catch (e) {\n this.log.errorAndThrow(`Cannot activate '${appId}'. Original error: ${e.message}`);\n }\n if (output.includes('monkey aborted')) {\n this.log.errorAndThrow(`Cannot activate '${appId}'. Are you sure it is installed?`);\n }\n return;\n }\n\n let activityName = await this.adb.resolveLaunchableActivity(appId);\n if (activityName === RESOLVER_ACTIVITY_NAME) {\n // https://github.com/appium/appium/issues/17128\n this.log.debug(\n `The launchable activity name of '${appId}' was resolved to '${activityName}'. ` +\n `Switching the resolver to not use cmd`\n );\n activityName = await this.adb.resolveLaunchableActivity(appId, {preferCmd: false});\n }\n\n const stdout = await this.adb.shell([\n 'am', (apiLevel < 26) ? 'start' : 'start-activity',\n '-a', 'android.intent.action.MAIN',\n '-c', 'android.intent.category.LAUNCHER',\n // FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_RESET_TASK_IF_NEEDED\n // https://developer.android.com/reference/android/content/Intent#FLAG_ACTIVITY_NEW_TASK\n // https://developer.android.com/reference/android/content/Intent#FLAG_ACTIVITY_RESET_TASK_IF_NEEDED\n '-f', '0x10200000',\n '-n', activityName,\n ]);\n this.log.debug(stdout);\n if (/^error:/mi.test(stdout)) {\n throw new Error(`Cannot activate '${appId}'. Original error: ${stdout}`);\n }\n};\n\n/**\n * @typedef {Object} MobileActivateAppOptions\n * @property {string} appId - Application package identifier. Must be always provided.\n */\n\n/**\n * Activates the given application or launches it if necessary.\n * The action literally simulates\n * clicking the corresponding application icon on the dashboard.\n *\n * @param {MobileActivateAppOptions} opts\n * @throws {Error} If the app cannot be activated\n */\ncommands.mobileActivateApp = async function mobileActivateApp (opts = {}) {\n const { appId } = requireArgs('appId', opts);\n return await this.activateApp(appId);\n};\n\n/**\n * @typedef {Object} UninstallOptions\n * @property {number} timeout [20000] - The count of milliseconds to wait until the\n * app is uninstalled.\n * @property {boolean} keepData [false] - Set to true in order to keep the\n * application data and cache folders after uninstall.\n */\n\n/**\n * Remove the corresponding application if is installed.\n * The call is ignored if the app is not installed.\n *\n * @param {string} appId - Application package identifier\n * @param {?UninstallOptions} options - The set of removal options\n * @returns {boolean} True if the package was found on the device and\n * successfully uninstalled.\n */\ncommands.removeApp = async function removeApp (appId, options = {}) {\n return await this.adb.uninstallApk(appId, options);\n};\n\n/**\n * @typedef {Object} MobileRemoveAppOptions\n * @property {string} appId - Application package identifier. Must be always provided.\n */\n\n/**\n * Remove the corresponding application if is installed.\n * The call is ignored if the app is not installed.\n *\n * @param {MobileRemoveAppOptions} opts\n * @returns {boolean} Same as in `removeApp`\n */\ncommands.mobileRemoveApp = async function mobileRemoveApp (opts = {}) {\n const { appId } = requireArgs('appId', opts);\n return await this.removeApp(appId, opts);\n};\n\n/**\n * @typedef {Object} TerminateOptions\n * @property {number|string} timeout [500] - The count of milliseconds to wait until the\n * app is terminated. The method will skip\n * checking the app state check if the timeout\n * was lower or equal to zero. Then, the return\n * value will be true.\n */\n\n/**\n * Terminates the app if it is running. If the given timeout was lower or equal to zero,\n * it returns true after terminating the app without checking the app state.\n *\n * @param {string} appId - Application package identifier\n * @param {?TerminateOptions} options - The set of application termination options\n * @returns {boolean} True if the app has been successfully terminated.\n * @throws {Error} if the app has not been terminated within the given timeout.\n */\ncommands.terminateApp = async function terminateApp (appId, options = {}) {\n this.log.info(`Terminating '${appId}'`);\n if (!(await this.adb.processExists(appId))) {\n this.log.info(`The app '${appId}' is not running`);\n return false;\n }\n await this.adb.forceStop(appId);\n const timeout = util.hasValue(options.timeout) && !isNaN(options.timeout) ? parseInt(options.timeout, 10) : 500;\n\n if (timeout <= 0) {\n this.log.info(`'${appId}' has been terminated. Skip checking the application process state ` +\n `since the timeout was set as ${timeout}ms`);\n return true;\n }\n\n try {\n await waitForCondition(async () => await this.queryAppState(appId) <= APP_STATE.NOT_RUNNING,\n {waitMs: timeout, intervalMs: 100});\n } catch (e) {\n this.log.errorAndThrow(`'${appId}' is still running after ${timeout}ms timeout`);\n }\n this.log.info(`'${appId}' has been successfully terminated`);\n return true;\n};\n\n/**\n * @typedef {Object} MobileTerminateAppOptions\n * @property {string} appId - Application package identifier. Must be always provided.\n * @property {number|string} timeout [500] - The count of milliseconds to wait until the\n * app is terminated.\n */\n\n/**\n * Terminates the app if it is running.\n *\n * @param {MobileTerminateAppOptions} opts\n * @returns {boolean} Same as in `terminateApp`\n * @throws {Error} if the app has not been terminated within the given timeout.\n */\ncommands.mobileTerminateApp = async function mobileTerminateApp (opts = {}) {\n const { appId } = requireArgs('appId', opts);\n return await this.terminateApp(appId, opts);\n};\n\n/**\n * @typedef {Object} InstallOptions\n * @property {number} timeout [60000] - The count of milliseconds to wait until the\n * app is installed.\n * @property {boolean} allowTestPackages [false] - Set to true in order to allow test\n * packages installation.\n * @property {boolean} useSdcard [false] - Set to true to install the app on sdcard\n * instead of the device memory.\n * @property {boolean} grantPermissions [false] - Set to true in order to grant all the\n * permissions requested in the application's manifest\n * automatically after the installation is completed\n * under Android 6+.\n * @property {boolean} replace [true] - Set it to false if you don't want\n * the application to be upgraded/reinstalled\n * if it is already present on the device.\n */\n\n/**\n * Installs the given application to the device under test\n *\n * @param {string} appPath - The local apk path or a remote url\n * @param {?InstallOptions} options - The set of installation options\n * @throws {Error} if the given apk does not exist or is not reachable\n */\ncommands.installApp = async function installApp (appPath, options = {}) {\n const localPath = await this.helpers.configureApp(appPath, APP_EXTENSIONS);\n await this.adb.install(localPath, options);\n};\n\n/**\n * @typedef {Object} MobileInstallAppOptions\n * @property {string} appPath - The local apk path or a remote url. Must be always provided.\n * @property {number} timeout [60000] - The count of milliseconds to wait until the\n * app is installed.\n * @property {boolean} allowTestPackages [false] - Set to true in order to allow test\n * packages installation.\n * @property {boolean} useSdcard [false] - Set to true to install the app on sdcard\n * instead of the device memory.\n * @property {boolean} grantPermissions [false] - Set to true in order to grant all the\n * permissions requested in the application's manifest\n * automatically after the installation is completed\n * under Android 6+.\n * @property {boolean} replace [true] - Set it to false if you don't want\n * the application to be upgraded/reinstalled\n * if it is already present on the device.\n */\n\n/**\n * Installs the given application to the device under test\n *\n * @param {MobileInstallAppOptions} opts\n * @throws {Error} if the given apk does not exist or is not reachable\n */\ncommands.mobileInstallApp = async function mobileInstallApp (opts = {}) {\n const { appPath } = requireArgs('appPath', opts);\n return await this.installApp(appPath, opts);\n};\n\n/**\n * @typedef {Object} ClearAppOptions\n * @property {!string} appId The identifier of the application package to be cleared\n */\n\n/**\n * Deletes all data associated with a package.\n *\n * @param {ClearAppOptions} opts\n * @throws {Error} If cleaning of the app data fails\n */\ncommands.mobileClearApp = async function mobileClearApp (opts = {}) {\n const {appId} = opts;\n if (!appId) {\n throw new errors.InvalidArgumentError(`The 'appId' argument is required`);\n }\n await this.adb.clear(appId);\n};\n\nexport { commands };\nexport default commands;\n"],"mappings":"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"}
@@ -10,7 +10,7 @@ var _lodash = _interopRequireDefault(require("lodash"));
10
10
  var _appiumChromedriver = _interopRequireDefault(require("appium-chromedriver"));
11
11
  var _portfinder = _interopRequireDefault(require("portfinder"));
12
12
  var _bluebird = _interopRequireDefault(require("bluebird"));
13
- var _support = require("appium/support");
13
+ var _support = require("@appium/support");
14
14
  var _driver = require("appium/driver");
15
15
  var _webviewHelpers = _interopRequireWildcard(require("../webview-helpers"));
16
16
  var _androidHelpers = require("../android-helpers");
@@ -20,7 +20,6 @@ const CHROMEDRIVER_AUTODOWNLOAD_FEATURE = 'chromedriver_autodownload';
20
20
  let commands = {},
21
21
  helpers = {},
22
22
  extensions = {};
23
-
24
23
  exports.helpers = helpers;
25
24
  exports.commands = commands;
26
25
  commands.getCurrentContext = async function getCurrentContext() {
@@ -47,7 +46,6 @@ commands.setContext = async function setContext(name) {
47
46
  await this.switchContext(name, webviewsMapping);
48
47
  this.curContext = name;
49
48
  };
50
-
51
49
  commands.mobileGetContexts = async function mobileGetContexts() {
52
50
  const opts = {
53
51
  androidDeviceSocket: this.opts.androidDeviceSocket,
@@ -80,7 +78,6 @@ helpers.switchContext = async function switchContext(name, webviewsMapping) {
80
78
  throw new Error(`Didn't know how to handle switching to context '${name}'`);
81
79
  }
82
80
  };
83
-
84
81
  helpers.defaultContextName = function defaultContextName() {
85
82
  return _webviewHelpers.NATIVE_WIN;
86
83
  };
@@ -90,7 +87,6 @@ helpers.defaultWebviewName = function defaultWebviewName() {
90
87
  helpers.isWebContext = function isWebContext() {
91
88
  return this.curContext !== null && this.curContext !== _webviewHelpers.NATIVE_WIN;
92
89
  };
93
-
94
90
  helpers.startChromedriverProxy = async function startChromedriverProxy(context, webviewsMapping) {
95
91
  this.log.debug(`Connecting to chrome-backed webview context '${context}'`);
96
92
  let cd;
@@ -101,7 +97,6 @@ helpers.startChromedriverProxy = async function startChromedriverProxy(context,
101
97
  } else {
102
98
  let opts = _lodash.default.cloneDeep(this.opts);
103
99
  opts.chromeUseRunningApp = true;
104
-
105
100
  if (opts.extractChromeAndroidPackageFromContextName || context === `${_webviewHelpers.WEBVIEW_BASE}chrome`) {
106
101
  let androidPackage = context.match(`${_webviewHelpers.WEBVIEW_BASE}(.+)`);
107
102
  if (androidPackage && androidPackage.length > 0) {
@@ -145,14 +140,12 @@ helpers.startChromedriverProxy = async function startChromedriverProxy(context,
145
140
  this.proxyCommand = this.chromedriver.jwproxy.command.bind(this.chromedriver.jwproxy);
146
141
  this.jwpProxyActive = true;
147
142
  };
148
-
149
143
  helpers.suspendChromedriverProxy = function suspendChromedriverProxy() {
150
144
  this.chromedriver = null;
151
145
  this.proxyReqRes = null;
152
146
  this.proxyCommand = null;
153
147
  this.jwpProxyActive = false;
154
148
  };
155
-
156
149
  helpers.onChromedriverStop = async function onChromedriverStop(context) {
157
150
  this.log.warn(`Chromedriver for context ${context} stopped unexpectedly`);
158
151
  if (context === this.curContext) {
@@ -163,7 +156,6 @@ helpers.onChromedriverStop = async function onChromedriverStop(context) {
163
156
  delete this.sessionChromedrivers[context];
164
157
  }
165
158
  };
166
-
167
159
  helpers.stopChromedriverProxies = async function stopChromedriverProxies() {
168
160
  this.suspendChromedriverProxy();
169
161
  for (let context of _lodash.default.keys(this.sessionChromedrivers)) {
@@ -215,7 +207,6 @@ helpers.startChromeSession = async function startChromeSession() {
215
207
  this.onChromedriverStop(_webviewHelpers.CHROMIUM_WIN);
216
208
  }
217
209
  });
218
-
219
210
  this.curContext = _webviewHelpers.CHROMIUM_WIN;
220
211
  this.sessionChromedrivers[_webviewHelpers.CHROMIUM_WIN] = this.chromedriver;
221
212
  this.proxyReqRes = this.chromedriver.proxyReq.bind(this.chromedriver);
@@ -225,7 +216,6 @@ helpers.startChromeSession = async function startChromeSession() {
225
216
  await this.dismissChromeWelcome();
226
217
  }
227
218
  };
228
-
229
219
  async function setupExistingChromedriver(log, chromedriver) {
230
220
  if (!(await chromedriver.hasWorkingWebview())) {
231
221
  log.debug('ChromeDriver is not associated with a window. ' + 'Re-initializing the session.');
@@ -233,18 +223,15 @@ async function setupExistingChromedriver(log, chromedriver) {
233
223
  }
234
224
  return chromedriver;
235
225
  }
236
-
237
226
  async function getChromedriverPort(portSpec, log = null) {
238
227
  const getPort = _bluebird.default.promisify(_portfinder.default.getPort, {
239
228
  context: _portfinder.default
240
229
  });
241
-
242
230
  if (!portSpec) {
243
231
  const port = await getPort();
244
232
  log === null || log === void 0 ? void 0 : log.debug(`A port was not given, using random free port: ${port}`);
245
233
  return port;
246
234
  }
247
-
248
235
  log === null || log === void 0 ? void 0 : log.debug(`Finding a free port for chromedriver using spec ${JSON.stringify(portSpec)}`);
249
236
  let foundPort = null;
250
237
  for (const potentialPort of portSpec) {
@@ -312,7 +299,6 @@ helpers.setupNewChromedriver = async function setupNewChromedriver(opts, curDevi
312
299
  details,
313
300
  isAutodownloadEnabled: this === null || this === void 0 ? void 0 : (_this$isChromedriverA = this.isChromedriverAutodownloadEnabled) === null || _this$isChromedriverA === void 0 ? void 0 : _this$isChromedriverA.call(this)
314
301
  });
315
-
316
302
  opts.chromeOptions = opts.chromeOptions || {};
317
303
  for (const opt of _lodash.default.keys(opts)) {
318
304
  if (opt.endsWith(':chromeOptions')) {
@@ -331,4 +317,4 @@ exports.setupNewChromedriver = setupNewChromedriver;
331
317
  Object.assign(extensions, commands, helpers);
332
318
  var _default = extensions;
333
319
  exports.default = _default;
334
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDSFJPTUVEUklWRVJfQVVUT0RPV05MT0FEX0ZFQVRVUkUiLCJjb21tYW5kcyIsImhlbHBlcnMiLCJleHRlbnNpb25zIiwiZ2V0Q3VycmVudENvbnRleHQiLCJjdXJDb250ZXh0IiwiZGVmYXVsdENvbnRleHROYW1lIiwiZ2V0Q29udGV4dHMiLCJ3ZWJ2aWV3c01hcHBpbmciLCJ3ZWJ2aWV3SGVscGVycyIsImdldFdlYlZpZXdzTWFwcGluZyIsImFkYiIsIm9wdHMiLCJhc3NpZ25Db250ZXh0cyIsInNldENvbnRleHQiLCJuYW1lIiwidXRpbCIsImhhc1ZhbHVlIiwiV0VCVklFV19XSU4iLCJkZWZhdWx0V2Vidmlld05hbWUiLCJjb250ZXh0cyIsIl8iLCJpbmNsdWRlcyIsImVycm9ycyIsIk5vU3VjaENvbnRleHRFcnJvciIsInN3aXRjaENvbnRleHQiLCJtb2JpbGVHZXRDb250ZXh0cyIsImFuZHJvaWREZXZpY2VTb2NrZXQiLCJlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcyIsIndlYnZpZXdEZXZ0b29sc1BvcnQiLCJlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24iLCJPYmplY3QiLCJhc3NpZ24iLCJpc0Nocm9tZVNlc3Npb24iLCJ3ZWJ2aWV3cyIsInBhcnNlV2Vidmlld05hbWVzIiwiTkFUSVZFX1dJTiIsImxvZyIsImRlYnVnIiwiSlNPTiIsInN0cmluZ2lmeSIsImlzQ2hyb21lZHJpdmVyQ29udGV4dCIsInN0YXJ0Q2hyb21lZHJpdmVyUHJveHkiLCJyZWNyZWF0ZUNocm9tZURyaXZlclNlc3Npb25zIiwic3RvcENocm9tZWRyaXZlclByb3hpZXMiLCJzdXNwZW5kQ2hyb21lZHJpdmVyUHJveHkiLCJFcnJvciIsIldFQlZJRVdfQkFTRSIsImF1dG9XZWJ2aWV3TmFtZSIsImFwcFBhY2thZ2UiLCJpc1dlYkNvbnRleHQiLCJjb250ZXh0IiwiY2QiLCJzZXNzaW9uQ2hyb21lZHJpdmVycyIsInNldHVwRXhpc3RpbmdDaHJvbWVkcml2ZXIiLCJjbG9uZURlZXAiLCJjaHJvbWVVc2VSdW5uaW5nQXBwIiwiZXh0cmFjdENocm9tZUFuZHJvaWRQYWNrYWdlRnJvbUNvbnRleHROYW1lIiwiYW5kcm9pZFBhY2thZ2UiLCJtYXRjaCIsImxlbmd0aCIsImNocm9tZUFuZHJvaWRQYWNrYWdlIiwiaGFzIiwibWFwIiwid20iLCJ3ZWJ2aWV3TmFtZSIsImtub3duUGFja2FnZSIsIktOT1dOX0NIUk9NRV9QQUNLQUdFX05BTUVTIiwiYXBwU3RhdGUiLCJxdWVyeUFwcFN0YXRlIiwiQVBQX1NUQVRFIiwiUlVOTklOR19JTl9CQUNLR1JPVU5EIiwiUlVOTklOR19JTl9GT1JFR1JPVU5EIiwiaW5mbyIsInNldHVwTmV3Q2hyb21lZHJpdmVyIiwiY3VyRGV2aWNlSWQiLCJvbiIsIkNocm9tZWRyaXZlciIsIkVWRU5UX0NIQU5HRUQiLCJtc2ciLCJzdGF0ZSIsIlNUQVRFX1NUT1BQRUQiLCJvbkNocm9tZWRyaXZlclN0b3AiLCJjaHJvbWVkcml2ZXIiLCJwcm94eVJlcVJlcyIsInByb3h5UmVxIiwiYmluZCIsInByb3h5Q29tbWFuZCIsImp3cHJveHkiLCJjb21tYW5kIiwiandwUHJveHlBY3RpdmUiLCJ3YXJuIiwiZXJyIiwic3RhcnRVbmV4cGVjdGVkU2h1dGRvd24iLCJrZXlzIiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwic3RvcCIsIm1lc3NhZ2UiLCJ2aWV3TmFtZSIsIkNIUk9NSVVNX1dJTiIsInNob3VsZERpc21pc3NDaHJvbWVXZWxjb21lIiwiY2hyb21lT3B0aW9ucyIsImlzQXJyYXkiLCJhcmdzIiwiZGlzbWlzc0Nocm9tZVdlbGNvbWUiLCJhY3Rpdml0eSIsImdldEN1cnJlbnRBY3Rpdml0eSIsImVsIiwiZmluZEVsT3JFbHMiLCJjbGljayIsIkVMRU1FTlQiLCJlIiwic3RhcnRDaHJvbWVTZXNzaW9uIiwia25vd25QYWNrYWdlcyIsImNocm9tZUJ1bmRsZUlkIiwiY2hyb21lQW5kcm9pZEFjdGl2aXR5IiwiYXBwQWN0aXZpdHkiLCJoYXNXb3JraW5nV2VidmlldyIsInJlc3RhcnQiLCJnZXRDaHJvbWVkcml2ZXJQb3J0IiwicG9ydFNwZWMiLCJnZXRQb3J0IiwiQiIsInByb21pc2lmeSIsIlBvcnRGaW5kZXIiLCJwb3J0IiwiZm91bmRQb3J0IiwicG90ZW50aWFsUG9ydCIsInN0b3BQb3J0IiwicGFyc2VJbnQiLCJpc0Nocm9tZWRyaXZlckF1dG9kb3dubG9hZEVuYWJsZWQiLCJpc0ZlYXR1cmVFbmFibGVkIiwiY2hyb21lRHJpdmVyUG9ydCIsImNocm9tZWRyaXZlclBvcnQiLCJjaHJvbWVkcml2ZXJQb3J0cyIsImRldGFpbHMiLCJnZXRXZWJ2aWV3RGV0YWlscyIsInVuZGVmaW5lZCIsImlzRW1wdHkiLCJleGVjdXRhYmxlIiwiY2hyb21lZHJpdmVyRXhlY3V0YWJsZSIsImNtZEFyZ3MiLCJjaHJvbWVkcml2ZXJBcmdzIiwidmVyYm9zZSIsInNob3dDaHJvbWVkcml2ZXJMb2ciLCJleGVjdXRhYmxlRGlyIiwiY2hyb21lZHJpdmVyRXhlY3V0YWJsZURpciIsIm1hcHBpbmdQYXRoIiwiY2hyb21lZHJpdmVyQ2hyb21lTWFwcGluZ0ZpbGUiLCJidW5kbGVJZCIsInVzZVN5c3RlbUV4ZWN1dGFibGUiLCJjaHJvbWVkcml2ZXJVc2VTeXN0ZW1FeGVjdXRhYmxlIiwiZGlzYWJsZUJ1aWxkQ2hlY2siLCJjaHJvbWVkcml2ZXJEaXNhYmxlQnVpbGRDaGVjayIsImlzQXV0b2Rvd25sb2FkRW5hYmxlZCIsIm9wdCIsImVuZHNXaXRoIiwibWVyZ2UiLCJjYXBzIiwiY3JlYXRlQ2hyb21lZHJpdmVyQ2FwcyIsInN0YXJ0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL2NvbnRleHQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBDaHJvbWVkcml2ZXIgZnJvbSAnYXBwaXVtLWNocm9tZWRyaXZlcic7XG5pbXBvcnQgUG9ydEZpbmRlciBmcm9tICdwb3J0ZmluZGVyJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7IHV0aWwgfSBmcm9tICdhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyBlcnJvcnMgfSBmcm9tICdhcHBpdW0vZHJpdmVyJztcbmltcG9ydCB7XG4gIGRlZmF1bHQgYXMgd2Vidmlld0hlbHBlcnMsXG4gIE5BVElWRV9XSU4sIFdFQlZJRVdfQkFTRSwgV0VCVklFV19XSU4sIENIUk9NSVVNX1dJTiwgS05PV05fQ0hST01FX1BBQ0tBR0VfTkFNRVNcbn0gZnJvbSAnLi4vd2Vidmlldy1oZWxwZXJzJztcbmltcG9ydCB7IEFQUF9TVEFURSB9IGZyb20gJy4uL2FuZHJvaWQtaGVscGVycyc7XG5cbmNvbnN0IENIUk9NRURSSVZFUl9BVVRPRE9XTkxPQURfRkVBVFVSRSA9ICdjaHJvbWVkcml2ZXJfYXV0b2Rvd25sb2FkJztcblxubGV0IGNvbW1hbmRzID0ge30sIGhlbHBlcnMgPSB7fSwgZXh0ZW5zaW9ucyA9IHt9O1xuXG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEFjdHVhbCBNSlNPTldQIGNvbW1hbmQgaGFuZGxlcnNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmNvbW1hbmRzLmdldEN1cnJlbnRDb250ZXh0ID0gYXN5bmMgZnVuY3Rpb24gZ2V0Q3VycmVudENvbnRleHQgKCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtYXdhaXRcbiAgLy8gaWYgdGhlIGN1cnJlbnQgY29udGV4dCBpcyBgbnVsbGAsIGluZGljYXRpbmcgbm8gY29udGV4dFxuICAvLyBleHBsaWNpdGx5IHNldCwgaXQgaXMgdGhlIGRlZmF1bHQgY29udGV4dFxuICByZXR1cm4gdGhpcy5jdXJDb250ZXh0IHx8IHRoaXMuZGVmYXVsdENvbnRleHROYW1lKCk7XG59O1xuXG5jb21tYW5kcy5nZXRDb250ZXh0cyA9IGFzeW5jIGZ1bmN0aW9uIGdldENvbnRleHRzICgpIHtcbiAgY29uc3Qgd2Vidmlld3NNYXBwaW5nID0gYXdhaXQgd2Vidmlld0hlbHBlcnMuZ2V0V2ViVmlld3NNYXBwaW5nKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICByZXR1cm4gdGhpcy5hc3NpZ25Db250ZXh0cyh3ZWJ2aWV3c01hcHBpbmcpO1xufTtcblxuY29tbWFuZHMuc2V0Q29udGV4dCA9IGFzeW5jIGZ1bmN0aW9uIHNldENvbnRleHQgKG5hbWUpIHtcbiAgaWYgKCF1dGlsLmhhc1ZhbHVlKG5hbWUpKSB7XG4gICAgbmFtZSA9IHRoaXMuZGVmYXVsdENvbnRleHROYW1lKCk7XG4gIH0gZWxzZSBpZiAobmFtZSA9PT0gV0VCVklFV19XSU4pIHtcbiAgICAvLyBoYW5kbGUgc2V0Q29udGV4dCBcIldFQlZJRVdcIlxuICAgIG5hbWUgPSB0aGlzLmRlZmF1bHRXZWJ2aWV3TmFtZSgpO1xuICB9XG4gIC8vIGlmIHdlJ3JlIGFscmVhZHkgaW4gdGhlIGNvbnRleHQgd2Ugd2FudCwgZG8gbm90aGluZ1xuICBpZiAobmFtZSA9PT0gdGhpcy5jdXJDb250ZXh0KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgd2Vidmlld3NNYXBwaW5nID0gYXdhaXQgd2Vidmlld0hlbHBlcnMuZ2V0V2ViVmlld3NNYXBwaW5nKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICBjb25zdCBjb250ZXh0cyA9IHRoaXMuYXNzaWduQ29udGV4dHMod2Vidmlld3NNYXBwaW5nKTtcbiAgLy8gaWYgdGhlIGNvbnRleHQgd2Ugd2FudCBkb2Vzbid0IGV4aXN0LCBmYWlsXG4gIGlmICghXy5pbmNsdWRlcyhjb250ZXh0cywgbmFtZSkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLk5vU3VjaENvbnRleHRFcnJvcigpO1xuICB9XG5cbiAgYXdhaXQgdGhpcy5zd2l0Y2hDb250ZXh0KG5hbWUsIHdlYnZpZXdzTWFwcGluZyk7XG4gIHRoaXMuY3VyQ29udGV4dCA9IG5hbWU7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFdlYnZpZXdzTWFwcGluZ1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHByb2MgVGhlIG5hbWUgb2YgdGhlIERldnRvb2xzIFVuaXggc29ja2V0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gd2VidmlldyBUaGUgd2ViIHZpZXcgYWxpYXMuIExvb2tzIGxpa2UgYFdFQlZJRVdfYFxuICogcHJlZml4IHBsdXMgUElEIG9yIHBhY2thZ2UgbmFtZVxuICogQHByb3BlcnR5IHs/T2JqZWN0fSBpbmZvIFdlYnZpZXcgaW5mb3JtYXRpb24gYXMgaXQgaXMgcmV0cmlldmVkIGJ5XG4gKiAvanNvbi92ZXJzaW9uIENEUCBlbmRwb2ludFxuICogQHByb3BlcnR5IHs/QXJyYXk8T2JqZWN0Pn0gcGFnZXMgV2VidmlldyBwYWdlcyBsaXN0IGFzIGl0IGlzIHJldHJpZXZlZCBieVxuICogL2pzb24vbGlzdCBDRFAgZW5kcG9pbnRcbiAqIEBwcm9wZXJ5IHs/c3RyaW5nfSB3ZWJ2aWV3TmFtZSBBbiBhY3R1YWwgd2VidmlldyBuYW1lIGZvciBzd2l0Y2hpbmcgY29udGV4dC5cbiAqIFRoaXMgdmFsdWUgYmVjb21lcyBudWxsIHdoZW4gZmFpbGluZyB0byBmaW5kIGEgUElEIGZvciBhIHdlYnZpZXcuXG4gKlxuICogVGhlIGZvbGxvd2luZyBqc29uIGRlbW9uc3RyYXRlcyB0aGUgZXhhbXBsZSBvZiBXZWJ2aWV3c01hcHBpbmcgb2JqZWN0LlxuICogTm90ZSB0aGF0IGBkZXNjcmlwdGlvbmAgaW4gYHBhZ2VgIGNhbiBiZSBhbiBlbXB0eSBzdHJpbmcgbW9zdCBsaWtlbHkgd2hlbiBpdCBjb21lcyB0byBNb2JpbGUgQ2hyb21lKVxuICoge1xuICogICBcInByb2NcIjogXCJAd2Vidmlld19kZXZ0b29sc19yZW1vdGVfMjIxMzhcIixcbiAqICAgXCJ3ZWJ2aWV3XCI6IFwiV0VCVklFV18yMjEzOFwiLFxuICogICBcImluZm9cIjoge1xuICogICAgIFwiQW5kcm9pZC1QYWNrYWdlXCI6IFwiaW8uYXBwaXVtLnNldHRpbmdzXCIsXG4gKiAgICAgXCJCcm93c2VyXCI6IFwiQ2hyb21lLzc0LjAuMzcyOS4xODVcIixcbiAqICAgICBcIlByb3RvY29sLVZlcnNpb25cIjogXCIxLjNcIixcbiAqICAgICBcIlVzZXItQWdlbnRcIjogXCJNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgMTA7IEFuZHJvaWQgU0RLIGJ1aWx0IGZvciB4ODYgQnVpbGQvUVNSMS4xOTA5MjAuMDAxOyB3dikgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAgQ2hyb21lLzc0LjAuMzcyOS4xODUgTW9iaWxlIFNhZmFyaS81MzcuMzZcIixcbiAqICAgICBcIlY4LVZlcnNpb25cIjogXCI3LjQuMjg4LjI4XCIsXG4gKiAgICAgXCJXZWJLaXQtVmVyc2lvblwiOiBcIjUzNy4zNiAoQDIyOTU1NjgyZjk0Y2UwOTMzNjE5N2JmYjhkZmZlYTk5MWZhMzJmMGQpXCIsXG4gKiAgICAgXCJ3ZWJTb2NrZXREZWJ1Z2dlclVybFwiOiBcIndzOi8vMTI3LjAuMC4xOjEwOTAwL2RldnRvb2xzL2Jyb3dzZXJcIlxuICogICB9LFxuICogICBcInBhZ2VzXCI6IFtcbiAqICAgICB7XG4gKiAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwie1xcXCJhdHRhY2hlZFxcXCI6dHJ1ZSxcXFwiZW1wdHlcXFwiOmZhbHNlLFxcXCJoZWlnaHRcXFwiOjE0NTgsXFxcInNjcmVlblhcXFwiOjAsXFxcInNjcmVlbllcXFwiOjMzNixcXFwidmlzaWJsZVxcXCI6dHJ1ZSxcXFwid2lkdGhcXFwiOjEwODB9XCIsXG4gKiAgICAgICBcImRldnRvb2xzRnJvbnRlbmRVcmxcIjogXCJodHRwOi8vY2hyb21lLWRldnRvb2xzLWZyb250ZW5kLmFwcHNwb3QuY29tL3NlcnZlX3Jldi9AMjI5NTU2ODJmOTRjZTA5MzM2MTk3YmZiOGRmZmVhOTkxZmEzMmYwZC9pbnNwZWN0b3IuaHRtbD93cz0xMjcuMC4wLjE6MTA5MDAvZGV2dG9vbHMvcGFnZS8yNzMyNUNDNTBCNjAwRDMxQjIzM0Y0NUUwOTQ4N0IxRlwiLFxuICogICAgICAgXCJpZFwiOiBcIjI3MzI1Q0M1MEI2MDBEMzFCMjMzRjQ1RTA5NDg3QjFGXCIsXG4gKiAgICAgICBcInRpdGxlXCI6IFwiUmVsZWFzZXMgwrcgYXBwaXVtL2FwcGl1bSDCtyBHaXRIdWJcIixcbiAqICAgICAgIFwidHlwZVwiOiBcInBhZ2VcIixcbiAqICAgICAgIFwidXJsXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vcmVsZWFzZXNcIixcbiAqICAgICAgIFwid2ViU29ja2V0RGVidWdnZXJVcmxcIjogXCJ3czovLzEyNy4wLjAuMToxMDkwMC9kZXZ0b29scy9wYWdlLzI3MzI1Q0M1MEI2MDBEMzFCMjMzRjQ1RTA5NDg3QjFGXCJcbiAqICAgICB9XG4gKiAgIF0sXG4gKiAgIFwid2Vidmlld05hbWVcIjogXCJXRUJWSUVXX2NvbS5pby5hcHBpdW0uc2V0dGluZ1wiXG4gKiB9XG4gKi9cblxuLyoqXG4gKiBSZXR1cm5zIGEgd2Vidmlld3NNYXBwaW5nIGJhc2VkIG9uIENEUCBlbmRwb2ludHNcbiAqXG4gKiBAcmV0dXJuIHtBcnJheTxXZWJ2aWV3c01hcHBpbmc+fSB3ZWJ2aWV3c01hcHBpbmdcbiAqL1xuY29tbWFuZHMubW9iaWxlR2V0Q29udGV4dHMgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVHZXRDb250ZXh0cyAoKSB7XG4gIGNvbnN0IG9wdHMgPSB7XG4gICAgYW5kcm9pZERldmljZVNvY2tldDogdGhpcy5vcHRzLmFuZHJvaWREZXZpY2VTb2NrZXQsXG4gICAgZW5zdXJlV2Vidmlld3NIYXZlUGFnZXM6IHRydWUsXG4gICAgd2Vidmlld0RldnRvb2xzUG9ydDogdGhpcy5vcHRzLndlYnZpZXdEZXZ0b29sc1BvcnQsXG4gICAgZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uOiB0cnVlXG4gIH07XG4gIHJldHVybiBhd2FpdCB3ZWJ2aWV3SGVscGVycy5nZXRXZWJWaWV3c01hcHBpbmcodGhpcy5hZGIsIG9wdHMpO1xufTtcblxuaGVscGVycy5hc3NpZ25Db250ZXh0cyA9IGZ1bmN0aW9uIGFzc2lnbkNvbnRleHRzICh3ZWJ2aWV3c01hcHBpbmcpIHtcbiAgY29uc3Qgb3B0cyA9IE9iamVjdC5hc3NpZ24oe2lzQ2hyb21lU2Vzc2lvbjogdGhpcy5pc0Nocm9tZVNlc3Npb259LCB0aGlzLm9wdHMpO1xuICBjb25zdCB3ZWJ2aWV3cyA9IHdlYnZpZXdIZWxwZXJzLnBhcnNlV2Vidmlld05hbWVzKHdlYnZpZXdzTWFwcGluZywgb3B0cyk7XG4gIHRoaXMuY29udGV4dHMgPSBbTkFUSVZFX1dJTiwgLi4ud2Vidmlld3NdO1xuICB0aGlzLmxvZy5kZWJ1ZyhgQXZhaWxhYmxlIGNvbnRleHRzOiAke0pTT04uc3RyaW5naWZ5KHRoaXMuY29udGV4dHMpfWApO1xuICByZXR1cm4gdGhpcy5jb250ZXh0cztcbn07XG5cbmhlbHBlcnMuc3dpdGNoQ29udGV4dCA9IGFzeW5jIGZ1bmN0aW9uIHN3aXRjaENvbnRleHQgKG5hbWUsIHdlYnZpZXdzTWFwcGluZykge1xuICAvLyBXZSBoYXZlIHNvbWUgb3B0aW9ucyB3aGVuIGl0IGNvbWVzIHRvIHdlYnZpZXdzLiBJZiB3ZSB3YW50IGFcbiAgLy8gQ2hyb21lZHJpdmVyIHdlYnZpZXcsIHdlIGNhbiBvbmx5IGNvbnRyb2wgb25lIGF0IGEgdGltZS5cbiAgaWYgKHRoaXMuaXNDaHJvbWVkcml2ZXJDb250ZXh0KG5hbWUpKSB7XG4gICAgLy8gc3RhcnQgcHJveHlpbmcgY29tbWFuZHMgZGlyZWN0bHkgdG8gY2hyb21lZHJpdmVyXG4gICAgYXdhaXQgdGhpcy5zdGFydENocm9tZWRyaXZlclByb3h5KG5hbWUsIHdlYnZpZXdzTWFwcGluZyk7XG4gIH0gZWxzZSBpZiAodGhpcy5pc0Nocm9tZWRyaXZlckNvbnRleHQodGhpcy5jdXJDb250ZXh0KSkge1xuICAgIC8vIGlmIHdlJ3JlIG1vdmluZyB0byBhIG5vbi1jaHJvbWVkcml2ZXIgd2VidmlldywgYW5kIG91ciBjdXJyZW50IGNvbnRleHRcbiAgICAvLyBfaXNfIGEgY2hyb21lZHJpdmVyIHdlYnZpZXcsIGlmIGNhcHMgcmVjcmVhdGVDaHJvbWVEcml2ZXJTZXNzaW9ucyBpcyBzZXRcbiAgICAvLyB0byB0cnVlIHRoZW4ga2lsbCBjaHJvbWVkcml2ZXIgc2Vzc2lvbiB1c2luZyBzdG9wQ2hyb21lZHJpdmVyUHJveGllcyBvclxuICAgIC8vIGVsc2Ugc2ltcGx5IHN1c3BlbmQgcHJveHlpbmcgdG8gdGhlIGxhdHRlclxuICAgIGlmICh0aGlzLm9wdHMucmVjcmVhdGVDaHJvbWVEcml2ZXJTZXNzaW9ucykge1xuICAgICAgdGhpcy5sb2cuZGVidWcoJ3JlY3JlYXRlQ2hyb21lRHJpdmVyU2Vzc2lvbnMgc2V0IHRvIHRydWU7IGtpbGxpbmcgZXhpc3RpbmcgY2hyb21lZHJpdmVycycpO1xuICAgICAgYXdhaXQgdGhpcy5zdG9wQ2hyb21lZHJpdmVyUHJveGllcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLnN1c3BlbmRDaHJvbWVkcml2ZXJQcm94eSgpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYERpZG4ndCBrbm93IGhvdyB0byBoYW5kbGUgc3dpdGNoaW5nIHRvIGNvbnRleHQgJyR7bmFtZX0nYCk7XG4gIH1cbn07XG5cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBPbi1vYmplY3QgY29udGV4dC1yZWxhdGVkIGhlbHBlcnNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vLyBUaGUgcmVhc29uIHRoaXMgaXMgYSBmdW5jdGlvbiBhbmQgbm90IGp1c3QgYSBjb25zdGFudCBpcyB0aGF0IGJvdGggYW5kcm9pZC1cbi8vIGRyaXZlciBhbmQgc2VsZW5kcm9pZC1kcml2ZXIgdXNlIHRoaXMgbG9naWMsIGFuZCBlYWNoIG9uZSByZXR1cm5zXG4vLyBhIGRpZmZlcmVudCBkZWZhdWx0IGNvbnRleHQgbmFtZVxuaGVscGVycy5kZWZhdWx0Q29udGV4dE5hbWUgPSBmdW5jdGlvbiBkZWZhdWx0Q29udGV4dE5hbWUgKCkge1xuICByZXR1cm4gTkFUSVZFX1dJTjtcbn07XG5cbmhlbHBlcnMuZGVmYXVsdFdlYnZpZXdOYW1lID0gZnVuY3Rpb24gZGVmYXVsdFdlYnZpZXdOYW1lICgpIHtcbiAgcmV0dXJuIFdFQlZJRVdfQkFTRSArICh0aGlzLm9wdHMuYXV0b1dlYnZpZXdOYW1lIHx8IHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbn07XG5cbmhlbHBlcnMuaXNXZWJDb250ZXh0ID0gZnVuY3Rpb24gaXNXZWJDb250ZXh0ICgpIHtcbiAgcmV0dXJuIHRoaXMuY3VyQ29udGV4dCAhPT0gbnVsbCAmJiB0aGlzLmN1ckNvbnRleHQgIT09IE5BVElWRV9XSU47XG59O1xuXG4vLyBUdXJuIG9uIHByb3h5aW5nIHRvIGFuIGV4aXN0aW5nIENocm9tZWRyaXZlciBzZXNzaW9uIG9yIGEgbmV3IG9uZVxuaGVscGVycy5zdGFydENocm9tZWRyaXZlclByb3h5ID0gYXN5bmMgZnVuY3Rpb24gc3RhcnRDaHJvbWVkcml2ZXJQcm94eSAoY29udGV4dCwgd2Vidmlld3NNYXBwaW5nKSB7XG4gIHRoaXMubG9nLmRlYnVnKGBDb25uZWN0aW5nIHRvIGNocm9tZS1iYWNrZWQgd2VidmlldyBjb250ZXh0ICcke2NvbnRleHR9J2ApO1xuXG4gIGxldCBjZDtcbiAgaWYgKHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnNbY29udGV4dF0pIHtcbiAgICAvLyBpbiB0aGUgY2FzZSB3aGVyZSB3ZSd2ZSBhbHJlYWR5IHNldCB1cCBhIGNocm9tZWRyaXZlciBmb3IgYSBjb250ZXh0LFxuICAgIC8vIHdlIHdhbnQgdG8gcmVjb25uZWN0IHRvIGl0LCBub3QgY3JlYXRlIGEgd2hvbGUgbmV3IG9uZVxuICAgIHRoaXMubG9nLmRlYnVnKGBGb3VuZCBleGlzdGluZyBDaHJvbWVkcml2ZXIgZm9yIGNvbnRleHQgJyR7Y29udGV4dH0nLiBVc2luZyBpdC5gKTtcbiAgICBjZCA9IHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnNbY29udGV4dF07XG4gICAgYXdhaXQgc2V0dXBFeGlzdGluZ0Nocm9tZWRyaXZlcih0aGlzLmxvZywgY2QpO1xuICB9IGVsc2Uge1xuICAgIGxldCBvcHRzID0gXy5jbG9uZURlZXAodGhpcy5vcHRzKTtcbiAgICBvcHRzLmNocm9tZVVzZVJ1bm5pbmdBcHAgPSB0cnVlO1xuXG4gICAgLy8gaWYgcmVxdWVzdGVkLCB0ZWxsIGNocm9tZWRyaXZlciB0byBhdHRhY2ggdG8gdGhlIGFuZHJvaWQgcGFja2FnZSB3ZSBoYXZlXG4gICAgLy8gYXNzb2NpYXRlZCB3aXRoIHRoZSBjb250ZXh0IG5hbWUsIHJhdGhlciB0aGFuIHRoZSBwYWNrYWdlIG9mIHRoZSBBVVQuXG4gICAgLy8gQW5kIHR1cm4gdGhpcyBvbiBieSBkZWZhdWx0IGZvciBjaHJvbWUtLWlmIGNocm9tZSBwb3BzIHVwIHdpdGggYSB3ZWJ2aWV3XG4gICAgLy8gYW5kIHNvbWVvbmUgd2FudHMgdG8gc3dpdGNoIHRvIGl0LCB3ZSBzaG91bGQgbGV0IGNocm9tZWRyaXZlciBjb25uZWN0IHRvXG4gICAgLy8gY2hyb21lIHJhdGhlciB0aGFuIHN0YXlpbmcgc3R1Y2sgb24gdGhlIEFVVFxuICAgIGlmIChvcHRzLmV4dHJhY3RDaHJvbWVBbmRyb2lkUGFja2FnZUZyb21Db250ZXh0TmFtZSB8fCBjb250ZXh0ID09PSBgJHtXRUJWSUVXX0JBU0V9Y2hyb21lYCkge1xuICAgICAgbGV0IGFuZHJvaWRQYWNrYWdlID0gY29udGV4dC5tYXRjaChgJHtXRUJWSUVXX0JBU0V9KC4rKWApO1xuICAgICAgaWYgKGFuZHJvaWRQYWNrYWdlICYmIGFuZHJvaWRQYWNrYWdlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgb3B0cy5jaHJvbWVBbmRyb2lkUGFja2FnZSA9IGFuZHJvaWRQYWNrYWdlWzFdO1xuICAgICAgfVxuICAgICAgaWYgKCFvcHRzLmV4dHJhY3RDaHJvbWVBbmRyb2lkUGFja2FnZUZyb21Db250ZXh0TmFtZSkge1xuICAgICAgICBpZiAoXy5oYXModGhpcy5vcHRzLCAnZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uJykgJiYgIXRoaXMub3B0cy5lbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24pIHtcbiAgICAgICAgICAvLyBXaGVuIGVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbiBjYXBhYmlsaXR5IGlzIGV4cGxpY2l0bHkgZGlzYWJsZWQsIHRyeSB0byBpZGVudGlmeVxuICAgICAgICAgIC8vIGNocm9tZUFuZHJvaWRQYWNrYWdlIGJhc2VkIG9uIGNvbnRleHRzLCBrbm93biBjaHJvbWUgdmFyaWFudCBwYWNrYWdlcyBhbmQgcXVlcnlBcHBTdGF0ZSByZXN1bHRcbiAgICAgICAgICAvLyBzaW5jZSB3ZWJ2aWV3c01hcHBpbmcgZG9lcyBub3QgaGF2ZSBpbmZvIG9iamVjdFxuICAgICAgICAgIGNvbnN0IGNvbnRleHRzID0gd2Vidmlld3NNYXBwaW5nLm1hcCgod20pID0+IHdtLndlYnZpZXdOYW1lKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGtub3duUGFja2FnZSBvZiBLTk9XTl9DSFJPTUVfUEFDS0FHRV9OQU1FUykge1xuICAgICAgICAgICAgaWYgKF8uaW5jbHVkZXMoY29udGV4dHMsIGAke1dFQlZJRVdfQkFTRX0ke2tub3duUGFja2FnZX1gKSkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGFwcFN0YXRlID0gYXdhaXQgdGhpcy5xdWVyeUFwcFN0YXRlKGtub3duUGFja2FnZSk7XG4gICAgICAgICAgICBpZiAoXy5pbmNsdWRlcyhbQVBQX1NUQVRFLlJVTk5JTkdfSU5fQkFDS0dST1VORCwgQVBQX1NUQVRFLlJVTk5JTkdfSU5fRk9SRUdST1VORF0sIGFwcFN0YXRlKSkge1xuICAgICAgICAgICAgICBvcHRzLmNocm9tZUFuZHJvaWRQYWNrYWdlID0ga25vd25QYWNrYWdlO1xuICAgICAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgSWRlbnRpZmllZCBjaHJvbWVBbmRyb2lkUGFja2FnZSBhcyAnJHtvcHRzLmNocm9tZUFuZHJvaWRQYWNrYWdlfScgYCArXG4gICAgICAgICAgICAgICAgYGZvciBjb250ZXh0ICcke2NvbnRleHR9JyBieSBxdWVyeWluZyBzdGF0ZXMgb2YgQ2hyb21lIGFwcCBwYWNrYWdlc2ApO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9yIChjb25zdCB3bSBvZiB3ZWJ2aWV3c01hcHBpbmcpIHtcbiAgICAgICAgICAgIGlmICh3bS53ZWJ2aWV3TmFtZSA9PT0gY29udGV4dCAmJiBfLmhhcyh3bT8uaW5mbywgJ0FuZHJvaWQtUGFja2FnZScpKSB7XG4gICAgICAgICAgICAgIG9wdHMuY2hyb21lQW5kcm9pZFBhY2thZ2UgPSB3bS5pbmZvWydBbmRyb2lkLVBhY2thZ2UnXTtcbiAgICAgICAgICAgICAgdGhpcy5sb2cuZGVidWcoYElkZW50aWZpZWQgY2hyb21lQW5kcm9pZFBhY2thZ2UgYXMgJyR7b3B0cy5jaHJvbWVBbmRyb2lkUGFja2FnZX0nIGAgK1xuICAgICAgICAgICAgICAgIGBmb3IgY29udGV4dCAnJHtjb250ZXh0fScgYnkgQ0RQYCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNkID0gYXdhaXQgdGhpcy5zZXR1cE5ld0Nocm9tZWRyaXZlcihvcHRzLCB0aGlzLmFkYi5jdXJEZXZpY2VJZCwgdGhpcy5hZGIsIGNvbnRleHQpO1xuICAgIC8vIGJpbmQgb3VyIHN0b3AvZXhpdCBoYW5kbGVyLCBwYXNzaW5nIGluIGNvbnRleHQgc28gd2Uga25vdyB3aGljaFxuICAgIC8vIG9uZSBzdG9wcGVkIHVuZXhwZWN0ZWRseVxuICAgIGNkLm9uKENocm9tZWRyaXZlci5FVkVOVF9DSEFOR0VELCAobXNnKSA9PiB7XG4gICAgICBpZiAobXNnLnN0YXRlID09PSBDaHJvbWVkcml2ZXIuU1RBVEVfU1RPUFBFRCkge1xuICAgICAgICB0aGlzLm9uQ2hyb21lZHJpdmVyU3RvcChjb250ZXh0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBzYXZlIHRoZSBjaHJvbWVkcml2ZXIgb2JqZWN0IHVuZGVyIHRoZSBjb250ZXh0XG4gICAgdGhpcy5zZXNzaW9uQ2hyb21lZHJpdmVyc1tjb250ZXh0XSA9IGNkO1xuICB9XG4gIC8vIGhvb2sgdXAgdGhlIGxvY2FsIHZhcmlhYmxlcyBzbyB3ZSBjYW4gcHJveHkgdGhpcyBiaXpcbiAgdGhpcy5jaHJvbWVkcml2ZXIgPSBjZDtcbiAgdGhpcy5wcm94eVJlcVJlcyA9IHRoaXMuY2hyb21lZHJpdmVyLnByb3h5UmVxLmJpbmQodGhpcy5jaHJvbWVkcml2ZXIpO1xuICB0aGlzLnByb3h5Q29tbWFuZCA9IHRoaXMuY2hyb21lZHJpdmVyLmp3cHJveHkuY29tbWFuZC5iaW5kKHRoaXMuY2hyb21lZHJpdmVyLmp3cHJveHkpO1xuICB0aGlzLmp3cFByb3h5QWN0aXZlID0gdHJ1ZTtcbn07XG5cbi8vIFN0b3AgcHJveHlpbmcgdG8gYW55IENocm9tZWRyaXZlclxuaGVscGVycy5zdXNwZW5kQ2hyb21lZHJpdmVyUHJveHkgPSBmdW5jdGlvbiBzdXNwZW5kQ2hyb21lZHJpdmVyUHJveHkgKCkge1xuICB0aGlzLmNocm9tZWRyaXZlciA9IG51bGw7XG4gIHRoaXMucHJveHlSZXFSZXMgPSBudWxsO1xuICB0aGlzLnByb3h5Q29tbWFuZCA9IG51bGw7XG4gIHRoaXMuandwUHJveHlBY3RpdmUgPSBmYWxzZTtcbn07XG5cbi8vIEhhbmRsZSBhbiBvdXQtb2YtYmFuZCBDaHJvbWVkcml2ZXIgc3RvcCBldmVudFxuaGVscGVycy5vbkNocm9tZWRyaXZlclN0b3AgPSBhc3luYyBmdW5jdGlvbiBvbkNocm9tZWRyaXZlclN0b3AgKGNvbnRleHQpIHtcbiAgdGhpcy5sb2cud2FybihgQ2hyb21lZHJpdmVyIGZvciBjb250ZXh0ICR7Y29udGV4dH0gc3RvcHBlZCB1bmV4cGVjdGVkbHlgKTtcbiAgaWYgKGNvbnRleHQgPT09IHRoaXMuY3VyQ29udGV4dCkge1xuICAgIC8vIHdlIGV4aXRlZCB1bmV4cGVjdGVkbHkgd2hpbGUgYXV0b21hdGluZyB0aGUgY3VycmVudCBjb250ZXh0IGFuZCBzbyB3YW50XG4gICAgLy8gdG8gc2h1dCBkb3duIHRoZSBzZXNzaW9uIGFuZCByZXNwb25kIHdpdGggYW4gZXJyb3JcbiAgICBsZXQgZXJyID0gbmV3IEVycm9yKCdDaHJvbWVkcml2ZXIgcXVpdCB1bmV4cGVjdGVkbHkgZHVyaW5nIHNlc3Npb24nKTtcbiAgICBhd2FpdCB0aGlzLnN0YXJ0VW5leHBlY3RlZFNodXRkb3duKGVycik7XG4gIH0gZWxzZSB7XG4gICAgLy8gaWYgYSBDaHJvbWVkcml2ZXIgaW4gdGhlIG5vbi1hY3RpdmUgY29udGV4dCBiYXJmcywgd2UgZG9uJ3QgcmVhbGx5XG4gICAgLy8gY2FyZSwgd2UnbGwganVzdCBtYWtlIGEgbmV3IG9uZSBuZXh0IHRpbWUgd2UgbmVlZCB0aGUgY29udGV4dC5cbiAgICB0aGlzLmxvZy53YXJuKFwiQ2hyb21lZHJpdmVyIHF1aXQgdW5leHBlY3RlZGx5LCBidXQgaXQgd2Fzbid0IHRoZSBhY3RpdmUgXCIgK1xuICAgICAgJ2NvbnRleHQsIGlnbm9yaW5nJyk7XG4gICAgZGVsZXRlIHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnNbY29udGV4dF07XG4gIH1cbn07XG5cbi8vIEludGVudGlvbmFsbHkgc3RvcCBhbGwgdGhlIGNocm9tZWRyaXZlcnMgY3VycmVudGx5IGFjdGl2ZSwgYW5kIGlnbm9yZVxuLy8gdGhlaXIgZXhpdCBldmVudHNcbmhlbHBlcnMuc3RvcENocm9tZWRyaXZlclByb3hpZXMgPSBhc3luYyBmdW5jdGlvbiBzdG9wQ2hyb21lZHJpdmVyUHJveGllcyAoKSB7XG4gIHRoaXMuc3VzcGVuZENocm9tZWRyaXZlclByb3h5KCk7IC8vIG1ha2Ugc3VyZSB3ZSB0dXJuIG9mZiB0aGUgcHJveHkgZmxhZ1xuICBmb3IgKGxldCBjb250ZXh0IG9mIF8ua2V5cyh0aGlzLnNlc3Npb25DaHJvbWVkcml2ZXJzKSkge1xuICAgIGxldCBjZCA9IHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnNbY29udGV4dF07XG4gICAgdGhpcy5sb2cuZGVidWcoYFN0b3BwaW5nIGNocm9tZWRyaXZlciBmb3IgY29udGV4dCAke2NvbnRleHR9YCk7XG4gICAgLy8gc3RvcCBsaXN0ZW5pbmcgZm9yIHRoZSBzdG9wcGVkIHN0YXRlIGV2ZW50XG4gICAgY2QucmVtb3ZlQWxsTGlzdGVuZXJzKENocm9tZWRyaXZlci5FVkVOVF9DSEFOR0VEKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgY2Quc3RvcCgpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5sb2cud2FybihgRXJyb3Igc3RvcHBpbmcgQ2hyb21lZHJpdmVyOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIH1cbiAgICBkZWxldGUgdGhpcy5zZXNzaW9uQ2hyb21lZHJpdmVyc1tjb250ZXh0XTtcbiAgfVxufTtcblxuaGVscGVycy5pc0Nocm9tZWRyaXZlckNvbnRleHQgPSBmdW5jdGlvbiBpc0Nocm9tZWRyaXZlckNvbnRleHQgKHZpZXdOYW1lKSB7XG4gIHJldHVybiBfLmluY2x1ZGVzKHZpZXdOYW1lLCBXRUJWSUVXX1dJTikgfHwgdmlld05hbWUgPT09IENIUk9NSVVNX1dJTjtcbn07XG5cbmhlbHBlcnMuc2hvdWxkRGlzbWlzc0Nocm9tZVdlbGNvbWUgPSBmdW5jdGlvbiBzaG91bGREaXNtaXNzQ2hyb21lV2VsY29tZSAoKSB7XG4gIHJldHVybiAhIXRoaXMub3B0cy5jaHJvbWVPcHRpb25zICYmXG4gICAgICAgICBfLmlzQXJyYXkodGhpcy5vcHRzLmNocm9tZU9wdGlvbnMuYXJncykgJiZcbiAgICAgICAgIHRoaXMub3B0cy5jaHJvbWVPcHRpb25zLmFyZ3MuaW5jbHVkZXMoJy0tbm8tZmlyc3QtcnVuJyk7XG59O1xuXG5oZWxwZXJzLmRpc21pc3NDaHJvbWVXZWxjb21lID0gYXN5bmMgZnVuY3Rpb24gZGlzbWlzc0Nocm9tZVdlbGNvbWUgKCkge1xuICB0aGlzLmxvZy5pbmZvKCdUcnlpbmcgdG8gZGlzbWlzcyBDaHJvbWUgd2VsY29tZScpO1xuICBsZXQgYWN0aXZpdHkgPSBhd2FpdCB0aGlzLmdldEN1cnJlbnRBY3Rpdml0eSgpO1xuICBpZiAoYWN0aXZpdHkgIT09ICdvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIuZmlyc3RydW4uRmlyc3RSdW5BY3Rpdml0eScpIHtcbiAgICB0aGlzLmxvZy5pbmZvKCdDaHJvbWUgd2VsY29tZSBkaWFsb2cgbmV2ZXIgc2hvd2VkIHVwISBDb250aW51aW5nJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxldCBlbCA9IGF3YWl0IHRoaXMuZmluZEVsT3JFbHMoJ2lkJywgJ2NvbS5hbmRyb2lkLmNocm9tZTppZC90ZXJtc19hY2NlcHQnLCBmYWxzZSk7XG4gIGF3YWl0IHRoaXMuY2xpY2soZWwuRUxFTUVOVCk7XG4gIHRyeSB7XG4gICAgbGV0IGVsID0gYXdhaXQgdGhpcy5maW5kRWxPckVscygnaWQnLCAnY29tLmFuZHJvaWQuY2hyb21lOmlkL25lZ2F0aXZlX2J1dHRvbicsIGZhbHNlKTtcbiAgICBhd2FpdCB0aGlzLmNsaWNrKGVsLkVMRU1FTlQpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gRE8gTk9USElORywgVEhJUyBERVZJQ0UgRElETlQgTEFVTkNIIFRIRSBTSUdOSU4gRElBTE9HXG4gICAgLy8gSVQgTVVTVCBCRSBBIE5PTiBHTVMgREVWSUNFXG4gICAgdGhpcy5sb2cud2FybihgVGhpcyBkZXZpY2UgZGlkIG5vdCBzaG93IENocm9tZSBTaWduSW4gZGlhbG9nLCAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuaGVscGVycy5zdGFydENocm9tZVNlc3Npb24gPSBhc3luYyBmdW5jdGlvbiBzdGFydENocm9tZVNlc3Npb24gKCkge1xuICB0aGlzLmxvZy5pbmZvKCdTdGFydGluZyBhIGNocm9tZS1iYXNlZCBicm93c2VyIHNlc3Npb24nKTtcbiAgbGV0IG9wdHMgPSBfLmNsb25lRGVlcCh0aGlzLm9wdHMpO1xuXG4gIGNvbnN0IGtub3duUGFja2FnZXMgPSBbXG4gICAgJ29yZy5jaHJvbWl1bS5jaHJvbWUuc2hlbGwnLFxuICAgICdjb20uYW5kcm9pZC5jaHJvbWUnLFxuICAgICdjb20uY2hyb21lLmJldGEnLFxuICAgICdvcmcuY2hyb21pdW0uY2hyb21lJyxcbiAgICAnb3JnLmNocm9taXVtLndlYnZpZXdfc2hlbGwnLFxuICBdO1xuXG4gIGlmIChfLmluY2x1ZGVzKGtub3duUGFja2FnZXMsIHRoaXMub3B0cy5hcHBQYWNrYWdlKSkge1xuICAgIG9wdHMuY2hyb21lQnVuZGxlSWQgPSB0aGlzLm9wdHMuYXBwUGFja2FnZTtcbiAgfSBlbHNlIHtcbiAgICBvcHRzLmNocm9tZUFuZHJvaWRBY3Rpdml0eSA9IHRoaXMub3B0cy5hcHBBY3Rpdml0eTtcbiAgfVxuICB0aGlzLmNocm9tZWRyaXZlciA9IGF3YWl0IHRoaXMuc2V0dXBOZXdDaHJvbWVkcml2ZXIob3B0cywgdGhpcy5hZGIuY3VyRGV2aWNlSWQsIHRoaXMuYWRiKTtcbiAgdGhpcy5jaHJvbWVkcml2ZXIub24oQ2hyb21lZHJpdmVyLkVWRU5UX0NIQU5HRUQsIChtc2cpID0+IHtcbiAgICBpZiAobXNnLnN0YXRlID09PSBDaHJvbWVkcml2ZXIuU1RBVEVfU1RPUFBFRCkge1xuICAgICAgdGhpcy5vbkNocm9tZWRyaXZlclN0b3AoQ0hST01JVU1fV0lOKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIE5vdyB0aGF0IHdlIGhhdmUgYSBDaHJvbWUgc2Vzc2lvbiwgd2UgZW5zdXJlIHRoYXQgdGhlIGNvbnRleHQgaXNcbiAgLy8gYXBwcm9wcmlhdGVseSBzZXQgYW5kIHRoYXQgdGhpcyBjaHJvbWVkcml2ZXIgaXMgYWRkZWQgdG8gdGhlIGxpc3RcbiAgLy8gb2Ygc2Vzc2lvbiBjaHJvbWVkcml2ZXJzIHNvIHdlIGNhbiBzd2l0Y2ggYmFjayBhbmQgZm9ydGhcbiAgdGhpcy5jdXJDb250ZXh0ID0gQ0hST01JVU1fV0lOO1xuICB0aGlzLnNlc3Npb25DaHJvbWVkcml2ZXJzW0NIUk9NSVVNX1dJTl0gPSB0aGlzLmNocm9tZWRyaXZlcjtcbiAgdGhpcy5wcm94eVJlcVJlcyA9IHRoaXMuY2hyb21lZHJpdmVyLnByb3h5UmVxLmJpbmQodGhpcy5jaHJvbWVkcml2ZXIpO1xuICB0aGlzLnByb3h5Q29tbWFuZCA9IHRoaXMuY2hyb21lZHJpdmVyLmp3cHJveHkuY29tbWFuZC5iaW5kKHRoaXMuY2hyb21lZHJpdmVyLmp3cHJveHkpO1xuICB0aGlzLmp3cFByb3h5QWN0aXZlID0gdHJ1ZTtcblxuICBpZiAodGhpcy5zaG91bGREaXNtaXNzQ2hyb21lV2VsY29tZSgpKSB7XG4gICAgLy8gZGlzbWlzcyBDaHJvbWUgd2VsY29tZSBkaWFsb2dcbiAgICBhd2FpdCB0aGlzLmRpc21pc3NDaHJvbWVXZWxjb21lKCk7XG4gIH1cbn07XG5cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEludGVybmFsIGxpYnJhcnkgZnVuY3Rpb25zXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5hc3luYyBmdW5jdGlvbiBzZXR1cEV4aXN0aW5nQ2hyb21lZHJpdmVyIChsb2csIGNocm9tZWRyaXZlcikge1xuICAvLyBjaGVjayB0aGUgc3RhdHVzIGJ5IHNlbmRpbmcgYSBzaW1wbGUgd2luZG93LWJhc2VkIGNvbW1hbmQgdG8gQ2hyb21lRHJpdmVyXG4gIC8vIGlmIHRoZXJlIGlzIGFuIGVycm9yLCB3ZSB3YW50IHRvIHJlY3JlYXRlIHRoZSBDaHJvbWVEcml2ZXIgc2Vzc2lvblxuICBpZiAoIWF3YWl0IGNocm9tZWRyaXZlci5oYXNXb3JraW5nV2VidmlldygpKSB7XG4gICAgbG9nLmRlYnVnKCdDaHJvbWVEcml2ZXIgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhIHdpbmRvdy4gJyArXG4gICAgICAgICAgICAgICAgICdSZS1pbml0aWFsaXppbmcgdGhlIHNlc3Npb24uJyk7XG4gICAgYXdhaXQgY2hyb21lZHJpdmVyLnJlc3RhcnQoKTtcbiAgfVxuICByZXR1cm4gY2hyb21lZHJpdmVyO1xufVxuXG4vKipcbiAqIEZpbmQgYSBmcmVlIHBvcnQgdG8gaGF2ZSBDaHJvbWVkcml2ZXIgbGlzdGVuIG9uLlxuICpcbiAqIEBwYXJhbSB7YXJyYXl9IHBvcnRTcGVjIC0gQXJyYXkgd2hpY2ggaXMgYSBsaXN0IG9mIHBvcnRzLiBBIGxpc3QgaXRlbSBtYXlcbiAqIGFsc28gaXRzZWxmIGJlIGFuIGFycmF5IG9mIGxlbmd0aCAyIHNwZWNpZnlpbmcgYSBzdGFydCBhbmQgZW5kIHBvcnQgb2ZcbiAqIGEgcmFuZ2UuIFNvbWUgdmFsaWQgcG9ydCBzcGVjczpcbiAqICAgIC0gWzgwMDAsIDgwMDEsIDgwMDJdXG4gKiAgICAtIFtbODAwMCwgODAwNV1dXG4gKiAgICAtIFs4MDAwLCBbOTAwMCwgOTEwMF1dXG4gKiBAcGFyYW0ge09iamVjdD99IGxvZyBMb2dnZXIgaW5zdGFuY2VcbiAqXG4gKiBAcmV0dXJuIHtudW1iZXJ9IEEgZnJlZSBwb3J0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldENocm9tZWRyaXZlclBvcnQgKHBvcnRTcGVjLCBsb2cgPSBudWxsKSB7XG4gIGNvbnN0IGdldFBvcnQgPSBCLnByb21pc2lmeShQb3J0RmluZGVyLmdldFBvcnQsIHtjb250ZXh0OiBQb3J0RmluZGVyfSk7XG5cbiAgLy8gaWYgdGhlIHVzZXIgZGlkbid0IGdpdmUgdXMgYW55IHNwZWNpZmljIGluZm9ybWF0aW9uIGFib3V0IGNocm9tZWRyaXZlclxuICAvLyBwb3J0IHJhbmdlcywganVzdCBmaW5kIGFueSBmcmVlIHBvcnRcbiAgaWYgKCFwb3J0U3BlYykge1xuICAgIGNvbnN0IHBvcnQgPSBhd2FpdCBnZXRQb3J0KCk7XG4gICAgbG9nPy5kZWJ1ZyhgQSBwb3J0IHdhcyBub3QgZ2l2ZW4sIHVzaW5nIHJhbmRvbSBmcmVlIHBvcnQ6ICR7cG9ydH1gKTtcbiAgICByZXR1cm4gcG9ydDtcbiAgfVxuXG4gIC8vIG90aGVyd2lzZSBmaW5kIHRoZSBmcmVlIHBvcnQgYmFzZWQgb24gYSBsaXN0IG9yIHJhbmdlIHByb3ZpZGVkIGJ5IHRoZSB1c2VyXG4gIGxvZz8uZGVidWcoYEZpbmRpbmcgYSBmcmVlIHBvcnQgZm9yIGNocm9tZWRyaXZlciB1c2luZyBzcGVjICR7SlNPTi5zdHJpbmdpZnkocG9ydFNwZWMpfWApO1xuICBsZXQgZm91bmRQb3J0ID0gbnVsbDtcbiAgZm9yIChjb25zdCBwb3RlbnRpYWxQb3J0IG9mIHBvcnRTcGVjKSB7XG4gICAgbGV0IHBvcnQsIHN0b3BQb3J0O1xuICAgIGlmIChfLmlzQXJyYXkocG90ZW50aWFsUG9ydCkpIHtcbiAgICAgIChbcG9ydCwgc3RvcFBvcnRdID0gcG90ZW50aWFsUG9ydCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBvcnQgPSBwYXJzZUludChwb3RlbnRpYWxQb3J0LCAxMCk7IC8vIGVuc3VyZSB3ZSBoYXZlIGEgbnVtYmVyIGFuZCBub3QgYSBzdHJpbmdcbiAgICAgIHN0b3BQb3J0ID0gcG9ydDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGxvZz8uZGVidWcoYENoZWNraW5nIHBvcnQgcmFuZ2UgJHtwb3J0fToke3N0b3BQb3J0fWApO1xuICAgICAgZm91bmRQb3J0ID0gYXdhaXQgZ2V0UG9ydCh7cG9ydCwgc3RvcFBvcnR9KTtcbiAgICAgIGJyZWFrO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZz8uZGVidWcoYE5vdGhpbmcgaW4gcG9ydCByYW5nZSAke3BvcnR9OiR7c3RvcFBvcnR9IHdhcyBhdmFpbGFibGVgKTtcbiAgICB9XG4gIH1cblxuICBpZiAoZm91bmRQb3J0ID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBhIGZyZWUgcG9ydCBmb3IgY2hyb21lZHJpdmVyIHVzaW5nIGAgK1xuICAgICAgICAgICAgICAgICAgICBgY2hyb21lZHJpdmVyUG9ydHMgc3BlYyAke0pTT04uc3RyaW5naWZ5KHBvcnRTcGVjKX1gKTtcbiAgfVxuXG4gIGxvZz8uZGVidWcoYFVzaW5nIGZyZWUgcG9ydCAke2ZvdW5kUG9ydH0gZm9yIGNocm9tZWRyaXZlcmApO1xuICByZXR1cm4gZm91bmRQb3J0O1xufVxuXG5oZWxwZXJzLmlzQ2hyb21lZHJpdmVyQXV0b2Rvd25sb2FkRW5hYmxlZCA9IGZ1bmN0aW9uIGlzQ2hyb21lZHJpdmVyQXV0b2Rvd25sb2FkRW5hYmxlZCAoKSB7XG4gIGlmICh0aGlzLmlzRmVhdHVyZUVuYWJsZWQoQ0hST01FRFJJVkVSX0FVVE9ET1dOTE9BRF9GRUFUVVJFKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHRoaXM/LmxvZz8uZGVidWcoYEF1dG9tYXRlZCBDaHJvbWVkcml2ZXIgZG93bmxvYWQgaXMgZGlzYWJsZWQuIGAgK1xuICAgIGBVc2UgJyR7Q0hST01FRFJJVkVSX0FVVE9ET1dOTE9BRF9GRUFUVVJFfScgc2VydmVyIGZlYXR1cmUgdG8gZW5hYmxlIGl0YCk7XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbmhlbHBlcnMuc2V0dXBOZXdDaHJvbWVkcml2ZXIgPSBhc3luYyBmdW5jdGlvbiBzZXR1cE5ld0Nocm9tZWRyaXZlciAob3B0cywgY3VyRGV2aWNlSWQsIGFkYiwgY29udGV4dCA9IG51bGwpIHtcbiAgaWYgKG9wdHMuY2hyb21lRHJpdmVyUG9ydCkge1xuICAgIHRoaXM/LmxvZz8ud2FybihgVGhlICdjaHJvbWVEcml2ZXJQb3J0JyBjYXBhYmlsaXR5IGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgJ2Nocm9tZWRyaXZlclBvcnQnIGluc3RlYWRgKTtcbiAgICBvcHRzLmNocm9tZWRyaXZlclBvcnQgPSBvcHRzLmNocm9tZURyaXZlclBvcnQ7XG4gIH1cblxuICBpZiAob3B0cy5jaHJvbWVkcml2ZXJQb3J0KSB7XG4gICAgdGhpcz8ubG9nPy5kZWJ1ZyhgVXNpbmcgdXNlci1zcGVjaWZpZWQgcG9ydCAke29wdHMuY2hyb21lZHJpdmVyUG9ydH0gZm9yIGNocm9tZWRyaXZlcmApO1xuICB9IGVsc2Uge1xuICAgIC8vIGlmIGEgc2luZ2xlIHBvcnQgd2Fzbid0IGdpdmVuLCB3ZSdsbCBsb29rIGZvciBhIGZyZWUgb25lXG4gICAgb3B0cy5jaHJvbWVkcml2ZXJQb3J0ID0gYXdhaXQgZ2V0Q2hyb21lZHJpdmVyUG9ydChvcHRzLmNocm9tZWRyaXZlclBvcnRzLCB0aGlzPy5sb2cpO1xuICB9XG5cbiAgY29uc3QgZGV0YWlscyA9IGNvbnRleHQgPyB3ZWJ2aWV3SGVscGVycy5nZXRXZWJ2aWV3RGV0YWlscyhhZGIsIGNvbnRleHQpIDogdW5kZWZpbmVkO1xuICBpZiAoIV8uaXNFbXB0eShkZXRhaWxzKSkge1xuICAgIHRoaXM/LmxvZz8uZGVidWcoJ1Bhc3Npbmcgd2ViIHZpZXcgZGV0YWlscyB0byB0aGUgQ2hyb21lZHJpdmVyIGNvbnN0cnVjdG9yOiAnICtcbiAgICAgIEpTT04uc3RyaW5naWZ5KGRldGFpbHMsIG51bGwsIDIpKTtcbiAgfVxuXG4gIGNvbnN0IGNocm9tZWRyaXZlciA9IG5ldyBDaHJvbWVkcml2ZXIoe1xuICAgIHBvcnQ6IG9wdHMuY2hyb21lZHJpdmVyUG9ydCxcbiAgICBleGVjdXRhYmxlOiBvcHRzLmNocm9tZWRyaXZlckV4ZWN1dGFibGUsXG4gICAgYWRiLFxuICAgIGNtZEFyZ3M6IG9wdHMuY2hyb21lZHJpdmVyQXJncyxcbiAgICB2ZXJib3NlOiAhIW9wdHMuc2hvd0Nocm9tZWRyaXZlckxvZyxcbiAgICBleGVjdXRhYmxlRGlyOiBvcHRzLmNocm9tZWRyaXZlckV4ZWN1dGFibGVEaXIsXG4gICAgbWFwcGluZ1BhdGg6IG9wdHMuY2hyb21lZHJpdmVyQ2hyb21lTWFwcGluZ0ZpbGUsXG4gICAgYnVuZGxlSWQ6IG9wdHMuY2hyb21lQnVuZGxlSWQsXG4gICAgdXNlU3lzdGVtRXhlY3V0YWJsZTogb3B0cy5jaHJvbWVkcml2ZXJVc2VTeXN0ZW1FeGVjdXRhYmxlLFxuICAgIGRpc2FibGVCdWlsZENoZWNrOiBvcHRzLmNocm9tZWRyaXZlckRpc2FibGVCdWlsZENoZWNrLFxuICAgIGRldGFpbHMsXG4gICAgaXNBdXRvZG93bmxvYWRFbmFibGVkOiB0aGlzPy5pc0Nocm9tZWRyaXZlckF1dG9kb3dubG9hZEVuYWJsZWQ/LigpXG4gIH0pO1xuXG4gIC8vIG1ha2Ugc3VyZSB0aGVyZSBhcmUgY2hyb21lT3B0aW9uc1xuICBvcHRzLmNocm9tZU9wdGlvbnMgPSBvcHRzLmNocm9tZU9wdGlvbnMgfHwge307XG4gIC8vIHRyeSBvdXQgYW55IHByZWZpeGVkIGNocm9tZU9wdGlvbnMsXG4gIC8vIGFuZCBzdHJpcCB0aGUgcHJlZml4XG4gIGZvciAoY29uc3Qgb3B0IG9mIF8ua2V5cyhvcHRzKSkge1xuICAgIGlmIChvcHQuZW5kc1dpdGgoJzpjaHJvbWVPcHRpb25zJykpIHtcbiAgICAgIHRoaXM/LmxvZz8ud2FybihgTWVyZ2luZyAnJHtvcHR9JyBpbnRvICdjaHJvbWVPcHRpb25zJy4gVGhpcyBtYXkgY2F1c2UgdW5leHBlY3RlZCBiZWhhdmlvcmApO1xuICAgICAgXy5tZXJnZShvcHRzLmNocm9tZU9wdGlvbnMsIG9wdHNbb3B0XSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgY2FwcyA9IHdlYnZpZXdIZWxwZXJzLmNyZWF0ZUNocm9tZWRyaXZlckNhcHMob3B0cywgY3VyRGV2aWNlSWQsIGRldGFpbHMpO1xuICB0aGlzPy5sb2c/LmRlYnVnKGBCZWZvcmUgc3RhcnRpbmcgY2hyb21lZHJpdmVyLCBhbmRyb2lkUGFja2FnZSBpcyAnJHtjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZFBhY2thZ2V9J2ApO1xuICBhd2FpdCBjaHJvbWVkcml2ZXIuc3RhcnQoY2Fwcyk7XG4gIHJldHVybiBjaHJvbWVkcml2ZXI7XG59O1xuY29uc3Qgc2V0dXBOZXdDaHJvbWVkcml2ZXIgPSBoZWxwZXJzLnNldHVwTmV3Q2hyb21lZHJpdmVyO1xuXG5cbk9iamVjdC5hc3NpZ24oZXh0ZW5zaW9ucywgY29tbWFuZHMsIGhlbHBlcnMpO1xuZXhwb3J0IHsgY29tbWFuZHMsIGhlbHBlcnMsIHNldHVwTmV3Q2hyb21lZHJpdmVyIH07XG5leHBvcnQgZGVmYXVsdCBleHRlbnNpb25zO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFBK0M7QUFBQTtBQUUvQyxNQUFNQSxpQ0FBaUMsR0FBRywyQkFBMkI7QUFFckUsSUFBSUMsUUFBUSxHQUFHLENBQUMsQ0FBQztFQUFFQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0VBQUVDLFVBQVUsR0FBRyxDQUFDLENBQUM7O0FBQUM7QUFBQTtBQU1qREYsUUFBUSxDQUFDRyxpQkFBaUIsR0FBRyxlQUFlQSxpQkFBaUIsR0FBSTtFQUcvRCxPQUFPLElBQUksQ0FBQ0MsVUFBVSxJQUFJLElBQUksQ0FBQ0Msa0JBQWtCLEVBQUU7QUFDckQsQ0FBQztBQUVETCxRQUFRLENBQUNNLFdBQVcsR0FBRyxlQUFlQSxXQUFXLEdBQUk7RUFDbkQsTUFBTUMsZUFBZSxHQUFHLE1BQU1DLHVCQUFjLENBQUNDLGtCQUFrQixDQUFDLElBQUksQ0FBQ0MsR0FBRyxFQUFFLElBQUksQ0FBQ0MsSUFBSSxDQUFDO0VBQ3BGLE9BQU8sSUFBSSxDQUFDQyxjQUFjLENBQUNMLGVBQWUsQ0FBQztBQUM3QyxDQUFDO0FBRURQLFFBQVEsQ0FBQ2EsVUFBVSxHQUFHLGVBQWVBLFVBQVUsQ0FBRUMsSUFBSSxFQUFFO0VBQ3JELElBQUksQ0FBQ0MsYUFBSSxDQUFDQyxRQUFRLENBQUNGLElBQUksQ0FBQyxFQUFFO0lBQ3hCQSxJQUFJLEdBQUcsSUFBSSxDQUFDVCxrQkFBa0IsRUFBRTtFQUNsQyxDQUFDLE1BQU0sSUFBSVMsSUFBSSxLQUFLRywyQkFBVyxFQUFFO0lBRS9CSCxJQUFJLEdBQUcsSUFBSSxDQUFDSSxrQkFBa0IsRUFBRTtFQUNsQztFQUVBLElBQUlKLElBQUksS0FBSyxJQUFJLENBQUNWLFVBQVUsRUFBRTtJQUM1QjtFQUNGO0VBRUEsTUFBTUcsZUFBZSxH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
320
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDSFJPTUVEUklWRVJfQVVUT0RPV05MT0FEX0ZFQVRVUkUiLCJjb21tYW5kcyIsImhlbHBlcnMiLCJleHRlbnNpb25zIiwiZ2V0Q3VycmVudENvbnRleHQiLCJjdXJDb250ZXh0IiwiZGVmYXVsdENvbnRleHROYW1lIiwiZ2V0Q29udGV4dHMiLCJ3ZWJ2aWV3c01hcHBpbmciLCJ3ZWJ2aWV3SGVscGVycyIsImdldFdlYlZpZXdzTWFwcGluZyIsImFkYiIsIm9wdHMiLCJhc3NpZ25Db250ZXh0cyIsInNldENvbnRleHQiLCJuYW1lIiwidXRpbCIsImhhc1ZhbHVlIiwiV0VCVklFV19XSU4iLCJkZWZhdWx0V2Vidmlld05hbWUiLCJjb250ZXh0cyIsIl8iLCJpbmNsdWRlcyIsImVycm9ycyIsIk5vU3VjaENvbnRleHRFcnJvciIsInN3aXRjaENvbnRleHQiLCJtb2JpbGVHZXRDb250ZXh0cyIsImFuZHJvaWREZXZpY2VTb2NrZXQiLCJlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcyIsIndlYnZpZXdEZXZ0b29sc1BvcnQiLCJlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24iLCJPYmplY3QiLCJhc3NpZ24iLCJpc0Nocm9tZVNlc3Npb24iLCJ3ZWJ2aWV3cyIsInBhcnNlV2Vidmlld05hbWVzIiwiTkFUSVZFX1dJTiIsImxvZyIsImRlYnVnIiwiSlNPTiIsInN0cmluZ2lmeSIsImlzQ2hyb21lZHJpdmVyQ29udGV4dCIsInN0YXJ0Q2hyb21lZHJpdmVyUHJveHkiLCJyZWNyZWF0ZUNocm9tZURyaXZlclNlc3Npb25zIiwic3RvcENocm9tZWRyaXZlclByb3hpZXMiLCJzdXNwZW5kQ2hyb21lZHJpdmVyUHJveHkiLCJFcnJvciIsIldFQlZJRVdfQkFTRSIsImF1dG9XZWJ2aWV3TmFtZSIsImFwcFBhY2thZ2UiLCJpc1dlYkNvbnRleHQiLCJjb250ZXh0IiwiY2QiLCJzZXNzaW9uQ2hyb21lZHJpdmVycyIsInNldHVwRXhpc3RpbmdDaHJvbWVkcml2ZXIiLCJjbG9uZURlZXAiLCJjaHJvbWVVc2VSdW5uaW5nQXBwIiwiZXh0cmFjdENocm9tZUFuZHJvaWRQYWNrYWdlRnJvbUNvbnRleHROYW1lIiwiYW5kcm9pZFBhY2thZ2UiLCJtYXRjaCIsImxlbmd0aCIsImNocm9tZUFuZHJvaWRQYWNrYWdlIiwiaGFzIiwibWFwIiwid20iLCJ3ZWJ2aWV3TmFtZSIsImtub3duUGFja2FnZSIsIktOT1dOX0NIUk9NRV9QQUNLQUdFX05BTUVTIiwiYXBwU3RhdGUiLCJxdWVyeUFwcFN0YXRlIiwiQVBQX1NUQVRFIiwiUlVOTklOR19JTl9CQUNLR1JPVU5EIiwiUlVOTklOR19JTl9GT1JFR1JPVU5EIiwiaW5mbyIsInNldHVwTmV3Q2hyb21lZHJpdmVyIiwiY3VyRGV2aWNlSWQiLCJvbiIsIkNocm9tZWRyaXZlciIsIkVWRU5UX0NIQU5HRUQiLCJtc2ciLCJzdGF0ZSIsIlNUQVRFX1NUT1BQRUQiLCJvbkNocm9tZWRyaXZlclN0b3AiLCJjaHJvbWVkcml2ZXIiLCJwcm94eVJlcVJlcyIsInByb3h5UmVxIiwiYmluZCIsInByb3h5Q29tbWFuZCIsImp3cHJveHkiLCJjb21tYW5kIiwiandwUHJveHlBY3RpdmUiLCJ3YXJuIiwiZXJyIiwic3RhcnRVbmV4cGVjdGVkU2h1dGRvd24iLCJrZXlzIiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwic3RvcCIsIm1lc3NhZ2UiLCJ2aWV3TmFtZSIsIkNIUk9NSVVNX1dJTiIsInNob3VsZERpc21pc3NDaHJvbWVXZWxjb21lIiwiY2hyb21lT3B0aW9ucyIsImlzQXJyYXkiLCJhcmdzIiwiZGlzbWlzc0Nocm9tZVdlbGNvbWUiLCJhY3Rpdml0eSIsImdldEN1cnJlbnRBY3Rpdml0eSIsImVsIiwiZmluZEVsT3JFbHMiLCJjbGljayIsIkVMRU1FTlQiLCJlIiwic3RhcnRDaHJvbWVTZXNzaW9uIiwia25vd25QYWNrYWdlcyIsImNocm9tZUJ1bmRsZUlkIiwiY2hyb21lQW5kcm9pZEFjdGl2aXR5IiwiYXBwQWN0aXZpdHkiLCJoYXNXb3JraW5nV2VidmlldyIsInJlc3RhcnQiLCJnZXRDaHJvbWVkcml2ZXJQb3J0IiwicG9ydFNwZWMiLCJnZXRQb3J0IiwiQiIsInByb21pc2lmeSIsIlBvcnRGaW5kZXIiLCJwb3J0IiwiZm91bmRQb3J0IiwicG90ZW50aWFsUG9ydCIsInN0b3BQb3J0IiwicGFyc2VJbnQiLCJpc0Nocm9tZWRyaXZlckF1dG9kb3dubG9hZEVuYWJsZWQiLCJpc0ZlYXR1cmVFbmFibGVkIiwiY2hyb21lRHJpdmVyUG9ydCIsImNocm9tZWRyaXZlclBvcnQiLCJjaHJvbWVkcml2ZXJQb3J0cyIsImRldGFpbHMiLCJnZXRXZWJ2aWV3RGV0YWlscyIsInVuZGVmaW5lZCIsImlzRW1wdHkiLCJleGVjdXRhYmxlIiwiY2hyb21lZHJpdmVyRXhlY3V0YWJsZSIsImNtZEFyZ3MiLCJjaHJvbWVkcml2ZXJBcmdzIiwidmVyYm9zZSIsInNob3dDaHJvbWVkcml2ZXJMb2ciLCJleGVjdXRhYmxlRGlyIiwiY2hyb21lZHJpdmVyRXhlY3V0YWJsZURpciIsIm1hcHBpbmdQYXRoIiwiY2hyb21lZHJpdmVyQ2hyb21lTWFwcGluZ0ZpbGUiLCJidW5kbGVJZCIsInVzZVN5c3RlbUV4ZWN1dGFibGUiLCJjaHJvbWVkcml2ZXJVc2VTeXN0ZW1FeGVjdXRhYmxlIiwiZGlzYWJsZUJ1aWxkQ2hlY2siLCJjaHJvbWVkcml2ZXJEaXNhYmxlQnVpbGRDaGVjayIsImlzQXV0b2Rvd25sb2FkRW5hYmxlZCIsIm9wdCIsImVuZHNXaXRoIiwibWVyZ2UiLCJjYXBzIiwiY3JlYXRlQ2hyb21lZHJpdmVyQ2FwcyIsInN0YXJ0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL2NvbnRleHQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBDaHJvbWVkcml2ZXIgZnJvbSAnYXBwaXVtLWNocm9tZWRyaXZlcic7XG5pbXBvcnQgUG9ydEZpbmRlciBmcm9tICdwb3J0ZmluZGVyJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHsgZXJyb3JzIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5pbXBvcnQge1xuICBkZWZhdWx0IGFzIHdlYnZpZXdIZWxwZXJzLFxuICBOQVRJVkVfV0lOLCBXRUJWSUVXX0JBU0UsIFdFQlZJRVdfV0lOLCBDSFJPTUlVTV9XSU4sIEtOT1dOX0NIUk9NRV9QQUNLQUdFX05BTUVTXG59IGZyb20gJy4uL3dlYnZpZXctaGVscGVycyc7XG5pbXBvcnQgeyBBUFBfU1RBVEUgfSBmcm9tICcuLi9hbmRyb2lkLWhlbHBlcnMnO1xuXG5jb25zdCBDSFJPTUVEUklWRVJfQVVUT0RPV05MT0FEX0ZFQVRVUkUgPSAnY2hyb21lZHJpdmVyX2F1dG9kb3dubG9hZCc7XG5cbmxldCBjb21tYW5kcyA9IHt9LCBoZWxwZXJzID0ge30sIGV4dGVuc2lvbnMgPSB7fTtcblxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBBY3R1YWwgTUpTT05XUCBjb21tYW5kIGhhbmRsZXJzXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5jb21tYW5kcy5nZXRDdXJyZW50Q29udGV4dCA9IGFzeW5jIGZ1bmN0aW9uIGdldEN1cnJlbnRDb250ZXh0ICgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWF3YWl0XG4gIC8vIGlmIHRoZSBjdXJyZW50IGNvbnRleHQgaXMgYG51bGxgLCBpbmRpY2F0aW5nIG5vIGNvbnRleHRcbiAgLy8gZXhwbGljaXRseSBzZXQsIGl0IGlzIHRoZSBkZWZhdWx0IGNvbnRleHRcbiAgcmV0dXJuIHRoaXMuY3VyQ29udGV4dCB8fCB0aGlzLmRlZmF1bHRDb250ZXh0TmFtZSgpO1xufTtcblxuY29tbWFuZHMuZ2V0Q29udGV4dHMgPSBhc3luYyBmdW5jdGlvbiBnZXRDb250ZXh0cyAoKSB7XG4gIGNvbnN0IHdlYnZpZXdzTWFwcGluZyA9IGF3YWl0IHdlYnZpZXdIZWxwZXJzLmdldFdlYlZpZXdzTWFwcGluZyh0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgcmV0dXJuIHRoaXMuYXNzaWduQ29udGV4dHMod2Vidmlld3NNYXBwaW5nKTtcbn07XG5cbmNvbW1hbmRzLnNldENvbnRleHQgPSBhc3luYyBmdW5jdGlvbiBzZXRDb250ZXh0IChuYW1lKSB7XG4gIGlmICghdXRpbC5oYXNWYWx1ZShuYW1lKSkge1xuICAgIG5hbWUgPSB0aGlzLmRlZmF1bHRDb250ZXh0TmFtZSgpO1xuICB9IGVsc2UgaWYgKG5hbWUgPT09IFdFQlZJRVdfV0lOKSB7XG4gICAgLy8gaGFuZGxlIHNldENvbnRleHQgXCJXRUJWSUVXXCJcbiAgICBuYW1lID0gdGhpcy5kZWZhdWx0V2Vidmlld05hbWUoKTtcbiAgfVxuICAvLyBpZiB3ZSdyZSBhbHJlYWR5IGluIHRoZSBjb250ZXh0IHdlIHdhbnQsIGRvIG5vdGhpbmdcbiAgaWYgKG5hbWUgPT09IHRoaXMuY3VyQ29udGV4dCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHdlYnZpZXdzTWFwcGluZyA9IGF3YWl0IHdlYnZpZXdIZWxwZXJzLmdldFdlYlZpZXdzTWFwcGluZyh0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgY29uc3QgY29udGV4dHMgPSB0aGlzLmFzc2lnbkNvbnRleHRzKHdlYnZpZXdzTWFwcGluZyk7XG4gIC8vIGlmIHRoZSBjb250ZXh0IHdlIHdhbnQgZG9lc24ndCBleGlzdCwgZmFpbFxuICBpZiAoIV8uaW5jbHVkZXMoY29udGV4dHMsIG5hbWUpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Ob1N1Y2hDb250ZXh0RXJyb3IoKTtcbiAgfVxuXG4gIGF3YWl0IHRoaXMuc3dpdGNoQ29udGV4dChuYW1lLCB3ZWJ2aWV3c01hcHBpbmcpO1xuICB0aGlzLmN1ckNvbnRleHQgPSBuYW1lO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBXZWJ2aWV3c01hcHBpbmdcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwcm9jIFRoZSBuYW1lIG9mIHRoZSBEZXZ0b29scyBVbml4IHNvY2tldFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHdlYnZpZXcgVGhlIHdlYiB2aWV3IGFsaWFzLiBMb29rcyBsaWtlIGBXRUJWSUVXX2BcbiAqIHByZWZpeCBwbHVzIFBJRCBvciBwYWNrYWdlIG5hbWVcbiAqIEBwcm9wZXJ0eSB7P09iamVjdH0gaW5mbyBXZWJ2aWV3IGluZm9ybWF0aW9uIGFzIGl0IGlzIHJldHJpZXZlZCBieVxuICogL2pzb24vdmVyc2lvbiBDRFAgZW5kcG9pbnRcbiAqIEBwcm9wZXJ0eSB7P0FycmF5PE9iamVjdD59IHBhZ2VzIFdlYnZpZXcgcGFnZXMgbGlzdCBhcyBpdCBpcyByZXRyaWV2ZWQgYnlcbiAqIC9qc29uL2xpc3QgQ0RQIGVuZHBvaW50XG4gKiBAcHJvcGVyeSB7P3N0cmluZ30gd2Vidmlld05hbWUgQW4gYWN0dWFsIHdlYnZpZXcgbmFtZSBmb3Igc3dpdGNoaW5nIGNvbnRleHQuXG4gKiBUaGlzIHZhbHVlIGJlY29tZXMgbnVsbCB3aGVuIGZhaWxpbmcgdG8gZmluZCBhIFBJRCBmb3IgYSB3ZWJ2aWV3LlxuICpcbiAqIFRoZSBmb2xsb3dpbmcganNvbiBkZW1vbnN0cmF0ZXMgdGhlIGV4YW1wbGUgb2YgV2Vidmlld3NNYXBwaW5nIG9iamVjdC5cbiAqIE5vdGUgdGhhdCBgZGVzY3JpcHRpb25gIGluIGBwYWdlYCBjYW4gYmUgYW4gZW1wdHkgc3RyaW5nIG1vc3QgbGlrZWx5IHdoZW4gaXQgY29tZXMgdG8gTW9iaWxlIENocm9tZSlcbiAqIHtcbiAqICAgXCJwcm9jXCI6IFwiQHdlYnZpZXdfZGV2dG9vbHNfcmVtb3RlXzIyMTM4XCIsXG4gKiAgIFwid2Vidmlld1wiOiBcIldFQlZJRVdfMjIxMzhcIixcbiAqICAgXCJpbmZvXCI6IHtcbiAqICAgICBcIkFuZHJvaWQtUGFja2FnZVwiOiBcImlvLmFwcGl1bS5zZXR0aW5nc1wiLFxuICogICAgIFwiQnJvd3NlclwiOiBcIkNocm9tZS83NC4wLjM3MjkuMTg1XCIsXG4gKiAgICAgXCJQcm90b2NvbC1WZXJzaW9uXCI6IFwiMS4zXCIsXG4gKiAgICAgXCJVc2VyLUFnZW50XCI6IFwiTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDEwOyBBbmRyb2lkIFNESyBidWlsdCBmb3IgeDg2IEJ1aWxkL1FTUjEuMTkwOTIwLjAwMTsgd3YpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNC4wIENocm9tZS83NC4wLjM3MjkuMTg1IE1vYmlsZSBTYWZhcmkvNTM3LjM2XCIsXG4gKiAgICAgXCJWOC1WZXJzaW9uXCI6IFwiNy40LjI4OC4yOFwiLFxuICogICAgIFwiV2ViS2l0LVZlcnNpb25cIjogXCI1MzcuMzYgKEAyMjk1NTY4MmY5NGNlMDkzMzYxOTdiZmI4ZGZmZWE5OTFmYTMyZjBkKVwiLFxuICogICAgIFwid2ViU29ja2V0RGVidWdnZXJVcmxcIjogXCJ3czovLzEyNy4wLjAuMToxMDkwMC9kZXZ0b29scy9icm93c2VyXCJcbiAqICAgfSxcbiAqICAgXCJwYWdlc1wiOiBbXG4gKiAgICAge1xuICogICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIntcXFwiYXR0YWNoZWRcXFwiOnRydWUsXFxcImVtcHR5XFxcIjpmYWxzZSxcXFwiaGVpZ2h0XFxcIjoxNDU4LFxcXCJzY3JlZW5YXFxcIjowLFxcXCJzY3JlZW5ZXFxcIjozMzYsXFxcInZpc2libGVcXFwiOnRydWUsXFxcIndpZHRoXFxcIjoxMDgwfVwiLFxuICogICAgICAgXCJkZXZ0b29sc0Zyb250ZW5kVXJsXCI6IFwiaHR0cDovL2Nocm9tZS1kZXZ0b29scy1mcm9udGVuZC5hcHBzcG90LmNvbS9zZXJ2ZV9yZXYvQDIyOTU1NjgyZjk0Y2UwOTMzNjE5N2JmYjhkZmZlYTk5MWZhMzJmMGQvaW5zcGVjdG9yLmh0bWw/d3M9MTI3LjAuMC4xOjEwOTAwL2RldnRvb2xzL3BhZ2UvMjczMjVDQzUwQjYwMEQzMUIyMzNGNDVFMDk0ODdCMUZcIixcbiAqICAgICAgIFwiaWRcIjogXCIyNzMyNUNDNTBCNjAwRDMxQjIzM0Y0NUUwOTQ4N0IxRlwiLFxuICogICAgICAgXCJ0aXRsZVwiOiBcIlJlbGVhc2VzIMK3IGFwcGl1bS9hcHBpdW0gwrcgR2l0SHViXCIsXG4gKiAgICAgICBcInR5cGVcIjogXCJwYWdlXCIsXG4gKiAgICAgICBcInVybFwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL3JlbGVhc2VzXCIsXG4gKiAgICAgICBcIndlYlNvY2tldERlYnVnZ2VyVXJsXCI6IFwid3M6Ly8xMjcuMC4wLjE6MTA5MDAvZGV2dG9vbHMvcGFnZS8yNzMyNUNDNTBCNjAwRDMxQjIzM0Y0NUUwOTQ4N0IxRlwiXG4gKiAgICAgfVxuICogICBdLFxuICogICBcIndlYnZpZXdOYW1lXCI6IFwiV0VCVklFV19jb20uaW8uYXBwaXVtLnNldHRpbmdcIlxuICogfVxuICovXG5cbi8qKlxuICogUmV0dXJucyBhIHdlYnZpZXdzTWFwcGluZyBiYXNlZCBvbiBDRFAgZW5kcG9pbnRzXG4gKlxuICogQHJldHVybiB7QXJyYXk8V2Vidmlld3NNYXBwaW5nPn0gd2Vidmlld3NNYXBwaW5nXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUdldENvbnRleHRzID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlR2V0Q29udGV4dHMgKCkge1xuICBjb25zdCBvcHRzID0ge1xuICAgIGFuZHJvaWREZXZpY2VTb2NrZXQ6IHRoaXMub3B0cy5hbmRyb2lkRGV2aWNlU29ja2V0LFxuICAgIGVuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzOiB0cnVlLFxuICAgIHdlYnZpZXdEZXZ0b29sc1BvcnQ6IHRoaXMub3B0cy53ZWJ2aWV3RGV2dG9vbHNQb3J0LFxuICAgIGVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbjogdHJ1ZVxuICB9O1xuICByZXR1cm4gYXdhaXQgd2Vidmlld0hlbHBlcnMuZ2V0V2ViVmlld3NNYXBwaW5nKHRoaXMuYWRiLCBvcHRzKTtcbn07XG5cbmhlbHBlcnMuYXNzaWduQ29udGV4dHMgPSBmdW5jdGlvbiBhc3NpZ25Db250ZXh0cyAod2Vidmlld3NNYXBwaW5nKSB7XG4gIGNvbnN0IG9wdHMgPSBPYmplY3QuYXNzaWduKHtpc0Nocm9tZVNlc3Npb246IHRoaXMuaXNDaHJvbWVTZXNzaW9ufSwgdGhpcy5vcHRzKTtcbiAgY29uc3Qgd2Vidmlld3MgPSB3ZWJ2aWV3SGVscGVycy5wYXJzZVdlYnZpZXdOYW1lcyh3ZWJ2aWV3c01hcHBpbmcsIG9wdHMpO1xuICB0aGlzLmNvbnRleHRzID0gW05BVElWRV9XSU4sIC4uLndlYnZpZXdzXTtcbiAgdGhpcy5sb2cuZGVidWcoYEF2YWlsYWJsZSBjb250ZXh0czogJHtKU09OLnN0cmluZ2lmeSh0aGlzLmNvbnRleHRzKX1gKTtcbiAgcmV0dXJuIHRoaXMuY29udGV4dHM7XG59O1xuXG5oZWxwZXJzLnN3aXRjaENvbnRleHQgPSBhc3luYyBmdW5jdGlvbiBzd2l0Y2hDb250ZXh0IChuYW1lLCB3ZWJ2aWV3c01hcHBpbmcpIHtcbiAgLy8gV2UgaGF2ZSBzb21lIG9wdGlvbnMgd2hlbiBpdCBjb21lcyB0byB3ZWJ2aWV3cy4gSWYgd2Ugd2FudCBhXG4gIC8vIENocm9tZWRyaXZlciB3ZWJ2aWV3LCB3ZSBjYW4gb25seSBjb250cm9sIG9uZSBhdCBhIHRpbWUuXG4gIGlmICh0aGlzLmlzQ2hyb21lZHJpdmVyQ29udGV4dChuYW1lKSkge1xuICAgIC8vIHN0YXJ0IHByb3h5aW5nIGNvbW1hbmRzIGRpcmVjdGx5IHRvIGNocm9tZWRyaXZlclxuICAgIGF3YWl0IHRoaXMuc3RhcnRDaHJvbWVkcml2ZXJQcm94eShuYW1lLCB3ZWJ2aWV3c01hcHBpbmcpO1xuICB9IGVsc2UgaWYgKHRoaXMuaXNDaHJvbWVkcml2ZXJDb250ZXh0KHRoaXMuY3VyQ29udGV4dCkpIHtcbiAgICAvLyBpZiB3ZSdyZSBtb3ZpbmcgdG8gYSBub24tY2hyb21lZHJpdmVyIHdlYnZpZXcsIGFuZCBvdXIgY3VycmVudCBjb250ZXh0XG4gICAgLy8gX2lzXyBhIGNocm9tZWRyaXZlciB3ZWJ2aWV3LCBpZiBjYXBzIHJlY3JlYXRlQ2hyb21lRHJpdmVyU2Vzc2lvbnMgaXMgc2V0XG4gICAgLy8gdG8gdHJ1ZSB0aGVuIGtpbGwgY2hyb21lZHJpdmVyIHNlc3Npb24gdXNpbmcgc3RvcENocm9tZWRyaXZlclByb3hpZXMgb3JcbiAgICAvLyBlbHNlIHNpbXBseSBzdXNwZW5kIHByb3h5aW5nIHRvIHRoZSBsYXR0ZXJcbiAgICBpZiAodGhpcy5vcHRzLnJlY3JlYXRlQ2hyb21lRHJpdmVyU2Vzc2lvbnMpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKCdyZWNyZWF0ZUNocm9tZURyaXZlclNlc3Npb25zIHNldCB0byB0cnVlOyBraWxsaW5nIGV4aXN0aW5nIGNocm9tZWRyaXZlcnMnKTtcbiAgICAgIGF3YWl0IHRoaXMuc3RvcENocm9tZWRyaXZlclByb3hpZXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdGhpcy5zdXNwZW5kQ2hyb21lZHJpdmVyUHJveHkoKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBEaWRuJ3Qga25vdyBob3cgdG8gaGFuZGxlIHN3aXRjaGluZyB0byBjb250ZXh0ICcke25hbWV9J2ApO1xuICB9XG59O1xuXG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogT24tb2JqZWN0IGNvbnRleHQtcmVsYXRlZCBoZWxwZXJzXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLy8gVGhlIHJlYXNvbiB0aGlzIGlzIGEgZnVuY3Rpb24gYW5kIG5vdCBqdXN0IGEgY29uc3RhbnQgaXMgdGhhdCBib3RoIGFuZHJvaWQtXG4vLyBkcml2ZXIgYW5kIHNlbGVuZHJvaWQtZHJpdmVyIHVzZSB0aGlzIGxvZ2ljLCBhbmQgZWFjaCBvbmUgcmV0dXJuc1xuLy8gYSBkaWZmZXJlbnQgZGVmYXVsdCBjb250ZXh0IG5hbWVcbmhlbHBlcnMuZGVmYXVsdENvbnRleHROYW1lID0gZnVuY3Rpb24gZGVmYXVsdENvbnRleHROYW1lICgpIHtcbiAgcmV0dXJuIE5BVElWRV9XSU47XG59O1xuXG5oZWxwZXJzLmRlZmF1bHRXZWJ2aWV3TmFtZSA9IGZ1bmN0aW9uIGRlZmF1bHRXZWJ2aWV3TmFtZSAoKSB7XG4gIHJldHVybiBXRUJWSUVXX0JBU0UgKyAodGhpcy5vcHRzLmF1dG9XZWJ2aWV3TmFtZSB8fCB0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG59O1xuXG5oZWxwZXJzLmlzV2ViQ29udGV4dCA9IGZ1bmN0aW9uIGlzV2ViQ29udGV4dCAoKSB7XG4gIHJldHVybiB0aGlzLmN1ckNvbnRleHQgIT09IG51bGwgJiYgdGhpcy5jdXJDb250ZXh0ICE9PSBOQVRJVkVfV0lOO1xufTtcblxuLy8gVHVybiBvbiBwcm94eWluZyB0byBhbiBleGlzdGluZyBDaHJvbWVkcml2ZXIgc2Vzc2lvbiBvciBhIG5ldyBvbmVcbmhlbHBlcnMuc3RhcnRDaHJvbWVkcml2ZXJQcm94eSA9IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0Q2hyb21lZHJpdmVyUHJveHkgKGNvbnRleHQsIHdlYnZpZXdzTWFwcGluZykge1xuICB0aGlzLmxvZy5kZWJ1ZyhgQ29ubmVjdGluZyB0byBjaHJvbWUtYmFja2VkIHdlYnZpZXcgY29udGV4dCAnJHtjb250ZXh0fSdgKTtcblxuICBsZXQgY2Q7XG4gIGlmICh0aGlzLnNlc3Npb25DaHJvbWVkcml2ZXJzW2NvbnRleHRdKSB7XG4gICAgLy8gaW4gdGhlIGNhc2Ugd2hlcmUgd2UndmUgYWxyZWFkeSBzZXQgdXAgYSBjaHJvbWVkcml2ZXIgZm9yIGEgY29udGV4dCxcbiAgICAvLyB3ZSB3YW50IHRvIHJlY29ubmVjdCB0byBpdCwgbm90IGNyZWF0ZSBhIHdob2xlIG5ldyBvbmVcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgRm91bmQgZXhpc3RpbmcgQ2hyb21lZHJpdmVyIGZvciBjb250ZXh0ICcke2NvbnRleHR9Jy4gVXNpbmcgaXQuYCk7XG4gICAgY2QgPSB0aGlzLnNlc3Npb25DaHJvbWVkcml2ZXJzW2NvbnRleHRdO1xuICAgIGF3YWl0IHNldHVwRXhpc3RpbmdDaHJvbWVkcml2ZXIodGhpcy5sb2csIGNkKTtcbiAgfSBlbHNlIHtcbiAgICBsZXQgb3B0cyA9IF8uY2xvbmVEZWVwKHRoaXMub3B0cyk7XG4gICAgb3B0cy5jaHJvbWVVc2VSdW5uaW5nQXBwID0gdHJ1ZTtcblxuICAgIC8vIGlmIHJlcXVlc3RlZCwgdGVsbCBjaHJvbWVkcml2ZXIgdG8gYXR0YWNoIHRvIHRoZSBhbmRyb2lkIHBhY2thZ2Ugd2UgaGF2ZVxuICAgIC8vIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29udGV4dCBuYW1lLCByYXRoZXIgdGhhbiB0aGUgcGFja2FnZSBvZiB0aGUgQVVULlxuICAgIC8vIEFuZCB0dXJuIHRoaXMgb24gYnkgZGVmYXVsdCBmb3IgY2hyb21lLS1pZiBjaHJvbWUgcG9wcyB1cCB3aXRoIGEgd2Vidmlld1xuICAgIC8vIGFuZCBzb21lb25lIHdhbnRzIHRvIHN3aXRjaCB0byBpdCwgd2Ugc2hvdWxkIGxldCBjaHJvbWVkcml2ZXIgY29ubmVjdCB0b1xuICAgIC8vIGNocm9tZSByYXRoZXIgdGhhbiBzdGF5aW5nIHN0dWNrIG9uIHRoZSBBVVRcbiAgICBpZiAob3B0cy5leHRyYWN0Q2hyb21lQW5kcm9pZFBhY2thZ2VGcm9tQ29udGV4dE5hbWUgfHwgY29udGV4dCA9PT0gYCR7V0VCVklFV19CQVNFfWNocm9tZWApIHtcbiAgICAgIGxldCBhbmRyb2lkUGFja2FnZSA9IGNvbnRleHQubWF0Y2goYCR7V0VCVklFV19CQVNFfSguKylgKTtcbiAgICAgIGlmIChhbmRyb2lkUGFja2FnZSAmJiBhbmRyb2lkUGFja2FnZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIG9wdHMuY2hyb21lQW5kcm9pZFBhY2thZ2UgPSBhbmRyb2lkUGFja2FnZVsxXTtcbiAgICAgIH1cbiAgICAgIGlmICghb3B0cy5leHRyYWN0Q2hyb21lQW5kcm9pZFBhY2thZ2VGcm9tQ29udGV4dE5hbWUpIHtcbiAgICAgICAgaWYgKF8uaGFzKHRoaXMub3B0cywgJ2VuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbicpICYmICF0aGlzLm9wdHMuZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uKSB7XG4gICAgICAgICAgLy8gV2hlbiBlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24gY2FwYWJpbGl0eSBpcyBleHBsaWNpdGx5IGRpc2FibGVkLCB0cnkgdG8gaWRlbnRpZnlcbiAgICAgICAgICAvLyBjaHJvbWVBbmRyb2lkUGFja2FnZSBiYXNlZCBvbiBjb250ZXh0cywga25vd24gY2hyb21lIHZhcmlhbnQgcGFja2FnZXMgYW5kIHF1ZXJ5QXBwU3RhdGUgcmVzdWx0XG4gICAgICAgICAgLy8gc2luY2Ugd2Vidmlld3NNYXBwaW5nIGRvZXMgbm90IGhhdmUgaW5mbyBvYmplY3RcbiAgICAgICAgICBjb25zdCBjb250ZXh0cyA9IHdlYnZpZXdzTWFwcGluZy5tYXAoKHdtKSA9PiB3bS53ZWJ2aWV3TmFtZSk7XG4gICAgICAgICAgZm9yIChjb25zdCBrbm93blBhY2thZ2Ugb2YgS05PV05fQ0hST01FX1BBQ0tBR0VfTkFNRVMpIHtcbiAgICAgICAgICAgIGlmIChfLmluY2x1ZGVzKGNvbnRleHRzLCBgJHtXRUJWSUVXX0JBU0V9JHtrbm93blBhY2thZ2V9YCkpIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBhcHBTdGF0ZSA9IGF3YWl0IHRoaXMucXVlcnlBcHBTdGF0ZShrbm93blBhY2thZ2UpO1xuICAgICAgICAgICAgaWYgKF8uaW5jbHVkZXMoW0FQUF9TVEFURS5SVU5OSU5HX0lOX0JBQ0tHUk9VTkQsIEFQUF9TVEFURS5SVU5OSU5HX0lOX0ZPUkVHUk9VTkRdLCBhcHBTdGF0ZSkpIHtcbiAgICAgICAgICAgICAgb3B0cy5jaHJvbWVBbmRyb2lkUGFja2FnZSA9IGtub3duUGFja2FnZTtcbiAgICAgICAgICAgICAgdGhpcy5sb2cuZGVidWcoYElkZW50aWZpZWQgY2hyb21lQW5kcm9pZFBhY2thZ2UgYXMgJyR7b3B0cy5jaHJvbWVBbmRyb2lkUGFja2FnZX0nIGAgK1xuICAgICAgICAgICAgICAgIGBmb3IgY29udGV4dCAnJHtjb250ZXh0fScgYnkgcXVlcnlpbmcgc3RhdGVzIG9mIENocm9tZSBhcHAgcGFja2FnZXNgKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvciAoY29uc3Qgd20gb2Ygd2Vidmlld3NNYXBwaW5nKSB7XG4gICAgICAgICAgICBpZiAod20ud2Vidmlld05hbWUgPT09IGNvbnRleHQgJiYgXy5oYXMod20/LmluZm8sICdBbmRyb2lkLVBhY2thZ2UnKSkge1xuICAgICAgICAgICAgICBvcHRzLmNocm9tZUFuZHJvaWRQYWNrYWdlID0gd20uaW5mb1snQW5kcm9pZC1QYWNrYWdlJ107XG4gICAgICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGBJZGVudGlmaWVkIGNocm9tZUFuZHJvaWRQYWNrYWdlIGFzICcke29wdHMuY2hyb21lQW5kcm9pZFBhY2thZ2V9JyBgICtcbiAgICAgICAgICAgICAgICBgZm9yIGNvbnRleHQgJyR7Y29udGV4dH0nIGJ5IENEUGApO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjZCA9IGF3YWl0IHRoaXMuc2V0dXBOZXdDaHJvbWVkcml2ZXIob3B0cywgdGhpcy5hZGIuY3VyRGV2aWNlSWQsIHRoaXMuYWRiLCBjb250ZXh0KTtcbiAgICAvLyBiaW5kIG91ciBzdG9wL2V4aXQgaGFuZGxlciwgcGFzc2luZyBpbiBjb250ZXh0IHNvIHdlIGtub3cgd2hpY2hcbiAgICAvLyBvbmUgc3RvcHBlZCB1bmV4cGVjdGVkbHlcbiAgICBjZC5vbihDaHJvbWVkcml2ZXIuRVZFTlRfQ0hBTkdFRCwgKG1zZykgPT4ge1xuICAgICAgaWYgKG1zZy5zdGF0ZSA9PT0gQ2hyb21lZHJpdmVyLlNUQVRFX1NUT1BQRUQpIHtcbiAgICAgICAgdGhpcy5vbkNocm9tZWRyaXZlclN0b3AoY29udGV4dCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgLy8gc2F2ZSB0aGUgY2hyb21lZHJpdmVyIG9iamVjdCB1bmRlciB0aGUgY29udGV4dFxuICAgIHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnNbY29udGV4dF0gPSBjZDtcbiAgfVxuICAvLyBob29rIHVwIHRoZSBsb2NhbCB2YXJpYWJsZXMgc28gd2UgY2FuIHByb3h5IHRoaXMgYml6XG4gIHRoaXMuY2hyb21lZHJpdmVyID0gY2Q7XG4gIHRoaXMucHJveHlSZXFSZXMgPSB0aGlzLmNocm9tZWRyaXZlci5wcm94eVJlcS5iaW5kKHRoaXMuY2hyb21lZHJpdmVyKTtcbiAgdGhpcy5wcm94eUNvbW1hbmQgPSB0aGlzLmNocm9tZWRyaXZlci5qd3Byb3h5LmNvbW1hbmQuYmluZCh0aGlzLmNocm9tZWRyaXZlci5qd3Byb3h5KTtcbiAgdGhpcy5qd3BQcm94eUFjdGl2ZSA9IHRydWU7XG59O1xuXG4vLyBTdG9wIHByb3h5aW5nIHRvIGFueSBDaHJvbWVkcml2ZXJcbmhlbHBlcnMuc3VzcGVuZENocm9tZWRyaXZlclByb3h5ID0gZnVuY3Rpb24gc3VzcGVuZENocm9tZWRyaXZlclByb3h5ICgpIHtcbiAgdGhpcy5jaHJvbWVkcml2ZXIgPSBudWxsO1xuICB0aGlzLnByb3h5UmVxUmVzID0gbnVsbDtcbiAgdGhpcy5wcm94eUNvbW1hbmQgPSBudWxsO1xuICB0aGlzLmp3cFByb3h5QWN0aXZlID0gZmFsc2U7XG59O1xuXG4vLyBIYW5kbGUgYW4gb3V0LW9mLWJhbmQgQ2hyb21lZHJpdmVyIHN0b3AgZXZlbnRcbmhlbHBlcnMub25DaHJvbWVkcml2ZXJTdG9wID0gYXN5bmMgZnVuY3Rpb24gb25DaHJvbWVkcml2ZXJTdG9wIChjb250ZXh0KSB7XG4gIHRoaXMubG9nLndhcm4oYENocm9tZWRyaXZlciBmb3IgY29udGV4dCAke2NvbnRleHR9IHN0b3BwZWQgdW5leHBlY3RlZGx5YCk7XG4gIGlmIChjb250ZXh0ID09PSB0aGlzLmN1ckNvbnRleHQpIHtcbiAgICAvLyB3ZSBleGl0ZWQgdW5leHBlY3RlZGx5IHdoaWxlIGF1dG9tYXRpbmcgdGhlIGN1cnJlbnQgY29udGV4dCBhbmQgc28gd2FudFxuICAgIC8vIHRvIHNodXQgZG93biB0aGUgc2Vzc2lvbiBhbmQgcmVzcG9uZCB3aXRoIGFuIGVycm9yXG4gICAgbGV0IGVyciA9IG5ldyBFcnJvcignQ2hyb21lZHJpdmVyIHF1aXQgdW5leHBlY3RlZGx5IGR1cmluZyBzZXNzaW9uJyk7XG4gICAgYXdhaXQgdGhpcy5zdGFydFVuZXhwZWN0ZWRTaHV0ZG93bihlcnIpO1xuICB9IGVsc2Uge1xuICAgIC8vIGlmIGEgQ2hyb21lZHJpdmVyIGluIHRoZSBub24tYWN0aXZlIGNvbnRleHQgYmFyZnMsIHdlIGRvbid0IHJlYWxseVxuICAgIC8vIGNhcmUsIHdlJ2xsIGp1c3QgbWFrZSBhIG5ldyBvbmUgbmV4dCB0aW1lIHdlIG5lZWQgdGhlIGNvbnRleHQuXG4gICAgdGhpcy5sb2cud2FybihcIkNocm9tZWRyaXZlciBxdWl0IHVuZXhwZWN0ZWRseSwgYnV0IGl0IHdhc24ndCB0aGUgYWN0aXZlIFwiICtcbiAgICAgICdjb250ZXh0LCBpZ25vcmluZycpO1xuICAgIGRlbGV0ZSB0aGlzLnNlc3Npb25DaHJvbWVkcml2ZXJzW2NvbnRleHRdO1xuICB9XG59O1xuXG4vLyBJbnRlbnRpb25hbGx5IHN0b3AgYWxsIHRoZSBjaHJvbWVkcml2ZXJzIGN1cnJlbnRseSBhY3RpdmUsIGFuZCBpZ25vcmVcbi8vIHRoZWlyIGV4aXQgZXZlbnRzXG5oZWxwZXJzLnN0b3BDaHJvbWVkcml2ZXJQcm94aWVzID0gYXN5bmMgZnVuY3Rpb24gc3RvcENocm9tZWRyaXZlclByb3hpZXMgKCkge1xuICB0aGlzLnN1c3BlbmRDaHJvbWVkcml2ZXJQcm94eSgpOyAvLyBtYWtlIHN1cmUgd2UgdHVybiBvZmYgdGhlIHByb3h5IGZsYWdcbiAgZm9yIChsZXQgY29udGV4dCBvZiBfLmtleXModGhpcy5zZXNzaW9uQ2hyb21lZHJpdmVycykpIHtcbiAgICBsZXQgY2QgPSB0aGlzLnNlc3Npb25DaHJvbWVkcml2ZXJzW2NvbnRleHRdO1xuICAgIHRoaXMubG9nLmRlYnVnKGBTdG9wcGluZyBjaHJvbWVkcml2ZXIgZm9yIGNvbnRleHQgJHtjb250ZXh0fWApO1xuICAgIC8vIHN0b3AgbGlzdGVuaW5nIGZvciB0aGUgc3RvcHBlZCBzdGF0ZSBldmVudFxuICAgIGNkLnJlbW92ZUFsbExpc3RlbmVycyhDaHJvbWVkcml2ZXIuRVZFTlRfQ0hBTkdFRCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGNkLnN0b3AoKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMubG9nLndhcm4oYEVycm9yIHN0b3BwaW5nIENocm9tZWRyaXZlcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICB9XG4gICAgZGVsZXRlIHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnNbY29udGV4dF07XG4gIH1cbn07XG5cbmhlbHBlcnMuaXNDaHJvbWVkcml2ZXJDb250ZXh0ID0gZnVuY3Rpb24gaXNDaHJvbWVkcml2ZXJDb250ZXh0ICh2aWV3TmFtZSkge1xuICByZXR1cm4gXy5pbmNsdWRlcyh2aWV3TmFtZSwgV0VCVklFV19XSU4pIHx8IHZpZXdOYW1lID09PSBDSFJPTUlVTV9XSU47XG59O1xuXG5oZWxwZXJzLnNob3VsZERpc21pc3NDaHJvbWVXZWxjb21lID0gZnVuY3Rpb24gc2hvdWxkRGlzbWlzc0Nocm9tZVdlbGNvbWUgKCkge1xuICByZXR1cm4gISF0aGlzLm9wdHMuY2hyb21lT3B0aW9ucyAmJlxuICAgICAgICAgXy5pc0FycmF5KHRoaXMub3B0cy5jaHJvbWVPcHRpb25zLmFyZ3MpICYmXG4gICAgICAgICB0aGlzLm9wdHMuY2hyb21lT3B0aW9ucy5hcmdzLmluY2x1ZGVzKCctLW5vLWZpcnN0LXJ1bicpO1xufTtcblxuaGVscGVycy5kaXNtaXNzQ2hyb21lV2VsY29tZSA9IGFzeW5jIGZ1bmN0aW9uIGRpc21pc3NDaHJvbWVXZWxjb21lICgpIHtcbiAgdGhpcy5sb2cuaW5mbygnVHJ5aW5nIHRvIGRpc21pc3MgQ2hyb21lIHdlbGNvbWUnKTtcbiAgbGV0IGFjdGl2aXR5ID0gYXdhaXQgdGhpcy5nZXRDdXJyZW50QWN0aXZpdHkoKTtcbiAgaWYgKGFjdGl2aXR5ICE9PSAnb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLmZpcnN0cnVuLkZpcnN0UnVuQWN0aXZpdHknKSB7XG4gICAgdGhpcy5sb2cuaW5mbygnQ2hyb21lIHdlbGNvbWUgZGlhbG9nIG5ldmVyIHNob3dlZCB1cCEgQ29udGludWluZycpO1xuICAgIHJldHVybjtcbiAgfVxuICBsZXQgZWwgPSBhd2FpdCB0aGlzLmZpbmRFbE9yRWxzKCdpZCcsICdjb20uYW5kcm9pZC5jaHJvbWU6aWQvdGVybXNfYWNjZXB0JywgZmFsc2UpO1xuICBhd2FpdCB0aGlzLmNsaWNrKGVsLkVMRU1FTlQpO1xuICB0cnkge1xuICAgIGxldCBlbCA9IGF3YWl0IHRoaXMuZmluZEVsT3JFbHMoJ2lkJywgJ2NvbS5hbmRyb2lkLmNocm9tZTppZC9uZWdhdGl2ZV9idXR0b24nLCBmYWxzZSk7XG4gICAgYXdhaXQgdGhpcy5jbGljayhlbC5FTEVNRU5UKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIERPIE5PVEhJTkcsIFRISVMgREVWSUNFIERJRE5UIExBVU5DSCBUSEUgU0lHTklOIERJQUxPR1xuICAgIC8vIElUIE1VU1QgQkUgQSBOT04gR01TIERFVklDRVxuICAgIHRoaXMubG9nLndhcm4oYFRoaXMgZGV2aWNlIGRpZCBub3Qgc2hvdyBDaHJvbWUgU2lnbkluIGRpYWxvZywgJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbmhlbHBlcnMuc3RhcnRDaHJvbWVTZXNzaW9uID0gYXN5bmMgZnVuY3Rpb24gc3RhcnRDaHJvbWVTZXNzaW9uICgpIHtcbiAgdGhpcy5sb2cuaW5mbygnU3RhcnRpbmcgYSBjaHJvbWUtYmFzZWQgYnJvd3NlciBzZXNzaW9uJyk7XG4gIGxldCBvcHRzID0gXy5jbG9uZURlZXAodGhpcy5vcHRzKTtcblxuICBjb25zdCBrbm93blBhY2thZ2VzID0gW1xuICAgICdvcmcuY2hyb21pdW0uY2hyb21lLnNoZWxsJyxcbiAgICAnY29tLmFuZHJvaWQuY2hyb21lJyxcbiAgICAnY29tLmNocm9tZS5iZXRhJyxcbiAgICAnb3JnLmNocm9taXVtLmNocm9tZScsXG4gICAgJ29yZy5jaHJvbWl1bS53ZWJ2aWV3X3NoZWxsJyxcbiAgXTtcblxuICBpZiAoXy5pbmNsdWRlcyhrbm93blBhY2thZ2VzLCB0aGlzLm9wdHMuYXBwUGFja2FnZSkpIHtcbiAgICBvcHRzLmNocm9tZUJ1bmRsZUlkID0gdGhpcy5vcHRzLmFwcFBhY2thZ2U7XG4gIH0gZWxzZSB7XG4gICAgb3B0cy5jaHJvbWVBbmRyb2lkQWN0aXZpdHkgPSB0aGlzLm9wdHMuYXBwQWN0aXZpdHk7XG4gIH1cbiAgdGhpcy5jaHJvbWVkcml2ZXIgPSBhd2FpdCB0aGlzLnNldHVwTmV3Q2hyb21lZHJpdmVyKG9wdHMsIHRoaXMuYWRiLmN1ckRldmljZUlkLCB0aGlzLmFkYik7XG4gIHRoaXMuY2hyb21lZHJpdmVyLm9uKENocm9tZWRyaXZlci5FVkVOVF9DSEFOR0VELCAobXNnKSA9PiB7XG4gICAgaWYgKG1zZy5zdGF0ZSA9PT0gQ2hyb21lZHJpdmVyLlNUQVRFX1NUT1BQRUQpIHtcbiAgICAgIHRoaXMub25DaHJvbWVkcml2ZXJTdG9wKENIUk9NSVVNX1dJTik7XG4gICAgfVxuICB9KTtcblxuICAvLyBOb3cgdGhhdCB3ZSBoYXZlIGEgQ2hyb21lIHNlc3Npb24sIHdlIGVuc3VyZSB0aGF0IHRoZSBjb250ZXh0IGlzXG4gIC8vIGFwcHJvcHJpYXRlbHkgc2V0IGFuZCB0aGF0IHRoaXMgY2hyb21lZHJpdmVyIGlzIGFkZGVkIHRvIHRoZSBsaXN0XG4gIC8vIG9mIHNlc3Npb24gY2hyb21lZHJpdmVycyBzbyB3ZSBjYW4gc3dpdGNoIGJhY2sgYW5kIGZvcnRoXG4gIHRoaXMuY3VyQ29udGV4dCA9IENIUk9NSVVNX1dJTjtcbiAgdGhpcy5zZXNzaW9uQ2hyb21lZHJpdmVyc1tDSFJPTUlVTV9XSU5dID0gdGhpcy5jaHJvbWVkcml2ZXI7XG4gIHRoaXMucHJveHlSZXFSZXMgPSB0aGlzLmNocm9tZWRyaXZlci5wcm94eVJlcS5iaW5kKHRoaXMuY2hyb21lZHJpdmVyKTtcbiAgdGhpcy5wcm94eUNvbW1hbmQgPSB0aGlzLmNocm9tZWRyaXZlci5qd3Byb3h5LmNvbW1hbmQuYmluZCh0aGlzLmNocm9tZWRyaXZlci5qd3Byb3h5KTtcbiAgdGhpcy5qd3BQcm94eUFjdGl2ZSA9IHRydWU7XG5cbiAgaWYgKHRoaXMuc2hvdWxkRGlzbWlzc0Nocm9tZVdlbGNvbWUoKSkge1xuICAgIC8vIGRpc21pc3MgQ2hyb21lIHdlbGNvbWUgZGlhbG9nXG4gICAgYXdhaXQgdGhpcy5kaXNtaXNzQ2hyb21lV2VsY29tZSgpO1xuICB9XG59O1xuXG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBJbnRlcm5hbCBsaWJyYXJ5IGZ1bmN0aW9uc1xuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuYXN5bmMgZnVuY3Rpb24gc2V0dXBFeGlzdGluZ0Nocm9tZWRyaXZlciAobG9nLCBjaHJvbWVkcml2ZXIpIHtcbiAgLy8gY2hlY2sgdGhlIHN0YXR1cyBieSBzZW5kaW5nIGEgc2ltcGxlIHdpbmRvdy1iYXNlZCBjb21tYW5kIHRvIENocm9tZURyaXZlclxuICAvLyBpZiB0aGVyZSBpcyBhbiBlcnJvciwgd2Ugd2FudCB0byByZWNyZWF0ZSB0aGUgQ2hyb21lRHJpdmVyIHNlc3Npb25cbiAgaWYgKCFhd2FpdCBjaHJvbWVkcml2ZXIuaGFzV29ya2luZ1dlYnZpZXcoKSkge1xuICAgIGxvZy5kZWJ1ZygnQ2hyb21lRHJpdmVyIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYSB3aW5kb3cuICcgK1xuICAgICAgICAgICAgICAgICAnUmUtaW5pdGlhbGl6aW5nIHRoZSBzZXNzaW9uLicpO1xuICAgIGF3YWl0IGNocm9tZWRyaXZlci5yZXN0YXJ0KCk7XG4gIH1cbiAgcmV0dXJuIGNocm9tZWRyaXZlcjtcbn1cblxuLyoqXG4gKiBGaW5kIGEgZnJlZSBwb3J0IHRvIGhhdmUgQ2hyb21lZHJpdmVyIGxpc3RlbiBvbi5cbiAqXG4gKiBAcGFyYW0ge2FycmF5fSBwb3J0U3BlYyAtIEFycmF5IHdoaWNoIGlzIGEgbGlzdCBvZiBwb3J0cy4gQSBsaXN0IGl0ZW0gbWF5XG4gKiBhbHNvIGl0c2VsZiBiZSBhbiBhcnJheSBvZiBsZW5ndGggMiBzcGVjaWZ5aW5nIGEgc3RhcnQgYW5kIGVuZCBwb3J0IG9mXG4gKiBhIHJhbmdlLiBTb21lIHZhbGlkIHBvcnQgc3BlY3M6XG4gKiAgICAtIFs4MDAwLCA4MDAxLCA4MDAyXVxuICogICAgLSBbWzgwMDAsIDgwMDVdXVxuICogICAgLSBbODAwMCwgWzkwMDAsIDkxMDBdXVxuICogQHBhcmFtIHtPYmplY3Q/fSBsb2cgTG9nZ2VyIGluc3RhbmNlXG4gKlxuICogQHJldHVybiB7bnVtYmVyfSBBIGZyZWUgcG9ydFxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRDaHJvbWVkcml2ZXJQb3J0IChwb3J0U3BlYywgbG9nID0gbnVsbCkge1xuICBjb25zdCBnZXRQb3J0ID0gQi5wcm9taXNpZnkoUG9ydEZpbmRlci5nZXRQb3J0LCB7Y29udGV4dDogUG9ydEZpbmRlcn0pO1xuXG4gIC8vIGlmIHRoZSB1c2VyIGRpZG4ndCBnaXZlIHVzIGFueSBzcGVjaWZpYyBpbmZvcm1hdGlvbiBhYm91dCBjaHJvbWVkcml2ZXJcbiAgLy8gcG9ydCByYW5nZXMsIGp1c3QgZmluZCBhbnkgZnJlZSBwb3J0XG4gIGlmICghcG9ydFNwZWMpIHtcbiAgICBjb25zdCBwb3J0ID0gYXdhaXQgZ2V0UG9ydCgpO1xuICAgIGxvZz8uZGVidWcoYEEgcG9ydCB3YXMgbm90IGdpdmVuLCB1c2luZyByYW5kb20gZnJlZSBwb3J0OiAke3BvcnR9YCk7XG4gICAgcmV0dXJuIHBvcnQ7XG4gIH1cblxuICAvLyBvdGhlcndpc2UgZmluZCB0aGUgZnJlZSBwb3J0IGJhc2VkIG9uIGEgbGlzdCBvciByYW5nZSBwcm92aWRlZCBieSB0aGUgdXNlclxuICBsb2c/LmRlYnVnKGBGaW5kaW5nIGEgZnJlZSBwb3J0IGZvciBjaHJvbWVkcml2ZXIgdXNpbmcgc3BlYyAke0pTT04uc3RyaW5naWZ5KHBvcnRTcGVjKX1gKTtcbiAgbGV0IGZvdW5kUG9ydCA9IG51bGw7XG4gIGZvciAoY29uc3QgcG90ZW50aWFsUG9ydCBvZiBwb3J0U3BlYykge1xuICAgIGxldCBwb3J0LCBzdG9wUG9ydDtcbiAgICBpZiAoXy5pc0FycmF5KHBvdGVudGlhbFBvcnQpKSB7XG4gICAgICAoW3BvcnQsIHN0b3BQb3J0XSA9IHBvdGVudGlhbFBvcnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwb3J0ID0gcGFyc2VJbnQocG90ZW50aWFsUG9ydCwgMTApOyAvLyBlbnN1cmUgd2UgaGF2ZSBhIG51bWJlciBhbmQgbm90IGEgc3RyaW5nXG4gICAgICBzdG9wUG9ydCA9IHBvcnQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBsb2c/LmRlYnVnKGBDaGVja2luZyBwb3J0IHJhbmdlICR7cG9ydH06JHtzdG9wUG9ydH1gKTtcbiAgICAgIGZvdW5kUG9ydCA9IGF3YWl0IGdldFBvcnQoe3BvcnQsIHN0b3BQb3J0fSk7XG4gICAgICBicmVhaztcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2c/LmRlYnVnKGBOb3RoaW5nIGluIHBvcnQgcmFuZ2UgJHtwb3J0fToke3N0b3BQb3J0fSB3YXMgYXZhaWxhYmxlYCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGZvdW5kUG9ydCA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgYSBmcmVlIHBvcnQgZm9yIGNocm9tZWRyaXZlciB1c2luZyBgICtcbiAgICAgICAgICAgICAgICAgICAgYGNocm9tZWRyaXZlclBvcnRzIHNwZWMgJHtKU09OLnN0cmluZ2lmeShwb3J0U3BlYyl9YCk7XG4gIH1cblxuICBsb2c/LmRlYnVnKGBVc2luZyBmcmVlIHBvcnQgJHtmb3VuZFBvcnR9IGZvciBjaHJvbWVkcml2ZXJgKTtcbiAgcmV0dXJuIGZvdW5kUG9ydDtcbn1cblxuaGVscGVycy5pc0Nocm9tZWRyaXZlckF1dG9kb3dubG9hZEVuYWJsZWQgPSBmdW5jdGlvbiBpc0Nocm9tZWRyaXZlckF1dG9kb3dubG9hZEVuYWJsZWQgKCkge1xuICBpZiAodGhpcy5pc0ZlYXR1cmVFbmFibGVkKENIUk9NRURSSVZFUl9BVVRPRE9XTkxPQURfRkVBVFVSRSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB0aGlzPy5sb2c/LmRlYnVnKGBBdXRvbWF0ZWQgQ2hyb21lZHJpdmVyIGRvd25sb2FkIGlzIGRpc2FibGVkLiBgICtcbiAgICBgVXNlICcke0NIUk9NRURSSVZFUl9BVVRPRE9XTkxPQURfRkVBVFVSRX0nIHNlcnZlciBmZWF0dXJlIHRvIGVuYWJsZSBpdGApO1xuICByZXR1cm4gZmFsc2U7XG59O1xuXG5oZWxwZXJzLnNldHVwTmV3Q2hyb21lZHJpdmVyID0gYXN5bmMgZnVuY3Rpb24gc2V0dXBOZXdDaHJvbWVkcml2ZXIgKG9wdHMsIGN1ckRldmljZUlkLCBhZGIsIGNvbnRleHQgPSBudWxsKSB7XG4gIGlmIChvcHRzLmNocm9tZURyaXZlclBvcnQpIHtcbiAgICB0aGlzPy5sb2c/Lndhcm4oYFRoZSAnY2hyb21lRHJpdmVyUG9ydCcgY2FwYWJpbGl0eSBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlICdjaHJvbWVkcml2ZXJQb3J0JyBpbnN0ZWFkYCk7XG4gICAgb3B0cy5jaHJvbWVkcml2ZXJQb3J0ID0gb3B0cy5jaHJvbWVEcml2ZXJQb3J0O1xuICB9XG5cbiAgaWYgKG9wdHMuY2hyb21lZHJpdmVyUG9ydCkge1xuICAgIHRoaXM/LmxvZz8uZGVidWcoYFVzaW5nIHVzZXItc3BlY2lmaWVkIHBvcnQgJHtvcHRzLmNocm9tZWRyaXZlclBvcnR9IGZvciBjaHJvbWVkcml2ZXJgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBpZiBhIHNpbmdsZSBwb3J0IHdhc24ndCBnaXZlbiwgd2UnbGwgbG9vayBmb3IgYSBmcmVlIG9uZVxuICAgIG9wdHMuY2hyb21lZHJpdmVyUG9ydCA9IGF3YWl0IGdldENocm9tZWRyaXZlclBvcnQob3B0cy5jaHJvbWVkcml2ZXJQb3J0cywgdGhpcz8ubG9nKTtcbiAgfVxuXG4gIGNvbnN0IGRldGFpbHMgPSBjb250ZXh0ID8gd2Vidmlld0hlbHBlcnMuZ2V0V2Vidmlld0RldGFpbHMoYWRiLCBjb250ZXh0KSA6IHVuZGVmaW5lZDtcbiAgaWYgKCFfLmlzRW1wdHkoZGV0YWlscykpIHtcbiAgICB0aGlzPy5sb2c/LmRlYnVnKCdQYXNzaW5nIHdlYiB2aWV3IGRldGFpbHMgdG8gdGhlIENocm9tZWRyaXZlciBjb25zdHJ1Y3RvcjogJyArXG4gICAgICBKU09OLnN0cmluZ2lmeShkZXRhaWxzLCBudWxsLCAyKSk7XG4gIH1cblxuICBjb25zdCBjaHJvbWVkcml2ZXIgPSBuZXcgQ2hyb21lZHJpdmVyKHtcbiAgICBwb3J0OiBvcHRzLmNocm9tZWRyaXZlclBvcnQsXG4gICAgZXhlY3V0YWJsZTogb3B0cy5jaHJvbWVkcml2ZXJFeGVjdXRhYmxlLFxuICAgIGFkYixcbiAgICBjbWRBcmdzOiBvcHRzLmNocm9tZWRyaXZlckFyZ3MsXG4gICAgdmVyYm9zZTogISFvcHRzLnNob3dDaHJvbWVkcml2ZXJMb2csXG4gICAgZXhlY3V0YWJsZURpcjogb3B0cy5jaHJvbWVkcml2ZXJFeGVjdXRhYmxlRGlyLFxuICAgIG1hcHBpbmdQYXRoOiBvcHRzLmNocm9tZWRyaXZlckNocm9tZU1hcHBpbmdGaWxlLFxuICAgIGJ1bmRsZUlkOiBvcHRzLmNocm9tZUJ1bmRsZUlkLFxuICAgIHVzZVN5c3RlbUV4ZWN1dGFibGU6IG9wdHMuY2hyb21lZHJpdmVyVXNlU3lzdGVtRXhlY3V0YWJsZSxcbiAgICBkaXNhYmxlQnVpbGRDaGVjazogb3B0cy5jaHJvbWVkcml2ZXJEaXNhYmxlQnVpbGRDaGVjayxcbiAgICBkZXRhaWxzLFxuICAgIGlzQXV0b2Rvd25sb2FkRW5hYmxlZDogdGhpcz8uaXNDaHJvbWVkcml2ZXJBdXRvZG93bmxvYWRFbmFibGVkPy4oKVxuICB9KTtcblxuICAvLyBtYWtlIHN1cmUgdGhlcmUgYXJlIGNocm9tZU9wdGlvbnNcbiAgb3B0cy5jaHJvbWVPcHRpb25zID0gb3B0cy5jaHJvbWVPcHRpb25zIHx8IHt9O1xuICAvLyB0cnkgb3V0IGFueSBwcmVmaXhlZCBjaHJvbWVPcHRpb25zLFxuICAvLyBhbmQgc3RyaXAgdGhlIHByZWZpeFxuICBmb3IgKGNvbnN0IG9wdCBvZiBfLmtleXMob3B0cykpIHtcbiAgICBpZiAob3B0LmVuZHNXaXRoKCc6Y2hyb21lT3B0aW9ucycpKSB7XG4gICAgICB0aGlzPy5sb2c/Lndhcm4oYE1lcmdpbmcgJyR7b3B0fScgaW50byAnY2hyb21lT3B0aW9ucycuIFRoaXMgbWF5IGNhdXNlIHVuZXhwZWN0ZWQgYmVoYXZpb3JgKTtcbiAgICAgIF8ubWVyZ2Uob3B0cy5jaHJvbWVPcHRpb25zLCBvcHRzW29wdF0pO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGNhcHMgPSB3ZWJ2aWV3SGVscGVycy5jcmVhdGVDaHJvbWVkcml2ZXJDYXBzKG9wdHMsIGN1ckRldmljZUlkLCBkZXRhaWxzKTtcbiAgdGhpcz8ubG9nPy5kZWJ1ZyhgQmVmb3JlIHN0YXJ0aW5nIGNocm9tZWRyaXZlciwgYW5kcm9pZFBhY2thZ2UgaXMgJyR7Y2Fwcy5jaHJvbWVPcHRpb25zLmFuZHJvaWRQYWNrYWdlfSdgKTtcbiAgYXdhaXQgY2hyb21lZHJpdmVyLnN0YXJ0KGNhcHMpO1xuICByZXR1cm4gY2hyb21lZHJpdmVyO1xufTtcbmNvbnN0IHNldHVwTmV3Q2hyb21lZHJpdmVyID0gaGVscGVycy5zZXR1cE5ld0Nocm9tZWRyaXZlcjtcblxuXG5PYmplY3QuYXNzaWduKGV4dGVuc2lvbnMsIGNvbW1hbmRzLCBoZWxwZXJzKTtcbmV4cG9ydCB7IGNvbW1hbmRzLCBoZWxwZXJzLCBzZXR1cE5ld0Nocm9tZWRyaXZlciB9O1xuZXhwb3J0IGRlZmF1bHQgZXh0ZW5zaW9ucztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQStDO0FBQUE7QUFFL0MsTUFBTUEsaUNBQWlDLEdBQUcsMkJBQTJCO0FBRXJFLElBQUlDLFFBQVEsR0FBRyxDQUFDLENBQUM7RUFBRUMsT0FBTyxHQUFHLENBQUMsQ0FBQztFQUFFQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO0FBQUM7QUFBQTtBQU1qREYsUUFBUSxDQUFDRyxpQkFBaUIsR0FBRyxlQUFlQSxpQkFBaUIsR0FBSTtFQUcvRCxPQUFPLElBQUksQ0FBQ0MsVUFBVSxJQUFJLElBQUksQ0FBQ0Msa0JBQWtCLEVBQUU7QUFDckQsQ0FBQztBQUVETCxRQUFRLENBQUNNLFdBQVcsR0FBRyxlQUFlQSxXQUFXLEdBQUk7RUFDbkQsTUFBTUMsZUFBZSxHQUFHLE1BQU1DLHVCQUFjLENBQUNDLGtCQUFrQixDQUFDLElBQUksQ0FBQ0MsR0FBRyxFQUFFLElBQUksQ0FBQ0MsSUFBSSxDQUFDO0VBQ3BGLE9BQU8sSUFBSSxDQUFDQyxjQUFjLENBQUNMLGVBQWUsQ0FBQztBQUM3QyxDQUFDO0FBRURQLFFBQVEsQ0FBQ2EsVUFBVSxHQUFHLGVBQWVBLFVBQVUsQ0FBRUMsSUFBSSxFQUFFO0VBQ3JELElBQUksQ0FBQ0MsYUFBSSxDQUFDQyxRQUFRLENBQUNGLElBQUksQ0FBQyxFQUFFO0lBQ3hCQSxJQUFJLEdBQUcsSUFBSSxDQUFDVCxrQkFBa0IsRUFBRTtFQUNsQyxDQUFDLE1BQU0sSUFBSVMsSUFBSSxLQUFLRywyQkFBVyxFQUFFO0lBRS9CSCxJQUFJLEdBQUcsSUFBSSxDQUFDSSxrQkFBa0IsRUFBRTtFQUNsQztFQUVBLElBQUlKLElBQUksS0FBSyxJQUFJLENBQUNWLFVBQVUsRUFBRTtJQUM1QjtFQUNGO0VBRUEsTUFBTUcsZUFBZSxH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