appium-adb 9.10.21 → 9.10.23
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/build/lib/helpers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","names":["APKS_EXTENSION","APK_EXTENSION","APK_INSTALL_TIMEOUT","APKS_INSTALL_TIMEOUT","DEFAULT_ADB_EXEC_TIMEOUT","MAIN_ACTION","LAUNCHER_CATEGORY","MODULE_NAME","getModuleRoot","_","memoize","root","node","getModuleRootSync","__filename","Error","getSdkRootFromEnv","process","env","ANDROID_HOME","ANDROID_SDK_ROOT","requireSdkRoot","customRoot","sdkRoot","docMsg","isEmpty","fs","exists","stats","stat","isDirectory","getAndroidPlatformAndPath","propsPaths","glob","cwd","path","resolve","absolute","platformsMapping","propsPath","propsContent","readFile","platformPath","dirname","platform","basename","match","exec","log","warn","parseInt","recentSdkVersion","keys","sort","reverse","result","debug","JSON","stringify","unzipFile","zipPath","dstRoot","zip","assertValidZip","extractAllTo","unsignApk","apkPath","tmpRoot","tempDir","openDir","metaInfFolderName","hasMetaInf","readEntries","entry","fileName","startsWith","tmpZipRoot","rimraf","tmpResultPath","toArchive","unlink","mv","getIMEListFromOutput","stdout","engines","line","split","length","push","trim","replace","getJavaHome","JAVA_HOME","getJavaForOs","javaHome","errMsg","err","message","executableName","system","isWindows","resultPath","which","ign","getOpenSslForOs","binaryName","getApksignerForOs","sysHelpers","getBinaryFromSdkRoot","getApkanalyzerForOs","isShowingLockscreen","dumpsys","some","x","includes","every","test","isCurrentFocusOnKeyguard","m","getSurfaceOrientation","isScreenOnFully","buildStartCmd","startAppOptions","apiLevel","user","waitForLaunch","pkg","activity","action","category","stopApp","flags","cmd","util","hasValue","optionalIntentArguments","parseKeyValue","str","space","indexOf","substring","re","args","apply","flag","flagPos","prevArgs","getSdkToolsVersion","androidHome","propertiesPath","propertiesContent","versionMatcher","RegExp","major","minor","build","getBuildToolsDirs","buildToolsDirs","map","dir","a","b","semver","rcompare","pair","pairs","B","mtime","valueOf","info","extractMatchingPermissions","dumpsysOutput","groupNames","grantedState","groupPatternByName","groupName","escapeRegExp","indentPattern","permissionNamePattern","grantedStatePattern","groupMatch","lines","titleIndent","search","slice","currentIndent","permissionNameMatch","item","permission","grantedStateMatch","granted","filteredResult","filter","isBoolean","pluralize","buildInstallArgs","options","allowTestPackages","useSdcard","grantPermissions","partialInstall","parseManifest","manifest","package","versionCode","versionName","application","activities","activityAliases","enabled","intentFilters","actions","categories","isMainAction","name","isLauncherCategory","parseAaptStrings","rawOutput","configMarker","normalizeStringMatch","s","apkStrings","isInConfig","currentResourceId","isInPluralGroup","quotedStringPattern","os","EOL","trimmedLine","parseAapt2Strings","allLines","extractContent","startIdx","idx","startCharPos","terminationCharMatch","terminationCharPos","index","trimStart","isInCurrentConfig","lineIndex","content","isString","formatConfigMarker","configsGetter","desiredMarker","defaultMarker","configs","toLowerCase","parseJsonData","output","entityName","jsonStr","parse","e","toAvdLocaleArgs","language","country","toUpperCase","locale","getAndroidPrefsRoot","location","ANDROID_EMULATOR_HOME","dirExists","home","HOME","USERPROFILE","escapeShellArg","arg","parseLaunchableActivityNames","mainActivityNameRe","categoryNameRe","blocks","blockStartIndent","block","trimEnd","isNil","hasCategory","activityNameStr","Boolean","fqActivityName","matchComponentName","classString"],"sources":["../../lib/helpers.js"],"sourcesContent":["import path from 'path';\nimport { system, fs, zip, util, tempDir, node } from '@appium/support';\nimport log from './logger.js';\nimport _ from 'lodash';\nimport B from 'bluebird';\nimport semver from 'semver';\nimport os from 'os';\n\nconst APKS_EXTENSION = '.apks';\nconst APK_EXTENSION = '.apk';\nconst APK_INSTALL_TIMEOUT = 60000;\nconst APKS_INSTALL_TIMEOUT = APK_INSTALL_TIMEOUT * 2;\nconst DEFAULT_ADB_EXEC_TIMEOUT = 20000; // in milliseconds\nconst MAIN_ACTION = 'android.intent.action.MAIN';\nconst LAUNCHER_CATEGORY = 'android.intent.category.LAUNCHER';\nconst MODULE_NAME = 'appium-adb';\n\n/**\n * Calculates the path to the current module's root folder\n *\n * @returns {string} The full path to module root\n * @throws {Error} If the current module root folder cannot be determined\n */\nconst getModuleRoot = _.memoize(function getModuleRoot () {\n const root = node.getModuleRootSync(MODULE_NAME, __filename);\n if (!root) {\n throw new Error(`Cannot find the root folder of the ${MODULE_NAME} Node.js module`);\n }\n return root;\n});\n\n/**\n * Retrieves the actual path to SDK root folder from the system environment\n *\n * @return {?string} The full path to the SDK root folder\n */\nfunction getSdkRootFromEnv () {\n return process.env.ANDROID_HOME || process.env.ANDROID_SDK_ROOT;\n}\n\n/**\n * Retrieves the actual path to SDK root folder\n *\n * @return {string} The full path to the SDK root folder\n * @throws {Error} If either the corresponding env variable is unset or is\n * pointing to an invalid file system entry\n */\nasync function requireSdkRoot (customRoot = null) {\n const sdkRoot = customRoot || getSdkRootFromEnv();\n const docMsg = 'Read https://developer.android.com/studio/command-line/variables for more details';\n if (_.isEmpty(sdkRoot)) {\n throw new Error(`Neither ANDROID_HOME nor ANDROID_SDK_ROOT environment variable was exported. ${docMsg}`);\n }\n\n if (!await fs.exists(sdkRoot)) {\n throw new Error(`The Android SDK root folder '${sdkRoot}' does not exist on the local file system. ${docMsg}`);\n }\n const stats = await fs.stat(sdkRoot);\n if (!stats.isDirectory()) {\n throw new Error(`The Android SDK root '${sdkRoot}' must be a folder. ${docMsg}`);\n }\n return sdkRoot;\n}\n\n/**\n * @typedef {Object} PlatformInfo\n * @property {?string} platform - The platform name, for example `android-24`\n * or `null` if it cannot be found\n * @property {?string} platformPath - Full path to the platform SDK folder\n * or `null` if it cannot be found\n */\n\n/**\n * Retrieve the path to the recent installed Android platform.\n *\n * @return {PlatformInfo} The resulting path to the newest installed platform.\n */\nasync function getAndroidPlatformAndPath (sdkRoot) {\n const propsPaths = await fs.glob('*/build.prop', {\n cwd: path.resolve(sdkRoot, 'platforms'),\n absolute: true,\n });\n const platformsMapping = {};\n for (const propsPath of propsPaths) {\n const propsContent = await fs.readFile(propsPath, 'utf-8');\n const platformPath = path.dirname(propsPath);\n const platform = path.basename(platformPath);\n const match = /ro\\.build\\.version\\.sdk=(\\d+)/.exec(propsContent);\n if (!match) {\n log.warn(`Cannot read the SDK version from '${propsPath}'. Skipping '${platform}'`);\n continue;\n }\n platformsMapping[parseInt(match[1], 10)] = {\n platform,\n platformPath,\n };\n }\n if (_.isEmpty(platformsMapping)) {\n log.warn(`Found zero platform folders at '${path.resolve(sdkRoot, 'platforms')}'. ` +\n `Do you have any Android SDKs installed?`);\n return {\n platform: null,\n platformPath: null,\n };\n }\n\n const recentSdkVersion = _.keys(platformsMapping).sort().reverse()[0];\n const result = platformsMapping[recentSdkVersion];\n log.debug(`Found the most recent Android platform: ${JSON.stringify(result)}`);\n return result;\n}\n\nasync function unzipFile (zipPath, dstRoot = path.dirname(zipPath)) {\n log.debug(`Unzipping '${zipPath}' to '${dstRoot}'`);\n await zip.assertValidZip(zipPath);\n await zip.extractAllTo(zipPath, dstRoot);\n log.debug('Unzip successful');\n}\n\n/**\n * Unsigns the given apk by removing the\n * META-INF folder recursively from the archive.\n * !!! The function overwrites the given apk after successful unsigning !!!\n *\n * @param {string} apkPath The path to the apk\n * @returns {boolean} `true` if the apk has been successfully\n * unsigned and overwritten\n * @throws {Error} if there was an error during the unsign operation\n */\nasync function unsignApk (apkPath) {\n const tmpRoot = await tempDir.openDir();\n const metaInfFolderName = 'META-INF';\n try {\n let hasMetaInf = false;\n await zip.readEntries(apkPath, ({entry}) => {\n hasMetaInf = entry.fileName.startsWith(`${metaInfFolderName}/`);\n // entries iteration stops after `false` is returned\n return !hasMetaInf;\n });\n if (!hasMetaInf) {\n return false;\n }\n const tmpZipRoot = path.resolve(tmpRoot, 'apk');\n await zip.extractAllTo(apkPath, tmpZipRoot);\n await fs.rimraf(path.resolve(tmpZipRoot, metaInfFolderName));\n const tmpResultPath = path.resolve(tmpRoot, path.basename(apkPath));\n await zip.toArchive(tmpResultPath, {\n cwd: tmpZipRoot,\n });\n await fs.unlink(apkPath);\n await fs.mv(tmpResultPath, apkPath);\n return true;\n } finally {\n await fs.rimraf(tmpRoot);\n }\n}\n\nfunction getIMEListFromOutput (stdout) {\n let engines = [];\n for (let line of stdout.split('\\n')) {\n if (line.length > 0 && line[0] !== ' ') {\n // remove newline and trailing colon, and add to the list\n engines.push(line.trim().replace(/:$/, ''));\n }\n }\n return engines;\n}\n\nconst getJavaHome = _.memoize(async function getJavaHome () {\n const result = process.env.JAVA_HOME;\n if (!result) {\n throw new Error('The JAVA_HOME environment variable is not set for the current process');\n }\n if (!await fs.exists(result)) {\n throw new Error(`The JAVA_HOME location '${result}' must exist`);\n }\n const stats = await fs.stat(result);\n if (!stats.isDirectory()) {\n throw new Error(`The JAVA_HOME location '${result}' must be a valid folder`);\n }\n return result;\n});\n\nconst getJavaForOs = _.memoize(async function getJavaForOs () {\n let javaHome;\n let errMsg;\n try {\n javaHome = await getJavaHome();\n } catch (err) {\n errMsg = err.message;\n }\n const executableName = `java${system.isWindows() ? '.exe' : ''}`;\n if (javaHome) {\n const resultPath = path.resolve(javaHome, 'bin', executableName);\n if (await fs.exists(resultPath)) {\n return resultPath;\n }\n }\n try {\n return await fs.which(executableName);\n } catch (ign) {}\n throw new Error(`The '${executableName}' binary could not be found ` +\n `neither in PATH nor under JAVA_HOME (${errMsg || path.resolve(javaHome, 'bin')})`);\n});\n\nconst getOpenSslForOs = async function () {\n const binaryName = `openssl${system.isWindows() ? '.exe' : ''}`;\n try {\n return await fs.which(binaryName);\n } catch (err) {\n throw new Error('The openssl tool must be installed on the system and available on the path');\n }\n};\n\n/**\n * Get the absolute path to apksigner tool\n *\n * @param {Object} sysHelpers - An instance containing systemCallMethods helper methods\n * @returns {string} An absolute path to apksigner tool.\n * @throws {Error} If the tool is not present on the local file system.\n */\nasync function getApksignerForOs (sysHelpers) {\n return await sysHelpers.getBinaryFromSdkRoot('apksigner.jar');\n}\n\n/**\n * Get the absolute path to apkanalyzer tool.\n * https://developer.android.com/studio/command-line/apkanalyzer.html\n *\n * @param {Object} sysHelpers - An instance containing systemCallMethods helper methods\n * @returns {string} An absolute path to apkanalyzer tool.\n * @throws {Error} If the tool is not present on the local file system.\n */\nasync function getApkanalyzerForOs (sysHelpers) {\n return await sysHelpers.getBinaryFromSdkRoot('apkanalyzer');\n}\n\n/**\n * Checks mShowingLockscreen or mDreamingLockscreen in dumpsys output to determine\n * if lock screen is showing\n *\n * A note: `adb shell dumpsys trust` performs better while detecting the locked screen state\n * in comparison to `adb dumpsys window` output parsing.\n * But the trust command does not work for `Swipe` unlock pattern.\n *\n * In some Android devices (Probably around Android 10+), `mShowingLockscreen` and `mDreamingLockscreen`\n * do not work to detect lock status. Instead, keyguard preferences helps to detect the lock condition.\n * Some devices such as Android TV do not have keyguard, so we should keep\n * screen condition as this primary method.\n *\n * @param {string} dumpsys - The output of dumpsys window command.\n * @return {boolean} True if lock screen is showing.\n */\nfunction isShowingLockscreen (dumpsys) {\n return _.some(['mShowingLockscreen=true', 'mDreamingLockscreen=true'], (x) => dumpsys.includes(x))\n // `mIsShowing` and `mInputRestricted` are `true` in lock condition. `false` is unlock condition.\n || _.every([/KeyguardStateMonitor[\\n\\s]+mIsShowing=true/, /\\s+mInputRestricted=true/], (x) => x.test(dumpsys));\n}\n\n/*\n * Checks mCurrentFocus in dumpsys output to determine if Keyguard is activated\n */\nfunction isCurrentFocusOnKeyguard (dumpsys) {\n let m = /mCurrentFocus.+Keyguard/gi.exec(dumpsys);\n return (m && m.length && m[0]) ? true : false;\n}\n\n/*\n * Reads SurfaceOrientation in dumpsys output\n */\nfunction getSurfaceOrientation (dumpsys) {\n let m = /SurfaceOrientation: \\d/gi.exec(dumpsys);\n return m && parseInt(m[0].split(':')[1], 10);\n}\n\n/*\n * Checks mScreenOnFully in dumpsys output to determine if screen is showing\n * Default is true\n */\nfunction isScreenOnFully (dumpsys) {\n let m = /mScreenOnFully=\\w+/gi.exec(dumpsys);\n return !m || // if information is missing we assume screen is fully on\n (m && m.length > 0 && m[0].split('=')[1] === 'true') || false;\n}\n\n/**\n * Builds command line representation for the given\n * application startup options\n *\n * @param {StartAppOptions} startAppOptions - Application options mapping\n * @param {number} apiLevel - The actual OS API level\n * @returns {Array<String>} The actual command line array\n */\nfunction buildStartCmd (startAppOptions, apiLevel) {\n const {\n user,\n waitForLaunch,\n pkg,\n activity,\n action,\n category,\n stopApp,\n flags,\n } = startAppOptions;\n const cmd = ['am', 'start'];\n if (util.hasValue(user)) {\n cmd.push('--user', user);\n }\n if (waitForLaunch) {\n cmd.push('-W');\n }\n if (activity && pkg) {\n cmd.push('-n', `${pkg}/${activity}`);\n }\n if (stopApp && apiLevel >= 15) {\n cmd.push('-S');\n }\n if (action) {\n cmd.push('-a', action);\n }\n if (category) {\n cmd.push('-c', category);\n }\n if (flags) {\n cmd.push('-f', flags);\n }\n if (startAppOptions.optionalIntentArguments) {\n // expect optionalIntentArguments to be a single string of the form:\n // \"-flag key\"\n // \"-flag key value\"\n // or a combination of these (e.g., \"-flag1 key1 -flag2 key2 value2\")\n\n // take a string and parse out the part before any spaces, and anything after\n // the first space\n let parseKeyValue = function (str) {\n str = str.trim();\n let space = str.indexOf(' ');\n if (space === -1) {\n return str.length ? [str] : [];\n } else {\n return [str.substring(0, space).trim(), str.substring(space + 1).trim()];\n }\n };\n\n // cycle through the optionalIntentArguments and pull out the arguments\n // add a space initially so flags can be distinguished from arguments that\n // have internal hyphens\n let optionalIntentArguments = ` ${startAppOptions.optionalIntentArguments}`;\n let re = / (-[^\\s]+) (.+)/;\n while (true) { // eslint-disable-line no-constant-condition\n let args = re.exec(optionalIntentArguments);\n if (!args) {\n if (optionalIntentArguments.length) {\n // no more flags, so the remainder can be treated as 'key' or 'key value'\n cmd.push.apply(cmd, parseKeyValue(optionalIntentArguments));\n }\n // we are done\n break;\n }\n\n // take the flag and see if it is at the beginning of the string\n // if it is not, then it means we have been through already, and\n // what is before the flag is the argument for the previous flag\n let flag = args[1];\n let flagPos = optionalIntentArguments.indexOf(flag);\n if (flagPos !== 0) {\n let prevArgs = optionalIntentArguments.substring(0, flagPos);\n cmd.push.apply(cmd, parseKeyValue(prevArgs));\n }\n\n // add the flag, as there are no more earlier arguments\n cmd.push(flag);\n\n // make optionalIntentArguments hold the remainder\n optionalIntentArguments = args[2];\n }\n }\n return cmd;\n}\n\nconst getSdkToolsVersion = _.memoize(async function getSdkToolsVersion () {\n const androidHome = process.env.ANDROID_HOME;\n if (!androidHome) {\n throw new Error('ANDROID_HOME environment variable is expected to be set');\n }\n const propertiesPath = path.resolve(androidHome, 'tools', 'source.properties');\n if (!await fs.exists(propertiesPath)) {\n log.warn(`Cannot find ${propertiesPath} file to read SDK version from`);\n return;\n }\n const propertiesContent = await fs.readFile(propertiesPath, 'utf8');\n const versionMatcher = new RegExp(/Pkg\\.Revision=(\\d+)\\.?(\\d+)?\\.?(\\d+)?/);\n const match = versionMatcher.exec(propertiesContent);\n if (match) {\n return {\n major: parseInt(match[1], 10),\n minor: match[2] ? parseInt(match[2], 10) : 0,\n build: match[3] ? parseInt(match[3], 10) : 0\n };\n }\n log.warn(`Cannot parse \"Pkg.Revision\" value from ${propertiesPath}`);\n});\n\n/**\n * Retrieves full paths to all 'build-tools' subfolders under the particular\n * SDK root folder\n *\n * @param {string} sdkRoot - The full path to the Android SDK root folder\n * @returns {Array<string>} The full paths to the resulting folders sorted by\n * modification date (the newest comes first) or an empty list if no macthes were found\n */\nconst getBuildToolsDirs = _.memoize(async function getBuildToolsDirs (sdkRoot) {\n let buildToolsDirs = await fs.glob('*/', {\n cwd: path.resolve(sdkRoot, 'build-tools'),\n absolute: true,\n });\n try {\n buildToolsDirs = buildToolsDirs\n .map((dir) => [path.basename(dir), dir])\n .sort((a, b) => semver.rcompare(a[0], b[0]))\n .map((pair) => pair[1]);\n } catch (err) {\n log.warn(`Cannot sort build-tools folders ${JSON.stringify(buildToolsDirs.map((dir) => path.basename(dir)))} ` +\n `by semantic version names.`);\n log.warn(`Falling back to sorting by modification date. Original error: ${err.message}`);\n const pairs = await B.map(buildToolsDirs, async (dir) => [(await fs.stat(dir)).mtime.valueOf(), dir]);\n buildToolsDirs = pairs\n .sort((a, b) => a[0] < b[0])\n .map((pair) => pair[1]);\n }\n log.info(`Found ${buildToolsDirs.length} 'build-tools' folders under '${sdkRoot}' (newest first):`);\n for (let dir of buildToolsDirs) {\n log.info(` ${dir}`);\n }\n return buildToolsDirs;\n});\n\n/**\n * Retrieves the list of permission names encoded in `dumpsys package` command output.\n *\n * @param {string} dumpsysOutput - The actual command output.\n * @param {Array<string>} groupNames - The list of group names to list permissions for.\n * @param {?boolean} grantedState - The expected state of `granted` attribute to filter with.\n * No filtering is done if the parameter is not set.\n * @returns {Array<string>} The list of matched permission names or an empty list if no matches were found.\n */\nconst extractMatchingPermissions = function (dumpsysOutput, groupNames, grantedState = null) {\n const groupPatternByName = (groupName) => new RegExp(`^(\\\\s*${_.escapeRegExp(groupName)} permissions:[\\\\s\\\\S]+)`, 'm');\n const indentPattern = /\\S|$/;\n const permissionNamePattern = /android\\.\\w*\\.?permission\\.\\w+/;\n const grantedStatePattern = /\\bgranted=(\\w+)/;\n const result = [];\n for (const groupName of groupNames) {\n const groupMatch = groupPatternByName(groupName).exec(dumpsysOutput);\n if (!groupMatch) {\n continue;\n }\n\n const lines = groupMatch[1].split('\\n');\n if (lines.length < 2) {\n continue;\n }\n\n const titleIndent = lines[0].search(indentPattern);\n for (const line of lines.slice(1)) {\n const currentIndent = line.search(indentPattern);\n if (currentIndent <= titleIndent) {\n break;\n }\n\n const permissionNameMatch = permissionNamePattern.exec(line);\n if (!permissionNameMatch) {\n continue;\n }\n const item = {\n permission: permissionNameMatch[0],\n };\n const grantedStateMatch = grantedStatePattern.exec(line);\n if (grantedStateMatch) {\n item.granted = grantedStateMatch[1] === 'true';\n }\n result.push(item);\n }\n }\n\n const filteredResult = result\n .filter((item) => !_.isBoolean(grantedState) || item.granted === grantedState)\n .map((item) => item.permission);\n log.debug(`Retrieved ${util.pluralize('permission', filteredResult.length, true)} ` +\n `from ${groupNames} ${util.pluralize('group', groupNames.length, false)}`);\n return filteredResult;\n};\n\n/**\n * @typedef {Object} InstallOptions\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 * @property {boolean} partialInstall [false] - Install apks partially. It is used for 'install-multiple'.\n * https://android.stackexchange.com/questions/111064/what-is-a-partial-application-install-via-adb\n */\n\n/**\n * Transforms given options into the list of `adb install.install-multiple` command arguments\n *\n * @param {number} apiLevel - The current API level\n * @param {?InstallOptions} options - The options mapping to transform\n * @returns {Array<String>} The array of arguments\n */\nfunction buildInstallArgs (apiLevel, options = {}) {\n const result = [];\n\n if (!util.hasValue(options.replace) || options.replace) {\n result.push('-r');\n }\n if (options.allowTestPackages) {\n result.push('-t');\n }\n if (options.useSdcard) {\n result.push('-s');\n }\n if (options.grantPermissions) {\n if (apiLevel < 23) {\n log.debug(`Skipping permissions grant option, since ` +\n `the current API level ${apiLevel} does not support applications ` +\n `permissions customization`);\n } else {\n result.push('-g');\n }\n }\n // For multiple-install\n if (options.partialInstall) {\n result.push('-p');\n }\n\n return result;\n}\n\n/**\n * @typedef {Object} ManifestInfo\n * @property {string} pkg - The application identifier\n * @property {string} activity - The name of the main package activity\n * @property {?number} versionCode - The version code number (might be `NaN`)\n * @property {?string} versionName - The version name (might be `null`)\n */\n\n/**\n * Perform parsing of the manifest object in order\n * to extract some vital values from it\n *\n * @param {object} manifest The manifest content formatted as JSON\n * See https://www.npmjs.com/package/adbkit-apkreader for detailed format description\n * @returns {ManifestInfo}\n */\nfunction parseManifest (manifest) {\n const result = {\n pkg: manifest.package,\n versionCode: parseInt(manifest.versionCode, 10),\n versionName: manifest.versionName || null,\n };\n if (!manifest.application) {\n return result;\n }\n\n // Look for enabled activity or activity-alias with\n // action == android.intent.action.MAIN and\n // category == android.intent.category.LAUNCHER\n for (const activity of [\n ...manifest.application.activities,\n ...manifest.application.activityAliases,\n ]) {\n if (activity.enabled === false || _.isEmpty(activity.intentFilters)) {\n continue;\n }\n\n for (const {actions, categories} of activity.intentFilters) {\n if (_.isEmpty(actions) || _.isEmpty(categories)) {\n continue;\n }\n\n const isMainAction = actions.some(({name}) => name === MAIN_ACTION);\n const isLauncherCategory = categories.some(({name}) => name === LAUNCHER_CATEGORY);\n if (isMainAction && isLauncherCategory) {\n result.activity = activity.name;\n return result;\n }\n }\n }\n return result;\n}\n\n/**\n * Parses apk strings from aapt tool output\n *\n * @param {string} rawOutput The actual tool output\n * @param {string} configMarker The config marker. Usually\n * a language abbreviation or `(default)`\n * @returns {Object} Strings ids to values mapping. Plural\n * values are represented as arrays. If no config found for the\n * given marker then an empty mapping is returned.\n */\nfunction parseAaptStrings (rawOutput, configMarker) {\n const normalizeStringMatch = function (s) {\n return s.replace(/\"$/, '').replace(/^\"/, '').replace(/\\\\\"/g, '\"');\n };\n\n const apkStrings = {};\n let isInConfig = false;\n let currentResourceId = null;\n let isInPluralGroup = false;\n // The pattern matches any quoted content including escaped quotes\n const quotedStringPattern = /\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\"/;\n for (const line of rawOutput.split(os.EOL)) {\n const trimmedLine = line.trim();\n if (_.isEmpty(trimmedLine)) {\n continue;\n }\n\n if (['config', 'type', 'spec', 'Package'].some((x) => trimmedLine.startsWith(x))) {\n isInConfig = trimmedLine.startsWith(`config ${configMarker}:`);\n currentResourceId = null;\n isInPluralGroup = false;\n continue;\n }\n\n if (!isInConfig) {\n continue;\n }\n\n if (trimmedLine.startsWith('resource')) {\n isInPluralGroup = false;\n currentResourceId = null;\n\n if (trimmedLine.includes(':string/')) {\n const match = /:string\\/(\\S+):/.exec(trimmedLine);\n if (match) {\n currentResourceId = match[1];\n }\n } else if (trimmedLine.includes(':plurals/')) {\n const match = /:plurals\\/(\\S+):/.exec(trimmedLine);\n if (match) {\n currentResourceId = match[1];\n isInPluralGroup = true;\n }\n }\n continue;\n }\n\n if (currentResourceId && trimmedLine.startsWith('(string')) {\n const match = quotedStringPattern.exec(trimmedLine);\n if (match) {\n apkStrings[currentResourceId] = normalizeStringMatch(match[0]);\n }\n currentResourceId = null;\n continue;\n }\n\n if (currentResourceId && isInPluralGroup && trimmedLine.includes(': (string')) {\n const match = quotedStringPattern.exec(trimmedLine);\n if (match) {\n apkStrings[currentResourceId] = [\n ...(apkStrings[currentResourceId] || []),\n normalizeStringMatch(match[0]),\n ];\n }\n continue;\n }\n }\n return apkStrings;\n}\n\n/**\n * Parses apk strings from aapt2 tool output\n *\n * @param {string} rawOutput The actual tool output\n * @param {string} configMarker The config marker. Usually\n * a language abbreviation or an empty string for the default one\n * @returns {Object} Strings ids to values mapping. Plural\n * values are represented as arrays. If no config found for the\n * given marker then an empty mapping is returned.\n */\nfunction parseAapt2Strings (rawOutput, configMarker) {\n const allLines = rawOutput.split(os.EOL);\n function extractContent (startIdx) {\n let idx = startIdx;\n const startCharPos = allLines[startIdx].indexOf('\"');\n if (startCharPos < 0) {\n return [null, idx];\n }\n let result = '';\n while (idx < allLines.length) {\n const terminationCharMatch = /\"$/.exec(allLines[idx]);\n if (terminationCharMatch) {\n const terminationCharPos = terminationCharMatch.index;\n if (startIdx === idx) {\n return [\n allLines[idx].substring(startCharPos + 1, terminationCharPos),\n idx\n ];\n }\n return [\n `${result}\\\\n${_.trimStart(allLines[idx].substring(0, terminationCharPos))}`,\n idx,\n ];\n }\n if (idx > startIdx) {\n result += `\\\\n${_.trimStart(allLines[idx])}`;\n } else {\n result += allLines[idx].substring(startCharPos + 1);\n }\n ++idx;\n }\n return [result, idx];\n }\n\n const apkStrings = {};\n let currentResourceId = null;\n let isInPluralGroup = false;\n let isInCurrentConfig = false;\n let lineIndex = 0;\n while (lineIndex < allLines.length) {\n const trimmedLine = allLines[lineIndex].trim();\n if (_.isEmpty(trimmedLine)) {\n ++lineIndex;\n continue;\n }\n\n if (['type', 'Package'].some((x) => trimmedLine.startsWith(x))) {\n currentResourceId = null;\n isInPluralGroup = false;\n isInCurrentConfig = false;\n ++lineIndex;\n continue;\n }\n\n if (trimmedLine.startsWith('resource')) {\n isInPluralGroup = false;\n currentResourceId = null;\n isInCurrentConfig = false;\n\n if (trimmedLine.includes('string/')) {\n const match = /string\\/(\\S+)/.exec(trimmedLine);\n if (match) {\n currentResourceId = match[1];\n }\n } else if (trimmedLine.includes('plurals/')) {\n const match = /plurals\\/(\\S+)/.exec(trimmedLine);\n if (match) {\n currentResourceId = match[1];\n isInPluralGroup = true;\n }\n }\n ++lineIndex;\n continue;\n }\n\n if (currentResourceId) {\n if (isInPluralGroup) {\n if (trimmedLine.startsWith('(')) {\n isInCurrentConfig = trimmedLine.startsWith(`(${configMarker})`);\n ++lineIndex;\n continue;\n }\n if (isInCurrentConfig) {\n const [content, idx] = extractContent(lineIndex);\n lineIndex = idx;\n if (_.isString(content)) {\n apkStrings[currentResourceId] = [\n ...(apkStrings[currentResourceId] || []),\n content,\n ];\n }\n }\n } else if (trimmedLine.startsWith(`(${configMarker})`)) {\n const [content, idx] = extractContent(lineIndex);\n lineIndex = idx;\n if (_.isString(content)) {\n apkStrings[currentResourceId] = content;\n }\n currentResourceId = null;\n }\n }\n ++lineIndex;\n }\n return apkStrings;\n}\n\n/**\n * Formats the config marker, which is then passed to parse.. methods\n * to make it compatible with resource formats generated by aapt(2) tool\n *\n * @param {Function} configsGetter The function whose result is a list\n * of apk configs\n * @param {string} desiredMarker The desired config marker value\n * @param {string} defaultMarker The default config marker value\n * @return {string} The formatted config marker\n */\nasync function formatConfigMarker (configsGetter, desiredMarker, defaultMarker) {\n let configMarker = desiredMarker || defaultMarker;\n if (configMarker.includes('-') && !configMarker.includes('-r')) {\n configMarker = configMarker.replace('-', '-r');\n }\n const configs = await configsGetter();\n log.debug(`Resource configurations: ${JSON.stringify(configs)}`);\n // Assume the 'en' configuration is the default one\n if (configMarker.toLowerCase().startsWith('en')\n && !configs.some((x) => x.trim() === configMarker)) {\n log.debug(`Resource configuration name '${configMarker}' is unknown. ` +\n `Replacing it with '${defaultMarker}'`);\n configMarker = defaultMarker;\n } else {\n log.debug(`Selected configuration: '${configMarker}'`);\n }\n return configMarker;\n}\n\n/**\n * Parses the output in JSON format retrieved from\n * the corresponding Appium Settings broadcast calls\n *\n * @param {string} output The actual command output\n * @param {string} entityName The name of the entity which is\n * going to be parsed\n * @returns {Object} The parsed JSON object\n * @throws {Error} If the output cannot be parsed\n * as a valid JSON\n */\nfunction parseJsonData (output, entityName) {\n if (!/\\bresult=-1\\b/.test(output) || !/\\bdata=\"/.test(output)) {\n log.debug(output);\n throw new Error(`Cannot retrieve ${entityName} from the device. ` +\n 'Check the server log for more details');\n }\n const match = /\\bdata=(\".+)/.exec(output);\n if (!match) {\n log.debug(output);\n throw new Error(`Cannot parse ${entityName} from the command output. ` +\n 'Check the server log for more details');\n }\n const jsonStr = _.trim(match[1]).replace(/(^\")|(\"$)/g, '');\n try {\n return JSON.parse(jsonStr);\n } catch (e) {\n log.debug(jsonStr);\n throw new Error(`Cannot parse ${entityName} from the resulting data string. ` +\n 'Check the server log for more details');\n }\n}\n\n/**\n * Transforms the given language and country abbreviations\n * to AVD arguments array\n *\n * @param {?string} language Language name, for example 'fr'\n * @param {?string} country Country name, for example 'CA'\n * @returns {Array<string>} The generated arguments. The\n * resulting array might be empty if both arguments are empty\n */\nfunction toAvdLocaleArgs (language, country) {\n const result = [];\n if (language && _.isString(language)) {\n result.push('-prop', `persist.sys.language=${language.toLowerCase()}`);\n }\n if (country && _.isString(country)) {\n result.push('-prop', `persist.sys.country=${country.toUpperCase()}`);\n }\n let locale;\n if (_.isString(language) && _.isString(country) && language && country) {\n locale = language.toLowerCase() + '-' + country.toUpperCase();\n } else if (language && _.isString(language)) {\n locale = language.toLowerCase();\n } else if (country && _.isString(country)) {\n locale = country;\n }\n if (locale) {\n result.push('-prop', `persist.sys.locale=${locale}`);\n }\n return result;\n}\n\n/**\n * Retrieves the full path to the Android preferences root\n *\n * @returns {?string} The full path to the folder or `null` if the folder cannot be found\n */\nasync function getAndroidPrefsRoot () {\n let location = process.env.ANDROID_EMULATOR_HOME;\n if (await dirExists(location)) {\n return location;\n }\n\n if (location) {\n log.warn(`The value of the ANDROID_EMULATOR_HOME environment variable '${location}' is not an existing directory`);\n }\n\n const home = process.env.HOME || process.env.USERPROFILE;\n if (home) {\n location = path.resolve(home, '.android');\n }\n\n if (!await dirExists(location)) {\n log.debug(`Android config root '${location}' is not an existing directory`);\n return null;\n }\n\n return location;\n}\n\n/**\n * Check if a path exists on the filesystem and is a directory\n *\n * @param {?string} location The full path to the directory\n * @returns {boolean}\n */\nasync function dirExists (location) {\n return location\n && await fs.exists(location)\n && (await fs.stat(location)).isDirectory();\n}\n\n/**\n * Escapes special characters in command line arguments.\n * This is needed to avoid possible issues with how system `spawn`\n * call handles them.\n * See https://discuss.appium.io/t/how-to-modify-wd-proxy-and-uiautomator2-source-code-to-support-unicode/33466\n * for more details.\n *\n * @param {string} arg Non-escaped argument string\n * @returns The escaped argument\n */\nfunction escapeShellArg (arg) {\n arg = `${arg}`;\n if (system.isWindows()) {\n return /[&|^\\s]/.test(arg) ? `\"${arg.replace(/\"/g, '\"\"')}\"` : arg;\n }\n return arg.replace(/&/g, '\\\\&');\n}\n\n/**\n * Parses the name of launchable package activity\n * from dumpsys output.\n *\n * @param {string} dumpsys the actual dumpsys output\n * @returns {string[]} Either the fully qualified\n * activity name as a single list item or an empty list if nothing could be parsed.\n * In Android 6 and older there is no reliable way to determine\n * the category name for the given activity, so this API just\n * returns all activity names belonging to 'android.intent.action.MAIN'\n * with the expectation that the app manifest could be parsed next\n * in order to determine category names for these.\n */\nfunction parseLaunchableActivityNames (dumpsys) {\n const mainActivityNameRe = new RegExp(`^\\\\s*${_.escapeRegExp(MAIN_ACTION)}:$`);\n const categoryNameRe = /^\\s*Category:\\s+\"([a-zA-Z0-9._/-]+)\"$/;\n const blocks = [];\n let blockStartIndent;\n let block = [];\n for (const line of dumpsys.split('\\n').map(_.trimEnd)) {\n const currentIndent = line.length - _.trimStart(line).length;\n if (mainActivityNameRe.test(line)) {\n blockStartIndent = currentIndent;\n if (!_.isEmpty(block)) {\n blocks.push(block);\n block = [];\n }\n continue;\n }\n if (_.isNil(blockStartIndent)) {\n continue;\n }\n\n if (currentIndent > blockStartIndent) {\n block.push(line);\n } else {\n if (!_.isEmpty(block)) {\n blocks.push(block);\n block = [];\n }\n blockStartIndent = null;\n }\n }\n if (!_.isEmpty(block)) {\n blocks.push(block);\n }\n\n const result = [];\n for (const item of blocks) {\n let hasCategory = false;\n let isLauncherCategory = false;\n for (const line of item) {\n const match = categoryNameRe.exec(line);\n if (!match) {\n continue;\n }\n\n hasCategory = true;\n isLauncherCategory = match[1] === LAUNCHER_CATEGORY;\n break;\n }\n // On older Android versions the category name\n // might not be listed, so we just try to fetch\n // all matches instead\n if (hasCategory && !isLauncherCategory) {\n continue;\n }\n\n for (const activityNameStr of item.map(_.trim).filter(Boolean)) {\n const fqActivityName = activityNameStr.split(/\\s+/)[1];\n if (!matchComponentName(fqActivityName)) {\n continue;\n }\n\n if (isLauncherCategory) {\n return [fqActivityName];\n }\n result.push(fqActivityName);\n }\n }\n return result;\n}\n\n/**\n * Check if the given string is a valid component name\n *\n * @param {string} classString The string to verify\n * @return {?Array<Match>} The result of Regexp.exec operation\n * or _null_ if no matches are found\n */\nfunction matchComponentName (classString) {\n // some.package/some.package.Activity\n return /^[a-z0-9./_]+$/i.exec(classString);\n}\n\nexport {\n getAndroidPlatformAndPath, unzipFile,\n getIMEListFromOutput, getJavaForOs, isShowingLockscreen, isCurrentFocusOnKeyguard,\n getSurfaceOrientation, isScreenOnFully, buildStartCmd, getJavaHome,\n getSdkToolsVersion, getApksignerForOs, getBuildToolsDirs,\n getApkanalyzerForOs, getOpenSslForOs, extractMatchingPermissions, APKS_EXTENSION,\n APK_INSTALL_TIMEOUT, APKS_INSTALL_TIMEOUT, buildInstallArgs, APK_EXTENSION,\n DEFAULT_ADB_EXEC_TIMEOUT, parseManifest, parseAaptStrings, parseAapt2Strings,\n formatConfigMarker, parseJsonData, unsignApk, toAvdLocaleArgs, requireSdkRoot,\n getSdkRootFromEnv, getAndroidPrefsRoot, dirExists, escapeShellArg,\n parseLaunchableActivityNames, matchComponentName, getModuleRoot\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"helpers.js","names":["APKS_EXTENSION","APK_EXTENSION","APK_INSTALL_TIMEOUT","APKS_INSTALL_TIMEOUT","DEFAULT_ADB_EXEC_TIMEOUT","MAIN_ACTION","LAUNCHER_CATEGORY","MODULE_NAME","getModuleRoot","_","memoize","moduleRoot","path","dirname","resolve","__filename","isAtFsRoot","manifestPath","join","fs","exists","JSON","parse","readFile","name","ign","length","Error","getResourcePath","relPath","resultPath","getSdkRootFromEnv","process","env","ANDROID_HOME","ANDROID_SDK_ROOT","requireSdkRoot","customRoot","sdkRoot","docMsg","isEmpty","stats","stat","isDirectory","getAndroidPlatformAndPath","propsPaths","glob","cwd","absolute","platformsMapping","propsPath","propsContent","platformPath","platform","basename","match","exec","log","warn","parseInt","recentSdkVersion","keys","sort","reverse","result","debug","stringify","unzipFile","zipPath","dstRoot","zip","assertValidZip","extractAllTo","unsignApk","apkPath","tmpRoot","tempDir","openDir","metaInfFolderName","hasMetaInf","readEntries","entry","fileName","startsWith","tmpZipRoot","rimraf","tmpResultPath","toArchive","unlink","mv","getIMEListFromOutput","stdout","engines","line","split","push","trim","replace","getJavaHome","JAVA_HOME","getJavaForOs","javaHome","errMsg","err","message","executableName","system","isWindows","which","getOpenSslForOs","binaryName","getApksignerForOs","sysHelpers","getBinaryFromSdkRoot","getApkanalyzerForOs","isShowingLockscreen","dumpsys","some","x","includes","every","test","isCurrentFocusOnKeyguard","m","getSurfaceOrientation","isScreenOnFully","buildStartCmd","startAppOptions","apiLevel","user","waitForLaunch","pkg","activity","action","category","stopApp","flags","cmd","util","hasValue","optionalIntentArguments","parseKeyValue","str","space","indexOf","substring","re","args","apply","flag","flagPos","prevArgs","getSdkToolsVersion","androidHome","propertiesPath","propertiesContent","versionMatcher","RegExp","major","minor","build","getBuildToolsDirs","buildToolsDirs","map","dir","a","b","semver","rcompare","pair","pairs","B","mtime","valueOf","info","extractMatchingPermissions","dumpsysOutput","groupNames","grantedState","groupPatternByName","groupName","escapeRegExp","indentPattern","permissionNamePattern","grantedStatePattern","groupMatch","lines","titleIndent","search","slice","currentIndent","permissionNameMatch","item","permission","grantedStateMatch","granted","filteredResult","filter","isBoolean","pluralize","buildInstallArgs","options","allowTestPackages","useSdcard","grantPermissions","partialInstall","parseManifest","manifest","package","versionCode","versionName","application","activities","activityAliases","enabled","intentFilters","actions","categories","isMainAction","isLauncherCategory","parseAaptStrings","rawOutput","configMarker","normalizeStringMatch","s","apkStrings","isInConfig","currentResourceId","isInPluralGroup","quotedStringPattern","os","EOL","trimmedLine","parseAapt2Strings","allLines","extractContent","startIdx","idx","startCharPos","terminationCharMatch","terminationCharPos","index","trimStart","isInCurrentConfig","lineIndex","content","isString","formatConfigMarker","configsGetter","desiredMarker","defaultMarker","configs","toLowerCase","parseJsonData","output","entityName","jsonStr","e","toAvdLocaleArgs","language","country","toUpperCase","locale","getAndroidPrefsRoot","location","ANDROID_EMULATOR_HOME","dirExists","home","HOME","USERPROFILE","escapeShellArg","arg","parseLaunchableActivityNames","mainActivityNameRe","categoryNameRe","blocks","blockStartIndent","block","trimEnd","isNil","hasCategory","activityNameStr","Boolean","fqActivityName","matchComponentName","classString"],"sources":["../../lib/helpers.js"],"sourcesContent":["import path from 'path';\nimport { system, fs, zip, util, tempDir } from '@appium/support';\nimport log from './logger.js';\nimport _ from 'lodash';\nimport B from 'bluebird';\nimport semver from 'semver';\nimport os from 'os';\n\nconst APKS_EXTENSION = '.apks';\nconst APK_EXTENSION = '.apk';\nconst APK_INSTALL_TIMEOUT = 60000;\nconst APKS_INSTALL_TIMEOUT = APK_INSTALL_TIMEOUT * 2;\nconst DEFAULT_ADB_EXEC_TIMEOUT = 20000; // in milliseconds\nconst MAIN_ACTION = 'android.intent.action.MAIN';\nconst LAUNCHER_CATEGORY = 'android.intent.category.LAUNCHER';\nconst MODULE_NAME = 'appium-adb';\n\n/**\n * Calculates the absolute path to the current module's root folder\n *\n * @returns {Promise<string>} The full path to module root\n * @throws {Error} If the current module root folder cannot be determined\n */\nconst getModuleRoot = _.memoize(async function getModuleRoot () {\n let moduleRoot = path.dirname(path.resolve(__filename));\n let isAtFsRoot = false;\n while (!isAtFsRoot) {\n const manifestPath = path.join(moduleRoot, 'package.json');\n try {\n if (await fs.exists(manifestPath) &&\n JSON.parse(await fs.readFile(manifestPath, 'utf8')).name === MODULE_NAME) {\n return moduleRoot;\n }\n } catch (ign) {}\n moduleRoot = path.dirname(moduleRoot);\n isAtFsRoot = moduleRoot.length <= path.dirname(moduleRoot).length;\n }\n if (isAtFsRoot) {\n throw new Error(`Cannot find the root folder of the ${MODULE_NAME} Node.js module`);\n }\n return moduleRoot;\n});\n\n/**\n * Calculates the absolsute path to the given resource\n *\n * @param {string} relPath Relative path to the resource starting from the current module root\n * @returns {Promise<string>} The full path to the resource\n * @throws {Error} If the absolute resource path cannot be determined\n */\nconst getResourcePath = _.memoize(async function getResourcePath (relPath) {\n const moduleRoot = await getModuleRoot();\n const resultPath = path.resolve(moduleRoot, relPath);\n if (!await fs.exists(resultPath)) {\n throw new Error(`Cannot find the resource '${relPath}' under the '${moduleRoot}' ` +\n `folder of ${MODULE_NAME} Node.js module`);\n }\n return resultPath;\n});\n\n/**\n * Retrieves the actual path to SDK root folder from the system environment\n *\n * @return {?string} The full path to the SDK root folder\n */\nfunction getSdkRootFromEnv () {\n return process.env.ANDROID_HOME || process.env.ANDROID_SDK_ROOT;\n}\n\n/**\n * Retrieves the actual path to SDK root folder\n *\n * @return {string} The full path to the SDK root folder\n * @throws {Error} If either the corresponding env variable is unset or is\n * pointing to an invalid file system entry\n */\nasync function requireSdkRoot (customRoot = null) {\n const sdkRoot = customRoot || getSdkRootFromEnv();\n const docMsg = 'Read https://developer.android.com/studio/command-line/variables for more details';\n if (_.isEmpty(sdkRoot)) {\n throw new Error(`Neither ANDROID_HOME nor ANDROID_SDK_ROOT environment variable was exported. ${docMsg}`);\n }\n\n if (!await fs.exists(sdkRoot)) {\n throw new Error(`The Android SDK root folder '${sdkRoot}' does not exist on the local file system. ${docMsg}`);\n }\n const stats = await fs.stat(sdkRoot);\n if (!stats.isDirectory()) {\n throw new Error(`The Android SDK root '${sdkRoot}' must be a folder. ${docMsg}`);\n }\n return sdkRoot;\n}\n\n/**\n * @typedef {Object} PlatformInfo\n * @property {?string} platform - The platform name, for example `android-24`\n * or `null` if it cannot be found\n * @property {?string} platformPath - Full path to the platform SDK folder\n * or `null` if it cannot be found\n */\n\n/**\n * Retrieve the path to the recent installed Android platform.\n *\n * @return {PlatformInfo} The resulting path to the newest installed platform.\n */\nasync function getAndroidPlatformAndPath (sdkRoot) {\n const propsPaths = await fs.glob('*/build.prop', {\n cwd: path.resolve(sdkRoot, 'platforms'),\n absolute: true,\n });\n const platformsMapping = {};\n for (const propsPath of propsPaths) {\n const propsContent = await fs.readFile(propsPath, 'utf-8');\n const platformPath = path.dirname(propsPath);\n const platform = path.basename(platformPath);\n const match = /ro\\.build\\.version\\.sdk=(\\d+)/.exec(propsContent);\n if (!match) {\n log.warn(`Cannot read the SDK version from '${propsPath}'. Skipping '${platform}'`);\n continue;\n }\n platformsMapping[parseInt(match[1], 10)] = {\n platform,\n platformPath,\n };\n }\n if (_.isEmpty(platformsMapping)) {\n log.warn(`Found zero platform folders at '${path.resolve(sdkRoot, 'platforms')}'. ` +\n `Do you have any Android SDKs installed?`);\n return {\n platform: null,\n platformPath: null,\n };\n }\n\n const recentSdkVersion = _.keys(platformsMapping).sort().reverse()[0];\n const result = platformsMapping[recentSdkVersion];\n log.debug(`Found the most recent Android platform: ${JSON.stringify(result)}`);\n return result;\n}\n\nasync function unzipFile (zipPath, dstRoot = path.dirname(zipPath)) {\n log.debug(`Unzipping '${zipPath}' to '${dstRoot}'`);\n await zip.assertValidZip(zipPath);\n await zip.extractAllTo(zipPath, dstRoot);\n log.debug('Unzip successful');\n}\n\n/**\n * Unsigns the given apk by removing the\n * META-INF folder recursively from the archive.\n * !!! The function overwrites the given apk after successful unsigning !!!\n *\n * @param {string} apkPath The path to the apk\n * @returns {boolean} `true` if the apk has been successfully\n * unsigned and overwritten\n * @throws {Error} if there was an error during the unsign operation\n */\nasync function unsignApk (apkPath) {\n const tmpRoot = await tempDir.openDir();\n const metaInfFolderName = 'META-INF';\n try {\n let hasMetaInf = false;\n await zip.readEntries(apkPath, ({entry}) => {\n hasMetaInf = entry.fileName.startsWith(`${metaInfFolderName}/`);\n // entries iteration stops after `false` is returned\n return !hasMetaInf;\n });\n if (!hasMetaInf) {\n return false;\n }\n const tmpZipRoot = path.resolve(tmpRoot, 'apk');\n await zip.extractAllTo(apkPath, tmpZipRoot);\n await fs.rimraf(path.resolve(tmpZipRoot, metaInfFolderName));\n const tmpResultPath = path.resolve(tmpRoot, path.basename(apkPath));\n await zip.toArchive(tmpResultPath, {\n cwd: tmpZipRoot,\n });\n await fs.unlink(apkPath);\n await fs.mv(tmpResultPath, apkPath);\n return true;\n } finally {\n await fs.rimraf(tmpRoot);\n }\n}\n\nfunction getIMEListFromOutput (stdout) {\n let engines = [];\n for (let line of stdout.split('\\n')) {\n if (line.length > 0 && line[0] !== ' ') {\n // remove newline and trailing colon, and add to the list\n engines.push(line.trim().replace(/:$/, ''));\n }\n }\n return engines;\n}\n\nconst getJavaHome = _.memoize(async function getJavaHome () {\n const result = process.env.JAVA_HOME;\n if (!result) {\n throw new Error('The JAVA_HOME environment variable is not set for the current process');\n }\n if (!await fs.exists(result)) {\n throw new Error(`The JAVA_HOME location '${result}' must exist`);\n }\n const stats = await fs.stat(result);\n if (!stats.isDirectory()) {\n throw new Error(`The JAVA_HOME location '${result}' must be a valid folder`);\n }\n return result;\n});\n\nconst getJavaForOs = _.memoize(async function getJavaForOs () {\n let javaHome;\n let errMsg;\n try {\n javaHome = await getJavaHome();\n } catch (err) {\n errMsg = err.message;\n }\n const executableName = `java${system.isWindows() ? '.exe' : ''}`;\n if (javaHome) {\n const resultPath = path.resolve(javaHome, 'bin', executableName);\n if (await fs.exists(resultPath)) {\n return resultPath;\n }\n }\n try {\n return await fs.which(executableName);\n } catch (ign) {}\n throw new Error(`The '${executableName}' binary could not be found ` +\n `neither in PATH nor under JAVA_HOME (${errMsg || path.resolve(javaHome, 'bin')})`);\n});\n\nconst getOpenSslForOs = async function () {\n const binaryName = `openssl${system.isWindows() ? '.exe' : ''}`;\n try {\n return await fs.which(binaryName);\n } catch (err) {\n throw new Error('The openssl tool must be installed on the system and available on the path');\n }\n};\n\n/**\n * Get the absolute path to apksigner tool\n *\n * @param {Object} sysHelpers - An instance containing systemCallMethods helper methods\n * @returns {string} An absolute path to apksigner tool.\n * @throws {Error} If the tool is not present on the local file system.\n */\nasync function getApksignerForOs (sysHelpers) {\n return await sysHelpers.getBinaryFromSdkRoot('apksigner.jar');\n}\n\n/**\n * Get the absolute path to apkanalyzer tool.\n * https://developer.android.com/studio/command-line/apkanalyzer.html\n *\n * @param {Object} sysHelpers - An instance containing systemCallMethods helper methods\n * @returns {string} An absolute path to apkanalyzer tool.\n * @throws {Error} If the tool is not present on the local file system.\n */\nasync function getApkanalyzerForOs (sysHelpers) {\n return await sysHelpers.getBinaryFromSdkRoot('apkanalyzer');\n}\n\n/**\n * Checks mShowingLockscreen or mDreamingLockscreen in dumpsys output to determine\n * if lock screen is showing\n *\n * A note: `adb shell dumpsys trust` performs better while detecting the locked screen state\n * in comparison to `adb dumpsys window` output parsing.\n * But the trust command does not work for `Swipe` unlock pattern.\n *\n * In some Android devices (Probably around Android 10+), `mShowingLockscreen` and `mDreamingLockscreen`\n * do not work to detect lock status. Instead, keyguard preferences helps to detect the lock condition.\n * Some devices such as Android TV do not have keyguard, so we should keep\n * screen condition as this primary method.\n *\n * @param {string} dumpsys - The output of dumpsys window command.\n * @return {boolean} True if lock screen is showing.\n */\nfunction isShowingLockscreen (dumpsys) {\n return _.some(['mShowingLockscreen=true', 'mDreamingLockscreen=true'], (x) => dumpsys.includes(x))\n // `mIsShowing` and `mInputRestricted` are `true` in lock condition. `false` is unlock condition.\n || _.every([/KeyguardStateMonitor[\\n\\s]+mIsShowing=true/, /\\s+mInputRestricted=true/], (x) => x.test(dumpsys));\n}\n\n/*\n * Checks mCurrentFocus in dumpsys output to determine if Keyguard is activated\n */\nfunction isCurrentFocusOnKeyguard (dumpsys) {\n let m = /mCurrentFocus.+Keyguard/gi.exec(dumpsys);\n return (m && m.length && m[0]) ? true : false;\n}\n\n/*\n * Reads SurfaceOrientation in dumpsys output\n */\nfunction getSurfaceOrientation (dumpsys) {\n let m = /SurfaceOrientation: \\d/gi.exec(dumpsys);\n return m && parseInt(m[0].split(':')[1], 10);\n}\n\n/*\n * Checks mScreenOnFully in dumpsys output to determine if screen is showing\n * Default is true\n */\nfunction isScreenOnFully (dumpsys) {\n let m = /mScreenOnFully=\\w+/gi.exec(dumpsys);\n return !m || // if information is missing we assume screen is fully on\n (m && m.length > 0 && m[0].split('=')[1] === 'true') || false;\n}\n\n/**\n * Builds command line representation for the given\n * application startup options\n *\n * @param {StartAppOptions} startAppOptions - Application options mapping\n * @param {number} apiLevel - The actual OS API level\n * @returns {Array<String>} The actual command line array\n */\nfunction buildStartCmd (startAppOptions, apiLevel) {\n const {\n user,\n waitForLaunch,\n pkg,\n activity,\n action,\n category,\n stopApp,\n flags,\n } = startAppOptions;\n const cmd = ['am', 'start'];\n if (util.hasValue(user)) {\n cmd.push('--user', user);\n }\n if (waitForLaunch) {\n cmd.push('-W');\n }\n if (activity && pkg) {\n cmd.push('-n', `${pkg}/${activity}`);\n }\n if (stopApp && apiLevel >= 15) {\n cmd.push('-S');\n }\n if (action) {\n cmd.push('-a', action);\n }\n if (category) {\n cmd.push('-c', category);\n }\n if (flags) {\n cmd.push('-f', flags);\n }\n if (startAppOptions.optionalIntentArguments) {\n // expect optionalIntentArguments to be a single string of the form:\n // \"-flag key\"\n // \"-flag key value\"\n // or a combination of these (e.g., \"-flag1 key1 -flag2 key2 value2\")\n\n // take a string and parse out the part before any spaces, and anything after\n // the first space\n let parseKeyValue = function (str) {\n str = str.trim();\n let space = str.indexOf(' ');\n if (space === -1) {\n return str.length ? [str] : [];\n } else {\n return [str.substring(0, space).trim(), str.substring(space + 1).trim()];\n }\n };\n\n // cycle through the optionalIntentArguments and pull out the arguments\n // add a space initially so flags can be distinguished from arguments that\n // have internal hyphens\n let optionalIntentArguments = ` ${startAppOptions.optionalIntentArguments}`;\n let re = / (-[^\\s]+) (.+)/;\n while (true) { // eslint-disable-line no-constant-condition\n let args = re.exec(optionalIntentArguments);\n if (!args) {\n if (optionalIntentArguments.length) {\n // no more flags, so the remainder can be treated as 'key' or 'key value'\n cmd.push.apply(cmd, parseKeyValue(optionalIntentArguments));\n }\n // we are done\n break;\n }\n\n // take the flag and see if it is at the beginning of the string\n // if it is not, then it means we have been through already, and\n // what is before the flag is the argument for the previous flag\n let flag = args[1];\n let flagPos = optionalIntentArguments.indexOf(flag);\n if (flagPos !== 0) {\n let prevArgs = optionalIntentArguments.substring(0, flagPos);\n cmd.push.apply(cmd, parseKeyValue(prevArgs));\n }\n\n // add the flag, as there are no more earlier arguments\n cmd.push(flag);\n\n // make optionalIntentArguments hold the remainder\n optionalIntentArguments = args[2];\n }\n }\n return cmd;\n}\n\nconst getSdkToolsVersion = _.memoize(async function getSdkToolsVersion () {\n const androidHome = process.env.ANDROID_HOME;\n if (!androidHome) {\n throw new Error('ANDROID_HOME environment variable is expected to be set');\n }\n const propertiesPath = path.resolve(androidHome, 'tools', 'source.properties');\n if (!await fs.exists(propertiesPath)) {\n log.warn(`Cannot find ${propertiesPath} file to read SDK version from`);\n return;\n }\n const propertiesContent = await fs.readFile(propertiesPath, 'utf8');\n const versionMatcher = new RegExp(/Pkg\\.Revision=(\\d+)\\.?(\\d+)?\\.?(\\d+)?/);\n const match = versionMatcher.exec(propertiesContent);\n if (match) {\n return {\n major: parseInt(match[1], 10),\n minor: match[2] ? parseInt(match[2], 10) : 0,\n build: match[3] ? parseInt(match[3], 10) : 0\n };\n }\n log.warn(`Cannot parse \"Pkg.Revision\" value from ${propertiesPath}`);\n});\n\n/**\n * Retrieves full paths to all 'build-tools' subfolders under the particular\n * SDK root folder\n *\n * @param {string} sdkRoot - The full path to the Android SDK root folder\n * @returns {Array<string>} The full paths to the resulting folders sorted by\n * modification date (the newest comes first) or an empty list if no macthes were found\n */\nconst getBuildToolsDirs = _.memoize(async function getBuildToolsDirs (sdkRoot) {\n let buildToolsDirs = await fs.glob('*/', {\n cwd: path.resolve(sdkRoot, 'build-tools'),\n absolute: true,\n });\n try {\n buildToolsDirs = buildToolsDirs\n .map((dir) => [path.basename(dir), dir])\n .sort((a, b) => semver.rcompare(a[0], b[0]))\n .map((pair) => pair[1]);\n } catch (err) {\n log.warn(`Cannot sort build-tools folders ${JSON.stringify(buildToolsDirs.map((dir) => path.basename(dir)))} ` +\n `by semantic version names.`);\n log.warn(`Falling back to sorting by modification date. Original error: ${err.message}`);\n const pairs = await B.map(buildToolsDirs, async (dir) => [(await fs.stat(dir)).mtime.valueOf(), dir]);\n buildToolsDirs = pairs\n .sort((a, b) => a[0] < b[0])\n .map((pair) => pair[1]);\n }\n log.info(`Found ${buildToolsDirs.length} 'build-tools' folders under '${sdkRoot}' (newest first):`);\n for (let dir of buildToolsDirs) {\n log.info(` ${dir}`);\n }\n return buildToolsDirs;\n});\n\n/**\n * Retrieves the list of permission names encoded in `dumpsys package` command output.\n *\n * @param {string} dumpsysOutput - The actual command output.\n * @param {Array<string>} groupNames - The list of group names to list permissions for.\n * @param {?boolean} grantedState - The expected state of `granted` attribute to filter with.\n * No filtering is done if the parameter is not set.\n * @returns {Array<string>} The list of matched permission names or an empty list if no matches were found.\n */\nconst extractMatchingPermissions = function (dumpsysOutput, groupNames, grantedState = null) {\n const groupPatternByName = (groupName) => new RegExp(`^(\\\\s*${_.escapeRegExp(groupName)} permissions:[\\\\s\\\\S]+)`, 'm');\n const indentPattern = /\\S|$/;\n const permissionNamePattern = /android\\.\\w*\\.?permission\\.\\w+/;\n const grantedStatePattern = /\\bgranted=(\\w+)/;\n const result = [];\n for (const groupName of groupNames) {\n const groupMatch = groupPatternByName(groupName).exec(dumpsysOutput);\n if (!groupMatch) {\n continue;\n }\n\n const lines = groupMatch[1].split('\\n');\n if (lines.length < 2) {\n continue;\n }\n\n const titleIndent = lines[0].search(indentPattern);\n for (const line of lines.slice(1)) {\n const currentIndent = line.search(indentPattern);\n if (currentIndent <= titleIndent) {\n break;\n }\n\n const permissionNameMatch = permissionNamePattern.exec(line);\n if (!permissionNameMatch) {\n continue;\n }\n const item = {\n permission: permissionNameMatch[0],\n };\n const grantedStateMatch = grantedStatePattern.exec(line);\n if (grantedStateMatch) {\n item.granted = grantedStateMatch[1] === 'true';\n }\n result.push(item);\n }\n }\n\n const filteredResult = result\n .filter((item) => !_.isBoolean(grantedState) || item.granted === grantedState)\n .map((item) => item.permission);\n log.debug(`Retrieved ${util.pluralize('permission', filteredResult.length, true)} ` +\n `from ${groupNames} ${util.pluralize('group', groupNames.length, false)}`);\n return filteredResult;\n};\n\n/**\n * @typedef {Object} InstallOptions\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 * @property {boolean} partialInstall [false] - Install apks partially. It is used for 'install-multiple'.\n * https://android.stackexchange.com/questions/111064/what-is-a-partial-application-install-via-adb\n */\n\n/**\n * Transforms given options into the list of `adb install.install-multiple` command arguments\n *\n * @param {number} apiLevel - The current API level\n * @param {?InstallOptions} options - The options mapping to transform\n * @returns {Array<String>} The array of arguments\n */\nfunction buildInstallArgs (apiLevel, options = {}) {\n const result = [];\n\n if (!util.hasValue(options.replace) || options.replace) {\n result.push('-r');\n }\n if (options.allowTestPackages) {\n result.push('-t');\n }\n if (options.useSdcard) {\n result.push('-s');\n }\n if (options.grantPermissions) {\n if (apiLevel < 23) {\n log.debug(`Skipping permissions grant option, since ` +\n `the current API level ${apiLevel} does not support applications ` +\n `permissions customization`);\n } else {\n result.push('-g');\n }\n }\n // For multiple-install\n if (options.partialInstall) {\n result.push('-p');\n }\n\n return result;\n}\n\n/**\n * @typedef {Object} ManifestInfo\n * @property {string} pkg - The application identifier\n * @property {string} activity - The name of the main package activity\n * @property {?number} versionCode - The version code number (might be `NaN`)\n * @property {?string} versionName - The version name (might be `null`)\n */\n\n/**\n * Perform parsing of the manifest object in order\n * to extract some vital values from it\n *\n * @param {object} manifest The manifest content formatted as JSON\n * See https://www.npmjs.com/package/adbkit-apkreader for detailed format description\n * @returns {ManifestInfo}\n */\nfunction parseManifest (manifest) {\n const result = {\n pkg: manifest.package,\n versionCode: parseInt(manifest.versionCode, 10),\n versionName: manifest.versionName || null,\n };\n if (!manifest.application) {\n return result;\n }\n\n // Look for enabled activity or activity-alias with\n // action == android.intent.action.MAIN and\n // category == android.intent.category.LAUNCHER\n for (const activity of [\n ...manifest.application.activities,\n ...manifest.application.activityAliases,\n ]) {\n if (activity.enabled === false || _.isEmpty(activity.intentFilters)) {\n continue;\n }\n\n for (const {actions, categories} of activity.intentFilters) {\n if (_.isEmpty(actions) || _.isEmpty(categories)) {\n continue;\n }\n\n const isMainAction = actions.some(({name}) => name === MAIN_ACTION);\n const isLauncherCategory = categories.some(({name}) => name === LAUNCHER_CATEGORY);\n if (isMainAction && isLauncherCategory) {\n result.activity = activity.name;\n return result;\n }\n }\n }\n return result;\n}\n\n/**\n * Parses apk strings from aapt tool output\n *\n * @param {string} rawOutput The actual tool output\n * @param {string} configMarker The config marker. Usually\n * a language abbreviation or `(default)`\n * @returns {Object} Strings ids to values mapping. Plural\n * values are represented as arrays. If no config found for the\n * given marker then an empty mapping is returned.\n */\nfunction parseAaptStrings (rawOutput, configMarker) {\n const normalizeStringMatch = function (s) {\n return s.replace(/\"$/, '').replace(/^\"/, '').replace(/\\\\\"/g, '\"');\n };\n\n const apkStrings = {};\n let isInConfig = false;\n let currentResourceId = null;\n let isInPluralGroup = false;\n // The pattern matches any quoted content including escaped quotes\n const quotedStringPattern = /\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\"/;\n for (const line of rawOutput.split(os.EOL)) {\n const trimmedLine = line.trim();\n if (_.isEmpty(trimmedLine)) {\n continue;\n }\n\n if (['config', 'type', 'spec', 'Package'].some((x) => trimmedLine.startsWith(x))) {\n isInConfig = trimmedLine.startsWith(`config ${configMarker}:`);\n currentResourceId = null;\n isInPluralGroup = false;\n continue;\n }\n\n if (!isInConfig) {\n continue;\n }\n\n if (trimmedLine.startsWith('resource')) {\n isInPluralGroup = false;\n currentResourceId = null;\n\n if (trimmedLine.includes(':string/')) {\n const match = /:string\\/(\\S+):/.exec(trimmedLine);\n if (match) {\n currentResourceId = match[1];\n }\n } else if (trimmedLine.includes(':plurals/')) {\n const match = /:plurals\\/(\\S+):/.exec(trimmedLine);\n if (match) {\n currentResourceId = match[1];\n isInPluralGroup = true;\n }\n }\n continue;\n }\n\n if (currentResourceId && trimmedLine.startsWith('(string')) {\n const match = quotedStringPattern.exec(trimmedLine);\n if (match) {\n apkStrings[currentResourceId] = normalizeStringMatch(match[0]);\n }\n currentResourceId = null;\n continue;\n }\n\n if (currentResourceId && isInPluralGroup && trimmedLine.includes(': (string')) {\n const match = quotedStringPattern.exec(trimmedLine);\n if (match) {\n apkStrings[currentResourceId] = [\n ...(apkStrings[currentResourceId] || []),\n normalizeStringMatch(match[0]),\n ];\n }\n continue;\n }\n }\n return apkStrings;\n}\n\n/**\n * Parses apk strings from aapt2 tool output\n *\n * @param {string} rawOutput The actual tool output\n * @param {string} configMarker The config marker. Usually\n * a language abbreviation or an empty string for the default one\n * @returns {Object} Strings ids to values mapping. Plural\n * values are represented as arrays. If no config found for the\n * given marker then an empty mapping is returned.\n */\nfunction parseAapt2Strings (rawOutput, configMarker) {\n const allLines = rawOutput.split(os.EOL);\n function extractContent (startIdx) {\n let idx = startIdx;\n const startCharPos = allLines[startIdx].indexOf('\"');\n if (startCharPos < 0) {\n return [null, idx];\n }\n let result = '';\n while (idx < allLines.length) {\n const terminationCharMatch = /\"$/.exec(allLines[idx]);\n if (terminationCharMatch) {\n const terminationCharPos = terminationCharMatch.index;\n if (startIdx === idx) {\n return [\n allLines[idx].substring(startCharPos + 1, terminationCharPos),\n idx\n ];\n }\n return [\n `${result}\\\\n${_.trimStart(allLines[idx].substring(0, terminationCharPos))}`,\n idx,\n ];\n }\n if (idx > startIdx) {\n result += `\\\\n${_.trimStart(allLines[idx])}`;\n } else {\n result += allLines[idx].substring(startCharPos + 1);\n }\n ++idx;\n }\n return [result, idx];\n }\n\n const apkStrings = {};\n let currentResourceId = null;\n let isInPluralGroup = false;\n let isInCurrentConfig = false;\n let lineIndex = 0;\n while (lineIndex < allLines.length) {\n const trimmedLine = allLines[lineIndex].trim();\n if (_.isEmpty(trimmedLine)) {\n ++lineIndex;\n continue;\n }\n\n if (['type', 'Package'].some((x) => trimmedLine.startsWith(x))) {\n currentResourceId = null;\n isInPluralGroup = false;\n isInCurrentConfig = false;\n ++lineIndex;\n continue;\n }\n\n if (trimmedLine.startsWith('resource')) {\n isInPluralGroup = false;\n currentResourceId = null;\n isInCurrentConfig = false;\n\n if (trimmedLine.includes('string/')) {\n const match = /string\\/(\\S+)/.exec(trimmedLine);\n if (match) {\n currentResourceId = match[1];\n }\n } else if (trimmedLine.includes('plurals/')) {\n const match = /plurals\\/(\\S+)/.exec(trimmedLine);\n if (match) {\n currentResourceId = match[1];\n isInPluralGroup = true;\n }\n }\n ++lineIndex;\n continue;\n }\n\n if (currentResourceId) {\n if (isInPluralGroup) {\n if (trimmedLine.startsWith('(')) {\n isInCurrentConfig = trimmedLine.startsWith(`(${configMarker})`);\n ++lineIndex;\n continue;\n }\n if (isInCurrentConfig) {\n const [content, idx] = extractContent(lineIndex);\n lineIndex = idx;\n if (_.isString(content)) {\n apkStrings[currentResourceId] = [\n ...(apkStrings[currentResourceId] || []),\n content,\n ];\n }\n }\n } else if (trimmedLine.startsWith(`(${configMarker})`)) {\n const [content, idx] = extractContent(lineIndex);\n lineIndex = idx;\n if (_.isString(content)) {\n apkStrings[currentResourceId] = content;\n }\n currentResourceId = null;\n }\n }\n ++lineIndex;\n }\n return apkStrings;\n}\n\n/**\n * Formats the config marker, which is then passed to parse.. methods\n * to make it compatible with resource formats generated by aapt(2) tool\n *\n * @param {Function} configsGetter The function whose result is a list\n * of apk configs\n * @param {string} desiredMarker The desired config marker value\n * @param {string} defaultMarker The default config marker value\n * @return {string} The formatted config marker\n */\nasync function formatConfigMarker (configsGetter, desiredMarker, defaultMarker) {\n let configMarker = desiredMarker || defaultMarker;\n if (configMarker.includes('-') && !configMarker.includes('-r')) {\n configMarker = configMarker.replace('-', '-r');\n }\n const configs = await configsGetter();\n log.debug(`Resource configurations: ${JSON.stringify(configs)}`);\n // Assume the 'en' configuration is the default one\n if (configMarker.toLowerCase().startsWith('en')\n && !configs.some((x) => x.trim() === configMarker)) {\n log.debug(`Resource configuration name '${configMarker}' is unknown. ` +\n `Replacing it with '${defaultMarker}'`);\n configMarker = defaultMarker;\n } else {\n log.debug(`Selected configuration: '${configMarker}'`);\n }\n return configMarker;\n}\n\n/**\n * Parses the output in JSON format retrieved from\n * the corresponding Appium Settings broadcast calls\n *\n * @param {string} output The actual command output\n * @param {string} entityName The name of the entity which is\n * going to be parsed\n * @returns {Object} The parsed JSON object\n * @throws {Error} If the output cannot be parsed\n * as a valid JSON\n */\nfunction parseJsonData (output, entityName) {\n if (!/\\bresult=-1\\b/.test(output) || !/\\bdata=\"/.test(output)) {\n log.debug(output);\n throw new Error(`Cannot retrieve ${entityName} from the device. ` +\n 'Check the server log for more details');\n }\n const match = /\\bdata=(\".+)/.exec(output);\n if (!match) {\n log.debug(output);\n throw new Error(`Cannot parse ${entityName} from the command output. ` +\n 'Check the server log for more details');\n }\n const jsonStr = _.trim(match[1]).replace(/(^\")|(\"$)/g, '');\n try {\n return JSON.parse(jsonStr);\n } catch (e) {\n log.debug(jsonStr);\n throw new Error(`Cannot parse ${entityName} from the resulting data string. ` +\n 'Check the server log for more details');\n }\n}\n\n/**\n * Transforms the given language and country abbreviations\n * to AVD arguments array\n *\n * @param {?string} language Language name, for example 'fr'\n * @param {?string} country Country name, for example 'CA'\n * @returns {Array<string>} The generated arguments. The\n * resulting array might be empty if both arguments are empty\n */\nfunction toAvdLocaleArgs (language, country) {\n const result = [];\n if (language && _.isString(language)) {\n result.push('-prop', `persist.sys.language=${language.toLowerCase()}`);\n }\n if (country && _.isString(country)) {\n result.push('-prop', `persist.sys.country=${country.toUpperCase()}`);\n }\n let locale;\n if (_.isString(language) && _.isString(country) && language && country) {\n locale = language.toLowerCase() + '-' + country.toUpperCase();\n } else if (language && _.isString(language)) {\n locale = language.toLowerCase();\n } else if (country && _.isString(country)) {\n locale = country;\n }\n if (locale) {\n result.push('-prop', `persist.sys.locale=${locale}`);\n }\n return result;\n}\n\n/**\n * Retrieves the full path to the Android preferences root\n *\n * @returns {?string} The full path to the folder or `null` if the folder cannot be found\n */\nasync function getAndroidPrefsRoot () {\n let location = process.env.ANDROID_EMULATOR_HOME;\n if (await dirExists(location)) {\n return location;\n }\n\n if (location) {\n log.warn(`The value of the ANDROID_EMULATOR_HOME environment variable '${location}' is not an existing directory`);\n }\n\n const home = process.env.HOME || process.env.USERPROFILE;\n if (home) {\n location = path.resolve(home, '.android');\n }\n\n if (!await dirExists(location)) {\n log.debug(`Android config root '${location}' is not an existing directory`);\n return null;\n }\n\n return location;\n}\n\n/**\n * Check if a path exists on the filesystem and is a directory\n *\n * @param {?string} location The full path to the directory\n * @returns {boolean}\n */\nasync function dirExists (location) {\n return location\n && await fs.exists(location)\n && (await fs.stat(location)).isDirectory();\n}\n\n/**\n * Escapes special characters in command line arguments.\n * This is needed to avoid possible issues with how system `spawn`\n * call handles them.\n * See https://discuss.appium.io/t/how-to-modify-wd-proxy-and-uiautomator2-source-code-to-support-unicode/33466\n * for more details.\n *\n * @param {string} arg Non-escaped argument string\n * @returns The escaped argument\n */\nfunction escapeShellArg (arg) {\n arg = `${arg}`;\n if (system.isWindows()) {\n return /[&|^\\s]/.test(arg) ? `\"${arg.replace(/\"/g, '\"\"')}\"` : arg;\n }\n return arg.replace(/&/g, '\\\\&');\n}\n\n/**\n * Parses the name of launchable package activity\n * from dumpsys output.\n *\n * @param {string} dumpsys the actual dumpsys output\n * @returns {string[]} Either the fully qualified\n * activity name as a single list item or an empty list if nothing could be parsed.\n * In Android 6 and older there is no reliable way to determine\n * the category name for the given activity, so this API just\n * returns all activity names belonging to 'android.intent.action.MAIN'\n * with the expectation that the app manifest could be parsed next\n * in order to determine category names for these.\n */\nfunction parseLaunchableActivityNames (dumpsys) {\n const mainActivityNameRe = new RegExp(`^\\\\s*${_.escapeRegExp(MAIN_ACTION)}:$`);\n const categoryNameRe = /^\\s*Category:\\s+\"([a-zA-Z0-9._/-]+)\"$/;\n const blocks = [];\n let blockStartIndent;\n let block = [];\n for (const line of dumpsys.split('\\n').map(_.trimEnd)) {\n const currentIndent = line.length - _.trimStart(line).length;\n if (mainActivityNameRe.test(line)) {\n blockStartIndent = currentIndent;\n if (!_.isEmpty(block)) {\n blocks.push(block);\n block = [];\n }\n continue;\n }\n if (_.isNil(blockStartIndent)) {\n continue;\n }\n\n if (currentIndent > blockStartIndent) {\n block.push(line);\n } else {\n if (!_.isEmpty(block)) {\n blocks.push(block);\n block = [];\n }\n blockStartIndent = null;\n }\n }\n if (!_.isEmpty(block)) {\n blocks.push(block);\n }\n\n const result = [];\n for (const item of blocks) {\n let hasCategory = false;\n let isLauncherCategory = false;\n for (const line of item) {\n const match = categoryNameRe.exec(line);\n if (!match) {\n continue;\n }\n\n hasCategory = true;\n isLauncherCategory = match[1] === LAUNCHER_CATEGORY;\n break;\n }\n // On older Android versions the category name\n // might not be listed, so we just try to fetch\n // all matches instead\n if (hasCategory && !isLauncherCategory) {\n continue;\n }\n\n for (const activityNameStr of item.map(_.trim).filter(Boolean)) {\n const fqActivityName = activityNameStr.split(/\\s+/)[1];\n if (!matchComponentName(fqActivityName)) {\n continue;\n }\n\n if (isLauncherCategory) {\n return [fqActivityName];\n }\n result.push(fqActivityName);\n }\n }\n return result;\n}\n\n/**\n * Check if the given string is a valid component name\n *\n * @param {string} classString The string to verify\n * @return {?Array<Match>} The result of Regexp.exec operation\n * or _null_ if no matches are found\n */\nfunction matchComponentName (classString) {\n // some.package/some.package.Activity\n return /^[a-z0-9./_]+$/i.exec(classString);\n}\n\nexport {\n getAndroidPlatformAndPath, unzipFile,\n getIMEListFromOutput, getJavaForOs, isShowingLockscreen, isCurrentFocusOnKeyguard,\n getSurfaceOrientation, isScreenOnFully, buildStartCmd, getJavaHome,\n getSdkToolsVersion, getApksignerForOs, getBuildToolsDirs,\n getApkanalyzerForOs, getOpenSslForOs, extractMatchingPermissions, APKS_EXTENSION,\n APK_INSTALL_TIMEOUT, APKS_INSTALL_TIMEOUT, buildInstallArgs, APK_EXTENSION,\n DEFAULT_ADB_EXEC_TIMEOUT, parseManifest, parseAaptStrings, parseAapt2Strings,\n formatConfigMarker, parseJsonData, unsignApk, toAvdLocaleArgs, requireSdkRoot,\n getSdkRootFromEnv, getAndroidPrefsRoot, dirExists, escapeShellArg,\n parseLaunchableActivityNames, matchComponentName, getResourcePath\n};\n"],"mappings":"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"}
|
|
@@ -14,8 +14,8 @@ var _logger = _interopRequireDefault(require("../logger.js"));
|
|
|
14
14
|
var _support = require("@appium/support");
|
|
15
15
|
var _lruCache = _interopRequireDefault(require("lru-cache"));
|
|
16
16
|
var _helpers = require("../helpers.js");
|
|
17
|
-
const DEFAULT_PRIVATE_KEY = _path.default.
|
|
18
|
-
const DEFAULT_CERTIFICATE = _path.default.
|
|
17
|
+
const DEFAULT_PRIVATE_KEY = _path.default.join('keys', 'testkey.pk8');
|
|
18
|
+
const DEFAULT_CERTIFICATE = _path.default.join('keys', 'testkey.x509.pem');
|
|
19
19
|
const BUNDLETOOL_TUTORIAL = 'https://developer.android.com/studio/command-line/bundletool';
|
|
20
20
|
const APKSIGNER_VERIFY_FAIL = 'DOES NOT VERIFY';
|
|
21
21
|
const SHA1 = 'sha1';
|
|
@@ -57,7 +57,7 @@ apkSigningMethods.signWithDefaultCert = async function signWithDefaultCert(apk)
|
|
|
57
57
|
if (!(await _support.fs.exists(apk))) {
|
|
58
58
|
throw new Error(`${apk} file doesn't exist.`);
|
|
59
59
|
}
|
|
60
|
-
const args = ['sign', '--key', DEFAULT_PRIVATE_KEY, '--cert', DEFAULT_CERTIFICATE, apk];
|
|
60
|
+
const args = ['sign', '--key', await (0, _helpers.getResourcePath)(DEFAULT_PRIVATE_KEY), '--cert', await (0, _helpers.getResourcePath)(DEFAULT_CERTIFICATE), apk];
|
|
61
61
|
try {
|
|
62
62
|
await this.executeApksigner(args);
|
|
63
63
|
} catch (e) {
|
|
@@ -244,4 +244,4 @@ apkSigningMethods.getKeystoreHash = async function getKeystoreHash() {
|
|
|
244
244
|
};
|
|
245
245
|
var _default = apkSigningMethods;
|
|
246
246
|
exports.default = _default;
|
|
247
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJERUZBVUxUX1BSSVZBVEVfS0VZIiwicGF0aCIsInJlc29sdmUiLCJnZXRNb2R1bGVSb290IiwiREVGQVVMVF9DRVJUSUZJQ0FURSIsIkJVTkRMRVRPT0xfVFVUT1JJQUwiLCJBUEtTSUdORVJfVkVSSUZZX0ZBSUwiLCJTSEExIiwiU0hBMjU2IiwiU0hBNTEyIiwiTUQ1IiwiREVGQVVMVF9DRVJUX0hBU0giLCJKQVZBX1BST1BTX0lOSVRfRVJST1IiLCJTSUdORURfQVBQU19DQUNIRSIsIkxSVSIsIm1heCIsImFwa1NpZ25pbmdNZXRob2RzIiwiZXhlY3V0ZUFwa3NpZ25lciIsImFyZ3MiLCJhcGtTaWduZXJKYXIiLCJnZXRBcGtzaWduZXJGb3JPcyIsImZ1bGxDbWQiLCJnZXRKYXZhRm9yT3MiLCJsb2ciLCJkZWJ1ZyIsInV0aWwiLCJxdW90ZSIsInN0ZG91dCIsInN0ZGVyciIsImV4ZWMiLCJzbGljZSIsImN3ZCIsImRpcm5hbWUiLCJ3aW5kb3dzVmVyYmF0aW1Bcmd1bWVudHMiLCJzeXN0ZW0iLCJpc1dpbmRvd3MiLCJuYW1lIiwic3RyZWFtIiwiXyIsInRyaW0iLCJzcGxpdCIsImZpbHRlciIsImxpbmUiLCJpbmNsdWRlcyIsImpvaW4iLCJzaWduV2l0aERlZmF1bHRDZXJ0IiwiYXBrIiwiZnMiLCJleGlzdHMiLCJFcnJvciIsImUiLCJtZXNzYWdlIiwic2lnbldpdGhDdXN0b21DZXJ0Iiwia2V5c3RvcmVQYXRoIiwia2V5QWxpYXMiLCJrZXlzdG9yZVBhc3N3b3JkIiwia2V5UGFzc3dvcmQiLCJlcnIiLCJ3YXJuIiwidW5zaWduQXBrIiwiamFyc2lnbmVyIiwiZ2V0SmF2YUhvbWUiLCJzaWduIiwiYXBwUGF0aCIsImVuZHNXaXRoIiwiQVBLU19FWFRFTlNJT04iLCJ1c2VLZXlzdG9yZSIsInppcEFsaWduQXBrIiwiaW5pdFppcEFsaWduIiwiYmluYXJpZXMiLCJ6aXBhbGlnbiIsImFjY2VzcyIsIl9mcyIsIldfT0siLCJhbGlnbmVkQXBrIiwidGVtcERpciIsInByZWZpeCIsInN1ZmZpeCIsIm1rZGlycCIsIm12IiwidW5saW5rIiwiY2hlY2tBcGtDZXJ0IiwicGtnIiwib3B0cyIsImV4dG5hbWUiLCJleHRyYWN0QmFzZUFwayIsImhhc2hNYXRjaGVzIiwiYXBrc2lnbmVyT3V0cHV0IiwiZXhwZWN0ZWRIYXNoZXMiLCJ2YWx1ZSIsInRvUGFpcnMiLCJSZWdFeHAiLCJ0ZXN0IiwiYmFzZW5hbWUiLCJyZXF1aXJlRGVmYXVsdENlcnQiLCJhcHBIYXNoIiwiaGFzaCIsImhhcyIsIm91dHB1dCIsImV4cGVjdGVkIiwiZ2V0IiwiZ2V0S2V5c3RvcmVIYXNoIiwiaGFzTWF0Y2giLCJpbmZvIiwiaXNTaWduZWQiLCJzZXQiLCJlcnJNc2ciLCJrZXl0b29sIiwicmVzdWx0IiwiaGFzaE5hbWUiLCJoYXNoUmUiLCJtYXRjaCIsInJlcGxhY2UiLCJ0b0xvd2VyQ2FzZSIsImlzRW1wdHkiLCJKU09OIiwic3RyaW5naWZ5Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL3Rvb2xzL2Fway1zaWduaW5nLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgX2ZzIGZyb20gJ2ZzJztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgbG9nIGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyB0ZW1wRGlyLCBzeXN0ZW0sIG1rZGlycCwgZnMsIHV0aWwgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IExSVSBmcm9tICdscnUtY2FjaGUnO1xuaW1wb3J0IHtcbiAgZ2V0SmF2YUZvck9zLCBnZXRBcGtzaWduZXJGb3JPcywgZ2V0SmF2YUhvbWUsIGdldE1vZHVsZVJvb3QsIEFQS1NfRVhURU5TSU9OLCB1bnNpZ25BcGssXG59IGZyb20gJy4uL2hlbHBlcnMuanMnO1xuXG5jb25zdCBERUZBVUxUX1BSSVZBVEVfS0VZID0gcGF0aC5yZXNvbHZlKGdldE1vZHVsZVJvb3QoKSwgJ2tleXMnLCAndGVzdGtleS5wazgnKTtcbmNvbnN0IERFRkFVTFRfQ0VSVElGSUNBVEUgPSBwYXRoLnJlc29sdmUoZ2V0TW9kdWxlUm9vdCgpLCAna2V5cycsICd0ZXN0a2V5Lng1MDkucGVtJyk7XG5jb25zdCBCVU5ETEVUT09MX1RVVE9SSUFMID0gJ2h0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3N0dWRpby9jb21tYW5kLWxpbmUvYnVuZGxldG9vbCc7XG5jb25zdCBBUEtTSUdORVJfVkVSSUZZX0ZBSUwgPSAnRE9FUyBOT1QgVkVSSUZZJztcbmNvbnN0IFNIQTEgPSAnc2hhMSc7XG5jb25zdCBTSEEyNTYgPSAnc2hhMjU2JztcbmNvbnN0IFNIQTUxMiA9ICdzaGE1MTInO1xuY29uc3QgTUQ1ID0gJ21kNSc7XG5jb25zdCBERUZBVUxUX0NFUlRfSEFTSCA9IHtcbiAgW1NIQTI1Nl06ICdhNDBkYTgwYTU5ZDE3MGNhYTk1MGNmMTVjMThjNDU0ZDQ3YTM5YjI2OTg5ZDhiNjQwZWNkNzQ1YmE3MWJmNWRjJ1xufTtcbmNvbnN0IEpBVkFfUFJPUFNfSU5JVF9FUlJPUiA9ICdqYXZhLmxhbmcuRXJyb3I6IFByb3BlcnRpZXMgaW5pdCc7XG5jb25zdCBTSUdORURfQVBQU19DQUNIRSA9IG5ldyBMUlUoe1xuICBtYXg6IDMwLFxufSk7XG5cblxuY29uc3QgYXBrU2lnbmluZ01ldGhvZHMgPSB7fTtcblxuLyoqXG4gKiBFeGVjdXRlIGFwa3NpZ25lciB1dGlsaXR5IHdpdGggZ2l2ZW4gYXJndW1lbnRzLlxuICpcbiAqIEBwYXJhbSB7P0FycmF5PFN0cmluZz59IGFyZ3MgLSBUaGUgbGlzdCBvZiB0b29sIGFyZ3VtZW50cy5cbiAqIEByZXR1cm4ge3N0cmluZ30gLSBDb21tYW5kIHN0ZG91dFxuICogQHRocm93cyB7RXJyb3J9IElmIGFwa3NpZ25lciBiaW5hcnkgaXMgbm90IHByZXNlbnQgb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtXG4gKiAgICAgICAgICAgICAgICAgb3IgdGhlIHJldHVybiBjb2RlIGlzIG5vdCBlcXVhbCB0byB6ZXJvLlxuICovXG5hcGtTaWduaW5nTWV0aG9kcy5leGVjdXRlQXBrc2lnbmVyID0gYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUFwa3NpZ25lciAoYXJncyA9IFtdKSB7XG4gIGNvbnN0IGFwa1NpZ25lckphciA9IGF3YWl0IGdldEFwa3NpZ25lckZvck9zKHRoaXMpO1xuICBjb25zdCBmdWxsQ21kID0gW1xuICAgIGF3YWl0IGdldEphdmFGb3JPcygpLCAnLVhteDEwMjRNJywgJy1Yc3MxbScsXG4gICAgJy1qYXInLCBhcGtTaWduZXJKYXIsXG4gICAgLi4uYXJnc1xuICBdO1xuICBsb2cuZGVidWcoYFN0YXJ0aW5nIGFwa3NpZ25lcjogJHt1dGlsLnF1b3RlKGZ1bGxDbWQpfWApO1xuICAvLyBJdCBpcyBuZWNlc3NhcnkgdG8gc3BlY2lmeSBDV0QgZXhwbGljaXRseTsgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2lzc3Vlcy8xNDcyNCNpc3N1ZWNvbW1lbnQtNzM3NDQ2NzE1XG4gIGNvbnN0IHtzdGRvdXQsIHN0ZGVycn0gPSBhd2FpdCBleGVjKGZ1bGxDbWRbMF0sIGZ1bGxDbWQuc2xpY2UoMSksIHtcbiAgICBjd2Q6IHBhdGguZGlybmFtZShhcGtTaWduZXJKYXIpLCB3aW5kb3dzVmVyYmF0aW1Bcmd1bWVudHM6IHN5c3RlbS5pc1dpbmRvd3MoKVxuICB9KTtcbiAgZm9yIChsZXQgW25hbWUsIHN0cmVhbV0gb2YgW1snc3Rkb3V0Jywgc3Rkb3V0XSwgWydzdGRlcnInLCBzdGRlcnJdXSkge1xuICAgIGlmICghXy50cmltKHN0cmVhbSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChuYW1lID09PSAnc3Rkb3V0Jykge1xuICAgICAgLy8gTWFrZSB0aGUgb3V0cHV0IGxlc3MgdGFsa2F0aXZlXG4gICAgICBzdHJlYW0gPSBzdHJlYW0uc3BsaXQoJ1xcbicpXG4gICAgICAgIC5maWx0ZXIoKGxpbmUpID0+ICFsaW5lLmluY2x1ZGVzKCdXQVJOSU5HOicpKVxuICAgICAgICAuam9pbignXFxuJyk7XG4gICAgfVxuICAgIGxvZy5kZWJ1ZyhgYXBrc2lnbmVyICR7bmFtZX06ICR7c3RyZWFtfWApO1xuICB9XG4gIHJldHVybiBzdGRvdXQ7XG59O1xuXG4vKipcbiAqIChSZSlzaWduIHRoZSBnaXZlbiBhcGsgZmlsZSBvbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0gd2l0aCB0aGUgZGVmYXVsdCBjZXJ0aWZpY2F0ZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBrIC0gVGhlIGZ1bGwgcGF0aCB0byB0aGUgbG9jYWwgYXBrIGZpbGUuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgc2lnbmluZyBmYWlscy5cbiAqL1xuYXBrU2lnbmluZ01ldGhvZHMuc2lnbldpdGhEZWZhdWx0Q2VydCA9IGFzeW5jIGZ1bmN0aW9uIHNpZ25XaXRoRGVmYXVsdENlcnQgKGFwaykge1xuICBsb2cuZGVidWcoYFNpZ25pbmcgJyR7YXBrfScgd2l0aCBkZWZhdWx0IGNlcnRgKTtcbiAgaWYgKCEoYXdhaXQgZnMuZXhpc3RzKGFwaykpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2Fwa30gZmlsZSBkb2Vzbid0IGV4aXN0LmApO1xuICB9XG5cbiAgY29uc3QgYXJncyA9IFtcbiAgICAnc2lnbicsXG4gICAgJy0ta2V5JywgREVGQVVMVF9QUklWQVRFX0tFWSxcbiAgICAnLS1jZXJ0JywgREVGQVVMVF9DRVJUSUZJQ0FURSxcbiAgICBhcGssXG4gIF07XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5leGVjdXRlQXBrc2lnbmVyKGFyZ3MpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3Qgc2lnbiAnJHthcGt9JyB3aXRoIHRoZSBkZWZhdWx0IGNlcnRpZmljYXRlLiBgICtcbiAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlLnN0ZGVyciB8fCBlLnN0ZG91dCB8fCBlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogKFJlKXNpZ24gdGhlIGdpdmVuIGFwayBmaWxlIG9uIHRoZSBsb2NhbCBmaWxlIHN5c3RlbSB3aXRoIGEgY3VzdG9tIGNlcnRpZmljYXRlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcGsgLSBUaGUgZnVsbCBwYXRoIHRvIHRoZSBsb2NhbCBhcGsgZmlsZS5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBzaWduaW5nIGZhaWxzLlxuICovXG5hcGtTaWduaW5nTWV0aG9kcy5zaWduV2l0aEN1c3RvbUNlcnQgPSBhc3luYyBmdW5jdGlvbiBzaWduV2l0aEN1c3RvbUNlcnQgKGFwaykge1xuICBsb2cuZGVidWcoYFNpZ25pbmcgJyR7YXBrfScgd2l0aCBjdXN0b20gY2VydGApO1xuICBpZiAoIShhd2FpdCBmcy5leGlzdHModGhpcy5rZXlzdG9yZVBhdGgpKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgS2V5c3RvcmU6ICR7dGhpcy5rZXlzdG9yZVBhdGh9IGRvZXNuJ3QgZXhpc3QuYCk7XG4gIH1cbiAgaWYgKCEoYXdhaXQgZnMuZXhpc3RzKGFwaykpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAnJHthcGt9JyBkb2Vzbid0IGV4aXN0LmApO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLmV4ZWN1dGVBcGtzaWduZXIoWydzaWduJyxcbiAgICAgICctLWtzJywgdGhpcy5rZXlzdG9yZVBhdGgsXG4gICAgICAnLS1rcy1rZXktYWxpYXMnLCB0aGlzLmtleUFsaWFzLFxuICAgICAgJy0ta3MtcGFzcycsIGBwYXNzOiR7dGhpcy5rZXlzdG9yZVBhc3N3b3JkfWAsXG4gICAgICAnLS1rZXktcGFzcycsIGBwYXNzOiR7dGhpcy5rZXlQYXNzd29yZH1gLFxuICAgICAgYXBrXSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy53YXJuKGBDYW5ub3QgdXNlIGFwa3NpZ25lciB0b29sIGZvciBzaWduaW5nLiBEZWZhdWx0aW5nIHRvIGphcnNpZ25lci4gYCArXG4gICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZXJyLnN0ZGVyciB8fCBlcnIuc3Rkb3V0IHx8IGVyci5tZXNzYWdlfWApO1xuICAgIHRyeSB7XG4gICAgICBpZiAoYXdhaXQgdW5zaWduQXBrKGFwaykpIHtcbiAgICAgICAgbG9nLmRlYnVnKGAnJHthcGt9JyBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgdW5zaWduZWRgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZy5kZWJ1ZyhgJyR7YXBrfScgZG9lcyBub3QgbmVlZCB0byBiZSB1bnNpZ25lZGApO1xuICAgICAgfVxuICAgICAgY29uc3QgamFyc2lnbmVyID0gcGF0aC5yZXNvbHZlKGF3YWl0IGdldEphdmFIb21lKCksICdiaW4nLFxuICAgICAgICBgamFyc2lnbmVyJHtzeXN0ZW0uaXNXaW5kb3dzKCkgPyAnLmV4ZScgOiAnJ31gKTtcbiAgICAgIGNvbnN0IGZ1bGxDbWQgPSBbamFyc2lnbmVyLFxuICAgICAgICAnLXNpZ2FsZycsICdNRDV3aXRoUlNBJyxcbiAgICAgICAgJy1kaWdlc3RhbGcnLCAnU0hBMScsXG4gICAgICAgICcta2V5c3RvcmUnLCB0aGlzLmtleXN0b3JlUGF0aCxcbiAgICAgICAgJy1zdG9yZXBhc3MnLCB0aGlzLmtleXN0b3JlUGFzc3dvcmQsXG4gICAgICAgICcta2V5cGFzcycsIHRoaXMua2V5UGFzc3dvcmQsXG4gICAgICAgIGFwaywgdGhpcy5rZXlBbGlhc107XG4gICAgICBsb2cuZGVidWcoYFN0YXJ0aW5nIGphcnNpZ25lcjogJHt1dGlsLnF1b3RlKGZ1bGxDbWQpfWApO1xuICAgICAgYXdhaXQgZXhlYyhmdWxsQ21kWzBdLCBmdWxsQ21kLnNsaWNlKDEpLCB7IHdpbmRvd3NWZXJiYXRpbUFyZ3VtZW50czogc3lzdGVtLmlzV2luZG93cygpIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IHNpZ24gd2l0aCBjdXN0b20gY2VydGlmaWNhdGUuIGAgK1xuICAgICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZS5zdGRlcnIgfHwgZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiAoUmUpc2lnbiB0aGUgZ2l2ZW4gYXBrIGZpbGUgb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtIHdpdGggZWl0aGVyXG4gKiBjdXN0b20gb3IgZGVmYXVsdCBjZXJ0aWZpY2F0ZSBiYXNlZCBvbiBfdGhpcy51c2VLZXlzdG9yZV8gcHJvcGVydHkgdmFsdWVcbiAqIGFuZCBaaXAtYWxpZ25zIGl0IGFmdGVyIHNpZ25pbmcuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwcFBhdGggLSBUaGUgZnVsbCBwYXRoIHRvIHRoZSBsb2NhbCAuYXBrKHMpIGZpbGUuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgc2lnbmluZyBmYWlscy5cbiAqL1xuYXBrU2lnbmluZ01ldGhvZHMuc2lnbiA9IGFzeW5jIGZ1bmN0aW9uIHNpZ24gKGFwcFBhdGgpIHtcbiAgaWYgKGFwcFBhdGguZW5kc1dpdGgoQVBLU19FWFRFTlNJT04pKSB7XG4gICAgbGV0IG1lc3NhZ2UgPSAnU2lnbmluZyBvZiAuYXBrcy1maWxlcyBpcyBub3Qgc3VwcG9ydGVkLiAnO1xuICAgIGlmICh0aGlzLnVzZUtleXN0b3JlKSB7XG4gICAgICBtZXNzYWdlICs9ICdDb25zaWRlciBtYW51YWwgYXBwbGljYXRpb24gYnVuZGxlIHNpZ25pbmcgd2l0aCB0aGUgY3VzdG9tIGtleXN0b3JlICcgK1xuICAgICAgICBgbGlrZSBpdCBpcyBkZXNjcmliZWQgYXQgJHtCVU5ETEVUT09MX1RVVE9SSUFMfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1lc3NhZ2UgKz0gYENvbnNpZGVyIG1hbnVhbCBhcHBsaWNhdGlvbiBidW5kbGUgc2lnbmluZyB3aXRoIHRoZSBrZXkgYXQgJyR7REVGQVVMVF9QUklWQVRFX0tFWX0nIGAgK1xuICAgICAgICBgYW5kIHRoZSBjZXJ0aWZpY2F0ZSBhdCAnJHtERUZBVUxUX0NFUlRJRklDQVRFfScuIFJlYWQgJHtCVU5ETEVUT09MX1RVVE9SSUFMfSBmb3IgbW9yZSBkZXRhaWxzLmA7XG4gICAgfVxuICAgIGxvZy53YXJuKG1lc3NhZ2UpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIGl0IGlzIG5lY2Vzc2FyeSB0byBhcHBseSB6aXBhbGlnbiBvbmx5IGJlZm9yZSBzaWduaW5nXG4gIC8vIGlmIGFwa3NpZ25lciBpcyB1c2VkXG4gIGF3YWl0IHRoaXMuemlwQWxpZ25BcGsoYXBwUGF0aCk7XG5cbiAgaWYgKHRoaXMudXNlS2V5c3RvcmUpIHtcbiAgICBhd2FpdCB0aGlzLnNpZ25XaXRoQ3VzdG9tQ2VydChhcHBQYXRoKTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCB0aGlzLnNpZ25XaXRoRGVmYXVsdENlcnQoYXBwUGF0aCk7XG4gIH1cbn07XG5cbi8qKlxuICogUGVyZm9ybSB6aXAtYWxpZ25pbmcgdG8gdGhlIGdpdmVuIGxvY2FsIGFwayBmaWxlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcGsgLSBUaGUgZnVsbCBwYXRoIHRvIHRoZSBsb2NhbCBhcGsgZmlsZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBhcGsgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGFsaWduZWRcbiAqIG9yIGZhbHNlIGlmIHRoZSBhcGsgaGFzIGJlZW4gYWxyZWFkeSBhbGlnbmVkLlxuICogQHRocm93cyB7RXJyb3J9IElmIHppcC1hbGlnbiBmYWlscy5cbiAqL1xuYXBrU2lnbmluZ01ldGhvZHMuemlwQWxpZ25BcGsgPSBhc3luYyBmdW5jdGlvbiB6aXBBbGlnbkFwayAoYXBrKSB7XG4gIGF3YWl0IHRoaXMuaW5pdFppcEFsaWduKCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgZXhlYyh0aGlzLmJpbmFyaWVzLnppcGFsaWduLCBbJy1jJywgJzQnLCBhcGtdKTtcbiAgICBsb2cuZGVidWcoYCR7YXBrfScgaXMgYWxyZWFkeSB6aXAtYWxpZ25lZC4gRG9pbmcgbm90aGluZ2ApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZy5kZWJ1ZyhgJyR7YXBrfScgaXMgbm90IHppcC1hbGlnbmVkLiBBbGlnbmluZ2ApO1xuICB9XG4gIHRyeSB7XG4gICAgYXdhaXQgZnMuYWNjZXNzKGFwaywgX2ZzLldfT0spO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgZmlsZSBhdCAnJHthcGt9JyBpcyBub3Qgd3JpdGVhYmxlLiBgICtcbiAgICAgIGBQbGVhc2UgZ3JhbnQgd3JpdGUgcGVybWlzc2lvbnMgdG8gdGhpcyBmaWxlIG9yIHRvIGl0cyBwYXJlbnQgZm9sZGVyICcke3BhdGguZGlybmFtZShhcGspfScgYCArXG4gICAgICBgZm9yIHRoZSBBcHBpdW0gcHJvY2Vzcywgc28gaXQgY2FuIHppcC1hbGlnbiB0aGUgZmlsZWApO1xuICB9XG4gIGNvbnN0IGFsaWduZWRBcGsgPSBhd2FpdCB0ZW1wRGlyLnBhdGgoe3ByZWZpeDogJ2FwcGl1bScsIHN1ZmZpeDogJy50bXAnfSk7XG4gIGF3YWl0IG1rZGlycChwYXRoLmRpcm5hbWUoYWxpZ25lZEFwaykpO1xuICB0cnkge1xuICAgIGF3YWl0IGV4ZWModGhpcy5iaW5hcmllcy56aXBhbGlnbiwgWyctZicsICc0JywgYXBrLCBhbGlnbmVkQXBrXSk7XG4gICAgYXdhaXQgZnMubXYoYWxpZ25lZEFwaywgYXBrLCB7IG1rZGlycDogdHJ1ZSB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmIChhd2FpdCBmcy5leGlzdHMoYWxpZ25lZEFwaykpIHtcbiAgICAgIGF3YWl0IGZzLnVubGluayhhbGlnbmVkQXBrKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGB6aXBBbGlnbkFwayBmYWlsZWQuIE9yaWdpbmFsIGVycm9yOiAke2Uuc3RkZXJyIHx8IGUubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDZXJ0Q2hlY2tPcHRpb25zXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHJlcXVpcmVEZWZhdWx0Q2VydCBbdHJ1ZV0gV2hldGhlciB0byByZXF1aXJlIHRoYXQgdGhlIGRlc3RpbmF0aW9uIEFQS1xuICogaXMgc2lnbmVkIHdpdGggdGhlIGRlZmF1bHQgQXBwaXVtIGNlcnRpZmljYXRlIG9yIGFueSB2YWxpZCBjZXJ0aWZpY2F0ZS4gVGhpcyBvcHRpb25cbiAqIG9ubHkgaGFzIGVmZmVjdCBpZiBgdXNlS2V5c3RvcmVgIHByb3BlcnR5IGlzIHVuc2V0LlxuICovXG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIGFwcCBpcyBhbHJlYWR5IHNpZ25lZCB3aXRoIHRoZSBkZWZhdWx0IEFwcGl1bSBjZXJ0aWZpY2F0ZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBwUGF0aCAtIFRoZSBmdWxsIHBhdGggdG8gdGhlIGxvY2FsIC5hcGsocykgZmlsZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwZ2sgLSBUaGUgbmFtZSBvZiBhcHBsaWNhdGlvbiBwYWNrYWdlLlxuICogQHBhcmFtIHtDZXJ0Q2hlY2tPcHRpb25zfSBvcHRzIC0gQ2VydGlmaWNhdGUgY2hlY2tpbmcgb3B0aW9uc1xuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBnaXZlbiBhcHBsaWNhdGlvbiBpcyBhbHJlYWR5IHNpZ25lZC5cbiAqL1xuYXBrU2lnbmluZ01ldGhvZHMuY2hlY2tBcGtDZXJ0ID0gYXN5bmMgZnVuY3Rpb24gY2hlY2tBcGtDZXJ0IChhcHBQYXRoLCBwa2csIG9wdHMgPSB7fSkge1xuICBsb2cuZGVidWcoYENoZWNraW5nIGFwcCBjZXJ0IGZvciAke2FwcFBhdGh9YCk7XG4gIGlmICghYXdhaXQgZnMuZXhpc3RzKGFwcFBhdGgpKSB7XG4gICAgbG9nLmRlYnVnKGAnJHthcHBQYXRofScgZG9lcyBub3QgZXhpc3RgKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAocGF0aC5leHRuYW1lKGFwcFBhdGgpID09PSBBUEtTX0VYVEVOU0lPTikge1xuICAgIGFwcFBhdGggPSBhd2FpdCB0aGlzLmV4dHJhY3RCYXNlQXBrKGFwcFBhdGgpO1xuICB9XG5cbiAgY29uc3QgaGFzaE1hdGNoZXMgPSAoYXBrc2lnbmVyT3V0cHV0LCBleHBlY3RlZEhhc2hlcykgPT4ge1xuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBfLnRvUGFpcnMoZXhwZWN0ZWRIYXNoZXMpKSB7XG4gICAgICBpZiAobmV3IFJlZ0V4cChgZGlnZXN0OlxcXFxzKyR7dmFsdWV9XFxcXGJgLCAnaScpLnRlc3QoYXBrc2lnbmVyT3V0cHV0KSkge1xuICAgICAgICBsb2cuZGVidWcoYCR7bmFtZX0gaGFzaCBkaWQgbWF0Y2ggZm9yICcke3BhdGguYmFzZW5hbWUoYXBwUGF0aCl9J2ApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIGNvbnN0IHtcbiAgICByZXF1aXJlRGVmYXVsdENlcnQgPSB0cnVlLFxuICB9ID0gb3B0cztcblxuICBjb25zdCBhcHBIYXNoID0gYXdhaXQgZnMuaGFzaChhcHBQYXRoKTtcbiAgaWYgKFNJR05FRF9BUFBTX0NBQ0hFLmhhcyhhcHBIYXNoKSkge1xuICAgIGxvZy5kZWJ1ZyhgVXNpbmcgdGhlIHByZXZpb3VzbHkgY2FjaGVkIHNpZ25hdHVyZSBlbnRyeSBmb3IgJyR7cGF0aC5iYXNlbmFtZShhcHBQYXRoKX0nYCk7XG4gICAgY29uc3Qge2tleXN0b3JlUGF0aCwgb3V0cHV0LCBleHBlY3RlZH0gPSBTSUdORURfQVBQU19DQUNIRS5nZXQoYXBwSGFzaCk7XG4gICAgaWYgKHRoaXMudXNlS2V5c3RvcmUgJiYgdGhpcy5rZXlzdG9yZVBhdGggPT09IGtleXN0b3JlUGF0aCB8fCAhdGhpcy51c2VLZXlzdG9yZSkge1xuICAgICAgcmV0dXJuICghdGhpcy51c2VLZXlzdG9yZSAmJiAhcmVxdWlyZURlZmF1bHRDZXJ0KSB8fCBoYXNoTWF0Y2hlcyhvdXRwdXQsIGV4cGVjdGVkKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBleHBlY3RlZCA9IHRoaXMudXNlS2V5c3RvcmVcbiAgICA/IGF3YWl0IHRoaXMuZ2V0S2V5c3RvcmVIYXNoKGFwcFBhdGgsIHBrZylcbiAgICA6IERFRkFVTFRfQ0VSVF9IQVNIO1xuICB0cnkge1xuICAgIGF3YWl0IGdldEFwa3NpZ25lckZvck9zKHRoaXMpO1xuICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IHRoaXMuZXhlY3V0ZUFwa3NpZ25lcihbJ3ZlcmlmeScsICctLXByaW50LWNlcnRzJywgYXBwUGF0aF0pO1xuICAgIGNvbnN0IGhhc01hdGNoID0gaGFzaE1hdGNoZXMob3V0cHV0LCBleHBlY3RlZCk7XG4gICAgaWYgKGhhc01hdGNoKSB7XG4gICAgICBsb2cuaW5mbyhgJyR7YXBwUGF0aH0nIGlzIHNpZ25lZCB3aXRoIHRoZSBgICtcbiAgICAgICAgYCR7dGhpcy51c2VLZXlzdG9yZSA/ICdrZXlzdG9yZScgOiAnZGVmYXVsdCd9IGNlcnRpZmljYXRlYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZy5pbmZvKGAnJHthcHBQYXRofScgaXMgc2lnbmVkIHdpdGggYSBgICtcbiAgICAgICAgYG5vbi0ke3RoaXMudXNlS2V5c3RvcmUgPyAna2V5c3RvcmUnIDogJ2RlZmF1bHQnfSBjZXJ0aWZpY2F0ZWApO1xuICAgIH1cbiAgICBjb25zdCBpc1NpZ25lZCA9ICghdGhpcy51c2VLZXlzdG9yZSAmJiAhcmVxdWlyZURlZmF1bHRDZXJ0KSB8fCBoYXNNYXRjaDtcbiAgICBpZiAoaXNTaWduZWQpIHtcbiAgICAgIFNJR05FRF9BUFBTX0NBQ0hFLnNldChhcHBIYXNoLCB7XG4gICAgICAgIG91dHB1dCxcbiAgICAgICAgZXhwZWN0ZWQsXG4gICAgICAgIGtleXN0b3JlUGF0aDogdGhpcy5rZXlzdG9yZVBhdGgsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGlzU2lnbmVkO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBubyBzaWduYXR1cmVcbiAgICBpZiAoXy5pbmNsdWRlcyhlcnIuc3RkZXJyLCBBUEtTSUdORVJfVkVSSUZZX0ZBSUwpKSB7XG4gICAgICBsb2cuaW5mbyhgJyR7YXBwUGF0aH0nIGlzIG5vdCBzaWduZWRgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgZXJyTXNnID0gZXJyLnN0ZGVyciB8fCBlcnIuc3Rkb3V0IHx8IGVyci5tZXNzYWdlO1xuICAgIGlmIChfLmluY2x1ZGVzKGVyck1zZywgSkFWQV9QUk9QU19JTklUX0VSUk9SKSkge1xuICAgICAgLy8gVGhpcyBlcnJvciBwb3BzIHVwIHJhbmRvbWx5IGFuZCB3ZSBhcmUgbm90IHF1aXRlIHN1cmUgd2h5LlxuICAgICAgLy8gTXkgZ3Vlc3MgLSBhIHJhY2UgY29uZGl0aW9uIGluIGphdmEgdm0gaW5pdGlhbGl6YXRpb24uXG4gICAgICAvLyBOZXZlcnRoZWxlc3MsIGxldHMgbWFrZSBBcHBpdW0gdG8gYmVsaWV2ZSB0aGUgZmlsZSBpcyBhbHJlYWR5IHNpZ25lZCxcbiAgICAgIC8vIGJlY2F1c2UgaXQgd291bGQgYmUgdHJ1ZSBmb3IgOTklIG9mIFVJQXV0b21hdG9yMi1iYXNlZFxuICAgICAgLy8gdGVzdHMsIHdoZXJlIHdlIHByZXNpZ24gc2VydmVyIGJpbmFyaWVzIHdoaWxlIHB1Ymxpc2hpbmcgdGhlaXIgTlBNIG1vZHVsZS5cbiAgICAgIC8vIElmIHRoZXNlIGFyZSBub3Qgc2lnbmVkLCBlLmcuIGluIGNhc2Ugb2YgRXNwcmVzc28sIHRoZW4gdGhlIG5leHQgc3RlcChzKVxuICAgICAgLy8gd291bGQgYW55d2F5IGZhaWwuXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzE0NzI0IGZvciBtb3JlIGRldGFpbHMuXG4gICAgICBsb2cud2FybihlcnJNc2cpO1xuICAgICAgbG9nLndhcm4oYEFzc3VtaW5nICcke2FwcFBhdGh9JyBpcyBhbHJlYWR5IHNpZ25lZCBhbmQgY29udGludWluZyBhbnl3YXlgKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCB2ZXJpZnkgdGhlIHNpZ25hdHVyZSBvZiAnJHthcHBQYXRofScuIGAgK1xuICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2Vyck1zZ31gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBLZXlzdG9yZUhhc2hcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gbWQ1IHRoZSBtZDUgaGFzaCB2YWx1ZSBvZiB0aGUga2V5c3RvcmVcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gc2hhMSB0aGUgc2hhMSBoYXNoIHZhbHVlIG9mIHRoZSBrZXlzdG9yZVxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBzaGEyNTYgdGhlIHNoYTI1NiBoYXNoIHZhbHVlIG9mIHRoZSBrZXlzdG9yZVxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBzaGE1MTIgdGhlIHNoYTUxMiBoYXNoIHZhbHVlIG9mIHRoZSBrZXlzdG9yZVxuICovXG5cbi8qKlxuICogUmV0cmlldmUgdGhlIHRoZSBoYXNoIG9mIHRoZSBnaXZlbiBrZXlzdG9yZS5cbiAqXG4gKiBAcmV0dXJuIHtLZXlzdG9yZUhhc2h9XG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgZ2V0dGluZyBrZXlzdG9yZSBoYXNoIGZhaWxzLlxuICovXG5hcGtTaWduaW5nTWV0aG9kcy5nZXRLZXlzdG9yZUhhc2ggPSBhc3luYyBmdW5jdGlvbiBnZXRLZXlzdG9yZUhhc2ggKCkge1xuICBsb2cuZGVidWcoYEdldHRpbmcgaGFzaCBvZiB0aGUgJyR7dGhpcy5rZXlzdG9yZVBhdGh9JyBrZXlzdG9yZWApO1xuICBjb25zdCBrZXl0b29sID0gcGF0aC5yZXNvbHZlKGF3YWl0IGdldEphdmFIb21lKCksICdiaW4nLFxuICAgIGBrZXl0b29sJHtzeXN0ZW0uaXNXaW5kb3dzKCkgPyAnLmV4ZScgOiAnJ31gKTtcbiAgaWYgKCFhd2FpdCBmcy5leGlzdHMoa2V5dG9vbCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBrZXl0b29sIHV0aWxpdHkgY2Fubm90IGJlIGZvdW5kIGF0ICcke2tleXRvb2x9J2ApO1xuICB9XG4gIGNvbnN0IGFyZ3MgPSBbXG4gICAgJy12JywgJy1saXN0JyxcbiAgICAnLWFsaWFzJywgdGhpcy5rZXlBbGlhcyxcbiAgICAnLWtleXN0b3JlJywgdGhpcy5rZXlzdG9yZVBhdGgsXG4gICAgJy1zdG9yZXBhc3MnLCB0aGlzLmtleXN0b3JlUGFzc3dvcmRcbiAgXTtcbiAgbG9nLmluZm8oYFJ1bm5pbmcgJyR7a2V5dG9vbH0nIHdpdGggYXJndW1lbnRzOiAke3V0aWwucXVvdGUoYXJncyl9YCk7XG4gIHRyeSB7XG4gICAgY29uc3Qge3N0ZG91dH0gPSBhd2FpdCBleGVjKGtleXRvb2wsIGFyZ3MsIHsgd2luZG93c1ZlcmJhdGltQXJndW1lbnRzOiBzeXN0ZW0uaXNXaW5kb3dzKCkgfSk7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgZm9yIChjb25zdCBoYXNoTmFtZSBvZiBbU0hBNTEyLCBTSEEyNTYsIFNIQTEsIE1ENV0pIHtcbiAgICAgIGNvbnN0IGhhc2hSZSA9IG5ldyBSZWdFeHAoYF5cXFxccyoke2hhc2hOYW1lfTpcXFxccyooW2EtZjAtOTpdKylgLCAnbWknKTtcbiAgICAgIGNvbnN0IG1hdGNoID0gaGFzaFJlLmV4ZWMoc3Rkb3V0KTtcbiAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZXN1bHRbaGFzaE5hbWVdID0gbWF0Y2hbMV0ucmVwbGFjZSgvOi9nLCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICB9XG4gICAgaWYgKF8uaXNFbXB0eShyZXN1bHQpKSB7XG4gICAgICBsb2cuZGVidWcoc3Rkb3V0KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHBhcnNlIHRoZSBoYXNoIHZhbHVlIGZyb20gdGhlIGtleXRvb2wgb3V0cHV0Jyk7XG4gICAgfVxuICAgIGxvZy5kZWJ1ZyhgS2V5c3RvcmUgaGFzaDogJHtKU09OLnN0cmluZ2lmeShyZXN1bHQpfWApO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBnZXQgdGhlIGhhc2ggb2YgJyR7dGhpcy5rZXlzdG9yZVBhdGh9JyBrZXlzdG9yZS4gYCArXG4gICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZS5zdGRlcnIgfHwgZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBhcGtTaWduaW5nTWV0aG9kcztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUEsTUFBTUEsbUJBQW1CLEdBQUdDLGFBQUksQ0FBQ0MsT0FBTyxDQUFDLElBQUFDLHNCQUFhLEdBQUUsRUFBRSxNQUFNLEVBQUUsYUFBYSxDQUFDO0FBQ2hGLE1BQU1DLG1CQUFtQixHQUFHSCxhQUFJLENBQUNDLE9BQU8sQ0FBQyxJQUFBQyxzQkFBYSxHQUFFLEVBQUUsTUFBTSxFQUFFLGtCQUFrQixDQUFDO0FBQ3JGLE1BQU1FLG1CQUFtQixHQUFHLDhEQUE4RDtBQUMxRixNQUFNQyxxQkFBcUIsR0FBRyxpQkFBaUI7QUFDL0MsTUFBTUMsSUFBSSxHQUFHLE1BQU07QUFDbkIsTUFBTUMsTUFBTSxHQUFHLFFBQVE7QUFDdkIsTUFBTUMsTUFBTSxHQUFHLFFBQVE7QUFDdkIsTUFBTUMsR0FBRyxHQUFHLEtBQUs7QUFDakIsTUFBTUMsaUJBQWlCLEdBQUc7RUFDeEIsQ0FBQ0gsTUFBTSxHQUFHO0FBQ1osQ0FBQztBQUNELE1BQU1JLHFCQUFxQixHQUFHLGtDQUFrQztBQUNoRSxNQUFNQyxpQkFBaUIsR0FBRyxJQUFJQyxpQkFBRyxDQUFDO0VBQ2hDQyxHQUFHLEVBQUU7QUFDUCxDQUFDLENBQUM7QUFHRixNQUFNQyxpQkFBaUIsR0FBRyxDQUFDLENBQUM7QUFVNUJBLGlCQUFpQixDQUFD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
|
|
247
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJERUZBVUxUX1BSSVZBVEVfS0VZIiwicGF0aCIsImpvaW4iLCJERUZBVUxUX0NFUlRJRklDQVRFIiwiQlVORExFVE9PTF9UVVRPUklBTCIsIkFQS1NJR05FUl9WRVJJRllfRkFJTCIsIlNIQTEiLCJTSEEyNTYiLCJTSEE1MTIiLCJNRDUiLCJERUZBVUxUX0NFUlRfSEFTSCIsIkpBVkFfUFJPUFNfSU5JVF9FUlJPUiIsIlNJR05FRF9BUFBTX0NBQ0hFIiwiTFJVIiwibWF4IiwiYXBrU2lnbmluZ01ldGhvZHMiLCJleGVjdXRlQXBrc2lnbmVyIiwiYXJncyIsImFwa1NpZ25lckphciIsImdldEFwa3NpZ25lckZvck9zIiwiZnVsbENtZCIsImdldEphdmFGb3JPcyIsImxvZyIsImRlYnVnIiwidXRpbCIsInF1b3RlIiwic3Rkb3V0Iiwic3RkZXJyIiwiZXhlYyIsInNsaWNlIiwiY3dkIiwiZGlybmFtZSIsIndpbmRvd3NWZXJiYXRpbUFyZ3VtZW50cyIsInN5c3RlbSIsImlzV2luZG93cyIsIm5hbWUiLCJzdHJlYW0iLCJfIiwidHJpbSIsInNwbGl0IiwiZmlsdGVyIiwibGluZSIsImluY2x1ZGVzIiwic2lnbldpdGhEZWZhdWx0Q2VydCIsImFwayIsImZzIiwiZXhpc3RzIiwiRXJyb3IiLCJnZXRSZXNvdXJjZVBhdGgiLCJlIiwibWVzc2FnZSIsInNpZ25XaXRoQ3VzdG9tQ2VydCIsImtleXN0b3JlUGF0aCIsImtleUFsaWFzIiwia2V5c3RvcmVQYXNzd29yZCIsImtleVBhc3N3b3JkIiwiZXJyIiwid2FybiIsInVuc2lnbkFwayIsImphcnNpZ25lciIsInJlc29sdmUiLCJnZXRKYXZhSG9tZSIsInNpZ24iLCJhcHBQYXRoIiwiZW5kc1dpdGgiLCJBUEtTX0VYVEVOU0lPTiIsInVzZUtleXN0b3JlIiwiemlwQWxpZ25BcGsiLCJpbml0WmlwQWxpZ24iLCJiaW5hcmllcyIsInppcGFsaWduIiwiYWNjZXNzIiwiX2ZzIiwiV19PSyIsImFsaWduZWRBcGsiLCJ0ZW1wRGlyIiwicHJlZml4Iiwic3VmZml4IiwibWtkaXJwIiwibXYiLCJ1bmxpbmsiLCJjaGVja0Fwa0NlcnQiLCJwa2ciLCJvcHRzIiwiZXh0bmFtZSIsImV4dHJhY3RCYXNlQXBrIiwiaGFzaE1hdGNoZXMiLCJhcGtzaWduZXJPdXRwdXQiLCJleHBlY3RlZEhhc2hlcyIsInZhbHVlIiwidG9QYWlycyIsIlJlZ0V4cCIsInRlc3QiLCJiYXNlbmFtZSIsInJlcXVpcmVEZWZhdWx0Q2VydCIsImFwcEhhc2giLCJoYXNoIiwiaGFzIiwib3V0cHV0IiwiZXhwZWN0ZWQiLCJnZXQiLCJnZXRLZXlzdG9yZUhhc2giLCJoYXNNYXRjaCIsImluZm8iLCJpc1NpZ25lZCIsInNldCIsImVyck1zZyIsImtleXRvb2wiLCJyZXN1bHQiLCJoYXNoTmFtZSIsImhhc2hSZSIsIm1hdGNoIiwicmVwbGFjZSIsInRvTG93ZXJDYXNlIiwiaXNFbXB0eSIsIkpTT04iLCJzdHJpbmdpZnkiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvdG9vbHMvYXBrLXNpZ25pbmcuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBfZnMgZnJvbSAnZnMnO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBsb2cgZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IHRlbXBEaXIsIHN5c3RlbSwgbWtkaXJwLCBmcywgdXRpbCB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgTFJVIGZyb20gJ2xydS1jYWNoZSc7XG5pbXBvcnQge1xuICBnZXRKYXZhRm9yT3MsIGdldEFwa3NpZ25lckZvck9zLCBnZXRKYXZhSG9tZSwgZ2V0UmVzb3VyY2VQYXRoLCBBUEtTX0VYVEVOU0lPTiwgdW5zaWduQXBrLFxufSBmcm9tICcuLi9oZWxwZXJzLmpzJztcblxuY29uc3QgREVGQVVMVF9QUklWQVRFX0tFWSA9IHBhdGguam9pbigna2V5cycsICd0ZXN0a2V5LnBrOCcpO1xuY29uc3QgREVGQVVMVF9DRVJUSUZJQ0FURSA9IHBhdGguam9pbigna2V5cycsICd0ZXN0a2V5Lng1MDkucGVtJyk7XG5jb25zdCBCVU5ETEVUT09MX1RVVE9SSUFMID0gJ2h0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3N0dWRpby9jb21tYW5kLWxpbmUvYnVuZGxldG9vbCc7XG5jb25zdCBBUEtTSUdORVJfVkVSSUZZX0ZBSUwgPSAnRE9FUyBOT1QgVkVSSUZZJztcbmNvbnN0IFNIQTEgPSAnc2hhMSc7XG5jb25zdCBTSEEyNTYgPSAnc2hhMjU2JztcbmNvbnN0IFNIQTUxMiA9ICdzaGE1MTInO1xuY29uc3QgTUQ1ID0gJ21kNSc7XG5jb25zdCBERUZBVUxUX0NFUlRfSEFTSCA9IHtcbiAgW1NIQTI1Nl06ICdhNDBkYTgwYTU5ZDE3MGNhYTk1MGNmMTVjMThjNDU0ZDQ3YTM5YjI2OTg5ZDhiNjQwZWNkNzQ1YmE3MWJmNWRjJ1xufTtcbmNvbnN0IEpBVkFfUFJPUFNfSU5JVF9FUlJPUiA9ICdqYXZhLmxhbmcuRXJyb3I6IFByb3BlcnRpZXMgaW5pdCc7XG5jb25zdCBTSUdORURfQVBQU19DQUNIRSA9IG5ldyBMUlUoe1xuICBtYXg6IDMwLFxufSk7XG5cblxuY29uc3QgYXBrU2lnbmluZ01ldGhvZHMgPSB7fTtcblxuLyoqXG4gKiBFeGVjdXRlIGFwa3NpZ25lciB1dGlsaXR5IHdpdGggZ2l2ZW4gYXJndW1lbnRzLlxuICpcbiAqIEBwYXJhbSB7P0FycmF5PFN0cmluZz59IGFyZ3MgLSBUaGUgbGlzdCBvZiB0b29sIGFyZ3VtZW50cy5cbiAqIEByZXR1cm4ge3N0cmluZ30gLSBDb21tYW5kIHN0ZG91dFxuICogQHRocm93cyB7RXJyb3J9IElmIGFwa3NpZ25lciBiaW5hcnkgaXMgbm90IHByZXNlbnQgb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtXG4gKiAgICAgICAgICAgICAgICAgb3IgdGhlIHJldHVybiBjb2RlIGlzIG5vdCBlcXVhbCB0byB6ZXJvLlxuICovXG5hcGtTaWduaW5nTWV0aG9kcy5leGVjdXRlQXBrc2lnbmVyID0gYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUFwa3NpZ25lciAoYXJncyA9IFtdKSB7XG4gIGNvbnN0IGFwa1NpZ25lckphciA9IGF3YWl0IGdldEFwa3NpZ25lckZvck9zKHRoaXMpO1xuICBjb25zdCBmdWxsQ21kID0gW1xuICAgIGF3YWl0IGdldEphdmFGb3JPcygpLCAnLVhteDEwMjRNJywgJy1Yc3MxbScsXG4gICAgJy1qYXInLCBhcGtTaWduZXJKYXIsXG4gICAgLi4uYXJnc1xuICBdO1xuICBsb2cuZGVidWcoYFN0YXJ0aW5nIGFwa3NpZ25lcjogJHt1dGlsLnF1b3RlKGZ1bGxDbWQpfWApO1xuICAvLyBJdCBpcyBuZWNlc3NhcnkgdG8gc3BlY2lmeSBDV0QgZXhwbGljaXRseTsgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2lzc3Vlcy8xNDcyNCNpc3N1ZWNvbW1lbnQtNzM3NDQ2NzE1XG4gIGNvbnN0IHtzdGRvdXQsIHN0ZGVycn0gPSBhd2FpdCBleGVjKGZ1bGxDbWRbMF0sIGZ1bGxDbWQuc2xpY2UoMSksIHtcbiAgICBjd2Q6IHBhdGguZGlybmFtZShhcGtTaWduZXJKYXIpLCB3aW5kb3dzVmVyYmF0aW1Bcmd1bWVudHM6IHN5c3RlbS5pc1dpbmRvd3MoKVxuICB9KTtcbiAgZm9yIChsZXQgW25hbWUsIHN0cmVhbV0gb2YgW1snc3Rkb3V0Jywgc3Rkb3V0XSwgWydzdGRlcnInLCBzdGRlcnJdXSkge1xuICAgIGlmICghXy50cmltKHN0cmVhbSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChuYW1lID09PSAnc3Rkb3V0Jykge1xuICAgICAgLy8gTWFrZSB0aGUgb3V0cHV0IGxlc3MgdGFsa2F0aXZlXG4gICAgICBzdHJlYW0gPSBzdHJlYW0uc3BsaXQoJ1xcbicpXG4gICAgICAgIC5maWx0ZXIoKGxpbmUpID0+ICFsaW5lLmluY2x1ZGVzKCdXQVJOSU5HOicpKVxuICAgICAgICAuam9pbignXFxuJyk7XG4gICAgfVxuICAgIGxvZy5kZWJ1ZyhgYXBrc2lnbmVyICR7bmFtZX06ICR7c3RyZWFtfWApO1xuICB9XG4gIHJldHVybiBzdGRvdXQ7XG59O1xuXG4vKipcbiAqIChSZSlzaWduIHRoZSBnaXZlbiBhcGsgZmlsZSBvbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0gd2l0aCB0aGUgZGVmYXVsdCBjZXJ0aWZpY2F0ZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBrIC0gVGhlIGZ1bGwgcGF0aCB0byB0aGUgbG9jYWwgYXBrIGZpbGUuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgc2lnbmluZyBmYWlscy5cbiAqL1xuYXBrU2lnbmluZ01ldGhvZHMuc2lnbldpdGhEZWZhdWx0Q2VydCA9IGFzeW5jIGZ1bmN0aW9uIHNpZ25XaXRoRGVmYXVsdENlcnQgKGFwaykge1xuICBsb2cuZGVidWcoYFNpZ25pbmcgJyR7YXBrfScgd2l0aCBkZWZhdWx0IGNlcnRgKTtcbiAgaWYgKCEoYXdhaXQgZnMuZXhpc3RzKGFwaykpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2Fwa30gZmlsZSBkb2Vzbid0IGV4aXN0LmApO1xuICB9XG5cbiAgY29uc3QgYXJncyA9IFtcbiAgICAnc2lnbicsXG4gICAgJy0ta2V5JywgYXdhaXQgZ2V0UmVzb3VyY2VQYXRoKERFRkFVTFRfUFJJVkFURV9LRVkpLFxuICAgICctLWNlcnQnLCBhd2FpdCBnZXRSZXNvdXJjZVBhdGgoREVGQVVMVF9DRVJUSUZJQ0FURSksXG4gICAgYXBrLFxuICBdO1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuZXhlY3V0ZUFwa3NpZ25lcihhcmdzKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IHNpZ24gJyR7YXBrfScgd2l0aCB0aGUgZGVmYXVsdCBjZXJ0aWZpY2F0ZS4gYCArXG4gICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZS5zdGRlcnIgfHwgZS5zdGRvdXQgfHwgZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIChSZSlzaWduIHRoZSBnaXZlbiBhcGsgZmlsZSBvbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0gd2l0aCBhIGN1c3RvbSBjZXJ0aWZpY2F0ZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBrIC0gVGhlIGZ1bGwgcGF0aCB0byB0aGUgbG9jYWwgYXBrIGZpbGUuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgc2lnbmluZyBmYWlscy5cbiAqL1xuYXBrU2lnbmluZ01ldGhvZHMuc2lnbldpdGhDdXN0b21DZXJ0ID0gYXN5bmMgZnVuY3Rpb24gc2lnbldpdGhDdXN0b21DZXJ0IChhcGspIHtcbiAgbG9nLmRlYnVnKGBTaWduaW5nICcke2Fwa30nIHdpdGggY3VzdG9tIGNlcnRgKTtcbiAgaWYgKCEoYXdhaXQgZnMuZXhpc3RzKHRoaXMua2V5c3RvcmVQYXRoKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEtleXN0b3JlOiAke3RoaXMua2V5c3RvcmVQYXRofSBkb2Vzbid0IGV4aXN0LmApO1xuICB9XG4gIGlmICghKGF3YWl0IGZzLmV4aXN0cyhhcGspKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJyR7YXBrfScgZG9lc24ndCBleGlzdC5gKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5leGVjdXRlQXBrc2lnbmVyKFsnc2lnbicsXG4gICAgICAnLS1rcycsIHRoaXMua2V5c3RvcmVQYXRoLFxuICAgICAgJy0ta3Mta2V5LWFsaWFzJywgdGhpcy5rZXlBbGlhcyxcbiAgICAgICctLWtzLXBhc3MnLCBgcGFzczoke3RoaXMua2V5c3RvcmVQYXNzd29yZH1gLFxuICAgICAgJy0ta2V5LXBhc3MnLCBgcGFzczoke3RoaXMua2V5UGFzc3dvcmR9YCxcbiAgICAgIGFwa10pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cud2FybihgQ2Fubm90IHVzZSBhcGtzaWduZXIgdG9vbCBmb3Igc2lnbmluZy4gRGVmYXVsdGluZyB0byBqYXJzaWduZXIuIGAgK1xuICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2Vyci5zdGRlcnIgfHwgZXJyLnN0ZG91dCB8fCBlcnIubWVzc2FnZX1gKTtcbiAgICB0cnkge1xuICAgICAgaWYgKGF3YWl0IHVuc2lnbkFwayhhcGspKSB7XG4gICAgICAgIGxvZy5kZWJ1ZyhgJyR7YXBrfScgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHVuc2lnbmVkYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2cuZGVidWcoYCcke2Fwa30nIGRvZXMgbm90IG5lZWQgdG8gYmUgdW5zaWduZWRgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGphcnNpZ25lciA9IHBhdGgucmVzb2x2ZShhd2FpdCBnZXRKYXZhSG9tZSgpLCAnYmluJyxcbiAgICAgICAgYGphcnNpZ25lciR7c3lzdGVtLmlzV2luZG93cygpID8gJy5leGUnIDogJyd9YCk7XG4gICAgICBjb25zdCBmdWxsQ21kID0gW2phcnNpZ25lcixcbiAgICAgICAgJy1zaWdhbGcnLCAnTUQ1d2l0aFJTQScsXG4gICAgICAgICctZGlnZXN0YWxnJywgJ1NIQTEnLFxuICAgICAgICAnLWtleXN0b3JlJywgdGhpcy5rZXlzdG9yZVBhdGgsXG4gICAgICAgICctc3RvcmVwYXNzJywgdGhpcy5rZXlzdG9yZVBhc3N3b3JkLFxuICAgICAgICAnLWtleXBhc3MnLCB0aGlzLmtleVBhc3N3b3JkLFxuICAgICAgICBhcGssIHRoaXMua2V5QWxpYXNdO1xuICAgICAgbG9nLmRlYnVnKGBTdGFydGluZyBqYXJzaWduZXI6ICR7dXRpbC5xdW90ZShmdWxsQ21kKX1gKTtcbiAgICAgIGF3YWl0IGV4ZWMoZnVsbENtZFswXSwgZnVsbENtZC5zbGljZSgxKSwgeyB3aW5kb3dzVmVyYmF0aW1Bcmd1bWVudHM6IHN5c3RlbS5pc1dpbmRvd3MoKSB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBzaWduIHdpdGggY3VzdG9tIGNlcnRpZmljYXRlLiBgICtcbiAgICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2Uuc3RkZXJyIHx8IGUubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogKFJlKXNpZ24gdGhlIGdpdmVuIGFwayBmaWxlIG9uIHRoZSBsb2NhbCBmaWxlIHN5c3RlbSB3aXRoIGVpdGhlclxuICogY3VzdG9tIG9yIGRlZmF1bHQgY2VydGlmaWNhdGUgYmFzZWQgb24gX3RoaXMudXNlS2V5c3RvcmVfIHByb3BlcnR5IHZhbHVlXG4gKiBhbmQgWmlwLWFsaWducyBpdCBhZnRlciBzaWduaW5nLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcHBQYXRoIC0gVGhlIGZ1bGwgcGF0aCB0byB0aGUgbG9jYWwgLmFwayhzKSBmaWxlLlxuICogQHRocm93cyB7RXJyb3J9IElmIHNpZ25pbmcgZmFpbHMuXG4gKi9cbmFwa1NpZ25pbmdNZXRob2RzLnNpZ24gPSBhc3luYyBmdW5jdGlvbiBzaWduIChhcHBQYXRoKSB7XG4gIGlmIChhcHBQYXRoLmVuZHNXaXRoKEFQS1NfRVhURU5TSU9OKSkge1xuICAgIGxldCBtZXNzYWdlID0gJ1NpZ25pbmcgb2YgLmFwa3MtZmlsZXMgaXMgbm90IHN1cHBvcnRlZC4gJztcbiAgICBpZiAodGhpcy51c2VLZXlzdG9yZSkge1xuICAgICAgbWVzc2FnZSArPSAnQ29uc2lkZXIgbWFudWFsIGFwcGxpY2F0aW9uIGJ1bmRsZSBzaWduaW5nIHdpdGggdGhlIGN1c3RvbSBrZXlzdG9yZSAnICtcbiAgICAgICAgYGxpa2UgaXQgaXMgZGVzY3JpYmVkIGF0ICR7QlVORExFVE9PTF9UVVRPUklBTH1gO1xuICAgIH0gZWxzZSB7XG4gICAgICBtZXNzYWdlICs9IGBDb25zaWRlciBtYW51YWwgYXBwbGljYXRpb24gYnVuZGxlIHNpZ25pbmcgd2l0aCB0aGUga2V5IGF0ICcke0RFRkFVTFRfUFJJVkFURV9LRVl9JyBgICtcbiAgICAgICAgYGFuZCB0aGUgY2VydGlmaWNhdGUgYXQgJyR7REVGQVVMVF9DRVJUSUZJQ0FURX0nLiBSZWFkICR7QlVORExFVE9PTF9UVVRPUklBTH0gZm9yIG1vcmUgZGV0YWlscy5gO1xuICAgIH1cbiAgICBsb2cud2FybihtZXNzYWdlKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBpdCBpcyBuZWNlc3NhcnkgdG8gYXBwbHkgemlwYWxpZ24gb25seSBiZWZvcmUgc2lnbmluZ1xuICAvLyBpZiBhcGtzaWduZXIgaXMgdXNlZFxuICBhd2FpdCB0aGlzLnppcEFsaWduQXBrKGFwcFBhdGgpO1xuXG4gIGlmICh0aGlzLnVzZUtleXN0b3JlKSB7XG4gICAgYXdhaXQgdGhpcy5zaWduV2l0aEN1c3RvbUNlcnQoYXBwUGF0aCk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgdGhpcy5zaWduV2l0aERlZmF1bHRDZXJ0KGFwcFBhdGgpO1xuICB9XG59O1xuXG4vKipcbiAqIFBlcmZvcm0gemlwLWFsaWduaW5nIHRvIHRoZSBnaXZlbiBsb2NhbCBhcGsgZmlsZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBrIC0gVGhlIGZ1bGwgcGF0aCB0byB0aGUgbG9jYWwgYXBrIGZpbGUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgYXBrIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBhbGlnbmVkXG4gKiBvciBmYWxzZSBpZiB0aGUgYXBrIGhhcyBiZWVuIGFscmVhZHkgYWxpZ25lZC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB6aXAtYWxpZ24gZmFpbHMuXG4gKi9cbmFwa1NpZ25pbmdNZXRob2RzLnppcEFsaWduQXBrID0gYXN5bmMgZnVuY3Rpb24gemlwQWxpZ25BcGsgKGFwaykge1xuICBhd2FpdCB0aGlzLmluaXRaaXBBbGlnbigpO1xuICB0cnkge1xuICAgIGF3YWl0IGV4ZWModGhpcy5iaW5hcmllcy56aXBhbGlnbiwgWyctYycsICc0JywgYXBrXSk7XG4gICAgbG9nLmRlYnVnKGAke2Fwa30nIGlzIGFscmVhZHkgemlwLWFsaWduZWQuIERvaW5nIG5vdGhpbmdgKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2cuZGVidWcoYCcke2Fwa30nIGlzIG5vdCB6aXAtYWxpZ25lZC4gQWxpZ25pbmdgKTtcbiAgfVxuICB0cnkge1xuICAgIGF3YWl0IGZzLmFjY2VzcyhhcGssIF9mcy5XX09LKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGZpbGUgYXQgJyR7YXBrfScgaXMgbm90IHdyaXRlYWJsZS4gYCArXG4gICAgICBgUGxlYXNlIGdyYW50IHdyaXRlIHBlcm1pc3Npb25zIHRvIHRoaXMgZmlsZSBvciB0byBpdHMgcGFyZW50IGZvbGRlciAnJHtwYXRoLmRpcm5hbWUoYXBrKX0nIGAgK1xuICAgICAgYGZvciB0aGUgQXBwaXVtIHByb2Nlc3MsIHNvIGl0IGNhbiB6aXAtYWxpZ24gdGhlIGZpbGVgKTtcbiAgfVxuICBjb25zdCBhbGlnbmVkQXBrID0gYXdhaXQgdGVtcERpci5wYXRoKHtwcmVmaXg6ICdhcHBpdW0nLCBzdWZmaXg6ICcudG1wJ30pO1xuICBhd2FpdCBta2RpcnAocGF0aC5kaXJuYW1lKGFsaWduZWRBcGspKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBleGVjKHRoaXMuYmluYXJpZXMuemlwYWxpZ24sIFsnLWYnLCAnNCcsIGFwaywgYWxpZ25lZEFwa10pO1xuICAgIGF3YWl0IGZzLm12KGFsaWduZWRBcGssIGFwaywgeyBta2RpcnA6IHRydWUgfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKGFsaWduZWRBcGspKSB7XG4gICAgICBhd2FpdCBmcy51bmxpbmsoYWxpZ25lZEFwayk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgemlwQWxpZ25BcGsgZmFpbGVkLiBPcmlnaW5hbCBlcnJvcjogJHtlLnN0ZGVyciB8fCBlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gQ2VydENoZWNrT3B0aW9uc1xuICogQHByb3BlcnR5IHtib29sZWFufSByZXF1aXJlRGVmYXVsdENlcnQgW3RydWVdIFdoZXRoZXIgdG8gcmVxdWlyZSB0aGF0IHRoZSBkZXN0aW5hdGlvbiBBUEtcbiAqIGlzIHNpZ25lZCB3aXRoIHRoZSBkZWZhdWx0IEFwcGl1bSBjZXJ0aWZpY2F0ZSBvciBhbnkgdmFsaWQgY2VydGlmaWNhdGUuIFRoaXMgb3B0aW9uXG4gKiBvbmx5IGhhcyBlZmZlY3QgaWYgYHVzZUtleXN0b3JlYCBwcm9wZXJ0eSBpcyB1bnNldC5cbiAqL1xuXG4vKipcbiAqIENoZWNrIGlmIHRoZSBhcHAgaXMgYWxyZWFkeSBzaWduZWQgd2l0aCB0aGUgZGVmYXVsdCBBcHBpdW0gY2VydGlmaWNhdGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwcFBhdGggLSBUaGUgZnVsbCBwYXRoIHRvIHRoZSBsb2NhbCAuYXBrKHMpIGZpbGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gcGdrIC0gVGhlIG5hbWUgb2YgYXBwbGljYXRpb24gcGFja2FnZS5cbiAqIEBwYXJhbSB7Q2VydENoZWNrT3B0aW9uc30gb3B0cyAtIENlcnRpZmljYXRlIGNoZWNraW5nIG9wdGlvbnNcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgZ2l2ZW4gYXBwbGljYXRpb24gaXMgYWxyZWFkeSBzaWduZWQuXG4gKi9cbmFwa1NpZ25pbmdNZXRob2RzLmNoZWNrQXBrQ2VydCA9IGFzeW5jIGZ1bmN0aW9uIGNoZWNrQXBrQ2VydCAoYXBwUGF0aCwgcGtnLCBvcHRzID0ge30pIHtcbiAgbG9nLmRlYnVnKGBDaGVja2luZyBhcHAgY2VydCBmb3IgJHthcHBQYXRofWApO1xuICBpZiAoIWF3YWl0IGZzLmV4aXN0cyhhcHBQYXRoKSkge1xuICAgIGxvZy5kZWJ1ZyhgJyR7YXBwUGF0aH0nIGRvZXMgbm90IGV4aXN0YCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHBhdGguZXh0bmFtZShhcHBQYXRoKSA9PT0gQVBLU19FWFRFTlNJT04pIHtcbiAgICBhcHBQYXRoID0gYXdhaXQgdGhpcy5leHRyYWN0QmFzZUFwayhhcHBQYXRoKTtcbiAgfVxuXG4gIGNvbnN0IGhhc2hNYXRjaGVzID0gKGFwa3NpZ25lck91dHB1dCwgZXhwZWN0ZWRIYXNoZXMpID0+IHtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgXy50b1BhaXJzKGV4cGVjdGVkSGFzaGVzKSkge1xuICAgICAgaWYgKG5ldyBSZWdFeHAoYGRpZ2VzdDpcXFxccyske3ZhbHVlfVxcXFxiYCwgJ2knKS50ZXN0KGFwa3NpZ25lck91dHB1dCkpIHtcbiAgICAgICAgbG9nLmRlYnVnKGAke25hbWV9IGhhc2ggZGlkIG1hdGNoIGZvciAnJHtwYXRoLmJhc2VuYW1lKGFwcFBhdGgpfSdgKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICBjb25zdCB7XG4gICAgcmVxdWlyZURlZmF1bHRDZXJ0ID0gdHJ1ZSxcbiAgfSA9IG9wdHM7XG5cbiAgY29uc3QgYXBwSGFzaCA9IGF3YWl0IGZzLmhhc2goYXBwUGF0aCk7XG4gIGlmIChTSUdORURfQVBQU19DQUNIRS5oYXMoYXBwSGFzaCkpIHtcbiAgICBsb2cuZGVidWcoYFVzaW5nIHRoZSBwcmV2aW91c2x5IGNhY2hlZCBzaWduYXR1cmUgZW50cnkgZm9yICcke3BhdGguYmFzZW5hbWUoYXBwUGF0aCl9J2ApO1xuICAgIGNvbnN0IHtrZXlzdG9yZVBhdGgsIG91dHB1dCwgZXhwZWN0ZWR9ID0gU0lHTkVEX0FQUFNfQ0FDSEUuZ2V0KGFwcEhhc2gpO1xuICAgIGlmICh0aGlzLnVzZUtleXN0b3JlICYmIHRoaXMua2V5c3RvcmVQYXRoID09PSBrZXlzdG9yZVBhdGggfHwgIXRoaXMudXNlS2V5c3RvcmUpIHtcbiAgICAgIHJldHVybiAoIXRoaXMudXNlS2V5c3RvcmUgJiYgIXJlcXVpcmVEZWZhdWx0Q2VydCkgfHwgaGFzaE1hdGNoZXMob3V0cHV0LCBleHBlY3RlZCk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZXhwZWN0ZWQgPSB0aGlzLnVzZUtleXN0b3JlXG4gICAgPyBhd2FpdCB0aGlzLmdldEtleXN0b3JlSGFzaChhcHBQYXRoLCBwa2cpXG4gICAgOiBERUZBVUxUX0NFUlRfSEFTSDtcbiAgdHJ5IHtcbiAgICBhd2FpdCBnZXRBcGtzaWduZXJGb3JPcyh0aGlzKTtcbiAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVBcGtzaWduZXIoWyd2ZXJpZnknLCAnLS1wcmludC1jZXJ0cycsIGFwcFBhdGhdKTtcbiAgICBjb25zdCBoYXNNYXRjaCA9IGhhc2hNYXRjaGVzKG91dHB1dCwgZXhwZWN0ZWQpO1xuICAgIGlmIChoYXNNYXRjaCkge1xuICAgICAgbG9nLmluZm8oYCcke2FwcFBhdGh9JyBpcyBzaWduZWQgd2l0aCB0aGUgYCArXG4gICAgICAgIGAke3RoaXMudXNlS2V5c3RvcmUgPyAna2V5c3RvcmUnIDogJ2RlZmF1bHQnfSBjZXJ0aWZpY2F0ZWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2cuaW5mbyhgJyR7YXBwUGF0aH0nIGlzIHNpZ25lZCB3aXRoIGEgYCArXG4gICAgICAgIGBub24tJHt0aGlzLnVzZUtleXN0b3JlID8gJ2tleXN0b3JlJyA6ICdkZWZhdWx0J30gY2VydGlmaWNhdGVgKTtcbiAgICB9XG4gICAgY29uc3QgaXNTaWduZWQgPSAoIXRoaXMudXNlS2V5c3RvcmUgJiYgIXJlcXVpcmVEZWZhdWx0Q2VydCkgfHwgaGFzTWF0Y2g7XG4gICAgaWYgKGlzU2lnbmVkKSB7XG4gICAgICBTSUdORURfQVBQU19DQUNIRS5zZXQoYXBwSGFzaCwge1xuICAgICAgICBvdXRwdXQsXG4gICAgICAgIGV4cGVjdGVkLFxuICAgICAgICBrZXlzdG9yZVBhdGg6IHRoaXMua2V5c3RvcmVQYXRoLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBpc1NpZ25lZDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgbm8gc2lnbmF0dXJlXG4gICAgaWYgKF8uaW5jbHVkZXMoZXJyLnN0ZGVyciwgQVBLU0lHTkVSX1ZFUklGWV9GQUlMKSkge1xuICAgICAgbG9nLmluZm8oYCcke2FwcFBhdGh9JyBpcyBub3Qgc2lnbmVkYCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGVyck1zZyA9IGVyci5zdGRlcnIgfHwgZXJyLnN0ZG91dCB8fCBlcnIubWVzc2FnZTtcbiAgICBpZiAoXy5pbmNsdWRlcyhlcnJNc2csIEpBVkFfUFJPUFNfSU5JVF9FUlJPUikpIHtcbiAgICAgIC8vIFRoaXMgZXJyb3IgcG9wcyB1cCByYW5kb21seSBhbmQgd2UgYXJlIG5vdCBxdWl0ZSBzdXJlIHdoeS5cbiAgICAgIC8vIE15IGd1ZXNzIC0gYSByYWNlIGNvbmRpdGlvbiBpbiBqYXZhIHZtIGluaXRpYWxpemF0aW9uLlxuICAgICAgLy8gTmV2ZXJ0aGVsZXNzLCBsZXRzIG1ha2UgQXBwaXVtIHRvIGJlbGlldmUgdGhlIGZpbGUgaXMgYWxyZWFkeSBzaWduZWQsXG4gICAgICAvLyBiZWNhdXNlIGl0IHdvdWxkIGJlIHRydWUgZm9yIDk5JSBvZiBVSUF1dG9tYXRvcjItYmFzZWRcbiAgICAgIC8vIHRlc3RzLCB3aGVyZSB3ZSBwcmVzaWduIHNlcnZlciBiaW5hcmllcyB3aGlsZSBwdWJsaXNoaW5nIHRoZWlyIE5QTSBtb2R1bGUuXG4gICAgICAvLyBJZiB0aGVzZSBhcmUgbm90IHNpZ25lZCwgZS5nLiBpbiBjYXNlIG9mIEVzcHJlc3NvLCB0aGVuIHRoZSBuZXh0IHN0ZXAocylcbiAgICAgIC8vIHdvdWxkIGFueXdheSBmYWlsLlxuICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2lzc3Vlcy8xNDcyNCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgbG9nLndhcm4oZXJyTXNnKTtcbiAgICAgIGxvZy53YXJuKGBBc3N1bWluZyAnJHthcHBQYXRofScgaXMgYWxyZWFkeSBzaWduZWQgYW5kIGNvbnRpbnVpbmcgYW55d2F5YCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgdmVyaWZ5IHRoZSBzaWduYXR1cmUgb2YgJyR7YXBwUGF0aH0nLiBgICtcbiAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlcnJNc2d9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gS2V5c3RvcmVIYXNoXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IG1kNSB0aGUgbWQ1IGhhc2ggdmFsdWUgb2YgdGhlIGtleXN0b3JlXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHNoYTEgdGhlIHNoYTEgaGFzaCB2YWx1ZSBvZiB0aGUga2V5c3RvcmVcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gc2hhMjU2IHRoZSBzaGEyNTYgaGFzaCB2YWx1ZSBvZiB0aGUga2V5c3RvcmVcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gc2hhNTEyIHRoZSBzaGE1MTIgaGFzaCB2YWx1ZSBvZiB0aGUga2V5c3RvcmVcbiAqL1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSB0aGUgaGFzaCBvZiB0aGUgZ2l2ZW4ga2V5c3RvcmUuXG4gKlxuICogQHJldHVybiB7S2V5c3RvcmVIYXNofVxuICogQHRocm93cyB7RXJyb3J9IElmIGdldHRpbmcga2V5c3RvcmUgaGFzaCBmYWlscy5cbiAqL1xuYXBrU2lnbmluZ01ldGhvZHMuZ2V0S2V5c3RvcmVIYXNoID0gYXN5bmMgZnVuY3Rpb24gZ2V0S2V5c3RvcmVIYXNoICgpIHtcbiAgbG9nLmRlYnVnKGBHZXR0aW5nIGhhc2ggb2YgdGhlICcke3RoaXMua2V5c3RvcmVQYXRofScga2V5c3RvcmVgKTtcbiAgY29uc3Qga2V5dG9vbCA9IHBhdGgucmVzb2x2ZShhd2FpdCBnZXRKYXZhSG9tZSgpLCAnYmluJyxcbiAgICBga2V5dG9vbCR7c3lzdGVtLmlzV2luZG93cygpID8gJy5leGUnIDogJyd9YCk7XG4gIGlmICghYXdhaXQgZnMuZXhpc3RzKGtleXRvb2wpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUaGUga2V5dG9vbCB1dGlsaXR5IGNhbm5vdCBiZSBmb3VuZCBhdCAnJHtrZXl0b29sfSdgKTtcbiAgfVxuICBjb25zdCBhcmdzID0gW1xuICAgICctdicsICctbGlzdCcsXG4gICAgJy1hbGlhcycsIHRoaXMua2V5QWxpYXMsXG4gICAgJy1rZXlzdG9yZScsIHRoaXMua2V5c3RvcmVQYXRoLFxuICAgICctc3RvcmVwYXNzJywgdGhpcy5rZXlzdG9yZVBhc3N3b3JkXG4gIF07XG4gIGxvZy5pbmZvKGBSdW5uaW5nICcke2tleXRvb2x9JyB3aXRoIGFyZ3VtZW50czogJHt1dGlsLnF1b3RlKGFyZ3MpfWApO1xuICB0cnkge1xuICAgIGNvbnN0IHtzdGRvdXR9ID0gYXdhaXQgZXhlYyhrZXl0b29sLCBhcmdzLCB7IHdpbmRvd3NWZXJiYXRpbUFyZ3VtZW50czogc3lzdGVtLmlzV2luZG93cygpIH0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGZvciAoY29uc3QgaGFzaE5hbWUgb2YgW1NIQTUxMiwgU0hBMjU2LCBTSEExLCBNRDVdKSB7XG4gICAgICBjb25zdCBoYXNoUmUgPSBuZXcgUmVnRXhwKGBeXFxcXHMqJHtoYXNoTmFtZX06XFxcXHMqKFthLWYwLTk6XSspYCwgJ21pJyk7XG4gICAgICBjb25zdCBtYXRjaCA9IGhhc2hSZS5leGVjKHN0ZG91dCk7XG4gICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcmVzdWx0W2hhc2hOYW1lXSA9IG1hdGNoWzFdLnJlcGxhY2UoLzovZywgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuICAgIGlmIChfLmlzRW1wdHkocmVzdWx0KSkge1xuICAgICAgbG9nLmRlYnVnKHN0ZG91dCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBwYXJzZSB0aGUgaGFzaCB2YWx1ZSBmcm9tIHRoZSBrZXl0b29sIG91dHB1dCcpO1xuICAgIH1cbiAgICBsb2cuZGVidWcoYEtleXN0b3JlIGhhc2g6ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0KX1gKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZ2V0IHRoZSBoYXNoIG9mICcke3RoaXMua2V5c3RvcmVQYXRofScga2V5c3RvcmUuIGAgK1xuICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2Uuc3RkZXJyIHx8IGUubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgYXBrU2lnbmluZ01ldGhvZHM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBLE1BQU1BLG1CQUFtQixHQUFHQyxhQUFJLENBQUNDLElBQUksQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDO0FBQzVELE1BQU1DLG1CQUFtQixHQUFHRixhQUFJLENBQUNDLElBQUksQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLENBQUM7QUFDakUsTUFBTUUsbUJBQW1CLEdBQUcsOERBQThEO0FBQzFGLE1BQU1DLHFCQUFxQixHQUFHLGlCQUFpQjtBQUMvQyxNQUFNQyxJQUFJLEdBQUcsTUFBTTtBQUNuQixNQUFNQyxNQUFNLEdBQUcsUUFBUTtBQUN2QixNQUFNQyxNQUFNLEdBQUcsUUFBUTtBQUN2QixNQUFNQyxHQUFHLEdBQUcsS0FBSztBQUNqQixNQUFNQyxpQkFBaUIsR0FBRztFQUN4QixDQUFDSCxNQUFNLEdBQUc7QUFDWixDQUFDO0FBQ0QsTUFBTUkscUJBQXFCLEdBQUcsa0NBQWtDO0FBQ2hFLE1BQU1DLGlCQUFpQixHQUFHLElBQUlDLGlCQUFHLENBQUM7RUFDaENDLEdBQUcsRUFBRTtBQUNQLENBQUMsQ0FBQztBQUdGLE1BQU1DLGlCQUFpQixHQUFHLENBQUMsQ0FBQztBQVU1QkEsaUJBQWlCLENBQUNDLGdCQUFnQixHQUFHLGVBQWVBLGdCQUFnQixDQUFFQyxJQUFJLEdBQUcsRUFBRSxFQUFFO0VBQy9FLE1BQU1DLFlBQVksR0FBRyxNQUFNLElBQUFDLDBCQUFpQixFQUFDLElBQUksQ0FBQztFQUNsRCxNQUFNQyxPQUFPLEdBQUcsQ0FDZCxNQUFNLElBQUFDLHFCQUFZLEdBQUUsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUMzQyxNQUFNLEVBQUVILFlBQVksRUFDcEIsR0FBR0QsSUFBSSxDQUNSO0VBQ0RLLGVBQUcsQ0FBQ0MsS0FBSyxDQUFFLHVCQUFzQkMsYUFBSSxDQUFDQyxLQUFLLENBQUNMLE9BQU8sQ0FBRSxFQUFDLENBQUM7RUFFdkQsTUFBTTtJQUFDTSxNQUFNO0lBQUVDO0VBQU0sQ0FBQyxHQUFHLE1BQU0sSUFBQUMsa0JBQUksRUFBQ1IsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFQSxPQUFPLENBQUNTLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRTtJQUNoRUMsR0FBRyxFQUFFN0IsYUFBSSxDQUFDOEIsT0FBTyxDQUFDYixZQUFZLENBQUM7SUFBRWMsd0JBQXdCLEVBQUVDLGVBQU0sQ0FBQ0MsU0FBUztFQUM3RSxDQUFDLENBQUM7RUFDRixLQUFLLElBQUksQ0FBQ0MsSUFBSSxFQUFFQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFVixNQUFNLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRUMsTUFBTSxDQUFDLENBQUMsRUFBRTtJQUNuRSxJQUFJLENBQUNVLGVBQUMsQ0FBQ0MsSUFBSSxDQUFDRixNQUFNLENBQUMsRUFBRTtNQUNuQjtJQUNGO0lBRUEsSUFBSUQsSUFBSSxLQUFLLFFBQVEsRUFBRTtNQUVyQkMsTUFBTSxHQUFHQSxNQUFNLENBQUNHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FDeEJDLE1BQU0sQ0FBRUMsSUFBSSxJQUFLLENBQUNBLElBQUksQ0FBQ0MsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQzVDeEMsSUFBSSxDQUFDLElBQUksQ0FBQztJQUNmO0lBQ0FvQixlQUFHLENBQUNDLEtBQUssQ0FBRSxhQUFZWSxJQUFLLEtBQUlDLE1BQU8sRUFBQyxDQUFDO0VBQzNDO0VBQ0EsT0FBT1YsTUFBTTtBQUNmLENBQUM7QUFRRFgsaUJBQWlCLENBQUM0QixtQkFBbUIsR0FBRyxlQUFlQSxtQkFBbUIsQ0FBRUMsR0FBRyxFQUFFO0VBQy9FdEIsZUFBRyxDQUFDQyxLQUFLLENBQUUsWUFBV3FCLEdBQUkscUJBQW9CLENBQUM7RUFDL0MsSUFBSSxFQUFFLE1BQU1DLFdBQUUsQ0FBQ0MsTUFBTSxDQUFDRixHQUFHLENBQUMsQ0FBQyxFQUFFO0lBQzNCLE1BQU0sSUFBSUcsS0FBSyxDQUFFLEdBQUVILEdBQUksc0JBQXFCLENBQUM7RUFDL0M7RUFFQSxNQUFNM0IsSUFBSSxHQUFHLENBQ1gsTUFBTSxFQUNOLE9BQU8sRUFBRSxNQUFNLElBQUErQix3QkFBZSxFQUFDaEQsbUJBQW1CLENBQUMsRUFDbkQsUUFBUSxFQUFFLE1BQU0sSUFBQWdELHdCQUFlLEVBQUM3QyxtQkFBbUIsQ0FBQyxFQUNwRHlDLEdBQUcsQ0FDSjtFQUNELElBQUk7SUFDRixNQUFNLElBQUksQ0FBQzVCLGdCQUFnQixDQUFDQyxJQUFJLENBQUM7RUFDbkMsQ0FBQyxDQUFDLE9BQU9nQyxDQUFDLEVBQUU7SUFDVixNQUFNLElBQUlGLEtBQUssQ0FBRSxtQkFBa0JILEdBQUksa0NBQWlDLEdBQ3JFLG1CQUFrQkssQ0FBQyxDQUFDdEIsTUFBTSxJQUFJc0IsQ0FBQyxDQUFDdkIsTUFBTSxJQUFJdUIsQ0FBQyxDQUFDQyxPQUFRLEVBQUMsQ0FBQztFQUMzRDtBQUNGLENBQUM7QUFRRG5DLGlCQUFpQixDQUFDb0Msa0JBQWtCLEdBQUcsZUFBZUEsa0JBQWtCLENBQUVQLEdBQUcsRUFBRTtFQUM3RXRCLGVBQUcsQ0FBQ0MsS0FBSyxDQUFFLFlBQVdxQixHQUFJLG9CQUFtQixDQUFDO0VBQzlDLElBQUksRUFBRSxNQUFNQyxXQUFFLENBQUNDLE1BQU0sQ0FBQyxJQUFJLENBQUNNLFlBQVksQ0FBQyxDQUFDLEVBQUU7SUFDekMsTUFBTSxJQUFJTCxLQUFLLENBQUUsYUFBWSxJQUFJLENBQUNLLFlBQWEsaUJBQWdCLENBQUM7RUFDbEU7RUFDQSxJQUFJLEVBQUUsTUFBTVAsV0FBRSxDQUFDQyxNQUFNLENBQUNGLEdBQUcsQ0FBQyxDQUFDLEVBQUU7SUFDM0IsTUFBTSxJQUFJRyxLQUFLLENBQUUsSUFBR0gsR0FBSSxrQkFBaUIsQ0FBQztFQUM1QztFQUVBLElBQUk7SUFDRixNQUFNLElBQUksQ0FBQzVCLGdCQUFnQixDQUFDLENBQUMsTUFBTSxFQUNqQyxNQUFNLEVBQUUsSUFBSSxDQUFDb0MsWUFBWSxFQUN6QixnQkFBZ0IsRUFBRSxJQUFJLENBQUNDLFFBQVEsRUFDL0IsV0FBVyxFQUFHLFFBQU8sSUFBSSxDQUFDQyxnQkFBaUIsRUFBQyxFQUM1QyxZQUFZLEVBQUcsUUFBTyxJQUFJLENBQUNDLFdBQVksRUFBQyxFQUN4Q1gsR0FBRyxDQUFDLENBQUM7RUFDVCxDQUFDLENBQUMsT0FBT1ksR0FBRyxFQUFFO0lBQ1psQyxlQUFHLENBQUNtQyxJQUFJLENBQUUsa0VBQWlFLEdBQ3hFLG1CQUFrQkQsR0FBRyxDQUFDN0IsTUFBTSxJQUFJNkIsR0FBRyxDQUFDOUIsTUFBTSxJQUFJOEIsR0FBRyxDQUFDTixPQUFRLEVBQUMsQ0FBQztJQUMvRCxJQUFJO01BQ0YsSUFBSSxNQUFNLElBQUFRLGtCQUFTLEVBQUNkLEdBQUcsQ0FBQyxFQUFFO1FBQ3hCdEIsZUFBRyxDQUFDQyxLQUFLLENBQUUsSUFBR3FCLEdBQUksa0NBQWlDLENBQUM7TUFDdEQsQ0FBQyxNQUFNO1FBQ0x0QixlQUFHLENBQUNDLEtBQUssQ0FBRSxJQUFHcUIsR0FBSSxnQ0FBK0IsQ0FBQztNQUNwRDtNQUNBLE1BQU1lLFNBQVMsR0FBRzFELGFBQUksQ0FBQzJELE9BQU8sQ0FBQyxNQUFNLElBQUFDLG9CQUFXLEdBQUUsRUFBRSxLQUFLLEVBQ3RELFlBQVc1QixlQUFNLENBQUNDLFNBQVMsRUFBRSxHQUFHLE1BQU0sR0FBRyxFQUFHLEVBQUMsQ0FBQztNQUNqRCxNQUFNZCxPQUFPLEdBQUcsQ0FBQ3VDLFNBQVMsRUFDeEIsU0FBUyxFQUFFLFlBQVksRUFDdkIsWUFBWSxFQUFFLE1BQU0sRUFDcEIsV0FBVyxFQUFFLElBQUksQ0FBQ1AsWUFBWSxFQUM5QixZQUFZLEVBQUUsSUFBSSxDQUFDRSxnQkFBZ0IsRUFDbkMsVUFBVSxFQUFFLElBQUksQ0FBQ0MsV0FBVyxFQUM1QlgsR0FBRyxFQUFFLElBQUksQ0FBQ1MsUUFBUSxDQUFDO01BQ3JCL0IsZUFBRyxDQUFDQyxLQUFLLENBQUUsdUJBQXNCQyxhQUFJLENBQUNDLEtBQUssQ0FBQ0wsT0FBTyxDQUFFLEVBQUMsQ0FBQztNQUN2RCxNQUFNLElBQUFRLGtCQUFJLEVBQUNSLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRUEsT0FBTyxDQUFDUyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFBRUcsd0JBQXdCLEVBQUVDLGVBQU0sQ0FBQ0MsU0FBUztNQUFHLENBQUMsQ0FBQztJQUM1RixDQUFDLENBQUMsT0FBT2UsQ0FBQyxFQUFFO01BQ1YsTUFBTSxJQUFJRixLQUFLLENBQUUsMENBQXlDLEdBQ3ZELG1CQUFrQkUsQ0FBQyxDQUFDdEIsTUFBTSxJQUFJc0IsQ0FBQyxDQUFDQyxPQUFRLEVBQUMsQ0FBQztJQUMvQztFQUNGO0FBQ0YsQ0FBQztBQVVEbkMsaUJBQWlCLENBQUMrQyxJQUFJLEdBQUcsZUFBZUEsSUFBSSxDQUFFQyxPQUFPLEVBQUU7RUFDckQsSUFBSUEsT0FBTyxDQUFDQyxRQUFRLENBQUNDLHVCQUFjLENBQUMsRUFBRTtJQUNwQyxJQUFJZixPQUFPLEdBQUcsMkNBQTJDO0lBQ3pELElBQUksSUFBSSxDQUFDZ0IsV0FBVyxFQUFFO01BQ3BCaEIsT0FBTyxJQUFJLHNFQUFzRSxHQUM5RSwyQkFBMEI5QyxtQkFBb0IsRUFBQztJQUNwRCxDQUFDLE1BQU07TUFDTDhDLE9BQU8sSUFBSywrREFBOERsRCxtQkFBb0IsSUFBRyxHQUM5RiwyQkFBMEJHLG1CQUFvQixXQUFVQyxtQkFBb0Isb0JBQW1CO0lBQ3BHO0lBQ0FrQixlQUFHLENBQUNtQyxJQUFJLENBQUNQLE9BQU8sQ0FBQztJQUNqQjtFQUNGO0VBSUEsTUFBTSxJQUFJLENBQUNpQixXQUFXLENBQUNKLE9BQU8sQ0FBQztFQUUvQixJQUFJLElBQUksQ0FBQ0csV0FBVyxFQUFFO0lBQ3BCLE1BQU0sSUFBSSxDQUFDZixrQkFBa0IsQ0FBQ1ksT0FBTyxDQUFDO0VBQ3hDLENBQUMsTUFBTTtJQUNMLE1BQU0sSUFBSSxDQUFDcEIsbUJBQW1CLENBQUNvQixPQUFPLENBQUM7RUFDekM7QUFDRixDQUFDO0FBVURoRCxpQkFBaUIsQ0FBQ29ELFdBQVcsR0FBRyxlQUFlQSxXQUFXLENBQUV2QixHQUFHLEVBQUU7RUFDL0QsTUFBTSxJQUFJLENBQUN3QixZQUFZLEVBQUU7RUFDekIsSUFBSTtJQUNGLE1BQU0sSUFBQXhDLGtCQUFJLEVBQUMsSUFBSSxDQUFDeUMsUUFBUSxDQUFDQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFMUIsR0FBRyxDQUFDLENBQUM7SUFDcER0QixlQUFHLENBQUNDLEtBQUssQ0FBRSxHQUFFcUIsR0FBSSx5Q0FBd0MsQ0FBQztJQUMxRCxPQUFPLEtBQUs7RUFDZCxDQUFDLENBQUMsT0FBT0ssQ0FBQyxFQUFFO0lBQ1YzQixlQUFHLENBQUNDLEtBQUssQ0FBRSxJQUFHcUIsR0FBSSxnQ0FBK0IsQ0FBQztFQUNwRDtFQUNBLElBQUk7SUFDRixNQUFNQyxXQUFFLENBQUMwQixNQUFNLENBQUMzQixHQUFHLEVBQUU0QixZQUFHLENBQUNDLElBQUksQ0FBQztFQUNoQyxDQUFDLENBQUMsT0FBT3hCLENBQUMsRUFBRTtJQUNWLE1BQU0sSUFBSUYsS0FBSyxDQUFFLGdCQUFlSCxHQUFJLHNCQUFxQixHQUN0RCx3RUFBdUUzQyxhQUFJLENBQUM4QixPQUFPLENBQUNhLEdBQUcsQ0FBRSxJQUFHLEdBQzVGLHNEQUFxRCxDQUFDO0VBQzNEO0VBQ0EsTUFBTThCLFVBQVUsR0FBRyxNQUFNQyxnQkFBTyxDQUFDMUUsSUFBSSxDQUFDO0lBQUMyRSxNQUFNLEVBQUUsUUFBUTtJQUFFQyxNQUFNLEVBQUU7RUFBTSxDQUFDLENBQUM7RUFDekUsTUFBTSxJQUFBQyxlQUFNLEVBQUM3RSxhQUFJLENBQUM4QixPQUFPLENBQUMyQyxVQUFVLENBQUMsQ0FBQztFQUN0QyxJQUFJO0lBQ0YsTUFBTSxJQUFBOUMsa0JBQUksRUFBQyxJQUFJLENBQUN5QyxRQUFRLENBQUNDLFFBQVEsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUxQixHQUFHLEVBQUU4QixVQUFVLENBQUMsQ0FBQztJQUNoRSxNQUFNN0IsV0FBRSxDQUFDa0MsRUFBRSxDQUFDTCxVQUFVLEVBQUU5QixHQUFHLEVBQUU7TUFBRWtDLE1BQU0sRUFBRTtJQUFLLENBQUMsQ0FBQztJQUM5QyxPQUFPLElBQUk7RUFDYixDQUFDLENBQUMsT0FBTzdCLENBQUMsRUFBRTtJQUNWLElBQUksTUFBTUosV0FBRSxDQUFDQyxNQUFNLENBQUM0QixVQUFVLENBQUMsRUFBRTtNQUMvQixNQUFNN0IsV0FBRSxDQUFDbUMsTUFBTSxDQUFDTixVQUFVLENBQUM7SUFDN0I7SUFDQSxNQUFNLElBQUkzQixLQUFLLENBQUUsdUNBQXNDRSxDQUFDLENBQUN0QixNQUFNLElBQUlzQixDQUFDLENBQUNDLE9BQVEsRUFBQyxDQUFDO0VBQ2pGO0FBQ0YsQ0FBQztBQWlCRG5DLGlCQUFpQixDQUFDa0UsWUFBWSxHQUFHLGVBQWVBLFlBQVksQ0FBRWxCLE9BQU8sRUFBRW1CLEdBQUcsRUFBRUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFO0VBQ3JGN0QsZUFBRyxDQUFDQyxLQUFLLENBQUUseUJBQXdCd0MsT0FBUSxFQUFDLENBQUM7RUFDN0MsSUFBSSxFQUFDLE1BQU1sQixXQUFFLENBQUNDLE1BQU0sQ0FBQ2lCLE9BQU8sQ0FBQyxHQUFFO0lBQzdCekMsZUFBRyxDQUFDQyxLQUFLLENBQUUsSUFBR3dDLE9BQVEsa0JBQWlCLENBQUM7SUFDeEMsT0FBTyxLQUFLO0VBQ2Q7RUFFQSxJQUFJOUQsYUFBSSxDQUFDbUYsT0FBTyxDQUFDckIsT0FBTyxDQUFDLEtBQUtFLHVCQUFjLEVBQUU7SUFDNUNGLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQ3NCLGNBQWMsQ0FBQ3RCLE9BQU8sQ0FBQztFQUM5QztFQUVBLE1BQU11QixXQUFXLEdBQUcsQ0FBQ0MsZUFBZSxFQUFFQyxjQUFjLEtBQUs7SUFDdkQsS0FBSyxNQUFNLENBQUNyRCxJQUFJLEVBQUVzRCxLQUFLLENBQUMsSUFBSXBELGVBQUMsQ0FBQ3FELE9BQU8sQ0FBQ0YsY0FBYyxDQUFDLEVBQUU7TUFDckQsSUFBSSxJQUFJRyxNQUFNLENBQUUsY0FBYUYsS0FBTSxLQUFJLEVBQUUsR0FBRyxDQUFDLENBQUNHLElBQUksQ0FBQ0wsZUFBZSxDQUFDLEVBQUU7UUFDbkVqRSxlQUFHLENBQUNDLEtBQUssQ0FBRSxHQUFFWSxJQUFLLHdCQUF1QmxDLGFBQUksQ0FBQzRGLFFBQVEsQ0FBQzlCLE9BQU8sQ0FBRSxHQUFFLENBQUM7UUFDbkUsT0FBTyxJQUFJO01BQ2I7SUFDRjtJQUNBLE9BQU8sS0FBSztFQUNkLENBQUM7RUFFRCxNQUFNO0lBQ0orQixrQkFBa0IsR0FBRztFQUN2QixDQUFDLEdBQUdYLElBQUk7RUFFUixNQUFNWSxPQUFPLEdBQUcsTUFBTWxELFdBQUUsQ0FBQ21ELElBQUksQ0FBQ2pDLE9BQU8sQ0FBQztFQUN0QyxJQUFJbkQsaUJBQWlCLENBQUNxRixHQUFHLENBQUNGLE9BQU8sQ0FBQyxFQUFFO0lBQ2xDekUsZUFBRyxDQUFDQyxLQUFLLENBQUUsb0RBQW1EdEIsYUFBSSxDQUFDNEYsUUFBUSxDQUFDOUIsT0FBTyxDQUFFLEdBQUUsQ0FBQztJQUN4RixNQUFNO01BQUNYLFlBQVk7TUFBRThDLE1BQU07TUFBRUM7SUFBUSxDQUFDLEdBQUd2RixpQkFBaUIsQ0FBQ3dGLEdBQUcsQ0FBQ0wsT0FBTyxDQUFDO0lBQ3ZFLElBQUksSUFBSSxDQUFDN0IsV0FBVyxJQUFJLElBQUksQ0FBQ2QsWUFBWSxLQUFLQSxZQUFZLElBQUksQ0FBQyxJQUFJLENBQUNjLFdBQVcsRUFBRTtNQUMvRSxPQUFRLENBQUMsSUFBSSxDQUFDQSxXQUFXLElBQUksQ0FBQzRCLGtCQUFrQixJQUFLUixXQUFXLENBQUNZLE1BQU0sRUFBRUMsUUFBUSxDQUFDO0lBQ3BGO0VBQ0Y7RUFFQSxNQUFNQSxRQUFRLEdBQUcsSUFBSSxDQUFDakMsV0FBVyxHQUM3QixNQUFNLElBQUksQ0FBQ21DLGVBQWUsQ0FBQ3RDLE9BQU8sRUFBRW1CLEdBQUcsQ0FBQyxHQUN4Q3hFLGlCQUFpQjtFQUNyQixJQUFJO0lBQ0YsTUFBTSxJQUFBUywwQkFBaUIsRUFBQyxJQUFJLENBQUM7SUFDN0IsTUFBTStFLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQ2xGLGdCQUFnQixDQUFDLENBQUMsUUFBUSxFQUFFLGVBQWUsRUFBRStDLE9BQU8sQ0FBQyxDQUFDO0lBQ2hGLE1BQU11QyxRQUFRLEdBQUdoQixXQUFXLENBQUNZLE1BQU0sRUFBRUMsUUFBUSxDQUFDO0lBQzlDLElBQUlHLFFBQVEsRUFBRTtNQUNaaEYsZUFBRyxDQUFDaUYsSUFBSSxDQUFFLElBQUd4QyxPQUFRLHVCQUFzQixHQUN4QyxHQUFFLElBQUksQ0FBQ0csV0FBVyxHQUFHLFVBQVUsR0FBRyxTQUFVLGNBQWEsQ0FBQztJQUMvRCxDQUFDLE1BQU07TUFDTDVDLGVBQUcsQ0FBQ2lGLElBQUksQ0FBRSxJQUFHeEMsT0FBUSxxQkFBb0IsR0FDdEMsT0FBTSxJQUFJLENBQUNHLFdBQVcsR0FBRyxVQUFVLEdBQUcsU0FBVSxjQUFhLENBQUM7SUFDbkU7SUFDQSxNQUFNc0MsUUFBUSxHQUFJLENBQUMsSUFBSSxDQUFDdEMsV0FBVyxJQUFJLENBQUM0QixrQkFBa0IsSUFBS1EsUUFBUTtJQUN2RSxJQUFJRSxRQUFRLEVBQUU7TUFDWjVGLGlCQUFpQixDQUFDNkYsR0FBRyxDQUFDVixPQUFPLEVBQUU7UUFDN0JHLE1BQU07UUFDTkMsUUFBUTtRQUNSL0MsWUFBWSxFQUFFLElBQUksQ0FBQ0E7TUFDckIsQ0FBQyxDQUFDO0lBQ0o7SUFDQSxPQUFPb0QsUUFBUTtFQUNqQixDQUFDLENBQUMsT0FBT2hELEdBQUcsRUFBRTtJQUVaLElBQUluQixlQUFDLENBQUNLLFFBQVEsQ0FBQ2MsR0FBRyxDQUFDN0IsTUFBTSxFQUFFdEIscUJBQXFCLENBQUMsRUFBRTtNQUNqRGlCLGVBQUcsQ0FBQ2lGLElBQUksQ0FBRSxJQUFHeEMsT0FBUSxpQkFBZ0IsQ0FBQztNQUN0QyxPQUFPLEtBQUs7SUFDZDtJQUNBLE1BQU0yQyxNQUFNLEdBQUdsRCxHQUFHLENBQUM3QixNQUFNLElBQUk2QixHQUFHLENBQUM5QixNQUFNLElBQUk4QixHQUFHLENBQUNOLE9BQU87SUFDdEQsSUFBSWIsZUFBQyxDQUFDSyxRQUFRLENBQUNnRSxNQUFNLEVBQUUvRixxQkFBcUIsQ0FBQyxFQUFFO01BUzdDVyxlQUFHLENBQUNtQyxJQUFJLENBQUNpRCxNQUFNLENBQUM7TUFDaEJwRixlQUFHLENBQUNtQyxJQUFJLENBQUUsYUFBWU0sT0FBUSwyQ0FBMEMsQ0FBQztNQUN6RSxPQUFPLElBQUk7SUFDYjtJQUNBLE1BQU0sSUFBSWhCLEtBQUssQ0FBRSxtQ0FBa0NnQixPQUFRLEtBQUksR0FDNUQsbUJBQWtCMkMsTUFBTyxFQUFDLENBQUM7RUFDaEM7QUFDRixDQUFDO0FBZ0JEM0YsaUJBQWlCLENBQUNzRixlQUFlLEdBQUcsZUFBZUEsZUFBZSxHQUFJO0VBQ3BFL0UsZUFBRyxDQUFDQyxLQUFLLENBQUUsd0JBQXVCLElBQUksQ0FBQzZCLFlBQWEsWUFBVyxDQUFDO0VBQ2hFLE1BQU11RCxPQUFPLEdBQUcxRyxhQUFJLENBQUMyRCxPQUFPLENBQUMsTUFBTSxJQUFBQyxvQkFBVyxHQUFFLEVBQUUsS0FBSyxFQUNwRCxVQUFTNUIsZUFBTSxDQUFDQyxTQUFTLEVBQUUsR0FBRyxNQUFNLEdBQUcsRUFBRyxFQUFDLENBQUM7RUFDL0MsSUFBSSxFQUFDLE1BQU1XLFdBQUUsQ0FBQ0MsTUFBTSxDQUFDNkQsT0FBTyxDQUFDLEdBQUU7SUFDN0IsTUFBTSxJQUFJNUQsS0FBSyxDQUFFLDJDQUEwQzRELE9BQVEsR0FBRSxDQUFDO0VBQ3hFO0VBQ0EsTUFBTTFGLElBQUksR0FBRyxDQUNYLElBQUksRUFBRSxPQUFPLEVBQ2IsUUFBUSxFQUFFLElBQUksQ0FBQ29DLFFBQVEsRUFDdkIsV0FBVyxFQUFFLElBQUksQ0FBQ0QsWUFBWSxFQUM5QixZQUFZLEVBQUUsSUFBSSxDQUFDRSxnQkFBZ0IsQ0FDcEM7RUFDRGhDLGVBQUcsQ0FBQ2lGLElBQUksQ0FBRSxZQUFXSSxPQUFRLHFCQUFvQm5GLGFBQUksQ0FBQ0MsS0FBSyxDQUFDUixJQUFJLENBQUUsRUFBQyxDQUFDO0VBQ3BFLElBQUk7SUFDRixNQUFNO01BQUNTO0lBQU0sQ0FBQyxHQUFHLE1BQU0sSUFBQUUsa0JBQUksRUFBQytFLE9BQU8sRUFBRTFGLElBQUksRUFBRTtNQUFFZSx3QkFBd0IsRUFBRUMsZUFBTSxDQUFDQyxTQUFTO0lBQUcsQ0FBQyxDQUFDO0lBQzVGLE1BQU0wRSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ2pCLEtBQUssTUFBTUMsUUFBUSxJQUFJLENBQUNyRyxNQUFNLEVBQUVELE1BQU0sRUFBRUQsSUFBSSxFQUFFRyxHQUFHLENBQUMsRUFBRTtNQUNsRCxNQUFNcUcsTUFBTSxHQUFHLElBQUluQixNQUFNLENBQUUsUUFBT2tCLFFBQVMsbUJBQWtCLEVBQUUsSUFBSSxDQUFDO01BQ3BFLE1BQU1FLEtBQUssR0FBR0QsTUFBTSxDQUFDbEYsSUFBSSxDQUFDRixNQUFNLENBQUM7TUFDakMsSUFBSSxDQUFDcUYsS0FBSyxFQUFFO1FBQ1Y7TUFDRjtNQUNBSCxNQUFNLENBQUNDLFFBQVEsQ0FBQyxHQUFHRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUNDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUNDLFdBQVcsRUFBRTtJQUM3RDtJQUNBLElBQUk1RSxlQUFDLENBQUM2RSxPQUFPLENBQUNOLE1BQU0sQ0FBQyxFQUFFO01BQ3JCdEYsZUFBRyxDQUFDQyxLQUFLLENBQUNHLE1BQU0sQ0FBQztNQUNqQixNQUFNLElBQUlxQixLQUFLLENBQUMscURBQXFELENBQUM7SUFDeEU7SUFDQXpCLGVBQUcsQ0FBQ0MsS0FBSyxDQUFFLGtCQUFpQjRGLElBQUksQ0FBQ0MsU0FBUyxDQUFDUixNQUFNLENBQUUsRUFBQyxDQUFDO0lBQ3JELE9BQU9BLE1BQU07RUFDZixDQUFDLENBQUMsT0FBTzNELENBQUMsRUFBRTtJQUNWLE1BQU0sSUFBSUYsS0FBSyxDQUFFLDJCQUEwQixJQUFJLENBQUNLLFlBQWEsY0FBYSxHQUN2RSxtQkFBa0JILENBQUMsQ0FBQ3RCLE1BQU0sSUFBSXNCLENBQUMsQ0FBQ0MsT0FBUSxFQUFDLENBQUM7RUFDL0M7QUFDRixDQUFDO0FBQUMsZUFFYW5DLGlCQUFpQjtBQUFBIn0=
|