text: /* **********************************************
   Begin prism-core.js
   ********************************************** */
  
  var _self = (typeof window !== 'undefined')
    ? window   // if in browser
    : (
    (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope)
      ? self // if in worker
      : {}   // if in node js
  );
  
  /**
   * Prism: Lightweight, robust, elegant syntax highlighting
   * MIT license http://www.opensource.org/licenses/mit-license.php/
   * @author Lea Verou http://lea.verou.me
   */
  
  var Prism = (function(){
  
  // Private helper vars
    var lang = /\blang(?:uage)?-(?!\*)(\w+)\b/i;
  
    var _ = _self.Prism = {
      util: {
        encode: function (tokens) {
          if (tokens instanceof Token) {
            return new Token(tokens.type, _.util.encode(tokens.content), tokens.alias);
          } else if (_.util.type(tokens) === 'Array') {
            return tokens.map(_.util.encode);
          } else {
            return tokens.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/\u00a0/g, ' ');
          }
        },
  
        type: function (o) {
          return Object.prototype.toString.call(o).match(/\[object (\w+)\]/)[1];
        },
  
        // Deep clone a language definition (e.g. to extend it)
        clone: function (o) {
          var type = _.util.type(o);
  
          switch (type) {
            case 'Object':
              var clone = {};
  
              for (var key in o) {
                if (o.hasOwnProperty(key)) {
                  clone[key] = _.util.clone(o[key]);
                }
              }
  
              return clone;
  
            case 'Array':
              // Check for existence for IE8
              return o.map && o.map(function(v) { return _.util.clone(v); });
          }
  
          return o;
        }
      },
  
      languages: {
        extend: function (id, redef) {
          var lang = _.util.clone(_.languages[id]);
  
          for (var key in redef) {
            lang[key] = redef[key];
          }
  
          return lang;
        },
  
        /**
         * Insert a token before another token in a language literal
         * As this needs to recreate the object (we cannot actually insert before keys in object literals),
         * we cannot just provide an object, we need anobject and a key.
         * @param inside The key (or language id) of the parent
         * @param before The key to insert before. If not provided, the function appends instead.
         * @param insert Object with the key/value pairs to insert
         * @param root The object that contains `inside`. If equal to Prism.languages, it can be omitted.
         */
        insertBefore: function (inside, before, insert, root) {
          root = root || _.languages;
          var grammar = root[inside];
  
          if (arguments.length == 2) {
            insert = arguments[1];
  
            for (var newToken in insert) {
              if (insert.hasOwnProperty(newToken)) {
                grammar[newToken] = insert[newToken];
              }
            }
  
            return grammar;
          }
  
          var ret = {};
  
          for (var token in grammar) {
  
            if (grammar.hasOwnProperty(token)) {
  
              if (token == before) {
  
                for (var newToken in insert) {
  
                  if (insert.hasOwnProperty(newToken)) {
                    ret[newToken] = insert[newToken];
                  }
                }
              }
  
              ret[token] = grammar[token];
            }
          }
  
          // Update references in other language definitions
          _.languages.DFS(_.languages, function(key, value) {
            if (value === root[inside] && key != inside) {
              this[key] = ret;
            }
          });
  
          return root[inside] = ret;
        },
  
        // Traverse a language definition with Depth First Search
        DFS: function(o, callback, type) {
          for (var i in o) {
            if (o.hasOwnProperty(i)) {
              callback.call(o, i, o[i], type || i);
  
              if (_.util.type(o[i]) === 'Object') {
                _.languages.DFS(o[i], callback);
              }
              else if (_.util.type(o[i]) === 'Array') {
                _.languages.DFS(o[i], callback, i);
              }
            }
          }
        }
      },
      plugins: {},
  
      highlightAll: function(async, callback) {
        var elements = document.querySelectorAll('code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code');
  
        for (var i=0, element; element = elements[i++];) {
          _.highlightElement(element, async === true, callback);
        }
      },
  
      highlightElement: function(element, async, callback) {
        // Find language
        var language, grammar, parent = element;
  
        while (parent && !lang.test(parent.className)) {
          parent = parent.parentNode;
        }
  
        if (parent) {
          language = (parent.className.match(lang) || [,''])[1];
          grammar = _.languages[language];
        }
  
        // Set language on the element, if not present
        element.className = element.className.replace(lang, '').replace(/\s+/g, ' ') + ' language-' + language;
  
        // Set language on the parent, for styling
        parent = element.parentNode;
  
        if (/pre/i.test(parent.nodeName)) {
          parent.className = parent.className.replace(lang, '').replace(/\s+/g, ' ') + ' language-' + language;
        }
  
        var code = element.textContent;
  
        var env = {
          element: element,
          language: language,
          grammar: grammar,
          code: code
        };
  
        if (!code || !grammar) {
          _.hooks.run('complete', env);
          return;
        }
  
        _.hooks.run('before-highlight', env);
  
        if (async && _self.Worker) {
          var worker = new Worker(_.filename);
  
          worker.onmessage = function(evt) {
            env.highlightedCode = evt.data;
  
            _.hooks.run('before-insert', env);
  
            env.element.innerHTML = env.highlightedCode;
  
            callback && callback.call(env.element);
            _.hooks.run('after-highlight', env);
            _.hooks.run('complete', env);
          };
  
          worker.postMessage(JSON.stringify({
            language: env.language,
            code: env.code,
            immediateClose: true
          }));
        }
        else {
          env.highlightedCode = _.highlight(env.code, env.grammar, env.language);
  
          _.hooks.run('before-insert', env);
  
          env.element.innerHTML = env.highlightedCode;
  
          callback && callback.call(element);
  
          _.hooks.run('after-highlight', env);
          _.hooks.run('complete', env);
        }
      },
  
      highlight: function (text, grammar, language) {
        var tokens = _.tokenize(text, grammar);
        return Token.stringify(_.util.encode(tokens), language);
      },
  
      tokenize: function(text, grammar, language) {
        var Token = _.Token;
  
        var strarr = [text];
  
        var rest = grammar.rest;
  
        if (rest) {
          for (var token in rest) {
            grammar[token] = rest[token];
          }
  
          delete grammar.rest;
        }
  
        tokenloop: for (var token in grammar) {
          if(!grammar.hasOwnProperty(token) || !grammar[token]) {
            continue;
          }
  
          var patterns = grammar[token];
          patterns = (_.util.type(patterns) === "Array") ? patterns : [patterns];
  
          for (var j = 0; j < patterns.length; ++j) {
            var pattern = patterns[j],
              inside = pattern.inside,
              lookbehind = !!pattern.lookbehind,
              lookbehindLength = 0,
              alias = pattern.alias;
  
            pattern = pattern.pattern || pattern;
  
            for (var i=0; i<strarr.length; i++) { // Don’t cache length as it changes during the loop
  
              var str = strarr[i];
  
              if (strarr.length > text.length) {
                // Something went terribly wrong, ABORT, ABORT!
                break tokenloop;
              }
  
              if (str instanceof Token) {
                continue;
              }
  
              pattern.lastIndex = 0;
  
              var match = pattern.exec(str);
  
              if (match) {
                if(lookbehind) {
                  lookbehindLength = match[1].length;
                }
  
                var from = match.index - 1 + lookbehindLength,
                  match = match[0].slice(lookbehindLength),
                  len = match.length,
                  to = from + len,
                  before = str.slice(0, from + 1),
                  after = str.slice(to + 1);
  
                var args = [i, 1];
  
                if (before) {
                  args.push(before);
                }
  
                var wrapped = new Token(token, inside? _.tokenize(match, inside) : match, alias);
  
                args.push(wrapped);
  
                if (after) {
                  args.push(after);
                }
  
                Array.prototype.splice.apply(strarr, args);
              }
            }
          }
        }
  
        return strarr;
      },
  
      hooks: {
        all: {},
  
        add: function (name, callback) {
          var hooks = _.hooks.all;
  
          hooks[name] = hooks[name] || [];
  
          hooks[name].push(callback);
        },
  
        run: function (name, env) {
          var callbacks = _.hooks.all[name];
  
          if (!callbacks || !callbacks.length) {
            return;
          }
  
          for (var i=0, callback; callback = callbacks[i++];) {
            callback(env);
          }
        }
      }
    };
  
    var Token = _.Token = function(type, content, alias) {
      this.type = type;
      this.content = content;
      this.alias = alias;
    };
  
    Token.stringify = function(o, language, parent) {
      if (typeof o == 'string') {
        return o;
      }
  
      if (_.util.type(o) === 'Array') {
        return o.map(function(element) {
          return Token.stringify(element, language, o);
        }).join('');
      }
  
      var env = {
        type: o.type,
        content: Token.stringify(o.content, language, parent),
        tag: 'span',
        classes: ['token', o.type],
        attributes: {},
        language: language,
        parent: parent
      };
  
      if (env.type == 'comment') {
        env.attributes['spellcheck'] = 'true';
      }
  
      if (o.alias) {
        var aliases = _.util.type(o.alias) === 'Array' ? o.alias : [o.alias];
        Array.prototype.push.apply(env.classes, aliases);
      }
  
      _.hooks.run('wrap', env);
  
      var attributes = '';
  
      for (var name in env.attributes) {
        attributes += (attributes ? ' ' : '') + name + '="' + (env.attributes[name] || '') + '"';
      }
  
      return '<' + env.tag + ' class="' + env.classes.join(' ') + '" ' + attributes + '>' + env.content + '</' + env.tag + '>';
  
    };
  
    return _self.Prism;
  })();
  
  /* **********************************************
   Begin prism-markup.js
   ********************************************** */
  
  Prism.languages.markup = {
    'comment': /<!--[\w\W]*?-->/,
    'prolog': /<\?[\w\W]+?\?>/,
    'doctype': /<!DOCTYPE[\w\W]+?>/,
    'cdata': /<!\[CDATA\[[\w\W]*?]]>/i,
    'tag': {
      pattern: /<\/?[^\s>\/=.]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\\1|\\?(?!\1)[\w\W])*\1|[^\s'">=]+))?)*\s*\/?>/i,
      inside: {
        'tag': {
          pattern: /^<\/?[^\s>\/]+/i,
          inside: {
            'punctuation': /^<\/?/,
            'namespace': /^[^\s>\/:]+:/
          }
        },
        'attr-value': {
          pattern: /=(?:('|")[\w\W]*?(\1)|[^\s>]+)/i,
          inside: {
            'punctuation': /[=>"']/
          }
        },
        'punctuation': /\/?>/,
        'attr-name': {
          pattern: /[^\s>\/]+/,
          inside: {
            'namespace': /^[^\s>\/:]+:/
          }
        }
  
      }
    },
    'entity': /&#?[\da-z]{1,8};/i
  };
  
  // Plugin to make entity title show the real entity, idea by Roman Komarov
  Prism.hooks.add('wrap', function(env) {
  
    if (env.type === 'entity') {
      env.attributes['title'] = env.content.replace(/&amp;/, '&');
    }
  });
  
  Prism.languages.xml = Prism.languages.markup;
  Prism.languages.html = Prism.languages.markup;
  Prism.languages.mathml = Prism.languages.markup;
  Prism.languages.svg = Prism.languages.markup;
  
  
  /* **********************************************
   Begin prism-css.js
   ********************************************** */
  
  Prism.languages.css = {
    'comment': /\/\*[\w\W]*?\*\//,
    'atrule': {
      pattern: /@[\w-]+?.*?(;|(?=\s*\{))/i,
      inside: {
        'rule': /@[\w-]+/
        // See rest below
      }
    },
    'url': /url\((?:(["'])(\\(?:\r\n|[\w\W])|(?!\1)[^\\\r\n])*\1|.*?)\)/i,
    'selector': /[^\{\}\s][^\{\};]*?(?=\s*\{)/,
    'string': /("|')(\\(?:\r\n|[\w\W])|(?!\1)[^\\\r\n])*\1/,
    'property': /(\b|\B)[\w-]+(?=\s*:)/i,
    'important': /\B!important\b/i,
    'function': /[-a-z0-9]+(?=\()/i,
    'punctuation': /[(){};:]/
  };
  
  Prism.languages.css['atrule'].inside.rest = Prism.util.clone(Prism.languages.css);
  
  if (Prism.languages.markup) {
    Prism.languages.insertBefore('markup', 'tag', {
      'style': {
        pattern: /(<style[\w\W]*?>)[\w\W]*?(?=<\/style>)/i,
        lookbehind: true,
        inside: Prism.languages.css,
        alias: 'language-css'
      }
    });
  
    Prism.languages.insertBefore('inside', 'attr-value', {
      'style-attr': {
        pattern: /\s*style=("|').*?\1/i,
        inside: {
          'attr-name': {
            pattern: /^\s*style/i,
            inside: Prism.languages.markup.tag.inside
          },
          'punctuation': /^\s*=\s*['"]|['"]\s*$/,
          'attr-value': {
            pattern: /.+/i,
            inside: Prism.languages.css
          }
        },
        alias: 'language-css'
      }
    }, Prism.languages.markup.tag);
  }
  
  /* **********************************************
   Begin prism-clike.js
   ********************************************** */
  
  Prism.languages.clike = {
    'comment': [
      {
        pattern: /(^|[^\\])\/\*[\w\W]*?\*\//,
        lookbehind: true
      },
      {
        pattern: /(^|[^\\:])\/\/.*/,
        lookbehind: true
      }
    ],
    'string': /(["'])(\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
    'class-name': {
      pattern: /((?:\b(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[a-z0-9_\.\\]+/i,
      lookbehind: true,
      inside: {
        punctuation: /(\.|\\)/
      }
    },
    'keyword': /\b(if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,
    'boolean': /\b(true|false)\b/,
    'function': /[a-z0-9_]+(?=\()/i,
    'number': /\b-?(?:0x[\da-f]+|\d*\.?\d+(?:e[+-]?\d+)?)\b/i,
    'operator': /--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/,
    'punctuation': /[{}[\];(),.:]/
  };
  
  
  /* **********************************************
   Begin prism-javascript.js
   ********************************************** */
  
  Prism.languages.javascript = Prism.languages.extend('clike', {
    'keyword': /\b(as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|var|void|while|with|yield)\b/,
    'number': /\b-?(0x[\dA-Fa-f]+|0b[01]+|0o[0-7]+|\d*\.?\d+([Ee][+-]?\d+)?|NaN|Infinity)\b/,
    // Allow for all non-ASCII characters (See http://stackoverflow.com/a/2008444)
    'function': /[_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*(?=\()/i
  });
  
  Prism.languages.insertBefore('javascript', 'keyword', {
    'regex': {
      pattern: /(^|[^/])\/(?!\/)(\[.+?]|\\.|[^/\\\r\n])+\/[gimyu]{0,5}(?=\s*($|[\r\n,.;})]))/,
      lookbehind: true
    }
  });
  
  Prism.languages.insertBefore('javascript', 'class-name', {
    'template-string': {
      pattern: /`(?:\\`|\\?[^`])*`/,
      inside: {
        'interpolation': {
          pattern: /\$\{[^}]+\}/,
          inside: {
            'interpolation-punctuation': {
              pattern: /^\$\{|\}$/,
              alias: 'punctuation'
            },
            rest: Prism.languages.javascript
          }
        },
        'string': /[\s\S]+/
      }
    }
  });
  
  if (Prism.languages.markup) {
    Prism.languages.insertBefore('markup', 'tag', {
      'script': {
        pattern: /(<script[\w\W]*?>)[\w\W]*?(?=<\/script>)/i,
        lookbehind: true,
        inside: Prism.languages.javascript,
        alias: 'language-javascript'
      }
    });
  }
  
  Prism.languages.js = Prism.languages.javascript;
  
  // https://github.com/PrismJS/prism/blob/gh-pages/plugins/line-numbers/prism-line-numbers.js
  Prism.plugins.lineNumbers = function(text) {
    var match = text.match(/\n(?!$)/g);
    var linesNum = match ? match.length + 1 : 1;
    var lines = new Array(linesNum + 1);
  
    lines = lines.join('<span></span>');
  
    return `<span class="line-numbers-rows">${lines}</span>`;
  };
  
  Prism.amtHighlight = function(options) {
    var classNames = 'prism ';
    var {
      text,
      language,
      ln
      } = options;
  
    if (language === 'js' || language === 'javascript') {
      language = 'jsx'
    }
  
    var grammar = Prism.languages[language];
    var langClassName = `language-${grammar ? language : 'unknown'}`;
    var highlightedCode;
  
    if (grammar) {
      highlightedCode = Prism.highlight(text, grammar);
    }
  
    if (ln) {
      highlightedCode += Prism.plugins.lineNumbers(text);
      classNames += 'line-numbers '
    }
  
    return `<pre class="${classNames} ${langClassName}"><code class="prism ${langClassName}">${highlightedCode}</code></pre>`;
  };
  
  // language and plugins
  import prismBash from './prism-bash';
  import prismJSX from  './prism-jsx';
  import prismSass from './prism-sass';
  
  prismBash(Prism);
  prismJSX(Prism);
  prismSass(Prism);
  
  export default Prism;
  