appium-android-driver 5.10.4 → 5.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/build/lib/android-helpers.js +1 -1
- package/build/lib/android-helpers.js.map +1 -1
- package/build/lib/bootstrap.js +1 -1
- package/build/lib/bootstrap.js.map +1 -1
- package/build/lib/commands/actions.js +52 -1
- package/build/lib/commands/actions.js.map +1 -1
- package/build/lib/commands/alert.js +1 -1
- package/build/lib/commands/alert.js.map +1 -1
- package/build/lib/commands/app-management.js +1 -1
- package/build/lib/commands/app-management.js.map +1 -1
- package/build/lib/commands/context.js +1 -1
- package/build/lib/commands/context.js.map +1 -1
- package/build/lib/commands/execute.js +1 -1
- package/build/lib/commands/execute.js.map +1 -1
- package/build/lib/commands/file-actions.js +1 -1
- package/build/lib/commands/file-actions.js.map +1 -1
- package/build/lib/commands/find.js +1 -1
- package/build/lib/commands/find.js.map +1 -1
- package/build/lib/commands/general.js +1 -1
- package/build/lib/commands/general.js.map +1 -1
- package/build/lib/commands/ime.js +1 -1
- package/build/lib/commands/ime.js.map +1 -1
- package/build/lib/commands/index.js +1 -1
- package/build/lib/commands/index.js.map +1 -1
- package/build/lib/commands/intent.js +1 -1
- package/build/lib/commands/intent.js.map +1 -1
- package/build/lib/commands/keyboard.js +1 -1
- package/build/lib/commands/keyboard.js.map +1 -1
- package/build/lib/commands/log.js +1 -1
- package/build/lib/commands/log.js.map +1 -1
- package/build/lib/commands/media-projection.js +1 -1
- package/build/lib/commands/media-projection.js.map +1 -1
- package/build/lib/commands/network.js +6 -55
- package/build/lib/commands/network.js.map +1 -1
- package/build/lib/commands/performance.js +1 -1
- package/build/lib/commands/performance.js.map +1 -1
- package/build/lib/commands/permissions.js +1 -1
- package/build/lib/commands/permissions.js.map +1 -1
- package/build/lib/commands/recordscreen.js +1 -1
- package/build/lib/commands/recordscreen.js.map +1 -1
- package/build/lib/commands/streamscreen.js +1 -1
- package/build/lib/commands/streamscreen.js.map +1 -1
- package/build/lib/commands/touch.js +1 -1
- package/build/lib/commands/touch.js.map +1 -1
- package/build/lib/driver.js +1 -1
- package/build/lib/driver.js.map +1 -1
- package/build/lib/uiautomator.js +1 -1
- package/build/lib/uiautomator.js.map +1 -1
- package/build/lib/unlock-helpers.js +1 -1
- package/build/lib/unlock-helpers.js.map +1 -1
- package/build/lib/utils.js +1 -1
- package/build/lib/utils.js.map +1 -1
- package/build/lib/webview-helpers.js +1 -1
- package/build/lib/webview-helpers.js.map +1 -1
- package/lib/commands/actions.js +135 -0
- package/lib/commands/network.js +18 -90
- package/lib/utils.js +4 -3
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute.js","names":["_lodash","_interopRequireDefault","require","_driver","extensions","execute","script","args","match","log","info","replace","trim","executeMobile","_","isArray","isWebContext","errors","NotImplementedError","endpoint","chromedriver","jwproxy","downstreamProtocol","PROTOCOLS","MJSONWP","command","mobileCommand","opts","mobileCommandsMapping","shell","execEmuConsoleCommand","startLogsBroadcast","stopLogsBroadcast","changePermissions","getPermissions","performEditorAction","sensorSet","getDeviceTime","startScreenStreaming","stopScreenStreaming","getNotifications","listSms","pushFile","pullFile","pullFolder","deleteFile","isAppInstalled","queryAppState","activateApp","removeApp","terminateApp","installApp","clearApp","startService","stopService","startActivity","broadcast","getContexts","unlock","refreshGpsCache","startMediaProjectionRecording","isMediaProjectionRecordingRunning","stopMediaProjectionRecording","getConnectivity","setConnectivity","hideKeyboard","isKeyboardShown","has","UnknownCommandError","keys","_default","exports","default"],"sources":["../../../lib/commands/execute.js"],"sourcesContent":["import _ from 'lodash';\nimport { errors, PROTOCOLS } from 'appium/driver';\n\nconst extensions = {};\n\nextensions.execute = async function execute (script, args) {\n if (script.match(/^mobile:/)) {\n this.log.info(`Executing native command '${script}'`);\n script = script.replace(/^mobile:/, '').trim();\n return await this.executeMobile(script, _.isArray(args) ? args[0] : args);\n }\n if (!this.isWebContext()) {\n throw new errors.NotImplementedError();\n }\n const endpoint = this.chromedriver.jwproxy.downstreamProtocol === PROTOCOLS.MJSONWP\n ? '/execute'\n : '/execute/sync';\n return await this.chromedriver.jwproxy.command(endpoint, 'POST', {\n script,\n args,\n });\n};\n\nextensions.executeMobile = async function executeMobile (mobileCommand, opts = {}) {\n const mobileCommandsMapping = {\n shell: 'mobileShell',\n\n execEmuConsoleCommand: 'mobileExecEmuConsoleCommand',\n\n startLogsBroadcast: 'mobileStartLogsBroadcast',\n stopLogsBroadcast: 'mobileStopLogsBroadcast',\n\n changePermissions: 'mobileChangePermissions',\n getPermissions: 'mobileGetPermissions',\n\n performEditorAction: 'mobilePerformEditorAction',\n\n sensorSet: 'sensorSet',\n\n getDeviceTime: 'mobileGetDeviceTime',\n\n startScreenStreaming: 'mobileStartScreenStreaming',\n stopScreenStreaming: 'mobileStopScreenStreaming',\n\n getNotifications: 'mobileGetNotifications',\n\n listSms: 'mobileListSms',\n\n pushFile: 'mobilePushFile',\n pullFile: 'mobilePullFile',\n pullFolder: 'mobilePullFolder',\n deleteFile: 'mobileDeleteFile',\n\n isAppInstalled: 'mobileIsAppInstalled',\n queryAppState: 'mobileQueryAppState',\n activateApp: 'mobileActivateApp',\n removeApp: 'mobileRemoveApp',\n terminateApp: 'mobileTerminateApp',\n installApp: 'mobileInstallApp',\n clearApp: 'mobileClearApp',\n\n startService: 'mobileStartService',\n stopService: 'mobileStopService',\n startActivity: 'mobileStartActivity',\n broadcast: 'mobileBroadcast',\n\n getContexts: 'mobileGetContexts',\n\n unlock: 'mobileUnlock',\n\n refreshGpsCache: 'mobileRefreshGpsCache',\n\n startMediaProjectionRecording: 'mobileStartMediaProjectionRecording',\n isMediaProjectionRecordingRunning: 'mobileIsMediaProjectionRecordingRunning',\n stopMediaProjectionRecording: 'mobileStopMediaProjectionRecording',\n\n getConnectivity: 'mobileGetConnectivity',\n setConnectivity: 'mobileSetConnectivity',\n\n hideKeyboard: 'hideKeyboard',\n isKeyboardShown: 'isKeyboardShown',\n };\n\n if (!_.has(mobileCommandsMapping, mobileCommand)) {\n throw new errors.UnknownCommandError(`Unknown mobile command \"${mobileCommand}\". ` +\n `Only ${_.keys(mobileCommandsMapping)} commands are supported.`);\n }\n return await this[mobileCommandsMapping[mobileCommand]](opts);\n};\n\nexport default extensions;\n"],"mappings":";;;;;;;;AAAA,IAAAA,OAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AAEA,MAAME,UAAU,GAAG,CAAC,CAAC;AAErBA,UAAU,CAACC,OAAO,GAAG,eAAeA,OAAOA,CAAEC,MAAM,EAAEC,IAAI,EAAE;EACzD,IAAID,MAAM,CAACE,KAAK,CAAC,UAAU,CAAC,EAAE;IAC5B,IAAI,CAACC,GAAG,CAACC,IAAI,CAAE,6BAA4BJ,MAAO,GAAE,CAAC;IACrDA,MAAM,GAAGA,MAAM,CAACK,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAACC,IAAI,
|
|
1
|
+
{"version":3,"file":"execute.js","names":["_lodash","_interopRequireDefault","require","_driver","extensions","execute","script","args","match","log","info","replace","trim","executeMobile","_","isArray","isWebContext","errors","NotImplementedError","endpoint","chromedriver","jwproxy","downstreamProtocol","PROTOCOLS","MJSONWP","command","mobileCommand","opts","mobileCommandsMapping","shell","execEmuConsoleCommand","startLogsBroadcast","stopLogsBroadcast","changePermissions","getPermissions","performEditorAction","sensorSet","getDeviceTime","startScreenStreaming","stopScreenStreaming","getNotifications","listSms","pushFile","pullFile","pullFolder","deleteFile","isAppInstalled","queryAppState","activateApp","removeApp","terminateApp","installApp","clearApp","startService","stopService","startActivity","broadcast","getContexts","unlock","refreshGpsCache","startMediaProjectionRecording","isMediaProjectionRecordingRunning","stopMediaProjectionRecording","getConnectivity","setConnectivity","hideKeyboard","isKeyboardShown","has","UnknownCommandError","keys","_default","exports","default"],"sources":["../../../lib/commands/execute.js"],"sourcesContent":["import _ from 'lodash';\nimport { errors, PROTOCOLS } from 'appium/driver';\n\nconst extensions = {};\n\nextensions.execute = async function execute (script, args) {\n if (script.match(/^mobile:/)) {\n this.log.info(`Executing native command '${script}'`);\n script = script.replace(/^mobile:/, '').trim();\n return await this.executeMobile(script, _.isArray(args) ? args[0] : args);\n }\n if (!this.isWebContext()) {\n throw new errors.NotImplementedError();\n }\n const endpoint = this.chromedriver.jwproxy.downstreamProtocol === PROTOCOLS.MJSONWP\n ? '/execute'\n : '/execute/sync';\n return await this.chromedriver.jwproxy.command(endpoint, 'POST', {\n script,\n args,\n });\n};\n\nextensions.executeMobile = async function executeMobile (mobileCommand, opts = {}) {\n const mobileCommandsMapping = {\n shell: 'mobileShell',\n\n execEmuConsoleCommand: 'mobileExecEmuConsoleCommand',\n\n startLogsBroadcast: 'mobileStartLogsBroadcast',\n stopLogsBroadcast: 'mobileStopLogsBroadcast',\n\n changePermissions: 'mobileChangePermissions',\n getPermissions: 'mobileGetPermissions',\n\n performEditorAction: 'mobilePerformEditorAction',\n\n sensorSet: 'sensorSet',\n\n getDeviceTime: 'mobileGetDeviceTime',\n\n startScreenStreaming: 'mobileStartScreenStreaming',\n stopScreenStreaming: 'mobileStopScreenStreaming',\n\n getNotifications: 'mobileGetNotifications',\n\n listSms: 'mobileListSms',\n\n pushFile: 'mobilePushFile',\n pullFile: 'mobilePullFile',\n pullFolder: 'mobilePullFolder',\n deleteFile: 'mobileDeleteFile',\n\n isAppInstalled: 'mobileIsAppInstalled',\n queryAppState: 'mobileQueryAppState',\n activateApp: 'mobileActivateApp',\n removeApp: 'mobileRemoveApp',\n terminateApp: 'mobileTerminateApp',\n installApp: 'mobileInstallApp',\n clearApp: 'mobileClearApp',\n\n startService: 'mobileStartService',\n stopService: 'mobileStopService',\n startActivity: 'mobileStartActivity',\n broadcast: 'mobileBroadcast',\n\n getContexts: 'mobileGetContexts',\n\n unlock: 'mobileUnlock',\n\n refreshGpsCache: 'mobileRefreshGpsCache',\n\n startMediaProjectionRecording: 'mobileStartMediaProjectionRecording',\n isMediaProjectionRecordingRunning: 'mobileIsMediaProjectionRecordingRunning',\n stopMediaProjectionRecording: 'mobileStopMediaProjectionRecording',\n\n getConnectivity: 'mobileGetConnectivity',\n setConnectivity: 'mobileSetConnectivity',\n\n hideKeyboard: 'hideKeyboard',\n isKeyboardShown: 'isKeyboardShown',\n };\n\n if (!_.has(mobileCommandsMapping, mobileCommand)) {\n throw new errors.UnknownCommandError(`Unknown mobile command \"${mobileCommand}\". ` +\n `Only ${_.keys(mobileCommandsMapping)} commands are supported.`);\n }\n return await this[mobileCommandsMapping[mobileCommand]](opts);\n};\n\nexport default extensions;\n"],"mappings":";;;;;;;;AAAA,IAAAA,OAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AAEA,MAAME,UAAU,GAAG,CAAC,CAAC;AAErBA,UAAU,CAACC,OAAO,GAAG,eAAeA,OAAOA,CAAEC,MAAM,EAAEC,IAAI,EAAE;EACzD,IAAID,MAAM,CAACE,KAAK,CAAC,UAAU,CAAC,EAAE;IAC5B,IAAI,CAACC,GAAG,CAACC,IAAI,CAAE,6BAA4BJ,MAAO,GAAE,CAAC;IACrDA,MAAM,GAAGA,MAAM,CAACK,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAACC,IAAI,CAAC,CAAC;IAC9C,OAAO,MAAM,IAAI,CAACC,aAAa,CAACP,MAAM,EAAEQ,eAAC,CAACC,OAAO,CAACR,IAAI,CAAC,GAAGA,IAAI,CAAC,CAAC,CAAC,GAAGA,IAAI,CAAC;EAC3E;EACA,IAAI,CAAC,IAAI,CAACS,YAAY,CAAC,CAAC,EAAE;IACxB,MAAM,IAAIC,cAAM,CAACC,mBAAmB,CAAC,CAAC;EACxC;EACA,MAAMC,QAAQ,GAAG,IAAI,CAACC,YAAY,CAACC,OAAO,CAACC,kBAAkB,KAAKC,iBAAS,CAACC,OAAO,GAC/E,UAAU,GACV,eAAe;EACnB,OAAO,MAAM,IAAI,CAACJ,YAAY,CAACC,OAAO,CAACI,OAAO,CAACN,QAAQ,EAAE,MAAM,EAAE;IAC/Db,MAAM;IACNC;EACF,CAAC,CAAC;AACJ,CAAC;AAEDH,UAAU,CAACS,aAAa,GAAG,eAAeA,aAAaA,CAAEa,aAAa,EAAEC,IAAI,GAAG,CAAC,CAAC,EAAE;EACjF,MAAMC,qBAAqB,GAAG;IAC5BC,KAAK,EAAE,aAAa;IAEpBC,qBAAqB,EAAE,6BAA6B;IAEpDC,kBAAkB,EAAE,0BAA0B;IAC9CC,iBAAiB,EAAE,yBAAyB;IAE5CC,iBAAiB,EAAE,yBAAyB;IAC5CC,cAAc,EAAE,sBAAsB;IAEtCC,mBAAmB,EAAE,2BAA2B;IAEhDC,SAAS,EAAE,WAAW;IAEtBC,aAAa,EAAE,qBAAqB;IAEpCC,oBAAoB,EAAE,4BAA4B;IAClDC,mBAAmB,EAAE,2BAA2B;IAEhDC,gBAAgB,EAAE,wBAAwB;IAE1CC,OAAO,EAAE,eAAe;IAExBC,QAAQ,EAAE,gBAAgB;IAC1BC,QAAQ,EAAE,gBAAgB;IAC1BC,UAAU,EAAE,kBAAkB;IAC9BC,UAAU,EAAE,kBAAkB;IAE9BC,cAAc,EAAE,sBAAsB;IACtCC,aAAa,EAAE,qBAAqB;IACpCC,WAAW,EAAE,mBAAmB;IAChCC,SAAS,EAAE,iBAAiB;IAC5BC,YAAY,EAAE,oBAAoB;IAClCC,UAAU,EAAE,kBAAkB;IAC9BC,QAAQ,EAAE,gBAAgB;IAE1BC,YAAY,EAAE,oBAAoB;IAClCC,WAAW,EAAE,mBAAmB;IAChCC,aAAa,EAAE,qBAAqB;IACpCC,SAAS,EAAE,iBAAiB;IAE5BC,WAAW,EAAE,mBAAmB;IAEhCC,MAAM,EAAE,cAAc;IAEtBC,eAAe,EAAE,uBAAuB;IAExCC,6BAA6B,EAAE,qCAAqC;IACpEC,iCAAiC,EAAE,yCAAyC;IAC5EC,4BAA4B,EAAE,oCAAoC;IAElEC,eAAe,EAAE,uBAAuB;IACxCC,eAAe,EAAE,uBAAuB;IAExCC,YAAY,EAAE,cAAc;IAC5BC,eAAe,EAAE;EACnB,CAAC;EAED,IAAI,CAACpD,eAAC,CAACqD,GAAG,CAACvC,qBAAqB,EAAEF,aAAa,CAAC,EAAE;IAChD,MAAM,IAAIT,cAAM,CAACmD,mBAAmB,CAAE,2BAA0B1C,aAAc,KAAI,GAC/E,QAAOZ,eAAC,CAACuD,IAAI,CAACzC,qBAAqB,CAAE,0BAAyB,CAAC;EACpE;EACA,OAAO,MAAM,IAAI,CAACA,qBAAqB,CAACF,aAAa,CAAC,CAAC,CAACC,IAAI,CAAC;AAC/D,CAAC;AAAC,IAAA2C,QAAA,GAEalE,UAAU;AAAAmE,OAAA,CAAAC,OAAA,GAAAF,QAAA"}
|
|
@@ -204,4 +204,4 @@ commands.mobileDeleteFile = async function mobileDeleteFile(opts = {}) {
|
|
|
204
204
|
};
|
|
205
205
|
var _default = commands;
|
|
206
206
|
exports.default = _default;
|
|
207
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfc3VwcG9ydCIsIl9wYXRoIiwiX2RyaXZlciIsIl91dGlscyIsIkNPTlRBSU5FUl9QQVRIX01BUktFUiIsIkNPTlRBSU5FUl9QQVRIX1BBVFRFUk4iLCJSZWdFeHAiLCJBTkRST0lEX01FRElBX1JFU0NBTl9JTlRFTlQiLCJjb21tYW5kcyIsImV4cG9ydHMiLCJwYXJzZUNvbnRhaW5lclBhdGgiLCJyZW1vdGVQYXRoIiwibWF0Y2giLCJleGVjIiwiRXJyb3IiLCJwYXRoIiwicG9zaXgiLCJyZXNvbHZlIiwic2Nhbk1lZGlhIiwiYWRiIiwibG9nIiwiZGVidWciLCJnZXRBcGlMZXZlbCIsInNoZWxsIiwiZSIsIndhcm4iLCJzdGRlcnIiLCJtZXNzYWdlIiwiZXNjYXBlUGF0aCIsInAiLCJyZXBsYWNlIiwicHVsbEZpbGUiLCJlbmRzV2l0aCIsImVycm9ycyIsIkludmFsaWRBcmd1bWVudEVycm9yIiwidG1wRGVzdGluYXRpb24iLCJzdGFydHNXaXRoIiwicGFja2FnZUlkIiwicGF0aEluQ29udGFpbmVyIiwiYmFzZW5hbWUiLCJlcnJvckFuZFRocm93IiwibG9jYWxGaWxlIiwidGVtcERpciIsInByZWZpeCIsInN1ZmZpeCIsInB1bGwiLCJ1dGlsIiwidG9Jbk1lbW9yeUJhc2U2NCIsInRvU3RyaW5nIiwiZnMiLCJleGlzdHMiLCJ1bmxpbmsiLCJtb2JpbGVQdWxsRmlsZSIsIm9wdHMiLCJyZXF1aXJlQXJncyIsInB1c2hGaWxlIiwiYmFzZTY0RGF0YSIsIl8iLCJpc0FycmF5IiwiQnVmZmVyIiwiZnJvbSIsImNvbnRlbnQiLCJ3cml0ZUZpbGUiLCJkaXJuYW1lIiwicHVzaCIsIm1vYmlsZVB1c2hGaWxlIiwicGF5bG9hZCIsInB1bGxGb2xkZXIiLCJ0bXBSb290Iiwib3BlbkRpciIsInppcCIsInRvSW5NZW1vcnlaaXAiLCJlbmNvZGVUb0Jhc2U2NCIsInJpbXJhZiIsIm1vYmlsZVB1bGxGb2xkZXIiLCJkZWxldGVGaWxlT3JGb2xkZXIiLCJwZXJmb3JtUmVtb3RlRnNDaGVjayIsIm9wIiwicnVuQXMiLCJwYXNzRmxhZyIsImNoZWNrQ21kIiwiZnVsbENtZCIsImluY2x1ZGVzIiwiaWduIiwiaXNGaWxlIiwiaXNEaXIiLCJpc1ByZXNlbnQiLCJkc3RQYXRoIiwicGtnSWQiLCJpbmZvIiwiZXhwZWN0c0ZpbGUiLCJtb2JpbGVEZWxldGVGaWxlIiwiX2RlZmF1bHQiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL2ZpbGUtYWN0aW9ucy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZnMsIHV0aWwsIHppcCwgdGVtcERpciB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IGVycm9ycyB9IGZyb20gJ2FwcGl1bS9kcml2ZXInO1xuaW1wb3J0IHsgcmVxdWlyZUFyZ3MgfSBmcm9tICcuLi91dGlscyc7XG5cblxuY29uc3QgQ09OVEFJTkVSX1BBVEhfTUFSS0VSID0gJ0AnO1xuLy8gaHR0cHM6Ly9yZWdleDEwMS5jb20vci9QTGRCMEcvMlxuY29uc3QgQ09OVEFJTkVSX1BBVEhfUEFUVEVSTiA9IG5ldyBSZWdFeHAoYF4ke0NPTlRBSU5FUl9QQVRIX01BUktFUn0oW14vXSspLyguKylgKTtcbmNvbnN0IEFORFJPSURfTUVESUFfUkVTQ0FOX0lOVEVOVCA9ICdhbmRyb2lkLmludGVudC5hY3Rpb24uTUVESUFfU0NBTk5FUl9TQ0FOX0ZJTEUnO1xuXG5cbmNvbnN0IGNvbW1hbmRzID0ge307XG5cbi8qKlxuICogUGFyc2VzIHRoZSBhY3R1YWwgZGVzdGluYXRpb24gcGF0aCBmcm9tIHRoZSBnaXZlbiB2YWx1ZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByZW1vdGVQYXRoIFRoZSBwcmVmb3JtYXR0ZWQgcmVtb3RlIHBhdGgsIHdoaWNoIGxvb2tzIGxpa2VcbiAqIGBAbXkuYXBwLmlkL215L3BhdGhgXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gQW4gYXJyYXksIHdoZXJlIHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBwYXJzZWQgcGFja2FnZVxuICogaWRlbnRpZmllciBhbmQgdGhlIHNlY29uZCBvbmUgaXMgdGhlIGFjdHVhbCBkZXN0aW5hdGlvbiBwYXRoIGluc2lkZSB0aGUgcGFja2FnZS5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgZ2l2ZW4gc3RyaW5nIGNhbm5vdCBiZSBwYXJzZWRcbiAqL1xuZnVuY3Rpb24gcGFyc2VDb250YWluZXJQYXRoIChyZW1vdGVQYXRoKSB7XG4gIGNvbnN0IG1hdGNoID0gQ09OVEFJTkVSX1BBVEhfUEFUVEVSTi5leGVjKHJlbW90ZVBhdGgpO1xuICBpZiAoIW1hdGNoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJdCBpcyBleHBlY3RlZCB0aGF0IHBhY2thZ2UgaWRlbnRpZmllciBpcyBzZXBhcmF0ZWQgZnJvbSB0aGUgcmVsYXRpdmUgcGF0aCB3aXRoIGEgc2luZ2xlIHNsYXNoLiBgICtcbiAgICAgIGAnJHtyZW1vdGVQYXRofScgaXMgZ2l2ZW4gaW5zdGVhZGApO1xuICB9XG4gIHJldHVybiBbbWF0Y2hbMV0sIHBhdGgucG9zaXgucmVzb2x2ZShgL2RhdGEvZGF0YS8ke21hdGNoWzFdfWAsIG1hdGNoWzJdKV07XG59XG5cbi8qKlxuICogU2NhbnMgdGhlIGdpdmVuIGZpbGUvZm9sZGVyIG9uIHRoZSByZW1vdGUgZGV2aWNlXG4gKiBhbmQgYWRkcyBtYXRjaGluZyBpdGVtcyB0byB0aGUgZGV2aWNlJ3MgbWVkaWEgbGlicmFyeS5cbiAqIEV4Y2VwdGlvbnMgYXJlIGlnbm9yZWQgYW5kIHdyaXR0ZW4gaW50byB0aGUgbG9nLlxuICpcbiAqIEBwYXJhbSB7QURCfSBhZGIgQURCIGluc3RhbmNlXG4gKiBAcGFyYW0ge09iamVjdD99IGxvZyBMb2dnZXIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSByZW1vdGVQYXRoIFRoZSBmaWxlL2ZvbGRlciBwYXRoIG9uIHRoZSByZW1vdGUgZGV2aWNlXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNjYW5NZWRpYSAoYWRiLCByZW1vdGVQYXRoLCBsb2cgPSBudWxsKSB7XG4gIGxvZz8uZGVidWcoYFBlcmZvcm1pbmcgbWVkaWEgc2NhbiBvZiAnJHtyZW1vdGVQYXRofSdgKTtcbiAgdHJ5IHtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9pc3N1ZXMvMTYxODRcbiAgICBpZiAoYXdhaXQgYWRiLmdldEFwaUxldmVsKCkgPj0gMjkpIHtcbiAgICAgIGF3YWl0IGFkYi5zY2FuTWVkaWEocmVtb3RlUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IGFkYi5zaGVsbChbXG4gICAgICAgICdhbScsICdicm9hZGNhc3QnLFxuICAgICAgICAnLWEnLCBBTkRST0lEX01FRElBX1JFU0NBTl9JTlRFTlQsXG4gICAgICAgICctZCcsIGBmaWxlOi8vJHtyZW1vdGVQYXRofWBcbiAgICAgIF0pO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZz8ud2FybihgSWdub3JpbmcgYW4gdW5leHBlY3RlZCBlcnJvciB1cG9uIG1lZGlhIHNjYW5uaW5nIG9mICcke3JlbW90ZVBhdGh9JzogJHtlLnN0ZGVyciB8fCBlLm1lc3NhZ2V9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBIHNtYWxsIGhlbHBlciwgd2hpY2ggZXNjYXBlcyBzaW5nbGUgcXVvdGVzIGluIHBhdGhzLFxuICogc28gdGhleSBhcmUgc2FmZSB0byBiZSBwYXNzZWQgYXMgYXJndW1lbnRzIG9mIHNoZWxsIGNvbW1hbmRzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHAgVGhlIGluaXRpYWwgcmVtb3RlIHBhdGhcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBlc2NhcGVkIHBhdGggdmFsdWVcbiAqL1xuZnVuY3Rpb24gZXNjYXBlUGF0aCAocCkge1xuICByZXR1cm4gcC5yZXBsYWNlKC8nL2csIGBcXFxcJ2ApO1xufVxuXG4vKipcbiAqIFB1bGxzIGEgcmVtb3RlIGZpbGUgZnJvbSB0aGUgZGV2aWNlLlxuICogSXQgaXMgcmVxdWlyZWQsIHRoYXQgYSBwYWNrYWdlIGhhcyBkZWJ1Z2dpbmcgZmxhZyBlbmFibGVkXG4gKiBpbiBvcmRlciB0byBhY2Nlc3MgaXRzIGZpbGVzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByZW1vdGVQYXRoIFRoZSBmdWxsIHBhdGggdG8gdGhlIHJlbW90ZSBmaWxlXG4gKiBvciBhIHNwZWNpYWxseSBmb3JtYXR0ZWQgcGF0aCwgd2hpY2ggcG9pbnRzIHRvIGFuIGl0ZW0gaW5zaWRlIGFwcCBidW5kbGVcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEJhc2U2NCBlbmNvZGVkIGNvbnRlbnQgb2YgdGhlIHB1bGxlZCBmaWxlXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHB1bGwgb3BlcmF0aW9uIGZhaWxlZFxuICovXG5jb21tYW5kcy5wdWxsRmlsZSA9IGFzeW5jIGZ1bmN0aW9uIHB1bGxGaWxlIChyZW1vdGVQYXRoKSB7XG4gIGlmIChyZW1vdGVQYXRoLmVuZHNXaXRoKCcvJykpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBJdCBpcyBleHBlY3RlZCB0aGF0IHJlbW90ZSBwYXRoIHBvaW50cyB0byBhIGZpbGUgYW5kIG5vdCB0byBhIGZvbGRlci4gYCArXG4gICAgICBgJyR7cmVtb3RlUGF0aH0nIGlzIGdpdmVuIGluc3RlYWRgKTtcbiAgfVxuICBsZXQgdG1wRGVzdGluYXRpb24gPSBudWxsO1xuICBpZiAocmVtb3RlUGF0aC5zdGFydHNXaXRoKENPTlRBSU5FUl9QQVRIX01BUktFUikpIHtcbiAgICBjb25zdCBbcGFja2FnZUlkLCBwYXRoSW5Db250YWluZXJdID0gcGFyc2VDb250YWluZXJQYXRoKHJlbW90ZVBhdGgpO1xuICAgIHRoaXMubG9nLmRlYnVnKGBQYXJzZWQgcGFja2FnZSBpZGVudGlmaWVyICcke3BhY2thZ2VJZH0nIGZyb20gJyR7cmVtb3RlUGF0aH0nLiBXaWxsIGdldCB0aGUgZGF0YSBmcm9tICcke3BhdGhJbkNvbnRhaW5lcn0nYCk7XG4gICAgdG1wRGVzdGluYXRpb24gPSBgL2RhdGEvbG9jYWwvdG1wLyR7cGF0aC5wb3NpeC5iYXNlbmFtZShwYXRoSW5Db250YWluZXIpfWA7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsncnVuLWFzJywgcGFja2FnZUlkLCBgY2htb2QgNzc3ICcke2VzY2FwZVBhdGgocGF0aEluQ29udGFpbmVyKX0nYF0pO1xuICAgICAgYXdhaXQgdGhpcy5hZGIuc2hlbGwoW1xuICAgICAgICAncnVuLWFzJywgcGFja2FnZUlkLFxuICAgICAgICBgY3AgLWYgJyR7ZXNjYXBlUGF0aChwYXRoSW5Db250YWluZXIpfScgJyR7ZXNjYXBlUGF0aCh0bXBEZXN0aW5hdGlvbil9J2BcbiAgICAgIF0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYENhbm5vdCBhY2Nlc3MgdGhlIGNvbnRhaW5lciBvZiAnJHtwYWNrYWdlSWR9JyBhcHBsaWNhdGlvbi4gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgSXMgdGhlIGFwcGxpY2F0aW9uIGluc3RhbGxlZCBhbmQgaGFzICdkZWJ1Z2dhYmxlJyBidWlsZCBvcHRpb24gc2V0IHRvIHRydWU/IGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgbG9jYWxGaWxlID0gYXdhaXQgdGVtcERpci5wYXRoKHtwcmVmaXg6ICdhcHBpdW0nLCBzdWZmaXg6ICcudG1wJ30pO1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuYWRiLnB1bGwodG1wRGVzdGluYXRpb24gfHwgcmVtb3RlUGF0aCwgbG9jYWxGaWxlKTtcbiAgICByZXR1cm4gKGF3YWl0IHV0aWwudG9Jbk1lbW9yeUJhc2U2NChsb2NhbEZpbGUpKS50b1N0cmluZygpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChhd2FpdCBmcy5leGlzdHMobG9jYWxGaWxlKSkge1xuICAgICAgYXdhaXQgZnMudW5saW5rKGxvY2FsRmlsZSk7XG4gICAgfVxuICAgIGlmICh0bXBEZXN0aW5hdGlvbikge1xuICAgICAgYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydybScsICctZicsIHRtcERlc3RpbmF0aW9uXSk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFB1bGxGaWxlT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHJlbW90ZVBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgcmVtb3RlIGZpbGVcbiAqIG9yIGEgc3BlY2lhbGx5IGZvcm1hdHRlZCBwYXRoLCB3aGljaCBwb2ludHMgdG8gYW4gaXRlbSBpbnNpZGUgYW4gYXBwIGJ1bmRsZSxcbiAqIGZvciBleGFtcGxlIGBAbXkuYXBwLmlkL215L3BhdGhgLiBJdCBpcyBtYW5kYXRvcnkgZm9yIHRoZSBhcHAgYnVuZGxlIHRvIGhhdmVcbiAqIGRlYnVnZ2luZyBlbmFibGVkIGluIG9yZGVyIHRvIHVzZSB0aGUgbGF0dGVyIHJlbW90ZVBhdGggZm9ybWF0LlxuICovXG5cbi8qKlxuICogUHVsbHMgYSByZW1vdGUgZmlsZSBmcm9tIHRoZSBkZXZpY2UuXG4gKlxuICogQHBhcmFtIHtQdWxsRmlsZU9wdGlvbnN9IG9wdHNcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBzYW1lIGFzIGBwdWxsRmlsZWBcbiAqL1xuY29tbWFuZHMubW9iaWxlUHVsbEZpbGUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVQdWxsRmlsZSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHsgcmVtb3RlUGF0aCB9ID0gcmVxdWlyZUFyZ3MoJ3JlbW90ZVBhdGgnLCBvcHRzKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMucHVsbEZpbGUocmVtb3RlUGF0aCk7XG59O1xuXG4vKipcbiAqIFB1c2hlcyB0aGUgZ2l2ZW4gZGF0YSB0byBhIGZpbGUgb24gdGhlIHJlbW90ZSBkZXZpY2VcbiAqIEl0IGlzIHJlcXVpcmVkLCB0aGF0IGEgcGFja2FnZSBoYXMgZGVidWdnaW5nIGZsYWcgZW5hYmxlZFxuICogaW4gb3JkZXIgdG8gYWNjZXNzIGl0cyBmaWxlcy5cbiAqIEFmdGVyIGEgZmlsZSBpcyBwdXNoZWQgaXQgZ2V0cyBhdXRvbWF0aWNhbGx5IHNjYW5uZWQgZm9yIHBvc3NpYmxlXG4gKiBtZWRpYSBvY2N1cnJlbmNlcy4gSWYgdGhlIHNjYW4gc3VjY2VlZHMgdGhlbiB0aGUgZmlsZSBpcyBhZGRlZCB0byB0aGVcbiAqIG1lZGlhIGxpYnJhcnkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgcmVtb3RlIGZpbGUgb3JcbiAqIGEgZmlsZSBpbnNpZGUgYSBwYWNrYWdlIGJ1bmRsZVxuICogQHBhcmFtIHtzdHJpbmd9IGJhc2U2NERhdGEgQmFzZTY0IGVuY29kZWQgZGF0YSB0byBiZSB3cml0dGVuIHRvIHRoZVxuICogcmVtb3RlIGZpbGUuIFRoZSByZW1vdGUgZmlsZSB3aWxsIGJlIHNpbGVudGx5IG92ZXJyaWRkZW4gaWYgaXQgYWxyZWFkeSBleGlzdHMuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIHB1c2hpbmcgdGhlIGRhdGFcbiAqL1xuY29tbWFuZHMucHVzaEZpbGUgPSBhc3luYyBmdW5jdGlvbiBwdXNoRmlsZSAocmVtb3RlUGF0aCwgYmFzZTY0RGF0YSkge1xuICBpZiAocmVtb3RlUGF0aC5lbmRzV2l0aCgnLycpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihcbiAgICAgIGBJdCBpcyBleHBlY3RlZCB0aGF0IHJlbW90ZSBwYXRoIHBvaW50cyB0byBhIGZpbGUgYW5kIG5vdCB0byBhIGZvbGRlci4gYCArXG4gICAgICBgJyR7cmVtb3RlUGF0aH0nIGlzIGdpdmVuIGluc3RlYWRgXG4gICAgKTtcbiAgfVxuICBjb25zdCBsb2NhbEZpbGUgPSBhd2FpdCB0ZW1wRGlyLnBhdGgoe3ByZWZpeDogJ2FwcGl1bScsIHN1ZmZpeDogJy50bXAnfSk7XG4gIGlmIChfLmlzQXJyYXkoYmFzZTY0RGF0YSkpIHtcbiAgICAvLyBzb21lIGNsaWVudHMgKGFoZW0pIGphdmEsIHNlbmQgYSBieXRlIGFycmF5IGVuY29kaW5nIHV0ZjggY2hhcmFjdGVyc1xuICAgIC8vIGluc3RlYWQgb2YgYSBzdHJpbmcsIHdoaWNoIHdvdWxkIGJlIGluZmluaXRlbHkgYmV0dGVyIVxuICAgIGJhc2U2NERhdGEgPSBCdWZmZXIuZnJvbShiYXNlNjREYXRhKS50b1N0cmluZygndXRmOCcpO1xuICB9XG4gIGNvbnN0IGNvbnRlbnQgPSBCdWZmZXIuZnJvbShiYXNlNjREYXRhLCAnYmFzZTY0Jyk7XG4gIGxldCB0bXBEZXN0aW5hdGlvbiA9IG51bGw7XG4gIHRyeSB7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKGxvY2FsRmlsZSwgY29udGVudC50b1N0cmluZygnYmluYXJ5JyksICdiaW5hcnknKTtcbiAgICBpZiAocmVtb3RlUGF0aC5zdGFydHNXaXRoKENPTlRBSU5FUl9QQVRIX01BUktFUikpIHtcbiAgICAgIGNvbnN0IFtwYWNrYWdlSWQsIHBhdGhJbkNvbnRhaW5lcl0gPSBwYXJzZUNvbnRhaW5lclBhdGgocmVtb3RlUGF0aCk7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgUGFyc2VkIHBhY2thZ2UgaWRlbnRpZmllciAnJHtwYWNrYWdlSWR9JyBmcm9tICcke3JlbW90ZVBhdGh9Jy4gYCArXG4gICAgICAgIGBXaWxsIHB1dCB0aGUgZGF0YSBpbnRvICcke3BhdGhJbkNvbnRhaW5lcn0nYCk7XG4gICAgICB0bXBEZXN0aW5hdGlvbiA9IGAvZGF0YS9sb2NhbC90bXAvJHtwYXRoLnBvc2l4LmJhc2VuYW1lKHBhdGhJbkNvbnRhaW5lcil9YDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNoZWxsKFxuICAgICAgICAgIFsncnVuLWFzJywgcGFja2FnZUlkLCBgbWtkaXIgLXAgJyR7ZXNjYXBlUGF0aChwYXRoLnBvc2l4LmRpcm5hbWUocGF0aEluQ29udGFpbmVyKSl9J2BdXG4gICAgICAgICk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsncnVuLWFzJywgcGFja2FnZUlkLCBgdG91Y2ggJyR7ZXNjYXBlUGF0aChwYXRoSW5Db250YWluZXIpfSdgXSk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsncnVuLWFzJywgcGFja2FnZUlkLCBgY2htb2QgNzc3ICcke2VzY2FwZVBhdGgocGF0aEluQ29udGFpbmVyKX0nYF0pO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5wdXNoKGxvY2FsRmlsZSwgdG1wRGVzdGluYXRpb24pO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5zaGVsbChbXG4gICAgICAgICAgJ3J1bi1hcycsIHBhY2thZ2VJZCxcbiAgICAgICAgICBgY3AgLWYgJyR7ZXNjYXBlUGF0aCh0bXBEZXN0aW5hdGlvbil9JyAnJHtlc2NhcGVQYXRoKHBhdGhJbkNvbnRhaW5lcil9J2BcbiAgICAgICAgXSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYENhbm5vdCBhY2Nlc3MgdGhlIGNvbnRhaW5lciBvZiAnJHtwYWNrYWdlSWR9JyBhcHBsaWNhdGlvbi4gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGBJcyB0aGUgYXBwbGljYXRpb24gaW5zdGFsbGVkIGFuZCBoYXMgJ2RlYnVnZ2FibGUnIGJ1aWxkIG9wdGlvbiBzZXQgdG8gdHJ1ZT8gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGFkYiBwdXNoIGNyZWF0ZXMgZm9sZGVycyBhbmQgb3ZlcndyaXRlcyBleGlzdGluZyBmaWxlcy5cbiAgICAgIGF3YWl0IHRoaXMuYWRiLnB1c2gobG9jYWxGaWxlLCByZW1vdGVQYXRoKTtcblxuICAgICAgLy8gaWYgd2UgaGF2ZSBwdXNoZWQgYSBmaWxlLCBpdCBtaWdodCBiZSBhIG1lZGlhIGZpbGUsIHNvIGVuc3VyZSB0aGF0XG4gICAgICAvLyBhcHBzIGtub3cgYWJvdXQgaXRcbiAgICAgIGF3YWl0IHNjYW5NZWRpYSh0aGlzLmFkYiwgcmVtb3RlUGF0aCwgdGhpcy5sb2cpO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKGxvY2FsRmlsZSkpIHtcbiAgICAgIGF3YWl0IGZzLnVubGluayhsb2NhbEZpbGUpO1xuICAgIH1cbiAgICBpZiAodG1wRGVzdGluYXRpb24pIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsncm0nLCAnLWYnLCB0bXBEZXN0aW5hdGlvbl0pO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQdXNoRmlsZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByZW1vdGVQYXRoIFRoZSBmdWxsIHBhdGggdG8gdGhlIHJlbW90ZSBmaWxlXG4gKiBvciBhIHNwZWNpYWxseSBmb3JtYXR0ZWQgcGF0aCwgd2hpY2ggcG9pbnRzIHRvIGFuIGl0ZW0gaW5zaWRlIGFuIGFwcCBidW5kbGUsXG4gKiBmb3IgZXhhbXBsZSBgQG15LmFwcC5pZC9teS9wYXRoYC4gSXQgaXMgbWFuZGF0b3J5IGZvciB0aGUgYXBwIGJ1bmRsZSB0byBoYXZlXG4gKiBkZWJ1Z2dpbmcgZW5hYmxlZCBpbiBvcmRlciB0byB1c2UgdGhlIGxhdHRlciByZW1vdGVQYXRoIGZvcm1hdC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXlsb2FkIEJhc2U2NC1lbmNvZGVkIGNvbnRlbnQgb2YgdGhlIGZpbGUgdG8gYmUgcHVzaGVkLlxuICovXG5cbi8qKlxuICogUHVzaGVzIHRoZSBnaXZlbiBkYXRhIHRvIGEgZmlsZSBvbiB0aGUgcmVtb3RlIGRldmljZS5cbiAqXG4gKiBAcGFyYW0ge1B1c2hGaWxlT3B0aW9uc30gb3B0c1xuICovXG5jb21tYW5kcy5tb2JpbGVQdXNoRmlsZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVB1c2hGaWxlIChvcHRzID0ge30pIHtcbiAgY29uc3QgeyByZW1vdGVQYXRoLCBwYXlsb2FkIH0gPSByZXF1aXJlQXJncyhbJ3JlbW90ZVBhdGgnLCAncGF5bG9hZCddLCBvcHRzKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMucHVzaEZpbGUocmVtb3RlUGF0aCwgcGF5bG9hZCk7XG59O1xuXG4vKipcbiAqIFB1bGxzIHRoZSB3aG9sZSBmb2xkZXIgZnJvbSB0aGUgcmVtb3RlIGRldmljZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByZW1vdGVQYXRoIFRoZSBmdWxsIHBhdGggdG8gYSBmb2xkZXIgb24gdGhlXG4gKiByZW1vdGUgZGV2aWNlIG9yIGEgZm9sZGVyIGluc2lkZSBhbiBhcHBsaWNhdGlvbiBidW5kbGVcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEJhc2U2NC1lbmNvZGVkIGFuZCB6aXBwZWQgY29udGVudCBvZiB0aGUgZm9sZGVyXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGEgZmFpbHVyZSB3aGlsZSBnZXR0aW5nIHRoZSBmb2xkZXIgY29udGVudFxuICovXG5jb21tYW5kcy5wdWxsRm9sZGVyID0gYXN5bmMgZnVuY3Rpb24gcHVsbEZvbGRlciAocmVtb3RlUGF0aCkge1xuICBjb25zdCB0bXBSb290ID0gYXdhaXQgdGVtcERpci5vcGVuRGlyKCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5hZGIucHVsbChyZW1vdGVQYXRoLCB0bXBSb290KTtcbiAgICByZXR1cm4gKGF3YWl0IHppcC50b0luTWVtb3J5WmlwKHRtcFJvb3QsIHtcbiAgICAgIGVuY29kZVRvQmFzZTY0OiB0cnVlLFxuICAgIH0pKS50b1N0cmluZygpO1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IGZzLnJpbXJhZih0bXBSb290KTtcbiAgfVxufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQdWxsRm9sZGVyT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHJlbW90ZVBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgcmVtb3RlIGZvbGRlci5cbiAqL1xuXG4vKipcbiAqIFB1bGxzIHRoZSB3aG9sZSBmb2xkZXIgZnJvbSB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtQdWxsRm9sZGVyT3B0aW9uc30gb3B0c1xuICogQHJldHVybnMge3N0cmluZ30gVGhlIHNhbWUgYXMgYHB1bGxGb2xkZXJgXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVB1bGxGb2xkZXIgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVQdWxsRm9sZGVyIChvcHRzID0ge30pIHtcbiAgY29uc3QgeyByZW1vdGVQYXRoIH0gPSByZXF1aXJlQXJncygncmVtb3RlUGF0aCcsIG9wdHMpO1xuICByZXR1cm4gYXdhaXQgdGhpcy5wdWxsRm9sZGVyKHJlbW90ZVBhdGgpO1xufTtcblxuLyoqXG4gKiBEZWxldGVzIHRoZSBnaXZlbiBmb2xkZXIgb3IgZmlsZSBmcm9tIHRoZSByZW1vdGUgZGV2aWNlXG4gKlxuICogQHBhcmFtIHtBREJ9IGFkYlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgcmVtb3RlIGZvbGRlclxuICogb3IgZmlsZSAoZm9sZGVyIG5hbWVzIG11c3QgZW5kIHdpdGggYSBzaW5nbGUgc2xhc2gpXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHByb3ZpZGVkIHJlbW90ZSBwYXRoIGlzIGludmFsaWQgb3JcbiAqIHRoZSBwYWNrYWdlIGNvbnRlbnQgY2Fubm90IGJlIGFjY2Vzc2VkXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSByZW1vdGUgaXRlbSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZGVsZXRlZC5cbiAqIElmIHRoZSByZW1vdGUgcGF0aCBpcyB2YWxpZCwgYnV0IHRoZSByZW1vdGUgcGF0aCBkb2VzIG5vdCBleGlzdFxuICogdGhpcyBmdW5jdGlvbiByZXR1cm4gYGZhbHNlYC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGVsZXRlRmlsZU9yRm9sZGVyIChhZGIsIHJlbW90ZVBhdGgpIHtcbiAgY29uc3QgcGVyZm9ybVJlbW90ZUZzQ2hlY2sgPSBhc3luYyAocCwgb3AsIHJ1bkFzID0gbnVsbCkgPT4ge1xuICAgIGNvbnN0IHBhc3NGbGFnID0gJ19fUEFTU19fJztcbiAgICBjb25zdCBjaGVja0NtZCA9IGBbIC0ke29wfSAnJHtlc2NhcGVQYXRoKHApfScgXSAmJiBlY2hvICR7cGFzc0ZsYWd9YDtcbiAgICBjb25zdCBmdWxsQ21kID0gcnVuQXMgPyBgcnVuLWFzICR7cnVuQXN9ICR7Y2hlY2tDbWR9YCA6IGNoZWNrQ21kO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gXy5pbmNsdWRlcyhhd2FpdCBhZGIuc2hlbGwoW2Z1bGxDbWRdKSwgcGFzc0ZsYWcpO1xuICAgIH0gY2F0Y2ggKGlnbikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgaXNGaWxlID0gYXN5bmMgKHAsIHJ1bkFzID0gbnVsbCkgPT4gYXdhaXQgcGVyZm9ybVJlbW90ZUZzQ2hlY2socCwgJ2YnLCBydW5Bcyk7XG4gIGNvbnN0IGlzRGlyID0gYXN5bmMgKHAsIHJ1bkFzID0gbnVsbCkgPT4gYXdhaXQgcGVyZm9ybVJlbW90ZUZzQ2hlY2socCwgJ2QnLCBydW5Bcyk7XG4gIGNvbnN0IGlzUHJlc2VudCA9IGFzeW5jIChwLCBydW5BcyA9IG51bGwpID0+IGF3YWl0IHBlcmZvcm1SZW1vdGVGc0NoZWNrKHAsICdlJywgcnVuQXMpO1xuXG4gIGxldCBkc3RQYXRoID0gcmVtb3RlUGF0aDtcbiAgbGV0IHBrZ0lkID0gbnVsbDtcbiAgaWYgKHJlbW90ZVBhdGguc3RhcnRzV2l0aChDT05UQUlORVJfUEFUSF9NQVJLRVIpKSB7XG4gICAgY29uc3QgW3BhY2thZ2VJZCwgcGF0aEluQ29udGFpbmVyXSA9IHBhcnNlQ29udGFpbmVyUGF0aChyZW1vdGVQYXRoKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgUGFyc2VkIHBhY2thZ2UgaWRlbnRpZmllciAnJHtwYWNrYWdlSWR9JyBmcm9tICcke3JlbW90ZVBhdGh9J2ApO1xuICAgIGRzdFBhdGggPSBwYXRoSW5Db250YWluZXI7XG4gICAgcGtnSWQgPSBwYWNrYWdlSWQ7XG4gIH1cblxuICBpZiAocGtnSWQpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgYWRiLnNoZWxsKFsncnVuLWFzJywgcGtnSWQsICdscyddKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBDYW5ub3QgYWNjZXNzIHRoZSBjb250YWluZXIgb2YgJyR7cGtnSWR9JyBhcHBsaWNhdGlvbi4gYCArXG4gICAgICAgIGBJcyB0aGUgYXBwbGljYXRpb24gaW5zdGFsbGVkIGFuZCBoYXMgJ2RlYnVnZ2FibGUnIGJ1aWxkIG9wdGlvbiBzZXQgdG8gdHJ1ZT8gYCArXG4gICAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFhd2FpdCBpc1ByZXNlbnQoZHN0UGF0aCwgcGtnSWQpKSB7XG4gICAgdGhpcy5sb2cuaW5mbyhgVGhlIGl0ZW0gYXQgJyR7ZHN0UGF0aH0nIGRvZXMgbm90IGV4aXN0LiBQZXJoYXBzLCBhbHJlYWR5IGRlbGV0ZWQ/YCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgZXhwZWN0c0ZpbGUgPSAhcmVtb3RlUGF0aC5lbmRzV2l0aCgnLycpO1xuICBpZiAoZXhwZWN0c0ZpbGUgJiYgIWF3YWl0IGlzRmlsZShkc3RQYXRoLCBwa2dJZCkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBUaGUgaXRlbSBhdCAnJHtkc3RQYXRofScgaXMgbm90IGEgZmlsZWApO1xuICB9IGVsc2UgaWYgKCFleHBlY3RzRmlsZSAmJiAhYXdhaXQgaXNEaXIoZHN0UGF0aCwgcGtnSWQpKSB7XG4gICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgVGhlIGl0ZW0gYXQgJyR7ZHN0UGF0aH0nIGlzIG5vdCBhIGZvbGRlcmApO1xuICB9XG5cbiAgaWYgKHBrZ0lkKSB7XG4gICAgYXdhaXQgYWRiLnNoZWxsKFxuICAgICAgWydydW4tYXMnLCBwa2dJZCwgYHJtIC1mJHtleHBlY3RzRmlsZSA/ICcnIDogJ3InfSAnJHtlc2NhcGVQYXRoKGRzdFBhdGgpfSdgXSk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgYWRiLnNoZWxsKFsncm0nLCBgLWYke2V4cGVjdHNGaWxlID8gJycgOiAncid9YCwgZHN0UGF0aF0pO1xuICB9XG4gIGlmIChhd2FpdCBpc1ByZXNlbnQoZHN0UGF0aCwgcGtnSWQpKSB7XG4gICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgVGhlIGl0ZW0gYXQgJyR7ZHN0UGF0aH0nIHN0aWxsIGV4aXN0cyBhZnRlciBiZWluZyBkZWxldGVkLiBgICtcbiAgICAgIGBJcyBpdCB3cml0YWJsZT9gKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBEZWxldGVGaWxlT3B0c1xuICogQHByb3BlcnR5IHshc3RyaW5nfSByZW1vdGVQYXRoIFRoZSBmdWxsIHBhdGggdG8gdGhlIHJlbW90ZSBmaWxlXG4gKiBvciBhIGZpbGUgaW5zaWRlIGFuIGFwcGxpY2F0aW9uIGJ1bmRsZSAoZm9yIGV4YW1wbGUgYEBteS5hcHAuaWQvcGF0aC9pbi9idW5kbGVgKVxuICovXG5cbi8qKlxuICogRGVsZXRlcyBhIGZpbGUgb24gdGhlIHJlbW90ZSBkZXZpY2VcbiAqXG4gKiBAcGFyYW0ge0RlbGV0ZUZpbGVPcHRzfSBvcHRzXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSByZW1vdGUgZmlsZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZGVsZXRlZC5cbiAqIElmIHRoZSBwYXRoIHRvIGEgcmVtb3RlIGZpbGUgaXMgdmFsaWQsIGJ1dCB0aGUgZmlsZSBpdHNlbGYgZG9lcyBub3QgZXhpc3RcbiAqIHRoZW4gYGZhbHNlYCBpcyByZXR1cm5lZC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgYXJndW1lbnQgaXMgaW52YWxpZCBvciB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGVcbiAqIGRlbGV0aW5nIHRoZSBmaWxlXG4gKi9cbmNvbW1hbmRzLm1vYmlsZURlbGV0ZUZpbGUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVEZWxldGVGaWxlIChvcHRzID0ge30pIHtcbiAgY29uc3Qge3JlbW90ZVBhdGh9ID0gb3B0cztcbiAgaWYgKCFyZW1vdGVQYXRoKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgVGhlICdyZW1vdGVQYXRoJyBhcmd1bWVudCBpcyBtYW5kYXRvcnlgKTtcbiAgfVxuICBpZiAocmVtb3RlUGF0aC5lbmRzV2l0aCgnLycpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihcbiAgICAgIGBJdCBpcyBleHBlY3RlZCB0aGF0IHJlbW90ZSBwYXRoIHBvaW50cyB0byBhIGZvbGRlciBhbmQgbm90IHRvIGEgZmlsZS4gYCArXG4gICAgICBgJyR7cmVtb3RlUGF0aH0nIGlzIGdpdmVuIGluc3RlYWRgXG4gICAgKTtcbiAgfVxuICByZXR1cm4gYXdhaXQgZGVsZXRlRmlsZU9yRm9sZGVyKHRoaXMuYWRiLCByZW1vdGVQYXRoKTtcbn07XG5cbmV4cG9ydCB7IGNvbW1hbmRzIH07XG5leHBvcnQgZGVmYXVsdCBjb21tYW5kcztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQSxJQUFBQSxPQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxRQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxLQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRyxPQUFB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
|
|
207
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfc3VwcG9ydCIsIl9wYXRoIiwiX2RyaXZlciIsIl91dGlscyIsIkNPTlRBSU5FUl9QQVRIX01BUktFUiIsIkNPTlRBSU5FUl9QQVRIX1BBVFRFUk4iLCJSZWdFeHAiLCJBTkRST0lEX01FRElBX1JFU0NBTl9JTlRFTlQiLCJjb21tYW5kcyIsImV4cG9ydHMiLCJwYXJzZUNvbnRhaW5lclBhdGgiLCJyZW1vdGVQYXRoIiwibWF0Y2giLCJleGVjIiwiRXJyb3IiLCJwYXRoIiwicG9zaXgiLCJyZXNvbHZlIiwic2Nhbk1lZGlhIiwiYWRiIiwibG9nIiwiZGVidWciLCJnZXRBcGlMZXZlbCIsInNoZWxsIiwiZSIsIndhcm4iLCJzdGRlcnIiLCJtZXNzYWdlIiwiZXNjYXBlUGF0aCIsInAiLCJyZXBsYWNlIiwicHVsbEZpbGUiLCJlbmRzV2l0aCIsImVycm9ycyIsIkludmFsaWRBcmd1bWVudEVycm9yIiwidG1wRGVzdGluYXRpb24iLCJzdGFydHNXaXRoIiwicGFja2FnZUlkIiwicGF0aEluQ29udGFpbmVyIiwiYmFzZW5hbWUiLCJlcnJvckFuZFRocm93IiwibG9jYWxGaWxlIiwidGVtcERpciIsInByZWZpeCIsInN1ZmZpeCIsInB1bGwiLCJ1dGlsIiwidG9Jbk1lbW9yeUJhc2U2NCIsInRvU3RyaW5nIiwiZnMiLCJleGlzdHMiLCJ1bmxpbmsiLCJtb2JpbGVQdWxsRmlsZSIsIm9wdHMiLCJyZXF1aXJlQXJncyIsInB1c2hGaWxlIiwiYmFzZTY0RGF0YSIsIl8iLCJpc0FycmF5IiwiQnVmZmVyIiwiZnJvbSIsImNvbnRlbnQiLCJ3cml0ZUZpbGUiLCJkaXJuYW1lIiwicHVzaCIsIm1vYmlsZVB1c2hGaWxlIiwicGF5bG9hZCIsInB1bGxGb2xkZXIiLCJ0bXBSb290Iiwib3BlbkRpciIsInppcCIsInRvSW5NZW1vcnlaaXAiLCJlbmNvZGVUb0Jhc2U2NCIsInJpbXJhZiIsIm1vYmlsZVB1bGxGb2xkZXIiLCJkZWxldGVGaWxlT3JGb2xkZXIiLCJwZXJmb3JtUmVtb3RlRnNDaGVjayIsIm9wIiwicnVuQXMiLCJwYXNzRmxhZyIsImNoZWNrQ21kIiwiZnVsbENtZCIsImluY2x1ZGVzIiwiaWduIiwiaXNGaWxlIiwiaXNEaXIiLCJpc1ByZXNlbnQiLCJkc3RQYXRoIiwicGtnSWQiLCJpbmZvIiwiZXhwZWN0c0ZpbGUiLCJtb2JpbGVEZWxldGVGaWxlIiwiX2RlZmF1bHQiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL2ZpbGUtYWN0aW9ucy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZnMsIHV0aWwsIHppcCwgdGVtcERpciB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IGVycm9ycyB9IGZyb20gJ2FwcGl1bS9kcml2ZXInO1xuaW1wb3J0IHsgcmVxdWlyZUFyZ3MgfSBmcm9tICcuLi91dGlscyc7XG5cblxuY29uc3QgQ09OVEFJTkVSX1BBVEhfTUFSS0VSID0gJ0AnO1xuLy8gaHR0cHM6Ly9yZWdleDEwMS5jb20vci9QTGRCMEcvMlxuY29uc3QgQ09OVEFJTkVSX1BBVEhfUEFUVEVSTiA9IG5ldyBSZWdFeHAoYF4ke0NPTlRBSU5FUl9QQVRIX01BUktFUn0oW14vXSspLyguKylgKTtcbmNvbnN0IEFORFJPSURfTUVESUFfUkVTQ0FOX0lOVEVOVCA9ICdhbmRyb2lkLmludGVudC5hY3Rpb24uTUVESUFfU0NBTk5FUl9TQ0FOX0ZJTEUnO1xuXG5cbmNvbnN0IGNvbW1hbmRzID0ge307XG5cbi8qKlxuICogUGFyc2VzIHRoZSBhY3R1YWwgZGVzdGluYXRpb24gcGF0aCBmcm9tIHRoZSBnaXZlbiB2YWx1ZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByZW1vdGVQYXRoIFRoZSBwcmVmb3JtYXR0ZWQgcmVtb3RlIHBhdGgsIHdoaWNoIGxvb2tzIGxpa2VcbiAqIGBAbXkuYXBwLmlkL215L3BhdGhgXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gQW4gYXJyYXksIHdoZXJlIHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBwYXJzZWQgcGFja2FnZVxuICogaWRlbnRpZmllciBhbmQgdGhlIHNlY29uZCBvbmUgaXMgdGhlIGFjdHVhbCBkZXN0aW5hdGlvbiBwYXRoIGluc2lkZSB0aGUgcGFja2FnZS5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgZ2l2ZW4gc3RyaW5nIGNhbm5vdCBiZSBwYXJzZWRcbiAqL1xuZnVuY3Rpb24gcGFyc2VDb250YWluZXJQYXRoIChyZW1vdGVQYXRoKSB7XG4gIGNvbnN0IG1hdGNoID0gQ09OVEFJTkVSX1BBVEhfUEFUVEVSTi5leGVjKHJlbW90ZVBhdGgpO1xuICBpZiAoIW1hdGNoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJdCBpcyBleHBlY3RlZCB0aGF0IHBhY2thZ2UgaWRlbnRpZmllciBpcyBzZXBhcmF0ZWQgZnJvbSB0aGUgcmVsYXRpdmUgcGF0aCB3aXRoIGEgc2luZ2xlIHNsYXNoLiBgICtcbiAgICAgIGAnJHtyZW1vdGVQYXRofScgaXMgZ2l2ZW4gaW5zdGVhZGApO1xuICB9XG4gIHJldHVybiBbbWF0Y2hbMV0sIHBhdGgucG9zaXgucmVzb2x2ZShgL2RhdGEvZGF0YS8ke21hdGNoWzFdfWAsIG1hdGNoWzJdKV07XG59XG5cbi8qKlxuICogU2NhbnMgdGhlIGdpdmVuIGZpbGUvZm9sZGVyIG9uIHRoZSByZW1vdGUgZGV2aWNlXG4gKiBhbmQgYWRkcyBtYXRjaGluZyBpdGVtcyB0byB0aGUgZGV2aWNlJ3MgbWVkaWEgbGlicmFyeS5cbiAqIEV4Y2VwdGlvbnMgYXJlIGlnbm9yZWQgYW5kIHdyaXR0ZW4gaW50byB0aGUgbG9nLlxuICpcbiAqIEBwYXJhbSB7QURCfSBhZGIgQURCIGluc3RhbmNlXG4gKiBAcGFyYW0ge09iamVjdD99IGxvZyBMb2dnZXIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSByZW1vdGVQYXRoIFRoZSBmaWxlL2ZvbGRlciBwYXRoIG9uIHRoZSByZW1vdGUgZGV2aWNlXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNjYW5NZWRpYSAoYWRiLCByZW1vdGVQYXRoLCBsb2cgPSBudWxsKSB7XG4gIGxvZz8uZGVidWcoYFBlcmZvcm1pbmcgbWVkaWEgc2NhbiBvZiAnJHtyZW1vdGVQYXRofSdgKTtcbiAgdHJ5IHtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9pc3N1ZXMvMTYxODRcbiAgICBpZiAoYXdhaXQgYWRiLmdldEFwaUxldmVsKCkgPj0gMjkpIHtcbiAgICAgIGF3YWl0IGFkYi5zY2FuTWVkaWEocmVtb3RlUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IGFkYi5zaGVsbChbXG4gICAgICAgICdhbScsICdicm9hZGNhc3QnLFxuICAgICAgICAnLWEnLCBBTkRST0lEX01FRElBX1JFU0NBTl9JTlRFTlQsXG4gICAgICAgICctZCcsIGBmaWxlOi8vJHtyZW1vdGVQYXRofWBcbiAgICAgIF0pO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZz8ud2FybihgSWdub3JpbmcgYW4gdW5leHBlY3RlZCBlcnJvciB1cG9uIG1lZGlhIHNjYW5uaW5nIG9mICcke3JlbW90ZVBhdGh9JzogJHtlLnN0ZGVyciB8fCBlLm1lc3NhZ2V9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBIHNtYWxsIGhlbHBlciwgd2hpY2ggZXNjYXBlcyBzaW5nbGUgcXVvdGVzIGluIHBhdGhzLFxuICogc28gdGhleSBhcmUgc2FmZSB0byBiZSBwYXNzZWQgYXMgYXJndW1lbnRzIG9mIHNoZWxsIGNvbW1hbmRzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHAgVGhlIGluaXRpYWwgcmVtb3RlIHBhdGhcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBlc2NhcGVkIHBhdGggdmFsdWVcbiAqL1xuZnVuY3Rpb24gZXNjYXBlUGF0aCAocCkge1xuICByZXR1cm4gcC5yZXBsYWNlKC8nL2csIGBcXFxcJ2ApO1xufVxuXG4vKipcbiAqIFB1bGxzIGEgcmVtb3RlIGZpbGUgZnJvbSB0aGUgZGV2aWNlLlxuICogSXQgaXMgcmVxdWlyZWQsIHRoYXQgYSBwYWNrYWdlIGhhcyBkZWJ1Z2dpbmcgZmxhZyBlbmFibGVkXG4gKiBpbiBvcmRlciB0byBhY2Nlc3MgaXRzIGZpbGVzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByZW1vdGVQYXRoIFRoZSBmdWxsIHBhdGggdG8gdGhlIHJlbW90ZSBmaWxlXG4gKiBvciBhIHNwZWNpYWxseSBmb3JtYXR0ZWQgcGF0aCwgd2hpY2ggcG9pbnRzIHRvIGFuIGl0ZW0gaW5zaWRlIGFwcCBidW5kbGVcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEJhc2U2NCBlbmNvZGVkIGNvbnRlbnQgb2YgdGhlIHB1bGxlZCBmaWxlXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHB1bGwgb3BlcmF0aW9uIGZhaWxlZFxuICovXG5jb21tYW5kcy5wdWxsRmlsZSA9IGFzeW5jIGZ1bmN0aW9uIHB1bGxGaWxlIChyZW1vdGVQYXRoKSB7XG4gIGlmIChyZW1vdGVQYXRoLmVuZHNXaXRoKCcvJykpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRBcmd1bWVudEVycm9yKGBJdCBpcyBleHBlY3RlZCB0aGF0IHJlbW90ZSBwYXRoIHBvaW50cyB0byBhIGZpbGUgYW5kIG5vdCB0byBhIGZvbGRlci4gYCArXG4gICAgICBgJyR7cmVtb3RlUGF0aH0nIGlzIGdpdmVuIGluc3RlYWRgKTtcbiAgfVxuICBsZXQgdG1wRGVzdGluYXRpb24gPSBudWxsO1xuICBpZiAocmVtb3RlUGF0aC5zdGFydHNXaXRoKENPTlRBSU5FUl9QQVRIX01BUktFUikpIHtcbiAgICBjb25zdCBbcGFja2FnZUlkLCBwYXRoSW5Db250YWluZXJdID0gcGFyc2VDb250YWluZXJQYXRoKHJlbW90ZVBhdGgpO1xuICAgIHRoaXMubG9nLmRlYnVnKGBQYXJzZWQgcGFja2FnZSBpZGVudGlmaWVyICcke3BhY2thZ2VJZH0nIGZyb20gJyR7cmVtb3RlUGF0aH0nLiBXaWxsIGdldCB0aGUgZGF0YSBmcm9tICcke3BhdGhJbkNvbnRhaW5lcn0nYCk7XG4gICAgdG1wRGVzdGluYXRpb24gPSBgL2RhdGEvbG9jYWwvdG1wLyR7cGF0aC5wb3NpeC5iYXNlbmFtZShwYXRoSW5Db250YWluZXIpfWA7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsncnVuLWFzJywgcGFja2FnZUlkLCBgY2htb2QgNzc3ICcke2VzY2FwZVBhdGgocGF0aEluQ29udGFpbmVyKX0nYF0pO1xuICAgICAgYXdhaXQgdGhpcy5hZGIuc2hlbGwoW1xuICAgICAgICAncnVuLWFzJywgcGFja2FnZUlkLFxuICAgICAgICBgY3AgLWYgJyR7ZXNjYXBlUGF0aChwYXRoSW5Db250YWluZXIpfScgJyR7ZXNjYXBlUGF0aCh0bXBEZXN0aW5hdGlvbil9J2BcbiAgICAgIF0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYENhbm5vdCBhY2Nlc3MgdGhlIGNvbnRhaW5lciBvZiAnJHtwYWNrYWdlSWR9JyBhcHBsaWNhdGlvbi4gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgSXMgdGhlIGFwcGxpY2F0aW9uIGluc3RhbGxlZCBhbmQgaGFzICdkZWJ1Z2dhYmxlJyBidWlsZCBvcHRpb24gc2V0IHRvIHRydWU/IGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgbG9jYWxGaWxlID0gYXdhaXQgdGVtcERpci5wYXRoKHtwcmVmaXg6ICdhcHBpdW0nLCBzdWZmaXg6ICcudG1wJ30pO1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuYWRiLnB1bGwodG1wRGVzdGluYXRpb24gfHwgcmVtb3RlUGF0aCwgbG9jYWxGaWxlKTtcbiAgICByZXR1cm4gKGF3YWl0IHV0aWwudG9Jbk1lbW9yeUJhc2U2NChsb2NhbEZpbGUpKS50b1N0cmluZygpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChhd2FpdCBmcy5leGlzdHMobG9jYWxGaWxlKSkge1xuICAgICAgYXdhaXQgZnMudW5saW5rKGxvY2FsRmlsZSk7XG4gICAgfVxuICAgIGlmICh0bXBEZXN0aW5hdGlvbikge1xuICAgICAgYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydybScsICctZicsIHRtcERlc3RpbmF0aW9uXSk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFB1bGxGaWxlT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHJlbW90ZVBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgcmVtb3RlIGZpbGVcbiAqIG9yIGEgc3BlY2lhbGx5IGZvcm1hdHRlZCBwYXRoLCB3aGljaCBwb2ludHMgdG8gYW4gaXRlbSBpbnNpZGUgYW4gYXBwIGJ1bmRsZSxcbiAqIGZvciBleGFtcGxlIGBAbXkuYXBwLmlkL215L3BhdGhgLiBJdCBpcyBtYW5kYXRvcnkgZm9yIHRoZSBhcHAgYnVuZGxlIHRvIGhhdmVcbiAqIGRlYnVnZ2luZyBlbmFibGVkIGluIG9yZGVyIHRvIHVzZSB0aGUgbGF0dGVyIHJlbW90ZVBhdGggZm9ybWF0LlxuICovXG5cbi8qKlxuICogUHVsbHMgYSByZW1vdGUgZmlsZSBmcm9tIHRoZSBkZXZpY2UuXG4gKlxuICogQHBhcmFtIHtQdWxsRmlsZU9wdGlvbnN9IG9wdHNcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBzYW1lIGFzIGBwdWxsRmlsZWBcbiAqL1xuY29tbWFuZHMubW9iaWxlUHVsbEZpbGUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVQdWxsRmlsZSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHsgcmVtb3RlUGF0aCB9ID0gcmVxdWlyZUFyZ3MoJ3JlbW90ZVBhdGgnLCBvcHRzKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMucHVsbEZpbGUocmVtb3RlUGF0aCk7XG59O1xuXG4vKipcbiAqIFB1c2hlcyB0aGUgZ2l2ZW4gZGF0YSB0byBhIGZpbGUgb24gdGhlIHJlbW90ZSBkZXZpY2VcbiAqIEl0IGlzIHJlcXVpcmVkLCB0aGF0IGEgcGFja2FnZSBoYXMgZGVidWdnaW5nIGZsYWcgZW5hYmxlZFxuICogaW4gb3JkZXIgdG8gYWNjZXNzIGl0cyBmaWxlcy5cbiAqIEFmdGVyIGEgZmlsZSBpcyBwdXNoZWQgaXQgZ2V0cyBhdXRvbWF0aWNhbGx5IHNjYW5uZWQgZm9yIHBvc3NpYmxlXG4gKiBtZWRpYSBvY2N1cnJlbmNlcy4gSWYgdGhlIHNjYW4gc3VjY2VlZHMgdGhlbiB0aGUgZmlsZSBpcyBhZGRlZCB0byB0aGVcbiAqIG1lZGlhIGxpYnJhcnkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgcmVtb3RlIGZpbGUgb3JcbiAqIGEgZmlsZSBpbnNpZGUgYSBwYWNrYWdlIGJ1bmRsZVxuICogQHBhcmFtIHtzdHJpbmd9IGJhc2U2NERhdGEgQmFzZTY0IGVuY29kZWQgZGF0YSB0byBiZSB3cml0dGVuIHRvIHRoZVxuICogcmVtb3RlIGZpbGUuIFRoZSByZW1vdGUgZmlsZSB3aWxsIGJlIHNpbGVudGx5IG92ZXJyaWRkZW4gaWYgaXQgYWxyZWFkeSBleGlzdHMuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIHB1c2hpbmcgdGhlIGRhdGFcbiAqL1xuY29tbWFuZHMucHVzaEZpbGUgPSBhc3luYyBmdW5jdGlvbiBwdXNoRmlsZSAocmVtb3RlUGF0aCwgYmFzZTY0RGF0YSkge1xuICBpZiAocmVtb3RlUGF0aC5lbmRzV2l0aCgnLycpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihcbiAgICAgIGBJdCBpcyBleHBlY3RlZCB0aGF0IHJlbW90ZSBwYXRoIHBvaW50cyB0byBhIGZpbGUgYW5kIG5vdCB0byBhIGZvbGRlci4gYCArXG4gICAgICBgJyR7cmVtb3RlUGF0aH0nIGlzIGdpdmVuIGluc3RlYWRgXG4gICAgKTtcbiAgfVxuICBjb25zdCBsb2NhbEZpbGUgPSBhd2FpdCB0ZW1wRGlyLnBhdGgoe3ByZWZpeDogJ2FwcGl1bScsIHN1ZmZpeDogJy50bXAnfSk7XG4gIGlmIChfLmlzQXJyYXkoYmFzZTY0RGF0YSkpIHtcbiAgICAvLyBzb21lIGNsaWVudHMgKGFoZW0pIGphdmEsIHNlbmQgYSBieXRlIGFycmF5IGVuY29kaW5nIHV0ZjggY2hhcmFjdGVyc1xuICAgIC8vIGluc3RlYWQgb2YgYSBzdHJpbmcsIHdoaWNoIHdvdWxkIGJlIGluZmluaXRlbHkgYmV0dGVyIVxuICAgIGJhc2U2NERhdGEgPSBCdWZmZXIuZnJvbShiYXNlNjREYXRhKS50b1N0cmluZygndXRmOCcpO1xuICB9XG4gIGNvbnN0IGNvbnRlbnQgPSBCdWZmZXIuZnJvbShiYXNlNjREYXRhLCAnYmFzZTY0Jyk7XG4gIGxldCB0bXBEZXN0aW5hdGlvbiA9IG51bGw7XG4gIHRyeSB7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKGxvY2FsRmlsZSwgY29udGVudC50b1N0cmluZygnYmluYXJ5JyksICdiaW5hcnknKTtcbiAgICBpZiAocmVtb3RlUGF0aC5zdGFydHNXaXRoKENPTlRBSU5FUl9QQVRIX01BUktFUikpIHtcbiAgICAgIGNvbnN0IFtwYWNrYWdlSWQsIHBhdGhJbkNvbnRhaW5lcl0gPSBwYXJzZUNvbnRhaW5lclBhdGgocmVtb3RlUGF0aCk7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgUGFyc2VkIHBhY2thZ2UgaWRlbnRpZmllciAnJHtwYWNrYWdlSWR9JyBmcm9tICcke3JlbW90ZVBhdGh9Jy4gYCArXG4gICAgICAgIGBXaWxsIHB1dCB0aGUgZGF0YSBpbnRvICcke3BhdGhJbkNvbnRhaW5lcn0nYCk7XG4gICAgICB0bXBEZXN0aW5hdGlvbiA9IGAvZGF0YS9sb2NhbC90bXAvJHtwYXRoLnBvc2l4LmJhc2VuYW1lKHBhdGhJbkNvbnRhaW5lcil9YDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNoZWxsKFxuICAgICAgICAgIFsncnVuLWFzJywgcGFja2FnZUlkLCBgbWtkaXIgLXAgJyR7ZXNjYXBlUGF0aChwYXRoLnBvc2l4LmRpcm5hbWUocGF0aEluQ29udGFpbmVyKSl9J2BdXG4gICAgICAgICk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsncnVuLWFzJywgcGFja2FnZUlkLCBgdG91Y2ggJyR7ZXNjYXBlUGF0aChwYXRoSW5Db250YWluZXIpfSdgXSk7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsncnVuLWFzJywgcGFja2FnZUlkLCBgY2htb2QgNzc3ICcke2VzY2FwZVBhdGgocGF0aEluQ29udGFpbmVyKX0nYF0pO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5wdXNoKGxvY2FsRmlsZSwgdG1wRGVzdGluYXRpb24pO1xuICAgICAgICBhd2FpdCB0aGlzLmFkYi5zaGVsbChbXG4gICAgICAgICAgJ3J1bi1hcycsIHBhY2thZ2VJZCxcbiAgICAgICAgICBgY3AgLWYgJyR7ZXNjYXBlUGF0aCh0bXBEZXN0aW5hdGlvbil9JyAnJHtlc2NhcGVQYXRoKHBhdGhJbkNvbnRhaW5lcil9J2BcbiAgICAgICAgXSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYENhbm5vdCBhY2Nlc3MgdGhlIGNvbnRhaW5lciBvZiAnJHtwYWNrYWdlSWR9JyBhcHBsaWNhdGlvbi4gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGBJcyB0aGUgYXBwbGljYXRpb24gaW5zdGFsbGVkIGFuZCBoYXMgJ2RlYnVnZ2FibGUnIGJ1aWxkIG9wdGlvbiBzZXQgdG8gdHJ1ZT8gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGFkYiBwdXNoIGNyZWF0ZXMgZm9sZGVycyBhbmQgb3ZlcndyaXRlcyBleGlzdGluZyBmaWxlcy5cbiAgICAgIGF3YWl0IHRoaXMuYWRiLnB1c2gobG9jYWxGaWxlLCByZW1vdGVQYXRoKTtcblxuICAgICAgLy8gaWYgd2UgaGF2ZSBwdXNoZWQgYSBmaWxlLCBpdCBtaWdodCBiZSBhIG1lZGlhIGZpbGUsIHNvIGVuc3VyZSB0aGF0XG4gICAgICAvLyBhcHBzIGtub3cgYWJvdXQgaXRcbiAgICAgIGF3YWl0IHNjYW5NZWRpYSh0aGlzLmFkYiwgcmVtb3RlUGF0aCwgdGhpcy5sb2cpO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKGxvY2FsRmlsZSkpIHtcbiAgICAgIGF3YWl0IGZzLnVubGluayhsb2NhbEZpbGUpO1xuICAgIH1cbiAgICBpZiAodG1wRGVzdGluYXRpb24pIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsncm0nLCAnLWYnLCB0bXBEZXN0aW5hdGlvbl0pO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQdXNoRmlsZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByZW1vdGVQYXRoIFRoZSBmdWxsIHBhdGggdG8gdGhlIHJlbW90ZSBmaWxlXG4gKiBvciBhIHNwZWNpYWxseSBmb3JtYXR0ZWQgcGF0aCwgd2hpY2ggcG9pbnRzIHRvIGFuIGl0ZW0gaW5zaWRlIGFuIGFwcCBidW5kbGUsXG4gKiBmb3IgZXhhbXBsZSBgQG15LmFwcC5pZC9teS9wYXRoYC4gSXQgaXMgbWFuZGF0b3J5IGZvciB0aGUgYXBwIGJ1bmRsZSB0byBoYXZlXG4gKiBkZWJ1Z2dpbmcgZW5hYmxlZCBpbiBvcmRlciB0byB1c2UgdGhlIGxhdHRlciByZW1vdGVQYXRoIGZvcm1hdC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXlsb2FkIEJhc2U2NC1lbmNvZGVkIGNvbnRlbnQgb2YgdGhlIGZpbGUgdG8gYmUgcHVzaGVkLlxuICovXG5cbi8qKlxuICogUHVzaGVzIHRoZSBnaXZlbiBkYXRhIHRvIGEgZmlsZSBvbiB0aGUgcmVtb3RlIGRldmljZS5cbiAqXG4gKiBAcGFyYW0ge1B1c2hGaWxlT3B0aW9uc30gb3B0c1xuICovXG5jb21tYW5kcy5tb2JpbGVQdXNoRmlsZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVB1c2hGaWxlIChvcHRzID0ge30pIHtcbiAgY29uc3QgeyByZW1vdGVQYXRoLCBwYXlsb2FkIH0gPSByZXF1aXJlQXJncyhbJ3JlbW90ZVBhdGgnLCAncGF5bG9hZCddLCBvcHRzKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMucHVzaEZpbGUocmVtb3RlUGF0aCwgcGF5bG9hZCk7XG59O1xuXG4vKipcbiAqIFB1bGxzIHRoZSB3aG9sZSBmb2xkZXIgZnJvbSB0aGUgcmVtb3RlIGRldmljZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByZW1vdGVQYXRoIFRoZSBmdWxsIHBhdGggdG8gYSBmb2xkZXIgb24gdGhlXG4gKiByZW1vdGUgZGV2aWNlIG9yIGEgZm9sZGVyIGluc2lkZSBhbiBhcHBsaWNhdGlvbiBidW5kbGVcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEJhc2U2NC1lbmNvZGVkIGFuZCB6aXBwZWQgY29udGVudCBvZiB0aGUgZm9sZGVyXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGEgZmFpbHVyZSB3aGlsZSBnZXR0aW5nIHRoZSBmb2xkZXIgY29udGVudFxuICovXG5jb21tYW5kcy5wdWxsRm9sZGVyID0gYXN5bmMgZnVuY3Rpb24gcHVsbEZvbGRlciAocmVtb3RlUGF0aCkge1xuICBjb25zdCB0bXBSb290ID0gYXdhaXQgdGVtcERpci5vcGVuRGlyKCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5hZGIucHVsbChyZW1vdGVQYXRoLCB0bXBSb290KTtcbiAgICByZXR1cm4gKGF3YWl0IHppcC50b0luTWVtb3J5WmlwKHRtcFJvb3QsIHtcbiAgICAgIGVuY29kZVRvQmFzZTY0OiB0cnVlLFxuICAgIH0pKS50b1N0cmluZygpO1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IGZzLnJpbXJhZih0bXBSb290KTtcbiAgfVxufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQdWxsRm9sZGVyT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHJlbW90ZVBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgcmVtb3RlIGZvbGRlci5cbiAqL1xuXG4vKipcbiAqIFB1bGxzIHRoZSB3aG9sZSBmb2xkZXIgZnJvbSB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtQdWxsRm9sZGVyT3B0aW9uc30gb3B0c1xuICogQHJldHVybnMge3N0cmluZ30gVGhlIHNhbWUgYXMgYHB1bGxGb2xkZXJgXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVB1bGxGb2xkZXIgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVQdWxsRm9sZGVyIChvcHRzID0ge30pIHtcbiAgY29uc3QgeyByZW1vdGVQYXRoIH0gPSByZXF1aXJlQXJncygncmVtb3RlUGF0aCcsIG9wdHMpO1xuICByZXR1cm4gYXdhaXQgdGhpcy5wdWxsRm9sZGVyKHJlbW90ZVBhdGgpO1xufTtcblxuLyoqXG4gKiBEZWxldGVzIHRoZSBnaXZlbiBmb2xkZXIgb3IgZmlsZSBmcm9tIHRoZSByZW1vdGUgZGV2aWNlXG4gKlxuICogQHBhcmFtIHtBREJ9IGFkYlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgcmVtb3RlIGZvbGRlclxuICogb3IgZmlsZSAoZm9sZGVyIG5hbWVzIG11c3QgZW5kIHdpdGggYSBzaW5nbGUgc2xhc2gpXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHByb3ZpZGVkIHJlbW90ZSBwYXRoIGlzIGludmFsaWQgb3JcbiAqIHRoZSBwYWNrYWdlIGNvbnRlbnQgY2Fubm90IGJlIGFjY2Vzc2VkXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSByZW1vdGUgaXRlbSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZGVsZXRlZC5cbiAqIElmIHRoZSByZW1vdGUgcGF0aCBpcyB2YWxpZCwgYnV0IHRoZSByZW1vdGUgcGF0aCBkb2VzIG5vdCBleGlzdFxuICogdGhpcyBmdW5jdGlvbiByZXR1cm4gYGZhbHNlYC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGVsZXRlRmlsZU9yRm9sZGVyIChhZGIsIHJlbW90ZVBhdGgpIHtcbiAgY29uc3QgcGVyZm9ybVJlbW90ZUZzQ2hlY2sgPSBhc3luYyAocCwgb3AsIHJ1bkFzID0gbnVsbCkgPT4ge1xuICAgIGNvbnN0IHBhc3NGbGFnID0gJ19fUEFTU19fJztcbiAgICBjb25zdCBjaGVja0NtZCA9IGBbIC0ke29wfSAnJHtlc2NhcGVQYXRoKHApfScgXSAmJiBlY2hvICR7cGFzc0ZsYWd9YDtcbiAgICBjb25zdCBmdWxsQ21kID0gcnVuQXMgPyBgcnVuLWFzICR7cnVuQXN9ICR7Y2hlY2tDbWR9YCA6IGNoZWNrQ21kO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gXy5pbmNsdWRlcyhhd2FpdCBhZGIuc2hlbGwoW2Z1bGxDbWRdKSwgcGFzc0ZsYWcpO1xuICAgIH0gY2F0Y2ggKGlnbikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgaXNGaWxlID0gYXN5bmMgKHAsIHJ1bkFzID0gbnVsbCkgPT4gYXdhaXQgcGVyZm9ybVJlbW90ZUZzQ2hlY2socCwgJ2YnLCBydW5Bcyk7XG4gIGNvbnN0IGlzRGlyID0gYXN5bmMgKHAsIHJ1bkFzID0gbnVsbCkgPT4gYXdhaXQgcGVyZm9ybVJlbW90ZUZzQ2hlY2socCwgJ2QnLCBydW5Bcyk7XG4gIGNvbnN0IGlzUHJlc2VudCA9IGFzeW5jIChwLCBydW5BcyA9IG51bGwpID0+IGF3YWl0IHBlcmZvcm1SZW1vdGVGc0NoZWNrKHAsICdlJywgcnVuQXMpO1xuXG4gIGxldCBkc3RQYXRoID0gcmVtb3RlUGF0aDtcbiAgbGV0IHBrZ0lkID0gbnVsbDtcbiAgaWYgKHJlbW90ZVBhdGguc3RhcnRzV2l0aChDT05UQUlORVJfUEFUSF9NQVJLRVIpKSB7XG4gICAgY29uc3QgW3BhY2thZ2VJZCwgcGF0aEluQ29udGFpbmVyXSA9IHBhcnNlQ29udGFpbmVyUGF0aChyZW1vdGVQYXRoKTtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgUGFyc2VkIHBhY2thZ2UgaWRlbnRpZmllciAnJHtwYWNrYWdlSWR9JyBmcm9tICcke3JlbW90ZVBhdGh9J2ApO1xuICAgIGRzdFBhdGggPSBwYXRoSW5Db250YWluZXI7XG4gICAgcGtnSWQgPSBwYWNrYWdlSWQ7XG4gIH1cblxuICBpZiAocGtnSWQpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgYWRiLnNoZWxsKFsncnVuLWFzJywgcGtnSWQsICdscyddKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBDYW5ub3QgYWNjZXNzIHRoZSBjb250YWluZXIgb2YgJyR7cGtnSWR9JyBhcHBsaWNhdGlvbi4gYCArXG4gICAgICAgIGBJcyB0aGUgYXBwbGljYXRpb24gaW5zdGFsbGVkIGFuZCBoYXMgJ2RlYnVnZ2FibGUnIGJ1aWxkIG9wdGlvbiBzZXQgdG8gdHJ1ZT8gYCArXG4gICAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFhd2FpdCBpc1ByZXNlbnQoZHN0UGF0aCwgcGtnSWQpKSB7XG4gICAgdGhpcy5sb2cuaW5mbyhgVGhlIGl0ZW0gYXQgJyR7ZHN0UGF0aH0nIGRvZXMgbm90IGV4aXN0LiBQZXJoYXBzLCBhbHJlYWR5IGRlbGV0ZWQ/YCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgZXhwZWN0c0ZpbGUgPSAhcmVtb3RlUGF0aC5lbmRzV2l0aCgnLycpO1xuICBpZiAoZXhwZWN0c0ZpbGUgJiYgIWF3YWl0IGlzRmlsZShkc3RQYXRoLCBwa2dJZCkpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBUaGUgaXRlbSBhdCAnJHtkc3RQYXRofScgaXMgbm90IGEgZmlsZWApO1xuICB9IGVsc2UgaWYgKCFleHBlY3RzRmlsZSAmJiAhYXdhaXQgaXNEaXIoZHN0UGF0aCwgcGtnSWQpKSB7XG4gICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgVGhlIGl0ZW0gYXQgJyR7ZHN0UGF0aH0nIGlzIG5vdCBhIGZvbGRlcmApO1xuICB9XG5cbiAgaWYgKHBrZ0lkKSB7XG4gICAgYXdhaXQgYWRiLnNoZWxsKFxuICAgICAgWydydW4tYXMnLCBwa2dJZCwgYHJtIC1mJHtleHBlY3RzRmlsZSA/ICcnIDogJ3InfSAnJHtlc2NhcGVQYXRoKGRzdFBhdGgpfSdgXSk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgYWRiLnNoZWxsKFsncm0nLCBgLWYke2V4cGVjdHNGaWxlID8gJycgOiAncid9YCwgZHN0UGF0aF0pO1xuICB9XG4gIGlmIChhd2FpdCBpc1ByZXNlbnQoZHN0UGF0aCwgcGtnSWQpKSB7XG4gICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgVGhlIGl0ZW0gYXQgJyR7ZHN0UGF0aH0nIHN0aWxsIGV4aXN0cyBhZnRlciBiZWluZyBkZWxldGVkLiBgICtcbiAgICAgIGBJcyBpdCB3cml0YWJsZT9gKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBEZWxldGVGaWxlT3B0c1xuICogQHByb3BlcnR5IHshc3RyaW5nfSByZW1vdGVQYXRoIFRoZSBmdWxsIHBhdGggdG8gdGhlIHJlbW90ZSBmaWxlXG4gKiBvciBhIGZpbGUgaW5zaWRlIGFuIGFwcGxpY2F0aW9uIGJ1bmRsZSAoZm9yIGV4YW1wbGUgYEBteS5hcHAuaWQvcGF0aC9pbi9idW5kbGVgKVxuICovXG5cbi8qKlxuICogRGVsZXRlcyBhIGZpbGUgb24gdGhlIHJlbW90ZSBkZXZpY2VcbiAqXG4gKiBAcGFyYW0ge0RlbGV0ZUZpbGVPcHRzfSBvcHRzXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSByZW1vdGUgZmlsZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZGVsZXRlZC5cbiAqIElmIHRoZSBwYXRoIHRvIGEgcmVtb3RlIGZpbGUgaXMgdmFsaWQsIGJ1dCB0aGUgZmlsZSBpdHNlbGYgZG9lcyBub3QgZXhpc3RcbiAqIHRoZW4gYGZhbHNlYCBpcyByZXR1cm5lZC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgYXJndW1lbnQgaXMgaW52YWxpZCBvciB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGVcbiAqIGRlbGV0aW5nIHRoZSBmaWxlXG4gKi9cbmNvbW1hbmRzLm1vYmlsZURlbGV0ZUZpbGUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVEZWxldGVGaWxlIChvcHRzID0ge30pIHtcbiAgY29uc3Qge3JlbW90ZVBhdGh9ID0gb3B0cztcbiAgaWYgKCFyZW1vdGVQYXRoKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgVGhlICdyZW1vdGVQYXRoJyBhcmd1bWVudCBpcyBtYW5kYXRvcnlgKTtcbiAgfVxuICBpZiAocmVtb3RlUGF0aC5lbmRzV2l0aCgnLycpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihcbiAgICAgIGBJdCBpcyBleHBlY3RlZCB0aGF0IHJlbW90ZSBwYXRoIHBvaW50cyB0byBhIGZvbGRlciBhbmQgbm90IHRvIGEgZmlsZS4gYCArXG4gICAgICBgJyR7cmVtb3RlUGF0aH0nIGlzIGdpdmVuIGluc3RlYWRgXG4gICAgKTtcbiAgfVxuICByZXR1cm4gYXdhaXQgZGVsZXRlRmlsZU9yRm9sZGVyKHRoaXMuYWRiLCByZW1vdGVQYXRoKTtcbn07XG5cbmV4cG9ydCB7IGNvbW1hbmRzIH07XG5leHBvcnQgZGVmYXVsdCBjb21tYW5kcztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQSxJQUFBQSxPQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxRQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxLQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRyxPQUFB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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-actions.js","names":["_lodash","_interopRequireDefault","require","_support","_path","_driver","_utils","CONTAINER_PATH_MARKER","CONTAINER_PATH_PATTERN","RegExp","ANDROID_MEDIA_RESCAN_INTENT","commands","exports","parseContainerPath","remotePath","match","exec","Error","path","posix","resolve","scanMedia","adb","log","debug","getApiLevel","shell","e","warn","stderr","message","escapePath","p","replace","pullFile","endsWith","errors","InvalidArgumentError","tmpDestination","startsWith","packageId","pathInContainer","basename","errorAndThrow","localFile","tempDir","prefix","suffix","pull","util","toInMemoryBase64","toString","fs","exists","unlink","mobilePullFile","opts","requireArgs","pushFile","base64Data","_","isArray","Buffer","from","content","writeFile","dirname","push","mobilePushFile","payload","pullFolder","tmpRoot","openDir","zip","toInMemoryZip","encodeToBase64","rimraf","mobilePullFolder","deleteFileOrFolder","performRemoteFsCheck","op","runAs","passFlag","checkCmd","fullCmd","includes","ign","isFile","isDir","isPresent","dstPath","pkgId","info","expectsFile","mobileDeleteFile","_default","default"],"sources":["../../../lib/commands/file-actions.js"],"sourcesContent":["import _ from 'lodash';\nimport { fs, util, zip, tempDir } from '@appium/support';\nimport path from 'path';\nimport { errors } from 'appium/driver';\nimport { requireArgs } from '../utils';\n\n\nconst CONTAINER_PATH_MARKER = '@';\n// https://regex101.com/r/PLdB0G/2\nconst CONTAINER_PATH_PATTERN = new RegExp(`^${CONTAINER_PATH_MARKER}([^/]+)/(.+)`);\nconst ANDROID_MEDIA_RESCAN_INTENT = 'android.intent.action.MEDIA_SCANNER_SCAN_FILE';\n\n\nconst commands = {};\n\n/**\n * Parses the actual destination path from the given value\n *\n * @param {string} remotePath The preformatted remote path, which looks like\n * `@my.app.id/my/path`\n * @returns {Array<string>} An array, where the first item is the parsed package\n * identifier and the second one is the actual destination path inside the package.\n * @throws {Error} If the given string cannot be parsed\n */\nfunction parseContainerPath (remotePath) {\n const match = CONTAINER_PATH_PATTERN.exec(remotePath);\n if (!match) {\n throw new Error(`It is expected that package identifier is separated from the relative path with a single slash. ` +\n `'${remotePath}' is given instead`);\n }\n return [match[1], path.posix.resolve(`/data/data/${match[1]}`, match[2])];\n}\n\n/**\n * Scans the given file/folder on the remote device\n * and adds matching items to the device's media library.\n * Exceptions are ignored and written into the log.\n *\n * @param {ADB} adb ADB instance\n * @param {Object?} log Logger instance\n * @param {string} remotePath The file/folder path on the remote device\n */\nasync function scanMedia (adb, remotePath, log = null) {\n log?.debug(`Performing media scan of '${remotePath}'`);\n try {\n // https://github.com/appium/appium/issues/16184\n if (await adb.getApiLevel() >= 29) {\n await adb.scanMedia(remotePath);\n } else {\n await adb.shell([\n 'am', 'broadcast',\n '-a', ANDROID_MEDIA_RESCAN_INTENT,\n '-d', `file://${remotePath}`\n ]);\n }\n } catch (e) {\n log?.warn(`Ignoring an unexpected error upon media scanning of '${remotePath}': ${e.stderr || e.message}`);\n }\n}\n\n/**\n * A small helper, which escapes single quotes in paths,\n * so they are safe to be passed as arguments of shell commands\n *\n * @param {string} p The initial remote path\n * @returns {string} The escaped path value\n */\nfunction escapePath (p) {\n return p.replace(/'/g, `\\\\'`);\n}\n\n/**\n * Pulls a remote file from the device.\n * It is required, that a package has debugging flag enabled\n * in order to access its files.\n *\n * @param {string} remotePath The full path to the remote file\n * or a specially formatted path, which points to an item inside app bundle\n * @returns {string} Base64 encoded content of the pulled file\n * @throws {Error} If the pull operation failed\n */\ncommands.pullFile = async function pullFile (remotePath) {\n if (remotePath.endsWith('/')) {\n throw new errors.InvalidArgumentError(`It is expected that remote path points to a file and not to a folder. ` +\n `'${remotePath}' is given instead`);\n }\n let tmpDestination = null;\n if (remotePath.startsWith(CONTAINER_PATH_MARKER)) {\n const [packageId, pathInContainer] = parseContainerPath(remotePath);\n this.log.debug(`Parsed package identifier '${packageId}' from '${remotePath}'. Will get the data from '${pathInContainer}'`);\n tmpDestination = `/data/local/tmp/${path.posix.basename(pathInContainer)}`;\n try {\n await this.adb.shell(['run-as', packageId, `chmod 777 '${escapePath(pathInContainer)}'`]);\n await this.adb.shell([\n 'run-as', packageId,\n `cp -f '${escapePath(pathInContainer)}' '${escapePath(tmpDestination)}'`\n ]);\n } catch (e) {\n this.log.errorAndThrow(`Cannot access the container of '${packageId}' application. ` +\n `Is the application installed and has 'debuggable' build option set to true? ` +\n `Original error: ${e.message}`);\n }\n }\n const localFile = await tempDir.path({prefix: 'appium', suffix: '.tmp'});\n try {\n await this.adb.pull(tmpDestination || remotePath, localFile);\n return (await util.toInMemoryBase64(localFile)).toString();\n } finally {\n if (await fs.exists(localFile)) {\n await fs.unlink(localFile);\n }\n if (tmpDestination) {\n await this.adb.shell(['rm', '-f', tmpDestination]);\n }\n }\n};\n\n/**\n * @typedef {Object} PullFileOptions\n * @property {string} remotePath The full path to the remote file\n * or a specially formatted path, which points to an item inside an app bundle,\n * for example `@my.app.id/my/path`. It is mandatory for the app bundle to have\n * debugging enabled in order to use the latter remotePath format.\n */\n\n/**\n * Pulls a remote file from the device.\n *\n * @param {PullFileOptions} opts\n * @returns {string} The same as `pullFile`\n */\ncommands.mobilePullFile = async function mobilePullFile (opts = {}) {\n const { remotePath } = requireArgs('remotePath', opts);\n return await this.pullFile(remotePath);\n};\n\n/**\n * Pushes the given data to a file on the remote device\n * It is required, that a package has debugging flag enabled\n * in order to access its files.\n * After a file is pushed it gets automatically scanned for possible\n * media occurrences. If the scan succeeds then the file is added to the\n * media library.\n *\n * @param {string} remotePath The full path to the remote file or\n * a file inside a package bundle\n * @param {string} base64Data Base64 encoded data to be written to the\n * remote file. The remote file will be silently overridden if it already exists.\n * @throws {Error} If there was an error while pushing the data\n */\ncommands.pushFile = async function pushFile (remotePath, base64Data) {\n if (remotePath.endsWith('/')) {\n throw new errors.InvalidArgumentError(\n `It is expected that remote path points to a file and not to a folder. ` +\n `'${remotePath}' is given instead`\n );\n }\n const localFile = await tempDir.path({prefix: 'appium', suffix: '.tmp'});\n if (_.isArray(base64Data)) {\n // some clients (ahem) java, send a byte array encoding utf8 characters\n // instead of a string, which would be infinitely better!\n base64Data = Buffer.from(base64Data).toString('utf8');\n }\n const content = Buffer.from(base64Data, 'base64');\n let tmpDestination = null;\n try {\n await fs.writeFile(localFile, content.toString('binary'), 'binary');\n if (remotePath.startsWith(CONTAINER_PATH_MARKER)) {\n const [packageId, pathInContainer] = parseContainerPath(remotePath);\n this.log.debug(`Parsed package identifier '${packageId}' from '${remotePath}'. ` +\n `Will put the data into '${pathInContainer}'`);\n tmpDestination = `/data/local/tmp/${path.posix.basename(pathInContainer)}`;\n try {\n await this.adb.shell(\n ['run-as', packageId, `mkdir -p '${escapePath(path.posix.dirname(pathInContainer))}'`]\n );\n await this.adb.shell(['run-as', packageId, `touch '${escapePath(pathInContainer)}'`]);\n await this.adb.shell(['run-as', packageId, `chmod 777 '${escapePath(pathInContainer)}'`]);\n await this.adb.push(localFile, tmpDestination);\n await this.adb.shell([\n 'run-as', packageId,\n `cp -f '${escapePath(tmpDestination)}' '${escapePath(pathInContainer)}'`\n ]);\n } catch (e) {\n this.log.errorAndThrow(`Cannot access the container of '${packageId}' application. ` +\n `Is the application installed and has 'debuggable' build option set to true? ` +\n `Original error: ${e.message}`);\n }\n } else {\n // adb push creates folders and overwrites existing files.\n await this.adb.push(localFile, remotePath);\n\n // if we have pushed a file, it might be a media file, so ensure that\n // apps know about it\n await scanMedia(this.adb, remotePath, this.log);\n }\n } finally {\n if (await fs.exists(localFile)) {\n await fs.unlink(localFile);\n }\n if (tmpDestination) {\n await this.adb.shell(['rm', '-f', tmpDestination]);\n }\n }\n};\n\n/**\n * @typedef {Object} PushFileOptions\n * @property {string} remotePath The full path to the remote file\n * or a specially formatted path, which points to an item inside an app bundle,\n * for example `@my.app.id/my/path`. It is mandatory for the app bundle to have\n * debugging enabled in order to use the latter remotePath format.\n * @property {string} payload Base64-encoded content of the file to be pushed.\n */\n\n/**\n * Pushes the given data to a file on the remote device.\n *\n * @param {PushFileOptions} opts\n */\ncommands.mobilePushFile = async function mobilePushFile (opts = {}) {\n const { remotePath, payload } = requireArgs(['remotePath', 'payload'], opts);\n return await this.pushFile(remotePath, payload);\n};\n\n/**\n * Pulls the whole folder from the remote device\n *\n * @param {string} remotePath The full path to a folder on the\n * remote device or a folder inside an application bundle\n * @returns {string} Base64-encoded and zipped content of the folder\n * @throws {Error} If there was a failure while getting the folder content\n */\ncommands.pullFolder = async function pullFolder (remotePath) {\n const tmpRoot = await tempDir.openDir();\n try {\n await this.adb.pull(remotePath, tmpRoot);\n return (await zip.toInMemoryZip(tmpRoot, {\n encodeToBase64: true,\n })).toString();\n } finally {\n await fs.rimraf(tmpRoot);\n }\n};\n\n/**\n * @typedef {Object} PullFolderOptions\n * @property {string} remotePath The full path to the remote folder.\n */\n\n/**\n * Pulls the whole folder from the device under test.\n *\n * @param {PullFolderOptions} opts\n * @returns {string} The same as `pullFolder`\n */\ncommands.mobilePullFolder = async function mobilePullFolder (opts = {}) {\n const { remotePath } = requireArgs('remotePath', opts);\n return await this.pullFolder(remotePath);\n};\n\n/**\n * Deletes the given folder or file from the remote device\n *\n * @param {ADB} adb\n * @param {string} remotePath The full path to the remote folder\n * or file (folder names must end with a single slash)\n * @throws {Error} If the provided remote path is invalid or\n * the package content cannot be accessed\n * @returns {boolean} `true` if the remote item has been successfully deleted.\n * If the remote path is valid, but the remote path does not exist\n * this function return `false`.\n */\nasync function deleteFileOrFolder (adb, remotePath) {\n const performRemoteFsCheck = async (p, op, runAs = null) => {\n const passFlag = '__PASS__';\n const checkCmd = `[ -${op} '${escapePath(p)}' ] && echo ${passFlag}`;\n const fullCmd = runAs ? `run-as ${runAs} ${checkCmd}` : checkCmd;\n try {\n return _.includes(await adb.shell([fullCmd]), passFlag);\n } catch (ign) {\n return false;\n }\n };\n const isFile = async (p, runAs = null) => await performRemoteFsCheck(p, 'f', runAs);\n const isDir = async (p, runAs = null) => await performRemoteFsCheck(p, 'd', runAs);\n const isPresent = async (p, runAs = null) => await performRemoteFsCheck(p, 'e', runAs);\n\n let dstPath = remotePath;\n let pkgId = null;\n if (remotePath.startsWith(CONTAINER_PATH_MARKER)) {\n const [packageId, pathInContainer] = parseContainerPath(remotePath);\n this.log.debug(`Parsed package identifier '${packageId}' from '${remotePath}'`);\n dstPath = pathInContainer;\n pkgId = packageId;\n }\n\n if (pkgId) {\n try {\n await adb.shell(['run-as', pkgId, 'ls']);\n } catch (e) {\n this.log.errorAndThrow(`Cannot access the container of '${pkgId}' application. ` +\n `Is the application installed and has 'debuggable' build option set to true? ` +\n `Original error: ${e.message}`);\n }\n }\n\n if (!await isPresent(dstPath, pkgId)) {\n this.log.info(`The item at '${dstPath}' does not exist. Perhaps, already deleted?`);\n return false;\n }\n\n const expectsFile = !remotePath.endsWith('/');\n if (expectsFile && !await isFile(dstPath, pkgId)) {\n this.log.errorAndThrow(`The item at '${dstPath}' is not a file`);\n } else if (!expectsFile && !await isDir(dstPath, pkgId)) {\n this.log.errorAndThrow(`The item at '${dstPath}' is not a folder`);\n }\n\n if (pkgId) {\n await adb.shell(\n ['run-as', pkgId, `rm -f${expectsFile ? '' : 'r'} '${escapePath(dstPath)}'`]);\n } else {\n await adb.shell(['rm', `-f${expectsFile ? '' : 'r'}`, dstPath]);\n }\n if (await isPresent(dstPath, pkgId)) {\n this.log.errorAndThrow(`The item at '${dstPath}' still exists after being deleted. ` +\n `Is it writable?`);\n }\n return true;\n}\n\n/**\n * @typedef {Object} DeleteFileOpts\n * @property {!string} remotePath The full path to the remote file\n * or a file inside an application bundle (for example `@my.app.id/path/in/bundle`)\n */\n\n/**\n * Deletes a file on the remote device\n *\n * @param {DeleteFileOpts} opts\n * @returns {boolean} `true` if the remote file has been successfully deleted.\n * If the path to a remote file is valid, but the file itself does not exist\n * then `false` is returned.\n * @throws {Error} If the argument is invalid or there was an error while\n * deleting the file\n */\ncommands.mobileDeleteFile = async function mobileDeleteFile (opts = {}) {\n const {remotePath} = opts;\n if (!remotePath) {\n throw new errors.InvalidArgumentError(`The 'remotePath' argument is mandatory`);\n }\n if (remotePath.endsWith('/')) {\n throw new errors.InvalidArgumentError(\n `It is expected that remote path points to a folder and not to a file. ` +\n `'${remotePath}' is given instead`\n );\n }\n return await deleteFileOrFolder(this.adb, remotePath);\n};\n\nexport { commands };\nexport default commands;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"file-actions.js","names":["_lodash","_interopRequireDefault","require","_support","_path","_driver","_utils","CONTAINER_PATH_MARKER","CONTAINER_PATH_PATTERN","RegExp","ANDROID_MEDIA_RESCAN_INTENT","commands","exports","parseContainerPath","remotePath","match","exec","Error","path","posix","resolve","scanMedia","adb","log","debug","getApiLevel","shell","e","warn","stderr","message","escapePath","p","replace","pullFile","endsWith","errors","InvalidArgumentError","tmpDestination","startsWith","packageId","pathInContainer","basename","errorAndThrow","localFile","tempDir","prefix","suffix","pull","util","toInMemoryBase64","toString","fs","exists","unlink","mobilePullFile","opts","requireArgs","pushFile","base64Data","_","isArray","Buffer","from","content","writeFile","dirname","push","mobilePushFile","payload","pullFolder","tmpRoot","openDir","zip","toInMemoryZip","encodeToBase64","rimraf","mobilePullFolder","deleteFileOrFolder","performRemoteFsCheck","op","runAs","passFlag","checkCmd","fullCmd","includes","ign","isFile","isDir","isPresent","dstPath","pkgId","info","expectsFile","mobileDeleteFile","_default","default"],"sources":["../../../lib/commands/file-actions.js"],"sourcesContent":["import _ from 'lodash';\nimport { fs, util, zip, tempDir } from '@appium/support';\nimport path from 'path';\nimport { errors } from 'appium/driver';\nimport { requireArgs } from '../utils';\n\n\nconst CONTAINER_PATH_MARKER = '@';\n// https://regex101.com/r/PLdB0G/2\nconst CONTAINER_PATH_PATTERN = new RegExp(`^${CONTAINER_PATH_MARKER}([^/]+)/(.+)`);\nconst ANDROID_MEDIA_RESCAN_INTENT = 'android.intent.action.MEDIA_SCANNER_SCAN_FILE';\n\n\nconst commands = {};\n\n/**\n * Parses the actual destination path from the given value\n *\n * @param {string} remotePath The preformatted remote path, which looks like\n * `@my.app.id/my/path`\n * @returns {Array<string>} An array, where the first item is the parsed package\n * identifier and the second one is the actual destination path inside the package.\n * @throws {Error} If the given string cannot be parsed\n */\nfunction parseContainerPath (remotePath) {\n const match = CONTAINER_PATH_PATTERN.exec(remotePath);\n if (!match) {\n throw new Error(`It is expected that package identifier is separated from the relative path with a single slash. ` +\n `'${remotePath}' is given instead`);\n }\n return [match[1], path.posix.resolve(`/data/data/${match[1]}`, match[2])];\n}\n\n/**\n * Scans the given file/folder on the remote device\n * and adds matching items to the device's media library.\n * Exceptions are ignored and written into the log.\n *\n * @param {ADB} adb ADB instance\n * @param {Object?} log Logger instance\n * @param {string} remotePath The file/folder path on the remote device\n */\nasync function scanMedia (adb, remotePath, log = null) {\n log?.debug(`Performing media scan of '${remotePath}'`);\n try {\n // https://github.com/appium/appium/issues/16184\n if (await adb.getApiLevel() >= 29) {\n await adb.scanMedia(remotePath);\n } else {\n await adb.shell([\n 'am', 'broadcast',\n '-a', ANDROID_MEDIA_RESCAN_INTENT,\n '-d', `file://${remotePath}`\n ]);\n }\n } catch (e) {\n log?.warn(`Ignoring an unexpected error upon media scanning of '${remotePath}': ${e.stderr || e.message}`);\n }\n}\n\n/**\n * A small helper, which escapes single quotes in paths,\n * so they are safe to be passed as arguments of shell commands\n *\n * @param {string} p The initial remote path\n * @returns {string} The escaped path value\n */\nfunction escapePath (p) {\n return p.replace(/'/g, `\\\\'`);\n}\n\n/**\n * Pulls a remote file from the device.\n * It is required, that a package has debugging flag enabled\n * in order to access its files.\n *\n * @param {string} remotePath The full path to the remote file\n * or a specially formatted path, which points to an item inside app bundle\n * @returns {string} Base64 encoded content of the pulled file\n * @throws {Error} If the pull operation failed\n */\ncommands.pullFile = async function pullFile (remotePath) {\n if (remotePath.endsWith('/')) {\n throw new errors.InvalidArgumentError(`It is expected that remote path points to a file and not to a folder. ` +\n `'${remotePath}' is given instead`);\n }\n let tmpDestination = null;\n if (remotePath.startsWith(CONTAINER_PATH_MARKER)) {\n const [packageId, pathInContainer] = parseContainerPath(remotePath);\n this.log.debug(`Parsed package identifier '${packageId}' from '${remotePath}'. Will get the data from '${pathInContainer}'`);\n tmpDestination = `/data/local/tmp/${path.posix.basename(pathInContainer)}`;\n try {\n await this.adb.shell(['run-as', packageId, `chmod 777 '${escapePath(pathInContainer)}'`]);\n await this.adb.shell([\n 'run-as', packageId,\n `cp -f '${escapePath(pathInContainer)}' '${escapePath(tmpDestination)}'`\n ]);\n } catch (e) {\n this.log.errorAndThrow(`Cannot access the container of '${packageId}' application. ` +\n `Is the application installed and has 'debuggable' build option set to true? ` +\n `Original error: ${e.message}`);\n }\n }\n const localFile = await tempDir.path({prefix: 'appium', suffix: '.tmp'});\n try {\n await this.adb.pull(tmpDestination || remotePath, localFile);\n return (await util.toInMemoryBase64(localFile)).toString();\n } finally {\n if (await fs.exists(localFile)) {\n await fs.unlink(localFile);\n }\n if (tmpDestination) {\n await this.adb.shell(['rm', '-f', tmpDestination]);\n }\n }\n};\n\n/**\n * @typedef {Object} PullFileOptions\n * @property {string} remotePath The full path to the remote file\n * or a specially formatted path, which points to an item inside an app bundle,\n * for example `@my.app.id/my/path`. It is mandatory for the app bundle to have\n * debugging enabled in order to use the latter remotePath format.\n */\n\n/**\n * Pulls a remote file from the device.\n *\n * @param {PullFileOptions} opts\n * @returns {string} The same as `pullFile`\n */\ncommands.mobilePullFile = async function mobilePullFile (opts = {}) {\n const { remotePath } = requireArgs('remotePath', opts);\n return await this.pullFile(remotePath);\n};\n\n/**\n * Pushes the given data to a file on the remote device\n * It is required, that a package has debugging flag enabled\n * in order to access its files.\n * After a file is pushed it gets automatically scanned for possible\n * media occurrences. If the scan succeeds then the file is added to the\n * media library.\n *\n * @param {string} remotePath The full path to the remote file or\n * a file inside a package bundle\n * @param {string} base64Data Base64 encoded data to be written to the\n * remote file. The remote file will be silently overridden if it already exists.\n * @throws {Error} If there was an error while pushing the data\n */\ncommands.pushFile = async function pushFile (remotePath, base64Data) {\n if (remotePath.endsWith('/')) {\n throw new errors.InvalidArgumentError(\n `It is expected that remote path points to a file and not to a folder. ` +\n `'${remotePath}' is given instead`\n );\n }\n const localFile = await tempDir.path({prefix: 'appium', suffix: '.tmp'});\n if (_.isArray(base64Data)) {\n // some clients (ahem) java, send a byte array encoding utf8 characters\n // instead of a string, which would be infinitely better!\n base64Data = Buffer.from(base64Data).toString('utf8');\n }\n const content = Buffer.from(base64Data, 'base64');\n let tmpDestination = null;\n try {\n await fs.writeFile(localFile, content.toString('binary'), 'binary');\n if (remotePath.startsWith(CONTAINER_PATH_MARKER)) {\n const [packageId, pathInContainer] = parseContainerPath(remotePath);\n this.log.debug(`Parsed package identifier '${packageId}' from '${remotePath}'. ` +\n `Will put the data into '${pathInContainer}'`);\n tmpDestination = `/data/local/tmp/${path.posix.basename(pathInContainer)}`;\n try {\n await this.adb.shell(\n ['run-as', packageId, `mkdir -p '${escapePath(path.posix.dirname(pathInContainer))}'`]\n );\n await this.adb.shell(['run-as', packageId, `touch '${escapePath(pathInContainer)}'`]);\n await this.adb.shell(['run-as', packageId, `chmod 777 '${escapePath(pathInContainer)}'`]);\n await this.adb.push(localFile, tmpDestination);\n await this.adb.shell([\n 'run-as', packageId,\n `cp -f '${escapePath(tmpDestination)}' '${escapePath(pathInContainer)}'`\n ]);\n } catch (e) {\n this.log.errorAndThrow(`Cannot access the container of '${packageId}' application. ` +\n `Is the application installed and has 'debuggable' build option set to true? ` +\n `Original error: ${e.message}`);\n }\n } else {\n // adb push creates folders and overwrites existing files.\n await this.adb.push(localFile, remotePath);\n\n // if we have pushed a file, it might be a media file, so ensure that\n // apps know about it\n await scanMedia(this.adb, remotePath, this.log);\n }\n } finally {\n if (await fs.exists(localFile)) {\n await fs.unlink(localFile);\n }\n if (tmpDestination) {\n await this.adb.shell(['rm', '-f', tmpDestination]);\n }\n }\n};\n\n/**\n * @typedef {Object} PushFileOptions\n * @property {string} remotePath The full path to the remote file\n * or a specially formatted path, which points to an item inside an app bundle,\n * for example `@my.app.id/my/path`. It is mandatory for the app bundle to have\n * debugging enabled in order to use the latter remotePath format.\n * @property {string} payload Base64-encoded content of the file to be pushed.\n */\n\n/**\n * Pushes the given data to a file on the remote device.\n *\n * @param {PushFileOptions} opts\n */\ncommands.mobilePushFile = async function mobilePushFile (opts = {}) {\n const { remotePath, payload } = requireArgs(['remotePath', 'payload'], opts);\n return await this.pushFile(remotePath, payload);\n};\n\n/**\n * Pulls the whole folder from the remote device\n *\n * @param {string} remotePath The full path to a folder on the\n * remote device or a folder inside an application bundle\n * @returns {string} Base64-encoded and zipped content of the folder\n * @throws {Error} If there was a failure while getting the folder content\n */\ncommands.pullFolder = async function pullFolder (remotePath) {\n const tmpRoot = await tempDir.openDir();\n try {\n await this.adb.pull(remotePath, tmpRoot);\n return (await zip.toInMemoryZip(tmpRoot, {\n encodeToBase64: true,\n })).toString();\n } finally {\n await fs.rimraf(tmpRoot);\n }\n};\n\n/**\n * @typedef {Object} PullFolderOptions\n * @property {string} remotePath The full path to the remote folder.\n */\n\n/**\n * Pulls the whole folder from the device under test.\n *\n * @param {PullFolderOptions} opts\n * @returns {string} The same as `pullFolder`\n */\ncommands.mobilePullFolder = async function mobilePullFolder (opts = {}) {\n const { remotePath } = requireArgs('remotePath', opts);\n return await this.pullFolder(remotePath);\n};\n\n/**\n * Deletes the given folder or file from the remote device\n *\n * @param {ADB} adb\n * @param {string} remotePath The full path to the remote folder\n * or file (folder names must end with a single slash)\n * @throws {Error} If the provided remote path is invalid or\n * the package content cannot be accessed\n * @returns {boolean} `true` if the remote item has been successfully deleted.\n * If the remote path is valid, but the remote path does not exist\n * this function return `false`.\n */\nasync function deleteFileOrFolder (adb, remotePath) {\n const performRemoteFsCheck = async (p, op, runAs = null) => {\n const passFlag = '__PASS__';\n const checkCmd = `[ -${op} '${escapePath(p)}' ] && echo ${passFlag}`;\n const fullCmd = runAs ? `run-as ${runAs} ${checkCmd}` : checkCmd;\n try {\n return _.includes(await adb.shell([fullCmd]), passFlag);\n } catch (ign) {\n return false;\n }\n };\n const isFile = async (p, runAs = null) => await performRemoteFsCheck(p, 'f', runAs);\n const isDir = async (p, runAs = null) => await performRemoteFsCheck(p, 'd', runAs);\n const isPresent = async (p, runAs = null) => await performRemoteFsCheck(p, 'e', runAs);\n\n let dstPath = remotePath;\n let pkgId = null;\n if (remotePath.startsWith(CONTAINER_PATH_MARKER)) {\n const [packageId, pathInContainer] = parseContainerPath(remotePath);\n this.log.debug(`Parsed package identifier '${packageId}' from '${remotePath}'`);\n dstPath = pathInContainer;\n pkgId = packageId;\n }\n\n if (pkgId) {\n try {\n await adb.shell(['run-as', pkgId, 'ls']);\n } catch (e) {\n this.log.errorAndThrow(`Cannot access the container of '${pkgId}' application. ` +\n `Is the application installed and has 'debuggable' build option set to true? ` +\n `Original error: ${e.message}`);\n }\n }\n\n if (!await isPresent(dstPath, pkgId)) {\n this.log.info(`The item at '${dstPath}' does not exist. Perhaps, already deleted?`);\n return false;\n }\n\n const expectsFile = !remotePath.endsWith('/');\n if (expectsFile && !await isFile(dstPath, pkgId)) {\n this.log.errorAndThrow(`The item at '${dstPath}' is not a file`);\n } else if (!expectsFile && !await isDir(dstPath, pkgId)) {\n this.log.errorAndThrow(`The item at '${dstPath}' is not a folder`);\n }\n\n if (pkgId) {\n await adb.shell(\n ['run-as', pkgId, `rm -f${expectsFile ? '' : 'r'} '${escapePath(dstPath)}'`]);\n } else {\n await adb.shell(['rm', `-f${expectsFile ? '' : 'r'}`, dstPath]);\n }\n if (await isPresent(dstPath, pkgId)) {\n this.log.errorAndThrow(`The item at '${dstPath}' still exists after being deleted. ` +\n `Is it writable?`);\n }\n return true;\n}\n\n/**\n * @typedef {Object} DeleteFileOpts\n * @property {!string} remotePath The full path to the remote file\n * or a file inside an application bundle (for example `@my.app.id/path/in/bundle`)\n */\n\n/**\n * Deletes a file on the remote device\n *\n * @param {DeleteFileOpts} opts\n * @returns {boolean} `true` if the remote file has been successfully deleted.\n * If the path to a remote file is valid, but the file itself does not exist\n * then `false` is returned.\n * @throws {Error} If the argument is invalid or there was an error while\n * deleting the file\n */\ncommands.mobileDeleteFile = async function mobileDeleteFile (opts = {}) {\n const {remotePath} = opts;\n if (!remotePath) {\n throw new errors.InvalidArgumentError(`The 'remotePath' argument is mandatory`);\n }\n if (remotePath.endsWith('/')) {\n throw new errors.InvalidArgumentError(\n `It is expected that remote path points to a folder and not to a file. ` +\n `'${remotePath}' is given instead`\n );\n }\n return await deleteFileOrFolder(this.adb, remotePath);\n};\n\nexport { commands };\nexport default commands;\n"],"mappings":"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"}
|
|
@@ -59,4 +59,4 @@ helpers.findElOrEls = async function findElOrEls(strategy, selector, mult, conte
|
|
|
59
59
|
Object.assign(extensions, helpers);
|
|
60
60
|
var _default = extensions;
|
|
61
61
|
exports.default = _default;
|
|
62
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfZHJpdmVyIiwiaGVscGVycyIsImV4dGVuc2lvbnMiLCJleHBvcnRzIiwiZG9GaW5kRWxlbWVudE9yRWxzIiwicGFyYW1zIiwiYm9vdHN0cmFwIiwic2VuZEFjdGlvbiIsImZpbmRFbE9yRWxzIiwic3RyYXRlZ3kiLCJzZWxlY3RvciIsIm11bHQiLCJjb250ZXh0IiwiRXJyb3IiLCJtdWx0aXBsZSIsImVsZW1lbnQiLCJkb0ZpbmQiLCJlcnIiLCJpc0Vycm9yVHlwZSIsImVycm9ycyIsIlByb3h5UmVxdWVzdEVycm9yIiwiZ2V0QWN0dWFsRXJyb3IiLCJOb1N1Y2hFbGVtZW50RXJyb3IiLCJfIiwiaXNFbXB0eSIsImltcGxpY2l0V2FpdEZvckNvbmRpdGlvbiIsIm1lc3NhZ2UiLCJtYXRjaCIsIk9iamVjdCIsImFzc2lnbiIsIl9kZWZhdWx0IiwiZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21tYW5kcy9maW5kLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBlcnJvcnMsIGlzRXJyb3JUeXBlIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5cblxubGV0IGhlbHBlcnMgPSB7fSwgZXh0ZW5zaW9ucyA9IHt9O1xuXG4vKipcbiAqIFJlYXNvbiBmb3IgaXNvbGF0aW5nIGRvRmluZEVsZW1lbnRPckVscyBmcm9tIGZpbmRFbE9yRWxzIGlzIGZvciByZXVzaW5nIGZpbmRFbE9yRWxzXG4gKiBhY3Jvc3MgYW5kcm9pZC1kcml2ZXJzIChsaWtlIGFwcGl1bS11aWF1dG9tYXRvcjItZHJpdmVyKSB0byBhdm9pZCBjb2RlIGR1cGxpY2F0aW9uLlxuICogT3RoZXIgYW5kcm9pZC1kcml2ZXJzIChsaWtlIGFwcGl1bS11aWF1dG9tYXRvcjItZHJpdmVyKSBuZWVkIHRvIG92ZXJyaWRlIGRvRmluZEVsZW1lbnRPckVsc1xuICogdG8gZmFjaWxpdGF0ZSBmaW5kRWxPckVscy5cbiAqL1xuaGVscGVycy5kb0ZpbmRFbGVtZW50T3JFbHMgPSBhc3luYyBmdW5jdGlvbiBkb0ZpbmRFbGVtZW50T3JFbHMgKHBhcmFtcykge1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignZmluZCcsIHBhcmFtcyk7XG59O1xuXG4vLyBzdGF0ZWd5OiBsb2NhdG9yIHN0cmF0ZWd5XG4vLyBzZWxlY3RvcjogdGhlIGFjdHVhbCBzZWxlY3RvciBmb3IgZmluZGluZyBhbiBlbGVtZW50XG4vLyBtdWx0OiBtdWx0aXBsZSBlbGVtZW50cyBvciBqdXN0IG9uZT9cbi8vIGNvbnRleHQ6IGZpbmRpbmcgYW4gZWxlbWVudCBmcm9tIHRoZSByb290IGNvbnRleHQ/
|
|
62
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfZHJpdmVyIiwiaGVscGVycyIsImV4dGVuc2lvbnMiLCJleHBvcnRzIiwiZG9GaW5kRWxlbWVudE9yRWxzIiwicGFyYW1zIiwiYm9vdHN0cmFwIiwic2VuZEFjdGlvbiIsImZpbmRFbE9yRWxzIiwic3RyYXRlZ3kiLCJzZWxlY3RvciIsIm11bHQiLCJjb250ZXh0IiwiRXJyb3IiLCJtdWx0aXBsZSIsImVsZW1lbnQiLCJkb0ZpbmQiLCJlcnIiLCJpc0Vycm9yVHlwZSIsImVycm9ycyIsIlByb3h5UmVxdWVzdEVycm9yIiwiZ2V0QWN0dWFsRXJyb3IiLCJOb1N1Y2hFbGVtZW50RXJyb3IiLCJfIiwiaXNFbXB0eSIsImltcGxpY2l0V2FpdEZvckNvbmRpdGlvbiIsIm1lc3NhZ2UiLCJtYXRjaCIsIk9iamVjdCIsImFzc2lnbiIsIl9kZWZhdWx0IiwiZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21tYW5kcy9maW5kLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBlcnJvcnMsIGlzRXJyb3JUeXBlIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5cblxubGV0IGhlbHBlcnMgPSB7fSwgZXh0ZW5zaW9ucyA9IHt9O1xuXG4vKipcbiAqIFJlYXNvbiBmb3IgaXNvbGF0aW5nIGRvRmluZEVsZW1lbnRPckVscyBmcm9tIGZpbmRFbE9yRWxzIGlzIGZvciByZXVzaW5nIGZpbmRFbE9yRWxzXG4gKiBhY3Jvc3MgYW5kcm9pZC1kcml2ZXJzIChsaWtlIGFwcGl1bS11aWF1dG9tYXRvcjItZHJpdmVyKSB0byBhdm9pZCBjb2RlIGR1cGxpY2F0aW9uLlxuICogT3RoZXIgYW5kcm9pZC1kcml2ZXJzIChsaWtlIGFwcGl1bS11aWF1dG9tYXRvcjItZHJpdmVyKSBuZWVkIHRvIG92ZXJyaWRlIGRvRmluZEVsZW1lbnRPckVsc1xuICogdG8gZmFjaWxpdGF0ZSBmaW5kRWxPckVscy5cbiAqL1xuaGVscGVycy5kb0ZpbmRFbGVtZW50T3JFbHMgPSBhc3luYyBmdW5jdGlvbiBkb0ZpbmRFbGVtZW50T3JFbHMgKHBhcmFtcykge1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignZmluZCcsIHBhcmFtcyk7XG59O1xuXG4vLyBzdGF0ZWd5OiBsb2NhdG9yIHN0cmF0ZWd5XG4vLyBzZWxlY3RvcjogdGhlIGFjdHVhbCBzZWxlY3RvciBmb3IgZmluZGluZyBhbiBlbGVtZW50XG4vLyBtdWx0OiBtdWx0aXBsZSBlbGVtZW50cyBvciBqdXN0IG9uZT9cbi8vIGNvbnRleHQ6IGZpbmRpbmcgYW4gZWxlbWVudCBmcm9tIHRoZSByb290IGNvbnRleHQ/IG9yIHN0YXJ0aW5nIGZyb20gYW5vdGhlciBlbGVtZW50XG5oZWxwZXJzLmZpbmRFbE9yRWxzID0gYXN5bmMgZnVuY3Rpb24gZmluZEVsT3JFbHMgKHN0cmF0ZWd5LCBzZWxlY3RvciwgbXVsdCwgY29udGV4dCA9ICcnKSB7XG4gIGlmICghc2VsZWN0b3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ011c3QgcHJvdmlkZSBhIHNlbGVjdG9yIHdoZW4gZmluZGluZyBlbGVtZW50cycpO1xuICB9XG5cbiAgbGV0IHBhcmFtcyA9IHtcbiAgICBzdHJhdGVneSxcbiAgICBzZWxlY3RvcixcbiAgICBjb250ZXh0LFxuICAgIG11bHRpcGxlOiBtdWx0XG4gIH07XG5cbiAgbGV0IGVsZW1lbnQ7XG4gIGxldCBkb0ZpbmQgPSBhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGVsZW1lbnQgPSBhd2FpdCB0aGlzLmRvRmluZEVsZW1lbnRPckVscyhwYXJhbXMpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuXG4gICAgICAvLyBpZiB0aGUgZXJyb3IgdGhhdCBjb21lcyBiYWNrIGlzIGZyb20gYSBwcm94aWVkIHJlcXVlc3QsIHdlIG5lZWQgdG9cbiAgICAgIC8vIHVud3JhcCBpdCB0byBpdHMgYWN0dWFsIHByb3RvY29sIGVycm9yIGZpcnN0XG4gICAgICBpZiAoaXNFcnJvclR5cGUoZXJyLCBlcnJvcnMuUHJveHlSZXF1ZXN0RXJyb3IpKSB7XG4gICAgICAgIGVyciA9IGVyci5nZXRBY3R1YWxFcnJvcigpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWV4LWFzc2lnblxuICAgICAgfVxuXG4gICAgICAvLyBub3cgd2UgaGF2ZSB0byBpbnNwZWN0IHRoZSBlcnJvciB0byBkZXRlcm1pbmUgaWYgaXQgaXMgYSBubyBzdWNoXG4gICAgICAvLyBlbGVtZW50IGVycm9yLCBiYXNlZCBvbiB0aGUgc2hhcGUgb2YgdGhlIGVycm9yIG9iamVjdCBmcm9tXG4gICAgICAvLyBhcHBpdW0vZHJpdmVyXG4gICAgICBpZiAoaXNFcnJvclR5cGUoZXJyLCBlcnJvcnMuTm9TdWNoRWxlbWVudEVycm9yKSkge1xuICAgICAgICAvLyB3ZSBhcmUgZmluZSB3aXRoIHRoaXMsIGp1c3QgaW5kaWNhdGUgYSByZXRyeVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgLy8gd2Ugd2FudCB0byByZXR1cm4gZmFsc2UgaWYgd2Ugd2FudCB0byBwb3RlbnRpYWxseSB0cnkgYWdhaW5cbiAgICByZXR1cm4gIV8uaXNFbXB0eShlbGVtZW50KTtcbiAgfTtcblxuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuaW1wbGljaXRXYWl0Rm9yQ29uZGl0aW9uKGRvRmluZCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChlcnIubWVzc2FnZSAmJiBlcnIubWVzc2FnZS5tYXRjaCgvQ29uZGl0aW9uIHVubWV0LykpIHtcbiAgICAgIC8vIG9ubHkgZ2V0IGhlcmUgaWYgd2UgYXJlIGxvb2tpbmcgZm9yIG11bHRpcGxlIGVsZW1lbnRzXG4gICAgICAvLyBjb25kaXRpb24gd2FzIG5vdCBtZXQgc2V0dGluZyByZXMgdG8gZW1wdHkgYXJyYXlcbiAgICAgIGVsZW1lbnQgPSBbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfVxuXG4gIGlmIChtdWx0KSB7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cbiAgaWYgKF8uaXNFbXB0eShlbGVtZW50KSkge1xuICAgIHRocm93IG5ldyBlcnJvcnMuTm9TdWNoRWxlbWVudEVycm9yKCk7XG4gIH1cbiAgcmV0dXJuIGVsZW1lbnQ7XG59O1xuXG5PYmplY3QuYXNzaWduKGV4dGVuc2lvbnMsIGhlbHBlcnMpO1xuZXhwb3J0IHsgaGVscGVycyB9O1xuZXhwb3J0IGRlZmF1bHQgZXh0ZW5zaW9ucztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQSxJQUFBQSxPQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFHQSxJQUFJRSxPQUFPLEdBQUcsQ0FBQyxDQUFDO0VBQUVDLFVBQVUsR0FBRyxDQUFDLENBQUM7QUFBQ0MsT0FBQSxDQUFBRixPQUFBLEdBQUFBLE9BQUE7QUFRbENBLE9BQU8sQ0FBQ0csa0JBQWtCLEdBQUcsZUFBZUEsa0JBQWtCQSxDQUFFQyxNQUFNLEVBQUU7RUFDdEUsT0FBTyxNQUFNLElBQUksQ0FBQ0MsU0FBUyxDQUFDQyxVQUFVLENBQUMsTUFBTSxFQUFFRixNQUFNLENBQUM7QUFDeEQsQ0FBQztBQU1ESixPQUFPLENBQUNPLFdBQVcsR0FBRyxlQUFlQSxXQUFXQSxDQUFFQyxRQUFRLEVBQUVDLFFBQVEsRUFBRUMsSUFBSSxFQUFFQyxPQUFPLEdBQUcsRUFBRSxFQUFFO0VBQ3hGLElBQUksQ0FBQ0YsUUFBUSxFQUFFO0lBQ2IsTUFBTSxJQUFJRyxLQUFLLENBQUMsK0NBQStDLENBQUM7RUFDbEU7RUFFQSxJQUFJUixNQUFNLEdBQUc7SUFDWEksUUFBUTtJQUNSQyxRQUFRO0lBQ1JFLE9BQU87SUFDUEUsUUFBUSxFQUFFSDtFQUNaLENBQUM7RUFFRCxJQUFJSSxPQUFPO0VBQ1gsSUFBSUMsTUFBTSxHQUFHLE1BQUFBLENBQUEsS0FBWTtJQUN2QixJQUFJO01BQ0ZELE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQ1gsa0JBQWtCLENBQUNDLE1BQU0sQ0FBQztJQUNqRCxDQUFDLENBQUMsT0FBT1ksR0FBRyxFQUFFO01BSVosSUFBSSxJQUFBQyxtQkFBVyxFQUFDRCxHQUFHLEVBQUVFLGNBQU0sQ0FBQ0MsaUJBQWlCLENBQUMsRUFBRTtRQUM5Q0gsR0FBRyxHQUFHQSxHQUFHLENBQUNJLGNBQWMsQ0FBQyxDQUFDO01BQzVCO01BS0EsSUFBSSxJQUFBSCxtQkFBVyxFQUFDRCxHQUFHLEVBQUVFLGNBQU0sQ0FBQ0csa0JBQWtCLENBQUMsRUFBRTtRQUUvQyxPQUFPLEtBQUs7TUFDZDtNQUNBLE1BQU1MLEdBQUc7SUFDWDtJQUdBLE9BQU8sQ0FBQ00sZUFBQyxDQUFDQyxPQUFPLENBQUNULE9BQU8sQ0FBQztFQUM1QixDQUFDO0VBRUQsSUFBSTtJQUNGLE1BQU0sSUFBSSxDQUFDVSx3QkFBd0IsQ0FBQ1QsTUFBTSxDQUFDO0VBQzdDLENBQUMsQ0FBQyxPQUFPQyxHQUFHLEVBQUU7SUFDWixJQUFJQSxHQUFHLENBQUNTLE9BQU8sSUFBSVQsR0FBRyxDQUFDUyxPQUFPLENBQUNDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO01BR3ZEWixPQUFPLEdBQUcsRUFBRTtJQUNkLENBQUMsTUFBTTtNQUNMLE1BQU1FLEdBQUc7SUFDWDtFQUNGO0VBRUEsSUFBSU4sSUFBSSxFQUFFO0lBQ1IsT0FBT0ksT0FBTztFQUNoQjtFQUNBLElBQUlRLGVBQUMsQ0FBQ0MsT0FBTyxDQUFDVCxPQUFPLENBQUMsRUFBRTtJQUN0QixNQUFNLElBQUlJLGNBQU0sQ0FBQ0csa0JBQWtCLENBQUMsQ0FBQztFQUN2QztFQUNBLE9BQU9QLE9BQU87QUFDaEIsQ0FBQztBQUVEYSxNQUFNLENBQUNDLE1BQU0sQ0FBQzNCLFVBQVUsRUFBRUQsT0FBTyxDQUFDO0FBQUMsSUFBQTZCLFFBQUEsR0FFcEI1QixVQUFVO0FBQUFDLE9BQUEsQ0FBQTRCLE9BQUEsR0FBQUQsUUFBQSJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"find.js","names":["_lodash","_interopRequireDefault","require","_driver","helpers","extensions","exports","doFindElementOrEls","params","bootstrap","sendAction","findElOrEls","strategy","selector","mult","context","Error","multiple","element","doFind","err","isErrorType","errors","ProxyRequestError","getActualError","NoSuchElementError","_","isEmpty","implicitWaitForCondition","message","match","Object","assign","_default","default"],"sources":["../../../lib/commands/find.js"],"sourcesContent":["import _ from 'lodash';\nimport { errors, isErrorType } from 'appium/driver';\n\n\nlet helpers = {}, extensions = {};\n\n/**\n * Reason for isolating doFindElementOrEls from findElOrEls is for reusing findElOrEls\n * across android-drivers (like appium-uiautomator2-driver) to avoid code duplication.\n * Other android-drivers (like appium-uiautomator2-driver) need to override doFindElementOrEls\n * to facilitate findElOrEls.\n */\nhelpers.doFindElementOrEls = async function doFindElementOrEls (params) {\n return await this.bootstrap.sendAction('find', params);\n};\n\n// stategy: locator strategy\n// selector: the actual selector for finding an element\n// mult: multiple elements or just one?\n// context: finding an element from the root context? or starting from another element\nhelpers.findElOrEls = async function findElOrEls (strategy, selector, mult, context = '') {\n if (!selector) {\n throw new Error('Must provide a selector when finding elements');\n }\n\n let params = {\n strategy,\n selector,\n context,\n multiple: mult\n };\n\n let element;\n let doFind = async () => {\n try {\n element = await this.doFindElementOrEls(params);\n } catch (err) {\n\n // if the error that comes back is from a proxied request, we need to\n // unwrap it to its actual protocol error first\n if (isErrorType(err, errors.ProxyRequestError)) {\n err = err.getActualError(); // eslint-disable-line no-ex-assign\n }\n\n // now we have to inspect the error to determine if it is a no such\n // element error, based on the shape of the error object from\n // appium/driver\n if (isErrorType(err, errors.NoSuchElementError)) {\n // we are fine with this, just indicate a retry\n return false;\n }\n throw err;\n }\n\n // we want to return false if we want to potentially try again\n return !_.isEmpty(element);\n };\n\n try {\n await this.implicitWaitForCondition(doFind);\n } catch (err) {\n if (err.message && err.message.match(/Condition unmet/)) {\n // only get here if we are looking for multiple elements\n // condition was not met setting res to empty array\n element = [];\n } else {\n throw err;\n }\n }\n\n if (mult) {\n return element;\n }\n if (_.isEmpty(element)) {\n throw new errors.NoSuchElementError();\n }\n return element;\n};\n\nObject.assign(extensions, helpers);\nexport { helpers };\nexport default extensions;\n"],"mappings":";;;;;;;;AAAA,IAAAA,OAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AAGA,IAAIE,OAAO,GAAG,CAAC,CAAC;EAAEC,UAAU,GAAG,CAAC,CAAC;AAACC,OAAA,CAAAF,OAAA,GAAAA,OAAA;AAQlCA,OAAO,CAACG,kBAAkB,GAAG,eAAeA,kBAAkBA,CAAEC,MAAM,EAAE;EACtE,OAAO,MAAM,IAAI,CAACC,SAAS,CAACC,UAAU,CAAC,MAAM,EAAEF,MAAM,CAAC;AACxD,CAAC;AAMDJ,OAAO,CAACO,WAAW,GAAG,eAAeA,WAAWA,CAAEC,QAAQ,EAAEC,QAAQ,EAAEC,IAAI,EAAEC,OAAO,GAAG,EAAE,EAAE;EACxF,IAAI,CAACF,QAAQ,EAAE;IACb,MAAM,IAAIG,KAAK,CAAC,+CAA+C,CAAC;EAClE;EAEA,IAAIR,MAAM,GAAG;IACXI,QAAQ;IACRC,QAAQ;IACRE,OAAO;IACPE,QAAQ,EAAEH;EACZ,CAAC;EAED,IAAII,OAAO;EACX,IAAIC,MAAM,GAAG,MAAAA,CAAA,KAAY;IACvB,IAAI;MACFD,OAAO,GAAG,MAAM,IAAI,CAACX,kBAAkB,CAACC,MAAM,CAAC;IACjD,CAAC,CAAC,OAAOY,GAAG,EAAE;MAIZ,IAAI,IAAAC,mBAAW,EAACD,GAAG,EAAEE,cAAM,CAACC,iBAAiB,CAAC,EAAE;QAC9CH,GAAG,GAAGA,GAAG,CAACI,cAAc,
|
|
1
|
+
{"version":3,"file":"find.js","names":["_lodash","_interopRequireDefault","require","_driver","helpers","extensions","exports","doFindElementOrEls","params","bootstrap","sendAction","findElOrEls","strategy","selector","mult","context","Error","multiple","element","doFind","err","isErrorType","errors","ProxyRequestError","getActualError","NoSuchElementError","_","isEmpty","implicitWaitForCondition","message","match","Object","assign","_default","default"],"sources":["../../../lib/commands/find.js"],"sourcesContent":["import _ from 'lodash';\nimport { errors, isErrorType } from 'appium/driver';\n\n\nlet helpers = {}, extensions = {};\n\n/**\n * Reason for isolating doFindElementOrEls from findElOrEls is for reusing findElOrEls\n * across android-drivers (like appium-uiautomator2-driver) to avoid code duplication.\n * Other android-drivers (like appium-uiautomator2-driver) need to override doFindElementOrEls\n * to facilitate findElOrEls.\n */\nhelpers.doFindElementOrEls = async function doFindElementOrEls (params) {\n return await this.bootstrap.sendAction('find', params);\n};\n\n// stategy: locator strategy\n// selector: the actual selector for finding an element\n// mult: multiple elements or just one?\n// context: finding an element from the root context? or starting from another element\nhelpers.findElOrEls = async function findElOrEls (strategy, selector, mult, context = '') {\n if (!selector) {\n throw new Error('Must provide a selector when finding elements');\n }\n\n let params = {\n strategy,\n selector,\n context,\n multiple: mult\n };\n\n let element;\n let doFind = async () => {\n try {\n element = await this.doFindElementOrEls(params);\n } catch (err) {\n\n // if the error that comes back is from a proxied request, we need to\n // unwrap it to its actual protocol error first\n if (isErrorType(err, errors.ProxyRequestError)) {\n err = err.getActualError(); // eslint-disable-line no-ex-assign\n }\n\n // now we have to inspect the error to determine if it is a no such\n // element error, based on the shape of the error object from\n // appium/driver\n if (isErrorType(err, errors.NoSuchElementError)) {\n // we are fine with this, just indicate a retry\n return false;\n }\n throw err;\n }\n\n // we want to return false if we want to potentially try again\n return !_.isEmpty(element);\n };\n\n try {\n await this.implicitWaitForCondition(doFind);\n } catch (err) {\n if (err.message && err.message.match(/Condition unmet/)) {\n // only get here if we are looking for multiple elements\n // condition was not met setting res to empty array\n element = [];\n } else {\n throw err;\n }\n }\n\n if (mult) {\n return element;\n }\n if (_.isEmpty(element)) {\n throw new errors.NoSuchElementError();\n }\n return element;\n};\n\nObject.assign(extensions, helpers);\nexport { helpers };\nexport default extensions;\n"],"mappings":";;;;;;;;AAAA,IAAAA,OAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AAGA,IAAIE,OAAO,GAAG,CAAC,CAAC;EAAEC,UAAU,GAAG,CAAC,CAAC;AAACC,OAAA,CAAAF,OAAA,GAAAA,OAAA;AAQlCA,OAAO,CAACG,kBAAkB,GAAG,eAAeA,kBAAkBA,CAAEC,MAAM,EAAE;EACtE,OAAO,MAAM,IAAI,CAACC,SAAS,CAACC,UAAU,CAAC,MAAM,EAAEF,MAAM,CAAC;AACxD,CAAC;AAMDJ,OAAO,CAACO,WAAW,GAAG,eAAeA,WAAWA,CAAEC,QAAQ,EAAEC,QAAQ,EAAEC,IAAI,EAAEC,OAAO,GAAG,EAAE,EAAE;EACxF,IAAI,CAACF,QAAQ,EAAE;IACb,MAAM,IAAIG,KAAK,CAAC,+CAA+C,CAAC;EAClE;EAEA,IAAIR,MAAM,GAAG;IACXI,QAAQ;IACRC,QAAQ;IACRE,OAAO;IACPE,QAAQ,EAAEH;EACZ,CAAC;EAED,IAAII,OAAO;EACX,IAAIC,MAAM,GAAG,MAAAA,CAAA,KAAY;IACvB,IAAI;MACFD,OAAO,GAAG,MAAM,IAAI,CAACX,kBAAkB,CAACC,MAAM,CAAC;IACjD,CAAC,CAAC,OAAOY,GAAG,EAAE;MAIZ,IAAI,IAAAC,mBAAW,EAACD,GAAG,EAAEE,cAAM,CAACC,iBAAiB,CAAC,EAAE;QAC9CH,GAAG,GAAGA,GAAG,CAACI,cAAc,CAAC,CAAC;MAC5B;MAKA,IAAI,IAAAH,mBAAW,EAACD,GAAG,EAAEE,cAAM,CAACG,kBAAkB,CAAC,EAAE;QAE/C,OAAO,KAAK;MACd;MACA,MAAML,GAAG;IACX;IAGA,OAAO,CAACM,eAAC,CAACC,OAAO,CAACT,OAAO,CAAC;EAC5B,CAAC;EAED,IAAI;IACF,MAAM,IAAI,CAACU,wBAAwB,CAACT,MAAM,CAAC;EAC7C,CAAC,CAAC,OAAOC,GAAG,EAAE;IACZ,IAAIA,GAAG,CAACS,OAAO,IAAIT,GAAG,CAACS,OAAO,CAACC,KAAK,CAAC,iBAAiB,CAAC,EAAE;MAGvDZ,OAAO,GAAG,EAAE;IACd,CAAC,MAAM;MACL,MAAME,GAAG;IACX;EACF;EAEA,IAAIN,IAAI,EAAE;IACR,OAAOI,OAAO;EAChB;EACA,IAAIQ,eAAC,CAACC,OAAO,CAACT,OAAO,CAAC,EAAE;IACtB,MAAM,IAAII,cAAM,CAACG,kBAAkB,CAAC,CAAC;EACvC;EACA,OAAOP,OAAO;AAChB,CAAC;AAEDa,MAAM,CAACC,MAAM,CAAC3B,UAAU,EAAED,OAAO,CAAC;AAAC,IAAA6B,QAAA,GAEpB5B,UAAU;AAAAC,OAAA,CAAA4B,OAAA,GAAAD,QAAA"}
|
|
@@ -271,4 +271,4 @@ commands.mobileUnlock = async function mobileUnlock(opts = {}) {
|
|
|
271
271
|
Object.assign(extensions, commands, helpers);
|
|
272
272
|
var _default = extensions;
|
|
273
273
|
exports.default = _default;
|
|
274
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfYW5kcm9pZEhlbHBlcnMiLCJfc3VwcG9ydCIsIl9tb21lbnQiLCJfYXN5bmNib3giLCJfZHJpdmVyIiwiTU9NRU5UX0ZPUk1BVF9JU084NjAxIiwiY29tbWFuZHMiLCJoZWxwZXJzIiwiZXh0ZW5zaW9ucyIsImV4cG9ydHMiLCJrZXlzIiwiXyIsImlzQXJyYXkiLCJqb2luIiwicGFyYW1zIiwidGV4dCIsInJlcGxhY2UiLCJvcHRzIiwidW5pY29kZUtleWJvYXJkIiwiZG9TZW5kS2V5cyIsImJvb3RzdHJhcCIsInNlbmRBY3Rpb24iLCJnZXREZXZpY2VUaW1lIiwiZm9ybWF0IiwibG9nIiwiZGVidWciLCJkZXZpY2VUaW1lc3RhbXAiLCJhZGIiLCJzaGVsbCIsInRyaW0iLCJwYXJzZWRUaW1lc3RhbXAiLCJtb21lbnQiLCJ1dGMiLCJpc1ZhbGlkIiwid2FybiIsInV0Y09mZnNldCIsIl90em0iLCJtb2JpbGVHZXREZXZpY2VUaW1lIiwiZ2V0UGFnZVNvdXJjZSIsImJhY2siLCJvcGVuU2V0dGluZ3NBY3Rpdml0eSIsInNldHRpbmciLCJhcHBQYWNrYWdlIiwiYXBwQWN0aXZpdHkiLCJnZXRGb2N1c2VkUGFja2FnZUFuZEFjdGl2aXR5Iiwid2FpdEZvck5vdEFjdGl2aXR5IiwiZ2V0V2luZG93U2l6ZSIsImdldFdpbmRvd1JlY3QiLCJ3aWR0aCIsImhlaWdodCIsIngiLCJ5IiwiZ2V0Q3VycmVudEFjdGl2aXR5IiwiZ2V0Q3VycmVudFBhY2thZ2UiLCJiYWNrZ3JvdW5kIiwic2Vjb25kcyIsImdvVG9Ib21lIiwic2xlZXBNcyIsInRocmVzaG9sZE1zIiwiaW50ZXJ2YWxNcyIsIm1pbiIsInBhcnNlSW50IiwicHJvZ3Jlc3NDYiIsImVsYXBzZWRNcyIsInByb2dyZXNzIiwid2FpdFNlY3MiLCJ0b0ZpeGVkIiwicHJvZ3Jlc3NQY3QiLCJsb25nU2xlZXAiLCJhcmdzIiwiX2NhY2hlZEFjdGl2aXR5QXJncyIsImFjdGl2YXRlQXBwIiwiaWduIiwiYXBwV2FpdFBhY2thZ2UiLCJhcHBXYWl0QWN0aXZpdHkiLCJzcGxpdCIsImluY2x1ZGVzIiwicGtnIiwiYWN0aXZpdHkiLCJhY3Rpb24iLCJpbnRlbnRBY3Rpb24iLCJjYXRlZ29yeSIsImludGVudENhdGVnb3J5IiwiZmxhZ3MiLCJpbnRlbnRGbGFncyIsIndhaXRQa2ciLCJ3YWl0QWN0aXZpdHkiLCJ3YWl0Rm9yTGF1bmNoIiwiYXBwV2FpdEZvckxhdW5jaCIsIndhaXREdXJhdGlvbiIsImFwcFdhaXREdXJhdGlvbiIsIm9wdGlvbmFsSW50ZW50QXJndW1lbnRzIiwic3RvcEFwcCIsInVzZXIiLCJ1c2VyUHJvZmlsZSIsInV0aWwiLCJmaWx0ZXJPYmplY3QiLCJKU09OIiwic3RyaW5naWZ5Iiwic3RhcnRBcHAiLCJnZXRTdHJpbmdzIiwibGFuZ3VhZ2UiLCJnZXREZXZpY2VMYW5ndWFnZSIsImluZm8iLCJwcmVwcm9jZXNzU3RyaW5nc01hcCIsIm1hcHBpbmciLCJyZXN1bHQiLCJrZXkiLCJ2YWx1ZSIsInRvUGFpcnMiLCJpc1N0cmluZyIsImFwa1N0cmluZ3MiLCJhbmRyb2lkSGVscGVycyIsInB1c2hTdHJpbmdzIiwibGF1bmNoQXBwIiwiaW5pdEFVVCIsInN0YXJ0QVVUIiwic3RhcnRBY3Rpdml0eSIsImRvbnRTdG9wQXBwT25SZXNldCIsImhhc1ZhbHVlIiwicmVzZXQiLCJyZXNldEFwcCIsIk9iamVjdCIsImFzc2lnbiIsImZhc3RSZXNldCIsInNldENvbnRleHQiLCJpc0Nocm9tZVNlc3Npb24iLCJzdGFydENocm9tZVNlc3Npb24iLCJzZXRVcmwiLCJ1cmkiLCJzdGFydFVyaSIsImNsb3NlQXBwIiwiZm9yY2VTdG9wIiwiZ2V0RGlzcGxheURlbnNpdHkiLCJvdXQiLCJ2YWwiLCJpc05hTiIsImVycm9yQW5kVGhyb3ciLCJtb2JpbGVQZXJmb3JtRWRpdG9yQWN0aW9uIiwiZXJyb3JzIiwiSW52YWxpZEFyZ3VtZW50RXJyb3IiLCJwZXJmb3JtRWRpdG9yQWN0aW9uIiwibW9iaWxlR2V0Tm90aWZpY2F0aW9ucyIsImdldE5vdGlmaWNhdGlvbnMiLCJtb2JpbGVMaXN0U21zIiwiZ2V0U21zTGlzdCIsIm1vYmlsZVVubG9jayIsInR5cGUiLCJzdHJhdGVneSIsInRpbWVvdXRNcyIsInVubG9jayIsInVubG9ja0tleSIsInVubG9ja1R5cGUiLCJ1bmxvY2tTdHJhdGVneSIsInVubG9ja1N1Y2Nlc3NUaW1lb3V0IiwiX2RlZmF1bHQiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL2dlbmVyYWwuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBhbmRyb2lkSGVscGVycyBmcm9tICcuLi9hbmRyb2lkLWhlbHBlcnMnO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBsb25nU2xlZXAgfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgeyBlcnJvcnMgfSBmcm9tICdhcHBpdW0vZHJpdmVyJztcblxuY29uc3QgTU9NRU5UX0ZPUk1BVF9JU084NjAxID0gJ1lZWVktTU0tRERUSEg6bW06c3NaJztcblxubGV0IGNvbW1hbmRzID0ge30sIGhlbHBlcnMgPSB7fSwgZXh0ZW5zaW9ucyA9IHt9O1xuXG5jb21tYW5kcy5rZXlzID0gYXN5bmMgZnVuY3Rpb24ga2V5cyAoa2V5cykge1xuICAvLyBQcm90b2NvbCBzZW5kcyBhbiBhcnJheTsgcmV0aGluayBhcHByb2FjaFxuICBrZXlzID0gXy5pc0FycmF5KGtleXMpID8ga2V5cy5qb2luKCcnKSA6IGtleXM7XG4gIGxldCBwYXJhbXMgPSB7XG4gICAgdGV4dDoga2V5cyxcbiAgICByZXBsYWNlOiBmYWxzZVxuICB9O1xuICBpZiAodGhpcy5vcHRzLnVuaWNvZGVLZXlib2FyZCkge1xuICAgIHBhcmFtcy51bmljb2RlS2V5Ym9hcmQgPSB0cnVlO1xuICB9XG4gIGF3YWl0IHRoaXMuZG9TZW5kS2V5cyhwYXJhbXMpO1xufTtcblxuY29tbWFuZHMuZG9TZW5kS2V5cyA9IGFzeW5jIGZ1bmN0aW9uIGRvU2VuZEtleXMgKHBhcmFtcykge1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignc2V0VGV4dCcsIHBhcmFtcyk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgY3VycmVudCBkZXZpY2UncyB0aW1lc3RhbXAuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZvcm1hdCAtIFRoZSBzZXQgb2YgZm9ybWF0IHNwZWNpZmllcnMuIFJlYWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwczovL21vbWVudGpzLmNvbS9kb2NzLyB0byBnZXQgdGhlIGZ1bGwgbGlzdCBvZiBzdXBwb3J0ZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRldGltZSBmb3JtYXQgc3BlY2lmaWVycy4gVGhlIGRlZmF1bHQgZm9ybWF0IGlzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYFlZWVktTU0tRERUSEg6bW06c3NaYCwgd2hpY2ggY29tcGxpZXMgdG8gSVNPLTg2MDFcbiAqIEByZXR1cm4ge3N0cmluZ30gRm9ybWF0dGVkIGRhdGV0aW1lIHN0cmluZyBvciB0aGUgcmF3IGNvbW1hbmQgb3V0cHV0IGlmIGZvcm1hdHRpbmcgZmFpbHNcbiAqL1xuY29tbWFuZHMuZ2V0RGV2aWNlVGltZSA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZVRpbWUgKGZvcm1hdCA9IE1PTUVOVF9GT1JNQVRfSVNPODYwMSkge1xuICB0aGlzLmxvZy5kZWJ1ZygnQXR0ZW1wdGluZyB0byBjYXB0dXJlIGFuZHJvaWQgZGV2aWNlIGRhdGUgYW5kIHRpbWUuICcgK1xuICAgIGBUaGUgZm9ybWF0IHNwZWNpZmllciBpcyAnJHtmb3JtYXR9J2ApO1xuICBjb25zdCBkZXZpY2VUaW1lc3RhbXAgPSAoYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydkYXRlJywgJyslWS0lbS0lZFQlVCV6J10pKS50cmltKCk7XG4gIHRoaXMubG9nLmRlYnVnKGBHb3QgZGV2aWNlIHRpbWVzdGFtcDogJHtkZXZpY2VUaW1lc3RhbXB9YCk7XG4gIGNvbnN0IHBhcnNlZFRpbWVzdGFtcCA9IG1vbWVudC51dGMoZGV2aWNlVGltZXN0YW1wLCAnWVlZWS1NTS1ERFRISDptbTpzc1paJyk7XG4gIGlmICghcGFyc2VkVGltZXN0YW1wLmlzVmFsaWQoKSkge1xuICAgIHRoaXMubG9nLndhcm4oJ0Nhbm5vdCBwYXJzZSB0aGUgcmV0dXJuZWQgdGltZXN0YW1wLiBSZXR1cm5pbmcgYXMgaXMnKTtcbiAgICByZXR1cm4gZGV2aWNlVGltZXN0YW1wO1xuICB9XG4gIHJldHVybiBwYXJzZWRUaW1lc3RhbXAudXRjT2Zmc2V0KHBhcnNlZFRpbWVzdGFtcC5fdHptIHx8IDApLmZvcm1hdChmb3JtYXQpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBEZXZpY2VUaW1lT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGZvcm1hdCBbWVlZWS1NTS1ERFRISDptbTpzc1pdIC0gU2VlIGdldERldmljZVRpbWUjZm9ybWF0XG4gKi9cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgZGV2aWNlIHRpbWVcbiAqXG4gKiBAcGFyYW0ge0RldmljZVRpbWVPcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEZvcm1hdHRlZCBkYXRldGltZSBzdHJpbmcgb3IgdGhlIHJhdyBjb21tYW5kIG91dHB1dCBpZiBmb3JtYXR0aW5nIGZhaWxzXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUdldERldmljZVRpbWUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVHZXREZXZpY2VUaW1lIChvcHRzID0ge30pIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlVGltZShvcHRzLmZvcm1hdCk7XG59O1xuXG5jb21tYW5kcy5nZXRQYWdlU291cmNlID0gYXN5bmMgZnVuY3Rpb24gZ2V0UGFnZVNvdXJjZSAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdzb3VyY2UnKTtcbn07XG5cbmNvbW1hbmRzLmJhY2sgPSBhc3luYyBmdW5jdGlvbiBiYWNrICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ3ByZXNzQmFjaycpO1xufTtcblxuY29tbWFuZHMub3BlblNldHRpbmdzQWN0aXZpdHkgPSBhc3luYyBmdW5jdGlvbiBvcGVuU2V0dGluZ3NBY3Rpdml0eSAoc2V0dGluZykge1xuICBsZXQge2FwcFBhY2thZ2UsIGFwcEFjdGl2aXR5fSA9IGF3YWl0IHRoaXMuYWRiLmdldEZvY3VzZWRQYWNrYWdlQW5kQWN0aXZpdHkoKTtcbiAgYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydhbScsICdzdGFydCcsICctYScsIGBhbmRyb2lkLnNldHRpbmdzLiR7c2V0dGluZ31gXSk7XG4gIGF3YWl0IHRoaXMuYWRiLndhaXRGb3JOb3RBY3Rpdml0eShhcHBQYWNrYWdlLCBhcHBBY3Rpdml0eSwgNTAwMCk7XG59O1xuXG5jb21tYW5kcy5nZXRXaW5kb3dTaXplID0gYXN5bmMgZnVuY3Rpb24gZ2V0V2luZG93U2l6ZSAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdnZXREZXZpY2VTaXplJyk7XG59O1xuXG4vLyBGb3IgVzNDXG5jb21tYW5kcy5nZXRXaW5kb3dSZWN0ID0gYXN5bmMgZnVuY3Rpb24gZ2V0V2luZG93UmVjdCAoKSB7XG4gIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gYXdhaXQgdGhpcy5nZXRXaW5kb3dTaXplKCk7XG4gIHJldHVybiB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIHg6IDAsXG4gICAgeTogMFxuICB9O1xufTtcblxuY29tbWFuZHMuZ2V0Q3VycmVudEFjdGl2aXR5ID0gYXN5bmMgZnVuY3Rpb24gZ2V0Q3VycmVudEFjdGl2aXR5ICgpIHtcbiAgcmV0dXJuIChhd2FpdCB0aGlzLmFkYi5nZXRGb2N1c2VkUGFja2FnZUFuZEFjdGl2aXR5KCkpLmFwcEFjdGl2aXR5O1xufTtcblxuY29tbWFuZHMuZ2V0Q3VycmVudFBhY2thZ2UgPSBhc3luYyBmdW5jdGlvbiBnZXRDdXJyZW50UGFja2FnZSAoKSB7XG4gIHJldHVybiAoYXdhaXQgdGhpcy5hZGIuZ2V0Rm9jdXNlZFBhY2thZ2VBbmRBY3Rpdml0eSgpKS5hcHBQYWNrYWdlO1xufTtcblxuY29tbWFuZHMuYmFja2dyb3VuZCA9IGFzeW5jIGZ1bmN0aW9uIGJhY2tncm91bmQgKHNlY29uZHMpIHtcbiAgaWYgKHNlY29uZHMgPCAwKSB7XG4gICAgLy8gaWYgdXNlciBwYXNzZXMgaW4gYSBuZWdhdGl2ZSBzZWNvbmRzIHZhbHVlLCBpbnRlcnByZXQgdGhhdCBhcyB0aGUgaW5zdHJ1Y3Rpb25cbiAgICAvLyB0byBub3QgYnJpbmcgdGhlIGFwcCBiYWNrIGF0IGFsbFxuICAgIGF3YWl0IHRoaXMuYWRiLmdvVG9Ib21lKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgbGV0IHthcHBQYWNrYWdlLCBhcHBBY3Rpdml0eX0gPSBhd2FpdCB0aGlzLmFkYi5nZXRGb2N1c2VkUGFja2FnZUFuZEFjdGl2aXR5KCk7XG4gIGF3YWl0IHRoaXMuYWRiLmdvVG9Ib21lKCk7XG5cbiAgLy8gcGVvcGxlIGNhbiB3YWl0IGZvciBhIGxvbmcgdGltZSwgc28gdG8gYmUgc2FmZSBsZXQncyB1c2UgdGhlIGxvbmdTbGVlcCBmdW5jdGlvbiBhbmQgbG9nXG4gIC8vIHByb2dyZXNzIHBlcmlvZGljYWxseS5cbiAgY29uc3Qgc2xlZXBNcyA9IHNlY29uZHMgKiAxMDAwO1xuICBjb25zdCB0aHJlc2hvbGRNcyA9IDMwICogMTAwMDsgLy8gdXNlIHRoZSBzcGluLXdhaXQgZm9yIGFueXRoaW5nIG92ZXIgdGhpcyB0aHJlc2hvbGRcbiAgLy8gZm9yIG91ciBzcGluIGludGVydmFsLCB1c2UgMSUgb2YgdGhlIHRvdGFsIHdhaXQgdGltZSwgYnV0IG5vdGhpbmcgYmlnZ2VyIHRoYW4gMzBzXG4gIGNvbnN0IGludGVydmFsTXMgPSBfLm1pbihbMzAgKiAxMDAwLCBwYXJzZUludChzbGVlcE1zIC8gMTAwLCAxMCldKTtcbiAgY29uc3QgcHJvZ3Jlc3NDYiA9ICh7ZWxhcHNlZE1zLCBwcm9ncmVzc30pID0+IHtcbiAgICBjb25zdCB3YWl0U2VjcyA9IChlbGFwc2VkTXMgLyAxMDAwKS50b0ZpeGVkKDApO1xuICAgIGNvbnN0IHByb2dyZXNzUGN0ID0gKHByb2dyZXNzICogMTAwKS50b0ZpeGVkKDIpO1xuICAgIHRoaXMubG9nLmRlYnVnKGBXYWl0ZWQgJHt3YWl0U2Vjc31zIHNvIGZhciAoJHtwcm9ncmVzc1BjdH0lKWApO1xuICB9O1xuICBhd2FpdCBsb25nU2xlZXAoc2xlZXBNcywge3RocmVzaG9sZE1zLCBpbnRlcnZhbE1zLCBwcm9ncmVzc0NifSk7XG5cbiAgbGV0IGFyZ3M7XG4gIGlmICh0aGlzLl9jYWNoZWRBY3Rpdml0eUFyZ3MgJiYgdGhpcy5fY2FjaGVkQWN0aXZpdHlBcmdzW2Ake2FwcFBhY2thZ2V9LyR7YXBwQWN0aXZpdHl9YF0pIHtcbiAgICAvLyB0aGUgYWN0aXZpdHkgd2FzIHN0YXJ0ZWQgd2l0aCBgc3RhcnRBY3Rpdml0eWAsIHNvIHVzZSB0aG9zZSBhcmdzIHRvIHJlc3RhcnRcbiAgICBhcmdzID0gdGhpcy5fY2FjaGVkQWN0aXZpdHlBcmdzW2Ake2FwcFBhY2thZ2V9LyR7YXBwQWN0aXZpdHl9YF07XG4gIH0gZWxzZSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBBY3RpdmF0aW5nIGFwcCAnJHthcHBQYWNrYWdlfScgaW4gb3JkZXIgdG8gcmVzdG9yZSBpdGApO1xuICAgICAgYXdhaXQgdGhpcy5hY3RpdmF0ZUFwcChhcHBQYWNrYWdlKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGlnbikge31cbiAgICBhcmdzID0gKChhcHBQYWNrYWdlID09PSB0aGlzLm9wdHMuYXBwUGFja2FnZSAmJiBhcHBBY3Rpdml0eSA9PT0gdGhpcy5vcHRzLmFwcEFjdGl2aXR5KSB8fFxuICAgICAgICAgICAgKGFwcFBhY2thZ2UgPT09IHRoaXMub3B0cy5hcHBXYWl0UGFja2FnZSAmJiAodGhpcy5vcHRzLmFwcFdhaXRBY3Rpdml0eSB8fCAnJykuc3BsaXQoJywnKS5pbmNsdWRlcyhhcHBBY3Rpdml0eSkpKVxuICAgICAgPyB7Ly8gdGhlIGFjdGl2aXR5IGlzIHRoZSBvcmlnaW5hbCBzZXNzaW9uIGFjdGl2aXR5LCBzbyB1c2UgdGhlIG9yaWdpbmFsIGFyZ3NcbiAgICAgICAgcGtnOiB0aGlzLm9wdHMuYXBwUGFja2FnZSxcbiAgICAgICAgYWN0aXZpdHk6IHRoaXMub3B0cy5hcHBBY3Rpdml0eSxcbiAgICAgICAgYWN0aW9uOiB0aGlzLm9wdHMuaW50ZW50QWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogdGhpcy5vcHRzLmludGVudENhdGVnb3J5LFxuICAgICAgICBmbGFnczogdGhpcy5vcHRzLmludGVudEZsYWdzLFxuICAgICAgICB3YWl0UGtnOiB0aGlzLm9wdHMuYXBwV2FpdFBhY2thZ2UsXG4gICAgICAgIHdhaXRBY3Rpdml0eTogdGhpcy5vcHRzLmFwcFdhaXRBY3Rpdml0eSxcbiAgICAgICAgd2FpdEZvckxhdW5jaDogdGhpcy5vcHRzLmFwcFdhaXRGb3JMYXVuY2gsXG4gICAgICAgIHdhaXREdXJhdGlvbjogdGhpcy5vcHRzLmFwcFdhaXREdXJhdGlvbixcbiAgICAgICAgb3B0aW9uYWxJbnRlbnRBcmd1bWVudHM6IHRoaXMub3B0cy5vcHRpb25hbEludGVudEFyZ3VtZW50cyxcbiAgICAgICAgc3RvcEFwcDogZmFsc2UsXG4gICAgICAgIHVzZXI6IHRoaXMub3B0cy51c2VyUHJvZmlsZX1cbiAgICAgIDogey8vIHRoZSBhY3Rpdml0eSB3YXMgc3RhcnRlZCBzb21lIG90aGVyIHdheSwgc28gdXNlIGRlZmF1bHRzXG4gICAgICAgIHBrZzogYXBwUGFja2FnZSxcbiAgICAgICAgYWN0aXZpdHk6IGFwcEFjdGl2aXR5LFxuICAgICAgICB3YWl0UGtnOiBhcHBQYWNrYWdlLFxuICAgICAgICB3YWl0QWN0aXZpdHk6IGFwcEFjdGl2aXR5LFxuICAgICAgICBzdG9wQXBwOiBmYWxzZX07XG4gIH1cbiAgYXJncyA9IGF3YWl0IHV0aWwuZmlsdGVyT2JqZWN0KGFyZ3MpO1xuICB0aGlzLmxvZy5kZWJ1ZyhgQnJpbmdpbmcgYXBwbGljYXRpb24gYmFjayB0byBmb3JlZ3JvdW5kIHdpdGggYXJndW1lbnRzOiAke0pTT04uc3RyaW5naWZ5KGFyZ3MpfWApO1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGIuc3RhcnRBcHAoYXJncyk7XG59O1xuXG5jb21tYW5kcy5nZXRTdHJpbmdzID0gYXN5bmMgZnVuY3Rpb24gZ2V0U3RyaW5ncyAobGFuZ3VhZ2UpIHtcbiAgaWYgKCFsYW5ndWFnZSkge1xuICAgIGxhbmd1YWdlID0gYXdhaXQgdGhpcy5hZGIuZ2V0RGV2aWNlTGFuZ3VhZ2UoKTtcbiAgICB0aGlzLmxvZy5pbmZvKGBObyBsYW5ndWFnZSBzcGVjaWZpZWQsIHJldHVybmluZyBzdHJpbmdzIGZvcjogJHtsYW5ndWFnZX1gKTtcbiAgfVxuXG4gIC8vIENsaWVudHMgcmVxdWlyZSB0aGUgcmVzdWx0aW5nIG1hcHBpbmcgdG8gaGF2ZSBib3RoIGtleXNcbiAgLy8gYW5kIHZhbHVlcyBvZiB0eXBlIHN0cmluZ1xuICBjb25zdCBwcmVwcm9jZXNzU3RyaW5nc01hcCA9IChtYXBwaW5nKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgXy50b1BhaXJzKG1hcHBpbmcpKSB7XG4gICAgICByZXN1bHRba2V5XSA9IF8uaXNTdHJpbmcodmFsdWUpID8gdmFsdWUgOiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgaWYgKHRoaXMuYXBrU3RyaW5nc1tsYW5ndWFnZV0pIHtcbiAgICAvLyBSZXR1cm4gY2FjaGVkIHN0cmluZ3NcbiAgICByZXR1cm4gcHJlcHJvY2Vzc1N0cmluZ3NNYXAodGhpcy5hcGtTdHJpbmdzW2xhbmd1YWdlXSk7XG4gIH1cblxuICB0aGlzLmFwa1N0cmluZ3NbbGFuZ3VhZ2VdID0gYXdhaXQgYW5kcm9pZEhlbHBlcnMucHVzaFN0cmluZ3MobGFuZ3VhZ2UsIHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICBpZiAodGhpcy5ib290c3RyYXApIHtcbiAgICAvLyBUT0RPOiBUaGlzIGlzIG11dGF0aW5nIHRoZSBjdXJyZW50IGxhbmd1YWdlLCBidXQgaXQncyBob3cgYXBwaXVtIGN1cnJlbnRseSB3b3Jrc1xuICAgIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ3VwZGF0ZVN0cmluZ3MnKTtcbiAgfVxuXG4gIHJldHVybiBwcmVwcm9jZXNzU3RyaW5nc01hcCh0aGlzLmFwa1N0cmluZ3NbbGFuZ3VhZ2VdKTtcbn07XG5cbmNvbW1hbmRzLmxhdW5jaEFwcCA9IGFzeW5jIGZ1bmN0aW9uIGxhdW5jaEFwcCAoKSB7XG4gIGF3YWl0IHRoaXMuaW5pdEFVVCgpO1xuICBhd2FpdCB0aGlzLnN0YXJ0QVVUKCk7XG59O1xuXG5jb21tYW5kcy5zdGFydEFjdGl2aXR5ID0gYXN5bmMgZnVuY3Rpb24gc3RhcnRBY3Rpdml0eSAoYXBwUGFja2FnZSwgYXBwQWN0aXZpdHksXG4gIGFwcFdhaXRQYWNrYWdlLCBhcHBXYWl0QWN0aXZpdHksIGludGVudEFjdGlvbiwgaW50ZW50Q2F0ZWdvcnksIGludGVudEZsYWdzLFxuICBvcHRpb25hbEludGVudEFyZ3VtZW50cywgZG9udFN0b3BBcHBPblJlc2V0KSB7XG4gIHRoaXMubG9nLmRlYnVnKGBTdGFydGluZyBwYWNrYWdlICcke2FwcFBhY2thZ2V9JyBhbmQgYWN0aXZpdHkgJyR7YXBwQWN0aXZpdHl9J2ApO1xuXG4gIC8vIGRvbnRTdG9wQXBwT25SZXNldCBpcyBib3RoIGFuIGFyZ3VtZW50IGhlcmUsIGFuZCBhIGRlc2lyZWQgY2FwYWJpbGl0eVxuICAvLyBpZiB0aGUgYXJndW1lbnQgaXMgc2V0LCB1c2UgaXQsIG90aGVyd2lzZSB1c2UgdGhlIGNhcFxuICBpZiAoIXV0aWwuaGFzVmFsdWUoZG9udFN0b3BBcHBPblJlc2V0KSkge1xuICAgIGRvbnRTdG9wQXBwT25SZXNldCA9ICEhdGhpcy5vcHRzLmRvbnRTdG9wQXBwT25SZXNldDtcbiAgfVxuXG4gIGxldCBhcmdzID0ge1xuICAgIHBrZzogYXBwUGFja2FnZSxcbiAgICBhY3Rpdml0eTogYXBwQWN0aXZpdHksXG4gICAgd2FpdFBrZzogYXBwV2FpdFBhY2thZ2UgfHwgYXBwUGFja2FnZSxcbiAgICB3YWl0QWN0aXZpdHk6IGFwcFdhaXRBY3Rpdml0eSB8fCBhcHBBY3Rpdml0eSxcbiAgICBhY3Rpb246IGludGVudEFjdGlvbixcbiAgICBjYXRlZ29yeTogaW50ZW50Q2F0ZWdvcnksXG4gICAgZmxhZ3M6IGludGVudEZsYWdzLFxuICAgIG9wdGlvbmFsSW50ZW50QXJndW1lbnRzLFxuICAgIHN0b3BBcHA6ICFkb250U3RvcEFwcE9uUmVzZXRcbiAgfTtcbiAgdGhpcy5fY2FjaGVkQWN0aXZpdHlBcmdzID0gdGhpcy5fY2FjaGVkQWN0aXZpdHlBcmdzIHx8IHt9O1xuICB0aGlzLl9jYWNoZWRBY3Rpdml0eUFyZ3NbYCR7YXJncy53YWl0UGtnfS8ke2FyZ3Mud2FpdEFjdGl2aXR5fWBdID0gYXJncztcbiAgYXdhaXQgdGhpcy5hZGIuc3RhcnRBcHAoYXJncyk7XG59O1xuXG5jb21tYW5kcy5yZXNldCA9IGFzeW5jIGZ1bmN0aW9uIHJlc2V0ICgpIHtcbiAgYXdhaXQgYW5kcm9pZEhlbHBlcnMucmVzZXRBcHAodGhpcy5hZGIsIE9iamVjdC5hc3NpZ24oe30sIHRoaXMub3B0cywge2Zhc3RSZXNldDogdHJ1ZX0pKTtcbiAgLy8gcmVzZXQgY29udGV4dCBzaW5jZSB3ZSBkb24ndCBrbm93IHdoYXQga2luZCBvbiBjb250ZXh0IHdlIHdpbGwgZW5kIHVwIGFmdGVyIGFwcCBsYXVuY2guXG4gIGF3YWl0IHRoaXMuc2V0Q29udGV4dCgpO1xuICByZXR1cm4gYXdhaXQgdGhpcy5pc0Nocm9tZVNlc3Npb24gPyB0aGlzLnN0YXJ0Q2hyb21lU2Vzc2lvbigpIDogdGhpcy5zdGFydEFVVCgpO1xufTtcblxuY29tbWFuZHMuc3RhcnRBVVQgPSBhc3luYyBmdW5jdGlvbiBzdGFydEFVVCAoKSB7XG4gIGF3YWl0IHRoaXMuYWRiLnN0YXJ0QXBwKHtcbiAgICBwa2c6IHRoaXMub3B0cy5hcHBQYWNrYWdlLFxuICAgIGFjdGl2aXR5OiB0aGlzLm9wdHMuYXBwQWN0aXZpdHksXG4gICAgYWN0aW9uOiB0aGlzLm9wdHMuaW50ZW50QWN0aW9uLFxuICAgIGNhdGVnb3J5OiB0aGlzLm9wdHMuaW50ZW50Q2F0ZWdvcnksXG4gICAgZmxhZ3M6IHRoaXMub3B0cy5pbnRlbnRGbGFncyxcbiAgICB3YWl0UGtnOiB0aGlzLm9wdHMuYXBwV2FpdFBhY2thZ2UsXG4gICAgd2FpdEFjdGl2aXR5OiB0aGlzLm9wdHMuYXBwV2FpdEFjdGl2aXR5LFxuICAgIHdhaXRGb3JMYXVuY2g6IHRoaXMub3B0cy5hcHBXYWl0Rm9yTGF1bmNoLFxuICAgIHdhaXREdXJhdGlvbjogdGhpcy5vcHRzLmFwcFdhaXREdXJhdGlvbixcbiAgICBvcHRpb25hbEludGVudEFyZ3VtZW50czogdGhpcy5vcHRzLm9wdGlvbmFsSW50ZW50QXJndW1lbnRzLFxuICAgIHN0b3BBcHA6ICF0aGlzLm9wdHMuZG9udFN0b3BBcHBPblJlc2V0LFxuICAgIHVzZXI6IHRoaXMub3B0cy51c2VyUHJvZmlsZSxcbiAgfSk7XG59O1xuXG4vLyB3ZSBvdmVycmlkZSBzZXRVcmwgdG8gdGFrZSBhbiBhbmRyb2lkIFVSSSB3aGljaCBjYW4gYmUgdXNlZCBmb3IgZGVlcC1saW5raW5nXG4vLyBpbnNpZGUgYW4gYXBwLCBzaW1pbGFyIHRvIHN0YXJ0aW5nIGFuIGludGVudFxuY29tbWFuZHMuc2V0VXJsID0gYXN5bmMgZnVuY3Rpb24gc2V0VXJsICh1cmkpIHtcbiAgYXdhaXQgdGhpcy5hZGIuc3RhcnRVcmkodXJpLCB0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG59O1xuXG4vLyBjbG9zaW5nIGFwcCB1c2luZyBmb3JjZSBzdG9wXG5jb21tYW5kcy5jbG9zZUFwcCA9IGFzeW5jIGZ1bmN0aW9uIGNsb3NlQXBwICgpIHtcbiAgYXdhaXQgdGhpcy5hZGIuZm9yY2VTdG9wKHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbiAgLy8gcmVzZXQgY29udGV4dCBzaW5jZSB3ZSBkb24ndCBrbm93IHdoYXQga2luZCBvbiBjb250ZXh0IHdlIHdpbGwgZW5kIHVwIGFmdGVyIGFwcCBsYXVuY2guXG4gIGF3YWl0IHRoaXMuc2V0Q29udGV4dCgpO1xufTtcblxuY29tbWFuZHMuZ2V0RGlzcGxheURlbnNpdHkgPSBhc3luYyBmdW5jdGlvbiBnZXREaXNwbGF5RGVuc2l0eSAoKSB7XG4gIC8vIGZpcnN0IHRyeSB0aGUgcHJvcGVydHkgZm9yIGRldmljZXNcbiAgbGV0IG91dCA9IGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsnZ2V0cHJvcCcsICdyby5zZi5sY2RfZGVuc2l0eSddKTtcbiAgaWYgKG91dCkge1xuICAgIGxldCB2YWwgPSBwYXJzZUludChvdXQsIDEwKTtcbiAgICAvLyBpZiB0aGUgdmFsdWUgaXMgTmFOLCB0cnkgZ2V0dGluZyB0aGUgZW11bGF0b3IgcHJvcGVydHlcbiAgICBpZiAoIWlzTmFOKHZhbCkpIHtcbiAgICAgIHJldHVybiB2YWw7XG4gICAgfVxuICAgIHRoaXMubG9nLmRlYnVnKGBQYXJzZWQgZGVuc2l0eSB2YWx1ZSB3YXMgTmFOOiBcIiR7b3V0fVwiYCk7XG4gIH1cbiAgLy8gZmFsbGJhY2sgdG8gdHJ5aW5nIHByb3BlcnR5IGZvciBlbXVsYXRvcnNcbiAgb3V0ID0gYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydnZXRwcm9wJywgJ3FlbXUuc2YubGNkX2RlbnNpdHknXSk7XG4gIGlmIChvdXQpIHtcbiAgICBsZXQgdmFsID0gcGFyc2VJbnQob3V0LCAxMCk7XG4gICAgaWYgKCFpc05hTih2YWwpKSB7XG4gICAgICByZXR1cm4gdmFsO1xuICAgIH1cbiAgICB0aGlzLmxvZy5kZWJ1ZyhgUGFyc2VkIGRlbnNpdHkgdmFsdWUgd2FzIE5hTjogXCIke291dH1cImApO1xuICB9XG4gIC8vIGNvdWxkbid0IGdldCBhbnl0aGluZywgc28gZXJyb3Igb3V0XG4gIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ0ZhaWxlZCB0byBnZXQgZGlzcGxheSBkZW5zaXR5IHByb3BlcnR5LicpO1xufTtcblxuY29tbWFuZHMubW9iaWxlUGVyZm9ybUVkaXRvckFjdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVBlcmZvcm1FZGl0b3JBY3Rpb24gKG9wdHMgPSB7fSkge1xuICBjb25zdCB7YWN0aW9ufSA9IG9wdHM7XG4gIGlmICghdXRpbC5oYXNWYWx1ZShhY3Rpb24pKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgJ2FjdGlvbicgYXJndW1lbnQgaXMgcmVxdWlyZWRgKTtcbiAgfVxuXG4gIGF3YWl0IHRoaXMuYWRiLnBlcmZvcm1FZGl0b3JBY3Rpb24oYWN0aW9uKTtcbn07XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBsaXN0IG9mIHJlY2VudCBzeXN0ZW0gbm90aWZpY2F0aW9ucy5cbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBTZWUgdGhlIGRvY3VtZW50YXRpb24gb24gYGFkYi5nZXROb3RpZmljYXRpb25zYCBmb3JcbiAqIG1vcmUgZGV0YWlsc1xuICovXG5jb21tYW5kcy5tb2JpbGVHZXROb3RpZmljYXRpb25zID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlR2V0Tm90aWZpY2F0aW9ucyAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi5nZXROb3RpZmljYXRpb25zKCk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNtc0xpc3RPcHRpb25zXG4gKiBAcHJvcGVydHkge251bWJlcn0gbWF4IFsxMDBdIC0gVGhlIG1heGltdW0gY291bnQgb2YgcmVjZW50IFNNUyBtZXNzYWdlc1xuICogdG8gcmV0cmlldmVcbiAqL1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgbGlzdCBvZiByZWNlbnQgU01TIG1lc3NhZ2VzIHdpdGggdGhlaXIgcHJvcGVydGllcy5cbiAqXG4gKiBAcGFyYW0ge1Ntc0xpc3RPcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBTZWUgdGhlIGRvY3VtZW50YXRpb24gb24gYGFkYi5nZXRTbXNMaXN0YCBmb3JcbiAqIG1vcmUgZGV0YWlsc1xuICovXG5jb21tYW5kcy5tb2JpbGVMaXN0U21zID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlTGlzdFNtcyAob3B0cyA9IHt9KSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi5nZXRTbXNMaXN0KG9wdHMpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBVbmxvY2tPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZz99IGtleSBUaGUgdW5sb2NrIGtleS4gVGhlIHZhbHVlIG9mIHRoaXMga2V5IGRlcGVuZHNcbiAqIG9uIHRoZSBhY3R1YWwgdW5sb2NrIHR5cGUgYW5kIGNvdWxkIGJlIGEgcGluL3Bhc3N3b3JkL3BhdHRlcm4gdmFsdWUgb3JcbiAqIGEgYmlvbWV0cmljIGZpbmdlciBpZC5cbiAqIElmIG5vdCBwcm92aWRlZCB0aGVuIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGZyb20gc2Vzc2lvbiBjYXBhYmlsaXRpZXMgaXMgdXNlZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nP30gdHlwZSBUaGUgdW5sb2NrIHR5cGUuIFRoZSBmb2xsb3dpbmcgdW5sb2NrIHR5cGVzXG4gKiBhcmUgc3VwcG9ydGVkOiBgcGluYCwgYHBpbldpdGhLZXlFdmVudGAsIGBwYXNzd29yZGAsIGBwYXR0ZXJuYCBhbmQgYGZpbmdlcnByaW50YC5cbiAqIElmIG5vdCBwcm92aWRlZCB0aGVuIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGZyb20gc2Vzc2lvbiBjYXBhYmlsaXRpZXMgaXMgdXNlZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nP30gc3RyYXRlZ3kgRWl0aGVyICdsb2Nrc2V0dGluZ3MnIChkZWZhdWx0KSBvciAndWlhdXRvbWF0b3InLlxuICogU2V0dGluZyBpdCB0byAndWlhdXRvbWF0b3InIHdpbGwgZW5mb3JjZSB0aGUgZHJpdmVyIHRvIGF2b2lkIHVzaW5nIHNwZWNpYWxcbiAqIEFEQiBzaG9ydGN1dHMgaW4gb3JkZXIgdG8gc3BlZWQgdXAgdGhlIHVubG9jayBwcm9jZWR1cmUuXG4gKiBAcHJvcGVydHkge251bWJlcj99IHRpbWVvdXRNcyBbMjAwMF0gVGhlIG1heGltdW0gdGltZSBpbiBtaWxsaXNlY29uZHNcbiAqIHRvIHdhaXQgdW50aWwgdGhlIHNjcmVlbiBnZXRzIHVubG9ja2VkXG4gKi9cblxuLyoqXG4gKiBVbmxvY2tzIHRoZSBkZXZpY2UgaWYgaXQgaXMgbG9ja2VkLiBOb29wIGlmIHRoZSBkZXZpY2UncyBzY3JlZW4gaXMgbm90IGxvY2tlZC5cbiAqXG4gKiBAcGFyYW0ge1VubG9ja09wdGlvbnN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB1bmxvY2sgb3BlcmF0aW9uIGZhaWxzIG9yIHRoZSBwcm92aWRlZFxuICogYXJndW1lbnRzIGFyZSBub3QgdmFsaWRcbiAqL1xuY29tbWFuZHMubW9iaWxlVW5sb2NrID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlVW5sb2NrIChvcHRzID0ge30pIHtcbiAgY29uc3QgeyBrZXksIHR5cGUsIHN0cmF0ZWd5LCB0aW1lb3V0TXMgfSA9IG9wdHM7XG4gIGlmICgha2V5ICYmICF0eXBlKSB7XG4gICAgYXdhaXQgdGhpcy51bmxvY2soKTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCBhbmRyb2lkSGVscGVycy51bmxvY2sodGhpcywgdGhpcy5hZGIsIHtcbiAgICAgIHVubG9ja0tleToga2V5LFxuICAgICAgdW5sb2NrVHlwZTogdHlwZSxcbiAgICAgIHVubG9ja1N0cmF0ZWd5OiBzdHJhdGVneSxcbiAgICAgIHVubG9ja1N1Y2Nlc3NUaW1lb3V0OiB0aW1lb3V0TXMsXG4gICAgfSk7XG4gIH1cbn07XG5cbk9iamVjdC5hc3NpZ24oZXh0ZW5zaW9ucywgY29tbWFuZHMsIGhlbHBlcnMpO1xuZXhwb3J0IHsgY29tbWFuZHMsIGhlbHBlcnMgfTtcbmV4cG9ydCBkZWZhdWx0IGV4dGVuc2lvbnM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUEsSUFBQUEsT0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsZUFBQSxHQUFBRixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUUsUUFBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsT0FBQSxHQUFBSixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUksU0FBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssT0FBQSxHQUFBTCxPQUFBO0FBRUEsTUFBTU0scUJBQXFCLEdBQUcsc0JBQXNCO0FBRXBELElBQUlDLFFBQVEsR0FBRyxDQUFDLENBQUM7RUFBRUMsT0FBTyxHQUFHLENBQUMsQ0FBQztFQUFFQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO0FBQUNDLE9BQUEsQ0FBQUYsT0FBQSxHQUFBQSxPQUFBO0FBQUFFLE9BQUEsQ0FBQUgsUUFBQSxHQUFBQSxRQUFBO0FBRWpEQSxRQUFRLENBQUNJLElBQUksR0FBRyxlQUFlQSxJQUFJQSxDQUFFQSxJQUFJLEVBQUU7RUFFekNBLElBQUksR0FBR0MsZUFBQyxDQUFDQyxPQUFPLENBQUNGLElBQUksQ0FBQyxHQUFHQSxJQUFJLENBQUNHLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBR0gsSUFBSTtFQUM3QyxJQUFJSSxNQUFNLEdBQUc7SUFDWEMsSUFBSSxFQUFFTCxJQUFJO0lBQ1ZNLE9BQU8sRUFBRTtFQUNYLENBQUM7RUFDRCxJQUFJLElBQUksQ0FBQ0MsSUFBSSxDQUFDQyxlQUFlLEVBQUU7SUFDN0JKLE1BQU0sQ0FBQ0ksZUFBZSxHQUFHLElBQUk7RUFDL0I7RUFDQSxNQUFNLElBQUksQ0FBQ0Ms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
|
|
274
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfYW5kcm9pZEhlbHBlcnMiLCJfc3VwcG9ydCIsIl9tb21lbnQiLCJfYXN5bmNib3giLCJfZHJpdmVyIiwiTU9NRU5UX0ZPUk1BVF9JU084NjAxIiwiY29tbWFuZHMiLCJoZWxwZXJzIiwiZXh0ZW5zaW9ucyIsImV4cG9ydHMiLCJrZXlzIiwiXyIsImlzQXJyYXkiLCJqb2luIiwicGFyYW1zIiwidGV4dCIsInJlcGxhY2UiLCJvcHRzIiwidW5pY29kZUtleWJvYXJkIiwiZG9TZW5kS2V5cyIsImJvb3RzdHJhcCIsInNlbmRBY3Rpb24iLCJnZXREZXZpY2VUaW1lIiwiZm9ybWF0IiwibG9nIiwiZGVidWciLCJkZXZpY2VUaW1lc3RhbXAiLCJhZGIiLCJzaGVsbCIsInRyaW0iLCJwYXJzZWRUaW1lc3RhbXAiLCJtb21lbnQiLCJ1dGMiLCJpc1ZhbGlkIiwid2FybiIsInV0Y09mZnNldCIsIl90em0iLCJtb2JpbGVHZXREZXZpY2VUaW1lIiwiZ2V0UGFnZVNvdXJjZSIsImJhY2siLCJvcGVuU2V0dGluZ3NBY3Rpdml0eSIsInNldHRpbmciLCJhcHBQYWNrYWdlIiwiYXBwQWN0aXZpdHkiLCJnZXRGb2N1c2VkUGFja2FnZUFuZEFjdGl2aXR5Iiwid2FpdEZvck5vdEFjdGl2aXR5IiwiZ2V0V2luZG93U2l6ZSIsImdldFdpbmRvd1JlY3QiLCJ3aWR0aCIsImhlaWdodCIsIngiLCJ5IiwiZ2V0Q3VycmVudEFjdGl2aXR5IiwiZ2V0Q3VycmVudFBhY2thZ2UiLCJiYWNrZ3JvdW5kIiwic2Vjb25kcyIsImdvVG9Ib21lIiwic2xlZXBNcyIsInRocmVzaG9sZE1zIiwiaW50ZXJ2YWxNcyIsIm1pbiIsInBhcnNlSW50IiwicHJvZ3Jlc3NDYiIsImVsYXBzZWRNcyIsInByb2dyZXNzIiwid2FpdFNlY3MiLCJ0b0ZpeGVkIiwicHJvZ3Jlc3NQY3QiLCJsb25nU2xlZXAiLCJhcmdzIiwiX2NhY2hlZEFjdGl2aXR5QXJncyIsImFjdGl2YXRlQXBwIiwiaWduIiwiYXBwV2FpdFBhY2thZ2UiLCJhcHBXYWl0QWN0aXZpdHkiLCJzcGxpdCIsImluY2x1ZGVzIiwicGtnIiwiYWN0aXZpdHkiLCJhY3Rpb24iLCJpbnRlbnRBY3Rpb24iLCJjYXRlZ29yeSIsImludGVudENhdGVnb3J5IiwiZmxhZ3MiLCJpbnRlbnRGbGFncyIsIndhaXRQa2ciLCJ3YWl0QWN0aXZpdHkiLCJ3YWl0Rm9yTGF1bmNoIiwiYXBwV2FpdEZvckxhdW5jaCIsIndhaXREdXJhdGlvbiIsImFwcFdhaXREdXJhdGlvbiIsIm9wdGlvbmFsSW50ZW50QXJndW1lbnRzIiwic3RvcEFwcCIsInVzZXIiLCJ1c2VyUHJvZmlsZSIsInV0aWwiLCJmaWx0ZXJPYmplY3QiLCJKU09OIiwic3RyaW5naWZ5Iiwic3RhcnRBcHAiLCJnZXRTdHJpbmdzIiwibGFuZ3VhZ2UiLCJnZXREZXZpY2VMYW5ndWFnZSIsImluZm8iLCJwcmVwcm9jZXNzU3RyaW5nc01hcCIsIm1hcHBpbmciLCJyZXN1bHQiLCJrZXkiLCJ2YWx1ZSIsInRvUGFpcnMiLCJpc1N0cmluZyIsImFwa1N0cmluZ3MiLCJhbmRyb2lkSGVscGVycyIsInB1c2hTdHJpbmdzIiwibGF1bmNoQXBwIiwiaW5pdEFVVCIsInN0YXJ0QVVUIiwic3RhcnRBY3Rpdml0eSIsImRvbnRTdG9wQXBwT25SZXNldCIsImhhc1ZhbHVlIiwicmVzZXQiLCJyZXNldEFwcCIsIk9iamVjdCIsImFzc2lnbiIsImZhc3RSZXNldCIsInNldENvbnRleHQiLCJpc0Nocm9tZVNlc3Npb24iLCJzdGFydENocm9tZVNlc3Npb24iLCJzZXRVcmwiLCJ1cmkiLCJzdGFydFVyaSIsImNsb3NlQXBwIiwiZm9yY2VTdG9wIiwiZ2V0RGlzcGxheURlbnNpdHkiLCJvdXQiLCJ2YWwiLCJpc05hTiIsImVycm9yQW5kVGhyb3ciLCJtb2JpbGVQZXJmb3JtRWRpdG9yQWN0aW9uIiwiZXJyb3JzIiwiSW52YWxpZEFyZ3VtZW50RXJyb3IiLCJwZXJmb3JtRWRpdG9yQWN0aW9uIiwibW9iaWxlR2V0Tm90aWZpY2F0aW9ucyIsImdldE5vdGlmaWNhdGlvbnMiLCJtb2JpbGVMaXN0U21zIiwiZ2V0U21zTGlzdCIsIm1vYmlsZVVubG9jayIsInR5cGUiLCJzdHJhdGVneSIsInRpbWVvdXRNcyIsInVubG9jayIsInVubG9ja0tleSIsInVubG9ja1R5cGUiLCJ1bmxvY2tTdHJhdGVneSIsInVubG9ja1N1Y2Nlc3NUaW1lb3V0IiwiX2RlZmF1bHQiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL2dlbmVyYWwuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBhbmRyb2lkSGVscGVycyBmcm9tICcuLi9hbmRyb2lkLWhlbHBlcnMnO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBsb25nU2xlZXAgfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgeyBlcnJvcnMgfSBmcm9tICdhcHBpdW0vZHJpdmVyJztcblxuY29uc3QgTU9NRU5UX0ZPUk1BVF9JU084NjAxID0gJ1lZWVktTU0tRERUSEg6bW06c3NaJztcblxubGV0IGNvbW1hbmRzID0ge30sIGhlbHBlcnMgPSB7fSwgZXh0ZW5zaW9ucyA9IHt9O1xuXG5jb21tYW5kcy5rZXlzID0gYXN5bmMgZnVuY3Rpb24ga2V5cyAoa2V5cykge1xuICAvLyBQcm90b2NvbCBzZW5kcyBhbiBhcnJheTsgcmV0aGluayBhcHByb2FjaFxuICBrZXlzID0gXy5pc0FycmF5KGtleXMpID8ga2V5cy5qb2luKCcnKSA6IGtleXM7XG4gIGxldCBwYXJhbXMgPSB7XG4gICAgdGV4dDoga2V5cyxcbiAgICByZXBsYWNlOiBmYWxzZVxuICB9O1xuICBpZiAodGhpcy5vcHRzLnVuaWNvZGVLZXlib2FyZCkge1xuICAgIHBhcmFtcy51bmljb2RlS2V5Ym9hcmQgPSB0cnVlO1xuICB9XG4gIGF3YWl0IHRoaXMuZG9TZW5kS2V5cyhwYXJhbXMpO1xufTtcblxuY29tbWFuZHMuZG9TZW5kS2V5cyA9IGFzeW5jIGZ1bmN0aW9uIGRvU2VuZEtleXMgKHBhcmFtcykge1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignc2V0VGV4dCcsIHBhcmFtcyk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgY3VycmVudCBkZXZpY2UncyB0aW1lc3RhbXAuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZvcm1hdCAtIFRoZSBzZXQgb2YgZm9ybWF0IHNwZWNpZmllcnMuIFJlYWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwczovL21vbWVudGpzLmNvbS9kb2NzLyB0byBnZXQgdGhlIGZ1bGwgbGlzdCBvZiBzdXBwb3J0ZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRldGltZSBmb3JtYXQgc3BlY2lmaWVycy4gVGhlIGRlZmF1bHQgZm9ybWF0IGlzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgYFlZWVktTU0tRERUSEg6bW06c3NaYCwgd2hpY2ggY29tcGxpZXMgdG8gSVNPLTg2MDFcbiAqIEByZXR1cm4ge3N0cmluZ30gRm9ybWF0dGVkIGRhdGV0aW1lIHN0cmluZyBvciB0aGUgcmF3IGNvbW1hbmQgb3V0cHV0IGlmIGZvcm1hdHRpbmcgZmFpbHNcbiAqL1xuY29tbWFuZHMuZ2V0RGV2aWNlVGltZSA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZVRpbWUgKGZvcm1hdCA9IE1PTUVOVF9GT1JNQVRfSVNPODYwMSkge1xuICB0aGlzLmxvZy5kZWJ1ZygnQXR0ZW1wdGluZyB0byBjYXB0dXJlIGFuZHJvaWQgZGV2aWNlIGRhdGUgYW5kIHRpbWUuICcgK1xuICAgIGBUaGUgZm9ybWF0IHNwZWNpZmllciBpcyAnJHtmb3JtYXR9J2ApO1xuICBjb25zdCBkZXZpY2VUaW1lc3RhbXAgPSAoYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydkYXRlJywgJyslWS0lbS0lZFQlVCV6J10pKS50cmltKCk7XG4gIHRoaXMubG9nLmRlYnVnKGBHb3QgZGV2aWNlIHRpbWVzdGFtcDogJHtkZXZpY2VUaW1lc3RhbXB9YCk7XG4gIGNvbnN0IHBhcnNlZFRpbWVzdGFtcCA9IG1vbWVudC51dGMoZGV2aWNlVGltZXN0YW1wLCAnWVlZWS1NTS1ERFRISDptbTpzc1paJyk7XG4gIGlmICghcGFyc2VkVGltZXN0YW1wLmlzVmFsaWQoKSkge1xuICAgIHRoaXMubG9nLndhcm4oJ0Nhbm5vdCBwYXJzZSB0aGUgcmV0dXJuZWQgdGltZXN0YW1wLiBSZXR1cm5pbmcgYXMgaXMnKTtcbiAgICByZXR1cm4gZGV2aWNlVGltZXN0YW1wO1xuICB9XG4gIHJldHVybiBwYXJzZWRUaW1lc3RhbXAudXRjT2Zmc2V0KHBhcnNlZFRpbWVzdGFtcC5fdHptIHx8IDApLmZvcm1hdChmb3JtYXQpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBEZXZpY2VUaW1lT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGZvcm1hdCBbWVlZWS1NTS1ERFRISDptbTpzc1pdIC0gU2VlIGdldERldmljZVRpbWUjZm9ybWF0XG4gKi9cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgZGV2aWNlIHRpbWVcbiAqXG4gKiBAcGFyYW0ge0RldmljZVRpbWVPcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEZvcm1hdHRlZCBkYXRldGltZSBzdHJpbmcgb3IgdGhlIHJhdyBjb21tYW5kIG91dHB1dCBpZiBmb3JtYXR0aW5nIGZhaWxzXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUdldERldmljZVRpbWUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVHZXREZXZpY2VUaW1lIChvcHRzID0ge30pIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlVGltZShvcHRzLmZvcm1hdCk7XG59O1xuXG5jb21tYW5kcy5nZXRQYWdlU291cmNlID0gYXN5bmMgZnVuY3Rpb24gZ2V0UGFnZVNvdXJjZSAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdzb3VyY2UnKTtcbn07XG5cbmNvbW1hbmRzLmJhY2sgPSBhc3luYyBmdW5jdGlvbiBiYWNrICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ3ByZXNzQmFjaycpO1xufTtcblxuY29tbWFuZHMub3BlblNldHRpbmdzQWN0aXZpdHkgPSBhc3luYyBmdW5jdGlvbiBvcGVuU2V0dGluZ3NBY3Rpdml0eSAoc2V0dGluZykge1xuICBsZXQge2FwcFBhY2thZ2UsIGFwcEFjdGl2aXR5fSA9IGF3YWl0IHRoaXMuYWRiLmdldEZvY3VzZWRQYWNrYWdlQW5kQWN0aXZpdHkoKTtcbiAgYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydhbScsICdzdGFydCcsICctYScsIGBhbmRyb2lkLnNldHRpbmdzLiR7c2V0dGluZ31gXSk7XG4gIGF3YWl0IHRoaXMuYWRiLndhaXRGb3JOb3RBY3Rpdml0eShhcHBQYWNrYWdlLCBhcHBBY3Rpdml0eSwgNTAwMCk7XG59O1xuXG5jb21tYW5kcy5nZXRXaW5kb3dTaXplID0gYXN5bmMgZnVuY3Rpb24gZ2V0V2luZG93U2l6ZSAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdnZXREZXZpY2VTaXplJyk7XG59O1xuXG4vLyBGb3IgVzNDXG5jb21tYW5kcy5nZXRXaW5kb3dSZWN0ID0gYXN5bmMgZnVuY3Rpb24gZ2V0V2luZG93UmVjdCAoKSB7XG4gIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gYXdhaXQgdGhpcy5nZXRXaW5kb3dTaXplKCk7XG4gIHJldHVybiB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIHg6IDAsXG4gICAgeTogMFxuICB9O1xufTtcblxuY29tbWFuZHMuZ2V0Q3VycmVudEFjdGl2aXR5ID0gYXN5bmMgZnVuY3Rpb24gZ2V0Q3VycmVudEFjdGl2aXR5ICgpIHtcbiAgcmV0dXJuIChhd2FpdCB0aGlzLmFkYi5nZXRGb2N1c2VkUGFja2FnZUFuZEFjdGl2aXR5KCkpLmFwcEFjdGl2aXR5O1xufTtcblxuY29tbWFuZHMuZ2V0Q3VycmVudFBhY2thZ2UgPSBhc3luYyBmdW5jdGlvbiBnZXRDdXJyZW50UGFja2FnZSAoKSB7XG4gIHJldHVybiAoYXdhaXQgdGhpcy5hZGIuZ2V0Rm9jdXNlZFBhY2thZ2VBbmRBY3Rpdml0eSgpKS5hcHBQYWNrYWdlO1xufTtcblxuY29tbWFuZHMuYmFja2dyb3VuZCA9IGFzeW5jIGZ1bmN0aW9uIGJhY2tncm91bmQgKHNlY29uZHMpIHtcbiAgaWYgKHNlY29uZHMgPCAwKSB7XG4gICAgLy8gaWYgdXNlciBwYXNzZXMgaW4gYSBuZWdhdGl2ZSBzZWNvbmRzIHZhbHVlLCBpbnRlcnByZXQgdGhhdCBhcyB0aGUgaW5zdHJ1Y3Rpb25cbiAgICAvLyB0byBub3QgYnJpbmcgdGhlIGFwcCBiYWNrIGF0IGFsbFxuICAgIGF3YWl0IHRoaXMuYWRiLmdvVG9Ib21lKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgbGV0IHthcHBQYWNrYWdlLCBhcHBBY3Rpdml0eX0gPSBhd2FpdCB0aGlzLmFkYi5nZXRGb2N1c2VkUGFja2FnZUFuZEFjdGl2aXR5KCk7XG4gIGF3YWl0IHRoaXMuYWRiLmdvVG9Ib21lKCk7XG5cbiAgLy8gcGVvcGxlIGNhbiB3YWl0IGZvciBhIGxvbmcgdGltZSwgc28gdG8gYmUgc2FmZSBsZXQncyB1c2UgdGhlIGxvbmdTbGVlcCBmdW5jdGlvbiBhbmQgbG9nXG4gIC8vIHByb2dyZXNzIHBlcmlvZGljYWxseS5cbiAgY29uc3Qgc2xlZXBNcyA9IHNlY29uZHMgKiAxMDAwO1xuICBjb25zdCB0aHJlc2hvbGRNcyA9IDMwICogMTAwMDsgLy8gdXNlIHRoZSBzcGluLXdhaXQgZm9yIGFueXRoaW5nIG92ZXIgdGhpcyB0aHJlc2hvbGRcbiAgLy8gZm9yIG91ciBzcGluIGludGVydmFsLCB1c2UgMSUgb2YgdGhlIHRvdGFsIHdhaXQgdGltZSwgYnV0IG5vdGhpbmcgYmlnZ2VyIHRoYW4gMzBzXG4gIGNvbnN0IGludGVydmFsTXMgPSBfLm1pbihbMzAgKiAxMDAwLCBwYXJzZUludChzbGVlcE1zIC8gMTAwLCAxMCldKTtcbiAgY29uc3QgcHJvZ3Jlc3NDYiA9ICh7ZWxhcHNlZE1zLCBwcm9ncmVzc30pID0+IHtcbiAgICBjb25zdCB3YWl0U2VjcyA9IChlbGFwc2VkTXMgLyAxMDAwKS50b0ZpeGVkKDApO1xuICAgIGNvbnN0IHByb2dyZXNzUGN0ID0gKHByb2dyZXNzICogMTAwKS50b0ZpeGVkKDIpO1xuICAgIHRoaXMubG9nLmRlYnVnKGBXYWl0ZWQgJHt3YWl0U2Vjc31zIHNvIGZhciAoJHtwcm9ncmVzc1BjdH0lKWApO1xuICB9O1xuICBhd2FpdCBsb25nU2xlZXAoc2xlZXBNcywge3RocmVzaG9sZE1zLCBpbnRlcnZhbE1zLCBwcm9ncmVzc0NifSk7XG5cbiAgbGV0IGFyZ3M7XG4gIGlmICh0aGlzLl9jYWNoZWRBY3Rpdml0eUFyZ3MgJiYgdGhpcy5fY2FjaGVkQWN0aXZpdHlBcmdzW2Ake2FwcFBhY2thZ2V9LyR7YXBwQWN0aXZpdHl9YF0pIHtcbiAgICAvLyB0aGUgYWN0aXZpdHkgd2FzIHN0YXJ0ZWQgd2l0aCBgc3RhcnRBY3Rpdml0eWAsIHNvIHVzZSB0aG9zZSBhcmdzIHRvIHJlc3RhcnRcbiAgICBhcmdzID0gdGhpcy5fY2FjaGVkQWN0aXZpdHlBcmdzW2Ake2FwcFBhY2thZ2V9LyR7YXBwQWN0aXZpdHl9YF07XG4gIH0gZWxzZSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBBY3RpdmF0aW5nIGFwcCAnJHthcHBQYWNrYWdlfScgaW4gb3JkZXIgdG8gcmVzdG9yZSBpdGApO1xuICAgICAgYXdhaXQgdGhpcy5hY3RpdmF0ZUFwcChhcHBQYWNrYWdlKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGlnbikge31cbiAgICBhcmdzID0gKChhcHBQYWNrYWdlID09PSB0aGlzLm9wdHMuYXBwUGFja2FnZSAmJiBhcHBBY3Rpdml0eSA9PT0gdGhpcy5vcHRzLmFwcEFjdGl2aXR5KSB8fFxuICAgICAgICAgICAgKGFwcFBhY2thZ2UgPT09IHRoaXMub3B0cy5hcHBXYWl0UGFja2FnZSAmJiAodGhpcy5vcHRzLmFwcFdhaXRBY3Rpdml0eSB8fCAnJykuc3BsaXQoJywnKS5pbmNsdWRlcyhhcHBBY3Rpdml0eSkpKVxuICAgICAgPyB7Ly8gdGhlIGFjdGl2aXR5IGlzIHRoZSBvcmlnaW5hbCBzZXNzaW9uIGFjdGl2aXR5LCBzbyB1c2UgdGhlIG9yaWdpbmFsIGFyZ3NcbiAgICAgICAgcGtnOiB0aGlzLm9wdHMuYXBwUGFja2FnZSxcbiAgICAgICAgYWN0aXZpdHk6IHRoaXMub3B0cy5hcHBBY3Rpdml0eSxcbiAgICAgICAgYWN0aW9uOiB0aGlzLm9wdHMuaW50ZW50QWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogdGhpcy5vcHRzLmludGVudENhdGVnb3J5LFxuICAgICAgICBmbGFnczogdGhpcy5vcHRzLmludGVudEZsYWdzLFxuICAgICAgICB3YWl0UGtnOiB0aGlzLm9wdHMuYXBwV2FpdFBhY2thZ2UsXG4gICAgICAgIHdhaXRBY3Rpdml0eTogdGhpcy5vcHRzLmFwcFdhaXRBY3Rpdml0eSxcbiAgICAgICAgd2FpdEZvckxhdW5jaDogdGhpcy5vcHRzLmFwcFdhaXRGb3JMYXVuY2gsXG4gICAgICAgIHdhaXREdXJhdGlvbjogdGhpcy5vcHRzLmFwcFdhaXREdXJhdGlvbixcbiAgICAgICAgb3B0aW9uYWxJbnRlbnRBcmd1bWVudHM6IHRoaXMub3B0cy5vcHRpb25hbEludGVudEFyZ3VtZW50cyxcbiAgICAgICAgc3RvcEFwcDogZmFsc2UsXG4gICAgICAgIHVzZXI6IHRoaXMub3B0cy51c2VyUHJvZmlsZX1cbiAgICAgIDogey8vIHRoZSBhY3Rpdml0eSB3YXMgc3RhcnRlZCBzb21lIG90aGVyIHdheSwgc28gdXNlIGRlZmF1bHRzXG4gICAgICAgIHBrZzogYXBwUGFja2FnZSxcbiAgICAgICAgYWN0aXZpdHk6IGFwcEFjdGl2aXR5LFxuICAgICAgICB3YWl0UGtnOiBhcHBQYWNrYWdlLFxuICAgICAgICB3YWl0QWN0aXZpdHk6IGFwcEFjdGl2aXR5LFxuICAgICAgICBzdG9wQXBwOiBmYWxzZX07XG4gIH1cbiAgYXJncyA9IGF3YWl0IHV0aWwuZmlsdGVyT2JqZWN0KGFyZ3MpO1xuICB0aGlzLmxvZy5kZWJ1ZyhgQnJpbmdpbmcgYXBwbGljYXRpb24gYmFjayB0byBmb3JlZ3JvdW5kIHdpdGggYXJndW1lbnRzOiAke0pTT04uc3RyaW5naWZ5KGFyZ3MpfWApO1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGIuc3RhcnRBcHAoYXJncyk7XG59O1xuXG5jb21tYW5kcy5nZXRTdHJpbmdzID0gYXN5bmMgZnVuY3Rpb24gZ2V0U3RyaW5ncyAobGFuZ3VhZ2UpIHtcbiAgaWYgKCFsYW5ndWFnZSkge1xuICAgIGxhbmd1YWdlID0gYXdhaXQgdGhpcy5hZGIuZ2V0RGV2aWNlTGFuZ3VhZ2UoKTtcbiAgICB0aGlzLmxvZy5pbmZvKGBObyBsYW5ndWFnZSBzcGVjaWZpZWQsIHJldHVybmluZyBzdHJpbmdzIGZvcjogJHtsYW5ndWFnZX1gKTtcbiAgfVxuXG4gIC8vIENsaWVudHMgcmVxdWlyZSB0aGUgcmVzdWx0aW5nIG1hcHBpbmcgdG8gaGF2ZSBib3RoIGtleXNcbiAgLy8gYW5kIHZhbHVlcyBvZiB0eXBlIHN0cmluZ1xuICBjb25zdCBwcmVwcm9jZXNzU3RyaW5nc01hcCA9IChtYXBwaW5nKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgXy50b1BhaXJzKG1hcHBpbmcpKSB7XG4gICAgICByZXN1bHRba2V5XSA9IF8uaXNTdHJpbmcodmFsdWUpID8gdmFsdWUgOiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgaWYgKHRoaXMuYXBrU3RyaW5nc1tsYW5ndWFnZV0pIHtcbiAgICAvLyBSZXR1cm4gY2FjaGVkIHN0cmluZ3NcbiAgICByZXR1cm4gcHJlcHJvY2Vzc1N0cmluZ3NNYXAodGhpcy5hcGtTdHJpbmdzW2xhbmd1YWdlXSk7XG4gIH1cblxuICB0aGlzLmFwa1N0cmluZ3NbbGFuZ3VhZ2VdID0gYXdhaXQgYW5kcm9pZEhlbHBlcnMucHVzaFN0cmluZ3MobGFuZ3VhZ2UsIHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICBpZiAodGhpcy5ib290c3RyYXApIHtcbiAgICAvLyBUT0RPOiBUaGlzIGlzIG11dGF0aW5nIHRoZSBjdXJyZW50IGxhbmd1YWdlLCBidXQgaXQncyBob3cgYXBwaXVtIGN1cnJlbnRseSB3b3Jrc1xuICAgIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ3VwZGF0ZVN0cmluZ3MnKTtcbiAgfVxuXG4gIHJldHVybiBwcmVwcm9jZXNzU3RyaW5nc01hcCh0aGlzLmFwa1N0cmluZ3NbbGFuZ3VhZ2VdKTtcbn07XG5cbmNvbW1hbmRzLmxhdW5jaEFwcCA9IGFzeW5jIGZ1bmN0aW9uIGxhdW5jaEFwcCAoKSB7XG4gIGF3YWl0IHRoaXMuaW5pdEFVVCgpO1xuICBhd2FpdCB0aGlzLnN0YXJ0QVVUKCk7XG59O1xuXG5jb21tYW5kcy5zdGFydEFjdGl2aXR5ID0gYXN5bmMgZnVuY3Rpb24gc3RhcnRBY3Rpdml0eSAoYXBwUGFja2FnZSwgYXBwQWN0aXZpdHksXG4gIGFwcFdhaXRQYWNrYWdlLCBhcHBXYWl0QWN0aXZpdHksIGludGVudEFjdGlvbiwgaW50ZW50Q2F0ZWdvcnksIGludGVudEZsYWdzLFxuICBvcHRpb25hbEludGVudEFyZ3VtZW50cywgZG9udFN0b3BBcHBPblJlc2V0KSB7XG4gIHRoaXMubG9nLmRlYnVnKGBTdGFydGluZyBwYWNrYWdlICcke2FwcFBhY2thZ2V9JyBhbmQgYWN0aXZpdHkgJyR7YXBwQWN0aXZpdHl9J2ApO1xuXG4gIC8vIGRvbnRTdG9wQXBwT25SZXNldCBpcyBib3RoIGFuIGFyZ3VtZW50IGhlcmUsIGFuZCBhIGRlc2lyZWQgY2FwYWJpbGl0eVxuICAvLyBpZiB0aGUgYXJndW1lbnQgaXMgc2V0LCB1c2UgaXQsIG90aGVyd2lzZSB1c2UgdGhlIGNhcFxuICBpZiAoIXV0aWwuaGFzVmFsdWUoZG9udFN0b3BBcHBPblJlc2V0KSkge1xuICAgIGRvbnRTdG9wQXBwT25SZXNldCA9ICEhdGhpcy5vcHRzLmRvbnRTdG9wQXBwT25SZXNldDtcbiAgfVxuXG4gIGxldCBhcmdzID0ge1xuICAgIHBrZzogYXBwUGFja2FnZSxcbiAgICBhY3Rpdml0eTogYXBwQWN0aXZpdHksXG4gICAgd2FpdFBrZzogYXBwV2FpdFBhY2thZ2UgfHwgYXBwUGFja2FnZSxcbiAgICB3YWl0QWN0aXZpdHk6IGFwcFdhaXRBY3Rpdml0eSB8fCBhcHBBY3Rpdml0eSxcbiAgICBhY3Rpb246IGludGVudEFjdGlvbixcbiAgICBjYXRlZ29yeTogaW50ZW50Q2F0ZWdvcnksXG4gICAgZmxhZ3M6IGludGVudEZsYWdzLFxuICAgIG9wdGlvbmFsSW50ZW50QXJndW1lbnRzLFxuICAgIHN0b3BBcHA6ICFkb250U3RvcEFwcE9uUmVzZXRcbiAgfTtcbiAgdGhpcy5fY2FjaGVkQWN0aXZpdHlBcmdzID0gdGhpcy5fY2FjaGVkQWN0aXZpdHlBcmdzIHx8IHt9O1xuICB0aGlzLl9jYWNoZWRBY3Rpdml0eUFyZ3NbYCR7YXJncy53YWl0UGtnfS8ke2FyZ3Mud2FpdEFjdGl2aXR5fWBdID0gYXJncztcbiAgYXdhaXQgdGhpcy5hZGIuc3RhcnRBcHAoYXJncyk7XG59O1xuXG5jb21tYW5kcy5yZXNldCA9IGFzeW5jIGZ1bmN0aW9uIHJlc2V0ICgpIHtcbiAgYXdhaXQgYW5kcm9pZEhlbHBlcnMucmVzZXRBcHAodGhpcy5hZGIsIE9iamVjdC5hc3NpZ24oe30sIHRoaXMub3B0cywge2Zhc3RSZXNldDogdHJ1ZX0pKTtcbiAgLy8gcmVzZXQgY29udGV4dCBzaW5jZSB3ZSBkb24ndCBrbm93IHdoYXQga2luZCBvbiBjb250ZXh0IHdlIHdpbGwgZW5kIHVwIGFmdGVyIGFwcCBsYXVuY2guXG4gIGF3YWl0IHRoaXMuc2V0Q29udGV4dCgpO1xuICByZXR1cm4gYXdhaXQgdGhpcy5pc0Nocm9tZVNlc3Npb24gPyB0aGlzLnN0YXJ0Q2hyb21lU2Vzc2lvbigpIDogdGhpcy5zdGFydEFVVCgpO1xufTtcblxuY29tbWFuZHMuc3RhcnRBVVQgPSBhc3luYyBmdW5jdGlvbiBzdGFydEFVVCAoKSB7XG4gIGF3YWl0IHRoaXMuYWRiLnN0YXJ0QXBwKHtcbiAgICBwa2c6IHRoaXMub3B0cy5hcHBQYWNrYWdlLFxuICAgIGFjdGl2aXR5OiB0aGlzLm9wdHMuYXBwQWN0aXZpdHksXG4gICAgYWN0aW9uOiB0aGlzLm9wdHMuaW50ZW50QWN0aW9uLFxuICAgIGNhdGVnb3J5OiB0aGlzLm9wdHMuaW50ZW50Q2F0ZWdvcnksXG4gICAgZmxhZ3M6IHRoaXMub3B0cy5pbnRlbnRGbGFncyxcbiAgICB3YWl0UGtnOiB0aGlzLm9wdHMuYXBwV2FpdFBhY2thZ2UsXG4gICAgd2FpdEFjdGl2aXR5OiB0aGlzLm9wdHMuYXBwV2FpdEFjdGl2aXR5LFxuICAgIHdhaXRGb3JMYXVuY2g6IHRoaXMub3B0cy5hcHBXYWl0Rm9yTGF1bmNoLFxuICAgIHdhaXREdXJhdGlvbjogdGhpcy5vcHRzLmFwcFdhaXREdXJhdGlvbixcbiAgICBvcHRpb25hbEludGVudEFyZ3VtZW50czogdGhpcy5vcHRzLm9wdGlvbmFsSW50ZW50QXJndW1lbnRzLFxuICAgIHN0b3BBcHA6ICF0aGlzLm9wdHMuZG9udFN0b3BBcHBPblJlc2V0LFxuICAgIHVzZXI6IHRoaXMub3B0cy51c2VyUHJvZmlsZSxcbiAgfSk7XG59O1xuXG4vLyB3ZSBvdmVycmlkZSBzZXRVcmwgdG8gdGFrZSBhbiBhbmRyb2lkIFVSSSB3aGljaCBjYW4gYmUgdXNlZCBmb3IgZGVlcC1saW5raW5nXG4vLyBpbnNpZGUgYW4gYXBwLCBzaW1pbGFyIHRvIHN0YXJ0aW5nIGFuIGludGVudFxuY29tbWFuZHMuc2V0VXJsID0gYXN5bmMgZnVuY3Rpb24gc2V0VXJsICh1cmkpIHtcbiAgYXdhaXQgdGhpcy5hZGIuc3RhcnRVcmkodXJpLCB0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG59O1xuXG4vLyBjbG9zaW5nIGFwcCB1c2luZyBmb3JjZSBzdG9wXG5jb21tYW5kcy5jbG9zZUFwcCA9IGFzeW5jIGZ1bmN0aW9uIGNsb3NlQXBwICgpIHtcbiAgYXdhaXQgdGhpcy5hZGIuZm9yY2VTdG9wKHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbiAgLy8gcmVzZXQgY29udGV4dCBzaW5jZSB3ZSBkb24ndCBrbm93IHdoYXQga2luZCBvbiBjb250ZXh0IHdlIHdpbGwgZW5kIHVwIGFmdGVyIGFwcCBsYXVuY2guXG4gIGF3YWl0IHRoaXMuc2V0Q29udGV4dCgpO1xufTtcblxuY29tbWFuZHMuZ2V0RGlzcGxheURlbnNpdHkgPSBhc3luYyBmdW5jdGlvbiBnZXREaXNwbGF5RGVuc2l0eSAoKSB7XG4gIC8vIGZpcnN0IHRyeSB0aGUgcHJvcGVydHkgZm9yIGRldmljZXNcbiAgbGV0IG91dCA9IGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsnZ2V0cHJvcCcsICdyby5zZi5sY2RfZGVuc2l0eSddKTtcbiAgaWYgKG91dCkge1xuICAgIGxldCB2YWwgPSBwYXJzZUludChvdXQsIDEwKTtcbiAgICAvLyBpZiB0aGUgdmFsdWUgaXMgTmFOLCB0cnkgZ2V0dGluZyB0aGUgZW11bGF0b3IgcHJvcGVydHlcbiAgICBpZiAoIWlzTmFOKHZhbCkpIHtcbiAgICAgIHJldHVybiB2YWw7XG4gICAgfVxuICAgIHRoaXMubG9nLmRlYnVnKGBQYXJzZWQgZGVuc2l0eSB2YWx1ZSB3YXMgTmFOOiBcIiR7b3V0fVwiYCk7XG4gIH1cbiAgLy8gZmFsbGJhY2sgdG8gdHJ5aW5nIHByb3BlcnR5IGZvciBlbXVsYXRvcnNcbiAgb3V0ID0gYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydnZXRwcm9wJywgJ3FlbXUuc2YubGNkX2RlbnNpdHknXSk7XG4gIGlmIChvdXQpIHtcbiAgICBsZXQgdmFsID0gcGFyc2VJbnQob3V0LCAxMCk7XG4gICAgaWYgKCFpc05hTih2YWwpKSB7XG4gICAgICByZXR1cm4gdmFsO1xuICAgIH1cbiAgICB0aGlzLmxvZy5kZWJ1ZyhgUGFyc2VkIGRlbnNpdHkgdmFsdWUgd2FzIE5hTjogXCIke291dH1cImApO1xuICB9XG4gIC8vIGNvdWxkbid0IGdldCBhbnl0aGluZywgc28gZXJyb3Igb3V0XG4gIHRoaXMubG9nLmVycm9yQW5kVGhyb3coJ0ZhaWxlZCB0byBnZXQgZGlzcGxheSBkZW5zaXR5IHByb3BlcnR5LicpO1xufTtcblxuY29tbWFuZHMubW9iaWxlUGVyZm9ybUVkaXRvckFjdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVBlcmZvcm1FZGl0b3JBY3Rpb24gKG9wdHMgPSB7fSkge1xuICBjb25zdCB7YWN0aW9ufSA9IG9wdHM7XG4gIGlmICghdXRpbC5oYXNWYWx1ZShhY3Rpb24pKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihgJ2FjdGlvbicgYXJndW1lbnQgaXMgcmVxdWlyZWRgKTtcbiAgfVxuXG4gIGF3YWl0IHRoaXMuYWRiLnBlcmZvcm1FZGl0b3JBY3Rpb24oYWN0aW9uKTtcbn07XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBsaXN0IG9mIHJlY2VudCBzeXN0ZW0gbm90aWZpY2F0aW9ucy5cbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBTZWUgdGhlIGRvY3VtZW50YXRpb24gb24gYGFkYi5nZXROb3RpZmljYXRpb25zYCBmb3JcbiAqIG1vcmUgZGV0YWlsc1xuICovXG5jb21tYW5kcy5tb2JpbGVHZXROb3RpZmljYXRpb25zID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlR2V0Tm90aWZpY2F0aW9ucyAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi5nZXROb3RpZmljYXRpb25zKCk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNtc0xpc3RPcHRpb25zXG4gKiBAcHJvcGVydHkge251bWJlcn0gbWF4IFsxMDBdIC0gVGhlIG1heGltdW0gY291bnQgb2YgcmVjZW50IFNNUyBtZXNzYWdlc1xuICogdG8gcmV0cmlldmVcbiAqL1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgbGlzdCBvZiByZWNlbnQgU01TIG1lc3NhZ2VzIHdpdGggdGhlaXIgcHJvcGVydGllcy5cbiAqXG4gKiBAcGFyYW0ge1Ntc0xpc3RPcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBTZWUgdGhlIGRvY3VtZW50YXRpb24gb24gYGFkYi5nZXRTbXNMaXN0YCBmb3JcbiAqIG1vcmUgZGV0YWlsc1xuICovXG5jb21tYW5kcy5tb2JpbGVMaXN0U21zID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlTGlzdFNtcyAob3B0cyA9IHt9KSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYi5nZXRTbXNMaXN0KG9wdHMpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBVbmxvY2tPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZz99IGtleSBUaGUgdW5sb2NrIGtleS4gVGhlIHZhbHVlIG9mIHRoaXMga2V5IGRlcGVuZHNcbiAqIG9uIHRoZSBhY3R1YWwgdW5sb2NrIHR5cGUgYW5kIGNvdWxkIGJlIGEgcGluL3Bhc3N3b3JkL3BhdHRlcm4gdmFsdWUgb3JcbiAqIGEgYmlvbWV0cmljIGZpbmdlciBpZC5cbiAqIElmIG5vdCBwcm92aWRlZCB0aGVuIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGZyb20gc2Vzc2lvbiBjYXBhYmlsaXRpZXMgaXMgdXNlZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nP30gdHlwZSBUaGUgdW5sb2NrIHR5cGUuIFRoZSBmb2xsb3dpbmcgdW5sb2NrIHR5cGVzXG4gKiBhcmUgc3VwcG9ydGVkOiBgcGluYCwgYHBpbldpdGhLZXlFdmVudGAsIGBwYXNzd29yZGAsIGBwYXR0ZXJuYCBhbmQgYGZpbmdlcnByaW50YC5cbiAqIElmIG5vdCBwcm92aWRlZCB0aGVuIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGZyb20gc2Vzc2lvbiBjYXBhYmlsaXRpZXMgaXMgdXNlZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nP30gc3RyYXRlZ3kgRWl0aGVyICdsb2Nrc2V0dGluZ3MnIChkZWZhdWx0KSBvciAndWlhdXRvbWF0b3InLlxuICogU2V0dGluZyBpdCB0byAndWlhdXRvbWF0b3InIHdpbGwgZW5mb3JjZSB0aGUgZHJpdmVyIHRvIGF2b2lkIHVzaW5nIHNwZWNpYWxcbiAqIEFEQiBzaG9ydGN1dHMgaW4gb3JkZXIgdG8gc3BlZWQgdXAgdGhlIHVubG9jayBwcm9jZWR1cmUuXG4gKiBAcHJvcGVydHkge251bWJlcj99IHRpbWVvdXRNcyBbMjAwMF0gVGhlIG1heGltdW0gdGltZSBpbiBtaWxsaXNlY29uZHNcbiAqIHRvIHdhaXQgdW50aWwgdGhlIHNjcmVlbiBnZXRzIHVubG9ja2VkXG4gKi9cblxuLyoqXG4gKiBVbmxvY2tzIHRoZSBkZXZpY2UgaWYgaXQgaXMgbG9ja2VkLiBOb29wIGlmIHRoZSBkZXZpY2UncyBzY3JlZW4gaXMgbm90IGxvY2tlZC5cbiAqXG4gKiBAcGFyYW0ge1VubG9ja09wdGlvbnN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB1bmxvY2sgb3BlcmF0aW9uIGZhaWxzIG9yIHRoZSBwcm92aWRlZFxuICogYXJndW1lbnRzIGFyZSBub3QgdmFsaWRcbiAqL1xuY29tbWFuZHMubW9iaWxlVW5sb2NrID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlVW5sb2NrIChvcHRzID0ge30pIHtcbiAgY29uc3QgeyBrZXksIHR5cGUsIHN0cmF0ZWd5LCB0aW1lb3V0TXMgfSA9IG9wdHM7XG4gIGlmICgha2V5ICYmICF0eXBlKSB7XG4gICAgYXdhaXQgdGhpcy51bmxvY2soKTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCBhbmRyb2lkSGVscGVycy51bmxvY2sodGhpcywgdGhpcy5hZGIsIHtcbiAgICAgIHVubG9ja0tleToga2V5LFxuICAgICAgdW5sb2NrVHlwZTogdHlwZSxcbiAgICAgIHVubG9ja1N0cmF0ZWd5OiBzdHJhdGVneSxcbiAgICAgIHVubG9ja1N1Y2Nlc3NUaW1lb3V0OiB0aW1lb3V0TXMsXG4gICAgfSk7XG4gIH1cbn07XG5cbk9iamVjdC5hc3NpZ24oZXh0ZW5zaW9ucywgY29tbWFuZHMsIGhlbHBlcnMpO1xuZXhwb3J0IHsgY29tbWFuZHMsIGhlbHBlcnMgfTtcbmV4cG9ydCBkZWZhdWx0IGV4dGVuc2lvbnM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUEsSUFBQUEsT0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsZUFBQSxHQUFBRixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUUsUUFBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsT0FBQSxHQUFBSixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUksU0FBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssT0FBQSxHQUFBTCxPQUFBO0FBRUEsTUFBTU0scUJBQXFCLEdBQUcsc0JBQXNCO0FBRXBELElBQUlDLFFBQVEsR0FBRyxDQUFDLENBQUM7RUFBRUMsT0FBTyxHQUFHLENBQUMsQ0FBQztFQUFFQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO0FBQUNDLE9BQUEsQ0FBQUYsT0FBQSxHQUFBQSxPQUFBO0FBQUFFLE9BQUEsQ0FBQUgsUUFBQSxHQUFBQSxRQUFBO0FBRWpEQSxRQUFRLENBQUNJLElBQUksR0FBRyxlQUFlQSxJQUFJQSxDQUFFQSxJQUFJLEVBQUU7RUFFekNBLElBQUksR0FBR0MsZUFBQyxDQUFDQyxPQUFPLENBQUNGLElBQUksQ0FBQyxHQUFHQSxJQUFJLENBQUNHLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBR0gsSUFBSTtFQUM3QyxJQUFJSSxNQUFNLEdBQUc7SUFDWEMsSUFBSSxFQUFFTCxJQUFJO0lBQ1ZNLE9BQU8sRUFBRTtFQUNYLENBQUM7RUFDRCxJQUFJLElBQUksQ0FBQ0MsSUFBSSxDQUFDQyxlQUFlLEVBQUU7SUFDN0JKLE1BQU0sQ0FBQ0ksZUFBZSxHQUFHLElBQUk7RUFDL0I7RUFDQSxNQUFNLElBQUksQ0FBQ0Ms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
|