appium-android-driver 5.7.2 → 5.7.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +2 -0
- package/build/index.js +1 -2
- package/build/lib/android-helpers.js +2 -26
- package/build/lib/android-helpers.js.map +1 -1
- package/build/lib/bootstrap.js +1 -8
- package/build/lib/bootstrap.js.map +1 -1
- package/build/lib/commands/actions.js +1 -2
- package/build/lib/commands/actions.js.map +1 -1
- package/build/lib/commands/alert.js +1 -2
- package/build/lib/commands/alert.js.map +1 -1
- package/build/lib/commands/app-management.js +2 -16
- package/build/lib/commands/app-management.js.map +1 -1
- package/build/lib/commands/context.js +1 -15
- package/build/lib/commands/context.js.map +1 -1
- package/build/lib/commands/element.js +1 -4
- package/build/lib/commands/element.js.map +1 -1
- package/build/lib/commands/emu-console.js +1 -3
- package/build/lib/commands/emu-console.js.map +1 -1
- package/build/lib/commands/file-actions.js +1 -13
- package/build/lib/commands/file-actions.js.map +1 -1
- package/build/lib/commands/find.js +1 -5
- package/build/lib/commands/find.js.map +1 -1
- package/build/lib/commands/general.js +1 -14
- package/build/lib/commands/general.js.map +1 -1
- package/build/lib/commands/index.js +2 -3
- package/build/lib/commands/index.js.map +1 -1
- package/build/lib/commands/intent.js +1 -5
- package/build/lib/commands/intent.js.map +1 -1
- package/build/lib/commands/log.js +1 -4
- package/build/lib/commands/log.js.map +1 -1
- package/build/lib/commands/media-projection.js +1 -5
- package/build/lib/commands/media-projection.js.map +1 -1
- package/build/lib/commands/network.js +1 -7
- package/build/lib/commands/network.js.map +1 -1
- package/build/lib/commands/performance.js +1 -8
- package/build/lib/commands/performance.js.map +1 -1
- package/build/lib/commands/recordscreen.js +1 -3
- package/build/lib/commands/recordscreen.js.map +1 -1
- package/build/lib/commands/streamscreen.js +4 -9
- package/build/lib/commands/streamscreen.js.map +1 -1
- package/build/lib/commands/system-bars.js +1 -4
- package/build/lib/commands/system-bars.js.map +1 -1
- package/build/lib/commands/touch.js +1 -9
- package/build/lib/commands/touch.js.map +1 -1
- package/build/lib/desired-caps.js +2 -4
- package/build/lib/desired-caps.js.map +1 -1
- package/build/lib/driver.js +1 -20
- package/build/lib/driver.js.map +1 -1
- package/build/lib/uiautomator.js +1 -3
- package/build/lib/uiautomator.js.map +1 -1
- package/build/lib/unlock-helpers.js +1 -3
- package/build/lib/unlock-helpers.js.map +1 -1
- package/build/lib/webview-helpers.js +1 -13
- package/build/lib/webview-helpers.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media-projection.js","names":["commands","DEFAULT_EXT","RECORDING_STARTUP_TIMEOUT_MS","RECORDING_STOP_TIMEOUT_MS","MIN_API_LEVEL","RECORDING_SERVICE_NAME","SETTINGS_HELPER_PKG_ID","RECORDING_ACTIVITY_NAME","RECORDING_ACTION_START","RECORDING_ACTION_STOP","RECORDINGS_ROOT","DEFAULT_FILENAME_FORMAT","uploadRecordedMedia","localFile","remotePath","uploadOptions","_","isEmpty","util","toInMemoryBase64","toString","user","pass","method","headers","fileFieldName","formFields","options","auth","net","uploadFile","adjustMediaExtension","name","toLower","endsWith","verifyMediaProjectionRecordingIsSupported","adb","apiLevel","getApiLevel","Error","MediaProjectionRecorder","constructor","isRunning","stdout","shell","includes","start","opts","cleanup","filename","maxDurationSec","priority","resolution","args","push","B","resolve","reject","setTimeout","pullRecent","recordings","ls","dstPath","path","join","tempDir","openDir","pull","stop","waitForCondition","waitMs","intervalMs","e","mobileStartMediaProjectionRecording","recorder","fname","moment","format","didStart","log","info","mobileIsMediaProjectionRecordingRunning","mobileStopMediaProjectionRecording","recentRecordingPath","size","fs","stat","debug","toReadableSizeString","rimraf","dirname"],"sources":["../../../lib/commands/media-projection.js"],"sourcesContent":["import _ from 'lodash';\nimport { waitForCondition } from 'asyncbox';\nimport { util, fs, net, tempDir } from '@appium/support';\nimport path from 'path';\nimport B from 'bluebird';\nimport { SETTINGS_HELPER_PKG_ID } from '../android-helpers';\nimport moment from 'moment';\n\n\nconst commands = {};\n\n// https://github.com/appium/io.appium.settings#internal-audio--video-recording\nconst DEFAULT_EXT = '.mp4';\nconst RECORDING_STARTUP_TIMEOUT_MS = 3 * 1000;\nconst RECORDING_STOP_TIMEOUT_MS = 3 * 1000;\nconst MIN_API_LEVEL = 29;\nconst RECORDING_SERVICE_NAME = `${SETTINGS_HELPER_PKG_ID}/.recorder.RecorderService`;\nconst RECORDING_ACTIVITY_NAME = `${SETTINGS_HELPER_PKG_ID}/io.appium.settings.Settings`;\nconst RECORDING_ACTION_START = `${SETTINGS_HELPER_PKG_ID}.recording.ACTION_START`;\nconst RECORDING_ACTION_STOP = `${SETTINGS_HELPER_PKG_ID}.recording.ACTION_STOP`;\nconst RECORDINGS_ROOT = `/storage/emulated/0/Android/data/${SETTINGS_HELPER_PKG_ID}/files`;\nconst DEFAULT_FILENAME_FORMAT = 'YYYY-MM-DDTHH-mm-ss';\n\n\nasync function uploadRecordedMedia (localFile, remotePath = null, uploadOptions = {}) {\n if (_.isEmpty(remotePath)) {\n return (await util.toInMemoryBase64(localFile)).toString();\n }\n\n const {user, pass, method, headers, fileFieldName, formFields} = uploadOptions;\n const options = {\n method: method || 'PUT',\n headers,\n fileFieldName,\n formFields,\n };\n if (user && pass) {\n options.auth = {user, pass};\n }\n await net.uploadFile(localFile, remotePath, options);\n return '';\n}\n\nfunction adjustMediaExtension (name) {\n return _.toLower(name).endsWith(DEFAULT_EXT) ? name : `${name}${DEFAULT_EXT}`;\n}\n\nasync function verifyMediaProjectionRecordingIsSupported (adb) {\n const apiLevel = await adb.getApiLevel();\n if (apiLevel < MIN_API_LEVEL) {\n throw new Error(`Media projection-based recording is not available on API Level ${apiLevel}. ` +\n `Minimum required API Level is ${MIN_API_LEVEL}.`);\n }\n}\n\n\nclass MediaProjectionRecorder {\n constructor (adb) {\n this.adb = adb;\n }\n\n async isRunning () {\n const stdout = await this.adb.shell([\n 'dumpsys', 'activity', 'services', RECORDING_SERVICE_NAME\n ]);\n return stdout.includes(RECORDING_SERVICE_NAME);\n }\n\n async start (opts = {}) {\n if (await this.isRunning()) {\n return false;\n }\n\n await this.cleanup();\n const {\n filename,\n maxDurationSec,\n priority,\n resolution,\n } = opts;\n const args = [\n 'am', 'start',\n '-n', RECORDING_ACTIVITY_NAME,\n '-a', RECORDING_ACTION_START,\n ];\n if (filename) {\n args.push('--es', 'filename', filename);\n }\n if (maxDurationSec) {\n args.push('--es', 'max_duration_sec', `${maxDurationSec}`);\n }\n if (priority) {\n args.push('--es', 'priority', priority);\n }\n if (resolution) {\n args.push('--es', 'resolution', resolution);\n }\n await this.adb.shell(args);\n await new B((resolve, reject) => {\n setTimeout(async () => {\n if (!await this.isRunning()) {\n return reject(new Error(\n `The media projection recording is not running after ${RECORDING_STARTUP_TIMEOUT_MS}ms. ` +\n `Please check the logcat output for more details.`\n ));\n }\n resolve();\n }, RECORDING_STARTUP_TIMEOUT_MS);\n });\n return true;\n }\n\n async cleanup () {\n await this.adb.shell([`rm -f ${RECORDINGS_ROOT}/*`]);\n }\n\n async pullRecent () {\n const recordings = await this.adb.ls(RECORDINGS_ROOT, ['-tr']);\n if (_.isEmpty(recordings)) {\n return null;\n }\n\n const dstPath = path.join(await tempDir.openDir(), recordings[0]);\n await this.adb.pull(`${RECORDINGS_ROOT}/${recordings[0]}`, dstPath);\n return dstPath;\n }\n\n async stop () {\n if (!await this.isRunning()) {\n return false;\n }\n\n await this.adb.shell([\n 'am', 'start',\n '-n', RECORDING_ACTIVITY_NAME,\n '-a', RECORDING_ACTION_STOP,\n ]);\n try {\n await waitForCondition(async () => !(await this.isRunning()), {\n waitMs: RECORDING_STOP_TIMEOUT_MS,\n intervalMs: 500,\n });\n } catch (e) {\n throw new Error(\n `The attempt to stop the current media projection recording timed out after ` +\n `${RECORDING_STOP_TIMEOUT_MS}ms`\n );\n }\n return true;\n }\n}\n\n\n/**\n * @typedef {Object} StartRecordingOptions\n *\n * @property {string?} resolution Maximum supported resolution on-device (Detected\n * automatically by the app itself), which usually equals to Full HD 1920x1080 on most\n * phones however you can change it to following supported resolutions\n * as well: \"1920x1080\", \"1280x720\", \"720x480\", \"320x240\", \"176x144\".\n * @property {number?} maxDurationSec [900] Default value: 900 seconds which means\n * maximum allowed duration is 15 minute, you can increase it if your test takes\n * longer than that.\n * @property {string?} priority [high] Means recording thread priority is maximum\n * however if you face performance drops during testing with recording enabled, you\n * can reduce recording priority to \"normal\" or \"low\".\n * @property {string?} filename You can type recording video file name as you want,\n * but recording currently supports only \"mp4\" format so your filename must end with \".mp4\".\n * An invalid file name will fail to start the recording.\n * If not provided then the current timestamp will be used as file name.\n */\n\n/**\n * Record the display of a real devices running Android 10 (API level 29) and higher.\n * The screen activity is recorded to a MPEG-4 file. Audio is also recorded by default\n * (only for apps that allow it in their manifests).\n * If another recording has been already started then the command will exit silently.\n * The previously recorded video file is deleted when a new recording session is started.\n * Recording continues it is stopped explicitly or until the timeout happens.\n *\n * @param {?StartRecordingOptions} options Available options.\n * @returns {boolean} True if a new recording has successfully started.\n * @throws {Error} If recording has failed to start or is not supported on the device under test.\n */\ncommands.mobileStartMediaProjectionRecording = async function mobileStartMediaProjectionRecording (options = {}) {\n await verifyMediaProjectionRecordingIsSupported(this.adb);\n\n const {resolution, priority, maxDurationSec, filename} = options;\n const recorder = new MediaProjectionRecorder(this.adb);\n const fname = adjustMediaExtension(filename || moment().format(DEFAULT_FILENAME_FORMAT));\n const didStart = await recorder.start({\n resolution,\n priority,\n maxDurationSec,\n filename: fname,\n });\n if (didStart) {\n this.log.info(`A new media projection recording '${fname}' has been successfully started`);\n } else {\n this.log.info('Another media projection recording is already in progress. There is nothing to start');\n }\n return didStart;\n};\n\n/**\n * Checks if a media projection-based recording is currently running.\n *\n * @returns {boolean} True if a recording is in progress.\n * @throws {Error} If a recording is not supported on the device under test.\n */\ncommands.mobileIsMediaProjectionRecordingRunning = async function mobileIsMediaProjectionRecordingRunning () {\n await verifyMediaProjectionRecordingIsSupported(this.adb);\n\n const recorder = new MediaProjectionRecorder(this.adb);\n return await recorder.isRunning();\n};\n\n/**\n * @typedef {Object} StopRecordingOptions\n *\n * @property {string?} remotePath The path to the remote location, where the resulting video should be uploaded.\n * The following protocols are supported: http/https, ftp.\n * Null or empty string value (the default setting) means the content of resulting\n * file should be encoded as Base64 and passed as the endpoont response value.\n * An exception will be thrown if the generated media file is too big to\n * fit into the available process memory.\n * @property {string?} user The name of the user for the remote authentication.\n * @property {string?} pass The password for the remote authentication.\n * @property {string?} method The http multipart upload method name. The 'PUT' one is used by default.\n * @property {Object?} headers Additional headers mapping for multipart http(s) uploads\n * @property {string?} fileFieldName [file] The name of the form field, where the file content BLOB should be stored for\n * http(s) uploads\n * @property {Object|Array<Pair>?} formFields Additional form fields for multipart http(s) uploads\n */\n\n/**\n * Stop a media projection-based recording.\n * If no recording has been started before then an error is thrown.\n * If the recording has been already finished before this API has been called\n * then the most recent recorded file is returned.\n *\n * @param {?StopRecordingOptions} options Available options.\n * @returns {string} Base64-encoded content of the recorded media file if 'remotePath'\n * parameter is falsy or an empty string.\n * @throws {Error} If there was an error while stopping a recording,\n * fetching the content of the remote media file,\n * or if a recording is not supported on the device under test.\n */\ncommands.mobileStopMediaProjectionRecording = async function mobileStopMediaProjectionRecording (options = {}) {\n await verifyMediaProjectionRecordingIsSupported(this.adb);\n\n const recorder = new MediaProjectionRecorder(this.adb);\n if (await recorder.stop()) {\n this.log.info('Successfully stopped a media projection recording. Pulling the recorded media');\n } else {\n this.log.info('Media projection recording is not running. There is nothing to stop');\n }\n const recentRecordingPath = await recorder.pullRecent();\n if (!recentRecordingPath) {\n throw new Error(`No recent media projection recording have been found. Did you start any?`);\n }\n\n const {remotePath} = options;\n if (_.isEmpty(remotePath)) {\n const {size} = await fs.stat(recentRecordingPath);\n this.log.debug(`The size of the resulting media projection recording is ${util.toReadableSizeString(size)}`);\n }\n try {\n return await uploadRecordedMedia(recentRecordingPath, remotePath, options);\n } finally {\n await fs.rimraf(path.dirname(recentRecordingPath));\n }\n};\n\n\nexport { commands };\nexport default commands;\n"],"mappings":";;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA,MAAMA,QAAQ,GAAG,CAAC,CAAC;;AAAC;AAGpB,MAAMC,WAAW,GAAG,MAAM;AAC1B,MAAMC,4BAA4B,GAAG,CAAC,GAAG,IAAI;AAC7C,MAAMC,yBAAyB,GAAG,CAAC,GAAG,IAAI;AAC1C,MAAMC,aAAa,GAAG,EAAE;AACxB,MAAMC,sBAAsB,GAAI,GAAEC,sCAAuB,4BAA2B;AACpF,MAAMC,uBAAuB,GAAI,GAAED,sCAAuB,8BAA6B;AACvF,MAAME,sBAAsB,GAAI,GAAEF,sCAAuB,yBAAwB;AACjF,MAAMG,qBAAqB,GAAI,GAAEH,sCAAuB,wBAAuB;AAC/E,MAAMI,eAAe,GAAI,oCAAmCJ,sCAAuB,QAAO;AAC1F,MAAMK,uBAAuB,GAAG,qBAAqB;AAGrD,eAAeC,mBAAmB,CAAEC,SAAS,EAAEC,UAAU,GAAG,IAAI,EAAEC,aAAa,GAAG,CAAC,CAAC,EAAE;EACpF,IAAIC,eAAC,CAACC,OAAO,CAACH,UAAU,CAAC,EAAE;IACzB,OAAO,CAAC,MAAMI,aAAI,CAACC,gBAAgB,CAACN,SAAS,CAAC,EAAEO,QAAQ,EAAE;EAC5D;EAEA,MAAM;IAACC,IAAI;IAAEC,IAAI;IAAEC,MAAM;IAAEC,OAAO;IAAEC,aAAa;IAAEC;EAAU,CAAC,GAAGX,aAAa;EAC9E,MAAMY,OAAO,GAAG;IACdJ,MAAM,EAAEA,MAAM,IAAI,KAAK;IACvBC,OAAO;IACPC,aAAa;IACbC;EACF,CAAC;EACD,IAAIL,IAAI,IAAIC,IAAI,EAAE;IAChBK,OAAO,CAACC,IAAI,GAAG;MAACP,IAAI;MAAEC;IAAI,CAAC;EAC7B;EACA,MAAMO,YAAG,CAACC,UAAU,CAACjB,SAAS,EAAEC,UAAU,EAAEa,OAAO,CAAC;EACpD,OAAO,EAAE;AACX;AAEA,SAASI,oBAAoB,CAAEC,IAAI,EAAE;EACnC,OAAOhB,eAAC,CAACiB,OAAO,CAACD,IAAI,CAAC,CAACE,QAAQ,CAACjC,WAAW,CAAC,GAAG+B,IAAI,GAAI,GAAEA,IAAK,GAAE/B,WAAY,EAAC;AAC/E;AAEA,eAAekC,yCAAyC,CAAEC,GAAG,EAAE;EAC7D,MAAMC,QAAQ,GAAG,MAAMD,GAAG,CAACE,WAAW,EAAE;EACxC,IAAID,QAAQ,GAAGjC,aAAa,EAAE;IAC5B,MAAM,IAAImC,KAAK,CAAE,kEAAiEF,QAAS,IAAG,GAC3F,iCAAgCjC,aAAc,GAAE,CAAC;EACtD;AACF;AAGA,MAAMoC,uBAAuB,CAAC;EAC5BC,WAAW,CAAEL,GAAG,EAAE;IAChB,IAAI,CAACA,GAAG,GAAGA,GAAG;EAChB;EAEA,MAAMM,SAAS,GAAI;IACjB,MAAMC,MAAM,GAAG,MAAM,IAAI,CAACP,GAAG,CAACQ,KAAK,CAAC,CAClC,SAAS,EAAE,UAAU,EAAE,UAAU,EAAEvC,sBAAsB,CAC1D,CAAC;IACF,OAAOsC,MAAM,CAACE,QAAQ,CAACxC,sBAAsB,CAAC;EAChD;EAEA,MAAMyC,KAAK,CAAEC,IAAI,GAAG,CAAC,CAAC,EAAE;IACtB,IAAI,MAAM,IAAI,CAACL,SAAS,EAAE,EAAE;MAC1B,OAAO,KAAK;IACd;IAEA,MAAM,IAAI,CAACM,OAAO,EAAE;IACpB,MAAM;MACJC,QAAQ;MACRC,cAAc;MACdC,QAAQ;MACRC;IACF,CAAC,GAAGL,IAAI;IACR,MAAMM,IAAI,GAAG,CACX,IAAI,EAAE,OAAO,EACb,IAAI,EAAE9C,uBAAuB,EAC7B,IAAI,EAAEC,sBAAsB,CAC7B;IACD,IAAIyC,QAAQ,EAAE;MACZI,IAAI,CAACC,IAAI,CAAC,MAAM,EAAE,UAAU,EAAEL,QAAQ,CAAC;IACzC;IACA,IAAIC,cAAc,EAAE;MAClBG,IAAI,CAACC,IAAI,CAAC,MAAM,EAAE,kBAAkB,EAAG,GAAEJ,cAAe,EAAC,CAAC;IAC5D;IACA,IAAIC,QAAQ,EAAE;MACZE,IAAI,CAACC,IAAI,CAAC,MAAM,EAAE,UAAU,EAAEH,QAAQ,CAAC;IACzC;IACA,IAAIC,UAAU,EAAE;MACdC,IAAI,CAACC,IAAI,CAAC,MAAM,EAAE,YAAY,EAAEF,UAAU,CAAC;IAC7C;IACA,MAAM,IAAI,CAAChB,GAAG,CAACQ,KAAK,CAACS,IAAI,CAAC;IAC1B,MAAM,IAAIE,iBAAC,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;MAC/BC,UAAU,CAAC,YAAY;QACrB,IAAI,EAAC,MAAM,IAAI,CAAChB,SAAS,EAAE,GAAE;UAC3B,OAAOe,MAAM,CAAC,IAAIlB,KAAK,CACpB,uDAAsDrC,4BAA6B,MAAK,GACxF,kDAAiD,CACnD,CAAC;QACJ;QACAsD,OAAO,EAAE;MACX,CAAC,EAAEtD,4BAA4B,CAAC;IAClC,CAAC,CAAC;IACF,OAAO,IAAI;EACb;EAEA,MAAM8C,OAAO,GAAI;IACf,MAAM,IAAI,CAACZ,GAAG,CAACQ,KAAK,CAAC,CAAE,SAAQlC,eAAgB,IAAG,CAAC,CAAC;EACtD;EAEA,MAAMiD,UAAU,GAAI;IAClB,MAAMC,UAAU,GAAG,MAAM,IAAI,CAACxB,GAAG,CAACyB,EAAE,CAACnD,eAAe,EAAE,CAAC,KAAK,CAAC,CAAC;IAC9D,IAAIM,eAAC,CAACC,OAAO,CAAC2C,UAAU,CAAC,EAAE;MACzB,OAAO,IAAI;IACb;IAEA,MAAME,OAAO,GAAGC,aAAI,CAACC,IAAI,CAAC,MAAMC,gBAAO,CAACC,OAAO,EAAE,EAAEN,UAAU,CAAC,CAAC,CAAC,CAAC;IACjE,MAAM,IAAI,CAACxB,GAAG,CAAC+B,IAAI,CAAE,GAAEzD,eAAgB,IAAGkD,UAAU,CAAC,CAAC,CAAE,EAAC,EAAEE,OAAO,CAAC;IACnE,OAAOA,OAAO;EAChB;EAEA,MAAMM,IAAI,GAAI;IACZ,IAAI,EAAC,MAAM,IAAI,CAAC1B,SAAS,EAAE,GAAE;MAC3B,OAAO,KAAK;IACd;IAEA,MAAM,IAAI,CAACN,GAAG,CAACQ,KAAK,CAAC,CACnB,IAAI,EAAE,OAAO,EACb,IAAI,EAAErC,uBAAuB,EAC7B,IAAI,EAAEE,qBAAqB,CAC5B,CAAC;IACF,IAAI;MACF,MAAM,IAAA4D,0BAAgB,EAAC,YAAY,EAAE,MAAM,IAAI,CAAC3B,SAAS,EAAE,CAAC,EAAE;QAC5D4B,MAAM,EAAEnE,yBAAyB;QACjCoE,UAAU,EAAE;MACd,CAAC,CAAC;IACJ,CAAC,CAAC,OAAOC,CAAC,EAAE;MACV,MAAM,IAAIjC,KAAK,CACZ,6EAA4E,GAC5E,GAAEpC,yBAA0B,IAAG,CACjC;IACH;IACA,OAAO,IAAI;EACb;AACF;;AAkCAH,QAAQ,CAACyE,mCAAmC,GAAG,eAAeA,mCAAmC,CAAE9C,OAAO,GAAG,CAAC,CAAC,EAAE;EAC/G,MAAMQ,yCAAyC,CAAC,IAAI,CAACC,GAAG,CAAC;EAEzD,MAAM;IAACgB,UAAU;IAAED,QAAQ;IAAED,cAAc;IAAED;EAAQ,CAAC,GAAGtB,OAAO;EAChE,MAAM+C,QAAQ,GAAG,IAAIlC,uBAAuB,CAAC,IAAI,CAACJ,GAAG,CAAC;EACtD,MAAMuC,KAAK,GAAG5C,oBAAoB,CAACkB,QAAQ,IAAI,IAAA2B,eAAM,GAAE,CAACC,MAAM,CAAClE,uBAAuB,CAAC,CAAC;EACxF,MAAMmE,QAAQ,GAAG,MAAMJ,QAAQ,CAAC5B,KAAK,CAAC;IACpCM,UAAU;IACVD,QAAQ;IACRD,cAAc;IACdD,QAAQ,EAAE0B;EACZ,CAAC,CAAC;EACF,IAAIG,QAAQ,EAAE;IACZ,IAAI,CAACC,GAAG,CAACC,IAAI,CAAE,qCAAoCL,KAAM,iCAAgC,CAAC;EAC5F,CAAC,MAAM;IACL,IAAI,CAACI,GAAG,CAACC,IAAI,CAAC,sFAAsF,CAAC;EACvG;EACA,OAAOF,QAAQ;AACjB,CAAC;;AAQD9E,QAAQ,CAACiF,uCAAuC,GAAG,eAAeA,uCAAuC,GAAI;EAC3G,MAAM9C,yCAAyC,CAAC,IAAI,CAACC,GAAG,CAAC;EAEzD,MAAMsC,QAAQ,GAAG,IAAIlC,uBAAuB,CAAC,IAAI,CAACJ,GAAG,CAAC;EACtD,OAAO,MAAMsC,QAAQ,CAAChC,SAAS,EAAE;AACnC,CAAC;;AAiCD1C,QAAQ,CAACkF,kCAAkC,GAAG,eAAeA,kCAAkC,CAAEvD,OAAO,GAAG,CAAC,CAAC,EAAE;EAC7G,MAAMQ,yCAAyC,CAAC,IAAI,CAACC,GAAG,CAAC;EAEzD,MAAMsC,QAAQ,GAAG,IAAIlC,uBAAuB,CAAC,IAAI,CAACJ,GAAG,CAAC;EACtD,IAAI,MAAMsC,QAAQ,CAACN,IAAI,EAAE,EAAE;IACzB,IAAI,CAACW,GAAG,CAACC,IAAI,CAAC,+EAA+E,CAAC;EAChG,CAAC,MAAM;IACL,IAAI,CAACD,GAAG,CAACC,IAAI,CAAC,qEAAqE,CAAC;EACtF;EACA,MAAMG,mBAAmB,GAAG,MAAMT,QAAQ,CAACf,UAAU,EAAE;EACvD,IAAI,CAACwB,mBAAmB,EAAE;IACxB,MAAM,IAAI5C,KAAK,CAAE,0EAAyE,CAAC;EAC7F;EAEA,MAAM;IAACzB;EAAU,CAAC,GAAGa,OAAO;EAC5B,IAAIX,eAAC,CAACC,OAAO,CAACH,UAAU,CAAC,EAAE;IACzB,MAAM;MAACsE;IAAI,CAAC,GAAG,MAAMC,WAAE,CAACC,IAAI,CAACH,mBAAmB,CAAC;IACjD,IAAI,CAACJ,GAAG,CAACQ,KAAK,CAAE,2DAA0DrE,aAAI,CAACsE,oBAAoB,CAACJ,IAAI,CAAE,EAAC,CAAC;EAC9G;EACA,IAAI;IACF,OAAO,MAAMxE,mBAAmB,CAACuE,mBAAmB,EAAErE,UAAU,EAAEa,OAAO,CAAC;EAC5E,CAAC,SAAS;IACR,MAAM0D,WAAE,CAACI,MAAM,CAAC1B,aAAI,CAAC2B,OAAO,CAACP,mBAAmB,CAAC,CAAC;EACpD;AACF,CAAC;AAAC,eAIanF,QAAQ;AAAA"}
|
|
1
|
+
{"version":3,"file":"media-projection.js","names":["commands","DEFAULT_EXT","RECORDING_STARTUP_TIMEOUT_MS","RECORDING_STOP_TIMEOUT_MS","MIN_API_LEVEL","RECORDING_SERVICE_NAME","SETTINGS_HELPER_PKG_ID","RECORDING_ACTIVITY_NAME","RECORDING_ACTION_START","RECORDING_ACTION_STOP","RECORDINGS_ROOT","DEFAULT_FILENAME_FORMAT","uploadRecordedMedia","localFile","remotePath","uploadOptions","_","isEmpty","util","toInMemoryBase64","toString","user","pass","method","headers","fileFieldName","formFields","options","auth","net","uploadFile","adjustMediaExtension","name","toLower","endsWith","verifyMediaProjectionRecordingIsSupported","adb","apiLevel","getApiLevel","Error","MediaProjectionRecorder","constructor","isRunning","stdout","shell","includes","start","opts","cleanup","filename","maxDurationSec","priority","resolution","args","push","B","resolve","reject","setTimeout","pullRecent","recordings","ls","dstPath","path","join","tempDir","openDir","pull","stop","waitForCondition","waitMs","intervalMs","e","mobileStartMediaProjectionRecording","recorder","fname","moment","format","didStart","log","info","mobileIsMediaProjectionRecordingRunning","mobileStopMediaProjectionRecording","recentRecordingPath","size","fs","stat","debug","toReadableSizeString","rimraf","dirname"],"sources":["../../../lib/commands/media-projection.js"],"sourcesContent":["import _ from 'lodash';\nimport { waitForCondition } from 'asyncbox';\nimport { util, fs, net, tempDir } from '@appium/support';\nimport path from 'path';\nimport B from 'bluebird';\nimport { SETTINGS_HELPER_PKG_ID } from '../android-helpers';\nimport moment from 'moment';\n\n\nconst commands = {};\n\n// https://github.com/appium/io.appium.settings#internal-audio--video-recording\nconst DEFAULT_EXT = '.mp4';\nconst RECORDING_STARTUP_TIMEOUT_MS = 3 * 1000;\nconst RECORDING_STOP_TIMEOUT_MS = 3 * 1000;\nconst MIN_API_LEVEL = 29;\nconst RECORDING_SERVICE_NAME = `${SETTINGS_HELPER_PKG_ID}/.recorder.RecorderService`;\nconst RECORDING_ACTIVITY_NAME = `${SETTINGS_HELPER_PKG_ID}/io.appium.settings.Settings`;\nconst RECORDING_ACTION_START = `${SETTINGS_HELPER_PKG_ID}.recording.ACTION_START`;\nconst RECORDING_ACTION_STOP = `${SETTINGS_HELPER_PKG_ID}.recording.ACTION_STOP`;\nconst RECORDINGS_ROOT = `/storage/emulated/0/Android/data/${SETTINGS_HELPER_PKG_ID}/files`;\nconst DEFAULT_FILENAME_FORMAT = 'YYYY-MM-DDTHH-mm-ss';\n\n\nasync function uploadRecordedMedia (localFile, remotePath = null, uploadOptions = {}) {\n if (_.isEmpty(remotePath)) {\n return (await util.toInMemoryBase64(localFile)).toString();\n }\n\n const {user, pass, method, headers, fileFieldName, formFields} = uploadOptions;\n const options = {\n method: method || 'PUT',\n headers,\n fileFieldName,\n formFields,\n };\n if (user && pass) {\n options.auth = {user, pass};\n }\n await net.uploadFile(localFile, remotePath, options);\n return '';\n}\n\nfunction adjustMediaExtension (name) {\n return _.toLower(name).endsWith(DEFAULT_EXT) ? name : `${name}${DEFAULT_EXT}`;\n}\n\nasync function verifyMediaProjectionRecordingIsSupported (adb) {\n const apiLevel = await adb.getApiLevel();\n if (apiLevel < MIN_API_LEVEL) {\n throw new Error(`Media projection-based recording is not available on API Level ${apiLevel}. ` +\n `Minimum required API Level is ${MIN_API_LEVEL}.`);\n }\n}\n\n\nclass MediaProjectionRecorder {\n constructor (adb) {\n this.adb = adb;\n }\n\n async isRunning () {\n const stdout = await this.adb.shell([\n 'dumpsys', 'activity', 'services', RECORDING_SERVICE_NAME\n ]);\n return stdout.includes(RECORDING_SERVICE_NAME);\n }\n\n async start (opts = {}) {\n if (await this.isRunning()) {\n return false;\n }\n\n await this.cleanup();\n const {\n filename,\n maxDurationSec,\n priority,\n resolution,\n } = opts;\n const args = [\n 'am', 'start',\n '-n', RECORDING_ACTIVITY_NAME,\n '-a', RECORDING_ACTION_START,\n ];\n if (filename) {\n args.push('--es', 'filename', filename);\n }\n if (maxDurationSec) {\n args.push('--es', 'max_duration_sec', `${maxDurationSec}`);\n }\n if (priority) {\n args.push('--es', 'priority', priority);\n }\n if (resolution) {\n args.push('--es', 'resolution', resolution);\n }\n await this.adb.shell(args);\n await new B((resolve, reject) => {\n setTimeout(async () => {\n if (!await this.isRunning()) {\n return reject(new Error(\n `The media projection recording is not running after ${RECORDING_STARTUP_TIMEOUT_MS}ms. ` +\n `Please check the logcat output for more details.`\n ));\n }\n resolve();\n }, RECORDING_STARTUP_TIMEOUT_MS);\n });\n return true;\n }\n\n async cleanup () {\n await this.adb.shell([`rm -f ${RECORDINGS_ROOT}/*`]);\n }\n\n async pullRecent () {\n const recordings = await this.adb.ls(RECORDINGS_ROOT, ['-tr']);\n if (_.isEmpty(recordings)) {\n return null;\n }\n\n const dstPath = path.join(await tempDir.openDir(), recordings[0]);\n await this.adb.pull(`${RECORDINGS_ROOT}/${recordings[0]}`, dstPath);\n return dstPath;\n }\n\n async stop () {\n if (!await this.isRunning()) {\n return false;\n }\n\n await this.adb.shell([\n 'am', 'start',\n '-n', RECORDING_ACTIVITY_NAME,\n '-a', RECORDING_ACTION_STOP,\n ]);\n try {\n await waitForCondition(async () => !(await this.isRunning()), {\n waitMs: RECORDING_STOP_TIMEOUT_MS,\n intervalMs: 500,\n });\n } catch (e) {\n throw new Error(\n `The attempt to stop the current media projection recording timed out after ` +\n `${RECORDING_STOP_TIMEOUT_MS}ms`\n );\n }\n return true;\n }\n}\n\n\n/**\n * @typedef {Object} StartRecordingOptions\n *\n * @property {string?} resolution Maximum supported resolution on-device (Detected\n * automatically by the app itself), which usually equals to Full HD 1920x1080 on most\n * phones however you can change it to following supported resolutions\n * as well: \"1920x1080\", \"1280x720\", \"720x480\", \"320x240\", \"176x144\".\n * @property {number?} maxDurationSec [900] Default value: 900 seconds which means\n * maximum allowed duration is 15 minute, you can increase it if your test takes\n * longer than that.\n * @property {string?} priority [high] Means recording thread priority is maximum\n * however if you face performance drops during testing with recording enabled, you\n * can reduce recording priority to \"normal\" or \"low\".\n * @property {string?} filename You can type recording video file name as you want,\n * but recording currently supports only \"mp4\" format so your filename must end with \".mp4\".\n * An invalid file name will fail to start the recording.\n * If not provided then the current timestamp will be used as file name.\n */\n\n/**\n * Record the display of a real devices running Android 10 (API level 29) and higher.\n * The screen activity is recorded to a MPEG-4 file. Audio is also recorded by default\n * (only for apps that allow it in their manifests).\n * If another recording has been already started then the command will exit silently.\n * The previously recorded video file is deleted when a new recording session is started.\n * Recording continues it is stopped explicitly or until the timeout happens.\n *\n * @param {?StartRecordingOptions} options Available options.\n * @returns {boolean} True if a new recording has successfully started.\n * @throws {Error} If recording has failed to start or is not supported on the device under test.\n */\ncommands.mobileStartMediaProjectionRecording = async function mobileStartMediaProjectionRecording (options = {}) {\n await verifyMediaProjectionRecordingIsSupported(this.adb);\n\n const {resolution, priority, maxDurationSec, filename} = options;\n const recorder = new MediaProjectionRecorder(this.adb);\n const fname = adjustMediaExtension(filename || moment().format(DEFAULT_FILENAME_FORMAT));\n const didStart = await recorder.start({\n resolution,\n priority,\n maxDurationSec,\n filename: fname,\n });\n if (didStart) {\n this.log.info(`A new media projection recording '${fname}' has been successfully started`);\n } else {\n this.log.info('Another media projection recording is already in progress. There is nothing to start');\n }\n return didStart;\n};\n\n/**\n * Checks if a media projection-based recording is currently running.\n *\n * @returns {boolean} True if a recording is in progress.\n * @throws {Error} If a recording is not supported on the device under test.\n */\ncommands.mobileIsMediaProjectionRecordingRunning = async function mobileIsMediaProjectionRecordingRunning () {\n await verifyMediaProjectionRecordingIsSupported(this.adb);\n\n const recorder = new MediaProjectionRecorder(this.adb);\n return await recorder.isRunning();\n};\n\n/**\n * @typedef {Object} StopRecordingOptions\n *\n * @property {string?} remotePath The path to the remote location, where the resulting video should be uploaded.\n * The following protocols are supported: http/https, ftp.\n * Null or empty string value (the default setting) means the content of resulting\n * file should be encoded as Base64 and passed as the endpoont response value.\n * An exception will be thrown if the generated media file is too big to\n * fit into the available process memory.\n * @property {string?} user The name of the user for the remote authentication.\n * @property {string?} pass The password for the remote authentication.\n * @property {string?} method The http multipart upload method name. The 'PUT' one is used by default.\n * @property {Object?} headers Additional headers mapping for multipart http(s) uploads\n * @property {string?} fileFieldName [file] The name of the form field, where the file content BLOB should be stored for\n * http(s) uploads\n * @property {Object|Array<Pair>?} formFields Additional form fields for multipart http(s) uploads\n */\n\n/**\n * Stop a media projection-based recording.\n * If no recording has been started before then an error is thrown.\n * If the recording has been already finished before this API has been called\n * then the most recent recorded file is returned.\n *\n * @param {?StopRecordingOptions} options Available options.\n * @returns {string} Base64-encoded content of the recorded media file if 'remotePath'\n * parameter is falsy or an empty string.\n * @throws {Error} If there was an error while stopping a recording,\n * fetching the content of the remote media file,\n * or if a recording is not supported on the device under test.\n */\ncommands.mobileStopMediaProjectionRecording = async function mobileStopMediaProjectionRecording (options = {}) {\n await verifyMediaProjectionRecordingIsSupported(this.adb);\n\n const recorder = new MediaProjectionRecorder(this.adb);\n if (await recorder.stop()) {\n this.log.info('Successfully stopped a media projection recording. Pulling the recorded media');\n } else {\n this.log.info('Media projection recording is not running. There is nothing to stop');\n }\n const recentRecordingPath = await recorder.pullRecent();\n if (!recentRecordingPath) {\n throw new Error(`No recent media projection recording have been found. Did you start any?`);\n }\n\n const {remotePath} = options;\n if (_.isEmpty(remotePath)) {\n const {size} = await fs.stat(recentRecordingPath);\n this.log.debug(`The size of the resulting media projection recording is ${util.toReadableSizeString(size)}`);\n }\n try {\n return await uploadRecordedMedia(recentRecordingPath, remotePath, options);\n } finally {\n await fs.rimraf(path.dirname(recentRecordingPath));\n }\n};\n\n\nexport { commands };\nexport default commands;\n"],"mappings":"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"}
|
|
@@ -22,7 +22,6 @@ commands.getNetworkConnection = async function getNetworkConnection() {
|
|
|
22
22
|
this.log.info('Getting network connection');
|
|
23
23
|
let airplaneModeOn = await this.adb.isAirplaneModeOn();
|
|
24
24
|
let connection = airplaneModeOn ? AIRPLANE_MODE_MASK : 0;
|
|
25
|
-
|
|
26
25
|
if (!airplaneModeOn) {
|
|
27
26
|
let wifiOn = await this.isWifiOn();
|
|
28
27
|
connection |= wifiOn ? WIFI_MASK : 0;
|
|
@@ -31,7 +30,6 @@ commands.getNetworkConnection = async function getNetworkConnection() {
|
|
|
31
30
|
}
|
|
32
31
|
return connection;
|
|
33
32
|
};
|
|
34
|
-
|
|
35
33
|
commands.isWifiOn = async function isWifiOn() {
|
|
36
34
|
return await this.adb.isWifiOn();
|
|
37
35
|
};
|
|
@@ -77,7 +75,6 @@ commands.setNetworkConnection = async function setNetworkConnection(type) {
|
|
|
77
75
|
});
|
|
78
76
|
return await this.getNetworkConnection();
|
|
79
77
|
};
|
|
80
|
-
|
|
81
78
|
commands.setWifiState = async function setWifiState(wifi) {
|
|
82
79
|
await this.adb.setWifiState(wifi, this.isEmulator());
|
|
83
80
|
};
|
|
@@ -123,7 +120,6 @@ commands.setGeoLocation = async function setGeoLocation(location) {
|
|
|
123
120
|
};
|
|
124
121
|
}
|
|
125
122
|
};
|
|
126
|
-
|
|
127
123
|
commands.mobileRefreshGpsCache = async function mobileRefreshGpsCache(opts = {}) {
|
|
128
124
|
const {
|
|
129
125
|
timeoutMs
|
|
@@ -185,11 +181,9 @@ helpers.toggleSetting = async function toggleSetting(setting, preKeySeq) {
|
|
|
185
181
|
appPackage,
|
|
186
182
|
appActivity
|
|
187
183
|
} = await this.adb.getFocusedPackageAndActivity();
|
|
188
|
-
|
|
189
184
|
await this.wrapBootstrapDisconnect(async () => {
|
|
190
185
|
await this.doKey(KeyCode.CENTER);
|
|
191
186
|
});
|
|
192
|
-
|
|
193
187
|
try {
|
|
194
188
|
await this.adb.waitForNotActivity(appPackage, appActivity, 5000);
|
|
195
189
|
await this.doKey(KeyCode.RIGHT);
|
|
@@ -218,4 +212,4 @@ helpers.wrapBootstrapDisconnect = async function wrapBootstrapDisconnect(wrapped
|
|
|
218
212
|
Object.assign(extensions, commands, helpers);
|
|
219
213
|
var _default = extensions;
|
|
220
214
|
exports.default = _default;
|
|
221
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21tYW5kcyIsImhlbHBlcnMiLCJleHRlbnNpb25zIiwiQUlSUExBTkVfTU9ERV9NQVNLIiwiV0lGSV9NQVNLIiwiREFUQV9NQVNLIiwiR0VPX0VQU0lMT04iLCJOdW1iZXIiLCJNSU5fVkFMVUUiLCJnZXROZXR3b3JrQ29ubmVjdGlvbiIsImxvZyIsImluZm8iLCJhaXJwbGFuZU1vZGVPbiIsImFkYiIsImlzQWlycGxhbmVNb2RlT24iLCJjb25uZWN0aW9uIiwid2lmaU9uIiwiaXNXaWZpT24iLCJkYXRhT24iLCJpc0RhdGFPbiIsInNldE5ldHdvcmtDb25uZWN0aW9uIiwidHlwZSIsInNob3VsZEVuYWJsZUFpcnBsYW5lTW9kZSIsInNob3VsZEVuYWJsZVdpZmkiLCJzaG91bGRFbmFibGVEYXRhQ29ubmVjdGlvbiIsImN1cnJlbnRTdGF0ZSIsImlzQWlycGxhbmVNb2RlRW5hYmxlZCIsImlzV2lGaUVuYWJsZWQiLCJpc0RhdGFFbmFibGVkIiwid3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QiLCJzZXRBaXJwbGFuZU1vZGUiLCJicm9hZGNhc3RBaXJwbGFuZU1vZGUiLCJzZXRXaWZpU3RhdGUiLCJzZXREYXRhU3RhdGUiLCJpc0VtdWxhdG9yIiwid2lmaSIsInRvZ2dsZURhdGEiLCJkYXRhIiwic2V0V2lmaUFuZERhdGEiLCJ0b2dnbGVXaUZpIiwidG9nZ2xlRmxpZ2h0TW9kZSIsImZsaWdodE1vZGUiLCJzZXRHZW9Mb2NhdGlvbiIsImxvY2F0aW9uIiwiZ2V0R2VvTG9jYXRpb24iLCJlIiwid2FybiIsIm1lc3NhZ2UiLCJsYXRpdHVkZSIsImxvbmdpdHVkZSIsImFsdGl0dWRlIiwibW9iaWxlUmVmcmVzaEdwc0NhY2hlIiwib3B0cyIsInRpbWVvdXRNcyIsInJlZnJlc2hHZW9Mb2NhdGlvbkNhY2hlIiwicGFyc2VGbG9hdCIsIktleUNvZGUiLCJVUCIsIkRPV04iLCJSSUdIVCIsIkNFTlRFUiIsInRvZ2dsZUxvY2F0aW9uU2VydmljZXMiLCJhcGkiLCJnZXRBcGlMZXZlbCIsInByb3ZpZGVycyIsImdldExvY2F0aW9uUHJvdmlkZXJzIiwiaXNHcHNFbmFibGVkIiwiaW5kZXhPZiIsInRvZ2dsZUdQU0xvY2F0aW9uUHJvdmlkZXIiLCJzZXEiLCJwdXNoIiwia2V5ZXZlbnQiLCJ0b2dnbGVTZXR0aW5nIiwiZXJyb3JzIiwiTm90WWV0SW1wbGVtZW50ZWRFcnJvciIsInNldHRpbmciLCJwcmVLZXlTZXEiLCJfIiwiaXNOdWxsIiwib3BlblNldHRpbmdzQWN0aXZpdHkiLCJrZXkiLCJkb0tleSIsImFwcFBhY2thZ2UiLCJhcHBBY3Rpdml0eSIsImdldEZvY3VzZWRQYWNrYWdlQW5kQWN0aXZpdHkiLCJ3YWl0Rm9yTm90QWN0aXZpdHkiLCJpZ24iLCJiYWNrIiwiQiIsImRlbGF5Iiwid3JhcHBlZCIsImJvb3RzdHJhcCIsImlnbm9yZVVuZXhwZWN0ZWRTaHV0ZG93biIsInJlc3RhcnQiLCJzdGFydCIsImRpc2FibGVBbmRyb2lkV2F0Y2hlcnMiLCJhY2NlcHRTc2xDZXJ0cyIsIk9iamVjdCIsImFzc2lnbiJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21tYW5kcy9uZXR3b3JrLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBlcnJvcnMgfSBmcm9tICdhcHBpdW0vZHJpdmVyJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcblxubGV0IGNvbW1hbmRzID0ge30sIGhlbHBlcnMgPSB7fSwgZXh0ZW5zaW9ucyA9IHt9O1xuXG5jb25zdCBBSVJQTEFORV9NT0RFX01BU0sgPSAwYjAwMTtcbmNvbnN0IFdJRklfTUFTSyA9IDBiMDEwO1xuY29uc3QgREFUQV9NQVNLID0gMGIxMDA7XG4vLyBUaGUgdmFsdWUgY2xvc2UgdG8gemVybywgYnV0IG5vdCB6ZXJvLCBpcyBuZWVkZWRcbi8vIHRvIHRyaWNrIEpTT04gZ2VuZXJhdGlvbiBhbmQgc2VuZCBhIGZsb2F0IHZhbHVlIGluc3RlYWQgb2YgYW4gaW50ZWdlcixcbi8vIFRoaXMgYWxsb3dzIHN0cmljdGx5LXR5cGVkIGNsaWVudHMsIGxpa2UgSmF2YSwgdG8gcHJvcGVybHlcbi8vIHBhcnNlIGl0LiBPdGhlcndpc2UgZmxvYXQgMC4wIGlzIGFsd2F5cyByZXByZXNlbnRlZCBhcyBpbnRlZ2VyIDAgaW4gSlMuXG4vLyBUaGUgdmFsdWUgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIERCTF9FUFNJTE9OIChodHRwczovL29wZW5zb3VyY2UuYXBwbGUuY29tL3NvdXJjZS9MaWJjL0xpYmMtNDk4L2luY2x1ZGUvZmxvYXQuaClcbmNvbnN0IEdFT19FUFNJTE9OID0gTnVtYmVyLk1JTl9WQUxVRTtcblxuY29tbWFuZHMuZ2V0TmV0d29ya0Nvbm5lY3Rpb24gPSBhc3luYyBmdW5jdGlvbiBnZXROZXR3b3JrQ29ubmVjdGlvbiAoKSB7XG4gIHRoaXMubG9nLmluZm8oJ0dldHRpbmcgbmV0d29yayBjb25uZWN0aW9uJyk7XG4gIGxldCBhaXJwbGFuZU1vZGVPbiA9IGF3YWl0IHRoaXMuYWRiLmlzQWlycGxhbmVNb2RlT24oKTtcbiAgbGV0IGNvbm5lY3Rpb24gPSBhaXJwbGFuZU1vZGVPbiA/IEFJUlBMQU5FX01PREVfTUFTSyA6IDA7XG5cbiAgLy8gbm8gbmVlZCB0byBjaGVjayBhbnl0aGluZyBlbHNlIGlmIHdlIGFyZSBpbiBhaXJwbGFuZSBtb2RlXG4gIGlmICghYWlycGxhbmVNb2RlT24pIHtcbiAgICBsZXQgd2lmaU9uID0gYXdhaXQgdGhpcy5pc1dpZmlPbigpO1xuICAgIGNvbm5lY3Rpb24gfD0gKHdpZmlPbiA/IFdJRklfTUFTSyA6IDApO1xuICAgIGxldCBkYXRhT24gPSBhd2FpdCB0aGlzLmFkYi5pc0RhdGFPbigpO1xuICAgIGNvbm5lY3Rpb24gfD0gKGRhdGFPbiA/IERBVEFfTUFTSyA6IDApO1xuICB9XG5cbiAgcmV0dXJuIGNvbm5lY3Rpb247XG59O1xuXG4vKipcbiAqIGRlY291cGxpbmcgdG8gb3ZlcnJpZGUgdGhlIGJlaGF2aW91ciBpbiBvdGhlciBkcml2ZXJzIGxpa2UgVWlBdXRvbWF0b3IyLlxuICovXG5jb21tYW5kcy5pc1dpZmlPbiA9IGFzeW5jIGZ1bmN0aW9uIGlzV2lmaU9uICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWRiLmlzV2lmaU9uKCk7XG59O1xuXG5jb21tYW5kcy5zZXROZXR3b3JrQ29ubmVjdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIHNldE5ldHdvcmtDb25uZWN0aW9uICh0eXBlKSB7XG4gIHRoaXMubG9nLmluZm8oJ1NldHRpbmcgbmV0d29yayBjb25uZWN0aW9uJyk7XG4gIC8vIGRlY29kZSB0aGUgaW5wdXRcbiAgY29uc3Qgc2hvdWxkRW5hYmxlQWlycGxhbmVNb2RlID0gKHR5cGUgJiBBSVJQTEFORV9NT0RFX01BU0spICE9PSAwO1xuICBjb25zdCBzaG91bGRFbmFibGVXaWZpID0gKHR5cGUgJiBXSUZJX01BU0spICE9PSAwO1xuICBjb25zdCBzaG91bGRFbmFibGVEYXRhQ29ubmVjdGlvbiA9ICh0eXBlICYgREFUQV9NQVNLKSAhPT0gMDtcblxuICBjb25zdCBjdXJyZW50U3RhdGUgPSBhd2FpdCB0aGlzLmdldE5ldHdvcmtDb25uZWN0aW9uKCk7XG4gIGNvbnN0IGlzQWlycGxhbmVNb2RlRW5hYmxlZCA9IChjdXJyZW50U3RhdGUgJiBBSVJQTEFORV9NT0RFX01BU0spICE9PSAwO1xuICBjb25zdCBpc1dpRmlFbmFibGVkID0gKGN1cnJlbnRTdGF0ZSAmIFdJRklfTUFTSykgIT09IDA7XG4gIGNvbnN0IGlzRGF0YUVuYWJsZWQgPSAoY3VycmVudFN0YXRlICYgREFUQV9NQVNLKSAhPT0gMDtcblxuICBpZiAoc2hvdWxkRW5hYmxlQWlycGxhbmVNb2RlICE9PSBpc0FpcnBsYW5lTW9kZUVuYWJsZWQpIHtcbiAgICBhd2FpdCB0aGlzLndyYXBCb290c3RyYXBEaXNjb25uZWN0KGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnNldEFpcnBsYW5lTW9kZShzaG91bGRFbmFibGVBaXJwbGFuZU1vZGUpO1xuICAgIH0pO1xuICAgIGF3YWl0IHRoaXMud3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5hZGIuYnJvYWRjYXN0QWlycGxhbmVNb2RlKHNob3VsZEVuYWJsZUFpcnBsYW5lTW9kZSk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5sb2cuaW5mbyhgTm90IGNoYW5naW5nIGFpcnBsYW5lIG1vZGUsIHNpbmNlIGl0IGlzIGFscmVhZHkgYCArXG4gICAgICAgICAgICAgYCR7c2hvdWxkRW5hYmxlQWlycGxhbmVNb2RlID8gJ2VuYWJsZWQnIDogJ2Rpc2FibGVkJ31gKTtcbiAgfVxuXG4gIGlmIChzaG91bGRFbmFibGVXaWZpID09PSBpc1dpRmlFbmFibGVkICYmIHNob3VsZEVuYWJsZURhdGFDb25uZWN0aW9uID09PSBpc0RhdGFFbmFibGVkKSB7XG4gICAgdGhpcy5sb2cuaW5mbygnTm90IGNoYW5naW5nIGRhdGEgY29ubmVjdGlvbi9XaS1GaSBzdGF0ZXMsIHNpbmNlIHRoZXkgYXJlIGFscmVhZHkgc2V0IHRvIGV4cGVjdGVkIHZhbHVlcycpO1xuICAgIGlmIChhd2FpdCB0aGlzLmFkYi5pc0FpcnBsYW5lTW9kZU9uKCkpIHtcbiAgICAgIHJldHVybiBBSVJQTEFORV9NT0RFX01BU0sgfCBjdXJyZW50U3RhdGU7XG4gICAgfVxuICAgIHJldHVybiB+QUlSUExBTkVfTU9ERV9NQVNLICYgY3VycmVudFN0YXRlO1xuICB9XG5cbiAgYXdhaXQgdGhpcy53cmFwQm9vdHN0cmFwRGlzY29ubmVjdChhc3luYyAoKSA9PiB7XG4gICAgaWYgKHNob3VsZEVuYWJsZVdpZmkgIT09IGlzV2lGaUVuYWJsZWQpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2V0V2lmaVN0YXRlKHNob3VsZEVuYWJsZVdpZmkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBOb3QgY2hhbmdpbmcgV2ktRmkgc3RhdGUsIHNpbmNlIGl0IGlzIGFscmVhZHkgYCArXG4gICAgICAgIGAke3Nob3VsZEVuYWJsZVdpZmkgPyAnZW5hYmxlZCcgOiAnZGlzYWJsZWQnfWApO1xuICAgIH1cblxuICAgIGlmIChzaG91bGRFbmFibGVBaXJwbGFuZU1vZGUpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oJ05vdCBjaGFuZ2luZyBkYXRhIGNvbm5lY3Rpb24gc3RhdGUsIGJlY2F1c2UgYWlycGxhbmUgbW9kZSBpcyBlbmFibGVkJyk7XG4gICAgfSBlbHNlIGlmIChzaG91bGRFbmFibGVEYXRhQ29ubmVjdGlvbiA9PT0gaXNEYXRhRW5hYmxlZCkge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgTm90IGNoYW5naW5nIGRhdGEgY29ubmVjdGlvbiBzdGF0ZSwgc2luY2UgaXQgaXMgYWxyZWFkeSBgICtcbiAgICAgICAgYCR7c2hvdWxkRW5hYmxlRGF0YUNvbm5lY3Rpb24gPyAnZW5hYmxlZCcgOiAnZGlzYWJsZWQnfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5zZXREYXRhU3RhdGUoc2hvdWxkRW5hYmxlRGF0YUNvbm5lY3Rpb24sIHRoaXMuaXNFbXVsYXRvcigpKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBhd2FpdCB0aGlzLmdldE5ldHdvcmtDb25uZWN0aW9uKCk7XG59O1xuXG4vKipcbiAqIGRlY291cGxpbmcgdG8gb3ZlcnJpZGUgYmVoYXZpb3VyIGluIG90aGVyIGRyaXZlcnMgbGlrZSBVaUF1dG9tYXRvcjIuXG4gKi9cbmNvbW1hbmRzLnNldFdpZmlTdGF0ZSA9IGFzeW5jIGZ1bmN0aW9uIHNldFdpZmlTdGF0ZSAod2lmaSkge1xuICBhd2FpdCB0aGlzLmFkYi5zZXRXaWZpU3RhdGUod2lmaSwgdGhpcy5pc0VtdWxhdG9yKCkpO1xufTtcblxuY29tbWFuZHMudG9nZ2xlRGF0YSA9IGFzeW5jIGZ1bmN0aW9uIHRvZ2dsZURhdGEgKCkge1xuICBsZXQgZGF0YSA9ICEoYXdhaXQgdGhpcy5hZGIuaXNEYXRhT24oKSk7XG4gIHRoaXMubG9nLmluZm8oYFR1cm5pbmcgbmV0d29yayBkYXRhICR7ZGF0YSA/ICdvbicgOiAnb2ZmJ31gKTtcbiAgYXdhaXQgdGhpcy53cmFwQm9vdHN0cmFwRGlzY29ubmVjdChhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgdGhpcy5hZGIuc2V0V2lmaUFuZERhdGEoe2RhdGF9LCB0aGlzLmlzRW11bGF0b3IoKSk7XG4gIH0pO1xufTtcblxuY29tbWFuZHMudG9nZ2xlV2lGaSA9IGFzeW5jIGZ1bmN0aW9uIHRvZ2dsZVdpRmkgKCkge1xuICBsZXQgd2lmaSA9ICEoYXdhaXQgdGhpcy5hZGIuaXNXaWZpT24oKSk7XG4gIHRoaXMubG9nLmluZm8oYFR1cm5pbmcgV2lGaSAke3dpZmkgPyAnb24nIDogJ29mZid9YCk7XG4gIGF3YWl0IHRoaXMud3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QoYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHRoaXMuYWRiLnNldFdpZmlBbmREYXRhKHt3aWZpfSwgdGhpcy5pc0VtdWxhdG9yKCkpO1xuICB9KTtcbn07XG5cbmNvbW1hbmRzLnRvZ2dsZUZsaWdodE1vZGUgPSBhc3luYyBmdW5jdGlvbiB0b2dnbGVGbGlnaHRNb2RlICgpIHtcbiAgLypcbiAgICogVE9ETzogSW1wbGVtZW50IGlzUmVhbERldmljZSgpLiBUaGlzIG1ldGhvZCBmYWlscyBvblxuICAgKiByZWFsIGRldmljZXMsIGl0IHNob3VsZCB0aHJvdyBhIE5vdFlldEltcGxlbWVudGVkRXJyb3JcbiAgICovXG4gIGxldCBmbGlnaHRNb2RlID0gIShhd2FpdCB0aGlzLmFkYi5pc0FpcnBsYW5lTW9kZU9uKCkpO1xuICB0aGlzLmxvZy5pbmZvKGBUdXJuaW5nIGZsaWdodCBtb2RlICR7ZmxpZ2h0TW9kZSA/ICdvbicgOiAnb2ZmJ31gKTtcbiAgYXdhaXQgdGhpcy53cmFwQm9vdHN0cmFwRGlzY29ubmVjdChhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgdGhpcy5hZGIuc2V0QWlycGxhbmVNb2RlKGZsaWdodE1vZGUpO1xuICB9KTtcbiAgYXdhaXQgdGhpcy53cmFwQm9vdHN0cmFwRGlzY29ubmVjdChhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgdGhpcy5hZGIuYnJvYWRjYXN0QWlycGxhbmVNb2RlKGZsaWdodE1vZGUpO1xuICB9KTtcbn07XG5cbmNvbW1hbmRzLnNldEdlb0xvY2F0aW9uID0gYXN5bmMgZnVuY3Rpb24gc2V0R2VvTG9jYXRpb24gKGxvY2F0aW9uKSB7XG4gIGF3YWl0IHRoaXMuYWRiLnNldEdlb0xvY2F0aW9uKGxvY2F0aW9uLCB0aGlzLmlzRW11bGF0b3IoKSk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0R2VvTG9jYXRpb24oKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRoaXMubG9nLndhcm4oYENvdWxkIG5vdCBnZXQgdGhlIGN1cnJlbnQgZ2VvbG9jYXRpb24gaW5mbzogJHtlLm1lc3NhZ2V9YCk7XG4gICAgdGhpcy5sb2cud2FybihgUmV0dXJuaW5nIHRoZSBkZWZhdWx0IHplcm8nZWQgdmFsdWVzYCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxhdGl0dWRlOiBHRU9fRVBTSUxPTixcbiAgICAgIGxvbmdpdHVkZTogR0VPX0VQU0lMT04sXG4gICAgICBhbHRpdHVkZTogR0VPX0VQU0lMT04sXG4gICAgfTtcbiAgfVxufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBHcHNDYWNoZVJlZnJlc2hPcHRpb25zXG4gKiBAcHJvcGVydHkge251bWJlcn0gdGltZW91dE1zIFsyMDAwMF0gVGhlIG1heGltdW0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kc1xuICogdG8gYmxvY2sgdW50aWwgR1BTIGNhY2hlIGlzIHJlZnJlc2hlZC4gUHJvdmlkaW5nIHplcm8gb3IgYSBuZWdhdGl2ZVxuICogdmFsdWUgdG8gaXQgc2tpcHMgd2FpdGluZyBjb21wbGV0ZWx5LlxuICovXG5cbi8qKlxuICogU2VuZHMgYW4gYXN5bmMgcmVxdWVzdCB0byByZWZyZXNoIHRoZSBHUFMgY2FjaGUuXG4gKiBUaGlzIGZlYXR1cmUgb25seSB3b3JrcyBpZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QgaGFzXG4gKiBHb29nbGUgUGxheSBTZXJ2aWNlcyBpbnN0YWxsZWQuIEluIGNhc2UgdGhlIHZhbmlsbGFcbiAqIExvY2F0aW9uTWFuYWdlciBpcyB1c2VkIHRoZSBkZXZpY2UgQVBJIGxldmVsIG11c3QgYmUgYXRcbiAqIHZlcnNpb24gMzAgKEFuZHJvaWQgUikgb3IgaGlnaGVyLlxuICpcbiAqIEBwYXJhbSB7R3BzQ2FjaGVSZWZyZXNoT3B0aW9uc30gb3B0c1xuICovXG5jb21tYW5kcy5tb2JpbGVSZWZyZXNoR3BzQ2FjaGUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVSZWZyZXNoR3BzQ2FjaGUgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7IHRpbWVvdXRNcyB9ID0gb3B0cztcbiAgYXdhaXQgdGhpcy5hZGIucmVmcmVzaEdlb0xvY2F0aW9uQ2FjaGUodGltZW91dE1zKTtcbn07XG5cbmNvbW1hbmRzLmdldEdlb0xvY2F0aW9uID0gYXN5bmMgZnVuY3Rpb24gZ2V0R2VvTG9jYXRpb24gKCkge1xuICBjb25zdCB7bGF0aXR1ZGUsIGxvbmdpdHVkZSwgYWx0aXR1ZGV9ID0gYXdhaXQgdGhpcy5hZGIuZ2V0R2VvTG9jYXRpb24oKTtcbiAgcmV0dXJuIHtcbiAgICBsYXRpdHVkZTogcGFyc2VGbG9hdChsYXRpdHVkZSkgfHwgR0VPX0VQU0lMT04sXG4gICAgbG9uZ2l0dWRlOiBwYXJzZUZsb2F0KGxvbmdpdHVkZSkgfHwgR0VPX0VQU0lMT04sXG4gICAgYWx0aXR1ZGU6IHBhcnNlRmxvYXQoYWx0aXR1ZGUpIHx8IEdFT19FUFNJTE9OLFxuICB9O1xufTtcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL3ZpZXcvS2V5RXZlbnQuaHRtbCNLRVlDT0RFX0RQQURfQ0VOVEVSXG4vLyBpbiB0aGUgYW5kcm9pZCBkb2NzLCB0aGlzIGlzIGhvdyB0aGUga2V5Y29kZXMgYXJlIGRlZmluZWRcbmNvbnN0IEtleUNvZGUgPSB7XG4gIFVQOiAxOSxcbiAgRE9XTjogMjAsXG4gIFJJR0hUOiAyMixcbiAgQ0VOVEVSOiAyM1xufTtcbmNvbW1hbmRzLnRvZ2dsZUxvY2F0aW9uU2VydmljZXMgPSBhc3luYyBmdW5jdGlvbiB0b2dnbGVMb2NhdGlvblNlcnZpY2VzICgpIHtcbiAgdGhpcy5sb2cuaW5mbygnVG9nZ2xpbmcgbG9jYXRpb24gc2VydmljZXMnKTtcbiAgbGV0IGFwaSA9IGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCk7XG4gIGlmICh0aGlzLmlzRW11bGF0b3IoKSkge1xuICAgIGxldCBwcm92aWRlcnMgPSBhd2FpdCB0aGlzLmFkYi5nZXRMb2NhdGlvblByb3ZpZGVycygpO1xuICAgIGxldCBpc0dwc0VuYWJsZWQgPSBwcm92aWRlcnMuaW5kZXhPZignZ3BzJykgIT09IC0xO1xuICAgIGF3YWl0IHRoaXMuYWRiLnRvZ2dsZUdQU0xvY2F0aW9uUHJvdmlkZXIoIWlzR3BzRW5hYmxlZCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGFwaSA+IDE1KSB7XG4gICAgbGV0IHNlcSA9IFtLZXlDb2RlLlVQLCBLZXlDb2RlLlVQXTtcbiAgICBpZiAoYXBpID09PSAxNikge1xuICAgICAgLy8gVGhpcyB2ZXJzaW9uIG9mIEFuZHJvaWQgaGFzIGEgXCJwYXJlbnRcIiBidXR0b24gaW4gaXRzIGFjdGlvbiBiYXJcbiAgICAgIHNlcS5wdXNoKEtleUNvZGUuRE9XTik7XG4gICAgfSBlbHNlIGlmIChhcGkgPCAyOCkge1xuICAgICAgLy8gTmV3ZXIgdmVyc2lvbnMgb2YgQW5kcm9pZCBoYXZlIHRoZSB0b2dnbGUgaW4gdGhlIEFjdGlvbiBiYXJcbiAgICAgIHNlcSA9IFtLZXlDb2RlLlJJR0hULCBLZXlDb2RlLlJJR0hULCBLZXlDb2RlLlVQXTtcbiAgICAgIC8qXG4gICAgICAgKiBPbmNlIHRoZSBMb2NhdGlvbiBzZXJ2aWNlcyBzd2l0Y2ggaXMgT0ZGLCBpdCB3b24ndCByZWNlaXZlIGZvY3VzXG4gICAgICAgKiB3aGVuIGdvaW5nIGJhY2sgdG8gdGhlIExvY2F0aW9uIFNlcnZpY2VzIHNldHRpbmdzIHNjcmVlbiB1bmxlc3Mgd2VcbiAgICAgICAqIHNlbmQgYSBkdW1teSBrZXlldmVudCAoVVApICpiZWZvcmUqIG9wZW5pbmcgdGhlIHNldHRpbmdzIHNjcmVlblxuICAgICAgICovXG4gICAgICBhd2FpdCB0aGlzLmFkYi5rZXlldmVudChLZXlDb2RlLlVQKTtcbiAgICB9IGVsc2UgaWYgKGFwaSA+PSAyOCkge1xuICAgICAgLy8gRXZlbiBuZXdlciB2ZXJzaW9ucyBvZiBhbmRyb2lkIGhhdmUgdGhlIHRvZ2dsZSBpbiBhIGJhciBiZWxvdyB0aGUgYWN0aW9uIGJhclxuICAgICAgLy8gdGhpcyBtZWFucyBhIHNpbmdsZSByaWdodCBjbGljayB3aWxsIGNhdXNlIGl0IHRvIGJlIHNlbGVjdGVkLlxuICAgICAgc2VxID0gW0tleUNvZGUuUklHSFRdO1xuICAgICAgYXdhaXQgdGhpcy5hZGIua2V5ZXZlbnQoS2V5Q29kZS5VUCk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMudG9nZ2xlU2V0dGluZygnTE9DQVRJT05fU09VUkNFX1NFVFRJTkdTJywgc2VxKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBUaGVyZSdzIG5vIGdsb2JhbCBsb2NhdGlvbiBzZXJ2aWNlcyB0b2dnbGUgb24gb2xkZXIgQW5kcm9pZCB2ZXJzaW9uc1xuICAgIHRocm93IG5ldyBlcnJvcnMuTm90WWV0SW1wbGVtZW50ZWRFcnJvcigpO1xuICB9XG59O1xuXG5oZWxwZXJzLnRvZ2dsZVNldHRpbmcgPSBhc3luYyBmdW5jdGlvbiB0b2dnbGVTZXR0aW5nIChzZXR0aW5nLCBwcmVLZXlTZXEpIHtcbiAgLypcbiAgICogcHJlS2V5U2VxIGlzIHRoZSBrZXlldmVudCBzZXF1ZW5jZSB0byBzZW5kIG92ZXIgQURCIGluIG9yZGVyXG4gICAqIHRvIHBvc2l0aW9uIHRoZSBjdXJzb3Igb24gdGhlIHJpZ2h0IG9wdGlvbi5cbiAgICogQnkgZGVmYXVsdCBpdCdzIFt1cCwgdXAsIGRvd25dIGJlY2F1c2Ugd2UgdXN1YWxseSB0YXJnZXQgdGhlIDFzdCBpdGVtIGluXG4gICAqIHRoZSBzY3JlZW4sIGFuZCBzb21ldGltZXMgd2hlbiBvcGVuaW5nIHNldHRpbmdzIGFjdGl2aXRpZXMgdGhlIGN1cnNvciBpc1xuICAgKiBhbHJlYWR5IHBvc2l0aW9ubmVkIG9uIHRoZSAxc3QgaXRlbSwgYnV0IHdlIGNhbid0IGtub3cgZm9yIHN1cmVcbiAgICovXG4gIGlmIChfLmlzTnVsbChwcmVLZXlTZXEpKSB7XG4gICAgcHJlS2V5U2VxID0gW0tleUNvZGUuVVAsIEtleUNvZGUuVVAsIEtleUNvZGUuRE9XTl07XG4gIH1cblxuICBhd2FpdCB0aGlzLm9wZW5TZXR0aW5nc0FjdGl2aXR5KHNldHRpbmcpO1xuXG4gIGZvciAobGV0IGtleSBvZiBwcmVLZXlTZXEpIHtcbiAgICBhd2FpdCB0aGlzLmRvS2V5KGtleSk7XG4gIH1cblxuICBsZXQge2FwcFBhY2thZ2UsIGFwcEFjdGl2aXR5fSA9IGF3YWl0IHRoaXMuYWRiLmdldEZvY3VzZWRQYWNrYWdlQW5kQWN0aXZpdHkoKTtcblxuICAvKlxuICAgKiBDbGljayBhbmQgaGFuZGxlIHBvdGVudGlhbCBBREIgZGlzY29ubmVjdCB0aGF0IG9jY3VycyBvbiBvZmZpY2lhbFxuICAgKiBlbXVsYXRvciB3aGVuIHRoZSBuZXR3b3JrIGNvbm5lY3Rpb24gaXMgZGlzYWJsZWRcbiAgICovXG4gIGF3YWl0IHRoaXMud3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QoYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHRoaXMuZG9LZXkoS2V5Q29kZS5DRU5URVIpO1xuICB9KTtcblxuICAvKlxuICAgKiBJbiBvbmUgcGFydGljdWxhciBjYXNlIChlbmFibGUgTG9jYXRpb24gU2VydmljZXMpLCBhIHBvcC11cCBpc1xuICAgKiBkaXNwbGF5ZWQgb24gc29tZSBwbGF0Zm9ybXMgc28gdGhlIHVzZXIgYWNjZXB0cyBvciByZWZ1c2VzIHRoYXQgR29vZ2xlXG4gICAqIGNvbGxlY3RzIGxvY2F0aW9uIGRhdGEuIFNvIHdlIHdhaXQgZm9yIHRoYXQgcG9wLXVwIHRvIG9wZW4sIGlmIGl0XG4gICAqIGRvZXNuJ3QgdGhlbiBwcm9jZWVkXG4gICAqL1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuYWRiLndhaXRGb3JOb3RBY3Rpdml0eShhcHBQYWNrYWdlLCBhcHBBY3Rpdml0eSwgNTAwMCk7XG4gICAgYXdhaXQgdGhpcy5kb0tleShLZXlDb2RlLlJJR0hUKTtcbiAgICBhd2FpdCB0aGlzLmRvS2V5KEtleUNvZGUuQ0VOVEVSKTtcbiAgICBhd2FpdCB0aGlzLmFkYi53YWl0Rm9yTm90QWN0aXZpdHkoYXBwUGFja2FnZSwgYXBwQWN0aXZpdHksIDUwMDApO1xuICB9IGNhdGNoIChpZ24pIHt9XG5cbiAgYXdhaXQgdGhpcy5hZGIuYmFjaygpO1xufTtcblxuaGVscGVycy5kb0tleSA9IGFzeW5jIGZ1bmN0aW9uIGRvS2V5IChrZXkpIHtcbiAgLy8gVE9ETzogQ29uZmlybSB3ZSBuZWVkIHRoaXMgZGVsYXkuIFNlZW1zIHRvIHdvcmsgd2l0aG91dCBpdC5cbiAgYXdhaXQgQi5kZWxheSgyMDAwKTtcbiAgYXdhaXQgdGhpcy5hZGIua2V5ZXZlbnQoa2V5KTtcbn07XG5cbmhlbHBlcnMud3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QgPSBhc3luYyBmdW5jdGlvbiB3cmFwQm9vdHN0cmFwRGlzY29ubmVjdCAod3JhcHBlZCkge1xuICBpZiAoIXRoaXMuYm9vdHN0cmFwKSB7XG4gICAgcmV0dXJuIGF3YWl0IHdyYXBwZWQoKTtcbiAgfVxuXG4gIHRoaXMuYm9vdHN0cmFwLmlnbm9yZVVuZXhwZWN0ZWRTaHV0ZG93biA9IHRydWU7XG4gIHRyeSB7XG4gICAgYXdhaXQgd3JhcHBlZCgpO1xuICAgIGF3YWl0IHRoaXMuYWRiLnJlc3RhcnQoKTtcbiAgICBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zdGFydCh0aGlzLm9wdHMuYXBwUGFja2FnZSwgdGhpcy5vcHRzLmRpc2FibGVBbmRyb2lkV2F0Y2hlcnMsIHRoaXMub3B0cy5hY2NlcHRTc2xDZXJ0cyk7XG4gIH0gZmluYWxseSB7XG4gICAgdGhpcy5ib290c3RyYXAuaWdub3JlVW5leHBlY3RlZFNodXRkb3duID0gZmFsc2U7XG4gIH1cbn07XG5cbk9iamVjdC5hc3NpZ24oZXh0ZW5zaW9ucywgY29tbWFuZHMsIGhlbHBlcnMpO1xuZXhwb3J0IHsgY29tbWFuZHMsIGhlbHBlcnMgfTtcbmV4cG9ydCBkZWZhdWx0IGV4dGVuc2lvbnM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBRUEsSUFBSUEsUUFBUSxHQUFHLENBQUMsQ0FBQztFQUFFQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0VBQUVDLFVBQVUsR0FBRyxDQUFDLENBQUM7QUFBQztBQUFBO0FBRWpELE1BQU1DLGtCQUFrQixHQUFHLEtBQUs7QUFDaEMsTUFBTUMsU0FBUyxHQUFHLEtBQUs7QUFDdkIsTUFBTUMsU0FBUyxHQUFHLEtBQUs7QUFNdkIsTUFBTUMsV0FBVyxHQUFHQyxNQUFNLENBQUNDLFNBQVM7QUFFcENSLFFBQVEsQ0FBQ1Msb0JBQW9CLEdBQUcsZUFBZUEsb0JBQW9CLEdBQUk7RUFDckUsSUFBSSxDQUFDQyxHQUFHLENBQUNDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQztFQUMzQyxJQUFJQyxjQUFjLEdBQUcsTUFBTSxJQUFJLENBQUNDLEdBQUcsQ0FBQ0MsZ0JBQWdCLEVBQUU7RUFDdEQsSUFBSUMsVUFBVSxHQUFHSCxjQUFjLEdBQUdULGtCQUFrQixHQUFHLENBQUM7O0VBR3hELElBQUksQ0FBQ1MsY0FBYyxFQUFFO0lBQ25CLElBQUlJLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQ0MsUUFBUSxFQUFFO0lBQ2xDRixVQUFVLElBQUtDLE1BQU0sR0FBR1osU0FBUyxHQUFHLENBQUU7SUFDdEMsSUFBSWMsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDTCxHQUFHLENBQUNNLFFBQVEsRUFBRTtJQUN0Q0osVUFBVSxJQUFLRyxNQUFNLEdBQUdiLFNB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
|
|
215
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21tYW5kcyIsImhlbHBlcnMiLCJleHRlbnNpb25zIiwiQUlSUExBTkVfTU9ERV9NQVNLIiwiV0lGSV9NQVNLIiwiREFUQV9NQVNLIiwiR0VPX0VQU0lMT04iLCJOdW1iZXIiLCJNSU5fVkFMVUUiLCJnZXROZXR3b3JrQ29ubmVjdGlvbiIsImxvZyIsImluZm8iLCJhaXJwbGFuZU1vZGVPbiIsImFkYiIsImlzQWlycGxhbmVNb2RlT24iLCJjb25uZWN0aW9uIiwid2lmaU9uIiwiaXNXaWZpT24iLCJkYXRhT24iLCJpc0RhdGFPbiIsInNldE5ldHdvcmtDb25uZWN0aW9uIiwidHlwZSIsInNob3VsZEVuYWJsZUFpcnBsYW5lTW9kZSIsInNob3VsZEVuYWJsZVdpZmkiLCJzaG91bGRFbmFibGVEYXRhQ29ubmVjdGlvbiIsImN1cnJlbnRTdGF0ZSIsImlzQWlycGxhbmVNb2RlRW5hYmxlZCIsImlzV2lGaUVuYWJsZWQiLCJpc0RhdGFFbmFibGVkIiwid3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QiLCJzZXRBaXJwbGFuZU1vZGUiLCJicm9hZGNhc3RBaXJwbGFuZU1vZGUiLCJzZXRXaWZpU3RhdGUiLCJzZXREYXRhU3RhdGUiLCJpc0VtdWxhdG9yIiwid2lmaSIsInRvZ2dsZURhdGEiLCJkYXRhIiwic2V0V2lmaUFuZERhdGEiLCJ0b2dnbGVXaUZpIiwidG9nZ2xlRmxpZ2h0TW9kZSIsImZsaWdodE1vZGUiLCJzZXRHZW9Mb2NhdGlvbiIsImxvY2F0aW9uIiwiZ2V0R2VvTG9jYXRpb24iLCJlIiwid2FybiIsIm1lc3NhZ2UiLCJsYXRpdHVkZSIsImxvbmdpdHVkZSIsImFsdGl0dWRlIiwibW9iaWxlUmVmcmVzaEdwc0NhY2hlIiwib3B0cyIsInRpbWVvdXRNcyIsInJlZnJlc2hHZW9Mb2NhdGlvbkNhY2hlIiwicGFyc2VGbG9hdCIsIktleUNvZGUiLCJVUCIsIkRPV04iLCJSSUdIVCIsIkNFTlRFUiIsInRvZ2dsZUxvY2F0aW9uU2VydmljZXMiLCJhcGkiLCJnZXRBcGlMZXZlbCIsInByb3ZpZGVycyIsImdldExvY2F0aW9uUHJvdmlkZXJzIiwiaXNHcHNFbmFibGVkIiwiaW5kZXhPZiIsInRvZ2dsZUdQU0xvY2F0aW9uUHJvdmlkZXIiLCJzZXEiLCJwdXNoIiwia2V5ZXZlbnQiLCJ0b2dnbGVTZXR0aW5nIiwiZXJyb3JzIiwiTm90WWV0SW1wbGVtZW50ZWRFcnJvciIsInNldHRpbmciLCJwcmVLZXlTZXEiLCJfIiwiaXNOdWxsIiwib3BlblNldHRpbmdzQWN0aXZpdHkiLCJrZXkiLCJkb0tleSIsImFwcFBhY2thZ2UiLCJhcHBBY3Rpdml0eSIsImdldEZvY3VzZWRQYWNrYWdlQW5kQWN0aXZpdHkiLCJ3YWl0Rm9yTm90QWN0aXZpdHkiLCJpZ24iLCJiYWNrIiwiQiIsImRlbGF5Iiwid3JhcHBlZCIsImJvb3RzdHJhcCIsImlnbm9yZVVuZXhwZWN0ZWRTaHV0ZG93biIsInJlc3RhcnQiLCJzdGFydCIsImRpc2FibGVBbmRyb2lkV2F0Y2hlcnMiLCJhY2NlcHRTc2xDZXJ0cyIsIk9iamVjdCIsImFzc2lnbiJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21tYW5kcy9uZXR3b3JrLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBlcnJvcnMgfSBmcm9tICdhcHBpdW0vZHJpdmVyJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcblxubGV0IGNvbW1hbmRzID0ge30sIGhlbHBlcnMgPSB7fSwgZXh0ZW5zaW9ucyA9IHt9O1xuXG5jb25zdCBBSVJQTEFORV9NT0RFX01BU0sgPSAwYjAwMTtcbmNvbnN0IFdJRklfTUFTSyA9IDBiMDEwO1xuY29uc3QgREFUQV9NQVNLID0gMGIxMDA7XG4vLyBUaGUgdmFsdWUgY2xvc2UgdG8gemVybywgYnV0IG5vdCB6ZXJvLCBpcyBuZWVkZWRcbi8vIHRvIHRyaWNrIEpTT04gZ2VuZXJhdGlvbiBhbmQgc2VuZCBhIGZsb2F0IHZhbHVlIGluc3RlYWQgb2YgYW4gaW50ZWdlcixcbi8vIFRoaXMgYWxsb3dzIHN0cmljdGx5LXR5cGVkIGNsaWVudHMsIGxpa2UgSmF2YSwgdG8gcHJvcGVybHlcbi8vIHBhcnNlIGl0LiBPdGhlcndpc2UgZmxvYXQgMC4wIGlzIGFsd2F5cyByZXByZXNlbnRlZCBhcyBpbnRlZ2VyIDAgaW4gSlMuXG4vLyBUaGUgdmFsdWUgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIERCTF9FUFNJTE9OIChodHRwczovL29wZW5zb3VyY2UuYXBwbGUuY29tL3NvdXJjZS9MaWJjL0xpYmMtNDk4L2luY2x1ZGUvZmxvYXQuaClcbmNvbnN0IEdFT19FUFNJTE9OID0gTnVtYmVyLk1JTl9WQUxVRTtcblxuY29tbWFuZHMuZ2V0TmV0d29ya0Nvbm5lY3Rpb24gPSBhc3luYyBmdW5jdGlvbiBnZXROZXR3b3JrQ29ubmVjdGlvbiAoKSB7XG4gIHRoaXMubG9nLmluZm8oJ0dldHRpbmcgbmV0d29yayBjb25uZWN0aW9uJyk7XG4gIGxldCBhaXJwbGFuZU1vZGVPbiA9IGF3YWl0IHRoaXMuYWRiLmlzQWlycGxhbmVNb2RlT24oKTtcbiAgbGV0IGNvbm5lY3Rpb24gPSBhaXJwbGFuZU1vZGVPbiA/IEFJUlBMQU5FX01PREVfTUFTSyA6IDA7XG5cbiAgLy8gbm8gbmVlZCB0byBjaGVjayBhbnl0aGluZyBlbHNlIGlmIHdlIGFyZSBpbiBhaXJwbGFuZSBtb2RlXG4gIGlmICghYWlycGxhbmVNb2RlT24pIHtcbiAgICBsZXQgd2lmaU9uID0gYXdhaXQgdGhpcy5pc1dpZmlPbigpO1xuICAgIGNvbm5lY3Rpb24gfD0gKHdpZmlPbiA/IFdJRklfTUFTSyA6IDApO1xuICAgIGxldCBkYXRhT24gPSBhd2FpdCB0aGlzLmFkYi5pc0RhdGFPbigpO1xuICAgIGNvbm5lY3Rpb24gfD0gKGRhdGFPbiA/IERBVEFfTUFTSyA6IDApO1xuICB9XG5cbiAgcmV0dXJuIGNvbm5lY3Rpb247XG59O1xuXG4vKipcbiAqIGRlY291cGxpbmcgdG8gb3ZlcnJpZGUgdGhlIGJlaGF2aW91ciBpbiBvdGhlciBkcml2ZXJzIGxpa2UgVWlBdXRvbWF0b3IyLlxuICovXG5jb21tYW5kcy5pc1dpZmlPbiA9IGFzeW5jIGZ1bmN0aW9uIGlzV2lmaU9uICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWRiLmlzV2lmaU9uKCk7XG59O1xuXG5jb21tYW5kcy5zZXROZXR3b3JrQ29ubmVjdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIHNldE5ldHdvcmtDb25uZWN0aW9uICh0eXBlKSB7XG4gIHRoaXMubG9nLmluZm8oJ1NldHRpbmcgbmV0d29yayBjb25uZWN0aW9uJyk7XG4gIC8vIGRlY29kZSB0aGUgaW5wdXRcbiAgY29uc3Qgc2hvdWxkRW5hYmxlQWlycGxhbmVNb2RlID0gKHR5cGUgJiBBSVJQTEFORV9NT0RFX01BU0spICE9PSAwO1xuICBjb25zdCBzaG91bGRFbmFibGVXaWZpID0gKHR5cGUgJiBXSUZJX01BU0spICE9PSAwO1xuICBjb25zdCBzaG91bGRFbmFibGVEYXRhQ29ubmVjdGlvbiA9ICh0eXBlICYgREFUQV9NQVNLKSAhPT0gMDtcblxuICBjb25zdCBjdXJyZW50U3RhdGUgPSBhd2FpdCB0aGlzLmdldE5ldHdvcmtDb25uZWN0aW9uKCk7XG4gIGNvbnN0IGlzQWlycGxhbmVNb2RlRW5hYmxlZCA9IChjdXJyZW50U3RhdGUgJiBBSVJQTEFORV9NT0RFX01BU0spICE9PSAwO1xuICBjb25zdCBpc1dpRmlFbmFibGVkID0gKGN1cnJlbnRTdGF0ZSAmIFdJRklfTUFTSykgIT09IDA7XG4gIGNvbnN0IGlzRGF0YUVuYWJsZWQgPSAoY3VycmVudFN0YXRlICYgREFUQV9NQVNLKSAhPT0gMDtcblxuICBpZiAoc2hvdWxkRW5hYmxlQWlycGxhbmVNb2RlICE9PSBpc0FpcnBsYW5lTW9kZUVuYWJsZWQpIHtcbiAgICBhd2FpdCB0aGlzLndyYXBCb290c3RyYXBEaXNjb25uZWN0KGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnNldEFpcnBsYW5lTW9kZShzaG91bGRFbmFibGVBaXJwbGFuZU1vZGUpO1xuICAgIH0pO1xuICAgIGF3YWl0IHRoaXMud3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5hZGIuYnJvYWRjYXN0QWlycGxhbmVNb2RlKHNob3VsZEVuYWJsZUFpcnBsYW5lTW9kZSk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5sb2cuaW5mbyhgTm90IGNoYW5naW5nIGFpcnBsYW5lIG1vZGUsIHNpbmNlIGl0IGlzIGFscmVhZHkgYCArXG4gICAgICAgICAgICAgYCR7c2hvdWxkRW5hYmxlQWlycGxhbmVNb2RlID8gJ2VuYWJsZWQnIDogJ2Rpc2FibGVkJ31gKTtcbiAgfVxuXG4gIGlmIChzaG91bGRFbmFibGVXaWZpID09PSBpc1dpRmlFbmFibGVkICYmIHNob3VsZEVuYWJsZURhdGFDb25uZWN0aW9uID09PSBpc0RhdGFFbmFibGVkKSB7XG4gICAgdGhpcy5sb2cuaW5mbygnTm90IGNoYW5naW5nIGRhdGEgY29ubmVjdGlvbi9XaS1GaSBzdGF0ZXMsIHNpbmNlIHRoZXkgYXJlIGFscmVhZHkgc2V0IHRvIGV4cGVjdGVkIHZhbHVlcycpO1xuICAgIGlmIChhd2FpdCB0aGlzLmFkYi5pc0FpcnBsYW5lTW9kZU9uKCkpIHtcbiAgICAgIHJldHVybiBBSVJQTEFORV9NT0RFX01BU0sgfCBjdXJyZW50U3RhdGU7XG4gICAgfVxuICAgIHJldHVybiB+QUlSUExBTkVfTU9ERV9NQVNLICYgY3VycmVudFN0YXRlO1xuICB9XG5cbiAgYXdhaXQgdGhpcy53cmFwQm9vdHN0cmFwRGlzY29ubmVjdChhc3luYyAoKSA9PiB7XG4gICAgaWYgKHNob3VsZEVuYWJsZVdpZmkgIT09IGlzV2lGaUVuYWJsZWQpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2V0V2lmaVN0YXRlKHNob3VsZEVuYWJsZVdpZmkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBOb3QgY2hhbmdpbmcgV2ktRmkgc3RhdGUsIHNpbmNlIGl0IGlzIGFscmVhZHkgYCArXG4gICAgICAgIGAke3Nob3VsZEVuYWJsZVdpZmkgPyAnZW5hYmxlZCcgOiAnZGlzYWJsZWQnfWApO1xuICAgIH1cblxuICAgIGlmIChzaG91bGRFbmFibGVBaXJwbGFuZU1vZGUpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oJ05vdCBjaGFuZ2luZyBkYXRhIGNvbm5lY3Rpb24gc3RhdGUsIGJlY2F1c2UgYWlycGxhbmUgbW9kZSBpcyBlbmFibGVkJyk7XG4gICAgfSBlbHNlIGlmIChzaG91bGRFbmFibGVEYXRhQ29ubmVjdGlvbiA9PT0gaXNEYXRhRW5hYmxlZCkge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgTm90IGNoYW5naW5nIGRhdGEgY29ubmVjdGlvbiBzdGF0ZSwgc2luY2UgaXQgaXMgYWxyZWFkeSBgICtcbiAgICAgICAgYCR7c2hvdWxkRW5hYmxlRGF0YUNvbm5lY3Rpb24gPyAnZW5hYmxlZCcgOiAnZGlzYWJsZWQnfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5zZXREYXRhU3RhdGUoc2hvdWxkRW5hYmxlRGF0YUNvbm5lY3Rpb24sIHRoaXMuaXNFbXVsYXRvcigpKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBhd2FpdCB0aGlzLmdldE5ldHdvcmtDb25uZWN0aW9uKCk7XG59O1xuXG4vKipcbiAqIGRlY291cGxpbmcgdG8gb3ZlcnJpZGUgYmVoYXZpb3VyIGluIG90aGVyIGRyaXZlcnMgbGlrZSBVaUF1dG9tYXRvcjIuXG4gKi9cbmNvbW1hbmRzLnNldFdpZmlTdGF0ZSA9IGFzeW5jIGZ1bmN0aW9uIHNldFdpZmlTdGF0ZSAod2lmaSkge1xuICBhd2FpdCB0aGlzLmFkYi5zZXRXaWZpU3RhdGUod2lmaSwgdGhpcy5pc0VtdWxhdG9yKCkpO1xufTtcblxuY29tbWFuZHMudG9nZ2xlRGF0YSA9IGFzeW5jIGZ1bmN0aW9uIHRvZ2dsZURhdGEgKCkge1xuICBsZXQgZGF0YSA9ICEoYXdhaXQgdGhpcy5hZGIuaXNEYXRhT24oKSk7XG4gIHRoaXMubG9nLmluZm8oYFR1cm5pbmcgbmV0d29yayBkYXRhICR7ZGF0YSA/ICdvbicgOiAnb2ZmJ31gKTtcbiAgYXdhaXQgdGhpcy53cmFwQm9vdHN0cmFwRGlzY29ubmVjdChhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgdGhpcy5hZGIuc2V0V2lmaUFuZERhdGEoe2RhdGF9LCB0aGlzLmlzRW11bGF0b3IoKSk7XG4gIH0pO1xufTtcblxuY29tbWFuZHMudG9nZ2xlV2lGaSA9IGFzeW5jIGZ1bmN0aW9uIHRvZ2dsZVdpRmkgKCkge1xuICBsZXQgd2lmaSA9ICEoYXdhaXQgdGhpcy5hZGIuaXNXaWZpT24oKSk7XG4gIHRoaXMubG9nLmluZm8oYFR1cm5pbmcgV2lGaSAke3dpZmkgPyAnb24nIDogJ29mZid9YCk7XG4gIGF3YWl0IHRoaXMud3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QoYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHRoaXMuYWRiLnNldFdpZmlBbmREYXRhKHt3aWZpfSwgdGhpcy5pc0VtdWxhdG9yKCkpO1xuICB9KTtcbn07XG5cbmNvbW1hbmRzLnRvZ2dsZUZsaWdodE1vZGUgPSBhc3luYyBmdW5jdGlvbiB0b2dnbGVGbGlnaHRNb2RlICgpIHtcbiAgLypcbiAgICogVE9ETzogSW1wbGVtZW50IGlzUmVhbERldmljZSgpLiBUaGlzIG1ldGhvZCBmYWlscyBvblxuICAgKiByZWFsIGRldmljZXMsIGl0IHNob3VsZCB0aHJvdyBhIE5vdFlldEltcGxlbWVudGVkRXJyb3JcbiAgICovXG4gIGxldCBmbGlnaHRNb2RlID0gIShhd2FpdCB0aGlzLmFkYi5pc0FpcnBsYW5lTW9kZU9uKCkpO1xuICB0aGlzLmxvZy5pbmZvKGBUdXJuaW5nIGZsaWdodCBtb2RlICR7ZmxpZ2h0TW9kZSA/ICdvbicgOiAnb2ZmJ31gKTtcbiAgYXdhaXQgdGhpcy53cmFwQm9vdHN0cmFwRGlzY29ubmVjdChhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgdGhpcy5hZGIuc2V0QWlycGxhbmVNb2RlKGZsaWdodE1vZGUpO1xuICB9KTtcbiAgYXdhaXQgdGhpcy53cmFwQm9vdHN0cmFwRGlzY29ubmVjdChhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgdGhpcy5hZGIuYnJvYWRjYXN0QWlycGxhbmVNb2RlKGZsaWdodE1vZGUpO1xuICB9KTtcbn07XG5cbmNvbW1hbmRzLnNldEdlb0xvY2F0aW9uID0gYXN5bmMgZnVuY3Rpb24gc2V0R2VvTG9jYXRpb24gKGxvY2F0aW9uKSB7XG4gIGF3YWl0IHRoaXMuYWRiLnNldEdlb0xvY2F0aW9uKGxvY2F0aW9uLCB0aGlzLmlzRW11bGF0b3IoKSk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0R2VvTG9jYXRpb24oKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRoaXMubG9nLndhcm4oYENvdWxkIG5vdCBnZXQgdGhlIGN1cnJlbnQgZ2VvbG9jYXRpb24gaW5mbzogJHtlLm1lc3NhZ2V9YCk7XG4gICAgdGhpcy5sb2cud2FybihgUmV0dXJuaW5nIHRoZSBkZWZhdWx0IHplcm8nZWQgdmFsdWVzYCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxhdGl0dWRlOiBHRU9fRVBTSUxPTixcbiAgICAgIGxvbmdpdHVkZTogR0VPX0VQU0lMT04sXG4gICAgICBhbHRpdHVkZTogR0VPX0VQU0lMT04sXG4gICAgfTtcbiAgfVxufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBHcHNDYWNoZVJlZnJlc2hPcHRpb25zXG4gKiBAcHJvcGVydHkge251bWJlcn0gdGltZW91dE1zIFsyMDAwMF0gVGhlIG1heGltdW0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kc1xuICogdG8gYmxvY2sgdW50aWwgR1BTIGNhY2hlIGlzIHJlZnJlc2hlZC4gUHJvdmlkaW5nIHplcm8gb3IgYSBuZWdhdGl2ZVxuICogdmFsdWUgdG8gaXQgc2tpcHMgd2FpdGluZyBjb21wbGV0ZWx5LlxuICovXG5cbi8qKlxuICogU2VuZHMgYW4gYXN5bmMgcmVxdWVzdCB0byByZWZyZXNoIHRoZSBHUFMgY2FjaGUuXG4gKiBUaGlzIGZlYXR1cmUgb25seSB3b3JrcyBpZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QgaGFzXG4gKiBHb29nbGUgUGxheSBTZXJ2aWNlcyBpbnN0YWxsZWQuIEluIGNhc2UgdGhlIHZhbmlsbGFcbiAqIExvY2F0aW9uTWFuYWdlciBpcyB1c2VkIHRoZSBkZXZpY2UgQVBJIGxldmVsIG11c3QgYmUgYXRcbiAqIHZlcnNpb24gMzAgKEFuZHJvaWQgUikgb3IgaGlnaGVyLlxuICpcbiAqIEBwYXJhbSB7R3BzQ2FjaGVSZWZyZXNoT3B0aW9uc30gb3B0c1xuICovXG5jb21tYW5kcy5tb2JpbGVSZWZyZXNoR3BzQ2FjaGUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVSZWZyZXNoR3BzQ2FjaGUgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7IHRpbWVvdXRNcyB9ID0gb3B0cztcbiAgYXdhaXQgdGhpcy5hZGIucmVmcmVzaEdlb0xvY2F0aW9uQ2FjaGUodGltZW91dE1zKTtcbn07XG5cbmNvbW1hbmRzLmdldEdlb0xvY2F0aW9uID0gYXN5bmMgZnVuY3Rpb24gZ2V0R2VvTG9jYXRpb24gKCkge1xuICBjb25zdCB7bGF0aXR1ZGUsIGxvbmdpdHVkZSwgYWx0aXR1ZGV9ID0gYXdhaXQgdGhpcy5hZGIuZ2V0R2VvTG9jYXRpb24oKTtcbiAgcmV0dXJuIHtcbiAgICBsYXRpdHVkZTogcGFyc2VGbG9hdChsYXRpdHVkZSkgfHwgR0VPX0VQU0lMT04sXG4gICAgbG9uZ2l0dWRlOiBwYXJzZUZsb2F0KGxvbmdpdHVkZSkgfHwgR0VPX0VQU0lMT04sXG4gICAgYWx0aXR1ZGU6IHBhcnNlRmxvYXQoYWx0aXR1ZGUpIHx8IEdFT19FUFNJTE9OLFxuICB9O1xufTtcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL3ZpZXcvS2V5RXZlbnQuaHRtbCNLRVlDT0RFX0RQQURfQ0VOVEVSXG4vLyBpbiB0aGUgYW5kcm9pZCBkb2NzLCB0aGlzIGlzIGhvdyB0aGUga2V5Y29kZXMgYXJlIGRlZmluZWRcbmNvbnN0IEtleUNvZGUgPSB7XG4gIFVQOiAxOSxcbiAgRE9XTjogMjAsXG4gIFJJR0hUOiAyMixcbiAgQ0VOVEVSOiAyM1xufTtcbmNvbW1hbmRzLnRvZ2dsZUxvY2F0aW9uU2VydmljZXMgPSBhc3luYyBmdW5jdGlvbiB0b2dnbGVMb2NhdGlvblNlcnZpY2VzICgpIHtcbiAgdGhpcy5sb2cuaW5mbygnVG9nZ2xpbmcgbG9jYXRpb24gc2VydmljZXMnKTtcbiAgbGV0IGFwaSA9IGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCk7XG4gIGlmICh0aGlzLmlzRW11bGF0b3IoKSkge1xuICAgIGxldCBwcm92aWRlcnMgPSBhd2FpdCB0aGlzLmFkYi5nZXRMb2NhdGlvblByb3ZpZGVycygpO1xuICAgIGxldCBpc0dwc0VuYWJsZWQgPSBwcm92aWRlcnMuaW5kZXhPZignZ3BzJykgIT09IC0xO1xuICAgIGF3YWl0IHRoaXMuYWRiLnRvZ2dsZUdQU0xvY2F0aW9uUHJvdmlkZXIoIWlzR3BzRW5hYmxlZCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGFwaSA+IDE1KSB7XG4gICAgbGV0IHNlcSA9IFtLZXlDb2RlLlVQLCBLZXlDb2RlLlVQXTtcbiAgICBpZiAoYXBpID09PSAxNikge1xuICAgICAgLy8gVGhpcyB2ZXJzaW9uIG9mIEFuZHJvaWQgaGFzIGEgXCJwYXJlbnRcIiBidXR0b24gaW4gaXRzIGFjdGlvbiBiYXJcbiAgICAgIHNlcS5wdXNoKEtleUNvZGUuRE9XTik7XG4gICAgfSBlbHNlIGlmIChhcGkgPCAyOCkge1xuICAgICAgLy8gTmV3ZXIgdmVyc2lvbnMgb2YgQW5kcm9pZCBoYXZlIHRoZSB0b2dnbGUgaW4gdGhlIEFjdGlvbiBiYXJcbiAgICAgIHNlcSA9IFtLZXlDb2RlLlJJR0hULCBLZXlDb2RlLlJJR0hULCBLZXlDb2RlLlVQXTtcbiAgICAgIC8qXG4gICAgICAgKiBPbmNlIHRoZSBMb2NhdGlvbiBzZXJ2aWNlcyBzd2l0Y2ggaXMgT0ZGLCBpdCB3b24ndCByZWNlaXZlIGZvY3VzXG4gICAgICAgKiB3aGVuIGdvaW5nIGJhY2sgdG8gdGhlIExvY2F0aW9uIFNlcnZpY2VzIHNldHRpbmdzIHNjcmVlbiB1bmxlc3Mgd2VcbiAgICAgICAqIHNlbmQgYSBkdW1teSBrZXlldmVudCAoVVApICpiZWZvcmUqIG9wZW5pbmcgdGhlIHNldHRpbmdzIHNjcmVlblxuICAgICAgICovXG4gICAgICBhd2FpdCB0aGlzLmFkYi5rZXlldmVudChLZXlDb2RlLlVQKTtcbiAgICB9IGVsc2UgaWYgKGFwaSA+PSAyOCkge1xuICAgICAgLy8gRXZlbiBuZXdlciB2ZXJzaW9ucyBvZiBhbmRyb2lkIGhhdmUgdGhlIHRvZ2dsZSBpbiBhIGJhciBiZWxvdyB0aGUgYWN0aW9uIGJhclxuICAgICAgLy8gdGhpcyBtZWFucyBhIHNpbmdsZSByaWdodCBjbGljayB3aWxsIGNhdXNlIGl0IHRvIGJlIHNlbGVjdGVkLlxuICAgICAgc2VxID0gW0tleUNvZGUuUklHSFRdO1xuICAgICAgYXdhaXQgdGhpcy5hZGIua2V5ZXZlbnQoS2V5Q29kZS5VUCk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMudG9nZ2xlU2V0dGluZygnTE9DQVRJT05fU09VUkNFX1NFVFRJTkdTJywgc2VxKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBUaGVyZSdzIG5vIGdsb2JhbCBsb2NhdGlvbiBzZXJ2aWNlcyB0b2dnbGUgb24gb2xkZXIgQW5kcm9pZCB2ZXJzaW9uc1xuICAgIHRocm93IG5ldyBlcnJvcnMuTm90WWV0SW1wbGVtZW50ZWRFcnJvcigpO1xuICB9XG59O1xuXG5oZWxwZXJzLnRvZ2dsZVNldHRpbmcgPSBhc3luYyBmdW5jdGlvbiB0b2dnbGVTZXR0aW5nIChzZXR0aW5nLCBwcmVLZXlTZXEpIHtcbiAgLypcbiAgICogcHJlS2V5U2VxIGlzIHRoZSBrZXlldmVudCBzZXF1ZW5jZSB0byBzZW5kIG92ZXIgQURCIGluIG9yZGVyXG4gICAqIHRvIHBvc2l0aW9uIHRoZSBjdXJzb3Igb24gdGhlIHJpZ2h0IG9wdGlvbi5cbiAgICogQnkgZGVmYXVsdCBpdCdzIFt1cCwgdXAsIGRvd25dIGJlY2F1c2Ugd2UgdXN1YWxseSB0YXJnZXQgdGhlIDFzdCBpdGVtIGluXG4gICAqIHRoZSBzY3JlZW4sIGFuZCBzb21ldGltZXMgd2hlbiBvcGVuaW5nIHNldHRpbmdzIGFjdGl2aXRpZXMgdGhlIGN1cnNvciBpc1xuICAgKiBhbHJlYWR5IHBvc2l0aW9ubmVkIG9uIHRoZSAxc3QgaXRlbSwgYnV0IHdlIGNhbid0IGtub3cgZm9yIHN1cmVcbiAgICovXG4gIGlmIChfLmlzTnVsbChwcmVLZXlTZXEpKSB7XG4gICAgcHJlS2V5U2VxID0gW0tleUNvZGUuVVAsIEtleUNvZGUuVVAsIEtleUNvZGUuRE9XTl07XG4gIH1cblxuICBhd2FpdCB0aGlzLm9wZW5TZXR0aW5nc0FjdGl2aXR5KHNldHRpbmcpO1xuXG4gIGZvciAobGV0IGtleSBvZiBwcmVLZXlTZXEpIHtcbiAgICBhd2FpdCB0aGlzLmRvS2V5KGtleSk7XG4gIH1cblxuICBsZXQge2FwcFBhY2thZ2UsIGFwcEFjdGl2aXR5fSA9IGF3YWl0IHRoaXMuYWRiLmdldEZvY3VzZWRQYWNrYWdlQW5kQWN0aXZpdHkoKTtcblxuICAvKlxuICAgKiBDbGljayBhbmQgaGFuZGxlIHBvdGVudGlhbCBBREIgZGlzY29ubmVjdCB0aGF0IG9jY3VycyBvbiBvZmZpY2lhbFxuICAgKiBlbXVsYXRvciB3aGVuIHRoZSBuZXR3b3JrIGNvbm5lY3Rpb24gaXMgZGlzYWJsZWRcbiAgICovXG4gIGF3YWl0IHRoaXMud3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QoYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHRoaXMuZG9LZXkoS2V5Q29kZS5DRU5URVIpO1xuICB9KTtcblxuICAvKlxuICAgKiBJbiBvbmUgcGFydGljdWxhciBjYXNlIChlbmFibGUgTG9jYXRpb24gU2VydmljZXMpLCBhIHBvcC11cCBpc1xuICAgKiBkaXNwbGF5ZWQgb24gc29tZSBwbGF0Zm9ybXMgc28gdGhlIHVzZXIgYWNjZXB0cyBvciByZWZ1c2VzIHRoYXQgR29vZ2xlXG4gICAqIGNvbGxlY3RzIGxvY2F0aW9uIGRhdGEuIFNvIHdlIHdhaXQgZm9yIHRoYXQgcG9wLXVwIHRvIG9wZW4sIGlmIGl0XG4gICAqIGRvZXNuJ3QgdGhlbiBwcm9jZWVkXG4gICAqL1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuYWRiLndhaXRGb3JOb3RBY3Rpdml0eShhcHBQYWNrYWdlLCBhcHBBY3Rpdml0eSwgNTAwMCk7XG4gICAgYXdhaXQgdGhpcy5kb0tleShLZXlDb2RlLlJJR0hUKTtcbiAgICBhd2FpdCB0aGlzLmRvS2V5KEtleUNvZGUuQ0VOVEVSKTtcbiAgICBhd2FpdCB0aGlzLmFkYi53YWl0Rm9yTm90QWN0aXZpdHkoYXBwUGFja2FnZSwgYXBwQWN0aXZpdHksIDUwMDApO1xuICB9IGNhdGNoIChpZ24pIHt9XG5cbiAgYXdhaXQgdGhpcy5hZGIuYmFjaygpO1xufTtcblxuaGVscGVycy5kb0tleSA9IGFzeW5jIGZ1bmN0aW9uIGRvS2V5IChrZXkpIHtcbiAgLy8gVE9ETzogQ29uZmlybSB3ZSBuZWVkIHRoaXMgZGVsYXkuIFNlZW1zIHRvIHdvcmsgd2l0aG91dCBpdC5cbiAgYXdhaXQgQi5kZWxheSgyMDAwKTtcbiAgYXdhaXQgdGhpcy5hZGIua2V5ZXZlbnQoa2V5KTtcbn07XG5cbmhlbHBlcnMud3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QgPSBhc3luYyBmdW5jdGlvbiB3cmFwQm9vdHN0cmFwRGlzY29ubmVjdCAod3JhcHBlZCkge1xuICBpZiAoIXRoaXMuYm9vdHN0cmFwKSB7XG4gICAgcmV0dXJuIGF3YWl0IHdyYXBwZWQoKTtcbiAgfVxuXG4gIHRoaXMuYm9vdHN0cmFwLmlnbm9yZVVuZXhwZWN0ZWRTaHV0ZG93biA9IHRydWU7XG4gIHRyeSB7XG4gICAgYXdhaXQgd3JhcHBlZCgpO1xuICAgIGF3YWl0IHRoaXMuYWRiLnJlc3RhcnQoKTtcbiAgICBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zdGFydCh0aGlzLm9wdHMuYXBwUGFja2FnZSwgdGhpcy5vcHRzLmRpc2FibGVBbmRyb2lkV2F0Y2hlcnMsIHRoaXMub3B0cy5hY2NlcHRTc2xDZXJ0cyk7XG4gIH0gZmluYWxseSB7XG4gICAgdGhpcy5ib290c3RyYXAuaWdub3JlVW5leHBlY3RlZFNodXRkb3duID0gZmFsc2U7XG4gIH1cbn07XG5cbk9iamVjdC5hc3NpZ24oZXh0ZW5zaW9ucywgY29tbWFuZHMsIGhlbHBlcnMpO1xuZXhwb3J0IHsgY29tbWFuZHMsIGhlbHBlcnMgfTtcbmV4cG9ydCBkZWZhdWx0IGV4dGVuc2lvbnM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBRUEsSUFBSUEsUUFBUSxHQUFHLENBQUMsQ0FBQztFQUFFQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0VBQUVDLFVBQVUsR0FBRyxDQUFDLENBQUM7QUFBQztBQUFBO0FBRWpELE1BQU1DLGtCQUFrQixHQUFHLEtBQUs7QUFDaEMsTUFBTUMsU0FBUyxHQUFHLEtBQUs7QUFDdkIsTUFBTUMsU0FBUyxHQUFHLEtBQUs7QUFNdkIsTUFBTUMsV0FBVyxHQUFHQyxNQUFNLENBQUNDLFNBQVM7QUFFcENSLFFBQVEsQ0FBQ1Msb0JBQW9CLEdBQUcsZUFBZUEsb0JBQW9CLEdBQUk7RUFDckUsSUFBSSxDQUFDQyxHQUFHLENBQUNDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQztFQUMzQyxJQUFJQyxjQUFjLEdBQUcsTUFBTSxJQUFJLENBQUNDLEdBQUcsQ0FBQ0MsZ0JBQWdCLEVBQUU7RUFDdEQsSUFBSUMsVUFBVSxHQUFHSCxjQUFjLEdBQUdULGtCQUFrQixHQUFHLENBQUM7RUFHeEQsSUFBSSxDQUFDUyxjQUFjLEVBQUU7SUFDbkIsSUFBSUksTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDQyxRQUFRLEVBQUU7SUFDbENGLFVBQVUsSUFBS0MsTUFBTSxHQUFHWixTQUFTLEdBQUcsQ0FBRTtJQUN0QyxJQUFJYyxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUNMLEdBQUcsQ0FBQ00sUUFBUSxFQUFFO0lBQ3RDSixVQUFVLElBQUtHLE1BQU0sR0FBR2IsU0FB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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"network.js","names":["commands","helpers","extensions","AIRPLANE_MODE_MASK","WIFI_MASK","DATA_MASK","GEO_EPSILON","Number","MIN_VALUE","getNetworkConnection","log","info","airplaneModeOn","adb","isAirplaneModeOn","connection","wifiOn","isWifiOn","dataOn","isDataOn","setNetworkConnection","type","shouldEnableAirplaneMode","shouldEnableWifi","shouldEnableDataConnection","currentState","isAirplaneModeEnabled","isWiFiEnabled","isDataEnabled","wrapBootstrapDisconnect","setAirplaneMode","broadcastAirplaneMode","setWifiState","setDataState","isEmulator","wifi","toggleData","data","setWifiAndData","toggleWiFi","toggleFlightMode","flightMode","setGeoLocation","location","getGeoLocation","e","warn","message","latitude","longitude","altitude","mobileRefreshGpsCache","opts","timeoutMs","refreshGeoLocationCache","parseFloat","KeyCode","UP","DOWN","RIGHT","CENTER","toggleLocationServices","api","getApiLevel","providers","getLocationProviders","isGpsEnabled","indexOf","toggleGPSLocationProvider","seq","push","keyevent","toggleSetting","errors","NotYetImplementedError","setting","preKeySeq","_","isNull","openSettingsActivity","key","doKey","appPackage","appActivity","getFocusedPackageAndActivity","waitForNotActivity","ign","back","B","delay","wrapped","bootstrap","ignoreUnexpectedShutdown","restart","start","disableAndroidWatchers","acceptSslCerts","Object","assign"],"sources":["../../../lib/commands/network.js"],"sourcesContent":["import _ from 'lodash';\nimport { errors } from 'appium/driver';\nimport B from 'bluebird';\n\nlet commands = {}, helpers = {}, extensions = {};\n\nconst AIRPLANE_MODE_MASK = 0b001;\nconst WIFI_MASK = 0b010;\nconst DATA_MASK = 0b100;\n// The value close to zero, but not zero, is needed\n// to trick JSON generation and send a float value instead of an integer,\n// This allows strictly-typed clients, like Java, to properly\n// parse it. Otherwise float 0.0 is always represented as integer 0 in JS.\n// The value must not be greater than DBL_EPSILON (https://opensource.apple.com/source/Libc/Libc-498/include/float.h)\nconst GEO_EPSILON = Number.MIN_VALUE;\n\ncommands.getNetworkConnection = async function getNetworkConnection () {\n this.log.info('Getting network connection');\n let airplaneModeOn = await this.adb.isAirplaneModeOn();\n let connection = airplaneModeOn ? AIRPLANE_MODE_MASK : 0;\n\n // no need to check anything else if we are in airplane mode\n if (!airplaneModeOn) {\n let wifiOn = await this.isWifiOn();\n connection |= (wifiOn ? WIFI_MASK : 0);\n let dataOn = await this.adb.isDataOn();\n connection |= (dataOn ? DATA_MASK : 0);\n }\n\n return connection;\n};\n\n/**\n * decoupling to override the behaviour in other drivers like UiAutomator2.\n */\ncommands.isWifiOn = async function isWifiOn () {\n return await this.adb.isWifiOn();\n};\n\ncommands.setNetworkConnection = async function setNetworkConnection (type) {\n this.log.info('Setting network connection');\n // decode the input\n const shouldEnableAirplaneMode = (type & AIRPLANE_MODE_MASK) !== 0;\n const shouldEnableWifi = (type & WIFI_MASK) !== 0;\n const shouldEnableDataConnection = (type & DATA_MASK) !== 0;\n\n const currentState = await this.getNetworkConnection();\n const isAirplaneModeEnabled = (currentState & AIRPLANE_MODE_MASK) !== 0;\n const isWiFiEnabled = (currentState & WIFI_MASK) !== 0;\n const isDataEnabled = (currentState & DATA_MASK) !== 0;\n\n if (shouldEnableAirplaneMode !== isAirplaneModeEnabled) {\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setAirplaneMode(shouldEnableAirplaneMode);\n });\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.broadcastAirplaneMode(shouldEnableAirplaneMode);\n });\n } else {\n this.log.info(`Not changing airplane mode, since it is already ` +\n `${shouldEnableAirplaneMode ? 'enabled' : 'disabled'}`);\n }\n\n if (shouldEnableWifi === isWiFiEnabled && shouldEnableDataConnection === isDataEnabled) {\n this.log.info('Not changing data connection/Wi-Fi states, since they are already set to expected values');\n if (await this.adb.isAirplaneModeOn()) {\n return AIRPLANE_MODE_MASK | currentState;\n }\n return ~AIRPLANE_MODE_MASK & currentState;\n }\n\n await this.wrapBootstrapDisconnect(async () => {\n if (shouldEnableWifi !== isWiFiEnabled) {\n await this.setWifiState(shouldEnableWifi);\n } else {\n this.log.info(`Not changing Wi-Fi state, since it is already ` +\n `${shouldEnableWifi ? 'enabled' : 'disabled'}`);\n }\n\n if (shouldEnableAirplaneMode) {\n this.log.info('Not changing data connection state, because airplane mode is enabled');\n } else if (shouldEnableDataConnection === isDataEnabled) {\n this.log.info(`Not changing data connection state, since it is already ` +\n `${shouldEnableDataConnection ? 'enabled' : 'disabled'}`);\n } else {\n await this.adb.setDataState(shouldEnableDataConnection, this.isEmulator());\n }\n });\n\n return await this.getNetworkConnection();\n};\n\n/**\n * decoupling to override behaviour in other drivers like UiAutomator2.\n */\ncommands.setWifiState = async function setWifiState (wifi) {\n await this.adb.setWifiState(wifi, this.isEmulator());\n};\n\ncommands.toggleData = async function toggleData () {\n let data = !(await this.adb.isDataOn());\n this.log.info(`Turning network data ${data ? 'on' : 'off'}`);\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setWifiAndData({data}, this.isEmulator());\n });\n};\n\ncommands.toggleWiFi = async function toggleWiFi () {\n let wifi = !(await this.adb.isWifiOn());\n this.log.info(`Turning WiFi ${wifi ? 'on' : 'off'}`);\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setWifiAndData({wifi}, this.isEmulator());\n });\n};\n\ncommands.toggleFlightMode = async function toggleFlightMode () {\n /*\n * TODO: Implement isRealDevice(). This method fails on\n * real devices, it should throw a NotYetImplementedError\n */\n let flightMode = !(await this.adb.isAirplaneModeOn());\n this.log.info(`Turning flight mode ${flightMode ? 'on' : 'off'}`);\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setAirplaneMode(flightMode);\n });\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.broadcastAirplaneMode(flightMode);\n });\n};\n\ncommands.setGeoLocation = async function setGeoLocation (location) {\n await this.adb.setGeoLocation(location, this.isEmulator());\n try {\n return await this.getGeoLocation();\n } catch (e) {\n this.log.warn(`Could not get the current geolocation info: ${e.message}`);\n this.log.warn(`Returning the default zero'ed values`);\n return {\n latitude: GEO_EPSILON,\n longitude: GEO_EPSILON,\n altitude: GEO_EPSILON,\n };\n }\n};\n\n/**\n * @typedef {Object} GpsCacheRefreshOptions\n * @property {number} timeoutMs [20000] The maximum number of milliseconds\n * to block until GPS cache is refreshed. Providing zero or a negative\n * value to it skips waiting completely.\n */\n\n/**\n * Sends an async request to refresh the GPS cache.\n * This feature only works if the device under test has\n * Google Play Services installed. In case the vanilla\n * LocationManager is used the device API level must be at\n * version 30 (Android R) or higher.\n *\n * @param {GpsCacheRefreshOptions} opts\n */\ncommands.mobileRefreshGpsCache = async function mobileRefreshGpsCache (opts = {}) {\n const { timeoutMs } = opts;\n await this.adb.refreshGeoLocationCache(timeoutMs);\n};\n\ncommands.getGeoLocation = async function getGeoLocation () {\n const {latitude, longitude, altitude} = await this.adb.getGeoLocation();\n return {\n latitude: parseFloat(latitude) || GEO_EPSILON,\n longitude: parseFloat(longitude) || GEO_EPSILON,\n altitude: parseFloat(altitude) || GEO_EPSILON,\n };\n};\n// https://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_DPAD_CENTER\n// in the android docs, this is how the keycodes are defined\nconst KeyCode = {\n UP: 19,\n DOWN: 20,\n RIGHT: 22,\n CENTER: 23\n};\ncommands.toggleLocationServices = async function toggleLocationServices () {\n this.log.info('Toggling location services');\n let api = await this.adb.getApiLevel();\n if (this.isEmulator()) {\n let providers = await this.adb.getLocationProviders();\n let isGpsEnabled = providers.indexOf('gps') !== -1;\n await this.adb.toggleGPSLocationProvider(!isGpsEnabled);\n return;\n }\n\n if (api > 15) {\n let seq = [KeyCode.UP, KeyCode.UP];\n if (api === 16) {\n // This version of Android has a \"parent\" button in its action bar\n seq.push(KeyCode.DOWN);\n } else if (api < 28) {\n // Newer versions of Android have the toggle in the Action bar\n seq = [KeyCode.RIGHT, KeyCode.RIGHT, KeyCode.UP];\n /*\n * Once the Location services switch is OFF, it won't receive focus\n * when going back to the Location Services settings screen unless we\n * send a dummy keyevent (UP) *before* opening the settings screen\n */\n await this.adb.keyevent(KeyCode.UP);\n } else if (api >= 28) {\n // Even newer versions of android have the toggle in a bar below the action bar\n // this means a single right click will cause it to be selected.\n seq = [KeyCode.RIGHT];\n await this.adb.keyevent(KeyCode.UP);\n }\n await this.toggleSetting('LOCATION_SOURCE_SETTINGS', seq);\n } else {\n // There's no global location services toggle on older Android versions\n throw new errors.NotYetImplementedError();\n }\n};\n\nhelpers.toggleSetting = async function toggleSetting (setting, preKeySeq) {\n /*\n * preKeySeq is the keyevent sequence to send over ADB in order\n * to position the cursor on the right option.\n * By default it's [up, up, down] because we usually target the 1st item in\n * the screen, and sometimes when opening settings activities the cursor is\n * already positionned on the 1st item, but we can't know for sure\n */\n if (_.isNull(preKeySeq)) {\n preKeySeq = [KeyCode.UP, KeyCode.UP, KeyCode.DOWN];\n }\n\n await this.openSettingsActivity(setting);\n\n for (let key of preKeySeq) {\n await this.doKey(key);\n }\n\n let {appPackage, appActivity} = await this.adb.getFocusedPackageAndActivity();\n\n /*\n * Click and handle potential ADB disconnect that occurs on official\n * emulator when the network connection is disabled\n */\n await this.wrapBootstrapDisconnect(async () => {\n await this.doKey(KeyCode.CENTER);\n });\n\n /*\n * In one particular case (enable Location Services), a pop-up is\n * displayed on some platforms so the user accepts or refuses that Google\n * collects location data. So we wait for that pop-up to open, if it\n * doesn't then proceed\n */\n try {\n await this.adb.waitForNotActivity(appPackage, appActivity, 5000);\n await this.doKey(KeyCode.RIGHT);\n await this.doKey(KeyCode.CENTER);\n await this.adb.waitForNotActivity(appPackage, appActivity, 5000);\n } catch (ign) {}\n\n await this.adb.back();\n};\n\nhelpers.doKey = async function doKey (key) {\n // TODO: Confirm we need this delay. Seems to work without it.\n await B.delay(2000);\n await this.adb.keyevent(key);\n};\n\nhelpers.wrapBootstrapDisconnect = async function wrapBootstrapDisconnect (wrapped) {\n if (!this.bootstrap) {\n return await wrapped();\n }\n\n this.bootstrap.ignoreUnexpectedShutdown = true;\n try {\n await wrapped();\n await this.adb.restart();\n await this.bootstrap.start(this.opts.appPackage, this.opts.disableAndroidWatchers, this.opts.acceptSslCerts);\n } finally {\n this.bootstrap.ignoreUnexpectedShutdown = false;\n }\n};\n\nObject.assign(extensions, commands, helpers);\nexport { commands, helpers };\nexport default extensions;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"network.js","names":["commands","helpers","extensions","AIRPLANE_MODE_MASK","WIFI_MASK","DATA_MASK","GEO_EPSILON","Number","MIN_VALUE","getNetworkConnection","log","info","airplaneModeOn","adb","isAirplaneModeOn","connection","wifiOn","isWifiOn","dataOn","isDataOn","setNetworkConnection","type","shouldEnableAirplaneMode","shouldEnableWifi","shouldEnableDataConnection","currentState","isAirplaneModeEnabled","isWiFiEnabled","isDataEnabled","wrapBootstrapDisconnect","setAirplaneMode","broadcastAirplaneMode","setWifiState","setDataState","isEmulator","wifi","toggleData","data","setWifiAndData","toggleWiFi","toggleFlightMode","flightMode","setGeoLocation","location","getGeoLocation","e","warn","message","latitude","longitude","altitude","mobileRefreshGpsCache","opts","timeoutMs","refreshGeoLocationCache","parseFloat","KeyCode","UP","DOWN","RIGHT","CENTER","toggleLocationServices","api","getApiLevel","providers","getLocationProviders","isGpsEnabled","indexOf","toggleGPSLocationProvider","seq","push","keyevent","toggleSetting","errors","NotYetImplementedError","setting","preKeySeq","_","isNull","openSettingsActivity","key","doKey","appPackage","appActivity","getFocusedPackageAndActivity","waitForNotActivity","ign","back","B","delay","wrapped","bootstrap","ignoreUnexpectedShutdown","restart","start","disableAndroidWatchers","acceptSslCerts","Object","assign"],"sources":["../../../lib/commands/network.js"],"sourcesContent":["import _ from 'lodash';\nimport { errors } from 'appium/driver';\nimport B from 'bluebird';\n\nlet commands = {}, helpers = {}, extensions = {};\n\nconst AIRPLANE_MODE_MASK = 0b001;\nconst WIFI_MASK = 0b010;\nconst DATA_MASK = 0b100;\n// The value close to zero, but not zero, is needed\n// to trick JSON generation and send a float value instead of an integer,\n// This allows strictly-typed clients, like Java, to properly\n// parse it. Otherwise float 0.0 is always represented as integer 0 in JS.\n// The value must not be greater than DBL_EPSILON (https://opensource.apple.com/source/Libc/Libc-498/include/float.h)\nconst GEO_EPSILON = Number.MIN_VALUE;\n\ncommands.getNetworkConnection = async function getNetworkConnection () {\n this.log.info('Getting network connection');\n let airplaneModeOn = await this.adb.isAirplaneModeOn();\n let connection = airplaneModeOn ? AIRPLANE_MODE_MASK : 0;\n\n // no need to check anything else if we are in airplane mode\n if (!airplaneModeOn) {\n let wifiOn = await this.isWifiOn();\n connection |= (wifiOn ? WIFI_MASK : 0);\n let dataOn = await this.adb.isDataOn();\n connection |= (dataOn ? DATA_MASK : 0);\n }\n\n return connection;\n};\n\n/**\n * decoupling to override the behaviour in other drivers like UiAutomator2.\n */\ncommands.isWifiOn = async function isWifiOn () {\n return await this.adb.isWifiOn();\n};\n\ncommands.setNetworkConnection = async function setNetworkConnection (type) {\n this.log.info('Setting network connection');\n // decode the input\n const shouldEnableAirplaneMode = (type & AIRPLANE_MODE_MASK) !== 0;\n const shouldEnableWifi = (type & WIFI_MASK) !== 0;\n const shouldEnableDataConnection = (type & DATA_MASK) !== 0;\n\n const currentState = await this.getNetworkConnection();\n const isAirplaneModeEnabled = (currentState & AIRPLANE_MODE_MASK) !== 0;\n const isWiFiEnabled = (currentState & WIFI_MASK) !== 0;\n const isDataEnabled = (currentState & DATA_MASK) !== 0;\n\n if (shouldEnableAirplaneMode !== isAirplaneModeEnabled) {\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setAirplaneMode(shouldEnableAirplaneMode);\n });\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.broadcastAirplaneMode(shouldEnableAirplaneMode);\n });\n } else {\n this.log.info(`Not changing airplane mode, since it is already ` +\n `${shouldEnableAirplaneMode ? 'enabled' : 'disabled'}`);\n }\n\n if (shouldEnableWifi === isWiFiEnabled && shouldEnableDataConnection === isDataEnabled) {\n this.log.info('Not changing data connection/Wi-Fi states, since they are already set to expected values');\n if (await this.adb.isAirplaneModeOn()) {\n return AIRPLANE_MODE_MASK | currentState;\n }\n return ~AIRPLANE_MODE_MASK & currentState;\n }\n\n await this.wrapBootstrapDisconnect(async () => {\n if (shouldEnableWifi !== isWiFiEnabled) {\n await this.setWifiState(shouldEnableWifi);\n } else {\n this.log.info(`Not changing Wi-Fi state, since it is already ` +\n `${shouldEnableWifi ? 'enabled' : 'disabled'}`);\n }\n\n if (shouldEnableAirplaneMode) {\n this.log.info('Not changing data connection state, because airplane mode is enabled');\n } else if (shouldEnableDataConnection === isDataEnabled) {\n this.log.info(`Not changing data connection state, since it is already ` +\n `${shouldEnableDataConnection ? 'enabled' : 'disabled'}`);\n } else {\n await this.adb.setDataState(shouldEnableDataConnection, this.isEmulator());\n }\n });\n\n return await this.getNetworkConnection();\n};\n\n/**\n * decoupling to override behaviour in other drivers like UiAutomator2.\n */\ncommands.setWifiState = async function setWifiState (wifi) {\n await this.adb.setWifiState(wifi, this.isEmulator());\n};\n\ncommands.toggleData = async function toggleData () {\n let data = !(await this.adb.isDataOn());\n this.log.info(`Turning network data ${data ? 'on' : 'off'}`);\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setWifiAndData({data}, this.isEmulator());\n });\n};\n\ncommands.toggleWiFi = async function toggleWiFi () {\n let wifi = !(await this.adb.isWifiOn());\n this.log.info(`Turning WiFi ${wifi ? 'on' : 'off'}`);\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setWifiAndData({wifi}, this.isEmulator());\n });\n};\n\ncommands.toggleFlightMode = async function toggleFlightMode () {\n /*\n * TODO: Implement isRealDevice(). This method fails on\n * real devices, it should throw a NotYetImplementedError\n */\n let flightMode = !(await this.adb.isAirplaneModeOn());\n this.log.info(`Turning flight mode ${flightMode ? 'on' : 'off'}`);\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setAirplaneMode(flightMode);\n });\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.broadcastAirplaneMode(flightMode);\n });\n};\n\ncommands.setGeoLocation = async function setGeoLocation (location) {\n await this.adb.setGeoLocation(location, this.isEmulator());\n try {\n return await this.getGeoLocation();\n } catch (e) {\n this.log.warn(`Could not get the current geolocation info: ${e.message}`);\n this.log.warn(`Returning the default zero'ed values`);\n return {\n latitude: GEO_EPSILON,\n longitude: GEO_EPSILON,\n altitude: GEO_EPSILON,\n };\n }\n};\n\n/**\n * @typedef {Object} GpsCacheRefreshOptions\n * @property {number} timeoutMs [20000] The maximum number of milliseconds\n * to block until GPS cache is refreshed. Providing zero or a negative\n * value to it skips waiting completely.\n */\n\n/**\n * Sends an async request to refresh the GPS cache.\n * This feature only works if the device under test has\n * Google Play Services installed. In case the vanilla\n * LocationManager is used the device API level must be at\n * version 30 (Android R) or higher.\n *\n * @param {GpsCacheRefreshOptions} opts\n */\ncommands.mobileRefreshGpsCache = async function mobileRefreshGpsCache (opts = {}) {\n const { timeoutMs } = opts;\n await this.adb.refreshGeoLocationCache(timeoutMs);\n};\n\ncommands.getGeoLocation = async function getGeoLocation () {\n const {latitude, longitude, altitude} = await this.adb.getGeoLocation();\n return {\n latitude: parseFloat(latitude) || GEO_EPSILON,\n longitude: parseFloat(longitude) || GEO_EPSILON,\n altitude: parseFloat(altitude) || GEO_EPSILON,\n };\n};\n// https://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_DPAD_CENTER\n// in the android docs, this is how the keycodes are defined\nconst KeyCode = {\n UP: 19,\n DOWN: 20,\n RIGHT: 22,\n CENTER: 23\n};\ncommands.toggleLocationServices = async function toggleLocationServices () {\n this.log.info('Toggling location services');\n let api = await this.adb.getApiLevel();\n if (this.isEmulator()) {\n let providers = await this.adb.getLocationProviders();\n let isGpsEnabled = providers.indexOf('gps') !== -1;\n await this.adb.toggleGPSLocationProvider(!isGpsEnabled);\n return;\n }\n\n if (api > 15) {\n let seq = [KeyCode.UP, KeyCode.UP];\n if (api === 16) {\n // This version of Android has a \"parent\" button in its action bar\n seq.push(KeyCode.DOWN);\n } else if (api < 28) {\n // Newer versions of Android have the toggle in the Action bar\n seq = [KeyCode.RIGHT, KeyCode.RIGHT, KeyCode.UP];\n /*\n * Once the Location services switch is OFF, it won't receive focus\n * when going back to the Location Services settings screen unless we\n * send a dummy keyevent (UP) *before* opening the settings screen\n */\n await this.adb.keyevent(KeyCode.UP);\n } else if (api >= 28) {\n // Even newer versions of android have the toggle in a bar below the action bar\n // this means a single right click will cause it to be selected.\n seq = [KeyCode.RIGHT];\n await this.adb.keyevent(KeyCode.UP);\n }\n await this.toggleSetting('LOCATION_SOURCE_SETTINGS', seq);\n } else {\n // There's no global location services toggle on older Android versions\n throw new errors.NotYetImplementedError();\n }\n};\n\nhelpers.toggleSetting = async function toggleSetting (setting, preKeySeq) {\n /*\n * preKeySeq is the keyevent sequence to send over ADB in order\n * to position the cursor on the right option.\n * By default it's [up, up, down] because we usually target the 1st item in\n * the screen, and sometimes when opening settings activities the cursor is\n * already positionned on the 1st item, but we can't know for sure\n */\n if (_.isNull(preKeySeq)) {\n preKeySeq = [KeyCode.UP, KeyCode.UP, KeyCode.DOWN];\n }\n\n await this.openSettingsActivity(setting);\n\n for (let key of preKeySeq) {\n await this.doKey(key);\n }\n\n let {appPackage, appActivity} = await this.adb.getFocusedPackageAndActivity();\n\n /*\n * Click and handle potential ADB disconnect that occurs on official\n * emulator when the network connection is disabled\n */\n await this.wrapBootstrapDisconnect(async () => {\n await this.doKey(KeyCode.CENTER);\n });\n\n /*\n * In one particular case (enable Location Services), a pop-up is\n * displayed on some platforms so the user accepts or refuses that Google\n * collects location data. So we wait for that pop-up to open, if it\n * doesn't then proceed\n */\n try {\n await this.adb.waitForNotActivity(appPackage, appActivity, 5000);\n await this.doKey(KeyCode.RIGHT);\n await this.doKey(KeyCode.CENTER);\n await this.adb.waitForNotActivity(appPackage, appActivity, 5000);\n } catch (ign) {}\n\n await this.adb.back();\n};\n\nhelpers.doKey = async function doKey (key) {\n // TODO: Confirm we need this delay. Seems to work without it.\n await B.delay(2000);\n await this.adb.keyevent(key);\n};\n\nhelpers.wrapBootstrapDisconnect = async function wrapBootstrapDisconnect (wrapped) {\n if (!this.bootstrap) {\n return await wrapped();\n }\n\n this.bootstrap.ignoreUnexpectedShutdown = true;\n try {\n await wrapped();\n await this.adb.restart();\n await this.bootstrap.start(this.opts.appPackage, this.opts.disableAndroidWatchers, this.opts.acceptSslCerts);\n } finally {\n this.bootstrap.ignoreUnexpectedShutdown = false;\n }\n};\n\nObject.assign(extensions, commands, helpers);\nexport { commands, helpers };\nexport default extensions;\n"],"mappings":"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"}
|
|
@@ -38,7 +38,6 @@ const MEMINFO_TITLES = Object.freeze({
|
|
|
38
38
|
HEAP: 'Heap'
|
|
39
39
|
});
|
|
40
40
|
const RETRY_PAUSE_MS = 1000;
|
|
41
|
-
|
|
42
41
|
function parseMeminfoForApi19To29(entries, valDict) {
|
|
43
42
|
const [type, subType] = entries;
|
|
44
43
|
if (type === MEMINFO_TITLES.NATIVE && subType === MEMINFO_TITLES.HEAP) {
|
|
@@ -53,7 +52,6 @@ function parseMeminfoForApi19To29(entries, valDict) {
|
|
|
53
52
|
[, valDict.totalPss, valDict.totalPrivateDirty] = entries;
|
|
54
53
|
}
|
|
55
54
|
}
|
|
56
|
-
|
|
57
55
|
function parseMeminfoForApiBelow19(entries, valDict) {
|
|
58
56
|
const type = entries[0];
|
|
59
57
|
if (type === MEMINFO_TITLES.NATIVE) {
|
|
@@ -68,7 +66,6 @@ function parseMeminfoForApiBelow19(entries, valDict) {
|
|
|
68
66
|
[, valDict.totalPss,, valDict.totalPrivateDirty] = entries;
|
|
69
67
|
}
|
|
70
68
|
}
|
|
71
|
-
|
|
72
69
|
function parseMeminfoForApiAbove29(entries, valDict) {
|
|
73
70
|
const [type, subType] = entries;
|
|
74
71
|
if (type === MEMINFO_TITLES.NATIVE && subType === MEMINFO_TITLES.HEAP) {
|
|
@@ -83,11 +80,9 @@ function parseMeminfoForApiAbove29(entries, valDict) {
|
|
|
83
80
|
[, valDict.totalPss, valDict.totalPrivateDirty,,, valDict.totalRss] = entries;
|
|
84
81
|
}
|
|
85
82
|
}
|
|
86
|
-
|
|
87
83
|
commands.getPerformanceDataTypes = function getPerformanceDataTypes() {
|
|
88
84
|
return _lodash.default.keys(SUPPORTED_PERFORMANCE_DATA_TYPES);
|
|
89
85
|
};
|
|
90
|
-
|
|
91
86
|
commands.getPerformanceData = async function getPerformanceData(packageName, dataType, retries = 2) {
|
|
92
87
|
switch (_lodash.default.toLower(dataType)) {
|
|
93
88
|
case 'batteryinfo':
|
|
@@ -127,7 +122,6 @@ helpers.getBatteryInfo = async function getBatteryInfo(retries = 2) {
|
|
|
127
122
|
let cmd = ['dumpsys', 'battery', '|', 'grep', 'level'];
|
|
128
123
|
let data = await this.adb.shell(cmd);
|
|
129
124
|
if (!data) throw new Error('No data from dumpsys');
|
|
130
|
-
|
|
131
125
|
let power = parseInt((data.split(':')[1] || '').trim(), 10);
|
|
132
126
|
if (!Number.isNaN(power)) {
|
|
133
127
|
return [_lodash.default.clone(BATTERY_KEYS), [power.toString()]];
|
|
@@ -172,7 +166,6 @@ helpers.getNetworkTrafficInfo = async function getNetworkTrafficInfo(retries = 2
|
|
|
172
166
|
let cmd = ['dumpsys', 'netstats'];
|
|
173
167
|
let data = await this.adb.shell(cmd);
|
|
174
168
|
if (!data) throw new Error('No data from dumpsys');
|
|
175
|
-
|
|
176
169
|
let index = 0;
|
|
177
170
|
let fromXtstats = data.indexOf('Xt stats:');
|
|
178
171
|
let start = data.indexOf('Pending bytes:', fromXtstats);
|
|
@@ -272,4 +265,4 @@ helpers.getNetworkTrafficInfo = async function getNetworkTrafficInfo(retries = 2
|
|
|
272
265
|
Object.assign(extensions, commands, helpers);
|
|
273
266
|
var _default = extensions;
|
|
274
267
|
exports.default = _default;
|
|
275
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21tYW5kcyIsImhlbHBlcnMiLCJleHRlbnNpb25zIiwiTkVUV09SS19LRVlTIiwiQ1BVX0tFWVMiLCJCQVRURVJZX0tFWVMiLCJNRU1PUllfS0VZUyIsIlNVUFBPUlRFRF9QRVJGT1JNQU5DRV9EQVRBX1RZUEVTIiwiT2JqZWN0IiwiZnJlZXplIiwiY3B1aW5mbyIsIm1lbW9yeWluZm8iLCJiYXR0ZXJ5aW5mbyIsIm5ldHdvcmtpbmZvIiwiTUVNSU5GT19USVRMRVMiLCJOQVRJVkUiLCJEQUxWSUsiLCJFR0wiLCJHTCIsIk1UUkFDSyIsIlRPVEFMIiwiSEVBUCIsIlJFVFJZX1BBVVNFX01TIiwicGFyc2VNZW1pbmZvRm9yQXBpMTlUbzI5IiwiZW50cmllcyIsInZhbERpY3QiLCJ0eXBlIiwic3ViVHlwZSIsIm5hdGl2ZVBzcyIsIm5hdGl2ZVByaXZhdGVEaXJ0eSIsIm5hdGl2ZUhlYXBTaXplIiwibmF0aXZlSGVhcEFsbG9jYXRlZFNpemUiLCJkYWx2aWtQc3MiLCJkYWx2aWtQcml2YXRlRGlydHkiLCJlZ2xQc3MiLCJlZ2xQcml2YXRlRGlydHkiLCJnbFBzcyIsImdsUHJpdmF0ZURpcnR5IiwibGVuZ3RoIiwidG90YWxQc3MiLCJ0b3RhbFByaXZhdGVEaXJ0eSIsInBhcnNlTWVtaW5mb0ZvckFwaUJlbG93MTkiLCJwYXJzZU1lbWluZm9Gb3JBcGlBYm92ZTI5IiwibmF0aXZlUnNzIiwiZGFsdmlrUnNzIiwidG90YWxSc3MiLCJnZXRQZXJmb3JtYW5jZURhdGFUeXBlcyIsIl8iLCJrZXlzIiwiZ2V0UGVyZm9ybWFuY2VEYXRhIiwicGFja2FnZU5hbWUiLCJkYXRhVHlwZSIsInJldHJpZXMiLCJ0b0xvd2VyIiwiZ2V0QmF0dGVyeUluZm8iLCJnZXRDUFVJbmZvIiwiZ2V0TWVtb3J5SW5mbyIsImdldE5ldHdvcmtUcmFmZmljSW5mbyIsIkVycm9yIiwiSlNPTiIsInN0cmluZ2lmeSIsInJldHJ5SW50ZXJ2YWwiLCJvdXRwdXQiLCJhZGIiLCJzaGVsbCIsImUiLCJzdGRlcnIiLCJsb2ciLCJpbmZvIiwidXNhZ2VzUGF0dGVybiIsIlJlZ0V4cCIsImVzY2FwZVJlZ0V4cCIsIm1hdGNoIiwiZXhlYyIsImRlYnVnIiwiY21kIiwiZGF0YSIsInBvd2VyIiwicGFyc2VJbnQiLCJzcGxpdCIsInRyaW0iLCJOdW1iZXIiLCJpc05hTiIsImNsb25lIiwidG9TdHJpbmciLCJhcGlMZXZlbCIsImdldEFwaUxldmVsIiwibGluZSIsImZpbHRlciIsIkJvb2xlYW4iLCJoZWFkZXJzIiwidmFsdWVzIiwibWFwIiwiaGVhZGVyIiwicmV0dXJuVmFsdWUiLCJidWNrZXREdXJhdGlvbiIsImJ1Y2tldFN0YXJ0IiwiYWN0aXZlVGltZSIsInJ4Qnl0ZXMiLCJyeFBhY2tldHMiLCJ0eEJ5dGVzIiwidHhQYWNrZXRzIiwib3BlcmF0aW9ucyIsImluZGV4IiwiZnJvbVh0c3RhdHMiLCJpbmRleE9mIiwic3RhcnQiLCJkZWxpbWl0ZXIiLCJlbmQiLCJwZW5kaW5nQnl0ZXMiLCJzdWJzdHJpbmciLCJhcnJheUxpc3QiLCJqIiwiayIsInJldHVybkluZGV4IiwiaSIsImlzRXF1YWwiLCJpc1VuZGVmaW5lZCIsImFzc2lnbiJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21tYW5kcy9wZXJmb3JtYW5jZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgcmV0cnlJbnRlcnZhbCB9IGZyb20gJ2FzeW5jYm94JztcblxuY29uc3QgY29tbWFuZHMgPSB7fSwgaGVscGVycyA9IHt9LCBleHRlbnNpb25zID0ge307XG5cbmNvbnN0IE5FVFdPUktfS0VZUyA9IFtcbiAgWydidWNrZXRTdGFydCcsICdhY3RpdmVUaW1lJywgJ3J4Qnl0ZXMnLCAncnhQYWNrZXRzJywgJ3R4Qnl0ZXMnLCAndHhQYWNrZXRzJywgJ29wZXJhdGlvbnMnLCAnYnVja2V0RHVyYXRpb24nXSxcbiAgWydzdCcsICdhY3RpdmVUaW1lJywgJ3JiJywgJ3JwJywgJ3RiJywgJ3RwJywgJ29wJywgJ2J1Y2tldER1cmF0aW9uJ11cbl07XG5jb25zdCBDUFVfS0VZUyA9IFsndXNlcicsICdrZXJuZWwnXTtcbmNvbnN0IEJBVFRFUllfS0VZUyA9IFsncG93ZXInXTtcbmNvbnN0IE1FTU9SWV9LRVlTID0gW1xuICAndG90YWxQcml2YXRlRGlydHknLCAnbmF0aXZlUHJpdmF0ZURpcnR5JywgJ2RhbHZpa1ByaXZhdGVEaXJ0eScsXG4gICdlZ2xQcml2YXRlRGlydHknLCAnZ2xQcml2YXRlRGlydHknLFxuICAndG90YWxQc3MnLCAnbmF0aXZlUHNzJywgJ2RhbHZpa1BzcycsICdlZ2xQc3MnLCAnZ2xQc3MnLFxuICAnbmF0aXZlSGVhcEFsbG9jYXRlZFNpemUnLCAnbmF0aXZlSGVhcFNpemUnLFxuICAnbmF0aXZlUnNzJywgJ2RhbHZpa1JzcycsICd0b3RhbFJzcydcbl07XG5jb25zdCBTVVBQT1JURURfUEVSRk9STUFOQ0VfREFUQV9UWVBFUyA9IE9iamVjdC5mcmVlemUoe1xuICBjcHVpbmZvOiAndGhlIGFtb3VudCBvZiBjcHUgYnkgdXNlciBhbmQga2VybmVsIHByb2Nlc3MgLSBjcHUgaW5mb3JtYXRpb24gZm9yIGFwcGxpY2F0aW9ucyBvbiByZWFsIGRldmljZXMgYW5kIHNpbXVsYXRvcnMnLFxuICBtZW1vcnlpbmZvOiAndGhlIGFtb3VudCBvZiBtZW1vcnkgdXNlZCBieSB0aGUgcHJvY2VzcyAtIG1lbW9yeSBpbmZvcm1hdGlvbiBmb3IgYXBwbGljYXRpb25zIG9uIHJlYWwgZGV2aWNlcyBhbmQgc2ltdWxhdG9ycycsXG4gIGJhdHRlcnlpbmZvOiAndGhlIHJlbWFpbmluZyBiYXR0ZXJ5IHBvd2VyIC0gYmF0dGVyeSBwb3dlciBpbmZvcm1hdGlvbiBmb3IgYXBwbGljYXRpb25zIG9uIHJlYWwgZGV2aWNlcyBhbmQgc2ltdWxhdG9ycycsXG4gIG5ldHdvcmtpbmZvOiAndGhlIG5ldHdvcmsgc3RhdGlzdGljcyAtIG5ldHdvcmsgcngvdHggaW5mb3JtYXRpb24gZm9yIGFwcGxpY2F0aW9ucyBvbiByZWFsIGRldmljZXMgYW5kIHNpbXVsYXRvcnMnXG59KTtcbmNvbnN0IE1FTUlORk9fVElUTEVTID0gT2JqZWN0LmZyZWV6ZSh7XG4gIE5BVElWRTogJ05hdGl2ZScsXG4gIERBTFZJSzogJ0RhbHZpaycsXG4gIEVHTDogJ0VHTCcsXG4gIEdMOiAnR0wnLFxuICBNVFJBQ0s6ICdtdHJhY2snLFxuICBUT1RBTDogJ1RPVEFMJyxcbiAgSEVBUDogJ0hlYXAnXG59KTtcbmNvbnN0IFJFVFJZX1BBVVNFX01TID0gMTAwMDtcblxuLyoqXG4gKiBBUEkgbGV2ZWwgYmV0d2VlbiAxOCBhbmQgMzBcbiAqIFsnPFN5c3RlbSBUeXBlPicsICc8TWVtb3J5IFR5cGU+JywgPHBzcyB0b3RhbD4sIDxwcml2YXRlIGRpcnR5PiwgPHByaXZhdGUgY2xlYW4+LCA8c3dhcFBzcyBkaXJ0eT4sIDxoZWFwIHNpemU+LCA8aGVhcCBhbGxvYz4sIDxoZWFwIGZyZWU+XVxuICogZXhjZXB0ICdUT1RBTCcsIHdoaWNoIHNraXBzIHRoZSBzZWNvbmQgdHlwZSBuYW1lXG4gKiAhISEgdmFsRGljdCBnZXRzIG11dGF0ZWRcbiAqL1xuZnVuY3Rpb24gcGFyc2VNZW1pbmZvRm9yQXBpMTlUbzI5IChlbnRyaWVzLCB2YWxEaWN0KSB7XG4gIGNvbnN0IFt0eXBlLCBzdWJUeXBlXSA9IGVudHJpZXM7XG4gIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5OQVRJVkUgJiYgc3ViVHlwZSA9PT0gTUVNSU5GT19USVRMRVMuSEVBUCkge1xuICAgIFssLCB2YWxEaWN0Lm5hdGl2ZVBzcywgdmFsRGljdC5uYXRpdmVQcml2YXRlRGlydHksLCwgdmFsRGljdC5uYXRpdmVIZWFwU2l6ZSwgdmFsRGljdC5uYXRpdmVIZWFwQWxsb2NhdGVkU2l6ZV0gPSBlbnRyaWVzO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IE1FTUlORk9fVElUTEVTLkRBTFZJSyAmJiBzdWJUeXBlID09PSBNRU1JTkZPX1RJVExFUy5IRUFQKSB7XG4gICAgWywsIHZhbERpY3QuZGFsdmlrUHNzLCB2YWxEaWN0LmRhbHZpa1ByaXZhdGVEaXJ0eV0gPSBlbnRyaWVzO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IE1FTUlORk9fVElUTEVTLkVHTCAmJiBzdWJUeXBlID09PSBNRU1JTkZPX1RJVExFUy5NVFJBQ0spIHtcbiAgICBbLCwgdmFsRGljdC5lZ2xQc3MsIHZhbERpY3QuZWdsUHJpdmF0ZURpcnR5XSA9IGVudHJpZXM7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuR0wgJiYgc3ViVHlwZSA9PT0gTUVNSU5GT19USVRMRVMuTVRSQUNLKSB7XG4gICAgWywsIHZhbERpY3QuZ2xQc3MsIHZhbERpY3QuZ2xQcml2YXRlRGlydHldID0gZW50cmllcztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5UT1RBTCAmJiBlbnRyaWVzLmxlbmd0aCA9PT0gOCkge1xuICAgIC8vIHRoZXJlIGFyZSB0d28gdG90YWxzLCBhbmQgd2Ugb25seSB3YW50IHRoZSBmdWxsIGxpc3RpbmcsIHdoaWNoIGhhcyA4IGVudHJpZXNcbiAgICBbLCB2YWxEaWN0LnRvdGFsUHNzLCB2YWxEaWN0LnRvdGFsUHJpdmF0ZURpcnR5XSA9IGVudHJpZXM7XG4gIH1cbn1cblxuLyoqXG4gKiBbJzxTeXN0ZW0gVHlwZScsICc8cHBzPicsICc8c2hhcmVkIGRpcnR5PicsICc8cHJpdmF0ZSBkaXJ0eT4nLCAnPGhlYXAgc2l6ZT4nLCAnPGhlYXAgYWxsb2M+JywgJzxoZWFwIGZyZWU+J11cbiAqICEhISB2YWxEaWN0IGdldHMgbXV0YXRlZFxuICovXG5mdW5jdGlvbiBwYXJzZU1lbWluZm9Gb3JBcGlCZWxvdzE5IChlbnRyaWVzLCB2YWxEaWN0KSB7XG4gIGNvbnN0IHR5cGUgPSBlbnRyaWVzWzBdO1xuICBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuTkFUSVZFKSB7XG4gICAgWywgdmFsRGljdC5uYXRpdmVQc3MsLCB2YWxEaWN0Lm5hdGl2ZVByaXZhdGVEaXJ0eSwgdmFsRGljdC5uYXRpdmVIZWFwU2l6ZSwgdmFsRGljdC5uYXRpdmVIZWFwQWxsb2NhdGVkU2l6ZV0gPSBlbnRyaWVzO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IE1FTUlORk9fVElUTEVTLkRBTFZJSykge1xuICAgIFssIHZhbERpY3QuZGFsdmlrUHNzLCwgdmFsRGljdC5kYWx2aWtQcml2YXRlRGlydHldID0gZW50cmllcztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5FR0wpIHtcbiAgICBbLCB2YWxEaWN0LmVnbFBzcywsIHZhbERpY3QuZWdsUHJpdmF0ZURpcnR5XSA9IGVudHJpZXM7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuR0wpIHtcbiAgICBbLCB2YWxEaWN0LmdsUHNzLCwgdmFsRGljdC5nbFByaXZhdGVEaXJ0eV0gPSBlbnRyaWVzO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IE1FTUlORk9fVElUTEVTLlRPVEFMKSB7XG4gICAgWywgdmFsRGljdC50b3RhbFBzcywsIHZhbERpY3QudG90YWxQcml2YXRlRGlydHldID0gZW50cmllcztcbiAgfVxufVxuXG4vKipcbiAqIEFQSSBsZXZlbCAzMCBhbmQgYWJvdmVcbiAqIFsnPFN5c3RlbSBUeXBlPicsICc8TWVtb3J5IFR5cGU+JywgPHBzcyB0b3RhbD4sIDxwcml2YXRlIGRpcnR5PiwgPHByaXZhdGUgY2xlYW4+LCA8c3dhcFBzcyBkaXJ0eT4sIDxyc3MgdG90YWw+LCA8aGVhcCBzaXplPiwgPGhlYXAgYWxsb2M+LCA8aGVhcCBmcmVlPl1cbiAqICEhISB2YWxEaWN0IGdldHMgbXV0YXRlZFxuICovXG5mdW5jdGlvbiBwYXJzZU1lbWluZm9Gb3JBcGlBYm92ZTI5IChlbnRyaWVzLCB2YWxEaWN0KSB7XG4gIGNvbnN0IFt0eXBlLCBzdWJUeXBlXSA9IGVudHJpZXM7XG4gIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5OQVRJVkUgJiYgc3ViVHlwZSA9PT0gTUVNSU5GT19USVRMRVMuSEVBUCkge1xuICAgIFssLCB2YWxEaWN0Lm5hdGl2ZVBzcywgdmFsRGljdC5uYXRpdmVQcml2YXRlRGlydHksLCwgdmFsRGljdC5uYXRpdmVSc3MsIHZhbERpY3QubmF0aXZlSGVhcFNpemUsIHZhbERpY3QubmF0aXZlSGVhcEFsbG9jYXRlZFNpemVdID0gZW50cmllcztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5EQUxWSUsgJiYgc3ViVHlwZSA9PT0gTUVNSU5GT19USVRMRVMuSEVBUCkge1xuICAgIFssLCB2YWxEaWN0LmRhbHZpa1BzcywgdmFsRGljdC5kYWx2aWtQcml2YXRlRGlydHksLCwgdmFsRGljdC5kYWx2aWtSc3NdID0gZW50cmllcztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5FR0wgJiYgc3ViVHlwZSA9PT0gTUVNSU5GT19USVRMRVMuTVRSQUNLKSB7XG4gICAgWywsIHZhbERpY3QuZWdsUHNzLCB2YWxEaWN0LmVnbFByaXZhdGVEaXJ0eV0gPSBlbnRyaWVzO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IE1FTUlORk9fVElUTEVTLkdMICYmIHN1YlR5cGUgPT09IE1FTUlORk9fVElUTEVTLk1UUkFDSykge1xuICAgIFssLCB2YWxEaWN0LmdsUHNzLCB2YWxEaWN0LmdsUHJpdmF0ZURpcnR5XSA9IGVudHJpZXM7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuVE9UQUwgJiYgZW50cmllcy5sZW5ndGggPT09IDkpIHtcbiAgICAvLyBoYXMgOSBlbnRyaWVzXG4gICAgWywgdmFsRGljdC50b3RhbFBzcywgdmFsRGljdC50b3RhbFByaXZhdGVEaXJ0eSwsLCB2YWxEaWN0LnRvdGFsUnNzXSA9IGVudHJpZXM7XG4gIH1cbn1cblxuLy9cbi8vIHJldHVybnMgdGhlIGluZm9ybWF0aW9uIHR5cGUgb2YgdGhlIHN5c3RlbSBzdGF0ZSB3aGljaCBpcyBzdXBwb3J0ZWQgdG8gcmVhZCBhcyBsaWtlIGNwdSwgbWVtb3J5LCBuZXR3b3JrIHRyYWZmaWMsIGFuZCBiYXR0ZXJ5LlxuLy8gb3V0cHV0IC0gYXJyYXkgbGlrZSBiZWxvd1xuLy8gW2NwdWluZm8sIGJhdHRlcnlpbmZvLCBuZXR3b3JraW5mbywgbWVtb3J5aW5mb11cbi8vXG5jb21tYW5kcy5nZXRQZXJmb3JtYW5jZURhdGFUeXBlcyA9IGZ1bmN0aW9uIGdldFBlcmZvcm1hbmNlRGF0YVR5cGVzICgpIHtcbiAgcmV0dXJuIF8ua2V5cyhTVVBQT1JURURfUEVSRk9STUFOQ0VfREFUQV9UWVBFUyk7XG59O1xuXG4vKipcbiAqIEByZXR1cm5zIFRoZSBpbmZvcm1hdGlvbiB0eXBlIG9mIHRoZSBzeXN0ZW0gc3RhdGUgd2hpY2ggaXMgc3VwcG9ydGVkIHRvIHJlYWQgYXMgbGlrZSBjcHUsIG1lbW9yeSwgbmV0d29yayB0cmFmZmljLCBhbmQgYmF0dGVyeS5cbiAqIGlucHV0IC0gKHBhY2thZ2VOYW1lKSB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvblxuICogICAgICAgIChkYXRhVHlwZSkgdGhlIHR5cGUgb2Ygc3lzdGVtIHN0YXRlIHdoaWNoIHdhbnRzIHRvIHJlYWQuIEl0IHNob3VsZCBiZSBvbmUgb2YgdGhlIGtleXMgb2YgdGhlIFNVUFBPUlRFRF9QRVJGT1JNQU5DRV9EQVRBX1RZUEVTXG4gKiAgICAgICAgKGRhdGFSZWFkVGltZW91dCkgdGhlIG51bWJlciBvZiBhdHRlbXB0cyB0byByZWFkXG4gKiBvdXRwdXQgLSB0YWJsZSBvZiB0aGUgcGVyZm9ybWFuY2UgZGF0YSwgVGhlIGZpcnN0IGxpbmUgb2YgdGhlIHRhYmxlIHJlcHJlc2VudHMgdGhlIHR5cGUgb2YgZGF0YS4gVGhlIHJlbWFpbmluZyBsaW5lcyByZXByZXNlbnQgdGhlIHZhbHVlcyBvZiB0aGUgZGF0YS5cbiAqXG4gKiBpbiBjYXNlIG9mIGJhdHRlcnkgaW5mbyA6IFtbcG93ZXJdLCBbMjNdXVxuICogaW4gY2FzZSBvZiBtZW1vcnkgaW5mbyA6ICBbW3RvdGFsUHJpdmF0ZURpcnR5LCBuYXRpdmVQcml2YXRlRGlydHksIGRhbHZpa1ByaXZhdGVEaXJ0eSwgZWdsUHJpdmF0ZURpcnR5LCBnbFByaXZhdGVEaXJ0eSwgdG90YWxQc3MsXG4gKiAgIG5hdGl2ZVBzcywgZGFsdmlrUHNzLCBlZ2xQc3MsIGdsUHNzLCBuYXRpdmVIZWFwQWxsb2NhdGVkU2l6ZSwgbmF0aXZlSGVhcFNpemVdLCBbMTgzNjAsIDgyOTYsIDYxMzIsIG51bGwsIG51bGwsIDQyNTg4LCA4NDA2LCA3MDI0LCBudWxsLCBudWxsLCAyNjUxOSwgMTAzNDRdXVxuICogaW4gY2FzZSBvZiBuZXR3b3JrIGluZm8gOiBbW2J1Y2tldFN0YXJ0LCBhY3RpdmVUaW1lLCByeEJ5dGVzLCByeFBhY2tldHMsIHR4Qnl0ZXMsIHR4UGFja2V0cywgb3BlcmF0aW9ucywgYnVja2V0RHVyYXRpb24sXSxcbiAqICAgWzE0NzgwOTE2MDAwMDAsIG51bGwsIDEwOTkwNzUsIDYxMDk0NywgOTI4LCAxMTQzNjIsIDc2OSwgMCwgMzYwMDAwMF0sIFsxNDc4MDk1MjAwMDAwLCBudWxsLCAxMzA2MzAwLCA0MDU5OTcsIDUwOSwgNDYzNTksIDM3MCwgMCwgMzYwMDAwMF1dXG4gKiBpbiBjYXNlIG9mIG5ldHdvcmsgaW5mbyA6IFtbc3QsIGFjdGl2ZVRpbWUsIHJiLCBycCwgdGIsIHRwLCBvcCwgYnVja2V0RHVyYXRpb25dLCBbMTQ3ODA4ODAwMCwgbnVsbCwgbnVsbCwgMzIxMTUyOTYsIDM0MjkxLCAyOTU2ODA1LCAyNTcwNSwgMCwgMzYwMF0sXG4gKiAgIFsxNDc4MDkxNjAwLCBudWxsLCBudWxsLCAyNzE0NjgzLCAxMTgyMSwgMTQyMDU2NCwgMTI2NTAsIDAsIDM2MDBdLCBbMTQ3ODA5NTIwMCwgbnVsbCwgbnVsbCwgMTAwNzkyMTMsIDE5OTYyLCAyNDg3NzA1LCAyMDAxNSwgMCwgMzYwMF0sXG4gKiAgIFsxNDc4MDk4ODAwLCBudWxsLCBudWxsLCA0NDQ0NDMzLCAxMDIyNywgMTQzMDM1NiwgMTA0OTMsIDAsIDM2MDBdXVxuICogaW4gY2FzZSBvZiBjcHUgaW5mbyA6IFtbdXNlciwga2VybmVsXSwgWzAuOSwgMS4zXV1cbiAqL1xuY29tbWFuZHMuZ2V0UGVyZm9ybWFuY2VEYXRhID0gYXN5bmMgZnVuY3Rpb24gZ2V0UGVyZm9ybWFuY2VEYXRhIChwYWNrYWdlTmFtZSwgZGF0YVR5cGUsIHJldHJpZXMgPSAyKSB7XG4gIHN3aXRjaCAoXy50b0xvd2VyKGRhdGFUeXBlKSkge1xuICAgIGNhc2UgJ2JhdHRlcnlpbmZvJzpcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdldEJhdHRlcnlJbmZvKHJldHJpZXMpO1xuICAgIGNhc2UgJ2NwdWluZm8nOlxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0Q1BVSW5mbyhwYWNrYWdlTmFtZSwgcmV0cmllcyk7XG4gICAgY2FzZSAnbWVtb3J5aW5mbyc6XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRNZW1vcnlJbmZvKHBhY2thZ2VOYW1lLCByZXRyaWVzKTtcbiAgICBjYXNlICduZXR3b3JraW5mbyc6XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXROZXR3b3JrVHJhZmZpY0luZm8ocmV0cmllcyk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gcGVyZm9ybWFuY2UgZGF0YSBvZiB0eXBlICcke2RhdGFUeXBlfScgZm91bmQuIGAgK1xuICAgICAgICBgT25seSB0aGUgZm9sbG93aW5nIHZhbHVlcyBhcmUgc3VwcG9ydGVkOiAke0pTT04uc3RyaW5naWZ5KFNVUFBPUlRFRF9QRVJGT1JNQU5DRV9EQVRBX1RZUEVTLCAnICcsIDIpfWApO1xuICB9XG59O1xuXG5oZWxwZXJzLmdldENQVUluZm8gPSBhc3luYyBmdW5jdGlvbiBnZXRDUFVJbmZvIChwYWNrYWdlTmFtZSwgcmV0cmllcyA9IDIpIHtcbiAgLy8gVE9ETzogZmlndXJlIG91dCB3aHkgdGhpcyBpc1xuICAvLyBzb21ldGltZXMsIHRoZSBmdW5jdGlvbiBvZiAnYWRiLnNoZWxsJyBmYWlscy4gd2hlbiBJIHRlc3RlZCB0aGlzIGZ1bmN0aW9uIG9uIHRoZSB0YXJnZXQgb2YgJ0dhbGF4eSBOb3RlNScsXG4gIC8vIGFkYi5zaGVsbChkdW1wc3lzIGNwdWluZm8pIHJldHVybnMgY3B1IGRhdGFzIGZvciBvdGhlciBhcHBsaWNhdGlvbiBwYWNrYWdlcywgYnV0IEkgY2FuJ3QgZmluZCB0aGUgZGF0YSBmb3IgcGFja2FnZU5hbWUuXG4gIC8vIEl0IHVzdWFsbHkgZmFpbHMgMzAgdGltZXMgYW5kIHN1Y2Nlc3MgZm9yIHRoZSBuZXh0IHRpbWUsXG4gIC8vIFNpbmNlIHRoZW4sIGhlIGhhcyBjb250aW51ZWQgdG8gc3VjY2VlZC5cbiAgcmV0dXJuIGF3YWl0IHJldHJ5SW50ZXJ2YWwocmV0cmllcywgUkVUUllfUEFVU0VfTVMsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgb3V0cHV0O1xuICAgIHRyeSB7XG4gICAgICBvdXRwdXQgPSBhd2FpdCB0aGlzLmFkYi5zaGVsbChbJ2R1bXBzeXMnLCAnY3B1aW5mbyddKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZS5zdGRlcnIpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhlLnN0ZGVycik7XG4gICAgICB9XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICAvLyBgb3V0cHV0YCB3aWxsIGJlIHNvbWV0aGluZyBsaWtlXG4gICAgLy8gICAgKzAlIDIyMDkvaW8uYXBwaXVtLmFuZHJvaWQuYXBpczogMC4xJSB1c2VyICsgMC4yJSBrZXJuZWwgLyBmYXVsdHM6IDcwIG1pbm9yXG4gICAgY29uc3QgdXNhZ2VzUGF0dGVybiA9XG4gICAgICBuZXcgUmVnRXhwKGBeLitcXFxcLyR7Xy5lc2NhcGVSZWdFeHAocGFja2FnZU5hbWUpfTpcXFxcRCsoW1xcXFxkLl0rKSVcXFxccyt1c2VyXFxcXHMrXFxcXCtcXFxccysoW1xcXFxkLl0rKSVcXFxccytrZXJuZWxgLCAnbScpO1xuICAgIGNvbnN0IG1hdGNoID0gdXNhZ2VzUGF0dGVybi5leGVjKG91dHB1dCk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcob3V0cHV0KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHBhcnNlIGNwdSB1c2FnZSBkYXRhIGZvciAnJHtwYWNrYWdlTmFtZX0nLiBDaGVjayB0aGUgc2VydmVyIGxvZyBmb3IgbW9yZSBkZXRhaWxzYCk7XG4gICAgfVxuICAgIHJldHVybiBbQ1BVX0tFWVMsIFttYXRjaFsxXSwgbWF0Y2hbMl1dXTtcbiAgfSk7XG59O1xuXG5oZWxwZXJzLmdldEJhdHRlcnlJbmZvID0gYXN5bmMgZnVuY3Rpb24gZ2V0QmF0dGVyeUluZm8gKHJldHJpZXMgPSAyKSB7XG4gIHJldHVybiBhd2FpdCByZXRyeUludGVydmFsKHJldHJpZXMsIFJFVFJZX1BBVVNFX01TLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IGNtZCA9IFsnZHVtcHN5cycsICdiYXR0ZXJ5JywgJ3wnLCAnZ3JlcCcsICdsZXZlbCddO1xuICAgIGxldCBkYXRhID0gYXdhaXQgdGhpcy5hZGIuc2hlbGwoY21kKTtcbiAgICBpZiAoIWRhdGEpIHRocm93IG5ldyBFcnJvcignTm8gZGF0YSBmcm9tIGR1bXBzeXMnKTsgLy9lc2xpbnQtZGlzYWJsZS1saW5lIGN1cmx5XG5cbiAgICBsZXQgcG93ZXIgPSBwYXJzZUludCgoZGF0YS5zcGxpdCgnOicpWzFdIHx8ICcnKS50cmltKCksIDEwKTtcblxuICAgIGlmICghTnVtYmVyLmlzTmFOKHBvd2VyKSkge1xuICAgICAgcmV0dXJuIFtfLmNsb25lKEJBVFRFUllfS0VZUyksIFtwb3dlci50b1N0cmluZygpXV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHBhcnNlIGJhdHRlcnkgZGF0YTogJyR7ZGF0YX0nYCk7XG4gICAgfVxuICB9KTtcbn07XG5cbmhlbHBlcnMuZ2V0TWVtb3J5SW5mbyA9IGFzeW5jIGZ1bmN0aW9uIGdldE1lbW9yeUluZm8gKHBhY2thZ2VOYW1lLCByZXRyaWVzID0gMikge1xuICByZXR1cm4gYXdhaXQgcmV0cnlJbnRlcnZhbChyZXRyaWVzLCBSRVRSWV9QQVVTRV9NUywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNtZCA9IFtcbiAgICAgICdkdW1wc3lzJywgJ21lbWluZm8nLCBgJyR7cGFja2FnZU5hbWV9J2AsXG4gICAgICAnfCcsICdncmVwJywgJy1FJyxcbiAgICAgIGAnJHtNRU1JTkZPX1RJVExFUy5OQVRJVkV9fCR7TUVNSU5GT19USVRMRVMuREFMVklLfXwke01FTUlORk9fVElUTEVTLkVHTH1gICtcbiAgICAgIGB8JHtNRU1JTkZPX1RJVExFUy5HTH18JHtNRU1JTkZPX1RJVExFUy5UT1RBTH0nYFxuICAgIF07XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuYWRiLnNoZWxsKGNtZCk7XG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGRhdGEgZnJvbSBkdW1wc3lzJyk7XG4gICAgfVxuICAgIGNvbnN0IHZhbERpY3QgPSB7dG90YWxQcml2YXRlRGlydHk6ICcnfTtcbiAgICBjb25zdCBhcGlMZXZlbCA9IGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCk7XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGRhdGEuc3BsaXQoJ1xcbicpKSB7XG4gICAgICBjb25zdCBlbnRyaWVzID0gbGluZS50cmltKCkuc3BsaXQoL1xccysvKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICBpZiAoYXBpTGV2ZWwgPj0gMzApIHtcbiAgICAgICAgcGFyc2VNZW1pbmZvRm9yQXBpQWJvdmUyOShlbnRyaWVzLCB2YWxEaWN0KTtcbiAgICAgIH0gZWxzZSBpZiAoYXBpTGV2ZWwgPiAxOCAmJiBhcGlMZXZlbCA8IDMwKSB7XG4gICAgICAgIHBhcnNlTWVtaW5mb0ZvckFwaTE5VG8yOShlbnRyaWVzLCB2YWxEaWN0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcnNlTWVtaW5mb0ZvckFwaUJlbG93MTkoZW50cmllcywgdmFsRGljdCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh2YWxEaWN0LnRvdGFsUHJpdmF0ZURpcnR5ICYmIHZhbERpY3QudG90YWxQcml2YXRlRGlydHkgIT09ICdub2RleCcpIHtcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSBfLmNsb25lKE1FTU9SWV9LRVlTKTtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IGhlYWRlcnMubWFwKChoZWFkZXIpID0+IHZhbERpY3RbaGVhZGVyXSk7XG4gICAgICByZXR1cm4gW2hlYWRlcnMsIHZhbHVlc107XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcGFyc2UgbWVtb3J5IGRhdGE6ICcke2RhdGF9J2ApO1xuICB9KTtcbn07XG5cbmhlbHBlcnMuZ2V0TmV0d29ya1RyYWZmaWNJbmZvID0gYXN5bmMgZnVuY3Rpb24gZ2V0TmV0d29ya1RyYWZmaWNJbmZvIChyZXRyaWVzID0gMikge1xuICByZXR1cm4gYXdhaXQgcmV0cnlJbnRlcnZhbChyZXRyaWVzLCBSRVRSWV9QQVVTRV9NUywgYXN5bmMgKCkgPT4ge1xuICAgIGxldCByZXR1cm5WYWx1ZSA9IFtdO1xuICAgIGxldCBidWNrZXREdXJhdGlvbiwgYnVja2V0U3RhcnQsIGFjdGl2ZVRpbWUsIHJ4Qnl0ZXMsIHJ4UGFja2V0cywgdHhCeXRlcywgdHhQYWNrZXRzLCBvcGVyYXRpb25zO1xuXG4gICAgbGV0IGNtZCA9IFsnZHVtcHN5cycsICduZXRzdGF0cyddO1xuICAgIGxldCBkYXRhID0gYXdhaXQgdGhpcy5hZGIuc2hlbGwoY21kKTtcbiAgICBpZiAoIWRhdGEpIHRocm93IG5ldyBFcnJvcignTm8gZGF0YSBmcm9tIGR1bXBzeXMnKTsgLy9lc2xpbnQtZGlzYWJsZS1saW5lIGN1cmx5XG5cbiAgICAvLyBJbiBjYXNlIG9mIG5ldHdvcmsgdHJhZmZpYyBpbmZvcm1hdGlvbiwgaXQgaXMgZGlmZmVyZW50IGZvciB0aGUgcmV0dXJuIGRhdGEgYmV0d2VlbiBlbXVsYXRvciBhbmQgcmVhbCBkZXZpY2UuXG4gICAgLy8gdGhlIHJldHVybiBkYXRhIG9mIGVtdWxhdG9yXG4gICAgLy8gICBYdCBzdGF0czpcbiAgICAvLyAgIFBlbmRpbmcgYnl0ZXM6IDM5MjUwXG4gICAgLy8gICBIaXN0b3J5IHNpbmNlIGJvb3Q6XG4gICAgLy8gICBpZGVudD1bW3R5cGU9V0lGSSwgc3ViVHlwZT1DT01CSU5FRCwgbmV0d29ya0lkPVwiV2lyZWRTU0lEXCJdXSB1aWQ9LTEgc2V0PUFMTCB0YWc9MHgwXG4gICAgLy8gICBOZXR3b3JrU3RhdHNIaXN0b3J5OiBidWNrZXREdXJhdGlvbj0zNjAwMDAwXG4gICAgLy8gICBidWNrZXRTdGFydD0xNDc4MDk4ODAwMDAwIGFjdGl2ZVRpbWU9MzE4MjQgcnhCeXRlcz0yMTUwMiByeFBhY2tldHM9NzggdHhCeXRlcz0xNzc0OCB0eFBhY2tldHM9OTAgb3BlcmF0aW9ucz0wXG4gICAgLy9cbiAgICAvLyA3LjFcbiAgICAvLyAgIFh0IHN0YXRzOlxuICAgIC8vICAgUGVuZGluZyBieXRlczogNDgxNDg3XG4gICAgLy8gICBIaXN0b3J5IHNpbmNlIGJvb3Q6XG4gICAgLy8gICBpZGVudD1be3R5cGU9TU9CSUxFLCBzdWJUeXBlPUNPTUJJTkVELCBzdWJzY3JpYmVySWQ9MzEwMjYwLi4uLCBtZXRlcmVkPXRydWV9XSB1aWQ9LTEgc2V0PUFMTCB0YWc9MHgwXG4gICAgLy8gICAgIE5ldHdvcmtTdGF0c0hpc3Rvcnk6IGJ1Y2tldER1cmF0aW9uPTM2MDBcbiAgICAvLyAgICAgICBzdD0xNDgzOTg0ODAwIHJiPTAgcnA9MCB0Yj0xMjAzMSB0cD0xODQgb3A9MFxuICAgIC8vICAgICAgIHN0PTE0ODM5ODg0MDAgcmI9MCBycD0wIHRiPTM4NDc2IHRwPTU4NyBvcD0wXG4gICAgLy8gICAgICAgc3Q9MTQ4Mzk5OTIwMCByYj0zMTU2MTYgcnA9NDAwIHRiPTk0ODAwIHRwPTM2MiBvcD0wXG4gICAgLy8gICAgICAgc3Q9MTQ4NDAwMjgwMCByYj0xNTgyNiBycD0yMCB0Yj00NzM4IHRwPTE2IG9wPTBcbiAgICAvL1xuICAgIC8vIHRoZSByZXR1cm4gZGF0YSBvZiByZWFsIGRldmljZVxuICAgIC8vICAgWHQgc3RhdHM6XG4gICAgLy8gICBQZW5kaW5nIGJ5dGVzOiAwXG4gICAgLy8gICBIaXN0b3J5IHNpbmNlIGJvb3Q6XG4gICAgLy8gICBpZGVudD1be3R5cGU9TU9CSUxFLCBzdWJUeXBlPUNPTUJJTkVELCBzdWJzY3JpYmVySWQ9NDUwMDUwLi4ufV0gdWlkPS0xIHNldD1BTEwgdGFnPTB4MFxuICAgIC8vICAgTmV0d29ya1N0YXRzSGlzdG9yeTogYnVja2V0RHVyYXRpb249MzYwMFxuICAgIC8vICAgc3Q9MTQ3ODA4ODAwMCByYj0zMjExNTI5NiBycD0zNDI5MSB0Yj0yOTU2ODA1IHRwPTI1NzA1IG9wPTBcbiAgICAvLyAgIHN0PTE0NzgwOTE2MDAgcmI9MjcxNDY4MyBycD0xMTgyMSB0Yj0xNDIwNTY0IHRwPTEyNjUwIG9wPTBcbiAgICAvLyAgIHN0PTE0NzgwOTUyMDAgcmI9MTAwNzkyMTMgcnA9MTk5NjIgdGI9MjQ4NzcwNSB0cD0yMDAxNSBvcD0wXG4gICAgLy8gICBzdD0xNDc4MDk4ODAwIHJiPTQ0NDQ0MzMgcnA9MTAyMjcgdGI9MTQzMDM1NiB0cD0xMDQ5MyBvcD0wXG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICBsZXQgZnJvbVh0c3RhdHMgPSBkYXRhLmluZGV4T2YoJ1h0IHN0YXRzOicpO1xuXG4gICAgbGV0IHN0YXJ0ID0gZGF0YS5pbmRleE9mKCdQZW5kaW5nIGJ5dGVzOicsIGZyb21YdHN0YXRzKTtcbiAgICBsZXQgZGVsaW1pdGVyID0gZGF0YS5pbmRleE9mKCc6Jywgc3RhcnQgKyAxKTtcbiAgICBsZXQgZW5kID0gZGF0YS5pbmRleE9mKCdcXG4nLCBkZWxpbWl0ZXIgKyAxKTtcbiAgICBsZXQgcGVuZGluZ0J5dGVzID0gZGF0YS5zdWJzdHJpbmcoZGVsaW1pdGVyICsgMSwgZW5kKS50cmltKCk7XG5cbiAgICBpZiAoZW5kID4gZGVsaW1pdGVyKSB7XG4gICAgICBzdGFydCA9IGRhdGEuaW5kZXhPZignYnVja2V0RHVyYXRpb24nLCBlbmQgKyAxKTtcbiAgICAgIGRlbGltaXRlciA9IGRhdGEuaW5kZXhPZignPScsIHN0YXJ0ICsgMSk7XG4gICAgICBlbmQgPSBkYXRhLmluZGV4T2YoJ1xcbicsIGRlbGltaXRlciArIDEpO1xuICAgICAgYnVja2V0RHVyYXRpb24gPSBkYXRhLnN1YnN0cmluZyhkZWxpbWl0ZXIgKyAxLCBlbmQpLnRyaW0oKTtcbiAgICB9XG5cbiAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgZGF0YSA9IGRhdGEuc3Vic3RyaW5nKGVuZCArIDEsIGRhdGEubGVuZ3RoKTtcbiAgICAgIGxldCBhcnJheUxpc3QgPSBkYXRhLnNwbGl0KCdcXG4nKTtcblxuICAgICAgaWYgKGFycmF5TGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHN0YXJ0ID0gLTE7XG5cbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBORVRXT1JLX0tFWVMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICBzdGFydCA9IGFycmF5TGlzdFswXS5pbmRleE9mKE5FVFdPUktfS0VZU1tqXVswXSk7XG5cbiAgICAgICAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgaW5kZXggPSBqO1xuICAgICAgICAgICAgcmV0dXJuVmFsdWVbMF0gPSBbXTtcblxuICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBORVRXT1JLX0tFWVNbal0ubGVuZ3RoOyArK2spIHtcbiAgICAgICAgICAgICAgcmV0dXJuVmFsdWVbMF1ba10gPSBORVRXT1JLX0tFWVNbal1ba107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmV0dXJuSW5kZXggPSAxO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5TGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGRhdGEgPSBhcnJheUxpc3RbaV07XG4gICAgICAgICAgc3RhcnQgPSBkYXRhLmluZGV4T2YoTkVUV09SS19LRVlTW2luZGV4XVswXSk7XG5cbiAgICAgICAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgZGVsaW1pdGVyID0gZGF0YS5pbmRleE9mKCc9Jywgc3RhcnQgKyAxKTtcbiAgICAgICAgICAgIGVuZCA9IGRhdGEuaW5kZXhPZignICcsIGRlbGltaXRlciArIDEpO1xuICAgICAgICAgICAgYnVja2V0U3RhcnQgPSBkYXRhLnN1YnN0cmluZyhkZWxpbWl0ZXIgKyAxLCBlbmQpLnRyaW0oKTtcblxuICAgICAgICAgICAgaWYgKGVuZCA+IGRlbGltaXRlcikge1xuICAgICAgICAgICAgICBzdGFydCA9IGRhdGEuaW5kZXhPZihORVRXT1JLX0tFWVNbaW5kZXhdWzFdLCBlbmQgKyAxKTtcbiAgICAgICAgICAgICAgaWYgKHN0YXJ0ID49IDApIHtcbiAgICAgICAgICAgICAgICBkZWxpbWl0ZXIgPSBkYXRhLmluZGV4T2YoJz0nLCBzdGFydCArIDEpO1xuICAgICAgICAgICAgICAgIGVuZCA9IGRhdGEuaW5kZXhPZignICcsIGRlbGltaXRlciArIDEpO1xuICAgICAgICAgICAgICAgIGFjdGl2ZVRpbWUgPSBkYXRhLnN1YnN0cmluZyhkZWxpbWl0ZXIgKyAxLCBlbmQpLnRyaW0oKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZW5kID4gZGVsaW1pdGVyKSB7XG4gICAgICAgICAgICAgIHN0YXJ0ID0gZGF0YS5pbmRleE9mKE5FVFdPUktfS0VZU1tpbmRleF1bMl0sIGVuZCArIDEpO1xuICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgICAgIGRlbGltaXRlciA9IGRhdGEuaW5kZXhPZignPScsIHN0YXJ0ICsgMSk7XG4gICAgICAgICAgICAgICAgZW5kID0gZGF0YS5pbmRleE9mKCcgJywgZGVsaW1pdGVyICsgMSk7XG4gICAgICAgICAgICAgICAgcnhCeXRlcyA9IGRhdGEuc3Vic3RyaW5nKGRlbGltaXRlciArIDEsIGVuZCkudHJpbSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbmQgPiBkZWxpbWl0ZXIpIHtcbiAgICAgICAgICAgICAgc3RhcnQgPSBkYXRhLmluZGV4T2YoTkVUV09SS19LRVlTW2luZGV4XVszXSwgZW5kICsgMSk7XG4gICAgICAgICAgICAgIGlmIChzdGFydCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgZGVsaW1pdGVyID0gZGF0YS5pbmRleE9mKCc9Jywgc3RhcnQgKyAxKTtcbiAgICAgICAgICAgICAgICBlbmQgPSBkYXRhLmluZGV4T2YoJyAnLCBkZWxpbWl0ZXIgKyAxKTtcbiAgICAgICAgICAgICAgICByeFBhY2tldHMgPSBkYXRhLnN1YnN0cmluZyhkZWxpbWl0ZXIgKyAxLCBlbmQpLnRyaW0oKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZW5kID4gZGVsaW1pdGVyKSB7XG4gICAgICAgICAgICAgIHN0YXJ0ID0gZGF0YS5pbmRleE9mKE5FVFdPUktfS0VZU1tpbmRleF1bNF0sIGVuZCArIDEpO1xuICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgICAgIGRlbGltaXRlciA9IGRhdGEuaW5kZXhPZignPScsIHN0YXJ0ICsgMSk7XG4gICAgICAgICAgICAgICAgZW5kID0gZGF0YS5pbmRleE9mKCcgJywgZGVsaW1pdGVyICsgMSk7XG4gICAgICAgICAgICAgICAgdHhCeXRlcyA9IGRhdGEuc3Vic3RyaW5nKGRlbGltaXRlciArIDEsIGVuZCkudHJpbSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbmQgPiBkZWxpbWl0ZXIpIHtcbiAgICAgICAgICAgICAgc3RhcnQgPSBkYXRhLmluZGV4T2YoTkVUV09SS19LRVlTW2luZGV4XVs1XSwgZW5kICsgMSk7XG4gICAgICAgICAgICAgIGlmIChzdGFydCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgZGVsaW1pdGVyID0gZGF0YS5pbmRleE9mKCc9Jywgc3RhcnQgKyAxKTtcbiAgICAgICAgICAgICAgICBlbmQgPSBkYXRhLmluZGV4T2YoJyAnLCBkZWxpbWl0ZXIgKyAxKTtcbiAgICAgICAgICAgICAgICB0eFBhY2tldHMgPSBkYXRhLnN1YnN0cmluZyhkZWxpbWl0ZXIgKyAxLCBlbmQpLnRyaW0oKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZW5kID4gZGVsaW1pdGVyKSB7XG4gICAgICAgICAgICAgIHN0YXJ0ID0gZGF0YS5pbmRleE9mKE5FVFdPUktfS0VZU1tpbmRleF1bNl0sIGVuZCArIDEpO1xuICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgICAgIGRlbGltaXRlciA9IGRhdGEuaW5kZXhPZignPScsIHN0YXJ0ICsgMSk7XG4gICAgICAgICAgICAgICAgZW5kID0gZGF0YS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9ucyA9IGRhdGEuc3Vic3RyaW5nKGRlbGltaXRlciArIDEsIGVuZCkudHJpbSgpO1xuXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVyblZhbHVlW3JldHVybkluZGV4KytdID0gW2J1Y2tldFN0YXJ0LCBhY3RpdmVUaW1lLCByeEJ5dGVzLCByeFBhY2tldHMsIHR4Qnl0ZXMsIHR4UGFja2V0cywgb3BlcmF0aW9ucywgYnVja2V0RHVyYXRpb25dO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghXy5pc0VxdWFsKHBlbmRpbmdCeXRlcywgJycpICYmICFfLmlzVW5kZWZpbmVkKHBlbmRpbmdCeXRlcykgJiYgIV8uaXNFcXVhbChwZW5kaW5nQnl0ZXMsICdub2RleCcpKSB7XG4gICAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHBhcnNlIG5ldHdvcmsgdHJhZmZpYyBkYXRhOiAnJHtkYXRhfSdgKTtcbiAgICB9XG4gIH0pO1xufTtcblxuT2JqZWN0LmFzc2lnbihleHRlbnNpb25zLCBjb21tYW5kcywgaGVscGVycyk7XG5leHBvcnQge1xuICBjb21tYW5kcywgaGVscGVycywgU1VQUE9SVEVEX1BFUkZPUk1BTkNFX0RBVEFfVFlQRVMsIENQVV9LRVlTLCBNRU1PUllfS0VZUyxcbiAgQkFUVEVSWV9LRVlTLCBORVRXT1JLX0tFWVMsXG59O1xuZXhwb3J0IGRlZmF1bHQgZXh0ZW5zaW9ucztcblxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFFQSxNQUFNQSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0VBQUVDLE9BQU8sR0FBRyxDQUFDLENBQUM7RUFBRUMsVUFBVSxHQUFHLENBQUMsQ0FBQztBQUFDO0FBQUE7QUFFbkQsTUFBTUMsWUFBWSxHQUFHLENBQ25CLENBQUMsYUFBYSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixDQUFDLEVBQzdHLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixDQUFDLENBQ3JFO0FBQUM7QUFDRixNQUFNQyxRQUFRLEdBQUcsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDO0FBQUM7QUFDcEMsTUFBTUMsWUFBWSxHQUFHLENBQUMsT0FBTyxDQUFDO0FBQUM7QUFDL0IsTUFBTUMsV0FBVyxHQUFHLENBQ2xCLG1CQUFtQixFQUFFLG9CQUFvQixFQUFFLG9CQUFvQixFQUMvRCxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFDbkMsVUFBVSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFDdkQseUJBQXlCLEVBQUUsZ0JBQWdCLEVBQzNDLFdBQVcsRUFBRSxXQUFXLEVBQUUsVUFBVSxDQUNyQztBQUFDO0FBQ0YsTUFBTUMsZ0NBQWdDLEdBQUdDLE1BQU0sQ0FBQ0MsTUFBTSxDQUFDO0VBQ3JEQyxPQUFPLEVBQUUsZ0hBQWdIO0VBQ3pIQyxVQUFVLEVBQUUsK0dBQStHO0VBQzNIQyxXQUFXLEVBQUUseUdBQXlHO0VBQ3RIQyxXQUFXLEVBQUU7QUFDZixDQUFDLENBQUM7QUFBQztBQUNILE1BQU1DLGNBQWMsR0FBR04sTUFBTSxDQUFDQyxNQUFNLENBQUM7RUFDbkNNLE1BQU0sRUFBRSxRQUFRO0VBQ2hCQyxNQUFNLEVBQUUsUUFBUTtFQUNoQkMsR0FBRyxFQUFFLEtBQUs7RUFDVkMsRUFBRSxFQUFFLElBQUk7RUFDUkMsTUFBTSxFQUFFLFFBQVE7RUFDaEJDLEtBQUssRUFBRSxPQUFPO0VBQ2RDLElBQUksRUFBRTtBQUNSLENBQUMsQ0FBQztBQUNGLE1BQU1DLGNBQWMsR0FBRyxJQUFJOztBQVEzQixTQUFTQyx3QkFBd0IsQ0FBRUMsT0FBTyxFQUFFQyxPQUFPLEVBQUU7RUFDbkQsTUFBTSxDQUFDQyxJQUFJLEVBQUVDLE9BQU8sQ0FBQyxHQUFHSCxPQUFPO0VBQy9CLElBQUlFLElBQUksS0FBS1osY0FBYyxDQUFDQyxNQUFNLElBQUlZLE9BQU8sS0FBS2IsY0FBYyxDQUFDTyxJQUFJLEVBQUU7SUFDckUsSUFBSUksT0FBTyxDQUFDRyxTQUFTLEVBQUVILE9BQU8sQ0FBQ0ksa0JBQWtCLElBQUlKLE9BQU8sQ0FBQ0ssY0FBYyxFQUFFTCxPQUFPLENBQUNNLHVCQUF1QixDQUFDLEdBQUdQLE9BQU87RUFDekgsQ0FBQyxNQUFNLElBQUlFLElBQUksS0FBS1osY0FBYyxDQUFDRSxNQUFNLElBQUlXLE9BQU8sS0FBS2IsY0FBYyxDQUFDTyxJQUFJLEVBQUU7SUFDNUUsSUFBSUksT0FBTyxDQUFDTyxTQUFTLEVBQUVQLE9BQU8sQ0FBQ1Esa0JBQWtCLENBQUMsR0FBR1QsT0FBTztFQUM5RCxDQUFDLE1BQU0sSUFBSUUsSUFBSSxLQUFLWixjQUFjLENBQUNHLEdBQUcsSUFBSVUsT0FBTyxLQUFLYixjQUFjLENBQUNLLE1BQU0sRUFBRTtJQUMzRSxJQUFJTSxPQUFPLENBQUNTLE1BQU0sRUFBRVQsT0FBTyxDQUFDVSxlQUFlLENBQUMsR0FBR1gsT0FBTztFQUN4RCxDQUFDLE1BQU0sSUFBSUUsSUFBSSxLQUFLWixjQUFjLENBQUNJLEVBQUUsSUFBSVMsT0FBTyxLQUFLYixjQUFjLENBQUNLLE1BQU0sRUFBRTtJQUMxRSxJQUFJTSxPQUFPLENBQUNXLEtBQUssRUFBRVgsT0FBTyxDQUFDWSxjQUFjLENBQUMsR0FBR2IsT0FBTztFQUN0RCxDQUFDLE1BQU0sSUFBSUUsSUFBSSxLQUFLWixjQUFjLENBQUNNLEtBQUssSUFBSUksT0FBTyxDQUFDYyxNQUFNLEtBQUssQ0FBQyxFQUFFO0lBRWhFLEdBQUdiLE9BQU8sQ0FBQ2MsUUFBUSxFQUFFZCxPQUFPLENBQUNlLGlCQUFpQixDQUFDLEdBQUdoQixPQUFPO0VBQzNEO0FBQ0Y7O0FBTUEsU0FBU2lCLHlCQUF5QixDQUFFakIsT0FBTyxFQUFFQyxPQUFPLEVBQUU7RUFDcEQsTUFBTUMsSUFBSSxHQUFHRixPQUFPLENBQUMsQ0FBQyxDQUFDO0VBQ3ZCLElBQUlFLElBQUksS0FBS1osY0FBYyxDQUFDQyxNQUFNLEVBQUU7SUFDbEMsR0FBR1UsT0FBTyxDQUFDRyxTQUFTLEdBQUdILE9BQU8sQ0FBQ0ksa0JBQWtCLEVBQUVKLE9BQU8sQ0FBQ0ssY0FBYyxFQUFFTCxPQUFPLENBQUNNLHVCQUF1QixDQUFDLEdBQUdQLE9BQU87RUFDdkgsQ0FBQyxNQUFNLElBQUlFLElBQUksS0FBS1osY0FBYyxDQUFDRSxNQUFNLEVBQUU7SUFDekMsR0FBR1MsT0FBTyxDQUFDTyxTQUFTLEdBQUdQLE9BQU8sQ0FBQ1Esa0JBQWtCLENBQUMsR0FBR1QsT0FBTztFQUM5RCxDQUFDLE1BQU0sSUFBSUUsSUFBSSxLQUFLWixjQUFjLENBQUNHLEdBQUcsRUFBRTtJQUN0QyxHQUFHUSxPQUFPLENBQUNTLE1BQU0sR0FBR1QsT0FBTyxDQUFDVSxlQUFlLENBQUMsR0FBR1gsT0FBTztFQUN4RCxDQUFDLE1BQU0sSUFBSUUsSUFBSSxLQUFLWixjQUFjLENBQUNJLEVBQUUsRUFBRTtJQUNyQyxHQUFHTyxPQUFPLENBQUNXLEtBQUssR0FBR1gsT0FBTyxDQUFDWSxjQUFjLENBQUMsR0FBR2IsT0FBTztFQUN0RCxDQUFDLE1BQU0sSUFBSUUsSUFBSSxLQUFLWixjQUFjLENBQUNNLEtBQUssRUFBRTtJQUN4QyxHQUFHSyxPQUFPLENBQUNjLFFBQVEsR0FBR2QsT0FBTyxDQUFDZSxpQkFBaUIsQ0FBQyxHQUFHaEIsT0FBTztFQUM1RDtBQUNGOztBQU9BLFNBQVNrQix5QkFBeUIsQ0FBRWxCLE9BQU8sRUFBRUMsT0FBTyxFQUFFO0VBQ3BELE1BQU0sQ0FBQ0MsSUFBSSxFQUFFQyxPQUFPLENBQUMsR0FBR0gsT0FBTztFQUMvQixJQUFJRSxJQUFJLEtBQUtaLGNBQWMsQ0FBQ0MsTUFBTSxJQUFJWSxPQUFPLEtBQUtiLGNBQWMsQ0FBQ08sSUFBSSxFQUFFO0lBQ3JFLElBQUlJLE9BQU8sQ0FBQ0csU0FBUyxFQUFFSCxPQUFPLENBQUNJLGtCQUFrQixJQUFJSixPQUFPLENBQUNrQixTQUFTLEVBQUVsQixPQUFPLENBQUNLLGNBQWMsRUFBRUwsT0FBTyxDQUFDTSx1QkFBdUIsQ0FBQyxHQUFHUCxPQUFPO0VBQzVJLENBQUMsTUFBTSxJQUFJRSxJQUFJLEtBQUtaLGNBQWMsQ0FBQ0UsTUFBTSxJQUFJVyxPQUFPLEtBQUtiLGNBQWMsQ0FBQ08sSUFBSSxFQUFFO0lBQzVFLElBQUlJLE9BQU8sQ0FBQ08sU0FBUyxFQUFFUCxPQUFPLENBQUNRLGtCQUFrQixJQUFJUixPQUFPLENBQUNtQixTQUFTLENBQUMsR0FBR3BCLE9BQU87RUFDbkYsQ0FBQyxNQUFNLElBQUlFLElBQUksS0FBS1osY0FBYyxDQUFDRyxHQUFHLElBQUlVLE9BQU8sS0FBS2IsY0FBYyxDQUFDSyxNQUFNLEVBQUU7SUFDM0UsSUFBSU0sT0FBTyxDQUFDUyxNQUFNLEVBQUVULE9BQU8sQ0FBQ1UsZUFBZSxDQUFDLEdBQUdYLE9BQU87RUFDeEQsQ0FBQyxNQUFNLElBQUlFLElBQUksS0FBS1osY0FBYyxDQUFDSSxFQUFFLElBQUlTLE9BQU8sS0FBS2IsY0FBYyxDQUFDSyxNQUFNLEVBQUU7SUFDMUUsSUFBSU0sT0FBTyxDQUFDVyxLQUFLLEVBQUVYLE9BQU8sQ0FBQ1ksY0FBYyxDQUFDLEdBQUdiLE9BQU87RUFDdEQsQ0FBQyxNQUFNLElBQUlFLElBQUksS0FBS1osY0FBYyxDQUFDTSxLQUFLLElBQUlJLE9BQU8sQ0FBQ2MsTUFBTSxLQUFLLENBQUMsRUFBRTtJQUVoRSxHQUFHYixPQUFPLENBQUNjLFFBQVEsRUFBRWQsT0FBTyxDQUFDZSxpQkFBaUIsSUFBSWYsT0FBTyxDQUFDb0IsUUFBUSxDQUFDLEdBQUdyQixPQUFPO0VBQy9FO0FBQ0Y7O0FBT0F4QixRQUFRLENBQUM4Qyx1QkFBdUIsR0FBRyxTQUFTQSx1QkFBdUIsR0FBSTtFQUNyRSxPQUFPQyxlQUFDLENBQUNDLElBQUksQ0FBQ3pDLGdDQUFnQyxDQUFDO0FBQ2pELENBQUM7O0FBbUJEUCxRQUFRLENBQUNpRCxrQkFBa0IsR0FBRyxlQUFlQSxrQkFBa0IsQ0FBRUMsV0FBVyxFQUFFQyxRQUFRLEVBQUVDLE9BQU8sR0FBRyxDQUFDLEVBQUU7RUFDbkcsUUFBUUwsZUFBQyxDQUFDTSxPQUFPLENBQUNGLFFBQVEsQ0FBQztJQUN6QixLQUFLLGFBQWE7TUFDaEIsT0FBTyxNQUFNLElBQUksQ0FBQ0csY0FBYyxDQUFDRixPQUFPLENBQUM7SUFDM0MsS0FBSyxTQUFTO01BQ1osT0FBTyxNQUFNLElBQUksQ0FBQ0csVUFBVSxDQUFDTCxXQUFXLEVBQUVFLE9BQU8sQ0FBQztJQUNwRCxLQUFLLFlBQVk7TUFDZixPQUFPLE1BQU0sSUFBSSxDQUFDSSxhQUFhLENBQUNOLFdBQVcsRUFBRUUsT0FBTyxDQUFDO0lBQ3ZELEtBQUssYUFBYTtNQUNoQixPQUFPLE1BQU0sSUFBSSxDQUFDSyxxQkFBcUIsQ0FBQ0wsT0FBTyxDQUFDO0lBQ2xEO01BQ0UsTUFBTSxJQUFJTSxLQUFLLENBQUUsZ0NBQStCUCxRQUFTLFdBQVUsR0FDaEUsNENBQTJDUSxJQUFJLENBQUNDLFNBQVMsQ0FBQ3JELGdDQUFnQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUUsRUFBQyxDQUFDO0VBQUM7QUFFaEgsQ0FBQztBQUVETixPQUFPLENBQUNzRCxVQUFVLEdBQUcsZUFBZUEsVUFBVSxDQUFFTCxXQUFXLEVBQUVFLE9BQU8sR0FBRyxDQUFDLEVBQUU7RUFNeEUsT0FBTyxNQUFNLElBQUFTLHVCQUFhLEVBQUNULE9BQU8sRUFBRTlCLGNBQWMsRUFBRSxZQUFZO0lBQzlELElBQUl3QyxNQUFNO0lBQ1YsSUFBSTtNQUNGQSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUNDLEdBQUcsQ0FBQ0MsS0FBSyxDQUFDLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3ZELENBQUMsQ0FBQyxPQUFPQyxDQUFDLEVBQUU7TUFDVixJQUFJQSxDQUFDLENBQUNDLE1BQU0sRUFBRTtRQUNaLElBQUksQ0FBQ0MsR0FBRyxDQUFDQyxJQUFJLENBQUNILENBQUMsQ0FBQ0MsTUFBTSxDQUFDO01BQ3pCO01BQ0EsTUFBTUQsQ0FBQztJQUNUO0lBR0EsTUFBTUksYUFBYSxHQUNqQixJQUFJQyxNQUFNLENBQUUsU0FBUXZCLGVBQUMsQ0FBQ3dCLFlBQVksQ0FBQ3JCLFdBQVcsQ0FBRSx3REFBdUQsRUFBRSxHQUFHLENBQUM7SUFDL0csTUFBTXNCLEtBQUssR0FBR0gsYUFBYSxDQUFDSSxJQUFJLENBQUNYLE1BQU0sQ0FBQztJQUN4QyxJQUFJLENBQUNVLEtBQUssRUFBRTtNQUNWLElBQUksQ0FBQ0wsR0FBRyxDQUFDTyxLQUFLLENBQUNaLE1BQU0sQ0FBQztNQUN0QixNQUFNLElBQUlKLEtBQUssQ0FBRSx1Q0FBc0NSLFdBQVksMENBQXlDLENBQUM7SUFDL0c7SUFDQSxPQUFPLENBQUM5QyxRQUFRLEVBQUUsQ0FBQ29FLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRUEsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDekMsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVEdkUsT0FBTyxDQUFDcUQsY0FBYyxHQUFHLGVBQWVBLGNBQWMsQ0FBRUYsT0FBTyxHQUFHLENBQUMsRUFBRTtFQUNuRSxPQUFPLE1BQU0sSUFBQVMsdUJBQWEsRUFBQ1QsT0FBTyxFQUFFOUIsY0FBYyxFQUFFLFlBQVk7SUFDOUQsSUFBSXFELEdBQUcsR0FBRyxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUM7SUFDdEQsSUFBSUMsSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDYixHQUFHLENBQUNDLEtBQUssQ0FBQ1csR0FBRyxDQUFDO0lBQ3BDLElBQUksQ0FBQ0MsSUFBSSxFQUFFLE1BQU0sSUFBSWxCLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQzs7SUFFbEQsSUFBSW1CLEtBQUssR0FBR0MsUUFBUSxDQUFDLENBQUNGLElBQUksQ0FBQ0csS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBRTNELElBQUksQ0FBQ0MsTUFBTSxDQUFDQyxLQUFLLENBQUNMLEtBQUssQ0FBQyxFQUFFO01BQ3hCLE9BQU8sQ0FBQzlCLGVBQUMsQ0FBQ29DLEtBQUssQ0FBQzlFLFlBQVksQ0FBQyxFQUFFLENBQUN3RSxLQUFLLENBQUNPLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDcEQsQ0FBQyxNQUFNO01BQ0wsTUFBTSxJQUFJMUIsS0FBSyxDQUFFLGtDQUFpQ2tCLElBQUssR0FBRSxDQUFDO0lBQzVEO0VBQ0YsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVEM0UsT0FBTyxDQUFDdUQsYUFBYSxHQUFHLGVBQWVBLGFBQWEsQ0FBRU4sV0FBVyxFQUFFRSxPQUFPLEdBQUcsQ0FBQyxFQUFFO0VBQzlFLE9BQU8sTUFBTSxJQUFBUyx1QkFBYSxFQUFDVCxPQUFPLEVBQUU5QixjQUFjLEVBQUUsWUFBWTtJQUM5RCxNQUFNcUQsR0FBRyxHQUFHLENBQ1YsU0FBUyxFQUFFLFNBQVMsRUFBRyxJQUFHekIsV0FBWSxHQUFFLEVBQ3hDLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUNoQixJQUFHcEMsY0FBYyxDQUFDQyxNQUFPLElBQUdELGNBQWMsQ0FBQ0UsTUFBTyxJQUFHRixjQUFjLENBQUNHLEdBQUksRUFBQyxHQUN6RSxJQUFHSCxjQUFjLENBQUNJLEVBQUcsSUFBR0osY0FBYyxDQUFDTSxLQUFNLEdBQUUsQ0FDakQ7SUFDRCxNQUFNd0QsSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDYixHQUFHLENBQUNDLEtBQUssQ0FBQ1csR0FBRyxDQUFDO0lBQ3RDLElBQUksQ0FBQ0MsSUFBSSxFQUFFO01BQ1QsTUFBTSxJQUFJbEIsS0FBSyxDQUFDLHNCQUFzQixDQUFDO0lBQ3pDO0lBQ0EsTUFBTWpDLE9BQU8sR0FBRztNQUFDZSxpQkFBaUIsRUFBRTtJQUFFLENBQUM7SUFDdkMsTUFBTTZDLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQ3RCLEdBQUcsQ0FBQ3VCLFdBQVcsRUFBRTtJQUM3QyxLQUFLLE1BQU1DLElBQUksSUFBSVgsSUFBSSxDQUFDRyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUU7TUFDbkMsTUFBTXZELE9BQU8sR0FBRytELElBQUksQ0FBQ1AsSUFBSSxFQUFFLENBQUNELEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQ1MsTUFBTSxDQUFDQyxPQUFPLENBQUM7TUFDeEQsSUFBSUosUUFBUSxJQUFJLEVBQUUsRUFBRTtRQUNsQjNDLHlCQUF5QixDQUFDbEIsT0FBTyxFQUFFQyxPQUFPLENBQUM7TUFDN0MsQ0FBQyxNQUFNLElBQUk0RCxRQUFRLEdBQUcsRUFBRSxJQUFJQSxRQUFRLEdBQUcsRUFBRSxFQUFFO1FBQ3pDOUQsd0JBQXdCLENBQUNDLE9BQU8sRUFBRUMsT0FBTyxDQUFDO01BQzVDLENBQUMsTUFBTTtRQUNMZ0IseUJBQXlCLENBQUNqQixPQUFPLEVBQUVDLE9BQU8sQ0FBQztNQUM3QztJQUNGO0lBQ0EsSUFBSUEsT0FBTyxDQUFDZSxpQkFBaUIsSUFBSWYsT0FBTyxDQUFDZSxpQkFBaUIsS0FBSyxPQUFPLEVBQUU7TUFDdEUsTUFBTWtELE9BQU8sR0FBRzNDLGVBQUMsQ0FBQ29DLEtBQUssQ0FBQzdFLFdBQVcsQ0FBQztNQUNwQyxNQUFNcUYsTUFBTSxHQUFHRCxPQUFPLENBQUNFLEdBQUcsQ0FBRUMsTUFBTSxJQUFLcEUsT0FBTyxDQUFDb0UsTUFBTSxDQUFDLENBQUM7TUFDdkQsT0FBTyxDQUFDSCxPQUFPLEVBQUVDLE1BQU0sQ0FBQztJQUMxQjtJQUVBLE1BQU0sSUFBSWpDLEtBQUssQ0FBRSxpQ0FBZ0NrQixJQUFLLEdBQUUsQ0FBQztFQUMzRCxDQUFDLENBQUM7QUFDSixDQUFDO0FBRUQzRSxPQUFPLENBQUN3RCxxQkFBcUIsR0FBRyxlQUFlQSxxQkFBcUIsQ0FBRUwsT0FBTyxHQUFHLENBQUMsRUFBRTtFQUNqRixPQUFPLE1BQU0sSUFBQVMsdUJBQWEsRUFBQ1QsT0FBTyxFQUFFOUIsY0FBYyxFQUFFLFlBQVk7SUFDOUQsSUFBSXdFLFdBQVcsR0FBRyxFQUFFO0lBQ3BCLElBQUlDLGNBQWMsRUFBRUMsV0FBVyxFQUFFQyxVQUFVLEVBQUVDLE9BQU8sRUFBRUMsU0FBUyxFQUFFQyxPQUFPLEVBQUVDLFNBQVMsRUFBRUMsVUFBVTtJQUUvRixJQUFJM0IsR0FBRyxHQUFHLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQztJQUNqQyxJQUFJQyxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUNiLEdBQUcsQ0FBQ0MsS0FBSyxDQUFDVyxHQUFHLENBQUM7SUFDcEMsSUFBSSxDQUFDQyxJQUFJLEVBQUUsTUFBTSxJQUFJbEIsS0FBSyxDQUFDLHNCQUFzQixDQUFDOztJQWdDbEQsSUFBSTZDLEtBQUssR0FBRyxDQUFDO0lBQ2IsSUFBSUMsV0FBVyxHQUFHNUIsSUFBSSxDQUFDNkIsT0FBTyxDQUFDLFdBQVcsQ0FBQztJQUUzQyxJQUFJQyxLQUFLLEdBQUc5QixJQUFJLENBQUM2QixPQUFPLENBQUMsZ0JBQWdCLEVBQUVELFdBQVcsQ0FBQztJQUN2RCxJQUFJRyxTQUFTLEdBQUcvQixJQUFJLENBQUM2QixPQUFPLENBQUMsR0FBRyxFQUFFQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQzVDLElBQUlFLEdBQUcsR0FBR2hDLElBQUksQ0FBQzZCLE9BQU8sQ0FBQyxJQUFJLEVBQUVFLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFDM0MsSUFBSUUsWUFBWSxHQUFHakMsSUFBSSxDQUFDa0MsU0FBUyxDQUFDSCxTQUFTLEdBQUcsQ0FBQyxFQUFFQyxHQUFHLENBQUMsQ0FBQzVCLElBQUksRUFBRTtJQUU1RCxJQUFJNEIsR0FBRyxHQUFHRCxTQUFTLEVBQUU7TUFDbkJELEtBQUssR0FBRzlCLElBQUksQ0FBQzZCLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRUcsR0FBRyxHQUFHLENBQUMsQ0FBQztNQUMvQ0QsU0FBUyxHQUFHL0IsSUFBSSxDQUFDNkIsT0FBTyxDQUFDLEdBQUcsRUFBRUMsS0FBSyxHQUFHLENBQUMsQ0FBQztNQUN4Q0UsR0FBRyxHQUFHaEMsSUFBSSxDQUFDNkIsT0FBTyxDQUFDLElBQUksRUFBRUUsU0FBUyxHQUFHLENBQUMsQ0FBQztNQUN2Q1osY0FBYyxHQUFHbkIsSUFBSSxDQUFDa0MsU0FBUyxDQUFDSCxTQUFTLEdBQUcsQ0FBQyxFQUFFQyxHQUFHLENBQUMsQ0FBQzVCLElBQUksRUFBRTtJQUM1RDtJQUVBLElBQUkwQixLQUFLLElBQUksQ0FBQyxFQUFFO01BQ2Q5QixJQUFJLEdBQUdBLElBQUksQ0FBQ2tDLFNBQVMsQ0FBQ0YsR0FBRyxHQUFHLENBQUMsRUFBRWhDLElBQUksQ0FBQ3RDLE1BQU0sQ0FBQztNQUMzQyxJQUFJeUUsU0FBUyxHQUFHbkMsSUFBSSxDQUFDRyxLQUFLLENBQUMsSUFBSSxDQUFDO01BRWhDLElBQUlnQyxTQUFTLENBQUN6RSxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQ3hCb0UsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUVWLEtBQUssSUFBSU0sQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHN0csWUFBWSxDQUFDbUMsTUFBTSxFQUFFLEVBQUUwRSxDQUFDLEVBQUU7VUFDNUNOLEtBQUssR0FBR0ssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDTixPQUFPLENBQUN0RyxZQUFZLENBQUM2RyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztVQUVoRCxJQUFJTixLQUFLLElBQUksQ0FBQyxFQUFFO1lBQ2RILEtBQUssR0FBR1MsQ0FBQztZQUNUbEIsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUU7WUFFbkIsS0FBSyxJQUFJbUIsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHOUcsWUFBWSxDQUFDNkcsQ0FBQyxDQUFDLENBQUMxRSxNQUFNLEVBQUUsRUFBRTJFLENBQUMsRUFBRTtjQUMvQ25CLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQ21CLENBQUMsQ0FBQyxHQUFHOUcsWUFBWSxDQUFDNkcsQ0FBQyxDQUFDLENBQUNDLENBQUMsQ0FBQztZQUN4QztZQUNBO1VBQ0Y7UUFDRjtRQUVBLElBQUlDLFdBQVcsR0FBRyxDQUFDO1FBQ25CLEtBQUssSUFBSUMsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHSixTQUFTLENBQUN6RSxNQUFNLEVBQUU2RSxDQUFDLEVBQUUsRUFBRTtVQUN6Q3ZDLElBQUksR0FBR21DLFNBQVMsQ0FBQ0ksQ0FBQyxDQUFDO1VBQ25CVCxLQUFLLEdBQUc5QixJQUFJLENBQUM2QixPQUFPLENBQUN0RyxZQUFZLENBQUNvRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztVQUU1QyxJQUFJRyxLQUFLLElBQUksQ0FBQyxFQUFFO1lBQ2RDLFNBQVMsR0FBRy9CLElBQUksQ0FBQzZCLE9BQU8sQ0FBQyxHQUFHLEVBQUVDLEtBQUssR0FBRyxDQUFDLENBQUM7WUFDeENFLEdBQUcsR0FBR2hDLElBQUksQ0FBQzZCLE9BQU8sQ0FBQyxHQUFHLEVBQUVFLFNBQVMsR0FBRyxDQUFDLENBQUM7WUFDdENYLFdBQVcsR0FBR3BCLElBQUksQ0FBQ2tDLFNBQVMsQ0FBQ0gsU0FBUyxHQUFHLENBQUMsRUFBRUMsR0FBRyxDQUFDLENBQUM1QixJQUFJLEVBQUU7WUFFdkQsSUFBSTRCLEdBQUcsR0FBR0QsU0FBUyxFQUFFO2NBQ25CRCxLQUFLLEdBQUc5QixJQUFJLENBQUM2QixPQUFPLENBQUN0RyxZQUFZLENBQUNvRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRUssR0FBRyxHQUFHLENBQUMsQ0FBQztjQUNyRCxJQUFJRixLQUFLLElBQUksQ0FBQyxFQUFFO2dCQUNkQyxTQUFTLEdBQUcvQixJQUFJLENBQUM2QixPQUFPLENBQUMsR0FBRyxFQUFFQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO2dCQUN4Q0UsR0FBRyxHQUFHaEMsSUFBSSxDQUFDNkIsT0FBTyxDQUFDLEdBQUcsRUFBRUUsU0FBUyxHQUFHLENBQUMsQ0FBQztnQkFDdENWLFVBQVUsR0FBR3JCLElBQUksQ0FBQ2tDLFNBQVMsQ0FBQ0gsU0FBUyxHQUFHLENBQUMsRUFBRUMsR0FBRyxDQUFDLENBQUM1QixJQUFJLEVBQUU7Y0FDeEQ7WUFDRjtZQUVBLElBQUk0QixHQUFHLEdBQUdELFNBQVMsRUFBRTtjQUNuQkQsS0FBSyxHQUFHOUIsSUFBSSxDQUFDNkIsT0FBTyxDQUFDdEcsWUFBWSxDQUFDb0csS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUVLLEdBQUcsR0FBRyxDQUFDLENBQUM7Y0FDckQsSUFBSUYsS0FBSyxJQUFJLENBQUMsRUFBRTtnQkFDZEMsU0FBUyxHQUFHL0IsSUFBSSxDQUFDNkIsT0FBTyxDQUFDLEdBQUcsRUFBRUMsS0FBSyxHQUFHLENBQUMsQ0FBQztnQkFDeENFLEdBQUcsR0FBR2hDLElBQUksQ0FBQzZCLE9BQU8sQ0FBQyxHQUFHLEVBQUVFLFNBQVMsR0FBRyxDQUFDLENBQUM7Z0JBQ3RDVCxPQUFPLEdBQUd0QixJQUFJLENBQUNrQyxTQUFTLENBQUNILFNBQVMsR0FBRyxDQUFDLEVBQUVDLEdBQUcsQ0FBQyxDQUFDNUIsSUFBSSxFQUFFO2NBQ3JEO1lBQ0Y7WUFFQSxJQUFJNEIsR0FBRyxHQUFHRCxTQUFTLEVBQUU7Y0FDbkJELEtBQUssR0FBRzlCLElBQUksQ0FBQzZCLE9BQU8sQ0FBQ3RHLFlBQVksQ0FBQ29HLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFSyxHQUFHLEdBQUcsQ0FBQyxDQUFDO2NBQ3JELElBQUlGLEtBQUssSUFBSSxDQUFDLEVBQUU7Z0JBQ2RDLFNBQVMsR0FBRy9CLElBQUksQ0FBQzZCLE9BQU8sQ0FBQyxHQUFHLEVBQUVDLEtBQUssR0FBRyxDQUFDLENBQUM7Z0JBQ3hDRSxHQUFHLEdBQUdoQyxJQUFJLENBQUM2QixPQUFPLENBQUMsR0FBRyxFQUFFRSxTQUFTLEdBQUcsQ0FBQyxDQUFDO2dCQUN0Q1IsU0FBUyxHQUFHdkIsSUFBSSxDQUFDa0MsU0FBUyxDQUFDSCxTQUFTLEdBQUcsQ0FBQyxFQUFFQyxHQUFHLENBQUMsQ0FBQzVCLElBQUksRUFBRTtjQUN2RDtZQUNGO1lBRUEsSUFBSTRCLEdBQUcsR0FBR0QsU0FBUyxFQUFFO2NBQ25CRCxLQUFLLEdBQUc5QixJQUFJLENBQUM2QixPQUFPLENBQUN0RyxZQUFZLENBQUNvRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRUssR0FBRyxHQUFHLENBQUMsQ0FBQztjQUNyRCxJQUFJRixLQUFLLElBQUksQ0FBQyxFQUFFO2dCQUNkQyxTQUFTLEdBQUcvQixJQUFJLENBQUM2QixPQUFPLENBQUMsR0FBRyxFQUFFQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO2dCQUN4Q0UsR0FBRyxHQUFHaEMsSUFBSSxDQUFDNkIsT0FBTyxDQUFDLEdBQUcsRUFBRUUsU0FBUyxHQUFHLENBQUMsQ0FBQztnQkFDdENQLE9BQU8sR0FBR3hCLElBQUksQ0FBQ2tDLFNBQVMsQ0FBQ0gsU0FBUyxHQUFHLENBQUMsRUFBRUMsR0FBRyxDQUFDLENBQUM1QixJQUFJLEVBQUU7Y0FDckQ7WUFDRjtZQUVBLElBQUk0QixHQUFHLEdBQUdELFNBQVMsRUFBRTtjQUNuQkQsS0FBSyxHQUFHOUIsSUFBSSxDQUFDNkIsT0FBTyxDQUFDdEcsWUFBWSxDQUFDb0csS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUVLLEdBQUcsR0FBRyxDQUFDLENBQUM7Y0FDckQsSUFBSUYsS0FBSyxJQUFJLENBQUMsRUFBRTtnQkFDZEMsU0FBUyxHQUFHL0IsSUFBSSxDQUFDNkIsT0FBTyxDQUFDLEdBQUcsRUFBRUMsS0FBSyxHQUFHLENBQUMsQ0FBQztnQkFDeENFLEdBQUcsR0FBR2hDLElBQUksQ0FBQzZCLE9BQU8sQ0FBQyxHQUFHLEVBQUVFLFNBQVMsR0FBRyxDQUFDLENBQUM7Z0JBQ3RDTixTQUFTLEdBQUd6QixJQUFJLENBQUNrQyxTQUFTLENBQUNILFNBQVMsR0FBRyxDQUFDLEVBQUVDLEdBQUcsQ0FBQyxDQUFDNUIsSUFBSSxFQUFFO2NBQ3ZEO1lBQ0Y7WUFFQSxJQUFJNEIsR0FBRyxHQUFHRCxTQUFTLEVBQUU7Y0FDbkJELEtBQUssR0FBRzlCLElBQUksQ0FBQzZCLE9BQU8sQ0FBQ3RHLFlBQVksQ0FBQ29HLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFSyxHQUFHLEdBQUcsQ0FBQyxDQUFDO2NBQ3JELElBQUlGLEtBQUssSUFBSSxDQUFDLEVBQUU7Z0JBQ2RDLFNBQVMsR0FBRy9CLElBQUksQ0FBQzZCLE9BQU8sQ0FBQyxHQUFHLEVBQUVDLEtBQUssR0FBRyxDQUFDLENBQUM7Z0JBQ3hDRSxHQUFHLEdBQUdoQyxJQUFJLENBQUN0QyxNQUFNO2dCQUNqQmdFLFVBQVUsR0FBRzFCLElBQUksQ0FBQ2tDLFNBQVMsQ0FBQ0gsU0FBUyxHQUFHLENBQUMsRUFBRUMsR0FBRyxDQUFDLENBQUM1QixJQUFJLEVBQUU7Y0FFeEQ7WUFDRjtZQUNBYyxXQUFXLENBQUNvQixXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUNsQixXQUFXLEVBQUVDLFVBQVUsRUFBRUMsT0FBTyxFQUFFQyxTQUFTLEVBQUVDLE9BQU8sRUFBRUMsU0FBUyxFQUFFQyxVQUFVLEVBQUVQLGNBQWMsQ0FBQztVQUM1SDtRQUNGO01BQ0Y7SUFDRjtJQUVBLElBQUksQ0FBQ2hELGVBQUMsQ0FBQ3FFLE9BQU8sQ0FBQ1AsWUFBWSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUM5RCxlQUFDLENBQUNzRSxXQUFXLENBQUNSLFlBQVksQ0FBQyxJQUFJLENBQUM5RCxlQUFDLENBQUNxRSxPQUFPLENBQUNQLFlBQVksRUFBRSxPQUFPLENBQUMsRUFBRTtNQUNyRyxPQUFPZixXQUFXO0lBQ3BCLENBQUMsTUFBTTtNQUNMLE1BQU0sSUFBSXBDLEtBQUssQ0FBRSwwQ0FBeUNrQixJQUFLLEdBQUUsQ0FBQztJQUNwRTtFQUNGLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRHBFLE1BQU0sQ0FBQzhHLE1BQU0sQ0FBQ3BILFVBQVUsRUFBRUYsUUFBUSxFQUFFQyxPQUFPLENBQUM7QUFBQyxlQUs5QkMsVUFBVTtBQUFBIn0=
|
|
268
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21tYW5kcyIsImhlbHBlcnMiLCJleHRlbnNpb25zIiwiTkVUV09SS19LRVlTIiwiQ1BVX0tFWVMiLCJCQVRURVJZX0tFWVMiLCJNRU1PUllfS0VZUyIsIlNVUFBPUlRFRF9QRVJGT1JNQU5DRV9EQVRBX1RZUEVTIiwiT2JqZWN0IiwiZnJlZXplIiwiY3B1aW5mbyIsIm1lbW9yeWluZm8iLCJiYXR0ZXJ5aW5mbyIsIm5ldHdvcmtpbmZvIiwiTUVNSU5GT19USVRMRVMiLCJOQVRJVkUiLCJEQUxWSUsiLCJFR0wiLCJHTCIsIk1UUkFDSyIsIlRPVEFMIiwiSEVBUCIsIlJFVFJZX1BBVVNFX01TIiwicGFyc2VNZW1pbmZvRm9yQXBpMTlUbzI5IiwiZW50cmllcyIsInZhbERpY3QiLCJ0eXBlIiwic3ViVHlwZSIsIm5hdGl2ZVBzcyIsIm5hdGl2ZVByaXZhdGVEaXJ0eSIsIm5hdGl2ZUhlYXBTaXplIiwibmF0aXZlSGVhcEFsbG9jYXRlZFNpemUiLCJkYWx2aWtQc3MiLCJkYWx2aWtQcml2YXRlRGlydHkiLCJlZ2xQc3MiLCJlZ2xQcml2YXRlRGlydHkiLCJnbFBzcyIsImdsUHJpdmF0ZURpcnR5IiwibGVuZ3RoIiwidG90YWxQc3MiLCJ0b3RhbFByaXZhdGVEaXJ0eSIsInBhcnNlTWVtaW5mb0ZvckFwaUJlbG93MTkiLCJwYXJzZU1lbWluZm9Gb3JBcGlBYm92ZTI5IiwibmF0aXZlUnNzIiwiZGFsdmlrUnNzIiwidG90YWxSc3MiLCJnZXRQZXJmb3JtYW5jZURhdGFUeXBlcyIsIl8iLCJrZXlzIiwiZ2V0UGVyZm9ybWFuY2VEYXRhIiwicGFja2FnZU5hbWUiLCJkYXRhVHlwZSIsInJldHJpZXMiLCJ0b0xvd2VyIiwiZ2V0QmF0dGVyeUluZm8iLCJnZXRDUFVJbmZvIiwiZ2V0TWVtb3J5SW5mbyIsImdldE5ldHdvcmtUcmFmZmljSW5mbyIsIkVycm9yIiwiSlNPTiIsInN0cmluZ2lmeSIsInJldHJ5SW50ZXJ2YWwiLCJvdXRwdXQiLCJhZGIiLCJzaGVsbCIsImUiLCJzdGRlcnIiLCJsb2ciLCJpbmZvIiwidXNhZ2VzUGF0dGVybiIsIlJlZ0V4cCIsImVzY2FwZVJlZ0V4cCIsIm1hdGNoIiwiZXhlYyIsImRlYnVnIiwiY21kIiwiZGF0YSIsInBvd2VyIiwicGFyc2VJbnQiLCJzcGxpdCIsInRyaW0iLCJOdW1iZXIiLCJpc05hTiIsImNsb25lIiwidG9TdHJpbmciLCJhcGlMZXZlbCIsImdldEFwaUxldmVsIiwibGluZSIsImZpbHRlciIsIkJvb2xlYW4iLCJoZWFkZXJzIiwidmFsdWVzIiwibWFwIiwiaGVhZGVyIiwicmV0dXJuVmFsdWUiLCJidWNrZXREdXJhdGlvbiIsImJ1Y2tldFN0YXJ0IiwiYWN0aXZlVGltZSIsInJ4Qnl0ZXMiLCJyeFBhY2tldHMiLCJ0eEJ5dGVzIiwidHhQYWNrZXRzIiwib3BlcmF0aW9ucyIsImluZGV4IiwiZnJvbVh0c3RhdHMiLCJpbmRleE9mIiwic3RhcnQiLCJkZWxpbWl0ZXIiLCJlbmQiLCJwZW5kaW5nQnl0ZXMiLCJzdWJzdHJpbmciLCJhcnJheUxpc3QiLCJqIiwiayIsInJldHVybkluZGV4IiwiaSIsImlzRXF1YWwiLCJpc1VuZGVmaW5lZCIsImFzc2lnbiJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21tYW5kcy9wZXJmb3JtYW5jZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgcmV0cnlJbnRlcnZhbCB9IGZyb20gJ2FzeW5jYm94JztcblxuY29uc3QgY29tbWFuZHMgPSB7fSwgaGVscGVycyA9IHt9LCBleHRlbnNpb25zID0ge307XG5cbmNvbnN0IE5FVFdPUktfS0VZUyA9IFtcbiAgWydidWNrZXRTdGFydCcsICdhY3RpdmVUaW1lJywgJ3J4Qnl0ZXMnLCAncnhQYWNrZXRzJywgJ3R4Qnl0ZXMnLCAndHhQYWNrZXRzJywgJ29wZXJhdGlvbnMnLCAnYnVja2V0RHVyYXRpb24nXSxcbiAgWydzdCcsICdhY3RpdmVUaW1lJywgJ3JiJywgJ3JwJywgJ3RiJywgJ3RwJywgJ29wJywgJ2J1Y2tldER1cmF0aW9uJ11cbl07XG5jb25zdCBDUFVfS0VZUyA9IFsndXNlcicsICdrZXJuZWwnXTtcbmNvbnN0IEJBVFRFUllfS0VZUyA9IFsncG93ZXInXTtcbmNvbnN0IE1FTU9SWV9LRVlTID0gW1xuICAndG90YWxQcml2YXRlRGlydHknLCAnbmF0aXZlUHJpdmF0ZURpcnR5JywgJ2RhbHZpa1ByaXZhdGVEaXJ0eScsXG4gICdlZ2xQcml2YXRlRGlydHknLCAnZ2xQcml2YXRlRGlydHknLFxuICAndG90YWxQc3MnLCAnbmF0aXZlUHNzJywgJ2RhbHZpa1BzcycsICdlZ2xQc3MnLCAnZ2xQc3MnLFxuICAnbmF0aXZlSGVhcEFsbG9jYXRlZFNpemUnLCAnbmF0aXZlSGVhcFNpemUnLFxuICAnbmF0aXZlUnNzJywgJ2RhbHZpa1JzcycsICd0b3RhbFJzcydcbl07XG5jb25zdCBTVVBQT1JURURfUEVSRk9STUFOQ0VfREFUQV9UWVBFUyA9IE9iamVjdC5mcmVlemUoe1xuICBjcHVpbmZvOiAndGhlIGFtb3VudCBvZiBjcHUgYnkgdXNlciBhbmQga2VybmVsIHByb2Nlc3MgLSBjcHUgaW5mb3JtYXRpb24gZm9yIGFwcGxpY2F0aW9ucyBvbiByZWFsIGRldmljZXMgYW5kIHNpbXVsYXRvcnMnLFxuICBtZW1vcnlpbmZvOiAndGhlIGFtb3VudCBvZiBtZW1vcnkgdXNlZCBieSB0aGUgcHJvY2VzcyAtIG1lbW9yeSBpbmZvcm1hdGlvbiBmb3IgYXBwbGljYXRpb25zIG9uIHJlYWwgZGV2aWNlcyBhbmQgc2ltdWxhdG9ycycsXG4gIGJhdHRlcnlpbmZvOiAndGhlIHJlbWFpbmluZyBiYXR0ZXJ5IHBvd2VyIC0gYmF0dGVyeSBwb3dlciBpbmZvcm1hdGlvbiBmb3IgYXBwbGljYXRpb25zIG9uIHJlYWwgZGV2aWNlcyBhbmQgc2ltdWxhdG9ycycsXG4gIG5ldHdvcmtpbmZvOiAndGhlIG5ldHdvcmsgc3RhdGlzdGljcyAtIG5ldHdvcmsgcngvdHggaW5mb3JtYXRpb24gZm9yIGFwcGxpY2F0aW9ucyBvbiByZWFsIGRldmljZXMgYW5kIHNpbXVsYXRvcnMnXG59KTtcbmNvbnN0IE1FTUlORk9fVElUTEVTID0gT2JqZWN0LmZyZWV6ZSh7XG4gIE5BVElWRTogJ05hdGl2ZScsXG4gIERBTFZJSzogJ0RhbHZpaycsXG4gIEVHTDogJ0VHTCcsXG4gIEdMOiAnR0wnLFxuICBNVFJBQ0s6ICdtdHJhY2snLFxuICBUT1RBTDogJ1RPVEFMJyxcbiAgSEVBUDogJ0hlYXAnXG59KTtcbmNvbnN0IFJFVFJZX1BBVVNFX01TID0gMTAwMDtcblxuLyoqXG4gKiBBUEkgbGV2ZWwgYmV0d2VlbiAxOCBhbmQgMzBcbiAqIFsnPFN5c3RlbSBUeXBlPicsICc8TWVtb3J5IFR5cGU+JywgPHBzcyB0b3RhbD4sIDxwcml2YXRlIGRpcnR5PiwgPHByaXZhdGUgY2xlYW4+LCA8c3dhcFBzcyBkaXJ0eT4sIDxoZWFwIHNpemU+LCA8aGVhcCBhbGxvYz4sIDxoZWFwIGZyZWU+XVxuICogZXhjZXB0ICdUT1RBTCcsIHdoaWNoIHNraXBzIHRoZSBzZWNvbmQgdHlwZSBuYW1lXG4gKiAhISEgdmFsRGljdCBnZXRzIG11dGF0ZWRcbiAqL1xuZnVuY3Rpb24gcGFyc2VNZW1pbmZvRm9yQXBpMTlUbzI5IChlbnRyaWVzLCB2YWxEaWN0KSB7XG4gIGNvbnN0IFt0eXBlLCBzdWJUeXBlXSA9IGVudHJpZXM7XG4gIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5OQVRJVkUgJiYgc3ViVHlwZSA9PT0gTUVNSU5GT19USVRMRVMuSEVBUCkge1xuICAgIFssLCB2YWxEaWN0Lm5hdGl2ZVBzcywgdmFsRGljdC5uYXRpdmVQcml2YXRlRGlydHksLCwgdmFsRGljdC5uYXRpdmVIZWFwU2l6ZSwgdmFsRGljdC5uYXRpdmVIZWFwQWxsb2NhdGVkU2l6ZV0gPSBlbnRyaWVzO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IE1FTUlORk9fVElUTEVTLkRBTFZJSyAmJiBzdWJUeXBlID09PSBNRU1JTkZPX1RJVExFUy5IRUFQKSB7XG4gICAgWywsIHZhbERpY3QuZGFsdmlrUHNzLCB2YWxEaWN0LmRhbHZpa1ByaXZhdGVEaXJ0eV0gPSBlbnRyaWVzO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IE1FTUlORk9fVElUTEVTLkVHTCAmJiBzdWJUeXBlID09PSBNRU1JTkZPX1RJVExFUy5NVFJBQ0spIHtcbiAgICBbLCwgdmFsRGljdC5lZ2xQc3MsIHZhbERpY3QuZWdsUHJpdmF0ZURpcnR5XSA9IGVudHJpZXM7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuR0wgJiYgc3ViVHlwZSA9PT0gTUVNSU5GT19USVRMRVMuTVRSQUNLKSB7XG4gICAgWywsIHZhbERpY3QuZ2xQc3MsIHZhbERpY3QuZ2xQcml2YXRlRGlydHldID0gZW50cmllcztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5UT1RBTCAmJiBlbnRyaWVzLmxlbmd0aCA9PT0gOCkge1xuICAgIC8vIHRoZXJlIGFyZSB0d28gdG90YWxzLCBhbmQgd2Ugb25seSB3YW50IHRoZSBmdWxsIGxpc3RpbmcsIHdoaWNoIGhhcyA4IGVudHJpZXNcbiAgICBbLCB2YWxEaWN0LnRvdGFsUHNzLCB2YWxEaWN0LnRvdGFsUHJpdmF0ZURpcnR5XSA9IGVudHJpZXM7XG4gIH1cbn1cblxuLyoqXG4gKiBbJzxTeXN0ZW0gVHlwZScsICc8cHBzPicsICc8c2hhcmVkIGRpcnR5PicsICc8cHJpdmF0ZSBkaXJ0eT4nLCAnPGhlYXAgc2l6ZT4nLCAnPGhlYXAgYWxsb2M+JywgJzxoZWFwIGZyZWU+J11cbiAqICEhISB2YWxEaWN0IGdldHMgbXV0YXRlZFxuICovXG5mdW5jdGlvbiBwYXJzZU1lbWluZm9Gb3JBcGlCZWxvdzE5IChlbnRyaWVzLCB2YWxEaWN0KSB7XG4gIGNvbnN0IHR5cGUgPSBlbnRyaWVzWzBdO1xuICBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuTkFUSVZFKSB7XG4gICAgWywgdmFsRGljdC5uYXRpdmVQc3MsLCB2YWxEaWN0Lm5hdGl2ZVByaXZhdGVEaXJ0eSwgdmFsRGljdC5uYXRpdmVIZWFwU2l6ZSwgdmFsRGljdC5uYXRpdmVIZWFwQWxsb2NhdGVkU2l6ZV0gPSBlbnRyaWVzO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IE1FTUlORk9fVElUTEVTLkRBTFZJSykge1xuICAgIFssIHZhbERpY3QuZGFsdmlrUHNzLCwgdmFsRGljdC5kYWx2aWtQcml2YXRlRGlydHldID0gZW50cmllcztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5FR0wpIHtcbiAgICBbLCB2YWxEaWN0LmVnbFBzcywsIHZhbERpY3QuZWdsUHJpdmF0ZURpcnR5XSA9IGVudHJpZXM7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuR0wpIHtcbiAgICBbLCB2YWxEaWN0LmdsUHNzLCwgdmFsRGljdC5nbFByaXZhdGVEaXJ0eV0gPSBlbnRyaWVzO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IE1FTUlORk9fVElUTEVTLlRPVEFMKSB7XG4gICAgWywgdmFsRGljdC50b3RhbFBzcywsIHZhbERpY3QudG90YWxQcml2YXRlRGlydHldID0gZW50cmllcztcbiAgfVxufVxuXG4vKipcbiAqIEFQSSBsZXZlbCAzMCBhbmQgYWJvdmVcbiAqIFsnPFN5c3RlbSBUeXBlPicsICc8TWVtb3J5IFR5cGU+JywgPHBzcyB0b3RhbD4sIDxwcml2YXRlIGRpcnR5PiwgPHByaXZhdGUgY2xlYW4+LCA8c3dhcFBzcyBkaXJ0eT4sIDxyc3MgdG90YWw+LCA8aGVhcCBzaXplPiwgPGhlYXAgYWxsb2M+LCA8aGVhcCBmcmVlPl1cbiAqICEhISB2YWxEaWN0IGdldHMgbXV0YXRlZFxuICovXG5mdW5jdGlvbiBwYXJzZU1lbWluZm9Gb3JBcGlBYm92ZTI5IChlbnRyaWVzLCB2YWxEaWN0KSB7XG4gIGNvbnN0IFt0eXBlLCBzdWJUeXBlXSA9IGVudHJpZXM7XG4gIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5OQVRJVkUgJiYgc3ViVHlwZSA9PT0gTUVNSU5GT19USVRMRVMuSEVBUCkge1xuICAgIFssLCB2YWxEaWN0Lm5hdGl2ZVBzcywgdmFsRGljdC5uYXRpdmVQcml2YXRlRGlydHksLCwgdmFsRGljdC5uYXRpdmVSc3MsIHZhbERpY3QubmF0aXZlSGVhcFNpemUsIHZhbERpY3QubmF0aXZlSGVhcEFsbG9jYXRlZFNpemVdID0gZW50cmllcztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5EQUxWSUsgJiYgc3ViVHlwZSA9PT0gTUVNSU5GT19USVRMRVMuSEVBUCkge1xuICAgIFssLCB2YWxEaWN0LmRhbHZpa1BzcywgdmFsRGljdC5kYWx2aWtQcml2YXRlRGlydHksLCwgdmFsRGljdC5kYWx2aWtSc3NdID0gZW50cmllcztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5FR0wgJiYgc3ViVHlwZSA9PT0gTUVNSU5GT19USVRMRVMuTVRSQUNLKSB7XG4gICAgWywsIHZhbERpY3QuZWdsUHNzLCB2YWxEaWN0LmVnbFByaXZhdGVEaXJ0eV0gPSBlbnRyaWVzO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IE1FTUlORk9fVElUTEVTLkdMICYmIHN1YlR5cGUgPT09IE1FTUlORk9fVElUTEVTLk1UUkFDSykge1xuICAgIFssLCB2YWxEaWN0LmdsUHNzLCB2YWxEaWN0LmdsUHJpdmF0ZURpcnR5XSA9IGVudHJpZXM7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuVE9UQUwgJiYgZW50cmllcy5sZW5ndGggPT09IDkpIHtcbiAgICAvLyBoYXMgOSBlbnRyaWVzXG4gICAgWywgdmFsRGljdC50b3RhbFBzcywgdmFsRGljdC50b3RhbFByaXZhdGVEaXJ0eSwsLCB2YWxEaWN0LnRvdGFsUnNzXSA9IGVudHJpZXM7XG4gIH1cbn1cblxuLy9cbi8vIHJldHVybnMgdGhlIGluZm9ybWF0aW9uIHR5cGUgb2YgdGhlIHN5c3RlbSBzdGF0ZSB3aGljaCBpcyBzdXBwb3J0ZWQgdG8gcmVhZCBhcyBsaWtlIGNwdSwgbWVtb3J5LCBuZXR3b3JrIHRyYWZmaWMsIGFuZCBiYXR0ZXJ5LlxuLy8gb3V0cHV0IC0gYXJyYXkgbGlrZSBiZWxvd1xuLy8gW2NwdWluZm8sIGJhdHRlcnlpbmZvLCBuZXR3b3JraW5mbywgbWVtb3J5aW5mb11cbi8vXG5jb21tYW5kcy5nZXRQZXJmb3JtYW5jZURhdGFUeXBlcyA9IGZ1bmN0aW9uIGdldFBlcmZvcm1hbmNlRGF0YVR5cGVzICgpIHtcbiAgcmV0dXJuIF8ua2V5cyhTVVBQT1JURURfUEVSRk9STUFOQ0VfREFUQV9UWVBFUyk7XG59O1xuXG4vKipcbiAqIEByZXR1cm5zIFRoZSBpbmZvcm1hdGlvbiB0eXBlIG9mIHRoZSBzeXN0ZW0gc3RhdGUgd2hpY2ggaXMgc3VwcG9ydGVkIHRvIHJlYWQgYXMgbGlrZSBjcHUsIG1lbW9yeSwgbmV0d29yayB0cmFmZmljLCBhbmQgYmF0dGVyeS5cbiAqIGlucHV0IC0gKHBhY2thZ2VOYW1lKSB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvblxuICogICAgICAgIChkYXRhVHlwZSkgdGhlIHR5cGUgb2Ygc3lzdGVtIHN0YXRlIHdoaWNoIHdhbnRzIHRvIHJlYWQuIEl0IHNob3VsZCBiZSBvbmUgb2YgdGhlIGtleXMgb2YgdGhlIFNVUFBPUlRFRF9QRVJGT1JNQU5DRV9EQVRBX1RZUEVTXG4gKiAgICAgICAgKGRhdGFSZWFkVGltZW91dCkgdGhlIG51bWJlciBvZiBhdHRlbXB0cyB0byByZWFkXG4gKiBvdXRwdXQgLSB0YWJsZSBvZiB0aGUgcGVyZm9ybWFuY2UgZGF0YSwgVGhlIGZpcnN0IGxpbmUgb2YgdGhlIHRhYmxlIHJlcHJlc2VudHMgdGhlIHR5cGUgb2YgZGF0YS4gVGhlIHJlbWFpbmluZyBsaW5lcyByZXByZXNlbnQgdGhlIHZhbHVlcyBvZiB0aGUgZGF0YS5cbiAqXG4gKiBpbiBjYXNlIG9mIGJhdHRlcnkgaW5mbyA6IFtbcG93ZXJdLCBbMjNdXVxuICogaW4gY2FzZSBvZiBtZW1vcnkgaW5mbyA6ICBbW3RvdGFsUHJpdmF0ZURpcnR5LCBuYXRpdmVQcml2YXRlRGlydHksIGRhbHZpa1ByaXZhdGVEaXJ0eSwgZWdsUHJpdmF0ZURpcnR5LCBnbFByaXZhdGVEaXJ0eSwgdG90YWxQc3MsXG4gKiAgIG5hdGl2ZVBzcywgZGFsdmlrUHNzLCBlZ2xQc3MsIGdsUHNzLCBuYXRpdmVIZWFwQWxsb2NhdGVkU2l6ZSwgbmF0aXZlSGVhcFNpemVdLCBbMTgzNjAsIDgyOTYsIDYxMzIsIG51bGwsIG51bGwsIDQyNTg4LCA4NDA2LCA3MDI0LCBudWxsLCBudWxsLCAyNjUxOSwgMTAzNDRdXVxuICogaW4gY2FzZSBvZiBuZXR3b3JrIGluZm8gOiBbW2J1Y2tldFN0YXJ0LCBhY3RpdmVUaW1lLCByeEJ5dGVzLCByeFBhY2tldHMsIHR4Qnl0ZXMsIHR4UGFja2V0cywgb3BlcmF0aW9ucywgYnVja2V0RHVyYXRpb24sXSxcbiAqICAgWzE0NzgwOTE2MDAwMDAsIG51bGwsIDEwOTkwNzUsIDYxMDk0NywgOTI4LCAxMTQzNjIsIDc2OSwgMCwgMzYwMDAwMF0sIFsxNDc4MDk1MjAwMDAwLCBudWxsLCAxMzA2MzAwLCA0MDU5OTcsIDUwOSwgNDYzNTksIDM3MCwgMCwgMzYwMDAwMF1dXG4gKiBpbiBjYXNlIG9mIG5ldHdvcmsgaW5mbyA6IFtbc3QsIGFjdGl2ZVRpbWUsIHJiLCBycCwgdGIsIHRwLCBvcCwgYnVja2V0RHVyYXRpb25dLCBbMTQ3ODA4ODAwMCwgbnVsbCwgbnVsbCwgMzIxMTUyOTYsIDM0MjkxLCAyOTU2ODA1LCAyNTcwNSwgMCwgMzYwMF0sXG4gKiAgIFsxNDc4MDkxNjAwLCBudWxsLCBudWxsLCAyNzE0NjgzLCAxMTgyMSwgMTQyMDU2NCwgMTI2NTAsIDAsIDM2MDBdLCBbMTQ3ODA5NTIwMCwgbnVsbCwgbnVsbCwgMTAwNzkyMTMsIDE5OTYyLCAyNDg3NzA1LCAyMDAxNSwgMCwgMzYwMF0sXG4gKiAgIFsxNDc4MDk4ODAwLCBudWxsLCBudWxsLCA0NDQ0NDMzLCAxMDIyNywgMTQzMDM1NiwgMTA0OTMsIDAsIDM2MDBdXVxuICogaW4gY2FzZSBvZiBjcHUgaW5mbyA6IFtbdXNlciwga2VybmVsXSwgWzAuOSwgMS4zXV1cbiAqL1xuY29tbWFuZHMuZ2V0UGVyZm9ybWFuY2VEYXRhID0gYXN5bmMgZnVuY3Rpb24gZ2V0UGVyZm9ybWFuY2VEYXRhIChwYWNrYWdlTmFtZSwgZGF0YVR5cGUsIHJldHJpZXMgPSAyKSB7XG4gIHN3aXRjaCAoXy50b0xvd2VyKGRhdGFUeXBlKSkge1xuICAgIGNhc2UgJ2JhdHRlcnlpbmZvJzpcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdldEJhdHRlcnlJbmZvKHJldHJpZXMpO1xuICAgIGNhc2UgJ2NwdWluZm8nOlxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0Q1BVSW5mbyhwYWNrYWdlTmFtZSwgcmV0cmllcyk7XG4gICAgY2FzZSAnbWVtb3J5aW5mbyc6XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRNZW1vcnlJbmZvKHBhY2thZ2VOYW1lLCByZXRyaWVzKTtcbiAgICBjYXNlICduZXR3b3JraW5mbyc6XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXROZXR3b3JrVHJhZmZpY0luZm8ocmV0cmllcyk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gcGVyZm9ybWFuY2UgZGF0YSBvZiB0eXBlICcke2RhdGFUeXBlfScgZm91bmQuIGAgK1xuICAgICAgICBgT25seSB0aGUgZm9sbG93aW5nIHZhbHVlcyBhcmUgc3VwcG9ydGVkOiAke0pTT04uc3RyaW5naWZ5KFNVUFBPUlRFRF9QRVJGT1JNQU5DRV9EQVRBX1RZUEVTLCAnICcsIDIpfWApO1xuICB9XG59O1xuXG5oZWxwZXJzLmdldENQVUluZm8gPSBhc3luYyBmdW5jdGlvbiBnZXRDUFVJbmZvIChwYWNrYWdlTmFtZSwgcmV0cmllcyA9IDIpIHtcbiAgLy8gVE9ETzogZmlndXJlIG91dCB3aHkgdGhpcyBpc1xuICAvLyBzb21ldGltZXMsIHRoZSBmdW5jdGlvbiBvZiAnYWRiLnNoZWxsJyBmYWlscy4gd2hlbiBJIHRlc3RlZCB0aGlzIGZ1bmN0aW9uIG9uIHRoZSB0YXJnZXQgb2YgJ0dhbGF4eSBOb3RlNScsXG4gIC8vIGFkYi5zaGVsbChkdW1wc3lzIGNwdWluZm8pIHJldHVybnMgY3B1IGRhdGFzIGZvciBvdGhlciBhcHBsaWNhdGlvbiBwYWNrYWdlcywgYnV0IEkgY2FuJ3QgZmluZCB0aGUgZGF0YSBmb3IgcGFja2FnZU5hbWUuXG4gIC8vIEl0IHVzdWFsbHkgZmFpbHMgMzAgdGltZXMgYW5kIHN1Y2Nlc3MgZm9yIHRoZSBuZXh0IHRpbWUsXG4gIC8vIFNpbmNlIHRoZW4sIGhlIGhhcyBjb250aW51ZWQgdG8gc3VjY2VlZC5cbiAgcmV0dXJuIGF3YWl0IHJldHJ5SW50ZXJ2YWwocmV0cmllcywgUkVUUllfUEFVU0VfTVMsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgb3V0cHV0O1xuICAgIHRyeSB7XG4gICAgICBvdXRwdXQgPSBhd2FpdCB0aGlzLmFkYi5zaGVsbChbJ2R1bXBzeXMnLCAnY3B1aW5mbyddKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZS5zdGRlcnIpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhlLnN0ZGVycik7XG4gICAgICB9XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICAvLyBgb3V0cHV0YCB3aWxsIGJlIHNvbWV0aGluZyBsaWtlXG4gICAgLy8gICAgKzAlIDIyMDkvaW8uYXBwaXVtLmFuZHJvaWQuYXBpczogMC4xJSB1c2VyICsgMC4yJSBrZXJuZWwgLyBmYXVsdHM6IDcwIG1pbm9yXG4gICAgY29uc3QgdXNhZ2VzUGF0dGVybiA9XG4gICAgICBuZXcgUmVnRXhwKGBeLitcXFxcLyR7Xy5lc2NhcGVSZWdFeHAocGFja2FnZU5hbWUpfTpcXFxcRCsoW1xcXFxkLl0rKSVcXFxccyt1c2VyXFxcXHMrXFxcXCtcXFxccysoW1xcXFxkLl0rKSVcXFxccytrZXJuZWxgLCAnbScpO1xuICAgIGNvbnN0IG1hdGNoID0gdXNhZ2VzUGF0dGVybi5leGVjKG91dHB1dCk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcob3V0cHV0KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHBhcnNlIGNwdSB1c2FnZSBkYXRhIGZvciAnJHtwYWNrYWdlTmFtZX0nLiBDaGVjayB0aGUgc2VydmVyIGxvZyBmb3IgbW9yZSBkZXRhaWxzYCk7XG4gICAgfVxuICAgIHJldHVybiBbQ1BVX0tFWVMsIFttYXRjaFsxXSwgbWF0Y2hbMl1dXTtcbiAgfSk7XG59O1xuXG5oZWxwZXJzLmdldEJhdHRlcnlJbmZvID0gYXN5bmMgZnVuY3Rpb24gZ2V0QmF0dGVyeUluZm8gKHJldHJpZXMgPSAyKSB7XG4gIHJldHVybiBhd2FpdCByZXRyeUludGVydmFsKHJldHJpZXMsIFJFVFJZX1BBVVNFX01TLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IGNtZCA9IFsnZHVtcHN5cycsICdiYXR0ZXJ5JywgJ3wnLCAnZ3JlcCcsICdsZXZlbCddO1xuICAgIGxldCBkYXRhID0gYXdhaXQgdGhpcy5hZGIuc2hlbGwoY21kKTtcbiAgICBpZiAoIWRhdGEpIHRocm93IG5ldyBFcnJvcignTm8gZGF0YSBmcm9tIGR1bXBzeXMnKTsgLy9lc2xpbnQtZGlzYWJsZS1saW5lIGN1cmx5XG5cbiAgICBsZXQgcG93ZXIgPSBwYXJzZUludCgoZGF0YS5zcGxpdCgnOicpWzFdIHx8ICcnKS50cmltKCksIDEwKTtcblxuICAgIGlmICghTnVtYmVyLmlzTmFOKHBvd2VyKSkge1xuICAgICAgcmV0dXJuIFtfLmNsb25lKEJBVFRFUllfS0VZUyksIFtwb3dlci50b1N0cmluZygpXV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHBhcnNlIGJhdHRlcnkgZGF0YTogJyR7ZGF0YX0nYCk7XG4gICAgfVxuICB9KTtcbn07XG5cbmhlbHBlcnMuZ2V0TWVtb3J5SW5mbyA9IGFzeW5jIGZ1bmN0aW9uIGdldE1lbW9yeUluZm8gKHBhY2thZ2VOYW1lLCByZXRyaWVzID0gMikge1xuICByZXR1cm4gYXdhaXQgcmV0cnlJbnRlcnZhbChyZXRyaWVzLCBSRVRSWV9QQVVTRV9NUywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNtZCA9IFtcbiAgICAgICdkdW1wc3lzJywgJ21lbWluZm8nLCBgJyR7cGFja2FnZU5hbWV9J2AsXG4gICAgICAnfCcsICdncmVwJywgJy1FJyxcbiAgICAgIGAnJHtNRU1JTkZPX1RJVExFUy5OQVRJVkV9fCR7TUVNSU5GT19USVRMRVMuREFMVklLfXwke01FTUlORk9fVElUTEVTLkVHTH1gICtcbiAgICAgIGB8JHtNRU1JTkZPX1RJVExFUy5HTH18JHtNRU1JTkZPX1RJVExFUy5UT1RBTH0nYFxuICAgIF07XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuYWRiLnNoZWxsKGNtZCk7XG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGRhdGEgZnJvbSBkdW1wc3lzJyk7XG4gICAgfVxuICAgIGNvbnN0IHZhbERpY3QgPSB7dG90YWxQcml2YXRlRGlydHk6ICcnfTtcbiAgICBjb25zdCBhcGlMZXZlbCA9IGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCk7XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGRhdGEuc3BsaXQoJ1xcbicpKSB7XG4gICAgICBjb25zdCBlbnRyaWVzID0gbGluZS50cmltKCkuc3BsaXQoL1xccysvKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICBpZiAoYXBpTGV2ZWwgPj0gMzApIHtcbiAgICAgICAgcGFyc2VNZW1pbmZvRm9yQXBpQWJvdmUyOShlbnRyaWVzLCB2YWxEaWN0KTtcbiAgICAgIH0gZWxzZSBpZiAoYXBpTGV2ZWwgPiAxOCAmJiBhcGlMZXZlbCA8IDMwKSB7XG4gICAgICAgIHBhcnNlTWVtaW5mb0ZvckFwaTE5VG8yOShlbnRyaWVzLCB2YWxEaWN0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcnNlTWVtaW5mb0ZvckFwaUJlbG93MTkoZW50cmllcywgdmFsRGljdCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh2YWxEaWN0LnRvdGFsUHJpdmF0ZURpcnR5ICYmIHZhbERpY3QudG90YWxQcml2YXRlRGlydHkgIT09ICdub2RleCcpIHtcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSBfLmNsb25lKE1FTU9SWV9LRVlTKTtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IGhlYWRlcnMubWFwKChoZWFkZXIpID0+IHZhbERpY3RbaGVhZGVyXSk7XG4gICAgICByZXR1cm4gW2hlYWRlcnMsIHZhbHVlc107XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcGFyc2UgbWVtb3J5IGRhdGE6ICcke2RhdGF9J2ApO1xuICB9KTtcbn07XG5cbmhlbHBlcnMuZ2V0TmV0d29ya1RyYWZmaWNJbmZvID0gYXN5bmMgZnVuY3Rpb24gZ2V0TmV0d29ya1RyYWZmaWNJbmZvIChyZXRyaWVzID0gMikge1xuICByZXR1cm4gYXdhaXQgcmV0cnlJbnRlcnZhbChyZXRyaWVzLCBSRVRSWV9QQVVTRV9NUywgYXN5bmMgKCkgPT4ge1xuICAgIGxldCByZXR1cm5WYWx1ZSA9IFtdO1xuICAgIGxldCBidWNrZXREdXJhdGlvbiwgYnVja2V0U3RhcnQsIGFjdGl2ZVRpbWUsIHJ4Qnl0ZXMsIHJ4UGFja2V0cywgdHhCeXRlcywgdHhQYWNrZXRzLCBvcGVyYXRpb25zO1xuXG4gICAgbGV0IGNtZCA9IFsnZHVtcHN5cycsICduZXRzdGF0cyddO1xuICAgIGxldCBkYXRhID0gYXdhaXQgdGhpcy5hZGIuc2hlbGwoY21kKTtcbiAgICBpZiAoIWRhdGEpIHRocm93IG5ldyBFcnJvcignTm8gZGF0YSBmcm9tIGR1bXBzeXMnKTsgLy9lc2xpbnQtZGlzYWJsZS1saW5lIGN1cmx5XG5cbiAgICAvLyBJbiBjYXNlIG9mIG5ldHdvcmsgdHJhZmZpYyBpbmZvcm1hdGlvbiwgaXQgaXMgZGlmZmVyZW50IGZvciB0aGUgcmV0dXJuIGRhdGEgYmV0d2VlbiBlbXVsYXRvciBhbmQgcmVhbCBkZXZpY2UuXG4gICAgLy8gdGhlIHJldHVybiBkYXRhIG9mIGVtdWxhdG9yXG4gICAgLy8gICBYdCBzdGF0czpcbiAgICAvLyAgIFBlbmRpbmcgYnl0ZXM6IDM5MjUwXG4gICAgLy8gICBIaXN0b3J5IHNpbmNlIGJvb3Q6XG4gICAgLy8gICBpZGVudD1bW3R5cGU9V0lGSSwgc3ViVHlwZT1DT01CSU5FRCwgbmV0d29ya0lkPVwiV2lyZWRTU0lEXCJdXSB1aWQ9LTEgc2V0PUFMTCB0YWc9MHgwXG4gICAgLy8gICBOZXR3b3JrU3RhdHNIaXN0b3J5OiBidWNrZXREdXJhdGlvbj0zNjAwMDAwXG4gICAgLy8gICBidWNrZXRTdGFydD0xNDc4MDk4ODAwMDAwIGFjdGl2ZVRpbWU9MzE4MjQgcnhCeXRlcz0yMTUwMiByeFBhY2tldHM9NzggdHhCeXRlcz0xNzc0OCB0eFBhY2tldHM9OTAgb3BlcmF0aW9ucz0wXG4gICAgLy9cbiAgICAvLyA3LjFcbiAgICAvLyAgIFh0IHN0YXRzOlxuICAgIC8vICAgUGVuZGluZyBieXRlczogNDgxNDg3XG4gICAgLy8gICBIaXN0b3J5IHNpbmNlIGJvb3Q6XG4gICAgLy8gICBpZGVudD1be3R5cGU9TU9CSUxFLCBzdWJUeXBlPUNPTUJJTkVELCBzdWJzY3JpYmVySWQ9MzEwMjYwLi4uLCBtZXRlcmVkPXRydWV9XSB1aWQ9LTEgc2V0PUFMTCB0YWc9MHgwXG4gICAgLy8gICAgIE5ldHdvcmtTdGF0c0hpc3Rvcnk6IGJ1Y2tldER1cmF0aW9uPTM2MDBcbiAgICAvLyAgICAgICBzdD0xNDgzOTg0ODAwIHJiPTAgcnA9MCB0Yj0xMjAzMSB0cD0xODQgb3A9MFxuICAgIC8vICAgICAgIHN0PTE0ODM5ODg0MDAgcmI9MCBycD0wIHRiPTM4NDc2IHRwPTU4NyBvcD0wXG4gICAgLy8gICAgICAgc3Q9MTQ4Mzk5OTIwMCByYj0zMTU2MTYgcnA9NDAwIHRiPTk0ODAwIHRwPTM2MiBvcD0wXG4gICAgLy8gICAgICAgc3Q9MTQ4NDAwMjgwMCByYj0xNTgyNiBycD0yMCB0Yj00NzM4IHRwPTE2IG9wPTBcbiAgICAvL1xuICAgIC8vIHRoZSByZXR1cm4gZGF0YSBvZiByZWFsIGRldmljZVxuICAgIC8vICAgWHQgc3RhdHM6XG4gICAgLy8gICBQZW5kaW5nIGJ5dGVzOiAwXG4gICAgLy8gICBIaXN0b3J5IHNpbmNlIGJvb3Q6XG4gICAgLy8gICBpZGVudD1be3R5cGU9TU9CSUxFLCBzdWJUeXBlPUNPTUJJTkVELCBzdWJzY3JpYmVySWQ9NDUwMDUwLi4ufV0gdWlkPS0xIHNldD1BTEwgdGFnPTB4MFxuICAgIC8vICAgTmV0d29ya1N0YXRzSGlzdG9yeTogYnVja2V0RHVyYXRpb249MzYwMFxuICAgIC8vICAgc3Q9MTQ3ODA4ODAwMCByYj0zMjExNTI5NiBycD0zNDI5MSB0Yj0yOTU2ODA1IHRwPTI1NzA1IG9wPTBcbiAgICAvLyAgIHN0PTE0NzgwOTE2MDAgcmI9MjcxNDY4MyBycD0xMTgyMSB0Yj0xNDIwNTY0IHRwPTEyNjUwIG9wPTBcbiAgICAvLyAgIHN0PTE0NzgwOTUyMDAgcmI9MTAwNzkyMTMgcnA9MTk5NjIgdGI9MjQ4NzcwNSB0cD0yMDAxNSBvcD0wXG4gICAgLy8gICBzdD0xNDc4MDk4ODAwIHJiPTQ0NDQ0MzMgcnA9MTAyMjcgdGI9MTQzMDM1NiB0cD0xMDQ5MyBvcD0wXG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICBsZXQgZnJvbVh0c3RhdHMgPSBkYXRhLmluZGV4T2YoJ1h0IHN0YXRzOicpO1xuXG4gICAgbGV0IHN0YXJ0ID0gZGF0YS5pbmRleE9mKCdQZW5kaW5nIGJ5dGVzOicsIGZyb21YdHN0YXRzKTtcbiAgICBsZXQgZGVsaW1pdGVyID0gZGF0YS5pbmRleE9mKCc6Jywgc3RhcnQgKyAxKTtcbiAgICBsZXQgZW5kID0gZGF0YS5pbmRleE9mKCdcXG4nLCBkZWxpbWl0ZXIgKyAxKTtcbiAgICBsZXQgcGVuZGluZ0J5dGVzID0gZGF0YS5zdWJzdHJpbmcoZGVsaW1pdGVyICsgMSwgZW5kKS50cmltKCk7XG5cbiAgICBpZiAoZW5kID4gZGVsaW1pdGVyKSB7XG4gICAgICBzdGFydCA9IGRhdGEuaW5kZXhPZignYnVja2V0RHVyYXRpb24nLCBlbmQgKyAxKTtcbiAgICAgIGRlbGltaXRlciA9IGRhdGEuaW5kZXhPZignPScsIHN0YXJ0ICsgMSk7XG4gICAgICBlbmQgPSBkYXRhLmluZGV4T2YoJ1xcbicsIGRlbGltaXRlciArIDEpO1xuICAgICAgYnVja2V0RHVyYXRpb24gPSBkYXRhLnN1YnN0cmluZyhkZWxpbWl0ZXIgKyAxLCBlbmQpLnRyaW0oKTtcbiAgICB9XG5cbiAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgZGF0YSA9IGRhdGEuc3Vic3RyaW5nKGVuZCArIDEsIGRhdGEubGVuZ3RoKTtcbiAgICAgIGxldCBhcnJheUxpc3QgPSBkYXRhLnNwbGl0KCdcXG4nKTtcblxuICAgICAgaWYgKGFycmF5TGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHN0YXJ0ID0gLTE7XG5cbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBORVRXT1JLX0tFWVMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICBzdGFydCA9IGFycmF5TGlzdFswXS5pbmRleE9mKE5FVFdPUktfS0VZU1tqXVswXSk7XG5cbiAgICAgICAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgaW5kZXggPSBqO1xuICAgICAgICAgICAgcmV0dXJuVmFsdWVbMF0gPSBbXTtcblxuICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBORVRXT1JLX0tFWVNbal0ubGVuZ3RoOyArK2spIHtcbiAgICAgICAgICAgICAgcmV0dXJuVmFsdWVbMF1ba10gPSBORVRXT1JLX0tFWVNbal1ba107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmV0dXJuSW5kZXggPSAxO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5TGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGRhdGEgPSBhcnJheUxpc3RbaV07XG4gICAgICAgICAgc3RhcnQgPSBkYXRhLmluZGV4T2YoTkVUV09SS19LRVlTW2luZGV4XVswXSk7XG5cbiAgICAgICAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgZGVsaW1pdGVyID0gZGF0YS5pbmRleE9mKCc9Jywgc3RhcnQgKyAxKTtcbiAgICAgICAgICAgIGVuZCA9IGRhdGEuaW5kZXhPZignICcsIGRlbGltaXRlciArIDEpO1xuICAgICAgICAgICAgYnVja2V0U3RhcnQgPSBkYXRhLnN1YnN0cmluZyhkZWxpbWl0ZXIgKyAxLCBlbmQpLnRyaW0oKTtcblxuICAgICAgICAgICAgaWYgKGVuZCA+IGRlbGltaXRlcikge1xuICAgICAgICAgICAgICBzdGFydCA9IGRhdGEuaW5kZXhPZihORVRXT1JLX0tFWVNbaW5kZXhdWzFdLCBlbmQgKyAxKTtcbiAgICAgICAgICAgICAgaWYgKHN0YXJ0ID49IDApIHtcbiAgICAgICAgICAgICAgICBkZWxpbWl0ZXIgPSBkYXRhLmluZGV4T2YoJz0nLCBzdGFydCArIDEpO1xuICAgICAgICAgICAgICAgIGVuZCA9IGRhdGEuaW5kZXhPZignICcsIGRlbGltaXRlciArIDEpO1xuICAgICAgICAgICAgICAgIGFjdGl2ZVRpbWUgPSBkYXRhLnN1YnN0cmluZyhkZWxpbWl0ZXIgKyAxLCBlbmQpLnRyaW0oKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZW5kID4gZGVsaW1pdGVyKSB7XG4gICAgICAgICAgICAgIHN0YXJ0ID0gZGF0YS5pbmRleE9mKE5FVFdPUktfS0VZU1tpbmRleF1bMl0sIGVuZCArIDEpO1xuICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgICAgIGRlbGltaXRlciA9IGRhdGEuaW5kZXhPZignPScsIHN0YXJ0ICsgMSk7XG4gICAgICAgICAgICAgICAgZW5kID0gZGF0YS5pbmRleE9mKCcgJywgZGVsaW1pdGVyICsgMSk7XG4gICAgICAgICAgICAgICAgcnhCeXRlcyA9IGRhdGEuc3Vic3RyaW5nKGRlbGltaXRlciArIDEsIGVuZCkudHJpbSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbmQgPiBkZWxpbWl0ZXIpIHtcbiAgICAgICAgICAgICAgc3RhcnQgPSBkYXRhLmluZGV4T2YoTkVUV09SS19LRVlTW2luZGV4XVszXSwgZW5kICsgMSk7XG4gICAgICAgICAgICAgIGlmIChzdGFydCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgZGVsaW1pdGVyID0gZGF0YS5pbmRleE9mKCc9Jywgc3RhcnQgKyAxKTtcbiAgICAgICAgICAgICAgICBlbmQgPSBkYXRhLmluZGV4T2YoJyAnLCBkZWxpbWl0ZXIgKyAxKTtcbiAgICAgICAgICAgICAgICByeFBhY2tldHMgPSBkYXRhLnN1YnN0cmluZyhkZWxpbWl0ZXIgKyAxLCBlbmQpLnRyaW0oKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZW5kID4gZGVsaW1pdGVyKSB7XG4gICAgICAgICAgICAgIHN0YXJ0ID0gZGF0YS5pbmRleE9mKE5FVFdPUktfS0VZU1tpbmRleF1bNF0sIGVuZCArIDEpO1xuICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgICAgIGRlbGltaXRlciA9IGRhdGEuaW5kZXhPZignPScsIHN0YXJ0ICsgMSk7XG4gICAgICAgICAgICAgICAgZW5kID0gZGF0YS5pbmRleE9mKCcgJywgZGVsaW1pdGVyICsgMSk7XG4gICAgICAgICAgICAgICAgdHhCeXRlcyA9IGRhdGEuc3Vic3RyaW5nKGRlbGltaXRlciArIDEsIGVuZCkudHJpbSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbmQgPiBkZWxpbWl0ZXIpIHtcbiAgICAgICAgICAgICAgc3RhcnQgPSBkYXRhLmluZGV4T2YoTkVUV09SS19LRVlTW2luZGV4XVs1XSwgZW5kICsgMSk7XG4gICAgICAgICAgICAgIGlmIChzdGFydCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgZGVsaW1pdGVyID0gZGF0YS5pbmRleE9mKCc9Jywgc3RhcnQgKyAxKTtcbiAgICAgICAgICAgICAgICBlbmQgPSBkYXRhLmluZGV4T2YoJyAnLCBkZWxpbWl0ZXIgKyAxKTtcbiAgICAgICAgICAgICAgICB0eFBhY2tldHMgPSBkYXRhLnN1YnN0cmluZyhkZWxpbWl0ZXIgKyAxLCBlbmQpLnRyaW0oKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZW5kID4gZGVsaW1pdGVyKSB7XG4gICAgICAgICAgICAgIHN0YXJ0ID0gZGF0YS5pbmRleE9mKE5FVFdPUktfS0VZU1tpbmRleF1bNl0sIGVuZCArIDEpO1xuICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgICAgIGRlbGltaXRlciA9IGRhdGEuaW5kZXhPZignPScsIHN0YXJ0ICsgMSk7XG4gICAgICAgICAgICAgICAgZW5kID0gZGF0YS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9ucyA9IGRhdGEuc3Vic3RyaW5nKGRlbGltaXRlciArIDEsIGVuZCkudHJpbSgpO1xuXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVyblZhbHVlW3JldHVybkluZGV4KytdID0gW2J1Y2tldFN0YXJ0LCBhY3RpdmVUaW1lLCByeEJ5dGVzLCByeFBhY2tldHMsIHR4Qnl0ZXMsIHR4UGFja2V0cywgb3BlcmF0aW9ucywgYnVja2V0RHVyYXRpb25dO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghXy5pc0VxdWFsKHBlbmRpbmdCeXRlcywgJycpICYmICFfLmlzVW5kZWZpbmVkKHBlbmRpbmdCeXRlcykgJiYgIV8uaXNFcXVhbChwZW5kaW5nQnl0ZXMsICdub2RleCcpKSB7XG4gICAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHBhcnNlIG5ldHdvcmsgdHJhZmZpYyBkYXRhOiAnJHtkYXRhfSdgKTtcbiAgICB9XG4gIH0pO1xufTtcblxuT2JqZWN0LmFzc2lnbihleHRlbnNpb25zLCBjb21tYW5kcywgaGVscGVycyk7XG5leHBvcnQge1xuICBjb21tYW5kcywgaGVscGVycywgU1VQUE9SVEVEX1BFUkZPUk1BTkNFX0RBVEFfVFlQRVMsIENQVV9LRVlTLCBNRU1PUllfS0VZUyxcbiAgQkFUVEVSWV9LRVlTLCBORVRXT1JLX0tFWVMsXG59O1xuZXhwb3J0IGRlZmF1bHQgZXh0ZW5zaW9ucztcblxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFFQSxNQUFNQSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0VBQUVDLE9BQU8sR0FBRyxDQUFDLENBQUM7RUFBRUMsVUFBVSxHQUFHLENBQUMsQ0FBQztBQUFDO0FBQUE7QUFFbkQsTUFBTUMsWUFBWSxHQUFHLENBQ25CLENBQUMsYUFBYSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixDQUFDLEVBQzdHLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixDQUFDLENBQ3JFO0FBQUM7QUFDRixNQUFNQyxRQUFRLEdBQUcsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDO0FBQUM7QUFDcEMsTUFBTUMsWUFBWSxHQUFHLENBQUMsT0FBTyxDQUFDO0FBQUM7QUFDL0IsTUFBTUMsV0FBVyxHQUFHLENBQ2xCLG1CQUFtQixFQUFFLG9CQUFvQixFQUFFLG9CQUFvQixFQUMvRCxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFDbkMsVUFBVSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFD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
|