/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 */
ul {
    list-style-type:square;
}

th { 
    text-align: left;
    font-weight: bold;
}

body {
    margin:0;
    background:#FFFFFF;
    font-family:"Verdana", sans-serif;
}

.container {
    width:950px;
    margin:0 auto;
}

.header {
    height:100px;
    width:950px;
    background:url(images/header.png)
}

.logo {
    text-align:center;
    font-weight:600;
    padding:0 0 0 0;
    font-size:14px;
    font-family:"Verdana", cursive;
}

.logo a {
    color:#000000;
    text-decoration:none;
}

.main_text_area {
    margin-left:200px;
}

.main_text_area_top {
    height:14px;
    font-size:1px;
}

.main_text_area_bottom {
    display:none;
/*  height:14px;
    margin-bottom:4px;*/
}

.main_text_area_body {
    padding:5px 24px;
}

.main_text_area_body p {
    text-align:justify;
}

.main_text_area br {
    line-height:10px;
}

.main_text_area h1 {
    font-size:28px;
    font-weight:600;
    margin:0 0 24px 0;
    color:#0c3b82;
    font-family:"Verdana", Times, serif;
}

.main_text_area h2 {
    font-size:24px;
    font-weight:600;
    margin:24px 0 8px 0;
    color:#0c3b82;
    font-family:"Verdana",Times, serif;
}

.main_text_area ol, .main_text_area ul {
    padding:0;
    margin:10px 0;
    margin-left:20px;
}

.main_text_area li {
/*    margin-left:40px; */
}

.main_text_area, .menu_box {
    font-size:13px;
    line-height:17px;
    color:#000000;
}

.main_text_area {
    font-size:15px;
}

.main_text_area a {
    color:#000000;
}

.main_text_area a:hover {
    color:#000000;
}

.menu_box {
    width:196px;
    float:left;
    margin-left:4px;
}

.menu_box_top {
    background:url(images/menu_top.png) no-repeat; 
    height:14px;
    font-size:1px;
}

.menu_box_body {
    background:url(images/menu_body.png) repeat-y; 
    padding:5px 24px 5px 24px;
}

.menu_box_bottom {
    background:url(images/menu_bottom.png) no-repeat; 
    height:14px;
    font-size:1px;
    margin-bottom:1px;
}

.menu_box h3 {
    font-size:20px;
    font-weight:500;
    margin:0 0 8px 0;
    color:#0c3b82;
    font-family:"Verdana",Times, serif;
}

.menu_box ul {
    margin:12px;
    padding:0px;
}

.menu_box li {
    list-style:square; 
}

.menu_box a {
    color:#000000;
    text-decoration:none;
}

.menu_box a:hover {
    color:#000000;
    text-decoration:underline;
}

.feature_box {
    width:698px;
    overflow:hidden;
}

.feature_box h3 {
    font-size:18px;
    font-weight:600;
    margin:0 0 8px 0;
    color:#0c3b82;
    font-family:"Verdana", Times, serif;
}

.feature_box_column1 {
    width:196px;
    float:left;
    padding:10px 15px 10px 15px;
    margin-left:0px;
}

.feature_box_column2 {
    width:196px;
    float:left;
    padding:10px 15px 10px 15px;
    margin-left:0px;
}

.feature_box_column3 {
    width:196px;
    float:left;
    padding:10px 15px 10px 15px;
    margin-left:0px;
}


.feature_box ul {
    margin:.8em .4em;
    padding-left:1.2em;
    padding:0;
    list-style-type: square;
}

.feature_box ul li {
    font-family:"Verdana",sans-serif;
    font-size:14px;
    color:#000;
    margin:.4em 0;
}

.feature_box ul li ul {
    padding-left:1.2em;
    margin-left:2em;
}

.feature_box a {
    color:#000000;
    text-decoration:none;
}

.feature_box a:hover {
    color:#000000;
    text-decoration:underline;
}

.footer {
    color:#000000;
    clear:both;
    text-align:center;
    font-size:11px;
    line-height:17px;
    height:45px;
    padding-top:18px;
}

.footer a {
    color:#000000;
}

.footer a:hover {
    color:#000000;
}

.download_table {
    width:100%;
}

.download_table_col_1 {
    width:240px;
}

.proton_download_table_col_1 {
    width:420px;
}

.download_table_amqp_col {
    text-align:center;
    width:80px;
}

