text: (function (window) {
    if (!window.document) return;
    var document = window.document;
  
    //https://github.com/inexorabletash/polyfill/blob/master/web.js
      if (!document.querySelectorAll) {
        document.querySelectorAll = function (selectors) {
          var style = document.createElement('style'), elements = [], element;
          document.documentElement.firstChild.appendChild(style);
          document._qsa = [];
  
          style.styleSheet.cssText = selectors + '{x-qsa:expression(document._qsa && document._qsa.push(this))}';
          window.scrollBy(0, 0);
          style.parentNode.removeChild(style);
  
          while (document._qsa.length) {
            element = document._qsa.shift();
            element.style.removeAttribute('x-qsa');
            elements.push(element);
          }
          document._qsa = null;
          return elements;
        };
      }
  
      if (!document.querySelector) {
        document.querySelector = function (selectors) {
          var elements = document.querySelectorAll(selectors);
          return (elements.length) ? elements[0] : null;
        };
      }
  
      if (!document.getElementsByClassName) {
        document.getElementsByClassName = function (classNames) {
          classNames = String(classNames).replace(/^|\s+/g, '.');
          return document.querySelectorAll(classNames);
        };
      }
  
    //https://github.com/inexorabletash/polyfill
    // ES5 15.2.3.14 Object.keys ( O )
    // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/keys
    if (!Object.keys) {
      Object.keys = function (o) {
        if (o !== Object(o)) { throw TypeError('Object.keys called on non-object'); }
        var ret = [], p;
        for (p in o) {
          if (Object.prototype.hasOwnProperty.call(o, p)) {
            ret.push(p);
          }
        }
        return ret;
      };
    }
  
    // ES5 15.4.4.18 Array.prototype.forEach ( callbackfn [ , thisArg ] )
    // From https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/forEach
    if (!Array.prototype.forEach) {
      Array.prototype.forEach = function (fun /*, thisp */) {
        if (this === void 0 || this === null) { throw TypeError(); }
  
        var t = Object(this);
        var len = t.length >>> 0;
        if (typeof fun !== "function") { throw TypeError(); }
  
        var thisp = arguments[1], i;
        for (i = 0; i < len; i++) {
          if (i in t) {
            fun.call(thisp, t[i], i, t);
          }
        }
      };
    }
  
    //https://github.com/inexorabletash/polyfill/blob/master/web.js
    (function (global) {
      var B64_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
      global.atob = global.atob || function (input) {
        input = String(input);
        var position = 0,
            output = [],
            buffer = 0, bits = 0, n;
  
        input = input.replace(/\s/g, '');
        if ((input.length % 4) === 0) { input = input.replace(/=+$/, ''); }
        if ((input.length % 4) === 1) { throw Error('InvalidCharacterError'); }
        if (/[^+/0-9A-Za-z]/.test(input)) { throw Error('InvalidCharacterError'); }
  
        while (position < input.length) {
          n = B64_ALPHABET.indexOf(input.charAt(position));
          buffer = (buffer << 6) | n;
          bits += 6;
  
          if (bits === 24) {
            output.push(String.fromCharCode((buffer >> 16) & 0xFF));
            output.push(String.fromCharCode((buffer >>  8) & 0xFF));
            output.push(String.fromCharCode(buffer & 0xFF));
            bits = 0;
            buffer = 0;
          }
          position += 1;
        }
  
        if (bits === 12) {
          buffer = buffer >> 4;
          output.push(String.fromCharCode(buffer & 0xFF));
        } else if (bits === 18) {
          buffer = buffer >> 2;
          output.push(String.fromCharCode((buffer >> 8) & 0xFF));
          output.push(String.fromCharCode(buffer & 0xFF));
        }
  
        return output.join('');
      };
  
      global.btoa = global.btoa || function (input) {
        input = String(input);
        var position = 0,
            out = [],
            o1, o2, o3,
            e1, e2, e3, e4;
  
        if (/[^\x00-\xFF]/.test(input)) { throw Error('InvalidCharacterError'); }
  
        while (position < input.length) {
          o1 = input.charCodeAt(position++);
          o2 = input.charCodeAt(position++);
          o3 = input.charCodeAt(position++);
  
          // 111111 112222 222233 333333
          e1 = o1 >> 2;
          e2 = ((o1 & 0x3) << 4) | (o2 >> 4);
          e3 = ((o2 & 0xf) << 2) | (o3 >> 6);
          e4 = o3 & 0x3f;
  
          if (position === input.length + 2) {
            e3 = 64; e4 = 64;
          }
          else if (position === input.length + 1) {
            e4 = 64;
          }
  
          out.push(B64_ALPHABET.charAt(e1),
                   B64_ALPHABET.charAt(e2),
                   B64_ALPHABET.charAt(e3),
                   B64_ALPHABET.charAt(e4));
        }
  
        return out.join('');
      };
    }(window));
  
    //https://gist.github.com/jimeh/332357
    if (!Object.prototype.hasOwnProperty){
        /*jshint -W001, -W103 */
        Object.prototype.hasOwnProperty = function(prop) {
        var proto = this.__proto__ || this.constructor.prototype;
        return (prop in this) && (!(prop in proto) || proto[prop] !== this[prop]);
      };
        /*jshint +W001, +W103 */
    }
  
    // @license http://opensource.org/licenses/MIT
    // copyright Paul Irish 2015
  
  
    // Date.now() is supported everywhere except IE8. For IE8 we use the Date.now polyfill
    //   github.com/Financial-Times/polyfill-service/blob/master/polyfills/Date.now/polyfill.js
    // as Safari 6 doesn't have support for NavigationTiming, we use a Date.now() timestamp for relative values
  
    // if you want values similar to what you'd get with real perf.now, place this towards the head of the page
    // but in reality, you're just getting the delta between now() calls, so it's not terribly important where it's placed
  
  
    (function(){
  
      if ('performance' in window === false) {
          window.performance = {};
      }
  
      Date.now = (Date.now || function () {  // thanks IE8
        return new Date().getTime();
      });
  
      if ('now' in window.performance === false){
  
        var nowOffset = Date.now();
  
        if (performance.timing && performance.timing.navigationStart){
          nowOffset = performance.timing.navigationStart;
        }
  
        window.performance.now = function now(){
          return Date.now() - nowOffset;
        };
      }
  
    })();
  
    //requestAnimationFrame polyfill for older Firefox/Chrome versions
    if (!window.requestAnimationFrame) {
      if (window.webkitRequestAnimationFrame) {
      //https://github.com/Financial-Times/polyfill-service/blob/master/polyfills/requestAnimationFrame/polyfill-webkit.js
      (function (global) {
        // window.requestAnimationFrame
        global.requestAnimationFrame = function (callback) {
          return webkitRequestAnimationFrame(function () {
            callback(global.performance.now());
          });
        };
  
        // window.cancelAnimationFrame
        global.cancelAnimationFrame = webkitCancelAnimationFrame;
      }(window));
      } else if (window.mozRequestAnimationFrame) {
        //https://github.com/Financial-Times/polyfill-service/blob/master/polyfills/requestAnimationFrame/polyfill-moz.js
      (function (global) {
        // window.requestAnimationFrame
        global.requestAnimationFrame = function (callback) {
          return mozRequestAnimationFrame(function () {
            callback(global.performance.now());
          });
        };
  
        // window.cancelAnimationFrame
        global.cancelAnimationFrame = mozCancelAnimationFrame;
      }(window));
      } else {
      (function (global) {
        global.requestAnimationFrame = function (callback) {
        return global.setTimeout(callback, 1000 / 60);
        };
  
        global.cancelAnimationFrame = global.clearTimeout;
      })(window);
      }
    }
  })(this);
  