Repository: roddyofchina/SimpletourDevops Branch: master Commit: 8248e430355a Files: 559 Total size: 4.8 MB Directory structure: gitextract_gajczjdw/ ├── .idea/ │ ├── SimpletourDevops.iml │ ├── inspectionProfiles/ │ │ ├── Project_Default.xml │ │ └── profiles_settings.xml │ ├── misc.xml │ ├── modules.xml │ └── vcs.xml ├── Publicapi/ │ ├── __init__.py │ ├── dnspod/ │ │ ├── __init__.py │ │ └── apicn.py │ ├── dockerapi/ │ │ ├── Manager.py │ │ └── __init__.py │ └── saltstackapi/ │ ├── Assets_Module.py │ ├── SaltConApi.py │ └── __init__.py ├── README.md ├── SimpletourDevops/ │ ├── __init__.py │ ├── apps.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py ├── dockermanager/ │ ├── Docker_Controller.py │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── forms.py │ ├── migrations/ │ │ └── __init__.py │ ├── models.py │ ├── tests.py │ ├── urls.py │ └── views.py ├── domainmanager/ │ └── urls.py ├── manage.py ├── requirements.txt ├── run_eventlet.py ├── saltadmin/ │ ├── Minions_Controller.py │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── forms.py │ ├── migrations/ │ │ └── __init__.py │ ├── models.py │ ├── tests.py │ ├── urls.py │ ├── utils.py │ └── views.py ├── servermanager/ │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── migrations/ │ │ ├── 0001_initial.py │ │ ├── 0002_auto_20161121_1740.py │ │ ├── 0003_auto_20161128_1031.py │ │ ├── 0004_auto_20161128_1032.py │ │ ├── 0005_auto_20161128_1032.py │ │ ├── 0006_auto_20161128_1034.py │ │ ├── 0007_auto_20161128_1038.py │ │ ├── 0008_auto_20161128_1109.py │ │ ├── 0009_auto_20161128_1112.py │ │ ├── 0010_auto_20161128_1113.py │ │ ├── 0011_auto_20161202_1049.py │ │ └── __init__.py │ ├── models.py │ ├── tests.py │ ├── urls.py │ └── views.py ├── static/ │ └── assets/ │ ├── css/ │ │ ├── _variables.css │ │ ├── bootstrap-theme.css │ │ ├── bootstrap.css │ │ ├── components.css │ │ ├── core.css │ │ ├── elements.css │ │ ├── icons.css │ │ ├── pages.css │ │ ├── responsive.css │ │ ├── statusecho.css │ │ ├── style.css │ │ ├── variables.css │ │ └── xterm.css │ ├── js/ │ │ ├── bootstrap.js │ │ ├── detect.js │ │ ├── fastclick.js │ │ ├── jquery.app.js │ │ ├── jquery.blockUI.js │ │ ├── jquery.core.js │ │ ├── jquery.nicescroll.js │ │ ├── jquery.slimscroll.js │ │ ├── json.js │ │ ├── json2yaml.js │ │ ├── npm.js │ │ ├── spin.js │ │ ├── waves.js │ │ └── xterm.js │ ├── pages/ │ │ ├── chartjs.init.js │ │ ├── datatables.editable.init.js │ │ ├── easy-pie-chart.init.js │ │ ├── jquery.bs-table.js │ │ ├── jquery.dashboard.js │ │ ├── jquery.flot.init.js │ │ ├── jquery.footable.js │ │ └── jquery.sweet-alert.init.js │ └── plugins/ │ ├── Chart.js/ │ │ ├── Chart.js │ │ └── src/ │ │ ├── Chart.Bar.js │ │ ├── Chart.Core.js │ │ ├── Chart.Doughnut.js │ │ ├── Chart.Line.js │ │ ├── Chart.PolarArea.js │ │ └── Chart.Radar.js │ ├── bootstrap-datepicker/ │ │ └── dist/ │ │ ├── css/ │ │ │ ├── bootstrap-datepicker.css │ │ │ ├── bootstrap-datepicker.standalone.css │ │ │ ├── bootstrap-datepicker3.css │ │ │ └── bootstrap-datepicker3.standalone.css │ │ └── js/ │ │ └── bootstrap-datepicker.js │ ├── bootstrap-select/ │ │ ├── css/ │ │ │ ├── bootstrap-select.css │ │ │ └── variables.css │ │ ├── dist/ │ │ │ ├── css/ │ │ │ │ └── bootstrap-select.css │ │ │ └── js/ │ │ │ ├── bootstrap-select.js │ │ │ └── i18n/ │ │ │ ├── defaults-bg_BG.js │ │ │ ├── defaults-cs_CZ.js │ │ │ ├── defaults-da_DK.js │ │ │ ├── defaults-de_DE.js │ │ │ ├── defaults-en_US.js │ │ │ ├── defaults-es_CL.js │ │ │ ├── defaults-eu.js │ │ │ ├── defaults-fa_IR.js │ │ │ ├── defaults-fr_FR.js │ │ │ ├── defaults-hu_HU.js │ │ │ ├── defaults-it_IT.js │ │ │ ├── defaults-ko_KR.js │ │ │ ├── defaults-nl_NL.js │ │ │ ├── defaults-pl_PL.js │ │ │ ├── defaults-pt_BR.js │ │ │ ├── defaults-pt_PT.js │ │ │ ├── defaults-ro_RO.js │ │ │ ├── defaults-ru_RU.js │ │ │ ├── defaults-sk_SK.js │ │ │ ├── defaults-sl_SI.js │ │ │ ├── defaults-sv_SE.js │ │ │ ├── defaults-tr_TR.js │ │ │ ├── defaults-ua_UA.js │ │ │ ├── defaults-zh_CN.js │ │ │ └── defaults-zh_TW.js │ │ └── js/ │ │ ├── .jshintrc │ │ ├── bootstrap-select.js │ │ └── i18n/ │ │ ├── defaults-bg_BG.js │ │ ├── defaults-cs_CZ.js │ │ ├── defaults-da_DK.js │ │ ├── defaults-de_DE.js │ │ ├── defaults-en_US.js │ │ ├── defaults-es_CL.js │ │ ├── defaults-eu.js │ │ ├── defaults-fa_IR.js │ │ ├── defaults-fr_FR.js │ │ ├── defaults-hu_HU.js │ │ ├── defaults-it_IT.js │ │ ├── defaults-ko_KR.js │ │ ├── defaults-nl_NL.js │ │ ├── defaults-pl_PL.js │ │ ├── defaults-pt_BR.js │ │ ├── defaults-pt_PT.js │ │ ├── defaults-ro_RO.js │ │ ├── defaults-ru_RU.js │ │ ├── defaults-sk_SK.js │ │ ├── defaults-sl_SI.js │ │ ├── defaults-sv_SE.js │ │ ├── defaults-tr_TR.js │ │ ├── defaults-ua_UA.js │ │ ├── defaults-zh_CN.js │ │ └── defaults-zh_TW.js │ ├── bootstrap-table/ │ │ ├── dist/ │ │ │ ├── bootstrap-table-all.js │ │ │ ├── bootstrap-table-locale-all.js │ │ │ ├── bootstrap-table.css │ │ │ ├── bootstrap-table.js │ │ │ ├── extensions/ │ │ │ │ ├── cookie/ │ │ │ │ │ └── bootstrap-table-cookie.js │ │ │ │ ├── editable/ │ │ │ │ │ └── bootstrap-table-editable.js │ │ │ │ ├── export/ │ │ │ │ │ └── bootstrap-table-export.js │ │ │ │ ├── filter/ │ │ │ │ │ └── bootstrap-table-filter.js │ │ │ │ ├── filter-control/ │ │ │ │ │ └── bootstrap-table-filter-control.js │ │ │ │ ├── flat-json/ │ │ │ │ │ └── bootstrap-table-flat-json.js │ │ │ │ ├── key-events/ │ │ │ │ │ └── bootstrap-table-key-events.js │ │ │ │ ├── mobile/ │ │ │ │ │ └── bootstrap-table-mobile.js │ │ │ │ ├── multiple-sort/ │ │ │ │ │ └── bootstrap-table-multiple-sort.js │ │ │ │ ├── natural-sorting/ │ │ │ │ │ └── bootstrap-table-natural-sorting.js │ │ │ │ ├── reorder-columns/ │ │ │ │ │ └── bootstrap-table-reorder-columns.js │ │ │ │ ├── reorder-rows/ │ │ │ │ │ ├── bootstrap-table-reorder-rows.css │ │ │ │ │ └── bootstrap-table-reorder-rows.js │ │ │ │ ├── resizable/ │ │ │ │ │ └── bootstrap-table-resizable.js │ │ │ │ └── toolbar/ │ │ │ │ └── bootstrap-table-toolbar.js │ │ │ └── locale/ │ │ │ ├── bootstrap-table-ar-SA.js │ │ │ ├── bootstrap-table-cs-CZ.js │ │ │ ├── bootstrap-table-da-DK.js │ │ │ ├── bootstrap-table-de-DE.js │ │ │ ├── bootstrap-table-el-GR.js │ │ │ ├── bootstrap-table-en-US.js │ │ │ ├── bootstrap-table-es-AR.js │ │ │ ├── bootstrap-table-es-CR.js │ │ │ ├── bootstrap-table-es-MX.js │ │ │ ├── bootstrap-table-es-NI.js │ │ │ ├── bootstrap-table-es-SP.js │ │ │ ├── bootstrap-table-fr-BE.js │ │ │ ├── bootstrap-table-fr-FR.js │ │ │ ├── bootstrap-table-hu-HU.js │ │ │ ├── bootstrap-table-it-IT.js │ │ │ ├── bootstrap-table-ja-JP.js │ │ │ ├── bootstrap-table-ka-GE.js │ │ │ ├── bootstrap-table-ko-KR.js │ │ │ ├── bootstrap-table-ms-MY.js │ │ │ ├── bootstrap-table-nb-NO.js │ │ │ ├── bootstrap-table-nl-NL.js │ │ │ ├── bootstrap-table-pl-PL.js │ │ │ ├── bootstrap-table-pt-BR.js │ │ │ ├── bootstrap-table-pt-PT.js │ │ │ ├── bootstrap-table-ro-RO.js │ │ │ ├── bootstrap-table-ru-RU.js │ │ │ ├── bootstrap-table-sk-SK.js │ │ │ ├── bootstrap-table-sv-SE.js │ │ │ ├── bootstrap-table-th-TH.js │ │ │ ├── bootstrap-table-tr-TR.js │ │ │ ├── bootstrap-table-uk-UA.js │ │ │ ├── bootstrap-table-ur-PK.js │ │ │ ├── bootstrap-table-vi-VN.js │ │ │ ├── bootstrap-table-zh-CN.js │ │ │ └── bootstrap-table-zh-TW.js │ │ └── src/ │ │ ├── bootstrap-table.css │ │ ├── bootstrap-table.js │ │ ├── extensions/ │ │ │ ├── cookie/ │ │ │ │ ├── README.md │ │ │ │ └── bootstrap-table-cookie.js │ │ │ ├── editable/ │ │ │ │ ├── README.md │ │ │ │ └── bootstrap-table-editable.js │ │ │ ├── export/ │ │ │ │ ├── README.md │ │ │ │ └── bootstrap-table-export.js │ │ │ ├── filter/ │ │ │ │ ├── README.md │ │ │ │ └── bootstrap-table-filter.js │ │ │ ├── filter-control/ │ │ │ │ ├── README.md │ │ │ │ └── bootstrap-table-filter-control.js │ │ │ ├── flat-json/ │ │ │ │ ├── README.md │ │ │ │ └── bootstrap-table-flat-json.js │ │ │ ├── key-events/ │ │ │ │ ├── README.md │ │ │ │ └── bootstrap-table-key-events.js │ │ │ ├── mobile/ │ │ │ │ ├── README.md │ │ │ │ └── bootstrap-table-mobile.js │ │ │ ├── multiple-sort/ │ │ │ │ ├── README.md │ │ │ │ └── bootstrap-table-multiple-sort.js │ │ │ ├── natural-sorting/ │ │ │ │ ├── README.md │ │ │ │ └── bootstrap-table-natural-sorting.js │ │ │ ├── reorder-columns/ │ │ │ │ ├── README.md │ │ │ │ └── bootstrap-table-reorder-columns.js │ │ │ ├── reorder-rows/ │ │ │ │ ├── README.md │ │ │ │ ├── bootstrap-table-reorder-rows.css │ │ │ │ └── bootstrap-table-reorder-rows.js │ │ │ ├── resizable/ │ │ │ │ ├── README.md │ │ │ │ └── bootstrap-table-resizable.js │ │ │ └── toolbar/ │ │ │ ├── README.md │ │ │ └── bootstrap-table-toolbar.js │ │ └── locale/ │ │ ├── README.md │ │ ├── bootstrap-table-ar-SA.js │ │ ├── bootstrap-table-cs-CZ.js │ │ ├── bootstrap-table-da-DK.js │ │ ├── bootstrap-table-de-DE.js │ │ ├── bootstrap-table-el-GR.js │ │ ├── bootstrap-table-en-US.js │ │ ├── bootstrap-table-en-US.js.template │ │ ├── bootstrap-table-es-AR.js │ │ ├── bootstrap-table-es-CR.js │ │ ├── bootstrap-table-es-MX.js │ │ ├── bootstrap-table-es-NI.js │ │ ├── bootstrap-table-es-SP.js │ │ ├── bootstrap-table-fr-BE.js │ │ ├── bootstrap-table-fr-FR.js │ │ ├── bootstrap-table-hu-HU.js │ │ ├── bootstrap-table-it-IT.js │ │ ├── bootstrap-table-ja-JP.js │ │ ├── bootstrap-table-ka-GE.js │ │ ├── bootstrap-table-ko-KR.js │ │ ├── bootstrap-table-ms-MY.js │ │ ├── bootstrap-table-nb-NO.js │ │ ├── bootstrap-table-nl-NL.js │ │ ├── bootstrap-table-pl-PL.js │ │ ├── bootstrap-table-pt-BR.js │ │ ├── bootstrap-table-pt-PT.js │ │ ├── bootstrap-table-ro-RO.js │ │ ├── bootstrap-table-ru-RU.js │ │ ├── bootstrap-table-sk-SK.js │ │ ├── bootstrap-table-sv-SE.js │ │ ├── bootstrap-table-th-TH.js │ │ ├── bootstrap-table-tr-TR.js │ │ ├── bootstrap-table-uk-UA.js │ │ ├── bootstrap-table-ur-PK.js │ │ ├── bootstrap-table-vi-VN.js │ │ ├── bootstrap-table-zh-CN.js │ │ └── bootstrap-table-zh-TW.js │ ├── bootstrap-touchspin/ │ │ ├── dist/ │ │ │ ├── jquery.bootstrap-touchspin.css │ │ │ └── jquery.bootstrap-touchspin.js │ │ └── src/ │ │ ├── jquery.bootstrap-touchspin.css │ │ └── jquery.bootstrap-touchspin.js │ ├── custombox/ │ │ └── src/ │ │ ├── css/ │ │ │ └── custombox.css │ │ └── js/ │ │ ├── custombox.js │ │ └── legacy.js │ ├── datatables/ │ │ └── dataTables.bootstrap.js │ ├── flot-chart/ │ │ ├── jquery.flot.crosshair.js │ │ ├── jquery.flot.js │ │ ├── jquery.flot.pie.js │ │ ├── jquery.flot.resize.js │ │ ├── jquery.flot.selection.js │ │ ├── jquery.flot.stack.js │ │ └── jquery.flot.time.js │ ├── footable/ │ │ └── css/ │ │ └── footable.core.css │ ├── jquery-datatables-editable/ │ │ ├── dataTables.bootstrap.js │ │ ├── datatables.css │ │ └── jquery.dataTables.js │ ├── jquery-knob/ │ │ ├── excanvas.js │ │ └── jquery.knob.js │ ├── jquery.easy-pie-chart/ │ │ ├── dist/ │ │ │ ├── angular.easypiechart.js │ │ │ ├── easypiechart.js │ │ │ └── jquery.easypiechart.js │ │ └── src/ │ │ ├── angular.directive.js │ │ ├── easypiechart.js │ │ ├── jquery.plugin.js │ │ └── renderer/ │ │ └── canvas.js │ ├── magnific-popup/ │ │ ├── dist/ │ │ │ ├── jquery.magnific-popup.js │ │ │ └── magnific-popup.css │ │ └── src/ │ │ ├── css/ │ │ │ ├── _settings.scss │ │ │ └── main.scss │ │ └── js/ │ │ ├── ajax.js │ │ ├── core.js │ │ ├── fastclick.js │ │ ├── gallery.js │ │ ├── iframe.js │ │ ├── image.js │ │ ├── inline.js │ │ ├── retina.js │ │ └── zoom.js │ ├── morris/ │ │ ├── morris.css │ │ └── morris.js │ ├── multiselect/ │ │ ├── css/ │ │ │ └── multi-select.css │ │ └── js/ │ │ └── jquery.multi-select.js │ ├── notifications/ │ │ ├── notification.css │ │ └── notify-metro.js │ ├── notifyjs/ │ │ ├── dist/ │ │ │ ├── notify-combined.js │ │ │ ├── notify.js │ │ │ └── styles/ │ │ │ ├── bootstrap/ │ │ │ │ └── notify-bootstrap.js │ │ │ └── metro/ │ │ │ ├── notify-metro.css │ │ │ └── notify-metro.js │ │ └── src/ │ │ ├── notify.coffee │ │ └── styles/ │ │ ├── STYLES-README.md │ │ └── bootstrap/ │ │ └── notify-bootstrap.coffee │ ├── peity/ │ │ └── jquery.peity.js │ ├── raphael/ │ │ └── raphael-min.js │ ├── select2/ │ │ ├── .bower.json │ │ ├── .gitignore │ │ ├── CONTRIBUTING.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── bower.json │ │ ├── component.json │ │ ├── composer.json │ │ ├── package.json │ │ ├── release.sh │ │ ├── select2-bootstrap.css │ │ ├── select2.css │ │ ├── select2.jquery.json │ │ ├── select2.js │ │ ├── select2_locale_ar.js │ │ ├── select2_locale_az.js │ │ ├── select2_locale_bg.js │ │ ├── select2_locale_ca.js │ │ ├── select2_locale_cs.js │ │ ├── select2_locale_da.js │ │ ├── select2_locale_de.js │ │ ├── select2_locale_el.js │ │ ├── select2_locale_en.js.template │ │ ├── select2_locale_es.js │ │ ├── select2_locale_et.js │ │ ├── select2_locale_eu.js │ │ ├── select2_locale_fa.js │ │ ├── select2_locale_fi.js │ │ ├── select2_locale_fr.js │ │ ├── select2_locale_gl.js │ │ ├── select2_locale_he.js │ │ ├── select2_locale_hr.js │ │ ├── select2_locale_hu.js │ │ ├── select2_locale_id.js │ │ ├── select2_locale_is.js │ │ ├── select2_locale_it.js │ │ ├── select2_locale_ja.js │ │ ├── select2_locale_ka.js │ │ ├── select2_locale_ko.js │ │ ├── select2_locale_lt.js │ │ ├── select2_locale_lv.js │ │ ├── select2_locale_mk.js │ │ ├── select2_locale_ms.js │ │ ├── select2_locale_nb.js │ │ ├── select2_locale_nl.js │ │ ├── select2_locale_pl.js │ │ ├── select2_locale_pt-BR.js │ │ ├── select2_locale_pt-PT.js │ │ ├── select2_locale_ro.js │ │ ├── select2_locale_rs.js │ │ ├── select2_locale_ru.js │ │ ├── select2_locale_sk.js │ │ ├── select2_locale_sv.js │ │ ├── select2_locale_th.js │ │ ├── select2_locale_tr.js │ │ ├── select2_locale_ug-CN.js │ │ ├── select2_locale_uk.js │ │ ├── select2_locale_vi.js │ │ ├── select2_locale_zh-CN.js │ │ └── select2_locale_zh-TW.js │ ├── summernote/ │ │ ├── dist/ │ │ │ ├── summernote-bs3.css │ │ │ ├── summernote.css │ │ │ └── summernote.js │ │ ├── lang/ │ │ │ ├── summernote-ar-AR.js │ │ │ ├── summernote-bg-BG.js │ │ │ ├── summernote-ca-ES.js │ │ │ ├── summernote-cs-CZ.js │ │ │ ├── summernote-da-DK.js │ │ │ ├── summernote-de-DE.js │ │ │ ├── summernote-es-ES.js │ │ │ ├── summernote-es-EU.js │ │ │ ├── summernote-fa-IR.js │ │ │ ├── summernote-fi-FI.js │ │ │ ├── summernote-fr-FR.js │ │ │ ├── summernote-he-IL.js │ │ │ ├── summernote-hu-HU.js │ │ │ ├── summernote-id-ID.js │ │ │ ├── summernote-it-IT.js │ │ │ ├── summernote-ja-JP.js │ │ │ ├── summernote-ko-KR.js │ │ │ ├── summernote-lt-LT.js │ │ │ ├── summernote-nb-NO.js │ │ │ ├── summernote-nl-NL.js │ │ │ ├── summernote-pl-PL.js │ │ │ ├── summernote-pt-BR.js │ │ │ ├── summernote-pt-PT.js │ │ │ ├── summernote-ro-RO.js │ │ │ ├── summernote-ru-RU.js │ │ │ ├── summernote-sk-SK.js │ │ │ ├── summernote-sl-SI.js │ │ │ ├── summernote-sr-RS-Latin.js │ │ │ ├── summernote-sr-RS.js │ │ │ ├── summernote-sv-SE.js │ │ │ ├── summernote-th-TH.js │ │ │ ├── summernote-tr-TR.js │ │ │ ├── summernote-uk-UA.js │ │ │ ├── summernote-vi-VN.js │ │ │ ├── summernote-zh-CN.js │ │ │ └── summernote-zh-TW.js │ │ ├── meteor/ │ │ │ ├── README.md │ │ │ ├── package-standalone.js │ │ │ ├── package.js │ │ │ ├── publish.sh │ │ │ ├── runtests.sh │ │ │ └── test.js │ │ ├── plugin/ │ │ │ ├── summernote-ext-hello.js │ │ │ ├── summernote-ext-hint.js │ │ │ └── summernote-ext-video.js │ │ └── src/ │ │ ├── css/ │ │ │ ├── elements.css │ │ │ └── summernote.css │ │ ├── js/ │ │ │ ├── EventHandler.js │ │ │ ├── Renderer.js │ │ │ ├── app.js │ │ │ ├── core/ │ │ │ │ ├── agent.js │ │ │ │ ├── async.js │ │ │ │ ├── dom.js │ │ │ │ ├── func.js │ │ │ │ ├── key.js │ │ │ │ ├── list.js │ │ │ │ └── range.js │ │ │ ├── defaults.js │ │ │ ├── editing/ │ │ │ │ ├── Bullet.js │ │ │ │ ├── History.js │ │ │ │ ├── Style.js │ │ │ │ ├── Table.js │ │ │ │ └── Typing.js │ │ │ ├── intro.js │ │ │ ├── module/ │ │ │ │ ├── Button.js │ │ │ │ ├── Clipboard.js │ │ │ │ ├── Codeview.js │ │ │ │ ├── DragAndDrop.js │ │ │ │ ├── Editor.js │ │ │ │ ├── Fullscreen.js │ │ │ │ ├── Handle.js │ │ │ │ ├── HelpDialog.js │ │ │ │ ├── ImageDialog.js │ │ │ │ ├── LinkDialog.js │ │ │ │ ├── Popover.js │ │ │ │ ├── Statusbar.js │ │ │ │ └── Toolbar.js │ │ │ ├── outro.js │ │ │ └── summernote.js │ │ ├── less/ │ │ │ ├── elements.less │ │ │ └── summernote.less │ │ └── sass/ │ │ └── summernote.scss │ ├── sweetalert/ │ │ └── dist/ │ │ ├── sweetalert-dev.js │ │ └── sweetalert.css │ ├── switchery/ │ │ ├── dist/ │ │ │ ├── switchery.css │ │ │ └── switchery.js │ │ ├── meteor/ │ │ │ ├── export.js │ │ │ └── tests.js │ │ ├── switchery.css │ │ └── switchery.js │ ├── tiny-editable/ │ │ ├── mindmup-editabletable.js │ │ └── numeric-input-example.js │ └── waypoints/ │ └── lib/ │ ├── jquery.waypoints.js │ ├── noframework.waypoints.js │ ├── shortcuts/ │ │ ├── infinite.js │ │ ├── inview.js │ │ └── sticky.js │ ├── waypoints.debug.js │ └── zepto.waypoints.js ├── supervisord.conf ├── templates/ │ ├── 403.html │ ├── 404.html │ ├── 500.html │ ├── base.html │ ├── dockermanager/ │ │ ├── containers_list.html │ │ ├── dockerhosts_add.html │ │ ├── dockerhosts_edit.html │ │ ├── dockerhosts_list.html │ │ ├── dockerhosts_logs.html │ │ ├── images_list.html │ │ └── websocket.html │ ├── domainmanager/ │ │ ├── domain_list.html │ │ └── domain_records.html │ ├── saltadmin/ │ │ ├── key_list.html │ │ ├── minion_status.html │ │ ├── salt_cmd.html │ │ ├── saltjob_detail.html │ │ ├── saltjob_list.html │ │ ├── saltmaster_list.html │ │ └── saltmodule_deploy.html │ ├── servermanager/ │ │ ├── assets_list.html │ │ ├── assetschange.html │ │ ├── assetsdetail.html │ │ ├── hosts.html │ │ ├── servers_change.html │ │ ├── servers_detail.html │ │ └── servers_list.html │ ├── tempdir/ │ │ ├── foot_script.html │ │ ├── head_css.html │ │ └── head_script.html │ └── webapp/ │ ├── index.html │ ├── login.html │ ├── register.html │ ├── resetpass.html │ ├── sendresetpw.html │ ├── sysrestuserpassword.html │ └── userinfo.html ├── uwsgi.ini └── webapp/ ├── Extends/ │ ├── PageList.py │ └── __init__.py ├── __init__.py ├── admin.py ├── apps.py ├── forms.py ├── migrations/ │ └── __init__.py ├── models.py ├── tasks.py ├── tests.py ├── urls.py └── views.py ================================================ FILE CONTENTS ================================================ ================================================ FILE: .idea/SimpletourDevops.iml ================================================ ================================================ FILE: .idea/inspectionProfiles/Project_Default.xml ================================================ ================================================ FILE: .idea/inspectionProfiles/profiles_settings.xml ================================================ ================================================ FILE: .idea/misc.xml ================================================ ================================================ FILE: .idea/modules.xml ================================================ ================================================ FILE: .idea/vcs.xml ================================================ ================================================ FILE: Publicapi/__init__.py ================================================ #!/usr/bin/env python #coding:utf-8 __author__ = 'Luodi' ================================================ FILE: Publicapi/dnspod/__init__.py ================================================ ================================================ FILE: Publicapi/dnspod/apicn.py ================================================ #!/usr/bin/env python #-*- coding:utf-8 -*- import httplib, urllib try: import json except: import simplejson as json import socket import re class ApiCn: def __init__(self, email, password, **kw): self.base_url = "dnsapi.cn" self.params = dict( login_email=email, login_password=password, format="json", ) self.params.update(kw) self.path = None def request(self, **kw): self.params.update(kw) if not self.path: """Class UserInfo will auto request path /User.Info.""" name = re.sub(r'([A-Z])', r'.\1', self.__class__.__name__) self.path = "/" + name[1:] conn = httplib.HTTPSConnection(self.base_url) headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/json", "User-Agent": "dnspod-python/0.01 (im@chuangbo.li; DNSPod.CN API v2.8)"} conn.request("POST", self.path, urllib.urlencode(self.params), headers) response = conn.getresponse() data = response.read() conn.close() ret = json.loads(data) if ret.get("status", {}).get("code") == "1": return ret else: raise Exception(ret) __call__ = request class InfoVersion(ApiCn): pass class UserDetail(ApiCn): pass class UserInfo(ApiCn): pass class UserLog(ApiCn): pass class DomainCreate(ApiCn): def __init__(self, domain, **kw): kw.update(dict(domain=domain)) ApiCn.__init__(self, **kw) class DomainId(ApiCn): def __init__(self, domain, **kw): kw.update(dict(domain=domain)) ApiCn.__init__(self, **kw) class DomainList(ApiCn): pass class _DomainApiBase(ApiCn): def __init__(self, domain_id, **kw): kw.update(dict(domain_id=domain_id)) ApiCn.__init__(self, **kw) class DomainRemove(_DomainApiBase): pass class DomainStatus(_DomainApiBase): def __init__(self, status, **kw): kw.update(dict(status=status)) _DomainApiBase.__init__(self, **kw) class DomainInfo(_DomainApiBase): pass class DomainLog(_DomainApiBase): pass class RecordType(ApiCn): def __init__(self, domain_grade, **kw): kw.update(dict(domain_grade=domain_grade)) ApiCn.__init__(self, **kw) class RecordLine(ApiCn): def __init__(self, domain_grade, **kw): kw.update(dict(domain_grade=domain_grade)) ApiCn.__init__(self, **kw) class RecordCreate(_DomainApiBase): def __init__(self, sub_domain, record_type, record_line, value, ttl, mx=None, **kw): kw.update(dict( sub_domain=sub_domain, record_type=record_type, record_line=record_line, value=value, ttl=ttl, )) if mx: kw.update(dict(mx=mx)) _DomainApiBase.__init__(self, **kw) class RecordModify(RecordCreate): def __init__(self, record_id, **kw): kw.update(dict(record_id=record_id)) RecordCreate.__init__(self, **kw) class RecordList(_DomainApiBase): pass class _RecordBase(_DomainApiBase): def __init__(self, record_id, **kw): kw.update(dict(record_id=record_id)) _DomainApiBase.__init__(self, **kw) class RecordRemove(_RecordBase): pass class RecordDdns(_DomainApiBase): def __init__(self, record_id, sub_domain, record_line, **kw): kw.update(dict( record_id=record_id, sub_domain=sub_domain, record_type=record_type, record_line=record_line, )) _DomainApiBase.__init__(self, **kw) class RecordStatus(_RecordBase): def __init__(self, status, **kw): kw.update(dict(status=status)) _RecordBase.__init__(self, **kw) class RecordInfo(_RecordBase): pass ================================================ FILE: Publicapi/dockerapi/Manager.py ================================================ #!/usr/bin/env python #coding:utf-8 __author__ = 'Luodi' import docker ''' Docker 容器API公共模块,可进行容器及镜像管理 ''' class Dockerapi(object): def __init__(self, host, port): self.dockerConnect = docker.Client(base_url='tcp://%s:%s' %(host,port), timeout=60, version='1.22') def GetallContainers(self): Containers = self.dockerConnect.containers(all=1) return Containers def SearchContainers(self, Searchparameter): SearchContainer = self.dockerConnect.containers(all=1,filters={'name':[Searchparameter]}) return SearchContainer def ContainerStatus(self, Status): StatusContainer = self.dockerConnect.containers(all=1,filters={'status':[Status]}) return StatusContainer def InspectContainer(self,name): inspect = self.dockerConnect.inspect_container(container=name) return inspect def Dockerversion(self): Version = self.dockerConnect.version() return Version def StartContainer(self, name): StartContainer = self.dockerConnect.start(container=name) return StartContainer def StopContainer(self, name): StopContainer = self.dockerConnect.stop(container=name) return StopContainer def DelayedstopContainer(self, name, timeout): delayedstop = self.dockerConnect.stop(container=name, timeout=timeout) return delayedstop def Dockerinfo(self): dockerinfo = self.dockerConnect.info() return dockerinfo def RestartContainer(self, name): restart = self.dockerConnect.restart(container=name) return restart def DelayedRestart(self, name, timeout): delayedrestart = self.dockerConnect.restart(container=name, timeout=timeout) return delayedrestart def RenameDocker(self, name, newname): rename = self.dockerConnect.rename(container=name, name=newname) return rename def TopContainer(self, name): topinfo = self.dockerConnect.top(container=name, ps_args=aux) return topinfo def killContainer(self, name): kill = self.dockerConnect.kill(container=name) return kill def PauseContainer(self, name): pause = self.dockerConnect.pause(container=name) return pause def UnpauseContainer(self, name): unpause = self.dockerConnect.unpause(container=name) return unpause def removeContainer(self, name, v=False, link=False, force=False): remove = self.dockerConnect.remove_container(container=name, v=v, link=link, force=force) return remove def LogContainer(self,name,timestamps=False,tail=all): logs = self.dockerConnect.logs(container=name,stdout=True,stderr=True,timestamps=timestamps,tail=tail) return logs def AllImages(self): images=self.dockerConnect.images(all=1) return images def DeleteImages(self,imagename): data=self.dockerConnect.remove_image(image=imagename,force=False) return u"删除镜像成功!!" if __name__ == '__main__': test=Dockerapi('192.168.2.232','2375') #a=test.DeleteImages('docker.io/centos/v1:latest') #print a # search=test.SearchContainers('simpletou') # status=test.ContainerStatus('exited') # version=test.Dockerversion() # stop=test.StopContainer('nostalgic_albattani') #tart=test.StartContainer('nostalgic_albattani') #stopd=test.DelayedstopContainer('nostalgic_albattani',10) #print stopd #rename=test.RenameDocker('nostalgic_albattani','aaa') #inspect = test.InspectContainer('aaa') #print all ================================================ FILE: Publicapi/dockerapi/__init__.py ================================================ #!/usr/bin/env python #coding:utf-8 __author__ = 'Luodi' ================================================ FILE: Publicapi/saltstackapi/Assets_Module.py ================================================ #!/usr/bin/env python #coding:utf-8 __author__ = 'Luodi' class ServerBaseInfo(object): def __init__(self,data,minion): self.ServerHardInfo = {} self.serverbaseinfo={} self.data = data self.minion = minion self.serverbaseinfo['sn'] = self.data[self.minion]['serialnumber'] self.serverbaseinfo['hostname'] = self.data[self.minion]['nodename'] self.serverbaseinfo['cpu_count'] = self.data[self.minion]['CPU_COUNT'] self.serverbaseinfo['cpu_core_count'] = self.data[self.minion]['CPU_Info']['cpu processor'] self.serverbaseinfo['saltid'] = self.data[self.minion]['id'] self.serverbaseinfo['mem'] = self.data[self.minion]['Mem_Total'] self.serverbaseinfo['swap'] = self.data[self.minion]['Swap_Total'] self.serverbaseinfo['platform'] = self.data[self.minion]['osarch'] self.serverbaseinfo['system'] = self.data[self.minion]['oscodename'] self.serverbaseinfo['version'] = self.data[self.minion]['osrelease'] self.ServerHardInfo['Serverbaseinfo']=self.serverbaseinfo class ServerCPUInfo(ServerBaseInfo): def __init__(self,data,minion): super(ServerCPUInfo,self).__init__(data,minion) def ServerCPU(self): servercpuinfo ={} servercpuinfo['uuid'] = self.data[self.minion]['cpu_uuid'] servercpuinfo['parent_sn'] = self.data[self.minion]['serialnumber'] servercpuinfo['architecture'] = self.data[self.minion]['cpuarch'] servercpuinfo['model'] = self.data[self.minion]['cpu_model'] servercpuinfo['cpu_mhz'] = self.data[self.minion]['cpu MHz'] servercpuinfo['L1cache'] = self.data[self.minion]['CPU_Info']['L1 cache'] servercpuinfo['L2cache'] = self.data[self.minion]['CPU_Info']['L2 cache'] servercpuinfo['L3cache'] = self.data[self.minion]['CPU_Info']['L3 cache'] servercpuinfo['thread'] = self.data[self.minion]['CPU_Info']['cpu processor'] self.ServerHardInfo['servercpuinfo'] = servercpuinfo return self.ServerHardInfo class ServerNICInfo(ServerBaseInfo): def __init__(self,data,minion): super(ServerNICInfo,self).__init__(data,minion) def ServerNIC(self): servernicinfo={} servernicinfo['nicinfo'] = self.data[self.minion]['nicinfo'] self.ServerHardInfo['servernicinfo'] = servernicinfo return self.ServerHardInfo class ServerDiskInfo(ServerBaseInfo): def __init__(self,data,minion): super(ServerDiskInfo,self).__init__(data,minion) def ServerDISK(self): serverdiskinfo={} serverdiskinfo['diskinfo'] = self.data[self.minion]['disk'] self.ServerHardInfo['serverdiskinfo'] = serverdiskinfo return self.ServerHardInfo ================================================ FILE: Publicapi/saltstackapi/SaltConApi.py ================================================ #!/usr/bin/env python #coding:utf-8 __author__ = 'Luodi' import urllib,urllib2 import json import requests import yaml from Assets_Module import ServerBaseInfo,ServerCPUInfo,ServerNICInfo,ServerDiskInfo class SaltApi(object): __token = '' def __init__(self,url,user,password): self.__url = url.rstrip('/') self.__user= user self.__pass = password params = {'eauth': 'pam','username':self.__user,'password': self.__pass} req = requests.post(url+'/login', data=params,allow_redirects=False) try: self.__token = req.headers['x-auth-token'] except KeyError: raise KeyError def PostRequest(self,obj,parurl='/'): url = self.__url + parurl headers = {'X-Auth-Token': self.__token,'Accept': 'application/json'} req = requests.post(url, data=obj, headers=headers,verify=False) content = req.json() return content def grains(self,tgt,args): params={'client':'local','tgt': tgt, 'fun': 'grains.item','arg': args} content = self.PostRequest(params) ret = content['return'][0] return ret def grainsall(self,tgt): params={'client':'local','tgt': tgt, 'fun': 'grains.items'} content = self.PostRequest(params) ret = content['return'][0] return ret def pillarall(self,tgt): params = {'client': 'local', 'tgt': tgt, 'fun': 'pillar.items'} content = self.PostRequest(params) ret = content['return'][0] return ret def List_all_keys(self): params={'client':'wheel', 'fun':'key.list_all'} content=self.PostRequest(params) minions = content['return'][0]['data']['return']['minions'] minions_pre = content['return'][0]['data']['return']['minions_pre'] minions_rej = content['return'][0]['data']['return']['minions_rejected'] minions_deny = content['return'][0]['data']['return']['minions_denied'] return minions, minions_pre, minions_rej, minions_deny def shell_remote_execution(self,tgt,arg): ''' Shell command execution with parameters ''' params = {'client': 'local_async', 'tgt': tgt, 'fun': 'cmd.run', 'arg': arg, 'expr_form': 'list'} content = self.PostRequest(params) jid = content['return'][0]['jid'] return jid def Softwarete_deploy(self,tgt,arg): '''执行salt.sls 远程部署程序''' params = {'client': 'local_async', 'tgt': tgt, 'fun': 'state.sls','arg':arg, 'expr_form': 'list'} content = self.PostRequest(params) jid = content['return'][0]['jid'] return jid '''saltstack key管理 action需要进行传入,方法有,accept,delete,reject''' def actionKeys(self,keystrings,action): func = 'key.' + action params = {'client': 'wheel', 'fun': func, 'match': keystrings} content = self.PostRequest(params) ret = content['return'][0]['data']['success'] return ret '''saltstack key 批量管理传入值必须为一个字典''' def dictActionKeys(self,keydict,action): func = 'key.' + action + '_dict' params = {'client':'wheel','fun':func,'match':keydict} content = self.PostRequest(params) return content['return'][0] def cpFiletoMinions(self,tgt): params={'client':'local','tgt': tgt, 'fun': 'cp.get'} content = self.PostRequest(params) ret = content['return'][0] return ret #获取JOB ID的详细执行结果 def runner(self,arg): ''' Return minion status ''' params = {'client': 'runner', 'fun': arg } content = self.PostRequest(params) jid = content['return'][0] return jid def salt_runner(self, jid): ''' 通过jid获取执行结果 ''' params = {'client': 'runner', 'fun': 'jobs.lookup_jid', 'jid': jid} print params content = self.PostRequest(params) print content return content['return'][0] #获取events def SaltEvents(self): parurl = '/events' res = self.PostRequest(None,parurl) return res #接受KEY def AcceptKey(self, key_id): params = {'client': 'wheel', 'fun': 'key.accept', 'match': key_id, 'include_rejected': True, 'include_denied': True} content = self.PostRequest(params) ret = content['return'][0]['data']['success'] return ret #删除KEY def DeleteKey(self, key_id): params = {'client': 'wheel', 'fun': 'key.delete', 'match': key_id} content = self.PostRequest(params) ret = content['return'][0]['data']['success'] return ret # 拒绝KEY def RejectKey(self, key_id): params = {'client': 'wheel', 'fun': 'key.reject', 'match': key_id, 'include_accepted': True, 'include_denied': True} content = self.PostRequest(params) ret = content['return'][0]['data']['success'] return ret def Saltalive(self,tgt): ''' salt主机存活检测 ''' params = {'client': 'local', 'tgt': tgt, 'fun': 'test.ping'} content = self.PostRequest(params) return content['return'][0] def format(data): print data if __name__ == '__main__': salt=SaltApi('http://192.168.2.150:8000','roddy','roudy_123456') #a=salt.Softwarete_deploy('192.168.2.147,',arg=['saltenv="prod"','nginx.install,zabbix-client.install','test=True']) #a=salt.Softwarete_deploy('192.168.2.147',kwarg={'mods':'redis.install,nginx.install','test':True,'saltenv':'prod'}) #print a #a = salt.SaltRun('192.168.2.147','state.sls','nginx.install,redis.install',saltenv='prod','test=True') #data=salt.Saltalive('192.168.2.147') #print data #host='192.168.2.147,192.168.2.148,' #data=salt.shell_remote_execution(host, 'df -i') #print data data = salt.salt_runner(20161215192828817118) print data format(data) #print salt.SaltRun(client='runner', fun='fileserver.envs') #a=sorted(salt.SaltRun(client='runner',fun='fileserver.envs')['return'][0]) #print a #jids = salt.runner("jobs.list_jobs") #print jids #for i,v in jids.items: # print i,v #a,b,c,d =salt.List_all_keys() #print a,b,c,d #salt.shell_remote_execution #funs = ['doc.runner', 'doc.wheel', 'doc.execution'] #for fun in funs: # result = salt.SaltRun(fun=fun, client='runner') # cs = result['return'][0] # for c in cs: # print fun.split('.')[1], c.split('.')[0] #server=ServerDiskInfo(data, u'192.168.2.147') #server=ServerCPUInfo(data,u'192.168.2.147') #print server.ServerCPU() #data=salt.grainsall('192.168.2.147') #print data #clientkey=salt.List_all_keys()['minions'] # Servers={} # for i in clientkey: # data=salt.grainsall(i) # server=ServerNICInfo(data,i) # serverinfo=server.ServerNIC() # print serverinfo ================================================ FILE: Publicapi/saltstackapi/__init__.py ================================================ #!/usr/bin/env python #coding:utf-8 __author__ = 'Luodi' ================================================ FILE: README.md ================================================ # SimpletourDevops django+python+celery+saltstack+docker实现的运维管理后台 作者QQ:923401910 v1.0:完成资产信息录入及使用saltstack自动采集更新     完成单机版docker主机的基本管理,日志实时刷新 ##部署步骤 * 安装环境 ``` pip install requirements.txt ``` * 安装nginx ``` yum install nginx -y ``` * 安装saltstack ``` yum install salt-master -y yum install salt-minion -y ``` * 配置docker ``` [root@localhost ~]# vim /etc/sysconfig/docker # /etc/sysconfig/docker # Modify these options if you want to change the way the docker daemon runs OPTIONS='--selinux-enabled -H 0.0.0.0:2375 -H unix:///var/run/docker.sock ' DOCKER_CERT_PATH=/etc/docker ``` * 部署流程 以下为部署流程 修改 settings.py中db连接 ``` DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'SimpletourDevops', 'HOST': '192.168.2.232', 'USER': 'root', 'PORT': 3306, 'PASSWORD': 'redhat', 'OPTIONS': { 'init_command': 'SET storage_engine=INNODB', }, } } ``` 部署程序到/data ``` [root@localhost ~]# mv /root/SimpletourDevops /data/ [root@localhost ~]# cd /data/SimpletourDevops [root@localhost SimpletourDevops]#python manage.py makemigrations [root@localhost SimpletourDevops]#python manage.py migrate ``` 复制supervisor配置 ``` [root@localhost SimpletourDevops]# cp supervisord.conf /etc/ [root@localhost supervisord.d]# supervisord -c /etc/supervisord.conf     <--启动supervisor,如果启动用户非www,请自行修改 ``` 修改配置文件 ``` 在settings.py中添加STATIC_ROOT STATIC_ROOT = '/data/SimpletourDevops/static/suit' ``` ``` python manage.py collectstatic <--生成静态文件 ``` 配置nginx ``` server { listen 80; server_name localhost; access_log /var/log/nginx/devops.simpletour.com.access.log main; error_log /var/log/nginx/devops.simpletour.com.error.log error; location / { include uwsgi_params; uwsgi_pass 127.0.0.1:8098; uwsgi_read_timeout 600; uwsgi_connect_timeout 60; uwsgi_send_timeout 600; client_max_body_size 35m; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; uwsgi_ignore_client_abort on; } location ^~ /docker/getSocket{ proxy_pass http://127.0.0.1:8099; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; uwsgi_ignore_client_abort on; } location /static { alias /data/SimpletourDevops/static/suit; } } ``` 启动访问 ### 首页及docker       ![image](https://github.com/roddyofchina/SimpletourDevops/blob/master/images/login.png) ![image](https://github.com/roddyofchina/SimpletourDevops/blob/master/images/system_admin.png) ![image](https://github.com/roddyofchina/SimpletourDevops/blob/master/images/server.png) ![image](https://github.com/roddyofchina/SimpletourDevops/blob/master/images/docker.png) ![image](https://github.com/roddyofchina/SimpletourDevops/blob/master/images/docker_server.png) ![image](https://github.com/roddyofchina/SimpletourDevops/blob/master/images/log.png) ![image](https://github.com/roddyofchina/SimpletourDevops/blob/master/images/container_ssh.png) ### saltstack ![image](https://github.com/roddyofchina/SimpletourDevops/blob/master/images/keys.png) ![image](https://github.com/roddyofchina/SimpletourDevops/blob/master/images/job.png) ![image](https://github.com/roddyofchina/SimpletourDevops/blob/master/images/cmd.png) ![image](https://github.com/roddyofchina/SimpletourDevops/blob/master/images/soft.png) ### 后台 ![image](https://github.com/roddyofchina/SimpletourDevops/blob/master/images/protal.png) ================================================ FILE: SimpletourDevops/__init__.py ================================================ #coding:utf-8 from django.core import signals from django.db import close_old_connections # 取消信号关联,实现数据库长连接 signals.request_finished.disconnect(close_old_connections) ================================================ FILE: SimpletourDevops/apps.py ================================================ #!/usr/bin/env python #coding:utf-8 __author__ = 'Luodi' from suit.apps import DjangoSuitConfig from suit.menu import ParentItem, ChildItem class SuitConfig(DjangoSuitConfig): layout = 'vertical' menu = ( ParentItem(u'资产组件', children=[ ChildItem(model='servermanager.server'), ChildItem(model='servermanager.assets'), ChildItem(model='servermanager.idc'), ChildItem(model='servermanager.cpu'), ChildItem(model='servermanager.nic'), ChildItem(model='servermanager.disk'), ChildItem(model='servermanager.software'), ChildItem(model='servermanager.business'), ChildItem(model='servermanager.devicetype'), ChildItem(model='servermanager.provider'), ], icon='fa fa-leaf'), ParentItem(u'容器管理', children=[ ChildItem(model='dockermanager.dockerhost'), ChildItem(model='dockermanager.dockercontainer'), ChildItem(model='dockermanager.dockerimage'), ], icon='fa fa-magnet'), ParentItem(u'Salt管理', children=[ ChildItem(model='saltadmin.saltjobs'), ChildItem(model='saltadmin.cmdrunlog'), ChildItem(model='saltadmin.miniongroup'), ChildItem(model='saltadmin.modules'), ], icon='fa fa-magnet'), ParentItem(u'用户管理', children=[ ChildItem(u'用 户','webapp.suser'), ChildItem(u'用户组', 'auth.group'), ], icon='fa fa-users'), ) ================================================ FILE: SimpletourDevops/settings.py ================================================ #coding:utf8 """ Django settings for SimpletourDevops project. Generated by 'django-admin startproject' using Django 1.9.9. For more information on this file, see https://docs.djangoproject.com/en/1.9/topics/settings/ For the full list of settings and their values, see https://docs.djangoproject.com/en/1.9/ref/settings/ """ import os # Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/1.9/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = '7yk*v@pp1dxi+9fdg-=_3_&!hh4=4tiukajl1^-m$(_2q=gw=9' # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True ALLOWED_HOSTS = [] # Application definition INSTALLED_APPS = [ #'suit', 'SimpletourDevops.apps.SuitConfig', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'webapp', 'servermanager', 'dockermanager', 'saltadmin', #'domainmanager', 'import_export', ] MIDDLEWARE_CLASSES = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.locale.LocaleMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] ROOT_URLCONF = 'SimpletourDevops.urls' TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': ["%s/%s" %(BASE_DIR,'templates'),], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] WSGI_APPLICATION = 'SimpletourDevops.wsgi.application' # Database # https://docs.djangoproject.com/en/1.9/ref/settings/#databases DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'SimpletourDevops', 'HOST': '192.168.2.232', 'USER': 'root', 'PORT': 3306, 'PASSWORD': 'redhat', 'OPTIONS': { 'init_command': 'SET storage_engine=INNODB', }, } } # Password validation # https://docs.djangoproject.com/en/1.9/ref/settings/#auth-password-validators AUTH_PASSWORD_VALIDATORS = [ { 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', }, { 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', }, { 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', }, { 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', }, ] AUTH_USER_MODEL = 'webapp.Suser' LOGIN_URL='/web/login/' # Internationalization # https://docs.djangoproject.com/en/1.9/topics/i18n/ LANGUAGE_CODE = 'zh-Hans' TIME_ZONE = 'Asia/Shanghai' USE_I18N = True USE_L10N = False USE_TZ = False # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/1.9/howto/static-files/ STATIC_URL = '/static/' STATICFILES_DIRS = ( os.path.join(BASE_DIR,'static'), ) EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_USE_TLS = True EMAIL_HOST = 'smtp.qq.com' EMAIL_PORT = 25 EMAIL_HOST_USER = '923401910@qq.com' EMAIL_HOST_PASSWORD = 'utzvxwccfxhkbcdc' DEFAULT_FROM_EMAIL = '923401910@qq.com' SESSION_COOKIE_AGE = 60*180 ================================================ FILE: SimpletourDevops/urls.py ================================================ """SimpletourDevops URL Configuration The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/1.9/topics/http/urls/ Examples: Function views 1. Add an import: from my_app import views 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') Class-based views 1. Add an import: from other_app.views import Home 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') Including another URLconf 1. Import the include() function: from django.conf.urls import url, include 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) """ from django.conf.urls import url,include from django.contrib import admin from webapp.views import index from django.conf import settings urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^$', index, name='index'), url(r'^web/', include('webapp.urls')), url(r'^docker/',include('dockermanager.urls')), url(r'^server/',include('servermanager.urls')), # url(r'^domain/', include('domainmanager.urls')), url(r'^salt/',include('saltadmin.urls')), ] ================================================ FILE: SimpletourDevops/wsgi.py ================================================ """ WSGI config for SimpletourDevops project. It exposes the WSGI callable as a module-level variable named ``application``. For more information on this file, see https://docs.djangoproject.com/en/1.9/howto/deployment/wsgi/ """ import os from django.core.wsgi import get_wsgi_application os.environ.setdefault("DJANGO_SETTINGS_MODULE", "SimpletourDevops.settings") application = get_wsgi_application() ================================================ FILE: dockermanager/Docker_Controller.py ================================================ #!/usr/bin/env python #coding:utf-8 __author__ = 'Luodi' import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "SimpletourDevops.settings") import django django.setup() from dockermanager.models import DockerHost,Dockerimage,DockerContainer from Publicapi.dockerapi.Manager import Dockerapi import time '''获取数据''' def GetDockerServerinfo(): DockerServerList = DockerHost.objects.filter(enabled=1) for server in DockerServerList: try: docker=Dockerapi(server.hostip,server.port) Dockerdata=docker.GetallContainers() for container in Dockerdata: '''获取容器最新状态进行修改''' if DockerContainer.objects.filter(containerID=container['Id']): status=container['Status'] if 'Up' in status: status= 'running' else: status = 'Exited' OldContainer = DockerContainer.objects.get(containerID=container['Id']) OldContainer.Name=container['Names'][0].lstrip('/') OldContainer.command=container['Command'] OldContainer.status=status OldContainer.image=container['Image'] OldContainer.hostip=server.hostip OldContainer.Created=time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(container['Created'])) OldContainer.save() else: '''如果没有容器就添加''' status = container['Status'] if 'Up' in status: status = 'running' else: status = 'Exited' NewContainer=DockerContainer(containerID=container['Id'], Name=container['Names'][0].lstrip('/'), command=container['Command'], status=status, image=container['Image'], hostip=server.hostip, Created=time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(container['Created']))) NewContainer.save() except: print "sssssss" return u"Connect Docker host is Error!!!" return u"OK" def GetDockerImages(): DockerServerList = DockerHost.objects.filter(enabled=1) for server in DockerServerList: try: docker=Dockerapi(server.hostip,server.port) DockerImagesdata=docker.AllImages() except: return u"Connect Docker host is Error!!!" else: for image in DockerImagesdata: if image['RepoTags'][0] == ':': continue imageid=image['Id'].split(':')[-1] for repo in image['RepoTags']: if Dockerimage.objects.filter(repository=repo): Oldimage = Dockerimage.objects.get(repository=repo) Oldimage.repository = repo Oldimage.imagesId=imageid Oldimage.tag = repo.split(':')[-1] Oldimage.imagehost = server.hostip Oldimage.size = image['Size'] Oldimage.save() else: Newimage=Dockerimage(imagesId=imageid, repository=repo, tag = repo.split(':')[-1], imagehost = server.hostip, size=image['Size'], ) Newimage.save() return "Get all imgeas is oK!!" if __name__ == '__main__': GetDockerImages() ================================================ FILE: dockermanager/__init__.py ================================================ ================================================ FILE: dockermanager/admin.py ================================================ #coding:utf8 from django.contrib import admin from dockermanager.models import * class DockerHostModels(admin.ModelAdmin): list_display = ('host','containers','images','port','enabled') class DockerContainerModels(admin.ModelAdmin): list_display = ('Name','status','ip','host','uptime') admin.site.register(DockerHost,DockerHostModels) admin.site.register(DockerContainer) admin.site.register(Dockerimage) ================================================ FILE: dockermanager/apps.py ================================================ from __future__ import unicode_literals from django.apps import AppConfig class DockermanagerConfig(AppConfig): name = 'dockermanager' ================================================ FILE: dockermanager/forms.py ================================================ #!/usr/bin/env python #coding:utf-8 __author__ = 'Luodi' from django import forms from servermanager.models import Server from dockermanager.models import DockerHost from django.forms import ModelForm class DockerServerAdd(forms.Form): DockerServer=forms.ModelChoiceField(required=True, error_messages={'required': u'选择主机'}, queryset=Server.objects.all(),widget=forms.Select(attrs={'class':'form-control'})) ServerStatus = forms.ChoiceField(choices=[(0,u'禁用'),(1,u'启用')],widget=forms.Select(attrs={'class':'form-control'})) dockerip = forms.GenericIPAddressField(required=True, error_messages={'required': u'请输入dockerhost ip', 'invalid':u'ip地址错误'}, widget=forms.TextInput(attrs={'class': 'form-control','placeholder': '宿主机IP', }),) dockerport = forms.IntegerField(required=True, error_messages={'required': u'请输入dockerhost port', 'invalid':u'port输入错误'}, widget=forms.TextInput(attrs={'class': 'form-control','placeholder': '宿主机端口', }),) class DockerServerEdit(ModelForm): class Meta: model = DockerHost fields = ('host', 'hostip','port','enabled') ================================================ FILE: dockermanager/migrations/__init__.py ================================================ ================================================ FILE: dockermanager/models.py ================================================ #coding:utf8 from __future__ import unicode_literals from django.db import models from servermanager.models import Server class Dockerimage(models.Model): imagesId = models.CharField(u'镜像ID', max_length=64) repository = models.CharField(u'仓库', max_length=64,blank=True) tag = models.CharField(u'Tag', max_length=32,blank=True) imagehost = models.GenericIPAddressField(u'主机IP') size = models.CharField(u'大小', max_length=32,blank=True) update_at = models.DateTimeField(blank=True, auto_now=True,null=True) def __unicode__(self): return self.imagesId class Meta: verbose_name = u'Docker镜像' verbose_name_plural = u"Docker镜像" class DockerHost(models.Model): host = models.OneToOneField(Server,verbose_name=u'主机') hostip = models.GenericIPAddressField(max_length=128,null=False,default='',verbose_name=u'docker IP地址') containers = models.IntegerField(u'容器数',blank=True,null=True) images = models.IntegerField(verbose_name=u'镜像数',blank=True,null=True) port = models.IntegerField(u'端口',blank=True) enabled = models.IntegerField(u'状态',blank=True) serverversion = models.CharField(u'docker版本', max_length=32,blank=True) datatotal = models.CharField(u'总共空间', max_length=32,blank=True) datause = models.CharField(u'已使用空间', max_length=32,blank=True) dataAvailable = models.CharField(u'剩余空间', max_length=32,blank=True) storageDriver = models.CharField(u'存储驱动', max_length=32,blank=True) create_at = models.DateTimeField(blank=True, auto_now_add=True) update_at = models.DateTimeField(blank=True, auto_now=True) def __unicode__(self): return self.hostip class Meta: verbose_name = u'Docker主机' verbose_name_plural = u"Docker主机" class DockerContainer(models.Model): hostip = models.GenericIPAddressField(u'宿主机IP地址',max_length=128,blank=True,null=True) containerID = models.CharField(u'容器ID', max_length=64) Name = models.CharField(u'容器名', max_length=255,blank=True) command = models.CharField(u'执行命令', max_length=255,blank=True) status = models.CharField(u'状态', max_length=32,blank=True) image= models.CharField(verbose_name=u'镜像', blank=True,max_length=64) Created = models.DateTimeField(u'创建时间',blank=True,) update_at = models.DateTimeField(blank=True, auto_now=True,null=True) def __unicode__(self): return self.Name class Meta: verbose_name = u'Docker容器' verbose_name_plural = u"Docker容器" permissions = ( ("docker_index_view", "Can view %s" % verbose_name), ) class DockerContainerInfo(models.Model): containerid = models.CharField(u'容器ID', max_length=48) #与上表进行关联 State = models.CharField(u'状态', max_length=48) Driver = models.CharField(u'磁盘设备', max_length=48,blank=True,null=True) net = models.CharField(u'网络模式', max_length=48,blank=True) cpu = models.CharField(u'CPU', max_length=32,blank=True) mem =models.CharField(u'内存', max_length=32,blank=True) ip = models.GenericIPAddressField(u'IP') dns = models.CharField(u'DNS', max_length=32,blank=True) host = models.CharField(u'主机', max_length=32,blank=True) MacAddress = models.CharField(u'网卡mac地址', max_length=64) uptime = models.CharField(u'运行时间', max_length=32,blank=True) gateway = models.GenericIPAddressField(u'网关') class ContainerPorts(models.Model): containerid = models.CharField(u'容器ID', max_length=48) #与上表进行关联 container_port = models.IntegerField(u'容器端口',blank=True) protocol = models.CharField(u'协议',max_length=32,blank=True) hostip = models.GenericIPAddressField(u'映射IP') hostport = models.CharField(u'主机端口',max_length=32,blank=True) def __unicode__(self): return self.containerid class Meta: verbose_name = u'端口管理' verbose_name_plural = u"端口管理" ================================================ FILE: dockermanager/tests.py ================================================ from django.test import TestCase # Create your tests here. ================================================ FILE: dockermanager/urls.py ================================================ from django.conf.urls import url from dockermanager.views import (Dockercontainerlist,DockerHosts,DockerImages,DockercontainerSearch, DockerHostAdd,DockerHostDel,DockerHostEdit,DockerContainerDel, DockerContainerStop,DockerContainerStart,DockerContainerRestart, DockerImageDelete,DockerLogOutput,StartCeleryStatus,StopCeleryStatus, RestartCeleryStatus,DeleteCeleryStatus,webSocket,getsocket) urlpatterns = [ url(r'container/list/(\d+)$', Dockercontainerlist, name='Dockercontainerlist'), url(r'container/search/(?P\d+)$',DockercontainerSearch,name='DockercontainerSearch'), url(r'container/restart/(\w+)$',DockerContainerRestart,name='DockerContainerRestart'), url(r'container/stop/(\w+)$', DockerContainerStop,name='DockerContainerStop'), url(r'container/start/(\w+)$', DockerContainerStart, name='DockerContainerStart'), url(r'container/logs/(\w+)$',DockerLogOutput,name='DockerLogOutput'), url(r'container/delete/(\w+)$',DockerContainerDel,name='DockerContainerDel'), url(r'container/start/task/(\w+\-\w+\-\w+\-\w+\-\w+)$',StartCeleryStatus,name='StartCeleryStatus'), url(r'container/restart/task/(\w+\-\w+\-\w+\-\w+\-\w+)$',RestartCeleryStatus,name='RestartCeleryStatus'), url(r'container/stop/task/(\w+\-\w+\-\w+\-\w+\-\w+)$',StopCeleryStatus,name='StopCeleryStatus'), url(r'container/delete/task/(\w+\-\w+\-\w+\-\w+\-\w+)$',DeleteCeleryStatus,name='DeleteCeleryStatus'), url(r'server/list/$', DockerHosts, name='DockerHosts'), url(r'images/list/(\d+)$',DockerImages, name='DockerImages'), url(r'images/del/(\d+)$', DockerImageDelete, name='DockerImageDelete'), url(r'server/add/$', DockerHostAdd, name='DockerHostAdd'), url(r'server/del/(\d+)$',DockerHostDel,name='DockerHostDel'), url(r'server/edit/(\d+)$',DockerHostEdit,name='DockerHostEdit'), url(r'webSocket/(\w+)$',webSocket,name='webSocket'), url(r'getSocket/(\w+)$',getsocket,name='getsocket'), ] ================================================ FILE: dockermanager/views.py ================================================ #coding:utf8 from django.shortcuts import render,render_to_response from django.http import HttpResponse,HttpResponseRedirect from django.http import StreamingHttpResponse from dwebsocket import accept_websocket,require_websocket import threading from django.http import HttpResponse from django.db.models import Q from django.contrib.auth.decorators import login_required from dockermanager.models import DockerHost,Dockerimage,DockerContainer from django.contrib.auth.decorators import permission_required # Create your views here. from webapp.Extends import PageList from servermanager.models import Server from dockermanager import forms from Publicapi.dockerapi.Manager import Dockerapi from webapp.tasks import StopContainer,StartContainer,RestartContainer,DeleteContainer import json import docker from webapp.models import * @login_required() @permission_required('dockermanger.docker_index_view',raise_exception=True) def Dockercontainerlist(request,page): usersession=request.session.get('user_id') if request.method == 'POST': searchdata = request.POST.get('search') #分页代码 (page,start,end,per_item)=PageList.PageCount(page) count = DockerContainer.objects.filter(Q(containerID__contains=searchdata) | Q(Name__contains=searchdata)).count() result = DockerContainer.objects.filter(Q(containerID__contains=searchdata) | Q(Name__contains=searchdata)).order_by('-id')[start:end] url = "/docker/container/list" if count%per_item == 0: all_pages_count = count/per_item else: all_pages_count = count/per_item+1 page=PageList.Page(page, url, all_pages_count) ret = {'Containerdata': result, 'count': count, 'page': page, 'usersession':usersession} return render(request,'dockermanager/containers_list.html',ret) else: DockerHostData= DockerHost.objects.all() #分页代码 (page,start,end,per_item)=PageList.PageCount(page) count = DockerContainer.objects.all().count() result = DockerContainer.objects.all().order_by('-id')[start:end] url = "/docker/container/list" if count%per_item == 0: all_pages_count = count/per_item else: all_pages_count = count/per_item+1 page=PageList.Page(page, url, all_pages_count) ret = {'Containerdata': result, 'count': count, 'DockerHostData':DockerHostData, 'page': page, 'usersession':usersession} return render(request,'dockermanager/containers_list.html',ret) @login_required() def DockercontainerSearch(request,page): usersession=request.session.get('user_id') if request.method == 'GET': searchdata = request.GET.get('search') ipData = request.GET.get('ipList') status = request.GET.get('status') DockerHostData = DockerHost.objects.all() #分页代码 (page,start,end,per_item)=PageList.PageCount(page) count=DockerContainer.objects.filter(Q(hostip__contains=ipData) & Q(status__contains=status), Q(containerID__contains=searchdata) | Q(Name__contains=searchdata)).count() result=DockerContainer.objects.filter(Q(hostip__contains=ipData) & Q(status__contains=status), Q(containerID__contains=searchdata) | Q(Name__contains=searchdata)).order_by('-id')[start:end] #count = DockerContainer.objects.filter(Q(containerID__contains=searchdata) | Q(Name__contains=searchdata)).count() #result = DockerContainer.objects.filter(Q(containerID__contains=searchdata) | Q(Name__contains=searchdata)).order_by('-id')[start:end] url = "/docker/container/search" print url search=u"?search=%s&status=%s&ipList=%s" %(searchdata,status,ipData) if count%per_item == 0: all_pages_count = count/per_item else: all_pages_count = count/per_item+1 page=PageList.Page(page, url, all_pages_count,search) ret = {'Containerdata': result, 'count': count, 'DockerHostData': DockerHostData, 'page': page, 'usersession':usersession} return render(request,'dockermanager/containers_list.html',ret) @login_required() def DockerHosts(request): usersession=request.session.get('user_id') if request.method == 'POST': id = request.POST['id'] status= request.POST['checkboxValue'] if status == 'true': status=1 else: status=0 dockerhostdata = DockerHost.objects.get(id=id) dockerhostdata.enabled = status dockerhostdata.save() msg={'msginfo':u'主机状态修改成功!!!!!!'} return HttpResponse(json.dumps(msg)) else: Hostadata=DockerHost.objects.all() ret={'usersession':usersession,'Hostadata':Hostadata} return render(request,'dockermanager/dockerhosts_list.html',ret) @login_required() @permission_required('dockermanger.add_dockerhost',raise_exception=True) def DockerHostAdd(request): username = request.session.get('user_name') restdata = {'data':'','regerror':'','usersession': request.session.get('user_id')} registerobj=forms.DockerServerAdd() restdata['data'] = registerobj listdata=[] [listdata.append(int(i.host.id)) for i in DockerHost.objects.all()] ServerData=Server.objects.exclude(id__in=listdata) restdata['ServerData']=ServerData if request.method == 'POST': form = forms.DockerServerAdd(request.POST) if form.is_valid(): ServerData = request.POST['DockerServer'] ServerData = Server.objects.get(id=ServerData) dockerip = request.POST['dockerip'] dockerport = request.POST['dockerport'] ServerStatus = int(request.POST['ServerStatus']) NewDockerHost=DockerHost(host=ServerData,hostip=dockerip,port=dockerport,enabled=ServerStatus) NewDockerHost.save() Operation.objects.create(Opuser=username,Opaction=u'添加Docker宿主机') return HttpResponseRedirect('/docker/server/list/') else: restdata['data'] = form return render(request,'dockermanager/dockerhosts_add.html', restdata) @login_required() def DockerImages(request,page): usersession=request.session.get('user_id') if request.method == 'POST': pass else: #分页代码 (page,start,end,per_item)=PageList.PageCount(page) count = Dockerimage.objects.all().count() result = Dockerimage.objects.all().order_by('-id')[start:end] url = "/docker/images/list" if count%per_item == 0: all_pages_count = count/per_item else: all_pages_count = count/per_item+1 page=PageList.Page(page, url, all_pages_count) ret = {'Imagedata': result, 'count': count, 'page': page, 'usersession':usersession} return render(request,'dockermanager/images_list.html',ret) @login_required() @permission_required('dockermanger.delete_dockerimage',raise_exception=True) def DockerImageDelete(request, imageid): username = request.session.get('user_name') if request.method == 'GET': Image=Dockerimage.objects.get(id=imageid) if Image: repo=Image.repository #查询DOCKER主机IP及端口 ip = Image.imagehost port = DockerHost.objects.get(hostip=ip).port dockerapi = Dockerapi(ip,port) a=dockerapi.DeleteImages(repo) Image.delete() Operation.objects.create(Opuser=username,Opaction=u'删除Docker镜像 %s' %repo) return HttpResponse(a) else: return HttpResponse(u"没有该镜像!!") @login_required() @permission_required('dockermanger.delete_dockerhost',raise_exception=True) def DockerHostDel(request,hostid): username = request.session.get('user_name') if request.method == 'GET': DockerHost.objects.get(id=hostid).delete() Operation.objects.create(Opuser=username,Opaction=u'删除Docker宿主机%s' %hostid) msg={'msginfo':u'DockerHost 删除成功!!!'} return HttpResponse(json.dumps(msg)) @login_required() @permission_required('dockermanger.change_dockerhost',raise_exception=True) def DockerHostEdit(request,hostid): usersession=request.session.get('user_id') username = request.session.get('user_name') HostData=DockerHost.objects.get(id=hostid) if request.method == 'POST': pass Operation.objects.create(Opuser=username,Opaction=u'修改Docker宿主机%s' %hostid) else: listdata=[] [listdata.append(int(i.host.id)) for i in DockerHost.objects.all()] hostid=HostData.host.id listdata.remove(hostid) ServerData=Server.objects.exclude(id__in=listdata) ret={'usersession':usersession,'HostData':HostData,'hostid':hostid,'ServerData':ServerData} return render(request,'dockermanager/dockerhosts_edit.html', ret) @login_required() def DockerContainerStop(request,containerid): username = request.session.get('user_name') if request.method == 'GET': IP=DockerContainer.objects.get(containerID=containerid).hostip port = DockerHost.objects.get(hostip=IP).port a=StopContainer.delay(dict(host=IP,port=port,container=containerid)) Operation.objects.create(Opuser=username,Opaction=u'停止容器%s' %containerid[0:12]) msg={'celeryId':a.id} return HttpResponse(json.dumps(msg)) @login_required() def DockerContainerRestart(request,containerId): username = request.session.get('user_name') if request.method == 'GET': IP=DockerContainer.objects.get(containerID=containerId).hostip port = DockerHost.objects.get(hostip=IP).port a=RestartContainer.apply_async((IP, port, containerId)) Operation.objects.create(Opuser=username,Opaction=u'重启容器%s' %containerId[0:12]) msg={'celeryId':a.id} return HttpResponse(json.dumps(msg)) @login_required() @permission_required('dockermanger.delete_dockercontainerinfo',raise_exception=True) def DockerContainerDel(request,containerId): username = request.session.get('user_name') if request.method == 'GET': print "sdsdsds" IP=DockerContainer.objects.get(containerID=containerId).hostip port = DockerHost.objects.get(hostip=IP).port print "ssssssss" print IP,port,containerId a=DeleteContainer.apply_async((IP, port, containerId)) Operation.objects.create(Opuser=username,Opaction=u'删除容器%s' %containerId[0:12]) msg={'celeryId': a.id} return HttpResponse(json.dumps(msg)) @login_required() def DockerContainerStart(request, containerId): username = request.session.get('user_name') if request.method == 'GET': IP=DockerContainer.objects.get(containerID=containerId).hostip port = DockerHost.objects.get(hostip=IP).port a=StartContainer.apply_async((IP, port, containerId)) Operation.objects.create(Opuser=username,Opaction=u'启动容器%s' %containerId[0:12]) msg={'celeryId': a.id} return HttpResponse(json.dumps(msg)) @login_required() def DockerLogOutput(request,containerid): usersession=request.session.get('user_id') if request.method == 'GET': IP=DockerContainer.objects.get(containerID=containerid).hostip port = DockerHost.objects.get(hostip=IP).port try: dockerserver = Dockerapi(IP,port) data=dockerserver.LogContainer(containerid,tail=30) data=data.split('\n') except docker.errors.NotFound: return HttpResponse('没有该容器') ret = {'usersession': usersession,'dockerlogsdata':data,'containerid':containerid} return render(request,'dockermanager/dockerhosts_logs.html',ret) else: IP=DockerContainer.objects.get(containerID=containerid).hostip port = DockerHost.objects.get(hostip=IP).port try: dockerserver = Dockerapi(IP,port) data=dockerserver.LogContainer(containerid,tail=30) data=data.split('\n') except docker.errors.NotFound: return HttpResponse('没有该容器') ret={'dockerlogsdata':data} return HttpResponse(json.dumps(ret)) @login_required() def StartCeleryStatus(request,celeryid): if request.method == 'GET': task=StartContainer.AsyncResult(str(celeryid)) if task.state == 'PENDING': response = { 'state': task.state, 'status': 'Pending...' } elif task.state != 'FAILURE': response = { 'state': task.state, 'status': task.status, } if 'result' in task.info: response['result'] = task.info['result'] else: response = { 'state': task.state, 'current': 1, 'total': 1, 'status': str(task.info), # this is the exception raised } return HttpResponse(json.dumps(response)) @login_required() def StopCeleryStatus(request,celeryid): if request.method == 'GET': task=StopContainer.AsyncResult(str(celeryid)) if task.state == 'PENDING': response = { 'state': task.state, 'status': 'Pending...' } elif task.state != 'FAILURE': response = { 'state': task.state, 'status': task.status, } if 'result' in task.info: response['result'] = task.info['result'] else: response = { 'state': task.state, 'current': 1, 'total': 1, 'status': str(task.info), # this is the exception raised } return HttpResponse(json.dumps(response)) @login_required() def RestartCeleryStatus(request,celeryid): if request.method == 'GET': task=RestartContainer.AsyncResult(str(celeryid)) if task.state == 'PENDING': response = { 'state': task.state, 'status': 'Pending...' } elif task.state != 'FAILURE': response = { 'state': task.state, 'status': task.status, } if 'result' in task.info: response['result'] = task.info['result'] else: response = { 'state': task.state, 'status': str(task.info), # this is the exception raised } return HttpResponse(json.dumps(response)) @login_required() def DeleteCeleryStatus(request,celeryid): if request.method == 'GET': task=DeleteContainer.AsyncResult(str(celeryid)) containerID=request.GET['containerid'] if task.state == 'PENDING': response = { 'state': task.state, 'status': 'Pending...' } elif task.state != 'FAILURE': DockerContainer.objects.filter(containerID=containerID).delete() response = { 'state': task.state, 'status': task.status, } if 'result' in task.info: response['result'] = task.info['result'] else: response = { 'state': task.state, 'status': str(task.info), # this is the exception raised } return HttpResponse(json.dumps(response)) @login_required() def webSocket(request,containerId): usersession = request.session.get('user_id') IP = DockerContainer.objects.get(containerID=containerId).hostip PORT = DockerHost.objects.get(hostip=IP).port containerId = containerId return render(request,'dockermanager/websocket.html',locals()) @accept_websocket def getsocket(request,containerId): if request.is_websocket: request.websocket.send('Welcome to Simpletour DevOps!!') IP = DockerContainer.objects.get(containerID=containerId).hostip PORT = DockerHost.objects.get(hostip=IP).port docker_api = Dockerapi(IP, PORT) try: container = docker_api.dockerConnect.exec_create(container=containerId, cmd="/bin/bash", user='root', tty=True,stdout=True,stderr=True,stdin=True,) a = docker_api.dockerConnect.exec_start(container['Id'], stream=True, tty=True, detach=False,socket=True) docker_api.dockerConnect.exec_resize(container['Id'], height=40, width=80) for message in request.websocket: if not message: break a.send(message.encode('utf-8')) request.websocket.send(a.recv(65535)) except: request.websocket.send('主机无法连接!!') ================================================ FILE: domainmanager/urls.py ================================================ from django.conf.urls import url from domainmanager.views import (SimpletourDomainLists,SimpletourGetdomainApi,Simpletourrecord,SimpletourGetRecords) urlpatterns = [ url(r'list/$', SimpletourDomainLists, name='SimpletourDomainLists'), url(r'dnspodapi/$',SimpletourGetdomainApi,name='SimpletourGetdomainApi'), url(r'records/$',SimpletourGetRecords,name='SimpletourGetRecords'), url(r'record/search/(?P\d+)$',Simpletourrecord,name='Simpletourrecord'), ] ================================================ FILE: manage.py ================================================ #!/usr/bin/env python import os import sys if __name__ == "__main__": os.environ.setdefault("DJANGO_SETTINGS_MODULE", "SimpletourDevops.settings") from django.core.management import execute_from_command_line execute_from_command_line(sys.argv) ================================================ FILE: requirements.txt ================================================ django==1.9.9 django-import-export==0.5.1 itsdangerous==0.24 celery https://github.com/darklow/django-suit/tarball/v2 MySQL-python docker-py supervisor uwsgi redis dwebsocket eventlet==0.19.0 pyyaml ================================================ FILE: run_eventlet.py ================================================ from eventlet import wsgi, patcher patcher.monkey_patch() import sys import getopt import eventlet from SimpletourDevops.wsgi import application addr, port = '127.0.0.1', 8099 opts, _ = getopt.getopt(sys.argv[1:], "b:") for opt, value in opts: if opt == '-b': addr, port = value.split(":") wsgi.server(eventlet.listen((addr, int(port))), application) ================================================ FILE: saltadmin/Minions_Controller.py ================================================ #!/usr/bin/env python #coding:utf-8 __author__ = 'Luodi' import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "SimpletourDevops.settings") import django django.setup() import datetime from saltadmin.models import * from Publicapi.saltstackapi.SaltConApi import SaltApi import threading import json def GetALLkeys(): saltmaster = SaltServer.objects.all() for server in saltmaster: salt=SaltApi(server.url,server.username,server.password) minions,minions_pre,minions_rej,minions_deny =salt.List_all_keys() for i in minions: try: Minions.objects.create(minion=i, saltserver=server, status="Accepted") except: minion = Minions.objects.get(minion=i) minion.status = 'Accepted' minion.save() for pre in minions_pre: try: Minions.objects.create(minion=pre, saltserver=server, status="Unaccepted") except: minion = Minions.objects.get(minion=pre) minion.status = 'Unaccepted' minion.save() for rej in minions_rej: try: Minions.objects.create(minion=rej, saltserver=server, status="Rejected") except: minion = Minions.objects.get(minion=rej) minion.status = 'Rejected' minion.save() for deny in minions_deny: try: Minions.objects.create(minion=deny, saltserver=server, status="Denied") except: minion = Minions.objects.get(minion=deny) minion.status = 'Denied' minion.save() def UpdateMinionInfo(mininboj,minions,url,username,password): salt = SaltApi(url, username, password) alive_minions = salt.Saltalive(minions) print alive_minions if minions in alive_minions: minion_status = True else: minion_status = False try: MinionStatus.objects.create(minion=mininboj, minion_status=minion_status) except: saltminion = MinionStatus.objects.get(minion=mininboj) alive_old = MinionStatus.objects.get(minion=mininboj).minion_status if minion_status != alive_old: saltminion.alive_time_last = datetime.datetime.now() saltminion.minion_status = minion_status print "-------------------------------%s" %(minion_status,) saltminion.alive_time_now = datetime.datetime.now() saltminion.save() def GetMinionConf(): GetALLkeys() MinionsData=Minions.objects.filter(status='Accepted') for minion in MinionsData: t=threading.Thread(target=UpdateMinionInfo,args=(minion, minion.minion, minion.saltserver.url, minion.saltserver.username, minion.saltserver.password)) t.start() return "GET minion conf is Ok!!" def GetJobs(url,username,password): salt = SaltApi(url,username,password) data = salt.runner("jobs.list_jobs") for j,info in data.items(): if SaltJobs.objects.filter(jid=j): pass else: SaltJobs.objects.create(jid=j,args=info['Arguments'],function=info['Function'], startTime=info['StartTime'],target=info['Target'],user=info['User'],saltserver=url) def GetSaltJobs(): SaltMaster_data = SaltServer.objects.all() for salt in SaltMaster_data: t = threading.Thread(target=GetJobs,args=(salt.url,salt.username,salt.password)) t.start() def JobResultFromat(data): result=[] for resultkey,resultdata in data.items(): list = [] errors_count = [] for task,taskresult in resultdata.items(): taskLinedict ={} taskLinedict['ID'] = task.split('|')[1].strip('_').lstrip('-') taskLinedict['Name'] = task.split('|')[2].strip('_').lstrip('-') if taskresult['result'] == False: errors_count.append(taskresult) taskLinedict['Result'] =taskresult['result'] taskLinedict['Comment'] = taskresult['comment'] if not taskresult.has_key('start_time'): taskresult['Started'] = '' else: taskresult['Started'] = taskresult['start_time'] if not taskresult.has_key('duration'): taskresult['Duration'] = '' else: taskresult['Duration'] = taskresult['duration'] taskLinedict['Changes'] = taskresult['changes'] list.append(taskLinedict) result_dict_list = {'url':resultkey,'result': list,'error':len(errors_count),'success':len(list) - len(errors_count)} result.append(result_dict_list) # for formatkey,formatresult in result.items(): # print formatkey # for line in formatresult: # print "---------------------------------" # for k,v in line.items(): # if isinstance(v,dict): # if len(v) == 0: # v = None # print k+":",v # # #result[k] = v return result if __name__ == '__main__': #GetMinionConf() #GetSaltJobs() #a={u'192.168.2.148': {u'user_|-zabbix-user-group_|-zabbix_|-present': {u'comment': u'User zabbix set to be added', u'name': u'zabbix', u'start_time': u'10:41:43.381761', u'result': None, u'duration': 16.003, u'__run_num__': 1, u'changes': {}, u'__id__': u'zabbix-user-group'}, u'file_|-start-file_|-/etc/rc.local_|-append': {u'comment': u'File /etc/rc.local is set to be updated', u'pchanges': {}, u'name': u'/etc/rc.local', u'start_time': u'10:41:43.439903', u'result': None, u'duration': 1.483, u'__run_num__': 7, u'changes': {u'diff': u'--- \n\n+++ \n\n@@ -13,3 +13,4 @@\n\n touch /var/lock/subsys/local\n mount /home/data /data --bind\n mount /data/docker /var/lib/docker --bind\n+/etc/init.d/zabbix_agentd start'}, u'__id__': u'start-file'}, u'file_|-zabbix-client-transport_|-/usr/local/src/zabbix-3.0.5-client.tar.gz_|-managed': {u'comment': u'The file /usr/local/src/zabbix-3.0.5-client.tar.gz is set to be changed', u'pchanges': {u'newfile': u'/usr/local/src/zabbix-3.0.5-client.tar.gz'}, u'name': u'/usr/local/src/zabbix-3.0.5-client.tar.gz', u'start_time': u'10:41:43.399380', u'result': None, u'duration': 9.981, u'__run_num__': 2, u'changes': {}, u'__id__': u'zabbix-client-transport'}, u'cmd_|-zabbix-start-sh_|-/etc/init.d/zabbix_agentd start_|-run': {u'comment': u'Command "/etc/init.d/zabbix_agentd start" would have been executed', u'name': u'/etc/init.d/zabbix_agentd start', u'start_time': u'10:41:43.439464', u'result': None, u'duration': 0.355, u'__run_num__': 6, u'changes': {}, u'__id__': u'zabbix-start-sh'}, u'group_|-zabbix-user-group_|-zabbix_|-present': {u'comment': u'Group zabbix set to be added', u'name': u'zabbix', u'start_time': u'10:41:43.380688', u'result': None, u'duration': 0.683, u'__run_num__': 0, u'changes': {}, u'__id__': u'zabbix-user-group'}, u'file_|-zabbix-file-copy_|-/usr/local/zabbix-3.0.5/etc/zabbix_agentd.conf_|-managed': {u'comment': u'The file /usr/local/zabbix-3.0.5/etc/zabbix_agentd.conf is set to be changed', u'pchanges': {u'newfile': u'/usr/local/zabbix-3.0.5/etc/zabbix_agentd.conf'}, u'name': u'/usr/local/zabbix-3.0.5/etc/zabbix_agentd.conf', u'start_time': u'10:41:43.410485', u'result': None, u'duration': 24.638, u'__run_num__': 4, u'changes': {}, u'__id__': u'zabbix-file-copy'}, u'cmd_|-zabbix-client-transport_|-cd /usr/local/src/ && tar -zxf zabbix-3.0.5-client.tar.gz -C /usr/local/_|-run': {u'comment': u'Command "cd /usr/local/src/ && tar -zxf zabbix-3.0.5-client.tar.gz -C /usr/local/" would have been executed', u'name': u'cd /usr/local/src/ && tar -zxf zabbix-3.0.5-client.tar.gz -C /usr/local/', u'start_time': u'10:41:43.410143', u'result': None, u'duration': 0.276, u'__run_num__': 3, u'changes': {}, u'__id__': u'zabbix-client-transport'}, u'file_|-zabbix-start-sh_|-/etc/init.d/zabbix_agentd_|-managed': {u'comment': u'The file /etc/init.d/zabbix_agentd is set to be changed', u'pchanges': {u'newfile': u'/etc/init.d/zabbix_agentd'}, u'name': u'/etc/init.d/zabbix_agentd', u'start_time': u'10:41:43.435245', u'result': None, u'duration': 3.886, u'__run_num__': 5, u'changes': {}, u'__id__': u'zabbix-start-sh'}}, u'192.168.2.147': {u'user_|-zabbix-user-group_|-zabbix_|-present': {u'comment': u'User zabbix set to be added', u'name': u'zabbix', u'start_time': u'10:41:43.649409', u'result': None, u'duration': 16.626, u'__run_num__': 1, u'changes': {}, u'__id__': u'zabbix-user-group'}, u'file_|-start-file_|-/etc/rc.local_|-append': {u'comment': u'File /etc/rc.local is set to be updated', u'pchanges': {}, u'name': u'/etc/rc.local', u'start_time': u'10:41:43.759598', u'result': None, u'duration': 2.015, u'__run_num__': 7, u'changes': {u'diff': u'--- \n\n+++ \n\n@@ -13,3 +13,4 @@\n\n touch /var/lock/subsys/local\n mount /home/data /data --bind\n mount /data/docker /var/lib/docker --bind\n+/etc/init.d/zabbix_agentd start'}, u'__id__': u'start-file'}, u'file_|-zabbix-client-transport_|-/usr/local/src/zabbix-3.0.5-client.tar.gz_|-managed': {u'comment': u'The file /usr/local/src/zabbix-3.0.5-client.tar.gz is set to be changed', u'pchanges': {u'newfile': u'/usr/local/src/zabbix-3.0.5-client.tar.gz'}, u'name': u'/usr/local/src/zabbix-3.0.5-client.tar.gz', u'start_time': u'10:41:43.667990', u'result': None, u'duration': 20.692, u'__run_num__': 2, u'changes': {}, u'__id__': u'zabbix-client-transport'}, u'cmd_|-zabbix-start-sh_|-/etc/init.d/zabbix_agentd start_|-run': {u'comment': u'Command "/etc/init.d/zabbix_agentd start" would have been executed', u'name': u'/etc/init.d/zabbix_agentd start', u'start_time': u'10:41:43.758629', u'result': None, u'duration': 0.728, u'__run_num__': 6, u'changes': {}, u'__id__': u'zabbix-start-sh'}, u'group_|-zabbix-user-group_|-zabbix_|-present': {u'comment': u'Group zabbix set to be added', u'name': u'zabbix', u'start_time': u'10:41:43.647126', u'result': None, u'duration': 1.619, u'__run_num__': 0, u'changes': {}, u'__id__': u'zabbix-user-group'}, u'file_|-zabbix-file-copy_|-/usr/local/zabbix-3.0.5/etc/zabbix_agentd.conf_|-managed': {u'comment': u'The file /usr/local/zabbix-3.0.5/etc/zabbix_agentd.conf is set to be changed', u'pchanges': {u'newfile': u'/usr/local/zabbix-3.0.5/etc/zabbix_agentd.conf'}, u'name': u'/usr/local/zabbix-3.0.5/etc/zabbix_agentd.conf', u'start_time': u'10:41:43.690624', u'result': None, u'duration': 56.148, u'__run_num__': 4, u'changes': {}, u'__id__': u'zabbix-file-copy'}, u'cmd_|-zabbix-client-transport_|-cd /usr/local/src/ && tar -zxf zabbix-3.0.5-client.tar.gz -C /usr/local/_|-run': {u'comment': u'Command "cd /usr/local/src/ && tar -zxf zabbix-3.0.5-client.tar.gz -C /usr/local/" would have been executed', u'name': u'cd /usr/local/src/ && tar -zxf zabbix-3.0.5-client.tar.gz -C /usr/local/', u'start_time': u'10:41:43.689750', u'result': None, u'duration': 0.66, u'__run_num__': 3, u'changes': {}, u'__id__': u'zabbix-client-transport'}, u'file_|-zabbix-start-sh_|-/etc/init.d/zabbix_agentd_|-managed': {u'comment': u'The file /etc/init.d/zabbix_agentd is set to be changed', u'pchanges': {u'newfile': u'/etc/init.d/zabbix_agentd'}, u'name': u'/etc/init.d/zabbix_agentd', u'start_time': u'10:41:43.746988', u'result': None, u'duration': 11.198, u'__run_num__': 5, u'changes': {}, u'__id__': u'zabbix-start-sh'}}} a={u'192.168.2.147': {u'file_|-nginx-config_|-/usr/local/nginx/conf/nginx.conf_|-managed': {u'comment': u'The file /usr/local/nginx/conf/nginx.conf is set to be changed', u'pchanges': {u'newfile': u'/usr/local/nginx/conf/nginx.conf'}, u'retcode': 2, u'start_time': u'12:00:11.704011', u'__id__': u'nginx-config', u'result': None, u'duration': 62.022, u'__run_num__': 6, u'changes': {}, u'name': u'/usr/local/nginx/conf/nginx.conf'}, u'file_|-/usr/local/nginx/conf/vhosts/_|-/usr/local/nginx/conf/vhosts/_|-directory': {u'comment': u'The following files will be changed:\n/usr/local/nginx/conf/vhosts: directory - new\n', u'pchanges': {u'/usr/local/nginx/conf/vhosts': {u'directory': u'new'}}, u'retcode': 2, u'start_time': u'12:00:11.766317', u'__id__': u'/usr/local/nginx/conf/vhosts/', u'result': None, u'duration': 0.813, u'__run_num__': 7, u'changes': {}, u'name': u'/usr/local/nginx/conf/vhosts/'}, u'file_|-nginx-install_|-/usr/local/src/nginx-1.2.0.tar.gz_|-managed': {u'comment': u'Source file salt://nginx/files/nginx-1.2.0.tar.gz not found', u'_stamp': u'2016-12-15T12:02:16.749601', u'pchanges': [False, u'Source file salt://nginx/files/nginx-1.2.0.tar.gz not found'], u'return': u'Error: file.managed', u'retcode': 2, u'success': False, u'start_time': u'12:00:11.690524', u'jid': u'20161215200215675300', u'duration': 12.813, u'result': False, u'__id__': u'nginx-install', u'fun': u'state.sls', u'__run_num__': 4, u'changes': {}, u'id': u'192.168.2.147', u'name': u'/usr/local/src/nginx-1.2.0.tar.gz'}, u'user_|-www-user-group_|-www_|-present': {u'comment': u'User www set to be added', u'retcode': 2, u'start_time': u'12:00:11.674525', u'__id__': u'www-user-group', u'result': None, u'duration': 15.774, u'__run_num__': 3, u'changes': {}, u'name': u'www'}, u'file_|-pcre-install_|-/usr/local/src/pcre-8.37.tar.gz_|-managed': {u'comment': u'The file /usr/local/src/pcre-8.37.tar.gz is set to be changed', u'pchanges': {u'newfile': u'/usr/local/src/pcre-8.37.tar.gz'}, u'retcode': 2, u'start_time': u'12:00:11.641509', u'__id__': u'pcre-install', u'result': None, u'duration': 22.872, u'__run_num__': 0, u'changes': {}, u'name': u'/usr/local/src/pcre-8.37.tar.gz'}, u'file_|-/usr/local/nginx/conf/vhosts/www.test.com.conf_|-/usr/local/nginx/conf/vhosts/www.test.com.conf_|-managed': {u'comment': u'The file /usr/local/nginx/conf/vhosts/www.test.com.conf is set to be changed', u'pchanges': {u'newfile': u'/usr/local/nginx/conf/vhosts/www.test.com.conf'}, u'retcode': 2, u'start_time': u'12:00:11.767427', u'__id__': u'/usr/local/nginx/conf/vhosts/www.test.com.conf', u'result': None, u'duration': 431.954, u'__run_num__': 8, u'changes': {}, u'name': u'/usr/local/nginx/conf/vhosts/www.test.com.conf'}, u'cmd_|-nginx-install_|-cd /usr/local/src/ && tar zxf nginx-1.8.0.tar.gz && cd nginx-1.8.0 && ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-http_stub_status_module --with-file-aio --with-http_dav_module --with-pcre=/usr/local/src/pcre-8.37 && make && make install && chown -R www. /usr/local/nginx_|-run': {u'comment': u'One or more requisite failed: nginx.install.nginx-install', u'__run_num__': 5, u'__sls__': u'nginx.install', u'changes': {}, u'result': False}, u'file_|-nginx-service_|-/usr/lib/systemd/system/nginx.service_|-managed': {u'comment': u'The file /usr/lib/systemd/system/nginx.service is set to be changed', u'pchanges': {u'newfile': u'/usr/lib/systemd/system/nginx.service'}, u'retcode': 2, u'start_time': u'12:00:12.199726', u'__id__': u'nginx-service', u'result': None, u'duration': 13.078, u'__run_num__': 9, u'changes': {}, u'name': u'/usr/lib/systemd/system/nginx.service'}, u'file_|-log_logrotate_|-/etc/logrotate.d/logrotate_nginx_|-managed': {u'comment': u'The file /etc/logrotate.d/logrotate_nginx is set to be changed', u'pchanges': {u'newfile': u'/etc/logrotate.d/logrotate_nginx'}, u'retcode': 2, u'start_time': u'12:00:12.229231', u'__id__': u'log_logrotate', u'result': None, u'duration': 13.148, u'__run_num__': 11, u'changes': {}, u'name': u'/etc/logrotate.d/logrotate_nginx'}, u'cmd_|-pcre-install_|-cd /usr/local/src/ && tar zxf pcre-8.37.tar.gz && cd pcre-8.37 && ./configure --prefix=/usr/local/pcre && make && make install_|-run': {u'comment': u'Command "cd /usr/local/src/ && tar zxf pcre-8.37.tar.gz && cd pcre-8.37 && ./configure --prefix=/usr/local/pcre && make && make install" would have been executed', u'retcode': 2, u'start_time': u'12:00:11.665282', u'__id__': u'pcre-install', u'result': None, u'duration': 6.168, u'__run_num__': 1, u'changes': {}, u'name': u'cd /usr/local/src/ && tar zxf pcre-8.37.tar.gz && cd pcre-8.37 && ./configure --prefix=/usr/local/pcre && make && make install'}, u'cmd_|-nginx-service_|-chmod +x /usr/lib/systemd/system/nginx.service && systemctl enable nginx.service && systemctl start nginx.service_|-run': {u'comment': u'Command "chmod +x /usr/lib/systemd/system/nginx.service && systemctl enable nginx.service && systemctl start nginx.service" would have been executed', u'retcode': 2, u'start_time': u'12:00:12.213134', u'__id__': u'nginx-service', u'result': None, u'duration': 15.835, u'__run_num__': 10, u'changes': {}, u'name': u'chmod +x /usr/lib/systemd/system/nginx.service && systemctl enable nginx.service && systemctl start nginx.service'}, u'group_|-www-user-group_|-www_|-present': {u'comment': u'Group www set to be added', u'name': u'www', u'start_time': u'12:00:11.672088', u'result': None, u'duration': 1.803, u'__run_num__': 2, u'changes': {}, u'__id__': u'www-user-group'}}} JobResultFromat(a) ================================================ FILE: saltadmin/__init__.py ================================================ ================================================ FILE: saltadmin/admin.py ================================================ from django.contrib import admin from saltadmin.models import * class SaltJobsModels(admin.ModelAdmin): list_display = ('jid','args','function','target','startTime','saltserver','user') search_fields = ('function','jid') class CmdRunLogModels(admin.ModelAdmin): list_display = ('user','time','target','cmd','total','runsuccess','runerror') search_fields = ('user','cmd') class MinionGroupModels(admin.ModelAdmin): list_display = ('groupname',) filter_horizontal = ('minions', ) admin.site.register(SaltJobs,SaltJobsModels) admin.site.register(CmdRunLog,CmdRunLogModels) admin.site.register(MinionGroup,MinionGroupModels) admin.site.register(Modules) ================================================ FILE: saltadmin/apps.py ================================================ from __future__ import unicode_literals from django.apps import AppConfig class SaltadminConfig(AppConfig): name = 'saltadmin' ================================================ FILE: saltadmin/forms.py ================================================ #!/usr/bin/env python #coding:utf-8 __author__ = 'Luodi' from django import forms from saltadmin.models import SaltServer,Minions class KeyManager(forms.Form): status = forms.ChoiceField(choices=Minions.Status,widget=forms.Select(attrs={'class':'form-control'})) class CheckSaltServer(forms.ModelForm): url=forms.URLField(required=True,error_messages={'required': u'请输入一个URL格式'}, widget=forms.TextInput(attrs={'class':'form-control','placeholder': 'http://127.0.0.1',})) username = forms.CharField(required=True,error_messages={'required':u'请输入API用户名'}, widget=forms.TextInput(attrs={'class':'form-control','placeholder': 'username',})) password = forms.CharField(required=True, error_messages={'required': u'请输入API验证密码'}, widget=forms.PasswordInput(attrs={'class': 'form-control', 'placeholder': 'password', })) # def clean(self): # cleaned_data = sum(CheckSaltServer,self).clean() # value = cleaned_data.get('url') # try: # SaltServer.objects.get(url=value) # self._errors['url'] = self.error_class(["%s url 信息已存在" % value]) # except SaltServer.DoesNotExist: # pass # return cleaned_data class Meta: model = SaltServer exclude= ('id',) widgets = { 'role': forms.Select(attrs={'class': 'form-control'}), } ================================================ FILE: saltadmin/migrations/__init__.py ================================================ ================================================ FILE: saltadmin/models.py ================================================ #coding:utf8 from __future__ import unicode_literals from django.db import models class SaltServer(models.Model): Role = ( ('Master', 'Master'), ('Backend', 'Backend'), ) url = models.URLField(max_length=100,verbose_name=u'URL地址') username = models.CharField(max_length=50, verbose_name=u'用户名') password = models.CharField(max_length=50,verbose_name=u'密码') role = models.CharField(choices=Role,max_length=20,default='Master',verbose_name=u'角色') def __unicode__(self): return u"%s - %s" %(self.url,self.role) class Meta: verbose_name = u'Salt服务器' verbose_name_plural = u'Salt服务器列表' permissions = ( ("salt_index_view", "Can view %s" % verbose_name), ) class Modules(models.Model): name = models.CharField(max_length=20,verbose_name=u'Salt模块名称') models_site = models.CharField(max_length=50,null=True,blank=True,verbose_name=u'Salt模块参数') def __unicode__(self): return self.name class Meta: verbose_name = u'Salt软件' verbose_name_plural = u'Salt软件' ''' class Command(models.Model): cmd = models.CharField(max_length=100,verbose_name=u'Salt命令') doc = models.TextField(max_length=2000,blank=True,verbose_name=u'帮助文档') module = models.ForeignKey(Module,verbose_name=u'所属模块') def __unicode__(self): return u"%s - %s"%(self.module,self.cmd) class Meta: verbose_name = u'Salt命令' verbose_name_plural = u'Salt命令列表' unique_together = ("module", "cmd") ''' class Minions(models.Model): Status = ( ('Accepted', 'Accepted'), ('Unaccepted', 'Unaccepted'), ('Rejected', 'Rejected'), ) minion = models.CharField(max_length=50,verbose_name=u'客户端',unique=True) saltserver = models.ForeignKey(SaltServer,verbose_name=u'所属Salt服务器') status = models.CharField(choices=Status,max_length=20,default='Unknown',verbose_name=u'Key状态') create_date=models.DateTimeField(auto_now_add=True,verbose_name=u'创建时间') def __unicode__(self): return self.minion class Meta: verbose_name = u'Salt客户端' verbose_name_plural = u'Salt客户端列表' class MinionStatus(models.Model): minion = models.OneToOneField(Minions) minion_status = models.CharField(max_length=20,verbose_name=u'在线状态') # 上次检测时间 alive_time_last = models.DateTimeField(auto_now=True,null=True) # 当前检测时间 alive_time_now = models.DateTimeField(auto_now=True,null=True) class MinionGroup(models.Model): groupname = models.CharField(u'Minion组',max_length=50,default='default') minions = models.ManyToManyField(Minions,verbose_name=u'Minions',blank=True) def __unicode__(self): return self.groupname class Meta: verbose_name = u'Minion组' verbose_name_plural = u'Minion组' class CmdRunLog(models.Model): user=models.CharField(max_length=30) time=models.DateTimeField(auto_now_add=True,null=True) target=models.CharField(max_length=500) cmd=models.CharField(max_length=500) total=models.IntegerField() runsuccess = models.IntegerField(default=0) runerror = models.IntegerField(default=0) runresult = models.TextField(max_length=65535,null=True,blank=True) class Meta: verbose_name = u'命令执行日志' verbose_name_plural = u'命令执行日志' class SaltJobs(models.Model): jid = models.CharField(max_length=50,unique=True) args = models.CharField(max_length=50,null=True,blank=True) function = models.CharField(max_length=50) startTime = models.CharField(max_length=100) target = models.CharField(max_length=500) user = models.CharField(max_length=50) saltserver = models.CharField(max_length=100,null=True,blank=True) class Meta: verbose_name = u'Jobs列表' verbose_name_plural = u'Jobs列表' class ModuleDeployLog(models.Model): user=models.CharField(max_length=50) time=models.DateTimeField() target=models.CharField(max_length=100) application=models.CharField(max_length=100) #成功的主机 success_hosts=models.CharField(max_length=500) #失败的主机 failed_hosts=models.CharField(max_length=500) #执行总共结果 total=models.IntegerField() #执行过程 log=models.TextField() #持续时间 duration=models.CharField(max_length=500) class Meta: verbose_name = u'软件部署' verbose_name_plural = u'软件部署' ================================================ FILE: saltadmin/tests.py ================================================ from django.test import TestCase # Create your tests here. ================================================ FILE: saltadmin/urls.py ================================================ from django.conf.urls import url from saltadmin.views import (KeyList,Minion_Status,SoftInstall,JobList,RemoteCmd,SaltMasterList, SaltMinionGrains,CmdResult,jobdetail,DeployResult,SaltMasterDelete, SalMasterChange ) urlpatterns = [ url(r'keylist/', KeyList, name='KeyList'), url(r'minion/status/',Minion_Status,name='Minion_Status'), url(r'minion/softinstall/',SoftInstall,name='SoftInstall'), url(r'job/list/(?P\d+)',JobList,name='JobList'), url(r'cmd/$',RemoteCmd,name='RemoteCmd'), url(r'master/$',SaltMasterList,name='SaltMasterList'), url(r'master/delete/(?P\d+)$',SaltMasterDelete,name='SaltMasterDelete'), url(r'master/change/(?P\d+)$',SalMasterChange,name='SalMasterChange'), url(r'grains/$',SaltMinionGrains,name='SaltMinionGrains'), url(r'cmdresult/(?P\d+)$',CmdResult,name='CmdResult'), url(r'deployresult/(?P\d+)$',DeployResult,name='DeployResult'), url(r'job/detail/$',jobdetail,name='jobdetail'), ] ================================================ FILE: saltadmin/utils.py ================================================ #!/usr/bin/env python #coding:utf-8 __author__ = 'Luodi' import commands import os def get_system_info(): cmd_get_cpu_sockect=r"lscpu|grep Socket|awk '{print $NF}'" cmd_get_cpu_cores=r"cat /proc/cpuinfo|grep processor|wc -l" cmd_get_mem_total=r"free -m |head -n 2|tail -n 1|awk '{print $2}'" cmd_get_mem_used=r"free -m |tail -n 2|head -n 1|awk '{print $3}'" cmd_get_users_num=r"w -h |wc -l" cmd_get_uptime=r"uptime |awk -F',' '{print $1}'" cpu_sockets=commands.getoutput(cmd_get_cpu_sockect) res=os.system('lscpu &>/dev/null') if res != 0: cpu_sockets=1 #如果没有lscpu命令,默认的CPU个数为1个 cpu_cores=commands.getoutput(cmd_get_cpu_cores) mem_total=commands.getoutput(cmd_get_mem_total) mem_used=commands.getoutput(cmd_get_mem_used) users=commands.getoutput(cmd_get_users_num) uptime=commands.getoutput(cmd_get_uptime) mem_percentage=round(float(mem_used)/float(mem_total)*100,2) mem_left_percentage=100-mem_percentage info_dict={'cpu_sockets':cpu_sockets, 'cpu_cores':cpu_cores, 'mem_total':mem_total, 'mem_used':mem_used, 'mem_percentage':mem_percentage, 'users':users, 'uptime':uptime, 'mem_left_percentage':mem_left_percentage} return info_dict ================================================ FILE: saltadmin/views.py ================================================ #coding:utf8 from django.shortcuts import render from django.http import HttpResponse,HttpResponseRedirect from django.core import serializers from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import permission_required from saltadmin.models import * from Publicapi.saltstackapi.SaltConApi import SaltApi import json from django.db.models import Q from saltadmin.forms import CheckSaltServer,KeyManager from webapp.Extends import PageList import yaml from saltadmin.Minions_Controller import JobResultFromat from webapp.models import Operation @login_required() def SaltMasterList(request): usersession = request.session.get('user_id') form = CheckSaltServer() if request.method == 'POST': form = CheckSaltServer(request.POST) if form.is_valid(): form.save() return HttpResponseRedirect('/salt/master/') else: form = form SaltMasterData = SaltServer.objects.all() Role=SaltServer.Role return render(request, 'saltadmin/saltmaster_list.html', locals()) @login_required() def SaltMasterDelete(request,masterid): user_name = request.session.get('user_name') if request.method == 'GET': SaltServer.objects.get(id=masterid).delete() Operation.objects.create(Opuser=user_name, Opaction=u'删除salt主机') msg = {'msginfo': u'Salt主机及所有管理信息已经删除成功!!'} return HttpResponse(json.dumps(msg)) @login_required() def SalMasterChange(request,masterid): user_name = request.session.get('user_name') if request.method == 'POST': url = request.POST.get('url') username = request.POST.get('username') password = request.POST.get('password') role = request.POST.get('role') Changeserver = SaltServer.objects.get(id=masterid) Changeserver.url = url Changeserver.username = username Changeserver.password = password Changeserver.role = role Changeserver.save() Operation.objects.create(Opuser=user_name, Opaction=u'修改salt主机信息') msg = {'msginfo': u'Master修改成功!!!!',} return HttpResponse(json.dumps(msg)) else: Changeserver = SaltServer.objects.get(id=masterid) data = {'url': Changeserver.url,'username':Changeserver.username,'password':Changeserver.password,'role':Changeserver.role } return HttpResponse(json.dumps(data)) @login_required() def KeyList(request): usersession = request.session.get('user_id') user_name = request.session.get('user_name') if request.method == 'GET': Accepted = Minions.objects.filter(status='Accepted') Unaccepted = Minions.objects.filter(status='Unaccepted') Rejected = Minions.objects.filter(status='Rejected') froms=KeyManager() return render(request,'saltadmin/key_list.html',locals()) if request.method == 'POST': minion = request.POST.get('minion') status = request.POST.get('status') Minion_data=Minions.objects.get(minion=minion) Minion_data.status = status Minion_data.save() Operation.objects.create(Opuser=user_name, Opaction=u'修改 minion Key状态 %s to %s' %(Minion_data.minion,status)) url = Minion_data.saltserver.url username = Minion_data.saltserver.username password = Minion_data.saltserver.password salt = SaltApi(url, username, password) if status == 'Accepted': ret = salt.AcceptKey(minion) elif status == 'Unaccepted': ret = salt.DeleteKey(minion) elif status == 'Rejected': ret = salt.RejectKey(minion) return HttpResponse('OK') @login_required() def Minion_Status(request): usersession = request.session.get('user_id') if request.method == 'GET': SaltMinionData = MinionStatus.objects.filter(minion__status='Accepted') return render(request,'saltadmin/minion_status.html',locals()) @login_required() def SoftInstall(request): usersession = request.session.get('user_id') user_name = request.session.get('user_name') if request.method == 'GET': SoftModuleData = Modules.objects.all() GroupData = MinionGroup.objects.all() # hosts = """[ {type: 1, list: [{ text: 'yang', id: 1}, {text: 'asdasd',id: 4}]}, }]""" groupall = [] for g in GroupData: group = {} list = [] for m in g.minions.all(): dir = {} dir['text'] = m.minion dir['id'] = m.minion list.append(dir) group['type'] = g.id group['list'] = list groupall.append(group) groupall = json.dumps(groupall) return render(request,'saltadmin/saltmodule_deploy.html',locals()) else: if not request.POST.get('minion'): minions_id = request.POST.get('minion_group') minions_data=MinionGroup.objects.get(id=minions_id).minions.all() else: minions_data = request.POST.getlist('minion') minions_list = '' for m in minions_data: minions_list += str(m) + ',' minions_list = minions_list.strip(',') software = request.POST.getlist('software') salt_env = request.POST.get('env') soft='' for i in software: soft += i + ',' soft=soft.strip(',') saltm = Minions.objects.get(minion=minions_list.split(',')[0]) url = saltm.saltserver.url username = saltm.saltserver.username password = saltm.saltserver.password salt = SaltApi(url, username, password) jid = salt.Softwarete_deploy(minions_list,arg=["saltenv=%s" %(salt_env), str(soft), 'test=True']) Operation.objects.create(Opuser=user_name, Opaction=u'部署软件 %s' %soft) #savelog = CmdRunLog.objects.create(user=user_name, target=minions_list, cmd=cmd, total=len(minions_list.split(','))) ret={'jid':jid,'minion':minions_list,'savelogid':1} return HttpResponse(json.dumps(ret)) @login_required() def JobList(request,page): usersession = request.session.get('user_id') if request.method == 'GET': # 分页代码 (page, start, end, per_item) = PageList.PageCount(page) count = SaltJobs.objects.filter(~Q(function='test.ping')).count() result = SaltJobs.objects.filter(~Q(function='test.ping')).order_by('-jid')[start:end] url = "/salt/job/list" if count % per_item == 0: all_pages_count = count / per_item else: all_pages_count = count / per_item + 1 page = PageList.Page(page, url, all_pages_count) ret = {'SaltMaster_data': result, 'count': count, 'page': page, 'usersession': usersession} return render(request,'saltadmin/saltjob_list.html',ret) @login_required() def jobdetail(request): if request.method == 'GET': jid = request.GET.get('jid') print jid jiddata = SaltJobs.objects.get(jid=jid) masterdata = SaltServer.objects.get(url=jiddata.saltserver) url = masterdata.url username =masterdata.username password = masterdata.password salt = SaltApi(url, username, password) resultdata = salt.salt_runner(jid) return HttpResponse(json.dumps(resultdata)) @login_required() def RemoteCmd(request): usersession = request.session.get('user_id') user_name = request.session.get('user_name') if request.method == 'GET': GroupData = MinionGroup.objects.all() #hosts = """[ {type: 1, list: [{ text: 'yang', id: 1}, {text: 'asdasd',id: 4}]}, }]""" groupall=[] for g in GroupData: group={} list = [] for m in g.minions.all(): dir = {} dir['text'] = m.minion dir['id'] = m.minion list.append(dir) group['type'] = g.id group['list'] = list groupall.append(group) groupall=json.dumps(groupall) return render(request,'saltadmin/salt_cmd.html',locals()) else: if not request.POST.get('minion'): minions_id = request.POST.get('minion_group') minions_data=MinionGroup.objects.get(id=minions_id).minions.all() else: minions_data = request.POST.getlist('minion') minions_list = '' for m in minions_data: minions_list += str(m) + ',' minions_list = minions_list.strip(',') cmd =request.POST.get('cmd') #必须是同一台master上的才能为一个组,这样只需要查询一个就可 saltm = Minions.objects.get(minion=minions_list.split(',')[0]) url = saltm.saltserver.url username = saltm.saltserver.username password = saltm.saltserver.password salt = SaltApi(url, username, password) jid = salt.shell_remote_execution(minions_list, cmd) Operation.objects.create(Opuser=user_name, Opaction=u'执行命令 %s' %cmd) savelog = CmdRunLog.objects.create(user=user_name, target=minions_list, cmd=cmd, total=len(minions_list.split(','))) ret={'jid':jid,'minion':minions_list,'savelogid':savelog.id} return HttpResponse(json.dumps(ret)) @login_required() def CmdResult(request,jid): if request.method == 'GET': minions_list = request.GET.get('minion') savelogid = request.GET.get('savelogid') saltm = Minions.objects.get(minion=minions_list.split(',')[0]) url = saltm.saltserver.url username = saltm.saltserver.username password = saltm.saltserver.password salt = SaltApi(url,username,password) resultdata = salt.salt_runner(jid) print savelogid logs = CmdRunLog.objects.get(id=savelogid) logs.runresult=resultdata logs.runsuccess=len(resultdata) logs.save() ret={'minion':minions_list,'resultdata':resultdata} return HttpResponse(json.dumps(ret)) @login_required() def DeployResult(request,jid): if request.method == 'GET': minions_list = request.GET.get('minion') savelogid = request.GET.get('savelogid') saltm = Minions.objects.get(minion=minions_list.split(',')[0]) url = saltm.saltserver.url username = saltm.saltserver.username password = saltm.saltserver.password salt = SaltApi(url,username,password) resultdata = salt.salt_runner(jid) resultdata=JobResultFromat(resultdata) #print savelogid #logs = CmdRunLog.objects.get(id=savelogid) #logs.runresult=resultdata #logs.runsuccess=len(resultdata) #logs.save() #print yaml.load_all(resultdata) ret={'minion':minions_list,'resultdata':resultdata} return HttpResponse(json.dumps(ret)) @login_required() def SaltMinionGrains(request): id = request.GET.get('minion') action = request.GET.get('action') Minion_data=MinionStatus.objects.get(id=id) url = Minion_data.minion.saltserver.url username = Minion_data.minion.saltserver.username password = Minion_data.minion.saltserver.password salt = SaltApi(url,username,password) if str(action) == 'grains': Data = salt.grainsall(str(Minion_data.minion)) elif str(action) == 'pillar': Data = salt.pillarall(str(Minion_data.minion)) else: Data={"msg": '无法查询'} return HttpResponse(json.dumps(Data)) ================================================ FILE: servermanager/__init__.py ================================================ ================================================ FILE: servermanager/admin.py ================================================ #coding:utf8 from django.contrib import admin from django.forms import ModelForm,TextInput,Textarea from django.contrib.admin import ModelAdmin #from suit.widgets import SuitDateWidget, SuitTimeWidget, SuitSplitDateTimeWidget from servermanager.models import * from import_export import resources from django.forms import ModelForm #导入和导出 from import_export.admin import ImportExportModelAdmin #定义导出的内容 class ServerResource(resources.ModelResource): class Meta: model = Server class AssetsResource(resources.ModelResource): class Meta: model = Assets ''' class AssetsTimeForm(ModelForm): class Meta: widgets = { 'euse_time': SuitDateWidget, 'suse_time': SuitDateWidget, }''' # Register your models here. class AssetsAdmin(ImportExportModelAdmin): resource_class = AssetsResource #form = AssetsTimeForm list_display = ('id','host_name','device_type','device_number','IDC','status','business','buy_time','buy_type','price','admin') list_filter = ('IDC','business','status','device_type') search_fields = ['hostname','id'] fieldsets = ( ('基本信息', {'fields': ('host_name', 'device_type', 'device_number','business','buy_type', 'IDC','status', 'admin','provider',)}), ('其它信息', {'fields': ('Warranty','buy_time', 'suse_time', 'euse_time','price','description')}), ) class CpuModels(admin.ModelAdmin): list_display = ('id','uuid','cpu_mhz','model','Architecture') list_display_links = ('uuid',) list_editable = ('cpu_mhz',) class DiskModels(admin.ModelAdmin): search_fields = ['parent_sn'] list_display = ('id','uuid', 'capacity','disk_type','Firm') class NicModels(admin.ModelAdmin): search_fields = ('ip',) list_display = ('id','uuid','name','ip','model') list_display_links = ('uuid',) class SoftwareModels(admin.ModelAdmin): list_display = ('id','name','version') class DeviceTypeModels(admin.ModelAdmin): search_fields = ('name',) list_display = ('id','name',) class BusinessModels(admin.ModelAdmin): list_display = ('id','name',) search_fields = ('name',) list_editable = ('name',) class ProviderModels(admin.ModelAdmin): list_display = ('id','provider_name', 'address', 'contacts', 'phone') class ServerModels(admin.ModelAdmin): list_display = ('id','Assets','Firm','cpu','hostname','saltid','mem','swap','system','version','platform') list_display_links = ('Assets',) def get_idc(self, obj): return obj.Assets.IDC get_idc.short_description = '资产' filter_horizontal = ('disk','nic','software') class IdcModels(admin.ModelAdmin): search_fields = ('idc_name',) list_display = ('idc_name','address','floor','contacts','phone') admin.site.register(Assets,AssetsAdmin) admin.site.register(Server,ServerModels) admin.site.register(DeviceType,DeviceTypeModels) admin.site.register(Business,BusinessModels) admin.site.register(Cpu,CpuModels) admin.site.register(Disk,DiskModels) admin.site.register(IDC,IdcModels) admin.site.register(Software,SoftwareModels) admin.site.register(NIC,NicModels) admin.site.register(Provider,ProviderModels) ================================================ FILE: servermanager/apps.py ================================================ from __future__ import unicode_literals from django.apps import AppConfig class ServermanagerConfig(AppConfig): name = 'servermanager' ================================================ FILE: servermanager/migrations/0001_initial.py ================================================ # -*- coding: utf-8 -*- # Generated by Django 1.9.9 on 2016-11-21 17:40 from __future__ import unicode_literals from django.db import migrations, models import django.db.models.deletion class Migration(migrations.Migration): initial = True dependencies = [ ] operations = [ migrations.CreateModel( name='Assets', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('host_name', models.CharField(max_length=128, null=True, unique=True, verbose_name='\u8bbe\u5907\u540d')), ('device_number', models.CharField(max_length=128, unique=True, verbose_name='\u8bbe\u5907\u7f16\u53f7')), ('Warranty', models.SmallIntegerField(verbose_name='\u4fdd\u4fee\u671f')), ('buy_time', models.CharField(blank=True, max_length=128, verbose_name='\u8d2d\u4e70\u65e5\u671f')), ('buy_type', models.SmallIntegerField(blank=True, choices=[(1, '\u516c\u53f8\u5185\u8d2d'), (2, '\u5458\u5de5\u81ea\u8d2d')], verbose_name='\u8d2d\u4e70\u65b9\u5f0f')), ('price', models.IntegerField(blank=True, verbose_name='\u8d2d\u4e70\u4ef7\u683c')), ('suse_time', models.DateField(max_length=128, null=True, verbose_name='\u5f00\u59cb\u4f7f\u7528\u65f6\u95f4')), ('euse_time', models.DateField(max_length=128, null=True, verbose_name='\u622a\u81f3\u4f7f\u7528\u65f6\u95f4')), ('status', models.SmallIntegerField(blank=True, choices=[(1, '\u6b63\u5728\u4f7f\u7528'), (2, '\u672a\u4f7f\u7528'), (3, '\u8bbe\u5907\u6545\u969c'), (4, '\u5e93\u5b58\u5907\u7528')], verbose_name='\u72b6\u6001')), ('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='\u8d44\u4ea7\u521b\u5efa\u65f6\u95f4')), ('devicetag', models.CharField(blank=True, max_length=255)), ('description', models.TextField(blank=True, max_length=255, verbose_name='\u5907\u6ce8')), ], options={ 'verbose_name': '\u8d44\u4ea7\u8868\u7ba1\u7406', 'verbose_name_plural': '\u8d44\u4ea7\u8868\u7ba1\u7406', 'permissions': (('cmdb_assets_view', 'Can view \u8d44\u4ea7\u8868\u7ba1\u7406'), ('assets_index_view', '\u8d44\u4ea7\u7ba1\u7406')), }, ), migrations.CreateModel( name='Business', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(blank=True, max_length=128, unique=True, verbose_name='\u4e1a\u52a1\u540d')), ('memo', models.CharField(blank=True, max_length=64, verbose_name='\u5907\u6ce8')), ], options={ 'verbose_name': '\u4e1a\u52a1\u5217\u8868', 'verbose_name_plural': '\u4e1a\u52a1\u5217\u8868', 'permissions': (('cmdb_devicetype_view', 'Can view \u4e1a\u52a1\u5217\u8868'),), }, ), migrations.CreateModel( name='Cpu', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('uuid', models.CharField(blank=True, max_length=64, verbose_name='UUID\u53f7')), ('parent_sn', models.CharField(blank=True, max_length=128, verbose_name='\u670d\u52a1\u5668SN')), ('Architecture', models.CharField(blank=True, max_length=128, null=True, verbose_name='\u67b6\u6784')), ('Vendor', models.CharField(blank=True, max_length=128, null=True, verbose_name='\u5236\u9020\u5546')), ('model', models.CharField(blank=True, max_length=128, null=True, verbose_name='\u578b\u53f7')), ('cpu_mhz', models.CharField(blank=True, max_length=128, null=True, verbose_name='\u9891\u7387')), ('L1cache', models.CharField(blank=True, max_length=128, null=True)), ('L2cache', models.CharField(blank=True, max_length=128, null=True)), ('L3cache', models.CharField(blank=True, max_length=128, null=True)), ('Thread', models.SmallIntegerField(null=True, verbose_name='\u7ebf\u7a0b')), ('create_time', models.DateTimeField(auto_now_add=True)), ('update_time', models.DateTimeField(auto_now=True)), ], options={ 'verbose_name': 'CPU', 'verbose_name_plural': 'CPU', }, ), migrations.CreateModel( name='DeviceType', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(blank=True, max_length=128, verbose_name='\u8bbe\u5907\u7c7b\u578b')), ], options={ 'verbose_name': '\u8bbe\u5907\u7c7b\u578b', 'verbose_name_plural': '\u8bbe\u5907\u7c7b\u578b', 'permissions': (('cmdb_devicetype_view', 'Can view \u8bbe\u5907\u7c7b\u578b'),), }, ), migrations.CreateModel( name='Disk', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(blank=True, max_length=128, verbose_name='\u786c\u76d8\u540d\u79f0')), ('uuid', models.CharField(blank=True, max_length=128, unique=True)), ('parent_sn', models.CharField(blank=True, max_length=128, verbose_name='\u670d\u52a1\u5668SN')), ('Firm', models.CharField(blank=True, max_length=128, null=True, verbose_name='\u5236\u9020\u5546')), ('capacity', models.CharField(blank=True, max_length=128, null=True, verbose_name='\u5bb9\u91cf')), ('disk_type', models.SmallIntegerField(blank=True, choices=[(1, 'SATA'), (2, 'SSD')], null=True, verbose_name='\u78c1\u76d8\u7c7b\u578b')), ('create_time', models.DateTimeField(auto_now_add=True)), ('update_time', models.DateTimeField(auto_now=True)), ('tag', models.CharField(blank=True, max_length=128, null=True)), ], options={ 'verbose_name': '\u786c\u76d8', 'verbose_name_plural': '\u786c\u76d8', }, ), migrations.CreateModel( name='IDC', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('idc_name', models.CharField(blank=True, max_length=128, unique=True)), ('address', models.CharField(blank=True, max_length=255, null=True)), ('floor', models.CharField(blank=True, max_length=20, null=True, verbose_name='\u697c\u5c42')), ('contacts', models.CharField(blank=True, max_length=128, null=True)), ('phone', models.CharField(blank=True, max_length=20, null=True)), ], options={ 'verbose_name': 'IDC', 'verbose_name_plural': 'IDC', 'permissions': (('cmdb_idc_view', 'Can view IDC'),), }, ), migrations.CreateModel( name='NIC', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('uuid', models.CharField(blank=True, max_length=128, verbose_name='UUID\u53f7')), ('parent_sn', models.CharField(blank=True, max_length=128, verbose_name='\u670d\u52a1\u5668SN')), ('name', models.CharField(max_length=128, verbose_name='\u7f51\u5361\u540d\u79f0')), ('model', models.CharField(blank=True, max_length=128, null=True, verbose_name='\u578b\u53f7')), ('ip', models.GenericIPAddressField(default='', verbose_name='IP\u5730\u5740')), ('mac', models.CharField(max_length=64, verbose_name='mac\u5730\u5740')), ('netmask', models.CharField(blank=True, max_length=64, null=True, verbose_name='\u5b50\u7f51\u63a9\u7801')), ('nicstatus', models.CharField(blank=True, max_length=64, null=True, verbose_name='\u7f51\u5361\u72b6\u6001')), ('create_time', models.DateTimeField(auto_now_add=True)), ('update_time', models.DateTimeField(auto_now=True)), ('tag', models.CharField(blank=True, max_length=128, null=True)), ], options={ 'verbose_name': '\u7f51\u5361', 'verbose_name_plural': '\u7f51\u5361', }, ), migrations.CreateModel( name='Provider', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('provider_name', models.CharField(blank=True, max_length=128, unique=True, verbose_name='\u63d0\u4f9b\u5546')), ('address', models.CharField(blank=True, max_length=255, verbose_name='\u5730\u5740')), ('contacts', models.CharField(blank=True, max_length=128, verbose_name='\u8054\u7cfb\u4eba')), ('phone', models.CharField(blank=True, max_length=20, verbose_name='\u8054\u7cfb\u7535\u8bdd')), ('Fax', models.CharField(blank=True, max_length=20, verbose_name='\u4f20\u771f')), ], options={ 'verbose_name': '\u4f9b\u5e94\u5546', 'verbose_name_plural': '\u4f9b\u5e94\u5546', 'permissions': (('cmdb_provider_view', 'Can view \u4f9b\u5e94\u5546'),), }, ), migrations.CreateModel( name='Server', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('sn', models.CharField(max_length=128, unique=True, verbose_name='SN\u53f7')), ('hostname', models.CharField(max_length=128, verbose_name='\u4e3b\u673a\u540d')), ('mem', models.CharField(blank=True, max_length=128, null=True, verbose_name='\u5185\u5b58\u603b\u5bb9\u91cf')), ('swap', models.CharField(blank=True, max_length=128, null=True, verbose_name='swap\u5bb9\u91cf')), ('platform', models.CharField(blank=True, max_length=128, null=True, verbose_name='\u5e73\u53f0')), ('system', models.CharField(blank=True, max_length=128, null=True, verbose_name='\u7cfb\u7edf')), ('version', models.CharField(blank=True, max_length=128, null=True, verbose_name='\u7248\u672c')), ('Firm', models.CharField(blank=True, max_length=128, null=True, verbose_name='\u5236\u9020\u5546')), ('cpu_count', models.SmallIntegerField(blank=True, verbose_name='cpu\u4e2a\u6570')), ('cpu_core_count', models.SmallIntegerField(blank=True, verbose_name='cpu\u6838\u6570')), ('raid', models.CharField(blank=True, max_length=128, null=True, verbose_name='RAID\u7ea7\u522b')), ('saltid', models.CharField(blank=True, max_length=128, null=True, verbose_name='SaltID\u540d')), ('create_time', models.DateTimeField(auto_now_add=True)), ('addtype', models.SmallIntegerField(blank=True, choices=[(1, '\u624b\u52a8\u6dfb\u52a0'), (2, '\u81ea\u52a8\u91c7\u96c6')], default=1, verbose_name='\u91c7\u96c6\u6a21\u5f0f')), ('update_time', models.DateTimeField(auto_now=True, null=True)), ('Assets', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='pub', to='servermanager.Assets', verbose_name='\u8d44\u4ea7\u5173\u8054')), ('cpu', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='servermanager.Cpu')), ('disk', models.ManyToManyField(blank=True, to='servermanager.Disk', verbose_name='\u786c\u76d8')), ('nic', models.ManyToManyField(to='servermanager.NIC', verbose_name='\u7f51\u5361\u5217\u8868')), ], options={ 'verbose_name': '\u670d\u52a1\u5668\u7ba1\u7406', 'verbose_name_plural': '\u670d\u52a1\u5668\u7ba1\u7406', 'permissions': (('cmdb_server_view', 'Can view \u670d\u52a1\u5668\u7ba1\u7406'),), }, ), migrations.CreateModel( name='Software', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(blank=True, max_length=128, verbose_name='\u8f6f\u4ef6\u540d\u79f0')), ('version', models.CharField(blank=True, max_length=128, null=True, verbose_name='\u7248\u672c')), ('license', models.CharField(blank=True, max_length=128, null=True, verbose_name='\u5e8f\u5217\u53f7')), ], options={ 'verbose_name': '\u8f6f\u4ef6\u7ba1\u7406', 'verbose_name_plural': '\u8f6f\u4ef6\u7ba1\u7406', 'permissions': (('cmdb_software_view', 'Can view \u8f6f\u4ef6\u7ba1\u7406'),), }, ), migrations.AddField( model_name='server', name='software', field=models.ManyToManyField(blank=True, to='servermanager.Software', verbose_name='\u8f6f\u4ef6\u5217\u8868'), ), migrations.AddField( model_name='assets', name='IDC', field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='servermanager.IDC'), ), ] ================================================ FILE: servermanager/migrations/0002_auto_20161121_1740.py ================================================ # -*- coding: utf-8 -*- # Generated by Django 1.9.9 on 2016-11-21 17:40 from __future__ import unicode_literals from django.conf import settings from django.db import migrations, models import django.db.models.deletion class Migration(migrations.Migration): initial = True dependencies = [ ('servermanager', '0001_initial'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.AddField( model_name='assets', name='admin', field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='\u7ba1\u7406\u5458\u90ae\u7bb1'), ), migrations.AddField( model_name='assets', name='business', field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='servermanager.Business', verbose_name='\u4e1a\u52a1'), ), migrations.AddField( model_name='assets', name='device_type', field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='servermanager.DeviceType', verbose_name='\u8bbe\u5907\u7c7b\u578b'), ), migrations.AddField( model_name='assets', name='provider', field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='servermanager.Provider', verbose_name='\u63d0\u4f9b\u5546'), ), ] ================================================ FILE: servermanager/migrations/0003_auto_20161128_1031.py ================================================ # -*- coding: utf-8 -*- # Generated by Django 1.9.9 on 2016-11-28 10:31 from __future__ import unicode_literals from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ ('servermanager', '0002_auto_20161121_1740'), ] operations = [ migrations.AlterField( model_name='cpu', name='uuid', field=models.CharField(max_length=64, verbose_name='UUID\u53f7'), ), ] ================================================ FILE: servermanager/migrations/0004_auto_20161128_1032.py ================================================ # -*- coding: utf-8 -*- # Generated by Django 1.9.9 on 2016-11-28 10:32 from __future__ import unicode_literals from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ ('servermanager', '0003_auto_20161128_1031'), ] operations = [ migrations.AlterField( model_name='cpu', name='parent_sn', field=models.CharField(max_length=128, verbose_name='\u670d\u52a1\u5668SN'), ), ] ================================================ FILE: servermanager/migrations/0005_auto_20161128_1032.py ================================================ # -*- coding: utf-8 -*- # Generated by Django 1.9.9 on 2016-11-28 10:32 from __future__ import unicode_literals from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ ('servermanager', '0004_auto_20161128_1032'), ] operations = [ migrations.AlterField( model_name='idc', name='idc_name', field=models.CharField(max_length=128, unique=True), ), ] ================================================ FILE: servermanager/migrations/0006_auto_20161128_1034.py ================================================ # -*- coding: utf-8 -*- # Generated by Django 1.9.9 on 2016-11-28 10:34 from __future__ import unicode_literals from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ ('servermanager', '0005_auto_20161128_1032'), ] operations = [ migrations.AlterField( model_name='business', name='name', field=models.CharField(max_length=128, unique=True, verbose_name='\u4e1a\u52a1\u540d'), ), migrations.AlterField( model_name='devicetype', name='name', field=models.CharField(max_length=128, verbose_name='\u8bbe\u5907\u7c7b\u578b'), ), migrations.AlterField( model_name='disk', name='name', field=models.CharField(max_length=128, verbose_name='\u786c\u76d8\u540d\u79f0'), ), migrations.AlterField( model_name='disk', name='parent_sn', field=models.CharField(max_length=128, verbose_name='\u670d\u52a1\u5668SN'), ), migrations.AlterField( model_name='disk', name='uuid', field=models.CharField(max_length=128, unique=True), ), migrations.AlterField( model_name='nic', name='parent_sn', field=models.CharField(max_length=128, verbose_name='\u670d\u52a1\u5668SN'), ), migrations.AlterField( model_name='nic', name='uuid', field=models.CharField(max_length=128, verbose_name='UUID\u53f7'), ), migrations.AlterField( model_name='provider', name='provider_name', field=models.CharField(max_length=128, unique=True, verbose_name='\u63d0\u4f9b\u5546'), ), migrations.AlterField( model_name='software', name='name', field=models.CharField(max_length=128, verbose_name='\u8f6f\u4ef6\u540d\u79f0'), ), ] ================================================ FILE: servermanager/migrations/0007_auto_20161128_1038.py ================================================ # -*- coding: utf-8 -*- # Generated by Django 1.9.9 on 2016-11-28 10:38 from __future__ import unicode_literals from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ ('servermanager', '0006_auto_20161128_1034'), ] operations = [ migrations.AlterField( model_name='idc', name='address', field=models.CharField(blank=True, max_length=255, null=True, verbose_name='\u5730\u5740'), ), migrations.AlterField( model_name='idc', name='contacts', field=models.CharField(blank=True, max_length=128, null=True, verbose_name='\u8054\u7cfb\u4eba'), ), migrations.AlterField( model_name='idc', name='idc_name', field=models.CharField(max_length=128, unique=True, verbose_name='IDC'), ), migrations.AlterField( model_name='idc', name='phone', field=models.CharField(blank=True, max_length=20, null=True, verbose_name='\u8054\u7cfb\u7535\u8bdd'), ), ] ================================================ FILE: servermanager/migrations/0008_auto_20161128_1109.py ================================================ # -*- coding: utf-8 -*- # Generated by Django 1.9.9 on 2016-11-28 11:09 from __future__ import unicode_literals from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ ('servermanager', '0007_auto_20161128_1038'), ] operations = [ migrations.AlterField( model_name='server', name='cpu_core_count', field=models.SmallIntegerField(blank=True, default=0, verbose_name='cpu\u6838\u6570'), ), migrations.AlterField( model_name='server', name='cpu_count', field=models.SmallIntegerField(blank=True, default=0, verbose_name='cpu\u4e2a\u6570'), ), ] ================================================ FILE: servermanager/migrations/0009_auto_20161128_1112.py ================================================ # -*- coding: utf-8 -*- # Generated by Django 1.9.9 on 2016-11-28 11:12 from __future__ import unicode_literals from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ ('servermanager', '0008_auto_20161128_1109'), ] operations = [ migrations.AlterField( model_name='server', name='saltid', field=models.CharField(max_length=128, verbose_name='SaltID\u540d'), ), ] ================================================ FILE: servermanager/migrations/0010_auto_20161128_1113.py ================================================ # -*- coding: utf-8 -*- # Generated by Django 1.9.9 on 2016-11-28 11:13 from __future__ import unicode_literals from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ ('servermanager', '0009_auto_20161128_1112'), ] operations = [ migrations.AlterField( model_name='server', name='nic', field=models.ManyToManyField(blank=True, null=True, to='servermanager.NIC', verbose_name='\u7f51\u5361\u5217\u8868'), ), ] ================================================ FILE: servermanager/migrations/0011_auto_20161202_1049.py ================================================ # -*- coding: utf-8 -*- # Generated by Django 1.9.9 on 2016-12-02 10:49 from __future__ import unicode_literals from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ ('servermanager', '0010_auto_20161128_1113'), ] operations = [ migrations.AlterField( model_name='server', name='nic', field=models.ManyToManyField(blank=True, to='servermanager.NIC', verbose_name='\u7f51\u5361\u5217\u8868'), ), ] ================================================ FILE: servermanager/migrations/__init__.py ================================================ ================================================ FILE: servermanager/models.py ================================================ #coding:utf8 from __future__ import unicode_literals from django.db import models from webapp.models import Suser '''设备类型表''' class DeviceType(models.Model): name = models.CharField(max_length=128,verbose_name=u'设备类型') def __unicode__(self): return self.name class Meta: verbose_name = u'设备类型' verbose_name_plural = u"设备类型" permissions = ( ("cmdb_devicetype_view", "Can view %s" %verbose_name), ) '''IDC信息管理表''' class IDC(models.Model): idc_name = models.CharField(u'IDC',max_length=128, unique=True) address = models.CharField(u'地址',max_length=255, null=True,blank=True) floor = models.CharField(u'楼层',max_length=20,null=True,blank=True) contacts = models.CharField(u'联系人',max_length=128, null=True,blank=True) phone = models.CharField(u'联系电话',max_length=20,null=True,blank=True) def __unicode__(self): return self.idc_name class Meta: verbose_name = u'IDC' verbose_name_plural = u'IDC' permissions = ( ("cmdb_idc_view", "Can view %s" %verbose_name), ) '''业务表''' class Business(models.Model): name = models.CharField(max_length=128,unique=True,verbose_name=u'业务名') memo = models.CharField(u'备注',max_length=64, blank=True) def __unicode__(self): return self.name class Meta: verbose_name = u'业务列表' verbose_name_plural = u'业务列表' permissions = ( ("cmdb_devicetype_view", "Can view %s" %verbose_name), ) '''提供商表''' class Provider(models.Model): provider_name = models.CharField(max_length=128, unique=True, verbose_name=u'提供商') address = models.CharField(max_length=255, blank=True, verbose_name=u'地址') contacts = models.CharField(max_length=128, blank=True, verbose_name=u'联系人') phone = models.CharField(max_length=20,blank=True, verbose_name=u'联系电话') Fax = models.CharField(max_length=20,blank=True, verbose_name=u'传真') def __unicode__(self): return self.provider_name class Meta: verbose_name = u'供应商' verbose_name_plural = u'供应商' permissions = ( ("cmdb_provider_view", "Can view %s" %verbose_name), ) '''资产表''' class Assets(models.Model): host_name = models.CharField(verbose_name=u'设备名',max_length=128,null=True, unique=True) device_number = models.CharField(u'设备编号',max_length=128, unique=True) device_type = models.ForeignKey('DeviceType',verbose_name=u'设备类型',null=True,blank=True) #保修期 Warranty = models.SmallIntegerField(u'保修期') IDC = models.ForeignKey('IDC', null=True,blank=True) business = models.ForeignKey('Business',verbose_name=u'业务', null=True,blank=True) buy_time = models.CharField(u'购买日期', max_length=128, blank=True) buy_type_choice = ( (1, u'公司内购'), (2, u'员工自购'), ) buy_type = models.SmallIntegerField(u'购买方式',choices=buy_type_choice,blank=True) price = models.IntegerField(u'购买价格',blank=True) #管理员,可以是多个管理员进行维护 admin = models.ForeignKey(Suser, verbose_name=u'管理员邮箱',null=True,blank=True) suse_time = models.DateField(u'开始使用时间', max_length=128, null=True) euse_time = models.DateField(u'截至使用时间', max_length=128, null=True) status_choice = ( (1, u'正在使用'), (2, u'未使用'), (3, u'设备故障'), (4, u'库存备用'), ) status =models.SmallIntegerField(u'状态',choices=status_choice,blank=True) create_time = models.DateTimeField(u'资产创建时间', auto_now_add=True,null=True) devicetag = models.CharField(max_length=255, blank=True) #提供商 provider = models.ForeignKey('Provider',verbose_name=u'提供商', null=True,blank=True) #其它备注 description = models.TextField(max_length=255,blank=True,verbose_name=u'备注') def __unicode__(self): return self.host_name class Meta: verbose_name = u'资产表管理' verbose_name_plural = u'资产表管理' permissions = ( ("cmdb_assets_view", "Can view %s" %verbose_name), ("assets_index_view", "资产管理"), ) '''软件版本''' class Software(models.Model): name = models.CharField(max_length=128, verbose_name=u'软件名称') version = models.CharField(max_length=128,null=True, blank=True,verbose_name=u'版本') license = models.CharField(max_length=128,null=True, blank=True,verbose_name=u'序列号') def __unicode__(self): return self.name class Meta: verbose_name = u'软件管理' verbose_name_plural = u'软件管理' permissions = ( ("cmdb_software_view", "Can view %s" %verbose_name), ) '''服务器主表''' class Server(models.Model): Assets = models.OneToOneField('Assets',verbose_name=u'资产关联',null=True,blank=True,related_name='pub') sn = models.CharField(max_length=128,verbose_name=u'SN号',unique=True) hostname = models.CharField(max_length=128,verbose_name=u'主机名') mem = models.CharField(max_length=128,null=True, blank=True,verbose_name=u'内存总容量') swap = models.CharField(max_length=128,null=True, blank=True,verbose_name=u'swap容量') platform = models.CharField(max_length=128,null=True, blank=True,verbose_name=u'平台') system = models.CharField(max_length=128,null=True, blank=True,verbose_name=u'系统') version = models.CharField(max_length=128,null=True, blank=True,verbose_name=u'版本') #产商 Firm = models.CharField(max_length=128,null=True, blank=True,verbose_name=u'制造商') #软件安装列表 software = models.ManyToManyField('Software', blank=True,verbose_name=u'软件列表') #CPU cpu = models.ForeignKey('Cpu',blank=True,null=True) cpu_count = models.SmallIntegerField(u'cpu个数',blank=True,default=0) cpu_core_count = models.SmallIntegerField(u'cpu核数',blank=True,default=0) #nic nic = models.ManyToManyField('NIC', verbose_name=u'网卡列表',blank=True) #磁盘 disk = models.ManyToManyField('Disk', verbose_name=u'硬盘',blank=True) #raid raid = models.CharField(max_length=128,null=True,blank=True,verbose_name=u'RAID级别') saltid = models.CharField(max_length=128,verbose_name=u'SaltID名') create_time = models.DateTimeField(blank=True, auto_now_add=True) add_type_choice = ( (1,u'手动添加'), (2,u'自动采集'), ) addtype =models.SmallIntegerField(u'采集模式',choices=add_type_choice,blank=True,default=1) #修改时间 update_time = models.DateTimeField(blank=True, auto_now=True, null=True) def __unicode__(self): return "%s %s" %(self.sn, self.Assets.host_name) class Meta: verbose_name = u'服务器管理' verbose_name_plural = '服务器管理' permissions = ( ("cmdb_server_view", "Can view %s" %verbose_name), ) class Cpu(models.Model): uuid = models.CharField(u'UUID号',max_length=64) parent_sn = models.CharField(max_length=128, verbose_name=u'服务器SN') #cpu架构 Architecture = models.CharField(max_length=128,blank=True,null=True,verbose_name=u'架构') #产商 Vendor = models.CharField(max_length=128,blank=True,null=True,verbose_name=u'制造商') #型号 model = models.CharField(max_length=128,blank=True,null=True,verbose_name=u'型号') cpu_mhz = models.CharField(max_length=128,blank=True,null=True,verbose_name=u'频率') L1cache = models.CharField(max_length=128,blank=True,null=True) L2cache = models.CharField(max_length=128,blank=True,null=True) L3cache = models.CharField(max_length=128,blank=True,null=True) Thread = models.SmallIntegerField(null=True,verbose_name=u'线程') create_time = models.DateTimeField(blank=True, auto_now_add=True) update_time = models.DateTimeField(blank=True, auto_now=True) def __unicode__(self): return self.parent_sn class Meta: verbose_name = u'CPU' verbose_name_plural = u'CPU' class Disk(models.Model): name = models.CharField(max_length=128,verbose_name=u'硬盘名称') uuid = models.CharField(max_length=128,unique=True) parent_sn = models.CharField(max_length=128,verbose_name=u'服务器SN') #产商 Firm = models.CharField(max_length=128,null=True, blank=True,verbose_name=u'制造商') #容量 capacity = models.CharField(max_length=128,null=True, blank=True,verbose_name=u'容量') type_choice = ( (1, u'SATA'), (2, u'SSD'), ) #磁盘类型 disk_type = models.SmallIntegerField(choices=type_choice,null=True,blank=True,verbose_name='磁盘类型') create_time = models.DateTimeField(blank=True, auto_now_add=True) update_time = models.DateTimeField(blank=True, auto_now=True) tag = models.CharField(max_length=128,blank=True,null=True) def __unicode__(self): return self.parent_sn class Meta: verbose_name = u'硬盘' verbose_name_plural = u'硬盘' class NIC(models.Model): uuid = models.CharField(u'UUID号',max_length=128,) parent_sn = models.CharField(max_length=128,verbose_name=u'服务器SN') name = models.CharField(u'网卡名称', max_length=128,) model = models.CharField(max_length=128,blank=True,null=True,verbose_name=u'型号') ip = models.GenericIPAddressField(max_length=128,null=False,default='',verbose_name=u'IP地址') mac = models.CharField(u'mac地址', max_length=64) netmask = models.CharField(max_length=64,blank=True,null=True,verbose_name=u'子网掩码') nicstatus = models.CharField(max_length=64,blank=True,null=True,verbose_name=u'网卡状态') create_time = models.DateTimeField(blank=True, auto_now_add=True) update_time = models.DateTimeField(blank=True, auto_now=True) tag = models.CharField(max_length=128,blank=True,null=True) def __unicode__(self): return self.ip class Meta: verbose_name = u'网卡' verbose_name_plural = u'网卡' ================================================ FILE: servermanager/tests.py ================================================ from django.test import TestCase # Create your tests here. ================================================ FILE: servermanager/urls.py ================================================ from django.conf.urls import url from servermanager.views import (HostLists,ServerDetail,ChangeServer, AssetsLists,CeleryStatus, AssetsDetail, ServerList, DeleteAsset, DeleteServer, UpdateServer, ChangeAsset,) urlpatterns = [ url(r'assets/(\d+)$', AssetsLists, name='AssetsLists'), url(r'assets/detail/(\d+)$', AssetsDetail, name='AssetsDetail'), url(r'assets/delete/(\d+)$', DeleteAsset, name='DeleteAsset'), url(r'assets/change/(\d+)$', ChangeAsset, name='ChangeAsset'), url(r'servers/detail/(\d+)$',ServerDetail,name='ServerDetail'), url(r'servers/(\d+)$', ServerList, name='ServerList'), url(r'servers/delete/(\d+)$', DeleteServer, name='DeleteServer'), url(r'servers/update/(\d+)$',UpdateServer,name='UpdateServer'), url(r'servers/change/(\d+)$',ChangeServer,name='ChangeServer'), url(r'servers/task/(\w+\-\w+\-\w+\-\w+\-\w+)$',CeleryStatus,name='CeleryStatus'), ] ================================================ FILE: servermanager/views.py ================================================ #coding:utf8 from django.shortcuts import render from django.http import HttpResponse from django.contrib.auth.decorators import login_required from servermanager.models import * from webapp.models import * from webapp.Extends import PageList from webapp.tasks import SaltGrains,UpdateServerInfo from django.db.models import Q from django.contrib.auth.decorators import permission_required import json @login_required() def HostLists(request): return render(request,'servermanager/hosts.html') @login_required() @permission_required('servermanager.cmdb_assets_view',raise_exception=True) def AssetsLists(request,page): usersession=request.session.get('user_id') if request.method == 'POST': searchdata = request.POST.get('search') #分页代码 (page,start,end,per_item)=PageList.PageCount(page) count = Assets.objects.filter(Q(host_name__contains=searchdata) | Q(device_number__contains=searchdata)).count() result = Assets.objects.filter(Q(host_name__contains=searchdata) | Q(device_number__contains=searchdata)).order_by('-id')[start:end] url = "/server/assets" if count%per_item == 0: all_pages_count = count/per_item else: all_pages_count = count/per_item+1 page=PageList.Page(page, url, all_pages_count) ret = {'Assetsdata': result, 'count': count, 'page': page, 'usersession':usersession} return render(request,'servermanager/assets_list.html', ret) else: AssetsData=Assets.objects.all() for asset in AssetsData: if Server.objects.filter(Assets=asset): asset.status = 1 asset.save() else: asset.status = 2 asset.save() #分页代码 (page,start,end,per_item)=PageList.PageCount(page) count = Assets.objects.all().count() result = Assets.objects.all().order_by('-id')[start:end] url = "/server/assets" if count%per_item == 0: all_pages_count = count/per_item else: all_pages_count = count/per_item+1 page=PageList.Page(page, url, all_pages_count) ret = {'Assetsdata': result, 'count': count, 'page': page, 'usersession':usersession} return render(request,'servermanager/assets_list.html', ret) @login_required() def AssetsDetail(request,id): usersession=request.session.get('user_id') if request.method == 'GET': result = Assets.objects.get(id=id) ret={'Assetsdata':result,'usersession':usersession} return render(request,'servermanager/assetsdetail.html',ret) @login_required() @permission_required('servermanager.cmdb_server_view',raise_exception=True) def ServerList(request,page): usersession=request.session.get('user_id') if request.method == 'POST': searchdata = request.POST.get('search') #分页代码 (page,start,end,per_item)=PageList.PageCount(page) count = Server.objects.filter(Q(Assets__host_name__contains=searchdata) | Q(hostname__contains=searchdata) | Q(sn__contains=searchdata)).count() result = Server.objects.filter(Q(Assets__host_name__contains=searchdata) | Q(hostname__contains=searchdata) | Q(sn__contains=searchdata)).order_by('-id')[start:end] url = "/server/servers" if count%per_item == 0: all_pages_count = count/per_item else: all_pages_count = count/per_item+1 page=PageList.Page(page, url, all_pages_count) ret = {'Serverdata': result, 'count': count, 'page': page, 'usersession':usersession} return render(request,'servermanager/servers_list.html', ret) else: #分页代码 (page,start,end,per_item)=PageList.PageCount(page) count = Server.objects.all().count() result = Server.objects.all().order_by('-id')[start:end] url = "/server/servers" if count%per_item == 0: all_pages_count = count/per_item else: all_pages_count = count/per_item+1 page=PageList.Page(page, url, all_pages_count) ret = {'Serverdata': result, 'count': count, 'page': page, 'usersession':usersession} return render(request, 'servermanager/servers_list.html', ret) @login_required() def ServerDetail(request,id): usersession=request.session.get('user_id') if request.method == 'GET': ServerData = Server.objects.get(id=id) Diskall=ServerData.disk.all() colors = ["#5fbeaa","#ebeff2","#36404a","#5fbeaa","#ebeff2","#5d9cec"] Diskhtml=[] for i in range(Diskall.count()): disk={} disk['label']=Diskall[i].name.encode() #传给前端去掉unicode disk['value']=Diskall[i].capacity.encode() disk['color']=colors[i] disk['highlight']=colors[i] Diskhtml.append(disk) ret = {'usersession':usersession,'ServerData':ServerData,'Diskhtml':json.dumps(Diskhtml)} return render(request,'servermanager/servers_detail.html',ret) @login_required() @permission_required('servermanager.delete_assets',raise_exception=True) def DeleteServer(request,id): username = request.session.get('user_name') if request.method == 'GET': ServerData = Server.objects.get(id=id) ServerData.delete() msg=u'删除服务器信息 %s' %ServerData.hostname Operation.objects.create(Opuser=username,Opaction=msg) return HttpResponse(u'删除主机成功') @login_required() @permission_required('servermanager.delete_assets',raise_exception=True) def DeleteAsset(request,id): username = request.session.get('user_name') if request.method == 'GET': selectid=Assets.objects.filter(id=id) if Server.objects.filter(Assets=selectid): msg={'msgerror':u'请删除所关联的服务器!!'} return HttpResponse(json.dumps(msg)) else: AssetData = Assets.objects.get(id=id) AssetData.delete() msg=u'删除资产信息 %s' %AssetData.host_name Operation.objects.create(Opuser=username,Opaction=msg) msg={'msginfo':u'OK,资产信息删除成功!!!!'} return HttpResponse(json.dumps(msg)) @login_required() @permission_required('servermanager.change_assets',raise_exception=True) def ChangeAsset(request,id): usersession=request.session.get('user_id') username = request.session.get('user_name') if request.method == 'POST': PostData=request.POST AssetDsata=Assets.objects.get(id=id) AssetDsata.status = PostData['status'] AssetDsata.Warranty =PostData['Warranty'] AssetDsata.device_number = PostData['device_number'] device_type=DeviceType.objects.get(id=PostData['device_type']) AssetDsata.device_type = device_type AssetDsata.host_name = PostData['host_name'] idc = IDC.objects.get(id=PostData['idc']) AssetDsata.IDC = idc business = Business.objects.get(id=PostData['business']) AssetDsata.business = business AssetDsata.buy_time = PostData['buytime'] AssetDsata.price = PostData['price'] admin = Suser.objects.get(id=PostData['admin']) AssetDsata.admin = admin AssetDsata.suse_time = PostData['start'] AssetDsata.euse_time = PostData['end'] provider = Provider.objects.get(id=PostData['provider']) AssetDsata.provider = provider AssetDsata.description = PostData['summernote'] AssetDsata.save() Operation.objects.create(Opuser=username,Opaction=u'修改资产信息') msg={'msginfo':u'恭喜您,资产修改成功!!!'} return HttpResponse(json.dumps(msg)) else: AssetsData=Assets.objects.get(id=id) IdcData = IDC.objects.all() BusinessData = Business.objects.all() DeviceTypeData = DeviceType.objects.all() AdminUser = Suser.objects.all() ProviderData = Provider.objects.all() ret = { 'usersession': usersession, 'AssetsData': AssetsData, 'IdcData': IdcData, 'BusinessData': BusinessData, 'DeviceTypeData': DeviceTypeData, 'AdminUser': AdminUser, 'ProviderData':ProviderData, } return render(request,'servermanager/assetschange.html',ret) @login_required() @permission_required('servermanager.change_assets',raise_exception=True) def ChangeServer(request,id): usersession=request.session.get('user_id') username = request.session.get('user_name') if request.method == 'POST': software=request.POST.getlist('software') disk=request.POST.getlist('disk') nic=request.POST.getlist('nic') Assetsid=request.POST['Assets'] AssetsInfo = Assets.objects.get(id=Assetsid) ServerData=Server.objects.get(id=id) ServerData.Assets=AssetsInfo ServerData.mem = request.POST['mem'] ServerData.swap=request.POST['swap'] ServerData.platform = request.POST['platform'] ServerData.system = request.POST['system'] ServerData.version = request.POST['version'] ServerData.Firm = request.POST['firm'] ServerData.saltid = request.POST['saltid'] ServerData.hostname = request.POST['hostname'] ServerData.sn = request.POST['sn'] CPU = request.POST['CPU'] CPU = Cpu.objects.get(id=CPU) ServerData.cpu=CPU ServerData.cpu_count = request.POST['cpu_count'] ServerData.cpu_core_count = request.POST['cpu_core_count'] ServerData.raid = request.POST['raid'] ServerData.addtype = request.POST['addtype'] for n in ServerData.nic.all(): group_set = NIC.objects.get(id=n.id) ServerData.nic.remove(group_set) for d in ServerData.disk.all(): group_set = Disk.objects.get(id=d.id) ServerData.disk.remove(group_set) for s in ServerData.software.all(): group_set = Software.objects.get(id=s.id) ServerData.software.remove(group_set) for n in nic: print n group_set = NIC.objects.get(id=n) ServerData.nic.add(group_set) for d in disk: group_set = Disk.objects.get(id=d) ServerData.disk.add(group_set) for s in software: group_set = Software.objects.get(id=s) ServerData.software.add(group_set) ServerData.save() Operation.objects.create(Opuser=username,Opaction=u'修改服务器信息') return HttpResponse(u'Server 修改成功!!') else: listdata=[] [listdata.append(int(i.Assets.id)) for i in Server.objects.all()] hostid=Server.objects.get(id=id) listdata.remove(hostid.Assets_id) AssetsData=Assets.objects.exclude(id__in=listdata) CpuData = Cpu.objects.all() SoftwareData = Software.objects.all() DiskData = Disk.objects.all() NicData = NIC.objects.all() ServerData = Server.objects.get(id=id) ret={'usersession':usersession, 'AssetsData':AssetsData, 'ServerData':ServerData, 'SoftwareData':SoftwareData, 'DiskData':DiskData, 'NicData':NicData, 'CpuData':CpuData} return render(request,'servermanager/servers_change.html',ret) @login_required() def UpdateServer(request,id): username = request.session.get('user_name') if request.method == 'GET': a=UpdateServerInfo.apply_async((str(id),)) msg={'celeryId':a.id} Operation.objects.create(Opuser=username,Opaction=u'Salt更新服务器信息 服务器 %s' %id) return HttpResponse(json.dumps(msg)) @login_required() def CeleryStatus(request,celeryid): if request.method == 'GET': task=UpdateServerInfo.AsyncResult(celeryid) if task.state == 'PENDING': response = { 'state': task.state, 'status': 'Pending...' } elif task.state != 'FAILURE': response = { 'state': task.state, 'status': task.status, } if 'result' in task.info: response['result'] = task.info['result'] else: response = { 'state': task.state, 'current': 1, 'total': 1, 'status': str(task.info), # this is the exception raised } return HttpResponse(json.dumps(response)) ================================================ FILE: static/assets/css/_variables.css ================================================ /* Template Name: Moltran Dashboard Author: CoderThemes Email: coderthemes@gmail.com File: Variables.less */ ================================================ FILE: static/assets/css/bootstrap-theme.css ================================================ /*! * Bootstrap v3.3.5 (http://getbootstrap.com) * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */ .btn-default, .btn-primary, .btn-success, .btn-info, .btn-warning, .btn-danger { text-shadow: 0 -1px 0 rgba(0, 0, 0, .2); -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); } .btn-default:active, .btn-primary:active, .btn-success:active, .btn-info:active, .btn-warning:active, .btn-danger:active, .btn-default.active, .btn-primary.active, .btn-success.active, .btn-info.active, .btn-warning.active, .btn-danger.active { -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); } .btn-default.disabled, .btn-primary.disabled, .btn-success.disabled, .btn-info.disabled, .btn-warning.disabled, .btn-danger.disabled, .btn-default[disabled], .btn-primary[disabled], .btn-success[disabled], .btn-info[disabled], .btn-warning[disabled], .btn-danger[disabled], fieldset[disabled] .btn-default, fieldset[disabled] .btn-primary, fieldset[disabled] .btn-success, fieldset[disabled] .btn-info, fieldset[disabled] .btn-warning, fieldset[disabled] .btn-danger { -webkit-box-shadow: none; box-shadow: none; } .btn-default .badge, .btn-primary .badge, .btn-success .badge, .btn-info .badge, .btn-warning .badge, .btn-danger .badge { text-shadow: none; } .btn:active, .btn.active { background-image: none; } .btn-default { text-shadow: 0 1px 0 #fff; background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%); background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0)); background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-color: #dbdbdb; border-color: #ccc; } .btn-default:hover, .btn-default:focus { background-color: #e0e0e0; background-position: 0 -15px; } .btn-default:active, .btn-default.active { background-color: #e0e0e0; border-color: #dbdbdb; } .btn-default.disabled, .btn-default[disabled], fieldset[disabled] .btn-default, .btn-default.disabled:hover, .btn-default[disabled]:hover, fieldset[disabled] .btn-default:hover, .btn-default.disabled:focus, .btn-default[disabled]:focus, fieldset[disabled] .btn-default:focus, .btn-default.disabled.focus, .btn-default[disabled].focus, fieldset[disabled] .btn-default.focus, .btn-default.disabled:active, .btn-default[disabled]:active, fieldset[disabled] .btn-default:active, .btn-default.disabled.active, .btn-default[disabled].active, fieldset[disabled] .btn-default.active { background-color: #e0e0e0; background-image: none; } .btn-primary { background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%); background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88)); background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-color: #245580; } .btn-primary:hover, .btn-primary:focus { background-color: #265a88; background-position: 0 -15px; } .btn-primary:active, .btn-primary.active { background-color: #265a88; border-color: #245580; } .btn-primary.disabled, .btn-primary[disabled], fieldset[disabled] .btn-primary, .btn-primary.disabled:hover, .btn-primary[disabled]:hover, fieldset[disabled] .btn-primary:hover, .btn-primary.disabled:focus, .btn-primary[disabled]:focus, fieldset[disabled] .btn-primary:focus, .btn-primary.disabled.focus, .btn-primary[disabled].focus, fieldset[disabled] .btn-primary.focus, .btn-primary.disabled:active, .btn-primary[disabled]:active, fieldset[disabled] .btn-primary:active, .btn-primary.disabled.active, .btn-primary[disabled].active, fieldset[disabled] .btn-primary.active { background-color: #265a88; background-image: none; } .btn-success { background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641)); background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-color: #3e8f3e; } .btn-success:hover, .btn-success:focus { background-color: #419641; background-position: 0 -15px; } .btn-success:active, .btn-success.active { background-color: #419641; border-color: #3e8f3e; } .btn-success.disabled, .btn-success[disabled], fieldset[disabled] .btn-success, .btn-success.disabled:hover, .btn-success[disabled]:hover, fieldset[disabled] .btn-success:hover, .btn-success.disabled:focus, .btn-success[disabled]:focus, fieldset[disabled] .btn-success:focus, .btn-success.disabled.focus, .btn-success[disabled].focus, fieldset[disabled] .btn-success.focus, .btn-success.disabled:active, .btn-success[disabled]:active, fieldset[disabled] .btn-success:active, .btn-success.disabled.active, .btn-success[disabled].active, fieldset[disabled] .btn-success.active { background-color: #419641; background-image: none; } .btn-info { background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2)); background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-color: #28a4c9; } .btn-info:hover, .btn-info:focus { background-color: #2aabd2; background-position: 0 -15px; } .btn-info:active, .btn-info.active { background-color: #2aabd2; border-color: #28a4c9; } .btn-info.disabled, .btn-info[disabled], fieldset[disabled] .btn-info, .btn-info.disabled:hover, .btn-info[disabled]:hover, fieldset[disabled] .btn-info:hover, .btn-info.disabled:focus, .btn-info[disabled]:focus, fieldset[disabled] .btn-info:focus, .btn-info.disabled.focus, .btn-info[disabled].focus, fieldset[disabled] .btn-info.focus, .btn-info.disabled:active, .btn-info[disabled]:active, fieldset[disabled] .btn-info:active, .btn-info.disabled.active, .btn-info[disabled].active, fieldset[disabled] .btn-info.active { background-color: #2aabd2; background-image: none; } .btn-warning { background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316)); background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-color: #e38d13; } .btn-warning:hover, .btn-warning:focus { background-color: #eb9316; background-position: 0 -15px; } .btn-warning:active, .btn-warning.active { background-color: #eb9316; border-color: #e38d13; } .btn-warning.disabled, .btn-warning[disabled], fieldset[disabled] .btn-warning, .btn-warning.disabled:hover, .btn-warning[disabled]:hover, fieldset[disabled] .btn-warning:hover, .btn-warning.disabled:focus, .btn-warning[disabled]:focus, fieldset[disabled] .btn-warning:focus, .btn-warning.disabled.focus, .btn-warning[disabled].focus, fieldset[disabled] .btn-warning.focus, .btn-warning.disabled:active, .btn-warning[disabled]:active, fieldset[disabled] .btn-warning:active, .btn-warning.disabled.active, .btn-warning[disabled].active, fieldset[disabled] .btn-warning.active { background-color: #eb9316; background-image: none; } .btn-danger { background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a)); background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-color: #b92c28; } .btn-danger:hover, .btn-danger:focus { background-color: #c12e2a; background-position: 0 -15px; } .btn-danger:active, .btn-danger.active { background-color: #c12e2a; border-color: #b92c28; } .btn-danger.disabled, .btn-danger[disabled], fieldset[disabled] .btn-danger, .btn-danger.disabled:hover, .btn-danger[disabled]:hover, fieldset[disabled] .btn-danger:hover, .btn-danger.disabled:focus, .btn-danger[disabled]:focus, fieldset[disabled] .btn-danger:focus, .btn-danger.disabled.focus, .btn-danger[disabled].focus, fieldset[disabled] .btn-danger.focus, .btn-danger.disabled:active, .btn-danger[disabled]:active, fieldset[disabled] .btn-danger:active, .btn-danger.disabled.active, .btn-danger[disabled].active, fieldset[disabled] .btn-danger.active { background-color: #c12e2a; background-image: none; } .thumbnail, .img-thumbnail { -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); box-shadow: 0 1px 2px rgba(0, 0, 0, .075); } .dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { background-color: #e8e8e8; background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); background-repeat: repeat-x; } .dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { background-color: #2e6da4; background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); background-repeat: repeat-x; } .navbar-default { background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%); background-image: -o-linear-gradient(top, #fff 0%, #f8f8f8 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8)); background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-radius: 4px; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); } .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .active > a { background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2)); background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0); background-repeat: repeat-x; -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); } .navbar-brand, .navbar-nav > li > a { text-shadow: 0 1px 0 rgba(255, 255, 255, .25); } .navbar-inverse { background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%); background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222)); background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-radius: 4px; } .navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .active > a { background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%); background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f)); background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0); background-repeat: repeat-x; -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); } .navbar-inverse .navbar-brand, .navbar-inverse .navbar-nav > li > a { text-shadow: 0 -1px 0 rgba(0, 0, 0, .25); } .navbar-static-top, .navbar-fixed-top, .navbar-fixed-bottom { border-radius: 0; } @media (max-width: 767px) { .navbar .navbar-nav .open .dropdown-menu > .active > a, .navbar .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar .navbar-nav .open .dropdown-menu > .active > a:focus { color: #fff; background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); background-repeat: repeat-x; } } .alert { text-shadow: 0 1px 0 rgba(255, 255, 255, .2); -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); } .alert-success { background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc)); background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); background-repeat: repeat-x; border-color: #b2dba1; } .alert-info { background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0)); background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); background-repeat: repeat-x; border-color: #9acfea; } .alert-warning { background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0)); background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); background-repeat: repeat-x; border-color: #f5e79e; } .alert-danger { background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3)); background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); background-repeat: repeat-x; border-color: #dca7a7; } .progress { background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5)); background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); background-repeat: repeat-x; } .progress-bar { background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%); background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090)); background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0); background-repeat: repeat-x; } .progress-bar-success { background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44)); background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); background-repeat: repeat-x; } .progress-bar-info { background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5)); background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); background-repeat: repeat-x; } .progress-bar-warning { background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f)); background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); background-repeat: repeat-x; } .progress-bar-danger { background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c)); background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); background-repeat: repeat-x; } .progress-bar-striped { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); } .list-group { border-radius: 4px; -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); box-shadow: 0 1px 2px rgba(0, 0, 0, .075); } .list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus { text-shadow: 0 -1px 0 #286090; background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%); background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a)); background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0); background-repeat: repeat-x; border-color: #2b669a; } .list-group-item.active .badge, .list-group-item.active:hover .badge, .list-group-item.active:focus .badge { text-shadow: none; } .panel { -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05); box-shadow: 0 1px 2px rgba(0, 0, 0, .05); } .panel-default > .panel-heading { background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); background-repeat: repeat-x; } .panel-primary > .panel-heading { background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); background-repeat: repeat-x; } .panel-success > .panel-heading { background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6)); background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); background-repeat: repeat-x; } .panel-info > .panel-heading { background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3)); background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); background-repeat: repeat-x; } .panel-warning > .panel-heading { background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc)); background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); background-repeat: repeat-x; } .panel-danger > .panel-heading { background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc)); background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); background-repeat: repeat-x; } .well { background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5)); background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); background-repeat: repeat-x; border-color: #dcdcdc; -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); } /*# sourceMappingURL=bootstrap-theme.css.map */ ================================================ FILE: static/assets/css/bootstrap.css ================================================ /*! * Bootstrap v3.3.5 (http://getbootstrap.com) * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */ /*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ html { font-family: sans-serif; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; } body { margin: 0; } article, aside, details, figcaption, figure, footer, header, hgroup, main, menu, nav, section, summary { display: block; } audio, canvas, progress, video { display: inline-block; vertical-align: baseline; } audio:not([controls]) { display: none; height: 0; } [hidden], template { display: none; } a { background-color: transparent; } a:active, a:hover { outline: 0; } abbr[title] { border-bottom: 1px dotted; } b, strong { font-weight: bold; } dfn { font-style: italic; } h1 { margin: .67em 0; font-size: 2em; } mark { color: #000; background: #ff0; } small { font-size: 80%; } sub, sup { position: relative; font-size: 75%; line-height: 0; vertical-align: baseline; } sup { top: -.5em; } sub { bottom: -.25em; } img { border: 0; } svg:not(:root) { overflow: hidden; } figure { margin: 1em 40px; } hr { height: 0; -webkit-box-sizing: content-box; -moz-box-sizing: content-box; box-sizing: content-box; } pre { overflow: auto; } code, kbd, pre, samp { font-family: monospace, monospace; font-size: 1em; } button, input, optgroup, select, textarea { margin: 0; font: inherit; color: inherit; } button { overflow: visible; } button, select { text-transform: none; } button, html input[type="button"], input[type="reset"], input[type="submit"] { -webkit-appearance: button; cursor: pointer; } button[disabled], html input[disabled] { cursor: default; } button::-moz-focus-inner, input::-moz-focus-inner { padding: 0; border: 0; } input { line-height: normal; } input[type="checkbox"], input[type="radio"] { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; padding: 0; } input[type="number"]::-webkit-inner-spin-button, input[type="number"]::-webkit-outer-spin-button { height: auto; } input[type="search"] { -webkit-box-sizing: content-box; -moz-box-sizing: content-box; box-sizing: content-box; -webkit-appearance: textfield; } input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; } fieldset { padding: .35em .625em .75em; margin: 0 2px; border: 1px solid #c0c0c0; } legend { padding: 0; border: 0; } textarea { overflow: auto; } optgroup { font-weight: bold; } table { border-spacing: 0; border-collapse: collapse; } td, th { padding: 0; } /*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ @media print { *, *:before, *:after { color: #000 !important; text-shadow: none !important; background: transparent !important; -webkit-box-shadow: none !important; box-shadow: none !important; } a, a:visited { text-decoration: underline; } a[href]:after { content: " (" attr(href) ")"; } abbr[title]:after { content: " (" attr(title) ")"; } a[href^="#"]:after, a[href^="javascript:"]:after { content: ""; } pre, blockquote { border: 1px solid #999; page-break-inside: avoid; } thead { display: table-header-group; } tr, img { page-break-inside: avoid; } img { max-width: 100% !important; } p, h2, h3 { orphans: 3; widows: 3; } h2, h3 { page-break-after: avoid; } .navbar { display: none; } .btn > .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px solid #000; } .table { border-collapse: collapse !important; } .table td, .table th { background-color: #fff !important; } .table-bordered th, .table-bordered td { border: 1px solid #ddd !important; } } @font-face { font-family: 'Glyphicons Halflings'; src: url('../fonts/glyphicons-halflings-regular.eot'); src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); } .glyphicon { position: relative; top: 1px; display: inline-block; font-family: 'Glyphicons Halflings'; font-style: normal; font-weight: normal; line-height: 1; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .glyphicon-asterisk:before { content: "\2a"; } .glyphicon-plus:before { content: "\2b"; } .glyphicon-euro:before, .glyphicon-eur:before { content: "\20ac"; } .glyphicon-minus:before { content: "\2212"; } .glyphicon-cloud:before { content: "\2601"; } .glyphicon-envelope:before { content: "\2709"; } .glyphicon-pencil:before { content: "\270f"; } .glyphicon-glass:before { content: "\e001"; } .glyphicon-music:before { content: "\e002"; } .glyphicon-search:before { content: "\e003"; } .glyphicon-heart:before { content: "\e005"; } .glyphicon-star:before { content: "\e006"; } .glyphicon-star-empty:before { content: "\e007"; } .glyphicon-user:before { content: "\e008"; } .glyphicon-film:before { content: "\e009"; } .glyphicon-th-large:before { content: "\e010"; } .glyphicon-th:before { content: "\e011"; } .glyphicon-th-list:before { content: "\e012"; } .glyphicon-ok:before { content: "\e013"; } .glyphicon-remove:before { content: "\e014"; } .glyphicon-zoom-in:before { content: "\e015"; } .glyphicon-zoom-out:before { content: "\e016"; } .glyphicon-off:before { content: "\e017"; } .glyphicon-signal:before { content: "\e018"; } .glyphicon-cog:before { content: "\e019"; } .glyphicon-trash:before { content: "\e020"; } .glyphicon-home:before { content: "\e021"; } .glyphicon-file:before { content: "\e022"; } .glyphicon-time:before { content: "\e023"; } .glyphicon-road:before { content: "\e024"; } .glyphicon-download-alt:before { content: "\e025"; } .glyphicon-download:before { content: "\e026"; } .glyphicon-upload:before { content: "\e027"; } .glyphicon-inbox:before { content: "\e028"; } .glyphicon-play-circle:before { content: "\e029"; } .glyphicon-repeat:before { content: "\e030"; } .glyphicon-refresh:before { content: "\e031"; } .glyphicon-list-alt:before { content: "\e032"; } .glyphicon-lock:before { content: "\e033"; } .glyphicon-flag:before { content: "\e034"; } .glyphicon-headphones:before { content: "\e035"; } .glyphicon-volume-off:before { content: "\e036"; } .glyphicon-volume-down:before { content: "\e037"; } .glyphicon-volume-up:before { content: "\e038"; } .glyphicon-qrcode:before { content: "\e039"; } .glyphicon-barcode:before { content: "\e040"; } .glyphicon-tag:before { content: "\e041"; } .glyphicon-tags:before { content: "\e042"; } .glyphicon-book:before { content: "\e043"; } .glyphicon-bookmark:before { content: "\e044"; } .glyphicon-print:before { content: "\e045"; } .glyphicon-camera:before { content: "\e046"; } .glyphicon-font:before { content: "\e047"; } .glyphicon-bold:before { content: "\e048"; } .glyphicon-italic:before { content: "\e049"; } .glyphicon-text-height:before { content: "\e050"; } .glyphicon-text-width:before { content: "\e051"; } .glyphicon-align-left:before { content: "\e052"; } .glyphicon-align-center:before { content: "\e053"; } .glyphicon-align-right:before { content: "\e054"; } .glyphicon-align-justify:before { content: "\e055"; } .glyphicon-list:before { content: "\e056"; } .glyphicon-indent-left:before { content: "\e057"; } .glyphicon-indent-right:before { content: "\e058"; } .glyphicon-facetime-video:before { content: "\e059"; } .glyphicon-picture:before { content: "\e060"; } .glyphicon-map-marker:before { content: "\e062"; } .glyphicon-adjust:before { content: "\e063"; } .glyphicon-tint:before { content: "\e064"; } .glyphicon-edit:before { content: "\e065"; } .glyphicon-share:before { content: "\e066"; } .glyphicon-check:before { content: "\e067"; } .glyphicon-move:before { content: "\e068"; } .glyphicon-step-backward:before { content: "\e069"; } .glyphicon-fast-backward:before { content: "\e070"; } .glyphicon-backward:before { content: "\e071"; } .glyphicon-play:before { content: "\e072"; } .glyphicon-pause:before { content: "\e073"; } .glyphicon-stop:before { content: "\e074"; } .glyphicon-forward:before { content: "\e075"; } .glyphicon-fast-forward:before { content: "\e076"; } .glyphicon-step-forward:before { content: "\e077"; } .glyphicon-eject:before { content: "\e078"; } .glyphicon-chevron-left:before { content: "\e079"; } .glyphicon-chevron-right:before { content: "\e080"; } .glyphicon-plus-sign:before { content: "\e081"; } .glyphicon-minus-sign:before { content: "\e082"; } .glyphicon-remove-sign:before { content: "\e083"; } .glyphicon-ok-sign:before { content: "\e084"; } .glyphicon-question-sign:before { content: "\e085"; } .glyphicon-info-sign:before { content: "\e086"; } .glyphicon-screenshot:before { content: "\e087"; } .glyphicon-remove-circle:before { content: "\e088"; } .glyphicon-ok-circle:before { content: "\e089"; } .glyphicon-ban-circle:before { content: "\e090"; } .glyphicon-arrow-left:before { content: "\e091"; } .glyphicon-arrow-right:before { content: "\e092"; } .glyphicon-arrow-up:before { content: "\e093"; } .glyphicon-arrow-down:before { content: "\e094"; } .glyphicon-share-alt:before { content: "\e095"; } .glyphicon-resize-full:before { content: "\e096"; } .glyphicon-resize-small:before { content: "\e097"; } .glyphicon-exclamation-sign:before { content: "\e101"; } .glyphicon-gift:before { content: "\e102"; } .glyphicon-leaf:before { content: "\e103"; } .glyphicon-fire:before { content: "\e104"; } .glyphicon-eye-open:before { content: "\e105"; } .glyphicon-eye-close:before { content: "\e106"; } .glyphicon-warning-sign:before { content: "\e107"; } .glyphicon-plane:before { content: "\e108"; } .glyphicon-calendar:before { content: "\e109"; } .glyphicon-random:before { content: "\e110"; } .glyphicon-comment:before { content: "\e111"; } .glyphicon-magnet:before { content: "\e112"; } .glyphicon-chevron-up:before { content: "\e113"; } .glyphicon-chevron-down:before { content: "\e114"; } .glyphicon-retweet:before { content: "\e115"; } .glyphicon-shopping-cart:before { content: "\e116"; } .glyphicon-folder-close:before { content: "\e117"; } .glyphicon-folder-open:before { content: "\e118"; } .glyphicon-resize-vertical:before { content: "\e119"; } .glyphicon-resize-horizontal:before { content: "\e120"; } .glyphicon-hdd:before { content: "\e121"; } .glyphicon-bullhorn:before { content: "\e122"; } .glyphicon-bell:before { content: "\e123"; } .glyphicon-certificate:before { content: "\e124"; } .glyphicon-thumbs-up:before { content: "\e125"; } .glyphicon-thumbs-down:before { content: "\e126"; } .glyphicon-hand-right:before { content: "\e127"; } .glyphicon-hand-left:before { content: "\e128"; } .glyphicon-hand-up:before { content: "\e129"; } .glyphicon-hand-down:before { content: "\e130"; } .glyphicon-circle-arrow-right:before { content: "\e131"; } .glyphicon-circle-arrow-left:before { content: "\e132"; } .glyphicon-circle-arrow-up:before { content: "\e133"; } .glyphicon-circle-arrow-down:before { content: "\e134"; } .glyphicon-globe:before { content: "\e135"; } .glyphicon-wrench:before { content: "\e136"; } .glyphicon-tasks:before { content: "\e137"; } .glyphicon-filter:before { content: "\e138"; } .glyphicon-briefcase:before { content: "\e139"; } .glyphicon-fullscreen:before { content: "\e140"; } .glyphicon-dashboard:before { content: "\e141"; } .glyphicon-paperclip:before { content: "\e142"; } .glyphicon-heart-empty:before { content: "\e143"; } .glyphicon-link:before { content: "\e144"; } .glyphicon-phone:before { content: "\e145"; } .glyphicon-pushpin:before { content: "\e146"; } .glyphicon-usd:before { content: "\e148"; } .glyphicon-gbp:before { content: "\e149"; } .glyphicon-sort:before { content: "\e150"; } .glyphicon-sort-by-alphabet:before { content: "\e151"; } .glyphicon-sort-by-alphabet-alt:before { content: "\e152"; } .glyphicon-sort-by-order:before { content: "\e153"; } .glyphicon-sort-by-order-alt:before { content: "\e154"; } .glyphicon-sort-by-attributes:before { content: "\e155"; } .glyphicon-sort-by-attributes-alt:before { content: "\e156"; } .glyphicon-unchecked:before { content: "\e157"; } .glyphicon-expand:before { content: "\e158"; } .glyphicon-collapse-down:before { content: "\e159"; } .glyphicon-collapse-up:before { content: "\e160"; } .glyphicon-log-in:before { content: "\e161"; } .glyphicon-flash:before { content: "\e162"; } .glyphicon-log-out:before { content: "\e163"; } .glyphicon-new-window:before { content: "\e164"; } .glyphicon-record:before { content: "\e165"; } .glyphicon-save:before { content: "\e166"; } .glyphicon-open:before { content: "\e167"; } .glyphicon-saved:before { content: "\e168"; } .glyphicon-import:before { content: "\e169"; } .glyphicon-export:before { content: "\e170"; } .glyphicon-send:before { content: "\e171"; } .glyphicon-floppy-disk:before { content: "\e172"; } .glyphicon-floppy-saved:before { content: "\e173"; } .glyphicon-floppy-remove:before { content: "\e174"; } .glyphicon-floppy-save:before { content: "\e175"; } .glyphicon-floppy-open:before { content: "\e176"; } .glyphicon-credit-card:before { content: "\e177"; } .glyphicon-transfer:before { content: "\e178"; } .glyphicon-cutlery:before { content: "\e179"; } .glyphicon-header:before { content: "\e180"; } .glyphicon-compressed:before { content: "\e181"; } .glyphicon-earphone:before { content: "\e182"; } .glyphicon-phone-alt:before { content: "\e183"; } .glyphicon-tower:before { content: "\e184"; } .glyphicon-stats:before { content: "\e185"; } .glyphicon-sd-video:before { content: "\e186"; } .glyphicon-hd-video:before { content: "\e187"; } .glyphicon-subtitles:before { content: "\e188"; } .glyphicon-sound-stereo:before { content: "\e189"; } .glyphicon-sound-dolby:before { content: "\e190"; } .glyphicon-sound-5-1:before { content: "\e191"; } .glyphicon-sound-6-1:before { content: "\e192"; } .glyphicon-sound-7-1:before { content: "\e193"; } .glyphicon-copyright-mark:before { content: "\e194"; } .glyphicon-registration-mark:before { content: "\e195"; } .glyphicon-cloud-download:before { content: "\e197"; } .glyphicon-cloud-upload:before { content: "\e198"; } .glyphicon-tree-conifer:before { content: "\e199"; } .glyphicon-tree-deciduous:before { content: "\e200"; } .glyphicon-cd:before { content: "\e201"; } .glyphicon-save-file:before { content: "\e202"; } .glyphicon-open-file:before { content: "\e203"; } .glyphicon-level-up:before { content: "\e204"; } .glyphicon-copy:before { content: "\e205"; } .glyphicon-paste:before { content: "\e206"; } .glyphicon-alert:before { content: "\e209"; } .glyphicon-equalizer:before { content: "\e210"; } .glyphicon-king:before { content: "\e211"; } .glyphicon-queen:before { content: "\e212"; } .glyphicon-pawn:before { content: "\e213"; } .glyphicon-bishop:before { content: "\e214"; } .glyphicon-knight:before { content: "\e215"; } .glyphicon-baby-formula:before { content: "\e216"; } .glyphicon-tent:before { content: "\26fa"; } .glyphicon-blackboard:before { content: "\e218"; } .glyphicon-bed:before { content: "\e219"; } .glyphicon-apple:before { content: "\f8ff"; } .glyphicon-erase:before { content: "\e221"; } .glyphicon-hourglass:before { content: "\231b"; } .glyphicon-lamp:before { content: "\e223"; } .glyphicon-duplicate:before { content: "\e224"; } .glyphicon-piggy-bank:before { content: "\e225"; } .glyphicon-scissors:before { content: "\e226"; } .glyphicon-bitcoin:before { content: "\e227"; } .glyphicon-btc:before { content: "\e227"; } .glyphicon-xbt:before { content: "\e227"; } .glyphicon-yen:before { content: "\00a5"; } .glyphicon-jpy:before { content: "\00a5"; } .glyphicon-ruble:before { content: "\20bd"; } .glyphicon-rub:before { content: "\20bd"; } .glyphicon-scale:before { content: "\e230"; } .glyphicon-ice-lolly:before { content: "\e231"; } .glyphicon-ice-lolly-tasted:before { content: "\e232"; } .glyphicon-education:before { content: "\e233"; } .glyphicon-option-horizontal:before { content: "\e234"; } .glyphicon-option-vertical:before { content: "\e235"; } .glyphicon-menu-hamburger:before { content: "\e236"; } .glyphicon-modal-window:before { content: "\e237"; } .glyphicon-oil:before { content: "\e238"; } .glyphicon-grain:before { content: "\e239"; } .glyphicon-sunglasses:before { content: "\e240"; } .glyphicon-text-size:before { content: "\e241"; } .glyphicon-text-color:before { content: "\e242"; } .glyphicon-text-background:before { content: "\e243"; } .glyphicon-object-align-top:before { content: "\e244"; } .glyphicon-object-align-bottom:before { content: "\e245"; } .glyphicon-object-align-horizontal:before { content: "\e246"; } .glyphicon-object-align-left:before { content: "\e247"; } .glyphicon-object-align-vertical:before { content: "\e248"; } .glyphicon-object-align-right:before { content: "\e249"; } .glyphicon-triangle-right:before { content: "\e250"; } .glyphicon-triangle-left:before { content: "\e251"; } .glyphicon-triangle-bottom:before { content: "\e252"; } .glyphicon-triangle-top:before { content: "\e253"; } .glyphicon-console:before { content: "\e254"; } .glyphicon-superscript:before { content: "\e255"; } .glyphicon-subscript:before { content: "\e256"; } .glyphicon-menu-left:before { content: "\e257"; } .glyphicon-menu-right:before { content: "\e258"; } .glyphicon-menu-down:before { content: "\e259"; } .glyphicon-menu-up:before { content: "\e260"; } * { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } *:before, *:after { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } html { font-size: 10px; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } body { font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; line-height: 1.42857143; color: #333; background-color: #fff; } input, button, select, textarea { font-family: inherit; font-size: inherit; line-height: inherit; } a { color: #337ab7; text-decoration: none; } a:hover, a:focus { color: #23527c; text-decoration: underline; } a:focus { outline: thin dotted; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } figure { margin: 0; } img { vertical-align: middle; } .img-responsive, .thumbnail > img, .thumbnail a > img, .carousel-inner > .item > img, .carousel-inner > .item > a > img { display: block; max-width: 100%; height: auto; } .img-rounded { border-radius: 6px; } .img-thumbnail { display: inline-block; max-width: 100%; height: auto; padding: 4px; line-height: 1.42857143; background-color: #fff; border: 1px solid #ddd; border-radius: 4px; -webkit-transition: all .2s ease-in-out; -o-transition: all .2s ease-in-out; transition: all .2s ease-in-out; } .img-circle { border-radius: 50%; } hr { margin-top: 20px; margin-bottom: 20px; border: 0; border-top: 1px solid #eee; } .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); border: 0; } .sr-only-focusable:active, .sr-only-focusable:focus { position: static; width: auto; height: auto; margin: 0; overflow: visible; clip: auto; } [role="button"] { cursor: pointer; } h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 { font-family: inherit; font-weight: 500; line-height: 1.1; color: inherit; } h1 small, h2 small, h3 small, h4 small, h5 small, h6 small, .h1 small, .h2 small, .h3 small, .h4 small, .h5 small, .h6 small, h1 .small, h2 .small, h3 .small, h4 .small, h5 .small, h6 .small, .h1 .small, .h2 .small, .h3 .small, .h4 .small, .h5 .small, .h6 .small { font-weight: normal; line-height: 1; color: #777; } h1, .h1, h2, .h2, h3, .h3 { margin-top: 20px; margin-bottom: 10px; } h1 small, .h1 small, h2 small, .h2 small, h3 small, .h3 small, h1 .small, .h1 .small, h2 .small, .h2 .small, h3 .small, .h3 .small { font-size: 65%; } h4, .h4, h5, .h5, h6, .h6 { margin-top: 10px; margin-bottom: 10px; } h4 small, .h4 small, h5 small, .h5 small, h6 small, .h6 small, h4 .small, .h4 .small, h5 .small, .h5 .small, h6 .small, .h6 .small { font-size: 75%; } h1, .h1 { font-size: 36px; } h2, .h2 { font-size: 30px; } h3, .h3 { font-size: 24px; } h4, .h4 { font-size: 18px; } h5, .h5 { font-size: 14px; } h6, .h6 { font-size: 12px; } p { margin: 0 0 10px; } .lead { margin-bottom: 20px; font-size: 16px; font-weight: 300; line-height: 1.4; } @media (min-width: 768px) { .lead { font-size: 21px; } } small, .small { font-size: 85%; } mark, .mark { padding: .2em; background-color: #fcf8e3; } .text-left { text-align: left; } .text-right { text-align: right; } .text-center { text-align: center; } .text-justify { text-align: justify; } .text-nowrap { white-space: nowrap; } .text-lowercase { text-transform: lowercase; } .text-uppercase { text-transform: uppercase; } .text-capitalize { text-transform: capitalize; } .text-muted { color: #777; } .text-primary { color: #337ab7; } a.text-primary:hover, a.text-primary:focus { color: #286090; } .text-success { color: #3c763d; } a.text-success:hover, a.text-success:focus { color: #2b542c; } .text-info { color: #31708f; } a.text-info:hover, a.text-info:focus { color: #245269; } .text-warning { color: #8a6d3b; } a.text-warning:hover, a.text-warning:focus { color: #66512c; } .text-danger { color: #a94442; } a.text-danger:hover, a.text-danger:focus { color: #843534; } .bg-primary { color: #fff; background-color: #337ab7; } a.bg-primary:hover, a.bg-primary:focus { background-color: #286090; } .bg-success { background-color: #dff0d8; } a.bg-success:hover, a.bg-success:focus { background-color: #c1e2b3; } .bg-info { background-color: #d9edf7; } a.bg-info:hover, a.bg-info:focus { background-color: #afd9ee; } .bg-warning { background-color: #fcf8e3; } a.bg-warning:hover, a.bg-warning:focus { background-color: #f7ecb5; } .bg-danger { background-color: #f2dede; } a.bg-danger:hover, a.bg-danger:focus { background-color: #e4b9b9; } .page-header { padding-bottom: 9px; margin: 40px 0 20px; border-bottom: 1px solid #eee; } ul, ol { margin-top: 0; margin-bottom: 10px; } ul ul, ol ul, ul ol, ol ol { margin-bottom: 0; } .list-unstyled { padding-left: 0; list-style: none; } .list-inline { padding-left: 0; margin-left: -5px; list-style: none; } .list-inline > li { display: inline-block; padding-right: 5px; padding-left: 5px; } dl { margin-top: 0; margin-bottom: 20px; } dt, dd { line-height: 1.42857143; } dt { font-weight: bold; } dd { margin-left: 0; } @media (min-width: 768px) { .dl-horizontal dt { float: left; width: 160px; overflow: hidden; clear: left; text-align: right; text-overflow: ellipsis; white-space: nowrap; } .dl-horizontal dd { margin-left: 180px; } } abbr[title], abbr[data-original-title] { cursor: help; border-bottom: 1px dotted #777; } .initialism { font-size: 90%; text-transform: uppercase; } blockquote { padding: 10px 20px; margin: 0 0 20px; font-size: 17.5px; border-left: 5px solid #eee; } blockquote p:last-child, blockquote ul:last-child, blockquote ol:last-child { margin-bottom: 0; } blockquote footer, blockquote small, blockquote .small { display: block; font-size: 80%; line-height: 1.42857143; color: #777; } blockquote footer:before, blockquote small:before, blockquote .small:before { content: '\2014 \00A0'; } .blockquote-reverse, blockquote.pull-right { padding-right: 15px; padding-left: 0; text-align: right; border-right: 5px solid #eee; border-left: 0; } .blockquote-reverse footer:before, blockquote.pull-right footer:before, .blockquote-reverse small:before, blockquote.pull-right small:before, .blockquote-reverse .small:before, blockquote.pull-right .small:before { content: ''; } .blockquote-reverse footer:after, blockquote.pull-right footer:after, .blockquote-reverse small:after, blockquote.pull-right small:after, .blockquote-reverse .small:after, blockquote.pull-right .small:after { content: '\00A0 \2014'; } address { margin-bottom: 20px; font-style: normal; line-height: 1.42857143; } code, kbd, pre, samp { font-family: Menlo, Monaco, Consolas, "Courier New", monospace; } code { padding: 2px 4px; font-size: 90%; color: #c7254e; background-color: #f9f2f4; border-radius: 4px; } kbd { padding: 2px 4px; font-size: 90%; color: #fff; background-color: #333; border-radius: 3px; -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); } kbd kbd { padding: 0; font-size: 100%; font-weight: bold; -webkit-box-shadow: none; box-shadow: none; } pre { display: block; padding: 9.5px; margin: 0 0 10px; font-size: 13px; line-height: 1.42857143; color: #333; word-break: break-all; word-wrap: break-word; background-color: #f5f5f5; border: 1px solid #ccc; border-radius: 4px; } pre code { padding: 0; font-size: inherit; color: inherit; white-space: pre-wrap; background-color: transparent; border-radius: 0; } .pre-scrollable { max-height: 340px; overflow-y: scroll; } .container { padding-right: 15px; padding-left: 15px; margin-right: auto; margin-left: auto; } @media (min-width: 768px) { .container { width: 750px; } } @media (min-width: 992px) { .container { width: 970px; } } @media (min-width: 1200px) { .container { width: 1170px; } } .container-fluid { padding-right: 15px; padding-left: 15px; margin-right: auto; margin-left: auto; } .row { margin-right: -15px; margin-left: -15px; } .col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { position: relative; min-height: 1px; padding-right: 15px; padding-left: 15px; } .col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { float: left; } .col-xs-12 { width: 100%; } .col-xs-11 { width: 91.66666667%; } .col-xs-10 { width: 83.33333333%; } .col-xs-9 { width: 75%; } .col-xs-8 { width: 66.66666667%; } .col-xs-7 { width: 58.33333333%; } .col-xs-6 { width: 50%; } .col-xs-5 { width: 41.66666667%; } .col-xs-4 { width: 33.33333333%; } .col-xs-3 { width: 25%; } .col-xs-2 { width: 16.66666667%; } .col-xs-1 { width: 8.33333333%; } .col-xs-pull-12 { right: 100%; } .col-xs-pull-11 { right: 91.66666667%; } .col-xs-pull-10 { right: 83.33333333%; } .col-xs-pull-9 { right: 75%; } .col-xs-pull-8 { right: 66.66666667%; } .col-xs-pull-7 { right: 58.33333333%; } .col-xs-pull-6 { right: 50%; } .col-xs-pull-5 { right: 41.66666667%; } .col-xs-pull-4 { right: 33.33333333%; } .col-xs-pull-3 { right: 25%; } .col-xs-pull-2 { right: 16.66666667%; } .col-xs-pull-1 { right: 8.33333333%; } .col-xs-pull-0 { right: auto; } .col-xs-push-12 { left: 100%; } .col-xs-push-11 { left: 91.66666667%; } .col-xs-push-10 { left: 83.33333333%; } .col-xs-push-9 { left: 75%; } .col-xs-push-8 { left: 66.66666667%; } .col-xs-push-7 { left: 58.33333333%; } .col-xs-push-6 { left: 50%; } .col-xs-push-5 { left: 41.66666667%; } .col-xs-push-4 { left: 33.33333333%; } .col-xs-push-3 { left: 25%; } .col-xs-push-2 { left: 16.66666667%; } .col-xs-push-1 { left: 8.33333333%; } .col-xs-push-0 { left: auto; } .col-xs-offset-12 { margin-left: 100%; } .col-xs-offset-11 { margin-left: 91.66666667%; } .col-xs-offset-10 { margin-left: 83.33333333%; } .col-xs-offset-9 { margin-left: 75%; } .col-xs-offset-8 { margin-left: 66.66666667%; } .col-xs-offset-7 { margin-left: 58.33333333%; } .col-xs-offset-6 { margin-left: 50%; } .col-xs-offset-5 { margin-left: 41.66666667%; } .col-xs-offset-4 { margin-left: 33.33333333%; } .col-xs-offset-3 { margin-left: 25%; } .col-xs-offset-2 { margin-left: 16.66666667%; } .col-xs-offset-1 { margin-left: 8.33333333%; } .col-xs-offset-0 { margin-left: 0; } @media (min-width: 768px) { .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { float: left; } .col-sm-12 { width: 100%; } .col-sm-11 { width: 91.66666667%; } .col-sm-10 { width: 83.33333333%; } .col-sm-9 { width: 75%; } .col-sm-8 { width: 66.66666667%; } .col-sm-7 { width: 58.33333333%; } .col-sm-6 { width: 50%; } .col-sm-5 { width: 41.66666667%; } .col-sm-4 { width: 33.33333333%; } .col-sm-3 { width: 25%; } .col-sm-2 { width: 16.66666667%; } .col-sm-1 { width: 8.33333333%; } .col-sm-pull-12 { right: 100%; } .col-sm-pull-11 { right: 91.66666667%; } .col-sm-pull-10 { right: 83.33333333%; } .col-sm-pull-9 { right: 75%; } .col-sm-pull-8 { right: 66.66666667%; } .col-sm-pull-7 { right: 58.33333333%; } .col-sm-pull-6 { right: 50%; } .col-sm-pull-5 { right: 41.66666667%; } .col-sm-pull-4 { right: 33.33333333%; } .col-sm-pull-3 { right: 25%; } .col-sm-pull-2 { right: 16.66666667%; } .col-sm-pull-1 { right: 8.33333333%; } .col-sm-pull-0 { right: auto; } .col-sm-push-12 { left: 100%; } .col-sm-push-11 { left: 91.66666667%; } .col-sm-push-10 { left: 83.33333333%; } .col-sm-push-9 { left: 75%; } .col-sm-push-8 { left: 66.66666667%; } .col-sm-push-7 { left: 58.33333333%; } .col-sm-push-6 { left: 50%; } .col-sm-push-5 { left: 41.66666667%; } .col-sm-push-4 { left: 33.33333333%; } .col-sm-push-3 { left: 25%; } .col-sm-push-2 { left: 16.66666667%; } .col-sm-push-1 { left: 8.33333333%; } .col-sm-push-0 { left: auto; } .col-sm-offset-12 { margin-left: 100%; } .col-sm-offset-11 { margin-left: 91.66666667%; } .col-sm-offset-10 { margin-left: 83.33333333%; } .col-sm-offset-9 { margin-left: 75%; } .col-sm-offset-8 { margin-left: 66.66666667%; } .col-sm-offset-7 { margin-left: 58.33333333%; } .col-sm-offset-6 { margin-left: 50%; } .col-sm-offset-5 { margin-left: 41.66666667%; } .col-sm-offset-4 { margin-left: 33.33333333%; } .col-sm-offset-3 { margin-left: 25%; } .col-sm-offset-2 { margin-left: 16.66666667%; } .col-sm-offset-1 { margin-left: 8.33333333%; } .col-sm-offset-0 { margin-left: 0; } } @media (min-width: 992px) { .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { float: left; } .col-md-12 { width: 100%; } .col-md-11 { width: 91.66666667%; } .col-md-10 { width: 83.33333333%; } .col-md-9 { width: 75%; } .col-md-8 { width: 66.66666667%; } .col-md-7 { width: 58.33333333%; } .col-md-6 { width: 50%; } .col-md-5 { width: 41.66666667%; } .col-md-4 { width: 33.33333333%; } .col-md-3 { width: 25%; } .col-md-2 { width: 16.66666667%; } .col-md-1 { width: 8.33333333%; } .col-md-pull-12 { right: 100%; } .col-md-pull-11 { right: 91.66666667%; } .col-md-pull-10 { right: 83.33333333%; } .col-md-pull-9 { right: 75%; } .col-md-pull-8 { right: 66.66666667%; } .col-md-pull-7 { right: 58.33333333%; } .col-md-pull-6 { right: 50%; } .col-md-pull-5 { right: 41.66666667%; } .col-md-pull-4 { right: 33.33333333%; } .col-md-pull-3 { right: 25%; } .col-md-pull-2 { right: 16.66666667%; } .col-md-pull-1 { right: 8.33333333%; } .col-md-pull-0 { right: auto; } .col-md-push-12 { left: 100%; } .col-md-push-11 { left: 91.66666667%; } .col-md-push-10 { left: 83.33333333%; } .col-md-push-9 { left: 75%; } .col-md-push-8 { left: 66.66666667%; } .col-md-push-7 { left: 58.33333333%; } .col-md-push-6 { left: 50%; } .col-md-push-5 { left: 41.66666667%; } .col-md-push-4 { left: 33.33333333%; } .col-md-push-3 { left: 25%; } .col-md-push-2 { left: 16.66666667%; } .col-md-push-1 { left: 8.33333333%; } .col-md-push-0 { left: auto; } .col-md-offset-12 { margin-left: 100%; } .col-md-offset-11 { margin-left: 91.66666667%; } .col-md-offset-10 { margin-left: 83.33333333%; } .col-md-offset-9 { margin-left: 75%; } .col-md-offset-8 { margin-left: 66.66666667%; } .col-md-offset-7 { margin-left: 58.33333333%; } .col-md-offset-6 { margin-left: 50%; } .col-md-offset-5 { margin-left: 41.66666667%; } .col-md-offset-4 { margin-left: 33.33333333%; } .col-md-offset-3 { margin-left: 25%; } .col-md-offset-2 { margin-left: 16.66666667%; } .col-md-offset-1 { margin-left: 8.33333333%; } .col-md-offset-0 { margin-left: 0; } } @media (min-width: 1200px) { .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { float: left; } .col-lg-12 { width: 100%; } .col-lg-11 { width: 91.66666667%; } .col-lg-10 { width: 83.33333333%; } .col-lg-9 { width: 75%; } .col-lg-8 { width: 66.66666667%; } .col-lg-7 { width: 58.33333333%; } .col-lg-6 { width: 50%; } .col-lg-5 { width: 41.66666667%; } .col-lg-4 { width: 33.33333333%; } .col-lg-3 { width: 25%; } .col-lg-2 { width: 16.66666667%; } .col-lg-1 { width: 8.33333333%; } .col-lg-pull-12 { right: 100%; } .col-lg-pull-11 { right: 91.66666667%; } .col-lg-pull-10 { right: 83.33333333%; } .col-lg-pull-9 { right: 75%; } .col-lg-pull-8 { right: 66.66666667%; } .col-lg-pull-7 { right: 58.33333333%; } .col-lg-pull-6 { right: 50%; } .col-lg-pull-5 { right: 41.66666667%; } .col-lg-pull-4 { right: 33.33333333%; } .col-lg-pull-3 { right: 25%; } .col-lg-pull-2 { right: 16.66666667%; } .col-lg-pull-1 { right: 8.33333333%; } .col-lg-pull-0 { right: auto; } .col-lg-push-12 { left: 100%; } .col-lg-push-11 { left: 91.66666667%; } .col-lg-push-10 { left: 83.33333333%; } .col-lg-push-9 { left: 75%; } .col-lg-push-8 { left: 66.66666667%; } .col-lg-push-7 { left: 58.33333333%; } .col-lg-push-6 { left: 50%; } .col-lg-push-5 { left: 41.66666667%; } .col-lg-push-4 { left: 33.33333333%; } .col-lg-push-3 { left: 25%; } .col-lg-push-2 { left: 16.66666667%; } .col-lg-push-1 { left: 8.33333333%; } .col-lg-push-0 { left: auto; } .col-lg-offset-12 { margin-left: 100%; } .col-lg-offset-11 { margin-left: 91.66666667%; } .col-lg-offset-10 { margin-left: 83.33333333%; } .col-lg-offset-9 { margin-left: 75%; } .col-lg-offset-8 { margin-left: 66.66666667%; } .col-lg-offset-7 { margin-left: 58.33333333%; } .col-lg-offset-6 { margin-left: 50%; } .col-lg-offset-5 { margin-left: 41.66666667%; } .col-lg-offset-4 { margin-left: 33.33333333%; } .col-lg-offset-3 { margin-left: 25%; } .col-lg-offset-2 { margin-left: 16.66666667%; } .col-lg-offset-1 { margin-left: 8.33333333%; } .col-lg-offset-0 { margin-left: 0; } } table { background-color: transparent; } caption { padding-top: 8px; padding-bottom: 8px; color: #777; text-align: left; } th { text-align: left; } .table { width: 100%; max-width: 100%; margin-bottom: 20px; } .table > thead > tr > th, .table > tbody > tr > th, .table > tfoot > tr > th, .table > thead > tr > td, .table > tbody > tr > td, .table > tfoot > tr > td { padding: 8px; line-height: 1.42857143; vertical-align: top; border-top: 1px solid #ddd; } .table > thead > tr > th { vertical-align: bottom; border-bottom: 2px solid #ddd; } .table > caption + thead > tr:first-child > th, .table > colgroup + thead > tr:first-child > th, .table > thead:first-child > tr:first-child > th, .table > caption + thead > tr:first-child > td, .table > colgroup + thead > tr:first-child > td, .table > thead:first-child > tr:first-child > td { border-top: 0; } .table > tbody + tbody { border-top: 2px solid #ddd; } .table .table { background-color: #fff; } .table-condensed > thead > tr > th, .table-condensed > tbody > tr > th, .table-condensed > tfoot > tr > th, .table-condensed > thead > tr > td, .table-condensed > tbody > tr > td, .table-condensed > tfoot > tr > td { padding: 5px; } .table-bordered { border: 1px solid #ddd; } .table-bordered > thead > tr > th, .table-bordered > tbody > tr > th, .table-bordered > tfoot > tr > th, .table-bordered > thead > tr > td, .table-bordered > tbody > tr > td, .table-bordered > tfoot > tr > td { border: 1px solid #ddd; } .table-bordered > thead > tr > th, .table-bordered > thead > tr > td { border-bottom-width: 2px; } .table-striped > tbody > tr:nth-of-type(odd) { background-color: #f9f9f9; } .table-hover > tbody > tr:hover { background-color: #f5f5f5; } table col[class*="col-"] { position: static; display: table-column; float: none; } table td[class*="col-"], table th[class*="col-"] { position: static; display: table-cell; float: none; } .table > thead > tr > td.active, .table > tbody > tr > td.active, .table > tfoot > tr > td.active, .table > thead > tr > th.active, .table > tbody > tr > th.active, .table > tfoot > tr > th.active, .table > thead > tr.active > td, .table > tbody > tr.active > td, .table > tfoot > tr.active > td, .table > thead > tr.active > th, .table > tbody > tr.active > th, .table > tfoot > tr.active > th { background-color: #f5f5f5; } .table-hover > tbody > tr > td.active:hover, .table-hover > tbody > tr > th.active:hover, .table-hover > tbody > tr.active:hover > td, .table-hover > tbody > tr:hover > .active, .table-hover > tbody > tr.active:hover > th { background-color: #e8e8e8; } .table > thead > tr > td.success, .table > tbody > tr > td.success, .table > tfoot > tr > td.success, .table > thead > tr > th.success, .table > tbody > tr > th.success, .table > tfoot > tr > th.success, .table > thead > tr.success > td, .table > tbody > tr.success > td, .table > tfoot > tr.success > td, .table > thead > tr.success > th, .table > tbody > tr.success > th, .table > tfoot > tr.success > th { background-color: #dff0d8; } .table-hover > tbody > tr > td.success:hover, .table-hover > tbody > tr > th.success:hover, .table-hover > tbody > tr.success:hover > td, .table-hover > tbody > tr:hover > .success, .table-hover > tbody > tr.success:hover > th { background-color: #d0e9c6; } .table > thead > tr > td.info, .table > tbody > tr > td.info, .table > tfoot > tr > td.info, .table > thead > tr > th.info, .table > tbody > tr > th.info, .table > tfoot > tr > th.info, .table > thead > tr.info > td, .table > tbody > tr.info > td, .table > tfoot > tr.info > td, .table > thead > tr.info > th, .table > tbody > tr.info > th, .table > tfoot > tr.info > th { background-color: #d9edf7; } .table-hover > tbody > tr > td.info:hover, .table-hover > tbody > tr > th.info:hover, .table-hover > tbody > tr.info:hover > td, .table-hover > tbody > tr:hover > .info, .table-hover > tbody > tr.info:hover > th { background-color: #c4e3f3; } .table > thead > tr > td.warning, .table > tbody > tr > td.warning, .table > tfoot > tr > td.warning, .table > thead > tr > th.warning, .table > tbody > tr > th.warning, .table > tfoot > tr > th.warning, .table > thead > tr.warning > td, .table > tbody > tr.warning > td, .table > tfoot > tr.warning > td, .table > thead > tr.warning > th, .table > tbody > tr.warning > th, .table > tfoot > tr.warning > th { background-color: #fcf8e3; } .table-hover > tbody > tr > td.warning:hover, .table-hover > tbody > tr > th.warning:hover, .table-hover > tbody > tr.warning:hover > td, .table-hover > tbody > tr:hover > .warning, .table-hover > tbody > tr.warning:hover > th { background-color: #faf2cc; } .table > thead > tr > td.danger, .table > tbody > tr > td.danger, .table > tfoot > tr > td.danger, .table > thead > tr > th.danger, .table > tbody > tr > th.danger, .table > tfoot > tr > th.danger, .table > thead > tr.danger > td, .table > tbody > tr.danger > td, .table > tfoot > tr.danger > td, .table > thead > tr.danger > th, .table > tbody > tr.danger > th, .table > tfoot > tr.danger > th { background-color: #f2dede; } .table-hover > tbody > tr > td.danger:hover, .table-hover > tbody > tr > th.danger:hover, .table-hover > tbody > tr.danger:hover > td, .table-hover > tbody > tr:hover > .danger, .table-hover > tbody > tr.danger:hover > th { background-color: #ebcccc; } .table-responsive { min-height: .01%; overflow-x: auto; } @media screen and (max-width: 767px) { .table-responsive { width: 100%; margin-bottom: 15px; overflow-y: hidden; -ms-overflow-style: -ms-autohiding-scrollbar; border: 1px solid #ddd; } .table-responsive > .table { margin-bottom: 0; } .table-responsive > .table > thead > tr > th, .table-responsive > .table > tbody > tr > th, .table-responsive > .table > tfoot > tr > th, .table-responsive > .table > thead > tr > td, .table-responsive > .table > tbody > tr > td, .table-responsive > .table > tfoot > tr > td { white-space: nowrap; } .table-responsive > .table-bordered { border: 0; } .table-responsive > .table-bordered > thead > tr > th:first-child, .table-responsive > .table-bordered > tbody > tr > th:first-child, .table-responsive > .table-bordered > tfoot > tr > th:first-child, .table-responsive > .table-bordered > thead > tr > td:first-child, .table-responsive > .table-bordered > tbody > tr > td:first-child, .table-responsive > .table-bordered > tfoot > tr > td:first-child { border-left: 0; } .table-responsive > .table-bordered > thead > tr > th:last-child, .table-responsive > .table-bordered > tbody > tr > th:last-child, .table-responsive > .table-bordered > tfoot > tr > th:last-child, .table-responsive > .table-bordered > thead > tr > td:last-child, .table-responsive > .table-bordered > tbody > tr > td:last-child, .table-responsive > .table-bordered > tfoot > tr > td:last-child { border-right: 0; } .table-responsive > .table-bordered > tbody > tr:last-child > th, .table-responsive > .table-bordered > tfoot > tr:last-child > th, .table-responsive > .table-bordered > tbody > tr:last-child > td, .table-responsive > .table-bordered > tfoot > tr:last-child > td { border-bottom: 0; } } fieldset { min-width: 0; padding: 0; margin: 0; border: 0; } legend { display: block; width: 100%; padding: 0; margin-bottom: 20px; font-size: 21px; line-height: inherit; color: #333; border: 0; border-bottom: 1px solid #e5e5e5; } label { display: inline-block; max-width: 100%; margin-bottom: 5px; font-weight: bold; } input[type="search"] { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } input[type="radio"], input[type="checkbox"] { margin: 4px 0 0; margin-top: 1px \9; line-height: normal; } input[type="file"] { display: block; } input[type="range"] { display: block; width: 100%; } select[multiple], select[size] { height: auto; } input[type="file"]:focus, input[type="radio"]:focus, input[type="checkbox"]:focus { outline: thin dotted; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } output { display: block; padding-top: 7px; font-size: 14px; line-height: 1.42857143; color: #555; } .form-control { display: block; width: 100%; height: 34px; padding: 6px 12px; font-size: 14px; line-height: 1.42857143; color: #555; background-color: #fff; background-image: none; border: 1px solid #ccc; border-radius: 4px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; } .form-control:focus { border-color: #66afe9; outline: 0; -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); } .form-control::-moz-placeholder { color: #999; opacity: 1; } .form-control:-ms-input-placeholder { color: #999; } .form-control::-webkit-input-placeholder { color: #999; } .form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control { background-color: #eee; opacity: 1; } .form-control[disabled], fieldset[disabled] .form-control { cursor: not-allowed; } textarea.form-control { height: auto; } input[type="search"] { -webkit-appearance: none; } @media screen and (-webkit-min-device-pixel-ratio: 0) { input[type="date"].form-control, input[type="time"].form-control, input[type="datetime-local"].form-control, input[type="month"].form-control { line-height: 34px; } input[type="date"].input-sm, input[type="time"].input-sm, input[type="datetime-local"].input-sm, input[type="month"].input-sm, .input-group-sm input[type="date"], .input-group-sm input[type="time"], .input-group-sm input[type="datetime-local"], .input-group-sm input[type="month"] { line-height: 30px; } input[type="date"].input-lg, input[type="time"].input-lg, input[type="datetime-local"].input-lg, input[type="month"].input-lg, .input-group-lg input[type="date"], .input-group-lg input[type="time"], .input-group-lg input[type="datetime-local"], .input-group-lg input[type="month"] { line-height: 46px; } } .form-group { margin-bottom: 15px; } .radio, .checkbox { position: relative; display: block; margin-top: 10px; margin-bottom: 10px; } .radio label, .checkbox label { min-height: 20px; padding-left: 20px; margin-bottom: 0; font-weight: normal; cursor: pointer; } .radio input[type="radio"], .radio-inline input[type="radio"], .checkbox input[type="checkbox"], .checkbox-inline input[type="checkbox"] { position: absolute; margin-top: 4px \9; margin-left: -20px; } .radio + .radio, .checkbox + .checkbox { margin-top: -5px; } .radio-inline, .checkbox-inline { position: relative; display: inline-block; padding-left: 20px; margin-bottom: 0; font-weight: normal; vertical-align: middle; cursor: pointer; } .radio-inline + .radio-inline, .checkbox-inline + .checkbox-inline { margin-top: 0; margin-left: 10px; } input[type="radio"][disabled], input[type="checkbox"][disabled], input[type="radio"].disabled, input[type="checkbox"].disabled, fieldset[disabled] input[type="radio"], fieldset[disabled] input[type="checkbox"] { cursor: not-allowed; } .radio-inline.disabled, .checkbox-inline.disabled, fieldset[disabled] .radio-inline, fieldset[disabled] .checkbox-inline { cursor: not-allowed; } .radio.disabled label, .checkbox.disabled label, fieldset[disabled] .radio label, fieldset[disabled] .checkbox label { cursor: not-allowed; } .form-control-static { min-height: 34px; padding-top: 7px; padding-bottom: 7px; margin-bottom: 0; } .form-control-static.input-lg, .form-control-static.input-sm { padding-right: 0; padding-left: 0; } .input-sm { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } select.input-sm { height: 30px; line-height: 30px; } textarea.input-sm, select[multiple].input-sm { height: auto; } .form-group-sm .form-control { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } .form-group-sm select.form-control { height: 30px; line-height: 30px; } .form-group-sm textarea.form-control, .form-group-sm select[multiple].form-control { height: auto; } .form-group-sm .form-control-static { height: 30px; min-height: 32px; padding: 6px 10px; font-size: 12px; line-height: 1.5; } .input-lg { height: 46px; padding: 10px 16px; font-size: 18px; line-height: 1.3333333; border-radius: 6px; } select.input-lg { height: 46px; line-height: 46px; } textarea.input-lg, select[multiple].input-lg { height: auto; } .form-group-lg .form-control { height: 46px; padding: 10px 16px; font-size: 18px; line-height: 1.3333333; border-radius: 6px; } .form-group-lg select.form-control { height: 46px; line-height: 46px; } .form-group-lg textarea.form-control, .form-group-lg select[multiple].form-control { height: auto; } .form-group-lg .form-control-static { height: 46px; min-height: 38px; padding: 11px 16px; font-size: 18px; line-height: 1.3333333; } .has-feedback { position: relative; } .has-feedback .form-control { padding-right: 42.5px; } .form-control-feedback { position: absolute; top: 0; right: 0; z-index: 2; display: block; width: 34px; height: 34px; line-height: 34px; text-align: center; pointer-events: none; } .input-lg + .form-control-feedback, .input-group-lg + .form-control-feedback, .form-group-lg .form-control + .form-control-feedback { width: 46px; height: 46px; line-height: 46px; } .input-sm + .form-control-feedback, .input-group-sm + .form-control-feedback, .form-group-sm .form-control + .form-control-feedback { width: 30px; height: 30px; line-height: 30px; } .has-success .help-block, .has-success .control-label, .has-success .radio, .has-success .checkbox, .has-success .radio-inline, .has-success .checkbox-inline, .has-success.radio label, .has-success.checkbox label, .has-success.radio-inline label, .has-success.checkbox-inline label { color: #3c763d; } .has-success .form-control { border-color: #3c763d; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); } .has-success .form-control:focus { border-color: #2b542c; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; } .has-success .input-group-addon { color: #3c763d; background-color: #dff0d8; border-color: #3c763d; } .has-success .form-control-feedback { color: #3c763d; } .has-warning .help-block, .has-warning .control-label, .has-warning .radio, .has-warning .checkbox, .has-warning .radio-inline, .has-warning .checkbox-inline, .has-warning.radio label, .has-warning.checkbox label, .has-warning.radio-inline label, .has-warning.checkbox-inline label { color: #8a6d3b; } .has-warning .form-control { border-color: #8a6d3b; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); } .has-warning .form-control:focus { border-color: #66512c; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; } .has-warning .input-group-addon { color: #8a6d3b; background-color: #fcf8e3; border-color: #8a6d3b; } .has-warning .form-control-feedback { color: #8a6d3b; } .has-error .help-block, .has-error .control-label, .has-error .radio, .has-error .checkbox, .has-error .radio-inline, .has-error .checkbox-inline, .has-error.radio label, .has-error.checkbox label, .has-error.radio-inline label, .has-error.checkbox-inline label { color: #a94442; } .has-error .form-control { border-color: #a94442; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); } .has-error .form-control:focus { border-color: #843534; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; } .has-error .input-group-addon { color: #a94442; background-color: #f2dede; border-color: #a94442; } .has-error .form-control-feedback { color: #a94442; } .has-feedback label ~ .form-control-feedback { top: 25px; } .has-feedback label.sr-only ~ .form-control-feedback { top: 0; } .help-block { display: block; margin-top: 5px; margin-bottom: 10px; color: #737373; } @media (min-width: 768px) { .form-inline .form-group { display: inline-block; margin-bottom: 0; vertical-align: middle; } .form-inline .form-control { display: inline-block; width: auto; vertical-align: middle; } .form-inline .form-control-static { display: inline-block; } .form-inline .input-group { display: inline-table; vertical-align: middle; } .form-inline .input-group .input-group-addon, .form-inline .input-group .input-group-btn, .form-inline .input-group .form-control { width: auto; } .form-inline .input-group > .form-control { width: 100%; } .form-inline .control-label { margin-bottom: 0; vertical-align: middle; } .form-inline .radio, .form-inline .checkbox { display: inline-block; margin-top: 0; margin-bottom: 0; vertical-align: middle; } .form-inline .radio label, .form-inline .checkbox label { padding-left: 0; } .form-inline .radio input[type="radio"], .form-inline .checkbox input[type="checkbox"] { position: relative; margin-left: 0; } .form-inline .has-feedback .form-control-feedback { top: 0; } } .form-horizontal .radio, .form-horizontal .checkbox, .form-horizontal .radio-inline, .form-horizontal .checkbox-inline { padding-top: 7px; margin-top: 0; margin-bottom: 0; } .form-horizontal .radio, .form-horizontal .checkbox { min-height: 27px; } .form-horizontal .form-group { margin-right: -15px; margin-left: -15px; } @media (min-width: 768px) { .form-horizontal .control-label { padding-top: 7px; margin-bottom: 0; text-align: right; } } .form-horizontal .has-feedback .form-control-feedback { right: 15px; } @media (min-width: 768px) { .form-horizontal .form-group-lg .control-label { padding-top: 14.333333px; font-size: 18px; } } @media (min-width: 768px) { .form-horizontal .form-group-sm .control-label { padding-top: 6px; font-size: 12px; } } .btn { display: inline-block; padding: 6px 12px; margin-bottom: 0; font-size: 14px; font-weight: normal; line-height: 1.42857143; text-align: center; white-space: nowrap; vertical-align: middle; -ms-touch-action: manipulation; touch-action: manipulation; cursor: pointer; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; background-image: none; border: 1px solid transparent; border-radius: 4px; } .btn:focus, .btn:active:focus, .btn.active:focus, .btn.focus, .btn:active.focus, .btn.active.focus { outline: thin dotted; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } .btn:hover, .btn:focus, .btn.focus { color: #333; text-decoration: none; } .btn:active, .btn.active { background-image: none; outline: 0; -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); } .btn.disabled, .btn[disabled], fieldset[disabled] .btn { cursor: not-allowed; filter: alpha(opacity=65); -webkit-box-shadow: none; box-shadow: none; opacity: .65; } a.btn.disabled, fieldset[disabled] a.btn { pointer-events: none; } .btn-default { color: #333; background-color: #fff; border-color: #ccc; } .btn-default:focus, .btn-default.focus { color: #333; background-color: #e6e6e6; border-color: #8c8c8c; } .btn-default:hover { color: #333; background-color: #e6e6e6; border-color: #adadad; } .btn-default:active, .btn-default.active, .open > .dropdown-toggle.btn-default { color: #333; background-color: #e6e6e6; border-color: #adadad; } .btn-default:active:hover, .btn-default.active:hover, .open > .dropdown-toggle.btn-default:hover, .btn-default:active:focus, .btn-default.active:focus, .open > .dropdown-toggle.btn-default:focus, .btn-default:active.focus, .btn-default.active.focus, .open > .dropdown-toggle.btn-default.focus { color: #333; background-color: #d4d4d4; border-color: #8c8c8c; } .btn-default:active, .btn-default.active, .open > .dropdown-toggle.btn-default { background-image: none; } .btn-default.disabled, .btn-default[disabled], fieldset[disabled] .btn-default, .btn-default.disabled:hover, .btn-default[disabled]:hover, fieldset[disabled] .btn-default:hover, .btn-default.disabled:focus, .btn-default[disabled]:focus, fieldset[disabled] .btn-default:focus, .btn-default.disabled.focus, .btn-default[disabled].focus, fieldset[disabled] .btn-default.focus, .btn-default.disabled:active, .btn-default[disabled]:active, fieldset[disabled] .btn-default:active, .btn-default.disabled.active, .btn-default[disabled].active, fieldset[disabled] .btn-default.active { background-color: #fff; border-color: #ccc; } .btn-default .badge { color: #fff; background-color: #333; } .btn-primary { color: #fff; background-color: #337ab7; border-color: #2e6da4; } .btn-primary:focus, .btn-primary.focus { color: #fff; background-color: #286090; border-color: #122b40; } .btn-primary:hover { color: #fff; background-color: #286090; border-color: #204d74; } .btn-primary:active, .btn-primary.active, .open > .dropdown-toggle.btn-primary { color: #fff; background-color: #286090; border-color: #204d74; } .btn-primary:active:hover, .btn-primary.active:hover, .open > .dropdown-toggle.btn-primary:hover, .btn-primary:active:focus, .btn-primary.active:focus, .open > .dropdown-toggle.btn-primary:focus, .btn-primary:active.focus, .btn-primary.active.focus, .open > .dropdown-toggle.btn-primary.focus { color: #fff; background-color: #204d74; border-color: #122b40; } .btn-primary:active, .btn-primary.active, .open > .dropdown-toggle.btn-primary { background-image: none; } .btn-primary.disabled, .btn-primary[disabled], fieldset[disabled] .btn-primary, .btn-primary.disabled:hover, .btn-primary[disabled]:hover, fieldset[disabled] .btn-primary:hover, .btn-primary.disabled:focus, .btn-primary[disabled]:focus, fieldset[disabled] .btn-primary:focus, .btn-primary.disabled.focus, .btn-primary[disabled].focus, fieldset[disabled] .btn-primary.focus, .btn-primary.disabled:active, .btn-primary[disabled]:active, fieldset[disabled] .btn-primary:active, .btn-primary.disabled.active, .btn-primary[disabled].active, fieldset[disabled] .btn-primary.active { background-color: #337ab7; border-color: #2e6da4; } .btn-primary .badge { color: #337ab7; background-color: #fff; } .btn-success { color: #fff; background-color: #5cb85c; border-color: #4cae4c; } .btn-success:focus, .btn-success.focus { color: #fff; background-color: #449d44; border-color: #255625; } .btn-success:hover { color: #fff; background-color: #449d44; border-color: #398439; } .btn-success:active, .btn-success.active, .open > .dropdown-toggle.btn-success { color: #fff; background-color: #449d44; border-color: #398439; } .btn-success:active:hover, .btn-success.active:hover, .open > .dropdown-toggle.btn-success:hover, .btn-success:active:focus, .btn-success.active:focus, .open > .dropdown-toggle.btn-success:focus, .btn-success:active.focus, .btn-success.active.focus, .open > .dropdown-toggle.btn-success.focus { color: #fff; background-color: #398439; border-color: #255625; } .btn-success:active, .btn-success.active, .open > .dropdown-toggle.btn-success { background-image: none; } .btn-success.disabled, .btn-success[disabled], fieldset[disabled] .btn-success, .btn-success.disabled:hover, .btn-success[disabled]:hover, fieldset[disabled] .btn-success:hover, .btn-success.disabled:focus, .btn-success[disabled]:focus, fieldset[disabled] .btn-success:focus, .btn-success.disabled.focus, .btn-success[disabled].focus, fieldset[disabled] .btn-success.focus, .btn-success.disabled:active, .btn-success[disabled]:active, fieldset[disabled] .btn-success:active, .btn-success.disabled.active, .btn-success[disabled].active, fieldset[disabled] .btn-success.active { background-color: #5cb85c; border-color: #4cae4c; } .btn-success .badge { color: #5cb85c; background-color: #fff; } .btn-info { color: #fff; background-color: #5bc0de; border-color: #46b8da; } .btn-info:focus, .btn-info.focus { color: #fff; background-color: #31b0d5; border-color: #1b6d85; } .btn-info:hover { color: #fff; background-color: #31b0d5; border-color: #269abc; } .btn-info:active, .btn-info.active, .open > .dropdown-toggle.btn-info { color: #fff; background-color: #31b0d5; border-color: #269abc; } .btn-info:active:hover, .btn-info.active:hover, .open > .dropdown-toggle.btn-info:hover, .btn-info:active:focus, .btn-info.active:focus, .open > .dropdown-toggle.btn-info:focus, .btn-info:active.focus, .btn-info.active.focus, .open > .dropdown-toggle.btn-info.focus { color: #fff; background-color: #269abc; border-color: #1b6d85; } .btn-info:active, .btn-info.active, .open > .dropdown-toggle.btn-info { background-image: none; } .btn-info.disabled, .btn-info[disabled], fieldset[disabled] .btn-info, .btn-info.disabled:hover, .btn-info[disabled]:hover, fieldset[disabled] .btn-info:hover, .btn-info.disabled:focus, .btn-info[disabled]:focus, fieldset[disabled] .btn-info:focus, .btn-info.disabled.focus, .btn-info[disabled].focus, fieldset[disabled] .btn-info.focus, .btn-info.disabled:active, .btn-info[disabled]:active, fieldset[disabled] .btn-info:active, .btn-info.disabled.active, .btn-info[disabled].active, fieldset[disabled] .btn-info.active { background-color: #5bc0de; border-color: #46b8da; } .btn-info .badge { color: #5bc0de; background-color: #fff; } .btn-warning { color: #fff; background-color: #f0ad4e; border-color: #eea236; } .btn-warning:focus, .btn-warning.focus { color: #fff; background-color: #ec971f; border-color: #985f0d; } .btn-warning:hover { color: #fff; background-color: #ec971f; border-color: #d58512; } .btn-warning:active, .btn-warning.active, .open > .dropdown-toggle.btn-warning { color: #fff; background-color: #ec971f; border-color: #d58512; } .btn-warning:active:hover, .btn-warning.active:hover, .open > .dropdown-toggle.btn-warning:hover, .btn-warning:active:focus, .btn-warning.active:focus, .open > .dropdown-toggle.btn-warning:focus, .btn-warning:active.focus, .btn-warning.active.focus, .open > .dropdown-toggle.btn-warning.focus { color: #fff; background-color: #d58512; border-color: #985f0d; } .btn-warning:active, .btn-warning.active, .open > .dropdown-toggle.btn-warning { background-image: none; } .btn-warning.disabled, .btn-warning[disabled], fieldset[disabled] .btn-warning, .btn-warning.disabled:hover, .btn-warning[disabled]:hover, fieldset[disabled] .btn-warning:hover, .btn-warning.disabled:focus, .btn-warning[disabled]:focus, fieldset[disabled] .btn-warning:focus, .btn-warning.disabled.focus, .btn-warning[disabled].focus, fieldset[disabled] .btn-warning.focus, .btn-warning.disabled:active, .btn-warning[disabled]:active, fieldset[disabled] .btn-warning:active, .btn-warning.disabled.active, .btn-warning[disabled].active, fieldset[disabled] .btn-warning.active { background-color: #f0ad4e; border-color: #eea236; } .btn-warning .badge { color: #f0ad4e; background-color: #fff; } .btn-danger { color: #fff; background-color: #d9534f; border-color: #d43f3a; } .btn-danger:focus, .btn-danger.focus { color: #fff; background-color: #c9302c; border-color: #761c19; } .btn-danger:hover { color: #fff; background-color: #c9302c; border-color: #ac2925; } .btn-danger:active, .btn-danger.active, .open > .dropdown-toggle.btn-danger { color: #fff; background-color: #c9302c; border-color: #ac2925; } .btn-danger:active:hover, .btn-danger.active:hover, .open > .dropdown-toggle.btn-danger:hover, .btn-danger:active:focus, .btn-danger.active:focus, .open > .dropdown-toggle.btn-danger:focus, .btn-danger:active.focus, .btn-danger.active.focus, .open > .dropdown-toggle.btn-danger.focus { color: #fff; background-color: #ac2925; border-color: #761c19; } .btn-danger:active, .btn-danger.active, .open > .dropdown-toggle.btn-danger { background-image: none; } .btn-danger.disabled, .btn-danger[disabled], fieldset[disabled] .btn-danger, .btn-danger.disabled:hover, .btn-danger[disabled]:hover, fieldset[disabled] .btn-danger:hover, .btn-danger.disabled:focus, .btn-danger[disabled]:focus, fieldset[disabled] .btn-danger:focus, .btn-danger.disabled.focus, .btn-danger[disabled].focus, fieldset[disabled] .btn-danger.focus, .btn-danger.disabled:active, .btn-danger[disabled]:active, fieldset[disabled] .btn-danger:active, .btn-danger.disabled.active, .btn-danger[disabled].active, fieldset[disabled] .btn-danger.active { background-color: #d9534f; border-color: #d43f3a; } .btn-danger .badge { color: #d9534f; background-color: #fff; } .btn-link { font-weight: normal; color: #337ab7; border-radius: 0; } .btn-link, .btn-link:active, .btn-link.active, .btn-link[disabled], fieldset[disabled] .btn-link { background-color: transparent; -webkit-box-shadow: none; box-shadow: none; } .btn-link, .btn-link:hover, .btn-link:focus, .btn-link:active { border-color: transparent; } .btn-link:hover, .btn-link:focus { color: #23527c; text-decoration: underline; background-color: transparent; } .btn-link[disabled]:hover, fieldset[disabled] .btn-link:hover, .btn-link[disabled]:focus, fieldset[disabled] .btn-link:focus { color: #777; text-decoration: none; } .btn-lg, .btn-group-lg > .btn { padding: 10px 16px; font-size: 18px; line-height: 1.3333333; border-radius: 6px; } .btn-sm, .btn-group-sm > .btn { padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } .btn-xs, .btn-group-xs > .btn { padding: 1px 5px; font-size: 12px; line-height: 1.5; border-radius: 3px; } .btn-block { display: block; width: 100%; } .btn-block + .btn-block { margin-top: 5px; } input[type="submit"].btn-block, input[type="reset"].btn-block, input[type="button"].btn-block { width: 100%; } .fade { opacity: 0; -webkit-transition: opacity .15s linear; -o-transition: opacity .15s linear; transition: opacity .15s linear; } .fade.in { opacity: 1; } .collapse { display: none; } .collapse.in { display: block; } tr.collapse.in { display: table-row; } tbody.collapse.in { display: table-row-group; } .collapsing { position: relative; height: 0; overflow: hidden; -webkit-transition-timing-function: ease; -o-transition-timing-function: ease; transition-timing-function: ease; -webkit-transition-duration: .35s; -o-transition-duration: .35s; transition-duration: .35s; -webkit-transition-property: height, visibility; -o-transition-property: height, visibility; transition-property: height, visibility; } .caret { display: inline-block; width: 0; height: 0; margin-left: 2px; vertical-align: middle; border-top: 4px dashed; border-top: 4px solid \9; border-right: 4px solid transparent; border-left: 4px solid transparent; } .dropup, .dropdown { position: relative; } .dropdown-toggle:focus { outline: 0; } .dropdown-menu { position: absolute; top: 100%; left: 0; z-index: 1000; display: none; float: left; min-width: 160px; padding: 5px 0; margin: 2px 0 0; font-size: 14px; text-align: left; list-style: none; background-color: #fff; -webkit-background-clip: padding-box; background-clip: padding-box; border: 1px solid #ccc; border: 1px solid rgba(0, 0, 0, .15); border-radius: 4px; -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); box-shadow: 0 6px 12px rgba(0, 0, 0, .175); } .dropdown-menu.pull-right { right: 0; left: auto; } .dropdown-menu .divider { height: 1px; margin: 9px 0; overflow: hidden; background-color: #e5e5e5; } .dropdown-menu > li > a { display: block; padding: 3px 20px; clear: both; font-weight: normal; line-height: 1.42857143; color: #333; white-space: nowrap; } .dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { color: #262626; text-decoration: none; background-color: #f5f5f5; } .dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { color: #fff; text-decoration: none; background-color: #337ab7; outline: 0; } .dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { color: #777; } .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { text-decoration: none; cursor: not-allowed; background-color: transparent; background-image: none; filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); } .open > .dropdown-menu { display: block; } .open > a { outline: 0; } .dropdown-menu-right { right: 0; left: auto; } .dropdown-menu-left { right: auto; left: 0; } .dropdown-header { display: block; padding: 3px 20px; font-size: 12px; line-height: 1.42857143; color: #777; white-space: nowrap; } .dropdown-backdrop { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 990; } .pull-right > .dropdown-menu { right: 0; left: auto; } .dropup .caret, .navbar-fixed-bottom .dropdown .caret { content: ""; border-top: 0; border-bottom: 4px dashed; border-bottom: 4px solid \9; } .dropup .dropdown-menu, .navbar-fixed-bottom .dropdown .dropdown-menu { top: auto; bottom: 100%; margin-bottom: 2px; } @media (min-width: 768px) { .navbar-right .dropdown-menu { right: 0; left: auto; } .navbar-right .dropdown-menu-left { right: auto; left: 0; } } .btn-group, .btn-group-vertical { position: relative; display: inline-block; vertical-align: middle; } .btn-group > .btn, .btn-group-vertical > .btn { position: relative; float: left; } .btn-group > .btn:hover, .btn-group-vertical > .btn:hover, .btn-group > .btn:focus, .btn-group-vertical > .btn:focus, .btn-group > .btn:active, .btn-group-vertical > .btn:active, .btn-group > .btn.active, .btn-group-vertical > .btn.active { z-index: 2; } .btn-group .btn + .btn, .btn-group .btn + .btn-group, .btn-group .btn-group + .btn, .btn-group .btn-group + .btn-group { margin-left: -1px; } .btn-toolbar { margin-left: -5px; } .btn-toolbar .btn, .btn-toolbar .btn-group, .btn-toolbar .input-group { float: left; } .btn-toolbar > .btn, .btn-toolbar > .btn-group, .btn-toolbar > .input-group { margin-left: 5px; } .btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { border-radius: 0; } .btn-group > .btn:first-child { margin-left: 0; } .btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { border-top-right-radius: 0; border-bottom-right-radius: 0; } .btn-group > .btn:last-child:not(:first-child), .btn-group > .dropdown-toggle:not(:first-child) { border-top-left-radius: 0; border-bottom-left-radius: 0; } .btn-group > .btn-group { float: left; } .btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { border-radius: 0; } .btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, .btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { border-top-right-radius: 0; border-bottom-right-radius: 0; } .btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { border-top-left-radius: 0; border-bottom-left-radius: 0; } .btn-group .dropdown-toggle:active, .btn-group.open .dropdown-toggle { outline: 0; } .btn-group > .btn + .dropdown-toggle { padding-right: 8px; padding-left: 8px; } .btn-group > .btn-lg + .dropdown-toggle { padding-right: 12px; padding-left: 12px; } .btn-group.open .dropdown-toggle { -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); } .btn-group.open .dropdown-toggle.btn-link { -webkit-box-shadow: none; box-shadow: none; } .btn .caret { margin-left: 0; } .btn-lg .caret { border-width: 5px 5px 0; border-bottom-width: 0; } .dropup .btn-lg .caret { border-width: 0 5px 5px; } .btn-group-vertical > .btn, .btn-group-vertical > .btn-group, .btn-group-vertical > .btn-group > .btn { display: block; float: none; width: 100%; max-width: 100%; } .btn-group-vertical > .btn-group > .btn { float: none; } .btn-group-vertical > .btn + .btn, .btn-group-vertical > .btn + .btn-group, .btn-group-vertical > .btn-group + .btn, .btn-group-vertical > .btn-group + .btn-group { margin-top: -1px; margin-left: 0; } .btn-group-vertical > .btn:not(:first-child):not(:last-child) { border-radius: 0; } .btn-group-vertical > .btn:first-child:not(:last-child) { border-top-right-radius: 4px; border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .btn-group-vertical > .btn:last-child:not(:first-child) { border-top-left-radius: 0; border-top-right-radius: 0; border-bottom-left-radius: 4px; } .btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { border-radius: 0; } .btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, .btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { border-top-left-radius: 0; border-top-right-radius: 0; } .btn-group-justified { display: table; width: 100%; table-layout: fixed; border-collapse: separate; } .btn-group-justified > .btn, .btn-group-justified > .btn-group { display: table-cell; float: none; width: 1%; } .btn-group-justified > .btn-group .btn { width: 100%; } .btn-group-justified > .btn-group .dropdown-menu { left: auto; } [data-toggle="buttons"] > .btn input[type="radio"], [data-toggle="buttons"] > .btn-group > .btn input[type="radio"], [data-toggle="buttons"] > .btn input[type="checkbox"], [data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { position: absolute; clip: rect(0, 0, 0, 0); pointer-events: none; } .input-group { position: relative; display: table; border-collapse: separate; } .input-group[class*="col-"] { float: none; padding-right: 0; padding-left: 0; } .input-group .form-control { position: relative; z-index: 2; float: left; width: 100%; margin-bottom: 0; } .input-group-lg > .form-control, .input-group-lg > .input-group-addon, .input-group-lg > .input-group-btn > .btn { height: 46px; padding: 10px 16px; font-size: 18px; line-height: 1.3333333; border-radius: 6px; } select.input-group-lg > .form-control, select.input-group-lg > .input-group-addon, select.input-group-lg > .input-group-btn > .btn { height: 46px; line-height: 46px; } textarea.input-group-lg > .form-control, textarea.input-group-lg > .input-group-addon, textarea.input-group-lg > .input-group-btn > .btn, select[multiple].input-group-lg > .form-control, select[multiple].input-group-lg > .input-group-addon, select[multiple].input-group-lg > .input-group-btn > .btn { height: auto; } .input-group-sm > .form-control, .input-group-sm > .input-group-addon, .input-group-sm > .input-group-btn > .btn { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } select.input-group-sm > .form-control, select.input-group-sm > .input-group-addon, select.input-group-sm > .input-group-btn > .btn { height: 30px; line-height: 30px; } textarea.input-group-sm > .form-control, textarea.input-group-sm > .input-group-addon, textarea.input-group-sm > .input-group-btn > .btn, select[multiple].input-group-sm > .form-control, select[multiple].input-group-sm > .input-group-addon, select[multiple].input-group-sm > .input-group-btn > .btn { height: auto; } .input-group-addon, .input-group-btn, .input-group .form-control { display: table-cell; } .input-group-addon:not(:first-child):not(:last-child), .input-group-btn:not(:first-child):not(:last-child), .input-group .form-control:not(:first-child):not(:last-child) { border-radius: 0; } .input-group-addon, .input-group-btn { width: 1%; white-space: nowrap; vertical-align: middle; } .input-group-addon { padding: 6px 12px; font-size: 14px; font-weight: normal; line-height: 1; color: #555; text-align: center; background-color: #eee; border: 1px solid #ccc; border-radius: 4px; } .input-group-addon.input-sm { padding: 5px 10px; font-size: 12px; border-radius: 3px; } .input-group-addon.input-lg { padding: 10px 16px; font-size: 18px; border-radius: 6px; } .input-group-addon input[type="radio"], .input-group-addon input[type="checkbox"] { margin-top: 0; } .input-group .form-control:first-child, .input-group-addon:first-child, .input-group-btn:first-child > .btn, .input-group-btn:first-child > .btn-group > .btn, .input-group-btn:first-child > .dropdown-toggle, .input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), .input-group-btn:last-child > .btn-group:not(:last-child) > .btn { border-top-right-radius: 0; border-bottom-right-radius: 0; } .input-group-addon:first-child { border-right: 0; } .input-group .form-control:last-child, .input-group-addon:last-child, .input-group-btn:last-child > .btn, .input-group-btn:last-child > .btn-group > .btn, .input-group-btn:last-child > .dropdown-toggle, .input-group-btn:first-child > .btn:not(:first-child), .input-group-btn:first-child > .btn-group:not(:first-child) > .btn { border-top-left-radius: 0; border-bottom-left-radius: 0; } .input-group-addon:last-child { border-left: 0; } .input-group-btn { position: relative; font-size: 0; white-space: nowrap; } .input-group-btn > .btn { position: relative; } .input-group-btn > .btn + .btn { margin-left: -1px; } .input-group-btn > .btn:hover, .input-group-btn > .btn:focus, .input-group-btn > .btn:active { z-index: 2; } .input-group-btn:first-child > .btn, .input-group-btn:first-child > .btn-group { margin-right: -1px; } .input-group-btn:last-child > .btn, .input-group-btn:last-child > .btn-group { z-index: 2; margin-left: -1px; } .nav { padding-left: 0; margin-bottom: 0; list-style: none; } .nav > li { position: relative; display: block; } .nav > li > a { position: relative; display: block; padding: 10px 15px; } .nav > li > a:hover, .nav > li > a:focus { text-decoration: none; background-color: #eee; } .nav > li.disabled > a { color: #777; } .nav > li.disabled > a:hover, .nav > li.disabled > a:focus { color: #777; text-decoration: none; cursor: not-allowed; background-color: transparent; } .nav .open > a, .nav .open > a:hover, .nav .open > a:focus { background-color: #eee; border-color: #337ab7; } .nav .nav-divider { height: 1px; margin: 9px 0; overflow: hidden; background-color: #e5e5e5; } .nav > li > a > img { max-width: none; } .nav-tabs { border-bottom: 1px solid #ddd; } .nav-tabs > li { float: left; margin-bottom: -1px; } .nav-tabs > li > a { margin-right: 2px; line-height: 1.42857143; border: 1px solid transparent; border-radius: 4px 4px 0 0; } .nav-tabs > li > a:hover { border-color: #eee #eee #ddd; } .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { color: #555; cursor: default; background-color: #fff; border: 1px solid #ddd; border-bottom-color: transparent; } .nav-tabs.nav-justified { width: 100%; border-bottom: 0; } .nav-tabs.nav-justified > li { float: none; } .nav-tabs.nav-justified > li > a { margin-bottom: 5px; text-align: center; } .nav-tabs.nav-justified > .dropdown .dropdown-menu { top: auto; left: auto; } @media (min-width: 768px) { .nav-tabs.nav-justified > li { display: table-cell; width: 1%; } .nav-tabs.nav-justified > li > a { margin-bottom: 0; } } .nav-tabs.nav-justified > li > a { margin-right: 0; border-radius: 4px; } .nav-tabs.nav-justified > .active > a, .nav-tabs.nav-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:focus { border: 1px solid #ddd; } @media (min-width: 768px) { .nav-tabs.nav-justified > li > a { border-bottom: 1px solid #ddd; border-radius: 4px 4px 0 0; } .nav-tabs.nav-justified > .active > a, .nav-tabs.nav-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:focus { border-bottom-color: #fff; } } .nav-pills > li { float: left; } .nav-pills > li > a { border-radius: 4px; } .nav-pills > li + li { margin-left: 2px; } .nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus { color: #fff; background-color: #337ab7; } .nav-stacked > li { float: none; } .nav-stacked > li + li { margin-top: 2px; margin-left: 0; } .nav-justified { width: 100%; } .nav-justified > li { float: none; } .nav-justified > li > a { margin-bottom: 5px; text-align: center; } .nav-justified > .dropdown .dropdown-menu { top: auto; left: auto; } @media (min-width: 768px) { .nav-justified > li { display: table-cell; width: 1%; } .nav-justified > li > a { margin-bottom: 0; } } .nav-tabs-justified { border-bottom: 0; } .nav-tabs-justified > li > a { margin-right: 0; border-radius: 4px; } .nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:hover, .nav-tabs-justified > .active > a:focus { border: 1px solid #ddd; } @media (min-width: 768px) { .nav-tabs-justified > li > a { border-bottom: 1px solid #ddd; border-radius: 4px 4px 0 0; } .nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:hover, .nav-tabs-justified > .active > a:focus { border-bottom-color: #fff; } } .tab-content > .tab-pane { display: none; } .tab-content > .active { display: block; } .nav-tabs .dropdown-menu { margin-top: -1px; border-top-left-radius: 0; border-top-right-radius: 0; } .navbar { position: relative; min-height: 50px; margin-bottom: 20px; border: 1px solid transparent; } @media (min-width: 768px) { .navbar { border-radius: 4px; } } @media (min-width: 768px) { .navbar-header { float: left; } } .navbar-collapse { padding-right: 15px; padding-left: 15px; overflow-x: visible; -webkit-overflow-scrolling: touch; border-top: 1px solid transparent; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); } .navbar-collapse.in { overflow-y: auto; } @media (min-width: 768px) { .navbar-collapse { width: auto; border-top: 0; -webkit-box-shadow: none; box-shadow: none; } .navbar-collapse.collapse { display: block !important; height: auto !important; padding-bottom: 0; overflow: visible !important; } .navbar-collapse.in { overflow-y: visible; } .navbar-fixed-top .navbar-collapse, .navbar-static-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse { padding-right: 0; padding-left: 0; } } .navbar-fixed-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse { max-height: 340px; } @media (max-device-width: 480px) and (orientation: landscape) { .navbar-fixed-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse { max-height: 200px; } } .container > .navbar-header, .container-fluid > .navbar-header, .container > .navbar-collapse, .container-fluid > .navbar-collapse { margin-right: -15px; margin-left: -15px; } @media (min-width: 768px) { .container > .navbar-header, .container-fluid > .navbar-header, .container > .navbar-collapse, .container-fluid > .navbar-collapse { margin-right: 0; margin-left: 0; } } .navbar-static-top { z-index: 1000; border-width: 0 0 1px; } @media (min-width: 768px) { .navbar-static-top { border-radius: 0; } } .navbar-fixed-top, .navbar-fixed-bottom { position: fixed; right: 0; left: 0; z-index: 1030; } @media (min-width: 768px) { .navbar-fixed-top, .navbar-fixed-bottom { border-radius: 0; } } .navbar-fixed-top { top: 0; border-width: 0 0 1px; } .navbar-fixed-bottom { bottom: 0; margin-bottom: 0; border-width: 1px 0 0; } .navbar-brand { float: left; height: 50px; padding: 15px 15px; font-size: 18px; line-height: 20px; } .navbar-brand:hover, .navbar-brand:focus { text-decoration: none; } .navbar-brand > img { display: block; } @media (min-width: 768px) { .navbar > .container .navbar-brand, .navbar > .container-fluid .navbar-brand { margin-left: -15px; } } .navbar-toggle { position: relative; float: right; padding: 9px 10px; margin-top: 8px; margin-right: 15px; margin-bottom: 8px; background-color: transparent; background-image: none; border: 1px solid transparent; border-radius: 4px; } .navbar-toggle:focus { outline: 0; } .navbar-toggle .icon-bar { display: block; width: 22px; height: 2px; border-radius: 1px; } .navbar-toggle .icon-bar + .icon-bar { margin-top: 4px; } @media (min-width: 768px) { .navbar-toggle { display: none; } } .navbar-nav { margin: 7.5px -15px; } .navbar-nav > li > a { padding-top: 10px; padding-bottom: 10px; line-height: 20px; } @media (max-width: 767px) { .navbar-nav .open .dropdown-menu { position: static; float: none; width: auto; margin-top: 0; background-color: transparent; border: 0; -webkit-box-shadow: none; box-shadow: none; } .navbar-nav .open .dropdown-menu > li > a, .navbar-nav .open .dropdown-menu .dropdown-header { padding: 5px 15px 5px 25px; } .navbar-nav .open .dropdown-menu > li > a { line-height: 20px; } .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-nav .open .dropdown-menu > li > a:focus { background-image: none; } } @media (min-width: 768px) { .navbar-nav { float: left; margin: 0; } .navbar-nav > li { float: left; } .navbar-nav > li > a { padding-top: 15px; padding-bottom: 15px; } } .navbar-form { padding: 10px 15px; margin-top: 8px; margin-right: -15px; margin-bottom: 8px; margin-left: -15px; border-top: 1px solid transparent; border-bottom: 1px solid transparent; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); } @media (min-width: 768px) { .navbar-form .form-group { display: inline-block; margin-bottom: 0; vertical-align: middle; } .navbar-form .form-control { display: inline-block; width: auto; vertical-align: middle; } .navbar-form .form-control-static { display: inline-block; } .navbar-form .input-group { display: inline-table; vertical-align: middle; } .navbar-form .input-group .input-group-addon, .navbar-form .input-group .input-group-btn, .navbar-form .input-group .form-control { width: auto; } .navbar-form .input-group > .form-control { width: 100%; } .navbar-form .control-label { margin-bottom: 0; vertical-align: middle; } .navbar-form .radio, .navbar-form .checkbox { display: inline-block; margin-top: 0; margin-bottom: 0; vertical-align: middle; } .navbar-form .radio label, .navbar-form .checkbox label { padding-left: 0; } .navbar-form .radio input[type="radio"], .navbar-form .checkbox input[type="checkbox"] { position: relative; margin-left: 0; } .navbar-form .has-feedback .form-control-feedback { top: 0; } } @media (max-width: 767px) { .navbar-form .form-group { margin-bottom: 5px; } .navbar-form .form-group:last-child { margin-bottom: 0; } } @media (min-width: 768px) { .navbar-form { width: auto; padding-top: 0; padding-bottom: 0; margin-right: 0; margin-left: 0; border: 0; -webkit-box-shadow: none; box-shadow: none; } } .navbar-nav > li > .dropdown-menu { margin-top: 0; border-top-left-radius: 0; border-top-right-radius: 0; } .navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { margin-bottom: 0; border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .navbar-btn { margin-top: 8px; margin-bottom: 8px; } .navbar-btn.btn-sm { margin-top: 10px; margin-bottom: 10px; } .navbar-btn.btn-xs { margin-top: 14px; margin-bottom: 14px; } .navbar-text { margin-top: 15px; margin-bottom: 15px; } @media (min-width: 768px) { .navbar-text { float: left; margin-right: 15px; margin-left: 15px; } } @media (min-width: 768px) { .navbar-left { float: left !important; } .navbar-right { float: right !important; margin-right: -15px; } .navbar-right ~ .navbar-right { margin-right: 0; } } .navbar-default { background-color: #f8f8f8; border-color: #e7e7e7; } .navbar-default .navbar-brand { color: #777; } .navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus { color: #5e5e5e; background-color: transparent; } .navbar-default .navbar-text { color: #777; } .navbar-default .navbar-nav > li > a { color: #777; } .navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus { color: #333; background-color: transparent; } .navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus { color: #555; background-color: #e7e7e7; } .navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus { color: #ccc; background-color: transparent; } .navbar-default .navbar-toggle { border-color: #ddd; } .navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus { background-color: #ddd; } .navbar-default .navbar-toggle .icon-bar { background-color: #888; } .navbar-default .navbar-collapse, .navbar-default .navbar-form { border-color: #e7e7e7; } .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus { color: #555; background-color: #e7e7e7; } @media (max-width: 767px) { .navbar-default .navbar-nav .open .dropdown-menu > li > a { color: #777; } .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { color: #333; background-color: transparent; } .navbar-default .navbar-nav .open .dropdown-menu > .active > a, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { color: #555; background-color: #e7e7e7; } .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { color: #ccc; background-color: transparent; } } .navbar-default .navbar-link { color: #777; } .navbar-default .navbar-link:hover { color: #333; } .navbar-default .btn-link { color: #777; } .navbar-default .btn-link:hover, .navbar-default .btn-link:focus { color: #333; } .navbar-default .btn-link[disabled]:hover, fieldset[disabled] .navbar-default .btn-link:hover, .navbar-default .btn-link[disabled]:focus, fieldset[disabled] .navbar-default .btn-link:focus { color: #ccc; } .navbar-inverse { background-color: #222; border-color: #080808; } .navbar-inverse .navbar-brand { color: #9d9d9d; } .navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus { color: #fff; background-color: transparent; } .navbar-inverse .navbar-text { color: #9d9d9d; } .navbar-inverse .navbar-nav > li > a { color: #9d9d9d; } .navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus { color: #fff; background-color: transparent; } .navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus { color: #fff; background-color: #080808; } .navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus { color: #444; background-color: transparent; } .navbar-inverse .navbar-toggle { border-color: #333; } .navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus { background-color: #333; } .navbar-inverse .navbar-toggle .icon-bar { background-color: #fff; } .navbar-inverse .navbar-collapse, .navbar-inverse .navbar-form { border-color: #101010; } .navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus { color: #fff; background-color: #080808; } @media (max-width: 767px) { .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { border-color: #080808; } .navbar-inverse .navbar-nav .open .dropdown-menu .divider { background-color: #080808; } .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { color: #9d9d9d; } .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { color: #fff; background-color: transparent; } .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { color: #fff; background-color: #080808; } .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { color: #444; background-color: transparent; } } .navbar-inverse .navbar-link { color: #9d9d9d; } .navbar-inverse .navbar-link:hover { color: #fff; } .navbar-inverse .btn-link { color: #9d9d9d; } .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link:focus { color: #fff; } .navbar-inverse .btn-link[disabled]:hover, fieldset[disabled] .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link[disabled]:focus, fieldset[disabled] .navbar-inverse .btn-link:focus { color: #444; } .breadcrumb { padding: 8px 15px; margin-bottom: 20px; list-style: none; background-color: #f5f5f5; border-radius: 4px; } .breadcrumb > li { display: inline-block; } .breadcrumb > li + li:before { padding: 0 5px; color: #ccc; content: "/\00a0"; } .breadcrumb > .active { color: #777; } .pagination { display: inline-block; padding-left: 0; margin: 20px 0; border-radius: 4px; } .pagination > li { display: inline; } .pagination > li > a, .pagination > li > span { position: relative; float: left; padding: 6px 12px; margin-left: -1px; line-height: 1.42857143; color: #337ab7; text-decoration: none; background-color: #fff; border: 1px solid #ddd; } .pagination > li:first-child > a, .pagination > li:first-child > span { margin-left: 0; border-top-left-radius: 4px; border-bottom-left-radius: 4px; } .pagination > li:last-child > a, .pagination > li:last-child > span { border-top-right-radius: 4px; border-bottom-right-radius: 4px; } .pagination > li > a:hover, .pagination > li > span:hover, .pagination > li > a:focus, .pagination > li > span:focus { z-index: 3; color: #23527c; background-color: #eee; border-color: #ddd; } .pagination > .active > a, .pagination > .active > span, .pagination > .active > a:hover, .pagination > .active > span:hover, .pagination > .active > a:focus, .pagination > .active > span:focus { z-index: 2; color: #fff; cursor: default; background-color: #337ab7; border-color: #337ab7; } .pagination > .disabled > span, .pagination > .disabled > span:hover, .pagination > .disabled > span:focus, .pagination > .disabled > a, .pagination > .disabled > a:hover, .pagination > .disabled > a:focus { color: #777; cursor: not-allowed; background-color: #fff; border-color: #ddd; } .pagination-lg > li > a, .pagination-lg > li > span { padding: 10px 16px; font-size: 18px; line-height: 1.3333333; } .pagination-lg > li:first-child > a, .pagination-lg > li:first-child > span { border-top-left-radius: 6px; border-bottom-left-radius: 6px; } .pagination-lg > li:last-child > a, .pagination-lg > li:last-child > span { border-top-right-radius: 6px; border-bottom-right-radius: 6px; } .pagination-sm > li > a, .pagination-sm > li > span { padding: 5px 10px; font-size: 12px; line-height: 1.5; } .pagination-sm > li:first-child > a, .pagination-sm > li:first-child > span { border-top-left-radius: 3px; border-bottom-left-radius: 3px; } .pagination-sm > li:last-child > a, .pagination-sm > li:last-child > span { border-top-right-radius: 3px; border-bottom-right-radius: 3px; } .pager { padding-left: 0; margin: 20px 0; text-align: center; list-style: none; } .pager li { display: inline; } .pager li > a, .pager li > span { display: inline-block; padding: 5px 14px; background-color: #fff; border: 1px solid #ddd; border-radius: 15px; } .pager li > a:hover, .pager li > a:focus { text-decoration: none; background-color: #eee; } .pager .next > a, .pager .next > span { float: right; } .pager .previous > a, .pager .previous > span { float: left; } .pager .disabled > a, .pager .disabled > a:hover, .pager .disabled > a:focus, .pager .disabled > span { color: #777; cursor: not-allowed; background-color: #fff; } .label { display: inline; padding: .2em .6em .3em; font-size: 75%; font-weight: bold; line-height: 1; color: #fff; text-align: center; white-space: nowrap; vertical-align: baseline; border-radius: .25em; } a.label:hover, a.label:focus { color: #fff; text-decoration: none; cursor: pointer; } .label:empty { display: none; } .btn .label { position: relative; top: -1px; } .label-default { background-color: #777; } .label-default[href]:hover, .label-default[href]:focus { background-color: #5e5e5e; } .label-primary { background-color: #337ab7; } .label-primary[href]:hover, .label-primary[href]:focus { background-color: #286090; } .label-success { background-color: #5cb85c; } .label-success[href]:hover, .label-success[href]:focus { background-color: #449d44; } .label-info { background-color: #5bc0de; } .label-info[href]:hover, .label-info[href]:focus { background-color: #31b0d5; } .label-warning { background-color: #f0ad4e; } .label-warning[href]:hover, .label-warning[href]:focus { background-color: #ec971f; } .label-danger { background-color: #d9534f; } .label-danger[href]:hover, .label-danger[href]:focus { background-color: #c9302c; } .badge { display: inline-block; min-width: 10px; padding: 3px 7px; font-size: 12px; font-weight: bold; line-height: 1; color: #fff; text-align: center; white-space: nowrap; vertical-align: middle; background-color: #777; border-radius: 10px; } .badge:empty { display: none; } .btn .badge { position: relative; top: -1px; } .btn-xs .badge, .btn-group-xs > .btn .badge { top: 0; padding: 1px 5px; } a.badge:hover, a.badge:focus { color: #fff; text-decoration: none; cursor: pointer; } .list-group-item.active > .badge, .nav-pills > .active > a > .badge { color: #337ab7; background-color: #fff; } .list-group-item > .badge { float: right; } .list-group-item > .badge + .badge { margin-right: 5px; } .nav-pills > li > a > .badge { margin-left: 3px; } .jumbotron { padding-top: 30px; padding-bottom: 30px; margin-bottom: 30px; color: inherit; background-color: #eee; } .jumbotron h1, .jumbotron .h1 { color: inherit; } .jumbotron p { margin-bottom: 15px; font-size: 21px; font-weight: 200; } .jumbotron > hr { border-top-color: #d5d5d5; } .container .jumbotron, .container-fluid .jumbotron { border-radius: 6px; } .jumbotron .container { max-width: 100%; } @media screen and (min-width: 768px) { .jumbotron { padding-top: 48px; padding-bottom: 48px; } .container .jumbotron, .container-fluid .jumbotron { padding-right: 60px; padding-left: 60px; } .jumbotron h1, .jumbotron .h1 { font-size: 63px; } } .thumbnail { display: block; padding: 4px; margin-bottom: 20px; line-height: 1.42857143; background-color: #fff; border: 1px solid #ddd; border-radius: 4px; -webkit-transition: border .2s ease-in-out; -o-transition: border .2s ease-in-out; transition: border .2s ease-in-out; } .thumbnail > img, .thumbnail a > img { margin-right: auto; margin-left: auto; } a.thumbnail:hover, a.thumbnail:focus, a.thumbnail.active { border-color: #337ab7; } .thumbnail .caption { padding: 9px; color: #333; } .alert { padding: 15px; margin-bottom: 20px; border: 1px solid transparent; border-radius: 4px; } .alert h4 { margin-top: 0; color: inherit; } .alert .alert-link { font-weight: bold; } .alert > p, .alert > ul { margin-bottom: 0; } .alert > p + p { margin-top: 5px; } .alert-dismissable, .alert-dismissible { padding-right: 35px; } .alert-dismissable .close, .alert-dismissible .close { position: relative; top: -2px; right: -21px; color: inherit; } .alert-success { color: #3c763d; background-color: #dff0d8; border-color: #d6e9c6; } .alert-success hr { border-top-color: #c9e2b3; } .alert-success .alert-link { color: #2b542c; } .alert-info { color: #31708f; background-color: #d9edf7; border-color: #bce8f1; } .alert-info hr { border-top-color: #a6e1ec; } .alert-info .alert-link { color: #245269; } .alert-warning { color: #8a6d3b; background-color: #fcf8e3; border-color: #faebcc; } .alert-warning hr { border-top-color: #f7e1b5; } .alert-warning .alert-link { color: #66512c; } .alert-danger { color: #a94442; background-color: #f2dede; border-color: #ebccd1; } .alert-danger hr { border-top-color: #e4b9c0; } .alert-danger .alert-link { color: #843534; } @-webkit-keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } @-o-keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } @keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } .progress { height: 20px; margin-bottom: 20px; overflow: hidden; background-color: #f5f5f5; border-radius: 4px; -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); } .progress-bar { float: left; width: 0; height: 100%; font-size: 12px; line-height: 20px; color: #fff; text-align: center; background-color: #337ab7; -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); -webkit-transition: width .6s ease; -o-transition: width .6s ease; transition: width .6s ease; } .progress-striped .progress-bar, .progress-bar-striped { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -webkit-background-size: 40px 40px; background-size: 40px 40px; } .progress.active .progress-bar, .progress-bar.active { -webkit-animation: progress-bar-stripes 2s linear infinite; -o-animation: progress-bar-stripes 2s linear infinite; animation: progress-bar-stripes 2s linear infinite; } .progress-bar-success { background-color: #5cb85c; } .progress-striped .progress-bar-success { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); } .progress-bar-info { background-color: #5bc0de; } .progress-striped .progress-bar-info { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); } .progress-bar-warning { background-color: #f0ad4e; } .progress-striped .progress-bar-warning { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); } .progress-bar-danger { background-color: #d9534f; } .progress-striped .progress-bar-danger { background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); } .media { margin-top: 15px; } .media:first-child { margin-top: 0; } .media, .media-body { overflow: hidden; zoom: 1; } .media-body { width: 10000px; } .media-object { display: block; } .media-object.img-thumbnail { max-width: none; } .media-right, .media > .pull-right { padding-left: 10px; } .media-left, .media > .pull-left { padding-right: 10px; } .media-left, .media-right, .media-body { display: table-cell; vertical-align: top; } .media-middle { vertical-align: middle; } .media-bottom { vertical-align: bottom; } .media-heading { margin-top: 0; margin-bottom: 5px; } .media-list { padding-left: 0; list-style: none; } .list-group { padding-left: 0; margin-bottom: 20px; } .list-group-item { position: relative; display: block; padding: 10px 15px; margin-bottom: -1px; background-color: #fff; border: 1px solid #ddd; } .list-group-item:first-child { border-top-left-radius: 4px; border-top-right-radius: 4px; } .list-group-item:last-child { margin-bottom: 0; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; } a.list-group-item, button.list-group-item { color: #555; } a.list-group-item .list-group-item-heading, button.list-group-item .list-group-item-heading { color: #333; } a.list-group-item:hover, button.list-group-item:hover, a.list-group-item:focus, button.list-group-item:focus { color: #555; text-decoration: none; background-color: #f5f5f5; } button.list-group-item { width: 100%; text-align: left; } .list-group-item.disabled, .list-group-item.disabled:hover, .list-group-item.disabled:focus { color: #777; cursor: not-allowed; background-color: #eee; } .list-group-item.disabled .list-group-item-heading, .list-group-item.disabled:hover .list-group-item-heading, .list-group-item.disabled:focus .list-group-item-heading { color: inherit; } .list-group-item.disabled .list-group-item-text, .list-group-item.disabled:hover .list-group-item-text, .list-group-item.disabled:focus .list-group-item-text { color: #777; } .list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus { z-index: 2; color: #fff; background-color: #337ab7; border-color: #337ab7; } .list-group-item.active .list-group-item-heading, .list-group-item.active:hover .list-group-item-heading, .list-group-item.active:focus .list-group-item-heading, .list-group-item.active .list-group-item-heading > small, .list-group-item.active:hover .list-group-item-heading > small, .list-group-item.active:focus .list-group-item-heading > small, .list-group-item.active .list-group-item-heading > .small, .list-group-item.active:hover .list-group-item-heading > .small, .list-group-item.active:focus .list-group-item-heading > .small { color: inherit; } .list-group-item.active .list-group-item-text, .list-group-item.active:hover .list-group-item-text, .list-group-item.active:focus .list-group-item-text { color: #c7ddef; } .list-group-item-success { color: #3c763d; background-color: #dff0d8; } a.list-group-item-success, button.list-group-item-success { color: #3c763d; } a.list-group-item-success .list-group-item-heading, button.list-group-item-success .list-group-item-heading { color: inherit; } a.list-group-item-success:hover, button.list-group-item-success:hover, a.list-group-item-success:focus, button.list-group-item-success:focus { color: #3c763d; background-color: #d0e9c6; } a.list-group-item-success.active, button.list-group-item-success.active, a.list-group-item-success.active:hover, button.list-group-item-success.active:hover, a.list-group-item-success.active:focus, button.list-group-item-success.active:focus { color: #fff; background-color: #3c763d; border-color: #3c763d; } .list-group-item-info { color: #31708f; background-color: #d9edf7; } a.list-group-item-info, button.list-group-item-info { color: #31708f; } a.list-group-item-info .list-group-item-heading, button.list-group-item-info .list-group-item-heading { color: inherit; } a.list-group-item-info:hover, button.list-group-item-info:hover, a.list-group-item-info:focus, button.list-group-item-info:focus { color: #31708f; background-color: #c4e3f3; } a.list-group-item-info.active, button.list-group-item-info.active, a.list-group-item-info.active:hover, button.list-group-item-info.active:hover, a.list-group-item-info.active:focus, button.list-group-item-info.active:focus { color: #fff; background-color: #31708f; border-color: #31708f; } .list-group-item-warning { color: #8a6d3b; background-color: #fcf8e3; } a.list-group-item-warning, button.list-group-item-warning { color: #8a6d3b; } a.list-group-item-warning .list-group-item-heading, button.list-group-item-warning .list-group-item-heading { color: inherit; } a.list-group-item-warning:hover, button.list-group-item-warning:hover, a.list-group-item-warning:focus, button.list-group-item-warning:focus { color: #8a6d3b; background-color: #faf2cc; } a.list-group-item-warning.active, button.list-group-item-warning.active, a.list-group-item-warning.active:hover, button.list-group-item-warning.active:hover, a.list-group-item-warning.active:focus, button.list-group-item-warning.active:focus { color: #fff; background-color: #8a6d3b; border-color: #8a6d3b; } .list-group-item-danger { color: #a94442; background-color: #f2dede; } a.list-group-item-danger, button.list-group-item-danger { color: #a94442; } a.list-group-item-danger .list-group-item-heading, button.list-group-item-danger .list-group-item-heading { color: inherit; } a.list-group-item-danger:hover, button.list-group-item-danger:hover, a.list-group-item-danger:focus, button.list-group-item-danger:focus { color: #a94442; background-color: #ebcccc; } a.list-group-item-danger.active, button.list-group-item-danger.active, a.list-group-item-danger.active:hover, button.list-group-item-danger.active:hover, a.list-group-item-danger.active:focus, button.list-group-item-danger.active:focus { color: #fff; background-color: #a94442; border-color: #a94442; } .list-group-item-heading { margin-top: 0; margin-bottom: 5px; } .list-group-item-text { margin-bottom: 0; line-height: 1.3; } .panel { margin-bottom: 20px; background-color: #fff; border: 1px solid transparent; border-radius: 4px; -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05); box-shadow: 0 1px 1px rgba(0, 0, 0, .05); } .panel-body { padding: 15px; } .panel-heading { padding: 10px 15px; border-bottom: 1px solid transparent; border-top-left-radius: 3px; border-top-right-radius: 3px; } .panel-heading > .dropdown .dropdown-toggle { color: inherit; } .panel-title { margin-top: 0; margin-bottom: 0; font-size: 16px; color: inherit; } .panel-title > a, .panel-title > small, .panel-title > .small, .panel-title > small > a, .panel-title > .small > a { color: inherit; } .panel-footer { padding: 10px 15px; background-color: #f5f5f5; border-top: 1px solid #ddd; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .panel > .list-group, .panel > .panel-collapse > .list-group { margin-bottom: 0; } .panel > .list-group .list-group-item, .panel > .panel-collapse > .list-group .list-group-item { border-width: 1px 0; border-radius: 0; } .panel > .list-group:first-child .list-group-item:first-child, .panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { border-top: 0; border-top-left-radius: 3px; border-top-right-radius: 3px; } .panel > .list-group:last-child .list-group-item:last-child, .panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { border-bottom: 0; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { border-top-left-radius: 0; border-top-right-radius: 0; } .panel-heading + .list-group .list-group-item:first-child { border-top-width: 0; } .list-group + .panel-footer { border-top-width: 0; } .panel > .table, .panel > .table-responsive > .table, .panel > .panel-collapse > .table { margin-bottom: 0; } .panel > .table caption, .panel > .table-responsive > .table caption, .panel > .panel-collapse > .table caption { padding-right: 15px; padding-left: 15px; } .panel > .table:first-child, .panel > .table-responsive:first-child > .table:first-child { border-top-left-radius: 3px; border-top-right-radius: 3px; } .panel > .table:first-child > thead:first-child > tr:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { border-top-left-radius: 3px; border-top-right-radius: 3px; } .panel > .table:first-child > thead:first-child > tr:first-child td:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, .panel > .table:first-child > thead:first-child > tr:first-child th:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { border-top-left-radius: 3px; } .panel > .table:first-child > thead:first-child > tr:first-child td:last-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, .panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, .panel > .table:first-child > thead:first-child > tr:first-child th:last-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, .panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { border-top-right-radius: 3px; } .panel > .table:last-child, .panel > .table-responsive:last-child > .table:last-child { border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .panel > .table:last-child > tbody:last-child > tr:last-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, .panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, .panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, .panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { border-bottom-left-radius: 3px; } .panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, .panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { border-bottom-right-radius: 3px; } .panel > .panel-body + .table, .panel > .panel-body + .table-responsive, .panel > .table + .panel-body, .panel > .table-responsive + .panel-body { border-top: 1px solid #ddd; } .panel > .table > tbody:first-child > tr:first-child th, .panel > .table > tbody:first-child > tr:first-child td { border-top: 0; } .panel > .table-bordered, .panel > .table-responsive > .table-bordered { border: 0; } .panel > .table-bordered > thead > tr > th:first-child, .panel > .table-responsive > .table-bordered > thead > tr > th:first-child, .panel > .table-bordered > tbody > tr > th:first-child, .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, .panel > .table-bordered > tfoot > tr > th:first-child, .panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, .panel > .table-bordered > thead > tr > td:first-child, .panel > .table-responsive > .table-bordered > thead > tr > td:first-child, .panel > .table-bordered > tbody > tr > td:first-child, .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, .panel > .table-bordered > tfoot > tr > td:first-child, .panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { border-left: 0; } .panel > .table-bordered > thead > tr > th:last-child, .panel > .table-responsive > .table-bordered > thead > tr > th:last-child, .panel > .table-bordered > tbody > tr > th:last-child, .panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, .panel > .table-bordered > tfoot > tr > th:last-child, .panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, .panel > .table-bordered > thead > tr > td:last-child, .panel > .table-responsive > .table-bordered > thead > tr > td:last-child, .panel > .table-bordered > tbody > tr > td:last-child, .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, .panel > .table-bordered > tfoot > tr > td:last-child, .panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { border-right: 0; } .panel > .table-bordered > thead > tr:first-child > td, .panel > .table-responsive > .table-bordered > thead > tr:first-child > td, .panel > .table-bordered > tbody > tr:first-child > td, .panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, .panel > .table-bordered > thead > tr:first-child > th, .panel > .table-responsive > .table-bordered > thead > tr:first-child > th, .panel > .table-bordered > tbody > tr:first-child > th, .panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { border-bottom: 0; } .panel > .table-bordered > tbody > tr:last-child > td, .panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, .panel > .table-bordered > tfoot > tr:last-child > td, .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, .panel > .table-bordered > tbody > tr:last-child > th, .panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, .panel > .table-bordered > tfoot > tr:last-child > th, .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { border-bottom: 0; } .panel > .table-responsive { margin-bottom: 0; border: 0; } .panel-group { margin-bottom: 20px; } .panel-group .panel { margin-bottom: 0; border-radius: 4px; } .panel-group .panel + .panel { margin-top: 5px; } .panel-group .panel-heading { border-bottom: 0; } .panel-group .panel-heading + .panel-collapse > .panel-body, .panel-group .panel-heading + .panel-collapse > .list-group { border-top: 1px solid #ddd; } .panel-group .panel-footer { border-top: 0; } .panel-group .panel-footer + .panel-collapse .panel-body { border-bottom: 1px solid #ddd; } .panel-default { border-color: #ddd; } .panel-default > .panel-heading { color: #333; background-color: #f5f5f5; border-color: #ddd; } .panel-default > .panel-heading + .panel-collapse > .panel-body { border-top-color: #ddd; } .panel-default > .panel-heading .badge { color: #f5f5f5; background-color: #333; } .panel-default > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #ddd; } .panel-primary { border-color: #337ab7; } .panel-primary > .panel-heading { color: #fff; background-color: #337ab7; border-color: #337ab7; } .panel-primary > .panel-heading + .panel-collapse > .panel-body { border-top-color: #337ab7; } .panel-primary > .panel-heading .badge { color: #337ab7; background-color: #fff; } .panel-primary > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #337ab7; } .panel-success { border-color: #d6e9c6; } .panel-success > .panel-heading { color: #3c763d; background-color: #dff0d8; border-color: #d6e9c6; } .panel-success > .panel-heading + .panel-collapse > .panel-body { border-top-color: #d6e9c6; } .panel-success > .panel-heading .badge { color: #dff0d8; background-color: #3c763d; } .panel-success > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #d6e9c6; } .panel-info { border-color: #bce8f1; } .panel-info > .panel-heading { color: #31708f; background-color: #d9edf7; border-color: #bce8f1; } .panel-info > .panel-heading + .panel-collapse > .panel-body { border-top-color: #bce8f1; } .panel-info > .panel-heading .badge { color: #d9edf7; background-color: #31708f; } .panel-info > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #bce8f1; } .panel-warning { border-color: #faebcc; } .panel-warning > .panel-heading { color: #8a6d3b; background-color: #fcf8e3; border-color: #faebcc; } .panel-warning > .panel-heading + .panel-collapse > .panel-body { border-top-color: #faebcc; } .panel-warning > .panel-heading .badge { color: #fcf8e3; background-color: #8a6d3b; } .panel-warning > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #faebcc; } .panel-danger { border-color: #ebccd1; } .panel-danger > .panel-heading { color: #a94442; background-color: #f2dede; border-color: #ebccd1; } .panel-danger > .panel-heading + .panel-collapse > .panel-body { border-top-color: #ebccd1; } .panel-danger > .panel-heading .badge { color: #f2dede; background-color: #a94442; } .panel-danger > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #ebccd1; } .embed-responsive { position: relative; display: block; height: 0; padding: 0; overflow: hidden; } .embed-responsive .embed-responsive-item, .embed-responsive iframe, .embed-responsive embed, .embed-responsive object, .embed-responsive video { position: absolute; top: 0; bottom: 0; left: 0; width: 100%; height: 100%; border: 0; } .embed-responsive-16by9 { padding-bottom: 56.25%; } .embed-responsive-4by3 { padding-bottom: 75%; } .well { min-height: 20px; padding: 19px; margin-bottom: 20px; background-color: #f5f5f5; border: 1px solid #e3e3e3; border-radius: 4px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); } .well blockquote { border-color: #ddd; border-color: rgba(0, 0, 0, .15); } .well-lg { padding: 24px; border-radius: 6px; } .well-sm { padding: 9px; border-radius: 3px; } .close { float: right; font-size: 21px; font-weight: bold; line-height: 1; color: #000; text-shadow: 0 1px 0 #fff; filter: alpha(opacity=20); opacity: .2; } .close:hover, .close:focus { color: #000; text-decoration: none; cursor: pointer; filter: alpha(opacity=50); opacity: .5; } button.close { -webkit-appearance: none; padding: 0; cursor: pointer; background: transparent; border: 0; } .modal-open { overflow: hidden; } .modal { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1050; display: none; overflow: hidden; -webkit-overflow-scrolling: touch; outline: 0; } .modal.fade .modal-dialog { -webkit-transition: -webkit-transform .3s ease-out; -o-transition: -o-transform .3s ease-out; transition: transform .3s ease-out; -webkit-transform: translate(0, -25%); -ms-transform: translate(0, -25%); -o-transform: translate(0, -25%); transform: translate(0, -25%); } .modal.in .modal-dialog { -webkit-transform: translate(0, 0); -ms-transform: translate(0, 0); -o-transform: translate(0, 0); transform: translate(0, 0); } .modal-open .modal { overflow-x: hidden; overflow-y: auto; } .modal-dialog { position: relative; width: auto; margin: 10px; } .modal-content { position: relative; background-color: #fff; -webkit-background-clip: padding-box; background-clip: padding-box; border: 1px solid #999; border: 1px solid rgba(0, 0, 0, .2); border-radius: 6px; outline: 0; -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5); box-shadow: 0 3px 9px rgba(0, 0, 0, .5); } .modal-backdrop { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1040; background-color: #000; } .modal-backdrop.fade { filter: alpha(opacity=0); opacity: 0; } .modal-backdrop.in { filter: alpha(opacity=50); opacity: .5; } .modal-header { min-height: 16.42857143px; padding: 15px; border-bottom: 1px solid #e5e5e5; } .modal-header .close { margin-top: -2px; } .modal-title { margin: 0; line-height: 1.42857143; } .modal-body { position: relative; padding: 15px; } .modal-footer { padding: 15px; text-align: right; border-top: 1px solid #e5e5e5; } .modal-footer .btn + .btn { margin-bottom: 0; margin-left: 5px; } .modal-footer .btn-group .btn + .btn { margin-left: -1px; } .modal-footer .btn-block + .btn-block { margin-left: 0; } .modal-scrollbar-measure { position: absolute; top: -9999px; width: 50px; height: 50px; overflow: scroll; } @media (min-width: 768px) { .modal-dialog { width: 600px; margin: 30px auto; } .modal-content { -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); box-shadow: 0 5px 15px rgba(0, 0, 0, .5); } .modal-sm { width: 300px; } } @media (min-width: 992px) { .modal-lg { width: 900px; } } .tooltip { position: absolute; z-index: 1070; display: block; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 12px; font-style: normal; font-weight: normal; line-height: 1.42857143; text-align: left; text-align: start; text-decoration: none; text-shadow: none; text-transform: none; letter-spacing: normal; word-break: normal; word-spacing: normal; word-wrap: normal; white-space: normal; filter: alpha(opacity=0); opacity: 0; line-break: auto; } .tooltip.in { filter: alpha(opacity=90); opacity: .9; } .tooltip.top { padding: 5px 0; margin-top: -3px; } .tooltip.right { padding: 0 5px; margin-left: 3px; } .tooltip.bottom { padding: 5px 0; margin-top: 3px; } .tooltip.left { padding: 0 5px; margin-left: -3px; } .tooltip-inner { max-width: 200px; padding: 3px 8px; color: #fff; text-align: center; background-color: #000; border-radius: 4px; } .tooltip-arrow { position: absolute; width: 0; height: 0; border-color: transparent; border-style: solid; } .tooltip.top .tooltip-arrow { bottom: 0; left: 50%; margin-left: -5px; border-width: 5px 5px 0; border-top-color: #000; } .tooltip.top-left .tooltip-arrow { right: 5px; bottom: 0; margin-bottom: -5px; border-width: 5px 5px 0; border-top-color: #000; } .tooltip.top-right .tooltip-arrow { bottom: 0; left: 5px; margin-bottom: -5px; border-width: 5px 5px 0; border-top-color: #000; } .tooltip.right .tooltip-arrow { top: 50%; left: 0; margin-top: -5px; border-width: 5px 5px 5px 0; border-right-color: #000; } .tooltip.left .tooltip-arrow { top: 50%; right: 0; margin-top: -5px; border-width: 5px 0 5px 5px; border-left-color: #000; } .tooltip.bottom .tooltip-arrow { top: 0; left: 50%; margin-left: -5px; border-width: 0 5px 5px; border-bottom-color: #000; } .tooltip.bottom-left .tooltip-arrow { top: 0; right: 5px; margin-top: -5px; border-width: 0 5px 5px; border-bottom-color: #000; } .tooltip.bottom-right .tooltip-arrow { top: 0; left: 5px; margin-top: -5px; border-width: 0 5px 5px; border-bottom-color: #000; } .popover { position: absolute; top: 0; left: 0; z-index: 1060; display: none; max-width: 276px; padding: 1px; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; font-style: normal; font-weight: normal; line-height: 1.42857143; text-align: left; text-align: start; text-decoration: none; text-shadow: none; text-transform: none; letter-spacing: normal; word-break: normal; word-spacing: normal; word-wrap: normal; white-space: normal; background-color: #fff; -webkit-background-clip: padding-box; background-clip: padding-box; border: 1px solid #ccc; border: 1px solid rgba(0, 0, 0, .2); border-radius: 6px; -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2); box-shadow: 0 5px 10px rgba(0, 0, 0, .2); line-break: auto; } .popover.top { margin-top: -10px; } .popover.right { margin-left: 10px; } .popover.bottom { margin-top: 10px; } .popover.left { margin-left: -10px; } .popover-title { padding: 8px 14px; margin: 0; font-size: 14px; background-color: #f7f7f7; border-bottom: 1px solid #ebebeb; border-radius: 5px 5px 0 0; } .popover-content { padding: 9px 14px; } .popover > .arrow, .popover > .arrow:after { position: absolute; display: block; width: 0; height: 0; border-color: transparent; border-style: solid; } .popover > .arrow { border-width: 11px; } .popover > .arrow:after { content: ""; border-width: 10px; } .popover.top > .arrow { bottom: -11px; left: 50%; margin-left: -11px; border-top-color: #999; border-top-color: rgba(0, 0, 0, .25); border-bottom-width: 0; } .popover.top > .arrow:after { bottom: 1px; margin-left: -10px; content: " "; border-top-color: #fff; border-bottom-width: 0; } .popover.right > .arrow { top: 50%; left: -11px; margin-top: -11px; border-right-color: #999; border-right-color: rgba(0, 0, 0, .25); border-left-width: 0; } .popover.right > .arrow:after { bottom: -10px; left: 1px; content: " "; border-right-color: #fff; border-left-width: 0; } .popover.bottom > .arrow { top: -11px; left: 50%; margin-left: -11px; border-top-width: 0; border-bottom-color: #999; border-bottom-color: rgba(0, 0, 0, .25); } .popover.bottom > .arrow:after { top: 1px; margin-left: -10px; content: " "; border-top-width: 0; border-bottom-color: #fff; } .popover.left > .arrow { top: 50%; right: -11px; margin-top: -11px; border-right-width: 0; border-left-color: #999; border-left-color: rgba(0, 0, 0, .25); } .popover.left > .arrow:after { right: 1px; bottom: -10px; content: " "; border-right-width: 0; border-left-color: #fff; } .carousel { position: relative; } .carousel-inner { position: relative; width: 100%; overflow: hidden; } .carousel-inner > .item { position: relative; display: none; -webkit-transition: .6s ease-in-out left; -o-transition: .6s ease-in-out left; transition: .6s ease-in-out left; } .carousel-inner > .item > img, .carousel-inner > .item > a > img { line-height: 1; } @media all and (transform-3d), (-webkit-transform-3d) { .carousel-inner > .item { -webkit-transition: -webkit-transform .6s ease-in-out; -o-transition: -o-transform .6s ease-in-out; transition: transform .6s ease-in-out; -webkit-backface-visibility: hidden; backface-visibility: hidden; -webkit-perspective: 1000px; perspective: 1000px; } .carousel-inner > .item.next, .carousel-inner > .item.active.right { left: 0; -webkit-transform: translate3d(100%, 0, 0); transform: translate3d(100%, 0, 0); } .carousel-inner > .item.prev, .carousel-inner > .item.active.left { left: 0; -webkit-transform: translate3d(-100%, 0, 0); transform: translate3d(-100%, 0, 0); } .carousel-inner > .item.next.left, .carousel-inner > .item.prev.right, .carousel-inner > .item.active { left: 0; -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); } } .carousel-inner > .active, .carousel-inner > .next, .carousel-inner > .prev { display: block; } .carousel-inner > .active { left: 0; } .carousel-inner > .next, .carousel-inner > .prev { position: absolute; top: 0; width: 100%; } .carousel-inner > .next { left: 100%; } .carousel-inner > .prev { left: -100%; } .carousel-inner > .next.left, .carousel-inner > .prev.right { left: 0; } .carousel-inner > .active.left { left: -100%; } .carousel-inner > .active.right { left: 100%; } .carousel-control { position: absolute; top: 0; bottom: 0; left: 0; width: 15%; font-size: 20px; color: #fff; text-align: center; text-shadow: 0 1px 2px rgba(0, 0, 0, .6); filter: alpha(opacity=50); opacity: .5; } .carousel-control.left { background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001))); background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); background-repeat: repeat-x; } .carousel-control.right { right: 0; left: auto; background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5))); background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); background-repeat: repeat-x; } .carousel-control:hover, .carousel-control:focus { color: #fff; text-decoration: none; filter: alpha(opacity=90); outline: 0; opacity: .9; } .carousel-control .icon-prev, .carousel-control .icon-next, .carousel-control .glyphicon-chevron-left, .carousel-control .glyphicon-chevron-right { position: absolute; top: 50%; z-index: 5; display: inline-block; margin-top: -10px; } .carousel-control .icon-prev, .carousel-control .glyphicon-chevron-left { left: 50%; margin-left: -10px; } .carousel-control .icon-next, .carousel-control .glyphicon-chevron-right { right: 50%; margin-right: -10px; } .carousel-control .icon-prev, .carousel-control .icon-next { width: 20px; height: 20px; font-family: serif; line-height: 1; } .carousel-control .icon-prev:before { content: '\2039'; } .carousel-control .icon-next:before { content: '\203a'; } .carousel-indicators { position: absolute; bottom: 10px; left: 50%; z-index: 15; width: 60%; padding-left: 0; margin-left: -30%; text-align: center; list-style: none; } .carousel-indicators li { display: inline-block; width: 10px; height: 10px; margin: 1px; text-indent: -999px; cursor: pointer; background-color: #000 \9; background-color: rgba(0, 0, 0, 0); border: 1px solid #fff; border-radius: 10px; } .carousel-indicators .active { width: 12px; height: 12px; margin: 0; background-color: #fff; } .carousel-caption { position: absolute; right: 15%; bottom: 20px; left: 15%; z-index: 10; padding-top: 20px; padding-bottom: 20px; color: #fff; text-align: center; text-shadow: 0 1px 2px rgba(0, 0, 0, .6); } .carousel-caption .btn { text-shadow: none; } @media screen and (min-width: 768px) { .carousel-control .glyphicon-chevron-left, .carousel-control .glyphicon-chevron-right, .carousel-control .icon-prev, .carousel-control .icon-next { width: 30px; height: 30px; margin-top: -15px; font-size: 30px; } .carousel-control .glyphicon-chevron-left, .carousel-control .icon-prev { margin-left: -15px; } .carousel-control .glyphicon-chevron-right, .carousel-control .icon-next { margin-right: -15px; } .carousel-caption { right: 20%; left: 20%; padding-bottom: 30px; } .carousel-indicators { bottom: 20px; } } .clearfix:before, .clearfix:after, .dl-horizontal dd:before, .dl-horizontal dd:after, .container:before, .container:after, .container-fluid:before, .container-fluid:after, .row:before, .row:after, .form-horizontal .form-group:before, .form-horizontal .form-group:after, .btn-toolbar:before, .btn-toolbar:after, .btn-group-vertical > .btn-group:before, .btn-group-vertical > .btn-group:after, .nav:before, .nav:after, .navbar:before, .navbar:after, .navbar-header:before, .navbar-header:after, .navbar-collapse:before, .navbar-collapse:after, .pager:before, .pager:after, .panel-body:before, .panel-body:after, .modal-footer:before, .modal-footer:after { display: table; content: " "; } .clearfix:after, .dl-horizontal dd:after, .container:after, .container-fluid:after, .row:after, .form-horizontal .form-group:after, .btn-toolbar:after, .btn-group-vertical > .btn-group:after, .nav:after, .navbar:after, .navbar-header:after, .navbar-collapse:after, .pager:after, .panel-body:after, .modal-footer:after { clear: both; } .center-block { display: block; margin-right: auto; margin-left: auto; } .pull-right { float: right !important; } .pull-left { float: left !important; } .hide { display: none !important; } .show { display: block !important; } .invisible { visibility: hidden; } .text-hide { font: 0/0 a; color: transparent; text-shadow: none; background-color: transparent; border: 0; } .hidden { display: none !important; } .affix { position: fixed; } @-ms-viewport { width: device-width; } .visible-xs, .visible-sm, .visible-md, .visible-lg { display: none !important; } .visible-xs-block, .visible-xs-inline, .visible-xs-inline-block, .visible-sm-block, .visible-sm-inline, .visible-sm-inline-block, .visible-md-block, .visible-md-inline, .visible-md-inline-block, .visible-lg-block, .visible-lg-inline, .visible-lg-inline-block { display: none !important; } @media (max-width: 767px) { .visible-xs { display: block !important; } table.visible-xs { display: table !important; } tr.visible-xs { display: table-row !important; } th.visible-xs, td.visible-xs { display: table-cell !important; } } @media (max-width: 767px) { .visible-xs-block { display: block !important; } } @media (max-width: 767px) { .visible-xs-inline { display: inline !important; } } @media (max-width: 767px) { .visible-xs-inline-block { display: inline-block !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm { display: block !important; } table.visible-sm { display: table !important; } tr.visible-sm { display: table-row !important; } th.visible-sm, td.visible-sm { display: table-cell !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm-block { display: block !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm-inline { display: inline !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm-inline-block { display: inline-block !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md { display: block !important; } table.visible-md { display: table !important; } tr.visible-md { display: table-row !important; } th.visible-md, td.visible-md { display: table-cell !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md-block { display: block !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md-inline { display: inline !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md-inline-block { display: inline-block !important; } } @media (min-width: 1200px) { .visible-lg { display: block !important; } table.visible-lg { display: table !important; } tr.visible-lg { display: table-row !important; } th.visible-lg, td.visible-lg { display: table-cell !important; } } @media (min-width: 1200px) { .visible-lg-block { display: block !important; } } @media (min-width: 1200px) { .visible-lg-inline { display: inline !important; } } @media (min-width: 1200px) { .visible-lg-inline-block { display: inline-block !important; } } @media (max-width: 767px) { .hidden-xs { display: none !important; } } @media (min-width: 768px) and (max-width: 991px) { .hidden-sm { display: none !important; } } @media (min-width: 992px) and (max-width: 1199px) { .hidden-md { display: none !important; } } @media (min-width: 1200px) { .hidden-lg { display: none !important; } } .visible-print { display: none !important; } @media print { .visible-print { display: block !important; } table.visible-print { display: table !important; } tr.visible-print { display: table-row !important; } th.visible-print, td.visible-print { display: table-cell !important; } } .visible-print-block { display: none !important; } @media print { .visible-print-block { display: block !important; } } .visible-print-inline { display: none !important; } @media print { .visible-print-inline { display: inline !important; } } .visible-print-inline-block { display: none !important; } @media print { .visible-print-inline-block { display: inline-block !important; } } @media print { .hidden-print { display: none !important; } } /*# sourceMappingURL=bootstrap.css.map */ ================================================ FILE: static/assets/css/components.css ================================================ /* Template Name: UBold Dashboard Author: CoderThemes Email: coderthemes@gmail.com File: Components */ /* ============= Buttons ============= */ .btn { border-radius: 3px; outline: none !important; } .btn-md { padding: 8px 16px; } .btn-primary, .btn-success, .btn-default, .btn-info, .btn-warning, .btn-danger, .btn-inverse, .btn-purple, .btn-pink { color: #ffffff !important; } .btn-default, .btn-default:hover, .btn-default:focus, .btn-default:active, .btn-default.active, .btn-default.focus, .btn-default:active, .btn-default:focus, .btn-default:hover, .open > .dropdown-toggle.btn-default { background-color: #5fbeaa !important; border: 1px solid #5fbeaa !important; } .btn-white, .btn-white:hover, .btn-white:focus, .btn-white:active, .btn-white.active, .btn-white.focus, .btn-white:active, .btn-white:focus, .btn-white:hover, .open > .dropdown-toggle.btn-white { border: 1px solid #eaeaea !important; background-color: #ffffff; color: #4c5667; } .btn-white:hover, .btn-white:hover:hover, .btn-white:focus:hover, .btn-white:active:hover, .btn-white.active:hover, .btn-white.focus:hover, .btn-white:active:hover, .btn-white:focus:hover, .btn-white:hover:hover, .open > .dropdown-toggle.btn-white:hover { background-color: #f9f9f9; } .btn-white:focus, .btn-white:hover:focus, .btn-white:focus:focus, .btn-white:active:focus, .btn-white.active:focus, .btn-white.focus:focus, .btn-white:active:focus, .btn-white:focus:focus, .btn-white:hover:focus, .open > .dropdown-toggle.btn-white:focus { background-color: #f9f9f9; } .btn-white:active, .btn-white:hover:active, .btn-white:focus:active, .btn-white:active:active, .btn-white.active:active, .btn-white.focus:active, .btn-white:active:active, .btn-white:focus:active, .btn-white:hover:active, .open > .dropdown-toggle.btn-white:active { background-color: #f9f9f9; } .btn-primary, .btn-primary:hover, .btn-primary:focus, .btn-primary:active, .btn-primary.active, .btn-primary.focus, .btn-primary:active, .btn-primary:focus, .btn-primary:hover, .open > .dropdown-toggle.btn-primary { background-color: #5d9cec !important; border: 1px solid #5d9cec !important; } .btn-success, .btn-success:hover, .btn-success:focus, .btn-success:active, .btn-success.active, .btn-success.focus, .btn-success:active, .btn-success:focus, .btn-success:hover, .open > .dropdown-toggle.btn-success { background-color: #81c868 !important; border: 1px solid #81c868 !important; } .btn-info, .btn-info:hover, .btn-info:focus, .btn-info:active, .btn-info.active, .btn-info.focus, .btn-info:active, .btn-info:focus, .btn-info:hover, .open > .dropdown-toggle.btn-info { background-color: #34d3eb !important; border: 1px solid #34d3eb !important; } .btn-warning, .btn-warning:hover, .btn-warning:focus, .btn-warning:active, .btn-warning.active, .btn-warning.focus, .btn-warning:active, .btn-warning:focus, .btn-warning:hover, .open > .dropdown-toggle.btn-warning { background-color: #ffbd4a !important; border: 1px solid #ffbd4a !important; } .btn-danger, .btn-danger:active, .btn-danger:focus, .btn-danger:hover, .btn-danger.active, .btn-danger.focus, .btn-danger:active, .btn-danger:focus, .btn-danger:hover, .open > .dropdown-toggle.btn-danger { background-color: #f05050 !important; border: 1px solid #f05050 !important; } .btn-inverse, .btn-inverse:hover, .btn-inverse:focus, .btn-inverse:active, .btn-inverse.active, .btn-inverse.focus, .btn-inverse:active, .btn-inverse:focus, .btn-inverse:hover, .open > .dropdown-toggle.btn-inverse { background-color: #4c5667 !important; border: 1px solid #4c5667 !important; color: #ffffff; } .btn-purple, .btn-purple:hover, .btn-purple:focus, .btn-purple:active { background-color: #7266ba !important; border: 1px solid #7266ba !important; color: #ffffff; } .btn-pink, .btn-pink:hover, .btn-pink:focus, .btn-pink:active { background-color: #fb6d9d !important; border: 1px solid #fb6d9d !important; color: #ffffff; } .open > .dropdown-toggle.btn-primary.btn-custom, .open > .dropdown-toggle.btn-success.btn-custom, .open > .dropdown-toggle.btn-info.btn-custom, .open > .dropdown-toggle.btn-warning.btn-custom, .open > .dropdown-toggle.btn-danger.btn-custom, .open > .dropdown-toggle.btn-default.btn-custom { border-width: 2px !important; color: #ffffff !important; } .open > .dropdown-toggle.btn-white.btn-custom { border-width: 2px !important; } .btn-custom.btn-default { color: #5fbeaa !important; } .btn-custom.btn-primary { color: #5d9cec !important; } .btn-custom.btn-success { color: #81c868 !important; } .btn-custom.btn-info { color: #34d3eb !important; } .btn-custom.btn-warning { color: #ffbd4a !important; } .btn-custom.btn-danger { color: #f05050 !important; } .btn-custom.btn-inverse { color: #4c5667 !important; } .btn-custom.btn-purple { color: #7266ba !important; } .btn-custom.btn-white { color: #4c5667 !important; } .btn-custom.btn-white:hover, .btn-custom.btn-white:focus, .btn-custom.btn-white:active { color: #4c5667 !important; background-color: #f4f8fb !important; } .btn-custom.btn-pink { color: #fb6d9d !important; } .btn-rounded { border-radius: 2em !important; padding: 6px 20px; } .btn-rounded .btn-label { padding: 7px 15px 7px 20px; margin-left: -20px; } .btn-rounded .btn-label-right { margin-right: -20px; margin-left: 12px; } .btn-custom { -moz-border-radius: 2px; -moz-transition: all 400ms ease-in-out; -o-transition: all 400ms ease-in-out; -webkit-border-radius: 2px; -webkit-transition: all 400ms ease-in-out; background: transparent; background-color: transparent !important; -webkit-border-radius: 5px; border-radius: 5px; -moz-border-radius: 5px; background-clip: padding-box; border-width: 2px !important; font-weight: 600; transition: all 400ms ease-in-out; background-clip: inherit; } .btn-custom:hover { color: #ffffff !important; border-width: 2px !important; } .btn-custom:focus { color: #ffffff !important; border-width: 2px !important; } .btn-label { background: rgba(0, 0, 0, 0.05); display: inline-block; padding: 7px 15px; border-radius: 3px 0 0 3px; margin: -7px -13px; margin-right: 12px; } .btn-label-right { margin-left: 12px; margin-right: -13px; border-radius: 0px 3px 3px 0px; } .btn-group.open .dropdown-toggle { box-shadow: none; } /* File Upload */ .fileupload { overflow: hidden; position: relative; } .fileupload input.upload { cursor: pointer; filter: alpha(opacity=0); font-size: 20px; margin: 0; opacity: 0; padding: 0; position: absolute; right: 0; top: 0; } /* Social Buttons */ .btn-facebook { color: #ffffff !important; background-color: #3b5998 !important; } .btn-twitter { color: #ffffff !important; background-color: #00aced !important; } .btn-linkedin { color: #ffffff !important; background-color: #007bb6 !important; } .btn-dribbble { color: #ffffff !important; background-color: #ea4c89 !important; } .btn-googleplus { color: #ffffff !important; background-color: #dd4b39 !important; } .btn-instagram { color: #ffffff !important; background-color: #517fa4 !important; } .btn-pinterest { color: #ffffff !important; background-color: #cb2027 !important; } .btn-dropbox { color: #ffffff !important; background-color: #007ee5 !important; } .btn-flickr { color: #ffffff !important; background-color: #ff0084 !important; } .btn-tumblr { color: #ffffff !important; background-color: #32506d !important; } .btn-skype { color: #ffffff !important; background-color: #00aff0 !important; } .btn-youtube { color: #ffffff !important; background-color: #bb0000 !important; } .btn-github { color: #ffffff !important; background-color: #171515 !important; } /* ============= Checkbox and Radios ============= */ .checkbox { padding-left: 20px; } .checkbox label { display: inline-block; padding-left: 5px; position: relative; } .checkbox label::before { -o-transition: 0.3s ease-in-out; -webkit-transition: 0.3s ease-in-out; background-color: #ffffff; border-radius: 3px; border: 1px solid #cccccc; content: ""; display: inline-block; height: 17px; left: 0; margin-left: -20px; position: absolute; transition: 0.3s ease-in-out; width: 17px; outline: none !important; } .checkbox label::after { color: #555555; display: inline-block; font-size: 11px; height: 16px; left: 0; margin-left: -20px; padding-left: 3px; padding-top: 1px; position: absolute; top: 0; width: 16px; } .checkbox input[type="checkbox"] { cursor: pointer; opacity: 0; z-index: 1; outline: none !important; } .checkbox input[type="checkbox"]:disabled + label { opacity: 0.65; } .checkbox input[type="checkbox"]:focus + label::before { outline-offset: -2px; outline: none; outline: thin dotted; } .checkbox input[type="checkbox"]:checked + label::after { content: "\f00c"; font-family: 'FontAwesome'; } .checkbox input[type="checkbox"]:disabled + label::before { background-color: #eeeeee; cursor: not-allowed; } .checkbox.checkbox-circle label::before { border-radius: 50%; } .checkbox.checkbox-inline { margin-top: 0; } .checkbox.checkbox-single label { height: 17px; } .checkbox-custom input[type="checkbox"]:checked + label::before { background-color: #5fbeaa; border-color: #5fbeaa; } .checkbox-custom input[type="checkbox"]:checked + label::after { color: #ffffff; } .checkbox-primary input[type="checkbox"]:checked + label::before { background-color: #5d9cec; border-color: #5d9cec; } .checkbox-primary input[type="checkbox"]:checked + label::after { color: #ffffff; } .checkbox-danger input[type="checkbox"]:checked + label::before { background-color: #f05050; border-color: #f05050; } .checkbox-danger input[type="checkbox"]:checked + label::after { color: #ffffff; } .checkbox-info input[type="checkbox"]:checked + label::before { background-color: #34d3eb; border-color: #34d3eb; } .checkbox-info input[type="checkbox"]:checked + label::after { color: #ffffff; } .checkbox-warning input[type="checkbox"]:checked + label::before { background-color: #ffbd4a; border-color: #ffbd4a; } .checkbox-warning input[type="checkbox"]:checked + label::after { color: #ffffff; } .checkbox-success input[type="checkbox"]:checked + label::before { background-color: #81c868; border-color: #81c868; } .checkbox-success input[type="checkbox"]:checked + label::after { color: #ffffff; } .checkbox-purple input[type="checkbox"]:checked + label::before { background-color: #7266ba; border-color: #7266ba; } .checkbox-purple input[type="checkbox"]:checked + label::after { color: #ffffff; } .checkbox-pink input[type="checkbox"]:checked + label::before { background-color: #fb6d9d; border-color: #fb6d9d; } .checkbox-pink input[type="checkbox"]:checked + label::after { color: #ffffff; } .checkbox-inverse input[type="checkbox"]:checked + label::before { background-color: #4c5667; border-color: #4c5667; } .checkbox-inverse input[type="checkbox"]:checked + label::after { color: #ffffff; } /* Radios */ .radio { padding-left: 20px; } .radio label { display: inline-block; padding-left: 5px; position: relative; } .radio label::before { -o-transition: border 0.5s ease-in-out; -webkit-transition: border 0.5s ease-in-out; background-color: #ffffff; border-radius: 50%; border: 1px solid #cccccc; content: ""; display: inline-block; height: 17px; left: 0; margin-left: -20px; position: absolute; transition: border 0.5s ease-in-out; width: 17px; outline: none !important; } .radio label::after { -moz-transition: -moz-transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33); -ms-transform: scale(0, 0); -o-transform: scale(0, 0); -o-transition: -o-transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33); -webkit-transform: scale(0, 0); -webkit-transition: -webkit-transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33); background-color: #555555; border-radius: 50%; content: " "; display: inline-block; height: 11px; left: 3px; margin-left: -20px; position: absolute; top: 3px; transform: scale(0, 0); transition: transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33); width: 11px; } .radio input[type="radio"] { cursor: pointer; opacity: 0; z-index: 1; outline: none !important; } .radio input[type="radio"]:disabled + label { opacity: 0.65; } .radio input[type="radio"]:focus + label::before { outline-offset: -2px; outline: 5px auto -webkit-focus-ring-color; outline: thin dotted; } .radio input[type="radio"]:checked + label::after { -ms-transform: scale(1, 1); -o-transform: scale(1, 1); -webkit-transform: scale(1, 1); transform: scale(1, 1); } .radio input[type="radio"]:disabled + label::before { cursor: not-allowed; } .radio.radio-inline { margin-top: 0; } .radio.radio-single label { height: 17px; } .radio-custom input[type="radio"] + label::after { background-color: #5fbeaa; } .radio-custom input[type="radio"]:checked + label::before { border-color: #5fbeaa; } .radio-custom input[type="radio"]:checked + label::after { background-color: #5fbeaa; } .radio-primary input[type="radio"] + label::after { background-color: #5d9cec; } .radio-primary input[type="radio"]:checked + label::before { border-color: #5d9cec; } .radio-primary input[type="radio"]:checked + label::after { background-color: #5d9cec; } .radio-danger input[type="radio"] + label::after { background-color: #f05050; } .radio-danger input[type="radio"]:checked + label::before { border-color: #f05050; } .radio-danger input[type="radio"]:checked + label::after { background-color: #f05050; } .radio-info input[type="radio"] + label::after { background-color: #34d3eb; } .radio-info input[type="radio"]:checked + label::before { border-color: #34d3eb; } .radio-info input[type="radio"]:checked + label::after { background-color: #34d3eb; } .radio-warning input[type="radio"] + label::after { background-color: #ffbd4a; } .radio-warning input[type="radio"]:checked + label::before { border-color: #ffbd4a; } .radio-warning input[type="radio"]:checked + label::after { background-color: #ffbd4a; } .radio-success input[type="radio"] + label::after { background-color: #81c868; } .radio-success input[type="radio"]:checked + label::before { border-color: #81c868; } .radio-success input[type="radio"]:checked + label::after { background-color: #81c868; } .radio-purple input[type="radio"] + label::after { background-color: #7266ba; } .radio-purple input[type="radio"]:checked + label::before { border-color: #7266ba; } .radio-purple input[type="radio"]:checked + label::after { background-color: #7266ba; } .radio-pink input[type="radio"] + label::after { background-color: #fb6d9d; } .radio-pink input[type="radio"]:checked + label::before { border-color: #fb6d9d; } .radio-pink input[type="radio"]:checked + label::after { background-color: #fb6d9d; } /* ============= Panels ============= */ .panel { border: none; margin-bottom: 20px; } .panel .panel-body { padding: 20px; } .panel .panel-body p { margin: 0px; } .panel .panel-body p + p { margin-top: 15px; } .panel-heading { border: none !important; padding: 10px 20px; } .panel-default > .panel-heading { background-color: #f4f8fb; border-bottom: none; color: #797979; } .panel-title { font-size: 15px; font-weight: 600; margin-bottom: 0; margin-top: 0; text-transform: uppercase; letter-spacing: 0.03em; } .panel-footer { background: #f4f8fb; border-top: 0px; } .panel-color .panel-title { color: #ffffff; } .panel-custom > .panel-heading { background-color: #5fbeaa; } .panel-primary > .panel-heading { background-color: #5d9cec; } .panel-success > .panel-heading { background-color: #81c868; } .panel-info > .panel-heading { background-color: #34d3eb; } .panel-warning > .panel-heading { background-color: #ffbd4a; } .panel-danger > .panel-heading { background-color: #f05050; } .panel-purple > .panel-heading { background-color: #7266ba; } .panel-pink > .panel-heading { background-color: #fb6d9d; } .panel-inverse > .panel-heading { background-color: #4c5667; } .panel-border .panel-heading { background-color: #ffffff; border-top: 3px solid #DADFE2 !important; padding: 10px 20px 0px; } .panel-border .panel-body { padding: 15px 20px 20px 20px; } .panel-border.panel-custom .panel-heading { border-color: #5fbeaa !important; color: #5fbeaa !important; } .panel-border.panel-primary .panel-heading { border-color: #5d9cec !important; color: #5d9cec !important; } .panel-border.panel-success .panel-heading { border-color: #81c868 !important; color: #81c868 !important; } .panel-border.panel-info .panel-heading { border-color: #34d3eb !important; color: #34d3eb !important; } .panel-border.panel-warning .panel-heading { border-color: #ffbd4a !important; color: #ffbd4a !important; } .panel-border.panel-danger .panel-heading { border-color: #f05050 !important; color: #f05050 !important; } .panel-border.panel-purple .panel-heading { border-color: #7266ba !important; color: #7266ba !important; } .panel-border.panel-pink .panel-heading { border-color: #fb6d9d !important; color: #fb6d9d !important; } .panel-border.panel-inverse .panel-heading { border-color: #4c5667 !important; color: #4c5667 !important; } .panel-group .panel .panel-heading a[data-toggle=collapse].collapsed:before { content: '\f0d7'; } .panel-group .panel .panel-heading .accordion-toggle.collapsed:before { content: '\f0d7'; } .panel-group .panel .panel-heading a[data-toggle=collapse] { display: block; } .panel-group .panel .panel-heading a[data-toggle=collapse]:before { content: '\f0d8'; display: block; float: right; font-family: 'FontAwesome'; font-size: 14px; text-align: right; width: 25px; } .panel-group .panel .panel-heading .accordion-toggle { display: block; } .panel-group .panel .panel-heading .accordion-toggle:before { content: '\f0d8'; display: block; float: right; font-family: 'FontAwesome'; font-size: 14px; text-align: right; width: 25px; } .panel-group .panel .panel-heading + .panel-collapse .panel-body { border-top: none; } .panel-group .panel-heading { padding: 12px 26px; } .panel-group.panel-group-joined .panel + .panel { border-top: 1px solid #eeeeee; margin-top: 0; } .panel-group-joined .panel-group .panel + .panel { border-top: 1px solid #eeeeee; margin-top: 0; } .panel .nav-pills li a { color: #4c5667 !important; } .panel .nav-pills li.active a { color: #ffffff !important; } /* ============= Portlets ============= */ .portlet { background: #ffffff; border: 1px solid rgba(54, 64, 74, 0.05); -webkit-border-radius: 5px; border-radius: 5px; -moz-border-radius: 5px; background-clip: padding-box; margin-bottom: 20px; } .portlet .portlet-heading { -webkit-border-radius: 3px 3px 0px 0px; border-radius: 3px 3px 0px 0px; -moz-border-radius: 3px 3px 0px 0px; background-clip: padding-box; color: #ffffff; padding: 12px 20px; } .portlet .portlet-heading .portlet-title { color: #ffffff; float: left; font-size: 15px; font-weight: 600; margin-bottom: 0; margin-top: 0; text-transform: uppercase; letter-spacing: 0.03em; } .portlet .portlet-heading .portlet-widgets { display: inline-block; float: right; font-size: 15px; line-height: 30px; padding-left: 15px; position: relative; text-align: right; } .portlet .portlet-heading .portlet-widgets .divider { margin: 0 5px; } .portlet .portlet-heading .portlet-widgets .collapsed .ion-minus-round:before { content: "\f217" !important; } .portlet .portlet-heading a { color: #999999; } .portlet .portlet-body { -moz-border-radius-bottomleft: 5px; -moz-border-radius-bottomright: 5px; -webkit-border-bottom-left-radius: 5px; -webkit-border-bottom-right-radius: 5px; background: #ffffff; border-bottom-left-radius: 5px; border-bottom-right-radius: 5px; padding: 15px; } .portlet-default .portlet-title { color: #797979 !important; } .portlet .portlet-heading.bg-custom a, .portlet .portlet-heading.bg-purple a, .portlet .portlet-heading.bg-info a, .portlet .portlet-heading.bg-success a, .portlet .portlet-heading.bg-primary a, .portlet .portlet-heading.bg-danger a, .portlet .portlet-heading.bg-warning a, .portlet .portlet-heading.bg-inverse a, .portlet .portlet-heading.bg-pink a { color: #ffffff; } .panel-disabled { background: rgba(243, 242, 241, 0.5); bottom: 15px; left: 0px; position: absolute; right: -5px; top: 0; } .loader-1 { -moz-animation: loaderAnimate 1000ms linear infinite; -o-animation: loaderAnimate 1000ms linear infinite; -webkit-animation: loaderAnimate 1000ms linear infinite; animation: loaderAnimate 1000ms linear infinite; clip: rect(0, 30px, 30px, 15px); height: 30px; left: 50%; margin-left: -15px; margin-top: -15px; position: absolute; top: 50%; width: 30px; } .loader-1:after { -moz-animation: loaderAnimate2 1000ms ease-in-out infinite; -o-animation: loaderAnimate2 1000ms ease-in-out infinite; -webkit-animation: loaderAnimate2 1000ms ease-in-out infinite; animation: loaderAnimate2 1000ms ease-in-out infinite; border-radius: 50%; clip: rect(0, 30px, 30px, 15px); content: ''; height: 30px; position: absolute; width: 30px; } /* ============= Progressbars ============= */ .progress { -webkit-box-shadow: none !important; background-color: #ebeff2; box-shadow: none !important; height: 10px; margin-bottom: 18px; overflow: hidden; } .progress-bar { box-shadow: none; font-size: 8px; font-weight: 600; line-height: 12px; } .progress.progress-sm { height: 5px !important; } .progress.progress-sm .progress-bar { font-size: 8px; line-height: 5px; } .progress.progress-md { height: 15px !important; } .progress.progress-md .progress-bar { font-size: 10.8px; line-height: 14.4px; } .progress.progress-lg { height: 20px !important; } .progress.progress-lg .progress-bar { font-size: 12px; line-height: 20px; } .progress-bar-primary { background-color: #5d9cec; } .progress-bar-success { background-color: #81c868; } .progress-bar-info { background-color: #34d3eb; } .progress-bar-warning { background-color: #ffbd4a; } .progress-bar-danger { background-color: #f05050; } .progress-bar-inverse { background-color: #4c5667; } .progress-bar-purple { background-color: #7266ba; } .progress-bar-pink { background-color: #fb6d9d; } .progress-bar-custom { background-color: #5fbeaa; } .progress-animated { -webkit-animation-duration: 5s; -webkit-animation-name: animationProgress; -webkit-transition: 5s all; animation-duration: 5s; animation-name: animationProgress; transition: 5s all; } /* Progressbar Vertical */ .progress-vertical { min-height: 250px; height: 250px; width: 10px; position: relative; display: inline-block; margin-bottom: 0; margin-right: 20px; } .progress-vertical .progress-bar { width: 100%; } .progress-vertical-bottom { min-height: 250px; height: 250px; position: relative; width: 10px; display: inline-block; margin-bottom: 0; margin-right: 20px; } .progress-vertical-bottom .progress-bar { width: 100%; position: absolute; bottom: 0; } .progress-vertical.progress-sm, .progress-vertical-bottom.progress-sm { width: 5px !important; } .progress-vertical.progress-sm .progress-bar, .progress-vertical-bottom.progress-sm .progress-bar { font-size: 8px; line-height: 5px; } .progress-vertical.progress-md, .progress-vertical-bottom.progress-md { width: 15px !important; } .progress-vertical.progress-md .progress-bar, .progress-vertical-bottom.progress-md .progress-bar { font-size: 10.8px; line-height: 14.4px; } .progress-vertical.progress-lg, .progress-vertical-bottom.progress-lg { width: 20px !important; } .progress-vertical.progress-lg .progress-bar, .progress-vertical-bottom.progress-lg .progress-bar { font-size: 12px; line-height: 20px; } /* ============= Tables ============= */ .table { margin-bottom: 10px; } .table-striped > tbody > tr:nth-of-type(odd), .table-hover > tbody > tr:hover, .table > thead > tr > td.active, .table > tbody > tr > td.active, .table > tfoot > tr > td.active, .table > thead > tr > th.active, .table > tbody > tr > th.active, .table > tfoot > tr > th.active, .table > thead > tr.active > td, .table > tbody > tr.active > td, .table > tfoot > tr.active > td, .table > thead > tr.active > th, .table > tbody > tr.active > th, .table > tfoot > tr.active > th { background-color: #f4f8fb !important; } .table > thead > tr > th, .table > tbody > tr > th, .table > tfoot > tr > th, .table > thead > tr > td, .table > tbody > tr > td, .table > tfoot > tr > td, .table > thead > tr > th, .table-bordered { border-top: 1px solid #ebeff2; } .table-bordered > thead > tr > th, .table-bordered > tbody > tr > th, .table-bordered > tfoot > tr > th, .table-bordered > thead > tr > td, .table-bordered > tbody > tr > td, .table-bordered > tfoot > tr > td { border: 1px solid #ebeff2; } .table > thead > tr > th { vertical-align: bottom; border-bottom: 2px solid #ebeff2; } tbody { color: #797979; } th { color: #666666; font-weight: 600; } .table-bordered { border: 1px solid #ebeff2; } table.focus-on tbody tr.focused th { background-color: #5fbeaa; color: #ffffff; } table.focus-on tbody tr.focused td { background-color: #5fbeaa; color: #ffffff; } .table-rep-plugin .table-responsive { border: none !important; } .table-rep-plugin tbody th { font-size: 14px; font-weight: normal; } .table-rep-plugin .checkbox-row { padding-left: 40px; } .table-rep-plugin .checkbox-row label { display: inline-block; padding-left: 5px; position: relative; } .table-rep-plugin .checkbox-row label::before { -o-transition: 0.3s ease-in-out; -webkit-transition: 0.3s ease-in-out; background-color: #ffffff; border-radius: 3px; border: 1px solid #cccccc; content: ""; display: inline-block; height: 17px; left: 0; margin-left: -20px; position: absolute; transition: 0.3s ease-in-out; width: 17px; outline: none !important; } .table-rep-plugin .checkbox-row label::after { color: #555555; display: inline-block; font-size: 11px; height: 16px; left: 0; margin-left: -20px; padding-left: 3px; padding-top: 1px; position: absolute; top: -1px; width: 16px; } .table-rep-plugin .checkbox-row input[type="checkbox"] { cursor: pointer; opacity: 0; z-index: 1; outline: none !important; } .table-rep-plugin .checkbox-row input[type="checkbox"]:disabled + label { opacity: 0.65; } .table-rep-plugin .checkbox-row input[type="checkbox"]:focus + label::before { outline-offset: -2px; outline: none; } .table-rep-plugin .checkbox-row input[type="checkbox"]:checked + label::after { content: "\f00c"; font-family: 'FontAwesome'; } .table-rep-plugin .checkbox-row input[type="checkbox"]:disabled + label::before { background-color: #eeeeee; cursor: not-allowed; } .table-rep-plugin .checkbox-row input[type="checkbox"]:checked + label::before { background-color: #5fbeaa; border-color: #5fbeaa; } .table-rep-plugin .checkbox-row input[type="checkbox"]:checked + label::after { color: #ffffff; } .fixed-table-container tbody .selected td { background-color: #F4F8FB; } .modal-block { background: transparent; margin: 40px auto; max-width: 600px; padding: 0; position: relative; text-align: left; } /* Data table */ #datatable-editable .actions a { padding: 5px; } #datatable-editable .form-control { background-color: #ffffff; width: 100%; } #datatable-editable .fa-trash-o { color: #f05050; } #datatable-editable .fa-times { color: #f05050; } #datatable-editable .fa-pencil { color: #29b6f6; } #datatable-editable .fa-save { color: #33b86c; } #datatable td { font-weight: normal; } div.dataTables_paginate ul.pagination { margin-top: 30px; } div.dataTables_info { padding-top: 38px; } /* Footable */ .footable-odd { background-color: #ffffff; } .footable-detail-show { background-color: #ebeff2; } .footable-row-detail { background-color: #F0F4F7; } /* Bootstrap Table */ .fixed-table-pagination .pagination-detail, .fixed-table-pagination div.pagination { margin-top: 20px; } .fixed-table-container { border: 1px solid #ebeff2 !important; } .bootstrap-table .table > thead > tr > th { border-bottom: 2px solid #ebeff2; background: #ebeff2; } .fixed-table-container thead th .th-inner { padding: 9px 12px; } .bootstrap-table .table, .bootstrap-table .table > tbody > tr > td, .bootstrap-table .table > tbody > tr > th, .bootstrap-table .table > tfoot > tr > td, .bootstrap-table .table > tfoot > tr > th, .bootstrap-table .table > thead > tr > td { padding: 8px 12px !important; } /* ============= Widget ============= */ /* Widget-box styles */ .widget-box-1 i.inform { font-size: 20px; cursor: pointer; } .widget-box-1 h4 { margin-bottom: 5px; margin-top: 0px; } .widget-box-1 h2 { margin: 20px; font-weight: 600; } .widget-box-1 p { margin-bottom: 0px; } .widget-s-1 { border-radius: 6px; } /* Widget (background-icon) */ .widget-bg-color-icon .bg-icon { height: 80px; width: 80px; text-align: center; -webkit-border-radius: 50%; border-radius: 50%; -moz-border-radius: 50%; background-clip: padding-box; } .widget-bg-color-icon .bg-icon i { font-size: 32px; line-height: 80px; } .widget-bg-color-icon .bg-icon-info { background-color: rgba(52, 211, 235, 0.2); border: 1px solid #34d3eb; } .widget-bg-color-icon .bg-icon-primary { background-color: rgba(93, 156, 236, 0.2); border: 1px solid #5d9cec; } .widget-bg-color-icon .bg-icon-pink { background-color: rgba(251, 109, 157, 0.2); border: 1px solid #fb6d9d; } .widget-bg-color-icon .bg-icon-purple { background-color: rgba(114, 102, 186, 0.2); border: 1px solid #7266ba; } .widget-bg-color-icon .bg-icon-success { background-color: rgba(129, 200, 104, 0.2); border: 1px solid #81c868; } .widget-bg-color-icon .bg-icon-custom { background-color: rgba(95, 190, 170, 0.2); border: 1px solid #5fbeaa; } .widget-bg-color-icon .bg-icon-warning { background-color: rgba(255, 189, 74, 0.2); border: 1px solid #ffbd4a; } .widget-bg-color-icon .bg-icon-danger { background-color: rgba(240, 80, 80, 0.2); border: 1px solid #f05050; } .widget-bg-color-icon .bg-icon-inverse { background-color: rgba(76, 86, 103, 0.2); border: 1px solid #4c5667; } .mini-stat-icon { -moz-border-radius: 100%; -webkit-border-radius: 100%; border-radius: 100%; background-color: rgba(255, 255, 255, 0.2); display: inline-block; float: left; font-size: 30px; height: 60px; line-height: 60px; margin-right: 10px; text-align: center; width: 60px; } .mini-stat-info { padding-top: 2px; color: #eeeeee; } .mini-stat-info span { color: #ffffff; display: block; font-size: 24px; font-weight: 600; } .mini-stat-info span.name { color: #ffffff; display: block; font-size: 18px; font-weight: 600; margin-top: 5px; } .widget-inline { padding: 20px 0px !important; } .widget-inline .col-lg-3 { padding: 0px; } .widget-inline .widget-inline-box { border-right: 1px solid #e3e8f1; padding: 20px; } .widget-inline .widget-inline-box i { font-size: 32px; } /* Inbox-widget */ .inbox-widget .inbox-item { border-bottom: 1px solid #f1f1f1; overflow: hidden; padding: 10px 0; position: relative; } .inbox-widget .inbox-item .inbox-item-img { display: block; float: left; margin-right: 15px; width: 40px; } .inbox-widget .inbox-item img { width: 40px; } .inbox-widget .inbox-item .inbox-item-author { color: #333333; display: block; margin: 0; } .inbox-widget .inbox-item .inbox-item-text { color: #a0a0a0; display: block; font-size: 12px; margin: 0; } .inbox-widget .inbox-item .inbox-item-date { color: #a9a9a9; font-size: 11px; position: absolute; right: 7px; top: 2px; } /* Chat widget */ .conversation-list { list-style: none; height: 332px; padding: 0px 20px; } .conversation-list li { margin-bottom: 24px; } .conversation-list .chat-avatar { display: inline-block; float: left; text-align: center; width: 42px; } .conversation-list .chat-avatar img { border-radius: 100%; width: 100%; } .conversation-list .chat-avatar i { font-size: 12px; font-style: normal; } .conversation-list .ctext-wrap { -moz-border-radius: 3px; -webkit-border-radius: 3px; background: #f4f8fb; border-radius: 3px; display: inline-block; padding: 12px; position: relative; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); } .conversation-list .ctext-wrap i { color: #1a2942; display: block; font-size: 12px; font-style: normal; font-weight: bold; position: relative; } .conversation-list .ctext-wrap p { margin: 0px; padding-top: 3px; } .conversation-list .ctext-wrap:after { right: 100%; top: 0%; border: solid transparent; content: " "; height: 0; width: 0; position: absolute; pointer-events: none; border-top-color: #f4f8fb; border-width: 8px; margin-left: -1px; border-right-color: #f4f8fb; } .conversation-list .conversation-text { display: inline-block; float: left; font-size: 12px; margin-left: 12px; width: 70%; } .conversation-list .odd .chat-avatar { float: right !important; } .conversation-list .odd .conversation-text { float: right !important; margin-right: 12px; text-align: right; width: 70% !important; } .conversation-list .odd .ctext-wrap:after { border-color: rgba(238, 238, 242, 0) !important; border-left-color: #f4f8fb !important; border-top-color: #f4f8fb !important; left: 100% !important; margin-right: -1px; } .chat-send { padding-left: 0px; padding-right: 30px; } .chat-send button { width: 100%; } .chat-inputbar { padding-left: 30px; } /* Todos widget */ #todo-message { font-size: 16px; } .todo-list li { border-bottom: 1px solid #eeeeee; border-radius: 0px; border: 0px; margin: 0px; padding: 1px; color: #98a6ad; } .todo-list li:last-of-type { border-bottom: none; } .todo-send { padding-left: 0px; } /* Widget-chart */ .widget-chart ul li { width: 31.5%; display: inline-block; padding: 0px; } .widget-panel { padding: 30px 20px; padding-left: 30px; border-radius: 4px; position: relative; margin-bottom: 20px; } .widget-panel i { font-size: 60px; padding: 30px; background: rgba(255, 255, 255, 0.2); position: absolute; right: 0px; bottom: 0px; top: 0px; line-height: 60px; } .widget-style-2 i { background: rgba(244, 248, 251, 0.6) !important; font-size: 48px; padding: 30px 40px; } /* Google maps */ .gmap iframe { width: 100%; margin: 0px !important; padding: 0px !important; } .gmap-info:before { color: #333333; content: "\f041"; font-family: "FontAwesome"; font-size: 35px; left: 10px; position: absolute; top: 8px; } .gmap-info { float: left; padding: 0 20px 0 50px; position: relative; } .gmap-buttons { float: right; margin-top: 28px; } .gmap-buttons .btn { margin-left: 3px; } /* Google maps ends */ /* Table with Action */ .table-actions-bar tr td { vertical-align: middle !important; } .table-actions-bar .table-action-btn { color: #98a6ad; display: inline-block; width: 28px; border-radius: 50%; text-align: center; line-height: 24px; font-size: 20px; } .table-actions-bar .table-action-btn:hover { color: #5fbeaa; border-color: #5fbeaa; } /* Transaction */ .transaction-list li { padding: 7px 0px; border-bottom: 1px solid #ebeff2; clear: both; position: relative; } .transaction-list i { width: 20px; position: absolute; top: 10px; font-size: 12px; } .transaction-list .tran-text { padding-left: 25px; white-space: nowrap; display: inline-block; overflow: hidden; text-overflow: ellipsis; width: 115px; } .transaction-list .tran-price { margin-left: 30px; } /* Friend list */ .friend-list a { margin: 5px; display: inline-block; } .friend-list .extra-number { height: 48px; width: 48px; display: block; line-height: 48px; color: #98a6ad; font-weight: 700; background-color: #ebeff2; border-radius: 50%; border: 1px solid #98a6ad; } /* Profile widget */ .profile-widget .bg-profile { height: 125px; } .profile-widget .img-thumbnail { margin-top: -42px; border: none; } .profile-widget .widget-list { padding: 10px; margin-top: 20px; margin-left: 0px; padding-bottom: 30px; } .profile-widget .widget-list span { display: block; font-weight: bold; font-size: 18px; } /* Bar widget */ .bar-widget .iconbox { display: inline-block; height: 50px; width: 50px; margin-right: 20px; -webkit-border-radius: 50%; border-radius: 50%; -moz-border-radius: 50%; background-clip: padding-box; color: #ffffff; text-align: center; } .bar-widget .iconbox i { line-height: 50px; font-size: 20px; } /* ============= Form elements ============= */ .error { color: #f05050; font-size: 12px; font-weight: 500; } .parsley-error { border-color: #f05050 !important; } .parsley-errors-list { display: none; margin: 0; padding: 0; } .parsley-errors-list.filled { display: block; } .parsley-errors-list > li { font-size: 12px; list-style: none; color: #f6504d; } .datepicker { padding: 8px; } .datepicker th { font-size: 14px !important; } .datepicker table tr td.today, .datepicker table tr td.today:hover, .datepicker table tr td.today.disabled, .datepicker table tr td.today.disabled:hover, .datepicker table tr td.selected, .datepicker table tr td.selected:hover, .datepicker table tr td.selected.disabled, .datepicker table tr td.selected.disabled:hover, .datepicker table tr td span.active, .datepicker table tr td span.active:hover, .datepicker table tr td span.active.disabled, .datepicker table tr td span.active.disabled:hover { background-image: none; } .datepicker table tr td span.active:hover, .datepicker table tr td span.active:hover:hover, .datepicker table tr td span.active.disabled:hover, .datepicker table tr td span.active.disabled:hover:hover, .datepicker table tr td span.active:active, .datepicker table tr td span.active:hover:active, .datepicker table tr td span.active.disabled:active, .datepicker table tr td span.active.disabled:hover:active, .datepicker table tr td span.active.active, .datepicker table tr td span.active:hover.active, .datepicker table tr td span.active.disabled.active, .datepicker table tr td span.active.disabled:hover.active, .datepicker table tr td span.active.disabled, .datepicker table tr td span.active:hover.disabled, .datepicker table tr td span.active.disabled.disabled, .datepicker table tr td span.active.disabled:hover.disabled, .datepicker table tr td span.active[disabled], .datepicker table tr td span.active:hover[disabled], .datepicker table tr td span.active.disabled[disabled], .datepicker table tr td span.active.disabled:hover[disabled] { background-color: #5fbeaa; } .datepicker table tr td.active, .datepicker table tr td.active:hover, .datepicker table tr td.active.disabled, .datepicker table tr td.active.disabled:hover { background-color: #5fbeaa !important; background-image: none; box-shadow: none; text-shadow: none; } .datepicker thead tr:first-child th:hover, .datepicker tfoot tr th:hover { background-color: #fafafa; } .datepicker-inline { border: 2px solid #eeeeee; } .daterangepicker td.active, .daterangepicker td.active:hover { background-color: #5d9cec; border-color: #5d9cec; } .daterangepicker .input-mini.active { border: 1px solid #AAAAAA; } .daterangepicker .ranges li { -webkit-border-radius: 2px; border-radius: 2px; -moz-border-radius: 2px; background-clip: padding-box; color: #36404a; font-weight: 600; font-size: 12px; } .daterangepicker select.hourselect, .daterangepicker select.minuteselect, .daterangepicker select.secondselect, .daterangepicker select.ampmselect { border: 1px solid #e3e3e3; padding: 2px; width: 60px; } .daterangepicker .ranges li.active, .daterangepicker .ranges li:hover { background-color: #5d9cec; border: 1px solid #5d9cec; } .search-input { margin-bottom: 10px; } .ms-selectable { box-shadow: none; outline: none !important; } .ms-container .ms-list.ms-focus { box-shadow: none; } .ms-container .ms-selectable li.ms-hover { background-color: #5d9cec; } .ms-container .ms-selection li.ms-hover { background-color: #5d9cec; } .note-editor { border: 1px solid #eeeeee; position: relative; } .note-editor .note-toolbar { background-color: #f4f8fb; border-bottom: 1px solid #eeeeee; margin: 0; } .note-editor .note-statusbar { background-color: #ffffff; } .note-editor .note-statusbar .note-resizebar { border-top: none; height: 15px; padding-top: 3px; } .note-popover .popover .popover-content { padding: 5px 0 10px 5px; } .note-toolbar { padding: 5px 0 10px 5px; } .code-edit-wrap { padding: 0px !important; } .cm-s-ambiance .CodeMirror-linenumber { color: #bcbcbc; } .cm-s-ambiance .CodeMirror-gutters { background-color: #4c5667 !important; box-shadow: none; } .cm-s-ambiance.CodeMirror { background-color: #4c5667 !important; box-shadow: none; } .bootstrap-timepicker-widget table td a:hover { background-color: transparent; border-color: transparent; border-radius: 4px; color: #5d9cec; text-decoration: none; } .editor-horizontal .popover-content { padding: 9px 30px; } .wizard > .content { background: #ffffff; min-height: 240px; padding: 20px; } .wizard > .content > .body { padding: 0px; } .wizard > .content > .body input { border: 1px solid #E3E3E3; } .wizard > .content > .body ul > li { display: block; line-height: 30px; } .wizard > .content > .body label.error { color: #f05050; margin-left: 0; } .wizard > .content > .body label { display: inline-block; margin-top: 10px; } .wizard > .steps .number { border-radius: 50%; background-color: rgba(255, 255, 255, 0.3); display: inline-block; line-height: 30px; margin-right: 10px; width: 30px; text-align: center; } .wizard > .steps .disabled a { background: #ffffff; color: #333333; cursor: default; border: 1px solid #eaeaea; } .wizard > .steps .disabled a:hover { background: #f9f9f9; color: #333333; cursor: default; border: 1px solid #eaeaea; } .wizard > .steps .disabled a:active { background: #f9f9f9; color: #333333; cursor: default; border: 1px solid #eaeaea; } .wizard > .steps .current a { background: #5fbeaa; } .wizard > .steps .current a:hover { background: #5fbeaa; } .wizard > .steps .current a:hover .number { color: #ffffff; } .wizard > .steps .current a:active { background: #5fbeaa; } .wizard > .steps .current a:active .number { color: #ffffff; } .wizard > .steps .current a .number { color: #ffffff; } .wizard > .steps .done a { background: #7a8c9a; } .wizard > .steps .done a:hover { background: #7a8c9a; } .wizard > .steps .done a:active { background: #7a8c9a; } .wizard > .steps a, .wizard > .steps a:hover, .wizard > .steps a:active, .wizard > .content { border-radius: 2px; } .wizard > .actions a { background: #5fbeaa; border-radius: 2px; color: #ffffff; } .wizard > .actions a:hover { background: #5fbeaa; border-radius: 2px; color: #ffffff; } .wizard > .actions a:active { background: #5fbeaa; border-radius: 2px; color: #ffffff; } .wizard > .actions .disabled a { background: #ffffff; color: #333333; cursor: default; border: 1px solid #eaeaea; } .wizard > .actions .disabled a:hover { background: #f9f9f9; color: #333333; cursor: default; border: 1px solid #eaeaea; } .wizard > .actions .disabled a:active { background: #f9f9f9; color: #333333; cursor: default; border: 1px solid #eaeaea; } /* Dropzone */ .dropzone { min-height: 230px; border: 2px dashed rgba(0, 0, 0, 0.3); background: white; border-radius: 6px; } .dropzone .dz-message { font-size: 30px; } /* X-Editable */ .editable-click, a.editable-click, a.editable-click:hover { border: none; } /* Image crop */ .img-container, .img-preview { background-color: #f7f7f7; overflow: hidden; width: 100%; text-align: center; } .img-container { min-height: 200px; max-height: 466px; margin-bottom: 20px; } @media (min-width: 768px) { .img-container { min-height: 466px; } } .img-container > img { max-width: 100%; } .docs-preview { margin-right: -15px; margin-bottom: 10px; } .img-preview { float: left; margin-right: 10px; margin-bottom: 10px; } .img-preview > img { max-width: 100%; } /* Sweet Alert */ .sweet-alert p { font-size: 14px; font-weight: 400; line-height: 22px; } button.confirm { background-color: #5fbeaa !important; box-shadow: none !important; } ================================================ FILE: static/assets/css/core.css ================================================ /*@import url(https://fonts.gmirror.org/css?family=Noto+Sans:400,700); @import url(https://fonts.gmirror.org/css?family=Source+Sans+Pro:400,600,700,300);*/ /* Template Name: UBold Dashboard Author: CoderThemes Email: coderthemes@gmail.com File: Common */ body { background: #ebeff2; font-family: 'Noto Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; margin: 0; overflow-x: hidden; color: #797979; } html { position: relative; min-height: 100%; background: #ebeff2; } h1, h2, h3, h4, h5, h6 { color: #505458; font-family: "Source Sans Pro", "Helvetica Neue", Helvetica, Arial, sans-serif; margin: 10px 0; } h1 { line-height: 43px; } h2 { line-height: 35px; } h3 { line-height: 30px; } h3 small { color: #444444; } h4 { line-height: 22px; } h4 small { color: #444444; } h5 { font-size: 15px; } h5 small { color: #444444; } p { line-height: 1.6; } * { outline: none !important; } b { font-weight: 600; } a:hover { outline: 0; text-decoration: none; } a:active { outline: 0; text-decoration: none; } a:focus { outline: 0; text-decoration: none; } .container { width: auto; } .container-alt { margin-left: auto; margin-right: auto; padding-left: 15px; padding-right: 15px; } /* Footer */ .footer { border-top: 1px solid rgba(0, 0, 0, 0.1); bottom: 0px; color: #58666e; text-align: left !important; padding: 20px 30px; position: absolute; right: 0px; left: 240px; } #wrapper { height: 100%; overflow: hidden; width: 100%; } .page { bottom: 0; left: 0; right: 0; top: 0; } /* Page titles */ .page-title { font-size: 20px; font-weight: 600; margin-bottom: 0px; margin-top: 7px; } .page-title-alt { margin-bottom: 23px; margin-top: 10px; } .page-header { border-bottom: 1px solid #DBDDDE; } .header-title { text-transform: uppercase; font-size: 16px; font-weight: 600; letter-spacing: 0.04em; line-height: 16px; margin-bottom: 8px; } .social-links li a { -webkit-border-radius: 50%; background: #EFF0F4; border-radius: 50%; color: #7A7676; display: inline-block; height: 30px; line-height: 30px; text-align: center; width: 30px; } /* File: Helper clasess */ .p-0 { padding: 0px !important; } .p-20 { padding: 20px !important; } .p-30 { padding: 30px !important; } .p-l-0 { padding-left: 0px !important; } .p-r-0 { padding-right: 0px !important; } .p-t-0 { padding-top: 0px !important; } .p-t-10 { padding-top: 10px !important; } .p-b-10 { padding-bottom: 10px !important; } .p-l-r-10 { padding-left: 10px; padding-right: 10px; } .m-0 { margin: 0px !important; } .m-r-5 { margin-right: 5px !important; } .m-r-10 { margin-right: 10px !important; } .m-r-15 { margin-right: 15px !important; } .m-l-5 { margin-left: 5px !important; } .m-l-10 { margin-left: 10px !important; } .m-l-15 { margin-left: 15px !important; } .m-t-5 { margin-top: 5px !important; } .m-t-0 { margin-top: 0px !important; } .m-t-10 { margin-top: 10px !important; } .m-t-15 { margin-top: 15px !important; } .m-t-20 { margin-top: 20px !important; } .m-t-30 { margin-top: 30px !important; } .m-t-40 { margin-top: 40px !important; } .m-b-0 { margin-bottom: 0px !important; } .m-b-5 { margin-bottom: 5px !important; } .m-b-10 { margin-bottom: 10px !important; } .m-b-15 { margin-bottom: 15px !important; } .m-b-20 { margin-bottom: 20px !important; } .m-b-30 { margin-bottom: 30px !important; } .w-xs { min-width: 80px; } .w-sm { min-width: 95px; } .w-md { min-width: 110px; } .w-lg { min-width: 140px; } .m-h-40 { min-height: 40px; } .m-h-50 { min-height: 50px; } .l-h-34 { line-height: 34px; } .font-600 { font-weight: 600; } .font-bold { font-weight: 700; } .font-normal { font-weight: normal; } .font-light { font-weight: 300; } .font-13 { font-size: 13px !important; } .wrapper-md { padding: 20px; } .pull-in { margin-left: -15px; margin-right: -15px; } .b-0 { border: none !important; } .vertical-middle { vertical-align: middle; } .bx-shadow { -moz-box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.1); -webkit-box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.1); box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.1); } .mx-box { max-height: 380px; min-height: 380px; } .thumb-sm { height: 32px; width: 32px; } .thumb-md { height: 48px; width: 48px; } .thumb-lg { height: 88px; width: 88px; } /* Table type box */ .table-box { display: table; height: 100%; width: 100%; } .table-box .table-detail { display: table-cell; vertical-align: middle; } /* Card Box */ .card-box { padding: 20px; border: 1px solid rgba(54, 64, 74, 0.05); -webkit-border-radius: 5px; border-radius: 5px; -moz-border-radius: 5px; background-clip: padding-box; margin-bottom: 20px; background-color: #ffffff; } .grid-structure .grid-container { background-color: #f4f8fb; margin-bottom: 10px; padding: 10px 20px; } .icon-list-demo div { cursor: pointer; line-height: 45px; white-space: nowrap; color: #75798B; } .icon-list-demo div:hover { color: #ffffff; } .icon-list-demo div p { margin-bottom: 0px; } .icon-list-demo i { -webkit-transition: all 0.2s; -webkit-transition: font-size 0.2s; display: inline-block; font-size: 18px; margin: 0; text-align: center; transition: all 0.2s; transition: font-size 0.2s; vertical-align: middle; width: 40px; } .icon-list-demo .col-md-4 { -webkit-border-radius: 3px; border-radius: 3px; -moz-border-radius: 3px; background-clip: padding-box; } .icon-list-demo .col-md-4:hover { background-color: #5fbeaa; } .icon-list-demo .col-md-4:hover i { -o-transform: scale(2); -webkit-transform: scale(2); moz-transform: scale(2); transform: scale(2); } .button-list { margin-left: -8px; margin-bottom: -12px; } .button-list .btn { margin-bottom: 12px; margin-left: 8px; } /* File: Bootstrap-custom */ .row { margin-right: -10px; margin-left: -10px; } .col-lg-1, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-md-1, .col-md-10, .col-md-11, .col-md-12, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-sm-1, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-xs-1, .col-xs-10, .col-xs-11, .col-xs-12, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9 { padding-left: 10px; padding-right: 10px; } .breadcrumb { background-color: transparent; margin-bottom: 15px; padding-top: 10px; padding-left: 0px; } /* Dropdown */ .dropdown-menu { padding: 4px 0; transition: all 300ms ease; -moz-transition: all 300ms ease; -webkit-transition: all 300ms ease; -o-transition: all 300ms ease; -ms-transition: all 300ms ease; border: 0; box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.26); } .dropdown-menu > li > a { padding: 6px 20px; } .dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { background-color: #f3f3f3; color: #36404a; } .dropup .dropdown-menu { box-shadow: 0px -1px 5px 0 rgba(0, 0, 0, 0.26); } /* Background colors */ .bg-custom { background-color: #5fbeaa !important; } .bg-primary { background-color: #5d9cec !important; } .bg-success { background-color: #81c868 !important; } .bg-info { background-color: #34d3eb !important; } .bg-warning { background-color: #ffbd4a !important; } .bg-danger { background-color: #f05050 !important; } .bg-muted { background-color: #f4f8fb !important; } .bg-inverse { background-color: #4c5667 !important; } .bg-purple { background-color: #7266ba !important; } .bg-pink { background-color: #fb6d9d !important; } .bg-white { background-color: #ffffff !important; } .bg-lightdark { background-color: #f4f8fb !important; } /* Text colors */ .text-custom { color: #5fbeaa; } .text-white { color: #ffffff; } .text-danger { color: #f05050; } .text-muted { color: #98a6ad; } .text-primary { color: #5d9cec; } .text-warning { color: #ffbd4a; } .text-success { color: #81c868; } .text-info { color: #34d3eb; } .text-inverse { color: #4c5667; } .text-pink { color: #fb6d9d; } .text-purple { color: #7266ba; } .text-dark { color: #797979 !important; } /* Form components */ textarea.form-control { min-height: 90px; } .form-control { background-color: #FFFFFF; border: 1px solid #E3E3E3; border-radius: 4px; color: #565656; padding: 7px 12px; height: 38px; max-width: 100%; -webkit-box-shadow: none; box-shadow: none; -webkit-transition: all 300ms linear; -moz-transition: all 300ms linear; -o-transition: all 300ms linear; -ms-transition: all 300ms linear; transition: all 300ms linear; } .form-control:focus { background-color: #FFFFFF; border: 1px solid #AAAAAA; -webkit-box-shadow: none; box-shadow: none; outline: 0 !important; color: #333333; } .input-lg { height: 46px; padding: 10px 16px; font-size: 18px; line-height: 1.3333333; border-radius: 6px; } .input-sm { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } .form-horizontal .form-group { margin-left: -10px; margin-right: -10px; } .form-control-feedback { line-height: 38px !important; } .input-group-btn .btn { padding: 8px 12px; } .input-group-btn .btn-sm { padding: 5px 10px; } .input-group-btn .btn-lg { padding: 10px 17px; } /* Labels */ .label { font-weight: 600; letter-spacing: 0.05em; padding: .3em .6em .3em; } .label-default { background-color: #5fbeaa; } .label-primary { background-color: #5d9cec; } .label-success { background-color: #81c868; } .label-info { background-color: #34d3eb; } .label-warning { background-color: #ffbd4a; } .label-danger { background-color: #f05050; } .label-purple { background-color: #7266ba; } .label-pink { background-color: #fb6d9d; } .label-inverse { background-color: #4c5667; } /* Badge */ .badge { text-transform: uppercase; font-weight: 600; padding: 3px 5px; font-size: 12px; margin-top: 1px; background-color: #5fbeaa; } .badge-xs { font-size: 9px; } .badge-xs, .badge-sm { -webkit-transform: translate(0, -2px); -ms-transform: translate(0, -2px); -o-transform: translate(0, -2px); transform: translate(0, -2px); } .badge-primary { background-color: #5d9cec; } .badge-success { background-color: #81c868; } .badge-info { background-color: #34d3eb; } .badge-warning { background-color: #ffbd4a; } .badge-danger { background-color: #f05050; } .badge-purple { background-color: #7266ba; } .badge-pink { background-color: #fb6d9d; } .badge-inverse { background-color: #4c5667; } /* Pagination/ Pager */ .pagination > li:first-child > a, .pagination > li:first-child > span { border-bottom-left-radius: 3px; border-top-left-radius: 3px; } .pagination > li:last-child > a, .pagination > li:last-child > span { border-bottom-right-radius: 3px; border-top-right-radius: 3px; } .pagination > li > a, .pagination > li > span { color: #636e7b; } .pagination > li > a:hover, .pagination > li > span:hover, .pagination > li > a:focus, .pagination > li > span:focus { background-color: #e4e7ea; } .pagination-split li { margin-left: 5px; display: inline-block; float: left; } .pagination-split li:first-child { margin-left: 0; } .pagination-split li a { -moz-border-radius: 3px; -webkit-border-radius: 3px; border-radius: 3px; } .pagination > .active > a, .pagination > .active > span, .pagination > .active > a:hover, .pagination > .active > span:hover, .pagination > .active > a:focus, .pagination > .active > span:focus { background-color: #5fbeaa; border-color: #5fbeaa; } .pager li > a, .pager li > span { -moz-border-radius: 3px; -webkit-border-radius: 3px; border-radius: 3px; color: #636e7b; } /* Tabs */ .tabs { background-color: #ffffff; margin: 0 auto; padding: 0px; position: relative; white-space: nowrap; width: 100%; } .tabs li.tab { background-color: #ffffff; display: block; float: left; margin: 0; text-align: center; } .tabs li.tab a { -moz-transition: color 0.28s ease; -ms-transition: color 0.28s ease; -o-transition: color 0.28s ease; -webkit-transition: color 0.28s ease; color: #9398a0; color: #ee6e73; display: block; height: 100%; text-decoration: none; transition: color 0.28s ease; width: 100%; } .tabs li.tab a.active { color: #5fbeaa !important; } .tabs .indicator { background-color: #5fbeaa; bottom: 0; height: 2px; position: absolute; will-change: left, right; } .tabs-top .indicator { top: 0; } .nav-pills li a { line-height: 36px !important; } .nav-pills li.active a { background-color: #5fbeaa !important; } .nav-pills li.active a:hover { background-color: #5fbeaa !important; } .nav-pills li.active a:focus { background-color: #5fbeaa !important; } .nav.nav-tabs + .tab-content { background: #ffffff; margin-bottom: 30px; padding: 30px; } .tabs-vertical-env { margin-bottom: 30px; } .tabs-vertical-env .tab-content { background: #ffffff; display: table-cell; margin-bottom: 30px; padding: 30px; vertical-align: top; } .tabs-vertical-env .nav.tabs-vertical { display: table-cell; min-width: 120px; vertical-align: top; width: 150px; } .tabs-vertical-env .nav.tabs-vertical li.active > a { background-color: #ffffff; border: 0; } .tabs-vertical-env .nav.tabs-vertical li > a { color: #333333; text-align: center; white-space: nowrap; } .nav.nav-tabs > li.active > a { background-color: #ffffff; border: 0; } .nav.nav-tabs > li > a, .nav.tabs-vertical > li > a { background-color: transparent; border-radius: 0; border: none; color: #505461 !important; cursor: pointer; line-height: 50px; padding-left: 20px; padding-right: 20px; letter-spacing: 0.03em; font-weight: 600; text-transform: uppercase; font-family: "Source Sans Pro", "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; } .nav.nav-tabs > li > a:hover, .nav.tabs-vertical > li > a:hover { color: #5fbeaa !important; } .tab-content { box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); color: #777777; } .nav.nav-tabs > li:last-of-type a { margin-right: 0px; } .nav.nav-tabs { border-bottom: 0; box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); } .navtab-bg { background-color: #f4f8fb; } .nav-tabs.nav-justified > .active > a, .nav-tabs.nav-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:focus, .tabs-vertical-env .nav.tabs-vertical li.active > a { border: none; } .nav-tabs > li.active > a, .nav-tabs > li.active > a:focus, .nav-tabs > li.active > a:hover, .tabs-vertical > li.active > a, .tabs-vertical > li.active > a:focus, .tabs-vertical > li.active > a:hover { color: #5fbeaa !important; } /* List group */ .list-group-item { border: 1px solid #ebeff2; } /* Dropcap */ .dropcap { font-size: 3.1em; } .dropcap, .dropcap-circle, .dropcap-square { display: block; float: left; font-weight: 400; line-height: 36px; margin-right: 6px; text-shadow: none; } /* Alert */ .alert .btn { margin-top: 10px; } .alert-success { background-color: rgba(95, 190, 170, 0.3); border-color: rgba(95, 190, 170, 0.4); color: #5fbeaa; } .alert-info { background-color: rgba(52, 211, 235, 0.2); border-color: rgba(52, 211, 235, 0.3); color: #34d3eb; } .alert-warning { background-color: rgba(255, 189, 74, 0.2); border-color: rgba(255, 189, 74, 0.3); color: #ffbd4a; } .alert-danger { background-color: rgba(240, 80, 80, 0.2); border-color: rgba(240, 80, 80, 0.3); color: #f05050; } /* Modals */ .modal .modal-dialog .modal-content { -moz-box-shadow: none; -webkit-box-shadow: none; border-color: #DDDDDD; border-radius: 2px; box-shadow: none; padding: 25px; } .modal .modal-dialog .modal-content .modal-header { border-bottom-width: 2px; margin: 0; padding: 0; padding-bottom: 15px; } .modal .modal-dialog .modal-content .modal-body { padding: 20px 0; } .modal .modal-dialog .modal-content .modal-footer { padding: 0; padding-top: 15px; } .modal-full { width: 98%; } .modal-content .nav.nav-tabs + .tab-content { margin-bottom: 0px; } .modal-content .panel-group { margin-bottom: 0px; } .modal-content .panel { border-top: none; } /* Custom-modal */ .modal-demo { background-color: #FFF; width: 600px; -webkit-border-radius: 4px; border-radius: 4px; -moz-border-radius: 4px; background-clip: padding-box; display: none; } .modal-demo .close { position: absolute; top: 15px; right: 25px; color: #eeeeee; } .custom-modal-title { padding: 15px 25px 15px 25px; line-height: 22px; font-size: 18px; background-color: #36404a; color: #ffffff; text-align: left; margin: 0px; } .custom-modal-text { padding: 20px; } .custombox-modal-flash .close, .custombox-modal-rotatedown .close { top: 20px; z-index: 9999; } /* Tabs-Accordions */ .tabs-vertical-env .tab-content { margin-bottom: 0px; } .table > thead > tr > td.middle-align, .table > tbody > tr > td.middle-align, .table > .tfood > tr > td.middle-align, .table > thead > tr > th.middle-align, .table > tbody > tr > th.middle-align, .table > .tfood > tr > th.middle-align { vertical-align: middle; } .list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus { background-color: #5fbeaa; border-color: #5fbeaa; } .nav-pills > .active > a > .badge { color: #5fbeaa; } .has-success .form-control { border-color: #81c868; box-shadow: none !important; } .has-warning .form-control { border-color: #ffbd4a; box-shadow: none !important; } .has-error .form-control { border-color: #f05050; box-shadow: none !important; } .input-group-addon { border-radius: 2px; border: 1px solid #eeeeee; } /* Tooltips */ .tooltip-inner { border-radius: 1px; padding: 6px 10px; } .jqstooltip { -webkit-box-sizing: content-box; -moz-box-sizing: content-box; box-sizing: content-box; width: auto!important; height: auto!important; } /* Popover */ .popover { font-family: inherit; border: none; -webkit-border-radius: 3px; border-radius: 3px; -moz-border-radius: 3px; background-clip: padding-box; } .popover .popover-title { background-color: transparent; color: #5fbeaa; font-weight: 600; } /* Code */ code { color: #5d9cec; background-color: #f4f8fb; border-radius: 4px; } /* Pre */ pre { background-color: #f4f8fb; border: 1px solid #d4d8da; } /* Carousel */ .carousel-control { width: 10%; } .carousel-control span { position: absolute; top: 50%; /* pushes the icon in the middle of the height */ z-index: 5; display: inline-block; font-size: 30px; } /* Owl */ .slider-bg { background-size: cover !important; padding: 5.5% 4.5%; } /* Media */ .media { margin-bottom: 20px; } .media .media-heading { font-weight: 600; font-size: 16px; } .media:last-of-type { margin-bottom: 0px; } /*=================================== File: Topbar,Left-sidebar,Right-sidebar ===================================*/ .topbar { left: 0px; position: fixed; right: 0; top: 0px; z-index: 999; } .topbar .topbar-left { float: left; position: relative; width: 240px; z-index: 1; } .topbar .topbar-left-sm { width: 180px; } .logo { color: #ffffff !important; font-size: 20px; font-weight: 700; letter-spacing: .05em; line-height: 60px; text-transform: uppercase; } .logo h1 { height: 50px; margin: 0px auto; text-align: center; } .logo i { color: #5fbeaa; } .logo .icon-c-logo { display: none; } .navbar-default { background-color: #36404a; border-radius: 0px; border: none; margin-bottom: 0px; } .navbar-default .navbar-nav > .open > a { background-color: rgba(255, 255, 255, 0.1); } .navbar-default .navbar-nav > .open > a:focus { background-color: rgba(255, 255, 255, 0.1); } .navbar-default .navbar-nav > .open > a:hover { background-color: rgba(255, 255, 255, 0.1); } .navbar-default .badge { position: absolute; top: 12px; right: 7px; } .nav > li > a { color: #ffffff !important; line-height: 60px; padding: 0px 15px; position: relative; } .nav > li > a i { font-size: 16px; } .profile img { border: 2px solid #edf0f0; height: 36px; width: 36px; } .dropdown-menu-lg { width: 300px; } .dropdown-menu-lg .list-group { margin-bottom: 0px; } .dropdown-menu-lg .list-group-item { border: none; padding: 10px 20px; } .dropdown-menu-lg .media-heading { margin-bottom: 0px; } .dropdown-menu-lg .media-body p { color: #828282; } .notification-list { max-height: 230px; } .notification-list em { width: 34px; text-align: center; } .notification-list .media-body { display: inherit; width: auto; overflow: hidden; margin-left: 50px; } .notification-list .media-body h5 { text-overflow: ellipsis; white-space: nowrap; display: block; width: 100%; font-weight: normal; overflow: hidden; } .notifi-title { border-bottom: 1px solid rgba(0, 0, 0, 0.1); font-size: 15px; text-transform: uppercase; font-weight: 600; padding: 11px 20px 15px; color: #4c5667; font-family: "Source Sans Pro", "Helvetica Neue", Helvetica, Arial, sans-serif; } .navbar-nav { margin: 0px; } .side-menu { bottom: 0; top: 0; width: 240px; z-index: 2; } .side-menu.left { background: #ffffff; box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); position: absolute; top: 60px; } body.fixed-left .side-menu.left { bottom: 50px; height: 100%; margin-bottom: -70px; margin-top: 0px; padding-bottom: 70px; position: fixed; } .content-page { margin-left: 240px; overflow: hidden; } .content-page > .content { margin-bottom: 60px; margin-top: 60px; padding: 20px 5px 15px 5px; } .button-menu-mobile { background: transparent; border: none; color: #cccccc; font-size: 21px; line-height: 60px; padding: 0px 15px; } .button-menu-mobile:hover { color: #ffffff; } .sidebar-inner { height: 100%; } #sidebar-menu, #sidebar-menu ul, #sidebar-menu li, #sidebar-menu a { border: 0; font-weight: normal; line-height: 1; list-style: none; margin: 0; padding: 0; position: relative; text-decoration: none; } #sidebar-menu { padding-bottom: 30px; padding-top: 30px; width: 100%; } #sidebar-menu .nav > li > a .badge { position: absolute; right: 10px; top: 12px; } #sidebar-menu a { line-height: 1.3; } #sidebar-menu ul ul { display: none; } #sidebar-menu ul ul li { border-top: 0; } #sidebar-menu ul ul li.active a { color: #5fbeaa; } #sidebar-menu ul ul a { color: #75798B; display: block; padding: 10px 20px 10px 65px; } #sidebar-menu ul ul a:hover { color: #5fbeaa; } #sidebar-menu ul ul a i { margin-right: 5px; } #sidebar-menu ul ul ul a { padding-left: 80px; } #sidebar-menu .label { margin-top: 2px; } #sidebar-menu .subdrop { background: #f4f8fb !important; border-left: 3px solid #5fbeaa; color: #5fbeaa !important; } #sidebar-menu > ul > li > a { color: #36404a; display: block; padding: 12px 20px; margin: 4px 0px; border-left: 3px solid #ffffff; } #sidebar-menu > ul > li > a:hover { color: #5fbeaa; text-decoration: none; } #sidebar-menu > ul > li > a > span { vertical-align: middle; } #sidebar-menu ul li a i { display: inline-block; font-size: 16px; line-height: 17px; margin-left: 3px; margin-right: 15px; text-align: center; vertical-align: middle; width: 20px; } #sidebar-menu ul li a i.md { font-size: 18px; } #sidebar-menu > ul > li > a > i.i-right { float: right; margin: 3px 0 0 0; } #sidebar-menu > ul > li > a.active { background: #f4f8fb !important; border-left: 3px solid #5fbeaa; color: #5fbeaa !important; } .menu-title { padding: 12px 20px !important; letter-spacing: .035em; pointer-events: none; cursor: default; font-size: 13px; } /* Small Menu */ .side-menu-sm { width: 180px; text-align: center; } .side-menu-sm #sidebar-menu > ul > li > a > i { display: block; font-size: 18px; line-height: 24px; width: 100%; margin: 0px; } .side-menu-sm #sidebar-menu ul ul a { padding: 10px 20px 10px 20px; } .side-menu-sm + .content-page .footer { left: 180px; } #wrapper.enlarged .side-menu-sm { text-align: left; } #wrapper.enlarged .side-menu-sm #sidebar-menu ul li a i { display: inline-block; font-size: 18px; line-height: 17px; margin-left: 3px; margin-right: 15px; vertical-align: middle; width: 20px; } .side-menu-sm + .content-page { margin-left: 180px; } /* Header 2 */ .page-header-2 { background: #E3E7EC; border-bottom: 1px solid #dee2e8; margin: -25px -20px 22px -20px; padding: 25px 20px 0px 20px; } #wrapper.enlarged .menu-title { display: none; } #wrapper.enlarged #sidebar-menu ul ul { border: 2px solid #f4f8fb; margin-top: -5px; padding-top: 5px; z-index: 9999; background-color: #ffffff; } #wrapper.enlarged .left.side-menu { width: 70px; z-index: 5; } #wrapper.enlarged .left.side-menu #sidebar-menu > ul > li > a { padding: 15px 20px; } #wrapper.enlarged .left.side-menu #sidebar-menu > ul > li > a:hover { background: #f4f8fb!important; } #wrapper.enlarged .left.side-menu #sidebar-menu > ul > li > a:active { background: #f4f8fb!important; } #wrapper.enlarged .left.side-menu #sidebar-menu > ul > li > a:focus { background: #f4f8fb!important; } #wrapper.enlarged .left.side-menu #sidebar-menu > ul > li > a i { margin-right: 20px !important; font-size: 20px; } #wrapper.enlarged .left.side-menu .label { position: absolute; top: 5px; left: 35px; text-indent: 0; display: block !important; padding: .2em .6em .3em !important; } #wrapper.enlarged .left.side-menu #sidebar-menu ul > li { position: relative; white-space: nowrap; } #wrapper.enlarged .left.side-menu #sidebar-menu ul > li:hover > a { position: relative; width: 260px; background: #f4f8fb; } #wrapper.enlarged .left.side-menu #sidebar-menu ul > li:hover > ul { display: block; left: 70px; position: absolute; width: 190px; } #wrapper.enlarged .left.side-menu #sidebar-menu ul > li:hover > ul a { background: #ffffff; box-shadow: none; padding-left: 15px; position: relative; width: 186px; z-index: 6; } #wrapper.enlarged .left.side-menu #sidebar-menu ul > li:hover > ul a:hover { color: #5fbeaa; } #wrapper.enlarged .left.side-menu #sidebar-menu ul > li:hover a span { display: inline; } #wrapper.enlarged .left.side-menu #sidebar-menu a.subdrop { color: #5fbeaa !important; } #wrapper.enlarged .left.side-menu #sidebar-menu ul > li > ul { display: none; } #wrapper.enlarged .left.side-menu #sidebar-menu ul ul li:hover > ul { display: block; left: 190px; margin-top: -36px; position: absolute; width: 190px; } #wrapper.enlarged .left.side-menu #sidebar-menu ul ul li > a span.pull-right { -ms-transform: rotate(270deg); -webkit-transform: rotate(270deg); position: absolute; right: 20px; top: 12px; transform: rotate(270deg); } #wrapper.enlarged .left.side-menu #sidebar-menu ul ul li.active a { color: #5fbeaa; } #wrapper.enlarged .left.side-menu #sidebar-menu ul > li > a span { display: none; padding-left: 10px; } #wrapper.enlarged .left.side-menu .user-details { display: none; } #wrapper.enlarged .content-page { margin-left: 70px; } #wrapper.enlarged .footer { left: 70px; } #wrapper.enlarged .topbar .topbar-left { width: 70px !important; } #wrapper.enlarged .topbar .topbar-left .logo span { display: none; opacity: 0; } #wrapper.enlarged .topbar .topbar-left .logo .icon-c-logo { display: block; line-height: 60px; } #wrapper.enlarged #sidebar-menu > ul > li:hover > a.open :after { display: none; } #wrapper.enlarged #sidebar-menu > ul > li:hover > a.active :after { display: none; } #wrapper.enlarged .tips-box { display: none; } .tips-box .portlet { -webkit-box-shadow: 0px 0px 7px 1px rgba(0, 0, 0, 0.05); -moz-box-shadow: 0px 0px 7px 1px rgba(0, 0, 0, 0.05); box-shadow: 0px 0px 7px 1px rgba(0, 0, 0, 0.05); } .user-details { padding: 20px; padding-bottom: 0px; position: relative; } .user-details img { position: relative; z-index: 9999; } .user-details .user-info { color: #444444; margin-left: 60px; position: relative; z-index: 99999; } .user-details .user-info a.dropdown-toggle { color: #797979; display: block; font-family: 'Roboto', sans-serif; font-size: 16px; font-weight: 600; padding-top: 5px; } #wrapper.right-bar-enabled .right-bar { right: 0; } #wrapper.right-bar-enabled .left-layout { left: 0; } /* Right sidebar */ .side-bar.right-bar { float: right !important; right: -266px; top: 60px; } .side-bar { -moz-transition: all 200ms ease-out; -webkit-transition: all 200ms ease-out; background-color: #ffffff; box-shadow: 0px 0px 8px 1px rgba(0, 0, 0, 0.1); display: block; float: left; height: 100%; overflow-y: auto; position: fixed; transition: all 200ms ease-out; width: 240px; } .right-bar { background: #ffffff !important; z-index: 99 !important; } .right-bar h4 { border-bottom: 1px solid #eeeeee; padding-bottom: 10px; } .contact-list { max-height: 600px; } .contact-list .list-group-item { border: none; } .contact-list .list-group-item:hover { background: #ebeff2; } .contact-list i.offline { color: #f05050 !important; } .contact-list i.away { color: #ffbd4a; } .contacts-list .avatar { display: inline-block; float: left; margin-right: 5px; width: 30px; } .contacts-list .avatar img { border-radius: 50%; width: 100%; } .contacts-list .list-group-item span.name { color: #707780; display: inline-block; float: left; overflow: hidden; padding-left: 5px; padding-top: 6px; text-overflow: ellipsis; white-space: nowrap; width: 130px; } .contacts-list i { color: #7a8c9a; float: right; font-size: 9px; line-height: 30px; } .contacts-list i.online { color: #a0d269; } .contacts-list i.offline { color: #f05050 !important; } .contacts-list i.away { color: #ffbd4a; } .app-search { position: relative; margin: 15px 0px 15px 10px; } .app-search a { position: absolute; top: 5px; right: 20px; color: #c4c4cd; } .app-search .form-control, .app-search .form-control:focus { border: none; font-size: 13px; color: #ffffff; padding-left: 20px; padding-right: 40px; background: rgba(255, 255, 255, 0.1); box-shadow: none; border-radius: 30px; height: 30px; font-weight: 600; width: 180px; } /* Animation */ /* Bounce 1 */ @-webkit-keyframes cd-bounce-1 { 0% { opacity: 0; -webkit-transform: scale(0.5); } 60% { opacity: 1; -webkit-transform: scale(1.2); } 100% { -webkit-transform: scale(1); } } @-moz-keyframes cd-bounce-1 { 0% { opacity: 0; -moz-transform: scale(0.5); } 60% { opacity: 1; -moz-transform: scale(1.2); } 100% { -moz-transform: scale(1); } } @-o-keyframes cd-bounce-1 { 0% { opacity: 0; -o-transform: scale(0.5); } 60% { opacity: 1; -o-transform: scale(1.2); } 100% { -o-transform: scale(1); } } @keyframes cd-bounce-1 { 0% { opacity: 0; -webkit-transform: scale(0.5); -moz-transform: scale(0.5); -ms-transform: scale(0.5); -o-transform: scale(0.5); transform: scale(0.5); } 60% { opacity: 1; -webkit-transform: scale(1.2); -moz-transform: scale(1.2); -ms-transform: scale(1.2); -o-transform: scale(1.2); transform: scale(1.2); } 100% { opacity: 1; -webkit-transform: scale(1); -moz-transform: scale(1); -ms-transform: scale(1); -o-transform: scale(1); transform: scale(1); } } /* Bounce 2 */ @-webkit-keyframes cd-bounce-2 { 0% { opacity: 0; -webkit-transform: translateX(-100px); } 60% { opacity: 1; -webkit-transform: translateX(20px); } 100% { -webkit-transform: translateX(0); } } @-moz-keyframes cd-bounce-2 { 0% { opacity: 0; -moz-transform: translateX(-100px); } 60% { opacity: 1; -moz-transform: translateX(20px); } 100% { -moz-transform: translateX(0); } } @-o-keyframes cd-bounce-2 { 0% { opacity: 0; -o-transform: translateX(-100px); } 60% { opacity: 1; -o-transform: translateX(20px); } 100% { opacity: 1; -o-transform: translateX(0); } } @keyframes cd-bounce-2 { 0% { opacity: 0; -webkit-transform: translateX(-100px); -moz-transform: translateX(-100px); -ms-transform: translateX(-100px); -o-transform: translateX(-100px); transform: translateX(-100px); } 60% { opacity: 1; -webkit-transform: translateX(20px); -moz-transform: translateX(20px); -ms-transform: translateX(20px); -o-transform: translateX(20px); transform: translateX(20px); } 100% { opacity: 1; -webkit-transform: translateX(0); -moz-transform: translateX(0); -ms-transform: translateX(0); -o-transform: translateX(0); transform: translateX(0); } } /* Dropdown */ @-webkit-keyframes dropdownOpen { 0% { opacity: 0; -webkit-transform: scale(0); } 100% { -webkit-transform: scale(1); } } @-moz-keyframes dropdownOpen { 0% { opacity: 0; -moz-transform: scale(0); } 100% { -moz-transform: scale(1); } } @-o-keyframes dropdownOpen { 0% { opacity: 0; -o-transform: scale(0); } 100% { -o-transform: scale(1); } } @keyframes dropdownOpen { 0% { opacity: 0; -webkit-transform: scale(0); -moz-transform: scale(0); -ms-transform: scale(0); -o-transform: scale(0); transform: scale(0); } 100% { opacity: 1; -webkit-transform: scale(1); -moz-transform: scale(1); -ms-transform: scale(1); -o-transform: scale(1); transform: scale(1); } } /* Progressbar Animated */ @-webkit-keyframes animationProgress { from { width: 0; } } @keyframes animationProgress { from { width: 0; } } /* Portlets loader */ @-webkit-keyframes loaderAnimate { 0% { -webkit-transform: rotate(0deg); } 100% { -webkit-transform: rotate(220deg); } } @-moz-keyframes loaderAnimate { 0% { -moz-transform: rotate(0deg); } 100% { -moz-transform: rotate(220deg); } } @-o-keyframes loaderAnimate { 0% { -o-transform: rotate(0deg); } 100% { -o-transform: rotate(220deg); } } @keyframes loaderAnimate { 0% { transform: rotate(0deg); } 100% { transform: rotate(220deg); } } @-webkit-keyframes loaderAnimate2 { 0% { box-shadow: inset #555 0 0 0 8px; -webkit-transform: rotate(-140deg); } 50% { box-shadow: inset #555 0 0 0 2px; } 100% { box-shadow: inset #555 0 0 0 8px; -webkit-transform: rotate(140deg); } } @-moz-keyframes loaderAnimate2 { 0% { box-shadow: inset #555 0 0 0 8px; -moz-transform: rotate(-140deg); } 50% { box-shadow: inset #555 0 0 0 2px; } 100% { box-shadow: inset #555 0 0 0 8px; -moz-transform: rotate(140deg); } } @-o-keyframes loaderAnimate2 { 0% { box-shadow: inset #555 0 0 0 8px; -o-transform: rotate(-140deg); } 50% { box-shadow: inset #555 0 0 0 2px; } 100% { box-shadow: inset #555 0 0 0 8px; -o-transform: rotate(140deg); } } @keyframes loaderAnimate2 { 0% { box-shadow: inset #555 0 0 0 8px; -webkit-transform: rotate(-140deg); -moz-transform: rotate(-140deg); -ms-transform: rotate(-140deg); transform: rotate(-140deg); } 50% { box-shadow: inset #555 0 0 0 2px; } 100% { box-shadow: inset #555 0 0 0 8px; -webkit-transform: rotate(140deg); -moz-transform: rotate(140deg); -ms-transform: rotate(140deg); transform: rotate(140deg); } } @keyframes loaderAnimate2 { 0% { box-shadow: inset #999 0 0 0 17px; transform: rotate(-140deg); } 50% { box-shadow: inset #999 0 0 0 2px; } 100% { box-shadow: inset #999 0 0 0 17px; transform: rotate(140deg); } } /*! * Waves v0.6.0 * http://fian.my.id/Waves * * Copyright 2014 Alfiana E. Sibuea and other contributors * Released under the MIT license * https://github.com/fians/Waves/blob/master/LICENSE */ .waves-effect { position: relative; cursor: pointer; display: inline-block; overflow: hidden; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; -webkit-tap-highlight-color: transparent; vertical-align: middle; z-index: 1; will-change: opacity, transform; -webkit-transition: all 0.3s ease-out; -moz-transition: all 0.3s ease-out; -o-transition: all 0.3s ease-out; -ms-transition: all 0.3s ease-out; transition: all 0.3s ease-out; } .waves-effect .waves-ripple { position: absolute; border-radius: 50%; width: 20px; height: 20px; margin-top: -10px; margin-left: -10px; opacity: 0; background: rgba(0, 0, 0, 0.2); -webkit-transition: all 0.7s ease-out; -moz-transition: all 0.7s ease-out; -o-transition: all 0.7s ease-out; -ms-transition: all 0.7s ease-out; transition: all 0.7s ease-out; -webkit-transition-property: -webkit-transform, opacity; -moz-transition-property: -moz-transform, opacity; -o-transition-property: -o-transform, opacity; transition-property: transform, opacity; -webkit-transform: scale(0); -moz-transform: scale(0); -ms-transform: scale(0); -o-transform: scale(0); transform: scale(0); pointer-events: none; } .waves-effect.waves-light .waves-ripple { background-color: rgba(255, 255, 255, 0.45); } .waves-effect.waves-red .waves-ripple { background-color: rgba(244, 67, 54, 0.7); } .waves-effect.waves-yellow .waves-ripple { background-color: rgba(255, 235, 59, 0.7); } .waves-effect.waves-orange .waves-ripple { background-color: rgba(255, 152, 0, 0.7); } .waves-effect.waves-purple .waves-ripple { background-color: rgba(156, 39, 176, 0.7); } .waves-effect.waves-green .waves-ripple { background-color: rgba(76, 175, 80, 0.7); } .waves-effect.waves-teal .waves-ripple { background-color: rgba(0, 150, 136, 0.7); } .waves-notransition { -webkit-transition: none !important; -moz-transition: none !important; -o-transition: none !important; -ms-transition: none !important; transition: none !important; } .waves-circle { -webkit-transform: translateZ(0); -moz-transform: translateZ(0); -ms-transform: translateZ(0); -o-transform: translateZ(0); transform: translateZ(0); -webkit-mask-image: -webkit-radial-gradient(circle, white 100%, black 100%); text-align: center; width: 2.5em; height: 2.5em; line-height: 2.5em; border-radius: 50%; -webkit-mask-image: none; } .waves-input-wrapper { border-radius: 0.2em; vertical-align: bottom; } .waves-input-wrapper .waves-button-input { position: relative; top: 0; left: 0; z-index: 1; } .waves-block { display: block; } ================================================ FILE: static/assets/css/elements.css ================================================ ================================================ FILE: static/assets/css/icons.css ================================================ /* Template Name: UBold Dashboard Author: CoderThemes Email: coderthemes@gmail.com File: Icons */ /*! * Font Awesome 4.4.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) */ /* FONT PATH * -------------------------- */ @font-face { font-family: 'FontAwesome'; src: url('../fonts/fontawesome-webfont.eot?v=4.4.0'); src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.4.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.4.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.4.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.4.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.4.0#fontawesomeregular') format('svg'); font-weight: normal; font-style: normal; } .fa { display: inline-block; font: normal normal normal 14px/1 FontAwesome; font-size: inherit; text-rendering: auto; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } /* makes the font 33% larger relative to the icon container */ .fa-lg { font-size: 1.33333333em; line-height: 0.75em; vertical-align: -15%; } .fa-2x { font-size: 2em; } .fa-3x { font-size: 3em; } .fa-4x { font-size: 4em; } .fa-5x { font-size: 5em; } .fa-fw { width: 1.28571429em; text-align: center; } .fa-ul { padding-left: 0; margin-left: 2.14285714em; list-style-type: none; } .fa-ul > li { position: relative; } .fa-li { position: absolute; left: -2.14285714em; width: 2.14285714em; top: 0.14285714em; text-align: center; } .fa-li.fa-lg { left: -1.85714286em; } .fa-border { padding: .2em .25em .15em; border: solid 0.08em #eeeeee; border-radius: .1em; } .fa-pull-left { float: left; } .fa-pull-right { float: right; } .fa.fa-pull-left { margin-right: .3em; } .fa.fa-pull-right { margin-left: .3em; } /* Deprecated as of 4.4.0 */ .pull-right { float: right; } .pull-left { float: left; } .fa.pull-left { margin-right: .3em; } .fa.pull-right { margin-left: .3em; } .fa-spin { -webkit-animation: fa-spin 2s infinite linear; animation: fa-spin 2s infinite linear; } .fa-pulse { -webkit-animation: fa-spin 1s infinite steps(8); animation: fa-spin 1s infinite steps(8); } @-webkit-keyframes fa-spin { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(359deg); transform: rotate(359deg); } } @keyframes fa-spin { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(359deg); transform: rotate(359deg); } } .fa-rotate-90 { filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); -webkit-transform: rotate(90deg); -ms-transform: rotate(90deg); transform: rotate(90deg); } .fa-rotate-180 { filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); -webkit-transform: rotate(180deg); -ms-transform: rotate(180deg); transform: rotate(180deg); } .fa-rotate-270 { filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); -webkit-transform: rotate(270deg); -ms-transform: rotate(270deg); transform: rotate(270deg); } .fa-flip-horizontal { filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1); -webkit-transform: scale(-1, 1); -ms-transform: scale(-1, 1); transform: scale(-1, 1); } .fa-flip-vertical { filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1); -webkit-transform: scale(1, -1); -ms-transform: scale(1, -1); transform: scale(1, -1); } :root .fa-rotate-90, :root .fa-rotate-180, :root .fa-rotate-270, :root .fa-flip-horizontal, :root .fa-flip-vertical { filter: none; } .fa-stack { position: relative; display: inline-block; width: 2em; height: 2em; line-height: 2em; vertical-align: middle; } .fa-stack-1x, .fa-stack-2x { position: absolute; left: 0; width: 100%; text-align: center; } .fa-stack-1x { line-height: inherit; } .fa-stack-2x { font-size: 2em; } .fa-inverse { color: #ffffff; } /* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen readers do not read off random characters that represent icons */ .fa-glass:before { content: "\f000"; } .fa-music:before { content: "\f001"; } .fa-search:before { content: "\f002"; } .fa-envelope-o:before { content: "\f003"; } .fa-heart:before { content: "\f004"; } .fa-star:before { content: "\f005"; } .fa-star-o:before { content: "\f006"; } .fa-user:before { content: "\f007"; } .fa-film:before { content: "\f008"; } .fa-th-large:before { content: "\f009"; } .fa-th:before { content: "\f00a"; } .fa-th-list:before { content: "\f00b"; } .fa-check:before { content: "\f00c"; } .fa-remove:before, .fa-close:before, .fa-times:before { content: "\f00d"; } .fa-search-plus:before { content: "\f00e"; } .fa-search-minus:before { content: "\f010"; } .fa-power-off:before { content: "\f011"; } .fa-signal:before { content: "\f012"; } .fa-gear:before, .fa-cog:before { content: "\f013"; } .fa-trash-o:before { content: "\f014"; } .fa-home:before { content: "\f015"; } .fa-file-o:before { content: "\f016"; } .fa-clock-o:before { content: "\f017"; } .fa-road:before { content: "\f018"; } .fa-download:before { content: "\f019"; } .fa-arrow-circle-o-down:before { content: "\f01a"; } .fa-arrow-circle-o-up:before { content: "\f01b"; } .fa-inbox:before { content: "\f01c"; } .fa-play-circle-o:before { content: "\f01d"; } .fa-rotate-right:before, .fa-repeat:before { content: "\f01e"; } .fa-refresh:before { content: "\f021"; } .fa-list-alt:before { content: "\f022"; } .fa-lock:before { content: "\f023"; } .fa-flag:before { content: "\f024"; } .fa-headphones:before { content: "\f025"; } .fa-volume-off:before { content: "\f026"; } .fa-volume-down:before { content: "\f027"; } .fa-volume-up:before { content: "\f028"; } .fa-qrcode:before { content: "\f029"; } .fa-barcode:before { content: "\f02a"; } .fa-tag:before { content: "\f02b"; } .fa-tags:before { content: "\f02c"; } .fa-book:before { content: "\f02d"; } .fa-bookmark:before { content: "\f02e"; } .fa-print:before { content: "\f02f"; } .fa-camera:before { content: "\f030"; } .fa-font:before { content: "\f031"; } .fa-bold:before { content: "\f032"; } .fa-italic:before { content: "\f033"; } .fa-text-height:before { content: "\f034"; } .fa-text-width:before { content: "\f035"; } .fa-align-left:before { content: "\f036"; } .fa-align-center:before { content: "\f037"; } .fa-align-right:before { content: "\f038"; } .fa-align-justify:before { content: "\f039"; } .fa-list:before { content: "\f03a"; } .fa-dedent:before, .fa-outdent:before { content: "\f03b"; } .fa-indent:before { content: "\f03c"; } .fa-video-camera:before { content: "\f03d"; } .fa-photo:before, .fa-image:before, .fa-picture-o:before { content: "\f03e"; } .fa-pencil:before { content: "\f040"; } .fa-map-marker:before { content: "\f041"; } .fa-adjust:before { content: "\f042"; } .fa-tint:before { content: "\f043"; } .fa-edit:before, .fa-pencil-square-o:before { content: "\f044"; } .fa-share-square-o:before { content: "\f045"; } .fa-check-square-o:before { content: "\f046"; } .fa-arrows:before { content: "\f047"; } .fa-step-backward:before { content: "\f048"; } .fa-fast-backward:before { content: "\f049"; } .fa-backward:before { content: "\f04a"; } .fa-play:before { content: "\f04b"; } .fa-pause:before { content: "\f04c"; } .fa-stop:before { content: "\f04d"; } .fa-forward:before { content: "\f04e"; } .fa-fast-forward:before { content: "\f050"; } .fa-step-forward:before { content: "\f051"; } .fa-eject:before { content: "\f052"; } .fa-chevron-left:before { content: "\f053"; } .fa-chevron-right:before { content: "\f054"; } .fa-plus-circle:before { content: "\f055"; } .fa-minus-circle:before { content: "\f056"; } .fa-times-circle:before { content: "\f057"; } .fa-check-circle:before { content: "\f058"; } .fa-question-circle:before { content: "\f059"; } .fa-info-circle:before { content: "\f05a"; } .fa-crosshairs:before { content: "\f05b"; } .fa-times-circle-o:before { content: "\f05c"; } .fa-check-circle-o:before { content: "\f05d"; } .fa-ban:before { content: "\f05e"; } .fa-arrow-left:before { content: "\f060"; } .fa-arrow-right:before { content: "\f061"; } .fa-arrow-up:before { content: "\f062"; } .fa-arrow-down:before { content: "\f063"; } .fa-mail-forward:before, .fa-share:before { content: "\f064"; } .fa-expand:before { content: "\f065"; } .fa-compress:before { content: "\f066"; } .fa-plus:before { content: "\f067"; } .fa-minus:before { content: "\f068"; } .fa-asterisk:before { content: "\f069"; } .fa-exclamation-circle:before { content: "\f06a"; } .fa-gift:before { content: "\f06b"; } .fa-leaf:before { content: "\f06c"; } .fa-fire:before { content: "\f06d"; } .fa-eye:before { content: "\f06e"; } .fa-eye-slash:before { content: "\f070"; } .fa-warning:before, .fa-exclamation-triangle:before { content: "\f071"; } .fa-plane:before { content: "\f072"; } .fa-calendar:before { content: "\f073"; } .fa-random:before { content: "\f074"; } .fa-comment:before { content: "\f075"; } .fa-magnet:before { content: "\f076"; } .fa-chevron-up:before { content: "\f077"; } .fa-chevron-down:before { content: "\f078"; } .fa-retweet:before { content: "\f079"; } .fa-shopping-cart:before { content: "\f07a"; } .fa-folder:before { content: "\f07b"; } .fa-folder-open:before { content: "\f07c"; } .fa-arrows-v:before { content: "\f07d"; } .fa-arrows-h:before { content: "\f07e"; } .fa-bar-chart-o:before, .fa-bar-chart:before { content: "\f080"; } .fa-twitter-square:before { content: "\f081"; } .fa-facebook-square:before { content: "\f082"; } .fa-camera-retro:before { content: "\f083"; } .fa-key:before { content: "\f084"; } .fa-gears:before, .fa-cogs:before { content: "\f085"; } .fa-comments:before { content: "\f086"; } .fa-thumbs-o-up:before { content: "\f087"; } .fa-thumbs-o-down:before { content: "\f088"; } .fa-star-half:before { content: "\f089"; } .fa-heart-o:before { content: "\f08a"; } .fa-sign-out:before { content: "\f08b"; } .fa-linkedin-square:before { content: "\f08c"; } .fa-thumb-tack:before { content: "\f08d"; } .fa-external-link:before { content: "\f08e"; } .fa-sign-in:before { content: "\f090"; } .fa-trophy:before { content: "\f091"; } .fa-github-square:before { content: "\f092"; } .fa-upload:before { content: "\f093"; } .fa-lemon-o:before { content: "\f094"; } .fa-phone:before { content: "\f095"; } .fa-square-o:before { content: "\f096"; } .fa-bookmark-o:before { content: "\f097"; } .fa-phone-square:before { content: "\f098"; } .fa-twitter:before { content: "\f099"; } .fa-facebook-f:before, .fa-facebook:before { content: "\f09a"; } .fa-github:before { content: "\f09b"; } .fa-unlock:before { content: "\f09c"; } .fa-credit-card:before { content: "\f09d"; } .fa-feed:before, .fa-rss:before { content: "\f09e"; } .fa-hdd-o:before { content: "\f0a0"; } .fa-bullhorn:before { content: "\f0a1"; } .fa-bell:before { content: "\f0f3"; } .fa-certificate:before { content: "\f0a3"; } .fa-hand-o-right:before { content: "\f0a4"; } .fa-hand-o-left:before { content: "\f0a5"; } .fa-hand-o-up:before { content: "\f0a6"; } .fa-hand-o-down:before { content: "\f0a7"; } .fa-arrow-circle-left:before { content: "\f0a8"; } .fa-arrow-circle-right:before { content: "\f0a9"; } .fa-arrow-circle-up:before { content: "\f0aa"; } .fa-arrow-circle-down:before { content: "\f0ab"; } .fa-globe:before { content: "\f0ac"; } .fa-wrench:before { content: "\f0ad"; } .fa-tasks:before { content: "\f0ae"; } .fa-filter:before { content: "\f0b0"; } .fa-briefcase:before { content: "\f0b1"; } .fa-arrows-alt:before { content: "\f0b2"; } .fa-group:before, .fa-users:before { content: "\f0c0"; } .fa-chain:before, .fa-link:before { content: "\f0c1"; } .fa-cloud:before { content: "\f0c2"; } .fa-flask:before { content: "\f0c3"; } .fa-cut:before, .fa-scissors:before { content: "\f0c4"; } .fa-copy:before, .fa-files-o:before { content: "\f0c5"; } .fa-paperclip:before { content: "\f0c6"; } .fa-save:before, .fa-floppy-o:before { content: "\f0c7"; } .fa-square:before { content: "\f0c8"; } .fa-navicon:before, .fa-reorder:before, .fa-bars:before { content: "\f0c9"; } .fa-list-ul:before { content: "\f0ca"; } .fa-list-ol:before { content: "\f0cb"; } .fa-strikethrough:before { content: "\f0cc"; } .fa-underline:before { content: "\f0cd"; } .fa-table:before { content: "\f0ce"; } .fa-magic:before { content: "\f0d0"; } .fa-truck:before { content: "\f0d1"; } .fa-pinterest:before { content: "\f0d2"; } .fa-pinterest-square:before { content: "\f0d3"; } .fa-google-plus-square:before { content: "\f0d4"; } .fa-google-plus:before { content: "\f0d5"; } .fa-money:before { content: "\f0d6"; } .fa-caret-down:before { content: "\f0d7"; } .fa-caret-up:before { content: "\f0d8"; } .fa-caret-left:before { content: "\f0d9"; } .fa-caret-right:before { content: "\f0da"; } .fa-columns:before { content: "\f0db"; } .fa-unsorted:before, .fa-sort:before { content: "\f0dc"; } .fa-sort-down:before, .fa-sort-desc:before { content: "\f0dd"; } .fa-sort-up:before, .fa-sort-asc:before { content: "\f0de"; } .fa-envelope:before { content: "\f0e0"; } .fa-linkedin:before { content: "\f0e1"; } .fa-rotate-left:before, .fa-undo:before { content: "\f0e2"; } .fa-legal:before, .fa-gavel:before { content: "\f0e3"; } .fa-dashboard:before, .fa-tachometer:before { content: "\f0e4"; } .fa-comment-o:before { content: "\f0e5"; } .fa-comments-o:before { content: "\f0e6"; } .fa-flash:before, .fa-bolt:before { content: "\f0e7"; } .fa-sitemap:before { content: "\f0e8"; } .fa-umbrella:before { content: "\f0e9"; } .fa-paste:before, .fa-clipboard:before { content: "\f0ea"; } .fa-lightbulb-o:before { content: "\f0eb"; } .fa-exchange:before { content: "\f0ec"; } .fa-cloud-download:before { content: "\f0ed"; } .fa-cloud-upload:before { content: "\f0ee"; } .fa-user-md:before { content: "\f0f0"; } .fa-stethoscope:before { content: "\f0f1"; } .fa-suitcase:before { content: "\f0f2"; } .fa-bell-o:before { content: "\f0a2"; } .fa-coffee:before { content: "\f0f4"; } .fa-cutlery:before { content: "\f0f5"; } .fa-file-text-o:before { content: "\f0f6"; } .fa-building-o:before { content: "\f0f7"; } .fa-hospital-o:before { content: "\f0f8"; } .fa-ambulance:before { content: "\f0f9"; } .fa-medkit:before { content: "\f0fa"; } .fa-fighter-jet:before { content: "\f0fb"; } .fa-beer:before { content: "\f0fc"; } .fa-h-square:before { content: "\f0fd"; } .fa-plus-square:before { content: "\f0fe"; } .fa-angle-double-left:before { content: "\f100"; } .fa-angle-double-right:before { content: "\f101"; } .fa-angle-double-up:before { content: "\f102"; } .fa-angle-double-down:before { content: "\f103"; } .fa-angle-left:before { content: "\f104"; } .fa-angle-right:before { content: "\f105"; } .fa-angle-up:before { content: "\f106"; } .fa-angle-down:before { content: "\f107"; } .fa-desktop:before { content: "\f108"; } .fa-laptop:before { content: "\f109"; } .fa-tablet:before { content: "\f10a"; } .fa-mobile-phone:before, .fa-mobile:before { content: "\f10b"; } .fa-circle-o:before { content: "\f10c"; } .fa-quote-left:before { content: "\f10d"; } .fa-quote-right:before { content: "\f10e"; } .fa-spinner:before { content: "\f110"; } .fa-circle:before { content: "\f111"; } .fa-mail-reply:before, .fa-reply:before { content: "\f112"; } .fa-github-alt:before { content: "\f113"; } .fa-folder-o:before { content: "\f114"; } .fa-folder-open-o:before { content: "\f115"; } .fa-smile-o:before { content: "\f118"; } .fa-frown-o:before { content: "\f119"; } .fa-meh-o:before { content: "\f11a"; } .fa-gamepad:before { content: "\f11b"; } .fa-keyboard-o:before { content: "\f11c"; } .fa-flag-o:before { content: "\f11d"; } .fa-flag-checkered:before { content: "\f11e"; } .fa-terminal:before { content: "\f120"; } .fa-code:before { content: "\f121"; } .fa-mail-reply-all:before, .fa-reply-all:before { content: "\f122"; } .fa-star-half-empty:before, .fa-star-half-full:before, .fa-star-half-o:before { content: "\f123"; } .fa-location-arrow:before { content: "\f124"; } .fa-crop:before { content: "\f125"; } .fa-code-fork:before { content: "\f126"; } .fa-unlink:before, .fa-chain-broken:before { content: "\f127"; } .fa-question:before { content: "\f128"; } .fa-info:before { content: "\f129"; } .fa-exclamation:before { content: "\f12a"; } .fa-superscript:before { content: "\f12b"; } .fa-subscript:before { content: "\f12c"; } .fa-eraser:before { content: "\f12d"; } .fa-puzzle-piece:before { content: "\f12e"; } .fa-microphone:before { content: "\f130"; } .fa-microphone-slash:before { content: "\f131"; } .fa-shield:before { content: "\f132"; } .fa-calendar-o:before { content: "\f133"; } .fa-fire-extinguisher:before { content: "\f134"; } .fa-rocket:before { content: "\f135"; } .fa-maxcdn:before { content: "\f136"; } .fa-chevron-circle-left:before { content: "\f137"; } .fa-chevron-circle-right:before { content: "\f138"; } .fa-chevron-circle-up:before { content: "\f139"; } .fa-chevron-circle-down:before { content: "\f13a"; } .fa-html5:before { content: "\f13b"; } .fa-css3:before { content: "\f13c"; } .fa-anchor:before { content: "\f13d"; } .fa-unlock-alt:before { content: "\f13e"; } .fa-bullseye:before { content: "\f140"; } .fa-ellipsis-h:before { content: "\f141"; } .fa-ellipsis-v:before { content: "\f142"; } .fa-rss-square:before { content: "\f143"; } .fa-play-circle:before { content: "\f144"; } .fa-ticket:before { content: "\f145"; } .fa-minus-square:before { content: "\f146"; } .fa-minus-square-o:before { content: "\f147"; } .fa-level-up:before { content: "\f148"; } .fa-level-down:before { content: "\f149"; } .fa-check-square:before { content: "\f14a"; } .fa-pencil-square:before { content: "\f14b"; } .fa-external-link-square:before { content: "\f14c"; } .fa-share-square:before { content: "\f14d"; } .fa-compass:before { content: "\f14e"; } .fa-toggle-down:before, .fa-caret-square-o-down:before { content: "\f150"; } .fa-toggle-up:before, .fa-caret-square-o-up:before { content: "\f151"; } .fa-toggle-right:before, .fa-caret-square-o-right:before { content: "\f152"; } .fa-euro:before, .fa-eur:before { content: "\f153"; } .fa-gbp:before { content: "\f154"; } .fa-dollar:before, .fa-usd:before { content: "\f155"; } .fa-rupee:before, .fa-inr:before { content: "\f156"; } .fa-cny:before, .fa-rmb:before, .fa-yen:before, .fa-jpy:before { content: "\f157"; } .fa-ruble:before, .fa-rouble:before, .fa-rub:before { content: "\f158"; } .fa-won:before, .fa-krw:before { content: "\f159"; } .fa-bitcoin:before, .fa-btc:before { content: "\f15a"; } .fa-file:before { content: "\f15b"; } .fa-file-text:before { content: "\f15c"; } .fa-sort-alpha-asc:before { content: "\f15d"; } .fa-sort-alpha-desc:before { content: "\f15e"; } .fa-sort-amount-asc:before { content: "\f160"; } .fa-sort-amount-desc:before { content: "\f161"; } .fa-sort-numeric-asc:before { content: "\f162"; } .fa-sort-numeric-desc:before { content: "\f163"; } .fa-thumbs-up:before { content: "\f164"; } .fa-thumbs-down:before { content: "\f165"; } .fa-youtube-square:before { content: "\f166"; } .fa-youtube:before { content: "\f167"; } .fa-xing:before { content: "\f168"; } .fa-xing-square:before { content: "\f169"; } .fa-youtube-play:before { content: "\f16a"; } .fa-dropbox:before { content: "\f16b"; } .fa-stack-overflow:before { content: "\f16c"; } .fa-instagram:before { content: "\f16d"; } .fa-flickr:before { content: "\f16e"; } .fa-adn:before { content: "\f170"; } .fa-bitbucket:before { content: "\f171"; } .fa-bitbucket-square:before { content: "\f172"; } .fa-tumblr:before { content: "\f173"; } .fa-tumblr-square:before { content: "\f174"; } .fa-long-arrow-down:before { content: "\f175"; } .fa-long-arrow-up:before { content: "\f176"; } .fa-long-arrow-left:before { content: "\f177"; } .fa-long-arrow-right:before { content: "\f178"; } .fa-apple:before { content: "\f179"; } .fa-windows:before { content: "\f17a"; } .fa-android:before { content: "\f17b"; } .fa-linux:before { content: "\f17c"; } .fa-dribbble:before { content: "\f17d"; } .fa-skype:before { content: "\f17e"; } .fa-foursquare:before { content: "\f180"; } .fa-trello:before { content: "\f181"; } .fa-female:before { content: "\f182"; } .fa-male:before { content: "\f183"; } .fa-gittip:before, .fa-gratipay:before { content: "\f184"; } .fa-sun-o:before { content: "\f185"; } .fa-moon-o:before { content: "\f186"; } .fa-archive:before { content: "\f187"; } .fa-bug:before { content: "\f188"; } .fa-vk:before { content: "\f189"; } .fa-weibo:before { content: "\f18a"; } .fa-renren:before { content: "\f18b"; } .fa-pagelines:before { content: "\f18c"; } .fa-stack-exchange:before { content: "\f18d"; } .fa-arrow-circle-o-right:before { content: "\f18e"; } .fa-arrow-circle-o-left:before { content: "\f190"; } .fa-toggle-left:before, .fa-caret-square-o-left:before { content: "\f191"; } .fa-dot-circle-o:before { content: "\f192"; } .fa-wheelchair:before { content: "\f193"; } .fa-vimeo-square:before { content: "\f194"; } .fa-turkish-lira:before, .fa-try:before { content: "\f195"; } .fa-plus-square-o:before { content: "\f196"; } .fa-space-shuttle:before { content: "\f197"; } .fa-slack:before { content: "\f198"; } .fa-envelope-square:before { content: "\f199"; } .fa-wordpress:before { content: "\f19a"; } .fa-openid:before { content: "\f19b"; } .fa-institution:before, .fa-bank:before, .fa-university:before { content: "\f19c"; } .fa-mortar-board:before, .fa-graduation-cap:before { content: "\f19d"; } .fa-yahoo:before { content: "\f19e"; } .fa-google:before { content: "\f1a0"; } .fa-reddit:before { content: "\f1a1"; } .fa-reddit-square:before { content: "\f1a2"; } .fa-stumbleupon-circle:before { content: "\f1a3"; } .fa-stumbleupon:before { content: "\f1a4"; } .fa-delicious:before { content: "\f1a5"; } .fa-digg:before { content: "\f1a6"; } .fa-pied-piper:before { content: "\f1a7"; } .fa-pied-piper-alt:before { content: "\f1a8"; } .fa-drupal:before { content: "\f1a9"; } .fa-joomla:before { content: "\f1aa"; } .fa-language:before { content: "\f1ab"; } .fa-fax:before { content: "\f1ac"; } .fa-building:before { content: "\f1ad"; } .fa-child:before { content: "\f1ae"; } .fa-paw:before { content: "\f1b0"; } .fa-spoon:before { content: "\f1b1"; } .fa-cube:before { content: "\f1b2"; } .fa-cubes:before { content: "\f1b3"; } .fa-behance:before { content: "\f1b4"; } .fa-behance-square:before { content: "\f1b5"; } .fa-steam:before { content: "\f1b6"; } .fa-steam-square:before { content: "\f1b7"; } .fa-recycle:before { content: "\f1b8"; } .fa-automobile:before, .fa-car:before { content: "\f1b9"; } .fa-cab:before, .fa-taxi:before { content: "\f1ba"; } .fa-tree:before { content: "\f1bb"; } .fa-spotify:before { content: "\f1bc"; } .fa-deviantart:before { content: "\f1bd"; } .fa-soundcloud:before { content: "\f1be"; } .fa-database:before { content: "\f1c0"; } .fa-file-pdf-o:before { content: "\f1c1"; } .fa-file-word-o:before { content: "\f1c2"; } .fa-file-excel-o:before { content: "\f1c3"; } .fa-file-powerpoint-o:before { content: "\f1c4"; } .fa-file-photo-o:before, .fa-file-picture-o:before, .fa-file-image-o:before { content: "\f1c5"; } .fa-file-zip-o:before, .fa-file-archive-o:before { content: "\f1c6"; } .fa-file-sound-o:before, .fa-file-audio-o:before { content: "\f1c7"; } .fa-file-movie-o:before, .fa-file-video-o:before { content: "\f1c8"; } .fa-file-code-o:before { content: "\f1c9"; } .fa-vine:before { content: "\f1ca"; } .fa-codepen:before { content: "\f1cb"; } .fa-jsfiddle:before { content: "\f1cc"; } .fa-life-bouy:before, .fa-life-buoy:before, .fa-life-saver:before, .fa-support:before, .fa-life-ring:before { content: "\f1cd"; } .fa-circle-o-notch:before { content: "\f1ce"; } .fa-ra:before, .fa-rebel:before { content: "\f1d0"; } .fa-ge:before, .fa-empire:before { content: "\f1d1"; } .fa-git-square:before { content: "\f1d2"; } .fa-git:before { content: "\f1d3"; } .fa-y-combinator-square:before, .fa-yc-square:before, .fa-hacker-news:before { content: "\f1d4"; } .fa-tencent-weibo:before { content: "\f1d5"; } .fa-qq:before { content: "\f1d6"; } .fa-wechat:before, .fa-weixin:before { content: "\f1d7"; } .fa-send:before, .fa-paper-plane:before { content: "\f1d8"; } .fa-send-o:before, .fa-paper-plane-o:before { content: "\f1d9"; } .fa-history:before { content: "\f1da"; } .fa-circle-thin:before { content: "\f1db"; } .fa-header:before { content: "\f1dc"; } .fa-paragraph:before { content: "\f1dd"; } .fa-sliders:before { content: "\f1de"; } .fa-share-alt:before { content: "\f1e0"; } .fa-share-alt-square:before { content: "\f1e1"; } .fa-bomb:before { content: "\f1e2"; } .fa-soccer-ball-o:before, .fa-futbol-o:before { content: "\f1e3"; } .fa-tty:before { content: "\f1e4"; } .fa-binoculars:before { content: "\f1e5"; } .fa-plug:before { content: "\f1e6"; } .fa-slideshare:before { content: "\f1e7"; } .fa-twitch:before { content: "\f1e8"; } .fa-yelp:before { content: "\f1e9"; } .fa-newspaper-o:before { content: "\f1ea"; } .fa-wifi:before { content: "\f1eb"; } .fa-calculator:before { content: "\f1ec"; } .fa-paypal:before { content: "\f1ed"; } .fa-google-wallet:before { content: "\f1ee"; } .fa-cc-visa:before { content: "\f1f0"; } .fa-cc-mastercard:before { content: "\f1f1"; } .fa-cc-discover:before { content: "\f1f2"; } .fa-cc-amex:before { content: "\f1f3"; } .fa-cc-paypal:before { content: "\f1f4"; } .fa-cc-stripe:before { content: "\f1f5"; } .fa-bell-slash:before { content: "\f1f6"; } .fa-bell-slash-o:before { content: "\f1f7"; } .fa-trash:before { content: "\f1f8"; } .fa-copyright:before { content: "\f1f9"; } .fa-at:before { content: "\f1fa"; } .fa-eyedropper:before { content: "\f1fb"; } .fa-paint-brush:before { content: "\f1fc"; } .fa-birthday-cake:before { content: "\f1fd"; } .fa-area-chart:before { content: "\f1fe"; } .fa-pie-chart:before { content: "\f200"; } .fa-line-chart:before { content: "\f201"; } .fa-lastfm:before { content: "\f202"; } .fa-lastfm-square:before { content: "\f203"; } .fa-toggle-off:before { content: "\f204"; } .fa-toggle-on:before { content: "\f205"; } .fa-bicycle:before { content: "\f206"; } .fa-bus:before { content: "\f207"; } .fa-ioxhost:before { content: "\f208"; } .fa-angellist:before { content: "\f209"; } .fa-cc:before { content: "\f20a"; } .fa-shekel:before, .fa-sheqel:before, .fa-ils:before { content: "\f20b"; } .fa-meanpath:before { content: "\f20c"; } .fa-buysellads:before { content: "\f20d"; } .fa-connectdevelop:before { content: "\f20e"; } .fa-dashcube:before { content: "\f210"; } .fa-forumbee:before { content: "\f211"; } .fa-leanpub:before { content: "\f212"; } .fa-sellsy:before { content: "\f213"; } .fa-shirtsinbulk:before { content: "\f214"; } .fa-simplybuilt:before { content: "\f215"; } .fa-skyatlas:before { content: "\f216"; } .fa-cart-plus:before { content: "\f217"; } .fa-cart-arrow-down:before { content: "\f218"; } .fa-diamond:before { content: "\f219"; } .fa-ship:before { content: "\f21a"; } .fa-user-secret:before { content: "\f21b"; } .fa-motorcycle:before { content: "\f21c"; } .fa-street-view:before { content: "\f21d"; } .fa-heartbeat:before { content: "\f21e"; } .fa-venus:before { content: "\f221"; } .fa-mars:before { content: "\f222"; } .fa-mercury:before { content: "\f223"; } .fa-intersex:before, .fa-transgender:before { content: "\f224"; } .fa-transgender-alt:before { content: "\f225"; } .fa-venus-double:before { content: "\f226"; } .fa-mars-double:before { content: "\f227"; } .fa-venus-mars:before { content: "\f228"; } .fa-mars-stroke:before { content: "\f229"; } .fa-mars-stroke-v:before { content: "\f22a"; } .fa-mars-stroke-h:before { content: "\f22b"; } .fa-neuter:before { content: "\f22c"; } .fa-genderless:before { content: "\f22d"; } .fa-facebook-official:before { content: "\f230"; } .fa-pinterest-p:before { content: "\f231"; } .fa-whatsapp:before { content: "\f232"; } .fa-server:before { content: "\f233"; } .fa-user-plus:before { content: "\f234"; } .fa-user-times:before { content: "\f235"; } .fa-hotel:before, .fa-bed:before { content: "\f236"; } .fa-viacoin:before { content: "\f237"; } .fa-train:before { content: "\f238"; } .fa-subway:before { content: "\f239"; } .fa-medium:before { content: "\f23a"; } .fa-yc:before, .fa-y-combinator:before { content: "\f23b"; } .fa-optin-monster:before { content: "\f23c"; } .fa-opencart:before { content: "\f23d"; } .fa-expeditedssl:before { content: "\f23e"; } .fa-battery-4:before, .fa-battery-full:before { content: "\f240"; } .fa-battery-3:before, .fa-battery-three-quarters:before { content: "\f241"; } .fa-battery-2:before, .fa-battery-half:before { content: "\f242"; } .fa-battery-1:before, .fa-battery-quarter:before { content: "\f243"; } .fa-battery-0:before, .fa-battery-empty:before { content: "\f244"; } .fa-mouse-pointer:before { content: "\f245"; } .fa-i-cursor:before { content: "\f246"; } .fa-object-group:before { content: "\f247"; } .fa-object-ungroup:before { content: "\f248"; } .fa-sticky-note:before { content: "\f249"; } .fa-sticky-note-o:before { content: "\f24a"; } .fa-cc-jcb:before { content: "\f24b"; } .fa-cc-diners-club:before { content: "\f24c"; } .fa-clone:before { content: "\f24d"; } .fa-balance-scale:before { content: "\f24e"; } .fa-hourglass-o:before { content: "\f250"; } .fa-hourglass-1:before, .fa-hourglass-start:before { content: "\f251"; } .fa-hourglass-2:before, .fa-hourglass-half:before { content: "\f252"; } .fa-hourglass-3:before, .fa-hourglass-end:before { content: "\f253"; } .fa-hourglass:before { content: "\f254"; } .fa-hand-grab-o:before, .fa-hand-rock-o:before { content: "\f255"; } .fa-hand-stop-o:before, .fa-hand-paper-o:before { content: "\f256"; } .fa-hand-scissors-o:before { content: "\f257"; } .fa-hand-lizard-o:before { content: "\f258"; } .fa-hand-spock-o:before { content: "\f259"; } .fa-hand-pointer-o:before { content: "\f25a"; } .fa-hand-peace-o:before { content: "\f25b"; } .fa-trademark:before { content: "\f25c"; } .fa-registered:before { content: "\f25d"; } .fa-creative-commons:before { content: "\f25e"; } .fa-gg:before { content: "\f260"; } .fa-gg-circle:before { content: "\f261"; } .fa-tripadvisor:before { content: "\f262"; } .fa-odnoklassniki:before { content: "\f263"; } .fa-odnoklassniki-square:before { content: "\f264"; } .fa-get-pocket:before { content: "\f265"; } .fa-wikipedia-w:before { content: "\f266"; } .fa-safari:before { content: "\f267"; } .fa-chrome:before { content: "\f268"; } .fa-firefox:before { content: "\f269"; } .fa-opera:before { content: "\f26a"; } .fa-internet-explorer:before { content: "\f26b"; } .fa-tv:before, .fa-television:before { content: "\f26c"; } .fa-contao:before { content: "\f26d"; } .fa-500px:before { content: "\f26e"; } .fa-amazon:before { content: "\f270"; } .fa-calendar-plus-o:before { content: "\f271"; } .fa-calendar-minus-o:before { content: "\f272"; } .fa-calendar-times-o:before { content: "\f273"; } .fa-calendar-check-o:before { content: "\f274"; } .fa-industry:before { content: "\f275"; } .fa-map-pin:before { content: "\f276"; } .fa-map-signs:before { content: "\f277"; } .fa-map-o:before { content: "\f278"; } .fa-map:before { content: "\f279"; } .fa-commenting:before { content: "\f27a"; } .fa-commenting-o:before { content: "\f27b"; } .fa-houzz:before { content: "\f27c"; } .fa-vimeo:before { content: "\f27d"; } .fa-black-tie:before { content: "\f27e"; } .fa-fonticons:before { content: "\f280"; } @font-face { font-family: 'themify'; src: url('../fonts/themify.eot?-fvbane'); src: url('../fonts/themify.eot?#iefix-fvbane') format('embedded-opentype'), url('../fonts/themify.woff?-fvbane') format('woff'), url('../fonts/themify.ttf?-fvbane') format('truetype'), url('../fonts/themify.svg?-fvbane#themify') format('svg'); font-weight: normal; font-style: normal; } [class^="ti-"], [class*=" ti-"] { font-family: 'themify'; speak: none; font-style: normal; font-weight: normal; font-variant: normal; text-transform: none; line-height: 1; /* Better Font Rendering =========== */ -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .ti-wand:before { content: "\e600"; } .ti-volume:before { content: "\e601"; } .ti-user:before { content: "\e602"; } .ti-unlock:before { content: "\e603"; } .ti-unlink:before { content: "\e604"; } .ti-trash:before { content: "\e605"; } .ti-thought:before { content: "\e606"; } .ti-target:before { content: "\e607"; } .ti-tag:before { content: "\e608"; } .ti-tablet:before { content: "\e609"; } .ti-star:before { content: "\e60a"; } .ti-spray:before { content: "\e60b"; } .ti-signal:before { content: "\e60c"; } .ti-shopping-cart:before { content: "\e60d"; } .ti-shopping-cart-full:before { content: "\e60e"; } .ti-settings:before { content: "\e60f"; } .ti-search:before { content: "\e610"; } .ti-zoom-in:before { content: "\e611"; } .ti-zoom-out:before { content: "\e612"; } .ti-cut:before { content: "\e613"; } .ti-ruler:before { content: "\e614"; } .ti-ruler-pencil:before { content: "\e615"; } .ti-ruler-alt:before { content: "\e616"; } .ti-bookmark:before { content: "\e617"; } .ti-bookmark-alt:before { content: "\e618"; } .ti-reload:before { content: "\e619"; } .ti-plus:before { content: "\e61a"; } .ti-pin:before { content: "\e61b"; } .ti-pencil:before { content: "\e61c"; } .ti-pencil-alt:before { content: "\e61d"; } .ti-paint-roller:before { content: "\e61e"; } .ti-paint-bucket:before { content: "\e61f"; } .ti-na:before { content: "\e620"; } .ti-mobile:before { content: "\e621"; } .ti-minus:before { content: "\e622"; } .ti-medall:before { content: "\e623"; } .ti-medall-alt:before { content: "\e624"; } .ti-marker:before { content: "\e625"; } .ti-marker-alt:before { content: "\e626"; } .ti-arrow-up:before { content: "\e627"; } .ti-arrow-right:before { content: "\e628"; } .ti-arrow-left:before { content: "\e629"; } .ti-arrow-down:before { content: "\e62a"; } .ti-lock:before { content: "\e62b"; } .ti-location-arrow:before { content: "\e62c"; } .ti-link:before { content: "\e62d"; } .ti-layout:before { content: "\e62e"; } .ti-layers:before { content: "\e62f"; } .ti-layers-alt:before { content: "\e630"; } .ti-key:before { content: "\e631"; } .ti-import:before { content: "\e632"; } .ti-image:before { content: "\e633"; } .ti-heart:before { content: "\e634"; } .ti-heart-broken:before { content: "\e635"; } .ti-hand-stop:before { content: "\e636"; } .ti-hand-open:before { content: "\e637"; } .ti-hand-drag:before { content: "\e638"; } .ti-folder:before { content: "\e639"; } .ti-flag:before { content: "\e63a"; } .ti-flag-alt:before { content: "\e63b"; } .ti-flag-alt-2:before { content: "\e63c"; } .ti-eye:before { content: "\e63d"; } .ti-export:before { content: "\e63e"; } .ti-exchange-vertical:before { content: "\e63f"; } .ti-desktop:before { content: "\e640"; } .ti-cup:before { content: "\e641"; } .ti-crown:before { content: "\e642"; } .ti-comments:before { content: "\e643"; } .ti-comment:before { content: "\e644"; } .ti-comment-alt:before { content: "\e645"; } .ti-close:before { content: "\e646"; } .ti-clip:before { content: "\e647"; } .ti-angle-up:before { content: "\e648"; } .ti-angle-right:before { content: "\e649"; } .ti-angle-left:before { content: "\e64a"; } .ti-angle-down:before { content: "\e64b"; } .ti-check:before { content: "\e64c"; } .ti-check-box:before { content: "\e64d"; } .ti-camera:before { content: "\e64e"; } .ti-announcement:before { content: "\e64f"; } .ti-brush:before { content: "\e650"; } .ti-briefcase:before { content: "\e651"; } .ti-bolt:before { content: "\e652"; } .ti-bolt-alt:before { content: "\e653"; } .ti-blackboard:before { content: "\e654"; } .ti-bag:before { content: "\e655"; } .ti-move:before { content: "\e656"; } .ti-arrows-vertical:before { content: "\e657"; } .ti-arrows-horizontal:before { content: "\e658"; } .ti-fullscreen:before { content: "\e659"; } .ti-arrow-top-right:before { content: "\e65a"; } .ti-arrow-top-left:before { content: "\e65b"; } .ti-arrow-circle-up:before { content: "\e65c"; } .ti-arrow-circle-right:before { content: "\e65d"; } .ti-arrow-circle-left:before { content: "\e65e"; } .ti-arrow-circle-down:before { content: "\e65f"; } .ti-angle-double-up:before { content: "\e660"; } .ti-angle-double-right:before { content: "\e661"; } .ti-angle-double-left:before { content: "\e662"; } .ti-angle-double-down:before { content: "\e663"; } .ti-zip:before { content: "\e664"; } .ti-world:before { content: "\e665"; } .ti-wheelchair:before { content: "\e666"; } .ti-view-list:before { content: "\e667"; } .ti-view-list-alt:before { content: "\e668"; } .ti-view-grid:before { content: "\e669"; } .ti-uppercase:before { content: "\e66a"; } .ti-upload:before { content: "\e66b"; } .ti-underline:before { content: "\e66c"; } .ti-truck:before { content: "\e66d"; } .ti-timer:before { content: "\e66e"; } .ti-ticket:before { content: "\e66f"; } .ti-thumb-up:before { content: "\e670"; } .ti-thumb-down:before { content: "\e671"; } .ti-text:before { content: "\e672"; } .ti-stats-up:before { content: "\e673"; } .ti-stats-down:before { content: "\e674"; } .ti-split-v:before { content: "\e675"; } .ti-split-h:before { content: "\e676"; } .ti-smallcap:before { content: "\e677"; } .ti-shine:before { content: "\e678"; } .ti-shift-right:before { content: "\e679"; } .ti-shift-left:before { content: "\e67a"; } .ti-shield:before { content: "\e67b"; } .ti-notepad:before { content: "\e67c"; } .ti-server:before { content: "\e67d"; } .ti-quote-right:before { content: "\e67e"; } .ti-quote-left:before { content: "\e67f"; } .ti-pulse:before { content: "\e680"; } .ti-printer:before { content: "\e681"; } .ti-power-off:before { content: "\e682"; } .ti-plug:before { content: "\e683"; } .ti-pie-chart:before { content: "\e684"; } .ti-paragraph:before { content: "\e685"; } .ti-panel:before { content: "\e686"; } .ti-package:before { content: "\e687"; } .ti-music:before { content: "\e688"; } .ti-music-alt:before { content: "\e689"; } .ti-mouse:before { content: "\e68a"; } .ti-mouse-alt:before { content: "\e68b"; } .ti-money:before { content: "\e68c"; } .ti-microphone:before { content: "\e68d"; } .ti-menu:before { content: "\e68e"; } .ti-menu-alt:before { content: "\e68f"; } .ti-map:before { content: "\e690"; } .ti-map-alt:before { content: "\e691"; } .ti-loop:before { content: "\e692"; } .ti-location-pin:before { content: "\e693"; } .ti-list:before { content: "\e694"; } .ti-light-bulb:before { content: "\e695"; } .ti-Italic:before { content: "\e696"; } .ti-info:before { content: "\e697"; } .ti-infinite:before { content: "\e698"; } .ti-id-badge:before { content: "\e699"; } .ti-hummer:before { content: "\e69a"; } .ti-home:before { content: "\e69b"; } .ti-help:before { content: "\e69c"; } .ti-headphone:before { content: "\e69d"; } .ti-harddrives:before { content: "\e69e"; } .ti-harddrive:before { content: "\e69f"; } .ti-gift:before { content: "\e6a0"; } .ti-game:before { content: "\e6a1"; } .ti-filter:before { content: "\e6a2"; } .ti-files:before { content: "\e6a3"; } .ti-file:before { content: "\e6a4"; } .ti-eraser:before { content: "\e6a5"; } .ti-envelope:before { content: "\e6a6"; } .ti-download:before { content: "\e6a7"; } .ti-direction:before { content: "\e6a8"; } .ti-direction-alt:before { content: "\e6a9"; } .ti-dashboard:before { content: "\e6aa"; } .ti-control-stop:before { content: "\e6ab"; } .ti-control-shuffle:before { content: "\e6ac"; } .ti-control-play:before { content: "\e6ad"; } .ti-control-pause:before { content: "\e6ae"; } .ti-control-forward:before { content: "\e6af"; } .ti-control-backward:before { content: "\e6b0"; } .ti-cloud:before { content: "\e6b1"; } .ti-cloud-up:before { content: "\e6b2"; } .ti-cloud-down:before { content: "\e6b3"; } .ti-clipboard:before { content: "\e6b4"; } .ti-car:before { content: "\e6b5"; } .ti-calendar:before { content: "\e6b6"; } .ti-book:before { content: "\e6b7"; } .ti-bell:before { content: "\e6b8"; } .ti-basketball:before { content: "\e6b9"; } .ti-bar-chart:before { content: "\e6ba"; } .ti-bar-chart-alt:before { content: "\e6bb"; } .ti-back-right:before { content: "\e6bc"; } .ti-back-left:before { content: "\e6bd"; } .ti-arrows-corner:before { content: "\e6be"; } .ti-archive:before { content: "\e6bf"; } .ti-anchor:before { content: "\e6c0"; } .ti-align-right:before { content: "\e6c1"; } .ti-align-left:before { content: "\e6c2"; } .ti-align-justify:before { content: "\e6c3"; } .ti-align-center:before { content: "\e6c4"; } .ti-alert:before { content: "\e6c5"; } .ti-alarm-clock:before { content: "\e6c6"; } .ti-agenda:before { content: "\e6c7"; } .ti-write:before { content: "\e6c8"; } .ti-window:before { content: "\e6c9"; } .ti-widgetized:before { content: "\e6ca"; } .ti-widget:before { content: "\e6cb"; } .ti-widget-alt:before { content: "\e6cc"; } .ti-wallet:before { content: "\e6cd"; } .ti-video-clapper:before { content: "\e6ce"; } .ti-video-camera:before { content: "\e6cf"; } .ti-vector:before { content: "\e6d0"; } .ti-themify-logo:before { content: "\e6d1"; } .ti-themify-favicon:before { content: "\e6d2"; } .ti-themify-favicon-alt:before { content: "\e6d3"; } .ti-support:before { content: "\e6d4"; } .ti-stamp:before { content: "\e6d5"; } .ti-split-v-alt:before { content: "\e6d6"; } .ti-slice:before { content: "\e6d7"; } .ti-shortcode:before { content: "\e6d8"; } .ti-shift-right-alt:before { content: "\e6d9"; } .ti-shift-left-alt:before { content: "\e6da"; } .ti-ruler-alt-2:before { content: "\e6db"; } .ti-receipt:before { content: "\e6dc"; } .ti-pin2:before { content: "\e6dd"; } .ti-pin-alt:before { content: "\e6de"; } .ti-pencil-alt2:before { content: "\e6df"; } .ti-palette:before { content: "\e6e0"; } .ti-more:before { content: "\e6e1"; } .ti-more-alt:before { content: "\e6e2"; } .ti-microphone-alt:before { content: "\e6e3"; } .ti-magnet:before { content: "\e6e4"; } .ti-line-double:before { content: "\e6e5"; } .ti-line-dotted:before { content: "\e6e6"; } .ti-line-dashed:before { content: "\e6e7"; } .ti-layout-width-full:before { content: "\e6e8"; } .ti-layout-width-default:before { content: "\e6e9"; } .ti-layout-width-default-alt:before { content: "\e6ea"; } .ti-layout-tab:before { content: "\e6eb"; } .ti-layout-tab-window:before { content: "\e6ec"; } .ti-layout-tab-v:before { content: "\e6ed"; } .ti-layout-tab-min:before { content: "\e6ee"; } .ti-layout-slider:before { content: "\e6ef"; } .ti-layout-slider-alt:before { content: "\e6f0"; } .ti-layout-sidebar-right:before { content: "\e6f1"; } .ti-layout-sidebar-none:before { content: "\e6f2"; } .ti-layout-sidebar-left:before { content: "\e6f3"; } .ti-layout-placeholder:before { content: "\e6f4"; } .ti-layout-menu:before { content: "\e6f5"; } .ti-layout-menu-v:before { content: "\e6f6"; } .ti-layout-menu-separated:before { content: "\e6f7"; } .ti-layout-menu-full:before { content: "\e6f8"; } .ti-layout-media-right-alt:before { content: "\e6f9"; } .ti-layout-media-right:before { content: "\e6fa"; } .ti-layout-media-overlay:before { content: "\e6fb"; } .ti-layout-media-overlay-alt:before { content: "\e6fc"; } .ti-layout-media-overlay-alt-2:before { content: "\e6fd"; } .ti-layout-media-left-alt:before { content: "\e6fe"; } .ti-layout-media-left:before { content: "\e6ff"; } .ti-layout-media-center-alt:before { content: "\e700"; } .ti-layout-media-center:before { content: "\e701"; } .ti-layout-list-thumb:before { content: "\e702"; } .ti-layout-list-thumb-alt:before { content: "\e703"; } .ti-layout-list-post:before { content: "\e704"; } .ti-layout-list-large-image:before { content: "\e705"; } .ti-layout-line-solid:before { content: "\e706"; } .ti-layout-grid4:before { content: "\e707"; } .ti-layout-grid3:before { content: "\e708"; } .ti-layout-grid2:before { content: "\e709"; } .ti-layout-grid2-thumb:before { content: "\e70a"; } .ti-layout-cta-right:before { content: "\e70b"; } .ti-layout-cta-left:before { content: "\e70c"; } .ti-layout-cta-center:before { content: "\e70d"; } .ti-layout-cta-btn-right:before { content: "\e70e"; } .ti-layout-cta-btn-left:before { content: "\e70f"; } .ti-layout-column4:before { content: "\e710"; } .ti-layout-column3:before { content: "\e711"; } .ti-layout-column2:before { content: "\e712"; } .ti-layout-accordion-separated:before { content: "\e713"; } .ti-layout-accordion-merged:before { content: "\e714"; } .ti-layout-accordion-list:before { content: "\e715"; } .ti-ink-pen:before { content: "\e716"; } .ti-info-alt:before { content: "\e717"; } .ti-help-alt:before { content: "\e718"; } .ti-headphone-alt:before { content: "\e719"; } .ti-hand-point-up:before { content: "\e71a"; } .ti-hand-point-right:before { content: "\e71b"; } .ti-hand-point-left:before { content: "\e71c"; } .ti-hand-point-down:before { content: "\e71d"; } .ti-gallery:before { content: "\e71e"; } .ti-face-smile:before { content: "\e71f"; } .ti-face-sad:before { content: "\e720"; } .ti-credit-card:before { content: "\e721"; } .ti-control-skip-forward:before { content: "\e722"; } .ti-control-skip-backward:before { content: "\e723"; } .ti-control-record:before { content: "\e724"; } .ti-control-eject:before { content: "\e725"; } .ti-comments-smiley:before { content: "\e726"; } .ti-brush-alt:before { content: "\e727"; } .ti-youtube:before { content: "\e728"; } .ti-vimeo:before { content: "\e729"; } .ti-twitter:before { content: "\e72a"; } .ti-time:before { content: "\e72b"; } .ti-tumblr:before { content: "\e72c"; } .ti-skype:before { content: "\e72d"; } .ti-share:before { content: "\e72e"; } .ti-share-alt:before { content: "\e72f"; } .ti-rocket:before { content: "\e730"; } .ti-pinterest:before { content: "\e731"; } .ti-new-window:before { content: "\e732"; } .ti-microsoft:before { content: "\e733"; } .ti-list-ol:before { content: "\e734"; } .ti-linkedin:before { content: "\e735"; } .ti-layout-sidebar-2:before { content: "\e736"; } .ti-layout-grid4-alt:before { content: "\e737"; } .ti-layout-grid3-alt:before { content: "\e738"; } .ti-layout-grid2-alt:before { content: "\e739"; } .ti-layout-column4-alt:before { content: "\e73a"; } .ti-layout-column3-alt:before { content: "\e73b"; } .ti-layout-column2-alt:before { content: "\e73c"; } .ti-instagram:before { content: "\e73d"; } .ti-google:before { content: "\e73e"; } .ti-github:before { content: "\e73f"; } .ti-flickr:before { content: "\e740"; } .ti-facebook:before { content: "\e741"; } .ti-dropbox:before { content: "\e742"; } .ti-dribbble:before { content: "\e743"; } .ti-apple:before { content: "\e744"; } .ti-android:before { content: "\e745"; } .ti-save:before { content: "\e746"; } .ti-save-alt:before { content: "\e747"; } .ti-yahoo:before { content: "\e748"; } .ti-wordpress:before { content: "\e749"; } .ti-vimeo-alt:before { content: "\e74a"; } .ti-twitter-alt:before { content: "\e74b"; } .ti-tumblr-alt:before { content: "\e74c"; } .ti-trello:before { content: "\e74d"; } .ti-stack-overflow:before { content: "\e74e"; } .ti-soundcloud:before { content: "\e74f"; } .ti-sharethis:before { content: "\e750"; } .ti-sharethis-alt:before { content: "\e751"; } .ti-reddit:before { content: "\e752"; } .ti-pinterest-alt:before { content: "\e753"; } .ti-microsoft-alt:before { content: "\e754"; } .ti-linux:before { content: "\e755"; } .ti-jsfiddle:before { content: "\e756"; } .ti-joomla:before { content: "\e757"; } .ti-html5:before { content: "\e758"; } .ti-flickr-alt:before { content: "\e759"; } .ti-email:before { content: "\e75a"; } .ti-drupal:before { content: "\e75b"; } .ti-dropbox-alt:before { content: "\e75c"; } .ti-css3:before { content: "\e75d"; } .ti-rss:before { content: "\e75e"; } .ti-rss-alt:before { content: "\e75f"; } /*! * Material Design Iconic Font 1.0.1 by Sergey Kupletsky (@zavoloklom) - http://zavoloklom.github.io/material-design-iconic-font/ * License - https://github.com/zavoloklom/material-design-iconic-font/blob/gh-pages/License.md (Attribution-ShareAlike 4.0 International license) */ @font-face { font-family: 'Material Design Iconic Font'; src: url('../fonts/Material-Design-Iconic-Font.eot?v=1.0.1'); src: url('../fonts/Material-Design-Iconic-Font.eot?#iefix&v=1.0.1') format('embedded-opentype'), url('../fonts/Material-Design-Iconic-Font.woff?v=1.0.1') format('woff'), url('../fonts/Material-Design-Iconic-Font.ttf?v=1.0.1') format('truetype'), url('../fonts/Material-Design-Iconic-Font.svg?v=1.0.1#Material-Design-Iconic-Font') format('svg'); font-weight: normal; font-style: normal; } [class^="md-"], [class*=" md-"] { display: inline-block; font: normal normal normal 14px/1 'Material Design Iconic Font'; font-size: inherit; speak: none; text-rendering: auto; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .md { line-height: inherit; vertical-align: bottom; } .md-lg { font-size: 1.5em; line-height: .5em; vertical-align: -35%; } .md-2x { font-size: 2em; } .md-3x { font-size: 3em; } .md-4x { font-size: 4em; } .md-5x { font-size: 5em; } .md-border { padding: .2em .25em .15em; border: solid 0.08em grey; border-radius: .1em; } .md-border-circle { padding: .2em .25em .15em; border: solid 0.08em grey; border-radius: 50%; } [class^="md-"].pull-left, [class*=" md-"].pull-left { float: left; margin-right: .3em; } [class^="md-"].pull-right, [class*=" md-"].pull-right { float: right; margin-left: .3em; } .md-spin { -webkit-animation: md-spin 1.5s infinite linear; animation: md-spin 1.5s infinite linear; } .md-spin-reverse { -webkit-animation: md-spin-reverse 1.5s infinite linear; animation: md-spin-reverse 1.5s infinite linear; } @-webkit-keyframes md-spin { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(359deg); transform: rotate(359deg); } } @keyframes md-spin { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(359deg); transform: rotate(359deg); } } @-webkit-keyframes md-spin-reverse { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(-359deg); transform: rotate(-359deg); } } @keyframes md-spin-reverse { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(-359deg); transform: rotate(-359deg); } } .md-rotate-90 { filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); -webkit-transform: rotate(90deg); -ms-transform: rotate(90deg); transform: rotate(90deg); } .md-rotate-180 { filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); -webkit-transform: rotate(180deg); -ms-transform: rotate(180deg); transform: rotate(180deg); } .md-rotate-270 { filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); -webkit-transform: rotate(270deg); -ms-transform: rotate(270deg); transform: rotate(270deg); } .md-flip-horizontal { filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1); -webkit-transform: scale(-1, 1); -ms-transform: scale(-1, 1); transform: scale(-1, 1); } .md-flip-vertical { filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1); -webkit-transform: scale(1, -1); -ms-transform: scale(1, -1); transform: scale(1, -1); } :root .md-rotate-90, :root .md-rotate-180, :root .md-rotate-270, :root .md-flip-horizontal, :root .md-flip-vertical { filter: none; } /* Material Design Iconic Font uses the Unicode Private Use Area (PUA) to ensure screen readers do not read off random characters that represent icons */ /* If you do not want use all icons you can disable icon set here */ .md-3d-rotation:before { content: "\f000"; } .md-accessibility:before { content: "\f001"; } .md-account-balance:before { content: "\f002"; } .md-account-balance-wallet:before { content: "\f003"; } .md-account-box:before { content: "\f004"; } .md-account-child:before { content: "\f005"; } .md-account-circle:before { content: "\f006"; } .md-add-shopping-cart:before { content: "\f007"; } .md-alarm:before { content: "\f008"; } .md-alarm-add:before { content: "\f009"; } .md-alarm-off:before { content: "\f00a"; } .md-alarm-on:before { content: "\f00b"; } .md-android:before { content: "\f00c"; } .md-announcement:before { content: "\f00d"; } .md-aspect-ratio:before { content: "\f00e"; } .md-assessment:before { content: "\f00f"; } .md-assignment:before { content: "\f010"; } .md-assignment-ind:before { content: "\f011"; } .md-assignment-late:before { content: "\f012"; } .md-assignment-return:before { content: "\f013"; } .md-assignment-returned:before { content: "\f014"; } .md-assignment-turned-in:before { content: "\f015"; } .md-autorenew:before { content: "\f016"; } .md-backup:before { content: "\f017"; } .md-book:before { content: "\f018"; } .md-bookmark:before { content: "\f019"; } .md-bookmark-outline:before { content: "\f01a"; } .md-bug-report:before { content: "\f01b"; } .md-cached:before { content: "\f01c"; } .md-class:before { content: "\f01d"; } .md-credit-card:before { content: "\f01e"; } .md-dashboard:before { content: "\f01f"; } .md-delete:before { content: "\f020"; } .md-description:before { content: "\f021"; } .md-dns:before { content: "\f022"; } .md-done:before { content: "\f023"; } .md-done-all:before { content: "\f024"; } .md-event:before { content: "\f025"; } .md-exit-to-app:before { content: "\f026"; } .md-explore:before { content: "\f027"; } .md-extension:before { content: "\f028"; } .md-face-unlock:before { content: "\f029"; } .md-favorite:before { content: "\f02a"; } .md-favorite-outline:before { content: "\f02b"; } .md-find-in-page:before { content: "\f02c"; } .md-find-replace:before { content: "\f02d"; } .md-flip-to-back:before { content: "\f02e"; } .md-flip-to-front:before { content: "\f02f"; } .md-get-app:before { content: "\f030"; } .md-grade:before { content: "\f031"; } .md-group-work:before { content: "\f032"; } .md-help:before { content: "\f033"; } .md-highlight-remove:before { content: "\f034"; } .md-history:before { content: "\f035"; } .md-home:before { content: "\f036"; } .md-https:before { content: "\f037"; } .md-info:before { content: "\f038"; } .md-info-outline:before { content: "\f039"; } .md-input:before { content: "\f03a"; } .md-invert-colors:before { content: "\f03b"; } .md-label:before { content: "\f03c"; } .md-label-outline:before { content: "\f03d"; } .md-language:before { content: "\f03e"; } .md-launch:before { content: "\f03f"; } .md-list:before { content: "\f040"; } .md-lock:before { content: "\f041"; } .md-lock-open:before { content: "\f042"; } .md-lock-outline:before { content: "\f043"; } .md-loyalty:before { content: "\f044"; } .md-markunread-mailbox:before { content: "\f045"; } .md-note-add:before { content: "\f046"; } .md-open-in-browser:before { content: "\f047"; } .md-open-in-new:before { content: "\f048"; } .md-open-with:before { content: "\f049"; } .md-pageview:before { content: "\f04a"; } .md-payment:before { content: "\f04b"; } .md-perm-camera-mic:before { content: "\f04c"; } .md-perm-contact-cal:before { content: "\f04d"; } .md-perm-data-setting:before { content: "\f04e"; } .md-perm-device-info:before { content: "\f04f"; } .md-perm-identity:before { content: "\f050"; } .md-perm-media:before { content: "\f051"; } .md-perm-phone-msg:before { content: "\f052"; } .md-perm-scan-wifi:before { content: "\f053"; } .md-picture-in-picture:before { content: "\f054"; } .md-polymer:before { content: "\f055"; } .md-print:before { content: "\f056"; } .md-query-builder:before { content: "\f057"; } .md-question-answer:before { content: "\f058"; } .md-receipt:before { content: "\f059"; } .md-redeem:before { content: "\f05a"; } .md-report-problem:before { content: "\f05b"; } .md-restore:before { content: "\f05c"; } .md-room:before { content: "\f05d"; } .md-schedule:before { content: "\f05e"; } .md-search:before { content: "\f05f"; } .md-settings:before { content: "\f060"; } .md-settings-applications:before { content: "\f061"; } .md-settings-backup-restore:before { content: "\f062"; } .md-settings-bluetooth:before { content: "\f063"; } .md-settings-cell:before { content: "\f064"; } .md-settings-display:before { content: "\f065"; } .md-settings-ethernet:before { content: "\f066"; } .md-settings-input-antenna:before { content: "\f067"; } .md-settings-input-component:before { content: "\f068"; } .md-settings-input-composite:before { content: "\f069"; } .md-settings-input-hdmi:before { content: "\f06a"; } .md-settings-input-svideo:before { content: "\f06b"; } .md-settings-overscan:before { content: "\f06c"; } .md-settings-phone:before { content: "\f06d"; } .md-settings-power:before { content: "\f06e"; } .md-settings-remote:before { content: "\f06f"; } .md-settings-voice:before { content: "\f070"; } .md-shop:before { content: "\f071"; } .md-shopping-basket:before { content: "\f072"; } .md-shopping-cart:before { content: "\f073"; } .md-shop-two:before { content: "\f074"; } .md-speaker-notes:before { content: "\f075"; } .md-spellcheck:before { content: "\f076"; } .md-star-rate:before { content: "\f077"; } .md-stars:before { content: "\f078"; } .md-store:before { content: "\f079"; } .md-subject:before { content: "\f07a"; } .md-swap-horiz:before { content: "\f07b"; } .md-swap-vert:before { content: "\f07c"; } .md-swap-vert-circle:before { content: "\f07d"; } .md-system-update-tv:before { content: "\f07e"; } .md-tab:before { content: "\f07f"; } .md-tab-unselected:before { content: "\f080"; } .md-theaters:before { content: "\f081"; } .md-thumb-down:before { content: "\f082"; } .md-thumbs-up-down:before { content: "\f083"; } .md-thumb-up:before { content: "\f084"; } .md-toc:before { content: "\f085"; } .md-today:before { content: "\f086"; } .md-track-changes:before { content: "\f087"; } .md-translate:before { content: "\f088"; } .md-trending-down:before { content: "\f089"; } .md-trending-neutral:before { content: "\f08a"; } .md-trending-up:before { content: "\f08b"; } .md-turned-in:before { content: "\f08c"; } .md-turned-in-not:before { content: "\f08d"; } .md-verified-user:before { content: "\f08e"; } .md-view-agenda:before { content: "\f08f"; } .md-view-array:before { content: "\f090"; } .md-view-carousel:before { content: "\f091"; } .md-view-column:before { content: "\f092"; } .md-view-day:before { content: "\f093"; } .md-view-headline:before { content: "\f094"; } .md-view-list:before { content: "\f095"; } .md-view-module:before { content: "\f096"; } .md-view-quilt:before { content: "\f097"; } .md-view-stream:before { content: "\f098"; } .md-view-week:before { content: "\f099"; } .md-visibility:before { content: "\f09a"; } .md-visibility-off:before { content: "\f09b"; } .md-wallet-giftcard:before { content: "\f09c"; } .md-wallet-membership:before { content: "\f09d"; } .md-wallet-travel:before { content: "\f09e"; } .md-work:before { content: "\f09f"; } .md-error:before { content: "\f0a0"; } .md-warning:before { content: "\f0a1"; } .md-album:before { content: "\f0a2"; } .md-av-timer:before { content: "\f0a3"; } .md-closed-caption:before { content: "\f0a4"; } .md-equalizer:before { content: "\f0a5"; } .md-explicit:before { content: "\f0a6"; } .md-fast-forward:before { content: "\f0a7"; } .md-fast-rewind:before { content: "\f0a8"; } .md-games:before { content: "\f0a9"; } .md-hearing:before { content: "\f0aa"; } .md-high-quality:before { content: "\f0ab"; } .md-loop:before { content: "\f0ac"; } .md-mic:before { content: "\f0ad"; } .md-mic-none:before { content: "\f0ae"; } .md-mic-off:before { content: "\f0af"; } .md-movie:before { content: "\f0b0"; } .md-my-library-add:before { content: "\f0b1"; } .md-my-library-books:before { content: "\f0b2"; } .md-my-library-music:before { content: "\f0b3"; } .md-new-releases:before { content: "\f0b4"; } .md-not-interested:before { content: "\f0b5"; } .md-pause:before { content: "\f0b6"; } .md-pause-circle-fill:before { content: "\f0b7"; } .md-pause-circle-outline:before { content: "\f0b8"; } .md-play-arrow:before { content: "\f0b9"; } .md-play-circle-fill:before { content: "\f0ba"; } .md-play-circle-outline:before { content: "\f0bb"; } .md-playlist-add:before { content: "\f0bc"; } .md-play-shopping-bag:before { content: "\f0bd"; } .md-queue:before { content: "\f0be"; } .md-queue-music:before { content: "\f0bf"; } .md-radio:before { content: "\f0c0"; } .md-recent-actors:before { content: "\f0c1"; } .md-repeat:before { content: "\f0c2"; } .md-repeat-one:before { content: "\f0c3"; } .md-replay:before { content: "\f0c4"; } .md-shuffle:before { content: "\f0c5"; } .md-skip-next:before { content: "\f0c6"; } .md-skip-previous:before { content: "\f0c7"; } .md-snooze:before { content: "\f0c8"; } .md-stop:before { content: "\f0c9"; } .md-subtitles:before { content: "\f0ca"; } .md-surround-sound:before { content: "\f0cb"; } .md-videocam:before { content: "\f0cc"; } .md-videocam-off:before { content: "\f0cd"; } .md-video-collection:before { content: "\f0ce"; } .md-volume-down:before { content: "\f0cf"; } .md-volume-mute:before { content: "\f0d0"; } .md-volume-off:before { content: "\f0d1"; } .md-volume-up:before { content: "\f0d2"; } .md-web:before { content: "\f0d3"; } .md-business:before { content: "\f0d4"; } .md-call:before { content: "\f0d5"; } .md-call-end:before { content: "\f0d6"; } .md-call-made:before { content: "\f0d7"; } .md-call-merge:before { content: "\f0d8"; } .md-call-missed:before { content: "\f0d9"; } .md-call-received:before { content: "\f0da"; } .md-call-split:before { content: "\f0db"; } .md-chat:before { content: "\f0dc"; } .md-clear-all:before { content: "\f0dd"; } .md-comment:before { content: "\f0de"; } .md-contacts:before { content: "\f0df"; } .md-dialer-sip:before { content: "\f0e0"; } .md-dialpad:before { content: "\f0e1"; } .md-dnd-on:before { content: "\f0e2"; } .md-email:before { content: "\f0e3"; } .md-forum:before { content: "\f0e4"; } .md-import-export:before { content: "\f0e5"; } .md-invert-colors-off:before { content: "\f0e6"; } .md-invert-colors-on:before { content: "\f0e7"; } .md-live-help:before { content: "\f0e8"; } .md-location-off:before { content: "\f0e9"; } .md-location-on:before { content: "\f0ea"; } .md-message:before { content: "\f0eb"; } .md-messenger:before { content: "\f0ec"; } .md-no-sim:before { content: "\f0ed"; } .md-phone:before { content: "\f0ee"; } .md-portable-wifi-off:before { content: "\f0ef"; } .md-quick-contacts-dialer:before { content: "\f0f0"; } .md-quick-contacts-mail:before { content: "\f0f1"; } .md-ring-volume:before { content: "\f0f2"; } .md-stay-current-landscape:before { content: "\f0f3"; } .md-stay-current-portrait:before { content: "\f0f4"; } .md-stay-primary-landscape:before { content: "\f0f5"; } .md-stay-primary-portrait:before { content: "\f0f6"; } .md-swap-calls:before { content: "\f0f7"; } .md-textsms:before { content: "\f0f8"; } .md-voicemail:before { content: "\f0f9"; } .md-vpn-key:before { content: "\f0fa"; } .md-add:before { content: "\f0fb"; } .md-add-box:before { content: "\f0fc"; } .md-add-circle:before { content: "\f0fd"; } .md-add-circle-outline:before { content: "\f0fe"; } .md-archive:before { content: "\f0ff"; } .md-backspace:before { content: "\f100"; } .md-block:before { content: "\f101"; } .md-clear:before { content: "\f102"; } .md-content-copy:before { content: "\f103"; } .md-content-cut:before { content: "\f104"; } .md-content-paste:before { content: "\f105"; } .md-create:before { content: "\f106"; } .md-drafts:before { content: "\f107"; } .md-filter-list:before { content: "\f108"; } .md-flag:before { content: "\f109"; } .md-forward:before { content: "\f10a"; } .md-gesture:before { content: "\f10b"; } .md-inbox:before { content: "\f10c"; } .md-link:before { content: "\f10d"; } .md-mail:before { content: "\f10e"; } .md-markunread:before { content: "\f10f"; } .md-redo:before { content: "\f110"; } .md-remove:before { content: "\f111"; } .md-remove-circle:before { content: "\f112"; } .md-remove-circle-outline:before { content: "\f113"; } .md-reply:before { content: "\f114"; } .md-reply-all:before { content: "\f115"; } .md-report:before { content: "\f116"; } .md-save:before { content: "\f117"; } .md-select-all:before { content: "\f118"; } .md-send:before { content: "\f119"; } .md-sort:before { content: "\f11a"; } .md-text-format:before { content: "\f11b"; } .md-undo:before { content: "\f11c"; } .md-access-alarm:before { content: "\f11d"; } .md-access-alarms:before { content: "\f11e"; } .md-access-time:before { content: "\f11f"; } .md-add-alarm:before { content: "\f120"; } .md-airplanemode-off:before { content: "\f121"; } .md-airplanemode-on:before { content: "\f122"; } .md-battery-20:before { content: "\f123"; } .md-battery-30:before { content: "\f124"; } .md-battery-50:before { content: "\f125"; } .md-battery-60:before { content: "\f126"; } .md-battery-80:before { content: "\f127"; } .md-battery-90:before { content: "\f128"; } .md-battery-alert:before { content: "\f129"; } .md-battery-charging-20:before { content: "\f12a"; } .md-battery-charging-30:before { content: "\f12b"; } .md-battery-charging-50:before { content: "\f12c"; } .md-battery-charging-60:before { content: "\f12d"; } .md-battery-charging-80:before { content: "\f12e"; } .md-battery-charging-90:before { content: "\f12f"; } .md-battery-charging-full:before { content: "\f130"; } .md-battery-full:before { content: "\f131"; } .md-battery-std:before { content: "\f132"; } .md-battery-unknown:before { content: "\f133"; } .md-bluetooth:before { content: "\f134"; } .md-bluetooth-connected:before { content: "\f135"; } .md-bluetooth-disabled:before { content: "\f136"; } .md-bluetooth-searching:before { content: "\f137"; } .md-brightness-auto:before { content: "\f138"; } .md-brightness-high:before { content: "\f139"; } .md-brightness-low:before { content: "\f13a"; } .md-brightness-medium:before { content: "\f13b"; } .md-data-usage:before { content: "\f13c"; } .md-developer-mode:before { content: "\f13d"; } .md-devices:before { content: "\f13e"; } .md-dvr:before { content: "\f13f"; } .md-gps-fixed:before { content: "\f140"; } .md-gps-not-fixed:before { content: "\f141"; } .md-gps-off:before { content: "\f142"; } .md-location-disabled:before { content: "\f143"; } .md-location-searching:before { content: "\f144"; } .md-multitrack-audio:before { content: "\f145"; } .md-network-cell:before { content: "\f146"; } .md-network-wifi:before { content: "\f147"; } .md-nfc:before { content: "\f148"; } .md-now-wallpaper:before { content: "\f149"; } .md-now-widgets:before { content: "\f14a"; } .md-screen-lock-landscape:before { content: "\f14b"; } .md-screen-lock-portrait:before { content: "\f14c"; } .md-screen-lock-rotation:before { content: "\f14d"; } .md-screen-rotation:before { content: "\f14e"; } .md-sd-storage:before { content: "\f14f"; } .md-settings-system-daydream:before { content: "\f150"; } .md-signal-cellular-0-bar:before { content: "\f151"; } .md-signal-cellular-1-bar:before { content: "\f152"; } .md-signal-cellular-2-bar:before { content: "\f153"; } .md-signal-cellular-3-bar:before { content: "\f154"; } .md-signal-cellular-4-bar:before { content: "\f155"; } .md-signal-cellular-connected-no-internet-0-bar:before { content: "\f156"; } .md-signal-cellular-connected-no-internet-1-bar:before { content: "\f157"; } .md-signal-cellular-connected-no-internet-2-bar:before { content: "\f158"; } .md-signal-cellular-connected-no-internet-3-bar:before { content: "\f159"; } .md-signal-cellular-connected-no-internet-4-bar:before { content: "\f15a"; } .md-signal-cellular-no-sim:before { content: "\f15b"; } .md-signal-cellular-null:before { content: "\f15c"; } .md-signal-cellular-off:before { content: "\f15d"; } .md-signal-wifi-0-bar:before { content: "\f15e"; } .md-signal-wifi-1-bar:before { content: "\f15f"; } .md-signal-wifi-2-bar:before { content: "\f160"; } .md-signal-wifi-3-bar:before { content: "\f161"; } .md-signal-wifi-4-bar:before { content: "\f162"; } .md-signal-wifi-off:before { content: "\f163"; } .md-storage:before { content: "\f164"; } .md-usb:before { content: "\f165"; } .md-wifi-lock:before { content: "\f166"; } .md-wifi-tethering:before { content: "\f167"; } .md-attach-file:before { content: "\f168"; } .md-attach-money:before { content: "\f169"; } .md-border-all:before { content: "\f16a"; } .md-border-bottom:before { content: "\f16b"; } .md-border-clear:before { content: "\f16c"; } .md-border-color:before { content: "\f16d"; } .md-border-horizontal:before { content: "\f16e"; } .md-border-inner:before { content: "\f16f"; } .md-border-left:before { content: "\f170"; } .md-border-outer:before { content: "\f171"; } .md-border-right:before { content: "\f172"; } .md-border-style:before { content: "\f173"; } .md-border-top:before { content: "\f174"; } .md-border-vertical:before { content: "\f175"; } .md-format-align-center:before { content: "\f176"; } .md-format-align-justify:before { content: "\f177"; } .md-format-align-left:before { content: "\f178"; } .md-format-align-right:before { content: "\f179"; } .md-format-bold:before { content: "\f17a"; } .md-format-clear:before { content: "\f17b"; } .md-format-color-fill:before { content: "\f17c"; } .md-format-color-reset:before { content: "\f17d"; } .md-format-color-text:before { content: "\f17e"; } .md-format-indent-decrease:before { content: "\f17f"; } .md-format-indent-increase:before { content: "\f180"; } .md-format-italic:before { content: "\f181"; } .md-format-line-spacing:before { content: "\f182"; } .md-format-list-bulleted:before { content: "\f183"; } .md-format-list-numbered:before { content: "\f184"; } .md-format-paint:before { content: "\f185"; } .md-format-quote:before { content: "\f186"; } .md-format-size:before { content: "\f187"; } .md-format-strikethrough:before { content: "\f188"; } .md-format-textdirection-l-to-r:before { content: "\f189"; } .md-format-textdirection-r-to-l:before { content: "\f18a"; } .md-format-underline:before { content: "\f18b"; } .md-functions:before { content: "\f18c"; } .md-insert-chart:before { content: "\f18d"; } .md-insert-comment:before { content: "\f18e"; } .md-insert-drive-file:before { content: "\f18f"; } .md-insert-emoticon:before { content: "\f190"; } .md-insert-invitation:before { content: "\f191"; } .md-insert-link:before { content: "\f192"; } .md-insert-photo:before { content: "\f193"; } .md-merge-type:before { content: "\f194"; } .md-mode-comment:before { content: "\f195"; } .md-mode-edit:before { content: "\f196"; } .md-publish:before { content: "\f197"; } .md-vertical-align-bottom:before { content: "\f198"; } .md-vertical-align-center:before { content: "\f199"; } .md-vertical-align-top:before { content: "\f19a"; } .md-wrap-text:before { content: "\f19b"; } .md-attachment:before { content: "\f19c"; } .md-cloud:before { content: "\f19d"; } .md-cloud-circle:before { content: "\f19e"; } .md-cloud-done:before { content: "\f19f"; } .md-cloud-download:before { content: "\f1a0"; } .md-cloud-off:before { content: "\f1a1"; } .md-cloud-queue:before { content: "\f1a2"; } .md-cloud-upload:before { content: "\f1a3"; } .md-file-download:before { content: "\f1a4"; } .md-file-upload:before { content: "\f1a5"; } .md-folder:before { content: "\f1a6"; } .md-folder-open:before { content: "\f1a7"; } .md-folder-shared:before { content: "\f1a8"; } .md-cast:before { content: "\f1a9"; } .md-cast-connected:before { content: "\f1aa"; } .md-computer:before { content: "\f1ab"; } .md-desktop-mac:before { content: "\f1ac"; } .md-desktop-windows:before { content: "\f1ad"; } .md-dock:before { content: "\f1ae"; } .md-gamepad:before { content: "\f1af"; } .md-headset:before { content: "\f1b0"; } .md-headset-mic:before { content: "\f1b1"; } .md-keyboard:before { content: "\f1b2"; } .md-keyboard-alt:before { content: "\f1b3"; } .md-keyboard-arrow-down:before { content: "\f1b4"; } .md-keyboard-arrow-left:before { content: "\f1b5"; } .md-keyboard-arrow-right:before { content: "\f1b6"; } .md-keyboard-arrow-up:before { content: "\f1b7"; } .md-keyboard-backspace:before { content: "\f1b8"; } .md-keyboard-capslock:before { content: "\f1b9"; } .md-keyboard-control:before { content: "\f1ba"; } .md-keyboard-hide:before { content: "\f1bb"; } .md-keyboard-return:before { content: "\f1bc"; } .md-keyboard-tab:before { content: "\f1bd"; } .md-keyboard-voice:before { content: "\f1be"; } .md-laptop:before { content: "\f1bf"; } .md-laptop-chromebook:before { content: "\f1c0"; } .md-laptop-mac:before { content: "\f1c1"; } .md-laptop-windows:before { content: "\f1c2"; } .md-memory:before { content: "\f1c3"; } .md-mouse:before { content: "\f1c4"; } .md-phone-android:before { content: "\f1c5"; } .md-phone-iphone:before { content: "\f1c6"; } .md-phonelink:before { content: "\f1c7"; } .md-phonelink-off:before { content: "\f1c8"; } .md-security:before { content: "\f1c9"; } .md-sim-card:before { content: "\f1ca"; } .md-smartphone:before { content: "\f1cb"; } .md-speaker:before { content: "\f1cc"; } .md-tablet:before { content: "\f1cd"; } .md-tablet-android:before { content: "\f1ce"; } .md-tablet-mac:before { content: "\f1cf"; } .md-tv:before { content: "\f1d0"; } .md-watch:before { content: "\f1d1"; } .md-add-to-photos:before { content: "\f1d2"; } .md-adjust:before { content: "\f1d3"; } .md-assistant-photo:before { content: "\f1d4"; } .md-audiotrack:before { content: "\f1d5"; } .md-blur-circular:before { content: "\f1d6"; } .md-blur-linear:before { content: "\f1d7"; } .md-blur-off:before { content: "\f1d8"; } .md-blur-on:before { content: "\f1d9"; } .md-brightness-1:before { content: "\f1da"; } .md-brightness-2:before { content: "\f1db"; } .md-brightness-3:before { content: "\f1dc"; } .md-brightness-4:before { content: "\f1dd"; } .md-brightness-5:before { content: "\f1de"; } .md-brightness-6:before { content: "\f1df"; } .md-brightness-7:before { content: "\f1e0"; } .md-brush:before { content: "\f1e1"; } .md-camera:before { content: "\f1e2"; } .md-camera-alt:before { content: "\f1e3"; } .md-camera-front:before { content: "\f1e4"; } .md-camera-rear:before { content: "\f1e5"; } .md-camera-roll:before { content: "\f1e6"; } .md-center-focus-strong:before { content: "\f1e7"; } .md-center-focus-weak:before { content: "\f1e8"; } .md-collections:before { content: "\f1e9"; } .md-colorize:before { content: "\f1ea"; } .md-color-lens:before { content: "\f1eb"; } .md-compare:before { content: "\f1ec"; } .md-control-point:before { content: "\f1ed"; } .md-control-point-duplicate:before { content: "\f1ee"; } .md-crop:before { content: "\f1ef"; } .md-crop-3-2:before { content: "\f1f0"; } .md-crop-5-4:before { content: "\f1f1"; } .md-crop-7-5:before { content: "\f1f2"; } .md-crop-16-9:before { content: "\f1f3"; } .md-crop-din:before { content: "\f1f4"; } .md-crop-free:before { content: "\f1f5"; } .md-crop-landscape:before { content: "\f1f6"; } .md-crop-original:before { content: "\f1f7"; } .md-crop-portrait:before { content: "\f1f8"; } .md-crop-square:before { content: "\f1f9"; } .md-dehaze:before { content: "\f1fa"; } .md-details:before { content: "\f1fb"; } .md-edit:before { content: "\f1fc"; } .md-exposure:before { content: "\f1fd"; } .md-exposure-minus-1:before { content: "\f1fe"; } .md-exposure-minus-2:before { content: "\f1ff"; } .md-exposure-zero:before { content: "\f200"; } .md-exposure-plus-1:before { content: "\f201"; } .md-exposure-plus-2:before { content: "\f202"; } .md-filter:before { content: "\f203"; } .md-filter-1:before { content: "\f204"; } .md-filter-2:before { content: "\f205"; } .md-filter-3:before { content: "\f206"; } .md-filter-4:before { content: "\f207"; } .md-filter-5:before { content: "\f208"; } .md-filter-6:before { content: "\f209"; } .md-filter-7:before { content: "\f20a"; } .md-filter-8:before { content: "\f20b"; } .md-filter-9:before { content: "\f20c"; } .md-filter-9-plus:before { content: "\f20d"; } .md-filter-b-and-w:before { content: "\f20e"; } .md-filter-center-focus:before { content: "\f20f"; } .md-filter-drama:before { content: "\f210"; } .md-filter-frames:before { content: "\f211"; } .md-filter-hdr:before { content: "\f212"; } .md-filter-none:before { content: "\f213"; } .md-filter-tilt-shift:before { content: "\f214"; } .md-filter-vintage:before { content: "\f215"; } .md-flare:before { content: "\f216"; } .md-flash-auto:before { content: "\f217"; } .md-flash-off:before { content: "\f218"; } .md-flash-on:before { content: "\f219"; } .md-flip:before { content: "\f21a"; } .md-gradient:before { content: "\f21b"; } .md-grain:before { content: "\f21c"; } .md-grid-off:before { content: "\f21d"; } .md-grid-on:before { content: "\f21e"; } .md-hdr-off:before { content: "\f21f"; } .md-hdr-on:before { content: "\f220"; } .md-hdr-strong:before { content: "\f221"; } .md-hdr-weak:before { content: "\f222"; } .md-healing:before { content: "\f223"; } .md-image:before { content: "\f224"; } .md-image-aspect-ratio:before { content: "\f225"; } .md-iso:before { content: "\f226"; } .md-landscape:before { content: "\f227"; } .md-leak-add:before { content: "\f228"; } .md-leak-remove:before { content: "\f229"; } .md-lens:before { content: "\f22a"; } .md-looks:before { content: "\f22b"; } .md-looks-1:before { content: "\f22c"; } .md-looks-2:before { content: "\f22d"; } .md-looks-3:before { content: "\f22e"; } .md-looks-4:before { content: "\f22f"; } .md-looks-5:before { content: "\f230"; } .md-looks-6:before { content: "\f231"; } .md-loupe:before { content: "\f232"; } .md-movie-creation:before { content: "\f233"; } .md-nature:before { content: "\f234"; } .md-nature-people:before { content: "\f235"; } .md-navigate-before:before { content: "\f236"; } .md-navigate-next:before { content: "\f237"; } .md-palette:before { content: "\f238"; } .md-panorama:before { content: "\f239"; } .md-panorama-fisheye:before { content: "\f23a"; } .md-panorama-horizontal:before { content: "\f23b"; } .md-panorama-vertical:before { content: "\f23c"; } .md-panorama-wide-angle:before { content: "\f23d"; } .md-photo:before { content: "\f23e"; } .md-photo-album:before { content: "\f23f"; } .md-photo-camera:before { content: "\f240"; } .md-photo-library:before { content: "\f241"; } .md-portrait:before { content: "\f242"; } .md-remove-red-eye:before { content: "\f243"; } .md-rotate-left:before { content: "\f244"; } .md-rotate-right:before { content: "\f245"; } .md-slideshow:before { content: "\f246"; } .md-straighten:before { content: "\f247"; } .md-style:before { content: "\f248"; } .md-switch-camera:before { content: "\f249"; } .md-switch-video:before { content: "\f24a"; } .md-tag-faces:before { content: "\f24b"; } .md-texture:before { content: "\f24c"; } .md-timelapse:before { content: "\f24d"; } .md-timer:before { content: "\f24e"; } .md-timer-3:before { content: "\f24f"; } .md-timer-10:before { content: "\f250"; } .md-timer-auto:before { content: "\f251"; } .md-timer-off:before { content: "\f252"; } .md-tonality:before { content: "\f253"; } .md-transform:before { content: "\f254"; } .md-tune:before { content: "\f255"; } .md-wb-auto:before { content: "\f256"; } .md-wb-cloudy:before { content: "\f257"; } .md-wb-incandescent:before { content: "\f258"; } .md-wb-irradescent:before { content: "\f259"; } .md-wb-sunny:before { content: "\f25a"; } .md-beenhere:before { content: "\f25b"; } .md-directions:before { content: "\f25c"; } .md-directions-bike:before { content: "\f25d"; } .md-directions-bus:before { content: "\f25e"; } .md-directions-car:before { content: "\f25f"; } .md-directions-ferry:before { content: "\f260"; } .md-directions-subway:before { content: "\f261"; } .md-directions-train:before { content: "\f262"; } .md-directions-transit:before { content: "\f263"; } .md-directions-walk:before { content: "\f264"; } .md-flight:before { content: "\f265"; } .md-hotel:before { content: "\f266"; } .md-layers:before { content: "\f267"; } .md-layers-clear:before { content: "\f268"; } .md-local-airport:before { content: "\f269"; } .md-local-atm:before { content: "\f26a"; } .md-local-attraction:before { content: "\f26b"; } .md-local-bar:before { content: "\f26c"; } .md-local-cafe:before { content: "\f26d"; } .md-local-car-wash:before { content: "\f26e"; } .md-local-convenience-store:before { content: "\f26f"; } .md-local-drink:before { content: "\f270"; } .md-local-florist:before { content: "\f271"; } .md-local-gas-station:before { content: "\f272"; } .md-local-grocery-store:before { content: "\f273"; } .md-local-hospital:before { content: "\f274"; } .md-local-hotel:before { content: "\f275"; } .md-local-laundry-service:before { content: "\f276"; } .md-local-library:before { content: "\f277"; } .md-local-mall:before { content: "\f278"; } .md-local-movies:before { content: "\f279"; } .md-local-offer:before { content: "\f27a"; } .md-local-parking:before { content: "\f27b"; } .md-local-pharmacy:before { content: "\f27c"; } .md-local-phone:before { content: "\f27d"; } .md-local-pizza:before { content: "\f27e"; } .md-local-play:before { content: "\f27f"; } .md-local-post-office:before { content: "\f280"; } .md-local-print-shop:before { content: "\f281"; } .md-local-restaurant:before { content: "\f282"; } .md-local-see:before { content: "\f283"; } .md-local-shipping:before { content: "\f284"; } .md-local-taxi:before { content: "\f285"; } .md-location-history:before { content: "\f286"; } .md-map:before { content: "\f287"; } .md-my-location:before { content: "\f288"; } .md-navigation:before { content: "\f289"; } .md-pin-drop:before { content: "\f28a"; } .md-place:before { content: "\f28b"; } .md-rate-review:before { content: "\f28c"; } .md-restaurant-menu:before { content: "\f28d"; } .md-satellite:before { content: "\f28e"; } .md-store-mall-directory:before { content: "\f28f"; } .md-terrain:before { content: "\f290"; } .md-traffic:before { content: "\f291"; } .md-apps:before { content: "\f292"; } .md-cancel:before { content: "\f293"; } .md-arrow-drop-down-circle:before { content: "\f294"; } .md-arrow-drop-down:before { content: "\f295"; } .md-arrow-drop-up:before { content: "\f296"; } .md-arrow-back:before { content: "\f297"; } .md-arrow-forward:before { content: "\f298"; } .md-check:before { content: "\f299"; } .md-close:before { content: "\f29a"; } .md-chevron-left:before { content: "\f29b"; } .md-chevron-right:before { content: "\f29c"; } .md-expand-less:before { content: "\f29d"; } .md-expand-more:before { content: "\f29e"; } .md-fullscreen:before { content: "\f29f"; } .md-fullscreen-exit:before { content: "\f2a0"; } .md-menu:before { content: "\f2a1"; } .md-more-horiz:before { content: "\f2a2"; } .md-more-vert:before { content: "\f2a3"; } .md-refresh:before { content: "\f2a4"; } .md-unfold-less:before { content: "\f2a5"; } .md-unfold-more:before { content: "\f2a6"; } .md-adb:before { content: "\f2a7"; } .md-bluetooth-audio:before { content: "\f2a8"; } .md-disc-full:before { content: "\f2a9"; } .md-dnd-forwardslash:before { content: "\f2aa"; } .md-do-not-disturb:before { content: "\f2ab"; } .md-drive-eta:before { content: "\f2ac"; } .md-event-available:before { content: "\f2ad"; } .md-event-busy:before { content: "\f2ae"; } .md-event-note:before { content: "\f2af"; } .md-folder-special:before { content: "\f2b0"; } .md-mms:before { content: "\f2b1"; } .md-more:before { content: "\f2b2"; } .md-network-locked:before { content: "\f2b3"; } .md-phone-bluetooth-speaker:before { content: "\f2b4"; } .md-phone-forwarded:before { content: "\f2b5"; } .md-phone-in-talk:before { content: "\f2b6"; } .md-phone-locked:before { content: "\f2b7"; } .md-phone-missed:before { content: "\f2b8"; } .md-phone-paused:before { content: "\f2b9"; } .md-play-download:before { content: "\f2ba"; } .md-play-install:before { content: "\f2bb"; } .md-sd-card:before { content: "\f2bc"; } .md-sim-card-alert:before { content: "\f2bd"; } .md-sms:before { content: "\f2be"; } .md-sms-failed:before { content: "\f2bf"; } .md-sync:before { content: "\f2c0"; } .md-sync-disabled:before { content: "\f2c1"; } .md-sync-problem:before { content: "\f2c2"; } .md-system-update:before { content: "\f2c3"; } .md-tap-and-play:before { content: "\f2c4"; } .md-time-to-leave:before { content: "\f2c5"; } .md-vibration:before { content: "\f2c6"; } .md-voice-chat:before { content: "\f2c7"; } .md-vpn-lock:before { content: "\f2c8"; } .md-cake:before { content: "\f2c9"; } .md-domain:before { content: "\f2ca"; } .md-location-city:before { content: "\f2cb"; } .md-mood:before { content: "\f2cc"; } .md-notifications-none:before { content: "\f2cd"; } .md-notifications:before { content: "\f2ce"; } .md-notifications-off:before { content: "\f2cf"; } .md-notifications-on:before { content: "\f2d0"; } .md-notifications-paused:before { content: "\f2d1"; } .md-pages:before { content: "\f2d2"; } .md-party-mode:before { content: "\f2d3"; } .md-group:before { content: "\f2d4"; } .md-group-add:before { content: "\f2d5"; } .md-people:before { content: "\f2d6"; } .md-people-outline:before { content: "\f2d7"; } .md-person:before { content: "\f2d8"; } .md-person-add:before { content: "\f2d9"; } .md-person-outline:before { content: "\f2da"; } .md-plus-one:before { content: "\f2db"; } .md-poll:before { content: "\f2dc"; } .md-public:before { content: "\f2dd"; } .md-school:before { content: "\f2de"; } .md-share:before { content: "\f2df"; } .md-whatshot:before { content: "\f2e0"; } .md-check-box:before { content: "\f2e1"; } .md-check-box-outline-blank:before { content: "\f2e2"; } .md-radio-button-off:before { content: "\f2e3"; } .md-radio-button-on:before { content: "\f2e4"; } .md-star:before { content: "\f2e5"; } .md-star-half:before { content: "\f2e6"; } .md-star-outline:before { content: "\f2e7"; } @font-face { font-family: 'simple-line-icons'; src: url('../fonts/Simple-Line-Icons.eot?-i3a2kk'); src: url('../fonts/Simple-Line-Icons.eot?#iefix-i3a2kk') format('embedded-opentype'), url('../fonts/Simple-Line-Icons.ttf?-i3a2kk') format('truetype'), url('../fonts/Simple-Line-Icons.woff2?-i3a2kk') format('woff2'), url('../fonts/Simple-Line-Icons.woff?-i3a2kk') format('woff'), url('../fonts/Simple-Line-Icons.svg?-i3a2kk#simple-line-icons') format('svg'); font-weight: normal; font-style: normal; } /* Use the following CSS code if you want to have a class per icon. Instead of a list of all class selectors, you can use the generic [class*="icon-"] selector, but it's slower: */ .icon-user, .icon-people, .icon-user-female, .icon-user-follow, .icon-user-following, .icon-user-unfollow, .icon-login, .icon-logout, .icon-emotsmile, .icon-phone, .icon-call-end, .icon-call-in, .icon-call-out, .icon-map, .icon-location-pin, .icon-direction, .icon-directions, .icon-compass, .icon-layers, .icon-menu, .icon-list, .icon-options-vertical, .icon-options, .icon-arrow-down, .icon-arrow-left, .icon-arrow-right, .icon-arrow-up, .icon-arrow-up-circle, .icon-arrow-left-circle, .icon-arrow-right-circle, .icon-arrow-down-circle, .icon-check, .icon-clock, .icon-plus, .icon-close, .icon-trophy, .icon-screen-smartphone, .icon-screen-desktop, .icon-plane, .icon-notebook, .icon-mustache, .icon-mouse, .icon-magnet, .icon-energy, .icon-disc, .icon-cursor, .icon-cursor-move, .icon-crop, .icon-chemistry, .icon-speedometer, .icon-shield, .icon-screen-tablet, .icon-magic-wand, .icon-hourglass, .icon-graduation, .icon-ghost, .icon-game-controller, .icon-fire, .icon-eyeglass, .icon-envelope-open, .icon-envelope-letter, .icon-bell, .icon-badge, .icon-anchor, .icon-wallet, .icon-vector, .icon-speech, .icon-puzzle, .icon-printer, .icon-present, .icon-playlist, .icon-pin, .icon-picture, .icon-handbag, .icon-globe-alt, .icon-globe, .icon-folder-alt, .icon-folder, .icon-film, .icon-feed, .icon-drop, .icon-drawar, .icon-docs, .icon-doc, .icon-diamond, .icon-cup, .icon-calculator, .icon-bubbles, .icon-briefcase, .icon-book-open, .icon-basket-loaded, .icon-basket, .icon-bag, .icon-action-undo, .icon-action-redo, .icon-wrench, .icon-umbrella, .icon-trash, .icon-tag, .icon-support, .icon-frame, .icon-size-fullscreen, .icon-size-actual, .icon-shuffle, .icon-share-alt, .icon-share, .icon-rocket, .icon-question, .icon-pie-chart, .icon-pencil, .icon-note, .icon-loop, .icon-home, .icon-grid, .icon-graph, .icon-microphone, .icon-music-tone-alt, .icon-music-tone, .icon-earphones-alt, .icon-earphones, .icon-equalizer, .icon-like, .icon-dislike, .icon-control-start, .icon-control-rewind, .icon-control-play, .icon-control-pause, .icon-control-forward, .icon-control-end, .icon-volume-1, .icon-volume-2, .icon-volume-off, .icon-calender, .icon-bulb, .icon-chart, .icon-ban, .icon-bubble, .icon-camrecorder, .icon-camera, .icon-cloud-download, .icon-cloud-upload, .icon-envelope, .icon-eye, .icon-flag, .icon-heart, .icon-info, .icon-key, .icon-link, .icon-lock, .icon-lock-open, .icon-magnifier, .icon-magnifier-add, .icon-magnifier-remove, .icon-paper-clip, .icon-paper-plane, .icon-power, .icon-refresh, .icon-reload, .icon-settings, .icon-star, .icon-symble-female, .icon-symbol-male, .icon-target, .icon-credit-card, .icon-paypal, .icon-social-tumblr, .icon-social-twitter, .icon-social-facebook, .icon-social-instagram, .icon-social-linkedin, .icon-social-pintarest, .icon-social-github, .icon-social-gplus, .icon-social-reddit, .icon-social-skype, .icon-social-dribbble, .icon-social-behance, .icon-social-foursqare, .icon-social-soundcloud, .icon-social-spotify, .icon-social-stumbleupon, .icon-social-youtube, .icon-social-dropbox { font-family: 'simple-line-icons'; speak: none; font-style: normal; font-weight: normal; font-variant: normal; text-transform: none; line-height: 1; /* Better Font Rendering =========== */ -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .icon-user:before { content: "\e005"; } .icon-people:before { content: "\e001"; } .icon-user-female:before { content: "\e000"; } .icon-user-follow:before { content: "\e002"; } .icon-user-following:before { content: "\e003"; } .icon-user-unfollow:before { content: "\e004"; } .icon-login:before { content: "\e066"; } .icon-logout:before { content: "\e065"; } .icon-emotsmile:before { content: "\e021"; } .icon-phone:before { content: "\e600"; } .icon-call-end:before { content: "\e048"; } .icon-call-in:before { content: "\e047"; } .icon-call-out:before { content: "\e046"; } .icon-map:before { content: "\e033"; } .icon-location-pin:before { content: "\e096"; } .icon-direction:before { content: "\e042"; } .icon-directions:before { content: "\e041"; } .icon-compass:before { content: "\e045"; } .icon-layers:before { content: "\e034"; } .icon-menu:before { content: "\e601"; } .icon-list:before { content: "\e067"; } .icon-options-vertical:before { content: "\e602"; } .icon-options:before { content: "\e603"; } .icon-arrow-down:before { content: "\e604"; } .icon-arrow-left:before { content: "\e605"; } .icon-arrow-right:before { content: "\e606"; } .icon-arrow-up:before { content: "\e607"; } .icon-arrow-up-circle:before { content: "\e078"; } .icon-arrow-left-circle:before { content: "\e07a"; } .icon-arrow-right-circle:before { content: "\e079"; } .icon-arrow-down-circle:before { content: "\e07b"; } .icon-check:before { content: "\e080"; } .icon-clock:before { content: "\e081"; } .icon-plus:before { content: "\e095"; } .icon-close:before { content: "\e082"; } .icon-trophy:before { content: "\e006"; } .icon-screen-smartphone:before { content: "\e010"; } .icon-screen-desktop:before { content: "\e011"; } .icon-plane:before { content: "\e012"; } .icon-notebook:before { content: "\e013"; } .icon-mustache:before { content: "\e014"; } .icon-mouse:before { content: "\e015"; } .icon-magnet:before { content: "\e016"; } .icon-energy:before { content: "\e020"; } .icon-disc:before { content: "\e022"; } .icon-cursor:before { content: "\e06e"; } .icon-cursor-move:before { content: "\e023"; } .icon-crop:before { content: "\e024"; } .icon-chemistry:before { content: "\e026"; } .icon-speedometer:before { content: "\e007"; } .icon-shield:before { content: "\e00e"; } .icon-screen-tablet:before { content: "\e00f"; } .icon-magic-wand:before { content: "\e017"; } .icon-hourglass:before { content: "\e018"; } .icon-graduation:before { content: "\e019"; } .icon-ghost:before { content: "\e01a"; } .icon-game-controller:before { content: "\e01b"; } .icon-fire:before { content: "\e01c"; } .icon-eyeglass:before { content: "\e01d"; } .icon-envelope-open:before { content: "\e01e"; } .icon-envelope-letter:before { content: "\e01f"; } .icon-bell:before { content: "\e027"; } .icon-badge:before { content: "\e028"; } .icon-anchor:before { content: "\e029"; } .icon-wallet:before { content: "\e02a"; } .icon-vector:before { content: "\e02b"; } .icon-speech:before { content: "\e02c"; } .icon-puzzle:before { content: "\e02d"; } .icon-printer:before { content: "\e02e"; } .icon-present:before { content: "\e02f"; } .icon-playlist:before { content: "\e030"; } .icon-pin:before { content: "\e031"; } .icon-picture:before { content: "\e032"; } .icon-handbag:before { content: "\e035"; } .icon-globe-alt:before { content: "\e036"; } .icon-globe:before { content: "\e037"; } .icon-folder-alt:before { content: "\e039"; } .icon-folder:before { content: "\e089"; } .icon-film:before { content: "\e03a"; } .icon-feed:before { content: "\e03b"; } .icon-drop:before { content: "\e03e"; } .icon-drawar:before { content: "\e03f"; } .icon-docs:before { content: "\e040"; } .icon-doc:before { content: "\e085"; } .icon-diamond:before { content: "\e043"; } .icon-cup:before { content: "\e044"; } .icon-calculator:before { content: "\e049"; } .icon-bubbles:before { content: "\e04a"; } .icon-briefcase:before { content: "\e04b"; } .icon-book-open:before { content: "\e04c"; } .icon-basket-loaded:before { content: "\e04d"; } .icon-basket:before { content: "\e04e"; } .icon-bag:before { content: "\e04f"; } .icon-action-undo:before { content: "\e050"; } .icon-action-redo:before { content: "\e051"; } .icon-wrench:before { content: "\e052"; } .icon-umbrella:before { content: "\e053"; } .icon-trash:before { content: "\e054"; } .icon-tag:before { content: "\e055"; } .icon-support:before { content: "\e056"; } .icon-frame:before { content: "\e038"; } .icon-size-fullscreen:before { content: "\e057"; } .icon-size-actual:before { content: "\e058"; } .icon-shuffle:before { content: "\e059"; } .icon-share-alt:before { content: "\e05a"; } .icon-share:before { content: "\e05b"; } .icon-rocket:before { content: "\e05c"; } .icon-question:before { content: "\e05d"; } .icon-pie-chart:before { content: "\e05e"; } .icon-pencil:before { content: "\e05f"; } .icon-note:before { content: "\e060"; } .icon-loop:before { content: "\e064"; } .icon-home:before { content: "\e069"; } .icon-grid:before { content: "\e06a"; } .icon-graph:before { content: "\e06b"; } .icon-microphone:before { content: "\e063"; } .icon-music-tone-alt:before { content: "\e061"; } .icon-music-tone:before { content: "\e062"; } .icon-earphones-alt:before { content: "\e03c"; } .icon-earphones:before { content: "\e03d"; } .icon-equalizer:before { content: "\e06c"; } .icon-like:before { content: "\e068"; } .icon-dislike:before { content: "\e06d"; } .icon-control-start:before { content: "\e06f"; } .icon-control-rewind:before { content: "\e070"; } .icon-control-play:before { content: "\e071"; } .icon-control-pause:before { content: "\e072"; } .icon-control-forward:before { content: "\e073"; } .icon-control-end:before { content: "\e074"; } .icon-volume-1:before { content: "\e09f"; } .icon-volume-2:before { content: "\e0a0"; } .icon-volume-off:before { content: "\e0a1"; } .icon-calender:before { content: "\e075"; } .icon-bulb:before { content: "\e076"; } .icon-chart:before { content: "\e077"; } .icon-ban:before { content: "\e07c"; } .icon-bubble:before { content: "\e07d"; } .icon-camrecorder:before { content: "\e07e"; } .icon-camera:before { content: "\e07f"; } .icon-cloud-download:before { content: "\e083"; } .icon-cloud-upload:before { content: "\e084"; } .icon-envelope:before { content: "\e086"; } .icon-eye:before { content: "\e087"; } .icon-flag:before { content: "\e088"; } .icon-heart:before { content: "\e08a"; } .icon-info:before { content: "\e08b"; } .icon-key:before { content: "\e08c"; } .icon-link:before { content: "\e08d"; } .icon-lock:before { content: "\e08e"; } .icon-lock-open:before { content: "\e08f"; } .icon-magnifier:before { content: "\e090"; } .icon-magnifier-add:before { content: "\e091"; } .icon-magnifier-remove:before { content: "\e092"; } .icon-paper-clip:before { content: "\e093"; } .icon-paper-plane:before { content: "\e094"; } .icon-power:before { content: "\e097"; } .icon-refresh:before { content: "\e098"; } .icon-reload:before { content: "\e099"; } .icon-settings:before { content: "\e09a"; } .icon-star:before { content: "\e09b"; } .icon-symble-female:before { content: "\e09c"; } .icon-symbol-male:before { content: "\e09d"; } .icon-target:before { content: "\e09e"; } .icon-credit-card:before { content: "\e025"; } .icon-paypal:before { content: "\e608"; } .icon-social-tumblr:before { content: "\e00a"; } .icon-social-twitter:before { content: "\e009"; } .icon-social-facebook:before { content: "\e00b"; } .icon-social-instagram:before { content: "\e609"; } .icon-social-linkedin:before { content: "\e60a"; } .icon-social-pintarest:before { content: "\e60b"; } .icon-social-github:before { content: "\e60c"; } .icon-social-gplus:before { content: "\e60d"; } .icon-social-reddit:before { content: "\e60e"; } .icon-social-skype:before { content: "\e60f"; } .icon-social-dribbble:before { content: "\e00d"; } .icon-social-behance:before { content: "\e610"; } .icon-social-foursqare:before { content: "\e611"; } .icon-social-soundcloud:before { content: "\e612"; } .icon-social-spotify:before { content: "\e613"; } .icon-social-stumbleupon:before { content: "\e614"; } .icon-social-youtube:before { content: "\e008"; } .icon-social-dropbox:before { content: "\e00c"; } /*! Ionicons, v1.5.0 Created by Ben Sperry for the Ionic Framework, http://ionicons.com/ https://twitter.com/benjsperry https://twitter.com/ionicframework MIT License: https://github.com/driftyco/ionicons */ @font-face { font-family: "Ionicons"; src: url("../fonts/ionicons.eot?v=1.5.0"); src: url("../fonts/ionicons.eot?v=1.5.0#iefix") format("embedded-opentype"), url("../fonts/ionicons.ttf?v=1.5.0") format("truetype"), url("../fonts/ionicons.woff?v=1.5.0") format("woff"), url("../fonts/ionicons.svg?v=1.5.0#Ionicons") format("svg"); font-weight: normal; font-style: normal; } .ion, .ion-loading-a, .ion-loading-b, .ion-loading-c, .ion-loading-d, .ion-looping, .ion-refreshing, .ion-ios7-reloading, .ionicons, .ion-alert, .ion-alert-circled, .ion-android-add, .ion-android-add-contact, .ion-android-alarm, .ion-android-archive, .ion-android-arrow-back, .ion-android-arrow-down-left, .ion-android-arrow-down-right, .ion-android-arrow-forward, .ion-android-arrow-up-left, .ion-android-arrow-up-right, .ion-android-battery, .ion-android-book, .ion-android-calendar, .ion-android-call, .ion-android-camera, .ion-android-chat, .ion-android-checkmark, .ion-android-clock, .ion-android-close, .ion-android-contact, .ion-android-contacts, .ion-android-data, .ion-android-developer, .ion-android-display, .ion-android-download, .ion-android-drawer, .ion-android-dropdown, .ion-android-earth, .ion-android-folder, .ion-android-forums, .ion-android-friends, .ion-android-hand, .ion-android-image, .ion-android-inbox, .ion-android-information, .ion-android-keypad, .ion-android-lightbulb, .ion-android-locate, .ion-android-location, .ion-android-mail, .ion-android-microphone, .ion-android-mixer, .ion-android-more, .ion-android-note, .ion-android-playstore, .ion-android-printer, .ion-android-promotion, .ion-android-reminder, .ion-android-remove, .ion-android-search, .ion-android-send, .ion-android-settings, .ion-android-share, .ion-android-social, .ion-android-social-user, .ion-android-sort, .ion-android-stair-drawer, .ion-android-star, .ion-android-stopwatch, .ion-android-storage, .ion-android-system-back, .ion-android-system-home, .ion-android-system-windows, .ion-android-timer, .ion-android-trash, .ion-android-user-menu, .ion-android-volume, .ion-android-wifi, .ion-aperture, .ion-archive, .ion-arrow-down-a, .ion-arrow-down-b, .ion-arrow-down-c, .ion-arrow-expand, .ion-arrow-graph-down-left, .ion-arrow-graph-down-right, .ion-arrow-graph-up-left, .ion-arrow-graph-up-right, .ion-arrow-left-a, .ion-arrow-left-b, .ion-arrow-left-c, .ion-arrow-move, .ion-arrow-resize, .ion-arrow-return-left, .ion-arrow-return-right, .ion-arrow-right-a, .ion-arrow-right-b, .ion-arrow-right-c, .ion-arrow-shrink, .ion-arrow-swap, .ion-arrow-up-a, .ion-arrow-up-b, .ion-arrow-up-c, .ion-asterisk, .ion-at, .ion-bag, .ion-battery-charging, .ion-battery-empty, .ion-battery-full, .ion-battery-half, .ion-battery-low, .ion-beaker, .ion-beer, .ion-bluetooth, .ion-bonfire, .ion-bookmark, .ion-briefcase, .ion-bug, .ion-calculator, .ion-calendar, .ion-camera, .ion-card, .ion-cash, .ion-chatbox, .ion-chatbox-working, .ion-chatboxes, .ion-chatbubble, .ion-chatbubble-working, .ion-chatbubbles, .ion-checkmark, .ion-checkmark-circled, .ion-checkmark-round, .ion-chevron-down, .ion-chevron-left, .ion-chevron-right, .ion-chevron-up, .ion-clipboard, .ion-clock, .ion-close, .ion-close-circled, .ion-close-round, .ion-closed-captioning, .ion-cloud, .ion-code, .ion-code-download, .ion-code-working, .ion-coffee, .ion-compass, .ion-compose, .ion-connection-bars, .ion-contrast, .ion-cube, .ion-disc, .ion-document, .ion-document-text, .ion-drag, .ion-earth, .ion-edit, .ion-egg, .ion-eject, .ion-email, .ion-eye, .ion-eye-disabled, .ion-female, .ion-filing, .ion-film-marker, .ion-fireball, .ion-flag, .ion-flame, .ion-flash, .ion-flash-off, .ion-flask, .ion-folder, .ion-fork, .ion-fork-repo, .ion-forward, .ion-funnel, .ion-game-controller-a, .ion-game-controller-b, .ion-gear-a, .ion-gear-b, .ion-grid, .ion-hammer, .ion-happy, .ion-headphone, .ion-heart, .ion-heart-broken, .ion-help, .ion-help-buoy, .ion-help-circled, .ion-home, .ion-icecream, .ion-icon-social-google-plus, .ion-icon-social-google-plus-outline, .ion-image, .ion-images, .ion-information, .ion-information-circled, .ion-ionic, .ion-ios7-alarm, .ion-ios7-alarm-outline, .ion-ios7-albums, .ion-ios7-albums-outline, .ion-ios7-americanfootball, .ion-ios7-americanfootball-outline, .ion-ios7-analytics, .ion-ios7-analytics-outline, .ion-ios7-arrow-back, .ion-ios7-arrow-down, .ion-ios7-arrow-forward, .ion-ios7-arrow-left, .ion-ios7-arrow-right, .ion-ios7-arrow-thin-down, .ion-ios7-arrow-thin-left, .ion-ios7-arrow-thin-right, .ion-ios7-arrow-thin-up, .ion-ios7-arrow-up, .ion-ios7-at, .ion-ios7-at-outline, .ion-ios7-barcode, .ion-ios7-barcode-outline, .ion-ios7-baseball, .ion-ios7-baseball-outline, .ion-ios7-basketball, .ion-ios7-basketball-outline, .ion-ios7-bell, .ion-ios7-bell-outline, .ion-ios7-bolt, .ion-ios7-bolt-outline, .ion-ios7-bookmarks, .ion-ios7-bookmarks-outline, .ion-ios7-box, .ion-ios7-box-outline, .ion-ios7-briefcase, .ion-ios7-briefcase-outline, .ion-ios7-browsers, .ion-ios7-browsers-outline, .ion-ios7-calculator, .ion-ios7-calculator-outline, .ion-ios7-calendar, .ion-ios7-calendar-outline, .ion-ios7-camera, .ion-ios7-camera-outline, .ion-ios7-cart, .ion-ios7-cart-outline, .ion-ios7-chatboxes, .ion-ios7-chatboxes-outline, .ion-ios7-chatbubble, .ion-ios7-chatbubble-outline, .ion-ios7-checkmark, .ion-ios7-checkmark-empty, .ion-ios7-checkmark-outline, .ion-ios7-circle-filled, .ion-ios7-circle-outline, .ion-ios7-clock, .ion-ios7-clock-outline, .ion-ios7-close, .ion-ios7-close-empty, .ion-ios7-close-outline, .ion-ios7-cloud, .ion-ios7-cloud-download, .ion-ios7-cloud-download-outline, .ion-ios7-cloud-outline, .ion-ios7-cloud-upload, .ion-ios7-cloud-upload-outline, .ion-ios7-cloudy, .ion-ios7-cloudy-night, .ion-ios7-cloudy-night-outline, .ion-ios7-cloudy-outline, .ion-ios7-cog, .ion-ios7-cog-outline, .ion-ios7-compose, .ion-ios7-compose-outline, .ion-ios7-contact, .ion-ios7-contact-outline, .ion-ios7-copy, .ion-ios7-copy-outline, .ion-ios7-download, .ion-ios7-download-outline, .ion-ios7-drag, .ion-ios7-email, .ion-ios7-email-outline, .ion-ios7-expand, .ion-ios7-eye, .ion-ios7-eye-outline, .ion-ios7-fastforward, .ion-ios7-fastforward-outline, .ion-ios7-filing, .ion-ios7-filing-outline, .ion-ios7-film, .ion-ios7-film-outline, .ion-ios7-flag, .ion-ios7-flag-outline, .ion-ios7-folder, .ion-ios7-folder-outline, .ion-ios7-football, .ion-ios7-football-outline, .ion-ios7-gear, .ion-ios7-gear-outline, .ion-ios7-glasses, .ion-ios7-glasses-outline, .ion-ios7-heart, .ion-ios7-heart-outline, .ion-ios7-help, .ion-ios7-help-empty, .ion-ios7-help-outline, .ion-ios7-home, .ion-ios7-home-outline, .ion-ios7-infinite, .ion-ios7-infinite-outline, .ion-ios7-information, .ion-ios7-information-empty, .ion-ios7-information-outline, .ion-ios7-ionic-outline, .ion-ios7-keypad, .ion-ios7-keypad-outline, .ion-ios7-lightbulb, .ion-ios7-lightbulb-outline, .ion-ios7-location, .ion-ios7-location-outline, .ion-ios7-locked, .ion-ios7-locked-outline, .ion-ios7-loop, .ion-ios7-loop-strong, .ion-ios7-medkit, .ion-ios7-medkit-outline, .ion-ios7-mic, .ion-ios7-mic-off, .ion-ios7-mic-outline, .ion-ios7-minus, .ion-ios7-minus-empty, .ion-ios7-minus-outline, .ion-ios7-monitor, .ion-ios7-monitor-outline, .ion-ios7-moon, .ion-ios7-moon-outline, .ion-ios7-more, .ion-ios7-more-outline, .ion-ios7-musical-note, .ion-ios7-musical-notes, .ion-ios7-navigate, .ion-ios7-navigate-outline, .ion-ios7-paper, .ion-ios7-paper-outline, .ion-ios7-paperplane, .ion-ios7-paperplane-outline, .ion-ios7-partlysunny, .ion-ios7-partlysunny-outline, .ion-ios7-pause, .ion-ios7-pause-outline, .ion-ios7-paw, .ion-ios7-paw-outline, .ion-ios7-people, .ion-ios7-people-outline, .ion-ios7-person, .ion-ios7-person-outline, .ion-ios7-personadd, .ion-ios7-personadd-outline, .ion-ios7-photos, .ion-ios7-photos-outline, .ion-ios7-pie, .ion-ios7-pie-outline, .ion-ios7-play, .ion-ios7-play-outline, .ion-ios7-plus, .ion-ios7-plus-empty, .ion-ios7-plus-outline, .ion-ios7-pricetag, .ion-ios7-pricetag-outline, .ion-ios7-pricetags, .ion-ios7-pricetags-outline, .ion-ios7-printer, .ion-ios7-printer-outline, .ion-ios7-pulse, .ion-ios7-pulse-strong, .ion-ios7-rainy, .ion-ios7-rainy-outline, .ion-ios7-recording, .ion-ios7-recording-outline, .ion-ios7-redo, .ion-ios7-redo-outline, .ion-ios7-refresh, .ion-ios7-refresh-empty, .ion-ios7-refresh-outline, .ion-ios7-reload, .ion-ios7-reverse-camera, .ion-ios7-reverse-camera-outline, .ion-ios7-rewind, .ion-ios7-rewind-outline, .ion-ios7-search, .ion-ios7-search-strong, .ion-ios7-settings, .ion-ios7-settings-strong, .ion-ios7-shrink, .ion-ios7-skipbackward, .ion-ios7-skipbackward-outline, .ion-ios7-skipforward, .ion-ios7-skipforward-outline, .ion-ios7-snowy, .ion-ios7-speedometer, .ion-ios7-speedometer-outline, .ion-ios7-star, .ion-ios7-star-half, .ion-ios7-star-outline, .ion-ios7-stopwatch, .ion-ios7-stopwatch-outline, .ion-ios7-sunny, .ion-ios7-sunny-outline, .ion-ios7-telephone, .ion-ios7-telephone-outline, .ion-ios7-tennisball, .ion-ios7-tennisball-outline, .ion-ios7-thunderstorm, .ion-ios7-thunderstorm-outline, .ion-ios7-time, .ion-ios7-time-outline, .ion-ios7-timer, .ion-ios7-timer-outline, .ion-ios7-toggle, .ion-ios7-toggle-outline, .ion-ios7-trash, .ion-ios7-trash-outline, .ion-ios7-undo, .ion-ios7-undo-outline, .ion-ios7-unlocked, .ion-ios7-unlocked-outline, .ion-ios7-upload, .ion-ios7-upload-outline, .ion-ios7-videocam, .ion-ios7-videocam-outline, .ion-ios7-volume-high, .ion-ios7-volume-low, .ion-ios7-wineglass, .ion-ios7-wineglass-outline, .ion-ios7-world, .ion-ios7-world-outline, .ion-ipad, .ion-iphone, .ion-ipod, .ion-jet, .ion-key, .ion-knife, .ion-laptop, .ion-leaf, .ion-levels, .ion-lightbulb, .ion-link, .ion-load-a, .ion-load-b, .ion-load-c, .ion-load-d, .ion-location, .ion-locked, .ion-log-in, .ion-log-out, .ion-loop, .ion-magnet, .ion-male, .ion-man, .ion-map, .ion-medkit, .ion-merge, .ion-mic-a, .ion-mic-b, .ion-mic-c, .ion-minus, .ion-minus-circled, .ion-minus-round, .ion-model-s, .ion-monitor, .ion-more, .ion-mouse, .ion-music-note, .ion-navicon, .ion-navicon-round, .ion-navigate, .ion-network, .ion-no-smoking, .ion-nuclear, .ion-outlet, .ion-paper-airplane, .ion-paperclip, .ion-pause, .ion-person, .ion-person-add, .ion-person-stalker, .ion-pie-graph, .ion-pin, .ion-pinpoint, .ion-pizza, .ion-plane, .ion-planet, .ion-play, .ion-playstation, .ion-plus, .ion-plus-circled, .ion-plus-round, .ion-podium, .ion-pound, .ion-power, .ion-pricetag, .ion-pricetags, .ion-printer, .ion-pull-request, .ion-qr-scanner, .ion-quote, .ion-radio-waves, .ion-record, .ion-refresh, .ion-reply, .ion-reply-all, .ion-ribbon-a, .ion-ribbon-b, .ion-sad, .ion-scissors, .ion-search, .ion-settings, .ion-share, .ion-shuffle, .ion-skip-backward, .ion-skip-forward, .ion-social-android, .ion-social-android-outline, .ion-social-apple, .ion-social-apple-outline, .ion-social-bitcoin, .ion-social-bitcoin-outline, .ion-social-buffer, .ion-social-buffer-outline, .ion-social-designernews, .ion-social-designernews-outline, .ion-social-dribbble, .ion-social-dribbble-outline, .ion-social-dropbox, .ion-social-dropbox-outline, .ion-social-facebook, .ion-social-facebook-outline, .ion-social-foursquare, .ion-social-foursquare-outline, .ion-social-freebsd-devil, .ion-social-github, .ion-social-github-outline, .ion-social-google, .ion-social-google-outline, .ion-social-googleplus, .ion-social-googleplus-outline, .ion-social-hackernews, .ion-social-hackernews-outline, .ion-social-instagram, .ion-social-instagram-outline, .ion-social-linkedin, .ion-social-linkedin-outline, .ion-social-pinterest, .ion-social-pinterest-outline, .ion-social-reddit, .ion-social-reddit-outline, .ion-social-rss, .ion-social-rss-outline, .ion-social-skype, .ion-social-skype-outline, .ion-social-tumblr, .ion-social-tumblr-outline, .ion-social-tux, .ion-social-twitter, .ion-social-twitter-outline, .ion-social-usd, .ion-social-usd-outline, .ion-social-vimeo, .ion-social-vimeo-outline, .ion-social-windows, .ion-social-windows-outline, .ion-social-wordpress, .ion-social-wordpress-outline, .ion-social-yahoo, .ion-social-yahoo-outline, .ion-social-youtube, .ion-social-youtube-outline, .ion-speakerphone, .ion-speedometer, .ion-spoon, .ion-star, .ion-stats-bars, .ion-steam, .ion-stop, .ion-thermometer, .ion-thumbsdown, .ion-thumbsup, .ion-toggle, .ion-toggle-filled, .ion-trash-a, .ion-trash-b, .ion-trophy, .ion-umbrella, .ion-university, .ion-unlocked, .ion-upload, .ion-usb, .ion-videocamera, .ion-volume-high, .ion-volume-low, .ion-volume-medium, .ion-volume-mute, .ion-wand, .ion-waterdrop, .ion-wifi, .ion-wineglass, .ion-woman, .ion-wrench, .ion-xbox { display: inline-block; font-family: "Ionicons"; speak: none; font-style: normal; font-weight: normal; font-variant: normal; text-transform: none; text-rendering: auto; line-height: 1; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .ion-spin, .ion-loading-a, .ion-loading-b, .ion-loading-c, .ion-loading-d, .ion-looping, .ion-refreshing, .ion-ios7-reloading { -webkit-animation: spin 1s infinite linear; -moz-animation: spin 1s infinite linear; -o-animation: spin 1s infinite linear; animation: spin 1s infinite linear; } @-moz-keyframes spin { 0% { -moz-transform: rotate(0deg); } 100% { -moz-transform: rotate(359deg); } } @-webkit-keyframes spin { 0% { -webkit-transform: rotate(0deg); } 100% { -webkit-transform: rotate(359deg); } } @-o-keyframes spin { 0% { -o-transform: rotate(0deg); } 100% { -o-transform: rotate(359deg); } } @-ms-keyframes spin { 0% { -ms-transform: rotate(0deg); } 100% { -ms-transform: rotate(359deg); } } @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(359deg); } } .ion-loading-a { -webkit-animation-timing-function: steps(8, start); -moz-animation-timing-function: steps(8, start); animation-timing-function: steps(8, start); } .ion-alert:before { content: "\f101"; } .ion-alert-circled:before { content: "\f100"; } .ion-android-add:before { content: "\f2c7"; } .ion-android-add-contact:before { content: "\f2c6"; } .ion-android-alarm:before { content: "\f2c8"; } .ion-android-archive:before { content: "\f2c9"; } .ion-android-arrow-back:before { content: "\f2ca"; } .ion-android-arrow-down-left:before { content: "\f2cb"; } .ion-android-arrow-down-right:before { content: "\f2cc"; } .ion-android-arrow-forward:before { content: "\f30f"; } .ion-android-arrow-up-left:before { content: "\f2cd"; } .ion-android-arrow-up-right:before { content: "\f2ce"; } .ion-android-battery:before { content: "\f2cf"; } .ion-android-book:before { content: "\f2d0"; } .ion-android-calendar:before { content: "\f2d1"; } .ion-android-call:before { content: "\f2d2"; } .ion-android-camera:before { content: "\f2d3"; } .ion-android-chat:before { content: "\f2d4"; } .ion-android-checkmark:before { content: "\f2d5"; } .ion-android-clock:before { content: "\f2d6"; } .ion-android-close:before { content: "\f2d7"; } .ion-android-contact:before { content: "\f2d8"; } .ion-android-contacts:before { content: "\f2d9"; } .ion-android-data:before { content: "\f2da"; } .ion-android-developer:before { content: "\f2db"; } .ion-android-display:before { content: "\f2dc"; } .ion-android-download:before { content: "\f2dd"; } .ion-android-drawer:before { content: "\f310"; } .ion-android-dropdown:before { content: "\f2de"; } .ion-android-earth:before { content: "\f2df"; } .ion-android-folder:before { content: "\f2e0"; } .ion-android-forums:before { content: "\f2e1"; } .ion-android-friends:before { content: "\f2e2"; } .ion-android-hand:before { content: "\f2e3"; } .ion-android-image:before { content: "\f2e4"; } .ion-android-inbox:before { content: "\f2e5"; } .ion-android-information:before { content: "\f2e6"; } .ion-android-keypad:before { content: "\f2e7"; } .ion-android-lightbulb:before { content: "\f2e8"; } .ion-android-locate:before { content: "\f2e9"; } .ion-android-location:before { content: "\f2ea"; } .ion-android-mail:before { content: "\f2eb"; } .ion-android-microphone:before { content: "\f2ec"; } .ion-android-mixer:before { content: "\f2ed"; } .ion-android-more:before { content: "\f2ee"; } .ion-android-note:before { content: "\f2ef"; } .ion-android-playstore:before { content: "\f2f0"; } .ion-android-printer:before { content: "\f2f1"; } .ion-android-promotion:before { content: "\f2f2"; } .ion-android-reminder:before { content: "\f2f3"; } .ion-android-remove:before { content: "\f2f4"; } .ion-android-search:before { content: "\f2f5"; } .ion-android-send:before { content: "\f2f6"; } .ion-android-settings:before { content: "\f2f7"; } .ion-android-share:before { content: "\f2f8"; } .ion-android-social:before { content: "\f2fa"; } .ion-android-social-user:before { content: "\f2f9"; } .ion-android-sort:before { content: "\f2fb"; } .ion-android-stair-drawer:before { content: "\f311"; } .ion-android-star:before { content: "\f2fc"; } .ion-android-stopwatch:before { content: "\f2fd"; } .ion-android-storage:before { content: "\f2fe"; } .ion-android-system-back:before { content: "\f2ff"; } .ion-android-system-home:before { content: "\f300"; } .ion-android-system-windows:before { content: "\f301"; } .ion-android-timer:before { content: "\f302"; } .ion-android-trash:before { content: "\f303"; } .ion-android-user-menu:before { content: "\f312"; } .ion-android-volume:before { content: "\f304"; } .ion-android-wifi:before { content: "\f305"; } .ion-aperture:before { content: "\f313"; } .ion-archive:before { content: "\f102"; } .ion-arrow-down-a:before { content: "\f103"; } .ion-arrow-down-b:before { content: "\f104"; } .ion-arrow-down-c:before { content: "\f105"; } .ion-arrow-expand:before { content: "\f25e"; } .ion-arrow-graph-down-left:before { content: "\f25f"; } .ion-arrow-graph-down-right:before { content: "\f260"; } .ion-arrow-graph-up-left:before { content: "\f261"; } .ion-arrow-graph-up-right:before { content: "\f262"; } .ion-arrow-left-a:before { content: "\f106"; } .ion-arrow-left-b:before { content: "\f107"; } .ion-arrow-left-c:before { content: "\f108"; } .ion-arrow-move:before { content: "\f263"; } .ion-arrow-resize:before { content: "\f264"; } .ion-arrow-return-left:before { content: "\f265"; } .ion-arrow-return-right:before { content: "\f266"; } .ion-arrow-right-a:before { content: "\f109"; } .ion-arrow-right-b:before { content: "\f10a"; } .ion-arrow-right-c:before { content: "\f10b"; } .ion-arrow-shrink:before { content: "\f267"; } .ion-arrow-swap:before { content: "\f268"; } .ion-arrow-up-a:before { content: "\f10c"; } .ion-arrow-up-b:before { content: "\f10d"; } .ion-arrow-up-c:before { content: "\f10e"; } .ion-asterisk:before { content: "\f314"; } .ion-at:before { content: "\f10f"; } .ion-bag:before { content: "\f110"; } .ion-battery-charging:before { content: "\f111"; } .ion-battery-empty:before { content: "\f112"; } .ion-battery-full:before { content: "\f113"; } .ion-battery-half:before { content: "\f114"; } .ion-battery-low:before { content: "\f115"; } .ion-beaker:before { content: "\f269"; } .ion-beer:before { content: "\f26a"; } .ion-bluetooth:before { content: "\f116"; } .ion-bonfire:before { content: "\f315"; } .ion-bookmark:before { content: "\f26b"; } .ion-briefcase:before { content: "\f26c"; } .ion-bug:before { content: "\f2be"; } .ion-calculator:before { content: "\f26d"; } .ion-calendar:before { content: "\f117"; } .ion-camera:before { content: "\f118"; } .ion-card:before { content: "\f119"; } .ion-cash:before { content: "\f316"; } .ion-chatbox:before { content: "\f11b"; } .ion-chatbox-working:before { content: "\f11a"; } .ion-chatboxes:before { content: "\f11c"; } .ion-chatbubble:before { content: "\f11e"; } .ion-chatbubble-working:before { content: "\f11d"; } .ion-chatbubbles:before { content: "\f11f"; } .ion-checkmark:before { content: "\f122"; } .ion-checkmark-circled:before { content: "\f120"; } .ion-checkmark-round:before { content: "\f121"; } .ion-chevron-down:before { content: "\f123"; } .ion-chevron-left:before { content: "\f124"; } .ion-chevron-right:before { content: "\f125"; } .ion-chevron-up:before { content: "\f126"; } .ion-clipboard:before { content: "\f127"; } .ion-clock:before { content: "\f26e"; } .ion-close:before { content: "\f12a"; } .ion-close-circled:before { content: "\f128"; } .ion-close-round:before { content: "\f129"; } .ion-closed-captioning:before { content: "\f317"; } .ion-cloud:before { content: "\f12b"; } .ion-code:before { content: "\f271"; } .ion-code-download:before { content: "\f26f"; } .ion-code-working:before { content: "\f270"; } .ion-coffee:before { content: "\f272"; } .ion-compass:before { content: "\f273"; } .ion-compose:before { content: "\f12c"; } .ion-connection-bars:before { content: "\f274"; } .ion-contrast:before { content: "\f275"; } .ion-cube:before { content: "\f318"; } .ion-disc:before { content: "\f12d"; } .ion-document:before { content: "\f12f"; } .ion-document-text:before { content: "\f12e"; } .ion-drag:before { content: "\f130"; } .ion-earth:before { content: "\f276"; } .ion-edit:before { content: "\f2bf"; } .ion-egg:before { content: "\f277"; } .ion-eject:before { content: "\f131"; } .ion-email:before { content: "\f132"; } .ion-eye:before { content: "\f133"; } .ion-eye-disabled:before { content: "\f306"; } .ion-female:before { content: "\f278"; } .ion-filing:before { content: "\f134"; } .ion-film-marker:before { content: "\f135"; } .ion-fireball:before { content: "\f319"; } .ion-flag:before { content: "\f279"; } .ion-flame:before { content: "\f31a"; } .ion-flash:before { content: "\f137"; } .ion-flash-off:before { content: "\f136"; } .ion-flask:before { content: "\f138"; } .ion-folder:before { content: "\f139"; } .ion-fork:before { content: "\f27a"; } .ion-fork-repo:before { content: "\f2c0"; } .ion-forward:before { content: "\f13a"; } .ion-funnel:before { content: "\f31b"; } .ion-game-controller-a:before { content: "\f13b"; } .ion-game-controller-b:before { content: "\f13c"; } .ion-gear-a:before { content: "\f13d"; } .ion-gear-b:before { content: "\f13e"; } .ion-grid:before { content: "\f13f"; } .ion-hammer:before { content: "\f27b"; } .ion-happy:before { content: "\f31c"; } .ion-headphone:before { content: "\f140"; } .ion-heart:before { content: "\f141"; } .ion-heart-broken:before { content: "\f31d"; } .ion-help:before { content: "\f143"; } .ion-help-buoy:before { content: "\f27c"; } .ion-help-circled:before { content: "\f142"; } .ion-home:before { content: "\f144"; } .ion-icecream:before { content: "\f27d"; } .ion-icon-social-google-plus:before { content: "\f146"; } .ion-icon-social-google-plus-outline:before { content: "\f145"; } .ion-image:before { content: "\f147"; } .ion-images:before { content: "\f148"; } .ion-information:before { content: "\f14a"; } .ion-information-circled:before { content: "\f149"; } .ion-ionic:before { content: "\f14b"; } .ion-ios7-alarm:before { content: "\f14d"; } .ion-ios7-alarm-outline:before { content: "\f14c"; } .ion-ios7-albums:before { content: "\f14f"; } .ion-ios7-albums-outline:before { content: "\f14e"; } .ion-ios7-americanfootball:before { content: "\f31f"; } .ion-ios7-americanfootball-outline:before { content: "\f31e"; } .ion-ios7-analytics:before { content: "\f321"; } .ion-ios7-analytics-outline:before { content: "\f320"; } .ion-ios7-arrow-back:before { content: "\f150"; } .ion-ios7-arrow-down:before { content: "\f151"; } .ion-ios7-arrow-forward:before { content: "\f152"; } .ion-ios7-arrow-left:before { content: "\f153"; } .ion-ios7-arrow-right:before { content: "\f154"; } .ion-ios7-arrow-thin-down:before { content: "\f27e"; } .ion-ios7-arrow-thin-left:before { content: "\f27f"; } .ion-ios7-arrow-thin-right:before { content: "\f280"; } .ion-ios7-arrow-thin-up:before { content: "\f281"; } .ion-ios7-arrow-up:before { content: "\f155"; } .ion-ios7-at:before { content: "\f157"; } .ion-ios7-at-outline:before { content: "\f156"; } .ion-ios7-barcode:before { content: "\f323"; } .ion-ios7-barcode-outline:before { content: "\f322"; } .ion-ios7-baseball:before { content: "\f325"; } .ion-ios7-baseball-outline:before { content: "\f324"; } .ion-ios7-basketball:before { content: "\f327"; } .ion-ios7-basketball-outline:before { content: "\f326"; } .ion-ios7-bell:before { content: "\f159"; } .ion-ios7-bell-outline:before { content: "\f158"; } .ion-ios7-bolt:before { content: "\f15b"; } .ion-ios7-bolt-outline:before { content: "\f15a"; } .ion-ios7-bookmarks:before { content: "\f15d"; } .ion-ios7-bookmarks-outline:before { content: "\f15c"; } .ion-ios7-box:before { content: "\f15f"; } .ion-ios7-box-outline:before { content: "\f15e"; } .ion-ios7-briefcase:before { content: "\f283"; } .ion-ios7-briefcase-outline:before { content: "\f282"; } .ion-ios7-browsers:before { content: "\f161"; } .ion-ios7-browsers-outline:before { content: "\f160"; } .ion-ios7-calculator:before { content: "\f285"; } .ion-ios7-calculator-outline:before { content: "\f284"; } .ion-ios7-calendar:before { content: "\f163"; } .ion-ios7-calendar-outline:before { content: "\f162"; } .ion-ios7-camera:before { content: "\f165"; } .ion-ios7-camera-outline:before { content: "\f164"; } .ion-ios7-cart:before { content: "\f167"; } .ion-ios7-cart-outline:before { content: "\f166"; } .ion-ios7-chatboxes:before { content: "\f169"; } .ion-ios7-chatboxes-outline:before { content: "\f168"; } .ion-ios7-chatbubble:before { content: "\f16b"; } .ion-ios7-chatbubble-outline:before { content: "\f16a"; } .ion-ios7-checkmark:before { content: "\f16e"; } .ion-ios7-checkmark-empty:before { content: "\f16c"; } .ion-ios7-checkmark-outline:before { content: "\f16d"; } .ion-ios7-circle-filled:before { content: "\f16f"; } .ion-ios7-circle-outline:before { content: "\f170"; } .ion-ios7-clock:before { content: "\f172"; } .ion-ios7-clock-outline:before { content: "\f171"; } .ion-ios7-close:before { content: "\f2bc"; } .ion-ios7-close-empty:before { content: "\f2bd"; } .ion-ios7-close-outline:before { content: "\f2bb"; } .ion-ios7-cloud:before { content: "\f178"; } .ion-ios7-cloud-download:before { content: "\f174"; } .ion-ios7-cloud-download-outline:before { content: "\f173"; } .ion-ios7-cloud-outline:before { content: "\f175"; } .ion-ios7-cloud-upload:before { content: "\f177"; } .ion-ios7-cloud-upload-outline:before { content: "\f176"; } .ion-ios7-cloudy:before { content: "\f17a"; } .ion-ios7-cloudy-night:before { content: "\f308"; } .ion-ios7-cloudy-night-outline:before { content: "\f307"; } .ion-ios7-cloudy-outline:before { content: "\f179"; } .ion-ios7-cog:before { content: "\f17c"; } .ion-ios7-cog-outline:before { content: "\f17b"; } .ion-ios7-compose:before { content: "\f17e"; } .ion-ios7-compose-outline:before { content: "\f17d"; } .ion-ios7-contact:before { content: "\f180"; } .ion-ios7-contact-outline:before { content: "\f17f"; } .ion-ios7-copy:before { content: "\f182"; } .ion-ios7-copy-outline:before { content: "\f181"; } .ion-ios7-download:before { content: "\f184"; } .ion-ios7-download-outline:before { content: "\f183"; } .ion-ios7-drag:before { content: "\f185"; } .ion-ios7-email:before { content: "\f187"; } .ion-ios7-email-outline:before { content: "\f186"; } .ion-ios7-expand:before { content: "\f30d"; } .ion-ios7-eye:before { content: "\f189"; } .ion-ios7-eye-outline:before { content: "\f188"; } .ion-ios7-fastforward:before { content: "\f18b"; } .ion-ios7-fastforward-outline:before { content: "\f18a"; } .ion-ios7-filing:before { content: "\f18d"; } .ion-ios7-filing-outline:before { content: "\f18c"; } .ion-ios7-film:before { content: "\f18f"; } .ion-ios7-film-outline:before { content: "\f18e"; } .ion-ios7-flag:before { content: "\f191"; } .ion-ios7-flag-outline:before { content: "\f190"; } .ion-ios7-folder:before { content: "\f193"; } .ion-ios7-folder-outline:before { content: "\f192"; } .ion-ios7-football:before { content: "\f329"; } .ion-ios7-football-outline:before { content: "\f328"; } .ion-ios7-gear:before { content: "\f195"; } .ion-ios7-gear-outline:before { content: "\f194"; } .ion-ios7-glasses:before { content: "\f197"; } .ion-ios7-glasses-outline:before { content: "\f196"; } .ion-ios7-heart:before { content: "\f199"; } .ion-ios7-heart-outline:before { content: "\f198"; } .ion-ios7-help:before { content: "\f19c"; } .ion-ios7-help-empty:before { content: "\f19a"; } .ion-ios7-help-outline:before { content: "\f19b"; } .ion-ios7-home:before { content: "\f32b"; } .ion-ios7-home-outline:before { content: "\f32a"; } .ion-ios7-infinite:before { content: "\f19e"; } .ion-ios7-infinite-outline:before { content: "\f19d"; } .ion-ios7-information:before { content: "\f1a1"; } .ion-ios7-information-empty:before { content: "\f19f"; } .ion-ios7-information-outline:before { content: "\f1a0"; } .ion-ios7-ionic-outline:before { content: "\f1a2"; } .ion-ios7-keypad:before { content: "\f1a4"; } .ion-ios7-keypad-outline:before { content: "\f1a3"; } .ion-ios7-lightbulb:before { content: "\f287"; } .ion-ios7-lightbulb-outline:before { content: "\f286"; } .ion-ios7-location:before { content: "\f1a6"; } .ion-ios7-location-outline:before { content: "\f1a5"; } .ion-ios7-locked:before { content: "\f1a8"; } .ion-ios7-locked-outline:before { content: "\f1a7"; } .ion-ios7-loop:before { content: "\f32d"; } .ion-ios7-loop-strong:before { content: "\f32c"; } .ion-ios7-medkit:before { content: "\f289"; } .ion-ios7-medkit-outline:before { content: "\f288"; } .ion-ios7-mic:before { content: "\f1ab"; } .ion-ios7-mic-off:before { content: "\f1a9"; } .ion-ios7-mic-outline:before { content: "\f1aa"; } .ion-ios7-minus:before { content: "\f1ae"; } .ion-ios7-minus-empty:before { content: "\f1ac"; } .ion-ios7-minus-outline:before { content: "\f1ad"; } .ion-ios7-monitor:before { content: "\f1b0"; } .ion-ios7-monitor-outline:before { content: "\f1af"; } .ion-ios7-moon:before { content: "\f1b2"; } .ion-ios7-moon-outline:before { content: "\f1b1"; } .ion-ios7-more:before { content: "\f1b4"; } .ion-ios7-more-outline:before { content: "\f1b3"; } .ion-ios7-musical-note:before { content: "\f1b5"; } .ion-ios7-musical-notes:before { content: "\f1b6"; } .ion-ios7-navigate:before { content: "\f1b8"; } .ion-ios7-navigate-outline:before { content: "\f1b7"; } .ion-ios7-paper:before { content: "\f32f"; } .ion-ios7-paper-outline:before { content: "\f32e"; } .ion-ios7-paperplane:before { content: "\f1ba"; } .ion-ios7-paperplane-outline:before { content: "\f1b9"; } .ion-ios7-partlysunny:before { content: "\f1bc"; } .ion-ios7-partlysunny-outline:before { content: "\f1bb"; } .ion-ios7-pause:before { content: "\f1be"; } .ion-ios7-pause-outline:before { content: "\f1bd"; } .ion-ios7-paw:before { content: "\f331"; } .ion-ios7-paw-outline:before { content: "\f330"; } .ion-ios7-people:before { content: "\f1c0"; } .ion-ios7-people-outline:before { content: "\f1bf"; } .ion-ios7-person:before { content: "\f1c2"; } .ion-ios7-person-outline:before { content: "\f1c1"; } .ion-ios7-personadd:before { content: "\f1c4"; } .ion-ios7-personadd-outline:before { content: "\f1c3"; } .ion-ios7-photos:before { content: "\f1c6"; } .ion-ios7-photos-outline:before { content: "\f1c5"; } .ion-ios7-pie:before { content: "\f28b"; } .ion-ios7-pie-outline:before { content: "\f28a"; } .ion-ios7-play:before { content: "\f1c8"; } .ion-ios7-play-outline:before { content: "\f1c7"; } .ion-ios7-plus:before { content: "\f1cb"; } .ion-ios7-plus-empty:before { content: "\f1c9"; } .ion-ios7-plus-outline:before { content: "\f1ca"; } .ion-ios7-pricetag:before { content: "\f28d"; } .ion-ios7-pricetag-outline:before { content: "\f28c"; } .ion-ios7-pricetags:before { content: "\f333"; } .ion-ios7-pricetags-outline:before { content: "\f332"; } .ion-ios7-printer:before { content: "\f1cd"; } .ion-ios7-printer-outline:before { content: "\f1cc"; } .ion-ios7-pulse:before { content: "\f335"; } .ion-ios7-pulse-strong:before { content: "\f334"; } .ion-ios7-rainy:before { content: "\f1cf"; } .ion-ios7-rainy-outline:before { content: "\f1ce"; } .ion-ios7-recording:before { content: "\f1d1"; } .ion-ios7-recording-outline:before { content: "\f1d0"; } .ion-ios7-redo:before { content: "\f1d3"; } .ion-ios7-redo-outline:before { content: "\f1d2"; } .ion-ios7-refresh:before { content: "\f1d6"; } .ion-ios7-refresh-empty:before { content: "\f1d4"; } .ion-ios7-refresh-outline:before { content: "\f1d5"; } .ion-ios7-reload:before { content: "\f28e"; } .ion-ios7-reverse-camera:before { content: "\f337"; } .ion-ios7-reverse-camera-outline:before { content: "\f336"; } .ion-ios7-rewind:before { content: "\f1d8"; } .ion-ios7-rewind-outline:before { content: "\f1d7"; } .ion-ios7-search:before { content: "\f1da"; } .ion-ios7-search-strong:before { content: "\f1d9"; } .ion-ios7-settings:before { content: "\f339"; } .ion-ios7-settings-strong:before { content: "\f338"; } .ion-ios7-shrink:before { content: "\f30e"; } .ion-ios7-skipbackward:before { content: "\f1dc"; } .ion-ios7-skipbackward-outline:before { content: "\f1db"; } .ion-ios7-skipforward:before { content: "\f1de"; } .ion-ios7-skipforward-outline:before { content: "\f1dd"; } .ion-ios7-snowy:before { content: "\f309"; } .ion-ios7-speedometer:before { content: "\f290"; } .ion-ios7-speedometer-outline:before { content: "\f28f"; } .ion-ios7-star:before { content: "\f1e0"; } .ion-ios7-star-half:before { content: "\f33a"; } .ion-ios7-star-outline:before { content: "\f1df"; } .ion-ios7-stopwatch:before { content: "\f1e2"; } .ion-ios7-stopwatch-outline:before { content: "\f1e1"; } .ion-ios7-sunny:before { content: "\f1e4"; } .ion-ios7-sunny-outline:before { content: "\f1e3"; } .ion-ios7-telephone:before { content: "\f1e6"; } .ion-ios7-telephone-outline:before { content: "\f1e5"; } .ion-ios7-tennisball:before { content: "\f33c"; } .ion-ios7-tennisball-outline:before { content: "\f33b"; } .ion-ios7-thunderstorm:before { content: "\f1e8"; } .ion-ios7-thunderstorm-outline:before { content: "\f1e7"; } .ion-ios7-time:before { content: "\f292"; } .ion-ios7-time-outline:before { content: "\f291"; } .ion-ios7-timer:before { content: "\f1ea"; } .ion-ios7-timer-outline:before { content: "\f1e9"; } .ion-ios7-toggle:before { content: "\f33e"; } .ion-ios7-toggle-outline:before { content: "\f33d"; } .ion-ios7-trash:before { content: "\f1ec"; } .ion-ios7-trash-outline:before { content: "\f1eb"; } .ion-ios7-undo:before { content: "\f1ee"; } .ion-ios7-undo-outline:before { content: "\f1ed"; } .ion-ios7-unlocked:before { content: "\f1f0"; } .ion-ios7-unlocked-outline:before { content: "\f1ef"; } .ion-ios7-upload:before { content: "\f1f2"; } .ion-ios7-upload-outline:before { content: "\f1f1"; } .ion-ios7-videocam:before { content: "\f1f4"; } .ion-ios7-videocam-outline:before { content: "\f1f3"; } .ion-ios7-volume-high:before { content: "\f1f5"; } .ion-ios7-volume-low:before { content: "\f1f6"; } .ion-ios7-wineglass:before { content: "\f294"; } .ion-ios7-wineglass-outline:before { content: "\f293"; } .ion-ios7-world:before { content: "\f1f8"; } .ion-ios7-world-outline:before { content: "\f1f7"; } .ion-ipad:before { content: "\f1f9"; } .ion-iphone:before { content: "\f1fa"; } .ion-ipod:before { content: "\f1fb"; } .ion-jet:before { content: "\f295"; } .ion-key:before { content: "\f296"; } .ion-knife:before { content: "\f297"; } .ion-laptop:before { content: "\f1fc"; } .ion-leaf:before { content: "\f1fd"; } .ion-levels:before { content: "\f298"; } .ion-lightbulb:before { content: "\f299"; } .ion-link:before { content: "\f1fe"; } .ion-load-a:before { content: "\f29a"; } .ion-load-b:before { content: "\f29b"; } .ion-load-c:before { content: "\f29c"; } .ion-load-d:before { content: "\f29d"; } .ion-location:before { content: "\f1ff"; } .ion-locked:before { content: "\f200"; } .ion-log-in:before { content: "\f29e"; } .ion-log-out:before { content: "\f29f"; } .ion-loop:before { content: "\f201"; } .ion-magnet:before { content: "\f2a0"; } .ion-male:before { content: "\f2a1"; } .ion-man:before { content: "\f202"; } .ion-map:before { content: "\f203"; } .ion-medkit:before { content: "\f2a2"; } .ion-merge:before { content: "\f33f"; } .ion-mic-a:before { content: "\f204"; } .ion-mic-b:before { content: "\f205"; } .ion-mic-c:before { content: "\f206"; } .ion-minus:before { content: "\f209"; } .ion-minus-circled:before { content: "\f207"; } .ion-minus-round:before { content: "\f208"; } .ion-model-s:before { content: "\f2c1"; } .ion-monitor:before { content: "\f20a"; } .ion-more:before { content: "\f20b"; } .ion-mouse:before { content: "\f340"; } .ion-music-note:before { content: "\f20c"; } .ion-navicon:before { content: "\f20e"; } .ion-navicon-round:before { content: "\f20d"; } .ion-navigate:before { content: "\f2a3"; } .ion-network:before { content: "\f341"; } .ion-no-smoking:before { content: "\f2c2"; } .ion-nuclear:before { content: "\f2a4"; } .ion-outlet:before { content: "\f342"; } .ion-paper-airplane:before { content: "\f2c3"; } .ion-paperclip:before { content: "\f20f"; } .ion-pause:before { content: "\f210"; } .ion-person:before { content: "\f213"; } .ion-person-add:before { content: "\f211"; } .ion-person-stalker:before { content: "\f212"; } .ion-pie-graph:before { content: "\f2a5"; } .ion-pin:before { content: "\f2a6"; } .ion-pinpoint:before { content: "\f2a7"; } .ion-pizza:before { content: "\f2a8"; } .ion-plane:before { content: "\f214"; } .ion-planet:before { content: "\f343"; } .ion-play:before { content: "\f215"; } .ion-playstation:before { content: "\f30a"; } .ion-plus:before { content: "\f218"; } .ion-plus-circled:before { content: "\f216"; } .ion-plus-round:before { content: "\f217"; } .ion-podium:before { content: "\f344"; } .ion-pound:before { content: "\f219"; } .ion-power:before { content: "\f2a9"; } .ion-pricetag:before { content: "\f2aa"; } .ion-pricetags:before { content: "\f2ab"; } .ion-printer:before { content: "\f21a"; } .ion-pull-request:before { content: "\f345"; } .ion-qr-scanner:before { content: "\f346"; } .ion-quote:before { content: "\f347"; } .ion-radio-waves:before { content: "\f2ac"; } .ion-record:before { content: "\f21b"; } .ion-refresh:before { content: "\f21c"; } .ion-reply:before { content: "\f21e"; } .ion-reply-all:before { content: "\f21d"; } .ion-ribbon-a:before { content: "\f348"; } .ion-ribbon-b:before { content: "\f349"; } .ion-sad:before { content: "\f34a"; } .ion-scissors:before { content: "\f34b"; } .ion-search:before { content: "\f21f"; } .ion-settings:before { content: "\f2ad"; } .ion-share:before { content: "\f220"; } .ion-shuffle:before { content: "\f221"; } .ion-skip-backward:before { content: "\f222"; } .ion-skip-forward:before { content: "\f223"; } .ion-social-android:before { content: "\f225"; } .ion-social-android-outline:before { content: "\f224"; } .ion-social-apple:before { content: "\f227"; } .ion-social-apple-outline:before { content: "\f226"; } .ion-social-bitcoin:before { content: "\f2af"; } .ion-social-bitcoin-outline:before { content: "\f2ae"; } .ion-social-buffer:before { content: "\f229"; } .ion-social-buffer-outline:before { content: "\f228"; } .ion-social-designernews:before { content: "\f22b"; } .ion-social-designernews-outline:before { content: "\f22a"; } .ion-social-dribbble:before { content: "\f22d"; } .ion-social-dribbble-outline:before { content: "\f22c"; } .ion-social-dropbox:before { content: "\f22f"; } .ion-social-dropbox-outline:before { content: "\f22e"; } .ion-social-facebook:before { content: "\f231"; } .ion-social-facebook-outline:before { content: "\f230"; } .ion-social-foursquare:before { content: "\f34d"; } .ion-social-foursquare-outline:before { content: "\f34c"; } .ion-social-freebsd-devil:before { content: "\f2c4"; } .ion-social-github:before { content: "\f233"; } .ion-social-github-outline:before { content: "\f232"; } .ion-social-google:before { content: "\f34f"; } .ion-social-google-outline:before { content: "\f34e"; } .ion-social-googleplus:before { content: "\f235"; } .ion-social-googleplus-outline:before { content: "\f234"; } .ion-social-hackernews:before { content: "\f237"; } .ion-social-hackernews-outline:before { content: "\f236"; } .ion-social-instagram:before { content: "\f351"; } .ion-social-instagram-outline:before { content: "\f350"; } .ion-social-linkedin:before { content: "\f239"; } .ion-social-linkedin-outline:before { content: "\f238"; } .ion-social-pinterest:before { content: "\f2b1"; } .ion-social-pinterest-outline:before { content: "\f2b0"; } .ion-social-reddit:before { content: "\f23b"; } .ion-social-reddit-outline:before { content: "\f23a"; } .ion-social-rss:before { content: "\f23d"; } .ion-social-rss-outline:before { content: "\f23c"; } .ion-social-skype:before { content: "\f23f"; } .ion-social-skype-outline:before { content: "\f23e"; } .ion-social-tumblr:before { content: "\f241"; } .ion-social-tumblr-outline:before { content: "\f240"; } .ion-social-tux:before { content: "\f2c5"; } .ion-social-twitter:before { content: "\f243"; } .ion-social-twitter-outline:before { content: "\f242"; } .ion-social-usd:before { content: "\f353"; } .ion-social-usd-outline:before { content: "\f352"; } .ion-social-vimeo:before { content: "\f245"; } .ion-social-vimeo-outline:before { content: "\f244"; } .ion-social-windows:before { content: "\f247"; } .ion-social-windows-outline:before { content: "\f246"; } .ion-social-wordpress:before { content: "\f249"; } .ion-social-wordpress-outline:before { content: "\f248"; } .ion-social-yahoo:before { content: "\f24b"; } .ion-social-yahoo-outline:before { content: "\f24a"; } .ion-social-youtube:before { content: "\f24d"; } .ion-social-youtube-outline:before { content: "\f24c"; } .ion-speakerphone:before { content: "\f2b2"; } .ion-speedometer:before { content: "\f2b3"; } .ion-spoon:before { content: "\f2b4"; } .ion-star:before { content: "\f24e"; } .ion-stats-bars:before { content: "\f2b5"; } .ion-steam:before { content: "\f30b"; } .ion-stop:before { content: "\f24f"; } .ion-thermometer:before { content: "\f2b6"; } .ion-thumbsdown:before { content: "\f250"; } .ion-thumbsup:before { content: "\f251"; } .ion-toggle:before { content: "\f355"; } .ion-toggle-filled:before { content: "\f354"; } .ion-trash-a:before { content: "\f252"; } .ion-trash-b:before { content: "\f253"; } .ion-trophy:before { content: "\f356"; } .ion-umbrella:before { content: "\f2b7"; } .ion-university:before { content: "\f357"; } .ion-unlocked:before { content: "\f254"; } .ion-upload:before { content: "\f255"; } .ion-usb:before { content: "\f2b8"; } .ion-videocamera:before { content: "\f256"; } .ion-volume-high:before { content: "\f257"; } .ion-volume-low:before { content: "\f258"; } .ion-volume-medium:before { content: "\f259"; } .ion-volume-mute:before { content: "\f25a"; } .ion-wand:before { content: "\f358"; } .ion-waterdrop:before { content: "\f25b"; } .ion-wifi:before { content: "\f25c"; } .ion-wineglass:before { content: "\f2b9"; } .ion-woman:before { content: "\f25d"; } .ion-wrench:before { content: "\f2ba"; } .ion-xbox:before { content: "\f30c"; } /*! * Weather Icons 2.0 * Updated August 1, 2015 * Weather themed icons for Bootstrap * Author - Erik Flowers - erik@helloerik.com * Email: erik@helloerik.com * Twitter: http://twitter.com/Erik_UX * ------------------------------------------------------------------------------ * Maintained at http://erikflowers.github.io/weather-icons * * License * ------------------------------------------------------------------------------ * - Font licensed under SIL OFL 1.1 - * http://scripts.sil.org/OFL * - CSS, SCSS and LESS are licensed under MIT License - * http://opensource.org/licenses/mit-license.html * - Documentation licensed under CC BY 3.0 - * http://creativecommons.org/licenses/by/3.0/ * - Inspired by and works great as a companion with Font Awesome * "Font Awesome by Dave Gandy - http://fontawesome.io" */ @font-face { font-family: 'weathericons'; src: url('../fonts/weathericons-regular-webfont.eot'); src: url('../fonts/weathericons-regular-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/weathericons-regular-webfont.woff2') format('woff2'), url('../fonts/weathericons-regular-webfont.woff') format('woff'), url('../fonts/weathericons-regular-webfont.ttf') format('truetype'), url('../fonts/weathericons-regular-webfont.svg#weather_iconsregular') format('svg'); font-weight: normal; font-style: normal; } .wi { display: inline-block; font-family: 'weathericons'; font-style: normal; font-weight: normal; line-height: 1; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .wi-fw { text-align: center; width: 1.4em; } .wi-rotate-90 { filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); -webkit-transform: rotate(90deg); -ms-transform: rotate(90deg); transform: rotate(90deg); } .wi-rotate-180 { filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); -webkit-transform: rotate(180deg); -ms-transform: rotate(180deg); transform: rotate(180deg); } .wi-rotate-270 { filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); -webkit-transform: rotate(270deg); -ms-transform: rotate(270deg); transform: rotate(270deg); } .wi-flip-horizontal { filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1); -webkit-transform: scale(-1, 1); -ms-transform: scale(-1, 1); transform: scale(-1, 1); } .wi-flip-vertical { filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1); -webkit-transform: scale(1, -1); -ms-transform: scale(1, -1); transform: scale(1, -1); } .wi-day-sunny:before { content: "\f00d"; } .wi-day-cloudy:before { content: "\f002"; } .wi-day-cloudy-gusts:before { content: "\f000"; } .wi-day-cloudy-windy:before { content: "\f001"; } .wi-day-fog:before { content: "\f003"; } .wi-day-hail:before { content: "\f004"; } .wi-day-haze:before { content: "\f0b6"; } .wi-day-lightning:before { content: "\f005"; } .wi-day-rain:before { content: "\f008"; } .wi-day-rain-mix:before { content: "\f006"; } .wi-day-rain-wind:before { content: "\f007"; } .wi-day-showers:before { content: "\f009"; } .wi-day-sleet:before { content: "\f0b2"; } .wi-day-sleet-storm:before { content: "\f068"; } .wi-day-snow:before { content: "\f00a"; } .wi-day-snow-thunderstorm:before { content: "\f06b"; } .wi-day-snow-wind:before { content: "\f065"; } .wi-day-sprinkle:before { content: "\f00b"; } .wi-day-storm-showers:before { content: "\f00e"; } .wi-day-sunny-overcast:before { content: "\f00c"; } .wi-day-thunderstorm:before { content: "\f010"; } .wi-day-windy:before { content: "\f085"; } .wi-solar-eclipse:before { content: "\f06e"; } .wi-hot:before { content: "\f072"; } .wi-day-cloudy-high:before { content: "\f07d"; } .wi-day-light-wind:before { content: "\f0c4"; } .wi-night-clear:before { content: "\f02e"; } .wi-night-alt-cloudy:before { content: "\f086"; } .wi-night-alt-cloudy-gusts:before { content: "\f022"; } .wi-night-alt-cloudy-windy:before { content: "\f023"; } .wi-night-alt-hail:before { content: "\f024"; } .wi-night-alt-lightning:before { content: "\f025"; } .wi-night-alt-rain:before { content: "\f028"; } .wi-night-alt-rain-mix:before { content: "\f026"; } .wi-night-alt-rain-wind:before { content: "\f027"; } .wi-night-alt-showers:before { content: "\f029"; } .wi-night-alt-sleet:before { content: "\f0b4"; } .wi-night-alt-sleet-storm:before { content: "\f06a"; } .wi-night-alt-snow:before { content: "\f02a"; } .wi-night-alt-snow-thunderstorm:before { content: "\f06d"; } .wi-night-alt-snow-wind:before { content: "\f067"; } .wi-night-alt-sprinkle:before { content: "\f02b"; } .wi-night-alt-storm-showers:before { content: "\f02c"; } .wi-night-alt-thunderstorm:before { content: "\f02d"; } .wi-night-cloudy:before { content: "\f031"; } .wi-night-cloudy-gusts:before { content: "\f02f"; } .wi-night-cloudy-windy:before { content: "\f030"; } .wi-night-fog:before { content: "\f04a"; } .wi-night-hail:before { content: "\f032"; } .wi-night-lightning:before { content: "\f033"; } .wi-night-partly-cloudy:before { content: "\f083"; } .wi-night-rain:before { content: "\f036"; } .wi-night-rain-mix:before { content: "\f034"; } .wi-night-rain-wind:before { content: "\f035"; } .wi-night-showers:before { content: "\f037"; } .wi-night-sleet:before { content: "\f0b3"; } .wi-night-sleet-storm:before { content: "\f069"; } .wi-night-snow:before { content: "\f038"; } .wi-night-snow-thunderstorm:before { content: "\f06c"; } .wi-night-snow-wind:before { content: "\f066"; } .wi-night-sprinkle:before { content: "\f039"; } .wi-night-storm-showers:before { content: "\f03a"; } .wi-night-thunderstorm:before { content: "\f03b"; } .wi-lunar-eclipse:before { content: "\f070"; } .wi-stars:before { content: "\f077"; } .wi-storm-showers:before { content: "\f01d"; } .wi-thunderstorm:before { content: "\f01e"; } .wi-night-alt-cloudy-high:before { content: "\f07e"; } .wi-night-cloudy-high:before { content: "\f080"; } .wi-night-alt-partly-cloudy:before { content: "\f081"; } .wi-cloud:before { content: "\f041"; } .wi-cloudy:before { content: "\f013"; } .wi-cloudy-gusts:before { content: "\f011"; } .wi-cloudy-windy:before { content: "\f012"; } .wi-fog:before { content: "\f014"; } .wi-hail:before { content: "\f015"; } .wi-rain:before { content: "\f019"; } .wi-rain-mix:before { content: "\f017"; } .wi-rain-wind:before { content: "\f018"; } .wi-showers:before { content: "\f01a"; } .wi-sleet:before { content: "\f0b5"; } .wi-snow:before { content: "\f01b"; } .wi-sprinkle:before { content: "\f01c"; } .wi-storm-showers:before { content: "\f01d"; } .wi-thunderstorm:before { content: "\f01e"; } .wi-snow-wind:before { content: "\f064"; } .wi-snow:before { content: "\f01b"; } .wi-smog:before { content: "\f074"; } .wi-smoke:before { content: "\f062"; } .wi-lightning:before { content: "\f016"; } .wi-raindrops:before { content: "\f04e"; } .wi-raindrop:before { content: "\f078"; } .wi-dust:before { content: "\f063"; } .wi-snowflake-cold:before { content: "\f076"; } .wi-windy:before { content: "\f021"; } .wi-strong-wind:before { content: "\f050"; } .wi-sandstorm:before { content: "\f082"; } .wi-earthquake:before { content: "\f0c6"; } .wi-fire:before { content: "\f0c7"; } .wi-flood:before { content: "\f07c"; } .wi-meteor:before { content: "\f071"; } .wi-tsunami:before { content: "\f0c5"; } .wi-volcano:before { content: "\f0c8"; } .wi-hurricane:before { content: "\f073"; } .wi-tornado:before { content: "\f056"; } .wi-small-craft-advisory:before { content: "\f0cc"; } .wi-gale-warning:before { content: "\f0cd"; } .wi-storm-warning:before { content: "\f0ce"; } .wi-hurricane-warning:before { content: "\f0cf"; } .wi-wind-direction:before { content: "\f0b1"; } .wi-alien:before { content: "\f075"; } .wi-celsius:before { content: "\f03c"; } .wi-fahrenheit:before { content: "\f045"; } .wi-degrees:before { content: "\f042"; } .wi-thermometer:before { content: "\f055"; } .wi-thermometer-exterior:before { content: "\f053"; } .wi-thermometer-internal:before { content: "\f054"; } .wi-cloud-down:before { content: "\f03d"; } .wi-cloud-up:before { content: "\f040"; } .wi-cloud-refresh:before { content: "\f03e"; } .wi-horizon:before { content: "\f047"; } .wi-horizon-alt:before { content: "\f046"; } .wi-sunrise:before { content: "\f051"; } .wi-sunset:before { content: "\f052"; } .wi-moonrise:before { content: "\f0c9"; } .wi-moonset:before { content: "\f0ca"; } .wi-refresh:before { content: "\f04c"; } .wi-refresh-alt:before { content: "\f04b"; } .wi-umbrella:before { content: "\f084"; } .wi-barometer:before { content: "\f079"; } .wi-humidity:before { content: "\f07a"; } .wi-na:before { content: "\f07b"; } .wi-train:before { content: "\f0cb"; } .wi-moon-new:before { content: "\f095"; } .wi-moon-waxing-cresent-1:before { content: "\f096"; } .wi-moon-waxing-cresent-2:before { content: "\f097"; } .wi-moon-waxing-cresent-3:before { content: "\f098"; } .wi-moon-waxing-cresent-4:before { content: "\f099"; } .wi-moon-waxing-cresent-5:before { content: "\f09a"; } .wi-moon-waxing-cresent-6:before { content: "\f09b"; } .wi-moon-first-quarter:before { content: "\f09c"; } .wi-moon-waxing-gibbous-1:before { content: "\f09d"; } .wi-moon-waxing-gibbous-2:before { content: "\f09e"; } .wi-moon-waxing-gibbous-3:before { content: "\f09f"; } .wi-moon-waxing-gibbous-4:before { content: "\f0a0"; } .wi-moon-waxing-gibbous-5:before { content: "\f0a1"; } .wi-moon-waxing-gibbous-6:before { content: "\f0a2"; } .wi-moon-full:before { content: "\f0a3"; } .wi-moon-waning-gibbous-1:before { content: "\f0a4"; } .wi-moon-waning-gibbous-2:before { content: "\f0a5"; } .wi-moon-waning-gibbous-3:before { content: "\f0a6"; } .wi-moon-waning-gibbous-4:before { content: "\f0a7"; } .wi-moon-waning-gibbous-5:before { content: "\f0a8"; } .wi-moon-waning-gibbous-6:before { content: "\f0a9"; } .wi-moon-third-quarter:before { content: "\f0aa"; } .wi-moon-waning-crescent-1:before { content: "\f0ab"; } .wi-moon-waning-crescent-2:before { content: "\f0ac"; } .wi-moon-waning-crescent-3:before { content: "\f0ad"; } .wi-moon-waning-crescent-4:before { content: "\f0ae"; } .wi-moon-waning-crescent-5:before { content: "\f0af"; } .wi-moon-waning-crescent-6:before { content: "\f0b0"; } .wi-moon-alt-new:before { content: "\f0eb"; } .wi-moon-alt-waxing-cresent-1:before { content: "\f0d0"; } .wi-moon-alt-waxing-cresent-2:before { content: "\f0d1"; } .wi-moon-alt-waxing-cresent-3:before { content: "\f0d2"; } .wi-moon-alt-waxing-cresent-4:before { content: "\f0d3"; } .wi-moon-alt-waxing-cresent-5:before { content: "\f0d4"; } .wi-moon-alt-waxing-cresent-6:before { content: "\f0d5"; } .wi-moon-alt-first-quarter:before { content: "\f0d6"; } .wi-moon-alt-waxing-gibbous-1:before { content: "\f0d7"; } .wi-moon-alt-waxing-gibbous-2:before { content: "\f0d8"; } .wi-moon-alt-waxing-gibbous-3:before { content: "\f0d9"; } .wi-moon-alt-waxing-gibbous-4:before { content: "\f0da"; } .wi-moon-alt-waxing-gibbous-5:before { content: "\f0db"; } .wi-moon-alt-waxing-gibbous-6:before { content: "\f0dc"; } .wi-moon-alt-full:before { content: "\f0dd"; } .wi-moon-alt-waning-gibbous-1:before { content: "\f0de"; } .wi-moon-alt-waning-gibbous-2:before { content: "\f0df"; } .wi-moon-alt-waning-gibbous-3:before { content: "\f0e0"; } .wi-moon-alt-waning-gibbous-4:before { content: "\f0e1"; } .wi-moon-alt-waning-gibbous-5:before { content: "\f0e2"; } .wi-moon-alt-waning-gibbous-6:before { content: "\f0e3"; } .wi-moon-alt-third-quarter:before { content: "\f0e4"; } .wi-moon-alt-waning-crescent-1:before { content: "\f0e5"; } .wi-moon-alt-waning-crescent-2:before { content: "\f0e6"; } .wi-moon-alt-waning-crescent-3:before { content: "\f0e7"; } .wi-moon-alt-waning-crescent-4:before { content: "\f0e8"; } .wi-moon-alt-waning-crescent-5:before { content: "\f0e9"; } .wi-moon-alt-waning-crescent-6:before { content: "\f0ea"; } .wi-moon-0:before { content: "\f095"; } .wi-moon-1:before { content: "\f096"; } .wi-moon-2:before { content: "\f097"; } .wi-moon-3:before { content: "\f098"; } .wi-moon-4:before { content: "\f099"; } .wi-moon-5:before { content: "\f09a"; } .wi-moon-6:before { content: "\f09b"; } .wi-moon-7:before { content: "\f09c"; } .wi-moon-8:before { content: "\f09d"; } .wi-moon-9:before { content: "\f09e"; } .wi-moon-10:before { content: "\f09f"; } .wi-moon-11:before { content: "\f0a0"; } .wi-moon-12:before { content: "\f0a1"; } .wi-moon-13:before { content: "\f0a2"; } .wi-moon-14:before { content: "\f0a3"; } .wi-moon-15:before { content: "\f0a4"; } .wi-moon-16:before { content: "\f0a5"; } .wi-moon-17:before { content: "\f0a6"; } .wi-moon-18:before { content: "\f0a7"; } .wi-moon-19:before { content: "\f0a8"; } .wi-moon-20:before { content: "\f0a9"; } .wi-moon-21:before { content: "\f0aa"; } .wi-moon-22:before { content: "\f0ab"; } .wi-moon-23:before { content: "\f0ac"; } .wi-moon-24:before { content: "\f0ad"; } .wi-moon-25:before { content: "\f0ae"; } .wi-moon-26:before { content: "\f0af"; } .wi-moon-27:before { content: "\f0b0"; } .wi-time-1:before { content: "\f08a"; } .wi-time-2:before { content: "\f08b"; } .wi-time-3:before { content: "\f08c"; } .wi-time-4:before { content: "\f08d"; } .wi-time-5:before { content: "\f08e"; } .wi-time-6:before { content: "\f08f"; } .wi-time-7:before { content: "\f090"; } .wi-time-8:before { content: "\f091"; } .wi-time-9:before { content: "\f092"; } .wi-time-10:before { content: "\f093"; } .wi-time-11:before { content: "\f094"; } .wi-time-12:before { content: "\f089"; } .wi-direction-up:before { content: "\f058"; } .wi-direction-up-right:before { content: "\f057"; } .wi-direction-right:before { content: "\f04d"; } .wi-direction-down-right:before { content: "\f088"; } .wi-direction-down:before { content: "\f044"; } .wi-direction-down-left:before { content: "\f043"; } .wi-direction-left:before { content: "\f048"; } .wi-direction-up-left:before { content: "\f087"; } .wi-wind-beaufort-0:before { content: "\f0b7"; } .wi-wind-beaufort-1:before { content: "\f0b8"; } .wi-wind-beaufort-2:before { content: "\f0b9"; } .wi-wind-beaufort-3:before { content: "\f0ba"; } .wi-wind-beaufort-4:before { content: "\f0bb"; } .wi-wind-beaufort-5:before { content: "\f0bc"; } .wi-wind-beaufort-6:before { content: "\f0bd"; } .wi-wind-beaufort-7:before { content: "\f0be"; } .wi-wind-beaufort-8:before { content: "\f0bf"; } .wi-wind-beaufort-9:before { content: "\f0c0"; } .wi-wind-beaufort-10:before { content: "\f0c1"; } .wi-wind-beaufort-11:before { content: "\f0c2"; } .wi-wind-beaufort-12:before { content: "\f0c3"; } .wi-yahoo-0:before { content: "\f056"; } .wi-yahoo-1:before { content: "\f00e"; } .wi-yahoo-2:before { content: "\f073"; } .wi-yahoo-3:before { content: "\f01e"; } .wi-yahoo-4:before { content: "\f01e"; } .wi-yahoo-5:before { content: "\f017"; } .wi-yahoo-6:before { content: "\f017"; } .wi-yahoo-7:before { content: "\f017"; } .wi-yahoo-8:before { content: "\f015"; } .wi-yahoo-9:before { content: "\f01a"; } .wi-yahoo-10:before { content: "\f015"; } .wi-yahoo-11:before { content: "\f01a"; } .wi-yahoo-12:before { content: "\f01a"; } .wi-yahoo-13:before { content: "\f01b"; } .wi-yahoo-14:before { content: "\f00a"; } .wi-yahoo-15:before { content: "\f064"; } .wi-yahoo-16:before { content: "\f01b"; } .wi-yahoo-17:before { content: "\f015"; } .wi-yahoo-18:before { content: "\f017"; } .wi-yahoo-19:before { content: "\f063"; } .wi-yahoo-20:before { content: "\f014"; } .wi-yahoo-21:before { content: "\f021"; } .wi-yahoo-22:before { content: "\f062"; } .wi-yahoo-23:before { content: "\f050"; } .wi-yahoo-24:before { content: "\f050"; } .wi-yahoo-25:before { content: "\f076"; } .wi-yahoo-26:before { content: "\f013"; } .wi-yahoo-27:before { content: "\f031"; } .wi-yahoo-28:before { content: "\f002"; } .wi-yahoo-29:before { content: "\f031"; } .wi-yahoo-30:before { content: "\f002"; } .wi-yahoo-31:before { content: "\f02e"; } .wi-yahoo-32:before { content: "\f00d"; } .wi-yahoo-33:before { content: "\f083"; } .wi-yahoo-34:before { content: "\f00c"; } .wi-yahoo-35:before { content: "\f017"; } .wi-yahoo-36:before { content: "\f072"; } .wi-yahoo-37:before { content: "\f00e"; } .wi-yahoo-38:before { content: "\f00e"; } .wi-yahoo-39:before { content: "\f00e"; } .wi-yahoo-40:before { content: "\f01a"; } .wi-yahoo-41:before { content: "\f064"; } .wi-yahoo-42:before { content: "\f01b"; } .wi-yahoo-43:before { content: "\f064"; } .wi-yahoo-44:before { content: "\f00c"; } .wi-yahoo-45:before { content: "\f00e"; } .wi-yahoo-46:before { content: "\f01b"; } .wi-yahoo-47:before { content: "\f00e"; } .wi-yahoo-3200:before { content: "\f077"; } .wi-forecast-io-clear-day:before { content: "\f00d"; } .wi-forecast-io-clear-night:before { content: "\f02e"; } .wi-forecast-io-rain:before { content: "\f019"; } .wi-forecast-io-snow:before { content: "\f01b"; } .wi-forecast-io-sleet:before { content: "\f0b5"; } .wi-forecast-io-wind:before { content: "\f050"; } .wi-forecast-io-fog:before { content: "\f014"; } .wi-forecast-io-cloudy:before { content: "\f013"; } .wi-forecast-io-partly-cloudy-day:before { content: "\f002"; } .wi-forecast-io-partly-cloudy-night:before { content: "\f031"; } .wi-forecast-io-hail:before { content: "\f015"; } .wi-forecast-io-thunderstorm:before { content: "\f01e"; } .wi-forecast-io-tornado:before { content: "\f056"; } .wi-wmo4680-0:before, .wi-wmo4680-00:before { content: "\f055"; } .wi-wmo4680-1:before, .wi-wmo4680-01:before { content: "\f013"; } .wi-wmo4680-2:before, .wi-wmo4680-02:before { content: "\f055"; } .wi-wmo4680-3:before, .wi-wmo4680-03:before { content: "\f013"; } .wi-wmo4680-4:before, .wi-wmo4680-04:before { content: "\f014"; } .wi-wmo4680-5:before, .wi-wmo4680-05:before { content: "\f014"; } .wi-wmo4680-10:before { content: "\f014"; } .wi-wmo4680-11:before { content: "\f014"; } .wi-wmo4680-12:before { content: "\f016"; } .wi-wmo4680-18:before { content: "\f050"; } .wi-wmo4680-20:before { content: "\f014"; } .wi-wmo4680-21:before { content: "\f017"; } .wi-wmo4680-22:before { content: "\f017"; } .wi-wmo4680-23:before { content: "\f019"; } .wi-wmo4680-24:before { content: "\f01b"; } .wi-wmo4680-25:before { content: "\f015"; } .wi-wmo4680-26:before { content: "\f01e"; } .wi-wmo4680-27:before { content: "\f063"; } .wi-wmo4680-28:before { content: "\f063"; } .wi-wmo4680-29:before { content: "\f063"; } .wi-wmo4680-30:before { content: "\f014"; } .wi-wmo4680-31:before { content: "\f014"; } .wi-wmo4680-32:before { content: "\f014"; } .wi-wmo4680-33:before { content: "\f014"; } .wi-wmo4680-34:before { content: "\f014"; } .wi-wmo4680-35:before { content: "\f014"; } .wi-wmo4680-40:before { content: "\f017"; } .wi-wmo4680-41:before { content: "\f01c"; } .wi-wmo4680-42:before { content: "\f019"; } .wi-wmo4680-43:before { content: "\f01c"; } .wi-wmo4680-44:before { content: "\f019"; } .wi-wmo4680-45:before { content: "\f015"; } .wi-wmo4680-46:before { content: "\f015"; } .wi-wmo4680-47:before { content: "\f01b"; } .wi-wmo4680-48:before { content: "\f01b"; } .wi-wmo4680-50:before { content: "\f01c"; } .wi-wmo4680-51:before { content: "\f01c"; } .wi-wmo4680-52:before { content: "\f019"; } .wi-wmo4680-53:before { content: "\f019"; } .wi-wmo4680-54:before { content: "\f076"; } .wi-wmo4680-55:before { content: "\f076"; } .wi-wmo4680-56:before { content: "\f076"; } .wi-wmo4680-57:before { content: "\f01c"; } .wi-wmo4680-58:before { content: "\f019"; } .wi-wmo4680-60:before { content: "\f01c"; } .wi-wmo4680-61:before { content: "\f01c"; } .wi-wmo4680-62:before { content: "\f019"; } .wi-wmo4680-63:before { content: "\f019"; } .wi-wmo4680-64:before { content: "\f015"; } .wi-wmo4680-65:before { content: "\f015"; } .wi-wmo4680-66:before { content: "\f015"; } .wi-wmo4680-67:before { content: "\f017"; } .wi-wmo4680-68:before { content: "\f017"; } .wi-wmo4680-70:before { content: "\f01b"; } .wi-wmo4680-71:before { content: "\f01b"; } .wi-wmo4680-72:before { content: "\f01b"; } .wi-wmo4680-73:before { content: "\f01b"; } .wi-wmo4680-74:before { content: "\f076"; } .wi-wmo4680-75:before { content: "\f076"; } .wi-wmo4680-76:before { content: "\f076"; } .wi-wmo4680-77:before { content: "\f01b"; } .wi-wmo4680-78:before { content: "\f076"; } .wi-wmo4680-80:before { content: "\f019"; } .wi-wmo4680-81:before { content: "\f01c"; } .wi-wmo4680-82:before { content: "\f019"; } .wi-wmo4680-83:before { content: "\f019"; } .wi-wmo4680-84:before { content: "\f01d"; } .wi-wmo4680-85:before { content: "\f017"; } .wi-wmo4680-86:before { content: "\f017"; } .wi-wmo4680-87:before { content: "\f017"; } .wi-wmo4680-89:before { content: "\f015"; } .wi-wmo4680-90:before { content: "\f016"; } .wi-wmo4680-91:before { content: "\f01d"; } .wi-wmo4680-92:before { content: "\f01e"; } .wi-wmo4680-93:before { content: "\f01e"; } .wi-wmo4680-94:before { content: "\f016"; } .wi-wmo4680-95:before { content: "\f01e"; } .wi-wmo4680-96:before { content: "\f01e"; } .wi-wmo4680-99:before { content: "\f056"; } .wi-owm-200:before { content: "\f01e"; } .wi-owm-201:before { content: "\f01e"; } .wi-owm-202:before { content: "\f01e"; } .wi-owm-210:before { content: "\f016"; } .wi-owm-211:before { content: "\f016"; } .wi-owm-212:before { content: "\f016"; } .wi-owm-221:before { content: "\f016"; } .wi-owm-230:before { content: "\f01e"; } .wi-owm-231:before { content: "\f01e"; } .wi-owm-232:before { content: "\f01e"; } .wi-owm-300:before { content: "\f01c"; } .wi-owm-301:before { content: "\f01c"; } .wi-owm-302:before { content: "\f019"; } .wi-owm-310:before { content: "\f017"; } .wi-owm-311:before { content: "\f019"; } .wi-owm-312:before { content: "\f019"; } .wi-owm-313:before { content: "\f01a"; } .wi-owm-314:before { content: "\f019"; } .wi-owm-321:before { content: "\f01c"; } .wi-owm-500:before { content: "\f01c"; } .wi-owm-501:before { content: "\f019"; } .wi-owm-502:before { content: "\f019"; } .wi-owm-503:before { content: "\f019"; } .wi-owm-504:before { content: "\f019"; } .wi-owm-511:before { content: "\f017"; } .wi-owm-520:before { content: "\f01a"; } .wi-owm-521:before { content: "\f01a"; } .wi-owm-522:before { content: "\f01a"; } .wi-owm-531:before { content: "\f01d"; } .wi-owm-600:before { content: "\f01b"; } .wi-owm-601:before { content: "\f01b"; } .wi-owm-602:before { content: "\f0b5"; } .wi-owm-611:before { content: "\f017"; } .wi-owm-612:before { content: "\f017"; } .wi-owm-615:before { content: "\f017"; } .wi-owm-616:before { content: "\f017"; } .wi-owm-620:before { content: "\f017"; } .wi-owm-621:before { content: "\f01b"; } .wi-owm-622:before { content: "\f01b"; } .wi-owm-701:before { content: "\f01a"; } .wi-owm-711:before { content: "\f062"; } .wi-owm-721:before { content: "\f0b6"; } .wi-owm-731:before { content: "\f063"; } .wi-owm-741:before { content: "\f014"; } .wi-owm-761:before { content: "\f063"; } .wi-owm-762:before { content: "\f063"; } .wi-owm-771:before { content: "\f011"; } .wi-owm-781:before { content: "\f056"; } .wi-owm-800:before { content: "\f00d"; } .wi-owm-801:before { content: "\f011"; } .wi-owm-802:before { content: "\f011"; } .wi-owm-803:before { content: "\f011"; } .wi-owm-803:before { content: "\f012"; } .wi-owm-804:before { content: "\f013"; } .wi-owm-900:before { content: "\f056"; } .wi-owm-901:before { content: "\f01d"; } .wi-owm-902:before { content: "\f073"; } .wi-owm-903:before { content: "\f076"; } .wi-owm-904:before { content: "\f072"; } .wi-owm-905:before { content: "\f021"; } .wi-owm-906:before { content: "\f015"; } .wi-owm-957:before { content: "\f050"; } .wi-owm-day-200:before { content: "\f010"; } .wi-owm-day-201:before { content: "\f010"; } .wi-owm-day-202:before { content: "\f010"; } .wi-owm-day-210:before { content: "\f005"; } .wi-owm-day-211:before { content: "\f005"; } .wi-owm-day-212:before { content: "\f005"; } .wi-owm-day-221:before { content: "\f005"; } .wi-owm-day-230:before { content: "\f010"; } .wi-owm-day-231:before { content: "\f010"; } .wi-owm-day-232:before { content: "\f010"; } .wi-owm-day-300:before { content: "\f00b"; } .wi-owm-day-301:before { content: "\f00b"; } .wi-owm-day-302:before { content: "\f008"; } .wi-owm-day-310:before { content: "\f008"; } .wi-owm-day-311:before { content: "\f008"; } .wi-owm-day-312:before { content: "\f008"; } .wi-owm-day-313:before { content: "\f008"; } .wi-owm-day-314:before { content: "\f008"; } .wi-owm-day-321:before { content: "\f00b"; } .wi-owm-day-500:before { content: "\f00b"; } .wi-owm-day-501:before { content: "\f008"; } .wi-owm-day-502:before { content: "\f008"; } .wi-owm-day-503:before { content: "\f008"; } .wi-owm-day-504:before { content: "\f008"; } .wi-owm-day-511:before { content: "\f006"; } .wi-owm-day-520:before { content: "\f009"; } .wi-owm-day-521:before { content: "\f009"; } .wi-owm-day-522:before { content: "\f009"; } .wi-owm-day-531:before { content: "\f00e"; } .wi-owm-day-600:before { content: "\f00a"; } .wi-owm-day-601:before { content: "\f0b2"; } .wi-owm-day-602:before { content: "\f00a"; } .wi-owm-day-611:before { content: "\f006"; } .wi-owm-day-612:before { content: "\f006"; } .wi-owm-day-615:before { content: "\f006"; } .wi-owm-day-616:before { content: "\f006"; } .wi-owm-day-620:before { content: "\f006"; } .wi-owm-day-621:before { content: "\f00a"; } .wi-owm-day-622:before { content: "\f00a"; } .wi-owm-day-701:before { content: "\f009"; } .wi-owm-day-711:before { content: "\f062"; } .wi-owm-day-721:before { content: "\f0b6"; } .wi-owm-day-731:before { content: "\f063"; } .wi-owm-day-741:before { content: "\f003"; } .wi-owm-day-761:before { content: "\f063"; } .wi-owm-day-762:before { content: "\f063"; } .wi-owm-day-781:before { content: "\f056"; } .wi-owm-day-800:before { content: "\f00d"; } .wi-owm-day-801:before { content: "\f000"; } .wi-owm-day-802:before { content: "\f000"; } .wi-owm-day-803:before { content: "\f000"; } .wi-owm-day-804:before { content: "\f00c"; } .wi-owm-day-900:before { content: "\f056"; } .wi-owm-day-902:before { content: "\f073"; } .wi-owm-day-903:before { content: "\f076"; } .wi-owm-day-904:before { content: "\f072"; } .wi-owm-day-906:before { content: "\f004"; } .wi-owm-day-957:before { content: "\f050"; } .wi-owm-night-200:before { content: "\f02d"; } .wi-owm-night-201:before { content: "\f02d"; } .wi-owm-night-202:before { content: "\f02d"; } .wi-owm-night-210:before { content: "\f025"; } .wi-owm-night-211:before { content: "\f025"; } .wi-owm-night-212:before { content: "\f025"; } .wi-owm-night-221:before { content: "\f025"; } .wi-owm-night-230:before { content: "\f02d"; } .wi-owm-night-231:before { content: "\f02d"; } .wi-owm-night-232:before { content: "\f02d"; } .wi-owm-night-300:before { content: "\f02b"; } .wi-owm-night-301:before { content: "\f02b"; } .wi-owm-night-302:before { content: "\f028"; } .wi-owm-night-310:before { content: "\f028"; } .wi-owm-night-311:before { content: "\f028"; } .wi-owm-night-312:before { content: "\f028"; } .wi-owm-night-313:before { content: "\f028"; } .wi-owm-night-314:before { content: "\f028"; } .wi-owm-night-321:before { content: "\f02b"; } .wi-owm-night-500:before { content: "\f02b"; } .wi-owm-night-501:before { content: "\f028"; } .wi-owm-night-502:before { content: "\f028"; } .wi-owm-night-503:before { content: "\f028"; } .wi-owm-night-504:before { content: "\f028"; } .wi-owm-night-511:before { content: "\f026"; } .wi-owm-night-520:before { content: "\f029"; } .wi-owm-night-521:before { content: "\f029"; } .wi-owm-night-522:before { content: "\f029"; } .wi-owm-night-531:before { content: "\f02c"; } .wi-owm-night-600:before { content: "\f02a"; } .wi-owm-night-601:before { content: "\f0b4"; } .wi-owm-night-602:before { content: "\f02a"; } .wi-owm-night-611:before { content: "\f026"; } .wi-owm-night-612:before { content: "\f026"; } .wi-owm-night-615:before { content: "\f026"; } .wi-owm-night-616:before { content: "\f026"; } .wi-owm-night-620:before { content: "\f026"; } .wi-owm-night-621:before { content: "\f02a"; } .wi-owm-night-622:before { content: "\f02a"; } .wi-owm-night-701:before { content: "\f029"; } .wi-owm-night-711:before { content: "\f062"; } .wi-owm-night-721:before { content: "\f0b6"; } .wi-owm-night-731:before { content: "\f063"; } .wi-owm-night-741:before { content: "\f04a"; } .wi-owm-night-761:before { content: "\f063"; } .wi-owm-night-762:before { content: "\f063"; } .wi-owm-night-781:before { content: "\f056"; } .wi-owm-night-800:before { content: "\f02e"; } .wi-owm-night-801:before { content: "\f022"; } .wi-owm-night-802:before { content: "\f022"; } .wi-owm-night-803:before { content: "\f022"; } .wi-owm-night-804:before { content: "\f086"; } .wi-owm-night-900:before { content: "\f056"; } .wi-owm-night-902:before { content: "\f073"; } .wi-owm-night-903:before { content: "\f076"; } .wi-owm-night-904:before { content: "\f072"; } .wi-owm-night-906:before { content: "\f024"; } .wi-owm-night-957:before { content: "\f050"; } ================================================ FILE: static/assets/css/pages.css ================================================ /* Template Name: UBold Dashboard Author: CoderThemes Email: coderthemes@gmail.com File: Pages */ /* ============= Calendar ============= */ .calendar { float: left; margin-bottom: 0px; } .fc-view { margin-top: 30px; } .none-border .modal-footer { border-top: none; } .fc-toolbar { margin-bottom: 5px; margin-top: 15px; } .fc-toolbar h2 { font-size: 18px; font-weight: 600; line-height: 30px; text-transform: uppercase; } .fc-day { background: #ffffff; } .fc-toolbar .fc-state-active, .fc-toolbar .ui-state-active, .fc-toolbar button:focus, .fc-toolbar button:hover, .fc-toolbar .ui-state-hover { z-index: 0; } .fc-widget-header { border: 1px solid #ebeff2; } .fc-widget-content { border: 1px solid #ebeff2; } .fc th.fc-widget-header { background: #ebeff2; font-size: 14px; line-height: 20px; padding: 10px 0px; text-transform: uppercase; } .fc-button { background: #ffffff; border: 1px solid #ebeff2; color: #555555; text-transform: capitalize; } .fc-text-arrow { font-family: inherit; font-size: 16px; } .fc-state-hover { background: #F5F5F5; } .fc-state-highlight { background: #f0f0f0; } .fc-cell-overlay { background: #f0f0f0; } .fc-unthemed .fc-today { background: #ffffff; } .fc-event { border-radius: 2px; border: none; cursor: move; font-size: 13px; margin: 5px 7px; padding: 5px 5px; text-align: center; } .external-event { color: #ffffff; cursor: move; margin: 10px 0; padding: 6px 10px; } .fc-basic-view td.fc-week-number span { padding-right: 5px; } .fc-basic-view td.fc-day-number { padding-right: 5px; } /* ============= Form Advanced ============= */ .bootstrap-tagsinput { box-shadow: none; padding: 3px 7px 6px; border: 1px solid #e3e3e3; } .bootstrap-tagsinput .label-info { background-color: #5fbeaa !important; display: inline-block; padding: 5px; } /* Multiple */ .ms-container { background: transparent url('../images/multiple-arrow.png') no-repeat 50% 50%; } .ms-container .ms-list { box-shadow: none; border: 1px solid #e3e3e3; } .ms-container .ms-list.ms-focus { box-shadow: none; border: 1px solid #aaaaaa; } .ms-container .ms-selectable li.ms-elem-selectable { border: none; padding: 5px 10px; } .ms-container .ms-selection li.ms-elem-selection { border: none; padding: 5px 10px; } .select2-container .select2-choice { background-image: none !important; border: none !important; height: auto !important; padding: 0px !important; line-height: 22px !important; background-color: transparent !important; box-shadow: none !important; } .select2-container .select2-choice .select2-arrow { background-image: none !important; background: transparent; border: none; width: 14px; top: -2px; } .select2-container .select2-container-multi.form-control { height: auto; } .select2-results .select2-highlighted { color: #ffffff; background-color: #5fbeaa; } .select2-drop-active { border: 1px solid #e3e3e3 !important; padding-top: 5px; -webkit-box-shadow: 0 2px 2px rgba(0, 0, 0, 0.15); box-shadow: 0 2px 2px rgba(0, 0, 0, 0.15); -moz-box-shadow: 0 2px 2px rgba(0, 0, 0, 0.15); } .select2-search input { border: 1px solid #e3e3e3; } .select2-container-multi { width: 100%; } .select2-container-multi .select2-choices { border: 1px solid #E3E3E3 !important; box-shadow: none !important; background-image: none !important; -webkit-border-radius: 4px !important; border-radius: 4px !important; -moz-border-radius: 4px !important; background-clip: padding-box !important; min-height: 38px; } .select2-container-multi .select2-choices .select2-search-choice { padding: 4px 7px 4px 18px; margin: 5px 0 3px 5px; color: #555555; background: #f5f5f5; border-color: #e5e5e5; -webkit-box-shadow: none; box-shadow: none; } .select2-container-multi .select2-choices .select2-search-field input { padding: 7px 7px 7px 10px; font-family: inherit; } /* Bootstrap-select */ .bootstrap-select:not([class*=col-]):not([class*=form-control]):not(.input-group-btn) { width: 100% !important; } .bootstrap-select .dropdown-toggle:focus { outline: none !important; } .bootstrap-select .glyphicon { padding-right: 6px; } /* Bootstrap filestyle */ .icon-span-filestyle { padding-right: 5px; } /* Bootstrap-touchSpin */ .bootstrap-touchspin .input-group-btn-vertical .btn { padding: 9px 12px; } .bootstrap-touchspin .input-group-btn-vertical i { top: 4px; left: 8px; } /* Wysiwig */ .mce-content-body p { color: #9398a0; font-size: 14px; font-weight: 300; } .mce-popover .mce-arrow:after { border-bottom-color: red; } .mce-popover .mce-colorbutton-grid { margin: 0px; border: 1px solid #d7dce5 !important; padding: 4px; } .mce-reset .mce-window-head { border-bottom: 1px solid #d7dce5; } .mce-reset .mce-window-head .mce-title { color: #707780; font-size: 16px; font-weight: 400; } .mce-reset .mce-textbox { border-radius: 0px; box-shadow: none; outline: 0; border-color: #d7dce5; height: 30px; font-weight: 300; line-height: 30px; color: #aaaaaa; font-size: 14px; } .mce-reset .mce-textbox:focus { box-shadow: none; border-color: #5fbeaa; } .mce-reset .mce-checkbox .mce-ico { background-image: none; background-color: #ffffff; border-radius: 0px; border: 1px solid #d7dce5; } .mce-reset .mce-checkbox .mce-label { color: #707780; font-size: 12px; font-weight: 400; } .mce-container { border-radius: 0px !important; border-width: 0px !important; } .mce-container .mce-menubar { background-color: #f2f4f7 !important; border: 1px solid #d7dce5 !important; padding: 2px; } .mce-container .mce-menubar .mce-btn button span { color: #707780; font-size: 14px; font-weight: 400; text-transform: capitalize; } .mce-container .mce-menubar .mce-btn button .mce-caret { border-top-color: #707780; } .mce-container .mce-menubar .mce-btn button:hover { background-color: #e8ebf1; } .mce-container .mce-menubar .mce-btn.mce-active button { background-color: #e8ebf1; } .mce-container .mce-btn { background-color: #d7dce5; background-image: none; outline: 0; border: 0px; border-radius: 0px; } .mce-container .mce-btn button { color: #ffffff; font-size: 14px; font-weight: 400; text-shadow: none; } .mce-container .mce-btn:hover { background-color: #b8c1d1; background-image: none; } .mce-container .mce-primary { background-color: #5fbeaa; background-image: none; outline: 0; border: 0px; border-radius: 0px; } .mce-container .mce-primary button { color: #ffffff; font-size: 14px; font-weight: 400; text-shadow: none; } .mce-container .mce-primary:hover { background-color: #0c7cd5; background-image: none; } .mce-container .mce-toolbar-grp { background-color: #f2f4f7 !important; border: 1px solid #d7dce5 !important; border-top-width: 0px !important; padding: 6px; } .mce-container .mce-edit-area { border: 1px solid #d7dce5 !important; border-width: 0px 1px !important; } .mce-container .mce-statusbar { background-color: #f2f4f7 !important; border: 1px solid #d7dce5 !important; } .mce-container .mce-statusbar .mce-path .mce-path-item { color: #707780; font-size: 14px; font-weight: 400; } .mce-container .mce-widget { color: #9398a0; font-size: 14px; font-weight: 400; border-left: 1px solid transparent; } .mce-container .mce-btn-group { border: 1px solid #e9ecf2 !important; } .mce-container .mce-btn-group .mce-btn { box-shadow: none; background-image: none; background-color: #ffffff; border-width: 0px; border-radius: 0px !important; } .mce-container .mce-btn-group .mce-btn:hover, .mce-container .mce-btn-group .mce-btn:focus { box-shadow: none; background-image: none; background-color: #ffffff; } .mce-container .mce-btn-group .mce-btn button span { color: #707780; font-size: 14px; font-weight: 300; } .mce-container .mce-btn-group .mce-btn button .mce-caret { color: #707780; font-size: 14px; } .mce-container .mce-ico { color: #707780; font-size: 14px; } .mce-container .mce-panel { background-image: none; } .mce-container.mce-menu { border: 1px solid #d7dce5 !important; } .mce-container.mce-menu .mce-menu-item { background-image: none; } .mce-container.mce-menu .mce-menu-item .mce-ico { color: #5fbeaa; font-size: 14px; } .mce-container.mce-menu .mce-menu-item .mce-text { color: #707780; font-size: 14px; font-weight: 400; text-transform: capitalize; } .mce-container.mce-menu .mce-menu-item .mce-menu-shortcut { color: #aaaaaa; font-size: 12px; font-weight: 300; text-transform: capitalize; } .mce-container.mce-menu .mce-menu-item:hover, .mce-container.mce-menu .mce-menu-item:focus, .mce-container.mce-menu .mce-menu-item.mce-selected { background-color: #5fbeaa; } .mce-container.mce-menu .mce-menu-item:hover .mce-ico, .mce-container.mce-menu .mce-menu-item:focus .mce-ico, .mce-container.mce-menu .mce-menu-item.mce-selected .mce-ico, .mce-container.mce-menu .mce-menu-item:hover .mce-text, .mce-container.mce-menu .mce-menu-item:focus .mce-text, .mce-container.mce-menu .mce-menu-item.mce-selected .mce-text, .mce-container.mce-menu .mce-menu-item:hover .mce-menu-shortcut, .mce-container.mce-menu .mce-menu-item:focus .mce-menu-shortcut, .mce-container.mce-menu .mce-menu-item.mce-selected .mce-menu-shortcut { color: #ffffff; } .mce-container.mce-menu .mce-menu-item.mce-disabled .mce-ico, .mce-container.mce-menu .mce-menu-item.mce-disabled .mce-text, .mce-container.mce-menu .mce-menu-item.mce-disabled .mce-menu-shortcut { color: #aaaaaa; } .mce-container.mce-menu .mce-menu-item.mce-disabled:hover, .mce-container.mce-menu .mce-menu-item.mce-disabled:focus, .mce-container.mce-menu .mce-menu-item.mce-disabled.mce-selected { background-color: #d7dce5; } .mce-container.mce-menu .mce-menu-item.mce-disabled:hover .mce-ico, .mce-container.mce-menu .mce-menu-item.mce-disabled:focus .mce-ico, .mce-container.mce-menu .mce-menu-item.mce-disabled.mce-selected .mce-ico, .mce-container.mce-menu .mce-menu-item.mce-disabled:hover .mce-text, .mce-container.mce-menu .mce-menu-item.mce-disabled:focus .mce-text, .mce-container.mce-menu .mce-menu-item.mce-disabled.mce-selected .mce-text, .mce-container.mce-menu .mce-menu-item.mce-disabled:hover .mce-menu-shortcut, .mce-container.mce-menu .mce-menu-item.mce-disabled:focus .mce-menu-shortcut, .mce-container.mce-menu .mce-menu-item.mce-disabled.mce-selected .mce-menu-shortcut { color: #ffffff; } .mce-container.mce-menu .mce-menu-item-sep { background-color: #d7dce5; } .mce-container.mce-menu .mce-menu-item-sep:hover { background-color: #d7dce5; } .mce-menubtn button { color: #36404a !important; } .mce-menu-item-normal.mce-active { background-color: #5fbeaa !important; } .mce-menu-item-normal.mce-active .mce-text { color: #ffffff !important; } /* ============= Notification ============= */ .notifyjs-metro-base { position: relative; min-height: 52px; min-width: 250px; color: #444; border-radius: 3px; -webkit-border-radius: 3px; box-shadow: 0px 1px 0px rgba(0, 0, 0, 0.2); -webkit-animation: dropdownOpen 0.3s ease-out; -o-animation: dropdownOpen 0.3s ease-out; animation: dropdownOpen 0.3s ease-out; } .notifyjs-metro-base .image { display: table; position: absolute; height: auto; width: auto; left: 25px; top: 50%; font-size: 24px; -moz-transform: translate(-50%, -50%); -ms-transform: translate(-50%, -50%); -o-transform: translate(-50%, -50%); -webkit-transform: translate(-50%, -50%); transform: translate(-50%, -50%); } .notifyjs-metro-base .text-wrapper { display: inline-block; vertical-align: top; text-align: left; margin: 10px 10px 10px 52px; clear: both; } .notifyjs-metro-base .title { font-size: 15px; line-height: 20px; margin-bottom: 5px; font-weight: bold; } .notifyjs-metro-base .text { font-size: 12px; font-weight: normal; max-width: 360px; vertical-align: middle; } .notifyjs-metro-cool { color: #fafafa !important; background-color: #4A525F; border: 1px solid #4A525F; } /* ============= Bootstrap Range slider ============= */ .slider .slider-horizontal { margin: 10px 0; } .slider .slider-vertical { margin: 0 10px; } .slider-handle.round { position: absolute; width: 20px; height: 20px; border: 1px solid #EFF2F7; background: #fff; cursor: pointer; } .slider-default .slider-selection { background-image: none; background-color: #909aa0; } .slider-primary .slider-selection { background-image: none; background-color: #5d9cec; } .slider-success .slider-selection { background-image: none; background-color: #81c868; } .slider-info .slider-selection { background-image: none; background-color: #34d3eb; } .slider-warning .slider-selection { background-image: none; background-color: #ffbd4a; } .slider-danger .slider-selection { background-image: none; background-color: #f05050; } .slider-custom .slider-selection { background-image: none; background-color: #5fbeaa; } .slider-pink .slider-selection { background-image: none; background-color: #fb6d9d; } .slider-purple .slider-selection { background-image: none; background-color: #7266ba; } .slider-inverse .slider-selection { background-image: none; background-color: #4c5667; } /* ============= Charts ============= */ .morris-hover.morris-default-style { border-radius: 5px; padding: 10px 12px; color: #666; background: #36404a; border: none; color: #ffffff !important; } .morris-hover.morris-default-style .morris-hover-point { color: #f4f8fb !important; } .chart-detail-list li { margin: 0px 10px; } .chart-detail-list li h5 { font-size: 15px; } .pieLabel div { font-size: 14px !important; } .jqstooltip { -webkit-box-sizing: content-box; -moz-box-sizing: content-box; box-sizing: content-box; } .chart { position: relative; display: inline-block; width: 110px; height: 110px; margin-top: 20px; margin-bottom: 20px; text-align: center; } .chart canvas { position: absolute; top: 0; left: 0; } .chart.chart-widget-pie { margin-top: 5px; margin-bottom: 5px; } .percent { display: inline-block; line-height: 110px; z-index: 2; font-weight: 600; font-size: 18px; color: #36404a; } .percent:after { content: '%'; margin-left: 0.1em; font-size: .8em; } #flotTip { padding: 8px 12px; background-color: #36404a; z-index: 100; color: #ffffff; opacity: 0.9; font-size: 13px; -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; } .legend tr { height: 20px; } .legendLabel { padding-left: 5px !important; line-height: 10px; padding-right: 10px; } /* C3 chart */ .c3-tooltip td > span { background: #36404a; } .c3-tooltip td { border-left: none; } .c3-tooltip { -webkit-box-shadow: 0px 0px 8px 0px #777777; box-shadow: 0px 0px 8px 0px #777777; -moz-box-shadow: 0px 0px 8px 0px #777777; opacity: 1; } .c3-chart-arcs-title { font-size: 18px; font-weight: 600; } .c3-tooltip tr { border: none !important; } .c3-tooltip th { background-color: #36404a; } /* Chartist chart */ .ct-golden-section:before { float: none; } .ct-chart { height: 300px; } .ct-chart .ct-label { fill: #a3afb7; color: #a3afb7; font-size: 12px; line-height: 1; } .ct-chart.simple-pie-chart-chartist .ct-label { color: #ffffff; fill: #ffffff; font-size: 16px; } .ct-chart .ct-series.ct-series-a .ct-bar, .ct-chart .ct-series.ct-series-a .ct-line, .ct-chart .ct-series.ct-series-a .ct-point, .ct-chart .ct-series.ct-series-a .ct-slice-donut { stroke: #5d9cec; } .ct-chart .ct-series.ct-series-b .ct-bar, .ct-chart .ct-series.ct-series-b .ct-line, .ct-chart .ct-series.ct-series-b .ct-point, .ct-chart .ct-series.ct-series-b .ct-slice-donut { stroke: #fb6d9d; } .ct-chart .ct-series.ct-series-c .ct-bar, .ct-chart .ct-series.ct-series-c .ct-line, .ct-chart .ct-series.ct-series-c .ct-point, .ct-chart .ct-series.ct-series-c .ct-slice-donut { stroke: #34d3eb; } .ct-chart .ct-series.ct-series-d .ct-bar, .ct-chart .ct-series.ct-series-d .ct-line, .ct-chart .ct-series.ct-series-d .ct-point, .ct-chart .ct-series.ct-series-d .ct-slice-donut { stroke: #5fbeaa; } .ct-chart .ct-series.ct-series-e .ct-bar, .ct-chart .ct-series.ct-series-e .ct-line, .ct-chart .ct-series.ct-series-e .ct-point, .ct-chart .ct-series.ct-series-e .ct-slice-donut { stroke: #36404a; } .ct-chart .ct-series.ct-series-f .ct-bar, .ct-chart .ct-series.ct-series-f .ct-line, .ct-chart .ct-series.ct-series-f .ct-point, .ct-chart .ct-series.ct-series-f .ct-slice-donut { stroke: #7266ba; } .ct-chart .ct-series.ct-series-g .ct-bar, .ct-chart .ct-series.ct-series-g .ct-line, .ct-chart .ct-series.ct-series-g .ct-point, .ct-chart .ct-series.ct-series-g .ct-slice-donut { stroke: #81c868; } .ct-series-a .ct-area, .ct-series-a .ct-slice-pie { fill: #5d9cec; } .ct-series-b .ct-area, .ct-series-b .ct-slice-pie { fill: #fb6d9d; } .ct-series-c .ct-area, .ct-series-c .ct-slice-pie { fill: #34d3eb; } .ct-series-d .ct-area, .ct-series-d .ct-slice-pie { fill: #5fbeaa; } /* Circliful charts */ .circliful-chart { margin: 0px auto; } .circle-text, .circle-info, .circle-text-half, .circle-info-half { font-size: 12px; font-weight: 600; } /* ============= Count Down ============= */ .home-wrapper { margin: 10% 0px; } .home-text { font-weight: 600; } .u-countdown { margin-top: 40px; text-align: center; } .u-countdown div { display: inline-block; } .u-countdown div span { display: block; width: 150px; } .u-countdown div span:first-child { font-size: 3em; font-weight: 700; height: 48px; line-height: 48px; } .u-countdown div span:last-child { color: #333333; font-size: 0.9em; height: 25px; line-height: 25px; } .u-countdown > * { text-align: center; } .cd-text { font-size: 15px; line-height: 24px; font-style: italic; } /* ============= Timeline ============= */ .cd-container { width: 90%; max-width: 1170px; margin: 0 auto; } .cd-container::after { content: ''; display: table; clear: both; } #cd-timeline { margin-bottom: 2em; margin-top: 2em; padding: 2em 0; position: relative; } #cd-timeline::before { background: #ffffff; content: ''; height: 100%; left: 18px; position: absolute; top: 0; width: 4px; } @media only screen and (min-width: 1170px) { #cd-timeline { margin-bottom: 3em; margin-top: 3em; } #cd-timeline::before { left: 50%; margin-left: -2px; } } .cd-timeline-block { margin: 2em 0; position: relative; } .cd-timeline-block:after { clear: both; content: ""; display: table; } .cd-timeline-block:first-child { margin-top: 0; } .cd-timeline-block:last-child { margin-bottom: 0; } @media only screen and (min-width: 1170px) { .cd-timeline-block { margin: 4em 0; } .cd-timeline-block:first-child { margin-top: 0; } .cd-timeline-block:last-child { margin-bottom: 0; } } .cd-timeline-img { position: absolute; top: 0; left: 0; width: 40px; height: 40px; border-radius: 50%; box-shadow: 0 0 0 4px white, inset 0 2px 0 rgba(0, 0, 0, 0.08), 0 3px 0 4px rgba(0, 0, 0, 0.05); text-align: center; line-height: 40px; font-size: 20px; color: #fff; } .cd-timeline-img.cd-success { background: #81c868; } .cd-timeline-img.cd-info { background: #34d3eb; } .cd-timeline-img.cd-pink { background: #fb6d9d; } .cd-timeline-img.cd-danger { background: #f05050; } .cd-timeline-img.cd-primary { background: #5d9cec; } .cd-timeline-img.cd-warning { background: #ffbd4a; } @media only screen and (min-width: 1170px) { .cd-timeline-img { width: 60px; height: 60px; line-height: 60px; left: 50%; margin-left: -30px; -webkit-transform: translateZ(0); -webkit-backface-visibility: hidden; } .cssanimations .cd-timeline-img.is-hidden { visibility: hidden; } .cssanimations .cd-timeline-img.bounce-in { visibility: visible; -webkit-animation: cd-bounce-1 0.6s; -moz-animation: cd-bounce-1 0.6s; animation: cd-bounce-1 0.6s; } } .cd-timeline-content { -moz-box-shadow: 0 5px 5px -5px rgba(0, 0, 0, 0.1); -webkit-box-shadow: 0 5px 5px -5px rgba(0, 0, 0, 0.1); background: white; border-radius: 0; box-shadow: 0 5px 5px -5px rgba(0, 0, 0, 0.1); margin-left: 60px; padding: 1em; position: relative; } .cd-timeline-content img { display: block; width: 100%; } .cd-timeline-content:after { clear: both; content: ""; display: table; } .cd-timeline-content h2 { margin-top: 0; } .cd-timeline-content p { color: #666666; font-size: 14px; margin: 10px 0px 10px 0px; } .cd-timeline-content .cd-read-more { background: #acb7c0; border-radius: 0.25em; color: white; display: inline-block; float: right; font-size: 14px; padding: .8em 1em; } .cd-timeline-content .cd-date { display: inline-block; font-size: 14px; } .cd-timeline-content h3 { font-size: 21px; margin: 0px; } .no-touch .cd-timeline-content .cd-read-more:hover { background-color: #bac4cb; } .cd-timeline-content .cd-date { float: left; padding: .8em 0; opacity: .7; } .cd-timeline-content::before { content: ''; position: absolute; top: 16px; right: 100%; height: 0; width: 0; border: 7px solid transparent; border-right: 7px solid white; } @media only screen and (min-width: 1170px) { .cd-timeline-content { margin-left: 0; padding: 1.6em; width: 45%; } .cd-timeline-content::before { top: 24px; left: 100%; border-color: transparent; border-left-color: white; } .cd-timeline-content .cd-read-more { float: left; } .cd-timeline-content .cd-date { position: absolute; width: 100%; left: 122%; top: 6px; } .cd-timeline-block:nth-child(even) .cd-timeline-content { float: right; } .cd-timeline-block:nth-child(even) .cd-timeline-content::before { top: 24px; left: auto; right: 100%; border-color: transparent; border-right-color: white; } .cd-timeline-block:nth-child(even) .cd-timeline-content .cd-read-more { float: right; } .cd-timeline-block:nth-child(even) .cd-timeline-content .cd-date { left: auto; right: 122%; text-align: right; } .cssanimations .cd-timeline-content.is-hidden { visibility: hidden; } .cssanimations .cd-timeline-content.bounce-in { visibility: visible; -webkit-animation: cd-bounce-2 0.6s; -moz-animation: cd-bounce-2 0.6s; animation: cd-bounce-2 0.6s; } } @media only screen and (min-width: 1170px) { .cssanimations .cd-timeline-block:nth-child(even) .cd-timeline-content.bounce-in { -webkit-animation: cd-bounce-2-inverse 0.6s; -moz-animation: cd-bounce-2-inverse 0.6s; animation: cd-bounce-2-inverse 0.6s; } } /* Time line 2 */ .timeline-2 { border-left: 2px solid #98a6ad; position: relative; } .timeline-2 .time-item:after { background-color: #ffffff; border-color: #98a6ad; border-radius: 10px; border-style: solid; border-width: 2px; bottom: 0; content: ''; height: 14px; left: 0; margin-left: -8px; position: absolute; top: 5px; width: 14px; } .time-item { border-color: #dee5e7; padding-bottom: 1px; position: relative; } .time-item:before { content: " "; display: table; } .time-item:after { background-color: #ffffff; border-color: #98a6ad; border-radius: 10px; border-style: solid; border-width: 2px; bottom: 0; content: ''; height: 14px; left: 0; margin-left: -8px; position: absolute; top: 5px; width: 14px; } .time-item-item:after { content: " "; display: table; } .item-info { margin-bottom: 15px; margin-left: 15px; } .item-info p { margin-bottom: 10px !important; } /* ============= Email ============= */ .mails a { color: #797979; } .mails td { vertical-align: middle !important; position: relative; } .mails td:last-of-type { width: 100px; padding-right: 20px; } .mails tr:hover .text-white { display: none; } .mails .mail-select { padding: 12px 20px; min-width: 134px; } .mails .checkbox { margin-bottom: 0px; margin-top: 0px; vertical-align: middle; display: inline-block; height: 17px; } .mails .checkbox label { min-height: 16px; } .mail-list .list-group-item { background-color: transparent; } .mail-list .list-group-item:hover { background-color: #f4f8fb; } .mail-list .list-group-item:focus { background-color: #f4f8fb; } .mail-list .list-group-item.active { background-color: #5fbeaa; -webkit-border-radius: 3px; border-radius: 3px; -moz-border-radius: 3px; background-clip: padding-box; } .unread a { font-weight: 600; color: #444444; } /* ============= Gallery ============= */ .portfolioFilter a { -moz-box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.1); -moz-transition: all 0.3s ease-out; -ms-transition: all 0.3s ease-out; -o-transition: all 0.3s ease-out; transition: all 0.3s ease-out; -webkit-box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.1); -webkit-transition: all 0.3s ease-out; box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.1); color: #333333; padding: 5px 10px; display: inline-block; margin-bottom: 5px; } .portfolioFilter a:hover { background-color: #5d9cec; color: #ffffff; } .portfolioFilter a.current { background-color: #5d9cec; color: #ffffff; } .thumb { background-color: #ffffff; border-radius: 3px; box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1); margin-top: 30px; padding-bottom: 10px; padding-left: 10px; padding-right: 10px; padding-top: 10px; width: 100%; } .thumb-img { border-radius: 2px; overflow: hidden; width: 100%; } .gal-detail h4 { margin-top: 16px; } /* ============= Maintenance ============= */ .icon-main { font-size: 88px; margin-bottom: 50px; } .maintenance-page { margin: 10% 0%; } /* ============= Maps ============= */ .gmaps, .gmaps-panaroma { height: 300px; background: #eeeeee; border-radius: 3px; } .gmaps-overlay { display: block; text-align: center; color: #ffffff; font-size: 16px; line-height: 40px; background: #5d9cec; border-radius: 4px; padding: 10px 20px; } .gmaps-overlay_arrow { left: 50%; margin-left: -16px; width: 0; height: 0; position: absolute; } .gmaps-overlay_arrow.above { bottom: -15px; border-left: 16px solid transparent; border-right: 16px solid transparent; border-top: 16px solid #5d9cec; } .gmaps-overlay_arrow.below { top: -15px; border-left: 16px solid transparent; border-right: 16px solid transparent; border-bottom: 16px solid #5d9cec; } .jvectormap-zoomin, .jvectormap-zoomout { width: 10px; height: 10px; line-height: 10px; } .jvectormap-zoomout { top: 40px; } /* ============= Nestable ============= */ .custom-dd .dd-list .dd-item .dd-handle { background: #f4f8fb; border: none; padding: 8px 16px; height: auto; font-weight: 600; -webkit-border-radius: 3px; border-radius: 3px; -moz-border-radius: 3px; background-clip: padding-box; } .custom-dd .dd-list .dd-item .dd-handle:hover { color: #5fbeaa; } .custom-dd .dd-list .dd-item button { height: auto; font-size: 17px; margin: 8px auto; color: #555555; width: 30px; } .custom-dd-empty .dd-list .dd3-handle { border: none; background: #f4f8fb; height: 36px; width: 36px; } .custom-dd-empty .dd-list .dd3-handle:before { color: inherit; top: 7px; } .custom-dd-empty .dd-list .dd3-handle:hover { color: #5fbeaa; } .custom-dd-empty .dd-list .dd3-content { height: auto; border: none; padding: 8px 16px 8px 46px; background: #f4f8fb; font-weight: 600; } .custom-dd-empty .dd-list .dd3-content:hover { color: #5fbeaa; } .custom-dd-empty .dd-list button { width: 26px; height: 26px; font-size: 16px; font-weight: 600; } /* ============= Pricing ============= */ .pricing-plan { padding-bottom: 50px; } .price_card { -moz-border-radius: 5px; -moz-box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.1); -webkit-border-radius: 5px; background: #fafafa; border-radius: 5px; box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.1); margin-bottom: 30px; padding-bottom: 20px; position: relative; webkit-box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.1); } .price_card .name { display: block; font-size: 16px; font-weight: 700; padding: 0 0 30px; text-align: center; width: 100%; } .price_card button { margin-top: 20px; } .pricing-header { -moz-border-radius-topleft: 5px; -moz-border-radius-topright: 5px; -webkit-border-top-left-radius: 5px; -webkit-border-top-right-radius: 5px; border-top-left-radius: 5px; border-top-right-radius: 5px; color: #ffffff; } .price { display: block; font-size: 48px; font-weight: 300; padding: 30px 0 10px; text-align: center; width: 100%; } .price-features { color: #8a8a8a; list-style: none; margin: 0; padding: 0; text-align: center; } .price-features li { margin: 0 35px; padding: 20px 15px; } .pricing-item { margin: 0 0 30px; position: relative; text-align: center; } .pricing-item-inner { -moz-transition: all 0.27s cubic-bezier(0, 0, 0.58, 1); -ms-transition: all 0.27s cubic-bezier(0, 0, 0.58, 1); -o-transition: all 0.27s cubic-bezier(0, 0, 0.58, 1); -webkit-transition: all 0.27s cubic-bezier(0, 0, 0.58, 1); border-radius: 7px; border: 2px solid rgba(151, 160, 175, 0.2); transition: all 0.27s cubic-bezier(0, 0, 0.58, 1); vertical-align: middle; } .pricing-wrap { -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; overflow: hidden; padding: 30px 20px; position: relative; text-align: center; } .pricing-icon { font-size: 32px; padding-bottom: 5px; padding-top: 10px; position: relative; z-index: 1; } .pricing-title { font-size: 16px; font-weight: 700; margin-bottom: 40px; position: relative; text-transform: uppercase; z-index: 1; } .pr-list { color: #97a0af; font-size: 12px; font-weight: 400; margin: 0 -20px 30px; padding: 0; text-transform: uppercase; } .pr-list li { list-style: none; padding: 12px 20px; } .pricing-num { font-size: 40px; font-weight: 700; line-height: 1; } .pricing-num sup { font-size: 18px; font-weight: 400; left: -3px; margin-left: -7px; position: relative; top: -20px; } .pr-per { color: #97a0af; font-size: 12px; } .pr-button { margin-top: 30px; } /* ============= Profile ============= */ .bg-picture { margin: -20px -25px 0px -25px; padding: 100px 0px; position: relative; -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); } .profile-info-name { position: relative; } .profile-tablist li a { display: block; color: #36404a; padding: 10px 20px; font-weight: 600; text-transform: uppercase; } .profile-tablist li.active { background-color: #5fbeaa; } .profile-tablist li.active a { color: #ffffff; } .profile-tab-content { background-color: transparent !important; box-shadow: none !important; margin-top: 40px; } .user-tabs { background-color: #ffffff; box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); margin-left: -35px; padding-left: 25px; } .user-tabs .nav.nav-tabs { box-shadow: none !important; } .user-tabs .nav.nav-tabs a { text-transform: uppercase; } .user-tabs .pull-right .btn { margin-top: 8px; } .about-info-p { margin-bottom: 20px; } .about-info-p p { font-size: 16px; } /* ============= Extra pages ============= */ /* sitemap-wrapper */ .sitemap-wrapper a { color: #555555; } .sitemap-wrapper a:hover { color: #5fbeaa; } .sitemap-wrapper h5 { font-weight: 600; font-size: 16px; line-height: 32px; } .sitemap-wrapper h5 i { padding-right: 10px; } .sitemap-wrapper ul { padding-left: 30px; } .sitemap-wrapper ul li a { font-size: 15px; line-height: 30px; } /*======= FAQ ======*/ .faq-box { padding: 24px 0px; border-bottom: 1px solid #ebeff2; } .faq-box .question { font-weight: 600; font-size: 16px; margin-top: 0px; } .faq-box .answer { color: #98a6ad; margin-bottom: 0px; } /* Search result */ .search-result-box .tab-content { padding: 30px 30px 10px 30px; -webkit-box-shadow: none; box-shadow: none; -moz-box-shadow: none; } .search-result-box .search-item { padding-bottom: 20px; border-bottom: 1px solid #ebeff2; margin-bottom: 30px; } /* Contact */ .contact-search .btn-white { position: absolute; top: 1px; right: 16px; background-color: transparent !important; border: none !important; font-size: 16px; box-shadow: none !important; outline: none !important; color: #98a6ad; } .contact-card { position: relative; } .contact-card:hover .contact-action { display: block; } .contact-card img { width: 80px; height: 80px; } .contact-card .member-info { padding-left: 100px; padding-bottom: 20px; } .contact-card .member-info h4, .contact-card .member-info p { display: block; overflow: hidden; text-overflow: ellipsis; width: 100%; white-space: nowrap; } .contact-card .contact-action { position: absolute; right: 0px; top: 0px; display: none; } /* Image crop */ #showDataURL img { width: 100%; } /* Switchery demo */ .switchery-demo .switchery { margin-bottom: 10px; } /* Chat app */ .chat-app-list { padding: 0px 20px; } .chat-app-list .list-group-item { background: transparent; } .chat-ready .conversation-list { max-height: 800px; } .chat-ready .spinner { width: 70px; text-align: center; } .chat-ready .spinner > div { width: 10px; height: 10px; background-color: #E3E3E3; border-radius: 100%; display: inline-block; -webkit-animation: sk-bouncedelay 1.4s infinite ease-in-out both; animation: sk-bouncedelay 1.4s infinite ease-in-out both; } .chat-ready .spinner .bounce1 { -webkit-animation-delay: -0.32s; animation-delay: -0.32s; } .chat-ready .spinner .bounce2 { -webkit-animation-delay: -0.16s; animation-delay: -0.16s; } @-webkit-keyframes sk-bouncedelay { 0%, 80%, 100% { -webkit-transform: scale(0); } 40% { -webkit-transform: scale(1); } } @keyframes sk-bouncedelay { 0%, 80%, 100% { -webkit-transform: scale(0); transform: scale(0); } 40% { -webkit-transform: scale(1); transform: scale(1); } } /* Opportunities page */ .opport-box .checkbx-detail { width: 30px; } .opport-box .lable-detail { text-align: center; width: 20%; } .opport-box .member-info { padding-right: 10px; } .opport-box .member-info h4 { font-size: 16px; display: block; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .opport-box .member-info p { font-size: 13px; display: block; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } /* Product page */ .product-list-box { position: relative; } .product-list-box img { max-width: 220px; height: auto; margin: 0 auto; display: block; } .product-list-box .product-action { position: absolute; right: 10px; top: 10px; display: none; } .product-list-box .detail { background: #f4f8fb; padding: 20px; margin: 0px -10px -10px; } .product-list-box .detail h4 a { white-space: nowrap; display: block; overflow: hidden; text-overflow: ellipsis; font-size: 16px; font-weight: 600; } .product-list-box .detail .rating ul { margin-left: 0px; } .product-list-box .detail .rating ul li { padding: 0px; } .product-list-box .detail .rating ul li a { color: #ffbd4a; font-size: 15px; margin-bottom: 0; padding-right: 4px; } .product-list-box:hover .product-action { display: block; } /* ============= Accounts pages ============= */ .account-pages { background: url("../images/agsquare.png"); position: absolute; height: 100%; width: 100%; } .wrapper-page { margin: 5% auto; position: relative; width: 420px; } .wrapper-page .card-box { border: 1px solid rgba(54, 64, 74, 0.1); } .panel-pages { border-radius: 6px; } .panel-pages .panel-body { padding: 30px; } .panel-pages .panel-heading { -moz-border-radius: 6px 6px 0px 0px; -webkit-border-radius: 6px 6px 0px 0px; border-radius: 6px 6px 0px 0px; padding: 40px 20px; position: relative; } .panel-pages .panel-heading h3 { position: relative; z-index: 999; } .user-thumb { position: relative; z-index: 999; } .user-thumb img { height: 88px; margin: 0px auto; width: 88px; } .ex-page-content .text-error { color: #252932; font-size: 98px; font-weight: 700; line-height: 150px; } .ex-page-content .text-error i { font-size: 78px; padding: 0px 10px; } /* signup-signin-page */ .signup-signin-page { width: auto; } ================================================ FILE: static/assets/css/responsive.css ================================================ /* Template Name: Ubold Dashboard Author: CoderThemes Email: coderthemes@gmail.com File: Responsive */ @media only screen and (max-width: 6000px) and (min-width: 700px) { .wrapper.right-bar-enabled .right-bar { right: 0; z-index: 99; } } @media (min-width: 768px) and (max-width: 1024px) { .email-msg { display: none; } } @media (min-width: 768px) and (max-width: 991px) { body { overflow-x: hidden; } } @media (max-width: 767px) { body { overflow-x: hidden; } .mobile-sidebar { left: 0px; } .mobile-content { left: 250px; right: -250px; } .wrapper-page { width: 90%; } .wizard > .steps > ul > li { width: 100%; } .wizard > .content { padding: 0px !important; } .wizard > .content > .body { float: none; position: relative; width: 100%; height: 100%; padding: 0%; } .wizard.vertical > .steps { display: inline; float: none; width: 100%; } .wizard.vertical > .content { display: inline; float: none; margin: 0%; width: 100%; } .navbar-nav .open .dropdown-menu { background-color: #ffffff; box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.26); left: auto; position: absolute; right: 0; } .todo-send { margin-top: 10px; padding-left: 15px; } .chat-inputbar { padding-left: 15px; } .chat-send { margin-top: 10px; padding-left: 15px; padding-right: 15px; } .dataTables_wrapper .col-xs-6 { width: 100%; text-align: left; } } @media (max-width: 480px) { .side-menu { z-index: 10 !important; } .button-menu-mobile { display: block; } .search-bar { display: none !important; } } @media (max-width: 420px) { .hide-phone { display: none !important; } } /* Container-alt */ @media (min-width: 768px) { .container-alt { width: 750px; } } @media (min-width: 992px) { .container-alt { width: 970px; } } @media (min-width: 1200px) { .container-alt { width: 1170px; } } @media (max-width: 419px) { .topbar-left { width: 70px !important; } .logo .icon-c-logo { display: inline-block !important; } .logo span { display: none !important; } } ================================================ FILE: static/assets/css/statusecho.css ================================================ .state_color_510 { background-color: #90EE90; border-radius: 4px; color: #ffffff; display: inline-block; font-size: 12px; font-weight: normal; line-height: 18px; text-align: center; width: 50px; } .state_color_510:first-child { } .state_color_600 { background-color: #f89406; border-radius: 4px; color: #ffffff; display: inline-block; font-size: 14px; font-weight: normal; line-height: 23px; text-align: center; width: 50px; } .state_color_600:first-child { } .state_color_610 { background-color: #bd362f; border-radius: 4px; color: #ffffff; display: inline-block; font-size: 12px; font-weight: normal; line-height: 18px; text-align: center; width: 50px; } .state_color_710 { color: #bd362f; font-size: 15px; font-weight: normal; line-height: 11px; text-align: center; } .state_710 { text-align: center; } ================================================ FILE: static/assets/css/style.css ================================================ body { font-family: helvetica, sans-serif, arial; font-size: 1em; color: #111; } h1 { text-align: center; } #terminal-container { width: 1024px; height: 900px; margin: 0 auto; padding: 2px; } #terminal-container .terminal { background-color: #111; color: #fafafa; padding: 2px; } #terminal-container .terminal:focus .terminal-cursor { background-color: #fafafa; } ================================================ FILE: static/assets/css/variables.css ================================================ ================================================ FILE: static/assets/css/xterm.css ================================================ /** * xterm.js: xterm, in the browser * Copyright (c) 2014-2016, SourceLair Private Company (www.sourcelair.com (MIT License) * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License) * https://github.com/chjj/term.js * * 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: * * 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. * * Originally forked from (with the author's permission): * Fabrice Bellard's javascript vt100 for jslinux: * http://bellard.org/jslinux/ * Copyright (c) 2011 Fabrice Bellard * The original design remains. The terminal itself * has been extended to include xterm CSI codes, among * other features. */ /* * Default style for xterm.js */ .terminal { background-color: #000; color: #fff; font-family: courier-new, courier, monospace; font-feature-settings: "liga" 0; position: relative; } .terminal.focus, .terminal:focus { outline: none; } .terminal .xterm-helpers { position: absolute; top: 0; } .terminal .xterm-helper-textarea { /* * HACK: to fix IE's blinking cursor * Move textarea out of the screen to the far left, so that the cursor is not visible. */ position: absolute; opacity: 0; left: -9999em; top: -9999em; width: 0; height: 0; z-index: -10; /** Prevent wrapping so the IME appears against the textarea at the correct position */ white-space: nowrap; overflow: hidden; resize: none; } .terminal .terminal-cursor { background-color: #fff; color: #000; } .terminal:not(.focus) .terminal-cursor { outline: 1px solid #fff; outline-offset: -1px; background-color: transparent; } .terminal.focus .terminal-cursor.blinking { animation: blink-cursor 1.2s infinite step-end; } @keyframes blink-cursor { 0% { background-color: #fff; color: #000; } 50% { background-color: transparent; color: #FFF; } } .terminal .composition-view { background: #000; color: #FFF; display: none; position: absolute; white-space: nowrap; z-index: 1; } .terminal .composition-view.active { display: block; } .terminal .xterm-viewport { /* On OS X this is required in order for the scroll bar to appear fully opaque */ background-color: #000; overflow-y: scroll; } .terminal .xterm-rows { position: absolute; left: 0; top: 0; } .terminal .xterm-rows > div { /* Lines containing spans and text nodes ocassionally wrap despite being the same width (#327) */ white-space: nowrap; } .terminal .xterm-scroll-area { visibility: hidden; } .terminal .xterm-char-measure-element { display: inline-block; visibility: hidden; position: absolute; left: -9999em; } /* * Determine default colors for xterm.js */ .terminal .xterm-bold { font-weight: bold; } .terminal .xterm-underline { text-decoration: underline; } .terminal .xterm-blink { text-decoration: blink; } .terminal .xterm-hidden { visibility: hidden; } .terminal .xterm-color-0 { color: #2e3436; } .terminal .xterm-bg-color-0 { background-color: #2e3436; } .terminal .xterm-color-1 { color: #cc0000; } .terminal .xterm-bg-color-1 { background-color: #cc0000; } .terminal .xterm-color-2 { color: #4e9a06; } .terminal .xterm-bg-color-2 { background-color: #4e9a06; } .terminal .xterm-color-3 { color: #c4a000; } .terminal .xterm-bg-color-3 { background-color: #c4a000; } .terminal .xterm-color-4 { color: #3465a4; } .terminal .xterm-bg-color-4 { background-color: #3465a4; } .terminal .xterm-color-5 { color: #75507b; } .terminal .xterm-bg-color-5 { background-color: #75507b; } .terminal .xterm-color-6 { color: #06989a; } .terminal .xterm-bg-color-6 { background-color: #06989a; } .terminal .xterm-color-7 { color: #d3d7cf; } .terminal .xterm-bg-color-7 { background-color: #d3d7cf; } .terminal .xterm-color-8 { color: #555753; } .terminal .xterm-bg-color-8 { background-color: #555753; } .terminal .xterm-color-9 { color: #ef2929; } .terminal .xterm-bg-color-9 { background-color: #ef2929; } .terminal .xterm-color-10 { color: #8ae234; } .terminal .xterm-bg-color-10 { background-color: #8ae234; } .terminal .xterm-color-11 { color: #fce94f; } .terminal .xterm-bg-color-11 { background-color: #fce94f; } .terminal .xterm-color-12 { color: #729fcf; } .terminal .xterm-bg-color-12 { background-color: #729fcf; } .terminal .xterm-color-13 { color: #ad7fa8; } .terminal .xterm-bg-color-13 { background-color: #ad7fa8; } .terminal .xterm-color-14 { color: #34e2e2; } .terminal .xterm-bg-color-14 { background-color: #34e2e2; } .terminal .xterm-color-15 { color: #eeeeec; } .terminal .xterm-bg-color-15 { background-color: #eeeeec; } .terminal .xterm-color-16 { color: #000000; } .terminal .xterm-bg-color-16 { background-color: #000000; } .terminal .xterm-color-17 { color: #00005f; } .terminal .xterm-bg-color-17 { background-color: #00005f; } .terminal .xterm-color-18 { color: #000087; } .terminal .xterm-bg-color-18 { background-color: #000087; } .terminal .xterm-color-19 { color: #0000af; } .terminal .xterm-bg-color-19 { background-color: #0000af; } .terminal .xterm-color-20 { color: #0000d7; } .terminal .xterm-bg-color-20 { background-color: #0000d7; } .terminal .xterm-color-21 { color: #0000ff; } .terminal .xterm-bg-color-21 { background-color: #0000ff; } .terminal .xterm-color-22 { color: #005f00; } .terminal .xterm-bg-color-22 { background-color: #005f00; } .terminal .xterm-color-23 { color: #005f5f; } .terminal .xterm-bg-color-23 { background-color: #005f5f; } .terminal .xterm-color-24 { color: #005f87; } .terminal .xterm-bg-color-24 { background-color: #005f87; } .terminal .xterm-color-25 { color: #005faf; } .terminal .xterm-bg-color-25 { background-color: #005faf; } .terminal .xterm-color-26 { color: #005fd7; } .terminal .xterm-bg-color-26 { background-color: #005fd7; } .terminal .xterm-color-27 { color: #005fff; } .terminal .xterm-bg-color-27 { background-color: #005fff; } .terminal .xterm-color-28 { color: #008700; } .terminal .xterm-bg-color-28 { background-color: #008700; } .terminal .xterm-color-29 { color: #00875f; } .terminal .xterm-bg-color-29 { background-color: #00875f; } .terminal .xterm-color-30 { color: #008787; } .terminal .xterm-bg-color-30 { background-color: #008787; } .terminal .xterm-color-31 { color: #0087af; } .terminal .xterm-bg-color-31 { background-color: #0087af; } .terminal .xterm-color-32 { color: #0087d7; } .terminal .xterm-bg-color-32 { background-color: #0087d7; } .terminal .xterm-color-33 { color: #0087ff; } .terminal .xterm-bg-color-33 { background-color: #0087ff; } .terminal .xterm-color-34 { color: #00af00; } .terminal .xterm-bg-color-34 { background-color: #00af00; } .terminal .xterm-color-35 { color: #00af5f; } .terminal .xterm-bg-color-35 { background-color: #00af5f; } .terminal .xterm-color-36 { color: #00af87; } .terminal .xterm-bg-color-36 { background-color: #00af87; } .terminal .xterm-color-37 { color: #00afaf; } .terminal .xterm-bg-color-37 { background-color: #00afaf; } .terminal .xterm-color-38 { color: #00afd7; } .terminal .xterm-bg-color-38 { background-color: #00afd7; } .terminal .xterm-color-39 { color: #00afff; } .terminal .xterm-bg-color-39 { background-color: #00afff; } .terminal .xterm-color-40 { color: #00d700; } .terminal .xterm-bg-color-40 { background-color: #00d700; } .terminal .xterm-color-41 { color: #00d75f; } .terminal .xterm-bg-color-41 { background-color: #00d75f; } .terminal .xterm-color-42 { color: #00d787; } .terminal .xterm-bg-color-42 { background-color: #00d787; } .terminal .xterm-color-43 { color: #00d7af; } .terminal .xterm-bg-color-43 { background-color: #00d7af; } .terminal .xterm-color-44 { color: #00d7d7; } .terminal .xterm-bg-color-44 { background-color: #00d7d7; } .terminal .xterm-color-45 { color: #00d7ff; } .terminal .xterm-bg-color-45 { background-color: #00d7ff; } .terminal .xterm-color-46 { color: #00ff00; } .terminal .xterm-bg-color-46 { background-color: #00ff00; } .terminal .xterm-color-47 { color: #00ff5f; } .terminal .xterm-bg-color-47 { background-color: #00ff5f; } .terminal .xterm-color-48 { color: #00ff87; } .terminal .xterm-bg-color-48 { background-color: #00ff87; } .terminal .xterm-color-49 { color: #00ffaf; } .terminal .xterm-bg-color-49 { background-color: #00ffaf; } .terminal .xterm-color-50 { color: #00ffd7; } .terminal .xterm-bg-color-50 { background-color: #00ffd7; } .terminal .xterm-color-51 { color: #00ffff; } .terminal .xterm-bg-color-51 { background-color: #00ffff; } .terminal .xterm-color-52 { color: #5f0000; } .terminal .xterm-bg-color-52 { background-color: #5f0000; } .terminal .xterm-color-53 { color: #5f005f; } .terminal .xterm-bg-color-53 { background-color: #5f005f; } .terminal .xterm-color-54 { color: #5f0087; } .terminal .xterm-bg-color-54 { background-color: #5f0087; } .terminal .xterm-color-55 { color: #5f00af; } .terminal .xterm-bg-color-55 { background-color: #5f00af; } .terminal .xterm-color-56 { color: #5f00d7; } .terminal .xterm-bg-color-56 { background-color: #5f00d7; } .terminal .xterm-color-57 { color: #5f00ff; } .terminal .xterm-bg-color-57 { background-color: #5f00ff; } .terminal .xterm-color-58 { color: #5f5f00; } .terminal .xterm-bg-color-58 { background-color: #5f5f00; } .terminal .xterm-color-59 { color: #5f5f5f; } .terminal .xterm-bg-color-59 { background-color: #5f5f5f; } .terminal .xterm-color-60 { color: #5f5f87; } .terminal .xterm-bg-color-60 { background-color: #5f5f87; } .terminal .xterm-color-61 { color: #5f5faf; } .terminal .xterm-bg-color-61 { background-color: #5f5faf; } .terminal .xterm-color-62 { color: #5f5fd7; } .terminal .xterm-bg-color-62 { background-color: #5f5fd7; } .terminal .xterm-color-63 { color: #5f5fff; } .terminal .xterm-bg-color-63 { background-color: #5f5fff; } .terminal .xterm-color-64 { color: #5f8700; } .terminal .xterm-bg-color-64 { background-color: #5f8700; } .terminal .xterm-color-65 { color: #5f875f; } .terminal .xterm-bg-color-65 { background-color: #5f875f; } .terminal .xterm-color-66 { color: #5f8787; } .terminal .xterm-bg-color-66 { background-color: #5f8787; } .terminal .xterm-color-67 { color: #5f87af; } .terminal .xterm-bg-color-67 { background-color: #5f87af; } .terminal .xterm-color-68 { color: #5f87d7; } .terminal .xterm-bg-color-68 { background-color: #5f87d7; } .terminal .xterm-color-69 { color: #5f87ff; } .terminal .xterm-bg-color-69 { background-color: #5f87ff; } .terminal .xterm-color-70 { color: #5faf00; } .terminal .xterm-bg-color-70 { background-color: #5faf00; } .terminal .xterm-color-71 { color: #5faf5f; } .terminal .xterm-bg-color-71 { background-color: #5faf5f; } .terminal .xterm-color-72 { color: #5faf87; } .terminal .xterm-bg-color-72 { background-color: #5faf87; } .terminal .xterm-color-73 { color: #5fafaf; } .terminal .xterm-bg-color-73 { background-color: #5fafaf; } .terminal .xterm-color-74 { color: #5fafd7; } .terminal .xterm-bg-color-74 { background-color: #5fafd7; } .terminal .xterm-color-75 { color: #5fafff; } .terminal .xterm-bg-color-75 { background-color: #5fafff; } .terminal .xterm-color-76 { color: #5fd700; } .terminal .xterm-bg-color-76 { background-color: #5fd700; } .terminal .xterm-color-77 { color: #5fd75f; } .terminal .xterm-bg-color-77 { background-color: #5fd75f; } .terminal .xterm-color-78 { color: #5fd787; } .terminal .xterm-bg-color-78 { background-color: #5fd787; } .terminal .xterm-color-79 { color: #5fd7af; } .terminal .xterm-bg-color-79 { background-color: #5fd7af; } .terminal .xterm-color-80 { color: #5fd7d7; } .terminal .xterm-bg-color-80 { background-color: #5fd7d7; } .terminal .xterm-color-81 { color: #5fd7ff; } .terminal .xterm-bg-color-81 { background-color: #5fd7ff; } .terminal .xterm-color-82 { color: #5fff00; } .terminal .xterm-bg-color-82 { background-color: #5fff00; } .terminal .xterm-color-83 { color: #5fff5f; } .terminal .xterm-bg-color-83 { background-color: #5fff5f; } .terminal .xterm-color-84 { color: #5fff87; } .terminal .xterm-bg-color-84 { background-color: #5fff87; } .terminal .xterm-color-85 { color: #5fffaf; } .terminal .xterm-bg-color-85 { background-color: #5fffaf; } .terminal .xterm-color-86 { color: #5fffd7; } .terminal .xterm-bg-color-86 { background-color: #5fffd7; } .terminal .xterm-color-87 { color: #5fffff; } .terminal .xterm-bg-color-87 { background-color: #5fffff; } .terminal .xterm-color-88 { color: #870000; } .terminal .xterm-bg-color-88 { background-color: #870000; } .terminal .xterm-color-89 { color: #87005f; } .terminal .xterm-bg-color-89 { background-color: #87005f; } .terminal .xterm-color-90 { color: #870087; } .terminal .xterm-bg-color-90 { background-color: #870087; } .terminal .xterm-color-91 { color: #8700af; } .terminal .xterm-bg-color-91 { background-color: #8700af; } .terminal .xterm-color-92 { color: #8700d7; } .terminal .xterm-bg-color-92 { background-color: #8700d7; } .terminal .xterm-color-93 { color: #8700ff; } .terminal .xterm-bg-color-93 { background-color: #8700ff; } .terminal .xterm-color-94 { color: #875f00; } .terminal .xterm-bg-color-94 { background-color: #875f00; } .terminal .xterm-color-95 { color: #875f5f; } .terminal .xterm-bg-color-95 { background-color: #875f5f; } .terminal .xterm-color-96 { color: #875f87; } .terminal .xterm-bg-color-96 { background-color: #875f87; } .terminal .xterm-color-97 { color: #875faf; } .terminal .xterm-bg-color-97 { background-color: #875faf; } .terminal .xterm-color-98 { color: #875fd7; } .terminal .xterm-bg-color-98 { background-color: #875fd7; } .terminal .xterm-color-99 { color: #875fff; } .terminal .xterm-bg-color-99 { background-color: #875fff; } .terminal .xterm-color-100 { color: #878700; } .terminal .xterm-bg-color-100 { background-color: #878700; } .terminal .xterm-color-101 { color: #87875f; } .terminal .xterm-bg-color-101 { background-color: #87875f; } .terminal .xterm-color-102 { color: #878787; } .terminal .xterm-bg-color-102 { background-color: #878787; } .terminal .xterm-color-103 { color: #8787af; } .terminal .xterm-bg-color-103 { background-color: #8787af; } .terminal .xterm-color-104 { color: #8787d7; } .terminal .xterm-bg-color-104 { background-color: #8787d7; } .terminal .xterm-color-105 { color: #8787ff; } .terminal .xterm-bg-color-105 { background-color: #8787ff; } .terminal .xterm-color-106 { color: #87af00; } .terminal .xterm-bg-color-106 { background-color: #87af00; } .terminal .xterm-color-107 { color: #87af5f; } .terminal .xterm-bg-color-107 { background-color: #87af5f; } .terminal .xterm-color-108 { color: #87af87; } .terminal .xterm-bg-color-108 { background-color: #87af87; } .terminal .xterm-color-109 { color: #87afaf; } .terminal .xterm-bg-color-109 { background-color: #87afaf; } .terminal .xterm-color-110 { color: #87afd7; } .terminal .xterm-bg-color-110 { background-color: #87afd7; } .terminal .xterm-color-111 { color: #87afff; } .terminal .xterm-bg-color-111 { background-color: #87afff; } .terminal .xterm-color-112 { color: #87d700; } .terminal .xterm-bg-color-112 { background-color: #87d700; } .terminal .xterm-color-113 { color: #87d75f; } .terminal .xterm-bg-color-113 { background-color: #87d75f; } .terminal .xterm-color-114 { color: #87d787; } .terminal .xterm-bg-color-114 { background-color: #87d787; } .terminal .xterm-color-115 { color: #87d7af; } .terminal .xterm-bg-color-115 { background-color: #87d7af; } .terminal .xterm-color-116 { color: #87d7d7; } .terminal .xterm-bg-color-116 { background-color: #87d7d7; } .terminal .xterm-color-117 { color: #87d7ff; } .terminal .xterm-bg-color-117 { background-color: #87d7ff; } .terminal .xterm-color-118 { color: #87ff00; } .terminal .xterm-bg-color-118 { background-color: #87ff00; } .terminal .xterm-color-119 { color: #87ff5f; } .terminal .xterm-bg-color-119 { background-color: #87ff5f; } .terminal .xterm-color-120 { color: #87ff87; } .terminal .xterm-bg-color-120 { background-color: #87ff87; } .terminal .xterm-color-121 { color: #87ffaf; } .terminal .xterm-bg-color-121 { background-color: #87ffaf; } .terminal .xterm-color-122 { color: #87ffd7; } .terminal .xterm-bg-color-122 { background-color: #87ffd7; } .terminal .xterm-color-123 { color: #87ffff; } .terminal .xterm-bg-color-123 { background-color: #87ffff; } .terminal .xterm-color-124 { color: #af0000; } .terminal .xterm-bg-color-124 { background-color: #af0000; } .terminal .xterm-color-125 { color: #af005f; } .terminal .xterm-bg-color-125 { background-color: #af005f; } .terminal .xterm-color-126 { color: #af0087; } .terminal .xterm-bg-color-126 { background-color: #af0087; } .terminal .xterm-color-127 { color: #af00af; } .terminal .xterm-bg-color-127 { background-color: #af00af; } .terminal .xterm-color-128 { color: #af00d7; } .terminal .xterm-bg-color-128 { background-color: #af00d7; } .terminal .xterm-color-129 { color: #af00ff; } .terminal .xterm-bg-color-129 { background-color: #af00ff; } .terminal .xterm-color-130 { color: #af5f00; } .terminal .xterm-bg-color-130 { background-color: #af5f00; } .terminal .xterm-color-131 { color: #af5f5f; } .terminal .xterm-bg-color-131 { background-color: #af5f5f; } .terminal .xterm-color-132 { color: #af5f87; } .terminal .xterm-bg-color-132 { background-color: #af5f87; } .terminal .xterm-color-133 { color: #af5faf; } .terminal .xterm-bg-color-133 { background-color: #af5faf; } .terminal .xterm-color-134 { color: #af5fd7; } .terminal .xterm-bg-color-134 { background-color: #af5fd7; } .terminal .xterm-color-135 { color: #af5fff; } .terminal .xterm-bg-color-135 { background-color: #af5fff; } .terminal .xterm-color-136 { color: #af8700; } .terminal .xterm-bg-color-136 { background-color: #af8700; } .terminal .xterm-color-137 { color: #af875f; } .terminal .xterm-bg-color-137 { background-color: #af875f; } .terminal .xterm-color-138 { color: #af8787; } .terminal .xterm-bg-color-138 { background-color: #af8787; } .terminal .xterm-color-139 { color: #af87af; } .terminal .xterm-bg-color-139 { background-color: #af87af; } .terminal .xterm-color-140 { color: #af87d7; } .terminal .xterm-bg-color-140 { background-color: #af87d7; } .terminal .xterm-color-141 { color: #af87ff; } .terminal .xterm-bg-color-141 { background-color: #af87ff; } .terminal .xterm-color-142 { color: #afaf00; } .terminal .xterm-bg-color-142 { background-color: #afaf00; } .terminal .xterm-color-143 { color: #afaf5f; } .terminal .xterm-bg-color-143 { background-color: #afaf5f; } .terminal .xterm-color-144 { color: #afaf87; } .terminal .xterm-bg-color-144 { background-color: #afaf87; } .terminal .xterm-color-145 { color: #afafaf; } .terminal .xterm-bg-color-145 { background-color: #afafaf; } .terminal .xterm-color-146 { color: #afafd7; } .terminal .xterm-bg-color-146 { background-color: #afafd7; } .terminal .xterm-color-147 { color: #afafff; } .terminal .xterm-bg-color-147 { background-color: #afafff; } .terminal .xterm-color-148 { color: #afd700; } .terminal .xterm-bg-color-148 { background-color: #afd700; } .terminal .xterm-color-149 { color: #afd75f; } .terminal .xterm-bg-color-149 { background-color: #afd75f; } .terminal .xterm-color-150 { color: #afd787; } .terminal .xterm-bg-color-150 { background-color: #afd787; } .terminal .xterm-color-151 { color: #afd7af; } .terminal .xterm-bg-color-151 { background-color: #afd7af; } .terminal .xterm-color-152 { color: #afd7d7; } .terminal .xterm-bg-color-152 { background-color: #afd7d7; } .terminal .xterm-color-153 { color: #afd7ff; } .terminal .xterm-bg-color-153 { background-color: #afd7ff; } .terminal .xterm-color-154 { color: #afff00; } .terminal .xterm-bg-color-154 { background-color: #afff00; } .terminal .xterm-color-155 { color: #afff5f; } .terminal .xterm-bg-color-155 { background-color: #afff5f; } .terminal .xterm-color-156 { color: #afff87; } .terminal .xterm-bg-color-156 { background-color: #afff87; } .terminal .xterm-color-157 { color: #afffaf; } .terminal .xterm-bg-color-157 { background-color: #afffaf; } .terminal .xterm-color-158 { color: #afffd7; } .terminal .xterm-bg-color-158 { background-color: #afffd7; } .terminal .xterm-color-159 { color: #afffff; } .terminal .xterm-bg-color-159 { background-color: #afffff; } .terminal .xterm-color-160 { color: #d70000; } .terminal .xterm-bg-color-160 { background-color: #d70000; } .terminal .xterm-color-161 { color: #d7005f; } .terminal .xterm-bg-color-161 { background-color: #d7005f; } .terminal .xterm-color-162 { color: #d70087; } .terminal .xterm-bg-color-162 { background-color: #d70087; } .terminal .xterm-color-163 { color: #d700af; } .terminal .xterm-bg-color-163 { background-color: #d700af; } .terminal .xterm-color-164 { color: #d700d7; } .terminal .xterm-bg-color-164 { background-color: #d700d7; } .terminal .xterm-color-165 { color: #d700ff; } .terminal .xterm-bg-color-165 { background-color: #d700ff; } .terminal .xterm-color-166 { color: #d75f00; } .terminal .xterm-bg-color-166 { background-color: #d75f00; } .terminal .xterm-color-167 { color: #d75f5f; } .terminal .xterm-bg-color-167 { background-color: #d75f5f; } .terminal .xterm-color-168 { color: #d75f87; } .terminal .xterm-bg-color-168 { background-color: #d75f87; } .terminal .xterm-color-169 { color: #d75faf; } .terminal .xterm-bg-color-169 { background-color: #d75faf; } .terminal .xterm-color-170 { color: #d75fd7; } .terminal .xterm-bg-color-170 { background-color: #d75fd7; } .terminal .xterm-color-171 { color: #d75fff; } .terminal .xterm-bg-color-171 { background-color: #d75fff; } .terminal .xterm-color-172 { color: #d78700; } .terminal .xterm-bg-color-172 { background-color: #d78700; } .terminal .xterm-color-173 { color: #d7875f; } .terminal .xterm-bg-color-173 { background-color: #d7875f; } .terminal .xterm-color-174 { color: #d78787; } .terminal .xterm-bg-color-174 { background-color: #d78787; } .terminal .xterm-color-175 { color: #d787af; } .terminal .xterm-bg-color-175 { background-color: #d787af; } .terminal .xterm-color-176 { color: #d787d7; } .terminal .xterm-bg-color-176 { background-color: #d787d7; } .terminal .xterm-color-177 { color: #d787ff; } .terminal .xterm-bg-color-177 { background-color: #d787ff; } .terminal .xterm-color-178 { color: #d7af00; } .terminal .xterm-bg-color-178 { background-color: #d7af00; } .terminal .xterm-color-179 { color: #d7af5f; } .terminal .xterm-bg-color-179 { background-color: #d7af5f; } .terminal .xterm-color-180 { color: #d7af87; } .terminal .xterm-bg-color-180 { background-color: #d7af87; } .terminal .xterm-color-181 { color: #d7afaf; } .terminal .xterm-bg-color-181 { background-color: #d7afaf; } .terminal .xterm-color-182 { color: #d7afd7; } .terminal .xterm-bg-color-182 { background-color: #d7afd7; } .terminal .xterm-color-183 { color: #d7afff; } .terminal .xterm-bg-color-183 { background-color: #d7afff; } .terminal .xterm-color-184 { color: #d7d700; } .terminal .xterm-bg-color-184 { background-color: #d7d700; } .terminal .xterm-color-185 { color: #d7d75f; } .terminal .xterm-bg-color-185 { background-color: #d7d75f; } .terminal .xterm-color-186 { color: #d7d787; } .terminal .xterm-bg-color-186 { background-color: #d7d787; } .terminal .xterm-color-187 { color: #d7d7af; } .terminal .xterm-bg-color-187 { background-color: #d7d7af; } .terminal .xterm-color-188 { color: #d7d7d7; } .terminal .xterm-bg-color-188 { background-color: #d7d7d7; } .terminal .xterm-color-189 { color: #d7d7ff; } .terminal .xterm-bg-color-189 { background-color: #d7d7ff; } .terminal .xterm-color-190 { color: #d7ff00; } .terminal .xterm-bg-color-190 { background-color: #d7ff00; } .terminal .xterm-color-191 { color: #d7ff5f; } .terminal .xterm-bg-color-191 { background-color: #d7ff5f; } .terminal .xterm-color-192 { color: #d7ff87; } .terminal .xterm-bg-color-192 { background-color: #d7ff87; } .terminal .xterm-color-193 { color: #d7ffaf; } .terminal .xterm-bg-color-193 { background-color: #d7ffaf; } .terminal .xterm-color-194 { color: #d7ffd7; } .terminal .xterm-bg-color-194 { background-color: #d7ffd7; } .terminal .xterm-color-195 { color: #d7ffff; } .terminal .xterm-bg-color-195 { background-color: #d7ffff; } .terminal .xterm-color-196 { color: #ff0000; } .terminal .xterm-bg-color-196 { background-color: #ff0000; } .terminal .xterm-color-197 { color: #ff005f; } .terminal .xterm-bg-color-197 { background-color: #ff005f; } .terminal .xterm-color-198 { color: #ff0087; } .terminal .xterm-bg-color-198 { background-color: #ff0087; } .terminal .xterm-color-199 { color: #ff00af; } .terminal .xterm-bg-color-199 { background-color: #ff00af; } .terminal .xterm-color-200 { color: #ff00d7; } .terminal .xterm-bg-color-200 { background-color: #ff00d7; } .terminal .xterm-color-201 { color: #ff00ff; } .terminal .xterm-bg-color-201 { background-color: #ff00ff; } .terminal .xterm-color-202 { color: #ff5f00; } .terminal .xterm-bg-color-202 { background-color: #ff5f00; } .terminal .xterm-color-203 { color: #ff5f5f; } .terminal .xterm-bg-color-203 { background-color: #ff5f5f; } .terminal .xterm-color-204 { color: #ff5f87; } .terminal .xterm-bg-color-204 { background-color: #ff5f87; } .terminal .xterm-color-205 { color: #ff5faf; } .terminal .xterm-bg-color-205 { background-color: #ff5faf; } .terminal .xterm-color-206 { color: #ff5fd7; } .terminal .xterm-bg-color-206 { background-color: #ff5fd7; } .terminal .xterm-color-207 { color: #ff5fff; } .terminal .xterm-bg-color-207 { background-color: #ff5fff; } .terminal .xterm-color-208 { color: #ff8700; } .terminal .xterm-bg-color-208 { background-color: #ff8700; } .terminal .xterm-color-209 { color: #ff875f; } .terminal .xterm-bg-color-209 { background-color: #ff875f; } .terminal .xterm-color-210 { color: #ff8787; } .terminal .xterm-bg-color-210 { background-color: #ff8787; } .terminal .xterm-color-211 { color: #ff87af; } .terminal .xterm-bg-color-211 { background-color: #ff87af; } .terminal .xterm-color-212 { color: #ff87d7; } .terminal .xterm-bg-color-212 { background-color: #ff87d7; } .terminal .xterm-color-213 { color: #ff87ff; } .terminal .xterm-bg-color-213 { background-color: #ff87ff; } .terminal .xterm-color-214 { color: #ffaf00; } .terminal .xterm-bg-color-214 { background-color: #ffaf00; } .terminal .xterm-color-215 { color: #ffaf5f; } .terminal .xterm-bg-color-215 { background-color: #ffaf5f; } .terminal .xterm-color-216 { color: #ffaf87; } .terminal .xterm-bg-color-216 { background-color: #ffaf87; } .terminal .xterm-color-217 { color: #ffafaf; } .terminal .xterm-bg-color-217 { background-color: #ffafaf; } .terminal .xterm-color-218 { color: #ffafd7; } .terminal .xterm-bg-color-218 { background-color: #ffafd7; } .terminal .xterm-color-219 { color: #ffafff; } .terminal .xterm-bg-color-219 { background-color: #ffafff; } .terminal .xterm-color-220 { color: #ffd700; } .terminal .xterm-bg-color-220 { background-color: #ffd700; } .terminal .xterm-color-221 { color: #ffd75f; } .terminal .xterm-bg-color-221 { background-color: #ffd75f; } .terminal .xterm-color-222 { color: #ffd787; } .terminal .xterm-bg-color-222 { background-color: #ffd787; } .terminal .xterm-color-223 { color: #ffd7af; } .terminal .xterm-bg-color-223 { background-color: #ffd7af; } .terminal .xterm-color-224 { color: #ffd7d7; } .terminal .xterm-bg-color-224 { background-color: #ffd7d7; } .terminal .xterm-color-225 { color: #ffd7ff; } .terminal .xterm-bg-color-225 { background-color: #ffd7ff; } .terminal .xterm-color-226 { color: #ffff00; } .terminal .xterm-bg-color-226 { background-color: #ffff00; } .terminal .xterm-color-227 { color: #ffff5f; } .terminal .xterm-bg-color-227 { background-color: #ffff5f; } .terminal .xterm-color-228 { color: #ffff87; } .terminal .xterm-bg-color-228 { background-color: #ffff87; } .terminal .xterm-color-229 { color: #ffffaf; } .terminal .xterm-bg-color-229 { background-color: #ffffaf; } .terminal .xterm-color-230 { color: #ffffd7; } .terminal .xterm-bg-color-230 { background-color: #ffffd7; } .terminal .xterm-color-231 { color: #ffffff; } .terminal .xterm-bg-color-231 { background-color: #ffffff; } .terminal .xterm-color-232 { color: #080808; } .terminal .xterm-bg-color-232 { background-color: #080808; } .terminal .xterm-color-233 { color: #121212; } .terminal .xterm-bg-color-233 { background-color: #121212; } .terminal .xterm-color-234 { color: #1c1c1c; } .terminal .xterm-bg-color-234 { background-color: #1c1c1c; } .terminal .xterm-color-235 { color: #262626; } .terminal .xterm-bg-color-235 { background-color: #262626; } .terminal .xterm-color-236 { color: #303030; } .terminal .xterm-bg-color-236 { background-color: #303030; } .terminal .xterm-color-237 { color: #3a3a3a; } .terminal .xterm-bg-color-237 { background-color: #3a3a3a; } .terminal .xterm-color-238 { color: #444444; } .terminal .xterm-bg-color-238 { background-color: #444444; } .terminal .xterm-color-239 { color: #4e4e4e; } .terminal .xterm-bg-color-239 { background-color: #4e4e4e; } .terminal .xterm-color-240 { color: #585858; } .terminal .xterm-bg-color-240 { background-color: #585858; } .terminal .xterm-color-241 { color: #626262; } .terminal .xterm-bg-color-241 { background-color: #626262; } .terminal .xterm-color-242 { color: #6c6c6c; } .terminal .xterm-bg-color-242 { background-color: #6c6c6c; } .terminal .xterm-color-243 { color: #767676; } .terminal .xterm-bg-color-243 { background-color: #767676; } .terminal .xterm-color-244 { color: #808080; } .terminal .xterm-bg-color-244 { background-color: #808080; } .terminal .xterm-color-245 { color: #8a8a8a; } .terminal .xterm-bg-color-245 { background-color: #8a8a8a; } .terminal .xterm-color-246 { color: #949494; } .terminal .xterm-bg-color-246 { background-color: #949494; } .terminal .xterm-color-247 { color: #9e9e9e; } .terminal .xterm-bg-color-247 { background-color: #9e9e9e; } .terminal .xterm-color-248 { color: #a8a8a8; } .terminal .xterm-bg-color-248 { background-color: #a8a8a8; } .terminal .xterm-color-249 { color: #b2b2b2; } .terminal .xterm-bg-color-249 { background-color: #b2b2b2; } .terminal .xterm-color-250 { color: #bcbcbc; } .terminal .xterm-bg-color-250 { background-color: #bcbcbc; } .terminal .xterm-color-251 { color: #c6c6c6; } .terminal .xterm-bg-color-251 { background-color: #c6c6c6; } .terminal .xterm-color-252 { color: #d0d0d0; } .terminal .xterm-bg-color-252 { background-color: #d0d0d0; } .terminal .xterm-color-253 { color: #dadada; } .terminal .xterm-bg-color-253 { background-color: #dadada; } .terminal .xterm-color-254 { color: #e4e4e4; } .terminal .xterm-bg-color-254 { background-color: #e4e4e4; } .terminal .xterm-color-255 { color: #eeeeee; } .terminal .xterm-bg-color-255 { background-color: #eeeeee; } ================================================ FILE: static/assets/js/bootstrap.js ================================================ /*! * Bootstrap v3.3.5 (http://getbootstrap.com) * Copyright 2011-2015 Twitter, Inc. * Licensed under the MIT license */ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript requires jQuery') } +function ($) { 'use strict'; var version = $.fn.jquery.split(' ')[0].split('.') if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1)) { throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher') } }(jQuery); /* ======================================================================== * Bootstrap: transition.js v3.3.5 * http://getbootstrap.com/javascript/#transitions * ======================================================================== * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) // ============================================================ function transitionEnd() { var el = document.createElement('bootstrap') var transEndEventNames = { WebkitTransition : 'webkitTransitionEnd', MozTransition : 'transitionend', OTransition : 'oTransitionEnd otransitionend', transition : 'transitionend' } for (var name in transEndEventNames) { if (el.style[name] !== undefined) { return { end: transEndEventNames[name] } } } return false // explicit for ie8 ( ._.) } // http://blog.alexmaccaw.com/css-transitions $.fn.emulateTransitionEnd = function (duration) { var called = false var $el = this $(this).one('bsTransitionEnd', function () { called = true }) var callback = function () { if (!called) $($el).trigger($.support.transition.end) } setTimeout(callback, duration) return this } $(function () { $.support.transition = transitionEnd() if (!$.support.transition) return $.event.special.bsTransitionEnd = { bindType: $.support.transition.end, delegateType: $.support.transition.end, handle: function (e) { if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments) } } }) }(jQuery); /* ======================================================================== * Bootstrap: alert.js v3.3.5 * http://getbootstrap.com/javascript/#alerts * ======================================================================== * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // ALERT CLASS DEFINITION // ====================== var dismiss = '[data-dismiss="alert"]' var Alert = function (el) { $(el).on('click', dismiss, this.close) } Alert.VERSION = '3.3.5' Alert.TRANSITION_DURATION = 150 Alert.prototype.close = function (e) { var $this = $(this) var selector = $this.attr('data-target') if (!selector) { selector = $this.attr('href') selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 } var $parent = $(selector) if (e) e.preventDefault() if (!$parent.length) { $parent = $this.closest('.alert') } $parent.trigger(e = $.Event('close.bs.alert')) if (e.isDefaultPrevented()) return $parent.removeClass('in') function removeElement() { // detach from parent, fire event then clean up data $parent.detach().trigger('closed.bs.alert').remove() } $.support.transition && $parent.hasClass('fade') ? $parent .one('bsTransitionEnd', removeElement) .emulateTransitionEnd(Alert.TRANSITION_DURATION) : removeElement() } // ALERT PLUGIN DEFINITION // ======================= function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.alert') if (!data) $this.data('bs.alert', (data = new Alert(this))) if (typeof option == 'string') data[option].call($this) }) } var old = $.fn.alert $.fn.alert = Plugin $.fn.alert.Constructor = Alert // ALERT NO CONFLICT // ================= $.fn.alert.noConflict = function () { $.fn.alert = old return this } // ALERT DATA-API // ============== $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) }(jQuery); /* ======================================================================== * Bootstrap: button.js v3.3.5 * http://getbootstrap.com/javascript/#buttons * ======================================================================== * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // BUTTON PUBLIC CLASS DEFINITION // ============================== var Button = function (element, options) { this.$element = $(element) this.options = $.extend({}, Button.DEFAULTS, options) this.isLoading = false } Button.VERSION = '3.3.5' Button.DEFAULTS = { loadingText: 'loading...' } Button.prototype.setState = function (state) { var d = 'disabled' var $el = this.$element var val = $el.is('input') ? 'val' : 'html' var data = $el.data() state += 'Text' if (data.resetText == null) $el.data('resetText', $el[val]()) // push to event loop to allow forms to submit setTimeout($.proxy(function () { $el[val](data[state] == null ? this.options[state] : data[state]) if (state == 'loadingText') { this.isLoading = true $el.addClass(d).attr(d, d) } else if (this.isLoading) { this.isLoading = false $el.removeClass(d).removeAttr(d) } }, this), 0) } Button.prototype.toggle = function () { var changed = true var $parent = this.$element.closest('[data-toggle="buttons"]') if ($parent.length) { var $input = this.$element.find('input') if ($input.prop('type') == 'radio') { if ($input.prop('checked')) changed = false $parent.find('.active').removeClass('active') this.$element.addClass('active') } else if ($input.prop('type') == 'checkbox') { if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false this.$element.toggleClass('active') } $input.prop('checked', this.$element.hasClass('active')) if (changed) $input.trigger('change') } else { this.$element.attr('aria-pressed', !this.$element.hasClass('active')) this.$element.toggleClass('active') } } // BUTTON PLUGIN DEFINITION // ======================== function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.button') var options = typeof option == 'object' && option if (!data) $this.data('bs.button', (data = new Button(this, options))) if (option == 'toggle') data.toggle() else if (option) data.setState(option) }) } var old = $.fn.button $.fn.button = Plugin $.fn.button.Constructor = Button // BUTTON NO CONFLICT // ================== $.fn.button.noConflict = function () { $.fn.button = old return this } // BUTTON DATA-API // =============== $(document) .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) { var $btn = $(e.target) if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') Plugin.call($btn, 'toggle') if (!($(e.target).is('input[type="radio"]') || $(e.target).is('input[type="checkbox"]'))) e.preventDefault() }) .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) { $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type)) }) }(jQuery); /* ======================================================================== * Bootstrap: carousel.js v3.3.5 * http://getbootstrap.com/javascript/#carousel * ======================================================================== * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // CAROUSEL CLASS DEFINITION // ========================= var Carousel = function (element, options) { this.$element = $(element) this.$indicators = this.$element.find('.carousel-indicators') this.options = options this.paused = null this.sliding = null this.interval = null this.$active = null this.$items = null this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this)) this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element .on('mouseenter.bs.carousel', $.proxy(this.pause, this)) .on('mouseleave.bs.carousel', $.proxy(this.cycle, this)) } Carousel.VERSION = '3.3.5' Carousel.TRANSITION_DURATION = 600 Carousel.DEFAULTS = { interval: 5000, pause: 'hover', wrap: true, keyboard: true } Carousel.prototype.keydown = function (e) { if (/input|textarea/i.test(e.target.tagName)) return switch (e.which) { case 37: this.prev(); break case 39: this.next(); break default: return } e.preventDefault() } Carousel.prototype.cycle = function (e) { e || (this.paused = false) this.interval && clearInterval(this.interval) this.options.interval && !this.paused && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) return this } Carousel.prototype.getItemIndex = function (item) { this.$items = item.parent().children('.item') return this.$items.index(item || this.$active) } Carousel.prototype.getItemForDirection = function (direction, active) { var activeIndex = this.getItemIndex(active) var willWrap = (direction == 'prev' && activeIndex === 0) || (direction == 'next' && activeIndex == (this.$items.length - 1)) if (willWrap && !this.options.wrap) return active var delta = direction == 'prev' ? -1 : 1 var itemIndex = (activeIndex + delta) % this.$items.length return this.$items.eq(itemIndex) } Carousel.prototype.to = function (pos) { var that = this var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active')) if (pos > (this.$items.length - 1) || pos < 0) return if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid" if (activeIndex == pos) return this.pause().cycle() return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos)) } Carousel.prototype.pause = function (e) { e || (this.paused = true) if (this.$element.find('.next, .prev').length && $.support.transition) { this.$element.trigger($.support.transition.end) this.cycle(true) } this.interval = clearInterval(this.interval) return this } Carousel.prototype.next = function () { if (this.sliding) return return this.slide('next') } Carousel.prototype.prev = function () { if (this.sliding) return return this.slide('prev') } Carousel.prototype.slide = function (type, next) { var $active = this.$element.find('.item.active') var $next = next || this.getItemForDirection(type, $active) var isCycling = this.interval var direction = type == 'next' ? 'left' : 'right' var that = this if ($next.hasClass('active')) return (this.sliding = false) var relatedTarget = $next[0] var slideEvent = $.Event('slide.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) this.$element.trigger(slideEvent) if (slideEvent.isDefaultPrevented()) return this.sliding = true isCycling && this.pause() if (this.$indicators.length) { this.$indicators.find('.active').removeClass('active') var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)]) $nextIndicator && $nextIndicator.addClass('active') } var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid" if ($.support.transition && this.$element.hasClass('slide')) { $next.addClass(type) $next[0].offsetWidth // force reflow $active.addClass(direction) $next.addClass(direction) $active .one('bsTransitionEnd', function () { $next.removeClass([type, direction].join(' ')).addClass('active') $active.removeClass(['active', direction].join(' ')) that.sliding = false setTimeout(function () { that.$element.trigger(slidEvent) }, 0) }) .emulateTransitionEnd(Carousel.TRANSITION_DURATION) } else { $active.removeClass('active') $next.addClass('active') this.sliding = false this.$element.trigger(slidEvent) } isCycling && this.cycle() return this } // CAROUSEL PLUGIN DEFINITION // ========================== function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.carousel') var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) var action = typeof option == 'string' ? option : options.slide if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) if (typeof option == 'number') data.to(option) else if (action) data[action]() else if (options.interval) data.pause().cycle() }) } var old = $.fn.carousel $.fn.carousel = Plugin $.fn.carousel.Constructor = Carousel // CAROUSEL NO CONFLICT // ==================== $.fn.carousel.noConflict = function () { $.fn.carousel = old return this } // CAROUSEL DATA-API // ================= var clickHandler = function (e) { var href var $this = $(this) var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7 if (!$target.hasClass('carousel')) return var options = $.extend({}, $target.data(), $this.data()) var slideIndex = $this.attr('data-slide-to') if (slideIndex) options.interval = false Plugin.call($target, options) if (slideIndex) { $target.data('bs.carousel').to(slideIndex) } e.preventDefault() } $(document) .on('click.bs.carousel.data-api', '[data-slide]', clickHandler) .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler) $(window).on('load', function () { $('[data-ride="carousel"]').each(function () { var $carousel = $(this) Plugin.call($carousel, $carousel.data()) }) }) }(jQuery); /* ======================================================================== * Bootstrap: collapse.js v3.3.5 * http://getbootstrap.com/javascript/#collapse * ======================================================================== * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // COLLAPSE PUBLIC CLASS DEFINITION // ================================ var Collapse = function (element, options) { this.$element = $(element) this.options = $.extend({}, Collapse.DEFAULTS, options) this.$trigger = $('[data-toggle="collapse"][href="#' + element.id + '"],' + '[data-toggle="collapse"][data-target="#' + element.id + '"]') this.transitioning = null if (this.options.parent) { this.$parent = this.getParent() } else { this.addAriaAndCollapsedClass(this.$element, this.$trigger) } if (this.options.toggle) this.toggle() } Collapse.VERSION = '3.3.5' Collapse.TRANSITION_DURATION = 350 Collapse.DEFAULTS = { toggle: true } Collapse.prototype.dimension = function () { var hasWidth = this.$element.hasClass('width') return hasWidth ? 'width' : 'height' } Collapse.prototype.show = function () { if (this.transitioning || this.$element.hasClass('in')) return var activesData var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing') if (actives && actives.length) { activesData = actives.data('bs.collapse') if (activesData && activesData.transitioning) return } var startEvent = $.Event('show.bs.collapse') this.$element.trigger(startEvent) if (startEvent.isDefaultPrevented()) return if (actives && actives.length) { Plugin.call(actives, 'hide') activesData || actives.data('bs.collapse', null) } var dimension = this.dimension() this.$element .removeClass('collapse') .addClass('collapsing')[dimension](0) .attr('aria-expanded', true) this.$trigger .removeClass('collapsed') .attr('aria-expanded', true) this.transitioning = 1 var complete = function () { this.$element .removeClass('collapsing') .addClass('collapse in')[dimension]('') this.transitioning = 0 this.$element .trigger('shown.bs.collapse') } if (!$.support.transition) return complete.call(this) var scrollSize = $.camelCase(['scroll', dimension].join('-')) this.$element .one('bsTransitionEnd', $.proxy(complete, this)) .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize]) } Collapse.prototype.hide = function () { if (this.transitioning || !this.$element.hasClass('in')) return var startEvent = $.Event('hide.bs.collapse') this.$element.trigger(startEvent) if (startEvent.isDefaultPrevented()) return var dimension = this.dimension() this.$element[dimension](this.$element[dimension]())[0].offsetHeight this.$element .addClass('collapsing') .removeClass('collapse in') .attr('aria-expanded', false) this.$trigger .addClass('collapsed') .attr('aria-expanded', false) this.transitioning = 1 var complete = function () { this.transitioning = 0 this.$element .removeClass('collapsing') .addClass('collapse') .trigger('hidden.bs.collapse') } if (!$.support.transition) return complete.call(this) this.$element [dimension](0) .one('bsTransitionEnd', $.proxy(complete, this)) .emulateTransitionEnd(Collapse.TRANSITION_DURATION) } Collapse.prototype.toggle = function () { this[this.$element.hasClass('in') ? 'hide' : 'show']() } Collapse.prototype.getParent = function () { return $(this.options.parent) .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]') .each($.proxy(function (i, element) { var $element = $(element) this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element) }, this)) .end() } Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) { var isOpen = $element.hasClass('in') $element.attr('aria-expanded', isOpen) $trigger .toggleClass('collapsed', !isOpen) .attr('aria-expanded', isOpen) } function getTargetFromTrigger($trigger) { var href var target = $trigger.attr('data-target') || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7 return $(target) } // COLLAPSE PLUGIN DEFINITION // ========================== function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.collapse') var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) if (typeof option == 'string') data[option]() }) } var old = $.fn.collapse $.fn.collapse = Plugin $.fn.collapse.Constructor = Collapse // COLLAPSE NO CONFLICT // ==================== $.fn.collapse.noConflict = function () { $.fn.collapse = old return this } // COLLAPSE DATA-API // ================= $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) { var $this = $(this) if (!$this.attr('data-target')) e.preventDefault() var $target = getTargetFromTrigger($this) var data = $target.data('bs.collapse') var option = data ? 'toggle' : $this.data() Plugin.call($target, option) }) }(jQuery); /* ======================================================================== * Bootstrap: dropdown.js v3.3.5 * http://getbootstrap.com/javascript/#dropdowns * ======================================================================== * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // DROPDOWN CLASS DEFINITION // ========================= var backdrop = '.dropdown-backdrop' var toggle = '[data-toggle="dropdown"]' var Dropdown = function (element) { $(element).on('click.bs.dropdown', this.toggle) } Dropdown.VERSION = '3.3.5' function getParent($this) { var selector = $this.attr('data-target') if (!selector) { selector = $this.attr('href') selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 } var $parent = selector && $(selector) return $parent && $parent.length ? $parent : $this.parent() } function clearMenus(e) { if (e && e.which === 3) return $(backdrop).remove() $(toggle).each(function () { var $this = $(this) var $parent = getParent($this) var relatedTarget = { relatedTarget: this } if (!$parent.hasClass('open')) return if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget)) if (e.isDefaultPrevented()) return $this.attr('aria-expanded', 'false') $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget) }) } Dropdown.prototype.toggle = function (e) { var $this = $(this) if ($this.is('.disabled, :disabled')) return var $parent = getParent($this) var isActive = $parent.hasClass('open') clearMenus() if (!isActive) { if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { // if mobile we use a backdrop because click events don't delegate $(document.createElement('div')) .addClass('dropdown-backdrop') .insertAfter($(this)) .on('click', clearMenus) } var relatedTarget = { relatedTarget: this } $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget)) if (e.isDefaultPrevented()) return $this .trigger('focus') .attr('aria-expanded', 'true') $parent .toggleClass('open') .trigger('shown.bs.dropdown', relatedTarget) } return false } Dropdown.prototype.keydown = function (e) { if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return var $this = $(this) e.preventDefault() e.stopPropagation() if ($this.is('.disabled, :disabled')) return var $parent = getParent($this) var isActive = $parent.hasClass('open') if (!isActive && e.which != 27 || isActive && e.which == 27) { if (e.which == 27) $parent.find(toggle).trigger('focus') return $this.trigger('click') } var desc = ' li:not(.disabled):visible a' var $items = $parent.find('.dropdown-menu' + desc) if (!$items.length) return var index = $items.index(e.target) if (e.which == 38 && index > 0) index-- // up if (e.which == 40 && index < $items.length - 1) index++ // down if (!~index) index = 0 $items.eq(index).trigger('focus') } // DROPDOWN PLUGIN DEFINITION // ========================== function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.dropdown') if (!data) $this.data('bs.dropdown', (data = new Dropdown(this))) if (typeof option == 'string') data[option].call($this) }) } var old = $.fn.dropdown $.fn.dropdown = Plugin $.fn.dropdown.Constructor = Dropdown // DROPDOWN NO CONFLICT // ==================== $.fn.dropdown.noConflict = function () { $.fn.dropdown = old return this } // APPLY TO STANDARD DROPDOWN ELEMENTS // =================================== $(document) .on('click.bs.dropdown.data-api', clearMenus) .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle) .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown) .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown) }(jQuery); /* ======================================================================== * Bootstrap: modal.js v3.3.5 * http://getbootstrap.com/javascript/#modals * ======================================================================== * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // MODAL CLASS DEFINITION // ====================== var Modal = function (element, options) { this.options = options this.$body = $(document.body) this.$element = $(element) this.$dialog = this.$element.find('.modal-dialog') this.$backdrop = null this.isShown = null this.originalBodyPad = null this.scrollbarWidth = 0 this.ignoreBackdropClick = false if (this.options.remote) { this.$element .find('.modal-content') .load(this.options.remote, $.proxy(function () { this.$element.trigger('loaded.bs.modal') }, this)) } } Modal.VERSION = '3.3.5' Modal.TRANSITION_DURATION = 300 Modal.BACKDROP_TRANSITION_DURATION = 150 Modal.DEFAULTS = { backdrop: true, keyboard: true, show: true } Modal.prototype.toggle = function (_relatedTarget) { return this.isShown ? this.hide() : this.show(_relatedTarget) } Modal.prototype.show = function (_relatedTarget) { var that = this var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget }) this.$element.trigger(e) if (this.isShown || e.isDefaultPrevented()) return this.isShown = true this.checkScrollbar() this.setScrollbar() this.$body.addClass('modal-open') this.escape() this.resize() this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this)) this.$dialog.on('mousedown.dismiss.bs.modal', function () { that.$element.one('mouseup.dismiss.bs.modal', function (e) { if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true }) }) this.backdrop(function () { var transition = $.support.transition && that.$element.hasClass('fade') if (!that.$element.parent().length) { that.$element.appendTo(that.$body) // don't move modals dom position } that.$element .show() .scrollTop(0) that.adjustDialog() if (transition) { that.$element[0].offsetWidth // force reflow } that.$element.addClass('in') that.enforceFocus() var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget }) transition ? that.$dialog // wait for modal to slide in .one('bsTransitionEnd', function () { that.$element.trigger('focus').trigger(e) }) .emulateTransitionEnd(Modal.TRANSITION_DURATION) : that.$element.trigger('focus').trigger(e) }) } Modal.prototype.hide = function (e) { if (e) e.preventDefault() e = $.Event('hide.bs.modal') this.$element.trigger(e) if (!this.isShown || e.isDefaultPrevented()) return this.isShown = false this.escape() this.resize() $(document).off('focusin.bs.modal') this.$element .removeClass('in') .off('click.dismiss.bs.modal') .off('mouseup.dismiss.bs.modal') this.$dialog.off('mousedown.dismiss.bs.modal') $.support.transition && this.$element.hasClass('fade') ? this.$element .one('bsTransitionEnd', $.proxy(this.hideModal, this)) .emulateTransitionEnd(Modal.TRANSITION_DURATION) : this.hideModal() } Modal.prototype.enforceFocus = function () { $(document) .off('focusin.bs.modal') // guard against infinite focus loop .on('focusin.bs.modal', $.proxy(function (e) { if (this.$element[0] !== e.target && !this.$element.has(e.target).length) { this.$element.trigger('focus') } }, this)) } Modal.prototype.escape = function () { if (this.isShown && this.options.keyboard) { this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) { e.which == 27 && this.hide() }, this)) } else if (!this.isShown) { this.$element.off('keydown.dismiss.bs.modal') } } Modal.prototype.resize = function () { if (this.isShown) { $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this)) } else { $(window).off('resize.bs.modal') } } Modal.prototype.hideModal = function () { var that = this this.$element.hide() this.backdrop(function () { that.$body.removeClass('modal-open') that.resetAdjustments() that.resetScrollbar() that.$element.trigger('hidden.bs.modal') }) } Modal.prototype.removeBackdrop = function () { this.$backdrop && this.$backdrop.remove() this.$backdrop = null } Modal.prototype.backdrop = function (callback) { var that = this var animate = this.$element.hasClass('fade') ? 'fade' : '' if (this.isShown && this.options.backdrop) { var doAnimate = $.support.transition && animate this.$backdrop = $(document.createElement('div')) .addClass('modal-backdrop ' + animate) .appendTo(this.$body) this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) { if (this.ignoreBackdropClick) { this.ignoreBackdropClick = false return } if (e.target !== e.currentTarget) return this.options.backdrop == 'static' ? this.$element[0].focus() : this.hide() }, this)) if (doAnimate) this.$backdrop[0].offsetWidth // force reflow this.$backdrop.addClass('in') if (!callback) return doAnimate ? this.$backdrop .one('bsTransitionEnd', callback) .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : callback() } else if (!this.isShown && this.$backdrop) { this.$backdrop.removeClass('in') var callbackRemove = function () { that.removeBackdrop() callback && callback() } $.support.transition && this.$element.hasClass('fade') ? this.$backdrop .one('bsTransitionEnd', callbackRemove) .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : callbackRemove() } else if (callback) { callback() } } // these following methods are used to handle overflowing modals Modal.prototype.handleUpdate = function () { this.adjustDialog() } Modal.prototype.adjustDialog = function () { var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight this.$element.css({ paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '', paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : '' }) } Modal.prototype.resetAdjustments = function () { this.$element.css({ paddingLeft: '', paddingRight: '' }) } Modal.prototype.checkScrollbar = function () { var fullWindowWidth = window.innerWidth if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8 var documentElementRect = document.documentElement.getBoundingClientRect() fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left) } this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth this.scrollbarWidth = this.measureScrollbar() } Modal.prototype.setScrollbar = function () { var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10) this.originalBodyPad = document.body.style.paddingRight || '' if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth) } Modal.prototype.resetScrollbar = function () { this.$body.css('padding-right', this.originalBodyPad) } Modal.prototype.measureScrollbar = function () { // thx walsh var scrollDiv = document.createElement('div') scrollDiv.className = 'modal-scrollbar-measure' this.$body.append(scrollDiv) var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth this.$body[0].removeChild(scrollDiv) return scrollbarWidth } // MODAL PLUGIN DEFINITION // ======================= function Plugin(option, _relatedTarget) { return this.each(function () { var $this = $(this) var data = $this.data('bs.modal') var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option) if (!data) $this.data('bs.modal', (data = new Modal(this, options))) if (typeof option == 'string') data[option](_relatedTarget) else if (options.show) data.show(_relatedTarget) }) } var old = $.fn.modal $.fn.modal = Plugin $.fn.modal.Constructor = Modal // MODAL NO CONFLICT // ================= $.fn.modal.noConflict = function () { $.fn.modal = old return this } // MODAL DATA-API // ============== $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) { var $this = $(this) var href = $this.attr('href') var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7 var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data()) if ($this.is('a')) e.preventDefault() $target.one('show.bs.modal', function (showEvent) { if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown $target.one('hidden.bs.modal', function () { $this.is(':visible') && $this.trigger('focus') }) }) Plugin.call($target, option, this) }) }(jQuery); /* ======================================================================== * Bootstrap: tooltip.js v3.3.5 * http://getbootstrap.com/javascript/#tooltip * Inspired by the original jQuery.tipsy by Jason Frame * ======================================================================== * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // TOOLTIP PUBLIC CLASS DEFINITION // =============================== var Tooltip = function (element, options) { this.type = null this.options = null this.enabled = null this.timeout = null this.hoverState = null this.$element = null this.inState = null this.init('tooltip', element, options) } Tooltip.VERSION = '3.3.5' Tooltip.TRANSITION_DURATION = 150 Tooltip.DEFAULTS = { animation: true, placement: 'top', selector: false, template: '', trigger: 'hover focus', title: '', delay: 0, html: false, container: false, viewport: { selector: 'body', padding: 0 } } Tooltip.prototype.init = function (type, element, options) { this.enabled = true this.type = type this.$element = $(element) this.options = this.getOptions(options) this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport)) this.inState = { click: false, hover: false, focus: false } if (this.$element[0] instanceof document.constructor && !this.options.selector) { throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!') } var triggers = this.options.trigger.split(' ') for (var i = triggers.length; i--;) { var trigger = triggers[i] if (trigger == 'click') { this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this)) } else if (trigger != 'manual') { var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin' var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout' this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this)) } } this.options.selector ? (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : this.fixTitle() } Tooltip.prototype.getDefaults = function () { return Tooltip.DEFAULTS } Tooltip.prototype.getOptions = function (options) { options = $.extend({}, this.getDefaults(), this.$element.data(), options) if (options.delay && typeof options.delay == 'number') { options.delay = { show: options.delay, hide: options.delay } } return options } Tooltip.prototype.getDelegateOptions = function () { var options = {} var defaults = this.getDefaults() this._options && $.each(this._options, function (key, value) { if (defaults[key] != value) options[key] = value }) return options } Tooltip.prototype.enter = function (obj) { var self = obj instanceof this.constructor ? obj : $(obj.currentTarget).data('bs.' + this.type) if (!self) { self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) $(obj.currentTarget).data('bs.' + this.type, self) } if (obj instanceof $.Event) { self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true } if (self.tip().hasClass('in') || self.hoverState == 'in') { self.hoverState = 'in' return } clearTimeout(self.timeout) self.hoverState = 'in' if (!self.options.delay || !self.options.delay.show) return self.show() self.timeout = setTimeout(function () { if (self.hoverState == 'in') self.show() }, self.options.delay.show) } Tooltip.prototype.isInStateTrue = function () { for (var key in this.inState) { if (this.inState[key]) return true } return false } Tooltip.prototype.leave = function (obj) { var self = obj instanceof this.constructor ? obj : $(obj.currentTarget).data('bs.' + this.type) if (!self) { self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) $(obj.currentTarget).data('bs.' + this.type, self) } if (obj instanceof $.Event) { self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false } if (self.isInStateTrue()) return clearTimeout(self.timeout) self.hoverState = 'out' if (!self.options.delay || !self.options.delay.hide) return self.hide() self.timeout = setTimeout(function () { if (self.hoverState == 'out') self.hide() }, self.options.delay.hide) } Tooltip.prototype.show = function () { var e = $.Event('show.bs.' + this.type) if (this.hasContent() && this.enabled) { this.$element.trigger(e) var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0]) if (e.isDefaultPrevented() || !inDom) return var that = this var $tip = this.tip() var tipId = this.getUID(this.type) this.setContent() $tip.attr('id', tipId) this.$element.attr('aria-describedby', tipId) if (this.options.animation) $tip.addClass('fade') var placement = typeof this.options.placement == 'function' ? this.options.placement.call(this, $tip[0], this.$element[0]) : this.options.placement var autoToken = /\s?auto?\s?/i var autoPlace = autoToken.test(placement) if (autoPlace) placement = placement.replace(autoToken, '') || 'top' $tip .detach() .css({ top: 0, left: 0, display: 'block' }) .addClass(placement) .data('bs.' + this.type, this) this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element) this.$element.trigger('inserted.bs.' + this.type) var pos = this.getPosition() var actualWidth = $tip[0].offsetWidth var actualHeight = $tip[0].offsetHeight if (autoPlace) { var orgPlacement = placement var viewportDim = this.getPosition(this.$viewport) placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top' : placement == 'top' && pos.top - actualHeight < viewportDim.top ? 'bottom' : placement == 'right' && pos.right + actualWidth > viewportDim.width ? 'left' : placement == 'left' && pos.left - actualWidth < viewportDim.left ? 'right' : placement $tip .removeClass(orgPlacement) .addClass(placement) } var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight) this.applyPlacement(calculatedOffset, placement) var complete = function () { var prevHoverState = that.hoverState that.$element.trigger('shown.bs.' + that.type) that.hoverState = null if (prevHoverState == 'out') that.leave(that) } $.support.transition && this.$tip.hasClass('fade') ? $tip .one('bsTransitionEnd', complete) .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : complete() } } Tooltip.prototype.applyPlacement = function (offset, placement) { var $tip = this.tip() var width = $tip[0].offsetWidth var height = $tip[0].offsetHeight // manually read margins because getBoundingClientRect includes difference var marginTop = parseInt($tip.css('margin-top'), 10) var marginLeft = parseInt($tip.css('margin-left'), 10) // we must check for NaN for ie 8/9 if (isNaN(marginTop)) marginTop = 0 if (isNaN(marginLeft)) marginLeft = 0 offset.top += marginTop offset.left += marginLeft // $.fn.offset doesn't round pixel values // so we use setOffset directly with our own function B-0 $.offset.setOffset($tip[0], $.extend({ using: function (props) { $tip.css({ top: Math.round(props.top), left: Math.round(props.left) }) } }, offset), 0) $tip.addClass('in') // check to see if placing tip in new offset caused the tip to resize itself var actualWidth = $tip[0].offsetWidth var actualHeight = $tip[0].offsetHeight if (placement == 'top' && actualHeight != height) { offset.top = offset.top + height - actualHeight } var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight) if (delta.left) offset.left += delta.left else offset.top += delta.top var isVertical = /top|bottom/.test(placement) var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight' $tip.offset(offset) this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical) } Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) { this.arrow() .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%') .css(isVertical ? 'top' : 'left', '') } Tooltip.prototype.setContent = function () { var $tip = this.tip() var title = this.getTitle() $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title) $tip.removeClass('fade in top bottom left right') } Tooltip.prototype.hide = function (callback) { var that = this var $tip = $(this.$tip) var e = $.Event('hide.bs.' + this.type) function complete() { if (that.hoverState != 'in') $tip.detach() that.$element .removeAttr('aria-describedby') .trigger('hidden.bs.' + that.type) callback && callback() } this.$element.trigger(e) if (e.isDefaultPrevented()) return $tip.removeClass('in') $.support.transition && $tip.hasClass('fade') ? $tip .one('bsTransitionEnd', complete) .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : complete() this.hoverState = null return this } Tooltip.prototype.fixTitle = function () { var $e = this.$element if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') { $e.attr('data-original-title', $e.attr('title') || '').attr('title', '') } } Tooltip.prototype.hasContent = function () { return this.getTitle() } Tooltip.prototype.getPosition = function ($element) { $element = $element || this.$element var el = $element[0] var isBody = el.tagName == 'BODY' var elRect = el.getBoundingClientRect() if (elRect.width == null) { // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093 elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top }) } var elOffset = isBody ? { top: 0, left: 0 } : $element.offset() var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() } var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null return $.extend({}, elRect, scroll, outerDims, elOffset) } Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) { return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } : placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } : placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } : /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width } } Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) { var delta = { top: 0, left: 0 } if (!this.$viewport) return delta var viewportPadding = this.options.viewport && this.options.viewport.padding || 0 var viewportDimensions = this.getPosition(this.$viewport) if (/right|left/.test(placement)) { var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight if (topEdgeOffset < viewportDimensions.top) { // top overflow delta.top = viewportDimensions.top - topEdgeOffset } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset } } else { var leftEdgeOffset = pos.left - viewportPadding var rightEdgeOffset = pos.left + viewportPadding + actualWidth if (leftEdgeOffset < viewportDimensions.left) { // left overflow delta.left = viewportDimensions.left - leftEdgeOffset } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset } } return delta } Tooltip.prototype.getTitle = function () { var title var $e = this.$element var o = this.options title = $e.attr('data-original-title') || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) return title } Tooltip.prototype.getUID = function (prefix) { do prefix += ~~(Math.random() * 1000000) while (document.getElementById(prefix)) return prefix } Tooltip.prototype.tip = function () { if (!this.$tip) { this.$tip = $(this.options.template) if (this.$tip.length != 1) { throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!') } } return this.$tip } Tooltip.prototype.arrow = function () { return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')) } Tooltip.prototype.enable = function () { this.enabled = true } Tooltip.prototype.disable = function () { this.enabled = false } Tooltip.prototype.toggleEnabled = function () { this.enabled = !this.enabled } Tooltip.prototype.toggle = function (e) { var self = this if (e) { self = $(e.currentTarget).data('bs.' + this.type) if (!self) { self = new this.constructor(e.currentTarget, this.getDelegateOptions()) $(e.currentTarget).data('bs.' + this.type, self) } } if (e) { self.inState.click = !self.inState.click if (self.isInStateTrue()) self.enter(self) else self.leave(self) } else { self.tip().hasClass('in') ? self.leave(self) : self.enter(self) } } Tooltip.prototype.destroy = function () { var that = this clearTimeout(this.timeout) this.hide(function () { that.$element.off('.' + that.type).removeData('bs.' + that.type) if (that.$tip) { that.$tip.detach() } that.$tip = null that.$arrow = null that.$viewport = null }) } // TOOLTIP PLUGIN DEFINITION // ========================= function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.tooltip') var options = typeof option == 'object' && option if (!data && /destroy|hide/.test(option)) return if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options))) if (typeof option == 'string') data[option]() }) } var old = $.fn.tooltip $.fn.tooltip = Plugin $.fn.tooltip.Constructor = Tooltip // TOOLTIP NO CONFLICT // =================== $.fn.tooltip.noConflict = function () { $.fn.tooltip = old return this } }(jQuery); /* ======================================================================== * Bootstrap: popover.js v3.3.5 * http://getbootstrap.com/javascript/#popovers * ======================================================================== * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // POPOVER PUBLIC CLASS DEFINITION // =============================== var Popover = function (element, options) { this.init('popover', element, options) } if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js') Popover.VERSION = '3.3.5' Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, { placement: 'right', trigger: 'click', content: '', template: '' }) // NOTE: POPOVER EXTENDS tooltip.js // ================================ Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype) Popover.prototype.constructor = Popover Popover.prototype.getDefaults = function () { return Popover.DEFAULTS } Popover.prototype.setContent = function () { var $tip = this.tip() var title = this.getTitle() var content = this.getContent() $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title) $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text' ](content) $tip.removeClass('fade top bottom left right in') // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do // this manually by checking the contents. if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide() } Popover.prototype.hasContent = function () { return this.getTitle() || this.getContent() } Popover.prototype.getContent = function () { var $e = this.$element var o = this.options return $e.attr('data-content') || (typeof o.content == 'function' ? o.content.call($e[0]) : o.content) } Popover.prototype.arrow = function () { return (this.$arrow = this.$arrow || this.tip().find('.arrow')) } // POPOVER PLUGIN DEFINITION // ========================= function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.popover') var options = typeof option == 'object' && option if (!data && /destroy|hide/.test(option)) return if (!data) $this.data('bs.popover', (data = new Popover(this, options))) if (typeof option == 'string') data[option]() }) } var old = $.fn.popover $.fn.popover = Plugin $.fn.popover.Constructor = Popover // POPOVER NO CONFLICT // =================== $.fn.popover.noConflict = function () { $.fn.popover = old return this } }(jQuery); /* ======================================================================== * Bootstrap: scrollspy.js v3.3.5 * http://getbootstrap.com/javascript/#scrollspy * ======================================================================== * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // SCROLLSPY CLASS DEFINITION // ========================== function ScrollSpy(element, options) { this.$body = $(document.body) this.$scrollElement = $(element).is(document.body) ? $(window) : $(element) this.options = $.extend({}, ScrollSpy.DEFAULTS, options) this.selector = (this.options.target || '') + ' .nav li > a' this.offsets = [] this.targets = [] this.activeTarget = null this.scrollHeight = 0 this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this)) this.refresh() this.process() } ScrollSpy.VERSION = '3.3.5' ScrollSpy.DEFAULTS = { offset: 10 } ScrollSpy.prototype.getScrollHeight = function () { return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight) } ScrollSpy.prototype.refresh = function () { var that = this var offsetMethod = 'offset' var offsetBase = 0 this.offsets = [] this.targets = [] this.scrollHeight = this.getScrollHeight() if (!$.isWindow(this.$scrollElement[0])) { offsetMethod = 'position' offsetBase = this.$scrollElement.scrollTop() } this.$body .find(this.selector) .map(function () { var $el = $(this) var href = $el.data('target') || $el.attr('href') var $href = /^#./.test(href) && $(href) return ($href && $href.length && $href.is(':visible') && [[$href[offsetMethod]().top + offsetBase, href]]) || null }) .sort(function (a, b) { return a[0] - b[0] }) .each(function () { that.offsets.push(this[0]) that.targets.push(this[1]) }) } ScrollSpy.prototype.process = function () { var scrollTop = this.$scrollElement.scrollTop() + this.options.offset var scrollHeight = this.getScrollHeight() var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height() var offsets = this.offsets var targets = this.targets var activeTarget = this.activeTarget var i if (this.scrollHeight != scrollHeight) { this.refresh() } if (scrollTop >= maxScroll) { return activeTarget != (i = targets[targets.length - 1]) && this.activate(i) } if (activeTarget && scrollTop < offsets[0]) { this.activeTarget = null return this.clear() } for (i = offsets.length; i--;) { activeTarget != targets[i] && scrollTop >= offsets[i] && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1]) && this.activate(targets[i]) } } ScrollSpy.prototype.activate = function (target) { this.activeTarget = target this.clear() var selector = this.selector + '[data-target="' + target + '"],' + this.selector + '[href="' + target + '"]' var active = $(selector) .parents('li') .addClass('active') if (active.parent('.dropdown-menu').length) { active = active .closest('li.dropdown') .addClass('active') } active.trigger('activate.bs.scrollspy') } ScrollSpy.prototype.clear = function () { $(this.selector) .parentsUntil(this.options.target, '.active') .removeClass('active') } // SCROLLSPY PLUGIN DEFINITION // =========================== function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.scrollspy') var options = typeof option == 'object' && option if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options))) if (typeof option == 'string') data[option]() }) } var old = $.fn.scrollspy $.fn.scrollspy = Plugin $.fn.scrollspy.Constructor = ScrollSpy // SCROLLSPY NO CONFLICT // ===================== $.fn.scrollspy.noConflict = function () { $.fn.scrollspy = old return this } // SCROLLSPY DATA-API // ================== $(window).on('load.bs.scrollspy.data-api', function () { $('[data-spy="scroll"]').each(function () { var $spy = $(this) Plugin.call($spy, $spy.data()) }) }) }(jQuery); /* ======================================================================== * Bootstrap: tab.js v3.3.5 * http://getbootstrap.com/javascript/#tabs * ======================================================================== * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // TAB CLASS DEFINITION // ==================== var Tab = function (element) { // jscs:disable requireDollarBeforejQueryAssignment this.element = $(element) // jscs:enable requireDollarBeforejQueryAssignment } Tab.VERSION = '3.3.5' Tab.TRANSITION_DURATION = 150 Tab.prototype.show = function () { var $this = this.element var $ul = $this.closest('ul:not(.dropdown-menu)') var selector = $this.data('target') if (!selector) { selector = $this.attr('href') selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 } if ($this.parent('li').hasClass('active')) return var $previous = $ul.find('.active:last a') var hideEvent = $.Event('hide.bs.tab', { relatedTarget: $this[0] }) var showEvent = $.Event('show.bs.tab', { relatedTarget: $previous[0] }) $previous.trigger(hideEvent) $this.trigger(showEvent) if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return var $target = $(selector) this.activate($this.closest('li'), $ul) this.activate($target, $target.parent(), function () { $previous.trigger({ type: 'hidden.bs.tab', relatedTarget: $this[0] }) $this.trigger({ type: 'shown.bs.tab', relatedTarget: $previous[0] }) }) } Tab.prototype.activate = function (element, container, callback) { var $active = container.find('> .active') var transition = callback && $.support.transition && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length) function next() { $active .removeClass('active') .find('> .dropdown-menu > .active') .removeClass('active') .end() .find('[data-toggle="tab"]') .attr('aria-expanded', false) element .addClass('active') .find('[data-toggle="tab"]') .attr('aria-expanded', true) if (transition) { element[0].offsetWidth // reflow for transition element.addClass('in') } else { element.removeClass('fade') } if (element.parent('.dropdown-menu').length) { element .closest('li.dropdown') .addClass('active') .end() .find('[data-toggle="tab"]') .attr('aria-expanded', true) } callback && callback() } $active.length && transition ? $active .one('bsTransitionEnd', next) .emulateTransitionEnd(Tab.TRANSITION_DURATION) : next() $active.removeClass('in') } // TAB PLUGIN DEFINITION // ===================== function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.tab') if (!data) $this.data('bs.tab', (data = new Tab(this))) if (typeof option == 'string') data[option]() }) } var old = $.fn.tab $.fn.tab = Plugin $.fn.tab.Constructor = Tab // TAB NO CONFLICT // =============== $.fn.tab.noConflict = function () { $.fn.tab = old return this } // TAB DATA-API // ============ var clickHandler = function (e) { e.preventDefault() Plugin.call($(this), 'show') } $(document) .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler) .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler) }(jQuery); /* ======================================================================== * Bootstrap: affix.js v3.3.5 * http://getbootstrap.com/javascript/#affix * ======================================================================== * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // AFFIX CLASS DEFINITION // ====================== var Affix = function (element, options) { this.options = $.extend({}, Affix.DEFAULTS, options) this.$target = $(this.options.target) .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this)) .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this)) this.$element = $(element) this.affixed = null this.unpin = null this.pinnedOffset = null this.checkPosition() } Affix.VERSION = '3.3.5' Affix.RESET = 'affix affix-top affix-bottom' Affix.DEFAULTS = { offset: 0, target: window } Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) { var scrollTop = this.$target.scrollTop() var position = this.$element.offset() var targetHeight = this.$target.height() if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false if (this.affixed == 'bottom') { if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom' return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom' } var initializing = this.affixed == null var colliderTop = initializing ? scrollTop : position.top var colliderHeight = initializing ? targetHeight : height if (offsetTop != null && scrollTop <= offsetTop) return 'top' if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom' return false } Affix.prototype.getPinnedOffset = function () { if (this.pinnedOffset) return this.pinnedOffset this.$element.removeClass(Affix.RESET).addClass('affix') var scrollTop = this.$target.scrollTop() var position = this.$element.offset() return (this.pinnedOffset = position.top - scrollTop) } Affix.prototype.checkPositionWithEventLoop = function () { setTimeout($.proxy(this.checkPosition, this), 1) } Affix.prototype.checkPosition = function () { if (!this.$element.is(':visible')) return var height = this.$element.height() var offset = this.options.offset var offsetTop = offset.top var offsetBottom = offset.bottom var scrollHeight = Math.max($(document).height(), $(document.body).height()) if (typeof offset != 'object') offsetBottom = offsetTop = offset if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element) if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element) var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom) if (this.affixed != affix) { if (this.unpin != null) this.$element.css('top', '') var affixType = 'affix' + (affix ? '-' + affix : '') var e = $.Event(affixType + '.bs.affix') this.$element.trigger(e) if (e.isDefaultPrevented()) return this.affixed = affix this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null this.$element .removeClass(Affix.RESET) .addClass(affixType) .trigger(affixType.replace('affix', 'affixed') + '.bs.affix') } if (affix == 'bottom') { this.$element.offset({ top: scrollHeight - height - offsetBottom }) } } // AFFIX PLUGIN DEFINITION // ======================= function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.affix') var options = typeof option == 'object' && option if (!data) $this.data('bs.affix', (data = new Affix(this, options))) if (typeof option == 'string') data[option]() }) } var old = $.fn.affix $.fn.affix = Plugin $.fn.affix.Constructor = Affix // AFFIX NO CONFLICT // ================= $.fn.affix.noConflict = function () { $.fn.affix = old return this } // AFFIX DATA-API // ============== $(window).on('load', function () { $('[data-spy="affix"]').each(function () { var $spy = $(this) var data = $spy.data() data.offset = data.offset || {} if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom if (data.offsetTop != null) data.offset.top = data.offsetTop Plugin.call($spy, data) }) }) }(jQuery); ================================================ FILE: static/assets/js/detect.js ================================================ /** * jQuery.browser.mobile (http://detectmobilebrowser.com/) * * jQuery.browser.mobile will be true if the browser is a mobile device * **/ (function(a){(jQuery.browser=jQuery.browser||{}).mobile=/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))})(navigator.userAgent||navigator.vendor||window.opera); ================================================ FILE: static/assets/js/fastclick.js ================================================ /** * @preserve FastClick: polyfill to remove click delays on browsers with touch UIs. * * @version 0.6.11 * @codingstandard ftlabs-jsv2 * @copyright The Financial Times Limited [All Rights Reserved] * @license MIT License (see LICENSE.txt) */ /*jslint browser:true, node:true*/ /*global define, Event, Node*/ /** * Instantiate fast-clicking listeners on the specificed layer. * * @constructor * @param {Element} layer The layer to listen on */ function FastClick(layer) { 'use strict'; var oldOnClick, self = this; /** * Whether a click is currently being tracked. * * @type boolean */ this.trackingClick = false; /** * Timestamp for when when click tracking started. * * @type number */ this.trackingClickStart = 0; /** * The element being tracked for a click. * * @type EventTarget */ this.targetElement = null; /** * X-coordinate of touch start event. * * @type number */ this.touchStartX = 0; /** * Y-coordinate of touch start event. * * @type number */ this.touchStartY = 0; /** * ID of the last touch, retrieved from Touch.identifier. * * @type number */ this.lastTouchIdentifier = 0; /** * Touchmove boundary, beyond which a click will be cancelled. * * @type number */ this.touchBoundary = 10; /** * The FastClick layer. * * @type Element */ this.layer = layer; if (!layer || !layer.nodeType) { throw new TypeError('Layer must be a document node'); } /** @type function() */ this.onClick = function() { return FastClick.prototype.onClick.apply(self, arguments); }; /** @type function() */ this.onMouse = function() { return FastClick.prototype.onMouse.apply(self, arguments); }; /** @type function() */ this.onTouchStart = function() { return FastClick.prototype.onTouchStart.apply(self, arguments); }; /** @type function() */ this.onTouchMove = function() { return FastClick.prototype.onTouchMove.apply(self, arguments); }; /** @type function() */ this.onTouchEnd = function() { return FastClick.prototype.onTouchEnd.apply(self, arguments); }; /** @type function() */ this.onTouchCancel = function() { return FastClick.prototype.onTouchCancel.apply(self, arguments); }; if (FastClick.notNeeded(layer)) { return; } // Set up event handlers as required if (this.deviceIsAndroid) { layer.addEventListener('mouseover', this.onMouse, true); layer.addEventListener('mousedown', this.onMouse, true); layer.addEventListener('mouseup', this.onMouse, true); } layer.addEventListener('click', this.onClick, true); layer.addEventListener('touchstart', this.onTouchStart, false); layer.addEventListener('touchmove', this.onTouchMove, false); layer.addEventListener('touchend', this.onTouchEnd, false); layer.addEventListener('touchcancel', this.onTouchCancel, false); // Hack is required for browsers that don't support Event#stopImmediatePropagation (e.g. Android 2) // which is how FastClick normally stops click events bubbling to callbacks registered on the FastClick // layer when they are cancelled. if (!Event.prototype.stopImmediatePropagation) { layer.removeEventListener = function(type, callback, capture) { var rmv = Node.prototype.removeEventListener; if (type === 'click') { rmv.call(layer, type, callback.hijacked || callback, capture); } else { rmv.call(layer, type, callback, capture); } }; layer.addEventListener = function(type, callback, capture) { var adv = Node.prototype.addEventListener; if (type === 'click') { adv.call(layer, type, callback.hijacked || (callback.hijacked = function(event) { if (!event.propagationStopped) { callback(event); } }), capture); } else { adv.call(layer, type, callback, capture); } }; } // If a handler is already declared in the element's onclick attribute, it will be fired before // FastClick's onClick handler. Fix this by pulling out the user-defined handler function and // adding it as listener. if (typeof layer.onclick === 'function') { // Android browser on at least 3.2 requires a new reference to the function in layer.onclick // - the old one won't work if passed to addEventListener directly. oldOnClick = layer.onclick; layer.addEventListener('click', function(event) { oldOnClick(event); }, false); layer.onclick = null; } } /** * Android requires exceptions. * * @type boolean */ FastClick.prototype.deviceIsAndroid = navigator.userAgent.indexOf('Android') > 0; /** * iOS requires exceptions. * * @type boolean */ FastClick.prototype.deviceIsIOS = /iP(ad|hone|od)/.test(navigator.userAgent); /** * iOS 4 requires an exception for select elements. * * @type boolean */ FastClick.prototype.deviceIsIOS4 = FastClick.prototype.deviceIsIOS && (/OS 4_\d(_\d)?/).test(navigator.userAgent); /** * iOS 6.0(+?) requires the target element to be manually derived * * @type boolean */ FastClick.prototype.deviceIsIOSWithBadTarget = FastClick.prototype.deviceIsIOS && (/OS ([6-9]|\d{2})_\d/).test(navigator.userAgent); /** * Determine whether a given element requires a native click. * * @param {EventTarget|Element} target Target DOM element * @returns {boolean} Returns true if the element needs a native click */ FastClick.prototype.needsClick = function(target) { 'use strict'; switch (target.nodeName.toLowerCase()) { // Don't send a synthetic click to disabled inputs (issue #62) case 'button': case 'select': case 'textarea': if (target.disabled) { return true; } break; case 'input': // File inputs need real clicks on iOS 6 due to a browser bug (issue #68) if ((this.deviceIsIOS && target.type === 'file') || target.disabled) { return true; } break; case 'label': case 'video': return true; } return (/\bneedsclick\b/).test(target.className); }; /** * Determine whether a given element requires a call to focus to simulate click into element. * * @param {EventTarget|Element} target Target DOM element * @returns {boolean} Returns true if the element requires a call to focus to simulate native click. */ FastClick.prototype.needsFocus = function(target) { 'use strict'; switch (target.nodeName.toLowerCase()) { case 'textarea': return true; case 'select': return !this.deviceIsAndroid; case 'input': switch (target.type) { case 'button': case 'checkbox': case 'file': case 'image': case 'radio': case 'submit': return false; } // No point in attempting to focus disabled inputs return !target.disabled && !target.readOnly; default: return (/\bneedsfocus\b/).test(target.className); } }; /** * Send a click event to the specified element. * * @param {EventTarget|Element} targetElement * @param {Event} event */ FastClick.prototype.sendClick = function(targetElement, event) { 'use strict'; var clickEvent, touch; // On some Android devices activeElement needs to be blurred otherwise the synthetic click will have no effect (#24) if (document.activeElement && document.activeElement !== targetElement) { document.activeElement.blur(); } touch = event.changedTouches[0]; // Synthesise a click event, with an extra attribute so it can be tracked clickEvent = document.createEvent('MouseEvents'); clickEvent.initMouseEvent(this.determineEventType(targetElement), true, true, window, 1, touch.screenX, touch.screenY, touch.clientX, touch.clientY, false, false, false, false, 0, null); clickEvent.forwardedTouchEvent = true; targetElement.dispatchEvent(clickEvent); }; FastClick.prototype.determineEventType = function(targetElement) { 'use strict'; //Issue #159: Android Chrome Select Box does not open with a synthetic click event if (this.deviceIsAndroid && targetElement.tagName.toLowerCase() === 'select') { return 'mousedown'; } return 'click'; }; /** * @param {EventTarget|Element} targetElement */ FastClick.prototype.focus = function(targetElement) { 'use strict'; var length; // Issue #160: on iOS 7, some input elements (e.g. date datetime) throw a vague TypeError on setSelectionRange. These elements don't have an integer value for the selectionStart and selectionEnd properties, but unfortunately that can't be used for detection because accessing the properties also throws a TypeError. Just check the type instead. Filed as Apple bug #15122724. if (this.deviceIsIOS && targetElement.setSelectionRange && targetElement.type.indexOf('date') !== 0 && targetElement.type !== 'time') { length = targetElement.value.length; targetElement.setSelectionRange(length, length); } else { targetElement.focus(); } }; /** * Check whether the given target element is a child of a scrollable layer and if so, set a flag on it. * * @param {EventTarget|Element} targetElement */ FastClick.prototype.updateScrollParent = function(targetElement) { 'use strict'; var scrollParent, parentElement; scrollParent = targetElement.fastClickScrollParent; // Attempt to discover whether the target element is contained within a scrollable layer. Re-check if the // target element was moved to another parent. if (!scrollParent || !scrollParent.contains(targetElement)) { parentElement = targetElement; do { if (parentElement.scrollHeight > parentElement.offsetHeight) { scrollParent = parentElement; targetElement.fastClickScrollParent = parentElement; break; } parentElement = parentElement.parentElement; } while (parentElement); } // Always update the scroll top tracker if possible. if (scrollParent) { scrollParent.fastClickLastScrollTop = scrollParent.scrollTop; } }; /** * @param {EventTarget} targetElement * @returns {Element|EventTarget} */ FastClick.prototype.getTargetElementFromEventTarget = function(eventTarget) { 'use strict'; // On some older browsers (notably Safari on iOS 4.1 - see issue #56) the event target may be a text node. if (eventTarget.nodeType === Node.TEXT_NODE) { return eventTarget.parentNode; } return eventTarget; }; /** * On touch start, record the position and scroll offset. * * @param {Event} event * @returns {boolean} */ FastClick.prototype.onTouchStart = function(event) { 'use strict'; var targetElement, touch, selection; // Ignore multiple touches, otherwise pinch-to-zoom is prevented if both fingers are on the FastClick element (issue #111). if (event.targetTouches.length > 1) { return true; } targetElement = this.getTargetElementFromEventTarget(event.target); touch = event.targetTouches[0]; if (this.deviceIsIOS) { // Only trusted events will deselect text on iOS (issue #49) selection = window.getSelection(); if (selection.rangeCount && !selection.isCollapsed) { return true; } if (!this.deviceIsIOS4) { // Weird things happen on iOS when an alert or confirm dialog is opened from a click event callback (issue #23): // when the user next taps anywhere else on the page, new touchstart and touchend events are dispatched // with the same identifier as the touch event that previously triggered the click that triggered the alert. // Sadly, there is an issue on iOS 4 that causes some normal touch events to have the same identifier as an // immediately preceeding touch event (issue #52), so this fix is unavailable on that platform. if (touch.identifier === this.lastTouchIdentifier) { event.preventDefault(); return false; } this.lastTouchIdentifier = touch.identifier; // If the target element is a child of a scrollable layer (using -webkit-overflow-scrolling: touch) and: // 1) the user does a fling scroll on the scrollable layer // 2) the user stops the fling scroll with another tap // then the event.target of the last 'touchend' event will be the element that was under the user's finger // when the fling scroll was started, causing FastClick to send a click event to that layer - unless a check // is made to ensure that a parent layer was not scrolled before sending a synthetic click (issue #42). this.updateScrollParent(targetElement); } } this.trackingClick = true; this.trackingClickStart = event.timeStamp; this.targetElement = targetElement; this.touchStartX = touch.pageX; this.touchStartY = touch.pageY; // Prevent phantom clicks on fast double-tap (issue #36) if ((event.timeStamp - this.lastClickTime) < 200) { event.preventDefault(); } return true; }; /** * Based on a touchmove event object, check whether the touch has moved past a boundary since it started. * * @param {Event} event * @returns {boolean} */ FastClick.prototype.touchHasMoved = function(event) { 'use strict'; var touch = event.changedTouches[0], boundary = this.touchBoundary; if (Math.abs(touch.pageX - this.touchStartX) > boundary || Math.abs(touch.pageY - this.touchStartY) > boundary) { return true; } return false; }; /** * Update the last position. * * @param {Event} event * @returns {boolean} */ FastClick.prototype.onTouchMove = function(event) { 'use strict'; if (!this.trackingClick) { return true; } // If the touch has moved, cancel the click tracking if (this.targetElement !== this.getTargetElementFromEventTarget(event.target) || this.touchHasMoved(event)) { this.trackingClick = false; this.targetElement = null; } return true; }; /** * Attempt to find the labelled control for the given label element. * * @param {EventTarget|HTMLLabelElement} labelElement * @returns {Element|null} */ FastClick.prototype.findControl = function(labelElement) { 'use strict'; // Fast path for newer browsers supporting the HTML5 control attribute if (labelElement.control !== undefined) { return labelElement.control; } // All browsers under test that support touch events also support the HTML5 htmlFor attribute if (labelElement.htmlFor) { return document.getElementById(labelElement.htmlFor); } // If no for attribute exists, attempt to retrieve the first labellable descendant element // the list of which is defined here: http://www.w3.org/TR/html5/forms.html#category-label return labelElement.querySelector('button, input:not([type=hidden]), keygen, meter, output, progress, select, textarea'); }; /** * On touch end, determine whether to send a click event at once. * * @param {Event} event * @returns {boolean} */ FastClick.prototype.onTouchEnd = function(event) { 'use strict'; var forElement, trackingClickStart, targetTagName, scrollParent, touch, targetElement = this.targetElement; if (!this.trackingClick) { return true; } // Prevent phantom clicks on fast double-tap (issue #36) if ((event.timeStamp - this.lastClickTime) < 200) { this.cancelNextClick = true; return true; } // Reset to prevent wrong click cancel on input (issue #156). this.cancelNextClick = false; this.lastClickTime = event.timeStamp; trackingClickStart = this.trackingClickStart; this.trackingClick = false; this.trackingClickStart = 0; // On some iOS devices, the targetElement supplied with the event is invalid if the layer // is performing a transition or scroll, and has to be re-detected manually. Note that // for this to function correctly, it must be called *after* the event target is checked! // See issue #57; also filed as rdar://13048589 . if (this.deviceIsIOSWithBadTarget) { touch = event.changedTouches[0]; // In certain cases arguments of elementFromPoint can be negative, so prevent setting targetElement to null targetElement = document.elementFromPoint(touch.pageX - window.pageXOffset, touch.pageY - window.pageYOffset) || targetElement; targetElement.fastClickScrollParent = this.targetElement.fastClickScrollParent; } targetTagName = targetElement.tagName.toLowerCase(); if (targetTagName === 'label') { forElement = this.findControl(targetElement); if (forElement) { this.focus(targetElement); if (this.deviceIsAndroid) { return false; } targetElement = forElement; } } else if (this.needsFocus(targetElement)) { // Case 1: If the touch started a while ago (best guess is 100ms based on tests for issue #36) then focus will be triggered anyway. Return early and unset the target element reference so that the subsequent click will be allowed through. // Case 2: Without this exception for input elements tapped when the document is contained in an iframe, then any inputted text won't be visible even though the value attribute is updated as the user types (issue #37). if ((event.timeStamp - trackingClickStart) > 100 || (this.deviceIsIOS && window.top !== window && targetTagName === 'input')) { this.targetElement = null; return false; } this.focus(targetElement); // Select elements need the event to go through on iOS 4, otherwise the selector menu won't open. if (!this.deviceIsIOS4 || targetTagName !== 'select') { this.targetElement = null; event.preventDefault(); } return false; } if (this.deviceIsIOS && !this.deviceIsIOS4) { // Don't send a synthetic click event if the target element is contained within a parent layer that was scrolled // and this tap is being used to stop the scrolling (usually initiated by a fling - issue #42). scrollParent = targetElement.fastClickScrollParent; if (scrollParent && scrollParent.fastClickLastScrollTop !== scrollParent.scrollTop) { return true; } } // Prevent the actual click from going though - unless the target node is marked as requiring // real clicks or if it is in the whitelist in which case only non-programmatic clicks are permitted. if (!this.needsClick(targetElement)) { event.preventDefault(); this.sendClick(targetElement, event); } return false; }; /** * On touch cancel, stop tracking the click. * * @returns {void} */ FastClick.prototype.onTouchCancel = function() { 'use strict'; this.trackingClick = false; this.targetElement = null; }; /** * Determine mouse events which should be permitted. * * @param {Event} event * @returns {boolean} */ FastClick.prototype.onMouse = function(event) { 'use strict'; // If a target element was never set (because a touch event was never fired) allow the event if (!this.targetElement) { return true; } if (event.forwardedTouchEvent) { return true; } // Programmatically generated events targeting a specific element should be permitted if (!event.cancelable) { return true; } // Derive and check the target element to see whether the mouse event needs to be permitted; // unless explicitly enabled, prevent non-touch click events from triggering actions, // to prevent ghost/doubleclicks. if (!this.needsClick(this.targetElement) || this.cancelNextClick) { // Prevent any user-added listeners declared on FastClick element from being fired. if (event.stopImmediatePropagation) { event.stopImmediatePropagation(); } else { // Part of the hack for browsers that don't support Event#stopImmediatePropagation (e.g. Android 2) event.propagationStopped = true; } // Cancel the event event.stopPropagation(); event.preventDefault(); return false; } // If the mouse event is permitted, return true for the action to go through. return true; }; /** * On actual clicks, determine whether this is a touch-generated click, a click action occurring * naturally after a delay after a touch (which needs to be cancelled to avoid duplication), or * an actual click which should be permitted. * * @param {Event} event * @returns {boolean} */ FastClick.prototype.onClick = function(event) { 'use strict'; var permitted; // It's possible for another FastClick-like library delivered with third-party code to fire a click event before FastClick does (issue #44). In that case, set the click-tracking flag back to false and return early. This will cause onTouchEnd to return early. if (this.trackingClick) { this.targetElement = null; this.trackingClick = false; return true; } // Very odd behaviour on iOS (issue #18): if a submit element is present inside a form and the user hits enter in the iOS simulator or clicks the Go button on the pop-up OS keyboard the a kind of 'fake' click event will be triggered with the submit-type input element as the target. if (event.target.type === 'submit' && event.detail === 0) { return true; } permitted = this.onMouse(event); // Only unset targetElement if the click is not permitted. This will ensure that the check for !targetElement in onMouse fails and the browser's click doesn't go through. if (!permitted) { this.targetElement = null; } // If clicks are permitted, return true for the action to go through. return permitted; }; /** * Remove all FastClick's event listeners. * * @returns {void} */ FastClick.prototype.destroy = function() { 'use strict'; var layer = this.layer; if (this.deviceIsAndroid) { layer.removeEventListener('mouseover', this.onMouse, true); layer.removeEventListener('mousedown', this.onMouse, true); layer.removeEventListener('mouseup', this.onMouse, true); } layer.removeEventListener('click', this.onClick, true); layer.removeEventListener('touchstart', this.onTouchStart, false); layer.removeEventListener('touchmove', this.onTouchMove, false); layer.removeEventListener('touchend', this.onTouchEnd, false); layer.removeEventListener('touchcancel', this.onTouchCancel, false); }; /** * Check whether FastClick is needed. * * @param {Element} layer The layer to listen on */ FastClick.notNeeded = function(layer) { 'use strict'; var metaViewport; var chromeVersion; // Devices that don't support touch don't need FastClick if (typeof window.ontouchstart === 'undefined') { return true; } // Chrome version - zero for other browsers chromeVersion = +(/Chrome\/([0-9]+)/.exec(navigator.userAgent) || [,0])[1]; if (chromeVersion) { if (FastClick.prototype.deviceIsAndroid) { metaViewport = document.querySelector('meta[name=viewport]'); if (metaViewport) { // Chrome on Android with user-scalable="no" doesn't need FastClick (issue #89) if (metaViewport.content.indexOf('user-scalable=no') !== -1) { return true; } // Chrome 32 and above with width=device-width or less don't need FastClick if (chromeVersion > 31 && window.innerWidth <= window.screen.width) { return true; } } // Chrome desktop doesn't need FastClick (issue #15) } else { return true; } } // IE10 with -ms-touch-action: none, which disables double-tap-to-zoom (issue #97) if (layer.style.msTouchAction === 'none') { return true; } return false; }; /** * Factory method for creating a FastClick object * * @param {Element} layer The layer to listen on */ FastClick.attach = function(layer) { 'use strict'; return new FastClick(layer); }; if (typeof define !== 'undefined' && define.amd) { // AMD. Register as an anonymous module. define(function() { 'use strict'; return FastClick; }); } else if (typeof module !== 'undefined' && module.exports) { module.exports = FastClick.attach; module.exports.FastClick = FastClick; } else { window.FastClick = FastClick; } ================================================ FILE: static/assets/js/jquery.app.js ================================================ /** * Theme: Ubold Admin Template * Author: Coderthemes * Module/App: Main Js */ !function($) { "use strict"; var Sidemenu = function() { this.$body = $("body"), this.$openLeftBtn = $(".open-left"), this.$menuItem = $("#sidebar-menu a") }; Sidemenu.prototype.openLeftBar = function() { $("#wrapper").toggleClass("enlarged"); $("#wrapper").addClass("forced"); if($("#wrapper").hasClass("enlarged") && $("body").hasClass("fixed-left")) { $("body").removeClass("fixed-left").addClass("fixed-left-void"); } else if(!$("#wrapper").hasClass("enlarged") && $("body").hasClass("fixed-left-void")) { $("body").removeClass("fixed-left-void").addClass("fixed-left"); } if($("#wrapper").hasClass("enlarged")) { $(".left ul").removeAttr("style"); } else { $(".subdrop").siblings("ul:first").show(); } toggle_slimscroll(".slimscrollleft"); $("body").trigger("resize"); }, //menu item click Sidemenu.prototype.menuItemClick = function(e) { if(!$("#wrapper").hasClass("enlarged")){ if($(this).parent().hasClass("has_sub")) { e.preventDefault(); } if(!$(this).hasClass("subdrop")) { // hide any open menus and remove all other classes $("ul",$(this).parents("ul:first")).slideUp(350); $("a",$(this).parents("ul:first")).removeClass("subdrop"); $("#sidebar-menu .pull-right i").removeClass("md-remove").addClass("md-add"); // open our new menu and add the open class $(this).next("ul").slideDown(350); $(this).addClass("subdrop"); $(".pull-right i",$(this).parents(".has_sub:last")).removeClass("md-add").addClass("md-remove"); $(".pull-right i",$(this).siblings("ul")).removeClass("md-remove").addClass("md-add"); }else if($(this).hasClass("subdrop")) { $(this).removeClass("subdrop"); $(this).next("ul").slideUp(350); $(".pull-right i",$(this).parent()).removeClass("md-remove").addClass("md-add"); } } }, //init sidemenu Sidemenu.prototype.init = function() { var $this = this; //bind on click $(".open-left").click(function(e) { e.stopPropagation(); $this.openLeftBar(); }); // LEFT SIDE MAIN NAVIGATION $this.$menuItem.on('click', $this.menuItemClick); // NAVIGATION HIGHLIGHT & OPEN PARENT $("#sidebar-menu ul li.has_sub a.active").parents("li:last").children("a:first").addClass("active").trigger("click"); }, //init Sidemenu $.Sidemenu = new Sidemenu, $.Sidemenu.Constructor = Sidemenu }(window.jQuery), function($) { "use strict"; var FullScreen = function() { this.$body = $("body"), this.$fullscreenBtn = $("#btn-fullscreen") }; //turn on full screen // Thanks to http://davidwalsh.name/fullscreen FullScreen.prototype.launchFullscreen = function(element) { if(element.requestFullscreen) { element.requestFullscreen(); } else if(element.mozRequestFullScreen) { element.mozRequestFullScreen(); } else if(element.webkitRequestFullscreen) { element.webkitRequestFullscreen(); } else if(element.msRequestFullscreen) { element.msRequestFullscreen(); } }, FullScreen.prototype.exitFullscreen = function() { if(document.exitFullscreen) { document.exitFullscreen(); } else if(document.mozCancelFullScreen) { document.mozCancelFullScreen(); } else if(document.webkitExitFullscreen) { document.webkitExitFullscreen(); } }, //toggle screen FullScreen.prototype.toggle_fullscreen = function() { var $this = this; var fullscreenEnabled = document.fullscreenEnabled || document.mozFullScreenEnabled || document.webkitFullscreenEnabled; if(fullscreenEnabled) { if(!document.fullscreenElement && !document.mozFullScreenElement && !document.webkitFullscreenElement && !document.msFullscreenElement) { $this.launchFullscreen(document.documentElement); } else{ $this.exitFullscreen(); } } }, //init sidemenu FullScreen.prototype.init = function() { var $this = this; //bind $this.$fullscreenBtn.on('click', function() { $this.toggle_fullscreen(); }); }, //init FullScreen $.FullScreen = new FullScreen, $.FullScreen.Constructor = FullScreen }(window.jQuery), //main app module function($) { "use strict"; var App = function() { this.VERSION = "1.1.0", this.AUTHOR = "Coderthemes", this.SUPPORT = "coderthemes@gmail.com", this.pageScrollElement = "html, body", this.$body = $("body") }; //on doc load App.prototype.onDocReady = function(e) { FastClick.attach(document.body); resizefunc.push("initscrolls"); resizefunc.push("changeptype"); $('.animate-number').each(function(){ $(this).animateNumbers($(this).attr("data-value"), true, parseInt($(this).attr("data-duration"))); }); //RUN RESIZE ITEMS $(window).resize(debounce(resizeitems,100)); $("body").trigger("resize"); // right side-bar toggle $('.right-bar-toggle').on('click', function(e){ e.preventDefault(); $('#wrapper').toggleClass('right-bar-enabled'); }); }, //initilizing App.prototype.init = function() { var $this = this; //document load initialization $(document).ready($this.onDocReady); //init side bar - left $.Sidemenu.init(); //init fullscreen $.FullScreen.init(); }, $.App = new App, $.App.Constructor = App }(window.jQuery), //initializing main application module function($) { "use strict"; $.App.init(); }(window.jQuery); /* ------------ some utility functions ----------------------- */ //this full screen var toggle_fullscreen = function () { } function executeFunctionByName(functionName, context /*, args */) { var args = [].slice.call(arguments).splice(2); var namespaces = functionName.split("."); var func = namespaces.pop(); for(var i = 0; i < namespaces.length; i++) { context = context[namespaces[i]]; } return context[func].apply(this, args); } var w,h,dw,dh; var changeptype = function(){ w = $(window).width(); h = $(window).height(); dw = $(document).width(); dh = $(document).height(); if(jQuery.browser.mobile === true){ $("body").addClass("mobile").removeClass("fixed-left"); } if(!$("#wrapper").hasClass("forced")){ if(w > 990){ $("body").removeClass("smallscreen").addClass("widescreen"); $("#wrapper").removeClass("enlarged"); }else{ $("body").removeClass("widescreen").addClass("smallscreen"); $("#wrapper").addClass("enlarged"); $(".left ul").removeAttr("style"); } if($("#wrapper").hasClass("enlarged") && $("body").hasClass("fixed-left")){ $("body").removeClass("fixed-left").addClass("fixed-left-void"); }else if(!$("#wrapper").hasClass("enlarged") && $("body").hasClass("fixed-left-void")){ $("body").removeClass("fixed-left-void").addClass("fixed-left"); } } toggle_slimscroll(".slimscrollleft"); } var debounce = function(func, wait, immediate) { var timeout, result; return function() { var context = this, args = arguments; var later = function() { timeout = null; if (!immediate) result = func.apply(context, args); }; var callNow = immediate && !timeout; clearTimeout(timeout); timeout = setTimeout(later, wait); if (callNow) result = func.apply(context, args); return result; }; } function resizeitems(){ if($.isArray(resizefunc)){ for (i = 0; i < resizefunc.length; i++) { window[resizefunc[i]](); } } } function initscrolls(){ if(jQuery.browser.mobile !== true){ //SLIM SCROLL $('.slimscroller').slimscroll({ height: 'auto', size: "5px" }); $('.slimscrollleft').slimScroll({ height: 'auto', position: 'right', size: "5px", color: '#dcdcdc', wheelStep: 5 }); } } function toggle_slimscroll(item){ if($("#wrapper").hasClass("enlarged")){ $(item).css("overflow","inherit").parent().css("overflow","inherit"); $(item). siblings(".slimScrollBar").css("visibility","hidden"); }else{ $(item).css("overflow","hidden").parent().css("overflow","hidden"); $(item). siblings(".slimScrollBar").css("visibility","visible"); } } var wow = new WOW( { boxClass: 'wow', // animated element css class (default is wow) animateClass: 'animated', // animation css class (default is animated) offset: 50, // distance to the element when triggering the animation (default is 0) mobile: false // trigger animations on mobile devices (true is default) } ); wow.init(); ================================================ FILE: static/assets/js/jquery.blockUI.js ================================================ /*! * jQuery blockUI plugin * Version 2.70.0-2014.11.23 * Requires jQuery v1.7 or later * * Examples at: http://malsup.com/jquery/block/ * Copyright (c) 2007-2013 M. Alsup * Dual licensed under the MIT and GPL licenses: * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html * * Thanks to Amir-Hossein Sobhi for some excellent contributions! */ ;(function() { /*jshint eqeqeq:false curly:false latedef:false */ "use strict"; function setup($) { $.fn._fadeIn = $.fn.fadeIn; var noOp = $.noop || function() {}; // this bit is to ensure we don't call setExpression when we shouldn't (with extra muscle to handle // confusing userAgent strings on Vista) var msie = /MSIE/.test(navigator.userAgent); var ie6 = /MSIE 6.0/.test(navigator.userAgent) && ! /MSIE 8.0/.test(navigator.userAgent); var mode = document.documentMode || 0; var setExpr = $.isFunction( document.createElement('div').style.setExpression ); // global $ methods for blocking/unblocking the entire page $.blockUI = function(opts) { install(window, opts); }; $.unblockUI = function(opts) { remove(window, opts); }; // convenience method for quick growl-like notifications (http://www.google.com/search?q=growl) $.growlUI = function(title, message, timeout, onClose) { var $m = $('
'); if (title) $m.append('

'+title+'

'); if (message) $m.append('

'+message+'

'); if (timeout === undefined) timeout = 3000; // Added by konapun: Set timeout to 30 seconds if this growl is moused over, like normal toast notifications var callBlock = function(opts) { opts = opts || {}; $.blockUI({ message: $m, fadeIn : typeof opts.fadeIn !== 'undefined' ? opts.fadeIn : 700, fadeOut: typeof opts.fadeOut !== 'undefined' ? opts.fadeOut : 1000, timeout: typeof opts.timeout !== 'undefined' ? opts.timeout : timeout, centerY: false, showOverlay: false, onUnblock: onClose, css: $.blockUI.defaults.growlCSS }); }; callBlock(); var nonmousedOpacity = $m.css('opacity'); $m.mouseover(function() { callBlock({ fadeIn: 0, timeout: 30000 }); var displayBlock = $('.blockMsg'); displayBlock.stop(); // cancel fadeout if it has started displayBlock.fadeTo(300, 1); // make it easier to read the message by removing transparency }).mouseout(function() { $('.blockMsg').fadeOut(1000); }); // End konapun additions }; // plugin method for blocking element content $.fn.block = function(opts) { if ( this[0] === window ) { $.blockUI( opts ); return this; } var fullOpts = $.extend({}, $.blockUI.defaults, opts || {}); this.each(function() { var $el = $(this); if (fullOpts.ignoreIfBlocked && $el.data('blockUI.isBlocked')) return; $el.unblock({ fadeOut: 0 }); }); return this.each(function() { if ($.css(this,'position') == 'static') { this.style.position = 'relative'; $(this).data('blockUI.static', true); } this.style.zoom = 1; // force 'hasLayout' in ie install(this, opts); }); }; // plugin method for unblocking element content $.fn.unblock = function(opts) { if ( this[0] === window ) { $.unblockUI( opts ); return this; } return this.each(function() { remove(this, opts); }); }; $.blockUI.version = 2.70; // 2nd generation blocking at no extra cost! // override these in your code to change the default behavior and style $.blockUI.defaults = { // message displayed when blocking (use null for no message) message: '

Please wait...

', title: null, // title string; only used when theme == true draggable: true, // only used when theme == true (requires jquery-ui.js to be loaded) theme: false, // set to true to use with jQuery UI themes // styles for the message when blocking; if you wish to disable // these and use an external stylesheet then do this in your code: // $.blockUI.defaults.css = {}; css: { padding: 0, margin: 0, width: '30%', top: '40%', left: '35%', textAlign: 'center', color: '#000', border: '3px solid #aaa', backgroundColor:'#fff', cursor: 'wait' }, // minimal style set used when themes are used themedCSS: { width: '30%', top: '40%', left: '35%' }, // styles for the overlay overlayCSS: { backgroundColor: '#000', opacity: 0.6, cursor: 'wait' }, // style to replace wait cursor before unblocking to correct issue // of lingering wait cursor cursorReset: 'default', // styles applied when using $.growlUI growlCSS: { width: '350px', top: '10px', left: '', right: '10px', border: 'none', padding: '5px', opacity: 0.6, cursor: 'default', color: '#fff', backgroundColor: '#000', '-webkit-border-radius':'10px', '-moz-border-radius': '10px', 'border-radius': '10px' }, // IE issues: 'about:blank' fails on HTTPS and javascript:false is s-l-o-w // (hat tip to Jorge H. N. de Vasconcelos) /*jshint scripturl:true */ iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank', // force usage of iframe in non-IE browsers (handy for blocking applets) forceIframe: false, // z-index for the blocking overlay baseZ: 1000, // set these to true to have the message automatically centered centerX: true, // <-- only effects element blocking (page block controlled via css above) centerY: true, // allow body element to be stetched in ie6; this makes blocking look better // on "short" pages. disable if you wish to prevent changes to the body height allowBodyStretch: true, // enable if you want key and mouse events to be disabled for content that is blocked bindEvents: true, // be default blockUI will supress tab navigation from leaving blocking content // (if bindEvents is true) constrainTabKey: true, // fadeIn time in millis; set to 0 to disable fadeIn on block fadeIn: 200, // fadeOut time in millis; set to 0 to disable fadeOut on unblock fadeOut: 400, // time in millis to wait before auto-unblocking; set to 0 to disable auto-unblock timeout: 0, // disable if you don't want to show the overlay showOverlay: true, // if true, focus will be placed in the first available input field when // page blocking focusInput: true, // elements that can receive focus focusableElements: ':input:enabled:visible', // suppresses the use of overlay styles on FF/Linux (due to performance issues with opacity) // no longer needed in 2012 // applyPlatformOpacityRules: true, // callback method invoked when fadeIn has completed and blocking message is visible onBlock: null, // callback method invoked when unblocking has completed; the callback is // passed the element that has been unblocked (which is the window object for page // blocks) and the options that were passed to the unblock call: // onUnblock(element, options) onUnblock: null, // callback method invoked when the overlay area is clicked. // setting this will turn the cursor to a pointer, otherwise cursor defined in overlayCss will be used. onOverlayClick: null, // don't ask; if you really must know: http://groups.google.com/group/jquery-en/browse_thread/thread/36640a8730503595/2f6a79a77a78e493#2f6a79a77a78e493 quirksmodeOffsetHack: 4, // class name of the message block blockMsgClass: 'blockMsg', // if it is already blocked, then ignore it (don't unblock and reblock) ignoreIfBlocked: false }; // private data and functions follow... var pageBlock = null; var pageBlockEls = []; function install(el, opts) { var css, themedCSS; var full = (el == window); var msg = (opts && opts.message !== undefined ? opts.message : undefined); opts = $.extend({}, $.blockUI.defaults, opts || {}); if (opts.ignoreIfBlocked && $(el).data('blockUI.isBlocked')) return; opts.overlayCSS = $.extend({}, $.blockUI.defaults.overlayCSS, opts.overlayCSS || {}); css = $.extend({}, $.blockUI.defaults.css, opts.css || {}); if (opts.onOverlayClick) opts.overlayCSS.cursor = 'pointer'; themedCSS = $.extend({}, $.blockUI.defaults.themedCSS, opts.themedCSS || {}); msg = msg === undefined ? opts.message : msg; // remove the current block (if there is one) if (full && pageBlock) remove(window, {fadeOut:0}); // if an existing element is being used as the blocking content then we capture // its current place in the DOM (and current display style) so we can restore // it when we unblock if (msg && typeof msg != 'string' && (msg.parentNode || msg.jquery)) { var node = msg.jquery ? msg[0] : msg; var data = {}; $(el).data('blockUI.history', data); data.el = node; data.parent = node.parentNode; data.display = node.style.display; data.position = node.style.position; if (data.parent) data.parent.removeChild(node); } $(el).data('blockUI.onUnblock', opts.onUnblock); var z = opts.baseZ; // blockUI uses 3 layers for blocking, for simplicity they are all used on every platform; // layer1 is the iframe layer which is used to supress bleed through of underlying content // layer2 is the overlay layer which has opacity and a wait cursor (by default) // layer3 is the message content that is displayed while blocking var lyr1, lyr2, lyr3, s; if (msie || opts.forceIframe) lyr1 = $(''); else lyr1 = $(''); if (opts.theme) lyr2 = $(''); else lyr2 = $(''); if (opts.theme && full) { s = ''; } else if (opts.theme) { s = ''; } else if (full) { s = ''; } else { s = ''; } lyr3 = $(s); // if we have a message, style it if (msg) { if (opts.theme) { lyr3.css(themedCSS); lyr3.addClass('ui-widget-content'); } else lyr3.css(css); } // style the overlay if (!opts.theme /*&& (!opts.applyPlatformOpacityRules)*/) lyr2.css(opts.overlayCSS); lyr2.css('position', full ? 'fixed' : 'absolute'); // make iframe layer transparent in IE if (msie || opts.forceIframe) lyr1.css('opacity',0.0); //$([lyr1[0],lyr2[0],lyr3[0]]).appendTo(full ? 'body' : el); var layers = [lyr1,lyr2,lyr3], $par = full ? $('body') : $(el); $.each(layers, function() { this.appendTo($par); }); if (opts.theme && opts.draggable && $.fn.draggable) { lyr3.draggable({ handle: '.ui-dialog-titlebar', cancel: 'li' }); } // ie7 must use absolute positioning in quirks mode and to account for activex issues (when scrolling) var expr = setExpr && (!$.support.boxModel || $('object,embed', full ? null : el).length > 0); if (ie6 || expr) { // give body 100% height if (full && opts.allowBodyStretch && $.support.boxModel) $('html,body').css('height','100%'); // fix ie6 issue when blocked element has a border width if ((ie6 || !$.support.boxModel) && !full) { var t = sz(el,'borderTopWidth'), l = sz(el,'borderLeftWidth'); var fixT = t ? '(0 - '+t+')' : 0; var fixL = l ? '(0 - '+l+')' : 0; } // simulate fixed position $.each(layers, function(i,o) { var s = o[0].style; s.position = 'absolute'; if (i < 2) { if (full) s.setExpression('height','Math.max(document.body.scrollHeight, document.body.offsetHeight) - (jQuery.support.boxModel?0:'+opts.quirksmodeOffsetHack+') + "px"'); else s.setExpression('height','this.parentNode.offsetHeight + "px"'); if (full) s.setExpression('width','jQuery.support.boxModel && document.documentElement.clientWidth || document.body.clientWidth + "px"'); else s.setExpression('width','this.parentNode.offsetWidth + "px"'); if (fixL) s.setExpression('left', fixL); if (fixT) s.setExpression('top', fixT); } else if (opts.centerY) { if (full) s.setExpression('top','(document.documentElement.clientHeight || document.body.clientHeight) / 2 - (this.offsetHeight / 2) + (blah = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + "px"'); s.marginTop = 0; } else if (!opts.centerY && full) { var top = (opts.css && opts.css.top) ? parseInt(opts.css.top, 10) : 0; var expression = '((document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + '+top+') + "px"'; s.setExpression('top',expression); } }); } // show the message if (msg) { if (opts.theme) lyr3.find('.ui-widget-content').append(msg); else lyr3.append(msg); if (msg.jquery || msg.nodeType) $(msg).show(); } if ((msie || opts.forceIframe) && opts.showOverlay) lyr1.show(); // opacity is zero if (opts.fadeIn) { var cb = opts.onBlock ? opts.onBlock : noOp; var cb1 = (opts.showOverlay && !msg) ? cb : noOp; var cb2 = msg ? cb : noOp; if (opts.showOverlay) lyr2._fadeIn(opts.fadeIn, cb1); if (msg) lyr3._fadeIn(opts.fadeIn, cb2); } else { if (opts.showOverlay) lyr2.show(); if (msg) lyr3.show(); if (opts.onBlock) opts.onBlock.bind(lyr3)(); } // bind key and mouse events bind(1, el, opts); if (full) { pageBlock = lyr3[0]; pageBlockEls = $(opts.focusableElements,pageBlock); if (opts.focusInput) setTimeout(focus, 20); } else center(lyr3[0], opts.centerX, opts.centerY); if (opts.timeout) { // auto-unblock var to = setTimeout(function() { if (full) $.unblockUI(opts); else $(el).unblock(opts); }, opts.timeout); $(el).data('blockUI.timeout', to); } } // remove the block function remove(el, opts) { var count; var full = (el == window); var $el = $(el); var data = $el.data('blockUI.history'); var to = $el.data('blockUI.timeout'); if (to) { clearTimeout(to); $el.removeData('blockUI.timeout'); } opts = $.extend({}, $.blockUI.defaults, opts || {}); bind(0, el, opts); // unbind events if (opts.onUnblock === null) { opts.onUnblock = $el.data('blockUI.onUnblock'); $el.removeData('blockUI.onUnblock'); } var els; if (full) // crazy selector to handle odd field errors in ie6/7 els = $('body').children().filter('.blockUI').add('body > .blockUI'); else els = $el.find('>.blockUI'); // fix cursor issue if ( opts.cursorReset ) { if ( els.length > 1 ) els[1].style.cursor = opts.cursorReset; if ( els.length > 2 ) els[2].style.cursor = opts.cursorReset; } if (full) pageBlock = pageBlockEls = null; if (opts.fadeOut) { count = els.length; els.stop().fadeOut(opts.fadeOut, function() { if ( --count === 0) reset(els,data,opts,el); }); } else reset(els, data, opts, el); } // move blocking element back into the DOM where it started function reset(els,data,opts,el) { var $el = $(el); if ( $el.data('blockUI.isBlocked') ) return; els.each(function(i,o) { // remove via DOM calls so we don't lose event handlers if (this.parentNode) this.parentNode.removeChild(this); }); if (data && data.el) { data.el.style.display = data.display; data.el.style.position = data.position; data.el.style.cursor = 'default'; // #59 if (data.parent) data.parent.appendChild(data.el); $el.removeData('blockUI.history'); } if ($el.data('blockUI.static')) { $el.css('position', 'static'); // #22 } if (typeof opts.onUnblock == 'function') opts.onUnblock(el,opts); // fix issue in Safari 6 where block artifacts remain until reflow var body = $(document.body), w = body.width(), cssW = body[0].style.width; body.width(w-1).width(w); body[0].style.width = cssW; } // bind/unbind the handler function bind(b, el, opts) { var full = el == window, $el = $(el); // don't bother unbinding if there is nothing to unbind if (!b && (full && !pageBlock || !full && !$el.data('blockUI.isBlocked'))) return; $el.data('blockUI.isBlocked', b); // don't bind events when overlay is not in use or if bindEvents is false if (!full || !opts.bindEvents || (b && !opts.showOverlay)) return; // bind anchors and inputs for mouse and key events var events = 'mousedown mouseup keydown keypress keyup touchstart touchend touchmove'; if (b) $(document).bind(events, opts, handler); else $(document).unbind(events, handler); // former impl... // var $e = $('a,:input'); // b ? $e.bind(events, opts, handler) : $e.unbind(events, handler); } // event handler to suppress keyboard/mouse events when blocking function handler(e) { // allow tab navigation (conditionally) if (e.type === 'keydown' && e.keyCode && e.keyCode == 9) { if (pageBlock && e.data.constrainTabKey) { var els = pageBlockEls; var fwd = !e.shiftKey && e.target === els[els.length-1]; var back = e.shiftKey && e.target === els[0]; if (fwd || back) { setTimeout(function(){focus(back);},10); return false; } } } var opts = e.data; var target = $(e.target); if (target.hasClass('blockOverlay') && opts.onOverlayClick) opts.onOverlayClick(e); // allow events within the message content if (target.parents('div.' + opts.blockMsgClass).length > 0) return true; // allow events for content that is not being blocked return target.parents().children().filter('div.blockUI').length === 0; } function focus(back) { if (!pageBlockEls) return; var e = pageBlockEls[back===true ? pageBlockEls.length-1 : 0]; if (e) e.focus(); } function center(el, x, y) { var p = el.parentNode, s = el.style; var l = ((p.offsetWidth - el.offsetWidth)/2) - sz(p,'borderLeftWidth'); var t = ((p.offsetHeight - el.offsetHeight)/2) - sz(p,'borderTopWidth'); if (x) s.left = l > 0 ? (l+'px') : '0'; if (y) s.top = t > 0 ? (t+'px') : '0'; } function sz(el, p) { return parseInt($.css(el,p),10)||0; } } /*global define:true */ if (typeof define === 'function' && define.amd && define.amd.jQuery) { define(['jquery'], setup); } else { setup(jQuery); } })(); ================================================ FILE: static/assets/js/jquery.core.js ================================================ //portlets !function($) { "use strict"; /** Portlet Widget */ var Portlet = function() { this.$body = $("body"), this.$portletIdentifier = ".portlet", this.$portletCloser = '.portlet a[data-toggle="remove"]', this.$portletRefresher = '.portlet a[data-toggle="reload"]' }; //on init Portlet.prototype.init = function() { // Panel closest var $this = this; $(document).on("click",this.$portletCloser, function (ev) { ev.preventDefault(); var $portlet = $(this).closest($this.$portletIdentifier); var $portlet_parent = $portlet.parent(); $portlet.remove(); if ($portlet_parent.children().length == 0) { $portlet_parent.remove(); } }); // Panel Reload $(document).on("click",this.$portletRefresher, function (ev) { ev.preventDefault(); var $portlet = $(this).closest($this.$portletIdentifier); // This is just a simulation, nothing is going to be reloaded $portlet.append('
'); var $pd = $portlet.find('.panel-disabled'); setTimeout(function () { $pd.fadeOut('fast', function () { $pd.remove(); }); }, 500 + 300 * (Math.random() * 5)); }); }, // $.Portlet = new Portlet, $.Portlet.Constructor = Portlet }(window.jQuery), /** * Notifications */ function($) { "use strict"; var Notification = function() {}; //simple notificaiton Notification.prototype.notify = function(style,position, title, text) { var icon = 'fa fa-adjust'; if(style == "error"){ icon = "fa fa-exclamation"; }else if(style == "warning"){ icon = "fa fa-warning"; }else if(style == "success"){ icon = "fa fa-check"; }else if(style == "custom"){ icon = "md md-album"; }else if(style == "info"){ icon = "fa fa-question"; }else{ icon = "fa fa-adjust"; } $.notify({ title: title, text: text, image: "" }, { style: 'metro', className: style, globalPosition:position, showAnimation: "show", showDuration: 0, hideDuration: 0, autoHide: true, clickToHide: true }); }, //auto hide notification Notification.prototype.autoHideNotify = function (style,position, title, text) { var icon = "fa fa-adjust"; if(style == "error"){ icon = "fa fa-exclamation"; }else if(style == "warning"){ icon = "fa fa-warning"; }else if(style == "success"){ icon = "fa fa-check"; }else if(style == "custom"){ icon = "md md-album"; }else if(style == "info"){ icon = "fa fa-question"; }else{ icon = "fa fa-adjust"; } $.notify({ title: title, text: text, image: "" }, { style: 'metro', className: style, globalPosition:position, showAnimation: "show", showDuration: 0, hideDuration: 0, autoHideDelay: 5000, autoHide: true, clickToHide: true }); }, //confirmation notification Notification.prototype.confirm = function(style,position, title) { var icon = "fa fa-adjust"; if(style == "error"){ icon = "fa fa-exclamation"; }else if(style == "warning"){ icon = "fa fa-warning"; }else if(style == "success"){ icon = "fa fa-check"; }else if(style == "custom"){ icon = "md md-album"; }else if(style == "info"){ icon = "fa fa-question"; }else{ icon = "fa fa-adjust"; } $.notify({ title: title, text: 'Are you sure you want to do nothing?

Yes No', image: "" }, { style: 'metro', className: style, globalPosition:position, showAnimation: "show", showDuration: 0, hideDuration: 0, autoHide: false, clickToHide: false }); //listen for click events from this style $(document).on('click', '.notifyjs-metro-base .no', function() { //programmatically trigger propogating hide event $(this).trigger('notify-hide'); }); $(document).on('click', '.notifyjs-metro-base .yes', function() { //show button text alert($(this).text() + " clicked!"); //hide notification $(this).trigger('notify-hide'); }); }, //init - examples Notification.prototype.init = function() { }, //init $.Notification = new Notification, $.Notification.Constructor = Notification }(window.jQuery), /** * Components */ function($) { "use strict"; var Components = function() {}; //initializing tooltip Components.prototype.initTooltipPlugin = function() { $.fn.tooltip && $('[data-toggle="tooltip"]').tooltip() }, //initializing popover Components.prototype.initPopoverPlugin = function() { $.fn.popover && $('[data-toggle="popover"]').popover() }, //initializing custom modal Components.prototype.initCustomModalPlugin = function() { $('[data-plugin="custommodal"]').on('click', function(e) { Custombox.open({ target: $(this).attr("href"), effect: $(this).attr("data-animation"), overlaySpeed: $(this).attr("data-overlaySpeed"), overlayColor: $(this).attr("data-overlayColor") }); e.preventDefault(); }); }, //initializing nicescroll Components.prototype.initNiceScrollPlugin = function() { //You can change the color of scroll bar here $.fn.niceScroll && $(".nicescroll").niceScroll({ cursorcolor: '#98a6ad',cursorwidth:'6px', cursorborderradius: '5px'}); }, //range slider Components.prototype.initRangeSlider = function() { $.fn.slider && $('[data-plugin="range-slider"]').slider({}); }, /* ------------- * Form related controls */ //switch Components.prototype.initSwitchery = function() { $('[data-plugin="switchery"]').each(function (idx, obj) { new Switchery($(this)[0], $(this).data()); }); }, //multiselect Components.prototype.initMultiSelect = function() { if($('[data-plugin="multiselect"]').length > 0) $('[data-plugin="multiselect"]').multiSelect($(this).data()); }, /* ------------- * small charts related widgets */ //peity charts Components.prototype.initPeityCharts = function() { $('[data-plugin="peity-pie"]').each(function(idx, obj) { var colors = $(this).attr('data-colors')?$(this).attr('data-colors').split(","):[]; var width = $(this).attr('data-width')?$(this).attr('data-width'):20; //default is 20 var height = $(this).attr('data-height')?$(this).attr('data-height'):20; //default is 20 $(this).peity("pie", { fill: colors, width: width, height: height }); }); //donut $('[data-plugin="peity-donut"]').each(function(idx, obj) { var colors = $(this).attr('data-colors')?$(this).attr('data-colors').split(","):[]; var width = $(this).attr('data-width')?$(this).attr('data-width'):20; //default is 20 var height = $(this).attr('data-height')?$(this).attr('data-height'):20; //default is 20 $(this).peity("donut", { fill: colors, width: width, height: height }); }); $('[data-plugin="peity-donut-alt"]').each(function(idx, obj) { $(this).peity("donut"); }); // line $('[data-plugin="peity-line"]').each(function(idx, obj) { $(this).peity("line", $(this).data()); }); // bar $('[data-plugin="peity-bar"]').each(function(idx, obj) { var colors = $(this).attr('data-colors')?$(this).attr('data-colors').split(","):[]; var width = $(this).attr('data-width')?$(this).attr('data-width'):20; //default is 20 var height = $(this).attr('data-height')?$(this).attr('data-height'):20; //default is 20 $(this).peity("bar", { fill: colors, width: width, height: height }); }); }, //initilizing Components.prototype.init = function() { var $this = this; this.initTooltipPlugin(), this.initPopoverPlugin(), this.initNiceScrollPlugin(), this.initCustomModalPlugin(), this.initRangeSlider(), this.initSwitchery(), this.initMultiSelect(), this.initPeityCharts(), //creating portles $.Portlet.init(); }, $.Components = new Components, $.Components.Constructor = Components }(window.jQuery), //initializing main application module function($) { "use strict"; $.Components.init(); }(window.jQuery); ================================================ FILE: static/assets/js/jquery.nicescroll.js ================================================ /* jquery.nicescroll 3.5.0 InuYaksa*2013 MIT http://areaaperta.com/nicescroll */(function(e){var z=!1,E=!1,L=5E3,M=2E3,y=0,N=function(){var e=document.getElementsByTagName("script"),e=e[e.length-1].src.split("?")[0];return 0e){if(b.getScrollTop()>=b.page.maxh)return!0}else if(0>=b.getScrollTop())return!0; b.scrollmom&&b.scrollmom.stop();b.lastdeltay+=e;b.debounced("mousewheely",function(){var d=b.lastdeltay;b.lastdeltay=0;b.rail.drag||b.doScrollBy(d)},120)}d.stopImmediatePropagation();return d.preventDefault()}var b=this;this.version="3.5.0";this.name="nicescroll";this.me=c;this.opt={doc:e("body"),win:!1};e.extend(this.opt,I);this.opt.snapbackspeed=80;if(h)for(var p in b.opt)"undefined"!=typeof h[p]&&(b.opt[p]=h[p]);this.iddoc=(this.doc=b.opt.doc)&&this.doc[0]?this.doc[0].id||"":"";this.ispage=/BODY|HTML/.test(b.opt.win? b.opt.win[0].nodeName:this.doc[0].nodeName);this.haswrapper=!1!==b.opt.win;this.win=b.opt.win||(this.ispage?e(window):this.doc);this.docscroll=this.ispage&&!this.haswrapper?e(window):this.win;this.body=e("body");this.iframe=this.isfixed=this.viewport=!1;this.isiframe="IFRAME"==this.doc[0].nodeName&&"IFRAME"==this.win[0].nodeName;this.istextarea="TEXTAREA"==this.win[0].nodeName;this.forcescreen=!1;this.canshowonmouseevent="scroll"!=b.opt.autohidemode;this.page=this.view=this.onzoomout=this.onzoomin= this.onscrollcancel=this.onscrollend=this.onscrollstart=this.onclick=this.ongesturezoom=this.onkeypress=this.onmousewheel=this.onmousemove=this.onmouseup=this.onmousedown=!1;this.scroll={x:0,y:0};this.scrollratio={x:0,y:0};this.cursorheight=20;this.scrollvaluemax=0;this.observerremover=this.observer=this.scrollmom=this.scrollrunning=this.checkrtlmode=!1;do this.id="ascrail"+M++;while(document.getElementById(this.id));this.hasmousefocus=this.hasfocus=this.zoomactive=this.zoom=this.selectiondrag=this.cursorfreezed= this.cursor=this.rail=!1;this.visibility=!0;this.hidden=this.locked=!1;this.cursoractive=!0;this.overflowx=b.opt.overflowx;this.overflowy=b.opt.overflowy;this.nativescrollingarea=!1;this.checkarea=0;this.events=[];this.saved={};this.delaylist={};this.synclist={};this.lastdeltay=this.lastdeltax=0;this.detected=P();var g=e.extend({},this.detected);this.ishwscroll=(this.canhwscroll=g.hastransform&&b.opt.hwacceleration)&&b.haswrapper;this.istouchcapable=!1;g.cantouch&&(g.ischrome&&!g.isios&&!g.isandroid)&& (this.istouchcapable=!0,g.cantouch=!1);g.cantouch&&(g.ismozilla&&!g.isios&&!g.isandroid)&&(this.istouchcapable=!0,g.cantouch=!1);b.opt.enablemouselockapi||(g.hasmousecapture=!1,g.haspointerlock=!1);this.delayed=function(d,c,f,g){var e=b.delaylist[d],k=(new Date).getTime();if(!g&&e&&e.tt)return!1;e&&e.tt&&clearTimeout(e.tt);if(e&&e.last+f>k&&!e.tt)b.delaylist[d]={last:k+f,tt:setTimeout(function(){b.delaylist[d].tt=0;c.call()},f)};else if(!e||!e.tt)b.delaylist[d]={last:k,tt:0},setTimeout(function(){c.call()}, 0)};this.debounced=function(d,c,f){var g=b.delaylist[d];(new Date).getTime();b.delaylist[d]=c;g||setTimeout(function(){var c=b.delaylist[d];b.delaylist[d]=!1;c.call()},f)};this.synched=function(d,c){b.synclist[d]=c;(function(){b.onsync||(v(function(){b.onsync=!1;for(d in b.synclist){var c=b.synclist[d];c&&c.call(b);b.synclist[d]=!1}}),b.onsync=!0)})();return d};this.unsynched=function(d){b.synclist[d]&&(b.synclist[d]=!1)};this.css=function(d,c){for(var f in c)b.saved.css.push([d,f,d.css(f)]),d.css(f, c[f])};this.scrollTop=function(d){return"undefined"==typeof d?b.getScrollTop():b.setScrollTop(d)};this.scrollLeft=function(d){return"undefined"==typeof d?b.getScrollLeft():b.setScrollLeft(d)};BezierClass=function(b,c,f,g,e,k,l){this.st=b;this.ed=c;this.spd=f;this.p1=g||0;this.p2=e||1;this.p3=k||0;this.p4=l||1;this.ts=(new Date).getTime();this.df=this.ed-this.st};BezierClass.prototype={B2:function(b){return 3*b*b*(1-b)},B3:function(b){return 3*b*(1-b)*(1-b)},B4:function(b){return(1-b)*(1-b)*(1-b)}, getNow:function(){var b=1-((new Date).getTime()-this.ts)/this.spd,c=this.B2(b)+this.B3(b)+this.B4(b);return 0>b?this.ed:this.st+Math.round(this.df*c)},update:function(b,c){this.st=this.getNow();this.ed=b;this.spd=c;this.ts=(new Date).getTime();this.df=this.ed-this.st;return this}};if(this.ishwscroll){this.doc.translate={x:0,y:0,tx:"0px",ty:"0px"};g.hastranslate3d&&g.isios&&this.doc.css("-webkit-backface-visibility","hidden");var s=function(){var d=b.doc.css(g.trstyle);return d&&"matrix"==d.substr(0, 6)?d.replace(/^.*\((.*)\)$/g,"$1").replace(/px/g,"").split(/, +/):!1};this.getScrollTop=function(d){if(!d){if(d=s())return 16==d.length?-d[13]:-d[5];if(b.timerscroll&&b.timerscroll.bz)return b.timerscroll.bz.getNow()}return b.doc.translate.y};this.getScrollLeft=function(d){if(!d){if(d=s())return 16==d.length?-d[12]:-d[4];if(b.timerscroll&&b.timerscroll.bh)return b.timerscroll.bh.getNow()}return b.doc.translate.x};this.notifyScrollEvent=document.createEvent?function(b){var c=document.createEvent("UIEvents"); c.initUIEvent("scroll",!1,!0,window,1);b.dispatchEvent(c)}:document.fireEvent?function(b){var c=document.createEventObject();b.fireEvent("onscroll");c.cancelBubble=!0}:function(b,c){};g.hastranslate3d&&b.opt.enabletranslate3d?(this.setScrollTop=function(d,c){b.doc.translate.y=d;b.doc.translate.ty=-1*d+"px";b.doc.css(g.trstyle,"translate3d("+b.doc.translate.tx+","+b.doc.translate.ty+",0px)");c||b.notifyScrollEvent(b.win[0])},this.setScrollLeft=function(d,c){b.doc.translate.x=d;b.doc.translate.tx=-1* d+"px";b.doc.css(g.trstyle,"translate3d("+b.doc.translate.tx+","+b.doc.translate.ty+",0px)");c||b.notifyScrollEvent(b.win[0])}):(this.setScrollTop=function(d,c){b.doc.translate.y=d;b.doc.translate.ty=-1*d+"px";b.doc.css(g.trstyle,"translate("+b.doc.translate.tx+","+b.doc.translate.ty+")");c||b.notifyScrollEvent(b.win[0])},this.setScrollLeft=function(d,c){b.doc.translate.x=d;b.doc.translate.tx=-1*d+"px";b.doc.css(g.trstyle,"translate("+b.doc.translate.tx+","+b.doc.translate.ty+")");c||b.notifyScrollEvent(b.win[0])})}else this.getScrollTop= function(){return b.docscroll.scrollTop()},this.setScrollTop=function(d){return b.docscroll.scrollTop(d)},this.getScrollLeft=function(){return b.docscroll.scrollLeft()},this.setScrollLeft=function(d){return b.docscroll.scrollLeft(d)};this.getTarget=function(b){return!b?!1:b.target?b.target:b.srcElement?b.srcElement:!1};this.hasParent=function(b,c){if(!b)return!1;for(var f=b.target||b.srcElement||b||!1;f&&f.id!=c;)f=f.parentNode||!1;return!1!==f};var u={thin:1,medium:3,thick:5};this.getOffset=function(){if(b.isfixed)return{top:parseFloat(b.win.css("top")), left:parseFloat(b.win.css("left"))};if(!b.viewport)return b.win.offset();var d=b.win.offset(),c=b.viewport.offset();return{top:d.top-c.top+b.viewport.scrollTop(),left:d.left-c.left+b.viewport.scrollLeft()}};this.updateScrollBar=function(d){if(b.ishwscroll)b.rail.css({height:b.win.innerHeight()}),b.railh&&b.railh.css({width:b.win.innerWidth()});else{var c=b.getOffset(),f=c.top,g=c.left,f=f+l(b.win,"border-top-width",!0);b.win.outerWidth();b.win.innerWidth();var g=g+(b.rail.align?b.win.outerWidth()- l(b.win,"border-right-width")-b.rail.width:l(b.win,"border-left-width")),e=b.opt.railoffset;e&&(e.top&&(f+=e.top),b.rail.align&&e.left&&(g+=e.left));b.locked||b.rail.css({top:f,left:g,height:d?d.h:b.win.innerHeight()});b.zoom&&b.zoom.css({top:f+1,left:1==b.rail.align?g-20:g+b.rail.width+4});b.railh&&!b.locked&&(f=c.top,g=c.left,d=b.railh.align?f+l(b.win,"border-top-width",!0)+b.win.innerHeight()-b.railh.height:f+l(b.win,"border-top-width",!0),g+=l(b.win,"border-left-width"),b.railh.css({top:d,left:g, width:b.railh.width}))}};this.doRailClick=function(d,c,f){var g;b.locked||(b.cancelEvent(d),c?(c=f?b.doScrollLeft:b.doScrollTop,g=f?(d.pageX-b.railh.offset().left-b.cursorwidth/2)*b.scrollratio.x:(d.pageY-b.rail.offset().top-b.cursorheight/2)*b.scrollratio.y,c(g)):(c=f?b.doScrollLeftBy:b.doScrollBy,g=f?b.scroll.x:b.scroll.y,d=f?d.pageX-b.railh.offset().left:d.pageY-b.rail.offset().top,f=f?b.view.w:b.view.h,g>=d?c(f):c(-f)))};b.hasanimationframe=v;b.hascancelanimationframe=w;b.hasanimationframe?b.hascancelanimationframe|| (w=function(){b.cancelAnimationFrame=!0}):(v=function(b){return setTimeout(b,15-Math.floor(+new Date/1E3)%16)},w=clearInterval);this.init=function(){b.saved.css=[];if(g.isie7mobile||g.isoperamini)return!0;g.hasmstouch&&b.css(b.ispage?e("html"):b.win,{"-ms-touch-action":"none"});b.zindex="auto";b.zindex=!b.ispage&&"auto"==b.opt.zindex?k()||"auto":b.opt.zindex;!b.ispage&&"auto"!=b.zindex&&b.zindex>y&&(y=b.zindex);b.isie&&(0==b.zindex&&"auto"==b.opt.zindex)&&(b.zindex="auto");if(!b.ispage||!g.cantouch&& !g.isieold&&!g.isie9mobile){var d=b.docscroll;b.ispage&&(d=b.haswrapper?b.win:b.doc);g.isie9mobile||b.css(d,{"overflow-y":"hidden"});b.ispage&&g.isie7&&("BODY"==b.doc[0].nodeName?b.css(e("html"),{"overflow-y":"hidden"}):"HTML"==b.doc[0].nodeName&&b.css(e("body"),{"overflow-y":"hidden"}));g.isios&&(!b.ispage&&!b.haswrapper)&&b.css(e("body"),{"-webkit-overflow-scrolling":"touch"});var c=e(document.createElement("div"));c.css({position:"relative",top:0,"float":"right",width:b.opt.cursorwidth,height:"0px", "background-color":b.opt.cursorcolor,border:b.opt.cursorborder,"background-clip":"padding-box","-webkit-border-radius":b.opt.cursorborderradius,"-moz-border-radius":b.opt.cursorborderradius,"border-radius":b.opt.cursorborderradius});c.hborder=parseFloat(c.outerHeight()-c.innerHeight());b.cursor=c;var f=e(document.createElement("div"));f.attr("id",b.id);f.addClass("nicescroll-rails");var l,h,x=["left","right"],q;for(q in x)h=x[q],(l=b.opt.railpadding[h])?f.css("padding-"+h,l+"px"):b.opt.railpadding[h]= 0;f.append(c);f.width=Math.max(parseFloat(b.opt.cursorwidth),c.outerWidth())+b.opt.railpadding.left+b.opt.railpadding.right;f.css({width:f.width+"px",zIndex:b.zindex,background:b.opt.background,cursor:"default"});f.visibility=!0;f.scrollable=!0;f.align="left"==b.opt.railalign?0:1;b.rail=f;c=b.rail.drag=!1;b.opt.boxzoom&&(!b.ispage&&!g.isieold)&&(c=document.createElement("div"),b.bind(c,"click",b.doZoom),b.zoom=e(c),b.zoom.css({cursor:"pointer","z-index":b.zindex,backgroundImage:"url("+N+"zoomico.png)", height:18,width:18,backgroundPosition:"0px 0px"}),b.opt.dblclickzoom&&b.bind(b.win,"dblclick",b.doZoom),g.cantouch&&b.opt.gesturezoom&&(b.ongesturezoom=function(d){1.5d.scale&&b.doZoomOut(d);return b.cancelEvent(d)},b.bind(b.win,"gestureend",b.ongesturezoom)));b.railh=!1;if(b.opt.horizrailenabled){b.css(d,{"overflow-x":"hidden"});c=e(document.createElement("div"));c.css({position:"relative",top:0,height:b.opt.cursorwidth,width:"0px","background-color":b.opt.cursorcolor, border:b.opt.cursorborder,"background-clip":"padding-box","-webkit-border-radius":b.opt.cursorborderradius,"-moz-border-radius":b.opt.cursorborderradius,"border-radius":b.opt.cursorborderradius});c.wborder=parseFloat(c.outerWidth()-c.innerWidth());b.cursorh=c;var m=e(document.createElement("div"));m.attr("id",b.id+"-hr");m.addClass("nicescroll-rails");m.height=Math.max(parseFloat(b.opt.cursorwidth),c.outerHeight());m.css({height:m.height+"px",zIndex:b.zindex,background:b.opt.background});m.append(c); m.visibility=!0;m.scrollable=!0;m.align="top"==b.opt.railvalign?0:1;b.railh=m;b.railh.drag=!1}b.ispage?(f.css({position:"fixed",top:"0px",height:"100%"}),f.align?f.css({right:"0px"}):f.css({left:"0px"}),b.body.append(f),b.railh&&(m.css({position:"fixed",left:"0px",width:"100%"}),m.align?m.css({bottom:"0px"}):m.css({top:"0px"}),b.body.append(m))):(b.ishwscroll?("static"==b.win.css("position")&&b.css(b.win,{position:"relative"}),d="HTML"==b.win[0].nodeName?b.body:b.win,b.zoom&&(b.zoom.css({position:"absolute", top:1,right:0,"margin-right":f.width+4}),d.append(b.zoom)),f.css({position:"absolute",top:0}),f.align?f.css({right:0}):f.css({left:0}),d.append(f),m&&(m.css({position:"absolute",left:0,bottom:0}),m.align?m.css({bottom:0}):m.css({top:0}),d.append(m))):(b.isfixed="fixed"==b.win.css("position"),d=b.isfixed?"fixed":"absolute",b.isfixed||(b.viewport=b.getViewport(b.win[0])),b.viewport&&(b.body=b.viewport,!1==/fixed|relative|absolute/.test(b.viewport.css("position"))&&b.css(b.viewport,{position:"relative"})), f.css({position:d}),b.zoom&&b.zoom.css({position:d}),b.updateScrollBar(),b.body.append(f),b.zoom&&b.body.append(b.zoom),b.railh&&(m.css({position:d}),b.body.append(m))),g.isios&&b.css(b.win,{"-webkit-tap-highlight-color":"rgba(0,0,0,0)","-webkit-touch-callout":"none"}),g.isie&&b.opt.disableoutline&&b.win.attr("hideFocus","true"),g.iswebkit&&b.opt.disableoutline&&b.win.css({outline:"none"}));!1===b.opt.autohidemode?(b.autohidedom=!1,b.rail.css({opacity:b.opt.cursoropacitymax}),b.railh&&b.railh.css({opacity:b.opt.cursoropacitymax})): !0===b.opt.autohidemode||"leave"===b.opt.autohidemode?(b.autohidedom=e().add(b.rail),g.isie8&&(b.autohidedom=b.autohidedom.add(b.cursor)),b.railh&&(b.autohidedom=b.autohidedom.add(b.railh)),b.railh&&g.isie8&&(b.autohidedom=b.autohidedom.add(b.cursorh))):"scroll"==b.opt.autohidemode?(b.autohidedom=e().add(b.rail),b.railh&&(b.autohidedom=b.autohidedom.add(b.railh))):"cursor"==b.opt.autohidemode?(b.autohidedom=e().add(b.cursor),b.railh&&(b.autohidedom=b.autohidedom.add(b.cursorh))):"hidden"==b.opt.autohidemode&& (b.autohidedom=!1,b.hide(),b.locked=!1);if(g.isie9mobile)b.scrollmom=new J(b),b.onmangotouch=function(d){d=b.getScrollTop();var c=b.getScrollLeft();if(d==b.scrollmom.lastscrolly&&c==b.scrollmom.lastscrollx)return!0;var f=d-b.mangotouch.sy,g=c-b.mangotouch.sx;if(0!=Math.round(Math.sqrt(Math.pow(g,2)+Math.pow(f,2)))){var n=0>f?-1:1,e=0>g?-1:1,k=+new Date;b.mangotouch.lazy&&clearTimeout(b.mangotouch.lazy);80r?r=Math.round(r/2):r>b.page.maxh&&(r=b.page.maxh+Math.round((r-b.page.maxh)/ 2)):(0>r&&(k=r=0),r>b.page.maxh&&(r=b.page.maxh,k=0));if(b.railh&&b.railh.scrollable){var m=b.rail.drag.sl-h;b.ishwscroll&&b.opt.bouncescroll?0>m?m=Math.round(m/2):m>b.page.maxw&&(m=b.page.maxw+Math.round((m-b.page.maxw)/2)):(0>m&&(l=m=0),m>b.page.maxw&&(m=b.page.maxw,l=0))}f=!1;if(b.rail.drag.dl)f=!0,"v"==b.rail.drag.dl?m=b.rail.drag.sl:"h"==b.rail.drag.dl&&(r=b.rail.drag.st);else{var n=Math.abs(n),h=Math.abs(h),x=b.opt.directionlockdeadzone;if("v"==b.rail.drag.ck){if(n>x&&h<=0.3*n)return b.rail.drag= !1,!0;h>x&&(b.rail.drag.dl="f",e("body").scrollTop(e("body").scrollTop()))}else if("h"==b.rail.drag.ck){if(h>x&&n<=0.3*h)return b.rail.drag=!1,!0;n>x&&(b.rail.drag.dl="f",e("body").scrollLeft(e("body").scrollLeft()))}}b.synched("touchmove",function(){b.rail.drag&&2==b.rail.drag.pt&&(b.prepareTransition&&b.prepareTransition(0),b.rail.scrollable&&b.setScrollTop(r),b.scrollmom.update(l,k),b.railh&&b.railh.scrollable?(b.setScrollLeft(m),b.showCursor(r,m)):b.showCursor(r),g.isie10&&document.selection.clear())}); g.ischrome&&b.istouchcapable&&(f=!1);if(f)return b.cancelEvent(d)}}}b.onmousedown=function(d,c){if(!(b.rail.drag&&1!=b.rail.drag.pt)){if(b.locked)return b.cancelEvent(d);b.cancelScroll();b.rail.drag={x:d.clientX,y:d.clientY,sx:b.scroll.x,sy:b.scroll.y,pt:1,hr:!!c};var f=b.getTarget(d);!b.ispage&&g.hasmousecapture&&f.setCapture();b.isiframe&&!g.hasmousecapture&&(b.saved.csspointerevents=b.doc.css("pointer-events"),b.css(b.doc,{"pointer-events":"none"}));return b.cancelEvent(d)}};b.onmouseup=function(d){if(b.rail.drag&& (g.hasmousecapture&&document.releaseCapture(),b.isiframe&&!g.hasmousecapture&&b.doc.css("pointer-events",b.saved.csspointerevents),1==b.rail.drag.pt))return b.rail.drag=!1,b.cancelEvent(d)};b.onmousemove=function(d){if(b.rail.drag&&1==b.rail.drag.pt){if(g.ischrome&&0==d.which)return b.onmouseup(d);b.cursorfreezed=!0;if(b.rail.drag.hr){b.scroll.x=b.rail.drag.sx+(d.clientX-b.rail.drag.x);0>b.scroll.x&&(b.scroll.x=0);var c=b.scrollvaluemaxw;b.scroll.x>c&&(b.scroll.x=c)}else b.scroll.y=b.rail.drag.sy+ (d.clientY-b.rail.drag.y),0>b.scroll.y&&(b.scroll.y=0),c=b.scrollvaluemax,b.scroll.y>c&&(b.scroll.y=c);b.synched("mousemove",function(){b.rail.drag&&1==b.rail.drag.pt&&(b.showCursor(),b.rail.drag.hr?b.doScrollLeft(Math.round(b.scroll.x*b.scrollratio.x),b.opt.cursordragspeed):b.doScrollTop(Math.round(b.scroll.y*b.scrollratio.y),b.opt.cursordragspeed))});return b.cancelEvent(d)}};if(g.cantouch||b.opt.touchbehavior)b.onpreventclick=function(d){if(b.preventclick)return b.preventclick.tg.onclick=b.preventclick.click, b.preventclick=!1,b.cancelEvent(d)},b.bind(b.win,"mousedown",b.ontouchstart),b.onclick=g.isios?!1:function(d){return b.lastmouseup?(b.lastmouseup=!1,b.cancelEvent(d)):!0},b.opt.grabcursorenabled&&g.cursorgrabvalue&&(b.css(b.ispage?b.doc:b.win,{cursor:g.cursorgrabvalue}),b.css(b.rail,{cursor:g.cursorgrabvalue}));else{var p=function(d){if(b.selectiondrag){if(d){var c=b.win.outerHeight();d=d.pageY-b.selectiondrag.top;0=c&&(d-=c);b.selectiondrag.df=d}0!=b.selectiondrag.df&&(b.doScrollBy(2* -Math.floor(b.selectiondrag.df/6)),b.debounced("doselectionscroll",function(){p()},50))}};b.hasTextSelected="getSelection"in document?function(){return 0b.page.maxh?b.doScrollTop(b.page.maxh):(b.scroll.y=Math.round(b.getScrollTop()*(1/b.scrollratio.y)),b.scroll.x=Math.round(b.getScrollLeft()* (1/b.scrollratio.x)),b.cursoractive&&b.noticeCursor());b.scroll.y&&0==b.getScrollTop()&&b.doScrollTo(Math.floor(b.scroll.y*b.scrollratio.y));return b};this.resize=b.onResize;this.lazyResize=function(d){d=isNaN(d)?30:d;b.delayed("resize",b.resize,d);return b};this._bind=function(d,c,f,g){b.events.push({e:d,n:c,f:f,b:g,q:!1});d.addEventListener?d.addEventListener(c,f,g||!1):d.attachEvent?d.attachEvent("on"+c,f):d["on"+c]=f};this.jqbind=function(d,c,f){b.events.push({e:d,n:c,f:f,q:!0});e(d).bind(c,f)}; this.bind=function(d,c,f,e){var k="jquery"in d?d[0]:d;"mousewheel"==c?"onwheel"in b.win?b._bind(k,"wheel",f,e||!1):(d="undefined"!=typeof document.onmousewheel?"mousewheel":"DOMMouseScroll",q(k,d,f,e||!1),"DOMMouseScroll"==d&&q(k,"MozMousePixelScroll",f,e||!1)):k.addEventListener?(g.cantouch&&/mouseup|mousedown|mousemove/.test(c)&&b._bind(k,"mousedown"==c?"touchstart":"mouseup"==c?"touchend":"touchmove",function(b){if(b.touches){if(2>b.touches.length){var d=b.touches.length?b.touches[0]:b;d.original= b;f.call(this,d)}}else b.changedTouches&&(d=b.changedTouches[0],d.original=b,f.call(this,d))},e||!1),b._bind(k,c,f,e||!1),g.cantouch&&"mouseup"==c&&b._bind(k,"touchcancel",f,e||!1)):b._bind(k,c,function(d){if((d=d||window.event||!1)&&d.srcElement)d.target=d.srcElement;"pageY"in d||(d.pageX=d.clientX+document.documentElement.scrollLeft,d.pageY=d.clientY+document.documentElement.scrollTop);return!1===f.call(k,d)||!1===e?b.cancelEvent(d):!0})};this._unbind=function(b,c,f,g){b.removeEventListener?b.removeEventListener(c, f,g):b.detachEvent?b.detachEvent("on"+c,f):b["on"+c]=!1};this.unbindAll=function(){for(var d=0;d(b.newscrolly-k)*(e-k)||0>(b.newscrollx-l)*(c-l))&&b.cancelScroll();!1==b.opt.bouncescroll&&(0>e?e=0:e>b.page.maxh&&(e=b.page.maxh),0>c?c=0:c>b.page.maxw&&(c=b.page.maxw)); if(b.scrollrunning&&c==b.newscrollx&&e==b.newscrolly)return!1;b.newscrolly=e;b.newscrollx=c;b.newscrollspeed=f||!1;if(b.timer)return!1;b.timer=setTimeout(function(){var f=b.getScrollTop(),k=b.getScrollLeft(),l,h;l=c-k;h=e-f;l=Math.round(Math.sqrt(Math.pow(l,2)+Math.pow(h,2)));l=b.newscrollspeed&&1=b.newscrollspeed&&(l*=b.newscrollspeed);b.prepareTransition(l,!0);b.timerscroll&&b.timerscroll.tm&&clearInterval(b.timerscroll.tm); 0c?c=0:c>b.page.maxh&&(c=b.page.maxh);0>e?e=0:e>b.page.maxw&&(e=b.page.maxw);if(c!=b.newscrolly||e!=b.newscrollx)return b.doScrollPos(e,c,b.opt.snapbackspeed);b.onscrollend&&b.scrollrunning&&b.onscrollend.call(b,{type:"scrollend",current:{x:e,y:c},end:{x:b.newscrollx,y:b.newscrolly}});b.scrollrunning=!1}):(this.doScrollLeft=function(c,g){var f=b.scrollrunning?b.newscrolly:b.getScrollTop();b.doScrollPos(c,f,g)},this.doScrollTop=function(c, g){var f=b.scrollrunning?b.newscrollx:b.getScrollLeft();b.doScrollPos(f,c,g)},this.doScrollPos=function(c,g,f){function e(){if(b.cancelAnimationFrame)return!0;b.scrollrunning=!0;if(p=1-p)return b.timer=v(e)||1;var c=0,d=sy=b.getScrollTop();if(b.dst.ay){var d=b.bzscroll?b.dst.py+b.bzscroll.getNow()*b.dst.ay:b.newscrolly,f=d-sy;if(0>f&&db.newscrolly)d=b.newscrolly;b.setScrollTop(d);d==b.newscrolly&&(c=1)}else c=1;var g=sx=b.getScrollLeft();if(b.dst.ax){g=b.bzscroll?b.dst.px+b.bzscroll.getNow()* b.dst.ax:b.newscrollx;f=g-sx;if(0>f&&gb.newscrollx)g=b.newscrollx;b.setScrollLeft(g);g==b.newscrollx&&(c+=1)}else c+=1;2==c?(b.timer=0,b.cursorfreezed=!1,b.bzscroll=!1,b.scrollrunning=!1,0>d?d=0:d>b.page.maxh&&(d=b.page.maxh),0>g?g=0:g>b.page.maxw&&(g=b.page.maxw),g!=b.newscrollx||d!=b.newscrolly?b.doScrollPos(g,d):b.onscrollend&&b.onscrollend.call(b,{type:"scrollend",current:{x:sx,y:sy},end:{x:b.newscrollx,y:b.newscrolly}})):b.timer=v(e)||1}g="undefined"==typeof g||!1===g?b.getScrollTop(!0): g;if(b.timer&&b.newscrolly==g&&b.newscrollx==c)return!0;b.timer&&w(b.timer);b.timer=0;var k=b.getScrollTop(),l=b.getScrollLeft();(0>(b.newscrolly-k)*(g-k)||0>(b.newscrollx-l)*(c-l))&&b.cancelScroll();b.newscrolly=g;b.newscrollx=c;if(!b.bouncescroll||!b.rail.visibility)0>b.newscrolly?b.newscrolly=0:b.newscrolly>b.page.maxh&&(b.newscrolly=b.page.maxh);if(!b.bouncescroll||!b.railh.visibility)0>b.newscrollx?b.newscrollx=0:b.newscrollx>b.page.maxw&&(b.newscrollx=b.page.maxw);b.dst={};b.dst.x=c-l;b.dst.y= g-k;b.dst.px=l;b.dst.py=k;var h=Math.round(Math.sqrt(Math.pow(b.dst.x,2)+Math.pow(b.dst.y,2)));b.dst.ax=b.dst.x/h;b.dst.ay=b.dst.y/h;var m=0,q=h;0==b.dst.x?(m=k,q=g,b.dst.ay=1,b.dst.py=0):0==b.dst.y&&(m=l,q=c,b.dst.ax=1,b.dst.px=0);h=b.getTransitionSpeed(h);f&&1>=f&&(h*=f);b.bzscroll=0=b.page.maxh||l==b.page.maxw&&c>=b.page.maxw)&&b.checkContentSize();var p=1;b.cancelAnimationFrame=!1;b.timer=1; b.onscrollstart&&!b.scrollrunning&&b.onscrollstart.call(b,{type:"scrollstart",current:{x:l,y:k},request:{x:c,y:g},end:{x:b.newscrollx,y:b.newscrolly},speed:h});e();(k==b.page.maxh&&g>=k||l==b.page.maxw&&c>=l)&&b.checkContentSize();b.noticeCursor()}},this.cancelScroll=function(){b.timer&&w(b.timer);b.timer=0;b.bzscroll=!1;b.scrollrunning=!1;return b}):(this.doScrollLeft=function(c,g){var f=b.getScrollTop();b.doScrollPos(c,f,g)},this.doScrollTop=function(c,g){var f=b.getScrollLeft();b.doScrollPos(f, c,g)},this.doScrollPos=function(c,g,f){var e=c>b.page.maxw?b.page.maxw:c;0>e&&(e=0);var k=g>b.page.maxh?b.page.maxh:g;0>k&&(k=0);b.synched("scroll",function(){b.setScrollTop(k);b.setScrollLeft(e)})},this.cancelScroll=function(){});this.doScrollBy=function(c,g){var f=0,f=g?Math.floor((b.scroll.y-c)*b.scrollratio.y):(b.timer?b.newscrolly:b.getScrollTop(!0))-c;if(b.bouncescroll){var e=Math.round(b.view.h/2);f<-e?f=-e:f>b.page.maxh+e&&(f=b.page.maxh+e)}b.cursorfreezed=!1;py=b.getScrollTop(!0);if(0>f&& 0>=py)return b.noticeCursor();if(f>b.page.maxh&&py>=b.page.maxh)return b.checkContentSize(),b.noticeCursor();b.doScrollTop(f)};this.doScrollLeftBy=function(c,g){var f=0,f=g?Math.floor((b.scroll.x-c)*b.scrollratio.x):(b.timer?b.newscrollx:b.getScrollLeft(!0))-c;if(b.bouncescroll){var e=Math.round(b.view.w/2);f<-e?f=-e:f>b.page.maxw+e&&(f=b.page.maxw+e)}b.cursorfreezed=!1;px=b.getScrollLeft(!0);if(0>f&&0>=px||f>b.page.maxw&&px>=b.page.maxw)return b.noticeCursor();b.doScrollLeft(f)};this.doScrollTo= function(c,g){g&&Math.round(c*b.scrollratio.y);b.cursorfreezed=!1;b.doScrollTop(c)};this.checkContentSize=function(){var c=b.getContentSize();(c.h!=b.page.h||c.w!=b.page.w)&&b.resize(!1,c)};b.onscroll=function(c){b.rail.drag||b.cursorfreezed||b.synched("scroll",function(){b.scroll.y=Math.round(b.getScrollTop()*(1/b.scrollratio.y));b.railh&&(b.scroll.x=Math.round(b.getScrollLeft()*(1/b.scrollratio.x)));b.noticeCursor()})};b.bind(b.docscroll,"scroll",b.onscroll);this.doZoomIn=function(c){if(!b.zoomactive){b.zoomactive= !0;b.zoomrestore={style:{}};var k="position top left zIndex backgroundColor marginTop marginBottom marginLeft marginRight".split(" "),f=b.win[0].style,l;for(l in k){var h=k[l];b.zoomrestore.style[h]="undefined"!=typeof f[h]?f[h]:""}b.zoomrestore.style.width=b.win.css("width");b.zoomrestore.style.height=b.win.css("height");b.zoomrestore.padding={w:b.win.outerWidth()-b.win.width(),h:b.win.outerHeight()-b.win.height()};g.isios4&&(b.zoomrestore.scrollTop=e(window).scrollTop(),e(window).scrollTop(0)); b.win.css({position:g.isios4?"absolute":"fixed",top:0,left:0,"z-index":y+100,margin:"0px"});k=b.win.css("backgroundColor");(""==k||/transparent|rgba\(0, 0, 0, 0\)|rgba\(0,0,0,0\)/.test(k))&&b.win.css("backgroundColor","#fff");b.rail.css({"z-index":y+101});b.zoom.css({"z-index":y+102});b.zoom.css("backgroundPosition","0px -18px");b.resizeZoom();b.onzoomin&&b.onzoomin.call(b);return b.cancelEvent(c)}};this.doZoomOut=function(c){if(b.zoomactive)return b.zoomactive=!1,b.win.css("margin",""),b.win.css(b.zoomrestore.style), g.isios4&&e(window).scrollTop(b.zoomrestore.scrollTop),b.rail.css({"z-index":b.zindex}),b.zoom.css({"z-index":b.zindex}),b.zoomrestore=!1,b.zoom.css("backgroundPosition","0px 0px"),b.onResize(),b.onzoomout&&b.onzoomout.call(b),b.cancelEvent(c)};this.doZoom=function(c){return b.zoomactive?b.doZoomOut(c):b.doZoomIn(c)};this.resizeZoom=function(){if(b.zoomactive){var c=b.getScrollTop();b.win.css({width:e(window).width()-b.zoomrestore.padding.w+"px",height:e(window).height()-b.zoomrestore.padding.h+"px"}); b.onResize();b.setScrollTop(Math.min(b.page.maxh,c))}};this.init();e.nicescroll.push(this)},J=function(e){var c=this;this.nc=e;this.steptime=this.lasttime=this.speedy=this.speedx=this.lasty=this.lastx=0;this.snapy=this.snapx=!1;this.demuly=this.demulx=0;this.lastscrolly=this.lastscrollx=-1;this.timer=this.chky=this.chkx=0;this.time=function(){return+new Date};this.reset=function(e,l){c.stop();var h=c.time();c.steptime=0;c.lasttime=h;c.speedx=0;c.speedy=0;c.lastx=e;c.lasty=l;c.lastscrollx=-1;c.lastscrolly= -1};this.update=function(e,l){var h=c.time();c.steptime=h-c.lasttime;c.lasttime=h;var h=l-c.lasty,t=e-c.lastx,b=c.nc.getScrollTop(),p=c.nc.getScrollLeft(),b=b+h,p=p+t;c.snapx=0>p||p>c.nc.page.maxw;c.snapy=0>b||b>c.nc.page.maxh;c.speedx=t;c.speedy=h;c.lastx=e;c.lasty=l};this.stop=function(){c.nc.unsynched("domomentum2d");c.timer&&clearTimeout(c.timer);c.timer=0;c.lastscrollx=-1;c.lastscrolly=-1};this.doSnapy=function(e,l){var h=!1;0>l?(l=0,h=!0):l>c.nc.page.maxh&&(l=c.nc.page.maxh,h=!0);0>e?(e=0,h= !0):e>c.nc.page.maxw&&(e=c.nc.page.maxw,h=!0);h&&c.nc.doScrollPos(e,l,c.nc.opt.snapbackspeed)};this.doMomentum=function(e){var l=c.time(),h=e?l+e:c.lasttime;e=c.nc.getScrollLeft();var t=c.nc.getScrollTop(),b=c.nc.page.maxh,p=c.nc.page.maxw;c.speedx=0=l-h;if(0>t||t>b||0>e||e>p)h=!1;e=c.speedx&&h?c.speedx:!1;if(c.speedy&&h&&c.speedy||e){var g=Math.max(16,c.steptime);50s||s>p))e=0.1;if(c.speedy&&(u=Math.floor(c.lastscrolly-c.speedy*(1-c.demulxy)),c.lastscrolly=u,0>u||u>b))e=0.1;c.demulxy=Math.min(1,c.demulxy+e);c.nc.synched("domomentum2d",function(){c.speedx&&(c.nc.getScrollLeft()!=c.chkx&&c.stop(),c.chkx= s,c.nc.setScrollLeft(s));c.speedy&&(c.nc.getScrollTop()!=c.chky&&c.stop(),c.chky=u,c.nc.setScrollTop(u));c.timer||(c.nc.hideCursor(),c.doSnapy(s,u))});1>c.demulxy?c.timer=setTimeout(d,g):(c.stop(),c.nc.hideCursor(),c.doSnapy(s,u))};d()}else c.doSnapy(c.nc.getScrollLeft(),c.nc.getScrollTop())}},B=e.fn.scrollTop;e.cssHooks.pageYOffset={get:function(h,c,k){return(c=e.data(h,"__nicescroll")||!1)&&c.ishwscroll?c.getScrollTop():B.call(h)},set:function(h,c){var k=e.data(h,"__nicescroll")||!1;k&&k.ishwscroll? k.setScrollTop(parseInt(c)):B.call(h,c);return this}};e.fn.scrollTop=function(h){if("undefined"==typeof h){var c=this[0]?e.data(this[0],"__nicescroll")||!1:!1;return c&&c.ishwscroll?c.getScrollTop():B.call(this)}return this.each(function(){var c=e.data(this,"__nicescroll")||!1;c&&c.ishwscroll?c.setScrollTop(parseInt(h)):B.call(e(this),h)})};var C=e.fn.scrollLeft;e.cssHooks.pageXOffset={get:function(h,c,k){return(c=e.data(h,"__nicescroll")||!1)&&c.ishwscroll?c.getScrollLeft():C.call(h)},set:function(h, c){var k=e.data(h,"__nicescroll")||!1;k&&k.ishwscroll?k.setScrollLeft(parseInt(c)):C.call(h,c);return this}};e.fn.scrollLeft=function(h){if("undefined"==typeof h){var c=this[0]?e.data(this[0],"__nicescroll")||!1:!1;return c&&c.ishwscroll?c.getScrollLeft():C.call(this)}return this.each(function(){var c=e.data(this,"__nicescroll")||!1;c&&c.ishwscroll?c.setScrollLeft(parseInt(h)):C.call(e(this),h)})};var D=function(h){var c=this;this.length=0;this.name="nicescrollarray";this.each=function(e){for(var h= 0,k=0;h