/*
 * 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.
 */

body {
   padding:                0em 2em;
   font-size:              120%
}

/*-----------------------------------------------------------------*/
.ribbon {
    position:               absolute;
    top:                    0;
    left:                   0;
    border-right:           thin solid #000;
    border-bottom:          thin solid #000;
    -moz-border-radius-bottomright:     0.5em;
    -webkit-border-bottom-right-radius: 0.5em;
    padding:                0.25em 0.5em;
    background-color:       #FF0;
    font-style:             italic;
    -webkit-box-shadow:     5px 5px 15px #888;
    -moz-box-shadow:        5px 5px 15px #888;
    box-shadow:             5px 5px 15px #888;
}

/*-----------------------------------------------------------------*/
.no-decoration {
    text-decoration:        none;
}

/*-----------------------------------------------------------------*/
.strike {
    text-decoration:        line-through;
}

/*-----------------------------------------------------------------*/
.weinre {
   color:                  #088;
   font-style:             italic;
   font-weight:            bold;
   font-family:            Menlo, Monaco, Consolas, Lucida Console, dejavu sans mono, monospace;
}

/*-----------------------------------------------------------------*/
.width-transition {
   -webkit-transition:     width 0.3s linear;
}

/*-----------------------------------------------------------------*/
.no-bullet {
   list-style-type:        none;
}

/*-----------------------------------------------------------------*/
.indent {
   margin-left:            3.0em;
}

/*-----------------------------------------------------------------*/
.no-bullet li {
   margin-top:             0.50em;
   margin-bottom:          0.50em;
}

/*-----------------------------------------------------------------*/
.spaced li {
   margin-top:             0.50em;
   margin-bottom:          0.50em;
}

/*-----------------------------------------------------------------*/
.spaced dt {
   margin-top:             0.50em;
}

/*-----------------------------------------------------------------*/
.spaced dd {
   margin-bottom:          0.50em;
}

/*-----------------------------------------------------------------*/
dt {
   font-weight:            bold;
}

tt {
   white-space:            pre;
}

/*-----------------------------------------------------------------*/
.toc {
    font-style:            italic;
    text-align:            center;
}

/*-----------------------------------------------------------------*/
.toc a {
    padding:               0.2em 0.5em;
}

/*-----------------------------------------------------------------*/
.page-title {
    text-align:            center;
}

/*-----------------------------------------------------------------*/
.todo {
    background-color:      #FAA;
}

/*-----------------------------------------------------------------*/
.help {
    background-color:      #FDD;
    font-weight:           bold;
    font-size:             120%;
}

/*-----------------------------------------------------------------*/
.note {
    background-color:      #FFA;
    font-weight:           bold;
    font-size:             120%;
    margin:                0.25em 1.0em;
    padding:               0.00em 0.5em;
    border-width:          1;
    border-style:          solid;
    border-radius:         0.5em;
    -moz-border-radius:    0.5em;
    -webkit-border-radius: 0.5em;
}

/*-----------------------------------------------------------------*/
pre, xmp {
    border-width:          1;
    border-style:          solid;
    overflow:              auto;
    padding-top:           0.4em;
    padding-bottom:        0.4em;
    padding-left:          1.4em;
    padding-right:         1.4em;
    margin-left:           1.4em;
    margin-right:          1.4em;
	background:            #FFFFDF;
	border-radius:         0.5em;
    -moz-border-radius:    0.5em;
    -webkit-border-radius: 0.5em;
	box-shadow:            0.3em 0.3em 0.3em 0em #DDD;
	-moz-box-shadow:       0.3em 0.3em 0.3em 0em #DDD;
	-webkit-box-shadow:    0.3em 0.3em 0.3em 0em #DDD;
}

/*-----------------------------------------------------------------*/
h2 {
    padding:               0.25em 0.50em;
    background-color:      #DDD;
    border-radius:         0.5em;
    -moz-border-radius:    0.5em;
    -webkit-border-radius: 0.5em;
}

/*-----------------------------------------------------------------*/
kewl {
	box-shadow:            0.3em 0.3em 0.3em 0em #DDD;
	-moz-box-shadow:       0.3em 0.3em 0.3em 0em #DDD;
	-webkit-box-shadow:    0.3em 0.3em 0.3em 0em #DDD;
	border-radius:         0.5em;
    -moz-border-radius:    0.5em;
    -webkit-border-radius: 0.5em;
}
