├── static
├── favicon.ico
├── img
│ ├── glyphicons-halflings.png
│ └── glyphicons-halflings-white.png
├── css
│ ├── application.css
│ └── bootstrap.min.css
└── js
│ ├── flash.js
│ ├── jquery.cookie.js
│ ├── bootstrap-typeahead.js
│ ├── bootstrap.min.js
│ └── bootstrap.js
├── .gitignore
├── README.md
├── Setup.hs
├── .env
├── LICENSE
├── hails-auth.cabal
├── Layouts.hs
├── Models.hs
├── Main.hs
├── Utils.hs
├── Views.hs
└── Controllers.hs
/static/favicon.ico:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | dist
2 | cabal-dev
3 | *.o
4 | *.hi
5 | *.chi
6 | *.chs.h
7 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | hails-auth
2 | ==========
3 |
4 | Hails authentication system
--------------------------------------------------------------------------------
/Setup.hs:
--------------------------------------------------------------------------------
1 | import Distribution.Simple
2 | main :: IO ()
3 | main = defaultMain
4 |
--------------------------------------------------------------------------------
/.env:
--------------------------------------------------------------------------------
1 | PORT=8000
2 | HMAC_KEY=w00t
3 | COOKIE_DOMAIN=.lvh.me
4 | BRAND=Gitstar
5 | BRAND_URL=http://gitstar.lvh.me:8080
6 |
--------------------------------------------------------------------------------
/static/img/glyphicons-halflings.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/scslab/hails-auth/master/static/img/glyphicons-halflings.png
--------------------------------------------------------------------------------
/static/img/glyphicons-halflings-white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/scslab/hails-auth/master/static/img/glyphicons-halflings-white.png
--------------------------------------------------------------------------------
/static/css/application.css:
--------------------------------------------------------------------------------
1 | @import url(https://fonts.googleapis.com/css?family=Ubuntu:400,700,400italic,700italic|Inika:400,700);
2 | .create {
3 | float: right;
4 | }
5 |
6 | body {
7 | padding-top: 60px;
8 | font-family: "Inika", serif;
9 | }
10 |
11 | p {
12 | font-family: "Ubuntu", sans-serif;
13 | font-size: 110%;
14 | }
15 | .nav-pills {
16 | border-bottom: 1px solid #ccc;
17 | }
18 |
19 | .nav-pills > li a {
20 | font-family: "Ubuntu", sans-serif;
21 | border: 1px solid #ccc;
22 | border-right: 1px solid #ccc;
23 | }
24 |
25 | .nav-pills > .active a {
26 | border: 0px;
27 | }
28 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | This program is free software; you can redistribute it and/or
2 | modify it under the terms of the GNU General Public License as
3 | published by the Free Software Foundation; either version 2, or (at
4 | your option) any later version.
5 |
6 | This program is distributed in the hope that it will be useful, but
7 | WITHOUT ANY WARRANTY; without even the implied warranty of
8 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
9 | General Public License for more details.
10 |
11 | You can obtain copies of permitted licenses from these URLs:
12 |
13 | http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
14 | http://www.gnu.org/licenses/gpl-3.0.txt
15 |
16 | or by writing to the Free Software Foundation, Inc., 59 Temple Place,
17 | Suite 330, Boston, MA 02111-1307 USA
18 |
--------------------------------------------------------------------------------
/static/js/flash.js:
--------------------------------------------------------------------------------
1 | /* This is an implementation of error, success, and info alerts
2 | * compatible with bootstrap.js. The current implementation relies on
3 | * cookies and HTML5 session storage. The former is used by the server
4 | * to set a _flash-* key to the message value; the latter is used to
5 | * keep track of which messages have been displayed. The cookie is
6 | * immediately delete, while the session storage item persists until
7 | * the window is closed. */
8 |
9 | $(function () {
10 |
11 | var flash = function (type, handler) {
12 | var flash_type ='_flash-'+type;
13 | if($.cookie(flash_type)) {
14 | var flash = $.cookie(flash_type).slice(1,-1).split('|');
15 | var oid = flash[0]; // get unique message id
16 | var msg = flash[1]; // get actual message
17 | if(window.sessionStorage.getItem(oid) == null ) {
18 | window.sessionStorage.setItem(oid, '1');
19 | $.cookie(flash_type, null); // delete the cookie
20 | $("#flash-messages").append(
21 | '
'
22 | +'
×'
23 | + handler(msg)
24 | + '
');
25 | }
26 | }
27 | }
28 |
29 | flash('error', function (msg){ return 'Error:' + msg; });
30 | flash('success', function (msg){ return 'Success:' + msg; });
31 | flash('info', function (msg){ return msg; });
32 |
33 | });
34 |
--------------------------------------------------------------------------------
/hails-auth.cabal:
--------------------------------------------------------------------------------
1 | Name: hails-auth
2 | Version: 0.1.2
3 | build-type: Simple
4 | License: GPL-2
5 | License-File: LICENSE
6 | Author: HAILS team
7 | Maintainer: Amit Levy , Deian Stefan
8 | Stability: experimental
9 | Synopsis: Authentication app for Hails platforms
10 | Category: Web
11 | Cabal-Version: >= 1.8
12 |
13 | Description:
14 | Authentication app for Hails platforms
15 |
16 | Source-repository head
17 | Type: git
18 | Location: http://www.github.com/scslab/hails-bin.git
19 |
20 | Executable hails-auth
21 | Main-is: Main.hs
22 | ghc-options: -Wall -threaded
23 | Build-Depends: base >= 4.5 && < 5,
24 | regex-posix >= 0.95 && < 1.0,
25 | containers >= 0.4.2 && < 0.5,
26 | bytestring >= 0.9 && < 1,
27 | containers >= 0.4.2 && < 0.5,
28 | iterIO >= 0.2.2 && < 0.3,
29 | iterio-server >= 0.3.1 && < 0.4,
30 | HsOpenSSL >= 0.10.1 && < 2,
31 | mongoDB >= 1.1.2 && < 1.3,
32 | structured-mongoDB >= 0.3 && < 1.0,
33 | bson >= 0.1 && < 0.2,
34 | transformers >= 0.2.2.0 && < 0.3,
35 | blaze-html >= 0.4.3.3 && < 0.5,
36 | bcrypt >= 0.0.3 && < 0.1,
37 | SHA >= 1.5 && < 2,
38 | mtl >= 2.0 && < 2.1
39 |
--------------------------------------------------------------------------------
/Layouts.hs:
--------------------------------------------------------------------------------
1 | {-# LANGUAGE OverloadedStrings #-}
2 |
3 | module Layouts where
4 |
5 | import Data.Maybe
6 | import Data.IterIO.Http.Support
7 |
8 | import Prelude hiding (head, id, div, span)
9 | import Text.Blaze.Html5 hiding (map)
10 | import Text.Blaze.Html5.Attributes hiding (title, span, content)
11 | import qualified Text.Blaze.Renderer.Utf8 as R (renderHtml)
12 |
13 | import Control.Monad.Trans
14 | import System.Environment
15 |
16 | renderHtml :: Html -> Action t b IO ()
17 | renderHtml htmlBody = do
18 | env <- liftIO getEnvironment
19 | let brand = fromMaybe "Hails Authentication" $ lookup "BRAND" env
20 | brandUrl = fromMaybe "#" $ lookup "BRAND_URL" env
21 | render "text/html" $ R.renderHtml $ application brand brandUrl htmlBody
22 |
23 | stylesheet :: String -> Html
24 | stylesheet uri = link ! rel "stylesheet" ! type_ "text/css" ! href (toValue uri)
25 |
26 | application :: String -> String -> Html -> Html
27 | application brand brandUrl content = docTypeHtml $
28 | head $ do
29 | title "GitStar"
30 | stylesheet "/css/bootstrap.css"
31 | stylesheet "/css/application.css"
32 | body $ do
33 | div ! class_ "navbar navbar-fixed-top" $
34 | div ! class_ "navbar-inner" $
35 | div ! class_ "container" $
36 | a ! href (toValue brandUrl) ! class_ "brand" $ toHtml brand
37 | div ! class_ "row" $
38 | div ! id "flash-messages" ! class_ "span4 offset4" $ ""
39 | div ! class_ "container" $ content
40 | script ! src "/js/jquery.js" $ ""
41 | script ! src "/js/jquery.cookie.js" $ ""
42 | script ! src "/js/bootstrap.min.js" $ ""
43 | script ! src "/js/bootstrap-typeahead.js" $ ""
44 | script ! src "/js/flash.js" $ ""
45 |
--------------------------------------------------------------------------------
/Models.hs:
--------------------------------------------------------------------------------
1 | {-# OPTIONS_GHC -fno-warn-name-shadowing #-}
2 | {-# LANGUAGE OverloadedStrings #-}
3 | {-# LANGUAGE TemplateHaskell #-}
4 | {-# LANGUAGE DeriveDataTypeable #-}
5 | {-# LANGUAGE TypeSynonymInstances #-}
6 | {-# LANGUAGE FlexibleInstances #-}
7 | {-# LANGUAGE MultiParamTypeClasses #-}
8 | module Models ( User(..)
9 | , insertUser, insertUser_
10 | , updateUser, findUser ) where
11 |
12 | import Data.Maybe
13 |
14 | import Data.Bson
15 | import Data.Typeable
16 | import Database.MongoDB.Structured
17 | import Database.MongoDB.Structured.Deriving.TH
18 |
19 | import Control.Monad
20 | import Control.Exception
21 |
22 | -- | Perform action on DB. This is slow because it always tears down
23 | -- the connection.
24 | withDB :: Action IO b -> IO b
25 | withDB act = do
26 | pipe <- runIOE $ connect (host "localhost")
27 | qr <- access pipe master "hails" act
28 | close pipe
29 | case qr of
30 | Right r -> return r
31 | Left e -> throwIO . userError $ "Failed with: " ++ show e
32 |
33 | data User = User { userId :: SObjId
34 | , userName :: String
35 | , userEmail :: String
36 | , userPassword :: String
37 | } deriving (Eq, Show, Typeable)
38 | $(deriveStructured ''User)
39 |
40 | -- | Insert a user into database
41 | insertUser :: User -> IO ObjectId
42 | insertUser user = withDB $ liftM (unSObjId . fromJust . cast') $ insert user
43 |
44 | -- | Insert a user into database
45 | insertUser_ :: User -> IO ()
46 | insertUser_ user = withDB $ insert_ user
47 |
48 | -- | Save user into database
49 | updateUser :: User -> IO ()
50 | updateUser user = withDB $ save user
51 |
52 | -- | Find existing user
53 | findUser :: String -> IO (Maybe User)
54 | findUser uName = withDB $ do
55 | let query = select (UserName .== uName)
56 | findOne query
57 |
--------------------------------------------------------------------------------
/static/js/jquery.cookie.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * jQuery Cookie Plugin
3 | * https://github.com/carhartl/jquery-cookie
4 | *
5 | * Copyright 2011, Klaus Hartl
6 | * Dual licensed under the MIT or GPL Version 2 licenses.
7 | * http://www.opensource.org/licenses/mit-license.php
8 | * http://www.opensource.org/licenses/GPL-2.0
9 | */
10 | (function($) {
11 | $.cookie = function(key, value, options) {
12 |
13 | // key and at least value given, set cookie...
14 | if (arguments.length > 1 && (!/Object/.test(Object.prototype.toString.call(value)) || value === null || value === undefined)) {
15 | options = $.extend({}, options);
16 |
17 | if (value === null || value === undefined) {
18 | options.expires = -1;
19 | }
20 |
21 | if (typeof options.expires === 'number') {
22 | var days = options.expires, t = options.expires = new Date();
23 | t.setDate(t.getDate() + days);
24 | }
25 |
26 | value = String(value);
27 |
28 | return (document.cookie = [
29 | encodeURIComponent(key), '=', options.raw ? value : encodeURIComponent(value),
30 | options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
31 | options.path ? '; path=' + options.path : '',
32 | options.domain ? '; domain=' + options.domain : '',
33 | options.secure ? '; secure' : ''
34 | ].join(''));
35 | }
36 |
37 | // key and possibly options given, get cookie...
38 | options = value || {};
39 | var decode = options.raw ? function(s) { return s; } : decodeURIComponent;
40 |
41 | var pairs = document.cookie.split('; ');
42 | for (var i = 0, pair; pair = pairs[i] && pairs[i].split('='); i++) {
43 | if (decode(pair[0]) === key) return decode(pair[1] || ''); // IE saves cookies with empty string as "c; ", e.g. without "=" as opposed to EOMB, thus pair[1] may be undefined
44 | }
45 | return null;
46 | };
47 | })(jQuery);
48 |
--------------------------------------------------------------------------------
/Main.hs:
--------------------------------------------------------------------------------
1 | {-# LANGUAGE FlexibleInstances, OverloadedStrings, MultiParamTypeClasses #-}
2 | module Main (main) where
3 | import Control.Monad
4 | import Control.Exception (SomeException(..))
5 |
6 | import qualified Data.ByteString.Char8 as S8
7 | import Data.Monoid
8 | import Data.Maybe
9 |
10 | import Data.IterIO
11 | import Data.IterIO.Http
12 | import Data.IterIO.HttpRoute (mimeTypesI)
13 | import Data.IterIO.SSL
14 | import Data.IterIO.Server.TCPServer
15 | import Data.IterIO.Http.Support
16 |
17 | import System.IO.Unsafe
18 | import System.Environment
19 |
20 | import OpenSSL (withOpenSSL)
21 |
22 | import Controllers
23 | import Utils
24 |
25 | main :: IO ()
26 | main = withOpenSSL $ do
27 | env <- getEnvironment
28 | server <- case lookup "SSL_KEY_FILE" env of
29 | Nothing -> return simpleHttpServer
30 | Just f -> simpleHttpsServer `liftM` simpleContext f
31 | let port = fromMaybe 8000 $ lookup "PORT" env >>= maybeRead :: Int
32 | runTCPServer $ server (fromIntegral port) handler
33 |
34 | handler :: HttpRequestHandler IO ()
35 | handler = runIterAction $ runActionRoute $ mconcat
36 | [ routeTop $ routeAction $ restIndex UsersController
37 | , routeRestController "users" UsersController
38 | , routeMethod "GET" $ routePattern "login" $ routeAction newLoginUser
39 | , routeMethod "POST" $ routePattern "login" $ routeAction loginUser
40 | , routeMethod "GET" $ routePattern "logout" $ routeAction logoutUser
41 | , routeFileSys mimeMap "static"
42 | ]
43 |
44 |
45 | -- | Given a file extension (e.g., \"hs\") return its MIME type (e.g.,
46 | -- \"text\/x-haskell\"). If there is no recognized MIME type (or none
47 | -- of the default paths exist), this function returns
48 | -- \"application\/octet-stream\"
49 | mimeMap :: String -> S8.ByteString
50 | mimeMap = unsafePerformIO $
51 | foldr1 cat (map enumMimeFile defaultPaths) |$
52 | mimeTypesI "application/octet-stream"
53 | where defaultPaths = ["mime.types"
54 | , "/etc/mime.types"
55 | , "/var/www/conf/mime.types"]
56 | enumMimeFile f = inumCatch (enumFile f) $ \(SomeException _) res ->
57 | resumeI res
58 |
--------------------------------------------------------------------------------
/Utils.hs:
--------------------------------------------------------------------------------
1 | {-# LANGUAGE CPP #-}
2 | #if PRODUCTION
3 | {-# LANGUAGE Safe #-}
4 | #endif
5 | {-# LANGUAGE OverloadedStrings #-}
6 |
7 | module Utils where
8 |
9 | import qualified Data.ByteString.Char8 as S8
10 | import qualified Data.ByteString.Lazy.Char8 as L8
11 | import Data.Maybe (listToMaybe, fromJust)
12 |
13 | import Data.IterIO.Http (reqCookies, respAddHeader)
14 | import Data.IterIO.Http.Support
15 | import Data.Bson (genObjectId)
16 |
17 | import Control.Monad
18 | import Control.Monad.Trans
19 | import Control.Monad.Trans.State
20 |
21 |
22 | -- | Force get parameter value
23 | getParamVal :: Monad m => S8.ByteString -> Action t b m String
24 | getParamVal n = (L8.unpack . paramValue . fromJust) `liftM` param n
25 |
26 | maybeRead :: Read a => String -> Maybe a
27 | maybeRead = fmap fst . listToMaybe . reads
28 |
29 | with404orJust :: Monad m => Maybe a -> (a -> Action t b m ()) -> Action t b m ()
30 | with404orJust mval act = case mval of
31 | Nothing -> respond404
32 | Just val -> act val
33 |
34 | -- | Set the referer cookie (to referer) if unset.
35 | saveRefererIfNone :: Action t b IO ()
36 | saveRefererIfNone = do
37 | mref <- getCookie "_hails_referer"
38 | mhdr <- fmap S8.unpack `liftM` requestHeader "referer"
39 | case (mref,mhdr) of
40 | (Nothing, Just u) -> setCookie "_hails_referer" (show u)
41 | _ -> return ()
42 |
43 | -- | Redirect to the set refer, if set; or given URL.
44 | redirectToSavedRefererOrTo :: String -> Action t b IO ()
45 | redirectToSavedRefererOrTo url = do
46 | mref <- getCookie "_hails_referer"
47 | redirectTo $ maybe url S8.unpack mref
48 | delCookie "_hails_referer"
49 |
50 |
51 | --
52 | -- Flash notifications
53 | --
54 |
55 | -- | This sets the @_flash-*@ cookie value to the given message, with
56 | -- a unique message ID.
57 | flash :: String -> String -> Action t b IO ()
58 | flash n msg = do
59 | oid <- liftIO genObjectId
60 | setCookie ("_flash-" ++ n) (show (show oid ++ "|" ++ msg))
61 |
62 | flashInfo :: String -> Action t b IO ()
63 | flashInfo = flash "info"
64 |
65 | flashError :: String -> Action t b IO ()
66 | flashError = flash "error"
67 |
68 | flashSuccess :: String -> Action t b IO ()
69 | flashSuccess = flash "success"
70 |
71 | getCookie :: String -> Action t b IO (Maybe S8.ByteString)
72 | getCookie n = do
73 | req <- getHttpReq
74 | return $ lookup (S8.pack n) $ reqCookies req
75 |
76 | setCookie :: String -> String -> Action t b IO ()
77 | setCookie n v = modify $ \s ->
78 | let cHeader = ( S8.pack "Set-Cookie"
79 | , S8.pack $ n ++ "=" ++ v ++ ";path=/;")
80 | in s { actionResp = respAddHeader cHeader (actionResp s)}
81 |
82 | delCookie :: String -> Action t b IO ()
83 | delCookie n = modify $ \s ->
84 | let cHeader = ( S8.pack "Set-Cookie", S8.pack $
85 | n ++ "=; path=/; expires=Thu, Jan 01 1970 00:00:00 UTC;")
86 | in s { actionResp = respAddHeader cHeader (actionResp s)}
87 |
--------------------------------------------------------------------------------
/Views.hs:
--------------------------------------------------------------------------------
1 | {-# OPTIONS_GHC -fno-warn-unused-do-bind #-}
2 | {-# LANGUAGE FlexibleContexts #-}
3 | {-# LANGUAGE OverloadedStrings #-}
4 |
5 | module Views ( showView
6 | , loginView
7 | , newUser, editUser ) where
8 |
9 | import Prelude hiding (div, span, id)
10 | import Data.Monoid
11 |
12 | import Models
13 |
14 | import Text.Blaze.Html5 hiding (title)
15 | import Text.Blaze.Html5.Attributes hiding (label, form, span)
16 |
17 | -- | Show main page: edit account, logout
18 | showView :: String -> Html
19 | showView user =
20 | div ! class_ "hero-unit" $ do
21 | h1 $ toHtml $ "Welcome " ++ user ++ "!"
22 | p "It is a curious reason as to why you landed here."
23 | p $ do a ! href (toValue $ user ++ "/edit")
24 | ! class_ "btn btn-primary" $ "Edit account"
25 | " "
26 | a ! href "/logout" ! class_ "btn btn-inverse" $ "Log out"
27 |
28 | -- | Show login form
29 | loginView :: Maybe String -> Html
30 | loginView muName =
31 | form ! class_ "form-vertical" ! action "/login" ! method "POST" $
32 | fieldset $ do
33 | legend $ do
34 | "Login"
35 | span ! class_ "create" $ do
36 | small "Don't have an account? "
37 | a ! class_ "btn btn-success" ! href "/users/new" $ "Register"
38 | label "User Name"
39 | input ! type_ "text" ! placeholder "ron_swanson" ! name "user_name"
40 | ! maybe mempty (value . toValue) muName
41 | label "Password"
42 | input ! type_ "password" ! name "password"
43 | div ! class_"form-actions" $ do
44 | input ! type_ "submit" ! class_ "btn btn-primary" ! value "Login"
45 | " "
46 | input ! type_ "reset" ! class_ "btn" ! value "Reset"
47 |
48 | -- | Show account registration form
49 | newUser :: Maybe User -> Html
50 | newUser muser =
51 | form ! class_ "form-vertical" ! action "/users" ! method "POST" $
52 | fieldset $ do
53 | legend "Create a new account"
54 | label "User Name"
55 | input ! type_ "text" ! placeholder "ron" ! name "user_name"
56 | ! maybe mempty (value . toValue . userName) muser
57 | label "Email"
58 | input ! type_ "email" ! placeholder "ron@swanson.me" ! name "email"
59 | ! maybe mempty (value . toValue . userEmail) muser
60 | label "Password"
61 | input ! type_ "password" ! name "password"
62 | label "Password confirmation"
63 | input ! type_ "password" ! name "password_confirmation"
64 | div ! class_"form-actions" $ do
65 | input ! type_ "submit" ! class_ "btn btn-primary" ! value "Register"
66 | " "
67 | input ! type_ "reset" ! class_ "btn" ! value "Reset"
68 |
69 | -- | Show change email or password forms
70 | editUser :: User -> Html
71 | editUser user = do
72 | form ! class_ "form-vertical"
73 | ! action (toValue $ "/users/" ++ userName user) ! method "POST" $
74 | fieldset $ do
75 | legend "Update email"
76 | input ! type_ "hidden" ! name "type" ! value "email"
77 | label "Email"
78 | input ! type_ "email" ! placeholder "ron@swanson.me" ! name "email"
79 | ! (value . toValue . userEmail $ user)
80 | div ! class_"form-actions" $ do
81 | input ! type_ "submit" ! class_ "btn btn-primary" ! value "Update email"
82 | " "
83 | input ! type_ "reset" ! class_ "btn" ! value "Reset"
84 | form ! class_ "form-vertical"
85 | ! action (toValue $ "/users/" ++ userName user) ! method "POST" $
86 | fieldset $ do
87 | legend "Change password"
88 | input ! type_ "hidden" ! name "type" ! value "password"
89 | label "Old Password"
90 | input ! type_ "password" ! name "password_old"
91 | label "New Password"
92 | input ! type_ "password" ! name "password"
93 | label "Password confirmation"
94 | input ! type_ "password" ! name "password_confirmation"
95 | div ! class_"form-actions" $ do
96 | input ! type_ "submit" ! class_ "btn btn-primary" ! value "Change password"
97 | " "
98 | input ! type_ "reset" ! class_ "btn" ! value "Reset"
99 |
--------------------------------------------------------------------------------
/static/js/bootstrap-typeahead.js:
--------------------------------------------------------------------------------
1 | /* =============================================================
2 | * bootstrap-typeahead.js v2.0.0
3 | * http://twitter.github.com/bootstrap/javascript.html#typeahead
4 | * =============================================================
5 | * Copyright 2012 Twitter, Inc.
6 | *
7 | * Licensed under the Apache License, Version 2.0 (the "License");
8 | * you may not use this file except in compliance with the License.
9 | * You may obtain a copy of the License at
10 | *
11 | * http://www.apache.org/licenses/LICENSE-2.0
12 | *
13 | * Unless required by applicable law or agreed to in writing, software
14 | * distributed under the License is distributed on an "AS IS" BASIS,
15 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 | * See the License for the specific language governing permissions and
17 | * limitations under the License.
18 | * ============================================================ */
19 |
20 | !function( $ ){
21 |
22 | "use strict"
23 |
24 | var Typeahead = function ( element, options ) {
25 | this.$element = $(element)
26 | this.options = $.extend({}, $.fn.typeahead.defaults, options)
27 | this.matcher = this.options.matcher || this.matcher
28 | this.sorter = this.options.sorter || this.sorter
29 | this.highlighter = this.options.highlighter || this.highlighter
30 | this.$menu = $(this.options.menu).appendTo('body')
31 | this.source = this.options.source
32 | this.onselect = this.options.onselect
33 | this.strings = true
34 | this.shown = false
35 | this.listen()
36 | }
37 |
38 | Typeahead.prototype = {
39 |
40 | constructor: Typeahead
41 |
42 | , select: function () {
43 | var val = JSON.parse(this.$menu.find('.active').attr('data-value'))
44 | , text
45 |
46 | if (!this.strings) text = val[this.options.property]
47 | else text = val
48 |
49 | this.$element.val(text)
50 |
51 | if (typeof this.onselect == "function")
52 | this.onselect(val)
53 |
54 | return this.hide()
55 | }
56 |
57 | , show: function () {
58 | var pos = $.extend({}, this.$element.offset(), {
59 | height: this.$element[0].offsetHeight
60 | })
61 |
62 | this.$menu.css({
63 | top: pos.top + pos.height
64 | , left: pos.left
65 | })
66 |
67 | this.$menu.show()
68 | this.shown = true
69 | return this
70 | }
71 |
72 | , hide: function () {
73 | this.$menu.hide()
74 | this.shown = false
75 | return this
76 | }
77 |
78 | , lookup: function (event) {
79 | var that = this
80 | , items
81 | , q
82 | , value
83 |
84 | this.query = this.$element.val()
85 |
86 | if (typeof this.source == "function") {
87 | value = this.source(this, this.query)
88 | if (value) this.process(value)
89 | } else {
90 | this.process(this.source)
91 | }
92 | }
93 |
94 | , process: function (results) {
95 | var that = this
96 | , items
97 | , q
98 |
99 | if (results.length && typeof results[0] != "string")
100 | this.strings = false
101 |
102 | this.query = this.$element.val()
103 |
104 | if (!this.query) {
105 | return this.shown ? this.hide() : this
106 | }
107 |
108 | items = $.grep(results, function (item) {
109 | if (!that.strings)
110 | item = item[that.options.property]
111 | if (that.matcher(item)) return item
112 | })
113 |
114 | items = this.sorter(items)
115 |
116 | if (!items.length) {
117 | return this.shown ? this.hide() : this
118 | }
119 |
120 | return this.render(items.slice(0, this.options.items)).show()
121 | }
122 |
123 | , matcher: function (item) {
124 | return ~item.toLowerCase().indexOf(this.query.toLowerCase())
125 | }
126 |
127 | , sorter: function (items) {
128 | var beginswith = []
129 | , caseSensitive = []
130 | , caseInsensitive = []
131 | , item
132 | , sortby
133 |
134 | while (item = items.shift()) {
135 | if (this.strings) sortby = item
136 | else sortby = item[this.options.property]
137 |
138 | if (!sortby.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item)
139 | else if (~sortby.indexOf(this.query)) caseSensitive.push(item)
140 | else caseInsensitive.push(item)
141 | }
142 |
143 | return beginswith.concat(caseSensitive, caseInsensitive)
144 | }
145 |
146 | , highlighter: function (item) {
147 | return item.replace(new RegExp('(' + this.query + ')', 'ig'), function ($1, match) {
148 | return '' + match + ''
149 | })
150 | }
151 |
152 | , render: function (items) {
153 | var that = this
154 |
155 | items = $(items).map(function (i, item) {
156 | i = $(that.options.item).attr('data-value', JSON.stringify(item))
157 | if (!that.strings)
158 | item = item[that.options.property]
159 | i.find('a').html(that.highlighter(item))
160 | return i[0]
161 | })
162 |
163 | items.first().addClass('active')
164 | this.$menu.html(items)
165 | return this
166 | }
167 |
168 | , next: function (event) {
169 | var active = this.$menu.find('.active').removeClass('active')
170 | , next = active.next()
171 |
172 | if (!next.length) {
173 | next = $(this.$menu.find('li')[0])
174 | }
175 |
176 | next.addClass('active')
177 | }
178 |
179 | , prev: function (event) {
180 | var active = this.$menu.find('.active').removeClass('active')
181 | , prev = active.prev()
182 |
183 | if (!prev.length) {
184 | prev = this.$menu.find('li').last()
185 | }
186 |
187 | prev.addClass('active')
188 | }
189 |
190 | , listen: function () {
191 | this.$element
192 | .on('blur', $.proxy(this.blur, this))
193 | .on('keypress', $.proxy(this.keypress, this))
194 | .on('keyup', $.proxy(this.keyup, this))
195 |
196 | if ($.browser.webkit || $.browser.msie) {
197 | this.$element.on('keydown', $.proxy(this.keypress, this))
198 | }
199 |
200 | this.$menu
201 | .on('click', $.proxy(this.click, this))
202 | .on('mouseenter', 'li', $.proxy(this.mouseenter, this))
203 | }
204 |
205 | , keyup: function (e) {
206 | e.stopPropagation()
207 | e.preventDefault()
208 |
209 | switch(e.keyCode) {
210 | case 40: // down arrow
211 | case 38: // up arrow
212 | break
213 |
214 | case 9: // tab
215 | case 13: // enter
216 | if (!this.shown) return
217 | this.select()
218 | break
219 |
220 | case 27: // escape
221 | this.hide()
222 | break
223 |
224 | default:
225 | this.lookup()
226 | }
227 |
228 | }
229 |
230 | , keypress: function (e) {
231 | e.stopPropagation()
232 | if (!this.shown) return
233 |
234 | switch(e.keyCode) {
235 | case 9: // tab
236 | case 13: // enter
237 | case 27: // escape
238 | e.preventDefault()
239 | break
240 |
241 | case 38: // up arrow
242 | e.preventDefault()
243 | this.prev()
244 | break
245 |
246 | case 40: // down arrow
247 | e.preventDefault()
248 | this.next()
249 | break
250 | }
251 | }
252 |
253 | , blur: function (e) {
254 | var that = this
255 | e.stopPropagation()
256 | e.preventDefault()
257 | setTimeout(function () { that.hide() }, 150)
258 | }
259 |
260 | , click: function (e) {
261 | e.stopPropagation()
262 | e.preventDefault()
263 | this.select()
264 | }
265 |
266 | , mouseenter: function (e) {
267 | this.$menu.find('.active').removeClass('active')
268 | $(e.currentTarget).addClass('active')
269 | }
270 |
271 | }
272 |
273 |
274 | /* TYPEAHEAD PLUGIN DEFINITION
275 | * =========================== */
276 |
277 | $.fn.typeahead = function ( option ) {
278 | return this.each(function () {
279 | var $this = $(this)
280 | , data = $this.data('typeahead')
281 | , options = typeof option == 'object' && option
282 | if (!data) $this.data('typeahead', (data = new Typeahead(this, options)))
283 | if (typeof option == 'string') data[option]()
284 | })
285 | }
286 |
287 | $.fn.typeahead.defaults = {
288 | source: []
289 | , items: 8
290 | , menu: ''
291 | , item: ''
292 | , onselect: null
293 | , property: 'value'
294 | }
295 |
296 | $.fn.typeahead.Constructor = Typeahead
297 |
298 |
299 | /* TYPEAHEAD DATA-API
300 | * ================== */
301 |
302 | $(function () {
303 | $('body').on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) {
304 | var $this = $(this)
305 | if ($this.data('typeahead')) return
306 | e.preventDefault()
307 | $this.typeahead($this.data())
308 | })
309 | })
310 |
311 | }( window.jQuery );
312 |
--------------------------------------------------------------------------------
/Controllers.hs:
--------------------------------------------------------------------------------
1 | {-# LANGUAGE FlexibleInstances #-}
2 | {-# LANGUAGE MultiParamTypeClasses #-}
3 | {-# LANGUAGE TypeSynonymInstances #-}
4 | {-# LANGUAGE OverloadedStrings #-}
5 |
6 | module Controllers ( UsersController(..)
7 | , loginUser, newLoginUser
8 | , logoutUser
9 | )where
10 |
11 | import Control.Monad.Trans
12 |
13 | import qualified Data.ByteString.Char8 as S8
14 | import qualified Data.ByteString.Lazy.Char8 as L8
15 | import Data.Maybe
16 | import Data.Digest.Pure.SHA
17 |
18 | import Data.IterIO.Http
19 | import Data.IterIO.Http.Support
20 | import Control.Monad
21 |
22 | import Database.MongoDB.Structured (noSObjId)
23 |
24 | import Crypto.BCrypt
25 |
26 | import Layouts
27 | import Models
28 | import Views
29 | import Utils
30 |
31 | import Text.Regex.Posix
32 |
33 | import System.Environment
34 |
35 | type L = L8.ByteString
36 | type S = S8.ByteString
37 |
38 | data UsersController = UsersController
39 |
40 | instance RestController t L IO UsersController where
41 | restIndex _ = do
42 | saveRefererIfNone
43 | euser <- getCurrentUserOr (renderHtml $ loginView Nothing)
44 | either id (redirectToSavedRefererOrTo . ("/users/" ++)) euser
45 |
46 | restShow _ _ = do
47 | saveRefererIfNone
48 | euser <- getCurrentUserOr (redirectToSavedRefererOrTo "/")
49 | either id (renderHtml . showView) euser
50 |
51 | restNew _ = renderHtml $ newUser Nothing
52 |
53 | restCreate _ = parseParams >> do
54 | env <- liftIO getEnvironment
55 | let m_hmac_key = lookup "HMAC_KEY" env
56 | mdomain = lookup "COOKIE_DOMAIN" env
57 | paramOrBack "user_name" $ \uName ->
58 | paramOrBack "email" $ \email ->
59 | paramOrBack "password" $ \pass0 ->
60 | paramOrBack "password_confirmation" $ \pass1 -> do
61 | let usr = User { userId = noSObjId
62 | , userName = uName
63 | , userEmail = email
64 | , userPassword = pass0 }
65 | exists <- liftIO $ userExists uName
66 | case () of
67 | _ | blank uName || blank email || blank pass0 ->
68 | mkEdit usr >> flashError "Fields cannot be blank."
69 |
70 | _ | pass0 /= pass1 ->
71 | mkEdit usr >> flashError "Passwords do not match."
72 |
73 | _ | not (wellformed uName) -> do
74 | mkEdit $ usr { userName = "" }
75 | flashError $ "Username must start with a letter and only"
76 | ++ " contain letters, numbers and underscore."
77 |
78 | _ | exists -> mkEdit usr >> flashError "Username taken"
79 |
80 | _ | isNothing m_hmac_key -> respondStat stat500
81 |
82 | _ -> do mpass <- liftIO $ bcrypt pass0
83 | case mpass of
84 | Nothing -> respondStat stat500
85 | Just pass -> do
86 | liftIO $ insertUser_ $ usr { userPassword = pass }
87 | redirectToSavedRefererOrTo "/"
88 | setCurrentUser (fromJust m_hmac_key) mdomain usr
89 | flashSuccess "Account created."
90 |
91 | where userExists uN = isJust `liftM` findUser uN
92 | mkEdit usr = renderHtml . newUser . Just $ usr { userPassword = "" }
93 | wellformed s = s =~ ("^[a-zA-Z][a-zA-Z0-9_]*" :: String)
94 | blank s = s =~ ("^\\s*$" :: String)
95 |
96 | restEdit _ _ = do
97 | euser <- getCurrentUserOr (respondStat stat403)
98 | either id (\uName -> do muser <- liftIO $ findUser uName
99 | maybe (respondStat stat403)
100 | (renderHtml . editUser) muser) euser
101 |
102 | restUpdate _ _ = parseParams >> do
103 | euser <- getCurrentUserOr (respondStat stat403)
104 | either id (\uName -> do muser <- liftIO $ findUser uName
105 | maybe (respondStat stat403) doUpdate muser) euser
106 | where blank s = s =~ ("^\\s*$" :: String)
107 | doUpdate user = paramOrBack "type" $ \type_ ->
108 | case type_ of
109 | "email" -> changeEmail user
110 | "password" -> changePassword user
111 | _ -> respondStat stat403
112 | changeEmail user = paramOrBack "email" $ \email -> do
113 | unless (blank email) $
114 | liftIO $ updateUser $ user { userEmail = email }
115 | redirectBack
116 | if blank email
117 | then flashError "Email cannot be blank."
118 | else flashSuccess "Changed email address."
119 | changePassword user =
120 | paramOrBack "password_old" $ \pass0 ->
121 | paramOrBack "password" $ \pass1 ->
122 | paramOrBack "password_confirmation" $ \pass2 ->
123 | case () of
124 | _ | blank pass0 || blank pass1 ->
125 | redirectBack >> flashError "Password cannot be blank."
126 |
127 | _ | pass1 /= pass2 ->
128 | redirectBack >> flashError "Passwords do not match."
129 |
130 | _ | not $ validatePassword (S8.pack $ userPassword user)
131 | (S8.pack pass0) ->
132 | redirectBack >> flashError "Invalid password."
133 | _ -> do mpass <- liftIO $ bcrypt pass1
134 | case mpass of
135 | Nothing -> respondStat stat500
136 | Just pass -> do
137 | liftIO $ updateUser $ user { userPassword = pass }
138 | redirectBack
139 | flashSuccess "Password changed."
140 |
141 |
142 |
143 | -- | Controller for login
144 | -- POST /login
145 | loginUser :: Action t L IO ()
146 | loginUser = parseParams >> do
147 | env <- liftIO getEnvironment
148 | let m_hmac_key = lookup "HMAC_KEY" env
149 | mdomain = lookup "COOKIE_DOMAIN" env
150 | paramOrBack "user_name" $ \uName ->
151 | paramOrBack "password" $ \pass -> do
152 | musr <- liftIO $ findUser uName
153 | let usr = fromJust musr -- takes advantage of Haskell's layzness
154 | case () of
155 | _ | isNothing musr -> mkLogin uName >> err
156 | _ | isNothing m_hmac_key -> respondStat stat500
157 | _ | not $ validatePassword (S8.pack $ userPassword usr)
158 | (S8.pack pass) -> mkLogin uName >> err
159 | _ -> do redirectToSavedRefererOrTo "/"
160 | setCurrentUser (fromJust m_hmac_key) mdomain usr
161 | where err = flashError "Unknown username/password."
162 | mkLogin = renderHtml . loginView . Just
163 |
164 | -- | GET /login
165 | newLoginUser :: Action t L IO ()
166 | newLoginUser = renderHtml $ loginView Nothing
167 |
168 | -- | Controllerfor log out
169 | logoutUser :: Action t L IO ()
170 | logoutUser = do
171 | delCookie "_hails_user"
172 | delCookie "_hails_user_hmac"
173 | delCookie "_hails_referer"
174 | redirectTo "/login"
175 | flashSuccess "Logged out."
176 |
177 | --
178 | -- Helpers
179 | --
180 |
181 | -- | Hash password with bcrypt
182 | bcrypt :: String -> IO (Maybe String)
183 | bcrypt pass = do
184 | mres <- hashPasswordUsingPolicy slowerBcryptHashingPolicy (S8.pack pass)
185 | return $ S8.unpack `liftM` mres
186 |
187 |
188 | -- | Setthe hails user cookies
189 | setCurrentUser :: String -> Maybe String -> User -> Action t b IO ()
190 | setCurrentUser key mdomain usr = do
191 | let uName = userName usr
192 | domain = maybe "" (";domain="++) mdomain
193 | hmac = showDigest $ hmacSha1 (L8.pack key) (L8.pack uName)
194 | setCookie "_hails_user" $ show uName ++ domain
195 | setCookie "_hails_user_hmac" $ show hmac ++ domain
196 |
197 | -- | Get the username of the currently logged in user
198 | getCurrentUserOr :: Action t b IO ()
199 | -> Action t b IO (Either (Action t b IO ()) String)
200 | getCurrentUserOr resp = do
201 | env <- liftIO getEnvironment
202 | case lookup "HMAC_KEY" env of
203 | Nothing -> return $ Left $ respondStat stat500
204 | Just key -> do
205 | req <- getHttpReq
206 | return $ maybe (Left resp) Right $ getAlreadyAuth req key
207 |
208 | -- | Check cookies for existing user
209 | getAlreadyAuth :: HttpReq t -> String -> Maybe String
210 | getAlreadyAuth req key =
211 | let cookies = reqCookies req
212 | in do user <- lookup "_hails_user" cookies
213 | mac0 <- lookup "_hails_user_hmac" cookies
214 | let mac1 = showDigest $ hmacSha1 (L8.pack key) (lazyfy user)
215 | if S8.unpack mac0 == mac1
216 | then return $ S8.unpack user
217 | else Nothing
218 | where lazyfy = L8.pack . S8.unpack
219 |
220 |
221 | -- | Get parameter or redirect back
222 | paramOrBack :: S -> (String -> Action t b IO ()) -> Action t b IO ()
223 | paramOrBack n f = do
224 | mp <- param n
225 | maybe (redirectBack >> flashError "Incomplete form, try again.")
226 | (f . L8.unpack . paramValue) mp
227 |
228 |
--------------------------------------------------------------------------------
/static/js/bootstrap.min.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Bootstrap.js by @fat & @mdo
3 | * plugins: bootstrap-transition.js, bootstrap-modal.js, bootstrap-dropdown.js, bootstrap-scrollspy.js, bootstrap-tab.js, bootstrap-tooltip.js, bootstrap-popover.js, bootstrap-alert.js, bootstrap-button.js, bootstrap-collapse.js, bootstrap-carousel.js, bootstrap-typeahead.js
4 | * Copyright 2012 Twitter, Inc.
5 | * http://www.apache.org/licenses/LICENSE-2.0.txt
6 | */
7 | !function(a){a(function(){a.support.transition=function(){var b=document.body||document.documentElement,c=b.style,d=c.transition!==undefined||c.WebkitTransition!==undefined||c.MozTransition!==undefined||c.MsTransition!==undefined||c.OTransition!==undefined;return d&&{end:function(){var b="TransitionEnd";return a.browser.webkit?b="webkitTransitionEnd":a.browser.mozilla?b="transitionend":a.browser.opera&&(b="oTransitionEnd"),b}()}}()})}(window.jQuery),!function(a){function c(){var b=this,c=setTimeout(function(){b.$element.off(a.support.transition.end),d.call(b)},500);this.$element.one(a.support.transition.end,function(){clearTimeout(c),d.call(b)})}function d(a){this.$element.hide().trigger("hidden"),e.call(this)}function e(b){var c=this,d=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var e=a.support.transition&&d;this.$backdrop=a('').appendTo(document.body),this.options.backdrop!="static"&&this.$backdrop.click(a.proxy(this.hide,this)),e&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),e?this.$backdrop.one(a.support.transition.end,b):b()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(a.support.transition.end,a.proxy(f,this)):f.call(this)):b&&b()}function f(){this.$backdrop.remove(),this.$backdrop=null}function g(){var b=this;this.isShown&&this.options.keyboard?a(document).on("keyup.dismiss.modal",function(a){a.which==27&&b.hide()}):this.isShown||a(document).off("keyup.dismiss.modal")}var b=function(b,c){this.options=c,this.$element=a(b).delegate('[data-dismiss="modal"]',"click.dismiss.modal",a.proxy(this.hide,this))};b.prototype={constructor:b,toggle:function(){return this[this.isShown?"hide":"show"]()},show:function(){var b=this;if(this.isShown)return;a("body").addClass("modal-open"),this.isShown=!0,this.$element.trigger("show"),g.call(this),e.call(this,function(){var c=a.support.transition&&b.$element.hasClass("fade");!b.$element.parent().length&&b.$element.appendTo(document.body),b.$element.show(),c&&b.$element[0].offsetWidth,b.$element.addClass("in"),c?b.$element.one(a.support.transition.end,function(){b.$element.trigger("shown")}):b.$element.trigger("shown")})},hide:function(b){b&&b.preventDefault();if(!this.isShown)return;var e=this;this.isShown=!1,a("body").removeClass("modal-open"),g.call(this),this.$element.trigger("hide").removeClass("in"),a.support.transition&&this.$element.hasClass("fade")?c.call(this):d.call(this)}},a.fn.modal=function(c){return this.each(function(){var d=a(this),e=d.data("modal"),f=a.extend({},a.fn.modal.defaults,d.data(),typeof c=="object"&&c);e||d.data("modal",e=new b(this,f)),typeof c=="string"?e[c]():f.show&&e.show()})},a.fn.modal.defaults={backdrop:!0,keyboard:!0,show:!0},a.fn.modal.Constructor=b,a(function(){a("body").on("click.modal.data-api",'[data-toggle="modal"]',function(b){var c=a(this),d,e=a(c.attr("data-target")||(d=c.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,"")),f=e.data("modal")?"toggle":a.extend({},e.data(),c.data());b.preventDefault(),e.modal(f)})})}(window.jQuery),!function(a){function d(){a(b).parent().removeClass("open")}var b='[data-toggle="dropdown"]',c=function(b){var c=a(b).on("click.dropdown.data-api",this.toggle);a("html").on("click.dropdown.data-api",function(){c.parent().removeClass("open")})};c.prototype={constructor:c,toggle:function(b){var c=a(this),e=c.attr("data-target"),f,g;return e||(e=c.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,"")),f=a(e),f.length||(f=c.parent()),g=f.hasClass("open"),d(),!g&&f.toggleClass("open"),!1}},a.fn.dropdown=function(b){return this.each(function(){var d=a(this),e=d.data("dropdown");e||d.data("dropdown",e=new c(this)),typeof b=="string"&&e[b].call(d)})},a.fn.dropdown.Constructor=c,a(function(){a("html").on("click.dropdown.data-api",d),a("body").on("click.dropdown.data-api",b,c.prototype.toggle)})}(window.jQuery),!function(a){function b(b,c){var d=a.proxy(this.process,this),e=a(b).is("body")?a(window):a(b),f;this.options=a.extend({},a.fn.scrollspy.defaults,c),this.$scrollElement=e.on("scroll.scroll.data-api",d),this.selector=(this.options.target||(f=a(b).attr("href"))&&f.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.$body=a("body").on("click.scroll.data-api",this.selector,d),this.refresh(),this.process()}b.prototype={constructor:b,refresh:function(){this.targets=this.$body.find(this.selector).map(function(){var b=a(this).attr("href");return/^#\w/.test(b)&&a(b).length?b:null}),this.offsets=a.map(this.targets,function(b){return a(b).position().top})},process:function(){var a=this.$scrollElement.scrollTop()+this.options.offset,b=this.offsets,c=this.targets,d=this.activeTarget,e;for(e=b.length;e--;)d!=c[e]&&a>=b[e]&&(!b[e+1]||a<=b[e+1])&&this.activate(c[e])},activate:function(a){var b;this.activeTarget=a,this.$body.find(this.selector).parent(".active").removeClass("active"),b=this.$body.find(this.selector+'[href="'+a+'"]').parent("li").addClass("active"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active")}},a.fn.scrollspy=function(c){return this.each(function(){var d=a(this),e=d.data("scrollspy"),f=typeof c=="object"&&c;e||d.data("scrollspy",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.scrollspy.Constructor=b,a.fn.scrollspy.defaults={offset:10},a(function(){a('[data-spy="scroll"]').each(function(){var b=a(this);b.scrollspy(b.data())})})}(window.jQuery),!function(a){var b=function(b){this.element=a(b)};b.prototype={constructor:b,show:function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.attr("data-target"),e,f;d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,""));if(b.parent("li").hasClass("active"))return;e=c.find(".active a").last()[0],b.trigger({type:"show",relatedTarget:e}),f=a(d),this.activate(b.parent("li"),c),this.activate(f,f.parent(),function(){b.trigger({type:"shown",relatedTarget:e})})},activate:function(b,c,d){function g(){e.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),f?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var e=c.find("> .active"),f=d&&a.support.transition&&e.hasClass("fade");f?e.one(a.support.transition.end,g):g(),e.removeClass("in")}},a.fn.tab=function(c){return this.each(function(){var d=a(this),e=d.data("tab");e||d.data("tab",e=new b(this)),typeof c=="string"&&e[c]()})},a.fn.tab.Constructor=b,a(function(){a("body").on("click.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(b){b.preventDefault(),a(this).tab("show")})})}(window.jQuery),!function(a){var b=function(a,b){this.init("tooltip",a,b)};b.prototype={constructor:b,init:function(b,c,d){var e,f;this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.enabled=!0,this.options.trigger!="manual"&&(e=this.options.trigger=="hover"?"mouseenter":"focus",f=this.options.trigger=="hover"?"mouseleave":"blur",this.$element.on(e,this.options.selector,a.proxy(this.enter,this)),this.$element.on(f,this.options.selector,a.proxy(this.leave,this))),this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},getOptions:function(b){return b=a.extend({},a.fn[this.type].defaults,b,this.$element.data()),b.delay&&typeof b.delay=="number"&&(b.delay={show:b.delay,hide:b.delay}),b},enter:function(b){var c=a(b.currentTarget)[this.type](this._options).data(this.type);!c.options.delay||!c.options.delay.show?c.show():(c.hoverState="in",setTimeout(function(){c.hoverState=="in"&&c.show()},c.options.delay.show))},leave:function(b){var c=a(b.currentTarget)[this.type](this._options).data(this.type);!c.options.delay||!c.options.delay.hide?c.hide():(c.hoverState="out",setTimeout(function(){c.hoverState=="out"&&c.hide()},c.options.delay.hide))},show:function(){var a,b,c,d,e,f,g;if(this.hasContent()&&this.enabled){a=this.tip(),this.setContent(),this.options.animation&&a.addClass("fade"),f=typeof this.options.placement=="function"?this.options.placement.call(this,a[0],this.$element[0]):this.options.placement,b=/in/.test(f),a.remove().css({top:0,left:0,display:"block"}).appendTo(b?this.$element:document.body),c=this.getPosition(b),d=a[0].offsetWidth,e=a[0].offsetHeight;switch(b?f.split(" ")[1]:f){case"bottom":g={top:c.top+c.height,left:c.left+c.width/2-d/2};break;case"top":g={top:c.top-e,left:c.left+c.width/2-d/2};break;case"left":g={top:c.top+c.height/2-e/2,left:c.left-d};break;case"right":g={top:c.top+c.height/2-e/2,left:c.left+c.width}}a.css(g).addClass(f).addClass("in")}},setContent:function(){var a=this.tip();a.find(".tooltip-inner").html(this.getTitle()),a.removeClass("fade in top bottom left right")},hide:function(){function d(){var b=setTimeout(function(){c.off(a.support.transition.end).remove()},500);c.one(a.support.transition.end,function(){clearTimeout(b),c.remove()})}var b=this,c=this.tip();c.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?d():c.remove()},fixTitle:function(){var a=this.$element;(a.attr("title")||typeof a.attr("data-original-title")!="string")&&a.attr("data-original-title",a.attr("title")||"").removeAttr("title")},hasContent:function(){return this.getTitle()},getPosition:function(b){return a.extend({},b?{top:0,left:0}:this.$element.offset(),{width:this.$element[0].offsetWidth,height:this.$element[0].offsetHeight})},getTitle:function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||(typeof c.title=="function"?c.title.call(b[0]):c.title),a=(a||"").toString().replace(/(^\s*|\s*$)/,""),a},tip:function(){return this.$tip=this.$tip||a(this.options.template)},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled},toggle:function(){this[this.tip().hasClass("in")?"hide":"show"]()}},a.fn.tooltip=function(c){return this.each(function(){var d=a(this),e=d.data("tooltip"),f=typeof c=="object"&&c;e||d.data("tooltip",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.tooltip.Constructor=b,a.fn.tooltip.defaults={animation:!0,delay:0,selector:!1,placement:"top",trigger:"hover",title:"",template:''}}(window.jQuery),!function(a){var b=function(a,b){this.init("popover",a,b)};b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype,{constructor:b,setContent:function(){var b=this.tip(),c=this.getTitle(),d=this.getContent();b.find(".popover-title")[a.type(c)=="object"?"append":"html"](c),b.find(".popover-content > *")[a.type(d)=="object"?"append":"html"](d),b.removeClass("fade top bottom left right in")},hasContent:function(){return this.getTitle()||this.getContent()},getContent:function(){var a,b=this.$element,c=this.options;return a=b.attr("data-content")||(typeof c.content=="function"?c.content.call(b[0]):c.content),a=a.toString().replace(/(^\s*|\s*$)/,""),a},tip:function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip}}),a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("popover"),f=typeof c=="object"&&c;e||d.data("popover",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.popover.Constructor=b,a.fn.popover.defaults=a.extend({},a.fn.tooltip.defaults,{placement:"right",content:"",template:''})}(window.jQuery),!function(a){var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype={constructor:c,close:function(b){function f(){e.trigger("closed").remove()}var c=a(this),d=c.attr("data-target"),e;d||(d=c.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),e=a(d),e.trigger("close"),b&&b.preventDefault(),e.length||(e=c.hasClass("alert")?c:c.parent()),e.trigger("close").removeClass("in"),a.support.transition&&e.hasClass("fade")?e.on(a.support.transition.end,f):f()}},a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("alert");e||d.data("alert",e=new c(this)),typeof b=="string"&&e[b].call(d)})},a.fn.alert.Constructor=c,a(function(){a("body").on("click.alert.data-api",b,c.prototype.close)})}(window.jQuery),!function(a){var b=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.button.defaults,c)};b.prototype={constructor:b,setState:function(a){var b="disabled",c=this.$element,d=c.data(),e=c.is("input")?"val":"html";a+="Text",d.resetText||c.data("resetText",c[e]()),c[e](d[a]||this.options[a]),setTimeout(function(){a=="loadingText"?c.addClass(b).attr(b,b):c.removeClass(b).removeAttr(b)},0)},toggle:function(){var a=this.$element.parent('[data-toggle="buttons-radio"]');a&&a.find(".active").removeClass("active"),this.$element.toggleClass("active")}},a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("button"),f=typeof c=="object"&&c;e||d.data("button",e=new b(this,f)),c=="toggle"?e.toggle():c&&e.setState(c)})},a.fn.button.defaults={loadingText:"loading..."},a.fn.button.Constructor=b,a(function(){a("body").on("click.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle")})})}(window.jQuery),!function(a){var b=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.collapse.defaults,c),this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.prototype={constructor:b,dimension:function(){var a=this.$element.hasClass("width");return a?"width":"height"},show:function(){var b=this.dimension(),c=a.camelCase(["scroll",b].join("-")),d=this.$parent&&this.$parent.find(".in"),e;d&&d.length&&(e=d.data("collapse"),d.collapse("hide"),e||d.data("collapse",null)),this.$element[b](0),this.transition("addClass","show","shown"),this.$element[b](this.$element[0][c])},hide:function(){var a=this.dimension();this.reset(this.$element[a]()),this.transition("removeClass","hide","hidden"),this.$element[a](0)},reset:function(a){var b=this.dimension();return this.$element.removeClass("collapse")[b](a||"auto")[0].offsetWidth,this.$element[a?"addClass":"removeClass"]("collapse"),this},transition:function(b,c,d){var e=this,f=function(){c=="show"&&e.reset(),e.$element.trigger(d)};this.$element.trigger(c)[b]("in"),a.support.transition&&this.$element.hasClass("collapse")?this.$element.one(a.support.transition.end,f):f()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}},a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("collapse"),f=typeof c=="object"&&c;e||d.data("collapse",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.collapse.defaults={toggle:!0},a.fn.collapse.Constructor=b,a(function(){a("body").on("click.collapse.data-api","[data-toggle=collapse]",function(b){var c=a(this),d,e=c.attr("data-target")||b.preventDefault()||(d=c.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""),f=a(e).data("collapse")?"toggle":c.data();a(e).collapse(f)})})}(window.jQuery),!function(a){var b=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.carousel.defaults,c),this.options.slide&&this.slide(this.options.slide),this.options.pause=="hover"&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.prototype={cycle:function(){return this.interval=setInterval(a.proxy(this.next,this),this.options.interval),this},to:function(b){var c=this.$element.find(".active"),d=c.parent().children(),e=d.index(c),f=this;if(b>d.length-1||b<0)return;return this.sliding?this.$element.one("slid",function(){f.to(b)}):e==b?this.pause().cycle():this.slide(b>e?"next":"prev",a(d[b]))},pause:function(){return clearInterval(this.interval),this.interval=null,this},next:function(){if(this.sliding)return;return this.slide("next")},prev:function(){if(this.sliding)return;return this.slide("prev")},slide:function(b,c){var d=this.$element.find(".active"),e=c||d[b](),f=this.interval,g=b=="next"?"left":"right",h=b=="next"?"first":"last",i=this;this.sliding=!0,f&&this.pause(),e=e.length?e:this.$element.find(".item")[h]();if(e.hasClass("active"))return;return!a.support.transition&&this.$element.hasClass("slide")?(this.$element.trigger("slide"),d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid")):(e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),this.$element.trigger("slide"),this.$element.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid")},0)})),f&&this.cycle(),this}},a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("carousel"),f=typeof c=="object"&&c;e||d.data("carousel",e=new b(this,f)),typeof c=="number"?e.to(c):typeof c=="string"||(c=f.slide)?e[c]():e.cycle()})},a.fn.carousel.defaults={interval:5e3,pause:"hover"},a.fn.carousel.Constructor=b,a(function(){a("body").on("click.carousel.data-api","[data-slide]",function(b){var c=a(this),d,e=a(c.attr("data-target")||(d=c.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,"")),f=!e.data("modal")&&a.extend({},e.data(),c.data());e.carousel(f),b.preventDefault()})})}(window.jQuery),!function(a){var b=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.typeahead.defaults,c),this.matcher=this.options.matcher||this.matcher,this.sorter=this.options.sorter||this.sorter,this.highlighter=this.options.highlighter||this.highlighter,this.$menu=a(this.options.menu).appendTo("body"),this.source=this.options.source,this.shown=!1,this.listen()};b.prototype={constructor:b,select:function(){var a=this.$menu.find(".active").attr("data-value");return this.$element.val(a),this.$element.change(),this.hide()},show:function(){var b=a.extend({},this.$element.offset(),{height:this.$element[0].offsetHeight});return this.$menu.css({top:b.top+b.height,left:b.left}),this.$menu.show(),this.shown=!0,this},hide:function(){return this.$menu.hide(),this.shown=!1,this},lookup:function(b){var c=this,d,e;return this.query=this.$element.val(),this.query?(d=a.grep(this.source,function(a){if(c.matcher(a))return a}),d=this.sorter(d),d.length?this.render(d.slice(0,this.options.items)).show():this.shown?this.hide():this):this.shown?this.hide():this},matcher:function(a){return~a.toLowerCase().indexOf(this.query.toLowerCase())},sorter:function(a){var b=[],c=[],d=[],e;while(e=a.shift())e.toLowerCase().indexOf(this.query.toLowerCase())?~e.indexOf(this.query)?c.push(e):d.push(e):b.push(e);return b.concat(c,d)},highlighter:function(a){return a.replace(new RegExp("("+this.query+")","ig"),function(a,b){return""+b+""})},render:function(b){var c=this;return b=a(b).map(function(b,d){return b=a(c.options.item).attr("data-value",d),b.find("a").html(c.highlighter(d)),b[0]}),b.first().addClass("active"),this.$menu.html(b),this},next:function(b){var c=this.$menu.find(".active").removeClass("active"),d=c.next();d.length||(d=a(this.$menu.find("li")[0])),d.addClass("active")},prev:function(a){var b=this.$menu.find(".active").removeClass("active"),c=b.prev();c.length||(c=this.$menu.find("li").last()),c.addClass("active")},listen:function(){this.$element.on("blur",a.proxy(this.blur,this)).on("keypress",a.proxy(this.keypress,this)).on("keyup",a.proxy(this.keyup,this)),(a.browser.webkit||a.browser.msie)&&this.$element.on("keydown",a.proxy(this.keypress,this)),this.$menu.on("click",a.proxy(this.click,this)).on("mouseenter","li",a.proxy(this.mouseenter,this))},keyup:function(a){switch(a.keyCode){case 40:case 38:break;case 9:case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide();break;default:this.lookup()}a.stopPropagation(),a.preventDefault()},keypress:function(a){if(!this.shown)return;switch(a.keyCode){case 9:case 13:case 27:a.preventDefault();break;case 38:a.preventDefault(),this.prev();break;case 40:a.preventDefault(),this.next()}a.stopPropagation()},blur:function(a){var b=this;setTimeout(function(){b.hide()},150)},click:function(a){a.stopPropagation(),a.preventDefault(),this.select()},mouseenter:function(b){this.$menu.find(".active").removeClass("active"),a(b.currentTarget).addClass("active")}},a.fn.typeahead=function(c){return this.each(function(){var d=a(this),e=d.data("typeahead"),f=typeof c=="object"&&c;e||d.data("typeahead",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.typeahead.defaults={source:[],items:8,menu:'',item:''},a.fn.typeahead.Constructor=b,a(function(){a("body").on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(b){var c=a(this);if(c.data("typeahead"))return;b.preventDefault(),c.typeahead(c.data())})})}(window.jQuery)
--------------------------------------------------------------------------------
/static/js/bootstrap.js:
--------------------------------------------------------------------------------
1 | /* ===================================================
2 | * bootstrap-transition.js v2.0.2
3 | * http://twitter.github.com/bootstrap/javascript.html#transitions
4 | * ===================================================
5 | * Copyright 2012 Twitter, Inc.
6 | *
7 | * Licensed under the Apache License, Version 2.0 (the "License");
8 | * you may not use this file except in compliance with the License.
9 | * You may obtain a copy of the License at
10 | *
11 | * http://www.apache.org/licenses/LICENSE-2.0
12 | *
13 | * Unless required by applicable law or agreed to in writing, software
14 | * distributed under the License is distributed on an "AS IS" BASIS,
15 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 | * See the License for the specific language governing permissions and
17 | * limitations under the License.
18 | * ========================================================== */
19 |
20 | !function( $ ) {
21 |
22 | $(function () {
23 |
24 | "use strict"
25 |
26 | /* CSS TRANSITION SUPPORT (https://gist.github.com/373874)
27 | * ======================================================= */
28 |
29 | $.support.transition = (function () {
30 | var thisBody = document.body || document.documentElement
31 | , thisStyle = thisBody.style
32 | , support = thisStyle.transition !== undefined || thisStyle.WebkitTransition !== undefined || thisStyle.MozTransition !== undefined || thisStyle.MsTransition !== undefined || thisStyle.OTransition !== undefined
33 |
34 | return support && {
35 | end: (function () {
36 | var transitionEnd = "TransitionEnd"
37 | if ( $.browser.webkit ) {
38 | transitionEnd = "webkitTransitionEnd"
39 | } else if ( $.browser.mozilla ) {
40 | transitionEnd = "transitionend"
41 | } else if ( $.browser.opera ) {
42 | transitionEnd = "oTransitionEnd"
43 | }
44 | return transitionEnd
45 | }())
46 | }
47 | })()
48 |
49 | })
50 |
51 | }( window.jQuery );
52 | /* =========================================================
53 | * bootstrap-modal.js v2.0.2
54 | * http://twitter.github.com/bootstrap/javascript.html#modals
55 | * =========================================================
56 | * Copyright 2012 Twitter, Inc.
57 | *
58 | * Licensed under the Apache License, Version 2.0 (the "License");
59 | * you may not use this file except in compliance with the License.
60 | * You may obtain a copy of the License at
61 | *
62 | * http://www.apache.org/licenses/LICENSE-2.0
63 | *
64 | * Unless required by applicable law or agreed to in writing, software
65 | * distributed under the License is distributed on an "AS IS" BASIS,
66 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
67 | * See the License for the specific language governing permissions and
68 | * limitations under the License.
69 | * ========================================================= */
70 |
71 |
72 | !function( $ ){
73 |
74 | "use strict"
75 |
76 | /* MODAL CLASS DEFINITION
77 | * ====================== */
78 |
79 | var Modal = function ( content, options ) {
80 | this.options = options
81 | this.$element = $(content)
82 | .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this))
83 | }
84 |
85 | Modal.prototype = {
86 |
87 | constructor: Modal
88 |
89 | , toggle: function () {
90 | return this[!this.isShown ? 'show' : 'hide']()
91 | }
92 |
93 | , show: function () {
94 | var that = this
95 |
96 | if (this.isShown) return
97 |
98 | $('body').addClass('modal-open')
99 |
100 | this.isShown = true
101 | this.$element.trigger('show')
102 |
103 | escape.call(this)
104 | backdrop.call(this, function () {
105 | var transition = $.support.transition && that.$element.hasClass('fade')
106 |
107 | !that.$element.parent().length && that.$element.appendTo(document.body) //don't move modals dom position
108 |
109 | that.$element
110 | .show()
111 |
112 | if (transition) {
113 | that.$element[0].offsetWidth // force reflow
114 | }
115 |
116 | that.$element.addClass('in')
117 |
118 | transition ?
119 | that.$element.one($.support.transition.end, function () { that.$element.trigger('shown') }) :
120 | that.$element.trigger('shown')
121 |
122 | })
123 | }
124 |
125 | , hide: function ( e ) {
126 | e && e.preventDefault()
127 |
128 | if (!this.isShown) return
129 |
130 | var that = this
131 | this.isShown = false
132 |
133 | $('body').removeClass('modal-open')
134 |
135 | escape.call(this)
136 |
137 | this.$element
138 | .trigger('hide')
139 | .removeClass('in')
140 |
141 | $.support.transition && this.$element.hasClass('fade') ?
142 | hideWithTransition.call(this) :
143 | hideModal.call(this)
144 | }
145 |
146 | }
147 |
148 |
149 | /* MODAL PRIVATE METHODS
150 | * ===================== */
151 |
152 | function hideWithTransition() {
153 | var that = this
154 | , timeout = setTimeout(function () {
155 | that.$element.off($.support.transition.end)
156 | hideModal.call(that)
157 | }, 500)
158 |
159 | this.$element.one($.support.transition.end, function () {
160 | clearTimeout(timeout)
161 | hideModal.call(that)
162 | })
163 | }
164 |
165 | function hideModal( that ) {
166 | this.$element
167 | .hide()
168 | .trigger('hidden')
169 |
170 | backdrop.call(this)
171 | }
172 |
173 | function backdrop( callback ) {
174 | var that = this
175 | , animate = this.$element.hasClass('fade') ? 'fade' : ''
176 |
177 | if (this.isShown && this.options.backdrop) {
178 | var doAnimate = $.support.transition && animate
179 |
180 | this.$backdrop = $('')
181 | .appendTo(document.body)
182 |
183 | if (this.options.backdrop != 'static') {
184 | this.$backdrop.click($.proxy(this.hide, this))
185 | }
186 |
187 | if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
188 |
189 | this.$backdrop.addClass('in')
190 |
191 | doAnimate ?
192 | this.$backdrop.one($.support.transition.end, callback) :
193 | callback()
194 |
195 | } else if (!this.isShown && this.$backdrop) {
196 | this.$backdrop.removeClass('in')
197 |
198 | $.support.transition && this.$element.hasClass('fade')?
199 | this.$backdrop.one($.support.transition.end, $.proxy(removeBackdrop, this)) :
200 | removeBackdrop.call(this)
201 |
202 | } else if (callback) {
203 | callback()
204 | }
205 | }
206 |
207 | function removeBackdrop() {
208 | this.$backdrop.remove()
209 | this.$backdrop = null
210 | }
211 |
212 | function escape() {
213 | var that = this
214 | if (this.isShown && this.options.keyboard) {
215 | $(document).on('keyup.dismiss.modal', function ( e ) {
216 | e.which == 27 && that.hide()
217 | })
218 | } else if (!this.isShown) {
219 | $(document).off('keyup.dismiss.modal')
220 | }
221 | }
222 |
223 |
224 | /* MODAL PLUGIN DEFINITION
225 | * ======================= */
226 |
227 | $.fn.modal = function ( option ) {
228 | return this.each(function () {
229 | var $this = $(this)
230 | , data = $this.data('modal')
231 | , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)
232 | if (!data) $this.data('modal', (data = new Modal(this, options)))
233 | if (typeof option == 'string') data[option]()
234 | else if (options.show) data.show()
235 | })
236 | }
237 |
238 | $.fn.modal.defaults = {
239 | backdrop: true
240 | , keyboard: true
241 | , show: true
242 | }
243 |
244 | $.fn.modal.Constructor = Modal
245 |
246 |
247 | /* MODAL DATA-API
248 | * ============== */
249 |
250 | $(function () {
251 | $('body').on('click.modal.data-api', '[data-toggle="modal"]', function ( e ) {
252 | var $this = $(this), href
253 | , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
254 | , option = $target.data('modal') ? 'toggle' : $.extend({}, $target.data(), $this.data())
255 |
256 | e.preventDefault()
257 | $target.modal(option)
258 | })
259 | })
260 |
261 | }( window.jQuery );
262 | /* ============================================================
263 | * bootstrap-dropdown.js v2.0.2
264 | * http://twitter.github.com/bootstrap/javascript.html#dropdowns
265 | * ============================================================
266 | * Copyright 2012 Twitter, Inc.
267 | *
268 | * Licensed under the Apache License, Version 2.0 (the "License");
269 | * you may not use this file except in compliance with the License.
270 | * You may obtain a copy of the License at
271 | *
272 | * http://www.apache.org/licenses/LICENSE-2.0
273 | *
274 | * Unless required by applicable law or agreed to in writing, software
275 | * distributed under the License is distributed on an "AS IS" BASIS,
276 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
277 | * See the License for the specific language governing permissions and
278 | * limitations under the License.
279 | * ============================================================ */
280 |
281 |
282 | !function( $ ){
283 |
284 | "use strict"
285 |
286 | /* DROPDOWN CLASS DEFINITION
287 | * ========================= */
288 |
289 | var toggle = '[data-toggle="dropdown"]'
290 | , Dropdown = function ( element ) {
291 | var $el = $(element).on('click.dropdown.data-api', this.toggle)
292 | $('html').on('click.dropdown.data-api', function () {
293 | $el.parent().removeClass('open')
294 | })
295 | }
296 |
297 | Dropdown.prototype = {
298 |
299 | constructor: Dropdown
300 |
301 | , toggle: function ( e ) {
302 | var $this = $(this)
303 | , selector = $this.attr('data-target')
304 | , $parent
305 | , isActive
306 |
307 | if (!selector) {
308 | selector = $this.attr('href')
309 | selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
310 | }
311 |
312 | $parent = $(selector)
313 | $parent.length || ($parent = $this.parent())
314 |
315 | isActive = $parent.hasClass('open')
316 |
317 | clearMenus()
318 | !isActive && $parent.toggleClass('open')
319 |
320 | return false
321 | }
322 |
323 | }
324 |
325 | function clearMenus() {
326 | $(toggle).parent().removeClass('open')
327 | }
328 |
329 |
330 | /* DROPDOWN PLUGIN DEFINITION
331 | * ========================== */
332 |
333 | $.fn.dropdown = function ( option ) {
334 | return this.each(function () {
335 | var $this = $(this)
336 | , data = $this.data('dropdown')
337 | if (!data) $this.data('dropdown', (data = new Dropdown(this)))
338 | if (typeof option == 'string') data[option].call($this)
339 | })
340 | }
341 |
342 | $.fn.dropdown.Constructor = Dropdown
343 |
344 |
345 | /* APPLY TO STANDARD DROPDOWN ELEMENTS
346 | * =================================== */
347 |
348 | $(function () {
349 | $('html').on('click.dropdown.data-api', clearMenus)
350 | $('body').on('click.dropdown.data-api', toggle, Dropdown.prototype.toggle)
351 | })
352 |
353 | }( window.jQuery );
354 | /* =============================================================
355 | * bootstrap-scrollspy.js v2.0.2
356 | * http://twitter.github.com/bootstrap/javascript.html#scrollspy
357 | * =============================================================
358 | * Copyright 2012 Twitter, Inc.
359 | *
360 | * Licensed under the Apache License, Version 2.0 (the "License");
361 | * you may not use this file except in compliance with the License.
362 | * You may obtain a copy of the License at
363 | *
364 | * http://www.apache.org/licenses/LICENSE-2.0
365 | *
366 | * Unless required by applicable law or agreed to in writing, software
367 | * distributed under the License is distributed on an "AS IS" BASIS,
368 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
369 | * See the License for the specific language governing permissions and
370 | * limitations under the License.
371 | * ============================================================== */
372 |
373 | !function ( $ ) {
374 |
375 | "use strict"
376 |
377 | /* SCROLLSPY CLASS DEFINITION
378 | * ========================== */
379 |
380 | function ScrollSpy( element, options) {
381 | var process = $.proxy(this.process, this)
382 | , $element = $(element).is('body') ? $(window) : $(element)
383 | , href
384 | this.options = $.extend({}, $.fn.scrollspy.defaults, options)
385 | this.$scrollElement = $element.on('scroll.scroll.data-api', process)
386 | this.selector = (this.options.target
387 | || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
388 | || '') + ' .nav li > a'
389 | this.$body = $('body').on('click.scroll.data-api', this.selector, process)
390 | this.refresh()
391 | this.process()
392 | }
393 |
394 | ScrollSpy.prototype = {
395 |
396 | constructor: ScrollSpy
397 |
398 | , refresh: function () {
399 | this.targets = this.$body
400 | .find(this.selector)
401 | .map(function () {
402 | var href = $(this).attr('href')
403 | return /^#\w/.test(href) && $(href).length ? href : null
404 | })
405 |
406 | this.offsets = $.map(this.targets, function (id) {
407 | return $(id).position().top
408 | })
409 | }
410 |
411 | , process: function () {
412 | var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
413 | , offsets = this.offsets
414 | , targets = this.targets
415 | , activeTarget = this.activeTarget
416 | , i
417 |
418 | for (i = offsets.length; i--;) {
419 | activeTarget != targets[i]
420 | && scrollTop >= offsets[i]
421 | && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
422 | && this.activate( targets[i] )
423 | }
424 | }
425 |
426 | , activate: function (target) {
427 | var active
428 |
429 | this.activeTarget = target
430 |
431 | this.$body
432 | .find(this.selector).parent('.active')
433 | .removeClass('active')
434 |
435 | active = this.$body
436 | .find(this.selector + '[href="' + target + '"]')
437 | .parent('li')
438 | .addClass('active')
439 |
440 | if ( active.parent('.dropdown-menu') ) {
441 | active.closest('li.dropdown').addClass('active')
442 | }
443 | }
444 |
445 | }
446 |
447 |
448 | /* SCROLLSPY PLUGIN DEFINITION
449 | * =========================== */
450 |
451 | $.fn.scrollspy = function ( option ) {
452 | return this.each(function () {
453 | var $this = $(this)
454 | , data = $this.data('scrollspy')
455 | , options = typeof option == 'object' && option
456 | if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options)))
457 | if (typeof option == 'string') data[option]()
458 | })
459 | }
460 |
461 | $.fn.scrollspy.Constructor = ScrollSpy
462 |
463 | $.fn.scrollspy.defaults = {
464 | offset: 10
465 | }
466 |
467 |
468 | /* SCROLLSPY DATA-API
469 | * ================== */
470 |
471 | $(function () {
472 | $('[data-spy="scroll"]').each(function () {
473 | var $spy = $(this)
474 | $spy.scrollspy($spy.data())
475 | })
476 | })
477 |
478 | }( window.jQuery );
479 | /* ========================================================
480 | * bootstrap-tab.js v2.0.2
481 | * http://twitter.github.com/bootstrap/javascript.html#tabs
482 | * ========================================================
483 | * Copyright 2012 Twitter, Inc.
484 | *
485 | * Licensed under the Apache License, Version 2.0 (the "License");
486 | * you may not use this file except in compliance with the License.
487 | * You may obtain a copy of the License at
488 | *
489 | * http://www.apache.org/licenses/LICENSE-2.0
490 | *
491 | * Unless required by applicable law or agreed to in writing, software
492 | * distributed under the License is distributed on an "AS IS" BASIS,
493 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
494 | * See the License for the specific language governing permissions and
495 | * limitations under the License.
496 | * ======================================================== */
497 |
498 |
499 | !function( $ ){
500 |
501 | "use strict"
502 |
503 | /* TAB CLASS DEFINITION
504 | * ==================== */
505 |
506 | var Tab = function ( element ) {
507 | this.element = $(element)
508 | }
509 |
510 | Tab.prototype = {
511 |
512 | constructor: Tab
513 |
514 | , show: function () {
515 | var $this = this.element
516 | , $ul = $this.closest('ul:not(.dropdown-menu)')
517 | , selector = $this.attr('data-target')
518 | , previous
519 | , $target
520 |
521 | if (!selector) {
522 | selector = $this.attr('href')
523 | selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
524 | }
525 |
526 | if ( $this.parent('li').hasClass('active') ) return
527 |
528 | previous = $ul.find('.active a').last()[0]
529 |
530 | $this.trigger({
531 | type: 'show'
532 | , relatedTarget: previous
533 | })
534 |
535 | $target = $(selector)
536 |
537 | this.activate($this.parent('li'), $ul)
538 | this.activate($target, $target.parent(), function () {
539 | $this.trigger({
540 | type: 'shown'
541 | , relatedTarget: previous
542 | })
543 | })
544 | }
545 |
546 | , activate: function ( element, container, callback) {
547 | var $active = container.find('> .active')
548 | , transition = callback
549 | && $.support.transition
550 | && $active.hasClass('fade')
551 |
552 | function next() {
553 | $active
554 | .removeClass('active')
555 | .find('> .dropdown-menu > .active')
556 | .removeClass('active')
557 |
558 | element.addClass('active')
559 |
560 | if (transition) {
561 | element[0].offsetWidth // reflow for transition
562 | element.addClass('in')
563 | } else {
564 | element.removeClass('fade')
565 | }
566 |
567 | if ( element.parent('.dropdown-menu') ) {
568 | element.closest('li.dropdown').addClass('active')
569 | }
570 |
571 | callback && callback()
572 | }
573 |
574 | transition ?
575 | $active.one($.support.transition.end, next) :
576 | next()
577 |
578 | $active.removeClass('in')
579 | }
580 | }
581 |
582 |
583 | /* TAB PLUGIN DEFINITION
584 | * ===================== */
585 |
586 | $.fn.tab = function ( option ) {
587 | return this.each(function () {
588 | var $this = $(this)
589 | , data = $this.data('tab')
590 | if (!data) $this.data('tab', (data = new Tab(this)))
591 | if (typeof option == 'string') data[option]()
592 | })
593 | }
594 |
595 | $.fn.tab.Constructor = Tab
596 |
597 |
598 | /* TAB DATA-API
599 | * ============ */
600 |
601 | $(function () {
602 | $('body').on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
603 | e.preventDefault()
604 | $(this).tab('show')
605 | })
606 | })
607 |
608 | }( window.jQuery );
609 | /* ===========================================================
610 | * bootstrap-tooltip.js v2.0.2
611 | * http://twitter.github.com/bootstrap/javascript.html#tooltips
612 | * Inspired by the original jQuery.tipsy by Jason Frame
613 | * ===========================================================
614 | * Copyright 2012 Twitter, Inc.
615 | *
616 | * Licensed under the Apache License, Version 2.0 (the "License");
617 | * you may not use this file except in compliance with the License.
618 | * You may obtain a copy of the License at
619 | *
620 | * http://www.apache.org/licenses/LICENSE-2.0
621 | *
622 | * Unless required by applicable law or agreed to in writing, software
623 | * distributed under the License is distributed on an "AS IS" BASIS,
624 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
625 | * See the License for the specific language governing permissions and
626 | * limitations under the License.
627 | * ========================================================== */
628 |
629 | !function( $ ) {
630 |
631 | "use strict"
632 |
633 | /* TOOLTIP PUBLIC CLASS DEFINITION
634 | * =============================== */
635 |
636 | var Tooltip = function ( element, options ) {
637 | this.init('tooltip', element, options)
638 | }
639 |
640 | Tooltip.prototype = {
641 |
642 | constructor: Tooltip
643 |
644 | , init: function ( type, element, options ) {
645 | var eventIn
646 | , eventOut
647 |
648 | this.type = type
649 | this.$element = $(element)
650 | this.options = this.getOptions(options)
651 | this.enabled = true
652 |
653 | if (this.options.trigger != 'manual') {
654 | eventIn = this.options.trigger == 'hover' ? 'mouseenter' : 'focus'
655 | eventOut = this.options.trigger == 'hover' ? 'mouseleave' : 'blur'
656 | this.$element.on(eventIn, this.options.selector, $.proxy(this.enter, this))
657 | this.$element.on(eventOut, this.options.selector, $.proxy(this.leave, this))
658 | }
659 |
660 | this.options.selector ?
661 | (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
662 | this.fixTitle()
663 | }
664 |
665 | , getOptions: function ( options ) {
666 | options = $.extend({}, $.fn[this.type].defaults, options, this.$element.data())
667 |
668 | if (options.delay && typeof options.delay == 'number') {
669 | options.delay = {
670 | show: options.delay
671 | , hide: options.delay
672 | }
673 | }
674 |
675 | return options
676 | }
677 |
678 | , enter: function ( e ) {
679 | var self = $(e.currentTarget)[this.type](this._options).data(this.type)
680 |
681 | if (!self.options.delay || !self.options.delay.show) {
682 | self.show()
683 | } else {
684 | self.hoverState = 'in'
685 | setTimeout(function() {
686 | if (self.hoverState == 'in') {
687 | self.show()
688 | }
689 | }, self.options.delay.show)
690 | }
691 | }
692 |
693 | , leave: function ( e ) {
694 | var self = $(e.currentTarget)[this.type](this._options).data(this.type)
695 |
696 | if (!self.options.delay || !self.options.delay.hide) {
697 | self.hide()
698 | } else {
699 | self.hoverState = 'out'
700 | setTimeout(function() {
701 | if (self.hoverState == 'out') {
702 | self.hide()
703 | }
704 | }, self.options.delay.hide)
705 | }
706 | }
707 |
708 | , show: function () {
709 | var $tip
710 | , inside
711 | , pos
712 | , actualWidth
713 | , actualHeight
714 | , placement
715 | , tp
716 |
717 | if (this.hasContent() && this.enabled) {
718 | $tip = this.tip()
719 | this.setContent()
720 |
721 | if (this.options.animation) {
722 | $tip.addClass('fade')
723 | }
724 |
725 | placement = typeof this.options.placement == 'function' ?
726 | this.options.placement.call(this, $tip[0], this.$element[0]) :
727 | this.options.placement
728 |
729 | inside = /in/.test(placement)
730 |
731 | $tip
732 | .remove()
733 | .css({ top: 0, left: 0, display: 'block' })
734 | .appendTo(inside ? this.$element : document.body)
735 |
736 | pos = this.getPosition(inside)
737 |
738 | actualWidth = $tip[0].offsetWidth
739 | actualHeight = $tip[0].offsetHeight
740 |
741 | switch (inside ? placement.split(' ')[1] : placement) {
742 | case 'bottom':
743 | tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2}
744 | break
745 | case 'top':
746 | tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2}
747 | break
748 | case 'left':
749 | tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth}
750 | break
751 | case 'right':
752 | tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width}
753 | break
754 | }
755 |
756 | $tip
757 | .css(tp)
758 | .addClass(placement)
759 | .addClass('in')
760 | }
761 | }
762 |
763 | , setContent: function () {
764 | var $tip = this.tip()
765 | $tip.find('.tooltip-inner').html(this.getTitle())
766 | $tip.removeClass('fade in top bottom left right')
767 | }
768 |
769 | , hide: function () {
770 | var that = this
771 | , $tip = this.tip()
772 |
773 | $tip.removeClass('in')
774 |
775 | function removeWithAnimation() {
776 | var timeout = setTimeout(function () {
777 | $tip.off($.support.transition.end).remove()
778 | }, 500)
779 |
780 | $tip.one($.support.transition.end, function () {
781 | clearTimeout(timeout)
782 | $tip.remove()
783 | })
784 | }
785 |
786 | $.support.transition && this.$tip.hasClass('fade') ?
787 | removeWithAnimation() :
788 | $tip.remove()
789 | }
790 |
791 | , fixTitle: function () {
792 | var $e = this.$element
793 | if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {
794 | $e.attr('data-original-title', $e.attr('title') || '').removeAttr('title')
795 | }
796 | }
797 |
798 | , hasContent: function () {
799 | return this.getTitle()
800 | }
801 |
802 | , getPosition: function (inside) {
803 | return $.extend({}, (inside ? {top: 0, left: 0} : this.$element.offset()), {
804 | width: this.$element[0].offsetWidth
805 | , height: this.$element[0].offsetHeight
806 | })
807 | }
808 |
809 | , getTitle: function () {
810 | var title
811 | , $e = this.$element
812 | , o = this.options
813 |
814 | title = $e.attr('data-original-title')
815 | || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)
816 |
817 | title = (title || '').toString().replace(/(^\s*|\s*$)/, "")
818 |
819 | return title
820 | }
821 |
822 | , tip: function () {
823 | return this.$tip = this.$tip || $(this.options.template)
824 | }
825 |
826 | , validate: function () {
827 | if (!this.$element[0].parentNode) {
828 | this.hide()
829 | this.$element = null
830 | this.options = null
831 | }
832 | }
833 |
834 | , enable: function () {
835 | this.enabled = true
836 | }
837 |
838 | , disable: function () {
839 | this.enabled = false
840 | }
841 |
842 | , toggleEnabled: function () {
843 | this.enabled = !this.enabled
844 | }
845 |
846 | , toggle: function () {
847 | this[this.tip().hasClass('in') ? 'hide' : 'show']()
848 | }
849 |
850 | }
851 |
852 |
853 | /* TOOLTIP PLUGIN DEFINITION
854 | * ========================= */
855 |
856 | $.fn.tooltip = function ( option ) {
857 | return this.each(function () {
858 | var $this = $(this)
859 | , data = $this.data('tooltip')
860 | , options = typeof option == 'object' && option
861 | if (!data) $this.data('tooltip', (data = new Tooltip(this, options)))
862 | if (typeof option == 'string') data[option]()
863 | })
864 | }
865 |
866 | $.fn.tooltip.Constructor = Tooltip
867 |
868 | $.fn.tooltip.defaults = {
869 | animation: true
870 | , delay: 0
871 | , selector: false
872 | , placement: 'top'
873 | , trigger: 'hover'
874 | , title: ''
875 | , template: ''
876 | }
877 |
878 | }( window.jQuery );
879 | /* ===========================================================
880 | * bootstrap-popover.js v2.0.2
881 | * http://twitter.github.com/bootstrap/javascript.html#popovers
882 | * ===========================================================
883 | * Copyright 2012 Twitter, Inc.
884 | *
885 | * Licensed under the Apache License, Version 2.0 (the "License");
886 | * you may not use this file except in compliance with the License.
887 | * You may obtain a copy of the License at
888 | *
889 | * http://www.apache.org/licenses/LICENSE-2.0
890 | *
891 | * Unless required by applicable law or agreed to in writing, software
892 | * distributed under the License is distributed on an "AS IS" BASIS,
893 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
894 | * See the License for the specific language governing permissions and
895 | * limitations under the License.
896 | * =========================================================== */
897 |
898 |
899 | !function( $ ) {
900 |
901 | "use strict"
902 |
903 | var Popover = function ( element, options ) {
904 | this.init('popover', element, options)
905 | }
906 |
907 | /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js
908 | ========================================== */
909 |
910 | Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, {
911 |
912 | constructor: Popover
913 |
914 | , setContent: function () {
915 | var $tip = this.tip()
916 | , title = this.getTitle()
917 | , content = this.getContent()
918 |
919 | $tip.find('.popover-title')[ $.type(title) == 'object' ? 'append' : 'html' ](title)
920 | $tip.find('.popover-content > *')[ $.type(content) == 'object' ? 'append' : 'html' ](content)
921 |
922 | $tip.removeClass('fade top bottom left right in')
923 | }
924 |
925 | , hasContent: function () {
926 | return this.getTitle() || this.getContent()
927 | }
928 |
929 | , getContent: function () {
930 | var content
931 | , $e = this.$element
932 | , o = this.options
933 |
934 | content = $e.attr('data-content')
935 | || (typeof o.content == 'function' ? o.content.call($e[0]) : o.content)
936 |
937 | content = content.toString().replace(/(^\s*|\s*$)/, "")
938 |
939 | return content
940 | }
941 |
942 | , tip: function() {
943 | if (!this.$tip) {
944 | this.$tip = $(this.options.template)
945 | }
946 | return this.$tip
947 | }
948 |
949 | })
950 |
951 |
952 | /* POPOVER PLUGIN DEFINITION
953 | * ======================= */
954 |
955 | $.fn.popover = function ( option ) {
956 | return this.each(function () {
957 | var $this = $(this)
958 | , data = $this.data('popover')
959 | , options = typeof option == 'object' && option
960 | if (!data) $this.data('popover', (data = new Popover(this, options)))
961 | if (typeof option == 'string') data[option]()
962 | })
963 | }
964 |
965 | $.fn.popover.Constructor = Popover
966 |
967 | $.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, {
968 | placement: 'right'
969 | , content: ''
970 | , template: ''
971 | })
972 |
973 | }( window.jQuery );
974 | /* ==========================================================
975 | * bootstrap-alert.js v2.0.2
976 | * http://twitter.github.com/bootstrap/javascript.html#alerts
977 | * ==========================================================
978 | * Copyright 2012 Twitter, Inc.
979 | *
980 | * Licensed under the Apache License, Version 2.0 (the "License");
981 | * you may not use this file except in compliance with the License.
982 | * You may obtain a copy of the License at
983 | *
984 | * http://www.apache.org/licenses/LICENSE-2.0
985 | *
986 | * Unless required by applicable law or agreed to in writing, software
987 | * distributed under the License is distributed on an "AS IS" BASIS,
988 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
989 | * See the License for the specific language governing permissions and
990 | * limitations under the License.
991 | * ========================================================== */
992 |
993 |
994 | !function( $ ){
995 |
996 | "use strict"
997 |
998 | /* ALERT CLASS DEFINITION
999 | * ====================== */
1000 |
1001 | var dismiss = '[data-dismiss="alert"]'
1002 | , Alert = function ( el ) {
1003 | $(el).on('click', dismiss, this.close)
1004 | }
1005 |
1006 | Alert.prototype = {
1007 |
1008 | constructor: Alert
1009 |
1010 | , close: function ( e ) {
1011 | var $this = $(this)
1012 | , selector = $this.attr('data-target')
1013 | , $parent
1014 |
1015 | if (!selector) {
1016 | selector = $this.attr('href')
1017 | selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
1018 | }
1019 |
1020 | $parent = $(selector)
1021 | $parent.trigger('close')
1022 |
1023 | e && e.preventDefault()
1024 |
1025 | $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent())
1026 |
1027 | $parent
1028 | .trigger('close')
1029 | .removeClass('in')
1030 |
1031 | function removeElement() {
1032 | $parent
1033 | .trigger('closed')
1034 | .remove()
1035 | }
1036 |
1037 | $.support.transition && $parent.hasClass('fade') ?
1038 | $parent.on($.support.transition.end, removeElement) :
1039 | removeElement()
1040 | }
1041 |
1042 | }
1043 |
1044 |
1045 | /* ALERT PLUGIN DEFINITION
1046 | * ======================= */
1047 |
1048 | $.fn.alert = function ( option ) {
1049 | return this.each(function () {
1050 | var $this = $(this)
1051 | , data = $this.data('alert')
1052 | if (!data) $this.data('alert', (data = new Alert(this)))
1053 | if (typeof option == 'string') data[option].call($this)
1054 | })
1055 | }
1056 |
1057 | $.fn.alert.Constructor = Alert
1058 |
1059 |
1060 | /* ALERT DATA-API
1061 | * ============== */
1062 |
1063 | $(function () {
1064 | $('body').on('click.alert.data-api', dismiss, Alert.prototype.close)
1065 | })
1066 |
1067 | }( window.jQuery );
1068 | /* ============================================================
1069 | * bootstrap-button.js v2.0.2
1070 | * http://twitter.github.com/bootstrap/javascript.html#buttons
1071 | * ============================================================
1072 | * Copyright 2012 Twitter, Inc.
1073 | *
1074 | * Licensed under the Apache License, Version 2.0 (the "License");
1075 | * you may not use this file except in compliance with the License.
1076 | * You may obtain a copy of the License at
1077 | *
1078 | * http://www.apache.org/licenses/LICENSE-2.0
1079 | *
1080 | * Unless required by applicable law or agreed to in writing, software
1081 | * distributed under the License is distributed on an "AS IS" BASIS,
1082 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1083 | * See the License for the specific language governing permissions and
1084 | * limitations under the License.
1085 | * ============================================================ */
1086 |
1087 | !function( $ ){
1088 |
1089 | "use strict"
1090 |
1091 | /* BUTTON PUBLIC CLASS DEFINITION
1092 | * ============================== */
1093 |
1094 | var Button = function ( element, options ) {
1095 | this.$element = $(element)
1096 | this.options = $.extend({}, $.fn.button.defaults, options)
1097 | }
1098 |
1099 | Button.prototype = {
1100 |
1101 | constructor: Button
1102 |
1103 | , setState: function ( state ) {
1104 | var d = 'disabled'
1105 | , $el = this.$element
1106 | , data = $el.data()
1107 | , val = $el.is('input') ? 'val' : 'html'
1108 |
1109 | state = state + 'Text'
1110 | data.resetText || $el.data('resetText', $el[val]())
1111 |
1112 | $el[val](data[state] || this.options[state])
1113 |
1114 | // push to event loop to allow forms to submit
1115 | setTimeout(function () {
1116 | state == 'loadingText' ?
1117 | $el.addClass(d).attr(d, d) :
1118 | $el.removeClass(d).removeAttr(d)
1119 | }, 0)
1120 | }
1121 |
1122 | , toggle: function () {
1123 | var $parent = this.$element.parent('[data-toggle="buttons-radio"]')
1124 |
1125 | $parent && $parent
1126 | .find('.active')
1127 | .removeClass('active')
1128 |
1129 | this.$element.toggleClass('active')
1130 | }
1131 |
1132 | }
1133 |
1134 |
1135 | /* BUTTON PLUGIN DEFINITION
1136 | * ======================== */
1137 |
1138 | $.fn.button = function ( option ) {
1139 | return this.each(function () {
1140 | var $this = $(this)
1141 | , data = $this.data('button')
1142 | , options = typeof option == 'object' && option
1143 | if (!data) $this.data('button', (data = new Button(this, options)))
1144 | if (option == 'toggle') data.toggle()
1145 | else if (option) data.setState(option)
1146 | })
1147 | }
1148 |
1149 | $.fn.button.defaults = {
1150 | loadingText: 'loading...'
1151 | }
1152 |
1153 | $.fn.button.Constructor = Button
1154 |
1155 |
1156 | /* BUTTON DATA-API
1157 | * =============== */
1158 |
1159 | $(function () {
1160 | $('body').on('click.button.data-api', '[data-toggle^=button]', function ( e ) {
1161 | var $btn = $(e.target)
1162 | if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
1163 | $btn.button('toggle')
1164 | })
1165 | })
1166 |
1167 | }( window.jQuery );
1168 | /* =============================================================
1169 | * bootstrap-collapse.js v2.0.2
1170 | * http://twitter.github.com/bootstrap/javascript.html#collapse
1171 | * =============================================================
1172 | * Copyright 2012 Twitter, Inc.
1173 | *
1174 | * Licensed under the Apache License, Version 2.0 (the "License");
1175 | * you may not use this file except in compliance with the License.
1176 | * You may obtain a copy of the License at
1177 | *
1178 | * http://www.apache.org/licenses/LICENSE-2.0
1179 | *
1180 | * Unless required by applicable law or agreed to in writing, software
1181 | * distributed under the License is distributed on an "AS IS" BASIS,
1182 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1183 | * See the License for the specific language governing permissions and
1184 | * limitations under the License.
1185 | * ============================================================ */
1186 |
1187 | !function( $ ){
1188 |
1189 | "use strict"
1190 |
1191 | var Collapse = function ( element, options ) {
1192 | this.$element = $(element)
1193 | this.options = $.extend({}, $.fn.collapse.defaults, options)
1194 |
1195 | if (this.options["parent"]) {
1196 | this.$parent = $(this.options["parent"])
1197 | }
1198 |
1199 | this.options.toggle && this.toggle()
1200 | }
1201 |
1202 | Collapse.prototype = {
1203 |
1204 | constructor: Collapse
1205 |
1206 | , dimension: function () {
1207 | var hasWidth = this.$element.hasClass('width')
1208 | return hasWidth ? 'width' : 'height'
1209 | }
1210 |
1211 | , show: function () {
1212 | var dimension = this.dimension()
1213 | , scroll = $.camelCase(['scroll', dimension].join('-'))
1214 | , actives = this.$parent && this.$parent.find('.in')
1215 | , hasData
1216 |
1217 | if (actives && actives.length) {
1218 | hasData = actives.data('collapse')
1219 | actives.collapse('hide')
1220 | hasData || actives.data('collapse', null)
1221 | }
1222 |
1223 | this.$element[dimension](0)
1224 | this.transition('addClass', 'show', 'shown')
1225 | this.$element[dimension](this.$element[0][scroll])
1226 |
1227 | }
1228 |
1229 | , hide: function () {
1230 | var dimension = this.dimension()
1231 | this.reset(this.$element[dimension]())
1232 | this.transition('removeClass', 'hide', 'hidden')
1233 | this.$element[dimension](0)
1234 | }
1235 |
1236 | , reset: function ( size ) {
1237 | var dimension = this.dimension()
1238 |
1239 | this.$element
1240 | .removeClass('collapse')
1241 | [dimension](size || 'auto')
1242 | [0].offsetWidth
1243 |
1244 | this.$element[size ? 'addClass' : 'removeClass']('collapse')
1245 |
1246 | return this
1247 | }
1248 |
1249 | , transition: function ( method, startEvent, completeEvent ) {
1250 | var that = this
1251 | , complete = function () {
1252 | if (startEvent == 'show') that.reset()
1253 | that.$element.trigger(completeEvent)
1254 | }
1255 |
1256 | this.$element
1257 | .trigger(startEvent)
1258 | [method]('in')
1259 |
1260 | $.support.transition && this.$element.hasClass('collapse') ?
1261 | this.$element.one($.support.transition.end, complete) :
1262 | complete()
1263 | }
1264 |
1265 | , toggle: function () {
1266 | this[this.$element.hasClass('in') ? 'hide' : 'show']()
1267 | }
1268 |
1269 | }
1270 |
1271 | /* COLLAPSIBLE PLUGIN DEFINITION
1272 | * ============================== */
1273 |
1274 | $.fn.collapse = function ( option ) {
1275 | return this.each(function () {
1276 | var $this = $(this)
1277 | , data = $this.data('collapse')
1278 | , options = typeof option == 'object' && option
1279 | if (!data) $this.data('collapse', (data = new Collapse(this, options)))
1280 | if (typeof option == 'string') data[option]()
1281 | })
1282 | }
1283 |
1284 | $.fn.collapse.defaults = {
1285 | toggle: true
1286 | }
1287 |
1288 | $.fn.collapse.Constructor = Collapse
1289 |
1290 |
1291 | /* COLLAPSIBLE DATA-API
1292 | * ==================== */
1293 |
1294 | $(function () {
1295 | $('body').on('click.collapse.data-api', '[data-toggle=collapse]', function ( e ) {
1296 | var $this = $(this), href
1297 | , target = $this.attr('data-target')
1298 | || e.preventDefault()
1299 | || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
1300 | , option = $(target).data('collapse') ? 'toggle' : $this.data()
1301 | $(target).collapse(option)
1302 | })
1303 | })
1304 |
1305 | }( window.jQuery );
1306 | /* ==========================================================
1307 | * bootstrap-carousel.js v2.0.2
1308 | * http://twitter.github.com/bootstrap/javascript.html#carousel
1309 | * ==========================================================
1310 | * Copyright 2012 Twitter, Inc.
1311 | *
1312 | * Licensed under the Apache License, Version 2.0 (the "License");
1313 | * you may not use this file except in compliance with the License.
1314 | * You may obtain a copy of the License at
1315 | *
1316 | * http://www.apache.org/licenses/LICENSE-2.0
1317 | *
1318 | * Unless required by applicable law or agreed to in writing, software
1319 | * distributed under the License is distributed on an "AS IS" BASIS,
1320 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1321 | * See the License for the specific language governing permissions and
1322 | * limitations under the License.
1323 | * ========================================================== */
1324 |
1325 |
1326 | !function( $ ){
1327 |
1328 | "use strict"
1329 |
1330 | /* CAROUSEL CLASS DEFINITION
1331 | * ========================= */
1332 |
1333 | var Carousel = function (element, options) {
1334 | this.$element = $(element)
1335 | this.options = $.extend({}, $.fn.carousel.defaults, options)
1336 | this.options.slide && this.slide(this.options.slide)
1337 | this.options.pause == 'hover' && this.$element
1338 | .on('mouseenter', $.proxy(this.pause, this))
1339 | .on('mouseleave', $.proxy(this.cycle, this))
1340 | }
1341 |
1342 | Carousel.prototype = {
1343 |
1344 | cycle: function () {
1345 | this.interval = setInterval($.proxy(this.next, this), this.options.interval)
1346 | return this
1347 | }
1348 |
1349 | , to: function (pos) {
1350 | var $active = this.$element.find('.active')
1351 | , children = $active.parent().children()
1352 | , activePos = children.index($active)
1353 | , that = this
1354 |
1355 | if (pos > (children.length - 1) || pos < 0) return
1356 |
1357 | if (this.sliding) {
1358 | return this.$element.one('slid', function () {
1359 | that.to(pos)
1360 | })
1361 | }
1362 |
1363 | if (activePos == pos) {
1364 | return this.pause().cycle()
1365 | }
1366 |
1367 | return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos]))
1368 | }
1369 |
1370 | , pause: function () {
1371 | clearInterval(this.interval)
1372 | this.interval = null
1373 | return this
1374 | }
1375 |
1376 | , next: function () {
1377 | if (this.sliding) return
1378 | return this.slide('next')
1379 | }
1380 |
1381 | , prev: function () {
1382 | if (this.sliding) return
1383 | return this.slide('prev')
1384 | }
1385 |
1386 | , slide: function (type, next) {
1387 | var $active = this.$element.find('.active')
1388 | , $next = next || $active[type]()
1389 | , isCycling = this.interval
1390 | , direction = type == 'next' ? 'left' : 'right'
1391 | , fallback = type == 'next' ? 'first' : 'last'
1392 | , that = this
1393 |
1394 | this.sliding = true
1395 |
1396 | isCycling && this.pause()
1397 |
1398 | $next = $next.length ? $next : this.$element.find('.item')[fallback]()
1399 |
1400 | if ($next.hasClass('active')) return
1401 |
1402 | if (!$.support.transition && this.$element.hasClass('slide')) {
1403 | this.$element.trigger('slide')
1404 | $active.removeClass('active')
1405 | $next.addClass('active')
1406 | this.sliding = false
1407 | this.$element.trigger('slid')
1408 | } else {
1409 | $next.addClass(type)
1410 | $next[0].offsetWidth // force reflow
1411 | $active.addClass(direction)
1412 | $next.addClass(direction)
1413 | this.$element.trigger('slide')
1414 | this.$element.one($.support.transition.end, function () {
1415 | $next.removeClass([type, direction].join(' ')).addClass('active')
1416 | $active.removeClass(['active', direction].join(' '))
1417 | that.sliding = false
1418 | setTimeout(function () { that.$element.trigger('slid') }, 0)
1419 | })
1420 | }
1421 |
1422 | isCycling && this.cycle()
1423 |
1424 | return this
1425 | }
1426 |
1427 | }
1428 |
1429 |
1430 | /* CAROUSEL PLUGIN DEFINITION
1431 | * ========================== */
1432 |
1433 | $.fn.carousel = function ( option ) {
1434 | return this.each(function () {
1435 | var $this = $(this)
1436 | , data = $this.data('carousel')
1437 | , options = typeof option == 'object' && option
1438 | if (!data) $this.data('carousel', (data = new Carousel(this, options)))
1439 | if (typeof option == 'number') data.to(option)
1440 | else if (typeof option == 'string' || (option = options.slide)) data[option]()
1441 | else data.cycle()
1442 | })
1443 | }
1444 |
1445 | $.fn.carousel.defaults = {
1446 | interval: 5000
1447 | , pause: 'hover'
1448 | }
1449 |
1450 | $.fn.carousel.Constructor = Carousel
1451 |
1452 |
1453 | /* CAROUSEL DATA-API
1454 | * ================= */
1455 |
1456 | $(function () {
1457 | $('body').on('click.carousel.data-api', '[data-slide]', function ( e ) {
1458 | var $this = $(this), href
1459 | , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
1460 | , options = !$target.data('modal') && $.extend({}, $target.data(), $this.data())
1461 | $target.carousel(options)
1462 | e.preventDefault()
1463 | })
1464 | })
1465 |
1466 | }( window.jQuery );
1467 | /* =============================================================
1468 | * bootstrap-typeahead.js v2.0.2
1469 | * http://twitter.github.com/bootstrap/javascript.html#typeahead
1470 | * =============================================================
1471 | * Copyright 2012 Twitter, Inc.
1472 | *
1473 | * Licensed under the Apache License, Version 2.0 (the "License");
1474 | * you may not use this file except in compliance with the License.
1475 | * You may obtain a copy of the License at
1476 | *
1477 | * http://www.apache.org/licenses/LICENSE-2.0
1478 | *
1479 | * Unless required by applicable law or agreed to in writing, software
1480 | * distributed under the License is distributed on an "AS IS" BASIS,
1481 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1482 | * See the License for the specific language governing permissions and
1483 | * limitations under the License.
1484 | * ============================================================ */
1485 |
1486 | !function( $ ){
1487 |
1488 | "use strict"
1489 |
1490 | var Typeahead = function ( element, options ) {
1491 | this.$element = $(element)
1492 | this.options = $.extend({}, $.fn.typeahead.defaults, options)
1493 | this.matcher = this.options.matcher || this.matcher
1494 | this.sorter = this.options.sorter || this.sorter
1495 | this.highlighter = this.options.highlighter || this.highlighter
1496 | this.$menu = $(this.options.menu).appendTo('body')
1497 | this.source = this.options.source
1498 | this.shown = false
1499 | this.listen()
1500 | }
1501 |
1502 | Typeahead.prototype = {
1503 |
1504 | constructor: Typeahead
1505 |
1506 | , select: function () {
1507 | var val = this.$menu.find('.active').attr('data-value')
1508 | this.$element.val(val)
1509 | this.$element.change();
1510 | return this.hide()
1511 | }
1512 |
1513 | , show: function () {
1514 | var pos = $.extend({}, this.$element.offset(), {
1515 | height: this.$element[0].offsetHeight
1516 | })
1517 |
1518 | this.$menu.css({
1519 | top: pos.top + pos.height
1520 | , left: pos.left
1521 | })
1522 |
1523 | this.$menu.show()
1524 | this.shown = true
1525 | return this
1526 | }
1527 |
1528 | , hide: function () {
1529 | this.$menu.hide()
1530 | this.shown = false
1531 | return this
1532 | }
1533 |
1534 | , lookup: function (event) {
1535 | var that = this
1536 | , items
1537 | , q
1538 |
1539 | this.query = this.$element.val()
1540 |
1541 | if (!this.query) {
1542 | return this.shown ? this.hide() : this
1543 | }
1544 |
1545 | items = $.grep(this.source, function (item) {
1546 | if (that.matcher(item)) return item
1547 | })
1548 |
1549 | items = this.sorter(items)
1550 |
1551 | if (!items.length) {
1552 | return this.shown ? this.hide() : this
1553 | }
1554 |
1555 | return this.render(items.slice(0, this.options.items)).show()
1556 | }
1557 |
1558 | , matcher: function (item) {
1559 | return ~item.toLowerCase().indexOf(this.query.toLowerCase())
1560 | }
1561 |
1562 | , sorter: function (items) {
1563 | var beginswith = []
1564 | , caseSensitive = []
1565 | , caseInsensitive = []
1566 | , item
1567 |
1568 | while (item = items.shift()) {
1569 | if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item)
1570 | else if (~item.indexOf(this.query)) caseSensitive.push(item)
1571 | else caseInsensitive.push(item)
1572 | }
1573 |
1574 | return beginswith.concat(caseSensitive, caseInsensitive)
1575 | }
1576 |
1577 | , highlighter: function (item) {
1578 | return item.replace(new RegExp('(' + this.query + ')', 'ig'), function ($1, match) {
1579 | return '' + match + ''
1580 | })
1581 | }
1582 |
1583 | , render: function (items) {
1584 | var that = this
1585 |
1586 | items = $(items).map(function (i, item) {
1587 | i = $(that.options.item).attr('data-value', item)
1588 | i.find('a').html(that.highlighter(item))
1589 | return i[0]
1590 | })
1591 |
1592 | items.first().addClass('active')
1593 | this.$menu.html(items)
1594 | return this
1595 | }
1596 |
1597 | , next: function (event) {
1598 | var active = this.$menu.find('.active').removeClass('active')
1599 | , next = active.next()
1600 |
1601 | if (!next.length) {
1602 | next = $(this.$menu.find('li')[0])
1603 | }
1604 |
1605 | next.addClass('active')
1606 | }
1607 |
1608 | , prev: function (event) {
1609 | var active = this.$menu.find('.active').removeClass('active')
1610 | , prev = active.prev()
1611 |
1612 | if (!prev.length) {
1613 | prev = this.$menu.find('li').last()
1614 | }
1615 |
1616 | prev.addClass('active')
1617 | }
1618 |
1619 | , listen: function () {
1620 | this.$element
1621 | .on('blur', $.proxy(this.blur, this))
1622 | .on('keypress', $.proxy(this.keypress, this))
1623 | .on('keyup', $.proxy(this.keyup, this))
1624 |
1625 | if ($.browser.webkit || $.browser.msie) {
1626 | this.$element.on('keydown', $.proxy(this.keypress, this))
1627 | }
1628 |
1629 | this.$menu
1630 | .on('click', $.proxy(this.click, this))
1631 | .on('mouseenter', 'li', $.proxy(this.mouseenter, this))
1632 | }
1633 |
1634 | , keyup: function (e) {
1635 | switch(e.keyCode) {
1636 | case 40: // down arrow
1637 | case 38: // up arrow
1638 | break
1639 |
1640 | case 9: // tab
1641 | case 13: // enter
1642 | if (!this.shown) return
1643 | this.select()
1644 | break
1645 |
1646 | case 27: // escape
1647 | if (!this.shown) return
1648 | this.hide()
1649 | break
1650 |
1651 | default:
1652 | this.lookup()
1653 | }
1654 |
1655 | e.stopPropagation()
1656 | e.preventDefault()
1657 | }
1658 |
1659 | , keypress: function (e) {
1660 | if (!this.shown) return
1661 |
1662 | switch(e.keyCode) {
1663 | case 9: // tab
1664 | case 13: // enter
1665 | case 27: // escape
1666 | e.preventDefault()
1667 | break
1668 |
1669 | case 38: // up arrow
1670 | e.preventDefault()
1671 | this.prev()
1672 | break
1673 |
1674 | case 40: // down arrow
1675 | e.preventDefault()
1676 | this.next()
1677 | break
1678 | }
1679 |
1680 | e.stopPropagation()
1681 | }
1682 |
1683 | , blur: function (e) {
1684 | var that = this
1685 | setTimeout(function () { that.hide() }, 150)
1686 | }
1687 |
1688 | , click: function (e) {
1689 | e.stopPropagation()
1690 | e.preventDefault()
1691 | this.select()
1692 | }
1693 |
1694 | , mouseenter: function (e) {
1695 | this.$menu.find('.active').removeClass('active')
1696 | $(e.currentTarget).addClass('active')
1697 | }
1698 |
1699 | }
1700 |
1701 |
1702 | /* TYPEAHEAD PLUGIN DEFINITION
1703 | * =========================== */
1704 |
1705 | $.fn.typeahead = function ( option ) {
1706 | return this.each(function () {
1707 | var $this = $(this)
1708 | , data = $this.data('typeahead')
1709 | , options = typeof option == 'object' && option
1710 | if (!data) $this.data('typeahead', (data = new Typeahead(this, options)))
1711 | if (typeof option == 'string') data[option]()
1712 | })
1713 | }
1714 |
1715 | $.fn.typeahead.defaults = {
1716 | source: []
1717 | , items: 8
1718 | , menu: ''
1719 | , item: ''
1720 | }
1721 |
1722 | $.fn.typeahead.Constructor = Typeahead
1723 |
1724 |
1725 | /* TYPEAHEAD DATA-API
1726 | * ================== */
1727 |
1728 | $(function () {
1729 | $('body').on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) {
1730 | var $this = $(this)
1731 | if ($this.data('typeahead')) return
1732 | e.preventDefault()
1733 | $this.typeahead($this.data())
1734 | })
1735 | })
1736 |
1737 | }( window.jQuery );
--------------------------------------------------------------------------------
/static/css/bootstrap.min.css:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap v2.0.2
3 | *
4 | * Copyright 2012 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 | */
10 | .clearfix{*zoom:1;}.clearfix:before,.clearfix:after{display:table;content:"";}
11 | .clearfix:after{clear:both;}
12 | .hide-text{overflow:hidden;text-indent:100%;white-space:nowrap;}
13 | .input-block-level{display:block;width:100%;min-height:28px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;}
14 | article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;}
15 | audio,canvas,video{display:inline-block;*display:inline;*zoom:1;}
16 | audio:not([controls]){display:none;}
17 | html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;}
18 | a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
19 | a:hover,a:active{outline:0;}
20 | sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline;}
21 | sup{top:-0.5em;}
22 | sub{bottom:-0.25em;}
23 | img{height:auto;border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;}
24 | button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle;}
25 | button,input{*overflow:visible;line-height:normal;}
26 | button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0;}
27 | button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;}
28 | input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;}
29 | input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none;}
30 | textarea{overflow:auto;vertical-align:top;}
31 | body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;color:#333333;background-color:#ffffff;}
32 | a{color:#0088cc;text-decoration:none;}
33 | a:hover{color:#005580;text-decoration:underline;}
34 | .row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";}
35 | .row:after{clear:both;}
36 | [class*="span"]{float:left;margin-left:20px;}
37 | .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px;}
38 | .span12{width:940px;}
39 | .span11{width:860px;}
40 | .span10{width:780px;}
41 | .span9{width:700px;}
42 | .span8{width:620px;}
43 | .span7{width:540px;}
44 | .span6{width:460px;}
45 | .span5{width:380px;}
46 | .span4{width:300px;}
47 | .span3{width:220px;}
48 | .span2{width:140px;}
49 | .span1{width:60px;}
50 | .offset12{margin-left:980px;}
51 | .offset11{margin-left:900px;}
52 | .offset10{margin-left:820px;}
53 | .offset9{margin-left:740px;}
54 | .offset8{margin-left:660px;}
55 | .offset7{margin-left:580px;}
56 | .offset6{margin-left:500px;}
57 | .offset5{margin-left:420px;}
58 | .offset4{margin-left:340px;}
59 | .offset3{margin-left:260px;}
60 | .offset2{margin-left:180px;}
61 | .offset1{margin-left:100px;}
62 | .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";}
63 | .row-fluid:after{clear:both;}
64 | .row-fluid>[class*="span"]{float:left;margin-left:2.127659574%;}
65 | .row-fluid>[class*="span"]:first-child{margin-left:0;}
66 | .row-fluid > .span12{width:99.99999998999999%;}
67 | .row-fluid > .span11{width:91.489361693%;}
68 | .row-fluid > .span10{width:82.97872339599999%;}
69 | .row-fluid > .span9{width:74.468085099%;}
70 | .row-fluid > .span8{width:65.95744680199999%;}
71 | .row-fluid > .span7{width:57.446808505%;}
72 | .row-fluid > .span6{width:48.93617020799999%;}
73 | .row-fluid > .span5{width:40.425531911%;}
74 | .row-fluid > .span4{width:31.914893614%;}
75 | .row-fluid > .span3{width:23.404255317%;}
76 | .row-fluid > .span2{width:14.89361702%;}
77 | .row-fluid > .span1{width:6.382978723%;}
78 | .container{margin-left:auto;margin-right:auto;*zoom:1;}.container:before,.container:after{display:table;content:"";}
79 | .container:after{clear:both;}
80 | .container-fluid{padding-left:20px;padding-right:20px;*zoom:1;}.container-fluid:before,.container-fluid:after{display:table;content:"";}
81 | .container-fluid:after{clear:both;}
82 | p{margin:0 0 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;}p small{font-size:11px;color:#999999;}
83 | .lead{margin-bottom:18px;font-size:20px;font-weight:200;line-height:27px;}
84 | h1,h2,h3,h4,h5,h6{margin:0;font-family:inherit;font-weight:bold;color:inherit;text-rendering:optimizelegibility;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;color:#999999;}
85 | h1{font-size:30px;line-height:36px;}h1 small{font-size:18px;}
86 | h2{font-size:24px;line-height:36px;}h2 small{font-size:18px;}
87 | h3{line-height:27px;font-size:18px;}h3 small{font-size:14px;}
88 | h4,h5,h6{line-height:18px;}
89 | h4{font-size:14px;}h4 small{font-size:12px;}
90 | h5{font-size:12px;}
91 | h6{font-size:11px;color:#999999;text-transform:uppercase;}
92 | .page-header{padding-bottom:17px;margin:18px 0;border-bottom:1px solid #eeeeee;}
93 | .page-header h1{line-height:1;}
94 | ul,ol{padding:0;margin:0 0 9px 25px;}
95 | ul ul,ul ol,ol ol,ol ul{margin-bottom:0;}
96 | ul{list-style:disc;}
97 | ol{list-style:decimal;}
98 | li{line-height:18px;}
99 | ul.unstyled,ol.unstyled{margin-left:0;list-style:none;}
100 | dl{margin-bottom:18px;}
101 | dt,dd{line-height:18px;}
102 | dt{font-weight:bold;line-height:17px;}
103 | dd{margin-left:9px;}
104 | .dl-horizontal dt{float:left;clear:left;width:120px;text-align:right;}
105 | .dl-horizontal dd{margin-left:130px;}
106 | hr{margin:18px 0;border:0;border-top:1px solid #eeeeee;border-bottom:1px solid #ffffff;}
107 | strong{font-weight:bold;}
108 | em{font-style:italic;}
109 | .muted{color:#999999;}
110 | abbr[title]{border-bottom:1px dotted #ddd;cursor:help;}
111 | abbr.initialism{font-size:90%;text-transform:uppercase;}
112 | blockquote{padding:0 0 0 15px;margin:0 0 18px;border-left:5px solid #eeeeee;}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:22.5px;}
113 | blockquote small{display:block;line-height:18px;color:#999999;}blockquote small:before{content:'\2014 \00A0';}
114 | blockquote.pull-right{float:right;padding-left:0;padding-right:15px;border-left:0;border-right:5px solid #eeeeee;}blockquote.pull-right p,blockquote.pull-right small{text-align:right;}
115 | q:before,q:after,blockquote:before,blockquote:after{content:"";}
116 | address{display:block;margin-bottom:18px;line-height:18px;font-style:normal;}
117 | small{font-size:100%;}
118 | cite{font-style:normal;}
119 | code,pre{padding:0 3px 2px;font-family:Menlo,Monaco,"Courier New",monospace;font-size:12px;color:#333333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
120 | code{padding:2px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8;}
121 | pre{display:block;padding:8.5px;margin:0 0 9px;font-size:12.025px;line-height:18px;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;white-space:pre;white-space:pre-wrap;word-break:break-all;word-wrap:break-word;}pre.prettyprint{margin-bottom:18px;}
122 | pre code{padding:0;color:inherit;background-color:transparent;border:0;}
123 | .pre-scrollable{max-height:340px;overflow-y:scroll;}
124 | .label{padding:1px 4px 2px;font-size:10.998px;font-weight:bold;line-height:13px;color:#ffffff;vertical-align:middle;white-space:nowrap;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#999999;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
125 | .label:hover{color:#ffffff;text-decoration:none;}
126 | .label-important{background-color:#b94a48;}
127 | .label-important:hover{background-color:#953b39;}
128 | .label-warning{background-color:#f89406;}
129 | .label-warning:hover{background-color:#c67605;}
130 | .label-success{background-color:#468847;}
131 | .label-success:hover{background-color:#356635;}
132 | .label-info{background-color:#3a87ad;}
133 | .label-info:hover{background-color:#2d6987;}
134 | .label-inverse{background-color:#333333;}
135 | .label-inverse:hover{background-color:#1a1a1a;}
136 | .badge{padding:1px 9px 2px;font-size:12.025px;font-weight:bold;white-space:nowrap;color:#ffffff;background-color:#999999;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px;}
137 | .badge:hover{color:#ffffff;text-decoration:none;cursor:pointer;}
138 | .badge-error{background-color:#b94a48;}
139 | .badge-error:hover{background-color:#953b39;}
140 | .badge-warning{background-color:#f89406;}
141 | .badge-warning:hover{background-color:#c67605;}
142 | .badge-success{background-color:#468847;}
143 | .badge-success:hover{background-color:#356635;}
144 | .badge-info{background-color:#3a87ad;}
145 | .badge-info:hover{background-color:#2d6987;}
146 | .badge-inverse{background-color:#333333;}
147 | .badge-inverse:hover{background-color:#1a1a1a;}
148 | table{max-width:100%;border-collapse:collapse;border-spacing:0;background-color:transparent;}
149 | .table{width:100%;margin-bottom:18px;}.table th,.table td{padding:8px;line-height:18px;text-align:left;vertical-align:top;border-top:1px solid #dddddd;}
150 | .table th{font-weight:bold;}
151 | .table thead th{vertical-align:bottom;}
152 | .table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0;}
153 | .table tbody+tbody{border-top:2px solid #dddddd;}
154 | .table-condensed th,.table-condensed td{padding:4px 5px;}
155 | .table-bordered{border:1px solid #dddddd;border-left:0;border-collapse:separate;*border-collapse:collapsed;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.table-bordered th,.table-bordered td{border-left:1px solid #dddddd;}
156 | .table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0;}
157 | .table-bordered thead:first-child tr:first-child th:first-child,.table-bordered tbody:first-child 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;}
158 | .table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child 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;}
159 | .table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child 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;}
160 | .table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child 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;}
161 | .table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9;}
162 | .table tbody tr:hover td,.table tbody tr:hover th{background-color:#f5f5f5;}
163 | table .span1{float:none;width:44px;margin-left:0;}
164 | table .span2{float:none;width:124px;margin-left:0;}
165 | table .span3{float:none;width:204px;margin-left:0;}
166 | table .span4{float:none;width:284px;margin-left:0;}
167 | table .span5{float:none;width:364px;margin-left:0;}
168 | table .span6{float:none;width:444px;margin-left:0;}
169 | table .span7{float:none;width:524px;margin-left:0;}
170 | table .span8{float:none;width:604px;margin-left:0;}
171 | table .span9{float:none;width:684px;margin-left:0;}
172 | table .span10{float:none;width:764px;margin-left:0;}
173 | table .span11{float:none;width:844px;margin-left:0;}
174 | table .span12{float:none;width:924px;margin-left:0;}
175 | table .span13{float:none;width:1004px;margin-left:0;}
176 | table .span14{float:none;width:1084px;margin-left:0;}
177 | table .span15{float:none;width:1164px;margin-left:0;}
178 | table .span16{float:none;width:1244px;margin-left:0;}
179 | table .span17{float:none;width:1324px;margin-left:0;}
180 | table .span18{float:none;width:1404px;margin-left:0;}
181 | table .span19{float:none;width:1484px;margin-left:0;}
182 | table .span20{float:none;width:1564px;margin-left:0;}
183 | table .span21{float:none;width:1644px;margin-left:0;}
184 | table .span22{float:none;width:1724px;margin-left:0;}
185 | table .span23{float:none;width:1804px;margin-left:0;}
186 | table .span24{float:none;width:1884px;margin-left:0;}
187 | form{margin:0 0 18px;}
188 | fieldset{padding:0;margin:0;border:0;}
189 | legend{display:block;width:100%;padding:0;margin-bottom:27px;font-size:19.5px;line-height:36px;color:#333333;border:0;border-bottom:1px solid #eee;}legend small{font-size:13.5px;color:#999999;}
190 | label,input,button,select,textarea{font-size:13px;font-weight:normal;line-height:18px;}
191 | input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;}
192 | label{display:block;margin-bottom:5px;color:#333333;}
193 | input,textarea,select,.uneditable-input{display:inline-block;width:210px;height:18px;padding:4px;margin-bottom:9px;font-size:13px;line-height:18px;color:#555555;border:1px solid #cccccc;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
194 | .uneditable-textarea{width:auto;height:auto;}
195 | label input,label textarea,label select{display:block;}
196 | input[type="image"],input[type="checkbox"],input[type="radio"]{width:auto;height:auto;padding:0;margin:3px 0;*margin-top:0;line-height:normal;cursor:pointer;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;border:0 \9;}
197 | input[type="image"]{border:0;}
198 | input[type="file"]{width:auto;padding:initial;line-height:initial;border:initial;background-color:#ffffff;background-color:initial;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
199 | input[type="button"],input[type="reset"],input[type="submit"]{width:auto;height:auto;}
200 | select,input[type="file"]{height:28px;*margin-top:4px;line-height:28px;}
201 | input[type="file"]{line-height:18px \9;}
202 | select{width:220px;background-color:#ffffff;}
203 | select[multiple],select[size]{height:auto;}
204 | input[type="image"]{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
205 | textarea{height:auto;}
206 | input[type="hidden"]{display:none;}
207 | .radio,.checkbox{padding-left:18px;}
208 | .radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-18px;}
209 | .controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px;}
210 | .radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle;}
211 | .radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px;}
212 | input,textarea{-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-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;}
213 | input:focus,textarea:focus{border-color:rgba(82, 168, 236, 0.8);-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);outline:0;outline:thin dotted \9;}
214 | input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus,select:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
215 | .input-mini{width:60px;}
216 | .input-small{width:90px;}
217 | .input-medium{width:150px;}
218 | .input-large{width:210px;}
219 | .input-xlarge{width:270px;}
220 | .input-xxlarge{width:530px;}
221 | input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{float:none;margin-left:0;}
222 | input,textarea,.uneditable-input{margin-left:0;}
223 | input.span12, textarea.span12, .uneditable-input.span12{width:930px;}
224 | input.span11, textarea.span11, .uneditable-input.span11{width:850px;}
225 | input.span10, textarea.span10, .uneditable-input.span10{width:770px;}
226 | input.span9, textarea.span9, .uneditable-input.span9{width:690px;}
227 | input.span8, textarea.span8, .uneditable-input.span8{width:610px;}
228 | input.span7, textarea.span7, .uneditable-input.span7{width:530px;}
229 | input.span6, textarea.span6, .uneditable-input.span6{width:450px;}
230 | input.span5, textarea.span5, .uneditable-input.span5{width:370px;}
231 | input.span4, textarea.span4, .uneditable-input.span4{width:290px;}
232 | input.span3, textarea.span3, .uneditable-input.span3{width:210px;}
233 | input.span2, textarea.span2, .uneditable-input.span2{width:130px;}
234 | input.span1, textarea.span1, .uneditable-input.span1{width:50px;}
235 | input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{background-color:#eeeeee;border-color:#ddd;cursor:not-allowed;}
236 | .control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853;}
237 | .control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;border-color:#c09853;}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:0 0 6px #dbc59e;-moz-box-shadow:0 0 6px #dbc59e;box-shadow:0 0 6px #dbc59e;}
238 | .control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853;}
239 | .control-group.error>label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48;}
240 | .control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;border-color:#b94a48;}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:0 0 6px #d59392;-moz-box-shadow:0 0 6px #d59392;box-shadow:0 0 6px #d59392;}
241 | .control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48;}
242 | .control-group.success>label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847;}
243 | .control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;border-color:#468847;}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:0 0 6px #7aba7b;-moz-box-shadow:0 0 6px #7aba7b;box-shadow:0 0 6px #7aba7b;}
244 | .control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847;}
245 | input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid{color:#b94a48;border-color:#ee5f5b;}input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7;}
246 | .form-actions{padding:17px 20px 18px;margin-top:18px;margin-bottom:18px;background-color:#eeeeee;border-top:1px solid #ddd;*zoom:1;}.form-actions:before,.form-actions:after{display:table;content:"";}
247 | .form-actions:after{clear:both;}
248 | .uneditable-input{display:block;background-color:#ffffff;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;}
249 | :-moz-placeholder{color:#999999;}
250 | ::-webkit-input-placeholder{color:#999999;}
251 | .help-block,.help-inline{color:#555555;}
252 | .help-block{display:block;margin-bottom:9px;}
253 | .help-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding-left:5px;}
254 | .input-prepend,.input-append{margin-bottom:5px;}.input-prepend input,.input-append input,.input-prepend select,.input-append select,.input-prepend .uneditable-input,.input-append .uneditable-input{*margin-left:0;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}.input-prepend input:focus,.input-append input:focus,.input-prepend select:focus,.input-append select:focus,.input-prepend .uneditable-input:focus,.input-append .uneditable-input:focus{position:relative;z-index:2;}
255 | .input-prepend .uneditable-input,.input-append .uneditable-input{border-left-color:#ccc;}
256 | .input-prepend .add-on,.input-append .add-on{display:inline-block;width:auto;min-width:16px;height:18px;padding:4px 5px;font-weight:normal;line-height:18px;text-align:center;text-shadow:0 1px 0 #ffffff;vertical-align:middle;background-color:#eeeeee;border:1px solid #ccc;}
257 | .input-prepend .add-on,.input-append .add-on,.input-prepend .btn,.input-append .btn{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
258 | .input-prepend .active,.input-append .active{background-color:#a9dba9;border-color:#46a546;}
259 | .input-prepend .add-on,.input-prepend .btn{margin-right:-1px;}
260 | .input-append input,.input-append select .uneditable-input{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
261 | .input-append .uneditable-input{border-left-color:#eee;border-right-color:#ccc;}
262 | .input-append .add-on,.input-append .btn{margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}
263 | .input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
264 | .input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
265 | .input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}
266 | .search-query{padding-left:14px;padding-right:14px;margin-bottom:0;-webkit-border-radius:14px;-moz-border-radius:14px;border-radius:14px;}
267 | .form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;margin-bottom:0;}
268 | .form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none;}
269 | .form-search label,.form-inline label{display:inline-block;}
270 | .form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0;}
271 | .form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle;}
272 | .form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-left:0;margin-right:3px;}
273 | .control-group{margin-bottom:9px;}
274 | legend+.control-group{margin-top:18px;-webkit-margin-top-collapse:separate;}
275 | .form-horizontal .control-group{margin-bottom:18px;*zoom:1;}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:"";}
276 | .form-horizontal .control-group:after{clear:both;}
277 | .form-horizontal .control-label{float:left;width:140px;padding-top:5px;text-align:right;}
278 | .form-horizontal .controls{margin-left:160px;*display:inline-block;*margin-left:0;*padding-left:20px;}
279 | .form-horizontal .help-block{margin-top:9px;margin-bottom:0;}
280 | .form-horizontal .form-actions{padding-left:160px;}
281 | .btn{display:inline-block;*display:inline;*zoom:1;padding:4px 10px 4px;margin-bottom:0;font-size:13px;line-height:18px;color:#333333;text-align:center;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);vertical-align:middle;background-color:#f5f5f5;background-image:-moz-linear-gradient(top, #ffffff, #e6e6e6);background-image:-ms-linear-gradient(top, #ffffff, #e6e6e6);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(top, #ffffff, #e6e6e6);background-image:-o-linear-gradient(top, #ffffff, #e6e6e6);background-image:linear-gradient(top, #ffffff, #e6e6e6);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:dximagetransform.microsoft.gradient(enabled=false);border:1px solid #cccccc;border-bottom-color:#b3b3b3;-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);cursor:pointer;*margin-left:.3em;}.btn:hover,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{background-color:#e6e6e6;}
282 | .btn:active,.btn.active{background-color:#cccccc \9;}
283 | .btn:first-child{*margin-left:0;}
284 | .btn:hover{color:#333333;text-decoration:none;background-color:#e6e6e6;background-position:0 -15px;-webkit-transition:background-position 0.1s linear;-moz-transition:background-position 0.1s linear;-ms-transition:background-position 0.1s linear;-o-transition:background-position 0.1s linear;transition:background-position 0.1s linear;}
285 | .btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
286 | .btn.active,.btn:active{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);background-color:#e6e6e6;background-color:#d9d9d9 \9;outline:0;}
287 | .btn.disabled,.btn[disabled]{cursor:default;background-image:none;background-color:#e6e6e6;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
288 | .btn-large{padding:9px 14px;font-size:15px;line-height:normal;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;}
289 | .btn-large [class^="icon-"]{margin-top:1px;}
290 | .btn-small{padding:5px 9px;font-size:11px;line-height:16px;}
291 | .btn-small [class^="icon-"]{margin-top:-1px;}
292 | .btn-mini{padding:2px 6px;font-size:11px;line-height:14px;}
293 | .btn-primary,.btn-primary:hover,.btn-warning,.btn-warning:hover,.btn-danger,.btn-danger:hover,.btn-success,.btn-success:hover,.btn-info,.btn-info:hover,.btn-inverse,.btn-inverse:hover{text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);color:#ffffff;}
294 | .btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255, 255, 255, 0.75);}
295 | .btn-primary{background-color:#0074cc;background-image:-moz-linear-gradient(top, #0088cc, #0055cc);background-image:-ms-linear-gradient(top, #0088cc, #0055cc);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0055cc));background-image:-webkit-linear-gradient(top, #0088cc, #0055cc);background-image:-o-linear-gradient(top, #0088cc, #0055cc);background-image:linear-gradient(top, #0088cc, #0055cc);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0055cc', GradientType=0);border-color:#0055cc #0055cc #003580;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:dximagetransform.microsoft.gradient(enabled=false);}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{background-color:#0055cc;}
296 | .btn-primary:active,.btn-primary.active{background-color:#004099 \9;}
297 | .btn-warning{background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-ms-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(top, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0);border-color:#f89406 #f89406 #ad6704;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:dximagetransform.microsoft.gradient(enabled=false);}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{background-color:#f89406;}
298 | .btn-warning:active,.btn-warning.active{background-color:#c67605 \9;}
299 | .btn-danger{background-color:#da4f49;background-image:-moz-linear-gradient(top, #ee5f5b, #bd362f);background-image:-ms-linear-gradient(top, #ee5f5b, #bd362f);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));background-image:-webkit-linear-gradient(top, #ee5f5b, #bd362f);background-image:-o-linear-gradient(top, #ee5f5b, #bd362f);background-image:linear-gradient(top, #ee5f5b, #bd362f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0);border-color:#bd362f #bd362f #802420;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:dximagetransform.microsoft.gradient(enabled=false);}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{background-color:#bd362f;}
300 | .btn-danger:active,.btn-danger.active{background-color:#942a25 \9;}
301 | .btn-success{background-color:#5bb75b;background-image:-moz-linear-gradient(top, #62c462, #51a351);background-image:-ms-linear-gradient(top, #62c462, #51a351);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));background-image:-webkit-linear-gradient(top, #62c462, #51a351);background-image:-o-linear-gradient(top, #62c462, #51a351);background-image:linear-gradient(top, #62c462, #51a351);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0);border-color:#51a351 #51a351 #387038;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:dximagetransform.microsoft.gradient(enabled=false);}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{background-color:#51a351;}
302 | .btn-success:active,.btn-success.active{background-color:#408140 \9;}
303 | .btn-info{background-color:#49afcd;background-image:-moz-linear-gradient(top, #5bc0de, #2f96b4);background-image:-ms-linear-gradient(top, #5bc0de, #2f96b4);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));background-image:-webkit-linear-gradient(top, #5bc0de, #2f96b4);background-image:-o-linear-gradient(top, #5bc0de, #2f96b4);background-image:linear-gradient(top, #5bc0de, #2f96b4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0);border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:dximagetransform.microsoft.gradient(enabled=false);}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{background-color:#2f96b4;}
304 | .btn-info:active,.btn-info.active{background-color:#24748c \9;}
305 | .btn-inverse{background-color:#414141;background-image:-moz-linear-gradient(top, #555555, #222222);background-image:-ms-linear-gradient(top, #555555, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#555555), to(#222222));background-image:-webkit-linear-gradient(top, #555555, #222222);background-image:-o-linear-gradient(top, #555555, #222222);background-image:linear-gradient(top, #555555, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#555555', endColorstr='#222222', GradientType=0);border-color:#222222 #222222 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:dximagetransform.microsoft.gradient(enabled=false);}.btn-inverse:hover,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{background-color:#222222;}
306 | .btn-inverse:active,.btn-inverse.active{background-color:#080808 \9;}
307 | button.btn,input[type="submit"].btn{*padding-top:2px;*padding-bottom:2px;}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0;}
308 | button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px;}
309 | button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px;}
310 | button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px;}
311 | [class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat;*margin-right:.3em;}[class^="icon-"]:last-child,[class*=" icon-"]:last-child{*margin-left:0;}
312 | .icon-white{background-image:url("../img/glyphicons-halflings-white.png");}
313 | .icon-glass{background-position:0 0;}
314 | .icon-music{background-position:-24px 0;}
315 | .icon-search{background-position:-48px 0;}
316 | .icon-envelope{background-position:-72px 0;}
317 | .icon-heart{background-position:-96px 0;}
318 | .icon-star{background-position:-120px 0;}
319 | .icon-star-empty{background-position:-144px 0;}
320 | .icon-user{background-position:-168px 0;}
321 | .icon-film{background-position:-192px 0;}
322 | .icon-th-large{background-position:-216px 0;}
323 | .icon-th{background-position:-240px 0;}
324 | .icon-th-list{background-position:-264px 0;}
325 | .icon-ok{background-position:-288px 0;}
326 | .icon-remove{background-position:-312px 0;}
327 | .icon-zoom-in{background-position:-336px 0;}
328 | .icon-zoom-out{background-position:-360px 0;}
329 | .icon-off{background-position:-384px 0;}
330 | .icon-signal{background-position:-408px 0;}
331 | .icon-cog{background-position:-432px 0;}
332 | .icon-trash{background-position:-456px 0;}
333 | .icon-home{background-position:0 -24px;}
334 | .icon-file{background-position:-24px -24px;}
335 | .icon-time{background-position:-48px -24px;}
336 | .icon-road{background-position:-72px -24px;}
337 | .icon-download-alt{background-position:-96px -24px;}
338 | .icon-download{background-position:-120px -24px;}
339 | .icon-upload{background-position:-144px -24px;}
340 | .icon-inbox{background-position:-168px -24px;}
341 | .icon-play-circle{background-position:-192px -24px;}
342 | .icon-repeat{background-position:-216px -24px;}
343 | .icon-refresh{background-position:-240px -24px;}
344 | .icon-list-alt{background-position:-264px -24px;}
345 | .icon-lock{background-position:-287px -24px;}
346 | .icon-flag{background-position:-312px -24px;}
347 | .icon-headphones{background-position:-336px -24px;}
348 | .icon-volume-off{background-position:-360px -24px;}
349 | .icon-volume-down{background-position:-384px -24px;}
350 | .icon-volume-up{background-position:-408px -24px;}
351 | .icon-qrcode{background-position:-432px -24px;}
352 | .icon-barcode{background-position:-456px -24px;}
353 | .icon-tag{background-position:0 -48px;}
354 | .icon-tags{background-position:-25px -48px;}
355 | .icon-book{background-position:-48px -48px;}
356 | .icon-bookmark{background-position:-72px -48px;}
357 | .icon-print{background-position:-96px -48px;}
358 | .icon-camera{background-position:-120px -48px;}
359 | .icon-font{background-position:-144px -48px;}
360 | .icon-bold{background-position:-167px -48px;}
361 | .icon-italic{background-position:-192px -48px;}
362 | .icon-text-height{background-position:-216px -48px;}
363 | .icon-text-width{background-position:-240px -48px;}
364 | .icon-align-left{background-position:-264px -48px;}
365 | .icon-align-center{background-position:-288px -48px;}
366 | .icon-align-right{background-position:-312px -48px;}
367 | .icon-align-justify{background-position:-336px -48px;}
368 | .icon-list{background-position:-360px -48px;}
369 | .icon-indent-left{background-position:-384px -48px;}
370 | .icon-indent-right{background-position:-408px -48px;}
371 | .icon-facetime-video{background-position:-432px -48px;}
372 | .icon-picture{background-position:-456px -48px;}
373 | .icon-pencil{background-position:0 -72px;}
374 | .icon-map-marker{background-position:-24px -72px;}
375 | .icon-adjust{background-position:-48px -72px;}
376 | .icon-tint{background-position:-72px -72px;}
377 | .icon-edit{background-position:-96px -72px;}
378 | .icon-share{background-position:-120px -72px;}
379 | .icon-check{background-position:-144px -72px;}
380 | .icon-move{background-position:-168px -72px;}
381 | .icon-step-backward{background-position:-192px -72px;}
382 | .icon-fast-backward{background-position:-216px -72px;}
383 | .icon-backward{background-position:-240px -72px;}
384 | .icon-play{background-position:-264px -72px;}
385 | .icon-pause{background-position:-288px -72px;}
386 | .icon-stop{background-position:-312px -72px;}
387 | .icon-forward{background-position:-336px -72px;}
388 | .icon-fast-forward{background-position:-360px -72px;}
389 | .icon-step-forward{background-position:-384px -72px;}
390 | .icon-eject{background-position:-408px -72px;}
391 | .icon-chevron-left{background-position:-432px -72px;}
392 | .icon-chevron-right{background-position:-456px -72px;}
393 | .icon-plus-sign{background-position:0 -96px;}
394 | .icon-minus-sign{background-position:-24px -96px;}
395 | .icon-remove-sign{background-position:-48px -96px;}
396 | .icon-ok-sign{background-position:-72px -96px;}
397 | .icon-question-sign{background-position:-96px -96px;}
398 | .icon-info-sign{background-position:-120px -96px;}
399 | .icon-screenshot{background-position:-144px -96px;}
400 | .icon-remove-circle{background-position:-168px -96px;}
401 | .icon-ok-circle{background-position:-192px -96px;}
402 | .icon-ban-circle{background-position:-216px -96px;}
403 | .icon-arrow-left{background-position:-240px -96px;}
404 | .icon-arrow-right{background-position:-264px -96px;}
405 | .icon-arrow-up{background-position:-289px -96px;}
406 | .icon-arrow-down{background-position:-312px -96px;}
407 | .icon-share-alt{background-position:-336px -96px;}
408 | .icon-resize-full{background-position:-360px -96px;}
409 | .icon-resize-small{background-position:-384px -96px;}
410 | .icon-plus{background-position:-408px -96px;}
411 | .icon-minus{background-position:-433px -96px;}
412 | .icon-asterisk{background-position:-456px -96px;}
413 | .icon-exclamation-sign{background-position:0 -120px;}
414 | .icon-gift{background-position:-24px -120px;}
415 | .icon-leaf{background-position:-48px -120px;}
416 | .icon-fire{background-position:-72px -120px;}
417 | .icon-eye-open{background-position:-96px -120px;}
418 | .icon-eye-close{background-position:-120px -120px;}
419 | .icon-warning-sign{background-position:-144px -120px;}
420 | .icon-plane{background-position:-168px -120px;}
421 | .icon-calendar{background-position:-192px -120px;}
422 | .icon-random{background-position:-216px -120px;}
423 | .icon-comment{background-position:-240px -120px;}
424 | .icon-magnet{background-position:-264px -120px;}
425 | .icon-chevron-up{background-position:-288px -120px;}
426 | .icon-chevron-down{background-position:-313px -119px;}
427 | .icon-retweet{background-position:-336px -120px;}
428 | .icon-shopping-cart{background-position:-360px -120px;}
429 | .icon-folder-close{background-position:-384px -120px;}
430 | .icon-folder-open{background-position:-408px -120px;}
431 | .icon-resize-vertical{background-position:-432px -119px;}
432 | .icon-resize-horizontal{background-position:-456px -118px;}
433 | .btn-group{position:relative;*zoom:1;*margin-left:.3em;}.btn-group:before,.btn-group:after{display:table;content:"";}
434 | .btn-group:after{clear:both;}
435 | .btn-group:first-child{*margin-left:0;}
436 | .btn-group+.btn-group{margin-left:5px;}
437 | .btn-toolbar{margin-top:9px;margin-bottom:9px;}.btn-toolbar .btn-group{display:inline-block;*display:inline;*zoom:1;}
438 | .btn-group .btn{position:relative;float:left;margin-left:-1px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
439 | .btn-group .btn:first-child{margin-left:0;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;}
440 | .btn-group .btn:last-child,.btn-group .dropdown-toggle{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;}
441 | .btn-group .btn.large:first-child{margin-left:0;-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;}
442 | .btn-group .btn.large:last-child,.btn-group .large.dropdown-toggle{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;}
443 | .btn-group .btn:hover,.btn-group .btn:focus,.btn-group .btn:active,.btn-group .btn.active{z-index:2;}
444 | .btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0;}
445 | .btn-group .dropdown-toggle{padding-left:8px;padding-right:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);*padding-top:3px;*padding-bottom:3px;}
446 | .btn-group .btn-mini.dropdown-toggle{padding-left:5px;padding-right:5px;*padding-top:1px;*padding-bottom:1px;}
447 | .btn-group .btn-small.dropdown-toggle{*padding-top:4px;*padding-bottom:4px;}
448 | .btn-group .btn-large.dropdown-toggle{padding-left:12px;padding-right:12px;}
449 | .btn-group.open{*z-index:1000;}.btn-group.open .dropdown-menu{display:block;margin-top:1px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;}
450 | .btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);}
451 | .btn .caret{margin-top:7px;margin-left:0;}
452 | .btn:hover .caret,.open.btn-group .caret{opacity:1;filter:alpha(opacity=100);}
453 | .btn-mini .caret{margin-top:5px;}
454 | .btn-small .caret{margin-top:6px;}
455 | .btn-large .caret{margin-top:6px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;}
456 | .btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;opacity:0.75;filter:alpha(opacity=75);}
457 | .nav{margin-left:0;margin-bottom:18px;list-style:none;}
458 | .nav>li>a{display:block;}
459 | .nav>li>a:hover{text-decoration:none;background-color:#eeeeee;}
460 | .nav .nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:18px;color:#999999;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);text-transform:uppercase;}
461 | .nav li+.nav-header{margin-top:9px;}
462 | .nav-list{padding-left:15px;padding-right:15px;margin-bottom:0;}
463 | .nav-list>li>a,.nav-list .nav-header{margin-left:-15px;margin-right:-15px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);}
464 | .nav-list>li>a{padding:3px 15px;}
465 | .nav-list>.active>a,.nav-list>.active>a:hover{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.2);background-color:#0088cc;}
466 | .nav-list [class^="icon-"]{margin-right:2px;}
467 | .nav-list .divider{height:1px;margin:8px 1px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;*width:100%;*margin:-5px 0 5px;}
468 | .nav-tabs,.nav-pills{*zoom:1;}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;content:"";}
469 | .nav-tabs:after,.nav-pills:after{clear:both;}
470 | .nav-tabs>li,.nav-pills>li{float:left;}
471 | .nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px;}
472 | .nav-tabs{border-bottom:1px solid #ddd;}
473 | .nav-tabs>li{margin-bottom:-1px;}
474 | .nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:18px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #dddddd;}
475 | .nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555555;background-color:#ffffff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default;}
476 | .nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;}
477 | .nav-pills>.active>a,.nav-pills>.active>a:hover{color:#ffffff;background-color:#0088cc;}
478 | .nav-stacked>li{float:none;}
479 | .nav-stacked>li>a{margin-right:0;}
480 | .nav-tabs.nav-stacked{border-bottom:0;}
481 | .nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
482 | .nav-tabs.nav-stacked>li:first-child>a{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}
483 | .nav-tabs.nav-stacked>li:last-child>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}
484 | .nav-tabs.nav-stacked>li>a:hover{border-color:#ddd;z-index:2;}
485 | .nav-pills.nav-stacked>li>a{margin-bottom:3px;}
486 | .nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px;}
487 | .nav-tabs .dropdown-menu,.nav-pills .dropdown-menu{margin-top:1px;border-width:1px;}
488 | .nav-pills .dropdown-menu{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
489 | .nav-tabs .dropdown-toggle .caret,.nav-pills .dropdown-toggle .caret{border-top-color:#0088cc;border-bottom-color:#0088cc;margin-top:6px;}
490 | .nav-tabs .dropdown-toggle:hover .caret,.nav-pills .dropdown-toggle:hover .caret{border-top-color:#005580;border-bottom-color:#005580;}
491 | .nav-tabs .active .dropdown-toggle .caret,.nav-pills .active .dropdown-toggle .caret{border-top-color:#333333;border-bottom-color:#333333;}
492 | .nav>.dropdown.active>a:hover{color:#000000;cursor:pointer;}
493 | .nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>.open.active>a:hover{color:#ffffff;background-color:#999999;border-color:#999999;}
494 | .nav .open .caret,.nav .open.active .caret,.nav .open a:hover .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;opacity:1;filter:alpha(opacity=100);}
495 | .tabs-stacked .open>a:hover{border-color:#999999;}
496 | .tabbable{*zoom:1;}.tabbable:before,.tabbable:after{display:table;content:"";}
497 | .tabbable:after{clear:both;}
498 | .tab-content{display:table;width:100%;}
499 | .tabs-below .nav-tabs,.tabs-right .nav-tabs,.tabs-left .nav-tabs{border-bottom:0;}
500 | .tab-content>.tab-pane,.pill-content>.pill-pane{display:none;}
501 | .tab-content>.active,.pill-content>.active{display:block;}
502 | .tabs-below .nav-tabs{border-top:1px solid #ddd;}
503 | .tabs-below .nav-tabs>li{margin-top:-1px;margin-bottom:0;}
504 | .tabs-below .nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}.tabs-below .nav-tabs>li>a:hover{border-bottom-color:transparent;border-top-color:#ddd;}
505 | .tabs-below .nav-tabs .active>a,.tabs-below .nav-tabs .active>a:hover{border-color:transparent #ddd #ddd #ddd;}
506 | .tabs-left .nav-tabs>li,.tabs-right .nav-tabs>li{float:none;}
507 | .tabs-left .nav-tabs>li>a,.tabs-right .nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px;}
508 | .tabs-left .nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd;}
509 | .tabs-left .nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;}
510 | .tabs-left .nav-tabs>li>a:hover{border-color:#eeeeee #dddddd #eeeeee #eeeeee;}
511 | .tabs-left .nav-tabs .active>a,.tabs-left .nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#ffffff;}
512 | .tabs-right .nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd;}
513 | .tabs-right .nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;}
514 | .tabs-right .nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #eeeeee #dddddd;}
515 | .tabs-right .nav-tabs .active>a,.tabs-right .nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#ffffff;}
516 | .navbar{*position:relative;*z-index:2;overflow:visible;margin-bottom:18px;}
517 | .navbar-inner{padding-left:20px;padding-right:20px;background-color:#2c2c2c;background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-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);}
518 | .navbar .container{width:auto;}
519 | .btn-navbar{display:none;float:right;padding:7px 10px;margin-left:5px;margin-right:5px;background-color:#2c2c2c;background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);border-color:#222222 #222222 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:dximagetransform.microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);}.btn-navbar:hover,.btn-navbar:active,.btn-navbar.active,.btn-navbar.disabled,.btn-navbar[disabled]{background-color:#222222;}
520 | .btn-navbar:active,.btn-navbar.active{background-color:#080808 \9;}
521 | .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);-moz-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);}
522 | .btn-navbar .icon-bar+.icon-bar{margin-top:3px;}
523 | .nav-collapse.collapse{height:auto;}
524 | .navbar{color:#999999;}.navbar .brand:hover{text-decoration:none;}
525 | .navbar .brand{float:left;display:block;padding:8px 20px 12px;margin-left:-20px;font-size:20px;font-weight:200;line-height:1;color:#ffffff;}
526 | .navbar .navbar-text{margin-bottom:0;line-height:40px;}
527 | .navbar .btn,.navbar .btn-group{margin-top:5px;}
528 | .navbar .btn-group .btn{margin-top:0;}
529 | .navbar-form{margin-bottom:0;*zoom:1;}.navbar-form:before,.navbar-form:after{display:table;content:"";}
530 | .navbar-form:after{clear:both;}
531 | .navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px;}
532 | .navbar-form input,.navbar-form select{display:inline-block;margin-bottom:0;}
533 | .navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px;}
534 | .navbar-form .input-append,.navbar-form .input-prepend{margin-top:6px;white-space:nowrap;}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0;}
535 | .navbar-search{position:relative;float:left;margin-top:6px;margin-bottom:0;}.navbar-search .search-query{padding:4px 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;color:#ffffff;background-color:#626262;border:1px solid #151515;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none;}.navbar-search .search-query:-moz-placeholder{color:#cccccc;}
536 | .navbar-search .search-query::-webkit-input-placeholder{color:#cccccc;}
537 | .navbar-search .search-query:focus,.navbar-search .search-query.focused{padding:5px 10px;color:#333333;text-shadow:0 1px 0 #ffffff;background-color:#ffffff;border:0;-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);outline:0;}
538 | .navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0;}
539 | .navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-left:0;padding-right:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
540 | .navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px;}
541 | .navbar-fixed-top{top:0;}
542 | .navbar-fixed-bottom{bottom:0;}
543 | .navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0;}
544 | .navbar .nav.pull-right{float:right;}
545 | .navbar .nav>li{display:block;float:left;}
546 | .navbar .nav>li>a{float:none;padding:10px 10px 11px;line-height:19px;color:#999999;text-decoration:none;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);}
547 | .navbar .nav>li>a:hover{background-color:transparent;color:#ffffff;text-decoration:none;}
548 | .navbar .nav .active>a,.navbar .nav .active>a:hover{color:#ffffff;text-decoration:none;background-color:#222222;}
549 | .navbar .divider-vertical{height:40px;width:1px;margin:0 9px;overflow:hidden;background-color:#222222;border-right:1px solid #333333;}
550 | .navbar .nav.pull-right{margin-left:10px;margin-right:0;}
551 | .navbar .dropdown-menu{margin-top:1px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.navbar .dropdown-menu:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0, 0, 0, 0.2);position:absolute;top:-7px;left:9px;}
552 | .navbar .dropdown-menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:10px;}
553 | .navbar-fixed-bottom .dropdown-menu:before{border-top:7px solid #ccc;border-top-color:rgba(0, 0, 0, 0.2);border-bottom:0;bottom:-7px;top:auto;}
554 | .navbar-fixed-bottom .dropdown-menu:after{border-top:6px solid #ffffff;border-bottom:0;bottom:-6px;top:auto;}
555 | .navbar .nav .dropdown-toggle .caret,.navbar .nav .open.dropdown .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;}
556 | .navbar .nav .active .caret{opacity:1;filter:alpha(opacity=100);}
557 | .navbar .nav .open>.dropdown-toggle,.navbar .nav .active>.dropdown-toggle,.navbar .nav .open.active>.dropdown-toggle{background-color:transparent;}
558 | .navbar .nav .active>.dropdown-toggle:hover{color:#ffffff;}
559 | .navbar .nav.pull-right .dropdown-menu,.navbar .nav .dropdown-menu.pull-right{left:auto;right:0;}.navbar .nav.pull-right .dropdown-menu:before,.navbar .nav .dropdown-menu.pull-right:before{left:auto;right:12px;}
560 | .navbar .nav.pull-right .dropdown-menu:after,.navbar .nav .dropdown-menu.pull-right:after{left:auto;right:13px;}
561 | .breadcrumb{padding:7px 14px;margin:0 0 18px;list-style:none;background-color:#fbfbfb;background-image:-moz-linear-gradient(top, #ffffff, #f5f5f5);background-image:-ms-linear-gradient(top, #ffffff, #f5f5f5);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5));background-image:-webkit-linear-gradient(top, #ffffff, #f5f5f5);background-image:-o-linear-gradient(top, #ffffff, #f5f5f5);background-image:linear-gradient(top, #ffffff, #f5f5f5);background-repeat:repeat-x;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-block;*display:inline;*zoom:1;text-shadow:0 1px 0 #ffffff;}
562 | .breadcrumb .divider{padding:0 5px;color:#999999;}
563 | .breadcrumb .active a{color:#333333;}
564 | .pagination{height:36px;margin:18px 0;}
565 | .pagination ul{display:inline-block;*display:inline;*zoom:1;margin-left:0;margin-bottom:0;-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);}
566 | .pagination li{display:inline;}
567 | .pagination a{float:left;padding:0 14px;line-height:34px;text-decoration:none;border:1px solid #ddd;border-left-width:0;}
568 | .pagination a:hover,.pagination .active a{background-color:#f5f5f5;}
569 | .pagination .active a{color:#999999;cursor:default;}
570 | .pagination .disabled span,.pagination .disabled a,.pagination .disabled a:hover{color:#999999;background-color:transparent;cursor:default;}
571 | .pagination li:first-child a{border-left-width:1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
572 | .pagination li:last-child a{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}
573 | .pagination-centered{text-align:center;}
574 | .pagination-right{text-align:right;}
575 | .pager{margin-left:0;margin-bottom:18px;list-style:none;text-align:center;*zoom:1;}.pager:before,.pager:after{display:table;content:"";}
576 | .pager:after{clear:both;}
577 | .pager li{display:inline;}
578 | .pager a{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;}
579 | .pager a:hover{text-decoration:none;background-color:#f5f5f5;}
580 | .pager .next a{float:right;}
581 | .pager .previous a{float:left;}
582 | .pager .disabled a,.pager .disabled a:hover{color:#999999;background-color:#fff;cursor:default;}
583 | .thumbnails{margin-left:-20px;list-style:none;*zoom:1;}.thumbnails:before,.thumbnails:after{display:table;content:"";}
584 | .thumbnails:after{clear:both;}
585 | .thumbnails>li{float:left;margin:0 0 18px 20px;}
586 | .thumbnail{display:block;padding:4px;line-height:1;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);}
587 | a.thumbnail:hover{border-color:#0088cc;-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);}
588 | .thumbnail>img{display:block;max-width:100%;margin-left:auto;margin-right:auto;}
589 | .thumbnail .caption{padding:9px;}
590 | .alert{padding:8px 35px 8px 14px;margin-bottom:18px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;color:#c09853;}
591 | .alert-heading{color:inherit;}
592 | .alert .close{position:relative;top:-2px;right:-21px;line-height:18px;}
593 | .alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#468847;}
594 | .alert-danger,.alert-error{background-color:#f2dede;border-color:#eed3d7;color:#b94a48;}
595 | .alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#3a87ad;}
596 | .alert-block{padding-top:14px;padding-bottom:14px;}
597 | .alert-block>p,.alert-block>ul{margin-bottom:0;}
598 | .alert-block p+p{margin-top:5px;}
599 | @-webkit-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@-moz-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@-ms-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}.progress{overflow:hidden;height:18px;margin-bottom:18px;background-color:#f7f7f7;background-image:-moz-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-ms-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));background-image:-webkit-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-o-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:linear-gradient(top, #f5f5f5, #f9f9f9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#f9f9f9', GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
600 | .progress .bar{width:0%;height:18px;color:#ffffff;font-size:12px;text-align:center;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top, #149bdf, #0480be);background-image:-ms-linear-gradient(top, #149bdf, #0480be);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));background-image:-webkit-linear-gradient(top, #149bdf, #0480be);background-image:-o-linear-gradient(top, #149bdf, #0480be);background-image:linear-gradient(top, #149bdf, #0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#149bdf', endColorstr='#0480be', GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width 0.6s ease;-moz-transition:width 0.6s ease;-ms-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease;}
601 | .progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px;}
602 | .progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite;}
603 | .progress-danger .bar{background-color:#dd514c;background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-ms-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(top, #ee5f5b, #c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);}
604 | .progress-danger.progress-striped .bar{background-color:#ee5f5b;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);}
605 | .progress-success .bar{background-color:#5eb95e;background-image:-moz-linear-gradient(top, #62c462, #57a957);background-image:-ms-linear-gradient(top, #62c462, #57a957);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));background-image:-webkit-linear-gradient(top, #62c462, #57a957);background-image:-o-linear-gradient(top, #62c462, #57a957);background-image:linear-gradient(top, #62c462, #57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);}
606 | .progress-success.progress-striped .bar{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);}
607 | .progress-info .bar{background-color:#4bb1cf;background-image:-moz-linear-gradient(top, #5bc0de, #339bb9);background-image:-ms-linear-gradient(top, #5bc0de, #339bb9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));background-image:-webkit-linear-gradient(top, #5bc0de, #339bb9);background-image:-o-linear-gradient(top, #5bc0de, #339bb9);background-image:linear-gradient(top, #5bc0de, #339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);}
608 | .progress-info.progress-striped .bar{background-color:#5bc0de;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);}
609 | .progress-warning .bar{background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-ms-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(top, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0);}
610 | .progress-warning.progress-striped .bar{background-color:#fbb450;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);}
611 | .hero-unit{padding:60px;margin-bottom:30px;background-color:#eeeeee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;color:inherit;letter-spacing:-1px;}
612 | .hero-unit p{font-size:18px;font-weight:200;line-height:27px;color:inherit;}
613 | .tooltip{position:absolute;z-index:1020;display:block;visibility:visible;padding:5px;font-size:11px;opacity:0;filter:alpha(opacity=0);}.tooltip.in{opacity:0.8;filter:alpha(opacity=80);}
614 | .tooltip.top{margin-top:-2px;}
615 | .tooltip.right{margin-left:2px;}
616 | .tooltip.bottom{margin-top:2px;}
617 | .tooltip.left{margin-left:-2px;}
618 | .tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;}
619 | .tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;}
620 | .tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;}
621 | .tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;}
622 | .tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;text-decoration:none;background-color:#000000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
623 | .tooltip-arrow{position:absolute;width:0;height:0;}
624 | .popover{position:absolute;top:0;left:0;z-index:1010;display:none;padding:5px;}.popover.top{margin-top:-5px;}
625 | .popover.right{margin-left:5px;}
626 | .popover.bottom{margin-top:5px;}
627 | .popover.left{margin-left:-5px;}
628 | .popover.top .arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;}
629 | .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;}
630 | .popover.bottom .arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;}
631 | .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;}
632 | .popover .arrow{position:absolute;width:0;height:0;}
633 | .popover-inner{padding:3px;width:280px;overflow:hidden;background:#000000;background:rgba(0, 0, 0, 0.8);-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);}
634 | .popover-title{padding:9px 15px;line-height:1;background-color:#f5f5f5;border-bottom:1px solid #eee;-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;}
635 | .popover-content{padding:14px;background-color:#ffffff;-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;}
636 | .modal-open .dropdown-menu{z-index:2050;}
637 | .modal-open .dropdown.open{*z-index:2050;}
638 | .modal-open .popover{z-index:2060;}
639 | .modal-open .tooltip{z-index:2070;}
640 | .modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000;}.modal-backdrop.fade{opacity:0;}
641 | .modal-backdrop,.modal-backdrop.fade.in{opacity:0.8;filter:alpha(opacity=80);}
642 | .modal{position:fixed;top:50%;left:50%;z-index:1050;overflow:auto;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.fade{-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%;}
643 | .modal.fade.in{top:50%;}
644 | .modal-header{padding:9px 15px;border-bottom:1px solid #eee;}.modal-header .close{margin-top:2px;}
645 | .modal-body{overflow-y:auto;max-height:400px;padding:15px;}
646 | .modal-form{margin-bottom:0;}
647 | .modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;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;}.modal-footer:before,.modal-footer:after{display:table;content:"";}
648 | .modal-footer:after{clear:both;}
649 | .modal-footer .btn+.btn{margin-left:5px;margin-bottom:0;}
650 | .modal-footer .btn-group .btn+.btn{margin-left:-1px;}
651 | .dropdown{position:relative;}
652 | .dropdown-toggle{*margin-bottom:-3px;}
653 | .dropdown-toggle:active,.open .dropdown-toggle{outline:0;}
654 | .caret{display:inline-block;width:0;height:0;vertical-align:top;border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid #000000;opacity:0.3;filter:alpha(opacity=30);content:"";}
655 | .dropdown .caret{margin-top:8px;margin-left:2px;}
656 | .dropdown:hover .caret,.open.dropdown .caret{opacity:1;filter:alpha(opacity=100);}
657 | .dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;float:left;display:none;min-width:160px;padding:4px 0;margin:0;list-style:none;background-color:#ffffff;border-color:#ccc;border-color:rgba(0, 0, 0, 0.2);border-style:solid;border-width:1px;-webkit-border-radius:0 0 5px 5px;-moz-border-radius:0 0 5px 5px;border-radius:0 0 5px 5px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;*border-right-width:2px;*border-bottom-width:2px;}.dropdown-menu.pull-right{right:0;left:auto;}
658 | .dropdown-menu .divider{height:1px;margin:8px 1px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;*width:100%;*margin:-5px 0 5px;}
659 | .dropdown-menu a{display:block;padding:3px 15px;clear:both;font-weight:normal;line-height:18px;color:#333333;white-space:nowrap;}
660 | .dropdown-menu li>a:hover,.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#ffffff;text-decoration:none;background-color:#0088cc;}
661 | .dropdown.open{*z-index:1000;}.dropdown.open .dropdown-toggle{color:#ffffff;background:#ccc;background:rgba(0, 0, 0, 0.3);}
662 | .dropdown.open .dropdown-menu{display:block;}
663 | .pull-right .dropdown-menu{left:auto;right:0;}
664 | .dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000000;content:"\2191";}
665 | .dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px;}
666 | .typeahead{margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
667 | .accordion{margin-bottom:18px;}
668 | .accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
669 | .accordion-heading{border-bottom:0;}
670 | .accordion-heading .accordion-toggle{display:block;padding:8px 15px;}
671 | .accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5;}
672 | .carousel{position:relative;margin-bottom:18px;line-height:1;}
673 | .carousel-inner{overflow:hidden;width:100%;position:relative;}
674 | .carousel .item{display:none;position:relative;-webkit-transition:0.6s ease-in-out left;-moz-transition:0.6s ease-in-out left;-ms-transition:0.6s ease-in-out left;-o-transition:0.6s ease-in-out left;transition:0.6s ease-in-out left;}
675 | .carousel .item>img{display:block;line-height:1;}
676 | .carousel .active,.carousel .next,.carousel .prev{display:block;}
677 | .carousel .active{left:0;}
678 | .carousel .next,.carousel .prev{position:absolute;top:0;width:100%;}
679 | .carousel .next{left:100%;}
680 | .carousel .prev{left:-100%;}
681 | .carousel .next.left,.carousel .prev.right{left:0;}
682 | .carousel .active.left{left:-100%;}
683 | .carousel .active.right{left:100%;}
684 | .carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#ffffff;text-align:center;background:#222222;border:3px solid #ffffff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:0.5;filter:alpha(opacity=50);}.carousel-control.right{left:auto;right:15px;}
685 | .carousel-control:hover{color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90);}
686 | .carousel-caption{position:absolute;left:0;right:0;bottom:0;padding:10px 15px 5px;background:#333333;background:rgba(0, 0, 0, 0.75);}
687 | .carousel-caption h4,.carousel-caption p{color:#ffffff;}
688 | .well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;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);}
689 | .well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}
690 | .well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
691 | .close{float:right;font-size:20px;font-weight:bold;line-height:18px;color:#000000;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20);}.close:hover{color:#000000;text-decoration:none;opacity:0.4;filter:alpha(opacity=40);cursor:pointer;}
692 | .pull-right{float:right;}
693 | .pull-left{float:left;}
694 | .hide{display:none;}
695 | .show{display:block;}
696 | .invisible{visibility:hidden;}
697 | .fade{-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;}
698 | .collapse{-webkit-transition:height 0.35s ease;-moz-transition:height 0.35s ease;-ms-transition:height 0.35s ease;-o-transition:height 0.35s ease;transition:height 0.35s ease;position:relative;overflow:hidden;height:0;}.collapse.in{height:auto;}
699 | .hidden{display:none;visibility:hidden;}
700 | .visible-phone{display:none;}
701 | .visible-tablet{display:none;}
702 | .visible-desktop{display:block;}
703 | .hidden-phone{display:block;}
704 | .hidden-tablet{display:block;}
705 | .hidden-desktop{display:none;}
706 | @media (max-width:767px){.visible-phone{display:block;} .hidden-phone{display:none;} .hidden-desktop{display:block;} .visible-desktop{display:none;}}@media (min-width:768px) and (max-width:979px){.visible-tablet{display:block;} .hidden-tablet{display:none;} .hidden-desktop{display:block;} .visible-desktop{display:none;}}@media (max-width:480px){.nav-collapse{-webkit-transform:translate3d(0, 0, 0);} .page-header h1 small{display:block;line-height:18px;} input[type="checkbox"],input[type="radio"]{border:1px solid #ccc;} .form-horizontal .control-group>label{float:none;width:auto;padding-top:0;text-align:left;} .form-horizontal .controls{margin-left:0;} .form-horizontal .control-list{padding-top:0;} .form-horizontal .form-actions{padding-left:10px;padding-right:10px;} .modal{position:absolute;top:10px;left:10px;right:10px;width:auto;margin:0;}.modal.fade.in{top:auto;} .modal-header .close{padding:10px;margin:-10px;} .carousel-caption{position:static;}}@media (max-width:767px){body{padding-left:20px;padding-right:20px;} .navbar-fixed-top{margin-left:-20px;margin-right:-20px;} .container{width:auto;} .row-fluid{width:100%;} .row{margin-left:0;} .row>[class*="span"],.row-fluid>[class*="span"]{float:none;display:block;width:auto;margin:0;} .thumbnails [class*="span"]{width:auto;} input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:28px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;} .input-prepend input[class*="span"],.input-append input[class*="span"]{width:auto;}}@media (min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";} .row:after{clear:both;} [class*="span"]{float:left;margin-left:20px;} .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px;} .span12{width:724px;} .span11{width:662px;} .span10{width:600px;} .span9{width:538px;} .span8{width:476px;} .span7{width:414px;} .span6{width:352px;} .span5{width:290px;} .span4{width:228px;} .span3{width:166px;} .span2{width:104px;} .span1{width:42px;} .offset12{margin-left:764px;} .offset11{margin-left:702px;} .offset10{margin-left:640px;} .offset9{margin-left:578px;} .offset8{margin-left:516px;} .offset7{margin-left:454px;} .offset6{margin-left:392px;} .offset5{margin-left:330px;} .offset4{margin-left:268px;} .offset3{margin-left:206px;} .offset2{margin-left:144px;} .offset1{margin-left:82px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} .row-fluid:after{clear:both;} .row-fluid>[class*="span"]{float:left;margin-left:2.762430939%;} .row-fluid>[class*="span"]:first-child{margin-left:0;} .row-fluid > .span12{width:99.999999993%;} .row-fluid > .span11{width:91.436464082%;} .row-fluid > .span10{width:82.87292817100001%;} .row-fluid > .span9{width:74.30939226%;} .row-fluid > .span8{width:65.74585634900001%;} .row-fluid > .span7{width:57.182320438000005%;} .row-fluid > .span6{width:48.618784527%;} .row-fluid > .span5{width:40.055248616%;} .row-fluid > .span4{width:31.491712705%;} .row-fluid > .span3{width:22.928176794%;} .row-fluid > .span2{width:14.364640883%;} .row-fluid > .span1{width:5.801104972%;} input,textarea,.uneditable-input{margin-left:0;} input.span12, textarea.span12, .uneditable-input.span12{width:714px;} input.span11, textarea.span11, .uneditable-input.span11{width:652px;} input.span10, textarea.span10, .uneditable-input.span10{width:590px;} input.span9, textarea.span9, .uneditable-input.span9{width:528px;} input.span8, textarea.span8, .uneditable-input.span8{width:466px;} input.span7, textarea.span7, .uneditable-input.span7{width:404px;} input.span6, textarea.span6, .uneditable-input.span6{width:342px;} input.span5, textarea.span5, .uneditable-input.span5{width:280px;} input.span4, textarea.span4, .uneditable-input.span4{width:218px;} input.span3, textarea.span3, .uneditable-input.span3{width:156px;} input.span2, textarea.span2, .uneditable-input.span2{width:94px;} input.span1, textarea.span1, .uneditable-input.span1{width:32px;}}@media (max-width:979px){body{padding-top:0;} .navbar-fixed-top{position:static;margin-bottom:18px;} .navbar-fixed-top .navbar-inner{padding:5px;} .navbar .container{width:auto;padding:0;} .navbar .brand{padding-left:10px;padding-right:10px;margin:0 0 0 -5px;} .navbar .nav-collapse{clear:left;} .navbar .nav{float:none;margin:0 0 9px;} .navbar .nav>li{float:none;} .navbar .nav>li>a{margin-bottom:2px;} .navbar .nav>.divider-vertical{display:none;} .navbar .nav .nav-header{color:#999999;text-shadow:none;} .navbar .nav>li>a,.navbar .dropdown-menu a{padding:6px 15px;font-weight:bold;color:#999999;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} .navbar .dropdown-menu li+li a{margin-bottom:2px;} .navbar .nav>li>a:hover,.navbar .dropdown-menu a:hover{background-color:#222222;} .navbar .dropdown-menu{position:static;top:auto;left:auto;float:none;display:block;max-width:none;margin:0 15px;padding:0;background-color:transparent;border:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} .navbar .dropdown-menu:before,.navbar .dropdown-menu:after{display:none;} .navbar .dropdown-menu .divider{display:none;} .navbar-form,.navbar-search{float:none;padding:9px 15px;margin:9px 0;border-top:1px solid #222222;border-bottom:1px solid #222222;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);} .navbar .nav.pull-right{float:none;margin-left:0;} .navbar-static .navbar-inner{padding-left:10px;padding-right:10px;} .btn-navbar{display:block;} .nav-collapse{overflow:hidden;height:0;}}@media (min-width:980px){.nav-collapse.collapse{height:auto !important;overflow:visible !important;}}@media (min-width:1200px){.row{margin-left:-30px;*zoom:1;}.row:before,.row:after{display:table;content:"";} .row:after{clear:both;} [class*="span"]{float:left;margin-left:30px;} .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px;} .span12{width:1170px;} .span11{width:1070px;} .span10{width:970px;} .span9{width:870px;} .span8{width:770px;} .span7{width:670px;} .span6{width:570px;} .span5{width:470px;} .span4{width:370px;} .span3{width:270px;} .span2{width:170px;} .span1{width:70px;} .offset12{margin-left:1230px;} .offset11{margin-left:1130px;} .offset10{margin-left:1030px;} .offset9{margin-left:930px;} .offset8{margin-left:830px;} .offset7{margin-left:730px;} .offset6{margin-left:630px;} .offset5{margin-left:530px;} .offset4{margin-left:430px;} .offset3{margin-left:330px;} .offset2{margin-left:230px;} .offset1{margin-left:130px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} .row-fluid:after{clear:both;} .row-fluid>[class*="span"]{float:left;margin-left:2.564102564%;} .row-fluid>[class*="span"]:first-child{margin-left:0;} .row-fluid > .span12{width:100%;} .row-fluid > .span11{width:91.45299145300001%;} .row-fluid > .span10{width:82.905982906%;} .row-fluid > .span9{width:74.358974359%;} .row-fluid > .span8{width:65.81196581200001%;} .row-fluid > .span7{width:57.264957265%;} .row-fluid > .span6{width:48.717948718%;} .row-fluid > .span5{width:40.170940171000005%;} .row-fluid > .span4{width:31.623931624%;} .row-fluid > .span3{width:23.076923077%;} .row-fluid > .span2{width:14.529914530000001%;} .row-fluid > .span1{width:5.982905983%;} input,textarea,.uneditable-input{margin-left:0;} input.span12, textarea.span12, .uneditable-input.span12{width:1160px;} input.span11, textarea.span11, .uneditable-input.span11{width:1060px;} input.span10, textarea.span10, .uneditable-input.span10{width:960px;} input.span9, textarea.span9, .uneditable-input.span9{width:860px;} input.span8, textarea.span8, .uneditable-input.span8{width:760px;} input.span7, textarea.span7, .uneditable-input.span7{width:660px;} input.span6, textarea.span6, .uneditable-input.span6{width:560px;} input.span5, textarea.span5, .uneditable-input.span5{width:460px;} input.span4, textarea.span4, .uneditable-input.span4{width:360px;} input.span3, textarea.span3, .uneditable-input.span3{width:260px;} input.span2, textarea.span2, .uneditable-input.span2{width:160px;} input.span1, textarea.span1, .uneditable-input.span1{width:60px;} .thumbnails{margin-left:-30px;} .thumbnails>li{margin-left:30px;}}
707 |
--------------------------------------------------------------------------------