UNPKG

oclazyload

Version:

Load modules on demand (lazy load) with angularJS

448 lines (446 loc) 32.4 kB
<!doctype html> <html lang="en"> <head> <title>Code coverage report for ./src/ocLazyLoad.loaders.common.js</title> <meta charset="utf-8"> <link rel="stylesheet" href="../prettify.css"> <link rel="stylesheet" href="../base.css"> <style type='text/css'> div.coverage-summary .sorter { background-image: url(../sort-arrow-sprite.png); } </style> </head> <body> <div class="header medium"> <h1>Code coverage report for <span class="entity">./src/ocLazyLoad.loaders.common.js</span></h1> <h2> Statements: <span class="metric">66.67% <small>(46 / 69)</small></span> &nbsp;&nbsp;&nbsp;&nbsp; Branches: <span class="metric">52.94% <small>(27 / 51)</small></span> &nbsp;&nbsp;&nbsp;&nbsp; Functions: <span class="metric">87.5% <small>(7 / 8)</small></span> &nbsp;&nbsp;&nbsp;&nbsp; Lines: <span class="metric">67.65% <small>(46 / 68)</small></span> &nbsp;&nbsp;&nbsp;&nbsp; Ignored: <span class="metric"><span class="ignore-none">none</span></span> &nbsp;&nbsp;&nbsp;&nbsp; </h2> <div class="path"><a href="../index.html">All files</a> &#187; <a href="index.html">./src/</a> &#187; ocLazyLoad.loaders.common.js</div> </div> <div class="body"> <pre><table class="coverage"> <tr><td class="line-count">1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135</td><td class="line-coverage"><span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">1</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">1</span> <span class="cline-any cline-yes">29</span> <span class="cline-any cline-yes">28</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">28</span> <span class="cline-any cline-yes">16</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">1</span> <span class="cline-any cline-yes">1</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">1</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">16</span> <span class="cline-any cline-yes">16</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">16</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">3</span> <span class="cline-any cline-yes">3</span> <span class="cline-any cline-yes">3</span> <span class="cline-any cline-yes">3</span> <span class="cline-any cline-yes">3</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">13</span> <span class="cline-any cline-yes">13</span> <span class="cline-any cline-yes">13</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">16</span> <span class="cline-any cline-yes">14</span> <span class="cline-any cline-yes">14</span> <span class="cline-any cline-yes">14</span> <span class="cline-any cline-yes">14</span> <span class="cline-any cline-yes">14</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">16</span> <span class="cline-any cline-yes">2</span> <span class="cline-any cline-yes">2</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">16</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">16</span> <span class="cline-any cline-yes">16</span> <span class="cline-any cline-yes">1</span> <span class="cline-any cline-yes">1</span> <span class="cline-any cline-yes">1</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">16</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">16</span> <span class="cline-any cline-yes">3</span> <span class="cline-any cline-yes">3</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">3</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-yes">3</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-yes">3</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-yes">3</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">3</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">16</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">28</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">'use strict'; &nbsp; (function (angular) { 'use strict'; &nbsp; angular.module('oc.lazyLoad').config(function ($provide) { $provide.decorator('$ocLazyLoad', function ($delegate, $q, $window, $interval) { var uaCssChecked = false, useCssLoadPatch = false, anchor = $window.document.getElementsByTagName('head')[0] || <span class="branch-1 cbranch-no" title="branch not covered" >$window.document.getElementsByTagName('body')[0];</span> &nbsp; /** * Load a js/css file * @param type * @param path * @param params * @returns promise */ $delegate.buildElement = function buildElement(type, path, params) { var deferred = $q.defer(), el, loaded, filesCache = $delegate._getFilesCache(), cacheBuster = function cacheBuster(url) { var dc = new Date().getTime(); <span class="missing-if-branch" title="if path not taken" >I</span>if (url.indexOf('?') &gt;= 0) { <span class="cstat-no" title="statement not covered" > if (url.substring(0, url.length - 1) === '&amp;') {</span> <span class="cstat-no" title="statement not covered" > return url + '_dc=' + dc;</span> } <span class="cstat-no" title="statement not covered" > return url + '&amp;_dc=' + dc;</span> } else { return url + '?_dc=' + dc; } }; &nbsp; // Store the promise early so the file load can be detected by other parallel lazy loads // (ie: multiple routes on one page) a 'true' value isn't sufficient // as it causes false positive load results. <span class="missing-if-branch" title="else path not taken" >E</span>if (angular.isUndefined(filesCache.get(path))) { filesCache.put(path, deferred.promise); } &nbsp; // Switch in case more content types are added later switch (type) { case 'css': el = $window.document.createElement('link'); el.type = 'text/css'; el.rel = 'stylesheet'; el.href = params.cache === false ? <span class="branch-0 cbranch-no" title="branch not covered" >cacheBuster(path) </span>: path; break; case 'js': el = $window.document.createElement('script'); el.src = params.cache === false ? cacheBuster(path) : path; break; <span class="branch-2 cbranch-no" title="branch not covered" > default:</span> <span class="cstat-no" title="statement not covered" > filesCache.remove(path);</span> <span class="cstat-no" title="statement not covered" > deferred.reject(new Error('Requested type "' + type + '" is not known. Could not inject "' + path + '"'));</span> <span class="cstat-no" title="statement not covered" > break;</span> } el.onload = el['onreadystatechange'] = function (e) { <span class="missing-if-branch" title="if path not taken" >I</span>if (el['readyState'] &amp;&amp; <span class="branch-1 cbranch-no" title="branch not covered" >!/^c|loade/.test(el['readyState']) </span>|| loaded) <span class="cstat-no" title="statement not covered" >return;</span> el.onload = el['onreadystatechange'] = null; loaded = 1; $delegate._broadcast('ocLazyLoad.fileLoaded', path); deferred.resolve(el); }; el.onerror = function () { filesCache.remove(path); deferred.reject(new Error('Unable to load ' + path)); }; el.async = params.serie ? 0 : 1; &nbsp; var insertBeforeElem = anchor.lastChild; if (params.insertBefore) { var element = angular.element(angular.isDefined(window.jQuery) ? <span class="branch-0 cbranch-no" title="branch not covered" >params.insertBefore </span>: document.querySelector(params.insertBefore)); <span class="missing-if-branch" title="else path not taken" >E</span>if (element &amp;&amp; element.length &gt; 0) { insertBeforeElem = element[0]; } } insertBeforeElem.parentNode.insertBefore(el, insertBeforeElem); &nbsp; /* The event load or readystatechange doesn't fire in: - PhantomJS 1.9 (headless webkit browser) - iOS &lt; 6 (default mobile browser) - Android &lt; 4.4 (default mobile browser) - Safari &lt; 6 (desktop browser) */ if (type == 'css') { <span class="missing-if-branch" title="else path not taken" >E</span>if (!uaCssChecked) { var ua = $window.navigator.userAgent.toLowerCase(); &nbsp; <span class="missing-if-branch" title="if path not taken" >I</span>if (ua.indexOf('phantomjs/1.9') &gt; -1) { // PhantomJS ~1.9 <span class="cstat-no" title="statement not covered" > useCssLoadPatch = true;</span> } else <span class="missing-if-branch" title="if path not taken" >I</span>if (/iP(hone|od|ad)/.test($window.navigator.platform)) { // iOS &lt; 6 <span class="cstat-no" title="statement not covered" > var v = $window.navigator.appVersion.match(/OS (\d+)_(\d+)_?(\d+)?/);</span> <span class="cstat-no" title="statement not covered" > var iOSVersion = parseFloat([parseInt(v[1], 10), parseInt(v[2], 10), parseInt(v[3] || 0, 10)].join('.'));</span> <span class="cstat-no" title="statement not covered" > useCssLoadPatch = iOSVersion &lt; 6;</span> } else <span class="missing-if-branch" title="if path not taken" >I</span>if (ua.indexOf('android') &gt; -1) { // Android &lt; 4.4 <span class="cstat-no" title="statement not covered" > var androidVersion = parseFloat(ua.slice(ua.indexOf('android') + 8));</span> <span class="cstat-no" title="statement not covered" > useCssLoadPatch = androidVersion &lt; 4.4;</span> } else <span class="missing-if-branch" title="if path not taken" >I</span>if (ua.indexOf('safari') &gt; -1) { // Safari &lt; 6 <span class="cstat-no" title="statement not covered" > var versionMatch = ua.match(/version\/([\.\d]+)/i);</span> <span class="cstat-no" title="statement not covered" > useCssLoadPatch = versionMatch &amp;&amp; versionMatch[1] &amp;&amp; parseFloat(versionMatch[1]) &lt; 6;</span> } } &nbsp; <span class="missing-if-branch" title="if path not taken" >I</span>if (useCssLoadPatch) { <span class="cstat-no" title="statement not covered" > var tries = 1000; </span>// * 20 = 20000 miliseconds <span class="cstat-no" title="statement not covered" > var interval = $interval(<span class="fstat-no" title="function not covered" >function () {</span></span> <span class="cstat-no" title="statement not covered" > try {</span> <span class="cstat-no" title="statement not covered" > el.sheet.cssRules;</span> <span class="cstat-no" title="statement not covered" > $interval.cancel(interval);</span> <span class="cstat-no" title="statement not covered" > el.onload();</span> } catch (e) { <span class="cstat-no" title="statement not covered" > if (--tries &lt;= 0) {</span> <span class="cstat-no" title="statement not covered" > el.onerror();</span> } } }, 20); } } &nbsp; return deferred.promise; }; &nbsp; return $delegate; }); }); })(angular); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L3d3dy9vY0xhenlMb2FkL3NyYy9vY0xhenlMb2FkLmxvYWRlcnMuY29tbW9uLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsQ0FBQyxVQUFBLE9BQU8sRUFBSTtBQUNSLGdCQUFZLENBQUM7O0FBRWIsV0FBTyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBQSxRQUFRLEVBQUk7QUFDN0MsZ0JBQVEsQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLFVBQVMsU0FBUyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFO0FBQzFFLGdCQUFJLFlBQVksR0FBRyxLQUFLO2dCQUNwQixlQUFlLEdBQUcsS0FBSztnQkFDdkIsTUFBTSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7Ozs7Ozs7O0FBU2xILHFCQUFTLENBQUMsWUFBWSxHQUFHLFNBQVMsWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFO0FBQy9ELG9CQUFJLFFBQVEsR0FBRyxFQUFFLENBQUMsS0FBSyxFQUFFO29CQUNyQixFQUFFO29CQUNGLE1BQU07b0JBQ04sVUFBVSxHQUFHLFNBQVMsQ0FBQyxjQUFjLEVBQUU7b0JBQ3ZDLFdBQVcsR0FBRyxTQUFTLFdBQVcsQ0FBQyxHQUFHLEVBQUU7QUFDcEMsd0JBQUksRUFBRSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7QUFDOUIsd0JBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7QUFDdEIsNEJBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFH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Q0FBQyxDQUFDO0FBQ3JFLDJDQUFlLEdBQUcsY0FBYyxHQUFHLEdBQUcsQ0FBQzt5QkFDMUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7O0FBRWxDLGdDQUFJLFlBQVksR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7QUFDbkQsMkNBQWUsR0FBSSxZQUFZLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEFBQUMsQ0FBQzt5QkFDMUY7cUJBQ0o7O0FBRUQsd0JBQUcsZUFBZSxFQUFFO0FBQ2hCLDRCQUFJLEtBQUssR0FBRyxJQUFJLENBQUM7QUFDakIsNEJBQUksUUFBUSxHQUFHLFNBQVMsQ0FBQyxZQUFNO0FBQzNCLGdDQUFJO0FBQ0Esa0NBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO0FBQ2xCLHlDQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQzNCLGtDQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7NkJBQ2YsQ0FBQyxPQUFNLENBQUMsRUFBRTtBQUNQLG9DQUFHLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRTtBQUNiLHNDQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7aUNBQ2hCOzZCQUNKO3lCQUNKLEVBQUUsRUFBRSxDQUFDLENBQUM7cUJBQ1Y7aUJBQ0o7O0FBRUQsdUJBQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQzthQUMzQixDQUFDOztBQUVGLG1CQUFPLFNBQVMsQ0FBQztTQUNwQixDQUFDLENBQUE7S0FDTCxDQUFDLENBQUM7Q0FFTixDQUFBLENBQUUsT0FBTyxDQUFDLENBQUMiLCJmaWxlIjoiQzovd3d3L29jTGF6eUxvYWQvc3JjL29jTGF6eUxvYWQubG9hZGVycy5jb21tb24uanMiLCJzb3VyY2VzQ29udGVudCI6WyIoYW5ndWxhciA9PiB7XHJcbiAgICAndXNlIHN0cmljdCc7XHJcblxyXG4gICAgYW5ndWxhci5tb2R1bGUoJ29jLmxhenlMb2FkJykuY29uZmlnKCRwcm92aWRlID0+IHtcclxuICAgICAgICAkcHJvdmlkZS5kZWNvcmF0b3IoJyRvY0xhenlMb2FkJywgZnVuY3Rpb24oJGRlbGVnYXRlLCAkcSwgJHdpbmRvdywgJGludGVydmFsKSB7XHJcbiAgICAgICAgICAgIHZhciB1YUNzc0NoZWNrZWQgPSBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHVzZUNzc0xvYWRQYXRjaCA9IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgYW5jaG9yID0gJHdpbmRvdy5kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdIHx8ICR3aW5kb3cuZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2JvZHknKVswXTtcclxuXHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBMb2FkIGEganMvY3NzIGZpbGVcclxuICAgICAgICAgICAgICogQHBhcmFtIHR5cGVcclxuICAgICAgICAgICAgICogQHBhcmFtIHBhdGhcclxuICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtc1xyXG4gICAgICAgICAgICAgKiBAcmV0dXJucyBwcm9taXNlXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAkZGVsZWdhdGUuYnVpbGRFbGVtZW50ID0gZnVuY3Rpb24gYnVpbGRFbGVtZW50KHR5cGUsIHBhdGgsIHBhcmFtcykge1xyXG4gICAgICAgICAgICAgICAgdmFyIGRlZmVycmVkID0gJHEuZGVmZXIoKSxcclxuICAgICAgICAgICAgICAgICAgICBlbCxcclxuICAgICAgICAgICAgICAgICAgICBsb2FkZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsZXNDYWNoZSA9ICRkZWxlZ2F0ZS5fZ2V0RmlsZXNDYWNoZSgpLFxyXG4gICAgICAgICAgICAgICAgICAgIGNhY2hlQnVzdGVyID0gZnVuY3Rpb24gY2FjaGVCdXN0ZXIodXJsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZih1cmwuaW5kZXhPZignPycpID49IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHVybC5zdWJzdHJpbmcoMCwgdXJsLmxlbmd0aCAtIDEpID09PSAnJicpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7IHVybCB9X2RjPSR7IGRjIH1gO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAkeyB1cmwgfSZfZGM9JHsgZGMgfWA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7IHVybCB9P19kYz0keyBkYyB9YDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gU3RvcmUgdGhlIHByb21pc2UgZWFybHkgc28gdGhlIGZpbGUgbG9hZCBjYW4gYmUgZGV0ZWN0ZWQgYnkgb3RoZXIgcGFyYWxsZWwgbGF6eSBsb2Fkc1xyXG4gICAgICAgICAgICAgICAgLy8gKGllOiBtdWx0aXBsZSByb3V0ZXMgb24gb25lIHBhZ2UpIGEgJ3RydWUnIHZhbHVlIGlzbid0IHN1ZmZpY2llbnRcclxuICAgICAgICAgICAgICAgIC8vIGFzIGl0IGNhdXNlcyBmYWxzZSBwb3NpdGl2ZSBsb2FkIHJlc3VsdHMuXHJcbiAgICAgICAgICAgICAgICBpZihhbmd1bGFyLmlzVW5kZWZpbmVkKGZpbGVzQ2FjaGUuZ2V0KHBhdGgpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbGVzQ2FjaGUucHV0KHBhdGgsIGRlZmVycmVkLnByb21pc2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIFN3aXRjaCBpbiBjYXNlIG1vcmUgY29udGVudCB0eXBlcyBhcmUgYWRkZWQgbGF0ZXJcclxuICAgICAgICAgICAgICAgIHN3aXRjaCh0eXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnY3NzJzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWwgPSAkd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWwudHlwZSA9ICd0ZXh0L2Nzcyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsLnJlbCA9ICdzdHlsZXNoZWV0JztcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWwuaHJlZiA9IHBhcmFtcy5jYWNoZSA9PT0gZmFsc2UgPyBjYWNoZUJ1c3RlcihwYXRoKSA6IHBhdGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2pzJzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWwgPSAkd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5zcmMgPSBwYXJhbXMuY2FjaGUgPT09IGZhbHNlID8gY2FjaGVCdXN0ZXIocGF0aCkgOiBwYXRoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlc0NhY2hlLnJlbW92ZShwYXRoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KG5ldyBFcnJvcihgUmVxdWVzdGVkIHR5cGUgXCIkeyB0eXBlIH1cIiBpcyBub3Qga25vd24uIENvdWxkIG5vdCBpbmplY3QgXCIkeyBwYXRoIH1cImApKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbC5vbmxvYWQgPSBlbFsnb25yZWFkeXN0YXRlY2hhbmdlJ10gPSBmdW5jdGlvbihlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoKGVsWydyZWFkeVN0YXRlJ10gJiYgIS9eY3xsb2FkZS8udGVzdChlbFsncmVhZHlTdGF0ZSddKSkgfHwgbG9hZGVkKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgZWwub25sb2FkID0gZWxbJ29ucmVhZHlzdGF0ZWNoYW5nZSddID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICBsb2FkZWQgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICRkZWxlZ2F0ZS5fYnJvYWRjYXN0KCdvY0xhenlMb2FkLmZpbGVMb2FkZWQnLCBwYXRoKTtcclxuICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKGVsKTtcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBlbC5vbmVycm9yID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlsZXNDYWNoZS5yZW1vdmUocGF0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KG5ldyBFcnJvcihgVW5hYmxlIHRvIGxvYWQgJHsgcGF0aCB9YCkpO1xyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIGVsLmFzeW5jID0gcGFyYW1zLnNlcmllID8gMCA6IDE7XHJcblxyXG4gICAgICAgICAgICAgICAgdmFyIGluc2VydEJlZm9yZUVsZW0gPSBhbmNob3IubGFzdENoaWxkO1xyXG4gICAgICAgICAgICAgICAgaWYocGFyYW1zLmluc2VydEJlZm9yZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBlbGVtZW50ID0gYW5ndWxhci5lbGVtZW50KGFuZ3VsYXIuaXNEZWZpbmVkKHdpbmRvdy5qUXVlcnkpID8gcGFyYW1zLmluc2VydEJlZm9yZSA6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IocGFyYW1zLmluc2VydEJlZm9yZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKGVsZW1lbnQgJiYgZWxlbWVudC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydEJlZm9yZUVsZW0gPSBlbGVtZW50WzBdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGluc2VydEJlZm9yZUVsZW0ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZWwsIGluc2VydEJlZm9yZUVsZW0pO1xyXG5cclxuICAgICAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgICAgICAgVGhlIGV2ZW50IGxvYWQgb3IgcmVhZHlzdGF0ZWNoYW5nZSBkb2Vzbid0IGZpcmUgaW46XHJcbiAgICAgICAgICAgICAgICAgLSBQaGFudG9tSlMgMS45IChoZWFkbGVzcyB3ZWJraXQgYnJvd3NlcilcclxuICAgICAgICAgICAgICAgICAtIGlPUyA8IDYgICAgICAgKGRlZmF1bHQgbW9iaWxlIGJyb3dzZXIpXHJcbiAgICAgICAgICAgICAgICAgLSBBbmRyb2lkIDwgNC40IChkZWZhdWx0IG1vYmlsZSBicm93c2VyKVxyXG4gICAgICAgICAgICAgICAgIC0gU2FmYXJpIDwgNiAgICAoZGVza3RvcCBicm93c2VyKVxyXG4gICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICBpZih0eXBlID09ICdjc3MnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIXVhQ3NzQ2hlY2tlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdWEgPSAkd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1YS5pbmRleE9mKCdwaGFudG9tanMvMS45JykgPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGhhbnRvbUpTIH4xLjlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZUNzc0xvYWRQYXRjaCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoL2lQKGhvbmV8b2R8YWQpLy50ZXN0KCR3aW5kb3cubmF2aWdhdG9yLnBsYXRmb3JtKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaU9TIDwgNlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSAkd2luZG93Lm5hdmlnYXRvci5hcHBWZXJzaW9uLm1hdGNoKC9PUyAoXFxkKylfKFxcZCspXz8oXFxkKyk/Lyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaU9TVmVyc2lvbiA9IHBhcnNlRmxvYXQoW3BhcnNlSW50KHZbMV0sIDEwKSwgcGFyc2VJbnQodlsyXSwgMTApLCBwYXJzZUludCh2WzNdIHx8IDAsIDEwKV0uam9pbignLicpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZUNzc0xvYWRQYXRjaCA9IGlPU1ZlcnNpb24gPCA2O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHVhLmluZGV4T2YoJ2FuZHJvaWQnKSA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBbmRyb2lkIDwgNC40XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYW5kcm9pZFZlcnNpb24gPSBwYXJzZUZsb2F0KHVhLnNsaWNlKHVhLmluZGV4T2YoJ2FuZHJvaWQnKSArIDgpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZUNzc0xvYWRQYXRjaCA9IGFuZHJvaWRWZXJzaW9uIDwgNC40O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHVhLmluZGV4T2YoJ3NhZmFyaScpID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhZmFyaSA8IDZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2ZXJzaW9uTWF0Y2ggPSB1YS5tYXRjaCgvdmVyc2lvblxcLyhbXFwuXFxkXSspL2kpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlQ3NzTG9hZFBhdGNoID0gKHZlcnNpb25NYXRjaCAmJiB2ZXJzaW9uTWF0Y2hbMV0gJiYgcGFyc2VGbG9hdCh2ZXJzaW9uTWF0Y2hbMV0pIDwgNik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmKHVzZUNzc0xvYWRQYXRjaCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdHJpZXMgPSAxMDAwOyAvLyAqIDIwID0gMjAwMDAgbWlsaXNlY29uZHNcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGludGVydmFsID0gJGludGVydmFsKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwuc2hlZXQuY3NzUnVsZXM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGludGVydmFsLmNhbmNlbChpbnRlcnZhbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwub25sb2FkKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigtLXRyaWVzIDw9IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwub25lcnJvcigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgMjApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiAkZGVsZWdhdGU7XHJcbiAgICAgICAgfSlcclxuICAgIH0pO1xyXG5cclxufSkoYW5ndWxhcik7XHJcbiJdfQ==</pre></td></tr> </table></pre> </div> <div class="footer"> <div class="meta">Generated by <a href="http://istanbul-js.org/" target="_blank">istanbul</a> at Fri Feb 03 2017 10:04:58 GMT+0100 (Paris, Madrid)</div> </div> <script src="../prettify.js"></script> <script> window.onload = function () { if (typeof prettyPrint === 'function') { prettyPrint(); } }; </script> <script src="../sorter.js"></script> </body> </html>