/*
Syntax highlighting with language autodetection.
http://softwaremaniacs.org/soft/highlight/
*/

var hljs = new function() {
  var LANGUAGES = {}
  var selected_languages = {};

  function escape(value) {
    return value.replace(/&/gm, '&amp;').replace(/</gm, '&lt;').replace(/>/gm, '&gt;');
  }

  function contains(array, item) {
    if (!array)
      return false;
    for (var i = 0; i < array.length; i++)
      if (array[i] == item)
        return true;
    return false;
  }

  function highlight(language_name, value) {
    function compileSubModes(mode, language) {
      mode.sub_modes = [];
      for (var i = 0; i < mode.contains.length; i++) {
        for (var j = 0; j < language.modes.length; j++) {
          if (language.modes[j].className == mode.contains[i]) {
            mode.sub_modes[mode.sub_modes.length] = language.modes[j];
          }
        }
      }
    }

    function subMode(lexem, mode) {
      if (!mode.contains) {
        return null;
      }
      if (!mode.sub_modes) {
        compileSubModes(mode, language);
      }
      for (var i = 0; i < mode.sub_modes.length; i++) {
        if (mode.sub_modes[i].beginRe.test(lexem)) {
          return mode.sub_modes[i];
        }
      }
      return null;
    }

    function endOfMode(mode_index, lexem) {
      if (modes[mode_index].end && modes[mode_index].endRe.test(lexem))
        return 1;
      if (modes[mode_index].endsWithParent) {
        var level = endOfMode(mode_index - 1, lexem);
        return level ? level + 1 : 0;
      }
      return 0;
    }

    function isIllegal(lexem, mode) {
      return mode.illegalRe && mode.illegalRe.test(lexem);
    }

    function compileTerminators(mode, language) {
      var terminators = [];

      function addTerminator(re) {
        if (!contains(terminators, re)) {
          terminators[terminators.length] = re;
        }
      }

      if (mode.contains)
        for (var i = 0; i < language.modes.length; i++) {
          if (contains(mode.contains, language.modes[i].className)) {
            addTerminator(language.modes[i].begin);
          }
        }

      var index = modes.length - 1;
      do {
        if (modes[index].end) {
          addTerminator(modes[index].end);
        }
        index--;
      } while (modes[index + 1].endsWithParent);

      if (mode.illegal) {
        addTerminator(mode.illegal);
      }

      var terminator_re = '(' + terminators[0];
      for (var i = 0; i < terminators.length; i++)
        terminator_re += '|' + terminators[i];
      terminator_re += ')';
      return langRe(language, terminator_re);
    }

    function eatModeChunk(value, index) {
      var mode = modes[modes.length - 1];
      if (!mode.terminators) {
        mode.terminators = compileTerminators(mode, language);
      }
      value = value.substr(index);
      var match = mode.terminators.exec(value);
      if (!match)
        return [value, '', true];
      if (match.index == 0)
        return ['', match[0], false];
      else
        return [value.substr(0, match.index), match[0], false];
    }

    function keywordMatch(mode, match) {
      var match_str = language.case_insensitive ? match[0].toLowerCase() : match[0]
      for (var className in mode.keywordGroups) {
        if (!mode.keywordGroups.hasOwnProperty(className))
          continue;
        var value = mode.keywordGroups[className].hasOwnProperty(match_str);
        if (value)
          return [className, value];
      }
      return false;
    }

    function processKeywords(buffer, mode) {
      if (!mode.keywords || !mode.lexems)
        return escape(buffer);
      if (!mode.lexemsRe) {
        var lexems_re = '(' + mode.lexems[0];
        for (var i = 1; i < mode.lexems.length; i++)
          lexems_re += '|' + mode.lexems[i];
        lexems_re += ')';
        mode.lexemsRe = langRe(language, lexems_re, true);
      }
      var result = '';
      var last_index = 0;
      mode.lexemsRe.lastIndex = 0;
      var match = mode.lexemsRe.exec(buffer);
      while (match) {
        result += escape(buffer.substr(last_index, match.index - last_index));
        var keyword_match = keywordMatch(mode, match);
        if (keyword_match) {
          keyword_count += keyword_match[1];
          result += '<span class="'+ keyword_match[0] +'">' + escape(match[0]) + '</span>';
        } else {
          result += escape(match[0]);
        }
        last_index = mode.lexemsRe.lastIndex;
        match = mode.lexemsRe.exec(buffer);
      }
      result += escape(buffer.substr(last_index, buffer.length - last_index));
      return result;
    }

    function processBuffer(buffer, mode) {
      if (mode.subLanguage && selected_languages[mode.subLanguage]) {
        var result = highlight(mode.subLanguage, buffer);
        keyword_count += result.keyword_count;
        relevance += result.relevance;
        return result.value;
      } else {
        return processKeywords(buffer, mode);
      }
    }

    function startNewMode(mode, lexem) {
      var markup = mode.noMarkup?'':'<span class="' + mode.className + '">';
      if (mode.returnBegin) {
        result += markup;
        mode.buffer = '';
      } else if (mode.excludeBegin) {
        result += escape(lexem) + markup;
        mode.buffer = '';
      } else {
        result += markup;
        mode.buffer = lexem;
      }
      modes[modes.length] = mode;
    }

    function processModeInfo(buffer, lexem, end) {
      var current_mode = modes[modes.length - 1];
      if (end) {
        result += processBuffer(current_mode.buffer + buffer, current_mode);
        return false;
      }

      var new_mode = subMode(lexem, current_mode);
      if (new_mode) {
        result += processBuffer(current_mode.buffer + buffer, current_mode);
        startNewMode(new_mode, lexem);
        relevance += new_mode.relevance;
        return new_mode.returnBegin;
      }

      var end_level = endOfMode(modes.length - 1, lexem);
      if (end_level) {
        var markup = current_mode.noMarkup?'':'</span>';
        if (current_mode.returnEnd) {
          result += processBuffer(current_mode.buffer + buffer, current_mode) + markup;
        } else if (current_mode.excludeEnd) {
          result += processBuffer(current_mode.buffer + buffer, current_mode) + markup + escape(lexem);
        } else {
          result += processBuffer(current_mode.buffer + buffer + lexem, current_mode) + markup;
        }
        while (end_level > 1) {
          markup = modes[modes.length - 2].noMarkup?'':'</span>';
          result += markup;
          end_level--;
          modes.length--;
        }
        modes.length--;
        modes[modes.length - 1].buffer = '';
        if (current_mode.starts) {
          for (var i = 0; i < language.modes.length; i++) {
            if (language.modes[i].className == current_mode.starts) {
              startNewMode(language.modes[i], '');
              break;
            }
          }
        }
        return current_mode.returnEnd;
      }

      if (isIllegal(lexem, current_mode))
        throw 'Illegal';
    }

    var language = LANGUAGES[language_name];
    var modes = [language.defaultMode];
    var relevance = 0;
    var keyword_count = 0;
    var result = '';
    try {
      var index = 0;
      language.defaultMode.buffer = '';
      do {
        var mode_info = eatModeChunk(value, index);
        var return_lexem = processModeInfo(mode_info[0], mode_info[1], mode_info[2]);
        index += mode_info[0].length;
        if (!return_lexem) {
          index += mode_info[1].length;
        }
      } while (!mode_info[2]);
      if(modes.length > 1)
        throw 'Illegal';
      return {
        relevance: relevance,
        keyword_count: keyword_count,
        value: result
      }
    } catch (e) {
      if (e == 'Illegal') {
        return {
          relevance: 0,
          keyword_count: 0,
          value: escape(value)
        }
      } else {
        throw e;
      }
    }
  }

  function blockText(block) {
    var result = '';
    for (var i = 0; i < block.childNodes.length; i++)
      if (block.childNodes[i].nodeType == 3)
        result += block.childNodes[i].nodeValue;
      else if (block.childNodes[i].nodeName == 'BR')
        result += '\n';
      else
        result += blockText(block.childNodes[i]);
    return result;
  }

  function blockLanguage(block) {
    var classes = block.className.split(/\s+/)
    classes = classes.concat(block.parentNode.className.split(/\s+/));
    for (var i = 0; i < classes.length; i++) {
      var class_ = classes[i].replace(/^language-/, '');
      if (class_ == 'no-highlight') {
        throw 'No highlight'
      }
      if (LANGUAGES[class_]) {
        return class_;
      }
    }
  }

  function nodeStream(node) {
    var result = [];
    (function (node, offset) {
      for (var i = 0; i < node.childNodes.length; i++) {
        if (node.childNodes[i].nodeType == 3)
          offset += node.childNodes[i].nodeValue.length;
        else if (node.childNodes[i].nodeName == 'BR')
          offset += 1
        else {
          result.push({
            event: 'start',
            offset: offset,
            node: node.childNodes[i]
          });
          offset = arguments.callee(node.childNodes[i], offset)
          result.push({
            event: 'stop',
            offset: offset,
            node: node.childNodes[i]
          });
        }
      }
      return offset;
    })(node, 0);
    return result;
  }

  function mergeStreams(stream1, stream2, value) {
    var processed = 0;
    var result = '';
    var nodeStack = [];

    function selectStream() {
      if (stream1.length && stream2.length) {
        if (stream1[0].offset != stream2[0].offset)
          return (stream1[0].offset < stream2[0].offset) ? stream1 : stream2;
        else
          return (stream1[0].event == 'start' && stream2[0].event == 'stop') ? stream2 : stream1;
      } else {
        return stream1.length ? stream1 : stream2;
      }
    }

    function open(node) {
      var result = '<' + node.nodeName.toLowerCase();
      for (var i = 0; i < node.attributes.length; i++) {
        result += ' ' + node.attributes[i].nodeName.toLowerCase()  + '="' + escape(node.attributes[i].nodeValue) + '"';
      }
      return result + '>';
    }

    function close(node) {
      return '</' + node.nodeName.toLowerCase() + '>';
    }

    while (stream1.length || stream2.length) {
      var current = selectStream().splice(0, 1)[0];
      result += escape(value.substr(processed, current.offset - processed));
      processed = current.offset;
      if ( current.event == 'start') {
        result += open(current.node);
        nodeStack.push(current.node);
      } else if (current.event == 'stop') {
        var i = nodeStack.length;
        do {
          i--;
          var node = nodeStack[i];
          result += close(node);
        } while (node != current.node);
        nodeStack.splice(i, 1);
        while (i < nodeStack.length) {
          result += open(nodeStack[i]);
          i++;
        }
      }
    }
    result += value.substr(processed);
    return result;
  }

  function highlightBlock(block, tabReplace) {
    try {
      var text = blockText(block);
      var language = blockLanguage(block);
    } catch (e) {
      if (e == 'No highlight')
        return;
    }

    if (language) {
      var result = highlight(language, text).value;
    } else {
      var max_relevance = 0;
      for (var key in selected_languages) {
        if (!selected_languages.hasOwnProperty(key))
          continue;
        var lang_result = highlight(key, text);
        var relevance = lang_result.keyword_count + lang_result.relevance;
        if (relevance > max_relevance) {
          max_relevance = relevance;
          var result = lang_result.value;
          language = key;
        }
      }
    }

    if (result) {
      if (tabReplace) {
        result = result.replace(/^(\t+)/gm, function(match, p1, offset, s) {
          return p1.replace(/\t/g, tabReplace);
        })
      }
      var class_name = block.className;
      if (!class_name.match(language)) {
        class_name += ' ' + language;
      }
      var original = nodeStream(block);
      if (original.length) {
        var pre = document.createElement('pre');
        pre.innerHTML = result;
        result = mergeStreams(original, nodeStream(pre), text);
      }
      // See these 4 lines? This is IE's notion of "block.innerHTML = result". Love this browser :-/
      var container = document.createElement('div');
      container.innerHTML = '<pre><code class="' + class_name + '">' + result + '</code></pre>';
      var environment = block.parentNode.parentNode;
      environment.replaceChild(container.firstChild, block.parentNode);
    }
  }

  function langRe(language, value, global) {
    var mode =  'm' + (language.case_insensitive ? 'i' : '') + (global ? 'g' : '');
    return new RegExp(value, mode);
  }

  function compileModes() {
    for (var i in LANGUAGES) {
      if (!LANGUAGES.hasOwnProperty(i))
        continue;
      var language = LANGUAGES[i];
      for (var j = 0; j < language.modes.length; j++) {
        if (language.modes[j].begin)
          language.modes[j].beginRe = langRe(language, '^' + language.modes[j].begin);
        if (language.modes[j].end)
          language.modes[j].endRe = langRe(language, '^' + language.modes[j].end);
        if (language.modes[j].illegal)
          language.modes[j].illegalRe = langRe(language, '^(?:' + language.modes[j].illegal + ')');
        language.defaultMode.illegalRe = langRe(language, '^(?:' + language.defaultMode.illegal + ')');
        if (language.modes[j].relevance == undefined) {
          language.modes[j].relevance = 1;
        }
      }
    }
  }

  function compileKeywords() {

    function compileModeKeywords(mode) {
      if (!mode.keywordGroups) {
        for (var key in mode.keywords) {
          if (!mode.keywords.hasOwnProperty(key))
            continue;
          if (mode.keywords[key] instanceof Object)
            mode.keywordGroups = mode.keywords;
          else
            mode.keywordGroups = {'keyword': mode.keywords};
          break;
        }
      }
    }

    for (var i in LANGUAGES) {
      if (!LANGUAGES.hasOwnProperty(i))
        continue;
      var language = LANGUAGES[i];
      compileModeKeywords(language.defaultMode);
      for (var j = 0; j < language.modes.length; j++) {
        compileModeKeywords(language.modes[j]);
      }
    }
  }

  function findCode(pre) {
    for (var i = 0; i < pre.childNodes.length; i++) {
      node = pre.childNodes[i];
      if (node.nodeName == 'CODE')
        return node;
      if (!(node.nodeType == 3 && node.nodeValue.match(/\s+/)))
        return null;
    }
  }

  function initHighlighting() {
    if (initHighlighting.called)
      return;
    initHighlighting.called = true;
    compileModes();
    compileKeywords();
    if (arguments.length) {
      for (var i = 0; i < arguments.length; i++) {
        if (LANGUAGES[arguments[i]]) {
          selected_languages[arguments[i]] = LANGUAGES[arguments[i]];
        }
      }
    } else
      selected_languages = LANGUAGES;
    var pres = document.getElementsByTagName('pre');
    for (var i = 0; i < pres.length; i++) {
      var code = findCode(pres[i]);
      if (code)
        highlightBlock(code, hljs.tabReplace);
    }
  }

  function initHighlightingOnLoad() {
    var original_arguments = arguments;
    var handler = function(){initHighlighting.apply(null, original_arguments)};
    if (window.addEventListener) {
      window.addEventListener('DOMContentLoaded', handler, false);
      window.addEventListener('load', handler, false);
    } else if (window.attachEvent)
      window.attachEvent('onload', handler);
    else
      window.onload = handler;
  }

  this.LANGUAGES = LANGUAGES;
  this.initHighlightingOnLoad = initHighlightingOnLoad;
  this.highlightBlock = highlightBlock;
  this.initHighlighting = initHighlighting;

  // Common regexps
  this.IDENT_RE = '[a-zA-Z][a-zA-Z0-9_]*';
  this.UNDERSCORE_IDENT_RE = '[a-zA-Z_][a-zA-Z0-9_]*';
  this.NUMBER_RE = '\\b\\d+(\\.\\d+)?';
  this.C_NUMBER_RE = '\\b(0x[A-Za-z0-9]+|\\d+(\\.\\d+)?)';
  this.RE_STARTERS_RE = '!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|\\.|-|-=|/|/=|:|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~';

  // Common modes
  this.APOS_STRING_MODE = {
    className: 'string',
    begin: '\'', end: '\'',
    illegal: '\\n',
    contains: ['escape'],
    relevance: 0
  };
  this.QUOTE_STRING_MODE = {
    className: 'string',
    begin: '"', end: '"',
    illegal: '\\n',
    contains: ['escape'],
    relevance: 0
  };
  this.BACKSLASH_ESCAPE = {
    className: 'escape',
    begin: '\\\\.', end: '^', noMarkup: true,
    relevance: 0
  };
  this.C_LINE_COMMENT_MODE = {
    className: 'comment',
    begin: '//', end: '$',
    relevance: 0
  };
  this.C_BLOCK_COMMENT_MODE = {
    className: 'comment',
    begin: '/\\*', end: '\\*/'
  };
  this.HASH_COMMENT_MODE = {
    className: 'comment',
    begin: '#', end: '$'
  };
  this.C_NUMBER_MODE = {
    className: 'number',
    begin: this.C_NUMBER_RE, end: '^',
    relevance: 0
  };
}();

var initHighlightingOnLoad = hljs.initHighlightingOnLoad;

/*
Language: Apache
Author: Ruslan Keba <rukeba@gmail.com>
Website: http://rukeba.com/
Description: language definition for Apache configuration files (httpd.conf & .htaccess)
Version 1.1
Date: 2008-12-27
*/

hljs.LANGUAGES.apache =
{
  case_insensitive: true,
  defaultMode: {
    lexems: [hljs.IDENT_RE],
    contains: ['comment', 'sqbracket', 'cbracket', 'number', 'tag'],
    keywords: {
      'keyword': {
        'acceptfilter': 1,
        'acceptmutex': 1,
        'acceptpathinfo': 1,
        'accessfilename': 1,
        'action': 1,
        'addalt': 1,
        'addaltbyencoding': 1,
        'addaltbytype': 1,
        'addcharset': 1,
        'adddefaultcharset': 1,
        'adddescription': 1,
        'addencoding': 1,
        'addhandler': 1,
        'addicon': 1,
        'addiconbyencoding': 1,
        'addiconbytype': 1,
        'addinputfilter': 1,
        'addlanguage': 1,
        'addmoduleinfo': 1,
        'addoutputfilter': 1,
        'addoutputfilterbytype': 1,
        'addtype': 1,
        'alias': 1,
        'aliasmatch': 1,
        'allow': 2,
        'allowconnect': 1,
        'allowencodedslashes': 1,
        'allowoverride': 1,
        'anonymous': 1,
        'anonymous_logemail': 1,
        'anonymous_mustgiveemail': 1,
        'anonymous_nouserid': 1,
        'anonymous_verifyemail': 1,
        'authbasicauthoritative': 1,
        'authbasicprovider': 1,
        'authdbduserpwquery': 1,
        'authdbduserrealmquery': 1,
        'authdbmgroupfile': 1,
        'authdbmtype': 1,
        'authdbmuserfile': 1,
        'authdefaultauthoritative': 1,
        'authdigestalgorithm': 1,
        'authdigestdomain': 1,
        'authdigestnccheck': 1,
        'authdigestnonceformat': 1,
        'authdigestnoncelifetime': 1,
        'authdigestprovider': 1,
        'authdigestqop': 1,
        'authdigestshmemsize': 1,
        'authgroupfile': 1,
        'authldapbinddn': 1,
        'authldapbindpassword': 1,
        'authldapcharsetconfig': 1,
        'authldapcomparednonserver': 1,
        'authldapdereferencealiases': 1,
        'authldapgroupattribute': 1,
        'authldapgroupattributeisdn': 1,
        'authldapremoteuserattribute': 1,
        'authldapremoteuserisdn': 1,
        'authldapurl': 1,
        'authname': 1,
        'authnprovideralias': 1,
        'authtype': 1,
        'authuserfile': 1,
        'authzdbmauthoritative': 1,
        'authzdbmtype': 1,
        'authzdefaultauthoritative': 1,
        'authzgroupfileauthoritative': 1,
        'authzldapauthoritative': 1,
        'authzownerauthoritative': 1,
        'authzuserauthoritative': 1,
        'balancermember': 1,
        'browsermatch': 1,
        'browsermatchnocase': 1,
        'bufferedlogs': 1,
        'cachedebugheader': 2,
        'cachedefaultexpire': 1,
        'cachedirlength': 1,
        'cachedirlevels': 1,
        'cachedisable': 1,
        'cacheenable': 1,
        'cachefile': 1,
        'cacheignorecachecontrol': 1,
        'cacheignoreheaders': 1,
        'cacheignorenolastmod': 1,
        'cacheignorequerystring': 1,
        'cachelastmodifiedfactor': 1,
        'cachemaxexpire': 1,
        'cachemaxfilesize': 1,
        'cacheminfilesize': 1,
        'cachenegotiateddocs': 1,
        'cacheroot': 1,
        'cachestorenostore': 1,
        'cachestoreprivate': 1,
        'cachevarybyheaders': 1,
        'cachevarybyparams': 1,
        'cgimapextension': 1,
        'charsetdefault': 1,
        'charsetoptions': 1,
        'charsetsourceenc': 1,
        'checkcaseonly': 1,
        'checkspelling': 1,
        'checkbasename': 1,
        'chrootdir': 1,
        'contentdigest': 1,
        'cookiedomain': 1,
        'cookieexpires': 1,
        'cookielog': 1,
        'cookiename': 1,
        'cookiestyle': 1,
        'cookietracking': 1,
        'coredumpdirectory': 1,
        'customlog': 1,
        'dav': 1,
        'davdepthinfinity': 1,
        'davgenericlockdb': 1,
        'davlockdb': 1,
        'davmintimeout': 1,
        'dbdexptime': 1,
        'dbdkeep': 1,
        'dbdmax': 1,
        'dbdmin': 1,
        'dbdparams': 2,
        'dbdpersist': 1,
        'dbdpreparesql': 1,
        'dbdriver': 2,
        'defaulticon': 1,
        'defaultlanguage': 1,
        'defaulttype': 1,
        'deflatebuffersize': 1,
        'deflatecompressionlevel': 1,
        'deflatefilternote': 1,
        'deflatememlevel': 1,
        'deflatewindowsize': 1,
        'deny': 1,
        'directoryindex': 1,
        'directorymatch': 1,
        'directoryslash': 1,
        'documentroot': 1,
        'doshashtablesize': 1,
        'doswhitelist': 1,
        'dospagecount': 1,
        'dossitecount': 1,
        'dospageinterval': 1,
        'dossiteinterval': 1,
        'dosblockingperiod': 1,
        'dosclosesocket': 1,
        'dossystemcommand': 1,
        'dumpioinput': 1,
        'dumpiologlevel': 1,
        'dumpiooutput': 1,
        'enableexceptionhook': 1,
        'enablemmap': 1,
        'enablesendfile': 1,
        'errordocument': 1,
        'errorlog': 2,
        /*'example': 1,*/
        'expiresactive': 2,
        'expiresbytype': 2,
        'expiresdefault': 2,
        'extendedstatus': 1,
        'extfilterdefine': 1,
        'extfilteroptions': 1,
        'fileetag': 1,
        'filterchain': 1,
        'filterdeclare': 1,
        'filterprotocol': 1,
        'filterprovider': 1,
        'filtertrace': 1,
        'forcelanguagepriority': 1,
        'forcetype': 1,
        'forensiclog': 1,
        'freesites': 1,
        'gracefulshutdowntimeout': 1,
        'group': 1,
        'header': 2,
        'headername': 1,
        'headerreplacepattern': 2,
        'hostnamelookups': 1,
        'identitycheck': 1,
        'identitychecktimeout': 1,
        'imapbase': 1,
        'imapdefault': 1,
        'imapmenu': 1,
        'include': 1,
        'indexheadinsert': 1,
        'indexignore': 1,
        'indexoptions': 1,
        'indexorderdefault': 1,
        'indexstylesheet': 1,
        'isapiappendlogtoerrors': 1,
        'isapiappendlogtoquery': 1,
        'isapicachefile': 1,
        'isapifakeasync': 1,
        'isapilognotsupported': 1,
        'isapireadaheadbuffer': 1,
        'keepalive': 1,
        'keepalivetimeout': 1,
        'languagepriority': 1,
        'ldapcacheentries': 1,
        'ldapcachettl': 1,
        'ldapconnectiontimeout': 1,
        'ldapopcacheentries': 1,
        'ldapopcachettl': 1,
        'ldapsharedcachefile': 1,
        'ldapsharedcachesize': 1,
        'ldaptrustedclientcert': 1,
        'ldaptrustedglobalcert': 1,
        'ldaptrustedmode': 1,
        'ldapverifyservercert': 1,
        'limitinternalrecursion': 1,
        'limitrequestbody': 1,
        'limitrequestfields': 1,
        'limitrequestfieldsize': 1,
        'limitrequestline': 1,
        'limitxmlrequestbody': 1,
        'listen': 1,
        'listenbacklog': 1,
        'loadfile': 1,
        'loadmodule': 1,
        'lockfile': 1,
        'logformat': 2,
        'loglevel': 2,
        'maxclients': 1,
        'maxkeepaliverequests': 1,
        'maxmemfree': 1,
        'maxrequestsperchild': 1,
        'maxrequestsperthread': 1,
        'maxspareservers': 1,
        'maxsparethreads': 1,
        'maxthreads': 1,
        'mcachemaxobjectcount': 1,
        'mcachemaxobjectsize': 1,
        'mcachemaxstreamingbuffer': 1,
        'mcacheminobjectsize': 1,
        'mcacheremovalalgorithm': 1,
        'mcachesize': 1,
        'metadir': 1,
        'metafiles': 1,
        'metasuffix': 1,
        'mimemagicfile': 1,
        'minspareservers': 1,
        'minsparethreads': 1,
        'mmapfile': 1,
        'mod_gzip_on': 5, 
        'mod_gzip_add_header_count': 1, 
        'mod_gzip_compression_level': 2, 
        'mod_gzip_keep_workfiles': 1,
        'mod_gzip_dechunk': 1,
        'mod_gzip_min_http': 1,
        'mod_gzip_minimum_file_size': 1,
        'mod_gzip_maximum_file_size': 1,
        'mod_gzip_maximum_inmem_size': 1,
        'mod_gzip_temp_dir': 1,
        'mod_gzip_item_include': 1,
        'mod_gzip_item_exclude': 1,
        'mod_gzip_command_version': 1,
        'mod_gzip_can_negotiate': 1,
        'mod_gzip_handle_methods': 1,
        'mod_gzip_static_suffix': 1,
        'mod_gzip_send_vary': 1,
        'mod_gzip_update_static': 1,
        'modmimeusepathinfo': 1,
        'multiviewsmatch': 1,
        'namevirtualhost': 1,
        'noproxy': 1,
        'nwssltrustedcerts': 1,
        'nwsslupgradeable': 1,
        'options': 1,
        'order': 1,
        'passenv': 1,
        'pidfile': 1,
        'protocolecho': 1,
        'proxybadheader': 1,
        'proxyblock': 1,
        'proxydomain': 1,
        'proxyerroroverride': 1,
        'proxyftpdircharset': 1,
        'proxyiobuffersize': 1,
        'proxymaxforwards': 1,
        'proxypass': 2,
        'proxypassinterpolateenv': 1,
        'proxypassmatch': 1,
        'proxypassreverse': 1,
        'proxypassreversecookiedomain': 1,
        'proxypassreversecookiepath': 1,
        'proxypreservehost': 1,
        'proxyreceivebuffersize': 1,
        'proxyremote': 1,
        'proxyremotematch': 1,
        'proxyrequests': 1,
        'proxyset': 1,
        'proxystatus': 1,
        'proxytimeout': 1,
        'proxyvia': 1,
        'readmename': 1,
        'receivebuffersize': 1,
        'redirect': 1,
        'redirectmatch': 1,
        'redirectpermanent': 1,
        'redirecttemp': 1,
        'registrationname': 3,
        'registrationcode': 3,
        'removecharset': 1,
        'removeencoding': 1,
        'removehandler': 1,
        'removeinputfilter': 1,
        'removelanguage': 1,
        'removeoutputfilter': 1,
        'removetype': 1,
        'replacefilterdefine' : 2,
        'replacepattern': 2,
        'requestheader': 1,
        'require': 2,
        'rewritebase': 1,
        'rewritecond': 10,
        'rewriteengine': 1,
        'rewriteheader': 1,
        'rewritelock': 1,
        'rewritelog': 1,
        'rewriteloglevel': 1,
        'rewritemap': 1,
        'rewriteoptions': 1,
        'rewriterule': 10,
        'rewriteproxy': 2,
        'rlimitcpu': 1,
        'rlimitmem': 1,
        'rlimitnproc': 1,
        'satisfy': 1,
        'scoreboardfile': 1,
        'script': 1,
        'scriptalias': 1,
        'scriptaliasmatch': 1,
        'scriptinterpretersource': 1,
        'scriptlog': 1,
        'scriptlogbuffer': 1,
        'scriptloglength': 1,
        'scriptsock': 1,
        'securelisten': 1,
        'seerequesttail': 1,
        'sendbuffersize': 1,
        'serveradmin': 1,
        'serveralias': 1,
        'serverlimit': 1,
        'servername': 1,
        'serverpath': 1,
        'serverroot': 1,
        'serversignature': 1,
        'servertokens': 1,
        'setenv': 1,
        'setenvif': 1,
        'setenvifnocase': 1,
        'sethandler': 1,
        'setinputfilter': 1,
        'setoutputfilter': 1,
        'seorule': 1,
        'ssienableaccess': 1,
        'ssiendtag': 1,
        'ssierrormsg': 1,
        'ssistarttag': 1,
        'ssitimeformat': 1,
        'ssiundefinedecho': 1,
        'sslcacertificatefile': 1,
        'sslcacertificatepath': 1,
        'sslcadnrequestfile': 1,
        'sslcadnrequestpath': 1,
        'sslcarevocationfile': 1,
        'sslcarevocationpath': 1,
        'sslcertificatechainfile': 1,
        'sslcertificatefile': 1,
        'sslcertificatekeyfile': 1,
        'sslciphersuite': 1,
        'sslcryptodevice': 1,
        'sslengine': 1,
        'sslhonorciperorder': 1,
        'sslmutex': 1,
        'ssloptions': 1,
        'sslpassphrasedialog': 1,
        'sslprotocol': 1,
        'sslproxycacertificatefile': 1,
        'sslproxycacertificatepath': 1,
        'sslproxycarevocationfile': 1,
        'sslproxycarevocationpath': 1,
        'sslproxyciphersuite': 1,
        'sslproxyengine': 1,
        'sslproxymachinecertificatefile': 1,
        'sslproxymachinecertificatepath': 1,
        'sslproxyprotocol': 1,
        'sslproxyverify': 1,
        'sslproxyverifydepth': 1,
        'sslrandomseed': 1,
        'sslrequire': 1,
        'sslrequiressl': 1,
        'sslsessioncache': 1,
        'sslsessioncachetimeout': 1,
        'sslusername': 1,
        'sslverifyclient': 1,
        'sslverifydepth': 1,
        'startservers': 1,
        'startthreads': 1,
        'substitute': 1,
        'suexecusergroup': 1,
        'threadlimit': 1,
        'threadsperchild': 1,
        'threadstacksize': 1,
        'timeout': 1,
        'traceenable': 1,
        'transferlog': 1,
        'typesconfig': 1,
        'unsetenv': 1,
        'usecanonicalname': 1,
        'usecanonicalphysicalport': 1,
        /*'user': 1,*/
        'userdir': 1,
        'virtualdocumentroot': 1,
        'virtualdocumentrootip': 1,
        'virtualscriptalias': 1,
        'virtualscriptaliasip': 1,
        'win32disableacceptex': 1,
        'xbithack': 1,
        /*mod_hotlink*/
        'hotlinkinvolveip': 1,
        'hotlinkexpires': 1,
        'hotlinkprotect': 1,
        'hotlinksignature': 1,
        'hotlinktype': 1,
        'hotlinkerror': 1,
        'hotlinkallow': 1,
        'hotlinkdeny': 1,
        /* mod_linkfreeze */
        'linkfreezeengine': 1,
        'linkfreezepagesizelimit': 1,
        'linkfreezerule': 1
      },
      'literal': {'on': 1, 'off': 1}
    }
  },
  modes: [
    hljs.HASH_COMMENT_MODE,
    {
      /* TODO: check tag content: Location, Files, VirtualHost, ... */
      className: 'tag',
      begin: '</?', end: '>'
    },
    {
      className: 'sqbracket',
      begin: '\\s\\[', end: '\\]'
    },
    {
      className: 'cbracket',
      begin: '[\\$%]\\{', end: '\\}',
      contains: ['cbracket', 'number']
    },
    {
      className: 'number',
      begin: '[\\$%]\\d+', end: '^'
    },
    hljs.BACKSLASH_ESCAPE
  ]
};




/*
Language: HTML, XML
*/

hljs.XML_COMMENT = {
  className: 'comment',
  begin: '<!--', end: '-->'
};
hljs.XML_ATTR = {
  className: 'attribute',
  begin: '\\s[a-zA-Z\\:-]+=', end: '^',
  contains: ['value']
};
hljs.XML_VALUE_QUOT = {
  className: 'value',
  begin: '"', end: '"'
};
hljs.XML_VALUE_APOS = {
  className: 'value',
  begin: '\'', end: '\''
};


hljs.LANGUAGES.xml = {
  defaultMode: {
    contains: ['pi', 'comment', 'cdata', 'tag']
  },
  case_insensitive: true,
  modes: [
    {
      className: 'pi',
      begin: '<\\?', end: '\\?>',
      relevance: 10
    },
    hljs.XML_COMMENT,
    {
      className: 'cdata',
      begin: '<\\!\\[CDATA\\[', end: '\\]\\]>'
    },
    {
      className: 'tag',
      begin: '</?', end: '>',
      contains: ['title', 'tag_internal'],
      relevance: 1.5
    },
    {
      className: 'title',
      begin: '[A-Za-z:_][A-Za-z0-9\\._:-]+', end: '^',
      relevance: 0
    },
    {
      className: 'tag_internal',
      begin: '^', endsWithParent: true, noMarkup: true,
      contains: ['attribute'],
      relevance: 0,
      illegal: '[\\+\\.]'
    },
    hljs.XML_ATTR,
    hljs.XML_VALUE_QUOT,
    hljs.XML_VALUE_APOS
  ]
};

hljs.HTML_TAGS = {'code': 1, 'kbd': 1, 'font': 1, 'noscript': 1, 'style': 1, 'img': 1, 'title': 1, 'menu': 1, 'tt': 1, 'tr': 1, 'param': 1, 'li': 1, 'tfoot': 1, 'th': 1, 'input': 1, 'td': 1, 'dl': 1, 'blockquote': 1, 'fieldset': 1, 'big': 1, 'dd': 1, 'abbr': 1, 'optgroup': 1, 'dt': 1, 'button': 1, 'isindex': 1, 'p': 1, 'small': 1, 'div': 1, 'dir': 1, 'em': 1, 'frame': 1, 'meta': 1, 'sub': 1, 'bdo': 1, 'label': 1, 'acronym': 1, 'sup': 1, 'body': 1, 'xml': 1, 'basefont': 1, 'base': 1, 'br': 1, 'address': 1, 'strong': 1, 'legend': 1, 'ol': 1, 'script': 1, 'caption': 1, 's': 1, 'col': 1, 'h2': 1, 'h3': 1, 'h1': 1, 'h6': 1, 'h4': 1, 'h5': 1, 'table': 1, 'select': 1, 'noframes': 1, 'span': 1, 'area': 1, 'dfn': 1, 'strike': 1, 'cite': 1, 'thead': 1, 'head': 1, 'option': 1, 'form': 1, 'hr': 1, 'var': 1, 'link': 1, 'b': 1, 'colgroup': 1, 'ul': 1, 'applet': 1, 'del': 1, 'iframe': 1, 'pre': 1, 'frameset': 1, 'ins': 1, 'tbody': 1, 'html': 1, 'samp': 1, 'map': 1, 'object': 1, 'a': 1, 'xmlns': 1, 'center': 1, 'textarea': 1, 'i': 1, 'q': 1, 'u': 1};
hljs.HTML_DOCTYPE = {
  className: 'doctype',
  begin: '<!DOCTYPE', end: '>',
  relevance: 10
};
hljs.HTML_ATTR = {
  className: 'attribute',
  begin: '\\s[a-zA-Z\\:-]+=', end: '^',
  contains: ['value']
};
hljs.HTML_SHORT_ATTR = {
  className: 'attribute',
  begin: ' [a-zA-Z]+', end: '^'
};
hljs.HTML_VALUE = {
  className: 'value',
  begin: '[a-zA-Z0-9]+', end: '^'
};

hljs.LANGUAGES.html = {
  defaultMode: {
    contains: ['tag', 'comment', 'doctype', 'vbscript']
  },
  case_insensitive: true,
  modes: [
    hljs.XML_COMMENT,
    hljs.HTML_DOCTYPE,
    {
      className: 'tag',
      lexems: [hljs.IDENT_RE],
      keywords: hljs.HTML_TAGS,
      begin: '<style', end: '>',
      contains: ['attribute'],
      illegal: '[\\+\\.]',
      starts: 'css'
    },
    {
      className: 'tag',
      lexems: [hljs.IDENT_RE],
      keywords: hljs.HTML_TAGS,
      begin: '<script', end: '>',
      contains: ['attribute'],
      illegal: '[\\+\\.]',
      starts: 'javascript'
    },
    {
      className: 'tag',
      lexems: [hljs.IDENT_RE],
      keywords: hljs.HTML_TAGS,
      begin: '<[A-Za-z/]', end: '>',
      contains: ['attribute'],
      illegal: '[\\+\\.]'
    },
    {
      className: 'css',
      end: '</style>', returnEnd: true,
      subLanguage: 'css'
    },
    {
      className: 'javascript',
      end: '</script>', returnEnd: true,
      subLanguage: 'javascript'
    },
    hljs.HTML_ATTR,
    hljs.HTML_SHORT_ATTR,
    hljs.XML_VALUE_QUOT,
    hljs.XML_VALUE_APOS,
    hljs.HTML_VALUE,
    {
      className: 'vbscript',
      begin: '<%', end: '%>',
      subLanguage: 'vbscript'
    }
  ]
};




/*
Language: Javascript
*/

hljs.LANGUAGES.javascript = {
  defaultMode: {
    lexems: [hljs.UNDERSCORE_IDENT_RE],
    contains: ['string', 'comment', 'number', 'regexp_container', 'function'],
    keywords: {
      'keyword': {'in': 1, 'if': 1, 'for': 1, 'while': 1, 'finally': 1, 'var': 1, 'new': 1, 'function': 1, 'do': 1, 'return': 1, 'void': 1, 'else': 1, 'break': 1, 'catch': 1, 'instanceof': 1, 'with': 1, 'throw': 1, 'case': 1, 'default': 1, 'try': 1, 'this': 1, 'switch': 1, 'continue': 1, 'typeof': 1, 'delete': 1},
      'literal': {'true': 1, 'false': 1, 'null': 1}
    }
  },
  modes: [
    hljs.C_LINE_COMMENT_MODE,
    hljs.C_BLOCK_COMMENT_MODE,
    hljs.C_NUMBER_MODE,
    hljs.APOS_STRING_MODE,
    hljs.QUOTE_STRING_MODE,
    hljs.BACKSLASH_ESCAPE,
    {
      className: 'regexp_container',
      begin: '(' + hljs.RE_STARTERS_RE + '|case|return|throw)\\s*', end: '^', noMarkup: true,
      lexems: [hljs.IDENT_RE],
      keywords: {'return': 1, 'throw': 1, 'case': 1},
      contains: ['comment', 'regexp'],
      relevance: 0
    },
    {
      className: 'regexp',
      begin: '/.*?[^\\\\/]/[gim]*', end: '^'
    },
    {
      className: 'function',
      begin: '\\bfunction\\b', end: '{',
      lexems: [hljs.UNDERSCORE_IDENT_RE],
      keywords: {'function': 1},
      contains: ['title', 'params']
    },
    {
      className: 'title',
      begin: '[A-Za-z$_][0-9A-Za-z$_]*', end: '^'
    },
    {
      className: 'params',
      begin: '\\(', end: '\\)',
      contains: ['string', 'comment']
    }
  ]
};



/*
Language: Http
Author: Ruslan Keba <rukeba@gmail.com>
Website: http://rukeba.com/
Description: language definition for HyperText Transport Protocol
Version 1.0
Date: 2010-05-12
*/

hljs.LANGUAGES.http =
{
  case_insensitive: false,
  defaultMode: {
    contains: ['header', 'http_request', 'http_status_line']
  },
  modes: [
    {
      className: 'http_request',
      begin: '^(?:HEAD|GET|POST|PUT|DELETE|TRACE|OPTIONS|CONNECT|PATCH) ', end: '$',
      returnBegin: true,
      relevance: 10,
      contains: ['title']
    },
    {
      className: 'http_status_line',
      begin: '^HTTP/', end: '$',
      returnBegin: true,
      relevance: 10,
      contains: ['title']
    },
    {
      className: 'title',
      begin: '^', endsWithParent: true
    },
    {
      className: 'header',
      begin: '^[\\w_-]+[ \\t]*\\:', end: '$',
      returnBegin: true,
      contains: ['keyword']
    },
    {
      className: 'keyword',
      begin: '^\\w',
      end: ':'
    }
  ]
};
