From 2e0ba98d98afb697d66e25f4420a2ac73c33015c Mon Sep 17 00:00:00 2001 From: Sixto Martin Date: Thu, 24 Apr 2014 14:40:45 +0200 Subject: [PATCH 001/560] Release of the new PHP Toolkit. (2.0.0 version) --- .gitignore | 10 + LICENSE | 39 +- README | 1245 ++- _toolkit_loader.php | 25 + advanced_settings_example.php | 80 + compatibility.php | 12 + composer.json | 24 + demo-old/Readme.txt | 43 + {demo => demo-old}/consume.php | 17 +- {demo => demo-old}/index.php | 4 +- {demo => demo-old}/metadata.php | 4 +- demo-old/settings_example.php | 54 + demo/settings.php | 60 - demo1/Readme.txt | 76 + demo1/attrs.php | 25 + demo1/index.php | 71 + demo1/metadata.php | 27 + demo1/settings_example.php | 26 + demo2/Readme.txt | 76 + demo2/consume.php | 40 + demo2/index.php | 45 + demo2/metadata.php | 19 + demo2/slo.php | 27 + demo2/sso.php | 22 + docs/Onelogin_PHPToolkit_Guide.pdf | Bin 0 -> 106036 bytes docs/Saml/classes.svg | 59 + .../classes/OneLogin_Saml_AuthRequest.html | 370 + docs/Saml/classes/OneLogin_Saml_Metadata.html | 361 + docs/Saml/classes/OneLogin_Saml_Response.html | 301 + docs/Saml/classes/OneLogin_Saml_Settings.html | 635 ++ docs/Saml/classes/OneLogin_Saml_XmlSec.html | 400 + docs/Saml/css/bootstrap-responsive.css | 567 + docs/Saml/css/bootstrap-responsive.min.css | 3 + docs/Saml/css/bootstrap.css | 3370 ++++++ docs/Saml/css/bootstrap.min.css | 611 ++ docs/Saml/css/jquery.iviewer.css | 91 + docs/Saml/css/prettify.css | 1 + docs/Saml/css/template.css | 527 + docs/Saml/graph_class.html | 105 + docs/Saml/img/apple-touch-icon-114x114.png | Bin 0 -> 28338 bytes docs/Saml/img/apple-touch-icon-72x72.png | Bin 0 -> 12751 bytes docs/Saml/img/apple-touch-icon.png | Bin 0 -> 8358 bytes docs/Saml/img/favicon.ico | Bin 0 -> 1150 bytes docs/Saml/img/glyphicons-halflings-white.png | Bin 0 -> 4352 bytes docs/Saml/img/glyphicons-halflings.png | Bin 0 -> 4352 bytes docs/Saml/img/icons/arrow_down.png | Bin 0 -> 606 bytes docs/Saml/img/icons/arrow_right.png | Bin 0 -> 628 bytes docs/Saml/img/icons/class.png | Bin 0 -> 395 bytes docs/Saml/img/icons/constant.png | Bin 0 -> 496 bytes docs/Saml/img/icons/favicon.ico | Bin 0 -> 1150 bytes docs/Saml/img/icons/file-php.png | Bin 0 -> 4017 bytes docs/Saml/img/icons/file.gif | Bin 0 -> 110 bytes docs/Saml/img/icons/folder.gif | Bin 0 -> 106 bytes docs/Saml/img/icons/function.png | Bin 0 -> 338 bytes docs/Saml/img/icons/icon-folder-open-big.png | Bin 0 -> 232 bytes docs/Saml/img/icons/icon-th-big.png | Bin 0 -> 106 bytes docs/Saml/img/icons/icon_template.svg | 93 + docs/Saml/img/icons/interface.png | Bin 0 -> 281 bytes docs/Saml/img/icons/method.png | Bin 0 -> 377 bytes docs/Saml/img/icons/ok.png | Bin 0 -> 3685 bytes docs/Saml/img/icons/property.png | Bin 0 -> 360 bytes docs/Saml/img/icons/search.gif | Bin 0 -> 152 bytes docs/Saml/img/icons/variable.png | Bin 0 -> 829 bytes docs/Saml/img/icons/view_source.png | Bin 0 -> 603 bytes docs/Saml/img/icons/visibility_private.png | Bin 0 -> 3433 bytes docs/Saml/img/icons/visibility_protected.png | Bin 0 -> 764 bytes docs/Saml/img/icons/visibility_public.png | Bin 0 -> 3451 bytes docs/Saml/img/iviewer/grab.cur | Bin 0 -> 1150 bytes docs/Saml/img/iviewer/hand.cur | Bin 0 -> 1150 bytes docs/Saml/img/iviewer/iviewer.rotate_left.png | Bin 0 -> 1493 bytes .../Saml/img/iviewer/iviewer.rotate_right.png | Bin 0 -> 1482 bytes docs/Saml/img/iviewer/iviewer.zoom_fit.png | Bin 0 -> 1252 bytes docs/Saml/img/iviewer/iviewer.zoom_fit2.gif | Bin 0 -> 95 bytes docs/Saml/img/iviewer/iviewer.zoom_in.png | Bin 0 -> 1420 bytes docs/Saml/img/iviewer/iviewer.zoom_in2.gif | Bin 0 -> 90 bytes docs/Saml/img/iviewer/iviewer.zoom_out.png | Bin 0 -> 1416 bytes docs/Saml/img/iviewer/iviewer.zoom_out2.gif | Bin 0 -> 69 bytes docs/Saml/img/iviewer/iviewer.zoom_zero.png | Bin 0 -> 1091 bytes docs/Saml/img/iviewer/iviewer.zoom_zero2.gif | Bin 0 -> 98 bytes docs/Saml/img/loader.gif | Bin 0 -> 4726 bytes docs/Saml/index.html | 110 + docs/Saml/js/SVGPan.js | 232 + docs/Saml/js/bootstrap.js | 1722 +++ docs/Saml/js/bootstrap.min.js | 1 + docs/Saml/js/jquery-1.4.2.min.js | 154 + docs/Saml/js/jquery-1.7.1.min.js | 9270 +++++++++++++++++ docs/Saml/js/jquery-ui-1.8.2.custom.min.js | 1012 ++ docs/Saml/js/jquery.cookie.js | 104 + docs/Saml/js/jquery.iviewer.js | 1045 ++ docs/Saml/js/jquery.iviewer.min.js | 42 + docs/Saml/js/jquery.mousewheel.min.js | 13 + docs/Saml/js/jquery.panzoom.js | 467 + docs/Saml/js/jquery.splitter.js | 228 + docs/Saml/js/jquery.tools.min.js | 115 + docs/Saml/js/jquery.treeview.js | 256 + docs/Saml/js/menu.js | 31 + docs/Saml/js/prettify/lang-apollo.js | 2 + docs/Saml/js/prettify/lang-clj.js | 18 + docs/Saml/js/prettify/lang-css.js | 2 + docs/Saml/js/prettify/lang-go.js | 1 + docs/Saml/js/prettify/lang-hs.js | 2 + docs/Saml/js/prettify/lang-lisp.js | 3 + docs/Saml/js/prettify/lang-lua.js | 2 + docs/Saml/js/prettify/lang-ml.js | 2 + docs/Saml/js/prettify/lang-n.js | 4 + docs/Saml/js/prettify/lang-proto.js | 1 + docs/Saml/js/prettify/lang-scala.js | 2 + docs/Saml/js/prettify/lang-sql.js | 2 + docs/Saml/js/prettify/lang-tex.js | 1 + docs/Saml/js/prettify/lang-vb.js | 2 + docs/Saml/js/prettify/lang-vhdl.js | 3 + docs/Saml/js/prettify/lang-wiki.js | 2 + docs/Saml/js/prettify/lang-xq.js | 3 + docs/Saml/js/prettify/lang-yaml.js | 2 + docs/Saml/js/prettify/prettify.min.js | 28 + docs/Saml/js/sidebar.js | 45 + docs/Saml/js/template.js | 205 + docs/Saml/namespaces/default.html | 132 + ...-file_41490c7e368e29f813beef0e771110ee.dat | Bin 0 -> 8456 bytes .../phpdoc-cache-2e/phpdoc-cache-settings.dat | Bin 0 -> 113 bytes ...-file_93972b6811cf61deea59203557827f2a.dat | Bin 0 -> 16860 bytes ...-file_98a1f4049cf32bcdfd356923a5467878.dat | Bin 0 -> 14903 bytes ...-file_b4c7cb90902b9fd1dd94f0c07751194b.dat | Bin 0 -> 8846 bytes ...-file_4a753c0195a85783eb27cefbf98562d8.dat | Bin 0 -> 11264 bytes docs/Saml2/classes.svg | 84 + .../OneLogin_Saml2_LogoutResponse.html | 550 + .../classes/OneLogin_Saml2_Response.html | 950 ++ docs/Saml2/classes/Onelogin_Saml2_Auth.html | 1018 ++ .../classes/Onelogin_Saml2_AuthnRequest.html | 313 + .../classes/Onelogin_Saml2_Constants.html | 1481 +++ docs/Saml2/classes/Onelogin_Saml2_Error.html | 641 ++ .../classes/Onelogin_Saml2_LogoutRequest.html | 546 + .../classes/Onelogin_Saml2_Metadata.html | 377 + .../classes/Onelogin_Saml2_Settings.html | 1542 +++ .../classes/Onelogin_Saml2_Settings.html.old | 1500 +++ docs/Saml2/classes/Onelogin_Saml2_Utils.html | 1162 +++ docs/Saml2/css/bootstrap-responsive.css | 567 + docs/Saml2/css/bootstrap-responsive.min.css | 3 + docs/Saml2/css/bootstrap.css | 3370 ++++++ docs/Saml2/css/bootstrap.min.css | 611 ++ docs/Saml2/css/jquery.iviewer.css | 91 + docs/Saml2/css/prettify.css | 1 + docs/Saml2/css/template.css | 527 + docs/Saml2/graph_class.html | 105 + docs/Saml2/img/apple-touch-icon-114x114.png | Bin 0 -> 28338 bytes docs/Saml2/img/apple-touch-icon-72x72.png | Bin 0 -> 12751 bytes docs/Saml2/img/apple-touch-icon.png | Bin 0 -> 8358 bytes docs/Saml2/img/favicon.ico | Bin 0 -> 1150 bytes docs/Saml2/img/glyphicons-halflings-white.png | Bin 0 -> 4352 bytes docs/Saml2/img/glyphicons-halflings.png | Bin 0 -> 4352 bytes docs/Saml2/img/icons/arrow_down.png | Bin 0 -> 606 bytes docs/Saml2/img/icons/arrow_right.png | Bin 0 -> 628 bytes docs/Saml2/img/icons/class.png | Bin 0 -> 395 bytes docs/Saml2/img/icons/constant.png | Bin 0 -> 496 bytes docs/Saml2/img/icons/favicon.ico | Bin 0 -> 1150 bytes docs/Saml2/img/icons/file-php.png | Bin 0 -> 4017 bytes docs/Saml2/img/icons/file.gif | Bin 0 -> 110 bytes docs/Saml2/img/icons/folder.gif | Bin 0 -> 106 bytes docs/Saml2/img/icons/function.png | Bin 0 -> 338 bytes docs/Saml2/img/icons/icon-folder-open-big.png | Bin 0 -> 232 bytes docs/Saml2/img/icons/icon-th-big.png | Bin 0 -> 106 bytes docs/Saml2/img/icons/icon_template.svg | 93 + docs/Saml2/img/icons/interface.png | Bin 0 -> 281 bytes docs/Saml2/img/icons/method.png | Bin 0 -> 377 bytes docs/Saml2/img/icons/ok.png | Bin 0 -> 3685 bytes docs/Saml2/img/icons/property.png | Bin 0 -> 360 bytes docs/Saml2/img/icons/search.gif | Bin 0 -> 152 bytes docs/Saml2/img/icons/variable.png | Bin 0 -> 829 bytes docs/Saml2/img/icons/view_source.png | Bin 0 -> 603 bytes docs/Saml2/img/icons/visibility_private.png | Bin 0 -> 3433 bytes docs/Saml2/img/icons/visibility_protected.png | Bin 0 -> 764 bytes docs/Saml2/img/icons/visibility_public.png | Bin 0 -> 3451 bytes docs/Saml2/img/iviewer/grab.cur | Bin 0 -> 1150 bytes docs/Saml2/img/iviewer/hand.cur | Bin 0 -> 1150 bytes .../Saml2/img/iviewer/iviewer.rotate_left.png | Bin 0 -> 1493 bytes .../img/iviewer/iviewer.rotate_right.png | Bin 0 -> 1482 bytes docs/Saml2/img/iviewer/iviewer.zoom_fit.png | Bin 0 -> 1252 bytes docs/Saml2/img/iviewer/iviewer.zoom_fit2.gif | Bin 0 -> 95 bytes docs/Saml2/img/iviewer/iviewer.zoom_in.png | Bin 0 -> 1420 bytes docs/Saml2/img/iviewer/iviewer.zoom_in2.gif | Bin 0 -> 90 bytes docs/Saml2/img/iviewer/iviewer.zoom_out.png | Bin 0 -> 1416 bytes docs/Saml2/img/iviewer/iviewer.zoom_out2.gif | Bin 0 -> 69 bytes docs/Saml2/img/iviewer/iviewer.zoom_zero.png | Bin 0 -> 1091 bytes docs/Saml2/img/iviewer/iviewer.zoom_zero2.gif | Bin 0 -> 98 bytes docs/Saml2/img/loader.gif | Bin 0 -> 4726 bytes docs/Saml2/index.html | 109 + docs/Saml2/js/SVGPan.js | 232 + docs/Saml2/js/bootstrap.js | 1722 +++ docs/Saml2/js/bootstrap.min.js | 1 + docs/Saml2/js/jquery-1.4.2.min.js | 154 + docs/Saml2/js/jquery-1.7.1.min.js | 9270 +++++++++++++++++ docs/Saml2/js/jquery-ui-1.8.2.custom.min.js | 1012 ++ docs/Saml2/js/jquery.cookie.js | 104 + docs/Saml2/js/jquery.iviewer.js | 1045 ++ docs/Saml2/js/jquery.iviewer.min.js | 42 + docs/Saml2/js/jquery.mousewheel.min.js | 13 + docs/Saml2/js/jquery.panzoom.js | 467 + docs/Saml2/js/jquery.splitter.js | 228 + docs/Saml2/js/jquery.tools.min.js | 115 + docs/Saml2/js/jquery.treeview.js | 256 + docs/Saml2/js/menu.js | 31 + docs/Saml2/js/prettify/lang-apollo.js | 2 + docs/Saml2/js/prettify/lang-clj.js | 18 + docs/Saml2/js/prettify/lang-css.js | 2 + docs/Saml2/js/prettify/lang-go.js | 1 + docs/Saml2/js/prettify/lang-hs.js | 2 + docs/Saml2/js/prettify/lang-lisp.js | 3 + docs/Saml2/js/prettify/lang-lua.js | 2 + docs/Saml2/js/prettify/lang-ml.js | 2 + docs/Saml2/js/prettify/lang-n.js | 4 + docs/Saml2/js/prettify/lang-proto.js | 1 + docs/Saml2/js/prettify/lang-scala.js | 2 + docs/Saml2/js/prettify/lang-sql.js | 2 + docs/Saml2/js/prettify/lang-tex.js | 1 + docs/Saml2/js/prettify/lang-vb.js | 2 + docs/Saml2/js/prettify/lang-vhdl.js | 3 + docs/Saml2/js/prettify/lang-wiki.js | 2 + docs/Saml2/js/prettify/lang-xq.js | 3 + docs/Saml2/js/prettify/lang-yaml.js | 2 + docs/Saml2/js/prettify/prettify.min.js | 28 + docs/Saml2/js/sidebar.js | 45 + docs/Saml2/js/template.js | 205 + docs/Saml2/namespaces/default.html | 162 + ...-file_41490c7e368e29f813beef0e771110ee.dat | Bin 0 -> 54490 bytes .../phpdoc-cache-2e/phpdoc-cache-settings.dat | Bin 0 -> 113 bytes ...-file_11373a29b3c52a2e91a3c8c3c0e98382.dat | Bin 0 -> 26121 bytes ...-file_e9d34eadaeaefe21f3f7d9637905ed7e.dat | Bin 0 -> 15033 bytes ...-file_93972b6811cf61deea59203557827f2a.dat | Bin 0 -> 66502 bytes ...-file_d4ec4886d9048c03af3aa70b5b826df6.dat | Bin 0 -> 87059 bytes ...-file_b4c7cb90902b9fd1dd94f0c07751194b.dat | Bin 0 -> 23538 bytes ...-file_2fa4b1a840f5f051825e538151a532ff.dat | Bin 0 -> 10243 bytes ...-file_52084c644a12bbd66735afc25ad2f294.dat | Bin 0 -> 30626 bytes ...-file_47a09008f5ff5cce89e9a6107ea425e3.dat | Bin 0 -> 49737 bytes ...-file_2109b416d04de19ef5617c91c1a203bd.dat | Bin 0 -> 33585 bytes endpoints/acs.php | 47 + endpoints/metadata.php | 25 + endpoints/sls.php | 21 + {ext => extlib}/xmlseclibs/CHANGELOG.txt | 39 + extlib/xmlseclibs/LICENSE | 31 + {ext => extlib}/xmlseclibs/xmlseclibs.php | 589 +- lib/Saml/AuthRequest.php | 55 + lib/Saml/Metadata.php | 28 + lib/Saml/Response.php | 35 + {src/OneLogin => lib}/Saml/Settings.php | 35 +- {src/OneLogin => lib}/Saml/XmlSec.php | 35 +- lib/Saml2/Auth.php | 387 + lib/Saml2/AuthnRequest.php | 93 + lib/Saml2/Constants.php | 65 + lib/Saml2/Error.php | 41 + lib/Saml2/LogoutRequest.php | 319 + lib/Saml2/LogoutResponse.php | 227 + lib/Saml2/Metadata.php | 168 + lib/Saml2/Response.php | 601 ++ lib/Saml2/Settings.php | 708 ++ lib/Saml2/Utils.php | 856 ++ lib/Saml2/schemas/WS-Trust.xsd | 113 + .../schemas/cs-sstc-schema-assertion-1.1.xsd | 205 + .../schemas/cs-sstc-schema-protocol-1.1.xsd | 137 + .../schemas/saml-schema-assertion-2.0.xsd | 283 + .../schemas/saml-schema-authn-context-2.0.xsd | 23 + ...chema-authn-context-auth-telephony-2.0.xsd | 81 + .../saml-schema-authn-context-ip-2.0.xsd | 65 + .../saml-schema-authn-context-ippword-2.0.xsd | 67 + ...saml-schema-authn-context-kerberos-2.0.xsd | 83 + ...-authn-context-mobileonefactor-reg-2.0.xsd | 186 + ...uthn-context-mobileonefactor-unreg-2.0.xsd | 183 + ...-authn-context-mobiletwofactor-reg-2.0.xsd | 202 + ...uthn-context-mobiletwofactor-unreg-2.0.xsd | 200 + ...hema-authn-context-nomad-telephony-2.0.xsd | 81 + ...a-authn-context-personal-telephony-2.0.xsd | 80 + .../saml-schema-authn-context-pgp-2.0.xsd | 83 + .../saml-schema-authn-context-ppt-2.0.xsd | 81 + .../saml-schema-authn-context-pword-2.0.xsd | 64 + .../saml-schema-authn-context-session-2.0.xsd | 64 + ...aml-schema-authn-context-smartcard-2.0.xsd | 64 + ...-schema-authn-context-smartcardpki-2.0.xsd | 129 + ...l-schema-authn-context-softwarepki-2.0.xsd | 129 + .../saml-schema-authn-context-spki-2.0.xsd | 83 + .../saml-schema-authn-context-srp-2.0.xsd | 82 + .../saml-schema-authn-context-sslcert-2.0.xsd | 97 + ...aml-schema-authn-context-telephony-2.0.xsd | 79 + ...saml-schema-authn-context-timesync-2.0.xsd | 105 + .../saml-schema-authn-context-types-2.0.xsd | 821 ++ .../saml-schema-authn-context-x509-2.0.xsd | 83 + .../saml-schema-authn-context-xmldsig-2.0.xsd | 83 + lib/Saml2/schemas/saml-schema-dce-2.0.xsd | 29 + lib/Saml2/schemas/saml-schema-ecp-2.0.xsd | 57 + .../schemas/saml-schema-metadata-2.0.xsd | 339 + .../schemas/saml-schema-protocol-2.0.xsd | 302 + lib/Saml2/schemas/saml-schema-x500-2.0.xsd | 20 + lib/Saml2/schemas/saml-schema-xacml-2.0.xsd | 19 + .../schemas/shibboleth-2.0-afp-mf-basic.xsd | 372 + .../schemas/shibboleth-2.0-afp-mf-saml.xsd | 95 + lib/Saml2/schemas/shibboleth-2.0-afp.xsd | 205 + .../schemas/shibboleth-2.0-attribute-map.xsd | 295 + .../shibboleth-2.0-native-sp-config.xsd | 766 ++ .../shibboleth-2.0-native-sp-protocols.xsd | 59 + .../schemas/shibboleth-2.0-sp-notify.xsd | 64 + lib/Saml2/schemas/shibboleth-metadata-1.0.xsd | 42 + lib/Saml2/schemas/shibboleth.xsd | 300 + lib/Saml2/schemas/sstc-metadata-attr.xsd | 35 + lib/Saml2/schemas/sstc-request-initiation.xsd | 23 + lib/Saml2/schemas/sstc-saml-attribute-ext.xsd | 25 + lib/Saml2/schemas/sstc-saml-delegation.xsd | 40 + lib/Saml2/schemas/sstc-saml-idp-discovery.xsd | 22 + .../sstc-saml-metadata-algsupport-v1.0.xsd | 41 + .../schemas/sstc-saml-metadata-ext-query.xsd | 66 + .../schemas/sstc-saml-metadata-ui-v1.0.xsd | 89 + .../sstc-saml-protocol-ext-thirdparty.xsd | 29 + lib/Saml2/schemas/sstc-saml1x-metadata.xsd | 25 + lib/Saml2/schemas/xenc-schema.xsd | 136 + lib/Saml2/schemas/xml.xsd | 287 + lib/Saml2/schemas/xmldsig-core-schema.xsd | 309 + lib/Saml2/schemas/xmlsoap.xsd | 126 + lib/Saml2/version.json | 6 + locale/en_US/LC_MESSAGES/phptoolkit.mo | Bin 0 -> 200 bytes locale/en_US/LC_MESSAGES/phptoolkit.po | 26 + locale/es_ES/LC_MESSAGES/phptoolkit.mo | Bin 0 -> 405 bytes locale/es_ES/LC_MESSAGES/phptoolkit.po | 27 + phpdoc.xml | 37 + settings_example.php | 73 + src/OneLogin/Saml/AuthRequest.php | 77 - src/OneLogin/Saml/Metadata.php | 58 - src/OneLogin/Saml/Response.php | 120 - tests/bootstrap.php | 50 +- tests/certs/certificate1 | 12 + tests/data/customPath/advanced_settings.php | 14 + tests/data/customPath/certs/metadata.crt | 16 + tests/data/customPath/certs/metadata.key | 15 + tests/data/customPath/certs/sp.crt | 16 + tests/data/customPath/certs/sp.key | 15 + tests/data/customPath/settings.php | 23 + .../invalids/invalid_issuer.xml | 14 + .../invalids/invalid_issuer.xml.base64 | 1 + .../logout_requests/invalids/no_nameId.xml | 11 + .../invalids/not_after_failed.xml | 14 + .../invalids/not_after_failed.xml.base64 | 1 + tests/data/logout_requests/logout_request.xml | 13 + .../logout_requests/logout_request.xml.base64 | 1 + .../logout_request_deflated.xml.base64 | 1 + .../logout_request_encrypted_nameid.xml | 28 + .../logout_request_with_sessionindex.xml | 14 + .../invalids/no_status.xml.base64 | 1 + .../invalids/status_code_responder.xml.base64 | 1 + .../data/logout_responses/logout_response.xml | 13 + .../logout_response.xml.base64 | 1 + .../logout_response_deflated.xml.base64 | 1 + .../metadata/expired_metadata_settings1.xml | 8 + tests/data/metadata/metadata_settings1.xml | 14 + .../metadata/noentity_metadata_settings1.xml | 8 + .../metadata/signed_metadata_settings1.xml | 26 + tests/data/metadata/unparsed_metadata.xml | 14 + tests/data/misc/sp2.key | 16 + tests/data/misc/sp3.key | 15 + tests/data/requests/authn_request.xml | 11 + tests/data/requests/authn_request.xml.base64 | 1 + .../responses/adfs_response.xml.base64 | 0 ...uble_signed_encrypted_assertion.xml.base64 | 1 + .../double_signed_response.xml.base64 | 1 + .../responses/expired_response.xml.base64 | 1 + .../invalids/bad_reference.xml.base64 | 1 + .../invalids/encrypted_attrs.xml.base64 | 1 + ...rypted_nameID_without_EncMethod.xml.base64 | 1 + ...ncrypted_nameID_without_keyinfo.xml.base64 | 1 + .../invalids/invalid_audience.xml.base64 | 1 + .../invalid_issuer_assertion.xml.base64 | 1 + .../invalid_issuer_message.xml.base64 | 1 + .../invalids/invalid_sessionindex.xml.base64 | 1 + ..._subjectconfirmation_inresponse.xml.base64 | 1 + .../invalid_subjectconfirmation_nb.xml.base64 | 1 + ...invalid_subjectconfirmation_noa.xml.base64 | 1 + ...d_subjectconfirmation_recipient.xml.base64 | 1 + .../invalids/multiple_assertions.xml.base64 | 2 + .../data/responses/invalids/no_id.xml.base64 | 1 + .../data/responses/invalids/no_key.xml.base64 | 1 + .../responses/invalids/no_nameid.xml.base64 | 1 + .../responses/invalids/no_saml2.xml.base64 | 1 + .../invalids/no_signature.xml.base64 | 1 + .../responses/invalids/no_status.xml.base64 | 1 + .../invalids/no_status_code.xml.base64 | 1 + .../no_subjectconfirmation_data.xml.base64 | 1 + .../no_subjectconfirmation_method.xml.base64 | 1 + .../invalids/not_after_failed.xml.base64 | 1 + .../invalids/not_before_failed.xml.base64 | 1 + .../response_encrypted_attrs.xml.base64 | 1 + .../invalids/status_code_responder.xml.base64 | 1 + .../status_code_responer_and_msg.xml.base64 | 1 + .../responses/open_saml_response.xml | 0 .../{ => data}/responses/response1.xml.base64 | 0 .../{ => data}/responses/response2.xml.base64 | 0 .../{ => data}/responses/response3.xml.base64 | 0 .../{ => data}/responses/response4.xml.base64 | 0 .../{ => data}/responses/response5.xml.base64 | 0 .../response_encrypted_nameid.xml.base64 | 1 + .../responses/response_with_ampersands.xml | 0 .../response_with_ampersands.xml.base64 | 0 .../signed_assertion_response.xml.base64 | 1 + .../signed_encrypted_assertion.xml.base64 | 1 + ...ned_message_encrypted_assertion.xml.base64 | 1 + .../signed_message_response.xml.base64 | 1 + .../{ => data}/responses/simple_saml_php.xml | 0 .../responses/unsigned_assertion.xml.base64 | 1 + .../responses/unsigned_response.xml.base64 | 1 + .../valid_encrypted_assertion.xml.base64 | 1 + .../data/responses/valid_response.xml.base64 | 1 + .../responses/wrapped_response_2.xml.base64 | 0 tests/phpunit.xml | 11 +- tests/responses/valid_response.xml.base64 | 72 - tests/settings/settings1.php | 49 + tests/src/OneLogin/Saml/AuthRequestTest.php | 79 +- tests/src/OneLogin/Saml/MetadataTest.php | 97 + tests/src/OneLogin/Saml/ResponseTest.php | 55 +- tests/src/OneLogin/Saml/XmlSecTest.php | 145 + tests/src/OneLogin/Saml2/AuthTest.php | 899 ++ tests/src/OneLogin/Saml2/AuthnRequestTest.php | 79 + tests/src/OneLogin/Saml2/ErrorTest.php | 19 + .../src/OneLogin/Saml2/LogoutRequestTest.php | 426 + .../src/OneLogin/Saml2/LogoutResponseTest.php | 340 + tests/src/OneLogin/Saml2/MetadataTest.php | 151 + tests/src/OneLogin/Saml2/ResponseTest.php | 1113 ++ tests/src/OneLogin/Saml2/SettingsTest.php | 626 ++ .../src/OneLogin/Saml2/SignedResponseTest.php | 50 + tests/src/OneLogin/Saml2/UtilsTest.php | 767 ++ 423 files changed, 73530 insertions(+), 617 deletions(-) create mode 100644 _toolkit_loader.php create mode 100644 advanced_settings_example.php create mode 100644 compatibility.php create mode 100644 composer.json create mode 100644 demo-old/Readme.txt rename {demo => demo-old}/consume.php (76%) rename {demo => demo-old}/index.php (91%) rename {demo => demo-old}/metadata.php (88%) create mode 100644 demo-old/settings_example.php delete mode 100644 demo/settings.php create mode 100644 demo1/Readme.txt create mode 100644 demo1/attrs.php create mode 100644 demo1/index.php create mode 100644 demo1/metadata.php create mode 100644 demo1/settings_example.php create mode 100644 demo2/Readme.txt create mode 100644 demo2/consume.php create mode 100755 demo2/index.php create mode 100644 demo2/metadata.php create mode 100644 demo2/slo.php create mode 100644 demo2/sso.php create mode 100644 docs/Onelogin_PHPToolkit_Guide.pdf create mode 100644 docs/Saml/classes.svg create mode 100644 docs/Saml/classes/OneLogin_Saml_AuthRequest.html create mode 100644 docs/Saml/classes/OneLogin_Saml_Metadata.html create mode 100644 docs/Saml/classes/OneLogin_Saml_Response.html create mode 100644 docs/Saml/classes/OneLogin_Saml_Settings.html create mode 100644 docs/Saml/classes/OneLogin_Saml_XmlSec.html create mode 100644 docs/Saml/css/bootstrap-responsive.css create mode 100644 docs/Saml/css/bootstrap-responsive.min.css create mode 100644 docs/Saml/css/bootstrap.css create mode 100644 docs/Saml/css/bootstrap.min.css create mode 100644 docs/Saml/css/jquery.iviewer.css create mode 100644 docs/Saml/css/prettify.css create mode 100644 docs/Saml/css/template.css create mode 100644 docs/Saml/graph_class.html create mode 100644 docs/Saml/img/apple-touch-icon-114x114.png create mode 100644 docs/Saml/img/apple-touch-icon-72x72.png create mode 100644 docs/Saml/img/apple-touch-icon.png create mode 100644 docs/Saml/img/favicon.ico create mode 100644 docs/Saml/img/glyphicons-halflings-white.png create mode 100644 docs/Saml/img/glyphicons-halflings.png create mode 100644 docs/Saml/img/icons/arrow_down.png create mode 100644 docs/Saml/img/icons/arrow_right.png create mode 100644 docs/Saml/img/icons/class.png create mode 100644 docs/Saml/img/icons/constant.png create mode 100644 docs/Saml/img/icons/favicon.ico create mode 100644 docs/Saml/img/icons/file-php.png create mode 100644 docs/Saml/img/icons/file.gif create mode 100644 docs/Saml/img/icons/folder.gif create mode 100644 docs/Saml/img/icons/function.png create mode 100644 docs/Saml/img/icons/icon-folder-open-big.png create mode 100644 docs/Saml/img/icons/icon-th-big.png create mode 100644 docs/Saml/img/icons/icon_template.svg create mode 100644 docs/Saml/img/icons/interface.png create mode 100644 docs/Saml/img/icons/method.png create mode 100644 docs/Saml/img/icons/ok.png create mode 100644 docs/Saml/img/icons/property.png create mode 100644 docs/Saml/img/icons/search.gif create mode 100644 docs/Saml/img/icons/variable.png create mode 100644 docs/Saml/img/icons/view_source.png create mode 100644 docs/Saml/img/icons/visibility_private.png create mode 100644 docs/Saml/img/icons/visibility_protected.png create mode 100644 docs/Saml/img/icons/visibility_public.png create mode 100644 docs/Saml/img/iviewer/grab.cur create mode 100644 docs/Saml/img/iviewer/hand.cur create mode 100644 docs/Saml/img/iviewer/iviewer.rotate_left.png create mode 100644 docs/Saml/img/iviewer/iviewer.rotate_right.png create mode 100644 docs/Saml/img/iviewer/iviewer.zoom_fit.png create mode 100644 docs/Saml/img/iviewer/iviewer.zoom_fit2.gif create mode 100644 docs/Saml/img/iviewer/iviewer.zoom_in.png create mode 100644 docs/Saml/img/iviewer/iviewer.zoom_in2.gif create mode 100644 docs/Saml/img/iviewer/iviewer.zoom_out.png create mode 100644 docs/Saml/img/iviewer/iviewer.zoom_out2.gif create mode 100644 docs/Saml/img/iviewer/iviewer.zoom_zero.png create mode 100644 docs/Saml/img/iviewer/iviewer.zoom_zero2.gif create mode 100644 docs/Saml/img/loader.gif create mode 100644 docs/Saml/index.html create mode 100644 docs/Saml/js/SVGPan.js create mode 100644 docs/Saml/js/bootstrap.js create mode 100644 docs/Saml/js/bootstrap.min.js create mode 100644 docs/Saml/js/jquery-1.4.2.min.js create mode 100644 docs/Saml/js/jquery-1.7.1.min.js create mode 100644 docs/Saml/js/jquery-ui-1.8.2.custom.min.js create mode 100644 docs/Saml/js/jquery.cookie.js create mode 100644 docs/Saml/js/jquery.iviewer.js create mode 100644 docs/Saml/js/jquery.iviewer.min.js create mode 100644 docs/Saml/js/jquery.mousewheel.min.js create mode 100644 docs/Saml/js/jquery.panzoom.js create mode 100644 docs/Saml/js/jquery.splitter.js create mode 100644 docs/Saml/js/jquery.tools.min.js create mode 100644 docs/Saml/js/jquery.treeview.js create mode 100644 docs/Saml/js/menu.js create mode 100644 docs/Saml/js/prettify/lang-apollo.js create mode 100644 docs/Saml/js/prettify/lang-clj.js create mode 100644 docs/Saml/js/prettify/lang-css.js create mode 100644 docs/Saml/js/prettify/lang-go.js create mode 100644 docs/Saml/js/prettify/lang-hs.js create mode 100644 docs/Saml/js/prettify/lang-lisp.js create mode 100644 docs/Saml/js/prettify/lang-lua.js create mode 100644 docs/Saml/js/prettify/lang-ml.js create mode 100644 docs/Saml/js/prettify/lang-n.js create mode 100644 docs/Saml/js/prettify/lang-proto.js create mode 100644 docs/Saml/js/prettify/lang-scala.js create mode 100644 docs/Saml/js/prettify/lang-sql.js create mode 100644 docs/Saml/js/prettify/lang-tex.js create mode 100644 docs/Saml/js/prettify/lang-vb.js create mode 100644 docs/Saml/js/prettify/lang-vhdl.js create mode 100644 docs/Saml/js/prettify/lang-wiki.js create mode 100644 docs/Saml/js/prettify/lang-xq.js create mode 100644 docs/Saml/js/prettify/lang-yaml.js create mode 100644 docs/Saml/js/prettify/prettify.min.js create mode 100644 docs/Saml/js/sidebar.js create mode 100644 docs/Saml/js/template.js create mode 100644 docs/Saml/namespaces/default.html create mode 100644 docs/Saml/phpdoc-cache-22/phpdoc-cache-file_41490c7e368e29f813beef0e771110ee.dat create mode 100644 docs/Saml/phpdoc-cache-2e/phpdoc-cache-settings.dat create mode 100644 docs/Saml/phpdoc-cache-83/phpdoc-cache-file_93972b6811cf61deea59203557827f2a.dat create mode 100644 docs/Saml/phpdoc-cache-a6/phpdoc-cache-file_98a1f4049cf32bcdfd356923a5467878.dat create mode 100644 docs/Saml/phpdoc-cache-ae/phpdoc-cache-file_b4c7cb90902b9fd1dd94f0c07751194b.dat create mode 100644 docs/Saml/phpdoc-cache-dc/phpdoc-cache-file_4a753c0195a85783eb27cefbf98562d8.dat create mode 100644 docs/Saml2/classes.svg create mode 100644 docs/Saml2/classes/OneLogin_Saml2_LogoutResponse.html create mode 100644 docs/Saml2/classes/OneLogin_Saml2_Response.html create mode 100644 docs/Saml2/classes/Onelogin_Saml2_Auth.html create mode 100644 docs/Saml2/classes/Onelogin_Saml2_AuthnRequest.html create mode 100644 docs/Saml2/classes/Onelogin_Saml2_Constants.html create mode 100644 docs/Saml2/classes/Onelogin_Saml2_Error.html create mode 100644 docs/Saml2/classes/Onelogin_Saml2_LogoutRequest.html create mode 100644 docs/Saml2/classes/Onelogin_Saml2_Metadata.html create mode 100644 docs/Saml2/classes/Onelogin_Saml2_Settings.html create mode 100644 docs/Saml2/classes/Onelogin_Saml2_Settings.html.old create mode 100644 docs/Saml2/classes/Onelogin_Saml2_Utils.html create mode 100644 docs/Saml2/css/bootstrap-responsive.css create mode 100644 docs/Saml2/css/bootstrap-responsive.min.css create mode 100644 docs/Saml2/css/bootstrap.css create mode 100644 docs/Saml2/css/bootstrap.min.css create mode 100644 docs/Saml2/css/jquery.iviewer.css create mode 100644 docs/Saml2/css/prettify.css create mode 100644 docs/Saml2/css/template.css create mode 100644 docs/Saml2/graph_class.html create mode 100644 docs/Saml2/img/apple-touch-icon-114x114.png create mode 100644 docs/Saml2/img/apple-touch-icon-72x72.png create mode 100644 docs/Saml2/img/apple-touch-icon.png create mode 100644 docs/Saml2/img/favicon.ico create mode 100644 docs/Saml2/img/glyphicons-halflings-white.png create mode 100644 docs/Saml2/img/glyphicons-halflings.png create mode 100644 docs/Saml2/img/icons/arrow_down.png create mode 100644 docs/Saml2/img/icons/arrow_right.png create mode 100644 docs/Saml2/img/icons/class.png create mode 100644 docs/Saml2/img/icons/constant.png create mode 100644 docs/Saml2/img/icons/favicon.ico create mode 100644 docs/Saml2/img/icons/file-php.png create mode 100644 docs/Saml2/img/icons/file.gif create mode 100644 docs/Saml2/img/icons/folder.gif create mode 100644 docs/Saml2/img/icons/function.png create mode 100644 docs/Saml2/img/icons/icon-folder-open-big.png create mode 100644 docs/Saml2/img/icons/icon-th-big.png create mode 100644 docs/Saml2/img/icons/icon_template.svg create mode 100644 docs/Saml2/img/icons/interface.png create mode 100644 docs/Saml2/img/icons/method.png create mode 100644 docs/Saml2/img/icons/ok.png create mode 100644 docs/Saml2/img/icons/property.png create mode 100644 docs/Saml2/img/icons/search.gif create mode 100644 docs/Saml2/img/icons/variable.png create mode 100644 docs/Saml2/img/icons/view_source.png create mode 100644 docs/Saml2/img/icons/visibility_private.png create mode 100644 docs/Saml2/img/icons/visibility_protected.png create mode 100644 docs/Saml2/img/icons/visibility_public.png create mode 100644 docs/Saml2/img/iviewer/grab.cur create mode 100644 docs/Saml2/img/iviewer/hand.cur create mode 100644 docs/Saml2/img/iviewer/iviewer.rotate_left.png create mode 100644 docs/Saml2/img/iviewer/iviewer.rotate_right.png create mode 100644 docs/Saml2/img/iviewer/iviewer.zoom_fit.png create mode 100644 docs/Saml2/img/iviewer/iviewer.zoom_fit2.gif create mode 100644 docs/Saml2/img/iviewer/iviewer.zoom_in.png create mode 100644 docs/Saml2/img/iviewer/iviewer.zoom_in2.gif create mode 100644 docs/Saml2/img/iviewer/iviewer.zoom_out.png create mode 100644 docs/Saml2/img/iviewer/iviewer.zoom_out2.gif create mode 100644 docs/Saml2/img/iviewer/iviewer.zoom_zero.png create mode 100644 docs/Saml2/img/iviewer/iviewer.zoom_zero2.gif create mode 100644 docs/Saml2/img/loader.gif create mode 100644 docs/Saml2/index.html create mode 100644 docs/Saml2/js/SVGPan.js create mode 100644 docs/Saml2/js/bootstrap.js create mode 100644 docs/Saml2/js/bootstrap.min.js create mode 100644 docs/Saml2/js/jquery-1.4.2.min.js create mode 100644 docs/Saml2/js/jquery-1.7.1.min.js create mode 100644 docs/Saml2/js/jquery-ui-1.8.2.custom.min.js create mode 100644 docs/Saml2/js/jquery.cookie.js create mode 100644 docs/Saml2/js/jquery.iviewer.js create mode 100644 docs/Saml2/js/jquery.iviewer.min.js create mode 100644 docs/Saml2/js/jquery.mousewheel.min.js create mode 100644 docs/Saml2/js/jquery.panzoom.js create mode 100644 docs/Saml2/js/jquery.splitter.js create mode 100644 docs/Saml2/js/jquery.tools.min.js create mode 100644 docs/Saml2/js/jquery.treeview.js create mode 100644 docs/Saml2/js/menu.js create mode 100644 docs/Saml2/js/prettify/lang-apollo.js create mode 100644 docs/Saml2/js/prettify/lang-clj.js create mode 100644 docs/Saml2/js/prettify/lang-css.js create mode 100644 docs/Saml2/js/prettify/lang-go.js create mode 100644 docs/Saml2/js/prettify/lang-hs.js create mode 100644 docs/Saml2/js/prettify/lang-lisp.js create mode 100644 docs/Saml2/js/prettify/lang-lua.js create mode 100644 docs/Saml2/js/prettify/lang-ml.js create mode 100644 docs/Saml2/js/prettify/lang-n.js create mode 100644 docs/Saml2/js/prettify/lang-proto.js create mode 100644 docs/Saml2/js/prettify/lang-scala.js create mode 100644 docs/Saml2/js/prettify/lang-sql.js create mode 100644 docs/Saml2/js/prettify/lang-tex.js create mode 100644 docs/Saml2/js/prettify/lang-vb.js create mode 100644 docs/Saml2/js/prettify/lang-vhdl.js create mode 100644 docs/Saml2/js/prettify/lang-wiki.js create mode 100644 docs/Saml2/js/prettify/lang-xq.js create mode 100644 docs/Saml2/js/prettify/lang-yaml.js create mode 100644 docs/Saml2/js/prettify/prettify.min.js create mode 100644 docs/Saml2/js/sidebar.js create mode 100644 docs/Saml2/js/template.js create mode 100644 docs/Saml2/namespaces/default.html create mode 100644 docs/Saml2/phpdoc-cache-22/phpdoc-cache-file_41490c7e368e29f813beef0e771110ee.dat create mode 100644 docs/Saml2/phpdoc-cache-2e/phpdoc-cache-settings.dat create mode 100644 docs/Saml2/phpdoc-cache-30/phpdoc-cache-file_11373a29b3c52a2e91a3c8c3c0e98382.dat create mode 100644 docs/Saml2/phpdoc-cache-70/phpdoc-cache-file_e9d34eadaeaefe21f3f7d9637905ed7e.dat create mode 100644 docs/Saml2/phpdoc-cache-83/phpdoc-cache-file_93972b6811cf61deea59203557827f2a.dat create mode 100644 docs/Saml2/phpdoc-cache-aa/phpdoc-cache-file_d4ec4886d9048c03af3aa70b5b826df6.dat create mode 100644 docs/Saml2/phpdoc-cache-ae/phpdoc-cache-file_b4c7cb90902b9fd1dd94f0c07751194b.dat create mode 100644 docs/Saml2/phpdoc-cache-af/phpdoc-cache-file_2fa4b1a840f5f051825e538151a532ff.dat create mode 100644 docs/Saml2/phpdoc-cache-d7/phpdoc-cache-file_52084c644a12bbd66735afc25ad2f294.dat create mode 100644 docs/Saml2/phpdoc-cache-f4/phpdoc-cache-file_47a09008f5ff5cce89e9a6107ea425e3.dat create mode 100644 docs/Saml2/phpdoc-cache-ff/phpdoc-cache-file_2109b416d04de19ef5617c91c1a203bd.dat create mode 100644 endpoints/acs.php create mode 100644 endpoints/metadata.php create mode 100644 endpoints/sls.php rename {ext => extlib}/xmlseclibs/CHANGELOG.txt (62%) create mode 100644 extlib/xmlseclibs/LICENSE rename {ext => extlib}/xmlseclibs/xmlseclibs.php (74%) create mode 100644 lib/Saml/AuthRequest.php create mode 100644 lib/Saml/Metadata.php create mode 100644 lib/Saml/Response.php rename {src/OneLogin => lib}/Saml/Settings.php (61%) rename {src/OneLogin => lib}/Saml/XmlSec.php (95%) create mode 100644 lib/Saml2/Auth.php create mode 100644 lib/Saml2/AuthnRequest.php create mode 100644 lib/Saml2/Constants.php create mode 100644 lib/Saml2/Error.php create mode 100644 lib/Saml2/LogoutRequest.php create mode 100644 lib/Saml2/LogoutResponse.php create mode 100644 lib/Saml2/Metadata.php create mode 100644 lib/Saml2/Response.php create mode 100644 lib/Saml2/Settings.php create mode 100644 lib/Saml2/Utils.php create mode 100644 lib/Saml2/schemas/WS-Trust.xsd create mode 100644 lib/Saml2/schemas/cs-sstc-schema-assertion-1.1.xsd create mode 100644 lib/Saml2/schemas/cs-sstc-schema-protocol-1.1.xsd create mode 100644 lib/Saml2/schemas/saml-schema-assertion-2.0.xsd create mode 100644 lib/Saml2/schemas/saml-schema-authn-context-2.0.xsd create mode 100644 lib/Saml2/schemas/saml-schema-authn-context-auth-telephony-2.0.xsd create mode 100644 lib/Saml2/schemas/saml-schema-authn-context-ip-2.0.xsd create mode 100644 lib/Saml2/schemas/saml-schema-authn-context-ippword-2.0.xsd create mode 100644 lib/Saml2/schemas/saml-schema-authn-context-kerberos-2.0.xsd create mode 100644 lib/Saml2/schemas/saml-schema-authn-context-mobileonefactor-reg-2.0.xsd create mode 100644 lib/Saml2/schemas/saml-schema-authn-context-mobileonefactor-unreg-2.0.xsd create mode 100644 lib/Saml2/schemas/saml-schema-authn-context-mobiletwofactor-reg-2.0.xsd create mode 100644 lib/Saml2/schemas/saml-schema-authn-context-mobiletwofactor-unreg-2.0.xsd create mode 100644 lib/Saml2/schemas/saml-schema-authn-context-nomad-telephony-2.0.xsd create mode 100644 lib/Saml2/schemas/saml-schema-authn-context-personal-telephony-2.0.xsd create mode 100644 lib/Saml2/schemas/saml-schema-authn-context-pgp-2.0.xsd create mode 100644 lib/Saml2/schemas/saml-schema-authn-context-ppt-2.0.xsd create mode 100644 lib/Saml2/schemas/saml-schema-authn-context-pword-2.0.xsd create mode 100644 lib/Saml2/schemas/saml-schema-authn-context-session-2.0.xsd create mode 100644 lib/Saml2/schemas/saml-schema-authn-context-smartcard-2.0.xsd create mode 100644 lib/Saml2/schemas/saml-schema-authn-context-smartcardpki-2.0.xsd create mode 100644 lib/Saml2/schemas/saml-schema-authn-context-softwarepki-2.0.xsd create mode 100644 lib/Saml2/schemas/saml-schema-authn-context-spki-2.0.xsd create mode 100644 lib/Saml2/schemas/saml-schema-authn-context-srp-2.0.xsd create mode 100644 lib/Saml2/schemas/saml-schema-authn-context-sslcert-2.0.xsd create mode 100644 lib/Saml2/schemas/saml-schema-authn-context-telephony-2.0.xsd create mode 100644 lib/Saml2/schemas/saml-schema-authn-context-timesync-2.0.xsd create mode 100644 lib/Saml2/schemas/saml-schema-authn-context-types-2.0.xsd create mode 100644 lib/Saml2/schemas/saml-schema-authn-context-x509-2.0.xsd create mode 100644 lib/Saml2/schemas/saml-schema-authn-context-xmldsig-2.0.xsd create mode 100644 lib/Saml2/schemas/saml-schema-dce-2.0.xsd create mode 100644 lib/Saml2/schemas/saml-schema-ecp-2.0.xsd create mode 100644 lib/Saml2/schemas/saml-schema-metadata-2.0.xsd create mode 100644 lib/Saml2/schemas/saml-schema-protocol-2.0.xsd create mode 100644 lib/Saml2/schemas/saml-schema-x500-2.0.xsd create mode 100644 lib/Saml2/schemas/saml-schema-xacml-2.0.xsd create mode 100644 lib/Saml2/schemas/shibboleth-2.0-afp-mf-basic.xsd create mode 100644 lib/Saml2/schemas/shibboleth-2.0-afp-mf-saml.xsd create mode 100644 lib/Saml2/schemas/shibboleth-2.0-afp.xsd create mode 100644 lib/Saml2/schemas/shibboleth-2.0-attribute-map.xsd create mode 100644 lib/Saml2/schemas/shibboleth-2.0-native-sp-config.xsd create mode 100644 lib/Saml2/schemas/shibboleth-2.0-native-sp-protocols.xsd create mode 100644 lib/Saml2/schemas/shibboleth-2.0-sp-notify.xsd create mode 100644 lib/Saml2/schemas/shibboleth-metadata-1.0.xsd create mode 100644 lib/Saml2/schemas/shibboleth.xsd create mode 100644 lib/Saml2/schemas/sstc-metadata-attr.xsd create mode 100644 lib/Saml2/schemas/sstc-request-initiation.xsd create mode 100644 lib/Saml2/schemas/sstc-saml-attribute-ext.xsd create mode 100644 lib/Saml2/schemas/sstc-saml-delegation.xsd create mode 100644 lib/Saml2/schemas/sstc-saml-idp-discovery.xsd create mode 100644 lib/Saml2/schemas/sstc-saml-metadata-algsupport-v1.0.xsd create mode 100644 lib/Saml2/schemas/sstc-saml-metadata-ext-query.xsd create mode 100644 lib/Saml2/schemas/sstc-saml-metadata-ui-v1.0.xsd create mode 100644 lib/Saml2/schemas/sstc-saml-protocol-ext-thirdparty.xsd create mode 100644 lib/Saml2/schemas/sstc-saml1x-metadata.xsd create mode 100644 lib/Saml2/schemas/xenc-schema.xsd create mode 100644 lib/Saml2/schemas/xml.xsd create mode 100644 lib/Saml2/schemas/xmldsig-core-schema.xsd create mode 100644 lib/Saml2/schemas/xmlsoap.xsd create mode 100644 lib/Saml2/version.json create mode 100644 locale/en_US/LC_MESSAGES/phptoolkit.mo create mode 100644 locale/en_US/LC_MESSAGES/phptoolkit.po create mode 100644 locale/es_ES/LC_MESSAGES/phptoolkit.mo create mode 100644 locale/es_ES/LC_MESSAGES/phptoolkit.po create mode 100644 phpdoc.xml create mode 100644 settings_example.php delete mode 100644 src/OneLogin/Saml/AuthRequest.php delete mode 100644 src/OneLogin/Saml/Metadata.php delete mode 100644 src/OneLogin/Saml/Response.php create mode 100644 tests/certs/certificate1 create mode 100644 tests/data/customPath/advanced_settings.php create mode 100755 tests/data/customPath/certs/metadata.crt create mode 100755 tests/data/customPath/certs/metadata.key create mode 100755 tests/data/customPath/certs/sp.crt create mode 100755 tests/data/customPath/certs/sp.key create mode 100644 tests/data/customPath/settings.php create mode 100644 tests/data/logout_requests/invalids/invalid_issuer.xml create mode 100644 tests/data/logout_requests/invalids/invalid_issuer.xml.base64 create mode 100644 tests/data/logout_requests/invalids/no_nameId.xml create mode 100644 tests/data/logout_requests/invalids/not_after_failed.xml create mode 100644 tests/data/logout_requests/invalids/not_after_failed.xml.base64 create mode 100644 tests/data/logout_requests/logout_request.xml create mode 100644 tests/data/logout_requests/logout_request.xml.base64 create mode 100644 tests/data/logout_requests/logout_request_deflated.xml.base64 create mode 100644 tests/data/logout_requests/logout_request_encrypted_nameid.xml create mode 100644 tests/data/logout_requests/logout_request_with_sessionindex.xml create mode 100644 tests/data/logout_responses/invalids/no_status.xml.base64 create mode 100644 tests/data/logout_responses/invalids/status_code_responder.xml.base64 create mode 100644 tests/data/logout_responses/logout_response.xml create mode 100644 tests/data/logout_responses/logout_response.xml.base64 create mode 100644 tests/data/logout_responses/logout_response_deflated.xml.base64 create mode 100644 tests/data/metadata/expired_metadata_settings1.xml create mode 100644 tests/data/metadata/metadata_settings1.xml create mode 100644 tests/data/metadata/noentity_metadata_settings1.xml create mode 100644 tests/data/metadata/signed_metadata_settings1.xml create mode 100644 tests/data/metadata/unparsed_metadata.xml create mode 100644 tests/data/misc/sp2.key create mode 100644 tests/data/misc/sp3.key create mode 100644 tests/data/requests/authn_request.xml create mode 100644 tests/data/requests/authn_request.xml.base64 rename tests/{ => data}/responses/adfs_response.xml.base64 (100%) create mode 100644 tests/data/responses/double_signed_encrypted_assertion.xml.base64 create mode 100644 tests/data/responses/double_signed_response.xml.base64 create mode 100644 tests/data/responses/expired_response.xml.base64 create mode 100644 tests/data/responses/invalids/bad_reference.xml.base64 create mode 100644 tests/data/responses/invalids/encrypted_attrs.xml.base64 create mode 100644 tests/data/responses/invalids/encrypted_nameID_without_EncMethod.xml.base64 create mode 100644 tests/data/responses/invalids/encrypted_nameID_without_keyinfo.xml.base64 create mode 100644 tests/data/responses/invalids/invalid_audience.xml.base64 create mode 100644 tests/data/responses/invalids/invalid_issuer_assertion.xml.base64 create mode 100644 tests/data/responses/invalids/invalid_issuer_message.xml.base64 create mode 100644 tests/data/responses/invalids/invalid_sessionindex.xml.base64 create mode 100644 tests/data/responses/invalids/invalid_subjectconfirmation_inresponse.xml.base64 create mode 100644 tests/data/responses/invalids/invalid_subjectconfirmation_nb.xml.base64 create mode 100644 tests/data/responses/invalids/invalid_subjectconfirmation_noa.xml.base64 create mode 100644 tests/data/responses/invalids/invalid_subjectconfirmation_recipient.xml.base64 create mode 100644 tests/data/responses/invalids/multiple_assertions.xml.base64 create mode 100644 tests/data/responses/invalids/no_id.xml.base64 create mode 100644 tests/data/responses/invalids/no_key.xml.base64 create mode 100644 tests/data/responses/invalids/no_nameid.xml.base64 create mode 100644 tests/data/responses/invalids/no_saml2.xml.base64 create mode 100644 tests/data/responses/invalids/no_signature.xml.base64 create mode 100644 tests/data/responses/invalids/no_status.xml.base64 create mode 100644 tests/data/responses/invalids/no_status_code.xml.base64 create mode 100644 tests/data/responses/invalids/no_subjectconfirmation_data.xml.base64 create mode 100644 tests/data/responses/invalids/no_subjectconfirmation_method.xml.base64 create mode 100644 tests/data/responses/invalids/not_after_failed.xml.base64 create mode 100644 tests/data/responses/invalids/not_before_failed.xml.base64 create mode 100644 tests/data/responses/invalids/response_encrypted_attrs.xml.base64 create mode 100644 tests/data/responses/invalids/status_code_responder.xml.base64 create mode 100644 tests/data/responses/invalids/status_code_responer_and_msg.xml.base64 rename tests/{ => data}/responses/open_saml_response.xml (100%) rename tests/{ => data}/responses/response1.xml.base64 (100%) rename tests/{ => data}/responses/response2.xml.base64 (100%) rename tests/{ => data}/responses/response3.xml.base64 (100%) rename tests/{ => data}/responses/response4.xml.base64 (100%) rename tests/{ => data}/responses/response5.xml.base64 (100%) create mode 100644 tests/data/responses/response_encrypted_nameid.xml.base64 rename tests/{ => data}/responses/response_with_ampersands.xml (100%) rename tests/{ => data}/responses/response_with_ampersands.xml.base64 (100%) create mode 100644 tests/data/responses/signed_assertion_response.xml.base64 create mode 100644 tests/data/responses/signed_encrypted_assertion.xml.base64 create mode 100644 tests/data/responses/signed_message_encrypted_assertion.xml.base64 create mode 100644 tests/data/responses/signed_message_response.xml.base64 rename tests/{ => data}/responses/simple_saml_php.xml (100%) create mode 100644 tests/data/responses/unsigned_assertion.xml.base64 create mode 100644 tests/data/responses/unsigned_response.xml.base64 create mode 100644 tests/data/responses/valid_encrypted_assertion.xml.base64 create mode 100644 tests/data/responses/valid_response.xml.base64 rename tests/{ => data}/responses/wrapped_response_2.xml.base64 (100%) delete mode 100644 tests/responses/valid_response.xml.base64 create mode 100644 tests/settings/settings1.php create mode 100644 tests/src/OneLogin/Saml/MetadataTest.php create mode 100644 tests/src/OneLogin/Saml/XmlSecTest.php create mode 100644 tests/src/OneLogin/Saml2/AuthTest.php create mode 100644 tests/src/OneLogin/Saml2/AuthnRequestTest.php create mode 100644 tests/src/OneLogin/Saml2/ErrorTest.php create mode 100644 tests/src/OneLogin/Saml2/LogoutRequestTest.php create mode 100644 tests/src/OneLogin/Saml2/LogoutResponseTest.php create mode 100644 tests/src/OneLogin/Saml2/MetadataTest.php create mode 100644 tests/src/OneLogin/Saml2/ResponseTest.php create mode 100644 tests/src/OneLogin/Saml2/SettingsTest.php create mode 100644 tests/src/OneLogin/Saml2/SignedResponseTest.php create mode 100644 tests/src/OneLogin/Saml2/UtilsTest.php diff --git a/.gitignore b/.gitignore index bf9dfdce..517a4e41 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,12 @@ *.swp +*~ .DS_Store +/settings.php +/demo1/settings.php +/demo-old/settings.php +/certs/sp.key +/certs/sp.crt +/certs/metadata.key +/certs/metadata.crt +/vendor +/composer.lock diff --git a/LICENSE b/LICENSE index a4a8af0e..e6113ab2 100644 --- a/LICENSE +++ b/LICENSE @@ -1,24 +1,19 @@ -Copyright (c) 2010, OneLogin, Inc. -All rights reserved. +Copyright (c) 2010-2014 OneLogin, LLC -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL ONELOGIN, INC. BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/README b/README index 723af94d..df26b42b 100644 --- a/README +++ b/README @@ -1,9 +1,1240 @@ -The files in demo are sample code to help -demonstrate how this library should work. In order to use them, you can -unpack this library in your website directory. +Onelogin's SAML PHP Toolkit +=========================== -You will need to modify the settings.php file to set the proper URLs and -x509 certificate. +Add SAML support to your PHP softwares using this library. +Forget those complicated libraries and use that open source library provided +and supported by Onelogin Inc. -There is more information in this post: -http://support.onelogin.com/entries/268420-saml-toolkit-for-php + +Why add SAML support to my software? +------------------------------------ + +SAML is an XML-based standard for web browser single sign-on and is defined by +the OASIS Security Services Technical Committee. The standard has been around +since 2002, but lately it is becoming popular due its advantages: + + * **Usability** - One-click access from portals or intranets, deep linking, + password elimination and automatically renewing sessions make life + easier for the user. + * **Security** - Based on strong digital signatures for authentication and + integrity, SAML is a secure single sign-on protocol that the largest + and most security conscious enterprises in the world rely on. + * **Speed** - SAML is fast. One browser redirect is all it takes to securely + sign a user into an application. + * **Phishing Prevention** - If you don’t have a password for an app, you + can’t be tricked into entering it on a fake login page. + * **IT Friendly** - SAML simplifies life for IT because it centralizes + authentication, provides greater visibility and makes directory + integration easier. + * **Opportunity** - B2B cloud vendor should support SAML to facilitate the + integration of their product. + + +General description +------------------- + +Onelogin's SAML PHP toolkit let you build a SP (Service Provider) over +your PHP application and connect it to any IdP (Identity Provider). + +Supports: + + * SSO and SLO (SP-Initiated and IdP-Initiated). + * Assertion and nameId encryption. + * Assertion signature. + * Message signature: AuthNRequest, LogoutRequest, LogoutResponses. + * Enable an Assertion Consumer Service endpoint. + * Enable an Single Logour Service endpoint. + * Publish the SP metadata (which can be signed). + +Key features: + + * **saml2int** - Implements the SAML 2.0 Web Browser SSO Profile. + * **Session-less** - Forget those common conflicts between the SP and + the final app, the toolkit delegate session in the final app. + * **Easy to use** - Programmer will be allowed to code high-level and + low-level programming, 2 easy to use APIs are available. + * **Tested** - Thoroughly tested. + * **Popular** - Onelogin's customers use it. Many PHP SAML plugins uses it. + + +Download +-------- + +The toolkit is hosted on github. You can download it from: + + * Lastest release: https://github.com/onelogin/php-saml/releases/tag/v2.0.0 + * Master repo: https://github.com/onelogin/php-saml/tree/master + + +Installation +------------ + + 1. Dependences: + * php >= 5.3.3 + * openssl. Install the openssl library. Handle x509 certificates. + * mcrypt. Install that library and its php driver if you gonna handle + encrypted data. (nameID, assertions) + 2. Code. Copy the core of the library inside the php application. + (each application has its structure so take your time to locate the + PHP SAML toolkit in the best place). See the "Guide to add SAML support + to my app" to know how. + + +Compatibility +------------- + +This 2.0 version has a new library. The toolkit is still compatible. + +The old code that you used in order to add SAML support gonna continue working +with minor changes. You only need to load the files of the lib/Saml folder. +(notice that the compatibility.php file do that). + +The old-demo folder contains code from an old app that uses the old version of +the toolkit (v.1). Take a look. + +Sometimes the names of the classes of the old code could be a bit different +and if is your case you must change them for OneLogin_Saml_Settings, +OneLogin_Saml_Response, OneLogin_Saml_AuthRequest or OneLogin_Saml_Metadata. + +We recommend that you migrate the old code to the new one to be able to use +the new features that the new library Saml2 carries. + + +Getting started +--------------- + +### Knowing the toolkit ### + +The new Onelogin SAML Toolkit contains different folders (certs, endpoints, +extlib, lib, demo, etc) and some files. + +Let's start describing the folders: + + +#### certs #### + +SAML requires a x.509 cert to sign and encrypt elements like NameID, Message, +Assertion, Metadata. + +If our environment requires sign or encrypt support, this folder may contain +the x.509 info that the SP will use: + + * **sp.crt** The public cert of the SP + * **sp.key** The privake key of the SP + +Sometimes we could need a signature on the metadata published by the SP, in +this case we could use the x.509 cert previously mentioned or use a new x.509 +cert: **metadata.crt** and **metadata.key**. + + +#### extlib #### + +This folder contains the 3rd party libraries that the toolkit uses. At the +moment only uses the xmlseclibs (autor Robert Richards, BSD Licensed) which +handle the sign and the encryption of xml elements. + + +#### lib #### + +This folder contains the heart of the toolkit, the libraries: + + * **Saml** folder contains a modified version of the toolkit v.1 and allows the + old code to keep working. (This library is provided to maintain + backward compatibility). + * **Saml2** folder contains the new version of the classes and methods that + are described in a later section. + + +#### doc #### + +This folder contains the API documentation of the toolkit. + + +#### endpoints #### + +The toolkit has 3 endpoints: + + * **metadata.php** - Where the metadata of the SP is published. + * **acs.php** - Assertion Consumer Service. Processes the SAML Responses. + * **sls.php** - Single Logout Service. Processes Logout Requests and Logout + Responses. + +You can use the files provided by the toolkit or create your own endpoints +files when adding SAML support to your applications. Take in mind that those +endpoints files uses the setting file of the toolkit's base folder. + + +#### locale #### + +Locale folder contains some translations: en_US and es_ES as a proof of concept +Currently there are no translations but we will eventually localize the messages +and support multiple languages. + + +#### Other important files #### + +* **settings_example_example.php** - A template to be used in order to create a + settings.php file which contains the basic configuration info of the toolkit. +* **advanced_settings_example.php** - A template to be used in order to create a + advanced_settings.php file which contains extra configuration info related to + the security, the contact person, and the organization associated to the SP. +* **_toolkit_loader.php** - This file load the toolkit libraries (The SAML2 lib). +* **compatibility** - Import that file to make compatible your old code with the + new toolkit. (loads the SAML library). + + +#### Miscellaneous #### + +* **tests** - Contains the unit test of the toolkit. +* **demo1** - Contains an example of a simple PHP app with SAML support. + Read the Readme.txt inside for more info. +* **demo2** - Contains another example. +* **demo-old** - Contains an example that uses the code of the older version of the + the toolkit to demonstrate the backwards compatibility. + + +### How it works ### + +#### Settings #### + +First of all we need to configure the toolkit. The SP's info, the IdP's info, +and in some cases, configure advanced security issues like signatures and +encryption. + +There are two ways to provide the settings information: + + * Use a settings.php file that we should locate at the base folder of the + toolkit. + * Use an array with the setting data and provide it directly to the + constructor of the class. + + +There is a template file, settings_example.php, so you can make a copy of this +file, rename and edit it. + +```php + false, + + // Enable debug mode (to print errors). + 'debug' => false, + + // Service Provider Data that we are deploying. + 'sp' => array ( + // Identifier of the SP entity (must be a URI) + 'entityId' => '', + // Specifies info about where and how the message MUST be + // returned to the requester, in this case our SP. + 'assertionConsumerService' => array ( + // URL Location where the from the IdP will be returned + 'url' => '', + // SAML protocol binding to be used when returning the + // message. Onelogin Toolkit supports this endpoint for the + // HTTP-Redirect binding only. + 'binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST', + ), + // Specifies info about where and how the message MUST be + // returned to the requester, in this case our SP. + 'singleLogoutService' => array ( + // URL Location where the from the IdP will be returned + 'url' => '', + // SAML protocol binding to be used when returning the + // message. Onelogin Toolkit supports the HTTP-Redirect binding + // only for this endpoint. + 'binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect', + ), + // Specifies the constraints on the name identifier to be used to + // represent the requested subject. + // Take a look on lib/Saml2/Constants.php to see the NameIdFormat supported. + 'nameIdFormat' => 'urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress', + ), + + // Identity Provider Data that we want connected with our SP. + 'idp' => array ( + // Identifier of the IdP entity (must be a URI) + 'entityId' => '', + // SSO endpoint info of the IdP. (Authentication Request protocol) + 'singleSignOnService' => array ( + // URL Target of the IdP where the Authentication Request Message + // will be sent. + 'url' => '', + // SAML protocol binding to be used when returning the + // message. Onelogin Toolkit supports the HTTP-Redirect binding + // only for this endpoint. + 'binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect', + ), + // SLO endpoint info of the IdP. + 'singleLogoutService' => array ( + // URL Location of the IdP where SLO Request will be sent. + 'url' => '', + // SAML protocol binding to be used when returning the + // message. Onelogin Toolkit supports the HTTP-Redirect binding + // only for this endpoint. + 'binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect', + ), + // Public x509 certificate of the IdP + 'x509cert' => '', + /* + * Instead of use the whole x509cert you can use a fingerprint + * (openssl x509 -noout -fingerprint -in "idp.crt" to generate it) + */ + // 'certFingerprint' => '', + ), +); +``` +In addition to the required settings data (idp, sp), there is extra +information that could be defined. In the same way that a template exists +for the basic info, there is a template for that advanced info located +at the base folder of the toolkit and named advanced_settings_example.php +that you can copy and rename it as advanced_settings.php + +```php + array ( + + /** signatures and encryptions offered */ + + // Indicates that the nameID of the sent by this SP + // will be encrypted. + 'nameIdEncrypted' => false, + + // Indicates whether the messages sent by this SP + // will be signed. [Metadata of the SP will offer this info] + 'authnRequestsSigned' => false, + + // Indicates whether the messages sent by this SP + // will be signed. + 'logoutRequestSigned' => false, + + // Indicates whether the messages sent by this SP + // will be signed. + 'logoutResponseSigned' => false, + + /* Sign the Metadata + False || True (use sp certs) || array ( + keyFileName => 'metadata.key', + certFileName => 'metadata.crt' + ) + */ + 'signMetadata' => false, + + + /** signatures and encryptions required **/ + + // Indicates a requirement for the , + // and elements received by this SP to be signed. + 'wantMessagesSigned' => false, + + // Indicates a requirement for the elements received by + // this SP to be signed. [Metadata of the SP will offer this info] + 'wantAssertionsSigned' => false, + + // Indicates a requirement for the NameID received by + // this SP to be encrypted. + 'wantNameIdEncrypted' => false, + ), + + // Contact information template, it is recommended to suply a + // technical and support contacts. + 'contactPerson' => array ( + 'technical' => array ( + 'givenName' => '', + 'emailAddress' => '' + ), + 'support' => array ( + 'givenName' => '', + 'emailAddress' => '' + ), + ), + + // Organization information template, the info in en_US lang is + // recomended, add more if required. + 'organization' => array ( + 'en-US' => array( + 'name' => '', + 'displayname' => '', + 'url' => '' + ), + ), +); +``` + +In the security section, you can set the way that the SP will handle the messages +and assertions. Contact the admin of the IdP and ask him what the IdP expects, +and decide what validations will handle the SP and what requirements the SP will have +and communicate them to the IdP's admin too. + +Once we know what kind of data could be configured, let's talk about the way +settings are handled within the toolkit. + +The settings files described (settings.php and advanced_settings.php) are loaded +by the toolkit if not other array with settings info is provided in the constructors of the toolkit. Let's see some examples. + +```php +// Initializes toolkit with settings.php & advanced_settings files. +$auth = new Onelogin_Saml2_Auth(); +//or +$settings = new Onelogin_Saml2_Settings(); + +// Initializes toolkit with the array provided. +$auth = new Onelogin_Saml2_Auth($settingsInfo); +//or +$settings = new Onelogin_Saml2_Settings($settingsInfo); +``` + +You can declare the $settingsInfo in the file that constains the constructor +execution or locate them in any file and load the file in order to get the +array available as we see in the following example: + +```php +login(); // Method that sent the AuthNRequest +``` + +The AuthNRequest will be sent signed or unsigned based on the security info +of the advanced_settings.php ('authnRequestsSigned'). + + +The IdP will return the response to the Attribute Consumer Service of the SP. If we do not set a 'url' param in +the login method and we are using the default ACS provided by the toolkit (endpoints/acs.php), then the ACS +endpoint will redirect the user to the file that launched the SSO request. + +We can set an 'returnTo' url to change the workflow and redirect the user to the other PHP file. + +```php +$newTargetUrl = 'http://example.com/consume2.php'; +$auth = new OneLogin_Saml_Auth(); +$auth->login($newTargetUrl); +``` + +#### The SP Endpoints #### + +Related to the SP there are 3 important views: The metadata view, the ACS view and the SLS view. The toolkit +provides examples of those views in the endpoints directory. + +##### SP Metadata endpoints/metadata.php ##### + +This code will provide the XML metadata file of our SP, based on the info that we provided in the settings files. + +```php +getSettings(); + $metadata = $settings->getSPMetadata(); + $errors = $settings->validateMetadata($metadata); + if (empty($errors)) { + header('Content-Type: text/xml'); + echo $metadata; + } else { + throw new Onelogin_Saml2_Error( + 'Invalid SP metadata: '.implode(', ', $errors), + Onelogin_Saml2_Error::METADATA_SP_INVALID + ); + } +} catch (Exception $e) { + echo $e->getMessage(); +} +``` +The getSPMetadata will return the metadata signed or not based +on the security info of the advanced_settings.php ('signMetadata'). + +Before the XML metadata is exposed, a validation takes place to ensure +that the info to be provided is authorized. + + +##### Attribute Consumer Service(ACS) endpoints/acs.php ##### + +This code handles the SAML response that the IdP returns to the SP. + +```php +processResponse(); + +$errors = $auth->getErrors(); + +if (!empty($errors)) { + print_r('

'.implode(', ', $errors).'

'); + exit(); +} + +if (!$auth->isAuthenticated()) { + echo "

Not authenticated

"; + exit(); +} + +$_SESSION['samlUserdata'] = $auth->getAttributes(); +if (isset($_POST['RelayState']) && Onelogin_Saml2_Utils::getSelfURL() != $_POST['RelayState']) { + $auth->redirectTo($_POST['RelayState']); +} + +$attributes = $_SESSION['samlUserdata']; + +if (!empty($attributes)) { + echo '

'._('User attributes:').'

'; + echo ''; + foreach ($attributes as $attributeName => $attributeValues) { + echo ''; + } + echo '
'._('Name').''._('Values').'
' . htmlentities($attributeName) . '
    '; + foreach ($attributeValues as $attributeValue) { + echo '
  • ' . htmlentities($attributeValue) . '
  • '; + } + echo '
'; +} else { + echo _('Attributes not found'); +} +``` + +The SAML response is processed and then checked that there are no errors. +It also verifies that the user is authenticated and stored the userdata in session. + +At that point there are 2 possible alternatives: + + 1. If no RelayState is provided, we could show the user data in this view + or however we wanted. + + 2. If RelayState is provided, a rediretion take place. + +Notice that we saved the user data in the session before the redirection to +have the user data available at the RelayState view. + + +###### The getAttributes method ###### + +In order to retrieve attributes we can use: + +```php +$attributes = $auth->getAttributes(); +``` + +With this method we get all the user data provided by the IdP in the Assertion +of the SAML Response. + +If we execute ```print_r($attributes)``` we could get: + +```php +Array +( + [cn] => Array + ( + [0] => Jhon + ) + [sn] => Array + ( + [0] => Doe + ) + [mail] => Array + ( + [0] => jhon.doe@example.com + ) + [groups] => Array + ( + [0] => users + [1] => members + ) +) +``` + +Each attribute name can be used as an index into $attributes to obtain the value. Every attribute value +is an array - a single-valued attribute is an array of a single element. + + +The following code is equivalent: + +```php +$attributes = $auth->getAttributes(); +print_r($attributes['cn']); +``` + +```php +print_r($auth->getAttribute('cn')); +``` + + +Before trying to get an attribute, check that the user is authenticated. If the user isn't +authenticated, an empty array will be returned. For example, if we call +to getAttributes before a $auth->processResponse, the getAttributes() will return +an empty array. + + +##### Single Logout Service (SLS) endpoints/sls.php ##### + +This code handles the Logout Request and the Logout Responses. + +```php +processSLO(); + +$errors = $auth->getErrors(); + +if (empty($errors)) { + print_r('Sucessfully logged out'); +} else { + print_r(implode(', ', $errors)); +} +``` + +If the SLS endpoints receives an Logout Request, the request is +validated, the session is closed and a Logout Response is sent +to the SLS endpoint of the idP. + +```php +// part of the processSLO method + +$logoutResponse = new OneLogin_Saml2_LogoutResponse($this->_settings, $_GET['SAMLResponse']); +if (!$logoutResponse->isValid($requestId)) { + $this->_errors[] = 'invalid_logout_response'; +} else if ($logoutResponse->getStatus() !== Onelogin_Saml2_Constants::STATUS_SUCCESS) { + $this->_errors[] = 'logout_not_success'; +} else { + if (!$keepLocalSession) { + OneLogin_Saml2_Utils::deleteLocalSession(); + } +} +``` + +If the SLS endpoints receives a Logout Response, the response is +validated and the session is closed, but if a RelayState is +provided a redirection take place. + +```php +// part of the processSLO method + +$decoded = base64_decode($_GET['SAMLRequest']); +$request = gzinflate($decoded); +if (!Onelogin_Saml2_LogoutRequest::isValid($this->_settings, $request)) { + $this->_errors[] = 'invalid_logout_request'; +} else { + if (!$keepLocalSession) { + OneLogin_Saml2_Utils::deleteLocalSession(); + } + + $inResponseTo = Onelogin_Saml2_LogoutRequest::getID($request); + $responseBuilder = new OneLogin_Saml2_LogoutResponse($this->_settings); + $responseBuilder->build($inResponseTo); + $logoutResponse = $responseBuilder->getResponse(); + + $parameters = array('SAMLResponse' => $logoutResponse); + if (isset($_GET['RelayState'])) { + $parameters['RelayState'] = $_GET['RelayState']; + } + + $security = $this->_settings->getSecurityData(); + if (isset($security['logoutResponseSigned']) && $security['logoutResponseSigned']) { + $signature = $this->buildResponseSignature($logoutResponse, $parameters['RelayState']); + $parameters['SigAlg'] = XMLSecurityKey::RSA_SHA1; + $parameters['Signature'] = $signature; + } + + $this->redirectTo($this->getSLOurl(), $parameters); +} +``` + +If we don't want that processSLO to destroy the session, pass a true +parameter to the processSLO method + +```php +$keepLocalSession = true, +$auth->processSLO($keepLocalSession); +``` + +#### Initiate SLO #### + +In order to send a Logout Request to the IdP: + +```php +logout(); // Method that sent the Logout Request. +``` + +The Logout Request will be sent signed or unsigned based on the security +info of the advanced_settings.php ('logoutRequestSigned'). + +The IdP will return the Logout Response to the Single Logout Service of the SP. +If we do not set an 'url' param in the logout method and are using the default SLS provided +by the toolkit (endpoints/sls.php), then the SLS endpoint will redirect the user to the file that launched the SLO request. + +We can set an 'returnTo' url to change the workflow and redirect the user to other php file. + +```php +$newTargetUrl = 'http://example.com/loggedOut.php'; +$auth = new OneLogin_Saml_Auth(); +$auth->logout($newTargetUrl); +``` + +#### Example of a view that initiates the SSO request and handles the response (is the acs target) #### + +We can code a unique file that initiates the SSO process, handle the response, get the attributes, initiate +the slo and processes the logout response. + +Note: Review the demo1 folder that contains that use case; in a later section we +explain the demo1 use case further in detail. + +```php +login(); +} else if (isset($_GET['sso2'])) { // Another SSO action + $returnTo = $spBaseUrl.'/demo1/attrs.php'; // but set a custom RelayState URL + $auth->login($returnTo); +} else if (isset($_GET['slo'])) { // SLO action. Will sent a Logout Request to IdP + $auth->logout(); +} else if (isset($_GET['acs'])) { // Assertion Consumer Service + $auth->processResponse(); // Process the Response of the IdP, get the + // attributes and put then at + // $_SESSION['samlUserdata'] + + $errors = $auth->getErrors(); // This method receives an array with the errors + // that could took place during the process + + if (!empty($errors)) { + print_r('

'.implode(', ', $errors).'

'); + } + // This check if the response was + if (!$auth->isAuthenticated()) { // sucessfully validated and the user + echo "

Not authenticated

"; // data retrieved or not + exit(); + } + + $_SESSION['samlUserdata'] = $auth->getAttributes(); // Retrieves user data + if (isset($_POST['RelayState']) && Onelogin_Saml2_Utils::getSelfURL() != $_POST['RelayState']) { + $auth->redirectTo($_POST['RelayState']); // Redirect if there is a + } // relayState set +} else if (isset($_GET['sls'])) { // Single Logout Service + $auth->processSLO(); // Process the Logout Request & Logout Response + $errors = $auth->getErrors(); // Retrieves possible validation errors + if (empty($errors)) { + print_r('

Sucessfully logged out

'); + } else { + print_r('

'.implode(', ', $errors).'

'); + } +} + +if (isset($_SESSION['samlUserdata'])) { // If there is user data we print it. + if (!empty($_SESSION['samlUserdata'])) { + $attributes = $_SESSION['samlUserdata']; + echo 'You have the following attributes:
'; + echo ''; + foreach ($attributes as $attributeName => $attributeValues) { + echo ''; + } + echo '
NameValues
' . htmlentities($attributeName) . '
    '; + foreach ($attributeValues as $attributeValue) { + echo '
  • ' . htmlentities($attributeValue) . '
  • '; + } + echo '
'; + } else { // If there is not user data, we notify + echo "

You don't have any attribute

"; + } + + echo '

Logout

'; // Print some links with possible +} else { // actions + echo '

Login

'; + echo '

Login and access to attrs.php page

'; +} +``` + +### Main classes and methods ### + +Described below are the main classes and methods that can be invoked. + +#### The Old Saml library #### + +Lets start describing the classes and methods of the SAML library, an evolution +of the old v.1 toolkit that is provided to keep the backward compability. +Most of them use classes and methods of the new SAML2 library. + +##### OneLogin_Saml_AuthRequest - AuthRequest.php ##### + +Has the protected attribute $auth, an Onelogin_Saml2_Auth object. + +* **OneLogin_Saml_AuthRequest**. Constructs the Onelogin_Saml2_Auth, + initializing the SP SAML instance. +* **getRedirectUrl($returnTo)**. Obtains the SSO URL containing the AuthRequest + message deflated. + + +##### OneLogin_Saml_Response - Response.php ##### + +* **OneLogin_Saml_Response**. Constructor that process the SAML Response, + Internally initializes an SP SAML instance and an OneLogin_Saml2_Response. +* **get_saml_attributes**. Retrieves an Array with the logged user data. + + +##### OneLogin_Saml_Settings - Settings.php ##### + +A simple class used to build the Setting object used in the v1.0 of the toolkit. + +##### OneLogin_Saml_Metadata - Metadata.php ##### + +* **OneLogin_Saml_Metadata** Constructor that build the Metadata XML info based + on the settings of the SP +* **getXml** An XML with the metadata info of the SP + + +##### OneLogin_Saml_XmlSec - XmlSec.php ##### + +Auxiliary class that contains methos to validate the SAML Response: +**validateNumAssertions**, **validateTimestamps**, **isValid** (whith +uses the other 2 previous methods and also validate the signature of +SAML Response). + + +#### Saml2 library #### + +Lets describe now the classes and methods of the SAML2 library. + +##### Onelogin_Saml2_Auth - Auth.php ##### + +Main class of OneLogin PHP Toolkit + + * **Onelogin_Saml2_Auth** Initializes the SP SAML instance + * **login** Initiates the SSO process. + * **logout** Initiates the SLO process. + * **processResponse** Process the SAML Response sent by the IdP. + * **processSLO** Process the SAML Logout Response / Logout Request sent by the + IdP. + * **redirectTo** Redirects the user to the url past by parameter or to the url + that we defined in our SSO Request. + * **isAuthenticated** Checks if the user is authenticated or not. + * **getAttributes** Returns the set of SAML attributes. + * **getAttribute** Returns the requested SAML attribute + * **getNameId** Returns the nameID + * **getErrors** Returns if there were any error + * **getSSOurl** Gets the SSO url. + * **getSLOurl** Gets the SLO url. + * **buildRequestSignature** Generates the Signature for a SAML Request + * **buildResponseSignature** Generates the Signature for a SAML Response + * **getSettings** Returns the settings info + * **setStrict** Set the strict mode active/disable + +##### Onelogin_Saml2_Auth - AuthnRequest.php ##### + +SAML 2 Authentication Request class + + * **Onelogin_Saml2_Auth** Constructs the AuthnRequest object. + * **getRequest** Returns deflated, base64 encoded, unsigned AuthnRequest. + +##### OneLogin_Saml2_Response - Response.php ##### + +SAML 2 Authentication Response class + + * **OneLogin_Saml2_Response** Constructs the SAML Response object. + * **isValid** Determines if the SAML Response is valid using the certificate. + * **checkStatus** Checks if the Status is success. + * **getAudiences** Gets the audiences. + * **getIssuers** Gets the Issuers (from Response and Assertion) + * **getNameIdData** Gets the NameID Data provided by the SAML response from the + IdP. + * **getNameId** Gets the NameID provided by the SAML response from the IdP. + * **getSessionNotOnOrAfter** Gets the SessionNotOnOrAfter from the + AuthnStatement + * **getSessionIndex** Gets the SessionIndex from the AuthnStatement. + * **getAttributes** Gets the Attributes from the AttributeStatement element. + * **validateNumAssertions** Verifies that the document only contains a single + Assertion (encrypted or not). + * **validateTimestamps** Verifies that the document is still valid according + Conditions Element. + +##### Onelogin_Saml2_LogoutRequest - LogoutRequest.php ##### + +SAML 2 Logout Request class + + * **Onelogin_Saml2_LogoutRequest** Constructs the Logout Request object. + * **getRequest** Returns the Logout Request defated, base64encoded, unsigned + * **getID** Returns the ID of the Logout Request. + * **getNameIdData** Gets the NameID Data of the the Logout Request. + * **getNameId** Gets the NameID of the Logout Request. + * **getIssuer** Gets the Issuer of the Logout Request. + * **getSessionIndexes** Gets the SessionIndexes from the Logout Request. + * **isValid** Checks if the Logout Request recieved is valid. + +##### OneLogin_Saml2_LogoutResponse - LogoutResponse.php ##### + +SAML 2 Logout Response class + + * **OneLogin_Saml2_LogoutResponse** Constructs a Logout Response object + (Initialize params from settings and if provided load the Logout Response) + * **getIssuer** Gets the Issuer of the Logout Response. + * **getStatus** Gets the Status of the Logout Response. + * **isValid** Determines if the SAML LogoutResponse is valid + * **build** Generates a Logout Response object. + * **getResponse** Returns a Logout Response object. + +##### Onelogin_Saml2_Settings - Settings.php ##### + +Configuration of the OneLogin PHP Toolkit + + * **Onelogin_Saml2_Settings** Initializes the settings: Sets the paths of + the different folders and Loads settings info from settings file or + array/object provided + * **checkSettings** Checks the settings info. + * **getBasePath** Returns base path. + * **getCertPath** Returns cert path. + * **getLibPath** Returns lib path. + * **getExtLibPath** Returns external lib path. + * **getSchemasPath** Returns schema path. + * **checkSPCerts** Checks if the x509 certs of the SP exists and are valid. + * **getSPkey** Returns the x509 private key of the SP. + * **getSPcert** Returns the x509 public cert of the SP. + * **getIdPData** Gets the IdP data. + * **getSPData**Gets the SP data. + * **getSecurityData** Gets security data. + * **getContacts** Gets contact data. + * **getOrganization** Gets organization data. + * **getSPMetadata** Gets the SP metadata. The XML representation. + * **validateMetadata** Validates an XML SP Metadata. + * **formatIdPCert** Formats the IdP cert. + * **getErrors** Returns an array with the errors, the array is empty when + the settings is ok. + * **setStrict** Activates or deactivates the strict mode. + * **isStrict** Returns if the 'strict' mode is active. + * **isDebugActive** Returns if the debug is active. + +##### OneLogin_Saml2_Metadata - Metadata.php ##### + +A class that contains functionality related to the metadata of the SP + +* **builder** Generates the metadata of the SP based on the settings. +* **signmetadata** Signs the metadata with the key/cert provided +* **addX509KeyDescriptors** Adds the x509 descriptors (sign/encriptation) to + the metadata + +##### OneLogin_Saml2_Utils - Utils.php ##### + +Auxiliary class that contains several methods + + * **validateXML** This function attempts to validate an XML string against + the specified schema. + * **formatCert** Returns a x509 cert (adding header & footer if required). + * **redirect** Executes a redirection to the provided url (or return the + target url). + * **isHTTPS** Checks if https or http. + * **getSelfHost** Returns the current host. + * **getSelfURLhost** Returns the protocol + the current host + the port + (if different than common ports). + * **getSelfURLNoQuery** Returns the URL of the current host + current view. + * **getSelfURL** Returns the URL of the current host + current view + query. + * **generateUniqueID** Generates an unique string (used for example as ID + for assertions). + * **parseTime2SAML** Converts a UNIX timestamp to SAML2 timestamp on the + form yyyy-mm-ddThh:mm:ss(\.s+)?Z. + * **parseSAML2Time** Converts a SAML2 timestamp on the form + yyyy-mm-ddThh:mm:ss(\.s+)?Z to a UNIX timestamp. The sub-second part is + ignored. + * **parseDuration** Interprets a ISO8601 duration value relative to a given + timestamp. + * **getExpireTime** Compares 2 dates and returns the earliest. + * **query** Extracts nodes from the DOMDocument. + * **isSessionStarted** Checks if the session is started or not. + * **deleteLocalSession** Deletes the local session. + * **calculateX509Fingerprint** Calculates the fingerprint of a x509cert. + * **formatFingerPrint** Formates a fingerprint. + * **generateNameId** Generates a nameID. + * **getStatus** Gets Status from a Response. + * **decryptElement** Decrypts an encrypted element. + * **addSign** Adds signature key and senders certificate to an element + (Message or Assertion). + * **validateSign** Validates a signature (Message or Assertion). + +For more info, look at the source code; each method is documented and details +about what does and how to use it are provided. Make sure to also check the doc folder where +HTML documentation about the classes and methods is provided for SAML and +SAML2. + + +Demos included in the toolkit +----------------------------- + +The toolkit includes 3 demo apps to teach how use the toolkit, take a look on it. + +Demos require that SP and IdP are well configured before test it. + +## Demo1 ## + +### SP setup ### + +The Onelogin's PHP Toolkit allows you to provide the settings info in 2 ways: + + * Use a settings.php file that we should locate at the base folder of the + toolkit. + * Use an array with the setting data. + +In this demo we provide the data in the second way, using a setting array named +$settingsInfo. This array users the settings_example.php included as a template +to create the settings.php settings and store it in the demo1 folder. +Configure the SP part and later review the metadata of the IdP and complete the IdP info. + +If you check the code of the index.php file you will see that the settings.php +file is loaded in order to get the $settingsInfo var to be used in order to initialize +the Setting class. + +Notice that in this demo, the setting.php file that could be defined at the base +folder of the toolkit is ignored and the libs are loaded using the +_toolkit_loader.php located at the base folder of the toolkit. + + +### IdP setup ### + +Once the SP is configured, the metadata of the SP is published at the +metadata.php file. After that, configure the IdP based on that information. + + +### How it works ### + + 1. First time you access to index.php view, you can select to login and return + to the same view or login and be redirected to the attrs.php view. + + 2. When you click: + + 2.1 in the first link, we access to (index.php?sso) an AuthNRequest + is sent to the IdP, we authenticate at the IdP and then a Response is sent + to the SP, specifically the Assertion Consumer Service view: index.php?acs, + notice that a RelayState parameter is set to the url that initiated the + process, the index.php view. + + 2.2 in the second link we access to (attrs.php) have the same process + described at 2.1 with the diference that as RelayState is set the attrs.php + +3. The SAML Response is processed in the ACS (index.php?acs), if the Response + is not valid, the process stops here and a message is shown. Otherwise we + are redirected to the RelayState view. a) index.php or b) attrs.php + +4. We are logged in the app and the user attributes are showed. + At this point, we can test the single log out functionality. + +5. The single log out funcionality could be tested by 2 ways. + + 5.1 SLO Initiated by SP. Click on the "logout" link at the SP, after that a + Logout Request is sent to the IdP, the session at the IdP is closed and + replies to the SP a Logout Response (sent to the Single Logout Service + endpoint). The SLS endpoint (index.php?sls)of the SP process the Logout + Response and if is valid, close the user session of the local app. Notice + that the SLO Workflow starts and ends at the SP. + + 5.2 SLO Initiated by IdP. In this case, the action takes place on the IdP + side, the logout process is initiated at the idP, sends a Logout + Request to the SP (SLS endpoint, index.php?sls). The SLS endpoint of the SP + process the Logout Request and if is valid, close the session of the user + at the local app and send a Logout Response to the IdP (to the SLS endpoint + of the IdP). The IdP receives the Logout Response, process it and close the + session at of the IdP. Notice that the SLO Workflow starts and ends at the IdP. + +Notice that all the SAML Requests and Responses are handled at a unique file, +the index.php file and how GET paramters are used to know the action that +must be done. + + +## Demo2 ## + +### SP setup ### + +The Onelogin's PHP Toolkit allows you to provide the settings info in 2 ways: + + * Use a settings.php file that we should locate at the base folder of the + toolkit. + * Use an array with the setting data. + +The first is the case of the demo2 app. The setting.php file and the +setting_extended.php file should be defined at the base folder of the toolkit. +Review the setting_example.php and the advanced_settings_example.php to +learn how to build them. + +In this case as Attribute Consume Service and Single Logout Service we are going to +use the files located in the endpoint folder (acs.php and sls.php). + + +### IdP setup ### + +Once the SP is configured, the metadata of the SP is published at the +metadata.php file. Based on that info, configure the IdP. + + +### How it works ### + +At demo1, we saw how all the SAML Request and Responses were handler at an +unique file, the index.php file. This demo1 uses hight-level programming. + +At demo2, we have several views: index.php, sso.php, slo.php, consume.php +and metadata.php. As we said, we gonna use the endpoints that are defined +in the toolkit (acs.php, sls.php of the endpoints folder). This demo2 uses +low-level programming. + +Notice that the SSO action can be initiated at index.php or sso.php. + +The SAML workflow that take place is similar that the workflow defined in the +demo1, only changes the targets. + + 1. When you access index.php or sso.php for the first time, an AuthNRequest is + sent to the IdP automatically, (as RelayState is sent the origin url). + We authenticate at the IdP and then a Response is sent to the SP, to the + ACS endpoint, in this case acs.php of the endpoints folder. + + 2. The SAML Response is processed in the ACS, if the Response is not valid, + the process stops here and a message is shown. Otherwise we are redirected + to the RelayState view (sso.php or index.php). The sso.php detects if the + user is logged and redirects to index.php, so we will be in the + index.php at the end. + + 3. We are logged into the app and the user attributes are shown. + At this point, we can test the single log out functionality. + + 4. The single log out funcionality could be tested by 2 ways. + + 4.1 SLO Initiated by SP. Click on the "logout" link at the SP, after that + we are redirected to the slo.php view and there a Logout Request is sent + to the IdP, the session at the IdP is closed and replies to the SP a + Logout Response (sent to the Single Logout Service endpoint). In this case + The SLS endpoint of the SP process the Logout Response and if is + valid, close the user session of the local app. Notice that the SLO + Workflow starts and ends at the SP. + + 5.2 SLO Initiated by IdP. In this case, the action takes place on the IdP + side, the logout process is initiated at the idP, sends a Logout + Request to the SP (SLS endpoint sls.php of the endpoint folder). + The SLS endpoint of the SP process the Logout Request and if is valid, + close the session of the user at the local app and sends a Logout Response + to the IdP (to the SLS endpoint of the IdP).The IdP receives the Logout + Response, process it and close the session at of the IdP. Notice that the + SLO Workflow starts and ends at the IdP. + + +## Demo Old ## + +### SP setup ### + +This demo uses the old style of the version 1 of the toolkit. +An object of the class OneLogin_Saml_Settings must be provided to the +constructor of the AuthRequest. + +You will find an example_settings.php file at the demo-old's folder that +could be used as a template for you settings.php file. + +In that template, SAML settings are divided into two parts, the application +specific (const_assertion_consumer_service_url, const_issuer, +const_name_identifier_format) and the user/account specific +idp_sso_target_url, x509certificate). You’ll need to add your own code here +to identify the user or user origin (e.g. by subdomain, ip_address etc.). + + +### IdP setup ### + +Once the SP is configured, the metadata of the SP is published at the +metadata.php file. After that, configure the IdP based on that information. + + +### How it works ### + +At the metadata.php view is published the metadata of the SP. + +The index.php file acts as an initiater for the SAML conversation if it should +should be initiated by the application. This is called Service Provider +Initiated SAML. The service provider creates a SAML Authentication Request and +sends it to the identity provider (IdP). + +The consume.php is the ACS endpoint. Receives the SAML assertion. After Response +validation, the userdata and the nameID will be available, using getNameId() or +getAttributes() we obtain them. + + +Since the version 1 of the php toolkit does not support SLO we don't show how +handle SLO in this demo-old. \ No newline at end of file diff --git a/_toolkit_loader.php b/_toolkit_loader.php new file mode 100644 index 00000000..1af21e9b --- /dev/null +++ b/_toolkit_loader.php @@ -0,0 +1,25 @@ + array ( + + /** signatures and encryptions offered */ + + // Indicates that the nameID of the sent by this SP + // will be encrypted. + 'nameIdEncrypted' => false, + + // Indicates whether the messages sent by this SP + // will be signed. [The Metadata of the SP will offer this info] + 'authnRequestsSigned' => false, + + // Indicates whether the messages sent by this SP + // will be signed. + 'logoutRequestSigned' => false, + + // Indicates whether the messages sent by this SP + // will be signed. + 'logoutResponseSigned' => false, + + /* Sign the Metadata + False || True (use sp certs) || array ( + keyFileName => 'metadata.key', + certFileName => 'metadata.crt' + ) + */ + 'signMetadata' => false, + + + /** signatures and encryptions required **/ + + // Indicates a requirement for the , and + // elements received by this SP to be signed. + 'wantMessagesSigned' => false, + + // Indicates a requirement for the elements received by + // this SP to be signed. [The Metadata of the SP will offer this info] + 'wantAssertionsSigned' => false, + + // Indicates a requirement for the NameID received by + // this SP to be encrypted. + 'wantNameIdEncrypted' => false, + ), + + // Contact information template, it is recommended to suply a technical and support contacts + 'contactPerson' => array ( + 'technical' => array ( + 'givenName' => '', + 'emailAddress' => '' + ), + 'support' => array ( + 'givenName' => '', + 'emailAddress' => '' + ), + ), + + // Organization information template, the info in en_US lang is recomended, add more if required + 'organization' => array ( + 'en-US' => array( + 'name' => '', + 'displayname' => '', + 'url' => '' + ), + ), +); + + +/* Interoperable SAML 2.0 Web Browser SSO Profile [saml2int] http://saml2int.org/profile/current + + 'authnRequestsSigned' => false, // SP SHOULD NOT sign the , + // MUST NOT assume that the IdP validates the sign + 'wantAssertionsSigned' => true, + 'wantAssertionsEncrypted' => true, // MUST be enabled if SSL/HTTPs is disabled + 'wantNameIdEncrypted' => false, +*/ \ No newline at end of file diff --git a/compatibility.php b/compatibility.php new file mode 100644 index 00000000..02a8108c --- /dev/null +++ b/compatibility.php @@ -0,0 +1,12 @@ +=5.3.2" + }, + "suggest": { + "ext-openssl": "Install openssl lib in order to handle with x509 certs (require to support sign and encryption)", + "ext-mcrypt": "Install mcrypt and php5-mcrypt libs in order to support encryption" + } +} diff --git a/demo-old/Readme.txt b/demo-old/Readme.txt new file mode 100644 index 00000000..32d0c28c --- /dev/null +++ b/demo-old/Readme.txt @@ -0,0 +1,43 @@ +The example requires that SP and IdP are well configured before test it. + +SP setup +-------- + +This demo uses the old style of the version 1 of the toolkit. +An object of the class OneLogin_Saml_Settings must be provided to the +constructor of the AuthRequest. + +You will find an example_settings.php file at the demo-old's folder that +could be used as a template for you settings.php file. + +In that template, SAML settings are divided into two parts, the application +specific (const_assertion_consumer_service_url, const_issuer, +const_name_identifier_format) and the user/account specific +idp_sso_target_url, x509certificate). You’ll need to add your own code here +to identify the user or user origin (e.g. by subdomain, ip_address etc.). + + +IdP setup +--------- + +Once the SP is configured, the metadata of the SP is published at the +metadata.php file. Based on that info, configure the IdP. + + +How it works +------------ + +At the metadata.php view is published the metadata of the SP. + +The index.php file acts as an initiater for the SAML conversation, if it should +should be initiated by the application. This is called Service Service Provider +Initiated SAML. The service provider creates a SAML Authentication Request and +sends it to the identity provider (IdP). + +The consume.php is the ACS endpoint. Receives the SAML assertion. After Response +validation, the userdata and the nameID will be available, using getNameId() or +getAttributes() we obtain them. + + +Since the version 1 of the php toolkit does not support SLO we don't show how +handle SLO in this demo-old. diff --git a/demo/consume.php b/demo-old/consume.php similarity index 76% rename from demo/consume.php rename to demo-old/consume.php index b2a93d49..cd4beacf 100644 --- a/demo/consume.php +++ b/demo-old/consume.php @@ -9,7 +9,7 @@ error_reporting(E_ALL); -$settings = NULL; +$settings = null; require 'settings.php'; $samlResponse = new OneLogin_Saml_Response($settings, $_POST['SAMLResponse']); @@ -23,18 +23,17 @@ echo ''; foreach ($attributes as $attributeName => $attributeValues) { echo ''; } - echo '
NameValues
' . htmlentities($attributeName) . '
    '; - foreach ($attributeValues as $attributeValue) { - echo '
  • ' . htmlentities($attributeValue) . '
  • '; - } + foreach ($attributeValues as $attributeValue) { + echo '
  • ' . htmlentities($attributeValue) . '
  • '; + } echo '
'; + echo '

'; + echo "The v.1 of the Onelogin's PHP SAML Tookit does not support SLO."; } - } - else { + } else { echo 'Invalid SAML response.'; } -} -catch (Exception $e) { +} catch (Exception $e) { echo 'Invalid SAML response: ' . $e->getMessage(); } diff --git a/demo/index.php b/demo-old/index.php similarity index 91% rename from demo/index.php rename to demo-old/index.php index d163defb..2854de3d 100755 --- a/demo/index.php +++ b/demo-old/index.php @@ -10,10 +10,10 @@ error_reporting(E_ALL); -$settings = NULL; +$settings = null; require 'settings.php'; $authRequest = new OneLogin_Saml_AuthRequest($settings); $url = $authRequest->getRedirectUrl(); -header("Location: $url"); \ No newline at end of file +header("Location: $url"); diff --git a/demo/metadata.php b/demo-old/metadata.php similarity index 88% rename from demo/metadata.php rename to demo-old/metadata.php index 7ebd3eeb..e6bd99e5 100644 --- a/demo/metadata.php +++ b/demo-old/metadata.php @@ -8,10 +8,10 @@ error_reporting(E_ALL); -$settings = NULL; +$settings = null; require 'settings.php'; header('Content-Type: text/xml'); $samlMetadata = new OneLogin_Saml_Metadata($settings); -echo $samlMetadata->getXml(); \ No newline at end of file +echo $samlMetadata->getXml(); diff --git a/demo-old/settings_example.php b/demo-old/settings_example.php new file mode 100644 index 00000000..f33ba94f --- /dev/null +++ b/demo-old/settings_example.php @@ -0,0 +1,54 @@ +idpSingleSignOnUrl = ''; +// Initiate the SLO process, This URL asks the IdP to SLO the user. +$settings->idpSingleLogOutUrl = ''; + +// The certificate for the users account in the IdP +$settings->idpPublicCertificate = ''; + +// The URL where to the SAML Response/SAML Assertion will be posted +$settings->spReturnUrl = ''; + +// Name of this application +$settings->spIssuer = ''; + +// Tells the IdP to return the email address of the current user +$settings->requestedNameIdFormat = OneLogin_Saml_Settings::NAMEID_EMAIL_ADDRESS; + +return $settings; diff --git a/demo/settings.php b/demo/settings.php deleted file mode 100644 index d3b268dc..00000000 --- a/demo/settings.php +++ /dev/null @@ -1,60 +0,0 @@ -idpSingleSignOnUrl = 'https://app.onelogin.com/saml/signon/6171'; - -// The certificate for the users account in the IdP -$settings->idpPublicCertificate = <<spReturnUrl = 'http://localhost/php-saml/consume.php'; - -// Name of this application -$settings->spIssuer = 'php-saml'; - -// Tells the IdP to return the email address of the current user -$settings->requestedNameIdFormat = OneLogin_Saml_Settings::NAMEID_EMAIL_ADDRESS; - -return $settings; \ No newline at end of file diff --git a/demo1/Readme.txt b/demo1/Readme.txt new file mode 100644 index 00000000..1493b353 --- /dev/null +++ b/demo1/Readme.txt @@ -0,0 +1,76 @@ +The example requires that SP and IdP are well configured before test it. + +SP setup +-------- + +The Onelogin's PHP Toolkit allows you to provide the settings info in 2 ways: + * Use a settings.php file that we should locate at the base folder of the + toolkit. + * Use an array with the setting data. + +In this demo we provide the data in the second way, using a setting array named + +Uses the settings_example.php included as a template to create the settings.php +settings and store it in the demo1 folder. Configure the SP part and later +review the metadata of the IdP and complete the IdP info. + +If you check the code of the index.php file you will see that the settings.php +file is loaded in order to get the $settingsInfo var to be used to initialize +the Setting class. + +Notice that in this demo, the setting.php file that could be defined at the base +folder of the toolkit is ignored and the libs are loaded using the +_toolkit_loader.php located at the base folder of the toolkit. + + +IdP setup +--------- + +Once the SP is configured, the metadata of the SP is published at the +metadata.php file. Based on that info, configure the IdP. + + +How it works +------------ + + 1. First time you access to index.php view, you can select to login and return + to the same view or login and be redirected to the attrs.php view. + + 2. When you click: + + 2.1 in the first link, we access to (index.php?sso) an AuthNRequest + is sent to the IdP, we authenticate at the IdP and then a Response is sent + to the SP, specifically the Assertion Consumer Service view: index.php?acs, + notice that a RelayState parameter is set to the url that initiated the + process, the index.php view. + + 2.2 in the second link we access to (attrs.php) have the same process + described at 2.1 with the diference that as RelayState is set the attrs.php + +3. The SAML Response is processed in the ACS (index.php?acs), if the Response + is not valid, the process stop here and a message is showed. Otherwise we + are redirected to the RelayState view. a) index.php or b) attrs.php + +4. We are logged in the app and the user attributes are showed. + At this point, we can test the single log out functionality. + +5. The single log out funcionality could be tested by 2 ways. + + 5.1 SLO Initiated by SP. Click on the "logout" link at the SP, after that a + Logout Request is sent to the IdP, the session at the IdP is closed and + replies to the SP a Logout Response (sent to the Single Logout Service + endpoint). The SLS endpoint (index.php?sls)of the SP process the Logout + Response and if is valid, close the user session of the local app. Notice + that the SLO Workflow starts and ends at the SP. + + 5.2 SLO Initiated by IdP. In this case, the action takes place on the IdP + side, the logout process is initiated at the idP, sends a Logout + Request to the SP (SLS endpoint, index.php?sls). The SLS endpoint of the SP + process the Logout Request and if is valid, close the session of the user + at the local app and send a Logout Response to the IdP (to the SLS endpoint + of the IdP). The IdP recieve the Logout Response, process it and close the + session at of the IdP. Notice that the SLO Workflow starts and ends at the IdP. + +Notice that all the SAML Requests and Responses are handler at a unique file, +the index.php file and how GET paramters are used to know the action that +must be done. diff --git a/demo1/attrs.php b/demo1/attrs.php new file mode 100644 index 00000000..9905e61a --- /dev/null +++ b/demo1/attrs.php @@ -0,0 +1,25 @@ +'; + echo ''; + foreach ($attributes as $attributeName => $attributeValues) { + echo ''; + } + echo '
NameValues
' . htmlentities($attributeName) . '
    '; + foreach ($attributeValues as $attributeValue) { + echo '
  • ' . htmlentities($attributeValue) . '
  • '; + } + echo '
'; + } else { + echo "

You don't have any attribute

"; + } + + echo '

Logout

'; +} else { + echo '

Login and access later to this page

'; +} diff --git a/demo1/index.php b/demo1/index.php new file mode 100644 index 00000000..f544bb47 --- /dev/null +++ b/demo1/index.php @@ -0,0 +1,71 @@ +login(); +} else if (isset($_GET['sso2'])) { + $returnTo = $spBaseUrl.'/demo1/attrs.php'; + $auth->login($returnTo); +} else if (isset($_GET['slo'])) { + $auth->logout(); +} else if (isset($_GET['acs'])) { + $auth->processResponse(); + + $errors = $auth->getErrors(); + + if (!empty($errors)) { + print_r('

'.implode(', ', $errors).'

'); + } + + if (!$auth->isAuthenticated()) { + echo "

Not authenticated

"; + exit(); + } + + $_SESSION['samlUserdata'] = $auth->getAttributes(); + if (isset($_POST['RelayState']) && Onelogin_Saml2_Utils::getSelfURL() != $_POST['RelayState']) { + $auth->redirectTo($_POST['RelayState']); + } +} else if (isset($_GET['sls'])) { + $auth->processSLO(); + $errors = $auth->getErrors(); + if (empty($errors)) { + print_r('

Sucessfully logged out

'); + } else { + print_r('

'.implode(', ', $errors).'

'); + } +} + +if (isset($_SESSION['samlUserdata'])) { + if (!empty($_SESSION['samlUserdata'])) { + $attributes = $_SESSION['samlUserdata']; + echo 'You have the following attributes:
'; + echo ''; + foreach ($attributes as $attributeName => $attributeValues) { + echo ''; + } + echo '
NameValues
' . htmlentities($attributeName) . '
    '; + foreach ($attributeValues as $attributeValue) { + echo '
  • ' . htmlentities($attributeValue) . '
  • '; + } + echo '
'; + } else { + echo "

You don't have any attribute

"; + } + + echo '

Logout

'; +} else { + echo '

Login

'; + echo '

Login and access to attrs.php page

'; +} diff --git a/demo1/metadata.php b/demo1/metadata.php new file mode 100644 index 00000000..57a07499 --- /dev/null +++ b/demo1/metadata.php @@ -0,0 +1,27 @@ +getSettings(); + $metadata = $settings->getSPMetadata(); + $errors = $settings->validateMetadata($metadata); + if (empty($errors)) { + header('Content-Type: text/xml'); + echo $metadata; + } else { + throw new Onelogin_Saml2_Error( + 'Invalid SP metadata: '.implode(', ', $errors), + Onelogin_Saml2_Error::METADATA_SP_INVALID + ); + } +} catch (Exception $e) { + echo $e->getMessage(); +} diff --git a/demo1/settings_example.php b/demo1/settings_example.php new file mode 100644 index 00000000..c2339cdc --- /dev/null +++ b/demo1/settings_example.php @@ -0,0 +1,26 @@ +'; //or http:// + + $settingsInfo = array ( + 'sp' => array ( + 'entityId' => $spBaseUrl.'/demo1/metadata.php', + 'assertionConsumerService' => array ( + 'url' => $spBaseUrl.'/demo1/index.php?acs', + ), + 'singleLogoutService' => array ( + 'url' => $spBaseUrl.'/demo1/index.php?sls', + ), + 'NameIDFormat' => 'urn:oasis:names:tc:SAML:2.0:nameid-format:unspecified', + ), + 'idp' => array ( + 'entityId' => '', + 'singleSignOnService' => array ( + 'url' => '', + ), + 'singleLogoutService' => array ( + 'url' => '', + ), + 'x509cert' => '', + ), + ); diff --git a/demo2/Readme.txt b/demo2/Readme.txt new file mode 100644 index 00000000..b969e670 --- /dev/null +++ b/demo2/Readme.txt @@ -0,0 +1,76 @@ +The example requires that SP and IdP are well configured before test it. + +SP setup +-------- + +The Onelogin's PHP Toolkit allows you to provide the settings info in 2 ways: + * Use a settings.php file that we should locate at the base folder of the + toolkit. + * Use an array with the setting data. + +The first is the case of the demo2 app. The setting.php file and the +setting_extended.php file should be defined at the base folder of the toolkit. +Review the setting_example.php and the advanced_settings_example.php to +learn how to build them. + +In this case as Attribute Consume Service and Single Logout Service we gonna +use the files located in the endpoint folder (acs.php and sls.php). + +IdP setup +--------- + +Once the SP is configured, the metadata of the SP is published at the +metadata.php file. Based on that info, configure the IdP. + + +How it works +------------ + +At demo1, we saw how all the SAML Request and Responses were handler at an +unique file, the index.php file. This demo1 uses hight-level programming. + +At demo2, we have several views: index.php, sso.php, slo.php, consume.php +and metadata.php. As we said, we gonna use the endpoints that are defined +in the toolkit (acs.php, sls.php of the endpoints folder). This demo2 uses +low-level programming. + +Notice that the SSO action can be initiated at index.php or sso.php. + +The SAML workflow that take place is similar that the workflow defined in the +demo1, only changes the targets. + + + 1. When you first time access to index.php or sso.php, an AuthNRequest is + sent to the IdP automatically, (as RelayState is sent the origin url). + We authenticate at the IdP and then a Response is sent to the SP, to the + ACS endpoint, in this case acs.php of the endpoints folder. + + 2. The SAML Response is processed in the ACS, if the Response is not valid, + the process stop here and a message is showed. Otherwise we are redirected + to the RelayState view (sso.php or index.php). The sso.php detect if the + user is logged and do a redirect to index.php, so we will be in the + index.php at the end. + + 3. We are logged in the app and the user attributes are showed. + At this point, we can test the single log out functionality. + + 4. The single log out funcionality could be tested by 2 ways. + + 4.1 SLO Initiated by SP. Click on the "logout" link at the SP, after that + we are redirected to the slo.php view and there a Logout Request is sent + to the IdP, the session at the IdP is closed and replies to the SP a + Logout Response (sent to the Single Logout Service endpoint). In this case + The SLS endpoint of the SP process the Logout Response and if is + valid, close the user session of the local app. Notice that the SLO + Workflow starts and ends at the SP. + + 5.2 SLO Initiated by IdP. In this case, the action takes place on the IdP + side, the logout process is initiated at the idP, sends a Logout + Request to the SP (SLS endpoint sls.php of the endpoint folder). + The SLS endpoint of the SP process the Logout Request and if is valid, + close the session of the user at the local app and sends a Logout Response + to the IdP (to the SLS endpoint of the IdP).The IdP recieves the Logout + Response, process it and close the session at of the IdP. Notice that the + SLO Workflow starts and ends at the IdP. + + diff --git a/demo2/consume.php b/demo2/consume.php new file mode 100644 index 00000000..5b324f3e --- /dev/null +++ b/demo2/consume.php @@ -0,0 +1,40 @@ +isValid()) { + echo 'You are: ' . $samlResponse->getNameId() . '
'; + $attributes = $samlResponse->getAttributes(); + if (!empty($attributes)) { + echo 'You have the following attributes:
'; + echo ''; + foreach ($attributes as $attributeName => $attributeValues) { + echo ''; + } + echo '
NameValues
' . htmlentities($attributeName) . '
    '; + foreach ($attributeValues as $attributeValue) { + echo '
  • ' . htmlentities($attributeValue) . '
  • '; + } + echo '
'; + } + } else { + echo 'Invalid SAML Response'; + } + } else { + echo 'No SAML Response found in POST.'; + } +} catch (Exception $e) { + echo 'Invalid SAML Response: ' . $e->getMessage(); +} diff --git a/demo2/index.php b/demo2/index.php new file mode 100755 index 00000000..b08251ce --- /dev/null +++ b/demo2/index.php @@ -0,0 +1,45 @@ +getRequest(); + + $parameters = array('SAMLRequest' => $samlRequest); + $parameters['RelayState'] = Onelogin_Saml2_Utils::getSelfURLNoQuery(); + + $idpData = $settings->getIdPData(); + $ssoUrl = $idpData['singleSignOnService']['url']; + $url = Onelogin_Saml2_Utils::redirect($ssoUrl, $parameters, true); + + header("Location: $url"); +} else { + if (!empty($_SESSION['samlUserdata'])) { + $attributes = $_SESSION['samlUserdata']; + echo 'You have the following attributes:
'; + echo ''; + foreach ($attributes as $attributeName => $attributeValues) { + echo ''; + } + echo '
NameValues
' . htmlentities($attributeName) . '
    '; + foreach ($attributeValues as $attributeValue) { + echo '
  • ' . htmlentities($attributeValue) . '
  • '; + } + echo '
'; + } else { + echo "

You don't have any attribute

"; + } + echo '

Logout

'; +} diff --git a/demo2/metadata.php b/demo2/metadata.php new file mode 100644 index 00000000..35274370 --- /dev/null +++ b/demo2/metadata.php @@ -0,0 +1,19 @@ +getSPData(); + +$samlMetadata = OneLogin_Saml2_Metadata::builder($sp); +echo $samlMetadata; diff --git a/demo2/slo.php b/demo2/slo.php new file mode 100644 index 00000000..8e27fddd --- /dev/null +++ b/demo2/slo.php @@ -0,0 +1,27 @@ +getIdPData(); +if (isset($idpData['singleLogoutService']) && isset($idpData['singleLogoutService']['url'])) { + $sloUrl = $idpData['singleLogoutService']['url']; +} else { + throw new Exception("The IdP does not support Single Log Out"); +} + +$logoutRequest = new Onelogin_Saml2_LogoutRequest($settings); +$samlRequest = $logoutRequest->getRequest(); + +$parameters = array('SAMLRequest' => $samlRequest); + +$url = Onelogin_Saml2_Utils::redirect($sloUrl, $parameters, true); + +header("Location: $url"); diff --git a/demo2/sso.php b/demo2/sso.php new file mode 100644 index 00000000..6b36f510 --- /dev/null +++ b/demo2/sso.php @@ -0,0 +1,22 @@ +login(); +} else { + $indexUrl = str_replace('/sso.php', '/index.php', Onelogin_Saml2_Utils::getSelfURLNoQuery()); + Onelogin_Saml2_Utils::redirect($indexUrl); +} diff --git a/docs/Onelogin_PHPToolkit_Guide.pdf b/docs/Onelogin_PHPToolkit_Guide.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e985c7677295ebce713f7b21b0f62081f0b96231 GIT binary patch literal 106036 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

i8QTI+knzd=vW~FW0cD`xbwr!i0S!q?; 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 z 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 X?X+#|{2ZNellkqPJXJ literal 0 HcmV?d00001 diff --git a/docs/Saml/classes.svg b/docs/Saml/classes.svg new file mode 100644 index 00000000..0cb80cf4 --- /dev/null +++ b/docs/Saml/classes.svg @@ -0,0 +1,59 @@ + + + + + + +G + +cluster_Global + + + + + + + + +Global + + +\\OneLogin_Saml_Response + +OneLogin_Saml_Response + + +\\OneLogin_Saml2_Response + +\OneLogin_Saml2_Response + + +\\OneLogin_Saml_Response->\\OneLogin_Saml2_Response + + + + +\\OneLogin_Saml_Metadata + +OneLogin_Saml_Metadata + + +\\OneLogin_Saml_AuthRequest + +OneLogin_Saml_AuthRequest + + +\\OneLogin_Saml_Settings + +OneLogin_Saml_Settings + + +\\OneLogin_Saml_XmlSec + +OneLogin_Saml_XmlSec + + + diff --git a/docs/Saml/classes/OneLogin_Saml_AuthRequest.html b/docs/Saml/classes/OneLogin_Saml_AuthRequest.html new file mode 100644 index 00000000..256c8722 --- /dev/null +++ b/docs/Saml/classes/OneLogin_Saml_AuthRequest.html @@ -0,0 +1,370 @@ + + + + + + Onelogin's SAML PHP Toolkit » \OneLogin_Saml_AuthRequest + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+ + +
+
+ + + + +
+ + + + +
+ +
+
+

OneLogin_Saml_AuthRequest

+ + +

+
+
+ +
+ +
+ +

Methods

+ +
+

Constructs the Onelogin_Saml2_Auth, initializing +the SP SAML instance.

+
__construct(\OneLogin_Saml2_Settings $settings) 
+
+
+
+
+
+ + + + + + + + + + +
+ + +
+ + +
+ +

Arguments

+
+

$settings

+ \OneLogin_Saml2_Settings

Settings

+
+ +
+
+
+ +
+

Obtains the SSO URL containing the AuthRequest +message deflated.

+
getRedirectUrl($returnTo = null) 
+
+
+
+
+
+ + + + + + + + + + +
+ + +
+ + +
+ +

Arguments

+
+

$returnTo

+

+
+ +
+
+
+ +
+

_generateUniqueID

+
_generateUniqueID() 
+
+
+
+
+
+ + + + + + + + + + + + + + +
+ + +
+ + +
+ + +
+ + +
+
+
+ +
+

_getTimestamp

+
_getTimestamp() 
+
+
+
+
+
+ + + + + + + + + + + + + + +
+ + +
+ + +
+ + +
+ + +
+
+
+ + +

Properties

+ +
+

object

+
auth : \Onelogin_Saml2_Auth
+
+
+
+
+
+ + + + + + + + + + +
+ var + +

object

+
+ + +
+ +

Type(s)

+ \Onelogin_Saml2_Auth +
+
+
+
+
+ + +
+
+ +
+ + + + diff --git a/docs/Saml/classes/OneLogin_Saml_Metadata.html b/docs/Saml/classes/OneLogin_Saml_Metadata.html new file mode 100644 index 00000000..2441c4c1 --- /dev/null +++ b/docs/Saml/classes/OneLogin_Saml_Metadata.html @@ -0,0 +1,361 @@ + + + + + + Onelogin's SAML PHP Toolkit » \OneLogin_Saml_Metadata + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+ + +
+
+ + + + +
+ + + + +
+ +
+
+

OneLogin_Saml_Metadata

+ + +

+
+
+ +
+ +
+ +

Methods

+ +
+

__construct

+
__construct($settings = null) 
+
+
+
+
+
+ + + + + + + + + + + + + + +
+ + +
+ + +
+ + +
+ +

Arguments

+
+

$settings

+

+
+ +
+
+
+ +
+

getXml

+
getXml() 
+
+
+
+
+
+ + + + + + + + + + + + + + +
+ + +
+ + +
+ + +
+ + +
+
+
+ +
+

_getMetadataValidTimestamp

+
_getMetadataValidTimestamp() 
+
+
+
+
+
+ + + + + + + + + + + + + + +
+ + +
+ + +
+ + +
+ + +
+
+
+ +

Constants

+ +
+

VALIDITY_SECONDS

+
VALIDITY_SECONDS
+
+
+
+
+
+ + + + + + + + + +
+ + +
+ + +
+
+
+
+ +

Properties

+ +
+

_settings

+
_settings : 
+
+
+
+
+
+ + + + + + + + + + +
+ + +
+ + +
+ +
+
+
+
+
+ + +
+
+ +
+ + + + diff --git a/docs/Saml/classes/OneLogin_Saml_Response.html b/docs/Saml/classes/OneLogin_Saml_Response.html new file mode 100644 index 00000000..5bea4773 --- /dev/null +++ b/docs/Saml/classes/OneLogin_Saml_Response.html @@ -0,0 +1,301 @@ + + + + + + Onelogin's SAML PHP Toolkit » \OneLogin_Saml_Response + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+ + +
+
+ + + + +
+ + + + +
+ +
+
+

OneLogin_Saml_Response

+ + Extends \OneLogin_Saml2_Response + +

+
+
+ +
+ +
+ +

Methods

+ +
+

Constructor that process the SAML Response, +Internally initializes an SP SAML instance +and an OneLogin_Saml2_Response.

+
__construct(\OneLogin_Saml_Settings $oldSettings, $assertion) 
+
+
+
+
+
+ + + + + + + + + + +
+ + +
+ + +
+ +

Arguments

+
+

$oldSettings

+ \OneLogin_Saml_Settings

Settings

+
+
+

$assertion

+

+
+ +
+
+
+ +
+

Retrieves an Array with the logged user data.

+
get_saml_attributes() 
+
+
+
+
+
+ + + + + + + + + + + + + + +
+ + +
+ + +
+ + +
+ + +
+
+
+ +
+

Retrieves the nameId

+
get_nameid() 
+
+
+
+
+
+ + + + + + + + + + + + + + +
+ + +
+ + +
+ + +
+ + +
+
+
+ + +
+
+ + +
+
+ +
+ + + + diff --git a/docs/Saml/classes/OneLogin_Saml_Settings.html b/docs/Saml/classes/OneLogin_Saml_Settings.html new file mode 100644 index 00000000..b2e65eaf --- /dev/null +++ b/docs/Saml/classes/OneLogin_Saml_Settings.html @@ -0,0 +1,635 @@ + + + + + + Onelogin's SAML PHP Toolkit » \OneLogin_Saml_Settings + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+ + +
+
+ + + + +
+ + + + +
+ +
+
+

OneLogin_Saml_Settings

+ + +

Holds SAML settings for the SamlResponse and SamlAuthRequest classes.

+
+
+

These settings need to be filled in by the user prior to being used.

+
+ +
+ +

Methods

+ +
+

Return an Array with the values (compatibility with the new version)

+
getValues() 
+
+
+
+
+
+ + + + + + + + + + + + + + +
+ + +
+ + +
+ + +
+ + +
+
+
+ +

Constants

+ +
+

NAMEID_EMAIL_ADDRESS

+
NAMEID_EMAIL_ADDRESS
+
+
+
+
+
+ + + + + + + + + +
+ + +
+ + +
+
+
+
+ +
+

NAMEID_X509_SUBJECT_NAME

+
NAMEID_X509_SUBJECT_NAME
+
+
+
+
+
+ + + + + + + + + +
+ + +
+ + +
+
+
+
+ +
+

NAMEID_WINDOWS_DOMAIN_QUALIFIED_NAME

+
NAMEID_WINDOWS_DOMAIN_QUALIFIED_NAME
+
+
+
+
+
+ + + + + + + + + +
+ + +
+ + +
+
+
+
+ +
+

NAMEID_KERBEROS

+
NAMEID_KERBEROS
+
+
+
+
+
+ + + + + + + + + +
+ + +
+ + +
+
+
+
+ +
+

NAMEID_ENTITY

+
NAMEID_ENTITY
+
+
+
+
+
+ + + + + + + + + +
+ + +
+ + +
+
+
+
+ +
+

NAMEID_TRANSIENT

+
NAMEID_TRANSIENT
+
+
+
+
+
+ + + + + + + + + +
+ + +
+ + +
+
+
+
+ +
+

NAMEID_PERSISTENT

+
NAMEID_PERSISTENT
+
+
+
+
+
+ + + + + + + + + +
+ + +
+ + +
+
+
+
+ +

Properties

+ +
+

The URL to submit SAML authentication requests to.

+
idpSingleSignOnUrl : string
+
+
+
+
+
+ + + + + + + + + + +
+ var + + +
+ + +
+ +

Type(s)

+ string +
+
+
+ +
+

The URL to submit SAML Logout Request to.

+
idpSingleLogOutUrl : string
+
+
+
+
+
+ + + + + + + + + + +
+ var + + +
+ + +
+ +

Type(s)

+ string +
+
+
+ +
+

The x509 certificate used to authenticate the request.

+
idpPublicCertificate : string
+
+
+
+
+
+ + + + + + + + + + +
+ var + + +
+ + +
+ +

Type(s)

+ string +
+
+
+ +
+

The URL where to the SAML Response/SAML Assertion will be posted.

+
spReturnUrl : string
+
+
+
+
+
+ + + + + + + + + + +
+ var + + +
+ + +
+ +

Type(s)

+ string +
+
+
+ +
+

The name of the application.

+
spIssuer : string
+
+
+
+
+
+ + + + + + + + + + +
+ var + + +
+ + +
+ +

Type(s)

+ string +
+
+
+ +
+

Specifies what format to return the authentication token, i.e, the email address.

+
requestedNameIdFormat : string
+
+
+
+
+
+ + + + + + + + + + +
+ var + + +
+ + +
+ +

Type(s)

+ string +
+
+
+
+
+ + +
+
+ +
+ + + + diff --git a/docs/Saml/classes/OneLogin_Saml_XmlSec.html b/docs/Saml/classes/OneLogin_Saml_XmlSec.html new file mode 100644 index 00000000..71e386f1 --- /dev/null +++ b/docs/Saml/classes/OneLogin_Saml_XmlSec.html @@ -0,0 +1,400 @@ + + + + + + Onelogin's SAML PHP Toolkit » \OneLogin_Saml_XmlSec + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+ + +
+
+ + + + +
+ + + + +
+ +
+
+

OneLogin_Saml_XmlSec

+ + +

Determine if the SAML response is valid using a provided x509 certificate.

+
+
+ +
+ +
+ +

Methods

+ +
+

Construct the SamlXmlSec object.

+
__construct(\OneLogin_Saml_Settings $settings, \OneLogin_Saml_Response $response) 
+
+
+
+
+
+ + + + + + + + + + +
+ + +
+ + +
+ +

Arguments

+
+

$settings

+ \OneLogin_Saml_Settings

A SamlResponse settings object containing the necessary

+
                                     x509 certicate to test the document.

+
+
+

$response

+ \OneLogin_Saml_Response

The document to test.

+
+ +
+
+
+ +
+

Verify that the document only contains a single Assertion

+
validateNumAssertions() : bool
+
+
+
+
+
+ + + + + + + + + + +
+ + +
+ + +
+ + +

Response

+ bool

TRUE if the document passes.

+
+
+
+ +
+

Verify that the document is still valid according

+
validateTimestamps() : bool
+
+
+
+
+
+ + + + + + + + + + +
+ + +
+ + +
+ + +

Response

+ bool

+
+
+
+ +
+

isValid

+
isValid() : bool
+
+
+
+
+
+ + + + + + + + + + + + + + +
+ throws + + + +
+ + +
+ + +
+ + +

Response

+ bool

+
+
+
+ + +

Properties

+ +
+

A SamlResponse class provided to the constructor.

+
_settings : \OneLogin_Saml_Settings
+
+
+
+
+
+ + + + + + + + + + +
+ var + + +
+ + +
+ +

Type(s)

+ \OneLogin_Saml_Settings +
+
+
+ +
+

The document to be tested.

+
_document : \DomDocument
+
+
+
+
+
+ + + + + + + + + + +
+ var + + +
+ + +
+ +

Type(s)

+ \DomDocument +
+
+
+
+
+ + +
+
+ +
+ + + + diff --git a/docs/Saml/css/bootstrap-responsive.css b/docs/Saml/css/bootstrap-responsive.css new file mode 100644 index 00000000..4b032cdb --- /dev/null +++ b/docs/Saml/css/bootstrap-responsive.css @@ -0,0 +1,567 @@ +/*! + * Bootstrap Responsive v2.0.0 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +.hidden { + display: none; + visibility: hidden; +} +@media (max-width: 480px) { + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + .page-header h1 small { + display: block; + line-height: 18px; + } + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + height: 28px; + /* Make inputs at least the height of their button counterpart */ + + /* Makes inputs behave like true block-level elements */ + + -webkit-box-sizing: border-box; + /* Older Webkit */ + + -moz-box-sizing: border-box; + /* Older FF */ + + -ms-box-sizing: border-box; + /* IE8 */ + + box-sizing: border-box; + /* CSS3 spec*/ + + } + .input-prepend input[class*="span"], .input-append input[class*="span"] { + width: auto; + } + 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: 768px) { + .container { + width: auto; + padding: 0 20px; + } + .row-fluid { + width: 100%; + } + .row { + margin-left: 0; + } + .row > [class*="span"], .row-fluid > [class*="span"] { + float: none; + display: block; + width: auto; + margin: 0; + } +} +@media (min-width: 768px) and (max-width: 980px) { + .row { + margin-left: -20px; + *zoom: 1; + } + .row:before, .row:after { + display: table; + content: ""; + } + .row:after { + clear: both; + } + [class*="span"] { + float: left; + margin-left: 20px; + } + .span1 { + width: 42px; + } + .span2 { + width: 104px; + } + .span3 { + width: 166px; + } + .span4 { + width: 228px; + } + .span5 { + width: 290px; + } + .span6 { + width: 352px; + } + .span7 { + width: 414px; + } + .span8 { + width: 476px; + } + .span9 { + width: 538px; + } + .span10 { + width: 600px; + } + .span11 { + width: 662px; + } + .span12, .container { + width: 724px; + } + .offset1 { + margin-left: 82px; + } + .offset2 { + margin-left: 144px; + } + .offset3 { + margin-left: 206px; + } + .offset4 { + margin-left: 268px; + } + .offset5 { + margin-left: 330px; + } + .offset6 { + margin-left: 392px; + } + .offset7 { + margin-left: 454px; + } + .offset8 { + margin-left: 516px; + } + .offset9 { + margin-left: 578px; + } + .offset10 { + margin-left: 640px; + } + .offset11 { + margin-left: 702px; + } + .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 .span1 { + width: 5.801104972%; + } + .row-fluid .span2 { + width: 14.364640883%; + } + .row-fluid .span3 { + width: 22.928176794%; + } + .row-fluid .span4 { + width: 31.491712705%; + } + .row-fluid .span5 { + width: 40.055248616%; + } + .row-fluid .span6 { + width: 48.618784527%; + } + .row-fluid .span7 { + width: 57.182320438000005%; + } + .row-fluid .span8 { + width: 65.74585634900001%; + } + .row-fluid .span9 { + width: 74.30939226%; + } + .row-fluid .span10 { + width: 82.87292817100001%; + } + .row-fluid .span11 { + width: 91.436464082%; + } + .row-fluid .span12 { + width: 99.999999993%; + } + input.span1, textarea.span1, .uneditable-input.span1 { + width: 32px; + } + input.span2, textarea.span2, .uneditable-input.span2 { + width: 94px; + } + input.span3, textarea.span3, .uneditable-input.span3 { + width: 156px; + } + input.span4, textarea.span4, .uneditable-input.span4 { + width: 218px; + } + input.span5, textarea.span5, .uneditable-input.span5 { + width: 280px; + } + input.span6, textarea.span6, .uneditable-input.span6 { + width: 342px; + } + input.span7, textarea.span7, .uneditable-input.span7 { + width: 404px; + } + input.span8, textarea.span8, .uneditable-input.span8 { + width: 466px; + } + input.span9, textarea.span9, .uneditable-input.span9 { + width: 528px; + } + input.span10, textarea.span10, .uneditable-input.span10 { + width: 590px; + } + input.span11, textarea.span11, .uneditable-input.span11 { + width: 652px; + } + input.span12, textarea.span12, .uneditable-input.span12 { + width: 714px; + } +} +@media (max-width: 980px) { + 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 > 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; + } +} +@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; + } + .span1 { + width: 70px; + } + .span2 { + width: 170px; + } + .span3 { + width: 270px; + } + .span4 { + width: 370px; + } + .span5 { + width: 470px; + } + .span6 { + width: 570px; + } + .span7 { + width: 670px; + } + .span8 { + width: 770px; + } + .span9 { + width: 870px; + } + .span10 { + width: 970px; + } + .span11 { + width: 1070px; + } + .span12, .container { + width: 1170px; + } + .offset1 { + margin-left: 130px; + } + .offset2 { + margin-left: 230px; + } + .offset3 { + margin-left: 330px; + } + .offset4 { + margin-left: 430px; + } + .offset5 { + margin-left: 530px; + } + .offset6 { + margin-left: 630px; + } + .offset7 { + margin-left: 730px; + } + .offset8 { + margin-left: 830px; + } + .offset9 { + margin-left: 930px; + } + .offset10 { + margin-left: 1030px; + } + .offset11 { + margin-left: 1130px; + } + .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 .span1 { + width: 5.982905983%; + } + .row-fluid .span2 { + width: 14.529914530000001%; + } + .row-fluid .span3 { + width: 23.076923077%; + } + .row-fluid .span4 { + width: 31.623931624%; + } + .row-fluid .span5 { + width: 40.170940171000005%; + } + .row-fluid .span6 { + width: 48.717948718%; + } + .row-fluid .span7 { + width: 57.264957265%; + } + .row-fluid .span8 { + width: 65.81196581200001%; + } + .row-fluid .span9 { + width: 74.358974359%; + } + .row-fluid .span10 { + width: 82.905982906%; + } + .row-fluid .span11 { + width: 91.45299145300001%; + } + .row-fluid .span12 { + width: 100%; + } + input.span1, textarea.span1, .uneditable-input.span1 { + width: 60px; + } + input.span2, textarea.span2, .uneditable-input.span2 { + width: 160px; + } + input.span3, textarea.span3, .uneditable-input.span3 { + width: 260px; + } + input.span4, textarea.span4, .uneditable-input.span4 { + width: 360px; + } + input.span5, textarea.span5, .uneditable-input.span5 { + width: 460px; + } + input.span6, textarea.span6, .uneditable-input.span6 { + width: 560px; + } + input.span7, textarea.span7, .uneditable-input.span7 { + width: 660px; + } + input.span8, textarea.span8, .uneditable-input.span8 { + width: 760px; + } + input.span9, textarea.span9, .uneditable-input.span9 { + width: 860px; + } + input.span10, textarea.span10, .uneditable-input.span10 { + width: 960px; + } + input.span11, textarea.span11, .uneditable-input.span11 { + width: 1060px; + } + input.span12, textarea.span12, .uneditable-input.span12 { + width: 1160px; + } + .thumbnails { + margin-left: -30px; + } + .thumbnails > li { + margin-left: 30px; + } +} diff --git a/docs/Saml/css/bootstrap-responsive.min.css b/docs/Saml/css/bootstrap-responsive.min.css new file mode 100644 index 00000000..bc3f2ab7 --- /dev/null +++ b/docs/Saml/css/bootstrap-responsive.min.css @@ -0,0 +1,3 @@ + +.hidden{display:none;visibility:hidden;} +@media (max-width:480px){.nav-collapse{-webkit-transform:translate3d(0, 0, 0);} .page-header h1 small{display:block;line-height:18px;} input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;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;} 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:768px){.container{width:auto;padding:0 20px;} .row-fluid{width:100%;} .row{margin-left:0;} .row>[class*="span"],.row-fluid>[class*="span"]{float:none;display:block;width:auto;margin:0;}}@media (min-width:768px) and (max-width:980px){.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";} .row:after{clear:both;} [class*="span"]{float:left;margin-left:20px;} .span1{width:42px;} .span2{width:104px;} .span3{width:166px;} .span4{width:228px;} .span5{width:290px;} .span6{width:352px;} .span7{width:414px;} .span8{width:476px;} .span9{width:538px;} .span10{width:600px;} .span11{width:662px;} .span12,.container{width:724px;} .offset1{margin-left:82px;} .offset2{margin-left:144px;} .offset3{margin-left:206px;} .offset4{margin-left:268px;} .offset5{margin-left:330px;} .offset6{margin-left:392px;} .offset7{margin-left:454px;} .offset8{margin-left:516px;} .offset9{margin-left:578px;} .offset10{margin-left:640px;} .offset11{margin-left:702px;} .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 .span1{width:5.801104972%;} .row-fluid .span2{width:14.364640883%;} .row-fluid .span3{width:22.928176794%;} .row-fluid .span4{width:31.491712705%;} .row-fluid .span5{width:40.055248616%;} .row-fluid .span6{width:48.618784527%;} .row-fluid .span7{width:57.182320438000005%;} .row-fluid .span8{width:65.74585634900001%;} .row-fluid .span9{width:74.30939226%;} .row-fluid .span10{width:82.87292817100001%;} .row-fluid .span11{width:91.436464082%;} .row-fluid .span12{width:99.999999993%;} input.span1,textarea.span1,.uneditable-input.span1{width:32px;} input.span2,textarea.span2,.uneditable-input.span2{width:94px;} input.span3,textarea.span3,.uneditable-input.span3{width:156px;} input.span4,textarea.span4,.uneditable-input.span4{width:218px;} input.span5,textarea.span5,.uneditable-input.span5{width:280px;} input.span6,textarea.span6,.uneditable-input.span6{width:342px;} input.span7,textarea.span7,.uneditable-input.span7{width:404px;} input.span8,textarea.span8,.uneditable-input.span8{width:466px;} input.span9,textarea.span9,.uneditable-input.span9{width:528px;} input.span10,textarea.span10,.uneditable-input.span10{width:590px;} input.span11,textarea.span11,.uneditable-input.span11{width:652px;} input.span12,textarea.span12,.uneditable-input.span12{width:714px;}}@media (max-width:980px){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>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;}}@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;} .span1{width:70px;} .span2{width:170px;} .span3{width:270px;} .span4{width:370px;} .span5{width:470px;} .span6{width:570px;} .span7{width:670px;} .span8{width:770px;} .span9{width:870px;} .span10{width:970px;} .span11{width:1070px;} .span12,.container{width:1170px;} .offset1{margin-left:130px;} .offset2{margin-left:230px;} .offset3{margin-left:330px;} .offset4{margin-left:430px;} .offset5{margin-left:530px;} .offset6{margin-left:630px;} .offset7{margin-left:730px;} .offset8{margin-left:830px;} .offset9{margin-left:930px;} .offset10{margin-left:1030px;} .offset11{margin-left:1130px;} .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 .span1{width:5.982905983%;} .row-fluid .span2{width:14.529914530000001%;} .row-fluid .span3{width:23.076923077%;} .row-fluid .span4{width:31.623931624%;} .row-fluid .span5{width:40.170940171000005%;} .row-fluid .span6{width:48.717948718%;} .row-fluid .span7{width:57.264957265%;} .row-fluid .span8{width:65.81196581200001%;} .row-fluid .span9{width:74.358974359%;} .row-fluid .span10{width:82.905982906%;} .row-fluid .span11{width:91.45299145300001%;} .row-fluid .span12{width:100%;} input.span1,textarea.span1,.uneditable-input.span1{width:60px;} input.span2,textarea.span2,.uneditable-input.span2{width:160px;} input.span3,textarea.span3,.uneditable-input.span3{width:260px;} input.span4,textarea.span4,.uneditable-input.span4{width:360px;} input.span5,textarea.span5,.uneditable-input.span5{width:460px;} input.span6,textarea.span6,.uneditable-input.span6{width:560px;} input.span7,textarea.span7,.uneditable-input.span7{width:660px;} input.span8,textarea.span8,.uneditable-input.span8{width:760px;} input.span9,textarea.span9,.uneditable-input.span9{width:860px;} input.span10,textarea.span10,.uneditable-input.span10{width:960px;} input.span11,textarea.span11,.uneditable-input.span11{width:1060px;} input.span12,textarea.span12,.uneditable-input.span12{width:1160px;} .thumbnails{margin-left:-30px;} .thumbnails>li{margin-left:30px;}} diff --git a/docs/Saml/css/bootstrap.css b/docs/Saml/css/bootstrap.css new file mode 100644 index 00000000..563050c0 --- /dev/null +++ b/docs/Saml/css/bootstrap.css @@ -0,0 +1,3370 @@ +/*! + * Bootstrap v2.0.0 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +nav, +section { + display: block; +} +audio, canvas, video { + display: inline-block; + *display: inline; + *zoom: 1; +} +audio:not([controls]) { + display: none; +} +html { + font-size: 100%; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} +a:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +a:hover, a:active { + outline: 0; +} +sub, sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} +sup { + top: -0.5em; +} +sub { + bottom: -0.25em; +} +img { + max-width: 100%; + height: auto; + border: 0; + -ms-interpolation-mode: bicubic; +} +button, +input, +select, +textarea { + margin: 0; + font-size: 100%; + vertical-align: middle; +} +button, input { + *overflow: visible; + line-height: normal; +} +button::-moz-focus-inner, input::-moz-focus-inner { + padding: 0; + border: 0; +} +button, +input[type="button"], +input[type="reset"], +input[type="submit"] { + cursor: pointer; + -webkit-appearance: button; +} +input[type="search"] { + -webkit-appearance: textfield; + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} +input[type="search"]::-webkit-search-decoration, input[type="search"]::-webkit-search-cancel-button { + -webkit-appearance: none; +} +textarea { + overflow: auto; + vertical-align: top; +} +body { + margin: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + line-height: 18px; + color: #333333; + background-color: #ffffff; +} +a { + color: #0088cc; + text-decoration: none; +} +a:hover { + color: #005580; + text-decoration: underline; +} +.row { + margin-left: -20px; + *zoom: 1; +} +.row:before, .row:after { + display: table; + content: ""; +} +.row:after { + clear: both; +} +[class*="span"] { + float: left; + margin-left: 20px; +} +.span1 { + width: 60px; +} +.span2 { + width: 140px; +} +.span3 { + width: 220px; +} +.span4 { + width: 300px; +} +.span5 { + width: 380px; +} +.span6 { + width: 460px; +} +.span7 { + width: 540px; +} +.span8 { + width: 620px; +} +.span9 { + width: 700px; +} +.span10 { + width: 780px; +} +.span11 { + width: 860px; +} +.span12, .container { + width: 940px; +} +.offset1 { + margin-left: 100px; +} +.offset2 { + margin-left: 180px; +} +.offset3 { + margin-left: 260px; +} +.offset4 { + margin-left: 340px; +} +.offset5 { + margin-left: 420px; +} +.offset6 { + margin-left: 500px; +} +.offset7 { + margin-left: 580px; +} +.offset8 { + margin-left: 660px; +} +.offset9 { + margin-left: 740px; +} +.offset10 { + margin-left: 820px; +} +.offset11 { + margin-left: 900px; +} +.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.127659574%; +} +.row-fluid > [class*="span"]:first-child { + margin-left: 0; +} +.row-fluid .span1 { + width: 6.382978723%; +} +.row-fluid .span2 { + width: 14.89361702%; +} +.row-fluid .span3 { + width: 23.404255317%; +} +.row-fluid .span4 { + width: 31.914893614%; +} +.row-fluid .span5 { + width: 40.425531911%; +} +.row-fluid .span6 { + width: 48.93617020799999%; +} +.row-fluid .span7 { + width: 57.446808505%; +} +.row-fluid .span8 { + width: 65.95744680199999%; +} +.row-fluid .span9 { + width: 74.468085099%; +} +.row-fluid .span10 { + width: 82.97872339599999%; +} +.row-fluid .span11 { + width: 91.489361693%; +} +.row-fluid .span12 { + width: 99.99999998999999%; +} +.container { + width: 940px; + margin-left: auto; + margin-right: auto; + *zoom: 1; +} +.container:before, .container:after { + display: table; + content: ""; +} +.container:after { + clear: both; +} +.container-fluid { + padding-left: 20px; + padding-right: 20px; + *zoom: 1; +} +.container-fluid:before, .container-fluid:after { + display: table; + content: ""; +} +.container-fluid:after { + clear: both; +} +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; +} +.lead { + margin-bottom: 18px; + font-size: 20px; + font-weight: 200; + line-height: 27px; +} +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 0; + font-weight: bold; + color: #333333; + text-rendering: optimizelegibility; +} +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small { + font-weight: normal; + color: #999999; +} +h1 { + font-size: 30px; + line-height: 36px; +} +h1 small { + font-size: 18px; +} +h2 { + font-size: 24px; + line-height: 36px; +} +h2 small { + font-size: 18px; +} +h3 { + line-height: 27px; + font-size: 18px; +} +h3 small { + font-size: 14px; +} +h4, h5, h6 { + line-height: 18px; +} +h4 { + font-size: 14px; +} +h4 small { + font-size: 12px; +} +h5 { + font-size: 12px; +} +h6 { + font-size: 11px; + color: #999999; + text-transform: uppercase; +} +.page-header { + padding-bottom: 17px; + margin: 18px 0; + border-bottom: 1px solid #eeeeee; +} +.page-header h1 { + line-height: 1; +} +ul, ol { + padding: 0; + margin: 0 0 9px 25px; +} +ul ul, +ul ol, +ol ol, +ol ul { + margin-bottom: 0; +} +ul { + list-style: disc; +} +ol { + list-style: decimal; +} +li { + line-height: 18px; +} +ul.unstyled { + margin-left: 0; + list-style: none; +} +dl { + margin-bottom: 18px; +} +dt, dd { + line-height: 18px; +} +dt { + font-weight: bold; +} +dd { + margin-left: 9px; +} +hr { + margin: 18px 0; + border: 0; + border-top: 1px solid #e5e5e5; + border-bottom: 1px solid #ffffff; +} +strong { + font-weight: bold; +} +em { + font-style: italic; +} +.muted { + color: #999999; +} +abbr { + font-size: 90%; + text-transform: uppercase; + border-bottom: 1px dotted #ddd; + cursor: help; +} +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; +} +blockquote small { + display: block; + line-height: 18px; + color: #999999; +} +blockquote small:before { + content: '\2014 \00A0'; +} +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; +} +q:before, +q:after, +blockquote:before, +blockquote:after { + content: ""; +} +address { + display: block; + margin-bottom: 18px; + line-height: 18px; + font-style: normal; +} +small { + font-size: 100%; +} +cite { + font-style: normal; +} +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; +} +code { + padding: 3px 4px; + color: #d14; + background-color: #f7f7f9; + border: 1px solid #e1e1e8; +} +pre { + display: block; + padding: 8.5px; + margin: 0 0 9px; + font-size: 12px; + 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; +} +pre.prettyprint { + margin-bottom: 18px; +} +pre code { + padding: 0; + background-color: transparent; +} +form { + margin: 0 0 18px; +} +fieldset { + padding: 0; + margin: 0; + border: 0; +} +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; +} +label, +input, +button, +select, +textarea { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + font-weight: normal; + line-height: 18px; +} +label { + display: block; + margin-bottom: 5px; + color: #333333; +} +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 #ccc; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +.uneditable-textarea { + width: auto; + height: auto; +} +label input, label textarea, label select { + display: block; +} +input[type="image"], input[type="checkbox"], input[type="radio"] { + width: auto; + height: auto; + padding: 0; + margin: 3px 0; + *margin-top: 0; + /* IE7 */ + + line-height: normal; + border: 0; + cursor: pointer; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +input[type="file"] { + padding: initial; + line-height: initial; + border: initial; + background-color: #ffffff; + background-color: initial; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} +input[type="button"], input[type="reset"], input[type="submit"] { + width: auto; + height: auto; +} +select, input[type="file"] { + height: 28px; + /* In IE7, the height of the select element cannot be changed by height, only font-size */ + + *margin-top: 4px; + /* For IE7, add top margin to align select with labels */ + + line-height: 28px; +} +select { + width: 220px; + background-color: #ffffff; +} +select[multiple], select[size] { + height: auto; +} +input[type="image"] { + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} +textarea { + height: auto; +} +input[type="hidden"] { + display: none; +} +.radio, .checkbox { + padding-left: 18px; +} +.radio input[type="radio"], .checkbox input[type="checkbox"] { + float: left; + margin-left: -18px; +} +.controls > .radio:first-child, .controls > .checkbox:first-child { + padding-top: 5px; +} +.radio.inline, .checkbox.inline { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; +} +.radio.inline + .radio.inline, .checkbox.inline + .checkbox.inline { + margin-left: 10px; +} +.controls > .radio.inline:first-child, .controls > .checkbox.inline:first-child { + padding-top: 0; +} +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; +} +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; + /* IE6-8 */ + +} +input[type="file"]:focus, input[type="checkbox"]:focus, select:focus { + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.input-mini { + width: 60px; +} +.input-small { + width: 90px; +} +.input-medium { + width: 150px; +} +.input-large { + width: 210px; +} +.input-xlarge { + width: 270px; +} +.input-xxlarge { + width: 530px; +} +input[class*="span"], +select[class*="span"], +textarea[class*="span"], +.uneditable-input { + float: none; + margin-left: 0; +} +input.span1, textarea.span1, .uneditable-input.span1 { + width: 50px; +} +input.span2, textarea.span2, .uneditable-input.span2 { + width: 130px; +} +input.span3, textarea.span3, .uneditable-input.span3 { + width: 210px; +} +input.span4, textarea.span4, .uneditable-input.span4 { + width: 290px; +} +input.span5, textarea.span5, .uneditable-input.span5 { + width: 370px; +} +input.span6, textarea.span6, .uneditable-input.span6 { + width: 450px; +} +input.span7, textarea.span7, .uneditable-input.span7 { + width: 530px; +} +input.span8, textarea.span8, .uneditable-input.span8 { + width: 610px; +} +input.span9, textarea.span9, .uneditable-input.span9 { + width: 690px; +} +input.span10, textarea.span10, .uneditable-input.span10 { + width: 770px; +} +input.span11, textarea.span11, .uneditable-input.span11 { + width: 850px; +} +input.span12, textarea.span12, .uneditable-input.span12 { + width: 930px; +} +input[disabled], +select[disabled], +textarea[disabled], +input[readonly], +select[readonly], +textarea[readonly] { + background-color: #f5f5f5; + border-color: #ddd; + cursor: not-allowed; +} +.control-group.warning > label, .control-group.warning .help-block, .control-group.warning .help-inline { + color: #c09853; +} +.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; +} +.control-group.warning .input-prepend .add-on, .control-group.warning .input-append .add-on { + color: #c09853; + background-color: #fcf8e3; + border-color: #c09853; +} +.control-group.error > label, .control-group.error .help-block, .control-group.error .help-inline { + color: #b94a48; +} +.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; +} +.control-group.error .input-prepend .add-on, .control-group.error .input-append .add-on { + color: #b94a48; + background-color: #f2dede; + border-color: #b94a48; +} +.control-group.success > label, .control-group.success .help-block, .control-group.success .help-inline { + color: #468847; +} +.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; +} +.control-group.success .input-prepend .add-on, .control-group.success .input-append .add-on { + color: #468847; + background-color: #dff0d8; + border-color: #468847; +} +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; +} +.form-actions { + padding: 17px 20px 18px; + margin-top: 18px; + margin-bottom: 18px; + background-color: #f5f5f5; + border-top: 1px solid #ddd; +} +.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; +} +:-moz-placeholder { + color: #999999; +} +::-webkit-input-placeholder { + color: #999999; +} +.help-block { + margin-top: 5px; + margin-bottom: 0; + color: #999999; +} +.help-inline { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; + margin-bottom: 9px; + vertical-align: middle; + padding-left: 5px; +} +.input-prepend, .input-append { + margin-bottom: 5px; + *zoom: 1; +} +.input-prepend:before, +.input-append:before, +.input-prepend:after, +.input-append:after { + display: table; + content: ""; +} +.input-prepend:after, .input-append:after { + clear: both; +} +.input-prepend input, +.input-append input, +.input-prepend .uneditable-input, +.input-append .uneditable-input { + -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 .uneditable-input:focus, +.input-append .uneditable-input:focus { + position: relative; + z-index: 2; +} +.input-prepend .uneditable-input, .input-append .uneditable-input { + border-left-color: #ccc; +} +.input-prepend .add-on, .input-append .add-on { + float: left; + display: block; + width: auto; + min-width: 16px; + height: 18px; + margin-right: -1px; + padding: 4px 5px; + font-weight: normal; + line-height: 18px; + color: #999999; + text-align: center; + text-shadow: 0 1px 0 #ffffff; + background-color: #f5f5f5; + border: 1px solid #ccc; + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} +.input-prepend .active, .input-append .active { + background-color: #a9dba9; + border-color: #46a546; +} +.input-prepend .add-on { + *margin-top: 1px; + /* IE6-7 */ + +} +.input-append input, .input-append .uneditable-input { + float: left; + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} +.input-append .uneditable-input { + border-right-color: #ccc; +} +.input-append .add-on { + margin-right: 0; + margin-left: -1px; + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} +.input-append input:first-child { + *margin-left: -160px; +} +.input-append input:first-child + .add-on { + *margin-left: -21px; +} +.search-query { + padding-left: 14px; + padding-right: 14px; + margin-bottom: 0; + -webkit-border-radius: 14px; + -moz-border-radius: 14px; + border-radius: 14px; +} +.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 { + display: inline-block; + margin-bottom: 0; +} +.form-search label, +.form-inline label, +.form-search .input-append, +.form-inline .input-append, +.form-search .input-prepend, +.form-inline .input-prepend { + display: inline-block; +} +.form-search .input-append .add-on, +.form-inline .input-prepend .add-on, +.form-search .input-append .add-on, +.form-inline .input-prepend .add-on { + vertical-align: middle; +} +.control-group { + margin-bottom: 9px; +} +.form-horizontal legend + .control-group { + margin-top: 18px; + -webkit-margin-top-collapse: separate; +} +.form-horizontal .control-group { + margin-bottom: 18px; + *zoom: 1; +} +.form-horizontal .control-group:before, .form-horizontal .control-group:after { + display: table; + content: ""; +} +.form-horizontal .control-group:after { + clear: both; +} +.form-horizontal .control-group > label { + float: left; + width: 140px; + padding-top: 5px; + text-align: right; +} +.form-horizontal .controls { + margin-left: 160px; +} +.form-horizontal .form-actions { + padding-left: 160px; +} +table { + max-width: 100%; + border-collapse: collapse; + border-spacing: 0; +} +.table { + width: 100%; + margin-bottom: 18px; +} +.table th, .table td { + padding: 8px; + line-height: 18px; + text-align: left; + border-top: 1px solid #ddd; +} +.table th { + font-weight: bold; + vertical-align: bottom; +} +.table td { + vertical-align: top; +} +.table thead:first-child tr th, .table thead:first-child tr td { + border-top: 0; +} +.table tbody + tbody { + border-top: 2px solid #ddd; +} +.table-condensed th, .table-condensed td { + padding: 4px 5px; +} +.table-bordered { + border: 1px solid #ddd; + border-collapse: separate; + *border-collapse: collapsed; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.table-bordered th + th, +.table-bordered td + td, +.table-bordered th + td, +.table-bordered td + th { + border-left: 1px solid #ddd; +} +.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; +} +.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; +} +.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; +} +.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; +} +.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; +} +.table-striped tbody tr:nth-child(odd) td, .table-striped tbody tr:nth-child(odd) th { + background-color: #f9f9f9; +} +table .span1 { + float: none; + width: 44px; + margin-left: 0; +} +table .span2 { + float: none; + width: 124px; + margin-left: 0; +} +table .span3 { + float: none; + width: 204px; + margin-left: 0; +} +table .span4 { + float: none; + width: 284px; + margin-left: 0; +} +table .span5 { + float: none; + width: 364px; + margin-left: 0; +} +table .span6 { + float: none; + width: 444px; + margin-left: 0; +} +table .span7 { + float: none; + width: 524px; + margin-left: 0; +} +table .span8 { + float: none; + width: 604px; + margin-left: 0; +} +table .span9 { + float: none; + width: 684px; + margin-left: 0; +} +table .span10 { + float: none; + width: 764px; + margin-left: 0; +} +table .span11 { + float: none; + width: 844px; + margin-left: 0; +} +table .span12 { + float: none; + width: 924px; + margin-left: 0; +} +[class^="icon-"] { + display: inline-block; + width: 14px; + height: 14px; + vertical-align: text-top; + background-image: url(http://github.com/img/glyphicons-halflings.png); + background-position: 14px 14px; + background-repeat: no-repeat; + *margin-right: .3em; +} +[class^="icon-"]:last-child { + *margin-left: 0; +} +.icon-white { + background-image: url(http://github.com/img/glyphicons-halflings-white.png); +} +.icon-glass { + background-position: 0 0; +} +.icon-music { + background-position: -24px 0; +} +.icon-search { + background-position: -48px 0; +} +.icon-envelope { + background-position: -72px 0; +} +.icon-heart { + background-position: -96px 0; +} +.icon-star { + background-position: -120px 0; +} +.icon-star-empty { + background-position: -144px 0; +} +.icon-user { + background-position: -168px 0; +} +.icon-film { + background-position: -192px 0; +} +.icon-th-large { + background-position: -216px 0; +} +.icon-th { + background-position: -240px 0; +} +.icon-th-list { + background-position: -264px 0; +} +.icon-ok { + background-position: -288px 0; +} +.icon-remove { + background-position: -312px 0; +} +.icon-zoom-in { + background-position: -336px 0; +} +.icon-zoom-out { + background-position: -360px 0; +} +.icon-off { + background-position: -384px 0; +} +.icon-signal { + background-position: -408px 0; +} +.icon-cog { + background-position: -432px 0; +} +.icon-trash { + background-position: -456px 0; +} +.icon-home { + background-position: 0 -24px; +} +.icon-file { + background-position: -24px -24px; +} +.icon-time { + background-position: -48px -24px; +} +.icon-road { + background-position: -72px -24px; +} +.icon-download-alt { + background-position: -96px -24px; +} +.icon-download { + background-position: -120px -24px; +} +.icon-upload { + background-position: -144px -24px; +} +.icon-inbox { + background-position: -168px -24px; +} +.icon-play-circle { + background-position: -192px -24px; +} +.icon-repeat { + background-position: -216px -24px; +} +.icon-refresh { + background-position: -240px -24px; +} +.icon-list-alt { + background-position: -264px -24px; +} +.icon-lock { + background-position: -287px -24px; +} +.icon-flag { + background-position: -312px -24px; +} +.icon-headphones { + background-position: -336px -24px; +} +.icon-volume-off { + background-position: -360px -24px; +} +.icon-volume-down { + background-position: -384px -24px; +} +.icon-volume-up { + background-position: -408px -24px; +} +.icon-qrcode { + background-position: -432px -24px; +} +.icon-barcode { + background-position: -456px -24px; +} +.icon-tag { + background-position: 0 -48px; +} +.icon-tags { + background-position: -25px -48px; +} +.icon-book { + background-position: -48px -48px; +} +.icon-bookmark { + background-position: -72px -48px; +} +.icon-print { + background-position: -96px -48px; +} +.icon-camera { + background-position: -120px -48px; +} +.icon-font { + background-position: -144px -48px; +} +.icon-bold { + background-position: -167px -48px; +} +.icon-italic { + background-position: -192px -48px; +} +.icon-text-height { + background-position: -216px -48px; +} +.icon-text-width { + background-position: -240px -48px; +} +.icon-align-left { + background-position: -264px -48px; +} +.icon-align-center { + background-position: -288px -48px; +} +.icon-align-right { + background-position: -312px -48px; +} +.icon-align-justify { + background-position: -336px -48px; +} +.icon-list { + background-position: -360px -48px; +} +.icon-indent-left { + background-position: -384px -48px; +} +.icon-indent-right { + background-position: -408px -48px; +} +.icon-facetime-video { + background-position: -432px -48px; +} +.icon-picture { + background-position: -456px -48px; +} +.icon-pencil { + background-position: 0 -72px; +} +.icon-map-marker { + background-position: -24px -72px; +} +.icon-adjust { + background-position: -48px -72px; +} +.icon-tint { + background-position: -72px -72px; +} +.icon-edit { + background-position: -96px -72px; +} +.icon-share { + background-position: -120px -72px; +} +.icon-check { + background-position: -144px -72px; +} +.icon-move { + background-position: -168px -72px; +} +.icon-step-backward { + background-position: -192px -72px; +} +.icon-fast-backward { + background-position: -216px -72px; +} +.icon-backward { + background-position: -240px -72px; +} +.icon-play { + background-position: -264px -72px; +} +.icon-pause { + background-position: -288px -72px; +} +.icon-stop { + background-position: -312px -72px; +} +.icon-forward { + background-position: -336px -72px; +} +.icon-fast-forward { + background-position: -360px -72px; +} +.icon-step-forward { + background-position: -384px -72px; +} +.icon-eject { + background-position: -408px -72px; +} +.icon-chevron-left { + background-position: -432px -72px; +} +.icon-chevron-right { + background-position: -456px -72px; +} +.icon-plus-sign { + background-position: 0 -96px; +} +.icon-minus-sign { + background-position: -24px -96px; +} +.icon-remove-sign { + background-position: -48px -96px; +} +.icon-ok-sign { + background-position: -72px -96px; +} +.icon-question-sign { + background-position: -96px -96px; +} +.icon-info-sign { + background-position: -120px -96px; +} +.icon-screenshot { + background-position: -144px -96px; +} +.icon-remove-circle { + background-position: -168px -96px; +} +.icon-ok-circle { + background-position: -192px -96px; +} +.icon-ban-circle { + background-position: -216px -96px; +} +.icon-arrow-left { + background-position: -240px -96px; +} +.icon-arrow-right { + background-position: -264px -96px; +} +.icon-arrow-up { + background-position: -289px -96px; +} +.icon-arrow-down { + background-position: -312px -96px; +} +.icon-share-alt { + background-position: -336px -96px; +} +.icon-resize-full { + background-position: -360px -96px; +} +.icon-resize-small { + background-position: -384px -96px; +} +.icon-plus { + background-position: -408px -96px; +} +.icon-minus { + background-position: -433px -96px; +} +.icon-asterisk { + background-position: -456px -96px; +} +.icon-exclamation-sign { + background-position: 0 -120px; +} +.icon-gift { + background-position: -24px -120px; +} +.icon-leaf { + background-position: -48px -120px; +} +.icon-fire { + background-position: -72px -120px; +} +.icon-eye-open { + background-position: -96px -120px; +} +.icon-eye-close { + background-position: -120px -120px; +} +.icon-warning-sign { + background-position: -144px -120px; +} +.icon-plane { + background-position: -168px -120px; +} +.icon-calendar { + background-position: -192px -120px; +} +.icon-random { + background-position: -216px -120px; +} +.icon-comment { + background-position: -240px -120px; +} +.icon-magnet { + background-position: -264px -120px; +} +.icon-chevron-up { + background-position: -288px -120px; +} +.icon-chevron-down { + background-position: -313px -119px; +} +.icon-retweet { + background-position: -336px -120px; +} +.icon-shopping-cart { + background-position: -360px -120px; +} +.icon-folder-close { + background-position: -384px -120px; +} +.icon-folder-open { + background-position: -408px -120px; +} +.icon-resize-vertical { + background-position: -432px -119px; +} +.icon-resize-horizontal { + background-position: -456px -118px; +} +.dropdown { + position: relative; +} +.dropdown-toggle { + *margin-bottom: -3px; +} +.dropdown-toggle:active, .open .dropdown-toggle { + outline: 0; +} +.caret { + display: inline-block; + width: 0; + height: 0; + text-indent: -99999px; + *text-indent: 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: "\2193"; +} +.dropdown .caret { + margin-top: 8px; + margin-left: 2px; +} +.dropdown:hover .caret, .open.dropdown .caret { + opacity: 1; + filter: alpha(opacity=100); +} +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + float: left; + display: none; + min-width: 160px; + max-width: 220px; + _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.bottom-up { + top: auto; + bottom: 100%; + margin-bottom: 2px; +} +.dropdown-menu .divider { + height: 1px; + margin: 5px 1px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; + *width: 100%; + *margin: -5px 0 5px; +} +.dropdown-menu a { + display: block; + padding: 3px 15px; + clear: both; + font-weight: normal; + line-height: 18px; + color: #555555; + white-space: nowrap; +} +.dropdown-menu li > a:hover, .dropdown-menu .active > a, .dropdown-menu .active > a:hover { + color: #ffffff; + text-decoration: none; + background-color: #0088cc; +} +.dropdown.open { + *z-index: 1000; +} +.dropdown.open .dropdown-toggle { + color: #ffffff; + background: #ccc; + background: rgba(0, 0, 0, 0.3); +} +.dropdown.open .dropdown-menu { + display: block; +} +.typeahead { + margin-top: 2px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.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); +} +.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; +} +.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; +} +.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; +} +.btn { + display: inline-block; + padding: 4px 10px 4px; + font-size: 13px; + line-height: 18px; + color: #333333; + text-align: center; + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); + background-color: #fafafa; + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6)); + background-image: -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); + background-image: -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6); + background-image: -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); + background-image: -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); + background-image: linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); + background-repeat: no-repeat; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0); + border: 1px solid #ccc; + border-bottom-color: #bbb; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + cursor: pointer; + *margin-left: .3em; +} +.btn:first-child { + *margin-left: 0; +} +.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; +} +.btn:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.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; + color: rgba(0, 0, 0, 0.5); + outline: 0; +} +.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; +} +.btn-large { + padding: 9px 14px; + font-size: 15px; + line-height: normal; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} +.btn-large .icon { + margin-top: 1px; +} +.btn-small { + padding: 5px 9px; + font-size: 11px; + line-height: 16px; +} +.btn-small .icon { + margin-top: -1px; +} +.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 { + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + color: #ffffff; +} +.btn-primary.active, +.btn-warning.active, +.btn-danger.active, +.btn-success.active, +.btn-info.active { + color: rgba(255, 255, 255, 0.75); +} +.btn-primary { + background-color: #006dcc; + background-image: -moz-linear-gradient(top, #0088cc, #0044cc); + background-image: -ms-linear-gradient(top, #0088cc, #0044cc); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); + background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); + background-image: -o-linear-gradient(top, #0088cc, #0044cc); + background-image: linear-gradient(top, #0088cc, #0044cc); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0); + border-color: #0044cc #0044cc #002a80; + 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: #0044cc; +} +.btn-primary:active, .btn-primary.active { + background-color: #003399 \9; +} +.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; +} +.btn-warning:active, .btn-warning.active { + background-color: #c67605 \9; +} +.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; +} +.btn-danger:active, .btn-danger.active { + background-color: #942a25 \9; +} +.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; +} +.btn-success:active, .btn-success.active { + background-color: #408140 \9; +} +.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; +} +.btn-info:active, .btn-info.active { + background-color: #24748c \9; +} +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; +} +button.btn.large, input[type="submit"].btn.large { + *padding-top: 7px; + *padding-bottom: 7px; +} +button.btn.small, input[type="submit"].btn.small { + *padding-top: 3px; + *padding-bottom: 3px; +} +.btn-group { + position: relative; + *zoom: 1; + *margin-left: .3em; +} +.btn-group:before, .btn-group:after { + display: table; + content: ""; +} +.btn-group:after { + clear: both; +} +.btn-group:first-child { + *margin-left: 0; +} +.btn-group + .btn-group { + margin-left: 5px; +} +.btn-toolbar { + margin-top: 9px; + margin-bottom: 9px; +} +.btn-toolbar .btn-group { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; +} +.btn-group .btn { + position: relative; + float: left; + margin-left: -1px; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.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; +} +.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; +} +.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; +} +.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; +} +.btn-group .btn:hover, +.btn-group .btn:focus, +.btn-group .btn:active, +.btn-group .btn.active { + z-index: 2; +} +.btn-group .dropdown-toggle:active, .btn-group.open .dropdown-toggle { + outline: 0; +} +.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: 5px; + *padding-bottom: 5px; +} +.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; +} +.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); +} +.btn .caret { + margin-top: 7px; + margin-left: 0; +} +.btn:hover .caret, .open.btn-group .caret { + opacity: 1; + filter: alpha(opacity=100); +} +.btn-primary .caret, +.btn-danger .caret, +.btn-info .caret, +.btn-success .caret { + border-top-color: #ffffff; + opacity: 0.75; + filter: alpha(opacity=75); +} +.btn-small .caret { + margin-top: 4px; +} +.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; +} +.alert, .alert-heading { + color: #c09853; +} +.alert .close { + position: relative; + top: -2px; + right: -21px; + line-height: 18px; +} +.alert-success { + background-color: #dff0d8; + border-color: #d6e9c6; +} +.alert-success, .alert-success .alert-heading { + color: #468847; +} +.alert-danger, .alert-error { + background-color: #f2dede; + border-color: #eed3d7; +} +.alert-danger, +.alert-error, +.alert-danger .alert-heading, +.alert-error .alert-heading { + color: #b94a48; +} +.alert-info { + background-color: #d9edf7; + border-color: #bce8f1; +} +.alert-info, .alert-info .alert-heading { + color: #3a87ad; +} +.alert-block { + padding-top: 14px; + padding-bottom: 14px; +} +.alert-block > p, .alert-block > ul { + margin-bottom: 0; +} +.alert-block p + p { + margin-top: 5px; +} +.nav { + margin-left: 0; + margin-bottom: 18px; + list-style: none; +} +.nav > li > a { + display: block; +} +.nav > li > a:hover { + text-decoration: none; + background-color: #eeeeee; +} +.nav-list { + padding-left: 14px; + padding-right: 14px; + margin-bottom: 0; +} +.nav-list > li > a, .nav-list .nav-header { + display: block; + padding: 3px 15px; + margin-left: -15px; + margin-right: -15px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); +} +.nav-list .nav-header { + font-size: 11px; + font-weight: bold; + line-height: 18px; + color: #999999; + text-transform: uppercase; +} + +.nav-list .nav-header * { + text-transform:none; +} + +.nav-list > li + .nav-header { + margin-top: 9px; +} +.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; +} +.nav-list [class^="icon-"] { + margin-right: 2px; +} +.nav-tabs, .nav-pills { + *zoom: 1; +} +.nav-tabs:before, +.nav-pills:before, +.nav-tabs:after, +.nav-pills:after { + display: table; + content: ""; +} +.nav-tabs:after, .nav-pills:after { + clear: both; +} +.nav-tabs > li, .nav-pills > li { + float: left; +} +.nav-tabs > li > a, .nav-pills > li > a { + padding-right: 12px; + padding-left: 12px; + margin-right: 2px; + line-height: 14px; +} +.nav-tabs { + border-bottom: 1px solid #ddd; +} +.nav-tabs > li { + margin-bottom: -1px; +} +.nav-tabs > li > a { + padding-top: 9px; + padding-bottom: 9px; + 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; +} +.nav-tabs > .active > a, .nav-tabs > .active > a:hover { + color: #555555; + background-color: #ffffff; + border: 1px solid #ddd; + border-bottom-color: transparent; + cursor: default; +} +.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; +} +.nav-pills .active > a, .nav-pills .active > a:hover { + color: #ffffff; + background-color: #0088cc; +} +.nav-stacked > li { + float: none; +} +.nav-stacked > li > a { + margin-right: 0; +} +.nav-tabs.nav-stacked { + border-bottom: 0; +} +.nav-tabs.nav-stacked > li > a { + border: 1px solid #ddd; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.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; +} +.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; +} +.nav-tabs.nav-stacked > li > a:hover { + border-color: #ddd; + z-index: 2; +} +.nav-pills.nav-stacked > li > a { + margin-bottom: 3px; +} +.nav-pills.nav-stacked > li:last-child > a { + margin-bottom: 1px; +} +.nav-tabs .dropdown-menu, .nav-pills .dropdown-menu { + margin-top: 1px; + border-width: 1px; +} +.nav-pills .dropdown-menu { + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.nav-tabs .dropdown-toggle .caret, .nav-pills .dropdown-toggle .caret { + border-top-color: #0088cc; + margin-top: 6px; +} +.nav-tabs .dropdown-toggle:hover .caret, .nav-pills .dropdown-toggle:hover .caret { + border-top-color: #005580; +} +.nav-tabs .active .dropdown-toggle .caret, .nav-pills .active .dropdown-toggle .caret { + border-top-color: #333333; +} +.nav > .dropdown.active > a:hover { + color: #000000; + cursor: pointer; +} +.nav-tabs .open .dropdown-toggle, .nav-pills .open .dropdown-toggle, .nav > .open.active > a:hover { + color: #ffffff; + background-color: #999999; + border-color: #999999; +} +.nav .open .caret, .nav .open.active .caret, .nav .open a:hover .caret { + border-top-color: #ffffff; + opacity: 1; + filter: alpha(opacity=100); +} +.tabs-stacked .open > a:hover { + border-color: #999999; +} +.tabbable { + *zoom: 1; +} +.tabbable:before, .tabbable:after { + display: table; + content: ""; +} +.tabbable:after { + clear: both; +} +.tabs-below .nav-tabs, .tabs-right .nav-tabs, .tabs-left .nav-tabs { + border-bottom: 0; +} +.tab-content > .tab-pane, .pill-content > .pill-pane { + display: none; +} +.tab-content > .active, .pill-content > .active { + display: block; +} +.tabs-below .nav-tabs { + border-top: 1px solid #ddd; +} +.tabs-below .nav-tabs > li { + margin-top: -1px; + margin-bottom: 0; +} +.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; +} +.tabs-below .nav-tabs .active > a, .tabs-below .nav-tabs .active > a:hover { + border-color: transparent #ddd #ddd #ddd; +} +.tabs-left .nav-tabs > li, .tabs-right .nav-tabs > li { + float: none; +} +.tabs-left .nav-tabs > li > a, .tabs-right .nav-tabs > li > a { + min-width: 74px; + margin-right: 0; + margin-bottom: 3px; +} +.tabs-left .nav-tabs { + float: left; + margin-right: 19px; + border-right: 1px solid #ddd; +} +.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; +} +.tabs-left .nav-tabs > li > a:hover { + border-color: #eeeeee #dddddd #eeeeee #eeeeee; +} +.tabs-left .nav-tabs .active > a, .tabs-left .nav-tabs .active > a:hover { + border-color: #ddd transparent #ddd #ddd; + *border-right-color: #ffffff; +} +.tabs-right .nav-tabs { + float: right; + margin-left: 19px; + border-left: 1px solid #ddd; +} +.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; +} +.tabs-right .nav-tabs > li > a:hover { + border-color: #eeeeee #eeeeee #eeeeee #dddddd; +} +.tabs-right .nav-tabs .active > a, .tabs-right .nav-tabs .active > a:hover { + border-color: #ddd #ddd #ddd transparent; + *border-left-color: #ffffff; +} +.navbar { + overflow: visible; + margin-bottom: 18px; +} +.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); +} +.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; +} +.btn-navbar:active, .btn-navbar.active { + background-color: #080808 \9; +} +.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); +} +.btn-navbar .icon-bar + .icon-bar { + margin-top: 3px; +} +.nav-collapse.collapse { + height: auto; +} +.navbar .brand:hover { + text-decoration: none; +} +.navbar .brand { + float: left; + display: block; + padding: 8px 20px 12px; + margin-left: -20px; + font-size: 20px; + font-weight: 200; + line-height: 1; + color: #ffffff; +} +.navbar .navbar-text { + margin-bottom: 0; + line-height: 40px; + color: #999999; +} +.navbar .navbar-text a:hover { + color: #ffffff; + background-color: transparent; +} +.navbar .btn, .navbar .btn-group { + margin-top: 5px; +} +.navbar .btn-group .btn { + margin-top: 0; +} +.navbar-form { + margin-bottom: 0; + *zoom: 1; +} +.navbar-form:before, .navbar-form:after { + display: table; + content: ""; +} +.navbar-form:after { + clear: both; +} +.navbar-form input, .navbar-form select { + display: inline-block; + margin-top: 5px; + margin-bottom: 0; +} +.navbar-form .radio, .navbar-form .checkbox { + margin-top: 5px; +} +.navbar-form input[type="image"], .navbar-form input[type="checkbox"], .navbar-form input[type="radio"] { + margin-top: 3px; +} +.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; + color: rgba(255, 255, 255, 0.75); + background: #666; + background: rgba(255, 255, 255, 0.3); + border: 1px solid #111; + -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: #eeeeee; +} +.navbar-search .search-query::-webkit-input-placeholder { + color: #eeeeee; +} +.navbar-search .search-query:hover { + color: #ffffff; + background-color: #999999; + background-color: rgba(255, 255, 255, 0.5); +} +.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; +} +.navbar-fixed-top { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: 1030; +} +.navbar-fixed-top .navbar-inner { + padding-left: 0; + padding-right: 0; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.navbar .nav { + position: relative; + left: 0; + display: block; + float: left; + margin: 0 10px 0 0; +} +.navbar .nav.pull-right { + float: right; +} +.navbar .nav > li { + display: block; + float: left; +} +.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); +} +.navbar .nav > li > a:hover { + background-color: transparent; + color: #ffffff; + text-decoration: none; +} +.navbar .nav .active > a, .navbar .nav .active > a:hover { + color: #ffffff; + text-decoration: none; + background-color: #222222; + background-color: rgba(0, 0, 0, 0.5); +} +.navbar .divider-vertical { + height: 40px; + width: 1px; + margin: 0 9px; + overflow: hidden; + background-color: #222222; + border-right: 1px solid #333333; +} +.navbar .nav.pull-right { + margin-left: 10px; + margin-right: 0; +} +.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; +} +.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; +} +.navbar .nav .dropdown-toggle .caret, .navbar .nav .open.dropdown .caret { + border-top-color: #ffffff; +} +.navbar .nav .active .caret { + opacity: 1; + filter: alpha(opacity=100); +} +.navbar .nav .open > .dropdown-toggle, .navbar .nav .active > .dropdown-toggle, .navbar .nav .open.active > .dropdown-toggle { + background-color: transparent; +} +.navbar .nav .active > .dropdown-toggle:hover { + color: #ffffff; +} +.navbar .nav.pull-right .dropdown-menu { + left: auto; + right: 0; +} +.navbar .nav.pull-right .dropdown-menu:before { + left: auto; + right: 12px; +} +.navbar .nav.pull-right .dropdown-menu:after { + left: auto; + right: 13px; +} +.breadcrumb { + padding: 7px 14px; + margin: 0 0 18px; + 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; + text-shadow: 0 1px 0 #ffffff; +} +.breadcrumb .divider { + padding: 0 5px; + color: #999999; +} +.breadcrumb .active a { + color: #333333; +} +.pagination { + height: 36px; + margin: 18px 0; +} +.pagination ul { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *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); +} +.pagination li { + display: inline; +} +.pagination a { + float: left; + padding: 0 14px; + line-height: 34px; + text-decoration: none; + border: 1px solid #ddd; + border-left-width: 0; +} +.pagination a:hover, .pagination .active a { + background-color: #f5f5f5; +} +.pagination .active a { + color: #999999; + cursor: default; +} +.pagination .disabled a, .pagination .disabled a:hover { + color: #999999; + background-color: transparent; + cursor: default; +} +.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; +} +.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; +} +.pagination-centered { + text-align: center; +} +.pagination-right { + text-align: right; +} +.pager { + margin-left: 0; + margin-bottom: 18px; + list-style: none; + text-align: center; + *zoom: 1; +} +.pager:before, .pager:after { + display: table; + content: ""; +} +.pager:after { + clear: both; +} +.pager li { + display: inline; +} +.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; +} +.pager a:hover { + text-decoration: none; + background-color: #f5f5f5; +} +.pager .next a { + float: right; +} +.pager .previous a { + float: left; +} +.modal-open .dropdown-menu { + z-index: 2050; +} +.modal-open .dropdown.open { + *z-index: 2050; +} +.modal-open .popover { + z-index: 2060; +} +.modal-open .tooltip { + z-index: 2070; +} +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000000; +} +.modal-backdrop.fade { + opacity: 0; +} +.modal-backdrop, .modal-backdrop.fade.in { + opacity: 0.8; + filter: alpha(opacity=80); +} +.modal { + position: fixed; + top: 50%; + left: 50%; + z-index: 1050; + max-height: 500px; + 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; + /* IE6-7 */ + + -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%; +} +.modal.fade.in { + top: 50%; +} +.modal-header { + padding: 9px 15px; + border-bottom: 1px solid #eee; +} +.modal-header .close { + margin-top: 2px; +} +.modal-body { + padding: 15px; +} +.modal-footer { + padding: 14px 15px 15px; + margin-bottom: 0; + 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: ""; +} +.modal-footer:after { + clear: both; +} +.modal-footer .btn { + float: right; + margin-left: 5px; + margin-bottom: 0; +} +.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); +} +.tooltip.top { + margin-top: -2px; +} +.tooltip.right { + margin-left: 2px; +} +.tooltip.bottom { + margin-top: 2px; +} +.tooltip.left { + margin-left: -2px; +} +.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; +} +.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; +} +.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; +} +.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; +} +.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; +} +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; +} +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1010; + display: none; + padding: 5px; +} +.popover.top { + margin-top: -5px; +} +.popover.right { + margin-left: 5px; +} +.popover.bottom { + margin-top: 5px; +} +.popover.left { + margin-left: -5px; +} +.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; +} +.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; +} +.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; +} +.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; +} +.popover .arrow { + position: absolute; + width: 0; + height: 0; +} +.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); +} +.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; +} +.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; +} +.thumbnails { + margin-left: -20px; + list-style: none; + *zoom: 1; +} +.thumbnails:before, .thumbnails:after { + display: table; + content: ""; +} +.thumbnails:after { + clear: both; +} +.thumbnails > li { + float: left; + margin: 0 0 18px 20px; +} +.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); +} +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); +} +.thumbnail > img { + display: block; + max-width: 100%; + margin-left: auto; + margin-right: auto; +} +.thumbnail .caption { + padding: 9px; +} +.label { + padding: 1px 3px 2px; + font-size: 9.75px; + font-weight: bold; + color: #ffffff; + text-transform: uppercase; + background-color: #999999; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +.label-important { + background-color: #b94a48; +} +.label-warning { + background-color: #f89406; +} +.label-success { + background-color: #468847; +} +.label-info { + background-color: #3a87ad; +} +@-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; + } +} +@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; +} +.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; + 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; +} +.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); + -webkit-background-size: 40px 40px; + -moz-background-size: 40px 40px; + -o-background-size: 40px 40px; + background-size: 40px 40px; +} +.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; +} +.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); +} +.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); +} +.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); +} +.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); +} +.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); +} +.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); +} +.accordion { + margin-bottom: 18px; +} +.accordion-group { + margin-bottom: 2px; + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.accordion-heading { + border-bottom: 0; +} +.accordion-heading .accordion-toggle { + display: block; + padding: 8px 15px; +} +.accordion-inner { + padding: 9px 15px; + border-top: 1px solid #e5e5e5; +} +.carousel { + position: relative; + margin-bottom: 18px; + line-height: 1; +} +.carousel-inner { + overflow: hidden; + width: 100%; + position: relative; +} +.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; +} +.carousel .item > img { + display: block; + line-height: 1; +} +.carousel .active, .carousel .next, .carousel .prev { + display: block; +} +.carousel .active { + left: 0; +} +.carousel .next, .carousel .prev { + position: absolute; + top: 0; + width: 100%; +} +.carousel .next { + left: 100%; +} +.carousel .prev { + left: -100%; +} +.carousel .next.left, .carousel .prev.right { + left: 0; +} +.carousel .active.left { + left: -100%; +} +.carousel .active.right { + left: 100%; +} +.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; +} +.carousel-control:hover { + color: #ffffff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); +} +.carousel-caption { + position: absolute; + left: 0; + right: 0; + bottom: 0; + padding: 10px 15px 5px; + background: #333333; + background: rgba(0, 0, 0, 0.75); +} +.carousel-caption h4, .carousel-caption p { + color: #ffffff; +} +.hero-unit { + padding: 60px; + margin-bottom: 30px; + background-color: #f5f5f5; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} +.hero-unit h1 { + margin-bottom: 0; + font-size: 60px; + line-height: 1; + letter-spacing: -1px; +} +.hero-unit p { + font-size: 18px; + font-weight: 200; + line-height: 27px; +} +.pull-right { + float: right; +} +.pull-left { + float: left; +} +.hide { + display: none; +} +.show { + display: block; +} +.invisible { + visibility: hidden; +} diff --git a/docs/Saml/css/bootstrap.min.css b/docs/Saml/css/bootstrap.min.css new file mode 100644 index 00000000..d5221249 --- /dev/null +++ b/docs/Saml/css/bootstrap.min.css @@ -0,0 +1,611 @@ +article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;} +audio,canvas,video{display:inline-block;*display:inline;*zoom:1;} +audio:not([controls]){display:none;} +html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;} +a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} +a:hover,a:active{outline:0;} +sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline;} +sup{top:-0.5em;} +sub{bottom:-0.25em;} +img{max-width:100%;height:auto;border:0;-ms-interpolation-mode:bicubic;} +button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle;} +button,input{*overflow:visible;line-height:normal;} +button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0;} +button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;} +input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;} +input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none;} +textarea{overflow:auto;vertical-align:top;} +body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;color:#333333;background-color:#ffffff;} +a{color:#0088cc;text-decoration:none;} +a:hover{color:#005580;text-decoration:underline;} +.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";} +.row:after{clear:both;} +[class*="span"]{float:left;margin-left:20px;} +.span1{width:60px;} +.span2{width:140px;} +.span3{width:220px;} +.span4{width:300px;} +.span5{width:380px;} +.span6{width:460px;} +.span7{width:540px;} +.span8{width:620px;} +.span9{width:700px;} +.span10{width:780px;} +.span11{width:860px;} +.span12,.container{width:940px;} +.offset1{margin-left:100px;} +.offset2{margin-left:180px;} +.offset3{margin-left:260px;} +.offset4{margin-left:340px;} +.offset5{margin-left:420px;} +.offset6{margin-left:500px;} +.offset7{margin-left:580px;} +.offset8{margin-left:660px;} +.offset9{margin-left:740px;} +.offset10{margin-left:820px;} +.offset11{margin-left:900px;} +.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.127659574%;} +.row-fluid>[class*="span"]:first-child{margin-left:0;} +.row-fluid .span1{width:6.382978723%;} +.row-fluid .span2{width:14.89361702%;} +.row-fluid .span3{width:23.404255317%;} +.row-fluid .span4{width:31.914893614%;} +.row-fluid .span5{width:40.425531911%;} +.row-fluid .span6{width:48.93617020799999%;} +.row-fluid .span7{width:57.446808505%;} +.row-fluid .span8{width:65.95744680199999%;} +.row-fluid .span9{width:74.468085099%;} +.row-fluid .span10{width:82.97872339599999%;} +.row-fluid .span11{width:91.489361693%;} +.row-fluid .span12{width:99.99999998999999%;} +.container{width:940px;margin-left:auto;margin-right:auto;*zoom:1;}.container:before,.container:after{display:table;content:"";} +.container:after{clear:both;} +.container-fluid{padding-left:20px;padding-right:20px;*zoom:1;}.container-fluid:before,.container-fluid:after{display:table;content:"";} +.container-fluid:after{clear:both;} +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;} +.lead{margin-bottom:18px;font-size:20px;font-weight:200;line-height:27px;} +h1,h2,h3,h4,h5,h6{margin:0;font-weight:bold;color:#333333;text-rendering:optimizelegibility;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;color:#999999;} +h1{font-size:30px;line-height:36px;}h1 small{font-size:18px;} +h2{font-size:24px;line-height:36px;}h2 small{font-size:18px;} +h3{line-height:27px;font-size:18px;}h3 small{font-size:14px;} +h4,h5,h6{line-height:18px;} +h4{font-size:14px;}h4 small{font-size:12px;} +h5{font-size:12px;} +h6{font-size:11px;color:#999999;text-transform:uppercase;} +.page-header{padding-bottom:17px;margin:18px 0;border-bottom:1px solid #eeeeee;} +.page-header h1{line-height:1;} +ul,ol{padding:0;margin:0 0 9px 25px;} +ul ul,ul ol,ol ol,ol ul{margin-bottom:0;} +ul{list-style:disc;} +ol{list-style:decimal;} +li{line-height:18px;} +ul.unstyled{margin-left:0;list-style:none;} +dl{margin-bottom:18px;} +dt,dd{line-height:18px;} +dt{font-weight:bold;} +dd{margin-left:9px;} +hr{margin:18px 0;border:0;border-top:1px solid #e5e5e5;border-bottom:1px solid #ffffff;} +strong{font-weight:bold;} +em{font-style:italic;} +.muted{color:#999999;} +abbr{font-size:90%;text-transform:uppercase;border-bottom:1px dotted #ddd;cursor:help;} +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;} +blockquote small{display:block;line-height:18px;color:#999999;}blockquote small:before{content:'\2014 \00A0';} +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;} +q:before,q:after,blockquote:before,blockquote:after{content:"";} +address{display:block;margin-bottom:18px;line-height:18px;font-style:normal;} +small{font-size:100%;} +cite{font-style:normal;} +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;} +code{padding:3px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8;} +pre{display:block;padding:8.5px;margin:0 0 9px;font-size:12px;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;}pre.prettyprint{margin-bottom:18px;} +pre code{padding:0;background-color:transparent;} +form{margin:0 0 18px;} +fieldset{padding:0;margin:0;border:0;} +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;} +label,input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:18px;} +label{display:block;margin-bottom:5px;color:#333333;} +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 #ccc;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +.uneditable-textarea{width:auto;height:auto;} +label input,label textarea,label select{display:block;} +input[type="image"],input[type="checkbox"],input[type="radio"]{width:auto;height:auto;padding:0;margin:3px 0;*margin-top:0;line-height:normal;border:0;cursor:pointer;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +input[type="file"]{padding:initial;line-height:initial;border:initial;background-color:#ffffff;background-color:initial;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} +input[type="button"],input[type="reset"],input[type="submit"]{width:auto;height:auto;} +select,input[type="file"]{height:28px;*margin-top:4px;line-height:28px;} +select{width:220px;background-color:#ffffff;} +select[multiple],select[size]{height:auto;} +input[type="image"]{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} +textarea{height:auto;} +input[type="hidden"]{display:none;} +.radio,.checkbox{padding-left:18px;} +.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-18px;} +.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px;} +.radio.inline,.checkbox.inline{display:inline-block;margin-bottom:0;vertical-align:middle;} +.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px;} +.controls>.radio.inline:first-child,.controls>.checkbox.inline:first-child{padding-top:0;} +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;} +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;} +input[type="file"]:focus,input[type="checkbox"]:focus,select:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} +.input-mini{width:60px;} +.input-small{width:90px;} +.input-medium{width:150px;} +.input-large{width:210px;} +.input-xlarge{width:270px;} +.input-xxlarge{width:530px;} +input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{float:none;margin-left:0;} +input.span1,textarea.span1,.uneditable-input.span1{width:50px;} +input.span2,textarea.span2,.uneditable-input.span2{width:130px;} +input.span3,textarea.span3,.uneditable-input.span3{width:210px;} +input.span4,textarea.span4,.uneditable-input.span4{width:290px;} +input.span5,textarea.span5,.uneditable-input.span5{width:370px;} +input.span6,textarea.span6,.uneditable-input.span6{width:450px;} +input.span7,textarea.span7,.uneditable-input.span7{width:530px;} +input.span8,textarea.span8,.uneditable-input.span8{width:610px;} +input.span9,textarea.span9,.uneditable-input.span9{width:690px;} +input.span10,textarea.span10,.uneditable-input.span10{width:770px;} +input.span11,textarea.span11,.uneditable-input.span11{width:850px;} +input.span12,textarea.span12,.uneditable-input.span12{width:930px;} +input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{background-color:#f5f5f5;border-color:#ddd;cursor:not-allowed;} +.control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853;} +.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;} +.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853;} +.control-group.error>label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48;} +.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;} +.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48;} +.control-group.success>label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847;} +.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;} +.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847;} +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;} +.form-actions{padding:17px 20px 18px;margin-top:18px;margin-bottom:18px;background-color:#f5f5f5;border-top:1px solid #ddd;} +.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;} +:-moz-placeholder{color:#999999;} +::-webkit-input-placeholder{color:#999999;} +.help-block{margin-top:5px;margin-bottom:0;color:#999999;} +.help-inline{display:inline-block;*display:inline;*zoom:1;margin-bottom:9px;vertical-align:middle;padding-left:5px;} +.input-prepend,.input-append{margin-bottom:5px;*zoom:1;}.input-prepend:before,.input-append:before,.input-prepend:after,.input-append:after{display:table;content:"";} +.input-prepend:after,.input-append:after{clear:both;} +.input-prepend input,.input-append input,.input-prepend .uneditable-input,.input-append .uneditable-input{-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 .uneditable-input:focus,.input-append .uneditable-input:focus{position:relative;z-index:2;} +.input-prepend .uneditable-input,.input-append .uneditable-input{border-left-color:#ccc;} +.input-prepend .add-on,.input-append .add-on{float:left;display:block;width:auto;min-width:16px;height:18px;margin-right:-1px;padding:4px 5px;font-weight:normal;line-height:18px;color:#999999;text-align:center;text-shadow:0 1px 0 #ffffff;background-color:#f5f5f5;border:1px solid #ccc;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} +.input-prepend .active,.input-append .active{background-color:#a9dba9;border-color:#46a546;} +.input-prepend .add-on{*margin-top:1px;} +.input-append input,.input-append .uneditable-input{float:left;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} +.input-append .uneditable-input{border-right-color:#ccc;} +.input-append .add-on{margin-right:0;margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;} +.input-append input:first-child{*margin-left:-160px;}.input-append input:first-child+.add-on{*margin-left:-21px;} +.search-query{padding-left:14px;padding-right:14px;margin-bottom:0;-webkit-border-radius:14px;-moz-border-radius:14px;border-radius:14px;} +.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{display:inline-block;margin-bottom:0;} +.form-search label,.form-inline label,.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{display:inline-block;} +.form-search .input-append .add-on,.form-inline .input-prepend .add-on,.form-search .input-append .add-on,.form-inline .input-prepend .add-on{vertical-align:middle;} +.control-group{margin-bottom:9px;} +.form-horizontal legend+.control-group{margin-top:18px;-webkit-margin-top-collapse:separate;} +.form-horizontal .control-group{margin-bottom:18px;*zoom:1;}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:"";} +.form-horizontal .control-group:after{clear:both;} +.form-horizontal .control-group>label{float:left;width:140px;padding-top:5px;text-align:right;} +.form-horizontal .controls{margin-left:160px;} +.form-horizontal .form-actions{padding-left:160px;} +table{max-width:100%;border-collapse:collapse;border-spacing:0;} +.table{width:100%;margin-bottom:18px;}.table th,.table td{padding:8px;line-height:18px;text-align:left;border-top:1px solid #ddd;} +.table th{font-weight:bold;vertical-align:bottom;} +.table td{vertical-align:top;} +.table thead:first-child tr th,.table thead:first-child tr td{border-top:0;} +.table tbody+tbody{border-top:2px solid #ddd;} +.table-condensed th,.table-condensed td{padding:4px 5px;} +.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapsed;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.table-bordered th+th,.table-bordered td+td,.table-bordered th+td,.table-bordered td+th{border-left:1px solid #ddd;} +.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;} +.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;} +.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;} +.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;} +.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;} +.table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9;} +table .span1{float:none;width:44px;margin-left:0;} +table .span2{float:none;width:124px;margin-left:0;} +table .span3{float:none;width:204px;margin-left:0;} +table .span4{float:none;width:284px;margin-left:0;} +table .span5{float:none;width:364px;margin-left:0;} +table .span6{float:none;width:444px;margin-left:0;} +table .span7{float:none;width:524px;margin-left:0;} +table .span8{float:none;width:604px;margin-left:0;} +table .span9{float:none;width:684px;margin-left:0;} +table .span10{float:none;width:764px;margin-left:0;} +table .span11{float:none;width:844px;margin-left:0;} +table .span12{float:none;width:924px;margin-left:0;} +[class^="icon-"]{display:inline-block;width:14px;height:14px;vertical-align:text-top;background-image:url(http://github.com/img/glyphicons-halflings.png);background-position:14px 14px;background-repeat:no-repeat;*margin-right:.3em;}[class^="icon-"]:last-child{*margin-left:0;} +.icon-white{background-image:url(http://github.com/img/glyphicons-halflings-white.png);} +.icon-glass{background-position:0 0;} +.icon-music{background-position:-24px 0;} +.icon-search{background-position:-48px 0;} +.icon-envelope{background-position:-72px 0;} +.icon-heart{background-position:-96px 0;} +.icon-star{background-position:-120px 0;} +.icon-star-empty{background-position:-144px 0;} +.icon-user{background-position:-168px 0;} +.icon-film{background-position:-192px 0;} +.icon-th-large{background-position:-216px 0;} +.icon-th{background-position:-240px 0;} +.icon-th-list{background-position:-264px 0;} +.icon-ok{background-position:-288px 0;} +.icon-remove{background-position:-312px 0;} +.icon-zoom-in{background-position:-336px 0;} +.icon-zoom-out{background-position:-360px 0;} +.icon-off{background-position:-384px 0;} +.icon-signal{background-position:-408px 0;} +.icon-cog{background-position:-432px 0;} +.icon-trash{background-position:-456px 0;} +.icon-home{background-position:0 -24px;} +.icon-file{background-position:-24px -24px;} +.icon-time{background-position:-48px -24px;} +.icon-road{background-position:-72px -24px;} +.icon-download-alt{background-position:-96px -24px;} +.icon-download{background-position:-120px -24px;} +.icon-upload{background-position:-144px -24px;} +.icon-inbox{background-position:-168px -24px;} +.icon-play-circle{background-position:-192px -24px;} +.icon-repeat{background-position:-216px -24px;} +.icon-refresh{background-position:-240px -24px;} +.icon-list-alt{background-position:-264px -24px;} +.icon-lock{background-position:-287px -24px;} +.icon-flag{background-position:-312px -24px;} +.icon-headphones{background-position:-336px -24px;} +.icon-volume-off{background-position:-360px -24px;} +.icon-volume-down{background-position:-384px -24px;} +.icon-volume-up{background-position:-408px -24px;} +.icon-qrcode{background-position:-432px -24px;} +.icon-barcode{background-position:-456px -24px;} +.icon-tag{background-position:0 -48px;} +.icon-tags{background-position:-25px -48px;} +.icon-book{background-position:-48px -48px;} +.icon-bookmark{background-position:-72px -48px;} +.icon-print{background-position:-96px -48px;} +.icon-camera{background-position:-120px -48px;} +.icon-font{background-position:-144px -48px;} +.icon-bold{background-position:-167px -48px;} +.icon-italic{background-position:-192px -48px;} +.icon-text-height{background-position:-216px -48px;} +.icon-text-width{background-position:-240px -48px;} +.icon-align-left{background-position:-264px -48px;} +.icon-align-center{background-position:-288px -48px;} +.icon-align-right{background-position:-312px -48px;} +.icon-align-justify{background-position:-336px -48px;} +.icon-list{background-position:-360px -48px;} +.icon-indent-left{background-position:-384px -48px;} +.icon-indent-right{background-position:-408px -48px;} +.icon-facetime-video{background-position:-432px -48px;} +.icon-picture{background-position:-456px -48px;} +.icon-pencil{background-position:0 -72px;} +.icon-map-marker{background-position:-24px -72px;} +.icon-adjust{background-position:-48px -72px;} +.icon-tint{background-position:-72px -72px;} +.icon-edit{background-position:-96px -72px;} +.icon-share{background-position:-120px -72px;} +.icon-check{background-position:-144px -72px;} +.icon-move{background-position:-168px -72px;} +.icon-step-backward{background-position:-192px -72px;} +.icon-fast-backward{background-position:-216px -72px;} +.icon-backward{background-position:-240px -72px;} +.icon-play{background-position:-264px -72px;} +.icon-pause{background-position:-288px -72px;} +.icon-stop{background-position:-312px -72px;} +.icon-forward{background-position:-336px -72px;} +.icon-fast-forward{background-position:-360px -72px;} +.icon-step-forward{background-position:-384px -72px;} +.icon-eject{background-position:-408px -72px;} +.icon-chevron-left{background-position:-432px -72px;} +.icon-chevron-right{background-position:-456px -72px;} +.icon-plus-sign{background-position:0 -96px;} +.icon-minus-sign{background-position:-24px -96px;} +.icon-remove-sign{background-position:-48px -96px;} +.icon-ok-sign{background-position:-72px -96px;} +.icon-question-sign{background-position:-96px -96px;} +.icon-info-sign{background-position:-120px -96px;} +.icon-screenshot{background-position:-144px -96px;} +.icon-remove-circle{background-position:-168px -96px;} +.icon-ok-circle{background-position:-192px -96px;} +.icon-ban-circle{background-position:-216px -96px;} +.icon-arrow-left{background-position:-240px -96px;} +.icon-arrow-right{background-position:-264px -96px;} +.icon-arrow-up{background-position:-289px -96px;} +.icon-arrow-down{background-position:-312px -96px;} +.icon-share-alt{background-position:-336px -96px;} +.icon-resize-full{background-position:-360px -96px;} +.icon-resize-small{background-position:-384px -96px;} +.icon-plus{background-position:-408px -96px;} +.icon-minus{background-position:-433px -96px;} +.icon-asterisk{background-position:-456px -96px;} +.icon-exclamation-sign{background-position:0 -120px;} +.icon-gift{background-position:-24px -120px;} +.icon-leaf{background-position:-48px -120px;} +.icon-fire{background-position:-72px -120px;} +.icon-eye-open{background-position:-96px -120px;} +.icon-eye-close{background-position:-120px -120px;} +.icon-warning-sign{background-position:-144px -120px;} +.icon-plane{background-position:-168px -120px;} +.icon-calendar{background-position:-192px -120px;} +.icon-random{background-position:-216px -120px;} +.icon-comment{background-position:-240px -120px;} +.icon-magnet{background-position:-264px -120px;} +.icon-chevron-up{background-position:-288px -120px;} +.icon-chevron-down{background-position:-313px -119px;} +.icon-retweet{background-position:-336px -120px;} +.icon-shopping-cart{background-position:-360px -120px;} +.icon-folder-close{background-position:-384px -120px;} +.icon-folder-open{background-position:-408px -120px;} +.icon-resize-vertical{background-position:-432px -119px;} +.icon-resize-horizontal{background-position:-456px -118px;} +.dropdown{position:relative;} +.dropdown-toggle{*margin-bottom:-3px;} +.dropdown-toggle:active,.open .dropdown-toggle{outline:0;} +.caret{display:inline-block;width:0;height:0;text-indent:-99999px;*text-indent: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:"\2193";} +.dropdown .caret{margin-top:8px;margin-left:2px;} +.dropdown:hover .caret,.open.dropdown .caret{opacity:1;filter:alpha(opacity=100);} +.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;float:left;display:none;min-width:160px;max-width:220px;_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.bottom-up{top:auto;bottom:100%;margin-bottom:2px;} +.dropdown-menu .divider{height:1px;margin:5px 1px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;*width:100%;*margin:-5px 0 5px;} +.dropdown-menu a{display:block;padding:3px 15px;clear:both;font-weight:normal;line-height:18px;color:#555555;white-space:nowrap;} +.dropdown-menu li>a:hover,.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#ffffff;text-decoration:none;background-color:#0088cc;} +.dropdown.open{*z-index:1000;}.dropdown.open .dropdown-toggle{color:#ffffff;background:#ccc;background:rgba(0, 0, 0, 0.3);} +.dropdown.open .dropdown-menu{display:block;} +.typeahead{margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.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);} +.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;} +.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;} +.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;} +.btn{display:inline-block;padding:4px 10px 4px;font-size:13px;line-height:18px;color:#333333;text-align:center;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);background-color:#fafafa;background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:-moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);background-image:-ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:-o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);border:1px solid #ccc;border-bottom-color:#bbb;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);cursor:pointer;*margin-left:.3em;}.btn:first-child{*margin-left:0;} +.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;} +.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} +.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;color:rgba(0, 0, 0, 0.5);outline:0;} +.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;} +.btn-large{padding:9px 14px;font-size:15px;line-height:normal;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} +.btn-large .icon{margin-top:1px;} +.btn-small{padding:5px 9px;font-size:11px;line-height:16px;} +.btn-small .icon{margin-top:-1px;} +.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{text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);color:#ffffff;} +.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active{color:rgba(255, 255, 255, 0.75);} +.btn-primary{background-color:#006dcc;background-image:-moz-linear-gradient(top, #0088cc, #0044cc);background-image:-ms-linear-gradient(top, #0088cc, #0044cc);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));background-image:-webkit-linear-gradient(top, #0088cc, #0044cc);background-image:-o-linear-gradient(top, #0088cc, #0044cc);background-image:linear-gradient(top, #0088cc, #0044cc);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);border-color:#0044cc #0044cc #002a80;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:#0044cc;} +.btn-primary:active,.btn-primary.active{background-color:#003399 \9;} +.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;} +.btn-warning:active,.btn-warning.active{background-color:#c67605 \9;} +.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;} +.btn-danger:active,.btn-danger.active{background-color:#942a25 \9;} +.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;} +.btn-success:active,.btn-success.active{background-color:#408140 \9;} +.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;} +.btn-info:active,.btn-info.active{background-color:#24748c \9;} +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;} +button.btn.large,input[type="submit"].btn.large{*padding-top:7px;*padding-bottom:7px;} +button.btn.small,input[type="submit"].btn.small{*padding-top:3px;*padding-bottom:3px;} +.btn-group{position:relative;*zoom:1;*margin-left:.3em;}.btn-group:before,.btn-group:after{display:table;content:"";} +.btn-group:after{clear:both;} +.btn-group:first-child{*margin-left:0;} +.btn-group+.btn-group{margin-left:5px;} +.btn-toolbar{margin-top:9px;margin-bottom:9px;}.btn-toolbar .btn-group{display:inline-block;*display:inline;*zoom:1;} +.btn-group .btn{position:relative;float:left;margin-left:-1px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.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;} +.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;} +.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;} +.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;} +.btn-group .btn:hover,.btn-group .btn:focus,.btn-group .btn:active,.btn-group .btn.active{z-index:2;} +.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0;} +.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:5px;*padding-bottom:5px;} +.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;} +.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);} +.btn .caret{margin-top:7px;margin-left:0;} +.btn:hover .caret,.open.btn-group .caret{opacity:1;filter:alpha(opacity=100);} +.btn-primary .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret{border-top-color:#ffffff;opacity:0.75;filter:alpha(opacity=75);} +.btn-small .caret{margin-top:4px;} +.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;} +.alert,.alert-heading{color:#c09853;} +.alert .close{position:relative;top:-2px;right:-21px;line-height:18px;} +.alert-success{background-color:#dff0d8;border-color:#d6e9c6;} +.alert-success,.alert-success .alert-heading{color:#468847;} +.alert-danger,.alert-error{background-color:#f2dede;border-color:#eed3d7;} +.alert-danger,.alert-error,.alert-danger .alert-heading,.alert-error .alert-heading{color:#b94a48;} +.alert-info{background-color:#d9edf7;border-color:#bce8f1;} +.alert-info,.alert-info .alert-heading{color:#3a87ad;} +.alert-block{padding-top:14px;padding-bottom:14px;} +.alert-block>p,.alert-block>ul{margin-bottom:0;} +.alert-block p+p{margin-top:5px;} +.nav{margin-left:0;margin-bottom:18px;list-style:none;} +.nav>li>a{display:block;} +.nav>li>a:hover{text-decoration:none;background-color:#eeeeee;} +.nav-list{padding-left:14px;padding-right:14px;margin-bottom:0;} +.nav-list>li>a,.nav-list .nav-header{display:block;padding:3px 15px;margin-left:-15px;margin-right:-15px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);} +.nav-list .nav-header{font-size:11px;font-weight:bold;line-height:18px;color:#999999;text-transform:uppercase;} +.nav-list .nav-header *{text-transform:none;} +.nav-list>li+.nav-header{margin-top:9px;} +.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;} +.nav-list [class^="icon-"]{margin-right:2px;} +.nav-tabs,.nav-pills{*zoom:1;}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;content:"";} +.nav-tabs:after,.nav-pills:after{clear:both;} +.nav-tabs>li,.nav-pills>li{float:left;} +.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px;} +.nav-tabs{border-bottom:1px solid #ddd;} +.nav-tabs>li{margin-bottom:-1px;} +.nav-tabs>li>a{padding-top:9px;padding-bottom:9px;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;} +.nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555555;background-color:#ffffff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default;} +.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;} +.nav-pills .active>a,.nav-pills .active>a:hover{color:#ffffff;background-color:#0088cc;} +.nav-stacked>li{float:none;} +.nav-stacked>li>a{margin-right:0;} +.nav-tabs.nav-stacked{border-bottom:0;} +.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.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;} +.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;} +.nav-tabs.nav-stacked>li>a:hover{border-color:#ddd;z-index:2;} +.nav-pills.nav-stacked>li>a{margin-bottom:3px;} +.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px;} +.nav-tabs .dropdown-menu,.nav-pills .dropdown-menu{margin-top:1px;border-width:1px;} +.nav-pills .dropdown-menu{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.nav-tabs .dropdown-toggle .caret,.nav-pills .dropdown-toggle .caret{border-top-color:#0088cc;margin-top:6px;} +.nav-tabs .dropdown-toggle:hover .caret,.nav-pills .dropdown-toggle:hover .caret{border-top-color:#005580;} +.nav-tabs .active .dropdown-toggle .caret,.nav-pills .active .dropdown-toggle .caret{border-top-color:#333333;} +.nav>.dropdown.active>a:hover{color:#000000;cursor:pointer;} +.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>.open.active>a:hover{color:#ffffff;background-color:#999999;border-color:#999999;} +.nav .open .caret,.nav .open.active .caret,.nav .open a:hover .caret{border-top-color:#ffffff;opacity:1;filter:alpha(opacity=100);} +.tabs-stacked .open>a:hover{border-color:#999999;} +.tabbable{*zoom:1;}.tabbable:before,.tabbable:after{display:table;content:"";} +.tabbable:after{clear:both;} +.tabs-below .nav-tabs,.tabs-right .nav-tabs,.tabs-left .nav-tabs{border-bottom:0;} +.tab-content>.tab-pane,.pill-content>.pill-pane{display:none;} +.tab-content>.active,.pill-content>.active{display:block;} +.tabs-below .nav-tabs{border-top:1px solid #ddd;} +.tabs-below .nav-tabs>li{margin-top:-1px;margin-bottom:0;} +.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;} +.tabs-below .nav-tabs .active>a,.tabs-below .nav-tabs .active>a:hover{border-color:transparent #ddd #ddd #ddd;} +.tabs-left .nav-tabs>li,.tabs-right .nav-tabs>li{float:none;} +.tabs-left .nav-tabs>li>a,.tabs-right .nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px;} +.tabs-left .nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd;} +.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;} +.tabs-left .nav-tabs>li>a:hover{border-color:#eeeeee #dddddd #eeeeee #eeeeee;} +.tabs-left .nav-tabs .active>a,.tabs-left .nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#ffffff;} +.tabs-right .nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd;} +.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;} +.tabs-right .nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #eeeeee #dddddd;} +.tabs-right .nav-tabs .active>a,.tabs-right .nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#ffffff;} +.navbar{overflow:visible;margin-bottom:18px;} +.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);} +.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;} +.btn-navbar:active,.btn-navbar.active{background-color:#080808 \9;} +.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);} +.btn-navbar .icon-bar+.icon-bar{margin-top:3px;} +.nav-collapse.collapse{height:auto;} +.navbar .brand:hover{text-decoration:none;} +.navbar .brand{float:left;display:block;padding:8px 20px 12px;margin-left:-20px;font-size:20px;font-weight:200;line-height:1;color:#ffffff;} +.navbar .navbar-text{margin-bottom:0;line-height:40px;color:#999999;}.navbar .navbar-text a:hover{color:#ffffff;background-color:transparent;} +.navbar .btn,.navbar .btn-group{margin-top:5px;} +.navbar .btn-group .btn{margin-top:0;} +.navbar-form{margin-bottom:0;*zoom:1;}.navbar-form:before,.navbar-form:after{display:table;content:"";} +.navbar-form:after{clear:both;} +.navbar-form input,.navbar-form select{display:inline-block;margin-top:5px;margin-bottom:0;} +.navbar-form .radio,.navbar-form .checkbox{margin-top:5px;} +.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px;} +.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;color:rgba(255, 255, 255, 0.75);background:#666;background:rgba(255, 255, 255, 0.3);border:1px solid #111;-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:#eeeeee;} +.navbar-search .search-query::-webkit-input-placeholder{color:#eeeeee;} +.navbar-search .search-query:hover{color:#ffffff;background-color:#999999;background-color:rgba(255, 255, 255, 0.5);} +.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;} +.navbar-fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030;} +.navbar-fixed-top .navbar-inner{padding-left:0;padding-right:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0;} +.navbar .nav.pull-right{float:right;} +.navbar .nav>li{display:block;float:left;} +.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);} +.navbar .nav>li>a:hover{background-color:transparent;color:#ffffff;text-decoration:none;} +.navbar .nav .active>a,.navbar .nav .active>a:hover{color:#ffffff;text-decoration:none;background-color:#222222;background-color:rgba(0, 0, 0, 0.5);} +.navbar .divider-vertical{height:40px;width:1px;margin:0 9px;overflow:hidden;background-color:#222222;border-right:1px solid #333333;} +.navbar .nav.pull-right{margin-left:10px;margin-right:0;} +.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;} +.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;} +.navbar .nav .dropdown-toggle .caret,.navbar .nav .open.dropdown .caret{border-top-color:#ffffff;} +.navbar .nav .active .caret{opacity:1;filter:alpha(opacity=100);} +.navbar .nav .open>.dropdown-toggle,.navbar .nav .active>.dropdown-toggle,.navbar .nav .open.active>.dropdown-toggle{background-color:transparent;} +.navbar .nav .active>.dropdown-toggle:hover{color:#ffffff;} +.navbar .nav.pull-right .dropdown-menu{left:auto;right:0;}.navbar .nav.pull-right .dropdown-menu:before{left:auto;right:12px;} +.navbar .nav.pull-right .dropdown-menu:after{left:auto;right:13px;} +.breadcrumb{padding:7px 14px;margin:0 0 18px;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;text-shadow:0 1px 0 #ffffff;} +.breadcrumb .divider{padding:0 5px;color:#999999;} +.breadcrumb .active a{color:#333333;} +.pagination{height:36px;margin:18px 0;} +.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);} +.pagination li{display:inline;} +.pagination a{float:left;padding:0 14px;line-height:34px;text-decoration:none;border:1px solid #ddd;border-left-width:0;} +.pagination a:hover,.pagination .active a{background-color:#f5f5f5;} +.pagination .active a{color:#999999;cursor:default;} +.pagination .disabled a,.pagination .disabled a:hover{color:#999999;background-color:transparent;cursor:default;} +.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;} +.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;} +.pagination-centered{text-align:center;} +.pagination-right{text-align:right;} +.pager{margin-left:0;margin-bottom:18px;list-style:none;text-align:center;*zoom:1;}.pager:before,.pager:after{display:table;content:"";} +.pager:after{clear:both;} +.pager li{display:inline;} +.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;} +.pager a:hover{text-decoration:none;background-color:#f5f5f5;} +.pager .next a{float:right;} +.pager .previous a{float:left;} +.modal-open .dropdown-menu{z-index:2050;} +.modal-open .dropdown.open{*z-index:2050;} +.modal-open .popover{z-index:2060;} +.modal-open .tooltip{z-index:2070;} +.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000;}.modal-backdrop.fade{opacity:0;} +.modal-backdrop,.modal-backdrop.fade.in{opacity:0.8;filter:alpha(opacity=80);} +.modal{position:fixed;top:50%;left:50%;z-index:1050;max-height:500px;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%;} +.modal.fade.in{top:50%;} +.modal-header{padding:9px 15px;border-bottom:1px solid #eee;}.modal-header .close{margin-top:2px;} +.modal-body{padding:15px;} +.modal-footer{padding:14px 15px 15px;margin-bottom:0;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:"";} +.modal-footer:after{clear:both;} +.modal-footer .btn{float:right;margin-left:5px;margin-bottom:0;} +.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);} +.tooltip.top{margin-top:-2px;} +.tooltip.right{margin-left:2px;} +.tooltip.bottom{margin-top:2px;} +.tooltip.left{margin-left:-2px;} +.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;} +.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;} +.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;} +.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;} +.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;} +.tooltip-arrow{position:absolute;width:0;height:0;} +.popover{position:absolute;top:0;left:0;z-index:1010;display:none;padding:5px;}.popover.top{margin-top:-5px;} +.popover.right{margin-left:5px;} +.popover.bottom{margin-top:5px;} +.popover.left{margin-left:-5px;} +.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;} +.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;} +.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;} +.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;} +.popover .arrow{position:absolute;width:0;height:0;} +.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);} +.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;} +.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;} +.thumbnails{margin-left:-20px;list-style:none;*zoom:1;}.thumbnails:before,.thumbnails:after{display:table;content:"";} +.thumbnails:after{clear:both;} +.thumbnails>li{float:left;margin:0 0 18px 20px;} +.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);} +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);} +.thumbnail>img{display:block;max-width:100%;margin-left:auto;margin-right:auto;} +.thumbnail .caption{padding:9px;} +.label{padding:1px 3px 2px;font-size:9.75px;font-weight:bold;color:#ffffff;text-transform:uppercase;background-color:#999999;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +.label-important{background-color:#b94a48;} +.label-warning{background-color:#f89406;} +.label-success{background-color:#468847;} +.label-info{background-color:#3a87ad;} +@-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;}}@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;} +.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;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;} +.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);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px;} +.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;} +.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);} +.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);} +.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);} +.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);} +.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);} +.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);} +.accordion{margin-bottom:18px;} +.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.accordion-heading{border-bottom:0;} +.accordion-heading .accordion-toggle{display:block;padding:8px 15px;} +.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5;} +.carousel{position:relative;margin-bottom:18px;line-height:1;} +.carousel-inner{overflow:hidden;width:100%;position:relative;} +.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;} +.carousel .item>img{display:block;line-height:1;} +.carousel .active,.carousel .next,.carousel .prev{display:block;} +.carousel .active{left:0;} +.carousel .next,.carousel .prev{position:absolute;top:0;width:100%;} +.carousel .next{left:100%;} +.carousel .prev{left:-100%;} +.carousel .next.left,.carousel .prev.right{left:0;} +.carousel .active.left{left:-100%;} +.carousel .active.right{left:100%;} +.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;} +.carousel-control:hover{color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90);} +.carousel-caption{position:absolute;left:0;right:0;bottom:0;padding:10px 15px 5px;background:#333333;background:rgba(0, 0, 0, 0.75);} +.carousel-caption h4,.carousel-caption p{color:#ffffff;} +.hero-unit{padding:60px;margin-bottom:30px;background-color:#f5f5f5;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;} +.hero-unit p{font-size:18px;font-weight:200;line-height:27px;} +.pull-right{float:right;} +.pull-left{float:left;} +.hide{display:none;} +.show{display:block;} +.invisible{visibility:hidden;} diff --git a/docs/Saml/css/jquery.iviewer.css b/docs/Saml/css/jquery.iviewer.css new file mode 100644 index 00000000..d68c6422 --- /dev/null +++ b/docs/Saml/css/jquery.iviewer.css @@ -0,0 +1,91 @@ +.iviewer_common { + position:absolute; + bottom:10px; + border: 1px solid #000; + height: 28px; + z-index: 5000; +} + +.iviewer_cursor { + cursor: url(http://github.com/img/iviewer/hand.cur) 6 8, pointer; +} + +.iviewer_drag_cursor { + cursor: url(http://github.com/img/iviewer/grab.cur) 6 8, pointer; +} + +.iviewer_button { + width: 28px; + cursor: pointer; + background-position: center center; + background-repeat: no-repeat; +} + +.iviewer_zoom_in { + left: 20px; + background: url(http://github.com/img/iviewer/iviewer.zoom_in.png); +} + +.iviewer_zoom_out { + left: 55px; + background: url(http://github.com/img/iviewer/iviewer.zoom_out.png); +} + +.iviewer_zoom_zero { + left: 90px; + background: url(http://github.com/img/iviewer/iviewer.zoom_zero.png); +} + +.iviewer_zoom_fit { + left: 125px; + background: url(http://github.com/img/iviewer/iviewer.zoom_fit.png); +} + +.iviewer_zoom_status { + left: 160px; + font: 1em/28px Sans; + color: #000; + background-color: #fff; + text-align: center; + width: 60px; +} + +.iviewer_rotate_left { + left: 227px; + background: #fff url(http://github.com/img/iviewer/iviewer.rotate_left.png) center center no-repeat; +} + +.iviewer_rotate_right { + left: 262px; + background: #fff url(http://github.com/img/iviewer/iviewer.rotate_right.png) center center no-repeat; +} + +.viewer +{ + width: 100%; + height: 500px; + position: relative; + background: transparent url('http://github.com/img/loader.gif') no-repeat center center; +} + +.viewer img +{ + max-width: none; +} + +.wrapper +{ + overflow: hidden; +} + +.iviewer_common +{ + border: 0; + bottom: auto; + top: 10px; +} + +.iviewer_zoom_status +{ + border: 1px solid black; +} diff --git a/docs/Saml/css/prettify.css b/docs/Saml/css/prettify.css new file mode 100644 index 00000000..d44b3a22 --- /dev/null +++ b/docs/Saml/css/prettify.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} \ No newline at end of file diff --git a/docs/Saml/css/template.css b/docs/Saml/css/template.css new file mode 100644 index 00000000..45d61967 --- /dev/null +++ b/docs/Saml/css/template.css @@ -0,0 +1,527 @@ +@import url(http://github.com/bootstrap.min.css); +@import url(http://github.com/bootstrap-responsive.css); +@import url(http://github.com/prettify.css); +@import url(http://github.com/jquery.iviewer.css); +@import url(http://fonts.googleapis.com/css?family=Forum); + +body +{ + padding-top: 60px; /* 60px to make the container go all the way to the bottom of the topbar */ + background: #f9f9f9; + color: #444; +} + +a +{ + color: #55A72F; +} + +td p:last-of-type { + margin: 0; +} + +li.l0, li.l1, li.l2, li.l3, li.l5, li.l6, li.l7, li.l8 +{ + list-style-type: decimal; +} + +a.brand, h2, .hero-unit h1 +{ + font-family: 'Forum', "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +.element .span4 +{ + width: 275px; +} + +.namespace-contents hr, .package-contents hr +{ + border-top: 3px dotted silver; +} + +.namespace-indent, .package-indent +{ + padding-left: 10px; border-left: 1px dashed #f0f0f0; +} + +.element h3 i, .namespace-contents h3 i, .package-contents h3 i +{ + margin-top: 2px; + margin-right: 5px; +} + +.element h3, .namespace-contents h3, .package-contents h3 +{ + margin-top: 25px; + margin-bottom: 20px; + border-bottom: 1px solid silver; +} + +.element h3:first-of-type, .namespace-contents h3:first-of-type, +.package-contents h3:first-of-type +{ + margin-top: 30px; +} + +.element h2 +{ + font-family: inherit; + font-size: 1.2em; + color: black; +} + +.element .type +{ + font-weight: bold; +} + +#search-query +{ + height: auto; +} + +.hero-unit, div.element, .well +{ + border: 1px solid #e0e0e0; + background: white; +} + +.dropdown-menu a{ + overflow: hidden; + text-overflow: ellipsis; +} +h2 +{ + border-bottom: 1px dashed #55A72F; + margin-bottom: 10px; + padding-bottom: 0; + padding-left: 5px; + color: #e9e9e9; + font-weight: normal; + margin-top: 40px; +} + +h2:first-of-type +{ + margin-top: 0; +} + +.hero-unit +{ + background: #75a70d; /* Old browsers */ + background: -moz-radial-gradient(center, ellipse cover, #bfd255 0%, #8eb92a 72%, #72aa00 96%, #9ecb2d 100%); /* FF3.6+ */ + background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%,#bfd255), color-stop(72%,#8eb92a), color-stop(96%,#72aa00), color-stop(100%,#9ecb2d)); /* Chrome,Safari4+ */ + background: -webkit-radial-gradient(center, ellipse cover, #bfd255 0%,#8eb92a 72%,#72aa00 96%,#9ecb2d 100%); /* Chrome10+,Safari5.1+ */ + background: -o-radial-gradient(center, ellipse cover, #bfd255 0%,#8eb92a 72%,#72aa00 96%,#9ecb2d 100%); /* Opera 12+ */ + background: -ms-radial-gradient(center, ellipse cover, #bfd255 0%,#8eb92a 72%,#72aa00 96%,#9ecb2d 100%); /* IE10+ */ + background: radial-gradient(center, ellipse cover, #bfd255 0%,#8eb92a 72%,#72aa00 96%,#9ecb2d 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#bfd255', endColorstr='#9ecb2d',GradientType=1 ); /* IE6-9 fallback on horizontal gradient */ + + padding: 40px 0 15px 0; + box-shadow: inset 0 0 10px gray; +} + +.hero-unit h1 +{ + font-weight: normal; + text-align: center; + color: white; + text-shadow: black 0 0 15px; +} + +.hero-unit h2 +{ + border: none; + color: white; + background: rgba(48, 48, 48, 0.5); + padding: 0; + margin: 0; + margin-top: 15px; + text-align: center; +} + +.namespace-contents h2, .package-contents h2 +{ + padding-left: 44px; + background: transparent url('http://github.com/img/icons/icon-th-big.png') no-repeat 3px center; +} + +.package-contents h2 +{ + background-image: url('http://github.com/img/icons/icon-folder-open-big.png'); +} + +.namespace-contents .element h2, .package-contents .element h2 +{ + padding-left: 0; + background: none; +} + +div.element +{ + border-left: 10px solid #55A72F; + border-radius: 5px; + padding: 7px 7px 2px 7px; + margin-bottom: 15px; + margin-left: 0; +} + +div.element.protected +{ + border-left-color: orange; +} + +div.element.private +{ + border-left-color: red; +} + +div.element.class, div.element.interface +{ + border-left-color: #e0e0e0; +} + +div.element.class.abstract h1, div.element.interface.abstract h1 +{ + font-style: italic; +} + +div.element h1 +{ + font-size: 1.2em; + line-height: 1.5em; + margin-bottom: 10px; + padding-left: 22px; + background: transparent no-repeat left 2px; + word-wrap: break-word; +} + +div.element h1 a +{ + color: transparent; + margin-left: 10px; +} + +div.element h1:hover a +{ + color: silver; +} + +div.element h1 a:hover +{ + color: navy; +} + +div.element a.more:hover +{ + background: #f0f0f0; + color: #444; + text-decoration: none; +} + +div.element a.more +{ + font-weight: bold; + text-align: center; + color: gray; + border-top: 1px dashed silver; + display: block; + margin-top: 5px; + padding: 5px 0; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; +} + +div.element p +{ + font-size: 0.9em; +} + +div.element .table +{ + font-size: 0.9em; +} + +div.element .table th +{ + text-transform: capitalize; +} + +div.detail-description +{ + padding-left: 30px; +} + +div.detail-description table th { + vertical-align: top; +} + +body.invert +{ + background: white; +} + +body.invert div.element +{ + background: #f9f9f9; +} + +ul.side-nav +{ + clear: both; +} + +ul.side-nav li +{ + word-wrap: break-word; + padding-left: 10px; + text-indent: -10px; +} + +ul.side-nav li a +{ + background: transparent no-repeat 5px 3px; + padding-bottom: 10px; + font-style: italic; +} + +ul.side-nav li pre +{ + font-size: 0.8em; + margin: 5px 15px 0 15px; + padding: 2px 5px; + background-color: #f8f8f8; + color: gray; + font-style: normal; + word-wrap: break-word; + text-indent: 0; +} + +ul.side-nav li.view-simple span.description +{ + display: none; +} + +ul.side-nav li.view-simple pre +{ + font-size: inherit; + margin: inherit; + padding: inherit; + background-color: inherit; + border: none; + color: inherit; + font-family: inherit; + font-style: inherit; + padding-bottom: 0; + padding-left: 5px; +} + +ul.side-nav li.view-simple a +{ + padding-bottom: 0; +} + +i.icon-custom +{ + width: 16px; + height: 16px; + background-position: 0; +} + +.table.markers +{ + background: white; +} + +/* JS only functionality; disable by default */ +.btn-group.visibility, .btn-group.view, .btn-group.type-filter +{ + display: none; +} + +.visibility button +{ + height: 24px; +} + +div.element.constant h1, +i.icon-constant { background-image: url('http://github.com/img/icons/constant.png'); } + +div.element.function h1, +i.icon-function { background-image: url('http://github.com/img/icons/function.png'); } + +div.element.method h1, +i.icon-method { background-image: url('http://github.com/img/icons/method.png'); } + +div.element.class h1, +i.icon-class { background-image: url('http://github.com/img/icons/class.png'); } + +div.element.interface h1, +i.icon-interface { background-image: url('http://github.com/img/icons/interface.png'); } + +div.element.property h1, +i.icon-property { background-image: url('http://github.com/img/icons/property.png'); } + +span.empty-namespace +{ + color: silver; +} + +footer +{ + text-align: right; + font-size: 0.8em; + opacity: 0.5; +} + +#mapHolder +{ + border: 4px solid #555; + padding: 0 !important; + overflow: hidden +} + +div.element div.subelement +{ + margin-left: 10px; + padding-bottom: 5px; + clear: both; +} + +pre code +{ + border: none; +} + +div.element div.subelement > code +{ + font-size: 0.8em; + float: left; + margin-right: 10px; + padding: 0 5px; + line-height: 16px; +} + +div.element div.subelement > p +{ + margin-left: 20px; + margin-right: 50px; +} + +div.element div.subelement h4 +{ + color: #666; + margin-bottom: 5px; +} + +div.element div.subelement.response +{ + padding-bottom: 15px; + margin-right: 50px; +} + +div.labels +{ + text-align: right; +} + +.nav-list .nav-header +{ + font-size: 13px; +} + +.nav-list .nav-header .side-nav-header +{ + font-weight: bold; + line-height: 18px; + color: #999999; + text-transform: uppercase; +} + +.detail-description code { + white-space: pre; + display: inline-block; + padding: 10px; +} + +.go_to_top +{ + float: right; + margin-right: 20px; + background: #2C2C2C; + color: #999; + padding: 3px 10px; + border-bottom-right-radius: 5px; + border-bottom-left-radius: 5px; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + line-height: 19px; +} + +.visibility .btn { + text-transform: uppercase; + font-size: 0.7em; + font-weight: bold; +} + +.iviewer_common +{ + z-index: 100; +} + +@media (min-width: 980px) +{ + a[name] + { + margin-top: -50px; + position: absolute; + } +} + +@media (min-width: 1200px) +{ + .method .span4 + { + width: 345px; + } +} + +/* redefined because twitter bootstrap assumes that bootstrap-responsive.css */ +@media (max-width: 980px) +{ + body + { + padding-top: 0; + } + + .go_to_top + { + display: none; + } + + .btn-group.visibility + { + font-size: 0.80em; + margin-bottom: 7px; + display: inline-block; + float: right; + } +} + +@media (max-width: 768px) +{ + .hero-unit h1 { + font-size: 30px; + } + .hero-unit h2 { + font-size: 19px; + } + +} +@media (min-width: 768px) and (max-width: 980px) +{ + .method .span4 + { + width: 203px; + } +} diff --git a/docs/Saml/graph_class.html b/docs/Saml/graph_class.html new file mode 100644 index 00000000..4bd7eb55 --- /dev/null +++ b/docs/Saml/graph_class.html @@ -0,0 +1,105 @@ + + + + + + Onelogin's SAML PHP Toolkit + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+
+
+
+
+ + + +
+ + + + diff --git a/docs/Saml/img/apple-touch-icon-114x114.png b/docs/Saml/img/apple-touch-icon-114x114.png new file mode 100644 index 0000000000000000000000000000000000000000..1506f6a668fbb2837c06b561895da248c310ac53 GIT binary patch literal 28338 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�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 literal 0 HcmV?d00001 diff --git a/docs/Saml/img/apple-touch-icon.png b/docs/Saml/img/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2d320cb5e1215894ef37cf8c6fd7a0085eba06f3 GIT binary patch literal 8358 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 LNHCv2rc(U_{c|km literal 0 HcmV?d00001 diff --git a/docs/Saml/img/glyphicons-halflings-white.png b/docs/Saml/img/glyphicons-halflings-white.png new file mode 100644 index 0000000000000000000000000000000000000000..a20760bfde58d1c92cee95116059fba03c68d689 GIT binary patch literal 4352 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 literal 0 HcmV?d00001 diff --git a/docs/Saml/img/icons/arrow_down.png b/docs/Saml/img/icons/arrow_down.png new file mode 100644 index 0000000000000000000000000000000000000000..61505adc46d8fa4156d9b31831ebe6770f0e2757 GIT binary patch literal 606 zcmV-k0-^nhP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iph( z1qcLRmoAwA00G`fL_t(I%cWC2tJ+``e%^eL7t$KUBw$9t*+0;sKcG;!o#ftvQ=v=O zPEznkbn((fBwn}RP@zy12dlPS%uu3(Akjdnjb!m7Z{AKf?FH|p;Io_q=Wq_^JkLWo z=Qsxf&cxXRNV#0TVT@UX5OB_sBngrvNpr^7o%nCPR4T2dTrT%m)3hhWViEKC9B~|j zF^1#uh$Kmn&1OL6a}1fD2f7I*U{_szDuTQUi!ZOqfjWA01!nH;yA``w*%)K zs;Yug3Q-h6DTN>iAcUaZZvWhDHqV4=wffsM&FACsIL_zuX_G9=kR&O+_4XuD6w&YZ zlPHQVyWQ?u0DxMp_GP_Z-y9AHSe6Azl0XPax7|XPWh@p8ESJmcPN(zf4hxRsTn&fA zuar{gx(-1QAP9d+5=9YV7-BM+jB~l%>ytFDR;#zJ>#hvLKqiw(w{yPNyJ*ytHlGe^5w{<6H+p@P5DF!?G;MvWzec z5d^`9X0!S6zm#a(_8ZrA2b!kAG);J(_suYjSEqWV`y{Gq+Kbt2=5Dv!N1CQx)a!M2 sQpyjxu~Ml#WsK2AqtU(B3+LMT58IsRj2DXS7XSbN07*qoM6N<$f?9MBJpcdz literal 0 HcmV?d00001 diff --git a/docs/Saml/img/icons/arrow_right.png b/docs/Saml/img/icons/arrow_right.png new file mode 100644 index 0000000000000000000000000000000000000000..60c5927ebf63f388b45315cbc4cc56a77b9f903c GIT binary patch literal 628 zcmV-)0*n2LP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iph( z1qT;gv2%z300Hz#L_t(I%axPMt5Q)EhkyI*EgldQ%_FEFNFoiwK|$ce2O<`vO%-#J z*f5+m4E!U)pbO5VW@l24A`$5(O~gT>V;_X?vwa*%Pb1@|_l9>(HfyjxzP0vRMAI}J zBA?HH1aP2?dagoht>5TwNDO6R(YPG_8y~cXI2Im}{b9lX8_ zilTha<#MhY4K|w%7K;TIiv<)#fubnjoMSSXfKrNJF!)f@w4a$w<}m=UV}t2*irH)i z#ux-a_&XQ9UJr-E0ZJ)MCKDfz$D3;n4h4so5CWso2)Ek}0I1jNHC0vbmrA9tCkBKN z=yW=Wq6k3{z!-zoYK0_8=yW=};c)o2TrR)5TEmVFD5YSGK@>$e91e)0h*qoB@AZ0b zWLbWH{Ea67#u&_IGwgOdw%aYL)#{IazyG>ct9`j{4^CR}cs$tcc4#yjzXyZC2U(V% z|8JH50ce_rZnulkX!Ofwvpp*oi2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4`J+jIM*dB6Xqg)}~| zJoCIb=eAt%N2Sc0*LR=)Gr>jXc+U1{2EKOY&`?3wi#H~`UdZcts5G`~(Smi^VXH-t zNnA2H`u*=l#_~yWzkbC{@|eWZU~_(X%TKE^b)f2_P*>quOSp`{Hl;21nz{an^LB{Ts5!Fr;& literal 0 HcmV?d00001 diff --git a/docs/Saml/img/icons/constant.png b/docs/Saml/img/icons/constant.png new file mode 100644 index 0000000000000000000000000000000000000000..f5f180d5a9b09a19b5ae44ad64a1fdceb6a86d7c GIT binary patch literal 496 zcmVrl1?U*0YQ8KBh3^hnN3W5 z2%|~HXz55n-@#z_4GhF=O%)o!1~F5NWx9pcZ;~F+?Pl3!f;~`hPjKs2om2M?&}Yi{ z)a|hNOZ<{ll;no}Bk)fO?j?Pd^dsz_V-;AIg>Bmyh7qUYr=-X5?0(D-NtDZF=JPoK zm&=9SZbzX|h$DHpwjoI*lSww44g39`Mx%jgn$+ucGMNm9VNk2pa2$tryNzwzJxRTg z;8l{SR;vIEhr`H=-EJ4(_i-GD)oR6Jv3R?-aYHZ~jUoig<&w!{f+RYf4giC};OT}S zkx1Zq9*4t$R;z_&Su~qXve_)-@tE~`O*);X-|ureoq}Sq`0d7mBub?cv)PRE`3%5z zyCt8`Q>j##PN(?3kLP)~uKN-h;x$auB$vxYtfW$@*foCnJuN{HCvYhz#zuJz@P!dKp~(AL>x#lFaYJy!Tsagqt+F;zg(Vd_Ma3C z(nGFZm^~mf*5 z)sz1pn_UOj3v?y|2J0zg2h4lZXZ~Oq6V)2(>o0PAi0Mp zcm2O}aQ*+4X;%Lqp4$EY_?&u@^n?8R{_$;a_<;NZ^2eq1Gykv3ut72B2M+tMZ(scX z!_&L}cQnO<)vrjkgy>B%C#)Z+=I#Bf|8MMChN2ecXJi`Peo$P2?0#|mG=^J|^}*N= zPwo1DaqZOq$7k37KfSmE=*JoV_w{7|UykNZn0k89t1|6?Zs{cGcU*1(=|3{P60d%I dd2d6B_y4`!nK<=Rk_TaW8yL|`1mgK1y#VW>cs>9C literal 0 HcmV?d00001 diff --git a/docs/Saml/img/icons/file-php.png b/docs/Saml/img/icons/file-php.png new file mode 100644 index 0000000000000000000000000000000000000000..c323f09f66241a28d61f1d2c8e90be0a68126bb6 GIT binary patch literal 4017 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 L;uWgGz+epk&R;19 literal 0 HcmV?d00001 diff --git a/docs/Saml/img/icons/folder.gif b/docs/Saml/img/icons/folder.gif new file mode 100644 index 0000000000000000000000000000000000000000..2b31631ca2bfec3a8afb1bfdd4f8ed4c5bcc3a18 GIT binary patch literal 106 zcmZ?wbhEHb6ky=hKW2GJ7 I#Kd3?0MGg2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4c?q7?3B2Xp1x8ImHETXz54QVYrPgqHx8=(z e>Gl76{l!*pI92y$_dTH37(8A5T-G@yGywo6mxkK_ literal 0 HcmV?d00001 diff --git a/docs/Saml/img/icons/icon-folder-open-big.png b/docs/Saml/img/icons/icon-folder-open-big.png new file mode 100644 index 0000000000000000000000000000000000000000..fae384ef4df761b2d6cc250ed5787e430ae91663 GIT binary patch literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^azHG`!3HF+C+nOCQtLfk978H@y`6TEw^f11_3i;d ziGzYN2L&Zg3QDws(66dq&SgShn{Thb{zRo^(j5Lg&dD7z8Ed<2HaxncvF_0qB|qh( zD^{Iwcon{}=b8RLEj=%X$?owoQ+czMDqpDz@out+{J4%~%}Jdw83lFk?!Av|@026WQIOdE8_{3R(~E4X}F}*cK0{Nlc(N@tWx{N75ZIyLFkD`ce?_+omU+4eIu&X fef&+H?MME!>ysALYPH`1I-SAO)z4*}Q$iB}E$LkN literal 0 HcmV?d00001 diff --git a/docs/Saml/img/icons/icon-th-big.png b/docs/Saml/img/icons/icon-th-big.png new file mode 100644 index 0000000000000000000000000000000000000000..04b0ad872a98de63bc0e300e627ce69a2a209471 GIT binary patch literal 106 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fhMq2tAr-gYPBH{4<6!#zfBD*P z%ML8Ga1?(i);mdUy45w?2d5KGCQHxw$nZHi?xXOW{3u1P>qQzNK+O!Eu6{1-oD!M< D6}BRE literal 0 HcmV?d00001 diff --git a/docs/Saml/img/icons/icon_template.svg b/docs/Saml/img/icons/icon_template.svg new file mode 100644 index 00000000..b0428aa4 --- /dev/null +++ b/docs/Saml/img/icons/icon_template.svg @@ -0,0 +1,93 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + Co + + diff --git a/docs/Saml/img/icons/interface.png b/docs/Saml/img/icons/interface.png new file mode 100644 index 0000000000000000000000000000000000000000..51a3a1762db628e8cbbfb4d933a74b4d962d2d7e GIT binary patch literal 281 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR40E|;Z~{{z_~j>MQR++0q{n_jdZ_~Xzv)82ln zir1^4FSoop)7kP4q||D^oYExqqT%4L-+qnX2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4|3mlps%(3Z75trJZsonk=m!SRtUbjIcd*Gd{GD-MU&5kK`Fd$; z&qe*M;R)u)+B55zu54SYqS>Xy$aOeCxaR(R@13(xM|fE^lFf7PnUNSzTjBx@u1_}0S82W4^{;r-{cRJTTl!v}kb2YK z*1sl?dBGmby>EB*DR3}+u*rYhnEoKO=X=4viDB0(R!$ZFviy;n_U!uqz48-dSM>2+ S-W3cC0R~T3KbLh*2~7ZLUYG9x literal 0 HcmV?d00001 diff --git a/docs/Saml/img/icons/ok.png b/docs/Saml/img/icons/ok.png new file mode 100644 index 0000000000000000000000000000000000000000..39f287ab19b8bcdc156ea56355a95290d04f0ee8 GIT binary patch literal 3685 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 AIsgCw literal 0 HcmV?d00001 diff --git a/docs/Saml/img/icons/search.gif b/docs/Saml/img/icons/search.gif new file mode 100644 index 0000000000000000000000000000000000000000..eef46fc9ee10547bfa2da348f81b4c83f19e65a4 GIT binary patch literal 152 zcmZ?wbhEHb6krfw*v!MQVZ+APuU|iW_~^rj4_mixJ96acuV25;ojZ5^`i(nx?(W*P zd;k6e|NsAIfC0syEQ|~cJPbM@0gxFCEUptydamAU5nbG%&zz z##7bH4$=1vId^*V*v!xR>*{?7mqKrCnmdg!}G z=IXm8Sn&!;akH?purU1n%JB2k%b%|wU4DOV*XpD9FQ1(YRJQ}B0U&^o4e)SH>*-Ur zh)`kY;$&s`_k)2EsF{J8m4Sm#kV96(KvF=6-{ZWnu*|swyBJ`G00a;d%-Q;G(RnJC zk*X~0{H%Zf{A2k0_b@F4v6je+t14+fASCR#!a*Y7?B`u`upwYzT_j5PRxk@1k>@6WFcf574M53UU$ zfM5nZ{PpG4FOc(@{(fdKQRiUz`t=9HgNKh8zJB|~V5B3;@aO9@i00pa89smd@*SEs z7ytqYX29h)kFR`S`1=Lu?N1E0y_w^~*-1fljz_B$LUvK}k?BNXe#Y!m=zM!!V#}8bncK5m;8VP zw86G*RI63?Cd%b9bX|ueNlZ|wR6rj|r_)VIP@r2imh3?SN+^{|kY%~8B{maJ@F*OK z&VH9LwOeGt#DRjj0~v~8`>iO7!Ybi;zE$va`A^T#yW`y44;k^#O~K5*jD=qcUhPSc zvyy~q;5H_1WT1l~cqje9yfa+l!hu6xjdOJ8s;8E^+=QQ$tw p?%p!Hy#YapB=@+^9(46X{{RQg%9y;OKjr`c002ovPDHLkV1g7l326WT literal 0 HcmV?d00001 diff --git a/docs/Saml/img/icons/visibility_private.png b/docs/Saml/img/icons/visibility_private.png new file mode 100644 index 0000000000000000000000000000000000000000..386dc2d879d20cf85e4eeaaeb29e66bfe8398995 GIT binary patch literal 3433 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 literal 0 HcmV?d00001 diff --git a/docs/Saml/img/iviewer/grab.cur b/docs/Saml/img/iviewer/grab.cur new file mode 100644 index 0000000000000000000000000000000000000000..ef540be09383a215ba21287683ae956b74a6dbbf GIT binary patch literal 1150 zcmeHEF%H8Z3_L;+LM2k9N*yv~>~H#wK9i4B>Jy?)*;1Rr5Mf~HSVzWizBA$iDEg)e zv@Up@fGdC-B|(IIaVjw`XMnR4do4(}ceLED$#?I4PhZt?V;F{(zNyX4aU6>oTI<~I zR%1+|Z@pO>D9unx@mz^sV2R6KAHrH&a3w(Uah_+1dcf$ic$W0J$AsEGc`x}F-{G8# oT0W#ZA~$;zN&n?%4r~@-v(K$0B;Q#;t literal 0 HcmV?d00001 diff --git a/docs/Saml/img/iviewer/hand.cur b/docs/Saml/img/iviewer/hand.cur new file mode 100644 index 0000000000000000000000000000000000000000..1a5bafb5263fd4937dda4098b04aa5c70e2de924 GIT binary patch literal 1150 zcma)3OKyWe4E694LIn}22q6~8?0U4`qB$BzVUYuLnN^5A#g-vqrbZ8co}UNC0FIu^ z1?Y|NodI+J@I{~!RsQPaynTKEFe0{|*)R-iM9cJuPktQ*F&}vmxJX7;nU}sFz|xzG*A)o1}vy~Np8!oh{{D) z3FWrSE(G-lOIo^%@l%Jh z7d(bKZD(=f(+rDu3Ibk!p~fAzvAEw(G5oFaf>VGX;I$X`=G^#MhKzfwaaX++^R_aG z{23g@-KfbsV!rlS8y~jNpC$Q98001E5Sq?VpxukSs-?)+t$^aeGL+RsprA4wk<#_> z_+u(WTiH*vZ^%;_bKH_BUEq}jd#?-l#9J=q_v{?VaI4}Q9JQ|FoaxO4M#r~&(9l-@ga5_qddH0^Pp)3D%%13U()$KPZ9mfuKHeN zh|FV%AcKd9$Xte~JpHr7ISdEsS=dbylRpV}b%EG*(H$Zm7BrYE89CoGzCv2mgg*7U?}T-eQj1 z{ctQepE}YD%L6}S{pbtWcxoXGX*qRvIs~7NleuJ1rI2sTU9}wgEO}#naM{Mwl$wh8u zCnBy@;!tLlFk2ANZy*yRh*u1IjEu7sgd^u~j?-pP>cuPS5S69F5h60HO2`84nde#W zyHhV;*NN!tY8*EZeXCkX$LB3TNWEh+HIj>(aWc0CrwBgBQY@5_fO(q}ggUVHfHYwh z33cBmty=DP=A9=gECUXndMm_NP*e}Z-LCDyS)!}~n7b*S3$R(WUj{y!TOYyebROJ- zFF$p&>5+Q7DfKeS+K_mst_KprM8H(Hy%~al3{|Z#A5JZTYe-7!V4F>!)KgSFrn=vN z3kCIkDE(K!G*^RwzlwE`Dy#7rUC1u2#kz=0tng2mHP|cZPQ4qN4qPSy<|wW2D5KC{MlR z;>)=A5V)!Cz;#udS#FfKqnHHD=_R1Ptpjzf{nOgnDXf!ZtKqUo3Ky}YM}T&xUI8_p z+{#DD)pj7q40-gM-UA6eVt~J6Ck37*j6+@9f{jOSVfEgWC}V(*7I~i&Dx8uU4S&P_ z;3=qW>uyHVjD_fF#+pz$KVvi(@T$|6gmQ;1NkX6Jb)Y}^@BGWy!Sjrgf9<#ho=bDz zCj-9w{fH|?2J}+O500000NkvXXu0mjf*RRDb literal 0 HcmV?d00001 diff --git a/docs/Saml/img/iviewer/iviewer.rotate_right.png b/docs/Saml/img/iviewer/iviewer.rotate_right.png new file mode 100644 index 0000000000000000000000000000000000000000..7a6c829871d058af5a5ca0ac67256c259f84c5ac GIT binary patch literal 1482 zcmV;*1vUDKP)W@q8L24va@vW@P7*!=(&yIADtgIo?`IW@@z#oP%kAO5~e4>aSvdau$keO zelrxe7h>a?XEPGL-8ZvUK7S5JxO_SC%cam%h9U3nOynA8Bd1~p@(p_slER=;FN42~ zVT$Cx%L&IBfqkNPU0Q$wV<=M8^Ktsd`-seX8%Hx4(Mza9RSeQph6Cvg*A2_?bs*!Z zJm9Mh7vz)H#bKgf96Z*=%6lrx!F>}8+<9p(ZW^~EGIuaSuQBYWfCsY}!gCl75#iYs zn4X1YwmkE{L{qbYU7_|vC;44Kc>_>d53G;Ofy>H6K72&Q1n)K0hYkOJ{}5yueQ_kO zAEZ3kO@`uTdQ^;QD4P$Xc-46$f7y>g|g44T+ z#BgE=@!>Z#-vKoL6Wa&pE*R*#HWno`0s)tGNL1G$LZyexFDGPt0qahH^Hl0tOywX% zlsY1!jA8k4hEa>zCTrlAtqC<~Car`X>shKzaMo5pP+|!}lx4#8x7#jb=yVHAyecTTC4J8t z#9H#H1x)ab5$qRn{T_~Gwh%$&8k>4#Nl^>etY1&RH*c@JV*VdWES08K(6hJ3ua1F+ z1Vqx@pUkersqB_Ip|BQ5mEtYg?Pld26u-(ZDhIXZN8p8vpywZqUmXq21K`XJ6VBRD zSPjgUh_hsuo0Zq@#H52sg=lQDK%p}U0=)MqxPXrz3y|HcLaYr6jTyT{TGH;2&kl$g zvn(tPnZ+iUo13A~-oxKTMnQmAi+~YaKrsopkYC+_iv!`6FZ*8at59p?CSTLD^ce@1hVDp0-#Q zq7i&EGSIAWEAo-(3@vR~e8qHMf3DS%&Pzg-H4FABh2HRK5QhTu_A0SBL~)<~@sXQv zl!l*(`MH4my)*cGH#$9gu8S$5cCU4I9uNy}^C|I;^|0b5vYngtVB^%;d7vlsx1OAw ktS2S0?VM~5JkO{63m1~IVD>3BuK)l507*qoM6N<$f)6RO6951J literal 0 HcmV?d00001 diff --git a/docs/Saml/img/iviewer/iviewer.zoom_fit.png b/docs/Saml/img/iviewer/iviewer.zoom_fit.png new file mode 100644 index 0000000000000000000000000000000000000000..364e01d90eae19584713851314629f2468198e9e GIT binary patch literal 1252 zcmbVMZD`zN9M7nO!F>6)Qu>rmKTa$KDx31r-tX6e<%`(6Krd_QfiW`8t`1_@uq7ekl83AbH+? zzu*7$$#_?1`>KY!8VG_|C2bSZcx-mx`sMihAai~i59?7fi@MD`D#97s?^ptvbD@%0UaWlEb9Y?!POak>Kac>j_lvC`$F%JGkXW>_ZEGx zJom!Kv#(7V2O9tK-kSZb!BUHpo@HF_;W5I?7`%^kn|fV6LyKC%38?;(5V z!PU9ZKS#&d``e%Ktf-E%=q0M&EZqyy}ir$_H&JcW2fJ{{PgiX z8-IUUIXQgrq&9v}_F_|k9sDEvsw97zUz^v|wk^6~k{(E}g+-F{ISKr))j<47BXr41~e0blAr&bSs z|IrSo^7@evzS-=(@x`Huqc2r99GkQ^PabxeDqKE2-7j>wsvG2m_N{Pyfo(Z~3KXY?;^Pc&YH??aJsCHEo`3 w8eZ!(AMJatv3kpyYro>2$M)>r+u)qoRbjGiisBQYX$xZ(3D5f)$iQF?09S=3^#A|> literal 0 HcmV?d00001 diff --git a/docs/Saml/img/iviewer/iviewer.zoom_in.png b/docs/Saml/img/iviewer/iviewer.zoom_in.png new file mode 100644 index 0000000000000000000000000000000000000000..78993327c62ddd64e7fe33bc1b0d469ef9e17f30 GIT binary patch literal 1420 zcmbVMeM}o=96n$mLI`O1*jPqxokAS8_t9QIP6}&#?I^6YLL;DzakN*s!1Zp|0}9Rz z8rh;F0cBg38IU39T#zkeLnml8hzMCSG?@^xXdOBYVGI|HL|oz(DEbH4A6|0zem&3g z`+V;WTfxD&nA8{m0OHKKM4>pQ1>fi>@%sWi*eedZ1Y?O%#JYqAlBWQjldYscGecHU zg%s&*JUU5b0YHS4wwDMcmP5FMWn^R!Bl9wx$OeF{94|*YYA6A$q^fAQR`OuPF9B(% zR#J>vU<+rUs_EP&o+@f8usfP+92%!2CmYQ2;-UaU2_)!cYTX{(tCg(l;^I8G4N1Ut zh)|=IY&cb7v4IAbr$9^wOC7Kh29<~mkt? zy6{56v}sFRX(iQyz~K<#uSL*ic3n>tk$HCK_ zK(lTzs7O|_b%ItRdb$w;!&xj_!fwxIqQsOzUXp_l84NK@Fs^m9M<}HJbz@t!$KJ?M zP$A`E>v)G)57)jBS6;_)Fv2Ks*P|kY8`^A2u!ZfsWAnHVJ68Y*ZF@k28qrD)nZSf_1^Pw#| z@pZkmCA&G}0&7bcjq%x*?aRCV3irha4o~M_DArx{=C$ijm7gxpJfn{2L~$I+EADGSEAJts^bthXdZ0!+7(pGrKca+s`)MokNH6@80m`S3a@u zY1ygFvFkgB8j(NleZ>ubn=|IJ|7-yHzY}KZV-M0lk+#l6X1~TQy|p*uWp8(@{ii>t zUM%g1pU@A_-dyI62l_3g1J;f*Z-2$!(N|(ifOlu2-fw+1YIXRfE0Nik_Z$MUT=6@` he~f-qo>Y;tmQ(?tGoVp(DLyXve>58lh(UdY?;kaa{Rsd7 literal 0 HcmV?d00001 diff --git a/docs/Saml/img/iviewer/iviewer.zoom_in2.gif b/docs/Saml/img/iviewer/iviewer.zoom_in2.gif new file mode 100644 index 0000000000000000000000000000000000000000..5d596181627a30344f9783d466ce0558279fe729 GIT binary patch literal 90 zcmZ?wbhEHblwpuzXkcUjg8%>j>wsvG2m_O4Pyfo(Z}}I`;fT1UbHL~G(^^jrxfIDc qOSLxju^l&BbLLyj{a>m(=kzlMwFoEmw|glD9`i8f>~-Q|um%7;9UyH0 literal 0 HcmV?d00001 diff --git a/docs/Saml/img/iviewer/iviewer.zoom_out.png b/docs/Saml/img/iviewer/iviewer.zoom_out.png new file mode 100644 index 0000000000000000000000000000000000000000..893f3502baaab667354fe8b560c1712b72630836 GIT binary patch literal 1416 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m{T%CB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxKsVXI%s|1+P|wiV z#N6CmN5ROz&_Lh7NZ-&%*U;R`*vQJjKmiJrfVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8EkR}&8R-I5=oVMzl_XZ^<`pZ$OmImpPA){ffi_eM3D1{oGuTzrd=COM+4n&cLd=IHa;5RX-@T zIKQ+g85kdF$}r8qu)}W=NFmTQR{lkqz(`5Vami0E%}vcK@pQ3O0?O#6WTsddyBS)T zxj4DGI+;7U8WbpSnwXlJx+y{RrjQe2`as9%gOUbPQh^Bp(;tWlPxwF%JnN+90rN`{ zFk|eTuyZ2=1LH1F7srr_TYIJ*^g8Sy&?e2@*d%abWdMgri<5t&U4#0<`~ZPHTulKV zL_SFVVrt@l5PQLUVYuUp3a@^r?zky&+EXok@RH&z@w!8r$f$z%0{cUx;M)M%(BO@dlSAr|x|-`3zUuyW0)IVtW>|s>WVT?mGEc zSkr=`cGH2CXUi731dH|WWa9iWg>~1jL@c(3*I%OB-d`n9ld0_~{X@e~VM+?bvqa&xDF~4=3Dc{-t;PQB<+c zv78v6y_Q$sW5p8UNtB8n}}+(%+^^VTDLxDs_M@V zktZgdHP!#l9(Qv}igT01!>vuNAL^777;7#{%n;%?`4GGKfzXddg$9fTvuy=L>XpA# emo~({32$Iz;FK4L4Ckl>myMpTelF{r5}E)fw)-Uj literal 0 HcmV?d00001 diff --git a/docs/Saml/img/iviewer/iviewer.zoom_out2.gif b/docs/Saml/img/iviewer/iviewer.zoom_out2.gif new file mode 100644 index 0000000000000000000000000000000000000000..77ec19af216c5525438e73e4fafef1ce08db3cf3 GIT binary patch literal 69 zcmZ?wbhEHblwpuzXkcUjg8%>j>wsvG2m_N!Pyfo(Z}}I`*>bCU^SwRQTrH10rZprj VQ(Lv|A^Y)9KG(nX7PB%~0{{a@8tMQ5 literal 0 HcmV?d00001 diff --git a/docs/Saml/img/iviewer/iviewer.zoom_zero.png b/docs/Saml/img/iviewer/iviewer.zoom_zero.png new file mode 100644 index 0000000000000000000000000000000000000000..c981db6d690774d0c2e67e21c9081d5c89b5fd2d GIT binary patch literal 1091 zcmbVL&ui0A9M4pSOy+USDH`Jt54L&lWo?(ZTAQSq1v^VuUA;)t~d_LcwSBo>#!$V_3 z9LEjkPwFMM?vLJ`gY0_@JiN=6Jv3LLv!qU2W`Mb@O=_6WyXHJDVbfl^_!>`f+;-b3 zS7@bhO0kF=HzS*P+w~cm6!@+QT}TTXPE`s;ULyhK6LAo; zKoamt7>CkCDwR6QBLIO2kO)x>rW6S&0Pwv>U}}L~S4z6k(_*Kz(4f>;M6uOs#amLG z1oI-4WjW$ND8?*e;gUzqcFYS8^%-;=T7lzJhj@I%Xx2!RrUmBdMhLE7C~OjYVJ}fE zWn$a(MHmO7>qc>PtwUPEf85y8IxH{wSS;a?Gy{v(qkgClX1V*fP-MuwQBDUAD~h?O z6RYWBkLLBX!2ZN-$5tc*P9}BL$f+qc2OyjTdQR0O9U94`B&o2^u@x4nAeBw1(2x=n z5avKO31v+Nl7u7!=(60$=Dm=bo`w6m4%6*n!9THz7GRT-piIbOzXOU5LP^*lKCjIt z_&LY3Nh^$svk|L~1LqR9jexj(H@k|ng?bW90+iEJ2GWfvYE_c6auz`iY1tG)S)qru z|0iQ2b4H9>hb!)51ol8qidf>uee2NcllE7&Y7PpcX!=7_qbu-x&Nqo^YXsS zx4psB1L(rH2OVv_Ry|wWf8@aTYwPTIZ{+>+x4F)XFBxU;`RVIF##f(pxPd|L)0^?x S8}D{hqp{BCX7q<@b>%mi3|d_P literal 0 HcmV?d00001 diff --git a/docs/Saml/img/iviewer/iviewer.zoom_zero2.gif b/docs/Saml/img/iviewer/iviewer.zoom_zero2.gif new file mode 100644 index 0000000000000000000000000000000000000000..e56c670fe62062458276fab5512701433b37af4e GIT binary patch literal 98 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 literal 0 HcmV?d00001 diff --git a/docs/Saml/index.html b/docs/Saml/index.html new file mode 100644 index 00000000..8197aaa8 --- /dev/null +++ b/docs/Saml/index.html @@ -0,0 +1,110 @@ + + + + + + Onelogin's SAML PHP Toolkit + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+

Onelogin's SAML PHP Toolkit

+

Documentation SAML lib

+
+ +
+
+
+ +
+ +
+
+
+ +
+
+
+
+ + + + diff --git a/docs/Saml/js/SVGPan.js b/docs/Saml/js/SVGPan.js new file mode 100644 index 00000000..4966b999 --- /dev/null +++ b/docs/Saml/js/SVGPan.js @@ -0,0 +1,232 @@ +/** + * SVGPan library 1.2 - phpDocumentor1 + * ==================== + * + * Given an unique existing element with id "viewport", including the + * the library into any SVG adds the following capabilities: + * + * - Mouse panning + * - Mouse zooming (using the wheel) + * - Object dargging + * + * Known issues: + * + * - Zooming (while panning) on Safari has still some issues + * + * Releases: + * + * 1.2 - phpDocumentor1, Fri Apr 08 19:19:00 CET 2011, Mike van Riel + * Increased zoom speed with 20% + * Disabled element moving functionality + * + * 1.2, Sat Mar 20 08:42:50 GMT 2010, Zeng Xiaohui + * Fixed a bug with browser mouse handler interaction + * + * 1.1, Wed Feb 3 17:39:33 GMT 2010, Zeng Xiaohui + * Updated the zoom code to support the mouse wheel on Safari/Chrome + * + * 1.0, Andrea Leofreddi + * First release + * + * This code is licensed under the following BSD license: + * + * Copyright 2009-2010 Andrea Leofreddi . All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY Andrea Leofreddi ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Andrea Leofreddi OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of Andrea Leofreddi. + */ + +var root = document.documentElement; + +var state = 'none', stateTarget, stateOrigin, stateTf; + +setupHandlers(root); + +/** + * Register handlers + */ +function setupHandlers(root){ + setAttributes(root, { + "onmouseup" : "add(evt)", + "onmousedown" : "handleMouseDown(evt)", + "onmousemove" : "handleMouseMove(evt)", + "onmouseup" : "handleMouseUp(evt)", +// "onmouseout" : "handleMouseUp(evt)" // Decomment this to stop the pan functionality when dragging out of the SVG element + }); + + if(navigator.userAgent.toLowerCase().indexOf('webkit') >= 0) + window.addEventListener('mousewheel', handleMouseWheel, false); // Chrome/Safari + else + window.addEventListener('DOMMouseScroll', handleMouseWheel, false); // Others +} + +/** + * Instance an SVGPoint object with given event coordinates. + */ +function getEventPoint(evt) { + var p = root.createSVGPoint(); + + p.x = evt.clientX; + p.y = evt.clientY; + + return p; +} + +/** + * Sets the current transform matrix of an element. + */ +function setCTM(element, matrix) { + var s = "matrix(" + matrix.a + "," + matrix.b + "," + matrix.c + "," + matrix.d + "," + matrix.e + "," + matrix.f + ")"; + + element.setAttribute("transform", s); +} + +/** + * Dumps a matrix to a string (useful for debug). + */ +function dumpMatrix(matrix) { + var s = "[ " + matrix.a + ", " + matrix.c + ", " + matrix.e + "\n " + matrix.b + ", " + matrix.d + ", " + matrix.f + "\n 0, 0, 1 ]"; + + return s; +} + +/** + * Sets attributes of an element. + */ +function setAttributes(element, attributes){ + for (i in attributes) + element.setAttributeNS(null, i, attributes[i]); +} + +/** + * Handle mouse move event. + */ +function handleMouseWheel(evt) { + if(evt.preventDefault) + evt.preventDefault(); + + evt.returnValue = false; + + var svgDoc = evt.target.ownerDocument; + + var delta; + + if(evt.wheelDelta) + delta = evt.wheelDelta / 3600; // Chrome/Safari + else + delta = evt.detail / -90; // Mozilla + + var z = 1 + (delta * 1.2); // Zoom factor: 0.9/1.1 + + var g = svgDoc.getElementById("viewport"); + + var p = getEventPoint(evt); + + p = p.matrixTransform(g.getCTM().inverse()); + + // Compute new scale matrix in current mouse position + var k = root.createSVGMatrix().translate(p.x, p.y).scale(z).translate(-p.x, -p.y); + + setCTM(g, g.getCTM().multiply(k)); + + stateTf = stateTf.multiply(k.inverse()); +} + +/** + * Handle mouse move event. + */ +function handleMouseMove(evt) { + if(evt.preventDefault) + evt.preventDefault(); + + evt.returnValue = false; + + var svgDoc = evt.target.ownerDocument; + + var g = svgDoc.getElementById("viewport"); + + if(state == 'pan') { + // Pan mode + var p = getEventPoint(evt).matrixTransform(stateTf); + + setCTM(g, stateTf.inverse().translate(p.x - stateOrigin.x, p.y - stateOrigin.y)); + } else if(state == 'move') { + // Move mode + var p = getEventPoint(evt).matrixTransform(g.getCTM().inverse()); + + setCTM(stateTarget, root.createSVGMatrix().translate(p.x - stateOrigin.x, p.y - stateOrigin.y).multiply(g.getCTM().inverse()).multiply(stateTarget.getCTM())); + + stateOrigin = p; + } +} + +/** + * Handle click event. + */ +function handleMouseDown(evt) { + if(evt.preventDefault) + evt.preventDefault(); + + evt.returnValue = false; + + var svgDoc = evt.target.ownerDocument; + + var g = svgDoc.getElementById("viewport"); + +// if(evt.target.tagName == "svg") { + // Pan mode + state = 'pan'; + + stateTf = g.getCTM().inverse(); + + stateOrigin = getEventPoint(evt).matrixTransform(stateTf); +// } else { + // Move mode +// state = 'move'; +// +// stateTarget = evt.target; +// +// stateTf = g.getCTM().inverse(); +// +// stateOrigin = getEventPoint(evt).matrixTransform(stateTf); +// } +} + +/** + * Handle mouse button release event. + */ +function handleMouseUp(evt) { + if(evt.preventDefault) + evt.preventDefault(); + + evt.returnValue = false; + + var svgDoc = evt.target.ownerDocument; + + if(state == 'pan' || state == 'move') { + // Quit pan mode + state = ''; + } +} + diff --git a/docs/Saml/js/bootstrap.js b/docs/Saml/js/bootstrap.js new file mode 100644 index 00000000..c832ccb2 --- /dev/null +++ b/docs/Saml/js/bootstrap.js @@ -0,0 +1,1722 @@ +/* =================================================== + * bootstrap-transition.js v2.0.0 + * http://twitter.github.com/bootstrap/javascript.html#transitions + * =================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================== */ + +!function( $ ) { + + $(function () { + + "use strict" + + /* CSS TRANSITION SUPPORT (https://gist.github.com/373874) + * ======================================================= */ + + $.support.transition = (function () { + var thisBody = document.body || document.documentElement + , thisStyle = thisBody.style + , support = thisStyle.transition !== undefined || thisStyle.WebkitTransition !== undefined || thisStyle.MozTransition !== undefined || thisStyle.MsTransition !== undefined || thisStyle.OTransition !== undefined + + return support && { + end: (function () { + var transitionEnd = "TransitionEnd" + if ( $.browser.webkit ) { + transitionEnd = "webkitTransitionEnd" + } else if ( $.browser.mozilla ) { + transitionEnd = "transitionend" + } else if ( $.browser.opera ) { + transitionEnd = "oTransitionEnd" + } + return transitionEnd + }()) + } + })() + + }) + +}( window.jQuery ) +/* ========================================================== + * bootstrap-alert.js v2.0.0 + * http://twitter.github.com/bootstrap/javascript.html#alerts + * ========================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================== */ + + +!function( $ ){ + + "use strict" + + /* ALERT CLASS DEFINITION + * ====================== */ + + var dismiss = '[data-dismiss="alert"]' + , Alert = function ( el ) { + $(el).on('click', dismiss, this.close) + } + + Alert.prototype = { + + constructor: Alert + + , close: function ( e ) { + var $this = $(this) + , selector = $this.attr('data-target') + , $parent + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 + } + + $parent = $(selector) + $parent.trigger('close') + + e && e.preventDefault() + + $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent()) + + $parent.removeClass('in') + + function removeElement() { + $parent.remove() + $parent.trigger('closed') + } + + $.support.transition && $parent.hasClass('fade') ? + $parent.on($.support.transition.end, removeElement) : + removeElement() + } + + } + + + /* ALERT PLUGIN DEFINITION + * ======================= */ + + $.fn.alert = function ( option ) { + return this.each(function () { + var $this = $(this) + , data = $this.data('alert') + if (!data) $this.data('alert', (data = new Alert(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + $.fn.alert.Constructor = Alert + + + /* ALERT DATA-API + * ============== */ + + $(function () { + $('body').on('click.alert.data-api', dismiss, Alert.prototype.close) + }) + +}( window.jQuery ) +/* ============================================================ + * bootstrap-button.js v2.0.0 + * http://twitter.github.com/bootstrap/javascript.html#buttons + * ============================================================ + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ + +!function( $ ){ + + "use strict" + + /* BUTTON PUBLIC CLASS DEFINITION + * ============================== */ + + var Button = function ( element, options ) { + this.$element = $(element) + this.options = $.extend({}, $.fn.button.defaults, options) + } + + Button.prototype = { + + constructor: Button + + , setState: function ( state ) { + var d = 'disabled' + , $el = this.$element + , data = $el.data() + , val = $el.is('input') ? 'val' : 'html' + + state = state + 'Text' + data.resetText || $el.data('resetText', $el[val]()) + + $el[val](data[state] || this.options[state]) + + // push to event loop to allow forms to submit + setTimeout(function () { + state == 'loadingText' ? + $el.addClass(d).attr(d, d) : + $el.removeClass(d).removeAttr(d) + }, 0) + } + + , toggle: function () { + var $parent = this.$element.parent('[data-toggle="buttons-radio"]') + + $parent && $parent + .find('.active') + .removeClass('active') + + this.$element.toggleClass('active') + } + + } + + + /* BUTTON PLUGIN DEFINITION + * ======================== */ + + $.fn.button = function ( option ) { + return this.each(function () { + var $this = $(this) + , data = $this.data('button') + , options = typeof option == 'object' && option + if (!data) $this.data('button', (data = new Button(this, options))) + if (option == 'toggle') data.toggle() + else if (option) data.setState(option) + }) + } + + $.fn.button.defaults = { + loadingText: 'loading...' + } + + $.fn.button.Constructor = Button + + + /* BUTTON DATA-API + * =============== */ + + $(function () { + $('body').on('click.button.data-api', '[data-toggle^=button]', function ( e ) { + $(e.target).button('toggle') + }) + }) + +}( window.jQuery ) +/* ========================================================== + * bootstrap-carousel.js v2.0.0 + * http://twitter.github.com/bootstrap/javascript.html#carousel + * ========================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================== */ + + +!function( $ ){ + + "use strict" + + /* CAROUSEL CLASS DEFINITION + * ========================= */ + + var Carousel = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, $.fn.carousel.defaults, options) + this.options.slide && this.slide(this.options.slide) + } + + Carousel.prototype = { + + cycle: function () { + this.interval = setInterval($.proxy(this.next, this), this.options.interval) + return this + } + + , to: function (pos) { + var $active = this.$element.find('.active') + , children = $active.parent().children() + , activePos = children.index($active) + , that = this + + if (pos > (children.length - 1) || pos < 0) return + + if (this.sliding) { + return this.$element.one('slid', function () { + that.to(pos) + }) + } + + if (activePos == pos) { + return this.pause().cycle() + } + + return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos])) + } + + , pause: function () { + clearInterval(this.interval) + return this + } + + , next: function () { + if (this.sliding) return + return this.slide('next') + } + + , prev: function () { + if (this.sliding) return + return this.slide('prev') + } + + , slide: function (type, next) { + var $active = this.$element.find('.active') + , $next = next || $active[type]() + , isCycling = this.interval + , direction = type == 'next' ? 'left' : 'right' + , fallback = type == 'next' ? 'first' : 'last' + , that = this + + this.sliding = true + + isCycling && this.pause() + + $next = $next.length ? $next : this.$element.find('.item')[fallback]() + + if (!$.support.transition && this.$element.hasClass('slide')) { + this.$element.trigger('slide') + $active.removeClass('active') + $next.addClass('active') + this.sliding = false + this.$element.trigger('slid') + } else { + $next.addClass(type) + $next[0].offsetWidth // force reflow + $active.addClass(direction) + $next.addClass(direction) + this.$element.trigger('slide') + this.$element.one($.support.transition.end, function () { + $next.removeClass([type, direction].join(' ')).addClass('active') + $active.removeClass(['active', direction].join(' ')) + that.sliding = false + setTimeout(function () { that.$element.trigger('slid') }, 0) + }) + } + + isCycling && this.cycle() + + return this + } + + } + + + /* CAROUSEL PLUGIN DEFINITION + * ========================== */ + + $.fn.carousel = function ( option ) { + return this.each(function () { + var $this = $(this) + , data = $this.data('carousel') + , options = typeof option == 'object' && option + if (!data) $this.data('carousel', (data = new Carousel(this, options))) + if (typeof option == 'number') data.to(option) + else if (typeof option == 'string' || (option = options.slide)) data[option]() + else data.cycle() + }) + } + + $.fn.carousel.defaults = { + interval: 5000 + } + + $.fn.carousel.Constructor = Carousel + + + /* CAROUSEL DATA-API + * ================= */ + + $(function () { + $('body').on('click.carousel.data-api', '[data-slide]', function ( e ) { + var $this = $(this), href + , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 + , options = !$target.data('modal') && $.extend({}, $target.data(), $this.data()) + $target.carousel(options) + e.preventDefault() + }) + }) + +}( window.jQuery ) +/* ============================================================= + * bootstrap-collapse.js v2.0.0 + * http://twitter.github.com/bootstrap/javascript.html#collapse + * ============================================================= + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ + +!function( $ ){ + + "use strict" + + var Collapse = function ( element, options ) { + this.$element = $(element) + this.options = $.extend({}, $.fn.collapse.defaults, options) + + if (this.options["parent"]) { + this.$parent = $(this.options["parent"]) + } + + this.options.toggle && this.toggle() + } + + Collapse.prototype = { + + constructor: Collapse + + , dimension: function () { + var hasWidth = this.$element.hasClass('width') + return hasWidth ? 'width' : 'height' + } + + , show: function () { + var dimension = this.dimension() + , scroll = $.camelCase(['scroll', dimension].join('-')) + , actives = this.$parent && this.$parent.find('.in') + , hasData + + if (actives && actives.length) { + hasData = actives.data('collapse') + actives.collapse('hide') + hasData || actives.data('collapse', null) + } + + this.$element[dimension](0) + this.transition('addClass', 'show', 'shown') + this.$element[dimension](this.$element[0][scroll]) + + } + + , hide: function () { + var dimension = this.dimension() + this.reset(this.$element[dimension]()) + this.transition('removeClass', 'hide', 'hidden') + this.$element[dimension](0) + } + + , reset: function ( size ) { + var dimension = this.dimension() + + this.$element + .removeClass('collapse') + [dimension](size || 'auto') + [0].offsetWidth + + this.$element.addClass('collapse') + } + + , transition: function ( method, startEvent, completeEvent ) { + var that = this + , complete = function () { + if (startEvent == 'show') that.reset() + that.$element.trigger(completeEvent) + } + + this.$element + .trigger(startEvent) + [method]('in') + + $.support.transition && this.$element.hasClass('collapse') ? + this.$element.one($.support.transition.end, complete) : + complete() + } + + , toggle: function () { + this[this.$element.hasClass('in') ? 'hide' : 'show']() + } + + } + + /* COLLAPSIBLE PLUGIN DEFINITION + * ============================== */ + + $.fn.collapse = function ( option ) { + return this.each(function () { + var $this = $(this) + , data = $this.data('collapse') + , options = typeof option == 'object' && option + if (!data) $this.data('collapse', (data = new Collapse(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + $.fn.collapse.defaults = { + toggle: true + } + + $.fn.collapse.Constructor = Collapse + + + /* COLLAPSIBLE DATA-API + * ==================== */ + + $(function () { + $('body').on('click.collapse.data-api', '[data-toggle=collapse]', function ( e ) { + var $this = $(this), href + , target = $this.attr('data-target') + || e.preventDefault() + || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 + , option = $(target).data('collapse') ? 'toggle' : $this.data() + $(target).collapse(option) + }) + }) + +}( window.jQuery ) +/* ============================================================ + * bootstrap-dropdown.js v2.0.0 + * http://twitter.github.com/bootstrap/javascript.html#dropdowns + * ============================================================ + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ + + +!function( $ ){ + + "use strict" + + /* DROPDOWN CLASS DEFINITION + * ========================= */ + + var toggle = '[data-toggle="dropdown"]' + , Dropdown = function ( element ) { + var $el = $(element).on('click.dropdown.data-api', this.toggle) + $('html').on('click.dropdown.data-api', function () { + $el.parent().removeClass('open') + }) + } + + Dropdown.prototype = { + + constructor: Dropdown + + , toggle: function ( e ) { + var $this = $(this) + , selector = $this.attr('data-target') + , $parent + , isActive + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 + } + + $parent = $(selector) + $parent.length || ($parent = $this.parent()) + + isActive = $parent.hasClass('open') + + clearMenus() + !isActive && $parent.toggleClass('open') + + return false + } + + } + + function clearMenus() { + $(toggle).parent().removeClass('open') + } + + + /* DROPDOWN PLUGIN DEFINITION + * ========================== */ + + $.fn.dropdown = function ( option ) { + return this.each(function () { + var $this = $(this) + , data = $this.data('dropdown') + if (!data) $this.data('dropdown', (data = new Dropdown(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + $.fn.dropdown.Constructor = Dropdown + + + /* APPLY TO STANDARD DROPDOWN ELEMENTS + * =================================== */ + + $(function () { + $('html').on('click.dropdown.data-api', clearMenus) + $('body').on('click.dropdown.data-api', toggle, Dropdown.prototype.toggle) + }) + +}( window.jQuery ) +/* ========================================================= + * bootstrap-modal.js v2.0.0 + * http://twitter.github.com/bootstrap/javascript.html#modals + * ========================================================= + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================= */ + + +!function( $ ){ + + "use strict" + + /* MODAL CLASS DEFINITION + * ====================== */ + + var Modal = function ( content, options ) { + this.options = $.extend({}, $.fn.modal.defaults, options) + this.$element = $(content) + .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this)) + } + + Modal.prototype = { + + constructor: Modal + + , toggle: function () { + return this[!this.isShown ? 'show' : 'hide']() + } + + , show: function () { + var that = this + + if (this.isShown) return + + $('body').addClass('modal-open') + + this.isShown = true + this.$element.trigger('show') + + escape.call(this) + backdrop.call(this, function () { + var transition = $.support.transition && that.$element.hasClass('fade') + + !that.$element.parent().length && that.$element.appendTo(document.body) //don't move modals dom position + + that.$element + .show() + + if (transition) { + that.$element[0].offsetWidth // force reflow + } + + that.$element.addClass('in') + + transition ? + that.$element.one($.support.transition.end, function () { that.$element.trigger('shown') }) : + that.$element.trigger('shown') + + }) + } + + , hide: function ( e ) { + e && e.preventDefault() + + if (!this.isShown) return + + var that = this + this.isShown = false + + $('body').removeClass('modal-open') + + escape.call(this) + + this.$element + .trigger('hide') + .removeClass('in') + + $.support.transition && this.$element.hasClass('fade') ? + hideWithTransition.call(this) : + hideModal.call(this) + } + + } + + + /* MODAL PRIVATE METHODS + * ===================== */ + + function hideWithTransition() { + var that = this + , timeout = setTimeout(function () { + that.$element.off($.support.transition.end) + hideModal.call(that) + }, 500) + + this.$element.one($.support.transition.end, function () { + clearTimeout(timeout) + hideModal.call(that) + }) + } + + function hideModal( that ) { + this.$element + .hide() + .trigger('hidden') + + backdrop.call(this) + } + + function backdrop( callback ) { + var that = this + , animate = this.$element.hasClass('fade') ? 'fade' : '' + + if (this.isShown && this.options.backdrop) { + var doAnimate = $.support.transition && animate + + this.$backdrop = $('