appium-android-driver 5.10.4 → 5.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/build/lib/android-helpers.js +1 -1
- package/build/lib/android-helpers.js.map +1 -1
- package/build/lib/bootstrap.js +1 -1
- package/build/lib/bootstrap.js.map +1 -1
- package/build/lib/commands/actions.js +52 -1
- package/build/lib/commands/actions.js.map +1 -1
- package/build/lib/commands/alert.js +1 -1
- package/build/lib/commands/alert.js.map +1 -1
- package/build/lib/commands/app-management.js +1 -1
- package/build/lib/commands/app-management.js.map +1 -1
- package/build/lib/commands/context.js +1 -1
- package/build/lib/commands/context.js.map +1 -1
- package/build/lib/commands/execute.js +1 -1
- package/build/lib/commands/execute.js.map +1 -1
- package/build/lib/commands/file-actions.js +1 -1
- package/build/lib/commands/file-actions.js.map +1 -1
- package/build/lib/commands/find.js +1 -1
- package/build/lib/commands/find.js.map +1 -1
- package/build/lib/commands/general.js +1 -1
- package/build/lib/commands/general.js.map +1 -1
- package/build/lib/commands/ime.js +1 -1
- package/build/lib/commands/ime.js.map +1 -1
- package/build/lib/commands/index.js +1 -1
- package/build/lib/commands/index.js.map +1 -1
- package/build/lib/commands/intent.js +1 -1
- package/build/lib/commands/intent.js.map +1 -1
- package/build/lib/commands/keyboard.js +1 -1
- package/build/lib/commands/keyboard.js.map +1 -1
- package/build/lib/commands/log.js +1 -1
- package/build/lib/commands/log.js.map +1 -1
- package/build/lib/commands/media-projection.js +1 -1
- package/build/lib/commands/media-projection.js.map +1 -1
- package/build/lib/commands/network.js +6 -55
- package/build/lib/commands/network.js.map +1 -1
- package/build/lib/commands/performance.js +1 -1
- package/build/lib/commands/performance.js.map +1 -1
- package/build/lib/commands/permissions.js +1 -1
- package/build/lib/commands/permissions.js.map +1 -1
- package/build/lib/commands/recordscreen.js +1 -1
- package/build/lib/commands/recordscreen.js.map +1 -1
- package/build/lib/commands/streamscreen.js +1 -1
- package/build/lib/commands/streamscreen.js.map +1 -1
- package/build/lib/commands/touch.js +1 -1
- package/build/lib/commands/touch.js.map +1 -1
- package/build/lib/driver.js +1 -1
- package/build/lib/driver.js.map +1 -1
- package/build/lib/uiautomator.js +1 -1
- package/build/lib/uiautomator.js.map +1 -1
- package/build/lib/unlock-helpers.js +1 -1
- package/build/lib/unlock-helpers.js.map +1 -1
- package/build/lib/utils.js +1 -1
- package/build/lib/utils.js.map +1 -1
- package/build/lib/webview-helpers.js +1 -1
- package/build/lib/webview-helpers.js.map +1 -1
- package/lib/commands/actions.js +135 -0
- package/lib/commands/network.js +18 -90
- package/lib/utils.js +4 -3
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-management.js","names":["_lodash","_interopRequireDefault","require","_asyncbox","_support","_androidHelpers","_driver","_utils","APP_EXTENSIONS","RESOLVER_ACTIVITY_NAME","commands","exports","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","_default","default"],"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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"}
|
|
1
|
+
{"version":3,"file":"app-management.js","names":["_lodash","_interopRequireDefault","require","_asyncbox","_support","_androidHelpers","_driver","_utils","APP_EXTENSIONS","RESOLVER_ACTIVITY_NAME","commands","exports","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","_default","default"],"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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"}
|
|
@@ -317,4 +317,4 @@ exports.setupNewChromedriver = setupNewChromedriver;
|
|
|
317
317
|
Object.assign(extensions, commands, helpers);
|
|
318
318
|
var _default = extensions;
|
|
319
319
|
exports.default = _default;
|
|
320
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfYXBwaXVtQ2hyb21lZHJpdmVyIiwiX3BvcnRmaW5kZXIiLCJfYmx1ZWJpcmQiLCJfc3VwcG9ydCIsIl9kcml2ZXIiLCJfd2Vidmlld0hlbHBlcnMiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl9hbmRyb2lkSGVscGVycyIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsIm5vZGVJbnRlcm9wIiwiV2Vha01hcCIsImNhY2hlQmFiZWxJbnRlcm9wIiwiY2FjaGVOb2RlSW50ZXJvcCIsIm9iaiIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiY2FjaGUiLCJoYXMiLCJnZXQiLCJuZXdPYmoiLCJoYXNQcm9wZXJ0eURlc2NyaXB0b3IiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImtleSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImRlc2MiLCJzZXQiLCJDSFJPTUVEUklWRVJfQVVUT0RPV05MT0FEX0ZFQVRVUkUiLCJjb21tYW5kcyIsImhlbHBlcnMiLCJleHRlbnNpb25zIiwiZXhwb3J0cyIsImdldEN1cnJlbnRDb250ZXh0IiwiY3VyQ29udGV4dCIsImRlZmF1bHRDb250ZXh0TmFtZSIsImdldENvbnRleHRzIiwid2Vidmlld3NNYXBwaW5nIiwid2Vidmlld0hlbHBlcnMiLCJnZXRXZWJWaWV3c01hcHBpbmciLCJhZGIiLCJvcHRzIiwiYXNzaWduQ29udGV4dHMiLCJzZXRDb250ZXh0IiwibmFtZSIsInV0aWwiLCJoYXNWYWx1ZSIsIldFQlZJRVdfV0lOIiwiZGVmYXVsdFdlYnZpZXdOYW1lIiwiY29udGV4dHMiLCJfIiwiaW5jbHVkZXMiLCJlcnJvcnMiLCJOb1N1Y2hDb250ZXh0RXJyb3IiLCJzd2l0Y2hDb250ZXh0IiwibW9iaWxlR2V0Q29udGV4dHMiLCJhbmRyb2lkRGV2aWNlU29ja2V0IiwiZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMiLCJ3ZWJ2aWV3RGV2dG9vbHNQb3J0IiwiZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uIiwiYXNzaWduIiwiaXNDaHJvbWVTZXNzaW9uIiwid2Vidmlld3MiLCJwYXJzZVdlYnZpZXdOYW1lcyIsIk5BVElWRV9XSU4iLCJsb2ciLCJkZWJ1ZyIsIkpTT04iLCJzdHJpbmdpZnkiLCJpc0Nocm9tZWRyaXZlckNvbnRleHQiLCJzdGFydENocm9tZWRyaXZlclByb3h5IiwicmVjcmVhdGVDaHJvbWVEcml2ZXJTZXNzaW9ucyIsInN0b3BDaHJvbWVkcml2ZXJQcm94aWVzIiwic3VzcGVuZENocm9tZWRyaXZlclByb3h5IiwiRXJyb3IiLCJXRUJWSUVXX0JBU0UiLCJhdXRvV2Vidmlld05hbWUiLCJhcHBQYWNrYWdlIiwiaXNXZWJDb250ZXh0IiwiY29udGV4dCIsImNkIiwic2Vzc2lvbkNocm9tZWRyaXZlcnMiLCJzZXR1cEV4aXN0aW5nQ2hyb21lZHJpdmVyIiwiY2xvbmVEZWVwIiwiY2hyb21lVXNlUnVubmluZ0FwcCIsImV4dHJhY3RDaHJvbWVBbmRyb2lkUGFja2FnZUZyb21Db250ZXh0TmFtZSIsImFuZHJvaWRQYWNrYWdlIiwibWF0Y2giLCJsZW5ndGgiLCJjaHJvbWVBbmRyb2lkUGFja2FnZSIsIm1hcCIsIndtIiwid2Vidmlld05hbWUiLCJrbm93blBhY2thZ2UiLCJLTk9XTl9DSFJPTUVfUEFDS0FHRV9OQU1FUyIsImFwcFN0YXRlIiwicXVlcnlBcHBTdGF0ZSIsIkFQUF9TVEFURSIsIlJVTk5JTkdfSU5fQkFDS0dST1VORCIsIlJVTk5JTkdfSU5fRk9SRUdST1VORCIsImluZm8iLCJzZXR1cE5ld0Nocm9tZWRyaXZlciIsImN1ckRldmljZUlkIiwib24iLCJDaHJvbWVkcml2ZXIiLCJFVkVOVF9DSEFOR0VEIiwibXNnIiwic3RhdGUiLCJTVEFURV9TVE9QUEVEIiwib25DaHJvbWVkcml2ZXJTdG9wIiwiY2hyb21lZHJpdmVyIiwicHJveHlSZXFSZXMiLCJwcm94eVJlcSIsImJpbmQiLCJwcm94eUNvbW1hbmQiLCJqd3Byb3h5IiwiY29tbWFuZCIsImp3cFByb3h5QWN0aXZlIiwid2FybiIsImVyciIsInN0YXJ0VW5leHBlY3RlZFNodXRkb3duIiwia2V5cyIsInJlbW92ZUFsbExpc3RlbmVycyIsInN0b3AiLCJtZXNzYWdlIiwidmlld05hbWUiLCJDSFJPTUlVTV9XSU4iLCJzaG91bGREaXNtaXNzQ2hyb21lV2VsY29tZSIsImNocm9tZU9wdGlvbnMiLCJpc0FycmF5IiwiYXJncyIsImRpc21pc3NDaHJvbWVXZWxjb21lIiwiYWN0aXZpdHkiLCJnZXRDdXJyZW50QWN0aXZpdHkiLCJlbCIsImZpbmRFbE9yRWxzIiwiY2xpY2siLCJFTEVNRU5UIiwiZSIsInN0YXJ0Q2hyb21lU2Vzc2lvbiIsImtub3duUGFja2FnZXMiLCJjaHJvbWVCdW5kbGVJZCIsImNocm9tZUFuZHJvaWRBY3Rpdml0eSIsImFwcEFjdGl2aXR5IiwiaGFzV29ya2luZ1dlYnZpZXciLCJyZXN0YXJ0IiwiZ2V0Q2hyb21lZHJpdmVyUG9ydCIsInBvcnRTcGVjIiwiZ2V0UG9ydCIsIkIiLCJwcm9taXNpZnkiLCJQb3J0RmluZGVyIiwicG9ydCIsImZvdW5kUG9ydCIsInBvdGVudGlhbFBvcnQiLCJzdG9wUG9ydCIsInBhcnNlSW50IiwiaXNDaHJvbWVkcml2ZXJBdXRvZG93bmxvYWRFbmFibGVkIiwiX3RoaXMkbG9nIiwiaXNGZWF0dXJlRW5hYmxlZCIsIl90aGlzJGlzQ2hyb21lZHJpdmVyQSIsIl90aGlzJGxvZzYiLCJjaHJvbWVEcml2ZXJQb3J0IiwiX3RoaXMkbG9nMiIsImNocm9tZWRyaXZlclBvcnQiLCJfdGhpcyRsb2czIiwiY2hyb21lZHJpdmVyUG9ydHMiLCJkZXRhaWxzIiwiZ2V0V2Vidmlld0RldGFpbHMiLCJ1bmRlZmluZWQiLCJpc0VtcHR5IiwiX3RoaXMkbG9nNCIsImV4ZWN1dGFibGUiLCJjaHJvbWVkcml2ZXJFeGVjdXRhYmxlIiwiY21kQXJncyIsImNocm9tZWRyaXZlckFyZ3MiLCJ2ZXJib3NlIiwic2hvd0Nocm9tZWRyaXZlckxvZyIsImV4ZWN1dGFibGVEaXIiLCJjaHJvbWVkcml2ZXJFeGVjdXRhYmxlRGlyIiwibWFwcGluZ1BhdGgiLCJjaHJvbWVkcml2ZXJDaHJvbWVNYXBwaW5nRmlsZSIsImJ1bmRsZUlkIiwidXNlU3lzdGVtRXhlY3V0YWJsZSIsImNocm9tZWRyaXZlclVzZVN5c3RlbUV4ZWN1dGFibGUiLCJkaXNhYmxlQnVpbGRDaGVjayIsImNocm9tZWRyaXZlckRpc2FibGVCdWlsZENoZWNrIiwiaXNBdXRvZG93bmxvYWRFbmFibGVkIiwib3B0IiwiZW5kc1dpdGgiLCJfdGhpcyRsb2c1IiwibWVyZ2UiLCJjYXBzIiwiY3JlYXRlQ2hyb21lZHJpdmVyQ2FwcyIsInN0YXJ0IiwiX2RlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tbWFuZHMvY29udGV4dC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IENocm9tZWRyaXZlciBmcm9tICdhcHBpdW0tY2hyb21lZHJpdmVyJztcbmltcG9ydCBQb3J0RmluZGVyIGZyb20gJ3BvcnRmaW5kZXInO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyBlcnJvcnMgfSBmcm9tICdhcHBpdW0vZHJpdmVyJztcbmltcG9ydCB7XG4gIGRlZmF1bHQgYXMgd2Vidmlld0hlbHBlcnMsXG4gIE5BVElWRV9XSU4sIFdFQlZJRVdfQkFTRSwgV0VCVklFV19XSU4sIENIUk9NSVVNX1dJTiwgS05PV05fQ0hST01FX1BBQ0tBR0VfTkFNRVNcbn0gZnJvbSAnLi4vd2Vidmlldy1oZWxwZXJzJztcbmltcG9ydCB7IEFQUF9TVEFURSB9IGZyb20gJy4uL2FuZHJvaWQtaGVscGVycyc7XG5cbmNvbnN0IENIUk9NRURSSVZFUl9BVVRPRE9XTkxPQURfRkVBVFVSRSA9ICdjaHJvbWVkcml2ZXJfYXV0b2Rvd25sb2FkJztcblxubGV0IGNvbW1hbmRzID0ge30sIGhlbHBlcnMgPSB7fSwgZXh0ZW5zaW9ucyA9IHt9O1xuXG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEFjdHVhbCBNSlNPTldQIGNvbW1hbmQgaGFuZGxlcnNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmNvbW1hbmRzLmdldEN1cnJlbnRDb250ZXh0ID0gYXN5bmMgZnVuY3Rpb24gZ2V0Q3VycmVudENvbnRleHQgKCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtYXdhaXRcbiAgLy8gaWYgdGhlIGN1cnJlbnQgY29udGV4dCBpcyBgbnVsbGAsIGluZGljYXRpbmcgbm8gY29udGV4dFxuICAvLyBleHBsaWNpdGx5IHNldCwgaXQgaXMgdGhlIGRlZmF1bHQgY29udGV4dFxuICByZXR1cm4gdGhpcy5jdXJDb250ZXh0IHx8IHRoaXMuZGVmYXVsdENvbnRleHROYW1lKCk7XG59O1xuXG5jb21tYW5kcy5nZXRDb250ZXh0cyA9IGFzeW5jIGZ1bmN0aW9uIGdldENvbnRleHRzICgpIHtcbiAgY29uc3Qgd2Vidmlld3NNYXBwaW5nID0gYXdhaXQgd2Vidmlld0hlbHBlcnMuZ2V0V2ViVmlld3NNYXBwaW5nKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICByZXR1cm4gdGhpcy5hc3NpZ25Db250ZXh0cyh3ZWJ2aWV3c01hcHBpbmcpO1xufTtcblxuY29tbWFuZHMuc2V0Q29udGV4dCA9IGFzeW5jIGZ1bmN0aW9uIHNldENvbnRleHQgKG5hbWUpIHtcbiAgaWYgKCF1dGlsLmhhc1ZhbHVlKG5hbWUpKSB7XG4gICAgbmFtZSA9IHRoaXMuZGVmYXVsdENvbnRleHROYW1lKCk7XG4gIH0gZWxzZSBpZiAobmFtZSA9PT0gV0VCVklFV19XSU4pIHtcbiAgICAvLyBoYW5kbGUgc2V0Q29udGV4dCBcIldFQlZJRVdcIlxuICAgIG5hbWUgPSB0aGlzLmRlZmF1bHRXZWJ2aWV3TmFtZSgpO1xuICB9XG4gIC8vIGlmIHdlJ3JlIGFscmVhZHkgaW4gdGhlIGNvbnRleHQgd2Ugd2FudCwgZG8gbm90aGluZ1xuICBpZiAobmFtZSA9PT0gdGhpcy5jdXJDb250ZXh0KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgd2Vidmlld3NNYXBwaW5nID0gYXdhaXQgd2Vidmlld0hlbHBlcnMuZ2V0V2ViVmlld3NNYXBwaW5nKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICBjb25zdCBjb250ZXh0cyA9IHRoaXMuYXNzaWduQ29udGV4dHMod2Vidmlld3NNYXBwaW5nKTtcbiAgLy8gaWYgdGhlIGNvbnRleHQgd2Ugd2FudCBkb2Vzbid0IGV4aXN0LCBmYWlsXG4gIGlmICghXy5pbmNsdWRlcyhjb250ZXh0cywgbmFtZSkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLk5vU3VjaENvbnRleHRFcnJvcigpO1xuICB9XG5cbiAgYXdhaXQgdGhpcy5zd2l0Y2hDb250ZXh0KG5hbWUsIHdlYnZpZXdzTWFwcGluZyk7XG4gIHRoaXMuY3VyQ29udGV4dCA9IG5hbWU7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFdlYnZpZXdzTWFwcGluZ1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHByb2MgVGhlIG5hbWUgb2YgdGhlIERldnRvb2xzIFVuaXggc29ja2V0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gd2VidmlldyBUaGUgd2ViIHZpZXcgYWxpYXMuIExvb2tzIGxpa2UgYFdFQlZJRVdfYFxuICogcHJlZml4IHBsdXMgUElEIG9yIHBhY2thZ2UgbmFtZVxuICogQHByb3BlcnR5IHs/T2JqZWN0fSBpbmZvIFdlYnZpZXcgaW5mb3JtYXRpb24gYXMgaXQgaXMgcmV0cmlldmVkIGJ5XG4gKiAvanNvbi92ZXJzaW9uIENEUCBlbmRwb2ludFxuICogQHByb3BlcnR5IHs/QXJyYXk8T2JqZWN0Pn0gcGFnZXMgV2VidmlldyBwYWdlcyBsaXN0IGFzIGl0IGlzIHJldHJpZXZlZCBieVxuICogL2pzb24vbGlzdCBDRFAgZW5kcG9pbnRcbiAqIEBwcm9wZXJ5IHs/c3RyaW5nfSB3ZWJ2aWV3TmFtZSBBbiBhY3R1YWwgd2VidmlldyBuYW1lIGZvciBzd2l0Y2hpbmcgY29udGV4dC5cbiAqIFRoaXMgdmFsdWUgYmVjb21lcyBudWxsIHdoZW4gZmFpbGluZyB0byBmaW5kIGEgUElEIGZvciBhIHdlYnZpZXcuXG4gKlxuICogVGhlIGZvbGxvd2luZyBqc29uIGRlbW9uc3RyYXRlcyB0aGUgZXhhbXBsZSBvZiBXZWJ2aWV3c01hcHBpbmcgb2JqZWN0LlxuICogTm90ZSB0aGF0IGBkZXNjcmlwdGlvbmAgaW4gYHBhZ2VgIGNhbiBiZSBhbiBlbXB0eSBzdHJpbmcgbW9zdCBsaWtlbHkgd2hlbiBpdCBjb21lcyB0byBNb2JpbGUgQ2hyb21lKVxuICoge1xuICogICBcInByb2NcIjogXCJAd2Vidmlld19kZXZ0b29sc19yZW1vdGVfMjIxMzhcIixcbiAqICAgXCJ3ZWJ2aWV3XCI6IFwiV0VCVklFV18yMjEzOFwiLFxuICogICBcImluZm9cIjoge1xuICogICAgIFwiQW5kcm9pZC1QYWNrYWdlXCI6IFwiaW8uYXBwaXVtLnNldHRpbmdzXCIsXG4gKiAgICAgXCJCcm93c2VyXCI6IFwiQ2hyb21lLzc0LjAuMzcyOS4xODVcIixcbiAqICAgICBcIlByb3RvY29sLVZlcnNpb25cIjogXCIxLjNcIixcbiAqICAgICBcIlVzZXItQWdlbnRcIjogXCJNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgMTA7IEFuZHJvaWQgU0RLIGJ1aWx0IGZvciB4ODYgQnVpbGQvUVNSMS4xOTA5MjAuMDAxOyB3dikgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAgQ2hyb21lLzc0LjAuMzcyOS4xODUgTW9iaWxlIFNhZmFyaS81MzcuMzZcIixcbiAqICAgICBcIlY4LVZlcnNpb25cIjogXCI3LjQuMjg4LjI4XCIsXG4gKiAgICAgXCJXZWJLaXQtVmVyc2lvblwiOiBcIjUzNy4zNiAoQDIyOTU1NjgyZjk0Y2UwOTMzNjE5N2JmYjhkZmZlYTk5MWZhMzJmMGQpXCIsXG4gKiAgICAgXCJ3ZWJTb2NrZXREZWJ1Z2dlclVybFwiOiBcIndzOi8vMTI3LjAuMC4xOjEwOTAwL2RldnRvb2xzL2Jyb3dzZXJcIlxuICogICB9LFxuICogICBcInBhZ2VzXCI6IFtcbiAqICAgICB7XG4gKiAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwie1xcXCJhdHRhY2hlZFxcXCI6dHJ1ZSxcXFwiZW1wdHlcXFwiOmZhbHNlLFxcXCJoZWlnaHRcXFwiOjE0NTgsXFxcInNjcmVlblhcXFwiOjAsXFxcInNjcmVlbllcXFwiOjMzNixcXFwidmlzaWJsZVxcXCI6dHJ1ZSxcXFwid2lkdGhcXFwiOjEwODB9XCIsXG4gKiAgICAgICBcImRldnRvb2xzRnJvbnRlbmRVcmxcIjogXCJodHRwOi8vY2hyb21lLWRldnRvb2xzLWZyb250ZW5kLmFwcHNwb3QuY29tL3NlcnZlX3Jldi9AMjI5NTU2ODJmOTRjZTA5MzM2MTk3YmZiOGRmZmVhOTkxZmEzMmYwZC9pbnNwZWN0b3IuaHRtbD93cz0xMjcuMC4wLjE6MTA5MDAvZGV2dG9vbHMvcGFnZS8yNzMyNUNDNTBCNjAwRDMxQjIzM0Y0NUUwOTQ4N0IxRlwiLFxuICogICAgICAgXCJpZFwiOiBcIjI3MzI1Q0M1MEI2MDBEMzFCMjMzRjQ1RTA5NDg3QjFGXCIsXG4gKiAgICAgICBcInRpdGxlXCI6IFwiUmVsZWFzZXMgwrcgYXBwaXVtL2FwcGl1bSDCtyBHaXRIdWJcIixcbiAqICAgICAgIFwidHlwZVwiOiBcInBhZ2VcIixcbiAqICAgICAgIFwidXJsXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vcmVsZWFzZXNcIixcbiAqICAgICAgIFwid2ViU29ja2V0RGVidWdnZXJVcmxcIjogXCJ3czovLzEyNy4wLjAuMToxMDkwMC9kZXZ0b29scy9wYWdlLzI3MzI1Q0M1MEI2MDBEMzFCMjMzRjQ1RTA5NDg3QjFGXCJcbiAqICAgICB9XG4gKiAgIF0sXG4gKiAgIFwid2Vidmlld05hbWVcIjogXCJXRUJWSUVXX2NvbS5pby5hcHBpdW0uc2V0dGluZ1wiXG4gKiB9XG4gKi9cblxuLyoqXG4gKiBSZXR1cm5zIGEgd2Vidmlld3NNYXBwaW5nIGJhc2VkIG9uIENEUCBlbmRwb2ludHNcbiAqXG4gKiBAcmV0dXJuIHtBcnJheTxXZWJ2aWV3c01hcHBpbmc+fSB3ZWJ2aWV3c01hcHBpbmdcbiAqL1xuY29tbWFuZHMubW9iaWxlR2V0Q29udGV4dHMgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVHZXRDb250ZXh0cyAoKSB7XG4gIGNvbnN0IG9wdHMgPSB7XG4gICAgYW5kcm9pZERldmljZVNvY2tldDogdGhpcy5vcHRzLmFuZHJvaWREZXZpY2VTb2NrZXQsXG4gICAgZW5zdXJlV2Vidmlld3NIYXZlUGFnZXM6IHRydWUsXG4gICAgd2Vidmlld0RldnRvb2xzUG9ydDogdGhpcy5vcHRzLndlYnZpZXdEZXZ0b29sc1BvcnQsXG4gICAgZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uOiB0cnVlXG4gIH07XG4gIHJldHVybiBhd2FpdCB3ZWJ2aWV3SGVscGVycy5nZXRXZWJWaWV3c01hcHBpbmcodGhpcy5hZGIsIG9wdHMpO1xufTtcblxuaGVscGVycy5hc3NpZ25Db250ZXh0cyA9IGZ1bmN0aW9uIGFzc2lnbkNvbnRleHRzICh3ZWJ2aWV3c01hcHBpbmcpIHtcbiAgY29uc3Qgb3B0cyA9IE9iamVjdC5hc3NpZ24oe2lzQ2hyb21lU2Vzc2lvbjogdGhpcy5pc0Nocm9tZVNlc3Npb259LCB0aGlzLm9wdHMpO1xuICBjb25zdCB3ZWJ2aWV3cyA9IHdlYnZpZXdIZWxwZXJzLnBhcnNlV2Vidmlld05hbWVzKHdlYnZpZXdzTWFwcGluZywgb3B0cyk7XG4gIHRoaXMuY29udGV4dHMgPSBbTkFUSVZFX1dJTiwgLi4ud2Vidmlld3NdO1xuICB0aGlzLmxvZy5kZWJ1ZyhgQXZhaWxhYmxlIGNvbnRleHRzOiAke0pTT04uc3RyaW5naWZ5KHRoaXMuY29udGV4dHMpfWApO1xuICByZXR1cm4gdGhpcy5jb250ZXh0cztcbn07XG5cbmhlbHBlcnMuc3dpdGNoQ29udGV4dCA9IGFzeW5jIGZ1bmN0aW9uIHN3aXRjaENvbnRleHQgKG5hbWUsIHdlYnZpZXdzTWFwcGluZykge1xuICAvLyBXZSBoYXZlIHNvbWUgb3B0aW9ucyB3aGVuIGl0IGNvbWVzIHRvIHdlYnZpZXdzLiBJZiB3ZSB3YW50IGFcbiAgLy8gQ2hyb21lZHJpdmVyIHdlYnZpZXcsIHdlIGNhbiBvbmx5IGNvbnRyb2wgb25lIGF0IGEgdGltZS5cbiAgaWYgKHRoaXMuaXNDaHJvbWVkcml2ZXJDb250ZXh0KG5hbWUpKSB7XG4gICAgLy8gc3RhcnQgcHJveHlpbmcgY29tbWFuZHMgZGlyZWN0bHkgdG8gY2hyb21lZHJpdmVyXG4gICAgYXdhaXQgdGhpcy5zdGFydENocm9tZWRyaXZlclByb3h5KG5hbWUsIHdlYnZpZXdzTWFwcGluZyk7XG4gIH0gZWxzZSBpZiAodGhpcy5pc0Nocm9tZWRyaXZlckNvbnRleHQodGhpcy5jdXJDb250ZXh0KSkge1xuICAgIC8vIGlmIHdlJ3JlIG1vdmluZyB0byBhIG5vbi1jaHJvbWVkcml2ZXIgd2VidmlldywgYW5kIG91ciBjdXJyZW50IGNvbnRleHRcbiAgICAvLyBfaXNfIGEgY2hyb21lZHJpdmVyIHdlYnZpZXcsIGlmIGNhcHMgcmVjcmVhdGVDaHJvbWVEcml2ZXJTZXNzaW9ucyBpcyBzZXRcbiAgICAvLyB0byB0cnVlIHRoZW4ga2lsbCBjaHJvbWVkcml2ZXIgc2Vzc2lvbiB1c2luZyBzdG9wQ2hyb21lZHJpdmVyUHJveGllcyBvclxuICAgIC8vIGVsc2Ugc2ltcGx5IHN1c3BlbmQgcHJveHlpbmcgdG8gdGhlIGxhdHRlclxuICAgIGlmICh0aGlzLm9wdHMucmVjcmVhdGVDaHJvbWVEcml2ZXJTZXNzaW9ucykge1xuICAgICAgdGhpcy5sb2cuZGVidWcoJ3JlY3JlYXRlQ2hyb21lRHJpdmVyU2Vzc2lvbnMgc2V0IHRvIHRydWU7IGtpbGxpbmcgZXhpc3RpbmcgY2hyb21lZHJpdmVycycpO1xuICAgICAgYXdhaXQgdGhpcy5zdG9wQ2hyb21lZHJpdmVyUHJveGllcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLnN1c3BlbmRDaHJvbWVkcml2ZXJQcm94eSgpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYERpZG4ndCBrbm93IGhvdyB0byBoYW5kbGUgc3dpdGNoaW5nIHRvIGNvbnRleHQgJyR7bmFtZX0nYCk7XG4gIH1cbn07XG5cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBPbi1vYmplY3QgY29udGV4dC1yZWxhdGVkIGhlbHBlcnNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vLyBUaGUgcmVhc29uIHRoaXMgaXMgYSBmdW5jdGlvbiBhbmQgbm90IGp1c3QgYSBjb25zdGFudCBpcyB0aGF0IGJvdGggYW5kcm9pZC1cbi8vIGRyaXZlciBhbmQgc2VsZW5kcm9pZC1kcml2ZXIgdXNlIHRoaXMgbG9naWMsIGFuZCBlYWNoIG9uZSByZXR1cm5zXG4vLyBhIGRpZmZlcmVudCBkZWZhdWx0IGNvbnRleHQgbmFtZVxuaGVscGVycy5kZWZhdWx0Q29udGV4dE5hbWUgPSBmdW5jdGlvbiBkZWZhdWx0Q29udGV4dE5hbWUgKCkge1xuICByZXR1cm4gTkFUSVZFX1dJTjtcbn07XG5cbmhlbHBlcnMuZGVmYXVsdFdlYnZpZXdOYW1lID0gZnVuY3Rpb24gZGVmYXVsdFdlYnZpZXdOYW1lICgpIHtcbiAgcmV0dXJuIFdFQlZJRVdfQkFTRSArICh0aGlzLm9wdHMuYXV0b1dlYnZpZXdOYW1lIHx8IHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbn07XG5cbmhlbHBlcnMuaXNXZWJDb250ZXh0ID0gZnVuY3Rpb24gaXNXZWJDb250ZXh0ICgpIHtcbiAgcmV0dXJuIHRoaXMuY3VyQ29udGV4dCAhPT0gbnVsbCAmJiB0aGlzLmN1ckNvbnRleHQgIT09IE5BVElWRV9XSU47XG59O1xuXG4vLyBUdXJuIG9uIHByb3h5aW5nIHRvIGFuIGV4aXN0aW5nIENocm9tZWRyaXZlciBzZXNzaW9uIG9yIGEgbmV3IG9uZVxuaGVscGVycy5zdGFydENocm9tZWRyaXZlclByb3h5ID0gYXN5bmMgZnVuY3Rpb24gc3RhcnRDaHJvbWVkcml2ZXJQcm94eSAoY29udGV4dCwgd2Vidmlld3NNYXBwaW5nKSB7XG4gIHRoaXMubG9nLmRlYnVnKGBDb25uZWN0aW5nIHRvIGNocm9tZS1iYWNrZWQgd2VidmlldyBjb250ZXh0ICcke2NvbnRleHR9J2ApO1xuXG4gIGxldCBjZDtcbiAgaWYgKHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnNbY29udGV4dF0pIHtcbiAgICAvLyBpbiB0aGUgY2FzZSB3aGVyZSB3ZSd2ZSBhbHJlYWR5IHNldCB1cCBhIGNocm9tZWRyaXZlciBmb3IgYSBjb250ZXh0LFxuICAgIC8vIHdlIHdhbnQgdG8gcmVjb25uZWN0IHRvIGl0LCBub3QgY3JlYXRlIGEgd2hvbGUgbmV3IG9uZVxuICAgIHRoaXMubG9nLmRlYnVnKGBGb3VuZCBleGlzdGluZyBDaHJvbWVkcml2ZXIgZm9yIGNvbnRleHQgJyR7Y29udGV4dH0nLiBVc2luZyBpdC5gKTtcbiAgICBjZCA9IHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnNbY29udGV4dF07XG4gICAgYXdhaXQgc2V0dXBFeGlzdGluZ0Nocm9tZWRyaXZlcih0aGlzLmxvZywgY2QpO1xuICB9IGVsc2Uge1xuICAgIGxldCBvcHRzID0gXy5jbG9uZURlZXAodGhpcy5vcHRzKTtcbiAgICBvcHRzLmNocm9tZVVzZVJ1bm5pbmdBcHAgPSB0cnVlO1xuXG4gICAgLy8gaWYgcmVxdWVzdGVkLCB0ZWxsIGNocm9tZWRyaXZlciB0byBhdHRhY2ggdG8gdGhlIGFuZHJvaWQgcGFja2FnZSB3ZSBoYXZlXG4gICAgLy8gYXNzb2NpYXRlZCB3aXRoIHRoZSBjb250ZXh0IG5hbWUsIHJhdGhlciB0aGFuIHRoZSBwYWNrYWdlIG9mIHRoZSBBVVQuXG4gICAgLy8gQW5kIHR1cm4gdGhpcyBvbiBieSBkZWZhdWx0IGZvciBjaHJvbWUtLWlmIGNocm9tZSBwb3BzIHVwIHdpdGggYSB3ZWJ2aWV3XG4gICAgLy8gYW5kIHNvbWVvbmUgd2FudHMgdG8gc3dpdGNoIHRvIGl0LCB3ZSBzaG91bGQgbGV0IGNocm9tZWRyaXZlciBjb25uZWN0IHRvXG4gICAgLy8gY2hyb21lIHJhdGhlciB0aGFuIHN0YXlpbmcgc3R1Y2sgb24gdGhlIEFVVFxuICAgIGlmIChvcHRzLmV4dHJhY3RDaHJvbWVBbmRyb2lkUGFja2FnZUZyb21Db250ZXh0TmFtZSB8fCBjb250ZXh0ID09PSBgJHtXRUJWSUVXX0JBU0V9Y2hyb21lYCkge1xuICAgICAgbGV0IGFuZHJvaWRQYWNrYWdlID0gY29udGV4dC5tYXRjaChgJHtXRUJWSUVXX0JBU0V9KC4rKWApO1xuICAgICAgaWYgKGFuZHJvaWRQYWNrYWdlICYmIGFuZHJvaWRQYWNrYWdlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgb3B0cy5jaHJvbWVBbmRyb2lkUGFja2FnZSA9IGFuZHJvaWRQYWNrYWdlWzFdO1xuICAgICAgfVxuICAgICAgaWYgKCFvcHRzLmV4dHJhY3RDaHJvbWVBbmRyb2lkUGFja2FnZUZyb21Db250ZXh0TmFtZSkge1xuICAgICAgICBpZiAoXy5oYXModGhpcy5vcHRzLCAnZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uJykgJiYgIXRoaXMub3B0cy5lbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24pIHtcbiAgICAgICAgICAvLyBXaGVuIGVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbiBjYXBhYmlsaXR5IGlzIGV4cGxpY2l0bHkgZGlzYWJsZWQsIHRyeSB0byBpZGVudGlmeVxuICAgICAgICAgIC8vIGNocm9tZUFuZHJvaWRQYWNrYWdlIGJhc2VkIG9uIGNvbnRleHRzLCBrbm93biBjaHJvbWUgdmFyaWFudCBwYWNrYWdlcyBhbmQgcXVlcnlBcHBTdGF0ZSByZXN1bHRcbiAgICAgICAgICAvLyBzaW5jZSB3ZWJ2aWV3c01hcHBpbmcgZG9lcyBub3QgaGF2ZSBpbmZvIG9iamVjdFxuICAgICAgICAgIGNvbnN0IGNvbnRleHRzID0gd2Vidmlld3NNYXBwaW5nLm1hcCgod20pID0+IHdtLndlYnZpZXdOYW1lKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGtub3duUGFja2FnZSBvZiBLTk9XTl9DSFJPTUVfUEFDS0FHRV9OQU1FUykge1xuICAgICAgICAgICAgaWYgKF8uaW5jbHVkZXMoY29udGV4dHMsIGAke1dFQlZJRVdfQkFTRX0ke2tub3duUGFja2FnZX1gKSkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGFwcFN0YXRlID0gYXdhaXQgdGhpcy5xdWVyeUFwcFN0YXRlKGtub3duUGFja2FnZSk7XG4gICAgICAgICAgICBpZiAoXy5pbmNsdWRlcyhbQVBQX1NUQVRFLlJVTk5JTkdfSU5fQkFDS0dST1VORCwgQVBQX1NUQVRFLlJVTk5JTkdfSU5fRk9SRUdST1VORF0sIGFwcFN0YXRlKSkge1xuICAgICAgICAgICAgICBvcHRzLmNocm9tZUFuZHJvaWRQYWNrYWdlID0ga25vd25QYWNrYWdlO1xuICAgICAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgSWRlbnRpZmllZCBjaHJvbWVBbmRyb2lkUGFja2FnZSBhcyAnJHtvcHRzLmNocm9tZUFuZHJvaWRQYWNrYWdlfScgYCArXG4gICAgICAgICAgICAgICAgYGZvciBjb250ZXh0ICcke2NvbnRleHR9JyBieSBxdWVyeWluZyBzdGF0ZXMgb2YgQ2hyb21lIGFwcCBwYWNrYWdlc2ApO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9yIChjb25zdCB3bSBvZiB3ZWJ2aWV3c01hcHBpbmcpIHtcbiAgICAgICAgICAgIGlmICh3bS53ZWJ2aWV3TmFtZSA9PT0gY29udGV4dCAmJiBfLmhhcyh3bT8uaW5mbywgJ0FuZHJvaWQtUGFja2FnZScpKSB7XG4gICAgICAgICAgICAgIG9wdHMuY2hyb21lQW5kcm9pZFBhY2thZ2UgPSB3bS5pbmZvWydBbmRyb2lkLVBhY2thZ2UnXTtcbiAgICAgICAgICAgICAgdGhpcy5sb2cuZGVidWcoYElkZW50aWZpZWQgY2hyb21lQW5kcm9pZFBhY2thZ2UgYXMgJyR7b3B0cy5jaHJvbWVBbmRyb2lkUGFja2FnZX0nIGAgK1xuICAgICAgICAgICAgICAgIGBmb3IgY29udGV4dCAnJHtjb250ZXh0fScgYnkgQ0RQYCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNkID0gYXdhaXQgdGhpcy5zZXR1cE5ld0Nocm9tZWRyaXZlcihvcHRzLCB0aGlzLmFkYi5jdXJEZXZpY2VJZCwgdGhpcy5hZGIsIGNvbnRleHQpO1xuICAgIC8vIGJpbmQgb3VyIHN0b3AvZXhpdCBoYW5kbGVyLCBwYXNzaW5nIGluIGNvbnRleHQgc28gd2Uga25vdyB3aGljaFxuICAgIC8vIG9uZSBzdG9wcGVkIHVuZXhwZWN0ZWRseVxuICAgIGNkLm9uKENocm9tZWRyaXZlci5FVkVOVF9DSEFOR0VELCAobXNnKSA9PiB7XG4gICAgICBpZiAobXNnLnN0YXRlID09PSBDaHJvbWVkcml2ZXIuU1RBVEVfU1RPUFBFRCkge1xuICAgICAgICB0aGlzLm9uQ2hyb21lZHJpdmVyU3RvcChjb250ZXh0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBzYXZlIHRoZSBjaHJvbWVkcml2ZXIgb2JqZWN0IHVuZGVyIHRoZSBjb250ZXh0XG4gICAgdGhpcy5zZXNzaW9uQ2hyb21lZHJpdmVyc1tjb250ZXh0XSA9IGNkO1xuICB9XG4gIC8vIGhvb2sgdXAgdGhlIGxvY2FsIHZhcmlhYmxlcyBzbyB3ZSBjYW4gcHJveHkgdGhpcyBiaXpcbiAgdGhpcy5jaHJvbWVkcml2ZXIgPSBjZDtcbiAgdGhpcy5wcm94eVJlcVJlcyA9IHRoaXMuY2hyb21lZHJpdmVyLnByb3h5UmVxLmJpbmQodGhpcy5jaHJvbWVkcml2ZXIpO1xuICB0aGlzLnByb3h5Q29tbWFuZCA9IHRoaXMuY2hyb21lZHJpdmVyLmp3cHJveHkuY29tbWFuZC5iaW5kKHRoaXMuY2hyb21lZHJpdmVyLmp3cHJveHkpO1xuICB0aGlzLmp3cFByb3h5QWN0aXZlID0gdHJ1ZTtcbn07XG5cbi8vIFN0b3AgcHJveHlpbmcgdG8gYW55IENocm9tZWRyaXZlclxuaGVscGVycy5zdXNwZW5kQ2hyb21lZHJpdmVyUHJveHkgPSBmdW5jdGlvbiBzdXNwZW5kQ2hyb21lZHJpdmVyUHJveHkgKCkge1xuICB0aGlzLmNocm9tZWRyaXZlciA9IG51bGw7XG4gIHRoaXMucHJveHlSZXFSZXMgPSBudWxsO1xuICB0aGlzLnByb3h5Q29tbWFuZCA9IG51bGw7XG4gIHRoaXMuandwUHJveHlBY3RpdmUgPSBmYWxzZTtcbn07XG5cbi8vIEhhbmRsZSBhbiBvdXQtb2YtYmFuZCBDaHJvbWVkcml2ZXIgc3RvcCBldmVudFxuaGVscGVycy5vbkNocm9tZWRyaXZlclN0b3AgPSBhc3luYyBmdW5jdGlvbiBvbkNocm9tZWRyaXZlclN0b3AgKGNvbnRleHQpIHtcbiAgdGhpcy5sb2cud2FybihgQ2hyb21lZHJpdmVyIGZvciBjb250ZXh0ICR7Y29udGV4dH0gc3RvcHBlZCB1bmV4cGVjdGVkbHlgKTtcbiAgaWYgKGNvbnRleHQgPT09IHRoaXMuY3VyQ29udGV4dCkge1xuICAgIC8vIHdlIGV4aXRlZCB1bmV4cGVjdGVkbHkgd2hpbGUgYXV0b21hdGluZyB0aGUgY3VycmVudCBjb250ZXh0IGFuZCBzbyB3YW50XG4gICAgLy8gdG8gc2h1dCBkb3duIHRoZSBzZXNzaW9uIGFuZCByZXNwb25kIHdpdGggYW4gZXJyb3JcbiAgICBsZXQgZXJyID0gbmV3IEVycm9yKCdDaHJvbWVkcml2ZXIgcXVpdCB1bmV4cGVjdGVkbHkgZHVyaW5nIHNlc3Npb24nKTtcbiAgICBhd2FpdCB0aGlzLnN0YXJ0VW5leHBlY3RlZFNodXRkb3duKGVycik7XG4gIH0gZWxzZSB7XG4gICAgLy8gaWYgYSBDaHJvbWVkcml2ZXIgaW4gdGhlIG5vbi1hY3RpdmUgY29udGV4dCBiYXJmcywgd2UgZG9uJ3QgcmVhbGx5XG4gICAgLy8gY2FyZSwgd2UnbGwganVzdCBtYWtlIGEgbmV3IG9uZSBuZXh0IHRpbWUgd2UgbmVlZCB0aGUgY29udGV4dC5cbiAgICB0aGlzLmxvZy53YXJuKFwiQ2hyb21lZHJpdmVyIHF1aXQgdW5leHBlY3RlZGx5LCBidXQgaXQgd2Fzbid0IHRoZSBhY3RpdmUgXCIgK1xuICAgICAgJ2NvbnRleHQsIGlnbm9yaW5nJyk7XG4gICAgZGVsZXRlIHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnNbY29udGV4dF07XG4gIH1cbn07XG5cbi8vIEludGVudGlvbmFsbHkgc3RvcCBhbGwgdGhlIGNocm9tZWRyaXZlcnMgY3VycmVudGx5IGFjdGl2ZSwgYW5kIGlnbm9yZVxuLy8gdGhlaXIgZXhpdCBldmVudHNcbmhlbHBlcnMuc3RvcENocm9tZWRyaXZlclByb3hpZXMgPSBhc3luYyBmdW5jdGlvbiBzdG9wQ2hyb21lZHJpdmVyUHJveGllcyAoKSB7XG4gIHRoaXMuc3VzcGVuZENocm9tZWRyaXZlclByb3h5KCk7IC8vIG1ha2Ugc3VyZSB3ZSB0dXJuIG9mZiB0aGUgcHJveHkgZmxhZ1xuICBmb3IgKGxldCBjb250ZXh0IG9mIF8ua2V5cyh0aGlzLnNlc3Npb25DaHJvbWVkcml2ZXJzKSkge1xuICAgIGxldCBjZCA9IHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnNbY29udGV4dF07XG4gICAgdGhpcy5sb2cuZGVidWcoYFN0b3BwaW5nIGNocm9tZWRyaXZlciBmb3IgY29udGV4dCAke2NvbnRleHR9YCk7XG4gICAgLy8gc3RvcCBsaXN0ZW5pbmcgZm9yIHRoZSBzdG9wcGVkIHN0YXRlIGV2ZW50XG4gICAgY2QucmVtb3ZlQWxsTGlzdGVuZXJzKENocm9tZWRyaXZlci5FVkVOVF9DSEFOR0VEKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgY2Quc3RvcCgpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5sb2cud2FybihgRXJyb3Igc3RvcHBpbmcgQ2hyb21lZHJpdmVyOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIH1cbiAgICBkZWxldGUgdGhpcy5zZXNzaW9uQ2hyb21lZHJpdmVyc1tjb250ZXh0XTtcbiAgfVxufTtcblxuaGVscGVycy5pc0Nocm9tZWRyaXZlckNvbnRleHQgPSBmdW5jdGlvbiBpc0Nocm9tZWRyaXZlckNvbnRleHQgKHZpZXdOYW1lKSB7XG4gIHJldHVybiBfLmluY2x1ZGVzKHZpZXdOYW1lLCBXRUJWSUVXX1dJTikgfHwgdmlld05hbWUgPT09IENIUk9NSVVNX1dJTjtcbn07XG5cbmhlbHBlcnMuc2hvdWxkRGlzbWlzc0Nocm9tZVdlbGNvbWUgPSBmdW5jdGlvbiBzaG91bGREaXNtaXNzQ2hyb21lV2VsY29tZSAoKSB7XG4gIHJldHVybiAhIXRoaXMub3B0cy5jaHJvbWVPcHRpb25zICYmXG4gICAgICAgICBfLmlzQXJyYXkodGhpcy5vcHRzLmNocm9tZU9wdGlvbnMuYXJncykgJiZcbiAgICAgICAgIHRoaXMub3B0cy5jaHJvbWVPcHRpb25zLmFyZ3MuaW5jbHVkZXMoJy0tbm8tZmlyc3QtcnVuJyk7XG59O1xuXG5oZWxwZXJzLmRpc21pc3NDaHJvbWVXZWxjb21lID0gYXN5bmMgZnVuY3Rpb24gZGlzbWlzc0Nocm9tZVdlbGNvbWUgKCkge1xuICB0aGlzLmxvZy5pbmZvKCdUcnlpbmcgdG8gZGlzbWlzcyBDaHJvbWUgd2VsY29tZScpO1xuICBsZXQgYWN0aXZpdHkgPSBhd2FpdCB0aGlzLmdldEN1cnJlbnRBY3Rpdml0eSgpO1xuICBpZiAoYWN0aXZpdHkgIT09ICdvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIuZmlyc3RydW4uRmlyc3RSdW5BY3Rpdml0eScpIHtcbiAgICB0aGlzLmxvZy5pbmZvKCdDaHJvbWUgd2VsY29tZSBkaWFsb2cgbmV2ZXIgc2hvd2VkIHVwISBDb250aW51aW5nJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxldCBlbCA9IGF3YWl0IHRoaXMuZmluZEVsT3JFbHMoJ2lkJywgJ2NvbS5hbmRyb2lkLmNocm9tZTppZC90ZXJtc19hY2NlcHQnLCBmYWxzZSk7XG4gIGF3YWl0IHRoaXMuY2xpY2soZWwuRUxFTUVOVCk7XG4gIHRyeSB7XG4gICAgbGV0IGVsID0gYXdhaXQgdGhpcy5maW5kRWxPckVscygnaWQnLCAnY29tLmFuZHJvaWQuY2hyb21lOmlkL25lZ2F0aXZlX2J1dHRvbicsIGZhbHNlKTtcbiAgICBhd2FpdCB0aGlzLmNsaWNrKGVsLkVMRU1FTlQpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gRE8gTk9USElORywgVEhJUyBERVZJQ0UgRElETlQgTEFVTkNIIFRIRSBTSUdOSU4gRElBTE9HXG4gICAgLy8gSVQgTVVTVCBCRSBBIE5PTiBHTVMgREVWSUNFXG4gICAgdGhpcy5sb2cud2FybihgVGhpcyBkZXZpY2UgZGlkIG5vdCBzaG93IENocm9tZSBTaWduSW4gZGlhbG9nLCAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuaGVscGVycy5zdGFydENocm9tZVNlc3Npb24gPSBhc3luYyBmdW5jdGlvbiBzdGFydENocm9tZVNlc3Npb24gKCkge1xuICB0aGlzLmxvZy5pbmZvKCdTdGFydGluZyBhIGNocm9tZS1iYXNlZCBicm93c2VyIHNlc3Npb24nKTtcbiAgbGV0IG9wdHMgPSBfLmNsb25lRGVlcCh0aGlzLm9wdHMpO1xuXG4gIGNvbnN0IGtub3duUGFja2FnZXMgPSBbXG4gICAgJ29yZy5jaHJvbWl1bS5jaHJvbWUuc2hlbGwnLFxuICAgICdjb20uYW5kcm9pZC5jaHJvbWUnLFxuICAgICdjb20uY2hyb21lLmJldGEnLFxuICAgICdvcmcuY2hyb21pdW0uY2hyb21lJyxcbiAgICAnb3JnLmNocm9taXVtLndlYnZpZXdfc2hlbGwnLFxuICBdO1xuXG4gIGlmIChfLmluY2x1ZGVzKGtub3duUGFja2FnZXMsIHRoaXMub3B0cy5hcHBQYWNrYWdlKSkge1xuICAgIG9wdHMuY2hyb21lQnVuZGxlSWQgPSB0aGlzLm9wdHMuYXBwUGFja2FnZTtcbiAgfSBlbHNlIHtcbiAgICBvcHRzLmNocm9tZUFuZHJvaWRBY3Rpdml0eSA9IHRoaXMub3B0cy5hcHBBY3Rpdml0eTtcbiAgfVxuICB0aGlzLmNocm9tZWRyaXZlciA9IGF3YWl0IHRoaXMuc2V0dXBOZXdDaHJvbWVkcml2ZXIob3B0cywgdGhpcy5hZGIuY3VyRGV2aWNlSWQsIHRoaXMuYWRiKTtcbiAgdGhpcy5jaHJvbWVkcml2ZXIub24oQ2hyb21lZHJpdmVyLkVWRU5UX0NIQU5HRUQsIChtc2cpID0+IHtcbiAgICBpZiAobXNnLnN0YXRlID09PSBDaHJvbWVkcml2ZXIuU1RBVEVfU1RPUFBFRCkge1xuICAgICAgdGhpcy5vbkNocm9tZWRyaXZlclN0b3AoQ0hST01JVU1fV0lOKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIE5vdyB0aGF0IHdlIGhhdmUgYSBDaHJvbWUgc2Vzc2lvbiwgd2UgZW5zdXJlIHRoYXQgdGhlIGNvbnRleHQgaXNcbiAgLy8gYXBwcm9wcmlhdGVseSBzZXQgYW5kIHRoYXQgdGhpcyBjaHJvbWVkcml2ZXIgaXMgYWRkZWQgdG8gdGhlIGxpc3RcbiAgLy8gb2Ygc2Vzc2lvbiBjaHJvbWVkcml2ZXJzIHNvIHdlIGNhbiBzd2l0Y2ggYmFjayBhbmQgZm9ydGhcbiAgdGhpcy5jdXJDb250ZXh0ID0gQ0hST01JVU1fV0lOO1xuICB0aGlzLnNlc3Npb25DaHJvbWVkcml2ZXJzW0NIUk9NSVVNX1dJTl0gPSB0aGlzLmNocm9tZWRyaXZlcjtcbiAgdGhpcy5wcm94eVJlcVJlcyA9IHRoaXMuY2hyb21lZHJpdmVyLnByb3h5UmVxLmJpbmQodGhpcy5jaHJvbWVkcml2ZXIpO1xuICB0aGlzLnByb3h5Q29tbWFuZCA9IHRoaXMuY2hyb21lZHJpdmVyLmp3cHJveHkuY29tbWFuZC5iaW5kKHRoaXMuY2hyb21lZHJpdmVyLmp3cHJveHkpO1xuICB0aGlzLmp3cFByb3h5QWN0aXZlID0gdHJ1ZTtcblxuICBpZiAodGhpcy5zaG91bGREaXNtaXNzQ2hyb21lV2VsY29tZSgpKSB7XG4gICAgLy8gZGlzbWlzcyBDaHJvbWUgd2VsY29tZSBkaWFsb2dcbiAgICBhd2FpdCB0aGlzLmRpc21pc3NDaHJvbWVXZWxjb21lKCk7XG4gIH1cbn07XG5cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEludGVybmFsIGxpYnJhcnkgZnVuY3Rpb25zXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5hc3luYyBmdW5jdGlvbiBzZXR1cEV4aXN0aW5nQ2hyb21lZHJpdmVyIChsb2csIGNocm9tZWRyaXZlcikge1xuICAvLyBjaGVjayB0aGUgc3RhdHVzIGJ5IHNlbmRpbmcgYSBzaW1wbGUgd2luZG93LWJhc2VkIGNvbW1hbmQgdG8gQ2hyb21lRHJpdmVyXG4gIC8vIGlmIHRoZXJlIGlzIGFuIGVycm9yLCB3ZSB3YW50IHRvIHJlY3JlYXRlIHRoZSBDaHJvbWVEcml2ZXIgc2Vzc2lvblxuICBpZiAoIWF3YWl0IGNocm9tZWRyaXZlci5oYXNXb3JraW5nV2VidmlldygpKSB7XG4gICAgbG9nLmRlYnVnKCdDaHJvbWVEcml2ZXIgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhIHdpbmRvdy4gJyArXG4gICAgICAgICAgICAgICAgICdSZS1pbml0aWFsaXppbmcgdGhlIHNlc3Npb24uJyk7XG4gICAgYXdhaXQgY2hyb21lZHJpdmVyLnJlc3RhcnQoKTtcbiAgfVxuICByZXR1cm4gY2hyb21lZHJpdmVyO1xufVxuXG4vKipcbiAqIEZpbmQgYSBmcmVlIHBvcnQgdG8gaGF2ZSBDaHJvbWVkcml2ZXIgbGlzdGVuIG9uLlxuICpcbiAqIEBwYXJhbSB7YXJyYXl9IHBvcnRTcGVjIC0gQXJyYXkgd2hpY2ggaXMgYSBsaXN0IG9mIHBvcnRzLiBBIGxpc3QgaXRlbSBtYXlcbiAqIGFsc28gaXRzZWxmIGJlIGFuIGFycmF5IG9mIGxlbmd0aCAyIHNwZWNpZnlpbmcgYSBzdGFydCBhbmQgZW5kIHBvcnQgb2ZcbiAqIGEgcmFuZ2UuIFNvbWUgdmFsaWQgcG9ydCBzcGVjczpcbiAqICAgIC0gWzgwMDAsIDgwMDEsIDgwMDJdXG4gKiAgICAtIFtbODAwMCwgODAwNV1dXG4gKiAgICAtIFs4MDAwLCBbOTAwMCwgOTEwMF1dXG4gKiBAcGFyYW0ge09iamVjdD99IGxvZyBMb2dnZXIgaW5zdGFuY2VcbiAqXG4gKiBAcmV0dXJuIHtudW1iZXJ9IEEgZnJlZSBwb3J0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldENocm9tZWRyaXZlclBvcnQgKHBvcnRTcGVjLCBsb2cgPSBudWxsKSB7XG4gIGNvbnN0IGdldFBvcnQgPSBCLnByb21pc2lmeShQb3J0RmluZGVyLmdldFBvcnQsIHtjb250ZXh0OiBQb3J0RmluZGVyfSk7XG5cbiAgLy8gaWYgdGhlIHVzZXIgZGlkbid0IGdpdmUgdXMgYW55IHNwZWNpZmljIGluZm9ybWF0aW9uIGFib3V0IGNocm9tZWRyaXZlclxuICAvLyBwb3J0IHJhbmdlcywganVzdCBmaW5kIGFueSBmcmVlIHBvcnRcbiAgaWYgKCFwb3J0U3BlYykge1xuICAgIGNvbnN0IHBvcnQgPSBhd2FpdCBnZXRQb3J0KCk7XG4gICAgbG9nPy5kZWJ1ZyhgQSBwb3J0IHdhcyBub3QgZ2l2ZW4sIHVzaW5nIHJhbmRvbSBmcmVlIHBvcnQ6ICR7cG9ydH1gKTtcbiAgICByZXR1cm4gcG9ydDtcbiAgfVxuXG4gIC8vIG90aGVyd2lzZSBmaW5kIHRoZSBmcmVlIHBvcnQgYmFzZWQgb24gYSBsaXN0IG9yIHJhbmdlIHByb3ZpZGVkIGJ5IHRoZSB1c2VyXG4gIGxvZz8uZGVidWcoYEZpbmRpbmcgYSBmcmVlIHBvcnQgZm9yIGNocm9tZWRyaXZlciB1c2luZyBzcGVjICR7SlNPTi5zdHJpbmdpZnkocG9ydFNwZWMpfWApO1xuICBsZXQgZm91bmRQb3J0ID0gbnVsbDtcbiAgZm9yIChjb25zdCBwb3RlbnRpYWxQb3J0IG9mIHBvcnRTcGVjKSB7XG4gICAgbGV0IHBvcnQsIHN0b3BQb3J0O1xuICAgIGlmIChfLmlzQXJyYXkocG90ZW50aWFsUG9ydCkpIHtcbiAgICAgIChbcG9ydCwgc3RvcFBvcnRdID0gcG90ZW50aWFsUG9ydCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBvcnQgPSBwYXJzZUludChwb3RlbnRpYWxQb3J0LCAxMCk7IC8vIGVuc3VyZSB3ZSBoYXZlIGEgbnVtYmVyIGFuZCBub3QgYSBzdHJpbmdcbiAgICAgIHN0b3BQb3J0ID0gcG9ydDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGxvZz8uZGVidWcoYENoZWNraW5nIHBvcnQgcmFuZ2UgJHtwb3J0fToke3N0b3BQb3J0fWApO1xuICAgICAgZm91bmRQb3J0ID0gYXdhaXQgZ2V0UG9ydCh7cG9ydCwgc3RvcFBvcnR9KTtcbiAgICAgIGJyZWFrO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZz8uZGVidWcoYE5vdGhpbmcgaW4gcG9ydCByYW5nZSAke3BvcnR9OiR7c3RvcFBvcnR9IHdhcyBhdmFpbGFibGVgKTtcbiAgICB9XG4gIH1cblxuICBpZiAoZm91bmRQb3J0ID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBhIGZyZWUgcG9ydCBmb3IgY2hyb21lZHJpdmVyIHVzaW5nIGAgK1xuICAgICAgICAgICAgICAgICAgICBgY2hyb21lZHJpdmVyUG9ydHMgc3BlYyAke0pTT04uc3RyaW5naWZ5KHBvcnRTcGVjKX1gKTtcbiAgfVxuXG4gIGxvZz8uZGVidWcoYFVzaW5nIGZyZWUgcG9ydCAke2ZvdW5kUG9ydH0gZm9yIGNocm9tZWRyaXZlcmApO1xuICByZXR1cm4gZm91bmRQb3J0O1xufVxuXG5oZWxwZXJzLmlzQ2hyb21lZHJpdmVyQXV0b2Rvd25sb2FkRW5hYmxlZCA9IGZ1bmN0aW9uIGlzQ2hyb21lZHJpdmVyQXV0b2Rvd25sb2FkRW5hYmxlZCAoKSB7XG4gIGlmICh0aGlzLmlzRmVhdHVyZUVuYWJsZWQoQ0hST01FRFJJVkVSX0FVVE9ET1dOTE9BRF9GRUFUVVJFKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHRoaXM/LmxvZz8uZGVidWcoYEF1dG9tYXRlZCBDaHJvbWVkcml2ZXIgZG93bmxvYWQgaXMgZGlzYWJsZWQuIGAgK1xuICAgIGBVc2UgJyR7Q0hST01FRFJJVkVSX0FVVE9ET1dOTE9BRF9GRUFUVVJFfScgc2VydmVyIGZlYXR1cmUgdG8gZW5hYmxlIGl0YCk7XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbmhlbHBlcnMuc2V0dXBOZXdDaHJvbWVkcml2ZXIgPSBhc3luYyBmdW5jdGlvbiBzZXR1cE5ld0Nocm9tZWRyaXZlciAob3B0cywgY3VyRGV2aWNlSWQsIGFkYiwgY29udGV4dCA9IG51bGwpIHtcbiAgaWYgKG9wdHMuY2hyb21lRHJpdmVyUG9ydCkge1xuICAgIHRoaXM/LmxvZz8ud2FybihgVGhlICdjaHJvbWVEcml2ZXJQb3J0JyBjYXBhYmlsaXR5IGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgJ2Nocm9tZWRyaXZlclBvcnQnIGluc3RlYWRgKTtcbiAgICBvcHRzLmNocm9tZWRyaXZlclBvcnQgPSBvcHRzLmNocm9tZURyaXZlclBvcnQ7XG4gIH1cblxuICBpZiAob3B0cy5jaHJvbWVkcml2ZXJQb3J0KSB7XG4gICAgdGhpcz8ubG9nPy5kZWJ1ZyhgVXNpbmcgdXNlci1zcGVjaWZpZWQgcG9ydCAke29wdHMuY2hyb21lZHJpdmVyUG9ydH0gZm9yIGNocm9tZWRyaXZlcmApO1xuICB9IGVsc2Uge1xuICAgIC8vIGlmIGEgc2luZ2xlIHBvcnQgd2Fzbid0IGdpdmVuLCB3ZSdsbCBsb29rIGZvciBhIGZyZWUgb25lXG4gICAgb3B0cy5jaHJvbWVkcml2ZXJQb3J0ID0gYXdhaXQgZ2V0Q2hyb21lZHJpdmVyUG9ydChvcHRzLmNocm9tZWRyaXZlclBvcnRzLCB0aGlzPy5sb2cpO1xuICB9XG5cbiAgY29uc3QgZGV0YWlscyA9IGNvbnRleHQgPyB3ZWJ2aWV3SGVscGVycy5nZXRXZWJ2aWV3RGV0YWlscyhhZGIsIGNvbnRleHQpIDogdW5kZWZpbmVkO1xuICBpZiAoIV8uaXNFbXB0eShkZXRhaWxzKSkge1xuICAgIHRoaXM/LmxvZz8uZGVidWcoJ1Bhc3Npbmcgd2ViIHZpZXcgZGV0YWlscyB0byB0aGUgQ2hyb21lZHJpdmVyIGNvbnN0cnVjdG9yOiAnICtcbiAgICAgIEpTT04uc3RyaW5naWZ5KGRldGFpbHMsIG51bGwsIDIpKTtcbiAgfVxuXG4gIGNvbnN0IGNocm9tZWRyaXZlciA9IG5ldyBDaHJvbWVkcml2ZXIoe1xuICAgIHBvcnQ6IG9wdHMuY2hyb21lZHJpdmVyUG9ydCxcbiAgICBleGVjdXRhYmxlOiBvcHRzLmNocm9tZWRyaXZlckV4ZWN1dGFibGUsXG4gICAgYWRiLFxuICAgIGNtZEFyZ3M6IG9wdHMuY2hyb21lZHJpdmVyQXJncyxcbiAgICB2ZXJib3NlOiAhIW9wdHMuc2hvd0Nocm9tZWRyaXZlckxvZyxcbiAgICBleGVjdXRhYmxlRGlyOiBvcHRzLmNocm9tZWRyaXZlckV4ZWN1dGFibGVEaXIsXG4gICAgbWFwcGluZ1BhdGg6IG9wdHMuY2hyb21lZHJpdmVyQ2hyb21lTWFwcGluZ0ZpbGUsXG4gICAgYnVuZGxlSWQ6IG9wdHMuY2hyb21lQnVuZGxlSWQsXG4gICAgdXNlU3lzdGVtRXhlY3V0YWJsZTogb3B0cy5jaHJvbWVkcml2ZXJVc2VTeXN0ZW1FeGVjdXRhYmxlLFxuICAgIGRpc2FibGVCdWlsZENoZWNrOiBvcHRzLmNocm9tZWRyaXZlckRpc2FibGVCdWlsZENoZWNrLFxuICAgIGRldGFpbHMsXG4gICAgaXNBdXRvZG93bmxvYWRFbmFibGVkOiB0aGlzPy5pc0Nocm9tZWRyaXZlckF1dG9kb3dubG9hZEVuYWJsZWQ/LigpXG4gIH0pO1xuXG4gIC8vIG1ha2Ugc3VyZSB0aGVyZSBhcmUgY2hyb21lT3B0aW9uc1xuICBvcHRzLmNocm9tZU9wdGlvbnMgPSBvcHRzLmNocm9tZU9wdGlvbnMgfHwge307XG4gIC8vIHRyeSBvdXQgYW55IHByZWZpeGVkIGNocm9tZU9wdGlvbnMsXG4gIC8vIGFuZCBzdHJpcCB0aGUgcHJlZml4XG4gIGZvciAoY29uc3Qgb3B0IG9mIF8ua2V5cyhvcHRzKSkge1xuICAgIGlmIChvcHQuZW5kc1dpdGgoJzpjaHJvbWVPcHRpb25zJykpIHtcbiAgICAgIHRoaXM/LmxvZz8ud2FybihgTWVyZ2luZyAnJHtvcHR9JyBpbnRvICdjaHJvbWVPcHRpb25zJy4gVGhpcyBtYXkgY2F1c2UgdW5leHBlY3RlZCBiZWhhdmlvcmApO1xuICAgICAgXy5tZXJnZShvcHRzLmNocm9tZU9wdGlvbnMsIG9wdHNbb3B0XSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgY2FwcyA9IHdlYnZpZXdIZWxwZXJzLmNyZWF0ZUNocm9tZWRyaXZlckNhcHMob3B0cywgY3VyRGV2aWNlSWQsIGRldGFpbHMpO1xuICB0aGlzPy5sb2c/LmRlYnVnKGBCZWZvcmUgc3RhcnRpbmcgY2hyb21lZHJpdmVyLCBhbmRyb2lkUGFja2FnZSBpcyAnJHtjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZFBhY2thZ2V9J2ApO1xuICBhd2FpdCBjaHJvbWVkcml2ZXIuc3RhcnQoY2Fwcyk7XG4gIHJldHVybiBjaHJvbWVkcml2ZXI7XG59O1xuY29uc3Qgc2V0dXBOZXdDaHJvbWVkcml2ZXIgPSBoZWxwZXJzLnNldHVwTmV3Q2hyb21lZHJpdmVyO1xuXG5cbk9iamVjdC5hc3NpZ24oZXh0ZW5zaW9ucywgY29tbWFuZHMsIGhlbHBlcnMpO1xuZXhwb3J0IHsgY29tbWFuZHMsIGhlbHBlcnMsIHNldHVwTmV3Q2hyb21lZHJpdmVyIH07XG5leHBvcnQgZGVmYXVsdCBleHRlbnNpb25zO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLG1CQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxXQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRyxTQUFBLEdBQUFKLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSSxRQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxPQUFBLEdBQUFMLE9BQUE7QUFDQSxJQUFBTSxlQUFB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
|
|
320
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfYXBwaXVtQ2hyb21lZHJpdmVyIiwiX3BvcnRmaW5kZXIiLCJfYmx1ZWJpcmQiLCJfc3VwcG9ydCIsIl9kcml2ZXIiLCJfd2Vidmlld0hlbHBlcnMiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl9hbmRyb2lkSGVscGVycyIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsIm5vZGVJbnRlcm9wIiwiV2Vha01hcCIsImNhY2hlQmFiZWxJbnRlcm9wIiwiY2FjaGVOb2RlSW50ZXJvcCIsIm9iaiIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiY2FjaGUiLCJoYXMiLCJnZXQiLCJuZXdPYmoiLCJoYXNQcm9wZXJ0eURlc2NyaXB0b3IiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImtleSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImRlc2MiLCJzZXQiLCJDSFJPTUVEUklWRVJfQVVUT0RPV05MT0FEX0ZFQVRVUkUiLCJjb21tYW5kcyIsImhlbHBlcnMiLCJleHRlbnNpb25zIiwiZXhwb3J0cyIsImdldEN1cnJlbnRDb250ZXh0IiwiY3VyQ29udGV4dCIsImRlZmF1bHRDb250ZXh0TmFtZSIsImdldENvbnRleHRzIiwid2Vidmlld3NNYXBwaW5nIiwid2Vidmlld0hlbHBlcnMiLCJnZXRXZWJWaWV3c01hcHBpbmciLCJhZGIiLCJvcHRzIiwiYXNzaWduQ29udGV4dHMiLCJzZXRDb250ZXh0IiwibmFtZSIsInV0aWwiLCJoYXNWYWx1ZSIsIldFQlZJRVdfV0lOIiwiZGVmYXVsdFdlYnZpZXdOYW1lIiwiY29udGV4dHMiLCJfIiwiaW5jbHVkZXMiLCJlcnJvcnMiLCJOb1N1Y2hDb250ZXh0RXJyb3IiLCJzd2l0Y2hDb250ZXh0IiwibW9iaWxlR2V0Q29udGV4dHMiLCJhbmRyb2lkRGV2aWNlU29ja2V0IiwiZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMiLCJ3ZWJ2aWV3RGV2dG9vbHNQb3J0IiwiZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uIiwiYXNzaWduIiwiaXNDaHJvbWVTZXNzaW9uIiwid2Vidmlld3MiLCJwYXJzZVdlYnZpZXdOYW1lcyIsIk5BVElWRV9XSU4iLCJsb2ciLCJkZWJ1ZyIsIkpTT04iLCJzdHJpbmdpZnkiLCJpc0Nocm9tZWRyaXZlckNvbnRleHQiLCJzdGFydENocm9tZWRyaXZlclByb3h5IiwicmVjcmVhdGVDaHJvbWVEcml2ZXJTZXNzaW9ucyIsInN0b3BDaHJvbWVkcml2ZXJQcm94aWVzIiwic3VzcGVuZENocm9tZWRyaXZlclByb3h5IiwiRXJyb3IiLCJXRUJWSUVXX0JBU0UiLCJhdXRvV2Vidmlld05hbWUiLCJhcHBQYWNrYWdlIiwiaXNXZWJDb250ZXh0IiwiY29udGV4dCIsImNkIiwic2Vzc2lvbkNocm9tZWRyaXZlcnMiLCJzZXR1cEV4aXN0aW5nQ2hyb21lZHJpdmVyIiwiY2xvbmVEZWVwIiwiY2hyb21lVXNlUnVubmluZ0FwcCIsImV4dHJhY3RDaHJvbWVBbmRyb2lkUGFja2FnZUZyb21Db250ZXh0TmFtZSIsImFuZHJvaWRQYWNrYWdlIiwibWF0Y2giLCJsZW5ndGgiLCJjaHJvbWVBbmRyb2lkUGFja2FnZSIsIm1hcCIsIndtIiwid2Vidmlld05hbWUiLCJrbm93blBhY2thZ2UiLCJLTk9XTl9DSFJPTUVfUEFDS0FHRV9OQU1FUyIsImFwcFN0YXRlIiwicXVlcnlBcHBTdGF0ZSIsIkFQUF9TVEFURSIsIlJVTk5JTkdfSU5fQkFDS0dST1VORCIsIlJVTk5JTkdfSU5fRk9SRUdST1VORCIsImluZm8iLCJzZXR1cE5ld0Nocm9tZWRyaXZlciIsImN1ckRldmljZUlkIiwib24iLCJDaHJvbWVkcml2ZXIiLCJFVkVOVF9DSEFOR0VEIiwibXNnIiwic3RhdGUiLCJTVEFURV9TVE9QUEVEIiwib25DaHJvbWVkcml2ZXJTdG9wIiwiY2hyb21lZHJpdmVyIiwicHJveHlSZXFSZXMiLCJwcm94eVJlcSIsImJpbmQiLCJwcm94eUNvbW1hbmQiLCJqd3Byb3h5IiwiY29tbWFuZCIsImp3cFByb3h5QWN0aXZlIiwid2FybiIsImVyciIsInN0YXJ0VW5leHBlY3RlZFNodXRkb3duIiwia2V5cyIsInJlbW92ZUFsbExpc3RlbmVycyIsInN0b3AiLCJtZXNzYWdlIiwidmlld05hbWUiLCJDSFJPTUlVTV9XSU4iLCJzaG91bGREaXNtaXNzQ2hyb21lV2VsY29tZSIsImNocm9tZU9wdGlvbnMiLCJpc0FycmF5IiwiYXJncyIsImRpc21pc3NDaHJvbWVXZWxjb21lIiwiYWN0aXZpdHkiLCJnZXRDdXJyZW50QWN0aXZpdHkiLCJlbCIsImZpbmRFbE9yRWxzIiwiY2xpY2siLCJFTEVNRU5UIiwiZSIsInN0YXJ0Q2hyb21lU2Vzc2lvbiIsImtub3duUGFja2FnZXMiLCJjaHJvbWVCdW5kbGVJZCIsImNocm9tZUFuZHJvaWRBY3Rpdml0eSIsImFwcEFjdGl2aXR5IiwiaGFzV29ya2luZ1dlYnZpZXciLCJyZXN0YXJ0IiwiZ2V0Q2hyb21lZHJpdmVyUG9ydCIsInBvcnRTcGVjIiwiZ2V0UG9ydCIsIkIiLCJwcm9taXNpZnkiLCJQb3J0RmluZGVyIiwicG9ydCIsImZvdW5kUG9ydCIsInBvdGVudGlhbFBvcnQiLCJzdG9wUG9ydCIsInBhcnNlSW50IiwiaXNDaHJvbWVkcml2ZXJBdXRvZG93bmxvYWRFbmFibGVkIiwiX3RoaXMkbG9nIiwiaXNGZWF0dXJlRW5hYmxlZCIsIl90aGlzJGlzQ2hyb21lZHJpdmVyQSIsIl90aGlzJGxvZzYiLCJjaHJvbWVEcml2ZXJQb3J0IiwiX3RoaXMkbG9nMiIsImNocm9tZWRyaXZlclBvcnQiLCJfdGhpcyRsb2czIiwiY2hyb21lZHJpdmVyUG9ydHMiLCJkZXRhaWxzIiwiZ2V0V2Vidmlld0RldGFpbHMiLCJ1bmRlZmluZWQiLCJpc0VtcHR5IiwiX3RoaXMkbG9nNCIsImV4ZWN1dGFibGUiLCJjaHJvbWVkcml2ZXJFeGVjdXRhYmxlIiwiY21kQXJncyIsImNocm9tZWRyaXZlckFyZ3MiLCJ2ZXJib3NlIiwic2hvd0Nocm9tZWRyaXZlckxvZyIsImV4ZWN1dGFibGVEaXIiLCJjaHJvbWVkcml2ZXJFeGVjdXRhYmxlRGlyIiwibWFwcGluZ1BhdGgiLCJjaHJvbWVkcml2ZXJDaHJvbWVNYXBwaW5nRmlsZSIsImJ1bmRsZUlkIiwidXNlU3lzdGVtRXhlY3V0YWJsZSIsImNocm9tZWRyaXZlclVzZVN5c3RlbUV4ZWN1dGFibGUiLCJkaXNhYmxlQnVpbGRDaGVjayIsImNocm9tZWRyaXZlckRpc2FibGVCdWlsZENoZWNrIiwiaXNBdXRvZG93bmxvYWRFbmFibGVkIiwib3B0IiwiZW5kc1dpdGgiLCJfdGhpcyRsb2c1IiwibWVyZ2UiLCJjYXBzIiwiY3JlYXRlQ2hyb21lZHJpdmVyQ2FwcyIsInN0YXJ0IiwiX2RlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tbWFuZHMvY29udGV4dC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IENocm9tZWRyaXZlciBmcm9tICdhcHBpdW0tY2hyb21lZHJpdmVyJztcbmltcG9ydCBQb3J0RmluZGVyIGZyb20gJ3BvcnRmaW5kZXInO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyBlcnJvcnMgfSBmcm9tICdhcHBpdW0vZHJpdmVyJztcbmltcG9ydCB7XG4gIGRlZmF1bHQgYXMgd2Vidmlld0hlbHBlcnMsXG4gIE5BVElWRV9XSU4sIFdFQlZJRVdfQkFTRSwgV0VCVklFV19XSU4sIENIUk9NSVVNX1dJTiwgS05PV05fQ0hST01FX1BBQ0tBR0VfTkFNRVNcbn0gZnJvbSAnLi4vd2Vidmlldy1oZWxwZXJzJztcbmltcG9ydCB7IEFQUF9TVEFURSB9IGZyb20gJy4uL2FuZHJvaWQtaGVscGVycyc7XG5cbmNvbnN0IENIUk9NRURSSVZFUl9BVVRPRE9XTkxPQURfRkVBVFVSRSA9ICdjaHJvbWVkcml2ZXJfYXV0b2Rvd25sb2FkJztcblxubGV0IGNvbW1hbmRzID0ge30sIGhlbHBlcnMgPSB7fSwgZXh0ZW5zaW9ucyA9IHt9O1xuXG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEFjdHVhbCBNSlNPTldQIGNvbW1hbmQgaGFuZGxlcnNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmNvbW1hbmRzLmdldEN1cnJlbnRDb250ZXh0ID0gYXN5bmMgZnVuY3Rpb24gZ2V0Q3VycmVudENvbnRleHQgKCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtYXdhaXRcbiAgLy8gaWYgdGhlIGN1cnJlbnQgY29udGV4dCBpcyBgbnVsbGAsIGluZGljYXRpbmcgbm8gY29udGV4dFxuICAvLyBleHBsaWNpdGx5IHNldCwgaXQgaXMgdGhlIGRlZmF1bHQgY29udGV4dFxuICByZXR1cm4gdGhpcy5jdXJDb250ZXh0IHx8IHRoaXMuZGVmYXVsdENvbnRleHROYW1lKCk7XG59O1xuXG5jb21tYW5kcy5nZXRDb250ZXh0cyA9IGFzeW5jIGZ1bmN0aW9uIGdldENvbnRleHRzICgpIHtcbiAgY29uc3Qgd2Vidmlld3NNYXBwaW5nID0gYXdhaXQgd2Vidmlld0hlbHBlcnMuZ2V0V2ViVmlld3NNYXBwaW5nKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICByZXR1cm4gdGhpcy5hc3NpZ25Db250ZXh0cyh3ZWJ2aWV3c01hcHBpbmcpO1xufTtcblxuY29tbWFuZHMuc2V0Q29udGV4dCA9IGFzeW5jIGZ1bmN0aW9uIHNldENvbnRleHQgKG5hbWUpIHtcbiAgaWYgKCF1dGlsLmhhc1ZhbHVlKG5hbWUpKSB7XG4gICAgbmFtZSA9IHRoaXMuZGVmYXVsdENvbnRleHROYW1lKCk7XG4gIH0gZWxzZSBpZiAobmFtZSA9PT0gV0VCVklFV19XSU4pIHtcbiAgICAvLyBoYW5kbGUgc2V0Q29udGV4dCBcIldFQlZJRVdcIlxuICAgIG5hbWUgPSB0aGlzLmRlZmF1bHRXZWJ2aWV3TmFtZSgpO1xuICB9XG4gIC8vIGlmIHdlJ3JlIGFscmVhZHkgaW4gdGhlIGNvbnRleHQgd2Ugd2FudCwgZG8gbm90aGluZ1xuICBpZiAobmFtZSA9PT0gdGhpcy5jdXJDb250ZXh0KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgd2Vidmlld3NNYXBwaW5nID0gYXdhaXQgd2Vidmlld0hlbHBlcnMuZ2V0V2ViVmlld3NNYXBwaW5nKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICBjb25zdCBjb250ZXh0cyA9IHRoaXMuYXNzaWduQ29udGV4dHMod2Vidmlld3NNYXBwaW5nKTtcbiAgLy8gaWYgdGhlIGNvbnRleHQgd2Ugd2FudCBkb2Vzbid0IGV4aXN0LCBmYWlsXG4gIGlmICghXy5pbmNsdWRlcyhjb250ZXh0cywgbmFtZSkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLk5vU3VjaENvbnRleHRFcnJvcigpO1xuICB9XG5cbiAgYXdhaXQgdGhpcy5zd2l0Y2hDb250ZXh0KG5hbWUsIHdlYnZpZXdzTWFwcGluZyk7XG4gIHRoaXMuY3VyQ29udGV4dCA9IG5hbWU7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFdlYnZpZXdzTWFwcGluZ1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHByb2MgVGhlIG5hbWUgb2YgdGhlIERldnRvb2xzIFVuaXggc29ja2V0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gd2VidmlldyBUaGUgd2ViIHZpZXcgYWxpYXMuIExvb2tzIGxpa2UgYFdFQlZJRVdfYFxuICogcHJlZml4IHBsdXMgUElEIG9yIHBhY2thZ2UgbmFtZVxuICogQHByb3BlcnR5IHs/T2JqZWN0fSBpbmZvIFdlYnZpZXcgaW5mb3JtYXRpb24gYXMgaXQgaXMgcmV0cmlldmVkIGJ5XG4gKiAvanNvbi92ZXJzaW9uIENEUCBlbmRwb2ludFxuICogQHByb3BlcnR5IHs/QXJyYXk8T2JqZWN0Pn0gcGFnZXMgV2VidmlldyBwYWdlcyBsaXN0IGFzIGl0IGlzIHJldHJpZXZlZCBieVxuICogL2pzb24vbGlzdCBDRFAgZW5kcG9pbnRcbiAqIEBwcm9wZXJ5IHs/c3RyaW5nfSB3ZWJ2aWV3TmFtZSBBbiBhY3R1YWwgd2VidmlldyBuYW1lIGZvciBzd2l0Y2hpbmcgY29udGV4dC5cbiAqIFRoaXMgdmFsdWUgYmVjb21lcyBudWxsIHdoZW4gZmFpbGluZyB0byBmaW5kIGEgUElEIGZvciBhIHdlYnZpZXcuXG4gKlxuICogVGhlIGZvbGxvd2luZyBqc29uIGRlbW9uc3RyYXRlcyB0aGUgZXhhbXBsZSBvZiBXZWJ2aWV3c01hcHBpbmcgb2JqZWN0LlxuICogTm90ZSB0aGF0IGBkZXNjcmlwdGlvbmAgaW4gYHBhZ2VgIGNhbiBiZSBhbiBlbXB0eSBzdHJpbmcgbW9zdCBsaWtlbHkgd2hlbiBpdCBjb21lcyB0byBNb2JpbGUgQ2hyb21lKVxuICoge1xuICogICBcInByb2NcIjogXCJAd2Vidmlld19kZXZ0b29sc19yZW1vdGVfMjIxMzhcIixcbiAqICAgXCJ3ZWJ2aWV3XCI6IFwiV0VCVklFV18yMjEzOFwiLFxuICogICBcImluZm9cIjoge1xuICogICAgIFwiQW5kcm9pZC1QYWNrYWdlXCI6IFwiaW8uYXBwaXVtLnNldHRpbmdzXCIsXG4gKiAgICAgXCJCcm93c2VyXCI6IFwiQ2hyb21lLzc0LjAuMzcyOS4xODVcIixcbiAqICAgICBcIlByb3RvY29sLVZlcnNpb25cIjogXCIxLjNcIixcbiAqICAgICBcIlVzZXItQWdlbnRcIjogXCJNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgMTA7IEFuZHJvaWQgU0RLIGJ1aWx0IGZvciB4ODYgQnVpbGQvUVNSMS4xOTA5MjAuMDAxOyB3dikgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAgQ2hyb21lLzc0LjAuMzcyOS4xODUgTW9iaWxlIFNhZmFyaS81MzcuMzZcIixcbiAqICAgICBcIlY4LVZlcnNpb25cIjogXCI3LjQuMjg4LjI4XCIsXG4gKiAgICAgXCJXZWJLaXQtVmVyc2lvblwiOiBcIjUzNy4zNiAoQDIyOTU1NjgyZjk0Y2UwOTMzNjE5N2JmYjhkZmZlYTk5MWZhMzJmMGQpXCIsXG4gKiAgICAgXCJ3ZWJTb2NrZXREZWJ1Z2dlclVybFwiOiBcIndzOi8vMTI3LjAuMC4xOjEwOTAwL2RldnRvb2xzL2Jyb3dzZXJcIlxuICogICB9LFxuICogICBcInBhZ2VzXCI6IFtcbiAqICAgICB7XG4gKiAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwie1xcXCJhdHRhY2hlZFxcXCI6dHJ1ZSxcXFwiZW1wdHlcXFwiOmZhbHNlLFxcXCJoZWlnaHRcXFwiOjE0NTgsXFxcInNjcmVlblhcXFwiOjAsXFxcInNjcmVlbllcXFwiOjMzNixcXFwidmlzaWJsZVxcXCI6dHJ1ZSxcXFwid2lkdGhcXFwiOjEwODB9XCIsXG4gKiAgICAgICBcImRldnRvb2xzRnJvbnRlbmRVcmxcIjogXCJodHRwOi8vY2hyb21lLWRldnRvb2xzLWZyb250ZW5kLmFwcHNwb3QuY29tL3NlcnZlX3Jldi9AMjI5NTU2ODJmOTRjZTA5MzM2MTk3YmZiOGRmZmVhOTkxZmEzMmYwZC9pbnNwZWN0b3IuaHRtbD93cz0xMjcuMC4wLjE6MTA5MDAvZGV2dG9vbHMvcGFnZS8yNzMyNUNDNTBCNjAwRDMxQjIzM0Y0NUUwOTQ4N0IxRlwiLFxuICogICAgICAgXCJpZFwiOiBcIjI3MzI1Q0M1MEI2MDBEMzFCMjMzRjQ1RTA5NDg3QjFGXCIsXG4gKiAgICAgICBcInRpdGxlXCI6IFwiUmVsZWFzZXMgwrcgYXBwaXVtL2FwcGl1bSDCtyBHaXRIdWJcIixcbiAqICAgICAgIFwidHlwZVwiOiBcInBhZ2VcIixcbiAqICAgICAgIFwidXJsXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vcmVsZWFzZXNcIixcbiAqICAgICAgIFwid2ViU29ja2V0RGVidWdnZXJVcmxcIjogXCJ3czovLzEyNy4wLjAuMToxMDkwMC9kZXZ0b29scy9wYWdlLzI3MzI1Q0M1MEI2MDBEMzFCMjMzRjQ1RTA5NDg3QjFGXCJcbiAqICAgICB9XG4gKiAgIF0sXG4gKiAgIFwid2Vidmlld05hbWVcIjogXCJXRUJWSUVXX2NvbS5pby5hcHBpdW0uc2V0dGluZ1wiXG4gKiB9XG4gKi9cblxuLyoqXG4gKiBSZXR1cm5zIGEgd2Vidmlld3NNYXBwaW5nIGJhc2VkIG9uIENEUCBlbmRwb2ludHNcbiAqXG4gKiBAcmV0dXJuIHtBcnJheTxXZWJ2aWV3c01hcHBpbmc+fSB3ZWJ2aWV3c01hcHBpbmdcbiAqL1xuY29tbWFuZHMubW9iaWxlR2V0Q29udGV4dHMgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVHZXRDb250ZXh0cyAoKSB7XG4gIGNvbnN0IG9wdHMgPSB7XG4gICAgYW5kcm9pZERldmljZVNvY2tldDogdGhpcy5vcHRzLmFuZHJvaWREZXZpY2VTb2NrZXQsXG4gICAgZW5zdXJlV2Vidmlld3NIYXZlUGFnZXM6IHRydWUsXG4gICAgd2Vidmlld0RldnRvb2xzUG9ydDogdGhpcy5vcHRzLndlYnZpZXdEZXZ0b29sc1BvcnQsXG4gICAgZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uOiB0cnVlXG4gIH07XG4gIHJldHVybiBhd2FpdCB3ZWJ2aWV3SGVscGVycy5nZXRXZWJWaWV3c01hcHBpbmcodGhpcy5hZGIsIG9wdHMpO1xufTtcblxuaGVscGVycy5hc3NpZ25Db250ZXh0cyA9IGZ1bmN0aW9uIGFzc2lnbkNvbnRleHRzICh3ZWJ2aWV3c01hcHBpbmcpIHtcbiAgY29uc3Qgb3B0cyA9IE9iamVjdC5hc3NpZ24oe2lzQ2hyb21lU2Vzc2lvbjogdGhpcy5pc0Nocm9tZVNlc3Npb259LCB0aGlzLm9wdHMpO1xuICBjb25zdCB3ZWJ2aWV3cyA9IHdlYnZpZXdIZWxwZXJzLnBhcnNlV2Vidmlld05hbWVzKHdlYnZpZXdzTWFwcGluZywgb3B0cyk7XG4gIHRoaXMuY29udGV4dHMgPSBbTkFUSVZFX1dJTiwgLi4ud2Vidmlld3NdO1xuICB0aGlzLmxvZy5kZWJ1ZyhgQXZhaWxhYmxlIGNvbnRleHRzOiAke0pTT04uc3RyaW5naWZ5KHRoaXMuY29udGV4dHMpfWApO1xuICByZXR1cm4gdGhpcy5jb250ZXh0cztcbn07XG5cbmhlbHBlcnMuc3dpdGNoQ29udGV4dCA9IGFzeW5jIGZ1bmN0aW9uIHN3aXRjaENvbnRleHQgKG5hbWUsIHdlYnZpZXdzTWFwcGluZykge1xuICAvLyBXZSBoYXZlIHNvbWUgb3B0aW9ucyB3aGVuIGl0IGNvbWVzIHRvIHdlYnZpZXdzLiBJZiB3ZSB3YW50IGFcbiAgLy8gQ2hyb21lZHJpdmVyIHdlYnZpZXcsIHdlIGNhbiBvbmx5IGNvbnRyb2wgb25lIGF0IGEgdGltZS5cbiAgaWYgKHRoaXMuaXNDaHJvbWVkcml2ZXJDb250ZXh0KG5hbWUpKSB7XG4gICAgLy8gc3RhcnQgcHJveHlpbmcgY29tbWFuZHMgZGlyZWN0bHkgdG8gY2hyb21lZHJpdmVyXG4gICAgYXdhaXQgdGhpcy5zdGFydENocm9tZWRyaXZlclByb3h5KG5hbWUsIHdlYnZpZXdzTWFwcGluZyk7XG4gIH0gZWxzZSBpZiAodGhpcy5pc0Nocm9tZWRyaXZlckNvbnRleHQodGhpcy5jdXJDb250ZXh0KSkge1xuICAgIC8vIGlmIHdlJ3JlIG1vdmluZyB0byBhIG5vbi1jaHJvbWVkcml2ZXIgd2VidmlldywgYW5kIG91ciBjdXJyZW50IGNvbnRleHRcbiAgICAvLyBfaXNfIGEgY2hyb21lZHJpdmVyIHdlYnZpZXcsIGlmIGNhcHMgcmVjcmVhdGVDaHJvbWVEcml2ZXJTZXNzaW9ucyBpcyBzZXRcbiAgICAvLyB0byB0cnVlIHRoZW4ga2lsbCBjaHJvbWVkcml2ZXIgc2Vzc2lvbiB1c2luZyBzdG9wQ2hyb21lZHJpdmVyUHJveGllcyBvclxuICAgIC8vIGVsc2Ugc2ltcGx5IHN1c3BlbmQgcHJveHlpbmcgdG8gdGhlIGxhdHRlclxuICAgIGlmICh0aGlzLm9wdHMucmVjcmVhdGVDaHJvbWVEcml2ZXJTZXNzaW9ucykge1xuICAgICAgdGhpcy5sb2cuZGVidWcoJ3JlY3JlYXRlQ2hyb21lRHJpdmVyU2Vzc2lvbnMgc2V0IHRvIHRydWU7IGtpbGxpbmcgZXhpc3RpbmcgY2hyb21lZHJpdmVycycpO1xuICAgICAgYXdhaXQgdGhpcy5zdG9wQ2hyb21lZHJpdmVyUHJveGllcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLnN1c3BlbmRDaHJvbWVkcml2ZXJQcm94eSgpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYERpZG4ndCBrbm93IGhvdyB0byBoYW5kbGUgc3dpdGNoaW5nIHRvIGNvbnRleHQgJyR7bmFtZX0nYCk7XG4gIH1cbn07XG5cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBPbi1vYmplY3QgY29udGV4dC1yZWxhdGVkIGhlbHBlcnNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vLyBUaGUgcmVhc29uIHRoaXMgaXMgYSBmdW5jdGlvbiBhbmQgbm90IGp1c3QgYSBjb25zdGFudCBpcyB0aGF0IGJvdGggYW5kcm9pZC1cbi8vIGRyaXZlciBhbmQgc2VsZW5kcm9pZC1kcml2ZXIgdXNlIHRoaXMgbG9naWMsIGFuZCBlYWNoIG9uZSByZXR1cm5zXG4vLyBhIGRpZmZlcmVudCBkZWZhdWx0IGNvbnRleHQgbmFtZVxuaGVscGVycy5kZWZhdWx0Q29udGV4dE5hbWUgPSBmdW5jdGlvbiBkZWZhdWx0Q29udGV4dE5hbWUgKCkge1xuICByZXR1cm4gTkFUSVZFX1dJTjtcbn07XG5cbmhlbHBlcnMuZGVmYXVsdFdlYnZpZXdOYW1lID0gZnVuY3Rpb24gZGVmYXVsdFdlYnZpZXdOYW1lICgpIHtcbiAgcmV0dXJuIFdFQlZJRVdfQkFTRSArICh0aGlzLm9wdHMuYXV0b1dlYnZpZXdOYW1lIHx8IHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbn07XG5cbmhlbHBlcnMuaXNXZWJDb250ZXh0ID0gZnVuY3Rpb24gaXNXZWJDb250ZXh0ICgpIHtcbiAgcmV0dXJuIHRoaXMuY3VyQ29udGV4dCAhPT0gbnVsbCAmJiB0aGlzLmN1ckNvbnRleHQgIT09IE5BVElWRV9XSU47XG59O1xuXG4vLyBUdXJuIG9uIHByb3h5aW5nIHRvIGFuIGV4aXN0aW5nIENocm9tZWRyaXZlciBzZXNzaW9uIG9yIGEgbmV3IG9uZVxuaGVscGVycy5zdGFydENocm9tZWRyaXZlclByb3h5ID0gYXN5bmMgZnVuY3Rpb24gc3RhcnRDaHJvbWVkcml2ZXJQcm94eSAoY29udGV4dCwgd2Vidmlld3NNYXBwaW5nKSB7XG4gIHRoaXMubG9nLmRlYnVnKGBDb25uZWN0aW5nIHRvIGNocm9tZS1iYWNrZWQgd2VidmlldyBjb250ZXh0ICcke2NvbnRleHR9J2ApO1xuXG4gIGxldCBjZDtcbiAgaWYgKHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnNbY29udGV4dF0pIHtcbiAgICAvLyBpbiB0aGUgY2FzZSB3aGVyZSB3ZSd2ZSBhbHJlYWR5IHNldCB1cCBhIGNocm9tZWRyaXZlciBmb3IgYSBjb250ZXh0LFxuICAgIC8vIHdlIHdhbnQgdG8gcmVjb25uZWN0IHRvIGl0LCBub3QgY3JlYXRlIGEgd2hvbGUgbmV3IG9uZVxuICAgIHRoaXMubG9nLmRlYnVnKGBGb3VuZCBleGlzdGluZyBDaHJvbWVkcml2ZXIgZm9yIGNvbnRleHQgJyR7Y29udGV4dH0nLiBVc2luZyBpdC5gKTtcbiAgICBjZCA9IHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnNbY29udGV4dF07XG4gICAgYXdhaXQgc2V0dXBFeGlzdGluZ0Nocm9tZWRyaXZlcih0aGlzLmxvZywgY2QpO1xuICB9IGVsc2Uge1xuICAgIGxldCBvcHRzID0gXy5jbG9uZURlZXAodGhpcy5vcHRzKTtcbiAgICBvcHRzLmNocm9tZVVzZVJ1bm5pbmdBcHAgPSB0cnVlO1xuXG4gICAgLy8gaWYgcmVxdWVzdGVkLCB0ZWxsIGNocm9tZWRyaXZlciB0byBhdHRhY2ggdG8gdGhlIGFuZHJvaWQgcGFja2FnZSB3ZSBoYXZlXG4gICAgLy8gYXNzb2NpYXRlZCB3aXRoIHRoZSBjb250ZXh0IG5hbWUsIHJhdGhlciB0aGFuIHRoZSBwYWNrYWdlIG9mIHRoZSBBVVQuXG4gICAgLy8gQW5kIHR1cm4gdGhpcyBvbiBieSBkZWZhdWx0IGZvciBjaHJvbWUtLWlmIGNocm9tZSBwb3BzIHVwIHdpdGggYSB3ZWJ2aWV3XG4gICAgLy8gYW5kIHNvbWVvbmUgd2FudHMgdG8gc3dpdGNoIHRvIGl0LCB3ZSBzaG91bGQgbGV0IGNocm9tZWRyaXZlciBjb25uZWN0IHRvXG4gICAgLy8gY2hyb21lIHJhdGhlciB0aGFuIHN0YXlpbmcgc3R1Y2sgb24gdGhlIEFVVFxuICAgIGlmIChvcHRzLmV4dHJhY3RDaHJvbWVBbmRyb2lkUGFja2FnZUZyb21Db250ZXh0TmFtZSB8fCBjb250ZXh0ID09PSBgJHtXRUJWSUVXX0JBU0V9Y2hyb21lYCkge1xuICAgICAgbGV0IGFuZHJvaWRQYWNrYWdlID0gY29udGV4dC5tYXRjaChgJHtXRUJWSUVXX0JBU0V9KC4rKWApO1xuICAgICAgaWYgKGFuZHJvaWRQYWNrYWdlICYmIGFuZHJvaWRQYWNrYWdlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgb3B0cy5jaHJvbWVBbmRyb2lkUGFja2FnZSA9IGFuZHJvaWRQYWNrYWdlWzFdO1xuICAgICAgfVxuICAgICAgaWYgKCFvcHRzLmV4dHJhY3RDaHJvbWVBbmRyb2lkUGFja2FnZUZyb21Db250ZXh0TmFtZSkge1xuICAgICAgICBpZiAoXy5oYXModGhpcy5vcHRzLCAnZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uJykgJiYgIXRoaXMub3B0cy5lbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24pIHtcbiAgICAgICAgICAvLyBXaGVuIGVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbiBjYXBhYmlsaXR5IGlzIGV4cGxpY2l0bHkgZGlzYWJsZWQsIHRyeSB0byBpZGVudGlmeVxuICAgICAgICAgIC8vIGNocm9tZUFuZHJvaWRQYWNrYWdlIGJhc2VkIG9uIGNvbnRleHRzLCBrbm93biBjaHJvbWUgdmFyaWFudCBwYWNrYWdlcyBhbmQgcXVlcnlBcHBTdGF0ZSByZXN1bHRcbiAgICAgICAgICAvLyBzaW5jZSB3ZWJ2aWV3c01hcHBpbmcgZG9lcyBub3QgaGF2ZSBpbmZvIG9iamVjdFxuICAgICAgICAgIGNvbnN0IGNvbnRleHRzID0gd2Vidmlld3NNYXBwaW5nLm1hcCgod20pID0+IHdtLndlYnZpZXdOYW1lKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGtub3duUGFja2FnZSBvZiBLTk9XTl9DSFJPTUVfUEFDS0FHRV9OQU1FUykge1xuICAgICAgICAgICAgaWYgKF8uaW5jbHVkZXMoY29udGV4dHMsIGAke1dFQlZJRVdfQkFTRX0ke2tub3duUGFja2FnZX1gKSkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGFwcFN0YXRlID0gYXdhaXQgdGhpcy5xdWVyeUFwcFN0YXRlKGtub3duUGFja2FnZSk7XG4gICAgICAgICAgICBpZiAoXy5pbmNsdWRlcyhbQVBQX1NUQVRFLlJVTk5JTkdfSU5fQkFDS0dST1VORCwgQVBQX1NUQVRFLlJVTk5JTkdfSU5fRk9SRUdST1VORF0sIGFwcFN0YXRlKSkge1xuICAgICAgICAgICAgICBvcHRzLmNocm9tZUFuZHJvaWRQYWNrYWdlID0ga25vd25QYWNrYWdlO1xuICAgICAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgSWRlbnRpZmllZCBjaHJvbWVBbmRyb2lkUGFja2FnZSBhcyAnJHtvcHRzLmNocm9tZUFuZHJvaWRQYWNrYWdlfScgYCArXG4gICAgICAgICAgICAgICAgYGZvciBjb250ZXh0ICcke2NvbnRleHR9JyBieSBxdWVyeWluZyBzdGF0ZXMgb2YgQ2hyb21lIGFwcCBwYWNrYWdlc2ApO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9yIChjb25zdCB3bSBvZiB3ZWJ2aWV3c01hcHBpbmcpIHtcbiAgICAgICAgICAgIGlmICh3bS53ZWJ2aWV3TmFtZSA9PT0gY29udGV4dCAmJiBfLmhhcyh3bT8uaW5mbywgJ0FuZHJvaWQtUGFja2FnZScpKSB7XG4gICAgICAgICAgICAgIG9wdHMuY2hyb21lQW5kcm9pZFBhY2thZ2UgPSB3bS5pbmZvWydBbmRyb2lkLVBhY2thZ2UnXTtcbiAgICAgICAgICAgICAgdGhpcy5sb2cuZGVidWcoYElkZW50aWZpZWQgY2hyb21lQW5kcm9pZFBhY2thZ2UgYXMgJyR7b3B0cy5jaHJvbWVBbmRyb2lkUGFja2FnZX0nIGAgK1xuICAgICAgICAgICAgICAgIGBmb3IgY29udGV4dCAnJHtjb250ZXh0fScgYnkgQ0RQYCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNkID0gYXdhaXQgdGhpcy5zZXR1cE5ld0Nocm9tZWRyaXZlcihvcHRzLCB0aGlzLmFkYi5jdXJEZXZpY2VJZCwgdGhpcy5hZGIsIGNvbnRleHQpO1xuICAgIC8vIGJpbmQgb3VyIHN0b3AvZXhpdCBoYW5kbGVyLCBwYXNzaW5nIGluIGNvbnRleHQgc28gd2Uga25vdyB3aGljaFxuICAgIC8vIG9uZSBzdG9wcGVkIHVuZXhwZWN0ZWRseVxuICAgIGNkLm9uKENocm9tZWRyaXZlci5FVkVOVF9DSEFOR0VELCAobXNnKSA9PiB7XG4gICAgICBpZiAobXNnLnN0YXRlID09PSBDaHJvbWVkcml2ZXIuU1RBVEVfU1RPUFBFRCkge1xuICAgICAgICB0aGlzLm9uQ2hyb21lZHJpdmVyU3RvcChjb250ZXh0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBzYXZlIHRoZSBjaHJvbWVkcml2ZXIgb2JqZWN0IHVuZGVyIHRoZSBjb250ZXh0XG4gICAgdGhpcy5zZXNzaW9uQ2hyb21lZHJpdmVyc1tjb250ZXh0XSA9IGNkO1xuICB9XG4gIC8vIGhvb2sgdXAgdGhlIGxvY2FsIHZhcmlhYmxlcyBzbyB3ZSBjYW4gcHJveHkgdGhpcyBiaXpcbiAgdGhpcy5jaHJvbWVkcml2ZXIgPSBjZDtcbiAgdGhpcy5wcm94eVJlcVJlcyA9IHRoaXMuY2hyb21lZHJpdmVyLnByb3h5UmVxLmJpbmQodGhpcy5jaHJvbWVkcml2ZXIpO1xuICB0aGlzLnByb3h5Q29tbWFuZCA9IHRoaXMuY2hyb21lZHJpdmVyLmp3cHJveHkuY29tbWFuZC5iaW5kKHRoaXMuY2hyb21lZHJpdmVyLmp3cHJveHkpO1xuICB0aGlzLmp3cFByb3h5QWN0aXZlID0gdHJ1ZTtcbn07XG5cbi8vIFN0b3AgcHJveHlpbmcgdG8gYW55IENocm9tZWRyaXZlclxuaGVscGVycy5zdXNwZW5kQ2hyb21lZHJpdmVyUHJveHkgPSBmdW5jdGlvbiBzdXNwZW5kQ2hyb21lZHJpdmVyUHJveHkgKCkge1xuICB0aGlzLmNocm9tZWRyaXZlciA9IG51bGw7XG4gIHRoaXMucHJveHlSZXFSZXMgPSBudWxsO1xuICB0aGlzLnByb3h5Q29tbWFuZCA9IG51bGw7XG4gIHRoaXMuandwUHJveHlBY3RpdmUgPSBmYWxzZTtcbn07XG5cbi8vIEhhbmRsZSBhbiBvdXQtb2YtYmFuZCBDaHJvbWVkcml2ZXIgc3RvcCBldmVudFxuaGVscGVycy5vbkNocm9tZWRyaXZlclN0b3AgPSBhc3luYyBmdW5jdGlvbiBvbkNocm9tZWRyaXZlclN0b3AgKGNvbnRleHQpIHtcbiAgdGhpcy5sb2cud2FybihgQ2hyb21lZHJpdmVyIGZvciBjb250ZXh0ICR7Y29udGV4dH0gc3RvcHBlZCB1bmV4cGVjdGVkbHlgKTtcbiAgaWYgKGNvbnRleHQgPT09IHRoaXMuY3VyQ29udGV4dCkge1xuICAgIC8vIHdlIGV4aXRlZCB1bmV4cGVjdGVkbHkgd2hpbGUgYXV0b21hdGluZyB0aGUgY3VycmVudCBjb250ZXh0IGFuZCBzbyB3YW50XG4gICAgLy8gdG8gc2h1dCBkb3duIHRoZSBzZXNzaW9uIGFuZCByZXNwb25kIHdpdGggYW4gZXJyb3JcbiAgICBsZXQgZXJyID0gbmV3IEVycm9yKCdDaHJvbWVkcml2ZXIgcXVpdCB1bmV4cGVjdGVkbHkgZHVyaW5nIHNlc3Npb24nKTtcbiAgICBhd2FpdCB0aGlzLnN0YXJ0VW5leHBlY3RlZFNodXRkb3duKGVycik7XG4gIH0gZWxzZSB7XG4gICAgLy8gaWYgYSBDaHJvbWVkcml2ZXIgaW4gdGhlIG5vbi1hY3RpdmUgY29udGV4dCBiYXJmcywgd2UgZG9uJ3QgcmVhbGx5XG4gICAgLy8gY2FyZSwgd2UnbGwganVzdCBtYWtlIGEgbmV3IG9uZSBuZXh0IHRpbWUgd2UgbmVlZCB0aGUgY29udGV4dC5cbiAgICB0aGlzLmxvZy53YXJuKFwiQ2hyb21lZHJpdmVyIHF1aXQgdW5leHBlY3RlZGx5LCBidXQgaXQgd2Fzbid0IHRoZSBhY3RpdmUgXCIgK1xuICAgICAgJ2NvbnRleHQsIGlnbm9yaW5nJyk7XG4gICAgZGVsZXRlIHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnNbY29udGV4dF07XG4gIH1cbn07XG5cbi8vIEludGVudGlvbmFsbHkgc3RvcCBhbGwgdGhlIGNocm9tZWRyaXZlcnMgY3VycmVudGx5IGFjdGl2ZSwgYW5kIGlnbm9yZVxuLy8gdGhlaXIgZXhpdCBldmVudHNcbmhlbHBlcnMuc3RvcENocm9tZWRyaXZlclByb3hpZXMgPSBhc3luYyBmdW5jdGlvbiBzdG9wQ2hyb21lZHJpdmVyUHJveGllcyAoKSB7XG4gIHRoaXMuc3VzcGVuZENocm9tZWRyaXZlclByb3h5KCk7IC8vIG1ha2Ugc3VyZSB3ZSB0dXJuIG9mZiB0aGUgcHJveHkgZmxhZ1xuICBmb3IgKGxldCBjb250ZXh0IG9mIF8ua2V5cyh0aGlzLnNlc3Npb25DaHJvbWVkcml2ZXJzKSkge1xuICAgIGxldCBjZCA9IHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnNbY29udGV4dF07XG4gICAgdGhpcy5sb2cuZGVidWcoYFN0b3BwaW5nIGNocm9tZWRyaXZlciBmb3IgY29udGV4dCAke2NvbnRleHR9YCk7XG4gICAgLy8gc3RvcCBsaXN0ZW5pbmcgZm9yIHRoZSBzdG9wcGVkIHN0YXRlIGV2ZW50XG4gICAgY2QucmVtb3ZlQWxsTGlzdGVuZXJzKENocm9tZWRyaXZlci5FVkVOVF9DSEFOR0VEKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgY2Quc3RvcCgpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5sb2cud2FybihgRXJyb3Igc3RvcHBpbmcgQ2hyb21lZHJpdmVyOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIH1cbiAgICBkZWxldGUgdGhpcy5zZXNzaW9uQ2hyb21lZHJpdmVyc1tjb250ZXh0XTtcbiAgfVxufTtcblxuaGVscGVycy5pc0Nocm9tZWRyaXZlckNvbnRleHQgPSBmdW5jdGlvbiBpc0Nocm9tZWRyaXZlckNvbnRleHQgKHZpZXdOYW1lKSB7XG4gIHJldHVybiBfLmluY2x1ZGVzKHZpZXdOYW1lLCBXRUJWSUVXX1dJTikgfHwgdmlld05hbWUgPT09IENIUk9NSVVNX1dJTjtcbn07XG5cbmhlbHBlcnMuc2hvdWxkRGlzbWlzc0Nocm9tZVdlbGNvbWUgPSBmdW5jdGlvbiBzaG91bGREaXNtaXNzQ2hyb21lV2VsY29tZSAoKSB7XG4gIHJldHVybiAhIXRoaXMub3B0cy5jaHJvbWVPcHRpb25zICYmXG4gICAgICAgICBfLmlzQXJyYXkodGhpcy5vcHRzLmNocm9tZU9wdGlvbnMuYXJncykgJiZcbiAgICAgICAgIHRoaXMub3B0cy5jaHJvbWVPcHRpb25zLmFyZ3MuaW5jbHVkZXMoJy0tbm8tZmlyc3QtcnVuJyk7XG59O1xuXG5oZWxwZXJzLmRpc21pc3NDaHJvbWVXZWxjb21lID0gYXN5bmMgZnVuY3Rpb24gZGlzbWlzc0Nocm9tZVdlbGNvbWUgKCkge1xuICB0aGlzLmxvZy5pbmZvKCdUcnlpbmcgdG8gZGlzbWlzcyBDaHJvbWUgd2VsY29tZScpO1xuICBsZXQgYWN0aXZpdHkgPSBhd2FpdCB0aGlzLmdldEN1cnJlbnRBY3Rpdml0eSgpO1xuICBpZiAoYWN0aXZpdHkgIT09ICdvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIuZmlyc3RydW4uRmlyc3RSdW5BY3Rpdml0eScpIHtcbiAgICB0aGlzLmxvZy5pbmZvKCdDaHJvbWUgd2VsY29tZSBkaWFsb2cgbmV2ZXIgc2hvd2VkIHVwISBDb250aW51aW5nJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxldCBlbCA9IGF3YWl0IHRoaXMuZmluZEVsT3JFbHMoJ2lkJywgJ2NvbS5hbmRyb2lkLmNocm9tZTppZC90ZXJtc19hY2NlcHQnLCBmYWxzZSk7XG4gIGF3YWl0IHRoaXMuY2xpY2soZWwuRUxFTUVOVCk7XG4gIHRyeSB7XG4gICAgbGV0IGVsID0gYXdhaXQgdGhpcy5maW5kRWxPckVscygnaWQnLCAnY29tLmFuZHJvaWQuY2hyb21lOmlkL25lZ2F0aXZlX2J1dHRvbicsIGZhbHNlKTtcbiAgICBhd2FpdCB0aGlzLmNsaWNrKGVsLkVMRU1FTlQpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gRE8gTk9USElORywgVEhJUyBERVZJQ0UgRElETlQgTEFVTkNIIFRIRSBTSUdOSU4gRElBTE9HXG4gICAgLy8gSVQgTVVTVCBCRSBBIE5PTiBHTVMgREVWSUNFXG4gICAgdGhpcy5sb2cud2FybihgVGhpcyBkZXZpY2UgZGlkIG5vdCBzaG93IENocm9tZSBTaWduSW4gZGlhbG9nLCAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuaGVscGVycy5zdGFydENocm9tZVNlc3Npb24gPSBhc3luYyBmdW5jdGlvbiBzdGFydENocm9tZVNlc3Npb24gKCkge1xuICB0aGlzLmxvZy5pbmZvKCdTdGFydGluZyBhIGNocm9tZS1iYXNlZCBicm93c2VyIHNlc3Npb24nKTtcbiAgbGV0IG9wdHMgPSBfLmNsb25lRGVlcCh0aGlzLm9wdHMpO1xuXG4gIGNvbnN0IGtub3duUGFja2FnZXMgPSBbXG4gICAgJ29yZy5jaHJvbWl1bS5jaHJvbWUuc2hlbGwnLFxuICAgICdjb20uYW5kcm9pZC5jaHJvbWUnLFxuICAgICdjb20uY2hyb21lLmJldGEnLFxuICAgICdvcmcuY2hyb21pdW0uY2hyb21lJyxcbiAgICAnb3JnLmNocm9taXVtLndlYnZpZXdfc2hlbGwnLFxuICBdO1xuXG4gIGlmIChfLmluY2x1ZGVzKGtub3duUGFja2FnZXMsIHRoaXMub3B0cy5hcHBQYWNrYWdlKSkge1xuICAgIG9wdHMuY2hyb21lQnVuZGxlSWQgPSB0aGlzLm9wdHMuYXBwUGFja2FnZTtcbiAgfSBlbHNlIHtcbiAgICBvcHRzLmNocm9tZUFuZHJvaWRBY3Rpdml0eSA9IHRoaXMub3B0cy5hcHBBY3Rpdml0eTtcbiAgfVxuICB0aGlzLmNocm9tZWRyaXZlciA9IGF3YWl0IHRoaXMuc2V0dXBOZXdDaHJvbWVkcml2ZXIob3B0cywgdGhpcy5hZGIuY3VyRGV2aWNlSWQsIHRoaXMuYWRiKTtcbiAgdGhpcy5jaHJvbWVkcml2ZXIub24oQ2hyb21lZHJpdmVyLkVWRU5UX0NIQU5HRUQsIChtc2cpID0+IHtcbiAgICBpZiAobXNnLnN0YXRlID09PSBDaHJvbWVkcml2ZXIuU1RBVEVfU1RPUFBFRCkge1xuICAgICAgdGhpcy5vbkNocm9tZWRyaXZlclN0b3AoQ0hST01JVU1fV0lOKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIE5vdyB0aGF0IHdlIGhhdmUgYSBDaHJvbWUgc2Vzc2lvbiwgd2UgZW5zdXJlIHRoYXQgdGhlIGNvbnRleHQgaXNcbiAgLy8gYXBwcm9wcmlhdGVseSBzZXQgYW5kIHRoYXQgdGhpcyBjaHJvbWVkcml2ZXIgaXMgYWRkZWQgdG8gdGhlIGxpc3RcbiAgLy8gb2Ygc2Vzc2lvbiBjaHJvbWVkcml2ZXJzIHNvIHdlIGNhbiBzd2l0Y2ggYmFjayBhbmQgZm9ydGhcbiAgdGhpcy5jdXJDb250ZXh0ID0gQ0hST01JVU1fV0lOO1xuICB0aGlzLnNlc3Npb25DaHJvbWVkcml2ZXJzW0NIUk9NSVVNX1dJTl0gPSB0aGlzLmNocm9tZWRyaXZlcjtcbiAgdGhpcy5wcm94eVJlcVJlcyA9IHRoaXMuY2hyb21lZHJpdmVyLnByb3h5UmVxLmJpbmQodGhpcy5jaHJvbWVkcml2ZXIpO1xuICB0aGlzLnByb3h5Q29tbWFuZCA9IHRoaXMuY2hyb21lZHJpdmVyLmp3cHJveHkuY29tbWFuZC5iaW5kKHRoaXMuY2hyb21lZHJpdmVyLmp3cHJveHkpO1xuICB0aGlzLmp3cFByb3h5QWN0aXZlID0gdHJ1ZTtcblxuICBpZiAodGhpcy5zaG91bGREaXNtaXNzQ2hyb21lV2VsY29tZSgpKSB7XG4gICAgLy8gZGlzbWlzcyBDaHJvbWUgd2VsY29tZSBkaWFsb2dcbiAgICBhd2FpdCB0aGlzLmRpc21pc3NDaHJvbWVXZWxjb21lKCk7XG4gIH1cbn07XG5cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEludGVybmFsIGxpYnJhcnkgZnVuY3Rpb25zXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5hc3luYyBmdW5jdGlvbiBzZXR1cEV4aXN0aW5nQ2hyb21lZHJpdmVyIChsb2csIGNocm9tZWRyaXZlcikge1xuICAvLyBjaGVjayB0aGUgc3RhdHVzIGJ5IHNlbmRpbmcgYSBzaW1wbGUgd2luZG93LWJhc2VkIGNvbW1hbmQgdG8gQ2hyb21lRHJpdmVyXG4gIC8vIGlmIHRoZXJlIGlzIGFuIGVycm9yLCB3ZSB3YW50IHRvIHJlY3JlYXRlIHRoZSBDaHJvbWVEcml2ZXIgc2Vzc2lvblxuICBpZiAoIWF3YWl0IGNocm9tZWRyaXZlci5oYXNXb3JraW5nV2VidmlldygpKSB7XG4gICAgbG9nLmRlYnVnKCdDaHJvbWVEcml2ZXIgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhIHdpbmRvdy4gJyArXG4gICAgICAgICAgICAgICAgICdSZS1pbml0aWFsaXppbmcgdGhlIHNlc3Npb24uJyk7XG4gICAgYXdhaXQgY2hyb21lZHJpdmVyLnJlc3RhcnQoKTtcbiAgfVxuICByZXR1cm4gY2hyb21lZHJpdmVyO1xufVxuXG4vKipcbiAqIEZpbmQgYSBmcmVlIHBvcnQgdG8gaGF2ZSBDaHJvbWVkcml2ZXIgbGlzdGVuIG9uLlxuICpcbiAqIEBwYXJhbSB7YXJyYXl9IHBvcnRTcGVjIC0gQXJyYXkgd2hpY2ggaXMgYSBsaXN0IG9mIHBvcnRzLiBBIGxpc3QgaXRlbSBtYXlcbiAqIGFsc28gaXRzZWxmIGJlIGFuIGFycmF5IG9mIGxlbmd0aCAyIHNwZWNpZnlpbmcgYSBzdGFydCBhbmQgZW5kIHBvcnQgb2ZcbiAqIGEgcmFuZ2UuIFNvbWUgdmFsaWQgcG9ydCBzcGVjczpcbiAqICAgIC0gWzgwMDAsIDgwMDEsIDgwMDJdXG4gKiAgICAtIFtbODAwMCwgODAwNV1dXG4gKiAgICAtIFs4MDAwLCBbOTAwMCwgOTEwMF1dXG4gKiBAcGFyYW0ge09iamVjdD99IGxvZyBMb2dnZXIgaW5zdGFuY2VcbiAqXG4gKiBAcmV0dXJuIHtudW1iZXJ9IEEgZnJlZSBwb3J0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldENocm9tZWRyaXZlclBvcnQgKHBvcnRTcGVjLCBsb2cgPSBudWxsKSB7XG4gIGNvbnN0IGdldFBvcnQgPSBCLnByb21pc2lmeShQb3J0RmluZGVyLmdldFBvcnQsIHtjb250ZXh0OiBQb3J0RmluZGVyfSk7XG5cbiAgLy8gaWYgdGhlIHVzZXIgZGlkbid0IGdpdmUgdXMgYW55IHNwZWNpZmljIGluZm9ybWF0aW9uIGFib3V0IGNocm9tZWRyaXZlclxuICAvLyBwb3J0IHJhbmdlcywganVzdCBmaW5kIGFueSBmcmVlIHBvcnRcbiAgaWYgKCFwb3J0U3BlYykge1xuICAgIGNvbnN0IHBvcnQgPSBhd2FpdCBnZXRQb3J0KCk7XG4gICAgbG9nPy5kZWJ1ZyhgQSBwb3J0IHdhcyBub3QgZ2l2ZW4sIHVzaW5nIHJhbmRvbSBmcmVlIHBvcnQ6ICR7cG9ydH1gKTtcbiAgICByZXR1cm4gcG9ydDtcbiAgfVxuXG4gIC8vIG90aGVyd2lzZSBmaW5kIHRoZSBmcmVlIHBvcnQgYmFzZWQgb24gYSBsaXN0IG9yIHJhbmdlIHByb3ZpZGVkIGJ5IHRoZSB1c2VyXG4gIGxvZz8uZGVidWcoYEZpbmRpbmcgYSBmcmVlIHBvcnQgZm9yIGNocm9tZWRyaXZlciB1c2luZyBzcGVjICR7SlNPTi5zdHJpbmdpZnkocG9ydFNwZWMpfWApO1xuICBsZXQgZm91bmRQb3J0ID0gbnVsbDtcbiAgZm9yIChjb25zdCBwb3RlbnRpYWxQb3J0IG9mIHBvcnRTcGVjKSB7XG4gICAgbGV0IHBvcnQsIHN0b3BQb3J0O1xuICAgIGlmIChfLmlzQXJyYXkocG90ZW50aWFsUG9ydCkpIHtcbiAgICAgIChbcG9ydCwgc3RvcFBvcnRdID0gcG90ZW50aWFsUG9ydCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBvcnQgPSBwYXJzZUludChwb3RlbnRpYWxQb3J0LCAxMCk7IC8vIGVuc3VyZSB3ZSBoYXZlIGEgbnVtYmVyIGFuZCBub3QgYSBzdHJpbmdcbiAgICAgIHN0b3BQb3J0ID0gcG9ydDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGxvZz8uZGVidWcoYENoZWNraW5nIHBvcnQgcmFuZ2UgJHtwb3J0fToke3N0b3BQb3J0fWApO1xuICAgICAgZm91bmRQb3J0ID0gYXdhaXQgZ2V0UG9ydCh7cG9ydCwgc3RvcFBvcnR9KTtcbiAgICAgIGJyZWFrO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZz8uZGVidWcoYE5vdGhpbmcgaW4gcG9ydCByYW5nZSAke3BvcnR9OiR7c3RvcFBvcnR9IHdhcyBhdmFpbGFibGVgKTtcbiAgICB9XG4gIH1cblxuICBpZiAoZm91bmRQb3J0ID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBhIGZyZWUgcG9ydCBmb3IgY2hyb21lZHJpdmVyIHVzaW5nIGAgK1xuICAgICAgICAgICAgICAgICAgICBgY2hyb21lZHJpdmVyUG9ydHMgc3BlYyAke0pTT04uc3RyaW5naWZ5KHBvcnRTcGVjKX1gKTtcbiAgfVxuXG4gIGxvZz8uZGVidWcoYFVzaW5nIGZyZWUgcG9ydCAke2ZvdW5kUG9ydH0gZm9yIGNocm9tZWRyaXZlcmApO1xuICByZXR1cm4gZm91bmRQb3J0O1xufVxuXG5oZWxwZXJzLmlzQ2hyb21lZHJpdmVyQXV0b2Rvd25sb2FkRW5hYmxlZCA9IGZ1bmN0aW9uIGlzQ2hyb21lZHJpdmVyQXV0b2Rvd25sb2FkRW5hYmxlZCAoKSB7XG4gIGlmICh0aGlzLmlzRmVhdHVyZUVuYWJsZWQoQ0hST01FRFJJVkVSX0FVVE9ET1dOTE9BRF9GRUFUVVJFKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHRoaXM/LmxvZz8uZGVidWcoYEF1dG9tYXRlZCBDaHJvbWVkcml2ZXIgZG93bmxvYWQgaXMgZGlzYWJsZWQuIGAgK1xuICAgIGBVc2UgJyR7Q0hST01FRFJJVkVSX0FVVE9ET1dOTE9BRF9GRUFUVVJFfScgc2VydmVyIGZlYXR1cmUgdG8gZW5hYmxlIGl0YCk7XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbmhlbHBlcnMuc2V0dXBOZXdDaHJvbWVkcml2ZXIgPSBhc3luYyBmdW5jdGlvbiBzZXR1cE5ld0Nocm9tZWRyaXZlciAob3B0cywgY3VyRGV2aWNlSWQsIGFkYiwgY29udGV4dCA9IG51bGwpIHtcbiAgaWYgKG9wdHMuY2hyb21lRHJpdmVyUG9ydCkge1xuICAgIHRoaXM/LmxvZz8ud2FybihgVGhlICdjaHJvbWVEcml2ZXJQb3J0JyBjYXBhYmlsaXR5IGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgJ2Nocm9tZWRyaXZlclBvcnQnIGluc3RlYWRgKTtcbiAgICBvcHRzLmNocm9tZWRyaXZlclBvcnQgPSBvcHRzLmNocm9tZURyaXZlclBvcnQ7XG4gIH1cblxuICBpZiAob3B0cy5jaHJvbWVkcml2ZXJQb3J0KSB7XG4gICAgdGhpcz8ubG9nPy5kZWJ1ZyhgVXNpbmcgdXNlci1zcGVjaWZpZWQgcG9ydCAke29wdHMuY2hyb21lZHJpdmVyUG9ydH0gZm9yIGNocm9tZWRyaXZlcmApO1xuICB9IGVsc2Uge1xuICAgIC8vIGlmIGEgc2luZ2xlIHBvcnQgd2Fzbid0IGdpdmVuLCB3ZSdsbCBsb29rIGZvciBhIGZyZWUgb25lXG4gICAgb3B0cy5jaHJvbWVkcml2ZXJQb3J0ID0gYXdhaXQgZ2V0Q2hyb21lZHJpdmVyUG9ydChvcHRzLmNocm9tZWRyaXZlclBvcnRzLCB0aGlzPy5sb2cpO1xuICB9XG5cbiAgY29uc3QgZGV0YWlscyA9IGNvbnRleHQgPyB3ZWJ2aWV3SGVscGVycy5nZXRXZWJ2aWV3RGV0YWlscyhhZGIsIGNvbnRleHQpIDogdW5kZWZpbmVkO1xuICBpZiAoIV8uaXNFbXB0eShkZXRhaWxzKSkge1xuICAgIHRoaXM/LmxvZz8uZGVidWcoJ1Bhc3Npbmcgd2ViIHZpZXcgZGV0YWlscyB0byB0aGUgQ2hyb21lZHJpdmVyIGNvbnN0cnVjdG9yOiAnICtcbiAgICAgIEpTT04uc3RyaW5naWZ5KGRldGFpbHMsIG51bGwsIDIpKTtcbiAgfVxuXG4gIGNvbnN0IGNocm9tZWRyaXZlciA9IG5ldyBDaHJvbWVkcml2ZXIoe1xuICAgIHBvcnQ6IG9wdHMuY2hyb21lZHJpdmVyUG9ydCxcbiAgICBleGVjdXRhYmxlOiBvcHRzLmNocm9tZWRyaXZlckV4ZWN1dGFibGUsXG4gICAgYWRiLFxuICAgIGNtZEFyZ3M6IG9wdHMuY2hyb21lZHJpdmVyQXJncyxcbiAgICB2ZXJib3NlOiAhIW9wdHMuc2hvd0Nocm9tZWRyaXZlckxvZyxcbiAgICBleGVjdXRhYmxlRGlyOiBvcHRzLmNocm9tZWRyaXZlckV4ZWN1dGFibGVEaXIsXG4gICAgbWFwcGluZ1BhdGg6IG9wdHMuY2hyb21lZHJpdmVyQ2hyb21lTWFwcGluZ0ZpbGUsXG4gICAgYnVuZGxlSWQ6IG9wdHMuY2hyb21lQnVuZGxlSWQsXG4gICAgdXNlU3lzdGVtRXhlY3V0YWJsZTogb3B0cy5jaHJvbWVkcml2ZXJVc2VTeXN0ZW1FeGVjdXRhYmxlLFxuICAgIGRpc2FibGVCdWlsZENoZWNrOiBvcHRzLmNocm9tZWRyaXZlckRpc2FibGVCdWlsZENoZWNrLFxuICAgIGRldGFpbHMsXG4gICAgaXNBdXRvZG93bmxvYWRFbmFibGVkOiB0aGlzPy5pc0Nocm9tZWRyaXZlckF1dG9kb3dubG9hZEVuYWJsZWQ/LigpXG4gIH0pO1xuXG4gIC8vIG1ha2Ugc3VyZSB0aGVyZSBhcmUgY2hyb21lT3B0aW9uc1xuICBvcHRzLmNocm9tZU9wdGlvbnMgPSBvcHRzLmNocm9tZU9wdGlvbnMgfHwge307XG4gIC8vIHRyeSBvdXQgYW55IHByZWZpeGVkIGNocm9tZU9wdGlvbnMsXG4gIC8vIGFuZCBzdHJpcCB0aGUgcHJlZml4XG4gIGZvciAoY29uc3Qgb3B0IG9mIF8ua2V5cyhvcHRzKSkge1xuICAgIGlmIChvcHQuZW5kc1dpdGgoJzpjaHJvbWVPcHRpb25zJykpIHtcbiAgICAgIHRoaXM/LmxvZz8ud2FybihgTWVyZ2luZyAnJHtvcHR9JyBpbnRvICdjaHJvbWVPcHRpb25zJy4gVGhpcyBtYXkgY2F1c2UgdW5leHBlY3RlZCBiZWhhdmlvcmApO1xuICAgICAgXy5tZXJnZShvcHRzLmNocm9tZU9wdGlvbnMsIG9wdHNbb3B0XSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgY2FwcyA9IHdlYnZpZXdIZWxwZXJzLmNyZWF0ZUNocm9tZWRyaXZlckNhcHMob3B0cywgY3VyRGV2aWNlSWQsIGRldGFpbHMpO1xuICB0aGlzPy5sb2c/LmRlYnVnKGBCZWZvcmUgc3RhcnRpbmcgY2hyb21lZHJpdmVyLCBhbmRyb2lkUGFja2FnZSBpcyAnJHtjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZFBhY2thZ2V9J2ApO1xuICBhd2FpdCBjaHJvbWVkcml2ZXIuc3RhcnQoY2Fwcyk7XG4gIHJldHVybiBjaHJvbWVkcml2ZXI7XG59O1xuY29uc3Qgc2V0dXBOZXdDaHJvbWVkcml2ZXIgPSBoZWxwZXJzLnNldHVwTmV3Q2hyb21lZHJpdmVyO1xuXG5cbk9iamVjdC5hc3NpZ24oZXh0ZW5zaW9ucywgY29tbWFuZHMsIGhlbHBlcnMpO1xuZXhwb3J0IHsgY29tbWFuZHMsIGhlbHBlcnMsIHNldHVwTmV3Q2hyb21lZHJpdmVyIH07XG5leHBvcnQgZGVmYXVsdCBleHRlbnNpb25zO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLG1CQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxXQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRyxTQUFBLEdBQUFKLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSSxRQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxPQUFBLEdBQUFMLE9BQUE7QUFDQSxJQUFBTSxlQUFBLEdBQUFDLHVCQUFBLENBQUFQLE9BQUE7QUFJQSxJQUFBUSxlQUFBLEdBQUFSLE9BQUE7QUFBK0MsU0FBQVMseUJBQUFDLFdBQUEsZUFBQUMsT0FBQSxrQ0FBQUMsaUJBQUEsT0FBQUQsT0FBQSxRQUFBRSxnQkFBQSxPQUFBRixPQUFBLFlBQUFGLHdCQUFBLFlBQUFBLENBQUFDLFdBQUEsV0FBQUEsV0FBQSxHQUFBRyxnQkFBQSxHQUFBRCxpQkFBQSxLQUFBRixXQUFBO0FBQUEsU0FBQUgsd0JBQUFPLEdBQUEsRUFBQUosV0FBQSxTQUFBQSxXQUFBLElBQUFJLEdBQUEsSUFBQUEsR0FBQSxDQUFBQyxVQUFBLFdBQUFELEdBQUEsUUFBQUEsR0FBQSxvQkFBQUEsR0FBQSx3QkFBQUEsR0FBQSw0QkFBQUUsT0FBQSxFQUFBRixHQUFBLFVBQUFHLEtBQUEsR0FBQVIsd0JBQUEsQ0FBQUMsV0FBQSxPQUFBTyxLQUFBLElBQUFBLEtBQUEsQ0FBQUMsR0FBQSxDQUFBSixHQUFBLFlBQUFHLEtBQUEsQ0FBQUUsR0FBQSxDQUFBTCxHQUFBLFNBQUFNLE1BQUEsV0FBQUMscUJBQUEsR0FBQUMsTUFBQSxDQUFBQyxjQUFBLElBQUFELE1BQUEsQ0FBQUUsd0JBQUEsV0FBQUMsR0FBQSxJQUFBWCxHQUFBLFFBQUFXLEdBQUEsa0JBQUFILE1BQUEsQ0FBQUksU0FBQSxDQUFBQyxjQUFBLENBQUFDLElBQUEsQ0FBQWQsR0FBQSxFQUFBVyxHQUFBLFNBQUFJLElBQUEsR0FBQVIscUJBQUEsR0FBQUMsTUFBQSxDQUFBRSx3QkFBQSxDQUFBVixHQUFBLEVBQUFXLEdBQUEsY0FBQUksSUFBQSxLQUFBQSxJQUFBLENBQUFWLEdBQUEsSUFBQVUsSUFBQSxDQUFBQyxHQUFBLEtBQUFSLE1BQUEsQ0FBQUMsY0FBQSxDQUFBSCxNQUFBLEVBQUFLLEdBQUEsRUFBQUksSUFBQSxZQUFBVCxNQUFBLENBQUFLLEdBQUEsSUFBQVgsR0FBQSxDQUFBVyxHQUFBLFNBQUFMLE1BQUEsQ0FBQUosT0FBQSxHQUFBRixHQUFBLE1BQUFHLEtBQUEsSUFBQUEsS0FBQSxDQUFBYSxHQUFBLENBQUFoQixHQUFBLEVBQUFNLE1BQUEsWUFBQUEsTUFBQTtBQUUvQyxNQUFNVyxpQ0FBaUMsR0FBRywyQkFBMkI7QUFFckUsSUFBSUMsUUFBUSxHQUFHLENBQUMsQ0FBQztFQUFFQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0VBQUVDLFVBQVUsR0FBRyxDQUFDLENBQUM7QUFBQ0MsT0FBQSxDQUFBRixPQUFBLEdBQUFBLE9BQUE7QUFBQUUsT0FBQSxDQUFBSCxRQUFBLEdBQUFBLFFBQUE7QUFNakRBLFFBQVEsQ0FBQ0ksaUJBQWlCLEdBQUcsZUFBZUEsaUJBQWlCQSxDQUFBLEVBQUk7RUFHL0QsT0FBTyxJQUFJLENBQUNDLFVBQVUsSUFBSSxJQUFJLENBQUNDLGtCQUFrQixDQUFDLENBQUM7QUFDckQsQ0FBQztBQUVETixRQUFRLENBQUNPLFdBQVcsR0FBRyxlQUFlQSxXQUFXQSxDQUFBLEVBQUk7RUFDbkQsTUFBTUMsZUFBZSxHQUFHLE1BQU1DLHVCQUFjLENBQUNDLGtCQUFrQixDQUFDLElBQUksQ0FBQ0MsR0FBRyxFQUFFLElBQUksQ0FBQ0MsSUFBSSxDQUFDO0VBQ3BGLE9BQU8sSUFBSSxDQUFDQyxjQUFjLENBQUNMLGVBQWUsQ0FBQztBQUM3QyxDQUFDO0FBRURSLFFBQVEsQ0FBQ2MsVUFBVSxHQUFHLGVBQWVBLFVBQVVBLENBQUVDLElBQUksRUFBRTtFQUNyRCxJQUFJLENBQUNDLGFBQUksQ0FBQ0MsUUFBUSxDQUFDRixJQUFJLENBQUMsRUFBRTtJQUN4QkEsSUFBSSxHQUFHLElBQUksQ0FBQ1Qsa0JBQWtCLENBQUMsQ0FBQztFQUNsQyxDQUFDLE1BQU0sSUFBSVMsSUFBSSxLQUFLRywyQkFBVyxFQUFFO0lBRS9CSCxJQUFJLEdBQUcsSUFBSSxDQUFDSSxrQkFBa0IsQ0FBQyxDQUFDO0VBQ2xDO0VBRUEsSUFBSUosSUFBSSxLQUFLLElBQUksQ0FBQ1YsVUFBVSxFQUFFO0lBQzVCO0VBQ0Y7RUFFQSxNQUFNRyxlQUFlLEdBQUcsTUFBTUMsdUJBQWMsQ0FBQ0Msa0JBQWtCLENBQUMsSUFBSSxDQUFDQyxHQUFHLEVBQUUsSUFBSSxDQUFDQyxJQUFJLENBQUM7RUFDcEYsTUFBTVEsUUFBUSxHQUFHLElBQUksQ0FBQ1AsY0FBYyxDQUFDTCxlQUFlLENBQUM7RUFFckQsSUFBSSxDQUFDYSxlQUFDLENBQUNDLFFBQVEsQ0FBQ0YsUUFBUSxFQUFFTCxJQUFJLENBQUMsRUFBRTtJQUMvQixNQUFNLElBQUlRLGNBQU0sQ0FBQ0Msa0JBQWtCLENBQUMsQ0FBQztFQUN2QztFQUVBLE1BQU0sSUFBSSxDQUFDQyxhQUFhLENBQUNWLElBQUksRUFBRVAsZUFBZSxDQUFDO0VBQy9DLElBQUksQ0FBQ0gsVUFBVSxHQUFHVSxJQUFJO0FBQ3hCLENBQUM7QUFnRERmLFFBQVEsQ0FBQzBCLGlCQUFpQixHQUFHLGVBQWVBLGlCQUFpQkEsQ0FBQSxFQUFJO0VBQy9ELE1BQU1kLElBQUksR0FBRztJQUNYZSxtQkFBbUIsRUFBRSxJQUFJLENBQUNmLElBQUksQ0FBQ2UsbUJBQW1CO0lBQ2xEQyx1QkFBdUIsRUFBRSxJQUFJO0lBQzdCQyxtQkFBbUIsRUFBRSxJQUFJLENBQUNqQixJQUFJLENBQUNpQixtQkFBbUI7SUFDbERDLDhCQUE4QixFQUFFO0VBQ2xDLENBQUM7RUFDRCxPQUFPLE1BQU1yQix1QkFBYyxDQUFDQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUNDLEdBQUcsRUFBRUMsSUFBSSxDQUFDO0FBQ2hFLENBQUM7QUFFRFgsT0FBTyxDQUFDWSxjQUFjLEdBQUcsU0FBU0EsY0FBY0EsQ0FBRUwsZUFBZSxFQUFFO0VBQ2pFLE1BQU1JLElBQUksR0FBR3RCLE1BQU0sQ0FBQ3lDLE1BQU0sQ0FBQztJQUFDQyxlQUFlLEVBQUUsSUFBSSxDQUFDQTtFQUFlLENBQUMsRUFBRSxJQUFJLENBQUNwQixJQUFJLENBQUM7RUFDOUUsTUFBTXFCLFFBQVEsR0FBR3hCLHVCQUFjLENBQUN5QixpQkFBaUIsQ0FBQzFCLGVBQWUsRUFBRUksSUFBSSxDQUFDO0VBQ3hFLElBQUksQ0FBQ1EsUUFBUSxHQUFHLENBQUNlLDBCQUFVLEVBQUUsR0FBR0YsUUFBUSxDQUFDO0VBQ3pDLElBQUksQ0FBQ0csR0FBRyxDQUFDQyxLQUFLLENBQUUsdUJBQXNCQyxJQUFJLENBQUNDLFNBQVMsQ0FBQyxJQUFJLENBQUNuQixRQUFRLENBQUUsRUFBQyxDQUFDO0VBQ3RFLE9BQU8sSUFBSSxDQUFDQSxRQUFRO0FBQ3RCLENBQUM7QUFFRG5CLE9BQU8sQ0FBQ3dCLGFBQWEsR0FBRyxlQUFlQSxhQUFhQSxDQUFFVixJQUFJLEVBQUVQLGVBQWUsRUFBRTtFQUczRSxJQUFJLElBQUksQ0FBQ2dDLHFCQUFxQixDQUFDekIsSUFBSSxDQUFDLEVBQUU7SUFFcEMsTUFBTSxJQUFJLENBQUMwQixzQkFBc0IsQ0FBQzFCLElBQUksRUFBRVAsZUFBZSxDQUFDO0VBQzFELENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQ2dDLHFCQUFxQixDQUFDLElBQUksQ0FBQ25DLFVBQVUsQ0FBQyxFQUFFO0lBS3RELElBQUksSUFBSSxDQUFDTyxJQUFJLENBQUM4Qiw0QkFBNEIsRUFBRTtNQUMxQyxJQUFJLENBQUNOLEdBQUcsQ0FBQ0MsS0FBSyxDQUFDLDBFQUEwRSxDQUFDO01BQzFGLE1BQU0sSUFBSSxDQUFDTSx1QkFBdUIsQ0FBQyxDQUFDO0lBQ3RDLENBQUMsTUFBTTtNQUNMLE1BQU0sSUFBSSxDQUFDQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQ3ZDO0VBQ0YsQ0FBQyxNQUFNO0lBQ0wsTUFBTSxJQUFJQyxLQUFLLENBQUUsbURBQWtEOUIsSUFBSyxHQUFFLENBQUM7RUFDN0U7QUFDRixDQUFDO0FBVURkLE9BQU8sQ0FBQ0ssa0JBQWtCLEdBQUcsU0FBU0Esa0JBQWtCQSxDQUFBLEVBQUk7RUFDMUQsT0FBTzZCLDBCQUFVO0FBQ25CLENBQUM7QUFFRGxDLE9BQU8sQ0FBQ2tCLGtCQUFrQixHQUFHLFNBQVNBLGtCQUFrQkEsQ0FBQSxFQUFJO0VBQzFELE9BQU8yQiw0QkFBWSxJQUFJLElBQUksQ0FBQ2xDLElBQUksQ0FBQ21DLGVBQWUsSUFBSSxJQUFJLENBQUNuQyxJQUFJLENBQUNvQyxVQUFVLENBQUM7QUFDM0UsQ0FBQztBQUVEL0MsT0FBTyxDQUFDZ0QsWUFBWSxHQUFHLFNBQVNBLFlBQVlBLENBQUEsRUFBSTtFQUM5QyxPQUFPLElBQUksQ0FBQzVDLFVBQVUsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDQSxVQUFVLEtBQUs4QiwwQkFBVTtBQUNuRSxDQUFDO0FBR0RsQyxPQUFPLENBQUN3QyxzQkFBc0IsR0FBRyxlQUFlQSxzQkFBc0JBLENBQUVTLE9BQU8sRUFBRTFDLGVBQWUsRUFBRTtFQUNoRyxJQUFJLENBQUM0QixHQUFHLENBQUNDLEtBQUssQ0FBRSxnREFBK0NhLE9BQVEsR0FBRSxDQUFDO0VBRTFFLElBQUlDLEVBQUU7RUFDTixJQUFJLElBQUksQ0FBQ0Msb0JBQW9CLENBQUNGLE9BQU8sQ0FBQyxFQUFFO0lBR3RDLElBQUksQ0FBQ2QsR0FBRyxDQUFDQyxLQUFLLENBQUUsNENBQTJDYSxPQUFRLGNBQWEsQ0FBQztJQUNqRkMsRUFBRSxHQUFHLElBQUksQ0FBQ0Msb0JBQW9CLENBQUNGLE9BQU8sQ0FBQztJQUN2QyxNQUFNRyx5QkFBeUIsQ0FBQyxJQUFJLENBQUNqQixHQUFHLEVBQUVlLEVBQUUsQ0FBQztFQUMvQyxDQUFDLE1BQU07SUFDTCxJQUFJdkMsSUFBSSxHQUFHUyxlQUFDLENBQUNpQyxTQUFTLENBQUMsSUFBSSxDQUFDMUMsSUFBSSxDQUFDO0lBQ2pDQSxJQUFJLENBQUMyQyxtQkFBbUIsR0FBRyxJQUFJO0lBTy9CLElBQUkzQyxJQUFJLENBQUM0QywwQ0FBMEMsSUFBSU4sT0FBTyxLQUFNLEdBQUVKLDRCQUFhLFFBQU8sRUFBRTtNQUMxRixJQUFJVyxjQUFjLEdBQUdQLE9BQU8sQ0FBQ1EsS0FBSyxDQUFFLEdBQUVaLDRCQUFhLE1BQUssQ0FBQztNQUN6RCxJQUFJVyxjQUFjLElBQUlBLGNBQWMsQ0FBQ0UsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUMvQy9DLElBQUksQ0FBQ2dELG9CQUFvQixHQUFHSCxjQUFjLENBQUMsQ0FBQyxDQUFDO01BQy9DO01BQ0EsSUFBSSxDQUFDN0MsSUFBSSxDQUFDNEMsMENBQTBDLEVBQUU7UUFDcEQsSUFBSW5DLGVBQUMsQ0FBQ25DLEdBQUcsQ0FBQyxJQUFJLENBQUMwQixJQUFJLEVBQUUsZ0NBQWdDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQ0EsSUFBSSxDQUFDa0IsOEJBQThCLEVBQUU7VUFJbkcsTUFBTVYsUUFBUSxHQUFHWixlQUFlLENBQUNxRCxHQUFHLENBQUVDLEVBQUUsSUFBS0EsRUFBRSxDQUFDQyxXQUFXLENBQUM7VUFDNUQsS0FBSyxNQUFNQyxZQUFZLElBQUlDLDBDQUEwQixFQUFFO1lBQ3JELElBQUk1QyxlQUFDLENBQUNDLFFBQVEsQ0FBQ0YsUUFBUSxFQUFHLEdBQUUwQiw0QkFBYSxHQUFFa0IsWUFBYSxFQUFDLENBQUMsRUFBRTtjQUMxRDtZQUNGO1lBQ0EsTUFBTUUsUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDQyxhQUFhLENBQUNILFlBQVksQ0FBQztZQUN2RCxJQUFJM0MsZUFBQyxDQUFDQyxRQUFRLENBQUMsQ0FBQzhDLHlCQUFTLENBQUNDLHFCQUFxQixFQUFFRCx5QkFBUyxDQUFDRSxxQkFBcUIsQ0FBQyxFQUFFSixRQUFRLENBQUMsRUFBRTtjQUM1RnRELElBQUksQ0FBQ2dELG9CQUFvQixHQUFHSSxZQUFZO2NBQ3hDLElBQUksQ0FBQzVCLEdBQUcsQ0FBQ0MsS0FBSyxDQUFFLHVDQUFzQ3pCLElBQUksQ0FBQ2dELG9CQUFxQixJQUFHLEdBQ2hGLGdCQUFlVixPQUFRLDZDQUE0QyxDQUFDO2NBQ3ZFO1lBQ0Y7VUFDRjtRQUNGLENBQUMsTUFBTTtVQUNMLEtBQUssTUFBTVksRUFBRSxJQUFJdEQsZUFBZSxFQUFFO1lBQ2hDLElBQUlzRCxFQUFFLENBQUNDLFdBQVcsS0FBS2IsT0FBTyxJQUFJN0IsZUFBQyxDQUFDbkMsR0FBRyxDQUFDNEUsRUFBRSxhQUFGQSxFQUFFLHVCQUFGQSxFQUFFLENBQUVTLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxFQUFFO2NBQ3BFM0QsSUFBSSxDQUFDZ0Qsb0JBQW9CLEdBQUdFLEVBQUUsQ0FBQ1MsSUFBSSxDQUFDLGlCQUFpQixDQUFDO2NBQ3RELElBQUksQ0FBQ25DLEdBQUcsQ0FBQ0MsS0FBSyxDQUFFLHVDQUFzQ3pCLElBQUksQ0FBQ2dELG9CQUFxQixJQUFHLEdBQ2hGLGdCQUFlVixPQUFRLFVBQVMsQ0FBQztjQUNwQztZQUNGO1VBQ0Y7UUFDRjtNQUNGO0lBQ0Y7SUFFQUMsRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDcUIsb0JBQW9CLENBQUM1RCxJQUFJLEVBQUUsSUFBSSxDQUFDRCxHQUFHLENBQUM4RCxXQUFXLEVBQUUsSUFBSSxDQUFDOUQsR0FBRyxFQUFFdUMsT0FBTyxDQUFDO0lBR25GQyxFQUFFLENBQUN1QixFQUFFLENBQUNDLDJCQUFZLENBQUNDLGFBQWEsRUFBR0MsR0FBRyxJQUFLO01BQ3pDLElBQUlBLEdBQUcsQ0FBQ0MsS0FBSyxLQUFLSCwyQkFBWSxDQUFDSSxhQUFhLEVBQUU7UUFDNUMsSUFBSSxDQUFDQyxrQkFBa0IsQ0FBQzlCLE9BQU8sQ0FBQztNQUNsQztJQUNGLENBQUMsQ0FBQztJQUVGLElBQUksQ0FBQ0Usb0JBQW9CLENBQUNGLE9BQU8sQ0FBQyxHQUFHQyxFQUFFO0VBQ3pDO0VBRUEsSUFBSSxDQUFDOEIsWUFBWSxHQUFHOUIsRUFBRTtFQUN0QixJQUFJLENBQUMrQixXQUFXLEdBQUcsSUFBSSxDQUFDRCxZQUFZLENBQUNFLFFBQVEsQ0FBQ0MsSUFBSSxDQUFDLElBQUksQ0FBQ0gsWUFBWSxDQUFDO0VBQ3JFLElBQUksQ0FBQ0ksWUFBWSxHQUFHLElBQUksQ0FBQ0osWUFBWSxDQUFDSyxPQUFPLENBQUNDLE9BQU8sQ0FBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQ0gsWUFBWSxDQUFDSyxPQUFPLENBQUM7RUFDckYsSUFBSSxDQUFDRSxjQUFjLEdBQUcsSUFBSTtBQUM1QixDQUFDO0FBR0R2RixPQUFPLENBQUMyQyx3QkFBd0IsR0FBRyxTQUFTQSx3QkFBd0JBLENBQUEsRUFBSTtFQUN0RSxJQUFJLENBQUNxQyxZQUFZLEdBQUcsSUFBSTtFQUN4QixJQUFJLENBQUNDLFdBQVcsR0FBRyxJQUFJO0VBQ3ZCLElBQUksQ0FBQ0csWUFBWSxHQUFHLElBQUk7RUFDeEIsSUFBSSxDQUFDRyxjQUFjLEdBQUcsS0FBSztBQUM3QixDQUFDO0FBR0R2RixPQUFPLENBQUMrRSxrQkFBa0IsR0FBRyxlQUFlQSxrQkFBa0JBLENBQUU5QixPQUFPLEVBQUU7RUFDdkUsSUFBSSxDQUFDZCxHQUFHLENBQUNxRCxJQUFJLENBQUUsNEJBQTJCdkMsT0FBUSx1QkFBc0IsQ0FBQztFQUN6RSxJQUFJQSxPQUFPLEtBQUssSUFBSSxDQUFDN0MsVUFBVSxFQUFFO0lBRy9CLElBQUlxRixHQUFHLEdBQUcsSUFBSTdDLEtBQUssQ0FBQywrQ0FBK0MsQ0FBQztJQUNwRSxNQUFNLElBQUksQ0FBQzhDLHVCQUF1QixDQUFDRCxHQUFHLENBQUM7RUFDekMsQ0FBQyxNQUFNO0lBR0wsSUFBSSxDQUFDdEQsR0FBRyxDQUFDcUQsSUFBSSxDQUFDLDJEQUEyRCxHQUN2RSxtQkFBbUIsQ0FBQztJQUN0QixPQUFPLElBQUksQ0FBQ3JDLG9CQUFvQixDQUFDRixPQUFPLENBQUM7RUFDM0M7QUFDRixDQUFDO0FBSURqRCxPQUFPLENBQUMwQyx1QkFBdUIsR0FBRyxlQUFlQSx1QkFBdUJBLENBQUEsRUFBSTtFQUMxRSxJQUFJLENBQUNDLHdCQUF3QixDQUFDLENBQUM7RUFDL0IsS0FBSyxJQUFJTSxPQUFPLElBQUk3QixlQUFDLENBQUN1RSxJQUFJLENBQUMsSUFBSSxDQUFDeEMsb0JBQW9CLENBQUMsRUFBRTtJQUNyRCxJQUFJRCxFQUFFLEdBQUcsSUFBSSxDQUFDQyxvQkFBb0IsQ0FBQ0YsT0FBTyxDQUFDO0lBQzNDLElBQUksQ0FBQ2QsR0FBRyxDQUFDQyxLQUFLLENBQUUscUNBQW9DYSxPQUFRLEVBQUMsQ0FBQztJQUU5REMsRUFBRSxDQUFDMEMsa0JBQWtCLENBQUNsQiwyQkFBWSxDQUFDQyxhQUFhLENBQUM7SUFDakQsSUFBSTtNQUNGLE1BQU16QixFQUFFLENBQUMyQyxJQUFJLENBQUMsQ0FBQztJQUNqQixDQUFDLENBQUMsT0FBT0osR0FBRyxFQUFFO01BQ1osSUFBSSxDQUFDdEQsR0FBRyxDQUFDcUQsSUFBSSxDQUFFLGdDQUErQkMsR0FBRyxDQUFDSyxPQUFRLEVBQUMsQ0FBQztJQUM5RDtJQUNBLE9BQU8sSUFBSSxDQUFDM0Msb0JBQW9CLENBQUNGLE9BQU8sQ0FBQztFQUMzQztBQUNGLENBQUM7QUFFRGpELE9BQU8sQ0FBQ3VDLHFCQUFxQixHQUFHLFNBQVNBLHFCQUFxQkEsQ0FBRXdELFFBQVEsRUFBRTtFQUN4RSxPQUFPM0UsZUFBQyxDQUFDQyxRQUFRLENBQUMwRSxRQUFRLEVBQUU5RSwyQkFBVyxDQUFDLElBQUk4RSxRQUFRLEtBQUtDLDRCQUFZO0FBQ3ZFLENBQUM7QUFFRGhHLE9BQU8sQ0FBQ2lHLDBCQUEwQixHQUFHLFNBQVNBLDBCQUEwQkEsQ0FBQSxFQUFJO0VBQzFFLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQ3RGLElBQUksQ0FBQ3VGLGFBQWEsSUFDekI5RSxlQUFDLENBQUMrRSxPQUFPLENBQUMsSUFBSSxDQUFDeEYsSUFBSSxDQUFDdUYsYUFBYSxDQUFDRSxJQUFJLENBQUMsSUFDdkMsSUFBSSxDQUFDekYsSUFBSSxDQUFDdUYsYUFBYSxDQUFDRSxJQUFJLENBQUMvRSxRQUFRLENBQUMsZ0JBQWdCLENBQUM7QUFDaEUsQ0FBQztBQUVEckIsT0FBTyxDQUFDcUcsb0JBQW9CLEdBQUcsZUFBZUEsb0JBQW9CQSxDQUFBLEVBQUk7RUFDcEUsSUFBSSxDQUFDbEUsR0FBRyxDQUFDbUMsSUFBSSxDQUFDLGtDQUFrQyxDQUFDO0VBQ2pELElBQUlnQyxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUNDLGtCQUFrQixDQUFDLENBQUM7RUFDOUMsSUFBSUQsUUFBUSxLQUFLLHVEQUF1RCxFQUFFO0lBQ3hFLElBQUksQ0FBQ25FLEdBQUcsQ0FBQ21DLElBQUksQ0FBQyxtREFBbUQsQ0FBQztJQUNsRTtFQUNGO0VBQ0EsSUFBSWtDLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQ0MsV0FBVyxDQUFDLElBQUksRUFBRSxvQ0FBb0MsRUFBRSxLQUFLLENBQUM7RUFDbEYsTUFBTSxJQUFJLENBQUNDLEtBQUssQ0FBQ0YsRUFBRSxDQUFDRyxPQUFPLENBQUM7RUFDNUIsSUFBSTtJQUNGLElBQUlILEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQ0MsV0FBVyxDQUFDLElBQUksRUFBRSx1Q0FBdUMsRUFBRSxLQUFLLENBQUM7SUFDckYsTUFBTSxJQUFJLENBQUNDLEtBQUssQ0FBQ0YsRUFBRSxDQUFDRyxPQUFPLENBQUM7RUFDOUIsQ0FBQyxDQUFDLE9BQU9DLENBQUMsRUFBRTtJQUdWLElBQUksQ0FBQ3pFLEdBQUcsQ0FBQ3FELElBQUksQ0FBRSxrREFBaURvQixDQUFDLENBQUNkLE9BQVEsRUFBQyxDQUFDO0VBQzlFO0FBQ0YsQ0FBQztBQUVEOUYsT0FBTyxDQUFDNkcsa0JBQWtCLEdBQUcsZUFBZUEsa0JBQWtCQSxDQUFBLEVBQUk7RUFDaEUsSUFBSSxDQUFDMUUsR0FBRyxDQUFDbUMsSUFBSSxDQUFDLHlDQUF5QyxDQUFDO0VBQ3hELElBQUkzRCxJQUFJLEdBQUdTLGVBQUMsQ0FBQ2lDLFNBQVMsQ0FBQyxJQUFJLENBQUMxQyxJQUFJLENBQUM7RUFFakMsTUFBTW1HLGFBQWEsR0FBRyxDQUNwQiwyQkFBMkIsRUFDM0Isb0JBQW9CLEVBQ3BCLGlCQUFpQixFQUNqQixxQkFBcUIsRUFDckIsNEJBQTRCLENBQzdCO0VBRUQsSUFBSTFGLGVBQUMsQ0FBQ0MsUUFBUSxDQUFDeUYsYUFBYSxFQUFFLElBQUksQ0FBQ25HLElBQUksQ0FBQ29DLFVBQVUsQ0FBQyxFQUFFO0lBQ25EcEMsSUFBSSxDQUFDb0csY0FBYyxHQUFHLElBQUksQ0FBQ3BHLElBQUksQ0FBQ29DLFVBQVU7RUFDNUMsQ0FBQyxNQUFNO0lBQ0xwQyxJQUFJLENBQUNxRyxxQkFBcUIsR0FBRyxJQUFJLENBQUNyRyxJQUFJLENBQUNzRyxXQUFXO0VBQ3BEO0VBQ0EsSUFBSSxDQUFDakMsWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDVCxvQkFBb0IsQ0FBQzVELElBQUksRUFBRSxJQUFJLENBQUNELEdBQUcsQ0FBQzhELFdBQVcsRUFBRSxJQUFJLENBQUM5RCxHQUFHLENBQUM7RUFDekYsSUFBSSxDQUFDc0UsWUFBWSxDQUFDUCxFQUFFLENBQUNDLDJCQUFZLENBQUNDLGFBQWEsRUFBR0MsR0FBRyxJQUFLO0lBQ3hELElBQUlBLEdBQUcsQ0FBQ0MsS0FBSyxLQUFLSCwyQkFBWSxDQUFDSSxhQUFhLEVBQUU7TUFDNUMsSUFBSSxDQUFDQyxrQkFBa0IsQ0FBQ2lCLDRCQUFZLENBQUM7SUFDdkM7RUFDRixDQUFDLENBQUM7RUFLRixJQUFJLENBQUM1RixVQUFVLEdBQUc0Riw0QkFBWTtFQUM5QixJQUFJLENBQUM3QyxvQkFBb0IsQ0FBQzZDLDRCQUFZLENBQUMsR0FBRyxJQUFJLENBQUNoQixZQUFZO0VBQzNELElBQUksQ0FBQ0MsV0FBVyxHQUFHLElBQUksQ0FBQ0QsWUFBWSxDQUFDRSxRQUFRLENBQUNDLElBQUksQ0FBQyxJQUFJLENBQUNILFlBQVksQ0FBQztFQUNyRSxJQUFJLENBQUNJLFlBQVksR0FBRyxJQUFJLENBQUNKLFlBQVksQ0FBQ0ssT0FBTyxDQUFDQyxPQUFPLENBQUNILElBQUksQ0FBQyxJQUFJLENBQUNILFlBQVksQ0FBQ0ssT0FBTyxDQUFDO0VBQ3JGLElBQUksQ0FBQ0UsY0FBYyxHQUFHLElBQUk7RUFFMUIsSUFBSSxJQUFJLENBQUNVLDBCQUEwQixDQUFDLENBQUMsRUFBRTtJQUVyQyxNQUFNLElBQUksQ0FBQ0ksb0JBQW9CLENBQUMsQ0FBQztFQUNuQztBQUNGLENBQUM7QUFPRCxlQUFlakQseUJBQXlCQSxDQUFFakIsR0FBRyxFQUFFNkMsWUFBWSxFQUFFO0VBRzNELElBQUksRUFBQyxNQUFNQSxZQUFZLENBQUNrQyxpQkFBaUIsQ0FBQyxDQUFDLEdBQUU7SUFDM0MvRSxHQUFHLENBQUNDLEtBQUssQ0FBQyxnREFBZ0QsR0FDN0MsOEJBQThCLENBQUM7SUFDNUMsTUFBTTRDLFlBQVksQ0FBQ21DLE9BQU8sQ0FBQyxDQUFDO0VBQzlCO0VBQ0EsT0FBT25DLFlBQVk7QUFDckI7QUFlQSxlQUFlb0MsbUJBQW1CQSxDQUFFQyxRQUFRLEVBQUVsRixHQUFHLEdBQUcsSUFBSSxFQUFFO0VBQ3hELE1BQU1tRixPQUFPLEdBQUdDLGlCQUFDLENBQUNDLFNBQVMsQ0FBQ0MsbUJBQVUsQ0FBQ0gsT0FBTyxFQUFFO0lBQUNyRSxPQUFPLEVBQUV3RTtFQUFVLENBQUMsQ0FBQztFQUl0RSxJQUFJLENBQUNKLFFBQVEsRUFBRTtJQUNiLE1BQU1LLElBQUksR0FBRyxNQUFNSixPQUFPLENBQUMsQ0FBQztJQUM1Qm5GLEdBQUcsYUFBSEEsR0FBRyx1QkFBSEEsR0FBRyxDQUFFQyxLQUFLLENBQUUsaURBQWdEc0YsSUFBSyxFQUFDLENBQUM7SUFDbkUsT0FBT0EsSUFBSTtFQUNiO0VBR0F2RixHQUFHLGFBQUhBLEdBQUcsdUJBQUhBLEdBQUcsQ0FBRUMsS0FBSyxDQUFFLG1EQUFrREMsSUFBSSxDQUFDQyxTQUFTLENBQUMrRSxRQUFRLENBQUUsRUFBQyxDQUFDO0VBQ3pGLElBQUlNLFNBQVMsR0FBRyxJQUFJO0VBQ3BCLEtBQUssTUFBTUMsYUFBYSxJQUFJUCxRQUFRLEVBQUU7SUFDcEMsSUFBSUssSUFBSSxFQUFFRyxRQUFRO0lBQ2xCLElBQUl6RyxlQUFDLENBQUMrRSxPQUFPLENBQUN5QixhQUFhLENBQUMsRUFBRTtNQUMzQixDQUFDRixJQUFJLEVBQUVHLFFBQVEsQ0FBQyxHQUFHRCxhQUFhO0lBQ25DLENBQUMsTUFBTTtNQUNMRixJQUFJLEdBQUdJLFFBQVEsQ0FBQ0YsYUFBYSxFQUFFLEVBQUUsQ0FBQztNQUNsQ0MsUUFBUSxHQUFHSCxJQUFJO0lBQ2pCO0lBQ0EsSUFBSTtNQUNGdkYsR0FBRyxhQUFIQSxHQUFHLHVCQUFIQSxHQUFHLENBQUVDLEtBQUssQ0FBRSx1QkFBc0JzRixJQUFLLElBQUdHLFFBQVMsRUFBQyxDQUFDO01BQ3JERixTQUFTLEdBQUcsTUFBTUwsT0FBTyxDQUFDO1FBQUNJLElBQUk7UUFBRUc7TUFBUSxDQUFDLENBQUM7TUFDM0M7SUFDRixDQUFDLENBQUMsT0FBT2pCLENBQUMsRUFBRTtNQUNWekUsR0FBRyxhQUFIQSxHQUFHLHVCQUFIQSxHQUFHLENBQUVDLEtBQUssQ0FBRSx5QkFBd0JzRixJQUFLLElBQUdHLFFBQVMsZ0JBQWUsQ0FBQztJQUN2RTtFQUNGO0VBRUEsSUFBSUYsU0FBUyxLQUFLLElBQUksRUFBRTtJQUN0QixNQUFNLElBQUkvRSxLQUFLLENBQUUsb0RBQW1ELEdBQ25ELDBCQUF5QlAsSUFBSSxDQUFDQyxTQUFTLENBQUMrRSxRQUFRLENBQUUsRUFBQyxDQUFDO0VBQ3ZFO0VBRUFsRixHQUFHLGFBQUhBLEdBQUcsdUJBQUhBLEdBQUcsQ0FBRUMsS0FBSyxDQUFFLG1CQUFrQnVGLFNBQVUsbUJBQWtCLENBQUM7RUFDM0QsT0FBT0EsU0FBUztBQUNsQjtBQUVBM0gsT0FBTyxDQUFDK0gsaUNBQWlDLEdBQUcsU0FBU0EsaUNBQWlDQSxDQUFBLEVBQUk7RUFBQSxJQUFBQyxTQUFBO0VBQ3hGLElBQUksSUFBSSxDQUFDQyxnQkFBZ0IsQ0FBQ25JLGlDQUFpQyxDQUFDLEVBQUU7SUFDNUQsT0FBTyxJQUFJO0VBQ2I7RUFDQSxJQUFJLGFBQUosSUFBSSx3QkFBQWtJLFNBQUEsR0FBSixJQUFJLENBQUU3RixHQUFHLGNBQUE2RixTQUFBLHVCQUFUQSxTQUFBLENBQVc1RixLQUFLLENBQUUsK0NBQThDLEdBQzdELFFBQU90QyxpQ0FBa0MsK0JBQThCLENBQUM7RUFDM0UsT0FBTyxLQUFLO0FBQ2QsQ0FBQztBQUVERSxPQUFPLENBQUN1RSxvQkFBb0IsR0FBRyxlQUFlQSxvQkFBb0JBLENBQUU1RCxJQUFJLEVBQUU2RCxXQUFXLEVBQUU5RCxHQUFHLEVBQUV1QyxPQUFPLEdBQUcsSUFBSSxFQUFFO0VBQUEsSUFBQWlGLHFCQUFBLEVBQUFDLFVBQUE7RUFDMUcsSUFBSXhILElBQUksQ0FBQ3lILGdCQUFnQixFQUFFO0lBQUEsSUFBQUMsVUFBQTtJQUN6QixJQUFJLGFBQUosSUFBSSx3QkFBQUEsVUFBQSxHQUFKLElBQUksQ0FBRWxHLEdBQUcsY0FBQWtHLFVBQUEsdUJBQVRBLFVBQUEsQ0FBVzdDLElBQUksQ0FBRSx3RkFBdUYsQ0FBQztJQUN6RzdFLElBQUksQ0FBQzJILGdCQUFnQixHQUFHM0gsSUFBSSxDQUFDeUgsZ0JBQWdCO0VBQy9DO0VBRUEsSUFBSXpILElBQUksQ0FBQzJILGdCQUFnQixFQUFFO0lBQUEsSUFBQUMsVUFBQTtJQUN6QixJQUFJLGFBQUosSUFBSSx3QkFBQUEsVUFBQSxHQUFKLElBQUksQ0FBRXBHLEdBQUcsY0FBQW9HLFVBQUEsdUJBQVRBLFVBQUEsQ0FBV25HLEtBQUssQ0FBRSw2QkFBNEJ6QixJQUFJLENBQUMySCxnQkFBaUIsbUJBQWtCLENBQUM7RUFDekYsQ0FBQyxNQUFNO0lBRUwzSCxJQUFJLENBQUMySCxnQkFBZ0IsR0FBRyxNQUFNbEIsbUJBQW1CLENBQUN6RyxJQUFJLENBQUM2SCxpQkFBaUIsRUFBRSxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUVyRyxHQUFHLENBQUM7RUFDdEY7RUFFQSxNQUFNc0csT0FBTyxHQUFHeEYsT0FBTyxHQUFHekMsdUJBQWMsQ0FBQ2tJLGlCQUFpQixDQUFDaEksR0FBRyxFQUFFdUMsT0FBTyxDQUFDLEdBQUcwRixTQUFTO0VBQ3BGLElBQUksQ0FBQ3ZILGVBQUMsQ0FBQ3dILE9BQU8sQ0FBQ0gsT0FBTyxDQUFDLEVBQUU7SUFBQSxJQUFBSSxVQUFBO0lBQ3ZCLElBQUksYUFBSixJQUFJLHdCQUFBQSxVQUFBLEdBQUosSUFBSSxDQUFFMUcsR0FBRyxjQUFBMEcsVUFBQSx1QkFBVEEsVUFBQSxDQUFXekcsS0FBSyxDQUFDLDREQUE0RCxHQUMzRUMsSUFBSSxDQUFDQyxTQUFTLENBQUNtRyxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0VBQ3JDO0VBRUEsTUFBTXpELFlBQVksR0FBRyxJQUFJTiwyQkFBWSxDQUFDO0lBQ3BDZ0QsSUFBSSxFQUFFL0csSUFBSSxDQUFDMkgsZ0JBQWdCO0lBQzNCUSxVQUFVLEVBQUVuSSxJQUFJLENBQUNvSSxzQkFBc0I7SUFDdkNySSxHQUFHO0lBQ0hzSSxPQUFPLEVBQUVySSxJQUFJLENBQUNzSSxnQkFBZ0I7SUFDOUJDLE9BQU8sRUFBRSxDQUFDLENBQUN2SSxJQUFJLENBQUN3SSxtQkFBbUI7SUFDbkNDLGFBQWEsRUFBRXpJLElBQUksQ0FBQzBJLHlCQUF5QjtJQUM3Q0MsV0FBVyxFQUFFM0ksSUFBSSxDQUFDNEksNkJBQTZCO0lBQy9DQyxRQUFRLEVBQUU3SSxJQUFJLENBQUNvRyxjQUFjO0lBQzdCMEMsbUJBQW1CLEVBQUU5SSxJQUFJLENBQUMrSSwrQkFBK0I7SUFDekRDLGlCQUFpQixFQUFFaEosSUFBSSxDQUFDaUosNkJBQTZCO0lBQ3JEbkIsT0FBTztJQUNQb0IscUJBQXFCLEVBQUUsSUFBSSxhQUFKLElBQUksd0JBQUEzQixxQkFBQSxHQUFKLElBQUksQ0FBRUgsaUNBQWlDLGNBQUFHLHFCQUFBLHVCQUF2Q0EscUJBQUEsQ0FBQXZJLElBQUEsS0FBMEM7RUFDbkUsQ0FBQyxDQUFDO0VBR0ZnQixJQUFJLENBQUN1RixhQUFhLEdBQUd2RixJQUFJLENBQUN1RixhQUFhLElBQUksQ0FBQyxDQUFDO0VBRzdDLEtBQUssTUFBTTRELEdBQUcsSUFBSTFJLGVBQUMsQ0FBQ3VFLElBQUksQ0FBQ2hGLElBQUksQ0FBQyxFQUFFO0lBQzlCLElBQUltSixHQUFHLENBQUNDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO01BQUEsSUFBQUMsVUFBQTtNQUNsQyxJQUFJLGFBQUosSUFBSSx3QkFBQUEsVUFBQSxHQUFKLElBQUksQ0FBRTdILEdBQUcsY0FBQTZILFVBQUEsdUJBQVRBLFVBQUEsQ0FBV3hFLElBQUksQ0FBRSxZQUFXc0UsR0FBSSw0REFBMkQsQ0FBQztNQUM1RjFJLGVBQUMsQ0FBQzZJLEtBQUssQ0FBQ3RKLElBQUksQ0FBQ3VGLGFBQWEsRUFBRXZGLElBQUksQ0FBQ21KLEdBQUcsQ0FBQyxDQUFDO0lBQ3hDO0VBQ0Y7RUFFQSxNQUFNSSxJQUFJLEdBQUcxSix1QkFBYyxDQUFDMkosc0JBQXNCLENBQUN4SixJQUFJLEVBQUU2RCxXQUFXLEVBQUVpRSxPQUFPLENBQUM7RUFDOUUsSUFBSSxhQUFKLElBQUksd0JBQUFOLFVBQUEsR0FBSixJQUFJLENBQUVoRyxHQUFHLGNBQUFnRyxVQUFBLHVCQUFUQSxVQUFBLENBQVcvRixLQUFLLENBQUUsb0RBQW1EOEgsSUFBSSxDQUFDaEUsYUFBYSxDQUFDMUMsY0FBZSxHQUFFLENBQUM7RUFDMUcsTUFBTXdCLFlBQVksQ0FBQ29GLEtBQUssQ0FBQ0YsSUFBSSxDQUFDO0VBQzlCLE9BQU9sRixZQUFZO0FBQ3JCLENBQUM7QUFDRCxNQUFNVCxvQkFBb0IsR0FBR3ZFLE9BQU8sQ0FBQ3VFLG9CQUFvQjtBQUFDckUsT0FBQSxDQUFBcUUsb0JBQUEsR0FBQUEsb0JBQUE7QUFHMURsRixNQUFNLENBQUN5QyxNQUFNLENBQUM3QixVQUFVLEVBQUVGLFFBQVEsRUFBRUMsT0FBTyxDQUFDO0FBQUMsSUFBQXFLLFFBQUEsR0FFOUJwSyxVQUFVO0FBQUFDLE9BQUEsQ0FBQW5CLE9BQUEsR0FBQXNMLFFBQUEifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","names":["_lodash","_interopRequireDefault","require","_appiumChromedriver","_portfinder","_bluebird","_support","_driver","_webviewHelpers","_interopRequireWildcard","_androidHelpers","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","default","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","CHROMEDRIVER_AUTODOWNLOAD_FEATURE","commands","helpers","extensions","exports","getCurrentContext","curContext","defaultContextName","getContexts","webviewsMapping","webviewHelpers","getWebViewsMapping","adb","opts","assignContexts","setContext","name","util","hasValue","WEBVIEW_WIN","defaultWebviewName","contexts","_","includes","errors","NoSuchContextError","switchContext","mobileGetContexts","androidDeviceSocket","ensureWebviewsHavePages","webviewDevtoolsPort","enableWebviewDetailsCollection","assign","isChromeSession","webviews","parseWebviewNames","NATIVE_WIN","log","debug","JSON","stringify","isChromedriverContext","startChromedriverProxy","recreateChromeDriverSessions","stopChromedriverProxies","suspendChromedriverProxy","Error","WEBVIEW_BASE","autoWebviewName","appPackage","isWebContext","context","cd","sessionChromedrivers","setupExistingChromedriver","cloneDeep","chromeUseRunningApp","extractChromeAndroidPackageFromContextName","androidPackage","match","length","chromeAndroidPackage","map","wm","webviewName","knownPackage","KNOWN_CHROME_PACKAGE_NAMES","appState","queryAppState","APP_STATE","RUNNING_IN_BACKGROUND","RUNNING_IN_FOREGROUND","info","setupNewChromedriver","curDeviceId","on","Chromedriver","EVENT_CHANGED","msg","state","STATE_STOPPED","onChromedriverStop","chromedriver","proxyReqRes","proxyReq","bind","proxyCommand","jwproxy","command","jwpProxyActive","warn","err","startUnexpectedShutdown","keys","removeAllListeners","stop","message","viewName","CHROMIUM_WIN","shouldDismissChromeWelcome","chromeOptions","isArray","args","dismissChromeWelcome","activity","getCurrentActivity","el","findElOrEls","click","ELEMENT","e","startChromeSession","knownPackages","chromeBundleId","chromeAndroidActivity","appActivity","hasWorkingWebview","restart","getChromedriverPort","portSpec","getPort","B","promisify","PortFinder","port","foundPort","potentialPort","stopPort","parseInt","isChromedriverAutodownloadEnabled","_this$log","isFeatureEnabled","_this$isChromedriverA","_this$log6","chromeDriverPort","_this$log2","chromedriverPort","_this$log3","chromedriverPorts","details","getWebviewDetails","undefined","isEmpty","_this$log4","executable","chromedriverExecutable","cmdArgs","chromedriverArgs","verbose","showChromedriverLog","executableDir","chromedriverExecutableDir","mappingPath","chromedriverChromeMappingFile","bundleId","useSystemExecutable","chromedriverUseSystemExecutable","disableBuildCheck","chromedriverDisableBuildCheck","isAutodownloadEnabled","opt","endsWith","_this$log5","merge","caps","createChromedriverCaps","start","_default"],"sources":["../../../lib/commands/context.js"],"sourcesContent":["import _ from 'lodash';\nimport Chromedriver from 'appium-chromedriver';\nimport PortFinder from 'portfinder';\nimport B from 'bluebird';\nimport { util } from '@appium/support';\nimport { errors } from 'appium/driver';\nimport {\n default as webviewHelpers,\n NATIVE_WIN, WEBVIEW_BASE, WEBVIEW_WIN, CHROMIUM_WIN, KNOWN_CHROME_PACKAGE_NAMES\n} from '../webview-helpers';\nimport { APP_STATE } from '../android-helpers';\n\nconst CHROMEDRIVER_AUTODOWNLOAD_FEATURE = 'chromedriver_autodownload';\n\nlet commands = {}, helpers = {}, extensions = {};\n\n\n/* -------------------------------\n * Actual MJSONWP command handlers\n * ------------------------------- */\ncommands.getCurrentContext = async function getCurrentContext () { // eslint-disable-line require-await\n // if the current context is `null`, indicating no context\n // explicitly set, it is the default context\n return this.curContext || this.defaultContextName();\n};\n\ncommands.getContexts = async function getContexts () {\n const webviewsMapping = await webviewHelpers.getWebViewsMapping(this.adb, this.opts);\n return this.assignContexts(webviewsMapping);\n};\n\ncommands.setContext = async function setContext (name) {\n if (!util.hasValue(name)) {\n name = this.defaultContextName();\n } else if (name === WEBVIEW_WIN) {\n // handle setContext \"WEBVIEW\"\n name = this.defaultWebviewName();\n }\n // if we're already in the context we want, do nothing\n if (name === this.curContext) {\n return;\n }\n\n const webviewsMapping = await webviewHelpers.getWebViewsMapping(this.adb, this.opts);\n const contexts = this.assignContexts(webviewsMapping);\n // if the context we want doesn't exist, fail\n if (!_.includes(contexts, name)) {\n throw new errors.NoSuchContextError();\n }\n\n await this.switchContext(name, webviewsMapping);\n this.curContext = name;\n};\n\n/**\n * @typedef {Object} WebviewsMapping\n * @property {string} proc The name of the Devtools Unix socket\n * @property {string} webview The web view alias. Looks like `WEBVIEW_`\n * prefix plus PID or package name\n * @property {?Object} info Webview information as it is retrieved by\n * /json/version CDP endpoint\n * @property {?Array<Object>} pages Webview pages list as it is retrieved by\n * /json/list CDP endpoint\n * @propery {?string} webviewName An actual webview name for switching context.\n * This value becomes null when failing to find a PID for a webview.\n *\n * The following json demonstrates the example of WebviewsMapping object.\n * Note that `description` in `page` can be an empty string most likely when it comes to Mobile Chrome)\n * {\n * \"proc\": \"@webview_devtools_remote_22138\",\n * \"webview\": \"WEBVIEW_22138\",\n * \"info\": {\n * \"Android-Package\": \"io.appium.settings\",\n * \"Browser\": \"Chrome/74.0.3729.185\",\n * \"Protocol-Version\": \"1.3\",\n * \"User-Agent\": \"Mozilla/5.0 (Linux; Android 10; Android SDK built for x86 Build/QSR1.190920.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/74.0.3729.185 Mobile Safari/537.36\",\n * \"V8-Version\": \"7.4.288.28\",\n * \"WebKit-Version\": \"537.36 (@22955682f94ce09336197bfb8dffea991fa32f0d)\",\n * \"webSocketDebuggerUrl\": \"ws://127.0.0.1:10900/devtools/browser\"\n * },\n * \"pages\": [\n * {\n * \"description\": \"{\\\"attached\\\":true,\\\"empty\\\":false,\\\"height\\\":1458,\\\"screenX\\\":0,\\\"screenY\\\":336,\\\"visible\\\":true,\\\"width\\\":1080}\",\n * \"devtoolsFrontendUrl\": \"http://chrome-devtools-frontend.appspot.com/serve_rev/@22955682f94ce09336197bfb8dffea991fa32f0d/inspector.html?ws=127.0.0.1:10900/devtools/page/27325CC50B600D31B233F45E09487B1F\",\n * \"id\": \"27325CC50B600D31B233F45E09487B1F\",\n * \"title\": \"Releases · appium/appium · GitHub\",\n * \"type\": \"page\",\n * \"url\": \"https://github.com/appium/appium/releases\",\n * \"webSocketDebuggerUrl\": \"ws://127.0.0.1:10900/devtools/page/27325CC50B600D31B233F45E09487B1F\"\n * }\n * ],\n * \"webviewName\": \"WEBVIEW_com.io.appium.setting\"\n * }\n */\n\n/**\n * Returns a webviewsMapping based on CDP endpoints\n *\n * @return {Array<WebviewsMapping>} webviewsMapping\n */\ncommands.mobileGetContexts = async function mobileGetContexts () {\n const opts = {\n androidDeviceSocket: this.opts.androidDeviceSocket,\n ensureWebviewsHavePages: true,\n webviewDevtoolsPort: this.opts.webviewDevtoolsPort,\n enableWebviewDetailsCollection: true\n };\n return await webviewHelpers.getWebViewsMapping(this.adb, opts);\n};\n\nhelpers.assignContexts = function assignContexts (webviewsMapping) {\n const opts = Object.assign({isChromeSession: this.isChromeSession}, this.opts);\n const webviews = webviewHelpers.parseWebviewNames(webviewsMapping, opts);\n this.contexts = [NATIVE_WIN, ...webviews];\n this.log.debug(`Available contexts: ${JSON.stringify(this.contexts)}`);\n return this.contexts;\n};\n\nhelpers.switchContext = async function switchContext (name, webviewsMapping) {\n // We have some options when it comes to webviews. If we want a\n // Chromedriver webview, we can only control one at a time.\n if (this.isChromedriverContext(name)) {\n // start proxying commands directly to chromedriver\n await this.startChromedriverProxy(name, webviewsMapping);\n } else if (this.isChromedriverContext(this.curContext)) {\n // if we're moving to a non-chromedriver webview, and our current context\n // _is_ a chromedriver webview, if caps recreateChromeDriverSessions is set\n // to true then kill chromedriver session using stopChromedriverProxies or\n // else simply suspend proxying to the latter\n if (this.opts.recreateChromeDriverSessions) {\n this.log.debug('recreateChromeDriverSessions set to true; killing existing chromedrivers');\n await this.stopChromedriverProxies();\n } else {\n await this.suspendChromedriverProxy();\n }\n } else {\n throw new Error(`Didn't know how to handle switching to context '${name}'`);\n }\n};\n\n\n/* ---------------------------------\n * On-object context-related helpers\n * --------------------------------- */\n\n// The reason this is a function and not just a constant is that both android-\n// driver and selendroid-driver use this logic, and each one returns\n// a different default context name\nhelpers.defaultContextName = function defaultContextName () {\n return NATIVE_WIN;\n};\n\nhelpers.defaultWebviewName = function defaultWebviewName () {\n return WEBVIEW_BASE + (this.opts.autoWebviewName || this.opts.appPackage);\n};\n\nhelpers.isWebContext = function isWebContext () {\n return this.curContext !== null && this.curContext !== NATIVE_WIN;\n};\n\n// Turn on proxying to an existing Chromedriver session or a new one\nhelpers.startChromedriverProxy = async function startChromedriverProxy (context, webviewsMapping) {\n this.log.debug(`Connecting to chrome-backed webview context '${context}'`);\n\n let cd;\n if (this.sessionChromedrivers[context]) {\n // in the case where we've already set up a chromedriver for a context,\n // we want to reconnect to it, not create a whole new one\n this.log.debug(`Found existing Chromedriver for context '${context}'. Using it.`);\n cd = this.sessionChromedrivers[context];\n await setupExistingChromedriver(this.log, cd);\n } else {\n let opts = _.cloneDeep(this.opts);\n opts.chromeUseRunningApp = true;\n\n // if requested, tell chromedriver to attach to the android package we have\n // associated with the context name, rather than the package of the AUT.\n // And turn this on by default for chrome--if chrome pops up with a webview\n // and someone wants to switch to it, we should let chromedriver connect to\n // chrome rather than staying stuck on the AUT\n if (opts.extractChromeAndroidPackageFromContextName || context === `${WEBVIEW_BASE}chrome`) {\n let androidPackage = context.match(`${WEBVIEW_BASE}(.+)`);\n if (androidPackage && androidPackage.length > 0) {\n opts.chromeAndroidPackage = androidPackage[1];\n }\n if (!opts.extractChromeAndroidPackageFromContextName) {\n if (_.has(this.opts, 'enableWebviewDetailsCollection') && !this.opts.enableWebviewDetailsCollection) {\n // When enableWebviewDetailsCollection capability is explicitly disabled, try to identify\n // chromeAndroidPackage based on contexts, known chrome variant packages and queryAppState result\n // since webviewsMapping does not have info object\n const contexts = webviewsMapping.map((wm) => wm.webviewName);\n for (const knownPackage of KNOWN_CHROME_PACKAGE_NAMES) {\n if (_.includes(contexts, `${WEBVIEW_BASE}${knownPackage}`)) {\n continue;\n }\n const appState = await this.queryAppState(knownPackage);\n if (_.includes([APP_STATE.RUNNING_IN_BACKGROUND, APP_STATE.RUNNING_IN_FOREGROUND], appState)) {\n opts.chromeAndroidPackage = knownPackage;\n this.log.debug(`Identified chromeAndroidPackage as '${opts.chromeAndroidPackage}' ` +\n `for context '${context}' by querying states of Chrome app packages`);\n break;\n }\n }\n } else {\n for (const wm of webviewsMapping) {\n if (wm.webviewName === context && _.has(wm?.info, 'Android-Package')) {\n opts.chromeAndroidPackage = wm.info['Android-Package'];\n this.log.debug(`Identified chromeAndroidPackage as '${opts.chromeAndroidPackage}' ` +\n `for context '${context}' by CDP`);\n break;\n }\n }\n }\n }\n }\n\n cd = await this.setupNewChromedriver(opts, this.adb.curDeviceId, this.adb, context);\n // bind our stop/exit handler, passing in context so we know which\n // one stopped unexpectedly\n cd.on(Chromedriver.EVENT_CHANGED, (msg) => {\n if (msg.state === Chromedriver.STATE_STOPPED) {\n this.onChromedriverStop(context);\n }\n });\n // save the chromedriver object under the context\n this.sessionChromedrivers[context] = cd;\n }\n // hook up the local variables so we can proxy this biz\n this.chromedriver = cd;\n this.proxyReqRes = this.chromedriver.proxyReq.bind(this.chromedriver);\n this.proxyCommand = this.chromedriver.jwproxy.command.bind(this.chromedriver.jwproxy);\n this.jwpProxyActive = true;\n};\n\n// Stop proxying to any Chromedriver\nhelpers.suspendChromedriverProxy = function suspendChromedriverProxy () {\n this.chromedriver = null;\n this.proxyReqRes = null;\n this.proxyCommand = null;\n this.jwpProxyActive = false;\n};\n\n// Handle an out-of-band Chromedriver stop event\nhelpers.onChromedriverStop = async function onChromedriverStop (context) {\n this.log.warn(`Chromedriver for context ${context} stopped unexpectedly`);\n if (context === this.curContext) {\n // we exited unexpectedly while automating the current context and so want\n // to shut down the session and respond with an error\n let err = new Error('Chromedriver quit unexpectedly during session');\n await this.startUnexpectedShutdown(err);\n } else {\n // if a Chromedriver in the non-active context barfs, we don't really\n // care, we'll just make a new one next time we need the context.\n this.log.warn(\"Chromedriver quit unexpectedly, but it wasn't the active \" +\n 'context, ignoring');\n delete this.sessionChromedrivers[context];\n }\n};\n\n// Intentionally stop all the chromedrivers currently active, and ignore\n// their exit events\nhelpers.stopChromedriverProxies = async function stopChromedriverProxies () {\n this.suspendChromedriverProxy(); // make sure we turn off the proxy flag\n for (let context of _.keys(this.sessionChromedrivers)) {\n let cd = this.sessionChromedrivers[context];\n this.log.debug(`Stopping chromedriver for context ${context}`);\n // stop listening for the stopped state event\n cd.removeAllListeners(Chromedriver.EVENT_CHANGED);\n try {\n await cd.stop();\n } catch (err) {\n this.log.warn(`Error stopping Chromedriver: ${err.message}`);\n }\n delete this.sessionChromedrivers[context];\n }\n};\n\nhelpers.isChromedriverContext = function isChromedriverContext (viewName) {\n return _.includes(viewName, WEBVIEW_WIN) || viewName === CHROMIUM_WIN;\n};\n\nhelpers.shouldDismissChromeWelcome = function shouldDismissChromeWelcome () {\n return !!this.opts.chromeOptions &&\n _.isArray(this.opts.chromeOptions.args) &&\n this.opts.chromeOptions.args.includes('--no-first-run');\n};\n\nhelpers.dismissChromeWelcome = async function dismissChromeWelcome () {\n this.log.info('Trying to dismiss Chrome welcome');\n let activity = await this.getCurrentActivity();\n if (activity !== 'org.chromium.chrome.browser.firstrun.FirstRunActivity') {\n this.log.info('Chrome welcome dialog never showed up! Continuing');\n return;\n }\n let el = await this.findElOrEls('id', 'com.android.chrome:id/terms_accept', false);\n await this.click(el.ELEMENT);\n try {\n let el = await this.findElOrEls('id', 'com.android.chrome:id/negative_button', false);\n await this.click(el.ELEMENT);\n } catch (e) {\n // DO NOTHING, THIS DEVICE DIDNT LAUNCH THE SIGNIN DIALOG\n // IT MUST BE A NON GMS DEVICE\n this.log.warn(`This device did not show Chrome SignIn dialog, ${e.message}`);\n }\n};\n\nhelpers.startChromeSession = async function startChromeSession () {\n this.log.info('Starting a chrome-based browser session');\n let opts = _.cloneDeep(this.opts);\n\n const knownPackages = [\n 'org.chromium.chrome.shell',\n 'com.android.chrome',\n 'com.chrome.beta',\n 'org.chromium.chrome',\n 'org.chromium.webview_shell',\n ];\n\n if (_.includes(knownPackages, this.opts.appPackage)) {\n opts.chromeBundleId = this.opts.appPackage;\n } else {\n opts.chromeAndroidActivity = this.opts.appActivity;\n }\n this.chromedriver = await this.setupNewChromedriver(opts, this.adb.curDeviceId, this.adb);\n this.chromedriver.on(Chromedriver.EVENT_CHANGED, (msg) => {\n if (msg.state === Chromedriver.STATE_STOPPED) {\n this.onChromedriverStop(CHROMIUM_WIN);\n }\n });\n\n // Now that we have a Chrome session, we ensure that the context is\n // appropriately set and that this chromedriver is added to the list\n // of session chromedrivers so we can switch back and forth\n this.curContext = CHROMIUM_WIN;\n this.sessionChromedrivers[CHROMIUM_WIN] = this.chromedriver;\n this.proxyReqRes = this.chromedriver.proxyReq.bind(this.chromedriver);\n this.proxyCommand = this.chromedriver.jwproxy.command.bind(this.chromedriver.jwproxy);\n this.jwpProxyActive = true;\n\n if (this.shouldDismissChromeWelcome()) {\n // dismiss Chrome welcome dialog\n await this.dismissChromeWelcome();\n }\n};\n\n\n/* --------------------------\n * Internal library functions\n * -------------------------- */\n\nasync function setupExistingChromedriver (log, chromedriver) {\n // check the status by sending a simple window-based command to ChromeDriver\n // if there is an error, we want to recreate the ChromeDriver session\n if (!await chromedriver.hasWorkingWebview()) {\n log.debug('ChromeDriver is not associated with a window. ' +\n 'Re-initializing the session.');\n await chromedriver.restart();\n }\n return chromedriver;\n}\n\n/**\n * Find a free port to have Chromedriver listen on.\n *\n * @param {array} portSpec - Array which is a list of ports. A list item may\n * also itself be an array of length 2 specifying a start and end port of\n * a range. Some valid port specs:\n * - [8000, 8001, 8002]\n * - [[8000, 8005]]\n * - [8000, [9000, 9100]]\n * @param {Object?} log Logger instance\n *\n * @return {number} A free port\n */\nasync function getChromedriverPort (portSpec, log = null) {\n const getPort = B.promisify(PortFinder.getPort, {context: PortFinder});\n\n // if the user didn't give us any specific information about chromedriver\n // port ranges, just find any free port\n if (!portSpec) {\n const port = await getPort();\n log?.debug(`A port was not given, using random free port: ${port}`);\n return port;\n }\n\n // otherwise find the free port based on a list or range provided by the user\n log?.debug(`Finding a free port for chromedriver using spec ${JSON.stringify(portSpec)}`);\n let foundPort = null;\n for (const potentialPort of portSpec) {\n let port, stopPort;\n if (_.isArray(potentialPort)) {\n ([port, stopPort] = potentialPort);\n } else {\n port = parseInt(potentialPort, 10); // ensure we have a number and not a string\n stopPort = port;\n }\n try {\n log?.debug(`Checking port range ${port}:${stopPort}`);\n foundPort = await getPort({port, stopPort});\n break;\n } catch (e) {\n log?.debug(`Nothing in port range ${port}:${stopPort} was available`);\n }\n }\n\n if (foundPort === null) {\n throw new Error(`Could not find a free port for chromedriver using ` +\n `chromedriverPorts spec ${JSON.stringify(portSpec)}`);\n }\n\n log?.debug(`Using free port ${foundPort} for chromedriver`);\n return foundPort;\n}\n\nhelpers.isChromedriverAutodownloadEnabled = function isChromedriverAutodownloadEnabled () {\n if (this.isFeatureEnabled(CHROMEDRIVER_AUTODOWNLOAD_FEATURE)) {\n return true;\n }\n this?.log?.debug(`Automated Chromedriver download is disabled. ` +\n `Use '${CHROMEDRIVER_AUTODOWNLOAD_FEATURE}' server feature to enable it`);\n return false;\n};\n\nhelpers.setupNewChromedriver = async function setupNewChromedriver (opts, curDeviceId, adb, context = null) {\n if (opts.chromeDriverPort) {\n this?.log?.warn(`The 'chromeDriverPort' capability is deprecated. Please use 'chromedriverPort' instead`);\n opts.chromedriverPort = opts.chromeDriverPort;\n }\n\n if (opts.chromedriverPort) {\n this?.log?.debug(`Using user-specified port ${opts.chromedriverPort} for chromedriver`);\n } else {\n // if a single port wasn't given, we'll look for a free one\n opts.chromedriverPort = await getChromedriverPort(opts.chromedriverPorts, this?.log);\n }\n\n const details = context ? webviewHelpers.getWebviewDetails(adb, context) : undefined;\n if (!_.isEmpty(details)) {\n this?.log?.debug('Passing web view details to the Chromedriver constructor: ' +\n JSON.stringify(details, null, 2));\n }\n\n const chromedriver = new Chromedriver({\n port: opts.chromedriverPort,\n executable: opts.chromedriverExecutable,\n adb,\n cmdArgs: opts.chromedriverArgs,\n verbose: !!opts.showChromedriverLog,\n executableDir: opts.chromedriverExecutableDir,\n mappingPath: opts.chromedriverChromeMappingFile,\n bundleId: opts.chromeBundleId,\n useSystemExecutable: opts.chromedriverUseSystemExecutable,\n disableBuildCheck: opts.chromedriverDisableBuildCheck,\n details,\n isAutodownloadEnabled: this?.isChromedriverAutodownloadEnabled?.()\n });\n\n // make sure there are chromeOptions\n opts.chromeOptions = opts.chromeOptions || {};\n // try out any prefixed chromeOptions,\n // and strip the prefix\n for (const opt of _.keys(opts)) {\n if (opt.endsWith(':chromeOptions')) {\n this?.log?.warn(`Merging '${opt}' into 'chromeOptions'. This may cause unexpected behavior`);\n _.merge(opts.chromeOptions, opts[opt]);\n }\n }\n\n const caps = webviewHelpers.createChromedriverCaps(opts, curDeviceId, details);\n this?.log?.debug(`Before starting chromedriver, androidPackage is '${caps.chromeOptions.androidPackage}'`);\n await chromedriver.start(caps);\n return chromedriver;\n};\nconst setupNewChromedriver = helpers.setupNewChromedriver;\n\n\nObject.assign(extensions, commands, helpers);\nexport { commands, helpers, setupNewChromedriver };\nexport default extensions;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"context.js","names":["_lodash","_interopRequireDefault","require","_appiumChromedriver","_portfinder","_bluebird","_support","_driver","_webviewHelpers","_interopRequireWildcard","_androidHelpers","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","default","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","CHROMEDRIVER_AUTODOWNLOAD_FEATURE","commands","helpers","extensions","exports","getCurrentContext","curContext","defaultContextName","getContexts","webviewsMapping","webviewHelpers","getWebViewsMapping","adb","opts","assignContexts","setContext","name","util","hasValue","WEBVIEW_WIN","defaultWebviewName","contexts","_","includes","errors","NoSuchContextError","switchContext","mobileGetContexts","androidDeviceSocket","ensureWebviewsHavePages","webviewDevtoolsPort","enableWebviewDetailsCollection","assign","isChromeSession","webviews","parseWebviewNames","NATIVE_WIN","log","debug","JSON","stringify","isChromedriverContext","startChromedriverProxy","recreateChromeDriverSessions","stopChromedriverProxies","suspendChromedriverProxy","Error","WEBVIEW_BASE","autoWebviewName","appPackage","isWebContext","context","cd","sessionChromedrivers","setupExistingChromedriver","cloneDeep","chromeUseRunningApp","extractChromeAndroidPackageFromContextName","androidPackage","match","length","chromeAndroidPackage","map","wm","webviewName","knownPackage","KNOWN_CHROME_PACKAGE_NAMES","appState","queryAppState","APP_STATE","RUNNING_IN_BACKGROUND","RUNNING_IN_FOREGROUND","info","setupNewChromedriver","curDeviceId","on","Chromedriver","EVENT_CHANGED","msg","state","STATE_STOPPED","onChromedriverStop","chromedriver","proxyReqRes","proxyReq","bind","proxyCommand","jwproxy","command","jwpProxyActive","warn","err","startUnexpectedShutdown","keys","removeAllListeners","stop","message","viewName","CHROMIUM_WIN","shouldDismissChromeWelcome","chromeOptions","isArray","args","dismissChromeWelcome","activity","getCurrentActivity","el","findElOrEls","click","ELEMENT","e","startChromeSession","knownPackages","chromeBundleId","chromeAndroidActivity","appActivity","hasWorkingWebview","restart","getChromedriverPort","portSpec","getPort","B","promisify","PortFinder","port","foundPort","potentialPort","stopPort","parseInt","isChromedriverAutodownloadEnabled","_this$log","isFeatureEnabled","_this$isChromedriverA","_this$log6","chromeDriverPort","_this$log2","chromedriverPort","_this$log3","chromedriverPorts","details","getWebviewDetails","undefined","isEmpty","_this$log4","executable","chromedriverExecutable","cmdArgs","chromedriverArgs","verbose","showChromedriverLog","executableDir","chromedriverExecutableDir","mappingPath","chromedriverChromeMappingFile","bundleId","useSystemExecutable","chromedriverUseSystemExecutable","disableBuildCheck","chromedriverDisableBuildCheck","isAutodownloadEnabled","opt","endsWith","_this$log5","merge","caps","createChromedriverCaps","start","_default"],"sources":["../../../lib/commands/context.js"],"sourcesContent":["import _ from 'lodash';\nimport Chromedriver from 'appium-chromedriver';\nimport PortFinder from 'portfinder';\nimport B from 'bluebird';\nimport { util } from '@appium/support';\nimport { errors } from 'appium/driver';\nimport {\n default as webviewHelpers,\n NATIVE_WIN, WEBVIEW_BASE, WEBVIEW_WIN, CHROMIUM_WIN, KNOWN_CHROME_PACKAGE_NAMES\n} from '../webview-helpers';\nimport { APP_STATE } from '../android-helpers';\n\nconst CHROMEDRIVER_AUTODOWNLOAD_FEATURE = 'chromedriver_autodownload';\n\nlet commands = {}, helpers = {}, extensions = {};\n\n\n/* -------------------------------\n * Actual MJSONWP command handlers\n * ------------------------------- */\ncommands.getCurrentContext = async function getCurrentContext () { // eslint-disable-line require-await\n // if the current context is `null`, indicating no context\n // explicitly set, it is the default context\n return this.curContext || this.defaultContextName();\n};\n\ncommands.getContexts = async function getContexts () {\n const webviewsMapping = await webviewHelpers.getWebViewsMapping(this.adb, this.opts);\n return this.assignContexts(webviewsMapping);\n};\n\ncommands.setContext = async function setContext (name) {\n if (!util.hasValue(name)) {\n name = this.defaultContextName();\n } else if (name === WEBVIEW_WIN) {\n // handle setContext \"WEBVIEW\"\n name = this.defaultWebviewName();\n }\n // if we're already in the context we want, do nothing\n if (name === this.curContext) {\n return;\n }\n\n const webviewsMapping = await webviewHelpers.getWebViewsMapping(this.adb, this.opts);\n const contexts = this.assignContexts(webviewsMapping);\n // if the context we want doesn't exist, fail\n if (!_.includes(contexts, name)) {\n throw new errors.NoSuchContextError();\n }\n\n await this.switchContext(name, webviewsMapping);\n this.curContext = name;\n};\n\n/**\n * @typedef {Object} WebviewsMapping\n * @property {string} proc The name of the Devtools Unix socket\n * @property {string} webview The web view alias. Looks like `WEBVIEW_`\n * prefix plus PID or package name\n * @property {?Object} info Webview information as it is retrieved by\n * /json/version CDP endpoint\n * @property {?Array<Object>} pages Webview pages list as it is retrieved by\n * /json/list CDP endpoint\n * @propery {?string} webviewName An actual webview name for switching context.\n * This value becomes null when failing to find a PID for a webview.\n *\n * The following json demonstrates the example of WebviewsMapping object.\n * Note that `description` in `page` can be an empty string most likely when it comes to Mobile Chrome)\n * {\n * \"proc\": \"@webview_devtools_remote_22138\",\n * \"webview\": \"WEBVIEW_22138\",\n * \"info\": {\n * \"Android-Package\": \"io.appium.settings\",\n * \"Browser\": \"Chrome/74.0.3729.185\",\n * \"Protocol-Version\": \"1.3\",\n * \"User-Agent\": \"Mozilla/5.0 (Linux; Android 10; Android SDK built for x86 Build/QSR1.190920.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/74.0.3729.185 Mobile Safari/537.36\",\n * \"V8-Version\": \"7.4.288.28\",\n * \"WebKit-Version\": \"537.36 (@22955682f94ce09336197bfb8dffea991fa32f0d)\",\n * \"webSocketDebuggerUrl\": \"ws://127.0.0.1:10900/devtools/browser\"\n * },\n * \"pages\": [\n * {\n * \"description\": \"{\\\"attached\\\":true,\\\"empty\\\":false,\\\"height\\\":1458,\\\"screenX\\\":0,\\\"screenY\\\":336,\\\"visible\\\":true,\\\"width\\\":1080}\",\n * \"devtoolsFrontendUrl\": \"http://chrome-devtools-frontend.appspot.com/serve_rev/@22955682f94ce09336197bfb8dffea991fa32f0d/inspector.html?ws=127.0.0.1:10900/devtools/page/27325CC50B600D31B233F45E09487B1F\",\n * \"id\": \"27325CC50B600D31B233F45E09487B1F\",\n * \"title\": \"Releases · appium/appium · GitHub\",\n * \"type\": \"page\",\n * \"url\": \"https://github.com/appium/appium/releases\",\n * \"webSocketDebuggerUrl\": \"ws://127.0.0.1:10900/devtools/page/27325CC50B600D31B233F45E09487B1F\"\n * }\n * ],\n * \"webviewName\": \"WEBVIEW_com.io.appium.setting\"\n * }\n */\n\n/**\n * Returns a webviewsMapping based on CDP endpoints\n *\n * @return {Array<WebviewsMapping>} webviewsMapping\n */\ncommands.mobileGetContexts = async function mobileGetContexts () {\n const opts = {\n androidDeviceSocket: this.opts.androidDeviceSocket,\n ensureWebviewsHavePages: true,\n webviewDevtoolsPort: this.opts.webviewDevtoolsPort,\n enableWebviewDetailsCollection: true\n };\n return await webviewHelpers.getWebViewsMapping(this.adb, opts);\n};\n\nhelpers.assignContexts = function assignContexts (webviewsMapping) {\n const opts = Object.assign({isChromeSession: this.isChromeSession}, this.opts);\n const webviews = webviewHelpers.parseWebviewNames(webviewsMapping, opts);\n this.contexts = [NATIVE_WIN, ...webviews];\n this.log.debug(`Available contexts: ${JSON.stringify(this.contexts)}`);\n return this.contexts;\n};\n\nhelpers.switchContext = async function switchContext (name, webviewsMapping) {\n // We have some options when it comes to webviews. If we want a\n // Chromedriver webview, we can only control one at a time.\n if (this.isChromedriverContext(name)) {\n // start proxying commands directly to chromedriver\n await this.startChromedriverProxy(name, webviewsMapping);\n } else if (this.isChromedriverContext(this.curContext)) {\n // if we're moving to a non-chromedriver webview, and our current context\n // _is_ a chromedriver webview, if caps recreateChromeDriverSessions is set\n // to true then kill chromedriver session using stopChromedriverProxies or\n // else simply suspend proxying to the latter\n if (this.opts.recreateChromeDriverSessions) {\n this.log.debug('recreateChromeDriverSessions set to true; killing existing chromedrivers');\n await this.stopChromedriverProxies();\n } else {\n await this.suspendChromedriverProxy();\n }\n } else {\n throw new Error(`Didn't know how to handle switching to context '${name}'`);\n }\n};\n\n\n/* ---------------------------------\n * On-object context-related helpers\n * --------------------------------- */\n\n// The reason this is a function and not just a constant is that both android-\n// driver and selendroid-driver use this logic, and each one returns\n// a different default context name\nhelpers.defaultContextName = function defaultContextName () {\n return NATIVE_WIN;\n};\n\nhelpers.defaultWebviewName = function defaultWebviewName () {\n return WEBVIEW_BASE + (this.opts.autoWebviewName || this.opts.appPackage);\n};\n\nhelpers.isWebContext = function isWebContext () {\n return this.curContext !== null && this.curContext !== NATIVE_WIN;\n};\n\n// Turn on proxying to an existing Chromedriver session or a new one\nhelpers.startChromedriverProxy = async function startChromedriverProxy (context, webviewsMapping) {\n this.log.debug(`Connecting to chrome-backed webview context '${context}'`);\n\n let cd;\n if (this.sessionChromedrivers[context]) {\n // in the case where we've already set up a chromedriver for a context,\n // we want to reconnect to it, not create a whole new one\n this.log.debug(`Found existing Chromedriver for context '${context}'. Using it.`);\n cd = this.sessionChromedrivers[context];\n await setupExistingChromedriver(this.log, cd);\n } else {\n let opts = _.cloneDeep(this.opts);\n opts.chromeUseRunningApp = true;\n\n // if requested, tell chromedriver to attach to the android package we have\n // associated with the context name, rather than the package of the AUT.\n // And turn this on by default for chrome--if chrome pops up with a webview\n // and someone wants to switch to it, we should let chromedriver connect to\n // chrome rather than staying stuck on the AUT\n if (opts.extractChromeAndroidPackageFromContextName || context === `${WEBVIEW_BASE}chrome`) {\n let androidPackage = context.match(`${WEBVIEW_BASE}(.+)`);\n if (androidPackage && androidPackage.length > 0) {\n opts.chromeAndroidPackage = androidPackage[1];\n }\n if (!opts.extractChromeAndroidPackageFromContextName) {\n if (_.has(this.opts, 'enableWebviewDetailsCollection') && !this.opts.enableWebviewDetailsCollection) {\n // When enableWebviewDetailsCollection capability is explicitly disabled, try to identify\n // chromeAndroidPackage based on contexts, known chrome variant packages and queryAppState result\n // since webviewsMapping does not have info object\n const contexts = webviewsMapping.map((wm) => wm.webviewName);\n for (const knownPackage of KNOWN_CHROME_PACKAGE_NAMES) {\n if (_.includes(contexts, `${WEBVIEW_BASE}${knownPackage}`)) {\n continue;\n }\n const appState = await this.queryAppState(knownPackage);\n if (_.includes([APP_STATE.RUNNING_IN_BACKGROUND, APP_STATE.RUNNING_IN_FOREGROUND], appState)) {\n opts.chromeAndroidPackage = knownPackage;\n this.log.debug(`Identified chromeAndroidPackage as '${opts.chromeAndroidPackage}' ` +\n `for context '${context}' by querying states of Chrome app packages`);\n break;\n }\n }\n } else {\n for (const wm of webviewsMapping) {\n if (wm.webviewName === context && _.has(wm?.info, 'Android-Package')) {\n opts.chromeAndroidPackage = wm.info['Android-Package'];\n this.log.debug(`Identified chromeAndroidPackage as '${opts.chromeAndroidPackage}' ` +\n `for context '${context}' by CDP`);\n break;\n }\n }\n }\n }\n }\n\n cd = await this.setupNewChromedriver(opts, this.adb.curDeviceId, this.adb, context);\n // bind our stop/exit handler, passing in context so we know which\n // one stopped unexpectedly\n cd.on(Chromedriver.EVENT_CHANGED, (msg) => {\n if (msg.state === Chromedriver.STATE_STOPPED) {\n this.onChromedriverStop(context);\n }\n });\n // save the chromedriver object under the context\n this.sessionChromedrivers[context] = cd;\n }\n // hook up the local variables so we can proxy this biz\n this.chromedriver = cd;\n this.proxyReqRes = this.chromedriver.proxyReq.bind(this.chromedriver);\n this.proxyCommand = this.chromedriver.jwproxy.command.bind(this.chromedriver.jwproxy);\n this.jwpProxyActive = true;\n};\n\n// Stop proxying to any Chromedriver\nhelpers.suspendChromedriverProxy = function suspendChromedriverProxy () {\n this.chromedriver = null;\n this.proxyReqRes = null;\n this.proxyCommand = null;\n this.jwpProxyActive = false;\n};\n\n// Handle an out-of-band Chromedriver stop event\nhelpers.onChromedriverStop = async function onChromedriverStop (context) {\n this.log.warn(`Chromedriver for context ${context} stopped unexpectedly`);\n if (context === this.curContext) {\n // we exited unexpectedly while automating the current context and so want\n // to shut down the session and respond with an error\n let err = new Error('Chromedriver quit unexpectedly during session');\n await this.startUnexpectedShutdown(err);\n } else {\n // if a Chromedriver in the non-active context barfs, we don't really\n // care, we'll just make a new one next time we need the context.\n this.log.warn(\"Chromedriver quit unexpectedly, but it wasn't the active \" +\n 'context, ignoring');\n delete this.sessionChromedrivers[context];\n }\n};\n\n// Intentionally stop all the chromedrivers currently active, and ignore\n// their exit events\nhelpers.stopChromedriverProxies = async function stopChromedriverProxies () {\n this.suspendChromedriverProxy(); // make sure we turn off the proxy flag\n for (let context of _.keys(this.sessionChromedrivers)) {\n let cd = this.sessionChromedrivers[context];\n this.log.debug(`Stopping chromedriver for context ${context}`);\n // stop listening for the stopped state event\n cd.removeAllListeners(Chromedriver.EVENT_CHANGED);\n try {\n await cd.stop();\n } catch (err) {\n this.log.warn(`Error stopping Chromedriver: ${err.message}`);\n }\n delete this.sessionChromedrivers[context];\n }\n};\n\nhelpers.isChromedriverContext = function isChromedriverContext (viewName) {\n return _.includes(viewName, WEBVIEW_WIN) || viewName === CHROMIUM_WIN;\n};\n\nhelpers.shouldDismissChromeWelcome = function shouldDismissChromeWelcome () {\n return !!this.opts.chromeOptions &&\n _.isArray(this.opts.chromeOptions.args) &&\n this.opts.chromeOptions.args.includes('--no-first-run');\n};\n\nhelpers.dismissChromeWelcome = async function dismissChromeWelcome () {\n this.log.info('Trying to dismiss Chrome welcome');\n let activity = await this.getCurrentActivity();\n if (activity !== 'org.chromium.chrome.browser.firstrun.FirstRunActivity') {\n this.log.info('Chrome welcome dialog never showed up! Continuing');\n return;\n }\n let el = await this.findElOrEls('id', 'com.android.chrome:id/terms_accept', false);\n await this.click(el.ELEMENT);\n try {\n let el = await this.findElOrEls('id', 'com.android.chrome:id/negative_button', false);\n await this.click(el.ELEMENT);\n } catch (e) {\n // DO NOTHING, THIS DEVICE DIDNT LAUNCH THE SIGNIN DIALOG\n // IT MUST BE A NON GMS DEVICE\n this.log.warn(`This device did not show Chrome SignIn dialog, ${e.message}`);\n }\n};\n\nhelpers.startChromeSession = async function startChromeSession () {\n this.log.info('Starting a chrome-based browser session');\n let opts = _.cloneDeep(this.opts);\n\n const knownPackages = [\n 'org.chromium.chrome.shell',\n 'com.android.chrome',\n 'com.chrome.beta',\n 'org.chromium.chrome',\n 'org.chromium.webview_shell',\n ];\n\n if (_.includes(knownPackages, this.opts.appPackage)) {\n opts.chromeBundleId = this.opts.appPackage;\n } else {\n opts.chromeAndroidActivity = this.opts.appActivity;\n }\n this.chromedriver = await this.setupNewChromedriver(opts, this.adb.curDeviceId, this.adb);\n this.chromedriver.on(Chromedriver.EVENT_CHANGED, (msg) => {\n if (msg.state === Chromedriver.STATE_STOPPED) {\n this.onChromedriverStop(CHROMIUM_WIN);\n }\n });\n\n // Now that we have a Chrome session, we ensure that the context is\n // appropriately set and that this chromedriver is added to the list\n // of session chromedrivers so we can switch back and forth\n this.curContext = CHROMIUM_WIN;\n this.sessionChromedrivers[CHROMIUM_WIN] = this.chromedriver;\n this.proxyReqRes = this.chromedriver.proxyReq.bind(this.chromedriver);\n this.proxyCommand = this.chromedriver.jwproxy.command.bind(this.chromedriver.jwproxy);\n this.jwpProxyActive = true;\n\n if (this.shouldDismissChromeWelcome()) {\n // dismiss Chrome welcome dialog\n await this.dismissChromeWelcome();\n }\n};\n\n\n/* --------------------------\n * Internal library functions\n * -------------------------- */\n\nasync function setupExistingChromedriver (log, chromedriver) {\n // check the status by sending a simple window-based command to ChromeDriver\n // if there is an error, we want to recreate the ChromeDriver session\n if (!await chromedriver.hasWorkingWebview()) {\n log.debug('ChromeDriver is not associated with a window. ' +\n 'Re-initializing the session.');\n await chromedriver.restart();\n }\n return chromedriver;\n}\n\n/**\n * Find a free port to have Chromedriver listen on.\n *\n * @param {array} portSpec - Array which is a list of ports. A list item may\n * also itself be an array of length 2 specifying a start and end port of\n * a range. Some valid port specs:\n * - [8000, 8001, 8002]\n * - [[8000, 8005]]\n * - [8000, [9000, 9100]]\n * @param {Object?} log Logger instance\n *\n * @return {number} A free port\n */\nasync function getChromedriverPort (portSpec, log = null) {\n const getPort = B.promisify(PortFinder.getPort, {context: PortFinder});\n\n // if the user didn't give us any specific information about chromedriver\n // port ranges, just find any free port\n if (!portSpec) {\n const port = await getPort();\n log?.debug(`A port was not given, using random free port: ${port}`);\n return port;\n }\n\n // otherwise find the free port based on a list or range provided by the user\n log?.debug(`Finding a free port for chromedriver using spec ${JSON.stringify(portSpec)}`);\n let foundPort = null;\n for (const potentialPort of portSpec) {\n let port, stopPort;\n if (_.isArray(potentialPort)) {\n ([port, stopPort] = potentialPort);\n } else {\n port = parseInt(potentialPort, 10); // ensure we have a number and not a string\n stopPort = port;\n }\n try {\n log?.debug(`Checking port range ${port}:${stopPort}`);\n foundPort = await getPort({port, stopPort});\n break;\n } catch (e) {\n log?.debug(`Nothing in port range ${port}:${stopPort} was available`);\n }\n }\n\n if (foundPort === null) {\n throw new Error(`Could not find a free port for chromedriver using ` +\n `chromedriverPorts spec ${JSON.stringify(portSpec)}`);\n }\n\n log?.debug(`Using free port ${foundPort} for chromedriver`);\n return foundPort;\n}\n\nhelpers.isChromedriverAutodownloadEnabled = function isChromedriverAutodownloadEnabled () {\n if (this.isFeatureEnabled(CHROMEDRIVER_AUTODOWNLOAD_FEATURE)) {\n return true;\n }\n this?.log?.debug(`Automated Chromedriver download is disabled. ` +\n `Use '${CHROMEDRIVER_AUTODOWNLOAD_FEATURE}' server feature to enable it`);\n return false;\n};\n\nhelpers.setupNewChromedriver = async function setupNewChromedriver (opts, curDeviceId, adb, context = null) {\n if (opts.chromeDriverPort) {\n this?.log?.warn(`The 'chromeDriverPort' capability is deprecated. Please use 'chromedriverPort' instead`);\n opts.chromedriverPort = opts.chromeDriverPort;\n }\n\n if (opts.chromedriverPort) {\n this?.log?.debug(`Using user-specified port ${opts.chromedriverPort} for chromedriver`);\n } else {\n // if a single port wasn't given, we'll look for a free one\n opts.chromedriverPort = await getChromedriverPort(opts.chromedriverPorts, this?.log);\n }\n\n const details = context ? webviewHelpers.getWebviewDetails(adb, context) : undefined;\n if (!_.isEmpty(details)) {\n this?.log?.debug('Passing web view details to the Chromedriver constructor: ' +\n JSON.stringify(details, null, 2));\n }\n\n const chromedriver = new Chromedriver({\n port: opts.chromedriverPort,\n executable: opts.chromedriverExecutable,\n adb,\n cmdArgs: opts.chromedriverArgs,\n verbose: !!opts.showChromedriverLog,\n executableDir: opts.chromedriverExecutableDir,\n mappingPath: opts.chromedriverChromeMappingFile,\n bundleId: opts.chromeBundleId,\n useSystemExecutable: opts.chromedriverUseSystemExecutable,\n disableBuildCheck: opts.chromedriverDisableBuildCheck,\n details,\n isAutodownloadEnabled: this?.isChromedriverAutodownloadEnabled?.()\n });\n\n // make sure there are chromeOptions\n opts.chromeOptions = opts.chromeOptions || {};\n // try out any prefixed chromeOptions,\n // and strip the prefix\n for (const opt of _.keys(opts)) {\n if (opt.endsWith(':chromeOptions')) {\n this?.log?.warn(`Merging '${opt}' into 'chromeOptions'. This may cause unexpected behavior`);\n _.merge(opts.chromeOptions, opts[opt]);\n }\n }\n\n const caps = webviewHelpers.createChromedriverCaps(opts, curDeviceId, details);\n this?.log?.debug(`Before starting chromedriver, androidPackage is '${caps.chromeOptions.androidPackage}'`);\n await chromedriver.start(caps);\n return chromedriver;\n};\nconst setupNewChromedriver = helpers.setupNewChromedriver;\n\n\nObject.assign(extensions, commands, helpers);\nexport { commands, helpers, setupNewChromedriver };\nexport default extensions;\n"],"mappings":"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"}
|
|
@@ -72,4 +72,4 @@ extensions.executeMobile = async function executeMobile(mobileCommand, opts = {}
|
|
|
72
72
|
};
|
|
73
73
|
var _default = extensions;
|
|
74
74
|
exports.default = _default;
|
|
75
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfZHJpdmVyIiwiZXh0ZW5zaW9ucyIsImV4ZWN1dGUiLCJzY3JpcHQiLCJhcmdzIiwibWF0Y2giLCJsb2ciLCJpbmZvIiwicmVwbGFjZSIsInRyaW0iLCJleGVjdXRlTW9iaWxlIiwiXyIsImlzQXJyYXkiLCJpc1dlYkNvbnRleHQiLCJlcnJvcnMiLCJOb3RJbXBsZW1lbnRlZEVycm9yIiwiZW5kcG9pbnQiLCJjaHJvbWVkcml2ZXIiLCJqd3Byb3h5IiwiZG93bnN0cmVhbVByb3RvY29sIiwiUFJPVE9DT0xTIiwiTUpTT05XUCIsImNvbW1hbmQiLCJtb2JpbGVDb21tYW5kIiwib3B0cyIsIm1vYmlsZUNvbW1hbmRzTWFwcGluZyIsInNoZWxsIiwiZXhlY0VtdUNvbnNvbGVDb21tYW5kIiwic3RhcnRMb2dzQnJvYWRjYXN0Iiwic3RvcExvZ3NCcm9hZGNhc3QiLCJjaGFuZ2VQZXJtaXNzaW9ucyIsImdldFBlcm1pc3Npb25zIiwicGVyZm9ybUVkaXRvckFjdGlvbiIsInNlbnNvclNldCIsImdldERldmljZVRpbWUiLCJzdGFydFNjcmVlblN0cmVhbWluZyIsInN0b3BTY3JlZW5TdHJlYW1pbmciLCJnZXROb3RpZmljYXRpb25zIiwibGlzdFNtcyIsInB1c2hGaWxlIiwicHVsbEZpbGUiLCJwdWxsRm9sZGVyIiwiZGVsZXRlRmlsZSIsImlzQXBwSW5zdGFsbGVkIiwicXVlcnlBcHBTdGF0ZSIsImFjdGl2YXRlQXBwIiwicmVtb3ZlQXBwIiwidGVybWluYXRlQXBwIiwiaW5zdGFsbEFwcCIsImNsZWFyQXBwIiwic3RhcnRTZXJ2aWNlIiwic3RvcFNlcnZpY2UiLCJzdGFydEFjdGl2aXR5IiwiYnJvYWRjYXN0IiwiZ2V0Q29udGV4dHMiLCJ1bmxvY2siLCJyZWZyZXNoR3BzQ2FjaGUiLCJzdGFydE1lZGlhUHJvamVjdGlvblJlY29yZGluZyIsImlzTWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nUnVubmluZyIsInN0b3BNZWRpYVByb2plY3Rpb25SZWNvcmRpbmciLCJnZXRDb25uZWN0aXZpdHkiLCJzZXRDb25uZWN0aXZpdHkiLCJoaWRlS2V5Ym9hcmQiLCJpc0tleWJvYXJkU2hvd24iLCJoYXMiLCJVbmtub3duQ29tbWFuZEVycm9yIiwia2V5cyIsIl9kZWZhdWx0IiwiZXhwb3J0cyIsImRlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tbWFuZHMvZXhlY3V0ZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZXJyb3JzLCBQUk9UT0NPTFMgfSBmcm9tICdhcHBpdW0vZHJpdmVyJztcblxuY29uc3QgZXh0ZW5zaW9ucyA9IHt9O1xuXG5leHRlbnNpb25zLmV4ZWN1dGUgPSBhc3luYyBmdW5jdGlvbiBleGVjdXRlIChzY3JpcHQsIGFyZ3MpIHtcbiAgaWYgKHNjcmlwdC5tYXRjaCgvXm1vYmlsZTovKSkge1xuICAgIHRoaXMubG9nLmluZm8oYEV4ZWN1dGluZyBuYXRpdmUgY29tbWFuZCAnJHtzY3JpcHR9J2ApO1xuICAgIHNjcmlwdCA9IHNjcmlwdC5yZXBsYWNlKC9ebW9iaWxlOi8sICcnKS50cmltKCk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZU1vYmlsZShzY3JpcHQsIF8uaXNBcnJheShhcmdzKSA/
|
|
75
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfZHJpdmVyIiwiZXh0ZW5zaW9ucyIsImV4ZWN1dGUiLCJzY3JpcHQiLCJhcmdzIiwibWF0Y2giLCJsb2ciLCJpbmZvIiwicmVwbGFjZSIsInRyaW0iLCJleGVjdXRlTW9iaWxlIiwiXyIsImlzQXJyYXkiLCJpc1dlYkNvbnRleHQiLCJlcnJvcnMiLCJOb3RJbXBsZW1lbnRlZEVycm9yIiwiZW5kcG9pbnQiLCJjaHJvbWVkcml2ZXIiLCJqd3Byb3h5IiwiZG93bnN0cmVhbVByb3RvY29sIiwiUFJPVE9DT0xTIiwiTUpTT05XUCIsImNvbW1hbmQiLCJtb2JpbGVDb21tYW5kIiwib3B0cyIsIm1vYmlsZUNvbW1hbmRzTWFwcGluZyIsInNoZWxsIiwiZXhlY0VtdUNvbnNvbGVDb21tYW5kIiwic3RhcnRMb2dzQnJvYWRjYXN0Iiwic3RvcExvZ3NCcm9hZGNhc3QiLCJjaGFuZ2VQZXJtaXNzaW9ucyIsImdldFBlcm1pc3Npb25zIiwicGVyZm9ybUVkaXRvckFjdGlvbiIsInNlbnNvclNldCIsImdldERldmljZVRpbWUiLCJzdGFydFNjcmVlblN0cmVhbWluZyIsInN0b3BTY3JlZW5TdHJlYW1pbmciLCJnZXROb3RpZmljYXRpb25zIiwibGlzdFNtcyIsInB1c2hGaWxlIiwicHVsbEZpbGUiLCJwdWxsRm9sZGVyIiwiZGVsZXRlRmlsZSIsImlzQXBwSW5zdGFsbGVkIiwicXVlcnlBcHBTdGF0ZSIsImFjdGl2YXRlQXBwIiwicmVtb3ZlQXBwIiwidGVybWluYXRlQXBwIiwiaW5zdGFsbEFwcCIsImNsZWFyQXBwIiwic3RhcnRTZXJ2aWNlIiwic3RvcFNlcnZpY2UiLCJzdGFydEFjdGl2aXR5IiwiYnJvYWRjYXN0IiwiZ2V0Q29udGV4dHMiLCJ1bmxvY2siLCJyZWZyZXNoR3BzQ2FjaGUiLCJzdGFydE1lZGlhUHJvamVjdGlvblJlY29yZGluZyIsImlzTWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nUnVubmluZyIsInN0b3BNZWRpYVByb2plY3Rpb25SZWNvcmRpbmciLCJnZXRDb25uZWN0aXZpdHkiLCJzZXRDb25uZWN0aXZpdHkiLCJoaWRlS2V5Ym9hcmQiLCJpc0tleWJvYXJkU2hvd24iLCJoYXMiLCJVbmtub3duQ29tbWFuZEVycm9yIiwia2V5cyIsIl9kZWZhdWx0IiwiZXhwb3J0cyIsImRlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tbWFuZHMvZXhlY3V0ZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZXJyb3JzLCBQUk9UT0NPTFMgfSBmcm9tICdhcHBpdW0vZHJpdmVyJztcblxuY29uc3QgZXh0ZW5zaW9ucyA9IHt9O1xuXG5leHRlbnNpb25zLmV4ZWN1dGUgPSBhc3luYyBmdW5jdGlvbiBleGVjdXRlIChzY3JpcHQsIGFyZ3MpIHtcbiAgaWYgKHNjcmlwdC5tYXRjaCgvXm1vYmlsZTovKSkge1xuICAgIHRoaXMubG9nLmluZm8oYEV4ZWN1dGluZyBuYXRpdmUgY29tbWFuZCAnJHtzY3JpcHR9J2ApO1xuICAgIHNjcmlwdCA9IHNjcmlwdC5yZXBsYWNlKC9ebW9iaWxlOi8sICcnKS50cmltKCk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZU1vYmlsZShzY3JpcHQsIF8uaXNBcnJheShhcmdzKSA/IGFyZ3NbMF0gOiBhcmdzKTtcbiAgfVxuICBpZiAoIXRoaXMuaXNXZWJDb250ZXh0KCkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLk5vdEltcGxlbWVudGVkRXJyb3IoKTtcbiAgfVxuICBjb25zdCBlbmRwb2ludCA9IHRoaXMuY2hyb21lZHJpdmVyLmp3cHJveHkuZG93bnN0cmVhbVByb3RvY29sID09PSBQUk9UT0NPTFMuTUpTT05XUFxuICAgID8gJy9leGVjdXRlJ1xuICAgIDogJy9leGVjdXRlL3N5bmMnO1xuICByZXR1cm4gYXdhaXQgdGhpcy5jaHJvbWVkcml2ZXIuandwcm94eS5jb21tYW5kKGVuZHBvaW50LCAnUE9TVCcsIHtcbiAgICBzY3JpcHQsXG4gICAgYXJncyxcbiAgfSk7XG59O1xuXG5leHRlbnNpb25zLmV4ZWN1dGVNb2JpbGUgPSBhc3luYyBmdW5jdGlvbiBleGVjdXRlTW9iaWxlIChtb2JpbGVDb21tYW5kLCBvcHRzID0ge30pIHtcbiAgY29uc3QgbW9iaWxlQ29tbWFuZHNNYXBwaW5nID0ge1xuICAgIHNoZWxsOiAnbW9iaWxlU2hlbGwnLFxuXG4gICAgZXhlY0VtdUNvbnNvbGVDb21tYW5kOiAnbW9iaWxlRXhlY0VtdUNvbnNvbGVDb21tYW5kJyxcblxuICAgIHN0YXJ0TG9nc0Jyb2FkY2FzdDogJ21vYmlsZVN0YXJ0TG9nc0Jyb2FkY2FzdCcsXG4gICAgc3RvcExvZ3NCcm9hZGNhc3Q6ICdtb2JpbGVTdG9wTG9nc0Jyb2FkY2FzdCcsXG5cbiAgICBjaGFuZ2VQZXJtaXNzaW9uczogJ21vYmlsZUNoYW5nZVBlcm1pc3Npb25zJyxcbiAgICBnZXRQZXJtaXNzaW9uczogJ21vYmlsZUdldFBlcm1pc3Npb25zJyxcblxuICAgIHBlcmZvcm1FZGl0b3JBY3Rpb246ICdtb2JpbGVQZXJmb3JtRWRpdG9yQWN0aW9uJyxcblxuICAgIHNlbnNvclNldDogJ3NlbnNvclNldCcsXG5cbiAgICBnZXREZXZpY2VUaW1lOiAnbW9iaWxlR2V0RGV2aWNlVGltZScsXG5cbiAgICBzdGFydFNjcmVlblN0cmVhbWluZzogJ21vYmlsZVN0YXJ0U2NyZWVuU3RyZWFtaW5nJyxcbiAgICBzdG9wU2NyZWVuU3RyZWFtaW5nOiAnbW9iaWxlU3RvcFNjcmVlblN0cmVhbWluZycsXG5cbiAgICBnZXROb3RpZmljYXRpb25zOiAnbW9iaWxlR2V0Tm90aWZpY2F0aW9ucycsXG5cbiAgICBsaXN0U21zOiAnbW9iaWxlTGlzdFNtcycsXG5cbiAgICBwdXNoRmlsZTogJ21vYmlsZVB1c2hGaWxlJyxcbiAgICBwdWxsRmlsZTogJ21vYmlsZVB1bGxGaWxlJyxcbiAgICBwdWxsRm9sZGVyOiAnbW9iaWxlUHVsbEZvbGRlcicsXG4gICAgZGVsZXRlRmlsZTogJ21vYmlsZURlbGV0ZUZpbGUnLFxuXG4gICAgaXNBcHBJbnN0YWxsZWQ6ICdtb2JpbGVJc0FwcEluc3RhbGxlZCcsXG4gICAgcXVlcnlBcHBTdGF0ZTogJ21vYmlsZVF1ZXJ5QXBwU3RhdGUnLFxuICAgIGFjdGl2YXRlQXBwOiAnbW9iaWxlQWN0aXZhdGVBcHAnLFxuICAgIHJlbW92ZUFwcDogJ21vYmlsZVJlbW92ZUFwcCcsXG4gICAgdGVybWluYXRlQXBwOiAnbW9iaWxlVGVybWluYXRlQXBwJyxcbiAgICBpbnN0YWxsQXBwOiAnbW9iaWxlSW5zdGFsbEFwcCcsXG4gICAgY2xlYXJBcHA6ICdtb2JpbGVDbGVhckFwcCcsXG5cbiAgICBzdGFydFNlcnZpY2U6ICdtb2JpbGVTdGFydFNlcnZpY2UnLFxuICAgIHN0b3BTZXJ2aWNlOiAnbW9iaWxlU3RvcFNlcnZpY2UnLFxuICAgIHN0YXJ0QWN0aXZpdHk6ICdtb2JpbGVTdGFydEFjdGl2aXR5JyxcbiAgICBicm9hZGNhc3Q6ICdtb2JpbGVCcm9hZGNhc3QnLFxuXG4gICAgZ2V0Q29udGV4dHM6ICdtb2JpbGVHZXRDb250ZXh0cycsXG5cbiAgICB1bmxvY2s6ICdtb2JpbGVVbmxvY2snLFxuXG4gICAgcmVmcmVzaEdwc0NhY2hlOiAnbW9iaWxlUmVmcmVzaEdwc0NhY2hlJyxcblxuICAgIHN0YXJ0TWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nOiAnbW9iaWxlU3RhcnRNZWRpYVByb2plY3Rpb25SZWNvcmRpbmcnLFxuICAgIGlzTWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nUnVubmluZzogJ21vYmlsZUlzTWVkaWFQcm9qZWN0aW9uUmVjb3JkaW5nUnVubmluZycsXG4gICAgc3RvcE1lZGlhUHJvamVjdGlvblJlY29yZGluZzogJ21vYmlsZVN0b3BNZWRpYVByb2plY3Rpb25SZWNvcmRpbmcnLFxuXG4gICAgZ2V0Q29ubmVjdGl2aXR5OiAnbW9iaWxlR2V0Q29ubmVjdGl2aXR5JyxcbiAgICBzZXRDb25uZWN0aXZpdHk6ICdtb2JpbGVTZXRDb25uZWN0aXZpdHknLFxuXG4gICAgaGlkZUtleWJvYXJkOiAnaGlkZUtleWJvYXJkJyxcbiAgICBpc0tleWJvYXJkU2hvd246ICdpc0tleWJvYXJkU2hvd24nLFxuICB9O1xuXG4gIGlmICghXy5oYXMobW9iaWxlQ29tbWFuZHNNYXBwaW5nLCBtb2JpbGVDb21tYW5kKSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuVW5rbm93bkNvbW1hbmRFcnJvcihgVW5rbm93biBtb2JpbGUgY29tbWFuZCBcIiR7bW9iaWxlQ29tbWFuZH1cIi4gYCArXG4gICAgICBgT25seSAke18ua2V5cyhtb2JpbGVDb21tYW5kc01hcHBpbmcpfSBjb21tYW5kcyBhcmUgc3VwcG9ydGVkLmApO1xuICB9XG4gIHJldHVybiBhd2FpdCB0aGlzW21vYmlsZUNvbW1hbmRzTWFwcGluZ1ttb2JpbGVDb21tYW5kXV0ob3B0cyk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBleHRlbnNpb25zO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUVBLE1BQU1FLFVBQVUsR0FBRyxDQUFDLENBQUM7QUFFckJBLFVBQVUsQ0FBQ0MsT0FBTyxHQUFHLGVBQWVBLE9BQU9BLENBQUVDLE1BQU0sRUFBRUMsSUFBSSxFQUFFO0VBQ3pELElBQUlELE1BQU0sQ0FBQ0UsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFFO0lBQzVCLElBQUksQ0FBQ0MsR0FBRyxDQUFDQyxJQUFJLENBQUUsNkJBQTRCSixNQUFPLEdBQUUsQ0FBQztJQUNyREEsTUFBTSxHQUFHQSxNQUFNLENBQUNLLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUNDLElBQUksQ0FBQyxDQUFDO0lBQzlDLE9BQU8sTUFBTSxJQUFJLENBQUNDLGFBQWEsQ0FBQ1AsTUFBTSxFQUFFUSxlQUFDLENBQUNDLE9BQU8sQ0FBQ1IsSUFBSSxDQUFD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
|