detect-gpu
Version:
Classify GPU's based on their benchmark score in order to provide an adaptive experience.
131 lines (123 loc) • 66.5 kB
JavaScript
(function webpackUniversalModuleDefinition(root, factory) {
if(typeof exports === 'object' && typeof module === 'object')
module.exports = factory();
else if(typeof define === 'function' && define.amd)
define("DetectGPU", [], factory);
else if(typeof exports === 'object')
exports["DetectGPU"] = factory();
else
root["DetectGPU"] = factory();
})(window, function() {
return /******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ }
/******/ };
/******/
/******/ // define __esModule on exports
/******/ __webpack_require__.r = function(exports) {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/
/******/ // create a fake namespace object
/******/ // mode & 1: value is a module id, require it
/******/ // mode & 2: merge all properties of value into the ns
/******/ // mode & 4: return value when already ns object
/******/ // mode & 8|1: behave like require
/******/ __webpack_require__.t = function(value, mode) {
/******/ if(mode & 1) value = __webpack_require__(value);
/******/ if(mode & 8) return value;
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ var ns = Object.create(null);
/******/ __webpack_require__.r(ns);
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ return ns;
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = "./index.js");
/******/ })
/************************************************************************/
/******/ ({
/***/ "./benchmark.js":
/*!**********************!*\
!*** ./benchmark.js ***!
\**********************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n// Scraped from https://www.notebookcheck.net/\n// Mobile GPU benchmark: https://www.notebookcheck.net/Mobile-Graphics-Cards-Benchmark-List.844.0.html?type=&sort=&professional=2&showClassDescription=1&deskornote=3&archive=1&perfrating=1&or=0&showBars=1&3dmark13_ice_gpu=1&3dmark13_cloud_gpu=1&3dmark13_fire_gpu=1&3dmark11_gpu=1&gpu_fullname=1&architecture=1&pixelshaders=1&vertexshaders=1&corespeed=1&boostspeed=1&memoryspeed=1&memorybus=1&memorytype=1&directx=1\n// Desktop GPU benchmark: https://www.notebookcheck.net/Mobile-Graphics-Cards-Benchmark-List.844.0.html?type=&sort=&showClassDescription=1&deskornote=4&archive=1&perfrating=1&or=0&showBars=1&3dmark13_ice_gpu=1&3dmark13_cloud_gpu=1&3dmark13_fire_gpu=1&3dmark11_gpu=1&gpu_fullname=1&architecture=1&pixelshaders=1&vertexshaders=1&corespeed=1&boostspeed=1&memoryspeed=1&memorybus=1&memorytype=1&directx=1\n\nvar BENCHMARK_SCORE_DESKTOP = exports.BENCHMARK_SCORE_DESKTOP = ['709 - AMD Radeon HD 7290', '699 - AMD Radeon HD 8180', '697 - AMD Radeon HD 7310', '695 - AMD Radeon HD 7340', '691 - Intel HD Graphics (Bay Trail)', '650 - Intel HD Graphics (Ivy Bridge)', '646 - AMD Radeon HD 8210', '622 - AMD Radeon HD 8250', '621 - AMD Radeon R6 (Mullins)', '620 - AMD Radeon HD 8240', '612 - AMD Radeon HD 8280', '609 - Intel HD Graphics (Cherry Trail)', '608 - AMD Radeon R2 (Mullins/Beema/Carrizo-L)', '588 - Intel HD Graphics (Haswell)', '579 - Intel HD Graphics 400 (Braswell)', '578 - Intel HD Graphics (Braswell)', '577 - Intel HD Graphics 405 (Braswell)', '557 - Intel HD Graphics 500', '556 - Intel UHD Graphics 600', '555 - AMD Radeon HD 8330', '554 - AMD Radeon HD 8350G', '541 - AMD Radeon HD 8400', '537 - AMD Radeon HD 8450G', '528 - Intel HD Graphics 4200', '527 - AMD Radeon R2 (Stoney Ridge)', '526 - AMD Radeon R3 (Mullins/Beema)', '525 - AMD Radeon R4 (Beema)', '524 - AMD Radeon R5 (Beema/Carrizo-L)', '522 - Intel HD Graphics (Broadwell)', '521 - AMD Radeon R4 (Kaveri)', '520 - AMD Radeon R4 (Stoney Ridge)', '516 - Intel HD Graphics 4000', '515 - AMD Radeon HD 7480D', '507 - Intel HD Graphics 505', '506 - Intel UHD Graphics 605', '505 - Intel HD Graphics 5300', '476 - Intel HD Graphics 510', '475 - Intel HD Graphics 610', '474 - Intel HD Graphics 4400', '473 - Intel HD Graphics 515', '466 - AMD Radeon HD 8470D', '457 - AMD Radeon HD 8550G', '441 - Intel HD Graphics 5000', '438 - AMD Radeon HD 7660G', '437 - NVIDIA GeForce 710M', '434 - AMD Radeon R5 (Kaveri)', '433 - AMD Radeon R5 (Carrizo)', '432 - Intel HD Graphics 615', '431 - Intel UHD Graphics 615', '424 - Intel HD Graphics 5500', '422 - Intel HD Graphics 4600', '419 - AMD Radeon HD 8610G', '417 - Intel Iris Graphics 5100', '415 - NVIDIA Quadro K610M', '414 - Intel HD Graphics 6000', '408 - AMD Radeon R5 M420', '407 - AMD Radeon R5 M315', '406 - AMD Radeon R5 M230', '405 - AMD Radeon R5 M320', '404 - AMD Radeon R5 M240', '402 - AMD Radeon R5 (Stoney Ridge)', '401 - NVIDIA GeForce GT 720M', '400 - Intel Iris Graphics 6100', '399 - Intel HD Graphics 520', '398 - AMD Radeon RX Vega 3', '397 - NVIDIA GeForce 820M', '396 - NVIDIA GeForce 910M', '394 - AMD Radeon R5 M255', '393 - AMD Radeon R5 M430', '392 - AMD Radeon R5 M330', '391 - AMD Radeon R5 M335', '389 - AMD Radeon HD 7560D', '383 - AMD Radeon HD 8650G', '367 - NVIDIA Quadro K1000M', '365 - AMD Radeon HD 7660D', '364 - AMD Radeon R6 M255DX', '357 - Intel HD Graphics 5600', '347 - AMD FirePro W2100', '338 - AMD Radeon R6 (Kaveri)', '326 - AMD Radeon R6 (Carrizo)', '325 - Intel HD Graphics 620', '324 - Intel UHD Graphics 620', '323 - AMD Radeon R5 (Bristol Ridge)', '321 - Intel HD Graphics P530', '320 - Intel HD Graphics 530', '319 - Intel HD Graphics P630', '318 - Intel HD Graphics 630', '317 - Intel UHD Graphics 630', '316 - AMD Radeon RX Vega 6', '315 - AMD Radeon R6 M340DX', '314 - AMD Radeon 520', '313 - AMD Radeon R7 M340', '312 - AMD Radeon R7 M260', '306 - AMD Radeon R7 M440', '305 - AMD Radeon R8 M445DX', '302 - NVIDIA GeForce 920M', '300 - AMD Radeon R7 M360', '297 - AMD Radeon R7 M460', '296 - AMD Radeon R8 M365DX', '295 - AMD Radeon R7 (Kaveri)', '294 - AMD Radeon R7 (Carrizo)', '293 - NVIDIA GeForce GT 640M', '292 - AMD Radeon R7 (Bristol Ridge)', '288 - AMD Radeon R7 M265', '287 - AMD Radeon R7 M270', '284 - AMD FirePro M4100', '281 - NVIDIA GeForce GT 730M', '278 - AMD Radeon R7 M260X', '271 - AMD FirePro M4000', '269 - NVIDIA GeForce 825M', '267 - NVIDIA GeForce GT 735M', '264 - NVIDIA Quadro K2000M', '260 - Intel Iris Graphics 540', '259 - NVIDIA GeForce 920MX', '258 - Intel Iris Plus Graphics 640', '257 - NVIDIA GeForce MX110', '256 - NVIDIA GeForce 830M', '255 - AMD Radeon 530', '254 - Intel Iris Graphics 550', '253 - NVIDIA GeForce 930M', '252 - Intel Iris Plus Graphics 650', '251 - NVIDIA GeForce GT 740M', '250 - AMD Radeon R7 384 Cores (Kaveri Desktop)', '249 - Intel Iris Pro Graphics 5200', '248 - AMD Radeon R7 512 Cores (Kaveri Desktop)', '245 - NVIDIA GeForce GT 745M', '244 - AMD Radeon R7 M275DX', '243 - NVIDIA GeForce 840M', '242 - NVIDIA Quadro M500M', '239 - AMD Radeon R7 M370', '237 - AMD Radeon R7 M445', '236 - Intel Iris Plus Graphics 655', '235 - AMD Radeon R9 M375', '234 - AMD FirePro W4190M', '233 - NVIDIA Quadro M600M', '232 - NVIDIA GeForce 930MX', '231 - NVIDIA GeForce 940M', '230 - AMD Radeon RX Vega 8', '229 - NVIDIA Quadro K1100M', '228 - NVIDIA Quadro M520', '227 - NVIDIA GeForce 940MX', '226 - NVIDIA GeForce MX130', '225 - Intel Iris Pro Graphics 6200', '224 - NVIDIA GeForce GT 750M', '219 - AMD FirePro W4100', '218 - AMD FirePro W4170M', '216 - AMD Radeon R7 M465', '214 - AMD Radeon R9 M265X', '211 - NVIDIA GeForce 845M', '209 - NVIDIA GeForce GT 755M', '208 - AMD Radeon R7 250', '203 - NVIDIA Quadro K2100M', '202 - AMD FirePro M5100', '201 - AMD FirePro M6000', '199 - NVIDIA Quadro K3000M', '193 - AMD FirePro W5130M', '192 - NVIDIA Maxwell GPU Surface Book (940M, GDDR5)', '190 - AMD Radeon R9 M275', '189 - NVIDIA GeForce GTX 760M', '186 - AMD Radeon R9 M370X', '185 - AMD FirePro W5170M', '184 - NVIDIA Quadro K3100M', '175 - AMD Radeon R9 M380', '173 - AMD Radeon R9 M470', '168 - Intel Iris Pro Graphics 580', '167 - Intel Iris Pro Graphics P580', '166 - AMD Radeon RX Vega 10', '165 - NVIDIA Quadro K4000M', '161 - NVIDIA Quadro P500', '160 - NVIDIA GeForce GTX 765M', '159 - NVIDIA GeForce 945M', '154 - AMD Radeon RX Vega 11', '153 - AMD Radeon R9 M280X', '152 - NVIDIA Quadro M620', '151 - NVIDIA Quadro M1000M', '150 - NVIDIA GeForce GTX 850M', '149 - AMD Radeon R9 M385X', '148 - AMD Radeon R9 M470X', '147 - AMD Radeon Pro 450', '146 - NVIDIA GeForce GTX 950M', '138 - NVIDIA GeForce GTX 860M', '137 - AMD Radeon Pro WX 3100 Mobile', '136 - AMD Radeon RX 540', '135 - NVIDIA GeForce GTX 770M', '134 - NVIDIA Quadro K4100M', '133 - NVIDIA Quadro K5000M', '132 - NVIDIA Quadro M2000M', '131 - NVIDIA GeForce MX150', '130 - NVIDIA Quadro P600', '129 - NVIDIA GeForce GT 1030 (Desktop)', '128 - AMD Radeon Pro 455', '127 - AMD Radeon Pro 555', '126 - AMD Radeon Pro 555X', '125 - NVIDIA Quadro M1200', '121 - AMD Radeon RX 550 (Laptop)', '120 - NVIDIA GeForce GTX 750 Ti', '119 - NVIDIA GeForce GTX 960M', '118 - AMD Radeon Pro WX 4130', '117 - AMD Radeon Pro 460', '116 - AMD Radeon Pro 560', '115 - AMD Radeon Pro 560X', '113 - AMD FirePro M6100', '112 - AMD Radeon R9 M390', '109 - AMD Radeon RX 460 (Laptop)', '103 - AMD Radeon R9 M290X', '102 - NVIDIA GeForce GTX 870M', '101 - NVIDIA Quadro M2200', '100 - AMD Radeon RX 560 (Laptop)', '99 - AMD Radeon RX 560X (Laptop)', '98 - NVIDIA GeForce GTX 965M', '96 - AMD Radeon Pro WX 4150', '95 - AMD Radeon RX 460 (Desktop)', '93 - NVIDIA Quadro P1000', '92 - NVIDIA Quadro K5100M', '91 - NVIDIA GeForce GTX 780M', '90 - NVIDIA GeForce GTX 760', '88 - AMD Radeon R9 270X', '87 - NVIDIA GeForce GTX 950', '86 - NVIDIA GeForce GTX 880M', '84 - AMD Radeon R7 370', '83 - AMD Radeon R9 M395', '82 - AMD FirePro W7170M', '81 - NVIDIA GeForce GTX 1050 Max-Q', '80 - NVIDIA GeForce GTX 1050 (Notebook)', '79 - NVIDIA GeForce GTX 1050 (Desktop)', '78 - NVIDIA Quadro M3000M', '77 - AMD Radeon R9 M390X', '76 - AMD Radeon R9 M295X', '75 - AMD Radeon R9 M485X', '74 - AMD Radeon RX Vega M GL / 870', '73 - AMD Radeon R9 M395X', '68 - NVIDIA Quadro M4000M', '67 - NVIDIA GeForce GTX 970M', '66 - NVIDIA Quadro P2000', '65 - NVIDIA GeForce GTX 1050 Ti (Desktop)', '64 - NVIDIA GeForce GTX 1050 Ti Max-Q', '63 - NVIDIA GeForce GTX 1050 Ti (Notebook)', '62 - NVIDIA GeForce GTX 960', '61 - AMD Radeon R9 380', '60 - AMD Radeon R9 280X', '59 - NVIDIA Quadro M5000M', '58 - AMD Radeon RX Vega M GH', '57 - NVIDIA GeForce GTX 980M', '52 - NVIDIA GeForce GTX 965M SLI', '50 - AMD Radeon R9 290X', '48 - NVIDIA GeForce GTX 880M SLI', '47 - AMD Radeon RX 470 (Laptop)', '46 - AMD Radeon RX 570 (Laptop)', '45 - AMD Radeon RX 470 (Desktop)', '44 - AMD Radeon Pro WX 7100', '42 - NVIDIA Quadro P3000 Max-Q', '41 - NVIDIA GeForce GTX 1060 Max-Q', '40 - NVIDIA GeForce GTX 970', '39 - NVIDIA Quadro P3000', '38 - AMD Radeon RX Vega Mobile', '37 - NVIDIA GeForce GTX 780 Ti', '36 - AMD Radeon RX 580 (Laptop)', '35 - NVIDIA Quadro P3200', '34 - NVIDIA Quadro P4000 Max-Q', '33 - NVIDIA GeForce GTX 1060 (Laptop)', '32 - AMD Radeon RX 480 (Desktop)', '31 - NVIDIA Quadro P4000', '30 - NVIDIA GeForce GTX 1060 (Desktop)', '29 - NVIDIA GeForce GTX 970M SLI', '28 - AMD Radeon R9 390X', '27 - NVIDIA Quadro M5500', '26 - NVIDIA GeForce GTX 980 (Laptop)', '25 - AMD Radeon RX 580 (Desktop)', '24 - NVIDIA GeForce GTX 980', '23 - AMD Radeon R9 Nano', '22 - AMD Radeon R9 Fury', '21 - NVIDIA GeForce GTX 980M SLI', '20 - NVIDIA Quadro P5000 Max-Q', '19 - NVIDIA GeForce GTX 1070 Max-Q', '18 - NVIDIA GeForce GTX 980 Ti', '17 - NVIDIA Quadro P5000', '16 - NVIDIA Quadro P4200', '15 - NVIDIA GeForce GTX 1070 (Laptop)', '14 - NVIDIA GeForce GTX 1080 Max-Q', '13 - NVIDIA GeForce GTX 1070 (Desktop)', '12 - AMD Radeon Pro Vega 56', '11 - NVIDIA Quadro P5200', '10 - NVIDIA GeForce GTX 980 SLI (Laptop)', '9 - NVIDIA GeForce GTX 1070 Ti (Desktop)', '8 - NVIDIA GeForce GTX 1080 (Laptop)', '7 - AMD Radeon RX Vega 64', '6 - NVIDIA GeForce GTX 1080 (Desktop)', '5 - NVIDIA GeForce GTX 1070 SLI (Laptop)', '4 - NVIDIA GeForce GTX 1070 SLI (Desktop)', '3 - NVIDIA GeForce GTX 1080 SLI (Laptop)', '2 - NVIDIA Titan X Pascal', '1 - NVIDIA GeForce GTX 1080 Ti (Desktop)'];\n\nvar BENCHMARK_SCORE_MOBILE = exports.BENCHMARK_SCORE_MOBILE = ['848 - ARM Mali-200', '847 - Qualcomm Adreno 200', '846 - PowerVR SGX530', '845 - PowerVR SGX531', '844 - PowerVR SGX535', '843 - Vivante GC800', '842 - Qualcomm Adreno 203', '841 - Qualcomm Adreno 205', '839 - PowerVR SGX540', '837 - NVIDIA GeForce ULP (Tegra 2)', '836 - ARM Mali-400 MP', '835 - ARM Mali-400 MP2', '834 - Vivante GC1000+ Dual-Core', '833 - Qualcomm Adreno 220', '832 - Broadcom VideoCore-IV', '831 - NVIDIA GeForce ULP (Tegra 3)', '830 - ARM Mali-400 MP4', '829 - Vivante GC4000', '828 - Qualcomm Adreno 225', '820 - Qualcomm Adreno 302', '819 - Vivante GC7000UL', '818 - ARM Mali-T720', '817 - Qualcomm Adreno 304', '816 - Qualcomm Adreno 305', '815 - Qualcomm Adreno 306', '814 - Qualcomm Adreno 308', '813 - PowerVR SGX544', '812 - ARM Mali-T720 MP2', '811 - PowerVR SGX544MP2', '810 - PowerVR SGX545', '807 - PowerVR SGX543MP2', '797 - PowerVR SGX543MP3', '789 - ARM Mali-T830 MP1', '788 - ARM Mali-450 MP4', '787 - ARM Mali-T720 MP4', '786 - PowerVR GE8100', '785 - ARM Mali-T760 MP2', '784 - Qualcomm Adreno 320', '783 - ARM Mali-T624', '782 - PowerVR SGX543MP4', '755 - ARM Mali-T830 MP2', '754 - Qualcomm Adreno 405', '753 - PowerVR G6200', '752 - NVIDIA GeForce Tegra 4', '747 - ARM Mali-T604 MP4', '741 - ARM Mali-T830 MP3', '740 - ARM Mali-T860 MP2', '736 - Qualcomm Adreno 505', '735 - Qualcomm Adreno 506', '734 - Qualcomm Adreno 508', '733 - Qualcomm Adreno 509', '732 - ARM Mali-T628 MP4', '731 - PowerVR SGX554MP4', '693 - ARM Mali-T760 MP4', '692 - ARM Mali-T628 MP6', '691 - Intel HD Graphics (Bay Trail)', '690 - PowerVR G6400', '689 - PowerVR GX6250', '688 - PowerVR G6430', '687 - Qualcomm Adreno 330', '686 - Qualcomm Adreno 510', '685 - Qualcomm Adreno 512', '610 - ARM Mali-G51 MP4', '609 - Intel HD Graphics (Cherry Trail)', '607 - Qualcomm Adreno 418', '587 - Qualcomm Adreno 420', '586 - PowerVR GX6450', '576 - ARM Mali-T880 MP2', '575 - ARM Mali-T760 MP6', '543 - ARM Mali-T880 MP4', '542 - ARM Mali-G72 MP3', '523 - Qualcomm Adreno 430', '518 - ARM Mali-G71 MP2', '517 - ARM Mali-T760 MP8', '472 - ARM Mali-T880 MP12', '471 - Apple A9 / PowerVR GT7600', '470 - NVIDIA Tegra K1 Kepler GPU', '469 - PowerVR GXA6850', '468 - Qualcomm Adreno 530', '430 - ARM Mali-G71 MP8', '429 - ARM Mali-G72 MP12', '428 - ARM Mali-G71 MP20', '427 - ARM Mali-G72 MP18', '426 - Qualcomm Adreno 540', '425 - Qualcomm Adreno 630', '409 - Apple A10 Fusion GPU / PowerVR', '322 - NVIDIA Tegra X1 Maxwell GPU', '299 - Apple A9X / PowerVR Series 7XT', '263 - Apple A10X Fusion GPU / PowerVR', '262 - Apple A11 Bionic GPU', '261 - Apple A12 Bionic GPU'];//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9iZW5jaG1hcmsuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9EZXRlY3RHUFUvc3JjL2JlbmNobWFyay5qcz9mYzJkIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNjcmFwZWQgZnJvbSBodHRwczovL3d3dy5ub3RlYm9va2NoZWNrLm5ldC9cbi8vIE1vYmlsZSBHUFUgYmVuY2htYXJrOiBodHRwczovL3d3dy5ub3RlYm9va2NoZWNrLm5ldC9Nb2JpbGUtR3JhcGhpY3MtQ2FyZHMtQmVuY2htYXJrLUxpc3QuODQ0LjAuaHRtbD90eXBlPSZzb3J0PSZwcm9mZXNzaW9uYWw9MiZzaG93Q2xhc3NEZXNjcmlwdGlvbj0xJmRlc2tvcm5vdGU9MyZhcmNoaXZlPTEmcGVyZnJhdGluZz0xJm9yPTAmc2hvd0JhcnM9MSYzZG1hcmsxM19pY2VfZ3B1PTEmM2RtYXJrMTNfY2xvdWRfZ3B1PTEmM2RtYXJrMTNfZmlyZV9ncHU9MSYzZG1hcmsxMV9ncHU9MSZncHVfZnVsbG5hbWU9MSZhcmNoaXRlY3R1cmU9MSZwaXhlbHNoYWRlcnM9MSZ2ZXJ0ZXhzaGFkZXJzPTEmY29yZXNwZWVkPTEmYm9vc3RzcGVlZD0xJm1lbW9yeXNwZWVkPTEmbWVtb3J5YnVzPTEmbWVtb3J5dHlwZT0xJmRpcmVjdHg9MVxuLy8gRGVza3RvcCBHUFUgYmVuY2htYXJrOiBodHRwczovL3d3dy5ub3RlYm9va2NoZWNrLm5ldC9Nb2JpbGUtR3JhcGhpY3MtQ2FyZHMtQmVuY2htYXJrLUxpc3QuODQ0LjAuaHRtbD90eXBlPSZzb3J0PSZzaG93Q2xhc3NEZXNjcmlwdGlvbj0xJmRlc2tvcm5vdGU9NCZhcmNoaXZlPTEmcGVyZnJhdGluZz0xJm9yPTAmc2hvd0JhcnM9MSYzZG1hcmsxM19pY2VfZ3B1PTEmM2RtYXJrMTNfY2xvdWRfZ3B1PTEmM2RtYXJrMTNfZmlyZV9ncHU9MSYzZG1hcmsxMV9ncHU9MSZncHVfZnVsbG5hbWU9MSZhcmNoaXRlY3R1cmU9MSZwaXhlbHNoYWRlcnM9MSZ2ZXJ0ZXhzaGFkZXJzPTEmY29yZXNwZWVkPTEmYm9vc3RzcGVlZD0xJm1lbW9yeXNwZWVkPTEmbWVtb3J5YnVzPTEmbWVtb3J5dHlwZT0xJmRpcmVjdHg9MVxuXG5leHBvcnQgY29uc3QgQkVOQ0hNQVJLX1NDT1JFX0RFU0tUT1AgPSBbXG4gICc3MDkgLSBBTUQgUmFkZW9uIEhEIDcyOTAnLFxuICAnNjk5IC0gQU1EIFJhZGVvbiBIRCA4MTgwJyxcbiAgJzY5NyAtIEFNRCBSYWRlb24gSEQgNzMxMCcsXG4gICc2OTUgLSBBTUQgUmFkZW9uIEhEIDczNDAnLFxuICAnNjkxIC0gSW50ZWwgSEQgR3JhcGhpY3MgKEJheSBUcmFpbCknLFxuICAnNjUwIC0gSW50ZWwgSEQgR3JhcGhpY3MgKEl2eSBCcmlkZ2UpJyxcbiAgJzY0NiAtIEFNRCBSYWRlb24gSEQgODIxMCcsXG4gICc2MjIgLSBBTUQgUmFkZW9uIEhEIDgyNTAnLFxuICAnNjIxIC0gQU1EIFJhZGVvbiBSNiAoTXVsbGlucyknLFxuICAnNjIwIC0gQU1EIFJhZGVvbiBIRCA4MjQwJyxcbiAgJzYxMiAtIEFNRCBSYWRlb24gSEQgODI4MCcsXG4gICc2MDkgLSBJbnRlbCBIRCBHcmFwaGljcyAoQ2hlcnJ5IFRyYWlsKScsXG4gICc2MDggLSBBTUQgUmFkZW9uIFIyIChNdWxsaW5zL0JlZW1hL0NhcnJpem8tTCknLFxuICAnNTg4IC0gSW50ZWwgSEQgR3JhcGhpY3MgKEhhc3dlbGwpJyxcbiAgJzU3OSAtIEludGVsIEhEIEdyYXBoaWNzIDQwMCAoQnJhc3dlbGwpJyxcbiAgJzU3OCAtIEludGVsIEhEIEdyYXBoaWNzIChCcmFzd2VsbCknLFxuICAnNTc3IC0gSW50ZWwgSEQgR3JhcGhpY3MgNDA1IChCcmFzd2VsbCknLFxuICAnNTU3IC0gSW50ZWwgSEQgR3JhcGhpY3MgNTAwJyxcbiAgJzU1NiAtIEludGVsIFVIRCBHcmFwaGljcyA2MDAnLFxuICAnNTU1IC0gQU1EIFJhZGVvbiBIRCA4MzMwJyxcbiAgJzU1NCAtIEFNRCBSYWRlb24gSEQgODM1MEcnLFxuICAnNTQxIC0gQU1EIFJhZGVvbiBIRCA4NDAwJyxcbiAgJzUzNyAtIEFNRCBSYWRlb24gSEQgODQ1MEcnLFxuICAnNTI4IC0gSW50ZWwgSEQgR3JhcGhpY3MgNDIwMCcsXG4gICc1MjcgLSBBTUQgUmFkZW9uIFIyIChTdG9uZXkgUmlkZ2UpJyxcbiAgJzUyNiAtIEFNRCBSYWRlb24gUjMgKE11bGxpbnMvQmVlbWEpJyxcbiAgJzUyNSAtIEFNRCBSYWRlb24gUjQgKEJlZW1hKScsXG4gICc1MjQgLSBBTUQgUmFkZW9uIFI1IChCZWVtYS9DYXJyaXpvLUwpJyxcbiAgJzUyMiAtIEludGVsIEhEIEdyYXBoaWNzIChCcm9hZHdlbGwpJyxcbiAgJzUyMSAtIEFNRCBSYWRlb24gUjQgKEthdmVyaSknLFxuICAnNTIwIC0gQU1EIFJhZGVvbiBSNCAoU3RvbmV5IFJpZGdlKScsXG4gICc1MTYgLSBJbnRlbCBIRCBHcmFwaGljcyA0MDAwJyxcbiAgJzUxNSAtIEFNRCBSYWRlb24gSEQgNzQ4MEQnLFxuICAnNTA3IC0gSW50ZWwgSEQgR3JhcGhpY3MgNTA1JyxcbiAgJzUwNiAtIEludGVsIFVIRCBHcmFwaGljcyA2MDUnLFxuICAnNTA1IC0gSW50ZWwgSEQgR3JhcGhpY3MgNTMwMCcsXG4gICc0NzYgLSBJbnRlbCBIRCBHcmFwaGljcyA1MTAnLFxuICAnNDc1IC0gSW50ZWwgSEQgR3JhcGhpY3MgNjEwJyxcbiAgJzQ3NCAtIEludGVsIEhEIEdyYXBoaWNzIDQ0MDAnLFxuICAnNDczIC0gSW50ZWwgSEQgR3JhcGhpY3MgNTE1JyxcbiAgJzQ2NiAtIEFNRCBSYWRlb24gSEQgODQ3MEQnLFxuICAnNDU3IC0gQU1EIFJhZGVvbiBIRCA4NTUwRycsXG4gICc0NDEgLSBJbnRlbCBIRCBHcmFwaGljcyA1MDAwJyxcbiAgJzQzOCAtIEFNRCBSYWRlb24gSEQgNzY2MEcnLFxuICAnNDM3IC0gTlZJRElBIEdlRm9yY2UgNzEwTScsXG4gICc0MzQgLSBBTUQgUmFkZW9uIFI1IChLYXZlcmkpJyxcbiAgJzQzMyAtIEFNRCBSYWRlb24gUjUgKENhcnJpem8pJyxcbiAgJzQzMiAtIEludGVsIEhEIEdyYXBoaWNzIDYxNScsXG4gICc0MzEgLSBJbnRlbCBVSEQgR3JhcGhpY3MgNjE1JyxcbiAgJzQyNCAtIEludGVsIEhEIEdyYXBoaWNzIDU1MDAnLFxuICAnNDIyIC0gSW50ZWwgSEQgR3JhcGhpY3MgNDYwMCcsXG4gICc0MTkgLSBBTUQgUmFkZW9uIEhEIDg2MTBHJyxcbiAgJzQxNyAtIEludGVsIElyaXMgR3JhcGhpY3MgNTEwMCcsXG4gICc0MTUgLSBOVklESUEgUXVhZHJvIEs2MTBNJyxcbiAgJzQxNCAtIEludGVsIEhEIEdyYXBoaWNzIDYwMDAnLFxuICAnNDA4IC0gQU1EIFJhZGVvbiBSNSBNNDIwJyxcbiAgJzQwNyAtIEFNRCBSYWRlb24gUjUgTTMxNScsXG4gICc0MDYgLSBBTUQgUmFkZW9uIFI1IE0yMzAnLFxuICAnNDA1IC0gQU1EIFJhZGVvbiBSNSBNMzIwJyxcbiAgJzQwNCAtIEFNRCBSYWRlb24gUjUgTTI0MCcsXG4gICc0MDIgLSBBTUQgUmFkZW9uIFI1IChTdG9uZXkgUmlkZ2UpJyxcbiAgJzQwMSAtIE5WSURJQSBHZUZvcmNlIEdUIDcyME0nLFxuICAnNDAwIC0gSW50ZWwgSXJpcyBHcmFwaGljcyA2MTAwJyxcbiAgJzM5OSAtIEludGVsIEhEIEdyYXBoaWNzIDUyMCcsXG4gICczOTggLSBBTUQgUmFkZW9uIFJYIFZlZ2EgMycsXG4gICczOTcgLSBOVklESUEgR2VGb3JjZSA4MjBNJyxcbiAgJzM5NiAtIE5WSURJQSBHZUZvcmNlIDkxME0nLFxuICAnMzk0IC0gQU1EIFJhZGVvbiBSNSBNMjU1JyxcbiAgJzM5MyAtIEFNRCBSYWRlb24gUjUgTTQzMCcsXG4gICczOTIgLSBBTUQgUmFkZW9uIFI1IE0zMzAnLFxuICAnMzkxIC0gQU1EIFJhZGVvbiBSNSBNMzM1JyxcbiAgJzM4OSAtIEFNRCBSYWRlb24gSEQgNzU2MEQnLFxuICAnMzgzIC0gQU1EIFJhZGVvbiBIRCA4NjUwRycsXG4gICczNjcgLSBOVklESUEgUXVhZHJvIEsxMDAwTScsXG4gICczNjUgLSBBTUQgUmFkZW9uIEhEIDc2NjBEJyxcbiAgJzM2NCAtIEFNRCBSYWRlb24gUjYgTTI1NURYJyxcbiAgJzM1NyAtIEludGVsIEhEIEdyYXBoaWNzIDU2MDAnLFxuICAnMzQ3IC0gQU1EIEZpcmVQcm8gVzIxMDAnLFxuICAnMzM4IC0gQU1EIFJhZGVvbiBSNiAoS2F2ZXJpKScsXG4gICczMjYgLSBBTUQgUmFkZW9uIFI2IChDYXJyaXpvKScsXG4gICczMjUgLSBJbnRlbCBIRCBHcmFwaGljcyA2MjAnLFxuICAnMzI0IC0gSW50ZWwgVUhEIEdyYXBoaWNzIDYyMCcsXG4gICczMjMgLSBBTUQgUmFkZW9uIFI1IChCcmlzdG9sIFJpZGdlKScsXG4gICczMjEgLSBJbnRlbCBIRCBHcmFwaGljcyBQNTMwJyxcbiAgJzMyMCAtIEludGVsIEhEIEdyYXBoaWNzIDUzMCcsXG4gICczMTkgLSBJbnRlbCBIRCBHcmFwaGljcyBQNjMwJyxcbiAgJzMxOCAtIEludGVsIEhEIEdyYXBoaWNzIDYzMCcsXG4gICczMTcgLSBJbnRlbCBVSEQgR3JhcGhpY3MgNjMwJyxcbiAgJzMxNiAtIEFNRCBSYWRlb24gUlggVmVnYSA2JyxcbiAgJzMxNSAtIEFNRCBSYWRlb24gUjYgTTM0MERYJyxcbiAgJzMxNCAtIEFNRCBSYWRlb24gNTIwJyxcbiAgJzMxMyAtIEFNRCBSYWRlb24gUjcgTTM0MCcsXG4gICczMTIgLSBBTUQgUmFkZW9uIFI3IE0yNjAnLFxuICAnMzA2IC0gQU1EIFJhZGVvbiBSNyBNNDQwJyxcbiAgJzMwNSAtIEFNRCBSYWRlb24gUjggTTQ0NURYJyxcbiAgJzMwMiAtIE5WSURJQSBHZUZvcmNlIDkyME0nLFxuICAnMzAwIC0gQU1EIFJhZGVvbiBSNyBNMzYwJyxcbiAgJzI5NyAtIEFNRCBSYWRlb24gUjcgTTQ2MCcsXG4gICcyOTYgLSBBTUQgUmFkZW9uIFI4IE0zNjVEWCcsXG4gICcyOTUgLSBBTUQgUmFkZW9uIFI3IChLYXZlcmkpJyxcbiAgJzI5NCAtIEFNRCBSYWRlb24gUjcgKENhcnJpem8pJyxcbiAgJzI5MyAtIE5WSURJQSBHZUZvcmNlIEdUIDY0ME0nLFxuICAnMjkyIC0gQU1EIFJhZGVvbiBSNyAoQnJpc3RvbCBSaWRnZSknLFxuICAnMjg4IC0gQU1EIFJhZGVvbiBSNyBNMjY1JyxcbiAgJzI4NyAtIEFNRCBSYWRlb24gUjcgTTI3MCcsXG4gICcyODQgLSBBTUQgRmlyZVBybyBNNDEwMCcsXG4gICcyODEgLSBOVklESUEgR2VGb3JjZSBHVCA3MzBNJyxcbiAgJzI3OCAtIEFNRCBSYWRlb24gUjcgTTI2MFgnLFxuICAnMjcxIC0gQU1EIEZpcmVQcm8gTTQwMDAnLFxuICAnMjY5IC0gTlZJRElBIEdlRm9yY2UgODI1TScsXG4gICcyNjcgLSBOVklESUEgR2VGb3JjZSBHVCA3MzVNJyxcbiAgJzI2NCAtIE5WSURJQSBRdWFkcm8gSzIwMDBNJyxcbiAgJzI2MCAtIEludGVsIElyaXMgR3JhcGhpY3MgNTQwJyxcbiAgJzI1OSAtIE5WSURJQSBHZUZvcmNlIDkyME1YJyxcbiAgJzI1OCAtIEludGVsIElyaXMgUGx1cyBHcmFwaGljcyA2NDAnLFxuICAnMjU3IC0gTlZJRElBIEdlRm9yY2UgTVgxMTAnLFxuICAnMjU2IC0gTlZJRElBIEdlRm9yY2UgODMwTScsXG4gICcyNTUgLSBBTUQgUmFkZW9uIDUzMCcsXG4gICcyNTQgLSBJbnRlbCBJcmlzIEdyYXBoaWNzIDU1MCcsXG4gICcyNTMgLSBOVklESUEgR2VGb3JjZSA5MzBNJyxcbiAgJzI1MiAtIEludGVsIElyaXMgUGx1cyBHcmFwaGljcyA2NTAnLFxuICAnMjUxIC0gTlZJRElBIEdlRm9yY2UgR1QgNzQwTScsXG4gICcyNTAgLSBBTUQgUmFkZW9uIFI3IDM4NCBDb3JlcyAoS2F2ZXJpIERlc2t0b3ApJyxcbiAgJzI0OSAtIEludGVsIElyaXMgUHJvIEdyYXBoaWNzIDUyMDAnLFxuICAnMjQ4IC0gQU1EIFJhZGVvbiBSNyA1MTIgQ29yZXMgKEthdmVyaSBEZXNrdG9wKScsXG4gICcyNDUgLSBOVklESUEgR2VGb3JjZSBHVCA3NDVNJyxcbiAgJzI0NCAtIEFNRCBSYWRlb24gUjcgTTI3NURYJyxcbiAgJzI0MyAtIE5WSURJQSBHZUZvcmNlIDg0ME0nLFxuICAnMjQyIC0gTlZJRElBIFF1YWRybyBNNTAwTScsXG4gICcyMzkgLSBBTUQgUmFkZW9uIFI3IE0zNzAnLFxuICAnMjM3IC0gQU1EIFJhZGVvbiBSNyBNNDQ1JyxcbiAgJzIzNiAtIEludGVsIElyaXMgUGx1cyBHcmFwaGljcyA2NTUnLFxuICAnMjM1IC0gQU1EIFJhZGVvbiBSOSBNMzc1JyxcbiAgJzIzNCAtIEFNRCBGaXJlUHJvIFc0MTkwTScsXG4gICcyMzMgLSBOVklESUEgUXVhZHJvIE02MDBNJyxcbiAgJzIzMiAtIE5WSURJQSBHZUZvcmNlIDkzME1YJyxcbiAgJzIzMSAtIE5WSURJQSBHZUZvcmNlIDk0ME0nLFxuICAnMjMwIC0gQU1EIFJhZGVvbiBSWCBWZWdhIDgnLFxuICAnMjI5IC0gTlZJRElBIFF1YWRybyBLMTEwME0nLFxuICAnMjI4IC0gTlZJRElBIFF1YWRybyBNNTIwJyxcbiAgJzIyNyAtIE5WSURJQSBHZUZvcmNlIDk0ME1YJyxcbiAgJzIyNiAtIE5WSURJQSBHZUZvcmNlIE1YMTMwJyxcbiAgJzIyNSAtIEludGVsIElyaXMgUHJvIEdyYXBoaWNzIDYyMDAnLFxuICAnMjI0IC0gTlZJRElBIEdlRm9yY2UgR1QgNzUwTScsXG4gICcyMTkgLSBBTUQgRmlyZVBybyBXNDEwMCcsXG4gICcyMTggLSBBTUQgRmlyZVBybyBXNDE3ME0nLFxuICAnMjE2IC0gQU1EIFJhZGVvbiBSNyBNNDY1JyxcbiAgJzIxNCAtIEFNRCBSYWRlb24gUjkgTTI2NVgnLFxuICAnMjExIC0gTlZJRElBIEdlRm9yY2UgODQ1TScsXG4gICcyMDkgLSBOVklESUEgR2VGb3JjZSBHVCA3NTVNJyxcbiAgJzIwOCAtIEFNRCBSYWRlb24gUjcgMjUwJyxcbiAgJzIwMyAtIE5WSURJQSBRdWFkcm8gSzIxMDBNJyxcbiAgJzIwMiAtIEFNRCBGaXJlUHJvIE01MTAwJyxcbiAgJzIwMSAtIEFNRCBGaXJlUHJvIE02MDAwJyxcbiAgJzE5OSAtIE5WSURJQSBRdWFkcm8gSzMwMDBNJyxcbiAgJzE5MyAtIEFNRCBGaXJlUHJvIFc1MTMwTScsXG4gICcxOTIgLSBOVklESUEgTWF4d2VsbCBHUFUgU3VyZmFjZSBCb29rICg5NDBNLCBHRERSNSknLFxuICAnMTkwIC0gQU1EIFJhZGVvbiBSOSBNMjc1JyxcbiAgJzE4OSAtIE5WSURJQSBHZUZvcmNlIEdUWCA3NjBNJyxcbiAgJzE4NiAtIEFNRCBSYWRlb24gUjkgTTM3MFgnLFxuICAnMTg1IC0gQU1EIEZpcmVQcm8gVzUxNzBNJyxcbiAgJzE4NCAtIE5WSURJQSBRdWFkcm8gSzMxMDBNJyxcbiAgJzE3NSAtIEFNRCBSYWRlb24gUjkgTTM4MCcsXG4gICcxNzMgLSBBTUQgUmFkZW9uIFI5IE00NzAnLFxuICAnMTY4IC0gSW50ZWwgSXJpcyBQcm8gR3JhcGhpY3MgNTgwJyxcbiAgJzE2NyAtIEludGVsIElyaXMgUHJvIEdyYXBoaWNzIFA1ODAnLFxuICAnMTY2IC0gQU1EIFJhZGVvbiBSWCBWZWdhIDEwJyxcbiAgJzE2NSAtIE5WSURJQSBRdWFkcm8gSzQwMDBNJyxcbiAgJzE2MSAtIE5WSURJQSBRdWFkcm8gUDUwMCcsXG4gICcxNjAgLSBOVklESUEgR2VGb3JjZSBHVFggNzY1TScsXG4gICcxNTkgLSBOVklESUEgR2VGb3JjZSA5NDVNJyxcbiAgJzE1NCAtIEFNRCBSYWRlb24gUlggVmVnYSAxMScsXG4gICcxNTMgLSBBTUQgUmFkZW9uIFI5IE0yODBYJyxcbiAgJzE1MiAtIE5WSURJQSBRdWFkcm8gTTYyMCcsXG4gICcxNTEgLSBOVklESUEgUXVhZHJvIE0xMDAwTScsXG4gICcxNTAgLSBOVklESUEgR2VGb3JjZSBHVFggODUwTScsXG4gICcxNDkgLSBBTUQgUmFkZW9uIFI5IE0zODVYJyxcbiAgJzE0OCAtIEFNRCBSYWRlb24gUjkgTTQ3MFgnLFxuICAnMTQ3IC0gQU1EIFJhZGVvbiBQcm8gNDUwJyxcbiAgJzE0NiAtIE5WSURJQSBHZUZvcmNlIEdUWCA5NTBNJyxcbiAgJzEzOCAtIE5WSURJQSBHZUZvcmNlIEdUWCA4NjBNJyxcbiAgJzEzNyAtIEFNRCBSYWRlb24gUHJvIFdYIDMxMDAgTW9iaWxlJyxcbiAgJzEzNiAtIEFNRCBSYWRlb24gUlggNTQwJyxcbiAgJzEzNSAtIE5WSURJQSBHZUZvcmNlIEdUWCA3NzBNJyxcbiAgJzEzNCAtIE5WSURJQSBRdWFkcm8gSzQxMDBNJyxcbiAgJzEzMyAtIE5WSURJQSBRdWFkcm8gSzUwMDBNJyxcbiAgJzEzMiAtIE5WSURJQSBRdWFkcm8gTTIwMDBNJyxcbiAgJzEzMSAtIE5WSURJQSBHZUZvcmNlIE1YMTUwJyxcbiAgJzEzMCAtIE5WSURJQSBRdWFkcm8gUDYwMCcsXG4gICcxMjkgLSBOVklESUEgR2VGb3JjZSBHVCAxMDMwIChEZXNrdG9wKScsXG4gICcxMjggLSBBTUQgUmFkZW9uIFBybyA0NTUnLFxuICAnMTI3IC0gQU1EIFJhZGVvbiBQcm8gNTU1JyxcbiAgJzEyNiAtIEFNRCBSYWRlb24gUHJvIDU1NVgnLFxuICAnMTI1IC0gTlZJRElBIFF1YWRybyBNMTIwMCcsXG4gICcxMjEgLSBBTUQgUmFkZW9uIFJYIDU1MCAoTGFwdG9wKScsXG4gICcxMjAgLSBOVklESUEgR2VGb3JjZSBHVFggNzUwIFRpJyxcbiAgJzExOSAtIE5WSURJQSBHZUZvcmNlIEdUWCA5NjBNJyxcbiAgJzExOCAtIEFNRCBSYWRlb24gUHJvIFdYIDQxMzAnLFxuICAnMTE3IC0gQU1EIFJhZGVvbiBQcm8gNDYwJyxcbiAgJzExNiAtIEFNRCBSYWRlb24gUHJvIDU2MCcsXG4gICcxMTUgLSBBTUQgUmFkZW9uIFBybyA1NjBYJyxcbiAgJzExMyAtIEFNRCBGaXJlUHJvIE02MTAwJyxcbiAgJzExMiAtIEFNRCBSYWRlb24gUjkgTTM5MCcsXG4gICcxMDkgLSBBTUQgUmFkZW9uIFJYIDQ2MCAoTGFwdG9wKScsXG4gICcxMDMgLSBBTUQgUmFkZW9uIFI5IE0yOTBYJyxcbiAgJzEwMiAtIE5WSURJQSBHZUZvcmNlIEdUWCA4NzBNJyxcbiAgJzEwMSAtIE5WSURJQSBRdWFkcm8gTTIyMDAnLFxuICAnMTAwIC0gQU1EIFJhZGVvbiBSWCA1NjAgKExhcHRvcCknLFxuICAnOTkgLSBBTUQgUmFkZW9uIFJYIDU2MFggKExhcHRvcCknLFxuICAnOTggLSBOVklESUEgR2VGb3JjZSBHVFggOTY1TScsXG4gICc5NiAtIEFNRCBSYWRlb24gUHJvIFdYIDQxNTAnLFxuICAnOTUgLSBBTUQgUmFkZW9uIFJYIDQ2MCAoRGVza3RvcCknLFxuICAnOTMgLSBOVklESUEgUXVhZHJvIFAxMDAwJyxcbiAgJzkyIC0gTlZJRElBIFF1YWRybyBLNTEwME0nLFxuICAnOTEgLSBOVklESUEgR2VGb3JjZSBHVFggNzgwTScsXG4gICc5MCAtIE5WSURJQSBHZUZvcmNlIEdUWCA3NjAnLFxuICAnODggLSBBTUQgUmFkZW9uIFI5IDI3MFgnLFxuICAnODcgLSBOVklESUEgR2VGb3JjZSBHVFggOTUwJyxcbiAgJzg2IC0gTlZJRElBIEdlRm9yY2UgR1RYIDg4ME0nLFxuICAnODQgLSBBTUQgUmFkZW9uIFI3IDM3MCcsXG4gICc4MyAtIEFNRCBSYWRlb24gUjkgTTM5NScsXG4gICc4MiAtIEFNRCBGaXJlUHJvIFc3MTcwTScsXG4gICc4MSAtIE5WSURJQSBHZUZvcmNlIEdUWCAxMDUwIE1heC1RJyxcbiAgJzgwIC0gTlZJRElBIEdlRm9yY2UgR1RYIDEwNTAgKE5vdGVib29rKScsXG4gICc3OSAtIE5WSURJQSBHZUZvcmNlIEdUWCAxMDUwIChEZXNrdG9wKScsXG4gICc3OCAtIE5WSURJQSBRdWFkcm8gTTMwMDBNJyxcbiAgJzc3IC0gQU1EIFJhZGVvbiBSOSBNMzkwWCcsXG4gICc3NiAtIEFNRCBSYWRlb24gUjkgTTI5NVgnLFxuICAnNzUgLSBBTUQgUmFkZW9uIFI5IE00ODVYJyxcbiAgJzc0IC0gQU1EIFJhZGVvbiBSWCBWZWdhIE0gR0wgLyA4NzAnLFxuICAnNzMgLSBBTUQgUmFkZW9uIFI5IE0zOTVYJyxcbiAgJzY4IC0gTlZJRElBIFF1YWRybyBNNDAwME0nLFxuICAnNjcgLSBOVklESUEgR2VGb3JjZSBHVFggOTcwTScsXG4gICc2NiAtIE5WSURJQSBRdWFkcm8gUDIwMDAnLFxuICAnNjUgLSBOVklESUEgR2VGb3JjZSBHVFggMTA1MCBUaSAoRGVza3RvcCknLFxuICAnNjQgLSBOVklESUEgR2VGb3JjZSBHVFggMTA1MCBUaSBNYXgtUScsXG4gICc2MyAtIE5WSURJQSBHZUZvcmNlIEdUWCAxMDUwIFRpIChOb3RlYm9vayknLFxuICAnNjIgLSBOVklESUEgR2VGb3JjZSBHVFggOTYwJyxcbiAgJzYxIC0gQU1EIFJhZGVvbiBSOSAzODAnLFxuICAnNjAgLSBBTUQgUmFkZW9uIFI5IDI4MFgnLFxuICAnNTkgLSBOVklESUEgUXVhZHJvIE01MDAwTScsXG4gICc1OCAtIEFNRCBSYWRlb24gUlggVmVnYSBNIEdIJyxcbiAgJzU3IC0gTlZJRElBIEdlRm9yY2UgR1RYIDk4ME0nLFxuICAnNTIgLSBOVklESUEgR2VGb3JjZSBHVFggOTY1TSBTTEknLFxuICAnNTAgLSBBTUQgUmFkZW9uIFI5IDI5MFgnLFxuICAnNDggLSBOVklESUEgR2VGb3JjZSBHVFggODgwTSBTTEknLFxuICAnNDcgLSBBTUQgUmFkZW9uIFJYIDQ3MCAoTGFwdG9wKScsXG4gICc0NiAtIEFNRCBSYWRlb24gUlggNTcwIChMYXB0b3ApJyxcbiAgJzQ1IC0gQU1EIFJhZGVvbiBSWCA0NzAgKERlc2t0b3ApJyxcbiAgJzQ0IC0gQU1EIFJhZGVvbiBQcm8gV1ggNzEwMCcsXG4gICc0MiAtIE5WSURJQSBRdWFkcm8gUDMwMDAgTWF4LVEnLFxuICAnNDEgLSBOVklESUEgR2VGb3JjZSBHVFggMTA2MCBNYXgtUScsXG4gICc0MCAtIE5WSURJQSBHZUZvcmNlIEdUWCA5NzAnLFxuICAnMzkgLSBOVklESUEgUXVhZHJvIFAzMDAwJyxcbiAgJzM4IC0gQU1EIFJhZGVvbiBSWCBWZWdhIE1vYmlsZScsXG4gICczNyAtIE5WSURJQSBHZUZvcmNlIEdUWCA3ODAgVGknLFxuICAnMzYgLSBBTUQgUmFkZW9uIFJYIDU4MCAoTGFwdG9wKScsXG4gICczNSAtIE5WSURJQSBRdWFkcm8gUDMyMDAnLFxuICAnMzQgLSBOVklESUEgUXVhZHJvIFA0MDAwIE1heC1RJyxcbiAgJzMzIC0gTlZJRElBIEdlRm9yY2UgR1RYIDEwNjAgKExhcHRvcCknLFxuICAnMzIgLSBBTUQgUmFkZW9uIFJYIDQ4MCAoRGVza3RvcCknLFxuICAnMzEgLSBOVklESUEgUXVhZHJvIFA0MDAwJyxcbiAgJzMwIC0gTlZJRElBIEdlRm9yY2UgR1RYIDEwNjAgKERlc2t0b3ApJyxcbiAgJzI5IC0gTlZJRElBIEdlRm9yY2UgR1RYIDk3ME0gU0xJJyxcbiAgJzI4IC0gQU1EIFJhZGVvbiBSOSAzOTBYJyxcbiAgJzI3IC0gTlZJRElBIFF1YWRybyBNNTUwMCcsXG4gICcyNiAtIE5WSURJQSBHZUZvcmNlIEdUWCA5ODAgKExhcHRvcCknLFxuICAnMjUgLSBBTUQgUmFkZW9uIFJYIDU4MCAoRGVza3RvcCknLFxuICAnMjQgLSBOVklESUEgR2VGb3JjZSBHVFggOTgwJyxcbiAgJzIzIC0gQU1EIFJhZGVvbiBSOSBOYW5vJyxcbiAgJzIyIC0gQU1EIFJhZGVvbiBSOSBGdXJ5JyxcbiAgJzIxIC0gTlZJRElBIEdlRm9yY2UgR1RYIDk4ME0gU0xJJyxcbiAgJzIwIC0gTlZJRElBIFF1YWRybyBQNTAwMCBNYXgtUScsXG4gICcxOSAtIE5WSURJQSBHZUZvcmNlIEdUWCAxMDcwIE1heC1RJyxcbiAgJzE4IC0gTlZJRElBIEdlRm9yY2UgR1RYIDk4MCBUaScsXG4gICcxNyAtIE5WSURJQSBRdWFkcm8gUDUwMDAnLFxuICAnMTYgLSBOVklESUEgUXVhZHJvIFA0MjAwJyxcbiAgJzE1IC0gTlZJRElBIEdlRm9yY2UgR1RYIDEwNzAgKExhcHRvcCknLFxuICAnMTQgLSBOVklESUEgR2VGb3JjZSBHVFggMTA4MCBNYXgtUScsXG4gICcxMyAtIE5WSURJQSBHZUZvcmNlIEdUWCAxMDcwIChEZXNrdG9wKScsXG4gICcxMiAtIEFNRCBSYWRlb24gUHJvIFZlZ2EgNTYnLFxuICAnMTEgLSBOVklESUEgUXVhZHJvIFA1MjAwJyxcbiAgJzEwIC0gTlZJRElBIEdlRm9yY2UgR1RYIDk4MCBTTEkgKExhcHRvcCknLFxuICAnOSAtIE5WSURJQSBHZUZvcmNlIEdUWCAxMDcwIFRpIChEZXNrdG9wKScsXG4gICc4IC0gTlZJRElBIEdlRm9yY2UgR1RYIDEwODAgKExhcHRvcCknLFxuICAnNyAtIEFNRCBSYWRlb24gUlggVmVnYSA2NCcsXG4gICc2IC0gTlZJRElBIEdlRm9yY2UgR1RYIDEwODAgKERlc2t0b3ApJyxcbiAgJzUgLSBOVklESUEgR2VGb3JjZSBHVFggMTA3MCBTTEkgKExhcHRvcCknLFxuICAnNCAtIE5WSURJQSBHZUZvcmNlIEdUWCAxMDcwIFNMSSAoRGVza3RvcCknLFxuICAnMyAtIE5WSURJQSBHZUZvcmNlIEdUWCAxMDgwIFNMSSAoTGFwdG9wKScsXG4gICcyIC0gTlZJRElBIFRpdGFuIFggUGFzY2FsJyxcbiAgJzEgLSBOVklESUEgR2VGb3JjZSBHVFggMTA4MCBUaSAoRGVza3RvcCknLFxuXTtcblxuZXhwb3J0IGNvbnN0IEJFTkNITUFSS19TQ09SRV9NT0JJTEUgPSBbXG4gICc4NDggLSBBUk0gTWFsaS0yMDAnLFxuICAnODQ3IC0gUXVhbGNvbW0gQWRyZW5vIDIwMCcsXG4gICc4NDYgLSBQb3dlclZSIFNHWDUzMCcsXG4gICc4NDUgLSBQb3dlclZSIFNHWDUzMScsXG4gICc4NDQgLSBQb3dlclZSIFNHWDUzNScsXG4gICc4NDMgLSBWaXZhbnRlIEdDODAwJyxcbiAgJzg0MiAtIFF1YWxjb21tIEFkcmVubyAyMDMnLFxuICAnODQxIC0gUXVhbGNvbW0gQWRyZW5vIDIwNScsXG4gICc4MzkgLSBQb3dlclZSIFNHWDU0MCcsXG4gICc4MzcgLSBOVklESUEgR2VGb3JjZSBVTFAgKFRlZ3JhIDIpJyxcbiAgJzgzNiAtIEFSTSBNYWxpLTQwMCBNUCcsXG4gICc4MzUgLSBBUk0gTWFsaS00MDAgTVAyJyxcbiAgJzgzNCAtIFZpdmFudGUgR0MxMDAwKyBEdWFsLUNvcmUnLFxuICAnODMzIC0gUXVhbGNvbW0gQWRyZW5vIDIyMCcsXG4gICc4MzIgLSBCcm9hZGNvbSBWaWRlb0NvcmUtSVYnLFxuICAnODMxIC0gTlZJRElBIEdlRm9yY2UgVUxQIChUZWdyYSAzKScsXG4gICc4MzAgLSBBUk0gTWFsaS00MDAgTVA0JyxcbiAgJzgyOSAtIFZpdmFudGUgR0M0MDAwJyxcbiAgJzgyOCAtIFF1YWxjb21tIEFkcmVubyAyMjUnLFxuICAnODIwIC0gUXVhbGNvbW0gQWRyZW5vIDMwMicsXG4gICc4MTkgLSBWaXZhbnRlIEdDNzAwMFVMJyxcbiAgJzgxOCAtIEFSTSBNYWxpLVQ3MjAnLFxuICAnODE3IC0gUXVhbGNvbW0gQWRyZW5vIDMwNCcsXG4gICc4MTYgLSBRdWFsY29tbSBBZHJlbm8gMzA1JyxcbiAgJzgxNSAtIFF1YWxjb21tIEFkcmVubyAzMDYnLFxuICAnODE0IC0gUXVhbGNvbW0gQWRyZW5vIDMwOCcsXG4gICc4MTMgLSBQb3dlclZSIFNHWDU0NCcsXG4gICc4MTIgLSBBUk0gTWFsaS1UNzIwIE1QMicsXG4gICc4MTEgLSBQb3dlclZSIFNHWDU0NE1QMicsXG4gICc4MTAgLSBQb3dlclZSIFNHWDU0NScsXG4gICc4MDcgLSBQb3dlclZSIFNHWDU0M01QMicsXG4gICc3OTcgLSBQb3dlclZSIFNHWDU0M01QMycsXG4gICc3ODkgLSBBUk0gTWFsaS1UODMwIE1QMScsXG4gICc3ODggLSBBUk0gTWFsaS00NTAgTVA0JyxcbiAgJzc4NyAtIEFSTSBNYWxpLVQ3MjAgTVA0JyxcbiAgJzc4NiAtIFBvd2VyVlIgR0U4MTAwJyxcbiAgJzc4NSAtIEFSTSBNYWxpLVQ3NjAgTVAyJyxcbiAgJzc4NCAtIFF1YWxjb21tIEFkcmVubyAzMjAnLFxuICAnNzgzIC0gQVJNIE1hbGktVDYyNCcsXG4gICc3ODIgLSBQb3dlclZSIFNHWDU0M01QNCcsXG4gICc3NTUgLSBBUk0gTWFsaS1UODMwIE1QMicsXG4gICc3NTQgLSBRdWFsY29tbSBBZHJlbm8gNDA1JyxcbiAgJzc1MyAtIFBvd2VyVlIgRzYyMDAnLFxuICAnNzUyIC0gTlZJRElBIEdlRm9yY2UgVGVncmEgNCcsXG4gICc3NDcgLSBBUk0gTWFsaS1UNjA0IE1QNCcsXG4gICc3NDEgLSBBUk0gTWFsaS1UODMwIE1QMycsXG4gICc3NDAgLSBBUk0gTWFsaS1UODYwIE1QMicsXG4gICc3MzYgLSBRdWFsY29tbSBBZHJlbm8gNTA1JyxcbiAgJzczNSAtIFF1YWxjb21tIEFkcmVubyA1MDYnLFxuICAnNzM0IC0gUXVhbGNvbW0gQWRyZW5vIDUwOCcsXG4gICc3MzMgLSBRdWFsY29tbSBBZHJlbm8gNTA5JyxcbiAgJzczMiAtIEFSTSBNYWxpLVQ2MjggTVA0JyxcbiAgJzczMSAtIFBvd2VyVlIgU0dYNTU0TVA0JyxcbiAgJzY5MyAtIEFSTSBNYWxpLVQ3NjAgTVA0JyxcbiAgJzY5MiAtIEFSTSBNYWxpLVQ2MjggTVA2JyxcbiAgJzY5MSAtIEludGVsIEhEIEdyYXBoaWNzIChCYXkgVHJhaWwpJyxcbiAgJzY5MCAtIFBvd2VyVlIgRzY0MDAnLFxuICAnNjg5IC0gUG93ZXJWUiBHWDYyNTAnLFxuICAnNjg4IC0gUG93ZXJWUiBHNjQzMCcsXG4gICc2ODcgLSBRdWFsY29tbSBBZHJlbm8gMzMwJyxcbiAgJzY4NiAtIFF1YWxjb21tIEFkcmVubyA1MTAnLFxuICAnNjg1IC0gUXVhbGNvbW0gQWRyZW5vIDUxMicsXG4gICc2MTAgLSBBUk0gTWFsaS1HNTEgTVA0JyxcbiAgJzYwOSAtIEludGVsIEhEIEdyYXBoaWNzIChDaGVycnkgVHJhaWwpJyxcbiAgJzYwNyAtIFF1YWxjb21tIEFkcmVubyA0MTgnLFxuICAnNTg3IC0gUXVhbGNvbW0gQWRyZW5vIDQyMCcsXG4gICc1ODYgLSBQb3dlclZSIEdYNjQ1MCcsXG4gICc1NzYgLSBBUk0gTWFsaS1UODgwIE1QMicsXG4gICc1NzUgLSBBUk0gTWFsaS1UNzYwIE1QNicsXG4gICc1NDMgLSBBUk0gTWFsaS1UODgwIE1QNCcsXG4gICc1NDIgLSBBUk0gTWFsaS1HNzIgTVAzJyxcbiAgJzUyMyAtIFF1YWxjb21tIEFkcmVubyA0MzAnLFxuICAnNTE4IC0gQVJNIE1hbGktRzcxIE1QMicsXG4gICc1MTcgLSBBUk0gTWFsaS1UNzYwIE1QOCcsXG4gICc0NzIgLSBBUk0gTWFsaS1UODgwIE1QMTInLFxuICAnNDcxIC0gQXBwbGUgQTkgLyBQb3dlclZSIEdUNzYwMCcsXG4gICc0NzAgLSBOVklESUEgVGVncmEgSzEgS2VwbGVyIEdQVScsXG4gICc0NjkgLSBQb3dlclZSIEdYQTY4NTAnLFxuICAnNDY4IC0gUXVhbGNvbW0gQWRyZW5vIDUzMCcsXG4gICc0MzAgLSBBUk0gTWFsaS1HNzEgTVA4JyxcbiAgJzQyOSAtIEFSTSBNYWxpLUc3MiBNUDEyJyxcbiAgJzQyOCAtIEFSTSBNYWxpLUc3MSBNUDIwJyxcbiAgJzQyNyAtIEFSTSBNYWxpLUc3MiBNUDE4JyxcbiAgJzQyNiAtIFF1YWxjb21tIEFkcmVubyA1NDAnLFxuICAnNDI1IC0gUXVhbGNvbW0gQWRyZW5vIDYzMCcsXG4gICc0MDkgLSBBcHBsZSBBMTAgRnVzaW9uIEdQVSAvIFBvd2VyVlInLFxuICAnMzIyIC0gTlZJRElBIFRlZ3JhIFgxIE1heHdlbGwgR1BVJyxcbiAgJzI5OSAtIEFwcGxlIEE5WCAvIFBvd2VyVlIgU2VyaWVzIDdYVCcsXG4gICcyNjMgLSBBcHBsZSBBMTBYIEZ1c2lvbiBHUFUgLyBQb3dlclZSJyxcbiAgJzI2MiAtIEFwcGxlIEExMSBCaW9uaWMgR1BVJyxcbiAgJzI2MSAtIEFwcGxlIEExMiBCaW9uaWMgR1BVJyxcbl07XG4iXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBc1NBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./benchmark.js\n");
/***/ }),
/***/ "./device.js":
/*!*******************!*\
!*** ./device.js ***!
\*******************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Device = function () {\n function Device() {\n var userAgent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n\n _classCallCheck(this, Device);\n\n this.setUserAgent(userAgent);\n }\n\n _createClass(Device, [{\n key: 'match',\n value: function match(needle) {\n if (!this.matchCache[needle]) {\n this.matchCache[needle] = this.userAgent.indexOf(needle) > -1;\n }\n\n return this.matchCache[needle];\n }\n }, {\n key: 'getUserAgent',\n value: function getUserAgent() {\n return typeof document !== 'undefined' ? window.navigator.userAgent : '';\n }\n }, {\n key: 'setUserAgent',\n value: function setUserAgent() {\n var userAgent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n\n this.userAgent = userAgent || this.userAgent || this.getUserAgent();\n\n if (this.userAgent) {\n this.matchCache = {};\n this.userAgent = this.userAgent.toLowerCase();\n }\n }\n }, {\n key: 'iphone',\n get: function get() {\n return !this.windows && this.match('iphone');\n }\n }, {\n key: 'ipod',\n get: function get() {\n return this.match('ipod');\n }\n }, {\n key: 'ipad',\n get: function get() {\n return this.match('ipad');\n }\n }, {\n key: 'android',\n get: function get() {\n return !this.windows && this.match('android');\n }\n }, {\n key: 'androidPhone',\n get: function get() {\n return this.android && this.match('mobile');\n }\n }, {\n key: 'androidTablet',\n get: function get() {\n return this.android && !this.match('mobile');\n }\n }, {\n key: 'blackberry',\n get: function get() {\n return this.match('blackberry') || this.match('bb10') || this.match('rim');\n }\n }, {\n key: 'blackberryPhone',\n get: function get() {\n return this.blackberry && !this.match('tablet');\n }\n }, {\n key: 'blackberryTablet',\n get: function get() {\n return this.blackberry && this.match('tablet');\n }\n }, {\n key: 'windows',\n get: function get() {\n return this.match('windows');\n }\n }, {\n key: 'windowsPhone',\n get: function get() {\n return this.windows && this.match('phone');\n }\n }, {\n key: 'windowsTablet',\n get: function get() {\n return this.windows && this.match('touch') && !this.windowsPhone;\n }\n }, {\n key: 'firefoxOS',\n get: function get() {\n return (this.match('(mobile;') || this.match('(tablet;')) && this.match('; rv:');\n }\n }, {\n key: 'firefoxOSPhone',\n get: function get() {\n return this.firefoxOS && this.match('mobile');\n }\n }, {\n key: 'firefoxOSTablet',\n get: function get() {\n return this.firefoxOS && this.match('tablet');\n }\n }, {\n key: 'mobile',\n get: function get() {\n return this.androidPhone || this.iphone || this.ipod || this.windowsPhone || this.blackberryPhone || this.firefoxOSPhone;\n }\n }, {\n key: 'tablet',\n get: function get() {\n return this.ipad || this.androidTablet || this.blackberryTablet || this.windowsTablet || this.firefoxOSTablet;\n }\n }]);\n\n return Device;\n}();\n\nexports.default = Device;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9kZXZpY2UuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9EZXRlY3RHUFUvc3JjL2RldmljZS5qcz9iYTNhIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGNsYXNzIERldmljZSB7XG4gIGNvbnN0cnVjdG9yKHVzZXJBZ2VudCA9IG51bGwpIHtcbiAgICB0aGlzLnNldFVzZXJBZ2VudCh1c2VyQWdlbnQpO1xuICB9XG5cbiAgbWF0Y2gobmVlZGxlKSB7XG4gICAgaWYgKCF0aGlzLm1hdGNoQ2FjaGVbbmVlZGxlXSkge1xuICAgICAgdGhpcy5tYXRjaENhY2hlW25lZWRsZV0gPSB0aGlzLnVzZXJBZ2VudC5pbmRleE9mKG5lZWRsZSkgPiAtMTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5tYXRjaENhY2hlW25lZWRsZV07XG4gIH1cblxuICBnZXRVc2VyQWdlbnQoKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCA6ICcnO1xuICB9XG5cbiAgc2V0VXNlckFnZW50KHVzZXJBZ2VudCA9IG51bGwpIHtcbiAgICB0aGlzLnVzZXJBZ2VudCA9IHVzZXJBZ2VudCB8fCB0aGlzLnVzZXJBZ2VudCB8fCB0aGlzLmdldFVzZXJBZ2VudCgpO1xuXG4gICAgaWYgKHRoaXMudXNlckFnZW50KSB7XG4gICAgICB0aGlzLm1hdGNoQ2FjaGUgPSB7fTtcbiAgICAgIHRoaXMudXNlckFnZW50ID0gdGhpcy51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTtcbiAgICB9XG4gIH1cblxuICBnZXQgaXBob25lKCkge1xuICAgIHJldHVybiAhdGhpcy53aW5kb3dzICYmIHRoaXMubWF0Y2goJ2lwaG9uZScpO1xuICB9XG5cbiAgZ2V0IGlwb2QoKSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2goJ2lwb2QnKTtcbiAgfVxuXG4gIGdldCBpcGFkKCkge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKCdpcGFkJyk7XG4gIH1cblxuICBnZXQgYW5kcm9pZCgpIHtcbiAgICByZXR1cm4gIXRoaXMud2luZG93cyAmJiB0aGlzLm1hdGNoKCdhbmRyb2lkJyk7XG4gIH1cblxuICBnZXQgYW5kcm9pZFBob25lKCkge1xuICAgIHJldHVybiB0aGlzLmFuZHJvaWQgJiYgdGhpcy5tYXRjaCgnbW9iaWxlJyk7XG4gIH1cblxuICBnZXQgYW5kcm9pZFRhYmxldCgpIHtcbiAgICByZXR1cm4gdGhpcy5hbmRyb2lkICYmICF0aGlzLm1hdGNoKCdtb2JpbGUnKTtcbiAgfVxuXG4gIGdldCBibGFja2JlcnJ5KCkge1xuICAgIHJldHVybiB0aGlzLm1hdGNoKCdibGFja2JlcnJ5JykgfHwgdGhpcy5tYXRjaCgnYmIxMCcpIHx8IHRoaXMubWF0Y2goJ3JpbScpO1xuICB9XG5cbiAgZ2V0IGJsYWNrYmVycnlQaG9uZSgpIHtcbiAgICByZXR1cm4gdGhpcy5ibGFja2JlcnJ5ICYmICF0aGlzLm1hdGNoKCd0YWJsZXQnKTtcbiAgfVxuXG4gIGdldCBibGFja2JlcnJ5VGFibGV0KCkge1xuICAgIHJldHVybiB0aGlzLmJsYWNrYmVycnkgJiYgdGhpcy5tYXRjaCgndGFibGV0Jyk7XG4gIH1cblxuICBnZXQgd2luZG93cygpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaCgnd2luZG93cycpO1xuICB9XG5cbiAgZ2V0IHdpbmRvd3NQaG9uZSgpIHtcbiAgICByZXR1cm4gdGhpcy53aW5kb3dzICYmIHRoaXMubWF0Y2goJ3Bob25lJyk7XG4gIH1cblxuICBnZXQgd2luZG93c1RhYmxldCgpIHtcbiAgICByZXR1cm4gdGhpcy53aW5kb3dzICYmICh0aGlzLm1hdGNoKCd0b3VjaCcpICYmICF0aGlzLndpbmRvd3NQaG9uZSk7XG4gIH1cblxuICBnZXQgZmlyZWZveE9TKCkge1xuICAgIHJldHVybiAodGhpcy5tYXRjaCgnKG1vYmlsZTsnKSB8fCB0aGlzLm1hdGNoKCcodGFibGV0OycpKSAmJiB0aGlzLm1hdGNoKCc7IHJ2OicpO1xuICB9XG5cbiAgZ2V0IGZpcmVmb3hPU1Bob25lKCkge1xuICAgIHJldHVybiB0aGlzLmZpcmVmb3hPUyAmJiB0aGlzLm1hdGNoKCdtb2JpbGUnKTtcbiAgfVxuXG4gIGdldCBmaXJlZm94T1NUYWJsZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmlyZWZveE9TICYmIHRoaXMubWF0Y2goJ3RhYmxldCcpO1xuICB9XG5cbiAgZ2V0IG1vYmlsZSgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5hbmRyb2lkUGhvbmVcbiAgICAgIHx8IHRoaXMuaXBob25lXG4gICAgICB8fCB0aGlzLmlwb2RcbiAgICAgIHx8IHRoaXMud2luZG93c1Bob25lXG4gICAgICB8fCB0aGlzLmJsYWNrYmVycnlQaG9uZVxuICAgICAgfHwgdGhpcy5maXJlZm94T1NQaG9uZVxuICAgICk7XG4gIH1cblxuICBnZXQgdGFibGV0KCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmlwYWRcbiAgICAgIHx8IHRoaXMuYW5kcm9pZFRhYmxldFxuICAgICAgfHwgdGhpcy5ibGFja2JlcnJ5VGFibGV0XG4gICAgICB8fCB0aGlzLndpbmRvd3NUYWJsZXRcbiAgICAgIHx8IHRoaXMuZmlyZWZveE9TVGFibGV0XG4gICAgKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFDQTtBQUNBOzs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQVFBOzs7QUFFQTtBQUNBO0FBT0E7Ozs7OztBQXpHQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./device.js\n");
/***/ }),
/***/ "./index.js":
/*!******************!*\
!*** ./index.js ***!
\******************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nexports.getGPUTier = getGPUTier;\n\nvar _benchmark = __webpack_require__(/*! ./benchmark */ \"./benchmark.js\");\n\nvar _device = __webpack_require__(/*! ./device */ \"./device.js\");\n\nvar _device2 = _interopRequireDefault(_device);\n\nvar _utilities = __webpack_require__(/*! ./utilities */ \"./utilities.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } } // Data\n\n\n// Device\n\n\n// Utilities\n\n\n// Instantiate device detection\nvar device = new _device2.default();\n\nfunction cleanEntryString(entryString) {\n return entryString.toLowerCase() // Lowercase all for easier matching\n .split('- ')[1] // Remove prelude score (`3 - `)\n .split(' /')[0]; // Reduce 'apple a9x / powervr series 7xt' to 'apple a9x'\n}\n\nfunction getEntryVersionNumber(entryString) {\n return entryString.replace(/[\\D]/g, ''); // Grab and concat all digits in the string\n}\n\nfunction cleanRendererString(rendererString) {\n var cleanedRendererString = rendererString.toLowerCase();\n\n // Strip off ANGLE and Direct3D version\n if (cleanedRendererString.includes('angle (') && cleanedRendererString.includes('direct3d')) {\n cleanedRendererString = cleanedRendererString.replace('angle (', '').split(' direct3d')[0];\n }\n\n // Strip off the GB amount (1060 6gb was being concatenated to 10606 and because of it using the fallback)\n if (cleanedRendererString.includes('nvidia') && cleanedRendererString.includes('gb')) {\n cleanedRendererString = cleanedRendererString.split(/\\dgb/)[0];\n }\n\n return cleanedRendererString;\n}\n\nvar GPUTier = function GPUTier() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n _classCallCheck(this, GPUTier);\n\n this.mobileBenchmarkPercentages = [10, 40, 30, 20]; // [TIER_0, TIER_1, TIER_2, TIER_3]\n this.desktopBenchmarkPercentages = [10, 40, 30, 20]; // [TIER_0, TIER_1, TIER_2, TIER_3]\n this.forceRendererString = false;\n this.forceMobile = false;\n\n _extends(this, options);\n\n var isMobile = device.mobile || device.tablet || this.forceMobile;\n var isDesktop = !isMobile;\n\n var renderer = void 0;\n var tier = void 0;\n var type = void 0;\n\n if (this.forceRendererString === false) {\n renderer = (0, _utilities.getWebGLUnmaskedRenderer)();\n } else {\n renderer = this.forceRendererString;\n }\n\n // WebGL support is missing\n if (!renderer) {\n if (isMobile) {\n return {\n tier: 'GPU_MOBILE_TIER_0',\n type: 'WEBGL_UNSUPPORTED'\n };\n }\n\n return {\n tier: 'GPU_DESKTOP_TIER_0',\n type: 'WEBGL_UNSUPPORTED'\n };\n }\n\n renderer = cleanRendererString(renderer);\n var rendererVersionNumber = renderer.replace(/[\\D]/g, '');\n\n // GPU BLACKLIST\n // https://wiki.mozilla.org/Blocklisting/Blocked_Graphics_Drivers\n // https://www.khronos.org/webgl/wiki/BlacklistsAndWhitelists\n // https://chromium.googlesource.com/chromium/src/+/master/gpu/config/software_rendering_list.json\n // https://chromium.googlesource.com/chromium/src/+/master/gpu/config/gpu_driver_bug_list.json\n var isGPUBlacklisted = /(radeon hd 6970m|radeon hd 6770m|radeon hd 6490m|radeon hd 6630m|radeon hd 6750m|radeon hd 5750|radeon hd 5670|radeon hd 4850|radeon hd 4870|radeon hd 4670|geforce 9400m|geforce 320m|geforce 330m|geforce gt 130|geforce gt 120|geforce gtx 285|geforce 8600|geforce 9600m|geforce 9400m|geforce 8800 gs|geforce 8800 gt|quadro fx 5|quadro fx 4|radeon hd 2600|radeon hd 2400|radeon hd 2600|mali-4|mali-3|mali-2)/.test(renderer);\n\n if (isGPUBlacklisted) {\n if (isMobile) {\n return {\n tier: 'GPU_MOBILE_TIER_0',\n type: 'BLACKLISTED'\n };\n }\n\n return {\n tier: 'GPU_DESKTOP_TIER_0',\n type: 'BLACKLISTED'\n };\n }\n\n if (isMobile) {\n var mobileBenchmark = (0, _utilities.getBenchmarkByPercentage)(_benchmark.BENCHMARK_SCORE_MOBILE, this.mobileBenchmarkPercentages);\n\n var isRendererAdreno = renderer.includes('adreno');\n var isRendererApple = renderer.includes('apple');\n var isRendererMali = renderer.includes('mali') && !renderer.includes('mali-t');\n var isRendererMaliT = renderer.includes('mali-t');\n var isRendererNVIDIA = renderer.includes('nvidia');\n var isRendererPowerVR = renderer.includes('powervr');\n\n mobileBenchmark.forEach(function (benchmarkTier, index) {\n return benchmarkTier.forEach(function (benchmarkEntry) {\n var entry = cleanEntryString(benchmarkEntry);\n var entryVersionNumber = getEntryVersionNumber(entry);\n\n if (entry.includes('adreno') && isRendererAdreno || entry.includes('apple') && isRendererApple || entry.