update; format python/html
authorShane Jaroch <chown_tee@proton.me>
Thu, 15 Jan 2026 17:53:42 +0000 (12:53 -0500)
committerShane Jaroch <chown_tee@proton.me>
Thu, 15 Jan 2026 17:56:03 +0000 (12:56 -0500)
Makefile
etc/gitweb.conf
etc/nginx/conf.d/git-http.conf
scripts/gen_services_map.py [new file with mode: 0644]
scripts/gitweb-simplefrontend/assets/fix-logo.css [new file with mode: 0644]
scripts/gitweb-simplefrontend/indextext.html
scripts/gitweb-simplefrontend/services.html [new file with mode: 0644]
scripts/gitweb-simplefrontend/theme/gitweb.css

index c5d341bb484663a6e184fa63300f583df7a08d38..de4d8cefd08ff879d33242aaa1268df5cf453708 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -43,6 +43,7 @@ VPS := $(VPS_USER)@$(VPS_HOST)
 .PHONY: stage/nginx
 stage/nginx: ##H @Remote Stage files on the remote VPS
        @echo "Staging files on $(VPS_HOST)..."
+       python3 scripts/gen_services_map.py
        ssh $(VPS) 'rm -rf ~/.nginx-staging && mkdir -p ~/.nginx-staging/etc/nginx/conf.d ~/.nginx-staging/scripts/gitweb-simplefrontend'
        scp -q -r etc/nginx/conf.d/*.conf $(VPS):~/.nginx-staging/etc/nginx/conf.d/
        scp -q etc/gitweb.conf $(VPS):~/.nginx-staging/etc/gitweb.conf
index c85dd9309a9da4247ebde8b0058956cebd88e4d7..5e8313dc78e258b5818d734f92b23f566ac66783 100644 (file)
@@ -21,7 +21,7 @@ $favicon = "/v1/static/git-favicon.png";
 if ($version eq 'v2') {
     $site_name = "Nutra Git (v2)";
     $home_text = "indextext.html";
-    @stylesheets = ("/v2/theme/gitweb.css");
+    @stylesheets = ("/v2/theme/gitweb.css", "/v2/assets/fix-logo.css");
     $javascript = "/v2/static/gitweb.js";
     $logo = "/v2/assets/git-favicon.png";
     $favicon = "/v2/assets/git-favicon.png";
index a81fa14342e30c6a2ae93a2683a97011157fb8a8..1f872e201a554e67430140b279555efe5be2ae90 100644 (file)
@@ -22,6 +22,14 @@ server {
     # Common Git Root
     set $git_root /srv/git;
 
+    # ----------------------------------------------------------------------
+    # Site Map
+    # ----------------------------------------------------------------------
+    location = /services {
+        alias /srv/git/services.html;
+        default_type text/html;
+    }
+
     # ----------------------------------------------------------------------
     # Root Redirect -> v1
     # ----------------------------------------------------------------------
@@ -96,39 +104,18 @@ server {
     }
 
     # ----------------------------------------------------------------------
-    # Version 3: Current Implementation (Full Custom)
+    # Version 3: Gitea (Proxy to localhost:3000)
     # ----------------------------------------------------------------------
-
-    # Custom Theme/Assets Aliases for v3
-    location ^~ /v3/theme/ {
-        alias /srv/git/theme/;
-    }
-    location ^~ /v3/assets/ {
-        alias /srv/git/assets/;
-    }
-    location ^~ /v3/static/ {
-        alias /usr/share/gitweb/static/;
-    }
-
-    # Git Smart HTTP Backend (v3)
-    location ~ ^/v3/git(/.*)$ {
-        include /etc/nginx/fastcgi_params;
-        fastcgi_param SCRIPT_FILENAME /usr/lib/git-core/git-http-backend;
-        fastcgi_param GIT_PROJECT_ROOT $git_root;
-        fastcgi_param GIT_HTTP_EXPORT_ALL "1";
-        fastcgi_param PATH_INFO $1;
-        fastcgi_param REMOTE_USER $remote_user;
-        fastcgi_pass unix:/var/run/fcgiwrap.socket;
+    location = /admin {
+        return 302 /v3/admin;
     }
 
-    # Gitweb UI (v3)
-    location ~ ^/v3(/.*)?$ {
-        include /etc/nginx/fastcgi_params;
-        fastcgi_param SCRIPT_FILENAME /usr/share/gitweb/gitweb.cgi;
-        fastcgi_param PATH_INFO $1;
-        fastcgi_param GITWEB_CONFIG /etc/gitweb.conf;
-        fastcgi_param GITWEB_VERSION "v3";
-        fastcgi_pass unix:/var/run/fcgiwrap.socket;
+    location /v3/ {
+        proxy_pass http://localhost:3000/;
+        proxy_set_header Host $host;
+        proxy_set_header X-Real-IP $remote_addr;
+        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+        proxy_set_header X-Forwarded-Proto $scheme;
     }
 }
 
diff --git a/scripts/gen_services_map.py b/scripts/gen_services_map.py
new file mode 100644 (file)
index 0000000..39067a1
--- /dev/null
@@ -0,0 +1,100 @@
+#!/usr/bin/env python3
+import re
+import os
+from pathlib import Path
+
+# Paths relative to repo root
+REPO_ROOT = Path(__file__).parent.parent
+NGINX_CONF = REPO_ROOT / "etc/nginx/conf.d/git-http.conf"
+OUTPUT_HTML = REPO_ROOT / "scripts/gitweb-simplefrontend/services.html"
+
+HTML_TEMPLATE = """<!DOCTYPE html>
+<html>
+<head>
+    <title>NutraTech Git Services</title>
+    <style>
+        body {{ font-family: sans-serif; max-width: 800px; margin: 2rem auto; line-height: 1.6; padding: 0 1rem; color: #333; }}
+        h1 {{ border-bottom: 2px solid #eee; padding-bottom: 0.5rem; }}
+        .service {{ margin-bottom: 1.5rem; padding: 1.5rem; border: 1px solid #ddd; border-radius: 8px; background: #f9f9f9; }}
+        .service:hover {{ background: #fff; box-shadow: 0 2px 5px rgba(0,0,0,0.1); border-color: #ccc; }}
+        .service h2 {{ margin-top: 0; margin-bottom: 0.5rem; }}
+        .service a {{ text-decoration: none; color: #0066cc; }}
+        .service a:hover {{ text-decoration: underline; }}
+        .desc {{ margin-bottom: 0.5rem; }}
+        .meta {{ font-size: 0.85em; color: #666; }}
+        .tag {{ display: inline-block; padding: 2px 8px; background: #e0e0e0; border-radius: 12px; font-size: 0.8em; margin-right: 0.5rem; color: #444; }}
+    </style>
+</head>
+<body>
+    <h1>Git Services Map</h1>
+    <p class="meta">Generated automatically from Nginx configuration.</p>
+    
+    {services_html}
+    
+</body>
+</html>"""
+
+
+def parse_nginx_config():
+    services = []
+
+    if not NGINX_CONF.exists():
+        print(f"Error: Could not find config at {NGINX_CONF}")
+        return []
+
+    # Regex to find "Version X: Description" lines
+    # Matches: # Version 1: Original Gitweb (Standard)
+    version_pattern = re.compile(r"^\s*#\s*Version\s+(\w+):\s*(.+)$", re.MULTILINE)
+
+    with open(NGINX_CONF, "r") as f:
+        content = f.read()
+
+        matches = version_pattern.findall(content)
+        for version_id, description in matches:
+            # Clean up version ID (e.g., '1' -> 'v1')
+            if not version_id.startswith("v"):
+                vid = f"v{version_id}"
+            else:
+                vid = version_id
+
+            services.append(
+                {"id": vid, "url": f"/{vid}", "description": description.strip()}
+            )
+
+    return services
+
+
+def generate_html(services):
+    services_html = ""
+
+    for s in services:
+        services_html += f"""
+    <div class="service">
+        <h2><a href="{s['url']}">{s['url']}</a></h2>
+        <div class="desc">{s['description']}</div>
+    </div>"""
+
+    return HTML_TEMPLATE.format(services_html=services_html)
+
+
+def main():
+    print(f"Reading config from: {NGINX_CONF}")
+    services = parse_nginx_config()
+
+    if not services:
+        print("No services found!")
+        return
+
+    print(f"Found {len(services)} services: {[s['id'] for s in services]}")
+
+    html_content = generate_html(services)
+
+    os.makedirs(OUTPUT_HTML.parent, exist_ok=True)
+    with open(OUTPUT_HTML, "w") as f:
+        f.write(html_content)
+
+    print(f"Generated site map at: {OUTPUT_HTML}")
+
+
+if __name__ == "__main__":
+    main()
diff --git a/scripts/gitweb-simplefrontend/assets/fix-logo.css b/scripts/gitweb-simplefrontend/assets/fix-logo.css
new file mode 100644 (file)
index 0000000..13dc9bd
--- /dev/null
@@ -0,0 +1,8 @@
+/* Fix Logo Aspect Ratio (Gitweb defaults to 72x27, squashing square icons) */
+img.logo {
+    width: auto !important;
+    height: 32px !important;
+    position: relative !important;
+    top: -4px !important; /* Force it up */
+    vertical-align: middle !important;
+}
index f5106575560b83ede62720ea5b7598e1bfbb18b6..b9b9bbb0abdfceb33f9f27d8b28037298c0ced9a 100644 (file)
@@ -1,4 +1,4 @@
-<div style="text-align: center; margin: 2rem;">
+<div style="text-align: center; margin: 2rem">
     <h1>Welcome to NutraTech Git</h1>
     <p>Please browse our repositories below.</p>
 </div>
diff --git a/scripts/gitweb-simplefrontend/services.html b/scripts/gitweb-simplefrontend/services.html
new file mode 100644 (file)
index 0000000..bb3a59a
--- /dev/null
@@ -0,0 +1,76 @@
+<!doctype html>
+<html>
+    <head>
+        <title>NutraTech Git Services</title>
+        <style>
+            body {
+                font-family: sans-serif;
+                max-width: 800px;
+                margin: 2rem auto;
+                line-height: 1.6;
+                padding: 0 1rem;
+                color: #333;
+            }
+            h1 {
+                border-bottom: 2px solid #eee;
+                padding-bottom: 0.5rem;
+            }
+            .service {
+                margin-bottom: 1.5rem;
+                padding: 1.5rem;
+                border: 1px solid #ddd;
+                border-radius: 8px;
+                background: #f9f9f9;
+            }
+            .service:hover {
+                background: #fff;
+                box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
+                border-color: #ccc;
+            }
+            .service h2 {
+                margin-top: 0;
+                margin-bottom: 0.5rem;
+            }
+            .service a {
+                text-decoration: none;
+                color: #0066cc;
+            }
+            .service a:hover {
+                text-decoration: underline;
+            }
+            .desc {
+                margin-bottom: 0.5rem;
+            }
+            .meta {
+                font-size: 0.85em;
+                color: #666;
+            }
+            .tag {
+                display: inline-block;
+                padding: 2px 8px;
+                background: #e0e0e0;
+                border-radius: 12px;
+                font-size: 0.8em;
+                margin-right: 0.5rem;
+                color: #444;
+            }
+        </style>
+    </head>
+    <body>
+        <h1>Git Services Map</h1>
+        <p class="meta">Generated automatically from Nginx configuration.</p>
+
+        <div class="service">
+            <h2><a href="/v1">/v1</a></h2>
+            <div class="desc">Original Gitweb (Standard)</div>
+        </div>
+        <div class="service">
+            <h2><a href="/v2">/v2</a></h2>
+            <div class="desc">Simple Frontend (Theme only)</div>
+        </div>
+        <div class="service">
+            <h2><a href="/v3">/v3</a></h2>
+            <div class="desc">Gitea (Proxy to localhost:3000)</div>
+        </div>
+    </body>
+</html>
index 65458debdce033f6389fe9eb5451fb45ff716b63..e6e0cb4f33704a6c3764132ebdf6a01f9bf0479c 100644 (file)
 /* Based on http://meyerweb.com/eric/tools/css/reset/ */
 /* v1.0 | 20080212 */
 
-html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p,
-blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em,
-font, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b,
-u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table,
-caption, tbody, tfoot, thead, tr, th, td {
-  margin: 0;
-  padding: 0;
-  border: 0;
-  outline: 0;
-  font-size: 100%;
-  vertical-align: baseline;
-  background: transparent;
+html,
+body,
+div,
+span,
+applet,
+object,
+iframe,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+p,
+blockquote,
+pre,
+a,
+abbr,
+acronym,
+address,
+big,
+cite,
+code,
+del,
+dfn,
+em,
+font,
+img,
+ins,
+kbd,
+q,
+s,
+samp,
+small,
+strike,
+strong,
+sub,
+sup,
+tt,
+var,
+b,
+u,
+i,
+center,
+dl,
+dt,
+dd,
+ol,
+ul,
+li,
+fieldset,
+form,
+label,
+legend,
+table,
+caption,
+tbody,
+tfoot,
+thead,
+tr,
+th,
+td {
+    margin: 0;
+    padding: 0;
+    border: 0;
+    outline: 0;
+    font-size: 100%;
+    vertical-align: baseline;
+    background: transparent;
+}
+
+ol,
+ul {
+    list-style: none;
+}
+
+blockquote,
+q {
+    quotes: none;
+}
+
+blockquote:before,
+blockquote:after,
+q:before,
+q:after {
+    content: "";
+    content: none;
+}
+
+:focus {
+    outline: 0;
+}
+
+ins {
+    text-decoration: none;
+}
+
+del {
+    text-decoration: line-through;
 }
 
-ol, ul { list-style: none; }
-
-blockquote, q { quotes: none; }
-
-blockquote:before, blockquote:after,
-q:before, q:after {
-  content: '';
-  content: none;
-}
-
-:focus { outline: 0; }
-
-ins { text-decoration: none; }
-
-del { text-decoration: line-through; }
-
 table {
-  border-collapse: collapse;
-  border-spacing: 0;
+    border-collapse: collapse;
+    border-spacing: 0;
 }
 
-a { outline: none; }
+a {
+    outline: none;
+}
 
 /* General
 ---------------------------------------------------------------------------- */
 
 html {
-  position: relative;
-  min-height: 100%;
+    position: relative;
+    min-height: 100%;
 }
 
 body {
-  font: 13px Helvetica,arial,freesans,clean,sans-serif;
-  line-height: 1.4;
-  margin: 0 0 105px;
-  background-color: #fff;
-  color: #000000;
+    font:
+        13px Helvetica,
+        arial,
+        freesans,
+        clean,
+        sans-serif;
+    line-height: 1.4;
+    margin: 0 0 105px;
+    background-color: #fff;
+    color: #000000;
 }
 
 /* Monospaced Fonts */
-.sha1, .mode, .diff_tree .list, .pre, .diff, .patchset {
-  font-family: 'Consolas','Bitstream Vera Sans Mono',monospace;
+.sha1,
+.mode,
+.diff_tree .list,
+.pre,
+.diff,
+.patchset {
+    font-family: "Consolas", "Bitstream Vera Sans Mono", monospace;
 }
 
-a:link, a:visited {
-  color: #4183C4;
-  text-decoration: none;
+a:link,
+a:visited {
+    color: #4183c4;
+    text-decoration: none;
 }
 
 a:hover {
-  text-decoration: underline;
+    text-decoration: underline;
 }
 
-td.list a[href*='tree'], td.list a[href*='blob'] {
-  padding-left: 20px;
-  display: block;
-  float: left;
-  height: 16px;
-  line-height: 16px;
+td.list a[href*="tree"],
+td.list a[href*="blob"] {
+    padding-left: 20px;
+    display: block;
+    float: left;
+    height: 16px;
+    line-height: 16px;
 }
 
-td.list a[href*='tree'] {
-  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABq0lEQVQ4y8WTu4oUQRSGv+rtGVuxhwVFdFEEE2c3d0HYTEMTn8DEVxADQTDUF9DMwMxQMBMx8AEWzRQ3cBHd9TI91+2urjq/QbczY2IygSep4nD+79yqnCRWsYQVbWVACvDh5ZXdrLe15dwyT1TjT/sxFFeB6i+VA2B6+cb7kAI4Jf0LO087zjlQI8Y5Qvnj0sHug321XoC1bk+K9eHk6+s7wPMUgKAS88eqb4+Jfg2SHs7lZBvX2Nh+2EUCDGSAcMnJsx9f7NxfAGqXyDzRd5EJO/pMPT1gcviGTnYOVIN5pAAE8v7dLrKL8xnglFk4ws9Afko9HpH3b5Gd2mwb/lOBmgrSdYhJugDUCenxM6xv3p4HCsP8F0LxCsUhCkMURihOyM7fg0osASTFEpu9a4LjGIUCqwcoDiEUrX+E4hRUQb20RiokC1j9vckUhygU7X3QZh7NAVKYL7YBeMkRUfjVCotF2XGIwnghtrJpMywB5G0QZj9P1JNujuWJ1AHLQadRrACPkuZ0SSSWpeStWgDK6tHek5vbiOs48n++XQHurcf0rFng//6NvwG+iB9/4duaTgAAAABJRU5ErkJgggo=) center left no-repeat;
+td.list a[href*="tree"] {
+    background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABq0lEQVQ4y8WTu4oUQRSGv+rtGVuxhwVFdFEEE2c3d0HYTEMTn8DEVxADQTDUF9DMwMxQMBMx8AEWzRQ3cBHd9TI91+2urjq/QbczY2IygSep4nD+79yqnCRWsYQVbWVACvDh5ZXdrLe15dwyT1TjT/sxFFeB6i+VA2B6+cb7kAI4Jf0LO087zjlQI8Y5Qvnj0sHug321XoC1bk+K9eHk6+s7wPMUgKAS88eqb4+Jfg2SHs7lZBvX2Nh+2EUCDGSAcMnJsx9f7NxfAGqXyDzRd5EJO/pMPT1gcviGTnYOVIN5pAAE8v7dLrKL8xnglFk4ws9Afko9HpH3b5Gd2mwb/lOBmgrSdYhJugDUCenxM6xv3p4HCsP8F0LxCsUhCkMURihOyM7fg0osASTFEpu9a4LjGIUCqwcoDiEUrX+E4hRUQb20RiokC1j9vckUhygU7X3QZh7NAVKYL7YBeMkRUfjVCotF2XGIwnghtrJpMywB5G0QZj9P1JNujuWJ1AHLQadRrACPkuZ0SSSWpeStWgDK6tHek5vbiOs48n++XQHurcf0rFng//6NvwG+iB9/4duaTgAAAABJRU5ErkJgggo=)
+        center left no-repeat;
 }
 
-td.list a[href*='blob'] {
-  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAA6ElEQVQoFQXBMW5TQRgGwNnHnoE0QbiCjoIooUmTU3AuS1BwIoTSUdJBigg3GCWOg9/++zHTop078wIAsPMrE4SL5/1aIyMjIyMjz/m0tbFECFdrPeaQQw75mz/5nZH7fN7aWILmauSYfznmmIfss8vIUx7zZWsTTXM5vpWvTk5Wq9VHQP/gtgOLa0Qpw940vAQdaG6thpOhlOkG0AEuAVGmEkAH+G4YSikxXQM6wDsAMRFAB/ihDNNUmN4DOsAbBAEAdICfpmmaAt4COoj2GgCASbIkZh1NAACznhQt2itnFgAAlF3u/gMDtJXPzQxoswAAAABJRU5ErkJgggo=) center left no-repeat;
+td.list a[href*="blob"] {
+    background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAA6ElEQVQoFQXBMW5TQRgGwNnHnoE0QbiCjoIooUmTU3AuS1BwIoTSUdJBigg3GCWOg9/++zHTop078wIAsPMrE4SL5/1aIyMjIyMjz/m0tbFECFdrPeaQQw75mz/5nZH7fN7aWILmauSYfznmmIfss8vIUx7zZWsTTXM5vpWvTk5Wq9VHQP/gtgOLa0Qpw940vAQdaG6thpOhlOkG0AEuAVGmEkAH+G4YSikxXQM6wDsAMRFAB/ihDNNUmN4DOsAbBAEAdICfpmmaAt4COoj2GgCASbIkZh1NAACznhQt2itnFgAAlF3u/gMDtJXPzQxoswAAAABJRU5ErkJgggo=)
+        center left no-repeat;
 }
 
 i {
-  font-style: normal;
+    font-style: normal;
 }
 
-td, th {
-  padding: 5px;
+td,
+th {
+    padding: 5px;
 }
 
 .page_nav br {
-  display: none;
+    display: none;
 }
 
 #generating_info {
-  font-size: 10px;
-  color: #aaa;
-  text-align: center;
+    font-size: 10px;
+    color: #aaa;
+    text-align: center;
 }
 
-#generating_time, #generating_cmd {
-  font-weight: bold;
+#generating_time,
+#generating_cmd {
+    font-weight: bold;
 }
 
 /* Page Header
 ---------------------------------------------------------------------------- */
 
 .page_header {
-  height: 50px;
-  line-height: 50px;
-  position: relative;
-  padding: 0 27px;
-  margin-bottom: 20px;
-  font-size: 20px;
-  font-family: Helvetica, Arial, Freesans, Clean, sans-serif;
-  background: #FFFFFF; /* old browsers */
-  background: -moz-linear-gradient(top, #FFFFFF 0%, #F5F5F5 100%); /* firefox */
-  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#FFFFFF), color-stop(100%,#F5F5F5)); /* webkit */
-  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#FFFFFF', endColorstr='#F5F5F5',GradientType=0 ); /* ie */
-  background: -o-linear-gradient(top, #FFFFFF 0%, #F5F5F5 100%);
-  border-bottom: 1px solid #dfdfdf;
-}
-
-.page_header a:link, .page_header a:visited {
-  color: #4183C4;
-  text-decoration: none;
-  padding: 3px;
-  font-weight: bold;
+    height: 50px;
+    line-height: 50px;
+    position: relative;
+    padding: 0 27px;
+    margin-bottom: 20px;
+    font-size: 20px;
+    font-family: Helvetica, Arial, Freesans, Clean, sans-serif;
+    background: #ffffff; /* old browsers */
+    background: -moz-linear-gradient(top, #ffffff 0%, #f5f5f5 100%); /* firefox */
+    background: -webkit-gradient(
+        linear,
+        left top,
+        left bottom,
+        color-stop(0%, #ffffff),
+        color-stop(100%, #f5f5f5)
+    ); /* webkit */
+    filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#FFFFFF', endColorstr='#F5F5F5',GradientType=0 ); /* ie */
+    background: -o-linear-gradient(top, #ffffff 0%, #f5f5f5 100%);
+    border-bottom: 1px solid #dfdfdf;
+}
+
+.page_header a:link,
+.page_header a:visited {
+    color: #4183c4;
+    text-decoration: none;
+    padding: 3px;
+    font-weight: bold;
 }
 
 .page_header a:hover {
-  font-weight: bold;
-  padding: 3px;
-  text-decoration: underline;
+    font-weight: bold;
+    padding: 3px;
+    text-decoration: underline;
 }
 
 .page_header a:first-child {
-  background: transparent;
+    background: transparent;
 }
 
 .page_header img.logo {
-  position: relative;
-  top: 7px;
-  margin-right: 5px;
+    position: relative;
+    top: 7px;
+    margin-right: 5px;
 }
 
 /* Page Footer
 ---------------------------------------------------------------------------- */
 
 .page_footer {
-  position: absolute;
-  left: 0;
-  bottom: 0;
-  width: 100%;
-  height: 80px;
-  line-height: 80px;
-  margin-top: 15px;
-  background: #f1f1f1;
-  border-top: 2px solid #ddd;
-  border-bottom: 1px solid #ddd;
+    position: absolute;
+    left: 0;
+    bottom: 0;
+    width: 100%;
+    height: 80px;
+    line-height: 80px;
+    margin-top: 15px;
+    background: #f1f1f1;
+    border-top: 2px solid #ddd;
+    border-bottom: 1px solid #ddd;
 }
 
 .page_footer_text {
-  color: #666;
-  display: inline;
-  float: left;
-  margin-left: 25px;
-  width: 80%;
-  overflow: hidden;
-  white-space: nowrap;
-  text-overflow: ellipsis;
+    color: #666;
+    display: inline;
+    float: left;
+    margin-left: 25px;
+    width: 80%;
+    overflow: hidden;
+    white-space: nowrap;
+    text-overflow: ellipsis;
 }
 
 a.rss_logo {
-  float: right;
-  padding: 3px 1px;
-  width: 35px;
-  line-height: 10px;
-  border: 1px solid;
-  border-color: #fcc7a5 #7d3302 #3e1a01 #ff954e;
-  color: #ffffff;
-  background-color: #ff6600;
-  font-weight: bold;
-  font-family: sans-serif;
-  font-size: 80%;
-  text-align: center;
-  text-decoration: none;
-  margin-top: 30px;
-  margin-left: 5px;
+    float: right;
+    padding: 3px 1px;
+    width: 35px;
+    line-height: 10px;
+    border: 1px solid;
+    border-color: #fcc7a5 #7d3302 #3e1a01 #ff954e;
+    color: #ffffff;
+    background-color: #ff6600;
+    font-weight: bold;
+    font-family: sans-serif;
+    font-size: 80%;
+    text-align: center;
+    text-decoration: none;
+    margin-top: 30px;
+    margin-left: 5px;
 }
 
 a.rss_logo:hover {
-  background-color: #ee5500;
+    background-color: #ee5500;
 }
 
 .rss_logo {
-  margin-right: 25px;
-  background: yellow;
+    margin-right: 25px;
+    background: yellow;
 }
 
 .rss_logo:last-child {
-  margin-right: 5px;
+    margin-right: 5px;
 }
 
 /* Index include
 ---------------------------------------------------------------------------- */
 
 .index_include {
-  width: 95%;
-  margin: 0 auto 15px;
-  background: -moz-linear-gradient(center top , #FFFFFF 0%, #F5F5F5 100%) repeat scroll 0 0 transparent;
-  border: 1px solid #DFDFDF;
-  padding: 8px;
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+    width: 95%;
+    margin: 0 auto 15px;
+    background: -moz-linear-gradient(center top, #ffffff 0%, #f5f5f5 100%) repeat scroll 0 0
+        transparent;
+    border: 1px solid #dfdfdf;
+    padding: 8px;
+    -webkit-box-sizing: border-box;
+    -moz-box-sizing: border-box;
+    box-sizing: border-box;
 }
 
 /* Elements
@@ -231,328 +328,346 @@ a.rss_logo:hover {
 .tree,
 .commit_search,
 .history {
-  width: 95%;
-  margin: 0 auto 15px auto;
-  border: 1px solid #d8d8d8;
-  -moz-box-shadow: 0 0 3px rgba(0,0,0,0.2);
-  -webkit-box-shadow: 0 0 3px rgba(0,0,0,0.2);
-  box-shadow: 0 0 3px rgba(0,0,0,0.2);
+    width: 95%;
+    margin: 0 auto 15px auto;
+    border: 1px solid #d8d8d8;
+    -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.2);
+    -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.2);
+    box-shadow: 0 0 3px rgba(0, 0, 0, 0.2);
 }
 
 .project_list th,
 .shortlog th,
 .tree th,
 .commit_search th {
-  color: #afafaf;
-  font-weight: normal;
+    color: #afafaf;
+    font-weight: normal;
 }
 
 .project_list th {
-  font-weight: bold;
+    font-weight: bold;
 }
 
 .project_list tr,
 .shortlog tr,
 .tree tr,
 .commit_search tr {
-  background: #eaeaea;
-  height: 2.5em;
-  text-align: left;
-  color: #545454;
-}
-
-.project_list tr.dark, .project_list tr.light,
-.shortlog tr.dark, .shortlog tr.light,
-.tree tr.dark, .tree tr.light,
-.commit_search tr.dark, .commit_search tr.light,
-.history tr.dark, .history tr.light,
-.heads tr.dark, .heads tr.light {
-  background: #F9F9F9; /* old browsers */
-  background: -moz-linear-gradient(top, #F9F9F9 0%, #EFEFEF 100%); /* firefox */
-  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#F9F9F9), color-stop(100%,#EFEFEF)); /* webkit */
-  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#F9F9F9', endColorstr='#EFEFEF',GradientType=0 ); /* ie */
-  background: -o-linear-gradient(top, #F9F9F9 0%, #EFEFEF 100%);
-  height: 2.5em;
-  border-bottom: 1px solid #e1e1e1;
+    background: #eaeaea;
+    height: 2.5em;
+    text-align: left;
+    color: #545454;
+}
+
+.project_list tr.dark,
+.project_list tr.light,
+.shortlog tr.dark,
+.shortlog tr.light,
+.tree tr.dark,
+.tree tr.light,
+.commit_search tr.dark,
+.commit_search tr.light,
+.history tr.dark,
+.history tr.light,
+.heads tr.dark,
+.heads tr.light {
+    background: #f9f9f9; /* old browsers */
+    background: -moz-linear-gradient(top, #f9f9f9 0%, #efefef 100%); /* firefox */
+    background: -webkit-gradient(
+        linear,
+        left top,
+        left bottom,
+        color-stop(0%, #f9f9f9),
+        color-stop(100%, #efefef)
+    ); /* webkit */
+    filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#F9F9F9', endColorstr='#EFEFEF',GradientType=0 ); /* ie */
+    background: -o-linear-gradient(top, #f9f9f9 0%, #efefef 100%);
+    height: 2.5em;
+    border-bottom: 1px solid #e1e1e1;
 }
 
 th .header {
-  background: transparent;
-  border: 0;
-  padding: 0;
-  font-weight: bold;
+    background: transparent;
+    border: 0;
+    padding: 0;
+    font-weight: bold;
 }
 
 .tree {
-  width: 100%;
-  margin: 0;
+    width: 100%;
+    margin: 0;
 }
 
 .projsearch {
-  position: absolute;
-  right: 4%;
-  top: 15px;
+    position: absolute;
+    right: 4%;
+    top: 15px;
 }
 
 .projsearch a {
-  display: none;
+    display: none;
 }
 
 .commit_search {
-  background: #eaeaea;
+    background: #eaeaea;
 }
 
 .page_nav,
 .list_head,
 .page_path,
 .search {
-  width: 94%;
-  background: #eaeaea;
-  color: #545454;
-  border: 1px solid #d8d8d8;
-  padding: 5px;
-  margin: 0 auto 15px auto;
+    width: 94%;
+    background: #eaeaea;
+    color: #545454;
+    border: 1px solid #d8d8d8;
+    padding: 5px;
+    margin: 0 auto 15px auto;
 }
 
 .history {
-  background: #eaeaea;
+    background: #eaeaea;
 }
 
 .title {
-  margin: 0 auto 15px auto;
-  padding: 5px;
-  width: 95%;
+    margin: 0 auto 15px auto;
+    padding: 5px;
+    width: 95%;
 }
 
 .readme {
-  background: #eaf2f5;
-  border: 1px solid #bedce7;
-  -moz-box-sizing: border-box;
-  -webkit-box-sizing: border-box;
-  box-sizing: border-box;
-  margin: 0 auto 15px auto;
-  padding: 15px;
-  width: 95%;
+    background: #eaf2f5;
+    border: 1px solid #bedce7;
+    -moz-box-sizing: border-box;
+    -webkit-box-sizing: border-box;
+    box-sizing: border-box;
+    margin: 0 auto 15px auto;
+    padding: 15px;
+    width: 95%;
 }
 
 .readme h1 {
-  display: block;
-  font-size: 2em;
-  font-weight: bold;
-  margin-bottom: 0.67em;
-  margin-top: 0;
+    display: block;
+    font-size: 2em;
+    font-weight: bold;
+    margin-bottom: 0.67em;
+    margin-top: 0;
 }
 
 .readme h2 {
-  font-size: 1.5em;
-  font-weight: bold;
-  margin-bottom: 0.83em;
+    font-size: 1.5em;
+    font-weight: bold;
+    margin-bottom: 0.83em;
 }
 
-
 .readme h3 {
-  font-size: 1.17em;
-  font-weight: bold;
-  margin-bottom: 1em;
+    font-size: 1.17em;
+    font-weight: bold;
+    margin-bottom: 1em;
 }
 
 .readme p {
-  margin-bottom: 1em;
+    margin-bottom: 1em;
 }
 
 .readme ul {
-  list-style: disc;
-  margin-bottom: 1em;
-  margin-left: 1.5em;
+    list-style: disc;
+    margin-bottom: 1em;
+    margin-left: 1.5em;
 }
 
 .readme ul ul {
-  margin-bottom: 0;
+    margin-bottom: 0;
 }
 
 .readme ol {
-  list-style: decimal;
-  margin-bottom: 1em;
-  margin-left: 1.5em;
+    list-style: decimal;
+    margin-bottom: 1em;
+    margin-left: 1.5em;
 }
 
 .readme ol ol {
-  margin-bottom: 0;
+    margin-bottom: 0;
 }
 
 .readme pre {
-  font-family: monospace;
-  margin: 1em 0;
-  white-space: pre;
+    font-family: monospace;
+    margin: 1em 0;
+    white-space: pre;
 }
 
-.readme tt, .readme code, .readme kbd, .readme samp {
-  font-family: monospace;
+.readme tt,
+.readme code,
+.readme kbd,
+.readme samp {
+    font-family: monospace;
 }
 
 .readme blockquote {
-  margin: 1em;
+    margin: 1em;
 }
 
 .projects_list,
 .tags {
-  width: 95%;
-  background: #f0f0f0;
-  color: #545454;
-  border: 1px solid #d8d8d8;
-  padding: 5px;
-  margin: 0 auto 15px auto;
+    width: 95%;
+    background: #f0f0f0;
+    color: #545454;
+    border: 1px solid #d8d8d8;
+    padding: 5px;
+    margin: 0 auto 15px auto;
 }
 
 .heads {
-  width: 95%;
-  color: #545454;
-  border: 1px solid #d8d8d8;
-  padding: 5px;
-  margin: 0 auto 15px auto;
+    width: 95%;
+    color: #545454;
+    border: 1px solid #d8d8d8;
+    padding: 5px;
+    margin: 0 auto 15px auto;
 }
 
 .header {
-  width: 94%;
-  margin: 0 auto 15px auto;
-  background: #eaf2f5;
-  border: 1px solid #bedce7;
-  padding: 5px;
+    width: 94%;
+    margin: 0 auto 15px auto;
+    background: #eaf2f5;
+    border: 1px solid #bedce7;
+    padding: 5px;
 }
 
 .header .age {
-  float: left;
-  color: #000;
-  font-weight: bold;
-  width: 10em;
+    float: left;
+    color: #000;
+    font-weight: bold;
+    width: 10em;
 }
 
 .title_text {
-  width: 94%;
-  background: #eaf2f5;
-  border: 1px solid #bedce7;
-  padding: 5px;
-  margin: 0 auto 0 auto;
+    width: 94%;
+    background: #eaf2f5;
+    border: 1px solid #bedce7;
+    padding: 5px;
+    margin: 0 auto 0 auto;
 }
 
 .log_body {
-  width: 94%;
-  background: #eaf2f5;
-  border: 1px solid #bedce7;
-  border-top: 0;
-  padding: 5px;
-  margin: 0 auto 15px auto;
+    width: 94%;
+    background: #eaf2f5;
+    border: 1px solid #bedce7;
+    border-top: 0;
+    padding: 5px;
+    margin: 0 auto 15px auto;
 }
 
 .page_body {
-  line-height: 1.4em;
-  width: 94%;
-  background: #f8f8f8;
-  border: 1px solid #d8d8d8;
-  padding: 5px;
-  margin: 15px auto 15px auto;
+    line-height: 1.4em;
+    width: 94%;
+    background: #f8f8f8;
+    border: 1px solid #d8d8d8;
+    padding: 5px;
+    margin: 15px auto 15px auto;
 }
 
 .diff_tree {
-  width: 95%;
-  background: #f0f0f0;
-  border: 1px solid #d8d8d8;
-  padding: 5px;
-  margin: 0 auto 15px auto;
+    width: 95%;
+    background: #f0f0f0;
+    border: 1px solid #d8d8d8;
+    padding: 5px;
+    margin: 0 auto 15px auto;
 }
 
 .page_body > .list_head {
-  width: 98.5%;
+    width: 98.5%;
 }
 
 .page_body > .diff_tree {
-  width: 99.5%;
+    width: 99.5%;
 }
 
 .patch > .header {
-  width: 99%;
+    width: 99%;
 }
 
 .author .avatar,
 .author_date .avatar {
-  position: relative;
-  top: 3px;
+    position: relative;
+    top: 3px;
 }
 
 .object_header .avatar {
-  border: 1px solid #D8D8D8;
-  float: right;
+    border: 1px solid #d8d8d8;
+    float: right;
 }
 
 .object_header td,
 .object_header th {
-  vertical-align: top;
+    vertical-align: top;
 }
 
 /* Refs
 ---------------------------------------------------------------------------- */
 
 span.refs span {
-  color: #707070;
-  display: inline-block;
-  margin: 0;
-  background-color: #eee;
-  border: 1px solid #ccc;
-  border-radius: 3px;
-  height: 18px;
-  padding: 0 6px;
-  text-overflow: ellipsis;
+    color: #707070;
+    display: inline-block;
+    margin: 0;
+    background-color: #eee;
+    border: 1px solid #ccc;
+    border-radius: 3px;
+    height: 18px;
+    padding: 0 6px;
+    text-overflow: ellipsis;
 }
 
 span.refs span.ref {
-  color: #707070;
-  display: inline-block;
-  margin: 0;
-  background-color: #c4c4ff;
-  border: 1px solid #7878ff;
-  border-radius: 3px;
-  height: 18px;
-  padding: 0 6px;
-  text-overflow: ellipsis;
-  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gIKFSUnpolg7AAAAHJQTFRFAAAAVVWqZmbMVVXVYGDgbW3td3fuc3PzdHT0cHD1d3f6dHT6dnb7dHT7dnb8dnb8dnb9d3f9dnb+eHj+d3f+eHj+d3f+d3f+d3f+eHj+d3f+eHj+d3f+eHj+d3f+d3f+eHj+d3f+d3f+d3f+eHj/////V9oQhQAAACR0Uk5TAAIEBQcNDhMVGCotNTZAT217i5CgobvExtjZ4eLr7vP09ff7uqQ6cgAAAAFiS0dEJcMByQ8AAABUSURBVBjTpc43AoAwDENRh95bgNBM1f3PyOpslD++RSJ61YgH5M2IbIkn4GocSR1MZVBL4t2n4FgkbaxI8Sqph041WknZCWAIrcmEUbpf3lNe0N9u59YFYHnZ78gAAAAASUVORK5CYII=);
-  background-repeat: no-repeat;
-  padding-left: 18px;
+    color: #707070;
+    display: inline-block;
+    margin: 0;
+    background-color: #c4c4ff;
+    border: 1px solid #7878ff;
+    border-radius: 3px;
+    height: 18px;
+    padding: 0 6px;
+    text-overflow: ellipsis;
+    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gIKFSUnpolg7AAAAHJQTFRFAAAAVVWqZmbMVVXVYGDgbW3td3fuc3PzdHT0cHD1d3f6dHT6dnb7dHT7dnb8dnb8dnb9d3f9dnb+eHj+d3f+eHj+d3f+d3f+d3f+eHj+d3f+eHj+d3f+eHj+d3f+d3f+eHj+d3f+d3f+d3f+eHj/////V9oQhQAAACR0Uk5TAAIEBQcNDhMVGCotNTZAT217i5CgobvExtjZ4eLr7vP09ff7uqQ6cgAAAAFiS0dEJcMByQ8AAABUSURBVBjTpc43AoAwDENRh95bgNBM1f3PyOpslD++RSJ61YgH5M2IbIkn4GocSR1MZVBL4t2n4FgkbaxI8Sqph041WknZCWAIrcmEUbpf3lNe0N9u59YFYHnZ78gAAAAASUVORK5CYII=);
+    background-repeat: no-repeat;
+    padding-left: 18px;
 }
 
 span.refs span.tag {
-  color: #707070;
-  display: inline-block;
-  margin: 0;
-  background-color: #ffffab;
-  border: 1px solid #d9d93b;
-  border-radius: 3px;
-  height: 18px;
-  padding: 0 6px;
-  text-overflow: ellipsis;
-  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gIKFSUZZ+h9RwAAAGZQTFRFAAAAtrYkwMBAwMBAx8c4yso11NQ71NQ51dU52Ng71tY519c719c719c62Ng719c719c62Ng72dk62Ng62Ng72Ng72dk62Ng72Ng62dk62dk72dk62Ng62dk72Ng72Ng72dk7////ou/AnQAAACB0Uk5TAAYHCxESLjRCWWlqa4uNkpissbrO19jc3ufs8vf6/f7atAU2AAAAAWJLR0QhxGwNFgAAAF1JREFUGFeNy0cOgCAABVGw94rY5d//lC7omhhn+ZIh5Gf1xPk0Zi5dAABROIQjSU/fsAXhDkCUljAv8jW2wlQpaixpo4Nj+dtatVpjkSJjLNaizRVpvhBCu/4h391jzw1lU12Z7wAAAABJRU5ErkJggg==);
-  background-repeat: no-repeat;
-  padding-left: 18px;
+    color: #707070;
+    display: inline-block;
+    margin: 0;
+    background-color: #ffffab;
+    border: 1px solid #d9d93b;
+    border-radius: 3px;
+    height: 18px;
+    padding: 0 6px;
+    text-overflow: ellipsis;
+    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gIKFSUZZ+h9RwAAAGZQTFRFAAAAtrYkwMBAwMBAx8c4yso11NQ71NQ51dU52Ng71tY519c719c719c62Ng719c719c62Ng72dk62Ng62Ng72Ng72dk62Ng72Ng62dk62dk72dk62Ng62dk72Ng72Ng72dk7////ou/AnQAAACB0Uk5TAAYHCxESLjRCWWlqa4uNkpissbrO19jc3ufs8vf6/f7atAU2AAAAAWJLR0QhxGwNFgAAAF1JREFUGFeNy0cOgCAABVGw94rY5d//lC7omhhn+ZIh5Gf1xPk0Zi5dAABROIQjSU/fsAXhDkCUljAv8jW2wlQpaixpo4Nj+dtatVpjkSJjLNaizRVpvhBCu/4h391jzw1lU12Z7wAAAABJRU5ErkJggg==);
+    background-repeat: no-repeat;
+    padding-left: 18px;
 }
 
 span.refs span.head {
-  color: #707070;
-  display: inline-block;
-  margin: 0;
-  background-color: #c4ffc4;
-  border: 1px solid #78ff78;
-  border-radius: 3px;
-  height: 18px;
-  padding: 0 6px;
-  text-overflow: ellipsis;
-  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gIKFSYDsafX/gAAAUpJREFUOMvVkjFLA0EQhd/s7l06MSCihbV/wC5/QBDEIFYWprRIIQQJFqKFQi4kUbBQsFSwtrUQLQULUTBFLCzVIgimCXe7z0q5yIWcqfRVwzDzMTNvgL8mSUqWw3JOtFQJdsIwLDYyjdYgkEmkazl2oVtQWk36nn8AYBYASmFpxmizGtnoqO7Vb+M9KglEkASdpWU872nvVCiPRpuTnz2JIHGyqX3d0kZfR1G0Ht+g/do+FIhOBbLW3n/FNb/28D0puZ+dyL44ur1UoH5yzt2JyIj6UGdDgwrPhYzSagNEszJaeU/lWlylbmnaeGZZICsAppxzi6nt73HK85oQCMknOuarpno+FIjglVjZDXaCS2yDv3rIHlCb88FY0BlUl3hs7ektkhckb5DFWhoz+n12zr7ZPLpYUqLm0oBMn8NUzLhpAgjpWMS/1CcSJ3ykD7Rk1QAAAABJRU5ErkJggg==);
-  background-repeat: no-repeat;
-  padding-left: 18px;
+    color: #707070;
+    display: inline-block;
+    margin: 0;
+    background-color: #c4ffc4;
+    border: 1px solid #78ff78;
+    border-radius: 3px;
+    height: 18px;
+    padding: 0 6px;
+    text-overflow: ellipsis;
+    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gIKFSYDsafX/gAAAUpJREFUOMvVkjFLA0EQhd/s7l06MSCihbV/wC5/QBDEIFYWprRIIQQJFqKFQi4kUbBQsFSwtrUQLQULUTBFLCzVIgimCXe7z0q5yIWcqfRVwzDzMTNvgL8mSUqWw3JOtFQJdsIwLDYyjdYgkEmkazl2oVtQWk36nn8AYBYASmFpxmizGtnoqO7Vb+M9KglEkASdpWU872nvVCiPRpuTnz2JIHGyqX3d0kZfR1G0Ht+g/do+FIhOBbLW3n/FNb/28D0puZ+dyL44ur1UoH5yzt2JyIj6UGdDgwrPhYzSagNEszJaeU/lWlylbmnaeGZZICsAppxzi6nt73HK85oQCMknOuarpno+FIjglVjZDXaCS2yDv3rIHlCb88FY0BlUl3hs7ektkhckb5DFWhoz+n12zr7ZPLpYUqLm0oBMn8NUzLhpAgjpWMS/1CcSJ3ykD7Rk1QAAAABJRU5ErkJggg==);
+    background-repeat: no-repeat;
+    padding-left: 18px;
 }
 
 span.refs a {
-  color: #4e4e4e;
-  font: 11px "Bitstream Vera Sans Mono", "DejaVu Sans Mono", Monaco, monospace;
-  line-height: 18px;
+    color: #4e4e4e;
+    font:
+        11px "Bitstream Vera Sans Mono",
+        "DejaVu Sans Mono",
+        Monaco,
+        monospace;
+    line-height: 18px;
 }
 
 /* Diffs
@@ -560,89 +675,95 @@ span.refs a {
 
 div.diff.to_file a.path,
 div.diff.to_file {
-  color: #007000;
+    color: #007000;
 }
 
 div.diff.from_file a.path,
 div.diff.from_file {
-  color: #aa0000;
+    color: #aa0000;
 }
 
 .patch .header {
-  margin: 0;
+    margin: 0;
 }
 
 .patchset {
-  overflow-x: auto;
-  overflow-y: hidden;
+    overflow-x: auto;
+    overflow-y: hidden;
 }
 
 .chunk_header {
-  background: #eaf2f5;
-  color: #999;
+    background: #eaf2f5;
+    color: #999;
 }
 
 .rem {
-  background: #ffdddd;
+    background: #ffdddd;
 }
 .rem .marked {
-  background: #ffaaaa;
+    background: #ffaaaa;
 }
 .add {
-  background: #ddffdd;
+    background: #ddffdd;
 }
 .add .marked {
-  background: #7dff7d;
+    background: #7dff7d;
 }
 
 .extended_header {
-  width: 99.5%;
+    width: 99.5%;
 }
 
 div.chunk_block {
-  overflow: hidden;
+    overflow: hidden;
 }
 
 div.chunk_block div.old {
-  float: left;
-  width: 50%;
-  overflow: hidden;
-  border-right: 5px solid #EAF2F5;
+    float: left;
+    width: 50%;
+    overflow: hidden;
+    border-right: 5px solid #eaf2f5;
 }
 
 div.chunk_block.rem,
 div.chunk_block.add {
-  background: transparent;
+    background: transparent;
 }
 
 div.chunk_block div.old .add,
 div.chunk_block div.old .rem {
-  padding-right: 3px;
+    padding-right: 3px;
 }
 
 div.chunk_block div.new .add,
 div.chunk_block div.new .rem {
-  padding-left: 3px;
+    padding-left: 3px;
 }
 
 div.chunk_block div.new {
-  margin-left: 50%;
-  width: 50%;
-  border-left: 5px solid #EAF2F5;
+    margin-left: 50%;
+    width: 50%;
+    border-left: 5px solid #eaf2f5;
 }
 
 /* Category
 ---------------------------------------------------------------------------- */
 
 td.category {
-  background: #E6F1F6; /* old browsers */
-  background: -moz-linear-gradient(top, #C8D8E7 0%, #E6F1F3 100%); /* firefox */
-  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#C8D8E7), color-stop(100%,#E6F1F3)); /* webkit */
-  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#C8D8E7', endColorstr='#E6F1F3',GradientType=0 ); /* ie */
-  background: -o-linear-gradient(top, #C8D8E7 0%, #E6F1F3 100%);
-  font-weight: bold;
-  border-bottom: 1px solid #D1D1D1;
-  border-top: 1px solid #D1D1D1;
+    background: #e6f1f6; /* old browsers */
+    background: -moz-linear-gradient(top, #c8d8e7 0%, #e6f1f3 100%); /* firefox */
+    background: -webkit-gradient(
+        linear,
+        left top,
+        left bottom,
+        color-stop(0%, #c8d8e7),
+        color-stop(100%, #e6f1f3)
+    ); /* webkit */
+    filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#C8D8E7', endColorstr='#E6F1F3',GradientType=0 ); /* ie */
+    background: -o-linear-gradient(top, #c8d8e7 0%, #e6f1f3 100%);
+    font-weight: bold;
+    border-bottom: 1px solid #d1d1d1;
+    border-top: 1px solid #d1d1d1;
 }
 
 /* Age
@@ -650,115 +771,151 @@ td.category {
 
 /* noage: "No commits" */
 .project_list td.noage {
-  color: #cdcdcd;
+    color: #cdcdcd;
 }
 
 /* age2: 60*60*24*2 <= age */
-.project_list td.age2, .blame td.age2 {
-  color: #545454;
+.project_list td.age2,
+.blame td.age2 {
+    color: #545454;
 }
 
 /* age1: 60*60*2 <= age < 60*60*24*2 */
 .project_list td.age1 {
-  color: #009900;
+    color: #009900;
 }
 
 /* age0: age < 60*60*2 */
 .project_list td.age0 {
-  color: #009900;
-  font-weight: bold;
+    color: #009900;
+    font-weight: bold;
 }
 
 /* File status
 ---------------------------------------------------------------------------- */
 
 .diff_tree span.file_status.new {
-  color: #008000;
+    color: #008000;
 }
 
 table.diff_tree span.file_status.deleted {
-  color: #c00000;
+    color: #c00000;
 }
 
 table.diff_tree span.file_status.moved,
 table.diff_tree span.file_status.mode_chnge {
-  color: #545454;
+    color: #545454;
 }
 
 table.diff_tree span.file_status.copied {
-  color: #70a070;
+    color: #70a070;
 }
 
 span.cntrl {
-  border: dashed #aaaaaa;
-  border-width: 1px;
-  padding: 0px 2px 0px 2px;
-  margin:  0px 2px 0px 2px;
+    border: dashed #aaaaaa;
+    border-width: 1px;
+    padding: 0px 2px 0px 2px;
+    margin: 0px 2px 0px 2px;
 }
 
 span.match {
-  background: #aaffaa;
-  color: #000;
+    background: #aaffaa;
+    color: #000;
 }
 
 td.error {
-  color: red;
-  background: yellow;
+    color: red;
+    background: yellow;
 }
 
 /* blob view */
 
-td.pre, div.pre, div.diff {
-  white-space: pre-wrap;
+td.pre,
+div.pre,
+div.diff {
+    white-space: pre-wrap;
 }
 
 /* JavaScript-based timezone manipulation */
 
-.popup { /* timezone selection UI */
-       position: absolute;
-       /* "top: 0; right: 0;" would be better, if not for bugs in browsers */
-       top: 0; left: 0;
-       border: 1px solid #d8d8d8;
-       padding: 2px;
-       background-color: #f0f0f0;
-       font-style: normal;
-       color: #545454;
-       cursor: auto;
-}
-
-.close-button { /* close timezone selection UI without selecting */
-       /* float doesn't work within absolutely positioned container,
+.popup {
+    /* timezone selection UI */
+    position: absolute;
+    /* "top: 0; right: 0;" would be better, if not for bugs in browsers */
+    top: 0;
+    left: 0;
+    border: 1px solid #d8d8d8;
+    padding: 2px;
+    background-color: #f0f0f0;
+    font-style: normal;
+    color: #545454;
+    cursor: auto;
+}
+
+.close-button {
+    /* close timezone selection UI without selecting */
+    /* float doesn't work within absolutely positioned container,
         * if width of container is not set explicitly */
-       /* float: right; */
-       position: absolute;
-       top: 0px; right: 0px;
-       border:  1px solid #ffaaaa;
-       margin:  1px 1px 1px 1px;
-       padding-bottom: 2px;
-       width:     12px;
-       height:    10px;
-       font-size:  9px;
-       font-weight: bold;
-       text-align: center;
-       background-color: #ffdddd;
-       cursor: pointer;
+    /* float: right; */
+    position: absolute;
+    top: 0px;
+    right: 0px;
+    border: 1px solid #ffaaaa;
+    margin: 1px 1px 1px 1px;
+    padding-bottom: 2px;
+    width: 12px;
+    height: 10px;
+    font-size: 9px;
+    font-weight: bold;
+    text-align: center;
+    background-color: #ffdddd;
+    cursor: pointer;
 }
 
 /* Style definition generated by highlight 2.4.5, http://www.andre-simon.de/ */
 
 /* Highlighting theme definition: */
 
-.num    { color:#6ecf36; }
-.esc    { color:#ff00ff; }
-.str    { color:#ff00d3; background-color: #edc9ec }
-.dstr   { color:#818100; }
-.slc    { color:#838183; font-style:italic; }
-.com    { color:#838183; font-style:italic; }
-.dir    { color:#008200; }
-.sym    { color:#000000; }
-.line   { color:#555555; }
-.kwa    { color:#666666; font-weight:bold; }
-.kwb    { color:#6b3099; }
-.kwc    { color:#d4663d; }
-.kwd    { color:#2928ff; }
-
+.num {
+    color: #6ecf36;
+}
+.esc {
+    color: #ff00ff;
+}
+.str {
+    color: #ff00d3;
+    background-color: #edc9ec;
+}
+.dstr {
+    color: #818100;
+}
+.slc {
+    color: #838183;
+    font-style: italic;
+}
+.com {
+    color: #838183;
+    font-style: italic;
+}
+.dir {
+    color: #008200;
+}
+.sym {
+    color: #000000;
+}
+.line {
+    color: #555555;
+}
+.kwa {
+    color: #666666;
+    font-weight: bold;
+}
+.kwb {
+    color: #6b3099;
+}
+.kwc {
+    color: #d4663d;
+}
+.kwd {
+    color: #2928ff;
+}