From 3a238b776d914e73f1618bc7f021df26e48885df Mon Sep 17 00:00:00 2001
From: David Luecke
-
+
{% else %}
{{ p.title }}
{% endif %}
Feathers is built for developers that need to ship maintainable code, get prototypes out in a matter of minutes and production ready in days. Seriously.
- How is that even possible? We believe that less is more. So we built a razor thin wrapper (a few hundred lines of code) over top of Express and Socket.io, the defacto technologies for building real-time web applications using NodeJS. + How is that even possible? We believe that less is more. So we created a razor thin wrapper (a few hundred lines of code) over top of Express and Socket.io, the defacto technologies for building real-time web applications using NodeJS.
At its core Feathers is a real-time, micro-service web framework that gives you control over your data via RESTful resources, sockets and flexible plug-ins. @@ -109,47 +109,37 @@
Feathers is a very thin wrapper over top of Express and Socket.io, both of which have been used in production by thousands of companies.
-Our plug-ins are extremely flexible. Giving you only what you need and then getting out of your way.
+Because Feathers is 100% vanilla JavaScript on the backend, you get to use the same language all the way through your web stack. Less context switching.
Instantly scaffold services from the command line, providing you with full CRUD via REST and websockets in just a few key strokes.
+Feathers is a very thin wrapper over top of Express and Socket.io and works as a drop-in replacement for Express in any existing application.
Feathers is totally open source, works with any Express middleware and node module out of the box, and can be easily removed if it's not for you.
+Use any Express middleware and Hooks, which follow the same pattern, for service data-processing and authorization that works via REST and websockets.
Tired of massive JSON or YAML files? No need for that here! We value convention over configuration so you can spend more time writing code.
-We support MongoDB, Postgres, and MySQL out of the box. If that's not for you, you can easily write your own service adapters and submit a PR.
+We support MongoDB, Postgres, NeDB and MySQL out of the box. If that's not for you, you can easily write your own service adapters.
Use whatever client you want; Angular, React, Swift/ObjC, Android, it doesn't matter. We only provide some helpful guides and plug-ins to make things easier.
-Because Feathers is 100% vanilla JavaScript on the backend, you get to use the same language all the way through your web stack. Less context switching.
+Use whatever client you want; Angular, React, Swift/ObjC, Android, it doesn't matter. A few lines of code can make your frontend real-time.
No need to re-write your existing API to go real-time. Feathers can act as a real-time proxy between other APIs and your frontend.
- Meteor has amassed a large community and a lot of venture backed funding. Our biggest complaint is that because of this funding, there is some serious lock in. Meteor has it's own package system, how you use npm modules can be inconsistent, and there really is a lot of code for what it is doing. There is also the risk that when investors start pushing for a return on their investment, it could negatively impact the community. + Meteor has amassed a large community and a lot of venture backed funding. Our biggest complaint is that because of this funding, there is some serious lock in. Meteor has it's own package system, how you use npm modules can be inconsistent and it is a large codebase. There is also the risk that when investors start pushing for a return on their investment, it could negatively impact the community.
From a feature standpoint Feathers is pretty similar to Meteor. You get real-time API's from both. However, we let you use the defacto npm for managing dependencies, we let you choose whether you want to use Webpack, Gulp, Grunt, or any other tool for managing assets, and Feathers is completely client agnostic without any additional overhead. Everything is open, flexible and pluggable. You use only what you need. @@ -184,7 +174,7 @@
- Even though they have feature parity, Feathers achieves this with MUCH less code, which means less stuff to break and maintain. We also don't assume how you want to manage your assets by letting you use your build tool of choice. Feathers provides lightweight services and hooks instead of a bulky ORM, and we let you write code instead of long config files to define relationships and security policies. + Even though the features are very similar, Feathers achieves this with MUCH less code, which means less stuff to break and maintain. We also don't assume how you want to manage your assets by letting you use your build tool of choice. Feathers provides lightweight services and hooks instead of a full-blown ORM, and we let you write code instead of long config files to define relationships and security policies.
- Express is awesome! It does much of the heavy lifting behind Feathers; routing, content-negotiation, middleware support, etc. However, you still need to implement a lot yourself. + Express is awesome! It does much of the heavy lifting behind Feathers; routing, content-negotiation, middleware support, etc. In fact, you can simply replace Express with Feathers in any existing application and start adding your own microservices.
- Feathers eliminates a lot of the common boilerplate and gives you helpful plug-ins to make implementing common features easily, while also providing some convention. This includes stuff like managing permissions, CRUD for multiple databases, and real-time APIs using web sockets. We give you just enough to build your web app quickly but get out of your way when you need to customize something. + Feathers eliminates a lot of the common boilerplate and gives you helpful plug-ins to make implementing common features easier, while also providing some convention. This includes stuff like managing permissions, CRUD for multiple databases, and real-time APIs using web sockets. Just like Express, Feathers gives you just enough to build your web app quickly but gets out of your way when you need to customize something.
Use any Express middleware and Hooks, which follow the same pattern, for service data-processing and authorization that works via REST and websockets.
+Use any Express middleware and Hooks, which follow the same pattern, for service data-processing and authorization that works both via REST and websockets.
- From a feature standpoint Feathers and Sails are probably the closest. Both provide real-time REST API's, multiple db support, and are client agnostic. Both frameworks also wrap Express, but Feathers supports Express 4, while Sails only supports Express 3. + From a feature standpoint Feathers and Sails are probably the closest. Both provide real-time REST API's, multiple db support, and are client agnostic. Both frameworks also use Express, but Feathers supports Express 4 (and the latest version in a branch), while Sails only supports Express 3.
Even though the features are very similar, Feathers achieves this with MUCH less code, which means less stuff to break and maintain. We also don't assume how you want to manage your assets by letting you use your build tool of choice. Feathers provides lightweight services and hooks instead of a full-blown ORM, and we let you write code instead of long config files to define relationships and security policies. @@ -187,7 +187,7 @@
- Express is awesome! It does much of the heavy lifting behind Feathers; routing, content-negotiation, middleware support, etc. In fact, you can simply replace Express with Feathers in any existing application and start adding your own microservices. + Express is awesome! It does much of the heavy lifting behind Feathers; routing, content-negotiation, middleware support, etc. In fact, you can simply replace Express with Feathers in any existing application and start adding new microservices.
Feathers eliminates a lot of the common boilerplate and gives you helpful plug-ins to make implementing common features easier, while also providing some convention. This includes stuff like managing permissions, CRUD for multiple databases, and real-time APIs using web sockets. Just like Express, Feathers gives you just enough to build your web app quickly but gets out of your way when you need to customize something. diff --git a/_less/common/sidebar.less b/_less/common/sidebar.less index 8885e68d2b..7cebe5f00a 100644 --- a/_less/common/sidebar.less +++ b/_less/common/sidebar.less @@ -2,7 +2,7 @@ position: fixed; top: 80px; height: 100%; - width: 263px; + width: 220px; // padding-top: 20px; overflow: auto; padding-bottom: 100px; diff --git a/_less/feathers.less b/_less/feathers.less index c11f2f3737..8cb286ef45 100644 --- a/_less/feathers.less +++ b/_less/feathers.less @@ -146,11 +146,14 @@ section { } #todo-example { + input[type="text"] { margin: 10px 0; } ul.todos { + height: 320px; + li { padding: 5px 0; @@ -161,9 +164,22 @@ section { span { margin-left: 5px; } + + &.done label { + text-decoration: line-through; + color: #998; + } + + .delete { + font-weight: bold; + } } } + label { + float: left; + } + .primary-button { width: 100%; } diff --git a/css/feathers.min.css b/css/feathers.min.css index bdc4ac7886..bb62fca957 100644 --- a/css/feathers.min.css +++ b/css/feathers.min.css @@ -1,4 +1,4 @@ .hll{background-color:#ffc}.c{color:#998;font-style:italic}.err{color:#a61717;background-color:#e3d2d2}.k{color:#000;font-weight:bold}.o{color:#000;font-weight:bold}.cm{color:#998;font-style:italic}.cp{color:#999;font-weight:bold;font-style:italic}.c1{color:#998;font-style:italic}.cs{color:#999;font-weight:bold;font-style:italic}.gd{color:#000;background-color:#fdd}.ge{color:#000;font-style:italic}.gr{color:#a00}.gh{color:#999}.gi{color:#000;background-color:#dfd}.go{color:#888}.gp{color:#555}.gs{font-weight:bold}.gu{color:#aaa}.gt{color:#a00}.kc{color:#000;font-weight:bold}.kd{color:#000;font-weight:bold}.kn{color:#000;font-weight:bold}.kp{color:#000;font-weight:bold}.kr{color:#000;font-weight:bold}.kt{color:#458;font-weight:bold}.m{color:#099}.s{color:#d01040}.na{color:#008080}.nb{color:#0086b3}.nc{color:#458;font-weight:bold}.no{color:#008080}.nd{color:#3c5d5d;font-weight:bold}.ni{color:#800080}.ne{color:#900;font-weight:bold}.nf{color:#900;font-weight:bold}.nl{color:#900;font-weight:bold}.nn{color:#555}.nt{color:#000080}.nv{color:#008080}.ow{color:#000;font-weight:bold}.w{color:#bbb}.mf{color:#099}.mh{color:#099}.mi{color:#099}.mo{color:#099}.sb{color:#d01040}.sc{color:#d01040}.sd{color:#d01040}.s2{color:#d01040}.se{color:#d01040}.sh{color:#d01040}.si{color:#d01040}.sx{color:#d01040}.sr{color:#009926}.s1{color:#d01040}.ss{color:#990073}.bp{color:#999}.vc{color:#008080}.vg{color:#008080}.vi{color:#008080}.il{color:#099}/*! * Font Awesome 4.3.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:'FontAwesome';src:url('/fonts/fontawesome-webfont.eot?v=4.3.0');src:url('/fonts/fontawesome-webfont.eot?#iefix&v=4.3.0') format('embedded-opentype'),url('/fonts/fontawesome-webfont.woff2?v=4.3.0') format('woff2'),url('/fonts/fontawesome-webfont.woff?v=4.3.0') format('woff'),url('/fonts/fontawesome-webfont.ttf?v=4.3.0') format('truetype'),url('/fonts/fontawesome-webfont.svg?v=4.3.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;transform:translate(0,0)}.fa-lg{font-size:1.3333333333333333em;line-height:.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.2857142857142858em;text-align:center}.fa-ul{padding-left:0;margin-left:2.142857142857143em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.142857142857143em;width:2.142857142857143em;top:.14285714285714285em;text-align:center}.fa-li.fa-lg{left:-1.8571428571428572em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.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:#fff}.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-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-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-genderless:before,.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-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-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"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}html,button,input,select,textarea{font-family:sans-serif}body,form,fieldset,legend,input,select,textarea,button{margin:0}html{font-size:100%}body{font-family:sans-serif;font-size:16px;font-size:1rem;line-height:21px;line-height:1.3125rem;color:#434343;background-color:#fff;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}b,strong{font-weight:700}i,em,.em{font-style:italic}a{color:#669fcf}a:hover{text-decoration:none}a:focus{outline:0}a:active,a:hover{outline:0}p{margin:0 0 1.6em 0}pre{margin:1em 0}ul+p,ul+pre,ol+p,ol+pre{margin-top:0}small{font-size:80%}abbr[title]{border-bottom:1px dotted}audio,canvas,video{display:inline-block;*zoom:1;*display:inline}audio:not([controls]){display:none;height:0}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}dfn{font-style:italic}img{border:0;-ms-interpolation-mode:bicubic}svg:not(:root){overflow:hidden}figure{margin:0}.image-left{margin-right:20px}.image-right{margin-left:20px}h1,h2,h3,h4,h5,h6{line-height:normal;font-weight:normal;margin:0 0 .33em 0}h1,.h1{font-size:40px;font-size:2.5rem}h2,.h2{font-size:32px;font-size:2rem}h3,.h3{font-size:26px;font-size:1.625rem}h4,.h4{font-size:20px;font-size:1.25rem}h5,.h5{font-size:18px;font-size:1.125rem}h6,.h6{font-size:16px;font-size:1rem}.no-style-heading{margin:0;font-size:100%}hr{border:0;background:0;outline:0;background-color:#ddd;margin:2em 0;*margin:1em 0;-moz-box-sizing:content-box;box-sizing:content-box;height:1px}blockquote{font-size:22px;font-size:1.375rem;line-height:32px;line-height:2rem;color:#434343;margin:1em 0;font-style:italic}blockquote p{margin:1em 0}cite{color:#434343;font-style:normal;font-weight:normal;font-size:16px;font-size:1rem;line-height:normal}q{font-style:italic;quotes:none}q:before,q:after{content:'';content:none}mark{background:#ff0;color:#111}code,kbd,pre,samp{word-wrap:break-word;font-family:'courier new',monospace,serif;font-size:13px;font-size:.8125rem;line-height:normal;font-weight:normal;background-color:#f1f1f1;padding:10px}code{color:#111}dl,menu,ol,ul{margin:1em 0}dd,ul ul,ol ol,ul ol,ol ul{margin:0}dt{font-weight:normal}dd{margin-bottom:1em}menu,ol,ul{padding:0 0 0 22px}nav ul,nav ol{list-style:none;list-style-image:none}.unstyled-list{list-style:none;padding:0;margin:0}.unstyled-list li{margin-top:0;margin-bottom:0}.inline-list{list-style:none;padding:0;margin:0;display:inline-block;*zoom:1;*display:inline}.inline-list li{margin-top:0;margin-bottom:0}.inline-list li{display:inline-block;*zoom:1;*display:inline}table{width:100%;margin:1em 0;table-layout:fixed;border-collapse:collapse;border-spacing:0;border-right:1px solid #f1f1f1;border-bottom:1px solid #f1f1f1;word-wrap:break-word;-ms-word-wrap:break-word;*white-space:normal}table th,table td{padding:8px;text-align:left;vertical-align:top;border-top:1px solid #eee;border-left:1px solid #eee}table thead th,table tfoot th{vertical-align:bottom;font-weight:normal;background-color:#f1f1f1;color:#333}table caption{padding:8px;font-style:normal;text-align:left;font-weight:normal;border-bottom:0}fieldset{border:0;padding:0}legend{border:0;padding:0;white-space:normal;*margin-left:-7px;font-weight:normal}label{margin:0;cursor:pointer}button,input,select,textarea{font-size:100%;vertical-align:baseline;*vertical-align:middle}input[type=text],input[type=password],input[type=email],input[type=search],input[type=tel],textarea{padding:5px;-webkit-appearance:none;-moz-appearance:none;font-weight:normal;line-height:normal;background-color:#fff;border:1px solid #ccc;color:#111}input[type=checkbox],input[type=radio]{cursor:pointer;box-sizing:border-box;line-height:normal;margin:0;padding:0;*height:13px;*width:13px}.checkbox{display:block;margin:.2em 0}.checkbox input[type=checkbox],.checkbox input[type=radio]{margin-top:.05em;float:left}.checkbox label{padding-left:5px;overflow:hidden;display:table;*zoom:1}button,input{line-height:normal}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer;*overflow:visible}button[disabled],html input[disabled]{cursor:default}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top;resize:none}.button{border:0;padding:1em 3em;background-color:#e74b3c;color:#fff;text-decoration:none;text-align:center;display:inline-block;*zoom:1;*display:inline;position:relative}.button:hover{background-color:#fc5547}.button:active{top:1px}.grey-button{background-color:#eee;color:#434343}.grey-button:hover{background-color:#f1f1f1}.button[disabled],.button.disabled{color:#999;background-color:#f1f1f1}.unstyled-button{font-size:16px;font-size:1rem;color:#27ae61;text-decoration:underline;border:0;background:transparent;height:auto;padding:0;cursor:pointer;outline:0}.unstyled-button:hover{text-decoration:none}.unstyled-button[disabled],.unstyled-button.disabled{text-decoration:none;color:#999;background-color:#ccc}.section{position:relative}.container{max-width:960px;margin-left:auto;margin-right:auto;padding-left:10px;padding-right:10px}.container-full{max-width:960px;margin-left:auto;margin-right:auto}.col{float:left;padding-left:10px;padding-right:10px}[class*="pull-"],[class*="push-"]{position:relative}.no-gutter{padding-left:0;padding-right:0}.col-1{width:8.33333%;width:calc(8.333333333333334%);width:-webkit-calc(8.333333333333334%);width:-moz-calc(8.333333333333334%)}.col-2{width:16.66667%;width:calc(16.666666666666668%);width:-webkit-calc(16.666666666666668%);width:-moz-calc(16.666666666666668%)}.col-3{width:25%;width:calc(25%);width:-webkit-calc(25%);width:-moz-calc(25%)}.col-4{width:33.33333%;width:calc(33.333333333333336%);width:-webkit-calc(33.333333333333336%);width:-moz-calc(33.333333333333336%)}.col-5{width:41.66665%;width:calc(41.66666666666667%);width:-webkit-calc(41.66666666666667%);width:-moz-calc(41.66666666666667%)}.col-6{width:50%;width:calc(50%);width:-webkit-calc(50%);width:-moz-calc(50%)}.col-7{width:58.33333%;width:calc(58.333333333333336%);width:-webkit-calc(58.333333333333336%);width:-moz-calc(58.333333333333336%)}.col-8{width:66.66666%;width:calc(66.66666666666667%);width:-webkit-calc(66.66666666666667%);width:-moz-calc(66.66666666666667%)}.col-9{width:75%;width:calc(75%);width:-webkit-calc(75%);width:-moz-calc(75%)}.col-10{width:83.33333%;width:calc(83.33333333333334%);width:-webkit-calc(83.33333333333334%);width:-moz-calc(83.33333333333334%)}.col-11{width:91.66666%;width:calc(91.66666666666667%);width:-webkit-calc(91.66666666666667%);width:-moz-calc(91.66666666666667%)}.col-12{width:100%}.col-1-2{width:50%;width:calc(50%);width:-webkit-calc(50%);width:-moz-calc(50%)}.col-1-3{width:33.33333%;width:calc(33.333333333333336%);width:-webkit-calc(33.333333333333336%);width:-moz-calc(33.333333333333336%)}.col-1-4{width:25%;width:calc(25%);width:-webkit-calc(25%);width:-moz-calc(25%)}.col-3-4{width:75%;width:calc(75%);width:-webkit-calc(75%);width:-moz-calc(75%)}.push-1{left:8.33333%;left:calc(8.333333333333334%);left:-webkit-calc(8.333333333333334%);left:-moz-calc(8.333333333333334%)}.pull-1{left:-8.33333%;left:calc(-8.333333333333334%);left:-webkit-calc(-8.333333333333334%);left:-moz-calc(-8.333333333333334%)}.push-2{left:16.66667%;left:calc(16.666666666666668%);left:-webkit-calc(16.666666666666668%);left:-moz-calc(16.666666666666668%)}.pull-2{left:-16.66667%;left:calc(-16.666666666666668%);left:-webkit-calc(-16.666666666666668%);left:-moz-calc(-16.666666666666668%)}.push-3{left:25%;left:calc(25%);left:-webkit-calc(25%);left:-moz-calc(25%)}.pull-3{left:-25%;left:calc(-25%);left:-webkit-calc(-25%);left:-moz-calc(-25%)}.push-4{left:33.33333%;left:calc(33.333333333333336%);left:-webkit-calc(33.333333333333336%);left:-moz-calc(33.333333333333336%)}.pull-4{left:-33.33333%;left:calc(-33.333333333333336%);left:-webkit-calc(-33.333333333333336%);left:-moz-calc(-33.333333333333336%)}.push-5{left:41.66665%;left:calc(41.66666666666667%);left:-webkit-calc(41.66666666666667%);left:-moz-calc(41.66666666666667%)}.pull-5{left:-41.66665%;left:calc(-41.66666666666667%);left:-webkit-calc(-41.66666666666667%);left:-moz-calc(-41.66666666666667%)}.push-6{left:50%;left:calc(50%);left:-webkit-calc(50%);left:-moz-calc(50%)}.pull-6{left:-50%;left:calc(-50%);left:-webkit-calc(-50%);left:-moz-calc(-50%)}.push-7{left:58.33333%;left:calc(58.333333333333336%);left:-webkit-calc(58.333333333333336%);left:-moz-calc(58.333333333333336%)}.pull-7{left:-58.33333%;left:calc(-58.333333333333336%);left:-webkit-calc(-58.333333333333336%);left:-moz-calc(-58.333333333333336%)}.push-8{left:66.66666%;left:calc(66.66666666666667%);left:-webkit-calc(66.66666666666667%);left:-moz-calc(66.66666666666667%)}.pull-8{left:-66.66666%;left:calc(-66.66666666666667%);left:-webkit-calc(-66.66666666666667%);left:-moz-calc(-66.66666666666667%)}.push-9{left:75%;left:calc(75%);left:-webkit-calc(75%);left:-moz-calc(75%)}.pull-9{left:-75%;left:calc(-75%);left:-webkit-calc(-75%);left:-moz-calc(-75%)}.push-10{left:83.33333%;left:calc(83.33333333333334%);left:-webkit-calc(83.33333333333334%);left:-moz-calc(83.33333333333334%)}.pull-10{left:-83.33333%;left:calc(-83.33333333333334%);left:-webkit-calc(-83.33333333333334%);left:-moz-calc(-83.33333333333334%)}.push-11{left:91.66666%;left:calc(91.66666666666667%);left:-webkit-calc(91.66666666666667%);left:-moz-calc(91.66666666666667%)}.pull-11{left:-91.66666%;left:calc(-91.66666666666667%);left:-webkit-calc(-91.66666666666667%);left:-moz-calc(-91.66666666666667%)}.row{padding-top:1em;padding-bottom:1em}.clear:before,.clear:after{content:"";display:table}.clear:after{clear:both}.clear{zoom:1}.left{float:left}.right{float:right}.block{display:block}.inline{display:inline}.inline-block{display:inline-block;*zoom:1;*display:inline}.none,.hidden,[hidden],.no-desktop{display:none}.heavy{font-weight:900}.strong{font-weight:700}.normal{font-weight:normal}.thin{font-weight:300}.fine{font-weight:100}.italic{font-style:italic}.capitalize{text-transform:capitalize}.uppercase{text-transform:uppercase}.left-text{text-align:left}.right-text{text-align:right}.center-text{text-align:center}.justify-text{text-align:justify}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;overflow:hidden;padding:0;position:absolute;width:1px;left:-9999em}.visuallyvisible{clip:auto;width:auto;height:auto;overflow:visible;left:0}.no-margin{margin:0}.no-padding{padding:0}@media only screen and (min-width:740px) and (max-width:960px){.container,.tablet-container{max-width:960px;padding-left:20px;padding-right:20px;margin-left:auto;margin-right:auto;float:none}.container:first-child,.tablet-container:first-child{margin-left:auto}.tablet-container-full{padding-left:0;padding-right:0;margin-left:auto;margin-right:auto;float:none}.tablet-container-full:first-child{margin-left:auto}.tablet-no-gutter{padding-left:0;padding-right:0}.tablet-col-1{width:8.33333%;width:calc(8.333333333333334%);width:-webkit-calc(8.333333333333334%);width:-moz-calc(8.333333333333334%)}.tablet-col-2{width:16.66667%;width:calc(16.666666666666668%);width:-webkit-calc(16.666666666666668%);width:-moz-calc(16.666666666666668%)}.tablet-col-3{width:25%;width:calc(25%);width:-webkit-calc(25%);width:-moz-calc(25%)}.tablet-col-4{width:33.33333%;width:calc(33.333333333333336%);width:-webkit-calc(33.333333333333336%);width:-moz-calc(33.333333333333336%)}.tablet-col-5{width:41.66665%;width:calc(41.66666666666667%);width:-webkit-calc(41.66666666666667%);width:-moz-calc(41.66666666666667%)}.tablet-col-6{width:50%;width:calc(50%);width:-webkit-calc(50%);width:-moz-calc(50%)}.tablet-col-7{width:58.33333%;width:calc(58.333333333333336%);width:-webkit-calc(58.333333333333336%);width:-moz-calc(58.333333333333336%)}.tablet-col-8{width:66.66666%;width:calc(66.66666666666667%);width:-webkit-calc(66.66666666666667%);width:-moz-calc(66.66666666666667%)}.tablet-col-9{width:75%;width:calc(75%);width:-webkit-calc(75%);width:-moz-calc(75%)}.tablet-col-10{width:83.33333%;width:calc(83.33333333333334%);width:-webkit-calc(83.33333333333334%);width:-moz-calc(83.33333333333334%)}.tablet-col-11{width:91.66666%;width:calc(91.66666666666667%);width:-webkit-calc(91.66666666666667%);width:-moz-calc(91.66666666666667%)}.tablet-col-12{width:100%}.tablet-col-1-2{width:50%;width:calc(50%);width:-webkit-calc(50%);width:-moz-calc(50%)}.tablet-col-1-3{width:33.33333%;width:calc(33.333333333333336%);width:-webkit-calc(33.333333333333336%);width:-moz-calc(33.333333333333336%)}.tablet-col-1-4{width:25%;width:calc(25%);width:-webkit-calc(25%);width:-moz-calc(25%)}.tablet-col-3-4{width:75%;width:calc(75%);width:-webkit-calc(75%);width:-moz-calc(75%)}.tablet-push-1{left:8.33333%;left:calc(8.333333333333334%);left:-webkit-calc(8.333333333333334%);left:-moz-calc(8.333333333333334%)}.tablet-pull-1{left:-8.33333%;left:calc(-8.333333333333334%);left:-webkit-calc(-8.333333333333334%);left:-moz-calc(-8.333333333333334%)}.tablet-push-2{left:16.66667%;left:calc(16.666666666666668%);left:-webkit-calc(16.666666666666668%);left:-moz-calc(16.666666666666668%)}.tablet-pull-2{left:-16.66667%;left:calc(-16.666666666666668%);left:-webkit-calc(-16.666666666666668%);left:-moz-calc(-16.666666666666668%)}.tablet-push-3{left:25%;left:calc(25%);left:-webkit-calc(25%);left:-moz-calc(25%)}.tablet-pull-3{left:-25%;left:calc(-25%);left:-webkit-calc(-25%);left:-moz-calc(-25%)}.tablet-push-4{left:33.33333%;left:calc(33.333333333333336%);left:-webkit-calc(33.333333333333336%);left:-moz-calc(33.333333333333336%)}.tablet-pull-4{left:-33.33333%;left:calc(-33.333333333333336%);left:-webkit-calc(-33.333333333333336%);left:-moz-calc(-33.333333333333336%)}.tablet-push-5{left:41.66665%;left:calc(41.66666666666667%);left:-webkit-calc(41.66666666666667%);left:-moz-calc(41.66666666666667%)}.tablet-pull-5{left:-41.66665%;left:calc(-41.66666666666667%);left:-webkit-calc(-41.66666666666667%);left:-moz-calc(-41.66666666666667%)}.tablet-push-6{left:50%;left:calc(50%);left:-webkit-calc(50%);left:-moz-calc(50%)}.tablet-pull-6{left:-50%;left:calc(-50%);left:-webkit-calc(-50%);left:-moz-calc(-50%)}.tablet-push-7{left:58.33333%;left:calc(58.333333333333336%);left:-webkit-calc(58.333333333333336%);left:-moz-calc(58.333333333333336%)}.tablet-pull-7{left:-58.33333%;left:calc(-58.333333333333336%);left:-webkit-calc(-58.333333333333336%);left:-moz-calc(-58.333333333333336%)}.tablet-push-8{left:66.66666%;left:calc(66.66666666666667%);left:-webkit-calc(66.66666666666667%);left:-moz-calc(66.66666666666667%)}.tablet-pull-8{left:-66.66666%;left:calc(-66.66666666666667%);left:-webkit-calc(-66.66666666666667%);left:-moz-calc(-66.66666666666667%)}.tablet-push-9{left:75%;left:calc(75%);left:-webkit-calc(75%);left:-moz-calc(75%)}.tablet-pull-9{left:-75%;left:calc(-75%);left:-webkit-calc(-75%);left:-moz-calc(-75%)}.tablet-push-10{left:83.33333%;left:calc(83.33333333333334%);left:-webkit-calc(83.33333333333334%);left:-moz-calc(83.33333333333334%)}.tablet-pull-10{left:-83.33333%;left:calc(-83.33333333333334%);left:-webkit-calc(-83.33333333333334%);left:-moz-calc(-83.33333333333334%)}.tablet-push-11{left:91.66666%;left:calc(91.66666666666667%);left:-webkit-calc(91.66666666666667%);left:-moz-calc(91.66666666666667%)}.tablet-pull-11{left:-91.66666%;left:calc(-91.66666666666667%);left:-webkit-calc(-91.66666666666667%);left:-moz-calc(-91.66666666666667%)}.tablet-no-push,.tablet-no-pull{left:auto}.tablet-row{padding-top:1em;padding-bottom:1em}.tablet-full{left:auto;clear:both;float:none;width:100%;margin:1em 0 0 0;display:block}.tablet-full:first-child{margin-top:0}.tablet-left-text{text-align:left}.tablet-right-text{text-align:right}.tablet-center-text{text-align:center}.tablet-left{float:left}.tablet-right{float:right}.tablet-no-float{float:none}.tablet-no-margin{margin:0}.tablet-no-padding{padding:0}.no-tablet{display:none}.show-tablet{display:block}}@media only screen and (max-width:739px){.container,.mobile-container{padding-left:20px;padding-right:20px;margin-left:auto;margin-right:auto;float:none}.container:first-child,.mobile-container:first-child{margin-left:auto}.mobile-container-full{padding-left:0;padding-right:0;margin-left:auto;margin-right:auto;float:none}.mobile-container-full:first-child{margin-left:auto}.mobile-no-gutter{padding-left:0;padding-right:0}.mobile-col-1-2{width:50%;width:calc(50%);width:-webkit-calc(50%);width:-moz-calc(50%)}.mobile-col-1-3{width:33.33333%;width:calc(33.333333333333336%);width:-webkit-calc(33.333333333333336%);width:-moz-calc(33.333333333333336%)}.mobile-col-1-4{width:25%;width:calc(25%);width:-webkit-calc(25%);width:-moz-calc(25%)}.mobile-col-3-4{width:75%;width:calc(75%);width:-webkit-calc(75%);width:-moz-calc(75%)}.mobile-push-1-2{left:50%;left:calc(50%);left:-webkit-calc(50%);left:-moz-calc(50%)}.mobile-pull-1-2{left:-50%;left:calc(-50%);left:-webkit-calc(-50%);left:-moz-calc(-50%)}.mobile-push-1-3{left:25%;left:calc(25%);left:-webkit-calc(25%);left:-moz-calc(25%)}.mobile-pull-1-3{left:-25%;left:calc(-25%);left:-webkit-calc(-25%);left:-moz-calc(-25%)}.mobile-push-1-4{left:33.33333%;left:calc(33.333333333333336%);left:-webkit-calc(33.333333333333336%);left:-moz-calc(33.333333333333336%)}.mobile-pull-1-4{left:-33.33333%;left:calc(-33.333333333333336%);left:-webkit-calc(-33.333333333333336%);left:-moz-calc(-33.333333333333336%)}.mobile-push-3-4{left:75%;left:calc(75%);left:-webkit-calc(75%);left:-moz-calc(75%)}.mobile-pull-3-4{left:-75%;left:calc(-75%);left:-webkit-calc(-75%);left:-moz-calc(-75%)}.mobile-no-push,.mobile-no-pull{left:auto}.mobile-row{padding-top:1em;padding-bottom:1em}.mobile-full{left:auto;clear:both;float:none;width:100%;margin:.2em 0 0 0;display:block}.mobile-full:first-child{margin-top:0}.mobile-left-text{text-align:left}.mobile-right-text{text-align:right}.mobile-center-text{text-align:center}.mobile-left{float:left}.mobile-right{float:right}.mobile-no-float{float:none}.mobile-no-margin{margin:0}.mobile-no-padding{padding:0}table th,table td{padding:4px}.no-mobile{display:none}.show-mobile{display:block}}@media print{*{background:transparent}a,a:visited{text-decoration:underline}abbr[title]:after{content:" (" attr(title) ")"}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%}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}html,body{height:100%}.absolute{position:absolute}.relative{position:relative}.full{width:100%}.no-scroll{overflow:hidden}.table{display:table;margin:0 auto}.xlarge-top{margin-top:60px}.large-top{margin-top:40px}.medium-top{margin-top:20px}.small-top{margin-top:10px}.mini-top{margin-top:5px}.no-left-padding{padding-left:0}.no-right-padding{padding-right:0}@media only screen and (max-width:739px){.mobile-hide{display:none}.mobile-xlarge-top{margin-top:60px}.mobile-large-top{margin-top:40px}.mobile-medium-top{margin-top:20px}.mobile-small-top{margin-top:10px}.mobile-mini-top{margin-top:5px}}html,body{font-family:'Roboto','Helvetica Neue','Arial','Helvetica','Lucida Grande',sans-serif;font-weight:300;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}h1,h2,h3,h4,h5{font-weight:300}p{margin:0 0 1em 0}pre,code{padding:5px 10px;color:#6e6e6e;font-size:14px;line-height:20px;font-weight:100;background:#f8f8f8;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}a{color:#333;text-decoration:none;-webkit-transition:-webkit-all .2s ease-out;-moz-transition:-moz-all .2s ease-out;-o-transition:-o-all .2s ease-out;transition:all .2s ease-out}a.active{color:#000}a:hover{color:#000}a:hover .fa-trash-o{color:#e2717f}a.primary{color:#e2717f}a.primary:hover{color:#d94759}img{max-width:100%}hr{margin:.5em 0;width:100%}i.right-padding{padding-right:10px}i.left-padding{padding-left:10px}.button{outline:0;padding:1em 1.5em;background:#fafafa;color:#333;white-space:nowrap;background-clip:padding-box;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.button.disabled,.button[disabled]{-moz-opacity:.7;-khtml-opacity:.7;-webkit-opacity:.7;opacity:.7;-ms-filter:alpha(opacity=70);filter:alpha(opacity=70);cursor:default}.button:hover:not(.disabled),.button:hover:not([disabled]){background:#d9d9d9}.button.large{padding:1em 4em}.button.small{padding:.6em .8em}.button.x-small{padding:.4em .6em}.button.primary-button{color:#fff;background:#e2717f}.button.primary-button:hover,.button.primary-button:focus{color:#f2f2f2;background:#de5c6c}.button.primary-button:hover.disabled,.button.primary-button:focus.disabled,.button.primary-button:hover:disabled,.button.primary-button:focus:disabled{background:#e2717f}.button.secondary-button{background:0;border:1px solid #eee}.button.secondary-button:hover:not(.active),.button.secondary-button:hover:not(.disabled),.button.secondary-button:hover:not(:disabled),.button.secondary-button:focus:not(.active),.button.secondary-button:focus:not(.disabled),.button.secondary-button:focus:not(:disabled){color:#666;background:#f8f8f8}.button.secondary-button.active{color:#595959;background:#ebebeb;border:1px solid #eee}.button.secondary-button.active:hover{color:#595959;background:#ebebeb;border:1px solid #eee}.button.remove-button{background:#e2717f;color:#fff;padding:.9em 1.5em}.button.remove-button:hover,.button.remove-button:focus{background:#de5c6c}.button.remove-button:hover.disabled,.button.remove-button:focus.disabled,.button.remove-button:hover:disabled,.button.remove-button:focus:disabled{background:#e2717f}.button.transparent-button{background:0;color:#fff;border:1px solid #f2f2f2}.button.transparent-button:hover:not(.disabled),.button.transparent-button:hover:not(:disabled){background:rgba(255,255,255,0.1);color:#fff}.button-group>.button{padding:.8em 1em;text-align:center;background:#fff;border-top:1px solid #eee;border-bottom:1px solid #eee;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.button-group>.button i.fa{margin-right:5px}.button-group>.button:first-child{border-left:1px solid #eee;-webkit-border-top-right-radius:0;-webkit-border-bottom-right-radius:0;-webkit-border-bottom-left-radius:5px;-webkit-border-top-left-radius:5px;-moz-border-radius-topright:0;-moz-border-radius-bottomright:0;-moz-border-radius-bottomleft:5px;-moz-border-radius-topleft:5px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:5px;border-top-left-radius:5px;-moz-background-clip:padding-box;-webkit-background-clip:padding-box;background-clip:padding-box}.button-group>.button:last-child{border-right:1px solid #eee;-webkit-border-top-right-radius:5px;-webkit-border-bottom-right-radius:5px;-webkit-border-bottom-left-radius:0;-webkit-border-top-left-radius:0;-moz-border-radius-topright:5px;-moz-border-radius-bottomright:5px;-moz-border-radius-bottomleft:0;-moz-border-radius-topleft:0;border-top-right-radius:5px;border-bottom-right-radius:5px;border-bottom-left-radius:0;border-top-left-radius:0;-moz-background-clip:padding-box;-webkit-background-clip:padding-box;background-clip:padding-box}.button-group>.button:hover:not(.active),.button-group>.button:focus:not(.active){color:#666;background:#f8f8f8}.button-group>.button.active{color:#595959;background:#ebebeb;border:1px solid #eee}.button-group>.button.active:hover{color:#595959;background:#ebebeb;border:1px solid #eee}.button-group.small>.button{padding:.6em .8em}.button-group.x-small>.button{padding:.4em .6em}form .col,form .input-wrapper{position:relative}form input,form input[type="text"],form input[type="password"],form input[type="email"],form input[type="search"],form input[type="tel"],form input[type="number"],form input[type="date"],form textarea{width:100%;padding:.8em .6em .6em;outline:0;border:1px solid #d3d3d3;font-size:1.1em;line-height:1;background:#fff;color:#666;-webkit-appearance:none;-webkit-transition:-webkit-all .2s ease-out;-moz-transition:-moz-all .2s ease-out;-o-transition:-o-all .2s ease-out;transition:all .2s ease-out}form input:focus,form input[type="text"]:focus,form input[type="password"]:focus,form input[type="email"]:focus,form input[type="search"]:focus,form input[type="tel"]:focus,form input[type="number"]:focus,form input[type="date"]:focus,form textarea:focus{color:#333;border:1px solid #a0a0a0;-moz-box-shadow:0 0 2px #a0a0a0;-webkit-box-shadow:0 0 2px #a0a0a0;box-shadow:0 0 2px #a0a0a0;-webkit-box-shadow:0 0 2px #a0a0a0 0 0 #000;box-shadow:0 0 2px #a0a0a0 0 0 #000}form input:focus+label,form input[type="text"]:focus+label,form input[type="password"]:focus+label,form input[type="email"]:focus+label,form input[type="search"]:focus+label,form input[type="tel"]:focus+label,form input[type="number"]:focus+label,form input[type="date"]:focus+label,form textarea:focus+label{color:#666;font-weight:400}form input.success,form input[type="text"].success,form input[type="password"].success,form input[type="email"].success,form input[type="search"].success,form input[type="tel"].success,form input[type="number"].success,form input[type="date"].success,form textarea.success{border:1px solid #43cea2;-moz-box-shadow:0 0 2px #43cea2;-webkit-box-shadow:0 0 2px #43cea2;box-shadow:0 0 2px #43cea2;-webkit-box-shadow:0 0 2px #43cea2 0 0 #000;box-shadow:0 0 2px #43cea2 0 0 #000}form input.success+label,form input[type="text"].success+label,form input[type="password"].success+label,form input[type="email"].success+label,form input[type="search"].success+label,form input[type="tel"].success+label,form input[type="number"].success+label,form input[type="date"].success+label,form textarea.success+label{color:#43cea2;font-weight:400}form input.error,form input[type="text"].error,form input[type="password"].error,form input[type="email"].error,form input[type="search"].error,form input[type="tel"].error,form input[type="number"].error,form input[type="date"].error,form textarea.error{border:1px solid #e2717f;-moz-box-shadow:0 0 2px #e2717f;-webkit-box-shadow:0 0 2px #e2717f;box-shadow:0 0 2px #e2717f;-webkit-box-shadow:0 0 2px #e2717f 0 0 #000;box-shadow:0 0 2px #e2717f 0 0 #000}form input.error+label,form input[type="text"].error+label,form input[type="password"].error+label,form input[type="email"].error+label,form input[type="search"].error+label,form input[type="tel"].error+label,form input[type="number"].error+label,form input[type="date"].error+label,form textarea.error+label{color:#e2717f;font-weight:400}form input::-webkit-input-placeholder,form input[type="text"]::-webkit-input-placeholder,form input[type="password"]::-webkit-input-placeholder,form input[type="email"]::-webkit-input-placeholder,form input[type="search"]::-webkit-input-placeholder,form input[type="tel"]::-webkit-input-placeholder,form input[type="number"]::-webkit-input-placeholder,form input[type="date"]::-webkit-input-placeholder,form textarea::-webkit-input-placeholder{color:#d3d3d3;font-weight:300}form [placeholder]:focus::-webkit-input-placeholder{-webkit-transition:-webkit-all .2s ease-out;-moz-transition:-moz-all .2s ease-out;-o-transition:-o-all .2s ease-out;transition:all .2s ease-out;opacity:0}form input[type="number"]::-webkit-inner-spin-button,form input[type="number"]::-webkit-outer-spin-button,form input[type="date"]::-webkit-inner-spin-button,form input[type="date"]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}form .select-style{position:relative;display:block;width:100%;border:1px solid #a0a0a0;background:#fff}form .select-style .fa-caret-down{position:absolute;right:.6em;top:.8em;color:#a0a0a0;font-size:1.4em}form .select-style select{padding:.8em 0;margin-left:.6em;width:100%;border:0;box-shadow:none;background:transparent;background-image:none;-webkit-appearance:none;color:#a0a0a0;font-size:1.2em}form .select-style select:hover{cursor:pointer}form .select-style select:focus{outline:0}form fieldset.row{padding:.5em 0}form label{position:absolute;left:5px;top:-5px;padding:0 5px;background:white;color:#a0a0a0;font-size:12px;line-height:12px;text-transform:uppercase;pointer-events:none;z-index:2}.modal-wrapper{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,0.3);display:none;z-index:1001;will-change:transform}.modal-wrapper .modal{position:relative;color:#333;display:none}.modal-wrapper .modal a.close{position:absolute;padding:6px 12px 9px;border:1px solid;border-radius:20px;font-weight:300;font-size:27px}.modal-wrapper .modal section.modal-content{padding:20px}.modal-wrapper:not(.fullscreen) .modal{min-height:300px;max-width:434px;margin:60px auto 0;background-color:#fff;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.modal-wrapper:not(.fullscreen) .modal a.close{right:-45px;top:-30px;color:#fff}.modal-wrapper.fullscreen{background:#fff}.modal-wrapper.fullscreen .modal{height:100%;overflow:auto}.modal-wrapper.fullscreen .modal a.close{right:20px;top:20px}.notice{position:fixed;bottom:0;right:10px;height:100px;width:300px;padding:5px 10px 5px 10px;display:none;color:#fff;z-index:1005;-webkit-border-top-right-radius:5px;-webkit-border-bottom-right-radius:0;-webkit-border-bottom-left-radius:0;-webkit-border-top-left-radius:5px;-moz-border-radius-topright:5px;-moz-border-radius-bottomright:0;-moz-border-radius-bottomleft:0;-moz-border-radius-topleft:5px;border-top-right-radius:5px;border-bottom-right-radius:0;border-bottom-left-radius:0;border-top-left-radius:5px;-moz-background-clip:padding-box;-webkit-background-clip:padding-box;background-clip:padding-box}.notice.success{background-color:#43cea2}.notice.warning{background-color:#f4ed6b}.notice.error{background-color:#e2717f}.notice header.notice-header{position:relative;margin-bottom:.2em}.notice section.notice-content{height:70px;width:100%;overflow:auto;font-size:.8em}.notice a.close{position:absolute;top:3px;right:0;padding:0 4px 2px;border:1px solid;border-radius:100%;font-weight:300;font-size:12px;line-height:12px;color:#fff}.notice a.close:hover{color:#ccc}nav{font-size:18px;font-size:1.125rem}nav .navbar{margin:0 auto;display:table;padding:10px 0}nav li{margin:0 10px}nav a{display:inline-block;line-height:60px;vertical-align:middle}nav a.logo{height:60px;width:60px}@media(max-width:739px){nav{font-size:14px;font-size:.875rem}nav a{line-height:40px}nav a.logo{height:40px;width:40px}}#toc{position:fixed;top:80px;height:100%;width:263px;overflow:auto;padding-bottom:100px}#toc a{color:#333}#toc a:hover{color:#1a1a1a}#toc li>ul{display:none}#toc li>ul.unstyled-list{margin-left:10px}#toc li.active>a{font-weight:bold}#toc li.active>ul{display:block}#toc ul.nav>li.active>ul>li{list-style:none}footer{padding:60px 0;color:#d3d3d3;background:#333}footer i.fa-heart{color:#e2717f}footer i.fa-beer{color:#f4ed6b}html,body{background:#fff;color:#333}.kd{color:#a783b6}.k{color:#43cea2}h1.logo{font-size:64px;font-size:4rem}.gist pre,.gist .file-data{font-size:14px!important}section{padding:40px 0}#hero .badges,#hero .github-links{padding:.3em 0}#hero .badges p,#hero .github-links p{margin:0}#ship h3{margin-bottom:1em}#ship img.ship-it{display:table;height:300px;width:300px;margin:0 auto;background:#d3d3d3;-webkit-border-radius:100%;-moz-border-radius:100%;border-radius:100%}#plugins{color:#fff;background:#333}#plugins p{color:#d3d3d3}#plugins ul li{padding:10px 20px}#plugins ul li a{display:inline-block}#plugins ul li a img{height:100px;max-width:160px}@media(max-width:739px){#plugins ul li a img{height:60px;max-width:120px}}#features{color:#fff;background:#e2717f}#features h4{color:#982e3e}#features a.primary{color:#f8f8f8;border-bottom:1px dashed #f8f8f8}#features a.primary:hover{color:#dfdfdf;border-bottom:1px dashed #dfdfdf}#features p{text-align:justify}#comparison img{margin:0 auto}.page a,.example a{color:#e2717f}.page a:hover,.example a:hover{color:#d94759}.page .file-data .line-numbers,.example .file-data .line-numbers{width:40px}#todo-example input[type="text"]{margin:10px 0}#todo-example ul.todos li{padding:5px 0}#todo-example ul.todos li input[type="checkbox"]{margin-top:.2em}#todo-example ul.todos li span{margin-left:5px}#todo-example .primary-button{width:100%} \ No newline at end of file + */@font-face{font-family:'FontAwesome';src:url('/fonts/fontawesome-webfont.eot?v=4.3.0');src:url('/fonts/fontawesome-webfont.eot?#iefix&v=4.3.0') format('embedded-opentype'),url('/fonts/fontawesome-webfont.woff2?v=4.3.0') format('woff2'),url('/fonts/fontawesome-webfont.woff?v=4.3.0') format('woff'),url('/fonts/fontawesome-webfont.ttf?v=4.3.0') format('truetype'),url('/fonts/fontawesome-webfont.svg?v=4.3.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;transform:translate(0,0)}.fa-lg{font-size:1.3333333333333333em;line-height:.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.2857142857142858em;text-align:center}.fa-ul{padding-left:0;margin-left:2.142857142857143em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.142857142857143em;width:2.142857142857143em;top:.14285714285714285em;text-align:center}.fa-li.fa-lg{left:-1.8571428571428572em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.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:#fff}.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-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-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-genderless:before,.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-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-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"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}html,button,input,select,textarea{font-family:sans-serif}body,form,fieldset,legend,input,select,textarea,button{margin:0}html{font-size:100%}body{font-family:sans-serif;font-size:16px;font-size:1rem;line-height:21px;line-height:1.3125rem;color:#434343;background-color:#fff;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}b,strong{font-weight:700}i,em,.em{font-style:italic}a{color:#669fcf}a:hover{text-decoration:none}a:focus{outline:0}a:active,a:hover{outline:0}p{margin:0 0 1.6em 0}pre{margin:1em 0}ul+p,ul+pre,ol+p,ol+pre{margin-top:0}small{font-size:80%}abbr[title]{border-bottom:1px dotted}audio,canvas,video{display:inline-block;*zoom:1;*display:inline}audio:not([controls]){display:none;height:0}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}dfn{font-style:italic}img{border:0;-ms-interpolation-mode:bicubic}svg:not(:root){overflow:hidden}figure{margin:0}.image-left{margin-right:20px}.image-right{margin-left:20px}h1,h2,h3,h4,h5,h6{line-height:normal;font-weight:normal;margin:0 0 .33em 0}h1,.h1{font-size:40px;font-size:2.5rem}h2,.h2{font-size:32px;font-size:2rem}h3,.h3{font-size:26px;font-size:1.625rem}h4,.h4{font-size:20px;font-size:1.25rem}h5,.h5{font-size:18px;font-size:1.125rem}h6,.h6{font-size:16px;font-size:1rem}.no-style-heading{margin:0;font-size:100%}hr{border:0;background:0;outline:0;background-color:#ddd;margin:2em 0;*margin:1em 0;-moz-box-sizing:content-box;box-sizing:content-box;height:1px}blockquote{font-size:22px;font-size:1.375rem;line-height:32px;line-height:2rem;color:#434343;margin:1em 0;font-style:italic}blockquote p{margin:1em 0}cite{color:#434343;font-style:normal;font-weight:normal;font-size:16px;font-size:1rem;line-height:normal}q{font-style:italic;quotes:none}q:before,q:after{content:'';content:none}mark{background:#ff0;color:#111}code,kbd,pre,samp{word-wrap:break-word;font-family:'courier new',monospace,serif;font-size:13px;font-size:.8125rem;line-height:normal;font-weight:normal;background-color:#f1f1f1;padding:10px}code{color:#111}dl,menu,ol,ul{margin:1em 0}dd,ul ul,ol ol,ul ol,ol ul{margin:0}dt{font-weight:normal}dd{margin-bottom:1em}menu,ol,ul{padding:0 0 0 22px}nav ul,nav ol{list-style:none;list-style-image:none}.unstyled-list{list-style:none;padding:0;margin:0}.unstyled-list li{margin-top:0;margin-bottom:0}.inline-list{list-style:none;padding:0;margin:0;display:inline-block;*zoom:1;*display:inline}.inline-list li{margin-top:0;margin-bottom:0}.inline-list li{display:inline-block;*zoom:1;*display:inline}table{width:100%;margin:1em 0;table-layout:fixed;border-collapse:collapse;border-spacing:0;border-right:1px solid #f1f1f1;border-bottom:1px solid #f1f1f1;word-wrap:break-word;-ms-word-wrap:break-word;*white-space:normal}table th,table td{padding:8px;text-align:left;vertical-align:top;border-top:1px solid #eee;border-left:1px solid #eee}table thead th,table tfoot th{vertical-align:bottom;font-weight:normal;background-color:#f1f1f1;color:#333}table caption{padding:8px;font-style:normal;text-align:left;font-weight:normal;border-bottom:0}fieldset{border:0;padding:0}legend{border:0;padding:0;white-space:normal;*margin-left:-7px;font-weight:normal}label{margin:0;cursor:pointer}button,input,select,textarea{font-size:100%;vertical-align:baseline;*vertical-align:middle}input[type=text],input[type=password],input[type=email],input[type=search],input[type=tel],textarea{padding:5px;-webkit-appearance:none;-moz-appearance:none;font-weight:normal;line-height:normal;background-color:#fff;border:1px solid #ccc;color:#111}input[type=checkbox],input[type=radio]{cursor:pointer;box-sizing:border-box;line-height:normal;margin:0;padding:0;*height:13px;*width:13px}.checkbox{display:block;margin:.2em 0}.checkbox input[type=checkbox],.checkbox input[type=radio]{margin-top:.05em;float:left}.checkbox label{padding-left:5px;overflow:hidden;display:table;*zoom:1}button,input{line-height:normal}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer;*overflow:visible}button[disabled],html input[disabled]{cursor:default}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top;resize:none}.button{border:0;padding:1em 3em;background-color:#e74b3c;color:#fff;text-decoration:none;text-align:center;display:inline-block;*zoom:1;*display:inline;position:relative}.button:hover{background-color:#fc5547}.button:active{top:1px}.grey-button{background-color:#eee;color:#434343}.grey-button:hover{background-color:#f1f1f1}.button[disabled],.button.disabled{color:#999;background-color:#f1f1f1}.unstyled-button{font-size:16px;font-size:1rem;color:#27ae61;text-decoration:underline;border:0;background:transparent;height:auto;padding:0;cursor:pointer;outline:0}.unstyled-button:hover{text-decoration:none}.unstyled-button[disabled],.unstyled-button.disabled{text-decoration:none;color:#999;background-color:#ccc}.section{position:relative}.container{max-width:960px;margin-left:auto;margin-right:auto;padding-left:10px;padding-right:10px}.container-full{max-width:960px;margin-left:auto;margin-right:auto}.col{float:left;padding-left:10px;padding-right:10px}[class*="pull-"],[class*="push-"]{position:relative}.no-gutter{padding-left:0;padding-right:0}.col-1{width:8.33333%;width:calc(8.333333333333334%);width:-webkit-calc(8.333333333333334%);width:-moz-calc(8.333333333333334%)}.col-2{width:16.66667%;width:calc(16.666666666666668%);width:-webkit-calc(16.666666666666668%);width:-moz-calc(16.666666666666668%)}.col-3{width:25%;width:calc(25%);width:-webkit-calc(25%);width:-moz-calc(25%)}.col-4{width:33.33333%;width:calc(33.333333333333336%);width:-webkit-calc(33.333333333333336%);width:-moz-calc(33.333333333333336%)}.col-5{width:41.66665%;width:calc(41.66666666666667%);width:-webkit-calc(41.66666666666667%);width:-moz-calc(41.66666666666667%)}.col-6{width:50%;width:calc(50%);width:-webkit-calc(50%);width:-moz-calc(50%)}.col-7{width:58.33333%;width:calc(58.333333333333336%);width:-webkit-calc(58.333333333333336%);width:-moz-calc(58.333333333333336%)}.col-8{width:66.66666%;width:calc(66.66666666666667%);width:-webkit-calc(66.66666666666667%);width:-moz-calc(66.66666666666667%)}.col-9{width:75%;width:calc(75%);width:-webkit-calc(75%);width:-moz-calc(75%)}.col-10{width:83.33333%;width:calc(83.33333333333334%);width:-webkit-calc(83.33333333333334%);width:-moz-calc(83.33333333333334%)}.col-11{width:91.66666%;width:calc(91.66666666666667%);width:-webkit-calc(91.66666666666667%);width:-moz-calc(91.66666666666667%)}.col-12{width:100%}.col-1-2{width:50%;width:calc(50%);width:-webkit-calc(50%);width:-moz-calc(50%)}.col-1-3{width:33.33333%;width:calc(33.333333333333336%);width:-webkit-calc(33.333333333333336%);width:-moz-calc(33.333333333333336%)}.col-1-4{width:25%;width:calc(25%);width:-webkit-calc(25%);width:-moz-calc(25%)}.col-3-4{width:75%;width:calc(75%);width:-webkit-calc(75%);width:-moz-calc(75%)}.push-1{left:8.33333%;left:calc(8.333333333333334%);left:-webkit-calc(8.333333333333334%);left:-moz-calc(8.333333333333334%)}.pull-1{left:-8.33333%;left:calc(-8.333333333333334%);left:-webkit-calc(-8.333333333333334%);left:-moz-calc(-8.333333333333334%)}.push-2{left:16.66667%;left:calc(16.666666666666668%);left:-webkit-calc(16.666666666666668%);left:-moz-calc(16.666666666666668%)}.pull-2{left:-16.66667%;left:calc(-16.666666666666668%);left:-webkit-calc(-16.666666666666668%);left:-moz-calc(-16.666666666666668%)}.push-3{left:25%;left:calc(25%);left:-webkit-calc(25%);left:-moz-calc(25%)}.pull-3{left:-25%;left:calc(-25%);left:-webkit-calc(-25%);left:-moz-calc(-25%)}.push-4{left:33.33333%;left:calc(33.333333333333336%);left:-webkit-calc(33.333333333333336%);left:-moz-calc(33.333333333333336%)}.pull-4{left:-33.33333%;left:calc(-33.333333333333336%);left:-webkit-calc(-33.333333333333336%);left:-moz-calc(-33.333333333333336%)}.push-5{left:41.66665%;left:calc(41.66666666666667%);left:-webkit-calc(41.66666666666667%);left:-moz-calc(41.66666666666667%)}.pull-5{left:-41.66665%;left:calc(-41.66666666666667%);left:-webkit-calc(-41.66666666666667%);left:-moz-calc(-41.66666666666667%)}.push-6{left:50%;left:calc(50%);left:-webkit-calc(50%);left:-moz-calc(50%)}.pull-6{left:-50%;left:calc(-50%);left:-webkit-calc(-50%);left:-moz-calc(-50%)}.push-7{left:58.33333%;left:calc(58.333333333333336%);left:-webkit-calc(58.333333333333336%);left:-moz-calc(58.333333333333336%)}.pull-7{left:-58.33333%;left:calc(-58.333333333333336%);left:-webkit-calc(-58.333333333333336%);left:-moz-calc(-58.333333333333336%)}.push-8{left:66.66666%;left:calc(66.66666666666667%);left:-webkit-calc(66.66666666666667%);left:-moz-calc(66.66666666666667%)}.pull-8{left:-66.66666%;left:calc(-66.66666666666667%);left:-webkit-calc(-66.66666666666667%);left:-moz-calc(-66.66666666666667%)}.push-9{left:75%;left:calc(75%);left:-webkit-calc(75%);left:-moz-calc(75%)}.pull-9{left:-75%;left:calc(-75%);left:-webkit-calc(-75%);left:-moz-calc(-75%)}.push-10{left:83.33333%;left:calc(83.33333333333334%);left:-webkit-calc(83.33333333333334%);left:-moz-calc(83.33333333333334%)}.pull-10{left:-83.33333%;left:calc(-83.33333333333334%);left:-webkit-calc(-83.33333333333334%);left:-moz-calc(-83.33333333333334%)}.push-11{left:91.66666%;left:calc(91.66666666666667%);left:-webkit-calc(91.66666666666667%);left:-moz-calc(91.66666666666667%)}.pull-11{left:-91.66666%;left:calc(-91.66666666666667%);left:-webkit-calc(-91.66666666666667%);left:-moz-calc(-91.66666666666667%)}.row{padding-top:1em;padding-bottom:1em}.clear:before,.clear:after{content:"";display:table}.clear:after{clear:both}.clear{zoom:1}.left{float:left}.right{float:right}.block{display:block}.inline{display:inline}.inline-block{display:inline-block;*zoom:1;*display:inline}.none,.hidden,[hidden],.no-desktop{display:none}.heavy{font-weight:900}.strong{font-weight:700}.normal{font-weight:normal}.thin{font-weight:300}.fine{font-weight:100}.italic{font-style:italic}.capitalize{text-transform:capitalize}.uppercase{text-transform:uppercase}.left-text{text-align:left}.right-text{text-align:right}.center-text{text-align:center}.justify-text{text-align:justify}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;overflow:hidden;padding:0;position:absolute;width:1px;left:-9999em}.visuallyvisible{clip:auto;width:auto;height:auto;overflow:visible;left:0}.no-margin{margin:0}.no-padding{padding:0}@media only screen and (min-width:740px) and (max-width:960px){.container,.tablet-container{max-width:960px;padding-left:20px;padding-right:20px;margin-left:auto;margin-right:auto;float:none}.container:first-child,.tablet-container:first-child{margin-left:auto}.tablet-container-full{padding-left:0;padding-right:0;margin-left:auto;margin-right:auto;float:none}.tablet-container-full:first-child{margin-left:auto}.tablet-no-gutter{padding-left:0;padding-right:0}.tablet-col-1{width:8.33333%;width:calc(8.333333333333334%);width:-webkit-calc(8.333333333333334%);width:-moz-calc(8.333333333333334%)}.tablet-col-2{width:16.66667%;width:calc(16.666666666666668%);width:-webkit-calc(16.666666666666668%);width:-moz-calc(16.666666666666668%)}.tablet-col-3{width:25%;width:calc(25%);width:-webkit-calc(25%);width:-moz-calc(25%)}.tablet-col-4{width:33.33333%;width:calc(33.333333333333336%);width:-webkit-calc(33.333333333333336%);width:-moz-calc(33.333333333333336%)}.tablet-col-5{width:41.66665%;width:calc(41.66666666666667%);width:-webkit-calc(41.66666666666667%);width:-moz-calc(41.66666666666667%)}.tablet-col-6{width:50%;width:calc(50%);width:-webkit-calc(50%);width:-moz-calc(50%)}.tablet-col-7{width:58.33333%;width:calc(58.333333333333336%);width:-webkit-calc(58.333333333333336%);width:-moz-calc(58.333333333333336%)}.tablet-col-8{width:66.66666%;width:calc(66.66666666666667%);width:-webkit-calc(66.66666666666667%);width:-moz-calc(66.66666666666667%)}.tablet-col-9{width:75%;width:calc(75%);width:-webkit-calc(75%);width:-moz-calc(75%)}.tablet-col-10{width:83.33333%;width:calc(83.33333333333334%);width:-webkit-calc(83.33333333333334%);width:-moz-calc(83.33333333333334%)}.tablet-col-11{width:91.66666%;width:calc(91.66666666666667%);width:-webkit-calc(91.66666666666667%);width:-moz-calc(91.66666666666667%)}.tablet-col-12{width:100%}.tablet-col-1-2{width:50%;width:calc(50%);width:-webkit-calc(50%);width:-moz-calc(50%)}.tablet-col-1-3{width:33.33333%;width:calc(33.333333333333336%);width:-webkit-calc(33.333333333333336%);width:-moz-calc(33.333333333333336%)}.tablet-col-1-4{width:25%;width:calc(25%);width:-webkit-calc(25%);width:-moz-calc(25%)}.tablet-col-3-4{width:75%;width:calc(75%);width:-webkit-calc(75%);width:-moz-calc(75%)}.tablet-push-1{left:8.33333%;left:calc(8.333333333333334%);left:-webkit-calc(8.333333333333334%);left:-moz-calc(8.333333333333334%)}.tablet-pull-1{left:-8.33333%;left:calc(-8.333333333333334%);left:-webkit-calc(-8.333333333333334%);left:-moz-calc(-8.333333333333334%)}.tablet-push-2{left:16.66667%;left:calc(16.666666666666668%);left:-webkit-calc(16.666666666666668%);left:-moz-calc(16.666666666666668%)}.tablet-pull-2{left:-16.66667%;left:calc(-16.666666666666668%);left:-webkit-calc(-16.666666666666668%);left:-moz-calc(-16.666666666666668%)}.tablet-push-3{left:25%;left:calc(25%);left:-webkit-calc(25%);left:-moz-calc(25%)}.tablet-pull-3{left:-25%;left:calc(-25%);left:-webkit-calc(-25%);left:-moz-calc(-25%)}.tablet-push-4{left:33.33333%;left:calc(33.333333333333336%);left:-webkit-calc(33.333333333333336%);left:-moz-calc(33.333333333333336%)}.tablet-pull-4{left:-33.33333%;left:calc(-33.333333333333336%);left:-webkit-calc(-33.333333333333336%);left:-moz-calc(-33.333333333333336%)}.tablet-push-5{left:41.66665%;left:calc(41.66666666666667%);left:-webkit-calc(41.66666666666667%);left:-moz-calc(41.66666666666667%)}.tablet-pull-5{left:-41.66665%;left:calc(-41.66666666666667%);left:-webkit-calc(-41.66666666666667%);left:-moz-calc(-41.66666666666667%)}.tablet-push-6{left:50%;left:calc(50%);left:-webkit-calc(50%);left:-moz-calc(50%)}.tablet-pull-6{left:-50%;left:calc(-50%);left:-webkit-calc(-50%);left:-moz-calc(-50%)}.tablet-push-7{left:58.33333%;left:calc(58.333333333333336%);left:-webkit-calc(58.333333333333336%);left:-moz-calc(58.333333333333336%)}.tablet-pull-7{left:-58.33333%;left:calc(-58.333333333333336%);left:-webkit-calc(-58.333333333333336%);left:-moz-calc(-58.333333333333336%)}.tablet-push-8{left:66.66666%;left:calc(66.66666666666667%);left:-webkit-calc(66.66666666666667%);left:-moz-calc(66.66666666666667%)}.tablet-pull-8{left:-66.66666%;left:calc(-66.66666666666667%);left:-webkit-calc(-66.66666666666667%);left:-moz-calc(-66.66666666666667%)}.tablet-push-9{left:75%;left:calc(75%);left:-webkit-calc(75%);left:-moz-calc(75%)}.tablet-pull-9{left:-75%;left:calc(-75%);left:-webkit-calc(-75%);left:-moz-calc(-75%)}.tablet-push-10{left:83.33333%;left:calc(83.33333333333334%);left:-webkit-calc(83.33333333333334%);left:-moz-calc(83.33333333333334%)}.tablet-pull-10{left:-83.33333%;left:calc(-83.33333333333334%);left:-webkit-calc(-83.33333333333334%);left:-moz-calc(-83.33333333333334%)}.tablet-push-11{left:91.66666%;left:calc(91.66666666666667%);left:-webkit-calc(91.66666666666667%);left:-moz-calc(91.66666666666667%)}.tablet-pull-11{left:-91.66666%;left:calc(-91.66666666666667%);left:-webkit-calc(-91.66666666666667%);left:-moz-calc(-91.66666666666667%)}.tablet-no-push,.tablet-no-pull{left:auto}.tablet-row{padding-top:1em;padding-bottom:1em}.tablet-full{left:auto;clear:both;float:none;width:100%;margin:1em 0 0 0;display:block}.tablet-full:first-child{margin-top:0}.tablet-left-text{text-align:left}.tablet-right-text{text-align:right}.tablet-center-text{text-align:center}.tablet-left{float:left}.tablet-right{float:right}.tablet-no-float{float:none}.tablet-no-margin{margin:0}.tablet-no-padding{padding:0}.no-tablet{display:none}.show-tablet{display:block}}@media only screen and (max-width:739px){.container,.mobile-container{padding-left:20px;padding-right:20px;margin-left:auto;margin-right:auto;float:none}.container:first-child,.mobile-container:first-child{margin-left:auto}.mobile-container-full{padding-left:0;padding-right:0;margin-left:auto;margin-right:auto;float:none}.mobile-container-full:first-child{margin-left:auto}.mobile-no-gutter{padding-left:0;padding-right:0}.mobile-col-1-2{width:50%;width:calc(50%);width:-webkit-calc(50%);width:-moz-calc(50%)}.mobile-col-1-3{width:33.33333%;width:calc(33.333333333333336%);width:-webkit-calc(33.333333333333336%);width:-moz-calc(33.333333333333336%)}.mobile-col-1-4{width:25%;width:calc(25%);width:-webkit-calc(25%);width:-moz-calc(25%)}.mobile-col-3-4{width:75%;width:calc(75%);width:-webkit-calc(75%);width:-moz-calc(75%)}.mobile-push-1-2{left:50%;left:calc(50%);left:-webkit-calc(50%);left:-moz-calc(50%)}.mobile-pull-1-2{left:-50%;left:calc(-50%);left:-webkit-calc(-50%);left:-moz-calc(-50%)}.mobile-push-1-3{left:25%;left:calc(25%);left:-webkit-calc(25%);left:-moz-calc(25%)}.mobile-pull-1-3{left:-25%;left:calc(-25%);left:-webkit-calc(-25%);left:-moz-calc(-25%)}.mobile-push-1-4{left:33.33333%;left:calc(33.333333333333336%);left:-webkit-calc(33.333333333333336%);left:-moz-calc(33.333333333333336%)}.mobile-pull-1-4{left:-33.33333%;left:calc(-33.333333333333336%);left:-webkit-calc(-33.333333333333336%);left:-moz-calc(-33.333333333333336%)}.mobile-push-3-4{left:75%;left:calc(75%);left:-webkit-calc(75%);left:-moz-calc(75%)}.mobile-pull-3-4{left:-75%;left:calc(-75%);left:-webkit-calc(-75%);left:-moz-calc(-75%)}.mobile-no-push,.mobile-no-pull{left:auto}.mobile-row{padding-top:1em;padding-bottom:1em}.mobile-full{left:auto;clear:both;float:none;width:100%;margin:.2em 0 0 0;display:block}.mobile-full:first-child{margin-top:0}.mobile-left-text{text-align:left}.mobile-right-text{text-align:right}.mobile-center-text{text-align:center}.mobile-left{float:left}.mobile-right{float:right}.mobile-no-float{float:none}.mobile-no-margin{margin:0}.mobile-no-padding{padding:0}table th,table td{padding:4px}.no-mobile{display:none}.show-mobile{display:block}}@media print{*{background:transparent}a,a:visited{text-decoration:underline}abbr[title]:after{content:" (" attr(title) ")"}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%}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}html,body{height:100%}.absolute{position:absolute}.relative{position:relative}.full{width:100%}.no-scroll{overflow:hidden}.table{display:table;margin:0 auto}.xlarge-top{margin-top:60px}.large-top{margin-top:40px}.medium-top{margin-top:20px}.small-top{margin-top:10px}.mini-top{margin-top:5px}.no-left-padding{padding-left:0}.no-right-padding{padding-right:0}@media only screen and (max-width:739px){.mobile-hide{display:none}.mobile-xlarge-top{margin-top:60px}.mobile-large-top{margin-top:40px}.mobile-medium-top{margin-top:20px}.mobile-small-top{margin-top:10px}.mobile-mini-top{margin-top:5px}}html,body{font-family:'Roboto','Helvetica Neue','Arial','Helvetica','Lucida Grande',sans-serif;font-weight:300;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}h1,h2,h3,h4,h5{font-weight:300}p{margin:0 0 1em 0}pre,code{padding:5px 10px;color:#6e6e6e;font-size:14px;line-height:20px;font-weight:100;background:#f8f8f8;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}a{color:#333;text-decoration:none;-webkit-transition:-webkit-all .2s ease-out;-moz-transition:-moz-all .2s ease-out;-o-transition:-o-all .2s ease-out;transition:all .2s ease-out}a.active{color:#000}a:hover{color:#000}a:hover .fa-trash-o{color:#e2717f}a.primary{color:#e2717f}a.primary:hover{color:#d94759}img{max-width:100%}hr{margin:.5em 0;width:100%}i.right-padding{padding-right:10px}i.left-padding{padding-left:10px}.button{outline:0;padding:1em 1.5em;background:#fafafa;color:#333;white-space:nowrap;background-clip:padding-box;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.button.disabled,.button[disabled]{-moz-opacity:.7;-khtml-opacity:.7;-webkit-opacity:.7;opacity:.7;-ms-filter:alpha(opacity=70);filter:alpha(opacity=70);cursor:default}.button:hover:not(.disabled),.button:hover:not([disabled]){background:#d9d9d9}.button.large{padding:1em 4em}.button.small{padding:.6em .8em}.button.x-small{padding:.4em .6em}.button.primary-button{color:#fff;background:#e2717f}.button.primary-button:hover,.button.primary-button:focus{color:#f2f2f2;background:#de5c6c}.button.primary-button:hover.disabled,.button.primary-button:focus.disabled,.button.primary-button:hover:disabled,.button.primary-button:focus:disabled{background:#e2717f}.button.secondary-button{background:0;border:1px solid #eee}.button.secondary-button:hover:not(.active),.button.secondary-button:hover:not(.disabled),.button.secondary-button:hover:not(:disabled),.button.secondary-button:focus:not(.active),.button.secondary-button:focus:not(.disabled),.button.secondary-button:focus:not(:disabled){color:#666;background:#f8f8f8}.button.secondary-button.active{color:#595959;background:#ebebeb;border:1px solid #eee}.button.secondary-button.active:hover{color:#595959;background:#ebebeb;border:1px solid #eee}.button.remove-button{background:#e2717f;color:#fff;padding:.9em 1.5em}.button.remove-button:hover,.button.remove-button:focus{background:#de5c6c}.button.remove-button:hover.disabled,.button.remove-button:focus.disabled,.button.remove-button:hover:disabled,.button.remove-button:focus:disabled{background:#e2717f}.button.transparent-button{background:0;color:#fff;border:1px solid #f2f2f2}.button.transparent-button:hover:not(.disabled),.button.transparent-button:hover:not(:disabled){background:rgba(255,255,255,0.1);color:#fff}.button-group>.button{padding:.8em 1em;text-align:center;background:#fff;border-top:1px solid #eee;border-bottom:1px solid #eee;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.button-group>.button i.fa{margin-right:5px}.button-group>.button:first-child{border-left:1px solid #eee;-webkit-border-top-right-radius:0;-webkit-border-bottom-right-radius:0;-webkit-border-bottom-left-radius:5px;-webkit-border-top-left-radius:5px;-moz-border-radius-topright:0;-moz-border-radius-bottomright:0;-moz-border-radius-bottomleft:5px;-moz-border-radius-topleft:5px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:5px;border-top-left-radius:5px;-moz-background-clip:padding-box;-webkit-background-clip:padding-box;background-clip:padding-box}.button-group>.button:last-child{border-right:1px solid #eee;-webkit-border-top-right-radius:5px;-webkit-border-bottom-right-radius:5px;-webkit-border-bottom-left-radius:0;-webkit-border-top-left-radius:0;-moz-border-radius-topright:5px;-moz-border-radius-bottomright:5px;-moz-border-radius-bottomleft:0;-moz-border-radius-topleft:0;border-top-right-radius:5px;border-bottom-right-radius:5px;border-bottom-left-radius:0;border-top-left-radius:0;-moz-background-clip:padding-box;-webkit-background-clip:padding-box;background-clip:padding-box}.button-group>.button:hover:not(.active),.button-group>.button:focus:not(.active){color:#666;background:#f8f8f8}.button-group>.button.active{color:#595959;background:#ebebeb;border:1px solid #eee}.button-group>.button.active:hover{color:#595959;background:#ebebeb;border:1px solid #eee}.button-group.small>.button{padding:.6em .8em}.button-group.x-small>.button{padding:.4em .6em}form .col,form .input-wrapper{position:relative}form input,form input[type="text"],form input[type="password"],form input[type="email"],form input[type="search"],form input[type="tel"],form input[type="number"],form input[type="date"],form textarea{width:100%;padding:.8em .6em .6em;outline:0;border:1px solid #d3d3d3;font-size:1.1em;line-height:1;background:#fff;color:#666;-webkit-appearance:none;-webkit-transition:-webkit-all .2s ease-out;-moz-transition:-moz-all .2s ease-out;-o-transition:-o-all .2s ease-out;transition:all .2s ease-out}form input:focus,form input[type="text"]:focus,form input[type="password"]:focus,form input[type="email"]:focus,form input[type="search"]:focus,form input[type="tel"]:focus,form input[type="number"]:focus,form input[type="date"]:focus,form textarea:focus{color:#333;border:1px solid #a0a0a0;-moz-box-shadow:0 0 2px #a0a0a0;-webkit-box-shadow:0 0 2px #a0a0a0;box-shadow:0 0 2px #a0a0a0;-webkit-box-shadow:0 0 2px #a0a0a0 0 0 #000;box-shadow:0 0 2px #a0a0a0 0 0 #000}form input:focus+label,form input[type="text"]:focus+label,form input[type="password"]:focus+label,form input[type="email"]:focus+label,form input[type="search"]:focus+label,form input[type="tel"]:focus+label,form input[type="number"]:focus+label,form input[type="date"]:focus+label,form textarea:focus+label{color:#666;font-weight:400}form input.success,form input[type="text"].success,form input[type="password"].success,form input[type="email"].success,form input[type="search"].success,form input[type="tel"].success,form input[type="number"].success,form input[type="date"].success,form textarea.success{border:1px solid #43cea2;-moz-box-shadow:0 0 2px #43cea2;-webkit-box-shadow:0 0 2px #43cea2;box-shadow:0 0 2px #43cea2;-webkit-box-shadow:0 0 2px #43cea2 0 0 #000;box-shadow:0 0 2px #43cea2 0 0 #000}form input.success+label,form input[type="text"].success+label,form input[type="password"].success+label,form input[type="email"].success+label,form input[type="search"].success+label,form input[type="tel"].success+label,form input[type="number"].success+label,form input[type="date"].success+label,form textarea.success+label{color:#43cea2;font-weight:400}form input.error,form input[type="text"].error,form input[type="password"].error,form input[type="email"].error,form input[type="search"].error,form input[type="tel"].error,form input[type="number"].error,form input[type="date"].error,form textarea.error{border:1px solid #e2717f;-moz-box-shadow:0 0 2px #e2717f;-webkit-box-shadow:0 0 2px #e2717f;box-shadow:0 0 2px #e2717f;-webkit-box-shadow:0 0 2px #e2717f 0 0 #000;box-shadow:0 0 2px #e2717f 0 0 #000}form input.error+label,form input[type="text"].error+label,form input[type="password"].error+label,form input[type="email"].error+label,form input[type="search"].error+label,form input[type="tel"].error+label,form input[type="number"].error+label,form input[type="date"].error+label,form textarea.error+label{color:#e2717f;font-weight:400}form input::-webkit-input-placeholder,form input[type="text"]::-webkit-input-placeholder,form input[type="password"]::-webkit-input-placeholder,form input[type="email"]::-webkit-input-placeholder,form input[type="search"]::-webkit-input-placeholder,form input[type="tel"]::-webkit-input-placeholder,form input[type="number"]::-webkit-input-placeholder,form input[type="date"]::-webkit-input-placeholder,form textarea::-webkit-input-placeholder{color:#d3d3d3;font-weight:300}form [placeholder]:focus::-webkit-input-placeholder{-webkit-transition:-webkit-all .2s ease-out;-moz-transition:-moz-all .2s ease-out;-o-transition:-o-all .2s ease-out;transition:all .2s ease-out;opacity:0}form input[type="number"]::-webkit-inner-spin-button,form input[type="number"]::-webkit-outer-spin-button,form input[type="date"]::-webkit-inner-spin-button,form input[type="date"]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}form .select-style{position:relative;display:block;width:100%;border:1px solid #a0a0a0;background:#fff}form .select-style .fa-caret-down{position:absolute;right:.6em;top:.8em;color:#a0a0a0;font-size:1.4em}form .select-style select{padding:.8em 0;margin-left:.6em;width:100%;border:0;box-shadow:none;background:transparent;background-image:none;-webkit-appearance:none;color:#a0a0a0;font-size:1.2em}form .select-style select:hover{cursor:pointer}form .select-style select:focus{outline:0}form fieldset.row{padding:.5em 0}form label{position:absolute;left:5px;top:-5px;padding:0 5px;background:white;color:#a0a0a0;font-size:12px;line-height:12px;text-transform:uppercase;pointer-events:none;z-index:2}.modal-wrapper{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,0.3);display:none;z-index:1001;will-change:transform}.modal-wrapper .modal{position:relative;color:#333;display:none}.modal-wrapper .modal a.close{position:absolute;padding:6px 12px 9px;border:1px solid;border-radius:20px;font-weight:300;font-size:27px}.modal-wrapper .modal section.modal-content{padding:20px}.modal-wrapper:not(.fullscreen) .modal{min-height:300px;max-width:434px;margin:60px auto 0;background-color:#fff;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.modal-wrapper:not(.fullscreen) .modal a.close{right:-45px;top:-30px;color:#fff}.modal-wrapper.fullscreen{background:#fff}.modal-wrapper.fullscreen .modal{height:100%;overflow:auto}.modal-wrapper.fullscreen .modal a.close{right:20px;top:20px}.notice{position:fixed;bottom:0;right:10px;height:100px;width:300px;padding:5px 10px 5px 10px;display:none;color:#fff;z-index:1005;-webkit-border-top-right-radius:5px;-webkit-border-bottom-right-radius:0;-webkit-border-bottom-left-radius:0;-webkit-border-top-left-radius:5px;-moz-border-radius-topright:5px;-moz-border-radius-bottomright:0;-moz-border-radius-bottomleft:0;-moz-border-radius-topleft:5px;border-top-right-radius:5px;border-bottom-right-radius:0;border-bottom-left-radius:0;border-top-left-radius:5px;-moz-background-clip:padding-box;-webkit-background-clip:padding-box;background-clip:padding-box}.notice.success{background-color:#43cea2}.notice.warning{background-color:#f4ed6b}.notice.error{background-color:#e2717f}.notice header.notice-header{position:relative;margin-bottom:.2em}.notice section.notice-content{height:70px;width:100%;overflow:auto;font-size:.8em}.notice a.close{position:absolute;top:3px;right:0;padding:0 4px 2px;border:1px solid;border-radius:100%;font-weight:300;font-size:12px;line-height:12px;color:#fff}.notice a.close:hover{color:#ccc}nav{font-size:18px;font-size:1.125rem}nav .navbar{margin:0 auto;display:table;padding:10px 0}nav li{margin:0 10px}nav a{display:inline-block;line-height:60px;vertical-align:middle}nav a.logo{height:60px;width:60px}@media(max-width:739px){nav{font-size:14px;font-size:.875rem}nav a{line-height:40px}nav a.logo{height:40px;width:40px}}#toc{position:fixed;top:80px;height:100%;width:220px;overflow:auto;padding-bottom:100px}#toc a{color:#333}#toc a:hover{color:#1a1a1a}#toc li>ul{display:none}#toc li>ul.unstyled-list{margin-left:10px}#toc li.active>a{font-weight:bold}#toc li.active>ul{display:block}#toc ul.nav>li.active>ul>li{list-style:none}footer{padding:60px 0;color:#d3d3d3;background:#333}footer i.fa-heart{color:#e2717f}footer i.fa-beer{color:#f4ed6b}html,body{background:#fff;color:#333}.kd{color:#a783b6}.k{color:#43cea2}h1.logo{font-size:64px;font-size:4rem}.gist pre,.gist .file-data{font-size:14px!important}section{padding:40px 0}#hero .badges,#hero .github-links{padding:.3em 0}#hero .badges p,#hero .github-links p{margin:0}#ship h3{margin-bottom:1em}#ship img.ship-it{display:table;height:300px;width:300px;margin:0 auto;background:#d3d3d3;-webkit-border-radius:100%;-moz-border-radius:100%;border-radius:100%}#plugins{color:#fff;background:#333}#plugins p{color:#d3d3d3}#plugins ul li{padding:10px 20px}#plugins ul li a{display:inline-block}#plugins ul li a img{height:100px;max-width:160px}@media(max-width:739px){#plugins ul li a img{height:60px;max-width:120px}}#features{color:#fff;background:#e2717f}#features h4{color:#982e3e}#features a.primary{color:#f8f8f8;border-bottom:1px dashed #f8f8f8}#features a.primary:hover{color:#dfdfdf;border-bottom:1px dashed #dfdfdf}#features p{text-align:justify}#comparison img{margin:0 auto}.page a,.example a{color:#e2717f}.page a:hover,.example a:hover{color:#d94759}.page .file-data .line-numbers,.example .file-data .line-numbers{width:40px}#todo-example input[type="text"]{margin:10px 0}#todo-example ul.todos{height:320px}#todo-example ul.todos li{padding:5px 0}#todo-example ul.todos li input[type="checkbox"]{margin-top:.2em}#todo-example ul.todos li span{margin-left:5px}#todo-example ul.todos li.done label{text-decoration:line-through;color:#998}#todo-example ul.todos li .delete{font-weight:bold}#todo-example label{float:left}#todo-example .primary-button{width:100%} \ No newline at end of file diff --git a/js/todos.js b/js/todos.js index 6f4a58b356..3ec39c65b0 100644 --- a/js/todos.js +++ b/js/todos.js @@ -5,12 +5,10 @@ var app = { addTodo: function(todo) { - var html = '
curl 'http://localhost:3000/users/' -H 'Content-Type: application/json' --data-binary '{ "username": "feathers", "password": "supersecret" }'
-
-Now it should be possible to log in with the `feathers` username and `supersecret` password and you will get the logged in user information in every service call in `params.user`.
-
-## Authorization
-
-Authorization is the process of determining after successful authentication if the user is allowed to perform the requested action. This is again where hooks come in handy.
-
-### User authorization
-
-Since *feathers-passport* adds the authenticated user information to the service call parameters we can just check those in the hook and return with an error if the user is not authorized:
-
-```js
-app.service('todos').before({
- create: function(hook, next) {
- // We only allow creating todos with an authenticated user
- if(!hook.params.user) {
- return next(new Error('You need to be authenticated'));
- }
-
- // Check if the user belongs the `admin` group
- var groups = hook.params.user.groups;
- if(groups.indexOf('admin') === -1) {
- // Return with an error if not
- return next(new Error('User is not allowed to create a new Todo'));
- }
-
- // Otherwise just continue on to the
- // next hook or the service method
- next();
- }
-});
-```
-
-### Event filtering
-
-This is also a good time to talk a little about [filtering events](/api/#event-filtering). It is very likely that you eventually only want to send certain events to specific users instead of everybody. Following up on the group authorization example from above, we might only want to dispatch a `todos created` event to users that are in the admin group. This can be done by adding a `created(data, params, callback)` method to the Todo MongoDB service:
-
-```js
-var todoService = mongodb({
- db: 'feathers-demo',
- collection: 'todos'
-}).extend({
- created: function(data, params, callback) {
- // Only dispatch if we have a user and user belongs to the admin group
- if(params.user && params.user.groups.indexOf('admin') !== -1) {
- // Call back with the data we want to dispatch
- return callback(null, data);
- }
-
- // Call back with falsy value to not dispatch the event
- callback(null, false);
- }
-});
-```
-
-The `created` method is being called for every connected user with the `params` set in the `request.feathers` object and the data from the event. You can either call back with the original or modified data (which will then be dispatched to that user) or a falsy value which will prevent the event from being dispatched to that connection.
## What's next?
@@ -327,5 +19,3 @@ This guide hopefully gave you an overview of how Feathers works. We created a To
The next step is definitely reading through the [API documentation](/api/) for a more detailed information on how to configure and use certain parts of Feathers. The [FAQ](/faq/) also has some answers to questions that come up regularly. For a growing list of official plugins, have a look at the [Feathersjs GitHub organization](https://github.com/feathersjs).
If you have any other questions, feel free to submit them as a [GitHub issue](https://github.com/feathersjs/feathers/issues) or on [Stackoverflow](http://stackoverflow.com) using the `feathers` or `feathersjs` tag or join [#feathersjs](http://webchat.freenode.net/?channels=feathersjs) on Freenode IRC.
-
-
diff --git a/learn/authentication.md b/learn/authentication.md
index 251ba3c346..2ad421bcae 100644
--- a/learn/authentication.md
+++ b/learn/authentication.md
@@ -5,4 +5,181 @@ description: Learn how to do user authentication and authorization
hide: true
---
-# Authentication
+## Authentication
+
+Since Feathers directly extends Express you can use any of its authentication mechanism. [Passport](http://passportjs.org/) is one that is used quite often and also really flexible. Manually setting up shared authentication between websockets and an HTTP REST API can be tricky. This is what the [feathers-passport](https://github.com/feathersjs/feathers-passport) module aims to make easier. The following examples show how to add local authentication that uses a Feathers service for storing and retrieving user information.
+
+### Configuring Passport
+
+The first step is to add the Passport, local strategy and feathers-passport modules to our application. Since we are using MongoDB already we will also use it as the session store through the [connect-mongo](https://github.com/kcbanner/connect-mongo) module:
+
+> `npm install passport passport-local connect-mongo feathers-passport`
+
+```js
+// app.js
+var feathers = require('feathers');
+var mongodb = require('feathers-mongodb');
+var bodyParser = require('body-parser');
+var hooks = require('feathers-hooks');
+
+var passport = require('passport');
+var connectMongo = require('connect-mongo');
+var feathersPassport = require('feathers-passport');
+
+var app = feathers();
+var todoService = mongodb({
+ db: 'feathers-demo',
+ collection: 'todos'
+});
+
+app.configure(feathers.rest())
+ .configure(feathers.socketio())
+ .configure(hooks())
+ .configure(feathersPassport(function(result) {
+ // MongoStore needs the session function
+ var MongoStore = connectMongo(result.createSession);
+
+ result.secret = 'feathers-rocks';
+ result.store = new MongoStore({
+ db: 'feathers-demo'
+ });
+
+ return result;
+ }))
+ .use(bodyParser.json())
+ // Now we also need to parse HTML form submissions
+ .use(bodyParser.urlencoded({ extended: true }))
+ .use('/todos', todoService)
+ .use('/', feathers.static(__dirname));
+```
+
+### User storage
+
+Next, we create a MongoDB service for storing user information. It is always a good idea to not store plain text passwords in the database so we add a `.before` hook that salts and then hashes the password when creating a new user. This can be done in the service `.setup` which is called when the application is ready to start up. We also add an `.authenticate` method that we can use to look up a user by username and compare the hashed and salted passwords.
+
+```js
+var crypto = require('crypto');
+// One-way hashes a string
+var hash = function(string, salt) {
+ var shasum = crypto.createHash('sha256');
+ shasum.update(string + salt);
+ return shasum.digest('hex');
+};
+
+var userService = mongodb({
+ db: 'feathers-demo',
+ collection: 'users'
+}).extend({
+ authenticate: function(username, password, callback) {
+ // This will be used as the MongoDB query
+ var query = {
+ username: username
+ };
+
+ this.find({ query: query }, function(error, users) {
+ if(error) {
+ return callback(error);
+ }
+
+ var user = users[0];
+
+ if(!user) {
+ return callback(new Error('No user found'));
+ }
+
+ // Compare the hashed and salted passwords
+ if(user.password !== hash(password, user.salt)) {
+ return callback(new Error('User password does not match'));
+ }
+
+ // If we got to here, we call the callback with the user information
+ return callback(null, user);
+ });
+ },
+
+ setup: function() {
+ // Adds the hook during service setup
+ this.before({
+ // Hash the password before sending it to MongoDB
+ create: function(hook, next) {
+ // Create a random salt string
+ var salt = crypto.randomBytes(128).toString('base64');
+ // Change the password to a hashed and salted password
+ hook.data.password = hash(hook.data.password, salt);
+ // Add the salt to the user data
+ hook.data.salt = salt;
+ next();
+ }
+ });
+ }
+});
+
+app.use('/users', userService);
+```
+
+Now we need to set up Passport to use that service and tell it how to deserialize and serialize our user information. For us, the serialized form is the `_id` generated by MongoDB. To deserialize by `_id` we can simply call the user services `.get` method. Then we add the local strategy which simply calls the `.authenticate` method that we implemented in the user service.
+
+```js
+var LocalStrategy = require('passport-local').Strategy;
+
+passport.serializeUser(function(user, done) {
+ // Use the `_id` property to serialize the user
+ done(null, user._id);
+});
+
+passport.deserializeUser(function(id, done) {
+ // Get the user information from the service
+ app.service('users').get(id, {}, done);
+});
+
+passport.use(new LocalStrategy(function(username, password, done) {
+ app.service('users').authenticate(username, password, done);
+}));
+```
+
+### Login
+
+The last step is to add the authentication route that we can POST the login to:
+
+```js
+app.post('/login', passport.authenticate('local', {
+ successRedirect: '/',
+ failureRedirect: '/login.html',
+ failureFlash: false
+}));
+
+app.listen(3000);
+```
+
+And to add a `login.html` page:
+
+```html
+
+
+
+
+ curl 'http://localhost:3000/users/' -H 'Content-Type: application/json' --data-binary '{ "username": "feathers", "password": "supersecret" }'
+
+Now it should be possible to log in with the `feathers` username and `supersecret` password and you will get the logged in user information in every service call in `params.user`.
diff --git a/learn/authorization.md b/learn/authorization.md
index ce1eb251be..336f4ed730 100644
--- a/learn/authorization.md
+++ b/learn/authorization.md
@@ -5,4 +5,56 @@ description: Learn how to authorize users
hide: true
---
-# Authorization
+## Authorization
+
+Authorization is the process of determining after successful authentication if the user is allowed to perform the requested action. This is again where hooks come in handy.
+
+### User authorization
+
+Since *feathers-passport* adds the authenticated user information to the service call parameters we can just check those in the hook and return with an error if the user is not authorized:
+
+```js
+app.service('todos').before({
+ create: function(hook, next) {
+ // We only allow creating todos with an authenticated user
+ if(!hook.params.user) {
+ return next(new Error('You need to be authenticated'));
+ }
+
+ // Check if the user belongs the `admin` group
+ var groups = hook.params.user.groups;
+ if(groups.indexOf('admin') === -1) {
+ // Return with an error if not
+ return next(new Error('User is not allowed to create a new Todo'));
+ }
+
+ // Otherwise just continue on to the
+ // next hook or the service method
+ next();
+ }
+});
+```
+
+### Event filtering
+
+This is also a good time to talk a little about [filtering events](/api/#event-filtering). It is very likely that you eventually only want to send certain events to specific users instead of everybody. Following up on the group authorization example from above, we might only want to dispatch a `todos created` event to users that are in the admin group. This can be done by adding a `created(data, params, callback)` method to the Todo MongoDB service:
+
+```js
+var todoService = mongodb({
+ db: 'feathers-demo',
+ collection: 'todos'
+}).extend({
+ created: function(data, params, callback) {
+ // Only dispatch if we have a user and user belongs to the admin group
+ if(params.user && params.user.groups.indexOf('admin') !== -1) {
+ // Call back with the data we want to dispatch
+ return callback(null, data);
+ }
+
+ // Call back with falsy value to not dispatch the event
+ callback(null, false);
+ }
+});
+```
+
+The `created` method is being called for every connected user with the `params` set in the `request.feathers` object and the data from the event. You can either call back with the original or modified data (which will then be dispatched to that user) or a falsy value which will prevent the event from being dispatched to that connection.
diff --git a/learn/validation.md b/learn/validation.md
index 02371395fe..cff1f5c6ea 100644
--- a/learn/validation.md
+++ b/learn/validation.md
@@ -5,4 +5,83 @@ description: Learn how to do Validation and data processing
hide: true
---
-# Validation & Processing
+## Validation and processing
+
+The next step is validating and processing our data. With the MongoDB service already implemented we have two options to extend its functionality.
+
+### Service Extension
+
+*feathers-mongodb* uses the ES5 inheritance library [Uberproto](https://github.com/daffl/uberproto). This allows us to `extend` the original object returned by the call to `mongodb(options)` and overwrite the existing implementation of `create` to process the Todo data and then pass it to the original (`_super`) method. This way we can also easily add our own methods to the service.
+
+```js
+var todoService = mongodb({
+ db: 'feathers-demo',
+ collection: 'todos'
+}).extend({
+ create: function(data, params, callback) {
+ // We want to make sure that `complete` is always set
+ // and also only use the `text` and `complete` properties
+ var newData = {
+ text: data.text,
+ complete: data.complete === 'true' || !!data.complete
+ };
+ // Call the original method with the new data
+ this._super(newData, params, callback);
+ },
+
+ // Add another method
+ addDefaultTodo: function(callback) {
+ this.create({
+ text: 'The default todo',
+ complete: false
+ }, {}, callback);
+ }
+});
+```
+
+### Hooks
+
+Another option is the [feathers-hooks](https://github.com/feathersjs/feathers-hooks) plugin which allows us to add asynchronous hooks before or after a service method call. Hooks work similar to Express middleware. The following example adds a hook that converts our Todo data and makes sure that nobody submits anything that we don't want to put into MongoDB:
+
+> `npm install feathers-hooks`
+
+```js
+// app.js
+var feathers = require('feathers');
+var mongodb = require('feathers-mongodb');
+var hooks = require('feathers-hooks');
+var bodyParser = require('body-parser');
+
+var app = feathers();
+var todoService = mongodb({
+ db: 'feathers-demo',
+ collection: 'todos'
+});
+
+app.configure(feathers.rest())
+ .configure(feathers.socketio())
+ // Configure hooks
+ .configure(hooks())
+ .use(bodyParser.json())
+ .use('/todos', todoService)
+ .use('/', feathers.static(__dirname))
+ .listen(3000);
+
+// Get the wrapped todos service object and
+// add a `before` create hook modifying the data
+app.service('todos').before({
+ create: function(hook, next) {
+ var oldData = hook.data;
+ // Replace the old data by creating a new object
+ hook.data = {
+ text: oldData.text,
+ complete: oldData.complete === 'true' || !!oldData.complete
+ };
+ next();
+ }
+});
+```
+
+You might have noticed the call to [.service](/api/#toc9) in `app.service('todos')`. This will basically return the original service object (`todoService` in our case) *but* contain some functionality added by Feathers. Most notably, the returned service object will be an [EventEmitter](http://nodejs.org/api/events.html#events_class_events_eventemitter) that emits `created`, `updated` etc. events.
+
+The *feathers-hooks* plugin also adds a `.before` and `.after` method that allows to add hooks to that service. When you need to access services, *always* use `app.service(name)` and not the original service object otherwise things will not work as expected.
From 596a72ff2954d256ff68542ebbd85a900cb55e18 Mon Sep 17 00:00:00 2001
From: David Luecke Because Feathers is 100% vanilla JavaScript on the backend, you get to use the same language all the way through your web stack. Less context switching.
+Feathers is a very thin wrapper over top of Express and Socket.io, both of which have been used in production by thousands of companies.
Feathers is a very thin wrapper over top of Express and Socket.io and works as a drop-in replacement for Express in any existing application.
+Our plug-ins are small, easy to learn and extremely flexible. Giving you only what you need and then getting out of your way.
Use any Express middleware and Hooks, which follow the same pattern, for service data-processing and authorization that works both via REST and websockets.
+Tired of massive JSON or YAML files? Feathers reduces complexity while still being explicit, not by hiding it behind generators and configuration files.
We support MongoDB, Postgres, NeDB and MySQL out of the box. If that's not for you, you can easily write your own service adapters.
+We support MongoDB, Postgres, MySQL and NeDB out of the box. If that's not for you, you can easily write your own service adapters.
Use whatever client you want; Angular, React, Swift/ObjC, Android, it doesn't matter. A few lines of code can make your frontend real-time.
+Use whatever client you want; Angular, React, Swift/ObjC, Android, it doesn't matter. We provide some helpful guides and plug-ins to make things easier.
No need to re-write your existing API to go real-time. Feathers can act as a real-time proxy between other APIs and your frontend.
+Because Feathers is 100% vanilla JavaScript on the backend, you get to use the same language all the way through your web stack. Less context switching.
+- In the tradition of TodoMVC the below example shows a real-time Todo application with Feathers and an in-memory Todo service on the server and a jQuery HTML page for the browser. To get up and running with this example download the Gist, unpack and in the new folder run -
- Then go to http://localhost:8080. The REST API will be available at localhost:8080/todos (check out the example application endpoint here).npm install feathers feathers-memory body-parser
node app.js
In this guide we will go over the basic concepts of Feathers by building the following real-time Todo application (inspired by the great TodoMVC) using jQuery as the frontend:
+ Eager to try it out yourself? Download this Gist, unpack and in the new folder run +
+ Then go to http://localhost:8080. The REST API will be available at localhost:8080/todos. +npm install feathers feathers-memory body-parser
node app.js
curl 'http://localhost:3000/todos/' -H 'Content-Type: application/json' --data-binary '{ "text": "You have to do dishes!" }'
+The functionality provided by our service is quite common which is why we implemented the same thing and published it as the [feathers-memory](https://github.com/feathersjs/feathers-memory) module.
+
## Getting real-time
As previously mentioned, a Feathers service can also be exposed through websockets. You can either use [SocketIO](http://socket.io) or [Primus](https://github.com/primus/primus) - an abstraction layer for differentNode websocket libraries. In the following examples we will use SocketIO.
@@ -216,6 +230,14 @@ app.configure(feathers.rest())
.listen(3000);
```
+That's it. Our application is now real-time, all we have to do is provide a nice frontend.
+
+## Building a frontend
+
+### Feathers client
+
+### Testing the connection
+
To test the connection, we can create an `index.html` file in the same folder. The example page will connect to SocketIO, create a new Todo and also log when any Todo has been created, updated or patched:
```html
@@ -271,7 +293,7 @@ To test the connection, we can create an `index.html` file in the same folder. T