@ngx-toolkit/device
Version:
Angular device user-agent detection with Universal support
176 lines • 13.3 kB
JavaScript
import { Device, DevicePlatform, DeviceType } from './device.model';
/**
* see https://github.com/spring-projects/spring-mobile
*/
export class DeviceService {
static resolveDevice(userAgent) {
if (!userAgent) {
return new Device(DeviceType.NORMAL, DevicePlatform.UNKNOWN);
}
userAgent = userAgent.toLowerCase();
/**
* Tablet Detection
*/
// Apple
if (userAgent.includes('ipad')) {
return new Device(DeviceType.TABLET, DevicePlatform.IOS);
}
const isMobile = userAgent.includes('mobile') ||
DeviceService.KNOWN_MOBILE_USER_AGENT_KEYWORDS.some(mobileUserAgent => userAgent.includes(mobileUserAgent));
if (!isMobile) {
// Android
if (userAgent.includes('android')) {
return new Device(DeviceType.TABLET, DevicePlatform.ANDROID);
}
// Kindle Fire
if (userAgent.includes('silk')) {
return new Device(DeviceType.TABLET, DevicePlatform.UNKNOWN);
}
}
// From keywords
if (DeviceService.KNOWN_TABLET_USER_AGENT_KEYWORDS.some(tabletUserAgent => userAgent.includes(tabletUserAgent))) {
return new Device(DeviceType.TABLET, DevicePlatform.UNKNOWN);
}
/**
* Mobile detection
*/
// From prefix
if (userAgent.length >= 4 &&
DeviceService.KNOWN_MOBILE_USER_AGENT_PREFIXES.indexOf(userAgent.substring(0, 4)) !== -1) {
return new Device(DeviceType.MOBILE, DevicePlatform.UNKNOWN);
}
// Android
if (userAgent.includes('android')) {
return new Device(DeviceType.MOBILE, DevicePlatform.ANDROID);
}
// Apple
if (userAgent.includes('iphone') || userAgent.includes('ipod') || userAgent.includes('ipad')) {
return new Device(DeviceType.MOBILE, DevicePlatform.IOS);
}
// From keywords
if (isMobile) {
return new Device(DeviceType.MOBILE, DevicePlatform.UNKNOWN);
}
/**
* => Normal device
*/
return new Device(DeviceType.NORMAL, DevicePlatform.UNKNOWN);
}
}
DeviceService.KNOWN_MOBILE_USER_AGENT_PREFIXES = [
'w3c ',
'w3c-',
'acs-',
'alav',
'alca',
'amoi',
'avan',
'benq',
'bird',
'blac',
'blaz',
'brew',
'cell',
'cldc',
'cmd-',
'dang',
'doco',
'eric',
'hipt',
'htc_',
'inno',
'ipaq',
'ipod',
'jigs',
'kddi',
'keji',
'leno',
'lg-c',
'lg-d',
'lg-g',
'lge-',
'lg/u',
'maui',
'maxo',
'midp',
'mits',
'mmef',
'mobi',
'mot-',
'moto',
'mwbp',
'nec-',
'newt',
'noki',
'palm',
'pana',
'pant',
'phil',
'play',
'port',
'prox',
'qwap',
'sage',
'sams',
'sany',
'sch-',
'sec-',
'send',
'seri',
'sgh-',
'shar',
'sie-',
'siem',
'smal',
'smar',
'sony',
'sph-',
'symb',
't-mo',
'teli',
'tim-',
'tosh',
'tsm-',
'upg1',
'upsi',
'vk-v',
'voda',
'wap-',
'wapa',
'wapi',
'wapp',
'wapr',
'webc',
'winw',
'winw',
'xda ',
'xda-'
];
DeviceService.KNOWN_MOBILE_USER_AGENT_KEYWORDS = [
'blackberry',
'webos',
'ipod',
'lge vx',
'midp',
'maemo',
'mmp',
'mobile',
'netfront',
'hiptop',
'nintendo DS',
'novarra',
'openweb',
'opera mobi',
'opera mini',
'palm',
'psp',
'phone',
'smartphone',
'symbian',
'up.browser',
'up.link',
'wap',
'windows ce'
];
DeviceService.KNOWN_TABLET_USER_AGENT_KEYWORDS = ['ipad', 'playbook', 'hp-tablet', 'kindle'];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2aWNlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXZpY2Uvc3JjL2xpYi9kZXZpY2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsTUFBTSxFQUFFLGNBQWMsRUFBRSxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUVsRTs7R0FFRztBQUNILE1BQU0sT0FBTyxhQUFhO0lBd0h4QixNQUFNLENBQUMsYUFBYSxDQUFDLFNBQWlCO1FBQ3BDLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDZCxPQUFPLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzlEO1FBRUQsU0FBUyxHQUFHLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVwQzs7V0FFRztRQUVILFFBQVE7UUFDUixJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDOUIsT0FBTyxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUMxRDtRQUVELE1BQU0sUUFBUSxHQUNaLFNBQVMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO1lBQzVCLGFBQWEsQ0FBQyxnQ0FBZ0MsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7UUFDOUcsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNiLFVBQVU7WUFDVixJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUU7Z0JBQ2pDLE9BQU8sSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDOUQ7WUFDRCxjQUFjO1lBQ2QsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUM5QixPQUFPLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQzlEO1NBQ0Y7UUFDRCxnQkFBZ0I7UUFDaEIsSUFBSSxhQUFhLENBQUMsZ0NBQWdDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQyxFQUFFO1lBQy9HLE9BQU8sSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDOUQ7UUFFRDs7V0FFRztRQUNILGNBQWM7UUFDZCxJQUNFLFNBQVMsQ0FBQyxNQUFNLElBQUksQ0FBQztZQUNyQixhQUFhLENBQUMsZ0NBQWdDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQ3hGO1lBQ0EsT0FBTyxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUM5RDtRQUNELFVBQVU7UUFDVixJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDakMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUM5RDtRQUNELFFBQVE7UUFDUixJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQzVGLE9BQU8sSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDMUQ7UUFDRCxnQkFBZ0I7UUFDaEIsSUFBSSxRQUFRLEVBQUU7WUFDWixPQUFPLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzlEO1FBRUQ7O1dBRUc7UUFDSCxPQUFPLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQy9ELENBQUM7O0FBcExjLDhDQUFnQyxHQUFhO0lBQzFELE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtDQUNQLENBQUM7QUFFYSw4Q0FBZ0MsR0FBYTtJQUMxRCxZQUFZO0lBQ1osT0FBTztJQUNQLE1BQU07SUFDTixRQUFRO0lBQ1IsTUFBTTtJQUNOLE9BQU87SUFDUCxLQUFLO0lBQ0wsUUFBUTtJQUNSLFVBQVU7SUFDVixRQUFRO0lBQ1IsYUFBYTtJQUNiLFNBQVM7SUFDVCxTQUFTO0lBQ1QsWUFBWTtJQUNaLFlBQVk7SUFDWixNQUFNO0lBQ04sS0FBSztJQUNMLE9BQU87SUFDUCxZQUFZO0lBQ1osU0FBUztJQUNULFlBQVk7SUFDWixTQUFTO0lBQ1QsS0FBSztJQUNMLFlBQVk7Q0FDYixDQUFDO0FBRWEsOENBQWdDLEdBQWEsQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RGV2aWNlLCBEZXZpY2VQbGF0Zm9ybSwgRGV2aWNlVHlwZX0gZnJvbSAnLi9kZXZpY2UubW9kZWwnO1xuXG4vKipcbiAqIHNlZSBodHRwczovL2dpdGh1Yi5jb20vc3ByaW5nLXByb2plY3RzL3NwcmluZy1tb2JpbGVcbiAqL1xuZXhwb3J0IGNsYXNzIERldmljZVNlcnZpY2Uge1xuICBwcml2YXRlIHN0YXRpYyBLTk9XTl9NT0JJTEVfVVNFUl9BR0VOVF9QUkVGSVhFUzogc3RyaW5nW10gPSBbXG4gICAgJ3czYyAnLFxuICAgICd3M2MtJyxcbiAgICAnYWNzLScsXG4gICAgJ2FsYXYnLFxuICAgICdhbGNhJyxcbiAgICAnYW1vaScsXG4gICAgJ2F2YW4nLFxuICAgICdiZW5xJyxcbiAgICAnYmlyZCcsXG4gICAgJ2JsYWMnLFxuICAgICdibGF6JyxcbiAgICAnYnJldycsXG4gICAgJ2NlbGwnLFxuICAgICdjbGRjJyxcbiAgICAnY21kLScsXG4gICAgJ2RhbmcnLFxuICAgICdkb2NvJyxcbiAgICAnZXJpYycsXG4gICAgJ2hpcHQnLFxuICAgICdodGNfJyxcbiAgICAnaW5ubycsXG4gICAgJ2lwYXEnLFxuICAgICdpcG9kJyxcbiAgICAnamlncycsXG4gICAgJ2tkZGknLFxuICAgICdrZWppJyxcbiAgICAnbGVubycsXG4gICAgJ2xnLWMnLFxuICAgICdsZy1kJyxcbiAgICAnbGctZycsXG4gICAgJ2xnZS0nLFxuICAgICdsZy91JyxcbiAgICAnbWF1aScsXG4gICAgJ21heG8nLFxuICAgICdtaWRwJyxcbiAgICAnbWl0cycsXG4gICAgJ21tZWYnLFxuICAgICdtb2JpJyxcbiAgICAnbW90LScsXG4gICAgJ21vdG8nLFxuICAgICdtd2JwJyxcbiAgICAnbmVjLScsXG4gICAgJ25ld3QnLFxuICAgICdub2tpJyxcbiAgICAncGFsbScsXG4gICAgJ3BhbmEnLFxuICAgICdwYW50JyxcbiAgICAncGhpbCcsXG4gICAgJ3BsYXknLFxuICAgICdwb3J0JyxcbiAgICAncHJveCcsXG4gICAgJ3F3YXAnLFxuICAgICdzYWdlJyxcbiAgICAnc2FtcycsXG4gICAgJ3NhbnknLFxuICAgICdzY2gtJyxcbiAgICAnc2VjLScsXG4gICAgJ3NlbmQnLFxuICAgICdzZXJpJyxcbiAgICAnc2doLScsXG4gICAgJ3NoYXInLFxuICAgICdzaWUtJyxcbiAgICAnc2llbScsXG4gICAgJ3NtYWwnLFxuICAgICdzbWFyJyxcbiAgICAnc29ueScsXG4gICAgJ3NwaC0nLFxuICAgICdzeW1iJyxcbiAgICAndC1tbycsXG4gICAgJ3RlbGknLFxuICAgICd0aW0tJyxcbiAgICAndG9zaCcsXG4gICAgJ3RzbS0nLFxuICAgICd1cGcxJyxcbiAgICAndXBzaScsXG4gICAgJ3ZrLXYnLFxuICAgICd2b2RhJyxcbiAgICAnd2FwLScsXG4gICAgJ3dhcGEnLFxuICAgICd3YXBpJyxcbiAgICAnd2FwcCcsXG4gICAgJ3dhcHInLFxuICAgICd3ZWJjJyxcbiAgICAnd2ludycsXG4gICAgJ3dpbncnLFxuICAgICd4ZGEgJyxcbiAgICAneGRhLSdcbiAgXTtcblxuICBwcml2YXRlIHN0YXRpYyBLTk9XTl9NT0JJTEVfVVNFUl9BR0VOVF9LRVlXT1JEUzogc3RyaW5nW10gPSBbXG4gICAgJ2JsYWNrYmVycnknLFxuICAgICd3ZWJvcycsXG4gICAgJ2lwb2QnLFxuICAgICdsZ2UgdngnLFxuICAgICdtaWRwJyxcbiAgICAnbWFlbW8nLFxuICAgICdtbXAnLFxuICAgICdtb2JpbGUnLFxuICAgICduZXRmcm9udCcsXG4gICAgJ2hpcHRvcCcsXG4gICAgJ25pbnRlbmRvIERTJyxcbiAgICAnbm92YXJyYScsXG4gICAgJ29wZW53ZWInLFxuICAgICdvcGVyYSBtb2JpJyxcbiAgICAnb3BlcmEgbWluaScsXG4gICAgJ3BhbG0nLFxuICAgICdwc3AnLFxuICAgICdwaG9uZScsXG4gICAgJ3NtYXJ0cGhvbmUnLFxuICAgICdzeW1iaWFuJyxcbiAgICAndXAuYnJvd3NlcicsXG4gICAgJ3VwLmxpbmsnLFxuICAgICd3YXAnLFxuICAgICd3aW5kb3dzIGNlJ1xuICBdO1xuXG4gIHByaXZhdGUgc3RhdGljIEtOT1dOX1RBQkxFVF9VU0VSX0FHRU5UX0tFWVdPUkRTOiBzdHJpbmdbXSA9IFsnaXBhZCcsICdwbGF5Ym9vaycsICdocC10YWJsZXQnLCAna2luZGxlJ107XG5cbiAgc3RhdGljIHJlc29sdmVEZXZpY2UodXNlckFnZW50OiBzdHJpbmcpOiBEZXZpY2Uge1xuICAgIGlmICghdXNlckFnZW50KSB7XG4gICAgICByZXR1cm4gbmV3IERldmljZShEZXZpY2VUeXBlLk5PUk1BTCwgRGV2aWNlUGxhdGZvcm0uVU5LTk9XTik7XG4gICAgfVxuXG4gICAgdXNlckFnZW50ID0gdXNlckFnZW50LnRvTG93ZXJDYXNlKCk7XG5cbiAgICAvKipcbiAgICAgKiBUYWJsZXQgRGV0ZWN0aW9uXG4gICAgICovXG5cbiAgICAvLyBBcHBsZVxuICAgIGlmICh1c2VyQWdlbnQuaW5jbHVkZXMoJ2lwYWQnKSkge1xuICAgICAgcmV0dXJuIG5ldyBEZXZpY2UoRGV2aWNlVHlwZS5UQUJMRVQsIERldmljZVBsYXRmb3JtLklPUyk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNNb2JpbGU6IGJvb2xlYW4gPVxuICAgICAgdXNlckFnZW50LmluY2x1ZGVzKCdtb2JpbGUnKSB8fFxuICAgICAgRGV2aWNlU2VydmljZS5LTk9XTl9NT0JJTEVfVVNFUl9BR0VOVF9LRVlXT1JEUy5zb21lKG1vYmlsZVVzZXJBZ2VudCA9PiB1c2VyQWdlbnQuaW5jbHVkZXMobW9iaWxlVXNlckFnZW50KSk7XG4gICAgaWYgKCFpc01vYmlsZSkge1xuICAgICAgLy8gQW5kcm9pZFxuICAgICAgaWYgKHVzZXJBZ2VudC5pbmNsdWRlcygnYW5kcm9pZCcpKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGV2aWNlKERldmljZVR5cGUuVEFCTEVULCBEZXZpY2VQbGF0Zm9ybS5BTkRST0lEKTtcbiAgICAgIH1cbiAgICAgIC8vIEtpbmRsZSBGaXJlXG4gICAgICBpZiAodXNlckFnZW50LmluY2x1ZGVzKCdzaWxrJykpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZXZpY2UoRGV2aWNlVHlwZS5UQUJMRVQsIERldmljZVBsYXRmb3JtLlVOS05PV04pO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBGcm9tIGtleXdvcmRzXG4gICAgaWYgKERldmljZVNlcnZpY2UuS05PV05fVEFCTEVUX1VTRVJfQUdFTlRfS0VZV09SRFMuc29tZSh0YWJsZXRVc2VyQWdlbnQgPT4gdXNlckFnZW50LmluY2x1ZGVzKHRhYmxldFVzZXJBZ2VudCkpKSB7XG4gICAgICByZXR1cm4gbmV3IERldmljZShEZXZpY2VUeXBlLlRBQkxFVCwgRGV2aWNlUGxhdGZvcm0uVU5LTk9XTik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW9iaWxlIGRldGVjdGlvblxuICAgICAqL1xuICAgIC8vIEZyb20gcHJlZml4XG4gICAgaWYgKFxuICAgICAgdXNlckFnZW50Lmxlbmd0aCA+PSA0ICYmXG4gICAgICBEZXZpY2VTZXJ2aWNlLktOT1dOX01PQklMRV9VU0VSX0FHRU5UX1BSRUZJWEVTLmluZGV4T2YodXNlckFnZW50LnN1YnN0cmluZygwLCA0KSkgIT09IC0xXG4gICAgKSB7XG4gICAgICByZXR1cm4gbmV3IERldmljZShEZXZpY2VUeXBlLk1PQklMRSwgRGV2aWNlUGxhdGZvcm0uVU5LTk9XTik7XG4gICAgfVxuICAgIC8vIEFuZHJvaWRcbiAgICBpZiAodXNlckFnZW50LmluY2x1ZGVzKCdhbmRyb2lkJykpIHtcbiAgICAgIHJldHVybiBuZXcgRGV2aWNlKERldmljZVR5cGUuTU9CSUxFLCBEZXZpY2VQbGF0Zm9ybS5BTkRST0lEKTtcbiAgICB9XG4gICAgLy8gQXBwbGVcbiAgICBpZiAodXNlckFnZW50LmluY2x1ZGVzKCdpcGhvbmUnKSB8fCB1c2VyQWdlbnQuaW5jbHVkZXMoJ2lwb2QnKSB8fCB1c2VyQWdlbnQuaW5jbHVkZXMoJ2lwYWQnKSkge1xuICAgICAgcmV0dXJuIG5ldyBEZXZpY2UoRGV2aWNlVHlwZS5NT0JJTEUsIERldmljZVBsYXRmb3JtLklPUyk7XG4gICAgfVxuICAgIC8vIEZyb20ga2V5d29yZHNcbiAgICBpZiAoaXNNb2JpbGUpIHtcbiAgICAgIHJldHVybiBuZXcgRGV2aWNlKERldmljZVR5cGUuTU9CSUxFLCBEZXZpY2VQbGF0Zm9ybS5VTktOT1dOKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiA9PiBOb3JtYWwgZGV2aWNlXG4gICAgICovXG4gICAgcmV0dXJuIG5ldyBEZXZpY2UoRGV2aWNlVHlwZS5OT1JNQUwsIERldmljZVBsYXRmb3JtLlVOS05PV04pO1xuICB9XG59XG4iXX0=