UNPKG

@browserstack/testcafe

Version:

Automated browser testing for the modern web development stack.

111 lines 17.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const device_specs_1 = require("device-specs"); const lodash_1 = require("lodash"); const argument_parsing_1 = require("../../../utils/argument-parsing"); const HEADLESS_DEFAULT_WIDTH = 1280; const HEADLESS_DEFAULT_HEIGHT = 800; const AVAILABLE_MODES = ['userProfile', 'headless', 'emulation']; const configCache = {}; function parseUserArgs(userArgs) { const parsedArgs = { headless: false, userDataDir: false, windowSize: false }; const splittedArgs = userArgs.split(' ').filter(arg => !!arg); splittedArgs.forEach(arg => { const keyValuePair = arg.split('='); const key = lodash_1.camelCase(keyValuePair[0]); parsedArgs[key] = parsedArgs[key] !== void 0; }); return parsedArgs; } function parseModes(modesStr, userArgs) { const parsed = argument_parsing_1.splitEscaped(modesStr, ':'); const path = argument_parsing_1.getPathFromParsedModes(parsed, AVAILABLE_MODES); const detectedModes = argument_parsing_1.getModes(parsed, AVAILABLE_MODES); let optionsString = ''; if (parsed.length) optionsString = parsed.shift(); while (parsed.length) optionsString += ':' + parsed.shift(); const userProfile = detectedModes.userProfile || userArgs.userDataDir; const headless = detectedModes.headless || userArgs.headless; const emulation = detectedModes.emulation || headless; const modes = { path, userProfile, headless, emulation }; return { modes, optionsString }; } function simplifyDeviceName(deviceName) { return deviceName.replace(/\s/g, '').toLowerCase(); } function findDevice(deviceName) { const simpleName = simplifyDeviceName(deviceName); return device_specs_1.emulatedDevices.filter(device => simplifyDeviceName(device.title).indexOf(simpleName) >= 0)[0]; } function getDeviceBasedOptions(deviceName, orientation) { if (!deviceName) return {}; const deviceData = findDevice(deviceName); if (!deviceData) return {}; const mobile = deviceData.capabilities.indexOf('mobile') >= 0; if (!orientation) orientation = mobile ? 'vertical' : 'horizontal'; return { mobile: mobile, orientation: orientation, touch: deviceData.capabilities.indexOf('touch') >= 0, width: deviceData.screen[orientation].width, height: deviceData.screen[orientation].height, scaleFactor: deviceData.screen['device-pixel-ratio'], userAgent: deviceData['user-agent'], }; } function parseOptions(str, useDefaultDimensions) { const parsed = argument_parsing_1.splitEscaped(str, ';'); const baseOptions = { width: useDefaultDimensions ? HEADLESS_DEFAULT_WIDTH : 0, height: useDefaultDimensions ? HEADLESS_DEFAULT_HEIGHT : 0, scaleFactor: 0, mobile: false, cdpPort: argument_parsing_1.findMatch(parsed, /^cdpPort=(.*)/) }; const deviceName = argument_parsing_1.findMatch(parsed, /^device=(.*)/); const orientation = argument_parsing_1.findMatch(parsed, /^orientation=(.*)/); const deviceBasedOptions = getDeviceBasedOptions(deviceName, orientation); let specifiedDeviceOptions = { orientation: orientation, touch: argument_parsing_1.hasMatch(parsed, /^touch=/) ? argument_parsing_1.isMatchTrue(parsed, /^touch=(.*)/) : void 0, mobile: argument_parsing_1.isMatchTrue(parsed, /^mobile=(.*)/), width: Number(argument_parsing_1.findMatch(parsed, /^width=(.*)/) || NaN), height: Number(argument_parsing_1.findMatch(parsed, /^height=(.*)/) || NaN), scaleFactor: Number(argument_parsing_1.findMatch(parsed, /^scaleFactor=(.*)/) || NaN), userAgent: argument_parsing_1.findMatch(parsed, /^userAgent=(.*)/) }; specifiedDeviceOptions = lodash_1.pickBy(specifiedDeviceOptions, optionValue => { return optionValue !== void 0 && optionValue !== '' && !Number.isNaN(optionValue); }); return Object.assign(baseOptions, deviceBasedOptions, specifiedDeviceOptions); } function getNewConfig(configString) { const { userArgs, modesString } = argument_parsing_1.parseConfig(configString); const parsedUserArgs = parseUserArgs(userArgs); const { modes, optionsString } = parseModes(modesString, parsedUserArgs); const useDefaultDimensions = modes.headless && !parsedUserArgs.windowSize; const options = parseOptions(optionsString, useDefaultDimensions); return Object.assign({ userArgs }, modes, options); } function default_1(configString) { if (!configCache[configString]) configCache[configString] = getNewConfig(configString); return configCache[configString]; } exports.default = default_1; module.exports = exports.default; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2Jyb3dzZXIvcHJvdmlkZXIvYnVpbHQtaW4vZGVkaWNhdGVkL2Nocm9tZS9jb25maWcuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwrQ0FBK0M7QUFDL0MsbUNBQStEO0FBQy9ELHNFQUV5QztBQUd6QyxNQUFNLHNCQUFzQixHQUFJLElBQUksQ0FBQztBQUNyQyxNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FBQztBQUVwQyxNQUFNLGVBQWUsR0FBRyxDQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUM7QUFFakUsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDO0FBRXZCLFNBQVMsYUFBYSxDQUFFLFFBQVE7SUFDNUIsTUFBTSxVQUFVLEdBQUc7UUFDZixRQUFRLEVBQUssS0FBSztRQUNsQixXQUFXLEVBQUUsS0FBSztRQUNsQixVQUFVLEVBQUcsS0FBSztLQUNyQixDQUFDO0lBRUYsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFOUQsWUFBWSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUN2QixNQUFNLFlBQVksR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sR0FBRyxHQUFZLGtCQUFTLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFaEQsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQztJQUNqRCxDQUFDLENBQUMsQ0FBQztJQUVILE9BQU8sVUFBVSxDQUFDO0FBQ3RCLENBQUM7QUFFRCxTQUFTLFVBQVUsQ0FBRSxRQUFRLEVBQUUs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QUFFO1FBQzVFLE9BQU8sV0FBVyxLQUFLLEtBQUssQ0FBQyxJQUFJLFdBQVcsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3RGLENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxrQkFBa0IsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO0FBQ2xGLENBQUM7QUFHRCxTQUFTLFlBQVksQ0FBRSxZQUFZO0lBQy9CLE1BQU0sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLEdBQUcsOEJBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUM1RCxNQUFNLGNBQWMsR0FBYyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDMUQsTUFBTSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsR0FBSSxVQUFVLENBQUMsV0FBVyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQzFFLE1BQU0sb0JBQW9CLEdBQVEsS0FBSyxDQUFDLFFBQVEsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUM7SUFDL0UsTUFBTSxPQUFPLEdBQXFCLFlBQVksQ0FBQyxhQUFhLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztJQUVwRixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDdkQsQ0FBQztBQUVELG1CQUF5QixZQUFZO0lBQ2pDLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDO1FBQzFCLFdBQVcsQ0FBQyxZQUFZLENBQUMsR0FBRyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUM7SUFFM0QsT0FBTyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDckMsQ0FBQztBQUxELDRCQUtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZW11bGF0ZWREZXZpY2VzIH0gZnJvbSAnZGV2aWNlLXNwZWNzJztcbmltcG9ydCB7IHBpY2tCeSBhcyBmaWx0ZXJQcm9wZXJ0aWVzLCBjYW1lbENhc2UgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHtcbiAgICBoYXNNYXRjaCwgZmluZE1hdGNoLCBpc01hdGNoVHJ1ZSwgZ2V0TW9kZXMsIHNwbGl0RXNjYXBlZCwgZ2V0UGF0aEZyb21QYXJzZWRNb2RlcywgcGFyc2VDb25maWdcbn0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvYXJndW1lbnQtcGFyc2luZyc7XG5cblxuY29uc3QgSEVBRExFU1NfREVGQVVMVF9XSURUSCAgPSAxMjgwO1xuY29uc3QgSEVBRExFU1NfREVGQVVMVF9IRUlHSFQgPSA4MDA7XG5cbmNvbnN0IEFWQUlMQUJMRV9NT0RFUyA9IFsndXNlclByb2ZpbGUnLCAnaGVhZGxlc3MnLCAnZW11bGF0aW9uJ107XG5cbmNvbnN0IGNvbmZpZ0NhY2hlID0ge307XG5cbmZ1bmN0aW9uIHBhcnNlVXNlckFyZ3MgKHVzZXJBcmdzKSB7XG4gICAgY29uc3QgcGFyc2VkQXJncyA9IHtcbiAgICAgICAgaGVhZGxlc3M6ICAgIGZhbHNlLFxuICAgICAgICB1c2VyRGF0YURpcjogZmFsc2UsXG4gICAgICAgIHdpbmRvd1NpemU6ICBmYWxzZVxuICAgIH07XG5cbiAgICBjb25zdCBzcGxpdHRlZEFyZ3MgPSB1c2VyQXJncy5zcGxpdCgnICcpLmZpbHRlcihhcmcgPT4gISFhcmcpO1xuXG4gICAgc3BsaXR0ZWRBcmdzLmZvckVhY2goYXJnID0+IHtcbiAgICAgICAgY29uc3Qga2V5VmFsdWVQYWlyID0gYXJnLnNwbGl0KCc9Jyk7XG4gICAgICAgIGNvbnN0IGtleSAgICAgICAgICA9IGNhbWVsQ2FzZShrZXlWYWx1ZVBhaXJbMF0pO1xuXG4gICAgICAgIHBhcnNlZEFyZ3Nba2V5XSA9IHBhcnNlZEFyZ3Nba2V5XSAhPT0gdm9pZCAwO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHBhcnNlZEFyZ3M7XG59XG5cbmZ1bmN0aW9uIHBhcnNlTW9kZXMgKG1vZGVzU3RyLCB1c2VyQXJncykge1xuICAgIGNvbnN0IHBhcnNlZCAgICAgICAgPSBzcGxpdEVzY2FwZWQobW9kZXNTdHIsICc6Jyk7XG4gICAgY29uc3QgcGF0aCAgICAgICAgICA9IGdldFBhdGhGcm9tUGFyc2VkTW9kZXMocGFyc2VkLCBBVkFJTEFCTEVfTU9ERVMpO1xuICAgIGNvbnN0IGRldGVjdGVkTW9kZXMgPSBnZXRNb2RlcyhwYXJzZWQsIEFWQUlMQUJMRV9NT0RFUyk7XG4gICAgbGV0IG9wdGlvbnNTdHJpbmcgPSAnJztcblxuICAgIGlmIChwYXJzZWQubGVuZ3RoKVxuICAgICAgICBvcHRpb25zU3RyaW5nID0gcGFyc2VkLnNoaWZ0KCk7XG5cbiAgICB3aGlsZSAocGFyc2VkLmxlbmd0aClcbiAgICAgICAgb3B0aW9uc1N0cmluZyArPSAnOicgKyBwYXJzZWQuc2hpZnQoKTtcblxuICAgIGNvbnN0IHVzZXJQcm9maWxlID0gZGV0ZWN0ZWRNb2Rlcy51c2VyUHJvZmlsZSB8fCB1c2VyQXJncy51c2VyRGF0YURpcjtcbiAgICBjb25zdCBoZWFkbGVzcyAgICA9IGRldGVjdGVkTW9kZXMuaGVhZGxlc3MgfHwgdXNlckFyZ3MuaGVhZGxlc3M7XG4gICAgY29uc3QgZW11bGF0aW9uICAgPSBkZXRlY3RlZE1vZGVzLmVtdWxhdGlvbiB8fCBoZWFkbGVzcztcblxuICAgIGNvbnN0IG1vZGVzID0ge1xuICAgICAgICBwYXRoLFxuICAgICAgICB1c2VyUHJvZmlsZSxcbiAgICAgICAgaGVhZGxlc3MsXG4gICAgICAgIGVtdWxhdGlvblxuICAgIH07XG5cbiAgICByZXR1cm4geyBtb2Rlcywgb3B0aW9uc1N0cmluZyB9O1xufVxuXG5mdW5jdGlvbiBzaW1wbGlmeURldmljZU5hbWUgKGRldmljZU5hbWUpIHtcbiAgICByZXR1cm4gZGV2aWNlTmFtZS5yZXBsYWNlKC9cXHMvZywgJycpLnRvTG93ZXJDYXNlKCk7XG59XG5cbmZ1bmN0aW9uIGZpbmREZXZpY2UgKGRldmljZU5hbWUpIHtcbiAgICBjb25zdCBzaW1wbGVOYW1lID0gc2ltcGxpZnlEZXZpY2VOYW1lKGRldmljZU5hbWUpO1xuXG4gICAgcmV0dXJuIGVtdWxhdGVkRGV2aWNlcy5maWx0ZXIoZGV2aWNlID0+IHNpbXBsaWZ5RGV2aWNlTmFtZShkZXZpY2UudGl0bGUpLmluZGV4T2Yoc2ltcGxlTmFtZSkgPj0gMClbMF07XG59XG5cbmZ1bmN0aW9uIGdldERldmljZUJhc2VkT3B0aW9ucyAoZGV2aWNlTmFtZSwgb3JpZW50YXRpb24pIHtcbiAgICBpZiAoIWRldmljZU5hbWUpXG4gICAgICAgIHJldHVybiB7fTtcblxuICAgIGNvbnN0IGRldmljZURhdGEgPSBmaW5kRGV2aWNlKGRldmljZU5hbWUpO1xuXG4gICAgaWYgKCFkZXZpY2VEYXRhKVxuICAgICAgICByZXR1cm4ge307XG5cbiAgICBjb25zdCBtb2JpbGUgPSBkZXZpY2VEYXRhLmNhcGFiaWxpdGllcy5pbmRleE9mKCdtb2JpbGUnKSA+PSAwO1xuXG4gICAgaWYgKCFvcmllbnRhdGlvbilcbiAgICAgICAgb3JpZW50YXRpb24gPSBtb2JpbGUgPyAndmVydGljYWwnIDogJ2hvcml6b250YWwnO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgbW9iaWxlOiAgICAgIG1vYmlsZSxcbiAgICAgICAgb3JpZW50YXRpb246IG9yaWVudGF0aW9uLFxuICAgICAgICB0b3VjaDogICAgICAgZGV2aWNlRGF0YS5jYXBhYmlsaXRpZXMuaW5kZXhPZigndG91Y2gnKSA+PSAwLFxuICAgICAgICB3aWR0aDogICAgICAgZGV2aWNlRGF0YS5zY3JlZW5bb3JpZW50YXRpb25dLndpZHRoLFxuICAgICAgICBoZWlnaHQ6ICAgICAgZGV2aWNlRGF0YS5zY3JlZW5bb3JpZW50YXRpb25dLmhlaWdodCxcbiAgICAgICAgc2NhbGVGYWN0b3I6IGRldmljZURhdGEuc2NyZWVuWydkZXZpY2UtcGl4ZWwtcmF0aW8nXSxcbiAgICAgICAgdXNlckFnZW50OiAgIGRldmljZURhdGFbJ3VzZXItYWdlbnQnXSxcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBwYXJzZU9wdGlvbnMgKHN0ciwgdXNlRGVmYXVsdERpbWVuc2lvbnMpIHtcbiAgICBjb25zdCBwYXJzZWQgPSBzcGxpdEVzY2FwZWQoc3RyLCAnOycpO1xuXG4gICAgY29uc3QgYmFzZU9wdGlvbnMgPSB7XG4gICAgICAgIHdpZHRoOiAgICAgICB1c2VEZWZhdWx0RGltZW5zaW9ucyA/IEhFQURMRVNTX0RFRkFVTFRfV0lEVEggOiAwLFxuICAgICAgICBoZWlnaHQ6ICAgICAgdXNlRGVmYXVsdERpbWVuc2lvbnMgPyBIRUFETEVTU19ERUZBVUxUX0hFSUdIVCA6IDAsXG4gICAgICAgIHNjYWxlRmFjdG9yOiAwLFxuICAgICAgICBtb2JpbGU6ICAgICAgZmFsc2UsXG4gICAgICAgIGNkcFBvcnQ6ICAgICBmaW5kTWF0Y2gocGFyc2VkLCAvXmNkcFBvcnQ9KC4qKS8pXG4gICAgfTtcblxuICAgIGNvbnN0IGRldmljZU5hbWUgICAgICAgICA9IGZpbmRNYXRjaChwYXJzZWQsIC9eZGV2aWNlPSguKikvKTtcbiAgICBjb25zdCBvcmllbnRhdGlvbiAgICAgICAgPSBmaW5kTWF0Y2gocGFyc2VkLCAvXm9yaWVudGF0aW9uPSguKikvKTtcbiAgICBjb25zdCBkZXZpY2VCYXNlZE9wdGlvbnMgPSBnZXREZXZpY2VCYXNlZE9wdGlvbnMoZGV2aWNlTmFtZSwgb3JpZW50YXRpb24pO1xuXG4gICAgbGV0IHNwZWNpZmllZERldmljZU9wdGlvbnMgPSB7XG4gICAgICAgIG9yaWVudGF0aW9uOiBvcmllbnRhdGlvbixcbiAgICAgICAgdG91Y2g6ICAgICAgIGhhc01hdGNoKHBhcnNlZCwgL150b3VjaD0vKSA/IGlzTWF0Y2hUcnVlKHBhcnNlZCwgL150b3VjaD0oLiopLykgOiB2b2lkIDAsXG4gICAgICAgIG1vYmlsZTogICAgICBpc01hdGNoVHJ1ZShwYXJzZWQsIC9ebW9iaWxlPSguKikvKSxcbiAgICAgICAgd2lkdGg6ICAgICAgIE51bWJlcihmaW5kTWF0Y2gocGFyc2VkLCAvXndpZHRoPSguKikvKSB8fCBOYU4pLFxuICAgICAgICBoZWlnaHQ6ICAgICAgTnVtYmVyKGZpbmRNYXRjaChwYXJzZWQsIC9eaGVpZ2h0PSguKikvKSB8fCBOYU4pLFxuICAgICAgICBzY2FsZUZhY3RvcjogTnVtYmVyKGZpbmRNYXRjaChwYXJzZWQsIC9ec2NhbGVGYWN0b3I9KC4qKS8pIHx8IE5hTiksXG4gICAgICAgIHVzZXJBZ2VudDogICBmaW5kTWF0Y2gocGFyc2VkLCAvXnVzZXJBZ2VudD0oLiopLylcbiAgICB9O1xuXG4gICAgc3BlY2lmaWVkRGV2aWNlT3B0aW9ucyA9IGZpbHRlclByb3BlcnRpZXMoc3BlY2lmaWVkRGV2aWNlT3B0aW9ucywgb3B0aW9uVmFsdWUgPT4ge1xuICAgICAgICByZXR1cm4gb3B0aW9uVmFsdWUgIT09IHZvaWQgMCAmJiBvcHRpb25WYWx1ZSAhPT0gJycgJiYgIU51bWJlci5pc05hTihvcHRpb25WYWx1ZSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihiYXNlT3B0aW9ucywgZGV2aWNlQmFzZWRPcHRpb25zLCBzcGVjaWZpZWREZXZpY2VPcHRpb25zKTtcbn1cblxuXG5mdW5jdGlvbiBnZXROZXdDb25maWcgKGNvbmZpZ1N0cmluZykge1xuICAgIGNvbnN0IHsgdXNlckFyZ3MsIG1vZGVzU3RyaW5nIH0gPSBwYXJzZUNvbmZpZyhjb25maWdTdHJpbmcpO1xuICAgIGNvbnN0IHBhcnNlZFVzZXJBcmdzICAgICAgICAgICAgPSBwYXJzZVVzZXJBcmdzKHVzZXJBcmdzKTtcbiAgICBjb25zdCB7IG1vZGVzLCBvcHRpb25zU3RyaW5nIH0gID0gcGFyc2VNb2Rlcyhtb2Rlc1N0cmluZywgcGFyc2VkVXNlckFyZ3MpO1xuICAgIGNvbnN0IHVzZURlZmF1bHREaW1lbnNpb25zICAgICAgPSBtb2Rlcy5oZWFkbGVzcyAmJiAhcGFyc2VkVXNlckFyZ3Mud2luZG93U2l6ZTtcbiAgICBjb25zdCBvcHRpb25zICAgICAgICAgICAgICAgICAgID0gcGFyc2VPcHRpb25zKG9wdGlvbnNTdHJpbmcsIHVzZURlZmF1bHREaW1lbnNpb25zKTtcblxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHsgdXNlckFyZ3MgfSwgbW9kZXMsIG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoY29uZmlnU3RyaW5nKSB7XG4gICAgaWYgKCFjb25maWdDYWNoZVtjb25maWdTdHJpbmddKVxuICAgICAgICBjb25maWdDYWNoZVtjb25maWdTdHJpbmddID0gZ2V0TmV3Q29uZmlnKGNvbmZpZ1N0cmluZyk7XG5cbiAgICByZXR1cm4gY29uZmlnQ2FjaGVbY29uZmlnU3RyaW5nXTtcbn1cbiJdfQ==