├── Setup.hs ├── assets ├── cross.png ├── chart_line_add.png ├── monitor.css ├── index.html ├── monitor.js ├── jquery.flot.min.js ├── bootstrap-1.4.0.min.css └── bootstrap-1.4.0.css ├── LICENSE.icons ├── .gitignore ├── LICENSE.javascript ├── System └── Remote │ ├── Json.hs │ ├── Label.hs │ ├── Counter.hs │ ├── Gauge.hs │ ├── Snap.hs │ └── Monitoring.hs ├── examples └── Basic.hs ├── LICENSE ├── README.md ├── ekg.cabal ├── CHANGES.md └── .github └── workflows └── haskell-ci.yml /Setup.hs: -------------------------------------------------------------------------------- 1 | import Distribution.Simple 2 | main = defaultMain 3 | -------------------------------------------------------------------------------- /assets/cross.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haskell-github-trust/ekg/HEAD/assets/cross.png -------------------------------------------------------------------------------- /assets/chart_line_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/haskell-github-trust/ekg/HEAD/assets/chart_line_add.png -------------------------------------------------------------------------------- /LICENSE.icons: -------------------------------------------------------------------------------- 1 | Icons: assets/chart_line_add.png assets/cross.png 2 | URL: http://www.fatcow.com/free-icons 3 | LICENSE: Creative Commons Attribution 3.0 License 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.hi 2 | *.o 3 | *.p_hi 4 | *.prof 5 | *.tix 6 | .DS_Store 7 | .cabal-sandbox/ 8 | .hpc/ 9 | /dist/* 10 | /dist-newstyle/* 11 | cabal.config 12 | cabal.sandbox.config 13 | examples/Basic 14 | -------------------------------------------------------------------------------- /LICENSE.javascript: -------------------------------------------------------------------------------- 1 | Javascript: assets/jquery-1.6.4.js assets/jquery-1.6.4.min.js 2 | URL: http://jquery.com/ 3 | Copyright: Copyright 2011, John Resig 4 | LICENSE: Dual licensed under the MIT or GPL Version 2 licenses 5 | Notes: Includes Sizzle.js, Copyright 2011, The Dojo Foundation, 6 | Released under the MIT, BSD, and GPL Licenses 7 | 8 | Javascript: assets/jquery.flot.js assets/jquery.flot.min.js 9 | URL: http://code.google.com/p/flot/ 10 | LICENSE: MIT License 11 | 12 | CSS: assets/bootstrap-1.4.0.min.css 13 | URL: http://twitter.github.com/bootstrap/ 14 | LICENSE: Apache License v2.0 15 | -------------------------------------------------------------------------------- /System/Remote/Json.hs: -------------------------------------------------------------------------------- 1 | module System.Remote.Json 2 | ( 3 | encodeAll 4 | , encodeOne 5 | ) where 6 | 7 | import qualified Data.Aeson as A 8 | import qualified Data.ByteString.Lazy as L 9 | 10 | import System.Metrics 11 | import qualified System.Metrics.Json as Json 12 | 13 | -- | Encode metrics as nested JSON objects. See 'Json.sampleToJson' 14 | -- for a description of the encoding. 15 | encodeAll :: Sample -> L.ByteString 16 | encodeAll = A.encode . Json.sampleToJson 17 | 18 | -- | Encode metric a JSON object. See 'Json.valueToJson' 19 | -- for a description of the encoding. 20 | encodeOne :: Value -> L.ByteString 21 | encodeOne = A.encode . Json.valueToJson 22 | -------------------------------------------------------------------------------- /System/Remote/Label.hs: -------------------------------------------------------------------------------- 1 | {-# OPTIONS_HADDOCK not-home #-} 2 | 3 | -- | This module defines a type for mutable, string-valued labels. 4 | -- Labels are variable values and can be used to track e.g. the 5 | -- command line arguments or other free-form values. All operations on 6 | -- labels are thread-safe. 7 | -- 8 | -- N.B. This module exists to maintain backwards compatibility with 9 | -- older versions of this library. New code should use the 10 | -- @System.Metrics.Label@ module from the ekg-core package instead. 11 | module System.Remote.Label 12 | ( 13 | Label.Label 14 | , Label.set 15 | , Label.modify 16 | ) where 17 | 18 | import qualified System.Metrics.Label as Label 19 | -------------------------------------------------------------------------------- /System/Remote/Counter.hs: -------------------------------------------------------------------------------- 1 | {-# OPTIONS_HADDOCK not-home #-} 2 | 3 | -- | This module defines a type for mutable, integer-valued counters. 4 | -- Counters are non-negative, monotonically increasing values and can 5 | -- be used to track e.g. the number of requests served since program 6 | -- start. All operations on counters are thread-safe. 7 | -- 8 | -- N.B. This module exists to maintain backwards compatibility with 9 | -- older versions of this library. New code should use the 10 | -- @System.Metrics.Counter@ module from the ekg-core package instead. 11 | module System.Remote.Counter 12 | ( 13 | Counter.Counter 14 | , Counter.inc 15 | , Counter.add 16 | ) where 17 | 18 | import qualified System.Metrics.Counter as Counter 19 | -------------------------------------------------------------------------------- /System/Remote/Gauge.hs: -------------------------------------------------------------------------------- 1 | {-# OPTIONS_HADDOCK not-home #-} 2 | 3 | -- | This module defines a type for mutable, integer-valued gauges. 4 | -- Gauges are variable values and can be used to track e.g. the 5 | -- current number of concurrent connections. All operations on gauges 6 | -- are thread-safe. 7 | -- 8 | -- N.B. This module exists to maintain backwards compatibility with 9 | -- older versions of this library. New code should use the 10 | -- @System.Metrics.Gauge@ module from the ekg-core package instead. 11 | module System.Remote.Gauge 12 | ( 13 | Gauge.Gauge 14 | , Gauge.inc 15 | , Gauge.dec 16 | , Gauge.add 17 | , Gauge.subtract 18 | , Gauge.set 19 | ) where 20 | 21 | import qualified System.Metrics.Gauge as Gauge 22 | -------------------------------------------------------------------------------- /assets/monitor.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Blueprint/flot compatibility 3 | * 4 | * Resets some styles back to the browser default. 5 | */ 6 | 7 | .plot table { 8 | width: auto; 9 | border-spacing: 2px; 10 | } 11 | 12 | .plot th, 13 | .plot td, 14 | .plot caption { 15 | padding: 0; 16 | } 17 | 18 | /** 19 | * Body margin 20 | */ 21 | 22 | body { 23 | padding-top: 60px; 24 | } 25 | 26 | /** 27 | * Plots 28 | */ 29 | 30 | .plot { 31 | width: 600px; 32 | height: 300px; 33 | margin-bottom: 1.5em; 34 | } 35 | 36 | .close-button { 37 | float: right; 38 | cursor: pointer; 39 | } 40 | 41 | /** 42 | * Table 43 | */ 44 | 45 | .value { 46 | text-align: right; 47 | } 48 | 49 | .string { 50 | text-align: left; 51 | } 52 | 53 | .graph-button { 54 | cursor: pointer; 55 | vertical-align: middle; 56 | } 57 | -------------------------------------------------------------------------------- /examples/Basic.hs: -------------------------------------------------------------------------------- 1 | {-# LANGUAGE OverloadedStrings #-} 2 | 3 | -- | Example program that continously computes the mean of a list of 4 | -- numbers. 5 | module Main where 6 | 7 | import Control.Concurrent 8 | import Control.Exception 9 | import Data.List 10 | import Data.Time.Clock.POSIX (getPOSIXTime) 11 | import qualified System.Metrics.Distribution as Distribution 12 | import qualified System.Metrics.Counter as Counter 13 | import qualified System.Metrics.Label as Label 14 | import System.Remote.Monitoring 15 | 16 | -- 'sum' is using a non-strict lazy fold and will blow the stack. 17 | sum' :: Num a => [a] -> a 18 | sum' = foldl' (+) 0 19 | 20 | mean :: Fractional a => [a] -> a 21 | mean xs = sum' xs / fromIntegral (length xs) 22 | 23 | main :: IO () 24 | main = do 25 | handle <- forkServer "localhost" 8000 26 | counter <- getCounter "iterations" handle 27 | label <- getLabel "args" handle 28 | event <- getDistribution "runtime" handle 29 | Label.set label "some text string" 30 | let loop n = do 31 | t <- timed $ evaluate $ mean [1..n] 32 | Distribution.add event t 33 | threadDelay 2000 34 | Counter.inc counter 35 | loop n 36 | loop 1000000 37 | 38 | timed :: IO a -> IO Double 39 | timed m = do 40 | start <- getTime 41 | m 42 | end <- getTime 43 | return $! end - start 44 | 45 | getTime :: IO Double 46 | getTime = realToFrac `fmap` getPOSIXTime 47 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c)2011, Johan Tibell 2 | 3 | All rights reserved. 4 | 5 | Redistribution and use in source and binary forms, with or without 6 | modification, are permitted provided that the following conditions are met: 7 | 8 | * Redistributions of source code must retain the above copyright 9 | notice, this list of conditions and the following disclaimer. 10 | 11 | * Redistributions in binary form must reproduce the above 12 | copyright notice, this list of conditions and the following 13 | disclaimer in the documentation and/or other materials provided 14 | with the distribution. 15 | 16 | * Neither the name of Johan Tibell nor the names of other 17 | contributors may be used to endorse or promote products derived 18 | from this software without specific prior written permission. 19 | 20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21 | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22 | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 23 | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 24 | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 25 | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 26 | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27 | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28 | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 30 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # EKG: Remote monitoring of running processes over HTTP [![Hackage version](https://img.shields.io/hackage/v/ekg.svg?label=Hackage)](https://hackage.haskell.org/package/ekg) [![Build status](https://github.com/l0negamer/ekg/actions/workflows/haskell-ci.yml/badge.svg)](https://github.com/l0negamer/ekg/actions/workflows/haskell-ci.yml) 2 | 3 | This library lets you remotely monitor a running process over HTTP. 4 | It provides a simple way to integrate a monitoring server into any 5 | application. 6 | 7 | # Getting started 8 | 9 | Adding monitoring to your application is simple. Just launch the 10 | monitoring server as soon as your application starts 11 | 12 | import System.Remote.Monitoring 13 | 14 | main = do 15 | forkServer "localhost" 8000 16 | ... 17 | 18 | and then visit [http://localhost:8000/](http://localhost:8000/) in 19 | your web browser. 20 | 21 | To make full use out of this module you must first enable GC 22 | statistics collection in the run-time system. To enable GC 23 | statistics collection, either run your program with 24 | 25 | > +RTS -T 26 | 27 | or compile it with 28 | 29 | > -with-rtsopts=-T 30 | 31 | The runtime overhead of `-T` is very small so it's safe to always 32 | leave it enabled. 33 | 34 | # JSON API 35 | 36 | The monitoring server also lets you to retrieve the stats as JSON. 37 | Simply send the server an HTTP GET request with the Accept header set 38 | to "application/json": 39 | 40 | curl -H "Accept: application/json" http://localhost:8000/ 41 | 42 | You can use the JSON API to e.g. write applications that monitor other 43 | applications. 44 | 45 | # Get involved! 46 | 47 | Please report bugs via the 48 | [GitHub issue tracker](https://github.com/l0negamer/ekg/issues). 49 | 50 | Master [git repository](https://github.com/l0negamer/ekg): 51 | 52 | git clone https://github.com/l0negamer/ekg.git 53 | -------------------------------------------------------------------------------- /ekg.cabal: -------------------------------------------------------------------------------- 1 | name: ekg 2 | version: 0.4.1.2 3 | cabal-version: >=1.10 4 | synopsis: Remote monitoring of processes 5 | description: 6 | This library lets you remotely monitor a running process over HTTP. 7 | It provides a simple way to integrate a monitoring server into any 8 | application. 9 | 10 | homepage: https://github.com/l0negamer/ekg 11 | bug-reports: https://github.com/l0negamer/ekg/issues 12 | license: BSD3 13 | license-file: LICENSE 14 | author: Johan Tibell 15 | maintainer: 16 | Johan Tibell , 17 | Mikhail Glushenkov 18 | 19 | category: System, Network 20 | build-type: Simple 21 | data-files: 22 | assets/bootstrap-1.4.0.min.css 23 | assets/chart_line_add.png 24 | assets/cross.png 25 | assets/index.html 26 | assets/jquery-1.6.4.min.js 27 | assets/jquery.flot.min.js 28 | assets/monitor.css 29 | assets/monitor.js 30 | 31 | extra-source-files: 32 | assets/bootstrap-1.4.0.css 33 | assets/jquery-1.6.4.js 34 | assets/jquery.flot.js 35 | CHANGES.md 36 | examples/Basic.hs 37 | LICENSE.icons 38 | LICENSE.javascript 39 | README.md 40 | 41 | tested-with: 42 | GHC ==8.0.2 43 | || ==8.2.2 44 | || ==8.4.4 45 | || ==8.6.5 46 | || ==8.8.3 47 | || ==8.10.7 48 | || ==9.0.2 49 | || ==9.2.8 50 | || ==9.4.8 51 | || ==9.6.4 52 | || ==9.6.6 53 | || ==9.8.2 54 | || ==9.10.1 55 | || ==9.12.2 56 | 57 | library 58 | exposed-modules: 59 | System.Remote.Counter 60 | System.Remote.Gauge 61 | System.Remote.Label 62 | System.Remote.Monitoring 63 | 64 | other-modules: 65 | Paths_ekg 66 | System.Remote.Json 67 | System.Remote.Snap 68 | 69 | build-depends: 70 | aeson >=0.4 && <1.6 || >=2.0 && <2.3 71 | , base >=4.5 && <4.22 72 | , bytestring <1.0 73 | , ekg-core >=0.1 && <0.2 74 | , ekg-json >=0.1 && <0.2 75 | , filepath <1.6 76 | , network <3.3 77 | , snap-core <1.1 78 | , snap-server <1.2 79 | , text <2.2 80 | , time <1.15 81 | , transformers <0.7 82 | , unordered-containers <0.3 83 | 84 | ghc-options: -Wall 85 | default-language: Haskell2010 86 | 87 | source-repository head 88 | type: git 89 | location: https://github.com/l0negamer/ekg.git 90 | -------------------------------------------------------------------------------- /assets/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ekg 10 | 11 | 12 |
13 |
14 |
15 | ekg 16 |

Polling interval: 17 | | 26 | 27 |

28 |
29 |
30 |
31 | 32 |
33 |
34 |
35 |

Lost connection to server.

36 |
37 |
38 | 39 |
40 |
41 |
42 |

Current residency

43 |
44 |
45 | 46 |
47 |

Allocation rate

48 |
49 |
50 | 51 |
52 |

Productivity

53 |
54 |
55 |
56 | 57 |
58 |

GC and memory statistics

59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 |
StatisticValue
Maximum residency0
Current residency0
Maximum slop0
Current slop0
Productivity (wall clock time)0
Productivity (cpu time)0
Allocation rate0
97 | 98 |

Metrics

99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 |
NameValue
109 | 110 |
111 |
112 |
113 | 114 | 115 | 116 | 117 | -------------------------------------------------------------------------------- /CHANGES.md: -------------------------------------------------------------------------------- 1 | ## 0.4.1.2 (2025-04-22) 2 | * Support GHC 9.12 3 | 4 | ## 0.4.1.1 (2024-10-27) 5 | * Support GHC 9.10 6 | 7 | ## 0.4.1.0 (2024-07-31) 8 | 9 | * Support various newer GHCs by expanding bounds. 10 | 11 | ## 0.4.0.16 (2020-??-??) 12 | 13 | * TBD. 14 | 15 | ## 0.4.0.15 (2018-03-20) 16 | 17 | * GHC 8.4 support. 18 | * Fixed a syntax error in the .cabal file. 19 | 20 | ## 0.4.0.14 (2017-07-31) 21 | 22 | * GHC 8.2 support. 23 | 24 | ## 0.4.0.13 (2017-04-19) 25 | 26 | * Support aeson 1.2. 27 | 28 | * Down throw ThreadKilled exception back to the thread that killed us. 29 | 30 | ## 0.4.0.11 (2016-09-14) 31 | 32 | * Support aeson 1.0. 33 | 34 | ## 0.4.0.10 (2016-05-28) 35 | 36 | * GHC 8.0 support. 37 | 38 | ## 0.4.0.8 (2015-07-32) 39 | 40 | * Move the JSON encoding into a separate ekg-json package. 41 | 42 | ## 0.4.0.7 (2015-07-07) 43 | 44 | * Support aeson-0.9. 45 | 46 | ## 0.4.0.6 (2015-05-08) 47 | 48 | * Support GHC 7.10. 49 | 50 | * Re-raise exceptions in the server thread in the main thread. 51 | 52 | * Improve Windows support. 53 | 54 | ## 0.4.0.5 (2014-11-30) 55 | 56 | * Support network-2.6. 57 | 58 | * Fix broken example code. 59 | 60 | ## 0.4.0.4 (2014-10-20) 61 | 62 | * Fix bug where `forkServerWith` would register GC metrics, despite 63 | the docs saying that it doesn't. 64 | 65 | * Fix example code that broke in the package split. 66 | 67 | ## 0.4.0.3 (2014-09-30) 68 | 69 | * Support text-1.2. 70 | 71 | ## 0.4.0.2 (2014-08-19) 72 | 73 | * Support aeson-0.8 and transformers-0.4. 74 | * Include original bootstrap source in tarball. 75 | 76 | ## 0.4.0.1 (2014-07-12) 77 | 78 | * Fix JS bug which led to type errors for distribution metrics. 79 | 80 | ## 0.4.0.0 (2014-05-01) 81 | 82 | * Lots of the internals were split off into a new package, ekg-core. 83 | 84 | * The `Gauge.modify` function was removed, as it can't be supported 85 | by the new, more efficient implementation of gauges. 86 | 87 | * The JSON API was significantly overhauled. The the Haddock 88 | documentation for details. 89 | 90 | * The metric store used internally by the server is now exposed and 91 | can be used to share the same metric store between ekg and e.g. 92 | ekg-statsd. 93 | 94 | * It's now possible to provide a custom metric store to the server. 95 | 96 | * The getDistribution function was added. 97 | 98 | * The UI now has less special treatment for built-in metrics. 99 | 100 | ## 0.3.1.3 (2013-02-22) 101 | 102 | * Fixed security issue where ekg would always listen to all incoming 103 | requests, even if "localhost" was specified. 104 | 105 | * Always export par_tot_bytes_copied. Previously it was only exported 106 | if using base-4.6 and later. 107 | 108 | ## 0.3.1.2 (2012-09-18) 109 | 110 | * Support GHC 7.6 111 | 112 | ## 0.3.1.1 (2012-06-25) 113 | 114 | * Bump dependencies. 115 | 116 | ## 0.3.1.0 (2012-04-17) 117 | 118 | * Add labels, which are free-form string values exported by the 119 | monitoring server. Labels allow you to export e.g. the command 120 | line arguments used to start the executable or the host name it's 121 | running on. 122 | 123 | ## 0.3.0.4 (2012-04-03) 124 | 125 | * Add original JavaScript files to tarball to ease distribution 126 | packaging. 127 | 128 | ## 0.3.0.4 (2012-04-03) 129 | 130 | * Change icons to Creative Commons Attribution 3.0 licensed one 131 | 132 | ## 0.3.0.3 (2012-03-19) 133 | 134 | * Support Snap 0.8 135 | 136 | ## 0.3.0.2 (2012-03-07) 137 | 138 | * Don't require an internet connection, by serving Bootstrap CSS and 139 | jQuery from the monitoring server. 140 | 141 | ## 0.3.0.1 (2012-01-26) 142 | 143 | * Switch from Blueprint to Bootstrap CSS 144 | 145 | * Overhaul look-and-feel 146 | 147 | ## 0.3.0.0 (2012-01-01) 148 | 149 | * Add gauges and change counters to always be monotonically increasing 150 | 151 | * Add web interface column headers 152 | 153 | * Reorganize the web interface to show counters and gauges in separate sections 154 | 155 | * Change REST API to allow separate access to counters and gauges 156 | 157 | * Return the server time in the JSON response it and use server time 158 | instead of client time when graphing 159 | 160 | * Make it possible to graph user-defined counters and gauges 161 | 162 | * Format numbers using comma separators 163 | 164 | * Show a message box when the server can't be reached 165 | 166 | ## 0.2.0.0 (2011-12-30) 167 | 168 | * Add user-defined counters 169 | 170 | * Suppress Snap logging to stdio 171 | 172 | * Add REST-style API for accessing single counters 173 | 174 | ## 0.1.0.0 (2011-12-27) 175 | 176 | * First EKG release 177 | -------------------------------------------------------------------------------- /System/Remote/Snap.hs: -------------------------------------------------------------------------------- 1 | {-# LANGUAGE OverloadedStrings #-} 2 | 3 | module System.Remote.Snap 4 | ( startServer 5 | ) where 6 | 7 | import Control.Applicative ((<$>), (<|>)) 8 | import Control.Exception (throwIO) 9 | import Control.Monad.IO.Class (liftIO) 10 | import qualified Data.ByteString as S 11 | import qualified Data.ByteString.Char8 as S8 12 | import Data.Function (on) 13 | import qualified Data.HashMap.Strict as M 14 | import qualified Data.List as List 15 | import qualified Data.Text.Encoding as T 16 | import Data.Word (Word8) 17 | import Network.Socket (NameInfoFlag(NI_NUMERICHOST), addrAddress, getAddrInfo, 18 | getNameInfo) 19 | import Paths_ekg (getDataDir) 20 | import Prelude hiding (read) 21 | import Snap.Core (MonadSnap, Request, Snap, finishWith, getHeader, getRequest, 22 | getResponse, method, Method(GET), modifyResponse, pass, 23 | rqPathInfo, setContentType, setResponseStatus, 24 | writeLBS) 25 | import Snap.Http.Server (httpServe) 26 | import qualified Snap.Http.Server.Config as Config 27 | import Snap.Util.FileServe (serveDirectory) 28 | import System.FilePath (()) 29 | 30 | import System.Metrics 31 | import System.Remote.Json 32 | 33 | ------------------------------------------------------------------------ 34 | 35 | -- | Convert a host name (e.g. \"localhost\" or \"127.0.0.1\") to a 36 | -- numeric host address (e.g. \"127.0.0.1\"). 37 | getNumericHostAddress :: S.ByteString -> IO S.ByteString 38 | getNumericHostAddress host = do 39 | ais <- getAddrInfo Nothing (Just (S8.unpack host)) Nothing 40 | case ais of 41 | [] -> unsupportedAddressError 42 | (ai:_) -> do 43 | ni <- getNameInfo [NI_NUMERICHOST] True False (addrAddress ai) 44 | case ni of 45 | (Just numericHost, _) -> return $! S8.pack numericHost 46 | _ -> unsupportedAddressError 47 | where 48 | unsupportedAddressError = throwIO $ 49 | userError $ "unsupported address: " ++ S8.unpack host 50 | 51 | startServer :: Store 52 | -> Maybe S.ByteString -- ^ Host to listen on (e.g. \"localhost\") 53 | -> Int -- ^ Port to listen on (e.g. 8000) 54 | -> IO () 55 | startServer store m_host port = do 56 | -- Snap doesn't allow for non-numeric host names in 57 | -- 'Snap.setBind'. We work around that limitation by converting a 58 | -- possible non-numeric host name to a numeric address. 59 | setBind <- case m_host of 60 | Just host -> do 61 | numericHost <- getNumericHostAddress host 62 | return $ Config.setHostname host . Config.setBind numericHost 63 | Nothing -> return id 64 | let conf = Config.setVerbose False $ 65 | Config.setErrorLog Config.ConfigNoLog $ 66 | Config.setAccessLog Config.ConfigNoLog $ 67 | Config.setPort port $ 68 | setBind $ 69 | Config.defaultConfig 70 | httpServe conf (monitor store) 71 | 72 | -- | A handler that can be installed into an existing Snap application. 73 | monitor :: Store -> Snap () 74 | monitor store = do 75 | dataDir <- liftIO getDataDir 76 | (jsonHandler $ serve store) 77 | <|> serveDirectory (dataDir "assets") 78 | where 79 | jsonHandler = wrapHandler "application/json" 80 | wrapHandler fmt handler = method GET $ format fmt $ handler 81 | 82 | -- | The Accept header of the request. 83 | acceptHeader :: Request -> Maybe S.ByteString 84 | acceptHeader req = getHeader "Accept" req 85 | 86 | -- | Runs a Snap monad action only if the request's Accept header 87 | -- matches the given MIME type. 88 | format :: MonadSnap m => S.ByteString -> m a -> m a 89 | format fmt action = do 90 | req <- getRequest 91 | let acceptHdr = (List.head . parseHttpAccept) <$> acceptHeader req 92 | case acceptHdr of 93 | Just hdr | hdr == fmt -> action 94 | _ -> pass 95 | 96 | -- | Serve all counter, gauges and labels, built-in or not, as a 97 | -- nested JSON object. 98 | serve :: MonadSnap m => Store -> m () 99 | serve store = do 100 | req <- getRequest 101 | modifyResponse $ setContentType "application/json" 102 | if S.null (rqPathInfo req) 103 | then serveAll 104 | else serveOne (rqPathInfo req) 105 | where 106 | serveAll = do 107 | metrics <- liftIO $ sampleAll store 108 | writeLBS $ encodeAll metrics 109 | serveOne pathInfo = do 110 | let segments = S8.split '/' pathInfo 111 | nameBytes = S8.intercalate "." segments 112 | case T.decodeUtf8' nameBytes of 113 | Left _ -> do 114 | modifyResponse $ setResponseStatus 400 "Bad Request" 115 | r <- getResponse 116 | finishWith r 117 | Right name -> do 118 | metrics <- liftIO $ sampleAll store 119 | case M.lookup name metrics of 120 | Nothing -> pass 121 | Just metric -> writeLBS $ encodeOne metric 122 | 123 | ------------------------------------------------------------------------ 124 | -- Utilities for working with accept headers 125 | 126 | -- | Parse the HTTP accept string to determine supported content types. 127 | parseHttpAccept :: S.ByteString -> [S.ByteString] 128 | parseHttpAccept = List.map fst 129 | . List.sortBy (rcompare `on` snd) 130 | . List.map grabQ 131 | . S.split 44 -- comma 132 | where 133 | rcompare :: Double -> Double -> Ordering 134 | rcompare = flip compare 135 | grabQ s = 136 | let (s', q) = breakDiscard 59 s -- semicolon 137 | (_, q') = breakDiscard 61 q -- equals sign 138 | in (trimWhite s', readQ $ trimWhite q') 139 | readQ s = case reads $ S8.unpack s of 140 | (x, _):_ -> x 141 | _ -> 1.0 142 | trimWhite = S.dropWhile (== 32) -- space 143 | 144 | breakDiscard :: Word8 -> S.ByteString -> (S.ByteString, S.ByteString) 145 | breakDiscard w s = 146 | let (x, y) = S.break (== w) s 147 | in (x, S.drop 1 y) 148 | -------------------------------------------------------------------------------- /.github/workflows/haskell-ci.yml: -------------------------------------------------------------------------------- 1 | # This GitHub workflow config has been generated by a script via 2 | # 3 | # haskell-ci 'github' 'ekg.cabal' 4 | # 5 | # To regenerate the script (for example after adjusting tested-with) run 6 | # 7 | # haskell-ci regenerate 8 | # 9 | # For more information, see https://github.com/haskell-CI/haskell-ci 10 | # 11 | # version: 0.19.20250330 12 | # 13 | # REGENDATA ("0.19.20250330",["github","ekg.cabal"]) 14 | # 15 | name: Haskell-CI 16 | on: 17 | - push 18 | - pull_request 19 | jobs: 20 | linux: 21 | name: Haskell-CI - Linux - ${{ matrix.compiler }} 22 | runs-on: ubuntu-24.04 23 | timeout-minutes: 24 | 60 25 | container: 26 | image: buildpack-deps:jammy 27 | continue-on-error: ${{ matrix.allow-failure }} 28 | strategy: 29 | matrix: 30 | include: 31 | - compiler: ghc-9.12.2 32 | compilerKind: ghc 33 | compilerVersion: 9.12.2 34 | setup-method: ghcup 35 | allow-failure: false 36 | - compiler: ghc-9.10.1 37 | compilerKind: ghc 38 | compilerVersion: 9.10.1 39 | setup-method: ghcup 40 | allow-failure: false 41 | - compiler: ghc-9.8.2 42 | compilerKind: ghc 43 | compilerVersion: 9.8.2 44 | setup-method: ghcup 45 | allow-failure: false 46 | - compiler: ghc-9.6.6 47 | compilerKind: ghc 48 | compilerVersion: 9.6.6 49 | setup-method: ghcup 50 | allow-failure: false 51 | - compiler: ghc-9.6.4 52 | compilerKind: ghc 53 | compilerVersion: 9.6.4 54 | setup-method: ghcup 55 | allow-failure: false 56 | - compiler: ghc-9.4.8 57 | compilerKind: ghc 58 | compilerVersion: 9.4.8 59 | setup-method: ghcup 60 | allow-failure: false 61 | - compiler: ghc-9.2.8 62 | compilerKind: ghc 63 | compilerVersion: 9.2.8 64 | setup-method: ghcup 65 | allow-failure: false 66 | - compiler: ghc-9.0.2 67 | compilerKind: ghc 68 | compilerVersion: 9.0.2 69 | setup-method: ghcup 70 | allow-failure: false 71 | - compiler: ghc-8.10.7 72 | compilerKind: ghc 73 | compilerVersion: 8.10.7 74 | setup-method: ghcup 75 | allow-failure: false 76 | - compiler: ghc-8.8.3 77 | compilerKind: ghc 78 | compilerVersion: 8.8.3 79 | setup-method: ghcup 80 | allow-failure: false 81 | - compiler: ghc-8.6.5 82 | compilerKind: ghc 83 | compilerVersion: 8.6.5 84 | setup-method: ghcup 85 | allow-failure: false 86 | - compiler: ghc-8.4.4 87 | compilerKind: ghc 88 | compilerVersion: 8.4.4 89 | setup-method: ghcup 90 | allow-failure: false 91 | - compiler: ghc-8.2.2 92 | compilerKind: ghc 93 | compilerVersion: 8.2.2 94 | setup-method: ghcup 95 | allow-failure: false 96 | - compiler: ghc-8.0.2 97 | compilerKind: ghc 98 | compilerVersion: 8.0.2 99 | setup-method: ghcup 100 | allow-failure: false 101 | fail-fast: false 102 | steps: 103 | - name: apt-get install 104 | run: | 105 | apt-get update 106 | apt-get install -y --no-install-recommends gnupg ca-certificates dirmngr curl git software-properties-common libtinfo5 libnuma-dev 107 | - name: Install GHCup 108 | run: | 109 | mkdir -p "$HOME/.ghcup/bin" 110 | curl -sL https://downloads.haskell.org/ghcup/0.1.50.1/x86_64-linux-ghcup-0.1.50.1 > "$HOME/.ghcup/bin/ghcup" 111 | chmod a+x "$HOME/.ghcup/bin/ghcup" 112 | - name: Install cabal-install 113 | run: | 114 | "$HOME/.ghcup/bin/ghcup" install cabal 3.14.1.1-p1 || (cat "$HOME"/.ghcup/logs/*.* && false) 115 | echo "CABAL=$HOME/.ghcup/bin/cabal-3.14.1.1-p1 -vnormal+nowrap" >> "$GITHUB_ENV" 116 | - name: Install GHC (GHCup) 117 | if: matrix.setup-method == 'ghcup' 118 | run: | 119 | "$HOME/.ghcup/bin/ghcup" install ghc "$HCVER" || (cat "$HOME"/.ghcup/logs/*.* && false) 120 | HC=$("$HOME/.ghcup/bin/ghcup" whereis ghc "$HCVER") 121 | HCPKG=$(echo "$HC" | sed 's#ghc$#ghc-pkg#') 122 | HADDOCK=$(echo "$HC" | sed 's#ghc$#haddock#') 123 | echo "HC=$HC" >> "$GITHUB_ENV" 124 | echo "HCPKG=$HCPKG" >> "$GITHUB_ENV" 125 | echo "HADDOCK=$HADDOCK" >> "$GITHUB_ENV" 126 | env: 127 | HCKIND: ${{ matrix.compilerKind }} 128 | HCNAME: ${{ matrix.compiler }} 129 | HCVER: ${{ matrix.compilerVersion }} 130 | - name: Set PATH and environment variables 131 | run: | 132 | echo "$HOME/.cabal/bin" >> $GITHUB_PATH 133 | echo "LANG=C.UTF-8" >> "$GITHUB_ENV" 134 | echo "CABAL_DIR=$HOME/.cabal" >> "$GITHUB_ENV" 135 | echo "CABAL_CONFIG=$HOME/.cabal/config" >> "$GITHUB_ENV" 136 | HCNUMVER=$(${HC} --numeric-version|perl -ne '/^(\d+)\.(\d+)\.(\d+)(\.(\d+))?$/; print(10000 * $1 + 100 * $2 + ($3 == 0 ? $5 != 1 : $3))') 137 | echo "HCNUMVER=$HCNUMVER" >> "$GITHUB_ENV" 138 | echo "ARG_TESTS=--enable-tests" >> "$GITHUB_ENV" 139 | echo "ARG_BENCH=--enable-benchmarks" >> "$GITHUB_ENV" 140 | echo "HEADHACKAGE=false" >> "$GITHUB_ENV" 141 | echo "ARG_COMPILER=--$HCKIND --with-compiler=$HC" >> "$GITHUB_ENV" 142 | env: 143 | HCKIND: ${{ matrix.compilerKind }} 144 | HCNAME: ${{ matrix.compiler }} 145 | HCVER: ${{ matrix.compilerVersion }} 146 | - name: env 147 | run: | 148 | env 149 | - name: write cabal config 150 | run: | 151 | mkdir -p $CABAL_DIR 152 | cat >> $CABAL_CONFIG <> $CABAL_CONFIG < cabal-plan.xz 185 | echo 'f62ccb2971567a5f638f2005ad3173dba14693a45154c1508645c52289714cb2 cabal-plan.xz' | sha256sum -c - 186 | xz -d < cabal-plan.xz > $HOME/.cabal/bin/cabal-plan 187 | rm -f cabal-plan.xz 188 | chmod a+x $HOME/.cabal/bin/cabal-plan 189 | cabal-plan --version 190 | - name: checkout 191 | uses: actions/checkout@v4 192 | with: 193 | path: source 194 | - name: initial cabal.project for sdist 195 | run: | 196 | touch cabal.project 197 | echo "packages: $GITHUB_WORKSPACE/source/." >> cabal.project 198 | cat cabal.project 199 | - name: sdist 200 | run: | 201 | mkdir -p sdist 202 | $CABAL sdist all --output-dir $GITHUB_WORKSPACE/sdist 203 | - name: unpack 204 | run: | 205 | mkdir -p unpacked 206 | find sdist -maxdepth 1 -type f -name '*.tar.gz' -exec tar -C $GITHUB_WORKSPACE/unpacked -xzvf {} \; 207 | - name: generate cabal.project 208 | run: | 209 | PKGDIR_ekg="$(find "$GITHUB_WORKSPACE/unpacked" -maxdepth 1 -type d -regex '.*/ekg-[0-9.]*')" 210 | echo "PKGDIR_ekg=${PKGDIR_ekg}" >> "$GITHUB_ENV" 211 | rm -f cabal.project cabal.project.local 212 | touch cabal.project 213 | touch cabal.project.local 214 | echo "packages: ${PKGDIR_ekg}" >> cabal.project 215 | if [ $((HCNUMVER >= 80200)) -ne 0 ] ; then echo "package ekg" >> cabal.project ; fi 216 | if [ $((HCNUMVER >= 80200)) -ne 0 ] ; then echo " ghc-options: -Werror=missing-methods" >> cabal.project ; fi 217 | cat >> cabal.project <> cabal.project.local 220 | cat cabal.project 221 | cat cabal.project.local 222 | - name: dump install plan 223 | run: | 224 | $CABAL v2-build $ARG_COMPILER $ARG_TESTS $ARG_BENCH --dry-run all 225 | cabal-plan 226 | - name: restore cache 227 | uses: actions/cache/restore@v4 228 | with: 229 | key: ${{ runner.os }}-${{ matrix.compiler }}-${{ github.sha }} 230 | path: ~/.cabal/store 231 | restore-keys: ${{ runner.os }}-${{ matrix.compiler }}- 232 | - name: install dependencies 233 | run: | 234 | $CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks --dependencies-only -j2 all 235 | $CABAL v2-build $ARG_COMPILER $ARG_TESTS $ARG_BENCH --dependencies-only -j2 all 236 | - name: build w/o tests 237 | run: | 238 | $CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks all 239 | - name: build 240 | run: | 241 | $CABAL v2-build $ARG_COMPILER $ARG_TESTS $ARG_BENCH all --write-ghc-environment-files=always 242 | - name: cabal check 243 | run: | 244 | cd ${PKGDIR_ekg} || false 245 | ${CABAL} -vnormal check 246 | - name: haddock 247 | run: | 248 | $CABAL v2-haddock --disable-documentation --haddock-all $ARG_COMPILER --with-haddock $HADDOCK $ARG_TESTS $ARG_BENCH all 249 | - name: unconstrained build 250 | run: | 251 | rm -f cabal.project.local 252 | $CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks all 253 | - name: save cache 254 | if: always() 255 | uses: actions/cache/save@v4 256 | with: 257 | key: ${{ runner.os }}-${{ matrix.compiler }}-${{ github.sha }} 258 | path: ~/.cabal/store 259 | -------------------------------------------------------------------------------- /System/Remote/Monitoring.hs: -------------------------------------------------------------------------------- 1 | {-# LANGUAGE CPP, OverloadedStrings #-} 2 | 3 | -- | This module provides remote monitoring of a running process over 4 | -- HTTP. It can be used to run an HTTP server that provides both a 5 | -- web-based user interface and a machine-readable API (e.g. JSON.) 6 | -- The former can be used by a human to get an overview of what the 7 | -- program is doing and the latter can be used by automated monitoring 8 | -- tools. 9 | -- 10 | -- Typical usage is to start the monitoring server at program startup 11 | -- 12 | -- > main = do 13 | -- > forkServer "localhost" 8000 14 | -- > ... 15 | -- 16 | -- and then periodically check the stats using a web browser or a 17 | -- command line tool (e.g. curl) 18 | -- 19 | -- > $ curl -H "Accept: application/json" http://localhost:8000/ 20 | module System.Remote.Monitoring 21 | ( 22 | -- * Required configuration 23 | -- $configuration 24 | 25 | -- * Security considerations 26 | -- $security 27 | 28 | -- * REST API 29 | -- $api 30 | 31 | -- * The monitoring server 32 | Server 33 | , serverThreadId 34 | , serverMetricStore 35 | , forkServer 36 | , forkServerNoHostname 37 | , forkServerWith 38 | , forkServerNoHostnameWith 39 | 40 | -- * Defining metrics 41 | -- $userdefined 42 | , getCounter 43 | , getGauge 44 | , getLabel 45 | , getDistribution 46 | ) where 47 | 48 | import Control.Concurrent (ThreadId, myThreadId, throwTo) 49 | import Control.Exception (AsyncException(ThreadKilled), fromException) 50 | import qualified Data.ByteString as S 51 | import Data.Int (Int64) 52 | import qualified Data.Text as T 53 | import Data.Time.Clock.POSIX (getPOSIXTime) 54 | import Prelude hiding (read) 55 | 56 | import qualified System.Metrics as Metrics 57 | import qualified System.Metrics.Counter as Counter 58 | import qualified System.Metrics.Distribution as Distribution 59 | import qualified System.Metrics.Gauge as Gauge 60 | import qualified System.Metrics.Label as Label 61 | import System.Remote.Snap 62 | import Network.Socket (withSocketsDo) 63 | 64 | #if __GLASGOW_HASKELL__ >= 706 65 | import Control.Concurrent (forkFinally) 66 | #else 67 | import Control.Concurrent (forkIO) 68 | import Control.Exception (SomeException, mask, try) 69 | #endif 70 | 71 | -- $configuration 72 | -- 73 | -- To make full use out of this module you must first enable GC 74 | -- statistics collection in the run-time system. To enable GC 75 | -- statistics collection, either run your program with 76 | -- 77 | -- > +RTS -T 78 | -- 79 | -- or compile it with 80 | -- 81 | -- > -with-rtsopts=-T 82 | -- 83 | -- The runtime overhead of @-T@ is very small so it's safe to always 84 | -- leave it enabled. 85 | 86 | -- $security 87 | -- Be aware that if the server started by 'forkServer' is not bound to 88 | -- \"localhost\" (or equivalent) anyone on the network can access the 89 | -- monitoring server. Either make sure the network is secure or bind 90 | -- the server to \"localhost\". 91 | 92 | -- $api 93 | -- To use the machine-readable REST API, send an HTTP GET request to 94 | -- the host and port passed to 'forkServer'. 95 | -- 96 | -- The API is versioned to allow for API evolution. This document is 97 | -- for version 1. To ensure you're using this version, append @?v=1@ 98 | -- to your resource URLs. Omitting the version number will give you 99 | -- the latest version of the API. 100 | -- 101 | -- The following resources (i.e. URLs) are available: 102 | -- 103 | -- [\/] JSON object containing all metrics. Metrics are stored as 104 | -- nested objects, with one new object layer per \".\" in the metric 105 | -- name (see example below.) Content types: \"text\/html\" (default), 106 | -- \"application\/json\" 107 | -- 108 | -- [\/\/\] JSON object for a single metric. The 109 | -- metric name is created by converting all \"\/\" to \".\". Example: 110 | -- \"\/foo\/bar\" corresponds to the metric \"foo.bar\". Content 111 | -- types: \"application\/json\" 112 | -- 113 | -- Each metric is returned as an object containing a @type@ field. Available types 114 | -- are: 115 | -- 116 | -- * \"c\" - 'Counter.Counter' 117 | -- 118 | -- * \"g\" - 'Gauge.Gauge' 119 | -- 120 | -- * \"l\" - 'Label.Label' 121 | -- 122 | -- * \"d\" - 'Distribution.Distribution' 123 | -- 124 | -- In addition to the @type@ field, there are metric specific fields: 125 | -- 126 | -- * Counters, gauges, and labels: the @val@ field contains the 127 | -- actual value (i.e. an integer or a string). 128 | -- 129 | -- * Distributions: the @mean@, @variance@, @count@, @sum@, @min@, 130 | -- and @max@ fields contain their statistical equivalents. 131 | -- 132 | -- Example of a response containing the metrics \"myapp.visitors\" and 133 | -- \"myapp.args\": 134 | -- 135 | -- > { 136 | -- > "myapp": { 137 | -- > "visitors": { 138 | -- > "val": 10, 139 | -- > "type": "c" 140 | -- > }, 141 | -- > "args": { 142 | -- > "val": "--a-flag", 143 | -- > "type": "l" 144 | -- > } 145 | -- > } 146 | -- > } 147 | 148 | -- $userdefined 149 | -- The monitoring server can store and serve integer-valued counters 150 | -- and gauges, string-valued labels, and statistical distributions. A 151 | -- counter is a monotonically increasing value (e.g. TCP connections 152 | -- established since program start.) A gauge is a variable value (e.g. 153 | -- the current number of concurrent connections.) A label is a 154 | -- free-form string value (e.g. exporting the command line arguments 155 | -- or host name.) A distribution is a statistic summary of events 156 | -- (e.g. processing time per request.) Each metric is associated with 157 | -- a name, which is used when it is displayed in the UI or returned in 158 | -- a JSON object. 159 | -- 160 | -- Metrics share the same namespace so it's not possible to create 161 | -- e.g. a counter and a gauge with the same. Attempting to do so will 162 | -- result in an 'error'. 163 | -- 164 | -- To create and use a counter, simply call 'getCounter' to create it 165 | -- and then call e.g. 'Counter.inc' or 'Counter.add' to modify its 166 | -- value. Example: 167 | -- 168 | -- > main = do 169 | -- > handle <- forkServer "localhost" 8000 170 | -- > counter <- getCounter "iterations" handle 171 | -- > let loop n = do 172 | -- > inc counter 173 | -- > loop 174 | -- > loop 175 | -- 176 | -- To create a gauge, use 'getGauge' instead of 'getCounter' and then 177 | -- call e.g. 'System.Remote.Gauge.set'. Similar for the other metric 178 | -- types. 179 | -- 180 | -- It's also possible to register metrics directly using the 181 | -- @System.Metrics@ module in the ekg-core package. This gives you a 182 | -- bit more control over how metric values are retrieved. 183 | 184 | ------------------------------------------------------------------------ 185 | -- * The monitoring server 186 | 187 | -- | A handle that can be used to control the monitoring server. 188 | -- Created by 'forkServer'. 189 | data Server = Server { 190 | -- | The thread ID of the server. You can kill the server by 191 | -- killing this thread (i.e. by throwing it an asynchronous 192 | -- exception.) 193 | serverThreadId :: {-# UNPACK #-} !ThreadId 194 | 195 | -- | The metric store associated with the server. If you want to 196 | -- add metric to the default store created by 'forkServer' you 197 | -- need to use this function to retrieve it. 198 | , serverMetricStore :: {-# UNPACK #-} !Metrics.Store 199 | } 200 | 201 | -- | Like 'forkServerWith', but creates a default metric store with 202 | -- some predefined metrics. The predefined metrics are those given in 203 | -- 'System.Metrics.registerGcMetrics'. 204 | forkServer :: S.ByteString -- ^ Host to listen on (e.g. \"localhost\") 205 | -> Int -- ^ Port to listen on (e.g. 8000) 206 | -> IO Server 207 | forkServer host port = do 208 | store <- Metrics.newStore 209 | Metrics.registerGcMetrics store 210 | forkServerMaybeHostnameWith store (Just host) port 211 | 212 | -- | Create a server with prefined metrics from 213 | -- 'System.Metrics.registerGcMetrics', listening on all interfaces. 214 | -- If you are running EKG on a private network (including virtual 215 | -- private network), it may be appropriate to bind to all interfaces, 216 | -- not only localhost. 217 | forkServerNoHostname :: Int -- ^ Port to listen on (e.g. 8000) 218 | -> IO Server 219 | forkServerNoHostname port = do 220 | store <- Metrics.newStore 221 | Metrics.registerGcMetrics store 222 | forkServerMaybeHostnameWith store Nothing port 223 | 224 | -- | Start an HTTP server in a new thread. The server replies to GET 225 | -- requests to the given host and port. The host argument can be 226 | -- either a numeric network address (dotted quad for IPv4, 227 | -- colon-separated hex for IPv6) or a hostname (e.g. \"localhost\".) 228 | -- The client can control the Content-Type used in responses by 229 | -- setting the Accept header. At the moment two content types are 230 | -- available: \"application\/json\" and \"text\/html\". 231 | -- 232 | -- Registers the following counter, used by the UI: 233 | -- 234 | -- [@ekg.server_time_ms@] The server time when the sample was taken, 235 | -- in milliseconds. 236 | -- 237 | -- Note that this function, unlike 'forkServer', doesn't register any 238 | -- other predefined metrics. This allows other libraries to create and 239 | -- provide a metric store for use with this library. If the metric 240 | -- store isn't created by you and the creator doesn't register the 241 | -- metrics registered by 'forkServer', you might want to register them 242 | -- yourself. 243 | forkServerWith :: Metrics.Store -- ^ Metric store 244 | -> S.ByteString -- ^ Host to listen on (e.g. \"localhost\") 245 | -> Int -- ^ Port to listen on (e.g. 8000) 246 | -> IO Server 247 | forkServerWith store host port = 248 | forkServerMaybeHostnameWith store (Just host) port 249 | 250 | -- | Start an HTTP server in a new thread, with the specified metrics 251 | -- store, listening on all interfaces. Other than accepting requests 252 | -- to any hostname, this is the same as `forkServerWith`. 253 | forkServerNoHostnameWith :: Metrics.Store -- ^ Metric store 254 | -> Int -- ^ Port to listen on (e.g. 8000) 255 | -> IO Server 256 | forkServerNoHostnameWith store port = 257 | forkServerMaybeHostnameWith store Nothing port 258 | 259 | forkServerMaybeHostnameWith :: Metrics.Store -- ^ Metric store 260 | -> Maybe S.ByteString -- ^ Host to listen on (e.g. \"localhost\") 261 | -> Int -- ^ Port to listen on (e.g. 8000) 262 | -> IO Server 263 | forkServerMaybeHostnameWith store host port = do 264 | Metrics.registerCounter "ekg.server_timestamp_ms" getTimeMs store 265 | me <- myThreadId 266 | tid <- withSocketsDo $ forkFinally (startServer store host port) $ \ r -> 267 | case r of 268 | Right _ -> return () 269 | Left e -> case fromException e of 270 | Just ThreadKilled -> return () 271 | _ -> throwTo me e 272 | return $! Server tid store 273 | where 274 | getTimeMs :: IO Int64 275 | getTimeMs = (round . (* 1000)) `fmap` getPOSIXTime 276 | 277 | ------------------------------------------------------------------------ 278 | -- * Defining metrics 279 | 280 | -- | Return a new, zero-initialized counter associated with the given 281 | -- name and server. Multiple calls to 'getCounter' with the same 282 | -- arguments will result in an 'error'. 283 | getCounter :: T.Text -- ^ Counter name 284 | -> Server -- ^ Server that will serve the counter 285 | -> IO Counter.Counter 286 | getCounter name server = Metrics.createCounter name (serverMetricStore server) 287 | 288 | -- | Return a new, zero-initialized gauge associated with the given 289 | -- name and server. Multiple calls to 'getGauge' with the same 290 | -- arguments will result in an 'error'. 291 | getGauge :: T.Text -- ^ Gauge name 292 | -> Server -- ^ Server that will serve the gauge 293 | -> IO Gauge.Gauge 294 | getGauge name server = Metrics.createGauge name (serverMetricStore server) 295 | 296 | -- | Return a new, empty label associated with the given name and 297 | -- server. Multiple calls to 'getLabel' with the same arguments will 298 | -- result in an 'error'. 299 | getLabel :: T.Text -- ^ Label name 300 | -> Server -- ^ Server that will serve the label 301 | -> IO Label.Label 302 | getLabel name server = Metrics.createLabel name (serverMetricStore server) 303 | 304 | -- | Return a new distribution associated with the given name and 305 | -- server. Multiple calls to 'getDistribution' with the same arguments 306 | -- will result in an 'error'. 307 | getDistribution :: T.Text -- ^ Distribution name 308 | -> Server -- ^ Server that will serve the distribution 309 | -> IO Distribution.Distribution 310 | getDistribution name server = 311 | Metrics.createDistribution name (serverMetricStore server) 312 | 313 | ------------------------------------------------------------------------ 314 | -- Backwards compatibility shims 315 | 316 | #if __GLASGOW_HASKELL__ < 706 317 | forkFinally :: IO a -> (Either SomeException a -> IO ()) -> IO ThreadId 318 | forkFinally action and_then = 319 | mask $ \restore -> 320 | forkIO $ try (restore action) >>= and_then 321 | #endif 322 | -------------------------------------------------------------------------------- /assets/monitor.js: -------------------------------------------------------------------------------- 1 | $(document).ready(function () { 2 | "use strict"; 3 | 4 | // Number formatters 5 | function commaify(n) 6 | { 7 | var nStr = n.toString(); 8 | var x = nStr.split('.'); 9 | var x1 = x[0]; 10 | var x2 = x.length > 1 ? '.' + x[1] : ''; 11 | var rgx = /(\d+)(\d{3})/; 12 | while (rgx.test(x1)) { 13 | x1 = x1.replace(rgx, '$1' + ',' + '$2'); 14 | } 15 | return x1 + x2; 16 | } 17 | 18 | function formatSuffix(val, opt_prec) { 19 | if (val === null) { 20 | return "N/A"; 21 | } 22 | 23 | var prec = opt_prec || 1; 24 | if (val >= 1000000000) { 25 | return (val / 1000000000).toFixed(prec) + " GB"; 26 | } else if (val >= 1000000) { 27 | return (val / 1000000).toFixed(prec) + " MB"; 28 | } else if (val >= 1000) { 29 | return (val / 1000).toFixed(prec) + " kB"; 30 | } else { 31 | return val.toFixed(prec) + " B"; 32 | } 33 | } 34 | 35 | function formatRate(val, prec) { 36 | if (val === null) { 37 | return "N/A"; 38 | } 39 | 40 | return formatSuffix(val, prec) + "/s"; 41 | } 42 | 43 | function formatPercent(val, opt_prec) { 44 | if (val === null) { 45 | return "N/A"; 46 | } 47 | 48 | var prec = opt_prec || 1; 49 | return val.toFixed(prec) + " %"; 50 | } 51 | 52 | // Set up polling interval control 53 | var updateInterval = 1000; // ms 54 | $("#updateInterval").val(updateInterval).change(function () { 55 | updateInterval = $(this).val(); 56 | }); 57 | 58 | // Allow the UI to be paused 59 | var paused = false; 60 | $('#pause-ui').click(function () { 61 | if (paused) { 62 | $(this).text("Pause UI"); 63 | paused = false; 64 | } else { 65 | $(this).text("Unpause UI"); 66 | paused = true; 67 | } 68 | }); 69 | 70 | // Plot formatters 71 | function suffixFormatter(val, axis) { 72 | return formatSuffix(val, axis.tickDecimals); 73 | } 74 | 75 | function suffixFormatterGeneric(val, axis) { 76 | if (val >= 1000000000) { 77 | return (val / 1000000000).toFixed(axis.tickDecimals) + " G"; 78 | } else if (val >= 1000000) { 79 | return (val / 1000000).toFixed(axis.tickDecimals) + " M"; 80 | } else if (val >= 1000) { 81 | return (val / 1000).toFixed(axis.tickDecimals) + " k"; 82 | } else { 83 | return val.toFixed(axis.tickDecimals); 84 | } 85 | } 86 | 87 | function rateFormatter(val, axis) { 88 | return formatRate(val, axis.tickDecimals); 89 | } 90 | 91 | function percentFormatter(val, axis) { 92 | return formatPercent(val, axis.tickDecimals); 93 | } 94 | 95 | // Fetch data periodically and notify interested parties. 96 | var listeners = []; 97 | 98 | function subscribe(fn) { 99 | listeners.push(fn); 100 | } 101 | 102 | function unsubscribe(fn) { 103 | listeners = listeners.filter(function (el) { 104 | if (el !== fn) { 105 | return el; 106 | } 107 | }); 108 | } 109 | 110 | var alertVisible = false; 111 | function fetchData() { 112 | function onDataReceived(stats) { 113 | if (alertVisible) { 114 | $(".alert-message").hide(); 115 | } 116 | alertVisible = false; 117 | for (var i = 0; i < listeners.length; i++) { 118 | listeners[i](stats, stats.ekg.server_timestamp_ms.val); 119 | } 120 | } 121 | 122 | function onError() { 123 | $(".alert-message").show(); 124 | alertVisible = true; 125 | } 126 | 127 | $.ajax({ 128 | dataType: 'json', 129 | success: onDataReceived, 130 | error: onError, 131 | cache: false 132 | }); 133 | 134 | setTimeout(fetchData, updateInterval); 135 | } 136 | fetchData(); 137 | 138 | function addPlot(elem, series, opts) { 139 | var defaultOptions = { 140 | series: { shadowSize: 0 }, // drawing is faster without shadows 141 | xaxis: { mode: "time", tickSize: [10, "second"] } 142 | }; 143 | var options = $.extend(true, {}, defaultOptions, opts); 144 | var data = new Array(series.length); 145 | var maxPoints = 60; 146 | for(var i = 0; i < series.length; i++) { 147 | data[i] = []; 148 | } 149 | 150 | var plot = $.plot(elem, [], options); 151 | 152 | var prev_stats, prev_time; 153 | function onDataReceived(stats, time) { 154 | for(var i = 0; i < series.length; i++) { 155 | if (data[i].length >= maxPoints) { 156 | data[i] = data[i].slice(1); 157 | } 158 | 159 | data[i].push([time, series[i].fn(stats, time, 160 | prev_stats, prev_time)]); 161 | 162 | // the data may arrive out-of-order, so sort by time stamp first 163 | data[i].sort(function (a, b) { return a[0] - b[0]; }); 164 | } 165 | 166 | // zip legends with data 167 | var res = []; 168 | for(var i = 0; i < series.length; i++) 169 | res.push({ label: series[i].label, data: data[i] }); 170 | 171 | if (!paused) { 172 | plot.setData(res); 173 | plot.setupGrid(); 174 | plot.draw(); 175 | } 176 | prev_stats = stats; 177 | prev_time = time; 178 | } 179 | 180 | subscribe(onDataReceived); 181 | return onDataReceived; 182 | } 183 | 184 | function addCounter(elem, fn, formatter) { 185 | var prev_stats, prev_time; 186 | function onDataReceived(stats, time) { 187 | if (!paused) 188 | elem.text(formatter(fn(stats, time, prev_stats, prev_time))); 189 | prev_stats = stats; 190 | prev_time = time; 191 | } 192 | 193 | subscribe(onDataReceived); 194 | } 195 | 196 | function addDynamicPlot(key, button, graph_fn, label_fn) { 197 | function getStats(stats, time, prev_stats, prev_time) { 198 | return graph_fn(key, stats, time, prev_stats, prev_time); 199 | } 200 | 201 | // jQuery has problem with IDs containing dots. 202 | var plotId = key.replace(/\./g, "-") + "-plot"; 203 | $("#plots:last").append( 204 | '
' + 205 | '

' + key + 206 | '

'); 207 | var plot = $("#plots > .plot-container:last > div"); 208 | var observer = addPlot(plot, 209 | [{ label: label_fn(key), fn: getStats }], 210 | { yaxis: { tickFormatter: suffixFormatterGeneric } }); 211 | 212 | var plotContainer = $("#" + plotId); 213 | var closeButton = plotContainer.find("img"); 214 | closeButton.hide(); 215 | closeButton.click(function () { 216 | plotContainer.remove(); 217 | button.show(); 218 | unsubscribe(observer); 219 | }); 220 | 221 | plotContainer.hover( 222 | function () { 223 | closeButton.show(); 224 | }, 225 | function () { 226 | closeButton.hide(); 227 | } 228 | ); 229 | } 230 | 231 | function addMetrics(table) { 232 | var COUNTER = "c"; 233 | var GAUGE = "g"; 234 | var DISTRIBUTION = "d"; 235 | var metrics = {}; 236 | 237 | function makeDataGetter(key) { 238 | var pieces = key.split("."); 239 | function get(key, stats, time, prev_stats, prev_time) { 240 | var value = stats; 241 | $.each(pieces, function(unused_index, piece) { 242 | value = value[piece]; 243 | }); 244 | if (value.type === COUNTER) { 245 | if (prev_stats == undefined) 246 | return null; 247 | var prev_value = prev_stats; 248 | $.each(pieces, function(unused_index, piece) { 249 | prev_value = prev_value[piece]; 250 | }); 251 | return 1000 * (value.val - prev_value.val) / 252 | (time - prev_time); 253 | } else if (value.type === DISTRIBUTION) { 254 | return value.mean; 255 | } else { // value.type === GAUGE || value.type === LABEL 256 | return value.val; 257 | } 258 | } 259 | return get; 260 | } 261 | 262 | function counterLabel(label) { 263 | return label + "/s"; 264 | } 265 | 266 | function gaugeLabel(label) { 267 | return label; 268 | } 269 | 270 | /** Adds the table row. */ 271 | function addElem(key, value) { 272 | var elem; 273 | if (key in metrics) { 274 | elem = metrics[key]; 275 | } else { 276 | // Add UI element 277 | table.find("tbody:last").append( 278 | '' + key + 279 | ' Add graph' + 282 | 'N/A'); 283 | elem = table.find("tbody > tr > td:last"); 284 | metrics[key] = elem; 285 | 286 | var button = table.find("tbody > tr:last > td:first > img"); 287 | var graph_fn = makeDataGetter(key); 288 | var label_fn = gaugeLabel; 289 | if (value.type === COUNTER) { 290 | label_fn = counterLabel; 291 | } 292 | button.click(function () { 293 | addDynamicPlot(key, button, graph_fn, label_fn); 294 | $(this).hide(); 295 | }); 296 | } 297 | if (!paused) { 298 | if (value.type === DISTRIBUTION) { 299 | if (value.mean !== null) { 300 | var val = value.mean.toPrecision(8) + '\n+/-' + 301 | Math.sqrt(value.variance).toPrecision(8) + ' sd'; 302 | } 303 | else { 304 | var val = "N/A"; 305 | } 306 | } else { // COUNTER, GAUGE, LABEL 307 | var val = value.val; 308 | } 309 | if ($.inArray(value.type, [COUNTER, GAUGE]) !== -1) { 310 | val = commaify(val); 311 | } 312 | elem.text(val); 313 | } 314 | } 315 | 316 | /** Updates UI for all metrics. */ 317 | function onDataReceived(stats, time) { 318 | function build(prefix, obj) { 319 | $.each(obj, function (suffix, value) { 320 | if (value.hasOwnProperty("type")) { 321 | var key = prefix + suffix; 322 | addElem(key, value); 323 | } else { 324 | build(prefix + suffix + '.', value); 325 | } 326 | }); 327 | } 328 | build('', stats); 329 | } 330 | 331 | subscribe(onDataReceived); 332 | } 333 | 334 | function initAll() { 335 | // Metrics 336 | var current_bytes_used = function (stats) { 337 | return stats.rts.gc.current_bytes_used.val; 338 | }; 339 | var max_bytes_used = function (stats) { 340 | return stats.rts.gc.max_bytes_used.val; 341 | }; 342 | var max_bytes_slop = function (stats) { 343 | return stats.rts.gc.max_bytes_slop.val; 344 | }; 345 | var current_bytes_slop = function (stats) { 346 | return stats.rts.gc.current_bytes_slop.val; 347 | }; 348 | var productivity_wall_percent = function (stats, time, prev_stats, prev_time) { 349 | if (prev_stats == undefined) 350 | return null; 351 | var mutator_ms = stats.rts.gc.mutator_wall_ms.val - 352 | prev_stats.rts.gc.mutator_wall_ms.val; 353 | var gc_ms = stats.rts.gc.gc_wall_ms.val - 354 | prev_stats.rts.gc.gc_wall_ms.val; 355 | return 100 * mutator_ms / (mutator_ms + gc_ms); 356 | }; 357 | var productivity_cpu_percent = function (stats, time, prev_stats, prev_time) { 358 | if (prev_stats == undefined) 359 | return null; 360 | var mutator_ms = stats.rts.gc.mutator_cpu_ms.val - 361 | prev_stats.rts.gc.mutator_cpu_ms.val; 362 | var gc_ms = stats.rts.gc.gc_cpu_ms.val - 363 | prev_stats.rts.gc.gc_cpu_ms.val; 364 | return 100 * mutator_ms / (mutator_ms + gc_ms); 365 | }; 366 | var allocation_rate = function (stats, time, prev_stats, prev_time) { 367 | if (prev_stats == undefined) 368 | return null; 369 | return 1000 * (stats.rts.gc.bytes_allocated.val - 370 | prev_stats.rts.gc.bytes_allocated.val) / 371 | (time - prev_time); 372 | }; 373 | 374 | addMetrics($("#metric-table")); 375 | 376 | // Plots 377 | addPlot($("#current-bytes-used-plot > div"), 378 | [{ label: "residency", fn: current_bytes_used }], 379 | { yaxis: { tickFormatter: suffixFormatter } }); 380 | addPlot($("#allocation-rate-plot > div"), 381 | [{ label: "rate", fn: allocation_rate }], 382 | { yaxis: { tickFormatter: rateFormatter } }); 383 | addPlot($("#productivity-plot > div"), 384 | [{ label: "wall clock time", fn: productivity_wall_percent }, 385 | { label: "cpu time", fn: productivity_cpu_percent }], 386 | { yaxis: { tickDecimals: 1, tickFormatter: percentFormatter } }); 387 | 388 | // GC and memory statistics 389 | addCounter($("#max-bytes-used"), max_bytes_used, formatSuffix); 390 | addCounter($("#current-bytes-used"), current_bytes_used, formatSuffix); 391 | addCounter($("#max-bytes-slop"), max_bytes_slop, formatSuffix); 392 | addCounter($("#current-bytes-slop"), current_bytes_slop, formatSuffix); 393 | addCounter($("#productivity-wall"), productivity_wall_percent, formatPercent); 394 | addCounter($("#productivity-cpu"), productivity_cpu_percent, formatPercent); 395 | addCounter($("#allocation-rate"), allocation_rate, formatRate); 396 | } 397 | 398 | initAll(); 399 | }); 400 | -------------------------------------------------------------------------------- /assets/jquery.flot.min.js: -------------------------------------------------------------------------------- 1 | /* Javascript plotting library for jQuery, v. 0.7. 2 | * 3 | * Released under the MIT license by IOLA, December 2007. 4 | * 5 | */ 6 | (function(b){b.color={};b.color.make=function(d,e,g,f){var c={};c.r=d||0;c.g=e||0;c.b=g||0;c.a=f!=null?f:1;c.add=function(h,j){for(var k=0;k=1){return"rgb("+[c.r,c.g,c.b].join(",")+")"}else{return"rgba("+[c.r,c.g,c.b,c.a].join(",")+")"}};c.normalize=function(){function h(k,j,l){return jl?l:j)}c.r=h(0,parseInt(c.r),255);c.g=h(0,parseInt(c.g),255);c.b=h(0,parseInt(c.b),255);c.a=h(0,c.a,1);return c};c.clone=function(){return b.color.make(c.r,c.b,c.g,c.a)};return c.normalize()};b.color.extract=function(d,e){var c;do{c=d.css(e).toLowerCase();if(c!=""&&c!="transparent"){break}d=d.parent()}while(!b.nodeName(d.get(0),"body"));if(c=="rgba(0, 0, 0, 0)"){c="transparent"}return b.color.parse(c)};b.color.parse=function(c){var d,f=b.color.make;if(d=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(c)){return f(parseInt(d[1],10),parseInt(d[2],10),parseInt(d[3],10))}if(d=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(c)){return f(parseInt(d[1],10),parseInt(d[2],10),parseInt(d[3],10),parseFloat(d[4]))}if(d=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(c)){return f(parseFloat(d[1])*2.55,parseFloat(d[2])*2.55,parseFloat(d[3])*2.55)}if(d=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(c)){return f(parseFloat(d[1])*2.55,parseFloat(d[2])*2.55,parseFloat(d[3])*2.55,parseFloat(d[4]))}if(d=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(c)){return f(parseInt(d[1],16),parseInt(d[2],16),parseInt(d[3],16))}if(d=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(c)){return f(parseInt(d[1]+d[1],16),parseInt(d[2]+d[2],16),parseInt(d[3]+d[3],16))}var e=b.trim(c).toLowerCase();if(e=="transparent"){return f(255,255,255,0)}else{d=a[e]||[0,0,0];return f(d[0],d[1],d[2])}};var a={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(jQuery);(function(c){function b(av,ai,J,af){var Q=[],O={colors:["#edc240","#afd8f8","#cb4b4b","#4da74d","#9440ed"],legend:{show:true,noColumns:1,labelFormatter:null,labelBoxBorderColor:"#ccc",container:null,position:"ne",margin:5,backgroundColor:null,backgroundOpacity:0.85},xaxis:{show:null,position:"bottom",mode:null,color:null,tickColor:null,transform:null,inverseTransform:null,min:null,max:null,autoscaleMargin:null,ticks:null,tickFormatter:null,labelWidth:null,labelHeight:null,reserveSpace:null,tickLength:null,alignTicksWithAxis:null,tickDecimals:null,tickSize:null,minTickSize:null,monthNames:null,timeformat:null,twelveHourClock:false},yaxis:{autoscaleMargin:0.02,position:"left"},xaxes:[],yaxes:[],series:{points:{show:false,radius:3,lineWidth:2,fill:true,fillColor:"#ffffff",symbol:"circle"},lines:{lineWidth:2,fill:false,fillColor:null,steps:false},bars:{show:false,lineWidth:2,barWidth:1,fill:true,fillColor:null,align:"left",horizontal:false},shadowSize:3},grid:{show:true,aboveData:false,color:"#545454",backgroundColor:null,borderColor:null,tickColor:null,labelMargin:5,axisMargin:8,borderWidth:2,minBorderMargin:null,markings:null,markingsColor:"#f4f4f4",markingsLineWidth:2,clickable:false,hoverable:false,autoHighlight:true,mouseActiveRadius:10},hooks:{}},az=null,ad=null,y=null,H=null,A=null,p=[],aw=[],q={left:0,right:0,top:0,bottom:0},G=0,I=0,h=0,w=0,ak={processOptions:[],processRawData:[],processDatapoints:[],drawSeries:[],draw:[],bindEvents:[],drawOverlay:[],shutdown:[]},aq=this;aq.setData=aj;aq.setupGrid=t;aq.draw=W;aq.getPlaceholder=function(){return av};aq.getCanvas=function(){return az};aq.getPlotOffset=function(){return q};aq.width=function(){return h};aq.height=function(){return w};aq.offset=function(){var aB=y.offset();aB.left+=q.left;aB.top+=q.top;return aB};aq.getData=function(){return Q};aq.getAxes=function(){var aC={},aB;c.each(p.concat(aw),function(aD,aE){if(aE){aC[aE.direction+(aE.n!=1?aE.n:"")+"axis"]=aE}});return aC};aq.getXAxes=function(){return p};aq.getYAxes=function(){return aw};aq.c2p=C;aq.p2c=ar;aq.getOptions=function(){return O};aq.highlight=x;aq.unhighlight=T;aq.triggerRedrawOverlay=f;aq.pointOffset=function(aB){return{left:parseInt(p[aA(aB,"x")-1].p2c(+aB.x)+q.left),top:parseInt(aw[aA(aB,"y")-1].p2c(+aB.y)+q.top)}};aq.shutdown=ag;aq.resize=function(){B();g(az);g(ad)};aq.hooks=ak;F(aq);Z(J);X();aj(ai);t();W();ah();function an(aD,aB){aB=[aq].concat(aB);for(var aC=0;aC=O.colors.length){aG=0;++aF}}var aH=0,aN;for(aG=0;aGa3.datamax&&a1!=aB){a3.datamax=a1}}c.each(m(),function(a1,a2){a2.datamin=aO;a2.datamax=aI;a2.used=false});for(aU=0;aU0&&aT[aR-aP]!=null&&aT[aR-aP]!=aT[aR]&&aT[aR-aP+1]!=aT[aR+1]){for(aN=0;aNaM){aM=a0}}if(aX.y){if(a0aV){aV=a0}}}}if(aJ.bars.show){var aY=aJ.bars.align=="left"?0:-aJ.bars.barWidth/2;if(aJ.bars.horizontal){aQ+=aY;aV+=aY+aJ.bars.barWidth}else{aK+=aY;aM+=aY+aJ.bars.barWidth}}aF(aJ.xaxis,aK,aM);aF(aJ.yaxis,aQ,aV)}c.each(m(),function(a1,a2){if(a2.datamin==aO){a2.datamin=null}if(a2.datamax==aI){a2.datamax=null}})}function j(aB,aC){var aD=document.createElement("canvas");aD.className=aC;aD.width=G;aD.height=I;if(!aB){c(aD).css({position:"absolute",left:0,top:0})}c(aD).appendTo(av);if(!aD.getContext){aD=window.G_vmlCanvasManager.initElement(aD)}aD.getContext("2d").save();return aD}function B(){G=av.width();I=av.height();if(G<=0||I<=0){throw"Invalid dimensions for plot, width = "+G+", height = "+I}}function g(aC){if(aC.width!=G){aC.width=G}if(aC.height!=I){aC.height=I}var aB=aC.getContext("2d");aB.restore();aB.save()}function X(){var aC,aB=av.children("canvas.base"),aD=av.children("canvas.overlay");if(aB.length==0||aD==0){av.html("");av.css({padding:0});if(av.css("position")=="static"){av.css("position","relative")}B();az=j(true,"base");ad=j(false,"overlay");aC=false}else{az=aB.get(0);ad=aD.get(0);aC=true}H=az.getContext("2d");A=ad.getContext("2d");y=c([ad,az]);if(aC){av.data("plot").shutdown();aq.resize();A.clearRect(0,0,G,I);y.unbind();av.children().not([az,ad]).remove()}av.data("plot",aq)}function ah(){if(O.grid.hoverable){y.mousemove(aa);y.mouseleave(l)}if(O.grid.clickable){y.click(R)}an(ak.bindEvents,[y])}function ag(){if(M){clearTimeout(M)}y.unbind("mousemove",aa);y.unbind("mouseleave",l);y.unbind("click",R);an(ak.shutdown,[y])}function r(aG){function aC(aH){return aH}var aF,aB,aD=aG.options.transform||aC,aE=aG.options.inverseTransform;if(aG.direction=="x"){aF=aG.scale=h/Math.abs(aD(aG.max)-aD(aG.min));aB=Math.min(aD(aG.max),aD(aG.min))}else{aF=aG.scale=w/Math.abs(aD(aG.max)-aD(aG.min));aF=-aF;aB=Math.max(aD(aG.max),aD(aG.min))}if(aD==aC){aG.p2c=function(aH){return(aH-aB)*aF}}else{aG.p2c=function(aH){return(aD(aH)-aB)*aF}}if(!aE){aG.c2p=function(aH){return aB+aH/aF}}else{aG.c2p=function(aH){return aE(aB+aH/aF)}}}function L(aD){var aB=aD.options,aF,aJ=aD.ticks||[],aI=[],aE,aK=aB.labelWidth,aG=aB.labelHeight,aC;function aH(aM,aL){return c('
'+aM.join("")+"
").appendTo(av)}if(aD.direction=="x"){if(aK==null){aK=Math.floor(G/(aJ.length>0?aJ.length:1))}if(aG==null){aI=[];for(aF=0;aF'+aE+"")}}if(aI.length>0){aI.push('
');aC=aH(aI,"width:10000px;");aG=aC.height();aC.remove()}}}else{if(aK==null||aG==null){for(aF=0;aF'+aE+"")}}if(aI.length>0){aC=aH(aI,"");if(aK==null){aK=aC.children().width()}if(aG==null){aG=aC.find("div.tickLabel").height()}aC.remove()}}}if(aK==null){aK=0}if(aG==null){aG=0}aD.labelWidth=aK;aD.labelHeight=aG}function au(aD){var aC=aD.labelWidth,aL=aD.labelHeight,aH=aD.options.position,aF=aD.options.tickLength,aG=O.grid.axisMargin,aJ=O.grid.labelMargin,aK=aD.direction=="x"?p:aw,aE;var aB=c.grep(aK,function(aN){return aN&&aN.options.position==aH&&aN.reserveSpace});if(c.inArray(aD,aB)==aB.length-1){aG=0}if(aF==null){aF="full"}var aI=c.grep(aK,function(aN){return aN&&aN.reserveSpace});var aM=c.inArray(aD,aI)==0;if(!aM&&aF=="full"){aF=5}if(!isNaN(+aF)){aJ+=+aF}if(aD.direction=="x"){aL+=aJ;if(aH=="bottom"){q.bottom+=aL+aG;aD.box={top:I-q.bottom,height:aL}}else{aD.box={top:q.top+aG,height:aL};q.top+=aL+aG}}else{aC+=aJ;if(aH=="left"){aD.box={left:q.left+aG,width:aC};q.left+=aC+aG}else{q.right+=aC+aG;aD.box={left:G-q.right,width:aC}}}aD.position=aH;aD.tickLength=aF;aD.box.padding=aJ;aD.innermost=aM}function U(aB){if(aB.direction=="x"){aB.box.left=q.left;aB.box.width=h}else{aB.box.top=q.top;aB.box.height=w}}function t(){var aC,aE=m();c.each(aE,function(aF,aG){aG.show=aG.options.show;if(aG.show==null){aG.show=aG.used}aG.reserveSpace=aG.show||aG.options.reserveSpace;n(aG)});allocatedAxes=c.grep(aE,function(aF){return aF.reserveSpace});q.left=q.right=q.top=q.bottom=0;if(O.grid.show){c.each(allocatedAxes,function(aF,aG){S(aG);P(aG);ap(aG,aG.ticks);L(aG)});for(aC=allocatedAxes.length-1;aC>=0;--aC){au(allocatedAxes[aC])}var aD=O.grid.minBorderMargin;if(aD==null){aD=0;for(aC=0;aC=0){aD=0}}if(aF.max==null){aB+=aH*aG;if(aB>0&&aE.datamax!=null&&aE.datamax<=0){aB=0}}}}aE.min=aD;aE.max=aB}function S(aG){var aM=aG.options;var aH;if(typeof aM.ticks=="number"&&aM.ticks>0){aH=aM.ticks}else{aH=0.3*Math.sqrt(aG.direction=="x"?G:I)}var aT=(aG.max-aG.min)/aH,aO,aB,aN,aR,aS,aQ,aI;if(aM.mode=="time"){var aJ={second:1000,minute:60*1000,hour:60*60*1000,day:24*60*60*1000,month:30*24*60*60*1000,year:365.2425*24*60*60*1000};var aK=[[1,"second"],[2,"second"],[5,"second"],[10,"second"],[30,"second"],[1,"minute"],[2,"minute"],[5,"minute"],[10,"minute"],[30,"minute"],[1,"hour"],[2,"hour"],[4,"hour"],[8,"hour"],[12,"hour"],[1,"day"],[2,"day"],[3,"day"],[0.25,"month"],[0.5,"month"],[1,"month"],[2,"month"],[3,"month"],[6,"month"],[1,"year"]];var aC=0;if(aM.minTickSize!=null){if(typeof aM.tickSize=="number"){aC=aM.tickSize}else{aC=aM.minTickSize[0]*aJ[aM.minTickSize[1]]}}for(var aS=0;aS=aC){break}}aO=aK[aS][0];aN=aK[aS][1];if(aN=="year"){aQ=Math.pow(10,Math.floor(Math.log(aT/aJ.year)/Math.LN10));aI=(aT/aJ.year)/aQ;if(aI<1.5){aO=1}else{if(aI<3){aO=2}else{if(aI<7.5){aO=5}else{aO=10}}}aO*=aQ}aG.tickSize=aM.tickSize||[aO,aN];aB=function(aX){var a2=[],a0=aX.tickSize[0],a3=aX.tickSize[1],a1=new Date(aX.min);var aW=a0*aJ[a3];if(a3=="second"){a1.setUTCSeconds(a(a1.getUTCSeconds(),a0))}if(a3=="minute"){a1.setUTCMinutes(a(a1.getUTCMinutes(),a0))}if(a3=="hour"){a1.setUTCHours(a(a1.getUTCHours(),a0))}if(a3=="month"){a1.setUTCMonth(a(a1.getUTCMonth(),a0))}if(a3=="year"){a1.setUTCFullYear(a(a1.getUTCFullYear(),a0))}a1.setUTCMilliseconds(0);if(aW>=aJ.minute){a1.setUTCSeconds(0)}if(aW>=aJ.hour){a1.setUTCMinutes(0)}if(aW>=aJ.day){a1.setUTCHours(0)}if(aW>=aJ.day*4){a1.setUTCDate(1)}if(aW>=aJ.year){a1.setUTCMonth(0)}var a5=0,a4=Number.NaN,aY;do{aY=a4;a4=a1.getTime();a2.push(a4);if(a3=="month"){if(a0<1){a1.setUTCDate(1);var aV=a1.getTime();a1.setUTCMonth(a1.getUTCMonth()+1);var aZ=a1.getTime();a1.setTime(a4+a5*aJ.hour+(aZ-aV)*a0);a5=a1.getUTCHours();a1.setUTCHours(0)}else{a1.setUTCMonth(a1.getUTCMonth()+a0)}}else{if(a3=="year"){a1.setUTCFullYear(a1.getUTCFullYear()+a0)}else{a1.setTime(a4+aW)}}}while(a4aU){aP=aU}aQ=Math.pow(10,-aP);aI=aT/aQ;if(aI<1.5){aO=1}else{if(aI<3){aO=2;if(aI>2.25&&(aU==null||aP+1<=aU)){aO=2.5;++aP}}else{if(aI<7.5){aO=5}else{aO=10}}}aO*=aQ;if(aM.minTickSize!=null&&aO0){if(aM.min==null){aG.min=Math.min(aG.min,aL[0])}if(aM.max==null&&aL.length>1){aG.max=Math.max(aG.max,aL[aL.length-1])}}aB=function(aX){var aY=[],aV,aW;for(aW=0;aW1&&/\..*0$/.test((aD[1]-aD[0]).toFixed(aE)))){aG.tickDecimals=aE}}}}aG.tickGenerator=aB;if(c.isFunction(aM.tickFormatter)){aG.tickFormatter=function(aV,aW){return""+aM.tickFormatter(aV,aW)}}else{aG.tickFormatter=aR}}function P(aF){var aH=aF.options.ticks,aG=[];if(aH==null||(typeof aH=="number"&&aH>0)){aG=aF.tickGenerator(aF)}else{if(aH){if(c.isFunction(aH)){aG=aH({min:aF.min,max:aF.max})}else{aG=aH}}}var aE,aB;aF.ticks=[];for(aE=0;aE1){aC=aD[1]}}else{aB=+aD}if(aC==null){aC=aF.tickFormatter(aB,aF)}if(!isNaN(aB)){aF.ticks.push({v:aB,label:aC})}}}function ap(aB,aC){if(aB.options.autoscaleMargin&&aC.length>0){if(aB.options.min==null){aB.min=Math.min(aB.min,aC[0].v)}if(aB.options.max==null&&aC.length>1){aB.max=Math.max(aB.max,aC[aC.length-1].v)}}}function W(){H.clearRect(0,0,G,I);var aC=O.grid;if(aC.show&&aC.backgroundColor){N()}if(aC.show&&!aC.aboveData){ac()}for(var aB=0;aBaG){var aC=aH;aH=aG;aG=aC}return{from:aH,to:aG,axis:aE}}function N(){H.save();H.translate(q.left,q.top);H.fillStyle=am(O.grid.backgroundColor,w,0,"rgba(255, 255, 255, 0)");H.fillRect(0,0,h,w);H.restore()}function ac(){var aF;H.save();H.translate(q.left,q.top);var aH=O.grid.markings;if(aH){if(c.isFunction(aH)){var aK=aq.getAxes();aK.xmin=aK.xaxis.min;aK.xmax=aK.xaxis.max;aK.ymin=aK.yaxis.min;aK.ymax=aK.yaxis.max;aH=aH(aK)}for(aF=0;aFaC.axis.max||aI.toaI.axis.max){continue}aC.from=Math.max(aC.from,aC.axis.min);aC.to=Math.min(aC.to,aC.axis.max);aI.from=Math.max(aI.from,aI.axis.min);aI.to=Math.min(aI.to,aI.axis.max);if(aC.from==aC.to&&aI.from==aI.to){continue}aC.from=aC.axis.p2c(aC.from);aC.to=aC.axis.p2c(aC.to);aI.from=aI.axis.p2c(aI.from);aI.to=aI.axis.p2c(aI.to);if(aC.from==aC.to||aI.from==aI.to){H.beginPath();H.strokeStyle=aD.color||O.grid.markingsColor;H.lineWidth=aD.lineWidth||O.grid.markingsLineWidth;H.moveTo(aC.from,aI.from);H.lineTo(aC.to,aI.to);H.stroke()}else{H.fillStyle=aD.color||O.grid.markingsColor;H.fillRect(aC.from,aI.to,aC.to-aC.from,aI.from-aI.to)}}}var aK=m(),aM=O.grid.borderWidth;for(var aE=0;aEaB.max||(aQ=="full"&&aM>0&&(aO==aB.min||aO==aB.max))){continue}if(aB.direction=="x"){aN=aB.p2c(aO);aJ=aQ=="full"?-w:aQ;if(aB.position=="top"){aJ=-aJ}}else{aL=aB.p2c(aO);aP=aQ=="full"?-h:aQ;if(aB.position=="left"){aP=-aP}}if(H.lineWidth==1){if(aB.direction=="x"){aN=Math.floor(aN)+0.5}else{aL=Math.floor(aL)+0.5}}H.moveTo(aN,aL);H.lineTo(aN+aP,aL+aJ)}H.stroke()}if(aM){H.lineWidth=aM;H.strokeStyle=O.grid.borderColor;H.strokeRect(-aM/2,-aM/2,h+aM,w+aM)}H.restore()}function k(){av.find(".tickLabels").remove();var aG=['
'];var aJ=m();for(var aD=0;aD');for(var aE=0;aEaC.max){continue}var aK={},aI;if(aC.direction=="x"){aI="center";aK.left=Math.round(q.left+aC.p2c(aH.v)-aC.labelWidth/2);if(aC.position=="bottom"){aK.top=aF.top+aF.padding}else{aK.bottom=I-(aF.top+aF.height-aF.padding)}}else{aK.top=Math.round(q.top+aC.p2c(aH.v)-aC.labelHeight/2);if(aC.position=="left"){aK.right=G-(aF.left+aF.width-aF.padding);aI="right"}else{aK.left=aF.left+aF.padding;aI="left"}}aK.width=aC.labelWidth;var aB=["position:absolute","text-align:"+aI];for(var aL in aK){aB.push(aL+":"+aK[aL]+"px")}aG.push('
'+aH.label+"
")}aG.push("
")}aG.push("");av.append(aG.join(""))}function d(aB){if(aB.lines.show){at(aB)}if(aB.bars.show){e(aB)}if(aB.points.show){ao(aB)}}function at(aE){function aD(aP,aQ,aI,aU,aT){var aV=aP.points,aJ=aP.pointsize,aN=null,aM=null;H.beginPath();for(var aO=aJ;aO=aR&&aS>aT.max){if(aR>aT.max){continue}aL=(aT.max-aS)/(aR-aS)*(aK-aL)+aL;aS=aT.max}else{if(aR>=aS&&aR>aT.max){if(aS>aT.max){continue}aK=(aT.max-aS)/(aR-aS)*(aK-aL)+aL;aR=aT.max}}if(aL<=aK&&aL=aK&&aL>aU.max){if(aK>aU.max){continue}aS=(aU.max-aL)/(aK-aL)*(aR-aS)+aS;aL=aU.max}else{if(aK>=aL&&aK>aU.max){if(aL>aU.max){continue}aR=(aU.max-aL)/(aK-aL)*(aR-aS)+aS;aK=aU.max}}if(aL!=aN||aS!=aM){H.moveTo(aU.p2c(aL)+aQ,aT.p2c(aS)+aI)}aN=aK;aM=aR;H.lineTo(aU.p2c(aK)+aQ,aT.p2c(aR)+aI)}H.stroke()}function aF(aI,aQ,aP){var aW=aI.points,aV=aI.pointsize,aN=Math.min(Math.max(0,aP.min),aP.max),aX=0,aU,aT=false,aM=1,aL=0,aR=0;while(true){if(aV>0&&aX>aW.length+aV){break}aX+=aV;var aZ=aW[aX-aV],aK=aW[aX-aV+aM],aY=aW[aX],aJ=aW[aX+aM];if(aT){if(aV>0&&aZ!=null&&aY==null){aR=aX;aV=-aV;aM=2;continue}if(aV<0&&aX==aL+aV){H.fill();aT=false;aV=-aV;aM=1;aX=aL=aR+aV;continue}}if(aZ==null||aY==null){continue}if(aZ<=aY&&aZ=aY&&aZ>aQ.max){if(aY>aQ.max){continue}aK=(aQ.max-aZ)/(aY-aZ)*(aJ-aK)+aK;aZ=aQ.max}else{if(aY>=aZ&&aY>aQ.max){if(aZ>aQ.max){continue}aJ=(aQ.max-aZ)/(aY-aZ)*(aJ-aK)+aK;aY=aQ.max}}if(!aT){H.beginPath();H.moveTo(aQ.p2c(aZ),aP.p2c(aN));aT=true}if(aK>=aP.max&&aJ>=aP.max){H.lineTo(aQ.p2c(aZ),aP.p2c(aP.max));H.lineTo(aQ.p2c(aY),aP.p2c(aP.max));continue}else{if(aK<=aP.min&&aJ<=aP.min){H.lineTo(aQ.p2c(aZ),aP.p2c(aP.min));H.lineTo(aQ.p2c(aY),aP.p2c(aP.min));continue}}var aO=aZ,aS=aY;if(aK<=aJ&&aK=aP.min){aZ=(aP.min-aK)/(aJ-aK)*(aY-aZ)+aZ;aK=aP.min}else{if(aJ<=aK&&aJ=aP.min){aY=(aP.min-aK)/(aJ-aK)*(aY-aZ)+aZ;aJ=aP.min}}if(aK>=aJ&&aK>aP.max&&aJ<=aP.max){aZ=(aP.max-aK)/(aJ-aK)*(aY-aZ)+aZ;aK=aP.max}else{if(aJ>=aK&&aJ>aP.max&&aK<=aP.max){aY=(aP.max-aK)/(aJ-aK)*(aY-aZ)+aZ;aJ=aP.max}}if(aZ!=aO){H.lineTo(aQ.p2c(aO),aP.p2c(aK))}H.lineTo(aQ.p2c(aZ),aP.p2c(aK));H.lineTo(aQ.p2c(aY),aP.p2c(aJ));if(aY!=aS){H.lineTo(aQ.p2c(aY),aP.p2c(aJ));H.lineTo(aQ.p2c(aS),aP.p2c(aJ))}}}H.save();H.translate(q.left,q.top);H.lineJoin="round";var aG=aE.lines.lineWidth,aB=aE.shadowSize;if(aG>0&&aB>0){H.lineWidth=aB;H.strokeStyle="rgba(0,0,0,0.1)";var aH=Math.PI/18;aD(aE.datapoints,Math.sin(aH)*(aG/2+aB/2),Math.cos(aH)*(aG/2+aB/2),aE.xaxis,aE.yaxis);H.lineWidth=aB/2;aD(aE.datapoints,Math.sin(aH)*(aG/2+aB/4),Math.cos(aH)*(aG/2+aB/4),aE.xaxis,aE.yaxis)}H.lineWidth=aG;H.strokeStyle=aE.color;var aC=ae(aE.lines,aE.color,0,w);if(aC){H.fillStyle=aC;aF(aE.datapoints,aE.xaxis,aE.yaxis)}if(aG>0){aD(aE.datapoints,0,0,aE.xaxis,aE.yaxis)}H.restore()}function ao(aE){function aH(aN,aM,aU,aK,aS,aT,aQ,aJ){var aR=aN.points,aI=aN.pointsize;for(var aL=0;aLaT.max||aOaQ.max){continue}H.beginPath();aP=aT.p2c(aP);aO=aQ.p2c(aO)+aK;if(aJ=="circle"){H.arc(aP,aO,aM,0,aS?Math.PI:Math.PI*2,false)}else{aJ(H,aP,aO,aM,aS)}H.closePath();if(aU){H.fillStyle=aU;H.fill()}H.stroke()}}H.save();H.translate(q.left,q.top);var aG=aE.points.lineWidth,aC=aE.shadowSize,aB=aE.points.radius,aF=aE.points.symbol;if(aG>0&&aC>0){var aD=aC/2;H.lineWidth=aD;H.strokeStyle="rgba(0,0,0,0.1)";aH(aE.datapoints,aB,null,aD+aD/2,true,aE.xaxis,aE.yaxis,aF);H.strokeStyle="rgba(0,0,0,0.2)";aH(aE.datapoints,aB,null,aD/2,true,aE.xaxis,aE.yaxis,aF)}H.lineWidth=aG;H.strokeStyle=aE.color;aH(aE.datapoints,aB,ae(aE.points,aE.color),0,false,aE.xaxis,aE.yaxis,aF);H.restore()}function E(aN,aM,aV,aI,aQ,aF,aD,aL,aK,aU,aR,aC){var aE,aT,aJ,aP,aG,aB,aO,aH,aS;if(aR){aH=aB=aO=true;aG=false;aE=aV;aT=aN;aP=aM+aI;aJ=aM+aQ;if(aTaL.max||aPaK.max){return}if(aEaL.max){aT=aL.max;aB=false}if(aJaK.max){aP=aK.max;aO=false}aE=aL.p2c(aE);aJ=aK.p2c(aJ);aT=aL.p2c(aT);aP=aK.p2c(aP);if(aD){aU.beginPath();aU.moveTo(aE,aJ);aU.lineTo(aE,aP);aU.lineTo(aT,aP);aU.lineTo(aT,aJ);aU.fillStyle=aD(aJ,aP);aU.fill()}if(aC>0&&(aG||aB||aO||aH)){aU.beginPath();aU.moveTo(aE,aJ+aF);if(aG){aU.lineTo(aE,aP+aF)}else{aU.moveTo(aE,aP+aF)}if(aO){aU.lineTo(aT,aP+aF)}else{aU.moveTo(aT,aP+aF)}if(aB){aU.lineTo(aT,aJ+aF)}else{aU.moveTo(aT,aJ+aF)}if(aH){aU.lineTo(aE,aJ+aF)}else{aU.moveTo(aE,aJ+aF)}aU.stroke()}}function e(aD){function aC(aJ,aI,aL,aG,aK,aN,aM){var aO=aJ.points,aF=aJ.pointsize;for(var aH=0;aH")}aH.push("");aF=true}if(aN){aJ=aN(aJ,aM)}aH.push('
'+aJ+"")}if(aF){aH.push("")}if(aH.length==0){return}var aL=''+aH.join("")+"
";if(O.legend.container!=null){c(O.legend.container).html(aL)}else{var aI="",aC=O.legend.position,aD=O.legend.margin;if(aD[0]==null){aD=[aD,aD]}if(aC.charAt(0)=="n"){aI+="top:"+(aD[1]+q.top)+"px;"}else{if(aC.charAt(0)=="s"){aI+="bottom:"+(aD[1]+q.bottom)+"px;"}}if(aC.charAt(1)=="e"){aI+="right:"+(aD[0]+q.right)+"px;"}else{if(aC.charAt(1)=="w"){aI+="left:"+(aD[0]+q.left)+"px;"}}var aK=c('
'+aL.replace('style="','style="position:absolute;'+aI+";")+"
").appendTo(av);if(O.legend.backgroundOpacity!=0){var aG=O.legend.backgroundColor;if(aG==null){aG=O.grid.backgroundColor;if(aG&&typeof aG=="string"){aG=c.color.parse(aG)}else{aG=c.color.extract(aK,"background-color")}aG.a=1;aG=aG.toString()}var aB=aK.children();c('
').prependTo(aK).css("opacity",O.legend.backgroundOpacity)}}}var ab=[],M=null;function K(aI,aG,aD){var aO=O.grid.mouseActiveRadius,a0=aO*aO+1,aY=null,aR=false,aW,aU;for(aW=Q.length-1;aW>=0;--aW){if(!aD(Q[aW])){continue}var aP=Q[aW],aH=aP.xaxis,aF=aP.yaxis,aV=aP.datapoints.points,aT=aP.datapoints.pointsize,aQ=aH.c2p(aI),aN=aF.c2p(aG),aC=aO/aH.scale,aB=aO/aF.scale;if(aH.options.inverseTransform){aC=Number.MAX_VALUE}if(aF.options.inverseTransform){aB=Number.MAX_VALUE}if(aP.lines.show||aP.points.show){for(aU=0;aUaC||aK-aQ<-aC||aJ-aN>aB||aJ-aN<-aB){continue}var aM=Math.abs(aH.p2c(aK)-aI),aL=Math.abs(aF.p2c(aJ)-aG),aS=aM*aM+aL*aL;if(aS=Math.min(aZ,aK)&&aN>=aJ+aE&&aN<=aJ+aX):(aQ>=aK+aE&&aQ<=aK+aX&&aN>=Math.min(aZ,aJ)&&aN<=Math.max(aZ,aJ))){aY=[aW,aU/aT]}}}}if(aY){aW=aY[0];aU=aY[1];aT=Q[aW].datapoints.pointsize;return{datapoint:Q[aW].datapoints.points.slice(aU*aT,(aU+1)*aT),dataIndex:aU,series:Q[aW],seriesIndex:aW}}return null}function aa(aB){if(O.grid.hoverable){u("plothover",aB,function(aC){return aC.hoverable!=false})}}function l(aB){if(O.grid.hoverable){u("plothover",aB,function(aC){return false})}}function R(aB){u("plotclick",aB,function(aC){return aC.clickable!=false})}function u(aC,aB,aD){var aE=y.offset(),aH=aB.pageX-aE.left-q.left,aF=aB.pageY-aE.top-q.top,aJ=C({left:aH,top:aF});aJ.pageX=aB.pageX;aJ.pageY=aB.pageY;var aK=K(aH,aF,aD);if(aK){aK.pageX=parseInt(aK.series.xaxis.p2c(aK.datapoint[0])+aE.left+q.left);aK.pageY=parseInt(aK.series.yaxis.p2c(aK.datapoint[1])+aE.top+q.top)}if(O.grid.autoHighlight){for(var aG=0;aGaH.max||aIaG.max){return}var aF=aE.points.radius+aE.points.lineWidth/2;A.lineWidth=aF;A.strokeStyle=c.color.parse(aE.color).scale("a",0.5).toString();var aB=1.5*aF,aC=aH.p2c(aC),aI=aG.p2c(aI);A.beginPath();if(aE.points.symbol=="circle"){A.arc(aC,aI,aB,0,2*Math.PI,false)}else{aE.points.symbol(A,aC,aI,aB,false)}A.closePath();A.stroke()}function v(aE,aB){A.lineWidth=aE.bars.lineWidth;A.strokeStyle=c.color.parse(aE.color).scale("a",0.5).toString();var aD=c.color.parse(aE.color).scale("a",0.5).toString();var aC=aE.bars.align=="left"?0:-aE.bars.barWidth/2;E(aB[0],aB[1],aB[2]||0,aC,aC+aE.bars.barWidth,0,function(){return aD},aE.xaxis,aE.yaxis,A,aE.bars.horizontal,aE.bars.lineWidth)}function am(aJ,aB,aH,aC){if(typeof aJ=="string"){return aJ}else{var aI=H.createLinearGradient(0,aH,0,aB);for(var aE=0,aD=aJ.colors.length;aE12){n=n-12}else{if(n==0){n=12}}}for(var g=0;g.sidebar{position:absolute;top:0;left:20px;width:220px;} 29 | .container-fluid>.content{margin-left:240px;} 30 | a{color:#0069d6;text-decoration:none;line-height:inherit;font-weight:inherit;}a:hover{color:#00438a;text-decoration:underline;} 31 | .pull-right{float:right;} 32 | .pull-left{float:left;} 33 | .hide{display:none;} 34 | .show{display:block;} 35 | .row{zoom:1;margin-left:-20px;}.row:before,.row:after{display:table;content:"";zoom:1;} 36 | .row:after{clear:both;} 37 | .row>[class*="span"]{display:inline;float:left;margin-left:20px;} 38 | .span1{width:40px;} 39 | .span2{width:100px;} 40 | .span3{width:160px;} 41 | .span4{width:220px;} 42 | .span5{width:280px;} 43 | .span6{width:340px;} 44 | .span7{width:400px;} 45 | .span8{width:460px;} 46 | .span9{width:520px;} 47 | .span10{width:580px;} 48 | .span11{width:640px;} 49 | .span12{width:700px;} 50 | .span13{width:760px;} 51 | .span14{width:820px;} 52 | .span15{width:880px;} 53 | .span16{width:940px;} 54 | .span17{width:1000px;} 55 | .span18{width:1060px;} 56 | .span19{width:1120px;} 57 | .span20{width:1180px;} 58 | .span21{width:1240px;} 59 | .span22{width:1300px;} 60 | .span23{width:1360px;} 61 | .span24{width:1420px;} 62 | .row >.offset1{margin-left:80px;} 63 | .row >.offset2{margin-left:140px;} 64 | .row >.offset3{margin-left:200px;} 65 | .row >.offset4{margin-left:260px;} 66 | .row >.offset5{margin-left:320px;} 67 | .row >.offset6{margin-left:380px;} 68 | .row >.offset7{margin-left:440px;} 69 | .row >.offset8{margin-left:500px;} 70 | .row >.offset9{margin-left:560px;} 71 | .row >.offset10{margin-left:620px;} 72 | .row >.offset11{margin-left:680px;} 73 | .row >.offset12{margin-left:740px;} 74 | .span-one-third{width:300px;} 75 | .span-two-thirds{width:620px;} 76 | .offset-one-third{margin-left:340px;} 77 | .offset-two-thirds{margin-left:660px;} 78 | p{font-size:13px;font-weight:normal;line-height:18px;margin-bottom:9px;}p small{font-size:11px;color:#bfbfbf;} 79 | h1,h2,h3,h4,h5,h6{font-weight:bold;color:#404040;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#bfbfbf;} 80 | h1{margin-bottom:18px;font-size:30px;line-height:36px;}h1 small{font-size:18px;} 81 | h2{font-size:24px;line-height:36px;}h2 small{font-size:14px;} 82 | h3,h4,h5,h6{line-height:36px;} 83 | h3{font-size:18px;}h3 small{font-size:14px;} 84 | h4{font-size:16px;}h4 small{font-size:12px;} 85 | h5{font-size:14px;} 86 | h6{font-size:13px;color:#bfbfbf;text-transform:uppercase;} 87 | ul,ol{margin:0 0 18px 25px;} 88 | ul ul,ul ol,ol ol,ol ul{margin-bottom:0;} 89 | ul{list-style:disc;} 90 | ol{list-style:decimal;} 91 | li{line-height:18px;color:#808080;} 92 | ul.unstyled{list-style:none;margin-left:0;} 93 | dl{margin-bottom:18px;}dl dt,dl dd{line-height:18px;} 94 | dl dt{font-weight:bold;} 95 | dl dd{margin-left:9px;} 96 | hr{margin:20px 0 19px;border:0;border-bottom:1px solid #eee;} 97 | strong{font-style:inherit;font-weight:bold;} 98 | em{font-style:italic;font-weight:inherit;line-height:inherit;} 99 | .muted{color:#bfbfbf;} 100 | blockquote{margin-bottom:18px;border-left:5px solid #eee;padding-left:15px;}blockquote p{font-size:14px;font-weight:300;line-height:18px;margin-bottom:0;} 101 | blockquote small{display:block;font-size:12px;font-weight:300;line-height:18px;color:#bfbfbf;}blockquote small:before{content:'\2014 \00A0';} 102 | address{display:block;line-height:18px;margin-bottom:18px;} 103 | code,pre{padding:0 3px 2px;font-family:Monaco, Andale Mono, Courier New, monospace;font-size:12px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} 104 | code{background-color:#fee9cc;color:rgba(0, 0, 0, 0.75);padding:1px 3px;} 105 | pre{background-color:#f5f5f5;display:block;padding:8.5px;margin:0 0 18px;line-height:18px;font-size:12px;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;white-space:pre;white-space:pre-wrap;word-wrap:break-word;} 106 | form{margin-bottom:18px;} 107 | fieldset{margin-bottom:18px;padding-top:18px;}fieldset legend{display:block;padding-left:150px;font-size:19.5px;line-height:1;color:#404040;*padding:0 0 5px 145px;*line-height:1.5;} 108 | form .clearfix{margin-bottom:18px;zoom:1;}form .clearfix:before,form .clearfix:after{display:table;content:"";zoom:1;} 109 | form .clearfix:after{clear:both;} 110 | label,input,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:normal;} 111 | label{padding-top:6px;font-size:13px;line-height:18px;float:left;width:130px;text-align:right;color:#404040;} 112 | form .input{margin-left:150px;} 113 | input[type=checkbox],input[type=radio]{cursor:pointer;} 114 | input,textarea,select,.uneditable-input{display:inline-block;width:210px;height:18px;padding:4px;font-size:13px;line-height:18px;color:#808080;border:1px solid #ccc;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} 115 | select{padding:initial;} 116 | input[type=checkbox],input[type=radio]{width:auto;height:auto;padding:0;margin:3px 0;*margin-top:0;line-height:normal;border:none;} 117 | input[type=file]{background-color:#ffffff;padding:initial;border:initial;line-height:initial;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} 118 | input[type=button],input[type=reset],input[type=submit]{width:auto;height:auto;} 119 | select,input[type=file]{height:27px;*height:auto;line-height:27px;*margin-top:4px;} 120 | select[multiple]{height:inherit;background-color:#ffffff;} 121 | textarea{height:auto;} 122 | .uneditable-input{background-color:#ffffff;display:block;border-color:#eee;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);cursor:not-allowed;} 123 | :-moz-placeholder{color:#bfbfbf;} 124 | ::-webkit-input-placeholder{color:#bfbfbf;} 125 | input,textarea{-webkit-transform-style:preserve-3d;-webkit-transition:border linear 0.2s,box-shadow linear 0.2s;-moz-transition:border linear 0.2s,box-shadow linear 0.2s;-ms-transition:border linear 0.2s,box-shadow linear 0.2s;-o-transition:border linear 0.2s,box-shadow linear 0.2s;transition:border linear 0.2s,box-shadow linear 0.2s;-webkit-box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1);-moz-box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1);box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1);} 126 | input:focus,textarea:focus{outline:0;border-color:rgba(82, 168, 236, 0.8);-webkit-box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1),0 0 8px rgba(82, 168, 236, 0.6);-moz-box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1),0 0 8px rgba(82, 168, 236, 0.6);box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1),0 0 8px rgba(82, 168, 236, 0.6);} 127 | input[type=file]:focus,input[type=checkbox]:focus,select:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;outline:1px dotted #666;} 128 | form .clearfix.error>label,form .clearfix.error .help-block,form .clearfix.error .help-inline{color:#b94a48;} 129 | form .clearfix.error input,form .clearfix.error textarea{color:#b94a48;border-color:#ee5f5b;}form .clearfix.error input:focus,form .clearfix.error textarea:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7;} 130 | form .clearfix.error .input-prepend .add-on,form .clearfix.error .input-append .add-on{color:#b94a48;background-color:#fce6e6;border-color:#b94a48;} 131 | form .clearfix.warning>label,form .clearfix.warning .help-block,form .clearfix.warning .help-inline{color:#c09853;} 132 | form .clearfix.warning input,form .clearfix.warning textarea{color:#c09853;border-color:#ccae64;}form .clearfix.warning input:focus,form .clearfix.warning textarea:focus{border-color:#be9a3f;-webkit-box-shadow:0 0 6px #e5d6b1;-moz-box-shadow:0 0 6px #e5d6b1;box-shadow:0 0 6px #e5d6b1;} 133 | form .clearfix.warning .input-prepend .add-on,form .clearfix.warning .input-append .add-on{color:#c09853;background-color:#d2b877;border-color:#c09853;} 134 | form .clearfix.success>label,form .clearfix.success .help-block,form .clearfix.success .help-inline{color:#468847;} 135 | form .clearfix.success input,form .clearfix.success textarea{color:#468847;border-color:#57a957;}form .clearfix.success input:focus,form .clearfix.success textarea:focus{border-color:#458845;-webkit-box-shadow:0 0 6px #9acc9a;-moz-box-shadow:0 0 6px #9acc9a;box-shadow:0 0 6px #9acc9a;} 136 | form .clearfix.success .input-prepend .add-on,form .clearfix.success .input-append .add-on{color:#468847;background-color:#bcddbc;border-color:#468847;} 137 | .input-mini,input.mini,textarea.mini,select.mini{width:60px;} 138 | .input-small,input.small,textarea.small,select.small{width:90px;} 139 | .input-medium,input.medium,textarea.medium,select.medium{width:150px;} 140 | .input-large,input.large,textarea.large,select.large{width:210px;} 141 | .input-xlarge,input.xlarge,textarea.xlarge,select.xlarge{width:270px;} 142 | .input-xxlarge,input.xxlarge,textarea.xxlarge,select.xxlarge{width:530px;} 143 | textarea.xxlarge{overflow-y:auto;} 144 | input.span1,textarea.span1{display:inline-block;float:none;width:30px;margin-left:0;} 145 | input.span2,textarea.span2{display:inline-block;float:none;width:90px;margin-left:0;} 146 | input.span3,textarea.span3{display:inline-block;float:none;width:150px;margin-left:0;} 147 | input.span4,textarea.span4{display:inline-block;float:none;width:210px;margin-left:0;} 148 | input.span5,textarea.span5{display:inline-block;float:none;width:270px;margin-left:0;} 149 | input.span6,textarea.span6{display:inline-block;float:none;width:330px;margin-left:0;} 150 | input.span7,textarea.span7{display:inline-block;float:none;width:390px;margin-left:0;} 151 | input.span8,textarea.span8{display:inline-block;float:none;width:450px;margin-left:0;} 152 | input.span9,textarea.span9{display:inline-block;float:none;width:510px;margin-left:0;} 153 | input.span10,textarea.span10{display:inline-block;float:none;width:570px;margin-left:0;} 154 | input.span11,textarea.span11{display:inline-block;float:none;width:630px;margin-left:0;} 155 | input.span12,textarea.span12{display:inline-block;float:none;width:690px;margin-left:0;} 156 | input.span13,textarea.span13{display:inline-block;float:none;width:750px;margin-left:0;} 157 | input.span14,textarea.span14{display:inline-block;float:none;width:810px;margin-left:0;} 158 | input.span15,textarea.span15{display:inline-block;float:none;width:870px;margin-left:0;} 159 | input.span16,textarea.span16{display:inline-block;float:none;width:930px;margin-left:0;} 160 | input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{background-color:#f5f5f5;border-color:#ddd;cursor:not-allowed;} 161 | .actions{background:#f5f5f5;margin-top:18px;margin-bottom:18px;padding:17px 20px 18px 150px;border-top:1px solid #ddd;-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;}.actions .secondary-action{float:right;}.actions .secondary-action a{line-height:30px;}.actions .secondary-action a:hover{text-decoration:underline;} 162 | .help-inline,.help-block{font-size:13px;line-height:18px;color:#bfbfbf;} 163 | .help-inline{padding-left:5px;*position:relative;*top:-5px;} 164 | .help-block{display:block;max-width:600px;} 165 | .inline-inputs{color:#808080;}.inline-inputs span{padding:0 2px 0 1px;} 166 | .input-prepend input,.input-append input{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;} 167 | .input-prepend .add-on,.input-append .add-on{position:relative;background:#f5f5f5;border:1px solid #ccc;z-index:2;float:left;display:block;width:auto;min-width:16px;height:18px;padding:4px 4px 4px 5px;margin-right:-1px;font-weight:normal;line-height:18px;color:#bfbfbf;text-align:center;text-shadow:0 1px 0 #ffffff;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} 168 | .input-prepend .active,.input-append .active{background:#a9dba9;border-color:#46a546;} 169 | .input-prepend .add-on{*margin-top:1px;} 170 | .input-append input{float:left;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} 171 | .input-append .add-on{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;margin-right:0;margin-left:-1px;} 172 | .inputs-list{margin:0 0 5px;width:100%;}.inputs-list li{display:block;padding:0;width:100%;} 173 | .inputs-list label{display:block;float:none;width:auto;padding:0;margin-left:20px;line-height:18px;text-align:left;white-space:normal;}.inputs-list label strong{color:#808080;} 174 | .inputs-list label small{font-size:11px;font-weight:normal;} 175 | .inputs-list .inputs-list{margin-left:25px;margin-bottom:10px;padding-top:0;} 176 | .inputs-list:first-child{padding-top:6px;} 177 | .inputs-list li+li{padding-top:2px;} 178 | .inputs-list input[type=radio],.inputs-list input[type=checkbox]{margin-bottom:0;margin-left:-20px;float:left;} 179 | .form-stacked{padding-left:20px;}.form-stacked fieldset{padding-top:9px;} 180 | .form-stacked legend{padding-left:0;} 181 | .form-stacked label{display:block;float:none;width:auto;font-weight:bold;text-align:left;line-height:20px;padding-top:0;} 182 | .form-stacked .clearfix{margin-bottom:9px;}.form-stacked .clearfix div.input{margin-left:0;} 183 | .form-stacked .inputs-list{margin-bottom:0;}.form-stacked .inputs-list li{padding-top:0;}.form-stacked .inputs-list li label{font-weight:normal;padding-top:0;} 184 | .form-stacked div.clearfix.error{padding-top:10px;padding-bottom:10px;padding-left:10px;margin-top:0;margin-left:-10px;} 185 | .form-stacked .actions{margin-left:-20px;padding-left:20px;} 186 | table{width:100%;margin-bottom:18px;padding:0;font-size:13px;border-collapse:collapse;}table th,table td{padding:10px 10px 9px;line-height:18px;text-align:left;} 187 | table th{padding-top:9px;font-weight:bold;vertical-align:middle;} 188 | table td{vertical-align:top;border-top:1px solid #ddd;} 189 | table tbody th{border-top:1px solid #ddd;vertical-align:top;} 190 | .condensed-table th,.condensed-table td{padding:5px 5px 4px;} 191 | .bordered-table{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.bordered-table th+th,.bordered-table td+td,.bordered-table th+td{border-left:1px solid #ddd;} 192 | .bordered-table thead tr:first-child th:first-child,.bordered-table tbody tr:first-child td:first-child{-webkit-border-radius:4px 0 0 0;-moz-border-radius:4px 0 0 0;border-radius:4px 0 0 0;} 193 | .bordered-table thead tr:first-child th:last-child,.bordered-table tbody tr:first-child td:last-child{-webkit-border-radius:0 4px 0 0;-moz-border-radius:0 4px 0 0;border-radius:0 4px 0 0;} 194 | .bordered-table tbody tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;} 195 | .bordered-table tbody tr:last-child td:last-child{-webkit-border-radius:0 0 4px 0;-moz-border-radius:0 0 4px 0;border-radius:0 0 4px 0;} 196 | table .span1{width:20px;} 197 | table .span2{width:60px;} 198 | table .span3{width:100px;} 199 | table .span4{width:140px;} 200 | table .span5{width:180px;} 201 | table .span6{width:220px;} 202 | table .span7{width:260px;} 203 | table .span8{width:300px;} 204 | table .span9{width:340px;} 205 | table .span10{width:380px;} 206 | table .span11{width:420px;} 207 | table .span12{width:460px;} 208 | table .span13{width:500px;} 209 | table .span14{width:540px;} 210 | table .span15{width:580px;} 211 | table .span16{width:620px;} 212 | .zebra-striped tbody tr:nth-child(odd) td,.zebra-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9;} 213 | .zebra-striped tbody tr:hover td,.zebra-striped tbody tr:hover th{background-color:#f5f5f5;} 214 | table .header{cursor:pointer;}table .header:after{content:"";float:right;margin-top:7px;border-width:0 4px 4px;border-style:solid;border-color:#000 transparent;visibility:hidden;} 215 | table .headerSortUp,table .headerSortDown{background-color:rgba(141, 192, 219, 0.25);text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);} 216 | table .header:hover:after{visibility:visible;} 217 | table .headerSortDown:after,table .headerSortDown:hover:after{visibility:visible;filter:alpha(opacity=60);-khtml-opacity:0.6;-moz-opacity:0.6;opacity:0.6;} 218 | table .headerSortUp:after{border-bottom:none;border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid #000;visibility:visible;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;filter:alpha(opacity=60);-khtml-opacity:0.6;-moz-opacity:0.6;opacity:0.6;} 219 | table .blue{color:#049cdb;border-bottom-color:#049cdb;} 220 | table .headerSortUp.blue,table .headerSortDown.blue{background-color:#ade6fe;} 221 | table .green{color:#46a546;border-bottom-color:#46a546;} 222 | table .headerSortUp.green,table .headerSortDown.green{background-color:#cdeacd;} 223 | table .red{color:#9d261d;border-bottom-color:#9d261d;} 224 | table .headerSortUp.red,table .headerSortDown.red{background-color:#f4c8c5;} 225 | table .yellow{color:#ffc40d;border-bottom-color:#ffc40d;} 226 | table .headerSortUp.yellow,table .headerSortDown.yellow{background-color:#fff6d9;} 227 | table .orange{color:#f89406;border-bottom-color:#f89406;} 228 | table .headerSortUp.orange,table .headerSortDown.orange{background-color:#fee9cc;} 229 | table .purple{color:#7a43b6;border-bottom-color:#7a43b6;} 230 | table .headerSortUp.purple,table .headerSortDown.purple{background-color:#e2d5f0;} 231 | .topbar{height:40px;position:fixed;top:0;left:0;right:0;z-index:10000;overflow:visible;}.topbar a{color:#bfbfbf;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);} 232 | .topbar h3 a:hover,.topbar .brand:hover,.topbar ul .active>a{background-color:#333;background-color:rgba(255, 255, 255, 0.05);color:#ffffff;text-decoration:none;} 233 | .topbar h3{position:relative;} 234 | .topbar h3 a,.topbar .brand{float:left;display:block;padding:8px 20px 12px;margin-left:-20px;color:#ffffff;font-size:20px;font-weight:200;line-height:1;} 235 | .topbar p{margin:0;line-height:40px;}.topbar p a:hover{background-color:transparent;color:#ffffff;} 236 | .topbar form{float:left;margin:5px 0 0 0;position:relative;filter:alpha(opacity=100);-khtml-opacity:1;-moz-opacity:1;opacity:1;} 237 | .topbar form.pull-right{float:right;} 238 | .topbar input{background-color:#444;background-color:rgba(255, 255, 255, 0.3);font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:normal;font-weight:13px;line-height:1;padding:4px 9px;color:#ffffff;color:rgba(255, 255, 255, 0.75);border:1px solid #111;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.25);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.25);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.25);-webkit-transform-style:preserve-3d;-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none;}.topbar input:-moz-placeholder{color:#e6e6e6;} 239 | .topbar input::-webkit-input-placeholder{color:#e6e6e6;} 240 | .topbar input:hover{background-color:#bfbfbf;background-color:rgba(255, 255, 255, 0.5);color:#ffffff;} 241 | .topbar input:focus,.topbar input.focused{outline:0;background-color:#ffffff;color:#404040;text-shadow:0 1px 0 #ffffff;border:0;padding:5px 10px;-webkit-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);-moz-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);box-shadow:0 0 3px rgba(0, 0, 0, 0.15);} 242 | .topbar-inner,.topbar .fill{background-color:#222;background-color:#222222;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#333333), to(#222222));background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #333333), color-stop(100%, #222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);} 243 | .topbar div>ul,.nav{display:block;float:left;margin:0 10px 0 0;position:relative;left:0;}.topbar div>ul>li,.nav>li{display:block;float:left;} 244 | .topbar div>ul a,.nav a{display:block;float:none;padding:10px 10px 11px;line-height:19px;text-decoration:none;}.topbar div>ul a:hover,.nav a:hover{color:#ffffff;text-decoration:none;} 245 | .topbar div>ul .active>a,.nav .active>a{background-color:#222;background-color:rgba(0, 0, 0, 0.5);} 246 | .topbar div>ul.secondary-nav,.nav.secondary-nav{float:right;margin-left:10px;margin-right:0;}.topbar div>ul.secondary-nav .menu-dropdown,.nav.secondary-nav .menu-dropdown,.topbar div>ul.secondary-nav .dropdown-menu,.nav.secondary-nav .dropdown-menu{right:0;border:0;} 247 | .topbar div>ul a.menu:hover,.nav a.menu:hover,.topbar div>ul li.open .menu,.nav li.open .menu,.topbar div>ul .dropdown-toggle:hover,.nav .dropdown-toggle:hover,.topbar div>ul .dropdown.open .dropdown-toggle,.nav .dropdown.open .dropdown-toggle{background:#444;background:rgba(255, 255, 255, 0.05);} 248 | .topbar div>ul .menu-dropdown,.nav .menu-dropdown,.topbar div>ul .dropdown-menu,.nav .dropdown-menu{background-color:#333;}.topbar div>ul .menu-dropdown a.menu,.nav .menu-dropdown a.menu,.topbar div>ul .dropdown-menu a.menu,.nav .dropdown-menu a.menu,.topbar div>ul .menu-dropdown .dropdown-toggle,.nav .menu-dropdown .dropdown-toggle,.topbar div>ul .dropdown-menu .dropdown-toggle,.nav .dropdown-menu .dropdown-toggle{color:#ffffff;}.topbar div>ul .menu-dropdown a.menu.open,.nav .menu-dropdown a.menu.open,.topbar div>ul .dropdown-menu a.menu.open,.nav .dropdown-menu a.menu.open,.topbar div>ul .menu-dropdown .dropdown-toggle.open,.nav .menu-dropdown .dropdown-toggle.open,.topbar div>ul .dropdown-menu .dropdown-toggle.open,.nav .dropdown-menu .dropdown-toggle.open{background:#444;background:rgba(255, 255, 255, 0.05);} 249 | .topbar div>ul .menu-dropdown li a,.nav .menu-dropdown li a,.topbar div>ul .dropdown-menu li a,.nav .dropdown-menu li a{color:#999;text-shadow:0 1px 0 rgba(0, 0, 0, 0.5);}.topbar div>ul .menu-dropdown li a:hover,.nav .menu-dropdown li a:hover,.topbar div>ul .dropdown-menu li a:hover,.nav .dropdown-menu li a:hover{background-color:#191919;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#292929), to(#191919));background-image:-moz-linear-gradient(top, #292929, #191919);background-image:-ms-linear-gradient(top, #292929, #191919);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #292929), color-stop(100%, #191919));background-image:-webkit-linear-gradient(top, #292929, #191919);background-image:-o-linear-gradient(top, #292929, #191919);background-image:linear-gradient(top, #292929, #191919);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#292929', endColorstr='#191919', GradientType=0);color:#ffffff;} 250 | .topbar div>ul .menu-dropdown .active a,.nav .menu-dropdown .active a,.topbar div>ul .dropdown-menu .active a,.nav .dropdown-menu .active a{color:#ffffff;} 251 | .topbar div>ul .menu-dropdown .divider,.nav .menu-dropdown .divider,.topbar div>ul .dropdown-menu .divider,.nav .dropdown-menu .divider{background-color:#222;border-color:#444;} 252 | .topbar ul .menu-dropdown li a,.topbar ul .dropdown-menu li a{padding:4px 15px;} 253 | li.menu,.dropdown{position:relative;} 254 | a.menu:after,.dropdown-toggle:after{width:0;height:0;display:inline-block;content:"↓";text-indent:-99999px;vertical-align:top;margin-top:8px;margin-left:4px;border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid #ffffff;filter:alpha(opacity=50);-khtml-opacity:0.5;-moz-opacity:0.5;opacity:0.5;} 255 | .menu-dropdown,.dropdown-menu{background-color:#ffffff;float:left;display:none;position:absolute;top:40px;z-index:900;min-width:160px;max-width:220px;_width:160px;margin-left:0;margin-right:0;padding:6px 0;zoom:1;border-color:#999;border-color:rgba(0, 0, 0, 0.2);border-style:solid;border-width:0 1px 1px;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:0 2px 4px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 2px 4px rgba(0, 0, 0, 0.2);box-shadow:0 2px 4px rgba(0, 0, 0, 0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.menu-dropdown li,.dropdown-menu li{float:none;display:block;background-color:none;} 256 | .menu-dropdown .divider,.dropdown-menu .divider{height:1px;margin:5px 0;overflow:hidden;background-color:#eee;border-bottom:1px solid #ffffff;} 257 | .topbar .dropdown-menu a,.dropdown-menu a{display:block;padding:4px 15px;clear:both;font-weight:normal;line-height:18px;color:#808080;text-shadow:0 1px 0 #ffffff;}.topbar .dropdown-menu a:hover,.dropdown-menu a:hover,.topbar .dropdown-menu a.hover,.dropdown-menu a.hover{background-color:#dddddd;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#eeeeee), to(#dddddd));background-image:-moz-linear-gradient(top, #eeeeee, #dddddd);background-image:-ms-linear-gradient(top, #eeeeee, #dddddd);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #eeeeee), color-stop(100%, #dddddd));background-image:-webkit-linear-gradient(top, #eeeeee, #dddddd);background-image:-o-linear-gradient(top, #eeeeee, #dddddd);background-image:linear-gradient(top, #eeeeee, #dddddd);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#dddddd', GradientType=0);color:#404040;text-decoration:none;-webkit-box-shadow:inset 0 1px 0 rgba(0, 0, 0, 0.025),inset 0 -1px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 0 rgba(0, 0, 0, 0.025),inset 0 -1px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 0 rgba(0, 0, 0, 0.025),inset 0 -1px rgba(0, 0, 0, 0.025);} 258 | .open .menu,.dropdown.open .menu,.open .dropdown-toggle,.dropdown.open .dropdown-toggle{color:#ffffff;background:#ccc;background:rgba(0, 0, 0, 0.3);} 259 | .open .menu-dropdown,.dropdown.open .menu-dropdown,.open .dropdown-menu,.dropdown.open .dropdown-menu{display:block;} 260 | .tabs,.pills{margin:0 0 18px;padding:0;list-style:none;zoom:1;}.tabs:before,.pills:before,.tabs:after,.pills:after{display:table;content:"";zoom:1;} 261 | .tabs:after,.pills:after{clear:both;} 262 | .tabs>li,.pills>li{float:left;}.tabs>li>a,.pills>li>a{display:block;} 263 | .tabs{border-color:#ddd;border-style:solid;border-width:0 0 1px;}.tabs>li{position:relative;margin-bottom:-1px;}.tabs>li>a{padding:0 15px;margin-right:2px;line-height:34px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}.tabs>li>a:hover{text-decoration:none;background-color:#eee;border-color:#eee #eee #ddd;} 264 | .tabs .active>a,.tabs .active>a:hover{color:#808080;background-color:#ffffff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default;} 265 | .tabs .menu-dropdown,.tabs .dropdown-menu{top:35px;border-width:1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px;} 266 | .tabs a.menu:after,.tabs .dropdown-toggle:after{border-top-color:#999;margin-top:15px;margin-left:5px;} 267 | .tabs li.open.menu .menu,.tabs .open.dropdown .dropdown-toggle{border-color:#999;} 268 | .tabs li.open a.menu:after,.tabs .dropdown.open .dropdown-toggle:after{border-top-color:#555;} 269 | .pills a{margin:5px 3px 5px 0;padding:0 15px;line-height:30px;text-shadow:0 1px 1px #ffffff;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;}.pills a:hover{color:#ffffff;text-decoration:none;text-shadow:0 1px 1px rgba(0, 0, 0, 0.25);background-color:#00438a;} 270 | .pills .active a{color:#ffffff;text-shadow:0 1px 1px rgba(0, 0, 0, 0.25);background-color:#0069d6;} 271 | .pills-vertical>li{float:none;} 272 | .tab-content>.tab-pane,.pill-content>.pill-pane{display:none;} 273 | .tab-content>.active,.pill-content>.active{display:block;} 274 | .breadcrumb{padding:7px 14px;margin:0 0 18px;background-color:#f5f5f5;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#ffffff), to(#f5f5f5));background-image:-moz-linear-gradient(top, #ffffff, #f5f5f5);background-image:-ms-linear-gradient(top, #ffffff, #f5f5f5);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff), color-stop(100%, #f5f5f5));background-image:-webkit-linear-gradient(top, #ffffff, #f5f5f5);background-image:-o-linear-gradient(top, #ffffff, #f5f5f5);background-image:linear-gradient(top, #ffffff, #f5f5f5);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0);border:1px solid #ddd;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;}.breadcrumb li{display:inline;text-shadow:0 1px 0 #ffffff;} 275 | .breadcrumb .divider{padding:0 5px;color:#bfbfbf;} 276 | .breadcrumb .active a{color:#404040;} 277 | .hero-unit{background-color:#f5f5f5;margin-bottom:30px;padding:60px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;} 278 | .hero-unit p{font-size:18px;font-weight:200;line-height:27px;} 279 | footer{margin-top:17px;padding-top:17px;border-top:1px solid #eee;} 280 | .page-header{margin-bottom:17px;border-bottom:1px solid #ddd;-webkit-box-shadow:0 1px 0 rgba(255, 255, 255, 0.5);-moz-box-shadow:0 1px 0 rgba(255, 255, 255, 0.5);box-shadow:0 1px 0 rgba(255, 255, 255, 0.5);}.page-header h1{margin-bottom:8px;} 281 | .btn.danger,.alert-message.danger,.btn.danger:hover,.alert-message.danger:hover,.btn.error,.alert-message.error,.btn.error:hover,.alert-message.error:hover,.btn.success,.alert-message.success,.btn.success:hover,.alert-message.success:hover,.btn.info,.alert-message.info,.btn.info:hover,.alert-message.info:hover{color:#ffffff;} 282 | .btn .close,.alert-message .close{font-family:Arial,sans-serif;line-height:18px;} 283 | .btn.danger,.alert-message.danger,.btn.error,.alert-message.error{background-color:#c43c35;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35));background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-ms-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(top, #ee5f5b, #c43c35);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border-color:#c43c35 #c43c35 #882a25;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);} 284 | .btn.success,.alert-message.success{background-color:#57a957;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957));background-image:-moz-linear-gradient(top, #62c462, #57a957);background-image:-ms-linear-gradient(top, #62c462, #57a957);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957));background-image:-webkit-linear-gradient(top, #62c462, #57a957);background-image:-o-linear-gradient(top, #62c462, #57a957);background-image:linear-gradient(top, #62c462, #57a957);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border-color:#57a957 #57a957 #3d773d;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);} 285 | .btn.info,.alert-message.info{background-color:#339bb9;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9));background-image:-moz-linear-gradient(top, #5bc0de, #339bb9);background-image:-ms-linear-gradient(top, #5bc0de, #339bb9);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9));background-image:-webkit-linear-gradient(top, #5bc0de, #339bb9);background-image:-o-linear-gradient(top, #5bc0de, #339bb9);background-image:linear-gradient(top, #5bc0de, #339bb9);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border-color:#339bb9 #339bb9 #22697d;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);} 286 | .btn{cursor:pointer;display:inline-block;background-color:#e6e6e6;background-repeat:no-repeat;background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:-moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);background-image:-ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:-o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);padding:5px 14px 6px;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);color:#333;font-size:13px;line-height:normal;border:1px solid #ccc;border-bottom-color:#bbb;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-webkit-transform-style:preserve-3d;-webkit-transition:0.1s linear all;-moz-transition:0.1s linear all;-ms-transition:0.1s linear all;-o-transition:0.1s linear all;transition:0.1s linear all;}.btn:hover{background-position:0 -15px;color:#333;text-decoration:none;} 287 | .btn:focus{outline:1px dotted #666;} 288 | .btn.primary{color:#ffffff;background-color:#0064cd;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#049cdb), to(#0064cd));background-image:-moz-linear-gradient(top, #049cdb, #0064cd);background-image:-ms-linear-gradient(top, #049cdb, #0064cd);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #049cdb), color-stop(100%, #0064cd));background-image:-webkit-linear-gradient(top, #049cdb, #0064cd);background-image:-o-linear-gradient(top, #049cdb, #0064cd);background-image:linear-gradient(top, #049cdb, #0064cd);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#049cdb', endColorstr='#0064cd', GradientType=0);text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border-color:#0064cd #0064cd #003f81;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);} 289 | .btn.active,.btn :active{-webkit-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.25),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.25),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.25),0 1px 2px rgba(0, 0, 0, 0.05);} 290 | .btn.disabled{cursor:default;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=65);-khtml-opacity:0.65;-moz-opacity:0.65;opacity:0.65;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} 291 | .btn[disabled]{cursor:default;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=65);-khtml-opacity:0.65;-moz-opacity:0.65;opacity:0.65;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} 292 | .btn.large{font-size:15px;line-height:normal;padding:9px 14px 9px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;} 293 | .btn.small{padding:7px 9px 7px;font-size:11px;} 294 | :root .alert-message,:root .btn{border-radius:0 \0;} 295 | button.btn::-moz-focus-inner,input[type=submit].btn::-moz-focus-inner{padding:0;border:0;} 296 | .close{float:right;color:#000000;font-size:20px;font-weight:bold;line-height:13.5px;text-shadow:0 1px 0 #ffffff;filter:alpha(opacity=25);-khtml-opacity:0.25;-moz-opacity:0.25;opacity:0.25;}.close:hover{color:#000000;text-decoration:none;filter:alpha(opacity=40);-khtml-opacity:0.4;-moz-opacity:0.4;opacity:0.4;} 297 | .alert-message{position:relative;padding:7px 15px;margin-bottom:18px;color:#404040;background-color:#eedc94;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#fceec1), to(#eedc94));background-image:-moz-linear-gradient(top, #fceec1, #eedc94);background-image:-ms-linear-gradient(top, #fceec1, #eedc94);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #fceec1), color-stop(100%, #eedc94));background-image:-webkit-linear-gradient(top, #fceec1, #eedc94);background-image:-o-linear-gradient(top, #fceec1, #eedc94);background-image:linear-gradient(top, #fceec1, #eedc94);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fceec1', endColorstr='#eedc94', GradientType=0);text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border-color:#eedc94 #eedc94 #e4c652;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);border-width:1px;border-style:solid;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.25);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.25);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.25);}.alert-message .close{margin-top:1px;*margin-top:0;} 298 | .alert-message a{font-weight:bold;color:#404040;} 299 | .alert-message.danger p a,.alert-message.error p a,.alert-message.success p a,.alert-message.info p a{color:#ffffff;} 300 | .alert-message h5{line-height:18px;} 301 | .alert-message p{margin-bottom:0;} 302 | .alert-message div{margin-top:5px;margin-bottom:2px;line-height:28px;} 303 | .alert-message .btn{-webkit-box-shadow:0 1px 0 rgba(255, 255, 255, 0.25);-moz-box-shadow:0 1px 0 rgba(255, 255, 255, 0.25);box-shadow:0 1px 0 rgba(255, 255, 255, 0.25);} 304 | .alert-message.block-message{background-image:none;background-color:#fdf5d9;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);padding:14px;border-color:#fceec1;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}.alert-message.block-message ul,.alert-message.block-message p{margin-right:30px;} 305 | .alert-message.block-message ul{margin-bottom:0;} 306 | .alert-message.block-message li{color:#404040;} 307 | .alert-message.block-message .alert-actions{margin-top:5px;} 308 | .alert-message.block-message.error,.alert-message.block-message.success,.alert-message.block-message.info{color:#404040;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);} 309 | .alert-message.block-message.error{background-color:#fddfde;border-color:#fbc7c6;} 310 | .alert-message.block-message.success{background-color:#d1eed1;border-color:#bfe7bf;} 311 | .alert-message.block-message.info{background-color:#ddf4fb;border-color:#c6edf9;} 312 | .alert-message.block-message.danger p a,.alert-message.block-message.error p a,.alert-message.block-message.success p a,.alert-message.block-message.info p a{color:#404040;} 313 | .pagination{height:36px;margin:18px 0;}.pagination ul{float:left;margin:0;border:1px solid #ddd;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);} 314 | .pagination li{display:inline;} 315 | .pagination a{float:left;padding:0 14px;line-height:34px;border-right:1px solid;border-right-color:#ddd;border-right-color:rgba(0, 0, 0, 0.15);*border-right-color:#ddd;text-decoration:none;} 316 | .pagination a:hover,.pagination .active a{background-color:#c7eefe;} 317 | .pagination .disabled a,.pagination .disabled a:hover{background-color:transparent;color:#bfbfbf;} 318 | .pagination .next a{border:0;} 319 | .well{background-color:#f5f5f5;margin-bottom:20px;padding:19px;min-height:20px;border:1px solid #eee;border:1px solid rgba(0, 0, 0, 0.05);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);}.well blockquote{border-color:#ddd;border-color:rgba(0, 0, 0, 0.15);} 320 | .modal-backdrop{background-color:#000000;position:fixed;top:0;left:0;right:0;bottom:0;z-index:10000;}.modal-backdrop.fade{opacity:0;} 321 | .modal-backdrop,.modal-backdrop.fade.in{filter:alpha(opacity=80);-khtml-opacity:0.8;-moz-opacity:0.8;opacity:0.8;} 322 | .modal{position:fixed;top:50%;left:50%;z-index:11000;width:560px;margin:-250px 0 0 -280px;background-color:#ffffff;border:1px solid #999;border:1px solid rgba(0, 0, 0, 0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.modal .close{margin-top:7px;} 323 | .modal.fade{-webkit-transform-style:preserve-3d;-webkit-transition:opacity .3s linear, top .3s ease-out;-moz-transition:opacity .3s linear, top .3s ease-out;-ms-transition:opacity .3s linear, top .3s ease-out;-o-transition:opacity .3s linear, top .3s ease-out;transition:opacity .3s linear, top .3s ease-out;top:-25%;} 324 | .modal.fade.in{top:50%;} 325 | .modal-header{border-bottom:1px solid #eee;padding:5px 15px;} 326 | .modal-body{padding:15px;} 327 | .modal-body form{margin-bottom:0;} 328 | .modal-footer{background-color:#f5f5f5;padding:14px 15px 15px;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;zoom:1;margin-bottom:0;}.modal-footer:before,.modal-footer:after{display:table;content:"";zoom:1;} 329 | .modal-footer:after{clear:both;} 330 | .modal-footer .btn{float:right;margin-left:5px;} 331 | .modal .popover,.modal .twipsy{z-index:12000;} 332 | .twipsy{display:block;position:absolute;visibility:visible;padding:5px;font-size:11px;z-index:1000;filter:alpha(opacity=80);-khtml-opacity:0.8;-moz-opacity:0.8;opacity:0.8;}.twipsy.fade.in{filter:alpha(opacity=80);-khtml-opacity:0.8;-moz-opacity:0.8;opacity:0.8;} 333 | .twipsy.above .twipsy-arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;} 334 | .twipsy.left .twipsy-arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;} 335 | .twipsy.below .twipsy-arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;} 336 | .twipsy.right .twipsy-arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;} 337 | .twipsy-inner{padding:3px 8px;background-color:#000000;color:white;text-align:center;max-width:200px;text-decoration:none;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} 338 | .twipsy-arrow{position:absolute;width:0;height:0;} 339 | .popover{position:absolute;top:0;left:0;z-index:1000;padding:5px;display:none;}.popover.above .arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;} 340 | .popover.right .arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;} 341 | .popover.below .arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;} 342 | .popover.left .arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;} 343 | .popover .arrow{position:absolute;width:0;height:0;} 344 | .popover .inner{background:#000000;background:rgba(0, 0, 0, 0.8);padding:3px;overflow:hidden;width:280px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);} 345 | .popover .title{background-color:#f5f5f5;padding:9px 15px;line-height:1;-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;border-bottom:1px solid #eee;} 346 | .popover .content{background-color:#ffffff;padding:14px;-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.popover .content p,.popover .content ul,.popover .content ol{margin-bottom:0;} 347 | .fade{-webkit-transform-style:preserve-3d;-webkit-transition:opacity 0.15s linear;-moz-transition:opacity 0.15s linear;-ms-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear;opacity:0;}.fade.in{opacity:1;} 348 | .label{padding:1px 3px 2px;font-size:9.75px;font-weight:bold;color:#ffffff;text-transform:uppercase;white-space:nowrap;background-color:#bfbfbf;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}.label.important{background-color:#c43c35;} 349 | .label.warning{background-color:#f89406;} 350 | .label.success{background-color:#46a546;} 351 | .label.notice{background-color:#62cffc;} 352 | .media-grid{margin-left:-20px;margin-bottom:0;zoom:1;}.media-grid:before,.media-grid:after{display:table;content:"";zoom:1;} 353 | .media-grid:after{clear:both;} 354 | .media-grid li{display:inline;} 355 | .media-grid a{float:left;padding:4px;margin:0 0 18px 20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);}.media-grid a img{display:block;} 356 | .media-grid a:hover{border-color:#0069d6;-webkit-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);-moz-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);} 357 | -------------------------------------------------------------------------------- /assets/bootstrap-1.4.0.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v1.4.0 3 | * 4 | * Copyright 2011 Twitter, Inc 5 | * Licensed under the Apache License v2.0 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Designed and built with all the love in the world @twitter by @mdo and @fat. 9 | * Date: Thu Nov 3 17:06:17 PDT 2011 10 | */ 11 | /* Reset.less 12 | * Props to Eric Meyer (meyerweb.com) for his CSS reset file. We're using an adapted version here that cuts out some of the reset HTML elements we will never need here (i.e., dfn, samp, etc). 13 | * ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- */ 14 | html, body { 15 | margin: 0; 16 | padding: 0; 17 | } 18 | h1, 19 | h2, 20 | h3, 21 | h4, 22 | h5, 23 | h6, 24 | p, 25 | blockquote, 26 | pre, 27 | a, 28 | abbr, 29 | acronym, 30 | address, 31 | cite, 32 | code, 33 | del, 34 | dfn, 35 | em, 36 | img, 37 | q, 38 | s, 39 | samp, 40 | small, 41 | strike, 42 | strong, 43 | sub, 44 | sup, 45 | tt, 46 | var, 47 | dd, 48 | dl, 49 | dt, 50 | li, 51 | ol, 52 | ul, 53 | fieldset, 54 | form, 55 | label, 56 | legend, 57 | button, 58 | table, 59 | caption, 60 | tbody, 61 | tfoot, 62 | thead, 63 | tr, 64 | th, 65 | td { 66 | margin: 0; 67 | padding: 0; 68 | border: 0; 69 | font-weight: normal; 70 | font-style: normal; 71 | font-size: 100%; 72 | line-height: 1; 73 | font-family: inherit; 74 | } 75 | table { 76 | border-collapse: collapse; 77 | border-spacing: 0; 78 | } 79 | ol, ul { 80 | list-style: none; 81 | } 82 | q:before, 83 | q:after, 84 | blockquote:before, 85 | blockquote:after { 86 | content: ""; 87 | } 88 | html { 89 | overflow-y: scroll; 90 | font-size: 100%; 91 | -webkit-text-size-adjust: 100%; 92 | -ms-text-size-adjust: 100%; 93 | } 94 | a:focus { 95 | outline: thin dotted; 96 | } 97 | a:hover, a:active { 98 | outline: 0; 99 | } 100 | article, 101 | aside, 102 | details, 103 | figcaption, 104 | figure, 105 | footer, 106 | header, 107 | hgroup, 108 | nav, 109 | section { 110 | display: block; 111 | } 112 | audio, canvas, video { 113 | display: inline-block; 114 | *display: inline; 115 | *zoom: 1; 116 | } 117 | audio:not([controls]) { 118 | display: none; 119 | } 120 | sub, sup { 121 | font-size: 75%; 122 | line-height: 0; 123 | position: relative; 124 | vertical-align: baseline; 125 | } 126 | sup { 127 | top: -0.5em; 128 | } 129 | sub { 130 | bottom: -0.25em; 131 | } 132 | img { 133 | border: 0; 134 | -ms-interpolation-mode: bicubic; 135 | } 136 | button, 137 | input, 138 | select, 139 | textarea { 140 | font-size: 100%; 141 | margin: 0; 142 | vertical-align: baseline; 143 | *vertical-align: middle; 144 | } 145 | button, input { 146 | line-height: normal; 147 | *overflow: visible; 148 | } 149 | button::-moz-focus-inner, input::-moz-focus-inner { 150 | border: 0; 151 | padding: 0; 152 | } 153 | button, 154 | input[type="button"], 155 | input[type="reset"], 156 | input[type="submit"] { 157 | cursor: pointer; 158 | -webkit-appearance: button; 159 | } 160 | input[type="search"] { 161 | -webkit-appearance: textfield; 162 | -webkit-box-sizing: content-box; 163 | -moz-box-sizing: content-box; 164 | box-sizing: content-box; 165 | } 166 | input[type="search"]::-webkit-search-decoration { 167 | -webkit-appearance: none; 168 | } 169 | textarea { 170 | overflow: auto; 171 | vertical-align: top; 172 | } 173 | /* Variables.less 174 | * Variables to customize the look and feel of Bootstrap 175 | * ----------------------------------------------------- */ 176 | /* Mixins.less 177 | * Snippets of reusable CSS to develop faster and keep code readable 178 | * ----------------------------------------------------------------- */ 179 | /* 180 | * Scaffolding 181 | * Basic and global styles for generating a grid system, structural layout, and page templates 182 | * ------------------------------------------------------------------------------------------- */ 183 | body { 184 | background-color: #ffffff; 185 | margin: 0; 186 | font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; 187 | font-size: 13px; 188 | font-weight: normal; 189 | line-height: 18px; 190 | color: #404040; 191 | } 192 | .container { 193 | width: 940px; 194 | margin-left: auto; 195 | margin-right: auto; 196 | zoom: 1; 197 | } 198 | .container:before, .container:after { 199 | display: table; 200 | content: ""; 201 | zoom: 1; 202 | } 203 | .container:after { 204 | clear: both; 205 | } 206 | .container-fluid { 207 | position: relative; 208 | min-width: 940px; 209 | padding-left: 20px; 210 | padding-right: 20px; 211 | zoom: 1; 212 | } 213 | .container-fluid:before, .container-fluid:after { 214 | display: table; 215 | content: ""; 216 | zoom: 1; 217 | } 218 | .container-fluid:after { 219 | clear: both; 220 | } 221 | .container-fluid > .sidebar { 222 | position: absolute; 223 | top: 0; 224 | left: 20px; 225 | width: 220px; 226 | } 227 | .container-fluid > .content { 228 | margin-left: 240px; 229 | } 230 | a { 231 | color: #0069d6; 232 | text-decoration: none; 233 | line-height: inherit; 234 | font-weight: inherit; 235 | } 236 | a:hover { 237 | color: #00438a; 238 | text-decoration: underline; 239 | } 240 | .pull-right { 241 | float: right; 242 | } 243 | .pull-left { 244 | float: left; 245 | } 246 | .hide { 247 | display: none; 248 | } 249 | .show { 250 | display: block; 251 | } 252 | .row { 253 | zoom: 1; 254 | margin-left: -20px; 255 | } 256 | .row:before, .row:after { 257 | display: table; 258 | content: ""; 259 | zoom: 1; 260 | } 261 | .row:after { 262 | clear: both; 263 | } 264 | .row > [class*="span"] { 265 | display: inline; 266 | float: left; 267 | margin-left: 20px; 268 | } 269 | .span1 { 270 | width: 40px; 271 | } 272 | .span2 { 273 | width: 100px; 274 | } 275 | .span3 { 276 | width: 160px; 277 | } 278 | .span4 { 279 | width: 220px; 280 | } 281 | .span5 { 282 | width: 280px; 283 | } 284 | .span6 { 285 | width: 340px; 286 | } 287 | .span7 { 288 | width: 400px; 289 | } 290 | .span8 { 291 | width: 460px; 292 | } 293 | .span9 { 294 | width: 520px; 295 | } 296 | .span10 { 297 | width: 580px; 298 | } 299 | .span11 { 300 | width: 640px; 301 | } 302 | .span12 { 303 | width: 700px; 304 | } 305 | .span13 { 306 | width: 760px; 307 | } 308 | .span14 { 309 | width: 820px; 310 | } 311 | .span15 { 312 | width: 880px; 313 | } 314 | .span16 { 315 | width: 940px; 316 | } 317 | .span17 { 318 | width: 1000px; 319 | } 320 | .span18 { 321 | width: 1060px; 322 | } 323 | .span19 { 324 | width: 1120px; 325 | } 326 | .span20 { 327 | width: 1180px; 328 | } 329 | .span21 { 330 | width: 1240px; 331 | } 332 | .span22 { 333 | width: 1300px; 334 | } 335 | .span23 { 336 | width: 1360px; 337 | } 338 | .span24 { 339 | width: 1420px; 340 | } 341 | .row > .offset1 { 342 | margin-left: 80px; 343 | } 344 | .row > .offset2 { 345 | margin-left: 140px; 346 | } 347 | .row > .offset3 { 348 | margin-left: 200px; 349 | } 350 | .row > .offset4 { 351 | margin-left: 260px; 352 | } 353 | .row > .offset5 { 354 | margin-left: 320px; 355 | } 356 | .row > .offset6 { 357 | margin-left: 380px; 358 | } 359 | .row > .offset7 { 360 | margin-left: 440px; 361 | } 362 | .row > .offset8 { 363 | margin-left: 500px; 364 | } 365 | .row > .offset9 { 366 | margin-left: 560px; 367 | } 368 | .row > .offset10 { 369 | margin-left: 620px; 370 | } 371 | .row > .offset11 { 372 | margin-left: 680px; 373 | } 374 | .row > .offset12 { 375 | margin-left: 740px; 376 | } 377 | .span-one-third { 378 | width: 300px; 379 | } 380 | .span-two-thirds { 381 | width: 620px; 382 | } 383 | .offset-one-third { 384 | margin-left: 340px; 385 | } 386 | .offset-two-thirds { 387 | margin-left: 660px; 388 | } 389 | /* Typography.less 390 | * Headings, body text, lists, code, and more for a versatile and durable typography system 391 | * ---------------------------------------------------------------------------------------- */ 392 | p { 393 | font-size: 13px; 394 | font-weight: normal; 395 | line-height: 18px; 396 | margin-bottom: 9px; 397 | } 398 | p small { 399 | font-size: 11px; 400 | color: #bfbfbf; 401 | } 402 | h1, 403 | h2, 404 | h3, 405 | h4, 406 | h5, 407 | h6 { 408 | font-weight: bold; 409 | color: #404040; 410 | } 411 | h1 small, 412 | h2 small, 413 | h3 small, 414 | h4 small, 415 | h5 small, 416 | h6 small { 417 | color: #bfbfbf; 418 | } 419 | h1 { 420 | margin-bottom: 18px; 421 | font-size: 30px; 422 | line-height: 36px; 423 | } 424 | h1 small { 425 | font-size: 18px; 426 | } 427 | h2 { 428 | font-size: 24px; 429 | line-height: 36px; 430 | } 431 | h2 small { 432 | font-size: 14px; 433 | } 434 | h3, 435 | h4, 436 | h5, 437 | h6 { 438 | line-height: 36px; 439 | } 440 | h3 { 441 | font-size: 18px; 442 | } 443 | h3 small { 444 | font-size: 14px; 445 | } 446 | h4 { 447 | font-size: 16px; 448 | } 449 | h4 small { 450 | font-size: 12px; 451 | } 452 | h5 { 453 | font-size: 14px; 454 | } 455 | h6 { 456 | font-size: 13px; 457 | color: #bfbfbf; 458 | text-transform: uppercase; 459 | } 460 | ul, ol { 461 | margin: 0 0 18px 25px; 462 | } 463 | ul ul, 464 | ul ol, 465 | ol ol, 466 | ol ul { 467 | margin-bottom: 0; 468 | } 469 | ul { 470 | list-style: disc; 471 | } 472 | ol { 473 | list-style: decimal; 474 | } 475 | li { 476 | line-height: 18px; 477 | color: #808080; 478 | } 479 | ul.unstyled { 480 | list-style: none; 481 | margin-left: 0; 482 | } 483 | dl { 484 | margin-bottom: 18px; 485 | } 486 | dl dt, dl dd { 487 | line-height: 18px; 488 | } 489 | dl dt { 490 | font-weight: bold; 491 | } 492 | dl dd { 493 | margin-left: 9px; 494 | } 495 | hr { 496 | margin: 20px 0 19px; 497 | border: 0; 498 | border-bottom: 1px solid #eee; 499 | } 500 | strong { 501 | font-style: inherit; 502 | font-weight: bold; 503 | } 504 | em { 505 | font-style: italic; 506 | font-weight: inherit; 507 | line-height: inherit; 508 | } 509 | .muted { 510 | color: #bfbfbf; 511 | } 512 | blockquote { 513 | margin-bottom: 18px; 514 | border-left: 5px solid #eee; 515 | padding-left: 15px; 516 | } 517 | blockquote p { 518 | font-size: 14px; 519 | font-weight: 300; 520 | line-height: 18px; 521 | margin-bottom: 0; 522 | } 523 | blockquote small { 524 | display: block; 525 | font-size: 12px; 526 | font-weight: 300; 527 | line-height: 18px; 528 | color: #bfbfbf; 529 | } 530 | blockquote small:before { 531 | content: '\2014 \00A0'; 532 | } 533 | address { 534 | display: block; 535 | line-height: 18px; 536 | margin-bottom: 18px; 537 | } 538 | code, pre { 539 | padding: 0 3px 2px; 540 | font-family: Monaco, Andale Mono, Courier New, monospace; 541 | font-size: 12px; 542 | -webkit-border-radius: 3px; 543 | -moz-border-radius: 3px; 544 | border-radius: 3px; 545 | } 546 | code { 547 | background-color: #fee9cc; 548 | color: rgba(0, 0, 0, 0.75); 549 | padding: 1px 3px; 550 | } 551 | pre { 552 | background-color: #f5f5f5; 553 | display: block; 554 | padding: 8.5px; 555 | margin: 0 0 18px; 556 | line-height: 18px; 557 | font-size: 12px; 558 | border: 1px solid #ccc; 559 | border: 1px solid rgba(0, 0, 0, 0.15); 560 | -webkit-border-radius: 3px; 561 | -moz-border-radius: 3px; 562 | border-radius: 3px; 563 | white-space: pre; 564 | white-space: pre-wrap; 565 | word-wrap: break-word; 566 | } 567 | /* Forms.less 568 | * Base styles for various input types, form layouts, and states 569 | * ------------------------------------------------------------- */ 570 | form { 571 | margin-bottom: 18px; 572 | } 573 | fieldset { 574 | margin-bottom: 18px; 575 | padding-top: 18px; 576 | } 577 | fieldset legend { 578 | display: block; 579 | padding-left: 150px; 580 | font-size: 19.5px; 581 | line-height: 1; 582 | color: #404040; 583 | *padding: 0 0 5px 145px; 584 | /* IE6-7 */ 585 | 586 | *line-height: 1.5; 587 | /* IE6-7 */ 588 | 589 | } 590 | form .clearfix { 591 | margin-bottom: 18px; 592 | zoom: 1; 593 | } 594 | form .clearfix:before, form .clearfix:after { 595 | display: table; 596 | content: ""; 597 | zoom: 1; 598 | } 599 | form .clearfix:after { 600 | clear: both; 601 | } 602 | label, 603 | input, 604 | select, 605 | textarea { 606 | font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; 607 | font-size: 13px; 608 | font-weight: normal; 609 | line-height: normal; 610 | } 611 | label { 612 | padding-top: 6px; 613 | font-size: 13px; 614 | line-height: 18px; 615 | float: left; 616 | width: 130px; 617 | text-align: right; 618 | color: #404040; 619 | } 620 | form .input { 621 | margin-left: 150px; 622 | } 623 | input[type=checkbox], input[type=radio] { 624 | cursor: pointer; 625 | } 626 | input, 627 | textarea, 628 | select, 629 | .uneditable-input { 630 | display: inline-block; 631 | width: 210px; 632 | height: 18px; 633 | padding: 4px; 634 | font-size: 13px; 635 | line-height: 18px; 636 | color: #808080; 637 | border: 1px solid #ccc; 638 | -webkit-border-radius: 3px; 639 | -moz-border-radius: 3px; 640 | border-radius: 3px; 641 | } 642 | select { 643 | padding: initial; 644 | } 645 | input[type=checkbox], input[type=radio] { 646 | width: auto; 647 | height: auto; 648 | padding: 0; 649 | margin: 3px 0; 650 | *margin-top: 0; 651 | /* IE6-7 */ 652 | 653 | line-height: normal; 654 | border: none; 655 | } 656 | input[type=file] { 657 | background-color: #ffffff; 658 | padding: initial; 659 | border: initial; 660 | line-height: initial; 661 | -webkit-box-shadow: none; 662 | -moz-box-shadow: none; 663 | box-shadow: none; 664 | } 665 | input[type=button], input[type=reset], input[type=submit] { 666 | width: auto; 667 | height: auto; 668 | } 669 | select, input[type=file] { 670 | height: 27px; 671 | *height: auto; 672 | line-height: 27px; 673 | *margin-top: 4px; 674 | /* For IE7, add top margin to align select with labels */ 675 | 676 | } 677 | select[multiple] { 678 | height: inherit; 679 | background-color: #ffffff; 680 | } 681 | textarea { 682 | height: auto; 683 | } 684 | .uneditable-input { 685 | background-color: #ffffff; 686 | display: block; 687 | border-color: #eee; 688 | -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); 689 | -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); 690 | box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); 691 | cursor: not-allowed; 692 | } 693 | :-moz-placeholder { 694 | color: #bfbfbf; 695 | } 696 | ::-webkit-input-placeholder { 697 | color: #bfbfbf; 698 | } 699 | input, textarea { 700 | -webkit-transform-style: preserve-3d; 701 | -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; 702 | -moz-transition: border linear 0.2s, box-shadow linear 0.2s; 703 | -ms-transition: border linear 0.2s, box-shadow linear 0.2s; 704 | -o-transition: border linear 0.2s, box-shadow linear 0.2s; 705 | transition: border linear 0.2s, box-shadow linear 0.2s; 706 | -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1); 707 | -moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1); 708 | box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1); 709 | } 710 | input:focus, textarea:focus { 711 | outline: 0; 712 | border-color: rgba(82, 168, 236, 0.8); 713 | -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(82, 168, 236, 0.6); 714 | -moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(82, 168, 236, 0.6); 715 | box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(82, 168, 236, 0.6); 716 | } 717 | input[type=file]:focus, input[type=checkbox]:focus, select:focus { 718 | -webkit-box-shadow: none; 719 | -moz-box-shadow: none; 720 | box-shadow: none; 721 | outline: 1px dotted #666; 722 | } 723 | form .clearfix.error > label, form .clearfix.error .help-block, form .clearfix.error .help-inline { 724 | color: #b94a48; 725 | } 726 | form .clearfix.error input, form .clearfix.error textarea { 727 | color: #b94a48; 728 | border-color: #ee5f5b; 729 | } 730 | form .clearfix.error input:focus, form .clearfix.error textarea:focus { 731 | border-color: #e9322d; 732 | -webkit-box-shadow: 0 0 6px #f8b9b7; 733 | -moz-box-shadow: 0 0 6px #f8b9b7; 734 | box-shadow: 0 0 6px #f8b9b7; 735 | } 736 | form .clearfix.error .input-prepend .add-on, form .clearfix.error .input-append .add-on { 737 | color: #b94a48; 738 | background-color: #fce6e6; 739 | border-color: #b94a48; 740 | } 741 | form .clearfix.warning > label, form .clearfix.warning .help-block, form .clearfix.warning .help-inline { 742 | color: #c09853; 743 | } 744 | form .clearfix.warning input, form .clearfix.warning textarea { 745 | color: #c09853; 746 | border-color: #ccae64; 747 | } 748 | form .clearfix.warning input:focus, form .clearfix.warning textarea:focus { 749 | border-color: #be9a3f; 750 | -webkit-box-shadow: 0 0 6px #e5d6b1; 751 | -moz-box-shadow: 0 0 6px #e5d6b1; 752 | box-shadow: 0 0 6px #e5d6b1; 753 | } 754 | form .clearfix.warning .input-prepend .add-on, form .clearfix.warning .input-append .add-on { 755 | color: #c09853; 756 | background-color: #d2b877; 757 | border-color: #c09853; 758 | } 759 | form .clearfix.success > label, form .clearfix.success .help-block, form .clearfix.success .help-inline { 760 | color: #468847; 761 | } 762 | form .clearfix.success input, form .clearfix.success textarea { 763 | color: #468847; 764 | border-color: #57a957; 765 | } 766 | form .clearfix.success input:focus, form .clearfix.success textarea:focus { 767 | border-color: #458845; 768 | -webkit-box-shadow: 0 0 6px #9acc9a; 769 | -moz-box-shadow: 0 0 6px #9acc9a; 770 | box-shadow: 0 0 6px #9acc9a; 771 | } 772 | form .clearfix.success .input-prepend .add-on, form .clearfix.success .input-append .add-on { 773 | color: #468847; 774 | background-color: #bcddbc; 775 | border-color: #468847; 776 | } 777 | .input-mini, 778 | input.mini, 779 | textarea.mini, 780 | select.mini { 781 | width: 60px; 782 | } 783 | .input-small, 784 | input.small, 785 | textarea.small, 786 | select.small { 787 | width: 90px; 788 | } 789 | .input-medium, 790 | input.medium, 791 | textarea.medium, 792 | select.medium { 793 | width: 150px; 794 | } 795 | .input-large, 796 | input.large, 797 | textarea.large, 798 | select.large { 799 | width: 210px; 800 | } 801 | .input-xlarge, 802 | input.xlarge, 803 | textarea.xlarge, 804 | select.xlarge { 805 | width: 270px; 806 | } 807 | .input-xxlarge, 808 | input.xxlarge, 809 | textarea.xxlarge, 810 | select.xxlarge { 811 | width: 530px; 812 | } 813 | textarea.xxlarge { 814 | overflow-y: auto; 815 | } 816 | input.span1, textarea.span1 { 817 | display: inline-block; 818 | float: none; 819 | width: 30px; 820 | margin-left: 0; 821 | } 822 | input.span2, textarea.span2 { 823 | display: inline-block; 824 | float: none; 825 | width: 90px; 826 | margin-left: 0; 827 | } 828 | input.span3, textarea.span3 { 829 | display: inline-block; 830 | float: none; 831 | width: 150px; 832 | margin-left: 0; 833 | } 834 | input.span4, textarea.span4 { 835 | display: inline-block; 836 | float: none; 837 | width: 210px; 838 | margin-left: 0; 839 | } 840 | input.span5, textarea.span5 { 841 | display: inline-block; 842 | float: none; 843 | width: 270px; 844 | margin-left: 0; 845 | } 846 | input.span6, textarea.span6 { 847 | display: inline-block; 848 | float: none; 849 | width: 330px; 850 | margin-left: 0; 851 | } 852 | input.span7, textarea.span7 { 853 | display: inline-block; 854 | float: none; 855 | width: 390px; 856 | margin-left: 0; 857 | } 858 | input.span8, textarea.span8 { 859 | display: inline-block; 860 | float: none; 861 | width: 450px; 862 | margin-left: 0; 863 | } 864 | input.span9, textarea.span9 { 865 | display: inline-block; 866 | float: none; 867 | width: 510px; 868 | margin-left: 0; 869 | } 870 | input.span10, textarea.span10 { 871 | display: inline-block; 872 | float: none; 873 | width: 570px; 874 | margin-left: 0; 875 | } 876 | input.span11, textarea.span11 { 877 | display: inline-block; 878 | float: none; 879 | width: 630px; 880 | margin-left: 0; 881 | } 882 | input.span12, textarea.span12 { 883 | display: inline-block; 884 | float: none; 885 | width: 690px; 886 | margin-left: 0; 887 | } 888 | input.span13, textarea.span13 { 889 | display: inline-block; 890 | float: none; 891 | width: 750px; 892 | margin-left: 0; 893 | } 894 | input.span14, textarea.span14 { 895 | display: inline-block; 896 | float: none; 897 | width: 810px; 898 | margin-left: 0; 899 | } 900 | input.span15, textarea.span15 { 901 | display: inline-block; 902 | float: none; 903 | width: 870px; 904 | margin-left: 0; 905 | } 906 | input.span16, textarea.span16 { 907 | display: inline-block; 908 | float: none; 909 | width: 930px; 910 | margin-left: 0; 911 | } 912 | input[disabled], 913 | select[disabled], 914 | textarea[disabled], 915 | input[readonly], 916 | select[readonly], 917 | textarea[readonly] { 918 | background-color: #f5f5f5; 919 | border-color: #ddd; 920 | cursor: not-allowed; 921 | } 922 | .actions { 923 | background: #f5f5f5; 924 | margin-top: 18px; 925 | margin-bottom: 18px; 926 | padding: 17px 20px 18px 150px; 927 | border-top: 1px solid #ddd; 928 | -webkit-border-radius: 0 0 3px 3px; 929 | -moz-border-radius: 0 0 3px 3px; 930 | border-radius: 0 0 3px 3px; 931 | } 932 | .actions .secondary-action { 933 | float: right; 934 | } 935 | .actions .secondary-action a { 936 | line-height: 30px; 937 | } 938 | .actions .secondary-action a:hover { 939 | text-decoration: underline; 940 | } 941 | .help-inline, .help-block { 942 | font-size: 13px; 943 | line-height: 18px; 944 | color: #bfbfbf; 945 | } 946 | .help-inline { 947 | padding-left: 5px; 948 | *position: relative; 949 | /* IE6-7 */ 950 | 951 | *top: -5px; 952 | /* IE6-7 */ 953 | 954 | } 955 | .help-block { 956 | display: block; 957 | max-width: 600px; 958 | } 959 | .inline-inputs { 960 | color: #808080; 961 | } 962 | .inline-inputs span { 963 | padding: 0 2px 0 1px; 964 | } 965 | .input-prepend input, .input-append input { 966 | -webkit-border-radius: 0 3px 3px 0; 967 | -moz-border-radius: 0 3px 3px 0; 968 | border-radius: 0 3px 3px 0; 969 | } 970 | .input-prepend .add-on, .input-append .add-on { 971 | position: relative; 972 | background: #f5f5f5; 973 | border: 1px solid #ccc; 974 | z-index: 2; 975 | float: left; 976 | display: block; 977 | width: auto; 978 | min-width: 16px; 979 | height: 18px; 980 | padding: 4px 4px 4px 5px; 981 | margin-right: -1px; 982 | font-weight: normal; 983 | line-height: 18px; 984 | color: #bfbfbf; 985 | text-align: center; 986 | text-shadow: 0 1px 0 #ffffff; 987 | -webkit-border-radius: 3px 0 0 3px; 988 | -moz-border-radius: 3px 0 0 3px; 989 | border-radius: 3px 0 0 3px; 990 | } 991 | .input-prepend .active, .input-append .active { 992 | background: #a9dba9; 993 | border-color: #46a546; 994 | } 995 | .input-prepend .add-on { 996 | *margin-top: 1px; 997 | /* IE6-7 */ 998 | 999 | } 1000 | .input-append input { 1001 | float: left; 1002 | -webkit-border-radius: 3px 0 0 3px; 1003 | -moz-border-radius: 3px 0 0 3px; 1004 | border-radius: 3px 0 0 3px; 1005 | } 1006 | .input-append .add-on { 1007 | -webkit-border-radius: 0 3px 3px 0; 1008 | -moz-border-radius: 0 3px 3px 0; 1009 | border-radius: 0 3px 3px 0; 1010 | margin-right: 0; 1011 | margin-left: -1px; 1012 | } 1013 | .inputs-list { 1014 | margin: 0 0 5px; 1015 | width: 100%; 1016 | } 1017 | .inputs-list li { 1018 | display: block; 1019 | padding: 0; 1020 | width: 100%; 1021 | } 1022 | .inputs-list label { 1023 | display: block; 1024 | float: none; 1025 | width: auto; 1026 | padding: 0; 1027 | margin-left: 20px; 1028 | line-height: 18px; 1029 | text-align: left; 1030 | white-space: normal; 1031 | } 1032 | .inputs-list label strong { 1033 | color: #808080; 1034 | } 1035 | .inputs-list label small { 1036 | font-size: 11px; 1037 | font-weight: normal; 1038 | } 1039 | .inputs-list .inputs-list { 1040 | margin-left: 25px; 1041 | margin-bottom: 10px; 1042 | padding-top: 0; 1043 | } 1044 | .inputs-list:first-child { 1045 | padding-top: 6px; 1046 | } 1047 | .inputs-list li + li { 1048 | padding-top: 2px; 1049 | } 1050 | .inputs-list input[type=radio], .inputs-list input[type=checkbox] { 1051 | margin-bottom: 0; 1052 | margin-left: -20px; 1053 | float: left; 1054 | } 1055 | .form-stacked { 1056 | padding-left: 20px; 1057 | } 1058 | .form-stacked fieldset { 1059 | padding-top: 9px; 1060 | } 1061 | .form-stacked legend { 1062 | padding-left: 0; 1063 | } 1064 | .form-stacked label { 1065 | display: block; 1066 | float: none; 1067 | width: auto; 1068 | font-weight: bold; 1069 | text-align: left; 1070 | line-height: 20px; 1071 | padding-top: 0; 1072 | } 1073 | .form-stacked .clearfix { 1074 | margin-bottom: 9px; 1075 | } 1076 | .form-stacked .clearfix div.input { 1077 | margin-left: 0; 1078 | } 1079 | .form-stacked .inputs-list { 1080 | margin-bottom: 0; 1081 | } 1082 | .form-stacked .inputs-list li { 1083 | padding-top: 0; 1084 | } 1085 | .form-stacked .inputs-list li label { 1086 | font-weight: normal; 1087 | padding-top: 0; 1088 | } 1089 | .form-stacked div.clearfix.error { 1090 | padding-top: 10px; 1091 | padding-bottom: 10px; 1092 | padding-left: 10px; 1093 | margin-top: 0; 1094 | margin-left: -10px; 1095 | } 1096 | .form-stacked .actions { 1097 | margin-left: -20px; 1098 | padding-left: 20px; 1099 | } 1100 | /* 1101 | * Tables.less 1102 | * Tables for, you guessed it, tabular data 1103 | * ---------------------------------------- */ 1104 | table { 1105 | width: 100%; 1106 | margin-bottom: 18px; 1107 | padding: 0; 1108 | font-size: 13px; 1109 | border-collapse: collapse; 1110 | } 1111 | table th, table td { 1112 | padding: 10px 10px 9px; 1113 | line-height: 18px; 1114 | text-align: left; 1115 | } 1116 | table th { 1117 | padding-top: 9px; 1118 | font-weight: bold; 1119 | vertical-align: middle; 1120 | } 1121 | table td { 1122 | vertical-align: top; 1123 | border-top: 1px solid #ddd; 1124 | } 1125 | table tbody th { 1126 | border-top: 1px solid #ddd; 1127 | vertical-align: top; 1128 | } 1129 | .condensed-table th, .condensed-table td { 1130 | padding: 5px 5px 4px; 1131 | } 1132 | .bordered-table { 1133 | border: 1px solid #ddd; 1134 | border-collapse: separate; 1135 | *border-collapse: collapse; 1136 | /* IE7, collapse table to remove spacing */ 1137 | 1138 | -webkit-border-radius: 4px; 1139 | -moz-border-radius: 4px; 1140 | border-radius: 4px; 1141 | } 1142 | .bordered-table th + th, .bordered-table td + td, .bordered-table th + td { 1143 | border-left: 1px solid #ddd; 1144 | } 1145 | .bordered-table thead tr:first-child th:first-child, .bordered-table tbody tr:first-child td:first-child { 1146 | -webkit-border-radius: 4px 0 0 0; 1147 | -moz-border-radius: 4px 0 0 0; 1148 | border-radius: 4px 0 0 0; 1149 | } 1150 | .bordered-table thead tr:first-child th:last-child, .bordered-table tbody tr:first-child td:last-child { 1151 | -webkit-border-radius: 0 4px 0 0; 1152 | -moz-border-radius: 0 4px 0 0; 1153 | border-radius: 0 4px 0 0; 1154 | } 1155 | .bordered-table tbody tr:last-child td:first-child { 1156 | -webkit-border-radius: 0 0 0 4px; 1157 | -moz-border-radius: 0 0 0 4px; 1158 | border-radius: 0 0 0 4px; 1159 | } 1160 | .bordered-table tbody tr:last-child td:last-child { 1161 | -webkit-border-radius: 0 0 4px 0; 1162 | -moz-border-radius: 0 0 4px 0; 1163 | border-radius: 0 0 4px 0; 1164 | } 1165 | table .span1 { 1166 | width: 20px; 1167 | } 1168 | table .span2 { 1169 | width: 60px; 1170 | } 1171 | table .span3 { 1172 | width: 100px; 1173 | } 1174 | table .span4 { 1175 | width: 140px; 1176 | } 1177 | table .span5 { 1178 | width: 180px; 1179 | } 1180 | table .span6 { 1181 | width: 220px; 1182 | } 1183 | table .span7 { 1184 | width: 260px; 1185 | } 1186 | table .span8 { 1187 | width: 300px; 1188 | } 1189 | table .span9 { 1190 | width: 340px; 1191 | } 1192 | table .span10 { 1193 | width: 380px; 1194 | } 1195 | table .span11 { 1196 | width: 420px; 1197 | } 1198 | table .span12 { 1199 | width: 460px; 1200 | } 1201 | table .span13 { 1202 | width: 500px; 1203 | } 1204 | table .span14 { 1205 | width: 540px; 1206 | } 1207 | table .span15 { 1208 | width: 580px; 1209 | } 1210 | table .span16 { 1211 | width: 620px; 1212 | } 1213 | .zebra-striped tbody tr:nth-child(odd) td, .zebra-striped tbody tr:nth-child(odd) th { 1214 | background-color: #f9f9f9; 1215 | } 1216 | .zebra-striped tbody tr:hover td, .zebra-striped tbody tr:hover th { 1217 | background-color: #f5f5f5; 1218 | } 1219 | table .header { 1220 | cursor: pointer; 1221 | } 1222 | table .header:after { 1223 | content: ""; 1224 | float: right; 1225 | margin-top: 7px; 1226 | border-width: 0 4px 4px; 1227 | border-style: solid; 1228 | border-color: #000 transparent; 1229 | visibility: hidden; 1230 | } 1231 | table .headerSortUp, table .headerSortDown { 1232 | background-color: rgba(141, 192, 219, 0.25); 1233 | text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); 1234 | } 1235 | table .header:hover:after { 1236 | visibility: visible; 1237 | } 1238 | table .headerSortDown:after, table .headerSortDown:hover:after { 1239 | visibility: visible; 1240 | filter: alpha(opacity=60); 1241 | -khtml-opacity: 0.6; 1242 | -moz-opacity: 0.6; 1243 | opacity: 0.6; 1244 | } 1245 | table .headerSortUp:after { 1246 | border-bottom: none; 1247 | border-left: 4px solid transparent; 1248 | border-right: 4px solid transparent; 1249 | border-top: 4px solid #000; 1250 | visibility: visible; 1251 | -webkit-box-shadow: none; 1252 | -moz-box-shadow: none; 1253 | box-shadow: none; 1254 | filter: alpha(opacity=60); 1255 | -khtml-opacity: 0.6; 1256 | -moz-opacity: 0.6; 1257 | opacity: 0.6; 1258 | } 1259 | table .blue { 1260 | color: #049cdb; 1261 | border-bottom-color: #049cdb; 1262 | } 1263 | table .headerSortUp.blue, table .headerSortDown.blue { 1264 | background-color: #ade6fe; 1265 | } 1266 | table .green { 1267 | color: #46a546; 1268 | border-bottom-color: #46a546; 1269 | } 1270 | table .headerSortUp.green, table .headerSortDown.green { 1271 | background-color: #cdeacd; 1272 | } 1273 | table .red { 1274 | color: #9d261d; 1275 | border-bottom-color: #9d261d; 1276 | } 1277 | table .headerSortUp.red, table .headerSortDown.red { 1278 | background-color: #f4c8c5; 1279 | } 1280 | table .yellow { 1281 | color: #ffc40d; 1282 | border-bottom-color: #ffc40d; 1283 | } 1284 | table .headerSortUp.yellow, table .headerSortDown.yellow { 1285 | background-color: #fff6d9; 1286 | } 1287 | table .orange { 1288 | color: #f89406; 1289 | border-bottom-color: #f89406; 1290 | } 1291 | table .headerSortUp.orange, table .headerSortDown.orange { 1292 | background-color: #fee9cc; 1293 | } 1294 | table .purple { 1295 | color: #7a43b6; 1296 | border-bottom-color: #7a43b6; 1297 | } 1298 | table .headerSortUp.purple, table .headerSortDown.purple { 1299 | background-color: #e2d5f0; 1300 | } 1301 | /* Patterns.less 1302 | * Repeatable UI elements outside the base styles provided from the scaffolding 1303 | * ---------------------------------------------------------------------------- */ 1304 | .topbar { 1305 | height: 40px; 1306 | position: fixed; 1307 | top: 0; 1308 | left: 0; 1309 | right: 0; 1310 | z-index: 10000; 1311 | overflow: visible; 1312 | } 1313 | .topbar a { 1314 | color: #bfbfbf; 1315 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); 1316 | } 1317 | .topbar h3 a:hover, .topbar .brand:hover, .topbar ul .active > a { 1318 | background-color: #333; 1319 | background-color: rgba(255, 255, 255, 0.05); 1320 | color: #ffffff; 1321 | text-decoration: none; 1322 | } 1323 | .topbar h3 { 1324 | position: relative; 1325 | } 1326 | .topbar h3 a, .topbar .brand { 1327 | float: left; 1328 | display: block; 1329 | padding: 8px 20px 12px; 1330 | margin-left: -20px; 1331 | color: #ffffff; 1332 | font-size: 20px; 1333 | font-weight: 200; 1334 | line-height: 1; 1335 | } 1336 | .topbar p { 1337 | margin: 0; 1338 | line-height: 40px; 1339 | } 1340 | .topbar p a:hover { 1341 | background-color: transparent; 1342 | color: #ffffff; 1343 | } 1344 | .topbar form { 1345 | float: left; 1346 | margin: 5px 0 0 0; 1347 | position: relative; 1348 | filter: alpha(opacity=100); 1349 | -khtml-opacity: 1; 1350 | -moz-opacity: 1; 1351 | opacity: 1; 1352 | } 1353 | .topbar form.pull-right { 1354 | float: right; 1355 | } 1356 | .topbar input { 1357 | background-color: #444; 1358 | background-color: rgba(255, 255, 255, 0.3); 1359 | font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; 1360 | font-size: normal; 1361 | font-weight: 13px; 1362 | line-height: 1; 1363 | padding: 4px 9px; 1364 | color: #ffffff; 1365 | color: rgba(255, 255, 255, 0.75); 1366 | border: 1px solid #111; 1367 | -webkit-border-radius: 4px; 1368 | -moz-border-radius: 4px; 1369 | border-radius: 4px; 1370 | -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.25); 1371 | -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.25); 1372 | box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.25); 1373 | -webkit-transform-style: preserve-3d; 1374 | -webkit-transition: none; 1375 | -moz-transition: none; 1376 | -ms-transition: none; 1377 | -o-transition: none; 1378 | transition: none; 1379 | } 1380 | .topbar input:-moz-placeholder { 1381 | color: #e6e6e6; 1382 | } 1383 | .topbar input::-webkit-input-placeholder { 1384 | color: #e6e6e6; 1385 | } 1386 | .topbar input:hover { 1387 | background-color: #bfbfbf; 1388 | background-color: rgba(255, 255, 255, 0.5); 1389 | color: #ffffff; 1390 | } 1391 | .topbar input:focus, .topbar input.focused { 1392 | outline: 0; 1393 | background-color: #ffffff; 1394 | color: #404040; 1395 | text-shadow: 0 1px 0 #ffffff; 1396 | border: 0; 1397 | padding: 5px 10px; 1398 | -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); 1399 | -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); 1400 | box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); 1401 | } 1402 | .topbar-inner, .topbar .fill { 1403 | background-color: #222; 1404 | background-color: #222222; 1405 | background-repeat: repeat-x; 1406 | background-image: -khtml-gradient(linear, left top, left bottom, from(#333333), to(#222222)); 1407 | background-image: -moz-linear-gradient(top, #333333, #222222); 1408 | background-image: -ms-linear-gradient(top, #333333, #222222); 1409 | background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #333333), color-stop(100%, #222222)); 1410 | background-image: -webkit-linear-gradient(top, #333333, #222222); 1411 | background-image: -o-linear-gradient(top, #333333, #222222); 1412 | background-image: linear-gradient(top, #333333, #222222); 1413 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0); 1414 | -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); 1415 | -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); 1416 | box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); 1417 | } 1418 | .topbar div > ul, .nav { 1419 | display: block; 1420 | float: left; 1421 | margin: 0 10px 0 0; 1422 | position: relative; 1423 | left: 0; 1424 | } 1425 | .topbar div > ul > li, .nav > li { 1426 | display: block; 1427 | float: left; 1428 | } 1429 | .topbar div > ul a, .nav a { 1430 | display: block; 1431 | float: none; 1432 | padding: 10px 10px 11px; 1433 | line-height: 19px; 1434 | text-decoration: none; 1435 | } 1436 | .topbar div > ul a:hover, .nav a:hover { 1437 | color: #ffffff; 1438 | text-decoration: none; 1439 | } 1440 | .topbar div > ul .active > a, .nav .active > a { 1441 | background-color: #222; 1442 | background-color: rgba(0, 0, 0, 0.5); 1443 | } 1444 | .topbar div > ul.secondary-nav, .nav.secondary-nav { 1445 | float: right; 1446 | margin-left: 10px; 1447 | margin-right: 0; 1448 | } 1449 | .topbar div > ul.secondary-nav .menu-dropdown, 1450 | .nav.secondary-nav .menu-dropdown, 1451 | .topbar div > ul.secondary-nav .dropdown-menu, 1452 | .nav.secondary-nav .dropdown-menu { 1453 | right: 0; 1454 | border: 0; 1455 | } 1456 | .topbar div > ul a.menu:hover, 1457 | .nav a.menu:hover, 1458 | .topbar div > ul li.open .menu, 1459 | .nav li.open .menu, 1460 | .topbar div > ul .dropdown-toggle:hover, 1461 | .nav .dropdown-toggle:hover, 1462 | .topbar div > ul .dropdown.open .dropdown-toggle, 1463 | .nav .dropdown.open .dropdown-toggle { 1464 | background: #444; 1465 | background: rgba(255, 255, 255, 0.05); 1466 | } 1467 | .topbar div > ul .menu-dropdown, 1468 | .nav .menu-dropdown, 1469 | .topbar div > ul .dropdown-menu, 1470 | .nav .dropdown-menu { 1471 | background-color: #333; 1472 | } 1473 | .topbar div > ul .menu-dropdown a.menu, 1474 | .nav .menu-dropdown a.menu, 1475 | .topbar div > ul .dropdown-menu a.menu, 1476 | .nav .dropdown-menu a.menu, 1477 | .topbar div > ul .menu-dropdown .dropdown-toggle, 1478 | .nav .menu-dropdown .dropdown-toggle, 1479 | .topbar div > ul .dropdown-menu .dropdown-toggle, 1480 | .nav .dropdown-menu .dropdown-toggle { 1481 | color: #ffffff; 1482 | } 1483 | .topbar div > ul .menu-dropdown a.menu.open, 1484 | .nav .menu-dropdown a.menu.open, 1485 | .topbar div > ul .dropdown-menu a.menu.open, 1486 | .nav .dropdown-menu a.menu.open, 1487 | .topbar div > ul .menu-dropdown .dropdown-toggle.open, 1488 | .nav .menu-dropdown .dropdown-toggle.open, 1489 | .topbar div > ul .dropdown-menu .dropdown-toggle.open, 1490 | .nav .dropdown-menu .dropdown-toggle.open { 1491 | background: #444; 1492 | background: rgba(255, 255, 255, 0.05); 1493 | } 1494 | .topbar div > ul .menu-dropdown li a, 1495 | .nav .menu-dropdown li a, 1496 | .topbar div > ul .dropdown-menu li a, 1497 | .nav .dropdown-menu li a { 1498 | color: #999; 1499 | text-shadow: 0 1px 0 rgba(0, 0, 0, 0.5); 1500 | } 1501 | .topbar div > ul .menu-dropdown li a:hover, 1502 | .nav .menu-dropdown li a:hover, 1503 | .topbar div > ul .dropdown-menu li a:hover, 1504 | .nav .dropdown-menu li a:hover { 1505 | background-color: #191919; 1506 | background-repeat: repeat-x; 1507 | background-image: -khtml-gradient(linear, left top, left bottom, from(#292929), to(#191919)); 1508 | background-image: -moz-linear-gradient(top, #292929, #191919); 1509 | background-image: -ms-linear-gradient(top, #292929, #191919); 1510 | background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #292929), color-stop(100%, #191919)); 1511 | background-image: -webkit-linear-gradient(top, #292929, #191919); 1512 | background-image: -o-linear-gradient(top, #292929, #191919); 1513 | background-image: linear-gradient(top, #292929, #191919); 1514 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#292929', endColorstr='#191919', GradientType=0); 1515 | color: #ffffff; 1516 | } 1517 | .topbar div > ul .menu-dropdown .active a, 1518 | .nav .menu-dropdown .active a, 1519 | .topbar div > ul .dropdown-menu .active a, 1520 | .nav .dropdown-menu .active a { 1521 | color: #ffffff; 1522 | } 1523 | .topbar div > ul .menu-dropdown .divider, 1524 | .nav .menu-dropdown .divider, 1525 | .topbar div > ul .dropdown-menu .divider, 1526 | .nav .dropdown-menu .divider { 1527 | background-color: #222; 1528 | border-color: #444; 1529 | } 1530 | .topbar ul .menu-dropdown li a, .topbar ul .dropdown-menu li a { 1531 | padding: 4px 15px; 1532 | } 1533 | li.menu, .dropdown { 1534 | position: relative; 1535 | } 1536 | a.menu:after, .dropdown-toggle:after { 1537 | width: 0; 1538 | height: 0; 1539 | display: inline-block; 1540 | content: "↓"; 1541 | text-indent: -99999px; 1542 | vertical-align: top; 1543 | margin-top: 8px; 1544 | margin-left: 4px; 1545 | border-left: 4px solid transparent; 1546 | border-right: 4px solid transparent; 1547 | border-top: 4px solid #ffffff; 1548 | filter: alpha(opacity=50); 1549 | -khtml-opacity: 0.5; 1550 | -moz-opacity: 0.5; 1551 | opacity: 0.5; 1552 | } 1553 | .menu-dropdown, .dropdown-menu { 1554 | background-color: #ffffff; 1555 | float: left; 1556 | display: none; 1557 | position: absolute; 1558 | top: 40px; 1559 | z-index: 900; 1560 | min-width: 160px; 1561 | max-width: 220px; 1562 | _width: 160px; 1563 | margin-left: 0; 1564 | margin-right: 0; 1565 | padding: 6px 0; 1566 | zoom: 1; 1567 | border-color: #999; 1568 | border-color: rgba(0, 0, 0, 0.2); 1569 | border-style: solid; 1570 | border-width: 0 1px 1px; 1571 | -webkit-border-radius: 0 0 6px 6px; 1572 | -moz-border-radius: 0 0 6px 6px; 1573 | border-radius: 0 0 6px 6px; 1574 | -webkit-box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); 1575 | -moz-box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); 1576 | box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); 1577 | -webkit-background-clip: padding-box; 1578 | -moz-background-clip: padding-box; 1579 | background-clip: padding-box; 1580 | } 1581 | .menu-dropdown li, .dropdown-menu li { 1582 | float: none; 1583 | display: block; 1584 | background-color: none; 1585 | } 1586 | .menu-dropdown .divider, .dropdown-menu .divider { 1587 | height: 1px; 1588 | margin: 5px 0; 1589 | overflow: hidden; 1590 | background-color: #eee; 1591 | border-bottom: 1px solid #ffffff; 1592 | } 1593 | .topbar .dropdown-menu a, .dropdown-menu a { 1594 | display: block; 1595 | padding: 4px 15px; 1596 | clear: both; 1597 | font-weight: normal; 1598 | line-height: 18px; 1599 | color: #808080; 1600 | text-shadow: 0 1px 0 #ffffff; 1601 | } 1602 | .topbar .dropdown-menu a:hover, 1603 | .dropdown-menu a:hover, 1604 | .topbar .dropdown-menu a.hover, 1605 | .dropdown-menu a.hover { 1606 | background-color: #dddddd; 1607 | background-repeat: repeat-x; 1608 | background-image: -khtml-gradient(linear, left top, left bottom, from(#eeeeee), to(#dddddd)); 1609 | background-image: -moz-linear-gradient(top, #eeeeee, #dddddd); 1610 | background-image: -ms-linear-gradient(top, #eeeeee, #dddddd); 1611 | background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #eeeeee), color-stop(100%, #dddddd)); 1612 | background-image: -webkit-linear-gradient(top, #eeeeee, #dddddd); 1613 | background-image: -o-linear-gradient(top, #eeeeee, #dddddd); 1614 | background-image: linear-gradient(top, #eeeeee, #dddddd); 1615 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#dddddd', GradientType=0); 1616 | color: #404040; 1617 | text-decoration: none; 1618 | -webkit-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.025), inset 0 -1px rgba(0, 0, 0, 0.025); 1619 | -moz-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.025), inset 0 -1px rgba(0, 0, 0, 0.025); 1620 | box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.025), inset 0 -1px rgba(0, 0, 0, 0.025); 1621 | } 1622 | .open .menu, 1623 | .dropdown.open .menu, 1624 | .open .dropdown-toggle, 1625 | .dropdown.open .dropdown-toggle { 1626 | color: #ffffff; 1627 | background: #ccc; 1628 | background: rgba(0, 0, 0, 0.3); 1629 | } 1630 | .open .menu-dropdown, 1631 | .dropdown.open .menu-dropdown, 1632 | .open .dropdown-menu, 1633 | .dropdown.open .dropdown-menu { 1634 | display: block; 1635 | } 1636 | .tabs, .pills { 1637 | margin: 0 0 18px; 1638 | padding: 0; 1639 | list-style: none; 1640 | zoom: 1; 1641 | } 1642 | .tabs:before, 1643 | .pills:before, 1644 | .tabs:after, 1645 | .pills:after { 1646 | display: table; 1647 | content: ""; 1648 | zoom: 1; 1649 | } 1650 | .tabs:after, .pills:after { 1651 | clear: both; 1652 | } 1653 | .tabs > li, .pills > li { 1654 | float: left; 1655 | } 1656 | .tabs > li > a, .pills > li > a { 1657 | display: block; 1658 | } 1659 | .tabs { 1660 | border-color: #ddd; 1661 | border-style: solid; 1662 | border-width: 0 0 1px; 1663 | } 1664 | .tabs > li { 1665 | position: relative; 1666 | margin-bottom: -1px; 1667 | } 1668 | .tabs > li > a { 1669 | padding: 0 15px; 1670 | margin-right: 2px; 1671 | line-height: 34px; 1672 | border: 1px solid transparent; 1673 | -webkit-border-radius: 4px 4px 0 0; 1674 | -moz-border-radius: 4px 4px 0 0; 1675 | border-radius: 4px 4px 0 0; 1676 | } 1677 | .tabs > li > a:hover { 1678 | text-decoration: none; 1679 | background-color: #eee; 1680 | border-color: #eee #eee #ddd; 1681 | } 1682 | .tabs .active > a, .tabs .active > a:hover { 1683 | color: #808080; 1684 | background-color: #ffffff; 1685 | border: 1px solid #ddd; 1686 | border-bottom-color: transparent; 1687 | cursor: default; 1688 | } 1689 | .tabs .menu-dropdown, .tabs .dropdown-menu { 1690 | top: 35px; 1691 | border-width: 1px; 1692 | -webkit-border-radius: 0 6px 6px 6px; 1693 | -moz-border-radius: 0 6px 6px 6px; 1694 | border-radius: 0 6px 6px 6px; 1695 | } 1696 | .tabs a.menu:after, .tabs .dropdown-toggle:after { 1697 | border-top-color: #999; 1698 | margin-top: 15px; 1699 | margin-left: 5px; 1700 | } 1701 | .tabs li.open.menu .menu, .tabs .open.dropdown .dropdown-toggle { 1702 | border-color: #999; 1703 | } 1704 | .tabs li.open a.menu:after, .tabs .dropdown.open .dropdown-toggle:after { 1705 | border-top-color: #555; 1706 | } 1707 | .pills a { 1708 | margin: 5px 3px 5px 0; 1709 | padding: 0 15px; 1710 | line-height: 30px; 1711 | text-shadow: 0 1px 1px #ffffff; 1712 | -webkit-border-radius: 15px; 1713 | -moz-border-radius: 15px; 1714 | border-radius: 15px; 1715 | } 1716 | .pills a:hover { 1717 | color: #ffffff; 1718 | text-decoration: none; 1719 | text-shadow: 0 1px 1px rgba(0, 0, 0, 0.25); 1720 | background-color: #00438a; 1721 | } 1722 | .pills .active a { 1723 | color: #ffffff; 1724 | text-shadow: 0 1px 1px rgba(0, 0, 0, 0.25); 1725 | background-color: #0069d6; 1726 | } 1727 | .pills-vertical > li { 1728 | float: none; 1729 | } 1730 | .tab-content > .tab-pane, .pill-content > .pill-pane { 1731 | display: none; 1732 | } 1733 | .tab-content > .active, .pill-content > .active { 1734 | display: block; 1735 | } 1736 | .breadcrumb { 1737 | padding: 7px 14px; 1738 | margin: 0 0 18px; 1739 | background-color: #f5f5f5; 1740 | background-repeat: repeat-x; 1741 | background-image: -khtml-gradient(linear, left top, left bottom, from(#ffffff), to(#f5f5f5)); 1742 | background-image: -moz-linear-gradient(top, #ffffff, #f5f5f5); 1743 | background-image: -ms-linear-gradient(top, #ffffff, #f5f5f5); 1744 | background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff), color-stop(100%, #f5f5f5)); 1745 | background-image: -webkit-linear-gradient(top, #ffffff, #f5f5f5); 1746 | background-image: -o-linear-gradient(top, #ffffff, #f5f5f5); 1747 | background-image: linear-gradient(top, #ffffff, #f5f5f5); 1748 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0); 1749 | border: 1px solid #ddd; 1750 | -webkit-border-radius: 3px; 1751 | -moz-border-radius: 3px; 1752 | border-radius: 3px; 1753 | -webkit-box-shadow: inset 0 1px 0 #ffffff; 1754 | -moz-box-shadow: inset 0 1px 0 #ffffff; 1755 | box-shadow: inset 0 1px 0 #ffffff; 1756 | } 1757 | .breadcrumb li { 1758 | display: inline; 1759 | text-shadow: 0 1px 0 #ffffff; 1760 | } 1761 | .breadcrumb .divider { 1762 | padding: 0 5px; 1763 | color: #bfbfbf; 1764 | } 1765 | .breadcrumb .active a { 1766 | color: #404040; 1767 | } 1768 | .hero-unit { 1769 | background-color: #f5f5f5; 1770 | margin-bottom: 30px; 1771 | padding: 60px; 1772 | -webkit-border-radius: 6px; 1773 | -moz-border-radius: 6px; 1774 | border-radius: 6px; 1775 | } 1776 | .hero-unit h1 { 1777 | margin-bottom: 0; 1778 | font-size: 60px; 1779 | line-height: 1; 1780 | letter-spacing: -1px; 1781 | } 1782 | .hero-unit p { 1783 | font-size: 18px; 1784 | font-weight: 200; 1785 | line-height: 27px; 1786 | } 1787 | footer { 1788 | margin-top: 17px; 1789 | padding-top: 17px; 1790 | border-top: 1px solid #eee; 1791 | } 1792 | .page-header { 1793 | margin-bottom: 17px; 1794 | border-bottom: 1px solid #ddd; 1795 | -webkit-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); 1796 | -moz-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); 1797 | box-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); 1798 | } 1799 | .page-header h1 { 1800 | margin-bottom: 8px; 1801 | } 1802 | .btn.danger, 1803 | .alert-message.danger, 1804 | .btn.danger:hover, 1805 | .alert-message.danger:hover, 1806 | .btn.error, 1807 | .alert-message.error, 1808 | .btn.error:hover, 1809 | .alert-message.error:hover, 1810 | .btn.success, 1811 | .alert-message.success, 1812 | .btn.success:hover, 1813 | .alert-message.success:hover, 1814 | .btn.info, 1815 | .alert-message.info, 1816 | .btn.info:hover, 1817 | .alert-message.info:hover { 1818 | color: #ffffff; 1819 | } 1820 | .btn .close, .alert-message .close { 1821 | font-family: Arial, sans-serif; 1822 | line-height: 18px; 1823 | } 1824 | .btn.danger, 1825 | .alert-message.danger, 1826 | .btn.error, 1827 | .alert-message.error { 1828 | background-color: #c43c35; 1829 | background-repeat: repeat-x; 1830 | background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35)); 1831 | background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); 1832 | background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35); 1833 | background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35)); 1834 | background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); 1835 | background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); 1836 | background-image: linear-gradient(top, #ee5f5b, #c43c35); 1837 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0); 1838 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); 1839 | border-color: #c43c35 #c43c35 #882a25; 1840 | border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); 1841 | } 1842 | .btn.success, .alert-message.success { 1843 | background-color: #57a957; 1844 | background-repeat: repeat-x; 1845 | background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957)); 1846 | background-image: -moz-linear-gradient(top, #62c462, #57a957); 1847 | background-image: -ms-linear-gradient(top, #62c462, #57a957); 1848 | background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957)); 1849 | background-image: -webkit-linear-gradient(top, #62c462, #57a957); 1850 | background-image: -o-linear-gradient(top, #62c462, #57a957); 1851 | background-image: linear-gradient(top, #62c462, #57a957); 1852 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0); 1853 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); 1854 | border-color: #57a957 #57a957 #3d773d; 1855 | border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); 1856 | } 1857 | .btn.info, .alert-message.info { 1858 | background-color: #339bb9; 1859 | background-repeat: repeat-x; 1860 | background-image: -khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9)); 1861 | background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); 1862 | background-image: -ms-linear-gradient(top, #5bc0de, #339bb9); 1863 | background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9)); 1864 | background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); 1865 | background-image: -o-linear-gradient(top, #5bc0de, #339bb9); 1866 | background-image: linear-gradient(top, #5bc0de, #339bb9); 1867 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0); 1868 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); 1869 | border-color: #339bb9 #339bb9 #22697d; 1870 | border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); 1871 | } 1872 | .btn { 1873 | cursor: pointer; 1874 | display: inline-block; 1875 | background-color: #e6e6e6; 1876 | background-repeat: no-repeat; 1877 | background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6)); 1878 | background-image: -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); 1879 | background-image: -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6); 1880 | background-image: -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); 1881 | background-image: -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); 1882 | background-image: linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); 1883 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0); 1884 | padding: 5px 14px 6px; 1885 | text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); 1886 | color: #333; 1887 | font-size: 13px; 1888 | line-height: normal; 1889 | border: 1px solid #ccc; 1890 | border-bottom-color: #bbb; 1891 | -webkit-border-radius: 4px; 1892 | -moz-border-radius: 4px; 1893 | border-radius: 4px; 1894 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); 1895 | -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); 1896 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); 1897 | -webkit-transform-style: preserve-3d; 1898 | -webkit-transition: 0.1s linear all; 1899 | -moz-transition: 0.1s linear all; 1900 | -ms-transition: 0.1s linear all; 1901 | -o-transition: 0.1s linear all; 1902 | transition: 0.1s linear all; 1903 | } 1904 | .btn:hover { 1905 | background-position: 0 -15px; 1906 | color: #333; 1907 | text-decoration: none; 1908 | } 1909 | .btn:focus { 1910 | outline: 1px dotted #666; 1911 | } 1912 | .btn.primary { 1913 | color: #ffffff; 1914 | background-color: #0064cd; 1915 | background-repeat: repeat-x; 1916 | background-image: -khtml-gradient(linear, left top, left bottom, from(#049cdb), to(#0064cd)); 1917 | background-image: -moz-linear-gradient(top, #049cdb, #0064cd); 1918 | background-image: -ms-linear-gradient(top, #049cdb, #0064cd); 1919 | background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #049cdb), color-stop(100%, #0064cd)); 1920 | background-image: -webkit-linear-gradient(top, #049cdb, #0064cd); 1921 | background-image: -o-linear-gradient(top, #049cdb, #0064cd); 1922 | background-image: linear-gradient(top, #049cdb, #0064cd); 1923 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#049cdb', endColorstr='#0064cd', GradientType=0); 1924 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); 1925 | border-color: #0064cd #0064cd #003f81; 1926 | border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); 1927 | } 1928 | .btn.active, .btn :active { 1929 | -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); 1930 | -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); 1931 | box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); 1932 | } 1933 | .btn.disabled { 1934 | cursor: default; 1935 | background-image: none; 1936 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 1937 | filter: alpha(opacity=65); 1938 | -khtml-opacity: 0.65; 1939 | -moz-opacity: 0.65; 1940 | opacity: 0.65; 1941 | -webkit-box-shadow: none; 1942 | -moz-box-shadow: none; 1943 | box-shadow: none; 1944 | } 1945 | .btn[disabled] { 1946 | cursor: default; 1947 | background-image: none; 1948 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 1949 | filter: alpha(opacity=65); 1950 | -khtml-opacity: 0.65; 1951 | -moz-opacity: 0.65; 1952 | opacity: 0.65; 1953 | -webkit-box-shadow: none; 1954 | -moz-box-shadow: none; 1955 | box-shadow: none; 1956 | } 1957 | .btn.large { 1958 | font-size: 15px; 1959 | line-height: normal; 1960 | padding: 9px 14px 9px; 1961 | -webkit-border-radius: 6px; 1962 | -moz-border-radius: 6px; 1963 | border-radius: 6px; 1964 | } 1965 | .btn.small { 1966 | padding: 7px 9px 7px; 1967 | font-size: 11px; 1968 | } 1969 | :root .alert-message, :root .btn { 1970 | border-radius: 0 \0; 1971 | } 1972 | button.btn::-moz-focus-inner, input[type=submit].btn::-moz-focus-inner { 1973 | padding: 0; 1974 | border: 0; 1975 | } 1976 | .close { 1977 | float: right; 1978 | color: #000000; 1979 | font-size: 20px; 1980 | font-weight: bold; 1981 | line-height: 13.5px; 1982 | text-shadow: 0 1px 0 #ffffff; 1983 | filter: alpha(opacity=25); 1984 | -khtml-opacity: 0.25; 1985 | -moz-opacity: 0.25; 1986 | opacity: 0.25; 1987 | } 1988 | .close:hover { 1989 | color: #000000; 1990 | text-decoration: none; 1991 | filter: alpha(opacity=40); 1992 | -khtml-opacity: 0.4; 1993 | -moz-opacity: 0.4; 1994 | opacity: 0.4; 1995 | } 1996 | .alert-message { 1997 | position: relative; 1998 | padding: 7px 15px; 1999 | margin-bottom: 18px; 2000 | color: #404040; 2001 | background-color: #eedc94; 2002 | background-repeat: repeat-x; 2003 | background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1), to(#eedc94)); 2004 | background-image: -moz-linear-gradient(top, #fceec1, #eedc94); 2005 | background-image: -ms-linear-gradient(top, #fceec1, #eedc94); 2006 | background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fceec1), color-stop(100%, #eedc94)); 2007 | background-image: -webkit-linear-gradient(top, #fceec1, #eedc94); 2008 | background-image: -o-linear-gradient(top, #fceec1, #eedc94); 2009 | background-image: linear-gradient(top, #fceec1, #eedc94); 2010 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fceec1', endColorstr='#eedc94', GradientType=0); 2011 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); 2012 | border-color: #eedc94 #eedc94 #e4c652; 2013 | border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); 2014 | text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); 2015 | border-width: 1px; 2016 | border-style: solid; 2017 | -webkit-border-radius: 4px; 2018 | -moz-border-radius: 4px; 2019 | border-radius: 4px; 2020 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); 2021 | -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); 2022 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); 2023 | } 2024 | .alert-message .close { 2025 | margin-top: 1px; 2026 | *margin-top: 0; 2027 | } 2028 | .alert-message a { 2029 | font-weight: bold; 2030 | color: #404040; 2031 | } 2032 | .alert-message.danger p a, 2033 | .alert-message.error p a, 2034 | .alert-message.success p a, 2035 | .alert-message.info p a { 2036 | color: #ffffff; 2037 | } 2038 | .alert-message h5 { 2039 | line-height: 18px; 2040 | } 2041 | .alert-message p { 2042 | margin-bottom: 0; 2043 | } 2044 | .alert-message div { 2045 | margin-top: 5px; 2046 | margin-bottom: 2px; 2047 | line-height: 28px; 2048 | } 2049 | .alert-message .btn { 2050 | -webkit-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.25); 2051 | -moz-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.25); 2052 | box-shadow: 0 1px 0 rgba(255, 255, 255, 0.25); 2053 | } 2054 | .alert-message.block-message { 2055 | background-image: none; 2056 | background-color: #fdf5d9; 2057 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 2058 | padding: 14px; 2059 | border-color: #fceec1; 2060 | -webkit-box-shadow: none; 2061 | -moz-box-shadow: none; 2062 | box-shadow: none; 2063 | } 2064 | .alert-message.block-message ul, .alert-message.block-message p { 2065 | margin-right: 30px; 2066 | } 2067 | .alert-message.block-message ul { 2068 | margin-bottom: 0; 2069 | } 2070 | .alert-message.block-message li { 2071 | color: #404040; 2072 | } 2073 | .alert-message.block-message .alert-actions { 2074 | margin-top: 5px; 2075 | } 2076 | .alert-message.block-message.error, .alert-message.block-message.success, .alert-message.block-message.info { 2077 | color: #404040; 2078 | text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); 2079 | } 2080 | .alert-message.block-message.error { 2081 | background-color: #fddfde; 2082 | border-color: #fbc7c6; 2083 | } 2084 | .alert-message.block-message.success { 2085 | background-color: #d1eed1; 2086 | border-color: #bfe7bf; 2087 | } 2088 | .alert-message.block-message.info { 2089 | background-color: #ddf4fb; 2090 | border-color: #c6edf9; 2091 | } 2092 | .alert-message.block-message.danger p a, 2093 | .alert-message.block-message.error p a, 2094 | .alert-message.block-message.success p a, 2095 | .alert-message.block-message.info p a { 2096 | color: #404040; 2097 | } 2098 | .pagination { 2099 | height: 36px; 2100 | margin: 18px 0; 2101 | } 2102 | .pagination ul { 2103 | float: left; 2104 | margin: 0; 2105 | border: 1px solid #ddd; 2106 | border: 1px solid rgba(0, 0, 0, 0.15); 2107 | -webkit-border-radius: 3px; 2108 | -moz-border-radius: 3px; 2109 | border-radius: 3px; 2110 | -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); 2111 | -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); 2112 | box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); 2113 | } 2114 | .pagination li { 2115 | display: inline; 2116 | } 2117 | .pagination a { 2118 | float: left; 2119 | padding: 0 14px; 2120 | line-height: 34px; 2121 | border-right: 1px solid; 2122 | border-right-color: #ddd; 2123 | border-right-color: rgba(0, 0, 0, 0.15); 2124 | *border-right-color: #ddd; 2125 | /* IE6-7 */ 2126 | 2127 | text-decoration: none; 2128 | } 2129 | .pagination a:hover, .pagination .active a { 2130 | background-color: #c7eefe; 2131 | } 2132 | .pagination .disabled a, .pagination .disabled a:hover { 2133 | background-color: transparent; 2134 | color: #bfbfbf; 2135 | } 2136 | .pagination .next a { 2137 | border: 0; 2138 | } 2139 | .well { 2140 | background-color: #f5f5f5; 2141 | margin-bottom: 20px; 2142 | padding: 19px; 2143 | min-height: 20px; 2144 | border: 1px solid #eee; 2145 | border: 1px solid rgba(0, 0, 0, 0.05); 2146 | -webkit-border-radius: 4px; 2147 | -moz-border-radius: 4px; 2148 | border-radius: 4px; 2149 | -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); 2150 | -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); 2151 | box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); 2152 | } 2153 | .well blockquote { 2154 | border-color: #ddd; 2155 | border-color: rgba(0, 0, 0, 0.15); 2156 | } 2157 | .modal-backdrop { 2158 | background-color: #000000; 2159 | position: fixed; 2160 | top: 0; 2161 | left: 0; 2162 | right: 0; 2163 | bottom: 0; 2164 | z-index: 10000; 2165 | } 2166 | .modal-backdrop.fade { 2167 | opacity: 0; 2168 | } 2169 | .modal-backdrop, .modal-backdrop.fade.in { 2170 | filter: alpha(opacity=80); 2171 | -khtml-opacity: 0.8; 2172 | -moz-opacity: 0.8; 2173 | opacity: 0.8; 2174 | } 2175 | .modal { 2176 | position: fixed; 2177 | top: 50%; 2178 | left: 50%; 2179 | z-index: 11000; 2180 | width: 560px; 2181 | margin: -250px 0 0 -280px; 2182 | background-color: #ffffff; 2183 | border: 1px solid #999; 2184 | border: 1px solid rgba(0, 0, 0, 0.3); 2185 | *border: 1px solid #999; 2186 | /* IE6-7 */ 2187 | 2188 | -webkit-border-radius: 6px; 2189 | -moz-border-radius: 6px; 2190 | border-radius: 6px; 2191 | -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); 2192 | -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); 2193 | box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); 2194 | -webkit-background-clip: padding-box; 2195 | -moz-background-clip: padding-box; 2196 | background-clip: padding-box; 2197 | } 2198 | .modal .close { 2199 | margin-top: 7px; 2200 | } 2201 | .modal.fade { 2202 | -webkit-transform-style: preserve-3d; 2203 | -webkit-transition: opacity .3s linear, top .3s ease-out; 2204 | -moz-transition: opacity .3s linear, top .3s ease-out; 2205 | -ms-transition: opacity .3s linear, top .3s ease-out; 2206 | -o-transition: opacity .3s linear, top .3s ease-out; 2207 | transition: opacity .3s linear, top .3s ease-out; 2208 | top: -25%; 2209 | } 2210 | .modal.fade.in { 2211 | top: 50%; 2212 | } 2213 | .modal-header { 2214 | border-bottom: 1px solid #eee; 2215 | padding: 5px 15px; 2216 | } 2217 | .modal-body { 2218 | padding: 15px; 2219 | } 2220 | .modal-body form { 2221 | margin-bottom: 0; 2222 | } 2223 | .modal-footer { 2224 | background-color: #f5f5f5; 2225 | padding: 14px 15px 15px; 2226 | border-top: 1px solid #ddd; 2227 | -webkit-border-radius: 0 0 6px 6px; 2228 | -moz-border-radius: 0 0 6px 6px; 2229 | border-radius: 0 0 6px 6px; 2230 | -webkit-box-shadow: inset 0 1px 0 #ffffff; 2231 | -moz-box-shadow: inset 0 1px 0 #ffffff; 2232 | box-shadow: inset 0 1px 0 #ffffff; 2233 | zoom: 1; 2234 | margin-bottom: 0; 2235 | } 2236 | .modal-footer:before, .modal-footer:after { 2237 | display: table; 2238 | content: ""; 2239 | zoom: 1; 2240 | } 2241 | .modal-footer:after { 2242 | clear: both; 2243 | } 2244 | .modal-footer .btn { 2245 | float: right; 2246 | margin-left: 5px; 2247 | } 2248 | .modal .popover, .modal .twipsy { 2249 | z-index: 12000; 2250 | } 2251 | .twipsy { 2252 | display: block; 2253 | position: absolute; 2254 | visibility: visible; 2255 | padding: 5px; 2256 | font-size: 11px; 2257 | z-index: 1000; 2258 | filter: alpha(opacity=80); 2259 | -khtml-opacity: 0.8; 2260 | -moz-opacity: 0.8; 2261 | opacity: 0.8; 2262 | } 2263 | .twipsy.fade.in { 2264 | filter: alpha(opacity=80); 2265 | -khtml-opacity: 0.8; 2266 | -moz-opacity: 0.8; 2267 | opacity: 0.8; 2268 | } 2269 | .twipsy.above .twipsy-arrow { 2270 | bottom: 0; 2271 | left: 50%; 2272 | margin-left: -5px; 2273 | border-left: 5px solid transparent; 2274 | border-right: 5px solid transparent; 2275 | border-top: 5px solid #000000; 2276 | } 2277 | .twipsy.left .twipsy-arrow { 2278 | top: 50%; 2279 | right: 0; 2280 | margin-top: -5px; 2281 | border-top: 5px solid transparent; 2282 | border-bottom: 5px solid transparent; 2283 | border-left: 5px solid #000000; 2284 | } 2285 | .twipsy.below .twipsy-arrow { 2286 | top: 0; 2287 | left: 50%; 2288 | margin-left: -5px; 2289 | border-left: 5px solid transparent; 2290 | border-right: 5px solid transparent; 2291 | border-bottom: 5px solid #000000; 2292 | } 2293 | .twipsy.right .twipsy-arrow { 2294 | top: 50%; 2295 | left: 0; 2296 | margin-top: -5px; 2297 | border-top: 5px solid transparent; 2298 | border-bottom: 5px solid transparent; 2299 | border-right: 5px solid #000000; 2300 | } 2301 | .twipsy-inner { 2302 | padding: 3px 8px; 2303 | background-color: #000000; 2304 | color: white; 2305 | text-align: center; 2306 | max-width: 200px; 2307 | text-decoration: none; 2308 | -webkit-border-radius: 4px; 2309 | -moz-border-radius: 4px; 2310 | border-radius: 4px; 2311 | } 2312 | .twipsy-arrow { 2313 | position: absolute; 2314 | width: 0; 2315 | height: 0; 2316 | } 2317 | .popover { 2318 | position: absolute; 2319 | top: 0; 2320 | left: 0; 2321 | z-index: 1000; 2322 | padding: 5px; 2323 | display: none; 2324 | } 2325 | .popover.above .arrow { 2326 | bottom: 0; 2327 | left: 50%; 2328 | margin-left: -5px; 2329 | border-left: 5px solid transparent; 2330 | border-right: 5px solid transparent; 2331 | border-top: 5px solid #000000; 2332 | } 2333 | .popover.right .arrow { 2334 | top: 50%; 2335 | left: 0; 2336 | margin-top: -5px; 2337 | border-top: 5px solid transparent; 2338 | border-bottom: 5px solid transparent; 2339 | border-right: 5px solid #000000; 2340 | } 2341 | .popover.below .arrow { 2342 | top: 0; 2343 | left: 50%; 2344 | margin-left: -5px; 2345 | border-left: 5px solid transparent; 2346 | border-right: 5px solid transparent; 2347 | border-bottom: 5px solid #000000; 2348 | } 2349 | .popover.left .arrow { 2350 | top: 50%; 2351 | right: 0; 2352 | margin-top: -5px; 2353 | border-top: 5px solid transparent; 2354 | border-bottom: 5px solid transparent; 2355 | border-left: 5px solid #000000; 2356 | } 2357 | .popover .arrow { 2358 | position: absolute; 2359 | width: 0; 2360 | height: 0; 2361 | } 2362 | .popover .inner { 2363 | background: #000000; 2364 | background: rgba(0, 0, 0, 0.8); 2365 | padding: 3px; 2366 | overflow: hidden; 2367 | width: 280px; 2368 | -webkit-border-radius: 6px; 2369 | -moz-border-radius: 6px; 2370 | border-radius: 6px; 2371 | -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); 2372 | -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); 2373 | box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); 2374 | } 2375 | .popover .title { 2376 | background-color: #f5f5f5; 2377 | padding: 9px 15px; 2378 | line-height: 1; 2379 | -webkit-border-radius: 3px 3px 0 0; 2380 | -moz-border-radius: 3px 3px 0 0; 2381 | border-radius: 3px 3px 0 0; 2382 | border-bottom: 1px solid #eee; 2383 | } 2384 | .popover .content { 2385 | background-color: #ffffff; 2386 | padding: 14px; 2387 | -webkit-border-radius: 0 0 3px 3px; 2388 | -moz-border-radius: 0 0 3px 3px; 2389 | border-radius: 0 0 3px 3px; 2390 | -webkit-background-clip: padding-box; 2391 | -moz-background-clip: padding-box; 2392 | background-clip: padding-box; 2393 | } 2394 | .popover .content p, .popover .content ul, .popover .content ol { 2395 | margin-bottom: 0; 2396 | } 2397 | .fade { 2398 | -webkit-transform-style: preserve-3d; 2399 | -webkit-transition: opacity 0.15s linear; 2400 | -moz-transition: opacity 0.15s linear; 2401 | -ms-transition: opacity 0.15s linear; 2402 | -o-transition: opacity 0.15s linear; 2403 | transition: opacity 0.15s linear; 2404 | opacity: 0; 2405 | } 2406 | .fade.in { 2407 | opacity: 1; 2408 | } 2409 | .label { 2410 | padding: 1px 3px 2px; 2411 | font-size: 9.75px; 2412 | font-weight: bold; 2413 | color: #ffffff; 2414 | text-transform: uppercase; 2415 | white-space: nowrap; 2416 | background-color: #bfbfbf; 2417 | -webkit-border-radius: 3px; 2418 | -moz-border-radius: 3px; 2419 | border-radius: 3px; 2420 | } 2421 | .label.important { 2422 | background-color: #c43c35; 2423 | } 2424 | .label.warning { 2425 | background-color: #f89406; 2426 | } 2427 | .label.success { 2428 | background-color: #46a546; 2429 | } 2430 | .label.notice { 2431 | background-color: #62cffc; 2432 | } 2433 | .media-grid { 2434 | margin-left: -20px; 2435 | margin-bottom: 0; 2436 | zoom: 1; 2437 | } 2438 | .media-grid:before, .media-grid:after { 2439 | display: table; 2440 | content: ""; 2441 | zoom: 1; 2442 | } 2443 | .media-grid:after { 2444 | clear: both; 2445 | } 2446 | .media-grid li { 2447 | display: inline; 2448 | } 2449 | .media-grid a { 2450 | float: left; 2451 | padding: 4px; 2452 | margin: 0 0 18px 20px; 2453 | border: 1px solid #ddd; 2454 | -webkit-border-radius: 4px; 2455 | -moz-border-radius: 4px; 2456 | border-radius: 4px; 2457 | -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); 2458 | -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); 2459 | box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); 2460 | } 2461 | .media-grid a img { 2462 | display: block; 2463 | } 2464 | .media-grid a:hover { 2465 | border-color: #0069d6; 2466 | -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); 2467 | -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); 2468 | box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); 2469 | } 2470 | --------------------------------------------------------------------------------